summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramber <amber@54d463be-8e91-2dee-dedb-b68131a5f0ec>2004-11-14 16:18:26 +0000
committeramber <amber@54d463be-8e91-2dee-dedb-b68131a5f0ec>2004-11-14 16:18:26 +0000
commit581475bc6416790765c498aa3d611f6868ffb64a (patch)
tree347ebf88eaa76e50488f23989d67cad834f3c9b1
parent600362764ce348c5c9de96eababff2e08bb90d4a (diff)
downloadhercules-581475bc6416790765c498aa3d611f6868ffb64a.tar.gz
hercules-581475bc6416790765c498aa3d611f6868ffb64a.tar.bz2
hercules-581475bc6416790765c498aa3d611f6868ffb64a.tar.xz
hercules-581475bc6416790765c498aa3d611f6868ffb64a.zip
Fixed some file types
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/athena@172 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Changelog.txt4132
-rw-r--r--Dev/Dev-Folder-Notes.txt6
-rw-r--r--Dev/TODO.txt1366
-rw-r--r--Dev/TODO_MOB_AI.txt266
-rw-r--r--Dev/bugs.txt144
-rw-r--r--Dev/forSQLdev.txt292
-rw-r--r--Dev/quotes.txt296
-rw-r--r--Dev/resnametable.TXT126
-rw-r--r--INSTALL492
-rw-r--r--LICENCE680
-rw-r--r--LICENCE_JA832
-rw-r--r--Makefile254
-rw-r--r--Readme-jap35014
-rw-r--r--Readme2.txt60
-rw-r--r--athena-start168
-rw-r--r--char-server.sh32
-rw-r--r--charserv.bat6
-rw-r--r--conf-tmpl/GM_account.txt70
-rw-r--r--conf-tmpl/atcommand_athena.conf1288
-rw-r--r--conf-tmpl/atcommand_athena.conf.orig1138
-rw-r--r--conf-tmpl/battle_athena.conf1450
-rw-r--r--conf-tmpl/char_athena.conf340
-rw-r--r--conf-tmpl/grf-files.txt6
-rw-r--r--conf-tmpl/help.txt450
-rw-r--r--conf-tmpl/inter_athena.conf256
-rw-r--r--conf-tmpl/ladmin_athena.conf68
-rw-r--r--conf-tmpl/lan_support.conf82
-rw-r--r--conf-tmpl/log_athena.conf104
-rw-r--r--conf-tmpl/login_athena.conf296
-rw-r--r--conf-tmpl/map_athena.conf2338
-rw-r--r--conf-tmpl/mapflag/arenas.txt212
-rw-r--r--conf-tmpl/mapflag/dungeons.txt306
-rw-r--r--conf-tmpl/mapflag/guildcastles.txt298
-rw-r--r--conf-tmpl/mapflag/gvg.txt140
-rw-r--r--conf-tmpl/mapflag/jail.txt86
-rw-r--r--conf-tmpl/mapflag/jobquests.txt268
-rw-r--r--conf-tmpl/mapflag/pvp.txt1132
-rw-r--r--conf-tmpl/mapflag/towns.txt446
-rw-r--r--conf-tmpl/mapflag/type/gvg.txt56
-rw-r--r--conf-tmpl/mapflag/type/jail.txt94
-rw-r--r--conf-tmpl/mapflag/type/nightmare.txt96
-rw-r--r--conf-tmpl/mapflag/type/nobranch.txt436
-rw-r--r--conf-tmpl/mapflag/type/noicewall.txt118
-rw-r--r--conf-tmpl/mapflag/type/nomemo.txt706
-rw-r--r--conf-tmpl/mapflag/type/nopenalty.txt352
-rw-r--r--conf-tmpl/mapflag/type/nopvp.txt116
-rw-r--r--conf-tmpl/mapflag/type/nosave.txt242
-rw-r--r--conf-tmpl/mapflag/type/noteleport.txt368
-rw-r--r--conf-tmpl/mapflag/type/nowarp.txt38
-rw-r--r--conf-tmpl/mapflag/type/nowarpto.txt60
-rw-r--r--conf-tmpl/mapflag/type/pvp.txt178
-rw-r--r--conf-tmpl/mapflag/type/pvp_noparty.txt68
-rw-r--r--conf-tmpl/mapflag/water.txt108
-rw-r--r--conf-tmpl/mapflag/water_height.txt136
-rw-r--r--conf-tmpl/msg_athena.conf1024
-rw-r--r--conf-tmpl/script_athena.conf4
-rw-r--r--conf-tmpl/water_height.txt136
-rw-r--r--db/abra_db.txt774
-rw-r--r--db/attr_fix.txt106
-rw-r--r--db/castle_db.txt52
-rw-r--r--db/const.txt474
-rw-r--r--db/create_arrow_db.txt198
-rw-r--r--db/exp.txt198
-rw-r--r--db/exp2.txt198
-rw-r--r--db/exp_guild.txt100
-rw-r--r--db/item_avail.txt18
-rw-r--r--db/item_bluebox.txt854
-rw-r--r--db/item_cardalbum.txt316
-rw-r--r--db/item_db.txt3416
-rw-r--r--db/item_giftbox.txt160
-rw-r--r--db/item_noequip.txt8
-rw-r--r--db/item_scroll.txt10
-rw-r--r--db/item_violetbox.txt554
-rw-r--r--db/job_db1.txt138
-rw-r--r--db/job_db2-2.txt52
-rw-r--r--db/job_db2.txt142
-rw-r--r--db/mob_avail.txt84
-rw-r--r--db/mob_boss.txt50
-rw-r--r--db/mob_branch.txt706
-rw-r--r--db/mob_db.txt1108
-rw-r--r--db/mob_db2.txt148
-rw-r--r--db/mob_poring.txt34
-rw-r--r--db/mob_skill_db.txt4002
-rw-r--r--db/packet_db.txt1150
-rw-r--r--db/pet_db.txt60
-rw-r--r--db/produce_db.txt200
-rw-r--r--db/refine_db.txt24
-rw-r--r--db/size_fix.txt12
-rw-r--r--db/skill_cast_db.txt538
-rw-r--r--db/skill_castnodex_db.txt22
-rw-r--r--db/skill_db.txt1050
-rw-r--r--db/skill_require_db.txt558
-rw-r--r--db/skill_tree.txt3632
-rw-r--r--db/statpoint.txt510
-rw-r--r--doc/admin_packet.txt562
-rw-r--r--doc/client_packet.txt2144
-rw-r--r--doc/conf_ref.txt3962
-rw-r--r--doc/coredump_report.txt218
-rw-r--r--doc/db_ref.txt294
-rw-r--r--doc/help.txt906
-rw-r--r--doc/inter_server_packet.txt408
-rw-r--r--doc/item.txt2902
-rw-r--r--doc/item_bonus.txt274
-rw-r--r--doc/packet_table_en.txt2672
-rw-r--r--doc/script_ref.txt2848
-rw-r--r--help.txt790
-rw-r--r--log/char.log120
-rw-r--r--log/login.log490
-rw-r--r--login-server.sh32
-rw-r--r--logserv.bat6
-rw-r--r--mapserv.bat6
-rw-r--r--npc/Changelog.txt496
-rw-r--r--npc/cities/alberta.txt1746
-rw-r--r--npc/cities/aldebaran.txt3084
-rw-r--r--npc/cities/amatsu.txt2956
-rw-r--r--npc/cities/comodo.txt2794
-rw-r--r--npc/cities/geffen.txt1318
-rw-r--r--npc/cities/gonryun.txt636
-rw-r--r--npc/cities/izlude.txt1094
-rw-r--r--npc/cities/lutie.txt1926
-rw-r--r--npc/cities/morocc.txt822
-rw-r--r--npc/cities/niflheim.txt1114
-rw-r--r--npc/cities/payon.txt1632
-rw-r--r--npc/cities/prontera.txt1236
-rw-r--r--npc/cities/umbala.txt3332
-rw-r--r--npc/cities/yuno.txt1232
-rw-r--r--npc/events/alchemist.txt332
-rw-r--r--npc/events/custom/draculax.txt258
-rw-r--r--npc/events/custom/uneasy_cemetery.txt268
-rw-r--r--npc/events/easter.txt392
-rw-r--r--npc/events/twintowers.txt184
-rw-r--r--npc/events/valentinesday.txt542
-rw-r--r--npc/events/xmas.txt502
-rw-r--r--npc/guides/guides_alb.txt218
-rw-r--r--npc/guides/guides_alde.txt232
-rw-r--r--npc/guides/guides_com.txt282
-rw-r--r--npc/guides/guides_gef.txt270
-rw-r--r--npc/guides/guides_izl.txt236
-rw-r--r--npc/guides/guides_mor.txt242
-rw-r--r--npc/guides/guides_nif.txt164
-rw-r--r--npc/guides/guides_pron.txt412
-rw-r--r--npc/guides/guides_umb.txt214
-rw-r--r--npc/guides/guides_yun.txt446
-rw-r--r--npc/guild/aldeg/aldeg_dunsw.txt102
-rw-r--r--npc/guild/aldeg/aldeg_ev_agit.txt260
-rw-r--r--npc/guild/aldeg/aldeg_flags.txt398
-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.txt220
-rw-r--r--npc/guild/aldeg/aldeg_treas.txt282
-rw-r--r--npc/guild/ev_agit_event.txt82
-rw-r--r--npc/guild/gefg/gefg_dunsw.txt98
-rw-r--r--npc/guild/gefg/gefg_ev_agit.txt260
-rw-r--r--npc/guild/gefg/gefg_flags.txt308
-rw-r--r--npc/guild/gefg/gefg_guardians.txt216
-rw-r--r--npc/guild/gefg/gefg_kafras.txt142
-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.txt84
-rw-r--r--npc/guild/gldfunc_ev_agit.txt298
-rw-r--r--npc/guild/gldfunc_flag.txt116
-rw-r--r--npc/guild/gldfunc_kafra.txt74
-rw-r--r--npc/guild/gldfunc_manager.txt858
-rw-r--r--npc/guild/gldfunc_treasure.txt156
-rw-r--r--npc/guild/nguild/nguild_dunsw.txt78
-rw-r--r--npc/guild/nguild/nguild_ev_agit.txt214
-rw-r--r--npc/guild/nguild/nguild_guardians.txt182
-rw-r--r--npc/guild/nguild/nguild_kafras.txt106
-rw-r--r--npc/guild/old/aldeg_cas01.txt1350
-rw-r--r--npc/guild/old/aldeg_cas02.txt1352
-rw-r--r--npc/guild/old/aldeg_cas03.txt1358
-rw-r--r--npc/guild/old/aldeg_cas04.txt1358
-rw-r--r--npc/guild/old/aldeg_cas05.txt1354
-rw-r--r--npc/guild/old/aldeg_flag.txt700
-rw-r--r--npc/guild/old/ev_agit_aldeg.txt952
-rw-r--r--npc/guild/old/ev_agit_event.txt68
-rw-r--r--npc/guild/old/ev_agit_gefg.txt928
-rw-r--r--npc/guild/old/ev_agit_payg.txt932
-rw-r--r--npc/guild/old/ev_agit_prtg.txt952
-rw-r--r--npc/guild/old/gefg_cas01.txt1334
-rw-r--r--npc/guild/old/gefg_cas02.txt1334
-rw-r--r--npc/guild/old/gefg_cas03.txt1336
-rw-r--r--npc/guild/old/gefg_cas04.txt1336
-rw-r--r--npc/guild/old/gefg_cas05.txt1332
-rw-r--r--npc/guild/old/gefg_flag.txt716
-rw-r--r--npc/guild/old/gswitch.txt886
-rw-r--r--npc/guild/old/guardian/aldeg_cas01_guardian.txt134
-rw-r--r--npc/guild/old/guardian/aldeg_cas02_guardian.txt134
-rw-r--r--npc/guild/old/guardian/aldeg_cas03_guardian.txt134
-rw-r--r--npc/guild/old/guardian/aldeg_cas04_guardian.txt134
-rw-r--r--npc/guild/old/guardian/aldeg_cas05_guardian.txt134
-rw-r--r--npc/guild/old/guardian/gefg_cas01_guardian.txt134
-rw-r--r--npc/guild/old/guardian/gefg_cas02_guardian.txt134
-rw-r--r--npc/guild/old/guardian/gefg_cas03_guardian.txt134
-rw-r--r--npc/guild/old/guardian/gefg_cas04_guardian.txt134
-rw-r--r--npc/guild/old/guardian/gefg_cas05_guardian.txt134
-rw-r--r--npc/guild/old/guardian/payg_cas01_guardian.txt134
-rw-r--r--npc/guild/old/guardian/payg_cas02_guardian.txt134
-rw-r--r--npc/guild/old/guardian/payg_cas03_guardian.txt134
-rw-r--r--npc/guild/old/guardian/payg_cas04_guardian.txt134
-rw-r--r--npc/guild/old/guardian/payg_cas05_guardian.txt134
-rw-r--r--npc/guild/old/guardian/prtg_cas01_guardian.txt134
-rw-r--r--npc/guild/old/guardian/prtg_cas02_guardian.txt124
-rw-r--r--npc/guild/old/guardian/prtg_cas03_guardian.txt124
-rw-r--r--npc/guild/old/guardian/prtg_cas04_guardian.txt124
-rw-r--r--npc/guild/old/guardian/prtg_cas05_guardian.txt124
-rw-r--r--npc/guild/old/payg_cas01.txt1334
-rw-r--r--npc/guild/old/payg_cas02.txt1332
-rw-r--r--npc/guild/old/payg_cas03.txt1332
-rw-r--r--npc/guild/old/payg_cas04.txt1332
-rw-r--r--npc/guild/old/payg_cas05.txt1332
-rw-r--r--npc/guild/old/payg_flag.txt718
-rw-r--r--npc/guild/old/prtg_cas01.txt1340
-rw-r--r--npc/guild/old/prtg_cas02.txt1334
-rw-r--r--npc/guild/old/prtg_cas03.txt1334
-rw-r--r--npc/guild/old/prtg_cas04.txt1330
-rw-r--r--npc/guild/old/prtg_cas05.txt1326
-rw-r--r--npc/guild/old/prtg_flag.txt726
-rw-r--r--npc/guild/old/treasure/aldeg_cas01_treasure.txt144
-rw-r--r--npc/guild/old/treasure/aldeg_cas02_treasure.txt134
-rw-r--r--npc/guild/old/treasure/aldeg_cas03_treasure.txt134
-rw-r--r--npc/guild/old/treasure/aldeg_cas04_treasure.txt134
-rw-r--r--npc/guild/old/treasure/aldeg_cas05_treasure.txt134
-rw-r--r--npc/guild/old/treasure/gefg_cas01_treasure.txt134
-rw-r--r--npc/guild/old/treasure/gefg_cas02_treasure.txt134
-rw-r--r--npc/guild/old/treasure/gefg_cas03_treasure.txt134
-rw-r--r--npc/guild/old/treasure/gefg_cas04_treasure.txt136
-rw-r--r--npc/guild/old/treasure/gefg_cas05_treasure.txt136
-rw-r--r--npc/guild/old/treasure/payg_cas01_treasure.txt134
-rw-r--r--npc/guild/old/treasure/payg_cas02_treasure.txt134
-rw-r--r--npc/guild/old/treasure/payg_cas03_treasure.txt134
-rw-r--r--npc/guild/old/treasure/payg_cas04_treasure.txt134
-rw-r--r--npc/guild/old/treasure/payg_cas05_treasure.txt134
-rw-r--r--npc/guild/old/treasure/prtg_cas01_treasure.txt144
-rw-r--r--npc/guild/old/treasure/prtg_cas02_treasure.txt134
-rw-r--r--npc/guild/old/treasure/prtg_cas03_treasure.txt134
-rw-r--r--npc/guild/old/treasure/prtg_cas04_treasure.txt132
-rw-r--r--npc/guild/old/treasure/prtg_cas05_treasure.txt132
-rw-r--r--npc/guild/payg/payg_dunsw.txt98
-rw-r--r--npc/guild/payg/payg_ev_agit.txt260
-rw-r--r--npc/guild/payg/payg_flags.txt296
-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.txt260
-rw-r--r--npc/guild/prtg/prtg_flags.txt350
-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.txt698
-rw-r--r--npc/jobs/1-1/archer.txt366
-rw-r--r--npc/jobs/1-1/mage.txt994
-rw-r--r--npc/jobs/1-1/merchant.txt1946
-rw-r--r--npc/jobs/1-1/swordsman.txt1590
-rw-r--r--npc/jobs/1-1/thief.txt886
-rw-r--r--npc/jobs/2-1-1/AssassinCross.txt140
-rw-r--r--npc/jobs/2-1-1/HighPriest.txt122
-rw-r--r--npc/jobs/2-1-1/HighWizard.txt120
-rw-r--r--npc/jobs/2-1-1/LordKnight.txt124
-rw-r--r--npc/jobs/2-1-1/Sniper.txt128
-rw-r--r--npc/jobs/2-1-1/WhiteSmith.txt120
-rw-r--r--npc/jobs/2-1/assassin.txt3836
-rw-r--r--npc/jobs/2-1/blacksmith.txt2872
-rw-r--r--npc/jobs/2-1/hunter.txt2500
-rw-r--r--npc/jobs/2-1/knight.txt3714
-rw-r--r--npc/jobs/2-1/priest.txt2860
-rw-r--r--npc/jobs/2-1/wizard.txt2892
-rw-r--r--npc/jobs/2-2-1/Champion.txt122
-rw-r--r--npc/jobs/2-2-1/Clown.txt244
-rw-r--r--npc/jobs/2-2-1/Creator.txt122
-rw-r--r--npc/jobs/2-2-1/Gypsy.txt178
-rw-r--r--npc/jobs/2-2-1/Paladin.txt124
-rw-r--r--npc/jobs/2-2-1/Professor.txt122
-rw-r--r--npc/jobs/2-2-1/Stalker.txt118
-rw-r--r--npc/jobs/2-2/crusader.txt2328
-rw-r--r--npc/jobs/2-2/noquest/crusader.txt108
-rw-r--r--npc/jobs/2-2/noquest/dancer-bard.txt144
-rw-r--r--npc/jobs/2-2/noquest/monk.txt108
-rw-r--r--npc/jobs/2-2/rogue.txt1886
-rw-r--r--npc/jobs/2-2/sage.txt4292
-rw-r--r--npc/jobs/custom/jobchange.txt1292
-rw-r--r--npc/jobs/custom/reset.txt78
-rw-r--r--npc/jobs/novice/novice.txt4678
-rw-r--r--npc/jobs/novice/supernovice.txt542
-rw-r--r--npc/kafras/functions_kafras.txt690
-rw-r--r--npc/kafras/kafras_alb.txt134
-rw-r--r--npc/kafras/kafras_alde.txt102
-rw-r--r--npc/kafras/kafras_com.txt120
-rw-r--r--npc/kafras/kafras_dungeons.txt258
-rw-r--r--npc/kafras/kafras_gef.txt202
-rw-r--r--npc/kafras/kafras_izl.txt78
-rw-r--r--npc/kafras/kafras_mor.txt200
-rw-r--r--npc/kafras/kafras_new.txt106
-rw-r--r--npc/kafras/kafras_pay.txt130
-rw-r--r--npc/kafras/kafras_pron.txt200
-rw-r--r--npc/kafras/kafras_yun.txt142
-rw-r--r--npc/merchants/alchemist.txt240
-rw-r--r--npc/merchants/clothes_dyer.txt650
-rw-r--r--npc/merchants/custom/breeder.txt132
-rw-r--r--npc/merchants/custom/dye.txt352
-rw-r--r--npc/merchants/dye_maker.txt554
-rw-r--r--npc/merchants/grandpa_pharmacist.txt372
-rw-r--r--npc/merchants/hair_dyer.txt316
-rw-r--r--npc/merchants/inn.txt344
-rw-r--r--npc/merchants/milk_trader.txt128
-rw-r--r--npc/merchants/refine.txt1760
-rw-r--r--npc/merchants/renters.txt310
-rw-r--r--npc/merchants/shops.txt416
-rw-r--r--npc/mobs/dungeons/amatdun.txt66
-rw-r--r--npc/mobs/dungeons/anthell.txt234
-rw-r--r--npc/mobs/dungeons/ayodun.txt48
-rw-r--r--npc/mobs/dungeons/beachdun.txt64
-rw-r--r--npc/mobs/dungeons/byalan.txt208
-rw-r--r--npc/mobs/dungeons/clocktower.txt244
-rw-r--r--npc/mobs/dungeons/coalmine.txt58
-rw-r--r--npc/mobs/dungeons/geftower.txt136
-rw-r--r--npc/mobs/dungeons/glastheim.txt318
-rw-r--r--npc/mobs/dungeons/gondun.txt78
-rw-r--r--npc/mobs/dungeons/guilddun.txt86
-rw-r--r--npc/mobs/dungeons/louydun.txt66
-rw-r--r--npc/mobs/dungeons/magmadun.txt50
-rw-r--r--npc/mobs/dungeons/moc_pyramid.txt100
-rw-r--r--npc/mobs/dungeons/moc_sphinx.txt88
-rw-r--r--npc/mobs/dungeons/orcdun.txt60
-rw-r--r--npc/mobs/dungeons/payoncave.txt300
-rw-r--r--npc/mobs/dungeons/pront_maze.txt150
-rw-r--r--npc/mobs/dungeons/pront_sewers.txt88
-rw-r--r--npc/mobs/dungeons/sunkenship.txt282
-rw-r--r--npc/mobs/dungeons/toyfactory.txt60
-rw-r--r--npc/mobs/dungeons/turtleisland.txt94
-rw-r--r--npc/mobs/dungeons/umbaladun.txt50
-rw-r--r--npc/mobs/fields/amatsu.txt76
-rw-r--r--npc/mobs/fields/ayothana.txt44
-rw-r--r--npc/mobs/fields/comodo.txt302
-rw-r--r--npc/mobs/fields/gefenia.txt98
-rw-r--r--npc/mobs/fields/geffen.txt390
-rw-r--r--npc/mobs/fields/gonryun.txt40
-rw-r--r--npc/mobs/fields/louyang.txt30
-rw-r--r--npc/mobs/fields/lutie.txt32
-rw-r--r--npc/mobs/fields/mjolnir.txt452
-rw-r--r--npc/mobs/fields/morocc.txt512
-rw-r--r--npc/mobs/fields/niflheim.txt84
-rw-r--r--npc/mobs/fields/payon.txt256
-rw-r--r--npc/mobs/fields/prontera.txt226
-rw-r--r--npc/mobs/fields/umbala.txt76
-rw-r--r--npc/mobs/fields/yuno.txt120
-rw-r--r--npc/mobs/pvp.txt62
-rw-r--r--npc/other/Global_Functions.txt160
-rw-r--r--npc/other/IceCream.txt128
-rw-r--r--npc/other/Valkyrie.txt98
-rw-r--r--npc/other/arena.txt1134
-rw-r--r--npc/other/arena_mvp.txt2210
-rw-r--r--npc/other/bank.txt250
-rw-r--r--npc/other/blackjack.txt698
-rw-r--r--npc/other/books.txt4582
-rw-r--r--npc/other/breeder.txt128
-rw-r--r--npc/other/card_remover.txt338
-rw-r--r--npc/other/devnpc.txt384
-rw-r--r--npc/other/gefenia.txt60
-rw-r--r--npc/other/heal.txt80
-rw-r--r--npc/other/heal_payment.txt196
-rw-r--r--npc/other/kafra_bank.txt210
-rw-r--r--npc/other/mc_cameri/bank.txt5586
-rw-r--r--npc/other/momotaro.txt886
-rw-r--r--npc/other/msg_boards.txt350
-rw-r--r--npc/other/old/guide.txt2306
-rw-r--r--npc/other/old/kafra.txt3730
-rw-r--r--npc/other/old/pvp.txt2910
-rw-r--r--npc/other/platinum_skills.txt220
-rw-r--r--npc/other/pvp.txt840
-rw-r--r--npc/other/tougijou.txt744
-rw-r--r--npc/other/warper.txt198
-rw-r--r--npc/other/warper2.txt526
-rw-r--r--npc/other/wedding.txt1412
-rw-r--r--npc/other/weddingtxt.txt552
-rw-r--r--npc/quests/all_quest.txt1138
-rw-r--r--npc/quests/bongunsword.txt86
-rw-r--r--npc/quests/bunnyband.txt204
-rw-r--r--npc/quests/counteragent_mixture.txt524
-rw-r--r--npc/quests/custom/berzebub.txt168
-rw-r--r--npc/quests/custom/elvenear.txt142
-rw-r--r--npc/quests/custom/event_32_new_hats.txt2556
-rw-r--r--npc/quests/custom/excalibur.txt136
-rw-r--r--npc/quests/custom/ironcane.txt104
-rw-r--r--npc/quests/custom/kaho_balmung.txt194
-rw-r--r--npc/quests/custom/kahohorn.txt158
-rw-r--r--npc/quests/custom/new_hats.txt2938
-rw-r--r--npc/quests/custom/sunglasses.txt292
-rw-r--r--npc/quests/custom/valhallen.txt398
-rw-r--r--npc/quests/doomed_swords.txt1362
-rw-r--r--npc/quests/fashion.txt120
-rw-r--r--npc/quests/juice_maker.txt616
-rw-r--r--npc/quests/magicalhatquest.txt80
-rw-r--r--npc/quests/monstertamers.txt886
-rw-r--r--npc/quests/mrsmile.txt184
-rw-r--r--npc/quests/quests_alberta.txt1368
-rw-r--r--npc/quests/quests_aldebaran.txt186
-rw-r--r--npc/quests/quests_comodo.txt554
-rw-r--r--npc/quests/quests_geffen.txt372
-rw-r--r--npc/quests/quests_lutie.txt372
-rw-r--r--npc/quests/quests_morocc.txt250
-rw-r--r--npc/quests/quests_payon.txt582
-rw-r--r--npc/quests/quests_prontera.txt184
-rw-r--r--npc/quests/quests_umbala.txt690
-rw-r--r--npc/quests/quests_yuno.txt270
-rw-r--r--npc/quests/skills/acolyte_skills.txt252
-rw-r--r--npc/quests/skills/archer_skills.txt420
-rw-r--r--npc/quests/skills/mage_skills.txt228
-rw-r--r--npc/quests/skills/merchant_skills.txt616
-rw-r--r--npc/quests/skills/novice_skills.txt516
-rw-r--r--npc/quests/skills/swordsman_skills.txt742
-rw-r--r--npc/quests/skills/thief_skills.txt772
-rw-r--r--npc/sample/PCLoginEvent.txt64
-rw-r--r--npc/sample/bank_test.txt118
-rw-r--r--npc/sample/gstorage_test.txt66
-rw-r--r--npc/sample/npc_card_remover.txt394
-rw-r--r--npc/sample/npc_equip_sample.txt34
-rw-r--r--npc/sample/npc_extend_shop.txt136
-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_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/warps/ayothaya.txt202
-rw-r--r--npc/warps/cities/alberta.txt116
-rw-r--r--npc/warps/cities/aldebaran.txt98
-rw-r--r--npc/warps/cities/amatsu.txt102
-rw-r--r--npc/warps/cities/comodo.txt112
-rw-r--r--npc/warps/cities/geffen.txt98
-rw-r--r--npc/warps/cities/gonryun.txt66
-rw-r--r--npc/warps/cities/izlude.txt68
-rw-r--r--npc/warps/cities/louyang.txt96
-rw-r--r--npc/warps/cities/lutie.txt82
-rw-r--r--npc/warps/cities/morroc.txt212
-rw-r--r--npc/warps/cities/niflheim.txt68
-rw-r--r--npc/warps/cities/payon.txt272
-rw-r--r--npc/warps/cities/prontera.txt202
-rw-r--r--npc/warps/cities/umbala.txt86
-rw-r--r--npc/warps/cities/yggdrasil.txt48
-rw-r--r--npc/warps/cities/yuno.txt182
-rw-r--r--npc/warps/disabled_warps.txt72
-rw-r--r--npc/warps/dungeons/alberta_duns.txt114
-rw-r--r--npc/warps/dungeons/alde_ct.txt450
-rw-r--r--npc/warps/dungeons/amatsu_dun.txt40
-rw-r--r--npc/warps/dungeons/ant_hell.txt52
-rw-r--r--npc/warps/dungeons/coal_mine.txt42
-rw-r--r--npc/warps/dungeons/com_dun.txt36
-rw-r--r--npc/warps/dungeons/geffen_dun.txt88
-rw-r--r--npc/warps/dungeons/gon_dun.txt80
-rw-r--r--npc/warps/dungeons/izlude_dun.txt58
-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/orc_dun.txt50
-rw-r--r--npc/warps/dungeons/payon_dun.txt72
-rw-r--r--npc/warps/dungeons/prt_dun.txt306
-rw-r--r--npc/warps/dungeons/umbala_dun.txt64
-rw-r--r--npc/warps/dungeons/yuno_dun.txt36
-rw-r--r--npc/warps/fields/amatsu_fild.txt40
-rw-r--r--npc/warps/fields/com_fild.txt104
-rw-r--r--npc/warps/fields/gefenia.txt60
-rw-r--r--npc/warps/fields/geffen_fild.txt142
-rw-r--r--npc/warps/fields/glastheim.txt168
-rw-r--r--npc/warps/fields/jawaii.txt50
-rw-r--r--npc/warps/fields/lutie_fild.txt32
-rw-r--r--npc/warps/fields/morroc_fild.txt204
-rw-r--r--npc/warps/fields/mtmjolnir.txt120
-rw-r--r--npc/warps/fields/payon_fild.txt94
-rw-r--r--npc/warps/fields/prontera_fild.txt200
-rw-r--r--npc/warps/fields/umbala_fild.txt68
-rw-r--r--npc/warps/fields/yuno_fild.txt62
-rw-r--r--npc/warps/guild/guildcastles.txt800
-rw-r--r--npc/warps/other/jobquests.txt274
-rw-r--r--npc/warps/other/other.txt68
-rw-r--r--npc/warps/pvp/pvp.txt516
-rw-r--r--object_del.bat30
-rw-r--r--readme.html394
-rw-r--r--readme/1final.css126
-rw-r--r--readme/changelog.html344
-rw-r--r--readme/faq.html398
-rw-r--r--readme/features.html550
-rw-r--r--readme/gmcommands.html1470
-rw-r--r--readme/npcfeatures.html412
-rw-r--r--readme/settingup.html368
-rw-r--r--readme/support.html258
-rw-r--r--runserver.bat6
-rw-r--r--save-tmpl/castle.txt48
-rw-r--r--sql-files/convert_passwords.sql6
-rw-r--r--sql-files/database.sql4360
-rw-r--r--sql-files/db_tables.sql1160
-rw-r--r--sql-files/logs.sql280
-rw-r--r--sql-files/mail.sql28
-rw-r--r--sql-files/main.sql998
-rw-r--r--sql-files/oA2eA-rc5.sql408
-rw-r--r--sql-files/upgrade_0.5.2_database.sql2
-rw-r--r--sql-files/upgrade_0.5.2_main.sql124
-rw-r--r--sql-files/upgrade_1.0.0-rc1_main.sql6
-rw-r--r--sql-files/upgrade_1.0.0-rc2_database.sql8
-rw-r--r--sql-files/upgrade_1.0.0-rc5_database.sql8
-rw-r--r--sql-files/upgrade_817.sql206
-rw-r--r--src/char/Makefile34
-rw-r--r--src/char/char.c6870
-rw-r--r--src/char/char.h64
-rw-r--r--src/char/int_guild.c2892
-rw-r--r--src/char/int_guild.h32
-rw-r--r--src/char/int_party.c1190
-rw-r--r--src/char/int_party.h28
-rw-r--r--src/char/int_pet.c728
-rw-r--r--src/char/int_pet.h26
-rw-r--r--src/char/int_storage.c1000
-rw-r--r--src/char/int_storage.h32
-rw-r--r--src/char/inter.c1126
-rw-r--r--src/char/inter.h40
-rw-r--r--src/char_sql/Makefile40
-rw-r--r--src/char_sql/char.c6046
-rw-r--r--src/char_sql/char.h164
-rw-r--r--src/char_sql/int_guild.c3228
-rw-r--r--src/char_sql/int_guild.h20
-rw-r--r--src/char_sql/int_party.c1510
-rw-r--r--src/char_sql/int_party.h16
-rw-r--r--src/char_sql/int_pet.c648
-rw-r--r--src/char_sql/int_pet.h24
-rw-r--r--src/char_sql/int_storage.c720
-rw-r--r--src/char_sql/int_storage.h26
-rw-r--r--src/char_sql/inter.c1154
-rw-r--r--src/char_sql/inter.h92
-rw-r--r--src/char_sql/itemdb.c494
-rw-r--r--src/char_sql/itemdb.h68
-rw-r--r--src/char_sql/make.sh22
-rw-r--r--src/char_sql/readme.txt500
-rw-r--r--src/char_sql/strlib.c158
-rw-r--r--src/char_sql/strlib.h20
-rw-r--r--src/common/Makefile28
-rw-r--r--src/common/core.c304
-rw-r--r--src/common/core.h24
-rw-r--r--src/common/db.c1002
-rw-r--r--src/common/db.h94
-rw-r--r--src/common/grfio.c1906
-rw-r--r--src/common/grfio.h32
-rw-r--r--src/common/lock.c74
-rw-r--r--src/common/lock.h16
-rw-r--r--src/common/malloc.c88
-rw-r--r--src/common/malloc.h50
-rw-r--r--src/common/mmo.h622
-rw-r--r--src/common/nullpo.c180
-rw-r--r--src/common/nullpo.h444
-rw-r--r--src/common/showmsg.c142
-rw-r--r--src/common/showmsg.h96
-rw-r--r--src/common/socket.c1188
-rw-r--r--src/common/socket.h208
-rw-r--r--src/common/timer.c624
-rw-r--r--src/common/timer.h90
-rw-r--r--src/common/utils.c216
-rw-r--r--src/common/utils.h66
-rw-r--r--src/common/version.h54
-rw-r--r--src/ladmin/Makefile28
-rw-r--r--src/ladmin/ladmin.c8770
-rw-r--r--src/ladmin/ladmin.h22
-rw-r--r--src/ladmin/md5calc.c474
-rw-r--r--src/ladmin/md5calc.h16
-rw-r--r--src/login/Makefile26
-rw-r--r--src/login/login.c7822
-rw-r--r--src/login/login.h82
-rw-r--r--src/login/md5calc.c474
-rw-r--r--src/login/md5calc.h16
-rw-r--r--src/login_sql/Makefile34
-rw-r--r--src/login_sql/login.c3528
-rw-r--r--src/login_sql/login.h82
-rw-r--r--src/login_sql/make.sh12
-rw-r--r--src/login_sql/md5calc.c472
-rw-r--r--src/login_sql/md5calc.h14
-rw-r--r--src/login_sql/readme.txt238
-rw-r--r--src/login_sql/strlib.c116
-rw-r--r--src/login_sql/strlib.h18
-rw-r--r--src/login_sql/timer.h86
-rw-r--r--src/map/Makefile146
-rw-r--r--src/map/Makefile.win32186
-rw-r--r--src/map/atcommand.c15406
-rw-r--r--src/map/atcommand.h488
-rw-r--r--src/map/battle.c10924
-rw-r--r--src/map/battle.h690
-rw-r--r--src/map/chat.c756
-rw-r--r--src/map/chat.h44
-rw-r--r--src/map/chrif.c2100
-rw-r--r--src/map/chrif.h62
-rw-r--r--src/map/clif.c20754
-rw-r--r--src/map/clif.h574
-rw-r--r--src/map/guild.c3108
-rw-r--r--src/map/guild.h174
-rw-r--r--src/map/intif.c2250
-rw-r--r--src/map/intif.h120
-rw-r--r--src/map/itemdb.c1764
-rw-r--r--src/map/itemdb.h168
-rw-r--r--src/map/log.c486
-rw-r--r--src/map/log.h54
-rw-r--r--src/map/mail.c648
-rw-r--r--src/map/mail.h18
-rw-r--r--src/map/map.c4416
-rw-r--r--src/map/map.h1452
-rw-r--r--src/map/mob.c8546
-rw-r--r--src/map/mob.h278
-rw-r--r--src/map/npc.c4548
-rw-r--r--src/map/npc.h104
-rw-r--r--src/map/party.c1288
-rw-r--r--src/map/party.h94
-rw-r--r--src/map/path.c808
-rw-r--r--src/map/pc.c15048
-rw-r--r--src/map/pc.h372
-rw-r--r--src/map/pet.c3302
-rw-r--r--src/map/pet.h138
-rw-r--r--src/map/script.c13860
-rw-r--r--src/map/script.h78
-rw-r--r--src/map/skill.c21610
-rw-r--r--src/map/skill.h1714
-rw-r--r--src/map/storage.c1190
-rw-r--r--src/map/storage.h78
-rw-r--r--src/map/trade.c572
-rw-r--r--src/map/trade.h26
-rw-r--r--src/map/vending.c340
-rw-r--r--src/map/vending.h24
-rw-r--r--src/txt-converter/char/Makefile26
-rw-r--r--src/txt-converter/char/char-converter.c1684
-rw-r--r--src/txt-converter/char/char.h78
-rw-r--r--src/txt-converter/char/int_guild.h20
-rw-r--r--src/txt-converter/char/int_party.h22
-rw-r--r--src/txt-converter/char/int_pet.h24
-rw-r--r--src/txt-converter/char/int_storage.h22
-rw-r--r--src/txt-converter/char/strlib.c132
-rw-r--r--src/txt-converter/char/strlib.h18
-rw-r--r--src/txt-converter/common/inter.h56
-rw-r--r--src/txt-converter/common/mmo.h560
-rw-r--r--src/txt-converter/login/Makefile22
-rw-r--r--src/txt-converter/login/login-converter.c516
-rw-r--r--start62
-rw-r--r--tool/Makefile12
-rw-r--r--tool/adduser.c192
-rw-r--r--tool/backup200
-rw-r--r--tool/cgi/addaccount.cgi408
-rw-r--r--tool/checkversion170
-rw-r--r--tool/convert.c592
-rw-r--r--tool/getlogincount244
-rw-r--r--tool/ladmin7584
-rw-r--r--tool/mapcheck.sh66
-rw-r--r--tool/mapchecker.sh112
-rw-r--r--webserver/Makefile52
-rw-r--r--webserver/doc/API.txt100
-rw-r--r--webserver/doc/README22
-rw-r--r--webserver/generate.c76
-rw-r--r--webserver/htmlstyle.c102
-rw-r--r--webserver/logs.c16
-rw-r--r--webserver/main.c284
-rw-r--r--webserver/pages/about.c12
-rw-r--r--webserver/pages/notdone.c10
-rw-r--r--webserver/pages/sample.c48
-rw-r--r--webserver/parse.c270
665 files changed, 260486 insertions, 260486 deletions
diff --git a/Changelog.txt b/Changelog.txt
index fa952373a..f0d17d1c7 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,2066 +1,2066 @@
-Date Added
-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.
-
- src/txt-converter/login/login-converter.c src/txt-converter/char/char-converter.c src/login_sql/login.c src/common/socket.c src/common/socket.h src/char_sql/char.c src/char_sql/int_guild.c src/char_sql/inter.c src/map/atcommand.c src/map/map.c src/map/mail.c src/char/char.c conf-tmpl/map_athena.conf conf-tmpl/char_athena.conf Changelog.txt
-
-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
+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.
+
+ src/txt-converter/login/login-converter.c src/txt-converter/char/char-converter.c src/login_sql/login.c src/common/socket.c src/common/socket.h src/char_sql/char.c src/char_sql/int_guild.c src/char_sql/inter.c src/map/atcommand.c src/map/map.c src/map/mail.c src/char/char.c conf-tmpl/map_athena.conf conf-tmpl/char_athena.conf Changelog.txt
+
+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/Dev/Dev-Folder-Notes.txt b/Dev/Dev-Folder-Notes.txt
index ded4eb5e4..1936b8fc1 100644
--- a/Dev/Dev-Folder-Notes.txt
+++ b/Dev/Dev-Folder-Notes.txt
@@ -1,3 +1,3 @@
-- This folder and all files inside it must be deleted before any distribution
-- This folder is meant for developers only
-- Use this folder to contain notes, todo, testcases, problems, etc
+- This folder and all files inside it must be deleted before any distribution
+- This folder is meant for developers only
+- Use this folder to contain notes, todo, testcases, problems, etc
diff --git a/Dev/TODO.txt b/Dev/TODO.txt
index c43eddaf8..f6fd346af 100644
--- a/Dev/TODO.txt
+++ b/Dev/TODO.txt
@@ -1,684 +1,684 @@
-The format of to-do list items is:
-
-Description - A description of the task
-Status - The status of the task. The possible values are Pending and Completed
-Assignee - The nickname of the person whom is assigned the task
-Notes - Miscellaneous notes concerning the task
-
-**********
-
-Only the to-do list for the flat-file module should contain tasks concerning database corrections because databases changes for the SQL module are inherited from the flat-file module.
-
-**********
-1.
-Description: Fix the equip field values in item_db
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: <Valaris> i know the equip values in item_db are ****ed <Valaris> not ****ed <Valaris> but supernovice equip is
-
-
-**********
-2.
-Description: Change monster summoning commands so they summon 1 monster if a quantity isn't specified
-
-Status: 50%
-
-Assignee: NONE
-
-Notes: Will work with just mob_id/name specified (ie @monster poring)
- need to make it work with mob_id and name (ie @monster poring test) - Valaris
-
-
-**********
-3.
-Description: Fix Ghostring Card
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: battle_config flag to disable ghosty armor
- protecting you from mobs
-
-**********
-4.
-Description: Add nomagic mapflag/@skilloff/@skillon
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: NONE
-
-
-**********
-5.
-Description: Checking help.txt (main directory, conf directory, doc directory) with atcommand.c
-
-Status: Pending
-
-Assignee: None
-
-Notes: In doc directory, do a help.txt for explaination of all commands.
- In conf directory, do a help.txt for displaying the resume of each command in chat windows of the client
- (chat windows does support more than 200 lines).
- In main directory, suggestion to delete it.
-
-
-**********
-6.
-Description: Update produce_db
-
-Status: Pending
-
-Assignee: None
-
-Notes: The Alchemist Forging items were recently changed. The DB needs to be edited and if needed, source to be modified
-
-
-**********
-7.
-Description: novice.txt: new_1-4.gat,60,149,4 script Helper 55
- This NPC gives infinite items and zenys.
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: If you clicks on 'cancel' button or quits the game to come back, you can have infinite zenys and items.
- So, we must save (in a variable) when the npc gives items/zenys and don't given them again.
-
-
-**********
-8.
-Description: scripts, register variables and job 1
- When you become job 1, reset all variables of OTHER jobs too to save register memory.
-
-Status: Pending
-
-Assignee: None
-
-Notes: None
-
-
-**********
-9.
-Description: @mapspy <map> <on/off> command
-
-Status: Pending
-
-Assignee: None
-
-Notes: to receive any messages of all characters on a specifical map.
- don't send duplicate messages if already @guildspy ou @partyspy
-
-
-**********
-10.
-Description: Pet Skills.
-
-Status: 90%
-
-Assignee: Valaris
-
-Notes: Don't touch pet.c, pet.h, or pet dbs.
-
-
-**********
-11.
-Description: Add kRO server side friends list.
-
-Status: 80%
-
-Assignee: davidsiaw
-
-Notes: Got most of the packets. Except the ones that tell the client that a player is online and tell the client to give messages.
-
-
-**********
-12.
-Description: Updating the 'gmcommands.html' with actual commands.
-
-Status: Pending
-
-Assignee: None
-
-Notes: NONE
-
-
-**********
-13.
-Description: On PVP map, don't count a 'GM HIDE' GM (2 normal players + 1 HIDE GM: 2/2, not 3/3).
-
-Status: Pending
-
-Assignee: None
-
-Notes: NONE
-
-
-**********
-14.
-Description: Add encrypted password option in login-server.
-
-Status: Blocked, no solution without limited client version.
-
-Assignee: Yor
-
-Notes: It's impossible to use encrypted password in the account file, if we want to authorise all client version.
- Some clients use a (random) md5key and send a composed encrypted of the password.
- So, these clients send a different encrypted password based on plain text password at every connection.
- If the password is encrypted, we can not more compare with plain text.
- The other solution can be to not authorise these clients. But, that will probably be the futur of ALL clients.
- Reduce possibilities of client version isn't a good idea for the futur and for the compatibility (like use only plain text password client version).
- Save in account the plain text and the encypted version use more memory for nothing, and don't add security.
- Conclusion:
- If you want protected your password, you must:
- - protected you account file
- - never send a password outside the server
- - use only encypted client version (that send an encrypted password to server).
-
-
-**********
-15.
-Description: Create all reloaddb command in ladmin.
-
-Status: Affected
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-16.
-Description: Create a shutdown + time command in ladmin.
-
-Status: Affected
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-17.
-Description: Create a kickall command in ladmin.
-
-Status: Affected
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-18.
-Description: Create listban/listok command in ladmin.
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-19.
-Description: Login-server: create a first anti-hack system versus multiple connections trying.
-
-Status: Affected
-
-Assignee: Yor
-
-Notes: Set on IP.
- An option to set number of connections before to block (number_of_try_before_block)
- An option to set number of second where the tries must be done (within_seconds_for tries)
- An option to set the time of impossible connection after block (blocked_time_in_minutes)
- About wrong password, add:
- dynamic_pass_failure_ban_time: 5 (duration of ban, in minutes)
- dynamic_pass_failure_ban_how_many: 3 (number of tries before to ban)
- dynamic_pass_failure_ban_how_long: 60 (inside time where the tries must be done before to ban, in sec)
-
-
-**********
-20.
-Description: Create @unban and @unblock GM command.
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-21.
-Description: Fix @nuke GM command.
-
-Status: Completed
-
-Assignee: Valaris
-
-Notes: If you nuke a mounted Knight/Crusader they lose Peco but see it in the equip.window.
- And can't get another one.
-
-
-**********
-22.
-Description: Adding GM command @guildmaster <playername>
-
-Status: Pending
-
-Assignee: MC_Cameri
-
-Notes: Guild Master turns another member of his guild into Guild Master.
- MC Cameri: It will now be called @swapgm, meaning swap of guild master.
-
-
-**********
-23.
-Description: In Guilds folder change all checkcart -> checkcart(0)
-
-Status: Completed?
-
-Assignee: Aria
-
-Notes: All checkcart were in the old/ folder o_O?
- Because just "checkcart" always returns 0. (All common Kafras&breeder have been already fixed)
-
-
-**********
-24.
-Description: In script.c parser should be fixed to allow argumentless functions return value.
-
-Status: Pending
-
-Assignee: None
-
-Notes: Functions like "checkcart", "checkfalcon", "checkriding" don't return value if used without agruments or without "()".
- Example: 'checkcart' always return Zero (because the parser doesn't recognize it as a function!)
- Example: 'checkcart()' map server doesn't load (because argless funcs aren't in use)
- As a temp fix Lupus added "*" in script.c in "checkcart", "checkfalcon", "checkriding" definitions.
- To be able running them with any fake arg. i.e. checkcart(0) works fine!
-
-
-**********
-25.
-Description: Create a LAN management, 1 by server
-
-Status: Affected
-
-Assignee: Yor
-
-Notes: 1 computer can be on multiple LAN. So, each server must have 1 LAN definition.
-
-
-**********
-26.
-Description: @ban/@block must be usable when player is offline
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: NONE
-
-
-**********
-27.
-Description: When it's night, inscreasing spawn of undeads
-
-Status: Pending
-
-Assignee: None
-
-Notes: Variable 'night_flag' is 0 if it's day, or 1 if it's night.
-
-
-**********
-28.
-Description: in ladmin, create a method for account with spaces
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: use "<account name>" or '<account name>'.
-
-
-**********
-29.
-Description: @(un)ban/@(un)block: reduction of number of packets
- improvement of messages
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: None.
-
-
-**********
-30.
-Description: Create (un)ban/(un)block in ladmin to be similar with GM command
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: None.
-
-
-**********
-31.
-Description: Packet 0x3831 need too much size! IMPORTANT to found a solution!
- It's cause of crashes or freeze of servers (char or map).
-
-Status: Pending
-
-Assignee: None
-
-Notes: When map-server do a connection to char-server, this packet is send (C->M). Example of display (1 connection!):
- socket #5:
- wdata (size: 131072 bytes) need to be expanded.
- wdata is actually used for 111654 bytes (free bytes: 19418).
- packet 0x3831 need mode space (size of the packet: 12332).
- wdata expanded to 262144 bytes.
- socket #5:
- wdata (size: 262144 bytes) need to be expanded.
- wdata is actually used for 234974 bytes (free bytes: 27170).
- packet 0x3831 need mode space (size of the packet: 12332).
- wdata expanded to 524288 bytes.
- Additional note: there is only 63 guilds on this server...
-
-
-**********
-32.
-Description: Management of PM ignore for wisps
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: None.
-
-
-**********
-33.
-Description: Add a GM info hacker minimum level parameter
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: first use: spoof namer
-
-
-**********
-34.
-Description: Create @makepet to create directly a pet
-
-Status: Pending
-
-Assignee: None
-
-Notes: NONE
-
-
-**********
-35.
-Description: In dungeon, set night for people. In shop, set day for people.
-
-Status: Assigned
-
-Assignee: Yor
-
-Notes: work like variable 'night_flag' is 0 if it's day, or 1 if it's night.
-
-
-**********
-36
-Description: Create your limited time.... but an option can be good :)...
-
-Status: Completed
-
-Assignee: Yor
-
-Notes: NONE
-
-**********
-37.
-Description: @killer - enables a @gm to hit a player outside of pvp
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes:
-
-**********
-38.
-Description: atcommand scripts - script @atcommands`
-
-Status: Pending
-
-Assignee: MouseJstr
-
-Notes:
-
-**********
-40.
-Description: @addwarp - create a static warp to a target location
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes:
-**********
-41.
-Description: @movenpc
- - manipulate npc's at runtime
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: handling npc's with the same name on multiple maps
- requires thoughts
-**********
-42.
-Description: @uptime - how long as the server been up?
-
-Status: Pending
-
-Assignee: MouseJstr, MC Cameri
-
-Notes:
- MC Cameri: This is done already in OA, wait for merge.
- Aria: I said that, but they told me it was BROKED!
-**********
-43.
-Description: map aliases -
- create virtual copies of maps but don't require
- changes to the client to support it
-
-Status: 80% done
-
-Assignee: MouseJstr
-
-Notes
-**********
-44.
-Description: Fix GTB card
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: battle_config command that controls just how magic resistant
- you raelly are
-**********
-45.
-Description: gm @follow command
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: follows players, including warping to them... lets you do
- a gm hide and grab a cup of coffee while watching a player
- do bad things..
-**********
-47.
-Description: different max aspd for players and GM's
-
-Status: Pending
-
-Assignee: MouseJstr
-
-Notes:
-**********
-48.
-Description: Configurable max num castles for a guild
-
-Status: Done
-
-Assignee: MouseJstr
-
-Notes: We limit each guild to 3 castles on my server
-*********
-49
-Description: Add @chareffect - Done [MouseJstr]
- set a persistant effect on another character
- Add @chardisguise - done [MouseJstr]
- set a persistant disguise effect on another character
- Add @mobid
- look up a monster by name - needed?
- Add @petid
- look up a pet by name
- Add @chardye
- Add @charhairstyle
- Add @charhaircolor
- Versions of dye hairstyle and haircolor fo other chars
- Add @followme
- make a character follow you.. including warps
- Add @shuffle
- re-arrange everybody on the map randomly
- Add @dropall - done [MouseJstr]
- takes all my possessions and throws them on the ground
- Add @chardropall - done [MouseJstr]
- takes all the players possessions and throws them on the ground..
- Add @storeall - done [MouseJstr]
- takes all my possessions and puts them in storage, leaving 500 zeny to let you take it all back out again
- Add @charstoreall - done [MouseJstr]
- takes all the players possessions and puts them in storage, leaving 500 zeny to let you take it all back out again
- Add @skillid - lookup a skill by name - done [MouseJstr
- Add @useskill - use a skill given the number or name - done [MouseJstr]
-*********
-50.
-Description: New Guild Skills
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: use http://forums.emperium.org/viewtopic.php?t=43245 for a list
-********
-51.
-Description: Devilring
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: New mini-boss; find as much about it as possible including stats and drops
-*********
-52.
-Description: LV4 Weapon Quests
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: Info here http://forums.emperium.org/viewtopic.php?t=39934 Use perm variables?
-*********
-53.
-Description: Monster Pictures
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: WTF! http://forums.emperium.org/viewtopic.php?t=32998
-*********
-54.
-Description: Wandering Singer
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: May have to spy on kRO to get more info. http://forums.emperium.org/viewtopic.php?t=32998
-********
-55.
-Description: Arena Points
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: points->item system; http://forums.emperium.org/viewtopic.php?t=32998
-********
-56.
-Description: kRO Account
-
-Status: Pending
-
-Assignee: NONE
-
-Notes: Give us a kRO account, gm or whatever so we can spy =OOOOOOOO
-*********
-57.
-Description: Baby Skills
-
-Stats: Pending
-
-Assignee: NONE
-
-Notes: 1. Skills
- - Come here, baby.
- ( Summons the adoptee )
- - Mom, Dad, I love you.
- ( For 5 minutes, the parent characters will not have EXP penalty upon death )
- - Mom, Dad, I want to see you.
- ( Summons the parents )
- * For the summon skill, it works like wedding summon skill - it can only be done in areas where warps can be saved at.
-
- 2. EXP Sharing
- - Only the parents and the child can EXP share; nobody else can be in the party. If any other person joins, the EXP share resets.
- - If you move to a different map, the EXP share resets.
- - The EXP returned is only 1/3rd of normal since both mother and father character has to be in the same party with the child.
-
- 3. Changes after adoption
- - For the child character, the character becomes small.
-
- 4. What happens if parents divorce
- - The parents can NEVER adopt another child ever again even after divorce + remarry.
- - The character child continues to be as it is (meaning, even if the child no longer has a parent, he or she will continue to be the 'child'), and only 1 child can be obtained per character.
- - Even if the child character is deleted, the parents can never get another child.
- * This means, when you adopt a child character, DO IT CAREFULLY. For the entire history of your character, you can only, and I mean ONLY get one child character.
-
- - The Child Adoption system now changes as following, so please make note of this:
- * The adopted child cannot raise any stat to beyond 80.
- * The adopted child will have 70% of MaxHP and MaxSP of normal characters.
- * The adopted child cannot marry.
- * "Mom, Dad, I love you" skill will only last 2 minutes instead of 5.
- * The parents must be both LV 70 or above in order to adopt.
- * The parents must be both LV 70 or above in order to share EXP as family.
- * "Mom, Dad, I love you" skill will now take 10% of MaxSP instead of taking 1 SP.
+The format of to-do list items is:
+
+Description - A description of the task
+Status - The status of the task. The possible values are Pending and Completed
+Assignee - The nickname of the person whom is assigned the task
+Notes - Miscellaneous notes concerning the task
+
+**********
+
+Only the to-do list for the flat-file module should contain tasks concerning database corrections because databases changes for the SQL module are inherited from the flat-file module.
+
+**********
+1.
+Description: Fix the equip field values in item_db
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: <Valaris> i know the equip values in item_db are ****ed <Valaris> not ****ed <Valaris> but supernovice equip is
+
+
+**********
+2.
+Description: Change monster summoning commands so they summon 1 monster if a quantity isn't specified
+
+Status: 50%
+
+Assignee: NONE
+
+Notes: Will work with just mob_id/name specified (ie @monster poring)
+ need to make it work with mob_id and name (ie @monster poring test) - Valaris
+
+
+**********
+3.
+Description: Fix Ghostring Card
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: battle_config flag to disable ghosty armor
+ protecting you from mobs
+
+**********
+4.
+Description: Add nomagic mapflag/@skilloff/@skillon
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: NONE
+
+
+**********
+5.
+Description: Checking help.txt (main directory, conf directory, doc directory) with atcommand.c
+
+Status: Pending
+
+Assignee: None
+
+Notes: In doc directory, do a help.txt for explaination of all commands.
+ In conf directory, do a help.txt for displaying the resume of each command in chat windows of the client
+ (chat windows does support more than 200 lines).
+ In main directory, suggestion to delete it.
+
+
+**********
+6.
+Description: Update produce_db
+
+Status: Pending
+
+Assignee: None
+
+Notes: The Alchemist Forging items were recently changed. The DB needs to be edited and if needed, source to be modified
+
+
+**********
+7.
+Description: novice.txt: new_1-4.gat,60,149,4 script Helper 55
+ This NPC gives infinite items and zenys.
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: If you clicks on 'cancel' button or quits the game to come back, you can have infinite zenys and items.
+ So, we must save (in a variable) when the npc gives items/zenys and don't given them again.
+
+
+**********
+8.
+Description: scripts, register variables and job 1
+ When you become job 1, reset all variables of OTHER jobs too to save register memory.
+
+Status: Pending
+
+Assignee: None
+
+Notes: None
+
+
+**********
+9.
+Description: @mapspy <map> <on/off> command
+
+Status: Pending
+
+Assignee: None
+
+Notes: to receive any messages of all characters on a specifical map.
+ don't send duplicate messages if already @guildspy ou @partyspy
+
+
+**********
+10.
+Description: Pet Skills.
+
+Status: 90%
+
+Assignee: Valaris
+
+Notes: Don't touch pet.c, pet.h, or pet dbs.
+
+
+**********
+11.
+Description: Add kRO server side friends list.
+
+Status: 80%
+
+Assignee: davidsiaw
+
+Notes: Got most of the packets. Except the ones that tell the client that a player is online and tell the client to give messages.
+
+
+**********
+12.
+Description: Updating the 'gmcommands.html' with actual commands.
+
+Status: Pending
+
+Assignee: None
+
+Notes: NONE
+
+
+**********
+13.
+Description: On PVP map, don't count a 'GM HIDE' GM (2 normal players + 1 HIDE GM: 2/2, not 3/3).
+
+Status: Pending
+
+Assignee: None
+
+Notes: NONE
+
+
+**********
+14.
+Description: Add encrypted password option in login-server.
+
+Status: Blocked, no solution without limited client version.
+
+Assignee: Yor
+
+Notes: It's impossible to use encrypted password in the account file, if we want to authorise all client version.
+ Some clients use a (random) md5key and send a composed encrypted of the password.
+ So, these clients send a different encrypted password based on plain text password at every connection.
+ If the password is encrypted, we can not more compare with plain text.
+ The other solution can be to not authorise these clients. But, that will probably be the futur of ALL clients.
+ Reduce possibilities of client version isn't a good idea for the futur and for the compatibility (like use only plain text password client version).
+ Save in account the plain text and the encypted version use more memory for nothing, and don't add security.
+ Conclusion:
+ If you want protected your password, you must:
+ - protected you account file
+ - never send a password outside the server
+ - use only encypted client version (that send an encrypted password to server).
+
+
+**********
+15.
+Description: Create all reloaddb command in ladmin.
+
+Status: Affected
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+16.
+Description: Create a shutdown + time command in ladmin.
+
+Status: Affected
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+17.
+Description: Create a kickall command in ladmin.
+
+Status: Affected
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+18.
+Description: Create listban/listok command in ladmin.
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+19.
+Description: Login-server: create a first anti-hack system versus multiple connections trying.
+
+Status: Affected
+
+Assignee: Yor
+
+Notes: Set on IP.
+ An option to set number of connections before to block (number_of_try_before_block)
+ An option to set number of second where the tries must be done (within_seconds_for tries)
+ An option to set the time of impossible connection after block (blocked_time_in_minutes)
+ About wrong password, add:
+ dynamic_pass_failure_ban_time: 5 (duration of ban, in minutes)
+ dynamic_pass_failure_ban_how_many: 3 (number of tries before to ban)
+ dynamic_pass_failure_ban_how_long: 60 (inside time where the tries must be done before to ban, in sec)
+
+
+**********
+20.
+Description: Create @unban and @unblock GM command.
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+21.
+Description: Fix @nuke GM command.
+
+Status: Completed
+
+Assignee: Valaris
+
+Notes: If you nuke a mounted Knight/Crusader they lose Peco but see it in the equip.window.
+ And can't get another one.
+
+
+**********
+22.
+Description: Adding GM command @guildmaster <playername>
+
+Status: Pending
+
+Assignee: MC_Cameri
+
+Notes: Guild Master turns another member of his guild into Guild Master.
+ MC Cameri: It will now be called @swapgm, meaning swap of guild master.
+
+
+**********
+23.
+Description: In Guilds folder change all checkcart -> checkcart(0)
+
+Status: Completed?
+
+Assignee: Aria
+
+Notes: All checkcart were in the old/ folder o_O?
+ Because just "checkcart" always returns 0. (All common Kafras&breeder have been already fixed)
+
+
+**********
+24.
+Description: In script.c parser should be fixed to allow argumentless functions return value.
+
+Status: Pending
+
+Assignee: None
+
+Notes: Functions like "checkcart", "checkfalcon", "checkriding" don't return value if used without agruments or without "()".
+ Example: 'checkcart' always return Zero (because the parser doesn't recognize it as a function!)
+ Example: 'checkcart()' map server doesn't load (because argless funcs aren't in use)
+ As a temp fix Lupus added "*" in script.c in "checkcart", "checkfalcon", "checkriding" definitions.
+ To be able running them with any fake arg. i.e. checkcart(0) works fine!
+
+
+**********
+25.
+Description: Create a LAN management, 1 by server
+
+Status: Affected
+
+Assignee: Yor
+
+Notes: 1 computer can be on multiple LAN. So, each server must have 1 LAN definition.
+
+
+**********
+26.
+Description: @ban/@block must be usable when player is offline
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: NONE
+
+
+**********
+27.
+Description: When it's night, inscreasing spawn of undeads
+
+Status: Pending
+
+Assignee: None
+
+Notes: Variable 'night_flag' is 0 if it's day, or 1 if it's night.
+
+
+**********
+28.
+Description: in ladmin, create a method for account with spaces
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: use "<account name>" or '<account name>'.
+
+
+**********
+29.
+Description: @(un)ban/@(un)block: reduction of number of packets
+ improvement of messages
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: None.
+
+
+**********
+30.
+Description: Create (un)ban/(un)block in ladmin to be similar with GM command
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: None.
+
+
+**********
+31.
+Description: Packet 0x3831 need too much size! IMPORTANT to found a solution!
+ It's cause of crashes or freeze of servers (char or map).
+
+Status: Pending
+
+Assignee: None
+
+Notes: When map-server do a connection to char-server, this packet is send (C->M). Example of display (1 connection!):
+ socket #5:
+ wdata (size: 131072 bytes) need to be expanded.
+ wdata is actually used for 111654 bytes (free bytes: 19418).
+ packet 0x3831 need mode space (size of the packet: 12332).
+ wdata expanded to 262144 bytes.
+ socket #5:
+ wdata (size: 262144 bytes) need to be expanded.
+ wdata is actually used for 234974 bytes (free bytes: 27170).
+ packet 0x3831 need mode space (size of the packet: 12332).
+ wdata expanded to 524288 bytes.
+ Additional note: there is only 63 guilds on this server...
+
+
+**********
+32.
+Description: Management of PM ignore for wisps
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: None.
+
+
+**********
+33.
+Description: Add a GM info hacker minimum level parameter
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: first use: spoof namer
+
+
+**********
+34.
+Description: Create @makepet to create directly a pet
+
+Status: Pending
+
+Assignee: None
+
+Notes: NONE
+
+
+**********
+35.
+Description: In dungeon, set night for people. In shop, set day for people.
+
+Status: Assigned
+
+Assignee: Yor
+
+Notes: work like variable 'night_flag' is 0 if it's day, or 1 if it's night.
+
+
+**********
+36
+Description: Create your limited time.... but an option can be good :)...
+
+Status: Completed
+
+Assignee: Yor
+
+Notes: NONE
+
+**********
+37.
+Description: @killer - enables a @gm to hit a player outside of pvp
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes:
+
+**********
+38.
+Description: atcommand scripts - script @atcommands`
+
+Status: Pending
+
+Assignee: MouseJstr
+
+Notes:
+
+**********
+40.
+Description: @addwarp - create a static warp to a target location
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes:
+**********
+41.
+Description: @movenpc
+ - manipulate npc's at runtime
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: handling npc's with the same name on multiple maps
+ requires thoughts
+**********
+42.
+Description: @uptime - how long as the server been up?
+
+Status: Pending
+
+Assignee: MouseJstr, MC Cameri
+
+Notes:
+ MC Cameri: This is done already in OA, wait for merge.
+ Aria: I said that, but they told me it was BROKED!
+**********
+43.
+Description: map aliases -
+ create virtual copies of maps but don't require
+ changes to the client to support it
+
+Status: 80% done
+
+Assignee: MouseJstr
+
+Notes
+**********
+44.
+Description: Fix GTB card
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: battle_config command that controls just how magic resistant
+ you raelly are
+**********
+45.
+Description: gm @follow command
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: follows players, including warping to them... lets you do
+ a gm hide and grab a cup of coffee while watching a player
+ do bad things..
+**********
+47.
+Description: different max aspd for players and GM's
+
+Status: Pending
+
+Assignee: MouseJstr
+
+Notes:
+**********
+48.
+Description: Configurable max num castles for a guild
+
+Status: Done
+
+Assignee: MouseJstr
+
+Notes: We limit each guild to 3 castles on my server
+*********
+49
+Description: Add @chareffect - Done [MouseJstr]
+ set a persistant effect on another character
+ Add @chardisguise - done [MouseJstr]
+ set a persistant disguise effect on another character
+ Add @mobid
+ look up a monster by name - needed?
+ Add @petid
+ look up a pet by name
+ Add @chardye
+ Add @charhairstyle
+ Add @charhaircolor
+ Versions of dye hairstyle and haircolor fo other chars
+ Add @followme
+ make a character follow you.. including warps
+ Add @shuffle
+ re-arrange everybody on the map randomly
+ Add @dropall - done [MouseJstr]
+ takes all my possessions and throws them on the ground
+ Add @chardropall - done [MouseJstr]
+ takes all the players possessions and throws them on the ground..
+ Add @storeall - done [MouseJstr]
+ takes all my possessions and puts them in storage, leaving 500 zeny to let you take it all back out again
+ Add @charstoreall - done [MouseJstr]
+ takes all the players possessions and puts them in storage, leaving 500 zeny to let you take it all back out again
+ Add @skillid - lookup a skill by name - done [MouseJstr
+ Add @useskill - use a skill given the number or name - done [MouseJstr]
+*********
+50.
+Description: New Guild Skills
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: use http://forums.emperium.org/viewtopic.php?t=43245 for a list
+********
+51.
+Description: Devilring
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: New mini-boss; find as much about it as possible including stats and drops
+*********
+52.
+Description: LV4 Weapon Quests
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: Info here http://forums.emperium.org/viewtopic.php?t=39934 Use perm variables?
+*********
+53.
+Description: Monster Pictures
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: WTF! http://forums.emperium.org/viewtopic.php?t=32998
+*********
+54.
+Description: Wandering Singer
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: May have to spy on kRO to get more info. http://forums.emperium.org/viewtopic.php?t=32998
+********
+55.
+Description: Arena Points
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: points->item system; http://forums.emperium.org/viewtopic.php?t=32998
+********
+56.
+Description: kRO Account
+
+Status: Pending
+
+Assignee: NONE
+
+Notes: Give us a kRO account, gm or whatever so we can spy =OOOOOOOO
+*********
+57.
+Description: Baby Skills
+
+Stats: Pending
+
+Assignee: NONE
+
+Notes: 1. Skills
+ - Come here, baby.
+ ( Summons the adoptee )
+ - Mom, Dad, I love you.
+ ( For 5 minutes, the parent characters will not have EXP penalty upon death )
+ - Mom, Dad, I want to see you.
+ ( Summons the parents )
+ * For the summon skill, it works like wedding summon skill - it can only be done in areas where warps can be saved at.
+
+ 2. EXP Sharing
+ - Only the parents and the child can EXP share; nobody else can be in the party. If any other person joins, the EXP share resets.
+ - If you move to a different map, the EXP share resets.
+ - The EXP returned is only 1/3rd of normal since both mother and father character has to be in the same party with the child.
+
+ 3. Changes after adoption
+ - For the child character, the character becomes small.
+
+ 4. What happens if parents divorce
+ - The parents can NEVER adopt another child ever again even after divorce + remarry.
+ - The character child continues to be as it is (meaning, even if the child no longer has a parent, he or she will continue to be the 'child'), and only 1 child can be obtained per character.
+ - Even if the child character is deleted, the parents can never get another child.
+ * This means, when you adopt a child character, DO IT CAREFULLY. For the entire history of your character, you can only, and I mean ONLY get one child character.
+
+ - The Child Adoption system now changes as following, so please make note of this:
+ * The adopted child cannot raise any stat to beyond 80.
+ * The adopted child will have 70% of MaxHP and MaxSP of normal characters.
+ * The adopted child cannot marry.
+ * "Mom, Dad, I love you" skill will only last 2 minutes instead of 5.
+ * The parents must be both LV 70 or above in order to adopt.
+ * The parents must be both LV 70 or above in order to share EXP as family.
+ * "Mom, Dad, I love you" skill will now take 10% of MaxSP instead of taking 1 SP.
- The wedding skills will now depend on percentage of MaxHP/MaxSP. \ No newline at end of file
diff --git a/Dev/TODO_MOB_AI.txt b/Dev/TODO_MOB_AI.txt
index 3ea2bc0e2..9f73656f9 100644
--- a/Dev/TODO_MOB_AI.txt
+++ b/Dev/TODO_MOB_AI.txt
@@ -1,134 +1,134 @@
-// eAthena TODO for Monster AI
-// -----------------------------------------
-// The idea of this file is to write a system to use for mob AI because
-// to put it bluntly, our mobs are stupid. If we can pull off some sweet
-// AI, we will own the other emulators.
-//
-// What we have here are 2 columns. I describe them below...
-// - 'mode' : Mode is when the monster can attack, like, can it move? can it
-// attack first? can it assist other monsters?
-//
-// - 'AI' : AI is the smart part of the monster. This is how the monster
-// will actully go about attacking something. For example we
-// could make archer skeletons fire an arrow or 2, then flee
-// and fire a few more arrows. Or we could have them avoid other
-// classes with range (archers, mages). We could also have mobs
-// run when being sniped off cliffs by archers/mages (wont they
-// hate that, but in reality, thats what they would do).
-//
-// The mode flags will be given an ID to the power of 2, (binary style, like
-// job id's in the item_db) and added together to make the mode. But before
-// the system can be written we need a nice file to explain it. That would be
-// this file. So add away, when it looks done, begin the implementation.
-//
-// Also, if possible, new config file in /conf/. 'mob_ai_athena.conf'. This is
-// where mob AI is enabled/disable. And options can be set to allow and dis-
-// allow certin modes. Ex: People like the AI, but dont like one options, can
-// simply disable THAT AI feature rather then rewriting mob_db to remove it.
-//
-// I wrote the first modes, C devs, move them around as you see fit for programming.
-//
-// -Ancyker
-//
-// (check bottom for more AI ideas)
-//
-
-
-'mode'
-Immobile - Monster can not move, can not be moved (like by archers knockback skills)
-Agressive - Monster can attack first (doesn't mean it will, decided in 'AI')
-Detect cast - Monster will detect if someone is casting on it, and attack back
-Assist - Monster will help other monsters (what monsters it will assist is decided in 'AI')
-Looter - Monster will loot items (if 'Agressive' flag is set, it will attack before looting)
-No Target Change - Monster will not start attacking another target until the first target is dead or out of range
-Passive - Monster will not attack back (ever, unless 'Agressive' flag is also set?)
-Detects Hidden - Monster can see hidden players
-
-'ai'
-NoAI - Doesn't do anything (plants)
-NoSnipe - Monster will run away if being 'sniped' from a clif by archer, mage, etc.
-AttackFlee - Monster will attack, then flee, attack, then flee, etc (Archer Skels, run away, shoot arrow, etc)
-AttackRange1 - Will only attack if player is in a set range [0-3] (It's like the player is close, its a threat now)
-AttackRange2 - Will only attack if player is in a set range [4-6]
-ClassFlee1 - Will run from any player with range (archers, mages, thiefs with bows)
-NoviceNoFlee - Will not run if a player is a novice
-LevelFlee - Wlll run if player is of a higher level (porings would run from level 99s, AHH DONT KILL ME!)
-AvoidPlayer - Will run if it sees any player (So it cancels 'Agressive' flag)
-AttackMostDamage - Will attack the player doing the overall most damage
-AttackLessDamage - Will attack the player doing the overall least damage
-AttackLowestLevel - Will attack the lowest level first
-AttackHighestLevel - Will attack the highest level first
-WarpLowHP - Will warp if HP is low (how low is low?)
-NeverStop - Monster will always be on the move, never stop walking. (Is over-ridden by 'Immobile' flag)
-
-
-//
-// Again, more stuff...
-//
-// The monster spawns sripts need some more params. some examples...
-//
-// We have: map,x,y,offsetx,offsety, ...
-// What if we added more? To only let the monster move so far off from
-// where it was spawned. It could 'guard' an arena, an exit/enterance
-// an npc, whatever =).
-//
-// .... ID,time,time,blah...,mode,WAP
-// Have monsters walk a certin path. Waypoint files are your friend.
-// If a monster has a WAP (optional) it will walk this path.
-// Guardians on patrol? Could be interesting.
-//
-// Add more if you think of any =)
-//
-// If you don't like an idea, comment why, dont remove it.
-// example: (using this one cuz not sure about it)
-//
-// // NeverStop - Will/Could cause lag, don't think its a good idea -name
-// NeverStop - ...
-//
-
-Lupus: (guys, rearrange my ideas or move them as u want)
-Some memory - speed optimizations:
-
-There'a big "for cycle" when u look up for a place to mob spawn.
-It could be made quite fast:
-On server .GAT loading you should make an array with OFFSETS (not even X,Y) of right
-places for future mob spawns.
-If the waypoints aren't found for the loadied map then you should make at least 1-2 waypoints automatically.
-
-About AI:
-EACH map has defined mobs. Your mob should have a flag "healer", "supporter" etc. "weak", "ranged attacker"
-and each map should contain an attached list of mobs with their types
-when one MVP is hurt it'd look for "helpers", "healers".
-And if a mob is almost 0 HP it should look for helpers or look for other mobs ranged attackers
-defence. Etc.
-
-Mobs AI should be WRITTEN IN SPECIAL SCRIPTS.
-Some default mobs will use the same script.
-And some advanced ones will use their own.
-
-MOB-scripts are quite interesting. (remember Robot-Wars game?)
-
-Gulid Wars:
-I think guardians should be able to warp from room to room using WARPS like common Players.
-
-
-Aria's Ideas: (do whatever u want)
-
-We can make aggressive monsters make ambushes, where one attacks and runs away to a huge group of the same monster
-
-instead of dropping 2 x1 items, just drop 1 x2 item
-
-make AI vary inside of a group of monsters (IE 1/2 porings do 1 thing, and the other half do another)
-
-aggressive monsters sould surround enemies, not just blindly attack them
-
-we should also make monsters look as player-like as possible. There should be groups traveling together, or 2 monsters
-next to eachother, chatting.
-
-we shouldn't let mobs spawn right infront of people, like in anime or manga. they always walk towards you, or you walk
-towards them.
-
-let mob stats vary a little bit - every mob shouldn't be the exact same. if it's stronger it gives more exp, and vice
-versa.
-
+// eAthena TODO for Monster AI
+// -----------------------------------------
+// The idea of this file is to write a system to use for mob AI because
+// to put it bluntly, our mobs are stupid. If we can pull off some sweet
+// AI, we will own the other emulators.
+//
+// What we have here are 2 columns. I describe them below...
+// - 'mode' : Mode is when the monster can attack, like, can it move? can it
+// attack first? can it assist other monsters?
+//
+// - 'AI' : AI is the smart part of the monster. This is how the monster
+// will actully go about attacking something. For example we
+// could make archer skeletons fire an arrow or 2, then flee
+// and fire a few more arrows. Or we could have them avoid other
+// classes with range (archers, mages). We could also have mobs
+// run when being sniped off cliffs by archers/mages (wont they
+// hate that, but in reality, thats what they would do).
+//
+// The mode flags will be given an ID to the power of 2, (binary style, like
+// job id's in the item_db) and added together to make the mode. But before
+// the system can be written we need a nice file to explain it. That would be
+// this file. So add away, when it looks done, begin the implementation.
+//
+// Also, if possible, new config file in /conf/. 'mob_ai_athena.conf'. This is
+// where mob AI is enabled/disable. And options can be set to allow and dis-
+// allow certin modes. Ex: People like the AI, but dont like one options, can
+// simply disable THAT AI feature rather then rewriting mob_db to remove it.
+//
+// I wrote the first modes, C devs, move them around as you see fit for programming.
+//
+// -Ancyker
+//
+// (check bottom for more AI ideas)
+//
+
+
+'mode'
+Immobile - Monster can not move, can not be moved (like by archers knockback skills)
+Agressive - Monster can attack first (doesn't mean it will, decided in 'AI')
+Detect cast - Monster will detect if someone is casting on it, and attack back
+Assist - Monster will help other monsters (what monsters it will assist is decided in 'AI')
+Looter - Monster will loot items (if 'Agressive' flag is set, it will attack before looting)
+No Target Change - Monster will not start attacking another target until the first target is dead or out of range
+Passive - Monster will not attack back (ever, unless 'Agressive' flag is also set?)
+Detects Hidden - Monster can see hidden players
+
+'ai'
+NoAI - Doesn't do anything (plants)
+NoSnipe - Monster will run away if being 'sniped' from a clif by archer, mage, etc.
+AttackFlee - Monster will attack, then flee, attack, then flee, etc (Archer Skels, run away, shoot arrow, etc)
+AttackRange1 - Will only attack if player is in a set range [0-3] (It's like the player is close, its a threat now)
+AttackRange2 - Will only attack if player is in a set range [4-6]
+ClassFlee1 - Will run from any player with range (archers, mages, thiefs with bows)
+NoviceNoFlee - Will not run if a player is a novice
+LevelFlee - Wlll run if player is of a higher level (porings would run from level 99s, AHH DONT KILL ME!)
+AvoidPlayer - Will run if it sees any player (So it cancels 'Agressive' flag)
+AttackMostDamage - Will attack the player doing the overall most damage
+AttackLessDamage - Will attack the player doing the overall least damage
+AttackLowestLevel - Will attack the lowest level first
+AttackHighestLevel - Will attack the highest level first
+WarpLowHP - Will warp if HP is low (how low is low?)
+NeverStop - Monster will always be on the move, never stop walking. (Is over-ridden by 'Immobile' flag)
+
+
+//
+// Again, more stuff...
+//
+// The monster spawns sripts need some more params. some examples...
+//
+// We have: map,x,y,offsetx,offsety, ...
+// What if we added more? To only let the monster move so far off from
+// where it was spawned. It could 'guard' an arena, an exit/enterance
+// an npc, whatever =).
+//
+// .... ID,time,time,blah...,mode,WAP
+// Have monsters walk a certin path. Waypoint files are your friend.
+// If a monster has a WAP (optional) it will walk this path.
+// Guardians on patrol? Could be interesting.
+//
+// Add more if you think of any =)
+//
+// If you don't like an idea, comment why, dont remove it.
+// example: (using this one cuz not sure about it)
+//
+// // NeverStop - Will/Could cause lag, don't think its a good idea -name
+// NeverStop - ...
+//
+
+Lupus: (guys, rearrange my ideas or move them as u want)
+Some memory - speed optimizations:
+
+There'a big "for cycle" when u look up for a place to mob spawn.
+It could be made quite fast:
+On server .GAT loading you should make an array with OFFSETS (not even X,Y) of right
+places for future mob spawns.
+If the waypoints aren't found for the loadied map then you should make at least 1-2 waypoints automatically.
+
+About AI:
+EACH map has defined mobs. Your mob should have a flag "healer", "supporter" etc. "weak", "ranged attacker"
+and each map should contain an attached list of mobs with their types
+when one MVP is hurt it'd look for "helpers", "healers".
+And if a mob is almost 0 HP it should look for helpers or look for other mobs ranged attackers
+defence. Etc.
+
+Mobs AI should be WRITTEN IN SPECIAL SCRIPTS.
+Some default mobs will use the same script.
+And some advanced ones will use their own.
+
+MOB-scripts are quite interesting. (remember Robot-Wars game?)
+
+Gulid Wars:
+I think guardians should be able to warp from room to room using WARPS like common Players.
+
+
+Aria's Ideas: (do whatever u want)
+
+We can make aggressive monsters make ambushes, where one attacks and runs away to a huge group of the same monster
+
+instead of dropping 2 x1 items, just drop 1 x2 item
+
+make AI vary inside of a group of monsters (IE 1/2 porings do 1 thing, and the other half do another)
+
+aggressive monsters sould surround enemies, not just blindly attack them
+
+we should also make monsters look as player-like as possible. There should be groups traveling together, or 2 monsters
+next to eachother, chatting.
+
+we shouldn't let mobs spawn right infront of people, like in anime or manga. they always walk towards you, or you walk
+towards them.
+
+let mob stats vary a little bit - every mob shouldn't be the exact same. if it's stronger it gives more exp, and vice
+versa.
+
have a monster be able to use its drops, and not drop it. like a poring using an apple. \ No newline at end of file
diff --git a/Dev/bugs.txt b/Dev/bugs.txt
index 26bdb99bb..2feedce73 100644
--- a/Dev/bugs.txt
+++ b/Dev/bugs.txt
@@ -1,72 +1,72 @@
-Problem: Adding the new guild skills causes it to crash?
-Assigned: N/A
-Progess: 0%
-
-Problem: 2-2-1 classes are regarded as Novicies by the game server. NPCs aren't taking them as thier jobs but if you the the NPC to do something for a novice class it works with the 2-2-1 like renters. Also if some one becomes high novice, if they use jobra they can become first jobs like a swordsman.
-Assigned: N/A
-Progess: 0%
-
-Problem: Stats nor skills don't downgrade when your level gets reverted due to exp loss.
-Assigned: N/A
-Progess: 0%
-
-Problem: You can hit yourself with your own spider web.
-Assigned: N/A
-Progess: 0%
-
-Problem: Pre skill requirements for new skills are wrong it makes you use 49 skills points before you can get the newer skills.
-Assigned: N/A
-Progess: 0%
-
-Problem: Monster hp view only shows but does not go down with a hit.
-Assigned: N/A
-Progess: 0%
-
-Problem: Monsters always freeze, when hit they don't move but 2 mins later they move.
-Assigned: N/A
-Progess: 0%
-
-Problem: Mobs don't attack
-Assigned: N/A
-Progess: 0%
-
-Problem: When u spawn ~300 mobs (and more or less) then do @killmonster then some mobs freeze on the screen (have no names, don't move, etc)
-Assigned: N/A
-Progess: 0%
-
-Problem: With 1025 client, some NPC sprites look different (i.e. Black Jack's NPC sprite)
-Assigned: N/A
-Progess: 0%
-
-Problem: Thiefs can steal ZENY / items from TREASURE chests!!baaaah!! and Guardians!
-Assigned: N/A
-Progess: 0%
-
-Problem: Joker card 4139 lets anyone to steal money / zeny. Just like he's a thief. It shoul;d be revised - success rates lowered and "steal item" disabled
-Assigned: N/A
-Progess: 0%
-
-Problem: When servers restart sometime the gm lvls in sql get reset back to 0
-Assigned: Wizputer
-Progess: 0%
-
-Problem: [mob attacks againsts players wearing ghostring armor do full damage mob_ghostring_fix: yes] Does not work, does nothing.
-Assigned: N/A
-Progess: 0%
-
-Problem: If two clients using the same account the server will crash and it allows people to dupe using the trade bug, one person trades over and item relogs it saves and the other person doesn't, they crash server both of them end up with the item.
-Assigned: N/A
-Progess: 0%
-
-Problem: When athena is run in linux it creates core files which takes 300 megs.
-Assigned: N/A
-Progess: 0%
-
-Problem: The skill tree's max skill lvl is not read/used.
-Assigned: N/A
-Progess: 0%
-
-Problem: Cannot connect to map server when logging in in both txt and sql on svn.
-Assigned: N/A
-Progess: 0%
-
+Problem: Adding the new guild skills causes it to crash?
+Assigned: N/A
+Progess: 0%
+
+Problem: 2-2-1 classes are regarded as Novicies by the game server. NPCs aren't taking them as thier jobs but if you the the NPC to do something for a novice class it works with the 2-2-1 like renters. Also if some one becomes high novice, if they use jobra they can become first jobs like a swordsman.
+Assigned: N/A
+Progess: 0%
+
+Problem: Stats nor skills don't downgrade when your level gets reverted due to exp loss.
+Assigned: N/A
+Progess: 0%
+
+Problem: You can hit yourself with your own spider web.
+Assigned: N/A
+Progess: 0%
+
+Problem: Pre skill requirements for new skills are wrong it makes you use 49 skills points before you can get the newer skills.
+Assigned: N/A
+Progess: 0%
+
+Problem: Monster hp view only shows but does not go down with a hit.
+Assigned: N/A
+Progess: 0%
+
+Problem: Monsters always freeze, when hit they don't move but 2 mins later they move.
+Assigned: N/A
+Progess: 0%
+
+Problem: Mobs don't attack
+Assigned: N/A
+Progess: 0%
+
+Problem: When u spawn ~300 mobs (and more or less) then do @killmonster then some mobs freeze on the screen (have no names, don't move, etc)
+Assigned: N/A
+Progess: 0%
+
+Problem: With 1025 client, some NPC sprites look different (i.e. Black Jack's NPC sprite)
+Assigned: N/A
+Progess: 0%
+
+Problem: Thiefs can steal ZENY / items from TREASURE chests!!baaaah!! and Guardians!
+Assigned: N/A
+Progess: 0%
+
+Problem: Joker card 4139 lets anyone to steal money / zeny. Just like he's a thief. It shoul;d be revised - success rates lowered and "steal item" disabled
+Assigned: N/A
+Progess: 0%
+
+Problem: When servers restart sometime the gm lvls in sql get reset back to 0
+Assigned: Wizputer
+Progess: 0%
+
+Problem: [mob attacks againsts players wearing ghostring armor do full damage mob_ghostring_fix: yes] Does not work, does nothing.
+Assigned: N/A
+Progess: 0%
+
+Problem: If two clients using the same account the server will crash and it allows people to dupe using the trade bug, one person trades over and item relogs it saves and the other person doesn't, they crash server both of them end up with the item.
+Assigned: N/A
+Progess: 0%
+
+Problem: When athena is run in linux it creates core files which takes 300 megs.
+Assigned: N/A
+Progess: 0%
+
+Problem: The skill tree's max skill lvl is not read/used.
+Assigned: N/A
+Progess: 0%
+
+Problem: Cannot connect to map server when logging in in both txt and sql on svn.
+Assigned: N/A
+Progess: 0%
+
diff --git a/Dev/forSQLdev.txt b/Dev/forSQLdev.txt
index c54c531a6..9f0f1a59a 100644
--- a/Dev/forSQLdev.txt
+++ b/Dev/forSQLdev.txt
@@ -1,146 +1,146 @@
-// $Id: forSQLdev.txt,v 1.1 2004/09/19 09:18:32 Akaru Exp $
-
-This file is to informe SQL dev about all modifications on TXT version.
-
-When a modification is done, TXT dev try to add it here with some explanations.
-When a modification is added in SQL version, SQL dev remove it from this file.
-
-
-********* 9th september
-------------------------------------
-changed:
- sd->newauth (map.h/clif.c) by sd->packet_ver (look all function where was newauth)
- value become // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
- instead of // 0: old 0x72 (19 b), 3: new 0x72 7july04 (22 b), 20: new 0x72 13july04 (39 b), 0: old 0x7E (6 b - not for auth), 27: new 0x7E 26july04 (33 b), 31: new 0x7E 30aug04 (37 b) (by [Yor])
- note: local variable 'newauth' not changed in clif_parse_WantToConnection
-
-------------------------------------
-Added
- if (sd->packet_ver == 8) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
- clif_displaymessage(sd->fd, "This client version (of 26 jul 2004) is not actually supported by this server.");
- } else if (sd->packet_ver == 9) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
- clif_displaymessage(sd->fd, "This client version (of 30 august 2004) is not actually supported by this server.");
- }
-at end of 'pc_authok' function (pc.c)
-
-------------------------------------
-Changed
- in 'atcommand_effect' function, set the correct message in back of:
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
-
-------------------------------------
-Changed
- in 'atcommand_servertime' function, replace permanent message by msg_table and put them in msg_athena.conf
-
-------------------------------------
-Changed to reduce (a little) lag
- in char.c, commented printf about auth:
- case 0x2afc:
- if (RFIFOREST(fd) < 22)
- return 0;
- //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- -
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- -
- case 0x2b05:
- if (RFIFOREST(fd) < 49)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- WFIFOW(fd,0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
- //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- -
- in case 0x66: // ƒLƒƒƒ‰‘I‘ð
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2);
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- -
- commented printf about searching map server (in 'search_mapserver' function)
-
-------------------------------------
-Improved At_command about monsters spawn (atcommand_spawn and atcommand_monster):
- modified message 39:
- //39: All monster summoned!
- Added message 240:
- //240: %d monster(s) summoned!
- Added variables (output, j and k):
- char output[200];
- int i, j, k;
- memset(output, '\0', sizeof(output));
- Changed loop to check at least 8 times (to try to spawn in closed area):
- count = 0;
- for (i = 0; i < number; i++) {
- j = 0;
- k = 0;
- while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
- if (x <= 0)
- mx = sd->bl.x + (rand() % 11 - 5);
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % 11 - 5);
- else
- my = y;
- k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
- }
- count += (k != 0) ? 1 : 0;
- }
- Changed last message display (to add number != count):
- if (count != 0)
- if (number == count)
- clif_displaymessage(fd, msg_table[39]); // All monster summoned!
- else {
- sprintf(output, msg_table[240], count); // %d monster(s) summoned!
- clif_displaymessage(fd, output);
- }
- else {
-
-********* 10th september
-------------------------------------
-Correction of an error in char.c in 'char_config_read' function:
- replace 'wisp_server_name' by 'w2' in the test of the lenght:
- } 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';
- }
-
-------------------------------------
-Added a better id control of monster id in @spawn/@monster... GM commands:
- added in mob.h:
- int mobdb_checkid(const int id);
- Added in mob.c:
- /*==========================================
- * Id Mob is checked.
- *------------------------------------------
- */
- int mobdb_checkid(const int id) {
- if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0')
- return 0;
-
- return id;
- }
- Changed in at_command.c ('atcommand_monster' and 'atcommand_spawn' functions) (only second line is modified):
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(monster);
- by:
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(monster));
-
-********* 11th september
-------------------------------------
-Changed @effect from level 60 to level 40.
-
-------------------------------------
-Added 3 new commands: @charitemlist, @charstoragelist, @charcarlist
- modified file: atcommand.c/h, atcommand_athena.conf, all help.txt, and gmcommands.html
+// $Id: forSQLdev.txt,v 1.1 2004/09/19 09:18:32 Akaru Exp $
+
+This file is to informe SQL dev about all modifications on TXT version.
+
+When a modification is done, TXT dev try to add it here with some explanations.
+When a modification is added in SQL version, SQL dev remove it from this file.
+
+
+********* 9th september
+------------------------------------
+changed:
+ sd->newauth (map.h/clif.c) by sd->packet_ver (look all function where was newauth)
+ value become // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
+ instead of // 0: old 0x72 (19 b), 3: new 0x72 7july04 (22 b), 20: new 0x72 13july04 (39 b), 0: old 0x7E (6 b - not for auth), 27: new 0x7E 26july04 (33 b), 31: new 0x7E 30aug04 (37 b) (by [Yor])
+ note: local variable 'newauth' not changed in clif_parse_WantToConnection
+
+------------------------------------
+Added
+ if (sd->packet_ver == 8) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
+ clif_displaymessage(sd->fd, "This client version (of 26 jul 2004) is not actually supported by this server.");
+ } else if (sd->packet_ver == 9) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 30aug04 (by [Yor])
+ clif_displaymessage(sd->fd, "This client version (of 30 august 2004) is not actually supported by this server.");
+ }
+at end of 'pc_authok' function (pc.c)
+
+------------------------------------
+Changed
+ in 'atcommand_effect' function, set the correct message in back of:
+ clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
+
+------------------------------------
+Changed
+ in 'atcommand_servertime' function, replace permanent message by msg_table and put them in msg_athena.conf
+
+------------------------------------
+Changed to reduce (a little) lag
+ in char.c, commented printf about auth:
+ case 0x2afc:
+ if (RFIFOREST(fd) < 22)
+ return 0;
+ //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ -
+ case 0x2b02:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
+ -
+ case 0x2b05:
+ if (RFIFOREST(fd) < 49)
+ return 0;
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ WFIFOW(fd,0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
+ //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
+ -
+ in case 0x66: // ƒLƒƒƒ‰‘I‘ð
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2);
+ auth_fifo[auth_fifo_pos].account_id = sd->account_id;
+ -
+ commented printf about searching map server (in 'search_mapserver' function)
+
+------------------------------------
+Improved At_command about monsters spawn (atcommand_spawn and atcommand_monster):
+ modified message 39:
+ //39: All monster summoned!
+ Added message 240:
+ //240: %d monster(s) summoned!
+ Added variables (output, j and k):
+ char output[200];
+ int i, j, k;
+ memset(output, '\0', sizeof(output));
+ Changed loop to check at least 8 times (to try to spawn in closed area):
+ count = 0;
+ for (i = 0; i < number; i++) {
+ j = 0;
+ k = 0;
+ while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
+ if (x <= 0)
+ mx = sd->bl.x + (rand() % 11 - 5);
+ else
+ mx = x;
+ if (y <= 0)
+ my = sd->bl.y + (rand() % 11 - 5);
+ else
+ my = y;
+ k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
+ }
+ count += (k != 0) ? 1 : 0;
+ }
+ Changed last message display (to add number != count):
+ if (count != 0)
+ if (number == count)
+ clif_displaymessage(fd, msg_table[39]); // All monster summoned!
+ else {
+ sprintf(output, msg_table[240], count); // %d monster(s) summoned!
+ clif_displaymessage(fd, output);
+ }
+ else {
+
+********* 10th september
+------------------------------------
+Correction of an error in char.c in 'char_config_read' function:
+ replace 'wisp_server_name' by 'w2' in the test of the lenght:
+ } 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';
+ }
+
+------------------------------------
+Added a better id control of monster id in @spawn/@monster... GM commands:
+ added in mob.h:
+ int mobdb_checkid(const int id);
+ Added in mob.c:
+ /*==========================================
+ * Id Mob is checked.
+ *------------------------------------------
+ */
+ int mobdb_checkid(const int id) {
+ if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0')
+ return 0;
+
+ return id;
+ }
+ Changed in at_command.c ('atcommand_monster' and 'atcommand_spawn' functions) (only second line is modified):
+ if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = atoi(monster);
+ by:
+ if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = mobdb_checkid(atoi(monster));
+
+********* 11th september
+------------------------------------
+Changed @effect from level 60 to level 40.
+
+------------------------------------
+Added 3 new commands: @charitemlist, @charstoragelist, @charcarlist
+ modified file: atcommand.c/h, atcommand_athena.conf, all help.txt, and gmcommands.html
diff --git a/Dev/quotes.txt b/Dev/quotes.txt
index 463e7df9c..a82eaae68 100644
--- a/Dev/quotes.txt
+++ b/Dev/quotes.txt
@@ -1,148 +1,148 @@
-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: MC Cameri, Aria, david, mouse
-
-
-Also put some coords so that u walk around
-//************************************\\
-
-davidsiaw
-- put me in payon next to kawaii no kafra with npc sprite no. 1002
-- [davidsiaw]
-- Wud are you looking at?
-- baka...
-- next;
-- [davidsiaw]
-- *drops 100 Mjolnirs on the floor
-- There ya go ;)
-
-Aria
-prontera.gat,156,179,4 script Aria 805,{
-151,175-OMGWTFBBQ
-152,182-So its u -> 0
-... That did not look right
-158,177-OMGITSJEEBUS!#!@%!
-164,176-Evera died. I guess.
-147,176-I CLICK THE BUTTON AND THEY DON'T DIE!
-155,172-RO? wtf?
-Oh yeah.
-165,171-omgnoob. DIE!
-157,176-WooT!
-[@Aria] is that why u bought windows
-[@Aria] cuz bill has red hair
-bio
-Okay, I'm Evera's brother, Aria <- small sentence self-intro
-^FF00FFAge^000000: 13 years <-age
-^FF00FFWhat I do^000000: Graphics and NPCs <-wtf u do
-^FF00FFWhy I'm here^000000: Cuz eAthena ROX <-y
-
-Anyway, here. I get to talk about myself now <-ur own bio
-I'm from California, and I wub MMORPGS
-So yeah that's it. GO EA!
-
-Shinigami
--imma n00b
--lol
--:P
--Shinigami stabs Azndragon
--there you go bitches
--watashi wa Shinigami desu
--huh?, wtf?
-
-Lord
--Me + ebil = bad me + ebil + power = omg ....
-<@Wishy> me + you = you get owns
-<@Lord> Me + Revenge = You Got owned
-<@Wishy> Me > You
-<@Lord> No i own you in bed :3
-<@Wishy> ...
-
-Codemaster
-"Everything begins with Nu and everything ends with Nu.
-This is the truth! This is my belief... at least for now."
- - Mysteries of Life Volume 184. Chapter 26.
-
-MouseJstr
-
-"The only difference between a hurricane and skydiving is
-which direction the tree's come at you from.."
-
-"Wanna be a GM? Write me a C routine that reverses a string
- in place.."
-
-"Wanna be a GM? Write me a C routine that finds me the highest
- bit set in a network order 32 bit integer..."
-
-"I am the dark angel of eAthena.. withen weeks of my arrival,
- almost everybody was gone or dead.. fear me..."
-
-Lupus, I demand you rewrite yours..
-
-MC Cameri
-morroc.gat,160,97,4 script MC Cameri 706,{
--I'm the @command guy from oa...
--Can't tell you my name.
--16 years
--Dominican Republic, in the caribbean.
--Mostly work on @commands for GMs...
--Because I like programming...
--I'm a senior student, programmer, body builder(yes, I lift weights), etc.
-160,95-I owns you all, under my commands. *lol*
-162,95-I forgot what my script, what do I have to say again? *_*U
-164,95-¿Donde estoy? *wonders* (<-- Means, where am I?)
-164,97-Are you guys my friends?
-164,99-My mom told me not to talk to strangers. *stares*
-162,99-How can you be SO ugly!?
-160,99-I need a friend to play with =(. *sobs*
-160,97-I've been kicking this rock for as long as I can remember.
-160,95-My computer just broke, and I don't know how to format. *sobs*
-
-Darkchild
-
-// Place me Next to Valaris (ELSE I DO IT MYSELF :P)
-- I think Aria Has A Lot To Do
-- The Darkness Within
-- Watch Out For Trucks, They Tend To Drive You Down
-- Who Am I? Really? Shure!
-- GAH!
-- Everyone Lubs Me! (I Hope!)
-- I Lub Everyone!
- As Long As They Are Female
- Hot....
- Goodlooking
- Big Boobs
- Nice Ass
- And Workship Me!
-- Wannabe GM? Host Your Own Server
-- kRO is €20 A Month! Sick Bastards!
-
-Biography:
- mes "Okay, So I'm Darkchild.......";
- mes "^FF00FFAge^000000: 17 years";
- mes "^FF00FFWhat I do^000000: Writing Biography";
- mes "^FF00FFWhy I'm here^000000: I Have NO Idea";
- next;
- mes "Ehm Well..... Whats There To Say About Me.......?";
- mes "I Dunno.... As Long As You Love Me.........";
- mes "Well Okay, A Lil Bit Then:";
- mes "I'm From The Netherlands And Doing Some Wacko Collega Atm";
- mes "More? WTF? YOU WANT MORE? GO BLOW URSELF!";
- next;
-// let it do an npc event on Valaris
-
-// His Npc Event:
- npctalk "DARKCHILD, DON'T YOU SHOUT AT POOR LIL N00BIEZ!!!";
-
-// Back 2 Me :P
- npctalk "Sorry Valaris";
- npctalk "(He Is Da Man!)";
+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: MC Cameri, Aria, david, mouse
+
+
+Also put some coords so that u walk around
+//************************************\\
+
+davidsiaw
+- put me in payon next to kawaii no kafra with npc sprite no. 1002
+- [davidsiaw]
+- Wud are you looking at?
+- baka...
+- next;
+- [davidsiaw]
+- *drops 100 Mjolnirs on the floor
+- There ya go ;)
+
+Aria
+prontera.gat,156,179,4 script Aria 805,{
+151,175-OMGWTFBBQ
+152,182-So its u -> 0
+... That did not look right
+158,177-OMGITSJEEBUS!#!@%!
+164,176-Evera died. I guess.
+147,176-I CLICK THE BUTTON AND THEY DON'T DIE!
+155,172-RO? wtf?
+Oh yeah.
+165,171-omgnoob. DIE!
+157,176-WooT!
+[@Aria] is that why u bought windows
+[@Aria] cuz bill has red hair
+bio
+Okay, I'm Evera's brother, Aria <- small sentence self-intro
+^FF00FFAge^000000: 13 years <-age
+^FF00FFWhat I do^000000: Graphics and NPCs <-wtf u do
+^FF00FFWhy I'm here^000000: Cuz eAthena ROX <-y
+
+Anyway, here. I get to talk about myself now <-ur own bio
+I'm from California, and I wub MMORPGS
+So yeah that's it. GO EA!
+
+Shinigami
+-imma n00b
+-lol
+-:P
+-Shinigami stabs Azndragon
+-there you go bitches
+-watashi wa Shinigami desu
+-huh?, wtf?
+
+Lord
+-Me + ebil = bad me + ebil + power = omg ....
+<@Wishy> me + you = you get owns
+<@Lord> Me + Revenge = You Got owned
+<@Wishy> Me > You
+<@Lord> No i own you in bed :3
+<@Wishy> ...
+
+Codemaster
+"Everything begins with Nu and everything ends with Nu.
+This is the truth! This is my belief... at least for now."
+ - Mysteries of Life Volume 184. Chapter 26.
+
+MouseJstr
+
+"The only difference between a hurricane and skydiving is
+which direction the tree's come at you from.."
+
+"Wanna be a GM? Write me a C routine that reverses a string
+ in place.."
+
+"Wanna be a GM? Write me a C routine that finds me the highest
+ bit set in a network order 32 bit integer..."
+
+"I am the dark angel of eAthena.. withen weeks of my arrival,
+ almost everybody was gone or dead.. fear me..."
+
+Lupus, I demand you rewrite yours..
+
+MC Cameri
+morroc.gat,160,97,4 script MC Cameri 706,{
+-I'm the @command guy from oa...
+-Can't tell you my name.
+-16 years
+-Dominican Republic, in the caribbean.
+-Mostly work on @commands for GMs...
+-Because I like programming...
+-I'm a senior student, programmer, body builder(yes, I lift weights), etc.
+160,95-I owns you all, under my commands. *lol*
+162,95-I forgot what my script, what do I have to say again? *_*U
+164,95-¿Donde estoy? *wonders* (<-- Means, where am I?)
+164,97-Are you guys my friends?
+164,99-My mom told me not to talk to strangers. *stares*
+162,99-How can you be SO ugly!?
+160,99-I need a friend to play with =(. *sobs*
+160,97-I've been kicking this rock for as long as I can remember.
+160,95-My computer just broke, and I don't know how to format. *sobs*
+
+Darkchild
+
+// Place me Next to Valaris (ELSE I DO IT MYSELF :P)
+- I think Aria Has A Lot To Do
+- The Darkness Within
+- Watch Out For Trucks, They Tend To Drive You Down
+- Who Am I? Really? Shure!
+- GAH!
+- Everyone Lubs Me! (I Hope!)
+- I Lub Everyone!
+ As Long As They Are Female
+ Hot....
+ Goodlooking
+ Big Boobs
+ Nice Ass
+ And Workship Me!
+- Wannabe GM? Host Your Own Server
+- kRO is €20 A Month! Sick Bastards!
+
+Biography:
+ mes "Okay, So I'm Darkchild.......";
+ mes "^FF00FFAge^000000: 17 years";
+ mes "^FF00FFWhat I do^000000: Writing Biography";
+ mes "^FF00FFWhy I'm here^000000: I Have NO Idea";
+ next;
+ mes "Ehm Well..... Whats There To Say About Me.......?";
+ mes "I Dunno.... As Long As You Love Me.........";
+ mes "Well Okay, A Lil Bit Then:";
+ mes "I'm From The Netherlands And Doing Some Wacko Collega Atm";
+ mes "More? WTF? YOU WANT MORE? GO BLOW URSELF!";
+ next;
+// let it do an npc event on Valaris
+
+// His Npc Event:
+ npctalk "DARKCHILD, DON'T YOU SHOUT AT POOR LIL N00BIEZ!!!";
+
+// Back 2 Me :P
+ npctalk "Sorry Valaris";
+ npctalk "(He Is Da Man!)";
diff --git a/Dev/resnametable.TXT b/Dev/resnametable.TXT
index 411bf6cd0..6c62e2a1b 100644
--- a/Dev/resnametable.TXT
+++ b/Dev/resnametable.TXT
@@ -1,64 +1,64 @@
-Resnametable reading problem, testcases and description
-by Akaru
-------------------------------------------------------------------
-EDITED Resnametable, add at the end:
-aaa.gnd#valkyrie.gnd#
-aaa.gat#valkyrie.gat#
-aaa.rsw#valkyrie.rsw#
-À¯ÀúÀÎÅÍÆäÀ̽º\map\aaa.bmp#À¯ÀúÀÎÅÍÆäÀ̽º\map\valkyrie.bmp#
-
-At map_athena.conf, add:
-map: aaa.gat
-
-Case 1:
-In data.grf there's the base resnametable without reference of aaa.gat
-In sdata.grf there's no resnametable
-In data folder there's an edited resnametable with aaa.gat reference
-Results: Athena gives aaa.gat not found error
-What this proves: Athena doesn't even use the values in the datafolder resnametable
-
-Case 2:
-In data.grf there's the base resnametable without reference of aaa.gat
-In sdata.grf there's the edited resnametable aaa.gat reference
-In data folder there's an edited resnametable with aaa.gat reference
-Results: Athena loads aaa.gat
-What this proves: Athena only checks for the existance of the datafolder resnametable, but uses value from sdata.grf resnametable
-
-Case 3:
-In data.grf there's the base resnametable without reference of aaa.gat
-In sdata.grf there's the edited resnametable aaa.gat reference
-In data folder there's no resnametable
-BEFORE MY CHANGE: Athena exits, "data/resnametable.txt not found"
-AFTER MY CHANGE: Athena loads aaa.gat
-What this proves: Athena do not need the datafolder resnametable at all and it still runs from the resnametable in the GRFs
-
-Case 4:
-In data.grf there's no resnametable
-In sdata.grf there's no resnametable
-In data folder there's no resnametable
-BEFORE MY CHANGE: Athena exits, "data/resnametable.txt not found"
-AFTER MY CHANGE: Athena exits, "data/resnametable.txt not found"
-
-How it is now:
-- It searches for the datafolder resnametable:
- - If it exist, it continues but only use the resnametable from the GRF
- - If it does not exist,
- - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
- - If resnametable is found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
-
-What is should do:
-- Check if data_folder in grf-files is enabled:
- - If it is, search for the datafolder resnametable:
- - If it exist:
- - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it continues and uses this resnametable
- - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and overwrites the GRF resnametable with this one from the datafolder
- - If it does not exist:
- - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
- - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and use the GRF resnametable
- - If it isn't, then:
- - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
- - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and use the GRF resnametable
-
-------------------------------------------------------------------
-Fixes, comments, discussions, etc goes below here:
+Resnametable reading problem, testcases and description
+by Akaru
+------------------------------------------------------------------
+EDITED Resnametable, add at the end:
+aaa.gnd#valkyrie.gnd#
+aaa.gat#valkyrie.gat#
+aaa.rsw#valkyrie.rsw#
+À¯ÀúÀÎÅÍÆäÀ̽º\map\aaa.bmp#À¯ÀúÀÎÅÍÆäÀ̽º\map\valkyrie.bmp#
+
+At map_athena.conf, add:
+map: aaa.gat
+
+Case 1:
+In data.grf there's the base resnametable without reference of aaa.gat
+In sdata.grf there's no resnametable
+In data folder there's an edited resnametable with aaa.gat reference
+Results: Athena gives aaa.gat not found error
+What this proves: Athena doesn't even use the values in the datafolder resnametable
+
+Case 2:
+In data.grf there's the base resnametable without reference of aaa.gat
+In sdata.grf there's the edited resnametable aaa.gat reference
+In data folder there's an edited resnametable with aaa.gat reference
+Results: Athena loads aaa.gat
+What this proves: Athena only checks for the existance of the datafolder resnametable, but uses value from sdata.grf resnametable
+
+Case 3:
+In data.grf there's the base resnametable without reference of aaa.gat
+In sdata.grf there's the edited resnametable aaa.gat reference
+In data folder there's no resnametable
+BEFORE MY CHANGE: Athena exits, "data/resnametable.txt not found"
+AFTER MY CHANGE: Athena loads aaa.gat
+What this proves: Athena do not need the datafolder resnametable at all and it still runs from the resnametable in the GRFs
+
+Case 4:
+In data.grf there's no resnametable
+In sdata.grf there's no resnametable
+In data folder there's no resnametable
+BEFORE MY CHANGE: Athena exits, "data/resnametable.txt not found"
+AFTER MY CHANGE: Athena exits, "data/resnametable.txt not found"
+
+How it is now:
+- It searches for the datafolder resnametable:
+ - If it exist, it continues but only use the resnametable from the GRF
+ - If it does not exist,
+ - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
+ - If resnametable is found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
+
+What is should do:
+- Check if data_folder in grf-files is enabled:
+ - If it is, search for the datafolder resnametable:
+ - If it exist:
+ - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it continues and uses this resnametable
+ - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and overwrites the GRF resnametable with this one from the datafolder
+ - If it does not exist:
+ - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
+ - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and use the GRF resnametable
+ - If it isn't, then:
+ - If resnametable isn't found in data.grf/sdata.grf/adata.grf, it errors "resnametable not found" and exits
+ - If resnametable is found in data.grf/sdata.grf/adata.grf, it continues and use the GRF resnametable
+
+------------------------------------------------------------------
+Fixes, comments, discussions, etc goes below here:
------------------------------------------------------------------ \ No newline at end of file
diff --git a/INSTALL b/INSTALL
index ab8609bf3..c98db12b4 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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/LICENCE b/LICENCE
index 45645b4b5..5b6e7c66c 100644
--- a/LICENCE
+++ b/LICENCE
@@ -1,340 +1,340 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/LICENCE_JA b/LICENCE_JA
index 0888c67e2..d6306074a 100644
--- a/LICENCE_JA
+++ b/LICENCE_JA
@@ -1,416 +1,416 @@
- GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
- ƒo[ƒWƒ‡ƒ“2A1991”N6ŒŽ
- “ú–{Œê–óA2002”N5ŒŽ20“ú
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- ‚±‚Ì—˜—p‹–‘øŒ_–ñ‘‚ðAˆêŽšˆê‹å‚»‚Ì‚Ü‚Ü‚É•¡»‚µ”Еz‚·‚邱‚Æ‚Í‹–‰Â‚·‚éB
- ‚µ‚©‚µ•ÏX‚Í”F‚ß‚È‚¢B
-
- This is an unofficial translation of the GNU General Public License
- into Japanese. It was not published by the Free Software Foundation,
- and does not legally state the distribution terms for software that
- uses the GNU GPL--only the original English text of the GNU GPL does
- that. However, we hope that this translation will help Japanese
- speakers understand the GNU GPL better.
-
- (–ó: ˆÈ‰º‚ÍGNU General Public License‚Ì”ñŒöŽ®‚È“ú–{Œê–ó‚Å‚·B‚±‚ê‚̓t
- ƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c(the Free Software Foundataion)‚É‚æ‚Á‚Ä”­•\‚³‚ꂽ
- ‚à‚Ì‚Å‚Í‚È‚­AGNU GPL‚ð“K—p‚µ‚½ƒ\ƒtƒgƒEƒFƒA‚̔ЕzðŒ‚ð–@“I‚É—LŒø‚ÈŒ`
- ‚Åq‚ׂ½‚à‚Ì‚Å‚Í‚ ‚è‚Ü‚¹‚ñB”ЕzðŒ‚Æ‚µ‚Ä‚ÍGNU GPL‚̉pŒê”ŃeƒLƒXƒg‚Å
- Žw’肳‚ê‚Ä‚¢‚é‚à‚Ì‚Ì‚Ý‚ª—LŒø‚Å‚·B‚µ‚©‚µ‚È‚ª‚çAŽ„‚½‚¿‚Í‚±‚Ì–|–ó‚ªA
- “ú–{Œê‚ðŽg—p‚·‚élX‚É‚Æ‚Á‚ÄGNU GPL‚ð‚æ‚è—Ç‚­—‰ð‚·‚é•‚¯‚ƂȂ邱‚Æ‚ð
- –]‚ñ‚Å‚¢‚Ü‚·B)
-
- –|–ó‚Í ”ª“c^s<mhatta@gnu.org>‚ªs‚Á‚½BŒ´•¶‚Í
- http://www.gnu.org/licenses/gpl.txt‚Å‚ ‚éBŒë–ó‚ÌŽw“E‚â‰ü‘PˆÄ‚ðŠ½Œ}‚·
- ‚éB
- ‚Í‚¶‚ß‚É
-
-ƒ\ƒtƒgƒEƒFƒAŒü‚¯ƒ‰ƒCƒZƒ“ƒX‚̑唼‚ÍA‚ ‚È‚½‚ª‚»‚̃\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½
-‚è•ÏX‚µ‚½‚è‚·‚鎩—R‚ð’D‚¤‚悤‚ÉÝŒv‚³‚ê‚Ä‚¢‚Ü‚·B‘ÎÆ“I‚ÉAGNU ˆê”ÊŒö
-O—˜—p‹–‘øŒ_–ñ‘‚ÍA‚ ‚È‚½‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½‚è•ÏX‚µ‚½‚è‚·
-‚鎩—R‚ð•ÛØ‚·‚é--‚·‚È‚í‚¿Aƒ\ƒtƒgƒEƒFƒA‚ª‚»‚̃†[ƒU‚·‚ׂĂɂƂÁ‚ătƒŠ[
-‚Å‚ ‚邱‚Æ‚ð•ÛØ‚·‚邱‚Æ‚ð–Ú“I‚Æ‚µ‚Ä‚¢‚Ü‚·B‚±‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
-‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚̃\ƒtƒgƒEƒFƒA‚Ì‚Ù‚Æ‚ñ‚Ç‚É“K—p‚³‚ê‚Ä‚¨‚èA‚Ü‚½
-GNU GPL‚ð“K—p‚·‚é‚ÆŒˆ‚ß‚½ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’cˆÈŠO‚ÌìŽÒ‚É‚æ‚éƒvƒƒO
-ƒ‰ƒ€‚É‚à“K—p‚³‚ê‚Ä‚¢‚Ü‚·(‚¢‚­‚‚©‚̃tƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚̃\ƒtƒgƒEƒF
-ƒA‚É‚ÍAGNU GPL‚Å‚Í‚È‚­GNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚ª“K—p‚³‚ê
-‚Ä‚¢‚邱‚Æ‚à‚ ‚è‚Ü‚·)B‚ ‚È‚½‚à‚Ü‚½A‚²Ž©•ª‚̃vƒƒOƒ‰ƒ€‚ÉGNU GPL‚ð“K—p
-‚·‚邱‚Æ‚ª‰Â”\‚Å‚·B
-
-Ž„‚½‚¿‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚ÆŒ¾‚¤‚Æ‚«A‚»‚ê‚Í—˜—p‚ÌŽ©—R‚ɂ‚¢‚ÄŒ¾‹y‚µ‚Ä
-‚¢‚é‚Ì‚Å‚ ‚Á‚ÄA‰¿Ši‚Í–â‘è‚É‚µ‚Ä‚¢‚Ü‚¹‚ñBŽ„‚½‚¿‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ
-‘‚ÍA‚ ‚È‚½‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚·‚鎩—R‚ð•ÛØ‚·‚é‚悤Ý
-Œv‚³‚ê‚Ä‚¢‚Ü‚·(Šó–]‚ɉž‚¶‚Ä‚»‚ÌŽí‚̃T[ƒrƒX‚ÉŽè”—¿‚ð‰Û‚·Ž©—R‚à•ÛØ‚³
-‚ê‚Ü‚·)B‚Ü‚½A‚ ‚È‚½‚ªƒ\[ƒXƒR[ƒh‚ðŽó‚¯Žæ‚é‚©A‚ ‚é‚¢‚Í–]‚߂΂»‚ê‚ð
-“üŽè‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚é‚Æ‚¢‚¤‚±‚ÆA‚ ‚È‚½‚ªƒ\ƒtƒgƒEƒFƒA‚ð•ÏX‚µA‚»‚Ì
-ˆê•”‚ðV‚½‚ȃtƒŠ[‚̃vƒƒOƒ‰ƒ€‚Å—˜—p‚Å‚«‚é‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚ÄAˆÈã‚Åq
-‚ׂ½‚悤‚È‚±‚Æ‚ª‚Å‚«‚é‚Æ‚¢‚¤‚±‚Æ‚ª‚ ‚È‚½‚É’m‚炳‚ê‚é‚Æ‚¢‚¤‚±‚Æ‚à•ÛØ‚³
-‚ê‚Ü‚·B
-
-‚ ‚È‚½‚ÌŒ —˜‚ðŽç‚邽‚ßAŽ„‚½‚¿‚Í’N‚©‚ª‚ ‚È‚½‚Ì—L‚·‚邱‚ê‚ç‚ÌŒ —˜‚ð”Û’è
-‚·‚邱‚Æ‚âA‚±‚ê‚ç‚ÌŒ —˜‚ð•úŠü‚·‚é‚悤—v‹‚·‚邱‚Æ‚ð‹ÖŽ~‚·‚é‚Æ‚¢‚¤§ŒÀ
-‚ð‰Á‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B‚æ‚Á‚ÄA‚ ‚È‚½‚ªƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚µ‚½
-‚è‚»‚ê‚ð•ÏX‚µ‚½‚è‚·‚éꇂɂÍA‚±‚ê‚ç‚̧ŒÀ‚Ì‚½‚ß‚É‚ ‚È‚½‚É‚ ‚éŽí‚ÌÓ
-”C‚ª”­¶‚·‚邱‚Æ‚É‚È‚è‚Ü‚·B
-
-—Ⴆ‚ÎA‚ ‚È‚½‚ªƒtƒŠ[‚ȃvƒƒOƒ‰ƒ€‚Ì•¡»•¨‚ð”Еz‚·‚éê‡A—L—¿‚©–³—¿‚É
-ŠÖ‚í‚炸A‚ ‚È‚½‚ÍŽ©•ª‚ª—L‚·‚錠—˜‚ð‘S‚ÄŽó—ÌŽÒ‚É—^‚¦‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
-‚Ü‚½A‚ ‚È‚½‚͔ނç‚àƒ\[ƒXƒR[ƒh‚ðŽó‚¯Žæ‚é‚©Žè‚É“ü‚ê‚邱‚Æ‚ª‚Å‚«‚é‚悤
-•ÛØ‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚»‚µ‚ÄA‚ ‚È‚½‚͔ނç‚ɑ΂µ‚Ĉȉº‚Åq‚ׂéðŒ
-‚ðŽ¦‚µA”Þ‚ç‚ÉŽ©‚ç‚ÌŽ‚ÂŒ —˜‚ɂ‚¢‚Ä’m‚炵‚ß‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹
-‚ñB
-
-Ž„‚½‚¿‚Í‚ ‚È‚½‚ÌŒ —˜‚ð“ñ’iŠK‚̎臂𓥂ñ‚ŕی삵‚Ü‚·B(1) ‚Ü‚¸ƒ\ƒtƒgƒEƒF
-ƒA‚ɑ΂µ‚Ä’˜ìŒ ‚ðŽå’£‚µA‚»‚µ‚Ä (2) ‚ ‚È‚½‚ɑ΂µ‚ÄAƒ\ƒtƒgƒEƒFƒA‚Ì•¡
-»‚â”Еz‚Ü‚½‚͉ü•Ï‚ɂ‚¢‚Ä‚Ì–@“I‚È‹–‰Â‚ð—^‚¦‚邱‚ÌŒ_–ñ‘‚ð’ñŽ¦‚µ‚Ü‚·B
-
-‚Ü‚½AŠeìŽÒ‚⎄‚½‚¿‚ð•ÛŒì‚·‚邽‚ßAŽ„‚½‚¿‚Í‚±‚̃tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚É‚Í
-‰½‚Ì•ÛØ‚à–³‚¢‚Æ‚¢‚¤‚±‚Æ‚ð’N‚à‚ªŠmŽÀ‚É—‰ð‚·‚é‚悤‚É‚µA‚Ü‚½ƒ\ƒtƒgƒEƒF
-ƒA‚ª’N‚©‘¼l‚É‚æ‚Á‚ĉü•Ï‚³‚êA‚»‚ꂪŽŸX‚ƔЕz‚³‚ê‚Ä‚¢‚Á‚½‚Æ‚µ‚Ä‚àA‚»
-‚ÌŽó—̎҂͔ނ炪Žè‚É“ü‚ꂽƒ\ƒtƒgƒEƒFƒA‚ªƒIƒŠƒWƒiƒ‹‚̃o[ƒWƒ‡ƒ“‚Å‚Í–³‚¢
-‚±‚ÆA‚»‚µ‚ÄŒ´ìŽÒ‚Ì–¼º‚Í‘¼l‚É‚æ‚Á‚ÄŽ‚¿ž‚܂ꂽ‰Â”\«‚Ì‚ ‚é–â‘è‚É‚æ‚Á
-‚ĉe‹¿‚³‚ê‚邱‚Æ‚ª‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚ðŽü’m‚³‚¹‚½‚¢‚ÆŽv‚¢‚Ü‚·B
-
-ÅŒã‚ÉAƒ\ƒtƒgƒEƒFƒA“Á‹–‚ª‚¢‚©‚È‚éƒtƒŠ[‚̃vƒƒOƒ‰ƒ€‚Ì‘¶Ý‚É‚à•s’f‚Ì‹º
-ˆÐ‚ð“Š‚°‚©‚¯‚Ä‚¢‚Ü‚·‚ªAŽ„‚½‚¿‚ÍAƒtƒŠ[‚ȃvƒƒOƒ‰ƒ€‚ÌĔЕzŽÒ‚ªŒÂX‚É
-“Á‹–ƒ‰ƒCƒZƒ“ƒX‚ðŽæ“¾‚·‚邱‚Æ‚É‚æ‚Á‚ÄAŽ–ŽÀãƒvƒƒOƒ‰ƒ€‚ð“Æè“I‚É‚µ‚Ä‚µ
-‚Ü‚¤‚Æ‚¢‚¤ŠëŒ¯‚ð”ð‚¯‚½‚¢‚ÆŽv‚¢‚Ü‚·B‚±‚¤‚¢‚Á‚½Ž–‘Ô‚ð—\–h‚·‚邽‚ßAŽ„‚½
-‚¿‚Í‚¢‚©‚È‚é“Á‹–‚à’N‚à‚ªŽ©—R‚É—˜—p‚Å‚«‚é‚悤ƒ‰ƒCƒZƒ“ƒX‚³‚ê‚é‚©A‘S‚­ƒ‰
-ƒCƒZƒ“ƒX‚³‚ê‚È‚¢‚©‚Ì‚Ç‚¿‚ç‚©‚Å‚È‚¯‚ê‚΂Ȃç‚È‚¢‚±‚Ƃ𖾊m‚É‚µ‚Ü‚µ‚½B
-
-(–ó’: –{Œ_–ñ‘‚Åu“Æè“I(proprietary)v‚Æ‚ÍAƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚âÄ”Ð
-•zA‰ü•Ï‚ª‹ÖŽ~‚³‚ê‚Ä‚¢‚é‚©A‹–‰Â‚𓾂邱‚Æ‚ª•K—v‚Æ‚³‚ê‚Ä‚¢‚é‚©A‚ ‚é‚¢
-‚ÍŒµ‚µ‚¢§ŒÀ‚ª‰Û‚¹‚ç‚ê‚Ä‚¢‚ÄŽ©—R‚É‚»‚¤‚·‚邱‚Æ‚ªŽ–ŽÀã‚Å‚«‚È‚­‚È‚Á‚Ä‚¢
-‚éó‘Ô‚Ì‚±‚Æ‚ðŽw‚·BÚ‚µ‚­‚Í
-http://www.gnu.org/philosophy/categories.ja.html#ProprietarySoftware‚ð
-ŽQÆ‚¹‚æB)
-
-•¡»‚â”ЕzA‰ü•Ï‚ɂ‚¢‚Ă̳Šm‚ÈðŒ‚Ƨ–ñ‚ðˆÈ‰º‚Åq‚ׂĂ¢‚«‚Ü‚·B
-
- GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
- •¡»A”ЕzA‰ü•Ï‚ÉŠÖ‚·‚éðŒ‚Ƨ–ñ
-
-0. ‚±‚Ì—˜—p‹–‘øŒ_–ñ‘‚ÍA‚»‚̃vƒƒOƒ‰ƒ€(‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’˜ì•¨)‚ð‚±‚Ìˆê
-”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Ì’è‚ß‚éðŒ‚̉º‚ŔЕz‚Å‚«‚é‚Æ‚¢‚¤’m‚ª’˜ìŒ ŽÒ‚É
-‚æ‚Á‚Ä‹LÚ‚³‚ꂽƒvƒƒOƒ‰ƒ€‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’˜ì•¨‘S”Ê‚É“K—p‚³‚ê‚éBˆÈ‰º‚Å
-‚ÍAuwƒvƒƒOƒ‰ƒ€xv‚Æ‚Í‚»‚̂悤‚É‚µ‚Ä‚±‚ÌŒ_–ñ‘‚ª“K—p‚³‚ꂽƒvƒƒOƒ‰
-ƒ€‚⒘앨‘S”Ê‚ðˆÓ–¡‚µA‚Ü‚½uwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨v‚Æ‚Íwƒv
-ƒƒOƒ‰ƒ€x‚â‚»‚Ì‘¼’˜ìŒ –@‚̉º‚Å”h¶•¨‚ÆŒ©‚È‚³‚ê‚é‚à‚Ì‘S”Ê‚ðŽw‚·B‚·‚È
-‚í‚¿AwƒvƒƒOƒ‰ƒ€x‚©‚»‚̈ꕔ‚ðA‘S‚­“¯ˆê‚Ì‚Ü‚Ü‚©A‰ü•Ï‚ð‰Á‚¦‚½‚©A‚ 
-‚é‚¢‚Í‘¼‚ÌŒ¾Œê‚É–|–󂳂ꂽŒ`‚ÅŠÜ‚Þ’˜ì•¨‚Ì‚±‚Æ‚Å‚ ‚é(u‰ü•Ïv‚Æ‚¢‚¤Œê
-‚Ì–{—ˆ‚̈Ӗ¡‚©‚ç‚Í‚¸‚ê‚邪AˆÈ‰º‚Å‚Í–|–ó‚à‰ü•Ï‚̈êŽí‚ÆŒ©‚È‚·)B‚»‚ꂼ
-‚ê‚ÌŒ_–ñŽÒ‚Íu‚ ‚È‚½v‚Æ•\Œ»‚³‚ê‚éB
-
-•¡»‚â”ЕzA‰ü•ÏˆÈŠO‚ÌŠˆ“®‚Í‚±‚ÌŒ_–ñ‘‚ł̓Jƒo[‚³‚ê‚È‚¢B‚»‚ê‚ç‚Í‚±‚Ì
-Œ_–ñ‘‚Ì‘ÎÛŠO‚Å‚ ‚éBwƒvƒƒOƒ‰ƒ€x‚ðŽÀs‚·‚ésˆ×Ž©‘̂ɧŒÀ‚Í‚È‚¢B‚Ü
-‚½A‚»‚̂悤‚ÈwƒvƒƒOƒ‰ƒ€x‚Ìo—ÍŒ‹‰Ê‚ÍA‚»‚Ì“à—e‚ªwƒvƒƒOƒ‰ƒ€x‚ðŠî
-‚É‚µ‚½’˜ì•¨‚ð\¬‚·‚éꇂ݂̂±‚ÌŒ_–ñ‘‚É‚æ‚Á‚ĕی삳‚ê‚é(wƒvƒƒOƒ‰
-ƒ€x‚ðŽÀs‚µ‚½‚±‚Æ‚É‚æ‚Á‚Ä쬂³‚ꂽ‚Æ‚¢‚¤‚±‚Æ‚Æ‚Í–³ŠÖŒW‚Å‚ ‚é)B‚±‚Ì
-‚悤‚Èüˆø‚«‚̑Ó–«‚ÍAwƒvƒƒOƒ‰ƒ€x‚ª‰½‚ð‚·‚é‚Ì‚©‚Ɉˑ¶‚·‚éB
-
-1. ‚»‚ꂼ‚ê‚Ì•¡»•¨‚É‚¨‚¢‚Ä“KØ‚È’˜ìŒ •\Ž¦‚Æ•Û؂̔۔Fº–¾(disclaimer
-of warranty)‚ð–Ú—§‚‚悤“KØ‚ÉŒfÚ‚µA‚Ü‚½‚±‚ÌŒ_–ñ‘‚¨‚æ‚шêØ‚Ì•ÛØ‚Ì
-•sÝ‚ÉG‚ꂽ’m‚·‚×‚Ä‚ð‚»‚Ì‚Ü‚ÜŽc‚µA‚»‚µ‚Ä‚±‚ÌŒ_–ñ‘‚Ì•¡»•¨‚ðwƒvƒ
-ƒOƒ‰ƒ€x‚Ì‚¢‚©‚È‚éŽó—ÌŽÒ‚É‚àwƒvƒƒOƒ‰ƒ€x‚Æ‹¤‚ɔЕz‚·‚éŒÀ‚èA‚ ‚È‚½‚Í
-wƒvƒƒOƒ‰ƒ€x‚̃\[ƒXƒR[ƒh‚Ì•¡»•¨‚ðA‚ ‚È‚½‚ªŽó‚¯Žæ‚Á‚½’Ê‚è‚ÌŒ`‚Å•¡
-»‚Ü‚½‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚éB”}‘Ì‚Í–â‚í‚È‚¢B
-
-‚ ‚È‚½‚ÍA•¨—“I‚É•¡»•¨‚ð÷“n‚·‚é‚Æ‚¢‚¤sˆ×‚ÉŠÖ‚µ‚ÄŽè”—¿‚ð‰Û‚µ‚Ä‚à—Ç
-‚¢‚µAŠó–]‚É‚æ‚Á‚Ä‚ÍŽè”—¿‚ðŽæ‚Á‚ÄŒðŠ·‚É‚¨‚¯‚é•ÛŒì‚Ì•ÛØ‚ð’ñ‹Ÿ‚µ‚Ä‚à—Ç
-‚¢B
-
-2. ‚ ‚È‚½‚ÍŽ©•ª‚ÌwƒvƒƒOƒ‰ƒ€x‚Ì•¡»•¨‚©‚»‚̈ꕔ‚ð‰ü•Ï‚µ‚ÄwƒvƒƒOƒ‰
-ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨‚ðŒ`¬‚µA‚»‚̂悤‚ȉü•Ï“_‚⒘앨‚ðã‹L‘æ1ß‚Ì’è
-‚ß‚éðŒ‚̉º‚Å•¡»‚Ü‚½‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚éB‚½‚¾‚µA‚»‚Ì‚½‚߂ɂ͈ȉº
-‚ÌðŒ‚·‚ׂĂ𖞂½‚µ‚Ä‚¢‚È‚¯‚ê‚΂Ȃç‚È‚¢:
-
- a) ‚ ‚È‚½‚ª‚»‚ê‚ç‚̃tƒ@ƒCƒ‹‚ð•ÏX‚µ‚½‚Æ‚¢‚¤‚±‚Æ‚Æ•ÏX‚µ‚½“úŽž‚ª—Ç
- ‚­•ª‚©‚é‚悤A‰ü•Ï‚³‚ꂽƒtƒ@ƒCƒ‹‚ÉŽ¦‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B
-
- b) wƒvƒƒOƒ‰ƒ€x‚Ü‚½‚Í‚»‚̈ꕔ‚ðŠÜ‚Þ’˜ì•¨A‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x
- ‚©‚»‚̈ꕔ‚©‚ç”h¶‚µ‚½’˜ì•¨‚ð”Еz‚ ‚é‚¢‚Í”­•\‚·‚éꇂɂÍA‚»‚Ì‘S
- ‘Ì‚ð‚±‚ÌŒ_–ñ‘‚ÌðŒ‚É]‚Á‚Ä‘æŽOŽÒ‚Ö–³ž‚Å—˜—p‹–‘ø‚µ‚È‚¯‚ê‚΂Ȃç‚È
- ‚¢B
-
- c) ‰ü•Ï‚³‚ꂽƒvƒƒOƒ‰ƒ€‚ªA’ÊíŽÀs‚·‚éۂɑΘb“I‚ɃRƒ}ƒ“ƒh‚ð“Ç‚Þ
- ‚悤‚É‚È‚Á‚Ä‚¢‚é‚È‚ç‚ÎA‚»‚̃vƒƒOƒ‰ƒ€‚ðÅ‚àˆê”Ê“I‚È•û–@‚őΘb“I‚É
- ŽÀs‚·‚éÛA“KØ‚È’˜ìŒ •\Ž¦A–³•ÛØ‚Å‚ ‚邱‚Æ(‚ ‚é‚¢‚Í‚ ‚È‚½‚ª•Û
- Ø‚ð’ñ‹Ÿ‚·‚é‚Æ‚¢‚¤‚±‚Æ)Aƒ†[ƒU‚ªƒvƒƒOƒ‰ƒ€‚ð‚±‚ÌŒ_–ñ‘‚Åq‚ׂ½ð
- Œ‚̉º‚ŔЕz‚·‚邱‚Æ‚ª‚Å‚«‚é‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚Ä‚±‚ÌŒ_–ñ‘‚Ì•¡»•¨‚ð
- ‰{——‚·‚é‚É‚Í‚Ç‚¤‚µ‚½‚ç‚æ‚¢‚©‚Æ‚¢‚¤ƒ†[ƒU‚Ö‚Ìà–¾‚ðŠÜ‚Þ’m‚ªˆóü‚³
- ‚ê‚é‚©A‚ ‚é‚¢‚͉æ–Ê‚É•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢(—áŠO‚Æ‚µ
- ‚ÄAwƒvƒƒOƒ‰ƒ€x‚»‚Ì‚à‚̂͑Θb“I‚Å‚ ‚Á‚Ä‚à’Êí‚»‚̂悤‚È’m‚ðˆó
- ü‚µ‚È‚¢ê‡‚É‚ÍAwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½‚ ‚È‚½‚Ì’˜ì•¨‚É‚»‚̂悤
- ‚È’m‚ðˆóü‚³‚¹‚é•K—v‚Í‚È‚¢)B
-
-ˆÈã‚Ì•K—vðŒ‚Í‘S‘Ì‚Æ‚µ‚Ẳü•Ï‚³‚ꂽ’˜ì•¨‚É“K—p‚³‚ê‚éB’˜ì•¨‚̈ꕔ
-‚ªwƒvƒƒOƒ‰ƒ€x‚©‚ç”h¶‚µ‚½‚à‚Ì‚Å‚Í‚È‚¢‚ÆŠm”F‚Å‚«A‚»‚ê‚玩g•Ê‚Ì“Æ—§
-‚µ‚½’˜ì•¨‚Å‚ ‚é‚Ƈ—“I‚Él‚¦‚ç‚ê‚é‚È‚ç‚ÎA‚ ‚È‚½‚ª‚»‚ê‚ç‚ð•Ê‚Ì’˜ì•¨
-‚Æ‚µ‚Ä•ª‚¯‚ĔЕz‚·‚éê‡A‚»‚¤‚¢‚Á‚½•”•ª‚É‚Í‚±‚ÌŒ_–ñ‘‚Æ‚»‚ÌðŒ‚Í
-“K—p‚³‚ê‚È‚¢B‚µ‚©‚µA‚ ‚È‚½‚ª“¯‚¶•”•ª‚ðwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨
-‘S‘̂̈ꕔ‚Æ‚µ‚ĔЕz‚·‚é‚È‚ç‚ÎA‘S‘Ì‚Æ‚µ‚Ă̔Еz•¨‚ÍA‚±‚ÌŒ_–ñ‘‚ª
-‰Û‚·ðŒ‚É]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚Æ‚¢‚¤‚Ì‚ÍA‚±‚ÌŒ_–ñ‘‚ª‘¼‚ÌŒ_–ñŽÒ
-‚É—^‚¦‚é‹–‰Â‚ÍwƒvƒƒOƒ‰ƒ€xŠÛ‚²‚Æ‘S‘Ì‚É‹y‚ÑA’N‚ª‘‚¢‚½‚©‚ÍŠÖŒW‚È‚­Še
-•”•ª‚Ì‚·‚ׂĂð•ÛŒì‚·‚é‚©‚ç‚Å‚ ‚éB
-
-‚æ‚Á‚ÄA‚·‚ׂĂ ‚È‚½‚É‚æ‚Á‚Ä‘‚©‚ꂽ’˜ì•¨‚ɑ΂µAŒ —˜‚ðŽå’£‚µ‚½‚è‚ ‚È
-‚½‚ÌŒ —˜‚Ɉًc‚ð\‚µ—§‚Ă邱‚Æ‚Í‚±‚Ì߂̈Ó}‚·‚é‚Æ‚±‚ë‚Å‚Í‚È‚¢B‚Þ‚µ‚ëA
-‚»‚ÌŽïŽ|‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½”h¶•¨‚È‚¢‚µW‡’˜ì•¨‚̔Еz‚ðŠÇ—‚·
-‚錠—˜‚ðsŽg‚·‚é‚Æ‚¢‚¤‚±‚Æ‚É‚ ‚éB
-
-‚Ü‚½AwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚Ä‚¢‚È‚¢‚»‚Ì‘¼‚Ì’˜ì•¨‚ðwƒvƒƒOƒ‰ƒ€x(‚ 
-‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨)‚ƈê‚ÉW‚ß‚½‚¾‚¯‚Ì‚à‚Ì‚ðˆêŠª‚Ì
-•ÛŠÇ‘•’u‚È‚¢‚µ”Еz”}‘Ì‚ÉŽû‚ß‚Ä‚àA‚»‚Ì‘¼‚Ì’˜ì•¨‚Ü‚Å‚±‚ÌŒ_–ñ‘‚ª•Û
-Œì‚·‚é‘ÎÛ‚É‚È‚é‚Æ‚¢‚¤‚±‚Æ‚É‚Í‚È‚ç‚È‚¢B
-
-3. ‚ ‚È‚½‚Íã‹L‘æ1ß‚¨‚æ‚Ñ2ß‚ÌðŒ‚É]‚¢AwƒvƒƒOƒ‰ƒ€x(‚ ‚é‚¢‚Í‘æ2
-ß‚É‚¨‚¯‚é”h¶•¨)‚ðƒIƒuƒWƒFƒNƒgƒR[ƒh‚È‚¢‚µŽÀsŒ`Ž®‚Å•¡»‚Ü‚½‚͔Еz‚·
-‚邱‚Æ‚ª‚Å‚«‚éB‚½‚¾‚µA‚»‚Ìꇂ ‚È‚½‚͈ȉº‚Ì‚¤‚¿‚Ç‚ê‚©ˆê‚‚ðŽÀŽ{‚µ‚È
-‚¯‚ê‚΂Ȃç‚È‚¢:
-
- a) ’˜ì•¨‚ÉAwƒvƒƒOƒ‰ƒ€x‚ɑΉž‚µ‚½Š®‘S‚©‚‹@ŠB‚Å“Ç‚ÝŽæ‚è‰Â”\‚È
- ƒ\[ƒXƒR[ƒh‚ð“Y•t‚·‚éB‚½‚¾‚µAƒ\[ƒXƒR[ƒh‚Íã‹L‘æ1ß‚¨‚æ‚Ñ2ß‚Ì
- ðŒ‚É]‚¢ƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚ÅKŠµ“I‚ÉŽg‚í‚ê‚é”}‘̂ŔЕz‚µ‚È‚¯‚ê‚Î
- ‚È‚ç‚È‚¢B‚ ‚é‚¢‚ÍA
-
- b) ’˜ì•¨‚ÉA‚¢‚©‚È‚é‘æŽOŽÒ‚ɑ΂µ‚Ä‚àAwƒvƒƒOƒ‰ƒ€x‚ɑΉž‚µ‚½Š®
- ‘S‚©‚‹@ŠB‚Å“Ç‚ÝŽæ‚è‰Â”\‚ȃ\[ƒXƒR[ƒh‚ðA”Еz‚É—v‚·‚镨—“IƒRƒXƒg
- ‚ðã‰ñ‚ç‚È‚¢’ö“x‚ÌŽè”—¿‚ƈø‚«Š·‚¦‚É’ñ‹Ÿ‚·‚éŽ|q‚ׂ½­‚È‚­‚Æ‚à3”N
- ŠÔ‚Í—LŒø‚È‘–Ê‚É‚È‚Á‚½\‚µo‚ð“Y‚¦‚éB‚½‚¾‚µAƒ\[ƒXƒR[ƒh‚Íã‹L‘æ
- 1ß‚¨‚æ‚Ñ2ß‚ÌðŒ‚É]‚¢ƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚ÅKŠµ“I‚ÉŽg‚í‚ê‚é”}‘Ì‚Å
- ”Еz‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚ ‚é‚¢‚ÍA
-
- c) ‘Ήž‚·‚éƒ\[ƒXƒR[ƒh”Еz‚Ì\‚µo‚ÉÛ‚µ‚ÄA‚ ‚È‚½‚ª“¾‚½î•ñ‚ðˆê
- ‚Ɉø‚«“n‚·(‚±‚Ì‘I‘ðŽˆ‚ÍA‰c—˜‚ð–Ú“I‚Æ‚µ‚È‚¢”Еz‚Å‚ ‚Á‚ÄA‚©‚‚ 
- ‚È‚½‚ªã‹L¬ßb‚ÅŽw’肳‚ê‚Ä‚¢‚é‚悤‚È\‚µo‚Æ‹¤‚ɃIƒuƒWƒFƒNƒgƒR[
- ƒh‚ ‚é‚¢‚ÍŽÀsŒ`Ž®‚̃vƒƒOƒ‰ƒ€‚µ‚©“üŽè‚µ‚Ä‚¢‚È‚¢ê‡‚ÉŒÀ‚è‹–‰Â‚³‚ê
- ‚é)B
-
-’˜ì•¨‚̃\[ƒXƒR[ƒh‚Æ‚ÍA‚»‚ê‚ɑ΂µ‚ĉü•Ï‚ð‰Á‚¦‚éã‚ÅD‚Ü‚µ‚¢‚Æ‚³‚ê‚é
-’˜ì•¨‚ÌŒ`Ž®‚ðˆÓ–¡‚·‚éB‚ ‚éŽÀsŒ`Ž®‚Ì’˜ì•¨‚É‚Æ‚Á‚ÄŠ®‘S‚ȃ\[ƒXƒR[ƒh
-‚Æ‚ÍA‚»‚ꂪŠÜ‚Þƒ‚ƒWƒ…[ƒ‹‚·‚ׂẴ\[ƒXƒR[ƒh‘S•”‚ɉÁ‚¦AŠÖ˜A‚·‚éƒCƒ“
-ƒ^[ƒtƒF[ƒX’è‹`ƒtƒ@ƒCƒ‹‚Ì‚·‚ׂĂƃ‰ƒCƒuƒ‰ƒŠ‚̃Rƒ“ƒpƒCƒ‹‚âƒCƒ“ƒXƒg[ƒ‹
-‚ð§Œä‚·‚邽‚ß‚ÉŽg‚í‚ê‚éƒXƒNƒŠƒvƒg‚ð‚à‰Á‚¦‚½‚à‚Ì‚ðˆÓ–¡‚·‚éB‚µ‚©‚µ“Á•Ê
-‚È—áŠO‚Æ‚µ‚ÄA‚»‚̃Rƒ“ƒ|[ƒlƒ“ƒgŽ©‘Ì‚ªŽÀsŒ`Ž®‚É•t‚·‚é‚Ì‚Å‚Í–³‚¢ŒÀ‚èA
-”Еz‚³‚ê‚é‚à‚Ì‚Ì’†‚ÉAŽÀsŒ`Ž®‚ªŽÀs‚³‚ê‚éƒIƒyƒŒ[ƒeƒBƒ“ƒOƒVƒXƒeƒ€‚ÌŽå
-—v‚ȃRƒ“ƒ|[ƒlƒ“ƒg(ƒRƒ“ƒpƒCƒ‰‚âƒJ[ƒlƒ‹“™)‚Æ’Êíˆê‚É(ƒ\[ƒX‚©ƒoƒCƒi
-ƒŠŒ`Ž®‚Ì‚Ç‚¿‚ç‚©‚Å)”Еz‚³‚ê‚é‚à‚Ì‚ðŠÜ‚ñ‚Å‚¢‚é•K—v‚Í‚È‚¢‚Æ‚·‚éB
-
-ŽÀsŒ`Ž®‚Ü‚½‚̓IƒuƒWƒFƒNƒgƒR[ƒh‚̔Еz‚ªAŽw’肳‚ꂽꊂ©‚çƒRƒs[‚·‚é
-‚½‚߂̃AƒNƒZƒXŽè’i‚ð’ñ‹Ÿ‚·‚邱‚Ƃňׂ³‚ê‚é‚Æ‚µ‚ÄA‚»‚Ìã‚Ń\[ƒXƒR[ƒh
-‚à“¯“™‚̃AƒNƒZƒXŽè’i‚É‚æ‚Á‚Ä“¯‚¶êŠ‚©‚çƒRƒs[‚Å‚«‚é‚悤‚É‚È‚Á‚Ä‚¢‚é‚È
-‚ç‚ÎA‘æŽOŽÒ‚ªƒIƒuƒWƒFƒNƒgƒR[ƒh‚ƈê‚Ƀ\[ƒX‚à‹­§“I‚ɃRƒs[‚³‚¹‚ç‚ê
-‚é‚悤‚É‚È‚Á‚Ä‚¢‚È‚­‚Ä‚àƒ\[ƒXƒR[ƒh”Еz‚ÌðŒ‚ð–ž‚½‚µ‚Ä‚¢‚é‚à‚Ì‚Æ‚·‚éB
-
-4. ‚ ‚È‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ðA‚±‚ÌŒ_–ñ‘‚É‚¨‚¢‚Ä–¾Šm‚É’ñŽ¦‚³‚ꂽs
-ˆ×‚𜂫•¡»‚â‰ü•ÏAƒTƒuƒ‰ƒCƒZƒ“ƒXA‚ ‚é‚¢‚͔Еz‚µ‚Ä‚Í‚È‚ç‚È‚¢B‘¼‚É
-wƒvƒƒOƒ‰ƒ€x‚ð•¡»‚â‰ü•ÏAƒTƒuƒ‰ƒCƒZƒ“ƒXA‚ ‚é‚¢‚͔Еz‚·‚éŠé‚Ä‚Í‚·‚×
-‚Ä–³Œø‚Å‚ ‚èA‚±‚ÌŒ_–ñ‘‚̉º‚Å‚Ì‚ ‚È‚½‚ÌŒ —˜‚ðŽ©“®“I‚ÉIŒ‹‚³‚¹‚邱
-‚ƂɂȂ낤B‚µ‚©‚µA•¡»•¨‚⌠—˜‚ð‚±‚ÌŒ_–ñ‘‚É]‚Á‚Ä‚ ‚È‚½‚©‚瓾‚½
-lX‚ÉŠÖ‚µ‚Ä‚ÍA‚»‚̂悤‚ÈlX‚ª‚±‚ÌŒ_–ñ‘‚ÉŠ®‘S‚É]‚Á‚Ä‚¢‚éŒÀ‚è”Þ
-‚ç‚̃‰ƒCƒZƒ“ƒX‚Ü‚ÅIŒ‹‚·‚邱‚Æ‚Í‚È‚¢B
-
-5. ‚ ‚È‚½‚Í‚±‚ÌŒ_–ñ‘‚ðŽó‘ø‚·‚é•K—v‚Í–³‚¢B‚Æ‚¢‚¤‚Ì‚ÍA‚ ‚È‚½‚Í‚±
-‚ê‚É–¼‚µ‚Ä‚¢‚È‚¢‚©‚ç‚Å‚ ‚éB‚µ‚©‚µA‚±‚ÌŒ_–ñ‘ˆÈŠO‚É‚ ‚È‚½‚ɑ΂µ
-‚ÄwƒvƒƒOƒ‰ƒ€x‚â‚»‚Ì”h¶•¨‚ð•ÏXA”Еz‚·‚é‹–‰Â‚ð—^‚¦‚é‚à‚Ì‚Í‘¶Ý‚µ‚È
-‚¢B‚±‚ê‚ç‚Ìsˆ×‚ÍA‚ ‚È‚½‚ª‚±‚ÌŒ_–ñ‘‚ðŽó‚¯“ü‚ê‚È‚¢ŒÀ‚è–@‚É‚æ‚Á‚Ä
-‹Ö‚¶‚ç‚ê‚Ä‚¢‚éB‚»‚±‚ÅAwƒvƒƒOƒ‰ƒ€x(‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ
-‚½’˜ì•¨‚Ì‚·‚ׂÄ)‚ð‰ü•Ï‚È‚¢‚µ”Еz‚·‚邱‚Æ‚É‚æ‚èA‚ ‚È‚½‚ÍŽ©•ª‚ª‚»‚Ì‚æ
-‚¤‚Èsˆ×‚ðs‚¤‚½‚ß‚É‚±‚ÌŒ_–ñ‘‚ðŽó‘ø‚µ‚½‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚ÄwƒvƒƒO
-ƒ‰ƒ€x‚Æ‚»‚ê‚ÉŠî‚­’˜ì•¨‚Ì•¡»‚â”ЕzA‰ü•Ï‚ɂ‚¢‚Ä‚±‚ÌŒ_–ñ‘‚ª‰Û
-‚·§–ñ‚ÆðŒ‚ð‚·‚×‚ÄŽó‚¯“ü‚ꂽ‚Æ‚¢‚¤‚±‚Æ‚ðŽ¦‚µ‚½‚à‚Ì‚ÆŒ©‚È‚·B
-
-6. ‚ ‚È‚½‚ªwƒvƒƒOƒ‰ƒ€x(‚Ü‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨‘S”Ê)‚ð
-ĔЕz‚·‚邽‚Ñ‚ÉA‚»‚ÌŽó—ÌŽÒ‚ÍŒ³X‚̃‰ƒCƒZƒ“ƒX‹–‰ÂŽÒ‚©‚çA‚±‚ÌŒ_–ñ‘‚Å
-Žw’肳‚ꂽðŒ‚Ƨ–ñ‚̉º‚ÅwƒvƒƒOƒ‰ƒ€x‚ð•¡»‚â”ЕzA‚ ‚é‚¢‚͉ü•Ï‚·‚é
-‹–‰Â‚ðŽ©“®“I‚É“¾‚é‚à‚Ì‚Æ‚·‚éB‚ ‚È‚½‚ÍAŽó—ÌŽÒ‚ª‚±‚±‚Å”F‚ß‚ç‚ꂽŒ —˜‚ð
-sŽg‚·‚邱‚Æ‚ÉŠÖ‚µ‚Ä‚±‚êˆÈ㑼‚Ì‚¢‚©‚Ȃ駌À‚à‰Û‚·‚±‚Æ‚ª‚Å‚«‚È‚¢B‚ ‚È
-‚½‚É‚ÍA‘æŽOŽÒ‚ª‚±‚ÌŒ_–ñ‘‚É]‚¤‚±‚Æ‚ð‹­§‚·‚éÓ”C‚Í‚È‚¢B
-
-7. “Á‹–NŠQ‚ ‚é‚¢‚Í‚»‚Ì‘¼‚Ì——R(“Á‹–ŠÖŒW‚ÉŒÀ‚ç‚È‚¢)‚©‚çAÙ”»Š‚Ì”»Œˆ
-‚ ‚é‚¢‚Í\‚µ—§‚Ä‚ÌŒ‹‰Ê‚Æ‚µ‚Ä‚ ‚È‚½‚É(Ù”»Š–½—ß‚âŒ_–ñ‚È‚Ç‚É‚æ‚è)‚±‚ÌŒ_
-–ñ‘‚ÌðŒ‚Æ–µ‚‚·‚駖ñ‚ª‰Û‚³‚ꂽꇂłàA‚ ‚È‚½‚ª‚±‚ÌŒ_–ñ‘‚ÌðŒ‚ð
-–Æœ‚³‚ê‚é‚킯‚Å‚Í‚È‚¢B‚à‚µ‚±‚ÌŒ_–ñ‘‚̉º‚Å‚ ‚È‚½‚ɉۂ¹‚ç‚ꂽӔC‚Æ‘¼
-‚ÌŠÖ˜A‚·‚éÓ”C‚𓯎ž‚É–ž‚½‚·‚悤‚ÈŒ`‚ŔЕz‚Å‚«‚È‚¢‚È‚ç‚ÎAŒ‹‰Ê‚Æ‚µ‚Ä‚ 
-‚È‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ð”Еz‚·‚邱‚Æ‚ª‘S‚­‚Å‚«‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚Å‚ ‚éB—Ⴆ
-‚ΓÁ‹–ƒ‰ƒCƒZƒ“ƒX‚ªA‚ ‚È‚½‚©‚ç’¼ÚŠÔÚ‚ð–â‚킸ƒRƒs[‚ðŽó‚¯Žæ‚Á‚½l‚ª’N
-‚Å‚àwƒvƒƒOƒ‰ƒ€x‚ðŽg—p—¿–³—¿‚ÅĔЕz‚·‚邱‚Æ‚ð”F‚ß‚Ä‚¢‚È‚¢ê‡A‚ ‚È
-‚½‚ª‚»‚̧–ñ‚Æ‚±‚ÌŒ_–ñ‘‚𗼕û‚Æ‚à–ž‚½‚·‚É‚ÍwƒvƒƒOƒ‰ƒ€x‚̔Еz‚ðŠ®‘S
-‚É’†Ž~‚·‚邵‚©‚È‚¢‚¾‚낤B
-
-‚±‚Ì߂̈ꕔ•ª‚ª“Á’è‚Ì󋵂̉º‚Å–³Œø‚È‚¢‚µŽÀŽ{•s‰Â”\‚ÈꇂłàAß‚ÌŽc
-‚è‚Ì•”•ª‚Í“K—p‚³‚ê‚é‚悤ˆÓ}‚³‚ê‚Ä‚¢‚éB‚»‚Ì‘¼‚Ì󋵂łÍß‚ª‘S‘Ì‚Æ‚µ‚Ä
-“K—p‚³‚ê‚é‚悤ˆÓ}‚³‚ê‚Ä‚¢‚éB
-
-“Á‹–‚â‚»‚Ì‘¼‚ÌàŽYŒ ‚ðNŠQ‚µ‚½‚èA‚»‚̂悤‚ÈŒ —˜‚ÌŽå’£‚ÌŒø—͂Ɉًc‚ð¥
-‚¦‚½‚è‚·‚é‚悤‚ ‚È‚½‚ð—U˜f‚·‚邱‚Æ‚ª‚±‚Ìß‚Ì–Ú“I‚Å‚Í‚È‚¢B‚±‚Ìß‚É‚ÍA
-lX‚É‚æ‚Á‚ă‰ƒCƒZƒ“ƒXŠµs‚Æ‚µ‚ÄŽÀŒ»‚³‚ê‚Ä‚«‚½AƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA”Еz
-‚̃VƒXƒeƒ€‚ÌŠ®‘S«‚ðŒì‚é‚Æ‚¢‚¤–Ú“I‚µ‚©‚È‚¢B‘½‚­‚ÌlX‚ªAƒtƒŠ[ƒ\ƒtƒg
-ƒEƒFƒA‚̔ЕzƒVƒXƒeƒ€‚ªŽñ”öˆêŠÑ‚µ‚Ä“K—p‚³‚ê‚Ä‚¢‚é‚Æ‚¢‚¤M—Š‚ÉŠî‚«A‚±
-‚̃VƒXƒeƒ€‚ð’Ê‚¶‚ĔЕz‚³‚ê‚鑽—l‚ȃ\ƒtƒgƒEƒFƒA‚ÉŠ°‘å‚ÈvŒ£‚ð‚µ‚Ä‚«‚½‚Ì
-‚ÍŽ–ŽÀ‚Å‚ ‚邪Al‚ª‚ǂ̂悤‚ȃVƒXƒeƒ€‚ð’Ê‚¶‚ă\ƒtƒgƒEƒFƒA‚ð”Еz‚µ‚½‚¢
-‚ÆŽv‚¤‚©‚Í‚ ‚­‚Ü‚Å‚àìŽÒ/Šñ—^ŽÒŽŸ‘æ‚Å‚ ‚èA‚ ‚È‚½‚ª‘I‘ð‚ð‰Ÿ‚µ‚‚¯‚邱
-‚Æ‚Í‚Å‚«‚È‚¢B
-
-‚±‚Ìß‚ÍA‚±‚ÌŒ_–ñ‘‚Ì‚±‚Ì߈ȊO‚Ì•”•ª‚̈ê‹AŒ‹‚É‚È‚é‚Æl‚¦‚ç‚ê‚éƒP[
-ƒX‚ð“O’ê“I‚É–¾‚ç‚©‚É‚·‚邱‚Æ‚ð–Ú“I‚Æ‚µ‚Ä‚¢‚éB
-
-8. wƒvƒƒOƒ‰ƒ€x‚̔Еz‚â—˜—p‚ªA‚ ‚é‘‚É‚¨‚¢‚Ä‚Í“Á‹–‚Ü‚½‚Í’˜ìŒ ‚ªŽå
-’£‚³‚ꂽƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì‚¢‚¸‚ê‚©‚É‚æ‚Á‚ħŒÀ‚³‚ê‚Ä‚¢‚éê‡AwƒvƒƒO
-ƒ‰ƒ€x‚É‚±‚ÌŒ_–ñ‘‚ð“K—p‚µ‚½Œ³‚Ì’˜ìŒ ŽÒ‚ÍA‚»‚¤‚¢‚Á‚½‘X‚ð”rœ‚µ
-‚½–¾Šm‚È’n—“I”Еz§ŒÀ‚ð‰Á‚¦A‚»‚±‚Å”rœ‚³‚ê‚Ä‚¢‚È‚¢‘‚Ì’†‚â‚»‚ê‚ç‚Ì‘X
-‚̊Ԃł̂ݔЕz‚ª‹–‰Â‚³‚ê‚é‚悤‚É‚µ‚Ä‚à\‚í‚È‚¢B‚»‚Ìê‡A‚»‚̂悤‚ȧ
-ŒÀ‚Í‚±‚ÌŒ_–ñ‘–{•¶‚Å‘‚©‚ê‚Ä‚¢‚é‚Ì‚Æ“¯—l‚ÉŒ©‚È‚³‚ê‚éB
-
-9. ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ÍAŽž‚É‚æ‚Á‚ĉü’ù‚Ü‚½‚ÍV”ł̈ê”ÊŒöO—˜—p‹–
-‘ø‘‚ð”­•\‚·‚邱‚Æ‚ª‚Å‚«‚éB‚»‚̂悤‚ÈV”Å‚ÍŒ»Ý‚̃o[ƒWƒ‡ƒ“‚Æ‚»‚̸_
-‚É‚¨‚¢‚Ä‚ÍŽ—‚½‚à‚̂ɂȂ邾‚낤‚ªAV‚½‚È–â‘è‚⌜”O‚ð‰ðŒˆ‚·‚邽‚ßו”‚Å
-‚͈قȂé‰Â”\«‚ª‚ ‚éB
-
-‚»‚ꂼ‚ê‚̃o[ƒWƒ‡ƒ“‚É‚ÍAŒ©•ª‚¯‚ª•t‚­‚悤‚Ƀo[ƒWƒ‡ƒ“”Ô†‚ªU‚ç‚ê‚Ä‚¢
-‚éBwƒvƒƒOƒ‰ƒ€x‚É‚¨‚¢‚Ä‚»‚ê‚É“K—p‚³‚ê‚邱‚ÌŒ_–ñ‘‚̃o[ƒWƒ‡ƒ“”Ô†‚ª
-Žw’肳‚ê‚Ä‚¢‚ÄAX‚Éu‚»‚êˆÈ~‚Ì‚¢‚©‚È‚éƒo[ƒWƒ‡ƒ“v‚à“K—p‚µ‚Ä—Ç‚¢‚Æ‚È‚Á
-‚Ä‚¢‚½ê‡A‚ ‚È‚½‚Í]‚¤ðŒ‚Ƨ–ñ‚Æ‚µ‚ÄAŽw’è‚̃o[ƒWƒ‡ƒ“‚©AƒtƒŠ[ƒ\
-ƒtƒgƒEƒFƒAà’c‚É‚æ‚Á‚Ä”­s‚³‚ꂽŽw’è‚̃o[ƒWƒ‡ƒ“ˆÈ~‚̔ł̂ǂꂩˆê‚‚Ì
-‚Ç‚¿‚ç‚©‚ð‘I‚Ô‚±‚Æ‚ªo—ˆ‚éBwƒvƒƒOƒ‰ƒ€x‚щƒCƒZƒ“ƒX‚̃o[ƒWƒ‡ƒ“”Ô†
-‚ªŽw’肳‚ê‚Ä‚¢‚È‚¢‚È‚ç‚ÎA‚ ‚È‚½‚Í¡‚܂łɃtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚©‚ç”­
-s‚³‚ꂽƒo[ƒWƒ‡ƒ“‚Ì’†‚©‚çD‚«‚É‘I‚ñ‚Å\‚í‚È‚¢B
-
-10. ‚à‚µ‚ ‚È‚½‚ªwƒvƒƒOƒ‰ƒ€x‚̈ꕔ‚ðA‚»‚̔ЕzðŒ‚ª‚±‚ÌŒ_–ñ‘‚Æ
-ˆÙ‚Ȃ鑼‚̃tƒŠ[‚ȃvƒƒOƒ‰ƒ€‚Æ“‡‚µ‚½‚¢‚È‚ç‚ÎAìŽÒ‚ɘA—‚µ‚Ä‹–‰Â‚ð‹
-‚ß‚æBƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ª’˜ìŒ ‚ð•Û—L‚·‚éƒ\ƒtƒgƒEƒFƒA‚ɂ‚¢‚Ä‚ÍA
-ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ɘA—‚¹‚æBŽ„‚½‚¿‚ÍA‚±‚̂悤‚Èꇂ̂½‚ß‚É“Á•Ê
-‚È—áŠO‚ðÝ‚¯‚邱‚Æ‚à‚ ‚éBŽ„‚½‚¿‚ªŒˆ’è‚ð‰º‚·‚É‚ ‚½‚Á‚Ä‚ÍAŽ„‚½‚¿‚̃tƒŠ[
-ƒ\ƒtƒgƒEƒFƒA‚Ì”h¶•¨‚·‚ׂĂªƒtƒŠ[‚Èó‘Ô‚É•Û‚½‚ê‚é‚Æ‚¢‚¤‚±‚Æ‚ÆAˆê”Ê“I
-‚Ƀ\ƒtƒgƒEƒFƒA‚Ì‹¤—L‚ÆÄ—˜—p‚ð‘£i‚·‚é‚Æ‚¢‚¤“ñ‚‚̖ڕW‚ð‹K€‚ÉŒŸ“¢‚³‚ê
-‚é‚Å‚ ‚낤B
- –³•Û؂ɂ‚¢‚Ä
-
-11. wƒvƒƒOƒ‰ƒ€x‚͑㉿–³‚µ‚É—˜—p‚ª‹–‰Â‚³‚ê‚é‚Ì‚ÅA“KØ‚È–@‚ª”F‚ß‚éŒÀ
-‚è‚É‚¨‚¢‚ÄAwƒvƒƒOƒ‰ƒ€x‚ÉŠÖ‚·‚é‚¢‚©‚È‚é•ÛØ‚à‘¶Ý‚µ‚È‚¢B‘–Ê‚Å•Ê‚É
-q‚ׂéꇂ𜂢‚ÄA’˜ìŒ ŽÒA‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’c‘Ì‚ÍAwƒvƒƒOƒ‰ƒ€x‚ðA
-•\–¾‚³‚ꂽ‚©Œ¾ŠO‚É‚©‚Í–â‚킸A¤‹Æ“I“K«‚ð•ÛØ‚·‚é‚Ù‚Ì‚ß‚©‚µ‚â‚ ‚é“Á’è
-‚Ì–Ú“I‚Ö‚Ì“K‡«(‚ÉŒÀ‚ç‚ê‚È‚¢)‚ðŠÜ‚ÞˆêØ‚Ì•ÛØ–³‚µ‚Éu‚ ‚邪‚Ü‚Üv‚Å’ñ
-‹Ÿ‚·‚éBwƒvƒƒOƒ‰ƒ€x‚ÌŽ¿‚Æ«”\‚ÉŠÖ‚·‚郊ƒXƒN‚Ì‚·‚ׂĂ͂ ‚È‚½‚É‹A‘®‚·
-‚éBwƒvƒƒOƒ‰ƒ€x‚ÉŒ‡Š×‚ª‚ ‚é‚Æ”»–¾‚µ‚½ê‡A‚ ‚È‚½‚Í•K—v‚È•ÛŽç“_ŒŸ‚â
-•âCAC³‚É—v‚·‚éƒRƒXƒg‚Ì‚·‚ׂĂðˆø‚«Žó‚¯‚邱‚Æ‚É‚È‚éB
-
-12. “KØ‚È–@‚©‘–Ê‚Å‚Ì“¯ˆÓ‚É‚æ‚Á‚Ä–½‚º‚ç‚ê‚È‚¢ŒÀ‚èA’˜ìŒ ŽÒA‚Ü‚½‚Íã
-‹L‚Å‹–‰Â‚³‚ê‚Ä‚¢‚é’Ê‚è‚ÉwƒvƒƒOƒ‰ƒ€x‚ð‰ü•Ï‚Ü‚½‚ÍĔЕz‚µ‚½‚»‚Ì‘¼‚Ì’c
-‘Ì‚ÍA‚ ‚È‚½‚ɑ΂µ‚ÄwƒvƒƒOƒ‰ƒ€x‚Ì—˜—p‚È‚¢‚µ—˜—p•s”\‚Ŷ‚¶‚½ˆê”Ê“IA
-“Á•Ê“IA‹ô‘R“IA•K‘R“I‚È‘¹ŠQ(ƒf[ƒ^‚ÌÁŽ¸‚â•s³Šm‚Ȉ—A‚ ‚È‚½‚©‘æŽO
-ŽÒ‚ª”í‚Á‚½‘¹Ž¸A‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ª‘¼‚̃\ƒtƒgƒEƒFƒA‚ƈê‚É“®ì‚µ
-‚È‚¢‚Æ‚¢‚¤•s‹ï‡‚È‚Ç‚ðŠÜ‚Þ‚ª‚»‚ê‚ç‚ÉŒÀ‚ç‚È‚¢)‚ɈêØ‚ÌÓ”C‚𕉂í‚È‚¢B
-‚»‚̂悤‚È‘¹ŠQ‚ª¶‚¸‚é‰Â”\«‚ɂ‚¢‚Ĕނ炪’‰‚³‚ê‚Ä‚¢‚½‚Æ‚µ‚Ä‚à“¯—l‚Å
-‚ ‚éB
-
- ðŒ‚Ƨ–ñI‚í‚è
-
- ˆÈã‚Ìð€‚ð‚ ‚È‚½‚ÌV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚É“K—p‚·‚é•û–@
-
-‚ ‚È‚½‚ªV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚ðŠJ”­‚µ‚½‚Æ‚µ‚ÄAŒöO‚É‚æ‚Á‚Ä‚»‚ꂪ—˜—p‚³‚ê‚é
-‰Â”\«‚ðÅ‘å‚É‚µ‚½‚¢‚È‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ð‚±‚ÌŒ_–ñ‘‚Ìð€‚É]‚Á‚Ä
-’N‚Å‚àĔЕz‚ ‚é‚¢‚Í•ÏX‚Å‚«‚é‚悤ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚É‚·‚é‚Ì‚ªÅ‘P‚Å‚·B
-
-‚»‚Ì‚½‚ß‚É‚ÍAƒvƒƒOƒ‰ƒ€‚Ɉȉº‚̂悤‚È•\Ž¦‚ð“Y•t‚µ‚Ä‚­‚¾‚³‚¢B‚»‚Ìê‡A
-•ÛØ‚ª”rœ‚³‚ê‚Ä‚¢‚é‚Æ‚¢‚¤‚±‚Æ‚ðÅ‚àŒø‰Ê“I‚É“`‚¦‚邽‚ß‚ÉA‚»‚ꂼ‚ê‚̃\[
-ƒXƒtƒ@ƒCƒ‹‚Ì–`“ª‚É•\Ž¦‚ð“Y•t‚·‚ê‚ÎÅ‚àˆÀ‘S‚Å‚·B­‚È‚­‚Æ‚àAu’˜ìŒ •\
-Ž¦v‚Æ‚¢‚¤s‚Æ‘S•¶‚ª‚ ‚éꊂւ̃|ƒCƒ“ƒ^‚¾‚¯‚ÍŠeƒtƒ@ƒCƒ‹‚ÉŠÜ‚ß‚Ä’u‚¢‚Ä
-‚­‚¾‚³‚¢B
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- (–ó:
-
- <ƒvƒƒOƒ‰ƒ€‚Ì–¼‘O‚ÆA‚»‚ꂪ‰½‚ð‚·‚é‚©‚ɂ‚¢‚Ä‚ÌŠÈ’P‚Èà–¾B>
- Copyright (C) <¼—ï”N> <ìŽÒ‚Ì–¼‘O>
-
- ‚±‚̃vƒƒOƒ‰ƒ€‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚Í‚±‚ê‚ðAƒtƒŠ[ƒ\ƒt
- ƒgƒEƒFƒAà’c‚É‚æ‚Á‚Ä”­s‚³‚ꂽ GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘(ƒo[ƒWƒ‡
- ƒ“2‚©AŠó–]‚É‚æ‚Á‚Ä‚Í‚»‚êˆÈ~‚̃o[ƒWƒ‡ƒ“‚Ì‚¤‚¿‚Ç‚ê‚©)‚Ì’è‚ß‚éðŒ
- ‚̉º‚ÅĔЕz‚Ü‚½‚͉ü•Ï‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
-
- ‚±‚̃vƒƒOƒ‰ƒ€‚Í—L—p‚Å‚ ‚邱‚Æ‚ðŠè‚Á‚ĔЕz‚³‚ê‚Ü‚·‚ªA*‘S‚­‚Ì–³•Û
- Ø* ‚Å‚·B¤‹Æ‰Â”\«‚Ì•ÛØ‚â“Á’è‚Ì–Ú“I‚Ö‚Ì“K‡«‚ÍAŒ¾ŠO‚ÉŽ¦‚³‚ꂽ
- ‚à‚Ì‚àŠÜ‚ß‘S‚­‘¶Ý‚µ‚Ü‚¹‚ñBÚ‚µ‚­‚ÍGNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚ð‚²
- ——‚­‚¾‚³‚¢B
-
- ‚ ‚È‚½‚Í‚±‚̃vƒƒOƒ‰ƒ€‚Æ‹¤‚ÉAGNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Ì•¡»•¨‚ð
- ˆê•”Žó‚¯Žæ‚Á‚½‚Í‚¸‚Å‚·B‚à‚µŽó‚¯Žæ‚Á‚Ä‚¢‚È‚¯‚ê‚ÎAƒtƒŠ[ƒ\ƒtƒgƒEƒF
- ƒAà’c‚Ü‚Å¿‹‚µ‚Ä‚­‚¾‚³‚¢(ˆ¶æ‚Í the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA)B
-
- )
-
-“dŽq‚È‚¢‚µŽ†‚̃[ƒ‹‚Å‚ ‚È‚½‚É–â‚¢‡‚킹‚é•û–@‚ɂ‚¢‚Ä‚Ìî•ñ‚à‘‚«‰Á‚¦
-‚Ü‚µ‚傤B
-
-ƒvƒƒOƒ‰ƒ€‚ª‘Θb“I‚È‚à‚Ì‚È‚ç‚ÎA‘Θbƒ‚[ƒh‚Å‹N“®‚µ‚½Û‚Éo—Í‚Æ‚µ‚Ĉȉº
-‚̂悤‚È’Z‚¢’m‚ª•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
- (–ó:
-
- Gnomovision ƒo[ƒWƒ‡ƒ“ 69, Copyright (C) ”N ìŽÒ‚Ì–¼‘O
- Gnomovision ‚Í*‘S‚­‚Ì–³•ÛØ*‚Å’ñ‹Ÿ‚³‚ê‚Ü‚·BÚ‚µ‚­‚Íushow wv
- ‚ƃ^ƒCƒv‚µ‚ĉº‚³‚¢B‚±‚ê‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Å‚ ‚èA‚ ‚éðŒ‚̉º‚Å
- ĔЕz‚·‚邱‚Æ‚ª§—コ‚ê‚Ä‚¢‚Ü‚·BÚ‚µ‚­‚Íushow cv‚ƃ^ƒCƒv‚µ‚ĉº
- ‚³‚¢B
-
- )
-
-‚±‚±‚ÅA‰¼‘z“I‚ȃRƒ}ƒ“ƒhushow wv‚Æushow cv‚͈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
-‚Ì“KØ‚È•”•ª‚ð•\Ž¦‚·‚é‚悤‚É‚È‚Á‚Ä‚¢‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚à‚¿‚ë‚ñA‚ ‚È
-‚½‚ªŽg‚¤ƒRƒ}ƒ“ƒh‚ðushow wv‚âushow cv‚ƌĂԕK‘R«‚Í‚ ‚è‚Ü‚¹‚ñ‚Ì‚ÅA
-‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ɇ‚킹‚ă}ƒEƒX‚̃NƒŠƒbƒN‚⃃jƒ…[‚̃AƒCƒeƒ€‚É‚µ‚Ä
-‚àŒ‹\‚Å‚·B
-
-‚Ü‚½‚ ‚È‚½‚ÍA•K—v‚È‚ç‚Î(ƒvƒƒOƒ‰ƒ}[‚Æ‚µ‚Ä“­‚¢‚Ä‚¢‚½‚ç)‚ ‚È‚½‚̌ٗpŽåA
-‚ ‚é‚¢‚Íꇂɂæ‚Á‚Ä‚ÍŠwZ‚©‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ÉŠÖ‚·‚éu’˜ìŒ •úŠüº–¾
-(copyright disclaimer)v‚É–¼‚µ‚Ä‚à‚炤‚ׂ«‚Å‚·BˆÈ‰º‚Í—á‚Å‚·‚Ì‚ÅA–¼
-‘O‚ð•Ï‚¦‚Ä‚­‚¾‚³‚¢:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
- (–ó:
-
- YoyodyneŽÐ‚Í‚±‚±‚ÉAJames Hacker‚É‚æ‚Á‚Ä‘‚©‚ꂽƒvƒƒOƒ‰ƒ€
- uGnomovisionv(ƒRƒ“ƒpƒCƒ‰‚Ö’Ê‚·ƒvƒƒOƒ‰ƒ€)‚ÉŠÖ‚·‚éˆêØ‚Ì’˜ìŒ ‚Ì—˜
- ‰v‚ð•úŠü‚µ‚Ü‚·B
-
- <Ty CoonŽ‚Ì–¼>A1989”N4ŒŽ1“ú
- Ty CoonA•›ŽÐ’·
-
- )
-
-‚±‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Å‚ÍA‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ð“Æè“I‚ȃvƒƒOƒ‰ƒ€
-‚É“‡‚·‚邱‚Æ‚ð”F‚ß‚Ä‚¢‚Ü‚¹‚ñB‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ªƒTƒuƒ‹[ƒ`ƒ“ƒ‰ƒCƒu
-ƒ‰ƒŠ‚È‚ç‚ÎA“Æè“I‚ȃAƒvƒŠƒP[ƒVƒ‡ƒ“‚Æ‚ ‚È‚½‚̃‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒ“ƒN‚·‚邱
-‚Æ‚ð‹–‰Â‚µ‚½‚Ù‚¤‚ª‚æ‚è•Ö—˜‚Å‚ ‚é‚Æl‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB‚à‚µ‚±‚ꂪ‚ ‚È
-‚½‚Ì–]‚Þ‚±‚Æ‚È‚ç‚ÎA‚±‚ÌŒ_–ñ‘‚Ì‘ã‚í‚è‚ÉGNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒöO—˜—p‹–‘ø
-Œ_–ñ‘‚ð“K—p‚µ‚Ä‚­‚¾‚³‚¢B
+ GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
+ ƒo[ƒWƒ‡ƒ“2A1991”N6ŒŽ
+ “ú–{Œê–óA2002”N5ŒŽ20“ú
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ ‚±‚Ì—˜—p‹–‘øŒ_–ñ‘‚ðAˆêŽšˆê‹å‚»‚Ì‚Ü‚Ü‚É•¡»‚µ”Еz‚·‚邱‚Æ‚Í‹–‰Â‚·‚éB
+ ‚µ‚©‚µ•ÏX‚Í”F‚ß‚È‚¢B
+
+ This is an unofficial translation of the GNU General Public License
+ into Japanese. It was not published by the Free Software Foundation,
+ and does not legally state the distribution terms for software that
+ uses the GNU GPL--only the original English text of the GNU GPL does
+ that. However, we hope that this translation will help Japanese
+ speakers understand the GNU GPL better.
+
+ (–ó: ˆÈ‰º‚ÍGNU General Public License‚Ì”ñŒöŽ®‚È“ú–{Œê–ó‚Å‚·B‚±‚ê‚̓t
+ ƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c(the Free Software Foundataion)‚É‚æ‚Á‚Ä”­•\‚³‚ꂽ
+ ‚à‚Ì‚Å‚Í‚È‚­AGNU GPL‚ð“K—p‚µ‚½ƒ\ƒtƒgƒEƒFƒA‚̔ЕzðŒ‚ð–@“I‚É—LŒø‚ÈŒ`
+ ‚Åq‚ׂ½‚à‚Ì‚Å‚Í‚ ‚è‚Ü‚¹‚ñB”ЕzðŒ‚Æ‚µ‚Ä‚ÍGNU GPL‚̉pŒê”ŃeƒLƒXƒg‚Å
+ Žw’肳‚ê‚Ä‚¢‚é‚à‚Ì‚Ì‚Ý‚ª—LŒø‚Å‚·B‚µ‚©‚µ‚È‚ª‚çAŽ„‚½‚¿‚Í‚±‚Ì–|–ó‚ªA
+ “ú–{Œê‚ðŽg—p‚·‚élX‚É‚Æ‚Á‚ÄGNU GPL‚ð‚æ‚è—Ç‚­—‰ð‚·‚é•‚¯‚ƂȂ邱‚Æ‚ð
+ –]‚ñ‚Å‚¢‚Ü‚·B)
+
+ –|–ó‚Í ”ª“c^s<mhatta@gnu.org>‚ªs‚Á‚½BŒ´•¶‚Í
+ http://www.gnu.org/licenses/gpl.txt‚Å‚ ‚éBŒë–ó‚ÌŽw“E‚â‰ü‘PˆÄ‚ðŠ½Œ}‚·
+ ‚éB
+ ‚Í‚¶‚ß‚É
+
+ƒ\ƒtƒgƒEƒFƒAŒü‚¯ƒ‰ƒCƒZƒ“ƒX‚̑唼‚ÍA‚ ‚È‚½‚ª‚»‚̃\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½
+‚è•ÏX‚µ‚½‚è‚·‚鎩—R‚ð’D‚¤‚悤‚ÉÝŒv‚³‚ê‚Ä‚¢‚Ü‚·B‘ÎÆ“I‚ÉAGNU ˆê”ÊŒö
+O—˜—p‹–‘øŒ_–ñ‘‚ÍA‚ ‚È‚½‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚ð‹¤—L‚µ‚½‚è•ÏX‚µ‚½‚è‚·
+‚鎩—R‚ð•ÛØ‚·‚é--‚·‚È‚í‚¿Aƒ\ƒtƒgƒEƒFƒA‚ª‚»‚̃†[ƒU‚·‚ׂĂɂƂÁ‚ătƒŠ[
+‚Å‚ ‚邱‚Æ‚ð•ÛØ‚·‚邱‚Æ‚ð–Ú“I‚Æ‚µ‚Ä‚¢‚Ü‚·B‚±‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
+‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚̃\ƒtƒgƒEƒFƒA‚Ì‚Ù‚Æ‚ñ‚Ç‚É“K—p‚³‚ê‚Ä‚¨‚èA‚Ü‚½
+GNU GPL‚ð“K—p‚·‚é‚ÆŒˆ‚ß‚½ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’cˆÈŠO‚ÌìŽÒ‚É‚æ‚éƒvƒƒO
+ƒ‰ƒ€‚É‚à“K—p‚³‚ê‚Ä‚¢‚Ü‚·(‚¢‚­‚‚©‚̃tƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚̃\ƒtƒgƒEƒF
+ƒA‚É‚ÍAGNU GPL‚Å‚Í‚È‚­GNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚ª“K—p‚³‚ê
+‚Ä‚¢‚邱‚Æ‚à‚ ‚è‚Ü‚·)B‚ ‚È‚½‚à‚Ü‚½A‚²Ž©•ª‚̃vƒƒOƒ‰ƒ€‚ÉGNU GPL‚ð“K—p
+‚·‚邱‚Æ‚ª‰Â”\‚Å‚·B
+
+Ž„‚½‚¿‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚ÆŒ¾‚¤‚Æ‚«A‚»‚ê‚Í—˜—p‚ÌŽ©—R‚ɂ‚¢‚ÄŒ¾‹y‚µ‚Ä
+‚¢‚é‚Ì‚Å‚ ‚Á‚ÄA‰¿Ši‚Í–â‘è‚É‚µ‚Ä‚¢‚Ü‚¹‚ñBŽ„‚½‚¿‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ
+‘‚ÍA‚ ‚È‚½‚ªƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚·‚鎩—R‚ð•ÛØ‚·‚é‚悤Ý
+Œv‚³‚ê‚Ä‚¢‚Ü‚·(Šó–]‚ɉž‚¶‚Ä‚»‚ÌŽí‚̃T[ƒrƒX‚ÉŽè”—¿‚ð‰Û‚·Ž©—R‚à•ÛØ‚³
+‚ê‚Ü‚·)B‚Ü‚½A‚ ‚È‚½‚ªƒ\[ƒXƒR[ƒh‚ðŽó‚¯Žæ‚é‚©A‚ ‚é‚¢‚Í–]‚߂΂»‚ê‚ð
+“üŽè‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚é‚Æ‚¢‚¤‚±‚ÆA‚ ‚È‚½‚ªƒ\ƒtƒgƒEƒFƒA‚ð•ÏX‚µA‚»‚Ì
+ˆê•”‚ðV‚½‚ȃtƒŠ[‚̃vƒƒOƒ‰ƒ€‚Å—˜—p‚Å‚«‚é‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚ÄAˆÈã‚Åq
+‚ׂ½‚悤‚È‚±‚Æ‚ª‚Å‚«‚é‚Æ‚¢‚¤‚±‚Æ‚ª‚ ‚È‚½‚É’m‚炳‚ê‚é‚Æ‚¢‚¤‚±‚Æ‚à•ÛØ‚³
+‚ê‚Ü‚·B
+
+‚ ‚È‚½‚ÌŒ —˜‚ðŽç‚邽‚ßAŽ„‚½‚¿‚Í’N‚©‚ª‚ ‚È‚½‚Ì—L‚·‚邱‚ê‚ç‚ÌŒ —˜‚ð”Û’è
+‚·‚邱‚Æ‚âA‚±‚ê‚ç‚ÌŒ —˜‚ð•úŠü‚·‚é‚悤—v‹‚·‚邱‚Æ‚ð‹ÖŽ~‚·‚é‚Æ‚¢‚¤§ŒÀ
+‚ð‰Á‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B‚æ‚Á‚ÄA‚ ‚È‚½‚ªƒ\ƒtƒgƒEƒFƒA‚Ì•¡»•¨‚ð”Еz‚µ‚½
+‚è‚»‚ê‚ð•ÏX‚µ‚½‚è‚·‚éꇂɂÍA‚±‚ê‚ç‚̧ŒÀ‚Ì‚½‚ß‚É‚ ‚È‚½‚É‚ ‚éŽí‚ÌÓ
+”C‚ª”­¶‚·‚邱‚Æ‚É‚È‚è‚Ü‚·B
+
+—Ⴆ‚ÎA‚ ‚È‚½‚ªƒtƒŠ[‚ȃvƒƒOƒ‰ƒ€‚Ì•¡»•¨‚ð”Еz‚·‚éê‡A—L—¿‚©–³—¿‚É
+ŠÖ‚í‚炸A‚ ‚È‚½‚ÍŽ©•ª‚ª—L‚·‚錠—˜‚ð‘S‚ÄŽó—ÌŽÒ‚É—^‚¦‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
+‚Ü‚½A‚ ‚È‚½‚͔ނç‚àƒ\[ƒXƒR[ƒh‚ðŽó‚¯Žæ‚é‚©Žè‚É“ü‚ê‚邱‚Æ‚ª‚Å‚«‚é‚悤
+•ÛØ‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚»‚µ‚ÄA‚ ‚È‚½‚͔ނç‚ɑ΂µ‚Ĉȉº‚Åq‚ׂéðŒ
+‚ðŽ¦‚µA”Þ‚ç‚ÉŽ©‚ç‚ÌŽ‚ÂŒ —˜‚ɂ‚¢‚Ä’m‚炵‚ß‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹
+‚ñB
+
+Ž„‚½‚¿‚Í‚ ‚È‚½‚ÌŒ —˜‚ð“ñ’iŠK‚̎臂𓥂ñ‚ŕی삵‚Ü‚·B(1) ‚Ü‚¸ƒ\ƒtƒgƒEƒF
+ƒA‚ɑ΂µ‚Ä’˜ìŒ ‚ðŽå’£‚µA‚»‚µ‚Ä (2) ‚ ‚È‚½‚ɑ΂µ‚ÄAƒ\ƒtƒgƒEƒFƒA‚Ì•¡
+»‚â”Еz‚Ü‚½‚͉ü•Ï‚ɂ‚¢‚Ä‚Ì–@“I‚È‹–‰Â‚ð—^‚¦‚邱‚ÌŒ_–ñ‘‚ð’ñŽ¦‚µ‚Ü‚·B
+
+‚Ü‚½AŠeìŽÒ‚⎄‚½‚¿‚ð•ÛŒì‚·‚邽‚ßAŽ„‚½‚¿‚Í‚±‚̃tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚É‚Í
+‰½‚Ì•ÛØ‚à–³‚¢‚Æ‚¢‚¤‚±‚Æ‚ð’N‚à‚ªŠmŽÀ‚É—‰ð‚·‚é‚悤‚É‚µA‚Ü‚½ƒ\ƒtƒgƒEƒF
+ƒA‚ª’N‚©‘¼l‚É‚æ‚Á‚ĉü•Ï‚³‚êA‚»‚ꂪŽŸX‚ƔЕz‚³‚ê‚Ä‚¢‚Á‚½‚Æ‚µ‚Ä‚àA‚»
+‚ÌŽó—̎҂͔ނ炪Žè‚É“ü‚ꂽƒ\ƒtƒgƒEƒFƒA‚ªƒIƒŠƒWƒiƒ‹‚̃o[ƒWƒ‡ƒ“‚Å‚Í–³‚¢
+‚±‚ÆA‚»‚µ‚ÄŒ´ìŽÒ‚Ì–¼º‚Í‘¼l‚É‚æ‚Á‚ÄŽ‚¿ž‚܂ꂽ‰Â”\«‚Ì‚ ‚é–â‘è‚É‚æ‚Á
+‚ĉe‹¿‚³‚ê‚邱‚Æ‚ª‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚ðŽü’m‚³‚¹‚½‚¢‚ÆŽv‚¢‚Ü‚·B
+
+ÅŒã‚ÉAƒ\ƒtƒgƒEƒFƒA“Á‹–‚ª‚¢‚©‚È‚éƒtƒŠ[‚̃vƒƒOƒ‰ƒ€‚Ì‘¶Ý‚É‚à•s’f‚Ì‹º
+ˆÐ‚ð“Š‚°‚©‚¯‚Ä‚¢‚Ü‚·‚ªAŽ„‚½‚¿‚ÍAƒtƒŠ[‚ȃvƒƒOƒ‰ƒ€‚ÌĔЕzŽÒ‚ªŒÂX‚É
+“Á‹–ƒ‰ƒCƒZƒ“ƒX‚ðŽæ“¾‚·‚邱‚Æ‚É‚æ‚Á‚ÄAŽ–ŽÀãƒvƒƒOƒ‰ƒ€‚ð“Æè“I‚É‚µ‚Ä‚µ
+‚Ü‚¤‚Æ‚¢‚¤ŠëŒ¯‚ð”ð‚¯‚½‚¢‚ÆŽv‚¢‚Ü‚·B‚±‚¤‚¢‚Á‚½Ž–‘Ô‚ð—\–h‚·‚邽‚ßAŽ„‚½
+‚¿‚Í‚¢‚©‚È‚é“Á‹–‚à’N‚à‚ªŽ©—R‚É—˜—p‚Å‚«‚é‚悤ƒ‰ƒCƒZƒ“ƒX‚³‚ê‚é‚©A‘S‚­ƒ‰
+ƒCƒZƒ“ƒX‚³‚ê‚È‚¢‚©‚Ì‚Ç‚¿‚ç‚©‚Å‚È‚¯‚ê‚΂Ȃç‚È‚¢‚±‚Ƃ𖾊m‚É‚µ‚Ü‚µ‚½B
+
+(–ó’: –{Œ_–ñ‘‚Åu“Æè“I(proprietary)v‚Æ‚ÍAƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚âÄ”Ð
+•zA‰ü•Ï‚ª‹ÖŽ~‚³‚ê‚Ä‚¢‚é‚©A‹–‰Â‚𓾂邱‚Æ‚ª•K—v‚Æ‚³‚ê‚Ä‚¢‚é‚©A‚ ‚é‚¢
+‚ÍŒµ‚µ‚¢§ŒÀ‚ª‰Û‚¹‚ç‚ê‚Ä‚¢‚ÄŽ©—R‚É‚»‚¤‚·‚邱‚Æ‚ªŽ–ŽÀã‚Å‚«‚È‚­‚È‚Á‚Ä‚¢
+‚éó‘Ô‚Ì‚±‚Æ‚ðŽw‚·BÚ‚µ‚­‚Í
+http://www.gnu.org/philosophy/categories.ja.html#ProprietarySoftware‚ð
+ŽQÆ‚¹‚æB)
+
+•¡»‚â”ЕzA‰ü•Ï‚ɂ‚¢‚Ă̳Šm‚ÈðŒ‚Ƨ–ñ‚ðˆÈ‰º‚Åq‚ׂĂ¢‚«‚Ü‚·B
+
+ GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
+ •¡»A”ЕzA‰ü•Ï‚ÉŠÖ‚·‚éðŒ‚Ƨ–ñ
+
+0. ‚±‚Ì—˜—p‹–‘øŒ_–ñ‘‚ÍA‚»‚̃vƒƒOƒ‰ƒ€(‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’˜ì•¨)‚ð‚±‚Ìˆê
+”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Ì’è‚ß‚éðŒ‚̉º‚ŔЕz‚Å‚«‚é‚Æ‚¢‚¤’m‚ª’˜ìŒ ŽÒ‚É
+‚æ‚Á‚Ä‹LÚ‚³‚ꂽƒvƒƒOƒ‰ƒ€‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’˜ì•¨‘S”Ê‚É“K—p‚³‚ê‚éBˆÈ‰º‚Å
+‚ÍAuwƒvƒƒOƒ‰ƒ€xv‚Æ‚Í‚»‚̂悤‚É‚µ‚Ä‚±‚ÌŒ_–ñ‘‚ª“K—p‚³‚ꂽƒvƒƒOƒ‰
+ƒ€‚⒘앨‘S”Ê‚ðˆÓ–¡‚µA‚Ü‚½uwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨v‚Æ‚Íwƒv
+ƒƒOƒ‰ƒ€x‚â‚»‚Ì‘¼’˜ìŒ –@‚̉º‚Å”h¶•¨‚ÆŒ©‚È‚³‚ê‚é‚à‚Ì‘S”Ê‚ðŽw‚·B‚·‚È
+‚í‚¿AwƒvƒƒOƒ‰ƒ€x‚©‚»‚̈ꕔ‚ðA‘S‚­“¯ˆê‚Ì‚Ü‚Ü‚©A‰ü•Ï‚ð‰Á‚¦‚½‚©A‚ 
+‚é‚¢‚Í‘¼‚ÌŒ¾Œê‚É–|–󂳂ꂽŒ`‚ÅŠÜ‚Þ’˜ì•¨‚Ì‚±‚Æ‚Å‚ ‚é(u‰ü•Ïv‚Æ‚¢‚¤Œê
+‚Ì–{—ˆ‚̈Ӗ¡‚©‚ç‚Í‚¸‚ê‚邪AˆÈ‰º‚Å‚Í–|–ó‚à‰ü•Ï‚̈êŽí‚ÆŒ©‚È‚·)B‚»‚ꂼ
+‚ê‚ÌŒ_–ñŽÒ‚Íu‚ ‚È‚½v‚Æ•\Œ»‚³‚ê‚éB
+
+•¡»‚â”ЕzA‰ü•ÏˆÈŠO‚ÌŠˆ“®‚Í‚±‚ÌŒ_–ñ‘‚ł̓Jƒo[‚³‚ê‚È‚¢B‚»‚ê‚ç‚Í‚±‚Ì
+Œ_–ñ‘‚Ì‘ÎÛŠO‚Å‚ ‚éBwƒvƒƒOƒ‰ƒ€x‚ðŽÀs‚·‚ésˆ×Ž©‘̂ɧŒÀ‚Í‚È‚¢B‚Ü
+‚½A‚»‚̂悤‚ÈwƒvƒƒOƒ‰ƒ€x‚Ìo—ÍŒ‹‰Ê‚ÍA‚»‚Ì“à—e‚ªwƒvƒƒOƒ‰ƒ€x‚ðŠî
+‚É‚µ‚½’˜ì•¨‚ð\¬‚·‚éꇂ݂̂±‚ÌŒ_–ñ‘‚É‚æ‚Á‚ĕی삳‚ê‚é(wƒvƒƒOƒ‰
+ƒ€x‚ðŽÀs‚µ‚½‚±‚Æ‚É‚æ‚Á‚Ä쬂³‚ꂽ‚Æ‚¢‚¤‚±‚Æ‚Æ‚Í–³ŠÖŒW‚Å‚ ‚é)B‚±‚Ì
+‚悤‚Èüˆø‚«‚̑Ó–«‚ÍAwƒvƒƒOƒ‰ƒ€x‚ª‰½‚ð‚·‚é‚Ì‚©‚Ɉˑ¶‚·‚éB
+
+1. ‚»‚ꂼ‚ê‚Ì•¡»•¨‚É‚¨‚¢‚Ä“KØ‚È’˜ìŒ •\Ž¦‚Æ•Û؂̔۔Fº–¾(disclaimer
+of warranty)‚ð–Ú—§‚‚悤“KØ‚ÉŒfÚ‚µA‚Ü‚½‚±‚ÌŒ_–ñ‘‚¨‚æ‚шêØ‚Ì•ÛØ‚Ì
+•sÝ‚ÉG‚ꂽ’m‚·‚×‚Ä‚ð‚»‚Ì‚Ü‚ÜŽc‚µA‚»‚µ‚Ä‚±‚ÌŒ_–ñ‘‚Ì•¡»•¨‚ðwƒvƒ
+ƒOƒ‰ƒ€x‚Ì‚¢‚©‚È‚éŽó—ÌŽÒ‚É‚àwƒvƒƒOƒ‰ƒ€x‚Æ‹¤‚ɔЕz‚·‚éŒÀ‚èA‚ ‚È‚½‚Í
+wƒvƒƒOƒ‰ƒ€x‚̃\[ƒXƒR[ƒh‚Ì•¡»•¨‚ðA‚ ‚È‚½‚ªŽó‚¯Žæ‚Á‚½’Ê‚è‚ÌŒ`‚Å•¡
+»‚Ü‚½‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚éB”}‘Ì‚Í–â‚í‚È‚¢B
+
+‚ ‚È‚½‚ÍA•¨—“I‚É•¡»•¨‚ð÷“n‚·‚é‚Æ‚¢‚¤sˆ×‚ÉŠÖ‚µ‚ÄŽè”—¿‚ð‰Û‚µ‚Ä‚à—Ç
+‚¢‚µAŠó–]‚É‚æ‚Á‚Ä‚ÍŽè”—¿‚ðŽæ‚Á‚ÄŒðŠ·‚É‚¨‚¯‚é•ÛŒì‚Ì•ÛØ‚ð’ñ‹Ÿ‚µ‚Ä‚à—Ç
+‚¢B
+
+2. ‚ ‚È‚½‚ÍŽ©•ª‚ÌwƒvƒƒOƒ‰ƒ€x‚Ì•¡»•¨‚©‚»‚̈ꕔ‚ð‰ü•Ï‚µ‚ÄwƒvƒƒOƒ‰
+ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨‚ðŒ`¬‚µA‚»‚̂悤‚ȉü•Ï“_‚⒘앨‚ðã‹L‘æ1ß‚Ì’è
+‚ß‚éðŒ‚̉º‚Å•¡»‚Ü‚½‚͔Еz‚·‚邱‚Æ‚ª‚Å‚«‚éB‚½‚¾‚µA‚»‚Ì‚½‚߂ɂ͈ȉº
+‚ÌðŒ‚·‚ׂĂ𖞂½‚µ‚Ä‚¢‚È‚¯‚ê‚΂Ȃç‚È‚¢:
+
+ a) ‚ ‚È‚½‚ª‚»‚ê‚ç‚̃tƒ@ƒCƒ‹‚ð•ÏX‚µ‚½‚Æ‚¢‚¤‚±‚Æ‚Æ•ÏX‚µ‚½“úŽž‚ª—Ç
+ ‚­•ª‚©‚é‚悤A‰ü•Ï‚³‚ꂽƒtƒ@ƒCƒ‹‚ÉŽ¦‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B
+
+ b) wƒvƒƒOƒ‰ƒ€x‚Ü‚½‚Í‚»‚̈ꕔ‚ðŠÜ‚Þ’˜ì•¨A‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x
+ ‚©‚»‚̈ꕔ‚©‚ç”h¶‚µ‚½’˜ì•¨‚ð”Еz‚ ‚é‚¢‚Í”­•\‚·‚éꇂɂÍA‚»‚Ì‘S
+ ‘Ì‚ð‚±‚ÌŒ_–ñ‘‚ÌðŒ‚É]‚Á‚Ä‘æŽOŽÒ‚Ö–³ž‚Å—˜—p‹–‘ø‚µ‚È‚¯‚ê‚΂Ȃç‚È
+ ‚¢B
+
+ c) ‰ü•Ï‚³‚ꂽƒvƒƒOƒ‰ƒ€‚ªA’ÊíŽÀs‚·‚éۂɑΘb“I‚ɃRƒ}ƒ“ƒh‚ð“Ç‚Þ
+ ‚悤‚É‚È‚Á‚Ä‚¢‚é‚È‚ç‚ÎA‚»‚̃vƒƒOƒ‰ƒ€‚ðÅ‚àˆê”Ê“I‚È•û–@‚őΘb“I‚É
+ ŽÀs‚·‚éÛA“KØ‚È’˜ìŒ •\Ž¦A–³•ÛØ‚Å‚ ‚邱‚Æ(‚ ‚é‚¢‚Í‚ ‚È‚½‚ª•Û
+ Ø‚ð’ñ‹Ÿ‚·‚é‚Æ‚¢‚¤‚±‚Æ)Aƒ†[ƒU‚ªƒvƒƒOƒ‰ƒ€‚ð‚±‚ÌŒ_–ñ‘‚Åq‚ׂ½ð
+ Œ‚̉º‚ŔЕz‚·‚邱‚Æ‚ª‚Å‚«‚é‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚Ä‚±‚ÌŒ_–ñ‘‚Ì•¡»•¨‚ð
+ ‰{——‚·‚é‚É‚Í‚Ç‚¤‚µ‚½‚ç‚æ‚¢‚©‚Æ‚¢‚¤ƒ†[ƒU‚Ö‚Ìà–¾‚ðŠÜ‚Þ’m‚ªˆóü‚³
+ ‚ê‚é‚©A‚ ‚é‚¢‚͉æ–Ê‚É•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢(—áŠO‚Æ‚µ
+ ‚ÄAwƒvƒƒOƒ‰ƒ€x‚»‚Ì‚à‚̂͑Θb“I‚Å‚ ‚Á‚Ä‚à’Êí‚»‚̂悤‚È’m‚ðˆó
+ ü‚µ‚È‚¢ê‡‚É‚ÍAwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½‚ ‚È‚½‚Ì’˜ì•¨‚É‚»‚̂悤
+ ‚È’m‚ðˆóü‚³‚¹‚é•K—v‚Í‚È‚¢)B
+
+ˆÈã‚Ì•K—vðŒ‚Í‘S‘Ì‚Æ‚µ‚Ẳü•Ï‚³‚ꂽ’˜ì•¨‚É“K—p‚³‚ê‚éB’˜ì•¨‚̈ꕔ
+‚ªwƒvƒƒOƒ‰ƒ€x‚©‚ç”h¶‚µ‚½‚à‚Ì‚Å‚Í‚È‚¢‚ÆŠm”F‚Å‚«A‚»‚ê‚玩g•Ê‚Ì“Æ—§
+‚µ‚½’˜ì•¨‚Å‚ ‚é‚Ƈ—“I‚Él‚¦‚ç‚ê‚é‚È‚ç‚ÎA‚ ‚È‚½‚ª‚»‚ê‚ç‚ð•Ê‚Ì’˜ì•¨
+‚Æ‚µ‚Ä•ª‚¯‚ĔЕz‚·‚éê‡A‚»‚¤‚¢‚Á‚½•”•ª‚É‚Í‚±‚ÌŒ_–ñ‘‚Æ‚»‚ÌðŒ‚Í
+“K—p‚³‚ê‚È‚¢B‚µ‚©‚µA‚ ‚È‚½‚ª“¯‚¶•”•ª‚ðwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨
+‘S‘̂̈ꕔ‚Æ‚µ‚ĔЕz‚·‚é‚È‚ç‚ÎA‘S‘Ì‚Æ‚µ‚Ă̔Еz•¨‚ÍA‚±‚ÌŒ_–ñ‘‚ª
+‰Û‚·ðŒ‚É]‚í‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚Æ‚¢‚¤‚Ì‚ÍA‚±‚ÌŒ_–ñ‘‚ª‘¼‚ÌŒ_–ñŽÒ
+‚É—^‚¦‚é‹–‰Â‚ÍwƒvƒƒOƒ‰ƒ€xŠÛ‚²‚Æ‘S‘Ì‚É‹y‚ÑA’N‚ª‘‚¢‚½‚©‚ÍŠÖŒW‚È‚­Še
+•”•ª‚Ì‚·‚ׂĂð•ÛŒì‚·‚é‚©‚ç‚Å‚ ‚éB
+
+‚æ‚Á‚ÄA‚·‚ׂĂ ‚È‚½‚É‚æ‚Á‚Ä‘‚©‚ꂽ’˜ì•¨‚ɑ΂µAŒ —˜‚ðŽå’£‚µ‚½‚è‚ ‚È
+‚½‚ÌŒ —˜‚Ɉًc‚ð\‚µ—§‚Ă邱‚Æ‚Í‚±‚Ì߂̈Ó}‚·‚é‚Æ‚±‚ë‚Å‚Í‚È‚¢B‚Þ‚µ‚ëA
+‚»‚ÌŽïŽ|‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½”h¶•¨‚È‚¢‚µW‡’˜ì•¨‚̔Еz‚ðŠÇ—‚·
+‚錠—˜‚ðsŽg‚·‚é‚Æ‚¢‚¤‚±‚Æ‚É‚ ‚éB
+
+‚Ü‚½AwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚Ä‚¢‚È‚¢‚»‚Ì‘¼‚Ì’˜ì•¨‚ðwƒvƒƒOƒ‰ƒ€x(‚ 
+‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨)‚ƈê‚ÉW‚ß‚½‚¾‚¯‚Ì‚à‚Ì‚ðˆêŠª‚Ì
+•ÛŠÇ‘•’u‚È‚¢‚µ”Еz”}‘Ì‚ÉŽû‚ß‚Ä‚àA‚»‚Ì‘¼‚Ì’˜ì•¨‚Ü‚Å‚±‚ÌŒ_–ñ‘‚ª•Û
+Œì‚·‚é‘ÎÛ‚É‚È‚é‚Æ‚¢‚¤‚±‚Æ‚É‚Í‚È‚ç‚È‚¢B
+
+3. ‚ ‚È‚½‚Íã‹L‘æ1ß‚¨‚æ‚Ñ2ß‚ÌðŒ‚É]‚¢AwƒvƒƒOƒ‰ƒ€x(‚ ‚é‚¢‚Í‘æ2
+ß‚É‚¨‚¯‚é”h¶•¨)‚ðƒIƒuƒWƒFƒNƒgƒR[ƒh‚È‚¢‚µŽÀsŒ`Ž®‚Å•¡»‚Ü‚½‚͔Еz‚·
+‚邱‚Æ‚ª‚Å‚«‚éB‚½‚¾‚µA‚»‚Ìꇂ ‚È‚½‚͈ȉº‚Ì‚¤‚¿‚Ç‚ê‚©ˆê‚‚ðŽÀŽ{‚µ‚È
+‚¯‚ê‚΂Ȃç‚È‚¢:
+
+ a) ’˜ì•¨‚ÉAwƒvƒƒOƒ‰ƒ€x‚ɑΉž‚µ‚½Š®‘S‚©‚‹@ŠB‚Å“Ç‚ÝŽæ‚è‰Â”\‚È
+ ƒ\[ƒXƒR[ƒh‚ð“Y•t‚·‚éB‚½‚¾‚µAƒ\[ƒXƒR[ƒh‚Íã‹L‘æ1ß‚¨‚æ‚Ñ2ß‚Ì
+ ðŒ‚É]‚¢ƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚ÅKŠµ“I‚ÉŽg‚í‚ê‚é”}‘̂ŔЕz‚µ‚È‚¯‚ê‚Î
+ ‚È‚ç‚È‚¢B‚ ‚é‚¢‚ÍA
+
+ b) ’˜ì•¨‚ÉA‚¢‚©‚È‚é‘æŽOŽÒ‚ɑ΂µ‚Ä‚àAwƒvƒƒOƒ‰ƒ€x‚ɑΉž‚µ‚½Š®
+ ‘S‚©‚‹@ŠB‚Å“Ç‚ÝŽæ‚è‰Â”\‚ȃ\[ƒXƒR[ƒh‚ðA”Еz‚É—v‚·‚镨—“IƒRƒXƒg
+ ‚ðã‰ñ‚ç‚È‚¢’ö“x‚ÌŽè”—¿‚ƈø‚«Š·‚¦‚É’ñ‹Ÿ‚·‚éŽ|q‚ׂ½­‚È‚­‚Æ‚à3”N
+ ŠÔ‚Í—LŒø‚È‘–Ê‚É‚È‚Á‚½\‚µo‚ð“Y‚¦‚éB‚½‚¾‚µAƒ\[ƒXƒR[ƒh‚Íã‹L‘æ
+ 1ß‚¨‚æ‚Ñ2ß‚ÌðŒ‚É]‚¢ƒ\ƒtƒgƒEƒFƒA‚ÌŒðŠ·‚ÅKŠµ“I‚ÉŽg‚í‚ê‚é”}‘Ì‚Å
+ ”Еz‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢B‚ ‚é‚¢‚ÍA
+
+ c) ‘Ήž‚·‚éƒ\[ƒXƒR[ƒh”Еz‚Ì\‚µo‚ÉÛ‚µ‚ÄA‚ ‚È‚½‚ª“¾‚½î•ñ‚ðˆê
+ ‚Ɉø‚«“n‚·(‚±‚Ì‘I‘ðŽˆ‚ÍA‰c—˜‚ð–Ú“I‚Æ‚µ‚È‚¢”Еz‚Å‚ ‚Á‚ÄA‚©‚‚ 
+ ‚È‚½‚ªã‹L¬ßb‚ÅŽw’肳‚ê‚Ä‚¢‚é‚悤‚È\‚µo‚Æ‹¤‚ɃIƒuƒWƒFƒNƒgƒR[
+ ƒh‚ ‚é‚¢‚ÍŽÀsŒ`Ž®‚̃vƒƒOƒ‰ƒ€‚µ‚©“üŽè‚µ‚Ä‚¢‚È‚¢ê‡‚ÉŒÀ‚è‹–‰Â‚³‚ê
+ ‚é)B
+
+’˜ì•¨‚̃\[ƒXƒR[ƒh‚Æ‚ÍA‚»‚ê‚ɑ΂µ‚ĉü•Ï‚ð‰Á‚¦‚éã‚ÅD‚Ü‚µ‚¢‚Æ‚³‚ê‚é
+’˜ì•¨‚ÌŒ`Ž®‚ðˆÓ–¡‚·‚éB‚ ‚éŽÀsŒ`Ž®‚Ì’˜ì•¨‚É‚Æ‚Á‚ÄŠ®‘S‚ȃ\[ƒXƒR[ƒh
+‚Æ‚ÍA‚»‚ꂪŠÜ‚Þƒ‚ƒWƒ…[ƒ‹‚·‚ׂẴ\[ƒXƒR[ƒh‘S•”‚ɉÁ‚¦AŠÖ˜A‚·‚éƒCƒ“
+ƒ^[ƒtƒF[ƒX’è‹`ƒtƒ@ƒCƒ‹‚Ì‚·‚ׂĂƃ‰ƒCƒuƒ‰ƒŠ‚̃Rƒ“ƒpƒCƒ‹‚âƒCƒ“ƒXƒg[ƒ‹
+‚ð§Œä‚·‚邽‚ß‚ÉŽg‚í‚ê‚éƒXƒNƒŠƒvƒg‚ð‚à‰Á‚¦‚½‚à‚Ì‚ðˆÓ–¡‚·‚éB‚µ‚©‚µ“Á•Ê
+‚È—áŠO‚Æ‚µ‚ÄA‚»‚̃Rƒ“ƒ|[ƒlƒ“ƒgŽ©‘Ì‚ªŽÀsŒ`Ž®‚É•t‚·‚é‚Ì‚Å‚Í–³‚¢ŒÀ‚èA
+”Еz‚³‚ê‚é‚à‚Ì‚Ì’†‚ÉAŽÀsŒ`Ž®‚ªŽÀs‚³‚ê‚éƒIƒyƒŒ[ƒeƒBƒ“ƒOƒVƒXƒeƒ€‚ÌŽå
+—v‚ȃRƒ“ƒ|[ƒlƒ“ƒg(ƒRƒ“ƒpƒCƒ‰‚âƒJ[ƒlƒ‹“™)‚Æ’Êíˆê‚É(ƒ\[ƒX‚©ƒoƒCƒi
+ƒŠŒ`Ž®‚Ì‚Ç‚¿‚ç‚©‚Å)”Еz‚³‚ê‚é‚à‚Ì‚ðŠÜ‚ñ‚Å‚¢‚é•K—v‚Í‚È‚¢‚Æ‚·‚éB
+
+ŽÀsŒ`Ž®‚Ü‚½‚̓IƒuƒWƒFƒNƒgƒR[ƒh‚̔Еz‚ªAŽw’肳‚ꂽꊂ©‚çƒRƒs[‚·‚é
+‚½‚߂̃AƒNƒZƒXŽè’i‚ð’ñ‹Ÿ‚·‚邱‚Ƃňׂ³‚ê‚é‚Æ‚µ‚ÄA‚»‚Ìã‚Ń\[ƒXƒR[ƒh
+‚à“¯“™‚̃AƒNƒZƒXŽè’i‚É‚æ‚Á‚Ä“¯‚¶êŠ‚©‚çƒRƒs[‚Å‚«‚é‚悤‚É‚È‚Á‚Ä‚¢‚é‚È
+‚ç‚ÎA‘æŽOŽÒ‚ªƒIƒuƒWƒFƒNƒgƒR[ƒh‚ƈê‚Ƀ\[ƒX‚à‹­§“I‚ɃRƒs[‚³‚¹‚ç‚ê
+‚é‚悤‚É‚È‚Á‚Ä‚¢‚È‚­‚Ä‚àƒ\[ƒXƒR[ƒh”Еz‚ÌðŒ‚ð–ž‚½‚µ‚Ä‚¢‚é‚à‚Ì‚Æ‚·‚éB
+
+4. ‚ ‚È‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ðA‚±‚ÌŒ_–ñ‘‚É‚¨‚¢‚Ä–¾Šm‚É’ñŽ¦‚³‚ꂽs
+ˆ×‚𜂫•¡»‚â‰ü•ÏAƒTƒuƒ‰ƒCƒZƒ“ƒXA‚ ‚é‚¢‚͔Еz‚µ‚Ä‚Í‚È‚ç‚È‚¢B‘¼‚É
+wƒvƒƒOƒ‰ƒ€x‚ð•¡»‚â‰ü•ÏAƒTƒuƒ‰ƒCƒZƒ“ƒXA‚ ‚é‚¢‚͔Еz‚·‚éŠé‚Ä‚Í‚·‚×
+‚Ä–³Œø‚Å‚ ‚èA‚±‚ÌŒ_–ñ‘‚̉º‚Å‚Ì‚ ‚È‚½‚ÌŒ —˜‚ðŽ©“®“I‚ÉIŒ‹‚³‚¹‚邱
+‚ƂɂȂ낤B‚µ‚©‚µA•¡»•¨‚⌠—˜‚ð‚±‚ÌŒ_–ñ‘‚É]‚Á‚Ä‚ ‚È‚½‚©‚瓾‚½
+lX‚ÉŠÖ‚µ‚Ä‚ÍA‚»‚̂悤‚ÈlX‚ª‚±‚ÌŒ_–ñ‘‚ÉŠ®‘S‚É]‚Á‚Ä‚¢‚éŒÀ‚è”Þ
+‚ç‚̃‰ƒCƒZƒ“ƒX‚Ü‚ÅIŒ‹‚·‚邱‚Æ‚Í‚È‚¢B
+
+5. ‚ ‚È‚½‚Í‚±‚ÌŒ_–ñ‘‚ðŽó‘ø‚·‚é•K—v‚Í–³‚¢B‚Æ‚¢‚¤‚Ì‚ÍA‚ ‚È‚½‚Í‚±
+‚ê‚É–¼‚µ‚Ä‚¢‚È‚¢‚©‚ç‚Å‚ ‚éB‚µ‚©‚µA‚±‚ÌŒ_–ñ‘ˆÈŠO‚É‚ ‚È‚½‚ɑ΂µ
+‚ÄwƒvƒƒOƒ‰ƒ€x‚â‚»‚Ì”h¶•¨‚ð•ÏXA”Еz‚·‚é‹–‰Â‚ð—^‚¦‚é‚à‚Ì‚Í‘¶Ý‚µ‚È
+‚¢B‚±‚ê‚ç‚Ìsˆ×‚ÍA‚ ‚È‚½‚ª‚±‚ÌŒ_–ñ‘‚ðŽó‚¯“ü‚ê‚È‚¢ŒÀ‚è–@‚É‚æ‚Á‚Ä
+‹Ö‚¶‚ç‚ê‚Ä‚¢‚éB‚»‚±‚ÅAwƒvƒƒOƒ‰ƒ€x(‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ
+‚½’˜ì•¨‚Ì‚·‚ׂÄ)‚ð‰ü•Ï‚È‚¢‚µ”Еz‚·‚邱‚Æ‚É‚æ‚èA‚ ‚È‚½‚ÍŽ©•ª‚ª‚»‚Ì‚æ
+‚¤‚Èsˆ×‚ðs‚¤‚½‚ß‚É‚±‚ÌŒ_–ñ‘‚ðŽó‘ø‚µ‚½‚Æ‚¢‚¤‚±‚ÆA‚»‚µ‚ÄwƒvƒƒO
+ƒ‰ƒ€x‚Æ‚»‚ê‚ÉŠî‚­’˜ì•¨‚Ì•¡»‚â”ЕzA‰ü•Ï‚ɂ‚¢‚Ä‚±‚ÌŒ_–ñ‘‚ª‰Û
+‚·§–ñ‚ÆðŒ‚ð‚·‚×‚ÄŽó‚¯“ü‚ꂽ‚Æ‚¢‚¤‚±‚Æ‚ðŽ¦‚µ‚½‚à‚Ì‚ÆŒ©‚È‚·B
+
+6. ‚ ‚È‚½‚ªwƒvƒƒOƒ‰ƒ€x(‚Ü‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ðŠî‚É‚µ‚½’˜ì•¨‘S”Ê)‚ð
+ĔЕz‚·‚邽‚Ñ‚ÉA‚»‚ÌŽó—ÌŽÒ‚ÍŒ³X‚̃‰ƒCƒZƒ“ƒX‹–‰ÂŽÒ‚©‚çA‚±‚ÌŒ_–ñ‘‚Å
+Žw’肳‚ꂽðŒ‚Ƨ–ñ‚̉º‚ÅwƒvƒƒOƒ‰ƒ€x‚ð•¡»‚â”ЕzA‚ ‚é‚¢‚͉ü•Ï‚·‚é
+‹–‰Â‚ðŽ©“®“I‚É“¾‚é‚à‚Ì‚Æ‚·‚éB‚ ‚È‚½‚ÍAŽó—ÌŽÒ‚ª‚±‚±‚Å”F‚ß‚ç‚ꂽŒ —˜‚ð
+sŽg‚·‚邱‚Æ‚ÉŠÖ‚µ‚Ä‚±‚êˆÈ㑼‚Ì‚¢‚©‚Ȃ駌À‚à‰Û‚·‚±‚Æ‚ª‚Å‚«‚È‚¢B‚ ‚È
+‚½‚É‚ÍA‘æŽOŽÒ‚ª‚±‚ÌŒ_–ñ‘‚É]‚¤‚±‚Æ‚ð‹­§‚·‚éÓ”C‚Í‚È‚¢B
+
+7. “Á‹–NŠQ‚ ‚é‚¢‚Í‚»‚Ì‘¼‚Ì——R(“Á‹–ŠÖŒW‚ÉŒÀ‚ç‚È‚¢)‚©‚çAÙ”»Š‚Ì”»Œˆ
+‚ ‚é‚¢‚Í\‚µ—§‚Ä‚ÌŒ‹‰Ê‚Æ‚µ‚Ä‚ ‚È‚½‚É(Ù”»Š–½—ß‚âŒ_–ñ‚È‚Ç‚É‚æ‚è)‚±‚ÌŒ_
+–ñ‘‚ÌðŒ‚Æ–µ‚‚·‚駖ñ‚ª‰Û‚³‚ꂽꇂłàA‚ ‚È‚½‚ª‚±‚ÌŒ_–ñ‘‚ÌðŒ‚ð
+–Æœ‚³‚ê‚é‚킯‚Å‚Í‚È‚¢B‚à‚µ‚±‚ÌŒ_–ñ‘‚̉º‚Å‚ ‚È‚½‚ɉۂ¹‚ç‚ꂽӔC‚Æ‘¼
+‚ÌŠÖ˜A‚·‚éÓ”C‚𓯎ž‚É–ž‚½‚·‚悤‚ÈŒ`‚ŔЕz‚Å‚«‚È‚¢‚È‚ç‚ÎAŒ‹‰Ê‚Æ‚µ‚Ä‚ 
+‚È‚½‚ÍwƒvƒƒOƒ‰ƒ€x‚ð”Еz‚·‚邱‚Æ‚ª‘S‚­‚Å‚«‚È‚¢‚Æ‚¢‚¤‚±‚Æ‚Å‚ ‚éB—Ⴆ
+‚ΓÁ‹–ƒ‰ƒCƒZƒ“ƒX‚ªA‚ ‚È‚½‚©‚ç’¼ÚŠÔÚ‚ð–â‚킸ƒRƒs[‚ðŽó‚¯Žæ‚Á‚½l‚ª’N
+‚Å‚àwƒvƒƒOƒ‰ƒ€x‚ðŽg—p—¿–³—¿‚ÅĔЕz‚·‚邱‚Æ‚ð”F‚ß‚Ä‚¢‚È‚¢ê‡A‚ ‚È
+‚½‚ª‚»‚̧–ñ‚Æ‚±‚ÌŒ_–ñ‘‚𗼕û‚Æ‚à–ž‚½‚·‚É‚ÍwƒvƒƒOƒ‰ƒ€x‚̔Еz‚ðŠ®‘S
+‚É’†Ž~‚·‚邵‚©‚È‚¢‚¾‚낤B
+
+‚±‚Ì߂̈ꕔ•ª‚ª“Á’è‚Ì󋵂̉º‚Å–³Œø‚È‚¢‚µŽÀŽ{•s‰Â”\‚ÈꇂłàAß‚ÌŽc
+‚è‚Ì•”•ª‚Í“K—p‚³‚ê‚é‚悤ˆÓ}‚³‚ê‚Ä‚¢‚éB‚»‚Ì‘¼‚Ì󋵂łÍß‚ª‘S‘Ì‚Æ‚µ‚Ä
+“K—p‚³‚ê‚é‚悤ˆÓ}‚³‚ê‚Ä‚¢‚éB
+
+“Á‹–‚â‚»‚Ì‘¼‚ÌàŽYŒ ‚ðNŠQ‚µ‚½‚èA‚»‚̂悤‚ÈŒ —˜‚ÌŽå’£‚ÌŒø—͂Ɉًc‚ð¥
+‚¦‚½‚è‚·‚é‚悤‚ ‚È‚½‚ð—U˜f‚·‚邱‚Æ‚ª‚±‚Ìß‚Ì–Ú“I‚Å‚Í‚È‚¢B‚±‚Ìß‚É‚ÍA
+lX‚É‚æ‚Á‚ă‰ƒCƒZƒ“ƒXŠµs‚Æ‚µ‚ÄŽÀŒ»‚³‚ê‚Ä‚«‚½AƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA”Еz
+‚̃VƒXƒeƒ€‚ÌŠ®‘S«‚ðŒì‚é‚Æ‚¢‚¤–Ú“I‚µ‚©‚È‚¢B‘½‚­‚ÌlX‚ªAƒtƒŠ[ƒ\ƒtƒg
+ƒEƒFƒA‚̔ЕzƒVƒXƒeƒ€‚ªŽñ”öˆêŠÑ‚µ‚Ä“K—p‚³‚ê‚Ä‚¢‚é‚Æ‚¢‚¤M—Š‚ÉŠî‚«A‚±
+‚̃VƒXƒeƒ€‚ð’Ê‚¶‚ĔЕz‚³‚ê‚鑽—l‚ȃ\ƒtƒgƒEƒFƒA‚ÉŠ°‘å‚ÈvŒ£‚ð‚µ‚Ä‚«‚½‚Ì
+‚ÍŽ–ŽÀ‚Å‚ ‚邪Al‚ª‚ǂ̂悤‚ȃVƒXƒeƒ€‚ð’Ê‚¶‚ă\ƒtƒgƒEƒFƒA‚ð”Еz‚µ‚½‚¢
+‚ÆŽv‚¤‚©‚Í‚ ‚­‚Ü‚Å‚àìŽÒ/Šñ—^ŽÒŽŸ‘æ‚Å‚ ‚èA‚ ‚È‚½‚ª‘I‘ð‚ð‰Ÿ‚µ‚‚¯‚邱
+‚Æ‚Í‚Å‚«‚È‚¢B
+
+‚±‚Ìß‚ÍA‚±‚ÌŒ_–ñ‘‚Ì‚±‚Ì߈ȊO‚Ì•”•ª‚̈ê‹AŒ‹‚É‚È‚é‚Æl‚¦‚ç‚ê‚éƒP[
+ƒX‚ð“O’ê“I‚É–¾‚ç‚©‚É‚·‚邱‚Æ‚ð–Ú“I‚Æ‚µ‚Ä‚¢‚éB
+
+8. wƒvƒƒOƒ‰ƒ€x‚̔Еz‚â—˜—p‚ªA‚ ‚é‘‚É‚¨‚¢‚Ä‚Í“Á‹–‚Ü‚½‚Í’˜ìŒ ‚ªŽå
+’£‚³‚ꂽƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì‚¢‚¸‚ê‚©‚É‚æ‚Á‚ħŒÀ‚³‚ê‚Ä‚¢‚éê‡AwƒvƒƒO
+ƒ‰ƒ€x‚É‚±‚ÌŒ_–ñ‘‚ð“K—p‚µ‚½Œ³‚Ì’˜ìŒ ŽÒ‚ÍA‚»‚¤‚¢‚Á‚½‘X‚ð”rœ‚µ
+‚½–¾Šm‚È’n—“I”Еz§ŒÀ‚ð‰Á‚¦A‚»‚±‚Å”rœ‚³‚ê‚Ä‚¢‚È‚¢‘‚Ì’†‚â‚»‚ê‚ç‚Ì‘X
+‚̊Ԃł̂ݔЕz‚ª‹–‰Â‚³‚ê‚é‚悤‚É‚µ‚Ä‚à\‚í‚È‚¢B‚»‚Ìê‡A‚»‚̂悤‚ȧ
+ŒÀ‚Í‚±‚ÌŒ_–ñ‘–{•¶‚Å‘‚©‚ê‚Ä‚¢‚é‚Ì‚Æ“¯—l‚ÉŒ©‚È‚³‚ê‚éB
+
+9. ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ÍAŽž‚É‚æ‚Á‚ĉü’ù‚Ü‚½‚ÍV”ł̈ê”ÊŒöO—˜—p‹–
+‘ø‘‚ð”­•\‚·‚邱‚Æ‚ª‚Å‚«‚éB‚»‚̂悤‚ÈV”Å‚ÍŒ»Ý‚̃o[ƒWƒ‡ƒ“‚Æ‚»‚̸_
+‚É‚¨‚¢‚Ä‚ÍŽ—‚½‚à‚̂ɂȂ邾‚낤‚ªAV‚½‚È–â‘è‚⌜”O‚ð‰ðŒˆ‚·‚邽‚ßו”‚Å
+‚͈قȂé‰Â”\«‚ª‚ ‚éB
+
+‚»‚ꂼ‚ê‚̃o[ƒWƒ‡ƒ“‚É‚ÍAŒ©•ª‚¯‚ª•t‚­‚悤‚Ƀo[ƒWƒ‡ƒ“”Ô†‚ªU‚ç‚ê‚Ä‚¢
+‚éBwƒvƒƒOƒ‰ƒ€x‚É‚¨‚¢‚Ä‚»‚ê‚É“K—p‚³‚ê‚邱‚ÌŒ_–ñ‘‚̃o[ƒWƒ‡ƒ“”Ô†‚ª
+Žw’肳‚ê‚Ä‚¢‚ÄAX‚Éu‚»‚êˆÈ~‚Ì‚¢‚©‚È‚éƒo[ƒWƒ‡ƒ“v‚à“K—p‚µ‚Ä—Ç‚¢‚Æ‚È‚Á
+‚Ä‚¢‚½ê‡A‚ ‚È‚½‚Í]‚¤ðŒ‚Ƨ–ñ‚Æ‚µ‚ÄAŽw’è‚̃o[ƒWƒ‡ƒ“‚©AƒtƒŠ[ƒ\
+ƒtƒgƒEƒFƒAà’c‚É‚æ‚Á‚Ä”­s‚³‚ꂽŽw’è‚̃o[ƒWƒ‡ƒ“ˆÈ~‚̔ł̂ǂꂩˆê‚‚Ì
+‚Ç‚¿‚ç‚©‚ð‘I‚Ô‚±‚Æ‚ªo—ˆ‚éBwƒvƒƒOƒ‰ƒ€x‚щƒCƒZƒ“ƒX‚̃o[ƒWƒ‡ƒ“”Ô†
+‚ªŽw’肳‚ê‚Ä‚¢‚È‚¢‚È‚ç‚ÎA‚ ‚È‚½‚Í¡‚܂łɃtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚©‚ç”­
+s‚³‚ꂽƒo[ƒWƒ‡ƒ“‚Ì’†‚©‚çD‚«‚É‘I‚ñ‚Å\‚í‚È‚¢B
+
+10. ‚à‚µ‚ ‚È‚½‚ªwƒvƒƒOƒ‰ƒ€x‚̈ꕔ‚ðA‚»‚̔ЕzðŒ‚ª‚±‚ÌŒ_–ñ‘‚Æ
+ˆÙ‚Ȃ鑼‚̃tƒŠ[‚ȃvƒƒOƒ‰ƒ€‚Æ“‡‚µ‚½‚¢‚È‚ç‚ÎAìŽÒ‚ɘA—‚µ‚Ä‹–‰Â‚ð‹
+‚ß‚æBƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ª’˜ìŒ ‚ð•Û—L‚·‚éƒ\ƒtƒgƒEƒFƒA‚ɂ‚¢‚Ä‚ÍA
+ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒAà’c‚ɘA—‚¹‚æBŽ„‚½‚¿‚ÍA‚±‚̂悤‚Èꇂ̂½‚ß‚É“Á•Ê
+‚È—áŠO‚ðÝ‚¯‚邱‚Æ‚à‚ ‚éBŽ„‚½‚¿‚ªŒˆ’è‚ð‰º‚·‚É‚ ‚½‚Á‚Ä‚ÍAŽ„‚½‚¿‚̃tƒŠ[
+ƒ\ƒtƒgƒEƒFƒA‚Ì”h¶•¨‚·‚ׂĂªƒtƒŠ[‚Èó‘Ô‚É•Û‚½‚ê‚é‚Æ‚¢‚¤‚±‚Æ‚ÆAˆê”Ê“I
+‚Ƀ\ƒtƒgƒEƒFƒA‚Ì‹¤—L‚ÆÄ—˜—p‚ð‘£i‚·‚é‚Æ‚¢‚¤“ñ‚‚̖ڕW‚ð‹K€‚ÉŒŸ“¢‚³‚ê
+‚é‚Å‚ ‚낤B
+ –³•Û؂ɂ‚¢‚Ä
+
+11. wƒvƒƒOƒ‰ƒ€x‚͑㉿–³‚µ‚É—˜—p‚ª‹–‰Â‚³‚ê‚é‚Ì‚ÅA“KØ‚È–@‚ª”F‚ß‚éŒÀ
+‚è‚É‚¨‚¢‚ÄAwƒvƒƒOƒ‰ƒ€x‚ÉŠÖ‚·‚é‚¢‚©‚È‚é•ÛØ‚à‘¶Ý‚µ‚È‚¢B‘–Ê‚Å•Ê‚É
+q‚ׂéꇂ𜂢‚ÄA’˜ìŒ ŽÒA‚Ü‚½‚Í‚»‚Ì‘¼‚Ì’c‘Ì‚ÍAwƒvƒƒOƒ‰ƒ€x‚ðA
+•\–¾‚³‚ꂽ‚©Œ¾ŠO‚É‚©‚Í–â‚킸A¤‹Æ“I“K«‚ð•ÛØ‚·‚é‚Ù‚Ì‚ß‚©‚µ‚â‚ ‚é“Á’è
+‚Ì–Ú“I‚Ö‚Ì“K‡«(‚ÉŒÀ‚ç‚ê‚È‚¢)‚ðŠÜ‚ÞˆêØ‚Ì•ÛØ–³‚µ‚Éu‚ ‚邪‚Ü‚Üv‚Å’ñ
+‹Ÿ‚·‚éBwƒvƒƒOƒ‰ƒ€x‚ÌŽ¿‚Æ«”\‚ÉŠÖ‚·‚郊ƒXƒN‚Ì‚·‚ׂĂ͂ ‚È‚½‚É‹A‘®‚·
+‚éBwƒvƒƒOƒ‰ƒ€x‚ÉŒ‡Š×‚ª‚ ‚é‚Æ”»–¾‚µ‚½ê‡A‚ ‚È‚½‚Í•K—v‚È•ÛŽç“_ŒŸ‚â
+•âCAC³‚É—v‚·‚éƒRƒXƒg‚Ì‚·‚ׂĂðˆø‚«Žó‚¯‚邱‚Æ‚É‚È‚éB
+
+12. “KØ‚È–@‚©‘–Ê‚Å‚Ì“¯ˆÓ‚É‚æ‚Á‚Ä–½‚º‚ç‚ê‚È‚¢ŒÀ‚èA’˜ìŒ ŽÒA‚Ü‚½‚Íã
+‹L‚Å‹–‰Â‚³‚ê‚Ä‚¢‚é’Ê‚è‚ÉwƒvƒƒOƒ‰ƒ€x‚ð‰ü•Ï‚Ü‚½‚ÍĔЕz‚µ‚½‚»‚Ì‘¼‚Ì’c
+‘Ì‚ÍA‚ ‚È‚½‚ɑ΂µ‚ÄwƒvƒƒOƒ‰ƒ€x‚Ì—˜—p‚È‚¢‚µ—˜—p•s”\‚Ŷ‚¶‚½ˆê”Ê“IA
+“Á•Ê“IA‹ô‘R“IA•K‘R“I‚È‘¹ŠQ(ƒf[ƒ^‚ÌÁŽ¸‚â•s³Šm‚Ȉ—A‚ ‚È‚½‚©‘æŽO
+ŽÒ‚ª”í‚Á‚½‘¹Ž¸A‚ ‚é‚¢‚ÍwƒvƒƒOƒ‰ƒ€x‚ª‘¼‚̃\ƒtƒgƒEƒFƒA‚ƈê‚É“®ì‚µ
+‚È‚¢‚Æ‚¢‚¤•s‹ï‡‚È‚Ç‚ðŠÜ‚Þ‚ª‚»‚ê‚ç‚ÉŒÀ‚ç‚È‚¢)‚ɈêØ‚ÌÓ”C‚𕉂í‚È‚¢B
+‚»‚̂悤‚È‘¹ŠQ‚ª¶‚¸‚é‰Â”\«‚ɂ‚¢‚Ĕނ炪’‰‚³‚ê‚Ä‚¢‚½‚Æ‚µ‚Ä‚à“¯—l‚Å
+‚ ‚éB
+
+ ðŒ‚Ƨ–ñI‚í‚è
+
+ ˆÈã‚Ìð€‚ð‚ ‚È‚½‚ÌV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚É“K—p‚·‚é•û–@
+
+‚ ‚È‚½‚ªV‚µ‚¢ƒvƒƒOƒ‰ƒ€‚ðŠJ”­‚µ‚½‚Æ‚µ‚ÄAŒöO‚É‚æ‚Á‚Ä‚»‚ꂪ—˜—p‚³‚ê‚é
+‰Â”\«‚ðÅ‘å‚É‚µ‚½‚¢‚È‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ð‚±‚ÌŒ_–ñ‘‚Ìð€‚É]‚Á‚Ä
+’N‚Å‚àĔЕz‚ ‚é‚¢‚Í•ÏX‚Å‚«‚é‚悤ƒtƒŠ[ƒ\ƒtƒgƒEƒFƒA‚É‚·‚é‚Ì‚ªÅ‘P‚Å‚·B
+
+‚»‚Ì‚½‚ß‚É‚ÍAƒvƒƒOƒ‰ƒ€‚Ɉȉº‚̂悤‚È•\Ž¦‚ð“Y•t‚µ‚Ä‚­‚¾‚³‚¢B‚»‚Ìê‡A
+•ÛØ‚ª”rœ‚³‚ê‚Ä‚¢‚é‚Æ‚¢‚¤‚±‚Æ‚ðÅ‚àŒø‰Ê“I‚É“`‚¦‚邽‚ß‚ÉA‚»‚ꂼ‚ê‚̃\[
+ƒXƒtƒ@ƒCƒ‹‚Ì–`“ª‚É•\Ž¦‚ð“Y•t‚·‚ê‚ÎÅ‚àˆÀ‘S‚Å‚·B­‚È‚­‚Æ‚àAu’˜ìŒ •\
+Ž¦v‚Æ‚¢‚¤s‚Æ‘S•¶‚ª‚ ‚éꊂւ̃|ƒCƒ“ƒ^‚¾‚¯‚ÍŠeƒtƒ@ƒCƒ‹‚ÉŠÜ‚ß‚Ä’u‚¢‚Ä
+‚­‚¾‚³‚¢B
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ (–ó:
+
+ <ƒvƒƒOƒ‰ƒ€‚Ì–¼‘O‚ÆA‚»‚ꂪ‰½‚ð‚·‚é‚©‚ɂ‚¢‚Ä‚ÌŠÈ’P‚Èà–¾B>
+ Copyright (C) <¼—ï”N> <ìŽÒ‚Ì–¼‘O>
+
+ ‚±‚̃vƒƒOƒ‰ƒ€‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Å‚·B‚ ‚È‚½‚Í‚±‚ê‚ðAƒtƒŠ[ƒ\ƒt
+ ƒgƒEƒFƒAà’c‚É‚æ‚Á‚Ä”­s‚³‚ꂽ GNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘(ƒo[ƒWƒ‡
+ ƒ“2‚©AŠó–]‚É‚æ‚Á‚Ä‚Í‚»‚êˆÈ~‚̃o[ƒWƒ‡ƒ“‚Ì‚¤‚¿‚Ç‚ê‚©)‚Ì’è‚ß‚éðŒ
+ ‚̉º‚ÅĔЕz‚Ü‚½‚͉ü•Ï‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
+
+ ‚±‚̃vƒƒOƒ‰ƒ€‚Í—L—p‚Å‚ ‚邱‚Æ‚ðŠè‚Á‚ĔЕz‚³‚ê‚Ü‚·‚ªA*‘S‚­‚Ì–³•Û
+ Ø* ‚Å‚·B¤‹Æ‰Â”\«‚Ì•ÛØ‚â“Á’è‚Ì–Ú“I‚Ö‚Ì“K‡«‚ÍAŒ¾ŠO‚ÉŽ¦‚³‚ꂽ
+ ‚à‚Ì‚àŠÜ‚ß‘S‚­‘¶Ý‚µ‚Ü‚¹‚ñBÚ‚µ‚­‚ÍGNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚ð‚²
+ ——‚­‚¾‚³‚¢B
+
+ ‚ ‚È‚½‚Í‚±‚̃vƒƒOƒ‰ƒ€‚Æ‹¤‚ÉAGNU ˆê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Ì•¡»•¨‚ð
+ ˆê•”Žó‚¯Žæ‚Á‚½‚Í‚¸‚Å‚·B‚à‚µŽó‚¯Žæ‚Á‚Ä‚¢‚È‚¯‚ê‚ÎAƒtƒŠ[ƒ\ƒtƒgƒEƒF
+ ƒAà’c‚Ü‚Å¿‹‚µ‚Ä‚­‚¾‚³‚¢(ˆ¶æ‚Í the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA)B
+
+ )
+
+“dŽq‚È‚¢‚µŽ†‚̃[ƒ‹‚Å‚ ‚È‚½‚É–â‚¢‡‚킹‚é•û–@‚ɂ‚¢‚Ä‚Ìî•ñ‚à‘‚«‰Á‚¦
+‚Ü‚µ‚傤B
+
+ƒvƒƒOƒ‰ƒ€‚ª‘Θb“I‚È‚à‚Ì‚È‚ç‚ÎA‘Θbƒ‚[ƒh‚Å‹N“®‚µ‚½Û‚Éo—Í‚Æ‚µ‚Ĉȉº
+‚̂悤‚È’Z‚¢’m‚ª•\Ž¦‚³‚ê‚é‚悤‚É‚µ‚Ä‚­‚¾‚³‚¢:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+ (–ó:
+
+ Gnomovision ƒo[ƒWƒ‡ƒ“ 69, Copyright (C) ”N ìŽÒ‚Ì–¼‘O
+ Gnomovision ‚Í*‘S‚­‚Ì–³•ÛØ*‚Å’ñ‹Ÿ‚³‚ê‚Ü‚·BÚ‚µ‚­‚Íushow wv
+ ‚ƃ^ƒCƒv‚µ‚ĉº‚³‚¢B‚±‚ê‚̓tƒŠ[ƒ\ƒtƒgƒEƒFƒA‚Å‚ ‚èA‚ ‚éðŒ‚̉º‚Å
+ ĔЕz‚·‚邱‚Æ‚ª§—コ‚ê‚Ä‚¢‚Ü‚·BÚ‚µ‚­‚Íushow cv‚ƃ^ƒCƒv‚µ‚ĉº
+ ‚³‚¢B
+
+ )
+
+‚±‚±‚ÅA‰¼‘z“I‚ȃRƒ}ƒ“ƒhushow wv‚Æushow cv‚͈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘
+‚Ì“KØ‚È•”•ª‚ð•\Ž¦‚·‚é‚悤‚É‚È‚Á‚Ä‚¢‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚à‚¿‚ë‚ñA‚ ‚È
+‚½‚ªŽg‚¤ƒRƒ}ƒ“ƒh‚ðushow wv‚âushow cv‚ƌĂԕK‘R«‚Í‚ ‚è‚Ü‚¹‚ñ‚Ì‚ÅA
+‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ɇ‚킹‚ă}ƒEƒX‚̃NƒŠƒbƒN‚⃃jƒ…[‚̃AƒCƒeƒ€‚É‚µ‚Ä
+‚àŒ‹\‚Å‚·B
+
+‚Ü‚½‚ ‚È‚½‚ÍA•K—v‚È‚ç‚Î(ƒvƒƒOƒ‰ƒ}[‚Æ‚µ‚Ä“­‚¢‚Ä‚¢‚½‚ç)‚ ‚È‚½‚̌ٗpŽåA
+‚ ‚é‚¢‚Íꇂɂæ‚Á‚Ä‚ÍŠwZ‚©‚çA‚»‚̃vƒƒOƒ‰ƒ€‚ÉŠÖ‚·‚éu’˜ìŒ •úŠüº–¾
+(copyright disclaimer)v‚É–¼‚µ‚Ä‚à‚炤‚ׂ«‚Å‚·BˆÈ‰º‚Í—á‚Å‚·‚Ì‚ÅA–¼
+‘O‚ð•Ï‚¦‚Ä‚­‚¾‚³‚¢:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+ (–ó:
+
+ YoyodyneŽÐ‚Í‚±‚±‚ÉAJames Hacker‚É‚æ‚Á‚Ä‘‚©‚ꂽƒvƒƒOƒ‰ƒ€
+ uGnomovisionv(ƒRƒ“ƒpƒCƒ‰‚Ö’Ê‚·ƒvƒƒOƒ‰ƒ€)‚ÉŠÖ‚·‚éˆêØ‚Ì’˜ìŒ ‚Ì—˜
+ ‰v‚ð•úŠü‚µ‚Ü‚·B
+
+ <Ty CoonŽ‚Ì–¼>A1989”N4ŒŽ1“ú
+ Ty CoonA•›ŽÐ’·
+
+ )
+
+‚±‚̈ê”ÊŒöO—˜—p‹–‘øŒ_–ñ‘‚Å‚ÍA‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ð“Æè“I‚ȃvƒƒOƒ‰ƒ€
+‚É“‡‚·‚邱‚Æ‚ð”F‚ß‚Ä‚¢‚Ü‚¹‚ñB‚ ‚È‚½‚̃vƒƒOƒ‰ƒ€‚ªƒTƒuƒ‹[ƒ`ƒ“ƒ‰ƒCƒu
+ƒ‰ƒŠ‚È‚ç‚ÎA“Æè“I‚ȃAƒvƒŠƒP[ƒVƒ‡ƒ“‚Æ‚ ‚È‚½‚̃‰ƒCƒuƒ‰ƒŠ‚ðƒŠƒ“ƒN‚·‚邱
+‚Æ‚ð‹–‰Â‚µ‚½‚Ù‚¤‚ª‚æ‚è•Ö—˜‚Å‚ ‚é‚Æl‚¦‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñB‚à‚µ‚±‚ꂪ‚ ‚È
+‚½‚Ì–]‚Þ‚±‚Æ‚È‚ç‚ÎA‚±‚ÌŒ_–ñ‘‚Ì‘ã‚í‚è‚ÉGNU ƒ‰ƒCƒuƒ‰ƒŠˆê”ÊŒöO—˜—p‹–‘ø
+Œ_–ñ‘‚ð“K—p‚µ‚Ä‚­‚¾‚³‚¢B
diff --git a/Makefile b/Makefile
index 1480d8015..2f0b29f4e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,127 +1,127 @@
-# $Id: Makefile 158 2004-10-01 03:45:15Z PoW $
-
-CC = gcc -pipe
-PACKETDEF = -DPACKETVER=6 -DNEW_006b -DSO_REUSEPORT
-#PACKETDEF = -DPACKETVER=5 -DNEW_006b
-#PACKETDEF = -DPACKETVER=4 -DNEW_006b
-#PACKETDEF = -DPACKETVER=3 -DNEW_006b
-#PACKETDEF = -DPACKETVER=2 -DNEW_006b
-#PACKETDEF = -DPACKETVER=1 -DNEW_006b
-
-PLATFORM = $(shell uname)
-
-ifeq ($(findstring FreeBSD,$(PLATFORM)), FreeBSD)
-MAKE = gmake
-else
-MAKE = make
-endif
-
-OPT = -g -O2
-
-ifeq ($(findstring CYGWIN,$(PLATFORM)), CYGWIN)
-OS_TYPE = -DCYGWIN
-CFLAGS = $(OPT) -Wall -DFD_SETSIZE=4096 -I../common $(PACKETDEF) $(OS_TYPE)
-else
-OS_TYPE =
-CFLAGS = $(OPT) -Wall -I../common $(PACKETDEF) $(OS_TYPE)
-endif
-
-MYSQLFLAG_INCLUDE_DEFAULT = /usr/local/include/mysql
-
-ifdef SQLFLAG
-MYSQLFLAG_CONFIG = $(shell which mysql_config)
-ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
-MYSQLFLAG_VERSION = $(shell $(MYSQLFLAG_CONFIG) --version | sed s:\\..*::)
-endif
-
-ifeq ($(findstring 5,$(MYSQLFLAG_VERSION)), 5)
-MYSQLFLAG_CONFIG_ARGUMENT = --include
-endif
-ifeq ($(findstring 4,$(MYSQLFLAG_VERSION)), 4)
-MYSQLFLAG_CONFIG_ARGUMENT = --include
-endif
-ifndef MYSQLFLAG_CONFIG_ARGUMENT
-MYSQLFLAG_CONFIG_ARGUMENT = --cflags
-endif
-
-ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
-MYSQLFLAG_INCLUDE = $(shell $(MYSQLFLAG_CONFIG) $(MYSQLFLAG_CONFIG_ARGUMENT))
-else
-MYSQLFLAG_INCLUDE = -I$(MYSQLFLAG_INCLUDE_DEFAULT)
-endif
-
-LIB_S_DEFAULT = -L/usr/local/lib/mysql -lmysqlclient -lz
-MYSQLFLAG_CONFIG = $(shell which mysql_config)
-ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
-LIB_S = $(shell $(MYSQLFLAG_CONFIG) --libs)
-else
-LIB_S = $(LIB_S_DEFAULT)
-endif
-
-MYLIB = CC="$(CC)" CFLAGS="$(CFLAGS) $(MYSQLFLAG_INCLUDE)" LIB_S="$(LIB_S)"
-
-endif
-
-MKDEF = CC="$(CC)" CFLAGS="$(CFLAGS)"
-
-all: conf txt
-
-conf:
- cp -r conf-tmpl conf
- rm -rf conf/.svn conf/*/.svn
-
-txt : src/common/GNUmakefile src/login/GNUmakefile src/char/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile conf
- cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd login ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd char ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd map ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
-
-
-ifdef SQLFLAG
-sql: src/common/GNUmakefile src/login_sql/GNUmakefile src/char_sql/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile src/txt-converter/login/GNUmakefile src/txt-converter/char/GNUmakefile conf
- cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd login_sql ; $(MAKE) $(MYLIB) $@ ; cd ..
- cd src ; cd char_sql ; $(MAKE) $(MYLIB) $@ ; cd ..
- cd src ; cd map ; $(MAKE) $(MYLIB) $@ ; cd ..
- cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd txt-converter ; cd login ; $(MAKE) $(MYLIB) $@ ; cd ..
- cd src ; cd txt-converter ; cd char ; $(MAKE) $(MYLIB) $@ ; cd ..
-else
-sql:
- $(MAKE) CC="$(CC)" OPT="$(OPT)" SQLFLAG=1 $@
-endif
-
-clean: src/common/GNUmakefile src/login/GNUmakefile src/char/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile src/txt-converter/login/GNUmakefile src/txt-converter/char/GNUmakefile
- cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd login ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd login_sql ; $(MAKE) $(MKLIB) $@ ; cd ..
- cd src ; cd char ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd char_sql ; $(MAKE) $(MKLIB) $@ ; cd ..
- cd src ; cd map ; $(MAKE) $(MKLIB) $@ ; cd ..
- cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
- cd src ; cd txt-converter ; cd login ; $(MAKE) $(MKLIB) $@ ; cd ..
- cd src ; cd txt-converter ; cd char ; $(MAKE) $(MKLIB) $@ ; cd ..
-
-tools:
- cd tool && $(MAKE) $(MKDEF) && cd ..
- $(CC) -o setupwizard setupwizard.c
-
-src/common/GNUmakefile: src/common/Makefile
- sed -e 's/$$>/$$^/' src/common/Makefile > src/common/GNUmakefile
-src/login/GNUmakefile: src/login/Makefile
- sed -e 's/$$>/$$^/' src/login/Makefile > src/login/GNUmakefile
-src/login_sql/GNUmakefile: src/login_sql/Makefile
- sed -e 's/$$>/$$^/' src/login_sql/Makefile > src/login_sql/GNUmakefile
-src/char/GNUmakefile: src/char/Makefile
- sed -e 's/$$>/$$^/' src/char/Makefile > src/char/GNUmakefile
-src/char_sql/GNUmakefile: src/char_sql/Makefile
- sed -e 's/$$>/$$^/' src/char_sql/Makefile > src/char_sql/GNUmakefile
-src/map/GNUmakefile: src/map/Makefile
- sed -e 's/$$>/$$^/' src/map/Makefile > src/map/GNUmakefile
-src/ladmin/GNUmakefile: src/ladmin/Makefile
- sed -e 's/$$>/$$^/' src/ladmin/Makefile > src/ladmin/GNUmakefile
-src/txt-converter/login/GNUmakefile: src/txt-converter/login/Makefile
- sed -e 's/$$>/$$^/' src/txt-converter/login/Makefile > src/txt-converter/login/GNUmakefile
-src/txt-converter/char/GNUmakefile: src/txt-converter/char/Makefile
- sed -e 's/$$>/$$^/' src/txt-converter/char/Makefile > src/txt-converter/char/GNUmakefile
+# $Id: Makefile 158 2004-10-01 03:45:15Z PoW $
+
+CC = gcc -pipe
+PACKETDEF = -DPACKETVER=6 -DNEW_006b -DSO_REUSEPORT
+#PACKETDEF = -DPACKETVER=5 -DNEW_006b
+#PACKETDEF = -DPACKETVER=4 -DNEW_006b
+#PACKETDEF = -DPACKETVER=3 -DNEW_006b
+#PACKETDEF = -DPACKETVER=2 -DNEW_006b
+#PACKETDEF = -DPACKETVER=1 -DNEW_006b
+
+PLATFORM = $(shell uname)
+
+ifeq ($(findstring FreeBSD,$(PLATFORM)), FreeBSD)
+MAKE = gmake
+else
+MAKE = make
+endif
+
+OPT = -g -O2
+
+ifeq ($(findstring CYGWIN,$(PLATFORM)), CYGWIN)
+OS_TYPE = -DCYGWIN
+CFLAGS = $(OPT) -Wall -DFD_SETSIZE=4096 -I../common $(PACKETDEF) $(OS_TYPE)
+else
+OS_TYPE =
+CFLAGS = $(OPT) -Wall -I../common $(PACKETDEF) $(OS_TYPE)
+endif
+
+MYSQLFLAG_INCLUDE_DEFAULT = /usr/local/include/mysql
+
+ifdef SQLFLAG
+MYSQLFLAG_CONFIG = $(shell which mysql_config)
+ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
+MYSQLFLAG_VERSION = $(shell $(MYSQLFLAG_CONFIG) --version | sed s:\\..*::)
+endif
+
+ifeq ($(findstring 5,$(MYSQLFLAG_VERSION)), 5)
+MYSQLFLAG_CONFIG_ARGUMENT = --include
+endif
+ifeq ($(findstring 4,$(MYSQLFLAG_VERSION)), 4)
+MYSQLFLAG_CONFIG_ARGUMENT = --include
+endif
+ifndef MYSQLFLAG_CONFIG_ARGUMENT
+MYSQLFLAG_CONFIG_ARGUMENT = --cflags
+endif
+
+ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
+MYSQLFLAG_INCLUDE = $(shell $(MYSQLFLAG_CONFIG) $(MYSQLFLAG_CONFIG_ARGUMENT))
+else
+MYSQLFLAG_INCLUDE = -I$(MYSQLFLAG_INCLUDE_DEFAULT)
+endif
+
+LIB_S_DEFAULT = -L/usr/local/lib/mysql -lmysqlclient -lz
+MYSQLFLAG_CONFIG = $(shell which mysql_config)
+ifeq ($(findstring /,$(MYSQLFLAG_CONFIG)), /)
+LIB_S = $(shell $(MYSQLFLAG_CONFIG) --libs)
+else
+LIB_S = $(LIB_S_DEFAULT)
+endif
+
+MYLIB = CC="$(CC)" CFLAGS="$(CFLAGS) $(MYSQLFLAG_INCLUDE)" LIB_S="$(LIB_S)"
+
+endif
+
+MKDEF = CC="$(CC)" CFLAGS="$(CFLAGS)"
+
+all: conf txt
+
+conf:
+ cp -r conf-tmpl conf
+ rm -rf conf/.svn conf/*/.svn
+
+txt : src/common/GNUmakefile src/login/GNUmakefile src/char/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile conf
+ cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd login ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd char ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd map ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
+
+
+ifdef SQLFLAG
+sql: src/common/GNUmakefile src/login_sql/GNUmakefile src/char_sql/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile src/txt-converter/login/GNUmakefile src/txt-converter/char/GNUmakefile conf
+ cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd login_sql ; $(MAKE) $(MYLIB) $@ ; cd ..
+ cd src ; cd char_sql ; $(MAKE) $(MYLIB) $@ ; cd ..
+ cd src ; cd map ; $(MAKE) $(MYLIB) $@ ; cd ..
+ cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd txt-converter ; cd login ; $(MAKE) $(MYLIB) $@ ; cd ..
+ cd src ; cd txt-converter ; cd char ; $(MAKE) $(MYLIB) $@ ; cd ..
+else
+sql:
+ $(MAKE) CC="$(CC)" OPT="$(OPT)" SQLFLAG=1 $@
+endif
+
+clean: src/common/GNUmakefile src/login/GNUmakefile src/char/GNUmakefile src/map/GNUmakefile src/ladmin/GNUmakefile src/txt-converter/login/GNUmakefile src/txt-converter/char/GNUmakefile
+ cd src ; cd common ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd login ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd login_sql ; $(MAKE) $(MKLIB) $@ ; cd ..
+ cd src ; cd char ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd char_sql ; $(MAKE) $(MKLIB) $@ ; cd ..
+ cd src ; cd map ; $(MAKE) $(MKLIB) $@ ; cd ..
+ cd src ; cd ladmin ; $(MAKE) $(MKDEF) $@ ; cd ..
+ cd src ; cd txt-converter ; cd login ; $(MAKE) $(MKLIB) $@ ; cd ..
+ cd src ; cd txt-converter ; cd char ; $(MAKE) $(MKLIB) $@ ; cd ..
+
+tools:
+ cd tool && $(MAKE) $(MKDEF) && cd ..
+ $(CC) -o setupwizard setupwizard.c
+
+src/common/GNUmakefile: src/common/Makefile
+ sed -e 's/$$>/$$^/' src/common/Makefile > src/common/GNUmakefile
+src/login/GNUmakefile: src/login/Makefile
+ sed -e 's/$$>/$$^/' src/login/Makefile > src/login/GNUmakefile
+src/login_sql/GNUmakefile: src/login_sql/Makefile
+ sed -e 's/$$>/$$^/' src/login_sql/Makefile > src/login_sql/GNUmakefile
+src/char/GNUmakefile: src/char/Makefile
+ sed -e 's/$$>/$$^/' src/char/Makefile > src/char/GNUmakefile
+src/char_sql/GNUmakefile: src/char_sql/Makefile
+ sed -e 's/$$>/$$^/' src/char_sql/Makefile > src/char_sql/GNUmakefile
+src/map/GNUmakefile: src/map/Makefile
+ sed -e 's/$$>/$$^/' src/map/Makefile > src/map/GNUmakefile
+src/ladmin/GNUmakefile: src/ladmin/Makefile
+ sed -e 's/$$>/$$^/' src/ladmin/Makefile > src/ladmin/GNUmakefile
+src/txt-converter/login/GNUmakefile: src/txt-converter/login/Makefile
+ sed -e 's/$$>/$$^/' src/txt-converter/login/Makefile > src/txt-converter/login/GNUmakefile
+src/txt-converter/char/GNUmakefile: src/txt-converter/char/Makefile
+ sed -e 's/$$>/$$^/' src/txt-converter/char/Makefile > src/txt-converter/char/GNUmakefile
diff --git a/Readme-jap b/Readme-jap
index 3e2ac8648..6bf23c87b 100644
--- a/Readme-jap
+++ b/Readme-jap
@@ -1,17507 +1,17507 @@
---------------------
-//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³
-Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg•Ší§ŒÀ‚ð‰ðœA‘fŽè‚ðŠÜ‚ß‚½‘S‚Ä‚ÅŽg—p‰Â”\‚É
-
- (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
-
---------------------
-//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.
+--------------------
+//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³
+Eƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg•Ší§ŒÀ‚ð‰ðœA‘fŽè‚ðŠÜ‚ß‚½‘S‚Ä‚ÅŽg—p‰Â”\‚É
+
+ (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
+
+--------------------
+//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/Readme2.txt b/Readme2.txt
index acbe2703f..cedb7cbb3 100644
--- a/Readme2.txt
+++ b/Readme2.txt
@@ -1,30 +1,30 @@
- ______ __ __
- /\ _ \/\ \__/\ \
- __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
- /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
- \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
- _ _ _ _ _ _ _ _ _ _ _ _ _
- / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
- \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-
-
---------------------------------------------------------------
-eAthena VERSION
---------------------------------------------------------------
-Version 1.0.0 DEV-SVN
---------------------------------------------------------------
-
-Please read new HTML readme at:
-./readme.html
-
---------------------------------------------------------------
---------------------------------------------------------------
-License:
---------------------------------------------------------------
-eAthena is licensed under the GPL. Please refer to LICENSE in
-your Athena folder for the full GPL License statement.
---------------------------------------------------------------
---------------------------------------------------------------
+ ______ __ __
+ /\ _ \/\ \__/\ \
+ __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+ /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+ \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+ _ _ _ _ _ _ _ _ _ _ _ _ _
+ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+
+
+--------------------------------------------------------------
+eAthena VERSION
+--------------------------------------------------------------
+Version 1.0.0 DEV-SVN
+--------------------------------------------------------------
+
+Please read new HTML readme at:
+./readme.html
+
+--------------------------------------------------------------
+--------------------------------------------------------------
+License:
+--------------------------------------------------------------
+eAthena is licensed under the GPL. Please refer to LICENSE in
+your Athena folder for the full GPL License statement.
+--------------------------------------------------------------
+--------------------------------------------------------------
diff --git a/athena-start b/athena-start
index f21dccf71..92d49c2ef 100644
--- a/athena-start
+++ b/athena-start
@@ -1,84 +1,84 @@
-#!/bin/sh
-# athena starting script by rowla
-
-PATH=./:$PATH
-
-L_SRV=login-server
-C_SRV=char-server
-M_SRV=map-server
-L_SRV_C=./conf/login_athena.conf
-C_SRV_C=./conf/char_athena.conf
-C_SRV_C2=./conf/inter_athena.conf
-M_SRV_C=./conf/map_athena.conf
-M_SRV_C2=./conf/battle_athena.conf
-M_SRV_C3=./conf/atcommand_athena.conf
-M_SRV_C4=./conf/script_athena.conf
-M_SRV_C5=./conf/msg_athena.conf
-M_SRV_C6=./conf/grf-files.txt
-
-print_start() {
-# more << EOF
-echo "Athena Starting..."
-echo " (c) 2003 Athena Project."
-echo " URL:http://project-yare.de/"
-echo ""
-echo "Debug informations will appear,"
-echo "since this is a test release."
-echo ""
-echo "checking..."
-#EOF
-}
-
-check_account() {
- if [ ! -f ./save/account.txt ]; then
- echo "0 s1 p1 - S 0" > save/account.txt
- echo "1 s2 p2 - S 0" >>save/account.txt
- echo "2 s3 p3 - S 0" >>save/account.txt
- echo "3 s4 p4 - S 0" >>save/account.txt
- echo "4 s5 p5 - S 0" >>save/account.txt
- fi
-}
-
-check_files() {
-
- for i in ${L_SRV} ${C_SRV} ${M_SRV} ${L_SRV_C} ${C_SRV_C} ${C_SRV_C2} ${M_SRV_C} ${M_SRV_C2} ${M_SRV_C3} ${M_SRV_C4} ${M_SRV_C5} ${M_SRV_C6}
- do
- if [ ! -f ./$i ]; then
- echo "$i does not exist, or can't run."
- echo "Stoped, Check your compile or configuration file."
- exit 1;
- fi
- done
-
-# more << EOF
-echo "Check done."
-echo "Looks good, have a nice athena!"
-#EOF
-}
-
-
-case $1 in
- 'start')
- print_start
- check_account
- check_files
-
- exec ./${L_SRV} ${L_SRV_C}&
-# exec ./${C_SRV} ${C_SRV_C} ${C_SRV_C2} > /dev/null&
-# exec ./${M_SRV} ${M_SRV_C} ${M_SRV_C2} > /dev/null&
- exec ./${C_SRV} ${C_SRV_C} ${C_SRV_C2}&
- exec ./${M_SRV} ${M_SRV_C} ${M_SRV_C2} ${M_SRV_C3} ${M_SRV_C4} ${M_SRV_C5} ${M_SRV_C6}&
-
- echo "Now Started Athena."
-;;
- 'stop')
- ps ax | grep -E "${L_SRV}|${C_SRV}|${M_SRV}" | awk '{print $1}' | xargs kill -9
- ;;
- 'restart')
- $0 stop
- $0 start
- ;;
- *)
- echo "Usage: athena-start { start | stop | restart }"
- ;;
-esac
+#!/bin/sh
+# athena starting script by rowla
+
+PATH=./:$PATH
+
+L_SRV=login-server
+C_SRV=char-server
+M_SRV=map-server
+L_SRV_C=./conf/login_athena.conf
+C_SRV_C=./conf/char_athena.conf
+C_SRV_C2=./conf/inter_athena.conf
+M_SRV_C=./conf/map_athena.conf
+M_SRV_C2=./conf/battle_athena.conf
+M_SRV_C3=./conf/atcommand_athena.conf
+M_SRV_C4=./conf/script_athena.conf
+M_SRV_C5=./conf/msg_athena.conf
+M_SRV_C6=./conf/grf-files.txt
+
+print_start() {
+# more << EOF
+echo "Athena Starting..."
+echo " (c) 2003 Athena Project."
+echo " URL:http://project-yare.de/"
+echo ""
+echo "Debug informations will appear,"
+echo "since this is a test release."
+echo ""
+echo "checking..."
+#EOF
+}
+
+check_account() {
+ if [ ! -f ./save/account.txt ]; then
+ echo "0 s1 p1 - S 0" > save/account.txt
+ echo "1 s2 p2 - S 0" >>save/account.txt
+ echo "2 s3 p3 - S 0" >>save/account.txt
+ echo "3 s4 p4 - S 0" >>save/account.txt
+ echo "4 s5 p5 - S 0" >>save/account.txt
+ fi
+}
+
+check_files() {
+
+ for i in ${L_SRV} ${C_SRV} ${M_SRV} ${L_SRV_C} ${C_SRV_C} ${C_SRV_C2} ${M_SRV_C} ${M_SRV_C2} ${M_SRV_C3} ${M_SRV_C4} ${M_SRV_C5} ${M_SRV_C6}
+ do
+ if [ ! -f ./$i ]; then
+ echo "$i does not exist, or can't run."
+ echo "Stoped, Check your compile or configuration file."
+ exit 1;
+ fi
+ done
+
+# more << EOF
+echo "Check done."
+echo "Looks good, have a nice athena!"
+#EOF
+}
+
+
+case $1 in
+ 'start')
+ print_start
+ check_account
+ check_files
+
+ exec ./${L_SRV} ${L_SRV_C}&
+# exec ./${C_SRV} ${C_SRV_C} ${C_SRV_C2} > /dev/null&
+# exec ./${M_SRV} ${M_SRV_C} ${M_SRV_C2} > /dev/null&
+ exec ./${C_SRV} ${C_SRV_C} ${C_SRV_C2}&
+ exec ./${M_SRV} ${M_SRV_C} ${M_SRV_C2} ${M_SRV_C3} ${M_SRV_C4} ${M_SRV_C5} ${M_SRV_C6}&
+
+ echo "Now Started Athena."
+;;
+ 'stop')
+ ps ax | grep -E "${L_SRV}|${C_SRV}|${M_SRV}" | awk '{print $1}' | xargs kill -9
+ ;;
+ 'restart')
+ $0 stop
+ $0 start
+ ;;
+ *)
+ echo "Usage: athena-start { start | stop | restart }"
+ ;;
+esac
diff --git a/char-server.sh b/char-server.sh
index 39c1882ad..6cddf373c 100644
--- a/char-server.sh
+++ b/char-server.sh
@@ -1,16 +1,16 @@
-#/bin/sh
-#Hi my naem is Kirt and I liek anime
-
-ulimit -Sc unlimited
-
-while [ 3 ] ; do
-if [ -f .stopserver3 ] ; then
-echo server marked down >> servlog.txt
-else
-echo restarting server at time at `date +"%m-%d-%H:%M-%S"`>> startlog.txt
-./char-server
-fi
-
-sleep 5
-
-done
+#/bin/sh
+#Hi my naem is Kirt and I liek anime
+
+ulimit -Sc unlimited
+
+while [ 3 ] ; do
+if [ -f .stopserver3 ] ; then
+echo server marked down >> servlog.txt
+else
+echo restarting server at time at `date +"%m-%d-%H:%M-%S"`>> startlog.txt
+./char-server
+fi
+
+sleep 5
+
+done
diff --git a/charserv.bat b/charserv.bat
index 75b3e7dc5..69900c7ec 100644
--- a/charserv.bat
+++ b/charserv.bat
@@ -1,4 +1,4 @@
-@echo off
-:charserv
-start /min /wait char-server.exe conf\char_athena.conf
+@echo off
+:charserv
+start /min /wait char-server.exe conf\char_athena.conf
goto charserv \ No newline at end of file
diff --git a/conf-tmpl/GM_account.txt b/conf-tmpl/GM_account.txt
index 170253c5f..a7acfa038 100644
--- a/conf-tmpl/GM_account.txt
+++ b/conf-tmpl/GM_account.txt
@@ -1,35 +1,35 @@
-// GM‚Æ‚µ‚Ä”FŽ¯‚·‚éƒAƒJƒEƒ“ƒgID‚ðÝ’è
-// <account ID> <level>
-// <GM‚̃AƒJƒEƒ“ƒgID> <GM‚̃Œƒxƒ‹>
-// GM‚̃Œƒxƒ‹‚Í0ˆÈ‰º‚Í–³Ž‹‚ÅÅ‘å‚Í99
-704554 99
-704555 1
-704556 1
-704557 1
-704558 1
-704559 1
-704560 1
-704561 1
-704562 1
-704563 1
-704564 1
-704565 1
-704566 1
-704567 1
-704568 1
-704569 1
-704570 1
-704571 1
-704572 1
-704573 1
-704574 1
-704575 1
-704576 1
-704577 1
-704578 1
-704579 1
-704580 1
-704581 1
-704582 1
-704583 1
-794584 1
+// GM‚Æ‚µ‚Ä”FŽ¯‚·‚éƒAƒJƒEƒ“ƒgID‚ðÝ’è
+// <account ID> <level>
+// <GM‚̃AƒJƒEƒ“ƒgID> <GM‚̃Œƒxƒ‹>
+// GM‚̃Œƒxƒ‹‚Í0ˆÈ‰º‚Í–³Ž‹‚ÅÅ‘å‚Í99
+704554 99
+704555 1
+704556 1
+704557 1
+704558 1
+704559 1
+704560 1
+704561 1
+704562 1
+704563 1
+704564 1
+704565 1
+704566 1
+704567 1
+704568 1
+704569 1
+704570 1
+704571 1
+704572 1
+704573 1
+704574 1
+704575 1
+704576 1
+704577 1
+704578 1
+704579 1
+704580 1
+704581 1
+704582 1
+704583 1
+794584 1
diff --git a/conf-tmpl/atcommand_athena.conf b/conf-tmpl/atcommand_athena.conf
index a33be2ae9..f0add1f2e 100644
--- a/conf-tmpl/atcommand_athena.conf
+++ b/conf-tmpl/atcommand_athena.conf
@@ -1,644 +1,644 @@
-// 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 '@'). 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!
-
-
-//--------------------------
-// 0: normal player commands
-
-// Give server time. (6 same commands)
-time: 0
-date: 0
-server_date: 0
-serverdate: 0
-server_time: 0
-servertime: 0
-
-// Display your ignore list (people from which you ignore wisps)
-ignorelist: 0
-
-// 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: 0
-
-// 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)
-gm: 100
-
-
-//-------------------------
-// 1: Super player commands
-
-// 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
-
-
-//---------------------------
-// 10: Super player+ commands
-
-// Spawns you to set points in major cities.
-go: 10
-
-
-//----------------------
-// 20: Mediator commands
-
-// Displays helpfile in Athena base directory (2 same commands).
-help: 20
-h: 20
-
-// Warp yourself to a person (3 same commands + /shift).
-jumpto: 20
-goto: 20
-warpto: 20
-
-// follow a player (including warping to them)
-follow: 20
-
-// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
-kick: 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
-
-// Enable all wispers for a player
-inall: 20
-
-// Disable all wispers for a player
-exall: 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).
-local_broadcast: 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 you to view other characters stats.
-charstats: 40
-
-// Shows Stats Of All Characters Online
-charstatsall: 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
-
-//Makes an egg
-makeegg: 40
-
-//Hatches an egg
-hatch: 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
-
-// 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
-
-// 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
-charitemlist: 40
-
-// Display all items of a player's storage
-charstoragelist: 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
-
-// make another player killable
-charkillable: 40
-
-//---------------------
-// 50: Sub-GM+ commands
-
-// Changes character's model
-charmodel: 50
-
-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
-
-// Spawns a monster with parameters not in same order of @spawn.
-monster2: 50
-
-// To get a peco to (un)ride for another player.
-charmountpeco: 50
-
-// Enables to give possibility to a player to rename his/her pet.
-charpetrename: 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
-
-// Sets another persons base level.
-charbaselvl: 60
-
-// Changes the sex of an online player (all characters on the account)
-charchangesex: 60
-
-// Remove items from a character
-chardelitem: 60
-
-// Sets another persons job level.
-charjlvl: 60
-
-// Sets the job of another character (2 same commands).
-charjob: 60
-charjobchange: 60
-
-// Set options on another character.
-charoption: 60
-
-// Gives another character status points
-charstpoint: 60
-
-// Gives another character skill points
-charskpoint: 60
-
-// Resets another character's stats
-charreset: 60
-
-// Resets another character's status, skills
-charstreset: 60
-charskreset: 60
-
-// Saves the respawn point of another character.
-charsave: 60
-
-// Changes another character's zenny
-charzeny: 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
-
-// ??
-itemcheck: 60
-
-// Kill another character without hitting them.
-kill: 60
-
-// Kill all monsters in map (with drops)
-killmonster: 60
-
-// Creates yourself a pet egg, have to use Pet ID.
-makeegg: 60
-
-// Instantly kills player whose name is entered and deals insane damage to everything around.
-// Disabled for now
-//nuke: 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
-
-// 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
-
-// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
-rura+: 60
-charwarp: 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.)
-guildspy: 60
-
-//Allows you to spy on any party's party chat. (at least one party member must be online.)
-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
-
-// To change disguise of another player/GM
-chardisguise: 60
-charundisguise: 60
-
-// Enables platinum skills of another player.
-charquestskill: 60
-
-// Enables lost skills of another player.
-charlostskill: 60
-
-// turn on and off skills on a map
-skillon: 60
-skilloff: 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
-
-//----------------------
-// 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
-
-// Enables a NPC.
-enablenpc: 80
-
-// Disables a NPC.
-disablenpc: 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: 60
-
-//---------------------------
-// 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
-
-// Shows information about the map
-mapinfo: 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
-
-//---------------------------------------------------------------
-// 99: Weather effects
-
-rain: 99
-
-snow: 99
-
-fog: 99
-
-sakura: 99
-
-leaves: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: 0
-
-
-
-//---------------------
-// 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 '@'). 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!
+
+
+//--------------------------
+// 0: normal player commands
+
+// Give server time. (6 same commands)
+time: 0
+date: 0
+server_date: 0
+serverdate: 0
+server_time: 0
+servertime: 0
+
+// Display your ignore list (people from which you ignore wisps)
+ignorelist: 0
+
+// 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: 0
+
+// 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)
+gm: 100
+
+
+//-------------------------
+// 1: Super player commands
+
+// 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
+
+
+//---------------------------
+// 10: Super player+ commands
+
+// Spawns you to set points in major cities.
+go: 10
+
+
+//----------------------
+// 20: Mediator commands
+
+// Displays helpfile in Athena base directory (2 same commands).
+help: 20
+h: 20
+
+// Warp yourself to a person (3 same commands + /shift).
+jumpto: 20
+goto: 20
+warpto: 20
+
+// follow a player (including warping to them)
+follow: 20
+
+// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
+kick: 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
+
+// Enable all wispers for a player
+inall: 20
+
+// Disable all wispers for a player
+exall: 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).
+local_broadcast: 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 you to view other characters stats.
+charstats: 40
+
+// Shows Stats Of All Characters Online
+charstatsall: 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
+
+//Makes an egg
+makeegg: 40
+
+//Hatches an egg
+hatch: 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
+
+// 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
+
+// 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
+charitemlist: 40
+
+// Display all items of a player's storage
+charstoragelist: 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
+
+// make another player killable
+charkillable: 40
+
+//---------------------
+// 50: Sub-GM+ commands
+
+// Changes character's model
+charmodel: 50
+
+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
+
+// Spawns a monster with parameters not in same order of @spawn.
+monster2: 50
+
+// To get a peco to (un)ride for another player.
+charmountpeco: 50
+
+// Enables to give possibility to a player to rename his/her pet.
+charpetrename: 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
+
+// Sets another persons base level.
+charbaselvl: 60
+
+// Changes the sex of an online player (all characters on the account)
+charchangesex: 60
+
+// Remove items from a character
+chardelitem: 60
+
+// Sets another persons job level.
+charjlvl: 60
+
+// Sets the job of another character (2 same commands).
+charjob: 60
+charjobchange: 60
+
+// Set options on another character.
+charoption: 60
+
+// Gives another character status points
+charstpoint: 60
+
+// Gives another character skill points
+charskpoint: 60
+
+// Resets another character's stats
+charreset: 60
+
+// Resets another character's status, skills
+charstreset: 60
+charskreset: 60
+
+// Saves the respawn point of another character.
+charsave: 60
+
+// Changes another character's zenny
+charzeny: 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
+
+// ??
+itemcheck: 60
+
+// Kill another character without hitting them.
+kill: 60
+
+// Kill all monsters in map (with drops)
+killmonster: 60
+
+// Creates yourself a pet egg, have to use Pet ID.
+makeegg: 60
+
+// Instantly kills player whose name is entered and deals insane damage to everything around.
+// Disabled for now
+//nuke: 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
+
+// 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
+
+// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
+rura+: 60
+charwarp: 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.)
+guildspy: 60
+
+//Allows you to spy on any party's party chat. (at least one party member must be online.)
+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
+
+// To change disguise of another player/GM
+chardisguise: 60
+charundisguise: 60
+
+// Enables platinum skills of another player.
+charquestskill: 60
+
+// Enables lost skills of another player.
+charlostskill: 60
+
+// turn on and off skills on a map
+skillon: 60
+skilloff: 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
+
+//----------------------
+// 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
+
+// Enables a NPC.
+enablenpc: 80
+
+// Disables a NPC.
+disablenpc: 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: 60
+
+//---------------------------
+// 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
+
+// Shows information about the map
+mapinfo: 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
+
+//---------------------------------------------------------------
+// 99: Weather effects
+
+rain: 99
+
+snow: 99
+
+fog: 99
+
+sakura: 99
+
+leaves: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: 0
+
+
+
+//---------------------
+// OTHER: not a command
+
+//import: conf/import/atcommand_conf.txt
diff --git a/conf-tmpl/atcommand_athena.conf.orig b/conf-tmpl/atcommand_athena.conf.orig
index 2c9def212..3a3e359ae 100644
--- a/conf-tmpl/atcommand_athena.conf.orig
+++ b/conf-tmpl/atcommand_athena.conf.orig
@@ -1,569 +1,569 @@
-// 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 '@'). 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!
-
-
-//--------------------------
-// 0: normal player commands
-
-// Give server time. (6 same commands)
-time: 0
-date: 0
-server_date: 0
-serverdate: 0
-server_time: 0
-servertime: 0
-
-// Display your ignore list (people from which you ignore wisps)
-ignorelist: 0
-
-// 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: 0
-
-// 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)
-gm: 100
-
-
-//-------------------------
-// 1: Super player commands
-
-// 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
-
-
-//---------------------------
-// 10: Super player+ commands
-
-// Spawns you to set points in major cities.
-go: 10
-
-
-//----------------------
-// 20: Mediator commands
-
-// Displays helpfile in Athena base directory (2 same commands).
-help: 20
-h: 20
-
-// Warp yourself to a person (3 same commands + /shift).
-jumpto: 20
-goto: 20
-warpto: 20
-
-// follow a player (including warping to them)
-follow: 20
-
-// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
-kick: 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
-
-// Enable all wispers for a player
-inall: 20
-
-// Disable all wispers for a player
-exall: 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).
-local_broadcast: 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 you to view other characters stats.
-charstats: 40
-
-// Shows Stats Of All Characters Online
-charstatsall: 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
-
-//Makes an egg
-makeegg: 40
-
-//Hatches an egg
-hatch: 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
-
-// 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
-
-// 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
-charitemlist: 40
-
-// Display all items of a player's storage
-charstoragelist: 40
-
-// Display all items of a player's cart
-charcartlist: 40
-
-
-//---------------------
-// 50: Sub-GM+ commands
-
-// Changes character's model
-charmodel: 50
-
-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
-
-// Spawns a monster with parameters not in same order of @spawn.
-monster2: 50
-
-// To get a peco to (un)ride for another player.
-charmountpeco: 50
-
-// Enables to give possibility to a player to rename his/her pet.
-charpetrename: 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
-
-// Sets another persons base level.
-charbaselvl: 60
-
-// Changes the sex of an online player (all characters on the account)
-charchangesex: 60
-
-// Remove items from a character
-chardelitem: 60
-
-// Sets another persons job level.
-charjlvl: 60
-
-// Sets the job of another character (2 same commands).
-charjob: 60
-charjobchange: 60
-
-// Set options on another character.
-charoption: 60
-
-// Gives another character status points
-charstpoint: 60
-
-// Gives another character skill points
-charskpoint: 60
-
-// Resets another character's stats
-charreset: 60
-
-// Resets another character's status, skills
-charstreset: 60
-charskreset: 60
-
-// Saves the respawn point of another character.
-charsave: 60
-
-// Changes another character's zenny
-charzeny: 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
-
-// ??
-itemcheck: 60
-
-// Kill another character without hitting them.
-kill: 60
-
-// Kill all monsters in map (with drops)
-killmonster: 60
-
-// Creates yourself a pet egg, have to use Pet ID.
-makeegg: 60
-
-// Instantly kills player whose name is entered and deals insane damage to everything around.
-nuke: 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
-
-// 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
-
-// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
-rura+: 60
-charwarp: 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.)
-guildspy: 60
-
-//Allows you to spy on any party's party chat. (at least one party member must be online.)
-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
-
-// To change disguise of another player/GM
-chardisguise: 60
-charundisguise: 60
-
-// Enables platinum skills of another player.
-charquestskill: 60
-
-// Enables lost skills of another player.
-charlostskill: 60
-
-// turn on and off skills on a map
-skillon: 60
-skilloff: 60
-
-// Create a static warp portal that lasts until the next reboot
-addwarp: 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
-
-// Enables a NPC.
-enablenpc: 80
-
-// Disables a NPC.
-disablenpc: 80
-
-// Move a NPC
-npcmove: 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
-
-// Shows information about the map
-mapinfo: 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
-
-
-//---------------------
-// 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 '@'). 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!
+
+
+//--------------------------
+// 0: normal player commands
+
+// Give server time. (6 same commands)
+time: 0
+date: 0
+server_date: 0
+serverdate: 0
+server_time: 0
+servertime: 0
+
+// Display your ignore list (people from which you ignore wisps)
+ignorelist: 0
+
+// 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: 0
+
+// 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)
+gm: 100
+
+
+//-------------------------
+// 1: Super player commands
+
+// 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
+
+
+//---------------------------
+// 10: Super player+ commands
+
+// Spawns you to set points in major cities.
+go: 10
+
+
+//----------------------
+// 20: Mediator commands
+
+// Displays helpfile in Athena base directory (2 same commands).
+help: 20
+h: 20
+
+// Warp yourself to a person (3 same commands + /shift).
+jumpto: 20
+goto: 20
+warpto: 20
+
+// follow a player (including warping to them)
+follow: 20
+
+// Disconnects a user from the server (1 command + right click menu for GM "(name) force to quit").
+kick: 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
+
+// Enable all wispers for a player
+inall: 20
+
+// Disable all wispers for a player
+exall: 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).
+local_broadcast: 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 you to view other characters stats.
+charstats: 40
+
+// Shows Stats Of All Characters Online
+charstatsall: 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
+
+//Makes an egg
+makeegg: 40
+
+//Hatches an egg
+hatch: 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
+
+// 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
+
+// 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
+charitemlist: 40
+
+// Display all items of a player's storage
+charstoragelist: 40
+
+// Display all items of a player's cart
+charcartlist: 40
+
+
+//---------------------
+// 50: Sub-GM+ commands
+
+// Changes character's model
+charmodel: 50
+
+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
+
+// Spawns a monster with parameters not in same order of @spawn.
+monster2: 50
+
+// To get a peco to (un)ride for another player.
+charmountpeco: 50
+
+// Enables to give possibility to a player to rename his/her pet.
+charpetrename: 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
+
+// Sets another persons base level.
+charbaselvl: 60
+
+// Changes the sex of an online player (all characters on the account)
+charchangesex: 60
+
+// Remove items from a character
+chardelitem: 60
+
+// Sets another persons job level.
+charjlvl: 60
+
+// Sets the job of another character (2 same commands).
+charjob: 60
+charjobchange: 60
+
+// Set options on another character.
+charoption: 60
+
+// Gives another character status points
+charstpoint: 60
+
+// Gives another character skill points
+charskpoint: 60
+
+// Resets another character's stats
+charreset: 60
+
+// Resets another character's status, skills
+charstreset: 60
+charskreset: 60
+
+// Saves the respawn point of another character.
+charsave: 60
+
+// Changes another character's zenny
+charzeny: 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
+
+// ??
+itemcheck: 60
+
+// Kill another character without hitting them.
+kill: 60
+
+// Kill all monsters in map (with drops)
+killmonster: 60
+
+// Creates yourself a pet egg, have to use Pet ID.
+makeegg: 60
+
+// Instantly kills player whose name is entered and deals insane damage to everything around.
+nuke: 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
+
+// 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
+
+// Warp another person to a certain map, at (x,y) coordinates (2 same commands).
+rura+: 60
+charwarp: 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.)
+guildspy: 60
+
+//Allows you to spy on any party's party chat. (at least one party member must be online.)
+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
+
+// To change disguise of another player/GM
+chardisguise: 60
+charundisguise: 60
+
+// Enables platinum skills of another player.
+charquestskill: 60
+
+// Enables lost skills of another player.
+charlostskill: 60
+
+// turn on and off skills on a map
+skillon: 60
+skilloff: 60
+
+// Create a static warp portal that lasts until the next reboot
+addwarp: 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
+
+// Enables a NPC.
+enablenpc: 80
+
+// Disables a NPC.
+disablenpc: 80
+
+// Move a NPC
+npcmove: 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
+
+// Shows information about the map
+mapinfo: 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
+
+
+//---------------------
+// OTHER: not a command
+
+//import: conf/import/atcommand_conf.txt
diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf
index 04c5227af..17ef2ca54 100644
--- a/conf-tmpl/battle_athena.conf
+++ b/conf-tmpl/battle_athena.conf
@@ -1,725 +1,725 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-//eAthena Battle Configuration File
-// 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
-// Other Information:
-// 1000 miliseconds is 1 second.
-//--------------------------------------------------------------
-
-// Do you want to debug warp points? If set to yes, warp points will appear as flags.(Note 1)
-warp_point_debug: no
-
-// When calculating critical, should we take in to account the enimies luck? (Note 1)
-enemy_critical: yes
-
-// Enemy's Critical Rate (Note 2)
-enemy_critical_rate: 100
-
-// Are enemy attacks effected by their strength? (Note 1)
-enemy_str: yes
-
-// Can enemies have perfect flee? (Note 1)
-enemy_perfect_flee: no
-
-// 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 is dependent on the caster's DEX? (Note 1)
-delay_dependon_dex: yes
-
-// At what dex does the cast time become zero (instacast)
-castrate_dex_scale: 150
-
-// Is 'Skills add a delay before you can attack' enabled? (Note 1)
-skill_delay_attack_enable: yes
-
-// Whether or not cards and attributes in the left hand are enabled (Note 1)
-left_cardfix_to_right: yes
-
-// Increase player's attack range (in cells)
-player_skill_add_range: 0
-
-// If the target moves out of range while casting, do we take the items and SP for the skill anyway? (Note 1)
-skill_out_range_consume: no
-
-// Increase Monsters attack range
-monster_skill_add_range: 0
-
-// If a player is attacked, will they have a delay in being able to move? (Note 1)
-// (Setting to no will be like always endure)
-player_damage_delay: yes
-
-// Damaged delay rate (Note 2)
-player_damage_delay_rate: 100
-
-// Is a player's defense NOT dependant on an enemies attack? (Note 1)
-defunit_not_enemy: yes
-
-// Are summoned monsters level greater then your base level? (I think this is for dead branches) (Note 1)
-random_monster_checklv: yes
-
-// The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
-atcommand_spawn_quantity_limit: 100
-
-// Does HP recover if hit by an attribute that's same as your own? (Note 1)
-attribute_recover: yes
-
-// If an item is droped, 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
-
-// How long before the first person who did the most damage to a monster can get the item? (in milliseconds)
-item_first_get_time: 3000
-
-// How long before the second person who did the second most damage to a monster can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
-item_second_get_time: 1000
-
-// How long before the third person who did the third most/least damage to a monster can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time And Second Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
-item_third_get_time: 1000
-
-// How long before the first person who did the most damage to a MVP can get the item? (in milliseconds)
-mvp_item_first_get_time: 10000
-
-// How long before the second person who did the second most damage to a MVP can get the item? (in milliseconds)
-// (It Adds Time From The First Persons Time)
-// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
-mvp_item_second_get_time: 10000
-
-// How long before the third person who did the third most/least damage to a MVP can get the item
-//(Note the Amount is in Milliseconds and It Adds Time From The First Persons Time And Second Persons Time)
-//So It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
-mvp_item_third_get_time: 2000
-
-// Item drop rates (Note 2)
-
-// The rate the common items are droped (Items that are in the ETC tab, besides card)
-item_rate_common: 100
-item_drop_common_min: 1
-item_drop_common_max: 10000
-
-// The rate healing items are droped (items that restore HP or SP)
-item_rate_heal: 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 droped.
-item_rate_use: 100
-item_drop_use_min: 1
-item_drop_use_max: 10000
-
-// The rate at which equipment is droped.
-item_rate_equip: 100
-item_drop_equip_min: 1
-item_drop_equip_max: 10000
-
-// The rate at which cards are droped
-item_rate_card: 100
-item_drop_card_min: 1
-item_drop_card_max: 10000
-
-item_drop_mvp_min: 1
-item_drop_mvp_max: 10000
-
-// Can the monster's drop rate become 0? (Note 1)
-drop_rate0item: no
-
-// Rate at which exp. is given. (Note 2)
-base_exp_rate: 100
-
-// Rate at which job exp. is given. (Note 2)
-job_exp_rate: 100
-
-// PVP exp. Do players get exp during pvp
-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?
-zeny_penalty: 0
-
-// 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
-
-// [MVP] Summoned monsters HP rate, that is, monsters summoned by an MVP will have this much HP. (Note 2)
-mvp_hp_rate: 100
-
-// [MVP] Item drop rate, that is, the overall drop rate for items droped by an MVP. (Note 2)
-mvp_item_rate: 100
-
-// [MVP] Exp. rate. (Note 2)
-mvp_exp_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
-
-// (@) 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
-
-// [GM] Can use all skills? (No or mimimum GM level)
-gm_all_skill: no
-
-// [GM] Can use all abracadabra skills? (No minimum GM level)
-gm_all_skill_add_abra: no
-
-// [GM] Can equip anything? (No or minimum GM level, can cause client errors.)
-gm_all_equipment: no
-
-// [GM] Raise skills unconditionally, that is, put points in to a skill not in thier jobs skill tree? (no or minimum gm level)
-gm_skill_unconditional: no
-
-// Can a normal player by-pass the skill tree? (Note 1)
-player_skillfree: no
-
-// When doing a skill reset, whether the skill's restriction is to be ignored or not. (Note 1)
-player_skillup_limit: yes
-
-// Forging success rate. (Note 2)
-weapon_produce_rate: 100
-
-// Prepare Potion succsss rate. (Note 2)
-potion_produce_rate: 100
-
-// Allow monsters to be aggresive and attack first? (Note 1)
-monster_active_enable: yes
-
-// Monster damage delay rate (Note 1)
-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
-
-// Enable monster skills? (Note 1)
-mob_skill_use: yes
-
-// Rate of monsters on a map, 200 would be twice as many as normal. (Note 2)
-mob_count_rate: 100
-
-// 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!
-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 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
-
-// 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
-
-// [PET] Rate for catching pets (Note 2)
-pet_catch_rate: 100
-
-// [PET] Can you name a pet more then once? (Note 1)
-pet_rename: no
-
-// [PET] The rate a pet will get friendly by feeding it. (Note 2)
-pet_friendly_rate: 100
-
-// [PET] The rate at which a pet will become hungry. (Note 2)
-pet_hungry_delay_rate: 100
-
-// [PET] 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
-
-// [PET] Does Pet's Attack Damage Based On Str (Note 1)
-pet_str: yes
-
-// [PET] Whether or not the pet's will use skills. (Note 1)
-pet_status_support: yes
-
-// [PET] Does the pet need its equipment before it does its skill? (Note 1)
-pet_equip_required: yes
-
-// [PET] Will all pets attack? (Note 1)
-// Do NOT use this with pet skills!
-pet_attack_support: no
-
-// [PET] When the master receives damage from the monster, whether or not the pet attacks back.
-pet_damage_support: no
-
-// [PET] Rate at which a pet will support it's owner in battle. (Note 2)
-pet_support_rate: 100
-
-// [PET] Does the pets owner receive exp from the pets damage?
-pet_attack_exp_to_master: no
-
-// [PET] The rate exp. is gained from the pet attacking monsters
-pet_attack_exp_rate: 100
-
-// Will there be a minimum skill dmg even if there is a miss?
-skill_min_damage: no
-
-// Which finger offensive style can be used?
-// 0 = Aegis style
-// 1 = Athena style
-finger_offensive_type: 0
-
-// 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 (100 is normal, 200 is double.)
-// The way it is calculated is (money recieved * skill lv) * shop_exp / 100.
-shop_exp: 0
-
-// The delay rate of monk's combo (Note 2)
-combo_delay_rate: 100
-
-// Item check? (Note 1)
-// When logged in or moving in map if the item the player is holding isn't correct there will be a check.
-item_check: no
-
-// Will tuxedo and wedding dresses be shown when worn? (Note 1)
-wedding_modifydisplay: yes
-
-// The time interval for HP to restore naturally. (in milliseconds)
-natural_healhp_interval: 6000
-
-// The time interval for SP to restore naturally. (in milliseconds)
-natural_healsp_interval: 8000
-
-// Automatic healing skill's time interval. (in milliseconds)
-natural_heal_skill_interval: 10000
-
-// The maximum weight for a character to carry when the character stops healing naturally. (in %)
-natural_heal_weight_rate: 50
-
-// Override item names from GRF file? (Note 1)
-item_name_override_grffile: yes
-
-// Are arrows are consumed when used on a bow? (Note 1)
-arrow_decrement: yes
-
-// Maximum atk speed. (Default is 190)
-max_aspd: 190
-
-// Maximum HP. (Default is 32500)
-max_hp: 32500
-
-// Maximum SP. (Default is 32500)
-max_sp: 32500
-
-// 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
-
-// Max limit of char stats. (agi, str, etc.)
-max_parameter: 99
-
-// Max weight carts can hold.
-max_cart_weight: 8000
-
-// Display player skill errors in console? (for debug only) (default: off) (Note 1)
-player_skill_log: off
-
-// Display monster skill errors in console? (for debug only) (default: off) (Note 1)
-monster_skill_log: off
-
-// 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: off
-
-// Display other stuff? (for debug only) (default: off) (Note 1)
-etc_log: off
-
-// Save Clothes color. (This will degrade performance [in txt?]) (Note 1)
-save_clothcolor: yes
-
-// Undead type differeniate.
-// 0 = element undead
-// 1 = race undead
-// 2 = both
-undead_detect_type: 2
-
-// Operational mode of automatic counter.
-// 0 = disregard DEF and HIT+20 . CRI*2, 1 = 100% critical
-// Players
-player_auto_counter_type: 0
-// Monsters
-monster_auto_counter_type: 0
-
-// Type of penalty that is applied to FLEE when more than agi_penaly_count monsters are targetting player
-// 0 = no penalty is applied
-// 1 = agi_penaly_num is reduced from FLEE as a %
-// 2 = agi_penaly_num is reduced from FLEE as an exact amount
-agi_penaly_type: 1
-
-// Amount of enemies required to be targetting player before FLEE begins to be penalized
-agi_penaly_count: 3
-
-// Amount of FLEE penalized per each attacking monster more than agi_penaly_count
-agi_penaly_num: 10
-
-// Type of penalty that is applied to VIT defense when more than vit_penaly_count monsters are targetting player
-// 0 = no penalty is applied
-// 1 = vit_penaly_num is reduced from FLEE as a %
-// 2 = vit_penaly_num is reduced from FLEE as an exact amount
-vit_penaly_type: 1
-
-// Amount of enemies required to be targetting player before VIT defense begins to be penalized
-vit_penaly_count: 3
-
-// Amount of VIT defense penalized per each attacking monster more than vit_penaly_count
-vit_penaly_num: 5
-
-// When the player attacks an object, the calculation method of DEF.
-// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
-player_defense_type: 0
-
-// When the monster attacks an object, the calculation method of DEF.
-// With 0 this will be ignored, at 1 or more def = subtraction of (DEF* value).
-monster_defense_type: 0
-
-// When the pet attacks an object, the calculation method of DEF.
-// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
-pet_defense_type: 0
-
-//MDEF‚same as above....(MDEF*value)
-magic_defense_type: 0
-
-// Whether or not, ground skills of the players' will stack. (Note 1)
-player_skill_reiteration: no
-
-//Whether or not, ground skills of the monsters' will pile up. (Note 1)
-monster_skill_reiteration: no
-
-//Whether or not ground based skills of a certain type such as traps can be cast straight onto other players. (Note 1)
-player_skill_nofootset: yes
-
-//Whether or not ground based skills of a certain type such as traps can be cast straight onto monsters. (Note 1)
-monster_skill_nofootset: yes
-
-// When a player is cloaking, Whether the wall is checked or not. (Note 1)
-// Note: Gravity announced that they were changing cloaking so it would
-// not need a wall, but this was never implemented. I set to no, for fun.
-player_cloak_check_type: no
-
-// When a monster is cloaking, Whether the wall is checked or not. (Note 1)
-monster_cloak_check_type: no
-
-// Melee damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_short_attack_damage_rate: 100
-
-// Ranged damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_long_attack_damage_rate: 100
-
-// Magic damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_magic_attack_damage_rate: 100
-
-// Misc damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
-gvg_misc_attack_damage_rate: 100
-
-// When the empelium is broken with WoE mode on, How Long Before The Declaration Of Castle Owner
-// and Removal of Monsters/Players from Castle. (in milliseconds)
-gvg_eliminate_time: 7000
-
-// Whether or not skill is used vis-a-vis the user at the time of MOB skill motion of condition skillused. (Note 1)
-// Not sure what this means, something about monsters changing target?
-mob_changetarget_byskill: no
-
-// Player's Direction Changed When Attacking? (Note 1)
-player_attack_direction_change: yes
-
-// Monsters's Direction Changed When Attacking? (Note 1)
-monster_attack_direction_change: yes
-
-// If the player has Undead Elemental Equipment, should they be frozen or not. (Note 1)
-player_undead_nofreeze: no
-
-// Will Player Skills Stay Within Land Limit or not? (Note 1)
-player_land_skill_limit: yes
-
-// Will Monster Skills Stay Within Land Limit or not? (Note 1)
-monster_land_skill_limit: yes
-
-// If a party uses a skill with penalties do they apply? (Note 1)
-party_skill_penaly: yes
-
-// If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1)
-monster_class_change_full_recover: no
-
-// 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: yes
-
-// Does created holy water have the maker's name on it? (Note 1)
-holywater_name_input: yes
-
-// Stop logout for 10 seconds after a hit? (Note 1)
-prevent_logout: yes
-
-// If skill fails by delay, should it display or not. (Note 1)
-display_delay_skill_fail: yes
-
-// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
-chat_warpportal: no
-
-// Can a monster be warped by a warp portal? (Note 1)
-mob_warpportal: no
-
-// Is a monster summoned via dead branch aggresive? (Note 1)
-dead_branch_active: yes
-
-// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
-vending_max_value: 10000000
-
-// If someone loots, show name in party? (Note 1)
-show_steal_in_same_party: no
-
-// Allow upper class (Advanced 2nd Class)? (Note 1)
-// Just leave this at yes
-enable_upper_class: yes
-
-// Is a usual attack of a pet delivered withOUT an attribute? (Note 1)
-pet_attack_attr_none: no
-
-// Is a usual attack of a player delivered withOUT an attribute? (Note 1)
-pc_attack_attr_none: no
-
-// Is a usual attack of a monster delivered withOUT an attribute? (Note 1)
-mob_attack_attr_none: no
-
-// mob attacks againsts players wearing ghostring armor do full damage
-mob_ghostring_fix: no
-
-// Does the Golden Thief Bug card only work during pvp?
-// no or 0 - gtb works all the time
-// 1 - 100 - percentage of magic damage reduced only during pvp (or gvg)
-gtb_pvp_only: no
-
-// 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_penaly_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_penaly_count_lv: 3
-
-// Grandcross Settings (Dont mess with these)
-// Even if MOB (PC) has overlapped, it HIT(s) compulsion 3. (Default no)
-gx_allhit: no
-// The effect of the arms card of a damage %UP system is set also to GX at -L effect. (default no)
-gx_cardfix: no
-// The attribute affinity of GX is calculated doubly. (Default yes)
-gx_dupele: yes
-// Grandcross display type (Default 1)
-// 0: Yellow character
-// 1: White character
-gx_disptype: 1
-
-// If no than you can use the ensemble skills alone. (Note 1)
-player_skill_partner_check: yes
-
-// Is the character of a GM account set as the object of a display by @ command etc. or not?
-hide_GM_session: no
-
-// ƒ†ƒjƒbƒgˆÚ“®ˆ-•û-@B0‚Å-{ŽIŽd-l(‰ñü•‰‰×¨dAŽIˆ-¨Œy)A1‚ÅAthenaŽd-l(‰ñü•‰‰×¨ŒyAŽIˆ-¨d)
-// translation (babelfish):
-// Unit portable place - ? @.
-// With 0 - {mackerel SI -l (circuit load -> heavily, the mackerel place - the ? ? lightly),
-// With 1 - Athena SI -l (circuit load -> lightly, the mackerel place - the ? ? it is heavy)
-unit_movement_type: 0
-
-// 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
-
-// ƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ÌŽd-l 0:-{ŽIŽd-lAã©1ŒÂ 1:AthenaŽd-lAŽg‚Á‚½ƒAƒCƒeƒ€‚ðŽg‚Á‚½ŒÂ”
-// translation (babelfish):
-// SI of ???????? -l
-// 0: - {Mackerel SI -l, trap 1
-// 1:Athena SI -l, the quantity which used the item which was used
-skill_removetrap_type: 0
-
-// Will display experience gained from killing a monster. (Note 1)
-disp_experience: no
-
-// Whether or not Marine Spheres and Floras summoned by Alchemist will drop items and give experience? (Note 1)
-alchemist_summon_reward: no
-
-// Maximum level (default 255). Requires that you have an experience table that supports more than 99 levels to go
-// any higher. It is left at 255 for default as to not cause problems for people who already have players at higher levels.
-// @lvup command will not go higher than this value, and therefor will not loop back around 0.
-maximum_level: 255
-
-// Leave at 0 to use normal drop system. Anything higher than 0 will allow luk to affect drop rates, based on a percentage.
-// Example 1: 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.
-// Example 2 : Setting 100 with 99 luk would add 99 to the drop rate.
-drops_by_luk: 0
-
-// Do all monsters ignore GMs unless attacked? (Note 1)
-monsters_ignore_gm: no
-
-// Turn equipment breaking on. (Note 1)
-// Turning this one will allow equipment to break in battles,
-// as well as some skills that have chance to break equipmen.
-equipment_breaking: no
-
-// Overall rate of which equipment can break. (Note 2) [100 = .01% chance to break equipment before penalties.]
-// Critical attacks will double chance to break equipment, and other skills (such as Power Thrust) will increase weapon breaking chance as well.
-// This does not effect Sage weapon enchantment failure chance.
-equipment_break_rate: 100
-
-// 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.
-pk_mode: no
-
-// Turn this on to allow a player to level up more than once from a kill. (Note 1)
-multi_level_up: no
-
-// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
-backstab_bow_penalty: yes
-
-// Choose if server begin with night (yes) or day (no)
-night_at_start: no
-
-// Define duration in msec of the day (default: 7,200,000 = 2 hours)
-// Set to 0 to disable day cycle (but not @day GM command).
-// Except 0, minimum is 60000 (1 minute).
-day_duration: 7200000
-
-// Define duration in msec of the night (default: 1,800,000 = 30 min)
-// Set to 0 to disable night cycle (but not @night GM command).
-// Except 0, minimum is 60000 (1 minute).
-night_duration: 1800000
-
-// Will display a mob's hp/maxhp when the mouse cursor is over them. (Note 1)
-// Will not display guardian or emperium hp.
-//
-// Still under testing (works but doesn't update)
-show_mob_hp: no
-
-// Ban people that try to use an other name of its name (spoof name).
-// Duration of the ban, in minutes (default: 5). Value from 0 to 32767
-// to disable the ban, set 0
-ban_spoof_namer: 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
-
-// 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
-// 64: 2004-09-21aSakray Client
-// 128: 2004-10-18bSakexe Client
-// 256: 2004-10-25aSakexe Client
-// default value: 511 (all clients)
-packet_ver_flag: 511
-
-// Allow GMs to mute players or not?
-muting_players: no
-
-// Mail system - Only function in sql version
-mail_system: no
-
-// valid range of dye's and styles on the client
-min_hair_style: 0
-max_hair_style: 20
-min_hair_color: 0
-max_hair_color: 9
-min_cloth_color: 0
-max_cloth_color: 4
-
-// Visible area size (how many squares away from a player can they see)
-area_size: 14
-
-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
+// 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
+// Other Information:
+// 1000 miliseconds is 1 second.
+//--------------------------------------------------------------
+
+// Do you want to debug warp points? If set to yes, warp points will appear as flags.(Note 1)
+warp_point_debug: no
+
+// When calculating critical, should we take in to account the enimies luck? (Note 1)
+enemy_critical: yes
+
+// Enemy's Critical Rate (Note 2)
+enemy_critical_rate: 100
+
+// Are enemy attacks effected by their strength? (Note 1)
+enemy_str: yes
+
+// Can enemies have perfect flee? (Note 1)
+enemy_perfect_flee: no
+
+// 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 is dependent on the caster's DEX? (Note 1)
+delay_dependon_dex: yes
+
+// At what dex does the cast time become zero (instacast)
+castrate_dex_scale: 150
+
+// Is 'Skills add a delay before you can attack' enabled? (Note 1)
+skill_delay_attack_enable: yes
+
+// Whether or not cards and attributes in the left hand are enabled (Note 1)
+left_cardfix_to_right: yes
+
+// Increase player's attack range (in cells)
+player_skill_add_range: 0
+
+// If the target moves out of range while casting, do we take the items and SP for the skill anyway? (Note 1)
+skill_out_range_consume: no
+
+// Increase Monsters attack range
+monster_skill_add_range: 0
+
+// If a player is attacked, will they have a delay in being able to move? (Note 1)
+// (Setting to no will be like always endure)
+player_damage_delay: yes
+
+// Damaged delay rate (Note 2)
+player_damage_delay_rate: 100
+
+// Is a player's defense NOT dependant on an enemies attack? (Note 1)
+defunit_not_enemy: yes
+
+// Are summoned monsters level greater then your base level? (I think this is for dead branches) (Note 1)
+random_monster_checklv: yes
+
+// The maximum quantity of monsters that can be summoned per GM command (0 denotes an unlimited quantity)
+atcommand_spawn_quantity_limit: 100
+
+// Does HP recover if hit by an attribute that's same as your own? (Note 1)
+attribute_recover: yes
+
+// If an item is droped, 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
+
+// How long before the first person who did the most damage to a monster can get the item? (in milliseconds)
+item_first_get_time: 3000
+
+// How long before the second person who did the second most damage to a monster can get the item? (in milliseconds)
+// (It Adds Time From The First Persons Time)
+// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
+item_second_get_time: 1000
+
+// How long before the third person who did the third most/least damage to a monster can get the item? (in milliseconds)
+// (It Adds Time From The First Persons Time And Second Persons Time)
+// So, It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
+item_third_get_time: 1000
+
+// How long before the first person who did the most damage to a MVP can get the item? (in milliseconds)
+mvp_item_first_get_time: 10000
+
+// How long before the second person who did the second most damage to a MVP can get the item? (in milliseconds)
+// (It Adds Time From The First Persons Time)
+// So, It Is Like First Person's Time + Second Person's Time = Time Before Second Person Can Get The Items
+mvp_item_second_get_time: 10000
+
+// How long before the third person who did the third most/least damage to a MVP can get the item
+//(Note the Amount is in Milliseconds and It Adds Time From The First Persons Time And Second Persons Time)
+//So It Is Like First Person's Time + Second Person's Time + Third Person's Time = Time Before Third Person Can Get The Items
+mvp_item_third_get_time: 2000
+
+// Item drop rates (Note 2)
+
+// The rate the common items are droped (Items that are in the ETC tab, besides card)
+item_rate_common: 100
+item_drop_common_min: 1
+item_drop_common_max: 10000
+
+// The rate healing items are droped (items that restore HP or SP)
+item_rate_heal: 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 droped.
+item_rate_use: 100
+item_drop_use_min: 1
+item_drop_use_max: 10000
+
+// The rate at which equipment is droped.
+item_rate_equip: 100
+item_drop_equip_min: 1
+item_drop_equip_max: 10000
+
+// The rate at which cards are droped
+item_rate_card: 100
+item_drop_card_min: 1
+item_drop_card_max: 10000
+
+item_drop_mvp_min: 1
+item_drop_mvp_max: 10000
+
+// Can the monster's drop rate become 0? (Note 1)
+drop_rate0item: no
+
+// Rate at which exp. is given. (Note 2)
+base_exp_rate: 100
+
+// Rate at which job exp. is given. (Note 2)
+job_exp_rate: 100
+
+// PVP exp. Do players get exp during pvp
+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?
+zeny_penalty: 0
+
+// 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
+
+// [MVP] Summoned monsters HP rate, that is, monsters summoned by an MVP will have this much HP. (Note 2)
+mvp_hp_rate: 100
+
+// [MVP] Item drop rate, that is, the overall drop rate for items droped by an MVP. (Note 2)
+mvp_item_rate: 100
+
+// [MVP] Exp. rate. (Note 2)
+mvp_exp_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
+
+// (@) 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
+
+// [GM] Can use all skills? (No or mimimum GM level)
+gm_all_skill: no
+
+// [GM] Can use all abracadabra skills? (No minimum GM level)
+gm_all_skill_add_abra: no
+
+// [GM] Can equip anything? (No or minimum GM level, can cause client errors.)
+gm_all_equipment: no
+
+// [GM] Raise skills unconditionally, that is, put points in to a skill not in thier jobs skill tree? (no or minimum gm level)
+gm_skill_unconditional: no
+
+// Can a normal player by-pass the skill tree? (Note 1)
+player_skillfree: no
+
+// When doing a skill reset, whether the skill's restriction is to be ignored or not. (Note 1)
+player_skillup_limit: yes
+
+// Forging success rate. (Note 2)
+weapon_produce_rate: 100
+
+// Prepare Potion succsss rate. (Note 2)
+potion_produce_rate: 100
+
+// Allow monsters to be aggresive and attack first? (Note 1)
+monster_active_enable: yes
+
+// Monster damage delay rate (Note 1)
+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
+
+// Enable monster skills? (Note 1)
+mob_skill_use: yes
+
+// Rate of monsters on a map, 200 would be twice as many as normal. (Note 2)
+mob_count_rate: 100
+
+// 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!
+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 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
+
+// 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
+
+// [PET] Rate for catching pets (Note 2)
+pet_catch_rate: 100
+
+// [PET] Can you name a pet more then once? (Note 1)
+pet_rename: no
+
+// [PET] The rate a pet will get friendly by feeding it. (Note 2)
+pet_friendly_rate: 100
+
+// [PET] The rate at which a pet will become hungry. (Note 2)
+pet_hungry_delay_rate: 100
+
+// [PET] 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
+
+// [PET] Does Pet's Attack Damage Based On Str (Note 1)
+pet_str: yes
+
+// [PET] Whether or not the pet's will use skills. (Note 1)
+pet_status_support: yes
+
+// [PET] Does the pet need its equipment before it does its skill? (Note 1)
+pet_equip_required: yes
+
+// [PET] Will all pets attack? (Note 1)
+// Do NOT use this with pet skills!
+pet_attack_support: no
+
+// [PET] When the master receives damage from the monster, whether or not the pet attacks back.
+pet_damage_support: no
+
+// [PET] Rate at which a pet will support it's owner in battle. (Note 2)
+pet_support_rate: 100
+
+// [PET] Does the pets owner receive exp from the pets damage?
+pet_attack_exp_to_master: no
+
+// [PET] The rate exp. is gained from the pet attacking monsters
+pet_attack_exp_rate: 100
+
+// Will there be a minimum skill dmg even if there is a miss?
+skill_min_damage: no
+
+// Which finger offensive style can be used?
+// 0 = Aegis style
+// 1 = Athena style
+finger_offensive_type: 0
+
+// 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 (100 is normal, 200 is double.)
+// The way it is calculated is (money recieved * skill lv) * shop_exp / 100.
+shop_exp: 0
+
+// The delay rate of monk's combo (Note 2)
+combo_delay_rate: 100
+
+// Item check? (Note 1)
+// When logged in or moving in map if the item the player is holding isn't correct there will be a check.
+item_check: no
+
+// Will tuxedo and wedding dresses be shown when worn? (Note 1)
+wedding_modifydisplay: yes
+
+// The time interval for HP to restore naturally. (in milliseconds)
+natural_healhp_interval: 6000
+
+// The time interval for SP to restore naturally. (in milliseconds)
+natural_healsp_interval: 8000
+
+// Automatic healing skill's time interval. (in milliseconds)
+natural_heal_skill_interval: 10000
+
+// The maximum weight for a character to carry when the character stops healing naturally. (in %)
+natural_heal_weight_rate: 50
+
+// Override item names from GRF file? (Note 1)
+item_name_override_grffile: yes
+
+// Are arrows are consumed when used on a bow? (Note 1)
+arrow_decrement: yes
+
+// Maximum atk speed. (Default is 190)
+max_aspd: 190
+
+// Maximum HP. (Default is 32500)
+max_hp: 32500
+
+// Maximum SP. (Default is 32500)
+max_sp: 32500
+
+// 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
+
+// Max limit of char stats. (agi, str, etc.)
+max_parameter: 99
+
+// Max weight carts can hold.
+max_cart_weight: 8000
+
+// Display player skill errors in console? (for debug only) (default: off) (Note 1)
+player_skill_log: off
+
+// Display monster skill errors in console? (for debug only) (default: off) (Note 1)
+monster_skill_log: off
+
+// 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: off
+
+// Display other stuff? (for debug only) (default: off) (Note 1)
+etc_log: off
+
+// Save Clothes color. (This will degrade performance [in txt?]) (Note 1)
+save_clothcolor: yes
+
+// Undead type differeniate.
+// 0 = element undead
+// 1 = race undead
+// 2 = both
+undead_detect_type: 2
+
+// Operational mode of automatic counter.
+// 0 = disregard DEF and HIT+20 . CRI*2, 1 = 100% critical
+// Players
+player_auto_counter_type: 0
+// Monsters
+monster_auto_counter_type: 0
+
+// Type of penalty that is applied to FLEE when more than agi_penaly_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = agi_penaly_num is reduced from FLEE as a %
+// 2 = agi_penaly_num is reduced from FLEE as an exact amount
+agi_penaly_type: 1
+
+// Amount of enemies required to be targetting player before FLEE begins to be penalized
+agi_penaly_count: 3
+
+// Amount of FLEE penalized per each attacking monster more than agi_penaly_count
+agi_penaly_num: 10
+
+// Type of penalty that is applied to VIT defense when more than vit_penaly_count monsters are targetting player
+// 0 = no penalty is applied
+// 1 = vit_penaly_num is reduced from FLEE as a %
+// 2 = vit_penaly_num is reduced from FLEE as an exact amount
+vit_penaly_type: 1
+
+// Amount of enemies required to be targetting player before VIT defense begins to be penalized
+vit_penaly_count: 3
+
+// Amount of VIT defense penalized per each attacking monster more than vit_penaly_count
+vit_penaly_num: 5
+
+// When the player attacks an object, the calculation method of DEF.
+// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
+player_defense_type: 0
+
+// When the monster attacks an object, the calculation method of DEF.
+// With 0 this will be ignored, at 1 or more def = subtraction of (DEF* value).
+monster_defense_type: 0
+
+// When the pet attacks an object, the calculation method of DEF.
+// With 0 this will be ignored specification, at 1 or more def = subtraction of (DEF* value).
+pet_defense_type: 0
+
+//MDEF‚same as above....(MDEF*value)
+magic_defense_type: 0
+
+// Whether or not, ground skills of the players' will stack. (Note 1)
+player_skill_reiteration: no
+
+//Whether or not, ground skills of the monsters' will pile up. (Note 1)
+monster_skill_reiteration: no
+
+//Whether or not ground based skills of a certain type such as traps can be cast straight onto other players. (Note 1)
+player_skill_nofootset: yes
+
+//Whether or not ground based skills of a certain type such as traps can be cast straight onto monsters. (Note 1)
+monster_skill_nofootset: yes
+
+// When a player is cloaking, Whether the wall is checked or not. (Note 1)
+// Note: Gravity announced that they were changing cloaking so it would
+// not need a wall, but this was never implemented. I set to no, for fun.
+player_cloak_check_type: no
+
+// When a monster is cloaking, Whether the wall is checked or not. (Note 1)
+monster_cloak_check_type: no
+
+// Melee damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_short_attack_damage_rate: 100
+
+// Ranged damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_long_attack_damage_rate: 100
+
+// Magic damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_magic_attack_damage_rate: 100
+
+// Misc damage adjustments for WoE battles (Guild Vs Guild) (Note 2)
+gvg_misc_attack_damage_rate: 100
+
+// When the empelium is broken with WoE mode on, How Long Before The Declaration Of Castle Owner
+// and Removal of Monsters/Players from Castle. (in milliseconds)
+gvg_eliminate_time: 7000
+
+// Whether or not skill is used vis-a-vis the user at the time of MOB skill motion of condition skillused. (Note 1)
+// Not sure what this means, something about monsters changing target?
+mob_changetarget_byskill: no
+
+// Player's Direction Changed When Attacking? (Note 1)
+player_attack_direction_change: yes
+
+// Monsters's Direction Changed When Attacking? (Note 1)
+monster_attack_direction_change: yes
+
+// If the player has Undead Elemental Equipment, should they be frozen or not. (Note 1)
+player_undead_nofreeze: no
+
+// Will Player Skills Stay Within Land Limit or not? (Note 1)
+player_land_skill_limit: yes
+
+// Will Monster Skills Stay Within Land Limit or not? (Note 1)
+monster_land_skill_limit: yes
+
+// If a party uses a skill with penalties do they apply? (Note 1)
+party_skill_penaly: yes
+
+// If monster's class is changed will it fully recover HP and SP and Ailments? (Note 1)
+monster_class_change_full_recover: no
+
+// 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: yes
+
+// Does created holy water have the maker's name on it? (Note 1)
+holywater_name_input: yes
+
+// Stop logout for 10 seconds after a hit? (Note 1)
+prevent_logout: yes
+
+// If skill fails by delay, should it display or not. (Note 1)
+display_delay_skill_fail: yes
+
+// Can a player in chat room (in-game), be warped by a warp portal? (Note 1)
+chat_warpportal: no
+
+// Can a monster be warped by a warp portal? (Note 1)
+mob_warpportal: no
+
+// Is a monster summoned via dead branch aggresive? (Note 1)
+dead_branch_active: yes
+
+// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
+vending_max_value: 10000000
+
+// If someone loots, show name in party? (Note 1)
+show_steal_in_same_party: no
+
+// Allow upper class (Advanced 2nd Class)? (Note 1)
+// Just leave this at yes
+enable_upper_class: yes
+
+// Is a usual attack of a pet delivered withOUT an attribute? (Note 1)
+pet_attack_attr_none: no
+
+// Is a usual attack of a player delivered withOUT an attribute? (Note 1)
+pc_attack_attr_none: no
+
+// Is a usual attack of a monster delivered withOUT an attribute? (Note 1)
+mob_attack_attr_none: no
+
+// mob attacks againsts players wearing ghostring armor do full damage
+mob_ghostring_fix: no
+
+// Does the Golden Thief Bug card only work during pvp?
+// no or 0 - gtb works all the time
+// 1 - 100 - percentage of magic damage reduced only during pvp (or gvg)
+gtb_pvp_only: no
+
+// 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_penaly_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_penaly_count_lv: 3
+
+// Grandcross Settings (Dont mess with these)
+// Even if MOB (PC) has overlapped, it HIT(s) compulsion 3. (Default no)
+gx_allhit: no
+// The effect of the arms card of a damage %UP system is set also to GX at -L effect. (default no)
+gx_cardfix: no
+// The attribute affinity of GX is calculated doubly. (Default yes)
+gx_dupele: yes
+// Grandcross display type (Default 1)
+// 0: Yellow character
+// 1: White character
+gx_disptype: 1
+
+// If no than you can use the ensemble skills alone. (Note 1)
+player_skill_partner_check: yes
+
+// Is the character of a GM account set as the object of a display by @ command etc. or not?
+hide_GM_session: no
+
+// ƒ†ƒjƒbƒgˆÚ“®ˆ-•û-@B0‚Å-{ŽIŽd-l(‰ñü•‰‰×¨dAŽIˆ-¨Œy)A1‚ÅAthenaŽd-l(‰ñü•‰‰×¨ŒyAŽIˆ-¨d)
+// translation (babelfish):
+// Unit portable place - ? @.
+// With 0 - {mackerel SI -l (circuit load -> heavily, the mackerel place - the ? ? lightly),
+// With 1 - Athena SI -l (circuit load -> lightly, the mackerel place - the ? ? it is heavy)
+unit_movement_type: 0
+
+// 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
+
+// ƒŠƒ€[ƒuƒgƒ‰ƒbƒv‚ÌŽd-l 0:-{ŽIŽd-lAã©1ŒÂ 1:AthenaŽd-lAŽg‚Á‚½ƒAƒCƒeƒ€‚ðŽg‚Á‚½ŒÂ”
+// translation (babelfish):
+// SI of ???????? -l
+// 0: - {Mackerel SI -l, trap 1
+// 1:Athena SI -l, the quantity which used the item which was used
+skill_removetrap_type: 0
+
+// Will display experience gained from killing a monster. (Note 1)
+disp_experience: no
+
+// Whether or not Marine Spheres and Floras summoned by Alchemist will drop items and give experience? (Note 1)
+alchemist_summon_reward: no
+
+// Maximum level (default 255). Requires that you have an experience table that supports more than 99 levels to go
+// any higher. It is left at 255 for default as to not cause problems for people who already have players at higher levels.
+// @lvup command will not go higher than this value, and therefor will not loop back around 0.
+maximum_level: 255
+
+// Leave at 0 to use normal drop system. Anything higher than 0 will allow luk to affect drop rates, based on a percentage.
+// Example 1: 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.
+// Example 2 : Setting 100 with 99 luk would add 99 to the drop rate.
+drops_by_luk: 0
+
+// Do all monsters ignore GMs unless attacked? (Note 1)
+monsters_ignore_gm: no
+
+// Turn equipment breaking on. (Note 1)
+// Turning this one will allow equipment to break in battles,
+// as well as some skills that have chance to break equipmen.
+equipment_breaking: no
+
+// Overall rate of which equipment can break. (Note 2) [100 = .01% chance to break equipment before penalties.]
+// Critical attacks will double chance to break equipment, and other skills (such as Power Thrust) will increase weapon breaking chance as well.
+// This does not effect Sage weapon enchantment failure chance.
+equipment_break_rate: 100
+
+// 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.
+pk_mode: no
+
+// Turn this on to allow a player to level up more than once from a kill. (Note 1)
+multi_level_up: no
+
+// Does using bow to do a backstab give a 50% damage penalty? (Note 1)
+backstab_bow_penalty: yes
+
+// Choose if server begin with night (yes) or day (no)
+night_at_start: no
+
+// Define duration in msec of the day (default: 7,200,000 = 2 hours)
+// Set to 0 to disable day cycle (but not @day GM command).
+// Except 0, minimum is 60000 (1 minute).
+day_duration: 7200000
+
+// Define duration in msec of the night (default: 1,800,000 = 30 min)
+// Set to 0 to disable night cycle (but not @night GM command).
+// Except 0, minimum is 60000 (1 minute).
+night_duration: 1800000
+
+// Will display a mob's hp/maxhp when the mouse cursor is over them. (Note 1)
+// Will not display guardian or emperium hp.
+//
+// Still under testing (works but doesn't update)
+show_mob_hp: no
+
+// Ban people that try to use an other name of its name (spoof name).
+// Duration of the ban, in minutes (default: 5). Value from 0 to 32767
+// to disable the ban, set 0
+ban_spoof_namer: 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
+
+// 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
+// 64: 2004-09-21aSakray Client
+// 128: 2004-10-18bSakexe Client
+// 256: 2004-10-25aSakexe Client
+// default value: 511 (all clients)
+packet_ver_flag: 511
+
+// Allow GMs to mute players or not?
+muting_players: no
+
+// Mail system - Only function in sql version
+mail_system: no
+
+// valid range of dye's and styles on the client
+min_hair_style: 0
+max_hair_style: 20
+min_hair_color: 0
+max_hair_color: 9
+min_cloth_color: 0
+max_cloth_color: 4
+
+// Visible area size (how many squares away from a player can they see)
+area_size: 14
+
+import: conf/import/battle_conf.txt
+
diff --git a/conf-tmpl/char_athena.conf b/conf-tmpl/char_athena.conf
index 7edaa69e3..4783f0446 100644
--- a/conf-tmpl/char_athena.conf
+++ b/conf-tmpl/char_athena.conf
@@ -1,171 +1,171 @@
-// Athena Character configuration file.
-
-// Server Communication username and password.
-userid: s1
-passwd: p1
-
-// Server name, use alternative character such as ASCII 160 for spaces.
-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
-//
-// You should only need to set this if you are running behind a
-// firewall or on a machine with multiple interfaces. In that case,
-// you need to specify the IP address you wish to export to the entire world.
-//
-// login_ip:127.0.0.1
-
-// Login Server Port
-login_port: 6900
-
-// Character Server IP
-//
-// You should only need to set this if you are running behind a
-// firewall or on a machine with multiple interfaces. In that case,
-// you need to specify the IP address you wish to export to the entire world.
-//
-// char_ip:127.0.0.1
-
-// Character Server Port
-char_port: 6121
-
-// 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.
-char_new: 0
-
-// Maximum users able to connect to the server. Set to 0 for unlimited.
-max_connect_user: 0
-
-// 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)
-autosave_time: 15
-
-// 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)
-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_1-1.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: 500
-
-// 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:
-// 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: 0
-
-// Set the letters/symbols that you want use with the 'char_name_option' option.
-// Note: add 'space' between 2 others letters/symbols.
-// default: void.
-//char_name_letters:
-
-// 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
-
-// What folder the DB files are in (item_db.txt, etc.)
-db_path: db
-
-// Anti-freeze system enable
-anti_freeze_enable: 0
-// Anti-freeze system interval (in seconds)
-anti_freeze_interval: 6
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
-
-// Mugendai's GUI Support
-imalive_on: 0
-imalive_time: 30
-flush_on: 0
+// Athena Character configuration file.
+
+// Server Communication username and password.
+userid: s1
+passwd: p1
+
+// Server name, use alternative character such as ASCII 160 for spaces.
+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
+//
+// You should only need to set this if you are running behind a
+// firewall or on a machine with multiple interfaces. In that case,
+// you need to specify the IP address you wish to export to the entire world.
+//
+// login_ip:127.0.0.1
+
+// Login Server Port
+login_port: 6900
+
+// Character Server IP
+//
+// You should only need to set this if you are running behind a
+// firewall or on a machine with multiple interfaces. In that case,
+// you need to specify the IP address you wish to export to the entire world.
+//
+// char_ip:127.0.0.1
+
+// Character Server Port
+char_port: 6121
+
+// 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.
+char_new: 0
+
+// Maximum users able to connect to the server. Set to 0 for unlimited.
+max_connect_user: 0
+
+// 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)
+autosave_time: 15
+
+// 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)
+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_1-1.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: 500
+
+// 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:
+// 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: 0
+
+// Set the letters/symbols that you want use with the 'char_name_option' option.
+// Note: add 'space' between 2 others letters/symbols.
+// default: void.
+//char_name_letters:
+
+// 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
+
+// What folder the DB files are in (item_db.txt, etc.)
+db_path: db
+
+// Anti-freeze system enable
+anti_freeze_enable: 0
+// Anti-freeze system interval (in seconds)
+anti_freeze_interval: 6
+
+// If you want use an additional configuration file, uncomment and use this parameter
+//import: path/additional_configuration_file
+
+// Mugendai's GUI Support
+imalive_on: 0
+imalive_time: 30
+flush_on: 0
flush_time: 30 \ No newline at end of file
diff --git a/conf-tmpl/grf-files.txt b/conf-tmpl/grf-files.txt
index 186e690cb..3926a63b4 100644
--- a/conf-tmpl/grf-files.txt
+++ b/conf-tmpl/grf-files.txt
@@ -1,4 +1,4 @@
-data: C:\Program Files\Gravity\RO\data.grf
-sdata: C:\Program Files\Gravity\RO\sdata.grf
-//adata: C:\Program Files\Gravity\RO\adata.grf
+data: C:\Program Files\Gravity\RO\data.grf
+sdata: C:\Program Files\Gravity\RO\sdata.grf
+//adata: C:\Program Files\Gravity\RO\adata.grf
//data_dir: C:\Program Files\Gravity\RO\ \ No newline at end of file
diff --git a/conf-tmpl/help.txt b/conf-tmpl/help.txt
index 76cc3a922..fa8de1f69 100644
--- a/conf-tmpl/help.txt
+++ b/conf-tmpl/help.txt
@@ -1,225 +1,225 @@
-// put at first, the minimum level to display the line
- 0:To use one command, type it inside the message window where you usually type to chat.
- 20:@h/@help - display this help.
- 40:
- 40:--- MESSAGE CMD ---
- 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
- 0:
- 0:--- INFORMATION CMD ---
- 20:@who/@whois [match_text] - Display a listing of who is online and where
- 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 their party/guild
- 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.
- 1:@where [char name] - Tells you the location of a character
- 40:@charstatsall - Displays stats of all characters.
- 40:@charitemlist <char name> - Displays all items of a player.
- 40:@charstoragelist <char name> - Displays all items of a player's storage.
- 40:@charcartlist <char name> - Displays all items of a player's cart.
- 0:@ignorelist - Displays your ignore list
- 99:@mapinfo [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
- 0:@time/@date/@server_date/@serverdate/@server_time/@servertime - Display the date/time of the server
- 60:
- 60:@guildspy <guild_name/id> - You will receive all messages of the guild channel
- 60:@partyspy <party_name/id> - You will receive all messages of the party channel
- 1:
- 1:--- CHANGE GM STATE CMD ---
- 40:/hide/@hide - Makes you character invisible (GM invisibility). Type @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.
- 20:/shift/@jumpto/@warpto/@goto <char name> - Warps you to selected character
- 20:@follow <char_name> - follow a player
- 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:
- 1:@die ---- suicide
- 60:@alive - Revives yourself from death
- 40:@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
- 20:
- 40:@job/@jobchange <job ID> - Changes your job
- 40: 0 Novice 7 Knight 14 Crusader 22 Formal
- 40: 1 Swordman 8 Priest 15 Monk 23 Super Novice
- 40: 2 Mage 9 Wizard 16 Sage
- 40: 3 Archer 10 Blacksmith 17 Rogue
- 40: 4 Acolyte 11 Hunter 18 Alchem
- 40: 5 Merchant 12 Assassin 19 Bard
- 40: 6 Thief 13 Peco-Knight 20 Dancer 21 Peco-Crusader
- 40: 24 Novice High 31 Lord Knight 38 Paladin
- 40: 25 Swordman High 32 High Priest 39 Monk
- 40: 26 Mage High 33 High Wizard 40 Professor
- 40: 27 Archer High 34 Whitesmith 41 Stalker
- 40: 28 Acolyte High 35 Sniper 42 Creator
- 40: 29 Merchant High 36 Assassin Cross 43 Clown
- 40: 30 Thief High 37 Peco Knight 44 Gypsy 45 Peco-Paladin
- 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.
- 40:@option <param1> <param2> <param3> - Adds different visual effects on or around your character
- 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
- 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.
- 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
- 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).
- 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
- 60: @addwarp <map name> <x coord> <y coord>
- 40:
- 40:--- MONSTERS CMD ---
- 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.
- 60:@killmonster [map] - kill all monsters of the map (they drop)
- 40:@killmonster2 - kill all monsters of your map (without drops)
- 1:
- 1:--- ITEMS CMD ---
- 1:@storage - Opens storage
- 50:@gstorage - Opens guild storage
- 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> <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4> = Gives you the desired item.
- 40:@itemreset - Remove all your items.
- 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: It has separately with fragment 3 of the attribute + stars, you can apply.
- 60:@repairall - Repair all items of your inventory
- 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 ---
- 60:@hatch - Create a pet from your inventory eggs list.
- 60:@makeegg <pet_id> - Gives pet egg for monster number in pet DB
- 40:@petfriendly <#> - Set pet friendly amount (0-1000) 1000 = Max
- 40:@pethungry <#> - Set pet hungry amount (0-100) 100 = Max
- 1:@petrename - Re-enable pet rename
- 20:
- 20:--- REMOTE CHAR CMD ---
- 60:@kill <char name> - Kills specified character.
- 40:@charkillable <char name> - make another character killable
- 60:@nuke <char name> - Kills specified character (nuclear effect).
- 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.
- 80:@recallall - Warps every character online to you.
- 60:@charwarp/@rura+ <mapname> <x> <y> <char name> - Warps character to location of choice
- 60:@revive <char name> - Revives target character.
- 40:@charstats <char name> - Displays a characters stats.
- 20:@charignorelist <char name> - Displays ignore list of the player
- 20:@inall <char name> - Allows all wispers for the player
- 20:@exall <char name> - Blocks all wispers for the player
- 60:@charoption <param1> <param2> <param3> <charname> - Like @option command but only to target character.
- 50:@charmountpeco <charname> - Give/remove to a player a peco (Class is required, but not skill).
- 50:@charpetrename <charname> - Re-enable pet rename to a player.
- 60:@charsave <map> <x> <y> <charname> - Changes the target players respawn point.
- 60:@charbaselvl <#> <nickname> - Change a characters base level.
- 60:@charjlvl <#> <nickname> - Change a characters job level.
- 60:@charjob/@charjobchange <job ID> <char name> - Changes target characters job.
- 60:@charzeny <amount> <name> - Give/take a players Zeny
- 60:@charstpoint <amount> <name> - Give/take a players stat points
- 60:@charskpoint <amount> <name> - give/take a players skill points
- 60:@charskreset <charname> - Reset skills of a character.
- 60:@charstreset <charname> - Reset stats of a character.
- 60:@charreset <charname> - Reset stats AND skills of a character.
- 60:@charquestskill <#> <charname> - Gives to a player the specified quest skill.
- 60:@charlostskill <#> <charname> - Takes away the specified quest skill from the player.
- 60:@chardelitem <item_name_or_ID> <quantity> <player> - Remove items from a character
- 50:@charmodel <hair type> <hair color> <clothes color> <name> - Changes a player's model
- 60:@chardisguise <monster_name_or_monster_ID> <char name> - Changes disguise of a player
- 60:@charundisguise <char name> - Cancels disguise of a player
- 60:@charchangesex <name> - Changes sex of a player (all characters of the account)
- 60:@charblock/@block <name> - Blocks definitively a account
- 60:@charunblock/@unblock <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
- 20:@kick <charname> - Kicks specified character off the server
- 99:@kickall - Kick all characters off the server
- 99:@mapexit - Kick all players and shut down map-server.
- 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.
- 60:@unjail/@discharge <char_name> - Discharges specified character/prisoner
- 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
- 0:
- 0:--- ADMIN CMD ---
- 99:@reloaditemdb - Reload item database (admin command)
- 99:@reloadmobdb - Reload monster database (admin command)
- 99:@reloadskilldb - Reload skills definition database (admin command)
- 99:@reloadscript - Reload all scripts (admin command)
- 99:@reloadgmdb - Reload GM levels (admin command)
- 99:@adjgmlvl - Do a temporary adjustment of the GM level of a player (admin command)
- 99:@adjcmdlvl - Do a temporary adjustment of the GM level of a command (admin command)
- 80:@enablenpc <NPC_name> - Enable a NPC (admin command)
- 80:@disablenpc <NPC_name> - Disable a NPC (admin command)
- 80:
- 99:@gat - For debugging (you inspect around gat)
- 99:@packet - For debugging (packet variety)
- 99:
-100:@GM <password> - it becomes GM!
- 0:@email <actual@email> <new@email> - to change your e-mail (characters protection)
+// put at first, the minimum level to display the line
+ 0:To use one command, type it inside the message window where you usually type to chat.
+ 20:@h/@help - display this help.
+ 40:
+ 40:--- MESSAGE CMD ---
+ 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
+ 0:
+ 0:--- INFORMATION CMD ---
+ 20:@who/@whois [match_text] - Display a listing of who is online and where
+ 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 their party/guild
+ 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.
+ 1:@where [char name] - Tells you the location of a character
+ 40:@charstatsall - Displays stats of all characters.
+ 40:@charitemlist <char name> - Displays all items of a player.
+ 40:@charstoragelist <char name> - Displays all items of a player's storage.
+ 40:@charcartlist <char name> - Displays all items of a player's cart.
+ 0:@ignorelist - Displays your ignore list
+ 99:@mapinfo [<0-3> [map]] - Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
+ 0:@time/@date/@server_date/@serverdate/@server_time/@servertime - Display the date/time of the server
+ 60:
+ 60:@guildspy <guild_name/id> - You will receive all messages of the guild channel
+ 60:@partyspy <party_name/id> - You will receive all messages of the party channel
+ 1:
+ 1:--- CHANGE GM STATE CMD ---
+ 40:/hide/@hide - Makes you character invisible (GM invisibility). Type @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.
+ 20:/shift/@jumpto/@warpto/@goto <char name> - Warps you to selected character
+ 20:@follow <char_name> - follow a player
+ 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:
+ 1:@die ---- suicide
+ 60:@alive - Revives yourself from death
+ 40:@heal [<HP> <SP>] - Heals the desired amount of HP and SP. No value specified will do a full heal.
+ 20:
+ 40:@job/@jobchange <job ID> - Changes your job
+ 40: 0 Novice 7 Knight 14 Crusader 22 Formal
+ 40: 1 Swordman 8 Priest 15 Monk 23 Super Novice
+ 40: 2 Mage 9 Wizard 16 Sage
+ 40: 3 Archer 10 Blacksmith 17 Rogue
+ 40: 4 Acolyte 11 Hunter 18 Alchem
+ 40: 5 Merchant 12 Assassin 19 Bard
+ 40: 6 Thief 13 Peco-Knight 20 Dancer 21 Peco-Crusader
+ 40: 24 Novice High 31 Lord Knight 38 Paladin
+ 40: 25 Swordman High 32 High Priest 39 Monk
+ 40: 26 Mage High 33 High Wizard 40 Professor
+ 40: 27 Archer High 34 Whitesmith 41 Stalker
+ 40: 28 Acolyte High 35 Sniper 42 Creator
+ 40: 29 Merchant High 36 Assassin Cross 43 Clown
+ 40: 30 Thief High 37 Peco Knight 44 Gypsy 45 Peco-Paladin
+ 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.
+ 40:@option <param1> <param2> <param3> - Adds different visual effects on or around your character
+ 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
+ 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.
+ 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
+ 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).
+ 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
+ 60: @addwarp <map name> <x coord> <y coord>
+ 40:
+ 40:--- MONSTERS CMD ---
+ 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.
+ 60:@killmonster [map] - kill all monsters of the map (they drop)
+ 40:@killmonster2 - kill all monsters of your map (without drops)
+ 1:
+ 1:--- ITEMS CMD ---
+ 1:@storage - Opens storage
+ 50:@gstorage - Opens guild storage
+ 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> <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4> = Gives you the desired item.
+ 40:@itemreset - Remove all your items.
+ 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: It has separately with fragment 3 of the attribute + stars, you can apply.
+ 60:@repairall - Repair all items of your inventory
+ 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 ---
+ 60:@hatch - Create a pet from your inventory eggs list.
+ 60:@makeegg <pet_id> - Gives pet egg for monster number in pet DB
+ 40:@petfriendly <#> - Set pet friendly amount (0-1000) 1000 = Max
+ 40:@pethungry <#> - Set pet hungry amount (0-100) 100 = Max
+ 1:@petrename - Re-enable pet rename
+ 20:
+ 20:--- REMOTE CHAR CMD ---
+ 60:@kill <char name> - Kills specified character.
+ 40:@charkillable <char name> - make another character killable
+ 60:@nuke <char name> - Kills specified character (nuclear effect).
+ 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.
+ 80:@recallall - Warps every character online to you.
+ 60:@charwarp/@rura+ <mapname> <x> <y> <char name> - Warps character to location of choice
+ 60:@revive <char name> - Revives target character.
+ 40:@charstats <char name> - Displays a characters stats.
+ 20:@charignorelist <char name> - Displays ignore list of the player
+ 20:@inall <char name> - Allows all wispers for the player
+ 20:@exall <char name> - Blocks all wispers for the player
+ 60:@charoption <param1> <param2> <param3> <charname> - Like @option command but only to target character.
+ 50:@charmountpeco <charname> - Give/remove to a player a peco (Class is required, but not skill).
+ 50:@charpetrename <charname> - Re-enable pet rename to a player.
+ 60:@charsave <map> <x> <y> <charname> - Changes the target players respawn point.
+ 60:@charbaselvl <#> <nickname> - Change a characters base level.
+ 60:@charjlvl <#> <nickname> - Change a characters job level.
+ 60:@charjob/@charjobchange <job ID> <char name> - Changes target characters job.
+ 60:@charzeny <amount> <name> - Give/take a players Zeny
+ 60:@charstpoint <amount> <name> - Give/take a players stat points
+ 60:@charskpoint <amount> <name> - give/take a players skill points
+ 60:@charskreset <charname> - Reset skills of a character.
+ 60:@charstreset <charname> - Reset stats of a character.
+ 60:@charreset <charname> - Reset stats AND skills of a character.
+ 60:@charquestskill <#> <charname> - Gives to a player the specified quest skill.
+ 60:@charlostskill <#> <charname> - Takes away the specified quest skill from the player.
+ 60:@chardelitem <item_name_or_ID> <quantity> <player> - Remove items from a character
+ 50:@charmodel <hair type> <hair color> <clothes color> <name> - Changes a player's model
+ 60:@chardisguise <monster_name_or_monster_ID> <char name> - Changes disguise of a player
+ 60:@charundisguise <char name> - Cancels disguise of a player
+ 60:@charchangesex <name> - Changes sex of a player (all characters of the account)
+ 60:@charblock/@block <name> - Blocks definitively a account
+ 60:@charunblock/@unblock <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
+ 20:@kick <charname> - Kicks specified character off the server
+ 99:@kickall - Kick all characters off the server
+ 99:@mapexit - Kick all players and shut down map-server.
+ 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.
+ 60:@unjail/@discharge <char_name> - Discharges specified character/prisoner
+ 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
+ 0:
+ 0:--- ADMIN CMD ---
+ 99:@reloaditemdb - Reload item database (admin command)
+ 99:@reloadmobdb - Reload monster database (admin command)
+ 99:@reloadskilldb - Reload skills definition database (admin command)
+ 99:@reloadscript - Reload all scripts (admin command)
+ 99:@reloadgmdb - Reload GM levels (admin command)
+ 99:@adjgmlvl - Do a temporary adjustment of the GM level of a player (admin command)
+ 99:@adjcmdlvl - Do a temporary adjustment of the GM level of a command (admin command)
+ 80:@enablenpc <NPC_name> - Enable a NPC (admin command)
+ 80:@disablenpc <NPC_name> - Disable a NPC (admin command)
+ 80:
+ 99:@gat - For debugging (you inspect around gat)
+ 99:@packet - For debugging (packet variety)
+ 99:
+100:@GM <password> - it becomes GM!
+ 0:@email <actual@email> <new@email> - to change your e-mail (characters protection)
diff --git a/conf-tmpl/inter_athena.conf b/conf-tmpl/inter_athena.conf
index 414cd39d7..475969f2b 100644
--- a/conf-tmpl/inter_athena.conf
+++ b/conf-tmpl/inter_athena.conf
@@ -1,128 +1,128 @@
-// 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
-
-// Castle flatfile database, for emperium war castles, etc.
-castle_txt: save/castle.txt
-
-
-
-// Options for both versions
-
-// Inter Log Filename
-inter_log_filename: log/inter.log
-
-// Level range for sharing within a party
-party_share_level: 10
-
-
-// The lowest GM level on your server
-lowest_gm_level: 1
-
-// How often the GM accounts will be reloaded by the map-server in minutes
-read_gm_interval: 10
-
-
-
-// SQL version options only
-
-// 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
-
-// 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]
-
-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
-
-// GM Account Database Table
-gm_db: login
-gm_db_level: level
-gm_db_account_id: account_id
-
-// Login Database Tables
-login_db: login
-loginlog_db: loginlog
-
-// Character Database Tables
-char_db: char
-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
-
-// Map Datbase Tables
-item_db_db: item_db
-mob_db_db: mob_db
-
-//Use SQL item_db and mob_db for the map server
-use_sql_db: no
-
-// Log Inter Connections, etc.?
-log_inter: 1
+// 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
+
+// Castle flatfile database, for emperium war castles, etc.
+castle_txt: save/castle.txt
+
+
+
+// Options for both versions
+
+// Inter Log Filename
+inter_log_filename: log/inter.log
+
+// Level range for sharing within a party
+party_share_level: 10
+
+
+// The lowest GM level on your server
+lowest_gm_level: 1
+
+// How often the GM accounts will be reloaded by the map-server in minutes
+read_gm_interval: 10
+
+
+
+// SQL version options only
+
+// 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
+
+// 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]
+
+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
+
+// GM Account Database Table
+gm_db: login
+gm_db_level: level
+gm_db_account_id: account_id
+
+// Login Database Tables
+login_db: login
+loginlog_db: loginlog
+
+// Character Database Tables
+char_db: char
+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
+
+// Map Datbase Tables
+item_db_db: item_db
+mob_db_db: mob_db
+
+//Use SQL item_db and mob_db for the map server
+use_sql_db: no
+
+// Log Inter Connections, etc.?
+log_inter: 1
diff --git a/conf-tmpl/ladmin_athena.conf b/conf-tmpl/ladmin_athena.conf
index 1bfa8d1c3..e6f589863 100644
--- a/conf-tmpl/ladmin_athena.conf
+++ b/conf-tmpl/ladmin_athena.conf
@@ -1,34 +1,34 @@
-// 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
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
+// 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
+
+// If you want use an additional configuration file, uncomment and use this parameter
+//import: path/additional_configuration_file
diff --git a/conf-tmpl/lan_support.conf b/conf-tmpl/lan_support.conf
index 0f078352f..bfaec6966 100644
--- a/conf-tmpl/lan_support.conf
+++ b/conf-tmpl/lan_support.conf
@@ -1,41 +1,41 @@
-// Athena TXT version LAN configure file.
-// Support Client Connect to Local Area Network (LAN) IP Address Server.
-// put this fle into conf/ directory
-//
-// HOWTO:
-// To use this file, the login-server, char-server and map-server must be on the same subnetwork
-// (not necessary on the same computer). You can not use eAthena if you want to install the servers on 2 or more different LAN.
-//
-// First of all: you must configure your router to forward your WAN IP (one or more) and port (default: 6900, 6121 and 5121)
-// to the right concerned computer(s) (if default port, forward 6900 port to the (LAN IP) login-server, 6121 port to the (LAN IP) char-server, etc.).
-// After, set in char_athena.conf and map_athena.conf files the WAN IP and the right ports that you use.
-// Give to WAN people (client that are not on your LAN) your WAN IP to have an access to your server.
-// At this point, all players outside your LAN can access to your server(s).
-//
-// Now, you must parameter your LAN for the servers.
-// Set the LAN IP of the char-server and the map-server in this file (lan_char_ip and lan_map_ip).
-// Set the definition of your LAN in this file (subnet and subnetmask).
-// When you load/start login-server and char-server, read what the server displays, and specially the section ---LAN CONFIGURATION---.
-// If you see a warning or something not good, correct it.
-// Now LAN client can access to your server.
-//
-// NB: if you want that nobody of your LAN can access to your server, put 127.0.0.1 in IP and 255.255.255.255 for the mask.
-// So only the localhost computer would access to your server.
-// NB2: you can use LAN name if you have some instead of IP and/or mask.
-// NB3: if you want set your server only for LAN people, set your LAN IP instead of the WAN IP, and set 127.0.0.1/255.255.255.255 for the LAN IP.
-//
-// HOW THAT WORKS:
-// When someone tries to connect to your server(s), the login-server/char-server checks its IP with the LAN subnet (subnet and subnetmask parameters).
-// If it matches, the login-server sends the LAN IP of the char-server (lan_char_ip); and char-server do same for map-server (lan_map_ip).
-// If not, the login-server sends the WAN IP of the char-server that it have received (char_ip in char_athena.conf)
-// and the char-server sends the WAN IP of the map-server that it have received (map_ip in map_athena.conf)
-
-// put here the LAN IP of your char-server
-lan_char_ip: 127.0.0.1
-
-// put here the LAN IP of your map-server
-lan_map_ip: 127.0.0.1
-
-// put here the Subnet mask of your LAN
-subnet: 127.0.0.1
-subnetmask: 255.255.255.255
+// Athena TXT version LAN configure file.
+// Support Client Connect to Local Area Network (LAN) IP Address Server.
+// put this fle into conf/ directory
+//
+// HOWTO:
+// To use this file, the login-server, char-server and map-server must be on the same subnetwork
+// (not necessary on the same computer). You can not use eAthena if you want to install the servers on 2 or more different LAN.
+//
+// First of all: you must configure your router to forward your WAN IP (one or more) and port (default: 6900, 6121 and 5121)
+// to the right concerned computer(s) (if default port, forward 6900 port to the (LAN IP) login-server, 6121 port to the (LAN IP) char-server, etc.).
+// After, set in char_athena.conf and map_athena.conf files the WAN IP and the right ports that you use.
+// Give to WAN people (client that are not on your LAN) your WAN IP to have an access to your server.
+// At this point, all players outside your LAN can access to your server(s).
+//
+// Now, you must parameter your LAN for the servers.
+// Set the LAN IP of the char-server and the map-server in this file (lan_char_ip and lan_map_ip).
+// Set the definition of your LAN in this file (subnet and subnetmask).
+// When you load/start login-server and char-server, read what the server displays, and specially the section ---LAN CONFIGURATION---.
+// If you see a warning or something not good, correct it.
+// Now LAN client can access to your server.
+//
+// NB: if you want that nobody of your LAN can access to your server, put 127.0.0.1 in IP and 255.255.255.255 for the mask.
+// So only the localhost computer would access to your server.
+// NB2: you can use LAN name if you have some instead of IP and/or mask.
+// NB3: if you want set your server only for LAN people, set your LAN IP instead of the WAN IP, and set 127.0.0.1/255.255.255.255 for the LAN IP.
+//
+// HOW THAT WORKS:
+// When someone tries to connect to your server(s), the login-server/char-server checks its IP with the LAN subnet (subnet and subnetmask parameters).
+// If it matches, the login-server sends the LAN IP of the char-server (lan_char_ip); and char-server do same for map-server (lan_map_ip).
+// If not, the login-server sends the WAN IP of the char-server that it have received (char_ip in char_athena.conf)
+// and the char-server sends the WAN IP of the map-server that it have received (map_ip in map_athena.conf)
+
+// put here the LAN IP of your char-server
+lan_char_ip: 127.0.0.1
+
+// put here the LAN IP of your map-server
+lan_map_ip: 127.0.0.1
+
+// put here the Subnet mask of your LAN
+subnet: 127.0.0.1
+subnetmask: 255.255.255.255
diff --git a/conf-tmpl/log_athena.conf b/conf-tmpl/log_athena.conf
index 0a052b8d4..005a6f1e9 100644
--- a/conf-tmpl/log_athena.conf
+++ b/conf-tmpl/log_athena.conf
@@ -1,53 +1,53 @@
-// eAthena - Log Configuration File
-
-// Log Dead Branch Usage
-log_branch: 0
-
-// Log Monster Drops
-log_drop: 0
-
-// Log MVP Monster Drops
-log_mvpdrop: 0
-
-// Log Present Items (Old Blue Box, etc.)
-log_present: 0
-
-// Log Produced Items
-log_produce: 0
-
-// Log Refining
-log_refine: 0
-
-// Log Trading
-log_trade: 0
-
-// Log Vending
-log_vend: 0
-
-// Log Zeny Trades
-log_zeny: 0
-
-
-// Dead Branch Log Table
-log_branch_db: branchlog
-
-// Drop Log Table
-log_drop_db: droplog
-
-// MVP Drop Table
-log_mvpdrop_db: mvplog
-
-// Present Drop Table
-log_present_db: presentlog
-
-// Produce Log Table
-log_produce_db: producelog
-
-// Refine Log Table
-log_refine_db: refinelog
-
-// Trade Log Table
-log_trade_db: tradelog
-
-// Vend Log Table
+// eAthena - Log Configuration File
+
+// Log Dead Branch Usage
+log_branch: 0
+
+// Log Monster Drops
+log_drop: 0
+
+// Log MVP Monster Drops
+log_mvpdrop: 0
+
+// Log Present Items (Old Blue Box, etc.)
+log_present: 0
+
+// Log Produced Items
+log_produce: 0
+
+// Log Refining
+log_refine: 0
+
+// Log Trading
+log_trade: 0
+
+// Log Vending
+log_vend: 0
+
+// Log Zeny Trades
+log_zeny: 0
+
+
+// Dead Branch Log Table
+log_branch_db: branchlog
+
+// Drop Log Table
+log_drop_db: droplog
+
+// MVP Drop Table
+log_mvpdrop_db: mvplog
+
+// Present Drop Table
+log_present_db: presentlog
+
+// Produce Log Table
+log_produce_db: producelog
+
+// Refine Log Table
+log_refine_db: refinelog
+
+// Trade Log Table
+log_trade_db: tradelog
+
+// Vend Log Table
log_vend_db: vendlog \ No newline at end of file
diff --git a/conf-tmpl/login_athena.conf b/conf-tmpl/login_athena.conf
index f5c21407e..4b25b6674 100644
--- a/conf-tmpl/login_athena.conf
+++ b/conf-tmpl/login_athena.conf
@@ -1,149 +1,149 @@
-// Athena Login Server configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
-
-// Port to bind Login Server to (always binds to all IP addresses)
-login_port: 6900
-
-// 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
-
-// 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)
-new_account: 1
-
-// 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
-
-// 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
-
-// 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
-
-// If you want use an additional configuration file, uncomment and use this parameter
-//import: path/additional_configuration_file
-
-//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: 3
-dynamic_pass_failure_ban_how_long: 60
-dynamic_account_ban: 1
-dynamic_account_ban_class: 0
-
-// Anti-freeze system enable
-anti_freeze_enable: 0
-// Anti-freeze system interval (in seconds)
-anti_freeze_interval: 15
-
-// Enable I'm Alive?
-imalive_on: 0
-// How often to display I'm Alive
-imalive_time: 60
-// Enable GUI flushing for Mugendai's GUI?
-flush_on: 0
-// How often to flush the buffer in Mugendai's GUI
+// Athena Login Server configuration file.
+// Translated by Peter Kieser <pfak@telus.net>
+
+// Port to bind Login Server to (always binds to all IP addresses)
+login_port: 6900
+
+// 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
+
+// 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)
+new_account: 1
+
+// 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
+
+// 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
+
+// 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
+
+// If you want use an additional configuration file, uncomment and use this parameter
+//import: path/additional_configuration_file
+
+//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: 3
+dynamic_pass_failure_ban_how_long: 60
+dynamic_account_ban: 1
+dynamic_account_ban_class: 0
+
+// Anti-freeze system enable
+anti_freeze_enable: 0
+// Anti-freeze system interval (in seconds)
+anti_freeze_interval: 15
+
+// Enable I'm Alive?
+imalive_on: 0
+// How often to display I'm Alive
+imalive_time: 60
+// Enable GUI flushing for Mugendai's GUI?
+flush_on: 0
+// How often to flush the buffer in Mugendai's GUI
flush_time: 60 \ No newline at end of file
diff --git a/conf-tmpl/map_athena.conf b/conf-tmpl/map_athena.conf
index 45aa51815..706145d79 100644
--- a/conf-tmpl/map_athena.conf
+++ b/conf-tmpl/map_athena.conf
@@ -1,1169 +1,1169 @@
-// ______ __ __
-// /\ _ \/\ \__/\ \
-// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
-// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
-// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-// _ _ _ _ _ _ _ _ _ _ _ _ _
-// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
-//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
-// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
-//
-//--------------------------------------------------------------
-//eAthena Map-Server Configuration File
-//--------------------------------------------------------------
-
-
-//--------------------------------------------------------------
-// Configuration Info
-//--------------------------------------------------------------
-// Interserver communication passwords, set in account.txt (or equiv.)
-userid: s1
-passwd: p1
-
-// Character Server IP
-//
-// You should only need to set this if you are running behind a
-// firewall or on a machine with multiple interfaces. In that case,
-// you need to specify the IP address you wish to export to the entire world.
-//
-//char_ip:127.0.0.1
-
-// Character Server Port
-char_port: 6121
-
-// Map Server IP
-//
-// You should only need to set this if you are running behind a
-// firewall or on a machine with multiple interfaces. In that case,
-// you need to specify the IP address you wish to export to the entire world.
-//
-//map_ip:127.0.0.1
-
-// Map Server Port
-map_port: 5121
-
-// Console Commands
-// Allow for console commands to be used on/off
-// This prevents usage of >& log.file
-console: off
-
-// Database autosave time, in seconds.
-autosave_time: 60
-
-// 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
-
-mapreg_txt: save/mapreg.txt
-
-
-//--------------------------------------------------------------
-// Map Flags
-//--------------------------------------------------------------
-// Files to set options in maps such as PVP, etc.
-//=======================================
-
-// Arenas
-npc: conf/mapflag/arenas.txt
-// Dungeons
-npc: conf/mapflag/dungeons.txt
-// Guild Castles
-npc: conf/mapflag/guildcastles.txt
-// GvG Arenas
-npc: conf/mapflag/gvg.txt
-// Job Quests
-npc: conf/mapflag/jobquests.txt
-// PvP Arenas
-npc: conf/mapflag/pvp.txt
-// Towns
-npc: conf/mapflag/towns.txt
-// Jails
-npc: conf/mapflag/jail.txt
-// Water Flag
-npc: conf/mapflag/water.txt
-// How high is the water in maps?
-water_height: conf/mapflag/water_height.txt
-
-//--------------------------------------------------------------
-// Special
-//--------------------------------------------------------------
-
-// PCLoginEvent NPC. NPC which is activated for every player who logs in.
-npc: npc/sample/PCLoginEvent.txt
-
-
-//--------------------------------------------------------------
-// NPCs
-//--------------------------------------------------------------
-
-// ---------------- Your Own Npcs -----------------------
-//Add Them Here ;)
-
-
-//------------------------ Cities ----------------------------
-npc: npc/cities/alberta.txt
-npc: npc/cities/aldebaran.txt
-npc: npc/cities/amatsu.txt
-npc: npc/cities/comodo.txt
-npc: npc/cities/geffen.txt
-npc: npc/cities/izlude.txt
-npc: npc/cities/lutie.txt
-npc: npc/cities/morocc.txt
-npc: npc/cities/payon.txt
-npc: npc/cities/prontera.txt
-npc: npc/cities/yuno.txt
-npc: npc/cities/gonryun.txt
-npc: npc/cities/umbala.txt
-npc: npc/cities/niflheim.txt
-
-
-//-------------------------- Jobs -------------------------------
-//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/swordsman.txt
-
-//2-1 With Quest
-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 With Quest
-npc: npc/jobs/2-2/rogue.txt
-npc: npc/jobs/2-2/alchemist.txt
-npc: npc/jobs/2-2/sage.txt
-
-//2-2 Without Quest
-npc: npc/jobs/2-2/noquest/crusader.txt
-npc: npc/jobs/2-2/noquest/dancer-bard.txt
-npc: npc/jobs/2-2/noquest/monk.txt
-
-//2-1-1 Withouth Quest
-npc: npc/jobs/2-1-1/AssassinCross.txt
-npc: npc/jobs/2-1-1/LordKnight.txt
-npc: npc/jobs/2-1-1/HighPriest.txt
-npc: npc/jobs/2-1-1/HighWizard.txt
-npc: npc/jobs/2-1-1/WhiteSmith.txt
-npc: npc/jobs/2-1-1/Sniper.txt
-
-//2-2-1 Withouth Quest
-npc: npc/jobs/2-2-1/Champion.txt
-npc: npc/jobs/2-2-1/Clown.txt
-npc: npc/jobs/2-2-1/Creator.txt
-npc: npc/jobs/2-2-1/Gypsy.txt
-npc: npc/jobs/2-2-1/Paladin.txt
-npc: npc/jobs/2-2-1/Professor.txt
-npc: npc/jobs/2-2-1/Stalker.txt
-
-
-//------------------------- Merchants ----------------------------
-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/grandpa_pharmacist.txt
-npc: npc/merchants/inn.txt
-npc: npc/merchants/milk_trader.txt
-npc: npc/merchants/renters.txt
-npc: npc/merchants/alchemist.txt
-
-// Custom
-//npc: npc/merchants/custom/2-2shop.txt
-// Free Falcon & Peco breeder, Free Carts
-//npc: npc/merchants/custom/breeder.txt
-
-
-//--------------------------- Quests ------------------------------
-// Item Quests
-npc: npc/quests/quests_alberta.txt
-npc: npc/quests/quests_aldebaran.txt
-npc: npc/quests/quests_comodo.txt
-npc: npc/quests/quests_geffen.txt
-npc: npc/quests/quests_lutie.txt
-npc: npc/quests/quests_morocc.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
-
-// Extra Item Making
-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/bongun.txt
-npc: npc/quests/munak.txt
-npc: npc/quests/bongunsword.txt
-npc: npc/quests/monstertamers.txt
-
-// Custom Quests, might be balance breaking (Enable if you want)
-//npc: npc/quests/all_quest.txt
-//npc: npc/quests/magicalhatquest.txt
-//npc: npc/quests/fashion.txt
-//npc: npc/quests/custom/excalibur.txt
-//npc: npc/quests/custom/elvenear.txt
-//npc: npc/quests/custom/ironcane.txt
-//npc: npc/quests/custom/sunglasses.txt
-//npc: npc/quests/custom/berzebub.txt
-npc: npc/quests/custom/new_hats.txt
-// Above Npcs are better ^_^
-//npc: npc/quests/custom/event_32_new_hats.txt
-npc: npc/quests/custom/valhallen.txt
-//both Lord Kaho, but different and quest.txt has balmung to:
-//npc: npc/quests/custom/kaho_balmung.txt
-//npc: npc/quests/custom/kahohorn.txt
-
-//----------------------- Skill Quests -----------------------------
-npc: npc/quests/skills/acolyte_skills.txt
-npc: npc/quests/skills/archer_skills.txt
-npc: npc/quests/skills/mage_skills.txt
-npc: npc/quests/skills/merchant_skills.txt
-npc: npc/quests/skills/novice_skills.txt
-npc: npc/quests/skills/swordsman_skills.txt
-npc: npc/quests/skills/thief_skills.txt
-
-//npc: npc/other/platinum_skills.txt
-
-
-// -------------------------- Guides -------------------------------
-npc: npc/guides/guides_alb.txt
-npc: npc/guides/guides_alde.txt
-npc: npc/guides/guides_com.txt
-npc: npc/guides/guides_gef.txt
-npc: npc/guides/guides_izl.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
-//more to come
-
-
-// -------------------------- 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
-//more to come
-
-
-//---------------------------- Events --------------------------------
-//npc: npc/events/easter.txt
-//npc: npc/events/valentinesday.txt
-//npc: npc/events/xmas.txt
-//npc: npc/events/alchemist.txt
-//npc: npc/events/twintowers.txt
-npc: npc/events/custom/uneasy_cemetery.txt
-//npc: npc/events/custom/draculax.txt
-
-
-//---------------------------- Others --------------------------------
-npc: npc/other/books.txt
-npc: npc/other/msg_boards.txt
-npc: npc/other/pvp.txt
-npc: npc/other/IceCream.txt
-npc: npc/other/card_remover.txt
-//npc: npc/other/wedding.txt
-//npc: npc/other/Valkyrie.txt
-//npc: npc/other/gefenia.txt
-//npc: npc/other/momotaro.txt
-//npc: npc/other/tougijou.txt
-//npc: npc/other/arena_mvp.txt
-
-// Global Scripts Functions ------------------
-npc: npc/other/Global_Functions.txt
-
-
-//------------------------- Unofficial NPCs --------------------------
-npc: npc/other/kafra_bank.txt
-//npc: npc/other/bank.txt
-//npc: npc/jobs/custom/reset.txt
-//npc: npc/jobs/custom/jobchange.txt
-//npc: npc/other/heal.txt
-//npc: npc/other/heal_payment.txt
-npc: npc/other/blackjack.txt
-
-// Warper NPC (Enable for free warp service)
-// 1st is Warper with only option for cities and dungeons
-//npc: npc/other/warper.txt
-// 2nd you can choose which lvl of the dungeon (you have to disabled 1 if you use 2!)
-//npc: npc/other/warper2.txt
-
-// Free Stylist NPC - Cloths/Hair Dye - (Requires 77 dye palletes)
-//npc: npc/merchants/custom/dye.txt
-
-// Dev NPCs
-npc: npc/other/devnpc.txt
-
-//= MC Cameri's Bank NPC
-//npc: npc/other/mc_cameri/bank.txt
-
-
-//-------------------------- 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
-//npc: npc/guild/nguild/nguild_dunsw.txt
-npc: npc/guild/nguild/nguild_treas.txt
-npc: npc/guild/nguild/nguild_guardians.txt
-
-
-//------------------ Guild Wars(Non-optimized) -----------------------
-//Guild Wars: General
-//npc: npc/guild/old/ev_agit_event.txt
-
-//Guild Wars: Al de Baran
-//npc: npc/guild/old/aldeg_flag.txt
-//npc: npc/guild/old/ev_agit_aldeg.txt
-//npc: npc/guild/old/aldeg_cas01.txt
-//npc: npc/guild/old/guardian/aldeg_cas01_guardian.txt
-//npc: npc/guild/old/treasure/aldeg_cas01_treasure.txt
-//npc: npc/guild/old/aldeg_cas02.txt
-//npc: npc/guild/old/guardian/aldeg_cas02_guardian.txt
-//npc: npc/guild/old/treasure/aldeg_cas02_treasure.txt
-//npc: npc/guild/old/aldeg_cas03.txt
-//npc: npc/guild/old/guardian/aldeg_cas03_guardian.txt
-//npc: npc/guild/old/treasure/aldeg_cas03_treasure.txt
-//npc: npc/guild/old/aldeg_cas04.txt
-//npc: npc/guild/old/guardian/aldeg_cas04_guardian.txt
-//npc: npc/guild/old/treasure/aldeg_cas04_treasure.txt
-//npc: npc/guild/old/aldeg_cas05.txt
-//npc: npc/guild/old/guardian/aldeg_cas05_guardian.txt
-//npc: npc/guild/old/treasure/aldeg_cas05_treasure.txt
-
-//Guild Wars: Geffen
-//npc: npc/guild/old/gefg_flag.txt
-//npc: npc/guild/old/ev_agit_gefg.txt
-//npc: npc/guild/old/gefg_cas01.txt
-//npc: npc/guild/old/guardian/gefg_cas01_guardian.txt
-//npc: npc/guild/old/treasure/gefg_cas01_treasure.txt
-//npc: npc/guild/old/gefg_cas02.txt
-//npc: npc/guild/old/guardian/gefg_cas02_guardian.txt
-//npc: npc/guild/old/treasure/gefg_cas02_treasure.txt
-//npc: npc/guild/old/gefg_cas03.txt
-//npc: npc/guild/old/guardian/gefg_cas03_guardian.txt
-//npc: npc/guild/old/treasure/gefg_cas03_treasure.txt
-//npc: npc/guild/old/gefg_cas04.txt
-//npc: npc/guild/old/guardian/gefg_cas04_guardian.txt
-//npc: npc/guild/old/treasure/gefg_cas04_treasure.txt
-//npc: npc/guild/old/gefg_cas05.txt
-//npc: npc/guild/old/guardian/gefg_cas05_guardian.txt
-//npc: npc/guild/old/treasure/gefg_cas05_treasure.txt
-
-//Guild Wars: Payon
-//npc: npc/guild/old/payg_flag.txt
-//npc: npc/guild/old/ev_agit_payg.txt
-//npc: npc/guild/old/payg_cas01.txt
-//npc: npc/guild/old/guardian/payg_cas01_guardian.txt
-//npc: npc/guild/old/treasure/payg_cas01_treasure.txt
-//npc: npc/guild/old/payg_cas02.txt
-//npc: npc/guild/old/guardian/payg_cas02_guardian.txt
-//npc: npc/guild/old/treasure/payg_cas02_treasure.txt
-//npc: npc/guild/old/payg_cas03.txt
-//npc: npc/guild/old/guardian/payg_cas03_guardian.txt
-//npc: npc/guild/old/treasure/payg_cas03_treasure.txt
-//npc: npc/guild/old/payg_cas04.txt
-//npc: npc/guild/old/guardian/payg_cas04_guardian.txt
-//npc: npc/guild/old/treasure/payg_cas04_treasure.txt
-//npc: npc/guild/old/payg_cas05.txt
-//npc: npc/guild/old/guardian/payg_cas05_guardian.txt
-//npc: npc/guild/old/treasure/payg_cas05_treasure.txt
-
-//Guild Wars: Prontera
-//npc: npc/guild/old/prtg_flag.txt
-//npc: npc/guild/old/ev_agit_prtg.txt
-//npc: npc/guild/old/prtg_cas01.txt
-//npc: npc/guild/old/guardian/prtg_cas01_guardian.txt
-//npc: npc/guild/old/treasure/prtg_cas01_treasure.txt
-//npc: npc/guild/old/prtg_cas02.txt
-//npc: npc/guild/old/guardian/prtg_cas02_guardian.txt
-//npc: npc/guild/old/treasure/prtg_cas02_treasure.txt
-//npc: npc/guild/old/prtg_cas03.txt
-//npc: npc/guild/old/guardian/prtg_cas03_guardian.txt
-//npc: npc/guild/old/treasure/prtg_cas03_treasure.txt
-//npc: npc/guild/old/prtg_cas04.txt
-//npc: npc/guild/old/guardian/prtg_cas04_guardian.txt
-//npc: npc/guild/old/treasure/prtg_cas04_treasure.txt
-//npc: npc/guild/old/prtg_cas05.txt
-//npc: npc/guild/old/guardian/prtg_cas05_guardian.txt
-//npc: npc/guild/old/treasure/prtg_cas05_treasure.txt
-
-
-//--------------------- Warps ---------------------------
-//= Cities ============================
-npc: npc/warps/cities/alberta.txt
-npc: npc/warps/cities/aldebaran.txt
-npc: npc/warps/cities/amatsu.txt
-npc: npc/warps/ayothaya.txt
-npc: npc/warps/cities/comodo.txt
-npc: npc/warps/cities/geffen.txt
-npc: npc/warps/cities/gonryun.txt
-npc: npc/warps/cities/izlude.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/umbala.txt
-npc: npc/warps/cities/yggdrasil.txt
-npc: npc/warps/cities/yuno.txt
-//= Dungeons =============================
-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/coal_mine.txt
-npc: npc/warps/dungeons/com_dun.txt
-npc: npc/warps/dungeons/geffen_dun.txt
-npc: npc/warps/dungeons/gon_dun.txt
-npc: npc/warps/dungeons/izlude_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/orc_dun.txt
-npc: npc/warps/dungeons/payon_dun.txt
-npc: npc/warps/dungeons/prt_dun.txt
-npc: npc/warps/dungeons/umbala_dun.txt
-npc: npc/warps/dungeons/yuno_dun.txt
-//= Fields ===============================
-npc: npc/warps/fields/amatsu_fild.txt
-npc: npc/warps/fields/com_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/jawaii.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/umbala_fild.txt
-npc: npc/warps/fields/yuno_fild.txt
-//= Guilds ==============================
-npc: npc/warps/guild/guildcastles.txt
-//= Other ================================
-npc: npc/warps/other/jobquests.txt
-npc: npc/warps/other/other.txt
-//= PVP ==================================
-npc: npc/warps/pvp/pvp.txt
-
-
-//--------------------- Mobs ---------------------------
-npc: npc/mobs/pvp.txt
-npc: npc/mobs/fields/amatsu.txt
-npc: npc/mobs/fields/ayothana.txt
-npc: npc/mobs/fields/comodo.txt
-npc: npc/mobs/fields/gefenia.txt
-npc: npc/mobs/fields/geffen.txt
-npc: npc/mobs/fields/gonryun.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/payon.txt
-npc: npc/mobs/fields/prontera.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/beachdun.txt
-npc: npc/mobs/dungeons/byalan.txt
-npc: npc/mobs/dungeons/clocktower.txt
-npc: npc/mobs/dungeons/coalmine.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/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/sunkenship.txt
-npc: npc/mobs/dungeons/toyfactory.txt
-npc: npc/mobs/dungeons/turtleisland.txt
-npc: npc/mobs/dungeons/umbaladun.txt
-
-//------------------------- 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_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_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: iz_dun05.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_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_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_arena01.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_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
-map: gef_fild12.gat
-map: gef_fild13.gat
-map: gef_fild14.gat
-
-//---EP3.1 Quiz Revolution ---
-
-map: quiz_00.gat
-map: quiz_01.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: job_hunte.gat
-map: job_knt.gat
-map: job_prist.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: 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
-
-//--- 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.x - Some Maps ---
-//map: new_zone01.gat
-//map: new_zone02.gat
-//map: new_zone03.gat
-//map: new_zone04.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
-
-// 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
-
-//Maps that were not in the list but exist in Data.grf
-//map: ordeal_a00.gat
-//map: ordeal_a02.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
-
-import: conf/import/map_conf.txt
-
-// Mugendai's GUI Support
-imalive_on: 0
-imalive_time: 30
-flush_on: 0
-flush_time: 30
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------------
+//eAthena Map-Server Configuration File
+//--------------------------------------------------------------
+
+
+//--------------------------------------------------------------
+// Configuration Info
+//--------------------------------------------------------------
+// Interserver communication passwords, set in account.txt (or equiv.)
+userid: s1
+passwd: p1
+
+// Character Server IP
+//
+// You should only need to set this if you are running behind a
+// firewall or on a machine with multiple interfaces. In that case,
+// you need to specify the IP address you wish to export to the entire world.
+//
+//char_ip:127.0.0.1
+
+// Character Server Port
+char_port: 6121
+
+// Map Server IP
+//
+// You should only need to set this if you are running behind a
+// firewall or on a machine with multiple interfaces. In that case,
+// you need to specify the IP address you wish to export to the entire world.
+//
+//map_ip:127.0.0.1
+
+// Map Server Port
+map_port: 5121
+
+// Console Commands
+// Allow for console commands to be used on/off
+// This prevents usage of >& log.file
+console: off
+
+// Database autosave time, in seconds.
+autosave_time: 60
+
+// 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
+
+mapreg_txt: save/mapreg.txt
+
+
+//--------------------------------------------------------------
+// Map Flags
+//--------------------------------------------------------------
+// Files to set options in maps such as PVP, etc.
+//=======================================
+
+// Arenas
+npc: conf/mapflag/arenas.txt
+// Dungeons
+npc: conf/mapflag/dungeons.txt
+// Guild Castles
+npc: conf/mapflag/guildcastles.txt
+// GvG Arenas
+npc: conf/mapflag/gvg.txt
+// Job Quests
+npc: conf/mapflag/jobquests.txt
+// PvP Arenas
+npc: conf/mapflag/pvp.txt
+// Towns
+npc: conf/mapflag/towns.txt
+// Jails
+npc: conf/mapflag/jail.txt
+// Water Flag
+npc: conf/mapflag/water.txt
+// How high is the water in maps?
+water_height: conf/mapflag/water_height.txt
+
+//--------------------------------------------------------------
+// Special
+//--------------------------------------------------------------
+
+// PCLoginEvent NPC. NPC which is activated for every player who logs in.
+npc: npc/sample/PCLoginEvent.txt
+
+
+//--------------------------------------------------------------
+// NPCs
+//--------------------------------------------------------------
+
+// ---------------- Your Own Npcs -----------------------
+//Add Them Here ;)
+
+
+//------------------------ Cities ----------------------------
+npc: npc/cities/alberta.txt
+npc: npc/cities/aldebaran.txt
+npc: npc/cities/amatsu.txt
+npc: npc/cities/comodo.txt
+npc: npc/cities/geffen.txt
+npc: npc/cities/izlude.txt
+npc: npc/cities/lutie.txt
+npc: npc/cities/morocc.txt
+npc: npc/cities/payon.txt
+npc: npc/cities/prontera.txt
+npc: npc/cities/yuno.txt
+npc: npc/cities/gonryun.txt
+npc: npc/cities/umbala.txt
+npc: npc/cities/niflheim.txt
+
+
+//-------------------------- Jobs -------------------------------
+//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/swordsman.txt
+
+//2-1 With Quest
+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 With Quest
+npc: npc/jobs/2-2/rogue.txt
+npc: npc/jobs/2-2/alchemist.txt
+npc: npc/jobs/2-2/sage.txt
+
+//2-2 Without Quest
+npc: npc/jobs/2-2/noquest/crusader.txt
+npc: npc/jobs/2-2/noquest/dancer-bard.txt
+npc: npc/jobs/2-2/noquest/monk.txt
+
+//2-1-1 Withouth Quest
+npc: npc/jobs/2-1-1/AssassinCross.txt
+npc: npc/jobs/2-1-1/LordKnight.txt
+npc: npc/jobs/2-1-1/HighPriest.txt
+npc: npc/jobs/2-1-1/HighWizard.txt
+npc: npc/jobs/2-1-1/WhiteSmith.txt
+npc: npc/jobs/2-1-1/Sniper.txt
+
+//2-2-1 Withouth Quest
+npc: npc/jobs/2-2-1/Champion.txt
+npc: npc/jobs/2-2-1/Clown.txt
+npc: npc/jobs/2-2-1/Creator.txt
+npc: npc/jobs/2-2-1/Gypsy.txt
+npc: npc/jobs/2-2-1/Paladin.txt
+npc: npc/jobs/2-2-1/Professor.txt
+npc: npc/jobs/2-2-1/Stalker.txt
+
+
+//------------------------- Merchants ----------------------------
+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/grandpa_pharmacist.txt
+npc: npc/merchants/inn.txt
+npc: npc/merchants/milk_trader.txt
+npc: npc/merchants/renters.txt
+npc: npc/merchants/alchemist.txt
+
+// Custom
+//npc: npc/merchants/custom/2-2shop.txt
+// Free Falcon & Peco breeder, Free Carts
+//npc: npc/merchants/custom/breeder.txt
+
+
+//--------------------------- Quests ------------------------------
+// Item Quests
+npc: npc/quests/quests_alberta.txt
+npc: npc/quests/quests_aldebaran.txt
+npc: npc/quests/quests_comodo.txt
+npc: npc/quests/quests_geffen.txt
+npc: npc/quests/quests_lutie.txt
+npc: npc/quests/quests_morocc.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
+
+// Extra Item Making
+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/bongun.txt
+npc: npc/quests/munak.txt
+npc: npc/quests/bongunsword.txt
+npc: npc/quests/monstertamers.txt
+
+// Custom Quests, might be balance breaking (Enable if you want)
+//npc: npc/quests/all_quest.txt
+//npc: npc/quests/magicalhatquest.txt
+//npc: npc/quests/fashion.txt
+//npc: npc/quests/custom/excalibur.txt
+//npc: npc/quests/custom/elvenear.txt
+//npc: npc/quests/custom/ironcane.txt
+//npc: npc/quests/custom/sunglasses.txt
+//npc: npc/quests/custom/berzebub.txt
+npc: npc/quests/custom/new_hats.txt
+// Above Npcs are better ^_^
+//npc: npc/quests/custom/event_32_new_hats.txt
+npc: npc/quests/custom/valhallen.txt
+//both Lord Kaho, but different and quest.txt has balmung to:
+//npc: npc/quests/custom/kaho_balmung.txt
+//npc: npc/quests/custom/kahohorn.txt
+
+//----------------------- Skill Quests -----------------------------
+npc: npc/quests/skills/acolyte_skills.txt
+npc: npc/quests/skills/archer_skills.txt
+npc: npc/quests/skills/mage_skills.txt
+npc: npc/quests/skills/merchant_skills.txt
+npc: npc/quests/skills/novice_skills.txt
+npc: npc/quests/skills/swordsman_skills.txt
+npc: npc/quests/skills/thief_skills.txt
+
+//npc: npc/other/platinum_skills.txt
+
+
+// -------------------------- Guides -------------------------------
+npc: npc/guides/guides_alb.txt
+npc: npc/guides/guides_alde.txt
+npc: npc/guides/guides_com.txt
+npc: npc/guides/guides_gef.txt
+npc: npc/guides/guides_izl.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
+//more to come
+
+
+// -------------------------- 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
+//more to come
+
+
+//---------------------------- Events --------------------------------
+//npc: npc/events/easter.txt
+//npc: npc/events/valentinesday.txt
+//npc: npc/events/xmas.txt
+//npc: npc/events/alchemist.txt
+//npc: npc/events/twintowers.txt
+npc: npc/events/custom/uneasy_cemetery.txt
+//npc: npc/events/custom/draculax.txt
+
+
+//---------------------------- Others --------------------------------
+npc: npc/other/books.txt
+npc: npc/other/msg_boards.txt
+npc: npc/other/pvp.txt
+npc: npc/other/IceCream.txt
+npc: npc/other/card_remover.txt
+//npc: npc/other/wedding.txt
+//npc: npc/other/Valkyrie.txt
+//npc: npc/other/gefenia.txt
+//npc: npc/other/momotaro.txt
+//npc: npc/other/tougijou.txt
+//npc: npc/other/arena_mvp.txt
+
+// Global Scripts Functions ------------------
+npc: npc/other/Global_Functions.txt
+
+
+//------------------------- Unofficial NPCs --------------------------
+npc: npc/other/kafra_bank.txt
+//npc: npc/other/bank.txt
+//npc: npc/jobs/custom/reset.txt
+//npc: npc/jobs/custom/jobchange.txt
+//npc: npc/other/heal.txt
+//npc: npc/other/heal_payment.txt
+npc: npc/other/blackjack.txt
+
+// Warper NPC (Enable for free warp service)
+// 1st is Warper with only option for cities and dungeons
+//npc: npc/other/warper.txt
+// 2nd you can choose which lvl of the dungeon (you have to disabled 1 if you use 2!)
+//npc: npc/other/warper2.txt
+
+// Free Stylist NPC - Cloths/Hair Dye - (Requires 77 dye palletes)
+//npc: npc/merchants/custom/dye.txt
+
+// Dev NPCs
+npc: npc/other/devnpc.txt
+
+//= MC Cameri's Bank NPC
+//npc: npc/other/mc_cameri/bank.txt
+
+
+//-------------------------- 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
+//npc: npc/guild/nguild/nguild_dunsw.txt
+npc: npc/guild/nguild/nguild_treas.txt
+npc: npc/guild/nguild/nguild_guardians.txt
+
+
+//------------------ Guild Wars(Non-optimized) -----------------------
+//Guild Wars: General
+//npc: npc/guild/old/ev_agit_event.txt
+
+//Guild Wars: Al de Baran
+//npc: npc/guild/old/aldeg_flag.txt
+//npc: npc/guild/old/ev_agit_aldeg.txt
+//npc: npc/guild/old/aldeg_cas01.txt
+//npc: npc/guild/old/guardian/aldeg_cas01_guardian.txt
+//npc: npc/guild/old/treasure/aldeg_cas01_treasure.txt
+//npc: npc/guild/old/aldeg_cas02.txt
+//npc: npc/guild/old/guardian/aldeg_cas02_guardian.txt
+//npc: npc/guild/old/treasure/aldeg_cas02_treasure.txt
+//npc: npc/guild/old/aldeg_cas03.txt
+//npc: npc/guild/old/guardian/aldeg_cas03_guardian.txt
+//npc: npc/guild/old/treasure/aldeg_cas03_treasure.txt
+//npc: npc/guild/old/aldeg_cas04.txt
+//npc: npc/guild/old/guardian/aldeg_cas04_guardian.txt
+//npc: npc/guild/old/treasure/aldeg_cas04_treasure.txt
+//npc: npc/guild/old/aldeg_cas05.txt
+//npc: npc/guild/old/guardian/aldeg_cas05_guardian.txt
+//npc: npc/guild/old/treasure/aldeg_cas05_treasure.txt
+
+//Guild Wars: Geffen
+//npc: npc/guild/old/gefg_flag.txt
+//npc: npc/guild/old/ev_agit_gefg.txt
+//npc: npc/guild/old/gefg_cas01.txt
+//npc: npc/guild/old/guardian/gefg_cas01_guardian.txt
+//npc: npc/guild/old/treasure/gefg_cas01_treasure.txt
+//npc: npc/guild/old/gefg_cas02.txt
+//npc: npc/guild/old/guardian/gefg_cas02_guardian.txt
+//npc: npc/guild/old/treasure/gefg_cas02_treasure.txt
+//npc: npc/guild/old/gefg_cas03.txt
+//npc: npc/guild/old/guardian/gefg_cas03_guardian.txt
+//npc: npc/guild/old/treasure/gefg_cas03_treasure.txt
+//npc: npc/guild/old/gefg_cas04.txt
+//npc: npc/guild/old/guardian/gefg_cas04_guardian.txt
+//npc: npc/guild/old/treasure/gefg_cas04_treasure.txt
+//npc: npc/guild/old/gefg_cas05.txt
+//npc: npc/guild/old/guardian/gefg_cas05_guardian.txt
+//npc: npc/guild/old/treasure/gefg_cas05_treasure.txt
+
+//Guild Wars: Payon
+//npc: npc/guild/old/payg_flag.txt
+//npc: npc/guild/old/ev_agit_payg.txt
+//npc: npc/guild/old/payg_cas01.txt
+//npc: npc/guild/old/guardian/payg_cas01_guardian.txt
+//npc: npc/guild/old/treasure/payg_cas01_treasure.txt
+//npc: npc/guild/old/payg_cas02.txt
+//npc: npc/guild/old/guardian/payg_cas02_guardian.txt
+//npc: npc/guild/old/treasure/payg_cas02_treasure.txt
+//npc: npc/guild/old/payg_cas03.txt
+//npc: npc/guild/old/guardian/payg_cas03_guardian.txt
+//npc: npc/guild/old/treasure/payg_cas03_treasure.txt
+//npc: npc/guild/old/payg_cas04.txt
+//npc: npc/guild/old/guardian/payg_cas04_guardian.txt
+//npc: npc/guild/old/treasure/payg_cas04_treasure.txt
+//npc: npc/guild/old/payg_cas05.txt
+//npc: npc/guild/old/guardian/payg_cas05_guardian.txt
+//npc: npc/guild/old/treasure/payg_cas05_treasure.txt
+
+//Guild Wars: Prontera
+//npc: npc/guild/old/prtg_flag.txt
+//npc: npc/guild/old/ev_agit_prtg.txt
+//npc: npc/guild/old/prtg_cas01.txt
+//npc: npc/guild/old/guardian/prtg_cas01_guardian.txt
+//npc: npc/guild/old/treasure/prtg_cas01_treasure.txt
+//npc: npc/guild/old/prtg_cas02.txt
+//npc: npc/guild/old/guardian/prtg_cas02_guardian.txt
+//npc: npc/guild/old/treasure/prtg_cas02_treasure.txt
+//npc: npc/guild/old/prtg_cas03.txt
+//npc: npc/guild/old/guardian/prtg_cas03_guardian.txt
+//npc: npc/guild/old/treasure/prtg_cas03_treasure.txt
+//npc: npc/guild/old/prtg_cas04.txt
+//npc: npc/guild/old/guardian/prtg_cas04_guardian.txt
+//npc: npc/guild/old/treasure/prtg_cas04_treasure.txt
+//npc: npc/guild/old/prtg_cas05.txt
+//npc: npc/guild/old/guardian/prtg_cas05_guardian.txt
+//npc: npc/guild/old/treasure/prtg_cas05_treasure.txt
+
+
+//--------------------- Warps ---------------------------
+//= Cities ============================
+npc: npc/warps/cities/alberta.txt
+npc: npc/warps/cities/aldebaran.txt
+npc: npc/warps/cities/amatsu.txt
+npc: npc/warps/ayothaya.txt
+npc: npc/warps/cities/comodo.txt
+npc: npc/warps/cities/geffen.txt
+npc: npc/warps/cities/gonryun.txt
+npc: npc/warps/cities/izlude.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/umbala.txt
+npc: npc/warps/cities/yggdrasil.txt
+npc: npc/warps/cities/yuno.txt
+//= Dungeons =============================
+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/coal_mine.txt
+npc: npc/warps/dungeons/com_dun.txt
+npc: npc/warps/dungeons/geffen_dun.txt
+npc: npc/warps/dungeons/gon_dun.txt
+npc: npc/warps/dungeons/izlude_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/orc_dun.txt
+npc: npc/warps/dungeons/payon_dun.txt
+npc: npc/warps/dungeons/prt_dun.txt
+npc: npc/warps/dungeons/umbala_dun.txt
+npc: npc/warps/dungeons/yuno_dun.txt
+//= Fields ===============================
+npc: npc/warps/fields/amatsu_fild.txt
+npc: npc/warps/fields/com_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/jawaii.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/umbala_fild.txt
+npc: npc/warps/fields/yuno_fild.txt
+//= Guilds ==============================
+npc: npc/warps/guild/guildcastles.txt
+//= Other ================================
+npc: npc/warps/other/jobquests.txt
+npc: npc/warps/other/other.txt
+//= PVP ==================================
+npc: npc/warps/pvp/pvp.txt
+
+
+//--------------------- Mobs ---------------------------
+npc: npc/mobs/pvp.txt
+npc: npc/mobs/fields/amatsu.txt
+npc: npc/mobs/fields/ayothana.txt
+npc: npc/mobs/fields/comodo.txt
+npc: npc/mobs/fields/gefenia.txt
+npc: npc/mobs/fields/geffen.txt
+npc: npc/mobs/fields/gonryun.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/payon.txt
+npc: npc/mobs/fields/prontera.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/beachdun.txt
+npc: npc/mobs/dungeons/byalan.txt
+npc: npc/mobs/dungeons/clocktower.txt
+npc: npc/mobs/dungeons/coalmine.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/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/sunkenship.txt
+npc: npc/mobs/dungeons/toyfactory.txt
+npc: npc/mobs/dungeons/turtleisland.txt
+npc: npc/mobs/dungeons/umbaladun.txt
+
+//------------------------- 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_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_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: iz_dun05.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_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_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_arena01.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_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
+map: gef_fild12.gat
+map: gef_fild13.gat
+map: gef_fild14.gat
+
+//---EP3.1 Quiz Revolution ---
+
+map: quiz_00.gat
+map: quiz_01.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: job_hunte.gat
+map: job_knt.gat
+map: job_prist.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: 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
+
+//--- 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.x - Some Maps ---
+//map: new_zone01.gat
+//map: new_zone02.gat
+//map: new_zone03.gat
+//map: new_zone04.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
+
+// 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
+
+//Maps that were not in the list but exist in Data.grf
+//map: ordeal_a00.gat
+//map: ordeal_a02.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
+
+import: conf/import/map_conf.txt
+
+// Mugendai's GUI Support
+imalive_on: 0
+imalive_time: 30
+flush_on: 0
+flush_time: 30
diff --git a/conf-tmpl/mapflag/arenas.txt b/conf-tmpl/mapflag/arenas.txt
index cab2b1174..227055a68 100644
--- a/conf-tmpl/mapflag/arenas.txt
+++ b/conf-tmpl/mapflag/arenas.txt
@@ -1,106 +1,106 @@
-//===== eAthena Script =======================================
-//= Map Flags for Arena Rooms
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 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 Dead Branch ================>\\
-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
-pvp_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
-thief_1-1.gat mapflag nobranch
-thief_2-1.gat mapflag nobranch
-thief_3-1.gat mapflag nobranch
-wizard_1-1.gat mapflag nobranch
-wizard_2-1.gat mapflag nobranch
-wizard_3-1.gat mapflag nobranch
-
-// No Memory ====================>\\
-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_2vs2.gat mapflag nomemo
-pvp_c_room.gat mapflag nomemo
-pvp_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
-thief_1-1.gat mapflag nomemo
-thief_2-1.gat mapflag nomemo
-thief_3-1.gat mapflag nomemo
-wizard_1-1.gat mapflag nomemo
-wizard_2-1.gat mapflag nomemo
-wizard_3-1.gat mapflag nomemo
-
-// No Teleport =====================>\\
-arena_room.gat mapflag noteleport
-sec_in01.gat mapflag noteleport
-sec_in02.gat mapflag noteleport
-
-// No Penalty =======================>\\
-sec_in01.gat mapflag nopenalty
-sec_in02.gat mapflag nopenalty
+//===== eAthena Script =======================================
+//= Map Flags for Arena Rooms
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 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 Dead Branch ================>\\
+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
+pvp_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
+thief_1-1.gat mapflag nobranch
+thief_2-1.gat mapflag nobranch
+thief_3-1.gat mapflag nobranch
+wizard_1-1.gat mapflag nobranch
+wizard_2-1.gat mapflag nobranch
+wizard_3-1.gat mapflag nobranch
+
+// No Memory ====================>\\
+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_2vs2.gat mapflag nomemo
+pvp_c_room.gat mapflag nomemo
+pvp_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
+thief_1-1.gat mapflag nomemo
+thief_2-1.gat mapflag nomemo
+thief_3-1.gat mapflag nomemo
+wizard_1-1.gat mapflag nomemo
+wizard_2-1.gat mapflag nomemo
+wizard_3-1.gat mapflag nomemo
+
+// No Teleport =====================>\\
+arena_room.gat mapflag noteleport
+sec_in01.gat mapflag noteleport
+sec_in02.gat mapflag noteleport
+
+// No Penalty =======================>\\
+sec_in01.gat mapflag nopenalty
+sec_in02.gat mapflag nopenalty
diff --git a/conf-tmpl/mapflag/dungeons.txt b/conf-tmpl/mapflag/dungeons.txt
index 45bac1a64..9d3d835fd 100644
--- a/conf-tmpl/mapflag/dungeons.txt
+++ b/conf-tmpl/mapflag/dungeons.txt
@@ -1,153 +1,153 @@
-//===== eAthena Script =======================================
-//= Dungeon Map Flags
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 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: =================================
-//= Added: louyang, umbala, gonryun, yggdrasil dungeons.[kobra_k88]
-//= 1.2 added Gefenia
-//============================================================
-
-
-// No Memory =================
-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
-// 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
-// Geffen Dun ----------------
-gef_dun00.gat mapflag nomemo
-gef_dun01.gat mapflag nomemo
-gef_dun02.gat mapflag nomemo
-gef_dun03.gat mapflag nomemo
-// Geffenia ------------------
-gefenia01.gat mapflag nomemo
-gefenia02.gat mapflag nomemo
-gefenia03.gat mapflag nomemo
-gefenia04.gat mapflag nomemo
-// Gonryun Dun ---------------
-gon_dun01.gat mapflag nomemo
-gon_dun02.gat mapflag nomemo
-gon_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
-// Gongyun Dungeon ------------
-gon_dun01.gat mapflag nomemo
-gon_dun02.gat mapflag nomemo
-gon_dun03.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
+//===== eAthena Script =======================================
+//= Dungeon Map Flags
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 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: =================================
+//= Added: louyang, umbala, gonryun, yggdrasil dungeons.[kobra_k88]
+//= 1.2 added Gefenia
+//============================================================
+
+
+// No Memory =================
+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
+// 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
+// Geffen Dun ----------------
+gef_dun00.gat mapflag nomemo
+gef_dun01.gat mapflag nomemo
+gef_dun02.gat mapflag nomemo
+gef_dun03.gat mapflag nomemo
+// Geffenia ------------------
+gefenia01.gat mapflag nomemo
+gefenia02.gat mapflag nomemo
+gefenia03.gat mapflag nomemo
+gefenia04.gat mapflag nomemo
+// Gonryun Dun ---------------
+gon_dun01.gat mapflag nomemo
+gon_dun02.gat mapflag nomemo
+gon_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
+// Gongyun Dungeon ------------
+gon_dun01.gat mapflag nomemo
+gon_dun02.gat mapflag nomemo
+gon_dun03.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
diff --git a/conf-tmpl/mapflag/guildcastles.txt b/conf-tmpl/mapflag/guildcastles.txt
index b0a6dea9d..8f796dd1e 100644
--- a/conf-tmpl/mapflag/guildcastles.txt
+++ b/conf-tmpl/mapflag/guildcastles.txt
@@ -1,149 +1,149 @@
-//===== eAthena Script =======================================
-//= Map Flags for Guild Castles
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0b
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= gvg: Turns Guild Vs Guild mode on.
-//= pvp_noparty: Disables ability to attack party members.
-//= nowarpto:
-//= 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: =================================
-//= added pvp_noparty flags[kobra_k88]
-//============================================================
-
-
-// Guild Vs Guild On ===============
-aldeg_cas01.gat mapflag gvg
-aldeg_cas02.gat mapflag gvg
-aldeg_cas03.gat mapflag gvg
-aldeg_cas04.gat mapflag gvg
-aldeg_cas05.gat mapflag gvg
-gefg_cas01.gat mapflag gvg
-gefg_cas02.gat mapflag gvg
-gefg_cas03.gat mapflag gvg
-gefg_cas04.gat mapflag gvg
-gefg_cas05.gat mapflag gvg
-payg_cas01.gat mapflag gvg
-payg_cas02.gat mapflag gvg
-payg_cas03.gat mapflag gvg
-payg_cas04.gat mapflag gvg
-payg_cas05.gat mapflag gvg
-prtg_cas01.gat mapflag gvg
-prtg_cas02.gat mapflag gvg
-prtg_cas03.gat mapflag gvg
-prtg_cas04.gat mapflag gvg
-prtg_cas05.gat mapflag gvg
-
-// PvP No Party members ==============
-aldeg_cas01.gat mapflag pvp_noparty
-aldeg_cas02.gat mapflag pvp_noparty
-aldeg_cas03.gat mapflag pvp_noparty
-aldeg_cas04.gat mapflag pvp_noparty
-aldeg_cas05.gat mapflag pvp_noparty
-gefg_cas01.gat mapflag pvp_noparty
-gefg_cas02.gat mapflag pvp_noparty
-gefg_cas03.gat mapflag pvp_noparty
-gefg_cas04.gat mapflag pvp_noparty
-gefg_cas05.gat mapflag pvp_noparty
-payg_cas01.gat mapflag pvp_noparty
-payg_cas02.gat mapflag pvp_noparty
-payg_cas03.gat mapflag pvp_noparty
-payg_cas04.gat mapflag pvp_noparty
-payg_cas05.gat mapflag pvp_noparty
-prtg_cas01.gat mapflag pvp_noparty
-prtg_cas02.gat mapflag pvp_noparty
-prtg_cas03.gat mapflag pvp_noparty
-prtg_cas04.gat mapflag pvp_noparty
-prtg_cas05.gat mapflag pvp_noparty
-
-// No Dead Branch ==================
-// gvg flag prevents dead_branch usage as well [Lupus]
-//alde_gld.gat mapflag nobranch
-//pay_gld.gat mapflag nobranch
-//prt_gld.gat mapflag nobranch
-
-// No Memory ======================
-//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
-
-// No Teleport ========================
-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
-
-// No Warp To ========================
-//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
+//===== eAthena Script =======================================
+//= Map Flags for Guild Castles
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0b
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= gvg: Turns Guild Vs Guild mode on.
+//= pvp_noparty: Disables ability to attack party members.
+//= nowarpto:
+//= 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: =================================
+//= added pvp_noparty flags[kobra_k88]
+//============================================================
+
+
+// Guild Vs Guild On ===============
+aldeg_cas01.gat mapflag gvg
+aldeg_cas02.gat mapflag gvg
+aldeg_cas03.gat mapflag gvg
+aldeg_cas04.gat mapflag gvg
+aldeg_cas05.gat mapflag gvg
+gefg_cas01.gat mapflag gvg
+gefg_cas02.gat mapflag gvg
+gefg_cas03.gat mapflag gvg
+gefg_cas04.gat mapflag gvg
+gefg_cas05.gat mapflag gvg
+payg_cas01.gat mapflag gvg
+payg_cas02.gat mapflag gvg
+payg_cas03.gat mapflag gvg
+payg_cas04.gat mapflag gvg
+payg_cas05.gat mapflag gvg
+prtg_cas01.gat mapflag gvg
+prtg_cas02.gat mapflag gvg
+prtg_cas03.gat mapflag gvg
+prtg_cas04.gat mapflag gvg
+prtg_cas05.gat mapflag gvg
+
+// PvP No Party members ==============
+aldeg_cas01.gat mapflag pvp_noparty
+aldeg_cas02.gat mapflag pvp_noparty
+aldeg_cas03.gat mapflag pvp_noparty
+aldeg_cas04.gat mapflag pvp_noparty
+aldeg_cas05.gat mapflag pvp_noparty
+gefg_cas01.gat mapflag pvp_noparty
+gefg_cas02.gat mapflag pvp_noparty
+gefg_cas03.gat mapflag pvp_noparty
+gefg_cas04.gat mapflag pvp_noparty
+gefg_cas05.gat mapflag pvp_noparty
+payg_cas01.gat mapflag pvp_noparty
+payg_cas02.gat mapflag pvp_noparty
+payg_cas03.gat mapflag pvp_noparty
+payg_cas04.gat mapflag pvp_noparty
+payg_cas05.gat mapflag pvp_noparty
+prtg_cas01.gat mapflag pvp_noparty
+prtg_cas02.gat mapflag pvp_noparty
+prtg_cas03.gat mapflag pvp_noparty
+prtg_cas04.gat mapflag pvp_noparty
+prtg_cas05.gat mapflag pvp_noparty
+
+// No Dead Branch ==================
+// gvg flag prevents dead_branch usage as well [Lupus]
+//alde_gld.gat mapflag nobranch
+//pay_gld.gat mapflag nobranch
+//prt_gld.gat mapflag nobranch
+
+// No Memory ======================
+//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
+
+// No Teleport ========================
+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
+
+// No Warp To ========================
+//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
diff --git a/conf-tmpl/mapflag/gvg.txt b/conf-tmpl/mapflag/gvg.txt
index 830345360..8f68cfc3e 100644
--- a/conf-tmpl/mapflag/gvg.txt
+++ b/conf-tmpl/mapflag/gvg.txt
@@ -1,70 +1,70 @@
-//===== eAthena Script =======================================
-//= Map Flags for GvG Arenas
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.1a
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= gvg: Turns on GvG mode
-//= pvp_noparty: Disables attacking own party member
-//= 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: =================================
-//=
-//============================================================
-
-// GvG ===================
-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
-
-// PvP No Party =================
-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
-
-// No Branch =====================
-// gvg flag prevents dead_branch usage as well [Lupus]
-//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
-
-// No Warp Memory =================
-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
-
-// No Penalty ===================
-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
-
-// No Save =================
-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
-
-// No Teleport ===================
-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
+//===== eAthena Script =======================================
+//= Map Flags for GvG Arenas
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.1a
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= gvg: Turns on GvG mode
+//= pvp_noparty: Disables attacking own party member
+//= 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: =================================
+//=
+//============================================================
+
+// GvG ===================
+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
+
+// PvP No Party =================
+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
+
+// No Branch =====================
+// gvg flag prevents dead_branch usage as well [Lupus]
+//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
+
+// No Warp Memory =================
+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
+
+// No Penalty ===================
+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
+
+// No Save =================
+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
+
+// No Teleport ===================
+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
diff --git a/conf-tmpl/mapflag/jail.txt b/conf-tmpl/mapflag/jail.txt
index 3b43dae90..77e4c4d95 100644
--- a/conf-tmpl/mapflag/jail.txt
+++ b/conf-tmpl/mapflag/jail.txt
@@ -1,43 +1,43 @@
-//===== 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
-
-
-// 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
+
+
+// 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/jobquests.txt b/conf-tmpl/mapflag/jobquests.txt
index a0c6149a4..0712dcfbc 100644
--- a/conf-tmpl/mapflag/jobquests.txt
+++ b/conf-tmpl/mapflag/jobquests.txt
@@ -1,135 +1,135 @@
-//===== eAthena Script =======================================
-//= Map Flags for Job Quest Maps
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 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.
-//= noicewall: disables icewall skill
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-// No Dead Branch ====================
-sword_1-1.gat mapflag nobranch
-sword_2-1.gat mapflag nobranch
-sword_3-1.gat mapflag nobranch
-job_thief1.gat mapflag nobranch
-// 2-1
-job_hunte.gat mapflag nobranch
-job_knt.gat mapflag nobranch
-job_prist.gat mapflag nobranch
-job_wiz.gat mapflag nobranch
-in_moc_16.gat mapflag nobranch
-in_hunter.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
-
-// No Memory =======================
-sword_1-1.gat mapflag nomemo
-sword_2-1.gat mapflag nomemo
-sword_3-1.gat mapflag nomemo
-job_thief1.gat mapflag nomemo
-// 2-1 -----------------------
-job_hunte.gat mapflag nomemo
-job_knight.gat mapflag nomemo
-job_prist.gat mapflag nomemo
-job_wiz.gat mapflag nomemo
-in_hunter.gat mapflag nomemo
-in_moc_16.gat mapflag nomemo
-// 2-2 --------------------
-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
-
-// No Penalty ========================
-sword_1-1.gat mapflag nopenalty
-sword_2-1.gat mapflag nopenalty
-sword_3-1.gat mapflag nopenalty
-job_thief1.gat mapflag nopenalty
-// 2-1 -----------------------
-job_hunte.gat mapflag nopenalty
-job_knight.gat mapflag nopenalty
-job_prist.gat mapflag nopenalty
-job_wiz.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
-
-// No Save ====================
-sword_1-1.gat mapflag nosave SavePoint
-sword_2-1.gat mapflag nosave SavePoint
-sword_3-1.gat mapflag nosave SavePoint
-//job_thief1.gat mapflag nosave SavePoint
-// 2-1
-job_hunte.gat mapflag nosave SavePoint
-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
-//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
-
-// No Teleport =========================
-sword_1-1.gat mapflag noteleport
-sword_2-1.gat mapflag noteleport
-sword_3-1.gat mapflag noteleport
-job_thief1.gat mapflag noteleport
-// 2-1 -----------------------
-job_hunte.gat mapflag noteleport
-job_knight.gat mapflag noteleport
-job_prist.gat mapflag noteleport
-job_wiz.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
-
-// No Icewall
-in_hunter.gat mapflag noicewall
-in_moc_16.gat mapflag noicewall
-alde_alche.gat mapflag noicewall
+//===== eAthena Script =======================================
+//= Map Flags for Job Quest Maps
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 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.
+//= noicewall: disables icewall skill
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+// No Dead Branch ====================
+sword_1-1.gat mapflag nobranch
+sword_2-1.gat mapflag nobranch
+sword_3-1.gat mapflag nobranch
+job_thief1.gat mapflag nobranch
+// 2-1
+job_hunte.gat mapflag nobranch
+job_knt.gat mapflag nobranch
+job_prist.gat mapflag nobranch
+job_wiz.gat mapflag nobranch
+in_moc_16.gat mapflag nobranch
+in_hunter.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
+
+// No Memory =======================
+sword_1-1.gat mapflag nomemo
+sword_2-1.gat mapflag nomemo
+sword_3-1.gat mapflag nomemo
+job_thief1.gat mapflag nomemo
+// 2-1 -----------------------
+job_hunte.gat mapflag nomemo
+job_knight.gat mapflag nomemo
+job_prist.gat mapflag nomemo
+job_wiz.gat mapflag nomemo
+in_hunter.gat mapflag nomemo
+in_moc_16.gat mapflag nomemo
+// 2-2 --------------------
+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
+
+// No Penalty ========================
+sword_1-1.gat mapflag nopenalty
+sword_2-1.gat mapflag nopenalty
+sword_3-1.gat mapflag nopenalty
+job_thief1.gat mapflag nopenalty
+// 2-1 -----------------------
+job_hunte.gat mapflag nopenalty
+job_knight.gat mapflag nopenalty
+job_prist.gat mapflag nopenalty
+job_wiz.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
+
+// No Save ====================
+sword_1-1.gat mapflag nosave SavePoint
+sword_2-1.gat mapflag nosave SavePoint
+sword_3-1.gat mapflag nosave SavePoint
+//job_thief1.gat mapflag nosave SavePoint
+// 2-1
+job_hunte.gat mapflag nosave SavePoint
+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
+//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
+
+// No Teleport =========================
+sword_1-1.gat mapflag noteleport
+sword_2-1.gat mapflag noteleport
+sword_3-1.gat mapflag noteleport
+job_thief1.gat mapflag noteleport
+// 2-1 -----------------------
+job_hunte.gat mapflag noteleport
+job_knight.gat mapflag noteleport
+job_prist.gat mapflag noteleport
+job_wiz.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
+
+// No Icewall
+in_hunter.gat mapflag noicewall
+in_moc_16.gat mapflag noicewall
+alde_alche.gat mapflag noicewall
monk_in.gat mapflag noicewall \ No newline at end of file
diff --git a/conf-tmpl/mapflag/pvp.txt b/conf-tmpl/mapflag/pvp.txt
index 9d368feff..479791ca7 100644
--- a/conf-tmpl/mapflag/pvp.txt
+++ b/conf-tmpl/mapflag/pvp.txt
@@ -1,566 +1,566 @@
-//===== eAthena Script =======================================
-//= Map Flags for PvP Arenas
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= pvp: Turns on PvP mode
-//= pvp_noparty:
-//= 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: =================================
-//= added equip drops for PvP Nightmare Arena
-//============================================================
-
-
-// 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
-
-// PvP No Party =========================
-//pvp_y_1-1.gat mapflag pvp_noparty
-//pvp_y_1-2.gat mapflag pvp_noparty
-//pvp_y_1-3.gat mapflag pvp_noparty
-//pvp_y_1-4.gat mapflag pvp_noparty
-//pvp_y_1-5.gat mapflag pvp_noparty
-//pvp_y_2-1.gat mapflag pvp_noparty
-//pvp_y_2-2.gat mapflag pvp_noparty
-//pvp_y_2-3.gat mapflag pvp_noparty
-//pvp_y_2-4.gat mapflag pvp_noparty
-//pvp_y_2-5.gat mapflag pvp_noparty
-//pvp_y_3-1.gat mapflag pvp_noparty
-//pvp_y_3-2.gat mapflag pvp_noparty
-//pvp_y_3-3.gat mapflag pvp_noparty
-//pvp_y_3-4.gat mapflag pvp_noparty
-//pvp_y_3-5.gat mapflag pvp_noparty
-//pvp_y_4-1.gat mapflag pvp_noparty
-//pvp_y_4-2.gat mapflag pvp_noparty
-//pvp_y_4-3.gat mapflag pvp_noparty
-//pvp_y_4-4.gat mapflag pvp_noparty
-//pvp_y_4-5.gat mapflag pvp_noparty
-//pvp_y_5-1.gat mapflag pvp_noparty
-//pvp_y_5-2.gat mapflag pvp_noparty
-//pvp_y_5-3.gat mapflag pvp_noparty
-//pvp_y_5-4.gat mapflag pvp_noparty
-//pvp_y_5-5.gat mapflag pvp_noparty
-//pvp_y_6-1.gat mapflag pvp_noparty
-//pvp_y_6-2.gat mapflag pvp_noparty
-//pvp_y_6-3.gat mapflag pvp_noparty
-//pvp_y_6-4.gat mapflag pvp_noparty
-//pvp_y_6-5.gat mapflag pvp_noparty
-//pvp_y_7-1.gat mapflag pvp_noparty
-//pvp_y_7-2.gat mapflag pvp_noparty
-//pvp_y_7-3.gat mapflag pvp_noparty
-//pvp_y_7-4.gat mapflag pvp_noparty
-//pvp_y_7-5.gat mapflag pvp_noparty
-//pvp_y_8-1.gat mapflag pvp_noparty
-//pvp_y_8-2.gat mapflag pvp_noparty
-//pvp_y_8-3.gat mapflag pvp_noparty
-//pvp_y_8-4.gat mapflag pvp_noparty
-//pvp_y_8-5.gat mapflag pvp_noparty
-//pvp_n_1-1.gat mapflag pvp_noparty
-//pvp_n_1-2.gat mapflag pvp_noparty
-//pvp_n_1-3.gat mapflag pvp_noparty
-//pvp_n_1-4.gat mapflag pvp_noparty
-//pvp_n_1-5.gat mapflag pvp_noparty
-//pvp_n_2-1.gat mapflag pvp_noparty
-//pvp_n_2-2.gat mapflag pvp_noparty
-//pvp_n_2-3.gat mapflag pvp_noparty
-//pvp_n_2-4.gat mapflag pvp_noparty
-//pvp_n_2-5.gat mapflag pvp_noparty
-//pvp_n_3-1.gat mapflag pvp_noparty
-//pvp_n_3-2.gat mapflag pvp_noparty
-//pvp_n_3-3.gat mapflag pvp_noparty
-//pvp_n_3-4.gat mapflag pvp_noparty
-//pvp_n_3-5.gat mapflag pvp_noparty
-//pvp_n_4-1.gat mapflag pvp_noparty
-//pvp_n_4-2.gat mapflag pvp_noparty
-//pvp_n_4-3.gat mapflag pvp_noparty
-//pvp_n_4-4.gat mapflag pvp_noparty
-//pvp_n_4-5.gat mapflag pvp_noparty
-//pvp_n_5-1.gat mapflag pvp_noparty
-//pvp_n_5-2.gat mapflag pvp_noparty
-//pvp_n_5-3.gat mapflag pvp_noparty
-//pvp_n_5-4.gat mapflag pvp_noparty
-//pvp_n_5-5.gat mapflag pvp_noparty
-//pvp_n_6-1.gat mapflag pvp_noparty
-//pvp_n_6-2.gat mapflag pvp_noparty
-//pvp_n_6-3.gat mapflag pvp_noparty
-//pvp_n_6-4.gat mapflag pvp_noparty
-//pvp_n_6-5.gat mapflag pvp_noparty
-//pvp_n_7-1.gat mapflag pvp_noparty
-//pvp_n_7-2.gat mapflag pvp_noparty
-//pvp_n_7-3.gat mapflag pvp_noparty
-//pvp_n_7-4.gat mapflag pvp_noparty
-//pvp_n_7-5.gat mapflag pvp_noparty
-//pvp_n_8-1.gat mapflag pvp_noparty
-//pvp_n_8-2.gat mapflag pvp_noparty
-//pvp_n_8-3.gat mapflag pvp_noparty
-//pvp_n_8-4.gat mapflag pvp_noparty
-//pvp_n_8-5.gat mapflag pvp_noparty
-
-// No Memory ==========================
-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
-
-// No Save =================================
-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
-
-// No Penalty =========================
-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 Teleport =======================
-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
-
-//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 for PvP Arenas
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= pvp: Turns on PvP mode
+//= pvp_noparty:
+//= 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: =================================
+//= added equip drops for PvP Nightmare Arena
+//============================================================
+
+
+// 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
+
+// PvP No Party =========================
+//pvp_y_1-1.gat mapflag pvp_noparty
+//pvp_y_1-2.gat mapflag pvp_noparty
+//pvp_y_1-3.gat mapflag pvp_noparty
+//pvp_y_1-4.gat mapflag pvp_noparty
+//pvp_y_1-5.gat mapflag pvp_noparty
+//pvp_y_2-1.gat mapflag pvp_noparty
+//pvp_y_2-2.gat mapflag pvp_noparty
+//pvp_y_2-3.gat mapflag pvp_noparty
+//pvp_y_2-4.gat mapflag pvp_noparty
+//pvp_y_2-5.gat mapflag pvp_noparty
+//pvp_y_3-1.gat mapflag pvp_noparty
+//pvp_y_3-2.gat mapflag pvp_noparty
+//pvp_y_3-3.gat mapflag pvp_noparty
+//pvp_y_3-4.gat mapflag pvp_noparty
+//pvp_y_3-5.gat mapflag pvp_noparty
+//pvp_y_4-1.gat mapflag pvp_noparty
+//pvp_y_4-2.gat mapflag pvp_noparty
+//pvp_y_4-3.gat mapflag pvp_noparty
+//pvp_y_4-4.gat mapflag pvp_noparty
+//pvp_y_4-5.gat mapflag pvp_noparty
+//pvp_y_5-1.gat mapflag pvp_noparty
+//pvp_y_5-2.gat mapflag pvp_noparty
+//pvp_y_5-3.gat mapflag pvp_noparty
+//pvp_y_5-4.gat mapflag pvp_noparty
+//pvp_y_5-5.gat mapflag pvp_noparty
+//pvp_y_6-1.gat mapflag pvp_noparty
+//pvp_y_6-2.gat mapflag pvp_noparty
+//pvp_y_6-3.gat mapflag pvp_noparty
+//pvp_y_6-4.gat mapflag pvp_noparty
+//pvp_y_6-5.gat mapflag pvp_noparty
+//pvp_y_7-1.gat mapflag pvp_noparty
+//pvp_y_7-2.gat mapflag pvp_noparty
+//pvp_y_7-3.gat mapflag pvp_noparty
+//pvp_y_7-4.gat mapflag pvp_noparty
+//pvp_y_7-5.gat mapflag pvp_noparty
+//pvp_y_8-1.gat mapflag pvp_noparty
+//pvp_y_8-2.gat mapflag pvp_noparty
+//pvp_y_8-3.gat mapflag pvp_noparty
+//pvp_y_8-4.gat mapflag pvp_noparty
+//pvp_y_8-5.gat mapflag pvp_noparty
+//pvp_n_1-1.gat mapflag pvp_noparty
+//pvp_n_1-2.gat mapflag pvp_noparty
+//pvp_n_1-3.gat mapflag pvp_noparty
+//pvp_n_1-4.gat mapflag pvp_noparty
+//pvp_n_1-5.gat mapflag pvp_noparty
+//pvp_n_2-1.gat mapflag pvp_noparty
+//pvp_n_2-2.gat mapflag pvp_noparty
+//pvp_n_2-3.gat mapflag pvp_noparty
+//pvp_n_2-4.gat mapflag pvp_noparty
+//pvp_n_2-5.gat mapflag pvp_noparty
+//pvp_n_3-1.gat mapflag pvp_noparty
+//pvp_n_3-2.gat mapflag pvp_noparty
+//pvp_n_3-3.gat mapflag pvp_noparty
+//pvp_n_3-4.gat mapflag pvp_noparty
+//pvp_n_3-5.gat mapflag pvp_noparty
+//pvp_n_4-1.gat mapflag pvp_noparty
+//pvp_n_4-2.gat mapflag pvp_noparty
+//pvp_n_4-3.gat mapflag pvp_noparty
+//pvp_n_4-4.gat mapflag pvp_noparty
+//pvp_n_4-5.gat mapflag pvp_noparty
+//pvp_n_5-1.gat mapflag pvp_noparty
+//pvp_n_5-2.gat mapflag pvp_noparty
+//pvp_n_5-3.gat mapflag pvp_noparty
+//pvp_n_5-4.gat mapflag pvp_noparty
+//pvp_n_5-5.gat mapflag pvp_noparty
+//pvp_n_6-1.gat mapflag pvp_noparty
+//pvp_n_6-2.gat mapflag pvp_noparty
+//pvp_n_6-3.gat mapflag pvp_noparty
+//pvp_n_6-4.gat mapflag pvp_noparty
+//pvp_n_6-5.gat mapflag pvp_noparty
+//pvp_n_7-1.gat mapflag pvp_noparty
+//pvp_n_7-2.gat mapflag pvp_noparty
+//pvp_n_7-3.gat mapflag pvp_noparty
+//pvp_n_7-4.gat mapflag pvp_noparty
+//pvp_n_7-5.gat mapflag pvp_noparty
+//pvp_n_8-1.gat mapflag pvp_noparty
+//pvp_n_8-2.gat mapflag pvp_noparty
+//pvp_n_8-3.gat mapflag pvp_noparty
+//pvp_n_8-4.gat mapflag pvp_noparty
+//pvp_n_8-5.gat mapflag pvp_noparty
+
+// No Memory ==========================
+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
+
+// No Save =================================
+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
+
+// No Penalty =========================
+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 Teleport =======================
+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
+
+//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/towns.txt b/conf-tmpl/mapflag/towns.txt
index b69e5d0a1..9352048ce 100644
--- a/conf-tmpl/mapflag/towns.txt
+++ b/conf-tmpl/mapflag/towns.txt
@@ -1,224 +1,224 @@
-//===== eAthena Script =======================================
-//= Map Flags for Buildings inside of Town Maps
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== Description: =========================================
-//= 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
-//= noreturn: No using b-wings
-//= noicewall: Disables icewall skill
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-// No Dead Branch ================>\\
-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
-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_1-1.gat mapflag nobranch
-new_1-2.gat mapflag nobranch
-new_1-3.gat mapflag nobranch
-new_1-4.gat mapflag nobranch
-nif_in.gat mapflag nobranch
-payon_in01.gat mapflag nobranch
-payon_in02.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_in03.gat mapflag nobranch
-yuno_in04.gat mapflag nobranch
-yuno_in05.gat mapflag nobranch
-
-// No Memory ==================>\\
-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
-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
-nif_in.gat mapflag nomemo
-new_1-1.gat mapflag nomemo
-new_1-2.gat mapflag nomemo
-new_1-3.gat mapflag nomemo
-new_1-4.gat mapflag nomemo
-payon_in01.gat mapflag nomemo
-payon_in02.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
-yuno_in01.gat mapflag nomemo
-yuno_in02.gat mapflag nomemo
-yuno_in03.gat mapflag nomemo
-
-
-// No Penalty ====================>\\
-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
-arena_room.gat mapflag nopenalty
-comodo.gat mapflag nopenalty
-cmd_in01.gat mapflag nopenalty
-cmd_in02.gat mapflag nopenalty
-geffen.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
-in_orcs01.gat mapflag nopenalty
-izlude.gat mapflag nopenalty
-izlude_in.gat mapflag nopenalty
-jawaii.gat mapflag nopenalty
-jawaii_in.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_1-1.gat mapflag nopenalty
-new_1-2.gat mapflag nopenalty
-new_1-3.gat mapflag nopenalty
-new_1-4.gat mapflag nopenalty
-niflheim.gat mapflag nopenalty
-nif_in.gat mapflag nopenalty
-payon.gat mapflag nopenalty
-payon_in01.gat mapflag nopenalty
-payon_in02.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
-umatsu.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_in03.gat mapflag nopenalty
-yuno_in04.gat mapflag nopenalty
-yuno_in05.gat mapflag nopenalty
-
-
-// No Teleport ===============>\\
-alb_ship.gat mapflag noteleport
-alberta_in.gat mapflag noteleport
-aldeba_in.gat mapflag noteleport
-ama_in01.gat mapflag noteleport
-ama_in02.gat mapflag noteleport
-cmd_in01.gat mapflag noteleport
-cmd_in02.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_1-1.gat mapflag noteleport
-new_1-2.gat mapflag noteleport
-new_1-3.gat mapflag noteleport
-new_1-4.gat mapflag noteleport
-nif_in.gat mapflag noteleport
-payon_in01.gat mapflag noteleport
-payon_in02.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_in03.gat mapflag noteleport
-yuno_in04.gat mapflag noteleport
-yuno_in05.gat mapflag noteleport
-
-// No Icewall ===============>\\
-alb_ship.gat mapflag noicewall
-alberta_in.gat mapflag noicewall
-aldeba_in.gat mapflag noicewall
-ama_in01.gat mapflag noicewall
-ama_in02.gat mapflag noicewall
-cmd_in01.gat mapflag noicewall
-cmd_in02.gat mapflag noicewall
-gef_tower.gat mapflag noicewall
-geffen_in.gat mapflag noicewall
-gon_test.gat mapflag noicewall
-gon_in.gat mapflag noicewall
-in_orcs01.gat mapflag noicewall
-izlude_in.gat mapflag noicewall
-jawaii_in.gat mapflag noicewall
-lou_in01.gat mapflag noicewall
-lou_in02.gat mapflag noicewall
-moc_castle.gat mapflag noicewall
-morocc_in.gat mapflag noicewall
-new_1-1.gat mapflag noicewall
-new_1-2.gat mapflag noicewall
-new_1-3.gat mapflag noicewall
-new_1-4.gat mapflag noicewall
-nif_in.gat mapflag noicewall
-payon_in01.gat mapflag noicewall
-payon_in02.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
-um_in.gat mapflag noicewall
-xmas_in.gat mapflag noicewall
-yuno_in01.gat mapflag noicewall
-yuno_in03.gat mapflag noicewall
-yuno_in04.gat mapflag noicewall
+//===== eAthena Script =======================================
+//= Map Flags for Buildings inside of Town Maps
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== Description: =========================================
+//= 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
+//= noreturn: No using b-wings
+//= noicewall: Disables icewall skill
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+// No Dead Branch ================>\\
+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
+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_1-1.gat mapflag nobranch
+new_1-2.gat mapflag nobranch
+new_1-3.gat mapflag nobranch
+new_1-4.gat mapflag nobranch
+nif_in.gat mapflag nobranch
+payon_in01.gat mapflag nobranch
+payon_in02.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_in03.gat mapflag nobranch
+yuno_in04.gat mapflag nobranch
+yuno_in05.gat mapflag nobranch
+
+// No Memory ==================>\\
+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
+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
+nif_in.gat mapflag nomemo
+new_1-1.gat mapflag nomemo
+new_1-2.gat mapflag nomemo
+new_1-3.gat mapflag nomemo
+new_1-4.gat mapflag nomemo
+payon_in01.gat mapflag nomemo
+payon_in02.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
+yuno_in01.gat mapflag nomemo
+yuno_in02.gat mapflag nomemo
+yuno_in03.gat mapflag nomemo
+
+
+// No Penalty ====================>\\
+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
+arena_room.gat mapflag nopenalty
+comodo.gat mapflag nopenalty
+cmd_in01.gat mapflag nopenalty
+cmd_in02.gat mapflag nopenalty
+geffen.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
+in_orcs01.gat mapflag nopenalty
+izlude.gat mapflag nopenalty
+izlude_in.gat mapflag nopenalty
+jawaii.gat mapflag nopenalty
+jawaii_in.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_1-1.gat mapflag nopenalty
+new_1-2.gat mapflag nopenalty
+new_1-3.gat mapflag nopenalty
+new_1-4.gat mapflag nopenalty
+niflheim.gat mapflag nopenalty
+nif_in.gat mapflag nopenalty
+payon.gat mapflag nopenalty
+payon_in01.gat mapflag nopenalty
+payon_in02.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
+umatsu.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_in03.gat mapflag nopenalty
+yuno_in04.gat mapflag nopenalty
+yuno_in05.gat mapflag nopenalty
+
+
+// No Teleport ===============>\\
+alb_ship.gat mapflag noteleport
+alberta_in.gat mapflag noteleport
+aldeba_in.gat mapflag noteleport
+ama_in01.gat mapflag noteleport
+ama_in02.gat mapflag noteleport
+cmd_in01.gat mapflag noteleport
+cmd_in02.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_1-1.gat mapflag noteleport
+new_1-2.gat mapflag noteleport
+new_1-3.gat mapflag noteleport
+new_1-4.gat mapflag noteleport
+nif_in.gat mapflag noteleport
+payon_in01.gat mapflag noteleport
+payon_in02.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_in03.gat mapflag noteleport
+yuno_in04.gat mapflag noteleport
+yuno_in05.gat mapflag noteleport
+
+// No Icewall ===============>\\
+alb_ship.gat mapflag noicewall
+alberta_in.gat mapflag noicewall
+aldeba_in.gat mapflag noicewall
+ama_in01.gat mapflag noicewall
+ama_in02.gat mapflag noicewall
+cmd_in01.gat mapflag noicewall
+cmd_in02.gat mapflag noicewall
+gef_tower.gat mapflag noicewall
+geffen_in.gat mapflag noicewall
+gon_test.gat mapflag noicewall
+gon_in.gat mapflag noicewall
+in_orcs01.gat mapflag noicewall
+izlude_in.gat mapflag noicewall
+jawaii_in.gat mapflag noicewall
+lou_in01.gat mapflag noicewall
+lou_in02.gat mapflag noicewall
+moc_castle.gat mapflag noicewall
+morocc_in.gat mapflag noicewall
+new_1-1.gat mapflag noicewall
+new_1-2.gat mapflag noicewall
+new_1-3.gat mapflag noicewall
+new_1-4.gat mapflag noicewall
+nif_in.gat mapflag noicewall
+payon_in01.gat mapflag noicewall
+payon_in02.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
+um_in.gat mapflag noicewall
+xmas_in.gat mapflag noicewall
+yuno_in01.gat mapflag noicewall
+yuno_in03.gat mapflag noicewall
+yuno_in04.gat mapflag noicewall
yuno_in05.gat mapflag noicewall \ No newline at end of file
diff --git a/conf-tmpl/mapflag/type/gvg.txt b/conf-tmpl/mapflag/type/gvg.txt
index 7d1fb6565..39b9acdea 100644
--- a/conf-tmpl/mapflag/type/gvg.txt
+++ b/conf-tmpl/mapflag/type/gvg.txt
@@ -1,28 +1,28 @@
-// Guild Castles ==========
-aldeg_cas01.gat mapflag gvg
-aldeg_cas02.gat mapflag gvg
-aldeg_cas03.gat mapflag gvg
-aldeg_cas04.gat mapflag gvg
-aldeg_cas05.gat mapflag gvg
-gefg_cas01.gat mapflag gvg
-gefg_cas02.gat mapflag gvg
-gefg_cas03.gat mapflag gvg
-gefg_cas04.gat mapflag gvg
-gefg_cas05.gat mapflag gvg
-payg_cas01.gat mapflag gvg
-payg_cas02.gat mapflag gvg
-payg_cas03.gat mapflag gvg
-payg_cas04.gat mapflag gvg
-payg_cas05.gat mapflag gvg
-prtg_cas01.gat mapflag gvg
-prtg_cas02.gat mapflag gvg
-prtg_cas03.gat mapflag gvg
-prtg_cas04.gat mapflag gvg
-prtg_cas05.gat mapflag gvg
-
-// 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
+aldeg_cas02.gat mapflag gvg
+aldeg_cas03.gat mapflag gvg
+aldeg_cas04.gat mapflag gvg
+aldeg_cas05.gat mapflag gvg
+gefg_cas01.gat mapflag gvg
+gefg_cas02.gat mapflag gvg
+gefg_cas03.gat mapflag gvg
+gefg_cas04.gat mapflag gvg
+gefg_cas05.gat mapflag gvg
+payg_cas01.gat mapflag gvg
+payg_cas02.gat mapflag gvg
+payg_cas03.gat mapflag gvg
+payg_cas04.gat mapflag gvg
+payg_cas05.gat mapflag gvg
+prtg_cas01.gat mapflag gvg
+prtg_cas02.gat mapflag gvg
+prtg_cas03.gat mapflag gvg
+prtg_cas04.gat mapflag gvg
+prtg_cas05.gat mapflag gvg
+
+// 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
diff --git a/conf-tmpl/mapflag/type/jail.txt b/conf-tmpl/mapflag/type/jail.txt
index e3509235f..3aa7544dc 100644
--- a/conf-tmpl/mapflag/type/jail.txt
+++ b/conf-tmpl/mapflag/type/jail.txt
@@ -1,47 +1,47 @@
-//===========================================
-//= 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: No Parties Allowed in PvP mode
-//= 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.
-//= notelepot: 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
-
-
-
-
-// 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
+//===========================================
+//= 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: No Parties Allowed in PvP mode
+//= 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.
+//= notelepot: 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
+
+
+
+
+// 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/type/nightmare.txt b/conf-tmpl/mapflag/type/nightmare.txt
index d0c34d188..b185569b6 100644
--- a/conf-tmpl/mapflag/type/nightmare.txt
+++ b/conf-tmpl/mapflag/type/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/type/nobranch.txt b/conf-tmpl/mapflag/type/nobranch.txt
index fdda260af..d37e055f5 100644
--- a/conf-tmpl/mapflag/type/nobranch.txt
+++ b/conf-tmpl/mapflag/type/nobranch.txt
@@ -1,218 +1,218 @@
-//===== eAthena Script =======================================
-//= Map flags that disable dead branching
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-// Cities ================>\\
-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
-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_1-1.gat mapflag nobranch
-new_1-2.gat mapflag nobranch
-new_1-3.gat mapflag nobranch
-new_1-4.gat mapflag nobranch
-nif_in.gat mapflag nobranch
-payon_in01.gat mapflag nobranch
-payon_in02.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_in03.gat mapflag nobranch
-yuno_in04.gat mapflag nobranch
-yuno_in05.gat mapflag nobranch
-
-// Job Quests ====================
-sword_1-1.gat mapflag nobranch
-sword_2-1.gat mapflag nobranch
-sword_3-1.gat mapflag nobranch
-job_thief1.gat mapflag nobranch
-// 2-1
-job_hunte.gat mapflag nobranch
-job_knt.gat mapflag nobranch
-job_prist.gat mapflag nobranch
-job_wiz.gat mapflag nobranch
-in_moc_16.gat mapflag nobranch
-in_hunter.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
-
-// 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
-
-// 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
-pvp_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
-thief_1-1.gat mapflag nobranch
-thief_2-1.gat mapflag nobranch
-thief_3-1.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
+//===== eAthena Script =======================================
+//= Map flags that disable dead branching
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+
+// Cities ================>\\
+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
+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_1-1.gat mapflag nobranch
+new_1-2.gat mapflag nobranch
+new_1-3.gat mapflag nobranch
+new_1-4.gat mapflag nobranch
+nif_in.gat mapflag nobranch
+payon_in01.gat mapflag nobranch
+payon_in02.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_in03.gat mapflag nobranch
+yuno_in04.gat mapflag nobranch
+yuno_in05.gat mapflag nobranch
+
+// Job Quests ====================
+sword_1-1.gat mapflag nobranch
+sword_2-1.gat mapflag nobranch
+sword_3-1.gat mapflag nobranch
+job_thief1.gat mapflag nobranch
+// 2-1
+job_hunte.gat mapflag nobranch
+job_knt.gat mapflag nobranch
+job_prist.gat mapflag nobranch
+job_wiz.gat mapflag nobranch
+in_moc_16.gat mapflag nobranch
+in_hunter.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
+
+// 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
+
+// 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
+pvp_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
+thief_1-1.gat mapflag nobranch
+thief_2-1.gat mapflag nobranch
+thief_3-1.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
diff --git a/conf-tmpl/mapflag/type/noicewall.txt b/conf-tmpl/mapflag/type/noicewall.txt
index 5c148d1eb..08f46877d 100644
--- a/conf-tmpl/mapflag/type/noicewall.txt
+++ b/conf-tmpl/mapflag/type/noicewall.txt
@@ -1,60 +1,60 @@
-//===== 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.
-//============================================================
-
-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
-cmd_in01.gat mapflag noicewall
-cmd_in02.gat mapflag noicewall
-comodo.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
-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.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
-sword_1-1.gat mapflag noicewall
-sword_2-1.gat mapflag noicewall
-sword_3-1.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_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
+//===== 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.
+//============================================================
+
+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
+cmd_in01.gat mapflag noicewall
+cmd_in02.gat mapflag noicewall
+comodo.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
+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.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
+sword_1-1.gat mapflag noicewall
+sword_2-1.gat mapflag noicewall
+sword_3-1.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_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 \ No newline at end of file
diff --git a/conf-tmpl/mapflag/type/nomemo.txt b/conf-tmpl/mapflag/type/nomemo.txt
index cf293fac8..4bd5e9c36 100644
--- a/conf-tmpl/mapflag/type/nomemo.txt
+++ b/conf-tmpl/mapflag/type/nomemo.txt
@@ -1,353 +1,353 @@
-//===== eAthena Script =======================================
-//= Map flags that disable warp portal memory
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-
-// Towns ==================>\\
-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
-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
-nif_in.gat mapflag nomemo
-new_1-1.gat mapflag nomemo
-new_1-2.gat mapflag nomemo
-new_1-3.gat mapflag nomemo
-new_1-4.gat mapflag nomemo
-payon_in01.gat mapflag nomemo
-payon_in02.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
-yuno_in01.gat mapflag nomemo
-yuno_in02.gat mapflag nomemo
-yuno_in03.gat mapflag nomemo
-
-// Job quests ===================
-sword_1-1.gat mapflag nomemo
-sword_2-1.gat mapflag nomemo
-sword_3-1.gat mapflag nomemo
-job_thief1.gat mapflag nomemo
-// 2-1 -----------------------
-job_hunte.gat mapflag nomemo
-job_knight.gat mapflag nomemo
-job_prist.gat mapflag nomemo
-job_wiz.gat mapflag nomemo
-in_hunter.gat mapflag nomemo
-in_moc_16.gat mapflag nomemo
-// 2-2 --------------------
-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
-
-// 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
-// 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
-// Geffen Dun ----------------
-gef_dun00.gat mapflag nomemo
-gef_dun01.gat mapflag nomemo
-gef_dun02.gat mapflag nomemo
-gef_dun03.gat mapflag nomemo
-// Gonryun Dun ---------------
-gon_dun01.gat mapflag nomemo
-gon_dun02.gat mapflag nomemo
-gon_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
-// Gongyun Dungeon ------------
-gon_dun01.gat mapflag nomemo
-gon_dun02.gat mapflag nomemo
-gon_dun03.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
-
-// 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
-
-// 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_2vs2.gat mapflag nomemo
-pvp_c_room.gat mapflag nomemo
-pvp_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
-thief_1-1.gat mapflag nomemo
-thief_2-1.gat mapflag nomemo
-thief_3-1.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
+//===== Current Version: =====================================
+
+
+// Towns ==================>\\
+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
+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
+nif_in.gat mapflag nomemo
+new_1-1.gat mapflag nomemo
+new_1-2.gat mapflag nomemo
+new_1-3.gat mapflag nomemo
+new_1-4.gat mapflag nomemo
+payon_in01.gat mapflag nomemo
+payon_in02.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
+yuno_in01.gat mapflag nomemo
+yuno_in02.gat mapflag nomemo
+yuno_in03.gat mapflag nomemo
+
+// Job quests ===================
+sword_1-1.gat mapflag nomemo
+sword_2-1.gat mapflag nomemo
+sword_3-1.gat mapflag nomemo
+job_thief1.gat mapflag nomemo
+// 2-1 -----------------------
+job_hunte.gat mapflag nomemo
+job_knight.gat mapflag nomemo
+job_prist.gat mapflag nomemo
+job_wiz.gat mapflag nomemo
+in_hunter.gat mapflag nomemo
+in_moc_16.gat mapflag nomemo
+// 2-2 --------------------
+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
+
+// 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
+// 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
+// Geffen Dun ----------------
+gef_dun00.gat mapflag nomemo
+gef_dun01.gat mapflag nomemo
+gef_dun02.gat mapflag nomemo
+gef_dun03.gat mapflag nomemo
+// Gonryun Dun ---------------
+gon_dun01.gat mapflag nomemo
+gon_dun02.gat mapflag nomemo
+gon_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
+// Gongyun Dungeon ------------
+gon_dun01.gat mapflag nomemo
+gon_dun02.gat mapflag nomemo
+gon_dun03.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
+
+// 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
+
+// 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_2vs2.gat mapflag nomemo
+pvp_c_room.gat mapflag nomemo
+pvp_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
+thief_1-1.gat mapflag nomemo
+thief_2-1.gat mapflag nomemo
+thief_3-1.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/type/nopenalty.txt b/conf-tmpl/mapflag/type/nopenalty.txt
index fd9bbe5c7..604653527 100644
--- a/conf-tmpl/mapflag/type/nopenalty.txt
+++ b/conf-tmpl/mapflag/type/nopenalty.txt
@@ -1,177 +1,177 @@
-//===== eAthena Script =======================================
-//= Map flags that disable exp. penalty on death.
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-
-// Towns ====================>\\
-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
-arena_room.gat mapflag nopenalty
-comodo.gat mapflag nopenalty
-cmd_in01.gat mapflag nopenalty
-cmd_in02.gat mapflag nopenalty
-geffen.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
-in_orcs01.gat mapflag nopenalty
-izlude.gat mapflag nopenalty
-izlude_in.gat mapflag nopenalty
-jawaii.gat mapflag nopenalty
-jawaii_in.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_1-1.gat mapflag nopenalty
-new_1-2.gat mapflag nopenalty
-new_1-3.gat mapflag nopenalty
-new_1-4.gat mapflag nopenalty
-niflheim.gat mapflag nopenalty
-nif_in.gat mapflag nopenalty
-payon.gat mapflag nopenalty
-payon_in01.gat mapflag nopenalty
-payon_in02.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
-umatsu.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_in03.gat mapflag nopenalty
-yuno_in04.gat mapflag nopenalty
-yuno_in05.gat mapflag nopenalty
-
-// Job Quests ========================
-sword_1-1.gat mapflag nopenalty
-sword_2-1.gat mapflag nopenalty
-sword_3-1.gat mapflag nopenalty
-job_thief1.gat mapflag nopenalty
-// 2-1 -----------------------
-job_hunte.gat mapflag nopenalty
-job_knight.gat mapflag nopenalty
-job_prist.gat mapflag nopenalty
-job_wiz.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
-
-// 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
-
-// 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
+//===== Current Version: =====================================
+
+
+// Towns ====================>\\
+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
+arena_room.gat mapflag nopenalty
+comodo.gat mapflag nopenalty
+cmd_in01.gat mapflag nopenalty
+cmd_in02.gat mapflag nopenalty
+geffen.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
+in_orcs01.gat mapflag nopenalty
+izlude.gat mapflag nopenalty
+izlude_in.gat mapflag nopenalty
+jawaii.gat mapflag nopenalty
+jawaii_in.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_1-1.gat mapflag nopenalty
+new_1-2.gat mapflag nopenalty
+new_1-3.gat mapflag nopenalty
+new_1-4.gat mapflag nopenalty
+niflheim.gat mapflag nopenalty
+nif_in.gat mapflag nopenalty
+payon.gat mapflag nopenalty
+payon_in01.gat mapflag nopenalty
+payon_in02.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
+umatsu.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_in03.gat mapflag nopenalty
+yuno_in04.gat mapflag nopenalty
+yuno_in05.gat mapflag nopenalty
+
+// Job Quests ========================
+sword_1-1.gat mapflag nopenalty
+sword_2-1.gat mapflag nopenalty
+sword_3-1.gat mapflag nopenalty
+job_thief1.gat mapflag nopenalty
+// 2-1 -----------------------
+job_hunte.gat mapflag nopenalty
+job_knight.gat mapflag nopenalty
+job_prist.gat mapflag nopenalty
+job_wiz.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
+
+// 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
+
+// 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/type/nopvp.txt b/conf-tmpl/mapflag/type/nopvp.txt
index 52aaf5a6d..ecddb854a 100644
--- a/conf-tmpl/mapflag/type/nopvp.txt
+++ b/conf-tmpl/mapflag/type/nopvp.txt
@@ -1,58 +1,58 @@
-///===== Description: =============================================
-//= nopvp: Disables Player versus Player mode.
-//= To disable PvP mode on a specific map add the mapname here.
-//============================================================
-
-alberta_in.gat mapflag nopvp
-alberta.gat mapflag nopvp
-alde_alche.gat mapflag nopvp
-aldeba_in.gat mapflag nopvp
-aldebaran.gat mapflag nopvp
-ama_in01.gat mapflag nopvp
-ama_in02.gat mapflag nopvp
-amatsu.gat mapflag nopvp
-cmd_in01.gat mapflag nopvp
-cmd_in02.gat mapflag nopvp
-comodo.gat mapflag nopvp
-gef_tower.gat mapflag nopvp
-geffen.gat mapflag nopvp
-geffen_in.gat mapflag nopvp
-gon_in.gat mapflag nopvp
-gonryun.gat mapflag nopvp
-in_hunter.gat mapflag nopvp
-in_moc_16.gat mapflag nopvp
-in_orcs01.gat mapflag nopvp
-izlude_in.gat mapflag nopvp
-izlude.gat mapflag nopvp
-louyang.gat mapflag nopvp
-moc_castle.gat mapflag nopvp
-monk_in.gat mapflag nopvp
-morocc_in.gat mapflag nopvp
-morocc.gat mapflag nopvp
-nif_in.gat mapflag nopvp
-payon_in01.gat mapflag nopvp
-payon_in02.gat mapflag nopvp
-payon_in03.gat mapflag nopvp
-payon.gat mapflag nopvp
-pay_arche.gat mapflag nopvp
-prt_are_in.gat mapflag nopvp
-prt_are01.gat mapflag nopvp
-prt_castle.gat mapflag nopvp
-prt_church.gat mapflag nopvp
-prt_in.gat mapflag nopvp
-prontera.gat mapflag nopvp
-sec_in01.gat mapflag nopvp
-sword_1-1.gat mapflag nopvp
-sword_2-1.gat mapflag nopvp
-sword_3-1.gat mapflag nopvp
-um_in.gat mapflag nopvp
-umbala.gat mapflag nopvp
-xmas_in.gat mapflag nopvp
-xmas.gat mapflag nopvp
-yuno_in01.gat mapflag nopvp
-yuno_in03.gat mapflag nopvp
-yuno_in04.gat mapflag nopvp
-yuno_in05.gat mapflag nopvp
-yuno.gat mapflag nopvp
-gon_test.gat mapflag nopvp
-
+///===== Description: =============================================
+//= nopvp: Disables Player versus Player mode.
+//= To disable PvP mode on a specific map add the mapname here.
+//============================================================
+
+alberta_in.gat mapflag nopvp
+alberta.gat mapflag nopvp
+alde_alche.gat mapflag nopvp
+aldeba_in.gat mapflag nopvp
+aldebaran.gat mapflag nopvp
+ama_in01.gat mapflag nopvp
+ama_in02.gat mapflag nopvp
+amatsu.gat mapflag nopvp
+cmd_in01.gat mapflag nopvp
+cmd_in02.gat mapflag nopvp
+comodo.gat mapflag nopvp
+gef_tower.gat mapflag nopvp
+geffen.gat mapflag nopvp
+geffen_in.gat mapflag nopvp
+gon_in.gat mapflag nopvp
+gonryun.gat mapflag nopvp
+in_hunter.gat mapflag nopvp
+in_moc_16.gat mapflag nopvp
+in_orcs01.gat mapflag nopvp
+izlude_in.gat mapflag nopvp
+izlude.gat mapflag nopvp
+louyang.gat mapflag nopvp
+moc_castle.gat mapflag nopvp
+monk_in.gat mapflag nopvp
+morocc_in.gat mapflag nopvp
+morocc.gat mapflag nopvp
+nif_in.gat mapflag nopvp
+payon_in01.gat mapflag nopvp
+payon_in02.gat mapflag nopvp
+payon_in03.gat mapflag nopvp
+payon.gat mapflag nopvp
+pay_arche.gat mapflag nopvp
+prt_are_in.gat mapflag nopvp
+prt_are01.gat mapflag nopvp
+prt_castle.gat mapflag nopvp
+prt_church.gat mapflag nopvp
+prt_in.gat mapflag nopvp
+prontera.gat mapflag nopvp
+sec_in01.gat mapflag nopvp
+sword_1-1.gat mapflag nopvp
+sword_2-1.gat mapflag nopvp
+sword_3-1.gat mapflag nopvp
+um_in.gat mapflag nopvp
+umbala.gat mapflag nopvp
+xmas_in.gat mapflag nopvp
+xmas.gat mapflag nopvp
+yuno_in01.gat mapflag nopvp
+yuno_in03.gat mapflag nopvp
+yuno_in04.gat mapflag nopvp
+yuno_in05.gat mapflag nopvp
+yuno.gat mapflag nopvp
+gon_test.gat mapflag nopvp
+
diff --git a/conf-tmpl/mapflag/type/nosave.txt b/conf-tmpl/mapflag/type/nosave.txt
index 0bd7bfd8c..c12a2df2e 100644
--- a/conf-tmpl/mapflag/type/nosave.txt
+++ b/conf-tmpl/mapflag/type/nosave.txt
@@ -1,121 +1,121 @@
-//===== eAthena Script =======================================
-//= Map flags that disable auto saving
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-// Job Quests ====================
-sword_1-1.gat mapflag nosave SavePoint
-sword_2-1.gat mapflag nosave SavePoint
-sword_3-1.gat mapflag nosave SavePoint
-//job_thief1.gat mapflag nosave SavePoint
-// 2-1
-job_hunte.gat mapflag nosave SavePoint
-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
-//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
-
-// 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
-
-//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
-
-//gon_test.gat mapflag nosave prontera.gat,150,180
+//===== eAthena Script =======================================
+//= Map flags that disable auto saving
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+
+// Job Quests ====================
+sword_1-1.gat mapflag nosave SavePoint
+sword_2-1.gat mapflag nosave SavePoint
+sword_3-1.gat mapflag nosave SavePoint
+//job_thief1.gat mapflag nosave SavePoint
+// 2-1
+job_hunte.gat mapflag nosave SavePoint
+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
+//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
+
+// 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
+
+//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
+
+//gon_test.gat mapflag nosave prontera.gat,150,180
diff --git a/conf-tmpl/mapflag/type/noteleport.txt b/conf-tmpl/mapflag/type/noteleport.txt
index 88d35e18b..bd6f6d8fa 100644
--- a/conf-tmpl/mapflag/type/noteleport.txt
+++ b/conf-tmpl/mapflag/type/noteleport.txt
@@ -1,184 +1,184 @@
-//===== eAthena Script =======================================
-//= Map flags that disable use of fly/butterfly wings
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-// Cities ===============>\\
-alb_ship.gat mapflag noteleport
-alberta_in.gat mapflag noteleport
-aldeba_in.gat mapflag noteleport
-ama_in01.gat mapflag noteleport
-ama_in02.gat mapflag noteleport
-cmd_in01.gat mapflag noteleport
-cmd_in02.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_1-1.gat mapflag noteleport
-new_1-2.gat mapflag noteleport
-new_1-3.gat mapflag noteleport
-new_1-4.gat mapflag noteleport
-nif_in.gat mapflag noteleport
-payon_in01.gat mapflag noteleport
-payon_in02.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_in03.gat mapflag noteleport
-yuno_in04.gat mapflag noteleport
-yuno_in05.gat mapflag noteleport
-
-// Job Quests =========================
-sword_1-1.gat mapflag noteleport
-sword_2-1.gat mapflag noteleport
-sword_3-1.gat mapflag noteleport
-job_thief1.gat mapflag noteleport
-// 2-1 -----------------------
-job_hunte.gat mapflag noteleport
-job_knight.gat mapflag noteleport
-job_prist.gat mapflag noteleport
-job_wiz.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
-
-// 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
-
-// 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/butterfly wings
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+
+// Cities ===============>\\
+alb_ship.gat mapflag noteleport
+alberta_in.gat mapflag noteleport
+aldeba_in.gat mapflag noteleport
+ama_in01.gat mapflag noteleport
+ama_in02.gat mapflag noteleport
+cmd_in01.gat mapflag noteleport
+cmd_in02.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_1-1.gat mapflag noteleport
+new_1-2.gat mapflag noteleport
+new_1-3.gat mapflag noteleport
+new_1-4.gat mapflag noteleport
+nif_in.gat mapflag noteleport
+payon_in01.gat mapflag noteleport
+payon_in02.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_in03.gat mapflag noteleport
+yuno_in04.gat mapflag noteleport
+yuno_in05.gat mapflag noteleport
+
+// Job Quests =========================
+sword_1-1.gat mapflag noteleport
+sword_2-1.gat mapflag noteleport
+sword_3-1.gat mapflag noteleport
+job_thief1.gat mapflag noteleport
+// 2-1 -----------------------
+job_hunte.gat mapflag noteleport
+job_knight.gat mapflag noteleport
+job_prist.gat mapflag noteleport
+job_wiz.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
+
+// 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
+
+// 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/type/nowarp.txt b/conf-tmpl/mapflag/type/nowarp.txt
index c834d5a71..f719b03d3 100644
--- a/conf-tmpl/mapflag/type/nowarp.txt
+++ b/conf-tmpl/mapflag/type/nowarp.txt
@@ -1,19 +1,19 @@
-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
+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
diff --git a/conf-tmpl/mapflag/type/nowarpto.txt b/conf-tmpl/mapflag/type/nowarpto.txt
index 9658a66a6..641442759 100644
--- a/conf-tmpl/mapflag/type/nowarpto.txt
+++ b/conf-tmpl/mapflag/type/nowarpto.txt
@@ -1,30 +1,30 @@
-//===== eAthena Script =======================================
-//= Map flags that disable warpto
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== 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
+//===== eAthena Script =======================================
+//= Map flags that disable warpto
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== 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
diff --git a/conf-tmpl/mapflag/type/pvp.txt b/conf-tmpl/mapflag/type/pvp.txt
index 461a30f41..ccdd1856d 100644
--- a/conf-tmpl/mapflag/type/pvp.txt
+++ b/conf-tmpl/mapflag/type/pvp.txt
@@ -1,89 +1,89 @@
-//===== eAthena Script =======================================
-//= Map flags that enable pvp
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-
-// 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: =====================================
+
+
+// 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/type/pvp_noparty.txt b/conf-tmpl/mapflag/type/pvp_noparty.txt
index 1591badeb..6e6bff300 100644
--- a/conf-tmpl/mapflag/type/pvp_noparty.txt
+++ b/conf-tmpl/mapflag/type/pvp_noparty.txt
@@ -1,35 +1,35 @@
-//===== eAthena Script =======================================
-//= Map flags that disables attacking a party member
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-
-
-// Guild Castles ================
-aldeg_cas01.gat mapflag pvp_noparty
-aldeg_cas02.gat mapflag pvp_noparty
-aldeg_cas03.gat mapflag pvp_noparty
-aldeg_cas04.gat mapflag pvp_noparty
-aldeg_cas05.gat mapflag pvp_noparty
-gefg_cas01.gat mapflag pvp_noparty
-gefg_cas02.gat mapflag pvp_noparty
-gefg_cas03.gat mapflag pvp_noparty
-gefg_cas04.gat mapflag pvp_noparty
-gefg_cas05.gat mapflag pvp_noparty
-payg_cas01.gat mapflag pvp_noparty
-payg_cas02.gat mapflag pvp_noparty
-payg_cas03.gat mapflag pvp_noparty
-payg_cas04.gat mapflag pvp_noparty
-payg_cas05.gat mapflag pvp_noparty
-prtg_cas01.gat mapflag pvp_noparty
-prtg_cas02.gat mapflag pvp_noparty
-prtg_cas03.gat mapflag pvp_noparty
-prtg_cas04.gat mapflag pvp_noparty
-prtg_cas05.gat mapflag pvp_noparty
-
-// 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
+//===== eAthena Script =======================================
+//= Map flags that disables attacking a party member
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+
+
+// Guild Castles ================
+aldeg_cas01.gat mapflag pvp_noparty
+aldeg_cas02.gat mapflag pvp_noparty
+aldeg_cas03.gat mapflag pvp_noparty
+aldeg_cas04.gat mapflag pvp_noparty
+aldeg_cas05.gat mapflag pvp_noparty
+gefg_cas01.gat mapflag pvp_noparty
+gefg_cas02.gat mapflag pvp_noparty
+gefg_cas03.gat mapflag pvp_noparty
+gefg_cas04.gat mapflag pvp_noparty
+gefg_cas05.gat mapflag pvp_noparty
+payg_cas01.gat mapflag pvp_noparty
+payg_cas02.gat mapflag pvp_noparty
+payg_cas03.gat mapflag pvp_noparty
+payg_cas04.gat mapflag pvp_noparty
+payg_cas05.gat mapflag pvp_noparty
+prtg_cas01.gat mapflag pvp_noparty
+prtg_cas02.gat mapflag pvp_noparty
+prtg_cas03.gat mapflag pvp_noparty
+prtg_cas04.gat mapflag pvp_noparty
+prtg_cas05.gat mapflag pvp_noparty
+
+// 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 \ No newline at end of file
diff --git a/conf-tmpl/mapflag/water.txt b/conf-tmpl/mapflag/water.txt
index 1aa59dac1..71f98470d 100644
--- a/conf-tmpl/mapflag/water.txt
+++ b/conf-tmpl/mapflag/water.txt
@@ -1,54 +1,54 @@
-// …‚ÌÝ’èB
-// water‚Í…‚ ‚è‚Åall_water‚Í‘S‚Ä…‚¾‚Æ”»’f‚·‚éƒ}ƒbƒvB
-
-mjolnir_12.gat mapflag water
-mjolnir_02.gat mapflag water
-glast_01.gat mapflag water
-gef_fild04.gat mapflag water
-prt_fild02.gat mapflag water
-prt_fild01.gat mapflag water
-prt_fild00.gat mapflag water
-gef_fild00.gat mapflag water
-gef_fild07.gat mapflag water
-gef_fild13.gat mapflag water
-gef_fild09.gat mapflag water
-gef_fild01.gat mapflag water
-prt_fild05.gat mapflag water
-gef_fild03.gat mapflag water
-gef_fild10.gat mapflag water
-prt_fild10.gat mapflag water
-pay_arche.gat mapflag water
-moc_ruins.gat mapflag water
-comodo.gat mapflag water
-cmd_fild01.gat mapflag water
-cmd_fild02.gat mapflag water
-cmd_fild03.gat mapflag water
-cmd_fild04.gat mapflag water
-cmd_fild05.gat mapflag water
-moc_fild11.gat mapflag water
-ama_fild01.gat mapflag water
-
-iz_dun00.gat mapflag water
-iz_dun01.gat mapflag water
-iz_dun02.gat mapflag water
-//iz_dun03.gat mapflag all_water
-//iz_dun04.gat mapflag all_water
-treasure01.gat mapflag water
-treasure02.gat mapflag water
-mjo_dun01.gat mapflag water
-orcsdun02.gat mapflag water
-pay_dun01.gat mapflag water
-pay_dun02.gat mapflag water
-pay_dun03.gat mapflag water
-prt_sewb2.gat mapflag water
-prt_sewb3.gat mapflag water
-gl_prison1.gat mapflag water
-alde_dun03.gat mapflag water
-alde_dun04.gat mapflag water
-beach_dun.gat mapflag water
-beach_dun2.gat mapflag water
-beach_dun3.gat mapflag water
-tur_dun01.gat mapflag water
-gld_dun02.gat mapflag water
-gld_dun03.gat mapflag water
-gld_dun04.gat mapflag water
+// …‚ÌÝ’èB
+// water‚Í…‚ ‚è‚Åall_water‚Í‘S‚Ä…‚¾‚Æ”»’f‚·‚éƒ}ƒbƒvB
+
+mjolnir_12.gat mapflag water
+mjolnir_02.gat mapflag water
+glast_01.gat mapflag water
+gef_fild04.gat mapflag water
+prt_fild02.gat mapflag water
+prt_fild01.gat mapflag water
+prt_fild00.gat mapflag water
+gef_fild00.gat mapflag water
+gef_fild07.gat mapflag water
+gef_fild13.gat mapflag water
+gef_fild09.gat mapflag water
+gef_fild01.gat mapflag water
+prt_fild05.gat mapflag water
+gef_fild03.gat mapflag water
+gef_fild10.gat mapflag water
+prt_fild10.gat mapflag water
+pay_arche.gat mapflag water
+moc_ruins.gat mapflag water
+comodo.gat mapflag water
+cmd_fild01.gat mapflag water
+cmd_fild02.gat mapflag water
+cmd_fild03.gat mapflag water
+cmd_fild04.gat mapflag water
+cmd_fild05.gat mapflag water
+moc_fild11.gat mapflag water
+ama_fild01.gat mapflag water
+
+iz_dun00.gat mapflag water
+iz_dun01.gat mapflag water
+iz_dun02.gat mapflag water
+//iz_dun03.gat mapflag all_water
+//iz_dun04.gat mapflag all_water
+treasure01.gat mapflag water
+treasure02.gat mapflag water
+mjo_dun01.gat mapflag water
+orcsdun02.gat mapflag water
+pay_dun01.gat mapflag water
+pay_dun02.gat mapflag water
+pay_dun03.gat mapflag water
+prt_sewb2.gat mapflag water
+prt_sewb3.gat mapflag water
+gl_prison1.gat mapflag water
+alde_dun03.gat mapflag water
+alde_dun04.gat mapflag water
+beach_dun.gat mapflag water
+beach_dun2.gat mapflag water
+beach_dun3.gat mapflag water
+tur_dun01.gat mapflag water
+gld_dun02.gat mapflag water
+gld_dun03.gat mapflag water
+gld_dun04.gat mapflag water
diff --git a/conf-tmpl/mapflag/water_height.txt b/conf-tmpl/mapflag/water_height.txt
index f295e65a0..9a89e29c0 100644
--- a/conf-tmpl/mapflag/water_height.txt
+++ b/conf-tmpl/mapflag/water_height.txt
@@ -1,68 +1,68 @@
-// …ê‚Ì‚‚³‚ðÝ’è
-//water_height.txt—AthenaDBŒv‰æ 2004/03/31 18:52:09 +0900 (JST)
-
-xmas.gat 3
-mjolnir_01.gat 0
-mjolnir_02.gat -19
-mjolnir_12.gat 15
-prt_fild00.gat 11
-prt_fild01.gat 25
-prt_fild02.gat 42
-prt_fild04.gat 14
-prt_fild05.gat 14
-prt_fild10.gat 40
-gef_fild00.gat 10
-gef_fild01.gat 14
-gef_fild03.gat 82
-gef_fild04.gat 14
-gef_fild07.gat 19
-gef_fild09.gat 11
-gef_fild10.gat 24
-moc_fild01.gat 26
-moc_fild11.gat 9
-iz_dun00.gat 5
-iz_dun01.gat 5
-iz_dun02.gat -58
-mjo_dun01.gat 7
-orcsdun02.gat 3
-pay_dun01.gat 8
-pay_dun02.gat 5
-pay_dun03.gat 10
-prt_sewb2.gat 5
-prt_sewb3.gat 5
-treasure01.gat -4
-treasure02.gat -1
-moc_ruins.gat 6
-pay_arche.gat 8
-glast_01.gat 8
-alde_dun03.gat 2
-alde_dun04.gat 0
-gl_prison1.gat 35
-gl_sew01.gat 56
-gl_sew02.gat 12
-gl_sew03.gat 15
-gl_sew04.gat 70
-comodo.gat 14
-cmd_fild01.gat 46
-cmd_fild02.gat 4
-cmd_fild03.gat 0
-cmd_fild04.gat 4
-cmd_fild05.gat 46
-beach_dun2.gat 6
-beach_dun3.gat 0
-beach_dun.gat 9
-gef_fild13.gat 19
-gld_dun02.gat 5
-gld_dun03.gat 14
-gld_dun04.gat 3
-aldeg_cas01.gat 40
-aldeg_cas02.gat 35
-aldeg_cas03.gat 16
-aldeg_cas04.gat 31
-aldeg_cas05.gat 25
-gefg_cas02.gat 8
-gefg_cas04.gat 15
-gefg_cas05.gat 5
-prtg_cas05.gat 13
-tur_dun01.gat -65
-ama_fild01.gat 5
+// …ê‚Ì‚‚³‚ðÝ’è
+//water_height.txt—AthenaDBŒv‰æ 2004/03/31 18:52:09 +0900 (JST)
+
+xmas.gat 3
+mjolnir_01.gat 0
+mjolnir_02.gat -19
+mjolnir_12.gat 15
+prt_fild00.gat 11
+prt_fild01.gat 25
+prt_fild02.gat 42
+prt_fild04.gat 14
+prt_fild05.gat 14
+prt_fild10.gat 40
+gef_fild00.gat 10
+gef_fild01.gat 14
+gef_fild03.gat 82
+gef_fild04.gat 14
+gef_fild07.gat 19
+gef_fild09.gat 11
+gef_fild10.gat 24
+moc_fild01.gat 26
+moc_fild11.gat 9
+iz_dun00.gat 5
+iz_dun01.gat 5
+iz_dun02.gat -58
+mjo_dun01.gat 7
+orcsdun02.gat 3
+pay_dun01.gat 8
+pay_dun02.gat 5
+pay_dun03.gat 10
+prt_sewb2.gat 5
+prt_sewb3.gat 5
+treasure01.gat -4
+treasure02.gat -1
+moc_ruins.gat 6
+pay_arche.gat 8
+glast_01.gat 8
+alde_dun03.gat 2
+alde_dun04.gat 0
+gl_prison1.gat 35
+gl_sew01.gat 56
+gl_sew02.gat 12
+gl_sew03.gat 15
+gl_sew04.gat 70
+comodo.gat 14
+cmd_fild01.gat 46
+cmd_fild02.gat 4
+cmd_fild03.gat 0
+cmd_fild04.gat 4
+cmd_fild05.gat 46
+beach_dun2.gat 6
+beach_dun3.gat 0
+beach_dun.gat 9
+gef_fild13.gat 19
+gld_dun02.gat 5
+gld_dun03.gat 14
+gld_dun04.gat 3
+aldeg_cas01.gat 40
+aldeg_cas02.gat 35
+aldeg_cas03.gat 16
+aldeg_cas04.gat 31
+aldeg_cas05.gat 25
+gefg_cas02.gat 8
+gefg_cas04.gat 15
+gefg_cas05.gat 5
+prtg_cas05.gat 13
+tur_dun01.gat -65
+ama_fild01.gat 5
diff --git a/conf-tmpl/msg_athena.conf b/conf-tmpl/msg_athena.conf
index 20535b2fd..a485c4d1f 100644
--- a/conf-tmpl/msg_athena.conf
+++ b/conf-tmpl/msg_athena.conf
@@ -1,512 +1,512 @@
-// eAthena msg_athena.conf
-// Message Configuration
-// For translation, just change msg here (second line), no need to modify source code.
-// Format:
-// // English message
-// msg_number: translated message
-
-// 0-499: reserved for GM commands
-// 500-999 reserved for others
-
-// Messages of GM commands
-// -----------------------
-
-//0: Warped.
-0: Warped.
-//1: Map not found.
-1: Map not found.
-//2: Coordinates out of range.
-2: Coordinates out of range.
-//3: Character not found.
-3: Character not found.
-//4: Jump to %s
-4: Jump to %s
-//5: Jump to %d %d
-5: Jump to %d %d
-//6: Character data respawn point saved.
-6: Character data respawn point saved.
-//7: Warping to respawn point.
-7: Warping to respawn point.
-//8: Speed changed.
-8: Speed changed.
-//9: Options changed.
-9: Options changed.
-//10: Invisible: Off
-10: Invisible: Off
-//11: Invisible: On
-11: Invisible: On
-//12: Your job has been changed.
-12: Your job has been changed.
-//13: A pity! You've died.
-13: A pity! You've died.
-//14: Character killed.
-14: Character killed.
-//15: Player warped (message sends to player too).
-15: Player warped (message sends to player too).
-//16: You've been revived! It's a miracle!
-16: You've been revived! It's a miracle!
-//17: HP, SP recovered.
-17: HP, SP recovered.
-//18: Item created.
-18: Item created.
-//19: Invalid item ID or name.
-19: Invalid item ID or name.
-//20: All of your items have been removed.
-20: All of your items have been removed.
-//21: Base level raised.
-21: Base level raised.
-//22: Base level lowered.
-22: Base level lowered.
-//23: Job level can't go any higher.
-23: Job level can't go any higher.
-//24: Job level raised.
-24: Job level raised.
-//25: Job level lowered.
-25: Job level lowered.
-//26: Help commands:
-26: Help commands:
-//27: File help.txt not found.
-27: File help.txt not found.
-//28: No player found.
-28: No player found.
-//29: 1 player found.
-29: 1 player found.
-//30: %d players found.
-30: %d players found.
-//31: PvP: Off.
-31: PvP: Off.
-//32: PvP: On.
-32: PvP: On.
-//33: GvG: Off.
-33: GvG: Off.
-//34: GvG: On.
-34: GvG: On.
-//35: You can't use this command with this class.
-35: You can't use this command with this class.
-//36: Appearence changed.
-36: Appearence changed.
-//37: An invalid number was specified.
-37: An invalid number was specified.
-//38: Invalid location number or name.
-38: Invalid location number or name.
-//39: All monster summoned!
-39: All monster summoned!
-//40: Invalid monster ID or name.
-40: Invalid monster ID or name.
-//41: Impossible to decrease the number/value.
-41: Impossible to decrease the number/value.
-//42: Stat changed.
-42: Stat changed.
-//43: You're not in a guild.
-43: You're not in a guild.
-//44: You're not the master of your guild.
-44: You're not the master of your guild.
-//45: Guild level change failed.
-45: Guild level change failed.
-//46: %s recalled!
-46: %s recalled!
-//47: Base level can't go any higher.
-47: Base level can't go any higher.
-//48: Character's job changed.
-48: Character's job changed.
-//49: Invalid job ID.
-49: Invalid job ID.
-//50: You already have some GM powers.
-50: You already have some GM powers.
-//51: Character revived.
-51: Character revived.
-//52: This option cannot be used in PK Mode.
-52: This option cannot be used in PK Mode.
-//53: '%s' stats:
-53: '%s' stats:
-//54: No player found in map '%s'.
-54: No player found in map '%s'.
-//55: 1 player found in map '%s'.
-55: 1 player found in map '%s'.
-//56: %d players found in map '%s'.
-56: %d players found in map '%s'.
-//57: Character's respawn point changed.
-57: Character's respawn point changed.
-//58: Character's options changed.
-58: Character's options changed.
-//59: Night has fallen.
-59: Night has fallen.
-//60: Day has arrived.
-60: Day has arrived.
-//61: The holy messenger has given judgement.
-61: The holy messenger has given judgement.
-//62: Judgement was made.
-62: Judgement was made.
-//63: Mercy has been shown.
-63: Mercy has been shown.
-//64: Mercy has been granted.
-64: Mercy has been granted.
-//65: Character's base level raised.
-65: Character's base level raised.
-//66: Character's base level lowered.
-66: Character's base level lowered.
-//67: Character's job level can't go any higher.
-67: Character's job level can't go any higher.
-//68: character's job level raised.
-68: character's job level raised.
-//69: Character's job level lowered.
-69: Character's job level lowered.
-//70: You have learned the skill.
-70: You have learned the skill.
-//71: You have forgotten the skill.
-71: You have forgotten the skill.
-//72: Guild siege warfare start!
-72: Guild siege warfare start!
-//73: Already it has started siege warfare.
-73: Already it has started siege warfare.
-//74: Guild siege warfare end!
-74: Guild siege warfare end!
-//75: Siege warfare hasn't started yet.
-75: Siege warfare hasn't started yet.
-//76: You have received all skills.
-76: You have received all skills.
-//77: The reference result of '%s' (name: id):
-77: The reference result of '%s' (name: id):
-//78: %s: %d
-78: %s: %d
-//79: It is %d affair above.
-79: It is %d affair above.
-//80: Give a display name and monster name/id please.
-80: Give a display name and monster name/id please.
-//81: Your GM level don't authorise you to do this action on this player.
-81: Your GM level don't authorise you to do this action on this player.
-//82: Please, use one of this number/name:
-82: Please, use one of this number/name:
-//83: Cannot spawn emperium.
-83: Cannot spawn emperium.
-//84: All stats changed!
-84: All stats changed!
-//85: Invalid time for ban command.
-85: Invalid time for ban command.
-//86: Sorry, but a player name have at least 4 characters.
-86: Sorry, but a player name have at least 4 characters.
-//87: Sorry, but a player name have 23 characters maximum.
-87: Sorry, but a player name have 23 characters maximum.
-//88: Character name sends to char-server to ask it.
-88: Character name sends to char-server to ask it.
-//89: Sorry, it's already the night. Impossible to execute the command.
-89: Sorry, it's already the night. Impossible to execute the command.
-//90: Sorry, it's already the day. 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.
-91: Character's base level can't go any higher.
-//92: All characters recalled!
-92: All characters recalled!
-//93: All online characters of the %s guild are near you.
-93: All online characters of the %s guild are near you.
-//94: Incorrect name/ID, or no one from the guild is online.
-94: Incorrect name/ID, or no one from the guild is online.
-//95: All online characters of the %s party are near you.
-95: All online characters of the %s party are near you.
-//96: Incorrect name or ID, or no one from the party is online.
-96: Incorrect name or ID, or no one from the party is online.
-//97: Item database reloaded.
-97: Item database reloaded.
-//98: Monster database reloaded.
-98: Monster database reloaded.
-//99: Skill database reloaded.
-99: Skill database reloaded.
-//100: Scripts reloaded.
-100: Scripts reloaded.
-//101: Login-server asked to reload GM accounts and their level.
-101: Login-server asked to reload GM accounts and their level.
-//102: Mounted Peco.
-102: Mounted Peco.
-//103: No longer spying on the %s guild.
-103: No longer spying on the %s guild.
-//104: Spying on the %s guild.
-104: Spying on the %s guild.
-//105: No longer spying on the %s party.
-105: No longer spying on the %s party.
-//106: Spying on the %s party.
-106: Spying on the %s party.
-//107: All items have been repaired.
-107: All items have been repaired.
-//108: No item need to be repaired.
-108: No item need to be repaired.
-//109: Player has been nuked!
-109: Player has been nuked!
-//110: Npc Enabled.
-110: Npc Enabled.
-//111: This NPC doesn't exist.
-111: This NPC doesn't exist.
-//112: Npc Disabled.
-112: Npc Disabled.
-//113: %d item(s) removed by a GM.
-113: %d item(s) removed by a GM.
-//114: %d item(s) removed from the player.
-114: %d item(s) removed from the player.
-//115: %d item(s) removed. Player had only %d on %d items.
-115: %d item(s) removed. Player had only %d on %d items.
-//116: Character does not have the item.
-116: Character does not have the item.
-//117: GM has send you in jails.
-117: GM has send you in jails.
-//118: Player warped in jails.
-118: Player warped in jails.
-//119: This player is not in jails.
-119: This player is not in jails.
-//120: GM has discharge you.
-120: GM has discharge you.
-//121: Player warped to Prontera.
-121: Player warped to Prontera.
-//122: Disguise applied.
-122: Disguise applied.
-//123: Monster/NPC name/id hasn't been found.
-123: Monster/NPC name/id hasn't been found.
-//124: Undisguise applied.
-124: Undisguise applied.
-//125: You're not disguised.
-125: You're not disguised.
-//126: You accept any wisp (no wisper is refused).
-126: You accept any wisp (no wisper is refused).
-//127: You accept any wisp, except thoses from %d player(s):
-127: You accept any wisp, except thoses from %d player(s):
-//128: You refuse all wisps (no specifical wisper is refused).
-128: You refuse all wisps (no specifical wisper is refused).
-//129: You refuse all wisps, AND refuse wisps from %d player(s):
-129: You refuse all wisps, AND refuse wisps from %d player(s):
-//130: '%s' accept any wisp (no wisper is refused).
-130: '%s' accept any wisp (no wisper is refused).
-//131: '%s' accept any wisp, except thoses from %d player(s):
-131: '%s' accept any wisp, except thoses from %d player(s):
-//132: '%s' refuse all wisps (no specifical wisper is refused).
-132: '%s' refuse all wisps (no specifical wisper is refused).
-//133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
-133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
-//134: '%s' already accepts all wispers.
-134: '%s' already accepts all wispers.
-//135: '%s' now accepts all wispers.
-135: '%s' now accepts all wispers.
-//136: A GM has authorised all wispers for you.
-136: A GM has authorised all wispers for you.
-//137: '%s' already blocks all wispers.
-137: '%s' already blocks all wispers.
-//138: '%s' blocks now all wispers.
-138: '%s' blocks now all wispers.
-//139: A GM has blocked all wispers for you.
-139: A GM has blocked all wispers for you.
-//140: Character's disguise applied.
-140: Character's disguise applied.
-//141: Character's undisguise applied.
-141: Character's undisguise applied.
-//142: Character is not disguised.
-142: Character is not disguised.
-//143: Give a monster name/id please.
-143: Give a monster name/id please.
-//144: Invalid actual email. If you have default e-mail, type a@a.com.
-144: Invalid actual email. If you have default e-mail, type a@a.com.
-//145: Invalid new email. Please enter a real e-mail.
-145: Invalid new email. Please enter a real e-mail.
-//146: New email must be a real e-mail.
-146: New email must be a real e-mail.
-//147: New email must be different of the actual e-mail.
-147: New email must be different of the actual e-mail.
-//148: Information sended to login-server via char-server.
-148: Information sended to login-server via char-server.
-//149: Impossible to increase the number/value.
-149: Impossible to increase the number/value.
-//150: No GM found.
-150: No GM found.
-//151: 1 GM found.
-151: 1 GM found.
-//152: %d GMs found.
-152: %d GMs found.
-//153: %s is Unknown Command.
-153: %s is Unknown Command.
-//154: %s failed.
-154: %s failed.
-//155: Impossible to change your job.
-155: Impossible to change your job.
-//156: HP or/and SP modified.
-156: HP or/and SP modified.
-//157: HP and SP are already with the good value.
-157: HP and SP are already with the good value.
-//158: Base level can't go any lower.
-158: Base level can't go any lower.
-//159: Job level can't go any lower.
-159: Job level can't go any lower.
-//160: PvP is already Off.
-160: PvP is already Off.
-//161: PvP is already On.
-161: PvP is already On.
-//162: GvG is already Off.
-162: GvG is already Off.
-//163: GvG is already On.
-163: GvG is already On.
-//164: Your memo point #%d doesn't exist.
-164: Your memo point #%d doesn't exist.
-//165: All monsters killed!
-165: All monsters killed!
-//166: No item has been refined!
-166: No item has been refined!
-//167: 1 item has been refined!
-167: 1 item has been refined!
-//168: %d items have been refined!
-168: %d items have been refined!
-//169: This item (%d: '%s') is not an equipment.
-169: This item (%d: '%s') is not an equipment.
-//170: This item is not an equipment.
-170: This item is not an equipment.
-//171: %d - void
-171: %d - void
-//172: You replace previous memo position %d - %s (%d,%d).
-172: You replace previous memo position %d - %s (%d,%d).
-//173: Note: you don't have the 'Warp' skill level to use it.
-173: Note: you don't have the 'Warp' skill level to use it.
-//174: Number of status points changed!
-174: Number of status points changed!
-//175: Number of skill points changed!
-175: Number of skill points changed!
-//176: Number of zenys changed!
-176: Number of zenys changed!
-//177: Impossible to decrease a stat.
-177: Impossible to decrease a stat.
-//178: Impossible to increase a stat.
-178: Impossible to increase a stat.
-//179: Guild level changed.
-179: Guild level changed.
-//180: The monter/egg name/id doesn't exist.
-180: The monter/egg name/id doesn't exist.
-//181: You already have a pet.
-181: You already have a pet.
-//182: Pet friendly value changed!
-182: Pet friendly value changed!
-//183: Pet friendly is already the good value.
-183: Pet friendly is already the good value.
-//184: Sorry, but you have no pet.
-184: Sorry, but you have no pet.
-//185: Pet hungry value changed!
-185: Pet hungry value changed!
-//186: Pet hungry is already the good value.
-186: Pet hungry is already the good value.
-//187: You can now rename your pet.
-187: You can now rename your pet.
-//188: You can already rename your pet.
-188: You can already rename your pet.
-//189: This player can now rename his/her pet.
-189: This player can now rename his/her pet.
-//190: This player can already rename his/her pet.
-190: This player can already rename his/her pet.
-//191: Sorry, but this player has no pet.
-191: Sorry, but this player has no pet.
-//192: Impossible to change the character's job.
-192: Impossible to change the character's job.
-//193: Character's base level can't go any lower.
-193: Character's base level can't go any lower.
-//194: Character's job level can't go any lower.
-194: Character's job level can't go any lower.
-//195: All players have been kicked!
-195: All players have been kicked!
-//196: You already have this quest skill.
-196: You already have this quest skill.
-//197: This skill number doesn't exist or isn't a quest skill.
-197: This skill number doesn't exist or isn't a quest skill.
-//198: This skill number doesn't exist.
-198: This skill number doesn't exist.
-//199: This player has learned the skill.
-199: This player has learned the skill.
-//200: This player already has this quest skill.
-200: This player already has this quest skill.
-//201: You don't have this quest skill.
-201: You don't have this quest skill.
-//202: This player has forgotten the skill.
-202: This player has forgotten the skill.
-//203: This player doesn't have this quest skill.
-203: This player doesn't have this quest skill.
-//204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-//205: You already have this number of spiritballs.
-205: You already have this number of spiritballs.
-//206: '%s' skill points reseted!
-206: '%s' skill points reseted!
-//207: '%s' stats points reseted!
-207: '%s' stats points reseted!
-//208: '%s' skill and stats points reseted!
-208: '%s' skill and stats points reseted!
-//209: Character's number of skill points changed!
-209: Character's number of skill points changed!
-//210: Character's number of status points changed!
-210: Character's number of status points changed!
-//211: Character's number of zenys changed!
-211: Character's number of zenys changed!
-//212: Cannot mount a Peco while in disguise.
-212: Cannot mount a Peco while in disguise.
-//213: You can not mount a peco with your job.
-213: You can not mount a peco with your job.
-//214: Unmounted Peco.
-214: Unmounted Peco.
-//215: This player cannot mount a Peco while in disguise.
-215: This player cannot mount a Peco while in disguise.
-//216: Now, this player mounts a peco.
-216: Now, this player mounts a peco.
-//217: This player can not mount a peco with his/her job.
-217: This player can not mount a peco with his/her job.
-//218: Now, this player has not more peco.
-218: Now, this player has not more peco.
-//219: %d day
-219: %d day
-//220: %d days
-220: %d days
-//221: %s %d hour
-221: %s %d hour
-//222: %s %d hours
-222: %s %d hours
-//223: %s %d minute
-223: %s %d minute
-//224: %s %d minutes
-224: %s %d minutes
-//225: %s and %d second
-225: %s and %d second
-//226: %s and %d seconds
-226: %s and %d seconds
-//227: Cannot wear disguise while riding a Peco.
-227: Cannot wear disguise while riding a Peco.
-//228: Character cannot wear disguise while riding a Peco.
-228: Character cannot wear disguise while riding a Peco.
-//229: Your Effect Has Changed.
-229: Your Effect Has Changed.
-//230: Server time (normal time): %A, %B %d %Y %X.
-230: Server time (normal time): %A, %B %d %Y %X.
-//231: Game time: The game is in permanent daylight.
-231: Game time: The game is in permanent daylight.
-//232: Game time: The game is in permanent night.
-232: Game time: The game is in permanent night.
-//233: Game time: The game is actualy in night for %s.
-233: Game time: The game is actualy in night for %s.
-//234: Game time: After, the game will be in permanent daylight.
-234: Game time: After, the game will be in permanent daylight.
-//235: Game time: The game is actualy in daylight for %s.
-235: Game time: The game is actualy in daylight for %s.
-//236: Game time: After, the game will be in permanent night.
-236: Game time: After, the game will be in permanent night.
-//237: Game time: After, the game will be in night for %s.
-237: Game time: After, the game will be in night for %s.
-//238: Game time: A day cycle has a normal duration of %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.
-239: Game time: After, the game will be in daylight for %s.
-//240: %d monster(s) summoned!
-240: %d monster(s) summoned!
-241: you be a killa..
-242: you gonna be own3d..
-243: Map skills are off
-244: Map skills are on
-245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
-
-// Messages of others (not for GM commands)
-// ----------------------------------------
-
-//500: Actually, it's the night...
-500: Actually, it's the night...
-//501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-//502: The day has arrived!
-502: The day has arrived!
-//503: The night has fallen...
-503: The night has fallen...
+// eAthena msg_athena.conf
+// Message Configuration
+// For translation, just change msg here (second line), no need to modify source code.
+// Format:
+// // English message
+// msg_number: translated message
+
+// 0-499: reserved for GM commands
+// 500-999 reserved for others
+
+// Messages of GM commands
+// -----------------------
+
+//0: Warped.
+0: Warped.
+//1: Map not found.
+1: Map not found.
+//2: Coordinates out of range.
+2: Coordinates out of range.
+//3: Character not found.
+3: Character not found.
+//4: Jump to %s
+4: Jump to %s
+//5: Jump to %d %d
+5: Jump to %d %d
+//6: Character data respawn point saved.
+6: Character data respawn point saved.
+//7: Warping to respawn point.
+7: Warping to respawn point.
+//8: Speed changed.
+8: Speed changed.
+//9: Options changed.
+9: Options changed.
+//10: Invisible: Off
+10: Invisible: Off
+//11: Invisible: On
+11: Invisible: On
+//12: Your job has been changed.
+12: Your job has been changed.
+//13: A pity! You've died.
+13: A pity! You've died.
+//14: Character killed.
+14: Character killed.
+//15: Player warped (message sends to player too).
+15: Player warped (message sends to player too).
+//16: You've been revived! It's a miracle!
+16: You've been revived! It's a miracle!
+//17: HP, SP recovered.
+17: HP, SP recovered.
+//18: Item created.
+18: Item created.
+//19: Invalid item ID or name.
+19: Invalid item ID or name.
+//20: All of your items have been removed.
+20: All of your items have been removed.
+//21: Base level raised.
+21: Base level raised.
+//22: Base level lowered.
+22: Base level lowered.
+//23: Job level can't go any higher.
+23: Job level can't go any higher.
+//24: Job level raised.
+24: Job level raised.
+//25: Job level lowered.
+25: Job level lowered.
+//26: Help commands:
+26: Help commands:
+//27: File help.txt not found.
+27: File help.txt not found.
+//28: No player found.
+28: No player found.
+//29: 1 player found.
+29: 1 player found.
+//30: %d players found.
+30: %d players found.
+//31: PvP: Off.
+31: PvP: Off.
+//32: PvP: On.
+32: PvP: On.
+//33: GvG: Off.
+33: GvG: Off.
+//34: GvG: On.
+34: GvG: On.
+//35: You can't use this command with this class.
+35: You can't use this command with this class.
+//36: Appearence changed.
+36: Appearence changed.
+//37: An invalid number was specified.
+37: An invalid number was specified.
+//38: Invalid location number or name.
+38: Invalid location number or name.
+//39: All monster summoned!
+39: All monster summoned!
+//40: Invalid monster ID or name.
+40: Invalid monster ID or name.
+//41: Impossible to decrease the number/value.
+41: Impossible to decrease the number/value.
+//42: Stat changed.
+42: Stat changed.
+//43: You're not in a guild.
+43: You're not in a guild.
+//44: You're not the master of your guild.
+44: You're not the master of your guild.
+//45: Guild level change failed.
+45: Guild level change failed.
+//46: %s recalled!
+46: %s recalled!
+//47: Base level can't go any higher.
+47: Base level can't go any higher.
+//48: Character's job changed.
+48: Character's job changed.
+//49: Invalid job ID.
+49: Invalid job ID.
+//50: You already have some GM powers.
+50: You already have some GM powers.
+//51: Character revived.
+51: Character revived.
+//52: This option cannot be used in PK Mode.
+52: This option cannot be used in PK Mode.
+//53: '%s' stats:
+53: '%s' stats:
+//54: No player found in map '%s'.
+54: No player found in map '%s'.
+//55: 1 player found in map '%s'.
+55: 1 player found in map '%s'.
+//56: %d players found in map '%s'.
+56: %d players found in map '%s'.
+//57: Character's respawn point changed.
+57: Character's respawn point changed.
+//58: Character's options changed.
+58: Character's options changed.
+//59: Night has fallen.
+59: Night has fallen.
+//60: Day has arrived.
+60: Day has arrived.
+//61: The holy messenger has given judgement.
+61: The holy messenger has given judgement.
+//62: Judgement was made.
+62: Judgement was made.
+//63: Mercy has been shown.
+63: Mercy has been shown.
+//64: Mercy has been granted.
+64: Mercy has been granted.
+//65: Character's base level raised.
+65: Character's base level raised.
+//66: Character's base level lowered.
+66: Character's base level lowered.
+//67: Character's job level can't go any higher.
+67: Character's job level can't go any higher.
+//68: character's job level raised.
+68: character's job level raised.
+//69: Character's job level lowered.
+69: Character's job level lowered.
+//70: You have learned the skill.
+70: You have learned the skill.
+//71: You have forgotten the skill.
+71: You have forgotten the skill.
+//72: Guild siege warfare start!
+72: Guild siege warfare start!
+//73: Already it has started siege warfare.
+73: Already it has started siege warfare.
+//74: Guild siege warfare end!
+74: Guild siege warfare end!
+//75: Siege warfare hasn't started yet.
+75: Siege warfare hasn't started yet.
+//76: You have received all skills.
+76: You have received all skills.
+//77: The reference result of '%s' (name: id):
+77: The reference result of '%s' (name: id):
+//78: %s: %d
+78: %s: %d
+//79: It is %d affair above.
+79: It is %d affair above.
+//80: Give a display name and monster name/id please.
+80: Give a display name and monster name/id please.
+//81: Your GM level don't authorise you to do this action on this player.
+81: Your GM level don't authorise you to do this action on this player.
+//82: Please, use one of this number/name:
+82: Please, use one of this number/name:
+//83: Cannot spawn emperium.
+83: Cannot spawn emperium.
+//84: All stats changed!
+84: All stats changed!
+//85: Invalid time for ban command.
+85: Invalid time for ban command.
+//86: Sorry, but a player name have at least 4 characters.
+86: Sorry, but a player name have at least 4 characters.
+//87: Sorry, but a player name have 23 characters maximum.
+87: Sorry, but a player name have 23 characters maximum.
+//88: Character name sends to char-server to ask it.
+88: Character name sends to char-server to ask it.
+//89: Sorry, it's already the night. Impossible to execute the command.
+89: Sorry, it's already the night. Impossible to execute the command.
+//90: Sorry, it's already the day. 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.
+91: Character's base level can't go any higher.
+//92: All characters recalled!
+92: All characters recalled!
+//93: All online characters of the %s guild are near you.
+93: All online characters of the %s guild are near you.
+//94: Incorrect name/ID, or no one from the guild is online.
+94: Incorrect name/ID, or no one from the guild is online.
+//95: All online characters of the %s party are near you.
+95: All online characters of the %s party are near you.
+//96: Incorrect name or ID, or no one from the party is online.
+96: Incorrect name or ID, or no one from the party is online.
+//97: Item database reloaded.
+97: Item database reloaded.
+//98: Monster database reloaded.
+98: Monster database reloaded.
+//99: Skill database reloaded.
+99: Skill database reloaded.
+//100: Scripts reloaded.
+100: Scripts reloaded.
+//101: Login-server asked to reload GM accounts and their level.
+101: Login-server asked to reload GM accounts and their level.
+//102: Mounted Peco.
+102: Mounted Peco.
+//103: No longer spying on the %s guild.
+103: No longer spying on the %s guild.
+//104: Spying on the %s guild.
+104: Spying on the %s guild.
+//105: No longer spying on the %s party.
+105: No longer spying on the %s party.
+//106: Spying on the %s party.
+106: Spying on the %s party.
+//107: All items have been repaired.
+107: All items have been repaired.
+//108: No item need to be repaired.
+108: No item need to be repaired.
+//109: Player has been nuked!
+109: Player has been nuked!
+//110: Npc Enabled.
+110: Npc Enabled.
+//111: This NPC doesn't exist.
+111: This NPC doesn't exist.
+//112: Npc Disabled.
+112: Npc Disabled.
+//113: %d item(s) removed by a GM.
+113: %d item(s) removed by a GM.
+//114: %d item(s) removed from the player.
+114: %d item(s) removed from the player.
+//115: %d item(s) removed. Player had only %d on %d items.
+115: %d item(s) removed. Player had only %d on %d items.
+//116: Character does not have the item.
+116: Character does not have the item.
+//117: GM has send you in jails.
+117: GM has send you in jails.
+//118: Player warped in jails.
+118: Player warped in jails.
+//119: This player is not in jails.
+119: This player is not in jails.
+//120: GM has discharge you.
+120: GM has discharge you.
+//121: Player warped to Prontera.
+121: Player warped to Prontera.
+//122: Disguise applied.
+122: Disguise applied.
+//123: Monster/NPC name/id hasn't been found.
+123: Monster/NPC name/id hasn't been found.
+//124: Undisguise applied.
+124: Undisguise applied.
+//125: You're not disguised.
+125: You're not disguised.
+//126: You accept any wisp (no wisper is refused).
+126: You accept any wisp (no wisper is refused).
+//127: You accept any wisp, except thoses from %d player(s):
+127: You accept any wisp, except thoses from %d player(s):
+//128: You refuse all wisps (no specifical wisper is refused).
+128: You refuse all wisps (no specifical wisper is refused).
+//129: You refuse all wisps, AND refuse wisps from %d player(s):
+129: You refuse all wisps, AND refuse wisps from %d player(s):
+//130: '%s' accept any wisp (no wisper is refused).
+130: '%s' accept any wisp (no wisper is refused).
+//131: '%s' accept any wisp, except thoses from %d player(s):
+131: '%s' accept any wisp, except thoses from %d player(s):
+//132: '%s' refuse all wisps (no specifical wisper is refused).
+132: '%s' refuse all wisps (no specifical wisper is refused).
+//133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
+133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
+//134: '%s' already accepts all wispers.
+134: '%s' already accepts all wispers.
+//135: '%s' now accepts all wispers.
+135: '%s' now accepts all wispers.
+//136: A GM has authorised all wispers for you.
+136: A GM has authorised all wispers for you.
+//137: '%s' already blocks all wispers.
+137: '%s' already blocks all wispers.
+//138: '%s' blocks now all wispers.
+138: '%s' blocks now all wispers.
+//139: A GM has blocked all wispers for you.
+139: A GM has blocked all wispers for you.
+//140: Character's disguise applied.
+140: Character's disguise applied.
+//141: Character's undisguise applied.
+141: Character's undisguise applied.
+//142: Character is not disguised.
+142: Character is not disguised.
+//143: Give a monster name/id please.
+143: Give a monster name/id please.
+//144: Invalid actual email. If you have default e-mail, type a@a.com.
+144: Invalid actual email. If you have default e-mail, type a@a.com.
+//145: Invalid new email. Please enter a real e-mail.
+145: Invalid new email. Please enter a real e-mail.
+//146: New email must be a real e-mail.
+146: New email must be a real e-mail.
+//147: New email must be different of the actual e-mail.
+147: New email must be different of the actual e-mail.
+//148: Information sended to login-server via char-server.
+148: Information sended to login-server via char-server.
+//149: Impossible to increase the number/value.
+149: Impossible to increase the number/value.
+//150: No GM found.
+150: No GM found.
+//151: 1 GM found.
+151: 1 GM found.
+//152: %d GMs found.
+152: %d GMs found.
+//153: %s is Unknown Command.
+153: %s is Unknown Command.
+//154: %s failed.
+154: %s failed.
+//155: Impossible to change your job.
+155: Impossible to change your job.
+//156: HP or/and SP modified.
+156: HP or/and SP modified.
+//157: HP and SP are already with the good value.
+157: HP and SP are already with the good value.
+//158: Base level can't go any lower.
+158: Base level can't go any lower.
+//159: Job level can't go any lower.
+159: Job level can't go any lower.
+//160: PvP is already Off.
+160: PvP is already Off.
+//161: PvP is already On.
+161: PvP is already On.
+//162: GvG is already Off.
+162: GvG is already Off.
+//163: GvG is already On.
+163: GvG is already On.
+//164: Your memo point #%d doesn't exist.
+164: Your memo point #%d doesn't exist.
+//165: All monsters killed!
+165: All monsters killed!
+//166: No item has been refined!
+166: No item has been refined!
+//167: 1 item has been refined!
+167: 1 item has been refined!
+//168: %d items have been refined!
+168: %d items have been refined!
+//169: This item (%d: '%s') is not an equipment.
+169: This item (%d: '%s') is not an equipment.
+//170: This item is not an equipment.
+170: This item is not an equipment.
+//171: %d - void
+171: %d - void
+//172: You replace previous memo position %d - %s (%d,%d).
+172: You replace previous memo position %d - %s (%d,%d).
+//173: Note: you don't have the 'Warp' skill level to use it.
+173: Note: you don't have the 'Warp' skill level to use it.
+//174: Number of status points changed!
+174: Number of status points changed!
+//175: Number of skill points changed!
+175: Number of skill points changed!
+//176: Number of zenys changed!
+176: Number of zenys changed!
+//177: Impossible to decrease a stat.
+177: Impossible to decrease a stat.
+//178: Impossible to increase a stat.
+178: Impossible to increase a stat.
+//179: Guild level changed.
+179: Guild level changed.
+//180: The monter/egg name/id doesn't exist.
+180: The monter/egg name/id doesn't exist.
+//181: You already have a pet.
+181: You already have a pet.
+//182: Pet friendly value changed!
+182: Pet friendly value changed!
+//183: Pet friendly is already the good value.
+183: Pet friendly is already the good value.
+//184: Sorry, but you have no pet.
+184: Sorry, but you have no pet.
+//185: Pet hungry value changed!
+185: Pet hungry value changed!
+//186: Pet hungry is already the good value.
+186: Pet hungry is already the good value.
+//187: You can now rename your pet.
+187: You can now rename your pet.
+//188: You can already rename your pet.
+188: You can already rename your pet.
+//189: This player can now rename his/her pet.
+189: This player can now rename his/her pet.
+//190: This player can already rename his/her pet.
+190: This player can already rename his/her pet.
+//191: Sorry, but this player has no pet.
+191: Sorry, but this player has no pet.
+//192: Impossible to change the character's job.
+192: Impossible to change the character's job.
+//193: Character's base level can't go any lower.
+193: Character's base level can't go any lower.
+//194: Character's job level can't go any lower.
+194: Character's job level can't go any lower.
+//195: All players have been kicked!
+195: All players have been kicked!
+//196: You already have this quest skill.
+196: You already have this quest skill.
+//197: This skill number doesn't exist or isn't a quest skill.
+197: This skill number doesn't exist or isn't a quest skill.
+//198: This skill number doesn't exist.
+198: This skill number doesn't exist.
+//199: This player has learned the skill.
+199: This player has learned the skill.
+//200: This player already has this quest skill.
+200: This player already has this quest skill.
+//201: You don't have this quest skill.
+201: You don't have this quest skill.
+//202: This player has forgotten the skill.
+202: This player has forgotten the skill.
+//203: This player doesn't have this quest skill.
+203: This player doesn't have this quest skill.
+//204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
+204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
+//205: You already have this number of spiritballs.
+205: You already have this number of spiritballs.
+//206: '%s' skill points reseted!
+206: '%s' skill points reseted!
+//207: '%s' stats points reseted!
+207: '%s' stats points reseted!
+//208: '%s' skill and stats points reseted!
+208: '%s' skill and stats points reseted!
+//209: Character's number of skill points changed!
+209: Character's number of skill points changed!
+//210: Character's number of status points changed!
+210: Character's number of status points changed!
+//211: Character's number of zenys changed!
+211: Character's number of zenys changed!
+//212: Cannot mount a Peco while in disguise.
+212: Cannot mount a Peco while in disguise.
+//213: You can not mount a peco with your job.
+213: You can not mount a peco with your job.
+//214: Unmounted Peco.
+214: Unmounted Peco.
+//215: This player cannot mount a Peco while in disguise.
+215: This player cannot mount a Peco while in disguise.
+//216: Now, this player mounts a peco.
+216: Now, this player mounts a peco.
+//217: This player can not mount a peco with his/her job.
+217: This player can not mount a peco with his/her job.
+//218: Now, this player has not more peco.
+218: Now, this player has not more peco.
+//219: %d day
+219: %d day
+//220: %d days
+220: %d days
+//221: %s %d hour
+221: %s %d hour
+//222: %s %d hours
+222: %s %d hours
+//223: %s %d minute
+223: %s %d minute
+//224: %s %d minutes
+224: %s %d minutes
+//225: %s and %d second
+225: %s and %d second
+//226: %s and %d seconds
+226: %s and %d seconds
+//227: Cannot wear disguise while riding a Peco.
+227: Cannot wear disguise while riding a Peco.
+//228: Character cannot wear disguise while riding a Peco.
+228: Character cannot wear disguise while riding a Peco.
+//229: Your Effect Has Changed.
+229: Your Effect Has Changed.
+//230: Server time (normal time): %A, %B %d %Y %X.
+230: Server time (normal time): %A, %B %d %Y %X.
+//231: Game time: The game is in permanent daylight.
+231: Game time: The game is in permanent daylight.
+//232: Game time: The game is in permanent night.
+232: Game time: The game is in permanent night.
+//233: Game time: The game is actualy in night for %s.
+233: Game time: The game is actualy in night for %s.
+//234: Game time: After, the game will be in permanent daylight.
+234: Game time: After, the game will be in permanent daylight.
+//235: Game time: The game is actualy in daylight for %s.
+235: Game time: The game is actualy in daylight for %s.
+//236: Game time: After, the game will be in permanent night.
+236: Game time: After, the game will be in permanent night.
+//237: Game time: After, the game will be in night for %s.
+237: Game time: After, the game will be in night for %s.
+//238: Game time: A day cycle has a normal duration of %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.
+239: Game time: After, the game will be in daylight for %s.
+//240: %d monster(s) summoned!
+240: %d monster(s) summoned!
+241: you be a killa..
+242: you gonna be own3d..
+243: Map skills are off
+244: Map skills are on
+245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds.
+
+// Messages of others (not for GM commands)
+// ----------------------------------------
+
+//500: Actually, it's the night...
+500: Actually, it's the night...
+//501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+501: Your account time limit is: %d-%m-%Y %H:%M:%S.
+//502: The day has arrived!
+502: The day has arrived!
+//503: The night has fallen...
+503: The night has fallen...
diff --git a/conf-tmpl/script_athena.conf b/conf-tmpl/script_athena.conf
index 146870244..21d4a6f45 100644
--- a/conf-tmpl/script_athena.conf
+++ b/conf-tmpl/script_athena.conf
@@ -1,2 +1,2 @@
-// 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
+// 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
diff --git a/conf-tmpl/water_height.txt b/conf-tmpl/water_height.txt
index f295e65a0..9a89e29c0 100644
--- a/conf-tmpl/water_height.txt
+++ b/conf-tmpl/water_height.txt
@@ -1,68 +1,68 @@
-// …ê‚Ì‚‚³‚ðÝ’è
-//water_height.txt—AthenaDBŒv‰æ 2004/03/31 18:52:09 +0900 (JST)
-
-xmas.gat 3
-mjolnir_01.gat 0
-mjolnir_02.gat -19
-mjolnir_12.gat 15
-prt_fild00.gat 11
-prt_fild01.gat 25
-prt_fild02.gat 42
-prt_fild04.gat 14
-prt_fild05.gat 14
-prt_fild10.gat 40
-gef_fild00.gat 10
-gef_fild01.gat 14
-gef_fild03.gat 82
-gef_fild04.gat 14
-gef_fild07.gat 19
-gef_fild09.gat 11
-gef_fild10.gat 24
-moc_fild01.gat 26
-moc_fild11.gat 9
-iz_dun00.gat 5
-iz_dun01.gat 5
-iz_dun02.gat -58
-mjo_dun01.gat 7
-orcsdun02.gat 3
-pay_dun01.gat 8
-pay_dun02.gat 5
-pay_dun03.gat 10
-prt_sewb2.gat 5
-prt_sewb3.gat 5
-treasure01.gat -4
-treasure02.gat -1
-moc_ruins.gat 6
-pay_arche.gat 8
-glast_01.gat 8
-alde_dun03.gat 2
-alde_dun04.gat 0
-gl_prison1.gat 35
-gl_sew01.gat 56
-gl_sew02.gat 12
-gl_sew03.gat 15
-gl_sew04.gat 70
-comodo.gat 14
-cmd_fild01.gat 46
-cmd_fild02.gat 4
-cmd_fild03.gat 0
-cmd_fild04.gat 4
-cmd_fild05.gat 46
-beach_dun2.gat 6
-beach_dun3.gat 0
-beach_dun.gat 9
-gef_fild13.gat 19
-gld_dun02.gat 5
-gld_dun03.gat 14
-gld_dun04.gat 3
-aldeg_cas01.gat 40
-aldeg_cas02.gat 35
-aldeg_cas03.gat 16
-aldeg_cas04.gat 31
-aldeg_cas05.gat 25
-gefg_cas02.gat 8
-gefg_cas04.gat 15
-gefg_cas05.gat 5
-prtg_cas05.gat 13
-tur_dun01.gat -65
-ama_fild01.gat 5
+// …ê‚Ì‚‚³‚ðÝ’è
+//water_height.txt—AthenaDBŒv‰æ 2004/03/31 18:52:09 +0900 (JST)
+
+xmas.gat 3
+mjolnir_01.gat 0
+mjolnir_02.gat -19
+mjolnir_12.gat 15
+prt_fild00.gat 11
+prt_fild01.gat 25
+prt_fild02.gat 42
+prt_fild04.gat 14
+prt_fild05.gat 14
+prt_fild10.gat 40
+gef_fild00.gat 10
+gef_fild01.gat 14
+gef_fild03.gat 82
+gef_fild04.gat 14
+gef_fild07.gat 19
+gef_fild09.gat 11
+gef_fild10.gat 24
+moc_fild01.gat 26
+moc_fild11.gat 9
+iz_dun00.gat 5
+iz_dun01.gat 5
+iz_dun02.gat -58
+mjo_dun01.gat 7
+orcsdun02.gat 3
+pay_dun01.gat 8
+pay_dun02.gat 5
+pay_dun03.gat 10
+prt_sewb2.gat 5
+prt_sewb3.gat 5
+treasure01.gat -4
+treasure02.gat -1
+moc_ruins.gat 6
+pay_arche.gat 8
+glast_01.gat 8
+alde_dun03.gat 2
+alde_dun04.gat 0
+gl_prison1.gat 35
+gl_sew01.gat 56
+gl_sew02.gat 12
+gl_sew03.gat 15
+gl_sew04.gat 70
+comodo.gat 14
+cmd_fild01.gat 46
+cmd_fild02.gat 4
+cmd_fild03.gat 0
+cmd_fild04.gat 4
+cmd_fild05.gat 46
+beach_dun2.gat 6
+beach_dun3.gat 0
+beach_dun.gat 9
+gef_fild13.gat 19
+gld_dun02.gat 5
+gld_dun03.gat 14
+gld_dun04.gat 3
+aldeg_cas01.gat 40
+aldeg_cas02.gat 35
+aldeg_cas03.gat 16
+aldeg_cas04.gat 31
+aldeg_cas05.gat 25
+gefg_cas02.gat 8
+gefg_cas04.gat 15
+gefg_cas05.gat 5
+prtg_cas05.gat 13
+tur_dun01.gat -65
+ama_fild01.gat 5
diff --git a/db/abra_db.txt b/db/abra_db.txt
index a7fc881b7..4ee4f0df7 100644
--- a/db/abra_db.txt
+++ b/db/abra_db.txt
@@ -1,387 +1,387 @@
-//ƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚Ì”­“®ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX
-//
-//‘Ž®:<ID>,<DUMMY>,<REQ_LV>,<PER>
-//
-//ID:ŠY“–ƒXƒLƒ‹ID
-//DUMMY:ƒ_ƒ~[B•ª‚è‚â‚·‚¢–¼‘O‚ðB
-//REQ_LV:ŠY“–ƒXƒLƒ‹‚ª”­“®‚·‚é‚Ì‚É•K—v‚ȃAƒuƒ‰ƒJƒ_ƒuƒ‰‚̃Œƒxƒ‹
-//PER:”­“®—¦(–œ•ª—¦‚Å)B‚½‚¾‚µ‚±‚Ì’l‚ð10000‚É‚µ‚½‚©‚ç‚Æ‚¢‚Á‚Ä100%”­“®‚·‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
-//
-//‘S‘Ì“I‚É‹É’[‚ÉPER‚ð’á‚­‚·‚é‚ÆA”­“®ƒXƒLƒ‹‘I’舗‚ª‘½‚­‚È‚èAŽI‚ªd‚­‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·
-
-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,SP‰ñ•œ—ÍŒüã,1,5000
-10,ƒTƒCƒg,1,5000
-11,ƒiƒp[ƒ€ƒr[ƒg,1,5000
-12,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹,4,5000
-13,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN,2,5000
-14,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg,1,5000
-15,ƒtƒƒXƒgƒ_ƒCƒo[,2,5000
-16,ƒXƒg[ƒ“ƒJ[ƒX,1,5000
-17,ƒtƒ@ƒCƒA[ƒ{[ƒ‹,2,5000
-18,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹,4,5000
-19,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg,1,5000
-20,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg,1,5000
-21,ƒTƒ“ƒ_[ƒXƒg[ƒ€,2,5000
-
-22,ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“,1,0
-23,ƒf[ƒ‚ƒ“ƒxƒCƒ“,1,0
-24,ƒ‹ƒAƒt,1,5000
-25,ƒjƒ…[ƒ},6,5000
-26,ƒeƒŒƒ|[ƒg,2,5000
-27,ƒ[ƒvƒ|[ƒ^ƒ‹,4,5000
-28,ƒq[ƒ‹,1,5000
-29,‘¬“x‘‰Á,2,5000
-30,‘¬“xŒ¸­,4,5000
-31,ƒAƒNƒAƒxƒlƒfƒBƒNƒ^,1,5000
-32,ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX,1,5000
-33,ƒGƒ“ƒWƒFƒ‰ƒX,1,5000
-34,ƒuƒŒƒbƒVƒ“ƒO,2,5000
-35,ƒLƒ…ƒA[,1,5000
-
-36,ŠŽŒÀŠE—Ê‘‰Á,1,0
-37,ƒfƒBƒXƒJƒEƒ“ƒg,1,0
-38,ƒI[ƒo[ƒ`ƒƒ[ƒW,1,0
-39,ƒvƒbƒVƒ…ƒJ[ƒg,1,0
-40,ƒAƒCƒeƒ€ŠÓ’è,1,5000
-41,˜I“XŠJÝ,4,5000
-42,ƒƒ}[ƒiƒCƒg,1,5000
-
-43,‚Ó‚­‚낤‚Ì–Ú,1,0
-44,ƒƒV‚Ì–Ú,1,0
-45,W’†—ÍŒüã,4,5000
-46,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,1,5000
-47,ƒAƒ[ƒVƒƒƒ[,2,5000
-
-48,ƒ_ƒuƒ‹ƒAƒ^ƒbƒN,1,0
-49,‰ñ”𗦑‰Á,1,0
-50,ƒXƒeƒB[ƒ‹,2,5000
-51,ƒnƒCƒfƒBƒ“ƒO,2,5000
-52,ƒCƒ“ƒxƒiƒ€,1,5000,
-53,‰ð“Å,1,5000
-
-54,ƒŠƒUƒŒƒNƒVƒ‡ƒ“,1,5000
-
-55,‘„C—û,1,0
-56,ƒsƒA[ƒX,2,4000
-57,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,6,4000
-58,ƒXƒsƒAƒXƒ^ƒu,1,4000
-59,ƒXƒsƒAƒu[ƒƒ‰ƒ“,4,4000
-60,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“,1,4000
-61,ƒI[ƒgƒJƒEƒ“ƒ^[,2,4000
-62,ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…,6,4000
-63,ƒ‰ƒCƒfƒBƒ“ƒO,1,0
-64,‹R•ºC—û,1,0
-
-65,ƒƒCƒXC—û,1,0
-66,ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX,1,4000
-67,ƒTƒtƒ‰ƒMƒEƒ€,2,4000
-68,ƒAƒXƒyƒ‹ƒVƒI,2,4000
-69,¹‘Ì~•Ÿ,4,4000
-70,ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ,2,4000
-71,ƒXƒ[ƒ|ƒCƒYƒ“,1,4000
-72,ƒŠƒJƒoƒŠ[,1,4000
-73,ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“,2,4000
-74,ƒ}ƒOƒjƒtƒBƒJ[ƒg,2,4000
-75,ƒOƒƒŠƒA,4,4000
-76,ƒŒƒbƒNƒXƒfƒBƒr[ƒi,2,4000
-77,ƒ^[ƒ“ƒAƒ“ƒfƒbƒh,2,4000
-78,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi,4,4000
-79,ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€,6,4000
-
-80,ƒtƒ@ƒCƒA[ƒsƒ‰[,2,4000
-81,ƒTƒCƒgƒ‰ƒbƒVƒƒ[,2,4000
-//82,ƒtƒ@ƒCƒAƒAƒCƒr[,1,0
-83,ƒƒeƒIƒXƒg[ƒ€,6,4000
-84,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[,2,4000
-85,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“,6,4000
-86,ƒEƒH[ƒ^[ƒ{[ƒ‹,4,4000
-87,ƒAƒCƒXƒEƒH[ƒ‹,2,4000
-88,ƒtƒƒXƒgƒmƒ”ƒ@,1,4000
-89,ƒXƒg[ƒ€ƒKƒXƒg,6,4000
-90,ƒA[ƒXƒXƒpƒCƒN,1,4000
-91,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu,2,4000
-92,ƒNƒ@ƒOƒ}ƒCƒA,4,4000
-93,ƒ‚ƒ“ƒXƒ^[î•ñ,1,4000
-
-94,“S»‘¢,1,0
-95,|“S»‘¢,1,0
-96,‘®«Î»‘¢,1,0
-97,ƒIƒŠƒfƒIƒRƒ“Œ¤‹†,1,0
-98,’ZŒ•»ì,1,0
-99,Υȓ,1,0
-100,—¼ŽèŒ•»ì,1,0
-101,•€»ì,1,0
-102,ƒƒCƒX»ì,1,0
-103,ƒiƒbƒNƒ‹»ì,1,0
-104,‘„»ì,1,0
-105,ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO,1,0
-106,zΔ­Œ©,1,0
-107,•ŠíŒ¤‹†,1,0
-108,•ŠíC—,1,0
-109,ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO,1,0
-110,ƒnƒ“ƒ}[ƒtƒH[ƒ‹,1,4000
-111,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…,2,4000
-112,ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“,4,4000
-113,ƒI[ƒo[ƒgƒ‰ƒXƒg,4,4000
-114,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[,6,4000
-
-115,ƒXƒLƒbƒhƒgƒ‰ƒbƒv,1,4000
-116,ƒ‰ƒ“ƒhƒ}ƒCƒ“,2,4000
-117,ƒAƒ“ƒNƒ‹ƒXƒlƒA,2,4000
-118,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv,4,4000
-119,ƒTƒ“ƒhƒ}ƒ“,4,4000
-120,ƒtƒ‰ƒbƒVƒƒ[,4,4000
-121,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv,4,4000
-122,ƒuƒ‰ƒXƒgƒ}ƒCƒ“,4,4000
-123,ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv,6,4000
-124,ƒŠƒ€[ƒuƒgƒ‰ƒbƒv,1,4000
-125,ƒg[ƒL[ƒ{ƒbƒNƒX,1,4000
-126,ƒr[ƒXƒgƒxƒCƒ“,1,0
-127,ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[,1,0
-128,ƒXƒ`[ƒ‹ƒNƒƒE,1,0
-129,ƒuƒŠƒbƒcƒr[ƒg,4,4000
-130,ƒfƒBƒeƒNƒeƒBƒ“ƒO,1,4000
-131,ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv,1,4000
-
-132,‰EŽèC—û,1,0
-133,¶ŽèC—û,1,0
-134,ƒJƒ^[ƒ‹C—û,1,0
-135,ƒNƒ[ƒLƒ“ƒO,2,4000
-136,ƒ\ƒjƒbƒNƒuƒ[,2,4000
-137,ƒOƒŠƒ€ƒgƒD[ƒX,4,4000
-138,ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“,2,4000
-139,ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg,2,4000
-140,ƒxƒiƒ€ƒ_ƒXƒg,4,4000
-141,ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[,4,40000
-
-//---JP2.0 ’ljÁƒXƒLƒ‹---
-142,‰ž‹}Žè“–,1,5000
-143,Ž€‚ñ‚¾‚Ó‚è,1,5000
-144,ˆÚ“®ŽžHP‰ñ•œ,1,0
-145,‹}ŠUŒ‚,1,0
-146,ƒI[ƒgƒo[ƒT[ƒN,1,0
-147,–îì¬,1,5000
-148,ƒ`ƒƒ[ƒWƒAƒ[,1,5000
-149,»‚Ü‚«,1,5000
-150,ƒoƒbƒNƒXƒeƒbƒv,1,5000
-151,ÎE‚¢,1,5000
-152,ΓŠ‚°,1,5000
-153,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“,1,5000
-154,ƒ`ƒFƒ“ƒWƒJ[ƒg,1,5000
-155,ƒ‰ƒEƒhƒ{ƒCƒX,1,5000
-156,ƒz[ƒŠ[ƒ‰ƒCƒg,1,5000
-157,ƒGƒiƒW[ƒR[ƒg,1,5000
-
-// “G(NPC)ƒXƒLƒ‹
-// “ú–{Œê‰ðàŽQÆŒ³
-// http://rovc.at.infoseek.co.jp/o/2/oindex2.html
-// NPCƒXƒLƒ‹‚̓Aƒuƒ‰‚Å‚Ío‚È‚¢
-//158,’P‘ÌUŒ‚iƒŒƒ“ƒW2Hj
-//159,SPŒ¸­UŒ‚
-//160,‰“‹——£UŒ‚
-//161,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»
-//162,…‘®«•Ï‰»
-//163,’n‘®«•Ï‰»
-//164,‰Î‘®«•Ï‰»
-//165,•—‘®«•Ï‰»
-//166,“Å‘®«•Ï‰»
-//167,¹‘®«•Ï‰»
-//168,ˆÅ‘®«•Ï‰»
-//169,”O‘®«•Ï‰»
-//170,–hŒä–³Ž‹UŒ‚
-//171,‘½’iUŒ‚
-//172,•K’†UŒ‚
-//173,Ž©”š
-//174,”͈ÍUŒ‚
-//175,Ž©Œˆ
-//176,“ÅUŒ‚
-//177,ˆÃˆÅUŒ‚
-//178,’¾–ÙUŒ‚
-//179,ƒXƒ^ƒ“UŒ‚
-//180,Ή»UŒ‚
-//181,Žô‚¢UŒ‚
-//182,‡–°UŒ‚
-//183,ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
-//184,…‘®«UŒ‚
-//185,’n‘®«UŒ‚
-//186,‰Î‘®«UŒ‚
-//187,•—‘®«UŒ‚
-//188,“Å‘®«UŒ‚
-//189,¹‘®«UŒ‚
-//190,ˆÅ‘®«UŒ‚
-//191,”O‘®«UŒ‚
-//192,–‚–@‘ÅŒ‚UŒ‚
-//193,›z‰»or¬’·
-//194,’§”­
-//195,ƒ^ƒoƒR‚ð‹z‚¤
-//196,Žæ‚芪‚«¢ŠÒ
-//197,ƒGƒ‚‚ðo‚·
-//198,H
-//199,HP‹zŽû
-//200,HP‹zŽûi–‚–@‘ÅŒ‚j
-//201,ˆê’莞ŠÔA”ñˆÚ“®”ñ”½Œ‚(DEF100)
-//202,H
-//203,ˆê’è‚ÌŠm—¦‚ÅHP”¼Œ¸
-//204,ˆê’莞ŠÔA”ñˆÚ“®”ñ”½Œ‚(MDEF100)
-//205,H
-//206,SPŒ¸­UŒ‚i’ljÁƒXƒ^ƒ“Hj
-//207,öŠo
-//208,H
-//209,ƒ‚ƒ“ƒXƒ^[¢ŠÒ
-
-//---EP3.0ƒXƒLƒ‹---
-//GD_APPROVAL³‹KƒMƒ‹ƒh³”F
-//GD_KAFRACONTRACTƒJƒvƒ‰ŒÙ—p
-//GD_GUARDRESEARCHƒK[ƒfƒBƒAƒ“Œ¤‹†
-//GD_CHARISMAƒJƒŠƒXƒ}
-//GD_EXTENSIONƒMƒ‹ƒhŠg’£
-
-//---EP4.0ƒXƒLƒ‹---
-210,ƒXƒiƒbƒ`ƒƒ[,1,0
-211,ƒXƒeƒB[ƒ‹ƒRƒCƒ“,1,4000
-212,ƒoƒbƒNƒXƒ^ƒu,4,4000
-213,ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu,1,0
-214,ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN,2,4000
-215,ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“,4,4000
-216,ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh,4,4000
-217,ƒXƒgƒŠƒbƒvƒA[ƒ}[,4,4000
-218,ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€,4,4000
-219,ƒCƒ“ƒeƒBƒ~ƒfƒCƒg,4,4000
-220,ƒOƒ‰ƒtƒBƒeƒB,1,4000
-221,ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB,2,4000
-222,ƒNƒŠ[ƒi[,4,4000
-223,ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX,1,0
-224,ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg,1,0
-225,ƒNƒ[ƒ“ƒXƒLƒ‹,1,0
-
-226,•€C—û,1,0
-227,ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“,1,0
-228,ƒtƒ@[ƒ}ƒV[,1,4000
-229,ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“,2,4000
-230,ƒAƒVƒbƒhƒeƒ‰[,2,4000
-231,ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[,2,4000
-232,ƒoƒCƒIƒvƒ‰ƒ“ƒg,4,4000
-233,ƒXƒtƒBƒA[ƒ}ƒCƒ“,4,4000
-234,ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW,4,4000
-235,ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW,4,4000
-236,ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW,4,4000
-237,ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW,4,4000
-
-238,¶–½—Ï—,1,0
-239,¶–½HŠwŒ¤‹†,1,0
-240,”í‘¢•¨‘n‘¢,1,0
-241,ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“,1,0
-242,ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹,1,0
-243,ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
-244,ˆÀ‘§,1,0
-245,ƒhƒŠƒ‹ƒ}ƒXƒ^[,1,0
-246,ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
-247,ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
-
-248,ƒtƒFƒCƒX,1,0
-249,ƒI[ƒgƒK[ƒh,1,4000
-250,ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW,2,4000
-251,ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“,2,4000
-252,ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh,4,4000
-253,ƒz[ƒŠ[ƒNƒƒX,2,4000
-254,ƒOƒ‰ƒ“ƒhƒNƒƒX,6,4000
-255,ƒfƒBƒ{[ƒVƒ‡ƒ“,4,4000
-256,ƒvƒƒ”ƒBƒfƒ“ƒX,2,4000
-257,ƒfƒBƒtƒFƒ“ƒ_[,4,4000
-258,ƒXƒsƒAƒNƒCƒbƒPƒ“,1,4000
-
-259,“SŒ,1,0
-260,Ԥ,1,0
-261,‹CŒ÷,1,4000
-262,‹C’D,1,4000
-263,ŽO’i¶,1,0
-264,Žc‰e,4,4000
-265,Œ©Ø‚è,1,0
-266,”­™¤,2,4000
-267,Žw’e,2,4000
-268,‹à„,4,4000
-269,”’nŽæ‚è,2,4000
-270,”š—ô”g“®,2,4000
-271,ˆ¢C—…”e–PŒ,6,4000
-272,˜A‘Ŷ,1,0
-273,–Ò—´Œ,1,0
-
-274,ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN,1,0
-275,ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹,1,4000
-276,ƒ}ƒWƒbƒNƒƒbƒh,1,4000
-277,ƒXƒyƒ‹ƒuƒŒƒCƒJ[,2,4000
-278,ƒtƒŠ[ƒLƒƒƒXƒg,1,0
-279,ƒI[ƒgƒXƒyƒ‹,2,4000
-280,ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[,2,4000
-281,ƒtƒƒXƒgƒEƒFƒ|ƒ“,2,4000
-282,ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[,2,4000
-283,ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“,2,4000
-284,ƒhƒ‰ƒSƒmƒƒW[,1,0
-285,ƒ{ƒ‹ƒP[ƒm,4,4000
-286,ƒfƒŠƒ…[ƒW,4,4000
-287,ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹,4,4000
-288,ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[,4,4000
-289,ƒfƒBƒXƒyƒ‹,6,4000
-290,ƒAƒuƒ‰ƒJƒ^ƒuƒ‰,4,4000
-
-// ƒAƒuƒ‰ƒJƒ^ƒuƒ‰”h¶ƒXƒLƒ‹
-291,ƒ‚ƒm[ƒZƒ‹,4,2500
-292,ƒNƒ‰ƒXƒ`ƒFƒ“ƒW,8,2500
-293,ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^[,6,3500
-294,ƒŠƒo[ƒXƒIƒLƒV[,4,5000
-295,ƒfƒX,8,2000
-296,ƒtƒH[ƒ`ƒ…ƒ“,6,4000
-297,ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^[,6,4000
-298,ƒNƒGƒXƒVƒ‡ƒ“,4,5000
-299,ƒOƒ‰ƒrƒeƒB,4,5000
-300,ƒŒƒxƒ‹ƒAƒbƒv,10,500
-301,‘¦Ž€,4,2000
-302,Š®‘S‰ñ•œ,8,3000
-303,ƒR[ƒ},4,4000
-
-// ƒ_ƒ“ƒT[ƒo[ƒh‹¤’Ê
-304,ƒAƒhƒŠƒu,1,0
-305,ƒAƒ“ƒR[ƒ‹,1,0
-306,ŽqŽç‰Ì,1,0
-307,ƒjƒˆƒ‹ƒh‚̉ƒ,1,0
-308,‰i‰“‚̬“×,1,0
-309,푾ŒÛ‚Ì‹¿‚«,1,0
-310,ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö,1,0
-311,ƒƒL‚Ì‹©‚Ñ,1,0
-312,[•£‚Ì’†‚É,1,0
-313,•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh,1,0
-//314,ƒ‰ƒOƒiƒƒN,1,0
-
-// ƒo[ƒhƒXƒLƒ‹
-315,ŠyŠí‚Ì—ûK,1,0
-316,ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN,1,4000
-317,•s‹¦˜a‰¹,1,0
-318,Š¦‚¢ƒWƒ‡[ƒN,2,4000
-319,Œû“J,1,0
-320,—[—z‚̃AƒTƒVƒ“ƒNƒƒX,1,0
-321,ƒuƒ‰ƒM‚ÌŽ,1,0
-322,ƒCƒhƒDƒ“‚Ì—ÑŒç,1,0
-
-// ƒ_ƒ“ƒT[ƒXƒLƒ‹
-323,ƒ_ƒ“ƒX‚Ì—ûK,1,0
-324,–‚¿,1,4000
-325,Ž©•ªŸŽè‚ȃ_ƒ“ƒX,1,0
-326,ƒXƒNƒŠ[ƒ€,2,4000
-327,ƒnƒ~ƒ“ƒO,1,0
-328,Ž„‚ð–Y‚ê‚È‚¢‚Åc,1,0
-329,K‰^‚̃LƒX,1,0
-330,ƒT[ƒrƒXƒtƒH[ƒ†[,1,0
-
-//334,‚ ‚È‚½‚¾‚¯‚ÍŽç‚Á‚Ä,1,0
-//335,‚ ‚È‚½‚Ì‚½‚ß‹]µ‚µ‚Ü‚·‚æ,1,0
-//336,‚ ‚È‚½‚ð‰ï‚¢‚½‚¢‚Å‚·,1,0
+//ƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚Ì”­“®ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX
+//
+//‘Ž®:<ID>,<DUMMY>,<REQ_LV>,<PER>
+//
+//ID:ŠY“–ƒXƒLƒ‹ID
+//DUMMY:ƒ_ƒ~[B•ª‚è‚â‚·‚¢–¼‘O‚ðB
+//REQ_LV:ŠY“–ƒXƒLƒ‹‚ª”­“®‚·‚é‚Ì‚É•K—v‚ȃAƒuƒ‰ƒJƒ_ƒuƒ‰‚̃Œƒxƒ‹
+//PER:”­“®—¦(–œ•ª—¦‚Å)B‚½‚¾‚µ‚±‚Ì’l‚ð10000‚É‚µ‚½‚©‚ç‚Æ‚¢‚Á‚Ä100%”­“®‚·‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñ
+//
+//‘S‘Ì“I‚É‹É’[‚ÉPER‚ð’á‚­‚·‚é‚ÆA”­“®ƒXƒLƒ‹‘I’舗‚ª‘½‚­‚È‚èAŽI‚ªd‚­‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·
+
+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,SP‰ñ•œ—ÍŒüã,1,5000
+10,ƒTƒCƒg,1,5000
+11,ƒiƒp[ƒ€ƒr[ƒg,1,5000
+12,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹,4,5000
+13,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN,2,5000
+14,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg,1,5000
+15,ƒtƒƒXƒgƒ_ƒCƒo[,2,5000
+16,ƒXƒg[ƒ“ƒJ[ƒX,1,5000
+17,ƒtƒ@ƒCƒA[ƒ{[ƒ‹,2,5000
+18,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹,4,5000
+19,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg,1,5000
+20,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg,1,5000
+21,ƒTƒ“ƒ_[ƒXƒg[ƒ€,2,5000
+
+22,ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“,1,0
+23,ƒf[ƒ‚ƒ“ƒxƒCƒ“,1,0
+24,ƒ‹ƒAƒt,1,5000
+25,ƒjƒ…[ƒ},6,5000
+26,ƒeƒŒƒ|[ƒg,2,5000
+27,ƒ[ƒvƒ|[ƒ^ƒ‹,4,5000
+28,ƒq[ƒ‹,1,5000
+29,‘¬“x‘‰Á,2,5000
+30,‘¬“xŒ¸­,4,5000
+31,ƒAƒNƒAƒxƒlƒfƒBƒNƒ^,1,5000
+32,ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX,1,5000
+33,ƒGƒ“ƒWƒFƒ‰ƒX,1,5000
+34,ƒuƒŒƒbƒVƒ“ƒO,2,5000
+35,ƒLƒ…ƒA[,1,5000
+
+36,ŠŽŒÀŠE—Ê‘‰Á,1,0
+37,ƒfƒBƒXƒJƒEƒ“ƒg,1,0
+38,ƒI[ƒo[ƒ`ƒƒ[ƒW,1,0
+39,ƒvƒbƒVƒ…ƒJ[ƒg,1,0
+40,ƒAƒCƒeƒ€ŠÓ’è,1,5000
+41,˜I“XŠJÝ,4,5000
+42,ƒƒ}[ƒiƒCƒg,1,5000
+
+43,‚Ó‚­‚낤‚Ì–Ú,1,0
+44,ƒƒV‚Ì–Ú,1,0
+45,W’†—ÍŒüã,4,5000
+46,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,1,5000
+47,ƒAƒ[ƒVƒƒƒ[,2,5000
+
+48,ƒ_ƒuƒ‹ƒAƒ^ƒbƒN,1,0
+49,‰ñ”𗦑‰Á,1,0
+50,ƒXƒeƒB[ƒ‹,2,5000
+51,ƒnƒCƒfƒBƒ“ƒO,2,5000
+52,ƒCƒ“ƒxƒiƒ€,1,5000,
+53,‰ð“Å,1,5000
+
+54,ƒŠƒUƒŒƒNƒVƒ‡ƒ“,1,5000
+
+55,‘„C—û,1,0
+56,ƒsƒA[ƒX,2,4000
+57,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,6,4000
+58,ƒXƒsƒAƒXƒ^ƒu,1,4000
+59,ƒXƒsƒAƒu[ƒƒ‰ƒ“,4,4000
+60,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“,1,4000
+61,ƒI[ƒgƒJƒEƒ“ƒ^[,2,4000
+62,ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…,6,4000
+63,ƒ‰ƒCƒfƒBƒ“ƒO,1,0
+64,‹R•ºC—û,1,0
+
+65,ƒƒCƒXC—û,1,0
+66,ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX,1,4000
+67,ƒTƒtƒ‰ƒMƒEƒ€,2,4000
+68,ƒAƒXƒyƒ‹ƒVƒI,2,4000
+69,¹‘Ì~•Ÿ,4,4000
+70,ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ,2,4000
+71,ƒXƒ[ƒ|ƒCƒYƒ“,1,4000
+72,ƒŠƒJƒoƒŠ[,1,4000
+73,ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“,2,4000
+74,ƒ}ƒOƒjƒtƒBƒJ[ƒg,2,4000
+75,ƒOƒƒŠƒA,4,4000
+76,ƒŒƒbƒNƒXƒfƒBƒr[ƒi,2,4000
+77,ƒ^[ƒ“ƒAƒ“ƒfƒbƒh,2,4000
+78,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi,4,4000
+79,ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€,6,4000
+
+80,ƒtƒ@ƒCƒA[ƒsƒ‰[,2,4000
+81,ƒTƒCƒgƒ‰ƒbƒVƒƒ[,2,4000
+//82,ƒtƒ@ƒCƒAƒAƒCƒr[,1,0
+83,ƒƒeƒIƒXƒg[ƒ€,6,4000
+84,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[,2,4000
+85,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“,6,4000
+86,ƒEƒH[ƒ^[ƒ{[ƒ‹,4,4000
+87,ƒAƒCƒXƒEƒH[ƒ‹,2,4000
+88,ƒtƒƒXƒgƒmƒ”ƒ@,1,4000
+89,ƒXƒg[ƒ€ƒKƒXƒg,6,4000
+90,ƒA[ƒXƒXƒpƒCƒN,1,4000
+91,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu,2,4000
+92,ƒNƒ@ƒOƒ}ƒCƒA,4,4000
+93,ƒ‚ƒ“ƒXƒ^[î•ñ,1,4000
+
+94,“S»‘¢,1,0
+95,|“S»‘¢,1,0
+96,‘®«Î»‘¢,1,0
+97,ƒIƒŠƒfƒIƒRƒ“Œ¤‹†,1,0
+98,’ZŒ•»ì,1,0
+99,Υȓ,1,0
+100,—¼ŽèŒ•»ì,1,0
+101,•€»ì,1,0
+102,ƒƒCƒX»ì,1,0
+103,ƒiƒbƒNƒ‹»ì,1,0
+104,‘„»ì,1,0
+105,ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO,1,0
+106,zΔ­Œ©,1,0
+107,•ŠíŒ¤‹†,1,0
+108,•ŠíC—,1,0
+109,ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO,1,0
+110,ƒnƒ“ƒ}[ƒtƒH[ƒ‹,1,4000
+111,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…,2,4000
+112,ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“,4,4000
+113,ƒI[ƒo[ƒgƒ‰ƒXƒg,4,4000
+114,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[,6,4000
+
+115,ƒXƒLƒbƒhƒgƒ‰ƒbƒv,1,4000
+116,ƒ‰ƒ“ƒhƒ}ƒCƒ“,2,4000
+117,ƒAƒ“ƒNƒ‹ƒXƒlƒA,2,4000
+118,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv,4,4000
+119,ƒTƒ“ƒhƒ}ƒ“,4,4000
+120,ƒtƒ‰ƒbƒVƒƒ[,4,4000
+121,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv,4,4000
+122,ƒuƒ‰ƒXƒgƒ}ƒCƒ“,4,4000
+123,ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv,6,4000
+124,ƒŠƒ€[ƒuƒgƒ‰ƒbƒv,1,4000
+125,ƒg[ƒL[ƒ{ƒbƒNƒX,1,4000
+126,ƒr[ƒXƒgƒxƒCƒ“,1,0
+127,ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[,1,0
+128,ƒXƒ`[ƒ‹ƒNƒƒE,1,0
+129,ƒuƒŠƒbƒcƒr[ƒg,4,4000
+130,ƒfƒBƒeƒNƒeƒBƒ“ƒO,1,4000
+131,ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv,1,4000
+
+132,‰EŽèC—û,1,0
+133,¶ŽèC—û,1,0
+134,ƒJƒ^[ƒ‹C—û,1,0
+135,ƒNƒ[ƒLƒ“ƒO,2,4000
+136,ƒ\ƒjƒbƒNƒuƒ[,2,4000
+137,ƒOƒŠƒ€ƒgƒD[ƒX,4,4000
+138,ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“,2,4000
+139,ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg,2,4000
+140,ƒxƒiƒ€ƒ_ƒXƒg,4,4000
+141,ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[,4,40000
+
+//---JP2.0 ’ljÁƒXƒLƒ‹---
+142,‰ž‹}Žè“–,1,5000
+143,Ž€‚ñ‚¾‚Ó‚è,1,5000
+144,ˆÚ“®ŽžHP‰ñ•œ,1,0
+145,‹}ŠUŒ‚,1,0
+146,ƒI[ƒgƒo[ƒT[ƒN,1,0
+147,–îì¬,1,5000
+148,ƒ`ƒƒ[ƒWƒAƒ[,1,5000
+149,»‚Ü‚«,1,5000
+150,ƒoƒbƒNƒXƒeƒbƒv,1,5000
+151,ÎE‚¢,1,5000
+152,ΓŠ‚°,1,5000
+153,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“,1,5000
+154,ƒ`ƒFƒ“ƒWƒJ[ƒg,1,5000
+155,ƒ‰ƒEƒhƒ{ƒCƒX,1,5000
+156,ƒz[ƒŠ[ƒ‰ƒCƒg,1,5000
+157,ƒGƒiƒW[ƒR[ƒg,1,5000
+
+// “G(NPC)ƒXƒLƒ‹
+// “ú–{Œê‰ðàŽQÆŒ³
+// http://rovc.at.infoseek.co.jp/o/2/oindex2.html
+// NPCƒXƒLƒ‹‚̓Aƒuƒ‰‚Å‚Ío‚È‚¢
+//158,’P‘ÌUŒ‚iƒŒƒ“ƒW2Hj
+//159,SPŒ¸­UŒ‚
+//160,‰“‹——£UŒ‚
+//161,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»
+//162,…‘®«•Ï‰»
+//163,’n‘®«•Ï‰»
+//164,‰Î‘®«•Ï‰»
+//165,•—‘®«•Ï‰»
+//166,“Å‘®«•Ï‰»
+//167,¹‘®«•Ï‰»
+//168,ˆÅ‘®«•Ï‰»
+//169,”O‘®«•Ï‰»
+//170,–hŒä–³Ž‹UŒ‚
+//171,‘½’iUŒ‚
+//172,•K’†UŒ‚
+//173,Ž©”š
+//174,”͈ÍUŒ‚
+//175,Ž©Œˆ
+//176,“ÅUŒ‚
+//177,ˆÃˆÅUŒ‚
+//178,’¾–ÙUŒ‚
+//179,ƒXƒ^ƒ“UŒ‚
+//180,Ή»UŒ‚
+//181,Žô‚¢UŒ‚
+//182,‡–°UŒ‚
+//183,ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
+//184,…‘®«UŒ‚
+//185,’n‘®«UŒ‚
+//186,‰Î‘®«UŒ‚
+//187,•—‘®«UŒ‚
+//188,“Å‘®«UŒ‚
+//189,¹‘®«UŒ‚
+//190,ˆÅ‘®«UŒ‚
+//191,”O‘®«UŒ‚
+//192,–‚–@‘ÅŒ‚UŒ‚
+//193,›z‰»or¬’·
+//194,’§”­
+//195,ƒ^ƒoƒR‚ð‹z‚¤
+//196,Žæ‚芪‚«¢ŠÒ
+//197,ƒGƒ‚‚ðo‚·
+//198,H
+//199,HP‹zŽû
+//200,HP‹zŽûi–‚–@‘ÅŒ‚j
+//201,ˆê’莞ŠÔA”ñˆÚ“®”ñ”½Œ‚(DEF100)
+//202,H
+//203,ˆê’è‚ÌŠm—¦‚ÅHP”¼Œ¸
+//204,ˆê’莞ŠÔA”ñˆÚ“®”ñ”½Œ‚(MDEF100)
+//205,H
+//206,SPŒ¸­UŒ‚i’ljÁƒXƒ^ƒ“Hj
+//207,öŠo
+//208,H
+//209,ƒ‚ƒ“ƒXƒ^[¢ŠÒ
+
+//---EP3.0ƒXƒLƒ‹---
+//GD_APPROVAL³‹KƒMƒ‹ƒh³”F
+//GD_KAFRACONTRACTƒJƒvƒ‰ŒÙ—p
+//GD_GUARDRESEARCHƒK[ƒfƒBƒAƒ“Œ¤‹†
+//GD_CHARISMAƒJƒŠƒXƒ}
+//GD_EXTENSIONƒMƒ‹ƒhŠg’£
+
+//---EP4.0ƒXƒLƒ‹---
+210,ƒXƒiƒbƒ`ƒƒ[,1,0
+211,ƒXƒeƒB[ƒ‹ƒRƒCƒ“,1,4000
+212,ƒoƒbƒNƒXƒ^ƒu,4,4000
+213,ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu,1,0
+214,ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN,2,4000
+215,ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“,4,4000
+216,ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh,4,4000
+217,ƒXƒgƒŠƒbƒvƒA[ƒ}[,4,4000
+218,ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€,4,4000
+219,ƒCƒ“ƒeƒBƒ~ƒfƒCƒg,4,4000
+220,ƒOƒ‰ƒtƒBƒeƒB,1,4000
+221,ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB,2,4000
+222,ƒNƒŠ[ƒi[,4,4000
+223,ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX,1,0
+224,ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg,1,0
+225,ƒNƒ[ƒ“ƒXƒLƒ‹,1,0
+
+226,•€C—û,1,0
+227,ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“,1,0
+228,ƒtƒ@[ƒ}ƒV[,1,4000
+229,ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“,2,4000
+230,ƒAƒVƒbƒhƒeƒ‰[,2,4000
+231,ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[,2,4000
+232,ƒoƒCƒIƒvƒ‰ƒ“ƒg,4,4000
+233,ƒXƒtƒBƒA[ƒ}ƒCƒ“,4,4000
+234,ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW,4,4000
+235,ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW,4,4000
+236,ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW,4,4000
+237,ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW,4,4000
+
+238,¶–½—Ï—,1,0
+239,¶–½HŠwŒ¤‹†,1,0
+240,”í‘¢•¨‘n‘¢,1,0
+241,ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“,1,0
+242,ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹,1,0
+243,ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
+244,ˆÀ‘§,1,0
+245,ƒhƒŠƒ‹ƒ}ƒXƒ^[,1,0
+246,ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
+247,ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX,1,0
+
+248,ƒtƒFƒCƒX,1,0
+249,ƒI[ƒgƒK[ƒh,1,4000
+250,ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW,2,4000
+251,ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“,2,4000
+252,ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh,4,4000
+253,ƒz[ƒŠ[ƒNƒƒX,2,4000
+254,ƒOƒ‰ƒ“ƒhƒNƒƒX,6,4000
+255,ƒfƒBƒ{[ƒVƒ‡ƒ“,4,4000
+256,ƒvƒƒ”ƒBƒfƒ“ƒX,2,4000
+257,ƒfƒBƒtƒFƒ“ƒ_[,4,4000
+258,ƒXƒsƒAƒNƒCƒbƒPƒ“,1,4000
+
+259,“SŒ,1,0
+260,Ԥ,1,0
+261,‹CŒ÷,1,4000
+262,‹C’D,1,4000
+263,ŽO’i¶,1,0
+264,Žc‰e,4,4000
+265,Œ©Ø‚è,1,0
+266,”­™¤,2,4000
+267,Žw’e,2,4000
+268,‹à„,4,4000
+269,”’nŽæ‚è,2,4000
+270,”š—ô”g“®,2,4000
+271,ˆ¢C—…”e–PŒ,6,4000
+272,˜A‘Ŷ,1,0
+273,–Ò—´Œ,1,0
+
+274,ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN,1,0
+275,ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹,1,4000
+276,ƒ}ƒWƒbƒNƒƒbƒh,1,4000
+277,ƒXƒyƒ‹ƒuƒŒƒCƒJ[,2,4000
+278,ƒtƒŠ[ƒLƒƒƒXƒg,1,0
+279,ƒI[ƒgƒXƒyƒ‹,2,4000
+280,ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[,2,4000
+281,ƒtƒƒXƒgƒEƒFƒ|ƒ“,2,4000
+282,ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[,2,4000
+283,ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“,2,4000
+284,ƒhƒ‰ƒSƒmƒƒW[,1,0
+285,ƒ{ƒ‹ƒP[ƒm,4,4000
+286,ƒfƒŠƒ…[ƒW,4,4000
+287,ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹,4,4000
+288,ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[,4,4000
+289,ƒfƒBƒXƒyƒ‹,6,4000
+290,ƒAƒuƒ‰ƒJƒ^ƒuƒ‰,4,4000
+
+// ƒAƒuƒ‰ƒJƒ^ƒuƒ‰”h¶ƒXƒLƒ‹
+291,ƒ‚ƒm[ƒZƒ‹,4,2500
+292,ƒNƒ‰ƒXƒ`ƒFƒ“ƒW,8,2500
+293,ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^[,6,3500
+294,ƒŠƒo[ƒXƒIƒLƒV[,4,5000
+295,ƒfƒX,8,2000
+296,ƒtƒH[ƒ`ƒ…ƒ“,6,4000
+297,ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^[,6,4000
+298,ƒNƒGƒXƒVƒ‡ƒ“,4,5000
+299,ƒOƒ‰ƒrƒeƒB,4,5000
+300,ƒŒƒxƒ‹ƒAƒbƒv,10,500
+301,‘¦Ž€,4,2000
+302,Š®‘S‰ñ•œ,8,3000
+303,ƒR[ƒ},4,4000
+
+// ƒ_ƒ“ƒT[ƒo[ƒh‹¤’Ê
+304,ƒAƒhƒŠƒu,1,0
+305,ƒAƒ“ƒR[ƒ‹,1,0
+306,ŽqŽç‰Ì,1,0
+307,ƒjƒˆƒ‹ƒh‚̉ƒ,1,0
+308,‰i‰“‚̬“×,1,0
+309,푾ŒÛ‚Ì‹¿‚«,1,0
+310,ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö,1,0
+311,ƒƒL‚Ì‹©‚Ñ,1,0
+312,[•£‚Ì’†‚É,1,0
+313,•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh,1,0
+//314,ƒ‰ƒOƒiƒƒN,1,0
+
+// ƒo[ƒhƒXƒLƒ‹
+315,ŠyŠí‚Ì—ûK,1,0
+316,ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN,1,4000
+317,•s‹¦˜a‰¹,1,0
+318,Š¦‚¢ƒWƒ‡[ƒN,2,4000
+319,Œû“J,1,0
+320,—[—z‚̃AƒTƒVƒ“ƒNƒƒX,1,0
+321,ƒuƒ‰ƒM‚ÌŽ,1,0
+322,ƒCƒhƒDƒ“‚Ì—ÑŒç,1,0
+
+// ƒ_ƒ“ƒT[ƒXƒLƒ‹
+323,ƒ_ƒ“ƒX‚Ì—ûK,1,0
+324,–‚¿,1,4000
+325,Ž©•ªŸŽè‚ȃ_ƒ“ƒX,1,0
+326,ƒXƒNƒŠ[ƒ€,2,4000
+327,ƒnƒ~ƒ“ƒO,1,0
+328,Ž„‚ð–Y‚ê‚È‚¢‚Åc,1,0
+329,K‰^‚̃LƒX,1,0
+330,ƒT[ƒrƒXƒtƒH[ƒ†[,1,0
+
+//334,‚ ‚È‚½‚¾‚¯‚ÍŽç‚Á‚Ä,1,0
+//335,‚ ‚È‚½‚Ì‚½‚ß‹]µ‚µ‚Ü‚·‚æ,1,0
+//336,‚ ‚È‚½‚ð‰ï‚¢‚½‚¢‚Å‚·,1,0
diff --git a/db/attr_fix.txt b/db/attr_fix.txt
index f5e090c45..2bdbbd9d7 100644
--- a/db/attr_fix.txt
+++ b/db/attr_fix.txt
@@ -1,53 +1,53 @@
-// ‘®«C³
-// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
-1,10 // lv1‘®«ƒe[ƒuƒ‹
-// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
- 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // –³
- 100, 25, 100, 150, 50, 100, 75, 100, 100, 100, // …
- 100, 100, 100, 50, 150, 100, 75, 100, 100, 100, // ’n
- 100, 50, 150, 25, 100, 100, 75, 100, 100, 125, // ‰Î
- 100, 175, 50, 100, 25, 100, 75, 100, 100, 100, // •—
- 100, 100, 125, 125, 125, 0, 75, 50, 100, -25, // “Å
- 100, 100, 100, 100, 100, 100, 0, 125, 100, 150, // ¹
- 100, 100, 100, 100, 100, 50, 125, 0, 100, -25, // ˆÃ
- 25, 100, 100, 100, 100, 100, 75, 75, 125, 100, // ”O
- 100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // •sŽ€
-// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
-2,10 // lv2‘®«ƒe[ƒuƒ‹
-//–³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
- 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // –³
- 100, 0, 100, 175, 25, 100, 50, 75, 100, 100, // …
- 100, 100, 50, 25, 175, 100, 50, 75, 100, 100, // ’n
- 100, 25, 175, 0, 100, 100, 50, 75, 100, 150, // ‰Î
- 100, 175, 25, 100, 0, 100, 50, 75, 100, 100, // •—
- 100, 75, 125, 125, 125, 0, 50, 25, 75, -50, // “Å
- 100, 100, 100, 100, 100, 100, -25, 150, 100, 175, // ¹
- 100, 100, 100, 100, 100, 25, 150, -25, 100, -50, // ˆÃ
- 0, 75, 75, 75, 75, 75, 50, 50, 150, 125, // ”O
- 100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // •sŽ€
-// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
-3,10 // lv3‘®«ƒe[ƒuƒ‹
-// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
- 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // –³
- 100, -25, 100, 200, 0, 100, 25, 50, 100, 125, // …
- 100, 100, 0, 0, 200, 100, 25, 50, 100, 75, // ’n
- 100, 0, 200, -25, 100, 100, 25, 50, 100, 175, // ‰Î
- 100, 200, 0, 100, -25, 100, 25, 50, 100, 100, // •—
- 100, 50, 100, 100, 100, 0, 25, 0, 50, -75, // “Å
- 100, 100, 100, 100, 100, 125, -50, 175, 100, 200, // ¹
- 100, 100, 100, 100, 100, 0, 175, -50, 100, -75, // ˆÃ
- 0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // ”O
- 100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // •sŽ€
-// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
-4,10 // lv4‘®«ƒe[ƒuƒ‹
-// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
- 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // –³
- 100, -50, 100, 200, 0, 75, 0, 25, 100, 150, // …
- 100, 100, -25, 0, 200, 75, 0, 25, 100, 50, // ’n
- 100, 0, 200, -50, 100, 75, 0, 25, 100, 200, // ‰Î
- 100, 200, 0, 100, -50, 75, 0, 25, 100, 100, // •—
- 100, 25, 75, 75, 75, 0, 0, -25, 25,-100, // “Å
- 100, 75, 75, 75, 75, 125,-100, 200, 100, 200, // ¹
- 100, 75, 75, 75, 75, -25, 200,-100, 100,-100, // ˆÃ
- 0, 25, 25, 25, 25, 25, 0, 0, 200, 175, // ”O
- 100, 25, 25, 25, 25, -25, 175, 0, 100, 0, // •sŽ€
+// ‘®«C³
+// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
+1,10 // lv1‘®«ƒe[ƒuƒ‹
+// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
+ 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // –³
+ 100, 25, 100, 150, 50, 100, 75, 100, 100, 100, // …
+ 100, 100, 100, 50, 150, 100, 75, 100, 100, 100, // ’n
+ 100, 50, 150, 25, 100, 100, 75, 100, 100, 125, // ‰Î
+ 100, 175, 50, 100, 25, 100, 75, 100, 100, 100, // •—
+ 100, 100, 125, 125, 125, 0, 75, 50, 100, -25, // “Å
+ 100, 100, 100, 100, 100, 100, 0, 125, 100, 150, // ¹
+ 100, 100, 100, 100, 100, 50, 125, 0, 100, -25, // ˆÃ
+ 25, 100, 100, 100, 100, 100, 75, 75, 125, 100, // ”O
+ 100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // •sŽ€
+// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
+2,10 // lv2‘®«ƒe[ƒuƒ‹
+//–³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
+ 100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // –³
+ 100, 0, 100, 175, 25, 100, 50, 75, 100, 100, // …
+ 100, 100, 50, 25, 175, 100, 50, 75, 100, 100, // ’n
+ 100, 25, 175, 0, 100, 100, 50, 75, 100, 150, // ‰Î
+ 100, 175, 25, 100, 0, 100, 50, 75, 100, 100, // •—
+ 100, 75, 125, 125, 125, 0, 50, 25, 75, -50, // “Å
+ 100, 100, 100, 100, 100, 100, -25, 150, 100, 175, // ¹
+ 100, 100, 100, 100, 100, 25, 150, -25, 100, -50, // ˆÃ
+ 0, 75, 75, 75, 75, 75, 50, 50, 150, 125, // ”O
+ 100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // •sŽ€
+// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
+3,10 // lv3‘®«ƒe[ƒuƒ‹
+// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
+ 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // –³
+ 100, -25, 100, 200, 0, 100, 25, 50, 100, 125, // …
+ 100, 100, 0, 0, 200, 100, 25, 50, 100, 75, // ’n
+ 100, 0, 200, -25, 100, 100, 25, 50, 100, 175, // ‰Î
+ 100, 200, 0, 100, -25, 100, 25, 50, 100, 100, // •—
+ 100, 50, 100, 100, 100, 0, 25, 0, 50, -75, // “Å
+ 100, 100, 100, 100, 100, 125, -50, 175, 100, 200, // ¹
+ 100, 100, 100, 100, 100, 0, 175, -50, 100, -75, // ˆÃ
+ 0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // ”O
+ 100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // •sŽ€
+// ‰¡:ƒ‚ƒ“ƒXƒ^[‚Ì‘®« // c:UŒ‚‚Ì‘®«
+4,10 // lv4‘®«ƒe[ƒuƒ‹
+// –³ … ’n ‰Î •— “Å ¹ ˆÃ ”O •sŽ€
+ 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // –³
+ 100, -50, 100, 200, 0, 75, 0, 25, 100, 150, // …
+ 100, 100, -25, 0, 200, 75, 0, 25, 100, 50, // ’n
+ 100, 0, 200, -50, 100, 75, 0, 25, 100, 200, // ‰Î
+ 100, 200, 0, 100, -50, 75, 0, 25, 100, 100, // •—
+ 100, 25, 75, 75, 75, 0, 0, -25, 25,-100, // “Å
+ 100, 75, 75, 75, 75, 125,-100, 200, 100, 200, // ¹
+ 100, 75, 75, 75, 75, -25, 200,-100, 100,-100, // ˆÃ
+ 0, 25, 25, 25, 25, 25, 0, 0, 200, 175, // ”O
+ 100, 25, 25, 25, 25, -25, 175, 0, 100, 0, // •sŽ€
diff --git a/db/castle_db.txt b/db/castle_db.txt
index 16571922d..c1f1a9561 100644
--- a/db/castle_db.txt
+++ b/db/castle_db.txt
@@ -1,27 +1,27 @@
-//ƒMƒ‹ƒhéƒf[ƒ^ by sakage,shuto
-// AgitDB Modify by Michael_Huang at 2004-02/13.
-// <Castle_ID>,<Map_Name>,<Castle_Name>,<Switch_Flag:(reserved)>
-0,aldeg_cas01.gat,Noisyubantian,1
-1,aldeg_cas02.gat,Hohensyubangawoo,1
-2,aldeg_cas03.gat,Nyirenverk,1
-3,aldeg_cas04.gat,Byirtsburi,1
-4,aldeg_cas05.gat,Rotenburk,1
-5,gefg_cas01.gat,Reprion,1
-6,gefg_cas02.gat,Yolbriger,1
-7,gefg_cas03.gat,Isinlife,1
-8,gefg_cas04.gat,Berigel,1
-9,gefg_cas05.gat,Melsedetsu,1
-10,payg_cas01.gat,Mingting,1
-11,payg_cas02.gat,Tiantan,1
-12,payg_cas03.gat,Fuying,1
-13,payg_cas04.gat,Honglou,1
-14,payg_cas05.gat,Zhulinxian,1
-15,prtg_cas01.gat,Creamhilt,1
-16,prtg_cas02.gat,Sbanhealt,1
-17,prtg_cas03.gat,Lazrigees,1
-18,prtg_cas04.gat,Squagul,1
-19,prtg_cas05.gat,Guindull,1
-20,nguild_alde.gat,Novice Castle 1,1
-21,nguild_gef.gat,Novice Castle 2,1
-22,nguild_pay.gat,Novice Castle 3,1
+//ƒMƒ‹ƒhéƒf[ƒ^ by sakage,shuto
+// AgitDB Modify by Michael_Huang at 2004-02/13.
+// <Castle_ID>,<Map_Name>,<Castle_Name>,<Switch_Flag:(reserved)>
+0,aldeg_cas01.gat,Noisyubantian,1
+1,aldeg_cas02.gat,Hohensyubangawoo,1
+2,aldeg_cas03.gat,Nyirenverk,1
+3,aldeg_cas04.gat,Byirtsburi,1
+4,aldeg_cas05.gat,Rotenburk,1
+5,gefg_cas01.gat,Reprion,1
+6,gefg_cas02.gat,Yolbriger,1
+7,gefg_cas03.gat,Isinlife,1
+8,gefg_cas04.gat,Berigel,1
+9,gefg_cas05.gat,Melsedetsu,1
+10,payg_cas01.gat,Mingting,1
+11,payg_cas02.gat,Tiantan,1
+12,payg_cas03.gat,Fuying,1
+13,payg_cas04.gat,Honglou,1
+14,payg_cas05.gat,Zhulinxian,1
+15,prtg_cas01.gat,Creamhilt,1
+16,prtg_cas02.gat,Sbanhealt,1
+17,prtg_cas03.gat,Lazrigees,1
+18,prtg_cas04.gat,Squagul,1
+19,prtg_cas05.gat,Guindull,1
+20,nguild_alde.gat,Novice Castle 1,1
+21,nguild_gef.gat,Novice Castle 2,1
+22,nguild_pay.gat,Novice Castle 3,1
23,nguild_prt.gat,Novice Castle 4,1 \ No newline at end of file
diff --git a/db/const.txt b/db/const.txt
index af1e37b06..acad5e67a 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -1,237 +1,237 @@
-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_SuperNovice 23
-Job_Novice_High 24
-Job_Swordman_High 25
-Job_Mage_High 26
-Job_Archer_High 27
-Job_Acolyte_High 28
-Job_Merchant_High 29
-Job_Thief_High 30
-Job_Lord_Knight 31
-Job_High_Priest 32
-Job_High_Wizard 33
-Job_Whitesmith 34
-Job_Sniper 35
-Job_Assassin_Cross 36
-Job_Lord_Knight2 37
-Job_Paladin 38
-Job_Champion 39
-Job_Professor 40
-Job_Stalker 41
-Job_Creator 42
-Job_Clown 43
-Job_Gypsy 44
-Job_Paladin2 45
-Job_Baby 46
-Job_Baby_Swordman 47
-Job_Baby_Mage 48
-Job_Baby_Archer 49
-Job_Baby_Acolyte 50
-Job_Baby_Merchant 51
-Job_Baby_Thief 52
-Job_Baby_Knight 53
-Job_Baby_Priest 54
-Job_Baby_Wizard 55
-Job_Baby_Blacksmith 56
-Job_Baby_Hunter 57
-Job_Baby_Assassin 58
-Job_Baby_Knight2 59
-Job_Baby_Crusader 60
-Job_Baby_Monk 61
-Job_Baby_Sage 62
-Job_Baby_Rogue 63
-Job_Baby_Alchem 64
-Job_Baby_Bard 65
-Job_Baby_Dancer 66
-Job_Baby_Crusader2 67
-Job_Super_Baby 68
-
-
-
-mf_nomemo 0
-mf_noteleport 1
-mf_nosave 2
-mf_nobranch 3
-mf_nopenalty 4
-mf_pvp 5
-mf_pvp_noparty 6
-mf_pvp_noguild 7
-mf_gvg 8
-mf_gvg_noparty 9
-mf_nozenypenalty 10
-
-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
-NextBaseExp 22 1
-NextJobExp 23 1
-Hp 5 1
-MaxHp 6 1
-Sp 7 1
-MaxSp 8 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
-bMdef 47
-bMdef2 48
-bHit 49
-bFlee 50
-bFlee2 51
-bCritical 52
-bAspd 53
-bFame 57
-bUnbreakable 58
-
-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
-bMagicSubRace 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
-bDisguise 1077
-
-bRestartFullRecover 2000
-bNoCastCancel 2001
-bNoSizeFix 2002
-bNoMagicDamage 2003
-bNoWeaponDamage 2004
-bNoGemStone 2005
-bNoCastCancel2 2006
-bInfiniteEndure 2007
-
-Eff_Stone 0
-Eff_Freeze 1
-Eff_Stan 2
-Eff_Sleep 3
-Eff_Poison 4
-Eff_Curse 5
-Eff_Silence 6
-Eff_Confusion 7
-Eff_Blind 8
-
-SC_Stone 128
-SC_Freeze 129
-SC_Stan 130
-SC_Sleep 131
-SC_Poison 132
-SC_Curse 133
-SC_Silence 134
-SC_Confusion 135
-SC_Blind 136
-SC_SpeedPot0 37
-SC_SpeedPot1 38
-SC_SpeedPot2 39
-SC_ATKPot 185
-SC_MATKPot 186
+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_SuperNovice 23
+Job_Novice_High 24
+Job_Swordman_High 25
+Job_Mage_High 26
+Job_Archer_High 27
+Job_Acolyte_High 28
+Job_Merchant_High 29
+Job_Thief_High 30
+Job_Lord_Knight 31
+Job_High_Priest 32
+Job_High_Wizard 33
+Job_Whitesmith 34
+Job_Sniper 35
+Job_Assassin_Cross 36
+Job_Lord_Knight2 37
+Job_Paladin 38
+Job_Champion 39
+Job_Professor 40
+Job_Stalker 41
+Job_Creator 42
+Job_Clown 43
+Job_Gypsy 44
+Job_Paladin2 45
+Job_Baby 46
+Job_Baby_Swordman 47
+Job_Baby_Mage 48
+Job_Baby_Archer 49
+Job_Baby_Acolyte 50
+Job_Baby_Merchant 51
+Job_Baby_Thief 52
+Job_Baby_Knight 53
+Job_Baby_Priest 54
+Job_Baby_Wizard 55
+Job_Baby_Blacksmith 56
+Job_Baby_Hunter 57
+Job_Baby_Assassin 58
+Job_Baby_Knight2 59
+Job_Baby_Crusader 60
+Job_Baby_Monk 61
+Job_Baby_Sage 62
+Job_Baby_Rogue 63
+Job_Baby_Alchem 64
+Job_Baby_Bard 65
+Job_Baby_Dancer 66
+Job_Baby_Crusader2 67
+Job_Super_Baby 68
+
+
+
+mf_nomemo 0
+mf_noteleport 1
+mf_nosave 2
+mf_nobranch 3
+mf_nopenalty 4
+mf_pvp 5
+mf_pvp_noparty 6
+mf_pvp_noguild 7
+mf_gvg 8
+mf_gvg_noparty 9
+mf_nozenypenalty 10
+
+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
+NextBaseExp 22 1
+NextJobExp 23 1
+Hp 5 1
+MaxHp 6 1
+Sp 7 1
+MaxSp 8 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
+bMdef 47
+bMdef2 48
+bHit 49
+bFlee 50
+bFlee2 51
+bCritical 52
+bAspd 53
+bFame 57
+bUnbreakable 58
+
+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
+bMagicSubRace 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
+bDisguise 1077
+
+bRestartFullRecover 2000
+bNoCastCancel 2001
+bNoSizeFix 2002
+bNoMagicDamage 2003
+bNoWeaponDamage 2004
+bNoGemStone 2005
+bNoCastCancel2 2006
+bInfiniteEndure 2007
+
+Eff_Stone 0
+Eff_Freeze 1
+Eff_Stan 2
+Eff_Sleep 3
+Eff_Poison 4
+Eff_Curse 5
+Eff_Silence 6
+Eff_Confusion 7
+Eff_Blind 8
+
+SC_Stone 128
+SC_Freeze 129
+SC_Stan 130
+SC_Sleep 131
+SC_Poison 132
+SC_Curse 133
+SC_Silence 134
+SC_Confusion 135
+SC_Blind 136
+SC_SpeedPot0 37
+SC_SpeedPot1 38
+SC_SpeedPot2 39
+SC_ATKPot 185
+SC_MATKPot 186
diff --git a/db/create_arrow_db.txt b/db/create_arrow_db.txt
index be7395b14..f5bd1077f 100644
--- a/db/create_arrow_db.txt
+++ b/db/create_arrow_db.txt
@@ -1,99 +1,99 @@
-//SourceID,MakeID1,MakeNum1,MakeID2,MakeNum2,MakeID3,MakeNum3,MakeID4,MakeNum4,MakeID5,MakeNum5
-
-603,1764,50,1768,50
-604,1769,40
-609,1761,40
-713,1770,2
-714,1757,600,1769,600,1765,600
-715,1756,10,1768,1
-716,1762,10,1763,1,1761,1
-717,1754,10,1759,1
-724,1761,50,1768,10
-733,1764,50
-756,1765,50
-757,1753,200,1758,5
-902,1750,7
-904,1762,3
-909,1750,4
-910,1770,12
-911,1753,8
-912,1751,50
-913,1767,1
-920,1770,15
-922,1770,30,1753,5,1756,1
-923,1767,20,1760,10,1758,5
-937,1767,1
-939,1762,1
-947,1770,35
-952,1750,50
-956,1770,80,1754,5
-957,1762,1,1767,1
-958,1767,5
-959,1763,1
-968,1765,1,1758,5
-969,1760,50,1765,50
-984,1765,250
-985,1753,1000,1758,50
-990,1752,200
-991,1754,50
-992,1755,50
-993,1756,50
-994,1752,600,1769,5
-995,1754,150,1759,5
-996,1755,150,1768,5
-997,1756,150,1760,5
-998,1770,100
-999,1753,100
-1000,1760,30
-1001,1760,10
-1002,1770,50
-1003,1767,8
-1010,1770,50
-1011,1770,200,1751,40
-1018,1770,50,1756,2
-1019,1750,40
-1021,1770,40,1767,2
-1027,1750,70,1756,1
-1031,1764,1
-1035,1765,1,1770,50
-1038,1761,2,1770,50
-1041,1770,80
-1043,1753,10
-1044,1762,5
-1053,1753,20,1754,10
-1063,1764,2,1751,40
-1064,1770,100,1753,50
-1066,1750,20
-1067,1750,20
-1068,1750,20
-1095,1768,5,1750,100
-1098,1753,50
-2257,1751,1000
-2281,1753,200,1769,40
-2288,1764,200,1753,300
-2292,1753,200,1758,40
-2319,1760,1000
-2328,1750,700,1770,500
-2329,1750,1000,1770,700
-2332,1751,700
-2333,1751,1000,1757,10
-2408,1770,700,1753,50
-2618,1755,50,1753,100,1764,10
-5014,1754,200,1753,200
-7002,1753,30,1762,5
-7008,1758,2
-7010,1753,250,1763,1
-7018,1769,1000
-7019,1767,1000
-7020,1761,1000
-7021,1760,200
-7022,1765,1000
-7023,1764,600,1767,200
-7024,1764,600,1761,200
-7025,1758,800,1769,400,1768,800
-7026,1765,50
-7027,1767,100
-7035,1752,1000
-7036,1754,100
-7053,1751,40
-
+//SourceID,MakeID1,MakeNum1,MakeID2,MakeNum2,MakeID3,MakeNum3,MakeID4,MakeNum4,MakeID5,MakeNum5
+
+603,1764,50,1768,50
+604,1769,40
+609,1761,40
+713,1770,2
+714,1757,600,1769,600,1765,600
+715,1756,10,1768,1
+716,1762,10,1763,1,1761,1
+717,1754,10,1759,1
+724,1761,50,1768,10
+733,1764,50
+756,1765,50
+757,1753,200,1758,5
+902,1750,7
+904,1762,3
+909,1750,4
+910,1770,12
+911,1753,8
+912,1751,50
+913,1767,1
+920,1770,15
+922,1770,30,1753,5,1756,1
+923,1767,20,1760,10,1758,5
+937,1767,1
+939,1762,1
+947,1770,35
+952,1750,50
+956,1770,80,1754,5
+957,1762,1,1767,1
+958,1767,5
+959,1763,1
+968,1765,1,1758,5
+969,1760,50,1765,50
+984,1765,250
+985,1753,1000,1758,50
+990,1752,200
+991,1754,50
+992,1755,50
+993,1756,50
+994,1752,600,1769,5
+995,1754,150,1759,5
+996,1755,150,1768,5
+997,1756,150,1760,5
+998,1770,100
+999,1753,100
+1000,1760,30
+1001,1760,10
+1002,1770,50
+1003,1767,8
+1010,1770,50
+1011,1770,200,1751,40
+1018,1770,50,1756,2
+1019,1750,40
+1021,1770,40,1767,2
+1027,1750,70,1756,1
+1031,1764,1
+1035,1765,1,1770,50
+1038,1761,2,1770,50
+1041,1770,80
+1043,1753,10
+1044,1762,5
+1053,1753,20,1754,10
+1063,1764,2,1751,40
+1064,1770,100,1753,50
+1066,1750,20
+1067,1750,20
+1068,1750,20
+1095,1768,5,1750,100
+1098,1753,50
+2257,1751,1000
+2281,1753,200,1769,40
+2288,1764,200,1753,300
+2292,1753,200,1758,40
+2319,1760,1000
+2328,1750,700,1770,500
+2329,1750,1000,1770,700
+2332,1751,700
+2333,1751,1000,1757,10
+2408,1770,700,1753,50
+2618,1755,50,1753,100,1764,10
+5014,1754,200,1753,200
+7002,1753,30,1762,5
+7008,1758,2
+7010,1753,250,1763,1
+7018,1769,1000
+7019,1767,1000
+7020,1761,1000
+7021,1760,200
+7022,1765,1000
+7023,1764,600,1767,200
+7024,1764,600,1761,200
+7025,1758,800,1769,400,1768,800
+7026,1765,50
+7027,1767,100
+7035,1752,1000
+7036,1754,100
+7053,1751,40
+
diff --git a/db/exp.txt b/db/exp.txt
index aea8b2a0b..b089fa85d 100644
--- a/db/exp.txt
+++ b/db/exp.txt
@@ -1,99 +1,99 @@
-9,9,9,9,10,10,10,10,30,144,30,11,60,288
-16,16,16,16,18,18,18,18,43,184,43,20,86,368
-25,25,25,25,28,28,28,28,58,284,58,31,116,568
-36,36,36,36,40,40,40,40,76,348,76,44,152,696
-77,77,77,77,85,85,85,91,116,603,116,100,232,1206
-112,112,112,112,123,123,123,151,180,887,180,166,360,1774
-153,153,153,153,168,168,168,205,220,1096,220,226,440,2192
-200,200,200,200,220,220,220,268,272,1598,272,295,544,3196
-253,253,253,253,278,278,278,340,336,2540,336,374,672,5080
-320,320,320,320,400,400,400,0,520,3676,520,0,1040,7352
-385,385,385,385,508,508,508,0,604,4290,604,0,1208,8580
-490,490,490,490,613,613,613,0,699,4946,699,0,1398,9892
-585,585,585,585,731,731,731,0,802,6679,802,0,1604,13358
-700,700,700,700,875,875,875,0,948,9492,948,0,1896,18984
-830,830,830,830,1038,1038,1038,0,1125,12770,1125,0,2250,31925
-970,970,970,970,1213,1213,1213,0,1668,14344,1668,0,3336,35860
-1120,1120,1120,1120,1400,1400,1400,0,1937,16005,1937,0,3874,40013
-1260,1260,1260,1260,1575,1575,1575,0,2226,20642,2226,0,4452,51605
-1420,1420,1420,1420,1775,1775,1775,0,3040,27434,3040,0,6080,68585
-1620,1620,1620,1620,2268,2268,2268,0,3988,35108,3988,0,7976,87770
-1860,1860,1860,1860,2604,2604,2604,0,5564,38577,5564,0,11128,96443
-1990,1990,1990,1990,2786,2786,2786,0,6272,42206,6272,0,12544,105515
-2240,2240,2240,2240,3136,3136,3136,0,7021,52708,7021,0,14042,131770
-2504,2504,2504,2504,3506,3506,3506,0,9114,66971,9114,0,18228,167428
-2950,2950,2950,2950,4130,4130,4130,0,11473,82688,11473,0,28683,206720
-3426,3426,3426,3426,4796,4796,4796,0,15290,89544,15290,0,38225,223860
-3934,3934,3934,3934,5508,5508,5508,0,16891,96669,16891,0,42228,241673
-4474,4474,4474,4474,6264,6264,6264,0,18570,117821,18570,0,46425,294553
-6889,6889,6889,6889,9645,9645,9645,0,23229,144921,23229,0,58073,362303
-7995,7995,7995,7995,12392,12392,12392,0,28359,174201,28359,0,70898,479053
-9174,9174,9174,9174,14220,14220,14220,0,36478,186677,36478,0,91195,513362
-10425,10425,10425,10425,16159,16159,16159,0,39716,199584,39716,0,99290,548856
-11748,11748,11748,11748,18209,18209,18209,0,43088,238617,43088,0,107720,656197
-13967,13967,13967,13967,21649,21649,21649,0,52417,286366,52417,0,131043,787507
-15775,15775,15775,15775,24451,24451,24451,0,62495,337147,62495,0,156238,927154
-17678,17678,17678,17678,27401,27401,27401,0,78160,358435,78160,0,195408,985696
-19677,19677,19677,19677,30499,30499,30499,0,84175,380376,84175,0,210430,1046034
-21773,21773,21773,21773,33748,33748,33748,0,90404,447685,90404,0,226010,1231134
-30543,30543,30543,30543,47342,47342,47342,0,107611,526989,107611,0,269028,1449220
-34212,34212,34212,34212,58160,58160,58160,0,125915,610246,125915,0,314788,1678177
-38065,38065,38065,38065,64711,64711,64711,0,153941,644736,153941,0,384853,1773024
-42102,42102,42102,42102,71573,71573,71573,0,191781,793535,191781,0,479453,2182221
-46323,46323,46323,46323,78749,78749,78749,0,204351,921810,204351,0,510878,2534978
-53026,53026,53026,53026,90144,90144,90144,0,248352,1106758,248352,0,620880,3043585
-58419,58419,58419,58419,99312,99312,99312,0,286212,1260955,286212,0,715530,3782865
-64041,64041,64041,64041,108870,108870,108870,0,386371,1487304,386371,0,965928,4461912
-69892,69892,69892,69892,118816,118816,118816,0,409795,1557657,409795,0,1024488,4672971
-75973,75973,75973,75973,129154,129154,129154,0,482092,1990632,482092,0,1205230,5971896
-102468,102468,102468,102468,174196,174196,174196,0,509596,2083386,509596,0,1273990,6250158
-115254,115254,115254,115254,213220,213220,213220,0,0,0,982092,0,0,6875174
-128692,128692,128692,128692,238080,238080,238080,0,0,0,992092,0,0,7562691
-142784,142784,142784,142784,264150,264150,264150,0,0,0,1002092,0,0,8318960
-157528,157528,157528,157528,291427,291427,291427,0,0,0,1012092,0,0,9150856
-178184,178184,178184,178184,329640,329640,329640,0,0,0,1022092,0,0,10065942
-196300,196300,196300,196300,363155,363155,363155,0,0,0,1032092,0,0,11877812
-215198,215198,215198,215198,398116,398116,398116,0,0,0,1042092,0,0,14015818
-234879,234879,234879,234879,434526,434526,434526,0,0,0,1052092,0,0,16538655
-255341,255341,255341,255341,472381,472381,472381,0,0,0,1062092,0,0,19515624
-330188,330188,330188,330188,610848,610848,610848,0,0,0,1072092,0,0,23028437
-365914,365914,365914,365914,731828,731828,731828,0,0,0,1082092,0,0,28094693
-403224,403224,403224,403224,806448,806448,806448,0,0,0,1092092,0,0,34275525
-442116,442116,442116,442116,884232,884232,884232,0,0,0,1102092,0,0,41816141
-482590,482590,482590,482590,965180,965180,965180,0,0,0,1112092,0,0,51015692
-536948,536948,536948,536948,1073896,1073896,1073896,0,0,0,1122092,0,0,62239144
-585191,585191,585191,585191,1170382,1170382,1170382,0,0,0,1132092,0,0,79666104
-635278,635278,635278,635278,1270556,1270556,1270556,0,0,0,1142092,0,0,101972614
-687211,687211,687211,687211,1374422,1374422,1374422,0,0,0,1152092,0,0,130524946
-740988,740988,740988,740988,1481976,1481976,1481976,0,0,0,1162092,0,0,167071930
-925400,925400,925400,925400,1850800,1850800,1850800,0,0,0,1172092,0,0,213852071
-1473746,1473746,1473746,1473746,3389616,3389616,3389616,0,0,0,0,0,0,0
-1594058,1594058,1594058,1594058,3666333,3666333,3666333,0,0,0,0,0,0,0
-1718928,1718928,1718928,1718928,3953534,3953534,3953534,0,0,0,0,0,0,0
-1848355,1848355,1848355,1848355,4251217,4251217,4251217,0,0,0,0,0,0,0
-1982340,1982340,1982340,1982340,4559382,4559382,4559382,0,0,0,0,0,0,0
-2230113,2230113,2230113,2230113,5129260,5129260,5129260,0,0,0,0,0,0,0
-2386162,2386162,2386162,2386162,5488173,5488173,5488173,0,0,0,0,0,0,0
-2547417,2547417,2547417,2547417,5859059,5859059,5859059,0,0,0,0,0,0,0
-2713878,2713878,2713878,2713878,6241919,6241919,6241919,0,0,0,0,0,0,0
-3206160,3206160,3206160,3206160,7374168,7374168,7374168,0,0,0,0,0,0,0
-3681024,3681024,3681024,3681024,9570662,9570662,9570662,0,0,0,0,0,0,0
-4022472,4022472,4022472,4022472,10458427,10458427,10458427,0,0,0,0,0,0,0
-4377024,4377024,4377024,4377024,11380262,11380262,11380262,0,0,0,0,0,0,0
-4744680,4744680,4744680,4744680,12336168,12336168,12336168,0,0,0,0,0,0,0
-5125440,5125440,5125440,5125440,13326144,13326144,13326144,0,0,0,0,0,0,0
-5767272,5767272,5767272,5767272,14994907,14994907,14994907,0,0,0,0,0,0,0
-6204000,6204000,6204000,6204000,16130400,16130400,16130400,0,0,0,0,0,0,0
-6655464,6655464,6655464,6655464,17304200,17304200,17304200,0,0,0,0,0,0,0
-7121664,7121664,7121664,7121664,18516326,18516326,18516326,0,0,0,0,0,0,0
-7602600,7602600,7602600,7602600,19766760,19766760,19766760,0,0,0,0,0,0,0
-9738720,9738720,9738720,9738720,29216160,29216160,29216160,0,0,0,0,0,0,0
-11649960,11649960,11649960,11649960,34949880,34949880,34949880,0,0,0,0,0,0,0
-13643520,13643520,13643520,13643520,40930560,40930560,40930560,0,0,0,0,0,0,0
-18339300,18339300,18339300,18339300,55017900,55017900,55017900,0,0,0,0,0,0,0
-23836800,23836800,23836800,23836800,71510400,71510400,71510400,0,0,0,0,0,0,0
-35658000,35658000,35658000,35658000,106974000,106974000,106974000,0,0,0,0,0,0,0
-48687000,48687000,48687000,48687000,146061000,146061000,146061000,0,0,0,0,0,0,0
-58135000,58135000,58135000,58135000,174405000,174405000,174405000,0,0,0,0,0,0,0
-99999999,99999999,99999999,99999999,343210000,343210000,343210000,0,0,0,0,0,0,0
-0,0,0,0,0,0,0,0,0,0,0,0,0,0
+9,9,9,9,10,10,10,10,30,144,30,11,60,288
+16,16,16,16,18,18,18,18,43,184,43,20,86,368
+25,25,25,25,28,28,28,28,58,284,58,31,116,568
+36,36,36,36,40,40,40,40,76,348,76,44,152,696
+77,77,77,77,85,85,85,91,116,603,116,100,232,1206
+112,112,112,112,123,123,123,151,180,887,180,166,360,1774
+153,153,153,153,168,168,168,205,220,1096,220,226,440,2192
+200,200,200,200,220,220,220,268,272,1598,272,295,544,3196
+253,253,253,253,278,278,278,340,336,2540,336,374,672,5080
+320,320,320,320,400,400,400,0,520,3676,520,0,1040,7352
+385,385,385,385,508,508,508,0,604,4290,604,0,1208,8580
+490,490,490,490,613,613,613,0,699,4946,699,0,1398,9892
+585,585,585,585,731,731,731,0,802,6679,802,0,1604,13358
+700,700,700,700,875,875,875,0,948,9492,948,0,1896,18984
+830,830,830,830,1038,1038,1038,0,1125,12770,1125,0,2250,31925
+970,970,970,970,1213,1213,1213,0,1668,14344,1668,0,3336,35860
+1120,1120,1120,1120,1400,1400,1400,0,1937,16005,1937,0,3874,40013
+1260,1260,1260,1260,1575,1575,1575,0,2226,20642,2226,0,4452,51605
+1420,1420,1420,1420,1775,1775,1775,0,3040,27434,3040,0,6080,68585
+1620,1620,1620,1620,2268,2268,2268,0,3988,35108,3988,0,7976,87770
+1860,1860,1860,1860,2604,2604,2604,0,5564,38577,5564,0,11128,96443
+1990,1990,1990,1990,2786,2786,2786,0,6272,42206,6272,0,12544,105515
+2240,2240,2240,2240,3136,3136,3136,0,7021,52708,7021,0,14042,131770
+2504,2504,2504,2504,3506,3506,3506,0,9114,66971,9114,0,18228,167428
+2950,2950,2950,2950,4130,4130,4130,0,11473,82688,11473,0,28683,206720
+3426,3426,3426,3426,4796,4796,4796,0,15290,89544,15290,0,38225,223860
+3934,3934,3934,3934,5508,5508,5508,0,16891,96669,16891,0,42228,241673
+4474,4474,4474,4474,6264,6264,6264,0,18570,117821,18570,0,46425,294553
+6889,6889,6889,6889,9645,9645,9645,0,23229,144921,23229,0,58073,362303
+7995,7995,7995,7995,12392,12392,12392,0,28359,174201,28359,0,70898,479053
+9174,9174,9174,9174,14220,14220,14220,0,36478,186677,36478,0,91195,513362
+10425,10425,10425,10425,16159,16159,16159,0,39716,199584,39716,0,99290,548856
+11748,11748,11748,11748,18209,18209,18209,0,43088,238617,43088,0,107720,656197
+13967,13967,13967,13967,21649,21649,21649,0,52417,286366,52417,0,131043,787507
+15775,15775,15775,15775,24451,24451,24451,0,62495,337147,62495,0,156238,927154
+17678,17678,17678,17678,27401,27401,27401,0,78160,358435,78160,0,195408,985696
+19677,19677,19677,19677,30499,30499,30499,0,84175,380376,84175,0,210430,1046034
+21773,21773,21773,21773,33748,33748,33748,0,90404,447685,90404,0,226010,1231134
+30543,30543,30543,30543,47342,47342,47342,0,107611,526989,107611,0,269028,1449220
+34212,34212,34212,34212,58160,58160,58160,0,125915,610246,125915,0,314788,1678177
+38065,38065,38065,38065,64711,64711,64711,0,153941,644736,153941,0,384853,1773024
+42102,42102,42102,42102,71573,71573,71573,0,191781,793535,191781,0,479453,2182221
+46323,46323,46323,46323,78749,78749,78749,0,204351,921810,204351,0,510878,2534978
+53026,53026,53026,53026,90144,90144,90144,0,248352,1106758,248352,0,620880,3043585
+58419,58419,58419,58419,99312,99312,99312,0,286212,1260955,286212,0,715530,3782865
+64041,64041,64041,64041,108870,108870,108870,0,386371,1487304,386371,0,965928,4461912
+69892,69892,69892,69892,118816,118816,118816,0,409795,1557657,409795,0,1024488,4672971
+75973,75973,75973,75973,129154,129154,129154,0,482092,1990632,482092,0,1205230,5971896
+102468,102468,102468,102468,174196,174196,174196,0,509596,2083386,509596,0,1273990,6250158
+115254,115254,115254,115254,213220,213220,213220,0,0,0,982092,0,0,6875174
+128692,128692,128692,128692,238080,238080,238080,0,0,0,992092,0,0,7562691
+142784,142784,142784,142784,264150,264150,264150,0,0,0,1002092,0,0,8318960
+157528,157528,157528,157528,291427,291427,291427,0,0,0,1012092,0,0,9150856
+178184,178184,178184,178184,329640,329640,329640,0,0,0,1022092,0,0,10065942
+196300,196300,196300,196300,363155,363155,363155,0,0,0,1032092,0,0,11877812
+215198,215198,215198,215198,398116,398116,398116,0,0,0,1042092,0,0,14015818
+234879,234879,234879,234879,434526,434526,434526,0,0,0,1052092,0,0,16538655
+255341,255341,255341,255341,472381,472381,472381,0,0,0,1062092,0,0,19515624
+330188,330188,330188,330188,610848,610848,610848,0,0,0,1072092,0,0,23028437
+365914,365914,365914,365914,731828,731828,731828,0,0,0,1082092,0,0,28094693
+403224,403224,403224,403224,806448,806448,806448,0,0,0,1092092,0,0,34275525
+442116,442116,442116,442116,884232,884232,884232,0,0,0,1102092,0,0,41816141
+482590,482590,482590,482590,965180,965180,965180,0,0,0,1112092,0,0,51015692
+536948,536948,536948,536948,1073896,1073896,1073896,0,0,0,1122092,0,0,62239144
+585191,585191,585191,585191,1170382,1170382,1170382,0,0,0,1132092,0,0,79666104
+635278,635278,635278,635278,1270556,1270556,1270556,0,0,0,1142092,0,0,101972614
+687211,687211,687211,687211,1374422,1374422,1374422,0,0,0,1152092,0,0,130524946
+740988,740988,740988,740988,1481976,1481976,1481976,0,0,0,1162092,0,0,167071930
+925400,925400,925400,925400,1850800,1850800,1850800,0,0,0,1172092,0,0,213852071
+1473746,1473746,1473746,1473746,3389616,3389616,3389616,0,0,0,0,0,0,0
+1594058,1594058,1594058,1594058,3666333,3666333,3666333,0,0,0,0,0,0,0
+1718928,1718928,1718928,1718928,3953534,3953534,3953534,0,0,0,0,0,0,0
+1848355,1848355,1848355,1848355,4251217,4251217,4251217,0,0,0,0,0,0,0
+1982340,1982340,1982340,1982340,4559382,4559382,4559382,0,0,0,0,0,0,0
+2230113,2230113,2230113,2230113,5129260,5129260,5129260,0,0,0,0,0,0,0
+2386162,2386162,2386162,2386162,5488173,5488173,5488173,0,0,0,0,0,0,0
+2547417,2547417,2547417,2547417,5859059,5859059,5859059,0,0,0,0,0,0,0
+2713878,2713878,2713878,2713878,6241919,6241919,6241919,0,0,0,0,0,0,0
+3206160,3206160,3206160,3206160,7374168,7374168,7374168,0,0,0,0,0,0,0
+3681024,3681024,3681024,3681024,9570662,9570662,9570662,0,0,0,0,0,0,0
+4022472,4022472,4022472,4022472,10458427,10458427,10458427,0,0,0,0,0,0,0
+4377024,4377024,4377024,4377024,11380262,11380262,11380262,0,0,0,0,0,0,0
+4744680,4744680,4744680,4744680,12336168,12336168,12336168,0,0,0,0,0,0,0
+5125440,5125440,5125440,5125440,13326144,13326144,13326144,0,0,0,0,0,0,0
+5767272,5767272,5767272,5767272,14994907,14994907,14994907,0,0,0,0,0,0,0
+6204000,6204000,6204000,6204000,16130400,16130400,16130400,0,0,0,0,0,0,0
+6655464,6655464,6655464,6655464,17304200,17304200,17304200,0,0,0,0,0,0,0
+7121664,7121664,7121664,7121664,18516326,18516326,18516326,0,0,0,0,0,0,0
+7602600,7602600,7602600,7602600,19766760,19766760,19766760,0,0,0,0,0,0,0
+9738720,9738720,9738720,9738720,29216160,29216160,29216160,0,0,0,0,0,0,0
+11649960,11649960,11649960,11649960,34949880,34949880,34949880,0,0,0,0,0,0,0
+13643520,13643520,13643520,13643520,40930560,40930560,40930560,0,0,0,0,0,0,0
+18339300,18339300,18339300,18339300,55017900,55017900,55017900,0,0,0,0,0,0,0
+23836800,23836800,23836800,23836800,71510400,71510400,71510400,0,0,0,0,0,0,0
+35658000,35658000,35658000,35658000,106974000,106974000,106974000,0,0,0,0,0,0,0
+48687000,48687000,48687000,48687000,146061000,146061000,146061000,0,0,0,0,0,0,0
+58135000,58135000,58135000,58135000,174405000,174405000,174405000,0,0,0,0,0,0,0
+99999999,99999999,99999999,99999999,343210000,343210000,343210000,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/exp2.txt b/db/exp2.txt
index 0c81931bb..b9cbfeb3d 100644
--- a/db/exp2.txt
+++ b/db/exp2.txt
@@ -1,99 +1,99 @@
-10,9,9,11,60,288,144
-18,16,16,20,86,368,184
-28,25,25,31,116,568,284
-40,36,36,44,152,696,348
-85,77,77,100,232,1206,603
-123,112,112,166,360,1774,887
-168,153,153,226,440,2192,1096
-220,200,200,295,544,3196,1598
-278,253,253,374,672,5080,2540
-400,320,320,0,1040,7352,3676
-481,385,385,0,1208,8580,4290
-613,490,490,0,1398,9892,4946
-731,585,585,0,1604,13358,6679
-875,700,700,0,1896,18984,9492
-1038,830,830,0,2250,31925,12770
-1213,970,970,0,3336,35860,14344
-1400,1120,1120,0,3874,40013,16005
-1575,1260,1260,0,4452,51605,20642
-1775,1420,1420,0,6080,68585,27434
-2268,1620,1620,0,7976,87770,35108
-2604,1860,1860,0,11128,96443,38577
-2786,1990,1990,0,12544,105515,42206
-3136,2240,2240,0,14042,131770,52708
-3506,2504,2504,0,18228,167428,66971
-4136,2950,2950,0,28683,206720,82688
-4796,3426,3426,0,38225,223860,89544
-5508,3934,3934,0,42228,241673,96669
-6264,4474,4474,0,46425,294553,117821
-9645,6889,6889,0,58073,362303,144921
-12392,7995,7995,0,70898,479053,174201
-14220,9174,9174,0,91195,548856,186677
-16159,10425,10425,0,99290,656197,199584
-18209,11748,11748,0,107720,787507,238617
-21649,13967,13967,0,131043,927154,286366
-24451,15775,15775,0,156238,985696,337147
-27401,17678,17678,0,195400,1046034,358435
-30499,19677,19677,0,210438,1231134,380376
-33748,21773,21773,0,226010,1449220,447685
-47342,30543,30543,0,269028,1678177,526989
-58160,34212,34212,0,314788,1773024,610246
-64711,38065,38065,0,384853,2182221,644736
-71573,42102,42102,0,479453,2534978,793535
-78749,46323,46323,0,510878,3043585,921810
-90144,53026,53026,0,620880,3782865,1106758
-99312,58419,58419,0,715530,4461912,1260955
-108870,64041,64041,0,965928,4672971,1487304
-118816,69892,69892,0,1024488,5971896,1557657
-129154,75973,75973,0,1205230,6250158,1990632
-174196,102468,102468,0,1273990,6875174,2083386
-213220,115254,115254,0,0,7562691,0
-238080,128692,128692,0,0,8318960,0
-264150,142784,142784,0,0,9150856,0
-291427,157528,157528,0,0,10065942,0
-329640,178184,178184,0,0,11877812,0
-363155,196300,196300,0,0,14015818,0
-398116,215198,215198,0,0,16538665,0
-434526,234879,234879,0,0,19515624,0
-472381,255341,255341,0,0,23028437,0
-610848,330188,330188,0,0,28094693,0
-741828,365914,365914,0,0,34275525,0
-806448,403224,403224,0,0,41816141,0
-884232,442116,442116,0,0,51015692,0
-965180,482590,482590,0,0,62239144,0
-1073896,536948,536948,0,0,79666104,0
-1170382,585191,585191,0,0,101972614,0
-1270556,635278,635278,0,0,130624946,0
-1374422,687211,687211,0,0,167071930,0
-1481976,740988,740988,0,0,213852071,0
-1850800,925400,925400,0,0,213852071,0
-3389616,1473746,1473746,0,0,0,0
-3666333,1594058,1594058,0,0,0,0
-3953534,1718928,1718928,0,0,0,0
-4251217,1848355,1848355,0,0,0,0
-4559382,1982340,1982340,0,0,0,0
-5129260,2230113,2230113,0,0,0,0
-5488173,2386162,2386162,0,0,0,0
-5859059,2547417,2547417,0,0,0,0
-6241919,2713878,2713878,0,0,0,0
-7374168,3206160,3206160,0,0,0,0
-9570622,3681024,3681024,0,0,0,0
-10458427,4022472,4022472,0,0,0,0
-11380262,4377024,4377024,0,0,0,0
-12336168,4744680,4744680,0,0,0,0
-13326144,5125440,5125440,0,0,0,0
-14994907,5767272,5767272,0,0,0,0
-16130400,6204000,6204000,0,0,0,0
-17304206,6655464,6655464,0,0,0,0
-18586326,7121664,7121664,0,0,0,0
-19766760,7602600,7602600,0,0,0,0
-29216160,9738720,9738720,0,0,0,0
-34949880,11649960,11649960,0,0,0,0
-40930560,13643520,13643520,0,0,0,0
-55017900,18339300,18339300,0,0,0,0
-71510400,23836800,23836800,0,0,0,0
-106974000,35658000,35658000,0,0,0,0
-146061000,48687000,48687000,0,0,0,0
-174405000,58135000,58135000,0,0,0,0
-299999999,99999999,99999999,0,0,0,0
-0,0,0,0,0,0,0,0
+10,9,9,11,60,288,144
+18,16,16,20,86,368,184
+28,25,25,31,116,568,284
+40,36,36,44,152,696,348
+85,77,77,100,232,1206,603
+123,112,112,166,360,1774,887
+168,153,153,226,440,2192,1096
+220,200,200,295,544,3196,1598
+278,253,253,374,672,5080,2540
+400,320,320,0,1040,7352,3676
+481,385,385,0,1208,8580,4290
+613,490,490,0,1398,9892,4946
+731,585,585,0,1604,13358,6679
+875,700,700,0,1896,18984,9492
+1038,830,830,0,2250,31925,12770
+1213,970,970,0,3336,35860,14344
+1400,1120,1120,0,3874,40013,16005
+1575,1260,1260,0,4452,51605,20642
+1775,1420,1420,0,6080,68585,27434
+2268,1620,1620,0,7976,87770,35108
+2604,1860,1860,0,11128,96443,38577
+2786,1990,1990,0,12544,105515,42206
+3136,2240,2240,0,14042,131770,52708
+3506,2504,2504,0,18228,167428,66971
+4136,2950,2950,0,28683,206720,82688
+4796,3426,3426,0,38225,223860,89544
+5508,3934,3934,0,42228,241673,96669
+6264,4474,4474,0,46425,294553,117821
+9645,6889,6889,0,58073,362303,144921
+12392,7995,7995,0,70898,479053,174201
+14220,9174,9174,0,91195,548856,186677
+16159,10425,10425,0,99290,656197,199584
+18209,11748,11748,0,107720,787507,238617
+21649,13967,13967,0,131043,927154,286366
+24451,15775,15775,0,156238,985696,337147
+27401,17678,17678,0,195400,1046034,358435
+30499,19677,19677,0,210438,1231134,380376
+33748,21773,21773,0,226010,1449220,447685
+47342,30543,30543,0,269028,1678177,526989
+58160,34212,34212,0,314788,1773024,610246
+64711,38065,38065,0,384853,2182221,644736
+71573,42102,42102,0,479453,2534978,793535
+78749,46323,46323,0,510878,3043585,921810
+90144,53026,53026,0,620880,3782865,1106758
+99312,58419,58419,0,715530,4461912,1260955
+108870,64041,64041,0,965928,4672971,1487304
+118816,69892,69892,0,1024488,5971896,1557657
+129154,75973,75973,0,1205230,6250158,1990632
+174196,102468,102468,0,1273990,6875174,2083386
+213220,115254,115254,0,0,7562691,0
+238080,128692,128692,0,0,8318960,0
+264150,142784,142784,0,0,9150856,0
+291427,157528,157528,0,0,10065942,0
+329640,178184,178184,0,0,11877812,0
+363155,196300,196300,0,0,14015818,0
+398116,215198,215198,0,0,16538665,0
+434526,234879,234879,0,0,19515624,0
+472381,255341,255341,0,0,23028437,0
+610848,330188,330188,0,0,28094693,0
+741828,365914,365914,0,0,34275525,0
+806448,403224,403224,0,0,41816141,0
+884232,442116,442116,0,0,51015692,0
+965180,482590,482590,0,0,62239144,0
+1073896,536948,536948,0,0,79666104,0
+1170382,585191,585191,0,0,101972614,0
+1270556,635278,635278,0,0,130624946,0
+1374422,687211,687211,0,0,167071930,0
+1481976,740988,740988,0,0,213852071,0
+1850800,925400,925400,0,0,213852071,0
+3389616,1473746,1473746,0,0,0,0
+3666333,1594058,1594058,0,0,0,0
+3953534,1718928,1718928,0,0,0,0
+4251217,1848355,1848355,0,0,0,0
+4559382,1982340,1982340,0,0,0,0
+5129260,2230113,2230113,0,0,0,0
+5488173,2386162,2386162,0,0,0,0
+5859059,2547417,2547417,0,0,0,0
+6241919,2713878,2713878,0,0,0,0
+7374168,3206160,3206160,0,0,0,0
+9570622,3681024,3681024,0,0,0,0
+10458427,4022472,4022472,0,0,0,0
+11380262,4377024,4377024,0,0,0,0
+12336168,4744680,4744680,0,0,0,0
+13326144,5125440,5125440,0,0,0,0
+14994907,5767272,5767272,0,0,0,0
+16130400,6204000,6204000,0,0,0,0
+17304206,6655464,6655464,0,0,0,0
+18586326,7121664,7121664,0,0,0,0
+19766760,7602600,7602600,0,0,0,0
+29216160,9738720,9738720,0,0,0,0
+34949880,11649960,11649960,0,0,0,0
+40930560,13643520,13643520,0,0,0,0
+55017900,18339300,18339300,0,0,0,0
+71510400,23836800,23836800,0,0,0,0
+106974000,35658000,35658000,0,0,0,0
+146061000,48687000,48687000,0,0,0,0
+174405000,58135000,58135000,0,0,0,0
+299999999,99999999,99999999,0,0,0,0
+0,0,0,0,0,0,0,0
diff --git a/db/exp_guild.txt b/db/exp_guild.txt
index 33316213e..0512f527e 100644
--- a/db/exp_guild.txt
+++ b/db/exp_guild.txt
@@ -1,50 +1,50 @@
-// ƒMƒ‹ƒhLvUpŒoŒ±’lƒe[ƒuƒ‹
-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
+// ƒMƒ‹ƒhLvUpŒoŒ±’lƒe[ƒuƒ‹
+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/item_avail.txt b/db/item_avail.txt
index b521e88ed..715b5f32d 100644
--- a/db/item_avail.txt
+++ b/db/item_avail.txt
@@ -1,9 +1,9 @@
-// item id,sprite id
-// Client will use sprite ID to display particular item.
-// If 0 is used then item will be disabled.
-660,5028 //Forbidden_Red_Candle,Candle (Will use candle sprite and description)
-661,7047 //Flapping_Apron,Alice's_Apron
-9026,720 //Alice_Egg,Aquamarine
-9027,723 //Zherlthsh_Egg,Ruby
-2237,2240 //Bandit_Beard",2240 BEARD
-5054,5096 //Assassin_Mask,Assassin_Mask_
+// item id,sprite id
+// Client will use sprite ID to display particular item.
+// If 0 is used then item will be disabled.
+660,5028 //Forbidden_Red_Candle,Candle (Will use candle sprite and description)
+661,7047 //Flapping_Apron,Alice's_Apron
+9026,720 //Alice_Egg,Aquamarine
+9027,723 //Zherlthsh_Egg,Ruby
+2237,2240 //Bandit_Beard",2240 BEARD
+5054,5096 //Assassin_Mask,Assassin_Mask_
diff --git a/db/item_bluebox.txt b/db/item_bluebox.txt
index 3c3087cd6..db4307c9c 100644
--- a/db/item_bluebox.txt
+++ b/db/item_bluebox.txt
@@ -1,427 +1,427 @@
-// ŒÃ‚­Â‚¢” ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
-// nameid, item_name(dummy), rate
-// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-0,Guard,2102
-2102,Guard,40000
-2104,Buckler,20000
-2106,Shield,10000
-2108,Mirror Shield,10000
-2205,Diver's Goggles,30000
-2206,Wedding Veil,10000
-2207,Fancy Flower,10000
-2209,Ribbon,40000
-2210,Hair Band,10000
-2211,Bandana,10000
-2212,Eye Patch,40000
-2213,Kitty Band,10000
-2215,Flower Band,10000
-2217,Biretta,10000
-2218,Flu Mask,40000
-2221,Hat,30000
-2223,Turban,20000
-2227,Cap,20000
-2229,Helm,10000
-2231,Gemmed Sallet,10000
-2233,Circlet,10000
-2236,Santa's Hat,10000
-2239,Single Glass,30000
-2241,Granpa Beard,30000
-2242,Purple Glasses,20000
-2243,Geek Glasses,20000
-2244,Big Ribbon,10000
-2249,Coronet,10000
-2250,Cute Ribbon,10000
-2257,Snow Horn,10000
-2258,Spiky Band,10000
-2260,Mini Glasses,10000
-2262,Pierrot Nose,40000
-2263,Zorro Masque,10000
-2265,Gangster Mask,10000
-2267,Cigar,10000
-2268,Pipe,10000
-2269,Centimental Flower,10000
-2270,Centimental Leaf,10000
-2271,Jack a Dandy,10000
-2272,Stop Post,10000
-2273,Doctor Band,10000
-2275,Red Bandana,10000
-2276,Eagle Eyes,10000
-2279,Bomb Wick,10000
-2284,Antler,10000
-2287,Pirate Bandana,10000
-2289,Poo Poo Hat,10000
-2290,Funeral Hat,10000
-2291,Masquerade,10000
-2293,Pretend Murdered,10000
-2294,Stellar,10000
-2295,Blinker,10000
-2296,Binoculars,10000
-2298,Green Feeler,10000
-2299,Viking Helm,10000
-2302,Cotton Shirt,40000
-2304,Leather Jacket,40000
-2306,Adventurer's Suit,30000
-2308,Mantle,30000
-2310,Coat,20000
-2311,Mink Coat,10000
-2313,Padded Armor,10000
-2315,Chain Mail,10000
-2317,Full Plate,10000
-2322,Silk Robe,20000
-2324,Scapulare,30000
-2326,Saint's Robe,10000
-2329,Wooden Mail,30000
-2331,Tights,10000
-2333,Silver Robe,10000
-2336,Thief Clothes,10000
-2337,Ninja Suit,10000
-2338,Wedding Dress,10000
-2339,Pantie,50000
-2402,Sandals,30000
-2404,Shoes,20000
-2406,Boots,10000
-2407,Crystal Pumps,10000
-2408,Ball'n'Chain,50000
-2409,Highheals,10000
-2502,Hood,40000
-2504,Muffler,20000
-2506,Manteau,10000
-2507,Cape of Old Marquess,10000
-2508,Ragamuffin Manteau,10000
-2601,Ring,10000
-2602,Earring,10000
-2603,Necklace,10000
-2604,Glove,10000
-2605,Brooch,10000
-2607,Clip,100000
-2608,Rosary,30000
-2609,Skull Ring,100000
-2610,Gold Ring,20000
-2611,Silver Ring,30000
-2612,Flower Ring,100000
-2613,Diamond Ring,10000
-5008,Puppy Love,10000
-5009,Safety Helmet,10000
-5010,Indian Fillet,10000
-5014,Fin Helm,10000
-5015,Egg Shell,40000
-2225,Goggles,10000
-1117,Katana,40000
-1152,Slayer,30000
-1155,Bastard Sword,20000
-1158,Two-handed Sword,10000
-1162,Broad Sword,10000
-1163,Claymore,10000
-1352,Battle Axe,20000
-1355,Hammer,20000
-1358,Buster,10000
-1361,Two-handed Axe,10000
-1452,Guisarme,10000
-1455,Glaive,10000
-1458,Partizan,10000
-1461,Trident,10000
-1464,Halberd,10000
-1410,Lance,10000
-1251,Jur,20000
-1253,Katar,10000
-1255,Jamadhar,10000
-1702,Bow,40000
-1705,Composite Bow,30000
-1708,Great Bow,20000
-1718,Hunter Bow,10000
-1711,Cross Bow,10000
-1719,Roguemaster's Bow,10000
-1713,Arbalest,10000
-1714,Gakkung,10000
-701,Ora Ora,10000
-702,Animal Gore,10000
-703,Hinalle,10000
-704,Aloe,10000
-705,Clover,10000
-706,Four-Leaf Clover,10000
-707,Singing Plant,10000
-708,Ment,10000
-710,Illusion Flower,10000
-711,Shoot,100000
-712,Flower,100000
-713,Empty Bottle,100000
-714,Emperium,10000
-715,Yellow Gemstone,70000
-716,Red Gemstone,70000
-717,Blue Gemstone,70000
-718,Garnet,20000
-719,Amethyst,20000
-720,Aquamarine,20000
-721,Emerald,20000
-722,Pearl,20000
-723,Ruby,20000
-724,Cursed Ruby,10000
-725,Sardonyx,20000
-726,Sapphire,20000
-727,Opal,20000
-728,Topaz,20000
-729,Zircon,20000
-730,1 Carat Diamond,20000
-731,2 Carat Diamond,10000
-732,3 Carat Diamond,10000
-733,Cracked Diamond,10000
-734,Red Frame,30000
-735,Chung Jah,30000
-736,China,30000
-737,Black Ladle,30000
-738,Pencil Case,20000
-740,Puppet,10000
-741,Poring Doll,10000
-742,Chonchon Doll,10000
-743,Spore Doll,10000
-744,Bouquet,100000
-745,Wedding Bouquet,20000
-746,Glass Bead,30000
-747,Crystal Mirror,10000
-748,Witherless Rose,10000
-749,Frozen Rose,10000
-752,Grasshopper Doll,10000
-753,Yoyo Doll,10000
-754,Raccoon Doll,10000
-756,Rough Oridecon,10000
-757,Rough Elunium,10000
-901,Danggie,20000
-902,Tree Root,20000
-903,Reptile Tongue,20000
-904,Scorpion Tail,20000
-905,Stem,20000
-906,Pointed Scale,20000
-907,Resin,20000
-908,Spawn,20000
-909,Jellopy,100000
-910,Garlet,50000
-911,Scell,30000
-912,Zargon,20000
-913,Tooth of Bat,20000
-914,Fluff,20000
-915,Chrysalis,20000
-916,Feather of Birds,20000
-917,Talon,20000
-918,Sticky Webfoot,20000
-919,Animal Skin,20000
-920,Wolf Claw,20000
-921,Mushroom Spore,20000
-922,Orc's Fang,20000
-923,Evil Horn,10000
-924,Powder of Butterfly,20000
-925,Bill of Birds,20000
-926,Snake Scale,20000
-928,Insect Feeler,20000
-929,Immortal Heart,20000
-930,Rotten Bandage,20000
-931,Orcish Voucher,20000
-932,Skel-Bone,20000
-934,Memento,10000
-935,Shell,20000
-936,Scale Shell,20000
-937,Venom Canine,20000
-938,Sticky Mucus,20000
-939,Bee Sting,20000
-940,Grasshopper's Leg,20000
-942,Yoyo Tail,20000
-943,Solid Shell,10000
-944,Horseshoe,20000
-945,Raccoon Leaf,20000
-946,Snail's Shell,20000
-947,Horn,20000
-948,Bear's Footskin,20000
-949,Feather,20000
-950,Heart of Mermaid,20000
-951,Fin,20000
-952,Cactus Needle,20000
-953,Stone Heart,20000
-954,Shining Scale,20000
-955,Worm Peeling,20000
-956,Gill,20000
-957,Decayed Nail,20000
-958,Horrendous Mouth,10000
-959,Stinky Scale,20000
-960,Nipper,20000
-961,Conch,20000
-962,Tentacle,20000
-963,Sharp Scale,20000
-968,Heroic Emblem,10000
-969,Gold,10000
-970,Alcohol,10000
-971,Detrimindexta,10000
-972,Karvodailnirol,10000
-973,Counteragent,10000
-974,Mixture,10000
-975,Scarlet Dyestuffs,10000
-976,Lemon Dyestuffs,10000
-978,Cobaltblue Dyestuff,10000
-979,Darkgreen Dyestuff,10000
-980,Orange Dyestuff,10000
-981,Violet Dyestuff,10000
-982,White Dyestuff,10000
-983,Black Dyestuff,10000
-984,Oridecon,10000
-985,Elunium,10000
-986,Anvil,30000
-987,Oridecon Anvil,10000
-988,Golden Anvil,10000
-989,Emperium Anvil,10000
-990,Red Blood,30000
-991,Crystal Blue,30000
-992,Wind of Verdure,30000
-993,Green Live,30000
-994,Flame Heart,10000
-995,Mystic Frozen,10000
-996,Rough Wind,10000
-997,Great Nature,10000
-998,Iron,100000
-999,Steel,30000
-1000,Star Crumb,30000
-1001,Star Dust,100000
-1002,Iron Ore,200000
-1003,Coal,50000
-1004,Chivalry Emblem,10000
-1005,Hammer of Blacksmith,10000
-1006,Old Magic Book,10000
-1007,Necklace of Wisdom,10000
-1008,Necklace of Oblivion,10000
-1009,Hand of God,10000
-1010,Phracon,200000
-1011,Emveretarcon,50000
-1012,Frill,20000
-1013,Rainbow Shell,20000
-1014,Ant Jaw,20000
-1015,Tongue,10000
-1016,Rat Tail,20000
-1017,Mole Whiskers,20000
-1018,Mole Claw,20000
-1019,Trunk,20000
-1020,Black Hair,20000
-1021,Dokkaebi Horn,20000
-1022,Nine Tails,20000
-1023,Fish Tail,20000
-1024,Squid Ink,20000
-1025,Cobweb,20000
-1026,Acorn,20000
-1027,Porcupine Quill,20000
-1028,Mane,20000
-1029,Tiger Skin,10000
-1030,Tiger's Footskin,10000
-1031,Mantis Scythe,20000
-1032,Maneater Blossom,20000
-1033,Maneater Root,20000
-1034,Blue Hair,20000
-1035,Dragon Canine,20000
-1036,Dragon Scale,20000
-1037,Dragon Tail,20000
-1038,Little Evil Horn,20000
-1039,Little Evil Wing,20000
-1040,Elder Pixie's Moustache,20000
-1041,Lantern,20000
-1042,Bug Leg,20000
-1043,Orc Claw,20000
-1044,Zenorc's Fang,20000
-1045,Cultish Masque,20000
-1046,Scorpion Nipper,20000
-1047,Dead Medusa,20000
-1048,Horrendous Hair,20000
-1049,Skirt of Virgin,10000
-1050,Tendon,20000
-1051,Detonator,20000
-1052,Single Cell,20000
-1053,Ancient Tooth,20000
-1054,Ancient Lips,20000
-1055,Earthworm Peeling,20000
-1056,Grit,20000
-1057,Moth Dust,20000
-1058,Moth Wings,20000
-1059,Fabric,20000
-1060,Golden Hair,20000
-1061,Witched Starsand,20000
-1062,Jack o' Pumpkin,20000
-1063,Fang,20000
-1064,Reins,20000
-1065,Trap,50000
-501,Red Potion,50000
-502,Orange Potion,50000
-503,Yellow Potion,50000
-504,White Potion,50000
-505,Blue Potion,30000
-506,Green Potion,50000
-507,Red Herb,110000
-508,Yellow Herb,100000
-509,White Herb,100000
-510,Blue Herb,50000
-511,Green Herb,100000
-512,Apple,100000
-513,Banana,90000
-514,Grape,100000
-515,Carrot,100000
-516,Sweet Potato,100000
-517,Meat,50000
-518,Honey,20000
-519,Milk,20000
-520,Hinalle Leaflet,20000
-521,Aloe Leaflet,20000
-523,Holy Water,30000
-525,Panacea,20000
-526,Royal Jelly,10000
-528,Monster's Feed,30000
-529,Candy,20000
-530,Candy Cane,20000
-531,Apple Juice,30000
-532,Banana Juice,30000
-533,Grape Juice,30000
-534,Carrot Juice,30000
-535,Pumpkin,50000
-601,Fly Wing,100000
-602,Butterfly Wing,100000
-603,Old Blue Box,400000
-604,Dead Branch,10000
-605,Anodyne,20000
-606,Aloevera,20000
-607,Yggdrasilberry,10000
-608,Yggdrasil Seed,10000
-610,Yggdrasil Leaf,10000
-611,Magnifier,100000
-612,Mini Furnace,50000
-613,Iron Hammer,30000
-614,Golden Hammer,20000
-615,Oridecon Hammer,10000
-1102,Sword,10000
-1105,Falchion,10000
-1108,Blade,10000
-1111,Rapier,10000
-1114,Scimiter,10000
-1120,Tsurugi,10000
-1125,Ring Pommel Saber,10000
-1127,Saber,10000
-1128,Haedonggum,10000
-1129,Flamberge,10000
-1202,Knife,10000
-1205,Cutter,10000
-1208,Main Gauche,10000
-1211,Dirk,10000
-1214,Dagger,10000
-1217,Stiletto,10000
-1220,Gladius,10000
-1226,Damascus,10000
-1302,Axe,10000
-1402,Javelin,10000
-1405,Spear,10000
-1408,Pike,10000
-1502,Club,10000
-1505,Mace,10000
-1508,Smasher,10000
-1511,Flail,10000
-1514,Morning Star,10000
-1517,Sword Mace,10000
-1520,Chain,10000
-1550,Book,10000
-1551,Bible,10000
-1602,Rod,10000
-1605,Wand,10000
-1608,Staff,10000
-1611,Arc Wand,10000
-1613,Mighty Staff,10000
+// ŒÃ‚­Â‚¢” ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
+// nameid, item_name(dummy), rate
+// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+0,Guard,2102
+2102,Guard,40000
+2104,Buckler,20000
+2106,Shield,10000
+2108,Mirror Shield,10000
+2205,Diver's Goggles,30000
+2206,Wedding Veil,10000
+2207,Fancy Flower,10000
+2209,Ribbon,40000
+2210,Hair Band,10000
+2211,Bandana,10000
+2212,Eye Patch,40000
+2213,Kitty Band,10000
+2215,Flower Band,10000
+2217,Biretta,10000
+2218,Flu Mask,40000
+2221,Hat,30000
+2223,Turban,20000
+2227,Cap,20000
+2229,Helm,10000
+2231,Gemmed Sallet,10000
+2233,Circlet,10000
+2236,Santa's Hat,10000
+2239,Single Glass,30000
+2241,Granpa Beard,30000
+2242,Purple Glasses,20000
+2243,Geek Glasses,20000
+2244,Big Ribbon,10000
+2249,Coronet,10000
+2250,Cute Ribbon,10000
+2257,Snow Horn,10000
+2258,Spiky Band,10000
+2260,Mini Glasses,10000
+2262,Pierrot Nose,40000
+2263,Zorro Masque,10000
+2265,Gangster Mask,10000
+2267,Cigar,10000
+2268,Pipe,10000
+2269,Centimental Flower,10000
+2270,Centimental Leaf,10000
+2271,Jack a Dandy,10000
+2272,Stop Post,10000
+2273,Doctor Band,10000
+2275,Red Bandana,10000
+2276,Eagle Eyes,10000
+2279,Bomb Wick,10000
+2284,Antler,10000
+2287,Pirate Bandana,10000
+2289,Poo Poo Hat,10000
+2290,Funeral Hat,10000
+2291,Masquerade,10000
+2293,Pretend Murdered,10000
+2294,Stellar,10000
+2295,Blinker,10000
+2296,Binoculars,10000
+2298,Green Feeler,10000
+2299,Viking Helm,10000
+2302,Cotton Shirt,40000
+2304,Leather Jacket,40000
+2306,Adventurer's Suit,30000
+2308,Mantle,30000
+2310,Coat,20000
+2311,Mink Coat,10000
+2313,Padded Armor,10000
+2315,Chain Mail,10000
+2317,Full Plate,10000
+2322,Silk Robe,20000
+2324,Scapulare,30000
+2326,Saint's Robe,10000
+2329,Wooden Mail,30000
+2331,Tights,10000
+2333,Silver Robe,10000
+2336,Thief Clothes,10000
+2337,Ninja Suit,10000
+2338,Wedding Dress,10000
+2339,Pantie,50000
+2402,Sandals,30000
+2404,Shoes,20000
+2406,Boots,10000
+2407,Crystal Pumps,10000
+2408,Ball'n'Chain,50000
+2409,Highheals,10000
+2502,Hood,40000
+2504,Muffler,20000
+2506,Manteau,10000
+2507,Cape of Old Marquess,10000
+2508,Ragamuffin Manteau,10000
+2601,Ring,10000
+2602,Earring,10000
+2603,Necklace,10000
+2604,Glove,10000
+2605,Brooch,10000
+2607,Clip,100000
+2608,Rosary,30000
+2609,Skull Ring,100000
+2610,Gold Ring,20000
+2611,Silver Ring,30000
+2612,Flower Ring,100000
+2613,Diamond Ring,10000
+5008,Puppy Love,10000
+5009,Safety Helmet,10000
+5010,Indian Fillet,10000
+5014,Fin Helm,10000
+5015,Egg Shell,40000
+2225,Goggles,10000
+1117,Katana,40000
+1152,Slayer,30000
+1155,Bastard Sword,20000
+1158,Two-handed Sword,10000
+1162,Broad Sword,10000
+1163,Claymore,10000
+1352,Battle Axe,20000
+1355,Hammer,20000
+1358,Buster,10000
+1361,Two-handed Axe,10000
+1452,Guisarme,10000
+1455,Glaive,10000
+1458,Partizan,10000
+1461,Trident,10000
+1464,Halberd,10000
+1410,Lance,10000
+1251,Jur,20000
+1253,Katar,10000
+1255,Jamadhar,10000
+1702,Bow,40000
+1705,Composite Bow,30000
+1708,Great Bow,20000
+1718,Hunter Bow,10000
+1711,Cross Bow,10000
+1719,Roguemaster's Bow,10000
+1713,Arbalest,10000
+1714,Gakkung,10000
+701,Ora Ora,10000
+702,Animal Gore,10000
+703,Hinalle,10000
+704,Aloe,10000
+705,Clover,10000
+706,Four-Leaf Clover,10000
+707,Singing Plant,10000
+708,Ment,10000
+710,Illusion Flower,10000
+711,Shoot,100000
+712,Flower,100000
+713,Empty Bottle,100000
+714,Emperium,10000
+715,Yellow Gemstone,70000
+716,Red Gemstone,70000
+717,Blue Gemstone,70000
+718,Garnet,20000
+719,Amethyst,20000
+720,Aquamarine,20000
+721,Emerald,20000
+722,Pearl,20000
+723,Ruby,20000
+724,Cursed Ruby,10000
+725,Sardonyx,20000
+726,Sapphire,20000
+727,Opal,20000
+728,Topaz,20000
+729,Zircon,20000
+730,1 Carat Diamond,20000
+731,2 Carat Diamond,10000
+732,3 Carat Diamond,10000
+733,Cracked Diamond,10000
+734,Red Frame,30000
+735,Chung Jah,30000
+736,China,30000
+737,Black Ladle,30000
+738,Pencil Case,20000
+740,Puppet,10000
+741,Poring Doll,10000
+742,Chonchon Doll,10000
+743,Spore Doll,10000
+744,Bouquet,100000
+745,Wedding Bouquet,20000
+746,Glass Bead,30000
+747,Crystal Mirror,10000
+748,Witherless Rose,10000
+749,Frozen Rose,10000
+752,Grasshopper Doll,10000
+753,Yoyo Doll,10000
+754,Raccoon Doll,10000
+756,Rough Oridecon,10000
+757,Rough Elunium,10000
+901,Danggie,20000
+902,Tree Root,20000
+903,Reptile Tongue,20000
+904,Scorpion Tail,20000
+905,Stem,20000
+906,Pointed Scale,20000
+907,Resin,20000
+908,Spawn,20000
+909,Jellopy,100000
+910,Garlet,50000
+911,Scell,30000
+912,Zargon,20000
+913,Tooth of Bat,20000
+914,Fluff,20000
+915,Chrysalis,20000
+916,Feather of Birds,20000
+917,Talon,20000
+918,Sticky Webfoot,20000
+919,Animal Skin,20000
+920,Wolf Claw,20000
+921,Mushroom Spore,20000
+922,Orc's Fang,20000
+923,Evil Horn,10000
+924,Powder of Butterfly,20000
+925,Bill of Birds,20000
+926,Snake Scale,20000
+928,Insect Feeler,20000
+929,Immortal Heart,20000
+930,Rotten Bandage,20000
+931,Orcish Voucher,20000
+932,Skel-Bone,20000
+934,Memento,10000
+935,Shell,20000
+936,Scale Shell,20000
+937,Venom Canine,20000
+938,Sticky Mucus,20000
+939,Bee Sting,20000
+940,Grasshopper's Leg,20000
+942,Yoyo Tail,20000
+943,Solid Shell,10000
+944,Horseshoe,20000
+945,Raccoon Leaf,20000
+946,Snail's Shell,20000
+947,Horn,20000
+948,Bear's Footskin,20000
+949,Feather,20000
+950,Heart of Mermaid,20000
+951,Fin,20000
+952,Cactus Needle,20000
+953,Stone Heart,20000
+954,Shining Scale,20000
+955,Worm Peeling,20000
+956,Gill,20000
+957,Decayed Nail,20000
+958,Horrendous Mouth,10000
+959,Stinky Scale,20000
+960,Nipper,20000
+961,Conch,20000
+962,Tentacle,20000
+963,Sharp Scale,20000
+968,Heroic Emblem,10000
+969,Gold,10000
+970,Alcohol,10000
+971,Detrimindexta,10000
+972,Karvodailnirol,10000
+973,Counteragent,10000
+974,Mixture,10000
+975,Scarlet Dyestuffs,10000
+976,Lemon Dyestuffs,10000
+978,Cobaltblue Dyestuff,10000
+979,Darkgreen Dyestuff,10000
+980,Orange Dyestuff,10000
+981,Violet Dyestuff,10000
+982,White Dyestuff,10000
+983,Black Dyestuff,10000
+984,Oridecon,10000
+985,Elunium,10000
+986,Anvil,30000
+987,Oridecon Anvil,10000
+988,Golden Anvil,10000
+989,Emperium Anvil,10000
+990,Red Blood,30000
+991,Crystal Blue,30000
+992,Wind of Verdure,30000
+993,Green Live,30000
+994,Flame Heart,10000
+995,Mystic Frozen,10000
+996,Rough Wind,10000
+997,Great Nature,10000
+998,Iron,100000
+999,Steel,30000
+1000,Star Crumb,30000
+1001,Star Dust,100000
+1002,Iron Ore,200000
+1003,Coal,50000
+1004,Chivalry Emblem,10000
+1005,Hammer of Blacksmith,10000
+1006,Old Magic Book,10000
+1007,Necklace of Wisdom,10000
+1008,Necklace of Oblivion,10000
+1009,Hand of God,10000
+1010,Phracon,200000
+1011,Emveretarcon,50000
+1012,Frill,20000
+1013,Rainbow Shell,20000
+1014,Ant Jaw,20000
+1015,Tongue,10000
+1016,Rat Tail,20000
+1017,Mole Whiskers,20000
+1018,Mole Claw,20000
+1019,Trunk,20000
+1020,Black Hair,20000
+1021,Dokkaebi Horn,20000
+1022,Nine Tails,20000
+1023,Fish Tail,20000
+1024,Squid Ink,20000
+1025,Cobweb,20000
+1026,Acorn,20000
+1027,Porcupine Quill,20000
+1028,Mane,20000
+1029,Tiger Skin,10000
+1030,Tiger's Footskin,10000
+1031,Mantis Scythe,20000
+1032,Maneater Blossom,20000
+1033,Maneater Root,20000
+1034,Blue Hair,20000
+1035,Dragon Canine,20000
+1036,Dragon Scale,20000
+1037,Dragon Tail,20000
+1038,Little Evil Horn,20000
+1039,Little Evil Wing,20000
+1040,Elder Pixie's Moustache,20000
+1041,Lantern,20000
+1042,Bug Leg,20000
+1043,Orc Claw,20000
+1044,Zenorc's Fang,20000
+1045,Cultish Masque,20000
+1046,Scorpion Nipper,20000
+1047,Dead Medusa,20000
+1048,Horrendous Hair,20000
+1049,Skirt of Virgin,10000
+1050,Tendon,20000
+1051,Detonator,20000
+1052,Single Cell,20000
+1053,Ancient Tooth,20000
+1054,Ancient Lips,20000
+1055,Earthworm Peeling,20000
+1056,Grit,20000
+1057,Moth Dust,20000
+1058,Moth Wings,20000
+1059,Fabric,20000
+1060,Golden Hair,20000
+1061,Witched Starsand,20000
+1062,Jack o' Pumpkin,20000
+1063,Fang,20000
+1064,Reins,20000
+1065,Trap,50000
+501,Red Potion,50000
+502,Orange Potion,50000
+503,Yellow Potion,50000
+504,White Potion,50000
+505,Blue Potion,30000
+506,Green Potion,50000
+507,Red Herb,110000
+508,Yellow Herb,100000
+509,White Herb,100000
+510,Blue Herb,50000
+511,Green Herb,100000
+512,Apple,100000
+513,Banana,90000
+514,Grape,100000
+515,Carrot,100000
+516,Sweet Potato,100000
+517,Meat,50000
+518,Honey,20000
+519,Milk,20000
+520,Hinalle Leaflet,20000
+521,Aloe Leaflet,20000
+523,Holy Water,30000
+525,Panacea,20000
+526,Royal Jelly,10000
+528,Monster's Feed,30000
+529,Candy,20000
+530,Candy Cane,20000
+531,Apple Juice,30000
+532,Banana Juice,30000
+533,Grape Juice,30000
+534,Carrot Juice,30000
+535,Pumpkin,50000
+601,Fly Wing,100000
+602,Butterfly Wing,100000
+603,Old Blue Box,400000
+604,Dead Branch,10000
+605,Anodyne,20000
+606,Aloevera,20000
+607,Yggdrasilberry,10000
+608,Yggdrasil Seed,10000
+610,Yggdrasil Leaf,10000
+611,Magnifier,100000
+612,Mini Furnace,50000
+613,Iron Hammer,30000
+614,Golden Hammer,20000
+615,Oridecon Hammer,10000
+1102,Sword,10000
+1105,Falchion,10000
+1108,Blade,10000
+1111,Rapier,10000
+1114,Scimiter,10000
+1120,Tsurugi,10000
+1125,Ring Pommel Saber,10000
+1127,Saber,10000
+1128,Haedonggum,10000
+1129,Flamberge,10000
+1202,Knife,10000
+1205,Cutter,10000
+1208,Main Gauche,10000
+1211,Dirk,10000
+1214,Dagger,10000
+1217,Stiletto,10000
+1220,Gladius,10000
+1226,Damascus,10000
+1302,Axe,10000
+1402,Javelin,10000
+1405,Spear,10000
+1408,Pike,10000
+1502,Club,10000
+1505,Mace,10000
+1508,Smasher,10000
+1511,Flail,10000
+1514,Morning Star,10000
+1517,Sword Mace,10000
+1520,Chain,10000
+1550,Book,10000
+1551,Bible,10000
+1602,Rod,10000
+1605,Wand,10000
+1608,Staff,10000
+1611,Arc Wand,10000
+1613,Mighty Staff,10000
diff --git a/db/item_cardalbum.txt b/db/item_cardalbum.txt
index f47db7259..d7202c70d 100644
--- a/db/item_cardalbum.txt
+++ b/db/item_cardalbum.txt
@@ -1,158 +1,158 @@
-// Fixed [Lupus] (removed extra row which made all albums empty)
-// ŒÃ‚¢ƒJ[ƒh’Ÿ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
-// ItemID ItemName(Dummy) Rate
-// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B),,,
-//
-
-0,Poring Card,4001
-4001,Poring Card,70000
-4002,Fabre Card,70000
-4003,Pupa Card,70000
-4004,Drops Card,70000
-4005,Santa Poring Card,10000
-4006,Lunatic Card,70000
-4007,Pecopeco Egg Card,40000
-4008,Picky Card,10000
-4009,Chonchon Card,70000
-4010,Willow Card,70000
-4011,Picky Egg Card,70000
-4012,Thief Bug Egg Card,50000
-4013,Andre Egg Card,50000
-4014,Roda Frog Card,50000
-4015,Condor Card,50000
-4016,Thief Bug Card,50000
-4017,Savage Babe Card,50000
-4019,Hornet Card,50000
-4020,Farmiliar Card,50000
-4021,Rocker Card,50000
-4022,Spore Card,50000
-4023,Baby Desert Wolf Card,50000
-4024,Plankton Card,50000
-4025,Skeleton Card,50000
-4026,Female Thiefbug Card,30000
-4027,Kukre Card,30000
-4028,Tarou Card,30000
-4029,Wolf Card,30000
-4030,Mandragora Card,30000
-4031,Pecopeco Card,30000
-4032,Ambernite Card,30000
-4033,Poporing Card,30000
-4034,Worm Tail Card,30000
-4035,Hydra Card,30000
-4036,Muka Card,30000
-4037,Snake Card,30000
-4038,Zombie Card,30000
-4039,Stainer Card,30000
-4040,Creamy Card,30000
-4041,Coco Card,30000
-4042,Steel Chonchon Card,30000
-4043,Andre Card,30000
-4044,Smokie Card,10000
-4045,Horn Card,30000
-4046,Martin Card,30000
-4047,Ghostring Card,10000
-4048,Poison Spore Card,30000
-4049,Vadon Card,30000
-4050,Male Thiefbug Card,30000
-4051,Yoyo Card,30000
-4052,Elder Willow Card,30000
-4053,Vitata Card,10000
-4054,Angeling Card,10000
-4055,Marina Card,30000
-4056,Dustiness Card,30000
-4057,Metaller Card,20000
-4058,Thara Frog Card,20000
-4060,Goblin Card,20000
-4061,Cornutus Card,20000
-4062,Anacondaq Card,20000
-4063,Caramel Card,20000
-4064,Zerom Card,20000
-4065,Kaho Card,20000
-4066,Orc Warrior Card,20000
-4067,Megalodon Card,20000
-4068,Scorpion Card,20000
-4069,Drainliar Card,20000
-4070,Eggyra Card,20000
-4071,Orc Zombie Card,20000
-4072,Golem Card,20000
-4073,Pirate Skeleton Card,20000
-4074,BigFoot Card,20000
-4075,Argos Card,20000
-4076,Magnolia Card,20000
-4077,Phen Card,20000
-4078,Savage Card,20000
-4079,Mantis Card,20000
-4080,Flora Card,10000
-4081,Hode Card,20000
-4082,Desert Wolf Card,10000
-4083,Rafflesia Card,10000
-4084,Marine Sphere Card,10000
-4085,Orc Skeleton Card,10000
-4086,Soldier Skeleton Card,10000
-4087,Giearth Card,10000
-4088,Frilldora Card,10000
-4089,Swordfish Card,10000
-4090,Munak Card,10000
-4091,Kobold Card,10000
-4092,Skel Worker Card,10000
-4093,Obeaune Card,10000
-4094,Archer Skeleton Card,10000
-4095,Marse Card,10000
-4096,Zenorc Card,10000
-4097,Matyr Card,10000
-4098,Dokebi Card,10000
-4099,Pasana Card,10000
-4100,Sohee Card,10000
-4101,Sandman Card,10000
-4102,Whisper Card,10000
-4103,Horong Card,10000
-4104,Requiem Card,10000
-4105,Marc Card,10000
-4106,Mummy Card,10000
-4107,Verit Card,10000
-4108,Myst Card,10000
-4109,Jakk Card,10000
-4110,Ghoul Card,10000
-4111,Strouf Card,10000
-4112,Marduk Card,10000
-4113,Marionette Card,10000
-4114,Argiope Card,10000
-4115,Hunter Fly Card,10000
-4116,Isis Card,10000
-4117,Sidewinder Card,10000
-4118,Petit Card,10000
-4119,Bathory Card,10000
-4120,Petit Card,10000
-4122,Deviruchi Card,10000
-4124,Medusa Card,10000
-4125,Deviace Card,10000
-4126,Minorous Card,10000
-4127,Nightmare Card,10000
-4129,Baphomet Card,10000
-4130,Scorpion King Card,10000
-4133,Raydric Card,10000
-4136,Khalitzburg Card,10000
-4139,Joker Card,10000
-4140,Knight Of Abyss Card,10000
-4141,Evil Druid Card,10000
-4149,Bon Gun Card,10000
-4150,Orc Archer Card,10000
-4151,Mimic Card,10000
-4152,Wraith Card,10000
-4153,Alarm Card,10000
-4154,Arclouse Card,10000
-4155,Rideword Card,10000
-4156,Skel Prisoner Card,10000
-4157,Zombie Prisoner Card,10000
-4158,Dark Priest Card,10000
-4159,Punk Card,10000
-4160,Zherlthsh Card,10000
-4161,Mysteltainn Card,10000
-4164,Anolian Card,10000
-4165,Sting Card,10000
-4166,Wander Man Card,10000
-4167,Cramp Card,10000
-4168,Filamentous Card,10000
-4169,Brilight Card,10000
-4170,Iron Fist Card,10000
+// Fixed [Lupus] (removed extra row which made all albums empty)
+// ŒÃ‚¢ƒJ[ƒh’Ÿ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
+// ItemID ItemName(Dummy) Rate
+// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B),,,
+//
+
+0,Poring Card,4001
+4001,Poring Card,70000
+4002,Fabre Card,70000
+4003,Pupa Card,70000
+4004,Drops Card,70000
+4005,Santa Poring Card,10000
+4006,Lunatic Card,70000
+4007,Pecopeco Egg Card,40000
+4008,Picky Card,10000
+4009,Chonchon Card,70000
+4010,Willow Card,70000
+4011,Picky Egg Card,70000
+4012,Thief Bug Egg Card,50000
+4013,Andre Egg Card,50000
+4014,Roda Frog Card,50000
+4015,Condor Card,50000
+4016,Thief Bug Card,50000
+4017,Savage Babe Card,50000
+4019,Hornet Card,50000
+4020,Farmiliar Card,50000
+4021,Rocker Card,50000
+4022,Spore Card,50000
+4023,Baby Desert Wolf Card,50000
+4024,Plankton Card,50000
+4025,Skeleton Card,50000
+4026,Female Thiefbug Card,30000
+4027,Kukre Card,30000
+4028,Tarou Card,30000
+4029,Wolf Card,30000
+4030,Mandragora Card,30000
+4031,Pecopeco Card,30000
+4032,Ambernite Card,30000
+4033,Poporing Card,30000
+4034,Worm Tail Card,30000
+4035,Hydra Card,30000
+4036,Muka Card,30000
+4037,Snake Card,30000
+4038,Zombie Card,30000
+4039,Stainer Card,30000
+4040,Creamy Card,30000
+4041,Coco Card,30000
+4042,Steel Chonchon Card,30000
+4043,Andre Card,30000
+4044,Smokie Card,10000
+4045,Horn Card,30000
+4046,Martin Card,30000
+4047,Ghostring Card,10000
+4048,Poison Spore Card,30000
+4049,Vadon Card,30000
+4050,Male Thiefbug Card,30000
+4051,Yoyo Card,30000
+4052,Elder Willow Card,30000
+4053,Vitata Card,10000
+4054,Angeling Card,10000
+4055,Marina Card,30000
+4056,Dustiness Card,30000
+4057,Metaller Card,20000
+4058,Thara Frog Card,20000
+4060,Goblin Card,20000
+4061,Cornutus Card,20000
+4062,Anacondaq Card,20000
+4063,Caramel Card,20000
+4064,Zerom Card,20000
+4065,Kaho Card,20000
+4066,Orc Warrior Card,20000
+4067,Megalodon Card,20000
+4068,Scorpion Card,20000
+4069,Drainliar Card,20000
+4070,Eggyra Card,20000
+4071,Orc Zombie Card,20000
+4072,Golem Card,20000
+4073,Pirate Skeleton Card,20000
+4074,BigFoot Card,20000
+4075,Argos Card,20000
+4076,Magnolia Card,20000
+4077,Phen Card,20000
+4078,Savage Card,20000
+4079,Mantis Card,20000
+4080,Flora Card,10000
+4081,Hode Card,20000
+4082,Desert Wolf Card,10000
+4083,Rafflesia Card,10000
+4084,Marine Sphere Card,10000
+4085,Orc Skeleton Card,10000
+4086,Soldier Skeleton Card,10000
+4087,Giearth Card,10000
+4088,Frilldora Card,10000
+4089,Swordfish Card,10000
+4090,Munak Card,10000
+4091,Kobold Card,10000
+4092,Skel Worker Card,10000
+4093,Obeaune Card,10000
+4094,Archer Skeleton Card,10000
+4095,Marse Card,10000
+4096,Zenorc Card,10000
+4097,Matyr Card,10000
+4098,Dokebi Card,10000
+4099,Pasana Card,10000
+4100,Sohee Card,10000
+4101,Sandman Card,10000
+4102,Whisper Card,10000
+4103,Horong Card,10000
+4104,Requiem Card,10000
+4105,Marc Card,10000
+4106,Mummy Card,10000
+4107,Verit Card,10000
+4108,Myst Card,10000
+4109,Jakk Card,10000
+4110,Ghoul Card,10000
+4111,Strouf Card,10000
+4112,Marduk Card,10000
+4113,Marionette Card,10000
+4114,Argiope Card,10000
+4115,Hunter Fly Card,10000
+4116,Isis Card,10000
+4117,Sidewinder Card,10000
+4118,Petit Card,10000
+4119,Bathory Card,10000
+4120,Petit Card,10000
+4122,Deviruchi Card,10000
+4124,Medusa Card,10000
+4125,Deviace Card,10000
+4126,Minorous Card,10000
+4127,Nightmare Card,10000
+4129,Baphomet Card,10000
+4130,Scorpion King Card,10000
+4133,Raydric Card,10000
+4136,Khalitzburg Card,10000
+4139,Joker Card,10000
+4140,Knight Of Abyss Card,10000
+4141,Evil Druid Card,10000
+4149,Bon Gun Card,10000
+4150,Orc Archer Card,10000
+4151,Mimic Card,10000
+4152,Wraith Card,10000
+4153,Alarm Card,10000
+4154,Arclouse Card,10000
+4155,Rideword Card,10000
+4156,Skel Prisoner Card,10000
+4157,Zombie Prisoner Card,10000
+4158,Dark Priest Card,10000
+4159,Punk Card,10000
+4160,Zherlthsh Card,10000
+4161,Mysteltainn Card,10000
+4164,Anolian Card,10000
+4165,Sting Card,10000
+4166,Wander Man Card,10000
+4167,Cramp Card,10000
+4168,Filamentous Card,10000
+4169,Brilight Card,10000
+4170,Iron Fist Card,10000
diff --git a/db/item_db.txt b/db/item_db.txt
index 1975ef0d3..bc99566a5 100644
--- a/db/item_db.txt
+++ b/db/item_db.txt
@@ -1,1709 +1,1709 @@
-//ID,Name,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View,{UseScript},{EquipScript}
-
-// Healing Items
-//=============================================================
-0,DEFAULT,Default,0,20,,10,,,,,0,2,0,0,,,{},{},,
-501,Red_Potion,Red Potion,0,50,,70,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
-502,Orange_Potion,Orange Potion,0,200,,100,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
-503,Yellow_Potion,Yellow Potion,0,550,,130,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{}
-504,White_Potion,White Potion,0,1200,,150,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
-505,Blue_Potion,Blue Potion,0,5000,,150,,,,,10477567,2,,,,,{ itemheal 0,rand(40,59); },{}
-506,Green_Potion,Green Potion,0,40,,70,,,,,10477567,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,,,,,10477567,2,,,,,{ itemheal rand(18,27),0; },{}
-508,Yellow_Herb,Yellow Herb,0,40,,50,,,,,10477567,2,,,,,{ itemheal rand(38,57),0; },{}
-509,White_Herb,White Herb,0,120,,70,,,,,10477567,2,,,,,{ itemheal rand(75,114),0; },{}
-510,Blue_Herb,Blue Herb,0,60,,70,,,,,10477567,2,,,,,{ itemheal 0,rand(15,29); },{}
-511,Green_Herb,Green Herb,0,10,,30,,,,,10477567,2,,,,,{ sc_end SC_Poison; },{},,
-512,Apple,Apple,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(16,21),0; },{}
-513,Banana,Banana,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(17,20),0; },{}
-514,Grape,Grape,0,200,,20,,,,,10477567,2,,,,,{ itemheal 0,rand(10,14); },{}
-515,Carrot,Carrot,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(18,19),0; },{},
-516,Sweet_Potato,Sweet Potato,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(15,22),0; },{},
-517,Meat,Meat,0,50,,150,,,,,10477567,2,,,,,{ itemheal rand(70,99),0; },{},
-518,Honey,Honey,0,500,,100,,,,,10477567,2,,,,,{ itemheal rand(70,99),rand(20,39); },{}
-519,Milk,Milk,0,25,,30,,,,,10477567,2,,,,,{ itemheal rand(27,36),0; },{},
-520,Hinalle_Leaflet,Hinalle Leaflet,0,150,,10,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{},
-521,Aloe_Leaflet,Aloe Leaflet,0,360,,20,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{},
-522,Mastela_Fruit,Mastela Fruit,0,840,,30,,,,,10477567,2,,,,,{ itemheal rand(400,599),0; },{},
-523,Holy_Water,Holy Water,0,20,,30,,,,,10477567,2,,,,,{ sc_end SC_Curse; },{},,,
-525,Panacea,Panacea,0,500,,100,,,,,10477567,2,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; },{}
-526,Royal_Jelly,Royal Jelly,0,7000,,150,,,,,10477567,2,,,,,{ itemheal rand(325,404),rand(40,59); sc_end SC_Posion; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; },{}
-528,Monster's_Feed,Monster Food,0,60,,150,,,,,10477567,2,,,,,{ itemheal rand(72,107),0; },{},
-529,Candy,Candy,0,10,,30,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
-530,Candy_Cane,Candy Cane,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
-531,Apple_Juice,Apple Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(25,34),0; },{}
-532,Banana_Juice,Banana Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(26,33),0; },{}
-533,Grape_Juice,Grape Juice,0,250,,40,,,,,10477567,2,,,,,{ itemheal 0,rand(15,24); },{}
-534,Carrot_Juice,Carrot Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(27,32),0; },{}
-535,Pumkin,Pumpkin,0,15,,20,,,,,10477567,2,,,,,{ itemheal 19,0; },{}
-536,Ice_Cream,Ice Cream,0,150,,80,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
-537,Pet_Food,Pet Food,0,1000,,10,,,,,10477567,2,,,,,{ itemheal rand(50,89),0; },{}
-538,Well-baked_Cookie,Well-baked Cookie,0,1000,,30,,,,,10477567,2,,,,,{ itemheal rand(160,199),0; },{}
-539,Piece_of_Cake,Piece of Cake,0,3000,,100,,,,,10477567,2,,,,,{ itemheal rand(270,329),0; },{}
-540,Falcon_food,Falcon food,0,20,,50,,,,,10477567,2,,,,,{},{}
-541,Pecopeco_food,Pecopeco food,0,20,,50,,,,,10477567,2,,,,,{},{}
-542,Festive_Cookie,Festive Cookie,0,10,,10,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
-543,Festive_Rainbow_Cake,Festive Rainbow Cake,0,20,,10,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
-544,Raw_Fish,Raw Fish,0,20,,30,,,,,10477567,2,,,,,{ itemheal rand(25,59),0; },{}
-545,Condensed_Red_Potion,Condensed Red Potion,0,20,,20,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
-546,Condensed_Yellow_Potion,Condensed Yellow Potion,0,20,,30,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{}
-547,Condensed_White_Potion,Condensed White Potion,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
-548,Cheese,Cheese,0,2800,,50,,,,,10477567,2,,,,,{ itemheal 0,rand(10,14); },{}
-549,Yam,Hot Potato,0,180,,80,,,,,10477567,2,,,,,{ itemheal rand(50,99),0; },{}
-550,Rice_Cake,Rice Popper,0,20,5,10,,,,,10477567,2,,,,,{ itemheal rand(10,14),0; },{}
-551,Sushi,Sushi,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(50,60),0; },{}
-552,Ketupat,Ketupat,0,20,,10,,,,,10477567,2,,,,,{ itemheal rand(100,200),0; },{}
-553,Dumpling,Dumpling,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(39,68),0; },{}
-554,Mochi,Mochi,0,100,,80,,,,,10477567,2,,,,,{ itemheal rand(100,200),0; },{}
-//554,Wool_CCI,Wool CCI,0,100,,80,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
-555,Rice_Cake,Rice Cake,0,,,20,,,,,10477567,2,,,,,{},{}
-556,Rolled_Rice,Rolled Rice,0,20,,10,,,,,,,,,,,{},{},,
-557,Cut_Rice_Rolls,Cut Rice Rolls,0,20,,10,,,,,,,,,,,{},{},,
-//557,Decorated Rice Cake,Prettily Cut Rice Cake,0,,,10,,,,,,,,,,,{},{}
-558,Chocolate,Chocolate,0,500,,20,,,,,10477567,2,,,,,{ itemheal 1,1; },{},
-559,Hand-made_Chocolate,Hand-made Chocolate,0,5000,,80,,,,,10477567,2,,,,,{ itemheal 50,50; },{},
-560,White_Chocolate,White Chocolate,0,0,,80,,,,,10477567,2,,,,,{},{},,
-561,Milk_Chocolate_Bar,Milk Chocolate,0,0,,80,,,,,10477567,2,,,,,{},{},,
-562,Pizza,Pizza,0,20,,150,,,,,10477567,2,,,,,{},{},,
-563,Double_Growing_Swiss_Pong_Tyu_,Unknown Item,0,,,150,,,,,,,,,,,{},{}
-564,Meat_Dumpling,Meat Dumpling,0,20,,30,,,,,0,3,,,,,{ itemheal rand(175,234),0; },{}
-565,Vita_500_Bottle,Vita 500,0,2000,,30,,,,,10477567,2,,,,,{ itemheal 500,0; },{}
-566,Tom_Yum_Goong,Tom_Yum_Goong,0,,150,0,,,,,,,,,,,{},{},,
-567,Prawn,Prawn,0,,40,0,,,,,,,,,,,{},{},,
-568,Lemon,Lemon,0,,40,0,,,,,,,,,,,{},{},,
-
-// Usable Items
-//===================================================================
-601,Fly_Wing,Fly Wing,2,60,,50,,,,,10477567,2,,,,,{ warp "Random",0,0; },{}
-602,Butterfly_Wing,Butterfly Wing,2,300,,50,,,,,10477567,2,,,,,{ warp "SavePoint",0,0; },{}
-603,Old_Blue_Box,Old Blue Box,2,10000,,200,,,,,10477567,2,,,,,{ getitem -1,1; },{}
-604,Dead_Branch,Dead Branch,2,50,,50,,,,,10477567,2,,,,,{ monster "this",0,0,"--ja--",-1,1,; },{}
-605,Anodyne,Anodyne,2,2000,,100,,,,,10477567,2,,,,,{ itemskill 8,1,"??????????"; },{}
-606,Aloevera,Aloevera,2,1500,,100,,,,,10477567,2,,,,,{ itemskill 6,1,"?????"; },{}
-607,Yggdrasilberry,Yggdrasilberry,0,2,,300,,,,,10477567,2,,,,,{ percentheal 100,100; },{}
-608,Yggdrasil_Seed,Yggdrasil Seed,0,5000,,300,,,,,10477567,2,,,,,{ percentheal 50,50; },{}
-609,Amulet,Amulet,2,100,,100,,,,,10477567,2,,,,,{},{}
-610,Yggdrasil_Leaf,Yggdrasil Leaf,2,4000,,100,,,,,10477567,2,,,,,{ itemskill 54,1,"????????"; },{}
-611,Magnifier,Magnifier,2,40,,50,,,,,10477567,2,,,,,{ itemskill 40,1,"???"; },{}
-// Smithing Items
-612,Mini_Furnace,Mini Furnace,2,150,,200,,,,,10477567,2,,,,,{ produce 16; },{}
-613,Iron_Hammer,Iron Hammer,2,1000,,200,,,,,10477567,2,,,,,{ produce 1; },{},,,,,,
-614,Golden_Hammer,Golden Hammer,2,3000,,300,,,,,10477567,2,,,,,{ produce 2; },{},,,,,,
-615,Oridecon_Hammer,Oridecon Hammer,2,5000,,400,,,,,10477567,2,,,,,{ produce 3; },{}
-// Item Givers
-616,Old_Card_Album,Old Card Album,2,10000,,50,,,,,10477567,2,,,,,{ getitem -3,1; },{},,,,,
-617,Old_Violet_Box,Old Violet Box,2,10000,,200,,,,,10477567,2,,,,,{ getitem -2,1; },{}
-618,Worn_Out_Scroll,Worn Out Scroll,2,50,,20,,,,,10477567,2,,,,,{ getitem -5,1; },{}
-
-// Pet Tames
-//===================================================================
-619,Unripe_Apple,Unripe Apple,2,1000,,50,,,,,10477567,2,,,,,{ pet 1002; },{},
-620,Orange_Juice,Orange Juice,2,1500,,50,,,,,10477567,2,,,,,{ pet 1113; },{}
-621,Bitter_Herb,Bitter Herb,2,20,,50,,,,,10477567,2,,,,,{ pet 1031; },{},
-622,Rainbow_Carrot,Rainbow Carrot,2,2500,,50,,,,,10477567,2,,,,,{ pet 1063; },{},
-623,Earthworm_the_Dude,Earthworm the Dude,2,4000,,50,,,,,10477567,2,,,,,{ pet 1049; },{},
-624,Rotten_Fish,Rotten Fish,2,2500,,50,,,,,10477567,2,,,,,{ pet 1011; },{},
-625,Rusty_Iron,Rusty Iron,2,100,,50,,,,,10477567,2,,,,,{ pet 1042; },{},
-626,Monster_Juice,Monster Juice,2,1500,,50,,,,,10477567,2,,,,,{ pet 1035; },{},
-627,Sweet_Milk,Sweet Milk,2,7000,,50,,,,,10477567,2,,,,,{ pet 1167; },{},
-628,Well_Dried_Bone,Well Dried Bone,2,10000,,50,,,,,10477567,2,,,,,{ pet 1107; },{},
-629,Singing_Flower,Singing Flower,2,300,,50,,,,,10477567,2,,,,,{ pet 1052; },{},
-630,Dew_Laden_Moss,Dew Laden Moss,2,10,,50,,,,,10477567,2,,,,,{ pet 1014; },{},
-631,Deadly_Noxious_Herb,Deadly Noxious Herb,2,20,,50,,,,,10477567,2,,,,,{ pet 1077; },{},
-632,Fatty_Chubby_Earthworm,Fatty Chubby Earthworm,2,5000,,50,,,,,10477567,2,,,,,{ pet 1019; },{},
-633,Baked_Yam,Baked Yam,2,20,,50,,,,,10477567,2,,,,,{ pet 1056; },{},,
-634,Tropical_Banana,Tropical Banana,2,20,,50,,,,,10477567,2,,,,,{ pet 1057; },{},,
-635,Horror_of_Tribe,Horror of Tribe,2,300,,50,,,,,10477567,2,,,,,{ pet 1023; },{},,
-636,No_Recipient,No Recipient,2,100,,50,,,,,10477567,2,,,,,{ pet 1026; },{},,
-637,Old_Broom,Old Broom,2,350,,50,,,,,10477567,2,,,,,{ pet 1110; },{},,
-638,Silver_Knife_of_Chastity,Silver Knife of Chastity,2,12000,,50,,,,,10477567,2,,,,,{ pet 1170; },{},,
-639,Armlet_of_Obedience,Armlet of Obedience,2,18000,,50,,,,,10477567,2,,,,,{ pet 1029; },{},,
-640,Shining_Stone,Shining Stone,2,3000,,50,,,,,10477567,2,,,,,{ pet 1155; },{},,
-641,Contract_in_Shadow,Contracts in Shadow,2,100,,50,,,,,10477567,2,,,,,{ pet 1109; },{},,
-642,Book_of_Devil,Book of Devil,2,1800,,50,,,,,10477567,2,,,,,{ pet 1101; },{},,
-643,Pet_Incubator,Pet Incubator,2,3000,,30,,,,,10477567,2,,,,,{ bpet; },{},,
-
-// Misc Items
-//===================================================================
-644,Gift_Box,Gift Box,2,2,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
-645,Concentration_Potion,Concentration Potion,2,800,,100,,,,,10477567,2,,,,,{ sc_start SC_SpeedPot0,1800,0; },{}
-656,Awakening_Potion,Awakening Potion,2,1500,,150,,,,,8904431,2,,,40,,{ sc_start SC_SpeedPot1,1800,0; },{}
-657,Berserk_Potion,Berserk Potion,2,3000,,200,,,,,410786,2,,,85,,{ sc_start SC_SpeedPot2,1800,0; },{}
-658,Tribal_Solidarity,Tribal Solidarity,3,1000,,500,,,,,,,,,,,{},{}
-659,Her_Heart,Her Heart,2,500,,50,,,,,10477567,2,,,,,{ pet 1188; },{},,
-660,Forbidden_Red_Candle,Red Candle,2,20,,50,,,,,10477567,2,,,,,{ pet 1200; },{},,
-661,Sky_Apron,Soft Apron,2,20,,50,,,,,10477567,2,,,,,{ pet 1275; },{}
-
-// Newer Items
-664,Gift_Box_,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
-665,Gift_Box__,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
-666,Gift_Box___,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
-667,Gift_Box____,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
-668,Angpow,Angpow,0,1,,2,,,,,10477567,2,,,,,{ set Zeny,Zeny+rand(100,10000); },{}
-669,Rice_Cake_Soup,Rice Cake Soup,2,20,,100,,,,,,,,,,,{},{},,
-670,Gold_Coin_Pouch,Gold Coin Pouch,2,20,,400,,,,,,,,,,,{},{},,
-671,Gold_Coin,Gold Coin,2,20,,40,,,,,,,,,,,{},{},,
-672,Copper_Coin_Pouch,Copper Coin Pouch,2,20,,400,,,,,,,,,,,{},{},,
-673,Copper_Coin,Copper Coin,2,20,,40,,,,,,,,,,,{},{},,
-674,Mysterious_Ore_Coin,Mysterious Ore Coin,2,20,,40,,,,,,,,,,,{},{},,
-675,Silver_Coin,Silver Coin,2,20,,40,,,,,,,,,,,{},{},,
-676,Silver_Coin_Pouch,Silver Coin Pouch,2,20,,400,,,,,,,,,,,{},{}
-677,Platinum_Coin,Platinum Coin,2,20,,40,,,,,,,,,,,{},{}
-678,Deadly_Poison_Bottle,Deadly Poison Bottle,2,20,,100,,,,,,,,,,,{},{}
-679,Recall_Pills,Recall Pills,2,20,,300,,,,,,,,,,,{},{}
-680,Carnation,Carnation,2,20,,1000,,,,,,,,,,,{},{}
-//680,Horse_Power_You_Syen,Car of Horse Power,2,,,1000,,,,,,,,,,,{},{}
-681,Wedding_Photo_Album,Wedding_Photo_Album,2,20,,10,,,,,,,,,,,{},{}
-//681,Newly-Married_Reminiscence,Reminiscence of the Newly Married,2,,,10,,,,,,,,,,,{},{}
-682,Realgar_Wine,Realgar Wine,2,20,,50,,,,,10477567,2,,,,,{ sc_start SC_ATKPOT,30,30; },{}
-//682,Oong_Hwangju,Oong Hwangju,2,,,100,,,,,10477567,2,,,,,{ sc_start SC_INCATK,30,30; },{}
-683,Exorcize_Herb,Exorcize Herb,2,20,,50,,,,,10477567,2,,,,,{ sc_start SC_MATKPOT,30,30; },{}
-//683,beginning,Beginning,2,,,50,,,,,10477567,2,,,,,{ sc_start SC_INCMATK,30,30; },{}
-684,Durian,Durian,3,20,,10,,,,,,,,,,,{},{}
-685,Ramadan,Ramadan,2,,10,0,,,,,,,,,,,{},{},,
-
-701,Ora_Ora,Ora Ora,3,55000,,200,,,,,,,,,,,{},{}
-702,Animal_Gore,Animal Gore,3,2,,100,,,,,,,,,,,{},{}
-703,Hinalle,Hinalle,3,2,,10,,,,,,,,,,,{},{}
-704,Aloe,Aloe,3,2,,10,,,,,,,,,,,{},{}
-705,Clover,Clover,3,10,,10,,,,,,,,,,,{},{}
-706,Four_Leaf_Clover,Four-Leaf Clover,3,80000,,10,,,,,,,,,,,{},{}
-707,Singing_Plant,Singing Plant,3,2,,10,,,,,,,,,,,{},{}
-708,Ment,Ment,3,2,,10,,,,,,,,,,,{},{}
-709,Izidor,Izidor,3,2,,10,,,,,,,,,,,{},{}
-710,Illusion_Flower,Illusion Flower,3,2,,10,,,,,,,,,,,{},{}
-711,Shoot,Shoot,3,16,,10,,,,,,,,,,,{},{}
-712,Flower,Flower,3,2,,10,,,,,,,,,,,{},{}
-713,Empty_Bottle,Empty Bottle,3,6,,20,,,,,,,,,,,{},{}
-714,Emperium,Emperium,3,2,,1000,,,,,,,,,,,{},{}
-715,Yellow_Gemstone,Yellow Gemstone,3,600,,30,,,,,,,,,,,{},{}
-716,Red_Gemstone,Red Gemstone,3,600,,30,,,,,,,,,,,{},{}
-717,Blue_Gemstone,Blue Gemstone,3,600,,30,,,,,,,,,,,{},{}
-718,Garnet,Garnet,3,6000,,100,,,,,,,,,,,{},{}
-719,Amethyst,Amethyst,3,6000,,100,,,,,,,,,,,{},{}
-720,Aquamarine,Aquamarine,3,6000,,100,,,,,,,,,,,{},{}
-721,Emerald,Emerald,3,6000,,100,,,,,,,,,,,{},{}
-722,Pearl,Pearl,3,6000,,100,,,,,,,,,,,{},{}
-723,Ruby,Ruby,3,6000,,100,,,,,,,,,,,{},{}
-724,Cursed_Ruby,Cursed Ruby,3,1000,,100,,,,,,,,,,,{},{}
-725,Sardonyx,Sardonyx,3,6000,,100,,,,,,,,,,,{},{}
-726,Sapphire,Sapphire,3,6000,,100,,,,,,,,,,,{},{}
-727,Opal,Opal,3,6000,,100,,,,,,,,,,,{},{}
-728,Topaz,Topaz,3,6000,,100,,,,,,,,,,,{},{}
-729,Zircon,Zircon,3,6000,,100,,,,,,,,,,,{},{}
-730,1_Carat_Diamond,1 Carat Diamond,3,10000,,100,,,,,,,,,,,{},{}
-731,2_Carat_Diamond,2 Carat Diamond,3,25000,,100,,,,,,,,,,,{},{}
-732,3_Carat_Diamond,3 Carat Diamond,3,55000,,100,,,,,,,,,,,{},{}
-733,Cracked_Diamond,Cracked Diamond,3,2,,100,,,,,,,,,,,{},{}
-734,Red_Frame,Red Frame,3,3000,,200,,,,,,,,,,,{},{}
-735,Chung_Jah,Chung Jah,3,5000,,500,,,,,,,,,,,{},{}
-736,China,China,3,1000,,300,,,,,,,,,,,{},{}
-737,Black_Ladle,Black Ladle,3,400,,50,,,,,,,,,,,{},{}
-738,Pencil_Case,Pencil Case,3,300,,100,,,,,,,,,,,{},{}
-739,Rouge,Rouge,3,10000,,10,,,,,,,,,,,{},{}
-740,Puppet,Puppet,3,1000,,100,,,,,,,,,,,{},{}
-741,Poring_Doll,Poring Doll,3,1800,,100,,,,,,,,,,,{},{}
-742,Chonchon_Doll,Chonchon Doll,3,3000,1000,100,,,,,,,,,,,{},{}
-743,Spore_Doll,Spore Doll,3,5500,,100,,,,,,,,,,,{},{}
-744,Bouquet,Bouquet,3,2000,,50,,,,,,,,,,,{},{}
-745,Wedding_Bouquet,Wedding Bouquet,3,10000,,50,,,,,,,,,,,{},{}
-746,Glass_Bead,Glass Bead,3,1400,,50,,,,,,,,,,,{},{}
-747,Crystal_Mirror,Crystal Mirror,3,15000,,50,,,,,,,,,,,{},{}
-748,Witherless_Rose,Witherless Rose,3,55000,,10,,,,,,,,,,,{},{}
-749,Frozen_Rose,Frozen Rose,3,35000,,10,,,,,,,,,,,{},{}
-750,Baphomet_Doll,Baphomet Doll,3,18000,,100,,,,,,,,,,,{},{}
-751,Osiris_Doll,Osiris Doll,3,14000,,100,,,,,,,,,,,{},{}
-752,Rocker_Doll,Grasshopper Doll,3,4000,,100,,,,,,,,,,,{},{}
-753,Yoyo_Doll,Yoyo Doll,3,6000,,100,,,,,,,,,,,{},{}
-754,Raccoon_Doll,Raccoon Doll,3,5000,,100,,,,,,,,,,,{},{}
-756,Rough_Oridecon,Rough Oridecon,3,548,,200,,,,,,,,,,,{},{}
-757,Rough_Elunium,Rough Elunium,3,648,,200,,,,,,,,,,,{},{}
-901,Danggie,Danggie,3,250,,10,,,,,,,,,,,{},{}
-902,Tree_Root,Tree Root,3,12,,10,,,,,,,,,,,{},{}
-903,Reptile_Tongue,Reptile Tongue,3,50,,10,,,,,,,,,,,{},{}
-904,Scorpion_Tail,Scorpion Tail,3,124,,10,,,,,,,,,,,{},{}
-905,Stem,Stem,3,58,,10,,,,,,,,,,,{},{}
-906,Pointed_Scale,Pointed Scale,3,70,,10,,,,,,,,,,,{},{}
-907,Resin,Resin,3,120,,10,,,,,,,,,,,{},{}
-908,Spawn,Spawn,3,148,,10,,,,,,,,,,,{},{}
-909,Jellopy,Jellopy,3,6,,10,,,,,,,,,,,{},{}
-910,Garlet,Garlet,3,40,,10,,,,,,,,,,,{},{}
-911,Scell,Scell,3,160,,10,,,,,,,,,,,{},{}
-912,Zargon,Zargon,3,480,,10,,,,,,,,,,,{},{}
-913,Tooth_of_Bat,Tooth of Bat,3,34,,10,,,,,,,,,,,{},{}
-914,Fluff,Fluff,3,8,,10,,,,,,,,,,,{},{}
-915,Chrysalis,Chrysalis,3,8,,10,,,,,,,,,,,{},{}
-916,Feather_of_Birds,Feather of Birds,3,10,,10,,,,,,,,,,,{},{}
-917,Talon,Talon,3,20,,10,,,,,,,,,,,{},{}
-918,Sticky_Webfoot,Sticky Webfoot,3,20,,10,,,,,,,,,,,{},{}
-919,Animal_Skin,Animal Skin,3,36,,10,,,,,,,,,,,{},{}
-920,Wolf_Claw,Wolf Claw,3,58,,10,,,,,,,,,,,{},{}
-921,Mushroom_Spore,Mushroom Spore,3,36,,10,,,,,,,,,,,{},{}
-922,Orc's_Fang,Orcish Fang,3,220,,10,,,,,,,,,,,{},{}
-923,Evil_Horn,Evil Horn,3,1020,,10,,,,,,,,,,,{},{}
-924,Powder_of_Butterfly,Powder of Butterfly,3,90,,10,,,,,,,,,,,{},{}
-925,Bill_of_Birds,Bill of Birds,3,64,,10,,,,,,,,,,,{},{}
-926,Snake_Scale,Snake Scale,3,82,,10,,,,,,,,,,,{},{}
-928,Insect_Feeler,Insect Feeler,3,114,,10,,,,,,,,,,,{},{}
-929,Immortal_Heart,Immortal Heart,3,374,,10,,,,,,,,,,,{},{}
-930,Rotten_Bandage,Rotten Bandage,3,358,,10,,,,,,,,,,,{},{}
-931,Orcish_Voucher,Orcish Voucher,3,168,,10,,,,,,,,,,,{},{}
-932,Skel-Bone,Skel-Bone,3,232,,10,,,,,,,,,,,{},{}
-934,Memento,Memento,3,600,,10,,,,,,,,,,,{},{}
-935,Shell,Shell,3,14,,10,,,,,,,,,,,{},{}
-936,Scale_Shell,Scale Shell,3,466,,10,,,,,,,,,,,{},{}
-937,Venom_Canine,Venom Canine,3,148,,10,,,,,,,,,,,{},{}
-938,Sticky_Mucus,Sticky Mucus,3,70,,10,,,,,,,,,,,{},{}
-939,Bee_Sting,Bee Sting,3,32,,10,,,,,,,,,,,{},{}
-940,Grasshopper's_Leg,Grasshoppers Leg,3,36,,10,,,,,,,,,,,{},{}
-941,Nose_Ring,Nose Ring,3,568,,10,,,,,,,,,,,{},{}
-942,Yoyo_Tail,Yoyo Tail,3,114,,10,,,,,,,,,,,{},{}
-943,Solid_Shell,Solid Shell,3,448,,10,,,,,,,,,,,{},{}
-944,Horseshoe,Horseshoe,3,588,,10,,,,,,,,,,,{},{}
-945,Raccoon_Leaf,Raccoon Leaf,3,106,,10,,,,,,,,,,,{},{}
-946,Snail's_Shell,Snails Shell,3,64,,10,,,,,,,,,,,{},{}
-947,Horn,Horn,3,116,,10,,,,,,,,,,,{},{}
-948,Bear's_Footskin,Bears Footskin,3,174,,10,,,,,,,,,,,{},{}
-949,Feather,Feather,3,20,,10,,,,,,,,,,,{},{}
-950,Heart_of_Mermaid,Heart of Mermaid,3,264,,10,,,,,,,,,,,{},{}
-951,Fin,Fin,3,412,,10,,,,,,,,,,,{},{}
-952,Cactus_Needle,Cactus Needle,3,82,,10,,,,,,,,,,,{},{}
-953,Stone_Heart,Stone Heart,3,184,,10,,,,,,,,,,,{},{}
-954,Shining_Scale,Shining Scale,3,466,,10,,,,,,,,,,,{},{}
-955,Worm_Peeling,Worm Peeling,3,52,,10,,,,,,,,,,,{},{}
-956,Gill,Gill,3,342,,10,,,,,,,,,,,{},{}
-957,Decayed_Nail,Decayed Nail,3,82,,10,,,,,,,,,,,{},{}
-958,Horrendous_Mouth,Horrendous Mouth,3,390,,10,,,,,,,,,,,{},{}
-959,Stinky_Scale,Stinky Scale,3,168,,10,,,,,,,,,,,{},{}
-960,Nipper,Nipper,3,114,,10,,,,,,,,,,,{},{}
-961,Conch,Conch,3,158,,10,,,,,,,,,,,{},{}
-962,Tentacle,Tentacle,3,70,,10,,,,,,,,,,,{},{}
-963,Sharp_scale,Sharp Scale,3,250,,10,,,,,,,,,,,{},{}
-964,Crab_Shell,Crab Shell,3,90,5,10,,,,,,,,,,,{},{}
-965,Clam_Shell,Clam Shell,3,56,5,10,,,,,,,,,,,{},{}
-966,Clam_Flesh,Clam Flesh,3,158,,10,,,,,,,,,,,{},{}
-967,Turtle_Shell,Turtle Shell,3,680,,10,,,,,,,,,,,{},{}
-968,Heroic_Emblem,Heroic Emblem,3,3000,,10,,,,,,,,,,,{},{}
-969,Gold,Gold,3,200000,,200,,,,,,,,,,,{},{}
-970,Alcohol,Alcohol,3,400,,30,,,,,,,,,,,{},{}
-971,Detrimindexta,Detrimindexta,3,400,,30,,,,,,,,,,,{},{}
-972,Karvodailnirol,Karvodailnirol,3,400,,30,,,,,,,,,,,{},{}
-973,Counteragent,Counteragent,3,200,,70,,,,,,,,,,,{},{}
-974,Mixture,Mixture,3,200,,70,,,,,,,,,,,{},{}
-975,Scarlet_Dyestuffs,Scarlet Dyestuffs,3,1000,,150,,,,,,,,,,,{},{}
-976,Lemon_Dyestuffs,Lemon Dyestuffs,3,1000,,150,,,,,,,,,,,{},{}
-978,Cobaltblue_Dyestuff,Cobaltblue Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-979,Darkgreen_Dyestuff,Darkgreen Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-980,Orange_Dyestuff,Orange Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-981,Violet_Dyestuff,Violet Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-982,White_Dyestuff,White Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-983,Black_Dyestuff,Black Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
-984,Oridecon,Oridecon,3,1100,,200,,,,,,,,,,,{},{}
-985,Elunium,Elunium,3,1100,,200,,,,,,,,,,,{},{}
-986,Anvil,Anvil,3,30000,,500,,,,,,,,,,,{},{}
-987,Oridecon_Anvil,Oridecon Anvil,3,120000,,700,,,,,,,,,,,{},{}
-988,Golden_Anvil,Golden Anvil,3,300000,,900,,,,,,,,,,,{},{}
-989,Emperium_Anvil,Emperium Anvil,3,600000,,1000,,,,,,,,,,,{},{}
-990,Red_Blood,Red Blood,3,1000,,50,,,,,,,,,,,{},{}
-991,Crystal_Blue,Crystal Blue,3,1000,,50,,,,,,,,,,,{},{}
-992,Wind_of_Verdure,Wind of Verdure,3,1000,,50,,,,,,,,,,,{},{}
-993,Green_Live,Green Live,3,1000,,50,,,,,,,,,,,{},{}
-994,Flame_Heart,Flame Heart,3,3000,,300,,,,,,,,,,,{},{}
-995,Mystic_Frozen,Mystic Frozen,3,3000,,300,,,,,,,,,,,{},{}
-996,Rough_Wind,Rough Wind,3,3000,,300,,,,,,,,,,,{},{}
-997,Great_Nature,Great Nature,3,3000,,300,,,,,,,,,,,{},{}
-998,Iron,Iron,3,100,,50,,,,,,,,,,,{},{}
-999,Steel,Steel,3,1000,,100,,,,,,,,,,,{},{}
-1000,Star_Crumb,Star Crumb,3,4500,,100,,,,,,,,,,,{},{}
-1001,Star_Dust,Star Dust,3,1500,,10,,,,,,,,,,,{},{}
-1002,Iron_Ore,Iron Ore,3,50,,150,,,,,,,,,,,{},{}
-1003,Coal,Coal,3,500,,50,,,,,,,,,,,{},{}
-1004,Chivalry_Emblem,Chivalry Emblem,3,2,,100,,,,,,,,,,,{},{}
-1005,Hammer_of_Blacksmith,Hammer of Blacksmith,3,2,,800,,,,,,,,,,,{},{}
-1006,Old_Magic_Book,Old Magic Book,3,2,,30,,,,,,,,,,,{},{}
-1007,Necklace_of_Wisdom,Necklace of Wisdom,3,2,,40,,,,,,,,,,,{},{}
-1008,Necklace_of_Oblivion,Necklace of Oblivion,3,2,,100,,,,,,,,,,,{},{}
-1009,Hand_of_God,Hand of God,3,2,,20,,,,,,,,,,,{},{}
-1010,Phracon,Phracon,3,200,,200,,,,,,,,,,,{},{}
-1011,Emveretarcon,Emveretarcon,3,1000,,200,,,,,,,,,,,{},{}
-1012,Frill,Frill,3,250,,10,,,,,,,,,,,{},{}
-1013,Rainbow_Shell,Rainbow Shell,3,90,,10,,,,,,,,,,,{},{}
-1014,Ant_Jaw,Ant Jaw,3,232,,10,,,,,,,,,,,{},{}
-1015,Tongue,Tongue,3,528,,10,,,,,,,,,,,{},{}
-1016,Rat_Tail,Rat Tail,3,52,,10,,,,,,,,,,,{},{}
-1017,Mole_Whiskers,Mole Whiskers,3,106,,10,,,,,,,,,,,{},{}
-1018,Mole_Claw,Mole Claw,3,210,,10,,,,,,,,,,,{},{}
-1019,Trunk,Trunk,3,60,,10,,,,,,,,,,,{},{}
-1020,Black_Hair,Black Hair,3,292,,10,,,,,,,,,,,{},{}
-1021,Dokkaebi_Horn,Dokkaebi Horn,3,292,,10,,,,,,,,,,,{},{}
-1022,Nine_Tails,Nine Tails,3,650,,10,,,,,,,,,,,{},{}
-1023,Fish_Tail,Fish Tail,3,196,,10,,,,,,,,,,,{},{}
-1024,Squid_Ink,Squid Ink,3,264,,10,,,,,,,,,,,{},{}
-1025,Cobweb,Cobweb,3,184,,10,,,,,,,,,,,{},{}
-1026,Acorn,Acorn,3,98,,10,,,,,,,,,,,{},{}
-1027,Porcupine_Quill,Porcupine Quill,3,158,,10,,,,,,,,,,,{},{}
-1028,Mane,Mane,3,196,,10,,,,,,,,,,,{},{}
-1029,Tiger_Skin,Tiger Skin,3,548,,10,,,,,,,,,,,{},{}
-1030,Tiger's_Footskin,Tigers Footskin,3,1500,,10,,,,,,,,,,,{},{}
-1031,Mantis_Scythe,Mantis Scythe,3,196,,10,,,,,,,,,,,{},{}
-1032,Maneater_Blossom,Maneater Blossom,3,196,,10,,,,,,,,,,,{},{}
-1033,Maneater_Root,Maneater Root,3,208,,10,,,,,,,,,,,{},{}
-1034,Blue_Hair,Blue Hair,3,342,,10,,,,,,,,,,,{},{}
-1035,Dragon_Canine,Dragon Canine,3,484,,10,,,,,,,,,,,{},{}
-1036,Dragon_Scale,Dragon Scale,3,500,,10,,,,,,,,,,,{},{}
-1037,Dragon_Tail,Dragon Tail,3,1200,,10,,,,,,,,,,,{},{}
-1038,Little_Evil_Horn,Little Evil Horn,3,528,,10,,,,,,,,,,,{},{}
-1039,Little_Evil_Wing,Little Evil Wing,3,2000,,10,,,,,,,,,,,{},{}
-1040,Elder_Pixie's_Moustache,Elder Pixies Moustache,3,232,,10,,,,,,,,,,,{},{}
-1041,Lantern,Lantern,3,250,,10,,,,,,,,,,,{},{}
-1042,Bug_Leg,Bug Leg,3,430,,10,,,,,,,,,,,{},{}
-1043,Orc_Claw,Orc Claw,3,168,,10,,,,,,,,,,,{},{}
-1044,Zenorc's_Fang,Zenorcs Fang,3,264,,10,,,,,,,,,,,{},{}
-1045,Cultish_Masque,Cultish Masque,3,412,,10,,,,,,,,,,,{},{}
-1046,Scorpion_Nipper,Scorpion Nipper,3,614,,10,,,,,,,,,,,{},{}
-1047,Dead_Medusa,Dead Medusa,3,548,,10,,,,,,,,,,,{},{}
-1048,Horrendous_Hair,Horrendous Hair,3,800,,10,,,,,,,,,,,{},{}
-1049,Skirt_of_Virgin,Skirt of Virgin,3,1700,,10,,,,,,,,,,,{},{}
-1050,Tendon,Tendon,3,220,,10,,,,,,,,,,,{},{}
-1051,Detonator,Detonator,3,450,,10,,,,,,,,,,,{},{}
-1052,Single_Cell,Single Cell,3,46,,10,,,,,,,,,,,{},{}
-1053,Ancient_Tooth,Ancient Tooth,3,548,,10,,,,,,,,,,,{},{}
-1054,Ancient_Lips,Ancient Lips,3,1000,,10,,,,,,,,,,,{},{}
-1055,Earthworm_Peeling,Earthworm Peeling,3,196,,10,,,,,,,,,,,{},{}
-1056,Grit,Grit,3,306,,10,,,,,,,,,,,{},{}
-1057,Moth_Dust,Moth Dust,3,138,,10,,,,,,,,,,,{},{}
-1058,Moth_Wings,Moth Wings,3,200,,10,,,,,,,,,,,{},{}
-1059,Fabric,Fabric,3,306,,10,,,,,,,,,,,{},{}
-1060,Golden_Hair,Golden Hair,3,430,,10,,,,,,,,,,,{},{}
-1061,Witched_Starsand,Witched Starsand,3,484,,10,,,,,,,,,,,{},{}
-1062,Jack_o'_Pumpkin,Jack o' Pumpkin,3,374,,10,,,,,,,,,,,{},{}
-1063,Fang,Fang,3,680,,10,,,,,,,,,,,{},{}
-1064,Reins,Reins,3,802,,10,,,,,,,,,,,{},{}
-1065,Trap,Trap,3,100,,10,,,,,,,,,,,{},{}
-1066,Fine-grained_Trunk,Fine-grained Trunk,3,2,,10,,,,,,,,,,,{},{}
-1067,Solid_Trunk,Solid Trunk,3,2,,10,,,,,,,,,,,{},{}
-1068,Barren_Trunk,Barren Trunk,3,2,,10,,,,,,,,,,,{},{}
-1069,Orange_Net_Mushroom,Orange Net Mushroom,3,2,,10,,,,,,,,,,,{},{}
-1070,Orange_Gooey_Mushroom_,Orange Gooey Mushroom,3,2,,10,,,,,,,,,,,{},{}
-1071,Unknown_Test_Tube,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
-1072,Delivery_Message,DEL Message,3,2,,10,,,,,,,,,,,{},{}
-1073,Voucher,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1074,Voucher_,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1075,Voucher__,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1076,Voucher___,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1077,Voucher____,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1078,Voucher_____,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1079,Voucher______,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1080,Voucher_______,Voucher,3,2,,10,,,,,,,,,,,{},{}
-1081,Delivery_Box,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
-1082,Delivery_Box_,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
-1083,Delivery_Box__,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
-1084,Kafra_Pass,Kafra Pass,3,0,,10,,,,,,,,,,,{},{}
-1085,Unknown_Test_Tube_,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
-1086,Unknown_Test_Tube__,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
-1087,Unknown_Test_Tube___,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
-1088,Morroc_Solution,Morocc Solution,3,2,,30,,,,,,,,,,,{},{}
-1089,Payon_Solution,Payon Solution,3,2,,30,,,,,,,,,,,{},{}
-1090,Unknown_Test_Tube____,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
-1092,Empty_Test_Tube,Empty Testtube,3,3,,20,,,,,,,,,,,{},{}
-1093,Empty_Potion_Bottle,Empty Potion Bottle,3,10,,10,,,,,,,,,,,{},{}
-1094,Short_Daenggie,Short Daenggie,3,278,,10,,,,,,,,,,,{},{}
-1095,Clock_Hand,Needle of Alarm,3,546,,10,,,,,,,,,,,{},{}
-1096,Round_Shell,Round Shell,3,954,,10,,,,,,,,,,,{},{}
-1097,Worn_Out_Page,Worn Out Page,3,820,,10,,,,,,,,,,,{},{}
-1098,Manacles,Manacles,3,658,,10,,,,,,,,,,,{},{}
-1099,Worn-out_Prison_Uniform,Worn-out Prison Uniform,3,680,,10,,,,,,,,,,,{},{}
-
-// Weapons
-//===================================================================
-// 1 Handed Swords
-1101,Sword,Sword,4,100,,500,25,,1,3,8803555,2,2,1,2,2,{},{}
-1102,Sword_,Sword,4,100,,500,25,,1,4,8803555,2,2,1,2,2,{},{}
-1103,Sword__,Sword,4,100,,500,25,,1,0,8803555,2,2,1,2,2,{},{}
-1104,Falchion,Falchion,4,1500,,600,39,,1,3,8803555,2,2,1,2,2,{},{}
-1105,Falchion_,Falchion,4,1500,,600,39,,1,4,8803555,2,2,1,2,2,{},{}
-1106,Falchion__,Falchion,4,1500,,600,39,,1,0,8803555,2,2,1,2,2,{},{}
-1107,Blade,Blade,4,2900,,700,53,,1,3,8803555,2,2,1,2,2,{},{}
-1108,Blade_,Blade,4,2900,,700,53,,1,4,8803555,2,2,1,2,2,{},{}
-1109,Blade__,Blade,4,2900,,700,53,,1,0,8803555,2,2,1,2,2,{},{}
-1110,Rapier,Rapier,4,10000,,500,70,,1,2,8803555,2,2,2,14,2,{},{}
-1111,Rapier_,Rapier,4,10000,,500,70,,1,3,8803555,2,2,2,14,2,{},{}
-1112,Rapier__,Rapier,4,10000,,500,70,,1,0,8803555,2,2,2,14,2,{},{}
-1113,Scimiter,Scimiter,4,17000,,700,85,,1,2,8803555,2,2,2,14,2,{},{}
-1114,Scimiter_,Scimiter,4,17000,,700,85,,1,3,8803555,2,2,2,14,2,{},{}
-1115,Scimiter__,Scimiter,4,17000,,700,85,,1,0,8803555,2,2,2,14,2,{},{}
-1116,Katana,Katana,4,2000,,1000,60,,1,3,16514,2,34,1,4,3,{},{}
-1117,Katana_,Katana,4,2000,,1000,60,,1,4,16514,2,34,1,4,3,{},{}
-1118,Katana__,Katana,4,2000,,1000,60,,1,0,16514,2,34,1,4,3,{},{}
-1119,Tsurugi,Tsurugi,4,51000,,1200,130,,1,1,414946,2,2,3,27,2,{},{}
-1120,Tsurugi_,Tsurugi,4,51000,,1200,130,,1,2,414946,2,2,3,27,2,{},{}
-1121,Tsurugi__,Tsurugi,4,51000,,1200,130,,1,0,414946,2,2,3,27,2,{},{}
-1122,Ring_Pommel_Saber,Ring Pommel Saber,4,24000,,900,100,,1,2,414946,2,2,2,14,2,{},{}
-1123,Haedonggum,Haedonggum,4,50000,,900,120,,1,1,414946,2,2,3,27,2,{},{ bonus bInt,3; },,,,,,
-1124,Orcish_Sword,Orcish sword,4,20,,800,90,,1,0,8803555,2,2,3,5,2,{},{ bonus bUnbreakable,100; },,,,,,,
-1125,Ring_Pommel_Saber_,Ring Pommel Saber,4,24000,,900,100,,1,3,414946,2,2,2,14,2,{},{},,,,,,,
-1126,Saber,Saber,4,49000,,1000,115,,1,2,414946,2,2,3,27,2,{},{},,,,,,,
-1127,Saber_,Saber,4,49000,,1000,115,,1,3,414946,2,2,3,27,2,{},{},,,,,,,
-1128,Haedonggum_,Haedonggum,4,50000,,900,120,,1,2,414946,2,2,3,27,2,{},{ bonus bInt,3; },,,,,,
-1129,Flamberge,Flamberge,4,60000,,1500,150,,1,0,16512,2,2,3,27,2,{},{},,,,,,,
-1130,Nagan,Nagan,4,20,,500,120,,1,0,414946,2,2,4,40,2,{},{ bonus bDoubleRate,25; bonus2 bAddRace,7,5; },,,,
-1131,Ice_Falchion,Ice Falchion,4,20,,600,100,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,1; skill 14,3; bonus2 bAddEff,Eff_Freeze,500; bonus3 bAutoSpell,14,3,25; }
-1132,Edge,Edge,4,20,,700,115,,1,0,414946,2,2,4,40,2,{},{ bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,11,10; },,,
-1133,Fire_Brand,Fire Brand,4,20,,500,100,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,3; skill 19,3; bonus3 bAutoSpell,19,3,25; },,
-1134,Caesar's_Sword,Caesar's Sword,4,20,,700,140,,1,0,414946,2,2,4,40,2,{},{ bonus2 bAddRace,3,25; bonus bIgnoreDefRace,3; },,,,
-1135,Cutlas,Cutlas,4,20,,900,150,,1,0,414946,2,2,4,40,2,{},{ skill 5,5; bonus bStr,2; bonus bDef,1; },,,,
-1136,Solar_Sword,Solar Sword,4,20,,1200,85,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,3; bonus2 bHPDrainRate,100,1; bonus2 bSPDrainRate,50,-15; },,,,
-1137,Excalibur,Excalibur,4,20,,1200,150,,1,0,414946,2,2,4,40,2,{},{ bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,6; },,,
-1138,Mysteltainn_,Mysteltainn,4,20,,1000,170,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,7; bonus2 bAddEle,8,15; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3; },
-1139,Talefing_,Talefing,4,20,,1000,200,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,7; bonus2 bSPDrainRate,50,-35; },,,,,,,,,
-1140,Byeollungum,Byeollungum,4,20,,900,150,,1,0,414946,2,2,4,40,2,{},{ bonus2 bSubRace,11,-10; bonus2 bAddRace,10,50; bonus bAllStats,2; }
-1141,Immaterial_Sword,Immaterial Sword,4,20,,900,140,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,8; bonus2 bSPDrainRate,100,30; bonus2 bSPDrainRate,10000,-1; },,,,,,,,,
-1142,Jewel_Sword,Crystal Sword,4,20,,2200,104,,1,0,414946,2,2,3,68,2,{},{},,,,,,,,,,
-1143,Gaia_Sword,Gaia Sword,4,20,,2500,115,,1,0,414946,2,2,3,74,2,{},{ bonus3 bAddMonsterDropItem,1002,50,25000; },,,,,,,,,,
-1144,Sashimi,Sashimi,4,20,,1400,75,,1,0,414946,2,2,3,48,2,{},{ bonus bAtkEle,4; bonus3 bAddMonsterDropItem,544,5,4000; },,,,,,
-1145,Holy_Avenger,Holy Avenger,4,20,,1350,125,,1,0,16384,2,2,3,75,2,{},{ bonus bAtkEle,6; },,,,,,,,
-// 2 Handed Swords
-1151,Slayer,Slayer,4,15000,,1300,90,,1,2,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1152,Slayer_,Slayer,4,15000,,1300,90,,1,3,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1153,Slayer__,Slayer,4,15000,,1300,90,,1,0,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1154,Bastard_Sword,Bastard Sword,4,22500,,1600,115,,1,2,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1155,Bastard_Sword_,Bastard Sword,4,22500,,1600,115,,1,3,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1156,Bastard_Sword__,Bastard Sword,4,22500,,1600,115,,1,0,16514,2,34,2,18,3,{},{},,,,,,,,,,
-1157,Two_handed_Sword,Two-handed Sword,4,60000,,2200,160,,1,1,16514,2,34,3,33,3,{},{},,,,,,,,,,
-1158,Two_handed_Sword_,Two-handed Sword,4,60000,,2200,160,,1,2,16514,2,34,3,33,3,{},{},,,,,,,,,,
-1159,Two_handed_Sword__,Two-handed Sword,4,60000,,2200,160,,1,0,16514,2,34,3,33,3,{},{},,,,,,
-1160,Broad_Sword,Broad Sword,4,65000,,2000,140,,1,1,16514,2,34,3,33,3,{},{ bonus bDef,5; },,,,,
-1161,Balmung,Balmung,4,20,,1000,250,,2,0,2088959,2,2,4,48,1,{},{ bonus bInt,20; bonus bLuk,20; },,,,
-1162,Broad_Sword_,Broad Sword,4,65000,,2000,140,,1,2,16514,2,34,3,33,3,{},{ bonus bDef,5; },,,,,
-1163,Claymore,Claymore,4,74000,,2500,180,,1,0,16512,2,34,3,33,3,{},{},,,,,,
-1164,Muramasa,Muramasa,4,20,,1000,155,,1,0,16514,2,34,4,48,3,{},{ bonus bCritical,30; bonus bAspdAddRate,8; bonus2 bAddEff2,Eff_Curse,200; },,
-1165,Masamune,Masamune,4,20,,1000,200,,1,0,16514,2,34,4,48,3,{},{ bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-50; bonus bDef2Rate,-50; },
-1166,Dragon_Slayer,Dragon Slayer,4,20,,1300,150,,1,0,16514,2,34,4,48,3,{},{ bonus bIgnoreDefRace,9; bonus2 bAddRace,9,15; },,,
-1167,Schweizersabel,Schweizersabel,4,20,,1600,160,,1,0,16514,2,34,4,48,3,{},{ bonus bAtkEle,4; skill 20,3; bonus bDef,1; bonus3 bAutoSpell,20,3,25; }
-1168,Zweihander,Zweihander,4,20,,2200,200,,1,0,16514,2,34,4,48,3,{},{bonus bUnbreakable,100; },,,,,,
-1169,Executioner_,Executioner,4,20,,2200,155,,1,0,16514,2,34,4,48,3,{},{ bonus bIgnoreDefRace,7; bonus2 bAddRace,7,20; bonus2 bSubRace,7,-10; bonus bAtkEle,7; }
-1170,Katzbalger,Katzbalger,4,20,,2000,175,,1,0,16514,2,34,4,48,3,{},{ bonus bVit,10; bonus bDef,10; },,,,
-// Knifes and Daggers
-1201,Knife,Knife,4,50,,400,17,,1,3,10444527,2,2,1,1,1,{},{},,,,,,
-1202,Knife_,Knife,4,50,,400,17,,1,4,10444527,2,2,1,1,1,{},{},,,,,,
-1203,Knife__,Knife,4,50,,400,17,,1,0,10444527,2,2,1,1,1,{},{},,,,,,
-1204,Cutter,Cutter,4,1250,,500,30,,1,3,10444527,2,2,1,1,1,{},{}
-1205,Cutter_,Cutter,4,1250,,500,30,,1,4,10444527,2,2,1,1,1,{},{}
-1206,Cutter__,Cutter,4,1250,,500,30,,1,0,10444527,2,2,1,1,1,{},{}
-1207,Main_Gauche,Main Gauche,4,2400,,600,43,,1,3,10444527,2,2,1,1,1,{},{}
-1208,Main_Gauche_,Main Gauche,4,2400,,600,43,,1,4,10444527,2,2,1,1,1,{},{}
-1209,Main_Gauche__,Main Gauche,4,2400,,600,43,,1,0,10444527,2,2,1,1,1,{},{}
-1210,Dirk,Dirk,4,8500,,500,59,,1,2,10444527,2,2,2,12,1,{},{}
-1211,Dirk_,Dirk,4,8500,,500,59,,1,3,10444527,2,2,2,12,1,{},{}
-1212,Dirk__,Dirk,4,8500,,500,59,,1,0,10444527,2,2,2,12,1,{},{}
-1213,Dagger,Dagger,4,14000,,600,73,,1,2,10444527,2,2,2,12,1,{},{}
-1214,Dagger_,Dagger,4,14000,,600,73,,1,3,10444527,2,2,2,12,1,{},{}
-1215,Dagger__,Dagger,4,14000,,600,73,,1,0,10444527,2,2,2,12,1,{},{}
-1216,Stiletto,Stiletto,4,19500,,700,87,,1,2,10444527,2,2,2,12,1,{},{}
-1217,Stiletto_,Stiletto,4,19500,,700,87,,1,3,10444527,2,2,2,12,1,{},{}
-1218,Stiletto__,Stiletto,4,19500,,700,87,,1,0,10444527,2,2,2,12,1,{},{}
-1219,Gladius,Gladius,4,43000,,700,105,,1,2,2055918,2,2,3,24,1,{},{}
-1220,Gladius_,Gladius,4,43000,,700,105,,1,3,2055918,2,2,3,24,1,{},{},,,,,,
-1221,Gladius__,Gladius,4,43000,,700,105,,1,0,2055918,2,2,3,24,1,{},{},,,,,,
-1222,Damascus,Damascus,4,49000,,800,118,,1,1,2055918,2,2,3,24,1,{},{},,,,,,
-1223,Fortune_Sword,Fortune Sword,4,20,,500,90,,1,0,2055918,2,2,4,24,1,{},{ bonus bLuk,5; bonus bFlee2,20; },,,,
-1224,Sword_Breaker,Swordbreaker,4,20,,1000,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bBreakWeaponRate,100; },,,,,,
-1225,Mail_Breaker,Mailbreaker,4,20,,1000,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bBreakArmorRate,100; },,,,,,
-1226,Damascus_,Damascus,4,49000,,800,118,,1,2,2055918,2,2,3,24,1,{},{},,,,,,
-1227,Weeder_Knife,Weeder Knife,4,20,,400,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,3; bonus2 bAddRace,3,15; bonus2 bSubRace,3,15; },
-1228,Combat_Knife,Combat Knife,4,20,,400,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,7; bonus2 bSubRace,7,10; bonus2 bSubRace,6,-10; },
-1229,Mama's_Knife,Mama's Knife,4,20,,500,75,,1,0,2055918,2,2,4,36,1,{},{ bonus bCritical,30; bonus2 bAddRace,7,3; bonus3 bAddMonsterDropItem,517,2,5000; }
-1230,House_Auger,House Auger,4,20,,600,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bDefRatioAtkRace,10; bonus bDefRatioAtkRace,11; },,,,
-1231,Bazerald,Bazerald,4,20,,500,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bAtkEle,3; bonus bInt,5; bonus bMatkRate,10; },,,
-1232,Assassin_Dagger,Assasin Dagger,4,20,,600,140,,1,0,4096,2,2,4,36,1,{},{ bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdAddRate,2; bonus bAtkEle,7; },,
-1233,Exercise,Excorcise,4,20,,700,90,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,6; bonus2 bSubRace,6,5; bonus2 bSubRace,7,-10; },
-1234,Moonlight_Sword,Walgwanggum,4,20,,700,50,,1,0,2055918,2,2,4,36,1,{},{ bonus bMaxSPrate,10; bonus2 bSPDrainRate,100,3; },,,,,
-1235,Azoth,Azoth,4,20,,700,110,,1,0,262144,2,2,4,36,1,{},{},,,,,,
-1236,Sucsamad,Sucsamad,4,20,,800,140,,1,0,2055918,2,2,4,36,1,{},{ bonus2 bAddEle,2,10; bonus2 bAddEle,4,10; bonus bUnbreakable,100; },,
-1237,Grimtooth_,Grimtooth,4,20,,800,180,,1,0,2055918,2,2,4,36,1,{},{ bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50; },,
-1238,Zeny_Knife,Zeny Knife,4,20,,1200,64,,1,0,2055918,2,2,3,40,1,{},{ bonus bGetZenyNum,100; },,,,,
-1239,Poison_Knife,Poison Knife,4,20,,800,64,,1,0,2055918,2,2,3,65,1,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,2000; },,,,,
-1240,Princess_Knife,Princess Knife,4,20,,400,84,,1,0,2055918,2,2,4,1,1,{},{ bonus bStr,1; bonus bAgi,1; bonus bVit,1; bonus bInt,1; bonus bDex,1; bonus bLuk,1; }
-1241,Cursed_Dagger,Cursed Dagger,4,20,,400,55,,1,0,66052,2,2,4,85,1,{},{ bonus2 bAddEff,Eff_Curse,500; },,,,
-1242,Counter_Dagger,Counter Dagger,4,20,,550,75,,1,0,66052,2,2,4,55,1,{},{ bonus bCritical,5; bonus3 bAutoSpell,61,1,25; },,,,,
-1243,Main_Gauche_For_Novice,Novice Main Gauche,4,20,,1,45,,1,0,8388609,2,2,1,1,1,{},{},,,,,,
-// Katars
-1250,Jur,Jur,4,19500,,800,125,,1,2,4096,2,34,2,18,16,{},{},,,,,,
-1251,Jur_,Jur,4,19500,,800,125,,1,3,4096,2,34,2,18,16,{},{},,,,,,
-1252,Katar,Katar,4,41000,,1200,148,,1,1,4096,2,34,3,33,16,{},{ bonus bDex,1; },,,,,
-1253,Katar_,Katar,4,41000,,1200,148,,1,2,4096,2,34,3,33,16,{},{ bonus bDex,1; },,,,,
-1254,Jamadhar,Jamadhar,4,37200,,1500,165,,1,0,4096,2,34,3,33,16,{},{},,,,,,
-1255,Jamadhar_,Jamadhar,4,37200,,1500,165,,1,1,4096,2,34,3,33,16,{},{},,,,,,
-1256,Katar_of_Cold_Icicle,Katar of Cold Icicle,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500; },,,
-1257,Katar_of_Thornbush,Katar of Dusty Thornbush,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,2; bonus2 bAddEff,Eff_Blind,500; },,
-1258,Katar_of_Raging_Blaze,Katar of Raging Blaze,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,3; bonus2 bAddEff,Eff_Silence,500; },,
-1259,Katar_of_Piercing_Wind,Katar of Piercing Wind,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,4; bonus2 bAddEff,Eff_Sleep,500; },,
-1260,Sharpened_Legbone_of_Ghoul,Sharpened Legbone of Ghoul,4,52500,,1700,150,,1,0,4096,2,34,3,65,16,{},{ bonus bAtkEle,9; },,,,
-1261,Infiltrator,Infiltrator,4,57000,,1500,140,,1,0,4096,2,34,4,75,16,{},{ bonus2 bAddRace,7,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; }
-// Axes
-1301,Axe,Axe,4,500,,800,38,,1,3,8803555,2,2,1,3,6,{},{},,,,,
-1302,Axe_,Axe,4,500,,800,38,,1,4,8803555,2,2,1,3,6,{},{},,,,,
-1303,Axe__,Axe,4,500,,800,38,,1,0,8803555,2,2,1,3,6,{},{},,,,,
-1304,Orcish_Axe,Orcish Axe,4,20,,1500,75,,1,0,8803555,2,2,3,3,6,{},{},,,,,
-1305,Cleaver,Cleaver,4,20,,1200,140,,1,0,279714,2,2,4,44,6,{},{ bonus2 bAddRace,7,5; bonus3 bAddMonsterDropItem,517,2,3000; }
-1306,War_Axe,War Axe,4,20,,4200,145,,1,1,263168,2,2,3,76,6,{},{ bonus bDex,2; bonus bLuk,2; },,,
-1351,Battle_Axe,Battle Axe,4,5400,,1500,80,,1,3,279714,2,34,1,3,7,{},{},,,,,
-1352,Battle_Axe_,Battle Axe,4,5400,,1500,80,,1,4,279714,2,34,1,3,7,{},{},,,,,
-1353,Battle_Axe__,Battle Axe,4,5400,,1500,80,,1,0,279714,2,34,1,3,7,{},{},,,,,
-1354,Hammer,Hammer,4,15500,,2000,120,,1,2,279714,2,34,2,16,7,{},{},,,,
-1355,Hammer_,Hammer,4,15500,,2000,120,,1,3,279714,2,34,2,16,7,{},{},,,,
-1356,Hammer__,Hammer,4,15500,,2200,120,,1,0,279714,2,34,2,16,7,{},{},,,,
-1357,Buster,Buster,4,34000,,2200,155,,1,1,279714,2,34,3,30,7,{},{},,,,
-1358,Buster_,Buster,4,34000,,2200,155,,1,2,279714,2,34,3,30,7,{},{},,,,
-1359,Buster__,Buster,4,34000,,2200,155,,1,0,279714,2,34,3,30,7,{},{},,,,
-1360,Two_handed_Axe,Two-handed Axe,4,55000,,2500,185,,1,1,279714,2,34,3,30,7,{},{},,,,
-1361,Two_handed_Axe_,Two-handed Axe,4,55000,,2500,185,,1,2,279714,2,34,3,30,7,{},{},,,,
-1362,Two_handed_Axe__,Two-handed Axe,4,55000,,2500,185,,1,0,279714,2,34,3,30,7,{},{},,,,
-1363,Blood_Axe,Bloody Axe,4,20,,400,170,,1,0,279714,2,34,4,44,7,{},{ bonus bStr,10; bonus bSpeedRate,25; },,
-1364,Great_Axe,Great Axe,4,20,,1800,187,,1,0,279714,2,34,4,44,7,{},{ bonus2 bAddEff,Eff_Stan,1500; },,
-1365,Sabbath,Sabbath,4,20,,2300,120,,1,0,279714,2,34,4,44,7,{},{ bonus2 bWeaponComaRace,6,50; bonus bAtkEle,7; },
-1366,Light_Epsilon,Light Epsilon,4,20,,2300,180,,1,0,279714,2,34,4,44,7,{},{ bonus bAtkEle,6; skill 28,3; bonus2 bAddRace,6,3; }
-1367,Slaughter,Slaughter,4,20,,2500,120,,1,0,279714,2,34,4,44,7,{},{ bonus bIgnoreDefRace,2; bonus2 bWeaponComaRace,2,50; },
-1368,Tomahawk,Tomahawk,4,20,,2500,165,,1,0,279714,2,34,4,44,7,{},{ bonus bAtkEle,4; },,,
-1369,Guillotine,Guillotine,4,20,,3000,215,,1,0,279714,2,34,4,44,7,{},{ bonus2 bWeaponComaRace,7,30; bonus2 bSPDrainRate,500,2; },,
-// Spears
-1401,Javelin,Javelin,4,150,,700,28,,3,3,16514,2,2,1,4,4,{},{},,,
-1402,Javelin_,Javelin,4,150,,700,28,,3,4,16514,2,2,1,4,4,{},{},,,
-1403,Javelin__,Javelin,4,150,,700,28,,3,0,16514,2,2,1,4,4,{},{},,,
-1404,Spear,Spear,4,1700,,850,44,,3,3,16514,2,2,1,4,4,{},{},,,
-1405,Spear_,Spear,4,1700,,850,44,,3,4,16514,2,2,1,4,4,{},{},,,
-1406,Spear__,Spear,4,1700,,850,44,,3,0,16514,2,2,1,4,4,{},{},,,
-1407,Pike,Pike,4,3450,,1000,60,,3,3,16514,2,2,1,4,4,{},{},,,
-1408,Pike_,Pike,4,3450,,1000,60,,3,4,16514,2,2,1,4,4,{},{},,,
-1409,Pike__,Pike,4,3450,,1000,60,,3,0,16514,2,2,1,4,4,{},{},,,
-1410,Lance,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
-1411,Lance_,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
-1412,Lance__,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
-1413,Gungnir,Gungnir,4,20,,500,120,,3,0,16514,2,2,4,4,4,{},{ bonus bAtkEle,4; bonus bPerfectHitRate,25; bonus bHit,30; }
-1414,Gelerdria,Gelerdria,4,20,,700,145,,3,0,16514,2,2,4,48,4,{},{ bonus bAtkEle,2; bonus bMaxHP,500; bonus bMaxSP,-50; }
-1415,Skewer,Brocca,4,20,,850,100,,3,0,16514,2,2,4,48,4,{},{ bonus bIgnoreDefRace,11; bonus2 bAddEle,0,25; }
-1416,Tjungkuletti,Tjungkuletti,4,20,,1000,95,,3,0,16514,2,2,4,48,4,{},{ bonus2 bSPDrainRate,10000,1; bonus2 bSPDrainRate,100,5; },,,
-1417,Pole_Axe,Pole Axe,4,20,,3800,160,,3,1,16514,2,2,3,71,4,{},{ bonus bStr,1; bonus bInt,2; bonus bDex,1; }
-1451,Guisarme,Guisarme,4,13000,,1000,84,,3,2,16514,2,34,2,18,5,{},{},,,
-1452,Guisarme_,Guisarme,4,13000,,1000,84,,3,3,16514,2,34,2,18,5,{},{},,,
-1453,Guisarme__,Guisarme,4,13000,,1000,84,,3,0,16514,2,34,2,18,5,{},{},,,
-1454,Glaive,Glaive,4,20000,,1200,104,,3,2,16514,2,34,2,18,5,{},{},,,
-1455,Glaive_,Glaive,4,20000,,1200,104,,3,3,16514,2,34,2,18,5,{},{},,,
-1456,Glaive__,Glaive,4,20000,,1200,104,,3,0,16514,2,34,2,18,5,{},{},,,
-1457,Partizan,Partizan,4,27000,,2000,124,,3,1,16514,2,34,2,18,5,{},{},,,
-1458,Partizan_,Partizan,4,27000,,2000,124,,3,2,16514,2,34,2,18,5,{},{},,,
-1459,Partizan__,Partizan,4,27000,,2000,124,,3,0,16514,2,34,3,33,5,{},{},,,
-1460,Trident,Trident,4,51000,,1200,150,,3,2,16514,2,34,3,33,5,{},{},,,
-1461,Trident_,Trident,4,51000,,1200,150,,3,3,16514,2,34,3,33,5,{},{},,,
-1462,Trident__,Trident,4,51000,,1200,150,,3,0,16514,2,34,3,33,5,{},{},,,
-1463,Halberd,Halberd,4,54000,,2500,165,,3,1,16514,2,34,3,33,5,{},{},,,
-1464,Halberd_,Halberd,4,54000,,2500,165,,3,2,16514,2,34,3,33,5,{},{},,,,,,,
-1465,Halberd__,Halberd,4,54000,,2500,165,,3,0,16514,2,34,3,33,5,{},{},,,,,,,
-1466,Crescent_Scythe,Crescent Scythe,4,20,,2500,180,,3,0,16514,2,34,4,48,5,{},{ bonus bCritical,30; bonus bHit,10; },,,,,
-1467,Bill_Guisarme,Bill Guisarme,4,20,,1000,183,,3,0,16514,2,34,4,48,5,{},{ bonus2 bAddRace,2,10; bonus2 bAddRace,7,5; },,,
-1468,Zephyrus,Zephyrus,4,20,,2000,170,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,4; skill 21,3; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,25; }
-1469,Longinus's_Spear,Longinus's Spear,4,20,,2500,180,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,7; bonus2 bAddRace,7,10; bonus2 bAddRace,8,10; },,
-1470,Brionac,Brionac,4,20,,3000,190,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,6; skill 28,5; skill 13,3; bonus3 bAutoSpell,13,3,25; bonus2 bAddRace,10,5; },
-1471,Hellfire,Hellfire,4,20,,3500,200,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,3; skill 17,3; bonus3 bAutoSpell,17,3,25; bonus bStr,3; },,
-// 2 Handed Staffs
-1472,Staff_of_Soul,Soul Staff,4,20,,1400,25,,1,0,66052,2,34,3,73,10,{},{ bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15; },,,,
-1473,Wizardy_Staff,Wizardy Staff,4,20,,2400,120,,1,0,66052,2,34,4,90,10,{},{ bonus bInt,6; bonus bDex,2; bonus bMatkRate,15; },,,,
-// Clubs and Maces
-1501,Club,Club,4,120,,700,23,,1,3,8836595,2,2,1,2,8,{},{},,,,,,,
-1502,Club_,Club,4,120,,700,23,,1,4,8836595,2,2,1,2,8,{},{},,,,,,,
-1503,Club__,Club,4,120,,700,23,,1,0,8836595,2,2,1,2,8,{},{},,,,,,,
-1504,Mace,Mace,4,1600,,800,37,,1,3,8836595,2,2,1,2,8,{},{},,,,,,,
-1505,Mace_,Mace,4,1600,,800,37,,1,4,8836595,2,2,1,2,8,{},{},,,,,,,
-1506,Mace__,Mace,4,1600,,800,37,,1,0,8836595,2,2,1,2,8,{},{}
-1507,Smasher,Smasher,4,9000,,1000,54,,1,2,8836595,2,2,2,14,8,{},{}
-1508,Smasher_,Smasher,4,9000,,1000,54,,1,3,8836595,2,2,2,14,8,{},{}
-1509,Smasher__,Smasher,4,9000,,1000,54,,1,3,8836595,2,2,2,14,8,{},{}
-1510,Flail,Flail,4,16000,,900,69,,1,2,447986,2,2,2,14,8,{},{}
-1511,Flail_,Flail,4,16000,,900,69,,1,3,447986,2,2,2,14,8,{},{}
-1512,Flail__,Flail,4,16000,,900,69,,1,3,447986,2,2,2,14,8,{},{}
-1513,Morning_Star,Morning Star,4,41000,,1500,110,,1,1,447986,2,2,3,27,8,{},{}
-1514,Morning_Star_,Morning Star,4,41000,,1500,110,,1,2,447986,2,2,3,27,8,{},{}
-1515,Morning_Star__,Morning Star,4,41000,,1500,110,,1,2,447986,2,2,3,27,8,{},{}
-1516,Sword_Mace,Sword Mace,4,50000,,1200,130,,1,0,447986,2,2,3,27,8,{},{}
-1517,Sword_Mace_,Sword Mace,4,50000,,1200,130,,1,1,447986,2,2,3,27,8,{},{}
-1518,Sword_Mace__,Sword Mace,4,50000,,1200,130,,1,1,447986,2,2,3,27,8,{},{}
-1519,Chain,Chain,4,23000,,800,84,,1,2,447986,2,2,2,14,8,{},{}
-1520,Chain_,Chain,4,23000,,800,84,,1,3,447986,2,2,2,14,8,{},{}
-1521,Chain__,Chain,4,23000,,800,84,,1,3,447986,2,2,2,14,8,{},{}
-1522,Stunner,Stunner,4,60000,,2000,140,,1,0,33040,2,2,3,27,8,{},{ bonus2 bAddEff,Eff_Stan,1000; },,,,
-1523,Spike,Spike,4,20,,700,85,,1,0,33040,2,2,4,40,8,{},{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },,,
-1524,Golden_Mace,Golden Mace,4,20,,800,110,,1,1,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,10; bonus bUnbreakable,100; },,,,
-1525,Long_Mace,Long Mace,4,20,,800,135,,3,0,33040,2,2,4,40,8,{},{ bonus bLongAtkDef,10; },,,,,
-1526,Slash,Slash,4,20,,1000,145,,1,0,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,15; bonus2 bWeaponComaRace,1,50; },,
-1527,Quadrille,Quadrille,4,20,,900,165,,1,0,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,10; bonus2 bAddRace,7,10; bonus2 bAddEle,2,10; }
-1528,Grand_Cross,Grand Cross,4,20,,1500,140,,1,0,33040,2,2,4,40,8,{},{ bonus bAtkEle,6; skill 77,3; bonus3 bAutoSpell,77,3,25; bonus2 bHPDrainRate,1000,1; },
-1529,Iron_Driver,Iron Driver,4,20,,3000,155,,1,0,33024,2,2,3,78,8,{},{},,,,,,
-1530,Mjolnir,Mjolnir,4,20,,6000,250,,1,0,10477567,2,2,4,98,8,{},{ bonus bAtkEle,4; bonus bDex,40; bonus bStr,15; bonus bAspdRate,30; },,
-1531,Spanner,Spanner,4,20,,2500,115,,1,0,33040,2,2,3,55,8,{},{ bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Stan,100; bonus2 bAddEff,Eff_Poison,100; bonus2 bAddEff,Eff_Freeze,100; },,,,,,
-// Books
-1550,Book,Book,4,30000,,600,85,,1,3,65792,2,2,2,14,15,{},{},,,,,,
-1551,Bible,Bible,4,60000,,1000,115,,1,2,65792,2,2,3,27,15,{},{ bonus bInt,2; },,,,,
-1552,Tablet,Tablet,4,51000,,800,125,,1,1,65792,2,2,3,27,15,{},{},,,,,,
-1553,Book_of_Billows,Book of Billows,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,1; },,,,,
-1554,Book_of_Mother_Earth,Book of Mother Earth,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,2; },,,,,
-1555,Book_of_Blazing_Sun,Book of Blazing Sun,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,3; },,,,,,,,,,
-1556,Book_of_Gust_of_Wind,Book of Gust of Wind,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,4; },,,,,,,,,,
-1557,Book_of_the_Apocalypse,Book of the Apocalypse,4,35000,,800,120,,1,0,65792,2,2,4,40,15,{},{ bonus bAtkEle,7; bonus2 bSubEle,6,-5; bonus2 bAddEle,1,7; bonus2 bAddEle,2,7; bonus2 bAddEle,3,7; bonus2 bAddEle,4,7; }
-1558,Girl's_Diary,Girl's Diary,4,20,,300,60,,1,1,65792,2,2,4,40,15,{},{ bonus2 bAddDamageClass,1188,150; },,,,,,,,,
-1599,Angra_Manyu,Angra Manyu,4,120,,10,1,,1,5,10477567,2,2,4,2,8,{},{},,,,,,,,,,,
-// Rods and Staffs
-1601,Rod,Rod,4,50,,400,15,,1,3,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
-1602,Rod_,Rod,4,50,,400,15,,1,4,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
-1603,Rod__,Rod,4,50,,400,15,,1,0,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
-1604,Wand,Wand,4,2500,,400,25,,1,2,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
-1605,Wand_,Wand,4,2500,,400,25,,1,3,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
-1606,Wand__,Wand,4,2500,,400,25,,1,0,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
-1607,Staff,Staff,4,9500,,400,40,,1,2,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
-1608,Staff_,Staff,4,9500,,400,40,,1,3,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
-1609,Staff__,Staff,4,9500,,400,40,,1,0,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
-1610,Arc_Wand,Arc Wand,4,45000,,400,60,,1,1,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
-1611,Arc_Wand_,Arc Wand,4,45000,,400,60,,1,2,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
-1612,Arc_Wand__,Arc Wand,4,45000,,400,60,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
-1613,Mighty_Staff,Mighty Staff,4,20,,700,130,,1,0,99092,2,2,3,24,10,{},{ bonus bStr,10; bonus bMatkRate,15; bonus2 bSpDrainRate,10000,-2; },
-1614,Blessed_Wand,Wand of Occult,4,20,,700,75,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
-1615,Bone_Wand,Bone Wand,4,20,,700,40,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,4; bonus bAtkEle,9; bonus bMatkRate,15; }
-// Bows
-1701,Bow,Bow,4,1000,,500,15,,5,3,1706056,2,34,1,4,11,{},{},,,
-1702,Bow_,Bow,4,1000,,500,15,,5,4,1706056,2,34,1,4,11,{},{},,,
-1703,Bow__,Bow,4,1000,,500,15,,5,0,1706056,2,34,1,4,11,{},{},,,
-1704,Composite_Bow,Composite Bow,4,2500,,600,29,,5,3,1706056,2,34,1,4,11,{},{},,,
-1705,Composite_Bow_,Composite Bow,4,2500,,600,29,,5,4,1706056,2,34,1,4,11,{},{},,,
-1706,Composite_Bow__,Composite Bow,4,2500,,600,29,,5,0,1706056,2,34,1,4,11,{},{},,,
-1707,Great_Bow,Great Bow,4,10000,,1000,50,,5,2,1706056,2,34,2,18,11,{},{},,,
-1708,Great_Bow_,Great Bow,4,10000,,1000,50,,5,3,1706056,2,34,2,18,11,{},{},,,
-1709,Great_Bow__,Great Bow,4,10000,,1000,50,,5,0,1706056,2,34,2,18,11,{},{},,,
-1710,CrossBow,Cross Bow,4,17000,,900,65,,5,2,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
-1711,CrossBow_,Cross Bow,4,17000,,900,65,,5,3,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
-1712,CrossBow__,Cross Bow,4,17000,,900,65,,5,0,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
-1713,Arbalest,Arbalest,4,48000,,1000,90,,5,1,1706056,2,34,3,33,11,{},{ bonus bDex,2; },,,,,,,,,,,,,
-1714,Gakkung,Gakkung,4,42000,,1100,100,,5,1,1706056,2,34,3,33,11,{},{},,,,,,,,,,,,,,
-1715,Arbalest_,Arbalest,4,48000,,1000,90,,5,2,1706056,2,34,3,33,11,{},{ bonus bDex,2; },,,,,,,,,,,,,
-1716,Gakkung_,Gakkung,4,42000,,1100,100,,5,2,1706056,2,34,3,33,11,{},{},,,,,,,,,,,,,,
-1718,Hunter_Bow,Hunter Bow,4,64000,,1500,125,,5,0,2048,2,34,3,33,11,{},{},,,,,,,,,,,,,,
-1719,Bow_of_Roguemaster,Roguemaster's Bow,4,20,,500,75,,11,0,64,2,34,4,48,11,{},{ bonus2 bAddStealRate,100,0; },,,,,,,,,,,,,,
-1720,Bow_of_Rudra,Rudra's Bow,4,20,,1200,150,,5,0,1705992,2,34,4,48,11,{},{ bonus bAtkEle,6; 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,Repeating_Crossbow,Repeating Crossbow,4,89000,,2000,95,,9,1,133184,2,34,3,65,11,{},{},,,,,,,,,,,,,,
-1722,Ballista,Ballista,4,20,,3500,145,,5,0,1574912,2,34,4,77,11,{},{},,,,,,,,,,,,,,
-// Arrows
-1750,Arrow,Arrow,10,1,,1,25,,,,1706056,2,32768,,1,,{},{},,,,,,,,,,,,,,
-1751,Silver_Arrow,Silver Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,6; },,,,,,,,,,,,,
-1752,Fire_Arrow,Fire Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,3; },,
-1753,Steel_Arrow,Steel Arrow,10,3,,2,40,,,,1706056,2,32768,,1,,{},{},,,
-1754,Crystal_Arrow,Crystal Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,1; },,
-1755,Arrow_of_Wind,Arrow of Wind,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,4; },,
-1756,Stone_Arrow,Stone Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,2; },,
-1757,Immaterial_Arrow,Immaterial Arrow,10,3,,1,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,8; },,
-1758,Stun_Arrow,Stun Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Stan,500; },
-1759,Freezing_Arrow,Freeze Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500; }
-1760,Flash_Arrow,Flash Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Blind,500; },
-1761,Curse_Arrow,Curse Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Curse,500; },
-1762,Rusty_Arrow,Rusted Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,5; },,
-1763,Poison_Arrow,Poison Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,500; }
-1764,Incisive_Arrow,Sharp Arrow,10,3,,3,10,,,,1706056,2,32768,,1,,{},{ bonus bCritical,10; },,
-1765,Oridecon_Arrow,Oridecon Arrow,10,3,,3,50,,,,1706056,2,32768,,1,,{},{},,,
-1766,Arrow_of_Counter_Evil,Arrow of Counter Evil,10,40,,3,50,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,6; },,
-1767,Arrow_of_Shadow,Shadow Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,7; },,
-1768,Sleep_Arrow,Sleep Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Sleep,500; }
-1769,Silence_Arrow,Mute Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Silence,500; }
-1770,Iron_Arrow,Iron Arrow,10,2,,1,30,,,,1706056,2,32768,,1,,{},{},,
-// Knuckles
-1801,Waghnakh,Waghnakh,4,8000,,400,30,,1,3,33024,2,2,1,1,12,{},{},,
-1802,Waghnakh_,Waghnakh,4,8000,,400,30,,1,4,33024,2,2,1,1,12,{},{},,
-1803,Knuckle_Duster,Knuckle Duster,4,25000,,450,50,,1,2,33024,2,2,2,12,12,{},{},,
-1804,Knuckle_Duster_,Knuckle Duster,4,25000,,450,50,,1,3,33024,2,2,2,12,12,{},{},,
-1805,Hora,Hora,4,32000,,450,65,,1,2,33024,2,2,2,12,12,{},{},,
-1806,Hora_,Hora,4,32000,,450,65,,1,3,33024,2,2,2,12,12,{},{},,
-1807,Fist,Fist,4,53000,,650,115,,1,0,33024,2,2,3,24,12,{},{},,
-1808,Fist_,Fist,4,53000,,650,115,,1,1,33024,2,2,3,24,12,{},{},,
-1809,Claw,Claw,4,55000,,500,86,,1,1,33024,2,2,3,24,12,{},{ bonus bStr,2; },
-1810,Claw_,Claw,4,55000,,500,86,,1,2,33024,2,2,3,24,12,{},{ bonus bStr,2; },
-1811,Finger,Finger,4,58000,,500,97,,1,1,33024,2,2,3,24,12,{},{},,
-1812,Finger_,Finger,4,58000,,500,97,,1,2,33024,2,2,3,24,12,{},{},,
-1813,Kaiser_Knuckle,Kaiser Knuckle,4,20,,450,110,,1,0,33024,2,2,4,36,12,{},{ bonus bAtkEle,4; bonus2 bAddRace,1,5; bonus2 bAddEle,1,10; bonus2 bAddEle,2,10; bonus2 bAddEle,3,10; bonus2 bAddEle,4,10; }
-1814,Berserk,Berserk,4,20,,500,120,,1,0,33024,2,2,4,36,12,{},{ bonus bAspdRate,12; },,,,,,,,,,
-// Instruments
-1901,Violin,Violin,4,4000,,700,50,,1,3,524288,2,2,1,2,13,{},{},,,,,,,,,,,
-1902,Violin_,Violin,4,4000,,700,50,,1,4,524288,2,2,1,2,13,{},{},,,,,,,,,,,
-1903,Mandolin,Mandolin,4,18000,,400,90,,1,2,524288,2,2,2,14,13,{},{},,,,,,,,,,,
-1904,Mandolin_,Mandolin,4,18000,,400,90,,1,3,524288,2,2,2,14,13,{},{},,,,,,,,,,,
-1905,Lute,Lute,4,24500,,500,105,,1,2,524288,2,2,2,14,13,{},{},,,,,,,,,,,
-1906,Lute_,Lute,4,24500,,500,105,,1,3,524288,2,2,2,14,13,{},{},,,,,,,,,,,
-1907,Guitar,Guitar,4,47000,,900,142,,1,0,524288,2,2,3,27,13,{},{},,,,,,,,,,,
-1908,Guitar_,Guitar,4,47000,,900,142,,1,1,524288,2,2,3,27,13,{},{},,,,,,,,,,,
-1909,Harp,Harp,4,62000,,900,114,,1,1,524288,2,2,3,27,13,{},{ bonus bInt,2; },,,,,,,,,,
-1910,Harp_,Harp,4,62000,,900,114,,1,2,524288,2,2,3,27,13,{},{ bonus bInt,2; },,,,,,,,,,
-1911,Guh_Moon_Goh,Guhmoongoh,4,54000,,1300,126,,1,1,524288,2,2,3,27,13,{},{},,,,,,,,,,,
-1912,Guh_Moon_Goh_,Guhmoongoh,4,54000,,1300,126,,1,2,524288,2,2,3,27,13,{},{},,,,,,,,,,,
-1913,Electric_Guitar,Electric Guitar,4,20,,1800,110,,1,0,524288,2,2,4,70,13,{},{ bonus3 bAutoSpell,84,1,25; bonus bAtkEle,4; bonus bInt,2; bonus bAgi,1; }
-// Whips
-1950,Rope,Rope,4,2500,,400,45,,2,3,1048576,2,2,1,3,14,{},{},,,
-1951,Rope_,Rope,4,2500,,400,45,,2,4,1048576,2,2,1,3,14,{},{},,,
-1952,Line,Line,4,12000,,300,80,,2,2,1048576,2,2,2,16,14,{},{},,,
-1953,Line_,Line,4,12000,,300,80,,2,3,1048576,2,2,2,16,14,{},{},,,
-1954,Wire,Wire,4,17500,,1000,95,,2,2,1048576,2,2,2,16,14,{},{},,,
-1955,Wire_,Wire,4,17500,,1000,95,,2,3,1048576,2,2,2,16,14,{},{},,,
-1956,Rante_Whip,Rante Whip,4,32000,,900,135,,2,0,1048576,2,2,3,30,14,{},{},,,
-1957,Rante_Whip_,Rante Whip,4,32000,,900,135,,2,1,1048576,2,2,3,30,14,{},{},,,
-1958,Tail,Tail,4,41000,,700,105,,2,1,1048576,2,2,3,30,14,{},{ bonus bLuk,3; },,
-1959,Tail_,Tail,4,41000,,700,105,,2,2,1048576,2,2,3,30,14,{},{ bonus bLuk,3; },,
-1960,Whip,Whip,4,38000,,700,120,,2,1,1048576,2,2,3,30,14,{},{},,,
-1961,Whip_,Whip,4,38000,,700,120,,2,2,1048576,2,2,3,30,14,{},{},,,
-1962,Lariat,Lariat,4,20,,400,100,,2,0,1048576,2,2,4,44,14,{},{ bonus bDex,5; bonus bAgi,1; },
-1963,Rapture_Rose,Rapture Rose,4,20,,300,115,,2,0,1048576,2,2,4,44,14,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,5000; }
-1964,Chemeti,Chemeti,4,20,,700,135,,2,0,1048576,2,2,4,44,14,{},{ bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2; }
-
-1998,Jeramiah's_Jur,Jeramiah's Jur,3,20,,10,,,,,,,,,,,{},{}
-1999,Zed's_Staff,Zed's Staff,3,20,,10,,,,,,,,,,,{},{}
-
-// Shields
-//===================================================================
-2101,Guard,Guard,5,500,,300,,3,,0,10477567,2,32,,0,1,{},{},,,
-2102,Guard_,Guard,5,500,,300,,3,,1,10477567,2,32,,0,1,{},{},,,
-2103,Buckler,Buckler,5,14000,,600,,4,,0,2020850,2,32,,0,2,{},{},,,
-2104,Buckler_,Buckler,5,14000,,600,,4,,1,2020850,2,32,,0,2,{},{},,,
-2105,Shield,Shield,5,56000,,1300,,6,,0,16514,2,32,,0,3,{},{},,,
-2106,Shield_,Shield,5,56000,,1300,,6,,1,16514,2,32,,0,3,{},{},,,
-2107,Mirror_Shield,Mirror Shield,5,60000,,1000,,4,,0,16514,2,32,,0,4,{},{ bonus bMdef,5; },,
-2108,Mirror_Shield_,Mirror Shield,5,60000,,1000,,4,,1,16514,2,32,,0,4,{},{ bonus bMdef,5; },,
-2109,Memorize_Book,Book of Summoning,5,20,,1000,,3,,0,66052,2,32,,0,,{},{ bonus bInt,1; bonus bMdef,2; },
-2110,Holy_Guard,Holy Guard,5,20,,1400,,5,,0,16384,2,32,,68,3,{},{ bonus bVit,2; bonus bMdef,2; },
-2111,Evangelist,Evangelist,5,20,,1400,,5,,0,16384,2,32,,83,3,{},{ bonus bVit,3; bonus bInt,2; bonus bMdef,3; bonus bUnbreakable,100; }
-2112,Novice_Guard,Novice Guard,5,20,,1,,3,,0,8388609,2,32,,0,1,{},{},,,
-2199,Ahura_Mazda,Ahura Mazda,5,20,,100,,,,0,10477567,2,32,,,,{},{ bonus bMdef,150; bonus bDef,150; bonus bFlee2,100; bonus2 bSubEle,0,100; }
-
-// Headgear items
-//===================================================================
-2201,Sunglasses,Sunglasses,5,5000,,100,,0,,0,10477567,2,512,,0,12,{},{ bonus2 bResEff,Eff_Blind,500; },
-2202,Sunglasses_,Sunglasses,5,5000,,100,,0,,1,10477567,2,512,,0,12,{},{ bonus2 bResEff,Eff_Blind,500; }
-2203,Glasses,Glasses,5,4000,,100,,0,,0,10477567,2,512,,0,3,{},{},,
-2204,Glasses_,Glasses,5,4000,,100,,0,,1,10477567,2,512,,0,3,{},{},,
-2205,Diver's_Goggles,Diver Goggles,5,3500,,100,,0,,0,10477567,2,512,,0,10,{},{},,
-2206,Wedding_Veil,Wedding Veil,5,23000,,100,,0,,0,10477567,0,256,,0,44,{},{ bonus bMdef,5; },
-2207,Fancy_Flower,Fancy Flower,5,20,,100,,0,,0,10477567,2,256,,0,4,{},{ bonus2 bSubRace,3,10; }
-2208,Ribbon,Ribbon,5,800,,100,,1,,0,10477567,2,256,,0,17,{},{ bonus bMdef,3; },
-2209,Ribbon_,Ribbon,5,800,,100,,1,,1,10477567,2,256,,0,17,{},{ bonus bMdef,3; },
-2210,Hair_Band,Hair Band,5,500,,100,,1,,0,10477567,2,256,,0,9,{},{},,
-2211,Bandana,Bandana,5,400,,100,,1,,0,10477567,2,256,,0,6,{},{},,
-2212,Eye_Bandage,Eye Patch,5,1000,,100,,0,,0,10477567,2,512,,0,13,{},{},,
-2213,Kitty_Band,Kitty Band,5,20,,100,,2,,0,10477567,2,256,,0,2,{},{},,
-2214,Bunny_Band,Bunny Band,5,20,,100,,2,,0,10477567,2,256,,0,15,{},{ bonus bLuk,2; },
-2215,Flower_Hairband,Flower Band,5,20,,100,,2,,0,10477567,2,256,,0,5,{},{},,
-2216,Biretta,Biretta,5,9000,,100,,4,,0,33040,2,256,,0,11,{},{},,
-2217,Biretta_,Biretta,5,9000,,100,,4,,1,33040,2,256,,0,11,{},{},,
-2218,Flu_Mask,Flu Mask,5,300,,100,,0,,0,10477567,2,1,,0,8,{},{ bonus2 bResEff,Eff_Silence,1000; }
-2219,Flu_Mask_,Flu Mask,5,300,,100,,0,,1,10477567,2,1,,0,8,{},{ bonus2 bResEff,Eff_Silence,1000; }
-2220,Hat,Hat,5,1000,,200,,2,,0,10477567,2,256,,0,16,{},{},,
-2221,Hat_,Hat,5,1000,,200,,2,,1,10477567,2,256,,0,16,{},{},,
-2222,Turban,Turban,5,4500,,300,,3,,0,2088958,2,256,,0,7,{},{},,
-2223,Turban_,Turban,5,4500,,300,,3,,1,2088958,2,256,,0,7,{},{},,
-2224,Goggles,Goggles,5,10000,,300,,5,,0,1989866,2,768,,0,1,{},{},,
-2225,Goggles_,Goggles,5,10000,,300,,5,,1,1989866,2,768,,0,1,{},{},,
-2226,Cap,Cap,5,12000,,400,,4,,0,1989866,2,256,,0,14,{},{},,
-2227,Cap_,Cap,5,12000,,400,,4,,1,1989866,2,256,,0,14,{},{},,
-2228,Helm,Helm,5,44000,,600,,6,,0,16514,2,256,,0,40,{},{},,
-2229,Helm_,Helm,5,44000,,600,,6,,1,16514,2,256,,0,40,{},{},,
-2230,Gemmed_Sallet,Gemmed Sallet,5,50000,,500,,4,,0,414946,2,256,,0,0,{},{ bonus bMdef,3; },
-2231,Gemmed_Sallet_,Gemmed Sallet,5,50000,,500,,4,,1,414946,2,256,,0,0,{},{ bonus bMdef,3; },
-2232,Circlet,Circlet,5,7500,,300,,3,,0,99092,2,256,,0,18,{},{ bonus bMdef,3; },
-2233,Circlet_,Circlet,5,7500,,300,,3,,1,99092,2,256,,0,18,{},{ bonus bMdef,3; },
-2234,Tiara,Tiara,5,20,,400,,4,,0,2088958,0,256,,45,19,{},{ bonus bInt,2; },
-2235,Crown,Crown,5,20,,400,,4,,0,2088958,1,256,,45,45,{},{ bonus bInt,2; },
-2236,Santa's_Hat,Santa's Hat,5,20,,100,,1,,0,10477567,2,256,,0,20,{},{ bonus bMdef,1; bonus bLuk,1; }
-2237,Bandit_Beard,Bandit Beard,5,2,,100,,0,,0,10477567,2,1,,0,21,{},{},,
-2238,Moustache,Moustache,5,2,,100,,0,,0,10477567,2,1,,0,22,{},{},,
-2239,Single_Glass,Single Glass,5,10000,,100,,0,,0,10477567,2,512,,0,23,{},{},,
-2240,Beard,Beard,5,2,,100,,0,,0,10477567,2,1,,0,24,{},{},,
-2241,Granpa_Beard,Granpa Beard,5,5000,,100,,0,,0,10477567,2,1,,0,25,{},{},,
-2242,Purple_Sunglasses,Purple Glasses,5,24000,,100,,1,,0,10477567,2,512,,0,26,{},{ bonus2 bResEff,Eff_Blind,1000; }
-2243,Geek_Glasses,Geek Glasses,5,20000,,100,,1,,0,10477567,2,512,,0,27,{},{ bonus2 bResEff,Eff_Blind,1500; }
-2244,Big_Ribbon,Big Ribbon,5,15000,,200,,2,,0,2088958,2,256,,0,28,{},{ bonus bMdef,3; },
-2245,Sweet_Gent,Sweet Gent,5,15000,,400,,3,,0,2088958,2,256,,0,29,{},{},,
-2246,Golden_Gear,Golden Gear,5,20,,900,,5,,0,2088958,2,256,,40,30,{},{},,
-2247,Romantic_Gent,Romantic Gent,5,15000,,400,,3,,0,2088958,2,256,,0,31,{},{},,
-2248,Western_Grace,Western Grace,5,15000,,400,,3,,0,2088958,2,256,,0,32,{},{},,
-2249,Coronet,Coronet,5,20,,300,,3,,0,2088958,2,256,,0,33,{},{ bonus bInt,1; },
-2250,Fillet,Cute Ribbon,5,500,,100,,1,,0,2088958,2,256,,0,34,{},{ bonus bMaxSP,20; },,,,
-2251,Holy_Bonnet,Monk Hat,5,30000,,100,,5,,0,33040,2,256,,0,35,{},{ bonus bMdef,3; },,,,
-2252,Wizard_Hat,Wizard Hat,5,20,,300,,4,,0,66052,2,256,,0,36,{},{ bonus bMaxSP,100; },,,,
-2253,Sunflower,Sunflower,5,20,,100,,1,,0,10477567,2,256,,0,37,{},{ bonus2 bSubRace,4,10; },,,
-2254,Angel_Wing,Angel Wing,5,20,,100,,2,,0,2088958,2,256,,0,38,{},{ bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,6,3; }
-2255,Evil_Wing,Evil Wing,5,20,,100,,3,,0,2088958,2,256,,0,39,{},{ bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,8,3; },
-2256,Majestic_Goat,Majestic Goat,5,20,,800,,5,,0,279714,2,256,,0,41,{},{ bonus bStr,1; },,,,
-2257,Snow_Horn,Snow Horn,5,20,,100,,2,,0,10477567,2,256,,0,42,{},{},,,,,
-2258,Spiky_Band,Spiky Band,5,20,,1000,,6,,0,447986,2,256,,50,43,{},{},,,,,
-2259,Mini_Propeller,Mini Propeller,5,20,,100,,1,,0,10477567,2,256,,0,46,{},{},,,,,
-2260,Mini_Glasses,Mini Glasses,5,28000,,100,,1,,0,2088958,2,512,,0,47,{},{},,,,,
-2261,Army_Cap,Army Cap,5,20,,400,,4,,0,414946,2,256,,0,48,{},{},,,,,
-2262,Pierrot_Nose,Pierrot Nose,5,20,,100,,0,,0,10477567,2,1,,0,49,{},{},,,,,
-2263,Zorro_Masque,Zorro Masque,5,20,,100,,0,,0,2088958,2,512,,0,50,{},{},,,,,
-2264,Munak_Hat,Munak Hat,5,20,,300,,5,,0,10477567,2,769,,0,51,{},{ bonus2 bSubRace,1,10; },,,
-2265,Gangster_Mask,Gangster Mask,5,20,,100,,0,,0,10477567,2,1,,0,52,{},{ bonus2 bResEff,Eff_Silence,1500; },,,
-2266,Iron_Cain,Iron Cain,5,20,,300,,1,,0,16514,2,1,,50,53,{},{},,,
-2267,Cigar,Cigar,5,20,,100,,0,,0,2088958,2,1,,0,54,{},{ bonus2 bSubRace,4,3; },
-2268,Pipe,Pipe,5,20,,100,,0,,0,2088958,2,1,,0,55,{},{ bonus2 bSubRace,4,3; },
-2269,Centimental_Flower,Romantic Flower,5,20,,100,,0,,0,2088958,2,1,,0,56,{},{ bonus2 bSubRace,3,3; },
-2270,Centimental_Leaf,Romantic Leaf,5,20,,100,,0,,0,2088958,2,1,,0,57,{},{ bonus2 bSubRace,3,3; },
-2271,Jack_a_Dandy,Jack a Dandy,5,45000,,100,,1,,0,2088958,2,256,,0,58,{},{},,,
-2272,Stop_Post,Stop Post,5,20,,400,,1,,0,10477567,2,256,,0,59,{},{},,,
-2273,Doctor_Cap,Doctor Band,5,20,,100,,1,,0,2088958,2,256,,0,60,{},{ bonus bInt,1; },,
-2274,Ghost_Bandana,Ghost Bandana,5,20,,100,,0,,0,2088958,2,256,,0,61,{},{ bonus bAgi,2; bonus2 bSubEle,8,10; }
-2275,Red_Bandana,Red Bandana,5,20,,100,,2,,0,10477567,2,256,,0,62,{},{},,,
-2276,Eagle_Eyes,Eagle Eyes,5,20,,100,,1,,0,10477567,2,512,,0,63,{},{},,,
-2277,Nurse_Cap,Nurse Cap,5,20,,100,,1,,0,33040,2,256,,0,64,{},{ bonus bInt,1; bonus bLuk,1; },
-2278,Mr_Smile,Mr. Smile,5,60,,100,,1,,0,10477567,2,513,,0,65,{},{},,,
-2279,Bomb_Wick,Bomb Wick,5,20,,100,,1,,0,10477567,2,256,,0,66,{},{},,,
-2280,Sakkat,Sakkat,5,20,,300,,3,,0,10477567,2,256,,0,67,{},{ bonus bAgi,1; },,
-2281,Opera_Masque,Opera Masque,5,8000,,200,,2,,0,2088958,2,513,,0,68,{},{},,,
-2282,Heaven_Ring,Heaven Ring,5,20,,100,,0,,0,10477567,2,256,,0,69,{},{ bonus2 bSubEle,6,10; }
-2283,Ear_Mufs,Ear Mufs,5,20,,200,,3,,0,10477567,2,256,,0,70,{},{ bonus2 bResEff,Eff_Curse,1000; }
-2284,Antler,Antler,5,20,,500,,4,,0,2088958,2,256,,0,71,{},{},,
-2285,Apple_o'_Archer,Apple o' Archer,5,20,,200,,0,,0,2088958,2,256,,30,72,{},{ bonus bDex,3; },
-2286,Elven_Ears,Elven Ears,5,20,,100,,0,,0,2088958,2,512,,70,73,{},{},,
-2287,Pirate_Bandana,Pirate Bandana,5,20,,100,,3,,0,2088958,2,256,,0,74,{},{ bonus bStr,1; },
-2288,Mr_Scream,Mr. Scream,5,20,,100,,1,,0,2088958,2,513,,0,75,{},{},,
-2289,Poo_Poo_Hat,Poo Poo Hat,5,20,,700,,0,,0,10477567,2,256,,0,76,{},{ bonus2 bSubRace,7,10; }
-2290,Funeral_Hat,Funeral Hat,5,3000,,100,,1,,0,10477567,2,256,,0,77,{},{},,
-2291,Masquerade,Masquerade,5,20,,100,,0,,0,2088958,2,512,,0,78,{},{ bonus2 bAddRace,7,3; }
-2292,Welding_Mask,Welding Mask,5,20,,300,,2,,0,263200,2,513,,50,79,{},{ bonus2 bSubEle,3,10; }
-2293,Pretend_Murdered,Pretend Murdered,5,20,,100,,1,,0,10477567,2,256,,0,80,{},{},,
-2294,Stellar,Stellar,5,20,,100,,1,,0,10477567,2,256,,0,81,{},{},,
-2295,Blinker,Blinker,5,1500,,100,,0,,0,2088958,2,512,,0,82,{},{ bonus2 bResEff,Eff_Blind,10000; }
-2296,Binoculars,Binoculars,5,20,,100,,1,,0,1574920,2,512,,50,83,{},{ bonus bDex,1; },
-2297,Goblini_Mask,Goblini Mask,5,20,,100,,1,,0,2088958,2,513,,0,84,{},{},,
-2298,Green_Feeler,Green Feeler,5,20,,100,,2,,0,10477567,2,256,,0,85,{},{}
-2299,Viking_Helm,Viking Helm,5,20,,500,,5,,0,414946,2,256,,0,86,{},{}
-
-// Armor
-//===================================================================
-2301,Cotton_Shirt,Cotton Shirt,5,10,,100,,1,,0,10477567,2,16,,0,0,{},{}
-2302,Cotton_Shirt_,Cotton Shirt,5,10,,100,,1,,1,10477567,2,16,,0,0,{},{}
-2303,Leather_Jacket,Leather Jacket,5,200,,200,,2,,0,10477567,2,16,,0,0,{},{}
-2304,Leather_Jacket_,Leather Jacket,5,200,,200,,2,,1,10477567,2,16,,0,0,{},{}
-2305,Adventure_Suit,Adventurer's Suit,5,1000,,300,,3,,0,10477567,2,16,,0,0,{},{}
-2306,Adventure_Suit_,Adventurer's Suit,5,1000,,300,,3,,1,10477567,2,16,,0,0,{},{}
-2307,Mantle,Mantle,5,10000,,600,,4,,0,2088958,2,16,,0,0,{},{}
-2308,Mantle_,Mantle,5,10000,,600,,4,,1,2088958,2,16,,0,0,{},{}
-2309,Coat,Coat,5,22000,,1200,,5,,0,2088958,2,16,,0,0,{},{}
-2310,Coat_,Coat,5,22000,,1200,,5,,1,2088958,2,16,,0,0,{},{}
-2311,Mink_Coat,Mink Coat,5,50000,,2300,,6,,1,2088958,2,16,,30,0,{},{}
-2312,Padded_Armor,Padded Armor,5,48000,,2800,,7,,0,414946,2,16,,0,0,{},{}
-2313,Padded_Armor_,Padded Armor,5,48000,,2800,,7,,1,414946,2,16,,0,0,{},{}
-2314,Chain_Mail,Chain Mail,5,65000,,3300,,8,,0,414946,2,16,,0,0,{},{},,,,,
-2315,Chain_Mail_,Chain Mail,5,65000,,3300,,8,,1,414946,2,16,,0,0,{},{},,,,,
-2316,Full_Plate,Full Plate,5,80000,,4500,,10,,0,16514,2,16,,40,0,{},{},,,,,
-2317,Full_Plate_,Full Plate,5,80000,,4500,,10,,1,16514,2,16,,40,0,{},{},,,,,
-2318,Clothes_of_the_Lord,Lord's Clothes,5,20,,2500,,8,,1,263200,2,16,,70,0,{},{ bonus bMdef,5; bonus bInt,1; },,,
-2319,Glittering_Clothes,Glittering Jacket,5,20,,2500,,7,,1,10477566,2,16,,60,0,{},{ bonus bMdef,5; bonus2 bAddEffect,Eff_Blind,500; },,,,
-2320,Formal_Suit,Formal Suit,5,20,,300,,5,,1,2088958,2,16,,0,0,{},{},,,,,
-2321,Silk_Robe,Silk Robe,5,8000,,400,,3,,0,378806,2,16,,0,0,{},{ bonus bMdef,10; },,,,
-2322,Silk_Robe_,Silk Robe,5,8000,,400,,3,,1,378806,2,16,,0,0,{},{ bonus bMdef,10; },,,,
-2323,Scapulare,Scapulare,5,6500,,400,,4,,0,33040,2,16,,0,0,{},{},,,,,
-2324,Scapulare_,Scapulare,5,6500,,400,,4,,1,33040,2,16,,0,0,{},{},,,,,
-2325,Saint_Robe,Saint's Robe,5,54000,,600,,6,,0,296240,2,16,,0,0,{},{ bonus bMdef,5; },,,,
-2326,Saint_Robe_,Saint's Robe,5,54000,,600,,6,,1,296240,2,16,,0,0,{},{ bonus bMdef,5; },,,,
-2327,Holy_Robe,Holy Robe,5,20,,1700,,7,,0,33040,2,16,,60,0,{},{ bonus bMdef,5; bonus2 bSubRace,6,15; bonus2 bSubEle,7,10; }
-2328,Wooden_Mail,Wooden Mail,5,5500,,1000,,4,,0,279714,2,16,,0,0,{},{},,,,,
-2329,Wooden_Mail_,Wooden Mail,5,5500,,1000,,4,,1,279714,2,16,,0,0,{},{},,,,,
-2330,Tights,Tights,5,71000,,500,,6,,0,1574920,2,16,,45,0,{},{ bonus bDex,1; },
-2331,Tights_,Tights,5,71000,,500,,6,,1,1574920,2,16,,45,0,{},{ bonus bDex,1; },
-2332,Silver_Robe,Silver Robe,5,7000,,700,,4,,0,66052,2,16,,0,0,{},{},,
-2333,Silver_Robe_,Silver Robe,5,7000,,700,,4,,1,66052,2,16,,0,0,{},{},,
-2334,Mage_Coat,Mage Coat,5,20,,600,,5,,0,66052,2,16,,50,0,{},{ bonus bMdef,5; bonus bInt,1; }
-2335,Thief_Clothes,Thief Clothes,5,74000,,100,,6,,0,135232,2,16,,0,0,{},{ bonus bAgi,1; },
-2336,Thief_Clothes_,Thief Clothes,5,74000,,100,,6,,1,135232,2,16,,0,0,{},{ bonus bAgi,1; },
-2337,Ninja_Suit,Ninja Suit,5,20,,1500,,7,,0,135232,2,16,,50,0,{},{ bonus bAgi,1; bonus bMdef,3; }
-2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,2088958,0,16,,0,0,{},{ bonus bMdef,15; changebase 22; },
-2339,Pantie,Pantie,5,1000,,100,,4,,0,10477567,2,16,,0,0,{},{},,
-2340,Novice_Breastplate,Novice Breastplate,5,89000,,500,,4,,1,8388609,2,16,,10,0,{},{},,
-2341,Legion_Plate_Armor,Legion Plate Armor,5,94000,,5500,,11,,0,16384,2,16,,70,0,{},{},,
-2342,Legion_Plate_Armor_,Legion Plate Armor,5,94000,,5500,,11,,1,16384,2,16,,70,0,{},{},,
-2343,Robe_of_Casting,Casting Robe,5,20,,1100,,5,,0,66048,2,16,,75,0,{},{ bonus bCastrate,-3; },
-2344,Armor_of_Fire,Lucias's Volcano Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,3; },
-2345,Armor_of_Fire_,Lucias's Volcano Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,3; },
-2346,Armor_of_Water,Sapien's Ocean Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,1; },
-2347,Armor_of_Water_,Sapien's Ocean Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,1; },
-2348,Armor_of_Wind,Ebeshi's Typhoon Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,4; },
-2349,Armor_of_Wind_,Ebeshi's Typhoon Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,4; },
-2350,Armor_of_Land,Kreitos's Earth Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,2; },
-2351,Armor_of_Land_,Kreitos's Earth Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,2; },
-2352,Armor_For_Novice,Novice Ninja Suit,5,20,,1,,4,,0,8388609,2,16,,0,0,{},{},,
-
-// Foot gear
-//===================================================================
-2401,Sandals,Sandals,5,400,,200,,1,,0,10477567,2,64,,0,0,{},{}
-2402,Sandals_,Sandals,5,400,,200,,1,,1,10477567,2,64,,0,0,{},{}
-2403,Shoes,Shoes,5,3500,,400,,2,,0,2088958,2,64,,0,0,{},{}
-2404,Shoes_,Shoes,5,3500,,400,,2,,1,2088958,2,64,,0,0,{},{}
-2405,Boots,Boots,5,18000,,600,,4,,0,1989866,2,64,,0,0,{},{}
-2406,Boots_,Boots,5,18000,,600,,4,,1,1989866,2,64,,0,0,{},{}
-2407,Crystal_Pumps,Crystal Pumps,5,20,,100,,0,,0,2088958,0,64,,0,0,{},{ bonus bMdef,10; bonus bLuk,5; }
-2408,Cuffs,Cuffs,5,5000,,3000,,3,,0,10477567,2,64,,0,0,{},{}
-2409,Spiky_Heel,Spiky Heel,5,8500,,600,,2,,0,2088958,2,64,,0,0,{},{ bonus bMdef,5; }
-2410,Sleipnir,Sleipnir,5,20,,3500,,0,,0,10477567,2,64,,95,0,{},{ bonus bMdef,10; bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus bSPrecovRate,15; bonus bSpeedRate,25; }
-2411,Greaves,Greaves,5,48000,,750,,5,,0,16512,2,64,,65,0,{},{},,,,
-2412,Greaves_,Greaves,5,48000,,750,,5,,1,16512,2,64,,65,0,{},{},,,,
-2413,Safety_Shoes,Safety Shoes,5,20,,350,,6,,0,16514,2,64,,30,0,{},{},,,,
-2414,Sandal_For_Novice,Novice Sandals,5,20,,1,,2,,0,8388609,2,64,,0,0,{},{},,,,
-2415,Bunny_Slippers,Bunny Slippers,3,20,,10,,,,,,,,,,,{},{}
-
-// Garments
-//===================================================================
-2501,Hood,Hood,5,1000,,200,,1,,0,10477567,2,4,,0,0,{},{},,,,
-2502,Hood_,Hood,5,1000,,200,,1,,1,10477567,2,4,,0,0,{},{},,,,
-2503,Muffler,Muffler,5,5000,,400,,2,,0,2088958,2,4,,0,0,{},{},,,,
-2504,Muffler_,Muffler,5,5000,,400,,2,,1,2088958,2,4,,0,0,{},{},,,,
-2505,Manteau,Manteau,5,32000,,600,,4,,0,414946,2,4,,0,0,{},{},,,,
-2506,Manteau_,Manteau,5,32000,,600,,4,,1,414946,2,4,,0,0,{},{},,,,
-2507,Cape_Of_Ancient_Lord,Cape of Old Marquess,5,20,,600,,2,,0,2088958,2,4,,40,0,{},{ bonus bAgi,1; },,,
-2508,Ragamuffin_Cape,Ragamuffin Manteau,5,20,,500,,1,,0,2088958,2,4,,0,0,{},{ bonus bMdef,10; bonus bUnbreakable,100; },,,
-2509,Manteau_of_Survival,Manteau of Life,5,20,,550,,0,,0,66052,2,4,,75,0,{},{ bonus bVit,10; },,,
-2510,Hood_For_Novice,Novice Hood,5,20,,1,,2,,0,8388609,2,4,,0,0,{},{},,
-
-// Accessories
-//===================================================================
-2601,Ring,Ring,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bStr,2; },
-2602,Earring,Earring,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bInt,2; },
-2603,Necklace,Necklace,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bVit,2; },
-2604,Glove,Glove,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bDex,2; },
-2605,Brooch,Brooch,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bAgi,2; },
-2607,Clip,Clip,5,30000,,100,,0,,1,10477567,2,136,,0,0,{},{ bonus bMaxSP,10; },
-2608,Rosary,Rosary,5,15000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bMdef,5; bonus bLuk,2; }
-2609,Skull_Ring,Skull Ring,5,10000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
-2610,Gold_Ring,Gold Ring,5,30000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
-2611,Silver_Ring,Silver Ring,5,20000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
-2612,Flower_Ring,Flower Ring,5,1500,,100,,0,,0,10477567,2,136,,0,0,{},{},,
-2613,Diamond_Ring,Diamond Ring,5,45000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
-2614,Eye_of_Dullahan,Eye of Dullahan,5,90000,,100,,0,,0,2088958,2,136,,50,0,{},{},,
-2615,Safety_Ring,Safety Ring,5,75000,,100,,3,,0,2088958,2,136,,40,0,{},{ bonus bMdef,3; },,,,
-2616,Critical_Ring,Critical Ring,5,75000,,100,,0,,0,2088958,2,136,,40,0,{},{ bonus bCritical,5; },,,,
-2617,Celebrant's_Mitten,Celebrant's Mitten,5,20,,100,,1,,0,2088958,2,136,,35,0,{},{ bonus bInt,1; },,,,
-2618,Matyr's_Leash,Matyr's Leash,5,20,,100,,1,,0,2088958,2,136,,35,0,{},{ bonus bAgi,1; },,,,
-2619,Thimble_Of_Archer,Bow Thimble,5,30000,,100,,0,,0,1574920,2,136,,65,0,{},{},,,,,
-2620,Ring_Of_Rogue,Rogue's Treasure,5,30000,,100,,0,,0,135232,2,136,,70,0,{},{},,,,,
-2621,Ring_,Ancient Ring,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bStr,1; },,,,
-2622,Earring_,Ancient Earring,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bInt,1; },,,,
-2623,Necklace_,Ancient Necklace,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bVit,1; },,,,
-2624,Glove_,Ancient Glove,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bDex,1; },,,,
-2625,Brooch_,Ancient Brooch,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bAgi,1; },,,,
-2626,Rosary_,Ancient Rosary,5,15000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bMdef,3; bonus bLuk,1; },,,
-2627,Belt,Ancient Belt,5,20000,0,1200,,0,,1,10477567,2,136,,25,0,{},{},,,,,
-2628,Novice_Armlet,Novice Armlet,5,400,0,200,,0,,1,8388609,2,136,,0,0,{},{ bonus bStr,1; bonus bInt,1; bonus bLuk,1; },,
-2629,Megingjard,Megingjard,5,20,0,8000,,2,,0,10477567,2,136,,90,0,{},{ bonus bStr,40; bonus bMdef,7; },,,
-2630,Brisingamen,Brisingamen,5,20,0,1500,,1,,0,10477567,2,136,,95,0,{},{ bonus bStr,3; bonus bAgi,3; bonus bVit,3; bonus bInt,3; bonus bMdef,5; }
-2631,Celebration_Ring,Celebration Ring,5,20,0,10,,0,,0,10477567,2,136,,0,0,{},{ bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2; }
-// Xmas / Wedding Items
-2634,Wedding_Ring_M,Wedding Ring,4,,,0,,0,,0,10477567,1,136,,0,,{},{ skill 334,1; skill 336,1; }
-2635,Wedding_Ring_F,Wedding Ring,4,,,0,,0,,0,10477567,0,136,,0,,{},{ skill 335,1; skill 336,1; }
-2636,Gold_Christmas_Ring,Gold Xmas Ring,5,,,0,,0,,0,10477567,2,136,,0,,{},{}
-2637,Silver_Christmas_Ring,Silver Xmas Ring,5,,,0,,0,,0,10477567,2,136,,0,,{},{}
-
-2638,Exorcize_Sachet,Exorcize Sachet,5,20,,100,,0,,,10477567,3,136,,0,,{},{ bonus bStr,1; bonus bLuk,1; },,,
-2639,Purification_Sachet,Purification Sachet,5,20,,100,,0,,,10477567,3,136,,0,,{},{ bonus bAgi,1; bonus bInt,1; },,,
-2640,Kafra_Ring,Kafra Ring,3,20,,10,,,,,,,,,,,{},{}
-
-// Cards
-//===================================================================
-4001,Poring_Card,Poring Card,6,20,,10,,,,,,,16,,,,{},{ bonus bLuk,2; bonus bFlee2,1; }
-4002,Fabre_Card,Fabre Card,6,20,,10,,,,,,,2,,,,{},{ bonus bVit,1; bonus bMaxHP,100; }
-4003,Pupa_Card,Pupa Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHP,700; }
-4004,Drops_Card,Drops Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,1; bonus bHit,3; }
-4005,Poring__Card,Poring Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,7,20; }
-4006,Lunatic_Card,Lunatic Card,6,20,,10,,,,,,,2,,,,{},{ bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1; }
-4007,Pecopeco_Egg_Card,Pecopeco Egg Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,0,20; }
-4008,Picky_Card,Picky Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,1; bonus bBaseAtk,10; }
-4009,Chonchon_Card,Chonchon Card,6,20,,10,,,,,,,64,,,,{},{ bonus bAgi,1; bonus bFlee,2; }
-4010,Wilow_Card,Wilow Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMaxSP,80; }
-4011,Picky__Card,Picky Card,6,20,,10,,,,,,,16,,,,{},{ bonus bVit,1; bonus bMaxHP,100; }
-4012,Thief_Bug_Egg_Card,Thief Bug Egg Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHP,400; }
-4013,Andre_Egg_Card,Andre Egg Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHPrate,5; }
-4014,Roda_Frog_Card,Roda Frog Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHP,400; bonus bMaxSP,50; }
-4015,Condor_Card,Condor Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,10; }
-4016,Thief_Bug_Card,Thief Bug Card,6,20,,10,,,,,,,16,,,,{},{ bonus bAgi,1; }
-4017,Savage_Babe_Card,Savage Babe Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Stan,500; }
-4018,Andre_Larva_Card,Andre Larva Card,6,20,,10,,,,,,,2,,,,{},{ bonus bInt,1; bonus bMaxSP,10; }
-4019,Hornet_Card,Hornet Card,6,20,,10,,,,,,,2,,,,{},{ bonus bStr,1; bonus bBaseAtk,3; }
-4020,Farmiliar_Card,Farmiliar Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5; }
-4021,Rocker_Card,Rocker Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDex,1; }
-4022,Spore_Card,Spore Card,6,20,,10,,,,,,,136,,,,{},{ bonus bVit,2; }
-4023,Desert_Wolf_Babe_Card,Desert Wolf Babe Card,6,20,,10,,,,,,,16,,,,{},{ bonus bInt,1; }
-4024,Plankton_Card,Plankton Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5; }
-4025,Skeleton_Card,Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stan,200; }
-4026,Thief_bug_Female_Card,Thief bug Female Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAgi,1; bonus bFlee,1; }
-4027,Kukre_Card,Kukre Card,6,20,,10,,,,,,,136,,,,{},{ bonus bAgi,2; }
-4028,Tarou_Card,Tarou Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,2; }
-4029,Wolf_Card,Wolf Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,15; bonus bCritical,1; }
-4030,Mandragora_Card,Mandragora Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,4,20; }
-4031,Pecopeco_Card,Pecopeco Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHPrate,10; }
-4032,Ambernite_Card,Ambernite Card,6,20,,10,,,,,,,32,,,,{},{ bonus bDef,2; }
-4033,Poporing_Card,Poporing Card,6,20,,10,,,,,,,136,,,,{},{ skill 53,1; }
-4034,Worm_Tail_Card,Worm Tail Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,2; }
-4035,Hydra_Card,Hydra Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,7,20; }
-4036,Muka_Card,Muka Card,6,20,,10,,,,,,,136,,,,{},{ bonus bHPrecovRate,10; }
-4037,Snake_Card,Snake Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5; }
-4038,Zombie_Card,Zombie Card,6,20,,10,,,,,,,64,,,,{},{ bonus bHPrecovRate,20; }
-4039,Stainer_Card,Stainer Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Silence,2000; bonus bDef,1; }
-4040,Creamy_Card,Creamy Card,6,20,,10,,,,,,,136,,,,{},{ skill 26,1; }
-4041,Coco_Card,Coco Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1; }
-4042,Steel_Chonchon_Card,Steel Chonchon Card,6,20,,10,,,,,,,16,,,,{},{ bonus2 bSubEle,4,10; bonus bDef,2; }
-4043,Andre_Card,Andre Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,20; }
-4044,Smokie_Card,Smokie Card,6,20,,10,,,,,,,136,,,,{},{ skill 51,1; }
-4045,horn_Card,horn Card,6,20,,10,,,,,,,32,,,,{},{ bonus bLongAtkDef,35; }
-4046,Martin_Card,Martin Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Blind,2000; bonus bDef,1; }
-4047,Ghostring_Card,Ghostring Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,8; bonus bHPrecovRate,-25; }
-4048,Poison_Spore_Card,Poison Spore Card,6,20,,10,,,,,,,136,,,,{},{ skill 52,3; }
-4049,Vadon_Card,Vadon Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,3,20; }
-4050,Thief_bug_Male_Card,Thief bug Male Card,6,20,,10,,,,,,,64,,,,{},{ bonus bAgi,2; }
-4051,Yoyo_Card,Yoyo Card,6,20,,10,,,,,,,136,,,,{},{ bonus bFlee2,5; bonus bAgi,1; }
-4052,Elder_Wilow_Card,Elder Wilow Card,6,20,,10,,,,,,,769,,,,{},{ bonus bInt,2; }
-4053,Vitata_Card,Vitata Card,6,20,,10,,,,,,,136,,,,{},{ skill 28,1; bonus bUseSPrate,25; }
-4054,Angeling_Card,Angeling Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,6; }
-4055,Marina_Card,Marina Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5; }
-4056,Dustiness_Card,Dustiness Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,4,30; bonus bFlee,5; }
-4057,Metaller_Card,Metaller Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5; }
-4058,Thara_Frog_Card,Thara Frog Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,7,30; }
-4059,Soldier_Andre_Card,Soldier Andre Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,3,30; }
-4060,Goblin_Card,Goblin Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,2,20; }
-4061,Cornutus_Card,Cornutus Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDef,1; }
-4062,Anacondaq_Card,Anacondaq Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,5,20; }
-4063,Caramel_Card,Caramel Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,4,20; }
-4064,Zerom_Card,Zerom Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,3; }
-4065,Kaho_Card,Kaho Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,2,20; }
-4066,Orc_Warrior_Card,Orc Warrior Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,2,30; }
-4067,Megalodon_Card,Megalodon Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1; }
-4068,Scorpion_Card,Scorpion Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,3,20; }
-4069,Drainliar_Card,Drainliar Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,1,20; }
-4070,Eggyra_Card,Eggyra Card,6,20,,10,,,,,,,64,,,,{},{ bonus bSPrecovRate,15; }
-4071,Orc_Zombie_Card,Orc Zombie Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,9,30; bonus bFlee,5; }
-4072,Golem_Card,Golem Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,5; }
-4073,Pirate_Skel_Card,Pirate Skel Card,6,20,,10,,,,,,,136,,,,{},{ skill 37,5; }
-4074,BigFoot_Card,BigFoot Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,4,30; }
-4075,Argos_Card,Argos Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Stone,2000; bonus bDef,1; }
-4076,Magnolia_Card,Magnolia Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5; }
-4077,Phen_Card,Phen Card,6,20,,10,,,,,,,136,,,,{},{ bonus bNoCastCancel,0; bonus bCastrate,25; }
-4078,Savage_Card,Savage Card,6,20,,10,,,,,,,16,,,,{},{ bonus bVit,3; }
-4079,Mantis_Card,Mantis Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,3; }
-4080,Flora_Card,Flora Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,5,20; }
-4081,Hode_Card,Hode Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,2,30; bonus bFlee,5; }
-4082,Desert_Wolf_Card,Desert Wolf Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,0,15; bonus bBaseAtk,5; }
-4083,Rafflesia_Card,Rafflesia Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,5,30; }
-4084,Marine_Sphere_Card,Marine Sphere Card,6,20,,10,,,,,,,136,,,,{},{ skill 7,3; }
-4085,Orc_Skeleton_Card,Orc Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,6,20; }
-4086,Soldier_Skeleton_Card,Soldier Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus bCritical,9; }
-4087,Giearth_Card,Giearth Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,2,15; }
-4088,Frilldora_Card,Frilldora Card,6,20,,10,,,,,,,4,,,,{},{ skill 135,1; }
-4089,Sword_Fish_Card,Sword Fish Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,1; bonus bDef,1; }
-4090,Munak_Card,Munak Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,2,5; bonus bDef,1; }
-4091,Kobold_Card,Kobold Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,1; bonus bCritical,4; }
-4092,Skel_Worker_Card,Skel Worker Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,1,15; bonus bBaseAtk,5; }
-4093,Obeaune_Card,Obeaune Card,6,20,,10,,,,,,,136,,,,{},{ skill 35,1; }
-4094,Archer_Skeleton_Card,Archer Skeleton Card,6,20,,10,,,,,,,2,,,,{},{}
-4095,Marse_Card,Marse Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,1,30; }
-4096,Zenorc_Card,Zenorc Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10; }
-4097,Matyr_Card,Matyr Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxHPrate,10; bonus bAgi,1; }
-4098,Dokebi_Card,Dokebi Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,4; bonus bDef,1; }
-4099,Pasana_Card,Pasana Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,3; bonus bDef,1; }
-4100,Sohee_Card,Sohee Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxSPrate,15; bonus bSPrecovRate,3; }
-4101,Sand_Man_Card,Sand Man Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,2; bonus bDef,1; }
-4102,Whisper_Card,Whisper Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,20; bonus2 bSubEle,8,-50; }
-4103,Horong_Card,Horong Card,6,20,,10,,,,,,,136,,,,{},{ skill 10,1; }
-4104,Requiem_Card,Requiem Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Confusion,500; }
-4105,Marc_Card,Marc Card,6,20,,10,,,,,,,16,,,,{},{ bonus2 bSubEle,1,5; bonus2 bResEff,Eff_Freeze,10000; }
-4106,Mummy_Card,Mummy Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,20; }
-4107,Verit_Card,Verit Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxHPrate,8; bonus bMaxSPrate,8; }
-4108,Myst_Card,Myst Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,5,30; bonus bFlee,5; }
-4109,Jakk_Card,Jakk Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,3,30; bonus bFlee,5; }
-4110,Ghoul_Card,Ghoul Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Poison,2000; bonus bDef,1; }
-4111,Strouf_Card,Strouf Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,6,20; }
-4112,Marduk_Card,Marduk Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Silence,10000; }
-4113,Marionette_Card,Marionette Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,8,30; bonus bFlee,5; }
-4114,Argiope_Card,Argiope Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,5; bonus bDef,1; }
-4115,Hunter_Fly_Card,Hunter Fly Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bHpDrainRate,3,15; }
-4116,Isis_Card,Isis Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,7,30; bonus bFlee,5; }
-4117,Side_Winder_Card,Side Winder Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDoubleRate,5; }
-4118,Petit_Card,Petit Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,9,20; }
-4119,Bathory_Card,Bathory Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,7; }
-4120,Petit__Card,Petit Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,9,30; }
-4121,Phreeoni_Card,Phreeoni Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,100; }
-4122,Deviruchi_Card,Deviruchi Card,6,20,,10,,,,,,,769,,,,{},{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; }
-4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,64,,,,{},{ bonus bInfiniteEndure,0; bonus bMaxHPrate,-25; }
-4124,Medusa_Card,Medusa Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,6,15; bonus2 bResEff,Eff_Stone,10000; }
-4125,Deviace_Card,Deviace Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,7,7; bonus2 bAddRace,2,7; bonus2 bAddRace,3,7; bonus2 bAddRace,4,7; }
-4126,Minorous_Card,Minorous Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,2,15; bonus bBaseAtk,5; }
-4127,Nightmare_Card,Nightmare Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1; }
-4128,Golden_Bug_Card,Golden Bug Card,6,20,,10,,,,,,,32,,,,{},{ bonus bNoMagicDamage,0; bonus bUseSPrate,100; }
-4129,Baphomet__Card,Baphomet Card,6,20,,10,,,,,,,4,,,,{},{ bonus bHit,-10; bonus bSplashRange,1; }
-4130,Scorpion_King_Card,Scorpion King Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,9,20; }
-4131,Moonlight_Flower_Card,Moonlight Flower Card,6,20,,10,,,,,,,64,,,,{},{ bonus bSpeedRate,25; }
-4132,Mistress_Card,Mistress Card,6,20,,10,,,,,,,769,,,,{},{ bonus bNoGemStone,0; bonus bUseSPrate,25; }
-4133,Daydric_Card,Daydric Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,0,20; }
-4134,Dracula_Card,Dracula Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bSpDrainRate,10,5; }
-4135,Orc_Lord_Card,Orc Lord Card,6,20,,10,,,,,,,16,,,,{},{ bonus bShortWeaponDamageReturn,30; }
-4136,Khalitzburg_Card,Khalitzburg Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,6,30; }
-4137,Drake_Card,Drake Card,6,20,,10,,,,,,,2,,,,{},{ bonus bNoSizeFix,0; }
-4138,Anubis_Card,Anubis Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,8,30; }
-4139,Joker_Card,Joker Card,6,20,,10,,,,,,,136,,,,{},{ skill 50,1; }
-4140,Knight_Of_Abyss_Card,Knight Of Abyss Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,10,25; }
-4141,Evil_Druid_Card,Evil Druid Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,9; bonus bInt,1; bonus bDef,1; }
-4142,Doppelganger_Card,Doppelganger Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAspdRate,15; }
-4143,Orc_Hero_Card,Orc Hero Card,6,20,,10,,,,,,,769,,,,{},{ bonus bVit,3; bonus2 bResEff,Eff_Stan,10000; }
-4144,Osiris_Card,Osiris Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRestartFullRecover,0; }
-4145,Berzebub_Card,Berzebub Card,6,20,,10,,,,,,,136,,,,{},{ bonus bCastrate,-30; bonus bMaxSPrate,-15; bonus bMaxHPrate,-5; }
-4146,Maya_Card,Maya Card,6,20,,10,,,,,,,32,,,,{},{}
-4147,Baphomet_Card,Baphomet Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,-10; bonus bSplashRange,1; }
-4148,Pharaoh_Card,Pharaoh Card,6,20,,10,,,,,,,769,,,,{},{ bonus bUseSPrate,-30; }
-4149,Bon_Gun_Card,Bon Gun Card,6,20,,10,,,,,,,32,,,,{},{ bonus bInt,2; }
-4150,Orc_Archer_Card,Orc Archer Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRange,1; }
-4151,Mimic_Card,Mimic Card,6,20,,10,,,,,,,769,,,,{},{ bonus bAgi,1; bonus bDex,2; bonus bLuk,3; }
-4152,Wraith_Card,Wraith Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMatk,8; }
-4153,Alarm_Card,Alarm Card,6,20,,10,,,,,,,136,,,,{},{ bonus bCastrate,-10; }
-4154,Arclouse_Card,Arclouse Card,6,20,,10,,,,,,,64,,,,{},{ bonus bStr,2; }
-4155,Rideword_Card,Rideword Card,6,20,,10,,,,,,,32,,,,{},{ bonus bDex,4; }
-4156,Skeleton_Prisoner_Card,Skel Prisoner Card,6,20,,10,,,,,,,136,,,,{},{ skill 45,3; }
-4157,Zombie_Prisoner_Card,Zombie Prisoner Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHPrate,10; }
-4158,Dark_Priest_Card,Dark Priest Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
-4159,Punk_Card,Punk Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
-4160,Zherlthsh_Card,Zherlthsh Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
-4161,Mysteltainn_Card,Mysteltainn Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtk,30; bonus bMaxHPrate,-22; bonus bCastrate,-10; }
-4162,Tirfing_Card,Tirfing Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAgi,3; bonus bFlee,10; }
-4163,Executioner_Card,Executioner Card,6,20,,10,,,,,,,2,,,,{},{bonus bAtk,3; }
-4164,Anolian_Card,Anolian Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,2; }
-4165,Sting_Card,Sting Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,4; }
-4166,Wander_Man_Card,Wander Man Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,30; bonus bCritical,6; }
-4167,Cramp_Card,Cramp Card,6,20,,10,,,,,,,4,,,,{},{ bonus bAgi,3; }
-4168,Filamentous_Card,Filamentous Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Stone,100; bonus2 bResEff,Eff_Freeze,100; bonus2 bResEff,Eff_Stan,100; bonus2 bResEff,Eff_Sleep,100; bonus2 bResEff,Eff_Poison,100; bonus2 bResEff,Eff_Curse,100; bonus2 bResEff,Eff_Silence,100; bonus2 bResEff,Eff_Confusion,100; bonus2 bResEff,Eff_Blind,100; }
-4169,Brilight_Card,Brilight Card,6,20,,10,,,,,,,32,,,,{},{ bonus bAgi,2; bonus bLuk,3; }
-4170,Iron_Fist_Card,Iron Fist Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMaxHP,500; }
-4171,High_Orc_Card,High Orc Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,2; }
-4172,Choco_Card,Choco Card,6,20,,10,,,,,,,2,,,,{},{ bonus bStr,500; bonus bAgi,500; bonus bVit,500; bonus bInt,500; bonus bDex,500; bonus bLuk,500; bonus bAtk,50000; bonus bDef,50000; }
-4173,Stem_Worm_Card,Stem Worm Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,2; }
-4174,Penonema_Card,Penomena Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHPrate, 15; }
-4175,Marin_Card,Marin Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,1,20; }
-4176,Sasquatch_Card,Sasquatch Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bAddSize,1,50; bonus bAtk,-10; bonus bMaxHP,750; }
-4177,Antonio_Card,Antonio Card,6,20,,10,,,,,,,136,,,,{},{ skill 50,5; skill 210,5; }
-4178,Cruiser_Card,Cruiser Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,3; }
-4179,Mystcase_Card,Mystcase Card,6,20,,10,,,,,,,64,,,,{},{ bonus bCastrate,-50; bonus bAtk,+50; }
-4180,Chepet_Card,Chepet Card,6,20,,10,,,,,,,4,,,,{},{ bonus bLuk,5; }
-4181,Knight_of_Windstorm_Card,Knight Of Windstorm Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,35; }
-4182,Garm_Card,Garm Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bAddSize,2,50; bonus bAtk,-10; skill 87,3;}
-4183,Gargoyle_Card,Gargoyle Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRange,5; }
-4184,Raggler_Card,Raggler Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Sleep,50; }
-4185,Neraid_Card,Neraid Card,6,20,,10,,,,,,,4,,,,{},{ bonus bAgi,2; }
-4186,Pest_Card,Pest Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,0,20; }
-4187,Injustice_Card,Injustice Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,9,20; }
-4188,Goblin_Archer_Card,Goblin Archer Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,2,20; bonus bHit,15; }
-4189,Gryphon_Card,Gryphon Card,6,20,,10,,,,,,,2,,,,{},{ bonus bMaxHPrate,10; }
-4190,Dark_Frame_Card,Dark Frame Card,6,20,,10,,,,,,,769,,,,{},{ skill 32,2; bonus bMdef,15; }
-4191,Wind_Ghost_Card,Wind Ghost Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,4; }
-4192,Merman_Card,Merman Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,1; }
-4193,Cookie_Card,Cookie Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,7; }
-4194,Aster_Card,Aster Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,3,20; bonus bMaxSP,80; }
-4195,Carat_Card,Carat Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,6,20; }
-4196,Bloody_Knight_Card,Bloody Knight Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Blind,25; bonus bAtk,45; bonus bMaxHPrate,-3; }
-4197,Clock_Card,Clock Card,6,20,,10,,,,,,,4,,,,{},{ bonus bLuk,10; }
-4198,Clock_Tower_Manager_Card,C Tower Manager Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Curse,50; }
-4199,Alligator_Card,Alligator Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,50; }
-4200,Dark_Lord_Card,Dark Lord Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,9; }
-4201,Orc_Lady_Card,Orc Lady Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,4,20; }
-4202,Megalith_Card,Megalith Card,6,20,,10,,,,,,,4,,,,{},{ skill 9,1; }
-4203,Alice_Card,Alice Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,6; }
-4204,Raydric_Archer_Card,Raydric Archer Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,3; bonus bHit,35; }
-4205,Greatest_General_Card,Greatest General Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,5,20; }
-4206,Stalatic_Golem_Card,Stalactic Golem Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHP,150; }
-4207,Tri_Joint_Card,Tri Joint Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,7,20; bonus bAtk,25; }
-4208,Steamrider_Goblin_Card,Steam Goblin Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,8,20; }
-4209,Sage_Worm_Card,Sage Worm Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,8; }
-4210,Kobold_Archer_Card,Kobold archer Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,25; bonus bAtk,25; }
-4211,Chimera_Card,Chimera Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Stan,25; bonus bAtk,35; }
-
-// Extra Headgears
-//===================================================================
-5001,Headset,Headset,5,20,,200,,3,,0,2088958,2,256,,0,87,{},{ bonus2 bResEff,Eff_Curse,1000; },
-5002,Jewel_Crown,Jewel Crown,5,20,,600,,4,,0,414946,2,256,,60,88,{},{ bonus bMdef,3; bonus bInt,2; bonus bLuk,1; }
-5003,Joker_Jester,Joker Jester,5,20,,100,,1,,0,2088958,2,256,,0,89,{},{ bonus bMdef,5; bonus bLuk,2; },
-5004,Oxygen_Mask,Oxygen Mask,5,20,,200,,0,,0,2088958,2,1,,0,90,{},{ bonus2 bResEff,Eff_Poison,2000; },,,,
-5005,Gas_Mask,Gas Mask,5,20,,100,,1,,0,2088958,2,513,,0,91,{},{ bonus2 bResEff,Eff_Poison,3000; },,,,
-5006,Machoman_Glasses,Machoman's Glasses,5,36000,,100,,1,,0,2088958,2,512,,0,92,{},{},,,,,,
-5007,Grand_Circlet,Grand Circlet,5,20,,200,,3,,0,2088958,2,256,,55,93,{},{ bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1; },,
-5008,Puppy_Love,Puppy Love,5,20,,100,,1,,0,2088958,2,256,,0,94,{},{},,,,,,
-5009,Safety_Helmet,Safety Helmet,5,20,,500,,3,,0,2088958,2,256,,0,95,{},{ bonus bMdef,3; bonus bUnbreakable,100; },,,,,
-5010,Indian_Hair_Piece,Indian Fillet,5,20,,100,,3,,0,10477567,2,256,,0,96,{},{},,,,,,
-5011,Aerial,Aerial,5,20,,100,,3,,0,10477567,2,256,,0,97,{},{},,,,,,
-5012,Ph.D_Hat,Ph.D Hat,5,20,,200,,3,,0,2088958,2,256,,0,98,{},{ bonus bMdef,3; },,,,,
-5013,Horn_Of_Lord_Kaho,Lord Kaho's Horn,5,20,,100,,5,,0,10477567,2,256,,0,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,20,,300,,2,,0,16514,2,512,,65,100,{},{},,,,,,
-5015,Egg_Shell,Egg Shell,5,20,,200,,3,,0,10477567,2,256,,0,101,{},{},,,,,,
-5016,Boy's_Cap,Boy's Cap,5,20,,100,,2,,0,2088958,2,256,,0,102,{},{},,,,,,
-5017,Bone_Helm,Bone Helm,5,20,,800,,7,,0,279714,2,256,,70,103,{},{ bonus2 bSubEle,7,-15; },,,,
-5018,Feather_Bonnet,Feather Bonnet,5,20,,300,,4,,0,1574920,2,256,,0,104,{},{ bonus bAgi,1; },,,,,
-5019,Corsair,Corsair,5,20,,500,,5,,0,2088958,2,256,,0,105,{},{ bonus bVit,1; },,,,,
-5020,Kafra_Band,Kafra's Band,5,20,,500,,3,,0,10477567,2,256,,0,106,{},{ bonus bMdef,3; },,
-5021,Bankruptcy_of_Heart,Money Loser's Grief,5,20,,1200,,4,,0,263200,2,256,,38,107,{},{ bonus bInt,1; bonus bDex,1; },
-5022,Solar_God_Helm,Solar God Helm,5,20,,2400,,4,,0,2088832,2,768,,0,138,{},{ bonus bStr,3; bonus bInt,2; },
-5023,Parcel_Hat,Parcel Hat,5,20,,1000,,0,,0,263200,2,256,,0,108,{},{},,,
-5024,Cake_Hat,Cake Hat,5,20,,1500,,1,,0,10477567,2,256,,0,109,{},{},,,
-5025,Angel_Helm,Angel Helm,5,20,,1600,,5,,0,2088832,2,256,,74,110,{},{ bonus bAgi,1; bonus bLuk,1; bonus bMdef,3; }
-5026,Chef_Hat,Chef's Hat,5,20,,300,,1,,0,2088958,2,256,,50,111,{},{ bonus bDex,1; },,
-5027,Mage_Hat,Mage Hat,5,20,,300,,1,,0,66052,2,256,,0,112,{},{ bonus bInt,2; bonus bMaxSP,150; },
-5028,Candle,Candle,5,20,,150,,5,,0,10477567,2,256,,0,113,{},{},,,
-5029,Spore_Hat,Spore Hat,5,20,,900,,3,,0,2088958,2,256,,20,114,{},{},,,
-5030,Panda_Hat,Panda Hat,5,20,,800,,3,,0,2088958,2,256,,40,115,{},{},,,
-5031,Miner's_Helmet,Miner's Helmet,5,20,,1500,,4,,0,447986,2,256,,55,116,{},{ bonus bDex,2; },,
-5032,Sunday_Hat,Sunday Hat,5,20,,800,,1,,0,2088958,2,256,,0,117,{},{},,,
-5033,Smokie_Hat,Smokie Hat,5,20,,900,,3,,0,2088958,2,256,,50,118,{},{},,,
-5034,Lightbulb_Hairband,Lightbulb Hairband,5,20,,500,,0,,0,2088958,2,256,,0,119,{},{},,,
-5035,Poring_Hat,Poring Hat,5,20,,700,,2,,0,2088958,2,256,,38,120,{},{},,,
-5036,Cross_Hairband,Cross Hairband,5,20,,250,,1,,0,2088958,2,256,,10,121,{},{},,,
-5037,Fruit_Shell,Apple Hat,5,20,,150,,4,,0,10477567,2,256,,5,122,{},{},,,
-5038,Deviruchi_Hat,Deviruchi Hat,5,20,,800,,2,,0,2088958,2,256,,64,123,{},{ bonus bStr,1; bonus bInt,1; },
-5039,Rainbow_Eggshell,Rainbow Eggshell,5,20,,400,,4,,0,10477567,2,256,,19,124,{},{},,,
-5040,Blush,Blush,5,20,,100,,0,,0,10477567,2,512,,0,125,{},{},,,
-5041,Heart_Hairpin,Heart Hairpin,5,20,,100,,0,,0,10477567,2,256,,0,126,{},{},,,
-5042,Hair_Protector,Dumpling Decoration,5,20,,150,,0,,0,2088958,2,256,,14,127,{},{},,,
-5043,Opera_Ghost_Mask,Opera Ghost Mask,5,20,,200,,1,,0,2088958,2,512,,20,128,{},{},,,
-5044,Wing_Of_Demon,Wings of Demon,5,20,,350,,2,,0,10477567,2,256,,45,129,{},{},,,
-5045,Magician_Hat,Magic Hat,5,20,,500,,3,,0,554319315732,2,256,,50,130,{},{ bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50; }
-5046,Bongun_Hat,Bongun Hat,5,20,,300,,5,,0,10477567,2,769,,0,139,{},{},,,
-5047,Fashion_Sunglasses,Fashion Sunglasses,5,20,,100,,0,,0,2088958,2,256,,0,131,{},{},,,
-5048,Cresent_Hairpin,Cresent Hairpin,5,20,,100,,0,,0,10477567,2,256,,0,132,{},{},,,
-5049,Striped_Bandana,Striped Bandana,5,20,,150,,1,,0,10477567,2,256,,0,133,{},{},,,
-5050,Mysterious_Fruit_Shell,Mysterious Fruit Shell,5,20,,300,,5,,0,10477567,2,256,,30,134,{},{},,,
-5051,Bell_of_Pussycat,Bell of Pussycat,5,20,,100,,5,,0,10477567,2,1,,0,135,{},{},,,
-5052,Blue_Bandana,Blue Bandana,5,20,,150,,1,,0,10477567,2,256,,0,136,{},{},,,
-5053,Sphinx_Hat,Sphinx Hat,5,20,,3000,,5,,0,16514,2,256,,65,137,{},{ bonus bStr,2; },,
-5054,Assassin_Mask,Assassin Mask,5,20,,100,,0,,0,4096,2,1,,70,180,{},{},,,
-5055,Novice_Eggshell,Novice Eggshell,5,20,,10,,3,,0,8388609,2,256,,0,101,{},{},,,
-5056,Seed_Of_Love,Seed Of Love,5,20,,200,,0,,0,2088958,2,256,,0,140,{},{}
-5057,Black_Cat_Ears,Black Cat Ears,5,20,,200,,2,,0,10477567,2,256,,45,141,{},{}
-5058,Resting_Cat,Resting Cat,5,20,,500,,1,,0,2088958,2,256,,0,142,{},{ bonus2 bResEff,Eff_Curse,3000; bonus bMdef,15; }
-5059,Bear_Hat,Bear Hat,5,20,,800,,3,,0,10477567,2,256,,50,143,{},{}
-5060,Pointy_Cap,Pointy Cap,5,20,,300,,3,,0,10477567,2,256,,0,144,{},{ bonus bLuk,1; }
-5061,Flower_Hairpin,Flower Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,145,{},{}
-5062,Straw_Hat,Straw Hat,5,20,,200,,3,,0,10477567,2,256,,50,146,{},{ bonus bAgi,1; }
-5063,Bandaid,Bandaid,5,20,,100,,1,,0,2088958,2,256,,0,147,{},{}
-5064,Transformation_Leaf,Transformation Leaf,5,20,,100,,1,,0,10477567,2,256,,0,148,{},{}
-5065,Fresh_Blueish_Fish,Fresh Blueish Fish,5,20,,500,,2,,0,10477567,2,256,,50,149,{},{ bonus2 bAddRace,5,10; }
-5066,Horns_Of_Succubus,Horns of Succubus,5,20,,800,,4,,0,2088958,2,256,,70,150,{},{ bonus bInt,1; bonus bMdef,10; }
-5067,Sombrero,Sombrero,5,20,,350,,4,,0,2088958,2,256,,0,151,{},{ bonus bAgi,1; }
-5068,Ears_of_Demon,Ears Of Demon,5,20,,100,,1,,0,10477567,2,512,,70,152,{},{ bonus bStr,1; }
-5069,Fox_Mask,Fox Mask,5,20,,300,,1,,0,2088958,2,256,,0,153,{},{ bonus bAgi,1; bonus bLuk,1; }
-5070,Bandage,Bandage,5,20,,100,,1,,0,2088958,2,256,,0,154,{},{ bonus bStr,2; }
-5071,Indian_Headband,Indian Headband,5,20,,200,,1,,0,2088958,2,256,,0,155,{},{ bonus bDex,1; }
-5072,Horns_Of_Incubus,Horns Of Incubus,5,20,,800,,4,,0,2088958,2,256,,70,156,{},{ bonus bAgi,1; bonus bMdef,10; }
-5073,Campus_Hat,Campus Hat,5,20,,700,,2,,0,2088958,2,256,,0,157,{},{ bonus bDex,2; }
-5074,Ears_of_Angel,Ears of Angel,5,20,,100,,1,,0,10477567,2,512,,70,158,{},{ bonus bStr,1; }
-5075,Cowboy_Hat,Cowboy Hat,5,20,,500,,4,,0,10477567,2,256,,0,159,{},{}
-5076,Furry_Hat,Furry Hat,5,20,,350,,2,,0,10477567,2,256,,0,160,{},{ bonus bLuk,1; }
-5077,Tulip_Hairpin,Tulip Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,161,{},{}
-5078,Sea_Otter_Hat,Sea Otter Hat,5,20,,800,,3,,0,10477567,2,256,,50,162,{},{ bonus bVit,1; }
-5079,X_Hairpin,X Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,163,{},{}
-5080,Crown_of_the_Ancient_Queen,Crown of The Ancient Queen,5,20,,400,,4,,0,10477567,2,256,,45,164,{},{}
-5081,Crown_of_Mistress,Crown of Mistress,5,20,,100,,1,,0,2088958,0,256,,75,165,{},{ bonus bInt,2; bonus bMaxSP,100; }
-5082,Mushroom_Hairband,Mushroom Hairband,5,20,,100,,2,,0,10477567,2,256,,0,166,{},{}
-5083,Back_Ribbon,Back Ribbon,5,20,,200,,1,,0,10477567,0,256,,45,167,{},{ bonus bMdef,10; }
-5084,Lazy_Raccoon_Hat,Lazy Racoon Hat,5,20,,500,,1,,0,2088958,2,256,,0,168,{},{ bonus2 bResEff,Eff_Sleep,2000; }
-5085,Small_Twin_Ribbons,Small Twin Ribbons,5,20,,100,,1,,0,10477567,0,512,,45,169,{},{}
-5086,Sad_Mask,Sad Mask,5,20,,100,,2,,0,10477567,2,513,,0,170,{},{ bonus2 bResEff,Eff_Blind,5000; }
-5087,Expressionless_Mask,Expressionless Mask,5,20,,100,,1,,0,10477567,2,513,,0,171,{},{}
-5088,Surprised_Mask,Surprised Mask,5,20,,100,,1,,0,10477567,2,513,,0,172,{},{}
-5089,Annoyed_Mask,Annoyed Mask,5,20,,100,,1,,0,10477567,2,513,,0,173,{},{}
-5090,Mask_of_the_Goblin_Leader,Mask of The Goblin Leader,5,20,,100,,2,,0,10477567,2,513,,0,174,{},{}
-5091,Big_Golden_Bell,Big Golden Bell,5,20,,200,,2,,0,2088958,2,768,,35,175,{},{}
-5092,Nun_Hat,Nun Hat,5,20,,300,,5,,0,33024,0,768,,65,176,{},{}
-5093,Nun_Hat_,Nun Hat,5,20,,300,,5,,0,33024,0,768,,65,177,{},{ bonus bMaxSP,100; }
-5094,Orc_Hero_Helm,Orc Hero Helm,5,20,,900,,5,,0,2088958,2,768,,55,178,{},{ bonus bStr,2; bonus bVit,1; }
-5096,Assassin_Mask_,Assassin Mask,5,20,,100,,0,,0,4096,2,1,,70,180,{},{},,,
-5097,Annual_Commemoration_Hat,Annual Commemoration Hat,5,,,30,,3,,0,10477567,2,256,,0,166,{},{ bonus bAllStats,3; }
-5098,Tiger_Mask,Tiger Mask,5,20,,400,,2,,,10477567,3,768,,,181,{},{ bonus bStr,3; bonus bMaxHP,100; }
-
-// Misc items
-//===================================================================
-7001,Mold_Powder,Mould Powder,3,680,,10,,,,,,,,,,,{},{}
-7002,Ogre_Tooth,Ogre Tooth,3,658,,10,,,,,,,,,,,{},{}
-7003,Anolian_Skin,Anolian Skin,3,928,,10,,,,,,,,,,,{},{}
-7004,Mud_Lump,Mud Lump,3,876,,10,,,,,,,,,,,{},{}
-7005,Skull,Skull,3,1044,,10,,,,,,,,,,,{},{}
-7006,Wing_of_Red_Bat,Wing of Red Bat,3,168,,10,,,,,,,,,,,{},{}
-7007,Claw_of_Rat,Claw of Rat,3,748,,10,,,,,,,,,,,{},{}
-7008,Stiff_Horn,Stiff Horn,3,636,,10,,,,,,,,,,,{},{}
-7009,Glitter_Shell,Glitter Shell,3,528,,10,,,,,,,,,,,{},{}
-7010,Tail_of_Steel_Scorpion,Tail of Steel Scorpion,3,548,,10,,,,,,,,,,,{},{}
-7011,Claw_of_Monkey,Claw of Monkey,3,466,,10,,,,,,,,,,,{},{}
-7012,Tough_Scalelike_Stem,Tough Scalelike Stem,3,412,,10,,,,,,,,,,,{},{}
-7013,Coral_Reef,Coral Reef,3,772,,10,,,,,,,,,,,{},{}
-7014,Old_Portrait,Old Portrait,3,1500,,100,,,,,,,,,,,{},{}
-7015,Bookclip_in_Memory,Bookclip in Memory,3,3000,,20,,,,,,,,,,,{},{}
-7016,Spoon_Stub,Spoon Stub,3,2500,,20,,,,,,,,,,,{},{}
-7017,Executioner's_Mitten,Executioner's Mitten,3,4500,,30,,,,,,,,,,,{},{}
-7018,Young_Twig,Young Twig,3,50,,10,,,,,,,,,,,{},{}
-7019,Loki's_Whispers,Loki's Whispers,3,20,,10,,,,,,,,,,,{},{}
-7020,Mother's_Nightmare,Mother's Nightmare,3,20,,10,,,,,,,,,,,{},{}
-7021,Foolishness_of_the_Blind,Foolishness of the Blind,3,20,,10,,,,,,,,,,,{},{}
-7022,Old_Hilt,Old Hilt,3,150,,30,,,,,,,,,,,{},{}
-7023,Blade_Lost_in_Darkness,Blade Lost in Darkness,3,12000,,40,,,,,,,,,,,{},{}
-7024,Bloody_Edge,Bloody Edge,3,10000,,40,,,,,,,,,,,{},{}
-7025,Lucifer's_Lament,Lucifer's Lament,3,30000,,50,,,,,,,,,,,{},{}
-7026,Key_of_Clock_Tower,Key of Clock Tower,3,2,,30,,,,,,,,,,,{},{}
-7027,Key_of_Underground,Key of Underground,3,2,,30,,,,,,,,,,,{},{}
-7028,Invite_for_Duel,Invite for Duel,3,0,,10,,,,,,,,,,,{},{}
-7029,Admission_for_Duel,Admission for Duel,3,20,,10,,,,,,,,,,,{},{}
-7030,Claw_of_Desert_Wolf,Claw of Desert Wolf,3,208,,10,,,,,,,,,,,{},{}
-7031,Old_Frying_Pan,Old Frying Pan,3,196,,10,,,,,,,,,,,{},{}
-7032,Piece_of_Egg_Shell,Piece of Egg Shell,3,168,,10,,,,,,,,,,,{},{}
-7033,Poison_Spore,Poison Spore,3,114,,10,,,,,,,,,,,{},{}
-7034,Red_Socks_with_Holes,Red Socks with Holes,3,100,,10,,,,,,,,,,,{},{}
-7035,Matchstick,Matchstick,3,100,,10,,,,,,,,,,,{},{}
-7036,Fang_of_Garm,Fang of Garm,3,100,,10,,,,,,,,,,,{},{}
-7037,Coupon,Coupon,3,2000,,10,,,,,,,,,,,{},{}
-7038,Yarn,Yarn,3,20,,10,,,,,,,,,,,{},{}
-7039,Novice_Nametag,Novice Nametag,3,20,,10,,,,,,,,,,,{},{}
-7040,Megaphone,Megaphone,3,20,,10,,,,,,,,,,,{},{}
-7041,Fine_Grit,Fine Grit,3,20,,10,,,,,,,,,,,{},{}
-7042,Leather_Bag_of_Infinity,Leather Bag of Infinity,3,20,,10,,,,,,,,,,,{},{}
-7043,Fine_Sand,Fine Sand,3,100,,10,,,,,,,,,,,{},{}
-7044,Vigorgra,Vigorgra,3,20,,10,,,,,,,,,,,{},{}
-7045,Magic_Paint,Magic Paint,3,20,,10,,,,,,,,,,,{},{}
-7046,Cart_Parts,Cart Parts,3,20,,10,,,,,,,,,,,{},{}
-7047,Alice's_Apron,Alice's Apron,3,2424,,10,,,,,,,,,,,{},{}
-7048,Talon_of_Griffon,Talon of Griffon,3,100,,10,,,,,,,,,,,{},{}
-7049,Stone,Stone,3,0,,30,,,,,,,,,,,{},{}
-7050,Cotton_Mat,Cotton Mat,3,20,,10,,,,,,,,,,,{},{}
-7051,Silk_Mat,Silk Mat,3,20,,10,,,,,,,,,,,{},{}
-7052,Wasted_Magazine,Wasted Magazine,3,20,,10,,,,,,,,,,,{},{}
-7053,Cyfar,Cyfar,3,772,,10,,,,,,,,,,,{},{}
-7054,Brigan,Brigan,3,746,,10,,,,,,,,,,,{},{}
-7055,Animal_Poop,Animal Poop,3,20,,50,,,,,,,,,,,{},{}
-7056,Payment_Statement_for_Kafra_Employee,Payment Statement for Ka,3,20,,50,,,,,,,,,,,{},{}
-7057,Gjallar,Gjallar,3,20,,500,,,,,,,,,,,{},{}
-7058,Gleipnir,Gleipnir,3,20,,500,,,,,,,,,,,{},{}
-7059,Free_Ticket_for_Kafra_Storage,Free Ticket for Kafra St,3,20,,10,,,,,,,,,,,{},{}
-7060,Free_Ticket_for_Kafra_Transportation,Free Ticket for Kafra Tr,3,20,,10,,,,,,,,,,,{},{}
-7061,Free_Ticket_for_the_Cart_Service,Free Ticket for the Cart,3,20,,10,,,,,,,,,,,{},{}
-7062,Broken_Turtle_Shell,Broken Turtle Shell,3,20,,10,,,,,,,,,,,{},{}
-7063,Soft_Feather,Soft Feather,3,280,,10,,,,,,,,,,,{},{}
-7064,Wing_of_Dragonfly,Wing of Dragonfly,3,520,,10,,,,,,,,,,,{},{}
-7065,Sea-otter_Fur,Sea Otter Fur,3,820,,10,,,,,,,,,,,{},{}
-7066,Ice_Cubic,Ice Cubic,3,660,,10,,,,,,,,,,,{},{}
-7067,Stone_Fragment,Stone Fragment,3,640,,10,,,,,,,,,,,{},{}
-7068,Burnt_Tree,Burnt Tree,3,722,,10,,,,,,,,,,,{},{}
-7069,Destroyed_Armor,Destroyed Armor,3,1042,,10,,,,,,,,,,,{},{}
-7070,Broken_Shell,Broken Shell,3,900,,10,,,,,,,,,,,{},{}
-7071,Tattered_Clothes,Tattered Clothes,3,640,,10,,,,,,,,,,,{},{}
-7072,Old_Shuriken,Old Shuriken,3,1780,,10,,,,,,,,,,,{},{}
-7073,Freya's_Jewel,Freya's Jewel,3,20,,500,,,,,,,,,,,{},{}
-7074,Thor's_Gauntlet,Thor's Gauntlet,3,20,,500,,,,,,,,,,,{},{}
-7075,Iron_Maiden,Iron Maiden,3,20,,500,,,,,,,,,,,{},{}
-7076,Wheel_of_the_Unknown,Wheel of the Unknown,3,20,,500,,,,,,,,,,,{},{}
-7077,Silver_Ornament,Silver Ornament,3,20,,500,,,,,,,,,,,{},{}
-7078,Wrath_of_Valkyrie,Wrath of Valkyrie,3,20,,500,,,,,,,,,,,{},{}
-7079,Feather_of_Angel_Wing,Feather of Angel Wing,3,20,,500,,,,,,,,,,,{},{}
-7080,Cat_Tread,Footprints of Cat,3,20,,500,,,,,,,,,,,{},{}
-7081,Woman's_Moustache,Woman's Moustache,3,20,,500,,,,,,,,,,,{},{}
-7082,Root_of_Stone,Root of Stone,3,20,,500,,,,,,,,,,,{},{}
-7083,Spirit_of_Fish,Spirit of Fish,3,20,,500,,,,,,,,,,,{},{}
-7084,Sputum_of_Bird,Sputum of Bird,3,20,,500,,,,,,,,,,,{},{}
-7085,Sinew_of_Bear,Sinew of Bear,3,20,,500,,,,,,,,,,,{},{}
-7086,Emblem_of_the_Sun_God,Emblem of the Sun God,3,20,,500,,,,,,,,,,,{},{}
-7087,Breath_of_Spirit,Breath of Soul,3,20,,500,,,,,,,,,,,{},{}
-7088,Snow_Crystal,Snow Crystal,3,20,,500,,,,,,,,,,,{},{}
-7089,Omen_of_Tempest,Omen of Tempest,3,20,,500,,,,,,,,,,,{},{}
-7090,Ripple,Ripple,3,20,,500,,,,,,,,,,,{},{}
-7091,Billow,Billow,3,20,,500,,,,,,,,,,,{},{}
-7092,Drifting_Air,Drifting Air,3,20,,500,,,,,,,,,,,{},{}
-7093,Cogwheel,Metal Wheel,3,20,,10,,,,,,,,,,,{},{}
-7094,Fragment,Cabinet Chip,3,20,,10,,,,,,,,,,,{},{}
-7095,Metal_Fragment,Tooth Fragment,3,20,,10,,,,,,,,,,,{},{}
-7096,Lava,Hardened Lava,3,1108,,10,,,,,,,,,,,{},{}
-7097,Burning_Heart,Burning Heart,3,924,,10,,,,,,,,,,,{},{}
-7098,Live_Coal,Fire Seed,3,638,,10,,,,,,,,,,,{},{}
-7099,Worn-out_Magic_Scroll,Old Magical Circle,3,20,,10,,,,,,,,,,,{},{}
-7100,Sharp_Leaf,Sharpened Leaf,3,20,,10,,,,,,,,,,,{},{}
-7101,PecoPeco_Feather,Peco Feather,3,454,,10,,,,,,,,,,,{},{}
-7102,Nightmare,Nightmare,3,20,,10,,,,,,,,,,,{},{}
-7103,Unknown_Liquid_Bottle,Yellow Liquid Bottle,3,20,,10,,,,,,,,,,,{},{}
-7104,Fake_Angel's_Wing,Fake Angel's Wing,3,756,,10,,,,,,,,,,,{},{}
-7105,Fake_Heaven_Ring,Imitation Soul's Band,3,924,,10,,,,,,,,,,,{},{}
-7106,Antelope_Horn,Antelope Horn,3,672,,10,,,,,,,,,,,{},{}
-7107,Antelope_Skin,Antelope Skin,3,756,,10,,,,,,,,,,,{},{}
-7108,Piece_of_Shield,Broken Shield,3,20,,10,,,,,,,,,,,{},{}
-7109,Shining_Spear_Blade,Shiny Spear Tip,3,20,,10,,,,,,,,,,,{},{}
-7110,Broken_Sword,Sharp Sword,3,588,,10,,,,,,,,,,,{},{}
-7111,Slick_Paper,String Paper,3,706,,10,,,,,,,,,,,{},{}
-7112,Sharp_Paper,Transparent Paper,3,906,,10,,,,,,,,,,,{},{}
-7113,Broken_Symbol_of_Pharaoh,Broken Symbol of Pharaoh,3,20,,10,,,,,,,,,,,{},{}
-7114,Masque_of_Tutankhamen,Sphinx Mask,3,20,,10,,,,,,,,,,,{},{}
-7115,Harpy_Feather,Blood Feather,3,1142,,10,,,,,,,,,,,{},{}
-7116,Harpy_Talon,Tooth of Lowblood,3,1210,,10,,,,,,,,,,,{},{}
-7117,Torn_Magic_Book,Torn Spell Book,3,20,,10,,,,,,,,,,,{},{}
-7118,Torn_Scroll,Torn Scroll,3,20,,10,,,,,,,,,,,{},{}
-7119,Bacillus,Hypha Body,3,1024,,10,,,,,,,,,,,{},{}
-7120,Burning_Horseshoe,Burning Horseshoe,3,822,,10,,,,,,,,,,,{},{}
-7121,Honey_Pot,Honey Jar,3,622,,10,,,,,,,,,,,{},{}
-7122,Burning_Hair,Hot Feather,3,974,,10,,,,,,,,,,,{},{}
-7123,Dragon_Skin,Dragon Skin,3,1024,,10,,,,,,,,,,,{},{}
-7124,Sand_Clump,Sand Lump,3,706,,10,,,,,,,,,,,{},{}
-7125,Scorpion_Claw,Crab Shot,3,706,,10,,,,,,,,,,,{},{}
-7126,Large_Jellopy,Large Jellopy,3,840,,10,,,,,,,,,,,{},{}
-7127,Alcohol_Creation_Book,Alcohol Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7128,Bottle_Grenade_Creation_Book,Fire Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7129,Acid_Bottle_Creation_Book,Acid Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7130,Plant_Bottle_Creation_Book,Plant Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7131,Mine_Bottle_Creation_Book,Mine Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7132,Glistening_Coat_Creation_Book,Glistening Coat Creation Book,3,100000,,10,,,,,,,,,,,{},{}
-7133,Condensed_Potion_Creation_Book,Condensed Potion Creation Book,3,240000,,10,,,,,,,,,,,{},{}
-7134,Medicine_Bowl,Medicine Bowl,3,8,,10,,,,,,,,,,,{},{}
-7135,Bottle_Grenade,Fire Bottle,3,20,,10,,,,,,,,,,,{},{}
-7136,Acid_Bottle,Hydrobolic Acid Bottle,3,20,,10,,,,,,,,,,,{},{}
-7137,Plant_Bottle,Water Bottle,3,20,,10,,,,,,,,,,,{},{}
-7138,Marine_Sphere_Bottle,Mine Bottle,3,20,,10,,,,,,,,,,,{},{}
-7139,Glistening_Coat,Coating Wax,3,20,,10,,,,,,,,,,,{},{}
-7140,Seed_of_Life,Seed of Life,3,20,,10,,,,,,,,,,,{},{}
-7141,Morning_Dew_of_Yggdrasil,Water Flow,3,20,,10,,,,,,,,,,,{},{}
-7142,Ancient_Life,Embryo,3,20,,10,,,,,,,,,,,{},{}
-7143,Glass_Tube,Seperation Tubes,3,20,,10,,,,,,,,,,,{},{}
-7144,Potion_Creation_Gude,Potion Making Book,3,100000,,10,,,,,,,,,,,{},{}
-7145,Ragnarok_T-shirt,Ragnarok T-Shirt,3,20,,10,,,,,,,,,,,{},{}
-7146,Vacation_Ticket,Vacation Ticket,3,20,,10,,,,,,,,,,,{},{}
-7147,Jasmine,Jasmine,3,20,,10,,,,,,,,,,,{},{}
-7148,Mother's_Letter,Mother's Letter,3,20,,10,,,,,,,,,,,{},{}
-7149,Yellow_Plate,Yellow Plate,3,220,,10,,,,,,,,,,,{},{}
-7150,A_piece_of_Bamboo,Bamboo Trunk,3,310,,10,,,,,,,,,,,{},{}
-7151,Oil_Paper,Oiled Paper,3,310,,10,,,,,,,,,,,{},{}
-7152,Glossy_Hair,Glossy Hair,3,340,,10,,,,,,,,,,,{},{}
-7153,Worn-out_Kimono,Old Kimono,3,590,,10,,,,,,,,,,,{},{}
-7154,Poisonous_Powder,Poison Powder,3,160,,10,,,,,,,,,,,{},{}
-7155,Skin_of_Poisonous_Toad,Poisonous Toad Skin,3,280,,10,,,,,,,,,,,{},{}
-7156,Broken_Shuriken,Broken Shuriken,3,470,,10,,,,,,,,,,,{},{}
-7157,Black_Mask,Black Mask,3,20,,10,,,,,,,,,,,{},{}
-7158,Broken_Liquor_Bottle,Broken Liquor Bottle,3,160,,10,,,,,,,,,,,{},{}
-7159,Demon's_Nose,Demon's Nose,3,400,,10,,,,,,,,,,,{},{}
-7160,Passport_From_King,Passport From King,3,20,,10,,,,,,,,,,,{},{}
-7161,Skin_of_the_Black_Bear,Skin of the Black Bear,3,384,,10,,,,,,,,,,,{},{}
-7162,Piece_of_Cloud,Piece of Cloud,3,390,,10,,,,,,,,,,,{},{}
-7163,Hard_Antennae,Hard Antennae,3,570,,10,,,,,,,,,,,{},{}
-7164,Very_Hard_Peach,Very Hard Peach,3,400,,10,,,,,,,,,,,{},{}
-7165,Etherial_Winged_Clothing,Etherial Winged Clothing,3,650,,10,,,,,,,,,,,{},{}
-7166,Soft_Silk_Fabric,Soft Silk Fabric,3,1200,,10,,,,,,,,,,,{},{}
-7167,Strange_Piece_of_Iron,Strange Piece of Iron,3,430,,10,,,,,,,,,,,{},{}
-7168,Big_Wing_of_Butterfly,Big Wing of Butterfly,3,614,,10,,,,,,,,,,,{},{}
-7169,Tae_Guk_Tablet,Tae Guk Tablet,3,20,,10,,,,,,,,,,,{},{}
-7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,10477566,1,16,,0,0,{},{ changebase 22; }
-7171,Skin_of_Panther,Skin of Panther,3,282,,10,,,,,,,,,,,{},{}
-7172,Claw_of_Panther,Claw of Panther,3,290,,10,,,,,,,,,,,{},{}
-7173,Bun_Buster_Bag,Bun Buster Bag,3,20,,10,,,,,,,,,,,{},{}
-7174,Wrapping_Thread,Wrapping Thread,3,20,,10,,,,,,,,,,,{},{}
-7175,Wrapper,Wrapper,3,20,,10,,,,,,,,,,,{},{}
-7176,King's_Proof_Document,King's Proof Document,3,20,,10,,,,,,,,,,,{},{}
-7177,Piece_of_Starlight's_Sorrow,Piece of Starlight's Sorrow,3,20,,10,,,,,,,,,,,{},{}
-7178,Starlight's_Sorrow,Starlight's Sorrow,3,20,,10,,,,,,,,,,,{},{}
-7179,Donation_Ticket,Donation Ticket,3,20,,10,,,,,,,,,,,{},{}
-7180,Letter_of_Introduction,Letter of Introduction,3,20,,10,,,,,,,,,,,{},{}
-7181,Commodity_Receipt,Commodity Receipt,3,20,,10,,,,,,,,,,,{},{}
-7182,Cacao,Cacao,3,200,,20,,,,,,,,,,,{},{}
-7183,Letter_of_Younger_Sister,Letter of Younger Sister,3,20,,10,,,,,,,,,,,{},{}
-7184,Piano_Key,Piano Key,3,20,,10,,,,,,,,,,,{},{}
-7185,Quiz_Participation_Ticket,Quiz Participation Ticket,3,20,,10,,,,,,,,,,,{},{}
-7186,Thin_Trunk,Thin Trunk,3,20,,10,,,,,,,,,,,{},{}
-7187,Festival_Mask,Festival Mask,3,20,,10,,,,,,,,,,,{},{}
-7188,Brown_Root,Brown_Root,3,20,,10,,,,,,,,,,,{},{}
-7189,Wooden_Heart,Wooden Heart,3,20,,10,,,,,,,,,,,{},{}
-7190,Hard_Back_Shell,Hard Back Shell,3,20,,10,,,,,,,,,,,{},{}
-7191,Paper_Lantern,Paper Lantern,3,20,,10,,,,,,,,,,,{},{}
-7192,Pin_Wheel,Pin Wheel,3,20,,10,,,,,,,,,,,{},{}
-7193,Sprout,Sprout,3,20,,10,,,,,,,,,,,{},{}
-7194,Soft_Grass_Leaf,Soft Grass Leaf,3,20,,10,,,,,,,,,,,{},{}
-7195,Slingshot,Slingshot,3,20,,10,,,,,,,,,,,{},{}
-7196,Shoulder_Guard,Shoulder Guard,3,20,,10,,,,,,,,,,,{},{}
-7197,Durable_Vine,Durable Vine,3,20,,10,,,,,,,,,,,{},{}
-7198,Huge_Leaf,Huge Leaf,3,20,,10,,,,,,,,,,,{},{}
-7199,Hieroglyphic,Hieroglyphic,3,20,,10,,,,,,,,,,,{},{}
-7200,Elastic_Band,Elastic Band,3,20,,10,,,,,,,,,,,{},{}
-7201,Log,Log,3,20,,10,,,,,,,,,,,{},{}
-7202,Insect_Pinchers,Insect Pinchers,3,20,,10,,,,,,,,,,,{},{}
-7203,Healthy_Branch,Healthy Branch,3,20,,10,,,,,,,,,,,{},{}
-7204,Gun_Powder,Gun Powder,3,20,,10,,,,,,,,,,,{},{}
-7205,Black_Piece_of_Cloth,Black Piece of Cloth,3,20,,10,,,,,,,,,,,{},{}
-7206,Cat_Doll,Black Cat Doll,3,20,,10,,,,,,,,,,,{},{}
-7207,Old_Mantle,Old Mantle,3,20,,10,,,,,,,,,,,{},{}
-7208,Rusted_Knife,Rusted Knife,3,20,,10,,,,,,,,,,,{},{}
-7209,Dullahan's_Helm,Dullahan's Helm,3,20,,10,,,,,,,,,,,{},{}
-7210,Piece_of_Dullahan's_Armor,Dullahan's Armor Piece,3,20,,10,,,,,,,,,,,{},{}
-7211,Rosetta_Stone_Fragment,Rosetta Stone Fragment,3,20,,10,,,,,,,,,,,{},{}
-7212,Hanging_Doll,Hanging Doll,3,20,,10,,,,,,,,,,,{},{}
-7213,Pin_Cusion,Pin Cusion,3,20,,10,,,,,,,,,,,{},{}
-7214,Bat_Cage,Bat Cage,3,20,,10,,,,,,,,,,,{},{}
-7215,Broken_Needle,Broken Needle,3,20,,10,,,,,,,,,,,{},{}
-7216,Red_Scarf,Red Scarf,3,20,,10,,,,,,,,,,,{},{}
-7217,Spool_of_Thread,Spool of Thread,3,20,,10,,,,,,,,,,,{},{}
-7218,Rotted_Rope,Rotted Rope,3,20,,10,,,,,,,,,,,{},{}
-7219,Striped_Socks,Striped Socks,3,20,,10,,,,,,,,,,,{},{}
-7220,Ectoplasm,Ectoplasm,3,20,,10,,,,,,,,,,,{},{}
-7221,Chains,Chains,3,20,,10,,,,,,,,,,,{},{}
-7222,Old_Tree_Branch,Old Tree Branch,3,20,,10,,,,,,,,,,,{},{}
-7223,Ruined_Self_Portrait,Ruined Self Portrait,3,20,,10,,,,,,,,,,,{},{}
-7224,Philosophers_Stone,Philosopher's Stone,3,20,,10,,,,,,,,,,,{},{}
-7225,Silk_Lantern,Silk Lantern,3,20,,10,,,,,,,,,,,{},{}
-7226,Hallucination_Pill,Hallucination Pill,3,20,,10,,,,,,,,,,,{},{}
-7227,TCG_Card,TCG Card,3,20,,10,,,,,,,,,,,{},{}
-7228,Gold_Nugget,Gold Nugget,3,20,,300,,,,,,,,,,,{},{}
-7229,Iron_Nugget,Iron Nugget,3,20,,300,,,,,,,,,,,{},{}
-7230,Silver_Nugget,Silver Nugget,3,20,,30,,,,,,,,,,,{},{}
-7231,Gold_Ore,Gold Ore,3,20,,150,,,,,,,,,,,{},{}
-7232,Silver_Ore,Silver Ore,3,20,,150,,,,,,,,,,,{},{}
-7233,Mysterious_Ore,Mysterious Ore,3,20,,150,,,,,,,,,,,{},{}
-
-// RWC Reward items
-7234,Spirit_of_Guild,Spirit of Guild,3,20,,10,,,,,,,,,,,{},{}
-7235,Spirit_of_Assault,Spirit of Assault,3,20,,10,,,,,,,,,,,{},{}
-7236,Spirit_of_Defense,Spirit of Defense,3,20,,10,,,,,,,,,,,{},{}
-7237,Spirit_of_Cooperation,Spirit of Cooperation,3,20,,10,,,,,,,,,,,{},{}
-7238,Spirit_of_Harmony,Spirit of Harmony,3,20,,10,,,,,,,,,,,{},{}
-7239,Spirit_of_Advancement,Spirit of Advancement,3,20,,10,,,,,,,,,,,{},{}
-7240,Spirit_of_Trust,Spirit of Trust,3,20,,10,,,,,,,,,,,{},{}
-7241,Spirit_of_Concentration,Spirit of Concentration,3,20,,10,,,,,,,,,,,{},{}
-7242,Spirit_of_Unity,Spirit of Unity,3,20,,10,,,,,,,,,,,{},{}
-7243,Spirit_of_Integrity,Spirit of Integrity,3,20,,10,,,,,,,,,,,{},{}
-7244,Spirit_of_Communion,Spirit of Communion,3,20,,10,,,,,,,,,,,{},{}
-7245,Spirit_of_Friendship,Spirit of Friendship,3,20,,10,,,,,,,,,,,{},{}
-7246,Spirit_of_Peace,Spirit of Peace,3,20,,10,,,,,,,,,,,{},{}
-7247,Spirit_of_Nature,Spirit of Nature,3,20,,10,,,,,,,,,,,{},{}
-7248,Spirit_of_Fame,Spirit of Fame,3,20,,10,,,,,,,,,,,{},{}
-7249,Spirit_of_Contribution,Spirit of Contribution,3,20,,10,,,,,,,,,,,{},{}
-7250,Spirit_of_Glory,Spirit of Glory,3,20,,10,,,,,,,,,,,{},{}
-7251,Spirit_of_Victory,Spirit of Victory,3,20,,10,,,,,,,,,,,{},{}
-
-//Gonryun Items
-7252,Chinese_Medicine,Chinese Medicine,3,20,,10,,,,,,,,,,,{},{}
-7253,Golden_Flag,Golden Flag,3,20,,10,,,,,,,,,,,{},{}
-7254,Digitally_Printed_Ticket,Digitally Printed Ticket,3,20,,10,,,,,,,,,,,{},{}
-7262,Paper_Fan,Paper Fan,3,233,,,,,,,,,,,,,{},{}
-7263,Cat's_Eye,Cat's-Eye,3,20,477,10,,,,,,,,,,,{},{}
-7264,Dried_Sand,Dried Sand,3,20,161,10,,,,,,,,,,,{},{}
-7265,Dragon_Horn,Dragon Horn,3,20,,10,,,,,,,,,,,{},{}
-7266,Dragon_Teeth,Dragon Teeth,3,218,,,,,,,,,,,,,{},{}
-7267,Tigerskin_Underwear,Tigerskin Underwear,3,20,107,10,,,,,,,,,,,{},{}
-7268,Ghost_Doll,Ghost Doll,3,20,605,10,,,,,,,,,,,{},{}
-7269,Baby_Bib,Baby Bib,3,20,,10,,,,,,,,,,,{},{}
-7270,Baby_Bottle,Baby Bottle,3,20,,,,,,,,,,,,,{},{}
-7271,Novice_Statue,Novice Statue,3,20,,10,,,,,,,,,,,{},{}
-7272,Dumpling_Doll,Dumpling Doll,3,20,,10,,,,,,,,,,,{},{}
-7273,RWC_Necklace,RWC_Necklace,3,20,,10,,,,,,,,,,,{},{}
-7274,Ancient_Language_Book,Ancient_Language_Book,3,20,,10,,,,,,,,,,,{},{}
-7275,Ancient_Language_Document,Ancient_Language_Document,3,20,,10,,,,,,,,,,,{},{}
-7276,Picture_Letter,Picture Letter,3,20,,10,,,,,,,,,,,{},{}
-7277,Munak_Doll,Munak Doll,3,20,,10,,,,,,,,,,,{},{}
-7278,Welfare_Letter,Welfare Letter,3,20,,10,,,,,,,,,,,{},{}
-7279,Vita_500_Bottlecap,Vita 500 Bottlecap,3,20,,10,,,,,,,,,,,{},{}
-7280,Quiz_Participation_Certificate_1,QP Certificate 1,3,20,,10,,,,,,,,,,,{},{}
-7281,Quiz_Participation_Certificate_2,QP Certificate 2,3,20,,10,,,,,,,,,,,{},{}
-7282,Quiz_Participation_Certificate_3,QP Certificate 3,3,20,,10,,,,,,,,,,,{},{}
-7283,Quiz_Participation_Certificate_4,QP Certificate 4,3,20,,10,,,,,,,,,,,{},{}
-7284,Quiz_Participation_Certificate_5,QP Certificate 5,3,20,,10,,,,,,,,,,,{},{}
-
-// 11/09(Ayothana) Items
-7285,Sacred_Wool_Charm,Sacred_Wool_Charm,3,,10,0,,,,,,,,,,,{},{},,
-7286,Red_Chili,Red_Chili,3,,10,0,,,,,,,,,,,{},{},,
-7287,Sacred_Wool_Charm_2,Sacred_Wool_Charm_2,3,,10,0,,,,,,,,,,,{},{},,
-7288,Engagement_Ring,Engagement_Ring,3,,10,0,,,,,,,,,,,{},{},,
-7289,Olivite,Olivite,3,,100,0,,,,,,,,,,,{},{},,
-7290,Gold_Mica,Gold_Mica,3,,100,0,,,,,,,,,,,{},{},,
-7291,Agate,Agate,3,,100,0,,,,,,,,,,,{},{},,
-7292,White_Mica,White_Mica,3,,100,0,,,,,,,,,,,{},{},,
-7293,Rose_Quartz,Rose_Quartz,3,,100,0,,,,,,,,,,,{},{},,
-7294,Turquoise,Turquoise,3,,100,0,,,,,,,,,,,{},{},,
-7295,Citrine,Citrine,3,,100,0,,,,,,,,,,,{},{},,
-7296,Augite,Augite,3,,100,0,,,,,,,,,,,{},{},,
-7297,Black_Mica,Black_Mica,3,,100,0,,,,,,,,,,,{},{},,
-7298,Leaf_Cloth,Leaf_Cloth,3,,10,0,,,,,,,,,,,{},{},,
-7299,Bamboo_Basket,Bamboo_Basket,3,,10,0,,,,,,,,,,,{},{},,
-7300,Jeweled_Ore,Jeweled_Ore,3,,10,0,,,,,,,,,,,{},{},,
-7301,Knife_Decoration,Knife_Decoration,3,,10,0,,,,,,,,,,,{},{},,
-7302,Krathong,Krathong,3,,10,0,,,,,,,,,,,{},{},,
-
-7500,THG_Membership,THG Membership,3,20,,10,,,,,,,,,,,{},{}
-7501,Token_Bag,Token Bag,3,20,,10,,,,,,,,,,,{},{}
-
-// Pet Eggs
-//===================================================================
-9001,Poring_Egg,Poring Egg,7,20,,0,,,,,,,,,,,{},{}
-9002,Drops_Egg,Drops Egg,7,20,,0,,,,,,,,,,,{},{}
-9003,Poporing_Egg,Poporing Egg,7,20,,0,,,,,,,,,,,{},{}
-9004,Lunatic_Egg,Lunatic Egg,7,20,,0,,,,,,,,,,,{},{}
-9005,Picky_Egg,Picky Egg,7,20,,0,,,,,,,,,,,{},{}
-9006,Chonchon_Egg,Chonchon Egg,7,20,,0,,,,,,,,,,,{},{}
-9007,Steel_Chonchon_Egg,Steel Chonchon Egg,7,20,,0,,,,,,,,,,,{},{}
-9008,Hunter_Fly_Egg,Hunter Fly Egg,7,20,,0,,,,,,,,,,,{},{}
-9009,Savage_Babe_Egg,Savage Babe Egg,7,20,,0,,,,,,,,,,,{},{}
-9010,Baby_Desert_Wolf_Egg,Baby Desert Wolf Egg,7,20,,0,,,,,,,,,,,{},{}
-9011,Rocker_Egg,Rocker Egg,7,20,,0,,,,,,,,,,,{},{}
-9012,Spore_Egg,Spore Egg,7,20,,0,,,,,,,,,,,{},{}
-9013,Poison_Spore_Egg,Poison Spore Egg,7,20,,0,,,,,,,,,,,{},{}
-9014,PecoPeco_Egg,PecoPeco Egg,7,20,,0,,,,,,,,,,,{},{}
-9015,Smokie_Egg,Smokie Egg,7,20,,0,,,,,,,,,,,{},{}
-9016,Yoyo_Egg,Yoyo Egg,7,20,,0,,,,,,,,,,,{},{}
-9017,Orc_Warrior_Egg,Orc Warrior Egg,7,20,,0,,,,,,,,,,,{},{}
-9018,Munak_Egg,Munak Egg,7,20,,0,,,,,,,,,,,{},{}
-9019,Dokkaebi_Egg,Dokkaebi Egg,7,20,,0,,,,,,,,,,,{},{}
-9020,Sohee_Egg,Sohee Egg,7,20,,0,,,,,,,,,,,{},{}
-9021,Isis_Egg,Isis Egg,7,20,,0,,,,,,,,,,,{},{}
-9022,Green_Petite_Egg,Green Petite Egg,7,20,,0,,,,,,,,,,,{},{}
-9023,Deviruchi_Egg,Deviruchi Egg,7,20,,0,,,,,,,,,,,{},{}
-9024,Bapho_Jr._Egg,Bapho Jr. Egg,7,20,,0,,,,,,,,,,,{},{}
-9025,Bongun_Egg,Bongun Egg,7,20,,0,,,,,,,,,,,{},{}
-9026,Alice_Egg,Alice Egg,7,20,,0,,,,,,,,,,,{},{}
-9027,Zherlthsh_Egg,Zherlthsh Egg,7,20,,0,,,,,,,,,,,{},{}
-9028,test_Egg,Test Egg,7,20,,0,,,,,,,,,,,{},{}
-9029,test_Egg_,Test Egg,7,20,,0,,,,,,,,,,,{},{}
-
-// Pet Accessories
-//===================================================================
-10001,Skull_Helm,Skull Helm,8,20,,0,,,,,,,,,,,{},{}
-10002,Monster_Oxygen_Mask,Monster Oxygen Mask,8,20,,0,,,,,,,,,,,{},{}
-10003,Transparent_Head_Protector,Transparent Headgear,8,20,,0,,,,,,,,,,,{},{}
-10004,Pacifier,Pacifier,8,20,,0,,,,,,,,,,,{},{}
-10005,Wig,Wig,8,20,,0,,,,,,,,,,,{},{}
-10006,Queen's_Hair_Ornament,Queen's Hair Ornament,8,20,,0,,,,,,,,,,,{},{}
-10007,Silk_Ribbon,Silk Ribbon,8,20,,0,,,,,,,,,,,{},{}
-10008,Punisher,Punisher,8,20,,0,,,,,,,,,,,{},{}
-10009,Wild_Flower,Wild Flower,8,20,,0,,,,,,,,,,,{},{}
-10010,Battered_Pot,Battered Pot,8,20,,0,,,,,,,,,,,{},{}
-10011,Stellar_Hairpin,Stellar Hairpin,8,20,,0,,,,,,,,,,,{},{}
-10012,Tiny_Egg_Shell,Tiny Egg Shell,8,20,,0,,,,,,,,,,,{},{}
-10013,Backpack,Backpack,8,1500,,0,,,,,,,,,,,{},{}
-10014,Rocker_Glasses,Rocker Glasses,8,2000,,0,,,,,,,,,,,{},{}
-10015,Green_Lace,Green Lace,8,20,,0,,,,,,,,,,,{},{}
-10016,Golden_Bell,Golden Bell,8,20,,0,,,,,,,,,,,{},{}
-10017,Bark_Shorts,Bark Shorts,8,20,,0,,,,,,,,,,,{},{}
-10018,Monkey_Circlet,Monkey Circlet,8,20,,0,,,,,,,,,,,{},{}
-10019,Red_Muffler,Red Muffler,8,20,,0,,,,,,,,,,,{},{}
-10020,Sword_of_Chinese_Exorcist,Sword of Chinese Exorcist,8,20,,0,,,,,,,,,,,{},{}
-
-// History books
-//===================================================================
-11000,Prontera_History_Book,Prontera History Book,3,20,,0,,,,,,,,,,,{},{}
-//11001,Poetry_Anthology,Poetry Anthology,3,20,,0,,,,,,,,,,,{},{}
-11001,Izlude_History_Book,Izlude History Book,3,,,0,,,,,,,,,,,{},{}
-//11002,Novel,Novel,3,20,,0,,,,,,,,,,,{},{}
-11002,Yuno_History_Book,Yuno History Book,3,,,0,,,,,,,,,,,{},{}
-11003,Geffen_History_Book,Geffen History Book,3,,,0,,,,,,,,,,,{},{}
-11004,Aldebaran_History_Book,Aldebaran History Book,3,,,0,,,,,,,,,,,{},{}
-11005,Alberta_History_Book,Alberta History Book,3,,,0,,,,,,,,,,,{},{}
-11006,Payon_History_Book,Payon History Book,3,,,0,,,,,,,,,,,{},{}
-11007,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
-11008,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
-11009,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
-11010,Archer_Village_History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
-11011,Lutie_History_Book,Luite History Book,3,,,0,,,,,,,,,,,{},{}
-11012,Jawaii_History_Book,Jawaii History Book,3,,,0,,,,,,,,,,,{},{}
-11013,Gonryun_History_Book,Gonryun History Book,3,,,0,,,,,,,,,,,{},{}
-11014,Mjolnir_History_Book,Mjolnir History Book,3,,,0,,,,,,,,,,,{},{}
-11015,Amatsu_History_Book,Amatsu History Book,3,,,0,,,,,,,,,,,{},{}
-11016,Umbala_History_Book,Umbala History Book,3,,,0,,,,,,,,,,,{},{}
-11017,Nifleheim_History_Book,Nifflheim History Book,3,,,0,,,,,,,,,,,{},{}
-11018,Morroc_History_Book,Morroc History Book,3,,,0,,,,,,,,,,,{},{}
-11019,Comodo_History_Book,Comodo History Book,3,,,0,,,,,,,,,,,{},{}
+//ID,Name,Name,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View,{UseScript},{EquipScript}
+
+// Healing Items
+//=============================================================
+0,DEFAULT,Default,0,20,,10,,,,,0,2,0,0,,,{},{},,
+501,Red_Potion,Red Potion,0,50,,70,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
+502,Orange_Potion,Orange Potion,0,200,,100,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
+503,Yellow_Potion,Yellow Potion,0,550,,130,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{}
+504,White_Potion,White Potion,0,1200,,150,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
+505,Blue_Potion,Blue Potion,0,5000,,150,,,,,10477567,2,,,,,{ itemheal 0,rand(40,59); },{}
+506,Green_Potion,Green Potion,0,40,,70,,,,,10477567,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,,,,,10477567,2,,,,,{ itemheal rand(18,27),0; },{}
+508,Yellow_Herb,Yellow Herb,0,40,,50,,,,,10477567,2,,,,,{ itemheal rand(38,57),0; },{}
+509,White_Herb,White Herb,0,120,,70,,,,,10477567,2,,,,,{ itemheal rand(75,114),0; },{}
+510,Blue_Herb,Blue Herb,0,60,,70,,,,,10477567,2,,,,,{ itemheal 0,rand(15,29); },{}
+511,Green_Herb,Green Herb,0,10,,30,,,,,10477567,2,,,,,{ sc_end SC_Poison; },{},,
+512,Apple,Apple,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(16,21),0; },{}
+513,Banana,Banana,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(17,20),0; },{}
+514,Grape,Grape,0,200,,20,,,,,10477567,2,,,,,{ itemheal 0,rand(10,14); },{}
+515,Carrot,Carrot,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(18,19),0; },{},
+516,Sweet_Potato,Sweet Potato,0,15,,20,,,,,10477567,2,,,,,{ itemheal rand(15,22),0; },{},
+517,Meat,Meat,0,50,,150,,,,,10477567,2,,,,,{ itemheal rand(70,99),0; },{},
+518,Honey,Honey,0,500,,100,,,,,10477567,2,,,,,{ itemheal rand(70,99),rand(20,39); },{}
+519,Milk,Milk,0,25,,30,,,,,10477567,2,,,,,{ itemheal rand(27,36),0; },{},
+520,Hinalle_Leaflet,Hinalle Leaflet,0,150,,10,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{},
+521,Aloe_Leaflet,Aloe Leaflet,0,360,,20,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{},
+522,Mastela_Fruit,Mastela Fruit,0,840,,30,,,,,10477567,2,,,,,{ itemheal rand(400,599),0; },{},
+523,Holy_Water,Holy Water,0,20,,30,,,,,10477567,2,,,,,{ sc_end SC_Curse; },{},,,
+525,Panacea,Panacea,0,500,,100,,,,,10477567,2,,,,,{ sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; },{}
+526,Royal_Jelly,Royal Jelly,0,7000,,150,,,,,10477567,2,,,,,{ itemheal rand(325,404),rand(40,59); sc_end SC_Posion; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse; },{}
+528,Monster's_Feed,Monster Food,0,60,,150,,,,,10477567,2,,,,,{ itemheal rand(72,107),0; },{},
+529,Candy,Candy,0,10,,30,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
+530,Candy_Cane,Candy Cane,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
+531,Apple_Juice,Apple Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(25,34),0; },{}
+532,Banana_Juice,Banana Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(26,33),0; },{}
+533,Grape_Juice,Grape Juice,0,250,,40,,,,,10477567,2,,,,,{ itemheal 0,rand(15,24); },{}
+534,Carrot_Juice,Carrot Juice,0,20,,40,,,,,10477567,2,,,,,{ itemheal rand(27,32),0; },{}
+535,Pumkin,Pumpkin,0,15,,20,,,,,10477567,2,,,,,{ itemheal 19,0; },{}
+536,Ice_Cream,Ice Cream,0,150,,80,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
+537,Pet_Food,Pet Food,0,1000,,10,,,,,10477567,2,,,,,{ itemheal rand(50,89),0; },{}
+538,Well-baked_Cookie,Well-baked Cookie,0,1000,,30,,,,,10477567,2,,,,,{ itemheal rand(160,199),0; },{}
+539,Piece_of_Cake,Piece of Cake,0,3000,,100,,,,,10477567,2,,,,,{ itemheal rand(270,329),0; },{}
+540,Falcon_food,Falcon food,0,20,,50,,,,,10477567,2,,,,,{},{}
+541,Pecopeco_food,Pecopeco food,0,20,,50,,,,,10477567,2,,,,,{},{}
+542,Festive_Cookie,Festive Cookie,0,10,,10,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
+543,Festive_Rainbow_Cake,Festive Rainbow Cake,0,20,,10,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
+544,Raw_Fish,Raw Fish,0,20,,30,,,,,10477567,2,,,,,{ itemheal rand(25,59),0; },{}
+545,Condensed_Red_Potion,Condensed Red Potion,0,20,,20,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{}
+546,Condensed_Yellow_Potion,Condensed Yellow Potion,0,20,,30,,,,,10477567,2,,,,,{ itemheal rand(175,234),0; },{}
+547,Condensed_White_Potion,Condensed White Potion,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(325,404),0; },{}
+548,Cheese,Cheese,0,2800,,50,,,,,10477567,2,,,,,{ itemheal 0,rand(10,14); },{}
+549,Yam,Hot Potato,0,180,,80,,,,,10477567,2,,,,,{ itemheal rand(50,99),0; },{}
+550,Rice_Cake,Rice Popper,0,20,5,10,,,,,10477567,2,,,,,{ itemheal rand(10,14),0; },{}
+551,Sushi,Sushi,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(50,60),0; },{}
+552,Ketupat,Ketupat,0,20,,10,,,,,10477567,2,,,,,{ itemheal rand(100,200),0; },{}
+553,Dumpling,Dumpling,0,20,,50,,,,,10477567,2,,,,,{ itemheal rand(39,68),0; },{}
+554,Mochi,Mochi,0,100,,80,,,,,10477567,2,,,,,{ itemheal rand(100,200),0; },{}
+//554,Wool_CCI,Wool CCI,0,100,,80,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{}
+555,Rice_Cake,Rice Cake,0,,,20,,,,,10477567,2,,,,,{},{}
+556,Rolled_Rice,Rolled Rice,0,20,,10,,,,,,,,,,,{},{},,
+557,Cut_Rice_Rolls,Cut Rice Rolls,0,20,,10,,,,,,,,,,,{},{},,
+//557,Decorated Rice Cake,Prettily Cut Rice Cake,0,,,10,,,,,,,,,,,{},{}
+558,Chocolate,Chocolate,0,500,,20,,,,,10477567,2,,,,,{ itemheal 1,1; },{},
+559,Hand-made_Chocolate,Hand-made Chocolate,0,5000,,80,,,,,10477567,2,,,,,{ itemheal 50,50; },{},
+560,White_Chocolate,White Chocolate,0,0,,80,,,,,10477567,2,,,,,{},{},,
+561,Milk_Chocolate_Bar,Milk Chocolate,0,0,,80,,,,,10477567,2,,,,,{},{},,
+562,Pizza,Pizza,0,20,,150,,,,,10477567,2,,,,,{},{},,
+563,Double_Growing_Swiss_Pong_Tyu_,Unknown Item,0,,,150,,,,,,,,,,,{},{}
+564,Meat_Dumpling,Meat Dumpling,0,20,,30,,,,,0,3,,,,,{ itemheal rand(175,234),0; },{}
+565,Vita_500_Bottle,Vita 500,0,2000,,30,,,,,10477567,2,,,,,{ itemheal 500,0; },{}
+566,Tom_Yum_Goong,Tom_Yum_Goong,0,,150,0,,,,,,,,,,,{},{},,
+567,Prawn,Prawn,0,,40,0,,,,,,,,,,,{},{},,
+568,Lemon,Lemon,0,,40,0,,,,,,,,,,,{},{},,
+
+// Usable Items
+//===================================================================
+601,Fly_Wing,Fly Wing,2,60,,50,,,,,10477567,2,,,,,{ warp "Random",0,0; },{}
+602,Butterfly_Wing,Butterfly Wing,2,300,,50,,,,,10477567,2,,,,,{ warp "SavePoint",0,0; },{}
+603,Old_Blue_Box,Old Blue Box,2,10000,,200,,,,,10477567,2,,,,,{ getitem -1,1; },{}
+604,Dead_Branch,Dead Branch,2,50,,50,,,,,10477567,2,,,,,{ monster "this",0,0,"--ja--",-1,1,; },{}
+605,Anodyne,Anodyne,2,2000,,100,,,,,10477567,2,,,,,{ itemskill 8,1,"??????????"; },{}
+606,Aloevera,Aloevera,2,1500,,100,,,,,10477567,2,,,,,{ itemskill 6,1,"?????"; },{}
+607,Yggdrasilberry,Yggdrasilberry,0,2,,300,,,,,10477567,2,,,,,{ percentheal 100,100; },{}
+608,Yggdrasil_Seed,Yggdrasil Seed,0,5000,,300,,,,,10477567,2,,,,,{ percentheal 50,50; },{}
+609,Amulet,Amulet,2,100,,100,,,,,10477567,2,,,,,{},{}
+610,Yggdrasil_Leaf,Yggdrasil Leaf,2,4000,,100,,,,,10477567,2,,,,,{ itemskill 54,1,"????????"; },{}
+611,Magnifier,Magnifier,2,40,,50,,,,,10477567,2,,,,,{ itemskill 40,1,"???"; },{}
+// Smithing Items
+612,Mini_Furnace,Mini Furnace,2,150,,200,,,,,10477567,2,,,,,{ produce 16; },{}
+613,Iron_Hammer,Iron Hammer,2,1000,,200,,,,,10477567,2,,,,,{ produce 1; },{},,,,,,
+614,Golden_Hammer,Golden Hammer,2,3000,,300,,,,,10477567,2,,,,,{ produce 2; },{},,,,,,
+615,Oridecon_Hammer,Oridecon Hammer,2,5000,,400,,,,,10477567,2,,,,,{ produce 3; },{}
+// Item Givers
+616,Old_Card_Album,Old Card Album,2,10000,,50,,,,,10477567,2,,,,,{ getitem -3,1; },{},,,,,
+617,Old_Violet_Box,Old Violet Box,2,10000,,200,,,,,10477567,2,,,,,{ getitem -2,1; },{}
+618,Worn_Out_Scroll,Worn Out Scroll,2,50,,20,,,,,10477567,2,,,,,{ getitem -5,1; },{}
+
+// Pet Tames
+//===================================================================
+619,Unripe_Apple,Unripe Apple,2,1000,,50,,,,,10477567,2,,,,,{ pet 1002; },{},
+620,Orange_Juice,Orange Juice,2,1500,,50,,,,,10477567,2,,,,,{ pet 1113; },{}
+621,Bitter_Herb,Bitter Herb,2,20,,50,,,,,10477567,2,,,,,{ pet 1031; },{},
+622,Rainbow_Carrot,Rainbow Carrot,2,2500,,50,,,,,10477567,2,,,,,{ pet 1063; },{},
+623,Earthworm_the_Dude,Earthworm the Dude,2,4000,,50,,,,,10477567,2,,,,,{ pet 1049; },{},
+624,Rotten_Fish,Rotten Fish,2,2500,,50,,,,,10477567,2,,,,,{ pet 1011; },{},
+625,Rusty_Iron,Rusty Iron,2,100,,50,,,,,10477567,2,,,,,{ pet 1042; },{},
+626,Monster_Juice,Monster Juice,2,1500,,50,,,,,10477567,2,,,,,{ pet 1035; },{},
+627,Sweet_Milk,Sweet Milk,2,7000,,50,,,,,10477567,2,,,,,{ pet 1167; },{},
+628,Well_Dried_Bone,Well Dried Bone,2,10000,,50,,,,,10477567,2,,,,,{ pet 1107; },{},
+629,Singing_Flower,Singing Flower,2,300,,50,,,,,10477567,2,,,,,{ pet 1052; },{},
+630,Dew_Laden_Moss,Dew Laden Moss,2,10,,50,,,,,10477567,2,,,,,{ pet 1014; },{},
+631,Deadly_Noxious_Herb,Deadly Noxious Herb,2,20,,50,,,,,10477567,2,,,,,{ pet 1077; },{},
+632,Fatty_Chubby_Earthworm,Fatty Chubby Earthworm,2,5000,,50,,,,,10477567,2,,,,,{ pet 1019; },{},
+633,Baked_Yam,Baked Yam,2,20,,50,,,,,10477567,2,,,,,{ pet 1056; },{},,
+634,Tropical_Banana,Tropical Banana,2,20,,50,,,,,10477567,2,,,,,{ pet 1057; },{},,
+635,Horror_of_Tribe,Horror of Tribe,2,300,,50,,,,,10477567,2,,,,,{ pet 1023; },{},,
+636,No_Recipient,No Recipient,2,100,,50,,,,,10477567,2,,,,,{ pet 1026; },{},,
+637,Old_Broom,Old Broom,2,350,,50,,,,,10477567,2,,,,,{ pet 1110; },{},,
+638,Silver_Knife_of_Chastity,Silver Knife of Chastity,2,12000,,50,,,,,10477567,2,,,,,{ pet 1170; },{},,
+639,Armlet_of_Obedience,Armlet of Obedience,2,18000,,50,,,,,10477567,2,,,,,{ pet 1029; },{},,
+640,Shining_Stone,Shining Stone,2,3000,,50,,,,,10477567,2,,,,,{ pet 1155; },{},,
+641,Contract_in_Shadow,Contracts in Shadow,2,100,,50,,,,,10477567,2,,,,,{ pet 1109; },{},,
+642,Book_of_Devil,Book of Devil,2,1800,,50,,,,,10477567,2,,,,,{ pet 1101; },{},,
+643,Pet_Incubator,Pet Incubator,2,3000,,30,,,,,10477567,2,,,,,{ bpet; },{},,
+
+// Misc Items
+//===================================================================
+644,Gift_Box,Gift Box,2,2,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
+645,Concentration_Potion,Concentration Potion,2,800,,100,,,,,10477567,2,,,,,{ sc_start SC_SpeedPot0,1800,0; },{}
+656,Awakening_Potion,Awakening Potion,2,1500,,150,,,,,8904431,2,,,40,,{ sc_start SC_SpeedPot1,1800,0; },{}
+657,Berserk_Potion,Berserk Potion,2,3000,,200,,,,,410786,2,,,85,,{ sc_start SC_SpeedPot2,1800,0; },{}
+658,Tribal_Solidarity,Tribal Solidarity,3,1000,,500,,,,,,,,,,,{},{}
+659,Her_Heart,Her Heart,2,500,,50,,,,,10477567,2,,,,,{ pet 1188; },{},,
+660,Forbidden_Red_Candle,Red Candle,2,20,,50,,,,,10477567,2,,,,,{ pet 1200; },{},,
+661,Sky_Apron,Soft Apron,2,20,,50,,,,,10477567,2,,,,,{ pet 1275; },{}
+
+// Newer Items
+664,Gift_Box_,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
+665,Gift_Box__,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
+666,Gift_Box___,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
+667,Gift_Box____,Gift Box,2,20,,200,,,,,10477567,2,,,,,{ getitem -4,1; },{},
+668,Angpow,Angpow,0,1,,2,,,,,10477567,2,,,,,{ set Zeny,Zeny+rand(100,10000); },{}
+669,Rice_Cake_Soup,Rice Cake Soup,2,20,,100,,,,,,,,,,,{},{},,
+670,Gold_Coin_Pouch,Gold Coin Pouch,2,20,,400,,,,,,,,,,,{},{},,
+671,Gold_Coin,Gold Coin,2,20,,40,,,,,,,,,,,{},{},,
+672,Copper_Coin_Pouch,Copper Coin Pouch,2,20,,400,,,,,,,,,,,{},{},,
+673,Copper_Coin,Copper Coin,2,20,,40,,,,,,,,,,,{},{},,
+674,Mysterious_Ore_Coin,Mysterious Ore Coin,2,20,,40,,,,,,,,,,,{},{},,
+675,Silver_Coin,Silver Coin,2,20,,40,,,,,,,,,,,{},{},,
+676,Silver_Coin_Pouch,Silver Coin Pouch,2,20,,400,,,,,,,,,,,{},{}
+677,Platinum_Coin,Platinum Coin,2,20,,40,,,,,,,,,,,{},{}
+678,Deadly_Poison_Bottle,Deadly Poison Bottle,2,20,,100,,,,,,,,,,,{},{}
+679,Recall_Pills,Recall Pills,2,20,,300,,,,,,,,,,,{},{}
+680,Carnation,Carnation,2,20,,1000,,,,,,,,,,,{},{}
+//680,Horse_Power_You_Syen,Car of Horse Power,2,,,1000,,,,,,,,,,,{},{}
+681,Wedding_Photo_Album,Wedding_Photo_Album,2,20,,10,,,,,,,,,,,{},{}
+//681,Newly-Married_Reminiscence,Reminiscence of the Newly Married,2,,,10,,,,,,,,,,,{},{}
+682,Realgar_Wine,Realgar Wine,2,20,,50,,,,,10477567,2,,,,,{ sc_start SC_ATKPOT,30,30; },{}
+//682,Oong_Hwangju,Oong Hwangju,2,,,100,,,,,10477567,2,,,,,{ sc_start SC_INCATK,30,30; },{}
+683,Exorcize_Herb,Exorcize Herb,2,20,,50,,,,,10477567,2,,,,,{ sc_start SC_MATKPOT,30,30; },{}
+//683,beginning,Beginning,2,,,50,,,,,10477567,2,,,,,{ sc_start SC_INCMATK,30,30; },{}
+684,Durian,Durian,3,20,,10,,,,,,,,,,,{},{}
+685,Ramadan,Ramadan,2,,10,0,,,,,,,,,,,{},{},,
+
+701,Ora_Ora,Ora Ora,3,55000,,200,,,,,,,,,,,{},{}
+702,Animal_Gore,Animal Gore,3,2,,100,,,,,,,,,,,{},{}
+703,Hinalle,Hinalle,3,2,,10,,,,,,,,,,,{},{}
+704,Aloe,Aloe,3,2,,10,,,,,,,,,,,{},{}
+705,Clover,Clover,3,10,,10,,,,,,,,,,,{},{}
+706,Four_Leaf_Clover,Four-Leaf Clover,3,80000,,10,,,,,,,,,,,{},{}
+707,Singing_Plant,Singing Plant,3,2,,10,,,,,,,,,,,{},{}
+708,Ment,Ment,3,2,,10,,,,,,,,,,,{},{}
+709,Izidor,Izidor,3,2,,10,,,,,,,,,,,{},{}
+710,Illusion_Flower,Illusion Flower,3,2,,10,,,,,,,,,,,{},{}
+711,Shoot,Shoot,3,16,,10,,,,,,,,,,,{},{}
+712,Flower,Flower,3,2,,10,,,,,,,,,,,{},{}
+713,Empty_Bottle,Empty Bottle,3,6,,20,,,,,,,,,,,{},{}
+714,Emperium,Emperium,3,2,,1000,,,,,,,,,,,{},{}
+715,Yellow_Gemstone,Yellow Gemstone,3,600,,30,,,,,,,,,,,{},{}
+716,Red_Gemstone,Red Gemstone,3,600,,30,,,,,,,,,,,{},{}
+717,Blue_Gemstone,Blue Gemstone,3,600,,30,,,,,,,,,,,{},{}
+718,Garnet,Garnet,3,6000,,100,,,,,,,,,,,{},{}
+719,Amethyst,Amethyst,3,6000,,100,,,,,,,,,,,{},{}
+720,Aquamarine,Aquamarine,3,6000,,100,,,,,,,,,,,{},{}
+721,Emerald,Emerald,3,6000,,100,,,,,,,,,,,{},{}
+722,Pearl,Pearl,3,6000,,100,,,,,,,,,,,{},{}
+723,Ruby,Ruby,3,6000,,100,,,,,,,,,,,{},{}
+724,Cursed_Ruby,Cursed Ruby,3,1000,,100,,,,,,,,,,,{},{}
+725,Sardonyx,Sardonyx,3,6000,,100,,,,,,,,,,,{},{}
+726,Sapphire,Sapphire,3,6000,,100,,,,,,,,,,,{},{}
+727,Opal,Opal,3,6000,,100,,,,,,,,,,,{},{}
+728,Topaz,Topaz,3,6000,,100,,,,,,,,,,,{},{}
+729,Zircon,Zircon,3,6000,,100,,,,,,,,,,,{},{}
+730,1_Carat_Diamond,1 Carat Diamond,3,10000,,100,,,,,,,,,,,{},{}
+731,2_Carat_Diamond,2 Carat Diamond,3,25000,,100,,,,,,,,,,,{},{}
+732,3_Carat_Diamond,3 Carat Diamond,3,55000,,100,,,,,,,,,,,{},{}
+733,Cracked_Diamond,Cracked Diamond,3,2,,100,,,,,,,,,,,{},{}
+734,Red_Frame,Red Frame,3,3000,,200,,,,,,,,,,,{},{}
+735,Chung_Jah,Chung Jah,3,5000,,500,,,,,,,,,,,{},{}
+736,China,China,3,1000,,300,,,,,,,,,,,{},{}
+737,Black_Ladle,Black Ladle,3,400,,50,,,,,,,,,,,{},{}
+738,Pencil_Case,Pencil Case,3,300,,100,,,,,,,,,,,{},{}
+739,Rouge,Rouge,3,10000,,10,,,,,,,,,,,{},{}
+740,Puppet,Puppet,3,1000,,100,,,,,,,,,,,{},{}
+741,Poring_Doll,Poring Doll,3,1800,,100,,,,,,,,,,,{},{}
+742,Chonchon_Doll,Chonchon Doll,3,3000,1000,100,,,,,,,,,,,{},{}
+743,Spore_Doll,Spore Doll,3,5500,,100,,,,,,,,,,,{},{}
+744,Bouquet,Bouquet,3,2000,,50,,,,,,,,,,,{},{}
+745,Wedding_Bouquet,Wedding Bouquet,3,10000,,50,,,,,,,,,,,{},{}
+746,Glass_Bead,Glass Bead,3,1400,,50,,,,,,,,,,,{},{}
+747,Crystal_Mirror,Crystal Mirror,3,15000,,50,,,,,,,,,,,{},{}
+748,Witherless_Rose,Witherless Rose,3,55000,,10,,,,,,,,,,,{},{}
+749,Frozen_Rose,Frozen Rose,3,35000,,10,,,,,,,,,,,{},{}
+750,Baphomet_Doll,Baphomet Doll,3,18000,,100,,,,,,,,,,,{},{}
+751,Osiris_Doll,Osiris Doll,3,14000,,100,,,,,,,,,,,{},{}
+752,Rocker_Doll,Grasshopper Doll,3,4000,,100,,,,,,,,,,,{},{}
+753,Yoyo_Doll,Yoyo Doll,3,6000,,100,,,,,,,,,,,{},{}
+754,Raccoon_Doll,Raccoon Doll,3,5000,,100,,,,,,,,,,,{},{}
+756,Rough_Oridecon,Rough Oridecon,3,548,,200,,,,,,,,,,,{},{}
+757,Rough_Elunium,Rough Elunium,3,648,,200,,,,,,,,,,,{},{}
+901,Danggie,Danggie,3,250,,10,,,,,,,,,,,{},{}
+902,Tree_Root,Tree Root,3,12,,10,,,,,,,,,,,{},{}
+903,Reptile_Tongue,Reptile Tongue,3,50,,10,,,,,,,,,,,{},{}
+904,Scorpion_Tail,Scorpion Tail,3,124,,10,,,,,,,,,,,{},{}
+905,Stem,Stem,3,58,,10,,,,,,,,,,,{},{}
+906,Pointed_Scale,Pointed Scale,3,70,,10,,,,,,,,,,,{},{}
+907,Resin,Resin,3,120,,10,,,,,,,,,,,{},{}
+908,Spawn,Spawn,3,148,,10,,,,,,,,,,,{},{}
+909,Jellopy,Jellopy,3,6,,10,,,,,,,,,,,{},{}
+910,Garlet,Garlet,3,40,,10,,,,,,,,,,,{},{}
+911,Scell,Scell,3,160,,10,,,,,,,,,,,{},{}
+912,Zargon,Zargon,3,480,,10,,,,,,,,,,,{},{}
+913,Tooth_of_Bat,Tooth of Bat,3,34,,10,,,,,,,,,,,{},{}
+914,Fluff,Fluff,3,8,,10,,,,,,,,,,,{},{}
+915,Chrysalis,Chrysalis,3,8,,10,,,,,,,,,,,{},{}
+916,Feather_of_Birds,Feather of Birds,3,10,,10,,,,,,,,,,,{},{}
+917,Talon,Talon,3,20,,10,,,,,,,,,,,{},{}
+918,Sticky_Webfoot,Sticky Webfoot,3,20,,10,,,,,,,,,,,{},{}
+919,Animal_Skin,Animal Skin,3,36,,10,,,,,,,,,,,{},{}
+920,Wolf_Claw,Wolf Claw,3,58,,10,,,,,,,,,,,{},{}
+921,Mushroom_Spore,Mushroom Spore,3,36,,10,,,,,,,,,,,{},{}
+922,Orc's_Fang,Orcish Fang,3,220,,10,,,,,,,,,,,{},{}
+923,Evil_Horn,Evil Horn,3,1020,,10,,,,,,,,,,,{},{}
+924,Powder_of_Butterfly,Powder of Butterfly,3,90,,10,,,,,,,,,,,{},{}
+925,Bill_of_Birds,Bill of Birds,3,64,,10,,,,,,,,,,,{},{}
+926,Snake_Scale,Snake Scale,3,82,,10,,,,,,,,,,,{},{}
+928,Insect_Feeler,Insect Feeler,3,114,,10,,,,,,,,,,,{},{}
+929,Immortal_Heart,Immortal Heart,3,374,,10,,,,,,,,,,,{},{}
+930,Rotten_Bandage,Rotten Bandage,3,358,,10,,,,,,,,,,,{},{}
+931,Orcish_Voucher,Orcish Voucher,3,168,,10,,,,,,,,,,,{},{}
+932,Skel-Bone,Skel-Bone,3,232,,10,,,,,,,,,,,{},{}
+934,Memento,Memento,3,600,,10,,,,,,,,,,,{},{}
+935,Shell,Shell,3,14,,10,,,,,,,,,,,{},{}
+936,Scale_Shell,Scale Shell,3,466,,10,,,,,,,,,,,{},{}
+937,Venom_Canine,Venom Canine,3,148,,10,,,,,,,,,,,{},{}
+938,Sticky_Mucus,Sticky Mucus,3,70,,10,,,,,,,,,,,{},{}
+939,Bee_Sting,Bee Sting,3,32,,10,,,,,,,,,,,{},{}
+940,Grasshopper's_Leg,Grasshoppers Leg,3,36,,10,,,,,,,,,,,{},{}
+941,Nose_Ring,Nose Ring,3,568,,10,,,,,,,,,,,{},{}
+942,Yoyo_Tail,Yoyo Tail,3,114,,10,,,,,,,,,,,{},{}
+943,Solid_Shell,Solid Shell,3,448,,10,,,,,,,,,,,{},{}
+944,Horseshoe,Horseshoe,3,588,,10,,,,,,,,,,,{},{}
+945,Raccoon_Leaf,Raccoon Leaf,3,106,,10,,,,,,,,,,,{},{}
+946,Snail's_Shell,Snails Shell,3,64,,10,,,,,,,,,,,{},{}
+947,Horn,Horn,3,116,,10,,,,,,,,,,,{},{}
+948,Bear's_Footskin,Bears Footskin,3,174,,10,,,,,,,,,,,{},{}
+949,Feather,Feather,3,20,,10,,,,,,,,,,,{},{}
+950,Heart_of_Mermaid,Heart of Mermaid,3,264,,10,,,,,,,,,,,{},{}
+951,Fin,Fin,3,412,,10,,,,,,,,,,,{},{}
+952,Cactus_Needle,Cactus Needle,3,82,,10,,,,,,,,,,,{},{}
+953,Stone_Heart,Stone Heart,3,184,,10,,,,,,,,,,,{},{}
+954,Shining_Scale,Shining Scale,3,466,,10,,,,,,,,,,,{},{}
+955,Worm_Peeling,Worm Peeling,3,52,,10,,,,,,,,,,,{},{}
+956,Gill,Gill,3,342,,10,,,,,,,,,,,{},{}
+957,Decayed_Nail,Decayed Nail,3,82,,10,,,,,,,,,,,{},{}
+958,Horrendous_Mouth,Horrendous Mouth,3,390,,10,,,,,,,,,,,{},{}
+959,Stinky_Scale,Stinky Scale,3,168,,10,,,,,,,,,,,{},{}
+960,Nipper,Nipper,3,114,,10,,,,,,,,,,,{},{}
+961,Conch,Conch,3,158,,10,,,,,,,,,,,{},{}
+962,Tentacle,Tentacle,3,70,,10,,,,,,,,,,,{},{}
+963,Sharp_scale,Sharp Scale,3,250,,10,,,,,,,,,,,{},{}
+964,Crab_Shell,Crab Shell,3,90,5,10,,,,,,,,,,,{},{}
+965,Clam_Shell,Clam Shell,3,56,5,10,,,,,,,,,,,{},{}
+966,Clam_Flesh,Clam Flesh,3,158,,10,,,,,,,,,,,{},{}
+967,Turtle_Shell,Turtle Shell,3,680,,10,,,,,,,,,,,{},{}
+968,Heroic_Emblem,Heroic Emblem,3,3000,,10,,,,,,,,,,,{},{}
+969,Gold,Gold,3,200000,,200,,,,,,,,,,,{},{}
+970,Alcohol,Alcohol,3,400,,30,,,,,,,,,,,{},{}
+971,Detrimindexta,Detrimindexta,3,400,,30,,,,,,,,,,,{},{}
+972,Karvodailnirol,Karvodailnirol,3,400,,30,,,,,,,,,,,{},{}
+973,Counteragent,Counteragent,3,200,,70,,,,,,,,,,,{},{}
+974,Mixture,Mixture,3,200,,70,,,,,,,,,,,{},{}
+975,Scarlet_Dyestuffs,Scarlet Dyestuffs,3,1000,,150,,,,,,,,,,,{},{}
+976,Lemon_Dyestuffs,Lemon Dyestuffs,3,1000,,150,,,,,,,,,,,{},{}
+978,Cobaltblue_Dyestuff,Cobaltblue Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+979,Darkgreen_Dyestuff,Darkgreen Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+980,Orange_Dyestuff,Orange Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+981,Violet_Dyestuff,Violet Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+982,White_Dyestuff,White Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+983,Black_Dyestuff,Black Dyestuff,3,1000,,150,,,,,,,,,,,{},{}
+984,Oridecon,Oridecon,3,1100,,200,,,,,,,,,,,{},{}
+985,Elunium,Elunium,3,1100,,200,,,,,,,,,,,{},{}
+986,Anvil,Anvil,3,30000,,500,,,,,,,,,,,{},{}
+987,Oridecon_Anvil,Oridecon Anvil,3,120000,,700,,,,,,,,,,,{},{}
+988,Golden_Anvil,Golden Anvil,3,300000,,900,,,,,,,,,,,{},{}
+989,Emperium_Anvil,Emperium Anvil,3,600000,,1000,,,,,,,,,,,{},{}
+990,Red_Blood,Red Blood,3,1000,,50,,,,,,,,,,,{},{}
+991,Crystal_Blue,Crystal Blue,3,1000,,50,,,,,,,,,,,{},{}
+992,Wind_of_Verdure,Wind of Verdure,3,1000,,50,,,,,,,,,,,{},{}
+993,Green_Live,Green Live,3,1000,,50,,,,,,,,,,,{},{}
+994,Flame_Heart,Flame Heart,3,3000,,300,,,,,,,,,,,{},{}
+995,Mystic_Frozen,Mystic Frozen,3,3000,,300,,,,,,,,,,,{},{}
+996,Rough_Wind,Rough Wind,3,3000,,300,,,,,,,,,,,{},{}
+997,Great_Nature,Great Nature,3,3000,,300,,,,,,,,,,,{},{}
+998,Iron,Iron,3,100,,50,,,,,,,,,,,{},{}
+999,Steel,Steel,3,1000,,100,,,,,,,,,,,{},{}
+1000,Star_Crumb,Star Crumb,3,4500,,100,,,,,,,,,,,{},{}
+1001,Star_Dust,Star Dust,3,1500,,10,,,,,,,,,,,{},{}
+1002,Iron_Ore,Iron Ore,3,50,,150,,,,,,,,,,,{},{}
+1003,Coal,Coal,3,500,,50,,,,,,,,,,,{},{}
+1004,Chivalry_Emblem,Chivalry Emblem,3,2,,100,,,,,,,,,,,{},{}
+1005,Hammer_of_Blacksmith,Hammer of Blacksmith,3,2,,800,,,,,,,,,,,{},{}
+1006,Old_Magic_Book,Old Magic Book,3,2,,30,,,,,,,,,,,{},{}
+1007,Necklace_of_Wisdom,Necklace of Wisdom,3,2,,40,,,,,,,,,,,{},{}
+1008,Necklace_of_Oblivion,Necklace of Oblivion,3,2,,100,,,,,,,,,,,{},{}
+1009,Hand_of_God,Hand of God,3,2,,20,,,,,,,,,,,{},{}
+1010,Phracon,Phracon,3,200,,200,,,,,,,,,,,{},{}
+1011,Emveretarcon,Emveretarcon,3,1000,,200,,,,,,,,,,,{},{}
+1012,Frill,Frill,3,250,,10,,,,,,,,,,,{},{}
+1013,Rainbow_Shell,Rainbow Shell,3,90,,10,,,,,,,,,,,{},{}
+1014,Ant_Jaw,Ant Jaw,3,232,,10,,,,,,,,,,,{},{}
+1015,Tongue,Tongue,3,528,,10,,,,,,,,,,,{},{}
+1016,Rat_Tail,Rat Tail,3,52,,10,,,,,,,,,,,{},{}
+1017,Mole_Whiskers,Mole Whiskers,3,106,,10,,,,,,,,,,,{},{}
+1018,Mole_Claw,Mole Claw,3,210,,10,,,,,,,,,,,{},{}
+1019,Trunk,Trunk,3,60,,10,,,,,,,,,,,{},{}
+1020,Black_Hair,Black Hair,3,292,,10,,,,,,,,,,,{},{}
+1021,Dokkaebi_Horn,Dokkaebi Horn,3,292,,10,,,,,,,,,,,{},{}
+1022,Nine_Tails,Nine Tails,3,650,,10,,,,,,,,,,,{},{}
+1023,Fish_Tail,Fish Tail,3,196,,10,,,,,,,,,,,{},{}
+1024,Squid_Ink,Squid Ink,3,264,,10,,,,,,,,,,,{},{}
+1025,Cobweb,Cobweb,3,184,,10,,,,,,,,,,,{},{}
+1026,Acorn,Acorn,3,98,,10,,,,,,,,,,,{},{}
+1027,Porcupine_Quill,Porcupine Quill,3,158,,10,,,,,,,,,,,{},{}
+1028,Mane,Mane,3,196,,10,,,,,,,,,,,{},{}
+1029,Tiger_Skin,Tiger Skin,3,548,,10,,,,,,,,,,,{},{}
+1030,Tiger's_Footskin,Tigers Footskin,3,1500,,10,,,,,,,,,,,{},{}
+1031,Mantis_Scythe,Mantis Scythe,3,196,,10,,,,,,,,,,,{},{}
+1032,Maneater_Blossom,Maneater Blossom,3,196,,10,,,,,,,,,,,{},{}
+1033,Maneater_Root,Maneater Root,3,208,,10,,,,,,,,,,,{},{}
+1034,Blue_Hair,Blue Hair,3,342,,10,,,,,,,,,,,{},{}
+1035,Dragon_Canine,Dragon Canine,3,484,,10,,,,,,,,,,,{},{}
+1036,Dragon_Scale,Dragon Scale,3,500,,10,,,,,,,,,,,{},{}
+1037,Dragon_Tail,Dragon Tail,3,1200,,10,,,,,,,,,,,{},{}
+1038,Little_Evil_Horn,Little Evil Horn,3,528,,10,,,,,,,,,,,{},{}
+1039,Little_Evil_Wing,Little Evil Wing,3,2000,,10,,,,,,,,,,,{},{}
+1040,Elder_Pixie's_Moustache,Elder Pixies Moustache,3,232,,10,,,,,,,,,,,{},{}
+1041,Lantern,Lantern,3,250,,10,,,,,,,,,,,{},{}
+1042,Bug_Leg,Bug Leg,3,430,,10,,,,,,,,,,,{},{}
+1043,Orc_Claw,Orc Claw,3,168,,10,,,,,,,,,,,{},{}
+1044,Zenorc's_Fang,Zenorcs Fang,3,264,,10,,,,,,,,,,,{},{}
+1045,Cultish_Masque,Cultish Masque,3,412,,10,,,,,,,,,,,{},{}
+1046,Scorpion_Nipper,Scorpion Nipper,3,614,,10,,,,,,,,,,,{},{}
+1047,Dead_Medusa,Dead Medusa,3,548,,10,,,,,,,,,,,{},{}
+1048,Horrendous_Hair,Horrendous Hair,3,800,,10,,,,,,,,,,,{},{}
+1049,Skirt_of_Virgin,Skirt of Virgin,3,1700,,10,,,,,,,,,,,{},{}
+1050,Tendon,Tendon,3,220,,10,,,,,,,,,,,{},{}
+1051,Detonator,Detonator,3,450,,10,,,,,,,,,,,{},{}
+1052,Single_Cell,Single Cell,3,46,,10,,,,,,,,,,,{},{}
+1053,Ancient_Tooth,Ancient Tooth,3,548,,10,,,,,,,,,,,{},{}
+1054,Ancient_Lips,Ancient Lips,3,1000,,10,,,,,,,,,,,{},{}
+1055,Earthworm_Peeling,Earthworm Peeling,3,196,,10,,,,,,,,,,,{},{}
+1056,Grit,Grit,3,306,,10,,,,,,,,,,,{},{}
+1057,Moth_Dust,Moth Dust,3,138,,10,,,,,,,,,,,{},{}
+1058,Moth_Wings,Moth Wings,3,200,,10,,,,,,,,,,,{},{}
+1059,Fabric,Fabric,3,306,,10,,,,,,,,,,,{},{}
+1060,Golden_Hair,Golden Hair,3,430,,10,,,,,,,,,,,{},{}
+1061,Witched_Starsand,Witched Starsand,3,484,,10,,,,,,,,,,,{},{}
+1062,Jack_o'_Pumpkin,Jack o' Pumpkin,3,374,,10,,,,,,,,,,,{},{}
+1063,Fang,Fang,3,680,,10,,,,,,,,,,,{},{}
+1064,Reins,Reins,3,802,,10,,,,,,,,,,,{},{}
+1065,Trap,Trap,3,100,,10,,,,,,,,,,,{},{}
+1066,Fine-grained_Trunk,Fine-grained Trunk,3,2,,10,,,,,,,,,,,{},{}
+1067,Solid_Trunk,Solid Trunk,3,2,,10,,,,,,,,,,,{},{}
+1068,Barren_Trunk,Barren Trunk,3,2,,10,,,,,,,,,,,{},{}
+1069,Orange_Net_Mushroom,Orange Net Mushroom,3,2,,10,,,,,,,,,,,{},{}
+1070,Orange_Gooey_Mushroom_,Orange Gooey Mushroom,3,2,,10,,,,,,,,,,,{},{}
+1071,Unknown_Test_Tube,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
+1072,Delivery_Message,DEL Message,3,2,,10,,,,,,,,,,,{},{}
+1073,Voucher,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1074,Voucher_,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1075,Voucher__,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1076,Voucher___,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1077,Voucher____,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1078,Voucher_____,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1079,Voucher______,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1080,Voucher_______,Voucher,3,2,,10,,,,,,,,,,,{},{}
+1081,Delivery_Box,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
+1082,Delivery_Box_,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
+1083,Delivery_Box__,DEL Box,3,2,,1200,,,,,,,,,,,{},{}
+1084,Kafra_Pass,Kafra Pass,3,0,,10,,,,,,,,,,,{},{}
+1085,Unknown_Test_Tube_,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
+1086,Unknown_Test_Tube__,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
+1087,Unknown_Test_Tube___,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
+1088,Morroc_Solution,Morocc Solution,3,2,,30,,,,,,,,,,,{},{}
+1089,Payon_Solution,Payon Solution,3,2,,30,,,,,,,,,,,{},{}
+1090,Unknown_Test_Tube____,Unknown Testtube,3,2,,30,,,,,,,,,,,{},{}
+1092,Empty_Test_Tube,Empty Testtube,3,3,,20,,,,,,,,,,,{},{}
+1093,Empty_Potion_Bottle,Empty Potion Bottle,3,10,,10,,,,,,,,,,,{},{}
+1094,Short_Daenggie,Short Daenggie,3,278,,10,,,,,,,,,,,{},{}
+1095,Clock_Hand,Needle of Alarm,3,546,,10,,,,,,,,,,,{},{}
+1096,Round_Shell,Round Shell,3,954,,10,,,,,,,,,,,{},{}
+1097,Worn_Out_Page,Worn Out Page,3,820,,10,,,,,,,,,,,{},{}
+1098,Manacles,Manacles,3,658,,10,,,,,,,,,,,{},{}
+1099,Worn-out_Prison_Uniform,Worn-out Prison Uniform,3,680,,10,,,,,,,,,,,{},{}
+
+// Weapons
+//===================================================================
+// 1 Handed Swords
+1101,Sword,Sword,4,100,,500,25,,1,3,8803555,2,2,1,2,2,{},{}
+1102,Sword_,Sword,4,100,,500,25,,1,4,8803555,2,2,1,2,2,{},{}
+1103,Sword__,Sword,4,100,,500,25,,1,0,8803555,2,2,1,2,2,{},{}
+1104,Falchion,Falchion,4,1500,,600,39,,1,3,8803555,2,2,1,2,2,{},{}
+1105,Falchion_,Falchion,4,1500,,600,39,,1,4,8803555,2,2,1,2,2,{},{}
+1106,Falchion__,Falchion,4,1500,,600,39,,1,0,8803555,2,2,1,2,2,{},{}
+1107,Blade,Blade,4,2900,,700,53,,1,3,8803555,2,2,1,2,2,{},{}
+1108,Blade_,Blade,4,2900,,700,53,,1,4,8803555,2,2,1,2,2,{},{}
+1109,Blade__,Blade,4,2900,,700,53,,1,0,8803555,2,2,1,2,2,{},{}
+1110,Rapier,Rapier,4,10000,,500,70,,1,2,8803555,2,2,2,14,2,{},{}
+1111,Rapier_,Rapier,4,10000,,500,70,,1,3,8803555,2,2,2,14,2,{},{}
+1112,Rapier__,Rapier,4,10000,,500,70,,1,0,8803555,2,2,2,14,2,{},{}
+1113,Scimiter,Scimiter,4,17000,,700,85,,1,2,8803555,2,2,2,14,2,{},{}
+1114,Scimiter_,Scimiter,4,17000,,700,85,,1,3,8803555,2,2,2,14,2,{},{}
+1115,Scimiter__,Scimiter,4,17000,,700,85,,1,0,8803555,2,2,2,14,2,{},{}
+1116,Katana,Katana,4,2000,,1000,60,,1,3,16514,2,34,1,4,3,{},{}
+1117,Katana_,Katana,4,2000,,1000,60,,1,4,16514,2,34,1,4,3,{},{}
+1118,Katana__,Katana,4,2000,,1000,60,,1,0,16514,2,34,1,4,3,{},{}
+1119,Tsurugi,Tsurugi,4,51000,,1200,130,,1,1,414946,2,2,3,27,2,{},{}
+1120,Tsurugi_,Tsurugi,4,51000,,1200,130,,1,2,414946,2,2,3,27,2,{},{}
+1121,Tsurugi__,Tsurugi,4,51000,,1200,130,,1,0,414946,2,2,3,27,2,{},{}
+1122,Ring_Pommel_Saber,Ring Pommel Saber,4,24000,,900,100,,1,2,414946,2,2,2,14,2,{},{}
+1123,Haedonggum,Haedonggum,4,50000,,900,120,,1,1,414946,2,2,3,27,2,{},{ bonus bInt,3; },,,,,,
+1124,Orcish_Sword,Orcish sword,4,20,,800,90,,1,0,8803555,2,2,3,5,2,{},{ bonus bUnbreakable,100; },,,,,,,
+1125,Ring_Pommel_Saber_,Ring Pommel Saber,4,24000,,900,100,,1,3,414946,2,2,2,14,2,{},{},,,,,,,
+1126,Saber,Saber,4,49000,,1000,115,,1,2,414946,2,2,3,27,2,{},{},,,,,,,
+1127,Saber_,Saber,4,49000,,1000,115,,1,3,414946,2,2,3,27,2,{},{},,,,,,,
+1128,Haedonggum_,Haedonggum,4,50000,,900,120,,1,2,414946,2,2,3,27,2,{},{ bonus bInt,3; },,,,,,
+1129,Flamberge,Flamberge,4,60000,,1500,150,,1,0,16512,2,2,3,27,2,{},{},,,,,,,
+1130,Nagan,Nagan,4,20,,500,120,,1,0,414946,2,2,4,40,2,{},{ bonus bDoubleRate,25; bonus2 bAddRace,7,5; },,,,
+1131,Ice_Falchion,Ice Falchion,4,20,,600,100,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,1; skill 14,3; bonus2 bAddEff,Eff_Freeze,500; bonus3 bAutoSpell,14,3,25; }
+1132,Edge,Edge,4,20,,700,115,,1,0,414946,2,2,4,40,2,{},{ bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,11,10; },,,
+1133,Fire_Brand,Fire Brand,4,20,,500,100,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,3; skill 19,3; bonus3 bAutoSpell,19,3,25; },,
+1134,Caesar's_Sword,Caesar's Sword,4,20,,700,140,,1,0,414946,2,2,4,40,2,{},{ bonus2 bAddRace,3,25; bonus bIgnoreDefRace,3; },,,,
+1135,Cutlas,Cutlas,4,20,,900,150,,1,0,414946,2,2,4,40,2,{},{ skill 5,5; bonus bStr,2; bonus bDef,1; },,,,
+1136,Solar_Sword,Solar Sword,4,20,,1200,85,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,3; bonus2 bHPDrainRate,100,1; bonus2 bSPDrainRate,50,-15; },,,,
+1137,Excalibur,Excalibur,4,20,,1200,150,,1,0,414946,2,2,4,40,2,{},{ bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,6; },,,
+1138,Mysteltainn_,Mysteltainn,4,20,,1000,170,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,7; bonus2 bAddEle,8,15; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3; },
+1139,Talefing_,Talefing,4,20,,1000,200,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,7; bonus2 bSPDrainRate,50,-35; },,,,,,,,,
+1140,Byeollungum,Byeollungum,4,20,,900,150,,1,0,414946,2,2,4,40,2,{},{ bonus2 bSubRace,11,-10; bonus2 bAddRace,10,50; bonus bAllStats,2; }
+1141,Immaterial_Sword,Immaterial Sword,4,20,,900,140,,1,0,414946,2,2,4,40,2,{},{ bonus bAtkEle,8; bonus2 bSPDrainRate,100,30; bonus2 bSPDrainRate,10000,-1; },,,,,,,,,
+1142,Jewel_Sword,Crystal Sword,4,20,,2200,104,,1,0,414946,2,2,3,68,2,{},{},,,,,,,,,,
+1143,Gaia_Sword,Gaia Sword,4,20,,2500,115,,1,0,414946,2,2,3,74,2,{},{ bonus3 bAddMonsterDropItem,1002,50,25000; },,,,,,,,,,
+1144,Sashimi,Sashimi,4,20,,1400,75,,1,0,414946,2,2,3,48,2,{},{ bonus bAtkEle,4; bonus3 bAddMonsterDropItem,544,5,4000; },,,,,,
+1145,Holy_Avenger,Holy Avenger,4,20,,1350,125,,1,0,16384,2,2,3,75,2,{},{ bonus bAtkEle,6; },,,,,,,,
+// 2 Handed Swords
+1151,Slayer,Slayer,4,15000,,1300,90,,1,2,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1152,Slayer_,Slayer,4,15000,,1300,90,,1,3,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1153,Slayer__,Slayer,4,15000,,1300,90,,1,0,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1154,Bastard_Sword,Bastard Sword,4,22500,,1600,115,,1,2,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1155,Bastard_Sword_,Bastard Sword,4,22500,,1600,115,,1,3,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1156,Bastard_Sword__,Bastard Sword,4,22500,,1600,115,,1,0,16514,2,34,2,18,3,{},{},,,,,,,,,,
+1157,Two_handed_Sword,Two-handed Sword,4,60000,,2200,160,,1,1,16514,2,34,3,33,3,{},{},,,,,,,,,,
+1158,Two_handed_Sword_,Two-handed Sword,4,60000,,2200,160,,1,2,16514,2,34,3,33,3,{},{},,,,,,,,,,
+1159,Two_handed_Sword__,Two-handed Sword,4,60000,,2200,160,,1,0,16514,2,34,3,33,3,{},{},,,,,,
+1160,Broad_Sword,Broad Sword,4,65000,,2000,140,,1,1,16514,2,34,3,33,3,{},{ bonus bDef,5; },,,,,
+1161,Balmung,Balmung,4,20,,1000,250,,2,0,2088959,2,2,4,48,1,{},{ bonus bInt,20; bonus bLuk,20; },,,,
+1162,Broad_Sword_,Broad Sword,4,65000,,2000,140,,1,2,16514,2,34,3,33,3,{},{ bonus bDef,5; },,,,,
+1163,Claymore,Claymore,4,74000,,2500,180,,1,0,16512,2,34,3,33,3,{},{},,,,,,
+1164,Muramasa,Muramasa,4,20,,1000,155,,1,0,16514,2,34,4,48,3,{},{ bonus bCritical,30; bonus bAspdAddRate,8; bonus2 bAddEff2,Eff_Curse,200; },,
+1165,Masamune,Masamune,4,20,,1000,200,,1,0,16514,2,34,4,48,3,{},{ bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-50; bonus bDef2Rate,-50; },
+1166,Dragon_Slayer,Dragon Slayer,4,20,,1300,150,,1,0,16514,2,34,4,48,3,{},{ bonus bIgnoreDefRace,9; bonus2 bAddRace,9,15; },,,
+1167,Schweizersabel,Schweizersabel,4,20,,1600,160,,1,0,16514,2,34,4,48,3,{},{ bonus bAtkEle,4; skill 20,3; bonus bDef,1; bonus3 bAutoSpell,20,3,25; }
+1168,Zweihander,Zweihander,4,20,,2200,200,,1,0,16514,2,34,4,48,3,{},{bonus bUnbreakable,100; },,,,,,
+1169,Executioner_,Executioner,4,20,,2200,155,,1,0,16514,2,34,4,48,3,{},{ bonus bIgnoreDefRace,7; bonus2 bAddRace,7,20; bonus2 bSubRace,7,-10; bonus bAtkEle,7; }
+1170,Katzbalger,Katzbalger,4,20,,2000,175,,1,0,16514,2,34,4,48,3,{},{ bonus bVit,10; bonus bDef,10; },,,,
+// Knifes and Daggers
+1201,Knife,Knife,4,50,,400,17,,1,3,10444527,2,2,1,1,1,{},{},,,,,,
+1202,Knife_,Knife,4,50,,400,17,,1,4,10444527,2,2,1,1,1,{},{},,,,,,
+1203,Knife__,Knife,4,50,,400,17,,1,0,10444527,2,2,1,1,1,{},{},,,,,,
+1204,Cutter,Cutter,4,1250,,500,30,,1,3,10444527,2,2,1,1,1,{},{}
+1205,Cutter_,Cutter,4,1250,,500,30,,1,4,10444527,2,2,1,1,1,{},{}
+1206,Cutter__,Cutter,4,1250,,500,30,,1,0,10444527,2,2,1,1,1,{},{}
+1207,Main_Gauche,Main Gauche,4,2400,,600,43,,1,3,10444527,2,2,1,1,1,{},{}
+1208,Main_Gauche_,Main Gauche,4,2400,,600,43,,1,4,10444527,2,2,1,1,1,{},{}
+1209,Main_Gauche__,Main Gauche,4,2400,,600,43,,1,0,10444527,2,2,1,1,1,{},{}
+1210,Dirk,Dirk,4,8500,,500,59,,1,2,10444527,2,2,2,12,1,{},{}
+1211,Dirk_,Dirk,4,8500,,500,59,,1,3,10444527,2,2,2,12,1,{},{}
+1212,Dirk__,Dirk,4,8500,,500,59,,1,0,10444527,2,2,2,12,1,{},{}
+1213,Dagger,Dagger,4,14000,,600,73,,1,2,10444527,2,2,2,12,1,{},{}
+1214,Dagger_,Dagger,4,14000,,600,73,,1,3,10444527,2,2,2,12,1,{},{}
+1215,Dagger__,Dagger,4,14000,,600,73,,1,0,10444527,2,2,2,12,1,{},{}
+1216,Stiletto,Stiletto,4,19500,,700,87,,1,2,10444527,2,2,2,12,1,{},{}
+1217,Stiletto_,Stiletto,4,19500,,700,87,,1,3,10444527,2,2,2,12,1,{},{}
+1218,Stiletto__,Stiletto,4,19500,,700,87,,1,0,10444527,2,2,2,12,1,{},{}
+1219,Gladius,Gladius,4,43000,,700,105,,1,2,2055918,2,2,3,24,1,{},{}
+1220,Gladius_,Gladius,4,43000,,700,105,,1,3,2055918,2,2,3,24,1,{},{},,,,,,
+1221,Gladius__,Gladius,4,43000,,700,105,,1,0,2055918,2,2,3,24,1,{},{},,,,,,
+1222,Damascus,Damascus,4,49000,,800,118,,1,1,2055918,2,2,3,24,1,{},{},,,,,,
+1223,Fortune_Sword,Fortune Sword,4,20,,500,90,,1,0,2055918,2,2,4,24,1,{},{ bonus bLuk,5; bonus bFlee2,20; },,,,
+1224,Sword_Breaker,Swordbreaker,4,20,,1000,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bBreakWeaponRate,100; },,,,,,
+1225,Mail_Breaker,Mailbreaker,4,20,,1000,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bBreakArmorRate,100; },,,,,,
+1226,Damascus_,Damascus,4,49000,,800,118,,1,2,2055918,2,2,3,24,1,{},{},,,,,,
+1227,Weeder_Knife,Weeder Knife,4,20,,400,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,3; bonus2 bAddRace,3,15; bonus2 bSubRace,3,15; },
+1228,Combat_Knife,Combat Knife,4,20,,400,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,7; bonus2 bSubRace,7,10; bonus2 bSubRace,6,-10; },
+1229,Mama's_Knife,Mama's Knife,4,20,,500,75,,1,0,2055918,2,2,4,36,1,{},{ bonus bCritical,30; bonus2 bAddRace,7,3; bonus3 bAddMonsterDropItem,517,2,5000; }
+1230,House_Auger,House Auger,4,20,,600,80,,1,0,2055918,2,2,4,36,1,{},{ bonus bDefRatioAtkRace,10; bonus bDefRatioAtkRace,11; },,,,
+1231,Bazerald,Bazerald,4,20,,500,70,,1,0,2055918,2,2,4,36,1,{},{ bonus bAtkEle,3; bonus bInt,5; bonus bMatkRate,10; },,,
+1232,Assassin_Dagger,Assasin Dagger,4,20,,600,140,,1,0,4096,2,2,4,36,1,{},{ bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdAddRate,2; bonus bAtkEle,7; },,
+1233,Exercise,Excorcise,4,20,,700,90,,1,0,2055918,2,2,4,36,1,{},{ bonus bIgnoreDefRace,6; bonus2 bSubRace,6,5; bonus2 bSubRace,7,-10; },
+1234,Moonlight_Sword,Walgwanggum,4,20,,700,50,,1,0,2055918,2,2,4,36,1,{},{ bonus bMaxSPrate,10; bonus2 bSPDrainRate,100,3; },,,,,
+1235,Azoth,Azoth,4,20,,700,110,,1,0,262144,2,2,4,36,1,{},{},,,,,,
+1236,Sucsamad,Sucsamad,4,20,,800,140,,1,0,2055918,2,2,4,36,1,{},{ bonus2 bAddEle,2,10; bonus2 bAddEle,4,10; bonus bUnbreakable,100; },,
+1237,Grimtooth_,Grimtooth,4,20,,800,180,,1,0,2055918,2,2,4,36,1,{},{ bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50; },,
+1238,Zeny_Knife,Zeny Knife,4,20,,1200,64,,1,0,2055918,2,2,3,40,1,{},{ bonus bGetZenyNum,100; },,,,,
+1239,Poison_Knife,Poison Knife,4,20,,800,64,,1,0,2055918,2,2,3,65,1,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,2000; },,,,,
+1240,Princess_Knife,Princess Knife,4,20,,400,84,,1,0,2055918,2,2,4,1,1,{},{ bonus bStr,1; bonus bAgi,1; bonus bVit,1; bonus bInt,1; bonus bDex,1; bonus bLuk,1; }
+1241,Cursed_Dagger,Cursed Dagger,4,20,,400,55,,1,0,66052,2,2,4,85,1,{},{ bonus2 bAddEff,Eff_Curse,500; },,,,
+1242,Counter_Dagger,Counter Dagger,4,20,,550,75,,1,0,66052,2,2,4,55,1,{},{ bonus bCritical,5; bonus3 bAutoSpell,61,1,25; },,,,,
+1243,Main_Gauche_For_Novice,Novice Main Gauche,4,20,,1,45,,1,0,8388609,2,2,1,1,1,{},{},,,,,,
+// Katars
+1250,Jur,Jur,4,19500,,800,125,,1,2,4096,2,34,2,18,16,{},{},,,,,,
+1251,Jur_,Jur,4,19500,,800,125,,1,3,4096,2,34,2,18,16,{},{},,,,,,
+1252,Katar,Katar,4,41000,,1200,148,,1,1,4096,2,34,3,33,16,{},{ bonus bDex,1; },,,,,
+1253,Katar_,Katar,4,41000,,1200,148,,1,2,4096,2,34,3,33,16,{},{ bonus bDex,1; },,,,,
+1254,Jamadhar,Jamadhar,4,37200,,1500,165,,1,0,4096,2,34,3,33,16,{},{},,,,,,
+1255,Jamadhar_,Jamadhar,4,37200,,1500,165,,1,1,4096,2,34,3,33,16,{},{},,,,,,
+1256,Katar_of_Cold_Icicle,Katar of Cold Icicle,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500; },,,
+1257,Katar_of_Thornbush,Katar of Dusty Thornbush,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,2; bonus2 bAddEff,Eff_Blind,500; },,
+1258,Katar_of_Raging_Blaze,Katar of Raging Blaze,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,3; bonus2 bAddEff,Eff_Silence,500; },,
+1259,Katar_of_Piercing_Wind,Katar of Piercing Wind,4,45000,,1200,105,,1,0,4096,2,34,3,55,16,{},{ bonus bAtkEle,4; bonus2 bAddEff,Eff_Sleep,500; },,
+1260,Sharpened_Legbone_of_Ghoul,Sharpened Legbone of Ghoul,4,52500,,1700,150,,1,0,4096,2,34,3,65,16,{},{ bonus bAtkEle,9; },,,,
+1261,Infiltrator,Infiltrator,4,57000,,1500,140,,1,0,4096,2,34,4,75,16,{},{ bonus2 bAddRace,7,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; }
+// Axes
+1301,Axe,Axe,4,500,,800,38,,1,3,8803555,2,2,1,3,6,{},{},,,,,
+1302,Axe_,Axe,4,500,,800,38,,1,4,8803555,2,2,1,3,6,{},{},,,,,
+1303,Axe__,Axe,4,500,,800,38,,1,0,8803555,2,2,1,3,6,{},{},,,,,
+1304,Orcish_Axe,Orcish Axe,4,20,,1500,75,,1,0,8803555,2,2,3,3,6,{},{},,,,,
+1305,Cleaver,Cleaver,4,20,,1200,140,,1,0,279714,2,2,4,44,6,{},{ bonus2 bAddRace,7,5; bonus3 bAddMonsterDropItem,517,2,3000; }
+1306,War_Axe,War Axe,4,20,,4200,145,,1,1,263168,2,2,3,76,6,{},{ bonus bDex,2; bonus bLuk,2; },,,
+1351,Battle_Axe,Battle Axe,4,5400,,1500,80,,1,3,279714,2,34,1,3,7,{},{},,,,,
+1352,Battle_Axe_,Battle Axe,4,5400,,1500,80,,1,4,279714,2,34,1,3,7,{},{},,,,,
+1353,Battle_Axe__,Battle Axe,4,5400,,1500,80,,1,0,279714,2,34,1,3,7,{},{},,,,,
+1354,Hammer,Hammer,4,15500,,2000,120,,1,2,279714,2,34,2,16,7,{},{},,,,
+1355,Hammer_,Hammer,4,15500,,2000,120,,1,3,279714,2,34,2,16,7,{},{},,,,
+1356,Hammer__,Hammer,4,15500,,2200,120,,1,0,279714,2,34,2,16,7,{},{},,,,
+1357,Buster,Buster,4,34000,,2200,155,,1,1,279714,2,34,3,30,7,{},{},,,,
+1358,Buster_,Buster,4,34000,,2200,155,,1,2,279714,2,34,3,30,7,{},{},,,,
+1359,Buster__,Buster,4,34000,,2200,155,,1,0,279714,2,34,3,30,7,{},{},,,,
+1360,Two_handed_Axe,Two-handed Axe,4,55000,,2500,185,,1,1,279714,2,34,3,30,7,{},{},,,,
+1361,Two_handed_Axe_,Two-handed Axe,4,55000,,2500,185,,1,2,279714,2,34,3,30,7,{},{},,,,
+1362,Two_handed_Axe__,Two-handed Axe,4,55000,,2500,185,,1,0,279714,2,34,3,30,7,{},{},,,,
+1363,Blood_Axe,Bloody Axe,4,20,,400,170,,1,0,279714,2,34,4,44,7,{},{ bonus bStr,10; bonus bSpeedRate,25; },,
+1364,Great_Axe,Great Axe,4,20,,1800,187,,1,0,279714,2,34,4,44,7,{},{ bonus2 bAddEff,Eff_Stan,1500; },,
+1365,Sabbath,Sabbath,4,20,,2300,120,,1,0,279714,2,34,4,44,7,{},{ bonus2 bWeaponComaRace,6,50; bonus bAtkEle,7; },
+1366,Light_Epsilon,Light Epsilon,4,20,,2300,180,,1,0,279714,2,34,4,44,7,{},{ bonus bAtkEle,6; skill 28,3; bonus2 bAddRace,6,3; }
+1367,Slaughter,Slaughter,4,20,,2500,120,,1,0,279714,2,34,4,44,7,{},{ bonus bIgnoreDefRace,2; bonus2 bWeaponComaRace,2,50; },
+1368,Tomahawk,Tomahawk,4,20,,2500,165,,1,0,279714,2,34,4,44,7,{},{ bonus bAtkEle,4; },,,
+1369,Guillotine,Guillotine,4,20,,3000,215,,1,0,279714,2,34,4,44,7,{},{ bonus2 bWeaponComaRace,7,30; bonus2 bSPDrainRate,500,2; },,
+// Spears
+1401,Javelin,Javelin,4,150,,700,28,,3,3,16514,2,2,1,4,4,{},{},,,
+1402,Javelin_,Javelin,4,150,,700,28,,3,4,16514,2,2,1,4,4,{},{},,,
+1403,Javelin__,Javelin,4,150,,700,28,,3,0,16514,2,2,1,4,4,{},{},,,
+1404,Spear,Spear,4,1700,,850,44,,3,3,16514,2,2,1,4,4,{},{},,,
+1405,Spear_,Spear,4,1700,,850,44,,3,4,16514,2,2,1,4,4,{},{},,,
+1406,Spear__,Spear,4,1700,,850,44,,3,0,16514,2,2,1,4,4,{},{},,,
+1407,Pike,Pike,4,3450,,1000,60,,3,3,16514,2,2,1,4,4,{},{},,,
+1408,Pike_,Pike,4,3450,,1000,60,,3,4,16514,2,2,1,4,4,{},{},,,
+1409,Pike__,Pike,4,3450,,1000,60,,3,0,16514,2,2,1,4,4,{},{},,,
+1410,Lance,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
+1411,Lance_,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
+1412,Lance__,Lance,4,60000,,2500,185,,3,0,16514,2,34,3,33,5,{},{},,,
+1413,Gungnir,Gungnir,4,20,,500,120,,3,0,16514,2,2,4,4,4,{},{ bonus bAtkEle,4; bonus bPerfectHitRate,25; bonus bHit,30; }
+1414,Gelerdria,Gelerdria,4,20,,700,145,,3,0,16514,2,2,4,48,4,{},{ bonus bAtkEle,2; bonus bMaxHP,500; bonus bMaxSP,-50; }
+1415,Skewer,Brocca,4,20,,850,100,,3,0,16514,2,2,4,48,4,{},{ bonus bIgnoreDefRace,11; bonus2 bAddEle,0,25; }
+1416,Tjungkuletti,Tjungkuletti,4,20,,1000,95,,3,0,16514,2,2,4,48,4,{},{ bonus2 bSPDrainRate,10000,1; bonus2 bSPDrainRate,100,5; },,,
+1417,Pole_Axe,Pole Axe,4,20,,3800,160,,3,1,16514,2,2,3,71,4,{},{ bonus bStr,1; bonus bInt,2; bonus bDex,1; }
+1451,Guisarme,Guisarme,4,13000,,1000,84,,3,2,16514,2,34,2,18,5,{},{},,,
+1452,Guisarme_,Guisarme,4,13000,,1000,84,,3,3,16514,2,34,2,18,5,{},{},,,
+1453,Guisarme__,Guisarme,4,13000,,1000,84,,3,0,16514,2,34,2,18,5,{},{},,,
+1454,Glaive,Glaive,4,20000,,1200,104,,3,2,16514,2,34,2,18,5,{},{},,,
+1455,Glaive_,Glaive,4,20000,,1200,104,,3,3,16514,2,34,2,18,5,{},{},,,
+1456,Glaive__,Glaive,4,20000,,1200,104,,3,0,16514,2,34,2,18,5,{},{},,,
+1457,Partizan,Partizan,4,27000,,2000,124,,3,1,16514,2,34,2,18,5,{},{},,,
+1458,Partizan_,Partizan,4,27000,,2000,124,,3,2,16514,2,34,2,18,5,{},{},,,
+1459,Partizan__,Partizan,4,27000,,2000,124,,3,0,16514,2,34,3,33,5,{},{},,,
+1460,Trident,Trident,4,51000,,1200,150,,3,2,16514,2,34,3,33,5,{},{},,,
+1461,Trident_,Trident,4,51000,,1200,150,,3,3,16514,2,34,3,33,5,{},{},,,
+1462,Trident__,Trident,4,51000,,1200,150,,3,0,16514,2,34,3,33,5,{},{},,,
+1463,Halberd,Halberd,4,54000,,2500,165,,3,1,16514,2,34,3,33,5,{},{},,,
+1464,Halberd_,Halberd,4,54000,,2500,165,,3,2,16514,2,34,3,33,5,{},{},,,,,,,
+1465,Halberd__,Halberd,4,54000,,2500,165,,3,0,16514,2,34,3,33,5,{},{},,,,,,,
+1466,Crescent_Scythe,Crescent Scythe,4,20,,2500,180,,3,0,16514,2,34,4,48,5,{},{ bonus bCritical,30; bonus bHit,10; },,,,,
+1467,Bill_Guisarme,Bill Guisarme,4,20,,1000,183,,3,0,16514,2,34,4,48,5,{},{ bonus2 bAddRace,2,10; bonus2 bAddRace,7,5; },,,
+1468,Zephyrus,Zephyrus,4,20,,2000,170,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,4; skill 21,3; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,25; }
+1469,Longinus's_Spear,Longinus's Spear,4,20,,2500,180,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,7; bonus2 bAddRace,7,10; bonus2 bAddRace,8,10; },,
+1470,Brionac,Brionac,4,20,,3000,190,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,6; skill 28,5; skill 13,3; bonus3 bAutoSpell,13,3,25; bonus2 bAddRace,10,5; },
+1471,Hellfire,Hellfire,4,20,,3500,200,,3,0,16514,2,34,4,48,5,{},{ bonus bAtkEle,3; skill 17,3; bonus3 bAutoSpell,17,3,25; bonus bStr,3; },,
+// 2 Handed Staffs
+1472,Staff_of_Soul,Soul Staff,4,20,,1400,25,,1,0,66052,2,34,3,73,10,{},{ bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15; },,,,
+1473,Wizardy_Staff,Wizardy Staff,4,20,,2400,120,,1,0,66052,2,34,4,90,10,{},{ bonus bInt,6; bonus bDex,2; bonus bMatkRate,15; },,,,
+// Clubs and Maces
+1501,Club,Club,4,120,,700,23,,1,3,8836595,2,2,1,2,8,{},{},,,,,,,
+1502,Club_,Club,4,120,,700,23,,1,4,8836595,2,2,1,2,8,{},{},,,,,,,
+1503,Club__,Club,4,120,,700,23,,1,0,8836595,2,2,1,2,8,{},{},,,,,,,
+1504,Mace,Mace,4,1600,,800,37,,1,3,8836595,2,2,1,2,8,{},{},,,,,,,
+1505,Mace_,Mace,4,1600,,800,37,,1,4,8836595,2,2,1,2,8,{},{},,,,,,,
+1506,Mace__,Mace,4,1600,,800,37,,1,0,8836595,2,2,1,2,8,{},{}
+1507,Smasher,Smasher,4,9000,,1000,54,,1,2,8836595,2,2,2,14,8,{},{}
+1508,Smasher_,Smasher,4,9000,,1000,54,,1,3,8836595,2,2,2,14,8,{},{}
+1509,Smasher__,Smasher,4,9000,,1000,54,,1,3,8836595,2,2,2,14,8,{},{}
+1510,Flail,Flail,4,16000,,900,69,,1,2,447986,2,2,2,14,8,{},{}
+1511,Flail_,Flail,4,16000,,900,69,,1,3,447986,2,2,2,14,8,{},{}
+1512,Flail__,Flail,4,16000,,900,69,,1,3,447986,2,2,2,14,8,{},{}
+1513,Morning_Star,Morning Star,4,41000,,1500,110,,1,1,447986,2,2,3,27,8,{},{}
+1514,Morning_Star_,Morning Star,4,41000,,1500,110,,1,2,447986,2,2,3,27,8,{},{}
+1515,Morning_Star__,Morning Star,4,41000,,1500,110,,1,2,447986,2,2,3,27,8,{},{}
+1516,Sword_Mace,Sword Mace,4,50000,,1200,130,,1,0,447986,2,2,3,27,8,{},{}
+1517,Sword_Mace_,Sword Mace,4,50000,,1200,130,,1,1,447986,2,2,3,27,8,{},{}
+1518,Sword_Mace__,Sword Mace,4,50000,,1200,130,,1,1,447986,2,2,3,27,8,{},{}
+1519,Chain,Chain,4,23000,,800,84,,1,2,447986,2,2,2,14,8,{},{}
+1520,Chain_,Chain,4,23000,,800,84,,1,3,447986,2,2,2,14,8,{},{}
+1521,Chain__,Chain,4,23000,,800,84,,1,3,447986,2,2,2,14,8,{},{}
+1522,Stunner,Stunner,4,60000,,2000,140,,1,0,33040,2,2,3,27,8,{},{ bonus2 bAddEff,Eff_Stan,1000; },,,,
+1523,Spike,Spike,4,20,,700,85,,1,0,33040,2,2,4,40,8,{},{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },,,
+1524,Golden_Mace,Golden Mace,4,20,,800,110,,1,1,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,10; bonus bUnbreakable,100; },,,,
+1525,Long_Mace,Long Mace,4,20,,800,135,,3,0,33040,2,2,4,40,8,{},{ bonus bLongAtkDef,10; },,,,,
+1526,Slash,Slash,4,20,,1000,145,,1,0,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,15; bonus2 bWeaponComaRace,1,50; },,
+1527,Quadrille,Quadrille,4,20,,900,165,,1,0,33040,2,2,4,40,8,{},{ bonus2 bAddRace,1,10; bonus2 bAddRace,7,10; bonus2 bAddEle,2,10; }
+1528,Grand_Cross,Grand Cross,4,20,,1500,140,,1,0,33040,2,2,4,40,8,{},{ bonus bAtkEle,6; skill 77,3; bonus3 bAutoSpell,77,3,25; bonus2 bHPDrainRate,1000,1; },
+1529,Iron_Driver,Iron Driver,4,20,,3000,155,,1,0,33024,2,2,3,78,8,{},{},,,,,,
+1530,Mjolnir,Mjolnir,4,20,,6000,250,,1,0,10477567,2,2,4,98,8,{},{ bonus bAtkEle,4; bonus bDex,40; bonus bStr,15; bonus bAspdRate,30; },,
+1531,Spanner,Spanner,4,20,,2500,115,,1,0,33040,2,2,3,55,8,{},{ bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Stan,100; bonus2 bAddEff,Eff_Poison,100; bonus2 bAddEff,Eff_Freeze,100; },,,,,,
+// Books
+1550,Book,Book,4,30000,,600,85,,1,3,65792,2,2,2,14,15,{},{},,,,,,
+1551,Bible,Bible,4,60000,,1000,115,,1,2,65792,2,2,3,27,15,{},{ bonus bInt,2; },,,,,
+1552,Tablet,Tablet,4,51000,,800,125,,1,1,65792,2,2,3,27,15,{},{},,,,,,
+1553,Book_of_Billows,Book of Billows,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,1; },,,,,
+1554,Book_of_Mother_Earth,Book of Mother Earth,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,2; },,,,,
+1555,Book_of_Blazing_Sun,Book of Blazing Sun,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,3; },,,,,,,,,,
+1556,Book_of_Gust_of_Wind,Book of Gust of Wind,4,35000,,750,90,,1,0,65792,2,2,3,27,15,{},{ bonus bAtkEle,4; },,,,,,,,,,
+1557,Book_of_the_Apocalypse,Book of the Apocalypse,4,35000,,800,120,,1,0,65792,2,2,4,40,15,{},{ bonus bAtkEle,7; bonus2 bSubEle,6,-5; bonus2 bAddEle,1,7; bonus2 bAddEle,2,7; bonus2 bAddEle,3,7; bonus2 bAddEle,4,7; }
+1558,Girl's_Diary,Girl's Diary,4,20,,300,60,,1,1,65792,2,2,4,40,15,{},{ bonus2 bAddDamageClass,1188,150; },,,,,,,,,
+1599,Angra_Manyu,Angra Manyu,4,120,,10,1,,1,5,10477567,2,2,4,2,8,{},{},,,,,,,,,,,
+// Rods and Staffs
+1601,Rod,Rod,4,50,,400,15,,1,3,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
+1602,Rod_,Rod,4,50,,400,15,,1,4,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
+1603,Rod__,Rod,4,50,,400,15,,1,0,8487701,2,2,1,1,10,{},{ bonus bMatkRate,15; },,,,,,,,,,
+1604,Wand,Wand,4,2500,,400,25,,1,2,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
+1605,Wand_,Wand,4,2500,,400,25,,1,3,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
+1606,Wand__,Wand,4,2500,,400,25,,1,0,8487701,2,2,2,12,10,{},{ bonus bInt,1; bonus bMatkRate,15; },,,,,,,,,
+1607,Staff,Staff,4,9500,,400,40,,1,2,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
+1608,Staff_,Staff,4,9500,,400,40,,1,3,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
+1609,Staff__,Staff,4,9500,,400,40,,1,0,99092,2,2,2,12,10,{},{ bonus bInt,2; bonus bMatkRate,15; },,,,,,,,,
+1610,Arc_Wand,Arc Wand,4,45000,,400,60,,1,1,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
+1611,Arc_Wand_,Arc Wand,4,45000,,400,60,,1,2,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
+1612,Arc_Wand__,Arc Wand,4,45000,,400,60,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
+1613,Mighty_Staff,Mighty Staff,4,20,,700,130,,1,0,99092,2,2,3,24,10,{},{ bonus bStr,10; bonus bMatkRate,15; bonus2 bSpDrainRate,10000,-2; },
+1614,Blessed_Wand,Wand of Occult,4,20,,700,75,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,3; bonus bMatkRate,15; },
+1615,Bone_Wand,Bone Wand,4,20,,700,40,,1,0,99092,2,2,3,24,10,{},{ bonus bInt,4; bonus bAtkEle,9; bonus bMatkRate,15; }
+// Bows
+1701,Bow,Bow,4,1000,,500,15,,5,3,1706056,2,34,1,4,11,{},{},,,
+1702,Bow_,Bow,4,1000,,500,15,,5,4,1706056,2,34,1,4,11,{},{},,,
+1703,Bow__,Bow,4,1000,,500,15,,5,0,1706056,2,34,1,4,11,{},{},,,
+1704,Composite_Bow,Composite Bow,4,2500,,600,29,,5,3,1706056,2,34,1,4,11,{},{},,,
+1705,Composite_Bow_,Composite Bow,4,2500,,600,29,,5,4,1706056,2,34,1,4,11,{},{},,,
+1706,Composite_Bow__,Composite Bow,4,2500,,600,29,,5,0,1706056,2,34,1,4,11,{},{},,,
+1707,Great_Bow,Great Bow,4,10000,,1000,50,,5,2,1706056,2,34,2,18,11,{},{},,,
+1708,Great_Bow_,Great Bow,4,10000,,1000,50,,5,3,1706056,2,34,2,18,11,{},{},,,
+1709,Great_Bow__,Great Bow,4,10000,,1000,50,,5,0,1706056,2,34,2,18,11,{},{},,,
+1710,CrossBow,Cross Bow,4,17000,,900,65,,5,2,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
+1711,CrossBow_,Cross Bow,4,17000,,900,65,,5,3,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
+1712,CrossBow__,Cross Bow,4,17000,,900,65,,5,0,1706056,2,34,2,18,11,{},{},,,,,,,,,,,,,,
+1713,Arbalest,Arbalest,4,48000,,1000,90,,5,1,1706056,2,34,3,33,11,{},{ bonus bDex,2; },,,,,,,,,,,,,
+1714,Gakkung,Gakkung,4,42000,,1100,100,,5,1,1706056,2,34,3,33,11,{},{},,,,,,,,,,,,,,
+1715,Arbalest_,Arbalest,4,48000,,1000,90,,5,2,1706056,2,34,3,33,11,{},{ bonus bDex,2; },,,,,,,,,,,,,
+1716,Gakkung_,Gakkung,4,42000,,1100,100,,5,2,1706056,2,34,3,33,11,{},{},,,,,,,,,,,,,,
+1718,Hunter_Bow,Hunter Bow,4,64000,,1500,125,,5,0,2048,2,34,3,33,11,{},{},,,,,,,,,,,,,,
+1719,Bow_of_Roguemaster,Roguemaster's Bow,4,20,,500,75,,11,0,64,2,34,4,48,11,{},{ bonus2 bAddStealRate,100,0; },,,,,,,,,,,,,,
+1720,Bow_of_Rudra,Rudra's Bow,4,20,,1200,150,,5,0,1705992,2,34,4,48,11,{},{ bonus bAtkEle,6; 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,Repeating_Crossbow,Repeating Crossbow,4,89000,,2000,95,,9,1,133184,2,34,3,65,11,{},{},,,,,,,,,,,,,,
+1722,Ballista,Ballista,4,20,,3500,145,,5,0,1574912,2,34,4,77,11,{},{},,,,,,,,,,,,,,
+// Arrows
+1750,Arrow,Arrow,10,1,,1,25,,,,1706056,2,32768,,1,,{},{},,,,,,,,,,,,,,
+1751,Silver_Arrow,Silver Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,6; },,,,,,,,,,,,,
+1752,Fire_Arrow,Fire Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,3; },,
+1753,Steel_Arrow,Steel Arrow,10,3,,2,40,,,,1706056,2,32768,,1,,{},{},,,
+1754,Crystal_Arrow,Crystal Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,1; },,
+1755,Arrow_of_Wind,Arrow of Wind,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,4; },,
+1756,Stone_Arrow,Stone Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,2; },,
+1757,Immaterial_Arrow,Immaterial Arrow,10,3,,1,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,8; },,
+1758,Stun_Arrow,Stun Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Stan,500; },
+1759,Freezing_Arrow,Freeze Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500; }
+1760,Flash_Arrow,Flash Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Blind,500; },
+1761,Curse_Arrow,Curse Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Curse,500; },
+1762,Rusty_Arrow,Rusted Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,5; },,
+1763,Poison_Arrow,Poison Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,500; }
+1764,Incisive_Arrow,Sharp Arrow,10,3,,3,10,,,,1706056,2,32768,,1,,{},{ bonus bCritical,10; },,
+1765,Oridecon_Arrow,Oridecon Arrow,10,3,,3,50,,,,1706056,2,32768,,1,,{},{},,,
+1766,Arrow_of_Counter_Evil,Arrow of Counter Evil,10,40,,3,50,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,6; },,
+1767,Arrow_of_Shadow,Shadow Arrow,10,3,,2,30,,,,1706056,2,32768,,1,,{},{ bonus bAtkEle,7; },,
+1768,Sleep_Arrow,Sleep Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Sleep,500; }
+1769,Silence_Arrow,Mute Arrow,10,3,,3,1,,,,1706056,2,32768,,1,,{},{ bonus2 bAddEff,Eff_Silence,500; }
+1770,Iron_Arrow,Iron Arrow,10,2,,1,30,,,,1706056,2,32768,,1,,{},{},,
+// Knuckles
+1801,Waghnakh,Waghnakh,4,8000,,400,30,,1,3,33024,2,2,1,1,12,{},{},,
+1802,Waghnakh_,Waghnakh,4,8000,,400,30,,1,4,33024,2,2,1,1,12,{},{},,
+1803,Knuckle_Duster,Knuckle Duster,4,25000,,450,50,,1,2,33024,2,2,2,12,12,{},{},,
+1804,Knuckle_Duster_,Knuckle Duster,4,25000,,450,50,,1,3,33024,2,2,2,12,12,{},{},,
+1805,Hora,Hora,4,32000,,450,65,,1,2,33024,2,2,2,12,12,{},{},,
+1806,Hora_,Hora,4,32000,,450,65,,1,3,33024,2,2,2,12,12,{},{},,
+1807,Fist,Fist,4,53000,,650,115,,1,0,33024,2,2,3,24,12,{},{},,
+1808,Fist_,Fist,4,53000,,650,115,,1,1,33024,2,2,3,24,12,{},{},,
+1809,Claw,Claw,4,55000,,500,86,,1,1,33024,2,2,3,24,12,{},{ bonus bStr,2; },
+1810,Claw_,Claw,4,55000,,500,86,,1,2,33024,2,2,3,24,12,{},{ bonus bStr,2; },
+1811,Finger,Finger,4,58000,,500,97,,1,1,33024,2,2,3,24,12,{},{},,
+1812,Finger_,Finger,4,58000,,500,97,,1,2,33024,2,2,3,24,12,{},{},,
+1813,Kaiser_Knuckle,Kaiser Knuckle,4,20,,450,110,,1,0,33024,2,2,4,36,12,{},{ bonus bAtkEle,4; bonus2 bAddRace,1,5; bonus2 bAddEle,1,10; bonus2 bAddEle,2,10; bonus2 bAddEle,3,10; bonus2 bAddEle,4,10; }
+1814,Berserk,Berserk,4,20,,500,120,,1,0,33024,2,2,4,36,12,{},{ bonus bAspdRate,12; },,,,,,,,,,
+// Instruments
+1901,Violin,Violin,4,4000,,700,50,,1,3,524288,2,2,1,2,13,{},{},,,,,,,,,,,
+1902,Violin_,Violin,4,4000,,700,50,,1,4,524288,2,2,1,2,13,{},{},,,,,,,,,,,
+1903,Mandolin,Mandolin,4,18000,,400,90,,1,2,524288,2,2,2,14,13,{},{},,,,,,,,,,,
+1904,Mandolin_,Mandolin,4,18000,,400,90,,1,3,524288,2,2,2,14,13,{},{},,,,,,,,,,,
+1905,Lute,Lute,4,24500,,500,105,,1,2,524288,2,2,2,14,13,{},{},,,,,,,,,,,
+1906,Lute_,Lute,4,24500,,500,105,,1,3,524288,2,2,2,14,13,{},{},,,,,,,,,,,
+1907,Guitar,Guitar,4,47000,,900,142,,1,0,524288,2,2,3,27,13,{},{},,,,,,,,,,,
+1908,Guitar_,Guitar,4,47000,,900,142,,1,1,524288,2,2,3,27,13,{},{},,,,,,,,,,,
+1909,Harp,Harp,4,62000,,900,114,,1,1,524288,2,2,3,27,13,{},{ bonus bInt,2; },,,,,,,,,,
+1910,Harp_,Harp,4,62000,,900,114,,1,2,524288,2,2,3,27,13,{},{ bonus bInt,2; },,,,,,,,,,
+1911,Guh_Moon_Goh,Guhmoongoh,4,54000,,1300,126,,1,1,524288,2,2,3,27,13,{},{},,,,,,,,,,,
+1912,Guh_Moon_Goh_,Guhmoongoh,4,54000,,1300,126,,1,2,524288,2,2,3,27,13,{},{},,,,,,,,,,,
+1913,Electric_Guitar,Electric Guitar,4,20,,1800,110,,1,0,524288,2,2,4,70,13,{},{ bonus3 bAutoSpell,84,1,25; bonus bAtkEle,4; bonus bInt,2; bonus bAgi,1; }
+// Whips
+1950,Rope,Rope,4,2500,,400,45,,2,3,1048576,2,2,1,3,14,{},{},,,
+1951,Rope_,Rope,4,2500,,400,45,,2,4,1048576,2,2,1,3,14,{},{},,,
+1952,Line,Line,4,12000,,300,80,,2,2,1048576,2,2,2,16,14,{},{},,,
+1953,Line_,Line,4,12000,,300,80,,2,3,1048576,2,2,2,16,14,{},{},,,
+1954,Wire,Wire,4,17500,,1000,95,,2,2,1048576,2,2,2,16,14,{},{},,,
+1955,Wire_,Wire,4,17500,,1000,95,,2,3,1048576,2,2,2,16,14,{},{},,,
+1956,Rante_Whip,Rante Whip,4,32000,,900,135,,2,0,1048576,2,2,3,30,14,{},{},,,
+1957,Rante_Whip_,Rante Whip,4,32000,,900,135,,2,1,1048576,2,2,3,30,14,{},{},,,
+1958,Tail,Tail,4,41000,,700,105,,2,1,1048576,2,2,3,30,14,{},{ bonus bLuk,3; },,
+1959,Tail_,Tail,4,41000,,700,105,,2,2,1048576,2,2,3,30,14,{},{ bonus bLuk,3; },,
+1960,Whip,Whip,4,38000,,700,120,,2,1,1048576,2,2,3,30,14,{},{},,,
+1961,Whip_,Whip,4,38000,,700,120,,2,2,1048576,2,2,3,30,14,{},{},,,
+1962,Lariat,Lariat,4,20,,400,100,,2,0,1048576,2,2,4,44,14,{},{ bonus bDex,5; bonus bAgi,1; },
+1963,Rapture_Rose,Rapture Rose,4,20,,300,115,,2,0,1048576,2,2,4,44,14,{},{ bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,5000; }
+1964,Chemeti,Chemeti,4,20,,700,135,,2,0,1048576,2,2,4,44,14,{},{ bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2; }
+
+1998,Jeramiah's_Jur,Jeramiah's Jur,3,20,,10,,,,,,,,,,,{},{}
+1999,Zed's_Staff,Zed's Staff,3,20,,10,,,,,,,,,,,{},{}
+
+// Shields
+//===================================================================
+2101,Guard,Guard,5,500,,300,,3,,0,10477567,2,32,,0,1,{},{},,,
+2102,Guard_,Guard,5,500,,300,,3,,1,10477567,2,32,,0,1,{},{},,,
+2103,Buckler,Buckler,5,14000,,600,,4,,0,2020850,2,32,,0,2,{},{},,,
+2104,Buckler_,Buckler,5,14000,,600,,4,,1,2020850,2,32,,0,2,{},{},,,
+2105,Shield,Shield,5,56000,,1300,,6,,0,16514,2,32,,0,3,{},{},,,
+2106,Shield_,Shield,5,56000,,1300,,6,,1,16514,2,32,,0,3,{},{},,,
+2107,Mirror_Shield,Mirror Shield,5,60000,,1000,,4,,0,16514,2,32,,0,4,{},{ bonus bMdef,5; },,
+2108,Mirror_Shield_,Mirror Shield,5,60000,,1000,,4,,1,16514,2,32,,0,4,{},{ bonus bMdef,5; },,
+2109,Memorize_Book,Book of Summoning,5,20,,1000,,3,,0,66052,2,32,,0,,{},{ bonus bInt,1; bonus bMdef,2; },
+2110,Holy_Guard,Holy Guard,5,20,,1400,,5,,0,16384,2,32,,68,3,{},{ bonus bVit,2; bonus bMdef,2; },
+2111,Evangelist,Evangelist,5,20,,1400,,5,,0,16384,2,32,,83,3,{},{ bonus bVit,3; bonus bInt,2; bonus bMdef,3; bonus bUnbreakable,100; }
+2112,Novice_Guard,Novice Guard,5,20,,1,,3,,0,8388609,2,32,,0,1,{},{},,,
+2199,Ahura_Mazda,Ahura Mazda,5,20,,100,,,,0,10477567,2,32,,,,{},{ bonus bMdef,150; bonus bDef,150; bonus bFlee2,100; bonus2 bSubEle,0,100; }
+
+// Headgear items
+//===================================================================
+2201,Sunglasses,Sunglasses,5,5000,,100,,0,,0,10477567,2,512,,0,12,{},{ bonus2 bResEff,Eff_Blind,500; },
+2202,Sunglasses_,Sunglasses,5,5000,,100,,0,,1,10477567,2,512,,0,12,{},{ bonus2 bResEff,Eff_Blind,500; }
+2203,Glasses,Glasses,5,4000,,100,,0,,0,10477567,2,512,,0,3,{},{},,
+2204,Glasses_,Glasses,5,4000,,100,,0,,1,10477567,2,512,,0,3,{},{},,
+2205,Diver's_Goggles,Diver Goggles,5,3500,,100,,0,,0,10477567,2,512,,0,10,{},{},,
+2206,Wedding_Veil,Wedding Veil,5,23000,,100,,0,,0,10477567,0,256,,0,44,{},{ bonus bMdef,5; },
+2207,Fancy_Flower,Fancy Flower,5,20,,100,,0,,0,10477567,2,256,,0,4,{},{ bonus2 bSubRace,3,10; }
+2208,Ribbon,Ribbon,5,800,,100,,1,,0,10477567,2,256,,0,17,{},{ bonus bMdef,3; },
+2209,Ribbon_,Ribbon,5,800,,100,,1,,1,10477567,2,256,,0,17,{},{ bonus bMdef,3; },
+2210,Hair_Band,Hair Band,5,500,,100,,1,,0,10477567,2,256,,0,9,{},{},,
+2211,Bandana,Bandana,5,400,,100,,1,,0,10477567,2,256,,0,6,{},{},,
+2212,Eye_Bandage,Eye Patch,5,1000,,100,,0,,0,10477567,2,512,,0,13,{},{},,
+2213,Kitty_Band,Kitty Band,5,20,,100,,2,,0,10477567,2,256,,0,2,{},{},,
+2214,Bunny_Band,Bunny Band,5,20,,100,,2,,0,10477567,2,256,,0,15,{},{ bonus bLuk,2; },
+2215,Flower_Hairband,Flower Band,5,20,,100,,2,,0,10477567,2,256,,0,5,{},{},,
+2216,Biretta,Biretta,5,9000,,100,,4,,0,33040,2,256,,0,11,{},{},,
+2217,Biretta_,Biretta,5,9000,,100,,4,,1,33040,2,256,,0,11,{},{},,
+2218,Flu_Mask,Flu Mask,5,300,,100,,0,,0,10477567,2,1,,0,8,{},{ bonus2 bResEff,Eff_Silence,1000; }
+2219,Flu_Mask_,Flu Mask,5,300,,100,,0,,1,10477567,2,1,,0,8,{},{ bonus2 bResEff,Eff_Silence,1000; }
+2220,Hat,Hat,5,1000,,200,,2,,0,10477567,2,256,,0,16,{},{},,
+2221,Hat_,Hat,5,1000,,200,,2,,1,10477567,2,256,,0,16,{},{},,
+2222,Turban,Turban,5,4500,,300,,3,,0,2088958,2,256,,0,7,{},{},,
+2223,Turban_,Turban,5,4500,,300,,3,,1,2088958,2,256,,0,7,{},{},,
+2224,Goggles,Goggles,5,10000,,300,,5,,0,1989866,2,768,,0,1,{},{},,
+2225,Goggles_,Goggles,5,10000,,300,,5,,1,1989866,2,768,,0,1,{},{},,
+2226,Cap,Cap,5,12000,,400,,4,,0,1989866,2,256,,0,14,{},{},,
+2227,Cap_,Cap,5,12000,,400,,4,,1,1989866,2,256,,0,14,{},{},,
+2228,Helm,Helm,5,44000,,600,,6,,0,16514,2,256,,0,40,{},{},,
+2229,Helm_,Helm,5,44000,,600,,6,,1,16514,2,256,,0,40,{},{},,
+2230,Gemmed_Sallet,Gemmed Sallet,5,50000,,500,,4,,0,414946,2,256,,0,0,{},{ bonus bMdef,3; },
+2231,Gemmed_Sallet_,Gemmed Sallet,5,50000,,500,,4,,1,414946,2,256,,0,0,{},{ bonus bMdef,3; },
+2232,Circlet,Circlet,5,7500,,300,,3,,0,99092,2,256,,0,18,{},{ bonus bMdef,3; },
+2233,Circlet_,Circlet,5,7500,,300,,3,,1,99092,2,256,,0,18,{},{ bonus bMdef,3; },
+2234,Tiara,Tiara,5,20,,400,,4,,0,2088958,0,256,,45,19,{},{ bonus bInt,2; },
+2235,Crown,Crown,5,20,,400,,4,,0,2088958,1,256,,45,45,{},{ bonus bInt,2; },
+2236,Santa's_Hat,Santa's Hat,5,20,,100,,1,,0,10477567,2,256,,0,20,{},{ bonus bMdef,1; bonus bLuk,1; }
+2237,Bandit_Beard,Bandit Beard,5,2,,100,,0,,0,10477567,2,1,,0,21,{},{},,
+2238,Moustache,Moustache,5,2,,100,,0,,0,10477567,2,1,,0,22,{},{},,
+2239,Single_Glass,Single Glass,5,10000,,100,,0,,0,10477567,2,512,,0,23,{},{},,
+2240,Beard,Beard,5,2,,100,,0,,0,10477567,2,1,,0,24,{},{},,
+2241,Granpa_Beard,Granpa Beard,5,5000,,100,,0,,0,10477567,2,1,,0,25,{},{},,
+2242,Purple_Sunglasses,Purple Glasses,5,24000,,100,,1,,0,10477567,2,512,,0,26,{},{ bonus2 bResEff,Eff_Blind,1000; }
+2243,Geek_Glasses,Geek Glasses,5,20000,,100,,1,,0,10477567,2,512,,0,27,{},{ bonus2 bResEff,Eff_Blind,1500; }
+2244,Big_Ribbon,Big Ribbon,5,15000,,200,,2,,0,2088958,2,256,,0,28,{},{ bonus bMdef,3; },
+2245,Sweet_Gent,Sweet Gent,5,15000,,400,,3,,0,2088958,2,256,,0,29,{},{},,
+2246,Golden_Gear,Golden Gear,5,20,,900,,5,,0,2088958,2,256,,40,30,{},{},,
+2247,Romantic_Gent,Romantic Gent,5,15000,,400,,3,,0,2088958,2,256,,0,31,{},{},,
+2248,Western_Grace,Western Grace,5,15000,,400,,3,,0,2088958,2,256,,0,32,{},{},,
+2249,Coronet,Coronet,5,20,,300,,3,,0,2088958,2,256,,0,33,{},{ bonus bInt,1; },
+2250,Fillet,Cute Ribbon,5,500,,100,,1,,0,2088958,2,256,,0,34,{},{ bonus bMaxSP,20; },,,,
+2251,Holy_Bonnet,Monk Hat,5,30000,,100,,5,,0,33040,2,256,,0,35,{},{ bonus bMdef,3; },,,,
+2252,Wizard_Hat,Wizard Hat,5,20,,300,,4,,0,66052,2,256,,0,36,{},{ bonus bMaxSP,100; },,,,
+2253,Sunflower,Sunflower,5,20,,100,,1,,0,10477567,2,256,,0,37,{},{ bonus2 bSubRace,4,10; },,,
+2254,Angel_Wing,Angel Wing,5,20,,100,,2,,0,2088958,2,256,,0,38,{},{ bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,6,3; }
+2255,Evil_Wing,Evil Wing,5,20,,100,,3,,0,2088958,2,256,,0,39,{},{ bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,8,3; },
+2256,Majestic_Goat,Majestic Goat,5,20,,800,,5,,0,279714,2,256,,0,41,{},{ bonus bStr,1; },,,,
+2257,Snow_Horn,Snow Horn,5,20,,100,,2,,0,10477567,2,256,,0,42,{},{},,,,,
+2258,Spiky_Band,Spiky Band,5,20,,1000,,6,,0,447986,2,256,,50,43,{},{},,,,,
+2259,Mini_Propeller,Mini Propeller,5,20,,100,,1,,0,10477567,2,256,,0,46,{},{},,,,,
+2260,Mini_Glasses,Mini Glasses,5,28000,,100,,1,,0,2088958,2,512,,0,47,{},{},,,,,
+2261,Army_Cap,Army Cap,5,20,,400,,4,,0,414946,2,256,,0,48,{},{},,,,,
+2262,Pierrot_Nose,Pierrot Nose,5,20,,100,,0,,0,10477567,2,1,,0,49,{},{},,,,,
+2263,Zorro_Masque,Zorro Masque,5,20,,100,,0,,0,2088958,2,512,,0,50,{},{},,,,,
+2264,Munak_Hat,Munak Hat,5,20,,300,,5,,0,10477567,2,769,,0,51,{},{ bonus2 bSubRace,1,10; },,,
+2265,Gangster_Mask,Gangster Mask,5,20,,100,,0,,0,10477567,2,1,,0,52,{},{ bonus2 bResEff,Eff_Silence,1500; },,,
+2266,Iron_Cain,Iron Cain,5,20,,300,,1,,0,16514,2,1,,50,53,{},{},,,
+2267,Cigar,Cigar,5,20,,100,,0,,0,2088958,2,1,,0,54,{},{ bonus2 bSubRace,4,3; },
+2268,Pipe,Pipe,5,20,,100,,0,,0,2088958,2,1,,0,55,{},{ bonus2 bSubRace,4,3; },
+2269,Centimental_Flower,Romantic Flower,5,20,,100,,0,,0,2088958,2,1,,0,56,{},{ bonus2 bSubRace,3,3; },
+2270,Centimental_Leaf,Romantic Leaf,5,20,,100,,0,,0,2088958,2,1,,0,57,{},{ bonus2 bSubRace,3,3; },
+2271,Jack_a_Dandy,Jack a Dandy,5,45000,,100,,1,,0,2088958,2,256,,0,58,{},{},,,
+2272,Stop_Post,Stop Post,5,20,,400,,1,,0,10477567,2,256,,0,59,{},{},,,
+2273,Doctor_Cap,Doctor Band,5,20,,100,,1,,0,2088958,2,256,,0,60,{},{ bonus bInt,1; },,
+2274,Ghost_Bandana,Ghost Bandana,5,20,,100,,0,,0,2088958,2,256,,0,61,{},{ bonus bAgi,2; bonus2 bSubEle,8,10; }
+2275,Red_Bandana,Red Bandana,5,20,,100,,2,,0,10477567,2,256,,0,62,{},{},,,
+2276,Eagle_Eyes,Eagle Eyes,5,20,,100,,1,,0,10477567,2,512,,0,63,{},{},,,
+2277,Nurse_Cap,Nurse Cap,5,20,,100,,1,,0,33040,2,256,,0,64,{},{ bonus bInt,1; bonus bLuk,1; },
+2278,Mr_Smile,Mr. Smile,5,60,,100,,1,,0,10477567,2,513,,0,65,{},{},,,
+2279,Bomb_Wick,Bomb Wick,5,20,,100,,1,,0,10477567,2,256,,0,66,{},{},,,
+2280,Sakkat,Sakkat,5,20,,300,,3,,0,10477567,2,256,,0,67,{},{ bonus bAgi,1; },,
+2281,Opera_Masque,Opera Masque,5,8000,,200,,2,,0,2088958,2,513,,0,68,{},{},,,
+2282,Heaven_Ring,Heaven Ring,5,20,,100,,0,,0,10477567,2,256,,0,69,{},{ bonus2 bSubEle,6,10; }
+2283,Ear_Mufs,Ear Mufs,5,20,,200,,3,,0,10477567,2,256,,0,70,{},{ bonus2 bResEff,Eff_Curse,1000; }
+2284,Antler,Antler,5,20,,500,,4,,0,2088958,2,256,,0,71,{},{},,
+2285,Apple_o'_Archer,Apple o' Archer,5,20,,200,,0,,0,2088958,2,256,,30,72,{},{ bonus bDex,3; },
+2286,Elven_Ears,Elven Ears,5,20,,100,,0,,0,2088958,2,512,,70,73,{},{},,
+2287,Pirate_Bandana,Pirate Bandana,5,20,,100,,3,,0,2088958,2,256,,0,74,{},{ bonus bStr,1; },
+2288,Mr_Scream,Mr. Scream,5,20,,100,,1,,0,2088958,2,513,,0,75,{},{},,
+2289,Poo_Poo_Hat,Poo Poo Hat,5,20,,700,,0,,0,10477567,2,256,,0,76,{},{ bonus2 bSubRace,7,10; }
+2290,Funeral_Hat,Funeral Hat,5,3000,,100,,1,,0,10477567,2,256,,0,77,{},{},,
+2291,Masquerade,Masquerade,5,20,,100,,0,,0,2088958,2,512,,0,78,{},{ bonus2 bAddRace,7,3; }
+2292,Welding_Mask,Welding Mask,5,20,,300,,2,,0,263200,2,513,,50,79,{},{ bonus2 bSubEle,3,10; }
+2293,Pretend_Murdered,Pretend Murdered,5,20,,100,,1,,0,10477567,2,256,,0,80,{},{},,
+2294,Stellar,Stellar,5,20,,100,,1,,0,10477567,2,256,,0,81,{},{},,
+2295,Blinker,Blinker,5,1500,,100,,0,,0,2088958,2,512,,0,82,{},{ bonus2 bResEff,Eff_Blind,10000; }
+2296,Binoculars,Binoculars,5,20,,100,,1,,0,1574920,2,512,,50,83,{},{ bonus bDex,1; },
+2297,Goblini_Mask,Goblini Mask,5,20,,100,,1,,0,2088958,2,513,,0,84,{},{},,
+2298,Green_Feeler,Green Feeler,5,20,,100,,2,,0,10477567,2,256,,0,85,{},{}
+2299,Viking_Helm,Viking Helm,5,20,,500,,5,,0,414946,2,256,,0,86,{},{}
+
+// Armor
+//===================================================================
+2301,Cotton_Shirt,Cotton Shirt,5,10,,100,,1,,0,10477567,2,16,,0,0,{},{}
+2302,Cotton_Shirt_,Cotton Shirt,5,10,,100,,1,,1,10477567,2,16,,0,0,{},{}
+2303,Leather_Jacket,Leather Jacket,5,200,,200,,2,,0,10477567,2,16,,0,0,{},{}
+2304,Leather_Jacket_,Leather Jacket,5,200,,200,,2,,1,10477567,2,16,,0,0,{},{}
+2305,Adventure_Suit,Adventurer's Suit,5,1000,,300,,3,,0,10477567,2,16,,0,0,{},{}
+2306,Adventure_Suit_,Adventurer's Suit,5,1000,,300,,3,,1,10477567,2,16,,0,0,{},{}
+2307,Mantle,Mantle,5,10000,,600,,4,,0,2088958,2,16,,0,0,{},{}
+2308,Mantle_,Mantle,5,10000,,600,,4,,1,2088958,2,16,,0,0,{},{}
+2309,Coat,Coat,5,22000,,1200,,5,,0,2088958,2,16,,0,0,{},{}
+2310,Coat_,Coat,5,22000,,1200,,5,,1,2088958,2,16,,0,0,{},{}
+2311,Mink_Coat,Mink Coat,5,50000,,2300,,6,,1,2088958,2,16,,30,0,{},{}
+2312,Padded_Armor,Padded Armor,5,48000,,2800,,7,,0,414946,2,16,,0,0,{},{}
+2313,Padded_Armor_,Padded Armor,5,48000,,2800,,7,,1,414946,2,16,,0,0,{},{}
+2314,Chain_Mail,Chain Mail,5,65000,,3300,,8,,0,414946,2,16,,0,0,{},{},,,,,
+2315,Chain_Mail_,Chain Mail,5,65000,,3300,,8,,1,414946,2,16,,0,0,{},{},,,,,
+2316,Full_Plate,Full Plate,5,80000,,4500,,10,,0,16514,2,16,,40,0,{},{},,,,,
+2317,Full_Plate_,Full Plate,5,80000,,4500,,10,,1,16514,2,16,,40,0,{},{},,,,,
+2318,Clothes_of_the_Lord,Lord's Clothes,5,20,,2500,,8,,1,263200,2,16,,70,0,{},{ bonus bMdef,5; bonus bInt,1; },,,
+2319,Glittering_Clothes,Glittering Jacket,5,20,,2500,,7,,1,10477566,2,16,,60,0,{},{ bonus bMdef,5; bonus2 bAddEffect,Eff_Blind,500; },,,,
+2320,Formal_Suit,Formal Suit,5,20,,300,,5,,1,2088958,2,16,,0,0,{},{},,,,,
+2321,Silk_Robe,Silk Robe,5,8000,,400,,3,,0,378806,2,16,,0,0,{},{ bonus bMdef,10; },,,,
+2322,Silk_Robe_,Silk Robe,5,8000,,400,,3,,1,378806,2,16,,0,0,{},{ bonus bMdef,10; },,,,
+2323,Scapulare,Scapulare,5,6500,,400,,4,,0,33040,2,16,,0,0,{},{},,,,,
+2324,Scapulare_,Scapulare,5,6500,,400,,4,,1,33040,2,16,,0,0,{},{},,,,,
+2325,Saint_Robe,Saint's Robe,5,54000,,600,,6,,0,296240,2,16,,0,0,{},{ bonus bMdef,5; },,,,
+2326,Saint_Robe_,Saint's Robe,5,54000,,600,,6,,1,296240,2,16,,0,0,{},{ bonus bMdef,5; },,,,
+2327,Holy_Robe,Holy Robe,5,20,,1700,,7,,0,33040,2,16,,60,0,{},{ bonus bMdef,5; bonus2 bSubRace,6,15; bonus2 bSubEle,7,10; }
+2328,Wooden_Mail,Wooden Mail,5,5500,,1000,,4,,0,279714,2,16,,0,0,{},{},,,,,
+2329,Wooden_Mail_,Wooden Mail,5,5500,,1000,,4,,1,279714,2,16,,0,0,{},{},,,,,
+2330,Tights,Tights,5,71000,,500,,6,,0,1574920,2,16,,45,0,{},{ bonus bDex,1; },
+2331,Tights_,Tights,5,71000,,500,,6,,1,1574920,2,16,,45,0,{},{ bonus bDex,1; },
+2332,Silver_Robe,Silver Robe,5,7000,,700,,4,,0,66052,2,16,,0,0,{},{},,
+2333,Silver_Robe_,Silver Robe,5,7000,,700,,4,,1,66052,2,16,,0,0,{},{},,
+2334,Mage_Coat,Mage Coat,5,20,,600,,5,,0,66052,2,16,,50,0,{},{ bonus bMdef,5; bonus bInt,1; }
+2335,Thief_Clothes,Thief Clothes,5,74000,,100,,6,,0,135232,2,16,,0,0,{},{ bonus bAgi,1; },
+2336,Thief_Clothes_,Thief Clothes,5,74000,,100,,6,,1,135232,2,16,,0,0,{},{ bonus bAgi,1; },
+2337,Ninja_Suit,Ninja Suit,5,20,,1500,,7,,0,135232,2,16,,50,0,{},{ bonus bAgi,1; bonus bMdef,3; }
+2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,2088958,0,16,,0,0,{},{ bonus bMdef,15; changebase 22; },
+2339,Pantie,Pantie,5,1000,,100,,4,,0,10477567,2,16,,0,0,{},{},,
+2340,Novice_Breastplate,Novice Breastplate,5,89000,,500,,4,,1,8388609,2,16,,10,0,{},{},,
+2341,Legion_Plate_Armor,Legion Plate Armor,5,94000,,5500,,11,,0,16384,2,16,,70,0,{},{},,
+2342,Legion_Plate_Armor_,Legion Plate Armor,5,94000,,5500,,11,,1,16384,2,16,,70,0,{},{},,
+2343,Robe_of_Casting,Casting Robe,5,20,,1100,,5,,0,66048,2,16,,75,0,{},{ bonus bCastrate,-3; },
+2344,Armor_of_Fire,Lucias's Volcano Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,3; },
+2345,Armor_of_Fire_,Lucias's Volcano Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,3; },
+2346,Armor_of_Water,Sapien's Ocean Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,1; },
+2347,Armor_of_Water_,Sapien's Ocean Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,1; },
+2348,Armor_of_Wind,Ebeshi's Typhoon Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,4; },
+2349,Armor_of_Wind_,Ebeshi's Typhoon Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,4; },
+2350,Armor_of_Land,Kreitos's Earth Armor,5,20,,2200,,4,,0,279714,2,16,,45,0,{},{ bonus bDefEle,2; },
+2351,Armor_of_Land_,Kreitos's Earth Armor,5,20,,2200,,4,,1,279714,2,16,,45,0,{},{ bonus bDefEle,2; },
+2352,Armor_For_Novice,Novice Ninja Suit,5,20,,1,,4,,0,8388609,2,16,,0,0,{},{},,
+
+// Foot gear
+//===================================================================
+2401,Sandals,Sandals,5,400,,200,,1,,0,10477567,2,64,,0,0,{},{}
+2402,Sandals_,Sandals,5,400,,200,,1,,1,10477567,2,64,,0,0,{},{}
+2403,Shoes,Shoes,5,3500,,400,,2,,0,2088958,2,64,,0,0,{},{}
+2404,Shoes_,Shoes,5,3500,,400,,2,,1,2088958,2,64,,0,0,{},{}
+2405,Boots,Boots,5,18000,,600,,4,,0,1989866,2,64,,0,0,{},{}
+2406,Boots_,Boots,5,18000,,600,,4,,1,1989866,2,64,,0,0,{},{}
+2407,Crystal_Pumps,Crystal Pumps,5,20,,100,,0,,0,2088958,0,64,,0,0,{},{ bonus bMdef,10; bonus bLuk,5; }
+2408,Cuffs,Cuffs,5,5000,,3000,,3,,0,10477567,2,64,,0,0,{},{}
+2409,Spiky_Heel,Spiky Heel,5,8500,,600,,2,,0,2088958,2,64,,0,0,{},{ bonus bMdef,5; }
+2410,Sleipnir,Sleipnir,5,20,,3500,,0,,0,10477567,2,64,,95,0,{},{ bonus bMdef,10; bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus bSPrecovRate,15; bonus bSpeedRate,25; }
+2411,Greaves,Greaves,5,48000,,750,,5,,0,16512,2,64,,65,0,{},{},,,,
+2412,Greaves_,Greaves,5,48000,,750,,5,,1,16512,2,64,,65,0,{},{},,,,
+2413,Safety_Shoes,Safety Shoes,5,20,,350,,6,,0,16514,2,64,,30,0,{},{},,,,
+2414,Sandal_For_Novice,Novice Sandals,5,20,,1,,2,,0,8388609,2,64,,0,0,{},{},,,,
+2415,Bunny_Slippers,Bunny Slippers,3,20,,10,,,,,,,,,,,{},{}
+
+// Garments
+//===================================================================
+2501,Hood,Hood,5,1000,,200,,1,,0,10477567,2,4,,0,0,{},{},,,,
+2502,Hood_,Hood,5,1000,,200,,1,,1,10477567,2,4,,0,0,{},{},,,,
+2503,Muffler,Muffler,5,5000,,400,,2,,0,2088958,2,4,,0,0,{},{},,,,
+2504,Muffler_,Muffler,5,5000,,400,,2,,1,2088958,2,4,,0,0,{},{},,,,
+2505,Manteau,Manteau,5,32000,,600,,4,,0,414946,2,4,,0,0,{},{},,,,
+2506,Manteau_,Manteau,5,32000,,600,,4,,1,414946,2,4,,0,0,{},{},,,,
+2507,Cape_Of_Ancient_Lord,Cape of Old Marquess,5,20,,600,,2,,0,2088958,2,4,,40,0,{},{ bonus bAgi,1; },,,
+2508,Ragamuffin_Cape,Ragamuffin Manteau,5,20,,500,,1,,0,2088958,2,4,,0,0,{},{ bonus bMdef,10; bonus bUnbreakable,100; },,,
+2509,Manteau_of_Survival,Manteau of Life,5,20,,550,,0,,0,66052,2,4,,75,0,{},{ bonus bVit,10; },,,
+2510,Hood_For_Novice,Novice Hood,5,20,,1,,2,,0,8388609,2,4,,0,0,{},{},,
+
+// Accessories
+//===================================================================
+2601,Ring,Ring,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bStr,2; },
+2602,Earring,Earring,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bInt,2; },
+2603,Necklace,Necklace,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bVit,2; },
+2604,Glove,Glove,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bDex,2; },
+2605,Brooch,Brooch,5,30000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bAgi,2; },
+2607,Clip,Clip,5,30000,,100,,0,,1,10477567,2,136,,0,0,{},{ bonus bMaxSP,10; },
+2608,Rosary,Rosary,5,15000,,100,,0,,0,2088958,2,136,,20,0,{},{ bonus bMdef,5; bonus bLuk,2; }
+2609,Skull_Ring,Skull Ring,5,10000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
+2610,Gold_Ring,Gold Ring,5,30000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
+2611,Silver_Ring,Silver Ring,5,20000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
+2612,Flower_Ring,Flower Ring,5,1500,,100,,0,,0,10477567,2,136,,0,0,{},{},,
+2613,Diamond_Ring,Diamond Ring,5,45000,,100,,0,,0,10477567,2,136,,0,0,{},{},,
+2614,Eye_of_Dullahan,Eye of Dullahan,5,90000,,100,,0,,0,2088958,2,136,,50,0,{},{},,
+2615,Safety_Ring,Safety Ring,5,75000,,100,,3,,0,2088958,2,136,,40,0,{},{ bonus bMdef,3; },,,,
+2616,Critical_Ring,Critical Ring,5,75000,,100,,0,,0,2088958,2,136,,40,0,{},{ bonus bCritical,5; },,,,
+2617,Celebrant's_Mitten,Celebrant's Mitten,5,20,,100,,1,,0,2088958,2,136,,35,0,{},{ bonus bInt,1; },,,,
+2618,Matyr's_Leash,Matyr's Leash,5,20,,100,,1,,0,2088958,2,136,,35,0,{},{ bonus bAgi,1; },,,,
+2619,Thimble_Of_Archer,Bow Thimble,5,30000,,100,,0,,0,1574920,2,136,,65,0,{},{},,,,,
+2620,Ring_Of_Rogue,Rogue's Treasure,5,30000,,100,,0,,0,135232,2,136,,70,0,{},{},,,,,
+2621,Ring_,Ancient Ring,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bStr,1; },,,,
+2622,Earring_,Ancient Earring,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bInt,1; },,,,
+2623,Necklace_,Ancient Necklace,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bVit,1; },,,,
+2624,Glove_,Ancient Glove,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bDex,1; },,,,
+2625,Brooch_,Ancient Brooch,5,30000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bAgi,1; },,,,
+2626,Rosary_,Ancient Rosary,5,15000,,200,,0,,1,2088958,2,136,,90,0,{},{ bonus bMdef,3; bonus bLuk,1; },,,
+2627,Belt,Ancient Belt,5,20000,0,1200,,0,,1,10477567,2,136,,25,0,{},{},,,,,
+2628,Novice_Armlet,Novice Armlet,5,400,0,200,,0,,1,8388609,2,136,,0,0,{},{ bonus bStr,1; bonus bInt,1; bonus bLuk,1; },,
+2629,Megingjard,Megingjard,5,20,0,8000,,2,,0,10477567,2,136,,90,0,{},{ bonus bStr,40; bonus bMdef,7; },,,
+2630,Brisingamen,Brisingamen,5,20,0,1500,,1,,0,10477567,2,136,,95,0,{},{ bonus bStr,3; bonus bAgi,3; bonus bVit,3; bonus bInt,3; bonus bMdef,5; }
+2631,Celebration_Ring,Celebration Ring,5,20,0,10,,0,,0,10477567,2,136,,0,0,{},{ bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2; }
+// Xmas / Wedding Items
+2634,Wedding_Ring_M,Wedding Ring,4,,,0,,0,,0,10477567,1,136,,0,,{},{ skill 334,1; skill 336,1; }
+2635,Wedding_Ring_F,Wedding Ring,4,,,0,,0,,0,10477567,0,136,,0,,{},{ skill 335,1; skill 336,1; }
+2636,Gold_Christmas_Ring,Gold Xmas Ring,5,,,0,,0,,0,10477567,2,136,,0,,{},{}
+2637,Silver_Christmas_Ring,Silver Xmas Ring,5,,,0,,0,,0,10477567,2,136,,0,,{},{}
+
+2638,Exorcize_Sachet,Exorcize Sachet,5,20,,100,,0,,,10477567,3,136,,0,,{},{ bonus bStr,1; bonus bLuk,1; },,,
+2639,Purification_Sachet,Purification Sachet,5,20,,100,,0,,,10477567,3,136,,0,,{},{ bonus bAgi,1; bonus bInt,1; },,,
+2640,Kafra_Ring,Kafra Ring,3,20,,10,,,,,,,,,,,{},{}
+
+// Cards
+//===================================================================
+4001,Poring_Card,Poring Card,6,20,,10,,,,,,,16,,,,{},{ bonus bLuk,2; bonus bFlee2,1; }
+4002,Fabre_Card,Fabre Card,6,20,,10,,,,,,,2,,,,{},{ bonus bVit,1; bonus bMaxHP,100; }
+4003,Pupa_Card,Pupa Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHP,700; }
+4004,Drops_Card,Drops Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,1; bonus bHit,3; }
+4005,Poring__Card,Poring Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,7,20; }
+4006,Lunatic_Card,Lunatic Card,6,20,,10,,,,,,,2,,,,{},{ bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1; }
+4007,Pecopeco_Egg_Card,Pecopeco Egg Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,0,20; }
+4008,Picky_Card,Picky Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,1; bonus bBaseAtk,10; }
+4009,Chonchon_Card,Chonchon Card,6,20,,10,,,,,,,64,,,,{},{ bonus bAgi,1; bonus bFlee,2; }
+4010,Wilow_Card,Wilow Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMaxSP,80; }
+4011,Picky__Card,Picky Card,6,20,,10,,,,,,,16,,,,{},{ bonus bVit,1; bonus bMaxHP,100; }
+4012,Thief_Bug_Egg_Card,Thief Bug Egg Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHP,400; }
+4013,Andre_Egg_Card,Andre Egg Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHPrate,5; }
+4014,Roda_Frog_Card,Roda Frog Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHP,400; bonus bMaxSP,50; }
+4015,Condor_Card,Condor Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,10; }
+4016,Thief_Bug_Card,Thief Bug Card,6,20,,10,,,,,,,16,,,,{},{ bonus bAgi,1; }
+4017,Savage_Babe_Card,Savage Babe Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Stan,500; }
+4018,Andre_Larva_Card,Andre Larva Card,6,20,,10,,,,,,,2,,,,{},{ bonus bInt,1; bonus bMaxSP,10; }
+4019,Hornet_Card,Hornet Card,6,20,,10,,,,,,,2,,,,{},{ bonus bStr,1; bonus bBaseAtk,3; }
+4020,Farmiliar_Card,Farmiliar Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5; }
+4021,Rocker_Card,Rocker Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDex,1; }
+4022,Spore_Card,Spore Card,6,20,,10,,,,,,,136,,,,{},{ bonus bVit,2; }
+4023,Desert_Wolf_Babe_Card,Desert Wolf Babe Card,6,20,,10,,,,,,,16,,,,{},{ bonus bInt,1; }
+4024,Plankton_Card,Plankton Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5; }
+4025,Skeleton_Card,Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stan,200; }
+4026,Thief_bug_Female_Card,Thief bug Female Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAgi,1; bonus bFlee,1; }
+4027,Kukre_Card,Kukre Card,6,20,,10,,,,,,,136,,,,{},{ bonus bAgi,2; }
+4028,Tarou_Card,Tarou Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,2; }
+4029,Wolf_Card,Wolf Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,15; bonus bCritical,1; }
+4030,Mandragora_Card,Mandragora Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,4,20; }
+4031,Pecopeco_Card,Pecopeco Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHPrate,10; }
+4032,Ambernite_Card,Ambernite Card,6,20,,10,,,,,,,32,,,,{},{ bonus bDef,2; }
+4033,Poporing_Card,Poporing Card,6,20,,10,,,,,,,136,,,,{},{ skill 53,1; }
+4034,Worm_Tail_Card,Worm Tail Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,2; }
+4035,Hydra_Card,Hydra Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,7,20; }
+4036,Muka_Card,Muka Card,6,20,,10,,,,,,,136,,,,{},{ bonus bHPrecovRate,10; }
+4037,Snake_Card,Snake Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5; }
+4038,Zombie_Card,Zombie Card,6,20,,10,,,,,,,64,,,,{},{ bonus bHPrecovRate,20; }
+4039,Stainer_Card,Stainer Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Silence,2000; bonus bDef,1; }
+4040,Creamy_Card,Creamy Card,6,20,,10,,,,,,,136,,,,{},{ skill 26,1; }
+4041,Coco_Card,Coco Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1; }
+4042,Steel_Chonchon_Card,Steel Chonchon Card,6,20,,10,,,,,,,16,,,,{},{ bonus2 bSubEle,4,10; bonus bDef,2; }
+4043,Andre_Card,Andre Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,20; }
+4044,Smokie_Card,Smokie Card,6,20,,10,,,,,,,136,,,,{},{ skill 51,1; }
+4045,horn_Card,horn Card,6,20,,10,,,,,,,32,,,,{},{ bonus bLongAtkDef,35; }
+4046,Martin_Card,Martin Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Blind,2000; bonus bDef,1; }
+4047,Ghostring_Card,Ghostring Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,8; bonus bHPrecovRate,-25; }
+4048,Poison_Spore_Card,Poison Spore Card,6,20,,10,,,,,,,136,,,,{},{ skill 52,3; }
+4049,Vadon_Card,Vadon Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,3,20; }
+4050,Thief_bug_Male_Card,Thief bug Male Card,6,20,,10,,,,,,,64,,,,{},{ bonus bAgi,2; }
+4051,Yoyo_Card,Yoyo Card,6,20,,10,,,,,,,136,,,,{},{ bonus bFlee2,5; bonus bAgi,1; }
+4052,Elder_Wilow_Card,Elder Wilow Card,6,20,,10,,,,,,,769,,,,{},{ bonus bInt,2; }
+4053,Vitata_Card,Vitata Card,6,20,,10,,,,,,,136,,,,{},{ skill 28,1; bonus bUseSPrate,25; }
+4054,Angeling_Card,Angeling Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,6; }
+4055,Marina_Card,Marina Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5; }
+4056,Dustiness_Card,Dustiness Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,4,30; bonus bFlee,5; }
+4057,Metaller_Card,Metaller Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5; }
+4058,Thara_Frog_Card,Thara Frog Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,7,30; }
+4059,Soldier_Andre_Card,Soldier Andre Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,3,30; }
+4060,Goblin_Card,Goblin Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,2,20; }
+4061,Cornutus_Card,Cornutus Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDef,1; }
+4062,Anacondaq_Card,Anacondaq Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,5,20; }
+4063,Caramel_Card,Caramel Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,4,20; }
+4064,Zerom_Card,Zerom Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,3; }
+4065,Kaho_Card,Kaho Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,2,20; }
+4066,Orc_Warrior_Card,Orc Warrior Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,2,30; }
+4067,Megalodon_Card,Megalodon Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1; }
+4068,Scorpion_Card,Scorpion Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,3,20; }
+4069,Drainliar_Card,Drainliar Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,1,20; }
+4070,Eggyra_Card,Eggyra Card,6,20,,10,,,,,,,64,,,,{},{ bonus bSPrecovRate,15; }
+4071,Orc_Zombie_Card,Orc Zombie Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,9,30; bonus bFlee,5; }
+4072,Golem_Card,Golem Card,6,20,,10,,,,,,,2,,,,{},{ bonus bBaseAtk,5; }
+4073,Pirate_Skel_Card,Pirate Skel Card,6,20,,10,,,,,,,136,,,,{},{ skill 37,5; }
+4074,BigFoot_Card,BigFoot Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,4,30; }
+4075,Argos_Card,Argos Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Stone,2000; bonus bDef,1; }
+4076,Magnolia_Card,Magnolia Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5; }
+4077,Phen_Card,Phen Card,6,20,,10,,,,,,,136,,,,{},{ bonus bNoCastCancel,0; bonus bCastrate,25; }
+4078,Savage_Card,Savage Card,6,20,,10,,,,,,,16,,,,{},{ bonus bVit,3; }
+4079,Mantis_Card,Mantis Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,3; }
+4080,Flora_Card,Flora Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,5,20; }
+4081,Hode_Card,Hode Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,2,30; bonus bFlee,5; }
+4082,Desert_Wolf_Card,Desert Wolf Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,0,15; bonus bBaseAtk,5; }
+4083,Rafflesia_Card,Rafflesia Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,5,30; }
+4084,Marine_Sphere_Card,Marine Sphere Card,6,20,,10,,,,,,,136,,,,{},{ skill 7,3; }
+4085,Orc_Skeleton_Card,Orc Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,6,20; }
+4086,Soldier_Skeleton_Card,Soldier Skeleton Card,6,20,,10,,,,,,,2,,,,{},{ bonus bCritical,9; }
+4087,Giearth_Card,Giearth Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,2,15; }
+4088,Frilldora_Card,Frilldora Card,6,20,,10,,,,,,,4,,,,{},{ skill 135,1; }
+4089,Sword_Fish_Card,Sword Fish Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,1; bonus bDef,1; }
+4090,Munak_Card,Munak Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,2,5; bonus bDef,1; }
+4091,Kobold_Card,Kobold Card,6,20,,10,,,,,,,136,,,,{},{ bonus bStr,1; bonus bCritical,4; }
+4092,Skel_Worker_Card,Skel Worker Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,1,15; bonus bBaseAtk,5; }
+4093,Obeaune_Card,Obeaune Card,6,20,,10,,,,,,,136,,,,{},{ skill 35,1; }
+4094,Archer_Skeleton_Card,Archer Skeleton Card,6,20,,10,,,,,,,2,,,,{},{}
+4095,Marse_Card,Marse Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,1,30; }
+4096,Zenorc_Card,Zenorc Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10; }
+4097,Matyr_Card,Matyr Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxHPrate,10; bonus bAgi,1; }
+4098,Dokebi_Card,Dokebi Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,4; bonus bDef,1; }
+4099,Pasana_Card,Pasana Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,3; bonus bDef,1; }
+4100,Sohee_Card,Sohee Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxSPrate,15; bonus bSPrecovRate,3; }
+4101,Sand_Man_Card,Sand Man Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,2; bonus bDef,1; }
+4102,Whisper_Card,Whisper Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,20; bonus2 bSubEle,8,-50; }
+4103,Horong_Card,Horong Card,6,20,,10,,,,,,,136,,,,{},{ skill 10,1; }
+4104,Requiem_Card,Requiem Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Confusion,500; }
+4105,Marc_Card,Marc Card,6,20,,10,,,,,,,16,,,,{},{ bonus2 bSubEle,1,5; bonus2 bResEff,Eff_Freeze,10000; }
+4106,Mummy_Card,Mummy Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,20; }
+4107,Verit_Card,Verit Card,6,20,,10,,,,,,,64,,,,{},{ bonus bMaxHPrate,8; bonus bMaxSPrate,8; }
+4108,Myst_Card,Myst Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,5,30; bonus bFlee,5; }
+4109,Jakk_Card,Jakk Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,3,30; bonus bFlee,5; }
+4110,Ghoul_Card,Ghoul Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Poison,2000; bonus bDef,1; }
+4111,Strouf_Card,Strouf Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,6,20; }
+4112,Marduk_Card,Marduk Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Silence,10000; }
+4113,Marionette_Card,Marionette Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,8,30; bonus bFlee,5; }
+4114,Argiope_Card,Argiope Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,5; bonus bDef,1; }
+4115,Hunter_Fly_Card,Hunter Fly Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bHpDrainRate,3,15; }
+4116,Isis_Card,Isis Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,7,30; bonus bFlee,5; }
+4117,Side_Winder_Card,Side Winder Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDoubleRate,5; }
+4118,Petit_Card,Petit Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,9,20; }
+4119,Bathory_Card,Bathory Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,7; }
+4120,Petit__Card,Petit Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,9,30; }
+4121,Phreeoni_Card,Phreeoni Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,100; }
+4122,Deviruchi_Card,Deviruchi Card,6,20,,10,,,,,,,769,,,,{},{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; }
+4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,64,,,,{},{ bonus bInfiniteEndure,0; bonus bMaxHPrate,-25; }
+4124,Medusa_Card,Medusa Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,6,15; bonus2 bResEff,Eff_Stone,10000; }
+4125,Deviace_Card,Deviace Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,7,7; bonus2 bAddRace,2,7; bonus2 bAddRace,3,7; bonus2 bAddRace,4,7; }
+4126,Minorous_Card,Minorous Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddSize,2,15; bonus bBaseAtk,5; }
+4127,Nightmare_Card,Nightmare Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1; }
+4128,Golden_Bug_Card,Golden Bug Card,6,20,,10,,,,,,,32,,,,{},{ bonus bNoMagicDamage,0; bonus bUseSPrate,100; }
+4129,Baphomet__Card,Baphomet Card,6,20,,10,,,,,,,4,,,,{},{ bonus bHit,-10; bonus bSplashRange,1; }
+4130,Scorpion_King_Card,Scorpion King Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEle,9,20; }
+4131,Moonlight_Flower_Card,Moonlight Flower Card,6,20,,10,,,,,,,64,,,,{},{ bonus bSpeedRate,25; }
+4132,Mistress_Card,Mistress Card,6,20,,10,,,,,,,769,,,,{},{ bonus bNoGemStone,0; bonus bUseSPrate,25; }
+4133,Daydric_Card,Daydric Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bSubEle,0,20; }
+4134,Dracula_Card,Dracula Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bSpDrainRate,10,5; }
+4135,Orc_Lord_Card,Orc Lord Card,6,20,,10,,,,,,,16,,,,{},{ bonus bShortWeaponDamageReturn,30; }
+4136,Khalitzburg_Card,Khalitzburg Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,6,30; }
+4137,Drake_Card,Drake Card,6,20,,10,,,,,,,2,,,,{},{ bonus bNoSizeFix,0; }
+4138,Anubis_Card,Anubis Card,6,20,,10,,,,,,,32,,,,{},{ bonus2 bSubRace,8,30; }
+4139,Joker_Card,Joker Card,6,20,,10,,,,,,,136,,,,{},{ skill 50,1; }
+4140,Knight_Of_Abyss_Card,Knight Of Abyss Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddRace,10,25; }
+4141,Evil_Druid_Card,Evil Druid Card,6,20,,10,,,,,,,16,,,,{},{ bonus bDefEle,9; bonus bInt,1; bonus bDef,1; }
+4142,Doppelganger_Card,Doppelganger Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAspdRate,15; }
+4143,Orc_Hero_Card,Orc Hero Card,6,20,,10,,,,,,,769,,,,{},{ bonus bVit,3; bonus2 bResEff,Eff_Stan,10000; }
+4144,Osiris_Card,Osiris Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRestartFullRecover,0; }
+4145,Berzebub_Card,Berzebub Card,6,20,,10,,,,,,,136,,,,{},{ bonus bCastrate,-30; bonus bMaxSPrate,-15; bonus bMaxHPrate,-5; }
+4146,Maya_Card,Maya Card,6,20,,10,,,,,,,32,,,,{},{}
+4147,Baphomet_Card,Baphomet Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,-10; bonus bSplashRange,1; }
+4148,Pharaoh_Card,Pharaoh Card,6,20,,10,,,,,,,769,,,,{},{ bonus bUseSPrate,-30; }
+4149,Bon_Gun_Card,Bon Gun Card,6,20,,10,,,,,,,32,,,,{},{ bonus bInt,2; }
+4150,Orc_Archer_Card,Orc Archer Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRange,1; }
+4151,Mimic_Card,Mimic Card,6,20,,10,,,,,,,769,,,,{},{ bonus bAgi,1; bonus bDex,2; bonus bLuk,3; }
+4152,Wraith_Card,Wraith Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMatk,8; }
+4153,Alarm_Card,Alarm Card,6,20,,10,,,,,,,136,,,,{},{ bonus bCastrate,-10; }
+4154,Arclouse_Card,Arclouse Card,6,20,,10,,,,,,,64,,,,{},{ bonus bStr,2; }
+4155,Rideword_Card,Rideword Card,6,20,,10,,,,,,,32,,,,{},{ bonus bDex,4; }
+4156,Skeleton_Prisoner_Card,Skel Prisoner Card,6,20,,10,,,,,,,136,,,,{},{ skill 45,3; }
+4157,Zombie_Prisoner_Card,Zombie Prisoner Card,6,20,,10,,,,,,,16,,,,{},{ bonus bMaxHPrate,10; }
+4158,Dark_Priest_Card,Dark Priest Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
+4159,Punk_Card,Punk Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
+4160,Zherlthsh_Card,Zherlthsh Card,6,20,,10,,,,,,,4,,,,{},{ bonus bUseSPrate,-15; }
+4161,Mysteltainn_Card,Mysteltainn Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtk,30; bonus bMaxHPrate,-22; bonus bCastrate,-10; }
+4162,Tirfing_Card,Tirfing Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAgi,3; bonus bFlee,10; }
+4163,Executioner_Card,Executioner Card,6,20,,10,,,,,,,2,,,,{},{bonus bAtk,3; }
+4164,Anolian_Card,Anolian Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,2; }
+4165,Sting_Card,Sting Card,6,20,,10,,,,,,,136,,,,{},{ bonus bDex,4; }
+4166,Wander_Man_Card,Wander Man Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,30; bonus bCritical,6; }
+4167,Cramp_Card,Cramp Card,6,20,,10,,,,,,,4,,,,{},{ bonus bAgi,3; }
+4168,Filamentous_Card,Filamentous Card,6,20,,10,,,,,,,769,,,,{},{ bonus2 bResEff,Eff_Stone,100; bonus2 bResEff,Eff_Freeze,100; bonus2 bResEff,Eff_Stan,100; bonus2 bResEff,Eff_Sleep,100; bonus2 bResEff,Eff_Poison,100; bonus2 bResEff,Eff_Curse,100; bonus2 bResEff,Eff_Silence,100; bonus2 bResEff,Eff_Confusion,100; bonus2 bResEff,Eff_Blind,100; }
+4169,Brilight_Card,Brilight Card,6,20,,10,,,,,,,32,,,,{},{ bonus bAgi,2; bonus bLuk,3; }
+4170,Iron_Fist_Card,Iron Fist Card,6,20,,10,,,,,,,769,,,,{},{ bonus bMaxHP,500; }
+4171,High_Orc_Card,High Orc Card,6,20,,10,,,,,,,16,,,,{},{ bonus bStr,2; }
+4172,Choco_Card,Choco Card,6,20,,10,,,,,,,2,,,,{},{ bonus bStr,500; bonus bAgi,500; bonus bVit,500; bonus bInt,500; bonus bDex,500; bonus bLuk,500; bonus bAtk,50000; bonus bDef,50000; }
+4173,Stem_Worm_Card,Stem Worm Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,2; }
+4174,Penonema_Card,Penomena Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHPrate, 15; }
+4175,Marin_Card,Marin Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,1,20; }
+4176,Sasquatch_Card,Sasquatch Card,6,20,,10,,,,,,,4,,,,{},{ bonus2 bAddSize,1,50; bonus bAtk,-10; bonus bMaxHP,750; }
+4177,Antonio_Card,Antonio Card,6,20,,10,,,,,,,136,,,,{},{ skill 50,5; skill 210,5; }
+4178,Cruiser_Card,Cruiser Card,6,20,,10,,,,,,,2,,,,{},{ bonus bDex,3; }
+4179,Mystcase_Card,Mystcase Card,6,20,,10,,,,,,,64,,,,{},{ bonus bCastrate,-50; bonus bAtk,+50; }
+4180,Chepet_Card,Chepet Card,6,20,,10,,,,,,,4,,,,{},{ bonus bLuk,5; }
+4181,Knight_of_Windstorm_Card,Knight Of Windstorm Card,6,20,,10,,,,,,,4,,,,{},{ bonus bFlee,35; }
+4182,Garm_Card,Garm Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bAddSize,2,50; bonus bAtk,-10; skill 87,3;}
+4183,Gargoyle_Card,Gargoyle Card,6,20,,10,,,,,,,136,,,,{},{ bonus bRange,5; }
+4184,Raggler_Card,Raggler Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Sleep,50; }
+4185,Neraid_Card,Neraid Card,6,20,,10,,,,,,,4,,,,{},{ bonus bAgi,2; }
+4186,Pest_Card,Pest Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,0,20; }
+4187,Injustice_Card,Injustice Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,9,20; }
+4188,Goblin_Archer_Card,Goblin Archer Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,2,20; bonus bHit,15; }
+4189,Gryphon_Card,Gryphon Card,6,20,,10,,,,,,,2,,,,{},{ bonus bMaxHPrate,10; }
+4190,Dark_Frame_Card,Dark Frame Card,6,20,,10,,,,,,,769,,,,{},{ skill 32,2; bonus bMdef,15; }
+4191,Wind_Ghost_Card,Wind Ghost Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,4; }
+4192,Merman_Card,Merman Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,1; }
+4193,Cookie_Card,Cookie Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,7; }
+4194,Aster_Card,Aster Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,3,20; bonus bMaxSP,80; }
+4195,Carat_Card,Carat Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,6,20; }
+4196,Bloody_Knight_Card,Bloody Knight Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Blind,25; bonus bAtk,45; bonus bMaxHPrate,-3; }
+4197,Clock_Card,Clock Card,6,20,,10,,,,,,,4,,,,{},{ bonus bLuk,10; }
+4198,Clock_Tower_Manager_Card,C Tower Manager Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Curse,50; }
+4199,Alligator_Card,Alligator Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Poison,50; }
+4200,Dark_Lord_Card,Dark Lord Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,9; }
+4201,Orc_Lady_Card,Orc Lady Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,4,20; }
+4202,Megalith_Card,Megalith Card,6,20,,10,,,,,,,4,,,,{},{ skill 9,1; }
+4203,Alice_Card,Alice Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,6; }
+4204,Raydric_Archer_Card,Raydric Archer Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,3; bonus bHit,35; }
+4205,Greatest_General_Card,Greatest General Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,5,20; }
+4206,Stalatic_Golem_Card,Stalactic Golem Card,6,20,,10,,,,,,,32,,,,{},{ bonus bMaxHP,150; }
+4207,Tri_Joint_Card,Tri Joint Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,7,20; bonus bAtk,25; }
+4208,Steamrider_Goblin_Card,Steam Goblin Card,6,20,,10,,,,,,,64,,,,{},{ bonus2 bSubEle,8,20; }
+4209,Sage_Worm_Card,Sage Worm Card,6,20,,10,,,,,,,2,,,,{},{ bonus bAtkEle,8; }
+4210,Kobold_Archer_Card,Kobold archer Card,6,20,,10,,,,,,,2,,,,{},{ bonus bHit,25; bonus bAtk,25; }
+4211,Chimera_Card,Chimera Card,6,20,,10,,,,,,,2,,,,{},{ bonus2 bAddEff,Eff_Stan,25; bonus bAtk,35; }
+
+// Extra Headgears
+//===================================================================
+5001,Headset,Headset,5,20,,200,,3,,0,2088958,2,256,,0,87,{},{ bonus2 bResEff,Eff_Curse,1000; },
+5002,Jewel_Crown,Jewel Crown,5,20,,600,,4,,0,414946,2,256,,60,88,{},{ bonus bMdef,3; bonus bInt,2; bonus bLuk,1; }
+5003,Joker_Jester,Joker Jester,5,20,,100,,1,,0,2088958,2,256,,0,89,{},{ bonus bMdef,5; bonus bLuk,2; },
+5004,Oxygen_Mask,Oxygen Mask,5,20,,200,,0,,0,2088958,2,1,,0,90,{},{ bonus2 bResEff,Eff_Poison,2000; },,,,
+5005,Gas_Mask,Gas Mask,5,20,,100,,1,,0,2088958,2,513,,0,91,{},{ bonus2 bResEff,Eff_Poison,3000; },,,,
+5006,Machoman_Glasses,Machoman's Glasses,5,36000,,100,,1,,0,2088958,2,512,,0,92,{},{},,,,,,
+5007,Grand_Circlet,Grand Circlet,5,20,,200,,3,,0,2088958,2,256,,55,93,{},{ bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1; },,
+5008,Puppy_Love,Puppy Love,5,20,,100,,1,,0,2088958,2,256,,0,94,{},{},,,,,,
+5009,Safety_Helmet,Safety Helmet,5,20,,500,,3,,0,2088958,2,256,,0,95,{},{ bonus bMdef,3; bonus bUnbreakable,100; },,,,,
+5010,Indian_Hair_Piece,Indian Fillet,5,20,,100,,3,,0,10477567,2,256,,0,96,{},{},,,,,,
+5011,Aerial,Aerial,5,20,,100,,3,,0,10477567,2,256,,0,97,{},{},,,,,,
+5012,Ph.D_Hat,Ph.D Hat,5,20,,200,,3,,0,2088958,2,256,,0,98,{},{ bonus bMdef,3; },,,,,
+5013,Horn_Of_Lord_Kaho,Lord Kaho's Horn,5,20,,100,,5,,0,10477567,2,256,,0,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,20,,300,,2,,0,16514,2,512,,65,100,{},{},,,,,,
+5015,Egg_Shell,Egg Shell,5,20,,200,,3,,0,10477567,2,256,,0,101,{},{},,,,,,
+5016,Boy's_Cap,Boy's Cap,5,20,,100,,2,,0,2088958,2,256,,0,102,{},{},,,,,,
+5017,Bone_Helm,Bone Helm,5,20,,800,,7,,0,279714,2,256,,70,103,{},{ bonus2 bSubEle,7,-15; },,,,
+5018,Feather_Bonnet,Feather Bonnet,5,20,,300,,4,,0,1574920,2,256,,0,104,{},{ bonus bAgi,1; },,,,,
+5019,Corsair,Corsair,5,20,,500,,5,,0,2088958,2,256,,0,105,{},{ bonus bVit,1; },,,,,
+5020,Kafra_Band,Kafra's Band,5,20,,500,,3,,0,10477567,2,256,,0,106,{},{ bonus bMdef,3; },,
+5021,Bankruptcy_of_Heart,Money Loser's Grief,5,20,,1200,,4,,0,263200,2,256,,38,107,{},{ bonus bInt,1; bonus bDex,1; },
+5022,Solar_God_Helm,Solar God Helm,5,20,,2400,,4,,0,2088832,2,768,,0,138,{},{ bonus bStr,3; bonus bInt,2; },
+5023,Parcel_Hat,Parcel Hat,5,20,,1000,,0,,0,263200,2,256,,0,108,{},{},,,
+5024,Cake_Hat,Cake Hat,5,20,,1500,,1,,0,10477567,2,256,,0,109,{},{},,,
+5025,Angel_Helm,Angel Helm,5,20,,1600,,5,,0,2088832,2,256,,74,110,{},{ bonus bAgi,1; bonus bLuk,1; bonus bMdef,3; }
+5026,Chef_Hat,Chef's Hat,5,20,,300,,1,,0,2088958,2,256,,50,111,{},{ bonus bDex,1; },,
+5027,Mage_Hat,Mage Hat,5,20,,300,,1,,0,66052,2,256,,0,112,{},{ bonus bInt,2; bonus bMaxSP,150; },
+5028,Candle,Candle,5,20,,150,,5,,0,10477567,2,256,,0,113,{},{},,,
+5029,Spore_Hat,Spore Hat,5,20,,900,,3,,0,2088958,2,256,,20,114,{},{},,,
+5030,Panda_Hat,Panda Hat,5,20,,800,,3,,0,2088958,2,256,,40,115,{},{},,,
+5031,Miner's_Helmet,Miner's Helmet,5,20,,1500,,4,,0,447986,2,256,,55,116,{},{ bonus bDex,2; },,
+5032,Sunday_Hat,Sunday Hat,5,20,,800,,1,,0,2088958,2,256,,0,117,{},{},,,
+5033,Smokie_Hat,Smokie Hat,5,20,,900,,3,,0,2088958,2,256,,50,118,{},{},,,
+5034,Lightbulb_Hairband,Lightbulb Hairband,5,20,,500,,0,,0,2088958,2,256,,0,119,{},{},,,
+5035,Poring_Hat,Poring Hat,5,20,,700,,2,,0,2088958,2,256,,38,120,{},{},,,
+5036,Cross_Hairband,Cross Hairband,5,20,,250,,1,,0,2088958,2,256,,10,121,{},{},,,
+5037,Fruit_Shell,Apple Hat,5,20,,150,,4,,0,10477567,2,256,,5,122,{},{},,,
+5038,Deviruchi_Hat,Deviruchi Hat,5,20,,800,,2,,0,2088958,2,256,,64,123,{},{ bonus bStr,1; bonus bInt,1; },
+5039,Rainbow_Eggshell,Rainbow Eggshell,5,20,,400,,4,,0,10477567,2,256,,19,124,{},{},,,
+5040,Blush,Blush,5,20,,100,,0,,0,10477567,2,512,,0,125,{},{},,,
+5041,Heart_Hairpin,Heart Hairpin,5,20,,100,,0,,0,10477567,2,256,,0,126,{},{},,,
+5042,Hair_Protector,Dumpling Decoration,5,20,,150,,0,,0,2088958,2,256,,14,127,{},{},,,
+5043,Opera_Ghost_Mask,Opera Ghost Mask,5,20,,200,,1,,0,2088958,2,512,,20,128,{},{},,,
+5044,Wing_Of_Demon,Wings of Demon,5,20,,350,,2,,0,10477567,2,256,,45,129,{},{},,,
+5045,Magician_Hat,Magic Hat,5,20,,500,,3,,0,554319315732,2,256,,50,130,{},{ bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50; }
+5046,Bongun_Hat,Bongun Hat,5,20,,300,,5,,0,10477567,2,769,,0,139,{},{},,,
+5047,Fashion_Sunglasses,Fashion Sunglasses,5,20,,100,,0,,0,2088958,2,256,,0,131,{},{},,,
+5048,Cresent_Hairpin,Cresent Hairpin,5,20,,100,,0,,0,10477567,2,256,,0,132,{},{},,,
+5049,Striped_Bandana,Striped Bandana,5,20,,150,,1,,0,10477567,2,256,,0,133,{},{},,,
+5050,Mysterious_Fruit_Shell,Mysterious Fruit Shell,5,20,,300,,5,,0,10477567,2,256,,30,134,{},{},,,
+5051,Bell_of_Pussycat,Bell of Pussycat,5,20,,100,,5,,0,10477567,2,1,,0,135,{},{},,,
+5052,Blue_Bandana,Blue Bandana,5,20,,150,,1,,0,10477567,2,256,,0,136,{},{},,,
+5053,Sphinx_Hat,Sphinx Hat,5,20,,3000,,5,,0,16514,2,256,,65,137,{},{ bonus bStr,2; },,
+5054,Assassin_Mask,Assassin Mask,5,20,,100,,0,,0,4096,2,1,,70,180,{},{},,,
+5055,Novice_Eggshell,Novice Eggshell,5,20,,10,,3,,0,8388609,2,256,,0,101,{},{},,,
+5056,Seed_Of_Love,Seed Of Love,5,20,,200,,0,,0,2088958,2,256,,0,140,{},{}
+5057,Black_Cat_Ears,Black Cat Ears,5,20,,200,,2,,0,10477567,2,256,,45,141,{},{}
+5058,Resting_Cat,Resting Cat,5,20,,500,,1,,0,2088958,2,256,,0,142,{},{ bonus2 bResEff,Eff_Curse,3000; bonus bMdef,15; }
+5059,Bear_Hat,Bear Hat,5,20,,800,,3,,0,10477567,2,256,,50,143,{},{}
+5060,Pointy_Cap,Pointy Cap,5,20,,300,,3,,0,10477567,2,256,,0,144,{},{ bonus bLuk,1; }
+5061,Flower_Hairpin,Flower Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,145,{},{}
+5062,Straw_Hat,Straw Hat,5,20,,200,,3,,0,10477567,2,256,,50,146,{},{ bonus bAgi,1; }
+5063,Bandaid,Bandaid,5,20,,100,,1,,0,2088958,2,256,,0,147,{},{}
+5064,Transformation_Leaf,Transformation Leaf,5,20,,100,,1,,0,10477567,2,256,,0,148,{},{}
+5065,Fresh_Blueish_Fish,Fresh Blueish Fish,5,20,,500,,2,,0,10477567,2,256,,50,149,{},{ bonus2 bAddRace,5,10; }
+5066,Horns_Of_Succubus,Horns of Succubus,5,20,,800,,4,,0,2088958,2,256,,70,150,{},{ bonus bInt,1; bonus bMdef,10; }
+5067,Sombrero,Sombrero,5,20,,350,,4,,0,2088958,2,256,,0,151,{},{ bonus bAgi,1; }
+5068,Ears_of_Demon,Ears Of Demon,5,20,,100,,1,,0,10477567,2,512,,70,152,{},{ bonus bStr,1; }
+5069,Fox_Mask,Fox Mask,5,20,,300,,1,,0,2088958,2,256,,0,153,{},{ bonus bAgi,1; bonus bLuk,1; }
+5070,Bandage,Bandage,5,20,,100,,1,,0,2088958,2,256,,0,154,{},{ bonus bStr,2; }
+5071,Indian_Headband,Indian Headband,5,20,,200,,1,,0,2088958,2,256,,0,155,{},{ bonus bDex,1; }
+5072,Horns_Of_Incubus,Horns Of Incubus,5,20,,800,,4,,0,2088958,2,256,,70,156,{},{ bonus bAgi,1; bonus bMdef,10; }
+5073,Campus_Hat,Campus Hat,5,20,,700,,2,,0,2088958,2,256,,0,157,{},{ bonus bDex,2; }
+5074,Ears_of_Angel,Ears of Angel,5,20,,100,,1,,0,10477567,2,512,,70,158,{},{ bonus bStr,1; }
+5075,Cowboy_Hat,Cowboy Hat,5,20,,500,,4,,0,10477567,2,256,,0,159,{},{}
+5076,Furry_Hat,Furry Hat,5,20,,350,,2,,0,10477567,2,256,,0,160,{},{ bonus bLuk,1; }
+5077,Tulip_Hairpin,Tulip Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,161,{},{}
+5078,Sea_Otter_Hat,Sea Otter Hat,5,20,,800,,3,,0,10477567,2,256,,50,162,{},{ bonus bVit,1; }
+5079,X_Hairpin,X Hairpin,5,20,,100,,1,,0,10477567,2,256,,0,163,{},{}
+5080,Crown_of_the_Ancient_Queen,Crown of The Ancient Queen,5,20,,400,,4,,0,10477567,2,256,,45,164,{},{}
+5081,Crown_of_Mistress,Crown of Mistress,5,20,,100,,1,,0,2088958,0,256,,75,165,{},{ bonus bInt,2; bonus bMaxSP,100; }
+5082,Mushroom_Hairband,Mushroom Hairband,5,20,,100,,2,,0,10477567,2,256,,0,166,{},{}
+5083,Back_Ribbon,Back Ribbon,5,20,,200,,1,,0,10477567,0,256,,45,167,{},{ bonus bMdef,10; }
+5084,Lazy_Raccoon_Hat,Lazy Racoon Hat,5,20,,500,,1,,0,2088958,2,256,,0,168,{},{ bonus2 bResEff,Eff_Sleep,2000; }
+5085,Small_Twin_Ribbons,Small Twin Ribbons,5,20,,100,,1,,0,10477567,0,512,,45,169,{},{}
+5086,Sad_Mask,Sad Mask,5,20,,100,,2,,0,10477567,2,513,,0,170,{},{ bonus2 bResEff,Eff_Blind,5000; }
+5087,Expressionless_Mask,Expressionless Mask,5,20,,100,,1,,0,10477567,2,513,,0,171,{},{}
+5088,Surprised_Mask,Surprised Mask,5,20,,100,,1,,0,10477567,2,513,,0,172,{},{}
+5089,Annoyed_Mask,Annoyed Mask,5,20,,100,,1,,0,10477567,2,513,,0,173,{},{}
+5090,Mask_of_the_Goblin_Leader,Mask of The Goblin Leader,5,20,,100,,2,,0,10477567,2,513,,0,174,{},{}
+5091,Big_Golden_Bell,Big Golden Bell,5,20,,200,,2,,0,2088958,2,768,,35,175,{},{}
+5092,Nun_Hat,Nun Hat,5,20,,300,,5,,0,33024,0,768,,65,176,{},{}
+5093,Nun_Hat_,Nun Hat,5,20,,300,,5,,0,33024,0,768,,65,177,{},{ bonus bMaxSP,100; }
+5094,Orc_Hero_Helm,Orc Hero Helm,5,20,,900,,5,,0,2088958,2,768,,55,178,{},{ bonus bStr,2; bonus bVit,1; }
+5096,Assassin_Mask_,Assassin Mask,5,20,,100,,0,,0,4096,2,1,,70,180,{},{},,,
+5097,Annual_Commemoration_Hat,Annual Commemoration Hat,5,,,30,,3,,0,10477567,2,256,,0,166,{},{ bonus bAllStats,3; }
+5098,Tiger_Mask,Tiger Mask,5,20,,400,,2,,,10477567,3,768,,,181,{},{ bonus bStr,3; bonus bMaxHP,100; }
+
+// Misc items
+//===================================================================
+7001,Mold_Powder,Mould Powder,3,680,,10,,,,,,,,,,,{},{}
+7002,Ogre_Tooth,Ogre Tooth,3,658,,10,,,,,,,,,,,{},{}
+7003,Anolian_Skin,Anolian Skin,3,928,,10,,,,,,,,,,,{},{}
+7004,Mud_Lump,Mud Lump,3,876,,10,,,,,,,,,,,{},{}
+7005,Skull,Skull,3,1044,,10,,,,,,,,,,,{},{}
+7006,Wing_of_Red_Bat,Wing of Red Bat,3,168,,10,,,,,,,,,,,{},{}
+7007,Claw_of_Rat,Claw of Rat,3,748,,10,,,,,,,,,,,{},{}
+7008,Stiff_Horn,Stiff Horn,3,636,,10,,,,,,,,,,,{},{}
+7009,Glitter_Shell,Glitter Shell,3,528,,10,,,,,,,,,,,{},{}
+7010,Tail_of_Steel_Scorpion,Tail of Steel Scorpion,3,548,,10,,,,,,,,,,,{},{}
+7011,Claw_of_Monkey,Claw of Monkey,3,466,,10,,,,,,,,,,,{},{}
+7012,Tough_Scalelike_Stem,Tough Scalelike Stem,3,412,,10,,,,,,,,,,,{},{}
+7013,Coral_Reef,Coral Reef,3,772,,10,,,,,,,,,,,{},{}
+7014,Old_Portrait,Old Portrait,3,1500,,100,,,,,,,,,,,{},{}
+7015,Bookclip_in_Memory,Bookclip in Memory,3,3000,,20,,,,,,,,,,,{},{}
+7016,Spoon_Stub,Spoon Stub,3,2500,,20,,,,,,,,,,,{},{}
+7017,Executioner's_Mitten,Executioner's Mitten,3,4500,,30,,,,,,,,,,,{},{}
+7018,Young_Twig,Young Twig,3,50,,10,,,,,,,,,,,{},{}
+7019,Loki's_Whispers,Loki's Whispers,3,20,,10,,,,,,,,,,,{},{}
+7020,Mother's_Nightmare,Mother's Nightmare,3,20,,10,,,,,,,,,,,{},{}
+7021,Foolishness_of_the_Blind,Foolishness of the Blind,3,20,,10,,,,,,,,,,,{},{}
+7022,Old_Hilt,Old Hilt,3,150,,30,,,,,,,,,,,{},{}
+7023,Blade_Lost_in_Darkness,Blade Lost in Darkness,3,12000,,40,,,,,,,,,,,{},{}
+7024,Bloody_Edge,Bloody Edge,3,10000,,40,,,,,,,,,,,{},{}
+7025,Lucifer's_Lament,Lucifer's Lament,3,30000,,50,,,,,,,,,,,{},{}
+7026,Key_of_Clock_Tower,Key of Clock Tower,3,2,,30,,,,,,,,,,,{},{}
+7027,Key_of_Underground,Key of Underground,3,2,,30,,,,,,,,,,,{},{}
+7028,Invite_for_Duel,Invite for Duel,3,0,,10,,,,,,,,,,,{},{}
+7029,Admission_for_Duel,Admission for Duel,3,20,,10,,,,,,,,,,,{},{}
+7030,Claw_of_Desert_Wolf,Claw of Desert Wolf,3,208,,10,,,,,,,,,,,{},{}
+7031,Old_Frying_Pan,Old Frying Pan,3,196,,10,,,,,,,,,,,{},{}
+7032,Piece_of_Egg_Shell,Piece of Egg Shell,3,168,,10,,,,,,,,,,,{},{}
+7033,Poison_Spore,Poison Spore,3,114,,10,,,,,,,,,,,{},{}
+7034,Red_Socks_with_Holes,Red Socks with Holes,3,100,,10,,,,,,,,,,,{},{}
+7035,Matchstick,Matchstick,3,100,,10,,,,,,,,,,,{},{}
+7036,Fang_of_Garm,Fang of Garm,3,100,,10,,,,,,,,,,,{},{}
+7037,Coupon,Coupon,3,2000,,10,,,,,,,,,,,{},{}
+7038,Yarn,Yarn,3,20,,10,,,,,,,,,,,{},{}
+7039,Novice_Nametag,Novice Nametag,3,20,,10,,,,,,,,,,,{},{}
+7040,Megaphone,Megaphone,3,20,,10,,,,,,,,,,,{},{}
+7041,Fine_Grit,Fine Grit,3,20,,10,,,,,,,,,,,{},{}
+7042,Leather_Bag_of_Infinity,Leather Bag of Infinity,3,20,,10,,,,,,,,,,,{},{}
+7043,Fine_Sand,Fine Sand,3,100,,10,,,,,,,,,,,{},{}
+7044,Vigorgra,Vigorgra,3,20,,10,,,,,,,,,,,{},{}
+7045,Magic_Paint,Magic Paint,3,20,,10,,,,,,,,,,,{},{}
+7046,Cart_Parts,Cart Parts,3,20,,10,,,,,,,,,,,{},{}
+7047,Alice's_Apron,Alice's Apron,3,2424,,10,,,,,,,,,,,{},{}
+7048,Talon_of_Griffon,Talon of Griffon,3,100,,10,,,,,,,,,,,{},{}
+7049,Stone,Stone,3,0,,30,,,,,,,,,,,{},{}
+7050,Cotton_Mat,Cotton Mat,3,20,,10,,,,,,,,,,,{},{}
+7051,Silk_Mat,Silk Mat,3,20,,10,,,,,,,,,,,{},{}
+7052,Wasted_Magazine,Wasted Magazine,3,20,,10,,,,,,,,,,,{},{}
+7053,Cyfar,Cyfar,3,772,,10,,,,,,,,,,,{},{}
+7054,Brigan,Brigan,3,746,,10,,,,,,,,,,,{},{}
+7055,Animal_Poop,Animal Poop,3,20,,50,,,,,,,,,,,{},{}
+7056,Payment_Statement_for_Kafra_Employee,Payment Statement for Ka,3,20,,50,,,,,,,,,,,{},{}
+7057,Gjallar,Gjallar,3,20,,500,,,,,,,,,,,{},{}
+7058,Gleipnir,Gleipnir,3,20,,500,,,,,,,,,,,{},{}
+7059,Free_Ticket_for_Kafra_Storage,Free Ticket for Kafra St,3,20,,10,,,,,,,,,,,{},{}
+7060,Free_Ticket_for_Kafra_Transportation,Free Ticket for Kafra Tr,3,20,,10,,,,,,,,,,,{},{}
+7061,Free_Ticket_for_the_Cart_Service,Free Ticket for the Cart,3,20,,10,,,,,,,,,,,{},{}
+7062,Broken_Turtle_Shell,Broken Turtle Shell,3,20,,10,,,,,,,,,,,{},{}
+7063,Soft_Feather,Soft Feather,3,280,,10,,,,,,,,,,,{},{}
+7064,Wing_of_Dragonfly,Wing of Dragonfly,3,520,,10,,,,,,,,,,,{},{}
+7065,Sea-otter_Fur,Sea Otter Fur,3,820,,10,,,,,,,,,,,{},{}
+7066,Ice_Cubic,Ice Cubic,3,660,,10,,,,,,,,,,,{},{}
+7067,Stone_Fragment,Stone Fragment,3,640,,10,,,,,,,,,,,{},{}
+7068,Burnt_Tree,Burnt Tree,3,722,,10,,,,,,,,,,,{},{}
+7069,Destroyed_Armor,Destroyed Armor,3,1042,,10,,,,,,,,,,,{},{}
+7070,Broken_Shell,Broken Shell,3,900,,10,,,,,,,,,,,{},{}
+7071,Tattered_Clothes,Tattered Clothes,3,640,,10,,,,,,,,,,,{},{}
+7072,Old_Shuriken,Old Shuriken,3,1780,,10,,,,,,,,,,,{},{}
+7073,Freya's_Jewel,Freya's Jewel,3,20,,500,,,,,,,,,,,{},{}
+7074,Thor's_Gauntlet,Thor's Gauntlet,3,20,,500,,,,,,,,,,,{},{}
+7075,Iron_Maiden,Iron Maiden,3,20,,500,,,,,,,,,,,{},{}
+7076,Wheel_of_the_Unknown,Wheel of the Unknown,3,20,,500,,,,,,,,,,,{},{}
+7077,Silver_Ornament,Silver Ornament,3,20,,500,,,,,,,,,,,{},{}
+7078,Wrath_of_Valkyrie,Wrath of Valkyrie,3,20,,500,,,,,,,,,,,{},{}
+7079,Feather_of_Angel_Wing,Feather of Angel Wing,3,20,,500,,,,,,,,,,,{},{}
+7080,Cat_Tread,Footprints of Cat,3,20,,500,,,,,,,,,,,{},{}
+7081,Woman's_Moustache,Woman's Moustache,3,20,,500,,,,,,,,,,,{},{}
+7082,Root_of_Stone,Root of Stone,3,20,,500,,,,,,,,,,,{},{}
+7083,Spirit_of_Fish,Spirit of Fish,3,20,,500,,,,,,,,,,,{},{}
+7084,Sputum_of_Bird,Sputum of Bird,3,20,,500,,,,,,,,,,,{},{}
+7085,Sinew_of_Bear,Sinew of Bear,3,20,,500,,,,,,,,,,,{},{}
+7086,Emblem_of_the_Sun_God,Emblem of the Sun God,3,20,,500,,,,,,,,,,,{},{}
+7087,Breath_of_Spirit,Breath of Soul,3,20,,500,,,,,,,,,,,{},{}
+7088,Snow_Crystal,Snow Crystal,3,20,,500,,,,,,,,,,,{},{}
+7089,Omen_of_Tempest,Omen of Tempest,3,20,,500,,,,,,,,,,,{},{}
+7090,Ripple,Ripple,3,20,,500,,,,,,,,,,,{},{}
+7091,Billow,Billow,3,20,,500,,,,,,,,,,,{},{}
+7092,Drifting_Air,Drifting Air,3,20,,500,,,,,,,,,,,{},{}
+7093,Cogwheel,Metal Wheel,3,20,,10,,,,,,,,,,,{},{}
+7094,Fragment,Cabinet Chip,3,20,,10,,,,,,,,,,,{},{}
+7095,Metal_Fragment,Tooth Fragment,3,20,,10,,,,,,,,,,,{},{}
+7096,Lava,Hardened Lava,3,1108,,10,,,,,,,,,,,{},{}
+7097,Burning_Heart,Burning Heart,3,924,,10,,,,,,,,,,,{},{}
+7098,Live_Coal,Fire Seed,3,638,,10,,,,,,,,,,,{},{}
+7099,Worn-out_Magic_Scroll,Old Magical Circle,3,20,,10,,,,,,,,,,,{},{}
+7100,Sharp_Leaf,Sharpened Leaf,3,20,,10,,,,,,,,,,,{},{}
+7101,PecoPeco_Feather,Peco Feather,3,454,,10,,,,,,,,,,,{},{}
+7102,Nightmare,Nightmare,3,20,,10,,,,,,,,,,,{},{}
+7103,Unknown_Liquid_Bottle,Yellow Liquid Bottle,3,20,,10,,,,,,,,,,,{},{}
+7104,Fake_Angel's_Wing,Fake Angel's Wing,3,756,,10,,,,,,,,,,,{},{}
+7105,Fake_Heaven_Ring,Imitation Soul's Band,3,924,,10,,,,,,,,,,,{},{}
+7106,Antelope_Horn,Antelope Horn,3,672,,10,,,,,,,,,,,{},{}
+7107,Antelope_Skin,Antelope Skin,3,756,,10,,,,,,,,,,,{},{}
+7108,Piece_of_Shield,Broken Shield,3,20,,10,,,,,,,,,,,{},{}
+7109,Shining_Spear_Blade,Shiny Spear Tip,3,20,,10,,,,,,,,,,,{},{}
+7110,Broken_Sword,Sharp Sword,3,588,,10,,,,,,,,,,,{},{}
+7111,Slick_Paper,String Paper,3,706,,10,,,,,,,,,,,{},{}
+7112,Sharp_Paper,Transparent Paper,3,906,,10,,,,,,,,,,,{},{}
+7113,Broken_Symbol_of_Pharaoh,Broken Symbol of Pharaoh,3,20,,10,,,,,,,,,,,{},{}
+7114,Masque_of_Tutankhamen,Sphinx Mask,3,20,,10,,,,,,,,,,,{},{}
+7115,Harpy_Feather,Blood Feather,3,1142,,10,,,,,,,,,,,{},{}
+7116,Harpy_Talon,Tooth of Lowblood,3,1210,,10,,,,,,,,,,,{},{}
+7117,Torn_Magic_Book,Torn Spell Book,3,20,,10,,,,,,,,,,,{},{}
+7118,Torn_Scroll,Torn Scroll,3,20,,10,,,,,,,,,,,{},{}
+7119,Bacillus,Hypha Body,3,1024,,10,,,,,,,,,,,{},{}
+7120,Burning_Horseshoe,Burning Horseshoe,3,822,,10,,,,,,,,,,,{},{}
+7121,Honey_Pot,Honey Jar,3,622,,10,,,,,,,,,,,{},{}
+7122,Burning_Hair,Hot Feather,3,974,,10,,,,,,,,,,,{},{}
+7123,Dragon_Skin,Dragon Skin,3,1024,,10,,,,,,,,,,,{},{}
+7124,Sand_Clump,Sand Lump,3,706,,10,,,,,,,,,,,{},{}
+7125,Scorpion_Claw,Crab Shot,3,706,,10,,,,,,,,,,,{},{}
+7126,Large_Jellopy,Large Jellopy,3,840,,10,,,,,,,,,,,{},{}
+7127,Alcohol_Creation_Book,Alcohol Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7128,Bottle_Grenade_Creation_Book,Fire Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7129,Acid_Bottle_Creation_Book,Acid Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7130,Plant_Bottle_Creation_Book,Plant Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7131,Mine_Bottle_Creation_Book,Mine Bottle Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7132,Glistening_Coat_Creation_Book,Glistening Coat Creation Book,3,100000,,10,,,,,,,,,,,{},{}
+7133,Condensed_Potion_Creation_Book,Condensed Potion Creation Book,3,240000,,10,,,,,,,,,,,{},{}
+7134,Medicine_Bowl,Medicine Bowl,3,8,,10,,,,,,,,,,,{},{}
+7135,Bottle_Grenade,Fire Bottle,3,20,,10,,,,,,,,,,,{},{}
+7136,Acid_Bottle,Hydrobolic Acid Bottle,3,20,,10,,,,,,,,,,,{},{}
+7137,Plant_Bottle,Water Bottle,3,20,,10,,,,,,,,,,,{},{}
+7138,Marine_Sphere_Bottle,Mine Bottle,3,20,,10,,,,,,,,,,,{},{}
+7139,Glistening_Coat,Coating Wax,3,20,,10,,,,,,,,,,,{},{}
+7140,Seed_of_Life,Seed of Life,3,20,,10,,,,,,,,,,,{},{}
+7141,Morning_Dew_of_Yggdrasil,Water Flow,3,20,,10,,,,,,,,,,,{},{}
+7142,Ancient_Life,Embryo,3,20,,10,,,,,,,,,,,{},{}
+7143,Glass_Tube,Seperation Tubes,3,20,,10,,,,,,,,,,,{},{}
+7144,Potion_Creation_Gude,Potion Making Book,3,100000,,10,,,,,,,,,,,{},{}
+7145,Ragnarok_T-shirt,Ragnarok T-Shirt,3,20,,10,,,,,,,,,,,{},{}
+7146,Vacation_Ticket,Vacation Ticket,3,20,,10,,,,,,,,,,,{},{}
+7147,Jasmine,Jasmine,3,20,,10,,,,,,,,,,,{},{}
+7148,Mother's_Letter,Mother's Letter,3,20,,10,,,,,,,,,,,{},{}
+7149,Yellow_Plate,Yellow Plate,3,220,,10,,,,,,,,,,,{},{}
+7150,A_piece_of_Bamboo,Bamboo Trunk,3,310,,10,,,,,,,,,,,{},{}
+7151,Oil_Paper,Oiled Paper,3,310,,10,,,,,,,,,,,{},{}
+7152,Glossy_Hair,Glossy Hair,3,340,,10,,,,,,,,,,,{},{}
+7153,Worn-out_Kimono,Old Kimono,3,590,,10,,,,,,,,,,,{},{}
+7154,Poisonous_Powder,Poison Powder,3,160,,10,,,,,,,,,,,{},{}
+7155,Skin_of_Poisonous_Toad,Poisonous Toad Skin,3,280,,10,,,,,,,,,,,{},{}
+7156,Broken_Shuriken,Broken Shuriken,3,470,,10,,,,,,,,,,,{},{}
+7157,Black_Mask,Black Mask,3,20,,10,,,,,,,,,,,{},{}
+7158,Broken_Liquor_Bottle,Broken Liquor Bottle,3,160,,10,,,,,,,,,,,{},{}
+7159,Demon's_Nose,Demon's Nose,3,400,,10,,,,,,,,,,,{},{}
+7160,Passport_From_King,Passport From King,3,20,,10,,,,,,,,,,,{},{}
+7161,Skin_of_the_Black_Bear,Skin of the Black Bear,3,384,,10,,,,,,,,,,,{},{}
+7162,Piece_of_Cloud,Piece of Cloud,3,390,,10,,,,,,,,,,,{},{}
+7163,Hard_Antennae,Hard Antennae,3,570,,10,,,,,,,,,,,{},{}
+7164,Very_Hard_Peach,Very Hard Peach,3,400,,10,,,,,,,,,,,{},{}
+7165,Etherial_Winged_Clothing,Etherial Winged Clothing,3,650,,10,,,,,,,,,,,{},{}
+7166,Soft_Silk_Fabric,Soft Silk Fabric,3,1200,,10,,,,,,,,,,,{},{}
+7167,Strange_Piece_of_Iron,Strange Piece of Iron,3,430,,10,,,,,,,,,,,{},{}
+7168,Big_Wing_of_Butterfly,Big Wing of Butterfly,3,614,,10,,,,,,,,,,,{},{}
+7169,Tae_Guk_Tablet,Tae Guk Tablet,3,20,,10,,,,,,,,,,,{},{}
+7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,10477566,1,16,,0,0,{},{ changebase 22; }
+7171,Skin_of_Panther,Skin of Panther,3,282,,10,,,,,,,,,,,{},{}
+7172,Claw_of_Panther,Claw of Panther,3,290,,10,,,,,,,,,,,{},{}
+7173,Bun_Buster_Bag,Bun Buster Bag,3,20,,10,,,,,,,,,,,{},{}
+7174,Wrapping_Thread,Wrapping Thread,3,20,,10,,,,,,,,,,,{},{}
+7175,Wrapper,Wrapper,3,20,,10,,,,,,,,,,,{},{}
+7176,King's_Proof_Document,King's Proof Document,3,20,,10,,,,,,,,,,,{},{}
+7177,Piece_of_Starlight's_Sorrow,Piece of Starlight's Sorrow,3,20,,10,,,,,,,,,,,{},{}
+7178,Starlight's_Sorrow,Starlight's Sorrow,3,20,,10,,,,,,,,,,,{},{}
+7179,Donation_Ticket,Donation Ticket,3,20,,10,,,,,,,,,,,{},{}
+7180,Letter_of_Introduction,Letter of Introduction,3,20,,10,,,,,,,,,,,{},{}
+7181,Commodity_Receipt,Commodity Receipt,3,20,,10,,,,,,,,,,,{},{}
+7182,Cacao,Cacao,3,200,,20,,,,,,,,,,,{},{}
+7183,Letter_of_Younger_Sister,Letter of Younger Sister,3,20,,10,,,,,,,,,,,{},{}
+7184,Piano_Key,Piano Key,3,20,,10,,,,,,,,,,,{},{}
+7185,Quiz_Participation_Ticket,Quiz Participation Ticket,3,20,,10,,,,,,,,,,,{},{}
+7186,Thin_Trunk,Thin Trunk,3,20,,10,,,,,,,,,,,{},{}
+7187,Festival_Mask,Festival Mask,3,20,,10,,,,,,,,,,,{},{}
+7188,Brown_Root,Brown_Root,3,20,,10,,,,,,,,,,,{},{}
+7189,Wooden_Heart,Wooden Heart,3,20,,10,,,,,,,,,,,{},{}
+7190,Hard_Back_Shell,Hard Back Shell,3,20,,10,,,,,,,,,,,{},{}
+7191,Paper_Lantern,Paper Lantern,3,20,,10,,,,,,,,,,,{},{}
+7192,Pin_Wheel,Pin Wheel,3,20,,10,,,,,,,,,,,{},{}
+7193,Sprout,Sprout,3,20,,10,,,,,,,,,,,{},{}
+7194,Soft_Grass_Leaf,Soft Grass Leaf,3,20,,10,,,,,,,,,,,{},{}
+7195,Slingshot,Slingshot,3,20,,10,,,,,,,,,,,{},{}
+7196,Shoulder_Guard,Shoulder Guard,3,20,,10,,,,,,,,,,,{},{}
+7197,Durable_Vine,Durable Vine,3,20,,10,,,,,,,,,,,{},{}
+7198,Huge_Leaf,Huge Leaf,3,20,,10,,,,,,,,,,,{},{}
+7199,Hieroglyphic,Hieroglyphic,3,20,,10,,,,,,,,,,,{},{}
+7200,Elastic_Band,Elastic Band,3,20,,10,,,,,,,,,,,{},{}
+7201,Log,Log,3,20,,10,,,,,,,,,,,{},{}
+7202,Insect_Pinchers,Insect Pinchers,3,20,,10,,,,,,,,,,,{},{}
+7203,Healthy_Branch,Healthy Branch,3,20,,10,,,,,,,,,,,{},{}
+7204,Gun_Powder,Gun Powder,3,20,,10,,,,,,,,,,,{},{}
+7205,Black_Piece_of_Cloth,Black Piece of Cloth,3,20,,10,,,,,,,,,,,{},{}
+7206,Cat_Doll,Black Cat Doll,3,20,,10,,,,,,,,,,,{},{}
+7207,Old_Mantle,Old Mantle,3,20,,10,,,,,,,,,,,{},{}
+7208,Rusted_Knife,Rusted Knife,3,20,,10,,,,,,,,,,,{},{}
+7209,Dullahan's_Helm,Dullahan's Helm,3,20,,10,,,,,,,,,,,{},{}
+7210,Piece_of_Dullahan's_Armor,Dullahan's Armor Piece,3,20,,10,,,,,,,,,,,{},{}
+7211,Rosetta_Stone_Fragment,Rosetta Stone Fragment,3,20,,10,,,,,,,,,,,{},{}
+7212,Hanging_Doll,Hanging Doll,3,20,,10,,,,,,,,,,,{},{}
+7213,Pin_Cusion,Pin Cusion,3,20,,10,,,,,,,,,,,{},{}
+7214,Bat_Cage,Bat Cage,3,20,,10,,,,,,,,,,,{},{}
+7215,Broken_Needle,Broken Needle,3,20,,10,,,,,,,,,,,{},{}
+7216,Red_Scarf,Red Scarf,3,20,,10,,,,,,,,,,,{},{}
+7217,Spool_of_Thread,Spool of Thread,3,20,,10,,,,,,,,,,,{},{}
+7218,Rotted_Rope,Rotted Rope,3,20,,10,,,,,,,,,,,{},{}
+7219,Striped_Socks,Striped Socks,3,20,,10,,,,,,,,,,,{},{}
+7220,Ectoplasm,Ectoplasm,3,20,,10,,,,,,,,,,,{},{}
+7221,Chains,Chains,3,20,,10,,,,,,,,,,,{},{}
+7222,Old_Tree_Branch,Old Tree Branch,3,20,,10,,,,,,,,,,,{},{}
+7223,Ruined_Self_Portrait,Ruined Self Portrait,3,20,,10,,,,,,,,,,,{},{}
+7224,Philosophers_Stone,Philosopher's Stone,3,20,,10,,,,,,,,,,,{},{}
+7225,Silk_Lantern,Silk Lantern,3,20,,10,,,,,,,,,,,{},{}
+7226,Hallucination_Pill,Hallucination Pill,3,20,,10,,,,,,,,,,,{},{}
+7227,TCG_Card,TCG Card,3,20,,10,,,,,,,,,,,{},{}
+7228,Gold_Nugget,Gold Nugget,3,20,,300,,,,,,,,,,,{},{}
+7229,Iron_Nugget,Iron Nugget,3,20,,300,,,,,,,,,,,{},{}
+7230,Silver_Nugget,Silver Nugget,3,20,,30,,,,,,,,,,,{},{}
+7231,Gold_Ore,Gold Ore,3,20,,150,,,,,,,,,,,{},{}
+7232,Silver_Ore,Silver Ore,3,20,,150,,,,,,,,,,,{},{}
+7233,Mysterious_Ore,Mysterious Ore,3,20,,150,,,,,,,,,,,{},{}
+
+// RWC Reward items
+7234,Spirit_of_Guild,Spirit of Guild,3,20,,10,,,,,,,,,,,{},{}
+7235,Spirit_of_Assault,Spirit of Assault,3,20,,10,,,,,,,,,,,{},{}
+7236,Spirit_of_Defense,Spirit of Defense,3,20,,10,,,,,,,,,,,{},{}
+7237,Spirit_of_Cooperation,Spirit of Cooperation,3,20,,10,,,,,,,,,,,{},{}
+7238,Spirit_of_Harmony,Spirit of Harmony,3,20,,10,,,,,,,,,,,{},{}
+7239,Spirit_of_Advancement,Spirit of Advancement,3,20,,10,,,,,,,,,,,{},{}
+7240,Spirit_of_Trust,Spirit of Trust,3,20,,10,,,,,,,,,,,{},{}
+7241,Spirit_of_Concentration,Spirit of Concentration,3,20,,10,,,,,,,,,,,{},{}
+7242,Spirit_of_Unity,Spirit of Unity,3,20,,10,,,,,,,,,,,{},{}
+7243,Spirit_of_Integrity,Spirit of Integrity,3,20,,10,,,,,,,,,,,{},{}
+7244,Spirit_of_Communion,Spirit of Communion,3,20,,10,,,,,,,,,,,{},{}
+7245,Spirit_of_Friendship,Spirit of Friendship,3,20,,10,,,,,,,,,,,{},{}
+7246,Spirit_of_Peace,Spirit of Peace,3,20,,10,,,,,,,,,,,{},{}
+7247,Spirit_of_Nature,Spirit of Nature,3,20,,10,,,,,,,,,,,{},{}
+7248,Spirit_of_Fame,Spirit of Fame,3,20,,10,,,,,,,,,,,{},{}
+7249,Spirit_of_Contribution,Spirit of Contribution,3,20,,10,,,,,,,,,,,{},{}
+7250,Spirit_of_Glory,Spirit of Glory,3,20,,10,,,,,,,,,,,{},{}
+7251,Spirit_of_Victory,Spirit of Victory,3,20,,10,,,,,,,,,,,{},{}
+
+//Gonryun Items
+7252,Chinese_Medicine,Chinese Medicine,3,20,,10,,,,,,,,,,,{},{}
+7253,Golden_Flag,Golden Flag,3,20,,10,,,,,,,,,,,{},{}
+7254,Digitally_Printed_Ticket,Digitally Printed Ticket,3,20,,10,,,,,,,,,,,{},{}
+7262,Paper_Fan,Paper Fan,3,233,,,,,,,,,,,,,{},{}
+7263,Cat's_Eye,Cat's-Eye,3,20,477,10,,,,,,,,,,,{},{}
+7264,Dried_Sand,Dried Sand,3,20,161,10,,,,,,,,,,,{},{}
+7265,Dragon_Horn,Dragon Horn,3,20,,10,,,,,,,,,,,{},{}
+7266,Dragon_Teeth,Dragon Teeth,3,218,,,,,,,,,,,,,{},{}
+7267,Tigerskin_Underwear,Tigerskin Underwear,3,20,107,10,,,,,,,,,,,{},{}
+7268,Ghost_Doll,Ghost Doll,3,20,605,10,,,,,,,,,,,{},{}
+7269,Baby_Bib,Baby Bib,3,20,,10,,,,,,,,,,,{},{}
+7270,Baby_Bottle,Baby Bottle,3,20,,,,,,,,,,,,,{},{}
+7271,Novice_Statue,Novice Statue,3,20,,10,,,,,,,,,,,{},{}
+7272,Dumpling_Doll,Dumpling Doll,3,20,,10,,,,,,,,,,,{},{}
+7273,RWC_Necklace,RWC_Necklace,3,20,,10,,,,,,,,,,,{},{}
+7274,Ancient_Language_Book,Ancient_Language_Book,3,20,,10,,,,,,,,,,,{},{}
+7275,Ancient_Language_Document,Ancient_Language_Document,3,20,,10,,,,,,,,,,,{},{}
+7276,Picture_Letter,Picture Letter,3,20,,10,,,,,,,,,,,{},{}
+7277,Munak_Doll,Munak Doll,3,20,,10,,,,,,,,,,,{},{}
+7278,Welfare_Letter,Welfare Letter,3,20,,10,,,,,,,,,,,{},{}
+7279,Vita_500_Bottlecap,Vita 500 Bottlecap,3,20,,10,,,,,,,,,,,{},{}
+7280,Quiz_Participation_Certificate_1,QP Certificate 1,3,20,,10,,,,,,,,,,,{},{}
+7281,Quiz_Participation_Certificate_2,QP Certificate 2,3,20,,10,,,,,,,,,,,{},{}
+7282,Quiz_Participation_Certificate_3,QP Certificate 3,3,20,,10,,,,,,,,,,,{},{}
+7283,Quiz_Participation_Certificate_4,QP Certificate 4,3,20,,10,,,,,,,,,,,{},{}
+7284,Quiz_Participation_Certificate_5,QP Certificate 5,3,20,,10,,,,,,,,,,,{},{}
+
+// 11/09(Ayothana) Items
+7285,Sacred_Wool_Charm,Sacred_Wool_Charm,3,,10,0,,,,,,,,,,,{},{},,
+7286,Red_Chili,Red_Chili,3,,10,0,,,,,,,,,,,{},{},,
+7287,Sacred_Wool_Charm_2,Sacred_Wool_Charm_2,3,,10,0,,,,,,,,,,,{},{},,
+7288,Engagement_Ring,Engagement_Ring,3,,10,0,,,,,,,,,,,{},{},,
+7289,Olivite,Olivite,3,,100,0,,,,,,,,,,,{},{},,
+7290,Gold_Mica,Gold_Mica,3,,100,0,,,,,,,,,,,{},{},,
+7291,Agate,Agate,3,,100,0,,,,,,,,,,,{},{},,
+7292,White_Mica,White_Mica,3,,100,0,,,,,,,,,,,{},{},,
+7293,Rose_Quartz,Rose_Quartz,3,,100,0,,,,,,,,,,,{},{},,
+7294,Turquoise,Turquoise,3,,100,0,,,,,,,,,,,{},{},,
+7295,Citrine,Citrine,3,,100,0,,,,,,,,,,,{},{},,
+7296,Augite,Augite,3,,100,0,,,,,,,,,,,{},{},,
+7297,Black_Mica,Black_Mica,3,,100,0,,,,,,,,,,,{},{},,
+7298,Leaf_Cloth,Leaf_Cloth,3,,10,0,,,,,,,,,,,{},{},,
+7299,Bamboo_Basket,Bamboo_Basket,3,,10,0,,,,,,,,,,,{},{},,
+7300,Jeweled_Ore,Jeweled_Ore,3,,10,0,,,,,,,,,,,{},{},,
+7301,Knife_Decoration,Knife_Decoration,3,,10,0,,,,,,,,,,,{},{},,
+7302,Krathong,Krathong,3,,10,0,,,,,,,,,,,{},{},,
+
+7500,THG_Membership,THG Membership,3,20,,10,,,,,,,,,,,{},{}
+7501,Token_Bag,Token Bag,3,20,,10,,,,,,,,,,,{},{}
+
+// Pet Eggs
+//===================================================================
+9001,Poring_Egg,Poring Egg,7,20,,0,,,,,,,,,,,{},{}
+9002,Drops_Egg,Drops Egg,7,20,,0,,,,,,,,,,,{},{}
+9003,Poporing_Egg,Poporing Egg,7,20,,0,,,,,,,,,,,{},{}
+9004,Lunatic_Egg,Lunatic Egg,7,20,,0,,,,,,,,,,,{},{}
+9005,Picky_Egg,Picky Egg,7,20,,0,,,,,,,,,,,{},{}
+9006,Chonchon_Egg,Chonchon Egg,7,20,,0,,,,,,,,,,,{},{}
+9007,Steel_Chonchon_Egg,Steel Chonchon Egg,7,20,,0,,,,,,,,,,,{},{}
+9008,Hunter_Fly_Egg,Hunter Fly Egg,7,20,,0,,,,,,,,,,,{},{}
+9009,Savage_Babe_Egg,Savage Babe Egg,7,20,,0,,,,,,,,,,,{},{}
+9010,Baby_Desert_Wolf_Egg,Baby Desert Wolf Egg,7,20,,0,,,,,,,,,,,{},{}
+9011,Rocker_Egg,Rocker Egg,7,20,,0,,,,,,,,,,,{},{}
+9012,Spore_Egg,Spore Egg,7,20,,0,,,,,,,,,,,{},{}
+9013,Poison_Spore_Egg,Poison Spore Egg,7,20,,0,,,,,,,,,,,{},{}
+9014,PecoPeco_Egg,PecoPeco Egg,7,20,,0,,,,,,,,,,,{},{}
+9015,Smokie_Egg,Smokie Egg,7,20,,0,,,,,,,,,,,{},{}
+9016,Yoyo_Egg,Yoyo Egg,7,20,,0,,,,,,,,,,,{},{}
+9017,Orc_Warrior_Egg,Orc Warrior Egg,7,20,,0,,,,,,,,,,,{},{}
+9018,Munak_Egg,Munak Egg,7,20,,0,,,,,,,,,,,{},{}
+9019,Dokkaebi_Egg,Dokkaebi Egg,7,20,,0,,,,,,,,,,,{},{}
+9020,Sohee_Egg,Sohee Egg,7,20,,0,,,,,,,,,,,{},{}
+9021,Isis_Egg,Isis Egg,7,20,,0,,,,,,,,,,,{},{}
+9022,Green_Petite_Egg,Green Petite Egg,7,20,,0,,,,,,,,,,,{},{}
+9023,Deviruchi_Egg,Deviruchi Egg,7,20,,0,,,,,,,,,,,{},{}
+9024,Bapho_Jr._Egg,Bapho Jr. Egg,7,20,,0,,,,,,,,,,,{},{}
+9025,Bongun_Egg,Bongun Egg,7,20,,0,,,,,,,,,,,{},{}
+9026,Alice_Egg,Alice Egg,7,20,,0,,,,,,,,,,,{},{}
+9027,Zherlthsh_Egg,Zherlthsh Egg,7,20,,0,,,,,,,,,,,{},{}
+9028,test_Egg,Test Egg,7,20,,0,,,,,,,,,,,{},{}
+9029,test_Egg_,Test Egg,7,20,,0,,,,,,,,,,,{},{}
+
+// Pet Accessories
+//===================================================================
+10001,Skull_Helm,Skull Helm,8,20,,0,,,,,,,,,,,{},{}
+10002,Monster_Oxygen_Mask,Monster Oxygen Mask,8,20,,0,,,,,,,,,,,{},{}
+10003,Transparent_Head_Protector,Transparent Headgear,8,20,,0,,,,,,,,,,,{},{}
+10004,Pacifier,Pacifier,8,20,,0,,,,,,,,,,,{},{}
+10005,Wig,Wig,8,20,,0,,,,,,,,,,,{},{}
+10006,Queen's_Hair_Ornament,Queen's Hair Ornament,8,20,,0,,,,,,,,,,,{},{}
+10007,Silk_Ribbon,Silk Ribbon,8,20,,0,,,,,,,,,,,{},{}
+10008,Punisher,Punisher,8,20,,0,,,,,,,,,,,{},{}
+10009,Wild_Flower,Wild Flower,8,20,,0,,,,,,,,,,,{},{}
+10010,Battered_Pot,Battered Pot,8,20,,0,,,,,,,,,,,{},{}
+10011,Stellar_Hairpin,Stellar Hairpin,8,20,,0,,,,,,,,,,,{},{}
+10012,Tiny_Egg_Shell,Tiny Egg Shell,8,20,,0,,,,,,,,,,,{},{}
+10013,Backpack,Backpack,8,1500,,0,,,,,,,,,,,{},{}
+10014,Rocker_Glasses,Rocker Glasses,8,2000,,0,,,,,,,,,,,{},{}
+10015,Green_Lace,Green Lace,8,20,,0,,,,,,,,,,,{},{}
+10016,Golden_Bell,Golden Bell,8,20,,0,,,,,,,,,,,{},{}
+10017,Bark_Shorts,Bark Shorts,8,20,,0,,,,,,,,,,,{},{}
+10018,Monkey_Circlet,Monkey Circlet,8,20,,0,,,,,,,,,,,{},{}
+10019,Red_Muffler,Red Muffler,8,20,,0,,,,,,,,,,,{},{}
+10020,Sword_of_Chinese_Exorcist,Sword of Chinese Exorcist,8,20,,0,,,,,,,,,,,{},{}
+
+// History books
+//===================================================================
+11000,Prontera_History_Book,Prontera History Book,3,20,,0,,,,,,,,,,,{},{}
+//11001,Poetry_Anthology,Poetry Anthology,3,20,,0,,,,,,,,,,,{},{}
+11001,Izlude_History_Book,Izlude History Book,3,,,0,,,,,,,,,,,{},{}
+//11002,Novel,Novel,3,20,,0,,,,,,,,,,,{},{}
+11002,Yuno_History_Book,Yuno History Book,3,,,0,,,,,,,,,,,{},{}
+11003,Geffen_History_Book,Geffen History Book,3,,,0,,,,,,,,,,,{},{}
+11004,Aldebaran_History_Book,Aldebaran History Book,3,,,0,,,,,,,,,,,{},{}
+11005,Alberta_History_Book,Alberta History Book,3,,,0,,,,,,,,,,,{},{}
+11006,Payon_History_Book,Payon History Book,3,,,0,,,,,,,,,,,{},{}
+11007,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
+11008,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
+11009,History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
+11010,Archer_Village_History_Book,Unknown Item,3,,,0,,,,,,,,,,,{},{}
+11011,Lutie_History_Book,Luite History Book,3,,,0,,,,,,,,,,,{},{}
+11012,Jawaii_History_Book,Jawaii History Book,3,,,0,,,,,,,,,,,{},{}
+11013,Gonryun_History_Book,Gonryun History Book,3,,,0,,,,,,,,,,,{},{}
+11014,Mjolnir_History_Book,Mjolnir History Book,3,,,0,,,,,,,,,,,{},{}
+11015,Amatsu_History_Book,Amatsu History Book,3,,,0,,,,,,,,,,,{},{}
+11016,Umbala_History_Book,Umbala History Book,3,,,0,,,,,,,,,,,{},{}
+11017,Nifleheim_History_Book,Nifflheim History Book,3,,,0,,,,,,,,,,,{},{}
+11018,Morroc_History_Book,Morroc History Book,3,,,0,,,,,,,,,,,{},{}
+11019,Comodo_History_Book,Comodo History Book,3,,,0,,,,,,,,,,,{},{}
11020,Louyang_History_Book,Louyang History Book,3,,,0,,,,,,,,,,,{},{} \ No newline at end of file
diff --git a/db/item_giftbox.txt b/db/item_giftbox.txt
index 0a898ef09..9e7751d6e 100644
--- a/db/item_giftbox.txt
+++ b/db/item_giftbox.txt
@@ -1,80 +1,80 @@
-// ƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
-// nameid, item_name(dummy), rate
-// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-0,Rough Oridecon,756
-756,Rough Oridecon,50000
-757,Rough Elunium,20000
-984,Oridecon,20000
-985,Elunium,10000
-714,Emperium,10000
-999,Steel,10000
-1000,Star Crumb,10000
-994,Flame Heart,10000
-995,Mystic Frozen,10000
-996,Rough Wind,10000
-997,Great Nature,10000
-975,Scarlet Dyestuffs,10000
-976,Lemon Dyestuffs,10000
-978,Cobaltblue Dyestuff,10000
-979,Darkgreen Dyestuff,10000
-980,Orange Dyestuff,10000
-981,Violet Dyestuff,10000
-982,White Dyestuff,10000
-983,Black Dyestuff,10000
-969,Gold,10000
-718,Garnet,10000
-719,Amethyst,10000
-720,Aquamarine,10000
-721,Emerald,10000
-722,Pearl,10000
-723,Ruby,10000
-724,Cursed Ruby,10000
-725,Sardonyx,10000
-726,Sapphire,10000
-727,Opal,10000
-728,Topaz,10000
-729,Zircon,10000
-730,1 Carat Diamond,10000
-731,2 Carat Diamond,10000
-732,3 Carat Diamond,10000
-733,Cracked Diamond,10000
-734,Red Frame,10000
-735,Chung Jah,10000
-736,China,10000
-737,Black Ladle,10000
-738,Pencil Case,10000
-739,Rouge,10000
-740,Puppet,10000
-741,Poring Doll,10000
-742,Chonchon Doll,10000
-743,Spore Doll,10000
-744,Bouquet,10000
-745,Wedding Bouquet,10000
-746,Glass Bead,10000
-747,Crystal Mirror,10000
-748,Witherless Rose,10000
-749,Frozen Rose,10000
-750,Baphomet Doll,10000
-751,Osiris Doll,10000
-752,Grasshopper Doll,10000
-753,Yoyo Doll,10000
-754,Raccoon Doll,10000
-706,Four-Leaf Clover,10000
-4005,Santa Poring Card,10000
-7034,Red Socks with Holes,10000
-501,Red Potion,10000
-502,Orange Potion,10000
-503,Yellow Potion,10000
-504,White Potion,10000
-505,Blue Potion,10000
-506,Green Potion,10000
-526,Royal Jelly,10000
-529,Candy,10000
-530,Candy Cane,10000
-537,Pet Food,10000
-538,Well-baked Cookie,10000
-539,Piece of Cake,10000
-603,Old Blue Box,10000
-617,Old Violet Box,10000
-644,Gift Box,190000
+// ƒvƒŒƒ[ƒ“ƒgƒ{ƒbƒNƒX‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
+// nameid, item_name(dummy), rate
+// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+0,Rough Oridecon,756
+756,Rough Oridecon,50000
+757,Rough Elunium,20000
+984,Oridecon,20000
+985,Elunium,10000
+714,Emperium,10000
+999,Steel,10000
+1000,Star Crumb,10000
+994,Flame Heart,10000
+995,Mystic Frozen,10000
+996,Rough Wind,10000
+997,Great Nature,10000
+975,Scarlet Dyestuffs,10000
+976,Lemon Dyestuffs,10000
+978,Cobaltblue Dyestuff,10000
+979,Darkgreen Dyestuff,10000
+980,Orange Dyestuff,10000
+981,Violet Dyestuff,10000
+982,White Dyestuff,10000
+983,Black Dyestuff,10000
+969,Gold,10000
+718,Garnet,10000
+719,Amethyst,10000
+720,Aquamarine,10000
+721,Emerald,10000
+722,Pearl,10000
+723,Ruby,10000
+724,Cursed Ruby,10000
+725,Sardonyx,10000
+726,Sapphire,10000
+727,Opal,10000
+728,Topaz,10000
+729,Zircon,10000
+730,1 Carat Diamond,10000
+731,2 Carat Diamond,10000
+732,3 Carat Diamond,10000
+733,Cracked Diamond,10000
+734,Red Frame,10000
+735,Chung Jah,10000
+736,China,10000
+737,Black Ladle,10000
+738,Pencil Case,10000
+739,Rouge,10000
+740,Puppet,10000
+741,Poring Doll,10000
+742,Chonchon Doll,10000
+743,Spore Doll,10000
+744,Bouquet,10000
+745,Wedding Bouquet,10000
+746,Glass Bead,10000
+747,Crystal Mirror,10000
+748,Witherless Rose,10000
+749,Frozen Rose,10000
+750,Baphomet Doll,10000
+751,Osiris Doll,10000
+752,Grasshopper Doll,10000
+753,Yoyo Doll,10000
+754,Raccoon Doll,10000
+706,Four-Leaf Clover,10000
+4005,Santa Poring Card,10000
+7034,Red Socks with Holes,10000
+501,Red Potion,10000
+502,Orange Potion,10000
+503,Yellow Potion,10000
+504,White Potion,10000
+505,Blue Potion,10000
+506,Green Potion,10000
+526,Royal Jelly,10000
+529,Candy,10000
+530,Candy Cane,10000
+537,Pet Food,10000
+538,Well-baked Cookie,10000
+539,Piece of Cake,10000
+603,Old Blue Box,10000
+617,Old Violet Box,10000
+644,Gift Box,190000
diff --git a/db/item_noequip.txt b/db/item_noequip.txt
index 5b62c4f89..5eb369733 100644
--- a/db/item_noequip.txt
+++ b/db/item_noequip.txt
@@ -1,4 +1,4 @@
-// The equipment restriction file
-// here equipment at PvP and GvG
-// where it is possible to restrict, the prescribed form: < ItemID> < Mode>
-// mode = 1- So with PvP restriction, 2- GvG restriction, 3- PvP and GvG which restriction
+// The equipment restriction file
+// here equipment at PvP and GvG
+// where it is possible to restrict, the prescribed form: < ItemID> < Mode>
+// mode = 1- So with PvP restriction, 2- GvG restriction, 3- PvP and GvG which restriction
diff --git a/db/item_scroll.txt b/db/item_scroll.txt
index 7a473ff9c..00b503866 100644
--- a/db/item_scroll.txt
+++ b/db/item_scroll.txt
@@ -1,5 +1,5 @@
-// ŒÃ‚¢Šª•¨‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
-// nameid, item_name(dummy), rate
-// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-0,Jellopy,909
+// ŒÃ‚¢Šª•¨‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
+// nameid, item_name(dummy), rate
+// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+0,Jellopy,909
diff --git a/db/item_violetbox.txt b/db/item_violetbox.txt
index 02cdae97c..c7f442af7 100644
--- a/db/item_violetbox.txt
+++ b/db/item_violetbox.txt
@@ -1,277 +1,277 @@
-// ŒÃ‚¢Ž‡F‚Ì” ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
-// nameid, item_name(dummy), rate
-// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-0,Guard,2102
-2102,Guard,10000
-2104,Buckler,10000
-2106,Shield,10000
-2108,Mirror Shield,10000
-2207,Fancy Flower,10000
-2209,Ribbon,10000
-2213,Kitty Band,10000
-2215,Flower Band,10000
-2217,Biretta,10000
-2221,Hat,10000
-2223,Turban,10000
-2227,Cap,10000
-2229,Helm,10000
-2231,Gemmed Sallet,10000
-2233,Circlet,10000
-2236,Santa's Hat,10000
-2244,Big Ribbon,10000
-2249,Coronet,10000
-2250,Cute Ribbon,10000
-2257,Snow Horn,10000
-2258,Spiky Band,10000
-2262,Pierrot Nose,10000
-2263,Zorro Masque,10000
-2265,Gangster Mask,10000
-2269,Centimental Flower,10000
-2270,Centimental Leaf,10000
-2271,Jack a Dandy,10000
-2272,Stop Post,10000
-2273,Doctor Band,10000
-2275,Red Bandana,10000
-2276,Eagle Eyes,10000
-2279,Bomb Wick,10000
-2284,Antler,10000
-2287,Pirate Bandana,10000
-2289,Poo Poo Hat,10000
-2290,Funeral Hat,10000
-2291,Masquerade,10000
-2293,Pretend Murdered,10000
-2294,Stellar,10000
-2295,Blinker,10000
-2296,Binoculars,10000
-2298,Green Feeler,10000
-2299,Viking Helm,10000
-2302,Cotton Shirt,10000
-2304,Leather Jacket,10000
-2306,Adventurer's Suit,10000
-2308,Mantle,10000
-2310,Coat,10000
-2311,Mink Coat,10000
-2313,Padded Armor,10000
-2315,Chain Mail,10000
-2317,Full Plate,10000
-2322,Silk Robe,10000
-2324,Scapulare,10000
-2326,Saint's Robe,10000
-2329,Wooden Mail,10000
-2331,Tights,10000
-2333,Silver Robe,10000
-2336,Thief Clothes,10000
-2337,Ninja Suit,10000
-2338,Wedding Dress,10000
-2339,Pantie,10000
-2402,Sandals,10000
-2404,Shoes,10000
-2407,Crystal Pumps,10000
-2408,Ball'n'Chain,10000
-2409,Highheals,10000
-2502,Hood,10000
-2504,Muffler,10000
-2506,Manteau,10000
-2507,Cape of Old Marquess,10000
-2508,Ragamuffin Manteau,10000
-2601,Ring,10000
-2602,Earring,10000
-2603,Necklace,10000
-2604,Glove,10000
-2605,Brooch,10000
-2607,Clip,10000
-2608,Rosary,10000
-2609,Skull Ring,10000
-2610,Gold Ring,10000
-2611,Silver Ring,10000
-2612,Flower Ring,10000
-2613,Diamond Ring,10000
-5008,Puppy Love,10000
-5009,Safety Helmet,10000
-5010,Indian Fillet,10000
-5014,Fin Helm,10000
-5015,Egg Shell,10000
-2225,Goggles,10000
-1117,Katana,10000
-1152,Slayer,10000
-1155,Bastard Sword,10000
-1158,Two-handed Sword,10000
-1162,Broad Sword,10000
-1163,Claymore,10000
-1352,Battle Axe,10000
-1355,Hammer,10000
-1358,Buster,10000
-1361,Two-handed Axe,10000
-1452,Guisarme,10000
-1455,Glaive,10000
-1458,Partizan,10000
-1461,Trident,10000
-1464,Halberd,10000
-1410,Lance,10000
-1251,Jur,10000
-1253,Katar,10000
-1255,Jamadhar,10000
-1702,Bow,10000
-1705,Composite Bow,10000
-1718,Hunter Bow,10000
-1711,Cross Bow,10000
-1719,Roguemaster's Bow,10000
-1713,Arbalest,10000
-1714,Gakkung,10000
-701,Ora Ora,10000
-702,Animal Gore,10000
-703,Hinalle,10000
-704,Aloe,10000
-706,Four-Leaf Clover,10000
-707,Singing Plant,10000
-708,Ment,10000
-710,Illusion Flower,10000
-714,Emperium,10000
-715,Yellow Gemstone,10000
-716,Red Gemstone,10000
-717,Blue Gemstone,10000
-718,Garnet,10000
-719,Amethyst,10000
-720,Aquamarine,10000
-721,Emerald,10000
-722,Pearl,10000
-723,Ruby,10000
-724,Cursed Ruby,10000
-725,Sardonyx,10000
-726,Sapphire,10000
-727,Opal,10000
-728,Topaz,10000
-729,Zircon,10000
-730,1 Carat Diamond,10000
-731,2 Carat Diamond,10000
-732,3 Carat Diamond,10000
-733,Cracked Diamond,10000
-734,Red Frame,10000
-735,Chung Jah,10000
-736,China,10000
-737,Black Ladle,10000
-738,Pencil Case,10000
-740,Puppet,10000
-741,Poring Doll,10000
-742,Chonchon Doll,10000
-743,Spore Doll,10000
-745,Wedding Bouquet,10000
-747,Crystal Mirror,10000
-748,Witherless Rose,10000
-749,Frozen Rose,10000
-752,Grasshopper Doll,10000
-753,Yoyo Doll,10000
-754,Raccoon Doll,10000
-756,Rough Oridecon,10000
-757,Rough Elunium,10000
-909,Jellopy,10000
-910,Garlet,10000
-911,Scell,10000
-912,Zargon,10000
-931,Orcish Voucher,10000
-934,Memento,10000
-968,Heroic Emblem,10000
-969,Gold,10000
-970,Alcohol,10000
-971,Detrimindexta,10000
-972,Karvodailnirol,10000
-973,Counteragent,10000
-974,Mixture,10000
-975,Scarlet Dyestuffs,10000
-976,Lemon Dyestuffs,10000
-978,Cobaltblue Dyestuff,10000
-979,Darkgreen Dyestuff,10000
-980,Orange Dyestuff,10000
-981,Violet Dyestuff,10000
-982,White Dyestuff,10000
-983,Black Dyestuff,10000
-984,Oridecon,10000
-985,Elunium,10000
-986,Anvil,10000
-987,Oridecon Anvil,10000
-988,Golden Anvil,10000
-989,Emperium Anvil,10000
-990,Red Blood,10000
-991,Crystal Blue,10000
-992,Wind of Verdure,10000
-993,Green Live,10000
-994,Flame Heart,10000
-995,Mystic Frozen,10000
-996,Rough Wind,10000
-997,Great Nature,10000
-998,Iron,10000
-999,Steel,10000
-1000,Star Crumb,10000
-1001,Star Dust,10000
-1002,Iron Ore,10000
-1003,Coal,10000
-1004,Chivalry Emblem,10000
-1005,Hammer of Blacksmith,10000
-1006,Old Magic Book,10000
-1007,Necklace of Wisdom,10000
-1008,Necklace of Oblivion,10000
-1009,Hand of God,10000
-1010,Phracon,10000
-1011,Emveretarcon,10000
-1065,Trap,10000
-501,Red Potion,10000
-502,Orange Potion,10000
-503,Yellow Potion,10000
-504,White Potion,10000
-505,Blue Potion,10000
-506,Green Potion,10000
-518,Honey,10000
-520,Hinalle Leaflet,10000
-521,Aloe Leaflet,20000
-525,Panacea,10000
-526,Royal Jelly,10000
-529,Candy,10000
-530,Candy Cane,10000
-603,Old Blue Box,400000
-604,Dead Branch,90000
-605,Anodyne,10000
-606,Aloevera,10000
-607,Yggdrasilberry,10000
-608,Yggdrasil Seed,10000
-610,Yggdrasil Leaf,10000
-612,Mini Furnace,50000
-613,Iron Hammer,10000
-614,Golden Hammer,10000
-615,Oridecon Hammer,10000
-1102,Sword,10000
-1105,Falchion,10000
-1108,Blade,10000
-1111,Rapier,10000
-1114,Scimiter,10000
-1120,Tsurugi,10000
-1125,Ring Pommel Saber,10000
-1127,Saber,10000
-1128,Haedonggum,10000
-1129,Flamberge,10000
-1202,Knife,10000
-1205,Cutter,10000
-1208,Main Gauche,10000
-1211,Dirk,10000
-1214,Dagger,10000
-1217,Stiletto,10000
-1220,Gladius,10000
-1226,Damascus,10000
-1302,Axe,10000
-1402,Javelin,10000
-1405,Spear,10000
-1408,Pike,10000
-1502,Club,10000
-1505,Mace,10000
-1508,Smasher,10000
-1511,Flail,10000
-1514,Morning Star,10000
-1517,Sword Mace,10000
-1520,Chain,10000
-1550,Book,10000
-1551,Bible,10000
-1602,Rod,10000
-1605,Wand,10000
-1608,Staff,10000
-1611,Arc Wand,10000
-1613,Mighty Staff,10000
+// ŒÃ‚¢Ž‡F‚Ì” ‚©‚瓾‚ç‚ê‚éƒAƒCƒeƒ€‚ðÝ’èB
+// nameid, item_name(dummy), rate
+// ƒAƒCƒeƒ€IDAƒAƒCƒeƒ€‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒAƒCƒeƒ€ID‚ª0‚Ìꇊm—¦‚ðƒAƒCƒeƒ€‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É“¾‚ç‚ê‚éƒfƒtƒHƒ‹ƒgƒAƒCƒeƒ€‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+0,Guard,2102
+2102,Guard,10000
+2104,Buckler,10000
+2106,Shield,10000
+2108,Mirror Shield,10000
+2207,Fancy Flower,10000
+2209,Ribbon,10000
+2213,Kitty Band,10000
+2215,Flower Band,10000
+2217,Biretta,10000
+2221,Hat,10000
+2223,Turban,10000
+2227,Cap,10000
+2229,Helm,10000
+2231,Gemmed Sallet,10000
+2233,Circlet,10000
+2236,Santa's Hat,10000
+2244,Big Ribbon,10000
+2249,Coronet,10000
+2250,Cute Ribbon,10000
+2257,Snow Horn,10000
+2258,Spiky Band,10000
+2262,Pierrot Nose,10000
+2263,Zorro Masque,10000
+2265,Gangster Mask,10000
+2269,Centimental Flower,10000
+2270,Centimental Leaf,10000
+2271,Jack a Dandy,10000
+2272,Stop Post,10000
+2273,Doctor Band,10000
+2275,Red Bandana,10000
+2276,Eagle Eyes,10000
+2279,Bomb Wick,10000
+2284,Antler,10000
+2287,Pirate Bandana,10000
+2289,Poo Poo Hat,10000
+2290,Funeral Hat,10000
+2291,Masquerade,10000
+2293,Pretend Murdered,10000
+2294,Stellar,10000
+2295,Blinker,10000
+2296,Binoculars,10000
+2298,Green Feeler,10000
+2299,Viking Helm,10000
+2302,Cotton Shirt,10000
+2304,Leather Jacket,10000
+2306,Adventurer's Suit,10000
+2308,Mantle,10000
+2310,Coat,10000
+2311,Mink Coat,10000
+2313,Padded Armor,10000
+2315,Chain Mail,10000
+2317,Full Plate,10000
+2322,Silk Robe,10000
+2324,Scapulare,10000
+2326,Saint's Robe,10000
+2329,Wooden Mail,10000
+2331,Tights,10000
+2333,Silver Robe,10000
+2336,Thief Clothes,10000
+2337,Ninja Suit,10000
+2338,Wedding Dress,10000
+2339,Pantie,10000
+2402,Sandals,10000
+2404,Shoes,10000
+2407,Crystal Pumps,10000
+2408,Ball'n'Chain,10000
+2409,Highheals,10000
+2502,Hood,10000
+2504,Muffler,10000
+2506,Manteau,10000
+2507,Cape of Old Marquess,10000
+2508,Ragamuffin Manteau,10000
+2601,Ring,10000
+2602,Earring,10000
+2603,Necklace,10000
+2604,Glove,10000
+2605,Brooch,10000
+2607,Clip,10000
+2608,Rosary,10000
+2609,Skull Ring,10000
+2610,Gold Ring,10000
+2611,Silver Ring,10000
+2612,Flower Ring,10000
+2613,Diamond Ring,10000
+5008,Puppy Love,10000
+5009,Safety Helmet,10000
+5010,Indian Fillet,10000
+5014,Fin Helm,10000
+5015,Egg Shell,10000
+2225,Goggles,10000
+1117,Katana,10000
+1152,Slayer,10000
+1155,Bastard Sword,10000
+1158,Two-handed Sword,10000
+1162,Broad Sword,10000
+1163,Claymore,10000
+1352,Battle Axe,10000
+1355,Hammer,10000
+1358,Buster,10000
+1361,Two-handed Axe,10000
+1452,Guisarme,10000
+1455,Glaive,10000
+1458,Partizan,10000
+1461,Trident,10000
+1464,Halberd,10000
+1410,Lance,10000
+1251,Jur,10000
+1253,Katar,10000
+1255,Jamadhar,10000
+1702,Bow,10000
+1705,Composite Bow,10000
+1718,Hunter Bow,10000
+1711,Cross Bow,10000
+1719,Roguemaster's Bow,10000
+1713,Arbalest,10000
+1714,Gakkung,10000
+701,Ora Ora,10000
+702,Animal Gore,10000
+703,Hinalle,10000
+704,Aloe,10000
+706,Four-Leaf Clover,10000
+707,Singing Plant,10000
+708,Ment,10000
+710,Illusion Flower,10000
+714,Emperium,10000
+715,Yellow Gemstone,10000
+716,Red Gemstone,10000
+717,Blue Gemstone,10000
+718,Garnet,10000
+719,Amethyst,10000
+720,Aquamarine,10000
+721,Emerald,10000
+722,Pearl,10000
+723,Ruby,10000
+724,Cursed Ruby,10000
+725,Sardonyx,10000
+726,Sapphire,10000
+727,Opal,10000
+728,Topaz,10000
+729,Zircon,10000
+730,1 Carat Diamond,10000
+731,2 Carat Diamond,10000
+732,3 Carat Diamond,10000
+733,Cracked Diamond,10000
+734,Red Frame,10000
+735,Chung Jah,10000
+736,China,10000
+737,Black Ladle,10000
+738,Pencil Case,10000
+740,Puppet,10000
+741,Poring Doll,10000
+742,Chonchon Doll,10000
+743,Spore Doll,10000
+745,Wedding Bouquet,10000
+747,Crystal Mirror,10000
+748,Witherless Rose,10000
+749,Frozen Rose,10000
+752,Grasshopper Doll,10000
+753,Yoyo Doll,10000
+754,Raccoon Doll,10000
+756,Rough Oridecon,10000
+757,Rough Elunium,10000
+909,Jellopy,10000
+910,Garlet,10000
+911,Scell,10000
+912,Zargon,10000
+931,Orcish Voucher,10000
+934,Memento,10000
+968,Heroic Emblem,10000
+969,Gold,10000
+970,Alcohol,10000
+971,Detrimindexta,10000
+972,Karvodailnirol,10000
+973,Counteragent,10000
+974,Mixture,10000
+975,Scarlet Dyestuffs,10000
+976,Lemon Dyestuffs,10000
+978,Cobaltblue Dyestuff,10000
+979,Darkgreen Dyestuff,10000
+980,Orange Dyestuff,10000
+981,Violet Dyestuff,10000
+982,White Dyestuff,10000
+983,Black Dyestuff,10000
+984,Oridecon,10000
+985,Elunium,10000
+986,Anvil,10000
+987,Oridecon Anvil,10000
+988,Golden Anvil,10000
+989,Emperium Anvil,10000
+990,Red Blood,10000
+991,Crystal Blue,10000
+992,Wind of Verdure,10000
+993,Green Live,10000
+994,Flame Heart,10000
+995,Mystic Frozen,10000
+996,Rough Wind,10000
+997,Great Nature,10000
+998,Iron,10000
+999,Steel,10000
+1000,Star Crumb,10000
+1001,Star Dust,10000
+1002,Iron Ore,10000
+1003,Coal,10000
+1004,Chivalry Emblem,10000
+1005,Hammer of Blacksmith,10000
+1006,Old Magic Book,10000
+1007,Necklace of Wisdom,10000
+1008,Necklace of Oblivion,10000
+1009,Hand of God,10000
+1010,Phracon,10000
+1011,Emveretarcon,10000
+1065,Trap,10000
+501,Red Potion,10000
+502,Orange Potion,10000
+503,Yellow Potion,10000
+504,White Potion,10000
+505,Blue Potion,10000
+506,Green Potion,10000
+518,Honey,10000
+520,Hinalle Leaflet,10000
+521,Aloe Leaflet,20000
+525,Panacea,10000
+526,Royal Jelly,10000
+529,Candy,10000
+530,Candy Cane,10000
+603,Old Blue Box,400000
+604,Dead Branch,90000
+605,Anodyne,10000
+606,Aloevera,10000
+607,Yggdrasilberry,10000
+608,Yggdrasil Seed,10000
+610,Yggdrasil Leaf,10000
+612,Mini Furnace,50000
+613,Iron Hammer,10000
+614,Golden Hammer,10000
+615,Oridecon Hammer,10000
+1102,Sword,10000
+1105,Falchion,10000
+1108,Blade,10000
+1111,Rapier,10000
+1114,Scimiter,10000
+1120,Tsurugi,10000
+1125,Ring Pommel Saber,10000
+1127,Saber,10000
+1128,Haedonggum,10000
+1129,Flamberge,10000
+1202,Knife,10000
+1205,Cutter,10000
+1208,Main Gauche,10000
+1211,Dirk,10000
+1214,Dagger,10000
+1217,Stiletto,10000
+1220,Gladius,10000
+1226,Damascus,10000
+1302,Axe,10000
+1402,Javelin,10000
+1405,Spear,10000
+1408,Pike,10000
+1502,Club,10000
+1505,Mace,10000
+1508,Smasher,10000
+1511,Flail,10000
+1514,Morning Star,10000
+1517,Sword Mace,10000
+1520,Chain,10000
+1550,Book,10000
+1551,Bible,10000
+1602,Rod,10000
+1605,Wand,10000
+1608,Staff,10000
+1611,Arc Wand,10000
+1613,Mighty Staff,10000
diff --git a/db/job_db1.txt b/db/job_db1.txt
index 9af567782..bb8d39f40 100644
--- a/db/job_db1.txt
+++ b/db/job_db1.txt
@@ -1,70 +1,70 @@
-//Rows: NOV,SWO,MAG,ARC,ACO,MER,THI,KNI,PRI,WIZ,BLA,HUN,ASS,KNIp,CRU,MON,SAG,ROG,ALC,BAR,DAN,CRUp,WED,SNV
-//weg,hpfac,hpmul,spfac,fist ,dagge,1hswr,2hswr,1hspr,2hspr,1haxe,2haxe,mace ,??? ,Rod ,Bow ,Knuck,Instu,whip ,Book ,Katar
-20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
-24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
-24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
-24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
-27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
-28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,195 ,500 ,390 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,97.5 ,500 ,1040 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
-24000,71.5 ,500 ,1170 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,117 ,500 ,520 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,110.5,500 ,520 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,143 ,500 ,520 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-28000,195 ,500 ,390 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,143 ,700 ,611 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,117 ,650 ,611 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
-24000,97.5 ,500 ,910 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
-24000,110.5,500 ,650 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,117 ,500 ,520 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,97.5 ,300 ,780 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
-27000,97.5 ,300 ,780 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
-28000,143 ,700 ,611 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
-24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
-24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
-28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
-24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
-24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
-30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
-27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
-27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
+//Rows: NOV,SWO,MAG,ARC,ACO,MER,THI,KNI,PRI,WIZ,BLA,HUN,ASS,KNIp,CRU,MON,SAG,ROG,ALC,BAR,DAN,CRUp,WED,SNV
+//weg,hpfac,hpmul,spfac,fist ,dagge,1hswr,2hswr,1hspr,2hspr,1haxe,2haxe,mace ,??? ,Rod ,Bow ,Knuck,Instu,whip ,Book ,Katar
+20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
+24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
+24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
+24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
+27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
+28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+20000,0 ,500 ,100 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,195 ,500 ,390 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,97.5 ,500 ,1040 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
+24000,71.5 ,500 ,1170 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,117 ,500 ,520 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,110.5,500 ,520 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,143 ,500 ,520 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+28000,195 ,500 ,390 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,143 ,700 ,611 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,117 ,650 ,611 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
+24000,97.5 ,500 ,910 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
+24000,110.5,500 ,650 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,117 ,500 ,520 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,97.5 ,300 ,780 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
+27000,97.5 ,300 ,780 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
+28000,143 ,700 ,611 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+20000,0 ,500 ,100 ,500 ,650 ,700 ,2000 ,2000 ,2000 ,800 ,2000 ,700 ,700 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,70 ,500 ,200 ,400 ,500 ,550 ,600 ,650 ,700 ,700 ,750 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+22000,30 ,500 ,600 ,500 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,50 ,500 ,200 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,700 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,40 ,500 ,500 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,40 ,500 ,300 ,400 ,600 ,700 ,2000 ,2000 ,2000 ,700 ,750 ,700 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,50 ,500 ,200 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,75 ,500 ,800 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,600 ,600 ,2000 ,2000 ,2000 ,2000 ,600 ,2000
+24000,55 ,500 ,900 ,500 ,575 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,90 ,500 ,400 ,400 ,600 ,650 ,2000 ,2000 ,2000 ,650 ,650 ,675 ,675 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,85 ,500 ,400 ,400 ,600 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,600 ,2000 ,2000 ,2000 ,2000 ,2000
+24000,110 ,500 ,400 ,400 ,500 ,650 ,2000 ,2000 ,2000 ,800 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+28000,150 ,500 ,300 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+26000,90 ,650 ,470 ,400 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,575 ,575 ,575 ,2000 ,475 ,2000 ,2000 ,2000 ,2000
+24000,75 ,500 ,700 ,450 ,525 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625 ,2000 ,2000 ,2000 ,2000 ,550 ,2000
+24000,85 ,500 ,500 ,400 ,500 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,2000 ,2000 ,2000
+30000,90 ,500 ,400 ,400 ,550 ,575 ,2000 ,2000 ,2000 ,675 ,700 ,650 ,650 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
+27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,575 ,2000 ,2000 ,2000
+27000,75 ,300 ,600 ,400 ,550 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,650 ,2000 ,2000 ,575 ,2000 ,2000
28000,110 ,700 ,470 ,400 ,500 ,500 ,550 ,600 ,600 ,700 ,700 ,650 ,700 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 \ No newline at end of file
diff --git a/db/job_db2-2.txt b/db/job_db2-2.txt
index 4fc13c614..629e4e2da 100644
--- a/db/job_db2-2.txt
+++ b/db/job_db2-2.txt
@@ -1,26 +1,26 @@
-// job_bonus 0-non 1-str 2-agi 3-vit 4-int 5-dex 6-luk
-//x NV,SW,MG,AC,AL,MC,TF,KN,PR,WZ,BS,HT,AS,KNp,CR,MO,SA,RG,AM,BA,DC,CRp
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
-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
-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
-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
-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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
-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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
-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
-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
-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
-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,0,1,4,0,2,0,5,6,0,5,0,0,6,6,0,5,3,0,4,0,1,0,0,0,5,5,2,0,3,4,5,0,2,3,6,6,0,0,5
-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
-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
-1,2,6,5,3,1,1,1,0,2,5,3,4,3,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
-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,4,2
-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
-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
-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
-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
-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
-5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,5,5,0,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
-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,4,2
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+// job_bonus 0-non 1-str 2-agi 3-vit 4-int 5-dex 6-luk
+//x NV,SW,MG,AC,AL,MC,TF,KN,PR,WZ,BS,HT,AS,KNp,CR,MO,SA,RG,AM,BA,DC,CRp
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
+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
+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
+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
+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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
+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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
+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
+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
+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
+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,0,1,4,0,2,0,5,6,0,5,0,0,6,6,0,5,3,0,4,0,1,0,0,0,5,5,2,0,3,4,5,0,2,3,6,6,0,0,5
+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
+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
+1,2,6,5,3,1,1,1,0,2,5,3,4,3,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
+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,4,2
+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
+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
+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
+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
+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
+5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,5,5,0,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
+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,4,2
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/db/job_db2.txt b/db/job_db2.txt
index e5baf627b..f7e7d8025 100644
--- a/db/job_db2.txt
+++ b/db/job_db2.txt
@@ -1,71 +1,71 @@
-// job_bonus 0-non 1-str 2-agi 3-vit 4-int 5-dex 6-luk
-//x NV,SW,MG,AC,AL,MC,TF,KN,PR,WZ,BS,HT,AS,KNp,CR,MO,SA,RG,AM,BA,DC,CRp
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
-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
-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
-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
-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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
-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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
-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
-6,0,6,1,0,2,3,4,4,6,1,0,0,3,0,5,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
-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
-5,0,1,5,5,0,3,1,5,0,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
-5,0,4,5,6,1,0,5,0,1,1,2,0,5,6,0,3,0,2,2,5,0,3,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
-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
-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
-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
-1,1,0,5,0,2,3,0,0,2,0,1,1,6,0,4,0,2,0,3,0,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
-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,0,5,6,0,1,0,1,4,1,1,1,0,4
-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,0,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,0,4,5
-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,0,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
-5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,0,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
-6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,0,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
-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
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,0,2,3,0,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-0,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
-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
-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
-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
-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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
-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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
-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
-4,0,2,3,1,0,4,2,0,0,1,5,0,0,5,0,0,2,4,1,3,4,4,0,5,0,5,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
-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
-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,0,5,0,0,0,3,4,5,0,2,0,6,6,0,0,5
-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,5,4,0,0,4,3,0,6,2,0,5,1,6,0,0,4,0,0,0,5,6
-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,5,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,6
-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
-3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,6,1,0,0,3,0,6,2,0,1,0,0,5,4,0,0,1,0,0,6,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
-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,4,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
-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
-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
-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
-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,4,0,2,4,1
-5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,5,5,0,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
-3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,6,1,0,0,3,0,6,2,0,1,0,0,5,4,0,0,1,0,0,6,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
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
-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
-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
-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
-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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
-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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
-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
-6,0,6,1,0,2,3,4,4,6,1,0,0,3,0,5,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
-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
-5,0,1,5,5,0,3,1,5,0,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
-5,0,4,5,6,1,0,5,0,1,1,2,0,5,6,0,3,0,2,2,5,0,3,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
-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
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
-1,1,0,5,0,2,3,0,0,2,0,1,1,6,0,4,0,2,0,3,0,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
-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,0,5,6,0,1,0,1,4,1,1,1,0,4
-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,0,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,0,4,5
-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,0,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
-5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,0,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
-6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,0,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
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+// job_bonus 0-non 1-str 2-agi 3-vit 4-int 5-dex 6-luk
+//x NV,SW,MG,AC,AL,MC,TF,KN,PR,WZ,BS,HT,AS,KNp,CR,MO,SA,RG,AM,BA,DC,CRp
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
+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
+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
+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
+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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
+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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
+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
+6,0,6,1,0,2,3,4,4,6,1,0,0,3,0,5,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
+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
+5,0,1,5,5,0,3,1,5,0,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
+5,0,4,5,6,1,0,5,0,1,1,2,0,5,6,0,3,0,2,2,5,0,3,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
+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
+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
+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
+1,1,0,5,0,2,3,0,0,2,0,1,1,6,0,4,0,2,0,3,0,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
+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,0,5,6,0,1,0,1,4,1,1,1,0,4
+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,0,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,0,4,5
+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,0,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
+5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,0,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
+6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,0,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
+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
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,0,2,3,0,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,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
+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
+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
+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
+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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
+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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
+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
+4,0,2,3,1,0,4,2,0,0,1,5,0,0,5,0,0,2,4,1,3,4,4,0,5,0,5,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
+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
+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,0,5,0,0,0,3,4,5,0,2,0,6,6,0,0,5
+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,5,4,0,0,4,3,0,6,2,0,5,1,6,0,0,4,0,0,0,5,6
+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,5,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,6
+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
+3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,6,1,0,0,3,0,6,2,0,1,0,0,5,4,0,0,1,0,0,6,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
+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,4,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
+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
+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
+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
+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,4,0,2,4,1
+5,1,0,2,0,1,0,4,5,0,2,2,2,5,5,0,3,5,0,1,0,5,5,0,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
+3,1,2,0,0,5,4,2,3,1,0,5,0,4,3,2,6,1,0,0,3,0,6,2,0,1,0,0,5,4,0,0,1,0,0,6,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
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
+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
+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
+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
+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,2,0,0,6,0,5,0,1,0,5,0,1,0,6,3,0,1,5
+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,2,0,1,0,6,0,5,0,3,0,6,1,0,5,2
+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
+6,0,6,1,0,2,3,4,4,6,1,0,0,3,0,5,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
+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
+5,0,1,5,5,0,3,1,5,0,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
+5,0,4,5,6,1,0,5,0,1,1,2,0,5,6,0,3,0,2,2,5,0,3,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
+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
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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
+1,1,0,5,0,2,3,0,0,2,0,1,1,6,0,4,0,2,0,3,0,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
+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,0,5,6,0,1,0,1,4,1,1,1,0,4
+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,0,1,0,2,1,0,0,5,5,0,1,0,4,2,0,0,1,4,0,2,0,4,0,4,5
+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,0,0,1,0,3,0,4,0,2,0,0,1,0,2,0,0,0,2,2
+5,2,1,0,4,6,5,0,6,2,2,0,4,0,5,0,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
+6,2,1,0,4,5,6,0,5,2,2,0,4,0,6,0,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
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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_avail.txt b/db/mob_avail.txt
index f14e24d9e..0a079b507 100644
--- a/db/mob_avail.txt
+++ b/db/mob_avail.txt
@@ -1,43 +1,43 @@
-// for mobs
-// mob_id,sprite_id,equip #
-// Use another mob's sprite for a monster. 0 for sprite will disable mob.
-// 1001-2000 must be used for now as any other ID is invalid.
-// 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
-
-//1002,1039 //Poring,Baphomet (Make Porings look like Baphomet)
-
-// eAthena Dev Team
-1900,12,1,1,1,16,0,67,12,54,16,1
-1901,6,1,1,1,1,2,67,12,54,0,1
-1920,1047,0
-1921,1093,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,1058,10014
-1985,1063,10007
-1986,1077,10017
-1987,1101,10001
-1988,1107,10003
-1989,1109,10004
-1990,1110,10005
-1991,1113,10013
-1992,1155,10011
-1993,1167,10015
-1994,1170,10016
+// for mobs
+// mob_id,sprite_id,equip #
+// Use another mob's sprite for a monster. 0 for sprite will disable mob.
+// 1001-2000 must be used for now as any other ID is invalid.
+// 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
+
+//1002,1039 //Poring,Baphomet (Make Porings look like Baphomet)
+
+// eAthena Dev Team
+1900,12,1,1,1,16,0,67,12,54,16,1
+1901,6,1,1,1,1,2,67,12,54,0,1
+1920,1047,0
+1921,1093,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,1058,10014
+1985,1063,10007
+1986,1077,10017
+1987,1101,10001
+1988,1107,10003
+1989,1109,10004
+1990,1110,10005
+1991,1113,10013
+1992,1155,10011
+1993,1167,10015
+1994,1170,10016
1995,1188,10020 \ No newline at end of file
diff --git a/db/mob_boss.txt b/db/mob_boss.txt
index bf2a06dc2..3404fc97b 100644
--- a/db/mob_boss.txt
+++ b/db/mob_boss.txt
@@ -1,25 +1,25 @@
-// mob_branch.txt‚ÌMVPBOSS”Å
-// MobID, MobName(Dummy), Rate
-// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
-// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
-
-0,Baphomet,1039
-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
-1272,Dark Lord,1000000
-1312,Turtle General,1000000
-1373,Lord of Death,1000000
-1492,Incantation Samurai,1000000
+// mob_branch.txt‚ÌMVPBOSS”Å
+// MobID, MobName(Dummy), Rate
+// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
+// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
+
+0,Baphomet,1039
+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
+1272,Dark Lord,1000000
+1312,Turtle General,1000000
+1373,Lord of Death,1000000
+1492,Incantation Samurai,1000000
diff --git a/db/mob_branch.txt b/db/mob_branch.txt
index 2a58cdb6b..ba5c8721a 100644
--- a/db/mob_branch.txt
+++ b/db/mob_branch.txt
@@ -1,353 +1,353 @@
-// ŒÃ–Ø‚ÌŽ}‚Å¢Š«‚Å‚«‚郂ƒ“ƒXƒ^[‚ðÝ’è
-// MobID, MobDBName, MobName(Dummy), Rate
-// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
-// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
-
-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,Skeleton Archer,1000000
-1018,Creamy,1000000
-1019,PecoPeco,1000000
-1020,Mandragora,1000000
-1023,Orc Warrior,1000000
-1024,Worm Tail,1000000
-1025,Boa,1000000
-1026,Munak,1000000
-1028,Skeleton Soldier,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,Sidewinder,1000000
-1038,Osiris,1000000
-1039,Baphomet,1000000
-1040,Golem,1000000
-1041,Mummy,1000000
-1042,Steel ChonChon,1000000
-1044,Obeaune,1000000
-1045,Marc,1000000
-1046,Doppelganger,1000000
-1047,PecoPeco Egg,1000000
-1048,Thief Bug Egg,1000000
-1049,Picky,1000000
-1050,Shell Picky,1000000
-1051,Thief Bug Larva,1000000
-1052,Rocker,1000000
-1053,Thief Bug Female,1000000
-1054,Thief Bug Male,1000000
-1055,Muka,1000000
-1056,Smokie,1000000
-1057,Yoyo,1000000
-1058,Metaller,1000000
-1059,Mistress,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
-1076,Skeleton,1000000
-1077,Poison Spore,1000000
-1078,Red Plant,1000000
-1079,Blue Plant,1000000
-1080,Green Plant,1000000
-1081,Yellow Plant,1000000
-1083,Shining Plant,1000000
-1084,Black Mushroom,1000000
-1085,Red Mushroom,1000000
-1086,Golden Thief Bug,1000000
-1087,Orc Hero,1000000
-1088,Vocal,1000000
-1089,Toad,1000000
-1090,Mastering,1000000
-1091,Dragonfly,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,Desert Wolf Puppy,1000000
-1108,Deviace,1000000
-1109,Deviruchi,1000000
-1110,Dokebi,1000000
-1111,Drainliar,1000000
-1112,Drake,1000000
-1113,Drops,1000000
-1114,Dustiness,1000000
-1115,Eddga,1000000
-1116,Eggyra,1000000
-1117,Evil Druid,1000000
-1118,Flora,1000000
-1119,Frilldora,1000000
-1120,Ghostring,1000000
-1121,Giearth,1000000
-1122,Goblin 1,1000000
-1123,Goblin 2,1000000
-1124,Goblin 3,1000000
-1125,Goblin 4,1000000
-1126,Goblin 5,1000000
-1127,Hode,1000000
-1128,Horn,1000000
-1129,Horong,1000000
-1130,Jakk,1000000
-1131,Joker,1000000
-1132,Khalitzburg,1000000
-1133,Kobold 1,1000000
-1134,Kobold 2,1000000
-1135,Kobold 3,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
-1147,Maya,1000000
-1148,Medusa,1000000
-1149,Minorous,1000000
-1150,Moonlight Flower,1000000
-1151,Myst,1000000
-1152,Orc Skeleton,1000000
-1153,Orc Zombie,1000000
-1154,Pasana,1000000
-1155,Earth Petite,1000000
-1156,Sky Petite,1000000
-1157,Pharaoh,1000000
-1158,Phen,1000000
-1159,Phreeoni,1000000
-1160,Piere,1000000
-1161,Plankton,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
-1182,Thief Mushroom,1000000
-1183,Angry ChonChon,1000000
-1184,Angry Fabre,1000000
-1185,Whisper,1000000
-1186,Giant Whisper,1000000
-1188,Bon Gun,1000000
-1189,Orc Archer,1000000
-1190,Orc Lord,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
-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,Knight of Abyss,1000000
-1242,Marin,1000000
-1243,Sasquatch,1000000
-1245,Christmas Goblin,1000000
-1246,Christmas Cookie,1000000
-1247,Antonio,1000000
-1248,Cruiser,1000000
-1249,Myst Case,1000000
-1250,Chepet,1000000
-1251,Stormy Knight,1000000
-1252,Garm,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,Tower Keeper,1000000
-1271,Alligator,1000000
-1272,Dark Lord,1000000
-1273,Orc Lady,1000000
-1274,Megalith,1000000
-1275,Alice,1000000
-1276,Raydric Archer,1000000
-1277,Greatest General,1000000
-1278,Stalactite Golem,1000000
-1280,Steam Goblin,1000000
-1281,Sageworm,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
-1312,Turtle General,1000000
-1313,Mobster,1000000
-1314,Perimeter,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
-1373,Lord of Death,1000000
-1374,Incubus,1000000
-1375,The Paper,1000000
-1376,Harpy,1000000
-1377,Elder,1000000
-1378,Demon Pungus,1000000
-1379,Nightmare Terror,1000000
-1380,Driller,1000000
-1381,Grizzly,1000000
-1382,Diabolic,1000000
-1383,Explosion,1000000
-1384,Sky Deleter,1000000
-1385,Earth Deleter,1000000
-1386,Sleeper,1000000
-1387,Gig,1000000
-1388,Archangeling,1000000
-1389,Dracula,1000000
-1390,Violy,1000000
-1391,Galapago,1000000
-1392,Rotar Zairo,1000000
-1400,Karakasa,1000000
-1401,Shinobi,1000000
-1402,Poison Toad,1000000
-1403,Antique Firelock,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
-1418,Evil Snake Lord,1000000
-1492,Incantation Samurai,1000000
-1493,Dryad,1000000
-1494,Kind of Beetle,1000000
-1495,Stone Shooter,1000000
-1497,Wooden Golem,1000000
-1498,Wooden Shooter,1000000
-1499,Wooden Fighter,1000000
-1500,Parasite,1000000
-1502,Fire Poring,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
-1511,Amon Ra,1000000
-1512,Hyegun,1000000
-1513,Civil Servant,1000000
-1514,Dancing Dragon,1000000
-1515,Hatii Baby,1000000
-1516,Increase Soil,1000000
-1517,Li Me Mang Ryang,1000000
-1518,Bacsojin,1000000
-1519,Chung E,1000000
-1520,Boiled Rice,1000000
-1582,Deviling,1000000
-1583,Tao Gunka,1000000
-1584,Tamruan,1000000
-1585,Mime Monkey,1000000
-1586,Leaf Cat,1000000
-1587,Kraben,1000000
+// ŒÃ–Ø‚ÌŽ}‚Å¢Š«‚Å‚«‚郂ƒ“ƒXƒ^[‚ðÝ’è
+// MobID, MobDBName, MobName(Dummy), Rate
+// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
+// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
+
+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,Skeleton Archer,1000000
+1018,Creamy,1000000
+1019,PecoPeco,1000000
+1020,Mandragora,1000000
+1023,Orc Warrior,1000000
+1024,Worm Tail,1000000
+1025,Boa,1000000
+1026,Munak,1000000
+1028,Skeleton Soldier,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,Sidewinder,1000000
+1038,Osiris,1000000
+1039,Baphomet,1000000
+1040,Golem,1000000
+1041,Mummy,1000000
+1042,Steel ChonChon,1000000
+1044,Obeaune,1000000
+1045,Marc,1000000
+1046,Doppelganger,1000000
+1047,PecoPeco Egg,1000000
+1048,Thief Bug Egg,1000000
+1049,Picky,1000000
+1050,Shell Picky,1000000
+1051,Thief Bug Larva,1000000
+1052,Rocker,1000000
+1053,Thief Bug Female,1000000
+1054,Thief Bug Male,1000000
+1055,Muka,1000000
+1056,Smokie,1000000
+1057,Yoyo,1000000
+1058,Metaller,1000000
+1059,Mistress,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
+1076,Skeleton,1000000
+1077,Poison Spore,1000000
+1078,Red Plant,1000000
+1079,Blue Plant,1000000
+1080,Green Plant,1000000
+1081,Yellow Plant,1000000
+1083,Shining Plant,1000000
+1084,Black Mushroom,1000000
+1085,Red Mushroom,1000000
+1086,Golden Thief Bug,1000000
+1087,Orc Hero,1000000
+1088,Vocal,1000000
+1089,Toad,1000000
+1090,Mastering,1000000
+1091,Dragonfly,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,Desert Wolf Puppy,1000000
+1108,Deviace,1000000
+1109,Deviruchi,1000000
+1110,Dokebi,1000000
+1111,Drainliar,1000000
+1112,Drake,1000000
+1113,Drops,1000000
+1114,Dustiness,1000000
+1115,Eddga,1000000
+1116,Eggyra,1000000
+1117,Evil Druid,1000000
+1118,Flora,1000000
+1119,Frilldora,1000000
+1120,Ghostring,1000000
+1121,Giearth,1000000
+1122,Goblin 1,1000000
+1123,Goblin 2,1000000
+1124,Goblin 3,1000000
+1125,Goblin 4,1000000
+1126,Goblin 5,1000000
+1127,Hode,1000000
+1128,Horn,1000000
+1129,Horong,1000000
+1130,Jakk,1000000
+1131,Joker,1000000
+1132,Khalitzburg,1000000
+1133,Kobold 1,1000000
+1134,Kobold 2,1000000
+1135,Kobold 3,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
+1147,Maya,1000000
+1148,Medusa,1000000
+1149,Minorous,1000000
+1150,Moonlight Flower,1000000
+1151,Myst,1000000
+1152,Orc Skeleton,1000000
+1153,Orc Zombie,1000000
+1154,Pasana,1000000
+1155,Earth Petite,1000000
+1156,Sky Petite,1000000
+1157,Pharaoh,1000000
+1158,Phen,1000000
+1159,Phreeoni,1000000
+1160,Piere,1000000
+1161,Plankton,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
+1182,Thief Mushroom,1000000
+1183,Angry ChonChon,1000000
+1184,Angry Fabre,1000000
+1185,Whisper,1000000
+1186,Giant Whisper,1000000
+1188,Bon Gun,1000000
+1189,Orc Archer,1000000
+1190,Orc Lord,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
+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,Knight of Abyss,1000000
+1242,Marin,1000000
+1243,Sasquatch,1000000
+1245,Christmas Goblin,1000000
+1246,Christmas Cookie,1000000
+1247,Antonio,1000000
+1248,Cruiser,1000000
+1249,Myst Case,1000000
+1250,Chepet,1000000
+1251,Stormy Knight,1000000
+1252,Garm,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,Tower Keeper,1000000
+1271,Alligator,1000000
+1272,Dark Lord,1000000
+1273,Orc Lady,1000000
+1274,Megalith,1000000
+1275,Alice,1000000
+1276,Raydric Archer,1000000
+1277,Greatest General,1000000
+1278,Stalactite Golem,1000000
+1280,Steam Goblin,1000000
+1281,Sageworm,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
+1312,Turtle General,1000000
+1313,Mobster,1000000
+1314,Perimeter,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
+1373,Lord of Death,1000000
+1374,Incubus,1000000
+1375,The Paper,1000000
+1376,Harpy,1000000
+1377,Elder,1000000
+1378,Demon Pungus,1000000
+1379,Nightmare Terror,1000000
+1380,Driller,1000000
+1381,Grizzly,1000000
+1382,Diabolic,1000000
+1383,Explosion,1000000
+1384,Sky Deleter,1000000
+1385,Earth Deleter,1000000
+1386,Sleeper,1000000
+1387,Gig,1000000
+1388,Archangeling,1000000
+1389,Dracula,1000000
+1390,Violy,1000000
+1391,Galapago,1000000
+1392,Rotar Zairo,1000000
+1400,Karakasa,1000000
+1401,Shinobi,1000000
+1402,Poison Toad,1000000
+1403,Antique Firelock,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
+1418,Evil Snake Lord,1000000
+1492,Incantation Samurai,1000000
+1493,Dryad,1000000
+1494,Kind of Beetle,1000000
+1495,Stone Shooter,1000000
+1497,Wooden Golem,1000000
+1498,Wooden Shooter,1000000
+1499,Wooden Fighter,1000000
+1500,Parasite,1000000
+1502,Fire Poring,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
+1511,Amon Ra,1000000
+1512,Hyegun,1000000
+1513,Civil Servant,1000000
+1514,Dancing Dragon,1000000
+1515,Hatii Baby,1000000
+1516,Increase Soil,1000000
+1517,Li Me Mang Ryang,1000000
+1518,Bacsojin,1000000
+1519,Chung E,1000000
+1520,Boiled Rice,1000000
+1582,Deviling,1000000
+1583,Tao Gunka,1000000
+1584,Tamruan,1000000
+1585,Mime Monkey,1000000
+1586,Leaf Cat,1000000
+1587,Kraben,1000000
diff --git a/db/mob_db.txt b/db/mob_db.txt
index 7dab5e08c..4f3f99311 100644
--- a/db/mob_db.txt
+++ b/db/mob_db.txt
@@ -1,554 +1,554 @@
-//File created using Spamrat's Athena Database Editor v1.3.1
-//
-//ID,Name,JName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Item1,Item2,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per
-//
-1001,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,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,4068,1,0,0,0,0,0,0,0,0,,
-1002,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1003,TESTEGG,Test Egg,2,10,0,10000,10000,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1004,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,992,50,939,5500,909,3500,1208,15,511,350,518,100,512,0,4019,10,0,0,0,0,0,0,0,0,,
-1005,FARMILIAR,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,133,150,1276,576,384,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,4020,1,0,0,0,0,0,0,0,0,,
-1006,THIEF_BUG_LARVA,Thief Bug Larva,0,0,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,,
-1007,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,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,4002,15,0,0,0,0,0,0,0,0,,
-1008,PUPA,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,1,1,20,10,12,0,4,22,128,1000,1001,1,1,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,4003,7,0,0,0,0,0,0,0,0,,
-1009,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,917,6500,1702,150,715,80,1750,5500,517,400,916,2000,512,0,4015,2,0,0,0,0,0,0,0,0,,
-1010,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,902,6500,1019,100,907,600,516,700,1068,3500,512,0,1066,2000,4010,7,0,0,0,0,0,0,0,0,,
-1011,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,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
-1012,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,918,5500,908,500,511,300,721,7,713,2000,512,0,512,0,4014,5,0,0,0,0,0,0,0,0,,
-1013,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,1011,20,920,5500,2308,10,517,650,528,1050,919,5500,512,0,4029,5,0,0,0,0,0,0,0,0,,
-1014,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,921,5000,507,800,510,50,743,5,2220,40,921,5,512,0,4022,5,0,0,0,0,0,0,0,0,,
-1015,ZOMBIE,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,1,15,1,10,12,1,1,29,133,400,2612,912,288,957,5500,724,5,938,1000,958,50,727,55,512,0,512,0,4038,1,0,0,0,0,0,0,0,0,,
-1016,ARCHER_SKELETON,Skeleton Archer,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,932,4500,756,70,2285,4,1708,35,1752,1000,501,800,1701,150,4094,1,0,0,0,0,0,0,0,0,,
-1017,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,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,4026,7,0,0,0,0,0,0,0,0,,
-1018,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,924,5500,2322,10,518,150,602,100,2207,2,712,500,512,0,4040,3,0,0,0,0,0,0,0,0,,
-1019,PECOPECO,PecoPeco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,153,200,1564,864,576,925,5500,2402,20,508,50,507,900,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
-1020,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,993,50,905,5500,1405,30,511,350,711,300,706,1,512,0,4030,1,0,0,0,0,0,0,0,0,,
-1021,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,141,300,988,288,768,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,4050,1,0,0,0,0,0,0,0,0,,
-1022,WEREWOLF,Werewolf,80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,181,200,1500,768,652,999,500,1034,4000,984,500,985,500,7017,800,714,380,1912,300,4091,50,0,0,0,0,0,0,0,0,,
-1023,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,133,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
-1024,WORM_TAIL,Worm Tail,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,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,10,4034,5,0,0,0,0,0,0,0,0,,
-1025,BOA,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,926,5500,1117,15,507,900,1011,35,937,800,954,1,512,0,4037,1,0,0,0,0,0,0,0,0,,
-1026,MUNAK,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,4090,3,0,0,0,0,0,0,0,0,,
-1027,RAPTICE,Raptice,0,0,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,,
-1028,SOLDIER_SKELETON,Skeleton Soldier,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,133,200,2276,576,432,932,5500,756,60,1214,12,501,700,934,10,1201,150,1216,50,4086,1,0,0,0,0,0,0,0,0,,
-1029,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,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,4116,1,0,0,0,0,0,0,0,0,,
-1030,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,1011,50,937,5500,1455,10,926,1500,936,200,508,150,756,38,4062,1,0,0,0,0,0,0,0,0,,
-1031,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,938,5500,910,1500,511,500,514,200,729,5,512,0,512,0,4033,5,0,0,0,0,0,0,0,0,,
-1032,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,929,5500,912,700,930,1100,509,550,512,0,2612,200,639,20,4107,1,0,0,0,0,0,0,0,0,,
-1033,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,133,200,1452,672,432,990,50,907,5500,1019,3500,757,37,2329,30,516,1000,512,0,4052,1,0,0,0,0,0,0,0,0,,
-1034,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,1011,45,908,5500,911,600,509,30,725,5,918,2000,512,0,4058,1,0,0,0,0,0,0,0,0,,
-1035,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,133,150,676,576,480,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,4115,1,0,0,0,0,0,0,0,0,,
-1036,GHOUL,Ghoul,39,5118,0,882,541,1,420,500,5,20,1,20,29,1,33,20,10,12,1,11,49,133,250,2456,912,504,958,5500,756,110,509,670,506,800,2609,60,934,150,1260,1,4110,2,0,0,0,0,0,0,0,0,,
-1037,SIDEWINDER,Sidewinder,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,954,5500,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,4117,1,0,0,0,0,0,0,0,0,,
-1038,OSIRIS,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,10,1,1,89,181,100,1072,672,384,617,2000,1232,150,2235,200,1255,600,1009,1000,985,3500,984,3900,4144,1,7710,0,603,4000,608,3000,751,500,603,4000
-1039,BAPHOMET,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,181,100,1068,768,576,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,4147,1,13000,0,608,1000,750,400,923,3800,,
-1040,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,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,4072,3,0,0,0,0,0,0,0,0,,
-1041,MUMMY,Mummy,37,5176,0,488,314,1,305,360,0,10,1,19,32,0,63,20,10,12,1,1,49,133,300,1772,72,384,930,5500,756,100,934,550,2604,1,2611,10,525,250,502,450,4106,1,0,0,0,0,0,0,0,0,,
-1042,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,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,4042,1,0,0,0,0,0,0,0,0,,
-1043,SEAHORES,Seahorse,18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,129,200,1500,800,600,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1044,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,995,13,950,5500,5014,1,2326,10,720,10,951,500,748,25,4093,2,0,0,0,0,0,0,0,0,,
-1045,MARC,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,133,150,1272,72,480,995,18,956,5500,756,95,951,1000,720,10,717,200,509,600,4105,1,0,0,0,0,0,0,0,0,,
-1046,DOPPELGANGER,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,181,100,480,480,288,2258,350,2317,250,1162,220,1168,150,1411,550,985,3800,984,2700,4142,1,5340,0,724,1500,505,6000,724,1500,,
-1047,PECOPECO_EGG,PecoPeco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,128,1000,1001,1,1,1010,250,935,1500,2102,2,501,400,501,400,713,1800,736,10,4007,2,0,0,0,0,0,0,0,0,,
-1048,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,128,1000,701,1,1,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,350,4012,7,0,0,0,0,0,0,0,0,,
-1049,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,916,6500,949,700,2302,150,507,550,519,300,715,50,512,0,4008,10,0,0,0,0,0,0,0,0,,
-1050,SHELL_PICKY,Shell 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,916,6500,949,700,5015,10,507,600,519,300,715,50,10012,10,4011,10,0,0,0,0,0,0,0,0,,
-1051,THIEF_BUG,Thief Bug Larva,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,955,2500,2304,80,507,350,909,2000,2303,120,1002,350,512,0,4016,10,0,0,0,0,0,0,0,0,,
-1052,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,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,0,0,0,0,0,0,,
-1053,THIEF_BUG_,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,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,4026,7,0,0,0,0,0,0,0,0,,
-1054,THIEF_BUG__,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,4050,1,0,0,0,0,0,0,0,0,,
-1055,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,993,70,952,5500,713,2000,511,400,507,1000,1451,50,1002,350,4036,2,0,0,0,0,0,0,0,0,,
-1056,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,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,4044,1,0,0,0,0,0,0,0,0,,
-1057,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,942,5500,513,1500,508,100,919,5000,753,5,756,24,512,0,4051,1,0,0,0,0,0,0,0,0,,
-1058,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,990,60,940,6500,911,400,757,49,707,20,935,3000,512,0,4057,1,0,0,0,0,0,0,0,0,,
-1059,MISTRESS,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,1,165,60,95,70,130,10,12,0,4,84,181,100,1148,648,300,1413,150,518,10000,2249,250,616,1000,7018,10,985,4400,984,3300,4132,1,2569,5000,996,1500,526,4000,722,3000,,
-1060,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,948,5500,2289,5,919,5000,740,80,516,1500,518,400,756,43,4074,1,0,0,0,0,0,0,0,0,,
-1061,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,944,5500,510,500,2608,2,603,30,505,100,1261,1,984,60,4127,1,0,0,0,0,0,0,0,0,,
-1062,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,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,512,0,4005,1,0,0,0,0,0,0,0,0,,
-1063,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,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,4006,15,0,0,0,0,0,0,0,0,,
-1064,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,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,4067,1,0,0,0,0,0,0,0,0,,
-1065,STROUF,Strouf,40,9952,0,1238,752,1,200,350,5,50,1,40,45,72,43,65,10,12,2,5,61,133,150,1872,672,384,951,5500,756,115,2241,2,1461,2,949,3000,720,20,956,1500,4111,1,0,0,0,0,0,0,0,0,,
-1066,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,991,35,960,5500,910,3000,2313,5,943,100,757,34,717,50,4049,1,0,0,0,0,0,0,0,0,,
-1067,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,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,4061,3,0,0,0,0,0,0,0,0,,
-1068,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,1011,25,962,5500,938,1500,971,20,525,5,517,700,512,0,4035,1,0,0,0,0,0,0,0,0,,
-1069,SWORDFISH,Swordfish,30,4299,0,529,319,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,133,200,1968,768,384,995,10,963,5500,756,33,2257,2,757,45,1117,25,956,600,4089,1,0,0,0,0,0,0,0,0,,
-1070,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,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,4027,5,0,0,0,0,0,0,0,0,,
-1071,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,133,200,1754,554,288,932,3000,2287,15,1125,25,2211,250,1104,250,756,43,628,20,4073,1,0,0,0,0,0,0,0,0,,
-1072,KAHO,Kaho,24,1141,0,287,176,1,128,156,0,50,1,24,24,25,44,5,10,12,1,6,83,133,200,1700,1000,500,994,30,1003,100,953,3000,911,1000,757,10,716,100,970,5,512,0,0,0,0,0,0,0,0,0,,
-1073,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,964,5500,960,1500,7049,700,1001,13,512,0,512,0,757,37,512,0,0,0,0,0,0,0,0,0,,
-1074,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,965,5500,966,1000,7049,500,1056,1000,1001,10,512,0,757,18,512,0,0,0,0,0,0,0,0,0,,
-1075,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,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1076,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,1010,90,932,800,1505,80,909,3000,507,850,2609,30,512,0,4025,7,0,0,0,0,0,0,0,0,,
-1077,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,133,200,1672,672,288,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,4048,2,0,0,0,0,0,0,0,0,,
-1078,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,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0,0,0,0,0,,
-1079,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,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0,0,0,0,0,,
-1080,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,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0,0,0,0,0,,
-1081,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,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0,0,0,0,0,,
-1082,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,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0,0,0,0,0,,
-1083,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,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0,0,0,0,0,,
-1084,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,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0,0,0,0,0,,
-1085,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,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0,0,0,0,0,,
-1086,GOLDEN_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,556,100,768,768,480,969,1000,1524,150,2246,250,10016,500,714,300,984,2000,985,2000,4128,1,25,5000,2610,2000,701,1000,2610,2000,,
-1087,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,181,150,1678,780,648,968,10000,10018,500,1366,150,2106,250,1124,10,984,3700,985,4700,4143,1,4500,5000,725,2000,607,1500,999,5000,725,2000
-1088,VOCAL,Vocal,18,3016,0,110,88,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,181,200,1080,648,480,2247,50,940,8000,721,1000,752,1500,912,700,645,3000,532,60,4021,60,0,0,0,0,0,0,0,0,,
-1089,TOAD,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,10,1,5,21,181,200,1236,336,432,2244,50,518,2000,729,1000,746,1500,970,100,971,100,512,0,4014,5,0,0,0,0,0,0,0,0,,
-1090,MASTERING,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,10,1,3,21,181,300,1072,672,480,2257,200,619,50,722,1000,741,1500,512,8000,512,8000,531,4000,4001,100,0,0,0,0,0,0,0,0,,
-1091,DRAGONFLY,Dragonfly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,10,0,4,24,181,100,1076,576,480,2245,200,501,8000,719,1500,742,2000,2607,200,625,50,533,3000,4009,40,0,0,0,0,0,0,0,0,,
-1092,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,181,150,1048,648,432,2248,200,920,8000,728,1500,919,5500,725,11,517,8000,626,50,4029,40,0,0,0,0,0,0,0,0,,
-1093,ECLIPSE,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,10,0,2,60,181,200,1456,456,336,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,4006,70,0,0,0,0,0,0,0,0,,
-1094,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,991,35,946,5500,910,1200,935,3000,943,2,757,14,1002,250,4032,5,0,0,0,0,0,0,0,0,,
-1095,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,955,5500,910,1000,938,500,993,40,1001,4,1002,450,757,28,4043,1,0,0,0,0,0,0,0,0,,
-1096,ANGELING,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,181,200,1272,672,672,2254,100,2324,60,610,500,2282,1,504,1000,512,250,714,40,4054,1,0,0,0,0,0,0,0,0,,
-1097,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,128,1000,1001,1,1,1010,320,935,2500,909,2000,938,650,713,2000,1002,300,512,0,4013,2,0,0,0,0,0,0,0,0,,
-1098,ANUBIS,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,181,200,2000,1000,500,2602,5,504,600,2601,5,1007,15,512,0,512,0,512,0,4138,1,0,0,0,0,0,0,0,0,,
-1099,ARGIOPE,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,149,300,1792,792,336,1042,5500,912,1200,757,175,2406,5,511,1500,719,10,512,0,4114,1,0,0,0,0,0,0,0,0,,
-1100,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,1025,5500,911,1200,1042,500,757,61,511,670,508,250,10017,15,4075,2,0,0,0,0,0,0,0,0,,
-1101,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,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
-1102,BATHORY,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,149,100,1504,840,900,1001,200,1061,5500,2252,3,1611,5,1000,30,1006,15,637,20,4119,1,0,0,0,0,0,0,0,0,,
-1103,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,1027,5500,2310,5,919,5500,1455,10,1405,15,1408,20,512,0,4063,1,0,0,0,0,0,0,0,0,,
-1104,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,1026,5500,2502,20,914,3000,919,2500,516,500,2402,25,512,0,4041,1,0,0,0,0,0,0,0,0,,
-1105,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,955,6000,910,3000,938,1200,990,45,1001,8,1002,550,757,34,4043,1,0,0,0,0,0,0,0,0,,
-1106,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,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,4082,1,0,0,0,0,0,0,0,0,,
-1107,DESERT_WOLF_B,Desert Wolf Puppy,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,1010,85,919,5500,2306,60,517,600,2301,200,512,0,512,0,4023,10,0,0,0,0,0,0,0,0,,
-1108,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,995,25,1053,5500,1054,1000,5011,2,971,100,1256,3,756,161,4125,1,0,0,0,0,0,0,0,0,,
-1109,DEVIRUCHI,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,1038,5500,1039,400,2255,2,1458,2,1009,5,912,1500,756,154,4122,1,0,0,0,0,0,0,0,0,,
-1110,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,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,4098,1,0,0,0,0,0,0,0,0,,
-1111,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,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,4069,1,0,0,0,0,0,0,0,0,,
-1112,DRAKE,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,1,80,49,75,79,50,10,12,1,1,29,181,400,620,420,360,1127,600,1125,950,1135,150,1128,400,5019,300,985,3200,984,2300,4137,1,4300,5000,504,5000,719,500,504,5000,,
-1113,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,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,4004,10,0,0,0,0,0,0,0,0,,
-1114,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,1057,5500,1058,500,2291,4,928,2000,1001,10,507,1200,512,0,4056,2,0,0,0,0,0,0,0,0,,
-1115,EDDGA,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,1,70,85,66,90,85,10,12,2,2,23,181,300,872,1344,432,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,4123,1,6179,5000,1029,5000,1030,1000,994,3000,1029,5000
-1116,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,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,4070,1,0,0,0,0,0,0,0,0,,
-1117,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,149,300,2276,576,336,2217,10,1615,1,2508,2,1551,10,610,200,609,10,509,2000,4141,1,0,0,0,0,0,0,0,0,,
-1118,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,1032,5500,2253,3,704,10,521,50,629,20,905,2000,748,1,4080,1,0,0,0,0,0,0,0,0,,
-1119,FRILLDORA,Frilldora,30,2023,0,529,319,1,200,239,0,10,1,30,38,15,53,30,10,12,1,2,23,145,300,1540,720,432,1012,5500,757,90,903,1500,721,15,715,200,501,800,912,120,4088,1,0,0,0,0,0,0,0,0,,
-1120,GHOSTRING,Ghostring,18,73300,0,101,108,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,181,300,1220,1080,648,1059,5500,2274,100,2336,50,604,500,603,10,714,30,2335,150,4047,1,0,0,0,0,0,0,0,0,,
-1121,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,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,512,0,4087,1,0,0,0,0,0,0,0,0,,
-1122,GOBLIN_1,Goblin 1,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,149,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,4060,1,0,0,0,0,0,0,0,0,,
-1123,GOBLIN_2,Goblin 2,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,998,250,911,1000,5010,3,1511,10,2104,1,501,550,508,120,4060,1,0,0,0,0,0,0,0,0,,
-1124,GOBLIN_3,Goblin 3,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,998,230,911,1000,2275,3,512,0,2104,1,501,550,508,120,4060,1,0,0,0,0,0,0,0,0,,
-1125,GOBLIN_4,Goblin 4,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,993,100,998,170,911,800,2263,3,1508,10,2104,1,501,500,4060,1,0,0,0,0,0,0,0,0,,
-1126,GOBLIN_5,Goblin 5,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,998,150,911,800,1605,15,2104,1,508,100,501,500,508,120,4060,1,0,0,0,0,0,0,0,0,,
-1127,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,993,120,1055,5500,757,70,938,3000,1001,30,7021,1,632,20,4081,2,0,0,0,0,0,0,0,0,,
-1128,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,993,80,1011,35,947,5500,1452,15,935,5500,943,70,512,0,4045,1,0,0,0,0,0,0,0,0,,
-1129,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,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,4103,1,0,0,0,0,0,0,0,0,,
-1130,JAKK,Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,1062,5500,912,900,985,31,2331,5,1008,5,535,1000,512,0,4109,2,0,0,0,0,0,0,0,0,,
-1131,JOKER,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,149,100,1364,864,432,912,0,616,0,641,0,502,0,1259,0,984,0,512,0,4139,0,0,0,0,0,0,0,0,0,,
-1132,KHALITZBURG,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,149,350,528,1000,396,932,8000,985,191,5017,1,2108,2,1004,10,504,1000,1127,2,4136,1,0,0,0,0,0,0,0,0,,
-1133,KOBOLD_1,Kobold 1,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,999,100,1034,5500,912,700,985,25,1220,2,2104,5,512,0,4091,1,0,0,0,0,0,0,0,0,,
-1134,KOBOLD_2,Kobold 2,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,999,100,1034,5500,912,200,2104,3,502,100,2101,100,512,0,4091,1,0,0,0,0,0,0,0,0,,
-1135,KOBOLD_3,Kobold 3,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,990,35,999,100,1034,5500,912,200,512,0,2104,3,502,100,4091,1,0,0,0,0,0,0,0,0,,
-1136,KOBOLD_4,Kobold 4,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,999,50,1034,5500,912,100,1355,5,2104,3,502,100,1301,150,4091,1,0,0,0,0,0,0,0,0,,
-1137,KOBOLD_5,Kobold 5,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,999,40,1034,5500,912,100,1514,5,2104,3,502,100,1501,150,4091,1,0,0,0,0,0,0,0,0,,
-1138,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,7031,5500,910,800,911,100,912,10,737,20,508,250,512,0,4076,1,0,0,0,0,0,0,0,0,,
-1139,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,993,110,1031,5500,911,1400,757,70,943,250,721,10,501,650,4079,1,0,0,0,0,0,0,0,0,,
-1140,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,994,35,1045,4500,1608,10,2617,1,1614,3,1006,8,642,20,4112,1,0,0,0,0,0,0,0,0,,
-1141,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,1052,5000,938,1500,991,45,995,2,717,200,631,20,512,0,4055,1,0,0,0,0,0,0,0,0,,
-1142,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,1050,5500,1051,500,1520,10,720,10,717,150,10003,10,512,0,4084,3,0,0,0,0,0,0,0,0,,
-1143,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,1060,5500,2294,5,2605,1,1008,10,1520,15,2407,1,656,200,4113,1,0,0,0,0,0,0,0,0,,
-1144,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,1024,5500,962,3000,717,200,720,10,995,12,1007,5,656,200,4095,2,0,0,0,0,0,0,0,0,,
-1145,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,1017,6500,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,4046,2,0,0,0,0,0,0,0,0,,
-1146,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,2618,10,528,5000,919,5500,537,400,757,100,656,200,512,0,4097,1,0,0,0,0,0,0,0,0,,
-1147,MAYA,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,1,97,76,95,82,105,10,12,2,4,82,181,100,864,1000,480,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,4146,1,10500,5000,730,2000,603,3000,617,2000,730,2000
-1148,MEDUSA,Medusa,79,22408,0,6876,4697,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,149,180,2000,1000,500,1048,6000,522,2500,702,200,2610,150,722,250,7062,3500,1007,3,4124,1,0,0,0,0,0,0,0,0,,
-1149,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,941,5500,756,196,1361,2,1005,10,516,1500,1301,200,657,150,4126,1,0,0,0,0,0,0,0,0,,
-1150,MOONLIGHT,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,1,99,55,82,95,120,10,10,1,6,63,181,150,1276,576,288,5008,1000,1234,100,1525,150,10008,500,985,2600,984,1900,638,500,4131,1,1250,0,1022,5000,504,1500,728,500,1022,5000
-1151,MYST,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,1,53,10,10,12,2,0,25,149,200,1576,576,384,5005,2,1019,800,10005,10,756,65,757,97,605,20,512,0,4108,2,0,0,0,0,0,0,0,0,,
-1152,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,133,200,2420,720,648,922,5500,932,3500,757,80,2299,2,1358,10,506,50,512,0,4085,1,0,0,0,0,0,0,0,0,,
-1153,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,133,400,2852,1152,840,1043,5500,938,3000,714,1,512,0,512,0,512,0,512,0,4071,2,0,0,0,0,0,0,0,0,,
-1154,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,7110,4500,7121,2500,757,20,1105,500,1217,150,512,0,512,0,4099,1,0,0,0,0,0,0,0,0,,
-1155,PETIT,Earth 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,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,4118,1,0,0,0,0,0,0,0,0,,
-1156,PETIT_,Sky 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,1036,5500,1037,300,985,61,509,1000,602,500,912,1500,606,15,4120,1,0,0,0,0,0,0,0,0,,
-1157,PHARAOH,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,181,125,2000,1000,500,7113,6000,7114,2500,1136,100,2327,150,5002,500,1552,300,984,4500,4148,1,1,5000,1009,5500,526,2000,732,1000,607,6000
-1158,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,1023,5500,963,2000,720,5,517,1000,951,500,756,25,512,0,4077,1,0,0,0,0,0,0,0,0,,
-1159,PHREEONI,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,10,2,2,60,181,200,1020,1020,288,1015,10000,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,4121,1,2700,0,1008,500,730,1000,1000,4000,1008,500
-1160,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,955,5700,910,1100,938,600,992,15,1001,5,1002,500,757,31,4043,1,0,0,0,0,0,0,0,0,,
-1161,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,1052,5500,910,300,938,700,970,2,713,1000,630,20,645,50,4024,1,0,0,0,0,0,0,0,0,,
-1162,RAFFLESIA,Rafflesia,27,1950,0,388,242,1,105,120,20,10,1,27,54,1,76,27,10,10,0,3,22,133,200,1000,2652,1056,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,4083,1,0,0,0,0,0,0,0,0,,
-1163,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,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,5500,4133,1,0,0,0,0,0,0,0,0,,
-1164,REQUIEM,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,133,400,1516,816,432,603,35,714,1,912,2500,958,3500,934,1500,2308,10,512,0,4104,1,0,0,0,0,0,0,0,0,,
-1165,SANDMAN,Sandman,34,3413,0,810,492,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,133,250,1672,720,288,997,35,1056,5500,757,118,7043,200,1001,200,1257,2,728,2,4101,2,0,0,0,0,0,0,0,0,,
-1166,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,1028,5500,656,150,702,2,2276,1,605,10,757,70,526,2,4078,1,0,0,0,0,0,0,0,0,,
-1167,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,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,4017,1,0,0,0,0,0,0,0,0,,
-1168,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,994,45,1046,5500,1005,15,904,5000,943,3000,504,700,512,0,4130,1,0,0,0,0,0,0,0,0,,
-1169,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,133,400,2420,720,384,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,4092,1,0,0,0,0,0,0,0,0,,
-1170,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,0,0,0,0,0,0,,
-1171,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,1014,2700,911,800,757,10,1111,15,1001,30,943,150,512,0,4059,1,0,0,0,0,0,0,0,0,,
-1172,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,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,512,0,4059,1,0,0,0,0,0,0,0,0,,
-1173,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,1014,3100,911,800,911,10,1114,15,1001,35,943,200,512,0,4059,1,0,0,0,0,0,0,0,0,,
-1174,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,992,60,1011,30,1013,5500,910,2100,757,25,943,10,1002,400,4039,1,0,0,0,0,0,0,0,0,,
-1175,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,1016,5500,919,3000,949,800,528,1000,701,1,512,0,512,0,4028,5,0,0,0,0,0,0,0,0,,
-1176,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,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,4053,1,0,0,0,0,0,0,0,0,,
-1177,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,1044,5500,756,70,938,2500,1006,5,503,50,640,20,512,0,4096,1,0,0,0,0,0,0,0,0,,
-1178,ZEROM,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,133,200,1780,1080,432,1011,55,998,190,2339,200,2265,3,2408,10,1002,400,1002,400,4064,1,0,0,0,0,0,0,0,0,,
-1179,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,1001,150,1059,5500,2282,1,2333,10,512,0,512,0,512,0,4102,1,0,0,0,0,0,0,0,0,,
-1180,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,149,150,840,540,480,1022,5500,919,7000,603,100,604,100,526,250,525,350,756,100,746,200,0,0,0,0,0,0,0,0,,
-1181,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,181,400,2700,1000,500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1182,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,1069,1500,1070,3000,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1183,CHONCHON_,Angry ChonChon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,149,200,1076,576,480,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
-1184,FABRE_,Angry Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,133,400,1672,672,480,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,4002,0,0,0,0,0,0,0,0,0,,
-1185,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,1001,10,1059,100,2282,0,2333,1,512,0,512,0,512,0,4102,0,0,0,0,0,0,0,0,0,,
-1186,WHISPER_BOSS,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,6,48,149,250,2536,1536,672,1001,150,1059,5500,2282,1,2333,10,512,0,512,0,512,0,4102,1,0,0,0,0,0,0,0,0,,
-1187,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,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1188,BON_GUN,Bon Gun,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,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,0,0,0,0,0,0,,
-1189,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,1063,5500,1753,1000,1756,2500,1755,2500,1716,2,501,1400,509,900,2330,5,0,0,0,0,0,0,0,0,,
-1190,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,181,100,1248,500,360,1363,200,2601,500,5007,150,2627,1000,512,0,985,4400,984,3100,4135,1,12800,5000,968,5500,617,900,512,0,,
-1191,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,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,2205,120,0,0,0,0,0,0,0,0,,
-1192,WRAITH,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,149,300,1816,576,240,1059,6500,2206,10,2506,2,716,650,602,1300,2505,10,731,5,735,10,0,0,0,0,0,0,0,0,,
-1193,ALARM,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,149,300,1020,500,768,1095,5500,2607,20,7005,1500,611,1300,984,105,7026,20,912,1500,4153,1,0,0,0,0,0,0,0,0,,
-1194,ARCLOUSE,Arclouse,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,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,4154,1,0,0,0,0,0,0,0,0,,
-1195,RIDEWORD,Rideword,59,11638,0,2007,3106,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,149,150,864,500,192,1097,5500,1553,4,1554,4,1555,3,1556,2,7015,300,1006,20,722,5,0,0,0,0,0,0,0,0,,
-1196,SKEL_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,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,2282,1,0,0,0,0,0,0,0,0,,
-1197,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,1099,3500,7016,105,2266,1,716,600,930,3500,2408,3,985,112,1093,1,0,0,0,0,0,0,0,0,,
-1198,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,149,200,1500,500,1000,1557,2,2608,30,505,100,716,450,1009,50,4158,1,512,0,512,0,0,0,0,0,0,0,0,0,,
-1199,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,7001,5500,715,800,1001,300,1061,1000,1057,3000,601,1100,10004,10,2502,15,0,0,0,0,0,0,0,0,,
-1200,ZHERLTHSH,Zherlthsh,63,18300,0,3608,2304,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,792,384,7017,5,504,800,503,1200,2331,8,2622,1,984,134,2291,3,4160,1,0,0,0,0,0,0,0,0,,
-1201,RYBIO,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,149,200,1500,500,1000,1015,4000,7017,3,504,800,731,30,1008,10,984,100,512,0,512,0,0,0,0,0,0,0,0,0,,
-1202,PHENDARK,Phendark,73,22729,0,6826,3443,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,149,175,1500,500,1000,1015,4000,7017,4,504,800,512,0,984,150,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1203,MYSTELTAINN,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,181,250,1152,500,240,7019,1,1117,100,1152,70,1155,40,1163,2,999,120,984,243,985,210,0,0,0,0,0,0,0,0,,
-1204,TIRFING,Tyrfing,71,29900,0,5412,4235,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,181,100,816,500,240,7022,1,638,50,1211,100,1214,70,1217,40,999,120,984,189,1157,25,0,0,0,0,0,0,0,0,,
-1205,EXECUTIONER,Executioner,65,28980,0,4730,3536,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,181,200,768,500,384,7024,5,1108,100,1111,80,1114,60,1125,40,999,120,984,145,4163,1,0,0,0,0,0,0,0,0,,
-1206,ANOLIAN,Anolian,63,18960,0,4378,2907,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,149,200,900,500,864,7003,5500,1754,2000,504,650,10019,10,943,5500,2625,1,984,134,526,5,0,0,0,0,0,0,0,0,,
-1207,STING,Sting,61,9500,0,4081,2970,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,149,300,528,500,240,7004,5500,1756,1500,2624,2,1003,130,997,25,10007,10,2209,350,719,3,0,0,0,0,0,0,0,0,,
-1208,WANDERER,Wanderer,74,8170,0,5786,4730,2,450,550,5,5,1,192,38,45,127,85,10,12,1,6,24,149,100,672,500,192,7005,5500,616,1,724,217,2270,5,610,650,984,217,608,3,732,1,0,0,0,0,0,0,0,0,,
-1209,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,7007,5500,528,1000,726,80,746,110,657,150,510,70,984,95,4167,1,0,0,0,0,0,0,0,0,,
-1210,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,7008,5500,947,8000,943,4000,993,200,1451,40,757,18,509,1600,4168,0,0,0,0,0,0,0,0,0,,
-1211,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,7009,5500,992,200,912,1200,602,1000,757,220,610,250,509,1600,4169,1,0,0,0,0,0,0,0,0,,
-1212,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,7010,5500,757,229,757,22,1002,850,999,180,998,300,512,0,4170,1,0,0,0,0,0,0,0,0,,
-1213,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,149,150,1500,500,1000,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,502,900,4171,1,0,0,0,0,0,0,0,0,,
-1214,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,7011,5500,942,7000,985,53,513,5000,634,20,532,1000,607,25,4051,2,0,0,0,0,0,0,0,0,,
-1215,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,7012,5500,509,1800,912,1200,756,115,997,5,1454,20,608,45,4173,1,0,0,0,0,0,0,0,0,,
-1216,PENOMENA,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,149,400,832,500,600,7013,5500,962,8000,938,7000,525,200,719,15,1258,1,716,550,4174,1,0,0,0,0,0,0,0,0,,
-1219,ABYSS_KNIGHT,Knight of Abyss,79,36140,0,8469,6268,1,1600,2150,55,50,1,68,64,25,135,50,10,12,2,7,87,149,300,1500,500,1000,1064,5500,7023,5,2318,1,1410,25,1162,1,985,369,984,259,1162,15,0,0,0,0,0,0,0,0,,
-1220,M_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,181,200,1120,420,288,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,4082,1,0,0,0,0,0,0,0,0,,
-1221,M_SAVAGE,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,181,150,1960,960,384,1028,6000,656,150,702,3,2276,2,605,15,757,70,512,0,4078,1,0,0,0,0,0,0,0,0,,
-1222,L_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,181,200,1500,500,1000,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,502,1100,4066,1,0,0,0,0,0,0,0,0,,
-1223,L_ORC,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,181,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
-1224,L_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,181,200,1672,672,288,921,8000,2221,20,511,650,510,55,972,35,512,0,512,0,4048,2,0,0,0,0,0,0,0,0,,
-1225,L_CHOCO,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,181,200,1500,500,1000,7011,5500,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,4051,2,0,0,0,0,0,0,0,0,,
-1226,L_KOBOLD,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,181,200,1028,528,360,999,90,1034,6000,912,750,985,25,1220,2,2104,5,512,0,4091,1,0,0,0,0,0,0,0,0,,
-1227,L_GOBLIN,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,181,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,4060,1,0,0,0,0,0,0,0,0,,
-1228,L_PHEN,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,181,150,2544,1344,1152,1023,6000,963,2300,720,8,517,1100,951,550,756,25,512,0,4077,1,0,0,0,0,0,0,0,0,,
-1229,META_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,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,4002,15,0,0,0,0,0,0,0,0,,
-1230,META_PUPA,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,4,22,128,1000,1001,1,1,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,400,4003,7,0,0,0,0,0,0,0,0,,
-1231,META_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,924,6000,2322,10,518,180,602,200,2207,4,712,800,512,0,4040,3,0,0,0,0,0,0,0,0,,
-1232,META_PECOPECO_EGG,PecoPeco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,128,1000,1001,1,1,1010,120,935,1500,2102,2,501,450,501,450,713,2000,736,15,4007,2,0,0,0,0,0,0,0,0,,
-1233,CONCEIVE_PECOPECO,PecoPeco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,145,200,1564,864,576,925,6000,2402,20,508,55,507,950,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
-1234,PROVOKE_YOYO,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,942,6000,513,2000,508,130,919,5500,753,7,512,0,512,0,4051,1,0,0,0,0,0,0,0,0,,
-1235,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,141,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
-1236,META_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,128,1000,1001,1,1,1010,135,935,2740,909,3000,938,750,713,2000,1002,320,512,0,4013,2,0,0,0,0,0,0,0,0,,
-1237,META_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,576,955,6000,910,3000,938,1000,935,3000,1001,6,1002,450,757,28,4043,1,0,0,0,0,0,0,0,0,,
-1238,META_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,955,5700,910,1100,938,600,992,15,1001,5,1002,500,757,31,4043,1,0,0,0,0,0,0,0,0,,
-1239,META_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,955,6000,910,3000,938,1200,990,45,1001,8,1002,550,757,34,4043,1,0,0,0,0,0,0,0,0,,
-1240,META_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,916,6500,949,850,2302,150,507,650,519,350,715,60,512,0,4008,2,0,0,0,0,0,0,0,0,,
-1241,META_PICKY_,Shell 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,916,6500,949,850,5015,7,507,750,519,350,715,60,512,0,4011,10,0,0,0,0,0,0,0,0,,
-1242,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,910,3200,938,1500,512,50,720,40,510,75,529,350,5035,1,4175,1,0,0,0,0,0,0,0,0,,
-1243,SASQUATCH,Sasquatch,30,3163,0,529,319,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,149,300,1260,192,192,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,4176,1,0,0,0,0,0,0,0,0,,
-1244,JAKK_XMAS,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,1062,5500,912,900,985,31,2331,5,1008,5,535,1000,2236,70,4109,2,0,0,0,0,0,0,0,0,,
-1245,GOBLINE_XMAS,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,149,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,2236,40,4060,1,0,0,0,0,0,0,0,0,,
-1246,COOKIE_XMAS,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,538,1500,722,45,912,200,2502,25,2501,120,507,1100,501,700,512,0,0,0,0,0,0,0,0,0,,
-1247,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,7034,10000,644,200,538,1500,539,1000,529,5500,530,500,2236,250,4177,1,0,0,0,0,0,0,0,0,,
-1248,CRUISER,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,149,400,1296,1296,432,1098,900,2251,2,998,320,996,5,911,3500,719,35,756,87,4178,1,0,0,0,0,0,0,0,0,,
-1249,MYSTCASE,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,530,90,912,1500,603,20,539,800,722,150,731,5,512,100,529,340,0,0,0,0,0,0,0,0,,
-1250,CHEPET,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,149,400,672,672,288,7035,2500,912,750,512,5500,619,40,10019,5,502,300,2508,5,4180,1,0,0,0,0,0,0,0,0,,
-1251,STORMY_KNIGHT,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,1,185,83,55,130,79,10,12,2,0,84,181,200,468,468,288,1468,150,603,3000,617,4000,2621,200,2506,500,985,4700,984,3500,5007,1,1,5000,720,4500,2406,500,995,3000,720,4700
-1252,GARM,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,1,126,82,65,95,60,10,12,2,2,81,181,400,608,408,336,7036,5500,1131,150,1256,500,4182,1,512,0,985,4100,984,2900,512,0,28473,5000,7036,1000,603,3000,995,3000,7036,1000
-1253,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,912,4000,1039,500,4183,1,512,0,2619,1,1769,2000,757,238,512,0,0,0,0,0,0,0,0,0,,
-1254,RAGGLER,Raggler,21,1020,0,218,140,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,149,200,1000,900,384,7053,3000,916,5000,645,200,656,100,992,90,2225,7,756,32,7054,1500,0,0,0,0,0,0,0,0,,
-1255,NERAID,Neraid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,149,200,776,576,288,1055,5500,7053,1000,510,230,717,250,656,250,757,180,985,37,4185,1,0,0,0,0,0,0,0,0,,
-1256,PEST,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,149,200,700,648,480,1055,5500,7054,200,702,10,605,60,716,230,4186,1,756,115,512,0,0,0,0,0,0,0,0,0,,
-1257,INJUSTICE,Injustice,51,7600,0,2118,1488,1,480,600,0,0,1,42,39,1,71,35,10,12,1,1,47,149,400,770,720,336,999,300,7054,5500,7053,3500,2313,5,2316,2,4187,1,1255,2,512,0,0,0,0,0,0,0,0,0,,
-1258,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,2297,3,998,250,911,1000,1765,3000,501,600,1705,25,656,150,512,0,0,0,0,0,0,0,0,0,,
-1259,GRYPHON,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,181,100,704,504,432,7048,2500,7054,5500,7063,120,1452,1500,757,150,984,185,996,150,1417,1,0,0,0,0,0,0,0,0,,
-1260,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,149,200,920,720,200,7054,5500,734,1000,2505,30,4190,1,512,0,1000,80,747,3,512,0,0,0,0,0,0,0,0,0,,
-1261,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,7053,6000,748,50,5037,120,1767,3000,624,35,528,600,2244,2,512,0,0,0,0,0,0,0,0,0,,
-1262,MUTANT_DRAGONOID,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,181,250,1280,1080,240,7054,5500,1035,500,1036,500,930,500,2627,30,522,150,505,150,504,250,0,0,0,0,0,0,0,0,,
-1263,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,149,150,1056,1056,336,912,5000,932,6000,7005,500,1610,25,1611,8,996,100,1615,1,4191,1,0,0,0,0,0,0,0,0,,
-1264,MERMAN,Merman,53,12300,0,3345,2054,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,149,200,916,816,336,1054,1300,523,300,657,200,720,40,995,35,1460,3,756,203,4192,1,0,0,0,0,0,0,0,0,,
-1265,COOKIE,Cookie,25,950,0,310,188,1,130,153,0,25,1,35,20,53,37,90,10,12,0,7,60,145,200,1036,936,240,538,1000,530,150,979,1,645,280,2402,30,1001,40,2502,20,529,320,0,0,0,0,0,0,0,0,,
-1266,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,938,500,7013,40,1052,1200,508,200,912,60,512,100,4194,1,512,0,0,0,0,0,0,0,0,0,,
-1267,CARAT,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,149,200,1078,768,384,7054,3200,536,1000,2409,5,5003,1,4195,1,512,0,504,450,512,0,0,0,0,0,0,0,0,0,,
-1268,BLOODY_KNIGHT,Blood Knight,82,57870,0,10120,6820,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,149,250,828,528,192,7054,5500,2229,45,2317,5,2106,65,1170,1,984,304,985,433,1417,2,0,0,0,0,0,0,0,0,,
-1269,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,1095,5500,1019,800,504,900,657,220,7026,30,7027,30,985,163,4197,1,0,0,0,0,0,0,0,0,,
-1270,TOWER_KEEPER,Tower Keeper,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,1095,5500,7054,5500,999,500,520,850,2109,1,7026,2000,7027,2000,4198,1,0,0,0,0,0,0,0,0,,
-1271,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,912,1000,1099,600,7003,2000,608,50,4199,1,512,0,756,129,512,0,0,0,0,0,0,0,0,0,,
-1272,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,181,100,868,768,480,1615,800,5017,500,1237,300,2334,300,2507,100,985,5300,984,4100,2609,140,1,5000,7005,6000,512,0,617,2000,,
-1273,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,149,200,1050,900,288,7053,5500,998,300,2602,1,756,40,1352,10,508,900,2338,1,2206,1,0,0,0,0,0,0,0,0,,
-1274,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,912,100,7049,1000,617,1,512,0,512,0,985,61,757,207,512,0,0,0,0,0,0,0,0,0,,
-1275,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,1152,480,7047,2500,637,40,2407,3,739,30,5085,5,503,400,2215,5,4203,1,0,0,0,0,0,0,0,0,,
-1276,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,7054,5500,4204,1,2315,2,1701,150,1764,2000,1715,3,985,106,512,0,0,0,0,0,0,0,0,0,,
-1277,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,7054,2000,1019,2000,1501,100,512,0,2272,1,503,150,609,35,512,0,0,0,0,0,0,0,0,0,,
-1278,STALACTIC_GOLEM,Stalactite 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,7004,2000,7054,5500,1000,250,997,30,4206,1,757,250,985,163,512,0,0,0,0,0,0,0,0,0,,
-1279,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,149,200,860,660,624,7053,100,943,380,606,200,993,160,1001,140,4207,1,757,106,512,0,0,0,0,0,0,0,0,0,,
-1280,STEAM_GOBLIN,Steam Goblin,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,911,2500,7053,4000,998,300,999,55,1003,320,4208,1,757,124,744,2,0,0,0,0,0,0,0,0,,
-1281,SAGEWORM,Sageworm,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,912,1200,1097,1000,1055,3000,2241,5,505,40,512,1000,5012,1,1550,15,0,0,0,0,0,0,0,0,,
-1282,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,912,250,999,60,1034,5000,512,0,1763,2000,1711,5,756,79,4210,1,0,0,0,0,0,0,0,0,,
-1283,CHIMERA,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,181,200,772,672,360,7054,5500,1048,2500,657,500,1306,1,504,560,1364,1,984,160,4211,1,0,0,0,0,0,0,0,0,,
-1284,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,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0,0,0,0,0,,
-1285,ARCHER_GUARDIAN,Guardian Archer,74,28634,0,1,1,12,1120,1600,35,60,1,80,80,90,165,55,14,16,2,7,80,133,265,1200,1200,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1286,KNIGHT_GUARDIAN,Guardian Knight,86,30214,0,1,1,2,1280,1560,55,30,1,40,140,65,125,65,14,16,2,7,80,133,275,1200,1200,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1287,SOLDIER_GUARDIAN,Guardian Soldier,56,15670,0,1,1,1,873,1036,35,0,1,56,100,45,103,43,10,12,0,4,22,133,265,1288,288,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1288,EMPERIUM,Emperium,90,68430,0,109,71,1,60,71,40,50,1,17,80,50,26,20,10,12,0,4,22,0,300,1288,288,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1289,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,181,100,1024,1000,480,7053,4550,757,250,756,300,969,100,984,150,985,100,639,50,10006,1,0,0,0,0,0,0,0,0,,
-1290,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,149,150,2276,576,432,7068,2550,756,160,503,800,1220,35,1219,80,1222,3,512,0,2274,1,0,0,0,0,0,0,0,0,,
-1291,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,149,175,1816,576,240,1059,4550,2206,10,2506,8,716,700,732,5,717,850,657,150,603,100,0,0,0,0,0,0,0,0,,
-1292,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,149,150,1000,600,384,1038,4550,1039,450,2255,6,757,160,912,2500,1009,10,1410,3,7054,2500,0,0,0,0,0,0,0,0,,
-1293,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,149,155,1136,720,840,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,7053,1800,0,0,0,0,0,0,0,0,,
-1294,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,149,175,1528,660,432,1031,4550,943,2500,721,10,504,5,656,25,2224,3,2108,1,7053,2500,0,0,0,0,0,0,0,0,,
-1295,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,181,175,1345,824,440,7071,3500,7063,2500,1716,2,1472,1,1402,25,1514,10,5045,5,7054,2500,0,0,0,0,0,0,0,0,,
-1296,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,149,150,1028,528,360,999,450,1034,6500,912,1200,1511,6,1613,2,525,150,526,100,7053,1500,0,0,0,0,0,0,0,0,,
-1297,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,149,175,1772,120,384,930,4550,934,1800,2624,1,2611,150,503,350,756,150,757,100,7053,2500,0,0,0,0,0,0,0,0,,
-1298,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,149,175,2612,912,288,7071,4550,938,1500,958,1500,723,200,727,100,1260,1,2324,2,2627,2,0,0,0,0,0,0,0,0,,
-1299,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,149,120,1120,620,240,998,1200,999,800,756,120,2297,5,2106,2,503,650,2611,240,7054,1500,0,0,0,0,0,0,0,0,,
-1300,CATERPILLAR,Caterpillar,64,14140,0,6272,3107,1,895,1448,47,29,1,25,85,15,69,45,10,12,0,4,22,149,300,1672,672,480,949,3000,7054,5500,2227,20,1000,100,997,50,501,1000,502,500,505,12,0,0,0,0,0,0,0,0,,
-1301,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,149,200,1156,456,384,1021,4550,757,250,1517,3,969,5,2282,1,912,1200,746,250,616,1,0,0,0,0,0,0,0,0,,
-1302,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,181,145,1024,768,480,1615,3,5017,2,2508,3,7054,5500,522,120,504,550,1162,2,7053,2500,0,0,0,0,0,0,0,0,,
-1303,GIANT_HONET,Giant Hornet,56,12834,0,5785,2006,1,650,851,38,43,1,38,32,10,71,64,10,12,0,4,24,149,155,1292,792,340,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,516,3500,0,0,0,0,0,0,0,0,,
-1304,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,149,165,1468,468,768,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,7054,800,0,0,0,0,0,0,0,0,,
-1305,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,149,165,1792,792,336,1042,4550,912,2500,2406,1,719,15,1096,680,938,3500,7054,2500,7053,2500,0,0,0,0,0,0,0,0,,
-1306,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,149,175,1260,230,192,948,4550,2289,8,740,120,518,500,526,1,969,5,7053,800,512,0,0,0,0,0,0,0,0,0,,
-1307,CAT_O_NINE_TAIL,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,181,155,1276,576,288,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,7054,5500,0,0,0,0,0,0,0,0,,
-1308,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,149,200,960,1008,840,7053,4550,7054,3500,999,180,998,360,1003,580,744,800,994,160,512,0,0,0,0,0,0,0,0,0,,
-1309,GAJOMART,Gajomart,63,13699,0,6625,2900,1,916,948,85,50,1,34,10,5,75,140,10,12,0,0,83,149,300,1000,1152,828,953,6500,912,2300,503,870,2279,8,1752,10000,999,640,994,180,512,0,0,0,0,0,0,0,0,0,,
-1310,MAJORUROS,Majoruros,66,57991,0,8525,3799,1,781,1301,10,25,1,50,75,50,85,48,10,12,2,2,43,149,250,1100,960,780,941,4550,1361,4,657,300,984,16,504,850,2611,160,2607,1,1000,250,0,0,0,0,0,0,0,0,,
-1311,GULLINBURSTI,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,1,25,60,5,70,45,10,12,2,2,42,149,150,1960,960,384,1028,3500,656,290,702,6,2276,1,605,15,2627,1,912,160,512,0,0,0,0,0,0,0,0,0,,
-1312,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,181,200,900,1000,500,1529,8,1306,5,512,0,1417,9,7070,5500,512,0,912,5500,658,1,1,5000,967,5500,607,1500,617,2000,967,5500
-1313,MOBSTER,Mobster,61,11347,0,4424,1688,1,910,1128,41,37,1,46,20,35,76,55,10,12,1,7,20,149,250,1100,560,580,1239,3,2601,2,2621,1,716,600,912,2500,525,450,505,60,726,4700,0,0,0,0,0,0,0,0,,
-1314,PERMETER,Perimeter,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,967,4550,7070,45,1019,1240,501,2450,912,1240,522,25,605,1,1519,1,0,0,0,0,0,0,0,0,,
-1315,ASSAULTER,Assaulter,71,15861,0,4854,2654,2,764,1499,35,28,1,74,10,35,100,100,10,12,1,7,44,149,155,1000,900,432,967,4550,7069,1200,7072,840,503,1280,912,1240,522,45,603,1,512,0,0,0,0,0,0,0,0,0,,
-1316,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,967,4550,7070,64,7067,850,502,2100,912,1240,518,850,1519,1,512,0,0,0,0,0,0,0,0,0,,
-1317,SEAL,Seal,63,9114,0,3765,1824,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,133,250,1612,622,583,912,4500,510,250,2310,5,7053,1200,1452,1,525,200,746,120,512,0,0,0,0,0,0,0,0,0,,
-1318,HEATER,Heater,68,11020,0,3766,2359,2,682,1007,40,42,1,47,25,5,71,100,10,12,1,2,43,149,250,1452,483,528,967,4550,7070,750,501,2400,912,1640,526,140,7054,600,1505,2,7068,1250,0,0,0,0,0,0,0,0,,
-1319,FREEZER,Freezer,72,8636,0,3665,2197,1,672,984,55,43,1,41,59,5,67,100,10,12,1,2,41,149,250,1452,483,528,967,4550,7070,850,7066,1250,912,1800,526,160,7053,600,1504,5,512,0,0,0,0,0,0,0,0,0,,
-1320,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,181,195,1345,824,440,7071,4550,7063,1500,1714,1,747,1,1451,3,1513,2,5045,1,7054,1500,0,0,0,0,0,0,0,0,,
-1321,DRAGON_TAIL,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,0,68,15,5,67,67,10,12,1,4,44,149,175,862,534,312,7064,4550,1096,400,943,800,2207,8,2226,2,601,300,602,150,512,0,0,0,0,0,0,0,0,0,,
-1322,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,7054,3500,7053,2500,949,2500,511,800,508,800,510,200,509,800,512,0,0,0,0,0,0,0,0,0,,
-1323,SEE_OTTER,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,1,36,40,25,82,65,10,12,1,2,61,133,190,1132,583,532,722,150,965,5500,7065,4500,725,50,726,50,746,650,7053,1200,512,0,0,0,0,0,0,0,0,0,,
-1324,TREASURE_BOX1,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1325,TREASURE_BOX2,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7073,80,658,500,604,10000,984,5000,985,7500,1239,1500,2252,75,1165,8,0,0,0,0,0,0,0,0,,
-1326,TREASURE_BOX3,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1327,TREASURE_BOX4,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7074,80,658,500,604,10000,984,5000,985,7500,2108,1000,1306,75,5022,8,0,0,0,0,0,0,0,0,,
-1328,TREASURE_BOX5,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1329,TREASURE_BOX6,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7075,80,658,500,604,10000,984,5000,985,7500,2102,834,5019,100,5002,9,0,0,0,0,0,0,0,0,,
-1330,TREASURE_BOX7,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1331,TREASURE_BOX8,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7076,80,658,500,604,10000,984,5000,985,7500,2616,500,2334,125,2622,9,0,0,0,0,0,0,0,0,,
-1332,TREASURE_BOX9,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1333,TREASURE_BOX10,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7077,80,658,500,604,10000,984,5000,985,7500,2104,500,2331,150,2623,10,0,0,0,0,0,0,0,0,,
-1334,TREASURE_BOX11,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1335,TREASURE_BOX12,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7078,80,658,500,604,10000,984,5000,985,7500,2270,500,1716,150,2256,10,0,0,0,0,0,0,0,0,,
-1336,TREASURE_BOX13,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1337,TREASURE_BOX14,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7079,80,658,500,604,10000,984,5000,985,7500,1238,375,1531,150,2318,10,0,0,0,0,0,0,0,0,,
-1338,TREASURE_BOX15,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1339,TREASURE_BOX16,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7080,80,658,500,604,10000,984,5000,985,7500,2626,300,1472,167,2327,10,0,0,0,0,0,0,0,0,,
-1340,TREASURE_BOX17,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1341,TREASURE_BOX18,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7081,80,658,500,604,10000,984,5000,985,7500,1143,250,1237,188,2235,12,0,0,0,0,0,0,0,0,,
-1342,TREASURE_BOX19,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1343,TREASURE_BOX20,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7082,80,658,500,604,10000,984,5000,985,7500,617,250,1229,188,5007,19,0,0,0,0,0,0,0,0,,
-1344,TREASURE_BOX21,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1345,TREASURE_BOX22,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7083,80,658,500,604,10000,984,5000,985,7500,2508,1000,2336,69,2621,20,0,0,0,0,0,0,0,0,,
-1346,TREASURE_BOX23,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1347,TREASURE_BOX24,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7084,80,658,500,604,10000,984,5000,985,7500,2106,1000,1164,50,5025,24,0,0,0,0,0,0,0,0,,
-1348,TREASURE_BOX25,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1349,TREASURE_BOX26,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7085,80,658,500,604,10000,984,5000,985,7500,2231,750,2624,46,2286,25,0,0,0,0,0,0,0,0,,
-1350,TREASURE_BOX27,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1351,TREASURE_BOX28,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7086,80,658,500,604,10000,984,5000,985,7500,2283,500,2615,41,2234,32,0,0,0,0,0,0,0,0,,
-1352,TREASURE_BOX29,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1353,TREASURE_BOX30,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7087,80,658,500,604,10000,984,5000,985,7500,2507,500,2625,38,5027,34,0,0,0,0,0,0,0,0,,
-1354,TREASURE_BOX31,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1355,TREASURE_BOX32,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7088,80,658,500,604,10000,984,5000,985,7500,2407,429,2269,250,2317,35,0,0,0,0,0,0,0,0,,
-1356,TREASURE_BOX33,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1357,TREASURE_BOX34,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7089,80,658,500,604,10000,984,5000,985,7500,2109,300,2406,273,2258,38,0,0,0,0,0,0,0,0,,
-1358,TREASURE_BOX35,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1359,TREASURE_BOX36,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7090,80,658,500,604,10000,984,5000,985,7500,1142,215,2255,60,5017,38,0,0,0,0,0,0,0,0,,
-1360,TREASURE_BOX37,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1361,TREASURE_BOX38,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7091,80,658,500,604,10000,984,5000,985,7500,1417,50,5053,50,2229,50,0,0,0,0,0,0,0,0,,
-1362,TREASURE_BOX39,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
-1363,TREASURE_BOX40,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7092,80,658,500,604,10000,984,5000,985,7500,2506,43,2254,43,1529,38,0,0,0,0,0,0,0,0,,
-1364,G_ASSULTER,Assaulter,59,18251,0,1,1,2,195,227,35,36,85,55,10,35,145,100,10,12,1,7,44,149,155,1000,900,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1365,APOCALYPSE,Apocalypse,66,22680,0,6540,4935,2,1030,1370,62,49,1,48,120,108,66,85,10,12,2,0,60,133,400,1564,864,576,7095,5500,7094,2400,7093,2200,985,5,757,15,2506,20,512,0,512,0,0,0,0,0,0,0,0,0,,
-1366,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,133,400,1564,864,576,7096,5000,7097,3800,2317,1,2316,2,504,2500,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1367,BLAZZER,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,0,6,43,133,180,1564,864,576,7097,5500,7098,3700,504,4000,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1368,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,1032,7500,1033,5500,2253,30,2207,50,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1369,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,7101,5000,522,300,992,1000,969,1,4205,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1370,SUCCUBUS,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,150,89,87,10,12,1,6,67,133,155,1564,864,576,522,1500,2407,3,2611,500,2613,150,2601,2,1472,1,505,1000,512,0,0,0,0,0,0,0,0,0,,
-1371,FAKE_ANGEL,Fake Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,133,160,1564,864,576,7104,5500,7105,3500,717,1000,715,1000,716,1000,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1372,GOAT,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,2,2,63,145,165,1564,864,576,7106,5000,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,512,0,0,0,0,0,0,0,0,0,,
-1373,LORD_OF_DEATH,Lord of Death,94,303383,0,131343,43345,2,2430,4104,77,73,1,99,120,169,100,106,10,12,2,6,67,181,300,1564,864,576,7108,5500,1417,5,607,2500,2621,2,2624,2,1306,1,1529,2,658,1,10000,1000,732,2000,617,2000,607,5500,732,2000
-1374,INCUBUS,Incubus,75,17281,0,5254,4212,1,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,133,165,1564,864,576,522,1500,504,5500,1306,2,2621,1,2610,500,2613,150,504,1200,5072,1,0,0,0,0,0,0,0,0,,
-1375,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,133,170,1564,864,576,7111,5500,7112,3200,503,800,511,2000,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1376,HARPY,Harpy,70,16599,0,3562,2133,1,956,1231,42,44,1,112,72,103,74,76,10,12,1,6,64,133,155,1564,864,576,7115,5500,7116,2500,502,1500,503,800,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1377,ELDER,Elder,64,21592,0,4650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,133,165,1564,864,576,7099,4500,7117,1500,7118,1500,1472,4,1473,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1378,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,133,170,1564,864,576,7119,4200,7001,4700,715,4000,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1379,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,133,165,1564,864,576,7120,5500,2626,1,2608,30,505,50,510,150,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1380,DRILLER,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,133,165,1564,864,576,1012,7500,715,4000,716,3500,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1381,GRIZZLY,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,54,68,58,70,61,10,12,2,2,63,133,165,1564,864,576,948,7500,919,7500,549,2500,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1382,DIABOLIC,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,133,150,1564,864,576,1038,6800,1039,5700,2605,3,984,20,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1383,EXPLOSION,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,133,165,1564,864,576,7006,6500,7097,2500,7122,3500,756,1000,522,500,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1384,DELETER,Sky Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,105,40,65,72,54,10,12,1,9,44,133,175,1564,864,576,7123,4200,1035,5500,1037,4000,1036,3700,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1385,DELETER_,Earth Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,67,40,65,72,68,10,12,1,9,42,133,175,1564,864,576,7123,4200,1035,5500,1037,4000,1036,3700,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1386,SLEEPER,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,133,195,1564,864,576,7124,5500,1056,5500,997,3500,756,300,1226,5,1222,20,7043,1400,512,0,0,0,0,0,0,0,0,0,,
-1387,GIG,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,41,133,170,1564,864,576,7125,5000,904,7500,716,150,525,2500,994,850,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1388,ARCHANGELING,Archangeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,181,180,1564,864,576,2255,5,610,1800,608,150,985,15,984,55,2317,3,512,500,512,0,0,0,0,0,0,0,0,0,,
-1389,DRACULA,Dracula,85,320096,0,120157,38870,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,181,145,1564,864,576,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,512,0,4134,1,500,5000,607,5500,732,3000,522,1000,607,5000
-1390,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,1060,6500,1611,50,740,1200,2610,800,526,1400,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1391,GALAPAGO,Galapago,63,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,1,2,22,131,165,1564,864,576,7053,6700,610,1500,503,2500,606,100,605,100,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1392,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,7126,500,2312,1,2309,1,999,450,984,1,912,2500,910,5500,7053,1000,0,0,0,0,0,0,0,0,,
-1393,G_MUMMY,G Mummy,0,0,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,,
-1394,G_ZOMBIE,G Zombie,0,0,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,,
-1395,CRYSTAL_1,Wind Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,547,5000,526,3000,607,1000,2504,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
-1396,CRYSTAL_2,Earth Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,604,5000,999,3000,2104,1000,2213,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
-1397,CRYSTAL_3,Fire Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,604,5000,984,3000,7047,1000,2322,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
-1398,CRYSTAL_4,Water Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,505,5000,985,3000,706,1000,2404,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
-1399,EVENT_BAPHO,Baphomet,68,864960,0,562340,87895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,181,100,1068,768,576,1417,550,1306,680,2110,640,1145,480,2327,1500,2111,500,2621,1720,2256,1550,608,0,1000,1000,607,1000,526,500,732,100
-1400,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,7150,4500,7151,5000,912,4000,1019,3500,7111,2500,746,50,512,1,512,1,0,0,0,0,0,0,0,0,,
-1401,SHINOBI,Shinobi,69,12700,0,4970,3010,1,460,1410,34,21,1,85,25,25,100,100,10,12,1,7,67,133,200,1480,480,720,7156,5500,7157,2000,7053,2300,739,30,2337,8,2335,8,2336,1,4001,0,0,0,0,0,0,0,0,0,,
-1402,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,7154,4000,7155,6000,724,5,526,160,506,1000,2610,150,909,0,4001,0,0,0,0,0,0,0,0,0,,
-1403,ANTIQUE_FIRELOCK,Antique Firelock,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,998,5500,7126,1500,549,350,525,300,503,20,512,0,2285,0,512,1,0,0,0,0,0,0,0,0,,
-1404,MIYABI_DOLL,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,7153,2500,7152,5500,1000,1300,7005,100,504,500,2613,1,1904,1,512,0,0,0,0,0,0,0,0,0,,
-1405,TENGU,Tengu,65,16940,0,4207,2843,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,133,150,1056,1056,336,7159,4000,7158,6000,999,80,7063,50,522,200,2278,0,909,0,4001,0,0,0,0,0,0,0,0,0,,
-1406,KAPHA,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,133,200,1152,1152,384,7149,6500,7053,4000,912,600,521,2300,520,2000,640,10,708,100,512,1,0,0,0,0,0,0,0,0,,
-1407,DOKEBI_,Dokebi,0,0,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,,
-1408,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,133,150,872,500,300,7163,4700,7168,2500,602,1000,924,5500,1962,1,1802,5,512,1,512,1,0,0,0,0,0,0,0,0,,
-1409,DUMPLING_CHILD,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,7150,3500,7151,2200,7187,3000,2262,10,553,1000,7192,5000,512,0,512,0,0,0,0,0,0,0,0,0,,
-1410,ENCHANTED_PEACH_TREE,Enchanted Peach Tree,55,10050,0,2591,1799,8,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,400,1288,576,288,7164,4700,522,1700,526,1000,604,300,532,90,512,0,512,0,4001,0,0,0,0,0,0,0,0,0,,
-1412,TAOIST_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,7162,5500,553,5000,548,5500,550,5000,1908,250,757,0,512,1,512,1,0,0,0,0,0,0,0,0,,
-1413,HERMIT_PLANT,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,520,2500,521,2500,1032,3500,1033,3500,1951,3,516,5000,512,0,512,0,0,0,0,0,0,0,0,0,,
-1415,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,133,150,988,288,168,7171,5500,7172,3700,517,2000,756,129,537,600,1214,100,512,1,512,1,0,0,0,0,0,0,0,0,,
-1416,EVIL_NYMPH,Evil Nymph,63,18029,0,3945,2599,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,133,200,1672,672,288,7165,4000,7166,4000,1904,1,984,105,1906,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1417,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,7161,4700,7167,3200,518,800,512,100,526,500,512,1,512,1,512,1,0,0,0,0,0,0,0,0,,
-1418,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,181,200,976,500,400,7169,6500,10020,6500,5012,300,617,1500,512,0,512,0,512,0,512,0,524,0,985,2000,607,3600,608,1000,,
-1419,G_FARMILIAR,Farmoloar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,133,150,1276,576,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1420,G_Skel_archer,Skeleton Archer,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1421,G_ISIS,Isis,43,4828,0,0,0,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,149,200,1384,768,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1422,G_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,133,150,676,576,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1423,G_GHOUL,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,133,250,2456,912,504,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1424,G_SIDE_WINDER,Sidewinder,43,4929,0,0,0,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1425,G_OBEAUNE,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1426,G_MARC,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,133,150,1272,72,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1427,G_NIGHTMARE,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1428,G_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,133,200,1672,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1429,G_ARGIOPE,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,149,300,1792,792,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1430,G_ARGOS,Argor,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1431,G_BAPHOMET_,Baphomet,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,149,100,868,480,120,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1432,G_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,141,200,1120,420,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1433,G_DEVIRUCHI,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1434,G_DRAINLIAR,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,149,250,1276,576,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1435,G_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,149,300,2276,576,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1436,G_JAKK,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1437,G_JOKER,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,149,100,1364,864,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1438,G_KHALITZBURG,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,149,350,528,1000,396,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1439,G_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,149,150,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1440,G_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,149,200,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1441,G_PENOMENA,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,149,400,832,500,600,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1442,G_SASQUATCH,Sasquatch,30,3163,0,0,0,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,149,300,1260,192,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1443,G_CRUISER,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,149,400,1296,1296,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1444,G_CHEPET,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,149,400,672,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1445,G_RAGGLER,Raggler,21,1020,0,0,0,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,149,200,1000,900,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1446,G_INJUSTICE,Injustice,51,7600,0,0,0,1,480,600,0,0,1,42,39,0,71,35,10,12,1,1,47,149,400,770,720,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1447,G_GRYPHON,Gryphon,72,27800,0,0,0,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,181,100,704,504,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1448,G_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,149,200,920,720,200,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1449,G_MUTANT_DRAGON,Muntant Dragon,65,62600,0,0,0,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,181,250,1280,1080,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1450,G_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,149,150,1056,1056,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1451,G_MERMAN,Merman,53,12300,0,0,0,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,149,200,916,816,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1452,G_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,149,200,1050,900,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1453,G_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,133,200,1152,1152,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1454,G_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,149,200,860,660,624,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1455,G_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,133,200,1008,1008,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1456,G_CHIMERA,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,181,200,772,672,360,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1457,G_MANTIS,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1458,G_MARDUK,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1459,G_MARIONETTE,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1460,G_MATYR,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1461,G_MINOROUS,Minorous,52,7431,0,0,0,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1462,G_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,133,200,2420,720,648,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1463,G_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,133,400,2852,1152,840,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1464,G_PASANA,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,149,165,1700,1000,500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1465,G_PETIT,Petit,44,6881,0,0,0,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,149,200,1624,620,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1466,G_PETIT_,Petit,45,5747,0,0,0,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,149,150,1420,1080,528,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1467,G_RAYDRIC,Raydric,52,8613,0,0,0,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1468,G_REQUIEM,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,133,400,1516,816,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1469,G_SKEL_WORKER,Skeletom Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,133,400,2420,720,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1470,G_ZEROM,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,133,200,1780,1080,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1471,G_NINE_TAIL,NineTail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,149,150,840,540,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1472,G_BON_GUN,Bon Gun,32,3520,0,0,0,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1473,G_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,149,300,1960,620,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1474,G_MIMIC,Mimic,51,6120,0,0,0,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1475,G_WRAITH,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,149,300,1816,576,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1476,G_ALARM,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,149,300,1020,500,768,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1477,G_ARCLOUSE,Arclouse,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1478,G_RIDEWORD,Rideword,59,11638,0,0,0,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,149,150,864,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1479,G_SKEL_PRISONER,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,1,20,36,0,76,25,10,12,1,1,69,141,350,1848,500,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1480,G_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,141,350,1768,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1481,G_PUNK,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1482,G_ZHERLTHSH,Zherlthsh,63,18300,0,0,0,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,792,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1483,G_RYBIO,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,149,200,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1484,G_PHENDARK,Phendark,73,22729,0,0,0,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,149,175,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1485,G_MYSTELTAINN,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,181,250,1152,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1486,G_TIRFING,Trifing,71,29900,0,0,0,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,181,100,816,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1487,G_EXECUTIONER,Executioner,65,28980,0,0,0,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,181,200,768,500,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1488,G_ANOLIAN,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,149,200,900,500,864,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1489,G_STING,Sting,61,9500,0,0,0,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,149,300,528,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1490,G_WANDER_MAN,Wandering Man,74,8170,0,0,0,2,750,1000,5,5,1,192,38,45,127,85,10,12,1,6,24,149,100,672,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1491,G_DOKEBI,Dokebi,33,2697,0,0,0,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1492,INCANTATION_SAMURAI,Incantation Samurai,71,218652,0,53600,5000,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,181,200,1152,1152,480,512,0,1165,1,999,5000,984,3500,985,1000,607,5000,512,0,504,5000,5000,1000,607,500,608,1000,985,2000,607,6000
-1493,DRYAD,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,64,149,200,1152,1152,384,7188,3000,7198,1100,7197,6000,1951,200,2269,2,1964,1,7100,3200,512,0,0,0,0,0,0,0,0,0,,
-1494,KIND_OF_BEETLE,Kind of Beetle,34,1874,0,679,442,1,191,243,45,12,1,34,10,1,50,1,10,12,0,4,22,149,200,1152,1152,384,7190,9000,7202,6000,928,600,955,600,2102,15,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1495,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,133,150,1872,1248,428,7203,8000,7188,6000,7201,3000,7049,1500,1019,1000,756,197,0,0,0,0,0,0,0,0,0,0,0,0,,
-1497,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,149,200,1152,1584,400,7188,6500,7189,5000,757,120,604,100,2270,3,921,1000,7201,900,0,0,0,0,0,0,0,0,0,0,,
-1498,WOODEN_SHOOTER,Wooden Shooter,39,3977,0,886,453,9,224,271,10,28,1,35,29,15,120,42,10,12,1,7,42,133,200,1152,1152,384,7049,1000,513,1000,7195,4500,7200,3500,512,100,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1499,WOODEN_FIGHTER,Wooden Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,67,30,10,12,1,7,43,149,200,1152,1152,384,517,4700,7196,4000,513,1000,7198,900,1801,5,1812,3,512,0,512,0,0,0,0,0,0,0,0,0,,
-1500,PARASITE,Parasite,37,3090,0,1098,478,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,149,200,1152,1152,384,7194,2000,7186,3500,7193,6700,711,2300,7198,1000,2270,20,1957,1,0,0,0,0,0,0,0,0,,
-1502,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1503,GIBBET,Gibbet,58,6841,0,4011,1824,3,238,418,28,31,1,42,42,27,46,28,10,12,2,6,27,149,150,1152,1584,400,7218,5500,7212,2000,7222,1000,604,100,716,100,724,10,512,0,512,0,0,0,0,0,0,0,0,0,,
-1504,DULLAHAN,Dullahan,62,12437,0,4517,2963,3,418,647,47,38,1,30,5,45,62,22,10,12,1,1,49,149,155,1152,1152,428,7210,5500,7209,2000,2505,100,2506,2,2614,5,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1505,LOLI_RURI,Loli Ruri,71,23470,0,6641,4314,3,841,1476,39,44,1,66,54,74,81,43,10,12,2,6,87,149,155,1152,1632,424,7206,5500,7219,5500,7214,1000,985,100,7019,2,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1506,DISGUISE,Disguise,55,7543,0,2815,1919,3,267,279,18,29,1,72,45,35,48,65,10,12,1,6,82,149,147,1152,768,732,7221,5500,7216,2000,518,200,2508,10,2502,10,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1507,BLOODY_MURDERER,Bloody Murderer,72,27521,0,9742,3559,3,217,864,37,41,1,30,90,15,52,12,10,12,2,7,67,149,175,1152,1344,400,7208,5500,7207,2000,7223,200,7017,200,984,100,969,10,2288,5,1229,2,0,0,0,0,0,0,0,0,,
-1508,QUVE,Quve,40,4559,0,414,306,3,170,299,12,12,1,61,24,19,37,24,10,12,0,1,29,149,150,1152,1248,400,7220,5500,7205,2000,601,1000,756,100,2504,2,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1509,LUDE,Lude,36,3214,0,392,247,3,164,287,14,10,1,59,60,18,36,21,10,12,0,1,29,149,150,1152,960,752,1059,5500,7220,5500,7225,1000,2282,2,2274,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1510,HYLOZOIST,Hylozoist,51,7186,0,2314,1297,3,181,317,16,51,1,28,26,47,66,14,10,12,0,1,47,149,155,1152,1536,969,7217,5500,7215,2000,7213,1000,7220,1000,740,200,757,100,512,0,512,0,0,0,0,0,0,0,0,0,,
-1511,AMON_RA,Amon Ra,88,1214138,0,87264,35891,5,929,1647,26,52,1,1,90,124,74,45,10,12,2,7,62,181,200,1872,672,480,7211,5500,984,2000,985,2000,607,1000,616,100,5053,10,1557,10,2615,2,8000,3000,7114,10,617,100,512,0,,
-1512,HYEGUN,Hyegun,56,9981,0,2199,1032,3,318,710,12,10,1,40,36,10,73,15,10,12,1,1,49,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,617,10,2614,5,616,10,0,0,0,0,0,0,0,0,,
-1513,CIVIL_SERVANT,Civil Servant,62,14390,0,4023,2750,3,360,650,42,5,1,15,20,60,80,50,10,12,1,2,44,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1514,DANCING_DRAGON,Dancing Dragon,54,9136,0,3030,769,3,239,550,39,10,1,62,55,25,72,22,10,12,1,9,44,131,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1515,GARM_BABY,Hatii Baby,61,20119,0,1022,2980,3,499,680,34,13,1,30,56,55,85,30,10,12,1,2,41,133,300,1152,1152,384,512,0,512,0,512,0,512,0,512,0,617,10,1305,15,616,10,0,0,0,0,0,0,0,0,,
-1516,INCREASE_SOIL,Increase Soil,51,8230,0,2760,2110,3,140,560,30,12,1,45,23,12,69,12,10,12,1,0,62,145,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,48,5920,0,1643,1643,3,199,434,23,16,1,51,19,8,57,30,10,12,1,6,62,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
-1518,BACSOJIN,Bacsojin,75,218652,0,33095,18214,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,1,67,181,200,1152,1152,480,1164,2,1165,2,999,500,984,1000,985,1000,607,500,7151,2000,504,500,5000,1000,607,500,608,500,985,500,,
-1519,Chung_E,Chung E,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,,,,,,,,
-1520,Boiled_Rice,Boiled Rice,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,564,5500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,,,,,,,,
-1582,DEVILING,Deviling,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1583,TAO_GUNKA,Tao Gunka,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1584,TAMRUAN,Tamruan,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1585,MIME_MONKEY,Mime Monkey,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1586,LEAF_CAT,Leaf Cat,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1587,KRABEN,Kraben,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1900,VALARIS,Valaris,99,668000,0,107250,37895,1,440,510,35,45,1,152,96,85,120,95,10,10,0,7,67,181,100,676,1152,768,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,4147,1,13000,0,608,1000,750,400,923,3800,,
-1901,VALARIS_WORSHIPPER,Valaris's Worshipper,50,8578,0,2706,1480,1,260,310,15,25,1,75,55,1,93,45,10,12,0,7,27,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
-1920,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,1010,250,935,500,558,300,501,200,501,200,713,800,558,300,558,300,0,0,0,0,0,0,0,0,,
-1921,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,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,4006,70,0,0,0,0,0,0,0,0,,
-1970,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
-1971,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,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
-1972,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,921,5000,507,800,510,50,743,5,2220,40,921,5,512,0,4022,5,0,0,0,0,0,0,0,0,,
-1973,PECOPECO_,PecoPeco,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,925,5500,2402,20,508,50,507,900,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
-1974,ORK_WARRIOR_,Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,133,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
-1975,MUNAK_,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,4090,3,0,0,0,0,0,0,0,0,,
-1976,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,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,4116,1,0,0,0,0,0,0,0,0,,
-1977,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,938,5500,910,1500,511,500,514,200,729,5,512,0,512,0,4033,5,0,0,0,0,0,0,0,0,,
-1978,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,133,150,676,576,480,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,4115,1,0,0,0,0,0,0,0,0,,
-1979,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,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,4042,1,0,0,0,0,0,0,0,0,,
-1980,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,916,6500,949,700,2302,150,507,550,519,300,715,50,512,0,4008,10,0,0,0,0,0,0,0,0,,
-1981,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,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,0,0,0,0,0,0,,
-1982,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,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,4044,1,0,0,0,0,0,0,0,0,,
-1983,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,942,5500,513,1500,508,100,919,5000,753,5,756,24,512,0,4051,1,0,0,0,0,0,0,0,0,,
-1984,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,990,60,940,6500,911,400,757,49,707,20,935,3000,512,0,4057,1,0,0,0,0,0,0,0,0,,
-1985,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,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,4006,15,0,0,0,0,0,0,0,0,,
-1986,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,133,200,1672,672,288,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,4048,2,0,0,0,0,0,0,0,0,,
-1987,BAPHOMET__,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
-1988,DESERT_WOLF_B_,Desert Wolf Puppy,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,1010,85,919,5500,2306,60,517,600,2301,200,512,0,512,0,4023,10,0,0,0,0,0,0,0,0,,
-1989,DEVIRUCHI_,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,1038,5500,1039,400,2255,2,1458,2,1009,5,912,1500,756,154,4122,1,0,0,0,0,0,0,0,0,,
-1990,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,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,4098,1,0,0,0,0,0,0,0,0,,
-1991,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,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,4004,10,0,0,0,0,0,0,0,0,,
-1992,PETIT__,Petit,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,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,4118,1,0,0,0,0,0,0,0,0,,
-1993,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,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,4017,1,0,0,0,0,0,0,0,0,,
-1994,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,0,0,0,0,0,0,,
-1995,BON_GUN_,Bon Gun,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,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,0,0,0,0,0,0,,
+//File created using Spamrat's Athena Database Editor v1.3.1
+//
+//ID,Name,JName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,Item1,Item2,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per
+//
+1001,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,990,70,904,5500,757,57,943,210,7041,100,508,200,625,20,4068,1,0,0,0,0,0,0,0,0,,
+1002,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1003,TESTEGG,Test Egg,2,10,0,10000,10000,0,3,9,99,0,1,99,1,1,1,1,10,12,0,4,22,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1004,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,992,50,939,5500,909,3500,1208,15,511,350,518,100,512,0,4019,10,0,0,0,0,0,0,0,0,,
+1005,FARMILIAR,Familiar,8,155,0,28,15,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,133,150,1276,576,384,913,5500,1105,20,2209,15,601,50,514,100,507,700,645,50,4020,1,0,0,0,0,0,0,0,0,,
+1006,THIEF_BUG_LARVA,Thief Bug Larva,0,0,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,,
+1007,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,914,6500,949,500,1502,80,721,5,511,700,705,1000,1501,200,4002,15,0,0,0,0,0,0,0,0,,
+1008,PUPA,Pupa,2,427,0,2,4,0,1,2,0,20,1,1,1,1,1,20,10,12,0,4,22,128,1000,1001,1,1,1010,80,915,5500,938,600,2102,2,935,1000,938,600,1002,200,4003,7,0,0,0,0,0,0,0,0,,
+1009,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,917,6500,1702,150,715,80,1750,5500,517,400,916,2000,512,0,4015,2,0,0,0,0,0,0,0,0,,
+1010,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,902,6500,1019,100,907,600,516,700,1068,3500,512,0,1066,2000,4010,7,0,0,0,0,0,0,0,0,,
+1011,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,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
+1012,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,918,5500,908,500,511,300,721,7,713,2000,512,0,512,0,4014,5,0,0,0,0,0,0,0,0,,
+1013,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,1011,20,920,5500,2308,10,517,650,528,1050,919,5500,512,0,4029,5,0,0,0,0,0,0,0,0,,
+1014,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,921,5000,507,800,510,50,743,5,2220,40,921,5,512,0,4022,5,0,0,0,0,0,0,0,0,,
+1015,ZOMBIE,Zombie,15,534,0,50,33,1,67,79,0,10,1,8,7,1,15,1,10,12,1,1,29,133,400,2612,912,288,957,5500,724,5,938,1000,958,50,727,55,512,0,512,0,4038,1,0,0,0,0,0,0,0,0,,
+1016,ARCHER_SKELETON,Skeleton Archer,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,932,4500,756,70,2285,4,1708,35,1752,1000,501,800,1701,150,4094,1,0,0,0,0,0,0,0,0,,
+1017,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,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,4026,7,0,0,0,0,0,0,0,0,,
+1018,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,924,5500,2322,10,518,150,602,100,2207,2,712,500,512,0,4040,3,0,0,0,0,0,0,0,0,,
+1019,PECOPECO,PecoPeco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,153,200,1564,864,576,925,5500,2402,20,508,50,507,900,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
+1020,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,993,50,905,5500,1405,30,511,350,711,300,706,1,512,0,4030,1,0,0,0,0,0,0,0,0,,
+1021,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,141,300,988,288,768,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,4050,1,0,0,0,0,0,0,0,0,,
+1022,WEREWOLF,Werewolf,80,28600,0,11813,7289,2,2560,3280,65,35,1,97,60,1,135,52,10,10,2,0,40,181,200,1500,768,652,999,500,1034,4000,984,500,985,500,7017,800,714,380,1912,300,4091,50,0,0,0,0,0,0,0,0,,
+1023,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,133,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
+1024,WORM_TAIL,Worm Tail,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,993,60,1011,25,906,5500,1408,30,508,70,721,5,10015,10,4034,5,0,0,0,0,0,0,0,0,,
+1025,BOA,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,926,5500,1117,15,507,900,1011,35,937,800,954,1,512,0,4037,1,0,0,0,0,0,0,0,0,,
+1026,MUNAK,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,4090,3,0,0,0,0,0,0,0,0,,
+1027,RAPTICE,Raptice,0,0,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,,
+1028,SOLDIER_SKELETON,Skeleton Soldier,29,2334,0,372,226,1,221,245,10,15,1,15,22,5,40,15,10,12,1,1,29,133,200,2276,576,432,932,5500,756,60,1214,12,501,700,934,10,1201,150,1216,50,4086,1,0,0,0,0,0,0,0,0,,
+1029,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,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,4116,1,0,0,0,0,0,0,0,0,,
+1030,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,1011,50,937,5500,1455,10,926,1500,936,200,508,150,756,38,4062,1,0,0,0,0,0,0,0,0,,
+1031,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,938,5500,910,1500,511,500,514,200,729,5,512,0,512,0,4033,5,0,0,0,0,0,0,0,0,,
+1032,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,929,5500,912,700,930,1100,509,550,512,0,2612,200,639,20,4107,1,0,0,0,0,0,0,0,0,,
+1033,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,133,200,1452,672,432,990,50,907,5500,1019,3500,757,37,2329,30,516,1000,512,0,4052,1,0,0,0,0,0,0,0,0,,
+1034,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,1011,45,908,5500,911,600,509,30,725,5,918,2000,512,0,4058,1,0,0,0,0,0,0,0,0,,
+1035,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,133,150,676,576,480,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,4115,1,0,0,0,0,0,0,0,0,,
+1036,GHOUL,Ghoul,39,5118,0,882,541,1,420,500,5,20,1,20,29,1,33,20,10,12,1,11,49,133,250,2456,912,504,958,5500,756,110,509,670,506,800,2609,60,934,150,1260,1,4110,2,0,0,0,0,0,0,0,0,,
+1037,SIDEWINDER,Sidewinder,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,954,5500,912,1400,756,134,1120,2,937,2500,926,5000,509,1000,4117,1,0,0,0,0,0,0,0,0,,
+1038,OSIRIS,Osiris,78,415400,0,71500,28600,1,780,2880,10,25,1,75,62,37,86,40,10,10,1,1,89,181,100,1072,672,384,617,2000,1232,150,2235,200,1255,600,1009,1000,985,3500,984,3900,4144,1,7710,0,603,4000,608,3000,751,500,603,4000
+1039,BAPHOMET,Baphomet,81,668000,0,107250,37895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,181,100,1068,768,576,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,4147,1,13000,0,608,1000,750,400,923,3800,,
+1040,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,999,150,953,5500,912,220,757,61,1003,120,715,200,998,350,4072,3,0,0,0,0,0,0,0,0,,
+1041,MUMMY,Mummy,37,5176,0,488,314,1,305,360,0,10,1,19,32,0,63,20,10,12,1,1,49,133,300,1772,72,384,930,5500,756,100,934,550,2604,1,2611,10,525,250,502,450,4106,1,0,0,0,0,0,0,0,0,,
+1042,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,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,4042,1,0,0,0,0,0,0,0,0,,
+1043,SEAHORES,Seahorse,18,1452,0,122,78,3,100,150,15,7,1,1,1,1,1,1,10,10,0,5,22,129,200,1500,800,600,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1044,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,995,13,950,5500,5014,1,2326,10,720,10,951,500,748,25,4093,2,0,0,0,0,0,0,0,0,,
+1045,MARC,Marc,36,6900,0,988,625,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,133,150,1272,72,480,995,18,956,5500,756,95,951,1000,720,10,717,200,509,600,4105,1,0,0,0,0,0,0,0,0,,
+1046,DOPPELGANGER,Doppelganger,72,249000,0,51480,10725,1,1340,1590,60,35,1,90,90,35,125,65,10,10,1,6,67,181,100,480,480,288,2258,350,2317,250,1162,220,1168,150,1411,550,985,3800,984,2700,4142,1,5340,0,724,1500,505,6000,724,1500,,
+1047,PECOPECO_EGG,PecoPeco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,0,1,20,10,12,0,0,60,128,1000,1001,1,1,1010,250,935,1500,2102,2,501,400,501,400,713,1800,736,10,4007,2,0,0,0,0,0,0,0,0,,
+1048,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,128,1000,701,1,1,1010,300,915,5000,2102,2,938,600,716,100,737,10,1002,350,4012,7,0,0,0,0,0,0,0,0,,
+1049,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,916,6500,949,700,2302,150,507,550,519,300,715,50,512,0,4008,10,0,0,0,0,0,0,0,0,,
+1050,SHELL_PICKY,Shell 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,916,6500,949,700,5015,10,507,600,519,300,715,50,10012,10,4011,10,0,0,0,0,0,0,0,0,,
+1051,THIEF_BUG,Thief Bug Larva,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,955,2500,2304,80,507,350,909,2000,2303,120,1002,350,512,0,4016,10,0,0,0,0,0,0,0,0,,
+1052,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,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,0,0,0,0,0,0,,
+1053,THIEF_BUG_,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,955,3500,910,250,1108,15,928,200,507,400,716,50,1002,400,4026,7,0,0,0,0,0,0,0,0,,
+1054,THIEF_BUG__,Thief Bug Male,19,583,0,223,93,1,76,88,15,5,1,29,16,5,36,1,10,12,1,4,27,141,300,988,288,768,1011,40,928,5500,955,1500,1152,10,508,90,729,5,1116,50,4050,1,0,0,0,0,0,0,0,0,,
+1055,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,993,70,952,5500,713,2000,511,400,507,1000,1451,50,1002,350,4036,2,0,0,0,0,0,0,0,0,,
+1056,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,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,4044,1,0,0,0,0,0,0,0,0,,
+1057,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,942,5500,513,1500,508,100,919,5000,753,5,756,24,512,0,4051,1,0,0,0,0,0,0,0,0,,
+1058,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,990,60,940,6500,911,400,757,49,707,20,935,3000,512,0,4057,1,0,0,0,0,0,0,0,0,,
+1059,MISTRESS,Mistress,74,212000,0,39325,27170,1,880,1110,40,60,1,165,60,95,70,130,10,12,0,4,84,181,100,1148,648,300,1413,150,518,10000,2249,250,616,1000,7018,10,985,4400,984,3300,4132,1,2569,5000,996,1500,526,4000,722,3000,,
+1060,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,948,5500,2289,5,919,5000,740,80,516,1500,518,400,756,43,4074,1,0,0,0,0,0,0,0,0,,
+1061,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,944,5500,510,500,2608,2,603,30,505,100,1261,1,984,60,4127,1,0,0,0,0,0,0,0,0,,
+1062,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,529,2000,530,1000,507,1000,512,1000,2236,100,741,10,512,0,4005,1,0,0,0,0,0,0,0,0,,
+1063,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,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,4006,15,0,0,0,0,0,0,0,0,,
+1064,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,959,5500,932,1500,510,80,717,120,719,10,603,2,624,20,4067,1,0,0,0,0,0,0,0,0,,
+1065,STROUF,Strouf,40,9952,0,1238,752,1,200,350,5,50,1,40,45,72,43,65,10,12,2,5,61,133,150,1872,672,384,951,5500,756,115,2241,2,1461,2,949,3000,720,20,956,1500,4111,1,0,0,0,0,0,0,0,0,,
+1066,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,991,35,960,5500,910,3000,2313,5,943,100,757,34,717,50,4049,1,0,0,0,0,0,0,0,0,,
+1067,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,991,45,961,5500,911,800,757,53,2106,5,943,1000,717,100,4061,3,0,0,0,0,0,0,0,0,,
+1068,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,1011,25,962,5500,938,1500,971,20,525,5,517,700,512,0,4035,1,0,0,0,0,0,0,0,0,,
+1069,SWORDFISH,Swordfish,30,4299,0,529,319,1,168,199,5,20,1,30,30,41,62,30,10,12,2,5,41,133,200,1968,768,384,995,10,963,5500,756,33,2257,2,757,45,1117,25,956,600,4089,1,0,0,0,0,0,0,0,0,,
+1070,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,991,30,955,5500,910,400,528,500,507,650,928,450,623,20,4027,5,0,0,0,0,0,0,0,0,,
+1071,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,133,200,1754,554,288,932,3000,2287,15,1125,25,2211,250,1104,250,756,43,628,20,4073,1,0,0,0,0,0,0,0,0,,
+1072,KAHO,Kaho,24,1141,0,287,176,1,128,156,0,50,1,24,24,25,44,5,10,12,1,6,83,133,200,1700,1000,500,994,30,1003,100,953,3000,911,1000,757,10,716,100,970,5,512,0,0,0,0,0,0,0,0,0,,
+1073,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,964,5500,960,1500,7049,700,1001,13,512,0,512,0,757,37,512,0,0,0,0,0,0,0,0,0,,
+1074,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,965,5500,966,1000,7049,500,1056,1000,1001,10,512,0,757,18,512,0,0,0,0,0,0,0,0,0,,
+1075,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,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1076,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,1010,90,932,800,1505,80,909,3000,507,850,2609,30,512,0,4025,7,0,0,0,0,0,0,0,0,,
+1077,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,133,200,1672,672,288,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,4048,2,0,0,0,0,0,0,0,0,,
+1078,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,507,5500,712,1000,711,1000,905,500,906,300,914,500,708,50,2269,2,0,0,0,0,0,0,0,0,,
+1079,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,510,5500,712,1000,711,1000,905,500,906,300,522,50,514,1000,2270,2,0,0,0,0,0,0,0,0,,
+1080,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,511,7000,712,1000,621,20,905,3000,906,1500,704,50,521,50,2270,2,0,0,0,0,0,0,0,0,,
+1081,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,508,5500,712,1000,711,1000,905,500,906,300,707,5,914,500,2269,2,0,0,0,0,0,0,0,0,,
+1082,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,509,5500,712,1000,631,20,905,3000,906,1500,521,50,703,50,2269,2,0,0,0,0,0,0,0,0,,
+1083,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,510,5500,508,1000,509,1000,710,5,608,20,518,500,607,50,714,1,0,0,0,0,0,0,0,0,,
+1084,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,970,50,971,50,630,20,949,2000,991,800,921,5500,921,5500,7033,5500,0,0,0,0,0,0,0,0,,
+1085,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,970,50,972,50,630,20,949,2000,990,1000,921,5500,921,5500,7033,5500,0,0,0,0,0,0,0,0,,
+1086,GOLDEN_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,556,100,768,768,480,969,1000,1524,150,2246,250,10016,500,714,300,984,2000,985,2000,4128,1,25,5000,2610,2000,701,1000,2610,2000,,
+1087,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,181,150,1678,780,648,968,10000,10018,500,1366,150,2106,250,1124,10,984,3700,985,4700,4143,1,4500,5000,725,2000,607,1500,999,5000,725,2000
+1088,VOCAL,Vocal,18,3016,0,110,88,1,71,82,10,30,1,28,26,30,53,40,10,10,1,4,22,181,200,1080,648,480,2247,50,940,8000,721,1000,752,1500,912,700,645,3000,532,60,4021,60,0,0,0,0,0,0,0,0,,
+1089,TOAD,Toad,10,5065,0,100,50,1,26,32,0,0,1,5,10,10,10,25,10,10,1,5,21,181,200,1236,336,432,2244,50,518,2000,729,1000,746,1500,970,100,971,100,512,0,4014,5,0,0,0,0,0,0,0,0,,
+1090,MASTERING,Mastering,2,2415,0,30,10,1,18,24,0,10,1,2,2,0,17,60,10,10,1,3,21,181,300,1072,672,480,2257,200,619,50,722,1000,741,1500,512,8000,512,8000,531,4000,4001,100,0,0,0,0,0,0,0,0,,
+1091,DRAGONFLY,Dragonfly,8,2400,0,88,44,1,22,27,40,0,1,20,8,15,17,5,10,10,0,4,24,181,100,1076,576,480,2245,200,501,8000,719,1500,742,2000,2607,200,625,50,533,3000,4009,40,0,0,0,0,0,0,0,0,,
+1092,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,181,150,1048,648,432,2248,200,920,8000,728,1500,919,5500,725,11,517,8000,626,50,4029,40,0,0,0,0,0,0,0,0,,
+1093,ECLIPSE,Eclipse,6,1800,0,60,55,1,20,26,0,40,1,36,6,0,11,80,10,10,0,2,60,181,200,1456,456,336,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,4006,70,0,0,0,0,0,0,0,0,,
+1094,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,991,35,946,5500,910,1200,935,3000,943,2,757,14,1002,250,4032,5,0,0,0,0,0,0,0,0,,
+1095,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,955,5500,910,1000,938,500,993,40,1001,4,1002,450,757,28,4043,1,0,0,0,0,0,0,0,0,,
+1096,ANGELING,Angeling,20,55000,0,163,144,1,120,195,0,70,1,50,20,75,68,200,10,10,1,8,86,181,200,1272,672,672,2254,100,2324,60,610,500,2282,1,504,1000,512,250,714,40,4054,1,0,0,0,0,0,0,0,0,,
+1097,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,128,1000,1001,1,1,1010,320,935,2500,909,2000,938,650,713,2000,1002,300,512,0,4013,2,0,0,0,0,0,0,0,0,,
+1098,ANUBIS,Anubis,55,12359,0,2906,2700,1,688,812,0,45,1,69,55,75,95,95,10,12,1,8,26,181,200,2000,1000,500,2602,5,504,600,2601,5,1007,15,512,0,512,0,512,0,4138,1,0,0,0,0,0,0,0,0,,
+1099,ARGIOPE,Argiope,41,4382,0,1797,849,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,149,300,1792,792,336,1042,5500,912,1200,757,175,2406,5,511,1500,719,10,512,0,4114,1,0,0,0,0,0,0,0,0,,
+1100,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,1025,5500,911,1200,1042,500,757,61,511,670,508,250,10017,15,4075,2,0,0,0,0,0,0,0,0,,
+1101,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,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
+1102,BATHORY,Bathory,44,5415,0,2503,1034,1,198,398,0,60,1,76,24,85,65,15,10,12,1,7,27,149,100,1504,840,900,1001,200,1061,5500,2252,3,1611,5,1000,30,1006,15,637,20,4119,1,0,0,0,0,0,0,0,0,,
+1103,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,1027,5500,2310,5,919,5500,1455,10,1405,15,1408,20,512,0,4063,1,0,0,0,0,0,0,0,0,,
+1104,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,1026,5500,2502,20,914,3000,919,2500,516,500,2402,25,512,0,4041,1,0,0,0,0,0,0,0,0,,
+1105,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,955,6000,910,3000,938,1200,990,45,1001,8,1002,550,757,34,4043,1,0,0,0,0,0,0,0,0,,
+1106,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,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,4082,1,0,0,0,0,0,0,0,0,,
+1107,DESERT_WOLF_B,Desert Wolf Puppy,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,1010,85,919,5500,2306,60,517,600,2301,200,512,0,512,0,4023,10,0,0,0,0,0,0,0,0,,
+1108,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,995,25,1053,5500,1054,1000,5011,2,971,100,1256,3,756,161,4125,1,0,0,0,0,0,0,0,0,,
+1109,DEVIRUCHI,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,1038,5500,1039,400,2255,2,1458,2,1009,5,912,1500,756,154,4122,1,0,0,0,0,0,0,0,0,,
+1110,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,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,4098,1,0,0,0,0,0,0,0,0,,
+1111,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,1011,60,913,3000,725,20,507,1000,7006,5500,7006,1500,756,40,4069,1,0,0,0,0,0,0,0,0,,
+1112,DRAKE,Drake,70,326666,0,28600,22880,1,1800,2100,20,35,1,80,49,75,79,50,10,12,1,1,29,181,400,620,420,360,1127,600,1125,950,1135,150,1128,400,5019,300,985,3200,984,2300,4137,1,4300,5000,504,5000,719,500,504,5000,,
+1113,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,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,4004,10,0,0,0,0,0,0,0,0,,
+1114,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,1057,5500,1058,500,2291,4,928,2000,1001,10,507,1200,512,0,4056,2,0,0,0,0,0,0,0,0,,
+1115,EDDGA,Eddga,65,152000,0,25025,12870,1,1215,1565,15,15,1,70,85,66,90,85,10,12,2,2,23,181,300,872,1344,432,1133,150,2268,250,518,10000,1258,500,1030,250,985,2300,984,1700,4123,1,6179,5000,1029,5000,1030,1000,994,3000,1029,5000
+1116,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,911,1000,5015,20,7032,550,507,1000,643,300,645,250,757,57,4070,1,0,0,0,0,0,0,0,0,,
+1117,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,149,300,2276,576,336,2217,10,1615,1,2508,2,1551,10,610,200,609,10,509,2000,4141,1,0,0,0,0,0,0,0,0,,
+1118,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,1032,5500,2253,3,704,10,521,50,629,20,905,2000,748,1,4080,1,0,0,0,0,0,0,0,0,,
+1119,FRILLDORA,Frilldora,30,2023,0,529,319,1,200,239,0,10,1,30,38,15,53,30,10,12,1,2,23,145,300,1540,720,432,1012,5500,757,90,903,1500,721,15,715,200,501,800,912,120,4088,1,0,0,0,0,0,0,0,0,,
+1120,GHOSTRING,Ghostring,18,73300,0,101,108,1,82,122,0,60,1,27,18,45,72,30,10,12,1,6,88,181,300,1220,1080,648,1059,5500,2274,100,2336,50,604,500,603,10,714,30,2335,150,4047,1,0,0,0,0,0,0,0,0,,
+1121,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,997,30,1003,150,1040,5500,2286,1,2227,10,1001,100,512,0,4087,1,0,0,0,0,0,0,0,0,,
+1122,GOBLIN_1,Goblin 1,25,1176,0,310,188,1,118,140,10,5,1,53,25,20,38,10,10,12,1,7,24,149,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,4060,1,0,0,0,0,0,0,0,0,,
+1123,GOBLIN_2,Goblin 2,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,998,250,911,1000,5010,3,1511,10,2104,1,501,550,508,120,4060,1,0,0,0,0,0,0,0,0,,
+1124,GOBLIN_3,Goblin 3,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,998,230,911,1000,2275,3,512,0,2104,1,501,550,508,120,4060,1,0,0,0,0,0,0,0,0,,
+1125,GOBLIN_4,Goblin 4,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,993,100,998,170,911,800,2263,3,1508,10,2104,1,501,500,4060,1,0,0,0,0,0,0,0,0,,
+1126,GOBLIN_5,Goblin 5,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,998,150,911,800,1605,15,2104,1,508,100,501,500,508,120,4060,1,0,0,0,0,0,0,0,0,,
+1127,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,993,120,1055,5500,757,70,938,3000,1001,30,7021,1,632,20,4081,2,0,0,0,0,0,0,0,0,,
+1128,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,993,80,1011,35,947,5500,1452,15,935,5500,943,70,512,0,4045,1,0,0,0,0,0,0,0,0,,
+1129,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,953,6500,912,500,2279,5,1752,10000,757,118,633,20,970,50,4103,1,0,0,0,0,0,0,0,0,,
+1130,JAKK,Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,1062,5500,912,900,985,31,2331,5,1008,5,535,1000,512,0,4109,2,0,0,0,0,0,0,0,0,,
+1131,JOKER,Joker,57,12450,0,3706,2362,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,149,100,1364,864,432,912,0,616,0,641,0,502,0,1259,0,984,0,512,0,4139,0,0,0,0,0,0,0,0,0,,
+1132,KHALITZBURG,Khalitzburg,63,19276,0,4378,2750,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,149,350,528,1000,396,932,8000,985,191,5017,1,2108,2,1004,10,504,1000,1127,2,4136,1,0,0,0,0,0,0,0,0,,
+1133,KOBOLD_1,Kobold 1,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,999,100,1034,5500,912,700,985,25,1220,2,2104,5,512,0,4091,1,0,0,0,0,0,0,0,0,,
+1134,KOBOLD_2,Kobold 2,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,999,100,1034,5500,912,200,2104,3,502,100,2101,100,512,0,4091,1,0,0,0,0,0,0,0,0,,
+1135,KOBOLD_3,Kobold 3,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,990,35,999,100,1034,5500,912,200,512,0,2104,3,502,100,4091,1,0,0,0,0,0,0,0,0,,
+1136,KOBOLD_4,Kobold 4,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,999,50,1034,5500,912,100,1355,5,2104,3,502,100,1301,150,4091,1,0,0,0,0,0,0,0,0,,
+1137,KOBOLD_5,Kobold 5,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,999,40,1034,5500,912,100,1514,5,2104,3,502,100,1501,150,4091,1,0,0,0,0,0,0,0,0,,
+1138,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,7031,5500,910,800,911,100,912,10,737,20,508,250,512,0,4076,1,0,0,0,0,0,0,0,0,,
+1139,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,993,110,1031,5500,911,1400,757,70,943,250,721,10,501,650,4079,1,0,0,0,0,0,0,0,0,,
+1140,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,994,35,1045,4500,1608,10,2617,1,1614,3,1006,8,642,20,4112,1,0,0,0,0,0,0,0,0,,
+1141,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,1052,5000,938,1500,991,45,995,2,717,200,631,20,512,0,4055,1,0,0,0,0,0,0,0,0,,
+1142,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,1050,5500,1051,500,1520,10,720,10,717,150,10003,10,512,0,4084,3,0,0,0,0,0,0,0,0,,
+1143,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,1060,5500,2294,5,2605,1,1008,10,1520,15,2407,1,656,200,4113,1,0,0,0,0,0,0,0,0,,
+1144,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,1024,5500,962,3000,717,200,720,10,995,12,1007,5,656,200,4095,2,0,0,0,0,0,0,0,0,,
+1145,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,1017,6500,1018,500,1251,10,2225,5,5009,1,10010,10,2224,15,4046,2,0,0,0,0,0,0,0,0,,
+1146,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,2618,10,528,5000,919,5500,537,400,757,100,656,200,512,0,4097,1,0,0,0,0,0,0,0,0,,
+1147,MAYA,Maya,81,169000,0,42900,17875,1,1800,2070,60,25,1,97,76,95,82,105,10,12,2,4,82,181,100,864,1000,480,10006,500,2615,200,2234,200,639,500,7020,10,985,3500,984,2500,4146,1,10500,5000,730,2000,603,3000,617,2000,730,2000
+1148,MEDUSA,Medusa,79,22408,0,6876,4697,1,827,1100,48,38,1,74,50,57,77,69,10,12,1,6,40,149,180,2000,1000,500,1048,6000,522,2500,702,200,2610,150,722,250,7062,3500,1007,3,4124,1,0,0,0,0,0,0,0,0,,
+1149,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,941,5500,756,196,1361,2,1005,10,516,1500,1301,200,657,150,4126,1,0,0,0,0,0,0,0,0,,
+1150,MOONLIGHT,Moonlight Flower,67,120000,0,27500,14300,1,1200,1700,10,55,1,99,55,82,95,120,10,10,1,6,63,181,150,1276,576,288,5008,1000,1234,100,1525,150,10008,500,985,2600,984,1900,638,500,4131,1,1250,0,1022,5000,504,1500,728,500,1022,5000
+1151,MYST,Myst,38,3745,0,1391,688,1,365,445,0,40,1,38,18,1,53,10,10,12,2,0,25,149,200,1576,576,384,5005,2,1019,800,10005,10,756,65,757,97,605,20,512,0,4108,2,0,0,0,0,0,0,0,0,,
+1152,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,133,200,2420,720,648,922,5500,932,3500,757,80,2299,2,1358,10,506,50,512,0,4085,1,0,0,0,0,0,0,0,0,,
+1153,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,133,400,2852,1152,840,1043,5500,938,3000,714,1,512,0,512,0,512,0,512,0,4071,2,0,0,0,0,0,0,0,0,,
+1154,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,7110,4500,7121,2500,757,20,1105,500,1217,150,512,0,512,0,4099,1,0,0,0,0,0,0,0,0,,
+1155,PETIT,Earth 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,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,4118,1,0,0,0,0,0,0,0,0,,
+1156,PETIT_,Sky 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,1036,5500,1037,300,985,61,509,1000,602,500,912,1500,606,15,4120,1,0,0,0,0,0,0,0,0,,
+1157,PHARAOH,Pharaoh,93,445997,0,114990,41899,1,2267,3015,67,70,1,93,100,104,89,112,10,12,2,7,67,181,125,2000,1000,500,7113,6000,7114,2500,1136,100,2327,150,5002,500,1552,300,984,4500,4148,1,1,5000,1009,5500,526,2000,732,1000,607,6000
+1158,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,1023,5500,963,2000,720,5,517,1000,951,500,756,25,512,0,4077,1,0,0,0,0,0,0,0,0,,
+1159,PHREEONI,Phreeoni,69,188000,0,32175,16445,1,880,1530,10,20,1,85,78,35,130,60,10,10,2,2,60,181,200,1020,1020,288,1015,10000,1223,500,1236,150,1014,5000,2288,300,985,2900,984,2100,4121,1,2700,0,1008,500,730,1000,1000,4000,1008,500
+1160,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,955,5700,910,1100,938,600,992,15,1001,5,1002,500,757,31,4043,1,0,0,0,0,0,0,0,0,,
+1161,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,1052,5500,910,300,938,700,970,2,713,1000,630,20,645,50,4024,1,0,0,0,0,0,0,0,0,,
+1162,RAFFLESIA,Rafflesia,27,1950,0,388,242,1,105,120,20,10,1,27,54,1,76,27,10,10,0,3,22,133,200,1000,2652,1056,1033,5500,911,1600,706,2,708,10,703,10,711,550,509,30,4083,1,0,0,0,0,0,0,0,0,,
+1163,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,985,106,2266,1,2315,2,1158,2,1116,100,1004,10,7054,5500,4133,1,0,0,0,0,0,0,0,0,,
+1164,REQUIEM,Requiem,35,3089,0,800,458,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,133,400,1516,816,432,603,35,714,1,912,2500,958,3500,934,1500,2308,10,512,0,4104,1,0,0,0,0,0,0,0,0,,
+1165,SANDMAN,Sandman,34,3413,0,810,492,1,180,205,10,25,1,34,58,38,60,5,10,12,1,0,62,133,250,1672,720,288,997,35,1056,5500,757,118,7043,200,1001,200,1257,2,728,2,4101,2,0,0,0,0,0,0,0,0,,
+1166,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,1028,5500,656,150,702,2,2276,1,605,10,757,70,526,2,4078,1,0,0,0,0,0,0,0,0,,
+1167,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,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,4017,1,0,0,0,0,0,0,0,0,,
+1168,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,994,45,1046,5500,1005,15,904,5000,943,3000,504,700,512,0,4130,1,0,0,0,0,0,0,0,0,,
+1169,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,133,400,2420,720,384,998,400,1041,5500,757,90,5009,2,999,100,1003,200,1002,800,4092,1,0,0,0,0,0,0,0,0,,
+1170,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,0,0,0,0,0,0,,
+1171,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,1014,2700,911,800,757,10,1111,15,1001,30,943,150,512,0,4059,1,0,0,0,0,0,0,0,0,,
+1172,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,1014,5500,911,2000,757,15,1111,20,943,270,1001,50,512,0,4059,1,0,0,0,0,0,0,0,0,,
+1173,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,1014,3100,911,800,911,10,1114,15,1001,35,943,200,512,0,4059,1,0,0,0,0,0,0,0,0,,
+1174,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,992,60,1011,30,1013,5500,910,2100,757,25,943,10,1002,400,4039,1,0,0,0,0,0,0,0,0,,
+1175,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,1016,5500,919,3000,949,800,528,1000,701,1,512,0,512,0,4028,5,0,0,0,0,0,0,0,0,,
+1176,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,993,90,955,5000,911,200,518,350,518,350,526,200,756,26,4053,1,0,0,0,0,0,0,0,0,,
+1177,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,1044,5500,756,70,938,2500,1006,5,503,50,640,20,512,0,4096,1,0,0,0,0,0,0,0,0,,
+1178,ZEROM,Zerom,23,1109,0,240,149,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,133,200,1780,1080,432,1011,55,998,190,2339,200,2265,3,2408,10,1002,400,1002,400,4064,1,0,0,0,0,0,0,0,0,,
+1179,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,1001,150,1059,5500,2282,1,2333,10,512,0,512,0,512,0,4102,1,0,0,0,0,0,0,0,0,,
+1180,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,149,150,840,540,480,1022,5500,919,7000,603,100,604,100,526,250,525,350,756,100,746,200,0,0,0,0,0,0,0,0,,
+1181,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,181,400,2700,1000,500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1182,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,1069,1500,1070,3000,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1183,CHONCHON_,Angry ChonChon,4,67,0,5,4,1,10,13,10,0,1,10,4,5,12,2,10,12,0,4,24,149,200,1076,576,480,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
+1184,FABRE_,Angry Fabre,1,30,0,1,0,1,4,7,0,0,1,2,1,1,4,5,10,12,0,4,22,133,400,1672,672,480,914,2000,949,250,1502,80,721,2,511,350,705,500,1501,200,4002,0,0,0,0,0,0,0,0,0,,
+1185,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,1001,10,1059,100,2282,0,2333,1,512,0,512,0,512,0,4102,0,0,0,0,0,0,0,0,0,,
+1186,WHISPER_BOSS,Giant Whisper,34,5040,0,537,545,1,198,239,0,45,1,51,14,1,60,1,10,12,0,6,48,149,250,2536,1536,672,1001,150,1059,5500,2282,1,2333,10,512,0,512,0,512,0,4102,1,0,0,0,0,0,0,0,0,,
+1187,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,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1188,BON_GUN,Bon Gun,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,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,0,0,0,0,0,0,,
+1189,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,1063,5500,1753,1000,1756,2500,1755,2500,1716,2,501,1400,509,900,2330,5,0,0,0,0,0,0,0,0,,
+1190,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,181,100,1248,500,360,1363,200,2601,500,5007,150,2627,1000,512,0,985,4400,984,3100,4135,1,12800,5000,968,5500,617,900,512,0,,
+1191,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,617,5,603,45,1065,1200,611,3000,714,3,2626,1,757,270,2205,120,0,0,0,0,0,0,0,0,,
+1192,WRAITH,Wraith,53,10999,0,2199,1099,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,149,300,1816,576,240,1059,6500,2206,10,2506,2,716,650,602,1300,2505,10,731,5,735,10,0,0,0,0,0,0,0,0,,
+1193,ALARM,Alarm,58,10647,0,3987,2300,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,149,300,1020,500,768,1095,5500,2607,20,7005,1500,611,1300,984,105,7026,20,912,1500,4153,1,0,0,0,0,0,0,0,0,,
+1194,ARCLOUSE,Arclouse,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,1096,3500,938,3000,943,800,912,450,716,300,997,20,912,2500,4154,1,0,0,0,0,0,0,0,0,,
+1195,RIDEWORD,Rideword,59,11638,0,2007,3106,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,149,150,864,500,192,1097,5500,1553,4,1554,4,1555,3,1556,2,7015,300,1006,20,722,5,0,0,0,0,0,0,0,0,,
+1196,SKEL_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,1098,3500,7016,100,2320,1,716,600,930,3500,2408,35,934,1500,2282,1,0,0,0,0,0,0,0,0,,
+1197,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,1099,3500,7016,105,2266,1,716,600,930,3500,2408,3,985,112,1093,1,0,0,0,0,0,0,0,0,,
+1198,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,149,200,1500,500,1000,1557,2,2608,30,505,100,716,450,1009,50,4158,1,512,0,512,0,0,0,0,0,0,0,0,0,,
+1199,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,7001,5500,715,800,1001,300,1061,1000,1057,3000,601,1100,10004,10,2502,15,0,0,0,0,0,0,0,0,,
+1200,ZHERLTHSH,Zherlthsh,63,18300,0,3608,2304,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,792,384,7017,5,504,800,503,1200,2331,8,2622,1,984,134,2291,3,4160,1,0,0,0,0,0,0,0,0,,
+1201,RYBIO,Rybio,71,9572,0,6317,3520,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,149,200,1500,500,1000,1015,4000,7017,3,504,800,731,30,1008,10,984,100,512,0,512,0,0,0,0,0,0,0,0,0,,
+1202,PHENDARK,Phendark,73,22729,0,6826,3443,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,149,175,1500,500,1000,1015,4000,7017,4,504,800,512,0,984,150,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1203,MYSTELTAINN,Mysteltainn,76,33350,0,6457,5159,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,181,250,1152,500,240,7019,1,1117,100,1152,70,1155,40,1163,2,999,120,984,243,985,210,0,0,0,0,0,0,0,0,,
+1204,TIRFING,Tyrfing,71,29900,0,5412,4235,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,181,100,816,500,240,7022,1,638,50,1211,100,1214,70,1217,40,999,120,984,189,1157,25,0,0,0,0,0,0,0,0,,
+1205,EXECUTIONER,Executioner,65,28980,0,4730,3536,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,181,200,768,500,384,7024,5,1108,100,1111,80,1114,60,1125,40,999,120,984,145,4163,1,0,0,0,0,0,0,0,0,,
+1206,ANOLIAN,Anolian,63,18960,0,4378,2907,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,149,200,900,500,864,7003,5500,1754,2000,504,650,10019,10,943,5500,2625,1,984,134,526,5,0,0,0,0,0,0,0,0,,
+1207,STING,Sting,61,9500,0,4081,2970,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,149,300,528,500,240,7004,5500,1756,1500,2624,2,1003,130,997,25,10007,10,2209,350,719,3,0,0,0,0,0,0,0,0,,
+1208,WANDERER,Wanderer,74,8170,0,5786,4730,2,450,550,5,5,1,192,38,45,127,85,10,12,1,6,24,149,100,672,500,192,7005,5500,616,1,724,217,2270,5,610,650,984,217,608,3,732,1,0,0,0,0,0,0,0,0,,
+1209,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,7007,5500,528,1000,726,80,746,110,657,150,510,70,984,95,4167,1,0,0,0,0,0,0,0,0,,
+1210,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,7008,5500,947,8000,943,4000,993,200,1451,40,757,18,509,1600,4168,0,0,0,0,0,0,0,0,0,,
+1211,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,7009,5500,992,200,912,1200,602,1000,757,220,610,250,509,1600,4169,1,0,0,0,0,0,0,0,0,,
+1212,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,7010,5500,757,229,757,22,1002,850,999,180,998,300,512,0,4170,1,0,0,0,0,0,0,0,0,,
+1213,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,149,150,1500,500,1000,7002,2500,1304,10,999,90,931,7500,912,1300,756,196,502,900,4171,1,0,0,0,0,0,0,0,0,,
+1214,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,7011,5500,942,7000,985,53,513,5000,634,20,532,1000,607,25,4051,2,0,0,0,0,0,0,0,0,,
+1215,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,7012,5500,509,1800,912,1200,756,115,997,5,1454,20,608,45,4173,1,0,0,0,0,0,0,0,0,,
+1216,PENOMENA,Penomena,57,7256,0,2870,2200,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,149,400,832,500,600,7013,5500,962,8000,938,7000,525,200,719,15,1258,1,716,550,4174,1,0,0,0,0,0,0,0,0,,
+1219,ABYSS_KNIGHT,Knight of Abyss,79,36140,0,8469,6268,1,1600,2150,55,50,1,68,64,25,135,50,10,12,2,7,87,149,300,1500,500,1000,1064,5500,7023,5,2318,1,1410,25,1162,1,985,369,984,259,1162,15,0,0,0,0,0,0,0,0,,
+1220,M_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,181,200,1120,420,288,1253,5,7030,5500,2311,1,517,1200,920,2000,756,53,1217,140,4082,1,0,0,0,0,0,0,0,0,,
+1221,M_SAVAGE,Savage,26,2092,0,357,226,1,146,177,10,5,1,26,54,10,37,10,10,12,2,2,42,181,150,1960,960,384,1028,6000,656,150,702,3,2276,2,605,15,757,70,512,0,4078,1,0,0,0,0,0,0,0,0,,
+1222,L_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,181,200,1500,500,1000,7002,2500,1304,10,999,120,931,8000,912,1600,756,196,502,1100,4066,1,0,0,0,0,0,0,0,0,,
+1223,L_ORC,Orc,24,1400,0,261,160,1,114,136,10,5,1,24,48,25,34,10,10,12,1,7,22,181,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
+1224,L_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,181,200,1672,672,288,921,8000,2221,20,511,650,510,55,972,35,512,0,512,0,4048,2,0,0,0,0,0,0,0,0,,
+1225,L_CHOCO,Choco,43,4278,0,1150,1150,1,315,402,5,5,1,68,55,45,65,25,10,12,0,2,23,181,200,1500,500,1000,7011,5500,942,7000,508,1900,513,5000,2311,2,532,1000,607,25,4051,2,0,0,0,0,0,0,0,0,,
+1226,L_KOBOLD,Kobold,36,3893,0,898,568,1,265,318,15,10,1,90,36,30,52,30,10,12,1,7,44,181,200,1028,528,360,999,90,1034,6000,912,750,985,25,1220,2,2104,5,512,0,4091,1,0,0,0,0,0,0,0,0,,
+1227,L_GOBLIN,Goblin,25,1176,0,282,171,1,118,140,10,5,1,63,25,20,38,45,10,12,1,7,24,181,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,501,800,4060,1,0,0,0,0,0,0,0,0,,
+1228,L_PHEN,Phen,26,3347,0,357,226,1,138,150,0,15,1,26,26,1,88,75,10,12,1,5,41,181,150,2544,1344,1152,1023,6000,963,2300,720,8,517,1100,951,550,756,25,512,0,4077,1,0,0,0,0,0,0,0,0,,
+1229,META_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,914,6500,949,600,1502,80,721,8,511,750,705,1500,1501,200,4002,15,0,0,0,0,0,0,0,0,,
+1230,META_PUPA,Pupa,2,427,0,2,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,4,22,128,1000,1001,1,1,1010,300,915,6000,938,700,2102,2,935,1300,938,700,1002,400,4003,7,0,0,0,0,0,0,0,0,,
+1231,META_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,924,6000,2322,10,518,180,602,200,2207,4,712,800,512,0,4040,3,0,0,0,0,0,0,0,0,,
+1232,META_PECOPECO_EGG,PecoPeco Egg,3,420,0,4,4,0,1,2,20,20,1,1,1,1,1,20,10,12,0,0,60,128,1000,1001,1,1,1010,120,935,1500,2102,2,501,450,501,450,713,2000,736,15,4007,2,0,0,0,0,0,0,0,0,,
+1233,CONCEIVE_PECOPECO,PecoPeco,13,531,0,85,36,1,35,46,0,0,1,13,13,25,27,9,10,12,2,2,23,145,200,1564,864,576,925,6000,2402,20,508,55,507,950,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
+1234,PROVOKE_YOYO,Yoyo,19,879,0,135,85,1,71,82,0,0,1,24,30,35,32,55,10,12,0,2,22,139,200,1054,54,384,942,6000,513,2000,508,130,919,5500,753,7,512,0,512,0,4051,1,0,0,0,0,0,0,0,0,,
+1235,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,141,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
+1236,META_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,128,1000,1001,1,1,1010,135,935,2740,909,3000,938,750,713,2000,1002,320,512,0,4013,2,0,0,0,0,0,0,0,0,,
+1237,META_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,576,955,6000,910,3000,938,1000,935,3000,1001,6,1002,450,757,28,4043,1,0,0,0,0,0,0,0,0,,
+1238,META_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,955,5700,910,1100,938,600,992,15,1001,5,1002,500,757,31,4043,1,0,0,0,0,0,0,0,0,,
+1239,META_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,955,6000,910,3000,938,1200,990,45,1001,8,1002,550,757,34,4043,1,0,0,0,0,0,0,0,0,,
+1240,META_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,916,6500,949,850,2302,150,507,650,519,350,715,60,512,0,4008,2,0,0,0,0,0,0,0,0,,
+1241,META_PICKY_,Shell 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,916,6500,949,850,5015,7,507,750,519,350,715,60,512,0,4011,10,0,0,0,0,0,0,0,0,,
+1242,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,910,3200,938,1500,512,50,720,40,510,75,529,350,5035,1,4175,1,0,0,0,0,0,0,0,0,,
+1243,SASQUATCH,Sasquatch,30,3163,0,529,319,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,149,300,1260,192,192,912,750,509,800,949,1000,5030,1,948,5000,727,30,757,90,4176,1,0,0,0,0,0,0,0,0,,
+1244,JAKK_XMAS,Christmas Jakk,38,3581,0,1113,688,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,1062,5500,912,900,985,31,2331,5,1008,5,535,1000,2236,70,4109,2,0,0,0,0,0,0,0,0,,
+1245,GOBLINE_XMAS,Christmas Goblin,25,1176,0,282,171,1,118,140,10,5,1,53,25,20,38,45,10,12,1,7,24,149,100,1120,620,240,998,270,911,1200,756,43,2297,3,1211,10,2104,5,2236,40,4060,1,0,0,0,0,0,0,0,0,,
+1246,COOKIE_XMAS,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,538,1500,722,45,912,200,2502,25,2501,120,507,1100,501,700,512,0,0,0,0,0,0,0,0,0,,
+1247,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,7034,10000,644,200,538,1500,539,1000,529,5500,530,500,2236,250,4177,1,0,0,0,0,0,0,0,0,,
+1248,CRUISER,Cruiser,35,2820,0,1100,450,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,149,400,1296,1296,432,1098,900,2251,2,998,320,996,5,911,3500,719,35,756,87,4178,1,0,0,0,0,0,0,0,0,,
+1249,MYSTCASE,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,530,90,912,1500,603,20,539,800,722,150,731,5,512,100,529,340,0,0,0,0,0,0,0,0,,
+1250,CHEPET,Chepet,42,4950,0,1518,946,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,149,400,672,672,288,7035,2500,912,750,512,5500,619,40,10019,5,502,300,2508,5,4180,1,0,0,0,0,0,0,0,0,,
+1251,STORMY_KNIGHT,Stormy Knight,77,240000,0,64350,21450,2,1425,1585,35,60,1,185,83,55,130,79,10,12,2,0,84,181,200,468,468,288,1468,150,603,3000,617,4000,2621,200,2506,500,985,4700,984,3500,5007,1,1,5000,720,4500,2406,500,995,3000,720,4700
+1252,GARM,Garm,73,197000,0,50050,20020,3,1700,1900,40,45,1,126,82,65,95,60,10,12,2,2,81,181,400,608,408,336,7036,5500,1131,150,1256,500,4182,1,512,0,985,4100,984,2900,512,0,28473,5000,7036,1000,603,3000,995,3000,7036,1000
+1253,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,912,4000,1039,500,4183,1,512,0,2619,1,1769,2000,757,238,512,0,0,0,0,0,0,0,0,0,,
+1254,RAGGLER,Raggler,21,1020,0,218,140,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,149,200,1000,900,384,7053,3000,916,5000,645,200,656,100,992,90,2225,7,756,32,7054,1500,0,0,0,0,0,0,0,0,,
+1255,NERAID,Neraid,40,4120,0,1126,684,1,325,360,0,10,1,45,50,5,64,5,10,12,0,2,22,149,200,776,576,288,1055,5500,7053,1000,510,230,717,250,656,250,757,180,985,37,4185,1,0,0,0,0,0,0,0,0,,
+1256,PEST,Pest,40,3240,0,1238,752,1,375,450,0,5,1,60,22,5,80,5,10,12,0,2,47,149,200,700,648,480,1055,5500,7054,200,702,10,605,60,716,230,4186,1,756,115,512,0,0,0,0,0,0,0,0,0,,
+1257,INJUSTICE,Injustice,51,7600,0,2118,1488,1,480,600,0,0,1,42,39,1,71,35,10,12,1,1,47,149,400,770,720,336,999,300,7054,5500,7053,3500,2313,5,2316,2,4187,1,1255,2,512,0,0,0,0,0,0,0,0,0,,
+1258,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,2297,3,998,250,911,1000,1765,3000,501,600,1705,25,656,150,512,0,0,0,0,0,0,0,0,0,,
+1259,GRYPHON,Gryphon,72,27800,0,5896,4400,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,181,100,704,504,432,7048,2500,7054,5500,7063,120,1452,1500,757,150,984,185,996,150,1417,1,0,0,0,0,0,0,0,0,,
+1260,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,149,200,920,720,200,7054,5500,734,1000,2505,30,4190,1,512,0,1000,80,747,3,512,0,0,0,0,0,0,0,0,0,,
+1261,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,7053,6000,748,50,5037,120,1767,3000,624,35,528,600,2244,2,512,0,0,0,0,0,0,0,0,0,,
+1262,MUTANT_DRAGONOID,Mutant Dragonoid,65,62600,0,4730,3536,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,181,250,1280,1080,240,7054,5500,1035,500,1036,500,930,500,2627,30,522,150,505,150,504,250,0,0,0,0,0,0,0,0,,
+1263,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,149,150,1056,1056,336,912,5000,932,6000,7005,500,1610,25,1611,8,996,100,1615,1,4191,1,0,0,0,0,0,0,0,0,,
+1264,MERMAN,Merman,53,12300,0,3345,2054,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,149,200,916,816,336,1054,1300,523,300,657,200,720,40,995,35,1460,3,756,203,4192,1,0,0,0,0,0,0,0,0,,
+1265,COOKIE,Cookie,25,950,0,310,188,1,130,153,0,25,1,35,20,53,37,90,10,12,0,7,60,145,200,1036,936,240,538,1000,530,150,979,1,645,280,2402,30,1001,40,2502,20,529,320,0,0,0,0,0,0,0,0,,
+1266,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,938,500,7013,40,1052,1200,508,200,912,60,512,100,4194,1,512,0,0,0,0,0,0,0,0,0,,
+1267,CARAT,Carat,51,5200,0,1926,1353,1,330,417,0,25,1,41,45,5,85,155,10,12,1,6,44,149,200,1078,768,384,7054,3200,536,1000,2409,5,5003,1,4195,1,512,0,504,450,512,0,0,0,0,0,0,0,0,0,,
+1268,BLOODY_KNIGHT,Blood Knight,82,57870,0,10120,6820,3,2150,3030,60,50,1,75,70,77,125,55,10,12,2,0,87,149,250,828,528,192,7054,5500,2229,45,2317,5,2106,65,1170,1,984,304,985,433,1417,2,0,0,0,0,0,0,0,0,,
+1269,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,1095,5500,1019,800,504,900,657,220,7026,30,7027,30,985,163,4197,1,0,0,0,0,0,0,0,0,,
+1270,TOWER_KEEPER,Tower Keeper,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,1095,5500,7054,5500,999,500,520,850,2109,1,7026,2000,7027,2000,4198,1,0,0,0,0,0,0,0,0,,
+1271,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,912,1000,1099,600,7003,2000,608,50,4199,1,512,0,756,129,512,0,0,0,0,0,0,0,0,0,,
+1272,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,181,100,868,768,480,1615,800,5017,500,1237,300,2334,300,2507,100,985,5300,984,4100,2609,140,1,5000,7005,6000,512,0,617,2000,,
+1273,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,149,200,1050,900,288,7053,5500,998,300,2602,1,756,40,1352,10,508,900,2338,1,2206,1,0,0,0,0,0,0,0,0,,
+1274,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,912,100,7049,1000,617,1,512,0,512,0,985,61,757,207,512,0,0,0,0,0,0,0,0,0,,
+1275,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,1152,480,7047,2500,637,40,2407,3,739,30,5085,5,503,400,2215,5,4203,1,0,0,0,0,0,0,0,0,,
+1276,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,7054,5500,4204,1,2315,2,1701,150,1764,2000,1715,3,985,106,512,0,0,0,0,0,0,0,0,0,,
+1277,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,7054,2000,1019,2000,1501,100,512,0,2272,1,503,150,609,35,512,0,0,0,0,0,0,0,0,0,,
+1278,STALACTIC_GOLEM,Stalactite 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,7004,2000,7054,5500,1000,250,997,30,4206,1,757,250,985,163,512,0,0,0,0,0,0,0,0,0,,
+1279,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,149,200,860,660,624,7053,100,943,380,606,200,993,160,1001,140,4207,1,757,106,512,0,0,0,0,0,0,0,0,0,,
+1280,STEAM_GOBLIN,Steam Goblin,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,911,2500,7053,4000,998,300,999,55,1003,320,4208,1,757,124,744,2,0,0,0,0,0,0,0,0,,
+1281,SAGEWORM,Sageworm,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,912,1200,1097,1000,1055,3000,2241,5,505,40,512,1000,5012,1,1550,15,0,0,0,0,0,0,0,0,,
+1282,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,912,250,999,60,1034,5000,512,0,1763,2000,1711,5,756,79,4210,1,0,0,0,0,0,0,0,0,,
+1283,CHIMERA,Chimera,70,32600,0,4950,3000,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,181,200,772,672,360,7054,5500,1048,2500,657,500,1306,1,504,560,1364,1,984,160,4211,1,0,0,0,0,0,0,0,0,,
+1284,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,512,100,512,100,512,100,512,100,512,100,512,100,512,100,512,100,0,0,0,0,0,0,0,0,,
+1285,ARCHER_GUARDIAN,Guardian Archer,74,28634,0,1,1,12,1120,1600,35,60,1,80,80,90,165,55,14,16,2,7,80,133,265,1200,1200,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1286,KNIGHT_GUARDIAN,Guardian Knight,86,30214,0,1,1,2,1280,1560,55,30,1,40,140,65,125,65,14,16,2,7,80,133,275,1200,1200,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1287,SOLDIER_GUARDIAN,Guardian Soldier,56,15670,0,1,1,1,873,1036,35,0,1,56,100,45,103,43,10,12,0,4,22,133,265,1288,288,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1288,EMPERIUM,Emperium,90,68430,0,109,71,1,60,71,40,50,1,17,80,50,26,20,10,12,0,4,22,0,300,1288,288,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1289,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,181,100,1024,1000,480,7053,4550,757,250,756,300,969,100,984,150,985,100,639,50,10006,1,0,0,0,0,0,0,0,0,,
+1290,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,149,150,2276,576,432,7068,2550,756,160,503,800,1220,35,1219,80,1222,3,512,0,2274,1,0,0,0,0,0,0,0,0,,
+1291,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,149,175,1816,576,240,1059,4550,2206,10,2506,8,716,700,732,5,717,850,657,150,603,100,0,0,0,0,0,0,0,0,,
+1292,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,149,150,1000,600,384,1038,4550,1039,450,2255,6,757,160,912,2500,1009,10,1410,3,7054,2500,0,0,0,0,0,0,0,0,,
+1293,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,149,155,1136,720,840,924,4550,2333,10,518,550,602,200,1550,8,1611,8,522,50,7053,1800,0,0,0,0,0,0,0,0,,
+1294,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,149,175,1528,660,432,1031,4550,943,2500,721,10,504,5,656,25,2224,3,2108,1,7053,2500,0,0,0,0,0,0,0,0,,
+1295,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,181,175,1345,824,440,7071,3500,7063,2500,1716,2,1472,1,1402,25,1514,10,5045,5,7054,2500,0,0,0,0,0,0,0,0,,
+1296,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,149,150,1028,528,360,999,450,1034,6500,912,1200,1511,6,1613,2,525,150,526,100,7053,1500,0,0,0,0,0,0,0,0,,
+1297,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,149,175,1772,120,384,930,4550,934,1800,2624,1,2611,150,503,350,756,150,757,100,7053,2500,0,0,0,0,0,0,0,0,,
+1298,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,149,175,2612,912,288,7071,4550,938,1500,958,1500,723,200,727,100,1260,1,2324,2,2627,2,0,0,0,0,0,0,0,0,,
+1299,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,149,120,1120,620,240,998,1200,999,800,756,120,2297,5,2106,2,503,650,2611,240,7054,1500,0,0,0,0,0,0,0,0,,
+1300,CATERPILLAR,Caterpillar,64,14140,0,6272,3107,1,895,1448,47,29,1,25,85,15,69,45,10,12,0,4,22,149,300,1672,672,480,949,3000,7054,5500,2227,20,1000,100,997,50,501,1000,502,500,505,12,0,0,0,0,0,0,0,0,,
+1301,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,149,200,1156,456,384,1021,4550,757,250,1517,3,969,5,2282,1,912,1200,746,250,616,1,0,0,0,0,0,0,0,0,,
+1302,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,181,145,1024,768,480,1615,3,5017,2,2508,3,7054,5500,522,120,504,550,1162,2,7053,2500,0,0,0,0,0,0,0,0,,
+1303,GIANT_HONET,Giant Hornet,56,12834,0,5785,2006,1,650,851,38,43,1,38,32,10,71,64,10,12,0,4,24,149,155,1292,792,340,526,550,518,1200,522,12,610,15,1608,3,722,20,2627,1,516,3500,0,0,0,0,0,0,0,0,,
+1304,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,149,165,1468,468,768,1025,4550,1042,1200,757,140,525,450,943,1200,1096,680,7053,800,7054,800,0,0,0,0,0,0,0,0,,
+1305,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,149,165,1792,792,336,1042,4550,912,2500,2406,1,719,15,1096,680,938,3500,7054,2500,7053,2500,0,0,0,0,0,0,0,0,,
+1306,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,149,175,1260,230,192,948,4550,2289,8,740,120,518,500,526,1,969,5,7053,800,512,0,0,0,0,0,0,0,0,0,,
+1307,CAT_O_NINE_TAIL,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,181,155,1276,576,288,5008,1,638,150,10008,5,985,600,984,800,969,6,617,1,7054,5500,0,0,0,0,0,0,0,0,,
+1308,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,149,200,960,1008,840,7053,4550,7054,3500,999,180,998,360,1003,580,744,800,994,160,512,0,0,0,0,0,0,0,0,0,,
+1309,GAJOMART,Gajomart,63,13699,0,6625,2900,1,916,948,85,50,1,34,10,5,75,140,10,12,0,0,83,149,300,1000,1152,828,953,6500,912,2300,503,870,2279,8,1752,10000,999,640,994,180,512,0,0,0,0,0,0,0,0,0,,
+1310,MAJORUROS,Majoruros,66,57991,0,8525,3799,1,781,1301,10,25,1,50,75,50,85,48,10,12,2,2,43,149,250,1100,960,780,941,4550,1361,4,657,300,984,16,504,850,2611,160,2607,1,1000,250,0,0,0,0,0,0,0,0,,
+1311,GULLINBURSTI,Gullinbursti,62,21331,0,5814,2376,1,699,1431,10,15,1,25,60,5,70,45,10,12,2,2,42,149,150,1960,960,384,1028,3500,656,290,702,6,2276,1,605,15,2627,1,912,160,512,0,0,0,0,0,0,0,0,0,,
+1312,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,181,200,900,1000,500,1529,8,1306,5,512,0,1417,9,7070,5500,512,0,912,5500,658,1,1,5000,967,5500,607,1500,617,2000,967,5500
+1313,MOBSTER,Mobster,61,11347,0,4424,1688,1,910,1128,41,37,1,46,20,35,76,55,10,12,1,7,20,149,250,1100,560,580,1239,3,2601,2,2621,1,716,600,912,2500,525,450,505,60,726,4700,0,0,0,0,0,0,0,0,,
+1314,PERMETER,Perimeter,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,967,4550,7070,45,1019,1240,501,2450,912,1240,522,25,605,1,1519,1,0,0,0,0,0,0,0,0,,
+1315,ASSAULTER,Assaulter,71,15861,0,4854,2654,2,764,1499,35,28,1,74,10,35,100,100,10,12,1,7,44,149,155,1000,900,432,967,4550,7069,1200,7072,840,503,1280,912,1240,522,45,603,1,512,0,0,0,0,0,0,0,0,0,,
+1316,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,967,4550,7070,64,7067,850,502,2100,912,1240,518,850,1519,1,512,0,0,0,0,0,0,0,0,0,,
+1317,SEAL,Seal,63,9114,0,3765,1824,1,845,1202,25,33,1,28,22,15,69,84,10,12,1,2,21,133,250,1612,622,583,912,4500,510,250,2310,5,7053,1200,1452,1,525,200,746,120,512,0,0,0,0,0,0,0,0,0,,
+1318,HEATER,Heater,68,11020,0,3766,2359,2,682,1007,40,42,1,47,25,5,71,100,10,12,1,2,43,149,250,1452,483,528,967,4550,7070,750,501,2400,912,1640,526,140,7054,600,1505,2,7068,1250,0,0,0,0,0,0,0,0,,
+1319,FREEZER,Freezer,72,8636,0,3665,2197,1,672,984,55,43,1,41,59,5,67,100,10,12,1,2,41,149,250,1452,483,528,967,4550,7070,850,7066,1250,912,1800,526,160,7053,600,1504,5,512,0,0,0,0,0,0,0,0,0,,
+1320,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,181,195,1345,824,440,7071,4550,7063,1500,1714,1,747,1,1451,3,1513,2,5045,1,7054,1500,0,0,0,0,0,0,0,0,,
+1321,DRAGON_TAIL,Dragon Tail,61,8368,0,3587,1453,1,520,715,25,19,0,68,15,5,67,67,10,12,1,4,44,149,175,862,534,312,7064,4550,1096,400,943,800,2207,8,2226,2,601,300,602,150,512,0,0,0,0,0,0,0,0,0,,
+1322,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,7054,3500,7053,2500,949,2500,511,800,508,800,510,200,509,800,512,0,0,0,0,0,0,0,0,0,,
+1323,SEE_OTTER,Sea Otter,59,9999,0,3048,1642,1,650,813,33,35,1,36,40,25,82,65,10,12,1,2,61,133,190,1132,583,532,722,150,965,5500,7065,4500,725,50,726,50,746,650,7053,1200,512,0,0,0,0,0,0,0,0,0,,
+1324,TREASURE_BOX1,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1325,TREASURE_BOX2,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7073,80,658,500,604,10000,984,5000,985,7500,1239,1500,2252,75,1165,8,0,0,0,0,0,0,0,0,,
+1326,TREASURE_BOX3,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1327,TREASURE_BOX4,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7074,80,658,500,604,10000,984,5000,985,7500,2108,1000,1306,75,5022,8,0,0,0,0,0,0,0,0,,
+1328,TREASURE_BOX5,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1329,TREASURE_BOX6,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7075,80,658,500,604,10000,984,5000,985,7500,2102,834,5019,100,5002,9,0,0,0,0,0,0,0,0,,
+1330,TREASURE_BOX7,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1331,TREASURE_BOX8,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7076,80,658,500,604,10000,984,5000,985,7500,2616,500,2334,125,2622,9,0,0,0,0,0,0,0,0,,
+1332,TREASURE_BOX9,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1333,TREASURE_BOX10,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7077,80,658,500,604,10000,984,5000,985,7500,2104,500,2331,150,2623,10,0,0,0,0,0,0,0,0,,
+1334,TREASURE_BOX11,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1335,TREASURE_BOX12,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7078,80,658,500,604,10000,984,5000,985,7500,2270,500,1716,150,2256,10,0,0,0,0,0,0,0,0,,
+1336,TREASURE_BOX13,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1337,TREASURE_BOX14,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7079,80,658,500,604,10000,984,5000,985,7500,1238,375,1531,150,2318,10,0,0,0,0,0,0,0,0,,
+1338,TREASURE_BOX15,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1339,TREASURE_BOX16,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7080,80,658,500,604,10000,984,5000,985,7500,2626,300,1472,167,2327,10,0,0,0,0,0,0,0,0,,
+1340,TREASURE_BOX17,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1341,TREASURE_BOX18,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7081,80,658,500,604,10000,984,5000,985,7500,1143,250,1237,188,2235,12,0,0,0,0,0,0,0,0,,
+1342,TREASURE_BOX19,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1343,TREASURE_BOX20,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7082,80,658,500,604,10000,984,5000,985,7500,617,250,1229,188,5007,19,0,0,0,0,0,0,0,0,,
+1344,TREASURE_BOX21,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1345,TREASURE_BOX22,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7083,80,658,500,604,10000,984,5000,985,7500,2508,1000,2336,69,2621,20,0,0,0,0,0,0,0,0,,
+1346,TREASURE_BOX23,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1347,TREASURE_BOX24,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7084,80,658,500,604,10000,984,5000,985,7500,2106,1000,1164,50,5025,24,0,0,0,0,0,0,0,0,,
+1348,TREASURE_BOX25,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1349,TREASURE_BOX26,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7085,80,658,500,604,10000,984,5000,985,7500,2231,750,2624,46,2286,25,0,0,0,0,0,0,0,0,,
+1350,TREASURE_BOX27,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1351,TREASURE_BOX28,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7086,80,658,500,604,10000,984,5000,985,7500,2283,500,2615,41,2234,32,0,0,0,0,0,0,0,0,,
+1352,TREASURE_BOX29,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1353,TREASURE_BOX30,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7087,80,658,500,604,10000,984,5000,985,7500,2507,500,2625,38,5027,34,0,0,0,0,0,0,0,0,,
+1354,TREASURE_BOX31,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1355,TREASURE_BOX32,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7088,80,658,500,604,10000,984,5000,985,7500,2407,429,2269,250,2317,35,0,0,0,0,0,0,0,0,,
+1356,TREASURE_BOX33,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1357,TREASURE_BOX34,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7089,80,658,500,604,10000,984,5000,985,7500,2109,300,2406,273,2258,38,0,0,0,0,0,0,0,0,,
+1358,TREASURE_BOX35,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1359,TREASURE_BOX36,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7090,80,658,500,604,10000,984,5000,985,7500,1142,215,2255,60,5017,38,0,0,0,0,0,0,0,0,,
+1360,TREASURE_BOX37,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1361,TREASURE_BOX38,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7091,80,658,500,604,10000,984,5000,985,7500,1417,50,5053,50,2229,50,0,0,0,0,0,0,0,0,,
+1362,TREASURE_BOX39,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,732,8000,608,3000,607,2500,2504,800,2404,800,2315,800,2104,800,616,1000,0,0,0,0,0,0,0,0,,
+1363,TREASURE_BOX40,Treasure Chest,99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,7092,80,658,500,604,10000,984,5000,985,7500,2506,43,2254,43,1529,38,0,0,0,0,0,0,0,0,,
+1364,G_ASSULTER,Assaulter,59,18251,0,1,1,2,195,227,35,36,85,55,10,35,145,100,10,12,1,7,44,149,155,1000,900,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1365,APOCALYPSE,Apocalypse,66,22680,0,6540,4935,2,1030,1370,62,49,1,48,120,108,66,85,10,12,2,0,60,133,400,1564,864,576,7095,5500,7094,2400,7093,2200,985,5,757,15,2506,20,512,0,512,0,0,0,0,0,0,0,0,0,,
+1366,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,133,400,1564,864,576,7096,5000,7097,3800,2317,1,2316,2,504,2500,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1367,BLAZZER,Blazer,43,8252,0,3173,1871,2,533,709,50,40,1,52,50,39,69,40,10,12,0,6,43,133,180,1564,864,576,7097,5500,7098,3700,504,4000,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1368,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,1032,7500,1033,5500,2253,30,2207,50,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1369,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,7101,5000,522,300,992,1000,969,1,4205,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1370,SUCCUBUS,Succubus,85,16955,0,5357,4322,2,1268,1686,54,48,1,97,95,150,89,87,10,12,1,6,67,133,155,1564,864,576,522,1500,2407,3,2611,500,2613,150,2601,2,1472,1,505,1000,512,0,0,0,0,0,0,0,0,0,,
+1371,FAKE_ANGEL,Fake Angel,65,16845,0,3371,1949,2,513,682,50,35,1,64,57,70,61,88,10,12,0,8,66,133,160,1564,864,576,7104,5500,7105,3500,717,1000,715,1000,716,1000,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1372,GOAT,Goat,69,11077,0,3357,2015,1,457,608,44,25,1,58,66,62,67,43,10,12,2,2,63,145,165,1564,864,576,7106,5000,7107,2500,713,5000,507,500,510,1000,508,2500,511,5500,512,0,0,0,0,0,0,0,0,0,,
+1373,LORD_OF_DEATH,Lord of Death,94,303383,0,131343,43345,2,2430,4104,77,73,1,99,120,169,100,106,10,12,2,6,67,181,300,1564,864,576,7108,5500,1417,5,607,2500,2621,2,2624,2,1306,1,1529,2,658,1,10000,1000,732,2000,617,2000,607,5500,732,2000
+1374,INCUBUS,Incubus,75,17281,0,5254,4212,1,1408,1873,58,46,1,97,95,150,89,87,10,12,1,6,67,133,165,1564,864,576,522,1500,504,5500,1306,2,2621,1,2610,500,2613,150,504,1200,5072,1,0,0,0,0,0,0,0,0,,
+1375,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,133,170,1564,864,576,7111,5500,7112,3200,503,800,511,2000,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1376,HARPY,Harpy,70,16599,0,3562,2133,1,956,1231,42,44,1,112,72,103,74,76,10,12,1,6,64,133,155,1564,864,576,7115,5500,7116,2500,502,1500,503,800,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1377,ELDER,Elder,64,21592,0,4650,3408,3,421,560,45,68,1,76,68,108,72,86,10,12,2,7,80,133,165,1564,864,576,7099,4500,7117,1500,7118,1500,1472,4,1473,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1378,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,133,170,1564,864,576,7119,4200,7001,4700,715,4000,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1379,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,133,165,1564,864,576,7120,5500,2626,1,2608,30,505,50,510,150,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1380,DRILLER,Driller,52,7452,0,3215,1860,1,666,886,48,31,1,66,58,50,60,47,10,12,1,2,22,133,165,1564,864,576,1012,7500,715,4000,716,3500,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1381,GRIZZLY,Grizzly,68,11733,0,3341,2012,1,809,1076,44,32,1,54,68,58,70,61,10,12,2,2,63,133,165,1564,864,576,948,7500,919,7500,549,2500,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1382,DIABOLIC,Diabolic,67,9642,0,3662,2223,1,796,1059,64,36,1,84,53,67,71,69,10,12,0,6,47,133,150,1564,864,576,1038,6800,1039,5700,2605,3,984,20,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1383,EXPLOSION,Explosion,46,8054,0,2404,1642,1,336,447,35,27,1,61,56,50,66,38,10,12,0,2,63,133,165,1564,864,576,7006,6500,7097,2500,7122,3500,756,1000,522,500,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1384,DELETER,Sky Deleter,66,17292,0,3403,2066,1,446,593,45,53,1,105,40,65,72,54,10,12,1,9,44,133,175,1564,864,576,7123,4200,1035,5500,1037,4000,1036,3700,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1385,DELETER_,Earth Deleter,65,15168,0,3403,2066,1,446,593,52,53,1,67,40,65,72,68,10,12,1,9,42,133,175,1564,864,576,7123,4200,1035,5500,1037,4000,1036,3700,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1386,SLEEPER,Sleeper,67,8237,0,3603,2144,1,593,789,49,35,1,48,100,57,75,28,10,12,1,0,42,133,195,1564,864,576,7124,5500,1056,5500,997,3500,756,300,1226,5,1222,20,7043,1400,512,0,0,0,0,0,0,0,0,0,,
+1387,GIG,Gig,60,8409,0,3934,2039,1,360,479,60,28,1,61,80,53,59,46,10,12,0,2,41,133,170,1564,864,576,7125,5000,904,7500,716,150,525,2500,994,850,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1388,ARCHANGELING,Archangeling,60,79523,0,4152,2173,1,669,890,54,58,1,65,80,74,65,105,10,12,1,8,66,181,180,1564,864,576,2255,5,610,1800,608,150,985,15,984,55,2317,3,512,500,512,0,0,0,0,0,0,0,0,0,,
+1389,DRACULA,Dracula,85,320096,0,120157,38870,3,1625,1891,45,76,1,95,90,87,85,100,10,12,2,6,87,181,145,1564,864,576,607,4700,1473,5,1722,5,2507,15,2621,4,1557,4,512,0,4134,1,500,5000,607,5500,732,3000,522,1000,607,5000
+1390,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,1060,6500,1611,50,740,1200,2610,800,526,1400,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1391,GALAPAGO,Galapago,63,9145,0,3204,1966,1,457,608,33,33,1,56,56,45,66,57,10,12,1,2,22,131,165,1564,864,576,7053,6700,610,1500,503,2500,606,100,605,100,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1392,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,7126,500,2312,1,2309,1,999,450,984,1,912,2500,910,5500,7053,1000,0,0,0,0,0,0,0,0,,
+1393,G_MUMMY,G Mummy,0,0,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,,
+1394,G_ZOMBIE,G Zombie,0,0,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,,
+1395,CRYSTAL_1,Wind Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,547,5000,526,3000,607,1000,2504,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
+1396,CRYSTAL_2,Earth Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,604,5000,999,3000,2104,1000,2213,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
+1397,CRYSTAL_3,Fire Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,604,5000,984,3000,7047,1000,2322,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
+1398,CRYSTAL_4,Water Crystal,1,15,0,0,0,1,1,2,100,99,1,1,1,1,999,1,7,12,0,3,22,193,2000,300,300,1,505,5000,985,3000,706,1000,2404,500,2631,300,603,150,617,100,616,50,0,0,0,0,0,0,0,0,,
+1399,EVENT_BAPHO,Baphomet,68,864960,0,562340,87895,2,3220,4040,35,45,1,152,96,85,120,95,10,10,2,6,67,181,100,1068,768,576,1417,550,1306,680,2110,640,1145,480,2327,1500,2111,500,2621,1720,2256,1550,608,0,1000,1000,607,1000,526,500,732,100
+1400,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,7150,4500,7151,5000,912,4000,1019,3500,7111,2500,746,50,512,1,512,1,0,0,0,0,0,0,0,0,,
+1401,SHINOBI,Shinobi,69,12700,0,4970,3010,1,460,1410,34,21,1,85,25,25,100,100,10,12,1,7,67,133,200,1480,480,720,7156,5500,7157,2000,7053,2300,739,30,2337,8,2335,8,2336,1,4001,0,0,0,0,0,0,0,0,0,,
+1402,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,7154,4000,7155,6000,724,5,526,160,506,1000,2610,150,909,0,4001,0,0,0,0,0,0,0,0,0,,
+1403,ANTIQUE_FIRELOCK,Antique Firelock,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,998,5500,7126,1500,549,350,525,300,503,20,512,0,2285,0,512,1,0,0,0,0,0,0,0,0,,
+1404,MIYABI_DOLL,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,7153,2500,7152,5500,1000,1300,7005,100,504,500,2613,1,1904,1,512,0,0,0,0,0,0,0,0,0,,
+1405,TENGU,Tengu,65,16940,0,4207,2843,2,660,980,12,82,1,45,69,45,75,25,10,12,2,6,42,133,150,1056,1056,336,7159,4000,7158,6000,999,80,7063,50,522,200,2278,0,909,0,4001,0,0,0,0,0,0,0,0,0,,
+1406,KAPHA,Kapha,41,7892,0,2278,1552,3,399,719,20,38,1,65,49,22,73,140,10,12,1,5,21,133,200,1152,1152,384,7149,6500,7053,4000,912,600,521,2300,520,2000,640,10,708,100,512,1,0,0,0,0,0,0,0,0,,
+1407,DOKEBI_,Dokebi,0,0,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,,
+1408,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,133,150,872,500,300,7163,4700,7168,2500,602,1000,924,5500,1962,1,1802,5,512,1,512,1,0,0,0,0,0,0,0,0,,
+1409,DUMPLING_CHILD,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,7150,3500,7151,2200,7187,3000,2262,10,553,1000,7192,5000,512,0,512,0,0,0,0,0,0,0,0,0,,
+1410,ENCHANTED_PEACH_TREE,Enchanted Peach Tree,55,10050,0,2591,1799,8,482,603,10,38,1,45,120,39,120,55,10,13,1,3,42,132,400,1288,576,288,7164,4700,522,1700,526,1000,604,300,532,90,512,0,512,0,4001,0,0,0,0,0,0,0,0,0,,
+1412,TAOIST_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,7162,5500,553,5000,548,5500,550,5000,1908,250,757,0,512,1,512,1,0,0,0,0,0,0,0,0,,
+1413,HERMIT_PLANT,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,520,2500,521,2500,1032,3500,1033,3500,1951,3,516,5000,512,0,512,0,0,0,0,0,0,0,0,0,,
+1415,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,133,150,988,288,168,7171,5500,7172,3700,517,2000,756,129,537,600,1214,100,512,1,512,1,0,0,0,0,0,0,0,0,,
+1416,EVIL_NYMPH,Evil Nymph,63,18029,0,3945,2599,1,691,1382,12,75,1,64,12,69,100,80,10,13,1,6,67,133,200,1672,672,288,7165,4000,7166,4000,1904,1,984,105,1906,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1417,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,7161,4700,7167,3200,518,800,512,100,526,500,512,1,512,1,512,1,0,0,0,0,0,0,0,0,,
+1418,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,181,200,976,500,400,7169,6500,10020,6500,5012,300,617,1500,512,0,512,0,512,0,512,0,524,0,985,2000,607,3600,608,1000,,
+1419,G_FARMILIAR,Farmoloar,8,155,0,0,0,1,20,28,0,0,1,12,8,5,28,1,10,12,0,2,27,133,150,1276,576,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1420,G_Skel_archer,Skeleton Archer,31,3040,0,0,0,9,128,153,0,0,1,8,14,5,90,5,10,12,1,1,29,133,300,2864,864,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1421,G_ISIS,Isis,43,4828,0,0,0,1,423,507,10,35,1,65,43,30,72,15,10,12,2,6,27,149,200,1384,768,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1422,G_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,133,150,676,576,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1423,G_GHOUL,Ghoul,39,5118,0,0,0,1,420,500,5,20,1,20,29,0,33,20,10,12,1,1,49,133,250,2456,912,504,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1424,G_SIDE_WINDER,Sidewinder,43,4929,0,0,0,1,240,320,5,10,1,43,40,15,115,20,10,12,1,2,25,149,200,1576,576,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1425,G_OBEAUNE,Obeaune,31,3952,0,0,0,1,141,165,0,40,1,31,31,55,74,85,10,12,1,5,41,149,200,1872,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1426,G_MARC,Marc,36,6900,0,0,0,1,220,280,5,10,1,36,36,20,56,30,10,12,1,5,41,133,150,1272,72,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1427,G_NIGHTMARE,Nightmare,49,4437,0,0,0,1,447,529,0,40,1,74,25,15,64,10,10,12,2,6,68,149,150,1816,816,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1428,G_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,133,200,1672,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1429,G_ARGIOPE,Argiope,41,4382,0,0,0,1,395,480,30,0,1,41,31,10,56,30,10,12,2,4,25,149,300,1792,792,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1430,G_ARGOS,Argor,25,1117,0,0,0,1,158,191,15,0,1,25,25,5,32,15,10,12,2,4,25,149,300,1468,468,768,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1431,G_BAPHOMET_,Baphomet,50,8578,0,0,0,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,149,100,868,480,120,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1432,G_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,141,200,1120,420,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1433,G_DEVIRUCHI,Deviruchi,46,7360,0,0,0,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1434,G_DRAINLIAR,Drainliar,24,1162,0,0,0,1,74,84,0,0,1,36,24,1,78,1,10,12,0,2,47,149,250,1276,576,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1435,G_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,149,300,2276,576,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1436,G_JAKK,Jakk,38,3581,0,0,0,1,315,382,5,30,1,38,38,43,75,45,10,12,1,0,43,149,200,1180,480,648,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1437,G_JOKER,Joker,57,12450,0,0,0,1,621,738,10,35,1,143,47,75,98,175,10,12,2,7,84,149,100,1364,864,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1438,G_KHALITZBURG,Khalitzburg,63,19276,0,0,0,1,875,1025,45,10,1,65,48,5,73,40,10,12,2,1,29,149,350,528,1000,396,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1439,G_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,149,150,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1440,G_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,149,200,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1441,G_PENOMENA,Penomena,57,7256,0,0,0,7,415,565,5,50,1,5,35,15,136,30,10,12,1,5,25,149,400,832,500,600,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1442,G_SASQUATCH,Sasquatch,30,3163,0,0,0,1,250,280,5,0,1,25,60,10,34,20,10,12,2,2,60,149,300,1260,192,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1443,G_CRUISER,Cruiser,35,2820,0,0,0,7,175,215,5,5,1,40,10,10,90,25,10,12,1,0,60,149,400,1296,1296,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1444,G_CHEPET,Chepet,42,4950,0,0,0,1,380,440,0,25,1,72,35,71,65,85,10,12,1,7,23,149,400,672,672,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1445,G_RAGGLER,Raggler,21,1020,0,0,0,1,102,113,0,5,1,10,32,20,39,35,10,12,0,2,24,149,200,1000,900,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1446,G_INJUSTICE,Injustice,51,7600,0,0,0,1,480,600,0,0,1,42,39,0,71,35,10,12,1,1,47,149,400,770,720,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1447,G_GRYPHON,Gryphon,72,27800,0,0,0,1,880,1260,35,35,1,95,78,65,115,75,10,12,2,2,84,181,100,704,504,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1448,G_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,149,200,920,720,200,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1449,G_MUTANT_DRAGON,Muntant Dragon,65,62600,0,0,0,4,2400,3400,15,20,1,47,30,68,45,35,10,12,2,9,43,181,250,1280,1080,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1450,G_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,149,150,1056,1056,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1451,G_MERMAN,Merman,53,12300,0,0,0,2,482,603,10,35,1,45,46,15,85,55,10,12,1,7,41,149,200,916,816,336,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1452,G_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,149,200,1050,900,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1453,G_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,133,200,1152,1152,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1454,G_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,149,200,860,660,624,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1455,G_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,133,200,1008,1008,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1456,G_CHIMERA,Chimera,70,32600,0,0,0,1,1200,1320,30,10,1,72,110,88,75,85,10,12,2,2,63,181,200,772,672,360,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1457,G_MANTIS,Mantis,26,2472,0,0,0,1,118,149,10,0,1,26,24,5,45,15,10,12,1,4,22,149,200,1528,660,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1458,G_MARDUK,Marduk,40,4214,0,0,0,1,315,382,0,60,1,40,20,79,78,20,10,12,2,7,23,149,300,1540,840,504,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1459,G_MARIONETTE,Marionette,41,3222,0,0,0,1,355,422,0,25,1,62,36,44,69,45,10,12,0,6,68,149,300,1480,480,1056,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1460,G_MATYR,Matyr,31,2585,0,0,0,1,134,160,0,0,1,47,38,5,64,5,10,12,1,2,27,149,150,432,432,360,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1461,G_MINOROUS,Minorous,52,7431,0,0,0,1,590,770,15,5,1,42,61,66,52,25,10,12,2,2,43,149,200,1360,960,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1462,G_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,133,200,2420,720,648,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1463,G_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,133,400,2852,1152,840,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1464,G_PASANA,Pasana,61,8289,0,0,0,1,513,682,29,35,1,73,50,61,69,43,10,12,1,7,43,149,165,1700,1000,500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1465,G_PETIT,Petit,44,6881,0,0,0,1,360,427,30,30,1,44,62,69,79,60,10,12,1,9,22,149,200,1624,620,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1466,G_PETIT_,Petit,45,5747,0,0,0,1,300,355,20,45,1,113,45,69,73,80,10,12,1,9,24,149,150,1420,1080,528,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1467,G_RAYDRIC,Raydric,52,8613,0,0,0,1,830,930,40,15,1,47,42,5,69,26,10,12,2,7,47,149,150,824,780,420,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1468,G_REQUIEM,Requim,35,3089,0,0,0,1,220,272,0,15,1,53,35,5,57,2,10,12,1,7,27,133,400,1516,816,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1469,G_SKEL_WORKER,Skeletom Worker,30,2872,0,0,0,1,242,288,0,15,1,15,30,5,42,10,10,12,1,1,29,133,400,2420,720,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1470,G_ZEROM,Zerom,23,1109,0,0,0,1,127,155,0,10,1,23,23,5,42,1,10,12,1,7,23,133,200,1780,1080,432,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1471,G_NINE_TAIL,NineTail,51,9466,0,0,0,1,610,734,10,25,1,80,46,1,89,85,10,12,1,2,63,149,150,840,540,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1472,G_BON_GUN,Bon Gun,32,3520,0,0,0,1,220,260,0,0,1,15,36,10,48,15,10,12,1,1,29,149,200,1720,500,420,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1473,G_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,149,300,1960,620,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1474,G_MIMIC,Mimic,51,6120,0,0,0,1,150,900,10,40,1,121,1,60,75,110,10,12,1,0,60,149,100,972,500,288,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1475,G_WRAITH,Wraith,53,10999,0,0,0,1,580,760,5,30,1,95,30,75,95,35,10,12,2,1,89,149,300,1816,576,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1476,G_ALARM,Alarm,58,10647,0,0,0,1,480,600,15,15,1,62,72,10,85,45,10,12,1,0,60,149,300,1020,500,768,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1477,G_ARCLOUSE,Arclouse,59,6075,0,0,0,1,570,640,10,15,1,75,5,5,75,50,10,12,1,4,42,149,100,960,500,480,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1478,G_RIDEWORD,Rideword,59,11638,0,0,0,1,584,804,5,35,1,75,10,20,120,45,10,12,0,0,60,149,150,864,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1479,G_SKEL_PRISONER,Skeleton Prisoner,52,8691,0,0,0,1,660,890,10,20,1,20,36,0,76,25,10,12,1,1,69,141,350,1848,500,576,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1480,G_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,141,350,1768,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1481,G_PUNK,Punk,43,3620,0,0,0,1,292,365,0,45,1,105,5,45,65,20,10,12,0,3,24,149,300,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1482,G_ZHERLTHSH,Zherlthsh,63,18300,0,0,0,1,700,850,10,15,1,85,40,30,125,60,10,12,1,7,60,141,200,800,792,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1483,G_RYBIO,Rybio,71,9572,0,0,0,1,686,912,45,37,1,97,75,74,77,90,10,12,2,6,40,149,200,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1484,G_PHENDARK,Phendark,73,22729,0,0,0,1,794,1056,52,36,1,62,120,65,77,66,10,12,2,7,40,149,175,1500,500,1000,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1485,G_MYSTELTAINN,Mysteltainn,76,33350,0,0,0,2,1160,1440,30,30,1,139,80,35,159,65,10,12,2,0,87,181,250,1152,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1486,G_TIRFING,Trifing,71,29900,0,0,0,1,950,1146,30,35,1,87,55,35,132,65,10,12,1,0,67,181,100,816,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1487,G_EXECUTIONER,Executioner,65,28980,0,0,0,2,570,950,35,35,1,85,40,25,88,60,10,12,2,0,47,181,200,768,500,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1488,G_ANOLIAN,Anolian,63,18960,0,0,0,1,640,760,15,15,1,43,58,25,97,65,10,12,1,5,41,149,200,900,500,864,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1489,G_STING,Sting,61,9500,0,0,0,1,850,1032,5,30,1,45,55,5,120,85,10,12,1,0,62,149,300,528,500,240,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1490,G_WANDER_MAN,Wandering Man,74,8170,0,0,0,2,750,1000,5,5,1,192,38,45,127,85,10,12,1,6,24,149,100,672,500,192,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1491,G_DOKEBI,Dokebi,33,2697,0,0,0,1,197,249,0,10,1,50,40,35,69,40,10,12,0,6,27,145,250,1156,456,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1492,INCANTATION_SAMURAI,Incantation Samurai,71,218652,0,53600,5000,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,7,67,181,200,1152,1152,480,512,0,1165,1,999,5000,984,3500,985,1000,607,5000,512,0,504,5000,5000,1000,607,500,608,1000,985,2000,607,6000
+1493,DRYAD,Dryad,50,8791,0,2763,1493,3,499,589,15,33,1,75,55,1,78,45,10,12,1,3,64,149,200,1152,1152,384,7188,3000,7198,1100,7197,6000,1951,200,2269,2,1964,1,7100,3200,512,0,0,0,0,0,0,0,0,0,,
+1494,KIND_OF_BEETLE,Kind of Beetle,34,1874,0,679,442,1,191,243,45,12,1,34,10,1,50,1,10,12,0,4,22,149,200,1152,1152,384,7190,9000,7202,6000,928,600,955,600,2102,15,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1495,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,133,150,1872,1248,428,7203,8000,7188,6000,7201,3000,7049,1500,1019,1000,756,197,0,0,0,0,0,0,0,0,0,0,0,0,,
+1497,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,149,200,1152,1584,400,7188,6500,7189,5000,757,120,604,100,2270,3,921,1000,7201,900,0,0,0,0,0,0,0,0,0,0,,
+1498,WOODEN_SHOOTER,Wooden Shooter,39,3977,0,886,453,9,224,271,10,28,1,35,29,15,120,42,10,12,1,7,42,133,200,1152,1152,384,7049,1000,513,1000,7195,4500,7200,3500,512,100,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1499,WOODEN_FIGHTER,Wooden Fighter,41,4457,0,1790,833,1,395,480,30,19,1,41,31,10,67,30,10,12,1,7,43,149,200,1152,1152,384,517,4700,7196,4000,513,1000,7198,900,1801,5,1812,3,512,0,512,0,0,0,0,0,0,0,0,0,,
+1500,PARASITE,Parasite,37,3090,0,1098,478,9,175,215,5,19,1,40,20,10,90,25,10,12,1,3,44,149,200,1152,1152,384,7194,2000,7186,3500,7193,6700,711,2300,7198,1000,2270,20,1957,1,0,0,0,0,0,0,0,0,,
+1502,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1503,GIBBET,Gibbet,58,6841,0,4011,1824,3,238,418,28,31,1,42,42,27,46,28,10,12,2,6,27,149,150,1152,1584,400,7218,5500,7212,2000,7222,1000,604,100,716,100,724,10,512,0,512,0,0,0,0,0,0,0,0,0,,
+1504,DULLAHAN,Dullahan,62,12437,0,4517,2963,3,418,647,47,38,1,30,5,45,62,22,10,12,1,1,49,149,155,1152,1152,428,7210,5500,7209,2000,2505,100,2506,2,2614,5,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1505,LOLI_RURI,Loli Ruri,71,23470,0,6641,4314,3,841,1476,39,44,1,66,54,74,81,43,10,12,2,6,87,149,155,1152,1632,424,7206,5500,7219,5500,7214,1000,985,100,7019,2,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1506,DISGUISE,Disguise,55,7543,0,2815,1919,3,267,279,18,29,1,72,45,35,48,65,10,12,1,6,82,149,147,1152,768,732,7221,5500,7216,2000,518,200,2508,10,2502,10,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1507,BLOODY_MURDERER,Bloody Murderer,72,27521,0,9742,3559,3,217,864,37,41,1,30,90,15,52,12,10,12,2,7,67,149,175,1152,1344,400,7208,5500,7207,2000,7223,200,7017,200,984,100,969,10,2288,5,1229,2,0,0,0,0,0,0,0,0,,
+1508,QUVE,Quve,40,4559,0,414,306,3,170,299,12,12,1,61,24,19,37,24,10,12,0,1,29,149,150,1152,1248,400,7220,5500,7205,2000,601,1000,756,100,2504,2,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1509,LUDE,Lude,36,3214,0,392,247,3,164,287,14,10,1,59,60,18,36,21,10,12,0,1,29,149,150,1152,960,752,1059,5500,7220,5500,7225,1000,2282,2,2274,1,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1510,HYLOZOIST,Hylozoist,51,7186,0,2314,1297,3,181,317,16,51,1,28,26,47,66,14,10,12,0,1,47,149,155,1152,1536,969,7217,5500,7215,2000,7213,1000,7220,1000,740,200,757,100,512,0,512,0,0,0,0,0,0,0,0,0,,
+1511,AMON_RA,Amon Ra,88,1214138,0,87264,35891,5,929,1647,26,52,1,1,90,124,74,45,10,12,2,7,62,181,200,1872,672,480,7211,5500,984,2000,985,2000,607,1000,616,100,5053,10,1557,10,2615,2,8000,3000,7114,10,617,100,512,0,,
+1512,HYEGUN,Hyegun,56,9981,0,2199,1032,3,318,710,12,10,1,40,36,10,73,15,10,12,1,1,49,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,617,10,2614,5,616,10,0,0,0,0,0,0,0,0,,
+1513,CIVIL_SERVANT,Civil Servant,62,14390,0,4023,2750,3,360,650,42,5,1,15,20,60,80,50,10,12,1,2,44,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1514,DANCING_DRAGON,Dancing Dragon,54,9136,0,3030,769,3,239,550,39,10,1,62,55,25,72,22,10,12,1,9,44,131,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1515,GARM_BABY,Hatii Baby,61,20119,0,1022,2980,3,499,680,34,13,1,30,56,55,85,30,10,12,1,2,41,133,300,1152,1152,384,512,0,512,0,512,0,512,0,512,0,617,10,1305,15,616,10,0,0,0,0,0,0,0,0,,
+1516,INCREASE_SOIL,Increase Soil,51,8230,0,2760,2110,3,140,560,30,12,1,45,23,12,69,12,10,12,1,0,62,145,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1517,LI_ME_MANG_RYANG,Li Me Mang Ryang,48,5920,0,1643,1643,3,199,434,23,16,1,51,19,8,57,30,10,12,1,6,62,133,200,1152,1152,384,512,0,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,0,0,0,0,0,0,,
+1518,BACSOJIN,Bacsojin,75,218652,0,33095,18214,1,1219,2169,10,51,1,85,78,85,150,60,10,12,2,1,67,181,200,1152,1152,480,1164,2,1165,2,999,500,984,1000,985,1000,607,500,7151,2000,504,500,5000,1000,607,500,608,500,985,500,,
+1519,Chung_E,Chung E,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,,,,,,,,
+1520,Boiled_Rice,Boiled Rice,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,564,5500,512,0,512,0,512,0,512,0,512,0,512,0,512,0,0,0,,,,,,,,
+1582,DEVILING,Deviling,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1583,TAO_GUNKA,Tao Gunka,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1584,TAMRUAN,Tamruan,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1585,MIME_MONKEY,Mime Monkey,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1586,LEAF_CAT,Leaf Cat,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1587,KRABEN,Kraben,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1900,VALARIS,Valaris,99,668000,0,107250,37895,1,440,510,35,45,1,152,96,85,120,95,10,10,0,7,67,181,100,676,1152,768,1466,200,2256,200,2607,800,714,500,617,3000,984,4300,985,5600,4147,1,13000,0,608,1000,750,400,923,3800,,
+1901,VALARIS_WORSHIPPER,Valaris's Worshipper,50,8578,0,2706,1480,1,260,310,15,25,1,75,55,1,93,45,10,12,0,7,27,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
+1920,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,1010,250,935,500,558,300,501,200,501,200,713,800,558,300,558,300,0,0,0,0,0,0,0,0,,
+1921,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,2250,200,515,8000,727,1200,746,1500,706,30,622,50,534,5000,4006,70,0,0,0,0,0,0,0,0,,
+1970,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,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0,0,0,0,0,0,0,,
+1971,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,998,50,935,6500,909,1500,1205,55,601,100,742,5,1002,150,4009,5,0,0,0,0,0,0,0,0,,
+1972,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,921,5000,507,800,510,50,743,5,2220,40,921,5,512,0,4022,5,0,0,0,0,0,0,0,0,,
+1973,PECOPECO_,PecoPeco,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,925,5500,2402,20,508,50,507,900,1604,100,512,0,512,0,4031,3,0,0,0,0,0,0,0,0,,
+1974,ORK_WARRIOR_,Orc Warrior,24,1400,0,261,160,1,104,126,10,5,1,24,48,25,34,10,10,12,1,7,22,133,200,1864,864,288,998,210,931,5500,756,40,2267,3,1352,10,1304,5,1301,100,4066,1,0,0,0,0,0,0,0,0,,
+1975,MUNAK_,Munak,30,2872,0,361,218,1,180,230,0,0,1,15,20,5,46,15,10,12,1,1,29,133,200,2468,768,288,901,5500,2264,1,2404,15,609,20,2337,1,2305,100,1558,5,4090,3,0,0,0,0,0,0,0,0,,
+1976,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,936,5500,2233,5,2603,1,733,150,732,20,954,1000,731,5,4116,1,0,0,0,0,0,0,0,0,,
+1977,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,938,5500,910,1500,511,500,514,200,729,5,512,0,512,0,4033,5,0,0,0,0,0,0,0,0,,
+1978,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,133,150,676,576,480,996,30,999,100,943,5500,912,1300,756,129,2259,1,1226,2,4115,1,0,0,0,0,0,0,0,0,,
+1979,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,992,70,999,30,910,2400,935,3500,943,30,998,200,1002,500,4042,1,0,0,0,0,0,0,0,0,,
+1980,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,916,6500,949,700,2302,150,507,550,519,300,715,50,512,0,4008,10,0,0,0,0,0,0,0,0,,
+1981,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,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,0,0,0,0,0,0,,
+1982,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,945,5500,919,5500,516,800,2213,2,754,2,912,6,729,3,4044,1,0,0,0,0,0,0,0,0,,
+1983,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,942,5500,513,1500,508,100,919,5000,753,5,756,24,512,0,4051,1,0,0,0,0,0,0,0,0,,
+1984,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,990,60,940,6500,911,400,757,49,707,20,935,3000,512,0,4057,1,0,0,0,0,0,0,0,0,,
+1985,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,705,6500,949,1000,2262,4,1102,100,512,600,515,1100,622,20,4006,15,0,0,0,0,0,0,0,0,,
+1986,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,133,200,1672,672,288,7033,5500,2221,20,511,550,510,50,972,30,921,1200,912,6,4048,2,0,0,0,0,0,0,0,0,,
+1987,BAPHOMET__,Baphomet Jr.,50,8578,0,2706,1480,1,487,590,15,25,1,75,55,1,93,45,10,12,0,6,27,149,100,868,480,120,923,500,984,63,1464,2,607,50,610,100,503,300,2405,50,4129,1,0,0,0,0,0,0,0,0,,
+1988,DESERT_WOLF_B_,Desert Wolf Puppy,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,1010,85,919,5500,2306,60,517,600,2301,200,512,0,512,0,4023,10,0,0,0,0,0,0,0,0,,
+1989,DEVIRUCHI_,Deviruchi,46,7360,0,2662,1278,1,475,560,10,25,1,69,40,55,87,30,10,12,0,6,27,149,150,980,600,384,1038,5500,1039,400,2255,2,1458,2,1009,5,912,1500,756,154,4122,1,0,0,0,0,0,0,0,0,,
+1990,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,1021,5500,757,112,1517,2,1613,1,969,1,1501,300,1005,5,4098,1,0,0,0,0,0,0,0,0,,
+1991,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,909,7500,1602,80,938,500,512,1100,713,1700,741,5,620,20,4004,10,0,0,0,0,0,0,0,0,,
+1992,PETIT__,Petit,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,1035,5500,1037,300,756,140,509,1000,1510,150,912,1500,606,15,4118,1,0,0,0,0,0,0,0,0,,
+1993,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,919,5500,1302,100,517,500,1750,1000,949,850,1010,80,627,20,4017,1,0,0,0,0,0,0,0,0,,
+1994,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,1020,5500,1049,50,2277,1,2504,5,1217,5,501,1000,512,0,4100,1,0,0,0,0,0,0,0,0,,
+1995,BON_GUN_,Bon Gun,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,1094,5500,7014,40,618,60,2337,2,609,15,508,1000,502,250,5046,1,0,0,0,0,0,0,0,0,,
diff --git a/db/mob_db2.txt b/db/mob_db2.txt
index a214ef682..3564039ca 100644
--- a/db/mob_db2.txt
+++ b/db/mob_db2.txt
@@ -1,74 +1,74 @@
-//knight quest mobs with poring stats
-1419,G_FARMILIAR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1420,G_ARCHER_SKELETON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1421,G_ISIS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1422,G_HUNTER_FLY,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1423,G_GHOUL,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1424,G_SIDE_WINDER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1425,G_OBEAUNE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1426,G_MARC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1427,G_NIGHTMARE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1428,G_POISON_SPORE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1429,G_ARGIOPE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1430,G_ARGOS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1431,G_BAPHOMET_,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1432,G_DESERT_WOLF,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1433,G_DEVIRUCHI,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1434,G_DRAINLIAR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1435,G_EVIL_DRUID,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1436,G_JAKK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1437,G_JOKER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1438,G_KHALITZBURG,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1439,G_HIGH_ORC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1440,G_STEM_WORM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1441,G_PENOMENA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1442,G_SASQUATCH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1443,G_CRUISER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1444,G_CHEPET,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1445,G_RAGGLER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1446,G_INJUSTICE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1447,G_GRYPHON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1448,G_DARK_FRAME,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1449,G_MUTANT_DRAGON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1450,G_WIND_GHOST,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1451,G_MERMAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1452,G_ORC_LADY,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1453,G_RAYDRIC_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1454,G_TRI_JOINT,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1455,G_KOBOLD_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1456,G_CHIMERA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1457,G_MANTIS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1458,G_MARDUK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1459,G_MARIONETTE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1460,G_MATYR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1461,G_MINOROUS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1462,G_ORC_SKELETON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1463,G_ORC_ZOMBIE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1464,G_PASANA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1465,G_PETIT,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1466,G_PETIT_,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1467,G_RAYDRIC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1468,G_REQUIEM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1469,G_SKEL_WORKER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1470,G_ZEROM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1471,G_NINE_TAIL,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1472,G_BON_GUN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1473,G_ORC_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1474,G_MIMIC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1475,G_WRAITH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1476,G_ALARM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1477,G_ARCLOUSE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1478,G_RIDEWORD,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1479,G_SKEL_PRISONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1480,G_ZOMBIE_PRISONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1481,G_PUNK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1482,G_ZHERLTHSH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1483,G_RYBIO,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1484,G_PHENDARK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1485,G_MYSTELTAINN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1486,G_TIRFING,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1487,G_EXECUTIONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1488,G_ANOLIAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1489,G_STING,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1490,G_WANDER_MAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
-1491,G_DOKEBI,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+//knight quest mobs with poring stats
+1419,G_FARMILIAR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1420,G_ARCHER_SKELETON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1421,G_ISIS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1422,G_HUNTER_FLY,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1423,G_GHOUL,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1424,G_SIDE_WINDER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1425,G_OBEAUNE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1426,G_MARC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1427,G_NIGHTMARE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1428,G_POISON_SPORE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1429,G_ARGIOPE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1430,G_ARGOS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1431,G_BAPHOMET_,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1432,G_DESERT_WOLF,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1433,G_DEVIRUCHI,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1434,G_DRAINLIAR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1435,G_EVIL_DRUID,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1436,G_JAKK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1437,G_JOKER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1438,G_KHALITZBURG,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1439,G_HIGH_ORC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1440,G_STEM_WORM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1441,G_PENOMENA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1442,G_SASQUATCH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1443,G_CRUISER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1444,G_CHEPET,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1445,G_RAGGLER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1446,G_INJUSTICE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1447,G_GRYPHON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1448,G_DARK_FRAME,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1449,G_MUTANT_DRAGON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1450,G_WIND_GHOST,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1451,G_MERMAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1452,G_ORC_LADY,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1453,G_RAYDRIC_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1454,G_TRI_JOINT,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1455,G_KOBOLD_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1456,G_CHIMERA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1457,G_MANTIS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1458,G_MARDUK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1459,G_MARIONETTE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1460,G_MATYR,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1461,G_MINOROUS,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1462,G_ORC_SKELETON,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1463,G_ORC_ZOMBIE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1464,G_PASANA,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1465,G_PETIT,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1466,G_PETIT_,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1467,G_RAYDRIC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1468,G_REQUIEM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1469,G_SKEL_WORKER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1470,G_ZEROM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1471,G_NINE_TAIL,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1472,G_BON_GUN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1473,G_ORC_ARCHER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1474,G_MIMIC,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1475,G_WRAITH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1476,G_ALARM,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1477,G_ARCLOUSE,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1478,G_RIDEWORD,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1479,G_SKEL_PRISONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1480,G_ZOMBIE_PRISONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1481,G_PUNK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1482,G_ZHERLTHSH,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1483,G_RYBIO,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1484,G_PHENDARK,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1485,G_MYSTELTAINN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1486,G_TIRFING,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1487,G_EXECUTIONER,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1488,G_ANOLIAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1489,G_STING,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1490,G_WANDER_MAN,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
+1491,G_DOKEBI,Poring,1,50,0,2,1,1,7,10,0,5,1,1,1,0,6,30,10,12,1,3,21,3,400,1872,672,480,909,7000,1202,100,938,400,512,1000,713,1500,741,5,619,20,4001,20,0,0
diff --git a/db/mob_poring.txt b/db/mob_poring.txt
index f92a860ca..fcc1ee9c1 100644
--- a/db/mob_poring.txt
+++ b/db/mob_poring.txt
@@ -1,17 +1,17 @@
-// mob_branch.txt‚̃|ƒŠƒ“”Å
-// MobID, MobName(Dummy), Rate
-// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
-// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
-// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
-// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
-
-0,Poring,1002
-1002,Poring,700000
-1062,Santa Poring,200000
-1113,Drops,500000
-1031,Poporing,400000
-1242,Marin,300000
-1090,Mastering,100000
-1120,Ghostring,50000
-1096,Angeling,50000
-1388,Archangeling,10000
+// mob_branch.txt‚̃|ƒŠƒ“”Å
+// MobID, MobName(Dummy), Rate
+// ƒ‚ƒ“ƒXƒ^[IDAƒ‚ƒ“ƒXƒ^[‚Ì–¼‘O(ƒ_ƒ~[)AŠm—¦(*10000)‚ð‚µ‚½•¨‚Å‚·B500000‚È‚ç50%‚Å1000000‚È‚ç100%‚Å‚·B)
+// ƒ‚ƒ“ƒXƒ^[ID‚ª0‚Ìꇊm—¦‚ðƒ‚ƒ“ƒXƒ^[‚Ì‘I‘ð‚ÉŽ¸”s‚µ‚½Žž‚É¢ŠÒ‚³‚ê‚郂ƒ“ƒXƒ^[‚ÌID‚Æ‚µ‚Ä”FŽ¯‚µ‚Ü‚·B(•¡”‚Å‚ ‚éê‡ÅŒã‚Ì•¨‚¾‚¯—LŒø‚Å‚·B)
+// ƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å–¢ŽÀ‘•‚Ì‚à‚Ì‚ð‘‚­‚ƃNƒ‰ƒCƒAƒ“ƒg‚ªd—̓Gƒ‰[
+// ‚»‚µ‚Ä‚»‚Ì“G‚ªƒLƒƒƒ‰ƒNƒ^[‚Ì•t‹ß‚É‚¢‚éŠÔƒƒOƒCƒ“‚Å‚«‚È‚¢‚Ì‚Å’ˆÓB
+
+0,Poring,1002
+1002,Poring,700000
+1062,Santa Poring,200000
+1113,Drops,500000
+1031,Poporing,400000
+1242,Marin,300000
+1090,Mastering,100000
+1120,Ghostring,50000
+1096,Angeling,50000
+1388,Archangeling,10000
diff --git a/db/mob_skill_db.txt b/db/mob_skill_db.txt
index 64dbf298a..a3c12702d 100644
--- a/db/mob_skill_db.txt
+++ b/db/mob_skill_db.txt
@@ -1,2002 +1,2002 @@
-//mob_skill_db.txt@AthenaDB plan 2004/04/28 00:45:49 +0900/(JST)/
-//MOB_ID, a dummy character sequence, STATE, SKILL_ID, SKILL_LV, the rate of 10,000th of a minute, casttime, delay, the disturbance possibility of, a target, a condition type, a condition value, a value 1, a value 2, a value 3, a value 4, 5/of values, a dummy character sequence: Or that it is good to put in an intelligible
-//Example
-//1001,Gibberish,attack,52,3,100,1500,10000,no,target,always,0,,,,,
-//
-//STATE: any Even when /idle standby /walk movement /attack attack /// dead death /loot route /chase rush or pursuit. /counterattack (?)//// target: target PC / self himself under attack /friend friend /// One's circumference (it is circumference 81 mass =around4 now) /// One's circumference 9 mass One's circumference 25 mass /// One's circumference 49 mass [ around ] [ around1 ] [ /around2 ] [ around3 ] One's circumference 81 mass//a [ /around4 ]
-Only place specification skill is good for a round system. friend is good only on condition that a friend system. //
-
-//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 number of specification
-// attackpcge Attack PC becomes more than the number of specification.
-// slavelt when the number of slaves is lower than the original number of specification.
-// slavele when the all the slaves are dead.
-// 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
-// casttargeted when a target is in cast range.
-//
-// 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
-//
-
-//ID,ƒXƒLƒ‹—–¼‘O,ó‘Ô,ƒXƒLƒ‹,ƒŒƒxƒ‹,Šm—¦(–œ•ª—¦),‰r¥(ms),ƒfƒBƒŒƒC(ms),‰r¥–WŠQ,ƒ^[ƒQƒbƒg,ðŒƒ^ƒCƒv1,ðŒ’l1,,,,,,,,,Žg—pŽžƒGƒ‚[ƒVƒ‡ƒ“
-1001,ƒCƒ“ƒxƒiƒ€—ƒXƒR[ƒsƒIƒ“,attack,52,3,100,1500,10000,no,target,always,0,,,,,,
-1001,‰Î‘®«UŒ‚—ƒXƒR[ƒsƒIƒ“,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1002,’§”­—ƒ|ƒŠƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1002,…‘®«UŒ‚—ƒ|ƒŠƒ“,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1002,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1004,•—‘®«UŒ‚—ƒz[ƒlƒbƒg,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1004,–hŒä–³Ž‹UŒ‚—ƒz[ƒlƒbƒg,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1005,ˆÅ‘®«UŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
-1005,ˆÃˆÅUŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,177,3,100,0,10000,no,target,always,0,,,,,,
-1007,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒtƒ@ƒuƒ‹,idle,193,1,1,1000,0,yes,self,always,0,1008,,,,,
-1007,’n‘®«UŒ‚—ƒtƒ@ƒuƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1008,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒp,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1008,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒvƒp,idle,193,1,1,1000,0,yes,self,always,0,1018,,,,,
-1009,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ“ƒhƒ‹,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1009,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ“ƒhƒ‹,attack,111,1,50,1500,30000,yes,self,always,0,,,,,,
-1009,•—‘®«UŒ‚—ƒRƒ“ƒhƒ‹,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1009,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ“ƒhƒ‹,chase,111,1,50,1500,30000,yes,self,always,0,,,,,,
-1010,’n‘®«UŒ‚—ƒEƒBƒ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1010,ƒiƒp[ƒ€ƒr[ƒg—ƒEƒBƒ[,chase,11,10,1000,1000,10000,yes,target,casttargeted,,,,,,,
-1010,ƒiƒp[ƒ€ƒr[ƒg—ƒEƒBƒ[,chase,11,10,100,1000,10000,yes,target,always,0,,,,,,
-1011,’§”­—ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1011,•—‘®«UŒ‚—ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1012,…‘®«UŒ‚—ƒƒbƒ_ƒtƒƒbƒO,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1013,’n‘®«UŒ‚—ƒEƒ‹ƒt,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1014,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1014,…‘®«UŒ‚—ƒXƒ|ƒA,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1014,‡–°UŒ‚—ƒXƒ|ƒA,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1015,“ÅUŒ‚—ƒ]ƒ“ƒr,attack,176,1,100,1000,10000,no,target,always,0,,,,,,
-1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1018,ƒeƒŒƒ|[ƒg—ƒNƒŠ[ƒ~[,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
-1018,•—‘®«UŒ‚—ƒNƒŠ[ƒ~[,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1018,‡–°UŒ‚—ƒNƒŠ[ƒ~[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1019,’§”­—ƒyƒRƒyƒR,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1019,ƒGƒ‚[ƒVƒ‡ƒ“—ƒyƒRƒyƒR,idle,197,1,5,0,10000,yes,self,always,0,19,,,,,
-1019,ƒ\ƒjƒbƒNƒuƒ[—ƒyƒRƒyƒR,attack,136,1,10,1500,10000,no,target,always,0,,,,,,
-1019,‰Î‘®«UŒ‚—ƒyƒRƒyƒR,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1020,’n‘®«UŒ‚—ƒ}ƒ“ƒhƒ‰ƒSƒ‰,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
-1023,‹i‰Œ—ƒI[ƒNƒEƒHƒŠƒA[,idle,195,1,10,0,0,yes,self,always,0,,,,,,9
-1023,’n‘®«UŒ‚—ƒI[ƒNƒEƒHƒŠƒA[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1023,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒEƒHƒŠƒA[,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1024,’n‘®«UŒ‚—ƒ[ƒ€ƒe[ƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1025,’n‘®«UŒ‚—ƒXƒlƒCƒN,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1025,“ÅUŒ‚—ƒXƒlƒCƒN,attack,176,3,100,1000,10000,no,target,always,0,,,,,,
-1026,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ€ƒiƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1026,ƒXƒ^ƒ“UŒ‚—ƒ€ƒiƒbƒN,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1026,ƒXƒ^ƒ“UŒ‚—ƒ€ƒiƒbƒN,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1028,‘½’iUŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,171,1,100,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1028,‘½’iUŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1028,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1029,ˆÅ‘®«UŒ‚—ƒCƒVƒX,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1029,‘¬“x‘‰Á—ƒCƒVƒX,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
-1030,ƒCƒ“ƒxƒiƒ€—ƒAƒiƒRƒ“ƒ_ƒN,attack,52,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1030,ƒCƒ“ƒxƒiƒ€—ƒAƒiƒRƒ“ƒ_ƒN,attack,52,3,100,1500,10000,no,target,always,0,,,,,,
-1030,“Å‘®«UŒ‚—ƒAƒiƒRƒ“ƒ_ƒN,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1031,“Å‘®«UŒ‚—ƒ|ƒ|ƒŠƒ“,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1031,“ÅUŒ‚—ƒ|ƒ|ƒŠƒ“,attack,176,3,100,1000,10000,no,target,always,0,,,,,,
-1031,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒ|ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1032,‹zŒŒ—ƒxƒŠƒbƒg,attack,199,1,100,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1032,“ÅUŒ‚—ƒxƒŠƒbƒg,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1032,ƒGƒ‚[ƒVƒ‡ƒ“—ƒxƒŠƒbƒg,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1033,‰Î‘®«UŒ‚—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,186,1,200,0,7500,yes,target,always,0,,,,,,
-1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,19,1,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,19,1,100,2000,10000,yes,target,always,0,,,,,,
-1033,ƒiƒp[ƒ€ƒr[ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,11,10,1000,500,10000,yes,target,casttargeted,,,,,,,
-1033,ƒiƒp[ƒ€ƒr[ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,11,10,100,500,10000,yes,target,always,0,,,,,,
-1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,19,3,100,2000,10000,yes,target,longrangeattacked,,,,,,,
-1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,19,3,100,2000,10000,yes,target,always,0,,,,,,
-1034,…‘®«UŒ‚—ƒ^ƒ‰ƒtƒƒbƒO,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
-1035,’§”­—ƒnƒ“ƒ^[ƒtƒ‰ƒC,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1035,•—‘®«UŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
-1035,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1035,‘½’iUŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1035,‹zŒŒ—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1035,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
-1035,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1036,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1036,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1037,“Å‘®«UŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
-1037,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
-1037,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
-1037,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1037,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,50,1000,10000,no,target,always,0,,,,,,
-1038,ƒeƒŒƒ|[ƒg—ƒIƒVƒŠƒX,idle,26,1,1000,0,100000,yes,self,closedattacked,,,,,,,
-1038,ƒeƒŒƒ|[ƒg—ƒIƒVƒŠƒX,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1038,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒIƒVƒŠƒX,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1297,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,500,1500,2000,no,target,longrangeattacked,,,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,200,1500,2000,no,target,skillused,18,,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,500,1500,2000,no,target,always,0,,,,,,
-1038,ƒNƒ@ƒOƒ}ƒCƒA—ƒIƒVƒŠƒX,attack,92,5,400,0,0,yes,target,always,0,,,,,,
-1038,ƒXƒg[ƒ“ƒJ[ƒX—ƒIƒVƒŠƒX,attack,16,8,500,1500,3000,no,target,attackpcge,2,,,,,,
-1038,“Å‘®«UŒ‚—ƒIƒVƒŠƒX,attack,188,5,200,0,5000,yes,target,always,0,,,,,,
-1038,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒIƒVƒŠƒX,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
-1038,Žæ‚芪‚«¢Š«—ƒIƒVƒŠƒX,attack,196,5,1000,3000,3600000,no,self,slavele,2,1297,,,,,
-1038,ƒoƒbƒVƒ…—ƒIƒVƒŠƒX,attack,5,10,300,0,5000,yes,target,always,0,,,,,,
-1038,ƒxƒiƒ€ƒ_ƒXƒg—ƒIƒVƒŠƒX,attack,140,8,400,0,0,yes,target,always,0,,,,,,
-1038,–hŒä–³Ž‹UŒ‚—ƒIƒVƒŠƒX,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,300,1500,2000,no,target,longrangeattacked,,,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,200,1500,2000,no,target,skillused,18,,,,,,
-1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,300,1500,2000,no,target,always,0,,,,,,
-1038,ƒNƒ@ƒOƒ}ƒCƒA—ƒIƒVƒŠƒX,chase,92,5,200,0,0,yes,target,always,0,,,,,,
-1038,‘¬“x‘‰Á—ƒIƒVƒŠƒX,chase,29,1,500,3000,120000,yes,self,myhpltmaxrate,50,,,,,,
-1038,Žæ‚芪‚«¢Š«—ƒIƒVƒŠƒX,chase,196,5,10000,3000,3600000,no,self,slavele,2,1029,,,,,
-1038,•K’†UŒ‚—ƒIƒVƒŠƒX,chase,172,1,200,0,5000,yes,target,always,0,,,,,,
-1038,ƒxƒiƒ€ƒ_ƒXƒg—ƒIƒVƒŠƒX,chase,140,8,200,0,0,yes,target,always,0,,,,,,
-1038,Žô‚¢UŒ‚—ƒIƒVƒŠƒX,chase,181,1,100,0,10000,yes,target,always,0,,,,,,
-1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,1000,0,3600000,yes,self,closedattacked,,,,,,,
-1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,walk,26,1,1000,0,3600000,yes,self,closedattacked,,,,,,,
-1039,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒoƒtƒHƒƒbƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1101,,,,,
-1039,•—‘®«UŒ‚—ƒoƒtƒHƒƒbƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
-1039,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒoƒtƒHƒƒbƒg,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1039,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1101,,,,,
-1039,•K’†UŒ‚—ƒoƒtƒHƒƒbƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1039,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒoƒtƒHƒƒbƒg,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
-1039,–hŒä–³Ž‹UŒ‚—ƒoƒtƒHƒƒbƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1039,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒoƒtƒHƒƒbƒg,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,800,1500,4000,no,target,skillused,18,,,,,,
-1039,Žô‚¢UŒ‚—ƒoƒtƒHƒƒbƒg,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
-1039,‘¬“x‘‰Á—ƒoƒtƒHƒƒbƒg,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1039,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1101,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
-1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,800,1500,4000,no,target,skillused,18,,,,,,
-1040,ƒGƒ‚[ƒVƒ‡ƒ“—ƒS[ƒŒƒ€,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1040,ƒXƒ^ƒ“UŒ‚—ƒS[ƒŒƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1040,ƒXƒ^ƒ“UŒ‚—ƒS[ƒŒƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1041,‘½’iUŒ‚—ƒ}ƒ~[,attack,171,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1041,‘½’iUŒ‚—ƒ}ƒ~[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1042,’§”­—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1042,ƒq[ƒ‹—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
-1042,’¾–ÙUŒ‚—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,178,5,100,0,10000,no,target,always,0,,,,,,
-1042,•—‘®«UŒ‚—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1044,…‘®«UŒ‚—ƒIƒ{ƒ“ƒk,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1044,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒ{ƒ“ƒk,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1044,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒIƒ{ƒ“ƒk,chase,76,5,100,3500,10000,yes,target,always,0,,,,,,
-1045,…‘®«UŒ‚—ƒ}ƒ‹ƒN,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1046,ƒeƒŒƒ|[ƒg—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,idle,26,1,10,0,100000,yes,self,always,0,,,,,,
-1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1046,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1061,,,,,
-1046,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,61,5,200,0,0,yes,self,always,0,,,,,,
-1046,ˆÅ‘®«UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
-1046,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1046,Žæ‚芪‚«¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,196,5,1000,3000,3600000,no,self,slavele,0,1061,,,,,
-1046,ƒsƒA[ƒX—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,56,8,100,0,10000,yes,target,always,0,,,,,,
-1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
-1046,•K’†UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,15,10,500,1500,10000,no,target,always,0,,,,,,
-1046,–hŒä–³Ž‹UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1046,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1046,ˆÃˆÅUŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,177,1,100,0,10000,yes,target,always,0,,,,,,
-1046,ƒCƒ“ƒfƒ…ƒA—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,8,7,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1046,ƒCƒ“ƒfƒ…ƒA—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1046,‘¬“x‘‰Á—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1046,Žæ‚芪‚«¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1061,,,,,
-1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,15,10,1000,1500,10000,no,target,longrangeattacked,,,,,,,
-1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,15,10,500,1500,10000,no,target,always,0,,,,,,
-1047,ƒGƒ‚[ƒVƒ‡ƒ“—ƒyƒRƒyƒR‚Ì—‘,idle,197,1,500,0,10000,yes,self,always,0,19,,,,,
-1047,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒyƒRƒyƒR‚Ì—‘,idle,193,1,1,1000,0,yes,self,always,0,1049,1050,,,,
-1048,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—“峂̗‘,idle,193,1,1,1000,0,yes,self,always,0,1051,,,,,
-1049,ƒGƒ‚[ƒVƒ‡ƒ“—ƒsƒbƒL,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1049,‰Î‘®«UŒ‚—ƒsƒbƒL,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1050,ƒGƒ‚[ƒVƒ‡ƒ“—‚·‚²‚¢ƒsƒbƒL,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1050,‰Î‘®«UŒ‚—‚·‚²‚¢ƒsƒbƒL,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1052,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒbƒJ[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1052,’n‘®«UŒ‚—ƒƒbƒJ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1053,ˆÅ‘®«UŒ‚—Ž““å³,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
-1054,ˆÅ‘®«UŒ‚——Y“å³,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
-1055,”͈ÍUŒ‚—ƒ€ƒJ[,attack,174,1,1000,0,0,yes,target,attackpcge,2,,,,,,
-1055,’n‘®«UŒ‚—ƒ€ƒJ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1055,–hŒä–³Ž‹UŒ‚—ƒ€ƒJ[,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1055,…‘®«•Ï‰»—ƒ€ƒJ[,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1055,…‘®«•Ï‰»—ƒ€ƒJ[,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1056,’n‘®«UŒ‚—ƒXƒ‚[ƒL[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1056,ƒnƒCƒfƒBƒ“ƒO—ƒXƒ‚[ƒL[,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1056,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ‚[ƒL[,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
-1056,ƒnƒCƒfƒBƒ“ƒO—ƒXƒ‚[ƒL[,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1057,ƒq[ƒ‹—ƒˆ[ƒˆ[,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
-1057,’n‘®«UŒ‚—ƒˆ[ƒˆ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1057,ƒGƒ‚[ƒVƒ‡ƒ“—ƒˆ[ƒˆ[,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1057,ΓŠ‚°—ƒˆ[ƒˆ[,chase,152,1,300,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1057,ΓŠ‚°—ƒˆ[ƒˆ[,chase,152,1,100,1000,10000,yes,target,always,0,,,,,,
-1058,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒ^ƒ‹ƒ‰,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1058,‰Î‘®«UŒ‚—ƒƒ^ƒ‹ƒ‰,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1058,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒƒ^ƒ‹ƒ‰,attack,76,5,100,0,10000,yes,target,always,0,,,,,,
-1059,ƒeƒŒƒ|[ƒg—ƒ~ƒXƒgƒŒƒX,idle,26,1,10,0,100000,yes,self,closedattacked,,,,,,,
-1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,idle,28,10,1000,0,3000,yes,friend,friendhpltmaxrate,80,,,,,,
-1059,ƒeƒŒƒ|[ƒg—ƒ~ƒXƒgƒŒƒX,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1059,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ~ƒXƒgƒŒƒX,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1303,,,,,
-1059,•—‘®«UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
-1059,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ~ƒXƒgƒŒƒX,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1059,Žæ‚芪‚«¢Š«—ƒ~ƒXƒgƒŒƒX,attack,196,4,1000,3000,3600000,no,self,slavele,0,1303,,,,,
-1059,ƒjƒ…[ƒ}—ƒ~ƒXƒgƒŒƒX,attack,25,1,1000,0,5000,yes,self,longrangeattacked,,,,,,,
-1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,attack,28,10,1000,0,3000,yes,friend,friendhpltmaxrate,80,,,,,,
-1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
-1059,•K’†UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1059,–hŒä–³Ž‹UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,500,1500,3000,no,target,attackpcge,2,,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,800,1500,3000,no,target,skillused,18,,,,,,
-1059,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ~ƒXƒgƒŒƒX,attack,76,8,500,1500,5000,no,target,always,0,,,,,,
-1059,‘½’iUŒ‚—ƒ~ƒXƒgƒŒƒX,attack,171,3,100,0,10000,yes,target,always,0,,,,,,
-1059,‘¬“x‘‰Á—ƒ~ƒXƒgƒŒƒX,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1059,Žæ‚芪‚«¢Š«—ƒ~ƒXƒgƒŒƒX,chase,196,4,10000,3000,3600000,no,self,slavele,2,1156,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,300,1500,0,no,target,attackpcge,2,,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,300,1500,0,no,target,longrangeattacked,,,,,,,
-1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,800,1500,0,no,target,skillused,18,,,,,,
-1059,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ~ƒXƒgƒŒƒX,chase,76,8,300,1500,5000,no,target,always,0,,,,,,
-1060,ƒXƒ^ƒ“UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,179,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1060,ƒXƒ^ƒ“UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,179,4,100,1000,10000,no,target,always,0,,,,,,
-1060,’n‘®«UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1060,ƒCƒ“ƒfƒ…ƒA—ƒrƒbƒNƒtƒbƒg,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1060,ƒCƒ“ƒfƒ…ƒA—ƒrƒbƒNƒtƒbƒg,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1060,ƒGƒ‚[ƒVƒ‡ƒ“—ƒrƒbƒNƒtƒbƒg,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1061,¸_”j‰ó—ƒiƒCƒgƒƒA,attack,159,2,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1061,¸_”j‰ó—ƒiƒCƒgƒƒA,attack,159,2,50,0,10000,no,target,always,0,,,,,,
-1061,”O‘®«UŒ‚—ƒiƒCƒgƒƒA,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
-1061,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1061,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,50,0,10000,no,target,always,0,,,,,,
-1061,‘¬“x‘‰Á—ƒiƒCƒgƒƒA,chase,29,1,50,1000,120000,yes,self,always,0,,,,,,
-1062,¹‘®«UŒ‚—ƒTƒ“ƒ^ƒ|ƒŠƒ“,attack,189,1,100,0,15000,yes,target,always,0,,,,,,
-1063,’§”­—ƒ‹ƒiƒeƒBƒbƒN,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1063,ƒq[ƒ‹—ƒ‹ƒiƒeƒBƒbƒN,idle,28,1,10,2000,60000,yes,self,always,0,,,,,,
-1064,ˆÅ‘®«•Ï‰»—ƒƒKƒƒhƒ“,attack,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1064,ˆÅ‘®«•Ï‰»—ƒƒKƒƒhƒ“,chase,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1065,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒgƒ‰ƒEƒt,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,attack,86,3,50,5000,10000,yes,target,always,0,,,,,,
-1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,attack,92,2,50,0,10000,yes,target,always,0,,,,,,
-1065,…‘®«UŒ‚—ƒXƒgƒ‰ƒEƒt,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,attack,15,5,50,3000,5000,yes,target,always,0,,,,,,
-1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,attack,20,4,50,4000,10000,yes,target,always,0,,,,,,
-1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,chase,86,3,50,5000,10000,yes,target,longrangeattacked,,,,,,,
-1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,chase,86,3,50,5000,10000,yes,target,always,0,,,,,,
-1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,chase,92,5,50,0,10000,yes,target,longrangeattacked,,,,,,,
-1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
-1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,chase,15,5,50,3000,5000,yes,target,longrangeattacked,,,,,,,
-1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,chase,15,5,50,3000,5000,yes,target,always,0,,,,,,
-1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,chase,20,4,50,4000,10000,yes,target,longrangeattacked,,,,,,,
-1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,chase,20,4,50,4000,10000,yes,target,always,0,,,,,,
-1066,…‘®«UŒ‚—ƒoƒhƒ“,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1067,ƒL[ƒsƒ“ƒO—ƒJƒiƒgƒEƒX,attack,201,1,200,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1067,…‘®«UŒ‚—ƒJƒiƒgƒEƒX,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,86,1,200,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,86,2,100,2000,10000,yes,target,always,0,,,,,,
-1069,…‘®«UŒ‚—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,chase,86,1,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,chase,86,1,100,2000,10000,yes,target,always,0,,,,,,
-1070,…‘®«UŒ‚—ƒNƒNƒŒ,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1070,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒNƒŒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
-1071,ƒoƒbƒVƒ…—ƒpƒCƒŒ[ƒcƒXƒPƒ‹,attack,5,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1071,ƒoƒbƒVƒ…—ƒpƒCƒŒ[ƒcƒXƒPƒ‹,attack,5,3,100,1500,10000,no,target,always,0,,,,,,
-1072,‰Î‘®«UŒ‚—ƒJƒz,attack,186,1,200,0,7500,yes,target,always,0,,,,,,
-1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,attack,19,1,500,1000,0,yes,target,always,0,,,,,,
-1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,chase,19,1,300,1000,0,yes,target,longrangeattacked,,,,,,,
-1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,chase,19,1,300,1000,0,yes,target,always,0,,,,,,
-1074,…‘®«UŒ‚—‚¨‰»‚¯ŠL,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1076,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒgƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1077,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1077,“Å‘®«UŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1077,“ÅUŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1086,ƒeƒŒƒ|[ƒg—‰©‹àå³,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1086,ƒ‚ƒ“ƒXƒ^[¢Š«—‰©‹àå³,attack,209,8,1000,3000,3600000,no,self,myhpltmaxrate,5,1054,,,,,
-1086,‰Î‘®«UŒ‚—‰©‹àå³,attack,186,5,200,0,5000,yes,target,always,0,,,,,,
-1086,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—‰©‹àå³,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1086,Žæ‚芪‚«¢Š«—‰©‹àå³,attack,196,8,1000,3000,10000,no,self,slavele,0,1054,,,,,
-1086,ƒnƒCƒfƒBƒ“ƒO—‰©‹àå³,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
-1086,ƒnƒCƒfƒBƒ“ƒO—‰©‹àå³,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
-1086,•K’†UŒ‚—‰©‹àå³,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1086,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—‰©‹àå³,attack,18,7,500,0,2000,yes,target,always,0,,,,,,
-1086,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—‰©‹àå³,attack,19,10,100,0,5000,no,target,longrangeattacked,,,,,,,
-1086,–hŒä–³Ž‹UŒ‚—‰©‹àå³,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1086,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—‰©‹àå³,attack,7,7,500,0,3000,yes,target,attackpcge,2,,,,,,
-1086,ƒƒ}[ƒiƒCƒg—‰©‹àå³,attack,42,10,100,1500,10000,no,target,attackpcge,2,,,,,,
-1086,‘¬“x‘‰Á—‰©‹àå³,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1086,Žæ‚芪‚«¢Š«—‰©‹àå³,chase,196,8,10000,3000,3600000,no,self,slavele,2,1054,,,,,
-1086,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—‰©‹àå³,chase,18,7,500,0,0,yes,target,always,0,,,,,,
-1086,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—‰©‹àå³,chase,19,10,100,0,5000,no,target,longrangeattacked,,,,,,,
-1086,ƒq[ƒ‹—‰©‹àå³,attack,28,10,700,0,0,yes,self,myhpltmaxrate,30,,,,,,
-1086,ƒq[ƒ‹—‰©‹àå³,attack,28,10,700,0,0,yes,friend,friendhpltmaxrate,80,,,,,,
-1087,ƒeƒŒƒ|[ƒg—ƒI[ƒNƒq[ƒ[,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1087,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒI[ƒNƒq[ƒ[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1213,,,,,
-1087,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒI[ƒNƒq[ƒ[,attack,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,800,1500,3000,no,target,skillused,18,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,500,1500,3000,no,target,always,0,,,,,,
-1087,’n‘®«UŒ‚—ƒI[ƒNƒq[ƒ[,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
-1087,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒI[ƒNƒq[ƒ[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1087,Žæ‚芪‚«¢Š«—ƒI[ƒNƒq[ƒ[,attack,196,5,1000,3000,3600000,no,self,slavele,0,1213,,,,,
-1087,•K’†UŒ‚—ƒI[ƒNƒq[ƒ[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1087,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒq[ƒ[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1087,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒNƒq[ƒ[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1087,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒI[ƒNƒq[ƒ[,chase,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
-1087,ƒCƒ“ƒfƒ…ƒA—ƒI[ƒNƒq[ƒ[,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,500,1500,0,no,target,longrangeattacked,,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,800,1500,3000,no,target,skillused,18,,,,,,
-1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,500,1500,0,no,target,always,0,,,,,,
-1087,‘¬“x‘‰Á—ƒI[ƒNƒq[ƒ[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1087,Žæ‚芪‚«¢Š«—ƒI[ƒNƒq[ƒ[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1213,,,,,
-1088,’n‘®«UŒ‚—ƒ{[ƒJƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1088,Žæ‚芪‚«¢Š«—ƒ{[ƒJƒ‹,attack,196,10,1000,3000,10000,no,self,slavele,2,1052,,,,,
-1088,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ{[ƒJƒ‹,attack,76,5,100,0,10000,yes,target,always,0,,,,,,
-1088,‘½’iUŒ‚—ƒ{[ƒJƒ‹,attack,171,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1088,‘½’iUŒ‚—ƒ{[ƒJƒ‹,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1089,…‘®«UŒ‚—ƒg[ƒh,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1089,Žæ‚芪‚«¢Š«—ƒg[ƒh,attack,196,6,1000,3000,10000,no,self,slavele,2,1012,,,,,
-1090,…‘®«UŒ‚—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1090,Žæ‚芪‚«¢Š«—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,196,5,1000,3000,300000,no,self,slavele,2,1002,,,,,
-1090,Žæ‚芪‚«¢Š«—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,196,5,600,0,300000,no,self,slavele,2,1113,,,,,
-1091,•—‘®«UŒ‚—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1091,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,196,5,1000,3000,10000,no,self,slavele,2,1011,,,,,
-1091,’¾–ÙUŒ‚—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,178,5,100,0,10000,no,target,always,0,,,,,,
-1092,’n‘®«UŒ‚—‚³‚·‚ç‚¢˜T,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1092,Žæ‚芪‚«¢Š«—‚³‚·‚ç‚¢˜T,attack,196,4,1000,3000,10000,no,self,slavele,2,1013,,,,,
-1092,‘½’iUŒ‚—‚³‚·‚ç‚¢˜T,attack,171,1,500,0,0,no,target,always,0,,,,,,
-1092,ƒGƒ‚[ƒVƒ‡ƒ“—‚³‚·‚ç‚¢˜T,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
-1093,Žæ‚芪‚«¢Š«—ƒGƒNƒŠƒvƒX,attack,196,5,1000,3000,10000,no,self,slavele,2,1063,,,,,
-1094,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ“ƒo[ƒiƒCƒg,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
-1094,…‘®«UŒ‚—ƒAƒ“ƒo[ƒiƒCƒg,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1094,’n‘®«•Ï‰»—ƒAƒ“ƒo[ƒiƒCƒg,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1094,’n‘®«•Ï‰»—ƒAƒ“ƒo[ƒiƒCƒg,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1095,’n‘®«UŒ‚—ƒAƒ“ƒhƒŒ,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1095,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ“ƒhƒŒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
-1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,idle,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
-1096,ƒGƒ‚[ƒVƒ‡ƒ“—ƒGƒ“ƒWƒFƒŠƒ“ƒO,walk,197,1,100,0,10000,yes,self,always,0,22,,,,,
-1096,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,1000,3000,5000,no,self,myhpltmaxrate,30,,,,,,
-1096,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,120,3000,5000,no,self,always,0,,,,,,
-1096,¹‘®«UŒ‚—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
-1096,Žæ‚芪‚«¢Š«—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,4,1000,3000,3600000,no,self,slavele,2,1031,,,,,
-1096,Žæ‚芪‚«¢Š«—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,3,300,3000,10000,no,self,slavele,0,1062,,,,,
-1096,ƒoƒbƒVƒ…—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,5,10,250,1100,10000,no,target,always,0,,,,,,
-1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
-1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,0,3000,yes,self,friendstatusoff,30,,,,,,
-1096,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,156,1,200,0,5000,yes,target,always,0,,,,,,
-1096,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,156,1,200,0,5000,yes,target,always,0,,,,,,
-1097,ƒGƒ‚[ƒVƒ‡ƒ“—‹a‚Ì—‘,idle,197,1,500,0,10000,yes,self,always,0,19,,,,,
-1097,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—‹a‚Ì—‘,idle,193,1,1,2000,0,yes,self,always,0,1095,1105,,,,
-1099,ƒCƒ“ƒxƒiƒ€—ƒAƒ‹ƒMƒIƒy,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
-1099,“Å‘®«UŒ‚—ƒAƒ‹ƒMƒIƒy,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
-1099,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,attack,140,5,100,2000,20000,no,target,always,0,,,,,,
-1099,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,chase,140,5,100,2000,20000,no,target,always,0,,,,,,
-1100,“Å‘®«UŒ‚—ƒAƒ‹ƒSƒX,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1100,“ÅUŒ‚—ƒAƒ‹ƒSƒX,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1101,öŠo—ƒoƒtƒHƒƒbƒgJr.,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
-1101,ˆÅ‘®«UŒ‚—ƒoƒtƒHƒƒbƒgJr.,attack,190,3,100,0,15000,yes,target,always,0,,,,,,
-1101,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒoƒtƒHƒƒbƒgJr.,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
-1101,öŠo—ƒoƒtƒHƒƒbƒgJr.,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
-1102,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒo[ƒXƒŠ[,attack,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1102,’¾–ÙUŒ‚—ƒo[ƒXƒŠ[,attack,178,5,200,0,10000,no,target,always,0,,,,,,
-1102,ˆÅ‘®«UŒ‚—ƒo[ƒXƒŠ[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1102,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒo[ƒXƒŠ[,chase,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1102,ƒGƒ‚[ƒVƒ‡ƒ“—ƒo[ƒXƒŠ[,chase,197,1,15,0,10000,yes,self,always,0,30,,,,,
-1103,ƒGƒ‚[ƒVƒ‡ƒ“—ƒLƒƒƒ‰ƒƒ‹,attack,197,1,15,0,10000,yes,self,always,0,16,,,,,
-1103,’n‘®«UŒ‚—ƒLƒƒƒ‰ƒƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1103,–hŒä–³Ž‹UŒ‚—ƒLƒƒƒ‰ƒƒ‹,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1104,’n‘®«UŒ‚—ƒR[ƒR[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1104,ΓŠ‚°—ƒR[ƒR[,chase,152,1,300,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1104,ΓŠ‚°—ƒR[ƒR[,chase,152,1,100,1000,10000,yes,target,always,0,,,,,,
-1105,’n‘®«UŒ‚—ƒfƒj[ƒ,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1105,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒj[ƒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
-1106,»‚Ü‚«—ƒfƒU[ƒgƒEƒ‹ƒt,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1106,‰Î‘®«UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1106,–hŒä–³Ž‹UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1106,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒU[ƒgƒEƒ‹ƒt,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1107,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ŽqƒfƒU[ƒgƒEƒ‹ƒt,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1107,‰Î‘®«UŒ‚—ŽqƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1107,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ŽqƒfƒU[ƒgƒEƒ‹ƒt,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,attack,86,4,300,5000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,attack,86,4,100,5000,10000,yes,target,always,0,,,,,,
-1108,…‘®«UŒ‚—ƒfƒrƒAƒX,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,chase,86,4,300,5000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,chase,86,4,100,5000,10000,yes,target,always,0,,,,,,
-1109,’§”­—ƒfƒrƒ‹ƒ`,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1109,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,attack,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1109,ˆÅ‘®«UŒ‚—ƒfƒrƒ‹ƒ`,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,50,4000,10000,yes,target,always,0,,,,,,
-1109,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,chase,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1109,‰“‹——£UŒ‚—ƒfƒrƒ‹ƒ`,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
-1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,longrangeattacked,,,,,,,
-1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,always,0,,,,,,
-1110,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒPƒr,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1110,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1110,ˆÅ‘®«UŒ‚—ƒhƒPƒr,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1110,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1110,ƒƒ}[ƒiƒCƒg—ƒhƒPƒr,attack,42,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
-1110,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1110,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1111,‹zŒŒ—ƒhƒŒƒCƒ“ƒŠƒA[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1111,ˆÅ‘®«UŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,190,1,200,0,7500,yes,target,always,0,,,,,,
-1111,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1111,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1112,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒŒƒCƒN,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1291,,,,,
-1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,attack,86,10,300,1500,3000,no,target,attackpcge,2,,,,,,
-1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,attack,86,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1112,…‘®«UŒ‚—ƒhƒŒƒCƒN,attack,184,5,200,0,5000,yes,target,always,0,,,,,,
-1112,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒŒƒCƒN,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1112,Žæ‚芪‚«¢Š«—ƒhƒŒƒCƒN,attack,196,5,1000,3000,3600000,no,self,slavele,0,1291,,,,,
-1112,•K’†UŒ‚—ƒhƒŒƒCƒN,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1112,–hŒä–³Ž‹UŒ‚—ƒhƒŒƒCƒN,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1112,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒhƒŒƒCƒN,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1112,…‘®«•Ï‰»—ƒhƒŒƒCƒN,attack,162,1,1000,0,300000,yes,self,myhpltmaxrate,50,,,,,,
-1112,ƒCƒ“ƒfƒ…ƒA—ƒhƒŒƒCƒN,chase,8,8,1000,0,20000,yes,self,longrangeattacked,,,,,,,
-1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,chase,86,10,300,1500,0,no,target,attackpcge,2,,,,,,
-1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,chase,86,10,500,1500,0,no,target,longrangeattacked,,,,,,,
-1112,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒhƒŒƒCƒN,chase,59,4,100,0,10000,yes,target,always,0,,,,,,
-1112,‘¬“xŒ¸­—ƒhƒŒƒCƒN,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
-1112,Žæ‚芪‚«¢Š«—ƒhƒŒƒCƒN,chase,196,5,10000,3000,3600000,no,self,slavele,2,1192,,,,,
-1112,…‘®«•Ï‰»—ƒhƒŒƒCƒN,chase,162,1,1000,0,300000,yes,self,myhpltmaxrate,50,,,,,,
-1113,’§”­—ƒhƒƒbƒvƒX,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1113,‰Î‘®«UŒ‚—ƒhƒƒbƒvƒX,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1113,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒƒbƒvƒX,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1114,•—‘®«UŒ‚—ƒ_ƒXƒeƒBƒlƒX,attack,187,1,200,0,7500,yes,target,always,0,,,,,,
-1114,‡–°UŒ‚—ƒ_ƒXƒeƒBƒlƒX,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1115,ƒeƒŒƒ|[ƒg—ƒGƒhƒK,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1115,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒGƒhƒK,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1306,,,,,
-1115,ƒXƒsƒAƒXƒ^ƒu—ƒGƒhƒK,attack,58,7,100,0,10000,yes,target,always,0,,,,,,
-1115,‰Î‘®«UŒ‚—ƒGƒhƒK,attack,186,5,200,0,5000,yes,target,always,0,,,,,,
-1115,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒGƒhƒK,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1115,Žæ‚芪‚«¢Š«—ƒGƒhƒK,attack,196,5,1000,3000,3600000,no,self,slavele,0,1306,,,,,
-1115,•K’†UŒ‚—ƒGƒhƒK,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,attack,17,10,700,0,0,no,target,attackpcge,2,,,,,,
-1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,attack,17,10,900,0,2000,no,target,longrangeattacked,,,,,,,
-1115,–hŒä–³Ž‹UŒ‚—ƒGƒhƒK,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1115,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒGƒhƒK,attack,7,7,500,0,3000,yes,target,attackpcge,2,,,,,,
-1115,ƒCƒ“ƒfƒ…ƒA—ƒGƒhƒK,chase,8,7,100,0,30000,yes,self,longrangeattacked,,,,,,,
-1115,ƒCƒ“ƒfƒ…ƒA—ƒGƒhƒK,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1115,‘¬“x‘‰Á—ƒGƒhƒK,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1115,Žæ‚芪‚«¢Š«—ƒGƒhƒK,chase,196,5,10000,3000,3600000,no,self,slavele,2,1060,,,,,
-1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,chase,17,10,500,0,0,no,target,attackpcge,2,,,,,,
-1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,chase,17,10,900,0,2000,no,target,longrangeattacked,,,,,,,
-1116,”O‘®«UŒ‚—ƒGƒMƒ‰,attack,191,5,100,0,15000,yes,target,always,0,,,,,,
-1117,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1117,ˆÃˆÅUŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,177,5,500,0,10000,no,target,always,0,,,,,,
-1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,91,4,100,4000,10000,no,target,always,0,,,,,,
-1117,Ή»UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,180,5,50,0,10000,no,target,always,0,,,,,,
-1117,Žô‚¢UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,181,5,50,0,10000,no,target,always,0,,,,,,
-1117,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,300,4000,10000,no,target,longrangeattacked,,,,,,,
-1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,100,4000,10000,no,target,always,0,,,,,,
-1118,‹zŒŒ—ƒtƒ[ƒ‰,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1118,’n‘®«UŒ‚—ƒtƒ[ƒ‰,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1119,ƒGƒ‚[ƒVƒ‡ƒ“—ƒtƒŠƒ‹ƒhƒ‰,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1119,ƒNƒ[ƒLƒ“ƒO—ƒtƒŠƒ‹ƒhƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1119,‰Î‘®«UŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1119,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒtƒŠƒ‹ƒhƒ‰,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1119,‘½’iUŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,171,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1119,‘½’iUŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,171,2,100,0,10000,no,target,always,0,,,,,,
-1119,ƒNƒ[ƒLƒ“ƒO—ƒtƒŠƒ‹ƒhƒ‰,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1119,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒtƒŠƒ‹ƒhƒ‰,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1120,ƒeƒŒƒ|[ƒg—ƒS[ƒXƒgƒŠƒ“ƒO,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
-1120,ƒGƒ‚[ƒVƒ‡ƒ“—ƒS[ƒXƒgƒŠƒ“ƒO,walk,197,1,100,0,10000,yes,self,always,0,28,,,,,
-1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,attack,135,1,500,1500,5000,no,self,casttargeted,,,,,,,
-1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,attack,135,1,120,1500,5000,no,self,always,0,,,,,,
-1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,attack,13,10,1000,1000,5000,no,target,always,0,,,,,,
-1120,”O‘®«UŒ‚—ƒS[ƒXƒgƒŠƒ“ƒO,attack,191,5,100,0,15000,yes,target,always,0,,,,,,
-1120,Žæ‚芪‚«¢Š«—ƒS[ƒXƒgƒŠƒ“ƒO,attack,196,5,1000,3000,300000,no,self,slavele,0,1186,,,,,
-1120,ƒeƒŒƒ|[ƒg—ƒS[ƒXƒgƒŠƒ“ƒO,attack,26,1,200,1000,100000,yes,self,myhpltmaxrate,30,,,,,,
-1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,chase,135,1,500,1500,5000,no,self,casttargeted,,,,,,,
-1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,chase,135,1,120,1500,5000,no,self,always,0,,,,,,
-1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,chase,13,10,1000,1000,5000,no,target,longrangeattacked,,,,,,,
-1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,chase,13,10,1000,1000,5000,no,target,always,0,,,,,,
-1120,‘¬“xŒ¸­—ƒS[ƒXƒgƒŠƒ“ƒO,chase,30,1,50,3000,120000,yes,target,always,0,,,,,,
-1121,ƒTƒ“ƒhƒ}ƒ“—ƒKƒCƒAƒX,idle,119,5,50,1500,30000,yes,self,always,0,,,,,,
-1121,ƒGƒ‚[ƒVƒ‡ƒ“—ƒKƒCƒAƒX,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1121,»‚Ü‚«—ƒKƒCƒAƒX,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1121,»‚Ü‚«—ƒKƒCƒAƒX,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1121,’n‘®«UŒ‚—ƒKƒCƒAƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1122,•—‘®«UŒ‚—ƒSƒuƒŠƒ“’·’j,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1122,‘½’iUŒ‚—ƒSƒuƒŠƒ“’·’j,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1122,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“’·’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1123,‰Î‘®«UŒ‚—ƒSƒuƒŠƒ“ŽŸ’j,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1123,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŽŸ’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1124,“Å‘®«UŒ‚—ƒSƒuƒŠƒ“ŽO’j,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1124,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŽO’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1125,’n‘®«UŒ‚—ƒSƒuƒŠƒ“Žl’j,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1125,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“Žl’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1126,…‘®«UŒ‚—ƒSƒuƒŠƒ“ŒÜ’j,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1126,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŒÜ’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1127,’n‘®«UŒ‚—ƒz[ƒh,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
-1127,ƒnƒCƒfƒBƒ“ƒO—ƒz[ƒh,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1127,ƒnƒCƒfƒBƒ“ƒO—ƒz[ƒh,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1128,’n‘®«UŒ‚—ƒzƒ‹ƒ“,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1128,–hŒä–³Ž‹UŒ‚—ƒzƒ‹ƒ“,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1129,ƒTƒCƒg—ƒzƒƒ“,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1129,öŠo—ƒzƒƒ“,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
-1129,ƒTƒCƒg—ƒzƒƒ“,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1129,‰Î‘®«UŒ‚—ƒzƒƒ“,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
-1129,‘½’iUŒ‚—ƒzƒƒ“,attack,171,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1129,‘½’iUŒ‚—ƒzƒƒ“,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
-1129,öŠo—ƒzƒƒ“,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
-1129,ƒTƒCƒg—ƒzƒƒ“,chase,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1129,ƒTƒCƒg—ƒzƒƒ“,chase,10,1,100,0,20000,yes,self,always,0,,,,,,
-1130,‰Î‘®«UŒ‚—ƒWƒƒƒbƒN,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
-1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,100,4000,10000,yes,target,always,0,,,,,,
-1130,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1130,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒƒƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,chase,19,4,100,4000,10000,yes,target,always,0,,,,,,
-1130,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1131,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1131,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,attack,92,5,50,0,10000,yes,target,always,0,,,,,,
-1131,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,attack,13,10,50,1000,5000,yes,target,always,0,,,,,,
-1131,•—‘®«UŒ‚—ƒWƒ‡[ƒJ[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1131,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,attack,161,1,1000,1000,30000,no,self,always,0,,,,,,
-1131,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,attack,17,7,50,4000,10000,yes,target,always,0,,,,,,
-1131,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,attack,15,6,50,4000,10000,yes,target,always,0,,,,,,
-1131,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,attack,91,4,50,4000,10000,no,target,always,0,,,,,,
-1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,attack,84,5,50,4000,10000,yes,target,always,0,,,,,,
-1131,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1131,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
-1131,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,chase,13,10,50,1000,5000,yes,target,always,0,,,,,,
-1131,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,chase,161,1,1000,1000,30000,no,self,always,0,,,,,,
-1131,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,chase,17,7,50,4000,10000,yes,target,always,0,,,,,,
-1131,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,chase,15,6,50,4000,10000,yes,target,always,0,,,,,,
-1131,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,chase,91,4,50,2500,10000,no,target,always,0,,,,,,
-1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,longrangeattacked,,,,,,,
-1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,always,0,,,,,,
-1132,”͈ÍUŒ‚—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1132,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1132,ƒOƒŠƒ€ƒgƒD[ƒX—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,137,5,300,0,0,no,target,always,0,,,,,,
-1132,‘¬“xŒ¸­—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,30,1,50,3000,120000,yes,target,always,0,,,,,,
-1132,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1133,•—‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
-1134,“Å‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,188,2,200,0,7500,yes,target,always,0,,,,,,
-1135,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
-1138,ƒtƒ‰ƒbƒVƒƒ[—”’˜@‹Ê,idle,120,5,50,1500,30000,yes,self,always,0,,,,,,
-1138,ƒGƒ‚[ƒVƒ‡ƒ“—”’˜@‹Ê,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1138,…‘®«UŒ‚—”’˜@‹Ê,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1139,’n‘®«UŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1139,‘½’iUŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1140,‰Î‘®«UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,attack,18,3,700,1000,10000,yes,target,always,0,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,attack,19,3,500,2000,10000,yes,target,always,0,,,,,,
-1140,–‚–@‘ÅŒ‚UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,chase,18,3,100,1000,10000,yes,target,always,0,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
-1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,100,2000,10000,yes,target,always,0,,,,,,
-1141,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒi,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1141,–hŒä–³Ž‹UŒ‚—ƒ}ƒŠƒi,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1141,–hŒä–³Ž‹UŒ‚—ƒ}ƒŠƒi,attack,170,3,100,0,10000,no,target,always,0,,,,,,
-1141,…‘®«UŒ‚—ƒ}ƒŠƒi,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
-1142,Ž©”š—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,173,1,160,0,0,no,self,myhpltmaxrate,90,,,,,,
-1142,Ž©”š—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,173,1,1000,0,0,no,self,skillused,173,,,,,,
-1142,…‘®«UŒ‚—ƒ}ƒŠƒ“ƒXƒtƒBƒA,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1142,Ž©”š2—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,331,1,0,0,0,no,self,always,,,,,,,
-1143,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒIƒlƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1143,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv—ƒ}ƒŠƒIƒlƒbƒg,idle,121,5,50,1500,30000,yes,self,always,0,,,,,,
-1143,”O‘®«UŒ‚—ƒ}ƒŠƒIƒlƒbƒg,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
-1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,100,3000,10000,yes,target,always,0,,,,,,
-1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,100,3000,10000,yes,target,always,0,,,,,,
-1144,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒ‹ƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1144,…‘®«UŒ‚—ƒ}ƒ‹ƒX,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1145,»‚Ü‚«—ƒ}[ƒeƒBƒ“,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1145,»‚Ü‚«—ƒ}[ƒeƒBƒ“,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1145,’n‘®«UŒ‚—ƒ}[ƒeƒBƒ“,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
-1145,ƒnƒCƒfƒBƒ“ƒO—ƒ}[ƒeƒBƒ“,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1145,ƒnƒCƒfƒBƒ“ƒO—ƒ}[ƒeƒBƒ“,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1146,ˆÅ‘®«UŒ‚—ƒ}[ƒ^[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1146,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1146,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1146,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
-1146,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1147,ƒq[ƒ‹—ƒ}ƒ„[,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1147,ƒeƒŒƒ|[ƒg—ƒ}ƒ„[,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1147,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ}ƒ„[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1194,,,,,
-1147,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒ}ƒ„[,attack,12,10,1000,0,5000,yes,self,myhpltmaxrate,30,,,,,,
-1147,’n‘®«UŒ‚—ƒ}ƒ„[,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
-1147,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ}ƒ„[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1147,Žæ‚芪‚«¢Š«—ƒ}ƒ„[,attack,196,5,1000,3000,10000,no,self,slavele,0,1194,,,,,
-1147,ƒsƒA[ƒX—ƒ}ƒ„[,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
-1147,ƒq[ƒ‹—ƒ}ƒ„[,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1147,ƒq[ƒ‹—ƒ}ƒ„[,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
-1147,•K’†UŒ‚—ƒ}ƒ„[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1147,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ}ƒ„[,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,500,1000,3000,no,target,attackpcge,2,,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,500,1000,3000,no,target,longrangeattacked,,,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,800,1500,3000,no,target,skillused,18,,,,,,
-1147,–hŒä–³Ž‹UŒ‚—ƒ}ƒ„[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1147,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ}ƒ„[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1147,‘¬“x‘‰Á—ƒ}ƒ„[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1147,Žæ‚芪‚«¢Š«—ƒ}ƒ„[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1194,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,300,1000,0,no,target,attackpcge,2,,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,300,1000,0,no,target,longrangeattacked,,,,,,,
-1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,800,1500,3000,no,target,skillused,18,,,,,,
-1148,Ή»UŒ‚—ƒƒfƒ…[ƒT,attack,180,5,50,0,10000,no,target,always,0,,,,,,
-1149,’§”­—ƒ~ƒmƒ^ƒEƒƒX,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1149,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒmƒ^ƒEƒƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1149,‰Î‘®«UŒ‚—ƒ~ƒmƒ^ƒEƒƒX,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1149,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—ƒ~ƒmƒ^ƒEƒƒX,attack,110,3,250,3000,10000,no,target,always,0,,,,,,
-1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,attack,91,3,100,2000,10000,yes,target,always,0,,,,,,
-1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,chase,91,3,300,4000,10000,no,target,longrangeattacked,,,,,,,
-1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,chase,91,3,100,4000,10000,no,target,always,0,,,,,,
-1150,ƒq[ƒ‹—ŒŽ–é‰Ô,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1150,ƒeƒŒƒ|[ƒg—ŒŽ–é‰Ô,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1150,ƒ‚ƒ“ƒXƒ^[¢Š«—ŒŽ–é‰Ô,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1180,,,,,
-1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,attack,90,5,250,800,3000,no,target,longrangeattacked,,,,,,,
-1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,attack,90,5,250,800,3000,no,target,always,0,,,,,,
-1150,ƒNƒ[ƒLƒ“ƒO—ŒŽ–é‰Ô,attack,135,1,150,0,10000,no,self,slavele,0,,,,,,
-1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,14,5,250,800,3000,no,target,longrangeattacked,,,,,,,
-1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,14,5,250,800,3000,no,target,always,0,,,,,,
-1150,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ŒŽ–é‰Ô,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1150,Žæ‚芪‚«¢Š«—ŒŽ–é‰Ô,attack,196,5,1000,3000,3600000,no,self,slavele,0,1180,,,,,
-1150,ƒq[ƒ‹—ŒŽ–é‰Ô,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
-1150,ƒq[ƒ‹—ŒŽ–é‰Ô,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
-1150,•K’†UŒ‚—ŒŽ–é‰Ô,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,19,5,250,800,3000,no,target,longrangeattacked,,,,,,,
-1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,19,5,250,800,3000,no,target,always,0,,,,,,
-1150,–hŒä–³Ž‹UŒ‚—ŒŽ–é‰Ô,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1150,ƒƒ}[ƒiƒCƒg—ŒŽ–é‰Ô,attack,42,7,100,0,10000,yes,target,attackpcge,2,,,,,,
-1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,20,5,250,800,3000,no,target,longrangeattacked,,,,,,,
-1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,20,5,250,800,3000,no,target,always,0,,,,,,
-1150,ƒ‰ƒ“ƒ_ƒ€UŒ‚—ŒŽ–é‰Ô,attack,183,5,200,0,5000,yes,target,always,0,,,,,,
-1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,chase,90,5,200,800,0,no,target,longrangeattacked,,,,,,,
-1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,chase,90,5,200,800,0,no,target,always,0,,,,,,
-1150,ƒCƒ“ƒfƒ…ƒA—ŒŽ–é‰Ô,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,14,5,200,800,0,no,target,longrangeattacked,,,,,,,
-1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,14,5,200,800,0,no,target,always,0,,,,,,
-1150,‘¬“x‘‰Á—ŒŽ–é‰Ô,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1150,Žæ‚芪‚«¢Š«—ŒŽ–é‰Ô,chase,196,5,10000,3000,3600000,no,self,slavele,2,1180,,,,,
-1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,19,5,200,800,0,no,target,longrangeattacked,,,,,,,
-1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,19,5,200,800,0,no,target,always,0,,,,,,
-1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,20,5,200,800,0,no,target,longrangeattacked,,,,,,,
-1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,20,5,200,800,0,no,target,always,0,,,,,,
-1151,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1151,‹zŒŒ—ƒ~ƒXƒg,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1151,ƒCƒ“ƒxƒiƒ€—ƒ~ƒXƒg,attack,52,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1151,ƒCƒ“ƒxƒiƒ€—ƒ~ƒXƒg,attack,52,4,100,1500,10000,no,target,always,0,,,,,,
-1151,¸_”j‰ó—ƒ~ƒXƒg,attack,159,2,100,0,10000,no,target,always,0,,,,,,
-1151,“Å‘®«UŒ‚—ƒ~ƒXƒg,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
-1151,ˆÅ‘®«•Ï‰»—ƒ~ƒXƒg,attack,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1151,ˆÅ‘®«•Ï‰»—ƒ~ƒXƒg,chase,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1152,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1152,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,100,0,10000,no,target,always,0,,,,,,
-1153,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1153,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,100,0,10000,no,target,always,0,,,,,,
-1154,ƒoƒbƒVƒ…—ƒpƒTƒi,attack,5,10,500,0,5000,yes,target,always,0,,,,,,
-1154,‘½’iUŒ‚—ƒpƒTƒi,attack,171,3,500,0,10000,yes,target,always,0,,,,,,
-1154,–hŒä–³Ž‹UŒ‚—ƒpƒTƒi,attack,170,3,800,0,10000,no,target,always,0,,,,,,
-1155,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1155,•—‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1155,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
-1155,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
-1156,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1156,’n‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1156,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
-1156,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
-1157,ƒeƒŒƒ|[ƒg—ƒtƒ@ƒ‰ƒI,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1157,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒtƒ@ƒ‰ƒI,attack,60,10,1000,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1157,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒtƒ@ƒ‰ƒI,attack,209,3,10000,3000,3600000,no,self,myhpltmaxrate,5,1154,1140,,,,
-1157,Žæ‚芪‚«¢Š«—ƒtƒ@ƒ‰ƒI,attack,196,3,1000,3000,3600000,no,self,slavele,0,1154,1140,,,,
-1157,ƒ`ƒƒ[ƒWƒAƒ[—ƒtƒ@ƒ‰ƒI,attack,148,1,500,2000,10000,no,target,always,0,,,,,,
-1157,ƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO—ƒtƒ@ƒ‰ƒI,attack,203,1,800,0,30000,no,self,always,0,,,,,,
-1157,ƒeƒŒƒ|[ƒg—ƒtƒ@ƒ‰ƒI,attack,26,1,10,0,100000,yes,self,always,0,,,,,,
-1157,Žæ‚芪‚«¢Š«—ƒtƒ@ƒ‰ƒI,chase,196,3,10000,3000,3600000,no,self,slavele,2,1154,1140,,,,
-1157,ƒ`ƒƒ[ƒWƒAƒ[—ƒtƒ@ƒ‰ƒI,chase,148,1,500,2000,10000,no,target,always,0,,,,,,
-1158,…‘®«UŒ‚—ƒtƒFƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
-1159,ƒeƒŒƒ|[ƒg—ƒtƒŠƒIƒj,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1159,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒtƒŠƒIƒj,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1165,,,,,
-1159,ƒA[ƒXƒXƒpƒCƒN—ƒtƒŠƒIƒj,attack,90,5,500,0,3000,yes,target,longrangeattacked,,,,,,,
-1159,ƒXƒg[ƒ“ƒJ[ƒX—ƒtƒŠƒIƒj,attack,16,7,300,1500,5000,no,target,always,0,,,,,,
-1159,¸_”j‰ó—ƒtƒŠƒIƒj,attack,159,5,100,0,10000,yes,target,always,0,,,,,,
-1159,’n‘®«UŒ‚—ƒtƒŠƒIƒj,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
-1159,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒtƒŠƒIƒj,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1159,Žæ‚芪‚«¢Š«—ƒtƒŠƒIƒj,attack,196,5,1000,3000,3600000,no,self,slavele,0,1127,,,,,
-1159,ƒnƒCƒfƒBƒ“ƒO—ƒtƒŠƒIƒj,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
-1159,ƒnƒCƒfƒBƒ“ƒO—ƒtƒŠƒIƒj,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
-1159,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒtƒŠƒIƒj,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
-1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,attack,91,5,500,1500,3000,no,target,attackpcge,2,,,,,,
-1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,attack,91,5,800,1500,3000,no,target,skillused,18,,,,,,
-1159,–hŒä–³Ž‹UŒ‚—ƒtƒŠƒIƒj,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1159,ƒA[ƒXƒXƒpƒCƒN—ƒtƒŠƒIƒj,chase,90,5,300,0,0,yes,target,longrangeattacked,,,,,,,
-1159,‘¬“x‘‰Á—ƒtƒŠƒIƒj,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1159,Žæ‚芪‚«¢Š«—ƒtƒŠƒIƒj,chase,196,5,10000,3000,3600000,no,self,slavele,2,1127,,,,,
-1159,•K’†UŒ‚—ƒtƒŠƒIƒj,chase,172,1,200,0,5000,yes,target,always,0,,,,,,
-1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,chase,91,5,300,1500,0,no,target,attackpcge,2,,,,,,
-1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,chase,91,5,800,1500,3000,no,target,skillused,18,,,,,,
-1160,’n‘®«UŒ‚—ƒsƒG[ƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1160,ƒGƒ‚[ƒVƒ‡ƒ“—ƒsƒG[ƒ‹,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
-1161,…‘®«UŒ‚—ƒvƒ‰ƒ“ƒNƒgƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
-1163,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒN,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,150,1000,40000,yes,self,myhpltmaxrate,30,,,,,,
-1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,50,1000,40000,yes,self,always,0,,,,,,
-1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,50,1500,10000,no,target,always,0,,,,,,
-1163,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒCƒhƒŠƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,chase,114,1,50,1000,40000,yes,self,always,0,,,,,,
-1164,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒNƒCƒGƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
-1164,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1164,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1164,ˆÅ‘®«UŒ‚—ƒŒƒNƒCƒGƒ€,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1165,»‚Ü‚«—ƒTƒ“ƒhƒ}ƒ“,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1165,»‚Ü‚«—ƒTƒ“ƒhƒ}ƒ“,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1165,’n‘®«UŒ‚—ƒTƒ“ƒhƒ}ƒ“,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
-1165,ƒnƒCƒfƒBƒ“ƒO—ƒTƒ“ƒhƒ}ƒ“,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1165,ƒnƒCƒfƒBƒ“ƒO—ƒTƒ“ƒhƒ}ƒ“,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1166,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒx[ƒW,dead,197,1,1000,0,10000,yes,self,always,0,16,,,,,
-1166,’n‘®«UŒ‚—ƒTƒx[ƒW,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
-1166,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒW,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1166,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒW,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1166,‘¬“x‘‰Á—ƒTƒx[ƒW,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
-1167,’n‘®«UŒ‚—ƒTƒx[ƒWƒxƒx,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1167,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒWƒxƒx,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1167,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒx[ƒWƒxƒx,dead,197,1,1000,0,15000,no,self,always,0,16,,,,,
-1169,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒ[ƒJ[,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1170,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒq[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1170,Ž©Œˆ—ƒ\ƒq[,attack,175,1,50,700,0,no,self,myhpltmaxrate,30,,,,,,
-1170,…‘®«UŒ‚—ƒ\ƒq[,attack,184,2,100,0,15000,yes,target,always,0,,,,,,
-1170,ƒoƒbƒVƒ…—ƒ\ƒq[,attack,5,10,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1170,ƒoƒbƒVƒ…—ƒ\ƒq[,attack,5,10,100,1500,10000,no,target,always,0,,,,,,
-1173,…‘®«UŒ‚—•º‘àƒsƒG[ƒ‹,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
-1174,ƒL[ƒsƒ“ƒO—ƒXƒ^ƒCƒi[,attack,201,1,500,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1174,•—‘®«UŒ‚—ƒXƒ^ƒCƒi[,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1174,’¾–ÙUŒ‚—ƒXƒ^ƒCƒi[,attack,178,5,100,0,10000,no,target,always,0,,,,,,
-1175,ˆÅ‘®«UŒ‚—ƒ^ƒƒE,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
-1175,“ÅUŒ‚—ƒ^ƒƒE,attack,176,2,100,1000,10000,no,target,always,0,,,,,,
-1176,ƒq[ƒ‹—ƒrƒ^ƒ^,idle,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1176,’n‘®«UŒ‚—ƒrƒ^ƒ^,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1176,ƒq[ƒ‹—ƒrƒ^ƒ^,attack,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1176,ƒq[ƒ‹—ƒrƒ^ƒ^,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1176,ƒq[ƒ‹—ƒrƒ^ƒ^,chase,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1176,ƒq[ƒ‹—ƒrƒ^ƒ^,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1177,ˆÅ‘®«UŒ‚—ƒ[ƒm[ƒN,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1177,“ÅUŒ‚—ƒ[ƒm[ƒN,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1177,“ÅUŒ‚—ƒ[ƒm[ƒN,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1178,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ[ƒƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
-1178,‰Î‘®«UŒ‚—ƒ[ƒƒ€,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1179,ƒNƒ[ƒLƒ“ƒO—ƒEƒBƒXƒp[,attack,135,1,100,1000,10000,yes,self,always,0,,,,,,
-1179,”O‘®«UŒ‚—ƒEƒBƒXƒp[,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
-1179,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒXƒp[,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1179,ƒNƒ[ƒLƒ“ƒO—ƒEƒBƒXƒp[,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1180,‰Î‘®«UŒ‚—‹ã”öŒÏ,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1180,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1180,ƒjƒ…[ƒ}—‹ã”öŒÏ,attack,25,1,1000,0,20000,yes,self,longrangeattacked,,,,,,,
-1180,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1188,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,1000,1500,30000,no,target,myhpltmaxrate,30,,,,,,
-1188,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
-1188,ƒoƒbƒNƒXƒeƒbƒv—ƒ{ƒ“ƒSƒ“,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1189,ƒAƒ“ƒNƒ‹ƒXƒlƒA—ƒI[ƒNƒA[ƒ`ƒƒ[,idle,117,5,50,1500,50000,yes,self,always,0,,,,,,
-1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,1000,1500,10000,yes,target,attackpcge,2,,,,,,
-1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,100,1500,10000,yes,target,always,0,,,,,,
-1189,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1189,’n‘®«UŒ‚—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,chase,47,5,100,1500,10000,yes,target,always,0,,,,,,
-1190,ƒeƒŒƒ|[ƒg—ƒI[ƒNƒ[ƒh,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1190,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒI[ƒNƒ[ƒh,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1189,,,,,
-1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,14,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,14,10,500,1500,3000,no,target,always,0,,,,,,
-1190,ƒXƒsƒAƒXƒ^ƒu—ƒI[ƒNƒ[ƒh,attack,58,8,100,0,5000,yes,target,always,0,,,,,,
-1190,’n‘®«UŒ‚—ƒI[ƒNƒ[ƒh,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
-1190,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒI[ƒNƒ[ƒh,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1190,Žæ‚芪‚«¢Š«—ƒI[ƒNƒ[ƒh,attack,196,4,1000,3000,3600000,no,self,slavele,0,1189,,,,,
-1190,•K’†UŒ‚—ƒI[ƒNƒ[ƒh,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,19,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,19,10,500,1500,3000,no,target,always,0,,,,,,
-1190,ƒvƒƒ{ƒbƒN—ƒI[ƒNƒ[ƒh,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
-1190,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ[ƒh,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,attack,76,8,100,1500,5000,yes,target,attackpcge,2,,,,,,
-1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,attack,76,5,800,1500,3000,no,target,skillused,18,,,,,,
-1190,ƒCƒ“ƒfƒ…ƒA—ƒI[ƒNƒ[ƒh,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,14,10,300,1500,3000,no,target,longrangeattacked,,,,,,,
-1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,14,10,300,1500,0,no,target,always,0,,,,,,
-1190,‘¬“x‘‰Á—ƒI[ƒNƒ[ƒh,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1190,Žæ‚芪‚«¢Š«—ƒI[ƒNƒ[ƒh,chase,196,4,10000,3000,3600000,no,self,slavele,2,1189,,,,,
-1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,19,10,300,1500,3000,no,target,longrangeattacked,,,,,,,
-1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,19,10,300,1500,0,no,target,always,0,,,,,,
-1190,ƒvƒƒ{ƒbƒN—ƒI[ƒNƒ[ƒh,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
-1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,chase,76,8,100,1500,5000,yes,target,attackpcge,2,,,,,,
-1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,chase,76,5,800,1500,3000,no,target,skillused,18,,,,,,
-1191,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒ~ƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1191,‹zŒŒ—ƒ~ƒ~ƒbƒN,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1192,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1192,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1192,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,100,0,10000,no,target,always,0,,,,,,
-1192,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1193,”͈ÍUŒ‚—ƒAƒ‰[ƒ€,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
-1193,ˆÃˆÅUŒ‚—ƒAƒ‰[ƒ€,attack,177,5,1000,0,10000,no,target,always,0,,,,,,
-1194,’n‘®«UŒ‚—ƒAƒNƒ‰ƒEƒX,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1195,‹zŒŒ—ƒ‰ƒCƒhƒ[ƒh,attack,199,1,1000,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1195,ˆÃˆÅUŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,177,5,1000,0,10000,no,target,always,0,,,,,,
-1195,–hŒä–³Ž‹UŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,170,2,500,0,10000,no,target,always,0,,,,,,
-1196,”͈ÍUŒ‚—ƒXƒPƒ‹ƒvƒŠƒYƒi[,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
-1197,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1197,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1199,•—‘®«UŒ‚—ƒpƒ“ƒN,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1199,Ή»UŒ‚—ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
-1200,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒ‹ƒ^ƒX,attack,136,7,250,1500,10000,no,target,always,0,,,,,,
-1200,•K’†UŒ‚—ƒWƒ‹ƒ^ƒX,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1200,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,attack,6,10,50,1000,30000,yes,target,always,0,,,,,,
-1200,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒ‹ƒ^ƒX,chase,197,1,15,0,10000,yes,self,always,0,30,,,,,
-1200,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,chase,6,10,100,1000,30000,yes,target,always,0,,,,,,
-1201,“Å‘®«UŒ‚—ƒŠƒrƒI,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
-1201,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
-1201,ƒ\ƒjƒbƒNƒuƒ[—ƒŠƒrƒI,attack,136,5,10,1500,10000,no,target,always,0,,,,,,
-1201,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
-1202,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1202,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1202,“Å‘®«UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
-1202,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1203,ˆÅ‘®«UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
-1203,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1203,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1203,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1203,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1204,ˆÅ‘®«UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
-1204,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1204,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
-1204,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1204,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,100,0,10000,no,target,always,0,,,,,,
-1204,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1204,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒKƒgƒD[ƒX,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
-1204,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1205,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
-1205,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
-1205,ˆÅ‘®«UŒ‚—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1205,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,myhpltmaxrate,30,,,,,,
-1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,longrangeattacked,,,,,,,
-1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,100,3000,5000,no,target,always,0,,,,,,
-1205,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1206,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒmƒŠƒAƒ“,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1206,…‘®«UŒ‚—ƒAƒmƒŠƒAƒ“,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
-1207,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒeƒBƒ“ƒO,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,150,500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,50,500,10000,yes,target,always,0,,,,,,
-1207,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1207,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,50,1500,10000,no,target,always,0,,,,,,
-1207,’n‘®«UŒ‚—ƒXƒeƒBƒ“ƒO,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1207,ƒnƒCƒfƒBƒ“ƒO—ƒXƒeƒBƒ“ƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,chase,92,5,50,500,10000,yes,target,always,0,,,,,,
-1208,ƒGƒ‚[ƒVƒ‡ƒ“—œfœr‚¤ŽÒ,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1208,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
-1208,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
-1208,”͈ÍUŒ‚—œfœr‚¤ŽÒ,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1208,•—‘®«UŒ‚—œfœr‚¤ŽÒ,attack,187,4,100,0,15000,yes,target,always,0,,,,,,
-1209,ƒCƒ“ƒxƒiƒ€—ƒNƒ‰ƒ“ƒv,attack,52,6,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1209,ƒCƒ“ƒxƒiƒ€—ƒNƒ‰ƒ“ƒv,attack,52,6,100,1500,10000,no,target,always,0,,,,,,
-1209,“Å‘®«UŒ‚—ƒNƒ‰ƒ“ƒv,attack,188,3,200,0,7500,yes,target,always,0,,,,,,
-1211,‰Î‘®«UŒ‚—ƒuƒŠƒ‰ƒCƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1211,•—‘®«•Ï‰»—ƒuƒŠƒ‰ƒCƒg,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1211,•—‘®«•Ï‰»—ƒuƒŠƒ‰ƒCƒg,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1213,‹i‰Œ—ƒnƒCƒI[ƒN,idle,195,1,10,0,0,yes,self,always,0,,,,,,
-1213,‰Î‘®«UŒ‚—ƒnƒCƒI[ƒN,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1213,•K’†UŒ‚—ƒnƒCƒI[ƒN,attack,172,1,500,0,5000,yes,target,always,0,,,,,,
-1213,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1213,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,100,1500,10000,yes,target,always,0,,,,,,
-1213,ƒGƒ‚[ƒVƒ‡ƒ“—ƒnƒCƒI[ƒN,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1214,ƒXƒLƒbƒhƒgƒ‰ƒbƒv—ƒ`ƒ‡ƒR,idle,115,1,50,1500,300000,yes,self,always,0,,,,,,
-1214,ƒq[ƒ‹—ƒ`ƒ‡ƒR,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
-1214,‰Î‘®«UŒ‚—ƒ`ƒ‡ƒR,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1214,ƒvƒƒ{ƒbƒN—ƒ`ƒ‡ƒR,attack,6,5,50,1500,30000,yes,target,always,0,,,,,,
-1214,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒ‡ƒR,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1214,ΓŠ‚°—ƒ`ƒ‡ƒR,chase,152,1,600,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1214,ΓŠ‚°—ƒ`ƒ‡ƒR,chase,152,1,200,1000,10000,yes,target,always,0,,,,,,
-1214,ƒvƒƒ{ƒbƒN—ƒ`ƒ‡ƒR,chase,6,5,100,1500,30000,yes,target,always,0,,,,,,
-1214,Žæ‚芪‚«¢Š«—ƒ`ƒ‡ƒR,attack,196,4,1000,0,3600000,no,self,slavele,4,1057,,,,,
-1215,•—‘®«UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1215,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1215,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1215,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1215,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1216,‹zŒŒ—ƒyƒmƒƒi,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1216,“Å‘®«UŒ‚—ƒyƒmƒƒi,attack,188,3,100,0,15000,yes,target,always,0,,,,,,
-1216,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1216,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,100,1500,10000,no,target,always,0,,,,,,
-1219,ƒeƒŒƒ|[ƒg—[•£‚Ì‹RŽm,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
-1219,ˆÅ‘®«UŒ‚—[•£‚Ì‹RŽm,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
-1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,1000,2500,3000,no,target,attackpcge,2,,,,,,
-1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
-1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,100,2500,10000,no,target,always,0,,,,,,
-1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,100,2500,10000,no,target,skillused,61,,,,,,
-1219,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—[•£‚Ì‹RŽm,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1219,Žæ‚芪‚«¢Š«—[•£‚Ì‹RŽm,attack,196,2,10000,1500,40000,no,self,slavele,0,1132,,,,,
-1219,ƒ`ƒƒ[ƒWƒAƒ[—[•£‚Ì‹RŽm,chase,148,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1219,ƒ`ƒƒ[ƒWƒAƒ[—[•£‚Ì‹RŽm,chase,148,1,100,0,10000,no,target,always,0,,,,,,
-1219,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—[•£‚Ì‹RŽm,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1219,Žæ‚芪‚«¢Š«—[•£‚Ì‹RŽm,idle,196,2,100,1500,40000,no,self,slavele,0,1132,,,,,
-1242,…‘®«UŒ‚—ƒ}[ƒŠƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
-1242,ƒtƒƒXƒgƒ_ƒCƒo[—ƒ}[ƒŠƒ“,attack,15,1,300,1000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1242,ƒtƒƒXƒgƒ_ƒCƒo[—ƒ}[ƒŠƒ“,attack,15,1,100,1000,10000,yes,target,always,0,,,,,,
-1242,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}[ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1243,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1243,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
-1243,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1243,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1243,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1243,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒXƒJƒbƒ`,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1243,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1245,•—‘®«UŒ‚—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,15,3,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,15,3,50,4000,10000,yes,target,always,0,,,,,,
-1245,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,chase,15,3,50,4000,10000,yes,target,always,0,,,,,,
-1246,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1246,¹‘®«UŒ‚—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
-1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,20,2,150,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,20,2,50,4000,10000,yes,target,always,0,,,,,,
-1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,78,1,150,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,78,1,50,0,10000,yes,target,always,0,,,,,,
-1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,20,2,300,4000,10000,yes,target,longrangeattacked,,,,,,,
-1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,20,2,50,4000,10000,yes,target,always,0,,,,,,
-1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,78,1,50,0,10000,yes,target,always,0,,,,,,
-1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,attack,26,1,100,0,100000,yes,self,always,0,,,,,,
-1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,chase,26,1,100,0,10000,yes,self,always,0,,,,,,
-1248,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1248,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,300,0,10000,no,target,always,0,,,,,,
-1248,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒ‹[ƒU[,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
-1249,öŠo—ƒ~ƒXƒgƒP[ƒX,attack,207,1,100,1000,10000,yes,target,always,0,,,,,,
-1249,ƒXƒsƒAƒXƒ^ƒu—ƒ~ƒXƒgƒP[ƒX,attack,58,1,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1249,ƒXƒsƒAƒXƒ^ƒu—ƒ~ƒXƒgƒP[ƒX,attack,58,1,50,1000,10000,no,target,always,0,,,,,,
-1249,ƒƒ}[ƒiƒCƒg—ƒ~ƒXƒgƒP[ƒX,attack,42,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,8
-1249,ƒƒ}[ƒiƒCƒg—ƒ~ƒXƒgƒP[ƒX,attack,42,1,50,1500,10000,no,target,always,0,,,,,,8
-1249,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒXƒgƒP[ƒX,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1249,öŠo—ƒ~ƒXƒgƒP[ƒX,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
-1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,idle,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1250,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒFƒyƒbƒg,attack,197,1,15,0,10000,yes,self,always,0,17,,,,,
-1250,‰Î‘®«UŒ‚—ƒ`ƒFƒyƒbƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,100,3000,0,yes,target,always,0,,,,,,
-1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,300,3000,0,yes,target,always,0,,,,,,
-1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,100,3000,0,yes,target,always,0,,,,,,
-1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,300,3000,0,yes,target,always,0,,,,,,
-1251,ƒeƒŒƒ|[ƒg—ƒXƒg[ƒ€ƒiƒCƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1251,ƒeƒŒƒ|[ƒg—ƒXƒg[ƒ€ƒiƒCƒg,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1251,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1245,,,,,
-1251,öŠo—ƒXƒg[ƒ€ƒiƒCƒg,attack,207,5,100,0,10000,yes,target,always,0,,,,,,
-1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,89,10,100,1500,5000,no,target,attackpcge,2,,,,,,
-1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,89,8,800,1500,3000,no,target,skillused,18,,,,,,
-1251,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒXƒg[ƒ€ƒiƒCƒg,attack,12,10,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
-1251,•—‘®«UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
-1251,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒXƒg[ƒ€ƒiƒCƒg,attack,60,10,1000,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1251,Žæ‚芪‚«¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1245,,,,,
-1251,•K’†UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1251,–hŒä–³Ž‹UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1251,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒXƒg[ƒ€ƒiƒCƒg,attack,114,1,300,0,20000,yes,self,always,0,,,,,,
-1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,20,8,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,20,8,500,1500,3000,no,target,always,0,,,,,,
-1251,öŠo—ƒXƒg[ƒ€ƒiƒCƒg,chase,207,5,100,0,10000,yes,target,always,0,,,,,,
-1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,89,8,800,1500,3000,no,target,skillused,18,,,,,,
-1251,‘¬“x‘‰Á—ƒXƒg[ƒ€ƒiƒCƒg,chase,29,1,300,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1251,Žæ‚芪‚«¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1245,,,,,
-1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,20,8,300,1500,0,no,target,longrangeattacked,,,,,,,
-1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,20,8,300,1500,0,no,target,always,0,,,,,,
-1252,‹zŒŒ—ƒnƒeƒB[,attack,199,1,300,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1252,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒnƒeƒB[,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1243,,,,,
-1252,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒeƒB[,attack,111,5,100,0,20000,yes,self,always,0,,,,,,
-1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,attack,14,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
-1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,attack,14,10,500,1500,3000,no,target,always,0,,,,,,
-1252,…‘®«UŒ‚—ƒnƒeƒB[,attack,184,5,200,0,5000,yes,target,always,0,,,,,,
-1252,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒnƒeƒB[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1252,Žæ‚芪‚«¢Š«—ƒnƒeƒB[,attack,196,4,1000,3000,10000,no,self,slavele,0,1243,,,,,
-1252,•K’†UŒ‚—ƒnƒeƒB[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,8,500,1500,0,no,target,longrangeattacked,,,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,10,800,1500,10000,no,target,skillused,18,,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,8,100,1500,10000,no,target,always,0,,,,,,
-1252,ƒtƒƒXƒgƒmƒ”ƒ@—ƒnƒeƒB[,attack,88,8,1000,0,10000,yes,target,attackpcge,2,,,,,,
-1252,–hŒä–³Ž‹UŒ‚—ƒnƒeƒB[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1252,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒeƒB[,chase,111,5,100,0,20000,yes,self,always,0,,,,,,
-1252,ƒCƒ“ƒfƒ…ƒA—ƒnƒeƒB[,chase,8,7,1000,0,20000,yes,self,longrangeattacked,,,,,,,
-1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,chase,14,10,300,1500,0,no,target,longrangeattacked,,,,,,,
-1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,chase,14,10,300,1500,0,no,target,always,0,,,,,,
-1252,‘¬“xŒ¸­—ƒnƒeƒB[,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
-1252,‘¬“x‘‰Á—ƒnƒeƒB[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1252,Žæ‚芪‚«¢Š«—ƒnƒeƒB[,chase,196,4,10000,3000,3600000,no,self,slavele,2,1243,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,8,500,1500,0,no,target,longrangeattacked,,,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,10,800,1500,10000,no,target,skillused,18,,,,,,
-1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,8,100,1500,10000,no,target,always,0,,,,,,
-1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,idle,148,1,1000,0,10000,no,target,closedattacked,,,,,,,
-1253,•—‘®«UŒ‚—ƒK[ƒSƒCƒ‹,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
-1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,attack,148,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,attack,148,1,100,0,10000,no,target,always,0,,,,,,
-1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,chase,148,1,100,0,10000,no,target,always,0,,,,,,
-1253,ƒL[ƒsƒ“ƒO—ƒK[ƒSƒCƒ‹,attack,201,1,200,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1254,•—‘®«UŒ‚—ƒŒƒOƒ‹ƒ,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1254,‘½’iUŒ‚—ƒŒƒOƒ‹ƒ,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
-1255,’n‘®«UŒ‚—ƒlƒŒƒCƒh,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1255,…‘®«•Ï‰»—ƒlƒŒƒCƒh,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1255,…‘®«•Ï‰»—ƒlƒŒƒCƒh,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1256,ƒCƒ“ƒxƒiƒ€—ƒyƒXƒg,attack,52,5,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1256,ƒCƒ“ƒxƒiƒ€—ƒyƒXƒg,attack,52,5,50,1500,10000,no,target,always,0,,,,,,
-1256,ˆÅ‘®«UŒ‚—ƒyƒXƒg,attack,190,2,200,0,7500,yes,target,always,0,,,,,,
-1256,‘½’iUŒ‚—ƒyƒXƒg,attack,171,2,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1256,‘½’iUŒ‚—ƒyƒXƒg,attack,171,2,50,0,10000,no,target,always,0,,,,,,
-1257,ˆÅ‘®«UŒ‚—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1257,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1257,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,100,1500,10000,no,target,always,0,,,,,,
-1258,“Å‘®«UŒ‚—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1259,•—‘®«UŒ‚—ƒOƒŠƒtƒHƒ“,attack,187,4,200,0,7500,yes,target,always,0,,,,,,
-1259,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,600,800,0,no,target,myhpltmaxrate,30,,,,,,
-1259,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,200,800,0,no,target,always,0,,,,,,
-1260,‹zŒŒ—ƒ_[ƒNƒtƒŒ[ƒ€,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1260,ˆÅ‘®«UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1260,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1260,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,33,0,10000,no,target,always,0,,,,,,
-1260,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1260,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,33,0,10000,no,target,always,0,,,,,,
-1260,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1260,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,33,0,10000,no,target,always,0,,,,,,
-1261,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒCƒ‹ƒhƒ[ƒY,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1261,•—‘®«UŒ‚—ƒƒCƒ‹ƒhƒ[ƒY,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1261,ƒ\ƒjƒbƒNƒuƒ[—ƒƒCƒ‹ƒhƒ[ƒY,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1261,ƒ\ƒjƒbƒNƒuƒ[—ƒƒCƒ‹ƒhƒ[ƒY,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
-1262,‰Î‘®«UŒ‚—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
-1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,100,0,0,yes,target,always,0,,,,,,
-1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,800,800,0,no,target,attackpcge,2,,,,,,
-1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
-1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
-1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
-1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,800,0,0,yes,target,longrangeattacked,,,,,,,
-1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,100,0,0,yes,target,always,0,,,,,,
-1263,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1263,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,118,2,50,1500,160000,yes,self,always,0,,,,,,
-1263,•—‘®«UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1263,–‚–@‘ÅŒ‚UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,84,3,100,4000,10000,yes,target,always,0,,,,,,
-1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
-1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,100,4000,10000,yes,target,always,0,,,,,,
-1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
-1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,always,0,,,,,,
-1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1264,…‘®«UŒ‚—”¼‹™l,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
-1264,ƒsƒA[ƒX—”¼‹™l,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
-1264,ƒsƒA[ƒX—”¼‹™l,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
-1264,’n‘®«•Ï‰»—”¼‹™l,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1264,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,150,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1264,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
-1264,’n‘®«•Ï‰»—”¼‹™l,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1265,ƒq[ƒ‹—ƒNƒbƒL[,idle,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1265,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒbƒL[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1265,ƒq[ƒ‹—ƒNƒbƒL[,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1265,ƒq[ƒ‹—ƒNƒbƒL[,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1265,ƒiƒp[ƒ€ƒr[ƒg—ƒNƒbƒL[,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
-1265,ƒiƒp[ƒ€ƒr[ƒg—ƒNƒbƒL[,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
-1265,ƒq[ƒ‹—ƒNƒbƒL[,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1265,ƒq[ƒ‹—ƒNƒbƒL[,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1266,’n‘®«UŒ‚—ƒqƒgƒf,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1266,…‘®«•Ï‰»—ƒqƒgƒf,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1266,…‘®«•Ï‰»—ƒqƒgƒf,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1267,ƒeƒŒƒ|[ƒg—ƒWƒFƒXƒ^[,idle,26,1,0,0,100000,yes,self,always,0,,,,,,
-1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,idle,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1267,öŠo—ƒWƒFƒXƒ^[,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
-1267,•—‘®«UŒ‚—ƒWƒFƒXƒ^[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1267,”O‘®«•Ï‰»—ƒWƒFƒXƒ^[,attack,169,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,attack,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,attack,28,6,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1267,ƒvƒƒ{ƒbƒN—ƒWƒFƒXƒ^[,attack,6,10,50,1500,30000,yes,target,always,0,,,,,,
-1267,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒFƒXƒ^[,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
-1267,öŠo—ƒWƒFƒXƒ^[,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
-1267,”O‘®«•Ï‰»—ƒWƒFƒXƒ^[,chase,169,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,chase,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,chase,28,6,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1267,ƒvƒƒ{ƒbƒN—ƒWƒFƒXƒ^[,chase,6,10,100,1500,30000,yes,target,always,0,,,,,,
-1268,ˆÅ‘®«UŒ‚—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,190,5,200,0,7500,yes,target,always,0,,,,,,
-1268,‰Î‘®«•Ï‰»—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,30,,,,,,
-1268,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,57,9,1000,2500,3000,no,target,attackpcge,2,,,,,,
-1268,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,57,9,100,2500,10000,no,target,always,0,,,,,,
-1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,83,8,300,2500,0,no,target,myhpltmaxrate,30,,,,,,
-1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,83,8,100,2500,10000,no,target,always,0,,,,,,
-1268,‰Î‘®«•Ï‰»—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,30,,,,,,
-1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,83,8,300,2500,0,no,target,myhpltmaxrate,30,,,,,,
-1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,83,8,100,2500,10000,no,target,always,0,,,,,,
-1269,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒƒbƒN,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1269,¸_”j‰ó—ƒNƒƒbƒN,attack,159,3,100,0,10000,no,target,always,0,,,,,,
-1269,’n‘®«UŒ‚—ƒNƒƒbƒN,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1269,Ή»UŒ‚—ƒNƒƒbƒN,attack,180,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1269,Ή»UŒ‚—ƒNƒƒbƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
-1270,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—ŽžŒv“ƒŠÇ—ŽÒ,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
-1270,ƒeƒŒƒ|[ƒg—ŽžŒv“ƒŠÇ—ŽÒ,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
-1270,–‚–@‘ÅŒ‚UŒ‚—ŽžŒv“ƒŠÇ—ŽÒ,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,7,300,3500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,5,1000,3500,10000,yes,target,casttargeted,,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,7,100,3500,10000,yes,target,always,0,,,,,,
-1270,ˆÃˆÅUŒ‚—ŽžŒv“ƒŠÇ—ŽÒ,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,7,300,3500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,5,1000,3500,10000,yes,target,casttargeted,,,,,,,
-1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,7,100,3500,10000,yes,target,always,0,,,,,,
-1271,…‘®«UŒ‚—ƒAƒŠƒQ[ƒ^[,attack,184,2,100,0,15000,yes,target,always,0,,,,,,
-1272,ƒeƒŒƒ|[ƒg—ƒ_[ƒNƒ[ƒh,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1272,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒ_[ƒNƒ[ƒh,attack,200,1,1000,2000,10000,no,target,myhpltmaxrate,70,,,,,,
-1272,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ_[ƒNƒ[ƒh,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1302,,,,,
-1272,•—‘®«UŒ‚—ƒ_[ƒNƒ[ƒh,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
-1272,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ_[ƒNƒ[ƒh,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1272,Žæ‚芪‚«¢Š«—ƒ_[ƒNƒ[ƒh,attack,196,4,1000,3000,10000,no,self,slavele,0,1302,,,,,
-1272,•K’†UŒ‚—ƒ_[ƒNƒ[ƒh,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1272,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒ[ƒh,attack,18,7,300,0,5000,yes,target,always,0,,,,,,
-1272,–hŒä–³Ž‹UŒ‚—ƒ_[ƒNƒ[ƒh,attack,170,1,200,3000,5000,no,target,always,0,,,,,,
-1272,–‚–@‘ÅŒ‚UŒ‚—ƒ_[ƒNƒ[ƒh,attack,192,1,100,0,10000,yes,target,always,0,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,500,1500,4000,no,target,longrangeattacked,,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,100,1500,4000,no,target,skillused,18,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,500,1500,4000,no,target,always,0,,,,,,
-1272,Žô‚¢UŒ‚—ƒ_[ƒNƒ[ƒh,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
-1272,‘¬“x‘‰Á—ƒ_[ƒNƒ[ƒh,chase,29,1,500,0,120000,yes,self,myhpltmaxrate,50,,,,,,
-1272,Žæ‚芪‚«¢Š«—ƒ_[ƒNƒ[ƒh,chase,196,4,10000,3000,3600000,no,self,slavele,2,1302,,,,,
-1272,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒ[ƒh,chase,18,7,500,0,0,yes,target,always,0,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,300,1500,1000,no,target,longrangeattacked,,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,100,1500,1000,no,target,skillused,18,,,,,,
-1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,300,1500,1000,no,target,always,0,,,,,,
-1273,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒŒƒfƒB,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1273,’n‘®«UŒ‚—ƒI[ƒNƒŒƒfƒB,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
-1273,‘¬“x‘‰Á—ƒI[ƒNƒŒƒfƒB,chase,29,1,200,1000,120000,yes,self,always,0,,,,,,30
-1274,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒKƒŠƒX,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1274,ƒeƒŒƒ|[ƒg—ƒƒKƒŠƒX,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
-1275,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒŠƒX,idle,197,1,500,0,10000,yes,self,always,0,5,,,,,
-1275,Žæ‚芪‚«¢Š«—ƒAƒŠƒX,idle,196,2,300,0,3600000,no,self,slavele,0,1281,,,,,
-1275,ƒq[ƒ‹—ƒAƒŠƒX,idle,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1275,ƒXƒsƒAƒXƒ^ƒu—ƒAƒŠƒX,attack,58,1,300,1300,5000,no,target,myhpltmaxrate,30,,,,,,
-1275,ƒXƒsƒAƒXƒ^ƒu—ƒAƒŠƒX,attack,58,1,100,1300,5000,no,target,always,0,,,,,,
-1275,ƒq[ƒ‹—ƒAƒŠƒX,attack,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1275,ƒq[ƒ‹—ƒAƒŠƒX,attack,28,7,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1275,ƒq[ƒ‹—ƒAƒŠƒX,chase,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1275,ƒq[ƒ‹—ƒAƒŠƒX,chase,28,7,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1276,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,300,2000,10000,no,target,myhpltmaxrate,30,,,,,,
-1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,100,2000,10000,no,target,always,0,,,,,,
-1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,chase,148,1,100,2000,10000,no,target,always,0,,,,,,
-1277,‰Î‘®«UŒ‚—“V‰º‘å«ŒR,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
-1277,ƒA[ƒXƒXƒpƒCƒN—“V‰º‘å«ŒR,attack,90,3,1000,0,20000,yes,self,longrangeattacked,,,,,,,
-1278,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1278,ƒXƒ^ƒ“UŒ‚—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1278,ƒXƒ^ƒ“UŒ‚—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1278,ƒXƒsƒAƒXƒ^ƒu—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,58,1,300,1100,5000,no,target,myhpltmaxrate,30,,,,,,
-1278,ƒXƒsƒAƒXƒ^ƒu—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,58,1,100,1100,5000,no,target,always,0,,,,,,
-1278,ƒCƒ“ƒfƒ…ƒA—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1278,ƒCƒ“ƒfƒ…ƒA—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1279,’n‘®«UŒ‚—ŽO—tå³,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1280,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,197,1,15,0,10000,yes,self,always,0,23,,,,,
-1280,Ž©”š—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,173,1,50,3000,0,no,self,myhpltmaxrate,40,,,,,,
-1280,•—‘®«UŒ‚—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
-1280,‰Î‘®«•Ï‰»—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,1000,2000,5000,no,target,attackpcge,2,,,,,,
-1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,100,2000,5000,no,target,always,0,,,,,,
-1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,300,2000,5000,no,target,always,0,,,,,,
-1280,‰Î‘®«•Ï‰»—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1281,ƒGƒ‚[ƒVƒ‡ƒ“—ƒZ[ƒWƒ[ƒ€,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,14,5,100,4000,10000,yes,target,always,0,,,,,,
-1281,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒZ[ƒWƒ[ƒ€,attack,12,5,1000,3000,10000,no,self,myhpltmaxrate,30,,,,,,
-1281,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒZ[ƒWƒ[ƒ€,attack,12,5,150,3000,10000,no,self,always,0,,,,,,
-1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1281,–‚–@‘ÅŒ‚UŒ‚—ƒZ[ƒWƒ[ƒ€,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,14,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,14,5,100,4000,10000,yes,target,always,0,,,,,,
-1281,ƒoƒbƒNƒXƒeƒbƒv—ƒZ[ƒWƒ[ƒ€,chase,150,1,1000,0,10000,yes,self,skillused,18,,,,,,
-1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,19,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1282,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1282,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1283,”͈ÍUŒ‚—ƒLƒƒ‰,attack,174,1,800,1500,0,no,target,attackpcge,2,,,,,,
-1283,‰Î‘®«UŒ‚—ƒLƒƒ‰,attack,186,4,200,0,7500,yes,target,always,0,,,,,,
-1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
-1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,100,2500,10000,no,target,always,0,,,,,,
-1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,longrangeattacked,,,,,,,
-1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,always,0,,,,,,
-1285,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒK[ƒfƒBƒAƒ“,attack,46,10,200,0,0,yes,target,always,0,,,,,,
-1285,ƒ`ƒƒ[ƒWƒAƒ[—ƒA[ƒ`ƒƒ[ƒK[ƒfƒBƒAƒ“,attack,148,1,200,0,0,yes,target,always,0,,,,,,
-1287,ƒXƒ^ƒ“UŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒK[ƒfƒBƒAƒ“,attack,179,5,200,0,0,yes,target,always,0,,,,,,
-1287,ƒoƒbƒVƒ…—ƒ\ƒ‹ƒWƒƒ[ƒK[ƒfƒBƒAƒ“,attack,5,10,200,0,0,yes,target,always,0,,,,,,
-1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,idle,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1289,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,12,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
-1289,’n‘®«UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,185,2,100,1000,10000,yes,target,always,0,,,,,,
-1289,ƒsƒA[ƒX—ƒ}ƒ„ƒp[ƒvƒ‹,attack,56,8,100,1000,10000,yes,target,always,0,,,,,,
-1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
-1289,•K’†UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
-1289,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ}ƒ„ƒp[ƒvƒ‹,attack,57,5,100,1000,10000,yes,target,attackpcge,2,,,,,,
-1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,attack,91,5,100,1500,10000,yes,target,skillused,18,,,,,,
-1289,–hŒä–³Ž‹UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
-1289,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ}ƒ„ƒp[ƒvƒ‹,attack,114,1,100,1000,10000,yes,self,always,0,,,,,,
-1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,chase,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,chase,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
-1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,chase,91,5,100,1000,10000,yes,target,attackpcge,2,,,,,,
-1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,chase,91,5,100,1500,10000,yes,target,skillused,18,,,,,,
-1290,Žæ‚芪‚«¢Š«—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,196,1,1000,0,3600000,no,self,slavele,2,1028,1016,,,,
-1290,”͈ÍUŒ‚—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
-1290,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,136,5,250,1500,0,no,target,always,0,,,,,,
-1290,‘½’iUŒ‚—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,171,2,250,0,0,no,target,always,0,,,,,,
-1291,ƒCƒ“ƒxƒiƒ€—ƒfƒbƒhƒŠ[ƒŒƒCƒX,attack,52,10,250,1500,0,no,target,always,0,,,,,,
-1291,Žô‚¢UŒ‚—ƒfƒbƒhƒŠ[ƒŒƒCƒX,attack,181,5,250,0,0,no,target,always,0,,,,,,
-1291,ƒOƒŠƒ€ƒgƒD[ƒX—ƒfƒbƒhƒŠ[ƒŒƒCƒX,chase,137,5,200,0,0,no,target,always,0,,,,,,
-1291,‘¬“xŒ¸­—ƒfƒbƒhƒŠ[ƒŒƒCƒX,chase,30,1,50,3000,0,yes,target,always,0,,,,,,
-1292,’§”­—ƒ~ƒjƒfƒ‚,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
-1292,ˆÅ‘®«UŒ‚—ƒ~ƒjƒfƒ‚,attack,190,5,100,0,15000,yes,target,always,0,,,,,,
-1292,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒjƒfƒ‚,attack,84,5,250,4000,0,yes,target,always,0,,,,,,
-1292,’¾–ÙUŒ‚—ƒ~ƒjƒfƒ‚,attack,178,5,250,0,0,no,target,always,0,,,,,,
-1292,Žæ‚芪‚«¢Š«—ƒ~ƒjƒfƒ‚,attack,196,2,600,0,3600000,no,self,slavele,2,1109,,,,,
-1292,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ~ƒjƒfƒ‚,chase,209,1,1000,0,3600000,no,self,slavele,2,1109,,,,,
-1292,‰“‹——£UŒ‚—ƒ~ƒjƒfƒ‚,chase,160,1,250,2000,0,yes,target,always,0,,,,,,
-1293,Žæ‚芪‚«¢Š«—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,196,2,1000,0,3600000,no,self,slavele,2,1300,,,,,
-1293,ˆÃˆÅUŒ‚—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,177,5,250,0,0,no,target,always,0,,,,,,
-1293,Žô‚¢UŒ‚—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,181,5,250,0,0,no,target,always,0,,,,,,
-1294,Žæ‚芪‚«¢Š«—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,196,2,1000,0,3600000,no,self,slavele,2,1139,,,,,
-1294,–hŒä–³Ž‹UŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,170,5,250,0,0,no,target,always,0,,,,,,
-1294,’n‘®«UŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
-1294,‘½’iUŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,171,2,250,0,0,no,target,always,0,,,,,,
-1295,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒEƒ‹ƒoƒƒ“,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1295,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒIƒEƒ‹ƒoƒƒ“,attack,209,1,1000,0,3600000,no,self,slavele,2,,,,,,
-1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,7,300,0,2000,yes,target,myhpltmaxrate,30,,,,,,
-1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,1,300,0,2000,yes,target,always,0,,,,,,
-1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,3,200,0,2000,yes,target,always,0,,,,,,
-1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,5,100,0,2000,yes,target,always,0,,,,,,
-1295,Žæ‚芪‚«¢Š«—ƒIƒEƒ‹ƒoƒƒ“,attack,196,2,400,0,3600000,no,self,slavele,2,1320,,,,,
-1296,Žæ‚芪‚«¢Š«—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,idle,196,1,1000,0,3600000,no,self,slavele,2,1133,1134,,1133,,
-1296,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,attack,111,1,250,1500,30000,yes,self,always,0,,,,,,
-1296,–hŒä–³Ž‹UŒ‚—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,attack,170,5,250,0,0,no,target,always,0,,,,,,
-1296,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,chase,111,1,120,1500,30000,yes,self,always,0,,,,,,
-1297,‘½’iUŒ‚—ƒGƒ“ƒVƒFƒ“ƒgƒ}ƒ~[,attack,171,2,250,0,0,no,target,always,0,,,,,,
-1298,Žæ‚芪‚«¢Š«—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,196,2,1000,0,3600000,no,self,slavele,2,1036,,,,,
-1298,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,57,10,1000,2500,0,no,target,attackpcge,2,,,,,,
-1298,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,57,10,160,2500,0,no,target,always,0,,,,,,
-1298,“ÅUŒ‚—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,176,5,250,1000,0,no,target,always,0,,,,,,
-1299,Žæ‚芪‚«¢Š«—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,idle,196,1,10000,0,3600000,no,self,slavele,0,1122,1123,,1125,1126,
-1299,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1299,‘½’iUŒ‚—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,attack,171,1,250,0,0,no,target,always,0,,,,,,
-1299,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1300,ƒCƒ“ƒxƒiƒ€—ƒLƒƒƒ^ƒsƒ‰[,attack,52,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1300,ƒCƒ“ƒxƒiƒ€—ƒLƒƒƒ^ƒsƒ‰[,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
-1300,“Å‘®«UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,188,5,200,0,7500,yes,target,always,0,,,,,,
-1300,Ή»UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,180,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1300,Ή»UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,180,5,100,0,10000,no,target,always,0,,,,,,
-1301,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ€ƒ€ƒg,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1301,Žæ‚芪‚«¢Š«—ƒAƒ€ƒ€ƒg,attack,196,2,1000,0,3600000,no,self,slavele,2,1077,,,,,
-1301,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒAƒ€ƒ€ƒg,attack,111,1,250,1000,30000,yes,self,always,0,,,,,,
-1301,ˆÅ‘®«UŒ‚—ƒAƒ€ƒ€ƒg,attack,190,5,100,0,15000,yes,target,always,0,,,,,,
-1301,ƒƒ}[ƒiƒCƒg—ƒAƒ€ƒ€ƒg,attack,42,10,250,1500,0,no,target,always,0,,,,,,
-1302,•—‘®«UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,187,5,100,1000,10000,yes,target,always,0,,,,,,
-1302,•K’†UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
-1302,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,18,7,100,1000,10000,yes,target,always,0,,,,,,
-1302,–hŒä–³Ž‹UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
-1302,–‚–@‘ÅŒ‚UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,192,1,100,1000,10000,yes,target,always,0,,,,,,
-1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,83,9,100,1500,10000,yes,target,skillused,18,,,,,,
-1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,83,9,100,1500,10000,yes,target,always,0,,,,,,
-1302,Žô‚¢UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,181,1,100,1000,10000,yes,target,always,0,,,,,,
-1302,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,18,7,100,1000,10000,yes,target,always,0,,,,,,
-1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,83,9,100,1500,10000,yes,target,skillused,18,,,,,,
-1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,83,9,100,1500,10000,yes,target,always,0,,,,,,
-1303,ƒXƒ^ƒ“UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,179,5,250,1500,0,no,target,always,0,,,,,,
-1303,•—‘®«UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,187,5,100,0,15000,yes,target,always,0,,,,,,
-1303,–hŒä–³Ž‹UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,170,1,250,0,0,no,target,always,0,,,,,,
-1304,Žæ‚芪‚«¢Š«—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,196,2,1000,0,3600000,no,self,slavele,2,1100,,,,,
-1304,“Å‘®«UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,188,5,100,0,15000,yes,target,always,0,,,,,,
-1304,“ÅUŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,176,5,250,1000,0,no,target,always,0,,,,,,
-1304,ƒOƒŠƒ€ƒgƒD[ƒX—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,chase,137,5,200,0,0,no,target,always,0,,,,,,
-1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,idle,140,10,50,2000,0,no,self,always,0,,,,,,
-1305,Žæ‚芪‚«¢Š«—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,196,2,1000,0,3600000,no,self,slavele,2,1099,,,,,
-1305,ƒCƒ“ƒxƒiƒ€—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,52,10,250,1500,0,no,target,always,0,,,,,,
-1305,“Å‘®«UŒ‚—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,188,5,100,0,15000,yes,target,always,0,,,,,,
-1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,140,10,250,2000,0,yes,target,always,0,,,,,,
-1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,chase,140,10,120,2000,0,no,target,always,0,,,,,,
-1306,ƒXƒ^ƒ“UŒ‚—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,179,5,250,1000,0,no,target,always,0,,,,,,
-1306,’n‘®«UŒ‚—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,185,4,200,0,7500,yes,target,always,0,,,,,,
-1306,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,7,10,1000,1500,0,no,target,attackpcge,2,,,,,,
-1306,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,7,10,400,2000,0,no,target,always,0,,,,,,
-1306,ƒCƒ“ƒfƒ…ƒA—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,chase,8,1,1000,0,0,yes,self,longrangeattacked,,,,,,,
-1306,ƒCƒ“ƒfƒ…ƒA—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,chase,8,1,1000,0,0,yes,self,skillused,18,,,,,,
-1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,idle,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1307,ƒA[ƒXƒXƒpƒCƒN—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,90,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,14,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
-1307,•K’†UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,19,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,–hŒä–³Ž‹UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒƒ}[ƒiƒCƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,42,7,100,1000,10000,yes,target,attackpcge,2,,,,,,
-1307,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,20,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒ‰ƒ“ƒ_ƒ€UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,183,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒA[ƒXƒXƒpƒCƒN—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,90,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒCƒ“ƒfƒ…ƒA—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,8,7,100,1000,10000,yes,self,skillused,18,,,,,,
-1307,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,14,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
-1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
-1307,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,19,5,100,1000,10000,yes,target,always,0,,,,,,
-1307,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,20,5,100,1000,10000,yes,target,always,0,,,,,,
-1308,Žæ‚芪‚«¢Š«—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,idle,196,4,1000,0,3600000,no,self,slavele,2,1258,,,,,
-1308,Ž©”š—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,173,1,50,3000,0,no,self,myhpltmaxrate,40,,,,,,
-1308,•—‘®«UŒ‚—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,187,5,200,0,7500,yes,target,always,0,,,,,,
-1308,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,7,10,1000,2000,0,no,target,attackpcge,2,,,,,,
-1308,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,7,10,400,2000,0,no,target,always,0,,,,,,
-1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1309,Žæ‚芪‚«¢Š«—ƒKƒWƒ‡ƒ}[ƒg,attack,196,2,1000,0,3600000,no,self,slavele,2,1129,,,,,
-1309,öŠo—ƒKƒWƒ‡ƒ}[ƒg,attack,207,3,100,0,10000,yes,target,always,0,,,,,,
-1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1309,‰Î‘®«UŒ‚—ƒKƒWƒ‡ƒ}[ƒg,attack,186,5,200,0,7500,yes,target,always,0,,,,,,
-1309,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒKƒWƒ‡ƒ}[ƒg,attack,7,10,1000,2000,0,no,target,attackpcge,2,,,,,,
-1309,‘½’iUŒ‚—ƒKƒWƒ‡ƒ}[ƒg,attack,171,4,250,1500,0,no,target,always,0,,,,,,
-1309,öŠo—ƒKƒWƒ‡ƒ}[ƒg,chase,207,3,100,0,10000,yes,target,always,0,,,,,,
-1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,chase,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,chase,10,1,100,0,20000,yes,self,always,0,,,,,,
-1309,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒKƒWƒ‡ƒ}[ƒg,chase,7,10,400,2000,0,no,target,always,0,,,,,,
-1310,‰Î‘®«UŒ‚—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,186,5,200,0,7500,yes,target,always,0,,,,,,
-1310,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,110,5,250,3000,10000,no,target,always,0,,,,,,
-1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,91,5,250,2000,0,yes,target,always,0,,,,,,
-1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,chase,91,5,300,2000,0,yes,target,longrangeattacked,,,,,,,
-1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,chase,91,5,120,2000,0,yes,target,always,0,,,,,,
-1310,Žæ‚芪‚«¢Š«—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,idle,196,2,100,1500,40000,no,self,slavele,0,1149,,,,,
-1311,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,209,1,1000,0,3600000,no,self,slavele,2,,,,,,
-1311,ƒXƒ^ƒ“UŒ‚—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,179,5,250,1500,0,no,target,always,0,,,,,,
-1311,’n‘®«UŒ‚—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
-1311,ƒCƒ“ƒfƒ…ƒA—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1311,ƒCƒ“ƒfƒ…ƒA—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1311,‘¬“x‘‰Á—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,29,1,100,1000,0,yes,self,always,0,,,,,,
-1312,ƒeƒŒƒ|[ƒg—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,idle,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
-1312,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,209,5,700,3000,3600000,no,self,myhpltmaxrate,5,1315,,,,,
-1312,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,86,5,250,1500,10000,no,target,always,0,,,,,,
-1312,ƒXƒ^ƒ“UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,179,5,250,1500,10000,no,target,always,0,,,,,,
-1312,’n‘®«UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
-1312,ƒ\ƒjƒbƒNƒuƒ[—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,136,10,300,1500,0,no,target,always,0,,,,,,
-1312,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,196,2,1000,3000,3600000,no,self,slavele,0,1314,1316,1318,1319,,
-1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,196,5,700,3000,3600000,no,self,myhpltmaxrate,40,1315,,,,,
-1312,•K’†UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1312,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,57,10,1000,1500,0,no,target,attackpcge,2,,,,,,
-1312,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,57,10,200,1500,0,no,target,always,0,,,,,,
-1312,–hŒä–³Ž‹UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1312,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,196,2,10000,3000,3600000,no,self,slavele,0,1314,1316,1318,1319,,
-1312,ƒCƒ“ƒfƒ…ƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,8,7,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1312,ƒCƒ“ƒfƒ…ƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
-1312,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,86,5,250,1500,10000,no,target,always,0,,,,,,
-1312,‘¬“x‘‰Á—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1313,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒ“ƒsƒ‰,walk,197,1,15,0,10000,yes,self,always,0,32,,,,,
-1313,»‚Ü‚«—ƒ`ƒ“ƒsƒ‰,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1313,ƒXƒsƒAƒXƒ^ƒu—ƒ`ƒ“ƒsƒ‰,attack,58,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1313,ƒXƒsƒAƒXƒ^ƒu—ƒ`ƒ“ƒsƒ‰,attack,58,5,100,1500,10000,no,target,always,0,,,,,,
-1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,idle,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
-1314,ƒGƒ‚[ƒVƒ‡ƒ“—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1314,öŠo—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,207,5,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1314,»‚Ü‚«—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
-1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
-1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,chase,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
-1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,chase,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
-1315,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,197,1,15,0,10000,yes,self,myhpltmaxrate,5,23,,,,,
-1315,•—‘®«UŒ‚—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1315,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1315,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
-1315,Žæ‚芪‚«¢Š«—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1364,,,,,
-1315,ƒoƒbƒNƒXƒeƒbƒv—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,150,1,1000,1000,0,no,self,myhpltmaxrate,20,,,,,,
-1316,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,9,,,,,
-1316,ƒXƒ^ƒ“UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,179,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1316,ƒXƒ^ƒ“UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1316,”͈ÍUŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,174,1,1000,0,0,yes,target,attackpcge,2,,,,,,
-1316,’n‘®«UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1317,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒbƒg[,idle,197,1,5,0,10000,yes,self,always,0,1,,,,,
-1317,…‘®«UŒ‚—ƒIƒbƒg[,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
-1317,‘½’iUŒ‚—ƒIƒbƒg[,attack,171,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1317,‘½’iUŒ‚—ƒIƒbƒg[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
-1318,‰Î‘®«UŒ‚—ƒq[ƒgƒ^[ƒgƒ‹,attack,186,3,400,0,7500,yes,target,always,0,,,,,,
-1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,1000,0,10000,no,target,attackpcge,2,,,,,,
-1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,100,0,10000,no,target,always,0,,,,,,
-1318,ƒGƒ‚[ƒVƒ‡ƒ“—ƒq[ƒgƒ^[ƒgƒ‹,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1319,ƒGƒ‚[ƒVƒ‡ƒ“—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,20,,,,,
-1319,…‘®«UŒ‚—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
-1319,ƒtƒƒXƒgƒ_ƒCƒo[—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,15,10,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1319,ƒtƒƒXƒgƒ_ƒCƒo[—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,15,5,100,1500,10000,no,target,always,0,,,,,,
-1320,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒEƒ‹ƒfƒ…[ƒN,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
-1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,4,300,0,2000,yes,target,myhpltmaxrate,30,,,,,,
-1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,1,300,0,2000,yes,target,always,0,,,,,,
-1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,2,200,0,2000,yes,target,always,0,,,,,,
-1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,3,100,0,2000,yes,target,always,0,,,,,,
-1321,•—‘®«UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1321,‡–°UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,182,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1321,‡–°UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1322,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,6,,,,,
-1322,’n‘®«UŒ‚—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1322,ƒoƒbƒVƒ…—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,5,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1322,ƒoƒbƒVƒ…—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,5,5,100,1500,10000,no,target,always,0,,,,,,
-1322,ΓŠ‚°—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,chase,152,1,100,0,10000,yes,target,always,0,,,,,,
-1323,ƒGƒ‚[ƒVƒ‡ƒ“—ƒV[ƒIƒbƒ^[,idle,197,1,5,0,10000,yes,self,always,0,22,,,,,
-1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,attack,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1323,…‘®«UŒ‚—ƒV[ƒIƒbƒ^[,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
-1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,chase,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1364,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,197,1,15,0,10000,yes,self,myhpltmaxrate,5,23,,,,,
-1364,•—‘®«UŒ‚—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1364,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1364,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
-1364,Žæ‚芪‚«¢Š«—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1364,,,,,
-1364,ƒoƒbƒNƒXƒeƒbƒv—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,150,1,1000,1000,0,no,self,myhpltmaxrate,20,,,,,,
-1365,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒAƒ|ƒJƒŠƒvƒX,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
-1365,Ž©”š—ƒAƒ|ƒJƒŠƒvƒX,attack,173,1,50,3000,0,no,self,myhpltmaxrate,30,,,,,,
-1365,‘½’iUŒ‚—ƒAƒ|ƒJƒŠƒvƒX,attack,171,4,250,1500,0,no,target,always,0,,,,,,
-1366,Žæ‚芪‚«¢Š«—ƒ‰[ƒ”ƒ@ƒS[ƒŒƒ€,attack,196,2,1000,0,3600000,no,self,slavele,2,1367,,,,,
-1366,‰Î‘®«UŒ‚—ƒ‰[ƒ”ƒ@ƒS[ƒŒƒ€,attack,186,5,100,0,15000,yes,target,always,0,,,,,,
-1367,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒuƒŒƒCƒU[,attack,17,10,350,0,0,no,target,attackpcge,2,,,,,,
-1367,‰Î‘®«UŒ‚—ƒuƒŒƒCƒU[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
-1367,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒuƒŒƒCƒU[,chase,17,10,350,0,0,no,target,always,0,,,,,,
-1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,idle,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
-1368,‡–°UŒ‚—ƒWƒIƒOƒ‰ƒtƒ@[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,attack,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
-1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,attack,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
-1369,ƒ\ƒjƒbƒNƒuƒ[—ƒOƒ‰ƒ“ƒyƒR,attack,136,3,10,1500,10000,no,target,always,0,,,,,,
-1369,‘½’iUŒ‚—ƒOƒ‰ƒ“ƒyƒR,attack,171,5,100,0,10000,no,target,always,0,,,,,,
-1370,ƒeƒŒƒ|[ƒg—ƒTƒLƒ…ƒoƒX,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1370,‹zŒŒ—ƒTƒLƒ…ƒoƒX,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1370,ˆÅ‘®«UŒ‚—ƒTƒLƒ…ƒoƒX,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
-1370,‹zŒŒ—ƒTƒLƒ…ƒoƒX,chase,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1371,ˆÃˆÅUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1371,‡–°UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1371,“ÅUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1371,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1371,Žô‚¢UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
-1371,’¾–ÙUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,178,5,100,0,10000,no,target,always,0,,,,,,
-1371,Ή»UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,180,5,50,0,10000,no,target,always,0,,,,,,
-1371,Žæ‚芪‚«¢Š«—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1011,1042,,,,
-1372,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒS[ƒg,attack,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
-1372,ƒXƒ^ƒ“UŒ‚—ƒS[ƒg,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1372,”͈ÍUŒ‚—ƒS[ƒg,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1372,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒS[ƒg,chase,111,5,100,0,30000,yes,self,always,0,,,,,,
-1372,‘¬“x‘‰Á—ƒS[ƒg,chase,29,5,100,1000,120000,yes,self,always,0,,,,,,
-1373,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ[ƒhƒIƒuƒfƒX,attack,209,2,10000,3000,3600000,no,self,myhpltmaxrate,5,1298,1290,,,,
-1373,Žæ‚芪‚«¢Š«—ƒ[ƒhƒIƒuƒfƒX,attack,196,2,10000,3000,30000,no,self,slavele,0,1298,1290,,,,
-1373,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ[ƒhƒIƒuƒfƒX,attack,57,5,1000,0,50000,yes,target,attackpcge,2,,,,,,
-1373,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ[ƒhƒIƒuƒfƒX,attack,57,5,1000,0,100000,yes,target,always,0,,,,,,
-1373,ƒXƒsƒAƒXƒ^ƒu—ƒ[ƒhƒIƒuƒfƒX,attack,58,8,100,0,5000,yes,target,always,0,,,,,,
-1373,ƒXƒsƒAƒXƒ^ƒu—ƒ[ƒhƒIƒuƒfƒX,chase,58,8,100,0,5000,yes,target,always,0,,,,,,
-1373,‘¬“xŒ¸­—ƒ[ƒhƒIƒuƒfƒX,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
-1373,Žæ‚芪‚«¢Š«—ƒ[ƒhƒIƒuƒfƒX,chase,196,2,1000,3000,3600000,no,self,slavele,0,1298,1290,,,,
-1374,ƒeƒŒƒ|[ƒg—ƒCƒ“ƒLƒ…ƒoƒX,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1374,ˆÅ‘®«UŒ‚—ƒCƒ“ƒLƒ…ƒoƒX,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
-1375,‘½’iUŒ‚—ˆê”½–Ø–È,attack,171,3,100,0,10000,no,target,always,0,,,,,,
-1376,‹zŒŒ—ƒn[ƒs[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1376,‘½’iUŒ‚—ƒn[ƒs[,attack,171,3,100,0,10000,no,target,always,0,,,,,,
-1377,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,14,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒtƒƒXƒgƒ_ƒCƒo[—ƒGƒ‹ƒ_[,attack,15,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒoƒbƒNƒXƒeƒbƒv—ƒGƒ‹ƒ_[,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1377,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,14,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1377,ƒtƒƒXƒgƒ_ƒCƒo[—ƒGƒ‹ƒ_[,chase,15,5,100,4000,10000,yes,target,always,0,,,,,,
-1378,Ή»UŒ‚—ƒf[ƒ‚ƒ“ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
-1378,ˆÃˆÅUŒ‚—ƒf[ƒ‚ƒ“ƒpƒ“ƒN,attack,177,2,100,0,10000,no,target,always,0,,,,,,
-1379,Žô‚¢UŒ‚—ƒiƒCƒgƒƒAƒeƒ‰[,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
-1379,‹zŒŒ—ƒiƒCƒgƒƒAƒeƒ‰[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1379,‰Î‘®«UŒ‚—ƒiƒCƒgƒƒAƒeƒ‰[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
-1380,‘½’iUŒ‚—ƒhƒŠƒ‰[,attack,171,4,100,0,10000,no,target,always,0,,,,,,
-1380,ƒNƒ[ƒLƒ“ƒO—ƒhƒŠƒ‰[,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1380,ƒNƒ[ƒLƒ“ƒO—ƒhƒŠƒ‰[,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1382,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,17,10,350,0,0,no,target,always,0,,,,,,
-1382,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,19,4,100,3000,10000,no,target,always,0,,,,,,
-1382,ƒsƒA[ƒX—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
-1382,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒBƒAƒ{ƒŠƒbƒN,chase,17,10,350,0,0,no,target,always,0,,,,,,
-1383,ƒTƒCƒg—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1383,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,7,10,400,2000,0,no,target,always,0,,,,,,
-1383,‹zŒŒ—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1383,‰Î‘®«UŒ‚—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
-1383,ƒTƒCƒg—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
-1384,‰Î‘®«UŒ‚—ƒfƒŠ[ƒ^[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
-1384,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒfƒŠ[ƒ^[,attack,7,10,400,2000,0,no,target,always,0,,,,,,
-1384,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,attack,17,10,350,0,0,no,target,always,0,,,,,,
-1384,‘½’iUŒ‚—ƒfƒŠ[ƒ^[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
-1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,attack,83,4,100,1500,10000,yes,target,skillused,18,,,,,,
-1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,attack,83,4,100,1500,10000,yes,target,always,0,,,,,,
-1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,chase,83,4,100,1500,10000,yes,target,always,0,,,,,,
-1384,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,chase,17,10,350,0,0,no,target,always,0,,,,,,
-1385,‰Î‘®«UŒ‚—ƒfƒŠ[ƒ^[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
-1385,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒfƒŠ[ƒ^[,attack,7,10,400,2000,0,no,target,always,0,,,,,,
-1385,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,attack,17,10,350,0,0,no,target,always,0,,,,,,
-1385,‘½’iUŒ‚—ƒfƒŠ[ƒ^[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
-1385,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒfƒŠ[ƒ^[,attack,18,7,900,0,2000,yes,target,always,0,,,,,,
-1385,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒfƒŠ[ƒ^[,chase,18,7,900,0,2000,yes,target,always,0,,,,,,
-1385,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,chase,17,10,350,0,0,no,target,always,0,,,,,,
-1386,‡–°UŒ‚—ƒXƒŠ[ƒp[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1386,ˆÃˆÅUŒ‚—ƒXƒŠ[ƒp[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1386,ƒNƒ[ƒLƒ“ƒO—ƒXƒŠ[ƒp[,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1386,»‚Ü‚«—ƒXƒŠ[ƒp[,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1387,’n‘®«UŒ‚—ƒMƒO,attack,185,3,100,0,15000,yes,target,always,0,,,,,,
-1387,ƒnƒCƒfƒBƒ“ƒO—ƒMƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1387,ƒCƒ“ƒxƒiƒ€—ƒMƒO,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
-1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,idle,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
-1388,ƒCƒ“ƒeƒBƒ~ƒfƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,219,10,500,0,1000000,no,target,always,0,,,,,,
-1388,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,1000,3000,5000,no,self,slavele,3,,,,,,
-1388,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,120,3000,5000,no,self,always,0,,,,,,
-1388,¹‘®«UŒ‚—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
-1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
-1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
-1388,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,156,1,200,0,5000,yes,target,always,0,,,,,,
-1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,3,10000,0,3600000,yes,self,myhpltmaxrate,50,1261,1281,,,,
-1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,5,10000,3000,30000,no,self,slavele,0,1267,1246,,,,
-1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,196,5,1000,3000,3600000,no,self,slavele,0,1267,1246,,,,
-1388,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,156,1,200,0,5000,yes,target,always,0,,,,,,
-1389,ƒeƒŒƒ|[ƒg—ƒhƒ‰ƒLƒ…ƒ‰,idle,26,1,1000,0,100000,yes,self,always,0,,,,,,
-1389,‹zŒŒ—ƒhƒ‰ƒLƒ…ƒ‰,attack,199,5,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1389,¸_”j‰ó—ƒhƒ‰ƒLƒ…ƒ‰,attack,159,5,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1389,ƒNƒ[ƒLƒ“ƒO—ƒhƒ‰ƒLƒ…ƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1389,ƒeƒŒƒ|[ƒg—ƒhƒ‰ƒLƒ…ƒ‰,attack,26,1,10,0,100000,yes,self,always,0,,,,,,
-1389,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,attack,209,6,1000,3000,3600000,no,self,myhpltmaxrate,5,1005,,,,,
-1389,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,attack,196,6,1000,3000,10000,no,self,slavele,0,1005,,,,,
-1389,‘¬“xŒ¸­—ƒhƒ‰ƒLƒ…ƒ‰,attack,30,1,50,3000,120000,yes,target,always,0,,,,,,
-1389,‘½’iUŒ‚—ƒhƒ‰ƒLƒ…ƒ‰,attack,171,7,100,0,10000,no,target,always,0,,,,,,
-1389,‘½’iUŒ‚—ƒhƒ‰ƒLƒ…ƒ‰,attack,171,4,100,0,10000,no,target,always,0,,,,,,
-1389,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒ‰ƒLƒ…ƒ‰,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
-1389,ƒNƒ[ƒLƒ“ƒO—ƒhƒ‰ƒLƒ…ƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
-1389,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,chase,196,6,1000,3000,10000,no,self,slavele,0,1005,,,,,
-1389,ƒOƒŠƒ€ƒgƒD[ƒX—ƒhƒ‰ƒLƒ…ƒ‰,chase,137,5,200,0,0,no,target,always,0,,,,,,
-1390,ˆÃˆÅUŒ‚—ƒ”ƒ@ƒCƒIƒŠ[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1390,ˆÅ‘®«UŒ‚—ƒ”ƒ@ƒCƒIƒŠ[,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
-1390,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ”ƒ@ƒCƒIƒŠ[,attack,76,5,500,3000,10000,yes,target,always,0,,,,,,
-1390,ƒ_[ƒNƒuƒŒƒX—ƒ”ƒ@ƒCƒIƒŠ[,attack,202,1,1000,0,100000,no,target,always,0,,,,,,
-1390,ƒ_[ƒNƒuƒŒƒX—ƒ”ƒ@ƒCƒIƒŠ[,chase,202,1,1000,0,100000,no,target,always,0,,,,,,
-1391,…‘®«UŒ‚—ƒKƒ‰ƒpƒS,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
-1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,attack,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1391,ƒq[ƒ‹—ƒKƒ‰ƒpƒS,attack,28,5,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
-1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1392,‘½’iUŒ‚—ƒ[ƒ^[ƒWƒƒƒCƒ,attack,171,3,100,0,10000,no,target,always,0,,,,,,
-1392,Ž©”š—ƒ[ƒ^[ƒWƒƒƒCƒ,attack,173,1,50,3000,0,no,self,myhpltmaxrate,30,,,,,,
-1395,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1396,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1397,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1398,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1399,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1399,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒoƒtƒHƒƒbƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1101,,,,,
-1399,•—‘®«UŒ‚—ƒoƒtƒHƒƒbƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
-1399,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒoƒtƒHƒƒbƒg,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
-1399,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1101,,,,,
-1399,•K’†UŒ‚—ƒoƒtƒHƒƒbƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
-1399,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒoƒtƒHƒƒbƒg,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
-1399,–hŒä–³Ž‹UŒ‚—ƒoƒtƒHƒƒbƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
-1399,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒoƒtƒHƒƒbƒg,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,1000,1500,4000,no,target,attackpcge,2,,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,800,1500,4000,no,target,skillused,0,,,,,,
-1399,Žô‚¢UŒ‚—ƒoƒtƒHƒƒbƒg,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
-1399,‘¬“x‘‰Á—ƒoƒtƒHƒƒbƒg,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
-1399,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1101,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
-1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,800,1500,4000,no,target,skillused,18,,,,,,
-1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,attack,86,2,100,3000,10000,yes,target,always,0,,,,,,
-1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,attack,86,2,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1400,öŠo—ƒJƒ‰ŽP,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
-1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,chase,86,2,100,3000,10000,yes,target,always,0,,,,,,
-1401,ƒeƒŒƒ|[ƒg—ƒJƒuƒL”EŽÒ,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1401,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—ƒJƒuƒL”EŽÒ,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
-1401,ƒoƒbƒNƒXƒeƒbƒv—ƒJƒuƒL”EŽÒ,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1401,ƒXƒ^ƒ“UŒ‚—ƒJƒuƒL”EŽÒ,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1402,“ÅUŒ‚—‘åŒûŠ^,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1402,ƒCƒ“ƒxƒiƒ€—‘åŒûŠ^,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
-1403,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—eŠï•º,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1403,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—eŠï•º,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1404,ˆÃˆÅUŒ‚—‰ëlŒ`,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1404,Žô‚¢UŒ‚—‰ëlŒ`,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
-1404,’¾–ÙUŒ‚—‰ëlŒ`,attack,178,5,100,0,10000,no,target,always,0,,,,,,
-1405,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—Žð“V‹ç,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
-1405,ƒvƒƒ{ƒbƒN—Žð“V‹ç,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
-1405,‘½’iUŒ‚—Žð“V‹ç,attack,171,3,100,0,10000,no,target,always,0,,,,,,
-1405,ƒA[ƒXƒXƒpƒCƒN—Žð“V‹ç,attack,90,5,500,1500,2000,no,target,always,0,,,,,,
-1405,ƒA[ƒXƒXƒpƒCƒN—Žð“V‹ç,chase,90,5,500,1500,2000,no,target,always,0,,,,,,
-1405,ƒvƒƒ{ƒbƒN—Žð“V‹ç,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
-1406,‹zŒŒ—‰Í“¶,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1406,ƒEƒH[ƒ^[ƒ{[ƒ‹—‰Í“¶,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1406,ƒEƒH[ƒ^[ƒ{[ƒ‹—‰Í“¶,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
-1408,‡–°UŒ‚—ƒpƒsƒˆƒ“,attack,182,5,100,0,10000,no,target,always,0,,,,,,
-1408,ƒsƒA[ƒX—ƒpƒsƒˆƒ“,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
-1408,‹zŒŒ—ƒpƒsƒˆƒ“,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1409,•—‘®«UŒ‚—’cŽq“¶Žq,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1410,ƒq[ƒ‹—l–Ê“Ž÷,any,28,10,1000,300,3000,no,self,myhpltmaxrate,90,,,,,,
-1410,ƒq[ƒ‹—l–Ê“Ž÷,any,28,10,1000,300,3000,no,friend,friendhpltmaxrate,60,,,,,,
-1412,ˆÃˆÅUŒ‚—“VŽõål,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1412,ƒeƒŒƒ|[ƒg—“VŽõål,attack,26,1,20,1000,100000,yes,self,always,0,,,,,,
-1412,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—“VŽõål,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1412,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—“VŽõål,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1415,–hŒä–³Ž‹UŒ‚—ƒRƒE,attack,170,5,250,0,0,no,target,always,0,,,,,,
-1416,ƒq[ƒ‹—“Vå–ºX,attack,28,5,1000,0,3000,yes,self,myhpltmaxrate,50,,,,,,
-1416,ƒsƒA[ƒX—“Vå–ºX,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
-1417,–hŒä–³Ž‹UŒ‚—ƒ`ƒƒƒbƒL[,attack,170,5,250,0,0,no,target,always,0,,,,,,
-1417,ƒXƒ^ƒ“UŒ‚—ƒ`ƒƒƒbƒL[,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1418,ƒeƒŒƒ|[ƒg—•ŽÖ‰¤,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
-1418,ƒ‚ƒ“ƒXƒ^[¢Š«—•ŽÖ‰¤,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1412,,,,,
-1418,Žæ‚芪‚«¢Š«—•ŽÖ‰¤,attack,196,4,1000,3000,3600000,no,self,slavele,0,1412,,,,,
-1418,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—•ŽÖ‰¤,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
-1418,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—•ŽÖ‰¤,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1418,”͈ÍUŒ‚—•ŽÖ‰¤,attack,174,1,1000,0,10000,no,target,attackpcge,2,,,,,,
-1418,ˆÃˆÅUŒ‚—•ŽÖ‰¤,attack,177,5,33,0,10000,no,target,always,0,,,,,,
-1418,ƒ_[ƒNƒuƒŒƒX—•ŽÖ‰¤,attack,202,5,500,0,100000,no,target,always,0,,,,,,
-1418,ƒtƒƒXƒgƒ_ƒCƒo[—•ŽÖ‰¤,attack,15,10,800,1500,10000,no,target,skillused,18,,,,,,
-1418,ƒtƒƒXƒgƒ_ƒCƒo[—•ŽÖ‰¤,chase,15,10,800,1500,10000,no,target,skillused,18,,,,,,
-1418,ƒ_[ƒNƒuƒŒƒX—•ŽÖ‰¤,chase,202,5,500,0,100000,no,target,always,0,,,,,,
-1418,Žæ‚芪‚«¢Š«—•ŽÖ‰¤,chase,196,4,10000,3000,3600000,no,self,slavele,2,1412,,,,,
-1419,ˆÅ‘®«UŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
-1419,ˆÃˆÅUŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,177,3,100,0,10000,no,target,always,0,,,,,,
-1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1421,ˆÅ‘®«UŒ‚—ƒCƒVƒX,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1421,‘¬“x‘‰Á—ƒCƒVƒX,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
-1422,‹zŒŒ—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1422,•—‘®«UŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
-1422,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1422,‘½’iUŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1422,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
-1422,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1423,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1423,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1424,“Å‘®«UŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
-1424,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
-1424,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
-1424,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1424,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,50,1000,10000,no,target,always,0,,,,,,
-1425,…‘®«UŒ‚—ƒIƒ{ƒ“ƒk,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1425,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒ{ƒ“ƒk,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1426,…‘®«UŒ‚—ƒ}ƒ‹ƒN,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
-1427,”O‘®«UŒ‚—ƒiƒCƒgƒƒA,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
-1427,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1427,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,50,0,10000,no,target,always,0,,,,,,
-1427,‘¬“x‘‰Á—ƒiƒCƒgƒƒA,chase,29,1,50,1000,120000,yes,self,always,0,,,,,,
-1428,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1428,“Å‘®«UŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1428,“ÅUŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
-1429,ƒCƒ“ƒxƒiƒ€—ƒAƒ‹ƒMƒIƒy,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
-1429,“Å‘®«UŒ‚—ƒAƒ‹ƒMƒIƒy,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
-1429,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,attack,140,5,100,2000,20000,no,target,always,0,,,,,,
-1429,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,chase,140,5,100,2000,20000,no,target,always,0,,,,,,
-1430,“Å‘®«UŒ‚—ƒAƒ‹ƒSƒX,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
-1430,“ÅUŒ‚—ƒAƒ‹ƒSƒX,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1431,öŠo—ƒoƒtƒHƒƒbƒgJr.,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
-1431,ˆÅ‘®«UŒ‚—ƒoƒtƒHƒƒbƒgJr.,attack,190,3,100,0,15000,yes,target,always,0,,,,,,
-1431,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒoƒtƒHƒƒbƒgJr.,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
-1431,öŠo—ƒoƒtƒHƒƒbƒgJr.,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
-1432,»‚Ü‚«—ƒfƒU[ƒgƒEƒ‹ƒt,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
-1432,‰Î‘®«UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1432,–hŒä–³Ž‹UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,170,1,100,0,10000,no,target,always,0,,,,,,
-1432,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒU[ƒgƒEƒ‹ƒt,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1433,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,attack,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1433,ˆÅ‘®«UŒ‚—ƒfƒrƒ‹ƒ`,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,50,4000,10000,yes,target,always,0,,,,,,
-1433,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,chase,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1433,‰“‹——£UŒ‚—ƒfƒrƒ‹ƒ`,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
-1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,longrangeattacked,,,,,,,
-1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,always,0,,,,,,
-1434,‹zŒŒ—ƒhƒŒƒCƒ“ƒŠƒA[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1434,ˆÅ‘®«UŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,190,1,200,0,7500,yes,target,always,0,,,,,,
-1434,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1434,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
-1435,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,91,4,100,4000,10000,no,target,always,0,,,,,,
-1435,Ή»UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,180,5,50,0,10000,no,target,always,0,,,,,,
-1435,Žô‚¢UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,181,5,50,0,10000,no,target,always,0,,,,,,
-1435,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,300,4000,10000,no,target,longrangeattacked,,,,,,,
-1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,100,4000,10000,no,target,always,0,,,,,,
-1436,‰Î‘®«UŒ‚—ƒWƒƒƒbƒN,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
-1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,100,4000,10000,yes,target,always,0,,,,,,
-1436,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1436,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒƒƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,chase,19,4,100,4000,10000,yes,target,always,0,,,,,,
-1436,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1437,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1437,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,attack,92,5,50,0,10000,yes,target,always,0,,,,,,
-1437,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,attack,13,10,50,1000,5000,yes,target,always,0,,,,,,
-1437,•—‘®«UŒ‚—ƒWƒ‡[ƒJ[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1437,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,attack,161,1,1000,1000,30000,no,self,always,0,,,,,,
-1437,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,attack,17,7,50,4000,10000,yes,target,always,0,,,,,,
-1437,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,attack,15,6,50,4000,10000,yes,target,always,0,,,,,,
-1437,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,attack,91,4,50,4000,10000,no,target,always,0,,,,,,
-1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,attack,84,5,50,4000,10000,yes,target,always,0,,,,,,
-1437,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1437,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
-1437,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,chase,13,10,50,1000,5000,yes,target,always,0,,,,,,
-1437,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,chase,161,1,1000,1000,30000,no,self,always,0,,,,,,
-1437,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,chase,17,7,50,4000,10000,yes,target,always,0,,,,,,
-1437,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,chase,15,6,50,4000,10000,yes,target,always,0,,,,,,
-1437,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,chase,91,4,50,2500,10000,no,target,always,0,,,,,,
-1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,longrangeattacked,,,,,,,
-1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,always,0,,,,,,
-1438,”͈ÍUŒ‚—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1438,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1438,ƒOƒŠƒ€ƒgƒD[ƒX—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,137,5,300,0,0,no,target,always,0,,,,,,
-1439,‹i‰Œ—ƒnƒCƒI[ƒN,idle,195,1,10,0,0,yes,self,always,0,,,,,,
-1439,‰Î‘®«UŒ‚—ƒnƒCƒI[ƒN,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1439,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1439,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,100,1500,10000,yes,target,always,0,,,,,,
-1439,ƒGƒ‚[ƒVƒ‡ƒ“—ƒnƒCƒI[ƒN,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1440,•—‘®«UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1440,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1440,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1440,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1440,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1441,‹zŒŒ—ƒyƒmƒƒi,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1441,“Å‘®«UŒ‚—ƒyƒmƒƒi,attack,188,3,100,0,15000,yes,target,always,0,,,,,,
-1441,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1441,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,100,1500,10000,no,target,always,0,,,,,,
-1442,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1442,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
-1442,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1442,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
-1442,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
-1442,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒXƒJƒbƒ`,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1442,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1443,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1443,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,300,0,10000,no,target,always,0,,,,,,
-1443,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒ‹[ƒU[,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
-1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,idle,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1444,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒFƒyƒbƒg,attack,197,1,15,0,10000,yes,self,always,0,17,,,,,
-1444,‰Î‘®«UŒ‚—ƒ`ƒFƒyƒbƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,100,3000,0,yes,target,always,0,,,,,,
-1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,300,3000,0,yes,target,always,0,,,,,,
-1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
-1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
-1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,100,3000,0,yes,target,always,0,,,,,,
-1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,300,3000,0,yes,target,always,0,,,,,,
-1445,•—‘®«UŒ‚—ƒŒƒOƒ‹ƒ,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
-1445,‘½’iUŒ‚—ƒŒƒOƒ‹ƒ,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
-1446,ˆÅ‘®«UŒ‚—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1446,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1446,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,100,1500,10000,no,target,always,0,,,,,,
-1447,•—‘®«UŒ‚—ƒOƒŠƒtƒHƒ“,attack,187,4,200,0,7500,yes,target,always,0,,,,,,
-1447,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,600,800,0,no,target,myhpltmaxrate,30,,,,,,
-1447,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,200,800,0,no,target,always,0,,,,,,
-1448,‹zŒŒ—ƒ_[ƒNƒtƒŒ[ƒ€,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
-1448,ˆÅ‘®«UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1448,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1448,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,33,0,10000,no,target,always,0,,,,,,
-1448,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1448,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,33,0,10000,no,target,always,0,,,,,,
-1448,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1448,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,33,0,10000,no,target,always,0,,,,,,
-1449,‰Î‘®«UŒ‚—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
-1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,100,0,0,yes,target,always,0,,,,,,
-1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,800,800,0,no,target,attackpcge,2,,,,,,
-1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
-1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
-1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
-1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,800,0,0,yes,target,longrangeattacked,,,,,,,
-1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,100,0,0,yes,target,always,0,,,,,,
-1450,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1450,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,118,2,50,1500,160000,yes,self,always,0,,,,,,
-1450,•—‘®«UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
-1450,–‚–@‘ÅŒ‚UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,84,3,100,4000,10000,yes,target,always,0,,,,,,
-1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
-1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,100,4000,10000,yes,target,always,0,,,,,,
-1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
-1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,always,0,,,,,,
-1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
-1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
-1451,…‘®«UŒ‚—”¼‹™l,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
-1451,ƒsƒA[ƒX—”¼‹™l,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
-1451,ƒsƒA[ƒX—”¼‹™l,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
-1451,’n‘®«•Ï‰»—”¼‹™l,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1451,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,150,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1451,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
-1451,’n‘®«•Ï‰»—”¼‹™l,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1452,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒŒƒfƒB,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1452,’n‘®«UŒ‚—ƒI[ƒNƒŒƒfƒB,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
-1453,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,300,2000,10000,no,target,myhpltmaxrate,30,,,,,,
-1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,100,2000,10000,no,target,always,0,,,,,,
-1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,chase,148,1,100,2000,10000,no,target,always,0,,,,,,
-1454,’n‘®«UŒ‚—ŽO—tå³,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1455,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1455,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
-1456,”͈ÍUŒ‚—ƒLƒƒ‰,attack,174,1,800,1500,0,no,target,attackpcge,2,,,,,,
-1456,‰Î‘®«UŒ‚—ƒLƒƒ‰,attack,186,4,200,0,7500,yes,target,always,0,,,,,,
-1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
-1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,100,2500,10000,no,target,always,0,,,,,,
-1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,longrangeattacked,,,,,,,
-1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,always,0,,,,,,
-1457,’n‘®«UŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
-1457,‘½’iUŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,171,1,100,0,10000,no,target,always,0,,,,,,
-1458,‰Î‘®«UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,attack,18,3,100,3000,10000,yes,target,always,0,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1458,–‚–@‘ÅŒ‚UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,192,1,100,0,10000,no,target,always,0,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,chase,18,3,100,3000,10000,yes,target,always,0,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,300,4000,10000,yes,target,longrangeattacked,,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,300,4000,10000,yes,target,longrangeattacked,,,,,,,
-1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1459,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒIƒlƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1459,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv—ƒ}ƒŠƒIƒlƒbƒg,idle,121,5,50,1500,30000,yes,self,always,0,,,,,,
-1459,”O‘®«UŒ‚—ƒ}ƒŠƒIƒlƒbƒg,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
-1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,100,3000,10000,yes,target,always,0,,,,,,
-1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
-1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,100,3000,10000,yes,target,always,0,,,,,,
-1460,ˆÅ‘®«UŒ‚—ƒ}[ƒ^[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1460,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1460,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1460,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
-1460,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
-1461,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒmƒ^ƒEƒƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
-1461,‰Î‘®«UŒ‚—ƒ~ƒmƒ^ƒEƒƒX,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1461,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—ƒ~ƒmƒ^ƒEƒƒX,attack,110,3,250,3000,10000,no,target,always,0,,,,,,
-1461,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,attack,91,3,100,2000,10000,yes,target,always,0,,,,,,
-1462,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1462,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,100,0,10000,no,target,always,0,,,,,,
-1462,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,chase,91,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
-1462,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,chase,91,3,100,2000,10000,yes,target,always,0,,,,,,
-1463,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1463,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,100,0,10000,no,target,always,0,,,,,,
-1464,ƒoƒbƒVƒ…—ƒpƒTƒi,attack,5,10,500,0,5000,yes,target,always,0,,,,,,
-1464,‘½’iUŒ‚—ƒpƒTƒi,attack,171,3,500,0,10000,yes,target,always,0,,,,,,
-1464,–hŒä–³Ž‹UŒ‚—ƒpƒTƒi,attack,170,3,800,0,10000,no,target,always,0,,,,,,
-1465,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1465,•—‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1465,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
-1465,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
-1466,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1466,’n‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1466,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
-1466,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
-1467,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒN,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,150,1000,40000,yes,self,myhpltmaxrate,30,,,,,,
-1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,50,1000,40000,yes,self,always,0,,,,,,
-1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,50,1500,10000,no,target,always,0,,,,,,
-1467,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒCƒhƒŠƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,chase,114,1,50,1000,40000,yes,self,always,0,,,,,,
-1468,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒNƒCƒGƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
-1468,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1468,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
-1468,ˆÅ‘®«UŒ‚—ƒŒƒNƒCƒGƒ€,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1469,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒ[ƒJ[,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1470,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ[ƒƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
-1470,‰Î‘®«UŒ‚—ƒ[ƒƒ€,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
-1471,‰Î‘®«UŒ‚—‹ã”öŒÏ,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
-1471,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1471,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1472,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,1000,1500,30000,no,target,myhpltmaxrate,30,,,,,,
-1472,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
-1472,ƒoƒbƒNƒXƒeƒbƒv—ƒ{ƒ“ƒSƒ“,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
-1473,ƒAƒ“ƒNƒ‹ƒXƒlƒA—ƒI[ƒNƒA[ƒ`ƒƒ[,idle,117,5,50,1500,50000,yes,self,always,0,,,,,,
-1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,1000,1500,10000,yes,target,attackpcge,2,,,,,,
-1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
-1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,100,1500,10000,yes,target,always,0,,,,,,
-1473,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
-1473,’n‘®«UŒ‚—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
-1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,chase,47,5,100,1500,10000,yes,target,always,0,,,,,,
-1474,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒ~ƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1474,‹zŒŒ—ƒ~ƒ~ƒbƒN,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1475,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1475,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1475,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,100,0,10000,no,target,always,0,,,,,,
-1475,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
-1476,”͈ÍUŒ‚—ƒAƒ‰[ƒ€,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
-1477,’n‘®«UŒ‚—ƒAƒNƒ‰ƒEƒX,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1478,‹zŒŒ—ƒ‰ƒCƒhƒ[ƒh,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
-1478,–hŒä–³Ž‹UŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,170,2,100,0,10000,no,target,always,0,,,,,,
-1479,”͈ÍUŒ‚—ƒXƒPƒ‹ƒvƒŠƒYƒi[,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
-1480,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
-1480,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
-1481,•—‘®«UŒ‚—ƒpƒ“ƒN,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
-1481,Ή»UŒ‚—ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
-1482,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒ‹ƒ^ƒX,attack,136,7,250,1500,10000,no,target,always,0,,,,,,
-1482,•K’†UŒ‚—ƒWƒ‹ƒ^ƒX,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1482,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,attack,6,10,50,1000,30000,yes,target,always,0,,,,,,
-1482,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒ‹ƒ^ƒX,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
-1482,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,chase,6,10,100,1000,30000,yes,target,always,0,,,,,,
-1483,“Å‘®«UŒ‚—ƒŠƒrƒI,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
-1483,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
-1483,ƒ\ƒjƒbƒNƒuƒ[—ƒŠƒrƒI,attack,136,5,10,1500,10000,no,target,always,0,,,,,,
-1484,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
-1484,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
-1484,“Å‘®«UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
-1485,ˆÅ‘®«UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
-1485,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1485,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
-1485,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1485,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1486,ˆÅ‘®«UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
-1486,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1486,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
-1486,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
-1486,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,100,0,10000,no,target,always,0,,,,,,
-1486,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1486,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒKƒgƒD[ƒX,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
-1486,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1487,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
-1487,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
-1487,ˆÅ‘®«UŒ‚—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
-1487,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,myhpltmaxrate,30,,,,,,
-1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,longrangeattacked,,,,,,,
-1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,100,3000,5000,no,target,always,0,,,,,,
-1487,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
-1488,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒmƒŠƒAƒ“,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1488,…‘®«UŒ‚—ƒAƒmƒŠƒAƒ“,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
-1489,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒeƒBƒ“ƒO,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
-1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,150,0,10000,yes,target,myhpltmaxrate,30,,,,,,
-1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,50,500,10000,yes,target,always,0,,,,,,
-1489,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
-1489,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,50,1500,10000,no,target,always,0,,,,,,
-1489,’n‘®«UŒ‚—ƒXƒeƒBƒ“ƒO,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
-1489,ƒnƒCƒfƒBƒ“ƒO—ƒXƒeƒBƒ“ƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
-1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,chase,92,5,50,500,10000,yes,target,always,0,,,,,,
-1490,ƒGƒ‚[ƒVƒ‡ƒ“—œfœr‚¤ŽÒ,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
-1490,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
-1490,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
-1490,”͈ÍUŒ‚—œfœr‚¤ŽÒ,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1490,•—‘®«UŒ‚—œfœr‚¤ŽÒ,attack,187,4,100,0,15000,yes,target,always,0,,,,,,
-1491,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒPƒr,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
-1491,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1491,ˆÅ‘®«UŒ‚—ƒhƒPƒr,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
-1491,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1491,ƒƒ}[ƒiƒCƒg—ƒhƒPƒr,attack,42,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
-1491,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
-1491,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
-1492,ƒ‚ƒ“ƒXƒ^[¢Š«—‰…—ì•Žm,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1401,,,,,
-1492,Žæ‚芪‚«¢Š«—‰…—ì•Žm,attack,196,5,1000,3000,10000,no,self,slavele,0,1405,,,,,
-1492,”͈ÍUŒ‚—‰…—ì•Žm,attack,174,1,1000,0,10000,no,target,attackpcge,2,,,,,,
-1492,ˆÃˆÅUŒ‚—‰…—ì•Žm,attack,177,10,100,0,10000,no,target,always,0,,,,,,
-1492,ƒXƒ^ƒ“UŒ‚—‰…—ì•Žm,attack,179,10,100,1500,10000,no,target,always,0,,,,,,
-1492,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—‰…—ì•Žm,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
-1492,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—‰…—ì•Žm,attack,57,5,1000,0,50000,yes,target,attackpcge,2,,,,,,
-1492,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—‰…—ì•Žm,attack,57,5,1000,0,50000,yes,target,always,0,,,,,,
-1492,Žæ‚芪‚«¢Š«—‰…—ì•Žm,chase,196,5,10000,3000,10000,no,self,slavele,2,1405,,,,,
-1499,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒE[ƒ^ƒ“ƒtƒ@ƒCƒ^[,attack,60,6,300,3000,300000,no,self,myhpltmaxrate,30,,,,,,
-1499,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒE[ƒ^ƒ“ƒtƒ@ƒCƒ^[,attack,7,5,1000,1500,10000,no,target,attackpcge,2,,,,,,
-1511,Žæ‚芪‚«¢Š«—ƒAƒ‚ƒ“ƒ‰[,any,196,10,3000,5000,2000,no,around1,slavele,0,1132,1194,,,,
-
-// ** eAthena Developers ** //
-// Valaris
-//MOB_ID, Skill name, STATE, SKILL_ID, SKILL_LV, the rate of 10,000th of a minute, cast time, delay, the disturbance possibility of, Target, when to cast, a condition value, Mob Id, a value 2, a value 3, a value 4, 5/of values, a dummy character sequence: Or that it is good to put in an intelligible
-1900,Summon Worshippers,attack,196,4,500,3000,3600000,no,self,slavele,0,1901,,,,,
-1900,Sonic Blow,attack,136,10,300,0,0,no,target,always,0,,,,,,
-1900,Venom Dust,attack,140,10,400,0,0,no,target,always,0,,,,,,
-1900,Envenom,attack,52,10,500,0,10000,no,target,always,0,,,,,,
-1900,Grimtooth,chase,137,5,2500,0,0,no,target,always,0,,,,,,
-// Valaris's Worshipper
-1901,Envenom,attack,52,10,500,0,10000,no,target,always,0,,,,,,
-
-// Easter Bunny
-1921,Summon Minions,attack,196,5,1000,3000,10000,no,self,slavele,2,1063,,,,,
+//mob_skill_db.txt@AthenaDB plan 2004/04/28 00:45:49 +0900/(JST)/
+//MOB_ID, a dummy character sequence, STATE, SKILL_ID, SKILL_LV, the rate of 10,000th of a minute, casttime, delay, the disturbance possibility of, a target, a condition type, a condition value, a value 1, a value 2, a value 3, a value 4, 5/of values, a dummy character sequence: Or that it is good to put in an intelligible
+//Example
+//1001,Gibberish,attack,52,3,100,1500,10000,no,target,always,0,,,,,
+//
+//STATE: any Even when /idle standby /walk movement /attack attack /// dead death /loot route /chase rush or pursuit. /counterattack (?)//// target: target PC / self himself under attack /friend friend /// One's circumference (it is circumference 81 mass =around4 now) /// One's circumference 9 mass One's circumference 25 mass /// One's circumference 49 mass [ around ] [ around1 ] [ /around2 ] [ around3 ] One's circumference 81 mass//a [ /around4 ]
+Only place specification skill is good for a round system. friend is good only on condition that a friend system. //
+
+//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 number of specification
+// attackpcge Attack PC becomes more than the number of specification.
+// slavelt when the number of slaves is lower than the original number of specification.
+// slavele when the all the slaves are dead.
+// 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
+// casttargeted when a target is in cast range.
+//
+// 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
+//
+
+//ID,ƒXƒLƒ‹—–¼‘O,ó‘Ô,ƒXƒLƒ‹,ƒŒƒxƒ‹,Šm—¦(–œ•ª—¦),‰r¥(ms),ƒfƒBƒŒƒC(ms),‰r¥–WŠQ,ƒ^[ƒQƒbƒg,ðŒƒ^ƒCƒv1,ðŒ’l1,,,,,,,,,Žg—pŽžƒGƒ‚[ƒVƒ‡ƒ“
+1001,ƒCƒ“ƒxƒiƒ€—ƒXƒR[ƒsƒIƒ“,attack,52,3,100,1500,10000,no,target,always,0,,,,,,
+1001,‰Î‘®«UŒ‚—ƒXƒR[ƒsƒIƒ“,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1002,’§”­—ƒ|ƒŠƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1002,…‘®«UŒ‚—ƒ|ƒŠƒ“,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1002,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1004,•—‘®«UŒ‚—ƒz[ƒlƒbƒg,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1004,–hŒä–³Ž‹UŒ‚—ƒz[ƒlƒbƒg,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1005,ˆÅ‘®«UŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
+1005,ˆÃˆÅUŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,177,3,100,0,10000,no,target,always,0,,,,,,
+1007,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒtƒ@ƒuƒ‹,idle,193,1,1,1000,0,yes,self,always,0,1008,,,,,
+1007,’n‘®«UŒ‚—ƒtƒ@ƒuƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1008,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒp,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1008,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒvƒp,idle,193,1,1,1000,0,yes,self,always,0,1018,,,,,
+1009,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ“ƒhƒ‹,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1009,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ“ƒhƒ‹,attack,111,1,50,1500,30000,yes,self,always,0,,,,,,
+1009,•—‘®«UŒ‚—ƒRƒ“ƒhƒ‹,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1009,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ“ƒhƒ‹,chase,111,1,50,1500,30000,yes,self,always,0,,,,,,
+1010,’n‘®«UŒ‚—ƒEƒBƒ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1010,ƒiƒp[ƒ€ƒr[ƒg—ƒEƒBƒ[,chase,11,10,1000,1000,10000,yes,target,casttargeted,,,,,,,
+1010,ƒiƒp[ƒ€ƒr[ƒg—ƒEƒBƒ[,chase,11,10,100,1000,10000,yes,target,always,0,,,,,,
+1011,’§”­—ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1011,•—‘®«UŒ‚—ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1012,…‘®«UŒ‚—ƒƒbƒ_ƒtƒƒbƒO,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1013,’n‘®«UŒ‚—ƒEƒ‹ƒt,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1014,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1014,…‘®«UŒ‚—ƒXƒ|ƒA,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1014,‡–°UŒ‚—ƒXƒ|ƒA,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1015,“ÅUŒ‚—ƒ]ƒ“ƒr,attack,176,1,100,1000,10000,no,target,always,0,,,,,,
+1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1016,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1018,ƒeƒŒƒ|[ƒg—ƒNƒŠ[ƒ~[,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
+1018,•—‘®«UŒ‚—ƒNƒŠ[ƒ~[,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1018,‡–°UŒ‚—ƒNƒŠ[ƒ~[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1019,’§”­—ƒyƒRƒyƒR,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1019,ƒGƒ‚[ƒVƒ‡ƒ“—ƒyƒRƒyƒR,idle,197,1,5,0,10000,yes,self,always,0,19,,,,,
+1019,ƒ\ƒjƒbƒNƒuƒ[—ƒyƒRƒyƒR,attack,136,1,10,1500,10000,no,target,always,0,,,,,,
+1019,‰Î‘®«UŒ‚—ƒyƒRƒyƒR,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1020,’n‘®«UŒ‚—ƒ}ƒ“ƒhƒ‰ƒSƒ‰,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
+1023,‹i‰Œ—ƒI[ƒNƒEƒHƒŠƒA[,idle,195,1,10,0,0,yes,self,always,0,,,,,,9
+1023,’n‘®«UŒ‚—ƒI[ƒNƒEƒHƒŠƒA[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1023,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒEƒHƒŠƒA[,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1024,’n‘®«UŒ‚—ƒ[ƒ€ƒe[ƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1025,’n‘®«UŒ‚—ƒXƒlƒCƒN,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1025,“ÅUŒ‚—ƒXƒlƒCƒN,attack,176,3,100,1000,10000,no,target,always,0,,,,,,
+1026,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ€ƒiƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1026,ƒXƒ^ƒ“UŒ‚—ƒ€ƒiƒbƒN,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1026,ƒXƒ^ƒ“UŒ‚—ƒ€ƒiƒbƒN,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1028,‘½’iUŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,171,1,100,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1028,‘½’iUŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1028,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒ‹ƒWƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1029,ˆÅ‘®«UŒ‚—ƒCƒVƒX,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1029,‘¬“x‘‰Á—ƒCƒVƒX,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
+1030,ƒCƒ“ƒxƒiƒ€—ƒAƒiƒRƒ“ƒ_ƒN,attack,52,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1030,ƒCƒ“ƒxƒiƒ€—ƒAƒiƒRƒ“ƒ_ƒN,attack,52,3,100,1500,10000,no,target,always,0,,,,,,
+1030,“Å‘®«UŒ‚—ƒAƒiƒRƒ“ƒ_ƒN,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1031,“Å‘®«UŒ‚—ƒ|ƒ|ƒŠƒ“,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1031,“ÅUŒ‚—ƒ|ƒ|ƒŠƒ“,attack,176,3,100,1000,10000,no,target,always,0,,,,,,
+1031,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒ|ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1032,‹zŒŒ—ƒxƒŠƒbƒg,attack,199,1,100,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1032,“ÅUŒ‚—ƒxƒŠƒbƒg,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1032,ƒGƒ‚[ƒVƒ‡ƒ“—ƒxƒŠƒbƒg,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1033,‰Î‘®«UŒ‚—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,186,1,200,0,7500,yes,target,always,0,,,,,,
+1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,19,1,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,attack,19,1,100,2000,10000,yes,target,always,0,,,,,,
+1033,ƒiƒp[ƒ€ƒr[ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,11,10,1000,500,10000,yes,target,casttargeted,,,,,,,
+1033,ƒiƒp[ƒ€ƒr[ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,11,10,100,500,10000,yes,target,always,0,,,,,,
+1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,19,3,100,2000,10000,yes,target,longrangeattacked,,,,,,,
+1033,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[ƒEƒBƒ[,chase,19,3,100,2000,10000,yes,target,always,0,,,,,,
+1034,…‘®«UŒ‚—ƒ^ƒ‰ƒtƒƒbƒO,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
+1035,’§”­—ƒnƒ“ƒ^[ƒtƒ‰ƒC,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1035,•—‘®«UŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
+1035,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1035,‘½’iUŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1035,‹zŒŒ—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1035,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
+1035,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1036,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1036,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1037,“Å‘®«UŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
+1037,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
+1037,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
+1037,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1037,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,50,1000,10000,no,target,always,0,,,,,,
+1038,ƒeƒŒƒ|[ƒg—ƒIƒVƒŠƒX,idle,26,1,1000,0,100000,yes,self,closedattacked,,,,,,,
+1038,ƒeƒŒƒ|[ƒg—ƒIƒVƒŠƒX,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1038,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒIƒVƒŠƒX,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1297,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,500,1500,2000,no,target,longrangeattacked,,,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,200,1500,2000,no,target,skillused,18,,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,attack,90,5,500,1500,2000,no,target,always,0,,,,,,
+1038,ƒNƒ@ƒOƒ}ƒCƒA—ƒIƒVƒŠƒX,attack,92,5,400,0,0,yes,target,always,0,,,,,,
+1038,ƒXƒg[ƒ“ƒJ[ƒX—ƒIƒVƒŠƒX,attack,16,8,500,1500,3000,no,target,attackpcge,2,,,,,,
+1038,“Å‘®«UŒ‚—ƒIƒVƒŠƒX,attack,188,5,200,0,5000,yes,target,always,0,,,,,,
+1038,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒIƒVƒŠƒX,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
+1038,Žæ‚芪‚«¢Š«—ƒIƒVƒŠƒX,attack,196,5,1000,3000,3600000,no,self,slavele,2,1297,,,,,
+1038,ƒoƒbƒVƒ…—ƒIƒVƒŠƒX,attack,5,10,300,0,5000,yes,target,always,0,,,,,,
+1038,ƒxƒiƒ€ƒ_ƒXƒg—ƒIƒVƒŠƒX,attack,140,8,400,0,0,yes,target,always,0,,,,,,
+1038,–hŒä–³Ž‹UŒ‚—ƒIƒVƒŠƒX,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,300,1500,2000,no,target,longrangeattacked,,,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,200,1500,2000,no,target,skillused,18,,,,,,
+1038,ƒA[ƒXƒXƒpƒCƒN—ƒIƒVƒŠƒX,chase,90,5,300,1500,2000,no,target,always,0,,,,,,
+1038,ƒNƒ@ƒOƒ}ƒCƒA—ƒIƒVƒŠƒX,chase,92,5,200,0,0,yes,target,always,0,,,,,,
+1038,‘¬“x‘‰Á—ƒIƒVƒŠƒX,chase,29,1,500,3000,120000,yes,self,myhpltmaxrate,50,,,,,,
+1038,Žæ‚芪‚«¢Š«—ƒIƒVƒŠƒX,chase,196,5,10000,3000,3600000,no,self,slavele,2,1029,,,,,
+1038,•K’†UŒ‚—ƒIƒVƒŠƒX,chase,172,1,200,0,5000,yes,target,always,0,,,,,,
+1038,ƒxƒiƒ€ƒ_ƒXƒg—ƒIƒVƒŠƒX,chase,140,8,200,0,0,yes,target,always,0,,,,,,
+1038,Žô‚¢UŒ‚—ƒIƒVƒŠƒX,chase,181,1,100,0,10000,yes,target,always,0,,,,,,
+1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,1000,0,3600000,yes,self,closedattacked,,,,,,,
+1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1039,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,walk,26,1,1000,0,3600000,yes,self,closedattacked,,,,,,,
+1039,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒoƒtƒHƒƒbƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1101,,,,,
+1039,•—‘®«UŒ‚—ƒoƒtƒHƒƒbƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
+1039,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒoƒtƒHƒƒbƒg,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1039,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1101,,,,,
+1039,•K’†UŒ‚—ƒoƒtƒHƒƒbƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1039,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒoƒtƒHƒƒbƒg,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
+1039,–hŒä–³Ž‹UŒ‚—ƒoƒtƒHƒƒbƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1039,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒoƒtƒHƒƒbƒg,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,800,1500,4000,no,target,skillused,18,,,,,,
+1039,Žô‚¢UŒ‚—ƒoƒtƒHƒƒbƒg,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
+1039,‘¬“x‘‰Á—ƒoƒtƒHƒƒbƒg,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1039,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1101,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
+1039,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,800,1500,4000,no,target,skillused,18,,,,,,
+1040,ƒGƒ‚[ƒVƒ‡ƒ“—ƒS[ƒŒƒ€,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1040,ƒXƒ^ƒ“UŒ‚—ƒS[ƒŒƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1040,ƒXƒ^ƒ“UŒ‚—ƒS[ƒŒƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1041,‘½’iUŒ‚—ƒ}ƒ~[,attack,171,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1041,‘½’iUŒ‚—ƒ}ƒ~[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1042,’§”­—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1042,ƒq[ƒ‹—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
+1042,’¾–ÙUŒ‚—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,178,5,100,0,10000,no,target,always,0,,,,,,
+1042,•—‘®«UŒ‚—ƒXƒ`[ƒ‹ƒ`ƒ‡ƒ“ƒ`ƒ‡ƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1044,…‘®«UŒ‚—ƒIƒ{ƒ“ƒk,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1044,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒ{ƒ“ƒk,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1044,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒIƒ{ƒ“ƒk,chase,76,5,100,3500,10000,yes,target,always,0,,,,,,
+1045,…‘®«UŒ‚—ƒ}ƒ‹ƒN,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1046,ƒeƒŒƒ|[ƒg—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,idle,26,1,10,0,100000,yes,self,always,0,,,,,,
+1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1046,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1061,,,,,
+1046,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,61,5,200,0,0,yes,self,always,0,,,,,,
+1046,ˆÅ‘®«UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
+1046,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1046,Žæ‚芪‚«¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,196,5,1000,3000,3600000,no,self,slavele,0,1061,,,,,
+1046,ƒsƒA[ƒX—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,56,8,100,0,10000,yes,target,always,0,,,,,,
+1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1046,ƒq[ƒ‹—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
+1046,•K’†UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,15,10,500,1500,10000,no,target,always,0,,,,,,
+1046,–hŒä–³Ž‹UŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1046,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1046,ˆÃˆÅUŒ‚—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,attack,177,1,100,0,10000,yes,target,always,0,,,,,,
+1046,ƒCƒ“ƒfƒ…ƒA—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,8,7,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1046,ƒCƒ“ƒfƒ…ƒA—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1046,‘¬“x‘‰Á—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1046,Žæ‚芪‚«¢Š«—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1061,,,,,
+1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,15,10,1000,1500,10000,no,target,longrangeattacked,,,,,,,
+1046,ƒtƒƒXƒgƒ_ƒCƒo[—ƒhƒbƒyƒ‹ƒQƒ“ƒK[,chase,15,10,500,1500,10000,no,target,always,0,,,,,,
+1047,ƒGƒ‚[ƒVƒ‡ƒ“—ƒyƒRƒyƒR‚Ì—‘,idle,197,1,500,0,10000,yes,self,always,0,19,,,,,
+1047,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—ƒyƒRƒyƒR‚Ì—‘,idle,193,1,1,1000,0,yes,self,always,0,1049,1050,,,,
+1048,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—“峂̗‘,idle,193,1,1,1000,0,yes,self,always,0,1051,,,,,
+1049,ƒGƒ‚[ƒVƒ‡ƒ“—ƒsƒbƒL,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1049,‰Î‘®«UŒ‚—ƒsƒbƒL,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1050,ƒGƒ‚[ƒVƒ‡ƒ“—‚·‚²‚¢ƒsƒbƒL,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1050,‰Î‘®«UŒ‚—‚·‚²‚¢ƒsƒbƒL,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1052,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒbƒJ[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1052,’n‘®«UŒ‚—ƒƒbƒJ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1053,ˆÅ‘®«UŒ‚—Ž““å³,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
+1054,ˆÅ‘®«UŒ‚——Y“å³,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
+1055,”͈ÍUŒ‚—ƒ€ƒJ[,attack,174,1,1000,0,0,yes,target,attackpcge,2,,,,,,
+1055,’n‘®«UŒ‚—ƒ€ƒJ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1055,–hŒä–³Ž‹UŒ‚—ƒ€ƒJ[,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1055,…‘®«•Ï‰»—ƒ€ƒJ[,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1055,…‘®«•Ï‰»—ƒ€ƒJ[,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1056,’n‘®«UŒ‚—ƒXƒ‚[ƒL[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1056,ƒnƒCƒfƒBƒ“ƒO—ƒXƒ‚[ƒL[,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1056,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ‚[ƒL[,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
+1056,ƒnƒCƒfƒBƒ“ƒO—ƒXƒ‚[ƒL[,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1057,ƒq[ƒ‹—ƒˆ[ƒˆ[,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
+1057,’n‘®«UŒ‚—ƒˆ[ƒˆ[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1057,ƒGƒ‚[ƒVƒ‡ƒ“—ƒˆ[ƒˆ[,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1057,ΓŠ‚°—ƒˆ[ƒˆ[,chase,152,1,300,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1057,ΓŠ‚°—ƒˆ[ƒˆ[,chase,152,1,100,1000,10000,yes,target,always,0,,,,,,
+1058,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒ^ƒ‹ƒ‰,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1058,‰Î‘®«UŒ‚—ƒƒ^ƒ‹ƒ‰,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1058,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒƒ^ƒ‹ƒ‰,attack,76,5,100,0,10000,yes,target,always,0,,,,,,
+1059,ƒeƒŒƒ|[ƒg—ƒ~ƒXƒgƒŒƒX,idle,26,1,10,0,100000,yes,self,closedattacked,,,,,,,
+1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,idle,28,10,1000,0,3000,yes,friend,friendhpltmaxrate,80,,,,,,
+1059,ƒeƒŒƒ|[ƒg—ƒ~ƒXƒgƒŒƒX,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1059,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ~ƒXƒgƒŒƒX,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1303,,,,,
+1059,•—‘®«UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
+1059,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ~ƒXƒgƒŒƒX,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1059,Žæ‚芪‚«¢Š«—ƒ~ƒXƒgƒŒƒX,attack,196,4,1000,3000,3600000,no,self,slavele,0,1303,,,,,
+1059,ƒjƒ…[ƒ}—ƒ~ƒXƒgƒŒƒX,attack,25,1,1000,0,5000,yes,self,longrangeattacked,,,,,,,
+1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,attack,28,10,1000,0,3000,yes,friend,friendhpltmaxrate,80,,,,,,
+1059,ƒq[ƒ‹—ƒ~ƒXƒgƒŒƒX,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
+1059,•K’†UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1059,–hŒä–³Ž‹UŒ‚—ƒ~ƒXƒgƒŒƒX,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,500,1500,3000,no,target,attackpcge,2,,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,attack,84,8,800,1500,3000,no,target,skillused,18,,,,,,
+1059,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ~ƒXƒgƒŒƒX,attack,76,8,500,1500,5000,no,target,always,0,,,,,,
+1059,‘½’iUŒ‚—ƒ~ƒXƒgƒŒƒX,attack,171,3,100,0,10000,yes,target,always,0,,,,,,
+1059,‘¬“x‘‰Á—ƒ~ƒXƒgƒŒƒX,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1059,Žæ‚芪‚«¢Š«—ƒ~ƒXƒgƒŒƒX,chase,196,4,10000,3000,3600000,no,self,slavele,2,1156,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,300,1500,0,no,target,attackpcge,2,,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,300,1500,0,no,target,longrangeattacked,,,,,,,
+1059,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒXƒgƒŒƒX,chase,84,8,800,1500,0,no,target,skillused,18,,,,,,
+1059,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ~ƒXƒgƒŒƒX,chase,76,8,300,1500,5000,no,target,always,0,,,,,,
+1060,ƒXƒ^ƒ“UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,179,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1060,ƒXƒ^ƒ“UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,179,4,100,1000,10000,no,target,always,0,,,,,,
+1060,’n‘®«UŒ‚—ƒrƒbƒNƒtƒbƒg,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1060,ƒCƒ“ƒfƒ…ƒA—ƒrƒbƒNƒtƒbƒg,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1060,ƒCƒ“ƒfƒ…ƒA—ƒrƒbƒNƒtƒbƒg,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1060,ƒGƒ‚[ƒVƒ‡ƒ“—ƒrƒbƒNƒtƒbƒg,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1061,¸_”j‰ó—ƒiƒCƒgƒƒA,attack,159,2,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1061,¸_”j‰ó—ƒiƒCƒgƒƒA,attack,159,2,50,0,10000,no,target,always,0,,,,,,
+1061,”O‘®«UŒ‚—ƒiƒCƒgƒƒA,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
+1061,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1061,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,50,0,10000,no,target,always,0,,,,,,
+1061,‘¬“x‘‰Á—ƒiƒCƒgƒƒA,chase,29,1,50,1000,120000,yes,self,always,0,,,,,,
+1062,¹‘®«UŒ‚—ƒTƒ“ƒ^ƒ|ƒŠƒ“,attack,189,1,100,0,15000,yes,target,always,0,,,,,,
+1063,’§”­—ƒ‹ƒiƒeƒBƒbƒN,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1063,ƒq[ƒ‹—ƒ‹ƒiƒeƒBƒbƒN,idle,28,1,10,2000,60000,yes,self,always,0,,,,,,
+1064,ˆÅ‘®«•Ï‰»—ƒƒKƒƒhƒ“,attack,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1064,ˆÅ‘®«•Ï‰»—ƒƒKƒƒhƒ“,chase,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1065,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒgƒ‰ƒEƒt,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,attack,86,3,50,5000,10000,yes,target,always,0,,,,,,
+1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,attack,92,2,50,0,10000,yes,target,always,0,,,,,,
+1065,…‘®«UŒ‚—ƒXƒgƒ‰ƒEƒt,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,attack,15,5,50,3000,5000,yes,target,always,0,,,,,,
+1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,attack,20,4,50,4000,10000,yes,target,always,0,,,,,,
+1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,chase,86,3,50,5000,10000,yes,target,longrangeattacked,,,,,,,
+1065,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒXƒgƒ‰ƒEƒt,chase,86,3,50,5000,10000,yes,target,always,0,,,,,,
+1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,chase,92,5,50,0,10000,yes,target,longrangeattacked,,,,,,,
+1065,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒgƒ‰ƒEƒt,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
+1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,chase,15,5,50,3000,5000,yes,target,longrangeattacked,,,,,,,
+1065,ƒtƒƒXƒgƒ_ƒCƒo[—ƒXƒgƒ‰ƒEƒt,chase,15,5,50,3000,5000,yes,target,always,0,,,,,,
+1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,chase,20,4,50,4000,10000,yes,target,longrangeattacked,,,,,,,
+1065,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒgƒ‰ƒEƒt,chase,20,4,50,4000,10000,yes,target,always,0,,,,,,
+1066,…‘®«UŒ‚—ƒoƒhƒ“,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1067,ƒL[ƒsƒ“ƒO—ƒJƒiƒgƒEƒX,attack,201,1,200,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1067,…‘®«UŒ‚—ƒJƒiƒgƒEƒX,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,86,1,200,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,86,2,100,2000,10000,yes,target,always,0,,,,,,
+1069,…‘®«UŒ‚—ƒ\[ƒhƒtƒBƒbƒVƒ…,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,chase,86,1,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1069,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ\[ƒhƒtƒBƒbƒVƒ…,chase,86,1,100,2000,10000,yes,target,always,0,,,,,,
+1070,…‘®«UŒ‚—ƒNƒNƒŒ,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1070,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒNƒŒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
+1071,ƒoƒbƒVƒ…—ƒpƒCƒŒ[ƒcƒXƒPƒ‹,attack,5,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1071,ƒoƒbƒVƒ…—ƒpƒCƒŒ[ƒcƒXƒPƒ‹,attack,5,3,100,1500,10000,no,target,always,0,,,,,,
+1072,‰Î‘®«UŒ‚—ƒJƒz,attack,186,1,200,0,7500,yes,target,always,0,,,,,,
+1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,attack,19,1,500,1000,0,yes,target,always,0,,,,,,
+1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,chase,19,1,300,1000,0,yes,target,longrangeattacked,,,,,,,
+1072,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒJƒz,chase,19,1,300,1000,0,yes,target,always,0,,,,,,
+1074,…‘®«UŒ‚—‚¨‰»‚¯ŠL,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1076,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒgƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1077,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1077,“Å‘®«UŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1077,“ÅUŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1086,ƒeƒŒƒ|[ƒg—‰©‹àå³,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1086,ƒ‚ƒ“ƒXƒ^[¢Š«—‰©‹àå³,attack,209,8,1000,3000,3600000,no,self,myhpltmaxrate,5,1054,,,,,
+1086,‰Î‘®«UŒ‚—‰©‹àå³,attack,186,5,200,0,5000,yes,target,always,0,,,,,,
+1086,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—‰©‹àå³,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1086,Žæ‚芪‚«¢Š«—‰©‹àå³,attack,196,8,1000,3000,10000,no,self,slavele,0,1054,,,,,
+1086,ƒnƒCƒfƒBƒ“ƒO—‰©‹àå³,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
+1086,ƒnƒCƒfƒBƒ“ƒO—‰©‹àå³,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
+1086,•K’†UŒ‚—‰©‹àå³,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1086,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—‰©‹àå³,attack,18,7,500,0,2000,yes,target,always,0,,,,,,
+1086,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—‰©‹àå³,attack,19,10,100,0,5000,no,target,longrangeattacked,,,,,,,
+1086,–hŒä–³Ž‹UŒ‚—‰©‹àå³,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1086,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—‰©‹àå³,attack,7,7,500,0,3000,yes,target,attackpcge,2,,,,,,
+1086,ƒƒ}[ƒiƒCƒg—‰©‹àå³,attack,42,10,100,1500,10000,no,target,attackpcge,2,,,,,,
+1086,‘¬“x‘‰Á—‰©‹àå³,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1086,Žæ‚芪‚«¢Š«—‰©‹àå³,chase,196,8,10000,3000,3600000,no,self,slavele,2,1054,,,,,
+1086,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—‰©‹àå³,chase,18,7,500,0,0,yes,target,always,0,,,,,,
+1086,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—‰©‹àå³,chase,19,10,100,0,5000,no,target,longrangeattacked,,,,,,,
+1086,ƒq[ƒ‹—‰©‹àå³,attack,28,10,700,0,0,yes,self,myhpltmaxrate,30,,,,,,
+1086,ƒq[ƒ‹—‰©‹àå³,attack,28,10,700,0,0,yes,friend,friendhpltmaxrate,80,,,,,,
+1087,ƒeƒŒƒ|[ƒg—ƒI[ƒNƒq[ƒ[,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1087,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒI[ƒNƒq[ƒ[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1213,,,,,
+1087,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒI[ƒNƒq[ƒ[,attack,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,800,1500,3000,no,target,skillused,18,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,attack,21,10,500,1500,3000,no,target,always,0,,,,,,
+1087,’n‘®«UŒ‚—ƒI[ƒNƒq[ƒ[,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
+1087,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒI[ƒNƒq[ƒ[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1087,Žæ‚芪‚«¢Š«—ƒI[ƒNƒq[ƒ[,attack,196,5,1000,3000,3600000,no,self,slavele,0,1213,,,,,
+1087,•K’†UŒ‚—ƒI[ƒNƒq[ƒ[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1087,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒq[ƒ[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1087,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒNƒq[ƒ[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1087,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒI[ƒNƒq[ƒ[,chase,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
+1087,ƒCƒ“ƒfƒ…ƒA—ƒI[ƒNƒq[ƒ[,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,500,1500,0,no,target,longrangeattacked,,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,800,1500,3000,no,target,skillused,18,,,,,,
+1087,ƒTƒ“ƒ_[ƒXƒg[ƒ€—ƒI[ƒNƒq[ƒ[,chase,21,10,500,1500,0,no,target,always,0,,,,,,
+1087,‘¬“x‘‰Á—ƒI[ƒNƒq[ƒ[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1087,Žæ‚芪‚«¢Š«—ƒI[ƒNƒq[ƒ[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1213,,,,,
+1088,’n‘®«UŒ‚—ƒ{[ƒJƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1088,Žæ‚芪‚«¢Š«—ƒ{[ƒJƒ‹,attack,196,10,1000,3000,10000,no,self,slavele,2,1052,,,,,
+1088,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ{[ƒJƒ‹,attack,76,5,100,0,10000,yes,target,always,0,,,,,,
+1088,‘½’iUŒ‚—ƒ{[ƒJƒ‹,attack,171,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1088,‘½’iUŒ‚—ƒ{[ƒJƒ‹,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1089,…‘®«UŒ‚—ƒg[ƒh,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1089,Žæ‚芪‚«¢Š«—ƒg[ƒh,attack,196,6,1000,3000,10000,no,self,slavele,2,1012,,,,,
+1090,…‘®«UŒ‚—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1090,Žæ‚芪‚«¢Š«—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,196,5,1000,3000,300000,no,self,slavele,2,1002,,,,,
+1090,Žæ‚芪‚«¢Š«—ƒ}ƒXƒ^[ƒŠƒ“ƒO,attack,196,5,600,0,300000,no,self,slavele,2,1113,,,,,
+1091,•—‘®«UŒ‚—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1091,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,196,5,1000,3000,10000,no,self,slavele,2,1011,,,,,
+1091,’¾–ÙUŒ‚—ƒhƒ‰ƒSƒ“ƒtƒ‰ƒC,attack,178,5,100,0,10000,no,target,always,0,,,,,,
+1092,’n‘®«UŒ‚—‚³‚·‚ç‚¢˜T,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1092,Žæ‚芪‚«¢Š«—‚³‚·‚ç‚¢˜T,attack,196,4,1000,3000,10000,no,self,slavele,2,1013,,,,,
+1092,‘½’iUŒ‚—‚³‚·‚ç‚¢˜T,attack,171,1,500,0,0,no,target,always,0,,,,,,
+1092,ƒGƒ‚[ƒVƒ‡ƒ“—‚³‚·‚ç‚¢˜T,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
+1093,Žæ‚芪‚«¢Š«—ƒGƒNƒŠƒvƒX,attack,196,5,1000,3000,10000,no,self,slavele,2,1063,,,,,
+1094,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ“ƒo[ƒiƒCƒg,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
+1094,…‘®«UŒ‚—ƒAƒ“ƒo[ƒiƒCƒg,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1094,’n‘®«•Ï‰»—ƒAƒ“ƒo[ƒiƒCƒg,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1094,’n‘®«•Ï‰»—ƒAƒ“ƒo[ƒiƒCƒg,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1095,’n‘®«UŒ‚—ƒAƒ“ƒhƒŒ,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1095,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ“ƒhƒŒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
+1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,idle,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
+1096,ƒGƒ‚[ƒVƒ‡ƒ“—ƒGƒ“ƒWƒFƒŠƒ“ƒO,walk,197,1,100,0,10000,yes,self,always,0,22,,,,,
+1096,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,1000,3000,5000,no,self,myhpltmaxrate,30,,,,,,
+1096,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,120,3000,5000,no,self,always,0,,,,,,
+1096,¹‘®«UŒ‚—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
+1096,Žæ‚芪‚«¢Š«—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,4,1000,3000,3600000,no,self,slavele,2,1031,,,,,
+1096,Žæ‚芪‚«¢Š«—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,3,300,3000,10000,no,self,slavele,0,1062,,,,,
+1096,ƒoƒbƒVƒ…—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,5,10,250,1100,10000,no,target,always,0,,,,,,
+1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
+1096,ƒq[ƒ‹—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,0,3000,yes,self,friendstatusoff,30,,,,,,
+1096,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,156,1,200,0,5000,yes,target,always,0,,,,,,
+1096,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,156,1,200,0,5000,yes,target,always,0,,,,,,
+1097,ƒGƒ‚[ƒVƒ‡ƒ“—‹a‚Ì—‘,idle,197,1,500,0,10000,yes,self,always,0,19,,,,,
+1097,ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX—‹a‚Ì—‘,idle,193,1,1,2000,0,yes,self,always,0,1095,1105,,,,
+1099,ƒCƒ“ƒxƒiƒ€—ƒAƒ‹ƒMƒIƒy,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
+1099,“Å‘®«UŒ‚—ƒAƒ‹ƒMƒIƒy,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
+1099,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,attack,140,5,100,2000,20000,no,target,always,0,,,,,,
+1099,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,chase,140,5,100,2000,20000,no,target,always,0,,,,,,
+1100,“Å‘®«UŒ‚—ƒAƒ‹ƒSƒX,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1100,“ÅUŒ‚—ƒAƒ‹ƒSƒX,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1101,öŠo—ƒoƒtƒHƒƒbƒgJr.,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
+1101,ˆÅ‘®«UŒ‚—ƒoƒtƒHƒƒbƒgJr.,attack,190,3,100,0,15000,yes,target,always,0,,,,,,
+1101,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒoƒtƒHƒƒbƒgJr.,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
+1101,öŠo—ƒoƒtƒHƒƒbƒgJr.,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
+1102,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒo[ƒXƒŠ[,attack,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1102,’¾–ÙUŒ‚—ƒo[ƒXƒŠ[,attack,178,5,200,0,10000,no,target,always,0,,,,,,
+1102,ˆÅ‘®«UŒ‚—ƒo[ƒXƒŠ[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1102,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒo[ƒXƒŠ[,chase,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1102,ƒGƒ‚[ƒVƒ‡ƒ“—ƒo[ƒXƒŠ[,chase,197,1,15,0,10000,yes,self,always,0,30,,,,,
+1103,ƒGƒ‚[ƒVƒ‡ƒ“—ƒLƒƒƒ‰ƒƒ‹,attack,197,1,15,0,10000,yes,self,always,0,16,,,,,
+1103,’n‘®«UŒ‚—ƒLƒƒƒ‰ƒƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1103,–hŒä–³Ž‹UŒ‚—ƒLƒƒƒ‰ƒƒ‹,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1104,’n‘®«UŒ‚—ƒR[ƒR[,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1104,ΓŠ‚°—ƒR[ƒR[,chase,152,1,300,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1104,ΓŠ‚°—ƒR[ƒR[,chase,152,1,100,1000,10000,yes,target,always,0,,,,,,
+1105,’n‘®«UŒ‚—ƒfƒj[ƒ,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1105,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒj[ƒ,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
+1106,»‚Ü‚«—ƒfƒU[ƒgƒEƒ‹ƒt,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1106,‰Î‘®«UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1106,–hŒä–³Ž‹UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1106,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒU[ƒgƒEƒ‹ƒt,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1107,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ŽqƒfƒU[ƒgƒEƒ‹ƒt,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1107,‰Î‘®«UŒ‚—ŽqƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1107,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ŽqƒfƒU[ƒgƒEƒ‹ƒt,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,attack,86,4,300,5000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,attack,86,4,100,5000,10000,yes,target,always,0,,,,,,
+1108,…‘®«UŒ‚—ƒfƒrƒAƒX,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,chase,86,4,300,5000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1108,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒfƒrƒAƒX,chase,86,4,100,5000,10000,yes,target,always,0,,,,,,
+1109,’§”­—ƒfƒrƒ‹ƒ`,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1109,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,attack,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1109,ˆÅ‘®«UŒ‚—ƒfƒrƒ‹ƒ`,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,50,4000,10000,yes,target,always,0,,,,,,
+1109,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,chase,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1109,‰“‹——£UŒ‚—ƒfƒrƒ‹ƒ`,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
+1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,longrangeattacked,,,,,,,
+1109,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,always,0,,,,,,
+1110,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒPƒr,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1110,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1110,ˆÅ‘®«UŒ‚—ƒhƒPƒr,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1110,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1110,ƒƒ}[ƒiƒCƒg—ƒhƒPƒr,attack,42,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
+1110,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1110,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1111,‹zŒŒ—ƒhƒŒƒCƒ“ƒŠƒA[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1111,ˆÅ‘®«UŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,190,1,200,0,7500,yes,target,always,0,,,,,,
+1111,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1111,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1112,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒŒƒCƒN,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1291,,,,,
+1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,attack,86,10,300,1500,3000,no,target,attackpcge,2,,,,,,
+1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,attack,86,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1112,…‘®«UŒ‚—ƒhƒŒƒCƒN,attack,184,5,200,0,5000,yes,target,always,0,,,,,,
+1112,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒŒƒCƒN,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1112,Žæ‚芪‚«¢Š«—ƒhƒŒƒCƒN,attack,196,5,1000,3000,3600000,no,self,slavele,0,1291,,,,,
+1112,•K’†UŒ‚—ƒhƒŒƒCƒN,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1112,–hŒä–³Ž‹UŒ‚—ƒhƒŒƒCƒN,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1112,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒhƒŒƒCƒN,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1112,…‘®«•Ï‰»—ƒhƒŒƒCƒN,attack,162,1,1000,0,300000,yes,self,myhpltmaxrate,50,,,,,,
+1112,ƒCƒ“ƒfƒ…ƒA—ƒhƒŒƒCƒN,chase,8,8,1000,0,20000,yes,self,longrangeattacked,,,,,,,
+1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,chase,86,10,300,1500,0,no,target,attackpcge,2,,,,,,
+1112,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒhƒŒƒCƒN,chase,86,10,500,1500,0,no,target,longrangeattacked,,,,,,,
+1112,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒhƒŒƒCƒN,chase,59,4,100,0,10000,yes,target,always,0,,,,,,
+1112,‘¬“xŒ¸­—ƒhƒŒƒCƒN,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
+1112,Žæ‚芪‚«¢Š«—ƒhƒŒƒCƒN,chase,196,5,10000,3000,3600000,no,self,slavele,2,1192,,,,,
+1112,…‘®«•Ï‰»—ƒhƒŒƒCƒN,chase,162,1,1000,0,300000,yes,self,myhpltmaxrate,50,,,,,,
+1113,’§”­—ƒhƒƒbƒvƒX,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1113,‰Î‘®«UŒ‚—ƒhƒƒbƒvƒX,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1113,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒƒbƒvƒX,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1114,•—‘®«UŒ‚—ƒ_ƒXƒeƒBƒlƒX,attack,187,1,200,0,7500,yes,target,always,0,,,,,,
+1114,‡–°UŒ‚—ƒ_ƒXƒeƒBƒlƒX,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1115,ƒeƒŒƒ|[ƒg—ƒGƒhƒK,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1115,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒGƒhƒK,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1306,,,,,
+1115,ƒXƒsƒAƒXƒ^ƒu—ƒGƒhƒK,attack,58,7,100,0,10000,yes,target,always,0,,,,,,
+1115,‰Î‘®«UŒ‚—ƒGƒhƒK,attack,186,5,200,0,5000,yes,target,always,0,,,,,,
+1115,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒGƒhƒK,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1115,Žæ‚芪‚«¢Š«—ƒGƒhƒK,attack,196,5,1000,3000,3600000,no,self,slavele,0,1306,,,,,
+1115,•K’†UŒ‚—ƒGƒhƒK,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,attack,17,10,700,0,0,no,target,attackpcge,2,,,,,,
+1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,attack,17,10,900,0,2000,no,target,longrangeattacked,,,,,,,
+1115,–hŒä–³Ž‹UŒ‚—ƒGƒhƒK,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1115,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒGƒhƒK,attack,7,7,500,0,3000,yes,target,attackpcge,2,,,,,,
+1115,ƒCƒ“ƒfƒ…ƒA—ƒGƒhƒK,chase,8,7,100,0,30000,yes,self,longrangeattacked,,,,,,,
+1115,ƒCƒ“ƒfƒ…ƒA—ƒGƒhƒK,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1115,‘¬“x‘‰Á—ƒGƒhƒK,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1115,Žæ‚芪‚«¢Š«—ƒGƒhƒK,chase,196,5,10000,3000,3600000,no,self,slavele,2,1060,,,,,
+1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,chase,17,10,500,0,0,no,target,attackpcge,2,,,,,,
+1115,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒGƒhƒK,chase,17,10,900,0,2000,no,target,longrangeattacked,,,,,,,
+1116,”O‘®«UŒ‚—ƒGƒMƒ‰,attack,191,5,100,0,15000,yes,target,always,0,,,,,,
+1117,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1117,ˆÃˆÅUŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,177,5,500,0,10000,no,target,always,0,,,,,,
+1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,91,4,100,4000,10000,no,target,always,0,,,,,,
+1117,Ή»UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,180,5,50,0,10000,no,target,always,0,,,,,,
+1117,Žô‚¢UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,181,5,50,0,10000,no,target,always,0,,,,,,
+1117,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,200,1,1000,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,300,4000,10000,no,target,longrangeattacked,,,,,,,
+1117,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,100,4000,10000,no,target,always,0,,,,,,
+1118,‹zŒŒ—ƒtƒ[ƒ‰,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1118,’n‘®«UŒ‚—ƒtƒ[ƒ‰,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1119,ƒGƒ‚[ƒVƒ‡ƒ“—ƒtƒŠƒ‹ƒhƒ‰,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1119,ƒNƒ[ƒLƒ“ƒO—ƒtƒŠƒ‹ƒhƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1119,‰Î‘®«UŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1119,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒtƒŠƒ‹ƒhƒ‰,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1119,‘½’iUŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,171,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1119,‘½’iUŒ‚—ƒtƒŠƒ‹ƒhƒ‰,attack,171,2,100,0,10000,no,target,always,0,,,,,,
+1119,ƒNƒ[ƒLƒ“ƒO—ƒtƒŠƒ‹ƒhƒ‰,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1119,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒtƒŠƒ‹ƒhƒ‰,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1120,ƒeƒŒƒ|[ƒg—ƒS[ƒXƒgƒŠƒ“ƒO,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
+1120,ƒGƒ‚[ƒVƒ‡ƒ“—ƒS[ƒXƒgƒŠƒ“ƒO,walk,197,1,100,0,10000,yes,self,always,0,28,,,,,
+1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,attack,135,1,500,1500,5000,no,self,casttargeted,,,,,,,
+1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,attack,135,1,120,1500,5000,no,self,always,0,,,,,,
+1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,attack,13,10,1000,1000,5000,no,target,always,0,,,,,,
+1120,”O‘®«UŒ‚—ƒS[ƒXƒgƒŠƒ“ƒO,attack,191,5,100,0,15000,yes,target,always,0,,,,,,
+1120,Žæ‚芪‚«¢Š«—ƒS[ƒXƒgƒŠƒ“ƒO,attack,196,5,1000,3000,300000,no,self,slavele,0,1186,,,,,
+1120,ƒeƒŒƒ|[ƒg—ƒS[ƒXƒgƒŠƒ“ƒO,attack,26,1,200,1000,100000,yes,self,myhpltmaxrate,30,,,,,,
+1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,chase,135,1,500,1500,5000,no,self,casttargeted,,,,,,,
+1120,ƒNƒ[ƒLƒ“ƒO—ƒS[ƒXƒgƒŠƒ“ƒO,chase,135,1,120,1500,5000,no,self,always,0,,,,,,
+1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,chase,13,10,1000,1000,5000,no,target,longrangeattacked,,,,,,,
+1120,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒS[ƒXƒgƒŠƒ“ƒO,chase,13,10,1000,1000,5000,no,target,always,0,,,,,,
+1120,‘¬“xŒ¸­—ƒS[ƒXƒgƒŠƒ“ƒO,chase,30,1,50,3000,120000,yes,target,always,0,,,,,,
+1121,ƒTƒ“ƒhƒ}ƒ“—ƒKƒCƒAƒX,idle,119,5,50,1500,30000,yes,self,always,0,,,,,,
+1121,ƒGƒ‚[ƒVƒ‡ƒ“—ƒKƒCƒAƒX,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1121,»‚Ü‚«—ƒKƒCƒAƒX,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1121,»‚Ü‚«—ƒKƒCƒAƒX,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1121,’n‘®«UŒ‚—ƒKƒCƒAƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1122,•—‘®«UŒ‚—ƒSƒuƒŠƒ“’·’j,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1122,‘½’iUŒ‚—ƒSƒuƒŠƒ“’·’j,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1122,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“’·’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1123,‰Î‘®«UŒ‚—ƒSƒuƒŠƒ“ŽŸ’j,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1123,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŽŸ’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1124,“Å‘®«UŒ‚—ƒSƒuƒŠƒ“ŽO’j,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1124,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŽO’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1125,’n‘®«UŒ‚—ƒSƒuƒŠƒ“Žl’j,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1125,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“Žl’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1126,…‘®«UŒ‚—ƒSƒuƒŠƒ“ŒÜ’j,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1126,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ŒÜ’j,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1127,’n‘®«UŒ‚—ƒz[ƒh,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
+1127,ƒnƒCƒfƒBƒ“ƒO—ƒz[ƒh,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1127,ƒnƒCƒfƒBƒ“ƒO—ƒz[ƒh,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1128,’n‘®«UŒ‚—ƒzƒ‹ƒ“,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1128,–hŒä–³Ž‹UŒ‚—ƒzƒ‹ƒ“,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1129,ƒTƒCƒg—ƒzƒƒ“,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1129,öŠo—ƒzƒƒ“,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
+1129,ƒTƒCƒg—ƒzƒƒ“,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1129,‰Î‘®«UŒ‚—ƒzƒƒ“,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
+1129,‘½’iUŒ‚—ƒzƒƒ“,attack,171,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1129,‘½’iUŒ‚—ƒzƒƒ“,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
+1129,öŠo—ƒzƒƒ“,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
+1129,ƒTƒCƒg—ƒzƒƒ“,chase,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1129,ƒTƒCƒg—ƒzƒƒ“,chase,10,1,100,0,20000,yes,self,always,0,,,,,,
+1130,‰Î‘®«UŒ‚—ƒWƒƒƒbƒN,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
+1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,100,4000,10000,yes,target,always,0,,,,,,
+1130,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1130,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒƒƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1130,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,chase,19,4,100,4000,10000,yes,target,always,0,,,,,,
+1130,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1131,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1131,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,attack,92,5,50,0,10000,yes,target,always,0,,,,,,
+1131,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,attack,13,10,50,1000,5000,yes,target,always,0,,,,,,
+1131,•—‘®«UŒ‚—ƒWƒ‡[ƒJ[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1131,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,attack,161,1,1000,1000,30000,no,self,always,0,,,,,,
+1131,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,attack,17,7,50,4000,10000,yes,target,always,0,,,,,,
+1131,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,attack,15,6,50,4000,10000,yes,target,always,0,,,,,,
+1131,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,attack,91,4,50,4000,10000,no,target,always,0,,,,,,
+1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,attack,84,5,50,4000,10000,yes,target,always,0,,,,,,
+1131,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1131,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
+1131,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,chase,13,10,50,1000,5000,yes,target,always,0,,,,,,
+1131,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,chase,161,1,1000,1000,30000,no,self,always,0,,,,,,
+1131,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,chase,17,7,50,4000,10000,yes,target,always,0,,,,,,
+1131,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,chase,15,6,50,4000,10000,yes,target,always,0,,,,,,
+1131,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,chase,91,4,50,2500,10000,no,target,always,0,,,,,,
+1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,longrangeattacked,,,,,,,
+1131,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,always,0,,,,,,
+1132,”͈ÍUŒ‚—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1132,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1132,ƒOƒŠƒ€ƒgƒD[ƒX—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,137,5,300,0,0,no,target,always,0,,,,,,
+1132,‘¬“xŒ¸­—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,30,1,50,3000,120000,yes,target,always,0,,,,,,
+1132,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1133,•—‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
+1134,“Å‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,188,2,200,0,7500,yes,target,always,0,,,,,,
+1135,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒh,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
+1138,ƒtƒ‰ƒbƒVƒƒ[—”’˜@‹Ê,idle,120,5,50,1500,30000,yes,self,always,0,,,,,,
+1138,ƒGƒ‚[ƒVƒ‡ƒ“—”’˜@‹Ê,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1138,…‘®«UŒ‚—”’˜@‹Ê,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1139,’n‘®«UŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1139,‘½’iUŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1140,‰Î‘®«UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,attack,18,3,700,1000,10000,yes,target,always,0,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,attack,19,3,500,2000,10000,yes,target,always,0,,,,,,
+1140,–‚–@‘ÅŒ‚UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,chase,18,3,100,1000,10000,yes,target,always,0,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
+1140,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,3,100,2000,10000,yes,target,always,0,,,,,,
+1141,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒi,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1141,–hŒä–³Ž‹UŒ‚—ƒ}ƒŠƒi,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1141,–hŒä–³Ž‹UŒ‚—ƒ}ƒŠƒi,attack,170,3,100,0,10000,no,target,always,0,,,,,,
+1141,…‘®«UŒ‚—ƒ}ƒŠƒi,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
+1142,Ž©”š—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,173,1,160,0,0,no,self,myhpltmaxrate,90,,,,,,
+1142,Ž©”š—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,173,1,1000,0,0,no,self,skillused,173,,,,,,
+1142,…‘®«UŒ‚—ƒ}ƒŠƒ“ƒXƒtƒBƒA,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1142,Ž©”š2—ƒ}ƒŠƒ“ƒXƒtƒBƒA,idle,331,1,0,0,0,no,self,always,,,,,,,
+1143,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒIƒlƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1143,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv—ƒ}ƒŠƒIƒlƒbƒg,idle,121,5,50,1500,30000,yes,self,always,0,,,,,,
+1143,”O‘®«UŒ‚—ƒ}ƒŠƒIƒlƒbƒg,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
+1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,100,3000,10000,yes,target,always,0,,,,,,
+1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1143,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,100,3000,10000,yes,target,always,0,,,,,,
+1144,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒ‹ƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1144,…‘®«UŒ‚—ƒ}ƒ‹ƒX,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1145,»‚Ü‚«—ƒ}[ƒeƒBƒ“,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1145,»‚Ü‚«—ƒ}[ƒeƒBƒ“,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1145,’n‘®«UŒ‚—ƒ}[ƒeƒBƒ“,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
+1145,ƒnƒCƒfƒBƒ“ƒO—ƒ}[ƒeƒBƒ“,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1145,ƒnƒCƒfƒBƒ“ƒO—ƒ}[ƒeƒBƒ“,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1146,ˆÅ‘®«UŒ‚—ƒ}[ƒ^[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1146,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1146,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1146,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
+1146,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1147,ƒq[ƒ‹—ƒ}ƒ„[,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1147,ƒeƒŒƒ|[ƒg—ƒ}ƒ„[,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1147,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ}ƒ„[,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1194,,,,,
+1147,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒ}ƒ„[,attack,12,10,1000,0,5000,yes,self,myhpltmaxrate,30,,,,,,
+1147,’n‘®«UŒ‚—ƒ}ƒ„[,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
+1147,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ}ƒ„[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1147,Žæ‚芪‚«¢Š«—ƒ}ƒ„[,attack,196,5,1000,3000,10000,no,self,slavele,0,1194,,,,,
+1147,ƒsƒA[ƒX—ƒ}ƒ„[,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
+1147,ƒq[ƒ‹—ƒ}ƒ„[,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1147,ƒq[ƒ‹—ƒ}ƒ„[,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
+1147,•K’†UŒ‚—ƒ}ƒ„[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1147,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ}ƒ„[,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,500,1000,3000,no,target,attackpcge,2,,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,500,1000,3000,no,target,longrangeattacked,,,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,attack,91,5,800,1500,3000,no,target,skillused,18,,,,,,
+1147,–hŒä–³Ž‹UŒ‚—ƒ}ƒ„[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1147,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ}ƒ„[,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1147,‘¬“x‘‰Á—ƒ}ƒ„[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1147,Žæ‚芪‚«¢Š«—ƒ}ƒ„[,chase,196,5,10000,3000,3600000,no,self,slavele,2,1194,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,300,1000,0,no,target,attackpcge,2,,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,300,1000,0,no,target,longrangeattacked,,,,,,,
+1147,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„[,chase,91,5,800,1500,3000,no,target,skillused,18,,,,,,
+1148,Ή»UŒ‚—ƒƒfƒ…[ƒT,attack,180,5,50,0,10000,no,target,always,0,,,,,,
+1149,’§”­—ƒ~ƒmƒ^ƒEƒƒX,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1149,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒmƒ^ƒEƒƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1149,‰Î‘®«UŒ‚—ƒ~ƒmƒ^ƒEƒƒX,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1149,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—ƒ~ƒmƒ^ƒEƒƒX,attack,110,3,250,3000,10000,no,target,always,0,,,,,,
+1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,attack,91,3,100,2000,10000,yes,target,always,0,,,,,,
+1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,chase,91,3,300,4000,10000,no,target,longrangeattacked,,,,,,,
+1149,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,chase,91,3,100,4000,10000,no,target,always,0,,,,,,
+1150,ƒq[ƒ‹—ŒŽ–é‰Ô,idle,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1150,ƒeƒŒƒ|[ƒg—ŒŽ–é‰Ô,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1150,ƒ‚ƒ“ƒXƒ^[¢Š«—ŒŽ–é‰Ô,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1180,,,,,
+1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,attack,90,5,250,800,3000,no,target,longrangeattacked,,,,,,,
+1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,attack,90,5,250,800,3000,no,target,always,0,,,,,,
+1150,ƒNƒ[ƒLƒ“ƒO—ŒŽ–é‰Ô,attack,135,1,150,0,10000,no,self,slavele,0,,,,,,
+1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,14,5,250,800,3000,no,target,longrangeattacked,,,,,,,
+1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,14,5,250,800,3000,no,target,always,0,,,,,,
+1150,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ŒŽ–é‰Ô,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1150,Žæ‚芪‚«¢Š«—ŒŽ–é‰Ô,attack,196,5,1000,3000,3600000,no,self,slavele,0,1180,,,,,
+1150,ƒq[ƒ‹—ŒŽ–é‰Ô,attack,28,10,1000,0,2000,yes,friend,friendhpltmaxrate,80,,,,,,
+1150,ƒq[ƒ‹—ŒŽ–é‰Ô,attack,28,10,1000,0,2000,yes,self,myhpltmaxrate,30,,,,,,
+1150,•K’†UŒ‚—ŒŽ–é‰Ô,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,19,5,250,800,3000,no,target,longrangeattacked,,,,,,,
+1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,19,5,250,800,3000,no,target,always,0,,,,,,
+1150,–hŒä–³Ž‹UŒ‚—ŒŽ–é‰Ô,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1150,ƒƒ}[ƒiƒCƒg—ŒŽ–é‰Ô,attack,42,7,100,0,10000,yes,target,attackpcge,2,,,,,,
+1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,20,5,250,800,3000,no,target,longrangeattacked,,,,,,,
+1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,attack,20,5,250,800,3000,no,target,always,0,,,,,,
+1150,ƒ‰ƒ“ƒ_ƒ€UŒ‚—ŒŽ–é‰Ô,attack,183,5,200,0,5000,yes,target,always,0,,,,,,
+1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,chase,90,5,200,800,0,no,target,longrangeattacked,,,,,,,
+1150,ƒA[ƒXƒXƒpƒCƒN—ŒŽ–é‰Ô,chase,90,5,200,800,0,no,target,always,0,,,,,,
+1150,ƒCƒ“ƒfƒ…ƒA—ŒŽ–é‰Ô,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,14,5,200,800,0,no,target,longrangeattacked,,,,,,,
+1150,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,14,5,200,800,0,no,target,always,0,,,,,,
+1150,‘¬“x‘‰Á—ŒŽ–é‰Ô,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1150,Žæ‚芪‚«¢Š«—ŒŽ–é‰Ô,chase,196,5,10000,3000,3600000,no,self,slavele,2,1180,,,,,
+1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,19,5,200,800,0,no,target,longrangeattacked,,,,,,,
+1150,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,19,5,200,800,0,no,target,always,0,,,,,,
+1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,20,5,200,800,0,no,target,longrangeattacked,,,,,,,
+1150,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ŒŽ–é‰Ô,chase,20,5,200,800,0,no,target,always,0,,,,,,
+1151,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1151,‹zŒŒ—ƒ~ƒXƒg,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1151,ƒCƒ“ƒxƒiƒ€—ƒ~ƒXƒg,attack,52,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1151,ƒCƒ“ƒxƒiƒ€—ƒ~ƒXƒg,attack,52,4,100,1500,10000,no,target,always,0,,,,,,
+1151,¸_”j‰ó—ƒ~ƒXƒg,attack,159,2,100,0,10000,no,target,always,0,,,,,,
+1151,“Å‘®«UŒ‚—ƒ~ƒXƒg,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
+1151,ˆÅ‘®«•Ï‰»—ƒ~ƒXƒg,attack,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1151,ˆÅ‘®«•Ï‰»—ƒ~ƒXƒg,chase,168,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1152,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1152,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,100,0,10000,no,target,always,0,,,,,,
+1153,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1153,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,100,0,10000,no,target,always,0,,,,,,
+1154,ƒoƒbƒVƒ…—ƒpƒTƒi,attack,5,10,500,0,5000,yes,target,always,0,,,,,,
+1154,‘½’iUŒ‚—ƒpƒTƒi,attack,171,3,500,0,10000,yes,target,always,0,,,,,,
+1154,–hŒä–³Ž‹UŒ‚—ƒpƒTƒi,attack,170,3,800,0,10000,no,target,always,0,,,,,,
+1155,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1155,•—‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1155,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
+1155,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
+1156,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1156,’n‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1156,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
+1156,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
+1157,ƒeƒŒƒ|[ƒg—ƒtƒ@ƒ‰ƒI,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1157,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒtƒ@ƒ‰ƒI,attack,60,10,1000,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1157,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒtƒ@ƒ‰ƒI,attack,209,3,10000,3000,3600000,no,self,myhpltmaxrate,5,1154,1140,,,,
+1157,Žæ‚芪‚«¢Š«—ƒtƒ@ƒ‰ƒI,attack,196,3,1000,3000,3600000,no,self,slavele,0,1154,1140,,,,
+1157,ƒ`ƒƒ[ƒWƒAƒ[—ƒtƒ@ƒ‰ƒI,attack,148,1,500,2000,10000,no,target,always,0,,,,,,
+1157,ƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO—ƒtƒ@ƒ‰ƒI,attack,203,1,800,0,30000,no,self,always,0,,,,,,
+1157,ƒeƒŒƒ|[ƒg—ƒtƒ@ƒ‰ƒI,attack,26,1,10,0,100000,yes,self,always,0,,,,,,
+1157,Žæ‚芪‚«¢Š«—ƒtƒ@ƒ‰ƒI,chase,196,3,10000,3000,3600000,no,self,slavele,2,1154,1140,,,,
+1157,ƒ`ƒƒ[ƒWƒAƒ[—ƒtƒ@ƒ‰ƒI,chase,148,1,500,2000,10000,no,target,always,0,,,,,,
+1158,…‘®«UŒ‚—ƒtƒFƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
+1159,ƒeƒŒƒ|[ƒg—ƒtƒŠƒIƒj,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1159,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒtƒŠƒIƒj,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1165,,,,,
+1159,ƒA[ƒXƒXƒpƒCƒN—ƒtƒŠƒIƒj,attack,90,5,500,0,3000,yes,target,longrangeattacked,,,,,,,
+1159,ƒXƒg[ƒ“ƒJ[ƒX—ƒtƒŠƒIƒj,attack,16,7,300,1500,5000,no,target,always,0,,,,,,
+1159,¸_”j‰ó—ƒtƒŠƒIƒj,attack,159,5,100,0,10000,yes,target,always,0,,,,,,
+1159,’n‘®«UŒ‚—ƒtƒŠƒIƒj,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
+1159,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒtƒŠƒIƒj,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1159,Žæ‚芪‚«¢Š«—ƒtƒŠƒIƒj,attack,196,5,1000,3000,3600000,no,self,slavele,0,1127,,,,,
+1159,ƒnƒCƒfƒBƒ“ƒO—ƒtƒŠƒIƒj,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
+1159,ƒnƒCƒfƒBƒ“ƒO—ƒtƒŠƒIƒj,attack,51,1,150,0,5000,no,self,myhpltmaxrate,30,,,,,,
+1159,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒtƒŠƒIƒj,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
+1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,attack,91,5,500,1500,3000,no,target,attackpcge,2,,,,,,
+1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,attack,91,5,800,1500,3000,no,target,skillused,18,,,,,,
+1159,–hŒä–³Ž‹UŒ‚—ƒtƒŠƒIƒj,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1159,ƒA[ƒXƒXƒpƒCƒN—ƒtƒŠƒIƒj,chase,90,5,300,0,0,yes,target,longrangeattacked,,,,,,,
+1159,‘¬“x‘‰Á—ƒtƒŠƒIƒj,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1159,Žæ‚芪‚«¢Š«—ƒtƒŠƒIƒj,chase,196,5,10000,3000,3600000,no,self,slavele,2,1127,,,,,
+1159,•K’†UŒ‚—ƒtƒŠƒIƒj,chase,172,1,200,0,5000,yes,target,always,0,,,,,,
+1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,chase,91,5,300,1500,0,no,target,attackpcge,2,,,,,,
+1159,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒtƒŠƒIƒj,chase,91,5,800,1500,3000,no,target,skillused,18,,,,,,
+1160,’n‘®«UŒ‚—ƒsƒG[ƒ‹,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1160,ƒGƒ‚[ƒVƒ‡ƒ“—ƒsƒG[ƒ‹,loot,197,1,15,0,10000,yes,self,always,0,,,,,,
+1161,…‘®«UŒ‚—ƒvƒ‰ƒ“ƒNƒgƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
+1163,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒN,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,150,1000,40000,yes,self,myhpltmaxrate,30,,,,,,
+1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,50,1000,40000,yes,self,always,0,,,,,,
+1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1163,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,50,1500,10000,no,target,always,0,,,,,,
+1163,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒCƒhƒŠƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1163,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,chase,114,1,50,1000,40000,yes,self,always,0,,,,,,
+1164,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒNƒCƒGƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
+1164,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1164,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1164,ˆÅ‘®«UŒ‚—ƒŒƒNƒCƒGƒ€,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1165,»‚Ü‚«—ƒTƒ“ƒhƒ}ƒ“,attack,149,1,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1165,»‚Ü‚«—ƒTƒ“ƒhƒ}ƒ“,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1165,’n‘®«UŒ‚—ƒTƒ“ƒhƒ}ƒ“,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
+1165,ƒnƒCƒfƒBƒ“ƒO—ƒTƒ“ƒhƒ}ƒ“,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1165,ƒnƒCƒfƒBƒ“ƒO—ƒTƒ“ƒhƒ}ƒ“,chase,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1166,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒx[ƒW,dead,197,1,1000,0,10000,yes,self,always,0,16,,,,,
+1166,’n‘®«UŒ‚—ƒTƒx[ƒW,attack,185,1,200,0,7500,yes,target,always,0,,,,,,
+1166,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒW,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1166,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒW,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1166,‘¬“x‘‰Á—ƒTƒx[ƒW,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
+1167,’n‘®«UŒ‚—ƒTƒx[ƒWƒxƒx,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1167,ƒCƒ“ƒfƒ…ƒA—ƒTƒx[ƒWƒxƒx,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1167,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒx[ƒWƒxƒx,dead,197,1,1000,0,15000,no,self,always,0,16,,,,,
+1169,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒ[ƒJ[,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1170,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒq[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1170,Ž©Œˆ—ƒ\ƒq[,attack,175,1,50,700,0,no,self,myhpltmaxrate,30,,,,,,
+1170,…‘®«UŒ‚—ƒ\ƒq[,attack,184,2,100,0,15000,yes,target,always,0,,,,,,
+1170,ƒoƒbƒVƒ…—ƒ\ƒq[,attack,5,10,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1170,ƒoƒbƒVƒ…—ƒ\ƒq[,attack,5,10,100,1500,10000,no,target,always,0,,,,,,
+1173,…‘®«UŒ‚—•º‘àƒsƒG[ƒ‹,attack,184,1,100,0,15000,yes,target,always,0,,,,,,
+1174,ƒL[ƒsƒ“ƒO—ƒXƒ^ƒCƒi[,attack,201,1,500,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1174,•—‘®«UŒ‚—ƒXƒ^ƒCƒi[,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1174,’¾–ÙUŒ‚—ƒXƒ^ƒCƒi[,attack,178,5,100,0,10000,no,target,always,0,,,,,,
+1175,ˆÅ‘®«UŒ‚—ƒ^ƒƒE,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
+1175,“ÅUŒ‚—ƒ^ƒƒE,attack,176,2,100,1000,10000,no,target,always,0,,,,,,
+1176,ƒq[ƒ‹—ƒrƒ^ƒ^,idle,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1176,’n‘®«UŒ‚—ƒrƒ^ƒ^,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1176,ƒq[ƒ‹—ƒrƒ^ƒ^,attack,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1176,ƒq[ƒ‹—ƒrƒ^ƒ^,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1176,ƒq[ƒ‹—ƒrƒ^ƒ^,chase,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1176,ƒq[ƒ‹—ƒrƒ^ƒ^,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1177,ˆÅ‘®«UŒ‚—ƒ[ƒm[ƒN,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1177,“ÅUŒ‚—ƒ[ƒm[ƒN,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1177,“ÅUŒ‚—ƒ[ƒm[ƒN,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1178,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ[ƒƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
+1178,‰Î‘®«UŒ‚—ƒ[ƒƒ€,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1179,ƒNƒ[ƒLƒ“ƒO—ƒEƒBƒXƒp[,attack,135,1,100,1000,10000,yes,self,always,0,,,,,,
+1179,”O‘®«UŒ‚—ƒEƒBƒXƒp[,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
+1179,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒXƒp[,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1179,ƒNƒ[ƒLƒ“ƒO—ƒEƒBƒXƒp[,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1180,‰Î‘®«UŒ‚—‹ã”öŒÏ,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1180,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1180,ƒjƒ…[ƒ}—‹ã”öŒÏ,attack,25,1,1000,0,20000,yes,self,longrangeattacked,,,,,,,
+1180,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1188,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,1000,1500,30000,no,target,myhpltmaxrate,30,,,,,,
+1188,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
+1188,ƒoƒbƒNƒXƒeƒbƒv—ƒ{ƒ“ƒSƒ“,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1189,ƒAƒ“ƒNƒ‹ƒXƒlƒA—ƒI[ƒNƒA[ƒ`ƒƒ[,idle,117,5,50,1500,50000,yes,self,always,0,,,,,,
+1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,1000,1500,10000,yes,target,attackpcge,2,,,,,,
+1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,100,1500,10000,yes,target,always,0,,,,,,
+1189,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1189,’n‘®«UŒ‚—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1189,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,chase,47,5,100,1500,10000,yes,target,always,0,,,,,,
+1190,ƒeƒŒƒ|[ƒg—ƒI[ƒNƒ[ƒh,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1190,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒI[ƒNƒ[ƒh,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1189,,,,,
+1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,14,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,14,10,500,1500,3000,no,target,always,0,,,,,,
+1190,ƒXƒsƒAƒXƒ^ƒu—ƒI[ƒNƒ[ƒh,attack,58,8,100,0,5000,yes,target,always,0,,,,,,
+1190,’n‘®«UŒ‚—ƒI[ƒNƒ[ƒh,attack,185,5,200,0,5000,yes,target,always,0,,,,,,
+1190,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒI[ƒNƒ[ƒh,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1190,Žæ‚芪‚«¢Š«—ƒI[ƒNƒ[ƒh,attack,196,4,1000,3000,3600000,no,self,slavele,0,1189,,,,,
+1190,•K’†UŒ‚—ƒI[ƒNƒ[ƒh,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,19,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,attack,19,10,500,1500,3000,no,target,always,0,,,,,,
+1190,ƒvƒƒ{ƒbƒN—ƒI[ƒNƒ[ƒh,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
+1190,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ[ƒh,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,attack,76,8,100,1500,5000,yes,target,attackpcge,2,,,,,,
+1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,attack,76,5,800,1500,3000,no,target,skillused,18,,,,,,
+1190,ƒCƒ“ƒfƒ…ƒA—ƒI[ƒNƒ[ƒh,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,14,10,300,1500,3000,no,target,longrangeattacked,,,,,,,
+1190,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,14,10,300,1500,0,no,target,always,0,,,,,,
+1190,‘¬“x‘‰Á—ƒI[ƒNƒ[ƒh,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1190,Žæ‚芪‚«¢Š«—ƒI[ƒNƒ[ƒh,chase,196,4,10000,3000,3600000,no,self,slavele,2,1189,,,,,
+1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,19,10,300,1500,3000,no,target,longrangeattacked,,,,,,,
+1190,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒI[ƒNƒ[ƒh,chase,19,10,300,1500,0,no,target,always,0,,,,,,
+1190,ƒvƒƒ{ƒbƒN—ƒI[ƒNƒ[ƒh,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
+1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,chase,76,8,100,1500,5000,yes,target,attackpcge,2,,,,,,
+1190,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒI[ƒNƒ[ƒh,chase,76,5,800,1500,3000,no,target,skillused,18,,,,,,
+1191,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒ~ƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1191,‹zŒŒ—ƒ~ƒ~ƒbƒN,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1192,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1192,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1192,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,100,0,10000,no,target,always,0,,,,,,
+1192,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1193,”͈ÍUŒ‚—ƒAƒ‰[ƒ€,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
+1193,ˆÃˆÅUŒ‚—ƒAƒ‰[ƒ€,attack,177,5,1000,0,10000,no,target,always,0,,,,,,
+1194,’n‘®«UŒ‚—ƒAƒNƒ‰ƒEƒX,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1195,‹zŒŒ—ƒ‰ƒCƒhƒ[ƒh,attack,199,1,1000,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1195,ˆÃˆÅUŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,177,5,1000,0,10000,no,target,always,0,,,,,,
+1195,–hŒä–³Ž‹UŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,170,2,500,0,10000,no,target,always,0,,,,,,
+1196,”͈ÍUŒ‚—ƒXƒPƒ‹ƒvƒŠƒYƒi[,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
+1197,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1197,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1199,•—‘®«UŒ‚—ƒpƒ“ƒN,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1199,Ή»UŒ‚—ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
+1200,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒ‹ƒ^ƒX,attack,136,7,250,1500,10000,no,target,always,0,,,,,,
+1200,•K’†UŒ‚—ƒWƒ‹ƒ^ƒX,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1200,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,attack,6,10,50,1000,30000,yes,target,always,0,,,,,,
+1200,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒ‹ƒ^ƒX,chase,197,1,15,0,10000,yes,self,always,0,30,,,,,
+1200,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,chase,6,10,100,1000,30000,yes,target,always,0,,,,,,
+1201,“Å‘®«UŒ‚—ƒŠƒrƒI,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
+1201,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
+1201,ƒ\ƒjƒbƒNƒuƒ[—ƒŠƒrƒI,attack,136,5,10,1500,10000,no,target,always,0,,,,,,
+1201,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
+1202,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1202,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1202,“Å‘®«UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
+1202,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1203,ˆÅ‘®«UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
+1203,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1203,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1203,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1203,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1204,ˆÅ‘®«UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
+1204,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1204,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
+1204,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1204,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,100,0,10000,no,target,always,0,,,,,,
+1204,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1204,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒKƒgƒD[ƒX,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
+1204,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1205,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
+1205,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
+1205,ˆÅ‘®«UŒ‚—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1205,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,myhpltmaxrate,30,,,,,,
+1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,longrangeattacked,,,,,,,
+1205,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,100,3000,5000,no,target,always,0,,,,,,
+1205,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1206,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒmƒŠƒAƒ“,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1206,…‘®«UŒ‚—ƒAƒmƒŠƒAƒ“,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
+1207,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒeƒBƒ“ƒO,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,150,500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,50,500,10000,yes,target,always,0,,,,,,
+1207,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1207,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,50,1500,10000,no,target,always,0,,,,,,
+1207,’n‘®«UŒ‚—ƒXƒeƒBƒ“ƒO,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1207,ƒnƒCƒfƒBƒ“ƒO—ƒXƒeƒBƒ“ƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1207,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,chase,92,5,50,500,10000,yes,target,always,0,,,,,,
+1208,ƒGƒ‚[ƒVƒ‡ƒ“—œfœr‚¤ŽÒ,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1208,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
+1208,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
+1208,”͈ÍUŒ‚—œfœr‚¤ŽÒ,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1208,•—‘®«UŒ‚—œfœr‚¤ŽÒ,attack,187,4,100,0,15000,yes,target,always,0,,,,,,
+1209,ƒCƒ“ƒxƒiƒ€—ƒNƒ‰ƒ“ƒv,attack,52,6,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1209,ƒCƒ“ƒxƒiƒ€—ƒNƒ‰ƒ“ƒv,attack,52,6,100,1500,10000,no,target,always,0,,,,,,
+1209,“Å‘®«UŒ‚—ƒNƒ‰ƒ“ƒv,attack,188,3,200,0,7500,yes,target,always,0,,,,,,
+1211,‰Î‘®«UŒ‚—ƒuƒŠƒ‰ƒCƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1211,•—‘®«•Ï‰»—ƒuƒŠƒ‰ƒCƒg,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1211,•—‘®«•Ï‰»—ƒuƒŠƒ‰ƒCƒg,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1213,‹i‰Œ—ƒnƒCƒI[ƒN,idle,195,1,10,0,0,yes,self,always,0,,,,,,
+1213,‰Î‘®«UŒ‚—ƒnƒCƒI[ƒN,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1213,•K’†UŒ‚—ƒnƒCƒI[ƒN,attack,172,1,500,0,5000,yes,target,always,0,,,,,,
+1213,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1213,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,100,1500,10000,yes,target,always,0,,,,,,
+1213,ƒGƒ‚[ƒVƒ‡ƒ“—ƒnƒCƒI[ƒN,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1214,ƒXƒLƒbƒhƒgƒ‰ƒbƒv—ƒ`ƒ‡ƒR,idle,115,1,50,1500,300000,yes,self,always,0,,,,,,
+1214,ƒq[ƒ‹—ƒ`ƒ‡ƒR,idle,28,1,10,3000,60000,yes,self,always,0,,,,,,
+1214,‰Î‘®«UŒ‚—ƒ`ƒ‡ƒR,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1214,ƒvƒƒ{ƒbƒN—ƒ`ƒ‡ƒR,attack,6,5,50,1500,30000,yes,target,always,0,,,,,,
+1214,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒ‡ƒR,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1214,ΓŠ‚°—ƒ`ƒ‡ƒR,chase,152,1,600,1000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1214,ΓŠ‚°—ƒ`ƒ‡ƒR,chase,152,1,200,1000,10000,yes,target,always,0,,,,,,
+1214,ƒvƒƒ{ƒbƒN—ƒ`ƒ‡ƒR,chase,6,5,100,1500,30000,yes,target,always,0,,,,,,
+1214,Žæ‚芪‚«¢Š«—ƒ`ƒ‡ƒR,attack,196,4,1000,0,3600000,no,self,slavele,4,1057,,,,,
+1215,•—‘®«UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1215,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1215,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1215,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1215,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1216,‹zŒŒ—ƒyƒmƒƒi,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1216,“Å‘®«UŒ‚—ƒyƒmƒƒi,attack,188,3,100,0,15000,yes,target,always,0,,,,,,
+1216,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1216,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,100,1500,10000,no,target,always,0,,,,,,
+1219,ƒeƒŒƒ|[ƒg—[•£‚Ì‹RŽm,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
+1219,ˆÅ‘®«UŒ‚—[•£‚Ì‹RŽm,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
+1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,1000,2500,3000,no,target,attackpcge,2,,,,,,
+1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
+1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,100,2500,10000,no,target,always,0,,,,,,
+1219,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—[•£‚Ì‹RŽm,attack,57,8,100,2500,10000,no,target,skillused,61,,,,,,
+1219,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—[•£‚Ì‹RŽm,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1219,Žæ‚芪‚«¢Š«—[•£‚Ì‹RŽm,attack,196,2,10000,1500,40000,no,self,slavele,0,1132,,,,,
+1219,ƒ`ƒƒ[ƒWƒAƒ[—[•£‚Ì‹RŽm,chase,148,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1219,ƒ`ƒƒ[ƒWƒAƒ[—[•£‚Ì‹RŽm,chase,148,1,100,0,10000,no,target,always,0,,,,,,
+1219,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—[•£‚Ì‹RŽm,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1219,Žæ‚芪‚«¢Š«—[•£‚Ì‹RŽm,idle,196,2,100,1500,40000,no,self,slavele,0,1132,,,,,
+1242,…‘®«UŒ‚—ƒ}[ƒŠƒ“,attack,184,1,200,0,7500,yes,target,always,0,,,,,,
+1242,ƒtƒƒXƒgƒ_ƒCƒo[—ƒ}[ƒŠƒ“,attack,15,1,300,1000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1242,ƒtƒƒXƒgƒ_ƒCƒo[—ƒ}[ƒŠƒ“,attack,15,1,100,1000,10000,yes,target,always,0,,,,,,
+1242,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}[ƒŠƒ“,loot,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1243,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1243,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
+1243,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1243,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1243,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1243,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒXƒJƒbƒ`,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1243,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1245,•—‘®«UŒ‚—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,15,3,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,attack,15,3,50,4000,10000,yes,target,always,0,,,,,,
+1245,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1245,ƒtƒƒXƒgƒ_ƒCƒo[—ƒNƒŠƒXƒ}ƒXƒSƒuƒŠƒ“,chase,15,3,50,4000,10000,yes,target,always,0,,,,,,
+1246,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1246,¹‘®«UŒ‚—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
+1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,20,2,150,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,20,2,50,4000,10000,yes,target,always,0,,,,,,
+1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,78,1,150,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,attack,78,1,50,0,10000,yes,target,always,0,,,,,,
+1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,20,2,300,4000,10000,yes,target,longrangeattacked,,,,,,,
+1246,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,20,2,50,4000,10000,yes,target,always,0,,,,,,
+1246,ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi—ƒNƒŠƒXƒ}ƒXƒNƒbƒL[,chase,78,1,50,0,10000,yes,target,always,0,,,,,,
+1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,attack,26,1,100,0,100000,yes,self,always,0,,,,,,
+1247,ƒeƒŒƒ|[ƒg—ƒAƒ“ƒ\ƒj,chase,26,1,100,0,10000,yes,self,always,0,,,,,,
+1248,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1248,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,300,0,10000,no,target,always,0,,,,,,
+1248,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒ‹[ƒU[,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
+1249,öŠo—ƒ~ƒXƒgƒP[ƒX,attack,207,1,100,1000,10000,yes,target,always,0,,,,,,
+1249,ƒXƒsƒAƒXƒ^ƒu—ƒ~ƒXƒgƒP[ƒX,attack,58,1,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1249,ƒXƒsƒAƒXƒ^ƒu—ƒ~ƒXƒgƒP[ƒX,attack,58,1,50,1000,10000,no,target,always,0,,,,,,
+1249,ƒƒ}[ƒiƒCƒg—ƒ~ƒXƒgƒP[ƒX,attack,42,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,8
+1249,ƒƒ}[ƒiƒCƒg—ƒ~ƒXƒgƒP[ƒX,attack,42,1,50,1500,10000,no,target,always,0,,,,,,8
+1249,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒXƒgƒP[ƒX,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1249,öŠo—ƒ~ƒXƒgƒP[ƒX,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
+1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,idle,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1250,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒFƒyƒbƒg,attack,197,1,15,0,10000,yes,self,always,0,17,,,,,
+1250,‰Î‘®«UŒ‚—ƒ`ƒFƒyƒbƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1250,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,100,3000,0,yes,target,always,0,,,,,,
+1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,300,3000,0,yes,target,always,0,,,,,,
+1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,100,3000,0,yes,target,always,0,,,,,,
+1250,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,300,3000,0,yes,target,always,0,,,,,,
+1251,ƒeƒŒƒ|[ƒg—ƒXƒg[ƒ€ƒiƒCƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1251,ƒeƒŒƒ|[ƒg—ƒXƒg[ƒ€ƒiƒCƒg,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1251,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1245,,,,,
+1251,öŠo—ƒXƒg[ƒ€ƒiƒCƒg,attack,207,5,100,0,10000,yes,target,always,0,,,,,,
+1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,89,10,100,1500,5000,no,target,attackpcge,2,,,,,,
+1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,89,8,800,1500,3000,no,target,skillused,18,,,,,,
+1251,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒXƒg[ƒ€ƒiƒCƒg,attack,12,10,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
+1251,•—‘®«UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
+1251,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒXƒg[ƒ€ƒiƒCƒg,attack,60,10,1000,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1251,Žæ‚芪‚«¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1245,,,,,
+1251,•K’†UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1251,–hŒä–³Ž‹UŒ‚—ƒXƒg[ƒ€ƒiƒCƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1251,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒXƒg[ƒ€ƒiƒCƒg,attack,114,1,300,0,20000,yes,self,always,0,,,,,,
+1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,20,8,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,attack,20,8,500,1500,3000,no,target,always,0,,,,,,
+1251,öŠo—ƒXƒg[ƒ€ƒiƒCƒg,chase,207,5,100,0,10000,yes,target,always,0,,,,,,
+1251,ƒXƒg[ƒ€ƒKƒXƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,89,8,800,1500,3000,no,target,skillused,18,,,,,,
+1251,‘¬“x‘‰Á—ƒXƒg[ƒ€ƒiƒCƒg,chase,29,1,300,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1251,Žæ‚芪‚«¢Š«—ƒXƒg[ƒ€ƒiƒCƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1245,,,,,
+1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,20,8,300,1500,0,no,target,longrangeattacked,,,,,,,
+1251,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒXƒg[ƒ€ƒiƒCƒg,chase,20,8,300,1500,0,no,target,always,0,,,,,,
+1252,‹zŒŒ—ƒnƒeƒB[,attack,199,1,300,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1252,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒnƒeƒB[,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1243,,,,,
+1252,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒeƒB[,attack,111,5,100,0,20000,yes,self,always,0,,,,,,
+1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,attack,14,10,500,1500,3000,no,target,longrangeattacked,,,,,,,
+1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,attack,14,10,500,1500,3000,no,target,always,0,,,,,,
+1252,…‘®«UŒ‚—ƒnƒeƒB[,attack,184,5,200,0,5000,yes,target,always,0,,,,,,
+1252,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒnƒeƒB[,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1252,Žæ‚芪‚«¢Š«—ƒnƒeƒB[,attack,196,4,1000,3000,10000,no,self,slavele,0,1243,,,,,
+1252,•K’†UŒ‚—ƒnƒeƒB[,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,8,500,1500,0,no,target,longrangeattacked,,,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,10,800,1500,10000,no,target,skillused,18,,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,attack,15,8,100,1500,10000,no,target,always,0,,,,,,
+1252,ƒtƒƒXƒgƒmƒ”ƒ@—ƒnƒeƒB[,attack,88,8,1000,0,10000,yes,target,attackpcge,2,,,,,,
+1252,–hŒä–³Ž‹UŒ‚—ƒnƒeƒB[,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1252,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒeƒB[,chase,111,5,100,0,20000,yes,self,always,0,,,,,,
+1252,ƒCƒ“ƒfƒ…ƒA—ƒnƒeƒB[,chase,8,7,1000,0,20000,yes,self,longrangeattacked,,,,,,,
+1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,chase,14,10,300,1500,0,no,target,longrangeattacked,,,,,,,
+1252,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒnƒeƒB[,chase,14,10,300,1500,0,no,target,always,0,,,,,,
+1252,‘¬“xŒ¸­—ƒnƒeƒB[,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
+1252,‘¬“x‘‰Á—ƒnƒeƒB[,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1252,Žæ‚芪‚«¢Š«—ƒnƒeƒB[,chase,196,4,10000,3000,3600000,no,self,slavele,2,1243,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,8,500,1500,0,no,target,longrangeattacked,,,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,10,800,1500,10000,no,target,skillused,18,,,,,,
+1252,ƒtƒƒXƒgƒ_ƒCƒo[—ƒnƒeƒB[,chase,15,8,100,1500,10000,no,target,always,0,,,,,,
+1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,idle,148,1,1000,0,10000,no,target,closedattacked,,,,,,,
+1253,•—‘®«UŒ‚—ƒK[ƒSƒCƒ‹,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
+1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,attack,148,1,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,attack,148,1,100,0,10000,no,target,always,0,,,,,,
+1253,ƒ`ƒƒ[ƒWƒAƒ[—ƒK[ƒSƒCƒ‹,chase,148,1,100,0,10000,no,target,always,0,,,,,,
+1253,ƒL[ƒsƒ“ƒO—ƒK[ƒSƒCƒ‹,attack,201,1,200,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1254,•—‘®«UŒ‚—ƒŒƒOƒ‹ƒ,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1254,‘½’iUŒ‚—ƒŒƒOƒ‹ƒ,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
+1255,’n‘®«UŒ‚—ƒlƒŒƒCƒh,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1255,…‘®«•Ï‰»—ƒlƒŒƒCƒh,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1255,…‘®«•Ï‰»—ƒlƒŒƒCƒh,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1256,ƒCƒ“ƒxƒiƒ€—ƒyƒXƒg,attack,52,5,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1256,ƒCƒ“ƒxƒiƒ€—ƒyƒXƒg,attack,52,5,50,1500,10000,no,target,always,0,,,,,,
+1256,ˆÅ‘®«UŒ‚—ƒyƒXƒg,attack,190,2,200,0,7500,yes,target,always,0,,,,,,
+1256,‘½’iUŒ‚—ƒyƒXƒg,attack,171,2,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1256,‘½’iUŒ‚—ƒyƒXƒg,attack,171,2,50,0,10000,no,target,always,0,,,,,,
+1257,ˆÅ‘®«UŒ‚—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1257,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1257,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,100,1500,10000,no,target,always,0,,,,,,
+1258,“Å‘®«UŒ‚—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1258,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒSƒuƒŠƒ“ƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1259,•—‘®«UŒ‚—ƒOƒŠƒtƒHƒ“,attack,187,4,200,0,7500,yes,target,always,0,,,,,,
+1259,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,600,800,0,no,target,myhpltmaxrate,30,,,,,,
+1259,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,200,800,0,no,target,always,0,,,,,,
+1260,‹zŒŒ—ƒ_[ƒNƒtƒŒ[ƒ€,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1260,ˆÅ‘®«UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1260,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1260,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,33,0,10000,no,target,always,0,,,,,,
+1260,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1260,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,33,0,10000,no,target,always,0,,,,,,
+1260,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1260,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,33,0,10000,no,target,always,0,,,,,,
+1261,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒCƒ‹ƒhƒ[ƒY,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1261,•—‘®«UŒ‚—ƒƒCƒ‹ƒhƒ[ƒY,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1261,ƒ\ƒjƒbƒNƒuƒ[—ƒƒCƒ‹ƒhƒ[ƒY,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1261,ƒ\ƒjƒbƒNƒuƒ[—ƒƒCƒ‹ƒhƒ[ƒY,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
+1262,‰Î‘®«UŒ‚—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
+1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,100,0,0,yes,target,always,0,,,,,,
+1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,800,800,0,no,target,attackpcge,2,,,,,,
+1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
+1262,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
+1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
+1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,800,0,0,yes,target,longrangeattacked,,,,,,,
+1262,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,100,0,0,yes,target,always,0,,,,,,
+1263,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1263,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,118,2,50,1500,160000,yes,self,always,0,,,,,,
+1263,•—‘®«UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1263,–‚–@‘ÅŒ‚UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,84,3,100,4000,10000,yes,target,always,0,,,,,,
+1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
+1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,100,4000,10000,yes,target,always,0,,,,,,
+1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
+1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1263,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,always,0,,,,,,
+1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1263,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1264,…‘®«UŒ‚—”¼‹™l,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
+1264,ƒsƒA[ƒX—”¼‹™l,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
+1264,ƒsƒA[ƒX—”¼‹™l,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
+1264,’n‘®«•Ï‰»—”¼‹™l,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1264,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,150,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1264,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
+1264,’n‘®«•Ï‰»—”¼‹™l,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1265,ƒq[ƒ‹—ƒNƒbƒL[,idle,28,3,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1265,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒbƒL[,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1265,ƒq[ƒ‹—ƒNƒbƒL[,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1265,ƒq[ƒ‹—ƒNƒbƒL[,attack,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1265,ƒiƒp[ƒ€ƒr[ƒg—ƒNƒbƒL[,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
+1265,ƒiƒp[ƒ€ƒr[ƒg—ƒNƒbƒL[,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
+1265,ƒq[ƒ‹—ƒNƒbƒL[,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1265,ƒq[ƒ‹—ƒNƒbƒL[,chase,28,3,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1266,’n‘®«UŒ‚—ƒqƒgƒf,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1266,…‘®«•Ï‰»—ƒqƒgƒf,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1266,…‘®«•Ï‰»—ƒqƒgƒf,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1267,ƒeƒŒƒ|[ƒg—ƒWƒFƒXƒ^[,idle,26,1,0,0,100000,yes,self,always,0,,,,,,
+1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,idle,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1267,öŠo—ƒWƒFƒXƒ^[,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
+1267,•—‘®«UŒ‚—ƒWƒFƒXƒ^[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1267,”O‘®«•Ï‰»—ƒWƒFƒXƒ^[,attack,169,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,attack,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,attack,28,6,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1267,ƒvƒƒ{ƒbƒN—ƒWƒFƒXƒ^[,attack,6,10,50,1500,30000,yes,target,always,0,,,,,,
+1267,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒFƒXƒ^[,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
+1267,öŠo—ƒWƒFƒXƒ^[,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
+1267,”O‘®«•Ï‰»—ƒWƒFƒXƒ^[,chase,169,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,chase,28,6,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1267,ƒq[ƒ‹—ƒWƒFƒXƒ^[,chase,28,6,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1267,ƒvƒƒ{ƒbƒN—ƒWƒFƒXƒ^[,chase,6,10,100,1500,30000,yes,target,always,0,,,,,,
+1268,ˆÅ‘®«UŒ‚—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,190,5,200,0,7500,yes,target,always,0,,,,,,
+1268,‰Î‘®«•Ï‰»—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,30,,,,,,
+1268,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,57,9,1000,2500,3000,no,target,attackpcge,2,,,,,,
+1268,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,57,9,100,2500,10000,no,target,always,0,,,,,,
+1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,83,8,300,2500,0,no,target,myhpltmaxrate,30,,,,,,
+1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,attack,83,8,100,2500,10000,no,target,always,0,,,,,,
+1268,‰Î‘®«•Ï‰»—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,30,,,,,,
+1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,83,8,300,2500,0,no,target,myhpltmaxrate,30,,,,,,
+1268,ƒƒeƒIƒXƒg[ƒ€—ƒuƒ‰ƒbƒfƒBƒiƒCƒg,chase,83,8,100,2500,10000,no,target,always,0,,,,,,
+1269,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒƒbƒN,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1269,¸_”j‰ó—ƒNƒƒbƒN,attack,159,3,100,0,10000,no,target,always,0,,,,,,
+1269,’n‘®«UŒ‚—ƒNƒƒbƒN,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1269,Ή»UŒ‚—ƒNƒƒbƒN,attack,180,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1269,Ή»UŒ‚—ƒNƒƒbƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
+1270,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—ŽžŒv“ƒŠÇ—ŽÒ,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
+1270,ƒeƒŒƒ|[ƒg—ŽžŒv“ƒŠÇ—ŽÒ,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
+1270,–‚–@‘ÅŒ‚UŒ‚—ŽžŒv“ƒŠÇ—ŽÒ,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,7,300,3500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,5,1000,3500,10000,yes,target,casttargeted,,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,attack,76,7,100,3500,10000,yes,target,always,0,,,,,,
+1270,ˆÃˆÅUŒ‚—ŽžŒv“ƒŠÇ—ŽÒ,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,7,300,3500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,5,1000,3500,10000,yes,target,casttargeted,,,,,,,
+1270,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ŽžŒv“ƒŠÇ—ŽÒ,chase,76,7,100,3500,10000,yes,target,always,0,,,,,,
+1271,…‘®«UŒ‚—ƒAƒŠƒQ[ƒ^[,attack,184,2,100,0,15000,yes,target,always,0,,,,,,
+1272,ƒeƒŒƒ|[ƒg—ƒ_[ƒNƒ[ƒh,walk,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1272,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒ_[ƒNƒ[ƒh,attack,200,1,1000,2000,10000,no,target,myhpltmaxrate,70,,,,,,
+1272,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ_[ƒNƒ[ƒh,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1302,,,,,
+1272,•—‘®«UŒ‚—ƒ_[ƒNƒ[ƒh,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
+1272,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ_[ƒNƒ[ƒh,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1272,Žæ‚芪‚«¢Š«—ƒ_[ƒNƒ[ƒh,attack,196,4,1000,3000,10000,no,self,slavele,0,1302,,,,,
+1272,•K’†UŒ‚—ƒ_[ƒNƒ[ƒh,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1272,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒ[ƒh,attack,18,7,300,0,5000,yes,target,always,0,,,,,,
+1272,–hŒä–³Ž‹UŒ‚—ƒ_[ƒNƒ[ƒh,attack,170,1,200,3000,5000,no,target,always,0,,,,,,
+1272,–‚–@‘ÅŒ‚UŒ‚—ƒ_[ƒNƒ[ƒh,attack,192,1,100,0,10000,yes,target,always,0,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,500,1500,4000,no,target,longrangeattacked,,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,100,1500,4000,no,target,skillused,18,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,attack,83,9,500,1500,4000,no,target,always,0,,,,,,
+1272,Žô‚¢UŒ‚—ƒ_[ƒNƒ[ƒh,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
+1272,‘¬“x‘‰Á—ƒ_[ƒNƒ[ƒh,chase,29,1,500,0,120000,yes,self,myhpltmaxrate,50,,,,,,
+1272,Žæ‚芪‚«¢Š«—ƒ_[ƒNƒ[ƒh,chase,196,4,10000,3000,3600000,no,self,slavele,2,1302,,,,,
+1272,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒ[ƒh,chase,18,7,500,0,0,yes,target,always,0,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,300,1500,1000,no,target,longrangeattacked,,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,100,1500,1000,no,target,skillused,18,,,,,,
+1272,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒ[ƒh,chase,83,9,300,1500,1000,no,target,always,0,,,,,,
+1273,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒŒƒfƒB,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1273,’n‘®«UŒ‚—ƒI[ƒNƒŒƒfƒB,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
+1273,‘¬“x‘‰Á—ƒI[ƒNƒŒƒfƒB,chase,29,1,200,1000,120000,yes,self,always,0,,,,,,30
+1274,ƒGƒ‚[ƒVƒ‡ƒ“—ƒƒKƒŠƒX,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1274,ƒeƒŒƒ|[ƒg—ƒƒKƒŠƒX,idle,26,1,50,0,100000,yes,self,always,0,,,,,,
+1275,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒŠƒX,idle,197,1,500,0,10000,yes,self,always,0,5,,,,,
+1275,Žæ‚芪‚«¢Š«—ƒAƒŠƒX,idle,196,2,300,0,3600000,no,self,slavele,0,1281,,,,,
+1275,ƒq[ƒ‹—ƒAƒŠƒX,idle,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1275,ƒXƒsƒAƒXƒ^ƒu—ƒAƒŠƒX,attack,58,1,300,1300,5000,no,target,myhpltmaxrate,30,,,,,,
+1275,ƒXƒsƒAƒXƒ^ƒu—ƒAƒŠƒX,attack,58,1,100,1300,5000,no,target,always,0,,,,,,
+1275,ƒq[ƒ‹—ƒAƒŠƒX,attack,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1275,ƒq[ƒ‹—ƒAƒŠƒX,attack,28,7,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1275,ƒq[ƒ‹—ƒAƒŠƒX,chase,28,7,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1275,ƒq[ƒ‹—ƒAƒŠƒX,chase,28,7,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1276,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,300,2000,10000,no,target,myhpltmaxrate,30,,,,,,
+1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,100,2000,10000,no,target,always,0,,,,,,
+1276,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,chase,148,1,100,2000,10000,no,target,always,0,,,,,,
+1277,‰Î‘®«UŒ‚—“V‰º‘å«ŒR,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
+1277,ƒA[ƒXƒXƒpƒCƒN—“V‰º‘å«ŒR,attack,90,3,1000,0,20000,yes,self,longrangeattacked,,,,,,,
+1278,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1278,ƒXƒ^ƒ“UŒ‚—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1278,ƒXƒ^ƒ“UŒ‚—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1278,ƒXƒsƒAƒXƒ^ƒu—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,58,1,300,1100,5000,no,target,myhpltmaxrate,30,,,,,,
+1278,ƒXƒsƒAƒXƒ^ƒu—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,attack,58,1,100,1100,5000,no,target,always,0,,,,,,
+1278,ƒCƒ“ƒfƒ…ƒA—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1278,ƒCƒ“ƒfƒ…ƒA—ƒXƒ^ƒ‰ƒNƒ^ƒCƒgƒS[ƒŒƒ€,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1279,’n‘®«UŒ‚—ŽO—tå³,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1280,ƒGƒ‚[ƒVƒ‡ƒ“—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,197,1,15,0,10000,yes,self,always,0,23,,,,,
+1280,Ž©”š—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,173,1,50,3000,0,no,self,myhpltmaxrate,40,,,,,,
+1280,•—‘®«UŒ‚—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
+1280,‰Î‘®«•Ï‰»—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,1000,2000,5000,no,target,attackpcge,2,,,,,,
+1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,100,2000,5000,no,target,always,0,,,,,,
+1280,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,attack,7,4,300,2000,5000,no,target,always,0,,,,,,
+1280,‰Î‘®«•Ï‰»—ƒSƒuƒŠƒ“ƒ‰ƒCƒ_[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1281,ƒGƒ‚[ƒVƒ‡ƒ“—ƒZ[ƒWƒ[ƒ€,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,14,5,100,4000,10000,yes,target,always,0,,,,,,
+1281,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒZ[ƒWƒ[ƒ€,attack,12,5,1000,3000,10000,no,self,myhpltmaxrate,30,,,,,,
+1281,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒZ[ƒWƒ[ƒ€,attack,12,5,150,3000,10000,no,self,always,0,,,,,,
+1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1281,–‚–@‘ÅŒ‚UŒ‚—ƒZ[ƒWƒ[ƒ€,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,attack,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,14,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1281,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,14,5,100,4000,10000,yes,target,always,0,,,,,,
+1281,ƒoƒbƒNƒXƒeƒbƒv—ƒZ[ƒWƒ[ƒ€,chase,150,1,1000,0,10000,yes,self,skillused,18,,,,,,
+1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,19,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1281,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1281,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒZ[ƒWƒ[ƒ€,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1282,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1282,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1282,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1283,”͈ÍUŒ‚—ƒLƒƒ‰,attack,174,1,800,1500,0,no,target,attackpcge,2,,,,,,
+1283,‰Î‘®«UŒ‚—ƒLƒƒ‰,attack,186,4,200,0,7500,yes,target,always,0,,,,,,
+1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
+1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,100,2500,10000,no,target,always,0,,,,,,
+1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,longrangeattacked,,,,,,,
+1283,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,always,0,,,,,,
+1285,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒK[ƒfƒBƒAƒ“,attack,46,10,200,0,0,yes,target,always,0,,,,,,
+1285,ƒ`ƒƒ[ƒWƒAƒ[—ƒA[ƒ`ƒƒ[ƒK[ƒfƒBƒAƒ“,attack,148,1,200,0,0,yes,target,always,0,,,,,,
+1287,ƒXƒ^ƒ“UŒ‚—ƒ\ƒ‹ƒWƒƒ[ƒK[ƒfƒBƒAƒ“,attack,179,5,200,0,0,yes,target,always,0,,,,,,
+1287,ƒoƒbƒVƒ…—ƒ\ƒ‹ƒWƒƒ[ƒK[ƒfƒBƒAƒ“,attack,5,10,200,0,0,yes,target,always,0,,,,,,
+1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,idle,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1289,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,12,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
+1289,’n‘®«UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,185,2,100,1000,10000,yes,target,always,0,,,,,,
+1289,ƒsƒA[ƒX—ƒ}ƒ„ƒp[ƒvƒ‹,attack,56,8,100,1000,10000,yes,target,always,0,,,,,,
+1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,attack,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
+1289,•K’†UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
+1289,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ}ƒ„ƒp[ƒvƒ‹,attack,57,5,100,1000,10000,yes,target,attackpcge,2,,,,,,
+1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,attack,91,5,100,1500,10000,yes,target,skillused,18,,,,,,
+1289,–hŒä–³Ž‹UŒ‚—ƒ}ƒ„ƒp[ƒvƒ‹,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
+1289,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ}ƒ„ƒp[ƒvƒ‹,attack,114,1,100,1000,10000,yes,self,always,0,,,,,,
+1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,chase,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1289,ƒq[ƒ‹—ƒ}ƒ„ƒp[ƒvƒ‹,chase,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
+1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,chase,91,5,100,1000,10000,yes,target,attackpcge,2,,,,,,
+1289,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ}ƒ„ƒp[ƒvƒ‹,chase,91,5,100,1500,10000,yes,target,skillused,18,,,,,,
+1290,Žæ‚芪‚«¢Š«—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,196,1,1000,0,3600000,no,self,slavele,2,1028,1016,,,,
+1290,”͈ÍUŒ‚—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
+1290,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,136,5,250,1500,0,no,target,always,0,,,,,,
+1290,‘½’iUŒ‚—ƒWƒFƒlƒ‰ƒ‹ƒXƒPƒ‹ƒgƒ“,attack,171,2,250,0,0,no,target,always,0,,,,,,
+1291,ƒCƒ“ƒxƒiƒ€—ƒfƒbƒhƒŠ[ƒŒƒCƒX,attack,52,10,250,1500,0,no,target,always,0,,,,,,
+1291,Žô‚¢UŒ‚—ƒfƒbƒhƒŠ[ƒŒƒCƒX,attack,181,5,250,0,0,no,target,always,0,,,,,,
+1291,ƒOƒŠƒ€ƒgƒD[ƒX—ƒfƒbƒhƒŠ[ƒŒƒCƒX,chase,137,5,200,0,0,no,target,always,0,,,,,,
+1291,‘¬“xŒ¸­—ƒfƒbƒhƒŠ[ƒŒƒCƒX,chase,30,1,50,3000,0,yes,target,always,0,,,,,,
+1292,’§”­—ƒ~ƒjƒfƒ‚,idle,194,1,2,0,0,yes,self,always,0,1,,,,,
+1292,ˆÅ‘®«UŒ‚—ƒ~ƒjƒfƒ‚,attack,190,5,100,0,15000,yes,target,always,0,,,,,,
+1292,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒ~ƒjƒfƒ‚,attack,84,5,250,4000,0,yes,target,always,0,,,,,,
+1292,’¾–ÙUŒ‚—ƒ~ƒjƒfƒ‚,attack,178,5,250,0,0,no,target,always,0,,,,,,
+1292,Žæ‚芪‚«¢Š«—ƒ~ƒjƒfƒ‚,attack,196,2,600,0,3600000,no,self,slavele,2,1109,,,,,
+1292,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ~ƒjƒfƒ‚,chase,209,1,1000,0,3600000,no,self,slavele,2,1109,,,,,
+1292,‰“‹——£UŒ‚—ƒ~ƒjƒfƒ‚,chase,160,1,250,2000,0,yes,target,always,0,,,,,,
+1293,Žæ‚芪‚«¢Š«—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,196,2,1000,0,3600000,no,self,slavele,2,1300,,,,,
+1293,ˆÃˆÅUŒ‚—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,177,5,250,0,0,no,target,always,0,,,,,,
+1293,Žô‚¢UŒ‚—ƒNƒŠ[ƒ~[ƒtƒBƒA[,attack,181,5,250,0,0,no,target,always,0,,,,,,
+1294,Žæ‚芪‚«¢Š«—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,196,2,1000,0,3600000,no,self,slavele,2,1139,,,,,
+1294,–hŒä–³Ž‹UŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,170,5,250,0,0,no,target,always,0,,,,,,
+1294,’n‘®«UŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
+1294,‘½’iUŒ‚—ƒLƒ‰[ƒ}ƒ“ƒeƒBƒX,attack,171,2,250,0,0,no,target,always,0,,,,,,
+1295,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒEƒ‹ƒoƒƒ“,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1295,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒIƒEƒ‹ƒoƒƒ“,attack,209,1,1000,0,3600000,no,self,slavele,2,,,,,,
+1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,7,300,0,2000,yes,target,myhpltmaxrate,30,,,,,,
+1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,1,300,0,2000,yes,target,always,0,,,,,,
+1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,3,200,0,2000,yes,target,always,0,,,,,,
+1295,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒoƒƒ“,attack,20,5,100,0,2000,yes,target,always,0,,,,,,
+1295,Žæ‚芪‚«¢Š«—ƒIƒEƒ‹ƒoƒƒ“,attack,196,2,400,0,3600000,no,self,slavele,2,1320,,,,,
+1296,Žæ‚芪‚«¢Š«—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,idle,196,1,1000,0,3600000,no,self,slavele,2,1133,1134,,1133,,
+1296,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,attack,111,1,250,1500,30000,yes,self,always,0,,,,,,
+1296,–hŒä–³Ž‹UŒ‚—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,attack,170,5,250,0,0,no,target,always,0,,,,,,
+1296,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒRƒ{ƒ‹ƒhƒŠ[ƒ_[,chase,111,1,120,1500,30000,yes,self,always,0,,,,,,
+1297,‘½’iUŒ‚—ƒGƒ“ƒVƒFƒ“ƒgƒ}ƒ~[,attack,171,2,250,0,0,no,target,always,0,,,,,,
+1298,Žæ‚芪‚«¢Š«—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,196,2,1000,0,3600000,no,self,slavele,2,1036,,,,,
+1298,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,57,10,1000,2500,0,no,target,attackpcge,2,,,,,,
+1298,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,57,10,160,2500,0,no,target,always,0,,,,,,
+1298,“ÅUŒ‚—ƒ]ƒ“ƒrƒ}ƒXƒ^[,attack,176,5,250,1000,0,no,target,always,0,,,,,,
+1299,Žæ‚芪‚«¢Š«—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,idle,196,1,10000,0,3600000,no,self,slavele,0,1122,1123,,1125,1126,
+1299,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1299,‘½’iUŒ‚—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,attack,171,1,250,0,0,no,target,always,0,,,,,,
+1299,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒSƒuƒŠƒ“ƒŠ[ƒ_[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1300,ƒCƒ“ƒxƒiƒ€—ƒLƒƒƒ^ƒsƒ‰[,attack,52,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1300,ƒCƒ“ƒxƒiƒ€—ƒLƒƒƒ^ƒsƒ‰[,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
+1300,“Å‘®«UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,188,5,200,0,7500,yes,target,always,0,,,,,,
+1300,Ή»UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,180,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1300,Ή»UŒ‚—ƒLƒƒƒ^ƒsƒ‰[,attack,180,5,100,0,10000,no,target,always,0,,,,,,
+1301,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒ€ƒ€ƒg,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1301,Žæ‚芪‚«¢Š«—ƒAƒ€ƒ€ƒg,attack,196,2,1000,0,3600000,no,self,slavele,2,1077,,,,,
+1301,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒAƒ€ƒ€ƒg,attack,111,1,250,1000,30000,yes,self,always,0,,,,,,
+1301,ˆÅ‘®«UŒ‚—ƒAƒ€ƒ€ƒg,attack,190,5,100,0,15000,yes,target,always,0,,,,,,
+1301,ƒƒ}[ƒiƒCƒg—ƒAƒ€ƒ€ƒg,attack,42,10,250,1500,0,no,target,always,0,,,,,,
+1302,•—‘®«UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,187,5,100,1000,10000,yes,target,always,0,,,,,,
+1302,•K’†UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
+1302,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,18,7,100,1000,10000,yes,target,always,0,,,,,,
+1302,–hŒä–³Ž‹UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
+1302,–‚–@‘ÅŒ‚UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,192,1,100,1000,10000,yes,target,always,0,,,,,,
+1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,83,9,100,1500,10000,yes,target,skillused,18,,,,,,
+1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,83,9,100,1500,10000,yes,target,always,0,,,,,,
+1302,Žô‚¢UŒ‚—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,attack,181,1,100,1000,10000,yes,target,always,0,,,,,,
+1302,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,18,7,100,1000,10000,yes,target,always,0,,,,,,
+1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,83,9,100,1500,10000,yes,target,skillused,18,,,,,,
+1302,ƒƒeƒIƒXƒg[ƒ€—ƒ_[ƒNƒCƒŠƒ…[ƒWƒ‡ƒ“,chase,83,9,100,1500,10000,yes,target,always,0,,,,,,
+1303,ƒXƒ^ƒ“UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,179,5,250,1500,0,no,target,always,0,,,,,,
+1303,•—‘®«UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,187,5,100,0,15000,yes,target,always,0,,,,,,
+1303,–hŒä–³Ž‹UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒz[ƒlƒbƒg,attack,170,1,250,0,0,no,target,always,0,,,,,,
+1304,Žæ‚芪‚«¢Š«—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,196,2,1000,0,3600000,no,self,slavele,2,1100,,,,,
+1304,“Å‘®«UŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,188,5,100,0,15000,yes,target,always,0,,,,,,
+1304,“ÅUŒ‚—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,attack,176,5,250,1000,0,no,target,always,0,,,,,,
+1304,ƒOƒŠƒ€ƒgƒD[ƒX—ƒWƒƒƒCƒAƒ“ƒgƒXƒpƒCƒ_[,chase,137,5,200,0,0,no,target,always,0,,,,,,
+1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,idle,140,10,50,2000,0,no,self,always,0,,,,,,
+1305,Žæ‚芪‚«¢Š«—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,196,2,1000,0,3600000,no,self,slavele,2,1099,,,,,
+1305,ƒCƒ“ƒxƒiƒ€—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,52,10,250,1500,0,no,target,always,0,,,,,,
+1305,“Å‘®«UŒ‚—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,188,5,100,0,15000,yes,target,always,0,,,,,,
+1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,attack,140,10,250,2000,0,yes,target,always,0,,,,,,
+1305,ƒxƒiƒ€ƒ_ƒXƒg—ƒGƒ“ƒVƒFƒ“ƒgƒ[ƒ€,chase,140,10,120,2000,0,no,target,always,0,,,,,,
+1306,ƒXƒ^ƒ“UŒ‚—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,179,5,250,1000,0,no,target,always,0,,,,,,
+1306,’n‘®«UŒ‚—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,185,4,200,0,7500,yes,target,always,0,,,,,,
+1306,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,7,10,1000,1500,0,no,target,attackpcge,2,,,,,,
+1306,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,attack,7,10,400,2000,0,no,target,always,0,,,,,,
+1306,ƒCƒ“ƒfƒ…ƒA—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,chase,8,1,1000,0,0,yes,self,longrangeattacked,,,,,,,
+1306,ƒCƒ“ƒfƒ…ƒA—ƒŒƒCƒuƒIƒ‹ƒ}ƒC,chase,8,1,1000,0,0,yes,self,skillused,18,,,,,,
+1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,idle,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1307,ƒA[ƒXƒXƒpƒCƒN—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,90,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,14,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
+1307,•K’†UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,172,1,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,19,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,–hŒä–³Ž‹UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,170,1,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒƒ}[ƒiƒCƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,42,7,100,1000,10000,yes,target,attackpcge,2,,,,,,
+1307,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,20,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒ‰ƒ“ƒ_ƒ€UŒ‚—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,attack,183,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒA[ƒXƒXƒpƒCƒN—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,90,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒCƒ“ƒfƒ…ƒA—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,8,7,100,1000,10000,yes,self,skillused,18,,,,,,
+1307,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,14,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,28,10,100,1000,10000,yes,friend,friendhpltmaxrate,80,,,,,,
+1307,ƒq[ƒ‹—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,28,10,100,1000,10000,yes,self,myhpltmaxrate,30,,,,,,
+1307,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,19,5,100,1000,10000,yes,target,always,0,,,,,,
+1307,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒLƒƒƒbƒgƒiƒCƒ“ƒeƒCƒ‹,chase,20,5,100,1000,10000,yes,target,always,0,,,,,,
+1308,Žæ‚芪‚«¢Š«—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,idle,196,4,1000,0,3600000,no,self,slavele,2,1258,,,,,
+1308,Ž©”š—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,173,1,50,3000,0,no,self,myhpltmaxrate,40,,,,,,
+1308,•—‘®«UŒ‚—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,187,5,200,0,7500,yes,target,always,0,,,,,,
+1308,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,7,10,1000,2000,0,no,target,attackpcge,2,,,,,,
+1308,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒpƒ“ƒcƒ@[ƒSƒuƒŠƒ“,attack,7,10,400,2000,0,no,target,always,0,,,,,,
+1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1309,Žæ‚芪‚«¢Š«—ƒKƒWƒ‡ƒ}[ƒg,attack,196,2,1000,0,3600000,no,self,slavele,2,1129,,,,,
+1309,öŠo—ƒKƒWƒ‡ƒ}[ƒg,attack,207,3,100,0,10000,yes,target,always,0,,,,,,
+1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1309,‰Î‘®«UŒ‚—ƒKƒWƒ‡ƒ}[ƒg,attack,186,5,200,0,7500,yes,target,always,0,,,,,,
+1309,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒKƒWƒ‡ƒ}[ƒg,attack,7,10,1000,2000,0,no,target,attackpcge,2,,,,,,
+1309,‘½’iUŒ‚—ƒKƒWƒ‡ƒ}[ƒg,attack,171,4,250,1500,0,no,target,always,0,,,,,,
+1309,öŠo—ƒKƒWƒ‡ƒ}[ƒg,chase,207,3,100,0,10000,yes,target,always,0,,,,,,
+1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,chase,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1309,ƒTƒCƒg—ƒKƒWƒ‡ƒ}[ƒg,chase,10,1,100,0,20000,yes,self,always,0,,,,,,
+1309,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒKƒWƒ‡ƒ}[ƒg,chase,7,10,400,2000,0,no,target,always,0,,,,,,
+1310,‰Î‘®«UŒ‚—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,186,5,200,0,7500,yes,target,always,0,,,,,,
+1310,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,110,5,250,3000,10000,no,target,always,0,,,,,,
+1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,attack,91,5,250,2000,0,yes,target,always,0,,,,,,
+1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,chase,91,5,300,2000,0,yes,target,longrangeattacked,,,,,,,
+1310,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,chase,91,5,120,2000,0,yes,target,always,0,,,,,,
+1310,Žæ‚芪‚«¢Š«—‚²‚Á‚‚¢ƒ~ƒmƒ^ƒEƒƒX,idle,196,2,100,1500,40000,no,self,slavele,0,1149,,,,,
+1311,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,209,1,1000,0,3600000,no,self,slavele,2,,,,,,
+1311,ƒXƒ^ƒ“UŒ‚—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,179,5,250,1500,0,no,target,always,0,,,,,,
+1311,’n‘®«UŒ‚—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
+1311,ƒCƒ“ƒfƒ…ƒA—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1311,ƒCƒ“ƒfƒ…ƒA—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1311,‘¬“x‘‰Á—ƒOƒŠƒ“ƒuƒ‹ƒXƒeƒB,chase,29,1,100,1000,0,yes,self,always,0,,,,,,
+1312,ƒeƒŒƒ|[ƒg—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,idle,26,1,10,0,3600000,yes,self,closedattacked,,,,,,,
+1312,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,209,5,700,3000,3600000,no,self,myhpltmaxrate,5,1315,,,,,
+1312,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,86,5,250,1500,10000,no,target,always,0,,,,,,
+1312,ƒXƒ^ƒ“UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,179,5,250,1500,10000,no,target,always,0,,,,,,
+1312,’n‘®«UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,185,5,200,0,7500,yes,target,always,0,,,,,,
+1312,ƒ\ƒjƒbƒNƒuƒ[—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,136,10,300,1500,0,no,target,always,0,,,,,,
+1312,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,196,2,1000,3000,3600000,no,self,slavele,0,1314,1316,1318,1319,,
+1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,196,5,700,3000,3600000,no,self,myhpltmaxrate,40,1315,,,,,
+1312,•K’†UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1312,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,57,10,1000,1500,0,no,target,attackpcge,2,,,,,,
+1312,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,57,10,200,1500,0,no,target,always,0,,,,,,
+1312,–hŒä–³Ž‹UŒ‚—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1312,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1312,Žæ‚芪‚«¢Š«—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,196,2,10000,3000,3600000,no,self,slavele,0,1314,1316,1318,1319,,
+1312,ƒCƒ“ƒfƒ…ƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,8,7,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1312,ƒCƒ“ƒfƒ…ƒA—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,8,7,1000,0,30000,yes,self,skillused,18,,,,,,
+1312,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,86,5,250,1500,10000,no,target,always,0,,,,,,
+1312,‘¬“x‘‰Á—ƒ^[ƒgƒ‹ƒWƒFƒlƒ‰ƒ‹,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1313,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒ“ƒsƒ‰,walk,197,1,15,0,10000,yes,self,always,0,32,,,,,
+1313,»‚Ü‚«—ƒ`ƒ“ƒsƒ‰,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1313,ƒXƒsƒAƒXƒ^ƒu—ƒ`ƒ“ƒsƒ‰,attack,58,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1313,ƒXƒsƒAƒXƒ^ƒu—ƒ`ƒ“ƒsƒ‰,attack,58,5,100,1500,10000,no,target,always,0,,,,,,
+1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,idle,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
+1314,ƒGƒ‚[ƒVƒ‡ƒ“—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1314,öŠo—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,207,5,300,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1314,»‚Ü‚«—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
+1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,attack,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
+1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,chase,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
+1314,ƒq[ƒ‹—ƒp[ƒƒbƒgƒ^[ƒgƒ‹,chase,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
+1315,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,197,1,15,0,10000,yes,self,myhpltmaxrate,5,23,,,,,
+1315,•—‘®«UŒ‚—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1315,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1315,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
+1315,Žæ‚芪‚«¢Š«—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1364,,,,,
+1315,ƒoƒbƒNƒXƒeƒbƒv—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,150,1,1000,1000,0,no,self,myhpltmaxrate,20,,,,,,
+1316,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,9,,,,,
+1316,ƒXƒ^ƒ“UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,179,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1316,ƒXƒ^ƒ“UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1316,”͈ÍUŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,174,1,1000,0,0,yes,target,attackpcge,2,,,,,,
+1316,’n‘®«UŒ‚—ƒ\ƒŠƒbƒhƒ^[ƒgƒ‹,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1317,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒbƒg[,idle,197,1,5,0,10000,yes,self,always,0,1,,,,,
+1317,…‘®«UŒ‚—ƒIƒbƒg[,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
+1317,‘½’iUŒ‚—ƒIƒbƒg[,attack,171,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1317,‘½’iUŒ‚—ƒIƒbƒg[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
+1318,‰Î‘®«UŒ‚—ƒq[ƒgƒ^[ƒgƒ‹,attack,186,3,400,0,7500,yes,target,always,0,,,,,,
+1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,1000,0,10000,no,target,attackpcge,2,,,,,,
+1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1318,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒq[ƒgƒ^[ƒgƒ‹,attack,7,10,100,0,10000,no,target,always,0,,,,,,
+1318,ƒGƒ‚[ƒVƒ‡ƒ“—ƒq[ƒgƒ^[ƒgƒ‹,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1319,ƒGƒ‚[ƒVƒ‡ƒ“—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,walk,197,1,15,0,10000,yes,self,always,0,20,,,,,
+1319,…‘®«UŒ‚—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
+1319,ƒtƒƒXƒgƒ_ƒCƒo[—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,15,10,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1319,ƒtƒƒXƒgƒ_ƒCƒo[—ƒtƒŠ[ƒYƒ^[ƒgƒ‹,attack,15,5,100,1500,10000,no,target,always,0,,,,,,
+1320,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒEƒ‹ƒfƒ…[ƒN,idle,197,1,5,0,10000,yes,self,always,0,9,,,,,
+1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,4,300,0,2000,yes,target,myhpltmaxrate,30,,,,,,
+1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,1,300,0,2000,yes,target,always,0,,,,,,
+1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,2,200,0,2000,yes,target,always,0,,,,,,
+1320,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒIƒEƒ‹ƒfƒ…[ƒN,attack,20,3,100,0,2000,yes,target,always,0,,,,,,
+1321,•—‘®«UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1321,‡–°UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,182,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1321,‡–°UŒ‚—ƒhƒ‰ƒSƒ“ƒeƒCƒ‹,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1322,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,6,,,,,
+1322,’n‘®«UŒ‚—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1322,ƒoƒbƒVƒ…—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,5,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1322,ƒoƒbƒVƒ…—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,attack,5,5,100,1500,10000,no,target,always,0,,,,,,
+1322,ΓŠ‚°—ƒXƒvƒŠƒ“ƒOƒ‰ƒrƒbƒg,chase,152,1,100,0,10000,yes,target,always,0,,,,,,
+1323,ƒGƒ‚[ƒVƒ‡ƒ“—ƒV[ƒIƒbƒ^[,idle,197,1,5,0,10000,yes,self,always,0,22,,,,,
+1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,attack,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1323,…‘®«UŒ‚—ƒV[ƒIƒbƒ^[,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
+1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,chase,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1323,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒV[ƒIƒbƒ^[,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1364,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,197,1,15,0,10000,yes,self,myhpltmaxrate,5,23,,,,,
+1364,•—‘®«UŒ‚—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1364,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1364,ƒ\ƒjƒbƒNƒuƒ[—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
+1364,Žæ‚芪‚«¢Š«—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1364,,,,,
+1364,ƒoƒbƒNƒXƒeƒbƒv—ƒAƒTƒ‹ƒgƒ^[ƒgƒ‹,attack,150,1,1000,1000,0,no,self,myhpltmaxrate,20,,,,,,
+1365,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒAƒ|ƒJƒŠƒvƒX,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
+1365,Ž©”š—ƒAƒ|ƒJƒŠƒvƒX,attack,173,1,50,3000,0,no,self,myhpltmaxrate,30,,,,,,
+1365,‘½’iUŒ‚—ƒAƒ|ƒJƒŠƒvƒX,attack,171,4,250,1500,0,no,target,always,0,,,,,,
+1366,Žæ‚芪‚«¢Š«—ƒ‰[ƒ”ƒ@ƒS[ƒŒƒ€,attack,196,2,1000,0,3600000,no,self,slavele,2,1367,,,,,
+1366,‰Î‘®«UŒ‚—ƒ‰[ƒ”ƒ@ƒS[ƒŒƒ€,attack,186,5,100,0,15000,yes,target,always,0,,,,,,
+1367,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒuƒŒƒCƒU[,attack,17,10,350,0,0,no,target,attackpcge,2,,,,,,
+1367,‰Î‘®«UŒ‚—ƒuƒŒƒCƒU[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
+1367,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒuƒŒƒCƒU[,chase,17,10,350,0,0,no,target,always,0,,,,,,
+1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,idle,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
+1368,‡–°UŒ‚—ƒWƒIƒOƒ‰ƒtƒ@[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,attack,28,10,1000,1500,4000,yes,friend,friendhpltmaxrate,60,,,,,,
+1368,ƒq[ƒ‹—ƒWƒIƒOƒ‰ƒtƒ@[,attack,28,10,1000,0,4000,yes,self,myhpltmaxrate,30,,,,,,
+1369,ƒ\ƒjƒbƒNƒuƒ[—ƒOƒ‰ƒ“ƒyƒR,attack,136,3,10,1500,10000,no,target,always,0,,,,,,
+1369,‘½’iUŒ‚—ƒOƒ‰ƒ“ƒyƒR,attack,171,5,100,0,10000,no,target,always,0,,,,,,
+1370,ƒeƒŒƒ|[ƒg—ƒTƒLƒ…ƒoƒX,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1370,‹zŒŒ—ƒTƒLƒ…ƒoƒX,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1370,ˆÅ‘®«UŒ‚—ƒTƒLƒ…ƒoƒX,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
+1370,‹zŒŒ—ƒTƒLƒ…ƒoƒX,chase,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1371,ˆÃˆÅUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1371,‡–°UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1371,“ÅUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1371,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1371,Žô‚¢UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
+1371,’¾–ÙUŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,178,5,100,0,10000,no,target,always,0,,,,,,
+1371,Ή»UŒ‚—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,180,5,50,0,10000,no,target,always,0,,,,,,
+1371,Žæ‚芪‚«¢Š«—ƒtƒFƒCƒNƒGƒ“ƒWƒFƒ‹,attack,196,2,1000,3000,3600000,no,self,myhpltmaxrate,20,1011,1042,,,,
+1372,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒS[ƒg,attack,111,5,100,0,30000,yes,self,attackpcge,2,,,,,,
+1372,ƒXƒ^ƒ“UŒ‚—ƒS[ƒg,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1372,”͈ÍUŒ‚—ƒS[ƒg,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1372,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒS[ƒg,chase,111,5,100,0,30000,yes,self,always,0,,,,,,
+1372,‘¬“x‘‰Á—ƒS[ƒg,chase,29,5,100,1000,120000,yes,self,always,0,,,,,,
+1373,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒ[ƒhƒIƒuƒfƒX,attack,209,2,10000,3000,3600000,no,self,myhpltmaxrate,5,1298,1290,,,,
+1373,Žæ‚芪‚«¢Š«—ƒ[ƒhƒIƒuƒfƒX,attack,196,2,10000,3000,30000,no,self,slavele,0,1298,1290,,,,
+1373,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ[ƒhƒIƒuƒfƒX,attack,57,5,1000,0,50000,yes,target,attackpcge,2,,,,,,
+1373,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒ[ƒhƒIƒuƒfƒX,attack,57,5,1000,0,100000,yes,target,always,0,,,,,,
+1373,ƒXƒsƒAƒXƒ^ƒu—ƒ[ƒhƒIƒuƒfƒX,attack,58,8,100,0,5000,yes,target,always,0,,,,,,
+1373,ƒXƒsƒAƒXƒ^ƒu—ƒ[ƒhƒIƒuƒfƒX,chase,58,8,100,0,5000,yes,target,always,0,,,,,,
+1373,‘¬“xŒ¸­—ƒ[ƒhƒIƒuƒfƒX,chase,30,1,100,0,10000,yes,target,always,0,,,,,,
+1373,Žæ‚芪‚«¢Š«—ƒ[ƒhƒIƒuƒfƒX,chase,196,2,1000,3000,3600000,no,self,slavele,0,1298,1290,,,,
+1374,ƒeƒŒƒ|[ƒg—ƒCƒ“ƒLƒ…ƒoƒX,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1374,ˆÅ‘®«UŒ‚—ƒCƒ“ƒLƒ…ƒoƒX,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
+1375,‘½’iUŒ‚—ˆê”½–Ø–È,attack,171,3,100,0,10000,no,target,always,0,,,,,,
+1376,‹zŒŒ—ƒn[ƒs[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1376,‘½’iUŒ‚—ƒn[ƒs[,attack,171,3,100,0,10000,no,target,always,0,,,,,,
+1377,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,14,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,attack,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒtƒƒXƒgƒ_ƒCƒo[—ƒGƒ‹ƒ_[,attack,15,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒoƒbƒNƒXƒeƒbƒv—ƒGƒ‹ƒ_[,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1377,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒR[ƒ‹ƒhƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,14,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒGƒ‹ƒ_[,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1377,ƒtƒƒXƒgƒ_ƒCƒo[—ƒGƒ‹ƒ_[,chase,15,5,100,4000,10000,yes,target,always,0,,,,,,
+1378,Ή»UŒ‚—ƒf[ƒ‚ƒ“ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
+1378,ˆÃˆÅUŒ‚—ƒf[ƒ‚ƒ“ƒpƒ“ƒN,attack,177,2,100,0,10000,no,target,always,0,,,,,,
+1379,Žô‚¢UŒ‚—ƒiƒCƒgƒƒAƒeƒ‰[,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
+1379,‹zŒŒ—ƒiƒCƒgƒƒAƒeƒ‰[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1379,‰Î‘®«UŒ‚—ƒiƒCƒgƒƒAƒeƒ‰[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
+1380,‘½’iUŒ‚—ƒhƒŠƒ‰[,attack,171,4,100,0,10000,no,target,always,0,,,,,,
+1380,ƒNƒ[ƒLƒ“ƒO—ƒhƒŠƒ‰[,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1380,ƒNƒ[ƒLƒ“ƒO—ƒhƒŠƒ‰[,chase,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1382,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,17,10,350,0,0,no,target,always,0,,,,,,
+1382,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,19,4,100,3000,10000,no,target,always,0,,,,,,
+1382,ƒsƒA[ƒX—ƒfƒBƒAƒ{ƒŠƒbƒN,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
+1382,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒBƒAƒ{ƒŠƒbƒN,chase,17,10,350,0,0,no,target,always,0,,,,,,
+1383,ƒTƒCƒg—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,idle,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1383,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,7,10,400,2000,0,no,target,always,0,,,,,,
+1383,‹zŒŒ—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1383,‰Î‘®«UŒ‚—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
+1383,ƒTƒCƒg—ƒGƒNƒXƒvƒ[ƒWƒ‡ƒ“,attack,10,1,1000,0,20000,yes,self,skillused,137,,,,,,
+1384,‰Î‘®«UŒ‚—ƒfƒŠ[ƒ^[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
+1384,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒfƒŠ[ƒ^[,attack,7,10,400,2000,0,no,target,always,0,,,,,,
+1384,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,attack,17,10,350,0,0,no,target,always,0,,,,,,
+1384,‘½’iUŒ‚—ƒfƒŠ[ƒ^[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
+1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,attack,83,4,100,1500,10000,yes,target,skillused,18,,,,,,
+1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,attack,83,4,100,1500,10000,yes,target,always,0,,,,,,
+1384,ƒƒeƒIƒXƒg[ƒ€—ƒfƒŠ[ƒ^[,chase,83,4,100,1500,10000,yes,target,always,0,,,,,,
+1384,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,chase,17,10,350,0,0,no,target,always,0,,,,,,
+1385,‰Î‘®«UŒ‚—ƒfƒŠ[ƒ^[,attack,186,3,100,0,15000,yes,target,always,0,,,,,,
+1385,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒfƒŠ[ƒ^[,attack,7,10,400,2000,0,no,target,always,0,,,,,,
+1385,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,attack,17,10,350,0,0,no,target,always,0,,,,,,
+1385,‘½’iUŒ‚—ƒfƒŠ[ƒ^[,attack,171,2,100,0,10000,no,target,always,0,,,,,,
+1385,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒfƒŠ[ƒ^[,attack,18,7,900,0,2000,yes,target,always,0,,,,,,
+1385,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒfƒŠ[ƒ^[,chase,18,7,900,0,2000,yes,target,always,0,,,,,,
+1385,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒfƒŠ[ƒ^[,chase,17,10,350,0,0,no,target,always,0,,,,,,
+1386,‡–°UŒ‚—ƒXƒŠ[ƒp[,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1386,ˆÃˆÅUŒ‚—ƒXƒŠ[ƒp[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1386,ƒNƒ[ƒLƒ“ƒO—ƒXƒŠ[ƒp[,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1386,»‚Ü‚«—ƒXƒŠ[ƒp[,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1387,’n‘®«UŒ‚—ƒMƒO,attack,185,3,100,0,15000,yes,target,always,0,,,,,,
+1387,ƒnƒCƒfƒBƒ“ƒO—ƒMƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1387,ƒCƒ“ƒxƒiƒ€—ƒMƒO,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
+1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,idle,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
+1388,ƒCƒ“ƒeƒBƒ~ƒfƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,219,10,500,0,1000000,no,target,always,0,,,,,,
+1388,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,1000,3000,5000,no,self,slavele,3,,,,,,
+1388,ƒZƒCƒtƒeƒBƒEƒH[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,12,10,120,3000,5000,no,self,always,0,,,,,,
+1388,¹‘®«UŒ‚—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,189,1,200,0,7500,yes,target,always,0,,,,,,
+1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,2500,3000,yes,friend,friendhpltmaxrate,60,,,,,,
+1388,ƒq[ƒ‹—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,28,10,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
+1388,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,156,1,200,0,5000,yes,target,always,0,,,,,,
+1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,3,10000,0,3600000,yes,self,myhpltmaxrate,50,1261,1281,,,,
+1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,attack,196,5,10000,3000,30000,no,self,slavele,0,1267,1246,,,,
+1388,Žæ‚芪‚«¢Š«—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,196,5,1000,3000,3600000,no,self,slavele,0,1267,1246,,,,
+1388,ƒz[ƒŠ[ƒ‰ƒCƒg—ƒA[ƒNƒGƒ“ƒWƒFƒŠƒ“ƒO,chase,156,1,200,0,5000,yes,target,always,0,,,,,,
+1389,ƒeƒŒƒ|[ƒg—ƒhƒ‰ƒLƒ…ƒ‰,idle,26,1,1000,0,100000,yes,self,always,0,,,,,,
+1389,‹zŒŒ—ƒhƒ‰ƒLƒ…ƒ‰,attack,199,5,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1389,¸_”j‰ó—ƒhƒ‰ƒLƒ…ƒ‰,attack,159,5,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1389,ƒNƒ[ƒLƒ“ƒO—ƒhƒ‰ƒLƒ…ƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1389,ƒeƒŒƒ|[ƒg—ƒhƒ‰ƒLƒ…ƒ‰,attack,26,1,10,0,100000,yes,self,always,0,,,,,,
+1389,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,attack,209,6,1000,3000,3600000,no,self,myhpltmaxrate,5,1005,,,,,
+1389,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,attack,196,6,1000,3000,10000,no,self,slavele,0,1005,,,,,
+1389,‘¬“xŒ¸­—ƒhƒ‰ƒLƒ…ƒ‰,attack,30,1,50,3000,120000,yes,target,always,0,,,,,,
+1389,‘½’iUŒ‚—ƒhƒ‰ƒLƒ…ƒ‰,attack,171,7,100,0,10000,no,target,always,0,,,,,,
+1389,‘½’iUŒ‚—ƒhƒ‰ƒLƒ…ƒ‰,attack,171,4,100,0,10000,no,target,always,0,,,,,,
+1389,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒhƒ‰ƒLƒ…ƒ‰,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
+1389,ƒNƒ[ƒLƒ“ƒO—ƒhƒ‰ƒLƒ…ƒ‰,attack,135,1,100,1500,10000,yes,self,always,0,,,,,,
+1389,Žæ‚芪‚«¢Š«—ƒhƒ‰ƒLƒ…ƒ‰,chase,196,6,1000,3000,10000,no,self,slavele,0,1005,,,,,
+1389,ƒOƒŠƒ€ƒgƒD[ƒX—ƒhƒ‰ƒLƒ…ƒ‰,chase,137,5,200,0,0,no,target,always,0,,,,,,
+1390,ˆÃˆÅUŒ‚—ƒ”ƒ@ƒCƒIƒŠ[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1390,ˆÅ‘®«UŒ‚—ƒ”ƒ@ƒCƒIƒŠ[,attack,190,5,200,0,5000,yes,target,always,0,,,,,,
+1390,ƒŒƒbƒNƒXƒfƒBƒr[ƒi—ƒ”ƒ@ƒCƒIƒŠ[,attack,76,5,500,3000,10000,yes,target,always,0,,,,,,
+1390,ƒ_[ƒNƒuƒŒƒX—ƒ”ƒ@ƒCƒIƒŠ[,attack,202,1,1000,0,100000,no,target,always,0,,,,,,
+1390,ƒ_[ƒNƒuƒŒƒX—ƒ”ƒ@ƒCƒIƒŠ[,chase,202,1,1000,0,100000,no,target,always,0,,,,,,
+1391,…‘®«UŒ‚—ƒKƒ‰ƒpƒS,attack,184,3,100,0,15000,yes,target,always,0,,,,,,
+1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,attack,86,3,300,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1391,ƒq[ƒ‹—ƒKƒ‰ƒpƒS,attack,28,5,1000,0,3000,yes,self,myhpltmaxrate,30,,,,,,
+1391,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒKƒ‰ƒpƒS,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1392,‘½’iUŒ‚—ƒ[ƒ^[ƒWƒƒƒCƒ,attack,171,3,100,0,10000,no,target,always,0,,,,,,
+1392,Ž©”š—ƒ[ƒ^[ƒWƒƒƒCƒ,attack,173,1,50,3000,0,no,self,myhpltmaxrate,30,,,,,,
+1395,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1396,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1397,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1398,ƒeƒŒƒ|[ƒg—ƒNƒŠƒXƒ^ƒ‹,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1399,ƒeƒŒƒ|[ƒg—ƒoƒtƒHƒƒbƒg,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1399,ƒ‚ƒ“ƒXƒ^[¢Š«—ƒoƒtƒHƒƒbƒg,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1101,,,,,
+1399,•—‘®«UŒ‚—ƒoƒtƒHƒƒbƒg,attack,187,5,200,0,5000,yes,target,always,0,,,,,,
+1399,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒoƒtƒHƒƒbƒg,attack,60,10,500,3000,300000,no,self,myhpltmaxrate,20,,,,,,
+1399,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,attack,196,4,1000,3000,3600000,no,self,slavele,0,1101,,,,,
+1399,•K’†UŒ‚—ƒoƒtƒHƒƒbƒg,attack,172,1,200,0,5000,yes,target,always,0,,,,,,
+1399,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—ƒoƒtƒHƒƒbƒg,attack,57,5,1000,0,3000,yes,target,attackpcge,2,,,,,,
+1399,–hŒä–³Ž‹UŒ‚—ƒoƒtƒHƒƒbƒg,attack,170,1,200,0,5000,yes,target,always,0,,,,,,
+1399,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒoƒtƒHƒƒbƒg,attack,114,1,100,0,20000,yes,self,always,0,,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,1000,1500,4000,no,target,attackpcge,2,,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,attack,85,10,800,1500,4000,no,target,skillused,0,,,,,,
+1399,Žô‚¢UŒ‚—ƒoƒtƒHƒƒbƒg,attack,181,1,100,0,10000,yes,target,always,0,,,,,,
+1399,‘¬“x‘‰Á—ƒoƒtƒHƒƒbƒg,chase,29,1,500,3000,120000,no,self,myhpltmaxrate,50,,,,,,
+1399,Žæ‚芪‚«¢Š«—ƒoƒtƒHƒƒbƒg,chase,196,4,10000,3000,3600000,no,self,slavele,2,1101,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,attackpcge,2,,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,500,1500,4000,no,target,longrangeattacked,,,,,,,
+1399,ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“—ƒoƒtƒHƒƒbƒg,chase,85,10,800,1500,4000,no,target,skillused,18,,,,,,
+1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,attack,86,2,100,3000,10000,yes,target,always,0,,,,,,
+1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,attack,86,2,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1400,öŠo—ƒJƒ‰ŽP,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
+1400,ƒEƒH[ƒ^[ƒ{[ƒ‹—ƒJƒ‰ŽP,chase,86,2,100,3000,10000,yes,target,always,0,,,,,,
+1401,ƒeƒŒƒ|[ƒg—ƒJƒuƒL”EŽÒ,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1401,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—ƒJƒuƒL”EŽÒ,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
+1401,ƒoƒbƒNƒXƒeƒbƒv—ƒJƒuƒL”EŽÒ,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1401,ƒXƒ^ƒ“UŒ‚—ƒJƒuƒL”EŽÒ,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1402,“ÅUŒ‚—‘åŒûŠ^,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1402,ƒCƒ“ƒxƒiƒ€—‘åŒûŠ^,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
+1403,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—eŠï•º,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1403,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—eŠï•º,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1404,ˆÃˆÅUŒ‚—‰ëlŒ`,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1404,Žô‚¢UŒ‚—‰ëlŒ`,attack,181,5,100,0,10000,yes,target,always,0,,,,,,
+1404,’¾–ÙUŒ‚—‰ëlŒ`,attack,178,5,100,0,10000,no,target,always,0,,,,,,
+1405,ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv—Žð“V‹ç,idle,123,5,50,1500,100000,yes,self,always,0,,,,,,
+1405,ƒvƒƒ{ƒbƒN—Žð“V‹ç,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
+1405,‘½’iUŒ‚—Žð“V‹ç,attack,171,3,100,0,10000,no,target,always,0,,,,,,
+1405,ƒA[ƒXƒXƒpƒCƒN—Žð“V‹ç,attack,90,5,500,1500,2000,no,target,always,0,,,,,,
+1405,ƒA[ƒXƒXƒpƒCƒN—Žð“V‹ç,chase,90,5,500,1500,2000,no,target,always,0,,,,,,
+1405,ƒvƒƒ{ƒbƒN—Žð“V‹ç,chase,6,8,100,0,10000,yes,target,always,0,,,,,,
+1406,‹zŒŒ—‰Í“¶,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1406,ƒEƒH[ƒ^[ƒ{[ƒ‹—‰Í“¶,attack,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1406,ƒEƒH[ƒ^[ƒ{[ƒ‹—‰Í“¶,chase,86,3,100,2000,10000,yes,target,always,0,,,,,,
+1408,‡–°UŒ‚—ƒpƒsƒˆƒ“,attack,182,5,100,0,10000,no,target,always,0,,,,,,
+1408,ƒsƒA[ƒX—ƒpƒsƒˆƒ“,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
+1408,‹zŒŒ—ƒpƒsƒˆƒ“,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1409,•—‘®«UŒ‚—’cŽq“¶Žq,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1410,ƒq[ƒ‹—l–Ê“Ž÷,any,28,10,1000,300,3000,no,self,myhpltmaxrate,90,,,,,,
+1410,ƒq[ƒ‹—l–Ê“Ž÷,any,28,10,1000,300,3000,no,friend,friendhpltmaxrate,60,,,,,,
+1412,ˆÃˆÅUŒ‚—“VŽõål,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1412,ƒeƒŒƒ|[ƒg—“VŽõål,attack,26,1,20,1000,100000,yes,self,always,0,,,,,,
+1412,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—“VŽõål,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1412,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—“VŽõål,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1415,–hŒä–³Ž‹UŒ‚—ƒRƒE,attack,170,5,250,0,0,no,target,always,0,,,,,,
+1416,ƒq[ƒ‹—“Vå–ºX,attack,28,5,1000,0,3000,yes,self,myhpltmaxrate,50,,,,,,
+1416,ƒsƒA[ƒX—“Vå–ºX,attack,56,8,100,0,3000,yes,target,always,0,,,,,,
+1417,–hŒä–³Ž‹UŒ‚—ƒ`ƒƒƒbƒL[,attack,170,5,250,0,0,no,target,always,0,,,,,,
+1417,ƒXƒ^ƒ“UŒ‚—ƒ`ƒƒƒbƒL[,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1418,ƒeƒŒƒ|[ƒg—•ŽÖ‰¤,idle,26,1,100,0,100000,yes,self,always,0,,,,,,
+1418,ƒ‚ƒ“ƒXƒ^[¢Š«—•ŽÖ‰¤,attack,209,4,1000,3000,3600000,no,self,myhpltmaxrate,5,1412,,,,,
+1418,Žæ‚芪‚«¢Š«—•ŽÖ‰¤,attack,196,4,1000,3000,3600000,no,self,slavele,0,1412,,,,,
+1418,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—•ŽÖ‰¤,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
+1418,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—•ŽÖ‰¤,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1418,”͈ÍUŒ‚—•ŽÖ‰¤,attack,174,1,1000,0,10000,no,target,attackpcge,2,,,,,,
+1418,ˆÃˆÅUŒ‚—•ŽÖ‰¤,attack,177,5,33,0,10000,no,target,always,0,,,,,,
+1418,ƒ_[ƒNƒuƒŒƒX—•ŽÖ‰¤,attack,202,5,500,0,100000,no,target,always,0,,,,,,
+1418,ƒtƒƒXƒgƒ_ƒCƒo[—•ŽÖ‰¤,attack,15,10,800,1500,10000,no,target,skillused,18,,,,,,
+1418,ƒtƒƒXƒgƒ_ƒCƒo[—•ŽÖ‰¤,chase,15,10,800,1500,10000,no,target,skillused,18,,,,,,
+1418,ƒ_[ƒNƒuƒŒƒX—•ŽÖ‰¤,chase,202,5,500,0,100000,no,target,always,0,,,,,,
+1418,Žæ‚芪‚«¢Š«—•ŽÖ‰¤,chase,196,4,10000,3000,3600000,no,self,slavele,2,1412,,,,,
+1419,ˆÅ‘®«UŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,190,1,100,0,15000,yes,target,always,0,,,,,,
+1419,ˆÃˆÅUŒ‚—ƒtƒ@ƒ~ƒŠƒA[,attack,177,3,100,0,10000,no,target,always,0,,,,,,
+1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1420,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒA[ƒ`ƒƒ[ƒXƒPƒ‹ƒgƒ“,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1421,ˆÅ‘®«UŒ‚—ƒCƒVƒX,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1421,‘¬“x‘‰Á—ƒCƒVƒX,chase,29,1,100,1000,120000,yes,self,always,0,,,,,,
+1422,‹zŒŒ—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1422,•—‘®«UŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,187,2,200,0,7500,yes,target,always,0,,,,,,
+1422,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1422,‘½’iUŒ‚—ƒnƒ“ƒ^[ƒtƒ‰ƒC,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1422,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
+1422,‰Î‘®«•Ï‰»—ƒnƒ“ƒ^[ƒtƒ‰ƒC,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1423,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1423,“ÅUŒ‚—ƒO[ƒ‹,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1424,“Å‘®«UŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
+1424,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
+1424,ƒsƒA[ƒX—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
+1424,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,150,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1424,“ÅUŒ‚—ƒTƒCƒhƒƒCƒ“ƒ_[,attack,176,5,50,1000,10000,no,target,always,0,,,,,,
+1425,…‘®«UŒ‚—ƒIƒ{ƒ“ƒk,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1425,ƒGƒ‚[ƒVƒ‡ƒ“—ƒIƒ{ƒ“ƒk,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1426,…‘®«UŒ‚—ƒ}ƒ‹ƒN,attack,184,2,200,0,7500,yes,target,always,0,,,,,,
+1427,”O‘®«UŒ‚—ƒiƒCƒgƒƒA,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
+1427,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,150,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1427,Žô‚¢UŒ‚—ƒiƒCƒgƒƒA,attack,181,5,50,0,10000,no,target,always,0,,,,,,
+1427,‘¬“x‘‰Á—ƒiƒCƒgƒƒA,chase,29,1,50,1000,120000,yes,self,always,0,,,,,,
+1428,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1428,“Å‘®«UŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1428,“ÅUŒ‚—ƒ|ƒCƒYƒ“ƒXƒ|ƒA,attack,176,4,100,1000,10000,no,target,always,0,,,,,,
+1429,ƒCƒ“ƒxƒiƒ€—ƒAƒ‹ƒMƒIƒy,attack,52,5,100,1500,10000,no,target,always,0,,,,,,
+1429,“Å‘®«UŒ‚—ƒAƒ‹ƒMƒIƒy,attack,188,2,100,0,15000,yes,target,always,0,,,,,,
+1429,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,attack,140,5,100,2000,20000,no,target,always,0,,,,,,
+1429,ƒxƒiƒ€ƒ_ƒXƒg—ƒAƒ‹ƒMƒIƒy,chase,140,5,100,2000,20000,no,target,always,0,,,,,,
+1430,“Å‘®«UŒ‚—ƒAƒ‹ƒSƒX,attack,188,1,100,0,15000,yes,target,always,0,,,,,,
+1430,“ÅUŒ‚—ƒAƒ‹ƒSƒX,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1431,öŠo—ƒoƒtƒHƒƒbƒgJr.,attack,207,1,100,0,10000,yes,target,always,0,,,,,,
+1431,ˆÅ‘®«UŒ‚—ƒoƒtƒHƒƒbƒgJr.,attack,190,3,100,0,15000,yes,target,always,0,,,,,,
+1431,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒoƒtƒHƒƒbƒgJr.,chase,111,1,10,3000,30000,yes,self,always,0,,,,,,
+1431,öŠo—ƒoƒtƒHƒƒbƒgJr.,chase,207,1,100,0,10000,yes,target,always,0,,,,,,
+1432,»‚Ü‚«—ƒfƒU[ƒgƒEƒ‹ƒt,attack,149,1,100,0,10000,yes,target,always,0,,,,,,
+1432,‰Î‘®«UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1432,–hŒä–³Ž‹UŒ‚—ƒfƒU[ƒgƒEƒ‹ƒt,attack,170,1,100,0,10000,no,target,always,0,,,,,,
+1432,ƒGƒ‚[ƒVƒ‡ƒ“—ƒfƒU[ƒgƒEƒ‹ƒt,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1433,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,attack,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1433,ˆÅ‘®«UŒ‚—ƒfƒrƒ‹ƒ`,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,attack,84,1,50,4000,10000,yes,target,always,0,,,,,,
+1433,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒfƒrƒ‹ƒ`,chase,200,1,50,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1433,‰“‹——£UŒ‚—ƒfƒrƒ‹ƒ`,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
+1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,longrangeattacked,,,,,,,
+1433,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒfƒrƒ‹ƒ`,chase,84,1,50,4000,10000,yes,target,always,0,,,,,,
+1434,‹zŒŒ—ƒhƒŒƒCƒ“ƒŠƒA[,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1434,ˆÅ‘®«UŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,190,1,200,0,7500,yes,target,always,0,,,,,,
+1434,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1434,ˆÃˆÅUŒ‚—ƒhƒŒƒCƒ“ƒŠƒA[,attack,177,5,100,0,10000,no,target,always,0,,,,,,
+1435,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,91,4,100,4000,10000,no,target,always,0,,,,,,
+1435,Ή»UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,180,5,50,0,10000,no,target,always,0,,,,,,
+1435,Žô‚¢UŒ‚—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,attack,181,5,50,0,10000,no,target,always,0,,,,,,
+1435,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,300,4000,10000,no,target,longrangeattacked,,,,,,,
+1435,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒCƒrƒ‹ƒhƒ‹ƒCƒh,chase,91,4,100,4000,10000,no,target,always,0,,,,,,
+1436,‰Î‘®«UŒ‚—ƒWƒƒƒbƒN,attack,186,2,200,0,7500,yes,target,always,0,,,,,,
+1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,300,4000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,attack,19,4,100,4000,10000,yes,target,always,0,,,,,,
+1436,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,attack,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1436,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒƒƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1436,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒWƒƒƒbƒN,chase,19,4,100,4000,10000,yes,target,always,0,,,,,,
+1436,•—‘®«•Ï‰»—ƒWƒƒƒbƒN,chase,165,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1437,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1437,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,attack,92,5,50,0,10000,yes,target,always,0,,,,,,
+1437,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,attack,13,10,50,1000,5000,yes,target,always,0,,,,,,
+1437,•—‘®«UŒ‚—ƒWƒ‡[ƒJ[,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1437,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,attack,161,1,1000,1000,30000,no,self,always,0,,,,,,
+1437,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,attack,17,7,50,4000,10000,yes,target,always,0,,,,,,
+1437,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,attack,15,6,50,4000,10000,yes,target,always,0,,,,,,
+1437,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,attack,91,4,50,4000,10000,no,target,always,0,,,,,,
+1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,attack,84,5,50,4000,10000,yes,target,always,0,,,,,,
+1437,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒWƒ‡[ƒJ[,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1437,ƒNƒ@ƒOƒ}ƒCƒA—ƒWƒ‡[ƒJ[,chase,92,5,50,0,10000,yes,target,always,0,,,,,,
+1437,ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN—ƒWƒ‡[ƒJ[,chase,13,10,50,1000,5000,yes,target,always,0,,,,,,
+1437,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒWƒ‡[ƒJ[,chase,161,1,1000,1000,30000,no,self,always,0,,,,,,
+1437,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒWƒ‡[ƒJ[,chase,17,7,50,4000,10000,yes,target,always,0,,,,,,
+1437,ƒtƒƒXƒgƒ_ƒCƒo[—ƒWƒ‡[ƒJ[,chase,15,6,50,4000,10000,yes,target,always,0,,,,,,
+1437,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒWƒ‡[ƒJ[,chase,91,4,50,2500,10000,no,target,always,0,,,,,,
+1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,longrangeattacked,,,,,,,
+1437,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒWƒ‡[ƒJ[,chase,84,5,50,4000,10000,yes,target,always,0,,,,,,
+1438,”͈ÍUŒ‚—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1438,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒJ[ƒŠƒbƒcƒo[ƒO,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1438,ƒOƒŠƒ€ƒgƒD[ƒX—ƒJ[ƒŠƒbƒcƒo[ƒO,chase,137,5,300,0,0,no,target,always,0,,,,,,
+1439,‹i‰Œ—ƒnƒCƒI[ƒN,idle,195,1,10,0,0,yes,self,always,0,,,,,,
+1439,‰Î‘®«UŒ‚—ƒnƒCƒI[ƒN,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1439,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1439,ƒoƒbƒVƒ…—ƒnƒCƒI[ƒN,attack,5,3,100,1500,10000,yes,target,always,0,,,,,,
+1439,ƒGƒ‚[ƒVƒ‡ƒ“—ƒnƒCƒI[ƒN,chase,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1440,•—‘®«UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1440,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1440,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1440,•K’†UŒ‚—ƒXƒeƒ€ƒ[ƒ€,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1440,‰Î‘®«•Ï‰»—ƒXƒeƒ€ƒ[ƒ€,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1441,‹zŒŒ—ƒyƒmƒƒi,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1441,“Å‘®«UŒ‚—ƒyƒmƒƒi,attack,188,3,100,0,15000,yes,target,always,0,,,,,,
+1441,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1441,‘½’iUŒ‚—ƒyƒmƒƒi,attack,171,3,100,1500,10000,no,target,always,0,,,,,,
+1442,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1442,ƒXƒsƒAƒXƒ^ƒu—ƒTƒXƒJƒbƒ`,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
+1442,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,attack,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1442,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,longrangeattacked,,,,,,,
+1442,ƒCƒ“ƒfƒ…ƒA—ƒTƒXƒJƒbƒ`,chase,8,1,1000,0,30000,yes,self,skillused,18,,,,,,
+1442,ƒGƒ‚[ƒVƒ‡ƒ“—ƒTƒXƒJƒbƒ`,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1442,…‘®«•Ï‰»—ƒTƒXƒJƒbƒ`,chase,162,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1443,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1443,‘½’iUŒ‚—ƒNƒ‹[ƒU[,attack,171,1,300,0,10000,no,target,always,0,,,,,,
+1443,ƒGƒ‚[ƒVƒ‡ƒ“—ƒNƒ‹[ƒU[,chase,197,1,15,0,10000,yes,self,always,0,27,,,,,
+1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,idle,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1444,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ`ƒFƒyƒbƒg,attack,197,1,15,0,10000,yes,self,always,0,17,,,,,
+1444,‰Î‘®«UŒ‚—ƒ`ƒFƒyƒbƒg,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,100,3000,0,yes,target,always,0,,,,,,
+1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,attack,18,10,300,3000,0,yes,target,always,0,,,,,,
+1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,28,5,1000,2500,7000,yes,friend,friendhpltmaxrate,60,,,,,,
+1444,ƒq[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,28,5,1000,0,7000,yes,self,myhpltmaxrate,30,,,,,,
+1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,100,3000,0,yes,target,always,0,,,,,,
+1444,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ`ƒFƒyƒbƒg,chase,18,10,300,3000,0,yes,target,always,0,,,,,,
+1445,•—‘®«UŒ‚—ƒŒƒOƒ‹ƒ,attack,187,1,100,0,15000,yes,target,always,0,,,,,,
+1445,‘½’iUŒ‚—ƒŒƒOƒ‹ƒ,attack,171,4,100,1500,10000,no,target,always,0,,,,,,
+1446,ˆÅ‘®«UŒ‚—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1446,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1446,ƒ\ƒjƒbƒNƒuƒ[—ƒCƒ“ƒWƒƒƒXƒeƒBƒX,attack,136,3,100,1500,10000,no,target,always,0,,,,,,
+1447,•—‘®«UŒ‚—ƒOƒŠƒtƒHƒ“,attack,187,4,200,0,7500,yes,target,always,0,,,,,,
+1447,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,600,800,0,no,target,myhpltmaxrate,30,,,,,,
+1447,ƒsƒA[ƒX—ƒOƒŠƒtƒHƒ“,attack,56,1,200,800,0,no,target,always,0,,,,,,
+1448,‹zŒŒ—ƒ_[ƒNƒtƒŒ[ƒ€,attack,199,1,300,0,10000,yes,target,myhpltmaxrate,70,,,,,,
+1448,ˆÅ‘®«UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1448,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1448,ˆÃˆÅUŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,177,5,33,0,10000,no,target,always,0,,,,,,
+1448,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1448,Ή»UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,180,5,33,0,10000,no,target,always,0,,,,,,
+1448,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,99,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1448,Žô‚¢UŒ‚—ƒ_[ƒNƒtƒŒ[ƒ€,attack,181,5,33,0,10000,no,target,always,0,,,,,,
+1449,‰Î‘®«UŒ‚—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
+1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,17,7,100,0,0,yes,target,always,0,,,,,,
+1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,800,800,0,no,target,attackpcge,2,,,,,,
+1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
+1449,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,attack,7,7,100,800,0,no,target,always,0,,,,,,
+1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,300,0,0,yes,target,myhpltmaxrate,30,,,,,,
+1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,800,0,0,yes,target,longrangeattacked,,,,,,,
+1449,ƒtƒ@ƒCƒA[ƒ{[ƒ‹—ƒ~ƒ…[ƒ^ƒ“ƒgƒhƒ‰ƒSƒ“,chase,17,7,100,0,0,yes,target,always,0,,,,,,
+1450,ƒGƒ‚[ƒVƒ‡ƒ“—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1450,ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv—ƒEƒBƒ“ƒhƒS[ƒXƒg,idle,118,2,50,1500,160000,yes,self,always,0,,,,,,
+1450,•—‘®«UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,187,3,200,0,7500,yes,target,always,0,,,,,,
+1450,–‚–@‘ÅŒ‚UŒ‚—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,84,3,100,4000,10000,yes,target,always,0,,,,,,
+1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
+1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,attack,20,1,100,4000,10000,yes,target,always,0,,,,,,
+1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,300,4000,10000,no,target,myhpltmaxrate,30,,,,,,
+1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1450,ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,84,3,100,4000,10000,yes,target,always,0,,,,,,
+1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,longrangeattacked,,,,,,,
+1450,ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg—ƒEƒBƒ“ƒhƒS[ƒXƒg,chase,20,5,100,4000,10000,yes,target,always,0,,,,,,
+1451,…‘®«UŒ‚—”¼‹™l,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
+1451,ƒsƒA[ƒX—”¼‹™l,attack,56,1,150,1500,5000,no,target,myhpltmaxrate,30,,,,,,
+1451,ƒsƒA[ƒX—”¼‹™l,attack,56,1,50,1500,5000,no,target,always,0,,,,,,
+1451,’n‘®«•Ï‰»—”¼‹™l,attack,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1451,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,150,2000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1451,‰“‹——£UŒ‚—”¼‹™l,chase,160,1,50,2000,10000,yes,target,always,0,,,,,,
+1451,’n‘®«•Ï‰»—”¼‹™l,chase,163,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1452,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒŒƒfƒB,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1452,’n‘®«UŒ‚—ƒI[ƒNƒŒƒfƒB,attack,185,2,200,0,7500,yes,target,always,0,,,,,,
+1453,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,300,2000,10000,no,target,myhpltmaxrate,30,,,,,,
+1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,attack,148,1,100,2000,10000,no,target,always,0,,,,,,
+1453,ƒ`ƒƒ[ƒWƒAƒ[—ƒŒƒCƒhƒŠƒbƒNƒA[ƒ`ƒƒ[,chase,148,1,100,2000,10000,no,target,always,0,,,,,,
+1454,’n‘®«UŒ‚—ŽO—tå³,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1455,ƒGƒ‚[ƒVƒ‡ƒ“—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1455,‰Î‘®«UŒ‚—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,attack,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1455,ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO—ƒRƒ{ƒ‹ƒhƒA[ƒ`ƒƒ[,chase,46,1,100,1500,10000,yes,target,always,0,,,,,,
+1456,”͈ÍUŒ‚—ƒLƒƒ‰,attack,174,1,800,1500,0,no,target,attackpcge,2,,,,,,
+1456,‰Î‘®«UŒ‚—ƒLƒƒ‰,attack,186,4,200,0,7500,yes,target,always,0,,,,,,
+1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
+1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,attack,91,5,100,2500,10000,no,target,always,0,,,,,,
+1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,longrangeattacked,,,,,,,
+1456,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒLƒƒ‰,chase,91,5,100,2500,10000,no,target,always,0,,,,,,
+1457,’n‘®«UŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,185,1,100,0,15000,yes,target,always,0,,,,,,
+1457,‘½’iUŒ‚—ƒ}ƒ“ƒeƒBƒX,attack,171,1,100,0,10000,no,target,always,0,,,,,,
+1458,‰Î‘®«UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,186,2,100,0,15000,yes,target,always,0,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,attack,18,3,100,3000,10000,yes,target,always,0,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1458,–‚–@‘ÅŒ‚UŒ‚—ƒ}ƒ‹ƒhƒD[ƒN,attack,192,1,100,0,10000,no,target,always,0,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒ‹ƒhƒD[ƒN,chase,18,3,100,3000,10000,yes,target,always,0,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,300,4000,10000,yes,target,longrangeattacked,,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,300,4000,10000,yes,target,longrangeattacked,,,,,,,
+1458,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒ}ƒ‹ƒhƒD[ƒN,chase,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1459,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ}ƒŠƒIƒlƒbƒg,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1459,ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv—ƒ}ƒŠƒIƒlƒbƒg,idle,121,5,50,1500,30000,yes,self,always,0,,,,,,
+1459,”O‘®«UŒ‚—ƒ}ƒŠƒIƒlƒbƒg,attack,191,5,200,0,7500,yes,target,always,0,,,,,,
+1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,attack,18,4,100,3000,10000,yes,target,always,0,,,,,,
+1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,300,3000,10000,yes,target,myhpltmaxrate,30,,,,,,
+1459,ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹—ƒ}ƒŠƒIƒlƒbƒg,chase,18,4,100,3000,10000,yes,target,always,0,,,,,,
+1460,ˆÅ‘®«UŒ‚—ƒ}[ƒ^[,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1460,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,attack,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1460,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1460,ƒ\ƒjƒbƒNƒuƒ[—ƒ}[ƒ^[,attack,136,1,100,1500,10000,no,target,always,0,,,,,,
+1460,‰Î‘®«•Ï‰»—ƒ}[ƒ^[,chase,164,1,1000,1000,300000,no,self,myhpltmaxrate,50,,,,,,
+1461,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒmƒ^ƒEƒƒX,attack,197,1,15,0,10000,yes,self,always,0,,,,,,
+1461,‰Î‘®«UŒ‚—ƒ~ƒmƒ^ƒEƒƒX,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1461,ƒnƒ“ƒ}[ƒtƒH[ƒ‹—ƒ~ƒmƒ^ƒEƒƒX,attack,110,3,250,3000,10000,no,target,always,0,,,,,,
+1461,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒ~ƒmƒ^ƒEƒƒX,attack,91,3,100,2000,10000,yes,target,always,0,,,,,,
+1462,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1462,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,attack,170,3,100,0,10000,no,target,always,0,,,,,,
+1462,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,chase,91,3,300,2000,10000,yes,target,longrangeattacked,,,,,,,
+1462,ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu—ƒI[ƒNƒXƒPƒ‹ƒgƒ“,chase,91,3,100,2000,10000,yes,target,always,0,,,,,,
+1463,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1463,–hŒä–³Ž‹UŒ‚—ƒI[ƒNƒ]ƒ“ƒr,attack,170,3,100,0,10000,no,target,always,0,,,,,,
+1464,ƒoƒbƒVƒ…—ƒpƒTƒi,attack,5,10,500,0,5000,yes,target,always,0,,,,,,
+1464,‘½’iUŒ‚—ƒpƒTƒi,attack,171,3,500,0,10000,yes,target,always,0,,,,,,
+1464,–hŒä–³Ž‹UŒ‚—ƒpƒTƒi,attack,170,3,800,0,10000,no,target,always,0,,,,,,
+1465,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1465,•—‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1465,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
+1465,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
+1466,ƒGƒ‚[ƒVƒ‡ƒ“—ƒvƒeƒBƒbƒg,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1466,’n‘®«UŒ‚—ƒvƒeƒBƒbƒg,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1466,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,casttargeted,,,,,,,
+1466,ƒiƒp[ƒ€ƒr[ƒg—ƒvƒeƒBƒbƒg,chase,11,10,120,1000,10000,yes,target,always,0,,,,,,
+1467,ˆÅ‘®«UŒ‚—ƒŒƒCƒhƒŠƒbƒN,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,150,1000,40000,yes,self,myhpltmaxrate,30,,,,,,
+1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,attack,114,1,50,1000,40000,yes,self,always,0,,,,,,
+1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1467,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒŒƒCƒhƒŠƒbƒN,attack,7,6,50,1500,10000,no,target,always,0,,,,,,
+1467,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒCƒhƒŠƒbƒN,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1467,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒŒƒCƒhƒŠƒbƒN,chase,114,1,50,1000,40000,yes,self,always,0,,,,,,
+1468,ƒGƒ‚[ƒVƒ‡ƒ“—ƒŒƒNƒCƒGƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
+1468,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1468,ƒXƒ^ƒ“UŒ‚—ƒŒƒNƒCƒGƒ€,attack,179,4,100,1500,10000,no,target,always,0,,,,,,
+1468,ˆÅ‘®«UŒ‚—ƒŒƒNƒCƒGƒ€,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1469,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒPƒ‹ƒ[ƒJ[,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1470,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ[ƒƒ€,walk,197,1,15,0,10000,yes,self,always,0,19,,,,,
+1470,‰Î‘®«UŒ‚—ƒ[ƒƒ€,attack,186,1,100,0,15000,yes,target,always,0,,,,,,
+1471,‰Î‘®«UŒ‚—‹ã”öŒÏ,attack,186,3,200,0,7500,yes,target,always,0,,,,,,
+1471,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1471,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—‹ã”öŒÏ,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1472,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,1000,1500,30000,no,target,myhpltmaxrate,30,,,,,,
+1472,ƒXƒsƒAƒXƒ^ƒu—ƒ{ƒ“ƒSƒ“,attack,58,1,100,1500,10000,no,target,always,0,,,,,,
+1472,ƒoƒbƒNƒXƒeƒbƒv—ƒ{ƒ“ƒSƒ“,attack,150,1,1000,0,60000,yes,self,myhpltmaxrate,30,,,,,,
+1473,ƒAƒ“ƒNƒ‹ƒXƒlƒA—ƒI[ƒNƒA[ƒ`ƒƒ[,idle,117,5,50,1500,50000,yes,self,always,0,,,,,,
+1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,1000,1500,10000,yes,target,attackpcge,2,,,,,,
+1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,300,1500,10000,yes,target,myhpltmaxrate,30,,,,,,
+1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,47,5,100,1500,10000,yes,target,always,0,,,,,,
+1473,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,197,1,15,0,10000,yes,self,always,0,6,,,,,
+1473,’n‘®«UŒ‚—ƒI[ƒNƒA[ƒ`ƒƒ[,attack,185,2,100,0,15000,yes,target,always,0,,,,,,
+1473,ƒAƒ[ƒVƒƒƒ[—ƒI[ƒNƒA[ƒ`ƒƒ[,chase,47,5,100,1500,10000,yes,target,always,0,,,,,,
+1474,ƒGƒ‚[ƒVƒ‡ƒ“—ƒ~ƒ~ƒbƒN,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1474,‹zŒŒ—ƒ~ƒ~ƒbƒN,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1475,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,attack,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1475,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1475,Žô‚¢UŒ‚—ƒŒƒCƒX,attack,181,5,100,0,10000,no,target,always,0,,,,,,
+1475,ƒGƒiƒW[ƒhƒŒƒCƒ“—ƒŒƒCƒX,chase,200,1,1000,2000,10000,yes,target,myhpltmaxrate,70,,,,,,
+1476,”͈ÍUŒ‚—ƒAƒ‰[ƒ€,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
+1477,’n‘®«UŒ‚—ƒAƒNƒ‰ƒEƒX,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1478,‹zŒŒ—ƒ‰ƒCƒhƒ[ƒh,attack,199,1,100,0,0,yes,target,myhpltmaxrate,70,,,,,,
+1478,–hŒä–³Ž‹UŒ‚—ƒ‰ƒCƒhƒ[ƒh,attack,170,2,100,0,10000,no,target,always,0,,,,,,
+1479,”͈ÍUŒ‚—ƒXƒPƒ‹ƒvƒŠƒYƒi[,attack,174,1,1000,1500,0,no,target,attackpcge,2,,,,,,
+1480,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,300,1000,10000,no,target,myhpltmaxrate,30,,,,,,
+1480,“ÅUŒ‚—ƒ]ƒ“ƒrƒvƒŠƒYƒi[,attack,176,5,100,1000,10000,no,target,always,0,,,,,,
+1481,•—‘®«UŒ‚—ƒpƒ“ƒN,attack,187,2,100,0,15000,yes,target,always,0,,,,,,
+1481,Ή»UŒ‚—ƒpƒ“ƒN,attack,180,5,100,0,10000,no,target,always,0,,,,,,
+1482,ƒ\ƒjƒbƒNƒuƒ[—ƒWƒ‹ƒ^ƒX,attack,136,7,250,1500,10000,no,target,always,0,,,,,,
+1482,•K’†UŒ‚—ƒWƒ‹ƒ^ƒX,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1482,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,attack,6,10,50,1000,30000,yes,target,always,0,,,,,,
+1482,ƒGƒ‚[ƒVƒ‡ƒ“—ƒWƒ‹ƒ^ƒX,chase,197,1,15,0,10000,yes,self,always,0,,,,,,
+1482,ƒvƒƒ{ƒbƒN—ƒWƒ‹ƒ^ƒX,chase,6,10,100,1000,30000,yes,target,always,0,,,,,,
+1483,“Å‘®«UŒ‚—ƒŠƒrƒI,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
+1483,ƒvƒƒ{ƒbƒN—ƒŠƒrƒI,attack,6,8,100,0,10000,yes,target,always,0,,,,,,
+1483,ƒ\ƒjƒbƒNƒuƒ[—ƒŠƒrƒI,attack,136,5,10,1500,10000,no,target,always,0,,,,,,
+1484,ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg—ƒtƒFƒ“ƒ_[ƒN,attack,19,5,100,4000,10000,yes,target,always,0,,,,,,
+1484,ƒXƒ^ƒ“UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,179,5,100,1500,10000,no,target,always,0,,,,,,
+1484,“Å‘®«UŒ‚—ƒtƒFƒ“ƒ_[ƒN,attack,188,4,100,0,15000,yes,target,always,0,,,,,,
+1485,ˆÅ‘®«UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
+1485,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1485,•K’†UŒ‚—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,172,1,100,1500,10000,no,target,always,0,,,,,,
+1485,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1485,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒ~ƒXƒeƒ‹ƒeƒCƒ“,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1486,ˆÅ‘®«UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,190,4,200,0,7500,yes,target,always,0,,,,,,
+1486,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,300,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1486,ƒ\ƒjƒbƒNƒuƒ[—ƒI[ƒKƒgƒD[ƒX,attack,136,5,100,1500,10000,no,target,always,0,,,,,,
+1486,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,300,0,10000,no,target,myhpltmaxrate,30,,,,,,
+1486,–hŒä–³Ž‹UŒ‚—ƒI[ƒKƒgƒD[ƒX,attack,170,2,100,0,10000,no,target,always,0,,,,,,
+1486,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1486,ƒGƒ‚[ƒVƒ‡ƒ“—ƒI[ƒKƒgƒD[ƒX,chase,197,1,15,0,10000,yes,self,always,0,29,,,,,
+1486,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒI[ƒKƒgƒD[ƒX,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1487,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
+1487,ƒI[ƒgƒJƒEƒ“ƒ^[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
+1487,ˆÅ‘®«UŒ‚—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,190,3,200,0,7500,yes,target,always,0,,,,,,
+1487,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,attack,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,myhpltmaxrate,30,,,,,,
+1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,300,3000,5000,no,target,longrangeattacked,,,,,,,
+1487,ƒXƒsƒAƒu[ƒƒ‰ƒ“—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,59,7,100,3000,5000,no,target,always,0,,,,,,
+1487,ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[—ƒGƒNƒXƒLƒ…[ƒVƒ‡ƒi[,chase,114,1,100,1000,40000,yes,self,always,0,,,,,,
+1488,ƒGƒ‚[ƒVƒ‡ƒ“—ƒAƒmƒŠƒAƒ“,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1488,…‘®«UŒ‚—ƒAƒmƒŠƒAƒ“,attack,184,3,200,0,7500,yes,target,always,0,,,,,,
+1489,ƒGƒ‚[ƒVƒ‡ƒ“—ƒXƒeƒBƒ“ƒO,walk,197,1,15,0,10000,yes,self,always,0,,,,,,
+1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,150,0,10000,yes,target,myhpltmaxrate,30,,,,,,
+1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,attack,92,2,50,500,10000,yes,target,always,0,,,,,,
+1489,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,150,1500,10000,no,target,myhpltmaxrate,30,,,,,,
+1489,ƒXƒsƒAƒXƒ^ƒu—ƒXƒeƒBƒ“ƒO,attack,58,1,50,1500,10000,no,target,always,0,,,,,,
+1489,’n‘®«UŒ‚—ƒXƒeƒBƒ“ƒO,attack,185,3,200,0,7500,yes,target,always,0,,,,,,
+1489,ƒnƒCƒfƒBƒ“ƒO—ƒXƒeƒBƒ“ƒO,attack,51,1,300,1000,20000,yes,self,myhpltmaxrate,30,,,,,,
+1489,ƒNƒ@ƒOƒ}ƒCƒA—ƒXƒeƒBƒ“ƒO,chase,92,5,50,500,10000,yes,target,always,0,,,,,,
+1490,ƒGƒ‚[ƒVƒ‡ƒ“—œfœr‚¤ŽÒ,idle,197,1,5,0,10000,yes,self,always,0,,,,,,
+1490,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,300,0,5000,yes,self,myhpltmaxrate,30,,,,,,
+1490,ƒI[ƒgƒJƒEƒ“ƒ^[—œfœr‚¤ŽÒ,attack,61,5,100,0,5000,yes,self,always,0,,,,,,
+1490,”͈ÍUŒ‚—œfœr‚¤ŽÒ,attack,174,1,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1490,•—‘®«UŒ‚—œfœr‚¤ŽÒ,attack,187,4,100,0,15000,yes,target,always,0,,,,,,
+1491,ƒGƒ‚[ƒVƒ‡ƒ“—ƒhƒPƒr,walk,197,1,15,0,10000,yes,self,always,0,2,,,,,
+1491,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,attack,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1491,ˆÅ‘®«UŒ‚—ƒhƒPƒr,attack,190,2,100,0,15000,yes,target,always,0,,,,,,
+1491,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,attack,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1491,ƒƒ}[ƒiƒCƒg—ƒhƒPƒr,attack,42,5,300,2500,10000,no,target,myhpltmaxrate,30,,,,,,
+1491,ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…—ƒhƒPƒr,chase,111,1,100,1500,30000,yes,self,always,0,,,,,,
+1491,ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»—ƒhƒPƒr,chase,161,1,1000,1000,30000,no,self,myhpltmaxrate,80,,,,,,
+1492,ƒ‚ƒ“ƒXƒ^[¢Š«—‰…—ì•Žm,attack,209,5,1000,3000,3600000,no,self,myhpltmaxrate,5,1401,,,,,
+1492,Žæ‚芪‚«¢Š«—‰…—ì•Žm,attack,196,5,1000,3000,10000,no,self,slavele,0,1405,,,,,
+1492,”͈ÍUŒ‚—‰…—ì•Žm,attack,174,1,1000,0,10000,no,target,attackpcge,2,,,,,,
+1492,ˆÃˆÅUŒ‚—‰…—ì•Žm,attack,177,10,100,0,10000,no,target,always,0,,,,,,
+1492,ƒXƒ^ƒ“UŒ‚—‰…—ì•Žm,attack,179,10,100,1500,10000,no,target,always,0,,,,,,
+1492,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—‰…—ì•Žm,attack,60,10,500,3000,300000,yes,self,myhpltmaxrate,20,,,,,,
+1492,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—‰…—ì•Žm,attack,57,5,1000,0,50000,yes,target,attackpcge,2,,,,,,
+1492,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA—‰…—ì•Žm,attack,57,5,1000,0,50000,yes,target,always,0,,,,,,
+1492,Žæ‚芪‚«¢Š«—‰…—ì•Žm,chase,196,5,10000,3000,10000,no,self,slavele,2,1405,,,,,
+1499,ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“—ƒE[ƒ^ƒ“ƒtƒ@ƒCƒ^[,attack,60,6,300,3000,300000,no,self,myhpltmaxrate,30,,,,,,
+1499,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN—ƒE[ƒ^ƒ“ƒtƒ@ƒCƒ^[,attack,7,5,1000,1500,10000,no,target,attackpcge,2,,,,,,
+1511,Žæ‚芪‚«¢Š«—ƒAƒ‚ƒ“ƒ‰[,any,196,10,3000,5000,2000,no,around1,slavele,0,1132,1194,,,,
+
+// ** eAthena Developers ** //
+// Valaris
+//MOB_ID, Skill name, STATE, SKILL_ID, SKILL_LV, the rate of 10,000th of a minute, cast time, delay, the disturbance possibility of, Target, when to cast, a condition value, Mob Id, a value 2, a value 3, a value 4, 5/of values, a dummy character sequence: Or that it is good to put in an intelligible
+1900,Summon Worshippers,attack,196,4,500,3000,3600000,no,self,slavele,0,1901,,,,,
+1900,Sonic Blow,attack,136,10,300,0,0,no,target,always,0,,,,,,
+1900,Venom Dust,attack,140,10,400,0,0,no,target,always,0,,,,,,
+1900,Envenom,attack,52,10,500,0,10000,no,target,always,0,,,,,,
+1900,Grimtooth,chase,137,5,2500,0,0,no,target,always,0,,,,,,
+// Valaris's Worshipper
+1901,Envenom,attack,52,10,500,0,10000,no,target,always,0,,,,,,
+
+// Easter Bunny
+1921,Summon Minions,attack,196,5,1000,3000,10000,no,self,slavele,2,1063,,,,,
1921,Lay Easter Eggs,idle,209,5,500,2000,40000,no,self,always,2,1920,,,,, \ No newline at end of file
diff --git a/db/packet_db.txt b/db/packet_db.txt
index d660629d0..e555bcb59 100644
--- a/db/packet_db.txt
+++ b/db/packet_db.txt
@@ -1,576 +1,576 @@
-//The packet database allows you to add support for new clients, because packets change every release.
-//This only allows 1 type of client at a time, make sure your client is the last one in the list
-//EX: You have client 628 and it goes up to 1021, delete or comment (use //) till your client is last.
-
-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
-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
-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,useskilltopos,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,0
-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
-0x01fa,48
-0x01fb,56
-0x01fc,-1
-0x01fd,4
-0x01fe,5
-0x01ff,10
-0x0200,26
-0x0201,-1
-0x0202,26
-0x0203,10
-0x0204,18
-0x0205,26
-0x0206,11
-0x0207,34
-0x0208,14
-0x0209,36
-0x020a,10
-0x020b,0
-0x020c,0
-0x020d,-1
-0x020e,24
-0x020f,0
-//jRO‚Í‚±‚±‚Ü‚Å
-
-//2004-07-06kRO
-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,useskilltopos,4:9:11:13:15
-
-//2004-07-13kRO
-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,useskilltopos,7:9:15:17:19
-
-//2004-07-26kRO
-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,useskilltopos,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
-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,useskilltopos,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
-//0x0072,20,useitem,9:20
-0x007e,19,movetokafra,3:15
-0x0085,23,actionrequest,9:22
-0x0089,9,walktoxy,6
-0x008c,105,useskilltopos,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
-0x0072,18,useitem,10:14
-0x007e,25,movetokafra,6:21
-0x0085,9,actionrequest,3:8
-0x0089,14,walktoxy,11
-0x008c,109,useskilltopos,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
-0x0072,17,useitem,6:13
-0x007e,16,movetokafra,5:12
-0x0089,6,walktoxy,3
-0x008c,103,useskilltopos,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
-0x0072,13,useitem,5:9
-0x007e,13,movetokafra,6:9
-0x0085,15,actionrequest,4:14
-0x008c,108,useskilltopos,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
-0x0215,6
-0x0143,23,npcamountinput,2:6
-0x0145,19
+//The packet database allows you to add support for new clients, because packets change every release.
+//This only allows 1 type of client at a time, make sure your client is the last one in the list
+//EX: You have client 628 and it goes up to 1021, delete or comment (use //) till your client is last.
+
+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
+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
+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,useskilltopos,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,0
+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
+0x01fa,48
+0x01fb,56
+0x01fc,-1
+0x01fd,4
+0x01fe,5
+0x01ff,10
+0x0200,26
+0x0201,-1
+0x0202,26
+0x0203,10
+0x0204,18
+0x0205,26
+0x0206,11
+0x0207,34
+0x0208,14
+0x0209,36
+0x020a,10
+0x020b,0
+0x020c,0
+0x020d,-1
+0x020e,24
+0x020f,0
+//jRO‚Í‚±‚±‚Ü‚Å
+
+//2004-07-06kRO
+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,useskilltopos,4:9:11:13:15
+
+//2004-07-13kRO
+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,useskilltopos,7:9:15:17:19
+
+//2004-07-26kRO
+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,useskilltopos,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
+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,useskilltopos,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
+//0x0072,20,useitem,9:20
+0x007e,19,movetokafra,3:15
+0x0085,23,actionrequest,9:22
+0x0089,9,walktoxy,6
+0x008c,105,useskilltopos,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
+0x0072,18,useitem,10:14
+0x007e,25,movetokafra,6:21
+0x0085,9,actionrequest,3:8
+0x0089,14,walktoxy,11
+0x008c,109,useskilltopos,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
+0x0072,17,useitem,6:13
+0x007e,16,movetokafra,5:12
+0x0089,6,walktoxy,3
+0x008c,103,useskilltopos,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
+0x0072,13,useitem,5:9
+0x007e,13,movetokafra,6:9
+0x0085,15,actionrequest,4:14
+0x008c,108,useskilltopos,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
+0x0215,6
+0x0143,23,npcamountinput,2:6
+0x0145,19
//0x01f9,6,adopt,5 \ No newline at end of file
diff --git a/db/pet_db.txt b/db/pet_db.txt
index 3dfe3f41e..99ed77c7c 100644
--- a/db/pet_db.txt
+++ b/db/pet_db.txt
@@ -1,30 +1,30 @@
-// MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDeray ,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
-// When modifying pet skills, DO NOT give a pet more than one pet skill (but you can give them other normal bonuses) or else it will be very problematic.
-
-1002,PORING,Poring,619,9001,10013,531,80,20,50,100,250,20,2000,400,1,0,100,100,100,{ petloot 10; }
-1011,CHONCHON,ChonChon,624,9006,10002,537,80,10,30,100,250,20,1500,200,1,0,100,100,100,{ petskillbonus bAgi,4,10,50; }
-1014,SPORE,Spore,630,9012,10017,537,80,20,30,100,250,20,1500,200,0,0,100,100,100,{ petrecovery SC_Poison,60; }
-1019,PECOPECO,PecoPeco,632,9014,10010,537,80,15,30,100,250,20,1000,200,1,0,100,100,100,{ petskillbonus bSpeedRate,25,20,20; }
-1023,ORC_WARRIOR,Orc Warrior,635,9017,10009,537,80,12,20,100,250,20,500,200,1,0,100,100,100,{ petskillattack 158,100,1,1; }
-1026,MUNAK,Munak,636,9018,10008,537,80,20,20,100,250,20,500,200,0,0,100,100,100,{ petskillattack 190,444,1,1; }
-1029,ISIS,Isis,639,9021,10006,537,80,20,10,100,250,20,500,200,0,0,100,100,100,{ petmag 50,50,2,60; }
-1031,POPORING,Poporing,621,9003,10013,511,80,12,30,100,250,20,1000,300,1,0,100,100,100,{ petloot 15; }
-1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,12,10,100,250,20,500,150,1,0,100,100,100,{ petskillattack 187,888,1,1;}
-1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,12,20,100,250,20,1000,150,1,0,100,100,100,{ petskillbonus bAgiVit,4,10,10; }
-1049,PICKY,Picky,623,9005,10012,507,80,15,40,100,250,20,2000,200,1,0,100,100,100,{ petskillbonus bStr,4,10,50;}
-1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,200,0,0,100,100,100,{ petskillbonus bAllStats,1,10,10;}
-1056,SMOKIE,Smokie,633,9015,10019,537,80,15,30,100,250,20,1000,200,1,0,100,100,100,{ bonus bPerfectHide,1; }
-1057,YOYO,Yoyo,634,9016,10018,532,80,12,20,100,250,20,1000,200,1,0,100,100,100,{ petloot 20; }
-1063,LUNATIC,Lunatic,622,9004,10007,534,80,15,40,100,250,20,1500,200,0,0,100,100,100,{ petskillbonus bLuk,3,10,50; }
-1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,20,20,100,250,20,1000,200,0,0,100,100,100,{ petskillattack 176,20,1,1; }
-1101,BAPHOMET_Jr,Baphomet Jr.,642,9024,10001,518,80,30,10,100,250,20,200,100,0,0,100,100,100,{ petskillattack 190,1776,1,2; }
-1107,DESERT_WOLF_B,Desert Wolf Puppy,628,9010,10003,537,80,10,40,100,250,20,1000,300,0,0,100,100,100,{petskillattack 6,1,1,1;}
-1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,30,10,100,250,20,500,150,0,0,100,100,100,{ petskillbonus bAgiDexStr,6,20,10; }
-1110,DOKEBI,Dokebi,637,9019,10005,537,80,15,20,100,250,20,500,250,0,0,100,100,100,{ petskillattack 110,1,1,1; }
-1113,DROPS,Drops,620,9002,10013,508,80,15,40,100,250,20,1500,400,1,0,100,100,100,{ petloot 10; }
-1155,PETIT,Petit,640,9022,10011,537,80,15,20,100,250,20,500,200,0,0,100,100,100,{ petskillattack 91,500,1,1; }
-1167,SAVAGE_BABE,Savage Babe,627,9009,10015,537,80,9,40,100,250,20,1500,400,0,0,100,100,100,{ petskillbonus bStr,3,10,50; }
-1170,SOHEE,Sohee,638,9020,10016,537,80,20,10,100,250,20,500,300,0,0,100,2000,200,{ petheal 33,400,60; }
-1188,BON_GUN,Bon Gun,659,9025,10020,537,80,20,10,100,250,20,500,200,1,0,100,100,100,{ petskillattack 190,555,1,1; }
-1200,ZHERLTHSH,Zherlthsh,660,9027,0,929,80,20,10,100,250,20,50,200,0,1029,2000,100,500,{}
-1275,ALICE,Alice,661,9026,0,504,80,20,10,100,250,20,100,200,0,1170,100,2000,200,{}
+// MobID,Name,JName,ItemID,EggID,AcceID,FoodID,Fullness,HungryDeray ,R_Hungry,R_Full,Intimate,Die,Capture,Speed,S_Performance,talk_convert_class,attack_rate,defence_attack_rate,change_target_rate,pet_script
+// When modifying pet skills, DO NOT give a pet more than one pet skill (but you can give them other normal bonuses) or else it will be very problematic.
+
+1002,PORING,Poring,619,9001,10013,531,80,20,50,100,250,20,2000,400,1,0,100,100,100,{ petloot 10; }
+1011,CHONCHON,ChonChon,624,9006,10002,537,80,10,30,100,250,20,1500,200,1,0,100,100,100,{ petskillbonus bAgi,4,10,50; }
+1014,SPORE,Spore,630,9012,10017,537,80,20,30,100,250,20,1500,200,0,0,100,100,100,{ petrecovery SC_Poison,60; }
+1019,PECOPECO,PecoPeco,632,9014,10010,537,80,15,30,100,250,20,1000,200,1,0,100,100,100,{ petskillbonus bSpeedRate,25,20,20; }
+1023,ORC_WARRIOR,Orc Warrior,635,9017,10009,537,80,12,20,100,250,20,500,200,1,0,100,100,100,{ petskillattack 158,100,1,1; }
+1026,MUNAK,Munak,636,9018,10008,537,80,20,20,100,250,20,500,200,0,0,100,100,100,{ petskillattack 190,444,1,1; }
+1029,ISIS,Isis,639,9021,10006,537,80,20,10,100,250,20,500,200,0,0,100,100,100,{ petmag 50,50,2,60; }
+1031,POPORING,Poporing,621,9003,10013,511,80,12,30,100,250,20,1000,300,1,0,100,100,100,{ petloot 15; }
+1035,HUNTER_FLY,Hunter Fly,626,9008,10002,716,80,12,10,100,250,20,500,150,1,0,100,100,100,{ petskillattack 187,888,1,1;}
+1042,STEEL_CHONCHON,Steel ChonChon,625,9007,10002,1002,80,12,20,100,250,20,1000,150,1,0,100,100,100,{ petskillbonus bAgiVit,4,10,10; }
+1049,PICKY,Picky,623,9005,10012,507,80,15,40,100,250,20,2000,200,1,0,100,100,100,{ petskillbonus bStr,4,10,50;}
+1052,ROCKER,Rocker,629,9011,10014,537,80,60,30,100,250,20,1500,200,0,0,100,100,100,{ petskillbonus bAllStats,1,10,10;}
+1056,SMOKIE,Smokie,633,9015,10019,537,80,15,30,100,250,20,1000,200,1,0,100,100,100,{ bonus bPerfectHide,1; }
+1057,YOYO,Yoyo,634,9016,10018,532,80,12,20,100,250,20,1000,200,1,0,100,100,100,{ petloot 20; }
+1063,LUNATIC,Lunatic,622,9004,10007,534,80,15,40,100,250,20,1500,200,0,0,100,100,100,{ petskillbonus bLuk,3,10,50; }
+1077,POISON_SPORE,Poison Spore,631,9013,10017,537,80,20,20,100,250,20,1000,200,0,0,100,100,100,{ petskillattack 176,20,1,1; }
+1101,BAPHOMET_Jr,Baphomet Jr.,642,9024,10001,518,80,30,10,100,250,20,200,100,0,0,100,100,100,{ petskillattack 190,1776,1,2; }
+1107,DESERT_WOLF_B,Desert Wolf Puppy,628,9010,10003,537,80,10,40,100,250,20,1000,300,0,0,100,100,100,{petskillattack 6,1,1,1;}
+1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,30,10,100,250,20,500,150,0,0,100,100,100,{ petskillbonus bAgiDexStr,6,20,10; }
+1110,DOKEBI,Dokebi,637,9019,10005,537,80,15,20,100,250,20,500,250,0,0,100,100,100,{ petskillattack 110,1,1,1; }
+1113,DROPS,Drops,620,9002,10013,508,80,15,40,100,250,20,1500,400,1,0,100,100,100,{ petloot 10; }
+1155,PETIT,Petit,640,9022,10011,537,80,15,20,100,250,20,500,200,0,0,100,100,100,{ petskillattack 91,500,1,1; }
+1167,SAVAGE_BABE,Savage Babe,627,9009,10015,537,80,9,40,100,250,20,1500,400,0,0,100,100,100,{ petskillbonus bStr,3,10,50; }
+1170,SOHEE,Sohee,638,9020,10016,537,80,20,10,100,250,20,500,300,0,0,100,2000,200,{ petheal 33,400,60; }
+1188,BON_GUN,Bon Gun,659,9025,10020,537,80,20,10,100,250,20,500,200,1,0,100,100,100,{ petskillattack 190,555,1,1; }
+1200,ZHERLTHSH,Zherlthsh,660,9027,0,929,80,20,10,100,250,20,50,200,0,1029,2000,100,500,{}
+1275,ALICE,Alice,661,9026,0,504,80,20,10,100,250,20,100,200,0,1170,100,2000,200,{}
diff --git a/db/produce_db.txt b/db/produce_db.txt
index 1acaa2d7b..64ef52fef 100644
--- a/db/produce_db.txt
+++ b/db/produce_db.txt
@@ -1,100 +1,100 @@
-//ID,ItemLV,RequireSkill,MaterialID1,MaterialAmount1,MaterialID2,MaterialAmount2,MaterialID3,MaterialAmount3,MaterialID4,MaterialAmount4,MaterialID5,MaterialAmount5
-//If MaterialAmount = 0, then u just need that item in your inventory (books)
-
-// Stones and Metals ItemLV=16
-998,16,94,1002,1
-999,16,95,998,5,1003,1
-1000,16,96,1001,10
-994,16,96,990,10
-995,16,96,991,10
-997,16,96,993,10
-996,16,96,992,10
-984,16,97,756,3,1003,1
-985,16,97,757,3,1003,1
-// Weapon ItemLV=wLV
-1101,1,99,998,2
-1104,1,99,998,30
-1107,1,99,998,45,913,25
-1110,2,99,999,20
-1113,2,99,999,35
-1122,2,99,999,40,920,50
-1126,3,99,999,5,984,8,727,1
-1123,3,99,984,8,999,10,728,1
-1119,3,99,984,8,999,15,718,1
-1129,3,99,984,16,724,1
-1201,1,98,998,1,909,10
-1204,1,98,998,25
-1207,1,98,998,50
-1210,2,98,999,17
-1213,2,98,999,30
-1216,2,98,999,40
-1219,3,98,984,4,999,40,726,1
-1222,3,98,984,4,999,60,729,1
-1116,1,100,998,35,958,15
-1151,2,100,999,25,957,20
-1154,2,100,999,45
-1157,2,100,984,12,999,10
-1160,3,100,984,12,999,20
-1163,3,100,984,16,999,20,733,1
-1301,1,101,998,10
-1351,1,101,998,110
-1354,2,101,999,30
-1357,3,101,984,4,999,20,922,30
-1360,3,101,984,8,999,10,719,1
-1501,1,102,998,3
-1504,1,102,998,30
-1507,2,102,999,20
-1510,2,102,999,33
-1519,2,102,999,45
-1513,3,102,999,85,730,1
-1516,3,102,999,100,963,20
-1522,3,102,999,120,968,1
-1801,1,103,998,160,722,1
-1803,2,103,999,50
-1805,2,103,999,65
-1807,3,103,984,4,723,10
-1809,3,103,984,8,728,10
-1811,3,103,984,4,727,10
-1401,1,104,998,3
-1404,1,104,998,35
-1407,1,104,998,70
-1451,2,104,999,25
-1454,2,104,999,40
-1457,2,104,999,55
-1460,3,104,984,8,999,10,720,5
-1463,3,104,984,12,999,10
-1410,3,104,984,12,723,3,923,1
-// Potions ItemLV=32 MaterialID1=»‘¢‚Ì‘
-501,32,228,7144,0,507,1,1093,1
-503,32,228,7144,0,508,1,1093,1
-504,32,228,7144,0,509,1,1093,1
-505,32,228,7144,0,510,1,911,1,1093,1
-//Condensed Red Potion
-545,32,228,7133,0,501,1,1093,1,952,1
-//Condensed Yellow Potion
-546,32,228,7133,0,503,1,1093,1,1017,1
-//Condensed White Potion
-547,32,228,7133,0,504,1,1093,1,1061,1
-//Anodyne
-605,32,228,7144,0,708,1,970,1,713,1
-//Aloevera
-606,32,228,7144,0,704,1,518,1,713,1
-//Alcohol
-970,32,228,7127,0,713,1,7033,5,905,5,1092,1
-//Fire Bottle
-7135,32,228,7128,0,970,1,1059,1,713,1
-//Hydrobolic Acid Bottle
-7136,32,228,7129,0,713,1,929,1
-//Water Bottle (Plant Bottle)
-7137,32,228,7130,0,713,1,1032,2
-//Mine Bottle
-7138,32,228,7131,0,713,1,1050,1,1051,1
-//Coating Wax
-7139,32,228,7132,0,970,1,950,1,1044,1,713,1
-// Monetary ItemLV=64
-//Gold Coin
-671,64,385,7231,1
-//Silver Coin
-675,64,385,7232,1
-//Mysterious Ore Coin <- Mysterious Ore
-674,64,385,7233,1
+//ID,ItemLV,RequireSkill,MaterialID1,MaterialAmount1,MaterialID2,MaterialAmount2,MaterialID3,MaterialAmount3,MaterialID4,MaterialAmount4,MaterialID5,MaterialAmount5
+//If MaterialAmount = 0, then u just need that item in your inventory (books)
+
+// Stones and Metals ItemLV=16
+998,16,94,1002,1
+999,16,95,998,5,1003,1
+1000,16,96,1001,10
+994,16,96,990,10
+995,16,96,991,10
+997,16,96,993,10
+996,16,96,992,10
+984,16,97,756,3,1003,1
+985,16,97,757,3,1003,1
+// Weapon ItemLV=wLV
+1101,1,99,998,2
+1104,1,99,998,30
+1107,1,99,998,45,913,25
+1110,2,99,999,20
+1113,2,99,999,35
+1122,2,99,999,40,920,50
+1126,3,99,999,5,984,8,727,1
+1123,3,99,984,8,999,10,728,1
+1119,3,99,984,8,999,15,718,1
+1129,3,99,984,16,724,1
+1201,1,98,998,1,909,10
+1204,1,98,998,25
+1207,1,98,998,50
+1210,2,98,999,17
+1213,2,98,999,30
+1216,2,98,999,40
+1219,3,98,984,4,999,40,726,1
+1222,3,98,984,4,999,60,729,1
+1116,1,100,998,35,958,15
+1151,2,100,999,25,957,20
+1154,2,100,999,45
+1157,2,100,984,12,999,10
+1160,3,100,984,12,999,20
+1163,3,100,984,16,999,20,733,1
+1301,1,101,998,10
+1351,1,101,998,110
+1354,2,101,999,30
+1357,3,101,984,4,999,20,922,30
+1360,3,101,984,8,999,10,719,1
+1501,1,102,998,3
+1504,1,102,998,30
+1507,2,102,999,20
+1510,2,102,999,33
+1519,2,102,999,45
+1513,3,102,999,85,730,1
+1516,3,102,999,100,963,20
+1522,3,102,999,120,968,1
+1801,1,103,998,160,722,1
+1803,2,103,999,50
+1805,2,103,999,65
+1807,3,103,984,4,723,10
+1809,3,103,984,8,728,10
+1811,3,103,984,4,727,10
+1401,1,104,998,3
+1404,1,104,998,35
+1407,1,104,998,70
+1451,2,104,999,25
+1454,2,104,999,40
+1457,2,104,999,55
+1460,3,104,984,8,999,10,720,5
+1463,3,104,984,12,999,10
+1410,3,104,984,12,723,3,923,1
+// Potions ItemLV=32 MaterialID1=»‘¢‚Ì‘
+501,32,228,7144,0,507,1,1093,1
+503,32,228,7144,0,508,1,1093,1
+504,32,228,7144,0,509,1,1093,1
+505,32,228,7144,0,510,1,911,1,1093,1
+//Condensed Red Potion
+545,32,228,7133,0,501,1,1093,1,952,1
+//Condensed Yellow Potion
+546,32,228,7133,0,503,1,1093,1,1017,1
+//Condensed White Potion
+547,32,228,7133,0,504,1,1093,1,1061,1
+//Anodyne
+605,32,228,7144,0,708,1,970,1,713,1
+//Aloevera
+606,32,228,7144,0,704,1,518,1,713,1
+//Alcohol
+970,32,228,7127,0,713,1,7033,5,905,5,1092,1
+//Fire Bottle
+7135,32,228,7128,0,970,1,1059,1,713,1
+//Hydrobolic Acid Bottle
+7136,32,228,7129,0,713,1,929,1
+//Water Bottle (Plant Bottle)
+7137,32,228,7130,0,713,1,1032,2
+//Mine Bottle
+7138,32,228,7131,0,713,1,1050,1,1051,1
+//Coating Wax
+7139,32,228,7132,0,970,1,950,1,1044,1,713,1
+// Monetary ItemLV=64
+//Gold Coin
+671,64,385,7231,1
+//Silver Coin
+675,64,385,7232,1
+//Mysterious Ore Coin <- Mysterious Ore
+674,64,385,7233,1
diff --git a/db/refine_db.txt b/db/refine_db.txt
index 0bf3aded1..f1b44f3f8 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,14,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,14,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 e115ec3bf..4235c1616 100644
--- a/db/size_fix.txt
+++ b/db/size_fix.txt
@@ -1,7 +1,7 @@
-// Database for size fix for weapon damage.
-
-//It is size compensation at the time of usual.
-//Base,a dagger, a sword, both swords, a spear, both spears, an ax, both axes, a stick, ?, a cane, a bow, a fist, a musical instrument, a whip, a book, Qatar
-100,100, 75, 75, 75, 75, 50, 50, 75,100,100,100,100, 75, 75,100, 75, // Size: Small
-100, 75,100, 75, 75, 75, 75, 75,100,100,100,100, 75,100,100,100,100, // Size: Medium
+// Database for size fix for weapon damage.
+
+//It is size compensation at the time of usual.
+//Base,a dagger, a sword, both swords, a spear, both spears, an ax, both axes, a stick, ?, a cane, a bow, a fist, a musical instrument, a whip, a book, Qatar
+100,100, 75, 75, 75, 75, 50, 50, 75,100,100,100,100, 75, 75,100, 75, // Size: Small
+100, 75,100, 75, 75, 75, 75, 75,100,100,100,100, 75,100,100,100,100, // Size: Medium
100, 50, 75,100,100,100,100,100,100,100,100, 75, 50, 75, 50, 50, 75, // Size: Large \ No newline at end of file
diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt
index cbb0286bb..df80a6ee3 100644
--- a/db/skill_cast_db.txt
+++ b/db/skill_cast_db.txt
@@ -1,269 +1,269 @@
-//skill_cast_db.txt—AthenaDBŒv‰æ 2004/06/16 03:04:01 +0900 (JST)
-//id,cast_list,delay_list,upkeep_time,upkeep_time2
-
-6,0,0,30000,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
-
-8,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
-
-10,0,0,10000,0 //MG_SIGHT#ƒTƒCƒg#
-11,500,1000,0,0 //MG_NAPALMBEAT#ƒiƒp[ƒ€ƒr[ƒg#
-12,4000:3500:3500:2500:2000:1500:1000:1000:1000:1000,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-13,500,1200:1400:1600:1800:2000:2200:2400:2600:2800:2700,0,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-14,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_COLDBOLT#ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-15,800,1500,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo[#
-16,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //MG_STONECURSE#ƒXƒg[ƒ“ƒJ[ƒX#
-17,1600,1600,0,0 //MG_FIREBALL#ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-18,2000:1850:1700:1550:1400:1250:1100:950:800:650,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //MG_FIREWALL#ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-19,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-20,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,0,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-
-24,0,0,10000,0 //AL_RUWACH#ƒ‹ƒAƒt#
-25,0,0,10000,0 //AL_PNEUMA#ƒjƒ…[ƒ}#
-26,0,0,0,0 //AL_TELEPORT#ƒeƒŒƒ|[ƒg#
-27,1000,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //AL_WARP#ƒ[ƒvƒ|[ƒ^ƒ‹#
-28,0,1000,0,0 //AL_HEAL#ƒq[ƒ‹#
-29,1000,1000,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AL_INCAGI#‘¬“x‘‰Á#
-30,1000,1000,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000,0 //AL_DECAGI#‘¬“xŒ¸­#
-31,0,2000,0,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-32,500,2000,0,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-33,500,3500,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
-34,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
-35,0,1000,0,0 //AL_CURE#ƒLƒ…ƒA[#
-
-45,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AC_CONCENTRATION#W’†—ÍŒüã#
-46,0,1500,100,0 //AC_DOUBLE
-47,0,1500,100,0 //AC_SHOWER
-
-51,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
-52,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
-
-54,6000:4000:2000:0,0:1000:2000:3000,0,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-
-57,700,0,0,0 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-
-59,0,1000,0,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-60,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //KN_TWOHANDQUICKEN#ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-61,0,0,400:800:1200:1600:2000,0 //KN_AUTOCOUNTER#ƒI[ƒgƒJƒEƒ“ƒ^[#
-62,700,0,0,0 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-
-66,0,3000,60000,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-67,0,2000,30000:20000:10000,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
-68,0,2000,60000:90000:120000:150000:180000,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
-69,0,0,40000:80000:120000:160000:200000,0 //PR_BENEDICTIO#¹‘Ì~•Ÿ#
-70,5000,0,4000:7000:10000:13000:16000:19000:22000:25000:28000:31000,0 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-71,0,0,10000:20000:30000:40000,0 //PR_SLOWPOISON#ƒXƒ[ƒ|ƒCƒYƒ“#
-72,0,2000,0,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ[#
-73,2000,2000,120000,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-74,4000,2000,30000:45000:60000:75000:90000,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ[ƒg#
-75,0,2000,10000:15000:20000:25000:30000:,0 //PR_GLORIA#ƒOƒƒŠƒA#
-76,0,3000,30000:35000:40000:45000:50000:55000:60000:60000:60000:60000,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
-77,1000,3000,0,0 //PR_TURNUNDEAD#ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
-78,0,3000,600000,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
-79,15000,4000,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-80,3000:2700:2400:2100:1800:1500:1200:900:600:300,2000,30000,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA[ƒsƒ‰[#
-81,700,2000,0,0 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
-
-83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,3200:3400:3600:3800:4000:4200:4400:4600:4800:5000 //WZ_METEOR#ƒƒeƒIƒXƒg[ƒ€#
-84,2500:3000:3500:4000:4500:5000:5500:6000:6500:7000,0,0,0 //WZ_JUPITEL#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
-85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000 //WZ_VERMILION#ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
-86,1000:2000:3000:4000:5000,0,0,0 //WZ_WATERBALL#ƒEƒH[ƒ^[ƒ{[ƒ‹#
-87,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH[ƒ‹#
-88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
-89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //WZ_STORMGUST#ƒXƒg[ƒ€ƒKƒXƒg#
-90,1000:2000:3000:4000:5000,700,0,0 //WZ_EARTHSPIKE#ƒA[ƒXƒXƒpƒCƒN#
-91,1000:2000:3000:4000:5000,700,0,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-92,0,1000,5000:10000:15000:20000:25000,5000:10000:15000:20000:25000 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
-
-110,0,0,0,6000:7000:8000:9000:10000:11000 //BS_HAMMERFALL#ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
-111,0,0,30000:60000:90000:120000:150000,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-112,0,0,10000:20000:30000:40000:50000,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
-113,0,0,20000:40000:60000:80000:100000,0 //BS_OVERTHRUST#ƒI[ƒo[ƒgƒ‰ƒXƒg#
-114,0,0,1000:2000:3000:4000:5000,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
-115,0,0,300000:240000:180000:120000:60000,0 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-116,0,0,20000:160000:120000:80000:40000,6000:7000:8000:9000:10000:11000 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-117,0,0,250000:200000:150000:100000:50000,4000:8000:12000:16000:20000 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-118,0,0,200000:160000:120000:80000:40000,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
-119,0,0,150000:120000:90000:60000:30000,12000:14000:16000:18000:20000 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
-120,0,0,150000:120000:90000:60000:30000,10000:11000:12000:13000:14000 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ[#
-121,0,0,150000:120000:90000:60000:30000,3000:6000:9000:12000:15000 //HT_FREEZINGTRAP#ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-122,0,0,10000:8000:6000:4000:2000,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-123,0,0,20000:40000:60000:80000:100000,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
-
-125,0,0,600000,0 //HT_TALKIEBOX#ƒg[ƒL[ƒ{ƒbƒNƒX#
-
-129,1000,1000,0,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr[ƒg#
-
-135,0,0,4000:5000:6000:7000:8000:9000:10000:11000:12000:13000,0 //AS_CLOAKING#ƒNƒ[ƒLƒ“ƒO#
-136,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ[#
-
-138,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-139,0,0,20000:25000:30000:35000:40000:45000:50000:55000:60000:65000,0 //AS_POISONREACT#?ƒCƒYƒ“ƒŠƒAƒNƒg#
-140,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
-141,1000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
-
-143,0,0,600000,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
-
-145,0,0,0,8000 //SM_FATALBLOW#‹}ŠUŒ‚#
-
-148,1500,0,0,0 //AC_CHARGEARROW#ƒ`ƒƒ[ƒWƒAƒ[#
-149,0,0,0,10000 //TF_SPRINKLESAND#»‚Ü‚«#
-
-152,0,0,0,8000 //TF_THROWSTONE#ΓŠ‚°#
-
-155,0,0,300000,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
-156,2000,0,0,0 //AL_HOLYLIGHT#ƒz[ƒŠ[ƒ‰ƒCƒg#
-157,5000,0,300000,0 //MG_ENERGYCOAT#ƒGƒiƒW[ƒR[ƒg#
-
-176,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //NPC_POISON#“ÅUŒ‚#
-177,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //NPC_BLINDATTACK#ˆÃˆÅUŒ‚#
-178,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000 //NPC_SILENCEATTACK#’¾–ÙUŒ‚#
-179,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //NPC_STUNATTACK#ƒXƒ^ƒ“UŒ‚#
-180,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //NPC_PETRIFYATTACK#Ή»UŒ‚#
-181,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //NPC_CURSEATTACK#Žô‚¢UŒ‚#
-182,0,0,0,8000:10000:12000:14000:16000:18000:20000:22000:24000:26000 //NPC_SLEEPATTACK#‡–°UŒ‚#
-
-201,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0 //NPC_KEEPING#ƒL[ƒsƒ“ƒO#
-
-204,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0 //NPC_BARRIER#ƒoƒŠƒA[#
-
-206,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //NPC_LICK#ƒŠƒbƒN#
-207,0,0,30000:40000:50000:60000:70000:80000:90000:100000:110000:120000,0 //NPC_HALLUCINATION#öŠo#
-
-212,0,500,0,0 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
-
-214,0,0,0,8000:9000:10000:11000:12000 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-215,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
-216,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
-217,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA[ƒ}[#
-218,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-
-220,0,0,180000,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
-
-229,1000,0,40000:45000:50000:55000:60000,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
-230,1000,0,3:7:10:12:13,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰[#
-
-232,2000,500,40000:50000:60000:70000:80000,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-233,2000,500,30000,0 //AM_SPHEREMINE#ƒXƒtƒBƒA[ƒ}ƒCƒ“#
-234,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
-235,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-236,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
-237,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
-
-249,0,0,300000,0 //CR_AUTOGUARD#ƒI[ƒgƒK[ƒh#
-250,0,0,0,8000:9000:10000:11000:12000 //CR_SHIELDCHARGE#ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-251,0,700,0,0 //CR_SHIELDBOOMERANG#ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-252,0,0,300000,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-253,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_HOLYCROSS#ƒz[ƒŠ[ƒNƒƒX#
-254,3000,1500,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
-
-256,3000,0,180000,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
-257,0,800,180000,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
-258,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
-
-261,1500,0,600000,0 //MO_CALLSPIRITS#‹CŒ÷#
-262,2000,0,0,0 //MO_ABSORBSPIRITS#‹C’D#
-
-266,1000,500,0,0 //MO_INVESTIGATE#”­™¤#
-267,1000,500,0,0 //MO_FINGEROFFENSIVE#Žw’e#
-268,0,0,30000:60000:90000:120000:150000,0 //MO_STEELBODY#‹à„#
-269,0,0,500:700:900:1100:1300,20000:30000:40000:50000:60000 //MO_BLADESTOP#”’nŽæ‚è#
-270,0,0,180000,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
-271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,300000 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
-
-276,0,1500,400:600:800:1000:1200,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
-277,700,0,0,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
-
-//279,3000,0,120000:150000:180000:210000:240000:270000:300000:360000:390000,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
-279,3000,0,0,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
-280,3000,0,1200000,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
-281,3000,0,1200000,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-282,3000,0,1200000,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
-283,3000,0,1200000,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-
-285,5000,0,180000,180000 //SA_VOLCANO#ƒ{ƒ‹ƒP[ƒm#
-286,5000,0,180000,180000 //SA_DELUGE#ƒfƒŠƒ…[ƒW#
-287,5000,0,180000,180000 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-288,5000,0,180000,180000 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
-289,2000,0,0,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
-
-304,0,0,0,5000 //BD_ADAPTATION#ƒAƒhƒŠƒu#
-
-306,0,0,60000,15000 //BD_LULLABY#ŽqŽç‰Ì#
-307,0,0,60000,60000 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
-308,0,0,60000,60000 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
-309,0,0,60000,60000 //BD_DRUMBATTLEFIELD#푾ŒÛ‚Ì‹¿‚«#
-310,0,0,60000,60000 //BD_RINGNIBELUNGEN#ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
-311,0,0,60000,60000 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
-312,0,0,60000,60000 //BD_INTOABYSS#[•£‚Ì’†‚É#
-313,0,0,60000,60000 //BD_SIEGFRIED#•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-
-316,1500,0,0,0 //BA_MUSICALSTRIKE#ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-317,0,0,30000,3000 //BA_DISSONANCE#•s‹¦˜a‰¹#
-318,0,3000,0,10000:11000:12000:13000:14000 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡[ƒN#
-319,0,0,60000,60000 //BA_WHISTLE#Œû“J#
-320,0,0,120000,120000 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-321,0,0,180000,180000 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
-322,0,0,180000,180000 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
-
-324,1500,0,0,0 //DC_THROWARROW#–‚¿#
-325,0,0,30000,3000 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-326,0,3000,0,10000:11000:12000:13000:14000 //DC_SCREAM#ƒXƒNƒŠ[ƒ€#
-327,0,0,60000,60000 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
-328,0,0,180000,180000 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-329,0,0,120000,120000 //DC_FORTUNEKISS#K‰^‚̃LƒX#
-330,0,0,180000,180000 //DC_SERVICEFORYOU#ƒT[ƒrƒXƒtƒH[ƒ†[#
-331,0,0,3500,0 //NPC_SELFDESTRUCTION2#Ž©”š2#
-
-334,3000,0,0,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
-335,3000,0,0,0 //WE_FEMALE#‚ ‚È‚½‚És‚­‚µ‚Ü‚·#
-336,0,0,10000,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
-
-355,0,0,40000:60000:80000:100000:120000,0 //LK_AURABLADE#ƒI[ƒ‰ƒuƒŒ[ƒh#
-356,0,0,10000:12000:14000:16000:18000:20000:18000:16000:14000:12000,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
-357,0,0,25000:30000:35000:40000:45000,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“#
-358,0,0,180000,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
-359,0,0,300000,0 //LK_BERSERK
-360,0,0,300000,0 //LK_FURY
-
-361,1000:1500:2000:2500:3000,1100:1200:1300:1400:1500,20000:30000:40000:50000:60000,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
-362,5000:6000:7000:8000:9000,2000:3000:4000:5000:6000,20000:25000:30000:35000:40000,20000:25000:30000:35000:40000 //HP_BASILICA#ƒoƒWƒŠƒJ#
-
-365,300,300,0,0 //HW_MAGICCRASHER
-366,700,0,360000,0 //HW_MAGICPOWER#–‚–@—Í‘•#
-
-367,2000:2500:3000:3500:4000,2000:3000:4000:5000:6000,0,0 //PA_PRESSURE
-369,0,0,360000,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
-370,0,300,0,0 //CH_PALMSTRIKE
-372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CH_CHAINCRUSH#˜A’Œ•öŒ‚#
-373,0,2000:2500:3000:3500:4000,0,0 //PF_HPCONVERSION#ƒ‰ƒCƒt’u‚«Š·‚¦#
-374,3000,5000,0,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
-375,0,10000:10000:10000:10000:15000,0,0 //PF_SOULBURN#ƒ\ƒEƒ‹ƒo[ƒ“#
-
-378,0,2000,20000:30000:40000:50000:60000,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“#
-379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //ASC_BREAKER
-380,0,0,30000,0 //SN_SIGHT#ƒgƒDƒ‹[ƒTƒCƒg#
-381,1000,1200,0,0,0 //SN_FALCONASSAULT
-382,2000,0,0,0 //SN_SHARPSHOOTING
-383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,0,65000:80000:95000:110000:125000:140000:155000:170000:185000:200000,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH[ƒN#
-384,5000:5000:6000:6000:7000:7000:8000:8000:9000:10000,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
-
-387,0,0,60000,0 //WS_CARTBOOST#ƒJ[ƒgƒu[ƒXƒg#
-389,0,0,10000,0 //ST_CHASEWALK
-
-390,0,0,300000,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\[ƒh#
-
-394,2000:2200:2400:2600:2800:3000:3200:3400:3600:3800,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CG_ARROWVULCAN
-395,0,0,20000:25000:30000:35000:40000,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
-396,0,0,300000,0 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹#
-397,300:500:700:900:1000,1200:1400:1600:1800:2000,0,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX#
-398,0,500,0,30000 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
-399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,30000 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
-400,1700,1000,0,0,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
-401,2000,0,600000,0 //CH_SOULCOLLECT#‹¶‹CŒ÷#
-402,0,800:900:1000:1100:1200,30000,0 //PF_MINDBREAKER
-403,5000,0,0,0 //PF_MEMORIZE
-404,0,0,20000,10000 //PF_FOGWALL#ƒtƒHƒOƒEƒH[ƒ‹#
-405,0,0,30000,8000 //PF_SPIDERWEB#ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
-406,0,0,0,3000 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
-407,0,5000,0,0 //ASC_CDP
+//skill_cast_db.txt—AthenaDBŒv‰æ 2004/06/16 03:04:01 +0900 (JST)
+//id,cast_list,delay_list,upkeep_time,upkeep_time2
+
+6,0,0,30000,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
+
+8,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
+
+10,0,0,10000,0 //MG_SIGHT#ƒTƒCƒg#
+11,500,1000,0,0 //MG_NAPALMBEAT#ƒiƒp[ƒ€ƒr[ƒg#
+12,4000:3500:3500:2500:2000:1500:1000:1000:1000:1000,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+13,500,1200:1400:1600:1800:2000:2200:2400:2600:2800:2700,0,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+14,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_COLDBOLT#ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+15,800,1500,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo[#
+16,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //MG_STONECURSE#ƒXƒg[ƒ“ƒJ[ƒX#
+17,1600,1600,0,0 //MG_FIREBALL#ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+18,2000:1850:1700:1550:1400:1250:1100:950:800:650,0,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //MG_FIREWALL#ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+19,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+20,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+21,1000:2000:3000:4000:5000:6000:7000:8000:9000:10000,2000,0,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+
+24,0,0,10000,0 //AL_RUWACH#ƒ‹ƒAƒt#
+25,0,0,10000,0 //AL_PNEUMA#ƒjƒ…[ƒ}#
+26,0,0,0,0 //AL_TELEPORT#ƒeƒŒƒ|[ƒg#
+27,1000,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //AL_WARP#ƒ[ƒvƒ|[ƒ^ƒ‹#
+28,0,1000,0,0 //AL_HEAL#ƒq[ƒ‹#
+29,1000,1000,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AL_INCAGI#‘¬“x‘‰Á#
+30,1000,1000,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000,0 //AL_DECAGI#‘¬“xŒ¸­#
+31,0,2000,0,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+32,500,2000,0,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+33,500,3500,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
+34,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
+35,0,1000,0,0 //AL_CURE#ƒLƒ…ƒA[#
+
+45,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0 //AC_CONCENTRATION#W’†—ÍŒüã#
+46,0,1500,100,0 //AC_DOUBLE
+47,0,1500,100,0 //AC_SHOWER
+
+51,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
+52,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
+
+54,6000:4000:2000:0,0:1000:2000:3000,0,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+
+57,700,0,0,0 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+
+59,0,1000,0,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+60,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //KN_TWOHANDQUICKEN#ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+61,0,0,400:800:1200:1600:2000,0 //KN_AUTOCOUNTER#ƒI[ƒgƒJƒEƒ“ƒ^[#
+62,700,0,0,0 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+
+66,0,3000,60000,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+67,0,2000,30000:20000:10000,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
+68,0,2000,60000:90000:120000:150000:180000,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
+69,0,0,40000:80000:120000:160000:200000,0 //PR_BENEDICTIO#¹‘Ì~•Ÿ#
+70,5000,0,4000:7000:10000:13000:16000:19000:22000:25000:28000:31000,0 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+71,0,0,10000:20000:30000:40000,0 //PR_SLOWPOISON#ƒXƒ[ƒ|ƒCƒYƒ“#
+72,0,2000,0,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ[#
+73,2000,2000,120000,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+74,4000,2000,30000:45000:60000:75000:90000,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ[ƒg#
+75,0,2000,10000:15000:20000:25000:30000:,0 //PR_GLORIA#ƒOƒƒŠƒA#
+76,0,3000,30000:35000:40000:45000:50000:55000:60000:60000:60000:60000,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
+77,1000,3000,0,0 //PR_TURNUNDEAD#ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
+78,0,3000,600000,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
+79,15000,4000,5000:6000:7000:8000:9000:10000:11000:12000:13000:14000,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+80,3000:2700:2400:2100:1800:1500:1200:900:600:300,2000,30000,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA[ƒsƒ‰[#
+81,700,2000,0,0 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
+
+83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,3200:3400:3600:3800:4000:4200:4400:4600:4800:5000 //WZ_METEOR#ƒƒeƒIƒXƒg[ƒ€#
+84,2500:3000:3500:4000:4500:5000:5500:6000:6500:7000,0,0,0 //WZ_JUPITEL#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
+85,15000:14500:14000:13500:13000:12500:12000:11500:11000:10500,5000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000 //WZ_VERMILION#ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
+86,1000:2000:3000:4000:5000,0,0,0 //WZ_WATERBALL#ƒEƒH[ƒ^[ƒ{[ƒ‹#
+87,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH[ƒ‹#
+88,5000:4700:4400:4100:3800:3500:3200:2900:2700:2500,1000,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
+89,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000,5000,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //WZ_STORMGUST#ƒXƒg[ƒ€ƒKƒXƒg#
+90,1000:2000:3000:4000:5000,700,0,0 //WZ_EARTHSPIKE#ƒA[ƒXƒXƒpƒCƒN#
+91,1000:2000:3000:4000:5000,700,0,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+92,0,1000,5000:10000:15000:20000:25000,5000:10000:15000:20000:25000 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
+
+110,0,0,0,6000:7000:8000:9000:10000:11000 //BS_HAMMERFALL#ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
+111,0,0,30000:60000:90000:120000:150000,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+112,0,0,10000:20000:30000:40000:50000,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
+113,0,0,20000:40000:60000:80000:100000,0 //BS_OVERTHRUST#ƒI[ƒo[ƒgƒ‰ƒXƒg#
+114,0,0,1000:2000:3000:4000:5000,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
+115,0,0,300000:240000:180000:120000:60000,0 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+116,0,0,20000:160000:120000:80000:40000,6000:7000:8000:9000:10000:11000 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+117,0,0,250000:200000:150000:100000:50000,4000:8000:12000:16000:20000 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+118,0,0,200000:160000:120000:80000:40000,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
+119,0,0,150000:120000:90000:60000:30000,12000:14000:16000:18000:20000 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
+120,0,0,150000:120000:90000:60000:30000,10000:11000:12000:13000:14000 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ[#
+121,0,0,150000:120000:90000:60000:30000,3000:6000:9000:12000:15000 //HT_FREEZINGTRAP#ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+122,0,0,10000:8000:6000:4000:2000,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+123,0,0,20000:40000:60000:80000:100000,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
+
+125,0,0,600000,0 //HT_TALKIEBOX#ƒg[ƒL[ƒ{ƒbƒNƒX#
+
+129,1000,1000,0,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr[ƒg#
+
+135,0,0,4000:5000:6000:7000:8000:9000:10000:11000:12000:13000,0 //AS_CLOAKING#ƒNƒ[ƒLƒ“ƒO#
+136,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ[#
+
+138,0,0,30000:45000:60000:75000:90000:105000:120000:135000:150000:165000,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+139,0,0,20000:25000:30000:35000:40000:45000:50000:55000:60000:65000,0 //AS_POISONREACT#?ƒCƒYƒ“ƒŠƒAƒNƒg#
+140,0,0,5000:10000:15000:20000:25000:30000:35000:40000:45000:50000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
+141,1000,0,5500:6000:6500:7000:7500:8000:8500:9000:9500:10000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
+
+143,0,0,600000,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
+
+145,0,0,0,8000 //SM_FATALBLOW#‹}ŠUŒ‚#
+
+148,1500,0,0,0 //AC_CHARGEARROW#ƒ`ƒƒ[ƒWƒAƒ[#
+149,0,0,0,10000 //TF_SPRINKLESAND#»‚Ü‚«#
+
+152,0,0,0,8000 //TF_THROWSTONE#ΓŠ‚°#
+
+155,0,0,300000,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
+156,2000,0,0,0 //AL_HOLYLIGHT#ƒz[ƒŠ[ƒ‰ƒCƒg#
+157,5000,0,300000,0 //MG_ENERGYCOAT#ƒGƒiƒW[ƒR[ƒg#
+
+176,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //NPC_POISON#“ÅUŒ‚#
+177,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //NPC_BLINDATTACK#ˆÃˆÅUŒ‚#
+178,0,0,0,10000:12000:14000:16000:18000:20000:22000:24000:26000:28000 //NPC_SILENCEATTACK#’¾–ÙUŒ‚#
+179,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //NPC_STUNATTACK#ƒXƒ^ƒ“UŒ‚#
+180,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //NPC_PETRIFYATTACK#Ή»UŒ‚#
+181,0,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000 //NPC_CURSEATTACK#Žô‚¢UŒ‚#
+182,0,0,0,8000:10000:12000:14000:16000:18000:20000:22000:24000:26000 //NPC_SLEEPATTACK#‡–°UŒ‚#
+
+201,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0 //NPC_KEEPING#ƒL[ƒsƒ“ƒO#
+
+204,0,0,60000:70000:80000:90000:100000:110000:120000:130000:140000:150000,0 //NPC_BARRIER#ƒoƒŠƒA[#
+
+206,0,0,0,6000:7000:8000:9000:10000:11000:12000:13000:14000:15000 //NPC_LICK#ƒŠƒbƒN#
+207,0,0,30000:40000:50000:60000:70000:80000:90000:100000:110000:120000,0 //NPC_HALLUCINATION#öŠo#
+
+212,0,500,0,0 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
+
+214,0,0,0,8000:9000:10000:11000:12000 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+215,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
+216,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
+217,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA[ƒ}[#
+218,1000,1000,75000:90000:105000:120000:135000,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+
+220,0,0,180000,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
+
+229,1000,0,40000:45000:50000:55000:60000,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
+230,1000,0,3:7:10:12:13,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰[#
+
+232,2000,500,40000:50000:60000:70000:80000,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+233,2000,500,30000,0 //AM_SPHEREMINE#ƒXƒtƒBƒA[ƒ}ƒCƒ“#
+234,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
+235,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+236,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
+237,2000,0,60000:120000:180000:240000:300000,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
+
+249,0,0,300000,0 //CR_AUTOGUARD#ƒI[ƒgƒK[ƒh#
+250,0,0,0,8000:9000:10000:11000:12000 //CR_SHIELDCHARGE#ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+251,0,700,0,0 //CR_SHIELDBOOMERANG#ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+252,0,0,300000,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+253,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_HOLYCROSS#ƒz[ƒŠ[ƒNƒƒX#
+254,3000,1500,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
+
+256,3000,0,180000,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
+257,0,800,180000,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
+258,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
+
+261,1500,0,600000,0 //MO_CALLSPIRITS#‹CŒ÷#
+262,2000,0,0,0 //MO_ABSORBSPIRITS#‹C’D#
+
+266,1000,500,0,0 //MO_INVESTIGATE#”­™¤#
+267,1000,500,0,0 //MO_FINGEROFFENSIVE#Žw’e#
+268,0,0,30000:60000:90000:120000:150000,0 //MO_STEELBODY#‹à„#
+269,0,0,500:700:900:1100:1300,20000:30000:40000:50000:60000 //MO_BLADESTOP#”’nŽæ‚è#
+270,0,0,180000,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
+271,4000:3500:3000:2500:2000,3000:2500:2000:1500:1000,0,300000 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
+
+276,0,1500,400:600:800:1000:1200,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
+277,700,0,0,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
+
+//279,3000,0,120000:150000:180000:210000:240000:270000:300000:360000:390000,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
+279,3000,0,0,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
+280,3000,0,1200000,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
+281,3000,0,1200000,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+282,3000,0,1200000,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
+283,3000,0,1200000,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+
+285,5000,0,180000,180000 //SA_VOLCANO#ƒ{ƒ‹ƒP[ƒm#
+286,5000,0,180000,180000 //SA_DELUGE#ƒfƒŠƒ…[ƒW#
+287,5000,0,180000,180000 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+288,5000,0,180000,180000 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
+289,2000,0,0,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
+
+304,0,0,0,5000 //BD_ADAPTATION#ƒAƒhƒŠƒu#
+
+306,0,0,60000,15000 //BD_LULLABY#ŽqŽç‰Ì#
+307,0,0,60000,60000 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
+308,0,0,60000,60000 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
+309,0,0,60000,60000 //BD_DRUMBATTLEFIELD#푾ŒÛ‚Ì‹¿‚«#
+310,0,0,60000,60000 //BD_RINGNIBELUNGEN#ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
+311,0,0,60000,60000 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
+312,0,0,60000,60000 //BD_INTOABYSS#[•£‚Ì’†‚É#
+313,0,0,60000,60000 //BD_SIEGFRIED#•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+
+316,1500,0,0,0 //BA_MUSICALSTRIKE#ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+317,0,0,30000,3000 //BA_DISSONANCE#•s‹¦˜a‰¹#
+318,0,3000,0,10000:11000:12000:13000:14000 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡[ƒN#
+319,0,0,60000,60000 //BA_WHISTLE#Œû“J#
+320,0,0,120000,120000 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+321,0,0,180000,180000 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
+322,0,0,180000,180000 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
+
+324,1500,0,0,0 //DC_THROWARROW#–‚¿#
+325,0,0,30000,3000 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+326,0,3000,0,10000:11000:12000:13000:14000 //DC_SCREAM#ƒXƒNƒŠ[ƒ€#
+327,0,0,60000,60000 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
+328,0,0,180000,180000 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+329,0,0,120000,120000 //DC_FORTUNEKISS#K‰^‚̃LƒX#
+330,0,0,180000,180000 //DC_SERVICEFORYOU#ƒT[ƒrƒXƒtƒH[ƒ†[#
+331,0,0,3500,0 //NPC_SELFDESTRUCTION2#Ž©”š2#
+
+334,3000,0,0,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
+335,3000,0,0,0 //WE_FEMALE#‚ ‚È‚½‚És‚­‚µ‚Ü‚·#
+336,0,0,10000,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
+
+355,0,0,40000:60000:80000:100000:120000,0 //LK_AURABLADE#ƒI[ƒ‰ƒuƒŒ[ƒh#
+356,0,0,10000:12000:14000:16000:18000:20000:18000:16000:14000:12000,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
+357,0,0,25000:30000:35000:40000:45000,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“#
+358,0,0,180000,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
+359,0,0,300000,0 //LK_BERSERK
+360,0,0,300000,0 //LK_FURY
+
+361,1000:1500:2000:2500:3000,1100:1200:1300:1400:1500,20000:30000:40000:50000:60000,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
+362,5000:6000:7000:8000:9000,2000:3000:4000:5000:6000,20000:25000:30000:35000:40000,20000:25000:30000:35000:40000 //HP_BASILICA#ƒoƒWƒŠƒJ#
+
+365,300,300,0,0 //HW_MAGICCRASHER
+366,700,0,360000,0 //HW_MAGICPOWER#–‚–@—Í‘•#
+
+367,2000:2500:3000:3500:4000,2000:3000:4000:5000:6000,0,0 //PA_PRESSURE
+369,0,0,360000,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
+370,0,300,0,0 //CH_PALMSTRIKE
+372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CH_CHAINCRUSH#˜A’Œ•öŒ‚#
+373,0,2000:2500:3000:3500:4000,0,0 //PF_HPCONVERSION#ƒ‰ƒCƒt’u‚«Š·‚¦#
+374,3000,5000,0,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
+375,0,10000:10000:10000:10000:15000,0,0 //PF_SOULBURN#ƒ\ƒEƒ‹ƒo[ƒ“#
+
+378,0,2000,20000:30000:40000:50000:60000,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“#
+379,0,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0 //ASC_BREAKER
+380,0,0,30000,0 //SN_SIGHT#ƒgƒDƒ‹[ƒTƒCƒg#
+381,1000,1200,0,0,0 //SN_FALCONASSAULT
+382,2000,0,0,0 //SN_SHARPSHOOTING
+383,2000:2400:2800:3200:3600:4000:4400:4800:5200:5600,0,65000:80000:95000:110000:125000:140000:155000:170000:185000:200000,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH[ƒN#
+384,5000:5000:6000:6000:7000:7000:8000:8000:9000:10000,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
+
+387,0,0,60000,0 //WS_CARTBOOST#ƒJ[ƒgƒu[ƒXƒg#
+389,0,0,10000,0 //ST_CHASEWALK
+
+390,0,0,300000,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\[ƒh#
+
+394,2000:2200:2400:2600:2800:3000:3200:3400:3600:3800,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CG_ARROWVULCAN
+395,0,0,20000:25000:30000:35000:40000,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
+396,0,0,300000,0 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹#
+397,300:500:700:900:1000,1200:1400:1600:1800:2000,0,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX#
+398,0,500,0,30000 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
+399,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,30000 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
+400,1700,1000,0,0,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
+401,2000,0,600000,0 //CH_SOULCOLLECT#‹¶‹CŒ÷#
+402,0,800:900:1000:1100:1200,30000,0 //PF_MINDBREAKER
+403,5000,0,0,0 //PF_MEMORIZE
+404,0,0,20000,10000 //PF_FOGWALL#ƒtƒHƒOƒEƒH[ƒ‹#
+405,0,0,30000,8000 //PF_SPIDERWEB#ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
+406,0,0,0,3000 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
+407,0,5000,0,0 //ASC_CDP
diff --git a/db/skill_castnodex_db.txt b/db/skill_castnodex_db.txt
index 48097472b..6f205f516 100644
--- a/db/skill_castnodex_db.txt
+++ b/db/skill_castnodex_db.txt
@@ -1,12 +1,12 @@
-//<Skill id>,<1 or 0>
-// With 1, dex does not effect the skill's cast rate
-// With 0, dex effects the skill's cast rate
-46,1
-47,1
-129,1
-366,1
-381,1
-382,1
-383,1
-394,1
+//<Skill id>,<1 or 0>
+// With 1, dex does not effect the skill's cast rate
+// With 0, dex effects the skill's cast rate
+46,1
+47,1
+129,1
+366,1
+381,1
+382,1
+383,1
+394,1
403,1 \ No newline at end of file
diff --git a/db/skill_db.txt b/db/skill_db.txt
index 510f65d96..2781aeb9c 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -1,525 +1,525 @@
-//skill_db.txt—AthenaDBŒv‰æ 2004/06/06 14:27:11 +0900 (JST)
-//id,range,hit,inf,pl,nk,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
-1,0,0,0,0,0,9,0,no,0,0,0,none,0 //NV_BASIC#Šî–{ƒXƒLƒ‹#
-2,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_SWORD#ΥCў#
-3,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_TWOHAND#—¼ŽèŒ•C—û#
-4,0,0,0,0,0,10,0,no,0,0,0,none,0 //SM_RECOVERY#HP‰ñ•œ—ÍŒüã#
-5,-1,6,1,0,0,10,1,no,0,0,0,weapon,0 //SM_BASH#ƒoƒbƒVƒ…#
-6,8,6,1,0,1,10,1,no,0,0,0,none,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
-7,-1,6,1,3,2,10,5,no,0,0,0,weapon,2 //SM_MAGNUM#ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-8,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
-9,0,0,0,0,0,10,0,no,0,0,0,none,0 //MG_SRECOVERY#SP‰ñ•œ—ÍŒüã#
-10,8,6,4,3,1,1,1,yes,0,0,0,magic,0 //MG_SIGHT#ƒTƒCƒg#
-11,8,6,1,8,0,10,1,yes,0,0,0,magic,0 //MG_NAPALMBEAT#ƒiƒp[ƒ€ƒr[ƒg#
-12,8,8,2,8,0,10,1,yes,0,0,0,magic,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-13,8,8,1,8,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-14,8,8,1,1,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_COLDBOLT#ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-15,8,6,1,1,0,10,1,yes,0,0,0,magic,0 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo[#
-16,2,6,1,2,1,10,1,yes,0,0,0,magic,0 //MG_STONECURSE#ƒXƒg[ƒ“ƒJ[ƒX#
-17,8,6,1,3,0,10,1,yes,0,0,0,magic,0 //MG_FIREBALL#ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-18,8,6,2,3,0,10,1,yes,0,0,3,magic,2 //MG_FIREWALL#ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-19,8,8,1,3,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-20,8,8,1,4,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-21,5,8,2,4,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-22,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DP#ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-23,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DEMONBANE#ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-24,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //AL_RUWACH#ƒ‹ƒAƒt#
-25,8,6,2,0,1,1,1,yes,0,0,0,magic,0 //AL_PNEUMA#ƒjƒ…[ƒ}#
-26,0,6,4,0,1,2,1,yes,0,0,0,magic,0 //AL_TELEPORT#ƒeƒŒƒ|[ƒg#
-27,5,6,2,0,1,4,1,yes,0,0,3,magic,0 //AL_WARP#ƒ[ƒvƒ|[ƒ^ƒ‹#
-28,8,6,16,6,1,10,1,yes,0,0,0,magic,0 //AL_HEAL#ƒq[ƒ‹#
-29,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //AL_INCAGI#‘¬“x‘‰Á#
-30,8,6,1,0,1,10,1,yes,0,0,0,magic,0 //AL_DECAGI#‘¬“xŒ¸­#
-31,1,6,4,0,1,1,1,yes,0,0,0,magic,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-32,8,6,4,0,1,10,1,yes,0,0,0,magic,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-33,8,6,4,0,1,10,1,yes,0,0,0,magic,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
-34,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
-35,8,6,16,0,1,1,1,yes,0,0,0,magic,0 //AL_CURE#ƒLƒ…ƒA[#
-36,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_INCCARRY#ŠŽŒÀŠE—Ê‘‰Á#
-37,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_DISCOUNT#ƒfƒBƒXƒJƒEƒ“ƒg#
-38,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_OVERCHARGE#ƒI[ƒo[ƒ`ƒƒ[ƒW#
-39,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_PUSHCART#ƒvƒbƒVƒ…ƒJ[ƒg#
-40,0,6,4,0,1,1,1,no,0,0,0,none,0 //MC_IDENTIFY#ƒAƒCƒeƒ€ŠÓ’è#
-41,0,6,4,0,1,10,1,no,0,0,0,none,0 //MC_VENDING#˜I“XŠJÝ#
-42,-2,6,1,0,0,10,1,no,0,0,0,weapon,0 //MC_MAMMONITE#ƒƒ}[ƒiƒCƒg#
-43,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_OWL#‚Ó‚­‚낤‚Ì–Ú#
-44,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_VULTURE#ƒƒV‚Ì–Ú#
-45,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //AC_CONCENTRATION#W’†—ÍŒüã#
-46,-3,8,1,0,0,10,2,no,0,0,0,weapon,0 //AC_DOUBLE#ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-47,-3,6,1,0,2,10,1,no,0,0,0,weapon,2 //AC_SHOWER#ƒAƒ[ƒVƒƒƒ[#
-48,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_DOUBLE#ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-49,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_MISS#‰ñ”𗦑‰Á#
-50,1,6,1,0,1,10,1,no,0,0,0,weapon,0 //TF_STEAL#ƒXƒeƒB[ƒ‹#
-51,0,6,4,0,1,10,1,no,0,0,0,none,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
-52,3,6,1,5,0,10,1,no,0,0,0,weapon,0 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
-53,10,6,16,5,1,1,1,no,0,0,0,weapon,0 //TF_DETOXIFY#‰ð“Å#
-54,8,6,16,6,1,4,1,yes,0,0,0,magic,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-55,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //KN_SPEARMASTERY#‘„C—û#
-56,-1,8,1,0,0,10,3,no,0,0,0,weapon,0 //KN_PIERCE#ƒsƒA[ƒX#
-57,1,6,1,0,1,10,1,no,33,0,0,weapon,1 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-58,4,6,1,0,2,10,1,no,0,0,0,weapon,6 //KN_SPEARSTAB#ƒXƒsƒAƒXƒ^ƒu#
-59,-3:-5:-7:-9:-11,6,1,0,0,5,1,no,0,0,0,weapon,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-60,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //KN_TWOHANDQUICKEN#ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-61,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //KN_AUTOCOUNTER#ƒI[ƒgƒJƒEƒ“ƒ^[#
-62,-1,6,1,0,2,10,1,no,33,0,0,weapon,1:1:2:2:3:3:4:4:5:6 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-63,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //KN_RIDING#ƒ‰ƒCƒfƒBƒ“ƒO#
-64,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //KN_CAVALIERMASTERY#‹R•ºC—û#
-65,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //PR_MACEMASTERY#ƒƒCƒXC—û#
-66,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-67,8,6,16,0,1,3,1,yes,0,512,0,magic,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
-68,8,6,16,6,1,5,1,yes,0,0,0,magic,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
-69,1,6,2,0,1,5,1,yes,0,0,0,magic,0 //PR_BENEDICTIO#¹‘Ì~•Ÿ#
-70,8,6,2,6,1,10,1,yes,0,0,0,magic,2 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-71,8,6,16,0,1,4,1,yes,0,0,0,magic,0 //PR_SLOWPOISON#ƒXƒ[ƒ|ƒCƒYƒ“#
-72,8,6,16,0,1,1,1,yes,0,0,0,magic,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ[#
-73,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-74,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ[ƒg#
-75,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //PR_GLORIA#ƒOƒƒŠƒA#
-76,8,6,1,0,1,10,0,yes,0,0,0,magic,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
-77,8,6,1,6,0,10,1,yes,0,0,0,magic,0 //PR_TURNUNDEAD#ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
-78,8,6,1,0,1,1,0,yes,0,0,0,magic,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
-79,3,8,2,6,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-80,8,8,2,3,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,128,5,magic,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA[ƒsƒ‰[#
-81,0,6,4,3,0,10,1,yes,0,0,0,magic,5 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
-//82,8,6,2,3,0,10,1,yes,0,0,0,magic,0 //WZ_FIREIVY#ƒtƒ@ƒCƒAƒAƒCƒr[#
-83,8,8,2,3,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //WZ_METEOR#ƒƒeƒIƒXƒg[ƒ€#
-84,8,8,1,4,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#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
-85,8,8,2,4,0,10,10,yes,0,0,0,magic,0 //WZ_VERMILION#ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
-86,8,8,1,1,0,5,1,yes,0,0,0,magic,0 //WZ_WATERBALL#ƒEƒH[ƒ^[ƒ{[ƒ‹#
-87,8,6,2,1,0,10,1,yes,0,0,0,magic,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH[ƒ‹#
-88,0,6,4,1,0,10,1,yes,0,0,0,magic,0 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
-89,8,6,2,1,1,10,1,yes,0,0,0,magic,2 //WZ_STORMGUST#ƒXƒg[ƒ€ƒKƒXƒg#
-90,8,8,1,2,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_EARTHSPIKE#ƒA[ƒXƒXƒpƒCƒN#
-91,8,8,2,2,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-92,8,6,2,2,1,5,1,yes,0,0,3,magic,0 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
-93,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //WZ_ESTIMATION#ƒ‚ƒ“ƒXƒ^[î•ñ#
-94,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_IRON#“S»‘¢#
-95,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_STEEL#|“S»‘¢#
-96,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ENCHANTEDSTONE#‘®«Î»‘¢#
-97,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ORIDEOCON#ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
-98,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_DAGGER#’ZŒ•»ì#
-99,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SWORD#Υȓ#
-100,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_TWOHANDSWORD#—¼ŽèŒ•»ì#
-101,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_AXE#•€»ì#
-102,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_MACE#ƒƒCƒX»ì#
-103,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_KNUCKLE#ƒiƒbƒNƒ‹»ì#
-104,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SPEAR#‘„»ì#
-105,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_HILTBINDING#ƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO#
-106,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_FINDINGORE#zΔ­Œ©#
-107,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
-108,0,6,4,0,1,1,1,no,0,0,0,weapon,0 //BS_REPAIRWEAPON#•ŠíC—#
-109,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_SKINTEMPER#ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
-110,2,6,2,0,1,5,1,no,0,0,0,weapon,0 //BS_HAMMERFALL#ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
-111,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-112,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
-113,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_OVERTHRUST#ƒI[ƒo[ƒgƒ‰ƒXƒg#
-114,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
-115,3,6,2,0,1,5,1,no,0,128,0,misc,6:7:8:9:10 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-116,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-117,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-118,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
-119,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
-120,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ[#
-121,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_FREEZINGTRAP#ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-122,3,6,2,3,1,5,1,no,0,128,0,misc,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-123,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
-124,2,6,32,0,1,1,1,no,0,0,0,misc,0 //HT_REMOVETRAP#ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-125,3,6,2,0,1,1,1,no,0,0,0,misc,0 //HT_TALKIEBOX#ƒg[ƒL[ƒ{ƒbƒNƒX#
-126,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //HT_BEASTBANE#ƒr[ƒXƒgƒxƒCƒ“#
-127,0,0,0,0,0,1,0,no,0,0,0,misc,0 //HT_FALCON#ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
-128,0,0,0,0,0,10,0,no,0,0,0,misc,0 //HT_STEELCROW#ƒXƒ`[ƒ‹ƒNƒƒE#
-129,9,8,1,0,0,5,1:2:3:4:5,yes,0,0,0,misc,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr[ƒg#
-130,8,6,2,0,1,4,1,no,0,0,0,misc,0 //HT_DETECTING#ƒfƒBƒeƒNƒeƒBƒ“ƒO#
-131,-5:-6:-7:-8:-9,6,32,0,1,5,1,no,0,0,0,misc,0 //HT_SPRINGTRAP#ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
-132,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_RIGHT#‰EŽèC—û#
-133,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_LEFT#¶ŽèC—û#
-134,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AS_KATAR#ƒJƒ^[ƒ‹C—û#
-135,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //AS_CLOAKING#ƒNƒ[ƒLƒ“ƒO#
-136,-1,8,1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ[#
-137,3:4:5:6:7,6,1,0,0,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#ƒOƒŠƒ€ƒgƒD[ƒX#
-138,8,6,16,5,1,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-139,0,6,16,5,1,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
-140,2,6,2,5,1,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
-141,2,6,1,0,1,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
-142,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_FIRSTAID#‰ž‹}Žè“–#
-143,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
-144,0,0,0,0,0,1,0,no,0,1,0,none,0 //SM_MOVINGRECOVERY#ˆÚ“®ŽžHP‰ñ•œ#
-145,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_FATALBLOW#‹}ŠUŒ‚#
-146,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_AUTOBERSERK#ƒI[ƒgƒo[ƒT[ƒN#
-147,0,0,4,0,1,1,0,no,0,1,0,weapon,0 //AC_MAKINGARROW#–îì¬#
-148,-3,6,1,0,2,1,1,no,0,1,0,weapon,6 //AC_CHARGEARROW#ƒ`ƒƒ[ƒWƒAƒ[#
-149,8,6,1,2,0,1,1,no,0,1,0,weapon,0 //TF_SPRINKLESAND#»‚Ü‚«#
-150,0,6,4,0,1,1,1,no,0,1,0,weapon,5 //TF_BACKSLIDING#ƒoƒbƒNƒXƒeƒbƒv#
-151,0,6,4,0,1,1,1,no,0,1,0,none,0 //TF_PICKSTONE#ÎE‚¢#
-152,8,6,1,0,0,1,1,no,0,1,0,weapon,0 //TF_THROWSTONE#ΓŠ‚°#
-153,1,6,1,0,2,1,1,no,0,1,0,weapon,2 //MC_CARTREVOLUTION#ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-154,0,6,4,0,1,1,1,no,0,1,0,none,0 //MC_CHANGECART#ƒ`ƒFƒ“ƒWƒJ[ƒg#
-155,0,6,4,0,1,1,1,no,0,1,0,weapon,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
-156,8,6,1,6,0,1,1,yes,0,1,0,magic,0 //AL_HOLYLIGHT#ƒz[ƒŠ[ƒ‰ƒCƒg#
-157,0,6,4,0,1,1,1,yes,0,1,0,magic,0 //MG_ENERGYCOAT#ƒGƒiƒW[ƒR[ƒg#
-// “G(NPC)ƒXƒLƒ‹
-// “ú–{Œê‰ðàŽQÆŒ³
-// http://rovc.at.infoseek.co.jp/o/2/oindex2.html
-158,3,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PIERCINGATT#“Ë‚«Žh‚µUŒ‚#
-159,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MENTALBREAKER#¸_”j‰ó#
-160,9,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANGEATTACK#‰“‹——£UŒ‚#
-161,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_ATTRICHANGE#ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»#
-162,0,0,4,1,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEWATER#…‘®«•Ï‰»#
-163,0,0,4,2,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEGROUND#’n‘®«•Ï‰»#
-164,0,0,4,3,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEFIRE#‰Î‘®«•Ï‰»#
-165,0,0,4,4,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEWIND#•—‘®«•Ï‰»#
-166,0,0,4,5,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEPOISON#“Å‘®«•Ï‰»#
-167,0,0,4,6,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEHOLY#¹‘®«•Ï‰»#
-168,0,0,4,7,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEDARLNESS#ˆÅ‘®«•Ï‰»#
-169,0,0,4,8,1,10,1,no,0,2,0,magic,0 //NPC_CHANGETELEKINESIS#”O‘®«•Ï‰»#
-170,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CRITICALSLASH#–hŒä–³Ž‹UŒ‚#
-171,-1,8,1,0,0,10,2:3:4:5:6:7:8:9:10:11,no,0,2,0,weapon,0 //NPC_COMBOATTACK#‘½’iUŒ‚#
-172,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_GUIDEATTACK#•K’†UŒ‚#
-173,1,6,4,3,1,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION#Ž©”š#
-174,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SPLASHATTACK#”͈ÍUŒ‚#
-175,0,0,4,0,1,10,1,no,0,2,0,misc,0 //NPC_SUICIDE#Ž©Œˆ#
-176,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_POISON#“ÅUŒ‚#
-177,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLINDATTACK#ˆÃˆÅUŒ‚#
-178,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SILENCEATTACK#’¾–ÙUŒ‚#
-179,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_STUNATTACK#ƒXƒ^ƒ“UŒ‚#
-180,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PETRIFYATTACK#Ή»UŒ‚#
-181,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CURSEATTACK#Žô‚¢UŒ‚#
-182,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SLEEPATTACK#‡–°UŒ‚#
-183,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANDOMATTACK#ƒ‰ƒ“ƒ_ƒ€UŒ‚#
-184,-1,6,1,1,0,10,1,no,0,2,0,weapon,0 //NPC_WATERATTACK#…‘®«UŒ‚#
-185,-1,6,1,2,0,10,1,no,0,2,0,weapon,0 //NPC_GROUNDATTACK#’n‘®«UŒ‚#
-186,-1,6,1,3,0,10,1,no,0,2,0,weapon,0 //NPC_FIREATTACK#‰Î‘®«UŒ‚#
-187,-1,6,1,4,0,10,1,no,0,2,0,weapon,0 //NPC_WINDATTACK#•—‘®«UŒ‚#
-188,-1,6,1,5,0,10,1,no,0,2,0,weapon,0 //NPC_POISONATTACK#“Å‘®«UŒ‚#
-189,-1,6,1,6,0,10,1,no,0,2,0,weapon,0 //NPC_HOLYATTACK#¹‘®«UŒ‚#
-190,-1,6,1,7,0,10,1,no,0,2,0,weapon,0 //NPC_DARKNESSATTACK#ˆÅ‘®«UŒ‚#
-191,-1,6,1,8,0,10,1,no,0,2,0,weapon,0 //NPC_TELEKINESISATTACK#”O‘®«UŒ‚#
-192,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MAGICALATTACK#–‚–@‘ÅŒ‚UŒ‚#
-193,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_METAMORPHOSIS#ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX#
-194,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_PROVOCATION#’§”­#
-195,0,6,4,0,0,10,1,no,0,2,0,misc,0 //NPC_SMOKING#‹i‰Œ#
-196,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_SUMMONSLAVE#Žæ‚芪‚«¢Š«#
-197,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_EMOTION#ƒGƒ‚[ƒVƒ‡ƒ“#
-198,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_TRANSFORMATION#ƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“#
-199,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLOODDRAIN#‹zŒŒ#
-200,8,6,1,0,0,10,1,no,0,2,0,magic,0 //NPC_ENERGYDRAIN#ƒGƒiƒW[ƒhƒŒƒCƒ“#
-201,0,0,4,0,1,10,1,no,0,2,0,weapon,0 //NPC_KEEPING#ƒL[ƒsƒ“ƒO#
-202,2,6,1,7,0,10,1,no,0,2,0,misc,0 //NPC_DARKBREATH#ƒ_[ƒNƒuƒŒƒX#
-203,1,6,1,7,1,10,1,no,0,2,0,magic,0 //NPC_DARKBLESSING#ƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO#
-204,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_BARRIER#ƒoƒŠƒA[#
-205,0,0,4,0,1,10,1,no,0,2,0,weapon,0 //NPC_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
-206,1,6,1,0,1,10,1,no,0,2,0,weapon,0 //NPC_LICK#ƒŠƒbƒN#
-207,8,0,1,0,1,10,1,no,0,2,0,magic,0 //NPC_HALLUCINATION#öŠo#
-208,0,0,0,0,0,10,1,no,0,2,0,magic,0 //NPC_REBIRTH#ƒŠƒo[ƒX#
-209,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_SUMMONMONSTER#ƒ‚ƒ“ƒXƒ^[¢Š«#
-
-//Žx‰‡ŒnƒpƒPƒbƒg‚ŃeƒXƒg
-//162 ‘®«•ÏXHF‚¢ƒGƒtƒFƒNƒg
-//163 ‘®«•ÏXHFÔi’ƒHjƒGƒtƒFƒNƒg
-//164 ‘®«•ÏXHFÔƒGƒtƒFƒNƒg
-//165 ‘®«•ÏXHF‰©FƒGƒtƒFƒNƒg
-//166 ‘®«•ÏXHFŽ‡ƒGƒtƒFƒNƒg
-//167 ‘®«•ÏXHF”’ƒGƒtƒFƒNƒg
-//168 ‘®«•ÏXHF•ƒGƒtƒFƒNƒg
-//169 ‘®«•ÏXHFŽ‡ƒGƒtƒFƒNƒg‚Q
-//173 ”hŽè‚È”š”­ƒGƒtƒFƒNƒgiŽ©”šHj
-//??? ƒnƒCƒhŒ©‚½‚¢‚ȃGƒtƒFƒNƒg
-//201 •‚¢‰HiŠkHj‚Ý‚½‚¢‚È‚Ì‚Å•¢‚í‚ê‚éƒGƒtƒFƒNƒg
-//205 ‚‚Ý‚½‚¢‚È‚à‚ÌoŒ»ƒGƒtƒFƒNƒg
-
-//UŒ‚ŒnƒpƒPƒbƒg‚ŃeƒXƒg
-//160 ‘„‚ª”ò‚Ô
-//170 ƒNƒŠƒeƒBƒJƒ‹
-//171 ¬‚³‚ÈH‰ÎH‚Ý‚½‚¢‚È‚Ì‚ªo‚é
-//172 Æ€‚ª‚Å‚éiƒƒbƒNƒIƒ“Hj
-//176 “Å•t‰ÁH
-//178 ‚È‚ñ‚©‚æ‚­‚í‚©‚ç‚È‚¢‹L†‚Ì‚ ‚Æ‚É~ˆói’¾–ÙUŒ‚Hj
-//179 ‚È‚É‚©”’‚¢‚à‚Ì‚ª”ò‚Ñ‚¿‚Á‚½iƒXƒ^ƒ“UŒ‚Hj
-//180 ƒXƒg[ƒ“ƒJ[ƒXH
-//182 Zzzƒ}[ƒN‚ªo‚é
-//185 ­‚µ‰©F‚­Œõ‚Á‚½‚«‚ª‚·‚éi‹C‚Ì‚¹‚¢Hj
-//186 ‰ŠŒn‚ÌUŒ‚‚Á‚Û‚¢iFW‚ł̃_ƒ[ƒW‚Á‚Û‚¢j
-//187 “dŒ‚ŒnH‚̃_ƒ[ƒW‚Á‚Û‚¢
-//188 Ž‡‚Á‚Û‚¢i“ÅŒnƒ_ƒ[ƒWHj
-//189 \Žš‰ËƒGƒtƒFƒNƒgi¹‚È‚éUŒ‚‚Á‚Û‚¢j
-//190 ˆÃ•Œn‚̃_ƒ[‚¶HH
-//191 185‚É‚¨‚È‚¶
-//193 ƒnƒCƒh‚Ý‚½‚¢‚ÉŒõ‚Á‚½iƒoƒbƒVƒ…‚©‚àHj
-//194 “¯‚¶‚­
-//195 “¯‚¶‚­
-//197 “¯‚¶‚­
-//198 “¯‚¶‚­
-//199 HP‚̃hƒŒƒCƒ“‚Á‚Û‚¢
-//200 SP‚̃hƒŒƒCƒ“‚Á‚Û‚¢
-//201 193‚É“¯‚¶
-//202 darkbreath‚ŃGƒ‰[iƒ_[ƒNƒuƒŒƒXHƒhƒ‰ƒSƒ“‚ÌUŒ‚Hj
-//203 193‚É“¯‚¶
-//204 193‚É“¯‚¶
-//205 193‚É“¯‚¶
-//206 193‚É“¯‚¶
-//207 193‚É“¯‚¶
-//208 193‚É“¯‚¶
-210,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //RG_SNATCHER#ƒXƒiƒbƒ`ƒƒ[#
-211,1,6,1,0,1,10,1,no,0,0,0,weapon,0 //RG_STEALCOIN#ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
-212,-1,6,1,0,0,10,1,no,0,0,0,weapon,1 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
-213,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_TUNNELDRIVE#ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
-214,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-215,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
-216,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
-217,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA[ƒ}[#
-218,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-219,-1,6,1,0,0,5,1,no,0,0,0,weapon,0 //RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
-220,1,6,2,0,1,1,1,no,0,0,0,none,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
-221,0,6,2,0,1,5,1,no,0,0,0,none,0 //RG_FLAGGRAFFITI#ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
-222,0,6,2,0,1,1,1,no,0,0,0,none,0 //RG_CLEANER#ƒNƒŠ[ƒi[#
-223,0,0,0,0,0,1,0,no,0,0,0,none,0 //RG_GANGSTER#ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
-224,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_COMPULSION#ƒRƒ“ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
-225,0,0,0,0,0,10,0,no,0,0,0,none,0 //RG_PLAGIARISM#ƒNƒ[ƒ“ƒXƒLƒ‹#
-226,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AM_AXEMASTERY#•€C—û#
-227,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_LEARNINGPOTION#ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
-228,0,6,4,0,1,10,0,no,0,0,0,none,0 //AM_PHARMACY#ƒtƒ@[ƒ}ƒV[#
-229,8,6,2,3,1,5,1,no,0,128,0,weapon,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
-230,8,6,1,0,0,5,0,no,0,0,0,weapon,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰[#
-231,8,6,16,0,1,5,1,yes,0,0,0,none,0 //AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
-//231,8,6,16,0,1,10,1,yes,0,0,0,magic,0
-232,3,6,2,0,1,5,1,no,0,0,3,none,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-233,3,6,2,0,1,5,1,no,0,128,3,none,0 //AM_SPHEREMINE#ƒXƒtƒBƒA[ƒ}ƒCƒ“#
-234,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
-235,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-236,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
-237,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
-//238,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_BIOETHICS#¶–½—Ï—#
-//239,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_BIOTECHNOLOGY#¶–½HŠwŒ¤‹†#
-//240,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CREATECREATURE#”í‘¢•¨‘n‘¢#
-//241,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CULTIVATION#ƒJƒ‹ƒeƒBƒxƒCƒVƒ‡ƒ“#
-//242,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_FLAMECONTROL#ƒtƒŒƒCƒ€ƒRƒ“ƒgƒ[ƒ‹#
-//243,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_CALLHOMUN#ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//244,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_REST#ˆÀ‘§#
-//245,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_DRILLMASTER#ƒhƒŠƒ‹ƒ}ƒXƒ^[#
-//246,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_HEALHOMUN#ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//247,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_RESURRECTHOMUN#ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
-248,0,0,0,0,0,10,0,no,0,0,0,none,0 //CR_TRUST#ƒtƒFƒCƒX#
-249,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_AUTOGUARD#ƒI[ƒgƒK[ƒh#
-250,3,6,1,0,2,5,1,no,0,0,0,weapon,5:6:7:8:9 //CR_SHIELDCHARGE#ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-251,3:5:7:9:11,6,1,0,0,5,1,no,0,0,0,weapon,0 //CR_SHIELDBOOMERANG#ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-252,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-253,-2,8,1,6,0,10,2,no,0,0,0,weapon,0 //CR_HOLYCROSS#ƒz[ƒŠ[ƒNƒƒX#
-254,0,6,4,6,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
-255,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_DEVOTION#ƒfƒBƒ{[ƒVƒ‡ƒ“#
-256,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
-257,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
-258,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
-259,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_IRONHAND#“SŒ#
-260,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //MO_SPIRITSRECOVERY#Ԥ#
-261,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_CALLSPIRITS#‹CŒ÷#
-262,6,6,16,0,1,1,1,no,0,0,0,weapon,0 //MO_ABSORBSPIRITS#‹C’D#
-263,0,8,0,0,0,10,3,no,0,0,0,weapon,0 //MO_TRIPLEATTACK#ŽO’i¶#
-264,50,6,2,0,1,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#Žc‰e#
-265,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_DODGE#Œ©Ø‚è#
-266,-1,6,1,0,0,5,1,no,0,0,0,weapon,0 //MO_INVESTIGATE#”­™¤#
-267,10,8,1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0 //MO_FINGEROFFENSIVE#Žw’e#
-268,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_STEELBODY#‹à„#
-269,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_BLADESTOP#”’nŽæ‚è#
-270,0,6,4,0,1,5,0,no,0,0,0,weapon,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
-271,-3,6,4,0,0,5,1,yes,0,4,0,weapon,0 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
-272,-2,8,4,0,0,5,4,no,0,0,0,weapon,0 //MO_CHAINCOMBO#˜A‘Ŷ#
-273,-2,6,4,0,0,5,1,no,0,0,0,weapon,0 //MO_COMBOFINISH#–Ò—´Œ#
-274,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SA_ADVANCEDBOOK#ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
-275,0,6,4,0,1,5,1,no,0,0,0,magic,0 //SA_CASTCANCEL#ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
-276,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
-277,8,6,1,0,1,5,1,yes,0,0,0,maigc,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
-278,0,0,0,0,0,10,0,no,0,0,0,magic,0 //SA_FREECAST#ƒtƒŠ[ƒLƒƒƒXƒg#
-279,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
-280,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
-281,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-282,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
-283,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-284,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //SA_DRAGONOLOGY#ƒhƒ‰ƒSƒmƒƒW[#
-285,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_VOLCANO#ƒ{ƒ‹ƒP[ƒm#
-286,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_DELUGE#ƒfƒŠƒ…[ƒW#
-287,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-288,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
-289,8,6,1,0,1,5,1,yes,0,0,0,magic,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
-290,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SA_ABRACADABRA#ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
-291,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_MONOCELL#ƒ`ƒFƒ“ƒWƒ|ƒŠƒ“#
-292,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_CLASSCHANGE#ƒNƒ‰ƒXƒ`ƒFƒ“ƒW#
-293,0,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_SUMMONMONSTER#ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^[#
-294,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_REVERSEORCISH#ƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…#
-295,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_DEATH#ƒfƒX#
-296,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_FORTUNE#ƒtƒH[ƒ`ƒ…ƒ“#
-297,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_TAMINGMONSTER#ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^[#
-298,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_QUESTION#H#
-299,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_GRAVITY#ƒOƒ‰ƒrƒeƒB#
-300,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_LEVELUP#ƒŒƒxƒ‹ƒAƒbƒv#
-301,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_INSTANTDEATH#ƒCƒ“ƒXƒ^ƒ“ƒgƒfƒX#
-302,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_FULLRECOVERY#ƒtƒ‹ƒŠƒJƒoƒŠ[#
-303,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_COMA#ƒR[ƒ}#
-304,0,6,4,0,1,1,1,no,0,0,0,none,0 //BD_ADAPTATION#ƒAƒhƒŠƒu#
-305,0,6,4,0,1,1,1,no,0,0,0,none,0 //BD_ENCORE#ƒAƒ“ƒR[ƒ‹#
-306,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_LULLABY#ŽqŽç‰Ì#
-307,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
-308,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
-309,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_DRUMBATTLEFIELD#푾ŒÛ‚Ì‹¿‚«#
-310,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_RINGNIBELUNGEN#ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
-311,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
-312,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_INTOABYSS#[•£‚Ì’†‚É#
-313,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_SIEGFRIED#•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-//314,0,0,0,0,0,1,1,no,0,0,0,misc,0 //BD_RAGNAROK#_X‚̉©¨#
-315,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BA_MUSICALLESSON#ŠyŠí‚Ì—ûK#
-316,8,6,1,0,0,5,1,no,0,0,0,weapon,0 //BA_MUSICALSTRIKE#ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-317,0,8,4,0,1,5,1,no,0,0,0,misc,0 //BA_DISSONANCE#•s‹¦˜a‰¹#
-318,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡[ƒN#
-319,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_WHISTLE#Œû“J#
-320,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-321,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
-322,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
-323,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //DC_DANCINGLESSON#ƒ_ƒ“ƒX‚Ì—ûK#
-324,8,6,1,0,0,5,1,no,0,0,0,weapon,0 //DC_THROWARROW#–‚¿#
-325,0,8,4,0,1,5,1,no,0,0,0,misc,0 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-326,0,6,4,0,1,5,1,no,0,0,0,misc,0 //DC_SCREAM#ƒXƒNƒŠ[ƒ€#
-327,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
-328,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-329,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_FORTUNEKISS#K‰^‚̃LƒX#
-330,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_SERVICEFORYOU#ƒT[ƒrƒXƒtƒH[ƒ†[#
-331,1,6,4,3,1,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION2#Ž©”š2#
-
-334,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
-335,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //WE_FEMALE#‚ ‚È‚½‚És‚­‚µ‚Ü‚·#
-336,8,6,4,0,1,1,1,yes,0,0,1,magic,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
-
-//338,0,0,0,0,0,0,0,no,0,0,0,none,0 //NPC_DARKCROSS#ƒ_[ƒNƒNƒƒX#
-
-355,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //LK_AURABLADE#ƒI[ƒ‰ƒuƒŒ[ƒh#
-356,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
-357,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“#
-358,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
-359,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_BERSERK#ƒo[ƒT[ƒN#
-//360,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_FURY#ƒtƒ…[ƒŠ[#
-361,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
-362,4,6,4,0,1,5,1,yes,0,0,0,magic,2 //HP_BASILICA#ƒoƒWƒŠƒJ#
-363,0,0,0,0,0,10,0,no,0,0,0,magic,0 //HP_MEDITATIO#ƒƒfƒBƒeƒCƒeƒBƒI#
-364,0,0,0,0,0,10,1,no,0,0,0,magic,0 //HW_SOULDRAIN#ƒ\ƒEƒ‹ƒhƒŒƒCƒ“#
-365,8,8,1,0,2,1,1,yes,0,0,0,magic,0 //HW_MAGICCRASHER#ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[#
-366,0,6,4,0,1,10,1,no,0,0,0,magic,0 //HW_MAGICPOWER#–‚–@—Í‘•#
-367,8,8,1,0,2,5,1,no,0,0,0,magic,0 //PA_PRESSURE#ƒvƒŒƒbƒVƒƒ[#
-368,8,6,1,0,2,5,1,yes,0,0,0,magic,0 //PA_SACRIFICE#ƒTƒNƒŠƒtƒ@ƒCƒX#
-369,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
-370,-2,6,1,0,0,5,1,yes,0,0,0,weapon,3 //CH_PALMSTRIKE#–ÒŒÕd”hŽR#
-371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0 //CH_TIGERFIST#•šŒÕŒ#
-372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0 //CH_CHAINCRUSH#˜A’Œ•öŒ‚#
-373,0,6,4,0,1,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#ƒ‰ƒCƒt’u‚«Š·‚¦#
-374,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
-375,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULBURN#ƒ\ƒEƒ‹ƒo[ƒ“#
-376,0,0,0,0,1,5,1,no,0,0,0,weapon,0 //ASC_KATAR#ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†#
-377,0,0,4,0,1,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#ƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“ƒEƒH[ƒN#
-378,0,6,4,5,1,10,1,no,0,1024,0,weapon,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“#
-379,5,6,1,0,0,10,1,no,0,0,0,weapon,0 //ASC_BREAKER#ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[#
-380,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SN_SIGHT#ƒgƒDƒ‹[ƒTƒCƒg#
-381,9,8,1,0,0,5,1:2:3:4:5,yes,0,0,0,misc,0 //SN_FALCONASSAULT#ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg#
-382,9,8,1,0,0,5,1,no,0,0,0,weapon,0 //SN_SHARPSHOOTING#ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO#
-383,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH[ƒN#
-384,0,0,4,0,1,10,1,yes,0,0,0,magic,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
-385,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WS_CREATECOIN#ƒNƒŠƒGƒCƒgƒRƒCƒ“#
-386,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WS_CREATENUGGET#‰ò»‘¢#
-387,0,6,4,0,1,1,1,no,0,0,0,weapon,0 //WS_CARTBOOST#ƒJ[ƒgƒu[ƒXƒg#
-388,8,6,2,0,1,5,1,no,0,0,0,none,0 //WS_SYSTEMCREATE#Ž©“®UŒ‚‘•’u»ì#
-389,0,6,4,0,1,5,1,no,0,0,0,none,0 //ST_CHASEWALK#ƒ`ƒFƒCƒXƒEƒH[ƒN#
-390,0,0,4,0,1,5,1,yes,0,0,0,magic,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\[ƒh#
-//391,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //ST_STEALBACKPACK#ƒXƒeƒB[ƒ‹ƒoƒbƒNƒpƒbƒN#
-392,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CR_ALCHEMY#ƒAƒ‹ƒPƒ~[#
-393,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CR_SYNTHESISPOTION#ƒ|[ƒVƒ‡ƒ“ƒVƒ“ƒZƒVƒX#
-394,8,8,1,0,0,10,2,no,0,0,0,weapon,0 //CG_ARROWVULCAN#ƒAƒ[ƒoƒ‹ƒJƒ“#
-395,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
-396,0,6,16,0,1,1,1,yes,0,0,0,magic,1 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹#
-397,4,8,1,0,0,5,1,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX#
-398,4,6,1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
-399,4,6,1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
-400,8,8,1,8,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
-401,0,6,4,0,1,1,1,yes,0,0,0,weapon,0 //CH_SOULCOLLECT#‹¶‹CŒ÷#
-402,8,6,1,0,1,10,1,no,0,0,0,none,0 //PF_MINDBREAKER#ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[#
-403,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_MEMORIZE#ƒƒ‚ƒ‰ƒCƒY#
-404,3,6,2,2,1,5,1,yes,0,128,1,magic,0 //PF_FOGWALL#ƒtƒHƒOƒEƒH[ƒ‹#
-405,3,6,2,0,1,5,1,no,0,128,2,misc,0 //PF_SPIDERWEB#ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
-406,-1,6,1,0,2,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
-407,0,6,4,0,1,10,0,no,0,0,0,none,0 //ASC_CDP#ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“»‘¢#
-408,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_BABY##
-409,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_CALLPARENT##
-410,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_CALLBABY##
-411,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_RUN##
-412,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYSTORM##
-413,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_STORMKICK##
-414,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYDOWN##
-415,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_DOWNKICK##
-416,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYTURN##
-417,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_TURNKICK##
-418,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYCOUNTER##
-419,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_COUNTER##
-420,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_DODGE##
-421,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_JUMPKICK##
-422,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_HPTIME##
-423,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_SPTIME##
-424,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_POWER##
-425,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_SEVENWIND##
-426,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_HIGHJUMP##
-427,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FEEL##
-428,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_WARM##
-429,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_WARM##
-430,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_WARM##
-431,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_COMFORT##
-432,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_COMFORT##
-433,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_COMFORT##
-434,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_HATE##
-435,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_ANGER##
-436,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_ANGER##
-437,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_ANGER##
-438,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_BLESS##
-439,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_BLESS##
-440,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_BLESS##
-441,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_DEVIL##
-442,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FRIEND##
-443,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_KNOWLEDGE##
-444,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FUSION##
-445,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ALCHEMIST##
-446,0,0,0,0,0,0,0,no,0,0,0,none,0 //AM_BERSERKPITCHER##
-447,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_MONK##
-448,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STAR##
-449,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SAGE##
-450,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_CRUSADER##
-451,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SUPERNOVICE##
-452,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KNIGHT##
-453,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_WIZARD##
-454,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_PRIEST##
-455,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_BARDDANCER##
-456,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ROGUE##
-457,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ASSASIN##
-458,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_BLACKSMITH##
-459,0,0,0,0,0,0,0,no,0,0,0,none,0 //BS_ADRENALINE2##
-460,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_HUNTER##
-461,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SOULLINKER##
-462,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAIZEL##
-463,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAAHI##
-464,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAUPE##
-465,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAITE##
-466,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAINA##
-467,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STIN##
-468,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STUN##
-469,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SMA##
-470,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SWOO##
-471,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SKE##
-472,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SKA##
-
-10000,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_APPROVAL#³‹KƒMƒ‹ƒh³”F#
-10001,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_KAFRACONTRACT#ƒJƒvƒ‰ŒÙ—p#
-10002,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GUARDRESEARCH#ƒK[ƒfƒBƒAƒ“Œ¤‹†#
-10003,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_CHARISMA#ƒJƒŠƒXƒ}#Later changed to GD_GUARDUP#
-10004,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_EXTENSION#ƒMƒ‹ƒhŠg’£#
-10005,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GLORYGUILD##
-10006,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_LEADERSHIP##
-10007,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GLORYWOUNDS##
-10008,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_SOULCOLD##
-10009,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_HAWKEYES##
-10010,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_BATTLEORDER##
-10011,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_REGENERATION##
-10012,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_RESTORE##
-10013,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_EMERGENCYCALL##
-10014,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_DEVELOPMENT##
+//skill_db.txt—AthenaDBŒv‰æ 2004/06/06 14:27:11 +0900 (JST)
+//id,range,hit,inf,pl,nk,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
+1,0,0,0,0,0,9,0,no,0,0,0,none,0 //NV_BASIC#Šî–{ƒXƒLƒ‹#
+2,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_SWORD#ΥCў#
+3,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SM_TWOHAND#—¼ŽèŒ•C—û#
+4,0,0,0,0,0,10,0,no,0,0,0,none,0 //SM_RECOVERY#HP‰ñ•œ—ÍŒüã#
+5,-1,6,1,0,0,10,1,no,0,0,0,weapon,0 //SM_BASH#ƒoƒbƒVƒ…#
+6,8,6,1,0,1,10,1,no,0,0,0,none,0 //SM_PROVOKE#ƒvƒƒ{ƒbƒN#
+7,-1,6,1,3,2,10,5,no,0,0,0,weapon,2 //SM_MAGNUM#ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+8,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SM_ENDURE#ƒCƒ“ƒfƒ…ƒA#
+9,0,0,0,0,0,10,0,no,0,0,0,none,0 //MG_SRECOVERY#SP‰ñ•œ—ÍŒüã#
+10,8,6,4,3,1,1,1,yes,0,0,0,magic,0 //MG_SIGHT#ƒTƒCƒg#
+11,8,6,1,8,0,10,1,yes,0,0,0,magic,0 //MG_NAPALMBEAT#ƒiƒp[ƒ€ƒr[ƒg#
+12,8,8,2,8,0,10,1,yes,0,0,0,magic,0 //MG_SAFETYWALL#ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+13,8,8,1,8,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //MG_SOULSTRIKE#ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+14,8,8,1,1,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_COLDBOLT#ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+15,8,6,1,1,0,10,1,yes,0,0,0,magic,0 //MG_FROSTDIVER#ƒtƒƒXƒgƒ_ƒCƒo[#
+16,2,6,1,2,1,10,1,yes,0,0,0,magic,0 //MG_STONECURSE#ƒXƒg[ƒ“ƒJ[ƒX#
+17,8,6,1,3,0,10,1,yes,0,0,0,magic,0 //MG_FIREBALL#ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+18,8,6,2,3,0,10,1,yes,0,0,3,magic,2 //MG_FIREWALL#ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+19,8,8,1,3,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_FIREBOLT#ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+20,8,8,1,4,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_LIGHTNINGBOLT#ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+21,5,8,2,4,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //MG_THUNDERSTORM#ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+22,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DP#ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+23,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AL_DEMONBANE#ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+24,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //AL_RUWACH#ƒ‹ƒAƒt#
+25,8,6,2,0,1,1,1,yes,0,0,0,magic,0 //AL_PNEUMA#ƒjƒ…[ƒ}#
+26,0,6,4,0,1,2,1,yes,0,0,0,magic,0 //AL_TELEPORT#ƒeƒŒƒ|[ƒg#
+27,5,6,2,0,1,4,1,yes,0,0,3,magic,0 //AL_WARP#ƒ[ƒvƒ|[ƒ^ƒ‹#
+28,8,6,16,6,1,10,1,yes,0,0,0,magic,0 //AL_HEAL#ƒq[ƒ‹#
+29,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //AL_INCAGI#‘¬“x‘‰Á#
+30,8,6,1,0,1,10,1,yes,0,0,0,magic,0 //AL_DECAGI#‘¬“xŒ¸­#
+31,1,6,4,0,1,1,1,yes,0,0,0,magic,0 //AL_HOLYWATER#ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+32,8,6,4,0,1,10,1,yes,0,0,0,magic,0 //AL_CRUCIS#ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+33,8,6,4,0,1,10,1,yes,0,0,0,magic,0 //AL_ANGELUS#ƒGƒ“ƒWƒFƒ‰ƒX#
+34,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //AL_BLESSING#ƒuƒŒƒbƒVƒ“ƒO#
+35,8,6,16,0,1,1,1,yes,0,0,0,magic,0 //AL_CURE#ƒLƒ…ƒA[#
+36,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_INCCARRY#ŠŽŒÀŠE—Ê‘‰Á#
+37,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_DISCOUNT#ƒfƒBƒXƒJƒEƒ“ƒg#
+38,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_OVERCHARGE#ƒI[ƒo[ƒ`ƒƒ[ƒW#
+39,0,0,0,0,0,10,0,no,0,0,0,none,0 //MC_PUSHCART#ƒvƒbƒVƒ…ƒJ[ƒg#
+40,0,6,4,0,1,1,1,no,0,0,0,none,0 //MC_IDENTIFY#ƒAƒCƒeƒ€ŠÓ’è#
+41,0,6,4,0,1,10,1,no,0,0,0,none,0 //MC_VENDING#˜I“XŠJÝ#
+42,-2,6,1,0,0,10,1,no,0,0,0,weapon,0 //MC_MAMMONITE#ƒƒ}[ƒiƒCƒg#
+43,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_OWL#‚Ó‚­‚낤‚Ì–Ú#
+44,0,0,0,0,0,10,0,no,0,0,0,none,0 //AC_VULTURE#ƒƒV‚Ì–Ú#
+45,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //AC_CONCENTRATION#W’†—ÍŒüã#
+46,-3,8,1,0,0,10,2,no,0,0,0,weapon,0 //AC_DOUBLE#ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+47,-3,6,1,0,2,10,1,no,0,0,0,weapon,2 //AC_SHOWER#ƒAƒ[ƒVƒƒƒ[#
+48,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_DOUBLE#ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+49,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //TF_MISS#‰ñ”𗦑‰Á#
+50,1,6,1,0,1,10,1,no,0,0,0,weapon,0 //TF_STEAL#ƒXƒeƒB[ƒ‹#
+51,0,6,4,0,1,10,1,no,0,0,0,none,0 //TF_HIDING#ƒnƒCƒfƒBƒ“ƒO#
+52,3,6,1,5,0,10,1,no,0,0,0,weapon,0 //TF_POISON#ƒCƒ“ƒxƒiƒ€#
+53,10,6,16,5,1,1,1,no,0,0,0,weapon,0 //TF_DETOXIFY#‰ð“Å#
+54,8,6,16,6,1,4,1,yes,0,0,0,magic,0 //ALL_RESURRECTION#ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+55,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //KN_SPEARMASTERY#‘„C—û#
+56,-1,8,1,0,0,10,3,no,0,0,0,weapon,0 //KN_PIERCE#ƒsƒA[ƒX#
+57,1,6,1,0,1,10,1,no,33,0,0,weapon,1 //KN_BRANDISHSPEAR#ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+58,4,6,1,0,2,10,1,no,0,0,0,weapon,6 //KN_SPEARSTAB#ƒXƒsƒAƒXƒ^ƒu#
+59,-3:-5:-7:-9:-11,6,1,0,0,5,1,no,0,0,0,weapon,0 //KN_SPEARBOOMERANG#ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+60,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //KN_TWOHANDQUICKEN#ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+61,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //KN_AUTOCOUNTER#ƒI[ƒgƒJƒEƒ“ƒ^[#
+62,-1,6,1,0,2,10,1,no,33,0,0,weapon,1:1:2:2:3:3:4:4:5:6 //KN_BOWLINGBASH#ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+63,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //KN_RIDING#ƒ‰ƒCƒfƒBƒ“ƒO#
+64,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //KN_CAVALIERMASTERY#‹R•ºC—û#
+65,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //PR_MACEMASTERY#ƒƒCƒXC—û#
+66,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //PR_IMPOSITIO#ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+67,8,6,16,0,1,3,1,yes,0,512,0,magic,0 //PR_SUFFRAGIUM#ƒTƒtƒ‰ƒMƒEƒ€#
+68,8,6,16,6,1,5,1,yes,0,0,0,magic,0 //PR_ASPERSIO#ƒAƒXƒyƒ‹ƒVƒI#
+69,1,6,2,0,1,5,1,yes,0,0,0,magic,0 //PR_BENEDICTIO#¹‘Ì~•Ÿ#
+70,8,6,2,6,1,10,1,yes,0,0,0,magic,2 //PR_SANCTUARY#ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+71,8,6,16,0,1,4,1,yes,0,0,0,magic,0 //PR_SLOWPOISON#ƒXƒ[ƒ|ƒCƒYƒ“#
+72,8,6,16,0,1,1,1,yes,0,0,0,magic,0 //PR_STRECOVERY#ƒŠƒJƒoƒŠ[#
+73,8,6,16,0,1,10,1,yes,0,0,0,magic,0 //PR_KYRIE#ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+74,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //PR_MAGNIFICAT#ƒ}ƒOƒjƒtƒBƒJ[ƒg#
+75,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //PR_GLORIA#ƒOƒƒŠƒA#
+76,8,6,1,0,1,10,0,yes,0,0,0,magic,0 //PR_LEXDIVINA#ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
+77,8,6,1,6,0,10,1,yes,0,0,0,magic,0 //PR_TURNUNDEAD#ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
+78,8,6,1,0,1,1,0,yes,0,0,0,magic,0 //PR_LEXAETERNA#ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
+79,3,8,2,6,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0 //PR_MAGNUS#ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+80,8,8,2,3,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,128,5,magic,0 //WZ_FIREPILLAR#ƒtƒ@ƒCƒA[ƒsƒ‰[#
+81,0,6,4,3,0,10,1,yes,0,0,0,magic,5 //WZ_SIGHTRASHER#ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
+//82,8,6,2,3,0,10,1,yes,0,0,0,magic,0 //WZ_FIREIVY#ƒtƒ@ƒCƒAƒAƒCƒr[#
+83,8,8,2,3,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0 //WZ_METEOR#ƒƒeƒIƒXƒg[ƒ€#
+84,8,8,1,4,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#ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
+85,8,8,2,4,0,10,10,yes,0,0,0,magic,0 //WZ_VERMILION#ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
+86,8,8,1,1,0,5,1,yes,0,0,0,magic,0 //WZ_WATERBALL#ƒEƒH[ƒ^[ƒ{[ƒ‹#
+87,8,6,2,1,0,10,1,yes,0,0,0,magic,0 //WZ_ICEWALL#ƒAƒCƒXƒEƒH[ƒ‹#
+88,0,6,4,1,0,10,1,yes,0,0,0,magic,0 //WZ_FROSTNOVA#ƒtƒƒXƒgƒmƒ”ƒ@#
+89,8,6,2,1,1,10,1,yes,0,0,0,magic,2 //WZ_STORMGUST#ƒXƒg[ƒ€ƒKƒXƒg#
+90,8,8,1,2,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_EARTHSPIKE#ƒA[ƒXƒXƒpƒCƒN#
+91,8,8,2,2,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //WZ_HEAVENDRIVE#ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+92,8,6,2,2,1,5,1,yes,0,0,3,magic,0 //WZ_QUAGMIRE#ƒNƒ@ƒOƒ}ƒCƒA#
+93,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //WZ_ESTIMATION#ƒ‚ƒ“ƒXƒ^[î•ñ#
+94,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_IRON#“S»‘¢#
+95,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_STEEL#|“S»‘¢#
+96,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ENCHANTEDSTONE#‘®«Î»‘¢#
+97,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_ORIDEOCON#ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
+98,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_DAGGER#’ZŒ•»ì#
+99,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SWORD#Υȓ#
+100,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_TWOHANDSWORD#—¼ŽèŒ•»ì#
+101,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_AXE#•€»ì#
+102,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_MACE#ƒƒCƒX»ì#
+103,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_KNUCKLE#ƒiƒbƒNƒ‹»ì#
+104,0,0,0,0,0,3,0,no,0,0,0,weapon,0 //BS_SPEAR#‘„»ì#
+105,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_HILTBINDING#ƒqƒ‹ƒgƒoƒCƒ“ƒfƒBƒ“ƒO#
+106,0,0,0,0,0,1,0,no,0,0,0,weapon,0 //BS_FINDINGORE#zΔ­Œ©#
+107,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
+108,0,6,4,0,1,1,1,no,0,0,0,weapon,0 //BS_REPAIRWEAPON#•ŠíC—#
+109,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //BS_SKINTEMPER#ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
+110,2,6,2,0,1,5,1,no,0,0,0,weapon,0 //BS_HAMMERFALL#ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
+111,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_ADRENALINE#ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+112,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_WEAPONPERFECT#ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
+113,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_OVERTHRUST#ƒI[ƒo[ƒgƒ‰ƒXƒg#
+114,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //BS_MAXIMIZE#ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
+115,3,6,2,0,1,5,1,no,0,128,0,misc,6:7:8:9:10 //HT_SKIDTRAP#ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+116,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_LANDMINE#ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+117,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_ANKLESNARE#ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+118,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_SHOCKWAVE#ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
+119,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_SANDMAN#ƒTƒ“ƒhƒ}ƒ“#
+120,3,6,2,0,1,5,1,no,0,128,0,misc,0 //HT_FLASHER#ƒtƒ‰ƒbƒVƒƒ[#
+121,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_FREEZINGTRAP#ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+122,3,6,2,3,1,5,1,no,0,128,0,misc,0 //HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+123,3,6,2,2,1,5,1,no,0,128,0,misc,0 //HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒAƒgƒ‰ƒbƒv#
+124,2,6,32,0,1,1,1,no,0,0,0,misc,0 //HT_REMOVETRAP#ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+125,3,6,2,0,1,1,1,no,0,0,0,misc,0 //HT_TALKIEBOX#ƒg[ƒL[ƒ{ƒbƒNƒX#
+126,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //HT_BEASTBANE#ƒr[ƒXƒgƒxƒCƒ“#
+127,0,0,0,0,0,1,0,no,0,0,0,misc,0 //HT_FALCON#ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
+128,0,0,0,0,0,10,0,no,0,0,0,misc,0 //HT_STEELCROW#ƒXƒ`[ƒ‹ƒNƒƒE#
+129,9,8,1,0,0,5,1:2:3:4:5,yes,0,0,0,misc,0 //HT_BLITZBEAT#ƒuƒŠƒbƒcƒr[ƒg#
+130,8,6,2,0,1,4,1,no,0,0,0,misc,0 //HT_DETECTING#ƒfƒBƒeƒNƒeƒBƒ“ƒO#
+131,-5:-6:-7:-8:-9,6,32,0,1,5,1,no,0,0,0,misc,0 //HT_SPRINGTRAP#ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
+132,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_RIGHT#‰EŽèC—û#
+133,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //AS_LEFT#¶ŽèC—û#
+134,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AS_KATAR#ƒJƒ^[ƒ‹C—û#
+135,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //AS_CLOAKING#ƒNƒ[ƒLƒ“ƒO#
+136,-1,8,1,0,0,10,8,no,0,0,0,weapon,0 //AS_SONICBLOW#ƒ\ƒjƒbƒNƒuƒ[#
+137,3:4:5:6:7,6,1,0,0,5,1,no,0,0,0,weapon,0 //AS_GRIMTOOTH#ƒOƒŠƒ€ƒgƒD[ƒX#
+138,8,6,16,5,1,10,1,no,0,1024,0,weapon,0 //AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+139,0,6,16,5,1,10,1,no,0,0,0,weapon,0 //AS_POISONREACT#ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
+140,2,6,2,5,1,10,1,no,0,0,0,weapon,0 //AS_VENOMDUST#ƒxƒiƒ€ƒ_ƒXƒg#
+141,2,6,1,0,1,10,1,yes,0,0,0,weapon,0 //AS_SPLASHER#ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
+142,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_FIRSTAID#‰ž‹}Žè“–#
+143,0,6,4,0,1,1,1,no,0,1,0,none,0 //NV_TRICKDEAD#Ž€‚ñ‚¾‚Ó‚è#
+144,0,0,0,0,0,1,0,no,0,1,0,none,0 //SM_MOVINGRECOVERY#ˆÚ“®ŽžHP‰ñ•œ#
+145,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_FATALBLOW#‹}ŠUŒ‚#
+146,0,0,0,0,0,1,0,no,0,1,0,weapon,0 //SM_AUTOBERSERK#ƒI[ƒgƒo[ƒT[ƒN#
+147,0,0,4,0,1,1,0,no,0,1,0,weapon,0 //AC_MAKINGARROW#–îì¬#
+148,-3,6,1,0,2,1,1,no,0,1,0,weapon,6 //AC_CHARGEARROW#ƒ`ƒƒ[ƒWƒAƒ[#
+149,8,6,1,2,0,1,1,no,0,1,0,weapon,0 //TF_SPRINKLESAND#»‚Ü‚«#
+150,0,6,4,0,1,1,1,no,0,1,0,weapon,5 //TF_BACKSLIDING#ƒoƒbƒNƒXƒeƒbƒv#
+151,0,6,4,0,1,1,1,no,0,1,0,none,0 //TF_PICKSTONE#ÎE‚¢#
+152,8,6,1,0,0,1,1,no,0,1,0,weapon,0 //TF_THROWSTONE#ΓŠ‚°#
+153,1,6,1,0,2,1,1,no,0,1,0,weapon,2 //MC_CARTREVOLUTION#ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+154,0,6,4,0,1,1,1,no,0,1,0,none,0 //MC_CHANGECART#ƒ`ƒFƒ“ƒWƒJ[ƒg#
+155,0,6,4,0,1,1,1,no,0,1,0,weapon,0 //MC_LOUD#ƒ‰ƒEƒhƒ{ƒCƒX#
+156,8,6,1,6,0,1,1,yes,0,1,0,magic,0 //AL_HOLYLIGHT#ƒz[ƒŠ[ƒ‰ƒCƒg#
+157,0,6,4,0,1,1,1,yes,0,1,0,magic,0 //MG_ENERGYCOAT#ƒGƒiƒW[ƒR[ƒg#
+// “G(NPC)ƒXƒLƒ‹
+// “ú–{Œê‰ðàŽQÆŒ³
+// http://rovc.at.infoseek.co.jp/o/2/oindex2.html
+158,3,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PIERCINGATT#“Ë‚«Žh‚µUŒ‚#
+159,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MENTALBREAKER#¸_”j‰ó#
+160,9,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANGEATTACK#‰“‹——£UŒ‚#
+161,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_ATTRICHANGE#ƒ‰ƒ“ƒ_ƒ€‘®«•Ï‰»#
+162,0,0,4,1,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEWATER#…‘®«•Ï‰»#
+163,0,0,4,2,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEGROUND#’n‘®«•Ï‰»#
+164,0,0,4,3,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEFIRE#‰Î‘®«•Ï‰»#
+165,0,0,4,4,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEWIND#•—‘®«•Ï‰»#
+166,0,0,4,5,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEPOISON#“Å‘®«•Ï‰»#
+167,0,0,4,6,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEHOLY#¹‘®«•Ï‰»#
+168,0,0,4,7,1,10,1,no,0,2,0,magic,0 //NPC_CHANGEDARLNESS#ˆÅ‘®«•Ï‰»#
+169,0,0,4,8,1,10,1,no,0,2,0,magic,0 //NPC_CHANGETELEKINESIS#”O‘®«•Ï‰»#
+170,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CRITICALSLASH#–hŒä–³Ž‹UŒ‚#
+171,-1,8,1,0,0,10,2:3:4:5:6:7:8:9:10:11,no,0,2,0,weapon,0 //NPC_COMBOATTACK#‘½’iUŒ‚#
+172,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_GUIDEATTACK#•K’†UŒ‚#
+173,1,6,4,3,1,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION#Ž©”š#
+174,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SPLASHATTACK#”͈ÍUŒ‚#
+175,0,0,4,0,1,10,1,no,0,2,0,misc,0 //NPC_SUICIDE#Ž©Œˆ#
+176,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_POISON#“ÅUŒ‚#
+177,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLINDATTACK#ˆÃˆÅUŒ‚#
+178,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SILENCEATTACK#’¾–ÙUŒ‚#
+179,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_STUNATTACK#ƒXƒ^ƒ“UŒ‚#
+180,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_PETRIFYATTACK#Ή»UŒ‚#
+181,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_CURSEATTACK#Žô‚¢UŒ‚#
+182,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_SLEEPATTACK#‡–°UŒ‚#
+183,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_RANDOMATTACK#ƒ‰ƒ“ƒ_ƒ€UŒ‚#
+184,-1,6,1,1,0,10,1,no,0,2,0,weapon,0 //NPC_WATERATTACK#…‘®«UŒ‚#
+185,-1,6,1,2,0,10,1,no,0,2,0,weapon,0 //NPC_GROUNDATTACK#’n‘®«UŒ‚#
+186,-1,6,1,3,0,10,1,no,0,2,0,weapon,0 //NPC_FIREATTACK#‰Î‘®«UŒ‚#
+187,-1,6,1,4,0,10,1,no,0,2,0,weapon,0 //NPC_WINDATTACK#•—‘®«UŒ‚#
+188,-1,6,1,5,0,10,1,no,0,2,0,weapon,0 //NPC_POISONATTACK#“Å‘®«UŒ‚#
+189,-1,6,1,6,0,10,1,no,0,2,0,weapon,0 //NPC_HOLYATTACK#¹‘®«UŒ‚#
+190,-1,6,1,7,0,10,1,no,0,2,0,weapon,0 //NPC_DARKNESSATTACK#ˆÅ‘®«UŒ‚#
+191,-1,6,1,8,0,10,1,no,0,2,0,weapon,0 //NPC_TELEKINESISATTACK#”O‘®«UŒ‚#
+192,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_MAGICALATTACK#–‚–@‘ÅŒ‚UŒ‚#
+193,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_METAMORPHOSIS#ƒƒ^ƒ‚ƒ‹ƒtƒH[ƒX#
+194,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_PROVOCATION#’§”­#
+195,0,6,4,0,0,10,1,no,0,2,0,misc,0 //NPC_SMOKING#‹i‰Œ#
+196,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_SUMMONSLAVE#Žæ‚芪‚«¢Š«#
+197,0,0,4,0,1,10,1,no,0,2,0,none,0 //NPC_EMOTION#ƒGƒ‚[ƒVƒ‡ƒ“#
+198,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_TRANSFORMATION#ƒgƒ‰ƒ“ƒXƒtƒH[ƒ[ƒVƒ‡ƒ“#
+199,-1,6,1,0,0,10,1,no,0,2,0,weapon,0 //NPC_BLOODDRAIN#‹zŒŒ#
+200,8,6,1,0,0,10,1,no,0,2,0,magic,0 //NPC_ENERGYDRAIN#ƒGƒiƒW[ƒhƒŒƒCƒ“#
+201,0,0,4,0,1,10,1,no,0,2,0,weapon,0 //NPC_KEEPING#ƒL[ƒsƒ“ƒO#
+202,2,6,1,7,0,10,1,no,0,2,0,misc,0 //NPC_DARKBREATH#ƒ_[ƒNƒuƒŒƒX#
+203,1,6,1,7,1,10,1,no,0,2,0,magic,0 //NPC_DARKBLESSING#ƒ_[ƒNƒuƒŒƒbƒVƒ“ƒO#
+204,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_BARRIER#ƒoƒŠƒA[#
+205,0,0,4,0,1,10,1,no,0,2,0,weapon,0 //NPC_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
+206,1,6,1,0,1,10,1,no,0,2,0,weapon,0 //NPC_LICK#ƒŠƒbƒN#
+207,8,0,1,0,1,10,1,no,0,2,0,magic,0 //NPC_HALLUCINATION#öŠo#
+208,0,0,0,0,0,10,1,no,0,2,0,magic,0 //NPC_REBIRTH#ƒŠƒo[ƒX#
+209,0,0,4,0,1,10,1,no,0,2,0,magic,0 //NPC_SUMMONMONSTER#ƒ‚ƒ“ƒXƒ^[¢Š«#
+
+//Žx‰‡ŒnƒpƒPƒbƒg‚ŃeƒXƒg
+//162 ‘®«•ÏXHF‚¢ƒGƒtƒFƒNƒg
+//163 ‘®«•ÏXHFÔi’ƒHjƒGƒtƒFƒNƒg
+//164 ‘®«•ÏXHFÔƒGƒtƒFƒNƒg
+//165 ‘®«•ÏXHF‰©FƒGƒtƒFƒNƒg
+//166 ‘®«•ÏXHFŽ‡ƒGƒtƒFƒNƒg
+//167 ‘®«•ÏXHF”’ƒGƒtƒFƒNƒg
+//168 ‘®«•ÏXHF•ƒGƒtƒFƒNƒg
+//169 ‘®«•ÏXHFŽ‡ƒGƒtƒFƒNƒg‚Q
+//173 ”hŽè‚È”š”­ƒGƒtƒFƒNƒgiŽ©”šHj
+//??? ƒnƒCƒhŒ©‚½‚¢‚ȃGƒtƒFƒNƒg
+//201 •‚¢‰HiŠkHj‚Ý‚½‚¢‚È‚Ì‚Å•¢‚í‚ê‚éƒGƒtƒFƒNƒg
+//205 ‚‚Ý‚½‚¢‚È‚à‚ÌoŒ»ƒGƒtƒFƒNƒg
+
+//UŒ‚ŒnƒpƒPƒbƒg‚ŃeƒXƒg
+//160 ‘„‚ª”ò‚Ô
+//170 ƒNƒŠƒeƒBƒJƒ‹
+//171 ¬‚³‚ÈH‰ÎH‚Ý‚½‚¢‚È‚Ì‚ªo‚é
+//172 Æ€‚ª‚Å‚éiƒƒbƒNƒIƒ“Hj
+//176 “Å•t‰ÁH
+//178 ‚È‚ñ‚©‚æ‚­‚í‚©‚ç‚È‚¢‹L†‚Ì‚ ‚Æ‚É~ˆói’¾–ÙUŒ‚Hj
+//179 ‚È‚É‚©”’‚¢‚à‚Ì‚ª”ò‚Ñ‚¿‚Á‚½iƒXƒ^ƒ“UŒ‚Hj
+//180 ƒXƒg[ƒ“ƒJ[ƒXH
+//182 Zzzƒ}[ƒN‚ªo‚é
+//185 ­‚µ‰©F‚­Œõ‚Á‚½‚«‚ª‚·‚éi‹C‚Ì‚¹‚¢Hj
+//186 ‰ŠŒn‚ÌUŒ‚‚Á‚Û‚¢iFW‚ł̃_ƒ[ƒW‚Á‚Û‚¢j
+//187 “dŒ‚ŒnH‚̃_ƒ[ƒW‚Á‚Û‚¢
+//188 Ž‡‚Á‚Û‚¢i“ÅŒnƒ_ƒ[ƒWHj
+//189 \Žš‰ËƒGƒtƒFƒNƒgi¹‚È‚éUŒ‚‚Á‚Û‚¢j
+//190 ˆÃ•Œn‚̃_ƒ[‚¶HH
+//191 185‚É‚¨‚È‚¶
+//193 ƒnƒCƒh‚Ý‚½‚¢‚ÉŒõ‚Á‚½iƒoƒbƒVƒ…‚©‚àHj
+//194 “¯‚¶‚­
+//195 “¯‚¶‚­
+//197 “¯‚¶‚­
+//198 “¯‚¶‚­
+//199 HP‚̃hƒŒƒCƒ“‚Á‚Û‚¢
+//200 SP‚̃hƒŒƒCƒ“‚Á‚Û‚¢
+//201 193‚É“¯‚¶
+//202 darkbreath‚ŃGƒ‰[iƒ_[ƒNƒuƒŒƒXHƒhƒ‰ƒSƒ“‚ÌUŒ‚Hj
+//203 193‚É“¯‚¶
+//204 193‚É“¯‚¶
+//205 193‚É“¯‚¶
+//206 193‚É“¯‚¶
+//207 193‚É“¯‚¶
+//208 193‚É“¯‚¶
+210,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //RG_SNATCHER#ƒXƒiƒbƒ`ƒƒ[#
+211,1,6,1,0,1,10,1,no,0,0,0,weapon,0 //RG_STEALCOIN#ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
+212,-1,6,1,0,0,10,1,no,0,0,0,weapon,1 //RG_BACKSTAP#ƒoƒbƒNƒXƒ^ƒu#
+213,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_TUNNELDRIVE#ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
+214,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //RG_RAID#ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+215,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPWEAPON#ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“#
+216,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPSHIELD#ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
+217,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPARMOR#ƒXƒgƒŠƒbƒvƒA[ƒ}[#
+218,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPHELM#ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+219,-1,6,1,0,0,5,1,no,0,0,0,weapon,0 //RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
+220,1,6,2,0,1,1,1,no,0,0,0,none,0 //RG_GRAFFITI#ƒOƒ‰ƒtƒBƒeƒB#
+221,0,6,2,0,1,5,1,no,0,0,0,none,0 //RG_FLAGGRAFFITI#ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
+222,0,6,2,0,1,1,1,no,0,0,0,none,0 //RG_CLEANER#ƒNƒŠ[ƒi[#
+223,0,0,0,0,0,1,0,no,0,0,0,none,0 //RG_GANGSTER#ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
+224,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_COMPULSION#ƒRƒ“ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
+225,0,0,0,0,0,10,0,no,0,0,0,none,0 //RG_PLAGIARISM#ƒNƒ[ƒ“ƒXƒLƒ‹#
+226,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AM_AXEMASTERY#•€C—û#
+227,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_LEARNINGPOTION#ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
+228,0,6,4,0,1,10,0,no,0,0,0,none,0 //AM_PHARMACY#ƒtƒ@[ƒ}ƒV[#
+229,8,6,2,3,1,5,1,no,0,128,0,weapon,0 //AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
+230,8,6,1,0,0,5,0,no,0,0,0,weapon,0 //AM_ACIDTERROR#ƒAƒVƒbƒhƒeƒ‰[#
+231,8,6,16,0,1,5,1,yes,0,0,0,none,0 //AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
+//231,8,6,16,0,1,10,1,yes,0,0,0,magic,0
+232,3,6,2,0,1,5,1,no,0,0,3,none,0 //AM_CANNIBALIZE#ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+233,3,6,2,0,1,5,1,no,0,128,3,none,0 //AM_SPHEREMINE#ƒXƒtƒBƒA[ƒ}ƒCƒ“#
+234,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_WEAPON#ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
+235,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_SHIELD#ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+236,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_ARMOR#ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
+237,1,6,16,0,1,5,1,yes,0,0,0,weapon,0 //AM_CP_HELM#ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
+//238,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_BIOETHICS#¶–½—Ï—#
+//239,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_BIOTECHNOLOGY#¶–½HŠwŒ¤‹†#
+//240,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CREATECREATURE#”í‘¢•¨‘n‘¢#
+//241,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_CULTIVATION#ƒJƒ‹ƒeƒBƒxƒCƒVƒ‡ƒ“#
+//242,0,0,0,0,0,5,0,no,0,0,0,none,0 //AM_FLAMECONTROL#ƒtƒŒƒCƒ€ƒRƒ“ƒgƒ[ƒ‹#
+//243,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_CALLHOMUN#ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//244,0,0,0,0,0,1,0,no,0,0,0,none,0 //AM_REST#ˆÀ‘§#
+//245,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_DRILLMASTER#ƒhƒŠƒ‹ƒ}ƒXƒ^[#
+//246,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_HEALHOMUN#ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//247,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_RESURRECTHOMUN#ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
+248,0,0,0,0,0,10,0,no,0,0,0,none,0 //CR_TRUST#ƒtƒFƒCƒX#
+249,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_AUTOGUARD#ƒI[ƒgƒK[ƒh#
+250,3,6,1,0,2,5,1,no,0,0,0,weapon,5:6:7:8:9 //CR_SHIELDCHARGE#ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+251,3:5:7:9:11,6,1,0,0,5,1,no,0,0,0,weapon,0 //CR_SHIELDBOOMERANG#ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+252,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+253,-2,8,1,6,0,10,2,no,0,0,0,weapon,0 //CR_HOLYCROSS#ƒz[ƒŠ[ƒNƒƒX#
+254,0,6,4,6,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#ƒOƒ‰ƒ“ƒhƒNƒƒX#
+255,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_DEVOTION#ƒfƒBƒ{[ƒVƒ‡ƒ“#
+256,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_PROVIDENCE#ƒvƒƒ”ƒBƒfƒ“ƒX#
+257,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#ƒfƒBƒtƒFƒ“ƒ_[#
+258,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_SPEARQUICKEN#ƒXƒsƒAƒNƒCƒbƒPƒ“#
+259,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_IRONHAND#“SŒ#
+260,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //MO_SPIRITSRECOVERY#Ԥ#
+261,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_CALLSPIRITS#‹CŒ÷#
+262,6,6,16,0,1,1,1,no,0,0,0,weapon,0 //MO_ABSORBSPIRITS#‹C’D#
+263,0,8,0,0,0,10,3,no,0,0,0,weapon,0 //MO_TRIPLEATTACK#ŽO’i¶#
+264,50,6,2,0,1,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#Žc‰e#
+265,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_DODGE#Œ©Ø‚è#
+266,-1,6,1,0,0,5,1,no,0,0,0,weapon,0 //MO_INVESTIGATE#”­™¤#
+267,10,8,1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0 //MO_FINGEROFFENSIVE#Žw’e#
+268,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_STEELBODY#‹à„#
+269,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_BLADESTOP#”’nŽæ‚è#
+270,0,6,4,0,1,5,0,no,0,0,0,weapon,0 //MO_EXPLOSIONSPIRITS#”š—ô”g“®#
+271,-3,6,4,0,0,5,1,yes,0,4,0,weapon,0 //MO_EXTREMITYFIST#ˆ¢C—…”e™€Œ#
+272,-2,8,4,0,0,5,4,no,0,0,0,weapon,0 //MO_CHAINCOMBO#˜A‘Ŷ#
+273,-2,6,4,0,0,5,1,no,0,0,0,weapon,0 //MO_COMBOFINISH#–Ò—´Œ#
+274,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //SA_ADVANCEDBOOK#ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
+275,0,6,4,0,1,5,1,no,0,0,0,magic,0 //SA_CASTCANCEL#ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
+276,0,6,4,0,1,5,1,yes,0,0,0,magic,0 //SA_MAGICROD#ƒ}ƒWƒbƒNƒƒbƒh#
+277,8,6,1,0,1,5,1,yes,0,0,0,maigc,0 //SA_SPELLBREAKER#ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
+278,0,0,0,0,0,10,0,no,0,0,0,magic,0 //SA_FREECAST#ƒtƒŠ[ƒLƒƒƒXƒg#
+279,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SA_AUTOSPELL#ƒI[ƒgƒXƒyƒ‹#
+280,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_FLAMELAUNCHER#ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
+281,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_FROSTWEAPON#ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+282,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_LIGHTNINGLOADER#ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
+283,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //SA_SEISMICWEAPON#ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+284,0,0,0,0,0,5,0,no,0,0,0,weapon,0 //SA_DRAGONOLOGY#ƒhƒ‰ƒSƒmƒƒW[#
+285,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_VOLCANO#ƒ{ƒ‹ƒP[ƒm#
+286,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_DELUGE#ƒfƒŠƒ…[ƒW#
+287,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_VIOLENTGALE#ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+288,2,6,2,0,1,5,1,yes,0,0,0,magic,0 //SA_LANDPROTECTOR#ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
+289,8,6,1,0,1,5,1,yes,0,0,0,magic,0 //SA_DISPELL#ƒfƒBƒXƒyƒ‹#
+290,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SA_ABRACADABRA#ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
+291,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_MONOCELL#ƒ`ƒFƒ“ƒWƒ|ƒŠƒ“#
+292,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_CLASSCHANGE#ƒNƒ‰ƒXƒ`ƒFƒ“ƒW#
+293,0,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_SUMMONMONSTER#ƒTƒ‚ƒ“ƒ‚ƒ“ƒXƒ^[#
+294,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_REVERSEORCISH#ƒŠƒo[ƒXƒI[ƒLƒbƒVƒ…#
+295,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_DEATH#ƒfƒX#
+296,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_FORTUNE#ƒtƒH[ƒ`ƒ…ƒ“#
+297,8,6,1,0,1,1,1,yes,0,0,0,magic,0 //SA_TAMINGMONSTER#ƒeƒCƒ~ƒ“ƒOƒ‚ƒ“ƒXƒ^[#
+298,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_QUESTION#H#
+299,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_GRAVITY#ƒOƒ‰ƒrƒeƒB#
+300,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_LEVELUP#ƒŒƒxƒ‹ƒAƒbƒv#
+301,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_INSTANTDEATH#ƒCƒ“ƒXƒ^ƒ“ƒgƒfƒX#
+302,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_FULLRECOVERY#ƒtƒ‹ƒŠƒJƒoƒŠ[#
+303,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //SA_COMA#ƒR[ƒ}#
+304,0,6,4,0,1,1,1,no,0,0,0,none,0 //BD_ADAPTATION#ƒAƒhƒŠƒu#
+305,0,6,4,0,1,1,1,no,0,0,0,none,0 //BD_ENCORE#ƒAƒ“ƒR[ƒ‹#
+306,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_LULLABY#ŽqŽç‰Ì#
+307,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_RICHMANKIM#ƒjƒˆƒ‹ƒh‚̉ƒ#
+308,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_ETERNALCHAOS#‰i‰“‚̬“×#
+309,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_DRUMBATTLEFIELD#푾ŒÛ‚Ì‹¿‚«#
+310,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_RINGNIBELUNGEN#ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
+311,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_ROKISWEIL#ƒƒL‚Ì‹©‚Ñ#
+312,0,6,4,0,1,1,1,no,0,0,0,misc,0 //BD_INTOABYSS#[•£‚Ì’†‚É#
+313,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BD_SIEGFRIED#•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+//314,0,0,0,0,0,1,1,no,0,0,0,misc,0 //BD_RAGNAROK#_X‚̉©¨#
+315,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //BA_MUSICALLESSON#ŠyŠí‚Ì—ûK#
+316,8,6,1,0,0,5,1,no,0,0,0,weapon,0 //BA_MUSICALSTRIKE#ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+317,0,8,4,0,1,5,1,no,0,0,0,misc,0 //BA_DISSONANCE#•s‹¦˜a‰¹#
+318,0,6,4,0,1,5,1,no,0,0,0,misc,0 //BA_FROSTJOKE#Š¦‚¢ƒWƒ‡[ƒN#
+319,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_WHISTLE#Œû“J#
+320,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_ASSASSINCROSS#—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+321,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_POEMBRAGI#ƒuƒ‰ƒM‚ÌŽ#
+322,0,6,4,0,1,10,1,no,0,0,0,misc,0 //BA_APPLEIDUN#ƒCƒhƒDƒ“‚Ì—ÑŒç#
+323,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //DC_DANCINGLESSON#ƒ_ƒ“ƒX‚Ì—ûK#
+324,8,6,1,0,0,5,1,no,0,0,0,weapon,0 //DC_THROWARROW#–‚¿#
+325,0,8,4,0,1,5,1,no,0,0,0,misc,0 //DC_UGLYDANCE#Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+326,0,6,4,0,1,5,1,no,0,0,0,misc,0 //DC_SCREAM#ƒXƒNƒŠ[ƒ€#
+327,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_HUMMING#ƒnƒ~ƒ“ƒO#
+328,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_DONTFORGETME#Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+329,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_FORTUNEKISS#K‰^‚̃LƒX#
+330,0,6,4,0,1,10,1,no,0,0,0,misc,0 //DC_SERVICEFORYOU#ƒT[ƒrƒXƒtƒH[ƒ†[#
+331,1,6,4,3,1,10,1,no,0,2,0,misc,3 //NPC_SELFDESTRUCTION2#Ž©”š2#
+
+334,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //WE_MALE#ŒN‚¾‚¯‚ÍŒì‚é‚æ#
+335,8,6,4,0,1,1,1,yes,0,0,0,magic,0 //WE_FEMALE#‚ ‚È‚½‚És‚­‚µ‚Ü‚·#
+336,8,6,4,0,1,1,1,yes,0,0,1,magic,0 //WE_CALLPARTNER#‚ ‚È‚½‚Ɉ§‚¢‚½‚¢#
+
+//338,0,0,0,0,0,0,0,no,0,0,0,none,0 //NPC_DARKCROSS#ƒ_[ƒNƒNƒƒX#
+
+355,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //LK_AURABLADE#ƒI[ƒ‰ƒuƒŒ[ƒh#
+356,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //LK_PARRYING#ƒpƒŠƒCƒ“ƒO#
+357,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //LK_CONCENTRATION#ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“#
+358,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_TENSIONRELAX#ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX#
+359,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_BERSERK#ƒo[ƒT[ƒN#
+//360,0,6,4,0,1,1,1,no,0,0,0,misc,0 //LK_FURY#ƒtƒ…[ƒŠ[#
+361,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //HP_ASSUMPTIO#ƒAƒXƒ€ƒvƒeƒBƒI#
+362,4,6,4,0,1,5,1,yes,0,0,0,magic,2 //HP_BASILICA#ƒoƒWƒŠƒJ#
+363,0,0,0,0,0,10,0,no,0,0,0,magic,0 //HP_MEDITATIO#ƒƒfƒBƒeƒCƒeƒBƒI#
+364,0,0,0,0,0,10,1,no,0,0,0,magic,0 //HW_SOULDRAIN#ƒ\ƒEƒ‹ƒhƒŒƒCƒ“#
+365,8,8,1,0,2,1,1,yes,0,0,0,magic,0 //HW_MAGICCRASHER#ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[#
+366,0,6,4,0,1,10,1,no,0,0,0,magic,0 //HW_MAGICPOWER#–‚–@—Í‘•#
+367,8,8,1,0,2,5,1,no,0,0,0,magic,0 //PA_PRESSURE#ƒvƒŒƒbƒVƒƒ[#
+368,8,6,1,0,2,5,1,yes,0,0,0,magic,0 //PA_SACRIFICE#ƒTƒNƒŠƒtƒ@ƒCƒX#
+369,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //PA_GOSPEL#ƒSƒXƒyƒ‹#
+370,-2,6,1,0,0,5,1,yes,0,0,0,weapon,3 //CH_PALMSTRIKE#–ÒŒÕd”hŽR#
+371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0 //CH_TIGERFIST#•šŒÕŒ#
+372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0 //CH_CHAINCRUSH#˜A’Œ•öŒ‚#
+373,0,6,4,0,1,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#ƒ‰ƒCƒt’u‚«Š·‚¦#
+374,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
+375,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULBURN#ƒ\ƒEƒ‹ƒo[ƒ“#
+376,0,0,0,0,1,5,1,no,0,0,0,weapon,0 //ASC_KATAR#ƒAƒhƒoƒ“ƒXƒhƒJƒ^[ƒ‹Œ¤‹†#
+377,0,0,4,0,1,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#ƒnƒ‹ƒVƒl[ƒVƒ‡ƒ“ƒEƒH[ƒN#
+378,0,6,4,5,1,10,1,no,0,1024,0,weapon,0 //ASC_EDP#ƒGƒ“ƒ`ƒƒƒ“ƒgƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“#
+379,5,6,1,0,0,10,1,no,0,0,0,weapon,0 //ASC_BREAKER#ƒ\ƒEƒ‹ƒuƒŒ[ƒJ[#
+380,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SN_SIGHT#ƒgƒDƒ‹[ƒTƒCƒg#
+381,9,8,1,0,0,5,1:2:3:4:5,yes,0,0,0,misc,0 //SN_FALCONASSAULT#ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg#
+382,9,8,1,0,0,5,1,no,0,0,0,weapon,0 //SN_SHARPSHOOTING#ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO#
+383,0,6,4,0,1,10,1,yes,0,0,0,magic,0 //SN_WINDWALK#ƒEƒCƒ“ƒhƒEƒH[ƒN#
+384,0,0,4,0,1,10,1,yes,0,0,0,magic,0 //WS_MELTDOWN#ƒƒ‹ƒgƒ_ƒEƒ“#
+385,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WS_CREATECOIN#ƒNƒŠƒGƒCƒgƒRƒCƒ“#
+386,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WS_CREATENUGGET#‰ò»‘¢#
+387,0,6,4,0,1,1,1,no,0,0,0,weapon,0 //WS_CARTBOOST#ƒJ[ƒgƒu[ƒXƒg#
+388,8,6,2,0,1,5,1,no,0,0,0,none,0 //WS_SYSTEMCREATE#Ž©“®UŒ‚‘•’u»ì#
+389,0,6,4,0,1,5,1,no,0,0,0,none,0 //ST_CHASEWALK#ƒ`ƒFƒCƒXƒEƒH[ƒN#
+390,0,0,4,0,1,5,1,yes,0,0,0,magic,0 //ST_REJECTSWORD#ƒŠƒWƒFƒNƒgƒ\[ƒh#
+//391,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //ST_STEALBACKPACK#ƒXƒeƒB[ƒ‹ƒoƒbƒNƒpƒbƒN#
+392,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CR_ALCHEMY#ƒAƒ‹ƒPƒ~[#
+393,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CR_SYNTHESISPOTION#ƒ|[ƒVƒ‡ƒ“ƒVƒ“ƒZƒVƒX#
+394,8,8,1,0,0,10,2,no,0,0,0,weapon,0 //CG_ARROWVULCAN#ƒAƒ[ƒoƒ‹ƒJƒ“#
+395,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CG_MOONLIT#ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç#
+396,0,6,16,0,1,1,1,yes,0,0,0,magic,1 //CG_MARIONETTE#ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹#
+397,4,8,1,0,0,5,1,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX#
+398,4,6,1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#ƒwƒbƒhƒNƒ‰ƒbƒVƒ…#
+399,4,6,1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
+400,8,8,1,8,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#ƒiƒp[ƒ€ƒoƒ‹ƒJƒ“#
+401,0,6,4,0,1,1,1,yes,0,0,0,weapon,0 //CH_SOULCOLLECT#‹¶‹CŒ÷#
+402,8,6,1,0,1,10,1,no,0,0,0,none,0 //PF_MINDBREAKER#ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[#
+403,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_MEMORIZE#ƒƒ‚ƒ‰ƒCƒY#
+404,3,6,2,2,1,5,1,yes,0,128,1,magic,0 //PF_FOGWALL#ƒtƒHƒOƒEƒH[ƒ‹#
+405,3,6,2,0,1,5,1,no,0,128,2,misc,0 //PF_SPIDERWEB#ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
+406,-1,6,1,0,2,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#ƒƒeƒIƒAƒTƒ‹ƒg#
+407,0,6,4,0,1,10,0,no,0,0,0,none,0 //ASC_CDP#ƒfƒbƒhƒŠ[ƒ|ƒCƒYƒ“»‘¢#
+408,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_BABY##
+409,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_CALLPARENT##
+410,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_CALLBABY##
+411,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_RUN##
+412,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYSTORM##
+413,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_STORMKICK##
+414,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYDOWN##
+415,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_DOWNKICK##
+416,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYTURN##
+417,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_TURNKICK##
+418,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_READYCOUNTER##
+419,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_COUNTER##
+420,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_DODGE##
+421,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_JUMPKICK##
+422,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_HPTIME##
+423,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_SPTIME##
+424,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_POWER##
+425,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_SEVENWIND##
+426,0,0,0,0,0,0,0,no,0,0,0,none,0 //TK_HIGHJUMP##
+427,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FEEL##
+428,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_WARM##
+429,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_WARM##
+430,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_WARM##
+431,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_COMFORT##
+432,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_COMFORT##
+433,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_COMFORT##
+434,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_HATE##
+435,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_ANGER##
+436,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_ANGER##
+437,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_ANGER##
+438,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_SUN_BLESS##
+439,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_MOON_BLESS##
+440,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_STAR_BLESS##
+441,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_DEVIL##
+442,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FRIEND##
+443,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_KNOWLEDGE##
+444,0,0,0,0,0,0,0,no,0,0,0,none,0 //SG_FUSION##
+445,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ALCHEMIST##
+446,0,0,0,0,0,0,0,no,0,0,0,none,0 //AM_BERSERKPITCHER##
+447,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_MONK##
+448,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STAR##
+449,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SAGE##
+450,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_CRUSADER##
+451,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SUPERNOVICE##
+452,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KNIGHT##
+453,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_WIZARD##
+454,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_PRIEST##
+455,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_BARDDANCER##
+456,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ROGUE##
+457,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_ASSASIN##
+458,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_BLACKSMITH##
+459,0,0,0,0,0,0,0,no,0,0,0,none,0 //BS_ADRENALINE2##
+460,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_HUNTER##
+461,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SOULLINKER##
+462,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAIZEL##
+463,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAAHI##
+464,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAUPE##
+465,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAITE##
+466,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_KAINA##
+467,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STIN##
+468,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_STUN##
+469,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SMA##
+470,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SWOO##
+471,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SKE##
+472,0,0,0,0,0,0,0,no,0,0,0,none,0 //SL_SKA##
+
+10000,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_APPROVAL#³‹KƒMƒ‹ƒh³”F#
+10001,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_KAFRACONTRACT#ƒJƒvƒ‰ŒÙ—p#
+10002,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GUARDRESEARCH#ƒK[ƒfƒBƒAƒ“Œ¤‹†#
+10003,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_CHARISMA#ƒJƒŠƒXƒ}#Later changed to GD_GUARDUP#
+10004,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_EXTENSION#ƒMƒ‹ƒhŠg’£#
+10005,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GLORYGUILD##
+10006,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_LEADERSHIP##
+10007,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_GLORYWOUNDS##
+10008,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_SOULCOLD##
+10009,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_HAWKEYES##
+10010,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_BATTLEORDER##
+10011,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_REGENERATION##
+10012,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_RESTORE##
+10013,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_EMERGENCYCALL##
+10014,0,0,0,0,0,0,0,no,0,0,0,none,0 //GD_DEVELOPMENT##
diff --git a/db/skill_require_db.txt b/db/skill_require_db.txt
index 60274665a..d67d9d18d 100644
--- a/db/skill_require_db.txt
+++ b/db/skill_require_db.txt
@@ -1,279 +1,279 @@
-//skill_require_db.txt?AthenaDB?? 2004/06/16 02:45:31 +0900 (JST),,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-//id,list_hp,list_maxhp,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
-
-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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#????#
-6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#?????#
-7,15,0,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#????????#
-8,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_ENDURE#?????#
-
-10,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#???#
-11,0,0,9:9:9:12:12:12:15:15:15:18,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#???????#
-12,0,0,30:30:30:35:35:35:40:40:40:40,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SAFETYWALL#?????????#
-13,0,0,18:14:24:20:30:26:36:32:42:38,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#????????#
-14,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#???????#
-15,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#????????#
-16,0,0,25,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#???????#
-17,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBALL#????????#
-18,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREWALL#?????????#
-19,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#????????#
-20,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#?????????#
-21,0,0,29:34:39:44:49:54:59:64:69:74,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#????????#
-
-24,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#???#
-25,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_PNEUMA#????#
-26,0,0,9:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_TELEPORT#?????#
-27,0,0,35:32:29:26,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_WARP#???????#
-28,0,0,13:16:19:22:25:28:31:34:37:40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#???#
-29,15,0,18:21:24:27:30:33:36:39:42:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_INCAGI#????#
-30,0,0,15:17:19:21:23:25:27:29:31:33,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_DECAGI#????#
-31,0,0,10,0,0,0,99,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#?????????#
-32,0,0,35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CRUCIS#????????#
-33,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_ANGELUS#??????#
-34,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_BLESSING#??????#
-35,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CURE#????#
-
-40,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#??????#
-41,0,0,30,0,0,0,99,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_VENDING#????#
-42,0,0,5,0,0,100:200:300:400:500:600:700:800:900:1000,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#??????#
-
-45,0,0,25:30:35:40:45:50:55:60:65:70,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#?????#
-46,0,0,12,0,0,0,11:13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#???????????#
-47,0,0,15,0,0,0,11,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_SHOWER#???????#
-
-50,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#?????#
-51,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_HIDING#??????#
-52,0,0,12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_POISON#?????#
-53,0,0,10,0,0,0,99,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,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_RESURRECTION#???????#
-
-56,0,0,7,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_PIERCE#????#
-57,0,0,12,0,0,0,4:05,riding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BRANDISHSPEAR#???????????#
-58,0,0,9,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#??????#
-59,0,0,10,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#????????#
-60,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#??????????#
-61,0,0,2,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#????????#
-62,0,0,13:14:15:16:17:18:19:20:21:22,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BOWLINGBASH#?????????#
-
-66,0,0,13:16:19:22:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#??????????#
-67,0,0,8,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#??????#
-68,0,0,14:18:22:26:30,0,0,0,99,none,0,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_ASPERSIO#??????#
-69,0,0,20,0,0,0,99,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,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SANCTUARY#???????#
-71,0,0,6:8:10:12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#???????#
-72,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#?????#
-73,0,0,20:20:20:25:25:25:30:30:30:35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_KYRIE#????????#
-74,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#????????#
-75,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_GLORIA#????#
-76,0,0,20:20:20:20:20:18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#?????????#
-77,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_TURNUNDEAD#????????#
-78,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#?????????#
-79,0,0,40:42:44:46:48:50:52:54:56:58,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNUS#??????????#
-80,0,0,75,0,0,0,99,none,0,717,0:0:0:0:0:1:1:1:1:1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#????????#
-81,0,0,35:37:39:41:43:45:47:49:51:53,0,0,0,99,sight,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTRASHER#????????#
-
-83,0,0,30:34:40:44:50:54:60:64:70:74,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_METEOR#???????#
-84,0,0,20:23:26:29:32:35:38:41:44:47,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_JUPITEL#????????#
-85,0,0,60:64:68:72:76:80:84:88:92:96,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_VERMILION#????????????#
-86,0,0,15:20:25:30:35,0,0,0,99,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_WATERBALL#????????#
-87,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ICEWALL#???????#
-88,0,0,45:43:41:39:37:35:33:31:29:27,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#???????#
-89,0,0,78,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_STORMGUST#???????#
-90,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#???????#
-91,0,0,28:32:36:40:44,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#????????#
-92,0,0,5:10:15:20:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#??????#
-93,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#???????#
-
-108,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#????#
-
-110,0,0,10,0,0,0,7:8,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#????????#
-111,0,0,20:23:26:29:32,0,0,0,6:7:8:9,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE#??????????#
-112,0,0,18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_WEAPONPERFECT#????????????#
-113,0,0,18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#????????#
-114,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_MAXIMIZE#?????????#
-115,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#????????#
-116,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#??????#
-117,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#???????#
-118,0,0,45,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#????????????#
-119,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SANDMAN#?????#
-120,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FLASHER#??????#
-121,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#??????????#
-122,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLASTMINE#???????#
-123,0,0,15,0,0,0,99,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_CLAYMORETRAP#?????????#
-124,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#????????#
-125,0,0,1,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_TALKIEBOX#????????#
-
-129,0,0,10:13:16:19:22,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#???????#
-130,0,0,8,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_DETECTING#????????#
-131,0,0,10,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SPRINGTRAP#?????????#
-
-135,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_CLOAKING#??????#
-136,0,0,16:18:20:22:24:26:28:30:32:34,0,0,0,16,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SONICBLOW#???????#
-137,0,0,3,0,0,0,16,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_GRIMTOOTH#???????#
-138,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#??????????#
-139,0,0,20:25:30:35:40:45:50:55:60:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_POISONREACT#????????#
-140,0,0,20,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMDUST#??????#
-141,0,0,33:36:39:42:45:48:51:54:57:60,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#??????????#
-142,0,0,3,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#?????#
-
-147,0,0,10,0,0,0,99,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,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#???????#
-149,0,0,9,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#???????#
-151,0,0,3,0,0,0,99,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#???#
-152,0,0,2,0,0,0,99,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,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#???????????#
-154,0,0,40,0,0,0,99,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#???????#
-155,0,0,8,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#??????#
-156,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#???????#
-157,0,0,30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#???????#
-
-211,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STEALCOIN#????????#
-212,0,0,16,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_BACKSTAP#??????#
-
-214,0,0,25,0,0,0,99,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_RAID#?????????#
-215,0,0,17:19:21:23:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#?????????#
-216,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#?????????#
-217,0,0,17:19:21:23:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#?????????#
-218,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPHELM#????????#
-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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_INTIMIDATE#????????#
-220,0,0,15,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_GRAFFITI#??????#
-221,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#??????????#
-222,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLEANER#?????#
-
-228,0,0,5,0,0,0,99,none,0,7134,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_PHARMACY#??????#
-229,0,0,10,0,0,0,99,none,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#??????????#
-230,0,0,15,0,0,0,99,none,0,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#???????#
-231,0,0,1,0,0,0,99,none,0,501,1,502,1,503,1,504,1,505,1,522,1,526,1,608,1,607,1,657,1 //AM_POTIONPITCHER#??????????#
-232,0,0,20,0,0,0,99,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#???????#
-233,0,0,10,0,0,0,99,none,0,7138,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#????????#
-234,0,0,30,0,0,0,99,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#????????????#
-235,0,0,25,0,0,0,99,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#????????????#
-236,0,0,25,0,0,0,99,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#????????????#
-237,0,0,25,0,0,0,99,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#???????????#
-
-249,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#??????#
-250,0,0,10,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#????????#
-251,0,0,12,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#?????????#
-252,0,0,35:40:45:50:55:60:65:70:75:80,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#?????????#
-253,0,0,11:12:13:14:15:16:17:18:19:20,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#???????#
-254,0,0,37:44:51:58:65:72:79:86:93:100,20,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_GRANDCROSS#???????#
-255,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEVOTION#???????#
-256,0,0,30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_PROVIDENCE#???????#
-257,0,0,30,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEFENDER#???????#
-258,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#????????#
-
-261,0,0,8,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#??#
-
-264,0,0,10,0,0,0,99,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#??#
-
-266,0,0,10:14:17:19:20,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,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,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,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#??#
-268,0,0,200,0,0,0,99,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,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BLADESTOP#????#
-270,0,0,15,0,0,0,99,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#????#
-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,explosionspirits,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXTREMITYFIST#??????#
-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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#???#
-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,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#?????????#
-276,0,0,2,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MAGICROD#???????#
-277,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#????????#
-
-279,0,0,35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#??????#
-280,0,0,40,0,0,0,99,none,0,990,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FLAMELAUNCHER#?????????#
-281,0,0,40,0,0,0,99,none,0,991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FROSTWEAPON#????????#
-282,0,0,40,0,0,0,99,none,0,992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#??????????#
-283,0,0,40,0,0,0,99,none,0,993,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SEISMICWEAPON#??????????#
-
-285,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VOLCANO#?????#
-286,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DELUGE#?????#
-287,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#?????????#
-288,0,0,66:62:58:54:50,0,0,0,99,none,0,717,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LANDPROTECTOR#?????????#
-289,0,0,1,0,0,0,99,none,0,716,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#?????#
-290,0,0,50,0,0,0,99,none,0,715,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ABRACADABRA#???????#
-
-304,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#????#
-305,0,0,1,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ENCORE#?????#
-306,0,0,20,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_LULLABY#???#
-307,0,0,20,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#??????#
-308,0,0,30,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#?????#
-309,0,0,40:45:50:55:60,0,0,0,13:14,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,40:45:50:55:60,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#?????????#
-311,0,0,15,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#?????#
-312,0,0,10,0,0,0,13:14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#???????????#
-
-316,0,0,8,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#???????????#
-317,0,0,18:21:24:27:30,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_DISSONANCE#????#
-318,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#??????#
-319,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_WHISTLE#??#
-320,0,0,38:41:44:47:50:53:56:59:62:65,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#??????????#
-321,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#?????#
-322,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#???????#
-
-324,0,0,8,0,0,0,14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_UGLYDANCE#????????#
-326,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SCREAM#?????#
-327,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_HUMMING#????#
-328,0,0,28:31:34:37:40:43:46:49:52:55,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#???????…#
-329,0,0,43:46:49:52:55:58:61:64:67:70,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#?????#
-330,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#?????????#
-
-334,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_MALE#???????#
-335,0,0,1,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#????????#
-
-
-
-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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_AURABLADE#???????#
-356,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_PARRYING#?????#
-357,0,0,14:18:22:26:30,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#??????????#
-358,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_TENSIONRELAX#??????????#
-359,0,0,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#?????#
-360,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_FURY#?????#
-361,0,0,25:30:35:40:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HP_ASSUMPTIO#???????#
-362,0,0,80:90:100:110:120,0,0,0,99,none,0,715,1,716,1,717,1,523,1,0,0,0,0,0,0,0,0,0,0,0,0 //HP_BASILICA#????#
-
-365,0,0,12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#??????????#
-366,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,99,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,20:25:30:35:40,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_PRESSURE#??????#
-368,0,9,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SACRIFICE#???????#
-369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_GOSPEL#????#
-370,0,0,12:14:16:18:20,0,0,0,99,explosionspirits,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#?????#
-371,0,0,12:14:16:18:20,0,0,0,99,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,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#????#
-373,0,0,1:2:3:4:5,0,0,0,99,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,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,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,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#???????????????#
-379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,weapon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#????????#
-380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SIGHT#???????#
-381,0,0,30:34:38:42:46,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_FALCONASSAULT#?????????#
-382,0,0,18:21:24:27:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SHARPSHOOTING#???????????#
-383,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#????????#
-384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_MELTDOWN#??????#
-385,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATECOIN#????????#
-386,0,0,5,0,0,0,99,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,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTBOOST#???????#
-388,0,0,20,0,0,0,99,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_SYSTEMCREATE#????????#
-389,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_CHASEWALK#????????#
-390,0,0,10:15:20:25:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#????????#
-
-394,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_ARROWVULCAN#???????#
-395,0,0,30:40:50:60:70,0,0,0,13:14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MARIONETTE#????????????#
-397,0,0,18:21:23:25:28,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_SPIRALPIERCE#?????????#
-398,0,0,23,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_HEADCRUSH#????????#
-399,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_JOINTBEAT#????????#
-400,0,0,10:25:40:55:70,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#????????#
-401,0,0,20,0,0,0,99,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,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MINDBREAKER#?????????#
-403,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MEMORIZE#?????#
-404,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_FOGWALL#???????#
-405,0,0,50,0,0,0,99,none,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#?????????#
-406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_METEORASSAULT#???????#
-407,0,0,50,0,0,0,99,none,0,937,1,952,1,939,1,7033,1,972,1,657,1,713,1,0,0,0,0,0,0 //ASC_CDP
-
+//skill_require_db.txt?AthenaDB?? 2004/06/16 02:45:31 +0900 (JST),,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+//id,list_hp,list_maxhp,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
+
+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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#????#
+6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#?????#
+7,15,0,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#????????#
+8,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_ENDURE#?????#
+
+10,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#???#
+11,0,0,9:9:9:12:12:12:15:15:15:18,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_NAPALMBEAT#???????#
+12,0,0,30:30:30:35:35:35:40:40:40:40,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SAFETYWALL#?????????#
+13,0,0,18:14:24:20:30:26:36:32:42:38,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SOULSTRIKE#????????#
+14,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_COLDBOLT#???????#
+15,0,0,25:24:23:22:21:20:19:18:17:16,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FROSTDIVER#????????#
+16,0,0,25,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_STONECURSE#???????#
+17,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBALL#????????#
+18,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREWALL#?????????#
+19,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_FIREBOLT#????????#
+20,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_LIGHTNINGBOLT#?????????#
+21,0,0,29:34:39:44:49:54:59:64:69:74,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_THUNDERSTORM#????????#
+
+24,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_RUWACH#???#
+25,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_PNEUMA#????#
+26,0,0,9:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_TELEPORT#?????#
+27,0,0,35:32:29:26,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_WARP#???????#
+28,0,0,13:16:19:22:25:28:31:34:37:40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HEAL#???#
+29,15,0,18:21:24:27:30:33:36:39:42:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_INCAGI#????#
+30,0,0,15:17:19:21:23:25:27:29:31:33,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_DECAGI#????#
+31,0,0,10,0,0,0,99,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYWATER#?????????#
+32,0,0,35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CRUCIS#????????#
+33,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_ANGELUS#??????#
+34,0,0,28:32:36:40:44:48:52:56:60:64,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_BLESSING#??????#
+35,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_CURE#????#
+
+40,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_IDENTIFY#??????#
+41,0,0,30,0,0,0,99,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_VENDING#????#
+42,0,0,5,0,0,100:200:300:400:500:600:700:800:900:1000,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_MAMMONITE#??????#
+
+45,0,0,25:30:35:40:45:50:55:60:65:70,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CONCENTRATION#?????#
+46,0,0,12,0,0,0,11:13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_DOUBLE#???????????#
+47,0,0,15,0,0,0,11,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_SHOWER#???????#
+
+50,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_STEAL#?????#
+51,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_HIDING#??????#
+52,0,0,12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_POISON#?????#
+53,0,0,10,0,0,0,99,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,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_RESURRECTION#???????#
+
+56,0,0,7,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_PIERCE#????#
+57,0,0,12,0,0,0,4:05,riding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BRANDISHSPEAR#???????????#
+58,0,0,9,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARSTAB#??????#
+59,0,0,10,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_SPEARBOOMERANG#????????#
+60,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_TWOHANDQUICKEN#??????????#
+61,0,0,2,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_AUTOCOUNTER#????????#
+62,0,0,13:14:15:16:17:18:19:20:21:22,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //KN_BOWLINGBASH#?????????#
+
+66,0,0,13:16:19:22:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#??????????#
+67,0,0,8,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SUFFRAGIUM#??????#
+68,0,0,14:18:22:26:30,0,0,0,99,none,0,523,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_ASPERSIO#??????#
+69,0,0,20,0,0,0,99,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,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SANCTUARY#???????#
+71,0,0,6:8:10:12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_SLOWPOISON#???????#
+72,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#?????#
+73,0,0,20:20:20:25:25:25:30:30:30:35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_KYRIE#????????#
+74,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#????????#
+75,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_GLORIA#????#
+76,0,0,20:20:20:20:20:18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXDIVINA#?????????#
+77,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_TURNUNDEAD#????????#
+78,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_LEXAETERNA#?????????#
+79,0,0,40:42:44:46:48:50:52:54:56:58,0,0,0,99,none,0,717,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PR_MAGNUS#??????????#
+80,0,0,75,0,0,0,99,none,0,717,0:0:0:0:0:1:1:1:1:1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#????????#
+81,0,0,35:37:39:41:43:45:47:49:51:53,0,0,0,99,sight,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_SIGHTRASHER#????????#
+
+83,0,0,30:34:40:44:50:54:60:64:70:74,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_METEOR#???????#
+84,0,0,20:23:26:29:32:35:38:41:44:47,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_JUPITEL#????????#
+85,0,0,60:64:68:72:76:80:84:88:92:96,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_VERMILION#????????????#
+86,0,0,15:20:25:30:35,0,0,0,99,water,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_WATERBALL#????????#
+87,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ICEWALL#???????#
+88,0,0,45:43:41:39:37:35:33:31:29:27,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#???????#
+89,0,0,78,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_STORMGUST#???????#
+90,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#???????#
+91,0,0,28:32:36:40:44,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#????????#
+92,0,0,5:10:15:20:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#??????#
+93,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#???????#
+
+108,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#????#
+
+110,0,0,10,0,0,0,7:8,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_HAMMERFALL#????????#
+111,0,0,20:23:26:29:32,0,0,0,6:7:8:9,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_ADRENALINE#??????????#
+112,0,0,18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_WEAPONPERFECT#????????????#
+113,0,0,18:16:14:12:10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_OVERTHRUST#????????#
+114,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BS_MAXIMIZE#?????????#
+115,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#????????#
+116,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#??????#
+117,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_ANKLESNARE#???????#
+118,0,0,45,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SHOCKWAVE#????????????#
+119,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SANDMAN#?????#
+120,0,0,12,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FLASHER#??????#
+121,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#??????????#
+122,0,0,10,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLASTMINE#???????#
+123,0,0,15,0,0,0,99,none,0,1065,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_CLAYMORETRAP#?????????#
+124,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_REMOVETRAP#????????#
+125,0,0,1,0,0,0,99,none,0,1065,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_TALKIEBOX#????????#
+
+129,0,0,10:13:16:19:22,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_BLITZBEAT#???????#
+130,0,0,8,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_DETECTING#????????#
+131,0,0,10,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HT_SPRINGTRAP#?????????#
+
+135,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_CLOAKING#??????#
+136,0,0,16:18:20:22:24:26:28:30:32:34,0,0,0,16,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SONICBLOW#???????#
+137,0,0,3,0,0,0,16,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_GRIMTOOTH#???????#
+138,0,0,20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#??????????#
+139,0,0,20:25:30:35:40:45:50:55:60:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_POISONREACT#????????#
+140,0,0,20,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_VENOMDUST#??????#
+141,0,0,33:36:39:42:45:48:51:54:57:60,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AS_SPLASHER#??????????#
+142,0,0,3,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NV_TRICKDEAD#?????#
+
+147,0,0,10,0,0,0,99,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,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AC_CHARGEARROW#???????#
+149,0,0,9,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //TF_BACKSLIDING#???????#
+151,0,0,3,0,0,0,99,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#???#
+152,0,0,2,0,0,0,99,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,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CARTREVOLUTION#???????????#
+154,0,0,40,0,0,0,99,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_CHANGECART#???????#
+155,0,0,8,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MC_LOUD#??????#
+156,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AL_HOLYLIGHT#???????#
+157,0,0,30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_ENERGYCOAT#???????#
+
+211,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STEALCOIN#????????#
+212,0,0,16,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_BACKSTAP#??????#
+
+214,0,0,25,0,0,0,99,hiding,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_RAID#?????????#
+215,0,0,17:19:21:23:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPWEAPON#?????????#
+216,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPSHIELD#?????????#
+217,0,0,17:19:21:23:25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPARMOR#?????????#
+218,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_STRIPHELM#????????#
+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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_INTIMIDATE#????????#
+220,0,0,15,0,0,0,99,none,0,716,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_GRAFFITI#??????#
+221,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_FLAGGRAFFITI#??????????#
+222,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //RG_CLEANER#?????#
+
+228,0,0,5,0,0,0,99,none,0,7134,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_PHARMACY#??????#
+229,0,0,10,0,0,0,99,none,0,7135,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_DEMONSTRATION#??????????#
+230,0,0,15,0,0,0,99,none,0,7136,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_ACIDTERROR#???????#
+231,0,0,1,0,0,0,99,none,0,501,1,502,1,503,1,504,1,505,1,522,1,526,1,608,1,607,1,657,1 //AM_POTIONPITCHER#??????????#
+232,0,0,20,0,0,0,99,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_CANNIBALIZE#???????#
+233,0,0,10,0,0,0,99,none,0,7138,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //AM_SPHEREMINE#????????#
+234,0,0,30,0,0,0,99,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#????????????#
+235,0,0,25,0,0,0,99,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#????????????#
+236,0,0,25,0,0,0,99,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#????????????#
+237,0,0,25,0,0,0,99,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#???????????#
+
+249,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#??????#
+250,0,0,10,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#????????#
+251,0,0,12,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#?????????#
+252,0,0,35:40:45:50:55:60:65:70:75:80,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_REFLECTSHIELD#?????????#
+253,0,0,11:12:13:14:15:16:17:18:19:20,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#???????#
+254,0,0,37:44:51:58:65:72:79:86:93:100,20,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_GRANDCROSS#???????#
+255,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEVOTION#???????#
+256,0,0,30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_PROVIDENCE#???????#
+257,0,0,30,0,0,0,99,shield,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_DEFENDER#???????#
+258,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,5,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CR_SPEARQUICKEN#????????#
+
+261,0,0,8,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#??#
+
+264,0,0,10,0,0,0,99,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#??#
+
+266,0,0,10:14:17:19:20,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,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,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,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#??#
+268,0,0,200,0,0,0,99,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,none,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_BLADESTOP#????#
+270,0,0,15,0,0,0,99,none,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#????#
+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,explosionspirits,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_EXTREMITYFIST#??????#
+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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MO_CHAINCOMBO#???#
+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,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_CASTCANCEL#?????????#
+276,0,0,2,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_MAGICROD#???????#
+277,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SPELLBREAKER#????????#
+
+279,0,0,35,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_AUTOSPELL#??????#
+280,0,0,40,0,0,0,99,none,0,990,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FLAMELAUNCHER#?????????#
+281,0,0,40,0,0,0,99,none,0,991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_FROSTWEAPON#????????#
+282,0,0,40,0,0,0,99,none,0,992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LIGHTNINGLOADER#??????????#
+283,0,0,40,0,0,0,99,none,0,993,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_SEISMICWEAPON#??????????#
+
+285,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VOLCANO#?????#
+286,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DELUGE#?????#
+287,0,0,48:46:44:42:40,0,0,0,99,none,0,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_VIOLENTGALE#?????????#
+288,0,0,66:62:58:54:50,0,0,0,99,none,0,717,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_LANDPROTECTOR#?????????#
+289,0,0,1,0,0,0,99,none,0,716,1,715,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_DISPELL#?????#
+290,0,0,50,0,0,0,99,none,0,715,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SA_ABRACADABRA#???????#
+
+304,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ADAPTATION#????#
+305,0,0,1,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ENCORE#?????#
+306,0,0,20,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_LULLABY#???#
+307,0,0,20,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RICHMANKIM#??????#
+308,0,0,30,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ETERNALCHAOS#?????#
+309,0,0,40:45:50:55:60,0,0,0,13:14,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,40:45:50:55:60,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_RINGNIBELUNGEN#?????????#
+311,0,0,15,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_ROKISWEIL#?????#
+312,0,0,10,0,0,0,13:14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BD_SIEGFRIED#???????????#
+
+316,0,0,8,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_MUSICALSTRIKE#???????????#
+317,0,0,18:21:24:27:30,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_DISSONANCE#????#
+318,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_FROSTJOKE#??????#
+319,0,0,24:28:32:36:40:44:48:52:56:60,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_WHISTLE#??#
+320,0,0,38:41:44:47:50:53:56:59:62:65,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_ASSASSINCROSS#??????????#
+321,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_POEMBRAGI#?????#
+322,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,13,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //BA_APPLEIDUN#???????#
+
+324,0,0,8,0,0,0,14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_UGLYDANCE#????????#
+326,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SCREAM#?????#
+327,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_HUMMING#????#
+328,0,0,28:31:34:37:40:43:46:49:52:55,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_DONTFORGETME#???????…#
+329,0,0,43:46:49:52:55:58:61:64:67:70,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_FORTUNEKISS#?????#
+330,0,0,40:45:50:55:60:65:70:75:80:85,0,0,0,14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //DC_SERVICEFORYOU#?????????#
+
+334,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_MALE#???????#
+335,0,0,1,0,0,0,99,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARTNER#????????#
+
+
+
+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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_AURABLADE#???????#
+356,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_PARRYING#?????#
+357,0,0,14:18:22:26:30,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_CONCENTRATION#??????????#
+358,0,0,15,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_TENSIONRELAX#??????????#
+359,0,0,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_BERSERK#?????#
+360,0,0,50,0,0,0,3,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_FURY#?????#
+361,0,0,25:30:35:40:45,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HP_ASSUMPTIO#???????#
+362,0,0,80:90:100:110:120,0,0,0,99,none,0,715,1,716,1,717,1,523,1,0,0,0,0,0,0,0,0,0,0,0,0 //HP_BASILICA#????#
+
+365,0,0,12,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#??????????#
+366,0,0,14:18:22:26:30:34:38:42:46:50,0,0,0,99,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,20:25:30:35:40,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_PRESSURE#??????#
+368,0,9,100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_SACRIFICE#???????#
+369,0,0,80:80:80:80:80:100:100:100:100:100,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PA_GOSPEL#????#
+370,0,0,12:14:16:18:20,0,0,0,99,explosionspirits,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_PALMSTRIKE#?????#
+371,0,0,12:14:16:18:20,0,0,0,99,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,12:14:16:18:20:22:24:26:28:30,0,0,0,99,none,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CH_CHAINCRUSH#????#
+373,0,0,1:2:3:4:5,0,0,0,99,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,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,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,none,0,678,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_EDP#???????????????#
+379,0,0,20:20:20:20:20:30:30:30:30:30,0,0,0,99,weapon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_BREAKER#????????#
+380,0,0,20:20:25:25:30:30:35:35:40:40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SIGHT#???????#
+381,0,0,30:34:38:42:46,0,0,0,99,falcon,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_FALCONASSAULT#?????????#
+382,0,0,18:21:24:27:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_SHARPSHOOTING#???????????#
+383,0,0,23:26:29:32:35:38:41:44:47:50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SN_WINDWALK#????????#
+384,0,0,50:50:60:60:70:70:80:80:90:90,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_MELTDOWN#??????#
+385,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CREATECOIN#????????#
+386,0,0,5,0,0,0,99,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,cart,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_CARTBOOST#???????#
+388,0,0,20,0,0,0,99,none,0,7137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WS_SYSTEMCREATE#????????#
+389,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_CHASEWALK#????????#
+390,0,0,10:15:20:25:30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ST_REJECTSWORD#????????#
+
+394,0,0,12:14:16:18:20:22:24:26:28:30,0,0,0,13:14,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_ARROWVULCAN#???????#
+395,0,0,30:40:50:60:70,0,0,0,13:14,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,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //CG_MARIONETTE#????????????#
+397,0,0,18:21:23:25:28,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_SPIRALPIERCE#?????????#
+398,0,0,23,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_HEADCRUSH#????????#
+399,0,0,22:24:26:28:30:32:34:36:38:40,0,0,0,4:05,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LK_JOINTBEAT#????????#
+400,0,0,10:25:40:55:70,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HW_NAPALMVULCAN#????????#
+401,0,0,20,0,0,0,99,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,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MINDBREAKER#?????????#
+403,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_MEMORIZE#?????#
+404,0,0,25,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_FOGWALL#???????#
+405,0,0,50,0,0,0,99,none,0,1025,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //PF_SPIDERWEB#?????????#
+406,0,0,10:12:14:16:18:20:22:24:26:28,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ASC_METEORASSAULT#???????#
+407,0,0,50,0,0,0,99,none,0,937,1,952,1,939,1,7033,1,972,1,657,1,713,1,0,0,0,0,0,0 //ASC_CDP
+
diff --git a/db/skill_tree.txt b/db/skill_tree.txt
index b18f8d8a8..0238727a1 100644
--- a/db/skill_tree.txt
+++ b/db/skill_tree.txt
@@ -1,1817 +1,1817 @@
-// JobNo,Skill-ID,MaxLV,‘O’ñSkill-ID-1,‘O’ñSkill-ID-1-Lv,Œv5ŒÂ‚Ü‚ÅŒJ‚è•Ô‚µ
-// Novice
-0,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-0,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-0,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
-// Swordman
-1,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-1,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-1,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-1,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-1,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-1,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-1,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-1,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-1,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-1,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-1,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-1,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-// Magican
-2,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-2,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-2,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-2,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-2,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-2,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-2,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-2,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-2,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-2,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-2,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-2,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-2,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-2,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-2,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-2,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-// Archer
-3,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-3,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-3,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-3,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-3,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-3,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-3,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-3,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-3,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-// Acolyte
-4,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-// Merchant
-5,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-5,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-5,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-5,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-5,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-5,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-5,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-5,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-5,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-5,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-5,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-5,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-// Thief
-6,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-6,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-6,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-6,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-6,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-6,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-6,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-6,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-6,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-6,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-6,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-6,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-// Knight
-7,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-7,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-7,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-7,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-7,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-7,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-7,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-7,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-7,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-7,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-7,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-7,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-7,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-7,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-7,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-7,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-7,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-7,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-7,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-7,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-7,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-7,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-// Priest
-8,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-8,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-8,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-8,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-8,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-8,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-8,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-8,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-8,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-8,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-8,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-8,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-8,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-8,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-8,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-8,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-8,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-8,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-8,12,10,68,4,70,3,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-8,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-8,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
-8,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-8,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
-8,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
-8,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
-8,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-8,71,4,0,0,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
-8,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
-8,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-8,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
-8,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
-8,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
-8,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
-8,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
-8,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-// Wizard
-9,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-9,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-9,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-9,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-9,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-9,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-9,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-9,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-9,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-9,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-9,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-9,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-9,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-9,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-9,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-9,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-9,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
-9,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
-//9,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
-9,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
-9,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
-9,85,10,21,1,84,5,0,0,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
-9,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
-9,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
-9,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
-9,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
-9,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-9,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-9,92,5,91,1,0,0,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
-9,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-// Blacksmith
-10,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-10,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-10,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-10,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-10,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-10,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-10,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-10,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-10,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-10,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-10,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-10,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-10,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
-10,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
-10,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
-10,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
-10,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
-10,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
-10,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
-10,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
-10,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
-10,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
-10,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
-10,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
-10,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
-10,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
-10,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
-10,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
-10,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
-10,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-10,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
-10,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
-10,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
-// Hunter
-11,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-11,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-11,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-11,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-11,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-11,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-11,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-11,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-11,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-11,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-11,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-11,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-11,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
-11,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
-11,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
-11,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-11,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-11,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
-11,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-11,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
-11,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
-11,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
-11,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
-11,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
-11,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
-11,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
-// Assassin
-12,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-12,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-12,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-12,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-12,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-12,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-12,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-12,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-12,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-12,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-12,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-12,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-12,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
-12,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
-12,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
-12,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
-12,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
-12,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
-12,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-12,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
-12,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
-12,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
-//Peco Knight
-// Knight
-13,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-13,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-13,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-13,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-13,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-13,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-13,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-13,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-13,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-13,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-13,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-13,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-13,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-13,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-13,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-13,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-13,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-13,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-13,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-13,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-13,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-13,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-// Crusader
-14,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-14,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-14,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-14,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-14,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-14,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-14,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-14,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-14,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-14,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-14,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-14,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-14,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-14,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-14,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-14,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-14,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-14,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-14,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-14,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-14,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-14,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-14,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-14,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-14,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-14,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-14,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-14,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-14,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-14,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-// Monk
-15,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-15,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-15,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-15,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-15,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-15,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-15,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-15,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-15,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-15,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-15,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-15,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-15,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-15,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-15,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-15,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-15,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-15,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
-15,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
-15,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
-15,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
-15,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
-15,264,1,271,3,260,2,268,3,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
-15,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
-15,266,5,261,5,0,0,0,0,0,0,0,0//MO_INVESTIGATE #”­™¤#
-15,267,5,266,3,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
-15,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
-15,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
-15,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
-15,271,5,270,3,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
-15,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
-15,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—³Œ#
-// Sage
-16,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-16,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-16,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-16,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-16,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-16,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-16,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-16,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-16,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-16,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-16,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-16,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-16,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-16,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-16,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-16,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-16,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-16,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-16,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-16,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
-16,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
-16,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
-16,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒ[ƒJ[#
-16,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
-16,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
-16,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
-16,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-16,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
-16,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-16,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
-16,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
-16,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
-16,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-16,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
-16,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
-16,290,10,279,5,289,1,288,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
-// Rogue
-17,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-17,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-17,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-17,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-17,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-17,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-17,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-17,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-17,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-17,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-17,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-17,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-17,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-17,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-17,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-17,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-17,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
-17,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
-17,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
-17,213,5,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
-17,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-17,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
-17,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
-17,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
-17,218,5,211,2,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-17,219,5,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
-17,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
-17,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
-17,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
-17,223,1,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
-17,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
-17,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
-// Alchemist
-18,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-18,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-18,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-18,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-18,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-18,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-18,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-18,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-18,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-18,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-18,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-18,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-18,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-18,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
-18,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
-18,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
-18,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
-18,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
-18,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
-18,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-18,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
-18,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
-18,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-18,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
-18,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
-// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
-//18,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
-//18,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
-//18,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
-//18,241,5,242,3,240,3,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
-//18,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
-//18,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//18,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
-//18,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
-//18,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//18,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
-// Bard
-19,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-19,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-19,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-19,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-19,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-19,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-19,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-19,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-19,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-19,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
-19,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-19,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
-19,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
-19,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
-19,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-19,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
-19,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
-19,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-19,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-19,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-19,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-19,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-19,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-19,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
-19,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-19,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-19,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-19,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-// Dancer
-20,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-20,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-20,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-20,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-20,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-20,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-20,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-20,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-20,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-20,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
-20,324,5,323,3,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
-20,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-20,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
-20,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
-20,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-20,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
-20,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
-20,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-20,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-20,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-20,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-20,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-20,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-20,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
-20,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-20,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-20,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-20,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-// Peco Crusader
-21,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-21,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-21,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-21,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-21,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-21,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-21,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-21,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-21,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-21,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-21,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-21,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-21,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-21,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-21,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-21,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-21,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-21,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-21,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-21,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-21,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-21,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-21,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-21,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-21,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-21,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-21,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-21,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-21,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-21,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-// Super Novice
-23,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-23,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-23,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-23,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-23,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-23,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-23,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-23,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-23,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-23,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-23,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-23,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-23,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-23,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-23,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-23,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-23,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-23,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-23,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-23,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-23,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-23,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-23,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-23,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-23,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-23,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-23,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-23,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-23,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-23,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-23,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-23,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-23,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-23,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-23,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-23,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-23,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-23,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-23,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-23,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-23,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-23,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-23,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-23,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-23,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-23,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-23,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-23,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-23,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-23,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-23,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-//Wedding Class
-22,1,9,0,0,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî-{ƒXƒLƒ‹#
-22.334,1,0,0,0,0,0,0,0,0,0,0,0
-22,335,5,0,0,0,0,0,0,0,0,0,0,0//
-22,336,5,0,0,0,0,0,0,0,0,0,0,0//
-// JobNo,Skill-ID,MaxLV,‘O’ñSkill-ID-1,‘O’ñSkill-ID-1-Lv,Œv5ŒÂ‚Ü‚ÅŒJ‚è•Ô‚µ
-//Novice High
-4001,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4001,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4001,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
-//Swordsman High
-4002,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4002,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4002,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4002,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4002,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4002,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4002,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4002,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4002,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4002,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4002,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4002,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-//Mage High
-4003,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4003,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4003,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4003,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4003,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4003,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4003,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4003,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4003,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4003,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4003,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4003,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4003,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4003,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4003,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4003,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4003,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-//Archer High
-4004,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4004,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4004,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4004,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4004,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4004,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4004,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4004,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4004,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-//Acolyte High
-4005,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4005,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4005,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4005,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4005,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4005,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4005,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4005,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4005,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4005,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4005,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4005,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4005,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4005,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4005,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4005,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4005,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-//Merchant High
-4006,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4006,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4006,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4006,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4006,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4006,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4006,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4006,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4006,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4006,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4006,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4006,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-//Thief High
-4007,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4007,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4007,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4007,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4007,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4007,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4007,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4007,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4007,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4007,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4007,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4007,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-//Lord Knight
-4008,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4008,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4008,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4008,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4008,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4008,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4008,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4008,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4008,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4008,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4008,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4008,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4008,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4008,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-4008,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-4008,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-4008,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-4008,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-4008,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-4008,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-4008,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4008,5,10,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4008,355,5,5,5,7,3,3,5,0,0,0,0//LK_AURABLADE
-4008,356,10,3,10,6,5,60,3,0,0,0,0//LK_PARRYING
-4008,357,5,4,1,55,5,63,1,0,0,0,0//LK_CONCENTRATE
-4008,358,1,4,10,6,5,8,3,0,0,0,0//LK_TENSIONRELAX
-4008,359,1,55,7,56,5,57,5,58,2,63,1//LK_BERSERK
-4008,360,1,3,10,4,6,62,6,0,0,0,0//LK_FURY
-4008,397,5,55,10,56,10,58,5,63,1,0,0//LK_SPIRALPIERCE
-4008,398,5,55,9,63,1,0,0,0,0,0,0//LK_HEADCRUSH
-4008,399,10,55,9,64,3,398,3,0,0,0,0//LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
-//High Priest
-4009,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4009,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4009,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4009,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4009,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4009,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4009,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4009,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4009,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4009,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4009,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4009,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4009,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4009,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4009,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4009,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4009,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-4009,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4009,12,10,68,4,0,0,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4009,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-4009,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
-4009,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-4009,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
-4009,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
-4009,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
-4009,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-4009,71,4,72,1,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
-4009,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
-4009,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-4009,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
-4009,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
-4009,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
-4009,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
-4009,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
-4009,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-4009,361,5,33,1,9,3,66,3,0,0,0,0//HP_ASSUMPTIO
-4009,362,5,75,2,9,1,73,3,0,0,0,0//HP_BASILICA
-4009,363,10,68,3,9,5,76,5,0,0,0,0//HP_BASILICA
-//High Wizard
-4010,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4010,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4010,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4010,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4010,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4010,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4010,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4010,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4010,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4010,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4010,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4010,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4010,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4010,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4010,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4010,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-4010,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
-4010,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
-//4010,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
-4010,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
-4010,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
-4010,85,10,11,1,21,1,84,5,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
-4010,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
-4010,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
-4010,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
-4010,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
-4010,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-4010,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-4010,92,5,14,1,91,1,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
-4010,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-4010,364,10,9,5,13,7,0,0,0,0,0,0//HW_SOULDRAIN #Šî–{ƒXƒLƒ‹#
-4010,365,10,9,1,0,0,0,0,0,0,0,0//HW_MAGICCRASHER #Šî–{ƒXƒLƒ‹#
-4010,366,10,0,0,0,0,0,0,0,0,0,0//HW_MAGICPOWER #Šî–{ƒXƒLƒ‹#
-4010,400,5,11,5,0,0,0,0,0,0,0,0//HW_NAPALMVULCAN
-//Whitesmith
-4011,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4011,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4011,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4011,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4011,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4011,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4011,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4011,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4011,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4011,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4011,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4011,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-4011,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
-4011,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
-4011,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
-4011,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
-4011,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
-4011,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
-4011,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
-4011,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
-4011,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
-4011,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
-4011,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
-4011,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
-4011,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
-4011,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
-4011,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
-4011,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
-4011,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
-4011,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-4011,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
-4011,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
-4011,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
-4011,384,10,109,3,105,1,107,5,113,3,0,0//WS_MELTDOWN #Šî–{ƒXƒLƒ‹#
-4011,385,3,109,5,94,5,96,3,97,2,0,0//WS_CREATECOIN #Šî–{ƒXƒLƒ‹#
-4011,386,3,97,3,106,1,107,5,0,0,0,0//WS_CREATENUGGET #Šî–{ƒXƒLƒ‹#
-4011,387,1,39,5,153,1,154,1,105,1,0,0//WS_CARTBOOST #Šî–{ƒXƒLƒ‹#
-4011,388,1,107,10,112,3,0,0,0,0,0,0//WS_SYSTEMCREATE #Šî–{ƒXƒLƒ‹#
-//Sniper
-4012,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4012,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4012,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4012,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4012,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4012,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4012,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4012,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4012,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4012,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-4012,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-4012,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-4012,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
-4012,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
-4012,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
-4012,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-4012,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-4012,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
-4012,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-4012,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
-4012,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
-4012,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
-4012,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
-4012,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
-4012,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
-4012,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
-4012,380,10,43,10,44,10,45,10,127,1,0,0//SN_SIGHT #Šî–{ƒXƒLƒ‹#
-4012,381,5,128,3,44,10,129,5,127,1,0,0//SN_FALCONASSAULT #Šî–{ƒXƒLƒ‹#
-4012,382,5,45,10,46,5,0,0,0,0,0,0//SN_SHARPSHOOTING #Šî–{ƒXƒLƒ‹#
-4012,383,5,45,9,0,0,0,0,0,0,0,0//SN_WINDWALK #Šî–{ƒXƒLƒ‹#
-//Assassin Cross
-4013,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4013,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4013,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4013,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4013,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4013,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4013,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4013,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4013,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4013,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4013,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4013,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-4013,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
-4013,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
-4013,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
-4013,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
-4013,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
-4013,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
-4013,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-4013,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
-4013,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
-4013,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
-4013,376,10,48,5,134,7,0,0,0,0,0,0//ASC_KATAR #Šî–{ƒXƒLƒ‹#
-4013,377,10,49,5,135,5,0,0,0,0,0,0//ASC_HALLUCINATION #Šî–{ƒXƒLƒ‹#
-4013,378,10,407,1,0,0,0,0,0,0,0,0//ASC_ENCHANTPOISON #Šî–{ƒXƒLƒ‹#
-4013,379,10,48,5,135,3,138,6,140,5,0,0//ASC_BREAKER #Šî–{ƒXƒLƒ‹#
-4013,406,10,132,3,134,5,136,5,379,1,0,0//ASC_METEORASSUALT
-4013,407,1,52,10,53,1,138,5,0,0,0,0//ASC_CDP
-// Peco Lord Knight
-4014,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4014,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4014,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4014,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4014,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4014,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4014,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4014,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4014,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4014,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4014,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4014,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4014,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4014,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-4014,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-4014,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-4014,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-4014,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-4014,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-4014,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-4014,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4014,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4014,355,5,5,5,7,3,3,5,0,0,0,0//LK_AURABLADE
-4014,356,10,3,10,6,5,60,3,0,0,0,0//LK_PARRYING
-4014,357,5,4,1,55,5,63,1,0,0,0,0//LK_CONCENTRATE
-4014,358,1,4,10,6,5,8,3,0,0,0,0//LK_TENSIONRELAX
-4014,359,1,55,7,56,5,57,5,58,2,63,1//LK_BERSERK
-4014,360,1,3,10,4,6,62,6,0,0,0,0//LK_FURY
-4014,397,5,0,0,0,0,0,0,0,0,0,0//LK_SPIRALPIERCE
-4014,398,5,0,0,0,0,0,0,0,0,0,0//LK_HEADCRUSH
-4014,399,10,0,0,0,0,0,0,0,0,0,0//LK_HEADCRUSH
-//Paladin
-4015,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4015,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4015,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4015,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4015,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4015,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4015,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4015,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4015,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4015,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4015,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4015,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4015,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4015,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4015,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4015,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4015,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4015,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4015,28,10,23,5,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4015,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-4015,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-4015,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4015,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-4015,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-4015,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-4015,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-4015,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-4015,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-4015,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-4015,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-4015,367,5,8,5,248,5,250,2,0,0,0,0//PA_PRESSURE
-4015,368,5,8,5,248,5,255,3,0,0,0,0//PA_SACRIFICE
-4015,369,10,248,8,22,3,23,5,0,0,0,0//PA_GOSPEL
-//Champion
-4016,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4016,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4016,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4016,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4016,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4016,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4016,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4016,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4016,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4016,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4016,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4016,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4016,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4016,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4016,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4016,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4016,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-4016,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
-4016,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
-4016,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
-4016,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
-4016,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
-4016,264,1,271,3,260,2,0,0,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
-4016,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
-4016,266,5,261,5,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
-4016,267,5,266,3,0,0,0,0,0,0,0,0/MO_INVESTIGATE #”­™¤#
-4016,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
-4016,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
-4016,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
-4016,271,5,261,5,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
-4016,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
-4016,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—´Œ#
-4016,370,5,259,7,261,5,0,0,0,0,0,0//CH_PALMSTRIKE #Šî–{ƒXƒLƒ‹#
-4016,371,5,259,5,263,5,261,5,273,3,0,0//CH_TIGERFIST #Šî–{ƒXƒLƒ‹#
-4016,372,10,259,5,261,5,0,0,0,0,0,0//CH_CHAINCRUSH #Šî–{ƒXƒLƒ‹#
-4016,401,1,261,5,262,1,270,5,0,0,0,0//CH_SOULCOLLECT
-//Professor
-4017,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4017,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4017,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4017,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4017,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4017,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4017,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4017,15,10,0,0,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4017,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4017,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4017,18,10,10,1,17,5,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4017,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4017,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4017,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4017,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-4017,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-4017,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-4017,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-4017,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
-4017,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
-4017,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
-4017,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
-4017,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
-4017,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
-4017,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
-4017,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-4017,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
-4017,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-4017,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
-4017,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
-4017,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
-4017,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-4017,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
-4017,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
-4017,290,10,279,5,288,1,289,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
-4017,364,10,9,5,13,7,0,0,0,0,0,0//HW_SOULDRAIN #ƒ\ƒEƒ‹ƒhƒŒƒCƒ“#
-4017,373,5,9,1,276,1,0,0,0,0,0,0//PF_HPCONVERSION #ƒ‰ƒCƒt’u‚«Š·‚¦#
-4017,374,1,276,3,277,2,0,0,0,0,0,0//PF_SOULCHANGE #ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
-4017,375,5,275,5,276,3,277,3,0,0,0,0//PF_SOULBURN #ƒ\ƒEƒ‹ƒo[ƒ“#
-4017,402,1,9,3,289,2,0,0,0,0,0,0//PF_MINDBREAKER #ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[#
-4017,403,1,274,5,278,5,279,1,0,0,0,0//PF_MEMORIZE #ƒƒ‚ƒ‰ƒCƒY#
-4017,404,1,286,2,287,2,0,0,0,0,0,0//PF_FOGWALL #ƒtƒHƒOƒEƒH[ƒ‹#
-4017,405,5,284,4,0,0,0,0,0,0,0,0//PF_SPIDERWEB #ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
-//Stalker
-4018,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4018,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4018,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4018,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4018,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4018,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4018,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4018,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4018,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4018,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4018,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4018,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-4018,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4018,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4018,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4018,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-4018,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
-4018,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
-4018,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
-4018,213,10,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
-4018,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-4018,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
-4018,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
-4018,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
-4018,218,5,211,1,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-4018,219,10,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
-4018,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
-4018,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
-4018,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
-4018,223,5,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
-4018,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
-4018,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
-4018,389,5,51,5,213,3,0,0,0,0,0,0//ST_CHASEWALK
-4018,390,5,215,1,0,0,0,0,0,0,0,0//ST_REJECTSWORD
-4018,391,5,215,1,0,0,0,0,0,0,0,0//ST_STEALBACKPACK
-//Creator
-4019,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4019,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4019,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4019,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4019,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4019,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4019,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4019,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4019,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4019,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4019,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4019,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-4019,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4019,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
-4019,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
-4019,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
-4019,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
-4019,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
-4019,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
-4019,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-4019,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
-4019,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
-4019,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4019,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
-4019,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
-// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
-//4019,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
-//4019,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
-//4019,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
-//4019,241,5,242,3,243,1,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
-//4019,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
-//4019,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//4019,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
-//4019,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
-//4019,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//4019,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
-4019,392,5,228,5,0,0,0,0,0,0,0,0//CR_ALCHEMY #Alchemy#
-4019,393,5,228,5,390,2,0,0,0,0,0,0//CR_SYNTHESISPOTION #Potion Synthesis#
-//Clown
-4020,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4020,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4020,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4020,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4020,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4020,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4020,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4020,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4020,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4020,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
-4020,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-4020,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
-4020,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
-4020,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
-4020,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-4020,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
-4020,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
-4020,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-4020,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-4020,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-4020,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-4020,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-4020,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-4020,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
-4020,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-4020,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-4020,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-4020,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-4020,394,10,0,0,0,0,0,0,0,0,0,0//CG_ARROWVULCAN
-4020,395,5,45,5,315,7,0,0,0,0,0,0//CG_MOONLIT
-4020,396,1,45,5,315,5,0,0,0,0,0,0//CG_MARIONETTE
-//Gypsy
-4021,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4021,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4021,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4021,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4021,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4021,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4021,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4021,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4021,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4021,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
-4021,324,10,0,0,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
-4021,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-4021,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
-4021,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
-4021,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-4021,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
-4021,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
-4021,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-4021,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-4021,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-4021,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-4021,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-4021,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-4021,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
-4021,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-4021,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-4021,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-4021,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-4021,394,10,0,0,0,0,0,0,0,0,0,0//CG_ARROWVULCAN
-4021,395,5,45,5,323,7,0,0,0,0,0,0//CG_MOONLIT
-4021,396,1,45,5,323,5,0,0,0,0,0,0//CG_MARIONETTE
-// Peco Paladin
-4022,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4022,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4022,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4022,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4022,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4022,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4022,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4022,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4022,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4022,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4022,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4022,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4022,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4022,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4022,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4022,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4022,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4022,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4022,28,10,23,5,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4022,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-4022,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-4022,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4022,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-4022,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-4022,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-4022,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-4022,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-4022,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-4022,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-4022,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-4022,367,5,8,5,248,5,250,2,0,0,0,0//PA_PRESSURE
-4022,368,5,8,5,248,5,255,3,0,0,0,0//PA_SACRIFICE
-4022,369,10,248,8,22,3,23,5,0,0,0,0//PA_GOSPEL
-// Baby "Novice"
-4023,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4023,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4023,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
-// Swordman
-4024,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4024,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4024,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4024,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4024,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4024,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4024,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4024,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4024,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4024,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4024,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4024,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-// Magican
-4025,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4025,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4025,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4025,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4025,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4025,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4025,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4025,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4025,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4025,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4025,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4025,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4025,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4025,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4025,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4025,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-// Archer
-4026,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4026,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4026,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4026,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4026,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4026,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4026,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4026,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4026,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-// Acolyte
-4027,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4027,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4027,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4027,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4027,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4027,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4027,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4027,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4027,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4027,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4027,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4027,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4027,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4027,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4027,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4027,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4027,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-// Merchant
-4028,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4028,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4028,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4028,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4028,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4028,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4028,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4028,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4028,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4028,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4028,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4028,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-// Thief
-4029,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4029,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4029,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4029,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4029,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4029,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4029,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4029,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4029,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4029,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4029,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4029,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-// Knight
-4030,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4030,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4030,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4030,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4030,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4030,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4030,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4030,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4030,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4030,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4030,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4030,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4030,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4030,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-4030,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-4030,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-4030,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-4030,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-4030,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-4030,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-4030,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4030,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-// Priest
-4031,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4031,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4031,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4031,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4031,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4031,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4031,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4031,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4031,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4031,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4031,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4031,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4031,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4031,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4031,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4031,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4031,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-4031,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4031,12,10,68,4,70,3,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4031,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
-4031,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
-4031,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
-4031,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
-4031,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
-4031,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
-4031,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
-4031,71,4,0,0,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
-4031,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
-4031,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
-4031,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
-4031,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
-4031,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
-4031,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
-4031,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
-4031,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
-// Wizard
-4032,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4032,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4032,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4032,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4032,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4032,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4032,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4032,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4032,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4032,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4032,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4032,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4032,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4032,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4032,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4032,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-4032,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
-4032,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
-//4032,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
-4032,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
-4032,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
-4032,85,10,21,1,84,5,0,0,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
-4032,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
-4032,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
-4032,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
-4032,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
-4032,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-4032,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-4032,92,5,91,1,0,0,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
-4032,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-// Blacksmith
-4033,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4033,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4033,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4033,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4033,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4033,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4033,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4033,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4033,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4033,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4033,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4033,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-4033,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
-4033,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
-4033,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
-4033,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
-4033,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
-4033,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
-4033,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
-4033,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
-4033,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
-4033,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
-4033,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
-4033,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
-4033,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
-4033,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
-4033,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
-4033,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
-4033,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
-4033,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
-4033,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
-4033,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
-4033,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
-// Hunter
-4034,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4034,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4034,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4034,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4034,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4034,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4034,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4034,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4034,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4034,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
-4034,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
-4034,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
-4034,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
-4034,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
-4034,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
-4034,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
-4034,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
-4034,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
-4034,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-4034,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
-4034,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
-4034,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
-4034,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
-4034,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
-4034,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
-4034,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
-// Assassin
-4035,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4035,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4035,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4035,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4035,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4035,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4035,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4035,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4035,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4035,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4035,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4035,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-4035,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
-4035,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
-4035,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
-4035,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
-4035,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
-4035,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
-4035,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
-4035,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
-4035,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
-4035,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
-//Peco Knight
-// Knight
-4036,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4036,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4036,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4036,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4036,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4036,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4036,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4036,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4036,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4036,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4036,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4036,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4036,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4036,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
-4036,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
-4036,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
-4036,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
-4036,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
-4036,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
-4036,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
-4036,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4036,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-// Crusader
-4037,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4037,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4037,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4037,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4037,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4037,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4037,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4037,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4037,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4037,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4037,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4037,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4037,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4037,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4037,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4037,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4037,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4037,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4037,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4037,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-4037,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-4037,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4037,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-4037,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-4037,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-4037,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-4037,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-4037,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-4037,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-4037,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-// Monk
-4038,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4038,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4038,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4038,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4038,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4038,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4038,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4038,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4038,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4038,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4038,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4038,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4038,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4038,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4038,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4038,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4038,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
-4038,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
-4038,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
-4038,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
-4038,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
-4038,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
-4038,264,1,271,3,260,2,268,3,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
-4038,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
-4038,266,5,261,5,0,0,0,0,0,0,0,0//MO_INVESTIGATE #”­™¤#
-4038,267,5,266,3,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
-4038,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
-4038,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
-4038,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
-4038,271,5,270,3,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
-4038,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
-4038,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—³Œ#
-// Sage
-4039,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4039,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4039,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4039,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4039,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4039,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4039,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4039,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4039,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4039,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4039,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4039,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4039,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4039,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4039,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4039,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
-4039,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
-4039,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
-4039,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
-4039,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
-4039,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
-4039,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
-4039,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒ[ƒJ[#
-4039,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
-4039,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
-4039,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
-4039,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
-4039,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
-4039,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
-4039,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
-4039,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
-4039,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
-4039,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
-4039,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
-4039,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
-4039,290,10,279,5,289,1,288,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
-// Rogue
-4040,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4040,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4040,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4040,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4040,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4040,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4040,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
-4040,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
-4040,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
-4040,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
-4040,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
-4040,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
-4040,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4040,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4040,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4040,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
-4040,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
-4040,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
-4040,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
-4040,213,5,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
-4040,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
-4040,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
-4040,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
-4040,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
-4040,218,5,211,2,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
-4040,219,5,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
-4040,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
-4040,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
-4040,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
-4040,223,1,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
-4040,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
-4040,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
-// Alchemist
-4041,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4041,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4041,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4041,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4041,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4041,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4041,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4041,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4041,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4041,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
-4041,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
-4041,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
-4041,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4041,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
-4041,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
-4041,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
-4041,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
-4041,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
-4041,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
-4041,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
-4041,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
-4041,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
-4041,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4041,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
-4041,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
-// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
-//4041,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
-//4041,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
-//4041,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
-//4041,241,5,242,3,240,3,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
-//4041,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
-//4041,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//4041,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
-//4041,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
-//4041,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
-//4041,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
-// Bard
-4042,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4042,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4042,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4042,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4042,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4042,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4042,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4042,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4042,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4042,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
-4042,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
-4042,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
-4042,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
-4042,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
-4042,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
-4042,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
-4042,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
-4042,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-4042,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-4042,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-4042,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-4042,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-4042,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-4042,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
-4042,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-4042,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-4042,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-4042,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-// Dancer
-4043,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4043,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4043,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4043,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4043,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4043,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
-4043,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
-4043,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
-4043,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
-4043,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
-4043,324,5,323,3,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
-4043,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
-4043,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
-4043,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
-4043,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
-4043,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
-4043,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
-4043,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
-4043,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
-4043,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
-4043,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
-4043,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
-4043,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
-4043,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
-4043,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
-4043,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
-4043,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
-4043,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
-// Peco Crusader
-4044,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4044,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4044,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4044,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
-4044,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4044,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4044,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4044,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4044,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4044,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
-4044,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
-4044,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
-4044,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
-4044,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
-4044,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
-4044,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4044,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4044,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4044,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4044,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
-4044,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
-4044,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
-4044,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
-4044,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
-4044,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
-4044,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
-4044,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
-4044,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
-4044,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
-4044,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
-// Super Novice
-4045,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
-4045,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
-4045,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
-4045,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
-4045,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
-4045,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
-4045,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
-4045,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
-4045,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
-4045,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
-4045,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
-4045,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
-4045,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
-4045,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
-4045,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
-4045,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
-4045,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
-4045,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
-4045,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
-4045,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
-4045,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
-4045,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
-4045,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
-4045,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
-4045,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
-4045,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
-4045,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
-4045,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
-4045,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
-4045,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
-4045,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
-4045,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
-4045,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
-4045,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
-4045,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
-4045,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
-4045,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
-4045,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
-4045,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
-4045,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
-4045,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
-4045,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
-4045,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
-4045,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
-4045,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
-4045,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
-4045,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
-4045,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
-4045,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
-4045,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+// JobNo,Skill-ID,MaxLV,‘O’ñSkill-ID-1,‘O’ñSkill-ID-1-Lv,Œv5ŒÂ‚Ü‚ÅŒJ‚è•Ô‚µ
+// Novice
+0,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+0,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+0,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
+// Swordman
+1,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+1,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+1,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+1,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+1,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+1,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+1,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+1,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+1,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+1,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+1,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+1,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+// Magican
+2,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+2,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+2,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+2,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+2,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+2,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+2,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+2,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+2,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+2,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+2,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+2,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+2,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+2,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+2,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+2,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+// Archer
+3,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+3,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+3,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+3,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+3,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+3,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+3,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+3,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+3,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+// Acolyte
+4,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+// Merchant
+5,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+5,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+5,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+5,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+5,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+5,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+5,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+5,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+5,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+5,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+5,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+5,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+// Thief
+6,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+6,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+6,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+6,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+6,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+6,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+6,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+6,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+6,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+6,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+6,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+6,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+// Knight
+7,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+7,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+7,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+7,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+7,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+7,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+7,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+7,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+7,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+7,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+7,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+7,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+7,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+7,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+7,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+7,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+7,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+7,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+7,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+7,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+7,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+7,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+// Priest
+8,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+8,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+8,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+8,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+8,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+8,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+8,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+8,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+8,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+8,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+8,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+8,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+8,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+8,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+8,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+8,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+8,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+8,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+8,12,10,68,4,70,3,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+8,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+8,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
+8,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+8,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
+8,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
+8,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
+8,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+8,71,4,0,0,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
+8,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
+8,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+8,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
+8,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
+8,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
+8,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
+8,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
+8,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+// Wizard
+9,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+9,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+9,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+9,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+9,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+9,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+9,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+9,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+9,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+9,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+9,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+9,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+9,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+9,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+9,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+9,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+9,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
+9,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
+//9,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
+9,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
+9,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
+9,85,10,21,1,84,5,0,0,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
+9,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
+9,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
+9,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
+9,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
+9,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+9,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+9,92,5,91,1,0,0,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
+9,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+// Blacksmith
+10,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+10,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+10,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+10,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+10,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+10,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+10,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+10,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+10,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+10,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+10,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+10,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+10,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
+10,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
+10,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
+10,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
+10,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
+10,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
+10,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
+10,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
+10,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
+10,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
+10,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
+10,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
+10,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
+10,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
+10,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
+10,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
+10,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
+10,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+10,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
+10,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
+10,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
+// Hunter
+11,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+11,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+11,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+11,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+11,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+11,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+11,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+11,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+11,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+11,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+11,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+11,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+11,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
+11,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
+11,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
+11,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+11,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+11,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
+11,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+11,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
+11,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
+11,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
+11,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
+11,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
+11,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
+11,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
+// Assassin
+12,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+12,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+12,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+12,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+12,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+12,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+12,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+12,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+12,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+12,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+12,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+12,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+12,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
+12,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
+12,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
+12,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
+12,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
+12,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
+12,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+12,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
+12,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
+12,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
+//Peco Knight
+// Knight
+13,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+13,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+13,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+13,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+13,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+13,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+13,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+13,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+13,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+13,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+13,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+13,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+13,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+13,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+13,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+13,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+13,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+13,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+13,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+13,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+13,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+13,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+// Crusader
+14,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+14,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+14,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+14,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+14,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+14,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+14,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+14,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+14,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+14,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+14,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+14,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+14,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+14,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+14,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+14,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+14,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+14,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+14,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+14,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+14,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+14,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+14,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+14,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+14,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+14,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+14,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+14,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+14,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+14,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+// Monk
+15,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+15,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+15,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+15,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+15,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+15,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+15,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+15,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+15,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+15,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+15,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+15,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+15,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+15,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+15,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+15,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+15,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+15,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
+15,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
+15,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
+15,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
+15,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
+15,264,1,271,3,260,2,268,3,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
+15,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
+15,266,5,261,5,0,0,0,0,0,0,0,0//MO_INVESTIGATE #”­™¤#
+15,267,5,266,3,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
+15,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
+15,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
+15,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
+15,271,5,270,3,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
+15,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
+15,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—³Œ#
+// Sage
+16,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+16,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+16,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+16,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+16,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+16,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+16,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+16,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+16,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+16,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+16,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+16,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+16,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+16,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+16,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+16,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+16,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+16,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+16,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+16,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
+16,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
+16,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
+16,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒ[ƒJ[#
+16,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
+16,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
+16,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
+16,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+16,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
+16,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+16,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
+16,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
+16,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
+16,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+16,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
+16,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
+16,290,10,279,5,289,1,288,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
+// Rogue
+17,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+17,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+17,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+17,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+17,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+17,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+17,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+17,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+17,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+17,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+17,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+17,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+17,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+17,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+17,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+17,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+17,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
+17,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
+17,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
+17,213,5,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
+17,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+17,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
+17,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
+17,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
+17,218,5,211,2,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+17,219,5,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
+17,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
+17,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
+17,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
+17,223,1,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
+17,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
+17,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
+// Alchemist
+18,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+18,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+18,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+18,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+18,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+18,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+18,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+18,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+18,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+18,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+18,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+18,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+18,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+18,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
+18,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
+18,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
+18,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
+18,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
+18,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
+18,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+18,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
+18,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
+18,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+18,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
+18,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
+// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
+//18,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
+//18,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
+//18,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
+//18,241,5,242,3,240,3,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
+//18,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
+//18,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//18,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
+//18,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
+//18,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//18,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
+// Bard
+19,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+19,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+19,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+19,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+19,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+19,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+19,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+19,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+19,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+19,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
+19,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+19,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
+19,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
+19,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
+19,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+19,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
+19,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
+19,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+19,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+19,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+19,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+19,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+19,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+19,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
+19,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+19,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+19,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+19,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+// Dancer
+20,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+20,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+20,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+20,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+20,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+20,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+20,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+20,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+20,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+20,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
+20,324,5,323,3,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
+20,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+20,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
+20,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
+20,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+20,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
+20,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
+20,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+20,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+20,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+20,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+20,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+20,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+20,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
+20,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+20,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+20,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+20,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+// Peco Crusader
+21,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+21,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+21,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+21,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+21,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+21,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+21,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+21,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+21,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+21,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+21,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+21,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+21,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+21,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+21,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+21,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+21,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+21,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+21,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+21,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+21,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+21,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+21,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+21,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+21,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+21,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+21,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+21,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+21,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+21,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+// Super Novice
+23,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+23,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+23,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+23,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+23,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+23,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+23,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+23,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+23,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+23,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+23,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+23,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+23,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+23,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+23,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+23,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+23,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+23,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+23,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+23,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+23,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+23,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+23,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+23,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+23,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+23,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+23,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+23,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+23,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+23,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+23,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+23,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+23,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+23,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+23,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+23,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+23,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+23,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+23,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+23,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+23,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+23,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+23,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+23,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+23,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+23,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+23,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+23,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+23,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+23,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+23,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+//Wedding Class
+22,1,9,0,0,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî-{ƒXƒLƒ‹#
+22.334,1,0,0,0,0,0,0,0,0,0,0,0
+22,335,5,0,0,0,0,0,0,0,0,0,0,0//
+22,336,5,0,0,0,0,0,0,0,0,0,0,0//
+// JobNo,Skill-ID,MaxLV,‘O’ñSkill-ID-1,‘O’ñSkill-ID-1-Lv,Œv5ŒÂ‚Ü‚ÅŒJ‚è•Ô‚µ
+//Novice High
+4001,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4001,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4001,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
+//Swordsman High
+4002,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4002,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4002,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4002,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4002,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4002,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4002,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4002,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4002,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4002,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4002,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4002,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+//Mage High
+4003,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4003,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4003,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4003,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4003,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4003,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4003,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4003,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4003,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4003,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4003,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4003,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4003,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4003,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4003,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4003,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4003,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+//Archer High
+4004,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4004,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4004,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4004,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4004,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4004,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4004,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4004,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4004,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+//Acolyte High
+4005,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4005,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4005,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4005,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4005,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4005,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4005,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4005,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4005,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4005,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4005,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4005,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4005,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4005,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4005,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4005,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4005,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+//Merchant High
+4006,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4006,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4006,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4006,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4006,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4006,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4006,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4006,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4006,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4006,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4006,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4006,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+//Thief High
+4007,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4007,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4007,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4007,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4007,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4007,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4007,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4007,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4007,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4007,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4007,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4007,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+//Lord Knight
+4008,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4008,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4008,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4008,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4008,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4008,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4008,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4008,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4008,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4008,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4008,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4008,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4008,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4008,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+4008,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+4008,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+4008,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+4008,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+4008,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+4008,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+4008,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4008,5,10,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4008,355,5,5,5,7,3,3,5,0,0,0,0//LK_AURABLADE
+4008,356,10,3,10,6,5,60,3,0,0,0,0//LK_PARRYING
+4008,357,5,4,1,55,5,63,1,0,0,0,0//LK_CONCENTRATE
+4008,358,1,4,10,6,5,8,3,0,0,0,0//LK_TENSIONRELAX
+4008,359,1,55,7,56,5,57,5,58,2,63,1//LK_BERSERK
+4008,360,1,3,10,4,6,62,6,0,0,0,0//LK_FURY
+4008,397,5,55,10,56,10,58,5,63,1,0,0//LK_SPIRALPIERCE
+4008,398,5,55,9,63,1,0,0,0,0,0,0//LK_HEADCRUSH
+4008,399,10,55,9,64,3,398,3,0,0,0,0//LK_JOINTBEAT#ƒWƒ‡ƒCƒ“ƒgƒr[ƒg#
+//High Priest
+4009,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4009,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4009,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4009,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4009,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4009,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4009,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4009,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4009,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4009,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4009,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4009,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4009,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4009,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4009,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4009,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4009,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+4009,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4009,12,10,68,4,0,0,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4009,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+4009,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
+4009,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+4009,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
+4009,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
+4009,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
+4009,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+4009,71,4,72,1,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
+4009,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
+4009,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+4009,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
+4009,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
+4009,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
+4009,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
+4009,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
+4009,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+4009,361,5,33,1,9,3,66,3,0,0,0,0//HP_ASSUMPTIO
+4009,362,5,75,2,9,1,73,3,0,0,0,0//HP_BASILICA
+4009,363,10,68,3,9,5,76,5,0,0,0,0//HP_BASILICA
+//High Wizard
+4010,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4010,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4010,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4010,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4010,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4010,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4010,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4010,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4010,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4010,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4010,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4010,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4010,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4010,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4010,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4010,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+4010,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
+4010,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
+//4010,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
+4010,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
+4010,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
+4010,85,10,11,1,21,1,84,5,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
+4010,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
+4010,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
+4010,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
+4010,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
+4010,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+4010,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+4010,92,5,14,1,91,1,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
+4010,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+4010,364,10,9,5,13,7,0,0,0,0,0,0//HW_SOULDRAIN #Šî–{ƒXƒLƒ‹#
+4010,365,10,9,1,0,0,0,0,0,0,0,0//HW_MAGICCRASHER #Šî–{ƒXƒLƒ‹#
+4010,366,10,0,0,0,0,0,0,0,0,0,0//HW_MAGICPOWER #Šî–{ƒXƒLƒ‹#
+4010,400,5,11,5,0,0,0,0,0,0,0,0//HW_NAPALMVULCAN
+//Whitesmith
+4011,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4011,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4011,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4011,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4011,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4011,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4011,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4011,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4011,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4011,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4011,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4011,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+4011,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
+4011,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
+4011,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
+4011,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
+4011,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
+4011,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
+4011,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
+4011,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
+4011,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
+4011,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
+4011,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
+4011,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
+4011,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
+4011,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
+4011,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
+4011,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
+4011,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
+4011,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+4011,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
+4011,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
+4011,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
+4011,384,10,109,3,105,1,107,5,113,3,0,0//WS_MELTDOWN #Šî–{ƒXƒLƒ‹#
+4011,385,3,109,5,94,5,96,3,97,2,0,0//WS_CREATECOIN #Šî–{ƒXƒLƒ‹#
+4011,386,3,97,3,106,1,107,5,0,0,0,0//WS_CREATENUGGET #Šî–{ƒXƒLƒ‹#
+4011,387,1,39,5,153,1,154,1,105,1,0,0//WS_CARTBOOST #Šî–{ƒXƒLƒ‹#
+4011,388,1,107,10,112,3,0,0,0,0,0,0//WS_SYSTEMCREATE #Šî–{ƒXƒLƒ‹#
+//Sniper
+4012,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4012,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4012,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4012,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4012,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4012,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4012,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4012,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4012,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4012,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+4012,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+4012,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+4012,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
+4012,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
+4012,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
+4012,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+4012,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+4012,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
+4012,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+4012,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
+4012,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
+4012,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
+4012,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
+4012,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
+4012,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
+4012,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
+4012,380,10,43,10,44,10,45,10,127,1,0,0//SN_SIGHT #Šî–{ƒXƒLƒ‹#
+4012,381,5,128,3,44,10,129,5,127,1,0,0//SN_FALCONASSAULT #Šî–{ƒXƒLƒ‹#
+4012,382,5,45,10,46,5,0,0,0,0,0,0//SN_SHARPSHOOTING #Šî–{ƒXƒLƒ‹#
+4012,383,5,45,9,0,0,0,0,0,0,0,0//SN_WINDWALK #Šî–{ƒXƒLƒ‹#
+//Assassin Cross
+4013,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4013,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4013,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4013,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4013,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4013,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4013,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4013,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4013,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4013,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4013,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4013,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+4013,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
+4013,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
+4013,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
+4013,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
+4013,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
+4013,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
+4013,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+4013,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
+4013,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
+4013,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
+4013,376,10,48,5,134,7,0,0,0,0,0,0//ASC_KATAR #Šî–{ƒXƒLƒ‹#
+4013,377,10,49,5,135,5,0,0,0,0,0,0//ASC_HALLUCINATION #Šî–{ƒXƒLƒ‹#
+4013,378,10,407,1,0,0,0,0,0,0,0,0//ASC_ENCHANTPOISON #Šî–{ƒXƒLƒ‹#
+4013,379,10,48,5,135,3,138,6,140,5,0,0//ASC_BREAKER #Šî–{ƒXƒLƒ‹#
+4013,406,10,132,3,134,5,136,5,379,1,0,0//ASC_METEORASSUALT
+4013,407,1,52,10,53,1,138,5,0,0,0,0//ASC_CDP
+// Peco Lord Knight
+4014,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4014,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4014,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4014,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4014,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4014,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4014,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4014,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4014,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4014,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4014,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4014,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4014,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4014,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+4014,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+4014,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+4014,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+4014,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+4014,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+4014,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+4014,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4014,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4014,355,5,5,5,7,3,3,5,0,0,0,0//LK_AURABLADE
+4014,356,10,3,10,6,5,60,3,0,0,0,0//LK_PARRYING
+4014,357,5,4,1,55,5,63,1,0,0,0,0//LK_CONCENTRATE
+4014,358,1,4,10,6,5,8,3,0,0,0,0//LK_TENSIONRELAX
+4014,359,1,55,7,56,5,57,5,58,2,63,1//LK_BERSERK
+4014,360,1,3,10,4,6,62,6,0,0,0,0//LK_FURY
+4014,397,5,0,0,0,0,0,0,0,0,0,0//LK_SPIRALPIERCE
+4014,398,5,0,0,0,0,0,0,0,0,0,0//LK_HEADCRUSH
+4014,399,10,0,0,0,0,0,0,0,0,0,0//LK_HEADCRUSH
+//Paladin
+4015,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4015,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4015,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4015,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4015,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4015,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4015,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4015,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4015,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4015,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4015,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4015,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4015,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4015,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4015,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4015,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4015,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4015,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4015,28,10,23,5,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4015,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+4015,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+4015,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4015,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+4015,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+4015,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+4015,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+4015,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+4015,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+4015,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+4015,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+4015,367,5,8,5,248,5,250,2,0,0,0,0//PA_PRESSURE
+4015,368,5,8,5,248,5,255,3,0,0,0,0//PA_SACRIFICE
+4015,369,10,248,8,22,3,23,5,0,0,0,0//PA_GOSPEL
+//Champion
+4016,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4016,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4016,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4016,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4016,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4016,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4016,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4016,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4016,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4016,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4016,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4016,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4016,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4016,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4016,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4016,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4016,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+4016,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
+4016,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
+4016,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
+4016,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
+4016,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
+4016,264,1,271,3,260,2,0,0,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
+4016,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
+4016,266,5,261,5,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
+4016,267,5,266,3,0,0,0,0,0,0,0,0/MO_INVESTIGATE #”­™¤#
+4016,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
+4016,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
+4016,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
+4016,271,5,261,5,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
+4016,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
+4016,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—´Œ#
+4016,370,5,259,7,261,5,0,0,0,0,0,0//CH_PALMSTRIKE #Šî–{ƒXƒLƒ‹#
+4016,371,5,259,5,263,5,261,5,273,3,0,0//CH_TIGERFIST #Šî–{ƒXƒLƒ‹#
+4016,372,10,259,5,261,5,0,0,0,0,0,0//CH_CHAINCRUSH #Šî–{ƒXƒLƒ‹#
+4016,401,1,261,5,262,1,270,5,0,0,0,0//CH_SOULCOLLECT
+//Professor
+4017,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4017,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4017,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4017,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4017,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4017,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4017,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4017,15,10,0,0,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4017,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4017,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4017,18,10,10,1,17,5,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4017,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4017,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4017,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4017,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+4017,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+4017,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+4017,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+4017,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
+4017,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
+4017,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
+4017,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒƒCƒJ[#
+4017,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
+4017,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
+4017,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
+4017,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+4017,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
+4017,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+4017,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
+4017,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
+4017,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
+4017,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+4017,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
+4017,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
+4017,290,10,279,5,288,1,289,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
+4017,364,10,9,5,13,7,0,0,0,0,0,0//HW_SOULDRAIN #ƒ\ƒEƒ‹ƒhƒŒƒCƒ“#
+4017,373,5,9,1,276,1,0,0,0,0,0,0//PF_HPCONVERSION #ƒ‰ƒCƒt’u‚«Š·‚¦#
+4017,374,1,276,3,277,2,0,0,0,0,0,0//PF_SOULCHANGE #ƒ\ƒEƒ‹ƒ`ƒFƒ“ƒW#
+4017,375,5,275,5,276,3,277,3,0,0,0,0//PF_SOULBURN #ƒ\ƒEƒ‹ƒo[ƒ“#
+4017,402,1,9,3,289,2,0,0,0,0,0,0//PF_MINDBREAKER #ƒ}ƒCƒ“ƒhƒuƒŒ[ƒJ[#
+4017,403,1,274,5,278,5,279,1,0,0,0,0//PF_MEMORIZE #ƒƒ‚ƒ‰ƒCƒY#
+4017,404,1,286,2,287,2,0,0,0,0,0,0//PF_FOGWALL #ƒtƒHƒOƒEƒH[ƒ‹#
+4017,405,5,284,4,0,0,0,0,0,0,0,0//PF_SPIDERWEB #ƒXƒpƒCƒ_[ƒEƒFƒbƒu#
+//Stalker
+4018,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4018,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4018,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4018,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4018,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4018,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4018,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4018,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4018,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4018,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4018,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4018,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+4018,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4018,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4018,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4018,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+4018,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
+4018,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
+4018,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
+4018,213,10,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
+4018,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+4018,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
+4018,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
+4018,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
+4018,218,5,211,1,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+4018,219,10,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
+4018,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
+4018,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
+4018,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
+4018,223,5,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
+4018,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
+4018,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
+4018,389,5,51,5,213,3,0,0,0,0,0,0//ST_CHASEWALK
+4018,390,5,215,1,0,0,0,0,0,0,0,0//ST_REJECTSWORD
+4018,391,5,215,1,0,0,0,0,0,0,0,0//ST_STEALBACKPACK
+//Creator
+4019,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4019,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4019,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4019,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4019,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4019,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4019,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4019,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4019,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4019,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4019,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4019,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+4019,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4019,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
+4019,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
+4019,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
+4019,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
+4019,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
+4019,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
+4019,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+4019,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
+4019,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
+4019,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4019,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
+4019,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
+// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
+//4019,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
+//4019,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
+//4019,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
+//4019,241,5,242,3,243,1,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
+//4019,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
+//4019,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//4019,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
+//4019,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
+//4019,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//4019,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
+4019,392,5,228,5,0,0,0,0,0,0,0,0//CR_ALCHEMY #Alchemy#
+4019,393,5,228,5,390,2,0,0,0,0,0,0//CR_SYNTHESISPOTION #Potion Synthesis#
+//Clown
+4020,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4020,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4020,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4020,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4020,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4020,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4020,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4020,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4020,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4020,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
+4020,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+4020,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
+4020,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
+4020,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
+4020,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+4020,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
+4020,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
+4020,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+4020,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+4020,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+4020,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+4020,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+4020,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+4020,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
+4020,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+4020,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+4020,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+4020,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+4020,394,10,0,0,0,0,0,0,0,0,0,0//CG_ARROWVULCAN
+4020,395,5,45,5,315,7,0,0,0,0,0,0//CG_MOONLIT
+4020,396,1,45,5,315,5,0,0,0,0,0,0//CG_MARIONETTE
+//Gypsy
+4021,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4021,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4021,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4021,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4021,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4021,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4021,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4021,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4021,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4021,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
+4021,324,10,0,0,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
+4021,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+4021,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
+4021,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
+4021,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+4021,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
+4021,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
+4021,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+4021,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+4021,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+4021,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+4021,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+4021,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+4021,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö#
+4021,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+4021,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+4021,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+4021,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+4021,394,10,0,0,0,0,0,0,0,0,0,0//CG_ARROWVULCAN
+4021,395,5,45,5,323,7,0,0,0,0,0,0//CG_MOONLIT
+4021,396,1,45,5,323,5,0,0,0,0,0,0//CG_MARIONETTE
+// Peco Paladin
+4022,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4022,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4022,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4022,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4022,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4022,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4022,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4022,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4022,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4022,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4022,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4022,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4022,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4022,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4022,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4022,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4022,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4022,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4022,28,10,23,5,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4022,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+4022,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+4022,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4022,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+4022,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+4022,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+4022,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+4022,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+4022,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+4022,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+4022,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+4022,367,5,8,5,248,5,250,2,0,0,0,0//PA_PRESSURE
+4022,368,5,8,5,248,5,255,3,0,0,0,0//PA_SACRIFICE
+4022,369,10,248,8,22,3,23,5,0,0,0,0//PA_GOSPEL
+// Baby "Novice"
+4023,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4023,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4023,143,1,0,0,0,0,0,0,0,0,0,0//NV_TRICKDEAD #Ž€‚ñ‚¾‚Ó‚è#
+// Swordman
+4024,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4024,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4024,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4024,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4024,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4024,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4024,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4024,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4024,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4024,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4024,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4024,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+// Magican
+4025,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4025,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4025,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4025,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4025,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4025,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4025,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4025,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4025,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4025,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4025,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4025,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4025,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4025,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4025,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4025,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+// Archer
+4026,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4026,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4026,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4026,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4026,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4026,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4026,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4026,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4026,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+// Acolyte
+4027,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4027,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4027,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4027,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4027,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4027,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4027,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4027,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4027,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4027,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4027,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4027,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4027,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4027,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4027,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4027,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4027,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+// Merchant
+4028,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4028,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4028,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4028,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4028,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4028,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4028,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4028,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4028,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4028,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4028,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4028,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+// Thief
+4029,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4029,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4029,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4029,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4029,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4029,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4029,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4029,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4029,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4029,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4029,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4029,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+// Knight
+4030,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4030,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4030,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4030,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4030,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4030,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4030,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4030,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4030,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4030,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4030,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4030,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4030,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4030,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+4030,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+4030,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+4030,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+4030,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+4030,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+4030,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+4030,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4030,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+// Priest
+4031,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4031,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4031,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4031,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4031,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4031,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4031,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4031,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4031,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4031,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4031,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4031,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4031,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4031,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4031,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4031,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4031,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+4031,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4031,12,10,68,4,70,3,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4031,54,4,72,1,9,4,0,0,0,0,0,0//ALL_RESURRECTION #ƒŠƒUƒŒƒNƒVƒ‡ƒ“#
+4031,65,10,0,0,0,0,0,0,0,0,0,0//PR_MACEMASTERY #ƒƒCƒXC—û#
+4031,66,5,0,0,0,0,0,0,0,0,0,0//PR_IMPOSITIO #ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX#
+4031,67,3,66,2,0,0,0,0,0,0,0,0//PR_SUFFRAGIUM #ƒTƒtƒ‰ƒMƒEƒ€#
+4031,68,5,31,1,66,3,0,0,0,0,0,0//PR_ASPERSIO #ƒAƒXƒyƒ‹ƒVƒI#
+4031,69,5,75,3,68,5,0,0,0,0,0,0//PR_BENEDICTIO #¹‘Ì~•Ÿ#
+4031,70,10,28,1,0,0,0,0,0,0,0,0//PR_SANCTUARY #ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ#
+4031,71,4,0,0,0,0,0,0,0,0,0,0//PR_SLOWPOISON #ƒXƒ[ƒ|ƒCƒYƒ“#
+4031,72,1,0,0,0,0,0,0,0,0,0,0//PR_STRECOVERY #ƒŠƒJƒoƒŠ[#
+4031,73,10,33,2,0,0,0,0,0,0,0,0//PR_KYRIE #ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“#
+4031,74,5,0,0,0,0,0,0,0,0,0,0//PR_MAGNIFICAT #ƒ}ƒOƒjƒtƒBƒJ[ƒg#
+4031,75,5,73,4,74,3,0,0,0,0,0,0//PR_GLORIA #ƒOƒƒŠƒA#
+4031,76,10,24,1,0,0,0,0,0,0,0,0//PR_LEXDIVINA #ƒŒƒbƒNƒXƒfƒBƒr[ƒi#
+4031,77,10,54,1,76,3,0,0,0,0,0,0//PR_TURNUNDEAD #ƒ^[ƒ“ƒAƒ“ƒfƒbƒh#
+4031,78,1,76,5,0,0,0,0,0,0,0,0//PR_LEXAETERNA #ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi#
+4031,79,10,12,1,78,1,77,3,0,0,0,0//PR_MAGNUS #ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€#
+// Wizard
+4032,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4032,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4032,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4032,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4032,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4032,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4032,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4032,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4032,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4032,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4032,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4032,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4032,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4032,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4032,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4032,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+4032,80,10,18,1,0,0,0,0,0,0,0,0//WZ_FIREPILLAR #ƒtƒ@ƒCƒA[ƒsƒ‰[#
+4032,81,10,20,1,10,1,0,0,0,0,0,0//WZ_SIGHTRASHER #ƒTƒCƒgƒ‰ƒbƒVƒƒ[#
+//4032,82,10,0,0,0,0,0,0,0,0,0,0//WZ_FIREIVY #ƒtƒ@ƒCƒAƒAƒCƒr[#
+4032,83,10,81,2,0,0,0,0,0,0,0,0//WZ_METEOR #ƒƒeƒIƒXƒg[ƒ€#
+4032,84,10,11,1,20,1,0,0,0,0,0,0//WZ_JUPITEL #ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[#
+4032,85,10,21,1,84,5,0,0,0,0,0,0//WZ_VERMILION #ƒ[ƒhƒIƒuƒ”ƒ@[ƒ~ƒŠƒIƒ“#
+4032,86,5,14,1,20,1,0,0,0,0,0,0//WZ_WATERBALL #ƒEƒH[ƒ^[ƒ{[ƒ‹#
+4032,87,10,16,1,15,1,0,0,0,0,0,0//WZ_ICEWALL #ƒAƒCƒXƒEƒH[ƒ‹#
+4032,88,10,87,1,0,0,0,0,0,0,0,0//WZ_FROSTNOVA #ƒtƒƒXƒgƒmƒ”ƒ@#
+4032,89,10,15,1,84,3,0,0,0,0,0,0//WZ_STORMGUST #ƒXƒg[ƒ€ƒKƒXƒg#
+4032,90,5,16,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+4032,91,5,90,3,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+4032,92,5,91,1,0,0,0,0,0,0,0,0//WZ_QUAGMIRE #ƒNƒ@ƒOƒ}ƒCƒA#
+4032,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+// Blacksmith
+4033,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4033,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4033,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4033,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4033,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4033,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4033,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4033,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4033,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4033,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4033,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4033,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+4033,94,5,0,0,0,0,0,0,0,0,0,0//BS_IRON #“S»‘¢#
+4033,95,5,94,1,0,0,0,0,0,0,0,0//BS_STEEL #|“S»‘¢#
+4033,96,5,94,1,0,0,0,0,0,0,0,0//BS_ENCHANTEDSTONE #‘®«Î»‘¢#
+4033,97,10,96,1,0,0,0,0,0,0,0,0//BS_ORIDEOCON #ƒIƒŠƒfƒIƒRƒ“Œ¤‹†#
+4033,98,3,0,0,0,0,0,0,0,0,0,0//BS_DAGGER #’ZŒ•»ì#
+4033,99,3,98,1,0,0,0,0,0,0,0,0//BS_SWORD #Υȓ#
+4033,100,3,99,1,0,0,0,0,0,0,0,0//BS_TWOHANDSWORD #—¼ŽèŒ•»ì#
+4033,101,3,99,2,0,0,0,0,0,0,0,0//BS_AXE #•€»ì#
+4033,102,3,103,1,0,0,0,0,0,0,0,0//BS_MACE #ƒƒCƒX»ì#
+4033,103,3,98,1,0,0,0,0,0,0,0,0//BS_KNUCKLE #ƒiƒbƒNƒ‹»ì#
+4033,104,3,98,2,0,0,0,0,0,0,0,0//BS_SPEAR #‘„»ì#
+4033,105,1,0,0,0,0,0,0,0,0,0,0//BS_HILTBINDING #ƒqƒ‹ƒgƒoƒCƒfƒBƒ“ƒO#
+4033,106,1,95,1,105,1,0,0,0,0,0,0//BS_FINDINGORE #zΔ­Œ©#
+4033,107,10,105,1,0,0,0,0,0,0,0,0//BS_WEAPONRESEARCH#•ŠíŒ¤‹†#
+4033,108,1,107,1,0,0,0,0,0,0,0,0//BS_REPAIRWEAPON #•ŠíC—#
+4033,109,5,0,0,0,0,0,0,0,0,0,0//BS_SKINTEMPER #ƒXƒLƒ“ƒeƒ“ƒpƒŠƒ“ƒO#
+4033,110,5,0,0,0,0,0,0,0,0,0,0//BS_HAMMERFALL #ƒnƒ“ƒ}[ƒtƒH[ƒ‹#
+4033,111,5,110,2,0,0,0,0,0,0,0,0//BS_ADRENALINE #ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…#
+4033,112,5,107,2,111,2,0,0,0,0,0,0//BS_WEAPONPERFECT#ƒEƒGƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“#
+4033,113,5,111,3,0,0,0,0,0,0,0,0//BS_OVERTHRUST #ƒI[ƒo[ƒgƒ‰ƒXƒg#
+4033,114,5,112,3,113,2,0,0,0,0,0,0//BS_MAXIMIZE #ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[#
+// Hunter
+4034,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4034,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4034,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4034,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4034,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4034,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4034,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4034,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4034,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4034,115,5,0,0,0,0,0,0,0,0,0,0//HT_SKIDTRAP #ƒXƒLƒbƒhƒgƒ‰ƒbƒv#
+4034,116,5,0,0,0,0,0,0,0,0,0,0//HT_LANDMINE #ƒ‰ƒ“ƒhƒ}ƒCƒ“#
+4034,117,5,115,1,0,0,0,0,0,0,0,0//HT_ANKLESNARE #ƒAƒ“ƒNƒ‹ƒXƒlƒA#
+4034,118,5,117,1,0,0,0,0,0,0,0,0//HT_SHOCKWAVE #ƒVƒ‡ƒbƒNƒEƒF[ƒuƒgƒ‰ƒbƒv#
+4034,119,5,120,1,0,0,0,0,0,0,0,0//HT_SANDMAN #ƒTƒ“ƒhƒ}ƒ“#
+4034,120,5,115,1,0,0,0,0,0,0,0,0//HT_FLASHER #ƒtƒ‰ƒbƒVƒƒ[#
+4034,121,5,120,1,0,0,0,0,0,0,0,0//HT_FREEZINGTRAP #ƒtƒŠ[ƒWƒ“ƒOƒgƒ‰ƒbƒv#
+4034,122,5,116,1,119,1,121,1,0,0,0,0//HT_BLASTMINE#ƒuƒ‰ƒXƒgƒ}ƒCƒ“#
+4034,123,5,118,1,122,1,0,0,0,0,0,0//HT_CLAYMORETRAP#ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv#
+4034,124,1,116,1,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+4034,125,1,118,1,124,1,0,0,0,0,0,0//HT_TALKIEBOX #ƒg[ƒL[ƒ{ƒbƒNƒX#
+4034,126,10,0,0,0,0,0,0,0,0,0,0//HT_BEASTBANE #ƒr[ƒXƒgƒxƒCƒ“#
+4034,127,1,126,1,0,0,0,0,0,0,0,0//HT_FALCON #ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[#
+4034,128,10,129,5,0,0,0,0,0,0,0,0//HT_STEELCROW #ƒXƒ`[ƒ‹ƒNƒƒE#
+4034,129,5,127,1,0,0,0,0,0,0,0,0//HT_BLITZBEAT #ƒuƒŠƒbƒcƒr[ƒg#
+4034,130,4,45,1,127,1,0,0,0,0,0,0//HT_DETECTING #ƒfƒBƒeƒNƒeƒBƒ“ƒO#
+4034,131,5,124,1,127,1,0,0,0,0,0,0//HT_SPRINGTRAP #ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv#
+// Assassin
+4035,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4035,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4035,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4035,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4035,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4035,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4035,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4035,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4035,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4035,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4035,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4035,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+4035,132,5,0,0,0,0,0,0,0,0,0,0//AS_RIGHT #‰EŽèC—û#
+4035,133,5,132,2,0,0,0,0,0,0,0,0//AS_LEFT #¶ŽèC—û#
+4035,134,10,0,0,0,0,0,0,0,0,0,0//AS_KATAR #ƒJƒ^[ƒ‹C—û#
+4035,135,5,51,2,0,0,0,0,0,0,0,0//AS_CLOAKING #ƒNƒ[ƒLƒ“ƒO#
+4035,136,10,134,4,0,0,0,0,0,0,0,0//AS_SONICBLOW #ƒ\ƒjƒbƒNƒuƒ[#
+4035,137,5,135,2,136,5,0,0,0,0,0,0//AS_GRIMTOOTH #ƒOƒŠƒ€ƒgƒD[ƒX#
+4035,138,10,52,1,0,0,0,0,0,0,0,0//AS_ENCHANTPOISON#ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“#
+4035,139,10,138,3,0,0,0,0,0,0,0,0//AS_POISONREACT #ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg#
+4035,140,10,138,5,0,0,0,0,0,0,0,0//AS_VENOMDUST #ƒxƒiƒ€ƒ_ƒXƒg#
+4035,141,10,139,5,140,5,0,0,0,0,0,0//AS_SPLASHER #ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[#
+//Peco Knight
+// Knight
+4036,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4036,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4036,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4036,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4036,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4036,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4036,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4036,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4036,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4036,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4036,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4036,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4036,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4036,56,10,55,1,0,0,0,0,0,0,0,0//KN_PIERCE #ƒsƒA[ƒX#
+4036,57,10,63,1,58,3,0,0,0,0,0,0//KN_BRANDISHSPEAR #ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA#
+4036,58,10,56,5,0,0,0,0,0,0,0,0//KN_SPEARSTAB #ƒXƒsƒAƒXƒ^ƒu#
+4036,59,5,56,3,0,0,0,0,0,0,0,0//KN_SPEARBOOMERANG #ƒXƒsƒAƒu[ƒƒ‰ƒ“#
+4036,60,10,3,1,0,0,0,0,0,0,0,0//KN_TWOHANDQUICKEN #ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“#
+4036,61,5,3,1,0,0,0,0,0,0,0,0//KN_AUTOCOUNTER #ƒI[ƒgƒJƒEƒ“ƒ^[#
+4036,62,10,5,10,7,3,3,5,60,10,61,5//KN_BOWLINGBASH #ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…#
+4036,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4036,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+// Crusader
+4037,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4037,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4037,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4037,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4037,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4037,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4037,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4037,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4037,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4037,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4037,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4037,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4037,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4037,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4037,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4037,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4037,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4037,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4037,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4037,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+4037,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+4037,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4037,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+4037,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+4037,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+4037,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+4037,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+4037,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+4037,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+4037,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+// Monk
+4038,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4038,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4038,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4038,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4038,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4038,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4038,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4038,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4038,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4038,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4038,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4038,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4038,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4038,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4038,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4038,35,1,28,2,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4038,156,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYLIGHT #ƒz[ƒŠ[ƒ‰ƒCƒg#
+4038,259,10,23,10,22,10,0,0,0,0,0,0//MO_IRONHAND #“SŒ#
+4038,260,5,269,2,0,0,0,0,0,0,0,0//MO_SPIRITSRECOVERY #Ԥ#
+4038,261,5,259,2,0,0,0,0,0,0,0,0//MO_CALLSPIRITS #‹CŒ÷#
+4038,262,1,261,5,0,0,0,0,0,0,0,0//MO_ABSORBSPIRITS #‹C’D#
+4038,263,10,265,5,0,0,0,0,0,0,0,0//MO_TRIPLEATTACK #ŽO’i¶#
+4038,264,1,271,3,260,2,268,3,0,0,0,0//MO_BODYRELOCATION #Žc‰e#
+4038,265,10,259,5,261,5,0,0,0,0,0,0//MO_DODGE #Œ©Ø‚è#
+4038,266,5,261,5,0,0,0,0,0,0,0,0//MO_INVESTIGATE #”­™¤#
+4038,267,5,266,3,0,0,0,0,0,0,0,0//MO_FINGEROFFENSIVE #Žw’e#
+4038,268,5,273,3,0,0,0,0,0,0,0,0//MO_STEELBODY #‹à„#
+4038,269,5,265,5,0,0,0,0,0,0,0,0//MO_BLADESTOP #”’nŽæ‚è#
+4038,270,5,262,1,0,0,0,0,0,0,0,0//MO_EXPLOSIONSPIRITS #”š—ô”g“®#
+4038,271,5,270,3,267,3,0,0,0,0,0,0//MO_EXTREMITYFIST #ˆ¢C—…”e–PŒ#
+4038,272,5,263,5,0,0,0,0,0,0,0,0//MO_CHAINCOMBO #˜A‘Ŷ#
+4038,273,5,272,3,0,0,0,0,0,0,0,0//MO_COMBOFINISH #–Ò—³Œ#
+// Sage
+4039,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4039,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4039,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4039,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4039,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4039,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4039,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4039,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4039,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4039,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4039,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4039,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4039,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4039,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4039,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4039,157,1,0,0,0,0,0,0,0,0,0,0//MG_ENERGYCOAT #ƒGƒiƒW[ƒR[ƒg#
+4039,93,1,0,0,0,0,0,0,0,0,0,0//WZ_ESTIMATION #ƒ‚ƒ“ƒXƒ^[î•ñ#
+4039,90,5,283,1,0,0,0,0,0,0,0,0//WZ_EARTHSPIKE #ƒA[ƒXƒXƒpƒCƒN#
+4039,91,5,90,1,0,0,0,0,0,0,0,0//WZ_HEAVENDRIVE #ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu#
+4039,274,10,0,0,0,0,0,0,0,0,0,0//SA_ADVANCEDBOOK #ƒAƒhƒoƒ“ƒXƒhƒuƒbƒN#
+4039,275,5,274,2,0,0,0,0,0,0,0,0//SA_CASTCANCEL #ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹#
+4039,276,5,274,4,0,0,0,0,0,0,0,0//SA_MAGICROD #ƒ}ƒWƒbƒNƒƒbƒh#
+4039,277,5,276,1,0,0,0,0,0,0,0,0//SA_SPELLBREAKER #ƒXƒyƒ‹ƒuƒŒ[ƒJ[#
+4039,278,10,275,1,0,0,0,0,0,0,0,0//SA_FREECAST #ƒtƒŠ[ƒLƒƒƒXƒg#
+4039,279,10,278,4,0,0,0,0,0,0,0,0//SA_AUTOSPELL #ƒI[ƒgƒXƒyƒ‹#
+4039,280,5,19,1,274,5,0,0,0,0,0,0//SA_FLAMELAUNCHER #ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ[#
+4039,281,5,14,1,274,5,0,0,0,0,0,0//SA_FROSTWEAPON #ƒtƒƒXƒgƒEƒFƒ|ƒ“#
+4039,282,5,20,1,274,5,0,0,0,0,0,0//SA_LIGHTNINGLOADER #ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[#
+4039,283,5,16,1,274,5,0,0,0,0,0,0//SA_SEISMICWEAPON #ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“#
+4039,284,5,274,9,0,0,0,0,0,0,0,0//SA_DRAGONOLOGY #ƒhƒ‰ƒSƒmƒƒW[#
+4039,285,5,280,2,0,0,0,0,0,0,0,0//SA_VOLCANO #ƒ{ƒ‹ƒP[ƒm#
+4039,286,5,281,2,0,0,0,0,0,0,0,0//SA_DELUGE #ƒfƒŠƒ…[ƒW#
+4039,287,5,282,2,0,0,0,0,0,0,0,0//SA_VIOLENTGALE #ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹#
+4039,288,5,285,3,286,3,287,3,0,0,0,0//SA_LANDPROTECTOR #ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^[#
+4039,289,5,277,3,0,0,0,0,0,0,0,0//SA_DISPELL #ƒfƒBƒXƒyƒ‹#
+4039,290,10,279,5,289,1,288,1,0,0,0,0//SA_ABRACADABRA #ƒAƒuƒ‰ƒJƒ^ƒuƒ‰#
+// Rogue
+4040,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4040,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4040,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4040,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4040,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4040,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4040,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
+4040,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å#
+4040,149,1,0,0,0,0,0,0,0,0,0,0//TF_SPRINKLESAND #»‚Ü‚«#
+4040,150,1,0,0,0,0,0,0,0,0,0,0//TF_BACKSLIDING #ƒoƒbƒNƒXƒeƒbƒv#
+4040,151,1,0,0,0,0,0,0,0,0,0,0//TF_PICKSTONE #ÎE‚¢#
+4040,152,1,0,0,0,0,0,0,0,0,0,0//TF_THROWSTONE #ΓŠ‚°#
+4040,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4040,44,10,0,0,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4040,46,10,44,10,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4040,124,1,46,5,0,0,0,0,0,0,0,0//HT_REMOVETRAP #ƒŠƒ€[ƒuƒgƒ‰ƒbƒv#
+4040,210,10,50,1,0,0,0,0,0,0,0,0//RG_SNATCHER #ƒXƒiƒbƒ`ƒƒ[#
+4040,211,10,210,4,0,0,0,0,0,0,0,0//RG_STEALCOIN #ƒXƒeƒB[ƒ‹ƒRƒCƒ“#
+4040,212,10,211,4,0,0,0,0,0,0,0,0//RG_BACKSTAP #ƒoƒbƒNƒXƒ^ƒu#
+4040,213,5,51,1,0,0,0,0,0,0,0,0//RG_TUNNELDRIVE #ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu#
+4040,214,5,212,2,213,2,0,0,0,0,0,0//RG_RAID #ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN#
+4040,215,5,217,5,0,0,0,0,0,0,0,0//RG_STRIPWEAPON #ƒXƒgƒŠƒbƒvƒEƒGƒ|ƒ“#
+4040,216,5,218,5,0,0,0,0,0,0,0,0//RG_STRIPSHIELD #ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒh#
+4040,217,5,216,5,0,0,0,0,0,0,0,0//RG_STRIPARMOR #ƒXƒgƒŠƒbƒvƒA[ƒ}[#
+4040,218,5,211,2,0,0,0,0,0,0,0,0//RG_STRIPHELM #ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€#
+4040,219,5,212,4,214,5,0,0,0,0,0,0//RG_INTIMIDATE#ƒCƒ“ƒeƒBƒ~ƒfƒCƒg#
+4040,220,1,221,5,0,0,0,0,0,0,0,0//RG_GRAFFITI #ƒOƒ‰ƒtƒBƒeƒB#
+4040,221,5,222,1,0,0,0,0,0,0,0,0//RG_FLAGGRAFFITI #ƒtƒ‰ƒbƒOƒOƒ‰ƒtƒBƒeƒB#
+4040,222,1,223,1,0,0,0,0,0,0,0,0//RG_CLEANER #ƒNƒŠ[ƒi[#
+4040,223,1,216,3,0,0,0,0,0,0,0,0//RG_GANGSTER #ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX#
+4040,224,5,223,1,0,0,0,0,0,0,0,0//RG_COMPULSION #ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg#
+4040,225,10,219,5,0,0,0,0,0,0,0,0//RG_PLAGIARISM #ƒNƒ[ƒ“ƒXƒLƒ‹#
+// Alchemist
+4041,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4041,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4041,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4041,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4041,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4041,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4041,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4041,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4041,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4041,153,1,0,0,0,0,0,0,0,0,0,0//MC_CARTREVOLUTION #ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“#
+4041,154,1,0,0,0,0,0,0,0,0,0,0//MC_CHANGECART #ƒ`ƒFƒ“ƒWƒJ[ƒg#
+4041,155,1,0,0,0,0,0,0,0,0,0,0//MC_LOUD #ƒ‰ƒEƒhƒ{ƒCƒX#
+4041,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4041,226,10,0,0,0,0,0,0,0,0,0,0//AM_AXEMASTERY #•€C—û#
+4041,227,10,0,0,0,0,0,0,0,0,0,0//AM_LERNINGPOTION #ƒ‰[ƒjƒ“ƒOƒ|[ƒVƒ‡ƒ“#
+4041,228,10,227,5,0,0,0,0,0,0,0,0//AM_PHARMACY #ƒtƒ@[ƒ}ƒV[#
+4041,229,5,228,4,0,0,0,0,0,0,0,0//AM_DEMONSTRATION#ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“#
+4041,230,5,228,5,0,0,0,0,0,0,0,0//AM_ACIDTERROR #ƒAƒVƒbƒhƒeƒ‰[#
+4041,231,5,228,3,0,0,0,0,0,0,0,0//AM_POTIONPITCHER#ƒ|[ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ[#
+4041,232,5,228,6,0,0,0,0,0,0,0,0//AM_CANNIBALIZE #ƒoƒCƒIƒvƒ‰ƒ“ƒg#
+4041,233,5,228,2,0,0,0,0,0,0,0,0//AM_SPHEREMINE #ƒXƒtƒBƒA[ƒ}ƒCƒ“#
+4041,234,5,236,3,0,0,0,0,0,0,0,0//AM_CP_WEAPON #ƒPƒ~ƒJƒ‹ƒEƒFƒ|ƒ“ƒ`ƒƒ[ƒW#
+4041,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD #ƒPƒ~ƒJƒ‹ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4041,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR #ƒPƒ~ƒJƒ‹ƒA[ƒ}[ƒ`ƒƒ[ƒW#
+4041,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM #ƒPƒ~ƒJƒ‹ƒwƒ‹ƒ€ƒ`ƒƒ[ƒW#
+// ŠØ‘‚Å‚à–¢ŽÀ‘•‚Ȃ̂ňȉº‚̃cƒŠ[ƒRƒƒ“ƒgƒAƒEƒg
+//4041,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS #¶–½—Ï—#
+//4041,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY #¶–½HŠwŒ¤‹†#
+//4041,240,5,239,7,0,0,0,0,0,0,0,0//AM_CREATECREATURE #”í‘¢•¨‘n‘¢#
+//4041,241,5,242,3,240,3,0,0,0,0,0,0//AM_CULTIVATION #ƒJƒ‹ƒgƒxƒCƒVƒ‡ƒ“#
+//4041,242,5,239,3,0,0,0,0,0,0,0,0//AM_FLAMECONTROL #ƒtƒŒ[ƒ€ƒRƒ“ƒgƒ[ƒ‹#
+//4041,243,1,244,1,0,0,0,0,0,0,0,0//AM_CALLHOMUN #ƒR[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//4041,244,1,239,5,0,0,0,0,0,0,0,0//AM_REST #ˆÀ‘§#
+//4041,245,10,246,3,0,0,0,0,0,0,0,0//AM_DRILLMASTER #ƒhƒŠƒ‹ƒ}ƒXƒ^[#
+//4041,246,10,241,5,0,0,0,0,0,0,0,0//AM_HEALHOMUN #ƒq[ƒ‹ƒzƒ€ƒ“ƒNƒ‹ƒX#
+//4041,247,10,246,5,0,0,0,0,0,0,0,0//AM_RESURRECTHOMUN #ƒŠƒUƒŒƒNƒVƒ‡ƒ“ƒzƒ€ƒ“ƒNƒ‹ƒX#
+// Bard
+4042,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4042,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4042,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4042,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4042,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4042,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4042,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4042,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4042,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4042,315,10,0,0,0,0,0,0,0,0,0,0//BA_MUSICALLESSON #ŠyŠí‚Ì—ûK#
+4042,316,5,315,3,0,0,0,0,0,0,0,0//BA_MUSICALSTRIKE #ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN#
+4042,317,5,315,1,304,1,0,0,0,0,0,0//BA_DISSONANCE #•s‹¦˜a‰¹#
+4042,318,5,305,1,0,0,0,0,0,0,0,0//BA_FROSTJOKE #Š¦‚¢ƒWƒ‡[ƒN#
+4042,319,10,317,3,0,0,0,0,0,0,0,0//BA_WHISTLE #Œû“J#
+4042,320,10,317,3,0,0,0,0,0,0,0,0//BA_ASSASSINCROSS #—[—z‚̃AƒTƒVƒ“ƒNƒƒX#
+4042,321,10,317,3,0,0,0,0,0,0,0,0//BA_POEMBRAGI #ƒuƒ‰ƒM‚ÌŽ#
+4042,322,10,317,3,0,0,0,0,0,0,0,0//BA_APPLEIDUN #ƒCƒhƒDƒ“‚Ì—ÑŒç#
+4042,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+4042,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+4042,306,1,319,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+4042,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+4042,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+4042,309,5,322,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+4042,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
+4042,311,1,320,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+4042,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+4042,313,5,321,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+4042,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+// Dancer
+4043,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4043,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4043,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4043,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4043,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4043,46,10,0,0,0,0,0,0,0,0,0,0//AC_DOUBLE #ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO#
+4043,47,10,46,5,0,0,0,0,0,0,0,0//AC_SHOWER #ƒAƒ[ƒVƒƒƒ[#
+4043,147,1,0,0,0,0,0,0,0,0,0,0//AC_MAKINGARROW #–îì¬#
+4043,148,1,0,0,0,0,0,0,0,0,0,0//AC_CHARGEARROW #ƒ`ƒƒ[ƒWƒAƒ[#
+4043,323,10,0,0,0,0,0,0,0,0,0,0//DC_DANCINGLESSON #ƒ_ƒ“ƒX‚Ì—ûK#
+4043,324,5,323,3,0,0,0,0,0,0,0,0//DC_THROWARROW #–‚¿#
+4043,325,5,323,1,304,1,0,0,0,0,0,0//DC_UGLYDANCE #Ž©•ªŸŽè‚ȃ_ƒ“ƒX#
+4043,326,5,305,1,0,0,0,0,0,0,0,0//DC_SCREAM #ƒXƒNƒŠ[ƒ€#
+4043,327,10,325,3,0,0,0,0,0,0,0,0//DC_HUMMING #ƒnƒ~ƒ“ƒO#
+4043,328,10,325,3,0,0,0,0,0,0,0,0//DC_DONTFORGETME #Ž„‚ð–Y‚ê‚È‚¢‚Åc#
+4043,329,10,325,3,0,0,0,0,0,0,0,0//DC_FORTUNEKISS #K‰^‚̃LƒX#
+4043,330,10,325,3,0,0,0,0,0,0,0,0//DC_SERVICEFORYOU #ƒT[ƒrƒXƒtƒH[ƒ†[#
+4043,304,1,0,0,0,0,0,0,0,0,0,0//BD_ADAPTATION #ƒAƒhƒŠƒu
+4043,305,1,304,1,0,0,0,0,0,0,0,0//BD_ENCORE #ƒAƒ“ƒR[ƒ‹#
+4043,306,1,327,10,0,0,0,0,0,0,0,0//BD_LULLABY #ŽqŽç‰Ì#
+4043,307,5,313,3,0,0,0,0,0,0,0,0//BD_RICHMANKIM #ƒjƒˆƒ‹ƒh‚̉ƒ#
+4043,308,1,311,1,0,0,0,0,0,0,0,0//BD_ETERNALCHAOS #‰i‰“‚̬“×#
+4043,309,5,330,10,0,0,0,0,0,0,0,0//BD_DRUMBATTLEFIELD #푾ŒÛ‚Ì‹¿‚«#
+4043,310,5,309,3,0,0,0,0,0,0,0,0//BD_RINGNIBELUNGEN #ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—A#
+4043,311,1,328,10,0,0,0,0,0,0,0,0//BD_ROKISWEIL #ƒƒL‚Ì‹©‚Ñ#
+4043,312,1,306,1,0,0,0,0,0,0,0,0//BD_INTOABYSS #[•£‚Ì’†‚É#
+4043,313,5,329,10,0,0,0,0,0,0,0,0//BD_SIEGFRIED #•sŽ€g‚̃W[ƒNƒtƒŠ[ƒh#
+4043,314,1,312,1,308,1,0,0,0,0,0,0//BD_RAGNAROK #ƒ‰ƒOƒiƒƒN#
+// Peco Crusader
+4044,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4044,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4044,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4044,3,10,2,1,0,0,0,0,0,0,0,0//SM_TWOHAND #—¼ŽèŒ•C—û#
+4044,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4044,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4044,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4044,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4044,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4044,144,1,0,0,0,0,0,0,0,0,0,0//SM_MOVINGRECOVERY #ˆÚ“®ŽžHP‰ñ•œ#
+4044,145,1,0,0,0,0,0,0,0,0,0,0//SM_FATALBLOW #‹}ŠUŒ‚#
+4044,146,1,0,0,0,0,0,0,0,0,0,0//SM_AUTOBERSERK #ƒI[ƒgƒo[ƒT[ƒN#
+4044,63,1,8,1,0,0,0,0,0,0,0,0//KN_RIDING #ƒ‰ƒCƒfƒBƒ“ƒO#
+4044,64,5,63,1,0,0,0,0,0,0,0,0//KN_CAVALIERMASTERY#‹R•ºC—û#
+4044,55,10,0,0,0,0,0,0,0,0,0,0//KN_SPEARMASTERY #‘„C—û#
+4044,35,1,248,5,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4044,22,10,35,1,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4044,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4044,28,10,23,5,248,10,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4044,248,10,0,0,0,0,0,0,0,0,0,0//CR_TRUST #ƒtƒFƒCƒX#
+4044,249,10,0,0,0,0,0,0,0,0,0,0//CR_AUTOGUARD #ƒI[ƒgƒK[ƒh#
+4044,250,5,249,5,0,0,0,0,0,0,0,0//CR_SHIELDCHARGE #ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW#
+4044,251,5,250,3,0,0,0,0,0,0,0,0//CR_SHIELDBOOMERANG #ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“#
+4044,252,10,251,3,0,0,0,0,0,0,0,0//CR_REFLECTSHIELD #ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh#
+4044,253,10,248,7,0,0,0,0,0,0,0,0//CR_HOLYCROSS #ƒz[ƒŠ[ƒNƒƒX#
+4044,254,10,253,6,248,10,0,0,0,0,0,0//CR_GRANDCROSS #ƒOƒ‰ƒ“ƒhƒNƒƒX#
+4044,255,5,252,5,254,4,0,0,0,0,0,0//CR_DEVOTION #ƒfƒBƒ{[ƒVƒ‡ƒ“#
+4044,256,5,22,5,28,5,0,0,0,0,0,0//CR_PROVIDENCE #ƒvƒƒ”ƒBƒfƒ“ƒX#
+4044,257,5,251,1,0,0,0,0,0,0,0,0//CR_DEFENDER #ƒfƒBƒtƒFƒ“ƒ_[#
+4044,258,10,55,10,0,0,0,0,0,0,0,0//CR_SPEARQUICKEN #ƒXƒsƒAƒNƒCƒbƒPƒ“#
+// Super Novice
+4045,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC #Šî–{ƒXƒLƒ‹#
+4045,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID #‰ž‹}Žè“–#
+4045,2,10,0,0,0,0,0,0,0,0,0,0//SM_SWORD #ΥCў#
+4045,4,10,0,0,0,0,0,0,0,0,0,0//SM_RECOVERY #HP‰ñ•œ—ÍŒüã#
+4045,5,10,0,0,0,0,0,0,0,0,0,0//SM_BASH #ƒoƒbƒVƒ…#
+4045,6,10,0,0,0,0,0,0,0,0,0,0//SM_PROVOKE #ƒvƒƒ{ƒbƒN#
+4045,7,10,5,5,0,0,0,0,0,0,0,0//SM_MAGNUM #ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN#
+4045,8,10,6,5,0,0,0,0,0,0,0,0//SM_ENDURE #ƒCƒ“ƒfƒ…ƒA#
+4045,9,10,0,0,0,0,0,0,0,0,0,0//MG_SRECOVERY #SP‰ñ•œ—ÍŒüã#
+4045,10,1,0,0,0,0,0,0,0,0,0,0//MG_SIGHT #ƒTƒCƒg#
+4045,11,10,0,0,0,0,0,0,0,0,0,0//MG_NAPALMBEAT #ƒiƒp[ƒ€ƒr[ƒg#
+4045,12,10,11,7,13,5,0,0,0,0,0,0//MG_SAFETYWALL #ƒZƒCƒtƒeƒBƒEƒH[ƒ‹#
+4045,13,10,11,4,0,0,0,0,0,0,0,0//MG_SOULSTRIKE #ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN#
+4045,14,10,0,0,0,0,0,0,0,0,0,0//MG_COLDBOLT #ƒR[ƒ‹ƒhƒ{ƒ‹ƒg#
+4045,15,10,14,5,0,0,0,0,0,0,0,0//MG_FROSTDIVER #ƒtƒƒXƒgƒ_ƒCƒo[#
+4045,16,10,0,0,0,0,0,0,0,0,0,0//MG_STONECURSE #ƒXƒg[ƒ“ƒJ[ƒX#
+4045,17,10,19,4,0,0,0,0,0,0,0,0//MG_FIREBALL #ƒtƒ@ƒCƒA[ƒ{[ƒ‹#
+4045,18,10,17,5,10,1,0,0,0,0,0,0//MG_FIREWALL #ƒtƒ@ƒCƒA[ƒEƒH[ƒ‹#
+4045,19,10,0,0,0,0,0,0,0,0,0,0//MG_FIREBOLT #ƒtƒ@ƒCƒA[ƒ{ƒ‹ƒg#
+4045,20,10,0,0,0,0,0,0,0,0,0,0//MG_LIGHTNINGBOLT #ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg#
+4045,21,10,20,4,0,0,0,0,0,0,0,0//MG_THUNDERSTORM #ƒTƒ“ƒ_[ƒXƒg[ƒ€#
+4045,22,10,0,0,0,0,0,0,0,0,0,0//AL_DP #ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“#
+4045,23,10,22,3,0,0,0,0,0,0,0,0//AL_DEMONBANE #ƒf[ƒ‚ƒ“ƒxƒCƒ“#
+4045,24,1,0,0,0,0,0,0,0,0,0,0//AL_RUWACH #ƒ‹ƒAƒt#
+4045,25,1,27,4,0,0,0,0,0,0,0,0//AL_PNEUMA #ƒjƒ…[ƒ}#
+4045,26,2,24,1,0,0,0,0,0,0,0,0//AL_TELEPORT #ƒeƒŒƒ|[ƒg#
+4045,27,4,26,2,0,0,0,0,0,0,0,0//AL_WARP #ƒ[ƒvƒ|[ƒ^ƒ‹#
+4045,28,10,0,0,0,0,0,0,0,0,0,0//AL_HEAL #ƒq[ƒ‹#
+4045,29,10,28,3,0,0,0,0,0,0,0,0//AL_INCAGI #‘¬“x‘‰Á#
+4045,30,10,29,1,0,0,0,0,0,0,0,0//AL_DECAGI #‘¬“xŒ¸­#
+4045,31,1,0,0,0,0,0,0,0,0,0,0//AL_HOLYWATER #ƒAƒNƒAƒxƒlƒfƒBƒNƒ^#
+4045,32,10,23,3,0,0,0,0,0,0,0,0//AL_CRUCIS #ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX#
+4045,33,10,22,3,0,0,0,0,0,0,0,0//AL_ANGELUS #ƒGƒ“ƒWƒFƒ‰ƒX#
+4045,34,10,22,5,0,0,0,0,0,0,0,0//AL_BLESSING #ƒuƒŒƒbƒVƒ“ƒO#
+4045,35,1,0,0,0,0,0,0,0,0,0,0//AL_CURE #ƒLƒ…ƒA[#
+4045,36,10,0,0,0,0,0,0,0,0,0,0//MC_INCCARRY #ŠŽŒÀŠE—Ê‘‰Á#
+4045,37,10,36,3,0,0,0,0,0,0,0,0//MC_DISCOUNT #ƒfƒBƒXƒJƒEƒ“ƒg#
+4045,38,10,37,3,0,0,0,0,0,0,0,0//MC_OVERCHARGE #ƒI[ƒo[ƒ`ƒƒ[ƒW#
+4045,39,10,36,5,0,0,0,0,0,0,0,0//MC_PUSHCART #ƒvƒbƒVƒ…ƒJ[ƒg#
+4045,40,1,0,0,0,0,0,0,0,0,0,0//MC_IDENTIFY #ƒAƒCƒeƒ€ŠÓ’è#
+4045,41,10,39,3,0,0,0,0,0,0,0,0//MC_VENDING #˜I“XŠJÝ#
+4045,42,10,0,0,0,0,0,0,0,0,0,0//MC_MAMMONITE #ƒƒ}[ƒiƒCƒg#
+4045,43,10,0,0,0,0,0,0,0,0,0,0//AC_OWL #‚Ó‚­‚낤‚Ì–Ú#
+4045,44,10,43,3,0,0,0,0,0,0,0,0//AC_VULTURE #ƒƒV‚Ì–Ú#
+4045,45,10,44,1,0,0,0,0,0,0,0,0//AC_CONCENTRATION #W’†—ÍŒüã#
+4045,48,10,0,0,0,0,0,0,0,0,0,0//TF_DOUBLE #ƒ_ƒuƒ‹ƒAƒ^ƒbƒN#
+4045,49,10,0,0,0,0,0,0,0,0,0,0//TF_MISS #‰ñ”𗦑‰Á#
+4045,50,10,0,0,0,0,0,0,0,0,0,0//TF_STEAL #ƒXƒeƒB[ƒ‹#
+4045,51,10,50,5,0,0,0,0,0,0,0,0//TF_HIDING #ƒnƒCƒfƒBƒ“ƒO#
+4045,52,10,0,0,0,0,0,0,0,0,0,0//TF_POISON #ƒCƒ“ƒxƒiƒ€#
4045,53,1,52,3,0,0,0,0,0,0,0,0//TF_DETOXIFY #‰ð“Å# \ No newline at end of file
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 121471833..1d1df8c66 100644
--- a/doc/client_packet.txt
+++ b/doc/client_packet.txt
@@ -1,1072 +1,1072 @@
-
- 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 ?.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
+
+ 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 ?.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 88886d055..7f3fbcdbe 100644
--- a/doc/conf_ref.txt
+++ b/doc/conf_ref.txt
@@ -1,1981 +1,1981 @@
-==========================================================================
-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 A setup of map-server (setup of a special rule etc.)
- 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 A setup of map-server (setup of a special rule etc.)
+ 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/help.txt b/doc/help.txt
index f5e735fec..7b8325899 100644
--- a/doc/help.txt
+++ b/doc/help.txt
@@ -1,453 +1,453 @@
-GM Commands Help File
-By Akaru
------------------------
-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).
-
-<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)
+GM Commands Help File
+By Akaru
+-----------------------
+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).
+
+<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)
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.txt b/doc/item.txt
index f8bcfa955..062936407 100644
--- a/doc/item.txt
+++ b/doc/item.txt
@@ -1,1451 +1,1451 @@
-ID Ename
-
-0 Default
-501 Red Potion
-502 Orange Potion
-503 Yellow Potion
-504 White Potion
-505 Blue Potion
-506 Green Potion
-507 Red Herb
-508 Yellow Herb
-509 White Herb
-510 Blue Herb
-511 Green Herb
-512 Apple
-513 Banana
-514 Grape
-515 Carrot
-516 Sweet Potato
-517 Meat
-518 Honey
-519 Milk
-520 Hinalle Leaflet
-521 Aloe Leaflet
-522 Mastela Fruit
-523 Holy Water
-525 Panacea
-526 Royal Jelly
-528 Monster's Feed
-529 Candy
-530 Candy Cane
-531 Apple Juice
-532 Banana Juice
-533 Grape Juice
-534 Carrot Juice
-535 Pumpkin
-536 Ice Cream
-537 Pet Food
-538 Well-baked Cookie
-539 Piece of Cake
-540 Falcon food
-541 Pecopeco food
-542 Festive Cookie
-543 Festive Rainbow Cake
-544 Raw Fish
-545 Red Potion Bottle
-546 Yellow Potion Bottle
-547 White Potion Bottle
-548 Cheese
-549 Hot Potato
-550 Rice Popper
-551 Sushi
-552 Ketupat
-553 Dumpling
-554 Mochi
-555 ??
-556 ??????
-557 ??????_???_??????
-558 Chocolate
-559 Hand-made Chocolate
-601 Fly Wing
-602 Butterfly Wing
-603 Old Blue Box
-604 Branch of Dead tree
-605 Anodyne
-606 Aloevera
-607 Yggdrasilberry
-608 Yggdrasil Seed
-609 Amulet
-610 Yggdrasil Leaf
-611 Magnifier
-612 Mini Furnace
-613 Iron Hammer
-614 Golden Hammer
-615 Oridecon Hammer
-616 Old Card Album
-617 Old Violet Box
-618 Worn Out Scroll
-619 Unripe Apple
-620 Orange Juice
-621 Bitter Herb
-622 Rainbow Carrot
-623 Earthworm the Dude
-624 Rotten Fish
-625 Rusty Iron
-626 Monster Juice
-627 Sweet Milk
-628 Well Dried Bone
-629 Singing Flower
-630 Dew Laden Moss
-631 Deadly Noxious Herb
-632 Fatty Chubby Earthworm
-633 Baked Yam
-634 Tropical Banana
-635 Horror of Tribe
-636 No Recipient
-637 Old Broom
-638 Silver Knife of Chastity
-639 Armlet of Obedience
-640 Shining Stone
-641 Contracts in Shadow
-642 Book of Devil
-643 Pet Incubator
-644 Gift Box
-645 Concentration Potion
-656 Awakening Potion
-657 Berserk Potion
-658 Tribal Solidarity
-659 Her Heart
-660 Red Candle
-661 Sky Apron
-663 Rice Cake
-664 Gift Box
-665 Gift Box
-666 Gift Box
-667 Gift Box
-668 Angpow
-669 ??????_??????_????
-670 ????
-671 ??
-672 ????
-673 ??
-674 ?????
-675 ??
-676 ????
-677 ???
-678 ??
-679 ???
-701 Ora Ora
-702 Animal Gore
-703 Hinalle
-704 Aloe
-705 Clover
-706 Four-Leaf Clover
-707 Singing Plant
-708 Ment
-709 Izidor
-710 Illusion Flower
-711 Shoot
-712 Flower
-713 Empty Bottle
-714 Emperium
-715 Yellow Gemstone
-716 Red Gemstone
-717 Blue Gemstone
-718 Garnet
-719 Amethyst
-720 Aquamarine
-721 Emerald
-722 Pearl
-723 Ruby
-724 Cursed Ruby
-725 Sardonyx
-726 Sapphire
-727 Opal
-728 Topaz
-729 Zircon
-730 1 Carat Diamond
-731 2 Carat Diamond
-732 3 Carat Diamond
-733 Cracked Diamond
-734 Red Frame
-735 Chung Jah
-736 China
-737 Black Ladle
-738 Pencil Case
-739 Rouge
-740 Puppet
-741 Poring Doll
-742 Chonchon Doll
-743 Spore Doll
-744 Bouquet
-745 Wedding Bouquet
-746 Glass Bead
-747 Crystal Mirror
-748 Witherless Rose
-749 Frozen Rose
-750 Baphomet Doll
-751 Osiris Doll
-752 Grasshopper Doll
-753 Yoyo Doll
-754 Raccoon Doll
-756 Rough Oridecon
-757 Rough Elunium
-901 Danggie
-902 Tree Root
-903 Reptile Tongue
-904 Scorpion Tail
-905 Stem
-906 Pointed Scale
-907 Resin
-908 Spawn
-909 Jellopy
-910 Garlet
-911 Scell
-912 Zargon
-913 Tooth of Bat
-914 Fluff
-915 Chrysalis
-916 Feather of Birds
-917 Talon
-918 Sticky Webfoot
-919 Animal Skin
-920 Wolf Claw
-921 Mushroom Spore
-922 Orc's Fang
-923 Evil Horn
-924 Powder of Butterfly
-925 Bill of Birds
-926 Snake Scale
-928 Insect Feeler
-929 Immortal Heart
-930 Rotten Bandage
-931 Orcish Voucher
-932 Skel-Bone
-934 Memento
-935 Shell
-936 Scale Shell
-937 Venom Canine
-938 Sticky Mucus
-939 Bee Sting
-940 Grasshopper's Leg
-941 Nose Ring
-942 Yoyo Tail
-943 Solid Shell
-944 Horseshoe
-945 Raccoon Leaf
-946 Snail's Shell
-947 Horn
-948 Bear's Footskin
-949 Feather
-950 Heart of Mermaid
-951 Fin
-952 Cactus Needle
-953 Stone Heart
-954 Shining Scale
-955 Worm Peeling
-956 Gill
-957 Decayed Nail
-958 Horrendous Mouth
-959 Stinky Scale
-960 Nipper
-961 Conch
-962 Tentacle
-963 Sharp scale
-964 Crap Shell
-965 Clam Shell
-966 Clam Flesh
-967 Turtle Shell
-968 Heroic Emblem
-969 Gold
-970 Alchol
-971 Detrimindexta
-972 Karvodailnirol
-973 Counteragent
-974 Mixture
-975 Scarlet Dyestuffs
-976 Lemon Dyestuffs
-978 Cobaltblue Dyestuffs
-979 Darkgreen Dyestuffs
-980 Orange Dyestuffs
-981 Violet Dyestuffs
-982 White Dyestuffs
-983 Black Dyestuffs
-984 Oridecon
-985 Elunium
-986 Anvil
-987 Oridecon Anvil
-988 Golden Anvil
-989 Emperium Anvil
-990 Red Blood
-991 Crystal Blue
-992 Wind of Verdure
-993 Green Live
-994 Flame Heart
-995 Mystic Frozen
-996 Rough Wind
-997 Great Nature
-998 Iron
-999 Steel
-1000 Star Crumb
-1001 Star Dust
-1002 Iron Ore
-1003 Coal
-1004 Chivalry Emblem
-1005 Hammer of Blacksmith
-1006 Old Magic Book
-1007 Necklace of Wisdom
-1008 Necklace of Oblivion
-1009 Hand of God
-1010 Phracon
-1011 Emveretarcon
-1012 Frill
-1013 Rainbow Shell
-1014 Ant Jaw
-1015 Tongue
-1016 Rat Tail
-1017 Mole Whiskers
-1018 Mole Claw
-1019 Trunk
-1020 Black Hair
-1021 Dokkaebi Horn
-1022 Nine Tails
-1023 Fish Tail
-1024 Squid ink
-1025 Cobweb
-1026 Acorn
-1027 Porcupine Quill
-1028 Mane
-1029 Tiger Skin
-1030 Tiger's Footskin
-1031 Mantis Scythe
-1032 Maneater Blossom
-1033 Maneater Root
-1034 Blue Hair
-1035 Dragon Canine
-1036 Dragon Scale
-1037 Dragon Tail
-1038 Little Evil Horn
-1039 Little Evil Wing
-1040 Elder Pixie's Moustache
-1041 Lantern
-1042 Bug Leg
-1043 Orc Claw
-1044 Zenorc's Fang
-1045 Cultish Masque
-1046 Scorpion Nipper
-1047 Dead Medusa
-1048 Horrendous Hair
-1049 Skirt of Virgin
-1050 Tendon
-1051 Detonator
-1052 Single Cell
-1053 Ancient Tooth
-1054 Ancient Lips
-1055 Earthworm Peeling
-1056 Grit
-1057 Moth Dust
-1058 Moth Wings
-1059 Fabric
-1060 Golden Hair
-1061 Witched Starsand
-1062 Jack o' Pumpkin
-1063 Fang
-1064 Reins
-1065 Trap
-1066 Fine-grained Trunk
-1067 Solid Trunk
-1068 Barren Trunk
-1069 Orange Net Mushroom
-1070 Orange Gooey Mushroom
-1071 Unknown Testtube
-1072 DEL Message
-1073 Voucher
-1074 Voucher
-1075 Voucher
-1076 Voucher
-1077 Voucher
-1078 Voucher
-1079 Voucher
-1080 Voucher
-1081 DEL Box
-1082 DEL Box
-1083 DEL Box
-1084 Kapra Pass
-1085 Unknown Testtube
-1086 Unknown Testtube
-1087 Unknown Testtube
-1088 Morocc Solution
-1089 Payon Solution
-1090 Unknown Testtube
-1091 DEL Box
-1092 Empty Testtube
-1093 Empty Potion Bottle
-1094 Short Daenggie
-1095 Needle of Alarm
-1096 Round Shell
-1097 Worn Out Page
-1098 Manacles
-1099 Worn-out Prison Uniform
-1101 Sword
-1102 Sword
-1103 Sword
-1104 Falchion
-1105 Falchion
-1106 Falchion
-1107 Blade
-1108 Blade
-1109 Blade
-1110 Rapier
-1111 Rapier
-1112 Rapier
-1113 Scimiter
-1114 Scimiter
-1115 Scimiter
-1116 Katana
-1117 Katana
-1118 Katana
-1119 Tsurugi
-1120 Tsurugi
-1121 Tsurugi
-1122 Ring Pommel Saber
-1123 Haedonggum
-1124 Orcish sword
-1125 Ring Pommel Saber
-1126 Saber
-1127 Saber
-1128 Haedonggum
-1129 Flamberge
-1130 Nagan
-1131 Ice Falchon
-1132 Edge
-1133 Fire Brand
-1134 Caesar's Sword
-1135 Cutlas
-1136 Solar Sword
-1137 Excalibur
-1138 Mysteltainn
-1139 Talefing
-1140 Byeollungum
-1141 Immaterial Sword
-1142 Crystal Sword
-1143 Gaia Sword
-1144 Sashimi
-1145 Holy Avenger
-1151 Slayer
-1152 Slayer
-1153 Slayer
-1154 Bastard Sword
-1155 Bastard Sword
-1156 Bastard Sword
-1157 Two-handed Sword
-1158 Two-handed Sword
-1159 Two-handed Sword
-1160 Broad Sword
-1161 Balmung
-1162 Broad Sword
-1163 Claymore
-1164 Muramasa
-1165 Masamune
-bonus bStr
-bonus bAspd
-bonus bDefRate
-bonus bDef2Rate
- }
-1166 Dragon Slayer
-1167 Schweizersabel
-1168 Zweihander
-1169 Executioner
-1170 Katzbalger
-1201 Knife
-1202 Knife
-1203 Knife
-1204 Cutter
-1205 Cutter
-1206 Cutter
-1207 Main Gauche
-1208 Main Gauche
-1209 Main Gauche
-1210 Dirk
-1211 Dirk
-1212 Dirk
-1213 Dagger
-1214 Dagger
-1215 Dagger
-1216 Stiletto
-1217 Stiletto
-1218 Stiletto
-1219 Gladius
-1220 Gladius
-1221 Gladius
-1222 Damascus
-1223 Fortune Sword
-1224 Swordbreaker
-1225 Mailbreaker
-1226 Damascus
-1227 Weeder Knife
-1228 Combat Knife
-1229 Mama's Knife
-1230 House Auger
-1231 Bazerald
-1232 Assasin Dagger
-1233 Excorcise
-1234 Walgwanggum
-1235 Azoth
-1236 Sucsamad
-1237 Grimtooth
-1238 Zeny Knife
-1239 Poison Knife
-1240 Princess Knife
-1241 Cursed Knife
-1242 Counter Knife
-1243 Novice's Main Gauche
-1250 Jur
-1251 Jur
-1252 Katar
-1253 Katar
-1254 Jamadhar
-1255 Jamadhar
-1256 Katar of Cold Icicle
-1257 Katar of Dusty Thornbush
-1258 Katar of Raging Blaze
-1259 Katar of Piercing Wind
-1260 Sharppened Legbone of Gh
-1261 Infiltrator
-1301 Axe
-1302 Axe
-1303 Axe
-1304 Orcish Axe
-1305 Cleaver
-1306 War Axe
-1351 Battle Axe
-1352 Battle Axe
-1353 Battle Axe
-1354 Hammer
-1355 Hammer
-1356 Hammer
-1357 Buster
-1358 Buster
-1359 Buster
-1360 Two-handed Axe
-1361 Two-handed Axe
-1362 Two-handed Axe
-1363 Bloody Axe
-1364 Great Axe
-1365 Sabbath
-1366 Light Epsilon
-1367 Slaughter
-1368 Tomahawk
-1369 Guillotine
-1401 Javelin
-1402 Javelin
-1403 Javelin
-1404 Spear
-1405 Spear
-1406 Spear
-1407 Pike
-1408 Pike
-1409 Pike
-1410 Lance
-1411 Lance
-1412 Lance
-1413 Gungnir
-1414 Gelerdria
-1415 Brocca
-1416 Tjungkuletti
-1417 Pole Axe
-1451 Guisarme
-1452 Guisarme
-1453 Guisarme
-1454 Glaive
-1455 Glaive
-1456 Glaive
-1457 Partizan
-1458 Partizan
-1459 Partizan
-1460 Trident
-1461 Trident
-1462 Trident
-1463 Halberd
-1464 Halberd
-1465 Halberd
-1466 Crescent Scythe
-1467 Bill Guisarme
-1468 Zephyrus
-1469 Longinus's Spear
-1470 Brionac
-1471 Hellfire
-1472 Soul Staff
-1473 Wizardy staff
-1501 Club
-1502 Club
-1503 Club
-1504 Mace
-1505 Mace
-1506 Mace
-1507 Smasher
-1508 Smasher
-1509 Smasher
-1510 Flail
-1511 Flail
-1512 Flail
-1513 Morning Star
-1514 Morning Star
-1515 Morning Star
-1516 Sword Mace
-1517 Sword Mace
-1518 Sword Mace
-1519 Chain
-1520 Chain
-1521 Chain
-1522 Stunner
-1523 Spike
-1524 Golden Mace
-1525 Long Mace
-1526 Slash
-1527 Quadrille
-1528 Grand Cross
-1529 Iron Driver
-1530 Mjollnir
-1531 Spanner
-1550 Book
-1551 Bible
-1552 Tablet
-1553 Book of Billows
-1554 Book of Mother Earth
-1555 Book of Blazing Sun
-1556 Book of Gust of Wind
-1557 Book of the Apocalypse
-1558 Girl's Diary
-1599 Angra Manyu
-1601 Rod
-1602 Rod
-1603 Rod
-1604 Wand
-1605 Wand
-1606 Wand
-1607 Staff
-1608 Staff
-1609 Staff
-1610 Arc Wand
-1611 Arc Wand
-1612 Arc Wand
-1613 Mighty Staff
-1614 Wand of Occult
-1615 Bone Wand
-1701 Bow
-1702 Bow
-1703 Bow
-1704 Composite Bow
-1705 Composite Bow
-1706 Composite Bow
-1707 Great Bow
-1708 Great Bow
-1709 Great Bow
-1710 Cross Bow
-1711 Cross Bow
-1712 Cross Bow
-1713 Arbalest
-1714 Gakkung
-1715 Arbalest
-1716 Gakkung
-1718 Hunter Bow
-1719 Roguemaster's Bow
-1720 Rudra's Bow
-1721 Repeating Crossbow
-1722 Ballista
-1750 Arrow
-1751 Silver Arrow
-1752 Fire Arrow
-1753 Steel Arrow
-1754 Crystal Arrow
-1755 Arrow of Wind
-1756 Stone Arrow
-1757 Immaterial Arrow
-1758 Stun Arrow
-1759 Freeze Arrow
-1760 Flash Arrow
-1761 Curse Arrow
-1762 Rusted Arrow
-1763 Poison Arrow
-1764 Sharp Arrow
-1765 Oridecon Arrow
-1766 Arrow of Counter Evil
-1767 Shadow Arrow
-1768 Sleep Arrow
-1769 Mute Arrow
-1770 Iron Arrow
-1801 Waghnakh
-1802 Waghnakh
-1803 Knuckle Duster
-1804 Knuckle Duster
-1805 Hora
-1806 Hora
-1807 Fist
-1808 Fist
-1809 Claw
-1810 Claw
-1811 Finger
-1812 Finger
-1813 Kaiser Knuckle
-1814 Berserk
-1901 Violin
-1902 Violin
-1903 Mandolin
-1904 Mandolin
-1905 Lute
-1906 Lute
-1907 Guitar
-1908 Guitar
-1909 Harp
-1910 Harp
-1911 Guhmoongoh
-1912 Guhmoongoh
-1950 Rope
-1951 Rope
-1952 Line
-1953 Line
-1954 Wire
-1955 Wire
-1956 Rante
-1957 Rante
-1958 Tail
-1959 Tail
-1960 Whip
-1961 Whip
-1962 Lariat
-1963 Rapture Rose
-1964 Chemeti
-2101 Guard
-2102 Guard
-2103 Buckler
-2104 Buckler
-2105 Shield
-2106 Shield
-2107 Mirror Shield
-2108 Mirror Shield
-2109 Book of Summoning
-2110 Holy Guard
-2111 Evangelist
-2112 Novice Guard
-2199 Ahura Mazda
-2201 Sunglasses
-2202 Sunglasses
-2203 Glasses
-2204 Glasses
-2205 Diver's Goggles
-2206 Wedding Veil
-2207 Fancy Flower
-2208 Ribbon
-2209 Ribbon
-2210 Hair Band
-2211 Bandana
-2212 Eye Patch
-2213 Kitty Band
-2214 Bunny Band
-2215 Flower Band
-2216 Biretta
-2217 Biretta
-2218 Flu Mask
-2219 Flu Mask
-2220 Hat
-2221 Hat
-2222 Turban
-2223 Turban
-2224 Goggle
-2225 Goggle
-2226 Cap
-2227 Cap
-2228 Helm
-2229 Helm
-2230 Gemmed Sallet
-2231 Gemmed Sallet
-2232 Circlet
-2233 Circlet
-2234 Tiara
-2235 Crown
-2236 Santa's Hat
-2237 Bandit Beard
-2238 Moustache
-2239 Single Glass
-2240 Beard
-2241 Granpa Beard
-2242 Purple Glasses
-2243 Geek Glasses
-2244 Big Ribbon
-2245 Sweet Gent
-2246 Golden Gear
-2247 Romantic Gent
-2248 Western Grace
-2249 Coronet
-2250 Cute Ribbon
-2251 Monk Hat
-2252 Wizard Hat
-2253 Sunflower
-2254 Angel Wing
-2255 Evil Wing
-2256 Majestic Goat
-2257 Snow Horn
-2258 Spiky Band
-2259 Mini Propeller
-2260 Mini Glasses
-2261 Army Cap
-2262 Pierrot Nose
-2263 Zoro Masque
-2264 Munak Hat
-2265 Ganster Mask
-2266 Iron Cane
-2267 Cigar
-2268 Pipe
-2269 Romantic Flower
-2270 Romantic Leaf
-2271 Jack a Dandy
-2272 Stop Post
-2273 Doctor Band
-2274 Ghost Bandana
-2275 Red Bandana
-2276 Eagle Eyes
-2277 Nurse Cap
-2278 Mr. Smile
-2279 Bomb Wick
-2280 Sakkat
-2281 Opera Masque
-2282 Heaven Ring
-2283 Ear Mufs
-2284 Antler
-2285 Apple o' Archer
-2286 Elven Ears
-2287 Pirate Bandana
-2288 Mr. Scream
-2289 Poo Poo Hat
-2290 Funeral Hat
-2291 Masquerade
-2292 Welding Mask
-2293 Pretend Murdered
-2294 Stellar
-2295 Blinker
-2296 Binoculars
-2297 Goblini Mask
-2298 Green Feeler
-2299 Orc Helm
-2301 Cotton Shirt
-2302 Cotton Shirt
-2303 Leather Jacket
-2304 Leather Jacket
-2305 Adventurer's Suit
-2306 Adventurer's Suit
-2307 Mantle
-2308 Mantle
-2309 Coat
-2310 Coat
-2311 Mink Coat
-2312 Padded Armor
-2313 Padded Armor
-2314 Chain Mail
-2315 Chain Mail
-2316 Full Plate
-2317 Full Plate
-2318 Lord's Clothes
-2319 Glittering Jacket
-2320 Formal Suit
-2321 Silk Robe
-2322 Silk Robe
-2323 Scapulare
-2324 Scapulare
-2325 Saint's Robe
-2326 Saint's Robe
-2327 Holy Robe
-2328 Wooden Mail
-2329 Wooden Mail
-2330 Tights
-2331 Tights
-2332 Silver Robe
-2333 Silver Robe
-2334 Mage Coat
-2335 Thief Clothes
-2336 Thief Clothes
-2337 Ninja Suit
-2338 Wedding Dress
-2339 Pantie
-2340 Novice Breastplate
-2341 Full Plate Armor
-2342 Full Plate Armor
-2343 Casting Robe
-2344 Fire Armor
-2345 Fire Armor
-2346 Water Armor
-2347 Water Armor
-2348 Wind Armor
-2349 Wind Armor
-2350 Earth Armor
-2351 Earth Armor
-2352 Novice Armor
-2401 Sandals
-2402 Sandals
-2403 Shoes
-2404 Shoes
-2405 Boots
-2406 Boots
-2407 Crystal Pumps
-2408 Ball'n'Chain
-2409 Highheals
-2410 Sleipnir
-2411 Greaves
-2412 Greaves
-2413 Safety Shoes
-2414 Novice Sandal
-2501 Hood
-2502 Hood
-2503 Muffler
-2504 Muffler
-2505 Manteau
-2506 Manteau
-2507 Cape of Old Marquess
-2508 Ragamuffin Manteau
-2509 Manteau of Life
-2510 Novice Hood
-2601 Ring
-2602 Earring
-2603 Necklace
-2604 Glove
-2605 Brooch
-2607 Clip
-2608 Rosary
-2609 Skull Ring
-2610 Gold Ring
-2611 Silver Ring
-2612 Flower Ring
-2613 Diamond Ring
-2614 Eye of Dullahan
-2615 Safety Ring
-2616 Critical Ring
-2617 Celebrant's Mitten
-2618 Matyr's Leash
-2619 Bow Thimble
-2620 Rogue's Treasure
-2621 Ancient Ring
-2622 Ancient Earring
-2623 Ancient Necklace
-2624 Ancient Glove
-2625 Ancient Brooch
-2626 Ancient Rosary
-2627 Ancient Belt
-2628 Novice Armlet
-2629 Magingiorde
-2630 Brysinggamen
-2631 Pebble Ring
-2634 Wedding Ring
-2635 Wedding Ring
-2636 Gold Christmas Ring
-2637 Silver Christmas Ring
-4001 Poring Card
-4002 Fabre Card
-4003 Pupa Card
-4004 Drops Card
-4005 Poring Card
-4006 Lunatic Card
-4007 Pecopeco Egg Card
-4008 Picky Card
-4009 Chonchon Card
-4010 Wilow Card
-4011 Picky Card
-4012 Thief Bug Egg Card
-4013 Andre Egg Card
-4014 Roda Frog Card
-4015 Condor Card
-4016 Thief Bug Card
-4017 Savage Babe Card
-4018 Andre Larva Card
-4019 Hornet Card
-4020 Farmiliar Card
-4021 Rocker Card
-4022 Spore Card
-4023 Desert Wolf Babe Card
-4024 Plankton Card
-4025 Skeleton Card
-4026 Thief bug Female Card
-4027 Kukre Card
-4028 Tarou Card
-4029 Wolf Card
-4030 Mandragora Card
-4031 Pecopeco Card
-4032 Ambernite Card
-4033 Poporing Card
-4034 Worm Tail Card
-4035 Hydra Card
-4036 Muka Card
-4037 Snake Card
-4038 Zombie Card
-4039 Stainer Card
-4040 Creamy Card
-4041 Coco Card
-4042 Steel Chonchon Card
-4043 Andre Card
-4044 Smokie Card
-4045 Horn Card
-4046 Martin Card
-4047 Ghostring Card
-4048 Poison Spore Card
-4049 Vadon Card
-4050 Thief bug Male Card
-4051 Yoyo Card
-4052 Elder Wilow Card
-4053 Vitata Card
-4054 Angeling Card
-4055 Marina Card
-4056 Dustiness Card
-4057 Metaller Card
-4058 Thara Frog Card
-4059 Soldier Andre Card
-4060 Goblin Card
-4061 Cornutus Card
-4062 Anacondaq Card
-4063 Caramel Card
-4064 Zerom Card
-4065 Kaho Card
-4066 Orc Warrior Card
-4067 Megalodon Card
-4068 Scorpion Card
-4069 Drainliar Card
-4070 Eggyra Card
-4071 Orc Zombie Card
-4072 Golem Card
-4073 Pirate Skeleton Card
-4074 BigFoot Card
-4075 Argos Card
-4076 Magnolia Card
-4077 Phen Card
-4078 Savage Card
-4079 Mantis Card
-4080 Flora Card
-4081 Hode Card
-4082 Desert Wolf Card
-4083 Rafflesia Card
-4084 Marine Sphere Card
-4085 Orc Skeleton Card
-4086 Soldier Skeleton Card
-4087 Giearth Card
-4088 Frilldora Card
-4089 Swordfish Card
-4090 Munak Card
-4091 Kobold Card
-4092 Skel Worker Card
-4093 Obeaune Card
-4094 Archer Skeleton Card
-4095 Marse Card
-4096 Zenorc Card
-4097 Matyr Card
-4098 Dokebi Card
-4099 Pasana Card
-4100 Sohee Card
-4101 Sandman Card
-4102 Whisper Card
-4103 Horong Card
-4104 Requiem Card
-4105 Marc Card
-4106 Mummy Card
-4107 Verit Card
-4108 Myst Card
-4109 Jakk Card
-4110 Ghoul Card
-4111 Strouf Card
-4112 Marduk Card
-4113 Marionette Card
-4114 Argiope Card
-4115 Hunter Fly Card
-4116 Isis Card
-4117 Sidewinder Card
-4118 Petit Card
-4119 Bathory Card
-4120 Petit Card
-4121 Phreeoni Card
-4122 Deviruchi Card
-4123 Eddga Card
-4124 Medusa Card
-4125 Deviace Card
-4126 Minorous Card
-4127 Nightmare Card
-4128 Golden Bug Card
-4129 Baphomet Card
-4130 Scorpion King Card
-4131 Moonlight Flower Card
-4132 Mistress Card
-4133 Raydric Card
-4134 Dracula Card
-4135 Orc Lord Card
-4136 Khalitzburg Card
-4137 Drake Card
-4138 Anubis Card
-4139 Joker Card
-4140 Knight Of Abyss Card
-4141 Evil Druid Card
-4142 Doppelganger Card
-4143 Orc Hero Card
-4144 Osiris Card
-4145 Berzebub Card
-4146 Maya Card
-4147 Baphomet Card
-4148 Pharaoh Card
-4149 Bon Gun Card
-4150 Orc Archer Card
-4151 Mimic Card
-4152 Wraith Card
-4153 Alarm Card
-4154 Arclouse Card
-4155 Rideword Card
-4156 Skel Prisoner Card
-4157 Zombie Prisoner Card
-4158 Dark Priest Card
-4159 Punk Card
-4160 Zherlthsh Card
-4161 Mysteltainn Card
-4162 Tirfing Card
-4163 Executioner Card
-4164 Anolian Card
-4165 Sting Card
-4166 Wander Man Card
-4167 Cramp Card
-4168 Filamentous Card
-4169 Brilight Card
-4170 Iron Fist Card
-4171 High Orc Card
-4172 Choco Card
-4173 Stem Worm Card
-4174 Penomena Card
-4175 Marin Card
-4176 Sasquatch Card
-4177 Antonio Card
-4178 Cruiser Card
-4179 Mystcase Card
-4180 Chepet Card
-4181 Knight Of Windstorm Card
-4182 Garm Card
-4183 Gargoyle Card
-4184 Raggler Card
-4185 Neraid Card
-4186 Pest Card
-4187 Injustice Card
-4188 Goblin Archer Card
-4189 Gryphon Card
-4190 Dark Frame Card
-4191 Wind Ghost Card
-4192 Merman Card
-4193 Cookie Card
-4194 Aster Card
-4195 Carat Card
-4196 Bloody Knight Card
-4197 Clock Card
-4198 C Tower Manager Card
-4199 Alligator Card
-4200 Dark Lord Card
-4201 Orc Lady Card
-4202 Megalith Card
-4203 Alice Card
-4204 Raydric Archer Card
-4205 Greatest General Card
-4206 Stalactic Golem Card
-4207 Tri Joint Card
-4208 Steam Goblin Card
-4209 Sage Worm Card
-4210 Kobold archer Card
-4211 Chimera Card
-5001 Headset
-5002 Jewel Crown
-5003 Joker Jester
-5004 Oxygen Mask
-5005 Gas Mask
-5006 Machoman's Glasses
-5007 Grand Circlet
-5008 Puppy Love
-5009 Safety Helmet
-5010 Indian Fillet
-5011 Aerial
-5012 Ph.D Hat
-5013 Lord Kaho's Horn
-5014 Fin Helm
-5015 Egg Shell
-5016 Boys Cap
-5017 Bone Helm
-5018 Feather Bonnet
-5019 Corsair
-5020 Kafra Band
-5021 Money Loser's Grief
-5022 Solar God Helm
-5023 Parcel Hat
-5024 Cake Hat
-5025 Angel Helm
-5026 Chef's Hat
-5027 Magic Instructor's Hat
-5028 Candle
-5029 Spore Hat
-5030 Panda Cap
-5031 Miner's Helmet
-5032 Sunday Hat
-5033 Smokie Hat
-5034 Lightbulb Hairband
-5035 Poring hat
-5036 Cross Hairband
-5037 Apple Hat
-5038 Deviruchi Hat
-5039 Spotted Eggshell
-5040 Innocence of Maiden
-5041 Heart Hairpin
-5042 Dumpling Decoration
-5043 Opera Ghost Mask
-5044 Wing's of Demon
-5045 Magic Hat
-5046 Bongun hat
-5047 Fashion Sunglasses
-5048 Cresent Hairpin
-5049 Striped Bandana
-5050 Mysterious Apple Hat
-5051 Bell of Pussycat
-5052 Blue Bandana
-5053 Sphinx Hat
-5054 Assassin Mask
-5055 Novice Eggshell
-5056 ???
-7001 Mould Powder
-7002 Ogre Tooth
-7003 Anolian Skin
-7004 Mud Lump
-7005 Skull
-7006 Wing of Red Bat
-7007 Claw of Rat
-7008 Stiff Horn
-7009 Glitter Shell
-7010 Tail of Steel Scorpion
-7011 Claw of Monkey
-7012 Tough Scalelike Stem
-7013 Coral Reef
-7014 Old Portrait
-7015 Bookclip in Memory
-7016 Spoon Stub
-7017 Executioner's Mitten
-7018 Young Twig
-7019 Loki's Whispers
-7020 Mother's Nightmare
-7021 Foolishness of the Blind
-7022 Old Hilt
-7023 Blade Lost in Darkness
-7024 Bloody Edge
-7025 Lucifer's Lament
-7026 Key of Clock Tower
-7027 Key of Underground
-7028 Invite for Duel
-7029 Admission for Duel
-7030 Claw of Desert Wolf
-7031 Old Frying Fan
-7032 Piece of Egg Shell
-7033 Poison Spore
-7034 Red Socks with Holes
-7035 Matchstick
-7036 Fang of Garm
-7037 Coupon
-7038 Yarn
-7039 Novice Nametag
-7040 Megaphone
-7041 Fine Grit
-7042 Leather Bag of Infinity
-7043 Fine Sand
-7044 Vigorgra
-7045 Magic Paint
-7046 Cart Parts
-7047 Alice's Apron
-7048 Talon of Griffon
-7049 Stone
-7050 Cotton Mat
-7051 Silk Mat
-7052 Wasted Magazine
-7053 Cyfar
-7054 Brigan
-7055 Animal Poop
-7056 Payment Statement for Ka
-7057 Gallar Horn
-7058 Gullraifnir
-7059 Free Ticket for Kafra St
-7060 Free Ticket for Kafra Tr
-7061 Free Ticket for the Cart
-7062 Broken Turtle Shell
-7063 Soft Feather
-7064 Wing of Dragonfly
-7065 Sea Otter Fur
-7066 Ice Cubes
-7067 Piece of Rock
-7068 Half Burnt Log
-7069 Broken Armor Piece
-7070 Broken Shell
-7071 Tattered Clothes
-7072 Old Shuriken
-7073 Freyja's Jewel
-7074 Thor's Guntlet
-7075 Iron Maiden
-7076 Wheel of the Unknown
-7077 Silver Ornament
-7078 Wrath of Valkyrie
-7079 Feather of Angel Wing
-7080 Footprints of Cat
-7081 Woman's Moustache
-7082 Root of Stone
-7083 Spirit of Fish
-7084 Saliva of Bird
-7085 Tendon of Bear
-7086 Solar Bead
-7087 Breath of Soul
-7088 Snow Crystal
-7089 Omen of Tempest
-7090 Ripple
-7091 Billow
-7092 Drifting Air
-7093 Metal Wheel
-7094 Cabinet Chip
-7095 Tooth Fragment
-7096 Hardened Lava
-7097 Burning Heart
-7098 Fire Seed
-7099 Old Magical Circle
-7100 Sharpened Leaf
-7101 Peco's Feather
-7102 Nightmare
-7103 Yellwo Liquid Bottle
-7104 Imitation Angel's Wing
-7105 Imitation Soul's Band
-7106 Horn of Goat
-7107 Fur of Goat
-7108 Broken Shield
-7109 Shiny Spear Tip
-7110 Sharp Sword
-7111 String Paper
-7112 Transparent Paper
-7113 Onion Wand
-7114 Sphinx Mask
-7115 Blood Feather
-7116 Tooth of Lowblood
-7117 Torn Spell Book
-7118 Torn Scroll
-7119 Hypha Body
-7120 Burning Horseshoe
-7121 Honey Jar
-7122 Hot Feather
-7123 Dragon's Skin
-7124 Sand Lump
-7125 Crab Shot
-7126 Large Jellopy
-7127 Alcohol Making Book
-7128 Fire Bottle Making Book
-7129 Acid Bottle Making Book
-7130 Plant Bottle Making Book
-7131 Mine Bottle Making Book
-7132 Coating Wax Making Book
-7133 Slim Potion Making Book
-7134 Medicine Bowl
-7135 Fire Bottle
-7136 Hydrobolic Acid Bottle
-7137 Water Bottle
-7138 Mine Bottle
-7139 Coating Wax
-7140 Seed of Life
-7141 Water Flow
-7142 Ancient Life
-7143 Seperation Tubes
-7144 Potion Making Book
-7145 Ragnarok T-Shirt
-7146 Vacation Ticket
-7147 Jasmine
-7148 Mother's Letter
-7149 Yellow Plate
-7150 Bamboo Trunk
-7151 Oiled Paper
-7152 Glossy Hair
-7153 Old Kimono
-7154 Poison Powder
-7155 Poisonous Toad's Skin
-7156 Broken Shuriken
-7157 Black Mask
-7158 Broken Liquor Bottle
-7159 Demon's Nose
-7160 Passport From King
-7161 Skin of the Black Bear
-7162 Piece of Cloud
-7163 Hard Antennae
-7164 Very Hard Peach
-7165 Etherial Winged Clothing
-7166 Soft Silk Fabric
-7167 Strange Piece of Iron
-7168 Big Wing of Butterfly
-7169 Tae Guk Tablet
-7170 Tuxedo
-7171 Skin of Panther
-7172 Claw of Panther
-7173 Bun Buster Bag
-7174 Wrapping Thread
-7175 Wrapper
-7176 King's Proof Document
-7177 ?????_?????_????
-7178 ?????_?????
-7179 ????_???????
-7180 0
-7181 0
-7182 Cacao
-7183 ????
-7184 ??????
-7185 ??????
-7186 ???
-7187 ?????
-7188 ????
-7189 ????
-7190 ????
-7191 ?
-7192 ????
-7193 ?????
-7194 ????????
-7195 ????
-7196 ????
-7197 ????????
-7198 ??????
-7199 20
-7200 ???
-7201 ??
-7202 ????????
-7203 ?????
-7204 ??
-9001 Poring Egg
-9002 Drops Egg
-9003 Poporing Egg
-9004 Lunatic Egg
-9005 Picky Egg
-9006 Chonchon Egg
-9007 Steel Chonchon Egg
-9008 Hunter Fly Egg
-9009 Savage Babe Egg
-9010 Baby Desert Wolf Egg
-9011 Rocker Egg
-9012 Spore Egg
-9013 Poison Spore Egg
-9014 PecoPeco Egg
-9015 Smokie Egg
-9016 Yoyo Egg
-9017 Orc Warrior Egg
-9018 Munak Egg
-9019 Dokkaebi Egg
-9020 Sohee Egg
-9021 Isis Egg
-9022 Green Petite Egg
-9023 Deviruchi Egg
-9024 Bapho Jr. Egg
-9025 Bongun Egg
-9026 Alice Egg
-9027 Zherlthsh Egg
-9028 Test Egg
-9029 Test Egg
-10001 Skull Helm
-10002 Monster Oxygen Mask
-10003 Transparent Headgear
-10004 Pacifier
-10005 Wig
-10006 Queen's Hair Ornament
-10007 Silk Ribbon
-10008 Punisher
-10009 Wild Flower
-10010 Battered Pot
-10011 Stellar Hairpin
-10012 Tiny Egg Shell
-10013 Backpack
-10014 Rocker Glasses
-10015 Green Lace
-10016 Golden Bell
-10017 Bark Shorts
-10018 Monkey Circlet
-10019 Red Muffler
-10020 Sword of Chinese Exorcis
+ID Ename
+
+0 Default
+501 Red Potion
+502 Orange Potion
+503 Yellow Potion
+504 White Potion
+505 Blue Potion
+506 Green Potion
+507 Red Herb
+508 Yellow Herb
+509 White Herb
+510 Blue Herb
+511 Green Herb
+512 Apple
+513 Banana
+514 Grape
+515 Carrot
+516 Sweet Potato
+517 Meat
+518 Honey
+519 Milk
+520 Hinalle Leaflet
+521 Aloe Leaflet
+522 Mastela Fruit
+523 Holy Water
+525 Panacea
+526 Royal Jelly
+528 Monster's Feed
+529 Candy
+530 Candy Cane
+531 Apple Juice
+532 Banana Juice
+533 Grape Juice
+534 Carrot Juice
+535 Pumpkin
+536 Ice Cream
+537 Pet Food
+538 Well-baked Cookie
+539 Piece of Cake
+540 Falcon food
+541 Pecopeco food
+542 Festive Cookie
+543 Festive Rainbow Cake
+544 Raw Fish
+545 Red Potion Bottle
+546 Yellow Potion Bottle
+547 White Potion Bottle
+548 Cheese
+549 Hot Potato
+550 Rice Popper
+551 Sushi
+552 Ketupat
+553 Dumpling
+554 Mochi
+555 ??
+556 ??????
+557 ??????_???_??????
+558 Chocolate
+559 Hand-made Chocolate
+601 Fly Wing
+602 Butterfly Wing
+603 Old Blue Box
+604 Branch of Dead tree
+605 Anodyne
+606 Aloevera
+607 Yggdrasilberry
+608 Yggdrasil Seed
+609 Amulet
+610 Yggdrasil Leaf
+611 Magnifier
+612 Mini Furnace
+613 Iron Hammer
+614 Golden Hammer
+615 Oridecon Hammer
+616 Old Card Album
+617 Old Violet Box
+618 Worn Out Scroll
+619 Unripe Apple
+620 Orange Juice
+621 Bitter Herb
+622 Rainbow Carrot
+623 Earthworm the Dude
+624 Rotten Fish
+625 Rusty Iron
+626 Monster Juice
+627 Sweet Milk
+628 Well Dried Bone
+629 Singing Flower
+630 Dew Laden Moss
+631 Deadly Noxious Herb
+632 Fatty Chubby Earthworm
+633 Baked Yam
+634 Tropical Banana
+635 Horror of Tribe
+636 No Recipient
+637 Old Broom
+638 Silver Knife of Chastity
+639 Armlet of Obedience
+640 Shining Stone
+641 Contracts in Shadow
+642 Book of Devil
+643 Pet Incubator
+644 Gift Box
+645 Concentration Potion
+656 Awakening Potion
+657 Berserk Potion
+658 Tribal Solidarity
+659 Her Heart
+660 Red Candle
+661 Sky Apron
+663 Rice Cake
+664 Gift Box
+665 Gift Box
+666 Gift Box
+667 Gift Box
+668 Angpow
+669 ??????_??????_????
+670 ????
+671 ??
+672 ????
+673 ??
+674 ?????
+675 ??
+676 ????
+677 ???
+678 ??
+679 ???
+701 Ora Ora
+702 Animal Gore
+703 Hinalle
+704 Aloe
+705 Clover
+706 Four-Leaf Clover
+707 Singing Plant
+708 Ment
+709 Izidor
+710 Illusion Flower
+711 Shoot
+712 Flower
+713 Empty Bottle
+714 Emperium
+715 Yellow Gemstone
+716 Red Gemstone
+717 Blue Gemstone
+718 Garnet
+719 Amethyst
+720 Aquamarine
+721 Emerald
+722 Pearl
+723 Ruby
+724 Cursed Ruby
+725 Sardonyx
+726 Sapphire
+727 Opal
+728 Topaz
+729 Zircon
+730 1 Carat Diamond
+731 2 Carat Diamond
+732 3 Carat Diamond
+733 Cracked Diamond
+734 Red Frame
+735 Chung Jah
+736 China
+737 Black Ladle
+738 Pencil Case
+739 Rouge
+740 Puppet
+741 Poring Doll
+742 Chonchon Doll
+743 Spore Doll
+744 Bouquet
+745 Wedding Bouquet
+746 Glass Bead
+747 Crystal Mirror
+748 Witherless Rose
+749 Frozen Rose
+750 Baphomet Doll
+751 Osiris Doll
+752 Grasshopper Doll
+753 Yoyo Doll
+754 Raccoon Doll
+756 Rough Oridecon
+757 Rough Elunium
+901 Danggie
+902 Tree Root
+903 Reptile Tongue
+904 Scorpion Tail
+905 Stem
+906 Pointed Scale
+907 Resin
+908 Spawn
+909 Jellopy
+910 Garlet
+911 Scell
+912 Zargon
+913 Tooth of Bat
+914 Fluff
+915 Chrysalis
+916 Feather of Birds
+917 Talon
+918 Sticky Webfoot
+919 Animal Skin
+920 Wolf Claw
+921 Mushroom Spore
+922 Orc's Fang
+923 Evil Horn
+924 Powder of Butterfly
+925 Bill of Birds
+926 Snake Scale
+928 Insect Feeler
+929 Immortal Heart
+930 Rotten Bandage
+931 Orcish Voucher
+932 Skel-Bone
+934 Memento
+935 Shell
+936 Scale Shell
+937 Venom Canine
+938 Sticky Mucus
+939 Bee Sting
+940 Grasshopper's Leg
+941 Nose Ring
+942 Yoyo Tail
+943 Solid Shell
+944 Horseshoe
+945 Raccoon Leaf
+946 Snail's Shell
+947 Horn
+948 Bear's Footskin
+949 Feather
+950 Heart of Mermaid
+951 Fin
+952 Cactus Needle
+953 Stone Heart
+954 Shining Scale
+955 Worm Peeling
+956 Gill
+957 Decayed Nail
+958 Horrendous Mouth
+959 Stinky Scale
+960 Nipper
+961 Conch
+962 Tentacle
+963 Sharp scale
+964 Crap Shell
+965 Clam Shell
+966 Clam Flesh
+967 Turtle Shell
+968 Heroic Emblem
+969 Gold
+970 Alchol
+971 Detrimindexta
+972 Karvodailnirol
+973 Counteragent
+974 Mixture
+975 Scarlet Dyestuffs
+976 Lemon Dyestuffs
+978 Cobaltblue Dyestuffs
+979 Darkgreen Dyestuffs
+980 Orange Dyestuffs
+981 Violet Dyestuffs
+982 White Dyestuffs
+983 Black Dyestuffs
+984 Oridecon
+985 Elunium
+986 Anvil
+987 Oridecon Anvil
+988 Golden Anvil
+989 Emperium Anvil
+990 Red Blood
+991 Crystal Blue
+992 Wind of Verdure
+993 Green Live
+994 Flame Heart
+995 Mystic Frozen
+996 Rough Wind
+997 Great Nature
+998 Iron
+999 Steel
+1000 Star Crumb
+1001 Star Dust
+1002 Iron Ore
+1003 Coal
+1004 Chivalry Emblem
+1005 Hammer of Blacksmith
+1006 Old Magic Book
+1007 Necklace of Wisdom
+1008 Necklace of Oblivion
+1009 Hand of God
+1010 Phracon
+1011 Emveretarcon
+1012 Frill
+1013 Rainbow Shell
+1014 Ant Jaw
+1015 Tongue
+1016 Rat Tail
+1017 Mole Whiskers
+1018 Mole Claw
+1019 Trunk
+1020 Black Hair
+1021 Dokkaebi Horn
+1022 Nine Tails
+1023 Fish Tail
+1024 Squid ink
+1025 Cobweb
+1026 Acorn
+1027 Porcupine Quill
+1028 Mane
+1029 Tiger Skin
+1030 Tiger's Footskin
+1031 Mantis Scythe
+1032 Maneater Blossom
+1033 Maneater Root
+1034 Blue Hair
+1035 Dragon Canine
+1036 Dragon Scale
+1037 Dragon Tail
+1038 Little Evil Horn
+1039 Little Evil Wing
+1040 Elder Pixie's Moustache
+1041 Lantern
+1042 Bug Leg
+1043 Orc Claw
+1044 Zenorc's Fang
+1045 Cultish Masque
+1046 Scorpion Nipper
+1047 Dead Medusa
+1048 Horrendous Hair
+1049 Skirt of Virgin
+1050 Tendon
+1051 Detonator
+1052 Single Cell
+1053 Ancient Tooth
+1054 Ancient Lips
+1055 Earthworm Peeling
+1056 Grit
+1057 Moth Dust
+1058 Moth Wings
+1059 Fabric
+1060 Golden Hair
+1061 Witched Starsand
+1062 Jack o' Pumpkin
+1063 Fang
+1064 Reins
+1065 Trap
+1066 Fine-grained Trunk
+1067 Solid Trunk
+1068 Barren Trunk
+1069 Orange Net Mushroom
+1070 Orange Gooey Mushroom
+1071 Unknown Testtube
+1072 DEL Message
+1073 Voucher
+1074 Voucher
+1075 Voucher
+1076 Voucher
+1077 Voucher
+1078 Voucher
+1079 Voucher
+1080 Voucher
+1081 DEL Box
+1082 DEL Box
+1083 DEL Box
+1084 Kapra Pass
+1085 Unknown Testtube
+1086 Unknown Testtube
+1087 Unknown Testtube
+1088 Morocc Solution
+1089 Payon Solution
+1090 Unknown Testtube
+1091 DEL Box
+1092 Empty Testtube
+1093 Empty Potion Bottle
+1094 Short Daenggie
+1095 Needle of Alarm
+1096 Round Shell
+1097 Worn Out Page
+1098 Manacles
+1099 Worn-out Prison Uniform
+1101 Sword
+1102 Sword
+1103 Sword
+1104 Falchion
+1105 Falchion
+1106 Falchion
+1107 Blade
+1108 Blade
+1109 Blade
+1110 Rapier
+1111 Rapier
+1112 Rapier
+1113 Scimiter
+1114 Scimiter
+1115 Scimiter
+1116 Katana
+1117 Katana
+1118 Katana
+1119 Tsurugi
+1120 Tsurugi
+1121 Tsurugi
+1122 Ring Pommel Saber
+1123 Haedonggum
+1124 Orcish sword
+1125 Ring Pommel Saber
+1126 Saber
+1127 Saber
+1128 Haedonggum
+1129 Flamberge
+1130 Nagan
+1131 Ice Falchon
+1132 Edge
+1133 Fire Brand
+1134 Caesar's Sword
+1135 Cutlas
+1136 Solar Sword
+1137 Excalibur
+1138 Mysteltainn
+1139 Talefing
+1140 Byeollungum
+1141 Immaterial Sword
+1142 Crystal Sword
+1143 Gaia Sword
+1144 Sashimi
+1145 Holy Avenger
+1151 Slayer
+1152 Slayer
+1153 Slayer
+1154 Bastard Sword
+1155 Bastard Sword
+1156 Bastard Sword
+1157 Two-handed Sword
+1158 Two-handed Sword
+1159 Two-handed Sword
+1160 Broad Sword
+1161 Balmung
+1162 Broad Sword
+1163 Claymore
+1164 Muramasa
+1165 Masamune
+bonus bStr
+bonus bAspd
+bonus bDefRate
+bonus bDef2Rate
+ }
+1166 Dragon Slayer
+1167 Schweizersabel
+1168 Zweihander
+1169 Executioner
+1170 Katzbalger
+1201 Knife
+1202 Knife
+1203 Knife
+1204 Cutter
+1205 Cutter
+1206 Cutter
+1207 Main Gauche
+1208 Main Gauche
+1209 Main Gauche
+1210 Dirk
+1211 Dirk
+1212 Dirk
+1213 Dagger
+1214 Dagger
+1215 Dagger
+1216 Stiletto
+1217 Stiletto
+1218 Stiletto
+1219 Gladius
+1220 Gladius
+1221 Gladius
+1222 Damascus
+1223 Fortune Sword
+1224 Swordbreaker
+1225 Mailbreaker
+1226 Damascus
+1227 Weeder Knife
+1228 Combat Knife
+1229 Mama's Knife
+1230 House Auger
+1231 Bazerald
+1232 Assasin Dagger
+1233 Excorcise
+1234 Walgwanggum
+1235 Azoth
+1236 Sucsamad
+1237 Grimtooth
+1238 Zeny Knife
+1239 Poison Knife
+1240 Princess Knife
+1241 Cursed Knife
+1242 Counter Knife
+1243 Novice's Main Gauche
+1250 Jur
+1251 Jur
+1252 Katar
+1253 Katar
+1254 Jamadhar
+1255 Jamadhar
+1256 Katar of Cold Icicle
+1257 Katar of Dusty Thornbush
+1258 Katar of Raging Blaze
+1259 Katar of Piercing Wind
+1260 Sharppened Legbone of Gh
+1261 Infiltrator
+1301 Axe
+1302 Axe
+1303 Axe
+1304 Orcish Axe
+1305 Cleaver
+1306 War Axe
+1351 Battle Axe
+1352 Battle Axe
+1353 Battle Axe
+1354 Hammer
+1355 Hammer
+1356 Hammer
+1357 Buster
+1358 Buster
+1359 Buster
+1360 Two-handed Axe
+1361 Two-handed Axe
+1362 Two-handed Axe
+1363 Bloody Axe
+1364 Great Axe
+1365 Sabbath
+1366 Light Epsilon
+1367 Slaughter
+1368 Tomahawk
+1369 Guillotine
+1401 Javelin
+1402 Javelin
+1403 Javelin
+1404 Spear
+1405 Spear
+1406 Spear
+1407 Pike
+1408 Pike
+1409 Pike
+1410 Lance
+1411 Lance
+1412 Lance
+1413 Gungnir
+1414 Gelerdria
+1415 Brocca
+1416 Tjungkuletti
+1417 Pole Axe
+1451 Guisarme
+1452 Guisarme
+1453 Guisarme
+1454 Glaive
+1455 Glaive
+1456 Glaive
+1457 Partizan
+1458 Partizan
+1459 Partizan
+1460 Trident
+1461 Trident
+1462 Trident
+1463 Halberd
+1464 Halberd
+1465 Halberd
+1466 Crescent Scythe
+1467 Bill Guisarme
+1468 Zephyrus
+1469 Longinus's Spear
+1470 Brionac
+1471 Hellfire
+1472 Soul Staff
+1473 Wizardy staff
+1501 Club
+1502 Club
+1503 Club
+1504 Mace
+1505 Mace
+1506 Mace
+1507 Smasher
+1508 Smasher
+1509 Smasher
+1510 Flail
+1511 Flail
+1512 Flail
+1513 Morning Star
+1514 Morning Star
+1515 Morning Star
+1516 Sword Mace
+1517 Sword Mace
+1518 Sword Mace
+1519 Chain
+1520 Chain
+1521 Chain
+1522 Stunner
+1523 Spike
+1524 Golden Mace
+1525 Long Mace
+1526 Slash
+1527 Quadrille
+1528 Grand Cross
+1529 Iron Driver
+1530 Mjollnir
+1531 Spanner
+1550 Book
+1551 Bible
+1552 Tablet
+1553 Book of Billows
+1554 Book of Mother Earth
+1555 Book of Blazing Sun
+1556 Book of Gust of Wind
+1557 Book of the Apocalypse
+1558 Girl's Diary
+1599 Angra Manyu
+1601 Rod
+1602 Rod
+1603 Rod
+1604 Wand
+1605 Wand
+1606 Wand
+1607 Staff
+1608 Staff
+1609 Staff
+1610 Arc Wand
+1611 Arc Wand
+1612 Arc Wand
+1613 Mighty Staff
+1614 Wand of Occult
+1615 Bone Wand
+1701 Bow
+1702 Bow
+1703 Bow
+1704 Composite Bow
+1705 Composite Bow
+1706 Composite Bow
+1707 Great Bow
+1708 Great Bow
+1709 Great Bow
+1710 Cross Bow
+1711 Cross Bow
+1712 Cross Bow
+1713 Arbalest
+1714 Gakkung
+1715 Arbalest
+1716 Gakkung
+1718 Hunter Bow
+1719 Roguemaster's Bow
+1720 Rudra's Bow
+1721 Repeating Crossbow
+1722 Ballista
+1750 Arrow
+1751 Silver Arrow
+1752 Fire Arrow
+1753 Steel Arrow
+1754 Crystal Arrow
+1755 Arrow of Wind
+1756 Stone Arrow
+1757 Immaterial Arrow
+1758 Stun Arrow
+1759 Freeze Arrow
+1760 Flash Arrow
+1761 Curse Arrow
+1762 Rusted Arrow
+1763 Poison Arrow
+1764 Sharp Arrow
+1765 Oridecon Arrow
+1766 Arrow of Counter Evil
+1767 Shadow Arrow
+1768 Sleep Arrow
+1769 Mute Arrow
+1770 Iron Arrow
+1801 Waghnakh
+1802 Waghnakh
+1803 Knuckle Duster
+1804 Knuckle Duster
+1805 Hora
+1806 Hora
+1807 Fist
+1808 Fist
+1809 Claw
+1810 Claw
+1811 Finger
+1812 Finger
+1813 Kaiser Knuckle
+1814 Berserk
+1901 Violin
+1902 Violin
+1903 Mandolin
+1904 Mandolin
+1905 Lute
+1906 Lute
+1907 Guitar
+1908 Guitar
+1909 Harp
+1910 Harp
+1911 Guhmoongoh
+1912 Guhmoongoh
+1950 Rope
+1951 Rope
+1952 Line
+1953 Line
+1954 Wire
+1955 Wire
+1956 Rante
+1957 Rante
+1958 Tail
+1959 Tail
+1960 Whip
+1961 Whip
+1962 Lariat
+1963 Rapture Rose
+1964 Chemeti
+2101 Guard
+2102 Guard
+2103 Buckler
+2104 Buckler
+2105 Shield
+2106 Shield
+2107 Mirror Shield
+2108 Mirror Shield
+2109 Book of Summoning
+2110 Holy Guard
+2111 Evangelist
+2112 Novice Guard
+2199 Ahura Mazda
+2201 Sunglasses
+2202 Sunglasses
+2203 Glasses
+2204 Glasses
+2205 Diver's Goggles
+2206 Wedding Veil
+2207 Fancy Flower
+2208 Ribbon
+2209 Ribbon
+2210 Hair Band
+2211 Bandana
+2212 Eye Patch
+2213 Kitty Band
+2214 Bunny Band
+2215 Flower Band
+2216 Biretta
+2217 Biretta
+2218 Flu Mask
+2219 Flu Mask
+2220 Hat
+2221 Hat
+2222 Turban
+2223 Turban
+2224 Goggle
+2225 Goggle
+2226 Cap
+2227 Cap
+2228 Helm
+2229 Helm
+2230 Gemmed Sallet
+2231 Gemmed Sallet
+2232 Circlet
+2233 Circlet
+2234 Tiara
+2235 Crown
+2236 Santa's Hat
+2237 Bandit Beard
+2238 Moustache
+2239 Single Glass
+2240 Beard
+2241 Granpa Beard
+2242 Purple Glasses
+2243 Geek Glasses
+2244 Big Ribbon
+2245 Sweet Gent
+2246 Golden Gear
+2247 Romantic Gent
+2248 Western Grace
+2249 Coronet
+2250 Cute Ribbon
+2251 Monk Hat
+2252 Wizard Hat
+2253 Sunflower
+2254 Angel Wing
+2255 Evil Wing
+2256 Majestic Goat
+2257 Snow Horn
+2258 Spiky Band
+2259 Mini Propeller
+2260 Mini Glasses
+2261 Army Cap
+2262 Pierrot Nose
+2263 Zoro Masque
+2264 Munak Hat
+2265 Ganster Mask
+2266 Iron Cane
+2267 Cigar
+2268 Pipe
+2269 Romantic Flower
+2270 Romantic Leaf
+2271 Jack a Dandy
+2272 Stop Post
+2273 Doctor Band
+2274 Ghost Bandana
+2275 Red Bandana
+2276 Eagle Eyes
+2277 Nurse Cap
+2278 Mr. Smile
+2279 Bomb Wick
+2280 Sakkat
+2281 Opera Masque
+2282 Heaven Ring
+2283 Ear Mufs
+2284 Antler
+2285 Apple o' Archer
+2286 Elven Ears
+2287 Pirate Bandana
+2288 Mr. Scream
+2289 Poo Poo Hat
+2290 Funeral Hat
+2291 Masquerade
+2292 Welding Mask
+2293 Pretend Murdered
+2294 Stellar
+2295 Blinker
+2296 Binoculars
+2297 Goblini Mask
+2298 Green Feeler
+2299 Orc Helm
+2301 Cotton Shirt
+2302 Cotton Shirt
+2303 Leather Jacket
+2304 Leather Jacket
+2305 Adventurer's Suit
+2306 Adventurer's Suit
+2307 Mantle
+2308 Mantle
+2309 Coat
+2310 Coat
+2311 Mink Coat
+2312 Padded Armor
+2313 Padded Armor
+2314 Chain Mail
+2315 Chain Mail
+2316 Full Plate
+2317 Full Plate
+2318 Lord's Clothes
+2319 Glittering Jacket
+2320 Formal Suit
+2321 Silk Robe
+2322 Silk Robe
+2323 Scapulare
+2324 Scapulare
+2325 Saint's Robe
+2326 Saint's Robe
+2327 Holy Robe
+2328 Wooden Mail
+2329 Wooden Mail
+2330 Tights
+2331 Tights
+2332 Silver Robe
+2333 Silver Robe
+2334 Mage Coat
+2335 Thief Clothes
+2336 Thief Clothes
+2337 Ninja Suit
+2338 Wedding Dress
+2339 Pantie
+2340 Novice Breastplate
+2341 Full Plate Armor
+2342 Full Plate Armor
+2343 Casting Robe
+2344 Fire Armor
+2345 Fire Armor
+2346 Water Armor
+2347 Water Armor
+2348 Wind Armor
+2349 Wind Armor
+2350 Earth Armor
+2351 Earth Armor
+2352 Novice Armor
+2401 Sandals
+2402 Sandals
+2403 Shoes
+2404 Shoes
+2405 Boots
+2406 Boots
+2407 Crystal Pumps
+2408 Ball'n'Chain
+2409 Highheals
+2410 Sleipnir
+2411 Greaves
+2412 Greaves
+2413 Safety Shoes
+2414 Novice Sandal
+2501 Hood
+2502 Hood
+2503 Muffler
+2504 Muffler
+2505 Manteau
+2506 Manteau
+2507 Cape of Old Marquess
+2508 Ragamuffin Manteau
+2509 Manteau of Life
+2510 Novice Hood
+2601 Ring
+2602 Earring
+2603 Necklace
+2604 Glove
+2605 Brooch
+2607 Clip
+2608 Rosary
+2609 Skull Ring
+2610 Gold Ring
+2611 Silver Ring
+2612 Flower Ring
+2613 Diamond Ring
+2614 Eye of Dullahan
+2615 Safety Ring
+2616 Critical Ring
+2617 Celebrant's Mitten
+2618 Matyr's Leash
+2619 Bow Thimble
+2620 Rogue's Treasure
+2621 Ancient Ring
+2622 Ancient Earring
+2623 Ancient Necklace
+2624 Ancient Glove
+2625 Ancient Brooch
+2626 Ancient Rosary
+2627 Ancient Belt
+2628 Novice Armlet
+2629 Magingiorde
+2630 Brysinggamen
+2631 Pebble Ring
+2634 Wedding Ring
+2635 Wedding Ring
+2636 Gold Christmas Ring
+2637 Silver Christmas Ring
+4001 Poring Card
+4002 Fabre Card
+4003 Pupa Card
+4004 Drops Card
+4005 Poring Card
+4006 Lunatic Card
+4007 Pecopeco Egg Card
+4008 Picky Card
+4009 Chonchon Card
+4010 Wilow Card
+4011 Picky Card
+4012 Thief Bug Egg Card
+4013 Andre Egg Card
+4014 Roda Frog Card
+4015 Condor Card
+4016 Thief Bug Card
+4017 Savage Babe Card
+4018 Andre Larva Card
+4019 Hornet Card
+4020 Farmiliar Card
+4021 Rocker Card
+4022 Spore Card
+4023 Desert Wolf Babe Card
+4024 Plankton Card
+4025 Skeleton Card
+4026 Thief bug Female Card
+4027 Kukre Card
+4028 Tarou Card
+4029 Wolf Card
+4030 Mandragora Card
+4031 Pecopeco Card
+4032 Ambernite Card
+4033 Poporing Card
+4034 Worm Tail Card
+4035 Hydra Card
+4036 Muka Card
+4037 Snake Card
+4038 Zombie Card
+4039 Stainer Card
+4040 Creamy Card
+4041 Coco Card
+4042 Steel Chonchon Card
+4043 Andre Card
+4044 Smokie Card
+4045 Horn Card
+4046 Martin Card
+4047 Ghostring Card
+4048 Poison Spore Card
+4049 Vadon Card
+4050 Thief bug Male Card
+4051 Yoyo Card
+4052 Elder Wilow Card
+4053 Vitata Card
+4054 Angeling Card
+4055 Marina Card
+4056 Dustiness Card
+4057 Metaller Card
+4058 Thara Frog Card
+4059 Soldier Andre Card
+4060 Goblin Card
+4061 Cornutus Card
+4062 Anacondaq Card
+4063 Caramel Card
+4064 Zerom Card
+4065 Kaho Card
+4066 Orc Warrior Card
+4067 Megalodon Card
+4068 Scorpion Card
+4069 Drainliar Card
+4070 Eggyra Card
+4071 Orc Zombie Card
+4072 Golem Card
+4073 Pirate Skeleton Card
+4074 BigFoot Card
+4075 Argos Card
+4076 Magnolia Card
+4077 Phen Card
+4078 Savage Card
+4079 Mantis Card
+4080 Flora Card
+4081 Hode Card
+4082 Desert Wolf Card
+4083 Rafflesia Card
+4084 Marine Sphere Card
+4085 Orc Skeleton Card
+4086 Soldier Skeleton Card
+4087 Giearth Card
+4088 Frilldora Card
+4089 Swordfish Card
+4090 Munak Card
+4091 Kobold Card
+4092 Skel Worker Card
+4093 Obeaune Card
+4094 Archer Skeleton Card
+4095 Marse Card
+4096 Zenorc Card
+4097 Matyr Card
+4098 Dokebi Card
+4099 Pasana Card
+4100 Sohee Card
+4101 Sandman Card
+4102 Whisper Card
+4103 Horong Card
+4104 Requiem Card
+4105 Marc Card
+4106 Mummy Card
+4107 Verit Card
+4108 Myst Card
+4109 Jakk Card
+4110 Ghoul Card
+4111 Strouf Card
+4112 Marduk Card
+4113 Marionette Card
+4114 Argiope Card
+4115 Hunter Fly Card
+4116 Isis Card
+4117 Sidewinder Card
+4118 Petit Card
+4119 Bathory Card
+4120 Petit Card
+4121 Phreeoni Card
+4122 Deviruchi Card
+4123 Eddga Card
+4124 Medusa Card
+4125 Deviace Card
+4126 Minorous Card
+4127 Nightmare Card
+4128 Golden Bug Card
+4129 Baphomet Card
+4130 Scorpion King Card
+4131 Moonlight Flower Card
+4132 Mistress Card
+4133 Raydric Card
+4134 Dracula Card
+4135 Orc Lord Card
+4136 Khalitzburg Card
+4137 Drake Card
+4138 Anubis Card
+4139 Joker Card
+4140 Knight Of Abyss Card
+4141 Evil Druid Card
+4142 Doppelganger Card
+4143 Orc Hero Card
+4144 Osiris Card
+4145 Berzebub Card
+4146 Maya Card
+4147 Baphomet Card
+4148 Pharaoh Card
+4149 Bon Gun Card
+4150 Orc Archer Card
+4151 Mimic Card
+4152 Wraith Card
+4153 Alarm Card
+4154 Arclouse Card
+4155 Rideword Card
+4156 Skel Prisoner Card
+4157 Zombie Prisoner Card
+4158 Dark Priest Card
+4159 Punk Card
+4160 Zherlthsh Card
+4161 Mysteltainn Card
+4162 Tirfing Card
+4163 Executioner Card
+4164 Anolian Card
+4165 Sting Card
+4166 Wander Man Card
+4167 Cramp Card
+4168 Filamentous Card
+4169 Brilight Card
+4170 Iron Fist Card
+4171 High Orc Card
+4172 Choco Card
+4173 Stem Worm Card
+4174 Penomena Card
+4175 Marin Card
+4176 Sasquatch Card
+4177 Antonio Card
+4178 Cruiser Card
+4179 Mystcase Card
+4180 Chepet Card
+4181 Knight Of Windstorm Card
+4182 Garm Card
+4183 Gargoyle Card
+4184 Raggler Card
+4185 Neraid Card
+4186 Pest Card
+4187 Injustice Card
+4188 Goblin Archer Card
+4189 Gryphon Card
+4190 Dark Frame Card
+4191 Wind Ghost Card
+4192 Merman Card
+4193 Cookie Card
+4194 Aster Card
+4195 Carat Card
+4196 Bloody Knight Card
+4197 Clock Card
+4198 C Tower Manager Card
+4199 Alligator Card
+4200 Dark Lord Card
+4201 Orc Lady Card
+4202 Megalith Card
+4203 Alice Card
+4204 Raydric Archer Card
+4205 Greatest General Card
+4206 Stalactic Golem Card
+4207 Tri Joint Card
+4208 Steam Goblin Card
+4209 Sage Worm Card
+4210 Kobold archer Card
+4211 Chimera Card
+5001 Headset
+5002 Jewel Crown
+5003 Joker Jester
+5004 Oxygen Mask
+5005 Gas Mask
+5006 Machoman's Glasses
+5007 Grand Circlet
+5008 Puppy Love
+5009 Safety Helmet
+5010 Indian Fillet
+5011 Aerial
+5012 Ph.D Hat
+5013 Lord Kaho's Horn
+5014 Fin Helm
+5015 Egg Shell
+5016 Boys Cap
+5017 Bone Helm
+5018 Feather Bonnet
+5019 Corsair
+5020 Kafra Band
+5021 Money Loser's Grief
+5022 Solar God Helm
+5023 Parcel Hat
+5024 Cake Hat
+5025 Angel Helm
+5026 Chef's Hat
+5027 Magic Instructor's Hat
+5028 Candle
+5029 Spore Hat
+5030 Panda Cap
+5031 Miner's Helmet
+5032 Sunday Hat
+5033 Smokie Hat
+5034 Lightbulb Hairband
+5035 Poring hat
+5036 Cross Hairband
+5037 Apple Hat
+5038 Deviruchi Hat
+5039 Spotted Eggshell
+5040 Innocence of Maiden
+5041 Heart Hairpin
+5042 Dumpling Decoration
+5043 Opera Ghost Mask
+5044 Wing's of Demon
+5045 Magic Hat
+5046 Bongun hat
+5047 Fashion Sunglasses
+5048 Cresent Hairpin
+5049 Striped Bandana
+5050 Mysterious Apple Hat
+5051 Bell of Pussycat
+5052 Blue Bandana
+5053 Sphinx Hat
+5054 Assassin Mask
+5055 Novice Eggshell
+5056 ???
+7001 Mould Powder
+7002 Ogre Tooth
+7003 Anolian Skin
+7004 Mud Lump
+7005 Skull
+7006 Wing of Red Bat
+7007 Claw of Rat
+7008 Stiff Horn
+7009 Glitter Shell
+7010 Tail of Steel Scorpion
+7011 Claw of Monkey
+7012 Tough Scalelike Stem
+7013 Coral Reef
+7014 Old Portrait
+7015 Bookclip in Memory
+7016 Spoon Stub
+7017 Executioner's Mitten
+7018 Young Twig
+7019 Loki's Whispers
+7020 Mother's Nightmare
+7021 Foolishness of the Blind
+7022 Old Hilt
+7023 Blade Lost in Darkness
+7024 Bloody Edge
+7025 Lucifer's Lament
+7026 Key of Clock Tower
+7027 Key of Underground
+7028 Invite for Duel
+7029 Admission for Duel
+7030 Claw of Desert Wolf
+7031 Old Frying Fan
+7032 Piece of Egg Shell
+7033 Poison Spore
+7034 Red Socks with Holes
+7035 Matchstick
+7036 Fang of Garm
+7037 Coupon
+7038 Yarn
+7039 Novice Nametag
+7040 Megaphone
+7041 Fine Grit
+7042 Leather Bag of Infinity
+7043 Fine Sand
+7044 Vigorgra
+7045 Magic Paint
+7046 Cart Parts
+7047 Alice's Apron
+7048 Talon of Griffon
+7049 Stone
+7050 Cotton Mat
+7051 Silk Mat
+7052 Wasted Magazine
+7053 Cyfar
+7054 Brigan
+7055 Animal Poop
+7056 Payment Statement for Ka
+7057 Gallar Horn
+7058 Gullraifnir
+7059 Free Ticket for Kafra St
+7060 Free Ticket for Kafra Tr
+7061 Free Ticket for the Cart
+7062 Broken Turtle Shell
+7063 Soft Feather
+7064 Wing of Dragonfly
+7065 Sea Otter Fur
+7066 Ice Cubes
+7067 Piece of Rock
+7068 Half Burnt Log
+7069 Broken Armor Piece
+7070 Broken Shell
+7071 Tattered Clothes
+7072 Old Shuriken
+7073 Freyja's Jewel
+7074 Thor's Guntlet
+7075 Iron Maiden
+7076 Wheel of the Unknown
+7077 Silver Ornament
+7078 Wrath of Valkyrie
+7079 Feather of Angel Wing
+7080 Footprints of Cat
+7081 Woman's Moustache
+7082 Root of Stone
+7083 Spirit of Fish
+7084 Saliva of Bird
+7085 Tendon of Bear
+7086 Solar Bead
+7087 Breath of Soul
+7088 Snow Crystal
+7089 Omen of Tempest
+7090 Ripple
+7091 Billow
+7092 Drifting Air
+7093 Metal Wheel
+7094 Cabinet Chip
+7095 Tooth Fragment
+7096 Hardened Lava
+7097 Burning Heart
+7098 Fire Seed
+7099 Old Magical Circle
+7100 Sharpened Leaf
+7101 Peco's Feather
+7102 Nightmare
+7103 Yellwo Liquid Bottle
+7104 Imitation Angel's Wing
+7105 Imitation Soul's Band
+7106 Horn of Goat
+7107 Fur of Goat
+7108 Broken Shield
+7109 Shiny Spear Tip
+7110 Sharp Sword
+7111 String Paper
+7112 Transparent Paper
+7113 Onion Wand
+7114 Sphinx Mask
+7115 Blood Feather
+7116 Tooth of Lowblood
+7117 Torn Spell Book
+7118 Torn Scroll
+7119 Hypha Body
+7120 Burning Horseshoe
+7121 Honey Jar
+7122 Hot Feather
+7123 Dragon's Skin
+7124 Sand Lump
+7125 Crab Shot
+7126 Large Jellopy
+7127 Alcohol Making Book
+7128 Fire Bottle Making Book
+7129 Acid Bottle Making Book
+7130 Plant Bottle Making Book
+7131 Mine Bottle Making Book
+7132 Coating Wax Making Book
+7133 Slim Potion Making Book
+7134 Medicine Bowl
+7135 Fire Bottle
+7136 Hydrobolic Acid Bottle
+7137 Water Bottle
+7138 Mine Bottle
+7139 Coating Wax
+7140 Seed of Life
+7141 Water Flow
+7142 Ancient Life
+7143 Seperation Tubes
+7144 Potion Making Book
+7145 Ragnarok T-Shirt
+7146 Vacation Ticket
+7147 Jasmine
+7148 Mother's Letter
+7149 Yellow Plate
+7150 Bamboo Trunk
+7151 Oiled Paper
+7152 Glossy Hair
+7153 Old Kimono
+7154 Poison Powder
+7155 Poisonous Toad's Skin
+7156 Broken Shuriken
+7157 Black Mask
+7158 Broken Liquor Bottle
+7159 Demon's Nose
+7160 Passport From King
+7161 Skin of the Black Bear
+7162 Piece of Cloud
+7163 Hard Antennae
+7164 Very Hard Peach
+7165 Etherial Winged Clothing
+7166 Soft Silk Fabric
+7167 Strange Piece of Iron
+7168 Big Wing of Butterfly
+7169 Tae Guk Tablet
+7170 Tuxedo
+7171 Skin of Panther
+7172 Claw of Panther
+7173 Bun Buster Bag
+7174 Wrapping Thread
+7175 Wrapper
+7176 King's Proof Document
+7177 ?????_?????_????
+7178 ?????_?????
+7179 ????_???????
+7180 0
+7181 0
+7182 Cacao
+7183 ????
+7184 ??????
+7185 ??????
+7186 ???
+7187 ?????
+7188 ????
+7189 ????
+7190 ????
+7191 ?
+7192 ????
+7193 ?????
+7194 ????????
+7195 ????
+7196 ????
+7197 ????????
+7198 ??????
+7199 20
+7200 ???
+7201 ??
+7202 ????????
+7203 ?????
+7204 ??
+9001 Poring Egg
+9002 Drops Egg
+9003 Poporing Egg
+9004 Lunatic Egg
+9005 Picky Egg
+9006 Chonchon Egg
+9007 Steel Chonchon Egg
+9008 Hunter Fly Egg
+9009 Savage Babe Egg
+9010 Baby Desert Wolf Egg
+9011 Rocker Egg
+9012 Spore Egg
+9013 Poison Spore Egg
+9014 PecoPeco Egg
+9015 Smokie Egg
+9016 Yoyo Egg
+9017 Orc Warrior Egg
+9018 Munak Egg
+9019 Dokkaebi Egg
+9020 Sohee Egg
+9021 Isis Egg
+9022 Green Petite Egg
+9023 Deviruchi Egg
+9024 Bapho Jr. Egg
+9025 Bongun Egg
+9026 Alice Egg
+9027 Zherlthsh Egg
+9028 Test Egg
+9029 Test Egg
+10001 Skull Helm
+10002 Monster Oxygen Mask
+10003 Transparent Headgear
+10004 Pacifier
+10005 Wig
+10006 Queen's Hair Ornament
+10007 Silk Ribbon
+10008 Punisher
+10009 Wild Flower
+10010 Battered Pot
+10011 Stellar Hairpin
+10012 Tiny Egg Shell
+10013 Backpack
+10014 Rocker Glasses
+10015 Green Lace
+10016 Golden Bell
+10017 Bark Shorts
+10018 Monkey Circlet
+10019 Red Muffler
+10020 Sword of Chinese Exorcis
diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt
index d0abbb8bf..30202ee2d 100644
--- a/doc/item_bonus.txt
+++ b/doc/item_bonus.txt
@@ -1,137 +1,137 @@
-skill n,x; skill n of level x
-
-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 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 bMdef,n; Magical defensive power + n
-bonus bDef,n; DEF + n
-bonus bHit,n; On-target hit power + n
-bonus bCritical,n; Critical + n
-bonus bCriticalRate,n; Critical ratio + n%
-bonus bFlee,n; Evasion power + n
-bonus bFlee2,n; Perfection evasion + n
-bonus bSpeed,n; Drift speed + n
-bonus bAspd,n; Attack speed + n
-bonus bSpeedRate,n; Drift speed + n% (just high ones application)
-bonus bAspdRate,n; Attack speed + n% (just high ones application)
-bonus bSpeedAddRate drift speed + n%
-bonus bAspdAddRate attack speed + n%
-bonus bAtkRange,n; Attack Range + n
-bonus bCastrate,n; Cast rate + n%
-bonus bUseSPrate,n; SP consumption + n%
-bonus bHPrecovRate,n; HP automatic recovery ratio + n% (you exclude the recovery with skill)
-bonus bSPrecovRate,n; SP automatic recovery ratio + n% (you exclude the recovery with skill)
-bonus bDoubleRate,n; attack probability n% (with weapon disregard just high ones application)
-bonus bDoubleAddRate,n; Double attack probability + n% (weapon disregard)
-bonus bPerfectHitRate,n; On-target impact attack probability n% (just high ones application)
-bonus bPerfectHitAddRate,n; On-target impact attack probability +n%
-bonus bGetZenyNum,n; When pushing down the monster with physical attack, rand () ゼニ of %n+1 is obtained, (as for n just high ones application)
-bonus bAddGetZenyNum,n; When pushing down 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; The damage of short-range attack n% reduction (magic and the trap, the é·¹ is excluded)
-bonus bLongAtkDef,n; damage of stand off attack n% reduction (magic and the trap, the é·¹ is excluded)
-bonus bMagicAtkDef the damage of magical attack n% reduction
-bonus bMiscAtkDef MISC attack (the trap and ?) the damage n% reduction
-
-bonus bIgnoreDefRace,n Defense disregard of enemy of n race
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than (normal monster) boss monster
-bonus bIgnoreDefEle,n; Defense disregard of enemy of n attribute
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus bIgnoreMDefRace n race the magical defensive power disregard damage
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus bIgnoreMDefEle n attribute the magical defensive power disregard damage
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus bDefRatioAtkRace,n; n race if defensive power is high the high extent big damage is given, (defense disregard)
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus bDefRatioAtkEle,n; n attribute if defensive power is high the high extent big damage is given, (defense disregard)
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus bAtkEle,n; Attack with element n
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus bDefEle,n; Guard against element n
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus bHitRate,n; on-target hit ratio +n%
-bonus bFleeRate,n; evasion ratio +n%
-bonus bFlee2Rate,n; complete evasion ratio +n%
-bonus bDefRate,n; earned-run average +n% (equipment)
-bonus bDef2Rate,n; earned-run average +n% (those due to vit)
-bonus bMdefRate,n; magical earned-run average +n% (equipment)
-bonus bMdef2Rate,n; magical earned-run average +n% (those due to int)
-bonus bSplashRange n; damage is given to the peripheral n cell of the target with usual weapon attack, if (as for n just high ones application, 1 if the 3*3, 2 the 5*5)
-bonus bSplashAddRange n; damage is given to the peripheral n cell of the target with usual weapon attack, (range + n)
-
-bonus bInfiniteEndure,n; Unlimited Endure (n is meaningless)
-bonus bRestartFullRecover,n; When reviving, HP and SP all recoveries (non mind there is no n)
-bonus bNoCastCancel,n; The casting is not cancelled (non mind there is no n)
-bonus bNoCastCancel2,n; The casting is not cancelled (is not cancelled even with GVG, n is meaningless)
-bonus bNoSizeFix,n; The attack revision with the size of the monster is not received, (non mind there is no n)
-bonus bNoWeaponDamage,n; The damage is not received to physical attack, (non mind there is no n)
-bonus bNoMagicDamage,n; The damage is not received to magic, (including also the heel, non mind there is no n)
-bonus bNoGemStone,n; When using skill, the gemstone is not consumed (non mind there is no n)
-
-
-bonus2 bAddEff,Eff_Blind,n; With the establishment of n% dark grant
-bonus2 bAddEff,Eff_Sleep,n; With the establishment of n% sleep grant
-bonus2 bAddEff,Eff_Poison,n; With the establishment of n% poison grant
-bonus2 bAddEff,Eff_Freeze,n; With the establishment of n% freezing grant
-bonus2 bAddEff,Eff_Silence,n; With the establishment of n% silence grant
-bonus2 bAddEff,Eff_Stan,n; With the establishment of n% stun grant
-bonus2 bAddEff,Eff_Curse,n; You curse with the establishment of n%, grant
-bonus2 bAddEff,Eff_Confusion,n; With the establishment of n% confusion grant
-bonus2 bAddEff,Eff_Stone,n; With the establishment of n% petrochemical grant
-
-bonus2 bResEff,Eff_Blind,n; Dark tolerance + n%
-bonus2 bResEff,Eff_Sleep,n; Sleep tolerance + n%
-bonus2 bResEff,Eff_Poison,n; Poison tolerance + n%
-bonus2 bResEff,Eff_Freeze,n; Freezing tolerance + n%
-bonus2 bResEff,Eff_Silence,n; Silence tolerance + n%
-bonus2 bResEff,Eff_Stan,n; Stun tolerance + n%
-bonus2 bResEff,Eff_Curse,n; Cursing tolerance + n%
-bonus2 bResEff,Eff_Confusion,n; Confusion tolerance + n%
-bonus2 bResEff,Eff_Stone,n; Petrochemical tolerance + n%
-
-bonus2 bAddSize,n,x; In n size the damage addition of x%
- 0,Small size 1,Medium size 2,Large size
-bonus2 bAddRace,n,x; In n race the damage addition of x%
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus2 bSubRace,n,x; Damage x% reduction from n race
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus2 bMagicAddRace,n,x; In n race the damage addition of x% (only magical attack)
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus2 bMagicSubRace,n,x; Magical damage x% reduction from n race
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus2 bAddEle,n,x; In n attribute the damage addition of x%
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus2 bMagicAddEle,n,x; In n attribute the damage addition of x% (only magical attack)
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-bonus2 bSubEle,n,x; Damage x% reduction from n attribute
- 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
-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 % probability -- x % -- HP -- absorption (+ n and x are carried out)
-bonus2 bSPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n % probability -- x % -- SP -- absorption (+ n and x are carried out)
-
-
-bonus3 bAddMonsterDropItem,n,x; When pushing down the monster with physical attack, the probability which drops item n +x% (the item which the monster drops unrelated ones)
- 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
-bonus3 bAutoSpell,n,x,y; Auto Spell casting of spell n at level x with y% 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.
+skill n,x; skill n of level x
+
+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 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 bMdef,n; Magical defensive power + n
+bonus bDef,n; DEF + n
+bonus bHit,n; On-target hit power + n
+bonus bCritical,n; Critical + n
+bonus bCriticalRate,n; Critical ratio + n%
+bonus bFlee,n; Evasion power + n
+bonus bFlee2,n; Perfection evasion + n
+bonus bSpeed,n; Drift speed + n
+bonus bAspd,n; Attack speed + n
+bonus bSpeedRate,n; Drift speed + n% (just high ones application)
+bonus bAspdRate,n; Attack speed + n% (just high ones application)
+bonus bSpeedAddRate drift speed + n%
+bonus bAspdAddRate attack speed + n%
+bonus bAtkRange,n; Attack Range + n
+bonus bCastrate,n; Cast rate + n%
+bonus bUseSPrate,n; SP consumption + n%
+bonus bHPrecovRate,n; HP automatic recovery ratio + n% (you exclude the recovery with skill)
+bonus bSPrecovRate,n; SP automatic recovery ratio + n% (you exclude the recovery with skill)
+bonus bDoubleRate,n; attack probability n% (with weapon disregard just high ones application)
+bonus bDoubleAddRate,n; Double attack probability + n% (weapon disregard)
+bonus bPerfectHitRate,n; On-target impact attack probability n% (just high ones application)
+bonus bPerfectHitAddRate,n; On-target impact attack probability +n%
+bonus bGetZenyNum,n; When pushing down the monster with physical attack, rand () ゼニ of %n+1 is obtained, (as for n just high ones application)
+bonus bAddGetZenyNum,n; When pushing down 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; The damage of short-range attack n% reduction (magic and the trap, the é·¹ is excluded)
+bonus bLongAtkDef,n; damage of stand off attack n% reduction (magic and the trap, the é·¹ is excluded)
+bonus bMagicAtkDef the damage of magical attack n% reduction
+bonus bMiscAtkDef MISC attack (the trap and ?) the damage n% reduction
+
+bonus bIgnoreDefRace,n Defense disregard of enemy of n race
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than (normal monster) boss monster
+bonus bIgnoreDefEle,n; Defense disregard of enemy of n attribute
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus bIgnoreMDefRace n race the magical defensive power disregard damage
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus bIgnoreMDefEle n attribute the magical defensive power disregard damage
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus bDefRatioAtkRace,n; n race if defensive power is high the high extent big damage is given, (defense disregard)
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus bDefRatioAtkEle,n; n attribute if defensive power is high the high extent big damage is given, (defense disregard)
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus bAtkEle,n; Attack with element n
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus bDefEle,n; Guard against element n
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus bHitRate,n; on-target hit ratio +n%
+bonus bFleeRate,n; evasion ratio +n%
+bonus bFlee2Rate,n; complete evasion ratio +n%
+bonus bDefRate,n; earned-run average +n% (equipment)
+bonus bDef2Rate,n; earned-run average +n% (those due to vit)
+bonus bMdefRate,n; magical earned-run average +n% (equipment)
+bonus bMdef2Rate,n; magical earned-run average +n% (those due to int)
+bonus bSplashRange n; damage is given to the peripheral n cell of the target with usual weapon attack, if (as for n just high ones application, 1 if the 3*3, 2 the 5*5)
+bonus bSplashAddRange n; damage is given to the peripheral n cell of the target with usual weapon attack, (range + n)
+
+bonus bInfiniteEndure,n; Unlimited Endure (n is meaningless)
+bonus bRestartFullRecover,n; When reviving, HP and SP all recoveries (non mind there is no n)
+bonus bNoCastCancel,n; The casting is not cancelled (non mind there is no n)
+bonus bNoCastCancel2,n; The casting is not cancelled (is not cancelled even with GVG, n is meaningless)
+bonus bNoSizeFix,n; The attack revision with the size of the monster is not received, (non mind there is no n)
+bonus bNoWeaponDamage,n; The damage is not received to physical attack, (non mind there is no n)
+bonus bNoMagicDamage,n; The damage is not received to magic, (including also the heel, non mind there is no n)
+bonus bNoGemStone,n; When using skill, the gemstone is not consumed (non mind there is no n)
+
+
+bonus2 bAddEff,Eff_Blind,n; With the establishment of n% dark grant
+bonus2 bAddEff,Eff_Sleep,n; With the establishment of n% sleep grant
+bonus2 bAddEff,Eff_Poison,n; With the establishment of n% poison grant
+bonus2 bAddEff,Eff_Freeze,n; With the establishment of n% freezing grant
+bonus2 bAddEff,Eff_Silence,n; With the establishment of n% silence grant
+bonus2 bAddEff,Eff_Stan,n; With the establishment of n% stun grant
+bonus2 bAddEff,Eff_Curse,n; You curse with the establishment of n%, grant
+bonus2 bAddEff,Eff_Confusion,n; With the establishment of n% confusion grant
+bonus2 bAddEff,Eff_Stone,n; With the establishment of n% petrochemical grant
+
+bonus2 bResEff,Eff_Blind,n; Dark tolerance + n%
+bonus2 bResEff,Eff_Sleep,n; Sleep tolerance + n%
+bonus2 bResEff,Eff_Poison,n; Poison tolerance + n%
+bonus2 bResEff,Eff_Freeze,n; Freezing tolerance + n%
+bonus2 bResEff,Eff_Silence,n; Silence tolerance + n%
+bonus2 bResEff,Eff_Stan,n; Stun tolerance + n%
+bonus2 bResEff,Eff_Curse,n; Cursing tolerance + n%
+bonus2 bResEff,Eff_Confusion,n; Confusion tolerance + n%
+bonus2 bResEff,Eff_Stone,n; Petrochemical tolerance + n%
+
+bonus2 bAddSize,n,x; In n size the damage addition of x%
+ 0,Small size 1,Medium size 2,Large size
+bonus2 bAddRace,n,x; In n race the damage addition of x%
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus2 bSubRace,n,x; Damage x% reduction from n race
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus2 bMagicAddRace,n,x; In n race the damage addition of x% (only magical attack)
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus2 bMagicSubRace,n,x; Magical damage x% reduction from n race
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus2 bAddEle,n,x; In n attribute the damage addition of x%
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus2 bMagicAddEle,n,x; In n attribute the damage addition of x% (only magical attack)
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+bonus2 bSubEle,n,x; Damage x% reduction from n attribute
+ 0,Nothing 1,Water 2,Earth 3,Fire 4,Wind 5,Poison 6,Saint 7,Darkness 8,Sense 9,Immortality
+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 % probability -- x % -- HP -- absorption (+ n and x are carried out)
+bonus2 bSPDrainRate,n,x; it obtained to the enemy -- ? ME ? JI -- n % probability -- x % -- SP -- absorption (+ n and x are carried out)
+
+
+bonus3 bAddMonsterDropItem,n,x; When pushing down the monster with physical attack, the probability which drops item n +x% (the item which the monster drops unrelated ones)
+ 0,Intangibility 1,Immortality 2,Animal 3,Plant 4,Insect 5,Fish and shellfish 6,Demon 7,Human 8,Angel 9,Dragon family 10:Boss monster 11:Other than boss monster (normal monster)
+bonus3 bAutoSpell,n,x,y; Auto Spell casting of spell n at level x with y% 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.
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/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/help.txt b/help.txt
index 5b63dcd58..ca2a9c3e5 100644
--- a/help.txt
+++ b/help.txt
@@ -1,396 +1,396 @@
- ______ __ __
- /\ _ \/\ \__/\ \
- __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
- /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
-/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
-\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
- \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
-
---------------------------------------------------------------
-GM COMMANDS
----------------------------------------------------------------------------------
-Note:
- To use these commands, type them inside the message window where you usually
- type to chat.
----------------------------------------------------------------------------------
-<> = type of parameter that the command need to have
-[] = optionnal parameter
----------------------------------------------------------------------------------
-
-@h/@help = display commands help inside the game.
-
-=================================================================================
-ANNOUNCEMENT COMMANDS
-=================================================================================
-/b/@broadcast <message> = Broadcasts a GM message with name of the GM
- (in yellow)
-/nb/@kami <message> = Broadcasts a GM message without name of the GM
- (in yellow)
-@kamib <message> = Broadcasts a GM message without name of the GM
- (in blue)
-/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 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.
-@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.
-@ignorelist = Displays your ignore list
-@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
-
-@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
-
-=================================================================================
-(YOURSELF-)CONTROL 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> <xpos> <ypos> = Warps you to the selected position
-/mapmove <map_name> <x> <y> = Warps you to the selected position
-@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
-
-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.
-
-OTHER COMMANDS
----------------
-/resetstatus = Resets all status points for you to reuse.
-/resetskill = Resets all skill points for you to reuse.
-@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.
-@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.
-@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,@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).
-@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)
-@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
-
-@changesex = Changes your sex to the opposite one.
-
-=================================================================================
-MONSTERS 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 "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>]]]
- = 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)
-
-=================================================================================
-ITEMS COMMANDS
-=================================================================================
-@storage = Opens storage
-@gstorage = Opens guild storage
-/item <item_name> = Gives you 1 of the desired item.
-@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
-
-=================================================================================
-PVP COMMANDS
-=================================================================================
-@pvpon = Turns pvp on on the current map
-@pvpoff = Turns pvp off on the current map
-@gvgon/@gpvpon = Turns gvg on on the current map
-@gvgoff/@gpvpoff = Turns gvg off on the current map
-@agitstart = Starts Guild Wars (War of Emperium)
-@agitend = End Guild Wars (War of Emperium)
-
-=================================================================================
-GROUPS 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.
-
-=================================================================================
-PETS 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 CHARACTERS 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.
-@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
-@charskreset <charname> = Reset skills of a character.
-@charstreset <charname> = Reset stats of a character.
-@charreset <charname> = Reset stats AND skills 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
-@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
-@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.
-
-=================================================================================
-ENVIRONMENT COMMANDS
-=================================================================================
-@night = Uses @option 00 16 00 on all characters. All characters are in darkness
-@day = Uses @option 00 00 00 on all characters.
-
-=================================================================================
-MAIL SYSTEM (SQL Only)
-=================================================================================
-@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.
-=================================================================================
-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)
-@enablenpc <NPC_name> - Enable a NPC (admin command)
-@disablenpc <NPC_name> - Disable a NPC (admin command)
-
-@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)
-
+ ______ __ __
+ /\ _ \/\ \__/\ \
+ __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+ /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+/\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+ \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+
+--------------------------------------------------------------
+GM COMMANDS
+---------------------------------------------------------------------------------
+Note:
+ To use these commands, type them inside the message window where you usually
+ type to chat.
+---------------------------------------------------------------------------------
+<> = type of parameter that the command need to have
+[] = optionnal parameter
+---------------------------------------------------------------------------------
+
+@h/@help = display commands help inside the game.
+
+=================================================================================
+ANNOUNCEMENT COMMANDS
+=================================================================================
+/b/@broadcast <message> = Broadcasts a GM message with name of the GM
+ (in yellow)
+/nb/@kami <message> = Broadcasts a GM message without name of the GM
+ (in yellow)
+@kamib <message> = Broadcasts a GM message without name of the GM
+ (in blue)
+/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 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.
+@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.
+@ignorelist = Displays your ignore list
+@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
+
+@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
+
+=================================================================================
+(YOURSELF-)CONTROL 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> <xpos> <ypos> = Warps you to the selected position
+/mapmove <map_name> <x> <y> = Warps you to the selected position
+@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
+
+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.
+
+OTHER COMMANDS
+---------------
+/resetstatus = Resets all status points for you to reuse.
+/resetskill = Resets all skill points for you to reuse.
+@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.
+@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.
+@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,@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).
+@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)
+@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
+
+@changesex = Changes your sex to the opposite one.
+
+=================================================================================
+MONSTERS 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 "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>]]]
+ = 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)
+
+=================================================================================
+ITEMS COMMANDS
+=================================================================================
+@storage = Opens storage
+@gstorage = Opens guild storage
+/item <item_name> = Gives you 1 of the desired item.
+@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
+
+=================================================================================
+PVP COMMANDS
+=================================================================================
+@pvpon = Turns pvp on on the current map
+@pvpoff = Turns pvp off on the current map
+@gvgon/@gpvpon = Turns gvg on on the current map
+@gvgoff/@gpvpoff = Turns gvg off on the current map
+@agitstart = Starts Guild Wars (War of Emperium)
+@agitend = End Guild Wars (War of Emperium)
+
+=================================================================================
+GROUPS 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.
+
+=================================================================================
+PETS 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 CHARACTERS 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.
+@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
+@charskreset <charname> = Reset skills of a character.
+@charstreset <charname> = Reset stats of a character.
+@charreset <charname> = Reset stats AND skills 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
+@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
+@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.
+
+=================================================================================
+ENVIRONMENT COMMANDS
+=================================================================================
+@night = Uses @option 00 16 00 on all characters. All characters are in darkness
+@day = Uses @option 00 00 00 on all characters.
+
+=================================================================================
+MAIL SYSTEM (SQL Only)
+=================================================================================
+@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.
+=================================================================================
+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)
+@enablenpc <NPC_name> - Enable a NPC (admin command)
+@disablenpc <NPC_name> - Disable a NPC (admin command)
+
+@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) \ No newline at end of file
diff --git a/log/char.log b/log/char.log
index 514ddc1f7..b041fe1a4 100644
--- a/log/char.log
+++ b/log/char.log
@@ -1,60 +1,60 @@
-
-11-11-2004 16:42:58.156: The char-server starting...
-11-11-2004 16:42:58.181: mmo_char_init: No character found in save/athena.txt.
-11-11-2004 16:42:58.181: Id for the next created character: 150000.
-11-11-2004 16:42:58.202: The char-server is ready (Server is listening on the port 6121).
-
-11-11-2004 16:43:41.281: The char-server starting...
-11-11-2004 16:43:41.292: mmo_char_init: No character found in save/athena.txt.
-11-11-2004 16:43:41.293: Id for the next created character: 150000.
-11-11-2004 16:43:41.296: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:43:42.305: From login-server: receiving of 0 GM accounts information.
-
-11-11-2004 16:44:28.609: The char-server starting...
-11-11-2004 16:44:28.618: mmo_char_init: No character found in save/athena.txt.
-11-11-2004 16:44:28.618: Id for the next created character: 150000.
-11-11-2004 16:44:28.621: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:44:29.630: From login-server: receiving of 1 GM accounts information.
-11-11-2004 16:45:27.935: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
-11-11-2004 16:46:40.227: Creation of New Character: (connection #7, account: 2000001) slot 0, character Name: cameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
-11-11-2004 16:46:40.809: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
-
-11-11-2004 16:47:21.312: The char-server starting...
-11-11-2004 16:47:21.321: mmo_char_init: 1 character read in save/athena.txt.
-11-11-2004 16:47:21.322: Id for the next created character: 150001.
-11-11-2004 16:47:21.325: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:47:22.333: From login-server: receiving of 1 GM accounts information.
-11-11-2004 16:47:34.440: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
-11-11-2004 16:47:45.542: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
-11-11-2004 16:47:48.775: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
-11-11-2004 16:48:03.312: ----End of char-server (normal end with closing of all files).
-
-11-11-2004 16:48:23.328: The char-server starting...
-11-11-2004 16:48:23.337: mmo_char_init: 1 character read in save/athena.txt.
-11-11-2004 16:48:23.337: Id for the next created character: 150001.
-11-11-2004 16:48:23.341: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:48:24.349: From login-server: receiving of 0 GM accounts information.
-11-11-2004 16:48:38.235: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
-11-11-2004 16:49:22.743: Make new char error (name already exists): (connection #7, account: 2000002) slot 0, name: Cameri (actual name of other char: 168109034), stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
-11-11-2004 16:49:26.808: Creation of New Character: (connection #7, account: 2000002) slot 0, character Name: Kameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
-11-11-2004 16:49:27.541: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: Kameri.
-11-11-2004 16:51:18.640: ----End of char-server (normal end with closing of all files).
-
-11-11-2004 16:51:26.109: The char-server starting...
-11-11-2004 16:51:26.118: mmo_char_init: 2 characters read in save/athena.txt.
-11-11-2004 16:51:26.120: Id for the next created character: 150002.
-11-11-2004 16:51:26.123: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:51:27.135: From login-server: receiving of 0 GM accounts information.
-11-11-2004 16:51:39.916: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
-11-11-2004 16:51:49.968: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: Kameri.
-11-11-2004 16:51:59.756: ----End of char-server (normal end with closing of all files).
-
-11-11-2004 16:52:16.546: The char-server starting...
-11-11-2004 16:52:16.560: mmo_char_init: No character found in save/athena.txt.
-11-11-2004 16:52:16.560: Id for the next created character: 150000.
-11-11-2004 16:52:16.563: The char-server is ready (Server is listening on the port 6121).
-11-11-2004 16:52:17.587: From login-server: receiving of 0 GM accounts information.
-11-11-2004 16:52:30.579: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
-11-11-2004 16:53:04.815: Creation of New Character: (connection #7, account: 2000002) slot 0, character Name: cameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
-11-11-2004 16:53:05.364: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: cameri.
-11-11-2004 16:53:11.582: ----End of char-server (normal end with closing of all files).
+
+11-11-2004 16:42:58.156: The char-server starting...
+11-11-2004 16:42:58.181: mmo_char_init: No character found in save/athena.txt.
+11-11-2004 16:42:58.181: Id for the next created character: 150000.
+11-11-2004 16:42:58.202: The char-server is ready (Server is listening on the port 6121).
+
+11-11-2004 16:43:41.281: The char-server starting...
+11-11-2004 16:43:41.292: mmo_char_init: No character found in save/athena.txt.
+11-11-2004 16:43:41.293: Id for the next created character: 150000.
+11-11-2004 16:43:41.296: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:43:42.305: From login-server: receiving of 0 GM accounts information.
+
+11-11-2004 16:44:28.609: The char-server starting...
+11-11-2004 16:44:28.618: mmo_char_init: No character found in save/athena.txt.
+11-11-2004 16:44:28.618: Id for the next created character: 150000.
+11-11-2004 16:44:28.621: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:44:29.630: From login-server: receiving of 1 GM accounts information.
+11-11-2004 16:45:27.935: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
+11-11-2004 16:46:40.227: Creation of New Character: (connection #7, account: 2000001) slot 0, character Name: cameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
+11-11-2004 16:46:40.809: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
+
+11-11-2004 16:47:21.312: The char-server starting...
+11-11-2004 16:47:21.321: mmo_char_init: 1 character read in save/athena.txt.
+11-11-2004 16:47:21.322: Id for the next created character: 150001.
+11-11-2004 16:47:21.325: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:47:22.333: From login-server: receiving of 1 GM accounts information.
+11-11-2004 16:47:34.440: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
+11-11-2004 16:47:45.542: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
+11-11-2004 16:47:48.775: Character Selected, Account ID: 2000001, Character Slot: 0, Character Name: cameri.
+11-11-2004 16:48:03.312: ----End of char-server (normal end with closing of all files).
+
+11-11-2004 16:48:23.328: The char-server starting...
+11-11-2004 16:48:23.337: mmo_char_init: 1 character read in save/athena.txt.
+11-11-2004 16:48:23.337: Id for the next created character: 150001.
+11-11-2004 16:48:23.341: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:48:24.349: From login-server: receiving of 0 GM accounts information.
+11-11-2004 16:48:38.235: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
+11-11-2004 16:49:22.743: Make new char error (name already exists): (connection #7, account: 2000002) slot 0, name: Cameri (actual name of other char: 168109034), stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
+11-11-2004 16:49:26.808: Creation of New Character: (connection #7, account: 2000002) slot 0, character Name: Kameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
+11-11-2004 16:49:27.541: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: Kameri.
+11-11-2004 16:51:18.640: ----End of char-server (normal end with closing of all files).
+
+11-11-2004 16:51:26.109: The char-server starting...
+11-11-2004 16:51:26.118: mmo_char_init: 2 characters read in save/athena.txt.
+11-11-2004 16:51:26.120: Id for the next created character: 150002.
+11-11-2004 16:51:26.123: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:51:27.135: From login-server: receiving of 0 GM accounts information.
+11-11-2004 16:51:39.916: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
+11-11-2004 16:51:49.968: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: Kameri.
+11-11-2004 16:51:59.756: ----End of char-server (normal end with closing of all files).
+
+11-11-2004 16:52:16.546: The char-server starting...
+11-11-2004 16:52:16.560: mmo_char_init: No character found in save/athena.txt.
+11-11-2004 16:52:16.560: Id for the next created character: 150000.
+11-11-2004 16:52:16.563: The char-server is ready (Server is listening on the port 6121).
+11-11-2004 16:52:17.587: From login-server: receiving of 0 GM accounts information.
+11-11-2004 16:52:30.579: Map-Server 0 connected: 422 maps, from IP 127.0.0.1 port 5121. Map-server 0 loading complete.
+11-11-2004 16:53:04.815: Creation of New Character: (connection #7, account: 2000002) slot 0, character Name: cameri, stats: 5+5+5+5+5+5=30, hair: 1, hair color: 0.
+11-11-2004 16:53:05.364: Character Selected, Account ID: 2000002, Character Slot: 0, Character Name: cameri.
+11-11-2004 16:53:11.582: ----End of char-server (normal end with closing of all files).
diff --git a/log/login.log b/log/login.log
index a76703cbc..858c1e4a4 100644
--- a/log/login.log
+++ b/log/login.log
@@ -1,245 +1,245 @@
-
-2004-11-11 16:42:57.500: The login-server starting...
-2004-11-11 16:42:57.574: The configuration of the server is set:
-2004-11-11 16:42:57.574: - with no remote administration.
-2004-11-11 16:42:57.574: - to accept any IP for remote administration
-2004-11-11 16:42:57.574: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:42:57.574: - to create GM with level '60' when @gm is used.
-2004-11-11 16:42:57.574: - to ALLOW new users (with _F/_M).
-2004-11-11 16:42:57.575: - with port: 6900.
-2004-11-11 16:42:57.575: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:42:57.575: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:42:57.575: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:42:57.575: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:42:57.576: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:42:57.576: - to NOT display normal parse packets on console.
-2004-11-11 16:42:57.576: - to NOT display administration parse packets on console.
-2004-11-11 16:42:57.576: - to NOT display char-server parse packets on console.
-2004-11-11 16:42:57.576: - with no minimum level for connection.
-2004-11-11 16:42:57.576: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:42:57.576: - to create new accounts with an unlimited time.
-2004-11-11 16:42:57.576: - with control of players IP between login-server and char-server.
-2004-11-11 16:42:57.576: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:42:57.594: The LAN configuration of the server is set:
-2004-11-11 16:42:57.595: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:42:57.595: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:42:57.596: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
-2004-11-11 16:42:57.600: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
-2004-11-11 16:42:57.600: The login-server is ready (Server is listening on the port 6900).
-
-2004-11-11 16:43:39.859: The login-server starting...
-2004-11-11 16:43:39.859: The configuration of the server is set:
-2004-11-11 16:43:39.859: - with no remote administration.
-2004-11-11 16:43:39.859: - to accept any IP for remote administration
-2004-11-11 16:43:39.859: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:43:39.859: - to create GM with level '60' when @gm is used.
-2004-11-11 16:43:39.859: - to ALLOW new users (with _F/_M).
-2004-11-11 16:43:39.859: - with port: 6900.
-2004-11-11 16:43:39.860: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:43:39.860: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:43:39.860: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:43:39.860: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:43:39.860: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:43:39.860: - to NOT display normal parse packets on console.
-2004-11-11 16:43:39.860: - to NOT display administration parse packets on console.
-2004-11-11 16:43:39.860: - to NOT display char-server parse packets on console.
-2004-11-11 16:43:39.860: - with no minimum level for connection.
-2004-11-11 16:43:39.861: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:43:39.861: - to create new accounts with an unlimited time.
-2004-11-11 16:43:39.861: - with control of players IP between login-server and char-server.
-2004-11-11 16:43:39.861: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:43:39.862: The LAN configuration of the server is set:
-2004-11-11 16:43:39.862: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:43:39.862: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:43:39.864: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
-2004-11-11 16:43:39.865: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
-2004-11-11 16:43:39.866: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:43:42.308: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:43:42.309: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:43:42.310: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:43:44.791: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
-
-2004-11-11 16:44:26.468: The login-server starting...
-2004-11-11 16:44:26.468: The configuration of the server is set:
-2004-11-11 16:44:26.468: - with no remote administration.
-2004-11-11 16:44:26.468: - to accept any IP for remote administration
-2004-11-11 16:44:26.468: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:44:26.468: - to create GM with level '60' when @gm is used.
-2004-11-11 16:44:26.468: - to ALLOW new users (with _F/_M).
-2004-11-11 16:44:26.468: - with port: 6900.
-2004-11-11 16:44:26.469: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:44:26.469: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:44:26.469: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:44:26.469: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:44:26.469: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:44:26.469: - to NOT display normal parse packets on console.
-2004-11-11 16:44:26.469: - to NOT display administration parse packets on console.
-2004-11-11 16:44:26.469: - to NOT display char-server parse packets on console.
-2004-11-11 16:44:26.469: - with no minimum level for connection.
-2004-11-11 16:44:26.470: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:44:26.470: - to create new accounts with an unlimited time.
-2004-11-11 16:44:26.470: - with control of players IP between login-server and char-server.
-2004-11-11 16:44:26.470: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:44:26.471: The LAN configuration of the server is set:
-2004-11-11 16:44:26.471: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:44:26.471: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:44:26.472: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
-2004-11-11 16:44:26.474: 6 accounts read in save/account.txt, of which is 1 GM account and 5 server accounts ('S').
-2004-11-11 16:44:26.474: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:44:29.635: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:44:29.635: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:44:29.637: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:46:36.685: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:46:36.685: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
-2004-11-11 16:46:37.308: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
-2004-11-11 16:46:52.378: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
-
-2004-11-11 16:47:20.578: The login-server starting...
-2004-11-11 16:47:20.578: The configuration of the server is set:
-2004-11-11 16:47:20.578: - with no remote administration.
-2004-11-11 16:47:20.578: - to accept any IP for remote administration
-2004-11-11 16:47:20.578: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:47:20.578: - to create GM with level '60' when @gm is used.
-2004-11-11 16:47:20.578: - to ALLOW new users (with _F/_M).
-2004-11-11 16:47:20.578: - with port: 6900.
-2004-11-11 16:47:20.578: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:47:20.578: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:47:20.578: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:47:20.579: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:47:20.579: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:47:20.579: - to NOT display normal parse packets on console.
-2004-11-11 16:47:20.579: - to NOT display administration parse packets on console.
-2004-11-11 16:47:20.579: - to NOT display char-server parse packets on console.
-2004-11-11 16:47:20.579: - with no minimum level for connection.
-2004-11-11 16:47:20.579: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:47:20.579: - to create new accounts with an unlimited time.
-2004-11-11 16:47:20.580: - with control of players IP between login-server and char-server.
-2004-11-11 16:47:20.580: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:47:20.580: The LAN configuration of the server is set:
-2004-11-11 16:47:20.582: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:47:20.582: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:47:20.584: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
-2004-11-11 16:47:20.586: 6 accounts read in save/account.txt, of which is 1 GM account and 5 server accounts ('S').
-2004-11-11 16:47:20.587: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:47:22.331: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:47:22.331: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:47:22.332: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:47:44.744: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:47:44.744: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
-2004-11-11 16:47:45.135: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
-2004-11-11 16:47:47.911: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:47:47.912: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
-2004-11-11 16:47:48.300: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
-2004-11-11 16:48:03.321: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
-2004-11-11 16:48:03.825: ----End of login-server (normal end with closing of all files).
-
-2004-11-11 16:48:22.000: The login-server starting...
-2004-11-11 16:48:22.000: The configuration of the server is set:
-2004-11-11 16:48:22.000: - with no remote administration.
-2004-11-11 16:48:22.000: - to accept any IP for remote administration
-2004-11-11 16:48:22.000: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:48:22.000: - to create GM with level '60' when @gm is used.
-2004-11-11 16:48:22.000: - to ALLOW new users (with _F/_M).
-2004-11-11 16:48:22.000: - with port: 6900.
-2004-11-11 16:48:22.001: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:48:22.001: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:48:22.001: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:48:22.001: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:48:22.001: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:48:22.001: - to NOT display normal parse packets on console.
-2004-11-11 16:48:22.001: - to NOT display administration parse packets on console.
-2004-11-11 16:48:22.001: - to NOT display char-server parse packets on console.
-2004-11-11 16:48:22.002: - with no minimum level for connection.
-2004-11-11 16:48:22.002: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:48:22.002: - to create new accounts with an unlimited time.
-2004-11-11 16:48:22.002: - with control of players IP between login-server and char-server.
-2004-11-11 16:48:22.002: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:48:22.003: The LAN configuration of the server is set:
-2004-11-11 16:48:22.003: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:48:22.003: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:48:22.004: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
-2004-11-11 16:48:22.006: 5 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
-2004-11-11 16:48:22.009: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:48:24.342: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:48:24.342: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:48:24.344: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:49:09.967: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:49:09.967: Unknown account (account: cameri, received pass: juan16, ip: 127.0.0.1)
-2004-11-11 16:49:15.570: Request for connection (non encryption mode) of cameri_M (ip: 127.0.0.1).
-2004-11-11 16:49:15.570: Account creation and authentification accepted (account cameri (id: 2000002), pass: juan16, sex: M, connection with _F/_M, ip: 127.0.0.1)
-2004-11-11 16:49:16.398: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
-2004-11-11 16:51:17.974: ----End of login-server (normal end with closing of all files).
-
-2004-11-11 16:51:25.234: The login-server starting...
-2004-11-11 16:51:25.234: The configuration of the server is set:
-2004-11-11 16:51:25.234: - with no remote administration.
-2004-11-11 16:51:25.234: - to accept any IP for remote administration
-2004-11-11 16:51:25.234: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:51:25.234: - to create GM with level '60' when @gm is used.
-2004-11-11 16:51:25.234: - to ALLOW new users (with _F/_M).
-2004-11-11 16:51:25.235: - with port: 6900.
-2004-11-11 16:51:25.235: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:51:25.235: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:51:25.235: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:51:25.235: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:51:25.235: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:51:25.235: - to NOT display normal parse packets on console.
-2004-11-11 16:51:25.235: - to NOT display administration parse packets on console.
-2004-11-11 16:51:25.235: - to NOT display char-server parse packets on console.
-2004-11-11 16:51:25.236: - with no minimum level for connection.
-2004-11-11 16:51:25.236: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:51:25.236: - to create new accounts with an unlimited time.
-2004-11-11 16:51:25.236: - with control of players IP between login-server and char-server.
-2004-11-11 16:51:25.236: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:51:25.237: The LAN configuration of the server is set:
-2004-11-11 16:51:25.237: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:51:25.237: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:51:25.238: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
-2004-11-11 16:51:25.240: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
-2004-11-11 16:51:25.241: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:51:27.129: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:51:27.130: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:51:27.133: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:51:48.970: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:51:48.970: Authentification accepted (account: cameri (id: 2000002), ip: 127.0.0.1)
-2004-11-11 16:51:49.440: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
-2004-11-11 16:51:59.769: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
-2004-11-11 16:52:00.665: ----End of login-server (normal end with closing of all files).
-
-2004-11-11 16:52:15.890: The login-server starting...
-2004-11-11 16:52:15.890: The configuration of the server is set:
-2004-11-11 16:52:15.890: - with no remote administration.
-2004-11-11 16:52:15.890: - to accept any IP for remote administration
-2004-11-11 16:52:15.890: - with the DEFAULT 'To GM become' password (gm_pass).
-2004-11-11 16:52:15.890: - to create GM with level '60' when @gm is used.
-2004-11-11 16:52:15.890: - to ALLOW new users (with _F/_M).
-2004-11-11 16:52:15.890: - with port: 6900.
-2004-11-11 16:52:15.891: - with the accounts file name: 'save/account.txt'.
-2004-11-11 16:52:15.891: - with the GM accounts file name: 'conf/GM_account.txt'.
-2004-11-11 16:52:15.891: - to check GM accounts file modifications every 15 seconds.
-2004-11-11 16:52:15.891: - with the unknown packets file name: 'log/login_unknown_packets.log'.
-2004-11-11 16:52:15.891: - to SAVE only unkown packets sending by a char-server or a remote administration.
-2004-11-11 16:52:15.891: - to NOT display normal parse packets on console.
-2004-11-11 16:52:15.891: - to NOT display administration parse packets on console.
-2004-11-11 16:52:15.891: - to NOT display char-server parse packets on console.
-2004-11-11 16:52:15.892: - with no minimum level for connection.
-2004-11-11 16:52:15.892: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
-2004-11-11 16:52:15.892: - to create new accounts with an unlimited time.
-2004-11-11 16:52:15.892: - with control of players IP between login-server and char-server.
-2004-11-11 16:52:15.892: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
-2004-11-11 16:52:15.893: The LAN configuration of the server is set:
-2004-11-11 16:52:15.893: - with LAN IP of char-server: 127.0.0.1.
-2004-11-11 16:52:15.893: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
-2004-11-11 16:52:15.896: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
-2004-11-11 16:52:15.898: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
-2004-11-11 16:52:15.898: The login-server is ready (Server is listening on the port 6900).
-2004-11-11 16:52:17.567: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
-2004-11-11 16:52:17.567: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
-2004-11-11 16:52:17.572: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
-2004-11-11 16:52:56.354: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
-2004-11-11 16:52:56.355: Unknown account (account: cameri, received pass: juan16, ip: 127.0.0.1)
-2004-11-11 16:53:01.776: Request for connection (non encryption mode) of cameri_M (ip: 127.0.0.1).
-2004-11-11 16:53:01.776: Account creation and authentification accepted (account cameri (id: 2000002), pass: juan16, sex: M, connection with _F/_M, ip: 127.0.0.1)
-2004-11-11 16:53:02.316: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
-2004-11-11 16:53:11.597: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
-2004-11-11 16:53:12.191: ----End of login-server (normal end with closing of all files).
+
+2004-11-11 16:42:57.500: The login-server starting...
+2004-11-11 16:42:57.574: The configuration of the server is set:
+2004-11-11 16:42:57.574: - with no remote administration.
+2004-11-11 16:42:57.574: - to accept any IP for remote administration
+2004-11-11 16:42:57.574: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:42:57.574: - to create GM with level '60' when @gm is used.
+2004-11-11 16:42:57.574: - to ALLOW new users (with _F/_M).
+2004-11-11 16:42:57.575: - with port: 6900.
+2004-11-11 16:42:57.575: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:42:57.575: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:42:57.575: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:42:57.575: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:42:57.576: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:42:57.576: - to NOT display normal parse packets on console.
+2004-11-11 16:42:57.576: - to NOT display administration parse packets on console.
+2004-11-11 16:42:57.576: - to NOT display char-server parse packets on console.
+2004-11-11 16:42:57.576: - with no minimum level for connection.
+2004-11-11 16:42:57.576: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:42:57.576: - to create new accounts with an unlimited time.
+2004-11-11 16:42:57.576: - with control of players IP between login-server and char-server.
+2004-11-11 16:42:57.576: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:42:57.594: The LAN configuration of the server is set:
+2004-11-11 16:42:57.595: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:42:57.595: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:42:57.596: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
+2004-11-11 16:42:57.600: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
+2004-11-11 16:42:57.600: The login-server is ready (Server is listening on the port 6900).
+
+2004-11-11 16:43:39.859: The login-server starting...
+2004-11-11 16:43:39.859: The configuration of the server is set:
+2004-11-11 16:43:39.859: - with no remote administration.
+2004-11-11 16:43:39.859: - to accept any IP for remote administration
+2004-11-11 16:43:39.859: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:43:39.859: - to create GM with level '60' when @gm is used.
+2004-11-11 16:43:39.859: - to ALLOW new users (with _F/_M).
+2004-11-11 16:43:39.859: - with port: 6900.
+2004-11-11 16:43:39.860: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:43:39.860: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:43:39.860: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:43:39.860: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:43:39.860: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:43:39.860: - to NOT display normal parse packets on console.
+2004-11-11 16:43:39.860: - to NOT display administration parse packets on console.
+2004-11-11 16:43:39.860: - to NOT display char-server parse packets on console.
+2004-11-11 16:43:39.860: - with no minimum level for connection.
+2004-11-11 16:43:39.861: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:43:39.861: - to create new accounts with an unlimited time.
+2004-11-11 16:43:39.861: - with control of players IP between login-server and char-server.
+2004-11-11 16:43:39.861: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:43:39.862: The LAN configuration of the server is set:
+2004-11-11 16:43:39.862: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:43:39.862: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:43:39.864: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
+2004-11-11 16:43:39.865: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
+2004-11-11 16:43:39.866: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:43:42.308: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:43:42.309: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:43:42.310: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:43:44.791: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
+
+2004-11-11 16:44:26.468: The login-server starting...
+2004-11-11 16:44:26.468: The configuration of the server is set:
+2004-11-11 16:44:26.468: - with no remote administration.
+2004-11-11 16:44:26.468: - to accept any IP for remote administration
+2004-11-11 16:44:26.468: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:44:26.468: - to create GM with level '60' when @gm is used.
+2004-11-11 16:44:26.468: - to ALLOW new users (with _F/_M).
+2004-11-11 16:44:26.468: - with port: 6900.
+2004-11-11 16:44:26.469: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:44:26.469: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:44:26.469: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:44:26.469: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:44:26.469: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:44:26.469: - to NOT display normal parse packets on console.
+2004-11-11 16:44:26.469: - to NOT display administration parse packets on console.
+2004-11-11 16:44:26.469: - to NOT display char-server parse packets on console.
+2004-11-11 16:44:26.469: - with no minimum level for connection.
+2004-11-11 16:44:26.470: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:44:26.470: - to create new accounts with an unlimited time.
+2004-11-11 16:44:26.470: - with control of players IP between login-server and char-server.
+2004-11-11 16:44:26.470: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:44:26.471: The LAN configuration of the server is set:
+2004-11-11 16:44:26.471: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:44:26.471: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:44:26.472: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
+2004-11-11 16:44:26.474: 6 accounts read in save/account.txt, of which is 1 GM account and 5 server accounts ('S').
+2004-11-11 16:44:26.474: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:44:29.635: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:44:29.635: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:44:29.637: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:46:36.685: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:46:36.685: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
+2004-11-11 16:46:37.308: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
+2004-11-11 16:46:52.378: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
+
+2004-11-11 16:47:20.578: The login-server starting...
+2004-11-11 16:47:20.578: The configuration of the server is set:
+2004-11-11 16:47:20.578: - with no remote administration.
+2004-11-11 16:47:20.578: - to accept any IP for remote administration
+2004-11-11 16:47:20.578: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:47:20.578: - to create GM with level '60' when @gm is used.
+2004-11-11 16:47:20.578: - to ALLOW new users (with _F/_M).
+2004-11-11 16:47:20.578: - with port: 6900.
+2004-11-11 16:47:20.578: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:47:20.578: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:47:20.578: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:47:20.579: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:47:20.579: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:47:20.579: - to NOT display normal parse packets on console.
+2004-11-11 16:47:20.579: - to NOT display administration parse packets on console.
+2004-11-11 16:47:20.579: - to NOT display char-server parse packets on console.
+2004-11-11 16:47:20.579: - with no minimum level for connection.
+2004-11-11 16:47:20.579: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:47:20.579: - to create new accounts with an unlimited time.
+2004-11-11 16:47:20.580: - with control of players IP between login-server and char-server.
+2004-11-11 16:47:20.580: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:47:20.580: The LAN configuration of the server is set:
+2004-11-11 16:47:20.582: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:47:20.582: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:47:20.584: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
+2004-11-11 16:47:20.586: 6 accounts read in save/account.txt, of which is 1 GM account and 5 server accounts ('S').
+2004-11-11 16:47:20.587: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:47:22.331: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:47:22.331: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:47:22.332: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:47:44.744: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:47:44.744: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
+2004-11-11 16:47:45.135: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
+2004-11-11 16:47:47.911: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:47:47.912: Authentification accepted (account: cameri (id: 2000001), ip: 127.0.0.1)
+2004-11-11 16:47:48.300: Char-server 'eAthena': authentification of the account 2000001 accepted (ip: 127.0.0.1).
+2004-11-11 16:48:03.321: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
+2004-11-11 16:48:03.825: ----End of login-server (normal end with closing of all files).
+
+2004-11-11 16:48:22.000: The login-server starting...
+2004-11-11 16:48:22.000: The configuration of the server is set:
+2004-11-11 16:48:22.000: - with no remote administration.
+2004-11-11 16:48:22.000: - to accept any IP for remote administration
+2004-11-11 16:48:22.000: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:48:22.000: - to create GM with level '60' when @gm is used.
+2004-11-11 16:48:22.000: - to ALLOW new users (with _F/_M).
+2004-11-11 16:48:22.000: - with port: 6900.
+2004-11-11 16:48:22.001: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:48:22.001: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:48:22.001: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:48:22.001: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:48:22.001: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:48:22.001: - to NOT display normal parse packets on console.
+2004-11-11 16:48:22.001: - to NOT display administration parse packets on console.
+2004-11-11 16:48:22.001: - to NOT display char-server parse packets on console.
+2004-11-11 16:48:22.002: - with no minimum level for connection.
+2004-11-11 16:48:22.002: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:48:22.002: - to create new accounts with an unlimited time.
+2004-11-11 16:48:22.002: - with control of players IP between login-server and char-server.
+2004-11-11 16:48:22.002: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:48:22.003: The LAN configuration of the server is set:
+2004-11-11 16:48:22.003: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:48:22.003: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:48:22.004: read_gm_account: file 'conf/GM_account.txt' readed (32 GM accounts found).
+2004-11-11 16:48:22.006: 5 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
+2004-11-11 16:48:22.009: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:48:24.342: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:48:24.342: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:48:24.344: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:49:09.967: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:49:09.967: Unknown account (account: cameri, received pass: juan16, ip: 127.0.0.1)
+2004-11-11 16:49:15.570: Request for connection (non encryption mode) of cameri_M (ip: 127.0.0.1).
+2004-11-11 16:49:15.570: Account creation and authentification accepted (account cameri (id: 2000002), pass: juan16, sex: M, connection with _F/_M, ip: 127.0.0.1)
+2004-11-11 16:49:16.398: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
+2004-11-11 16:51:17.974: ----End of login-server (normal end with closing of all files).
+
+2004-11-11 16:51:25.234: The login-server starting...
+2004-11-11 16:51:25.234: The configuration of the server is set:
+2004-11-11 16:51:25.234: - with no remote administration.
+2004-11-11 16:51:25.234: - to accept any IP for remote administration
+2004-11-11 16:51:25.234: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:51:25.234: - to create GM with level '60' when @gm is used.
+2004-11-11 16:51:25.234: - to ALLOW new users (with _F/_M).
+2004-11-11 16:51:25.235: - with port: 6900.
+2004-11-11 16:51:25.235: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:51:25.235: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:51:25.235: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:51:25.235: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:51:25.235: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:51:25.235: - to NOT display normal parse packets on console.
+2004-11-11 16:51:25.235: - to NOT display administration parse packets on console.
+2004-11-11 16:51:25.235: - to NOT display char-server parse packets on console.
+2004-11-11 16:51:25.236: - with no minimum level for connection.
+2004-11-11 16:51:25.236: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:51:25.236: - to create new accounts with an unlimited time.
+2004-11-11 16:51:25.236: - with control of players IP between login-server and char-server.
+2004-11-11 16:51:25.236: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:51:25.237: The LAN configuration of the server is set:
+2004-11-11 16:51:25.237: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:51:25.237: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:51:25.238: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
+2004-11-11 16:51:25.240: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
+2004-11-11 16:51:25.241: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:51:27.129: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:51:27.130: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:51:27.133: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:51:48.970: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:51:48.970: Authentification accepted (account: cameri (id: 2000002), ip: 127.0.0.1)
+2004-11-11 16:51:49.440: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
+2004-11-11 16:51:59.769: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
+2004-11-11 16:52:00.665: ----End of login-server (normal end with closing of all files).
+
+2004-11-11 16:52:15.890: The login-server starting...
+2004-11-11 16:52:15.890: The configuration of the server is set:
+2004-11-11 16:52:15.890: - with no remote administration.
+2004-11-11 16:52:15.890: - to accept any IP for remote administration
+2004-11-11 16:52:15.890: - with the DEFAULT 'To GM become' password (gm_pass).
+2004-11-11 16:52:15.890: - to create GM with level '60' when @gm is used.
+2004-11-11 16:52:15.890: - to ALLOW new users (with _F/_M).
+2004-11-11 16:52:15.890: - with port: 6900.
+2004-11-11 16:52:15.891: - with the accounts file name: 'save/account.txt'.
+2004-11-11 16:52:15.891: - with the GM accounts file name: 'conf/GM_account.txt'.
+2004-11-11 16:52:15.891: - to check GM accounts file modifications every 15 seconds.
+2004-11-11 16:52:15.891: - with the unknown packets file name: 'log/login_unknown_packets.log'.
+2004-11-11 16:52:15.891: - to SAVE only unkown packets sending by a char-server or a remote administration.
+2004-11-11 16:52:15.891: - to NOT display normal parse packets on console.
+2004-11-11 16:52:15.891: - to NOT display administration parse packets on console.
+2004-11-11 16:52:15.891: - to NOT display char-server parse packets on console.
+2004-11-11 16:52:15.892: - with no minimum level for connection.
+2004-11-11 16:52:15.892: - to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before.
+2004-11-11 16:52:15.892: - to create new accounts with an unlimited time.
+2004-11-11 16:52:15.892: - with control of players IP between login-server and char-server.
+2004-11-11 16:52:15.892: - with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP.
+2004-11-11 16:52:15.893: The LAN configuration of the server is set:
+2004-11-11 16:52:15.893: - with LAN IP of char-server: 127.0.0.1.
+2004-11-11 16:52:15.893: - with the sub-network of the char-server: 127.0.0.1/255.255.255.255.
+2004-11-11 16:52:15.896: read_gm_account: file 'conf/GM_account.txt' readed (31 GM accounts found).
+2004-11-11 16:52:15.898: 6 accounts read in save/account.txt, of which is no GM account and 5 server accounts ('S').
+2004-11-11 16:52:15.898: The login-server is ready (Server is listening on the port 6900).
+2004-11-11 16:52:17.567: Connection request of the char-server 'eAthena' @ 127.0.0.1:6121 (ip: 127.0.0.1)
+2004-11-11 16:52:17.567: Authentification accepted (account: s1 (id: 0), ip: 127.0.0.1)
+2004-11-11 16:52:17.572: Connection of the char-server 'eAthena' accepted (account: s1, pass: p1, ip: 127.0.0.1)
+2004-11-11 16:52:56.354: Request for connection (non encryption mode) of cameri (ip: 127.0.0.1).
+2004-11-11 16:52:56.355: Unknown account (account: cameri, received pass: juan16, ip: 127.0.0.1)
+2004-11-11 16:53:01.776: Request for connection (non encryption mode) of cameri_M (ip: 127.0.0.1).
+2004-11-11 16:53:01.776: Account creation and authentification accepted (account cameri (id: 2000002), pass: juan16, sex: M, connection with _F/_M, ip: 127.0.0.1)
+2004-11-11 16:53:02.316: Char-server 'eAthena': authentification of the account 2000002 accepted (ip: 127.0.0.1).
+2004-11-11 16:53:11.597: Char-server 'eAthena' has disconnected (ip: 127.0.0.1).
+2004-11-11 16:53:12.191: ----End of login-server (normal end with closing of all files).
diff --git a/login-server.sh b/login-server.sh
index e37645ed5..b658a3e35 100644
--- a/login-server.sh
+++ b/login-server.sh
@@ -1,16 +1,16 @@
-#/bin/sh
-#Hi my naem is Kirt and I liek anime
-
-ulimit -Sc unlimited
-
-while [ 2 ] ; do
-if [ -f .stopserver2 ] ; then
-echo server marked down >> servlog.txt
-else
-echo restarting server at time at `date +"%m-%d-%H:%M-%S"`>> startlog.txt
-./login-server
-fi
-
-sleep 5
-
-done
+#/bin/sh
+#Hi my naem is Kirt and I liek anime
+
+ulimit -Sc unlimited
+
+while [ 2 ] ; do
+if [ -f .stopserver2 ] ; then
+echo server marked down >> servlog.txt
+else
+echo restarting server at time at `date +"%m-%d-%H:%M-%S"`>> startlog.txt
+./login-server
+fi
+
+sleep 5
+
+done
diff --git a/logserv.bat b/logserv.bat
index 11756cf1f..ee927f042 100644
--- a/logserv.bat
+++ b/logserv.bat
@@ -1,4 +1,4 @@
-@echo off
-:logserv
-start /min /wait login-server.exe
+@echo off
+:logserv
+start /min /wait login-server.exe
goto logserv \ No newline at end of file
diff --git a/mapserv.bat b/mapserv.bat
index 5500a4963..9c8292e4e 100644
--- a/mapserv.bat
+++ b/mapserv.bat
@@ -1,4 +1,4 @@
-@echo off
-:mapserv
-start /min /wait map-server.exe conf\map_athena.conf
+@echo off
+:mapserv
+start /min /wait map-server.exe conf\map_athena.conf
goto mapserv \ No newline at end of file
diff --git a/npc/Changelog.txt b/npc/Changelog.txt
index 0a93edae1..40ab391b9 100644
--- a/npc/Changelog.txt
+++ b/npc/Changelog.txt
@@ -1,248 +1,248 @@
-== Progress ==
-
-Person Working On
-======
-Darkchild
- * New Payon City - 99% - As Far Done As Posible
- * Alchemist - Done
- * Sage - Done
- * Monk Quest - Botting An Acolyte Atm
-Lupus
- * removing a loop from grandpa_pharmacist.txt (similiar to Juice quest) 0%
- * removing Zeny exploits from Milkman, Juice maker, Potion maker 0%
-
-kobra_k88
- * Optimize WoE
-Aria
- * Debugging/Overlooking NPCs.
- * Making misc npcs
- * Making the "Dev edition" npcs =D - 80% - Final layout finished, need more devs to put their quotes in.
-Shinigami
- * Organizing/Optmizing/Checking for Typo in all NPCs.
-Mass Zero
- * Novice Training Ground.
- * (Probably unofficial) Lou Yang NPC's, mobs, etc...
-Shadowlady
- * Marriage (Fix, optimization) ?%
-
-MC Cameri
- * Bank NPC - Now 100% done for new payon
-
-Other Ppl
- * Their Work?
-
-== Changelog ==
-
-Date Added
-======
-11/14
- * - Fixed niflheim kafra. [shadow]
-
-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 :)
+== Progress ==
+
+Person Working On
+======
+Darkchild
+ * New Payon City - 99% - As Far Done As Posible
+ * Alchemist - Done
+ * Sage - Done
+ * Monk Quest - Botting An Acolyte Atm
+Lupus
+ * removing a loop from grandpa_pharmacist.txt (similiar to Juice quest) 0%
+ * removing Zeny exploits from Milkman, Juice maker, Potion maker 0%
+
+kobra_k88
+ * Optimize WoE
+Aria
+ * Debugging/Overlooking NPCs.
+ * Making misc npcs
+ * Making the "Dev edition" npcs =D - 80% - Final layout finished, need more devs to put their quotes in.
+Shinigami
+ * Organizing/Optmizing/Checking for Typo in all NPCs.
+Mass Zero
+ * Novice Training Ground.
+ * (Probably unofficial) Lou Yang NPC's, mobs, etc...
+Shadowlady
+ * Marriage (Fix, optimization) ?%
+
+MC Cameri
+ * Bank NPC - Now 100% done for new payon
+
+Other Ppl
+ * Their Work?
+
+== Changelog ==
+
+Date Added
+======
+11/14
+ * - Fixed niflheim kafra. [shadow]
+
+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/cities/alberta.txt b/npc/cities/alberta.txt
index 712f030bf..bc1ac9be5 100644
--- a/npc/cities/alberta.txt
+++ b/npc/cities/alberta.txt
@@ -1,873 +1,873 @@
-//===== eAthena Script =======================================
-//= Alberta Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Negative input bug fixed [Lupus]
-//============================================================
-
-
-
-// Young Man -----------------------------------------------------------
-alberta_in.gat,20,183,6 script Young Man 49,{
- mes "[Merchant]";
- mes "People say that ^0000ffGungnir^000000, the legendary spear, never missess its' target. If that's true, then it's simply amazing.";
- close;
-}
-
-// Merchant -------------------------------------------------
-alberta.gat,97,51,7 script Merchant 84,{
- mes "[Merchant]";
- mes "When you travel to many places like I do, you often here alot 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 74,{
- mes "[Merchant]";
- mes "Oh, you look like a stranger. Welcome to Alberta.";
- emotion 0;
- 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 8;
- close;
-}
-
-// Merchant -------------------------------------------------
-alberta.gat,58,80,8 script Merchant 99,{
- set @TEMP,0;
- mes "[Merchant]";
- set @TEMP,rand(2);
- if(@TEMP == 1) goto R_1;
-
- R_0:
- 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,3;
- set @TEMP,rand(3);
-
- mes "[Phina]";
-
- if(@TEMP == 2) goto R_2;
- if(@TEMP == 1) goto R_1;
- if(@TEMP == 0) goto R_0;
-
- R_2:
- 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 soooo cute that I wanted to touch it. And when I did, you know what happend? The grass actualy 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 0;
- 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 BAMB!!! It hit a huge tree and crushed it into pieces.";
- emotion 16;
- next;
- mes "[Phina]";
- mes "I sure learned my lesson that day. NEVER taunght 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 becarefull 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 towns people to get around.";
- next;
- mes "[Grandma]";
- mes "We've never been able to doing 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 mosters 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, that 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",M_0,"Leave him alone",M_1;
-
- M_0:
- 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?",sM_0,"Really? No kidding!",sM_1;
-
- sM_0:
- mes "[Drunken old man]";
- mes "What? Ya never heard of it? Stupid! Everybody knows the notorious pirateship `Going Mary'! (~hiccup~)";
- emotion 1;
- next;
- sM_1:
- mes "[Drunken old man]";
- mes "Ah~ the good ol'days... only... if only we hadn't run into that STORM... (~hiccup~)";
- next;
- mes "[Drunken old man]";
- mes "AH~ Captain. I miss our capt'n more than anything.... no foe could ever survive capt'n'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 28;
- close;
-
- M_1:
- mes "[Drunken old man]";
- mes "That's right! Go AWAY~";
- emotion 32;
- close;
-}
-
-// Soda Man ----------------------------------------------------
-alberta.gat,90,71,3 script Soda Man 89,
-{
- mes "[Soda Man]";
- mes "Ummm.... delicious....";
- emotion 33;
- 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 taliking nonsense.";
- mes "But be patient and if you listen to his words carefully you may be able to pick up some usefull 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.",M0,"Quit",M_End;
-
- M0:
- if(Zeny < 500) goto NoZenyM1;
- set Zeny, Zeny - 500;
- warp "izlude.gat",176,182;
- close;
-
- NoZenyM1:
- mes "[Sailor Fisk]";
- mes "I'm sorry but i told you i would need 500 Zeny, and it looks like you dont 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",M_Yes,"Na",M_End;
-
- M_Yes:
- mes "[Phelix]";
- mes "What do you want to exchange your jellopies for?";
- next;
- menu "Red Potion please.",M_0,"Sweet Potato please.",M_1,"Cancel",M_End;
-
- M_0:
- 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) goto M_Yes; //fixed by Lupus
-
- 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 jellopy.";
- 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 0;
- next;
- mes "[Paul]";
- mes "So what do you say? It only cost 200 zeny to participate and you'll get a ton of experience, gauranteed.";
- next;
- menu "Enter",M_0,"Quit",M_End;
-
- M_0:
- 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 dont 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",M0,"Quit",MEnd;
-
- M0:
- warp "alberta.gat",192,169;
- close;
- MEnd:
- close;
-}
-
-
-//<====================================================== Turtle Island ========================================================>\\
-// Gotanblue --------------------------------------------------------------------------
-alberta.gat,247,123,5 script Gotanblue 709,
-{
- if(TURTLE == 1) goto L_Turtle;
- mes "[Gotanblue]";
- mes "Ha ha! The sea seems endless!! We cannot begin to grasp it's 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 from that drunken old man!";
-M_Menu:
- next;
- menu "-Tell me about Turtle Island.",M_1, "-How Can I get there?",M_2, "-End Conversation",M_End;
-
- M_1:
- 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 0;
- 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 piereced through the fog right in front of us!";
- mes "There was no way to avoid it and we crashed violently into it, severly damaging our ship!!";
- emotion 0;
- 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 piereced 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 expidition.";
- next;
- mes "[Gotanblue]";
- mes "According to his journal, the man had come by himself to find the island. Unfortunatley we could not find him anywhere.";
- 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 remeber 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 beautifull 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 througth 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... unfortunatley 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 immediatley cast off once again.";
- emotion 0;
- 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 23;
- 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 appologize... I'm am still very emotional about it after all these years... well that is all I have to say about Turtle Island.";
- emotion 28;
- goto M_Menu;
-
- M_2:
- mes "[Gotanblue]";
- mes "What's this? After my terrifying story about Turtle Island you still want to got there? You're not at all scared??";
- emotion 1;
- 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",sM_1, "Cancel",sM_End;
-
- sM_1:
- 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 onboard his little steamboat)^000000";
- next;
- mes "[Gotanblue]";
- mes "We are now heading towards Turtle Island. Let us go withouth fear!!";
- next;
- mes "^5555FF(~choo~choooo~)^000000";
- next;
- set Zeny, Zeny - 10000;
- warp "tur_dun01.gat",154,39;
- close;
-
- sL_Zeny:
- mes "[Gotanblue]";
- mes "What's this? I said 10000 zeny. I will not guide you for less. Good day!";
- emotion 1;
- 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 shrowded 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;
-}
-
-// Turtle Grandpa -------------------------------------------------------------------
-alberta_in.gat,23,104,2 script Turtle Grandpa 120,
-{
- mes "[Turtle Grandpa]";
- mes "~Buuurrrpp!!!~ Oops...";
- emotion 4;
- 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 6;
- next;
- mes "[Turtle Grandpa]";
- mes "Why is it that I have to resort to drinking in a place like this??";
- emotion 1;
- next;
- menu "-Tell me about Turtle Island.",M_0, "-How can I get there?",M_1, "-End conversation.",M_End;
-
- M_0:
- 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 TOO!!......";
- emotion 0;
- 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~)",sM_0, "-Heck Ya! Gimme that information.",sM_1;
-
- sM_0:
- 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 extemely 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 powerfull 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 definately an interesting read.";
- set TURTLE, 1;
- set JORNADAN, 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 0;
- next;
- mes "[Turtle Grandpa]";
- mes "Get OUT of my sight!!! GO HOME!";
- emotion 6;
- next;
- mes "[Turtle Grandpa]";
- mes "What's this?? You're still here?..... GO! GO AWAY!!............";
- emotion 27;
- close;
-
- M_1:
- mes "[Turtle Grandpa]";
- mes "It's is extremely hard to find, and even more difficult to reach. The likelyhood of returning home is slim at best....";
- next;
- mes "[Turtle Grandpa]";
- mes "Actually..... IT'S IMPOSSIBLE!!!!";
- emotion 0;
- next;
- mes "[Turtle Grandpa]";
- mes "Yet you still want to go there??";
- emotion 1;
- 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 "Anywho, 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.... lookee 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 expidition 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 serverly 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.",M_0, "-Um, did you get confused with Al De Baran?",M_1, "-End Conversation.",M_End;
-
- M_0:
- 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 unsually 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 one of nature's natural phenomenons.";
- 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 trully 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 persue the matter untill 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(JORNADAN == 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 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 suddently 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 wokers 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. Fortunatley the ship has yet to sink and seems to be holding up. Still, we must find land soon.";
- next;
- mes "[A Voyage Log]";
- mes "Durring 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 refered 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 sytem 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 worrired.";
- 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 burry 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 SKULLKEY, 1;
- set JORNADAN, 0;
- close;
-}
-
-// Burried treasure --------------------------------------------------------------------
-turn_dun01,160,80,1 script Skull Stone 111,
-{
- if(SKULLKEY == 1) 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";
- next;
- mes "^5555FF(You got 5 Bananas, and 5 Banana Juices.)^000000";
- getitem 634, 5;
- getitem 532, 5;
- set SKULLKEY, 0;
- close;
-}
+//===== eAthena Script =======================================
+//= Alberta Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Negative input bug fixed [Lupus]
+//============================================================
+
+
+
+// Young Man -----------------------------------------------------------
+alberta_in.gat,20,183,6 script Young Man 49,{
+ mes "[Merchant]";
+ mes "People say that ^0000ffGungnir^000000, the legendary spear, never missess its' target. If that's true, then it's simply amazing.";
+ close;
+}
+
+// Merchant -------------------------------------------------
+alberta.gat,97,51,7 script Merchant 84,{
+ mes "[Merchant]";
+ mes "When you travel to many places like I do, you often here alot 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 74,{
+ mes "[Merchant]";
+ mes "Oh, you look like a stranger. Welcome to Alberta.";
+ emotion 0;
+ 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 8;
+ close;
+}
+
+// Merchant -------------------------------------------------
+alberta.gat,58,80,8 script Merchant 99,{
+ set @TEMP,0;
+ mes "[Merchant]";
+ set @TEMP,rand(2);
+ if(@TEMP == 1) goto R_1;
+
+ R_0:
+ 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,3;
+ set @TEMP,rand(3);
+
+ mes "[Phina]";
+
+ if(@TEMP == 2) goto R_2;
+ if(@TEMP == 1) goto R_1;
+ if(@TEMP == 0) goto R_0;
+
+ R_2:
+ 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 soooo cute that I wanted to touch it. And when I did, you know what happend? The grass actualy 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 0;
+ 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 BAMB!!! It hit a huge tree and crushed it into pieces.";
+ emotion 16;
+ next;
+ mes "[Phina]";
+ mes "I sure learned my lesson that day. NEVER taunght 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 becarefull 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 towns people to get around.";
+ next;
+ mes "[Grandma]";
+ mes "We've never been able to doing 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 mosters 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, that 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",M_0,"Leave him alone",M_1;
+
+ M_0:
+ 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?",sM_0,"Really? No kidding!",sM_1;
+
+ sM_0:
+ mes "[Drunken old man]";
+ mes "What? Ya never heard of it? Stupid! Everybody knows the notorious pirateship `Going Mary'! (~hiccup~)";
+ emotion 1;
+ next;
+ sM_1:
+ mes "[Drunken old man]";
+ mes "Ah~ the good ol'days... only... if only we hadn't run into that STORM... (~hiccup~)";
+ next;
+ mes "[Drunken old man]";
+ mes "AH~ Captain. I miss our capt'n more than anything.... no foe could ever survive capt'n'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 28;
+ close;
+
+ M_1:
+ mes "[Drunken old man]";
+ mes "That's right! Go AWAY~";
+ emotion 32;
+ close;
+}
+
+// Soda Man ----------------------------------------------------
+alberta.gat,90,71,3 script Soda Man 89,
+{
+ mes "[Soda Man]";
+ mes "Ummm.... delicious....";
+ emotion 33;
+ 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 taliking nonsense.";
+ mes "But be patient and if you listen to his words carefully you may be able to pick up some usefull 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.",M0,"Quit",M_End;
+
+ M0:
+ if(Zeny < 500) goto NoZenyM1;
+ set Zeny, Zeny - 500;
+ warp "izlude.gat",176,182;
+ close;
+
+ NoZenyM1:
+ mes "[Sailor Fisk]";
+ mes "I'm sorry but i told you i would need 500 Zeny, and it looks like you dont 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",M_Yes,"Na",M_End;
+
+ M_Yes:
+ mes "[Phelix]";
+ mes "What do you want to exchange your jellopies for?";
+ next;
+ menu "Red Potion please.",M_0,"Sweet Potato please.",M_1,"Cancel",M_End;
+
+ M_0:
+ 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) goto M_Yes; //fixed by Lupus
+
+ 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 jellopy.";
+ 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 0;
+ next;
+ mes "[Paul]";
+ mes "So what do you say? It only cost 200 zeny to participate and you'll get a ton of experience, gauranteed.";
+ next;
+ menu "Enter",M_0,"Quit",M_End;
+
+ M_0:
+ 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 dont 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",M0,"Quit",MEnd;
+
+ M0:
+ warp "alberta.gat",192,169;
+ close;
+ MEnd:
+ close;
+}
+
+
+//<====================================================== Turtle Island ========================================================>\\
+// Gotanblue --------------------------------------------------------------------------
+alberta.gat,247,123,5 script Gotanblue 709,
+{
+ if(TURTLE == 1) goto L_Turtle;
+ mes "[Gotanblue]";
+ mes "Ha ha! The sea seems endless!! We cannot begin to grasp it's 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 from that drunken old man!";
+M_Menu:
+ next;
+ menu "-Tell me about Turtle Island.",M_1, "-How Can I get there?",M_2, "-End Conversation",M_End;
+
+ M_1:
+ 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 0;
+ 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 piereced through the fog right in front of us!";
+ mes "There was no way to avoid it and we crashed violently into it, severly damaging our ship!!";
+ emotion 0;
+ 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 piereced 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 expidition.";
+ next;
+ mes "[Gotanblue]";
+ mes "According to his journal, the man had come by himself to find the island. Unfortunatley we could not find him anywhere.";
+ 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 remeber 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 beautifull 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 througth 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... unfortunatley 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 immediatley cast off once again.";
+ emotion 0;
+ 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 23;
+ 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 appologize... I'm am still very emotional about it after all these years... well that is all I have to say about Turtle Island.";
+ emotion 28;
+ goto M_Menu;
+
+ M_2:
+ mes "[Gotanblue]";
+ mes "What's this? After my terrifying story about Turtle Island you still want to got there? You're not at all scared??";
+ emotion 1;
+ 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",sM_1, "Cancel",sM_End;
+
+ sM_1:
+ 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 onboard his little steamboat)^000000";
+ next;
+ mes "[Gotanblue]";
+ mes "We are now heading towards Turtle Island. Let us go withouth fear!!";
+ next;
+ mes "^5555FF(~choo~choooo~)^000000";
+ next;
+ set Zeny, Zeny - 10000;
+ warp "tur_dun01.gat",154,39;
+ close;
+
+ sL_Zeny:
+ mes "[Gotanblue]";
+ mes "What's this? I said 10000 zeny. I will not guide you for less. Good day!";
+ emotion 1;
+ 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 shrowded 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;
+}
+
+// Turtle Grandpa -------------------------------------------------------------------
+alberta_in.gat,23,104,2 script Turtle Grandpa 120,
+{
+ mes "[Turtle Grandpa]";
+ mes "~Buuurrrpp!!!~ Oops...";
+ emotion 4;
+ 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 6;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Why is it that I have to resort to drinking in a place like this??";
+ emotion 1;
+ next;
+ menu "-Tell me about Turtle Island.",M_0, "-How can I get there?",M_1, "-End conversation.",M_End;
+
+ M_0:
+ 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 TOO!!......";
+ emotion 0;
+ 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~)",sM_0, "-Heck Ya! Gimme that information.",sM_1;
+
+ sM_0:
+ 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 extemely 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 powerfull 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 definately an interesting read.";
+ set TURTLE, 1;
+ set JORNADAN, 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 0;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Get OUT of my sight!!! GO HOME!";
+ emotion 6;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "What's this?? You're still here?..... GO! GO AWAY!!............";
+ emotion 27;
+ close;
+
+ M_1:
+ mes "[Turtle Grandpa]";
+ mes "It's is extremely hard to find, and even more difficult to reach. The likelyhood of returning home is slim at best....";
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Actually..... IT'S IMPOSSIBLE!!!!";
+ emotion 0;
+ next;
+ mes "[Turtle Grandpa]";
+ mes "Yet you still want to go there??";
+ emotion 1;
+ 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 "Anywho, 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.... lookee 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 expidition 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 serverly 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.",M_0, "-Um, did you get confused with Al De Baran?",M_1, "-End Conversation.",M_End;
+
+ M_0:
+ 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 unsually 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 one of nature's natural phenomenons.";
+ 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 trully 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 persue the matter untill 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(JORNADAN == 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 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 suddently 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 wokers 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. Fortunatley the ship has yet to sink and seems to be holding up. Still, we must find land soon.";
+ next;
+ mes "[A Voyage Log]";
+ mes "Durring 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 refered 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 sytem 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 worrired.";
+ 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 burry 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 SKULLKEY, 1;
+ set JORNADAN, 0;
+ close;
+}
+
+// Burried treasure --------------------------------------------------------------------
+turn_dun01,160,80,1 script Skull Stone 111,
+{
+ if(SKULLKEY == 1) 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";
+ next;
+ mes "^5555FF(You got 5 Bananas, and 5 Banana Juices.)^000000";
+ getitem 634, 5;
+ getitem 532, 5;
+ set SKULLKEY, 0;
+ close;
+}
diff --git a/npc/cities/aldebaran.txt b/npc/cities/aldebaran.txt
index c0181ea87..450e99ed3 100644
--- a/npc/cities/aldebaran.txt
+++ b/npc/cities/aldebaran.txt
@@ -1,1542 +1,1542 @@
-//===== eAthena Script =======================================
-//= Al De Baran Town
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working.
-//= v1.1 Added RS125 NPC. Added another Kafra Resrve 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]
-//============================================================
-
-
-
-// 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",M_0,"End conversation",M_End;
-
- M_0:
- 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 occasionaly.";
- 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 28;
- next;
- mes "[Senorita Sylvia]";
- mes "Where the hell is it~~~?!";
- emotion 6;
- 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.",M_0,"Not really.",M_End;
-
- M_0:
- 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 32;
- 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?",M_0,"About weapon upgrading",M_1,"End conversation",M_End;
-
- M_0:
- 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",M_0,"Payon Forest",M_1,"End conversation",M_End;
-
- M_0:
- 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 21;
- 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 it's 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 travellers, it also creates a mysterious and unique atmoshpere 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",M_0,"End Conversation",M_End;
-
- M_0:
- mes "[Joanne]";
- mes "When you see bubbles popping up from the sand or a muddy puddle, try diggin 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 srcipt Bebe 703,{
- mes "[Bebe]";
- mes "A while back I went out for a walk towards Mt.Mjolnir, carrying a 'Savage Bebe' with me.";
-M_Menu:
- next;
- menu "Savage Bebe??",M_0,"Mt.Mjolnir??",M_1,"End Conversation",M_End;
-
- M_0:
- mes "[Bebe]";
- mes "A Savage Bebe 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 Bebe!";
- emotion 0;
- 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 19;
- 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 facinated 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 carefull 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 Bebe..? Savage Bebe, where are you!";
- emotion 20;
- close;
-}
-
-// Epthiel -----------------------------------------------------------------
-aldebaran.gat,90,170,4 script Epthiel 47,{
- mes "[Epthiel]";
- mes "Some weapons and armor have slotts in them. This allows you to insert monster cards into them.";
-M_Menu:
- next;
- menu "About the number of slots..",M_0,"Relation between Cards and Slots",M_1,"End Conversation",M_End;
-
- M_0:
- mes "[Epthiel]";
- mes "Items dropped by monsters often times have more slotts than ordinary weapons or armor sold at an NPC shop.";
- next;
- mes "[Epthiel]";
- mes "The greater number of slotts 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 slott 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 unequiped, 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 slott, 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 slott. 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 0;
- 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 7;
- next;
- menu "Gosh, that's too bad.",M_0,".....",M_1;
-
- M_0:
- mes "[Daniel]";
- mes "*~Sigh~* Yeah it really is. You see my girl friend is the Armor Merchants 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 28;
- close;
-}
-
-// Munster -----------------------------------------------------------------
-aldebaran.gat,113,70,2 script Munster 48,{
- mes "[Munster]";
- mes "My family used to live in Geffen, the homeland of blacksmith. We moved to Al De Baran last winter.";
- next;
- mes "[Munster]";
- mes "Back in Geffen my father was a famous blacksmith. Sometimes I heped my father with his work";
- mes "I learned alot about the success rate of ugrading 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 durring the first upgrade.";
- next;
- mes "[Munster]";
- mes "As far as ^0000ffarmor^000000 goes, they can gernerally 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 "Anywho, I hope people will come to re-acquaint themselves with my fathers superior craftmanship.";
- close;
-}
-
-// Phracon Guy --------------------------------------------------------------
-aldebaran.gat,117,181,4 script Pharacon Guy 48,{
- mes "[Phracon Guy]";
- mes "Lv 1 weapons require a metal called 'Pharacon' to be upgraded.";
- next;
- menu "About Pharacon",M_0,"Advice about Phracon",M_1,"End Conversation",M_End;
-
- M_0:
- mes "[Pharacon Guy]";
- mes "It's a very common metal found throughout Rune-Midgard and is used almost exclusively for weapon upgrading.";
- next;
- mes "[Pharacon Guy]";
- mes "Although it's not as strong as other metals, it reamins popular among most people because of its abundance.";
- next;
- mes "[Pharacon Guy]";
- mes "You can obtain Pharacon from monsters or you can purchase it from Forging Workshops located in towns.";
- next;
- mes "[Pharacon Guy]";
- mes "If you don't need Pharacon for upgrading purposes then you can sell it for 100 zeny a piece to NPC's!";
- close;
- M_1:
- mes "[Pharacon Guy]";
- mes "I hear that alot of monsters carry Pharacon. Why don't you go hunt them?";
- mes "You should be able to find a lot of Pharacon without much trouble.";
- next;
- mes "[Pharacon Guy]";
- mes "A couple of days ago, I went hunting with the Pub Master and got a Pharacon dropped from Bebe Savage.";
- close;
- M_2:
- mes "[Pharacon Guy]";
- mes "Good luck on finding some Pharacon -";
- 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 valuble items from abundant materials.";
-M_Menu:
- next;
- menu "About Alchemy of Payon",M_0,"The concept behind Alchemy",M_1,". . . . .",M_2,"End Conversation",M_End;
-
- M_0:
- mes "[Alchemy Guy Chemirre]";
- mes "Payon Alchemy dates as far back as the Alchemy of Al De Baran and originates from Toaism.";
- 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 exceled 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 valuble.";
- 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 slotts on them.";
- mes "Armor dropped by monsters however, will usually have a high number of slotts 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 your done.";
- close;
- M_End:
- mes "[Alchemy Guy Chemirre]";
- mes "Long live the Al De Baran Alchemy Guild!!";
- close;
-
-}
-
-// Nastasia --------------------------------------------------------------
-aldebaran.gat,146,124,4 script Nastasia 101,{
- mes "[Nastasia]";
- mes "Somewhere in Rune-Midgard there exists the ^3355FF' Assassin Guild '^000000.";
- next;
- mes "[Nastasia]";
- 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 1;
- next;
- mes "[Nastasia]";
- mes "And do they collect tuition....??";
- next;
- menu "Continue conversation.",M_0,"End Conversation.",M_End;
-
- M_0:
- 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 thier habits!";
- next;
- menu "About insects",M_0,"End conversation",M_End;
-
- M_0:
- 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 carefull 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 thingy 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 respectfull 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 20;
- next;
- mes "[Joo Jahk]";
- mes "Actually I already did, but I am still concerned.....";
- emotion 4;
- next;
- menu "Continue.",M_0,"End conversation.",M_End;
-
- M_0:
- mes "[Joo Jahk]";
- mes "I 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.",M_0,"End conversation.",M_End;
-
- M_0:
- 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, somwhere in the Mjohlnir Mountains surrounding Al De Baran.";
- next;
- mes "[Gavin]";
- mes "I swear it!";
- emotion 0;
- 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 Mjohlnir 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 23;
- next;
- menu "What's its name?",M_0,". . . . .",M_1;
-
- M_0:
- 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 28;
- next;
- menu "Dude! It's such a common name...",L00,". . . . .",L1;
-
- L00:
- 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 1;
- 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 28;
- close;
-}
-
-// Master ----------------------------------------------------------
-aldeba_in.gat,156,179,4 script Master 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!!!!",M_0,"No way..I am not a pervert.",M_1;
-
- M_0:
- mes "[Master]";
- mes "Alright, here you go, your Favorite Ladies!!! Take a carefull 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",M_00,"(2) Blossom",M_01,"(3) Jasmine",M_02,"(4) Roxie",M_03,"(5) Leilah",M_04,"(6) Curly Sue.",M_05;
-
- M_00:
- mes "[Master]";
- mes "Oh~ So your 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 0;
- close;
- M_02:
- mes "[Master]";
- mes "Gentel, sexy, sweet, and beautifull.... 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 18;
- close;
- M_04:
- mes "[Master]";
- mes "Into the cold, analitical 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 0;
- next;
- mes "[Master]";
- mes "A thirst for young girls~~! It's a c-c-crime!!!!";
- emotion 19;
- 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 refered 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 becamed 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 elses 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 "Remeber 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 wonderfull to trully 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 earlier, 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 "Anyways, he's constantly bugging me and I think I'm gonna be crazy beacuse of him... Oh my godness!";
- 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 elses house?";
- emotion 1;
- next;
- mes "[Evil Looking Guy]";
- mes "Now I'm upset! What reason do you have to come in here and bother me??";
- emotion 32;
- 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.",M_0, "Nah... just messin around....",M_1;
-
- M_0:
- 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 Mercenarys' 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 adition, he/she should have a snowy and skinny neck!";
- mes "And if the Mercenarys' 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 Mercenarys' 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 0;
- 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 comming 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 THOUSNAD YEARS?!",M_0, "Ahh~ Shut Up!",M_1, "You got a boyfriend?",M_2;
-
- M_0:
- 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 6;
- next;
- mes "[Kafra Jasmine]";
- mes "..... Eh!... heh... heh... um...";
- emotion 19;
- 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 4;
- cutin "kafra_03",255;
- close;
- M_1:
- mes "[Kafra Jasmine]";
- mes ". . . . .";
- emotion 6;
- 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 speciality 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 32;
- cutin "kafra_03",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 18;
- cutin "kafra_03",255;
- close;
-}
-
-// Special Reserve ----------------------------------------------
-aldeba_in.gat,79,161,6 script Kafra 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 usefull items and cool prizes.";
- next;
- mes "[Kafra]";
- mes "Each Kafra will allow 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 Lotery 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 502, 7;
- set RESRVPTS, RESRVPTS - 1100;
- close;
- M_2b:
- if(RESRVPTS < 1300) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 15;
- set RESRVPTS, RESRVPTS - 1300;
- close;
- M_2c:
- if(RESRVPTS < 1500) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 25;
- set RESRVPTS, RESRVPTS - 1500;
- close;
- M_2d:
- if(RESRVPTS < 1700) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 35;
- set RESRVPTS, RESRVPTS - 1700;
- close;
- M_2e:
- if(RESRVPTS < 1900) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 50;
- set RESRVPTS, RESRVPTS - 1900;
- close;
- M_2f:
- if(RESRVPTS < 2100) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 60;
- set RESRVPTS, RESRVPTS - 2100;
- close;
- M_2g:
- if(RESRVPTS < 2300) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 75;
- set RESRVPTS, RESRVPTS - 2300;
- close;
- M_2h:
- if(RESRVPTS < 2500) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 85;
- set RESRVPTS, RESRVPTS - 2500;
- close;
- M_2i:
- if(RESRVPTS < 2800) goto sL_LowPts2;
- mes "[Kafra]";
- mes "Here you are.";
- getitem 502, 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 "kafra_03",255;
- close;
-}
-
-// Special Reserve 2 ----------------------------------------------
-aldeba_in.gat,88,161,3 script Kafra 115,
-{
- cutin "kafra_03",2;
- mes "[Kafra]";
- mes "Hello and welcome to the Kafra Corp. Main office.";
- cutin "",255;
- close;
-
-// will implement this part when I find out what items to use for the prizes
- 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 "kafra_03",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 "kafra_03",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 <= 4) goto sL_Prize3;
- if(@temp <= 7) goto sL_Prize2;
-
- sL_Prize1:
- mes "[Kafra]";
- mes "WOW!!!!..... You win!!! 1st Prize~! Congratulations~~ You got the 1st prize~~";
- if(@Lotto == 1) getitem, 2328,1;
- if(@Lotto == 2) getitem, 2307,1; //don't know if this is the correct item
- //if(@Lotto == 3) getitem, ,1
- //if(@Lotto == 4) getitem, ,1
- //if(@Lotto == 5) getitem, ,1
- return;
- sL_Prize2:
- mes "[Kafra]";
- mes "Oh wow! You've won the 2nd prize! Congratulations!!";
- if(@Lotto == 1) getitem 2220, 1;
- if(@Lotto == 2) getitem 2403, 1; //don't know if this is the correct item
- //if(@Lotto == 3) getitem, ,1
- //if(@Lotto == 4) getitem, ,1
- //if(@Lotto == 5) getitem, ,1
- return;
- sL_Prize3:
- mes "[Kafra]";
- mes "Congratulations! You've won the 3rd prize.";
- if(@Lotto == 1) getitem 516, 100;
- if(@Lotto == 2) getitem 502, 100;
- //if(@Lotto == 3) getitem, ,1
- //if(@Lotto == 4) getitem, ,1
- //if(@Lotto == 5) getitem, ,1
- 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 Kafra service's first Kafra type 'Pavianne'";
- next;
- mes "[Kafra Pavianne]";
- mes "Our Kafra Service is always trying to achieve 100% customer satisfaction based on the 3 principles of Trust, Devotion, and Honesty.";
- next;
- mes "[Kafra Pavianne]";
- mes "With complete service training and supervision, we are able to fully meet the needs of our customers.";
- next;
- menu "Buy a Kafra Pass",M_0,"What is a Kafra Pass",M_1,"Good Bye",M_3;
-
- M_0:
- if(Zeny < 2000) goto sL_Zeny;
- mes "[Kafra Pavianne]";
- mes "Thank you for using our Kafra Service! Have a Nice Day!";
- getitem 1084,1;
- set Zeny, Zeny-2000;
- emotion 15;
- cutin "kafra_01",255;
- close;
-
- sL_Zeny:
- mes "[Kafra Pavianne]";
- mes "I'm sorry but you don't have enough zeny.";
- close;
-
- M_1:
- mes "[Kafra Pavianne]";
- mes "It's the best gift you can get yourself and it can only be found at the Kafra Main Office!";
- next;
- mes "[Kafra Pavianne]";
- mes "With a Kafra Pass, you could experience the convenience of Kafra Service world-wide! Hassle free! The price is 2000 zeny~~";
- next;
- mes "[Kafra Pavianne]";
- mes "Visit any Kafra Service in Rune-Midgard, and you could enjoy Kafra Service any time any where for once.";
- mes "Ending a conversation with Kafra Service Agent will expire the pass.";
- cutin "kafra_01",255;
- close;
- M_3:
- mes "[Kafra Pavianne]";
- mes "Thank you for using Kafra Services! I'm Kafra Pavianne, and it was a pleasure to assist you.";
- emotion 15;
- cutin "kafra_01",255;
- close;
-}
-
-// 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 32;
- 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~!",M_0,"Ehhaha",M_1;
-
- M_0:
- mes "[Kafra Blossom]";
- mes "Really! Thank you sooo much!! Here is... my... autograph...";
- emotion 15;
- next;
- mes "[Kafra Blossom]";
- mes "Don't bother to look in your Item Iventory for it. It won't be there... tehehe... for my autograph will remail winthin your heart.";
- emotion 33;
- cutin "kafra_02",255;
- close;
- M_1:
- mes "[Kafra Blossom]";
- mes "Huh? . . . . . That's all? Phew~ such a dull customer...";
- emotion 1;
- cutin "kafra_02",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 personel, 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 momy?",M_0,"End conversation",M_End;
-
- M_0:
- mes "[Kafra Curly Sue]";
- mes ".... Sob~sob~... WHAT?? I'm NOT some KID!!";
- emotion 28;
- next;
- cutin "kafra_06",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 "kafra_06",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 4;
- cutin "kafra_04",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.",M_0,"About the Committee of 'Heaven on Earth'.",M_1,"Quit.",M_End;
-
- M_0:
- 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 seperated 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",sM_0,"What are they?",sM_1;
-
- sM_0:
- 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 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",M_0,"About the 4th Floor",M_1,"Move to the 4th Floor",M_2,"End mesue",M_End;
-
- M_0:
- 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 Clocktower ";
- 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 disapeared.";
- 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;
- 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;
- delitem 7026,1;
- 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 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",M_0,"About B4th Floor",M_1,"Move to the B4th Floor",M_2,"End mesue",M_End;
-
- M_0:
- 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 Clocktower";
- 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 disapeared.";
- 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;
- 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;
- delitem 7027,1;
- 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.3
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working.
+//= v1.1 Added RS125 NPC. Added another Kafra Resrve 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]
+//============================================================
+
+
+
+// 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",M_0,"End conversation",M_End;
+
+ M_0:
+ 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 occasionaly.";
+ 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 28;
+ next;
+ mes "[Senorita Sylvia]";
+ mes "Where the hell is it~~~?!";
+ emotion 6;
+ 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.",M_0,"Not really.",M_End;
+
+ M_0:
+ 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 32;
+ 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?",M_0,"About weapon upgrading",M_1,"End conversation",M_End;
+
+ M_0:
+ 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",M_0,"Payon Forest",M_1,"End conversation",M_End;
+
+ M_0:
+ 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 21;
+ 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 it's 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 travellers, it also creates a mysterious and unique atmoshpere 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",M_0,"End Conversation",M_End;
+
+ M_0:
+ mes "[Joanne]";
+ mes "When you see bubbles popping up from the sand or a muddy puddle, try diggin 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 srcipt Bebe 703,{
+ mes "[Bebe]";
+ mes "A while back I went out for a walk towards Mt.Mjolnir, carrying a 'Savage Bebe' with me.";
+M_Menu:
+ next;
+ menu "Savage Bebe??",M_0,"Mt.Mjolnir??",M_1,"End Conversation",M_End;
+
+ M_0:
+ mes "[Bebe]";
+ mes "A Savage Bebe 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 Bebe!";
+ emotion 0;
+ 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 19;
+ 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 facinated 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 carefull 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 Bebe..? Savage Bebe, where are you!";
+ emotion 20;
+ close;
+}
+
+// Epthiel -----------------------------------------------------------------
+aldebaran.gat,90,170,4 script Epthiel 47,{
+ mes "[Epthiel]";
+ mes "Some weapons and armor have slotts in them. This allows you to insert monster cards into them.";
+M_Menu:
+ next;
+ menu "About the number of slots..",M_0,"Relation between Cards and Slots",M_1,"End Conversation",M_End;
+
+ M_0:
+ mes "[Epthiel]";
+ mes "Items dropped by monsters often times have more slotts than ordinary weapons or armor sold at an NPC shop.";
+ next;
+ mes "[Epthiel]";
+ mes "The greater number of slotts 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 slott 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 unequiped, 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 slott, 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 slott. 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 0;
+ 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 7;
+ next;
+ menu "Gosh, that's too bad.",M_0,".....",M_1;
+
+ M_0:
+ mes "[Daniel]";
+ mes "*~Sigh~* Yeah it really is. You see my girl friend is the Armor Merchants 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 28;
+ close;
+}
+
+// Munster -----------------------------------------------------------------
+aldebaran.gat,113,70,2 script Munster 48,{
+ mes "[Munster]";
+ mes "My family used to live in Geffen, the homeland of blacksmith. We moved to Al De Baran last winter.";
+ next;
+ mes "[Munster]";
+ mes "Back in Geffen my father was a famous blacksmith. Sometimes I heped my father with his work";
+ mes "I learned alot about the success rate of ugrading 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 durring the first upgrade.";
+ next;
+ mes "[Munster]";
+ mes "As far as ^0000ffarmor^000000 goes, they can gernerally 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 "Anywho, I hope people will come to re-acquaint themselves with my fathers superior craftmanship.";
+ close;
+}
+
+// Phracon Guy --------------------------------------------------------------
+aldebaran.gat,117,181,4 script Pharacon Guy 48,{
+ mes "[Phracon Guy]";
+ mes "Lv 1 weapons require a metal called 'Pharacon' to be upgraded.";
+ next;
+ menu "About Pharacon",M_0,"Advice about Phracon",M_1,"End Conversation",M_End;
+
+ M_0:
+ mes "[Pharacon Guy]";
+ mes "It's a very common metal found throughout Rune-Midgard and is used almost exclusively for weapon upgrading.";
+ next;
+ mes "[Pharacon Guy]";
+ mes "Although it's not as strong as other metals, it reamins popular among most people because of its abundance.";
+ next;
+ mes "[Pharacon Guy]";
+ mes "You can obtain Pharacon from monsters or you can purchase it from Forging Workshops located in towns.";
+ next;
+ mes "[Pharacon Guy]";
+ mes "If you don't need Pharacon for upgrading purposes then you can sell it for 100 zeny a piece to NPC's!";
+ close;
+ M_1:
+ mes "[Pharacon Guy]";
+ mes "I hear that alot of monsters carry Pharacon. Why don't you go hunt them?";
+ mes "You should be able to find a lot of Pharacon without much trouble.";
+ next;
+ mes "[Pharacon Guy]";
+ mes "A couple of days ago, I went hunting with the Pub Master and got a Pharacon dropped from Bebe Savage.";
+ close;
+ M_2:
+ mes "[Pharacon Guy]";
+ mes "Good luck on finding some Pharacon -";
+ 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 valuble items from abundant materials.";
+M_Menu:
+ next;
+ menu "About Alchemy of Payon",M_0,"The concept behind Alchemy",M_1,". . . . .",M_2,"End Conversation",M_End;
+
+ M_0:
+ mes "[Alchemy Guy Chemirre]";
+ mes "Payon Alchemy dates as far back as the Alchemy of Al De Baran and originates from Toaism.";
+ 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 exceled 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 valuble.";
+ 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 slotts on them.";
+ mes "Armor dropped by monsters however, will usually have a high number of slotts 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 your done.";
+ close;
+ M_End:
+ mes "[Alchemy Guy Chemirre]";
+ mes "Long live the Al De Baran Alchemy Guild!!";
+ close;
+
+}
+
+// Nastasia --------------------------------------------------------------
+aldebaran.gat,146,124,4 script Nastasia 101,{
+ mes "[Nastasia]";
+ mes "Somewhere in Rune-Midgard there exists the ^3355FF' Assassin Guild '^000000.";
+ next;
+ mes "[Nastasia]";
+ 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 1;
+ next;
+ mes "[Nastasia]";
+ mes "And do they collect tuition....??";
+ next;
+ menu "Continue conversation.",M_0,"End Conversation.",M_End;
+
+ M_0:
+ 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 thier habits!";
+ next;
+ menu "About insects",M_0,"End conversation",M_End;
+
+ M_0:
+ 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 carefull 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 thingy 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 respectfull 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 20;
+ next;
+ mes "[Joo Jahk]";
+ mes "Actually I already did, but I am still concerned.....";
+ emotion 4;
+ next;
+ menu "Continue.",M_0,"End conversation.",M_End;
+
+ M_0:
+ mes "[Joo Jahk]";
+ mes "I 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.",M_0,"End conversation.",M_End;
+
+ M_0:
+ 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, somwhere in the Mjohlnir Mountains surrounding Al De Baran.";
+ next;
+ mes "[Gavin]";
+ mes "I swear it!";
+ emotion 0;
+ 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 Mjohlnir 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 23;
+ next;
+ menu "What's its name?",M_0,". . . . .",M_1;
+
+ M_0:
+ 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 28;
+ next;
+ menu "Dude! It's such a common name...",L00,". . . . .",L1;
+
+ L00:
+ 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 1;
+ 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 28;
+ close;
+}
+
+// Master ----------------------------------------------------------
+aldeba_in.gat,156,179,4 script Master 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!!!!",M_0,"No way..I am not a pervert.",M_1;
+
+ M_0:
+ mes "[Master]";
+ mes "Alright, here you go, your Favorite Ladies!!! Take a carefull 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",M_00,"(2) Blossom",M_01,"(3) Jasmine",M_02,"(4) Roxie",M_03,"(5) Leilah",M_04,"(6) Curly Sue.",M_05;
+
+ M_00:
+ mes "[Master]";
+ mes "Oh~ So your 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 0;
+ close;
+ M_02:
+ mes "[Master]";
+ mes "Gentel, sexy, sweet, and beautifull.... 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 18;
+ close;
+ M_04:
+ mes "[Master]";
+ mes "Into the cold, analitical 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 0;
+ next;
+ mes "[Master]";
+ mes "A thirst for young girls~~! It's a c-c-crime!!!!";
+ emotion 19;
+ 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 refered 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 becamed 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 elses 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 "Remeber 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 wonderfull to trully 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 earlier, 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 "Anyways, he's constantly bugging me and I think I'm gonna be crazy beacuse of him... Oh my godness!";
+ 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 elses house?";
+ emotion 1;
+ next;
+ mes "[Evil Looking Guy]";
+ mes "Now I'm upset! What reason do you have to come in here and bother me??";
+ emotion 32;
+ 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.",M_0, "Nah... just messin around....",M_1;
+
+ M_0:
+ 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 Mercenarys' 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 adition, he/she should have a snowy and skinny neck!";
+ mes "And if the Mercenarys' 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 Mercenarys' 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 0;
+ 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 comming 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 THOUSNAD YEARS?!",M_0, "Ahh~ Shut Up!",M_1, "You got a boyfriend?",M_2;
+
+ M_0:
+ 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 6;
+ next;
+ mes "[Kafra Jasmine]";
+ mes "..... Eh!... heh... heh... um...";
+ emotion 19;
+ 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 4;
+ cutin "kafra_03",255;
+ close;
+ M_1:
+ mes "[Kafra Jasmine]";
+ mes ". . . . .";
+ emotion 6;
+ 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 speciality 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 32;
+ cutin "kafra_03",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 18;
+ cutin "kafra_03",255;
+ close;
+}
+
+// Special Reserve ----------------------------------------------
+aldeba_in.gat,79,161,6 script Kafra 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 usefull items and cool prizes.";
+ next;
+ mes "[Kafra]";
+ mes "Each Kafra will allow 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 Lotery 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 502, 7;
+ set RESRVPTS, RESRVPTS - 1100;
+ close;
+ M_2b:
+ if(RESRVPTS < 1300) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 15;
+ set RESRVPTS, RESRVPTS - 1300;
+ close;
+ M_2c:
+ if(RESRVPTS < 1500) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 25;
+ set RESRVPTS, RESRVPTS - 1500;
+ close;
+ M_2d:
+ if(RESRVPTS < 1700) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 35;
+ set RESRVPTS, RESRVPTS - 1700;
+ close;
+ M_2e:
+ if(RESRVPTS < 1900) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 50;
+ set RESRVPTS, RESRVPTS - 1900;
+ close;
+ M_2f:
+ if(RESRVPTS < 2100) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 60;
+ set RESRVPTS, RESRVPTS - 2100;
+ close;
+ M_2g:
+ if(RESRVPTS < 2300) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 75;
+ set RESRVPTS, RESRVPTS - 2300;
+ close;
+ M_2h:
+ if(RESRVPTS < 2500) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 85;
+ set RESRVPTS, RESRVPTS - 2500;
+ close;
+ M_2i:
+ if(RESRVPTS < 2800) goto sL_LowPts2;
+ mes "[Kafra]";
+ mes "Here you are.";
+ getitem 502, 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 "kafra_03",255;
+ close;
+}
+
+// Special Reserve 2 ----------------------------------------------
+aldeba_in.gat,88,161,3 script Kafra 115,
+{
+ cutin "kafra_03",2;
+ mes "[Kafra]";
+ mes "Hello and welcome to the Kafra Corp. Main office.";
+ cutin "",255;
+ close;
+
+// will implement this part when I find out what items to use for the prizes
+ 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 "kafra_03",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 "kafra_03",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 <= 4) goto sL_Prize3;
+ if(@temp <= 7) goto sL_Prize2;
+
+ sL_Prize1:
+ mes "[Kafra]";
+ mes "WOW!!!!..... You win!!! 1st Prize~! Congratulations~~ You got the 1st prize~~";
+ if(@Lotto == 1) getitem, 2328,1;
+ if(@Lotto == 2) getitem, 2307,1; //don't know if this is the correct item
+ //if(@Lotto == 3) getitem, ,1
+ //if(@Lotto == 4) getitem, ,1
+ //if(@Lotto == 5) getitem, ,1
+ return;
+ sL_Prize2:
+ mes "[Kafra]";
+ mes "Oh wow! You've won the 2nd prize! Congratulations!!";
+ if(@Lotto == 1) getitem 2220, 1;
+ if(@Lotto == 2) getitem 2403, 1; //don't know if this is the correct item
+ //if(@Lotto == 3) getitem, ,1
+ //if(@Lotto == 4) getitem, ,1
+ //if(@Lotto == 5) getitem, ,1
+ return;
+ sL_Prize3:
+ mes "[Kafra]";
+ mes "Congratulations! You've won the 3rd prize.";
+ if(@Lotto == 1) getitem 516, 100;
+ if(@Lotto == 2) getitem 502, 100;
+ //if(@Lotto == 3) getitem, ,1
+ //if(@Lotto == 4) getitem, ,1
+ //if(@Lotto == 5) getitem, ,1
+ 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 Kafra service's first Kafra type 'Pavianne'";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Our Kafra Service is always trying to achieve 100% customer satisfaction based on the 3 principles of Trust, Devotion, and Honesty.";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "With complete service training and supervision, we are able to fully meet the needs of our customers.";
+ next;
+ menu "Buy a Kafra Pass",M_0,"What is a Kafra Pass",M_1,"Good Bye",M_3;
+
+ M_0:
+ if(Zeny < 2000) goto sL_Zeny;
+ mes "[Kafra Pavianne]";
+ mes "Thank you for using our Kafra Service! Have a Nice Day!";
+ getitem 1084,1;
+ set Zeny, Zeny-2000;
+ emotion 15;
+ cutin "kafra_01",255;
+ close;
+
+ sL_Zeny:
+ mes "[Kafra Pavianne]";
+ mes "I'm sorry but you don't have enough zeny.";
+ close;
+
+ M_1:
+ mes "[Kafra Pavianne]";
+ mes "It's the best gift you can get yourself and it can only be found at the Kafra Main Office!";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "With a Kafra Pass, you could experience the convenience of Kafra Service world-wide! Hassle free! The price is 2000 zeny~~";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Visit any Kafra Service in Rune-Midgard, and you could enjoy Kafra Service any time any where for once.";
+ mes "Ending a conversation with Kafra Service Agent will expire the pass.";
+ cutin "kafra_01",255;
+ close;
+ M_3:
+ mes "[Kafra Pavianne]";
+ mes "Thank you for using Kafra Services! I'm Kafra Pavianne, and it was a pleasure to assist you.";
+ emotion 15;
+ cutin "kafra_01",255;
+ close;
+}
+
+// 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 32;
+ 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~!",M_0,"Ehhaha",M_1;
+
+ M_0:
+ mes "[Kafra Blossom]";
+ mes "Really! Thank you sooo much!! Here is... my... autograph...";
+ emotion 15;
+ next;
+ mes "[Kafra Blossom]";
+ mes "Don't bother to look in your Item Iventory for it. It won't be there... tehehe... for my autograph will remail winthin your heart.";
+ emotion 33;
+ cutin "kafra_02",255;
+ close;
+ M_1:
+ mes "[Kafra Blossom]";
+ mes "Huh? . . . . . That's all? Phew~ such a dull customer...";
+ emotion 1;
+ cutin "kafra_02",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 personel, 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 momy?",M_0,"End conversation",M_End;
+
+ M_0:
+ mes "[Kafra Curly Sue]";
+ mes ".... Sob~sob~... WHAT?? I'm NOT some KID!!";
+ emotion 28;
+ next;
+ cutin "kafra_06",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 "kafra_06",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 4;
+ cutin "kafra_04",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.",M_0,"About the Committee of 'Heaven on Earth'.",M_1,"Quit.",M_End;
+
+ M_0:
+ 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 seperated 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",sM_0,"What are they?",sM_1;
+
+ sM_0:
+ 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 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",M_0,"About the 4th Floor",M_1,"Move to the 4th Floor",M_2,"End mesue",M_End;
+
+ M_0:
+ 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 Clocktower ";
+ 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 disapeared.";
+ 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;
+ 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;
+ delitem 7026,1;
+ 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 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",M_0,"About B4th Floor",M_1,"Move to the B4th Floor",M_2,"End mesue",M_End;
+
+ M_0:
+ 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 Clocktower";
+ 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 disapeared.";
+ 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;
+ 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;
+ delitem 7027,1;
+ 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 bdc3724a6..aca2c18c9 100644
--- a/npc/cities/amatsu.txt
+++ b/npc/cities/amatsu.txt
@@ -1,1479 +1,1479 @@
-//===== eAthena Script =======================================
-//= Amatsu Script
-//===== By: ==================================================
-//= Some people & eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.01
-//===== 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
-//=====================================================================
-alberta.gat,245,93,4 script Captain 709,{
- mes "[Carter Moores]";
- mes "Did you know that on the other side of the ocean";
- mes "there lives a mysterious culture, ";
- mes "with stories totally unheard of in this country.";
- mes "Have you heard of it before?";
- next;
- menu "I want to know more about Amatsu",L1,"Go to Amatsu",L2,"End Dialogue",-;
- mes "[Carter Moores]";
- mes "If you are a true adventurer,";
- mes "you should try to leave this continent.";
- mes "Nothing is more exciting than learning about new cultures...";
- mes "However, do whatever you want.";
- close;
- L1:
- mes "[Carter Moores]";
- mes "The legend says, a sailor got lost on the sea,";
- mes "in midst of drifting in the sea,";
- mes "he discovered it...";
- mes "In the mighty storm and the mist, ";
- mes "the ship is undoubtedly lost.";
- next;
- mes "[Carter Moores]";
- mes "After the ship sunk";
- mes "he reached a village.";
- mes "It is now called Amatsu,";
- mes "The sailor was later rescued by the locals.";
- mes "As he worked hard over there,";
- mes "I heard that he later finished a map.";
- next;
- mes "[Carter Moores]";
- mes "He died soon after his return,";
- mes "but the map was indeed passed onto Tristian the Third.";
- mes "Later, the king ordered";
- mes "that whoever is able to open a route,";
- mes "that leads to Amatsu, will get a reward from the king.";
- mes "He gave everyone a copy of the map";
- next;
- mes "[Carter Moores]";
- mes "What the people want is not the reward,";
- mes "but to get the trading opportunity with other countries.";
- mes "The benefits from this is almost unimaginable.";
- mes "Therefore, many adventurers and bold captains";
- mes "took the map,";
- mes "And headed for the ocean...";
- next;
- mes "[Carter Moores]";
- mes "But all of them have failed!";
- mes "To face the gigantic current and the unpredictable weather,";
- mes "one needed to be familiar with sailing and the ocean.";
- mes "However, all of them were blinded by the reward and desire for the trade rights,";
- mes "and failed to make the necessary preparations";
- next;
- mes "[Carter Moores]";
- mes "At this time, someone found it,";
- mes "the entire route to Amatsu...";
- mes "And that guy is me, Mr. Carter Moores,";
- mes "the first person to start trading with Amatsu!";
- mes "Hahaha! That's pretty much it";
- next;
- mes "[Carter Moores]";
- mes "I made quite a bit of zeny from the trade,";
- mes "and am now trying to start a tourism industry.";
- mes "Do a little investment.";
- mes "If you want to go to Amatsu,";
- mes "then just tell me...!";
- close;
- L2:
- mes "[Carter Moores]";
- mes "Yea, Amatsu is a great place!";
- mes "Because to cross that treacherous ocean";
- mes "is not a very easy thing to do.";
- mes "I hope you find the travelling fee acceptable.";
- next;
- mes "[Carter Moores]";
- mes "The round trip costs 10,000 Zeny.";
- mes "Our commercial vessels are very sturdy.";
- mes "The passenger rooms are specially designed as well.";
- next;
- mes "[Carter Moores]";
- mes "So, have you decided to leave?";
- mes "Do you have enough zeny for travelling?";
- next;
- menu "Yes",Lgo,"No",-;
- mes "[Carter Moores]";
- mes "Not drawn to this new continent?";
- mes "People never like";
- mes "to head for the far coast on the other side.";
- close;
- Lgo:
- if (Zeny < 10000) goto Lzeny;
- set Zeny, Zeny-10000;
- mes "[Carter Moores]";
- mes "All aboard!";
- next;
- warp "amatsu",197,83;
- break;
- Lzeny:
- mes "[Carter Moores]";
- 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 Captain 709,{
- mes "[Carter Moores]";
- mes "Ready to leave?";
- mes "Probably had lots of fun in the Amatsu Tour!";
- mes "Are you really ready to leave?";
- menu "Time to go home!",L1,"I will stay a bit longer",-;
- mes "[Carter Moores]";
- mes "Alright! Roger that.";
- mes "The vessel for return will always be ready.";
- mes "Have a good trip.";
- close;
- L1:
- mes "[Carter Moores]";
- mes "Set sail.";
- mes "Don't know if you are bringing back any";
- mes "souvenirs.";
- next;
- warp "alberta",243,91;
- break;
-}
-//=====================================================================
-// 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;
-}
-//=====================================================================
-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 huntry?";
- 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:
- mes "[ShabuShabu]";
- mes "Hmm! Thank you so much";
- next;
- delitem 964,10;
- getitem 551,20;
- mes "[ShabuShabu]";
- mes "Here is my thanks, take it!";
- set ama_sushi,0;
- close;
-
-}
-//=====================================================================
-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 Everything's Blue";
- next;
- goto LEnd;
-L1:
- mes "[Kuruchi]";
- mes "Monk, Monk, the fox is following me";
- mes "Because I have its favorite food";
- mes "Ramen noodle, my favorite 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 NoodleIs 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,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 apparence, whoohoohoohooo.";
- close;
-}
-//=====================================================================
-//Done Done Done
-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,171,174,4 script Guard Soldier 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 767,{
-//FlagGET
- 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 "[Guardian 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;
-}
-//=====================================================================
-amatsu.gat,119,164,4 script Guard Soldier 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 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 travellers to come in and out.";
- mes "Now you may go in.";
- close;
-}
-
-//=====================================================================
-ama_in01.gat,22,111,0 script Old Lady 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 til";
- mes "the Ishida Family line ends!";
- mes "Stop bothering me and get out! Clang Clannng!^000000";
- next;
- warp "amatsu",167,197;
- break;
-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 goddamed 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;
- break;
-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,207,40,6 script Guard Soldier 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 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 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,170,62,4 script Soldier 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",L1,"I want to live here",L2,"Nothing",L3;
-L1:
- 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,37,157,4 script Soldier 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 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 ¤h§L 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 767,{
-// npcs made by eAthena
- 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;
-}
-// eAthena Team
-//=====================================================================
-ama_in02.gat,203,156,4 script Soldier 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;
-}
-// eAthena Dev Team
-//=====================================================================
-ama_in02.gat,195,156,4 script Soldier 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;
-}
-//=====================================================================
-// eAthena Team
-ama_in02.gat,115,177,7 script §L¤h 767,{
- mes "[Juro]";
- mes "What are you here for?";
- mes "There is nothing much over here.";
- next;
- menu "Oh, really",L1,"Please open the door for me",L2;
-L1:
- 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",L2_1,"Listen to explanation",L2_2;
-L2_1:
- mes "[Juro]";
- mes "Then, I will open the door for you.";
- mes "Please take care...";
- next;
- warp "ama_dun01.gat",229,10;
- break;
-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 existance 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;
- break;
-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 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;
- break;
-L1:
- mes "[Juro]";
- mes "Take care of yourself!";
- close;
-}
-
-//=====================================================================
-// eAthena Team
-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;
-}
-// eAthena Dev Team
-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 "Iit 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 summoming 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 Dev Team
-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;
-}
-// eAthena Dev Team
-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 3;
- 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;
-}
-// eAthena Dev Team
-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 "Everytime 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;
-}
-// eAthena Dev Team
-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 bueaty";
- 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?",L1,"Speaking of bullshit...",L2;
-L1:
- mes "[Sakura Seiichi]";
- mes "... Maybe...";
- mes "Anyways, do you believe me or not";
- mes "want to make a bet...?";
- next;
- emotion 9;
- 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 anymore,^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 "becareful, one day that kind of things";
- mes "Will happen to you as well..";
- next;
- Emotion 9;
- 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 anymore,^000000";
- mes "^6633FFI don't understand why she told^000000";
- mes "^6633FFMe that...^000000";
- close;
-}
-// eAthena Dev Team
-amatsu.gat,283,203,1 script PokePoke 738,{
- Emotion 19;
- 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 19;
- 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 19;
- 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 19;
- 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;
-}
-// eAthena Dev Team
-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 "Drawinging 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;
-}
-
+//===== eAthena Script =======================================
+//= Amatsu Script
+//===== By: ==================================================
+//= Some people & eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.01
+//===== 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
+//=====================================================================
+alberta.gat,245,93,4 script Captain 709,{
+ mes "[Carter Moores]";
+ mes "Did you know that on the other side of the ocean";
+ mes "there lives a mysterious culture, ";
+ mes "with stories totally unheard of in this country.";
+ mes "Have you heard of it before?";
+ next;
+ menu "I want to know more about Amatsu",L1,"Go to Amatsu",L2,"End Dialogue",-;
+ mes "[Carter Moores]";
+ mes "If you are a true adventurer,";
+ mes "you should try to leave this continent.";
+ mes "Nothing is more exciting than learning about new cultures...";
+ mes "However, do whatever you want.";
+ close;
+ L1:
+ mes "[Carter Moores]";
+ mes "The legend says, a sailor got lost on the sea,";
+ mes "in midst of drifting in the sea,";
+ mes "he discovered it...";
+ mes "In the mighty storm and the mist, ";
+ mes "the ship is undoubtedly lost.";
+ next;
+ mes "[Carter Moores]";
+ mes "After the ship sunk";
+ mes "he reached a village.";
+ mes "It is now called Amatsu,";
+ mes "The sailor was later rescued by the locals.";
+ mes "As he worked hard over there,";
+ mes "I heard that he later finished a map.";
+ next;
+ mes "[Carter Moores]";
+ mes "He died soon after his return,";
+ mes "but the map was indeed passed onto Tristian the Third.";
+ mes "Later, the king ordered";
+ mes "that whoever is able to open a route,";
+ mes "that leads to Amatsu, will get a reward from the king.";
+ mes "He gave everyone a copy of the map";
+ next;
+ mes "[Carter Moores]";
+ mes "What the people want is not the reward,";
+ mes "but to get the trading opportunity with other countries.";
+ mes "The benefits from this is almost unimaginable.";
+ mes "Therefore, many adventurers and bold captains";
+ mes "took the map,";
+ mes "And headed for the ocean...";
+ next;
+ mes "[Carter Moores]";
+ mes "But all of them have failed!";
+ mes "To face the gigantic current and the unpredictable weather,";
+ mes "one needed to be familiar with sailing and the ocean.";
+ mes "However, all of them were blinded by the reward and desire for the trade rights,";
+ mes "and failed to make the necessary preparations";
+ next;
+ mes "[Carter Moores]";
+ mes "At this time, someone found it,";
+ mes "the entire route to Amatsu...";
+ mes "And that guy is me, Mr. Carter Moores,";
+ mes "the first person to start trading with Amatsu!";
+ mes "Hahaha! That's pretty much it";
+ next;
+ mes "[Carter Moores]";
+ mes "I made quite a bit of zeny from the trade,";
+ mes "and am now trying to start a tourism industry.";
+ mes "Do a little investment.";
+ mes "If you want to go to Amatsu,";
+ mes "then just tell me...!";
+ close;
+ L2:
+ mes "[Carter Moores]";
+ mes "Yea, Amatsu is a great place!";
+ mes "Because to cross that treacherous ocean";
+ mes "is not a very easy thing to do.";
+ mes "I hope you find the travelling fee acceptable.";
+ next;
+ mes "[Carter Moores]";
+ mes "The round trip costs 10,000 Zeny.";
+ mes "Our commercial vessels are very sturdy.";
+ mes "The passenger rooms are specially designed as well.";
+ next;
+ mes "[Carter Moores]";
+ mes "So, have you decided to leave?";
+ mes "Do you have enough zeny for travelling?";
+ next;
+ menu "Yes",Lgo,"No",-;
+ mes "[Carter Moores]";
+ mes "Not drawn to this new continent?";
+ mes "People never like";
+ mes "to head for the far coast on the other side.";
+ close;
+ Lgo:
+ if (Zeny < 10000) goto Lzeny;
+ set Zeny, Zeny-10000;
+ mes "[Carter Moores]";
+ mes "All aboard!";
+ next;
+ warp "amatsu",197,83;
+ break;
+ Lzeny:
+ mes "[Carter Moores]";
+ 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 Captain 709,{
+ mes "[Carter Moores]";
+ mes "Ready to leave?";
+ mes "Probably had lots of fun in the Amatsu Tour!";
+ mes "Are you really ready to leave?";
+ menu "Time to go home!",L1,"I will stay a bit longer",-;
+ mes "[Carter Moores]";
+ mes "Alright! Roger that.";
+ mes "The vessel for return will always be ready.";
+ mes "Have a good trip.";
+ close;
+ L1:
+ mes "[Carter Moores]";
+ mes "Set sail.";
+ mes "Don't know if you are bringing back any";
+ mes "souvenirs.";
+ next;
+ warp "alberta",243,91;
+ break;
+}
+//=====================================================================
+// 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;
+}
+//=====================================================================
+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 huntry?";
+ 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:
+ mes "[ShabuShabu]";
+ mes "Hmm! Thank you so much";
+ next;
+ delitem 964,10;
+ getitem 551,20;
+ mes "[ShabuShabu]";
+ mes "Here is my thanks, take it!";
+ set ama_sushi,0;
+ close;
+
+}
+//=====================================================================
+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 Everything's Blue";
+ next;
+ goto LEnd;
+L1:
+ mes "[Kuruchi]";
+ mes "Monk, Monk, the fox is following me";
+ mes "Because I have its favorite food";
+ mes "Ramen noodle, my favorite 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 NoodleIs 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,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 apparence, whoohoohoohooo.";
+ close;
+}
+//=====================================================================
+//Done Done Done
+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,171,174,4 script Guard Soldier 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 767,{
+//FlagGET
+ 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 "[Guardian 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;
+}
+//=====================================================================
+amatsu.gat,119,164,4 script Guard Soldier 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 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 travellers to come in and out.";
+ mes "Now you may go in.";
+ close;
+}
+
+//=====================================================================
+ama_in01.gat,22,111,0 script Old Lady 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 til";
+ mes "the Ishida Family line ends!";
+ mes "Stop bothering me and get out! Clang Clannng!^000000";
+ next;
+ warp "amatsu",167,197;
+ break;
+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 goddamed 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;
+ break;
+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,207,40,6 script Guard Soldier 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 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 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,170,62,4 script Soldier 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",L1,"I want to live here",L2,"Nothing",L3;
+L1:
+ 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,37,157,4 script Soldier 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 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 ¤h§L 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 767,{
+// npcs made by eAthena
+ 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;
+}
+// eAthena Team
+//=====================================================================
+ama_in02.gat,203,156,4 script Soldier 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;
+}
+// eAthena Dev Team
+//=====================================================================
+ama_in02.gat,195,156,4 script Soldier 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;
+}
+//=====================================================================
+// eAthena Team
+ama_in02.gat,115,177,7 script §L¤h 767,{
+ mes "[Juro]";
+ mes "What are you here for?";
+ mes "There is nothing much over here.";
+ next;
+ menu "Oh, really",L1,"Please open the door for me",L2;
+L1:
+ 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",L2_1,"Listen to explanation",L2_2;
+L2_1:
+ mes "[Juro]";
+ mes "Then, I will open the door for you.";
+ mes "Please take care...";
+ next;
+ warp "ama_dun01.gat",229,10;
+ break;
+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 existance 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;
+ break;
+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 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;
+ break;
+L1:
+ mes "[Juro]";
+ mes "Take care of yourself!";
+ close;
+}
+
+//=====================================================================
+// eAthena Team
+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;
+}
+// eAthena Dev Team
+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 "Iit 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 summoming 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 Dev Team
+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;
+}
+// eAthena Dev Team
+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 3;
+ 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;
+}
+// eAthena Dev Team
+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 "Everytime 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;
+}
+// eAthena Dev Team
+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 bueaty";
+ 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?",L1,"Speaking of bullshit...",L2;
+L1:
+ mes "[Sakura Seiichi]";
+ mes "... Maybe...";
+ mes "Anyways, do you believe me or not";
+ mes "want to make a bet...?";
+ next;
+ emotion 9;
+ 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 anymore,^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 "becareful, one day that kind of things";
+ mes "Will happen to you as well..";
+ next;
+ Emotion 9;
+ 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 anymore,^000000";
+ mes "^6633FFI don't understand why she told^000000";
+ mes "^6633FFMe that...^000000";
+ close;
+}
+// eAthena Dev Team
+amatsu.gat,283,203,1 script PokePoke 738,{
+ Emotion 19;
+ 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 19;
+ 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 19;
+ 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 19;
+ 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;
+}
+// eAthena Dev Team
+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 "Drawinging 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;
+}
+
// eAthena Dev Team \ No newline at end of file
diff --git a/npc/cities/comodo.txt b/npc/cities/comodo.txt
index 04a80e3b6..ed7dd3700 100644
--- a/npc/cities/comodo.txt
+++ b/npc/cities/comodo.txt
@@ -1,1397 +1,1397 @@
-//===== eAthena Script =======================================
-//= Comodo Town
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Not complete.
-//= 1.1 Rolled back from the wron Kashy's fix
-//= Implemented the 'Cheese'/Stone of Awakening quest. Re-organized stuff. [kobra_k88]
-//============================================================
-
-
-
-//============================================================================//
-// 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 onced 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~).... gonna 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 5;
- 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 wonderfull.";
- 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 "Afterall it's not like your friend EARNED the money.... he/she just got lucky thats 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 evey penny he/she earned......";
- mes "would you be comfotable 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 23;
- next;
- mes "[Stonae]";
- mes "Sheesh! I can't quit after losing this badly! I won't quit until I win!";
- emotion 7;
- next;
- mes "[Stonae]";
- mes "Let's go!!";
- emotion 27;
- 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 smiple!";
- mes "The atomoshpere is perfect and makes you really want to play more!";
- emotion 33;
- 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 0;
- 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 0;
- 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 7;
- 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 gonna have a blast!! HAHAHA!";
- emotion 29;
- close;
-}
-
-//=============================================================
-cmd_in02.gat,64,43,4 script Roberto 709,{
- mes "[Roberto]";
- mes "Muhahaha... What a stupid man! Now that's easy money! (~counts his money~)";
- emotion 29;
- 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 1;
- 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 0;
- 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 29;
- 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 accomidate 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 fascilitates a more sophisticated level of gaming.";
- mes "If you're interested in a more easy going gaming environment, I recomend choosing a more genral 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 19;
- 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 28;
- 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 3;
- 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 21;
- 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 19;
- 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 guidlines 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 parites!";
- 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 0;
- 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 15;
- next;
- mes "[Rochito]";
- mes "Hey everybody! Tausupa has sent us some Koserahserah seasoning!!";
- next;
- mes "[Emralhandas]";
- mes "Our old freind?";
- 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~ recieved '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 greatful if you did.";
- close;
-
-L_3:
- mes "[Rochito]";
- mes "You've returned..... Oh! Thank you for the delivering the wine for us.";
- emotion 15;
- 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 recieve their unique qualitites 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 18;
- 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 powerfull sword near ^5555FFGlastheim^000000.";
- mes "This has brought us yet another challenge.....";
- next;
- mes "[Rotute]";
- mes "We must find this new sword!! A new expidition 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 27;
- 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 0;
- next;
- mes "[Rotute";
- mes "I can only hope that I find a freind 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 15;
- 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 freinds!!";
- emotion 21;
- 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 0;
- 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 feirce determination we were able to defeat the witch and inprison her beneath the earth.";
- next;
- mes "[Emralhandas]";
- mes "Of all of those who risked their lives that day, one stood out amoungst 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 greatful 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 untill 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 freinds 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 5;
- 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 fullfill 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 greatful.";
- 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. Everytime 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 heros, 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 heros 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 lurke in the shadows awaiting their master's return.";
- next;
- mes "[TORUNA]";
- mes "So be cautious when venturing into the unkown 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 5;
- next;
- mes "[TORUNA]";
- mes "This special Cheese is simply DELICIOUS! You will understand how good the Cheese is once you try it.";
- emotion 14;
- 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 3;
- next;
- mes "[TORUNA]";
- mes "Oh if I could just have one piece.... I'd be soooo 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 reffered 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 prepapred and expect trouble.";
- mes "These dungeons are definately 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 possiblity 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 32;
- 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 7;
- 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 irresistable smell of that amazing ^5533FFCheese^000000!! It's so delicious!.... Oh, I can't wait any longer......";
- emotion 3;
- next;
- mes "[Magatu]";
- mes "No matter what anyone else says..... Comodo Cheese is truly the BEST!!! Kekekeke!!";
- emotion 21;
- next;
- mes "[Magatu]";
- mes "Cheese! CHEESE!! WONDERFULL Comodo CHEESE!!!.... soooo.... tas... ty.... (~drooools~)";
- emotion 3;
- 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 1;
- 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 gotta tell you my friend's name.....";
- next;
- mes "[Magatu]";
- mes "O? I already told you? Bah, I am sooo drunk....... ^5533FFManzi^000000... he's in the ^009500Casino^000000, got it?";
- emotion 20;
- 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(Class == 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 becareful 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 5;
- 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 incharge 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 reffer to Comodo's unique form of dancing as simply a hula dance, is just insulting!";
- emotion 6;
- 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 29;
- 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 20;
- 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 0;
- 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 undescribable 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 priviledged 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 tastey 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 nauscious and start having hallucinations, that means you have succomb 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 18;
- 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 extremley cold and dizzy.... ~";
- mes "~ your body feels weak and you are getting drowzy.... ~^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 hadle 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 dont seem to have any ill effects from the posion.";
- mes "You must be in top shape both mentally and physically.";
- emotion 5;
- next;
- mes "[Nigirboran]";
- mes "You have proven 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;
-}
-
-
-
-//============================================================================//
-// Comodo Pharos Lightouse (Beacon Island)
-//============================================================================//
-
-//==================================================
-cmd_fild07.gat,192,58,4 script Light House Guard 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 lighhouses 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 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 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 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 mintues...";
- 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.2
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Not complete.
+//= 1.1 Rolled back from the wron Kashy's fix
+//= Implemented the 'Cheese'/Stone of Awakening quest. Re-organized stuff. [kobra_k88]
+//============================================================
+
+
+
+//============================================================================//
+// 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 onced 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~).... gonna 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 5;
+ 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 wonderfull.";
+ 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 "Afterall it's not like your friend EARNED the money.... he/she just got lucky thats 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 evey penny he/she earned......";
+ mes "would you be comfotable 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 23;
+ next;
+ mes "[Stonae]";
+ mes "Sheesh! I can't quit after losing this badly! I won't quit until I win!";
+ emotion 7;
+ next;
+ mes "[Stonae]";
+ mes "Let's go!!";
+ emotion 27;
+ 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 smiple!";
+ mes "The atomoshpere is perfect and makes you really want to play more!";
+ emotion 33;
+ 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 0;
+ 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 0;
+ 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 7;
+ 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 gonna have a blast!! HAHAHA!";
+ emotion 29;
+ close;
+}
+
+//=============================================================
+cmd_in02.gat,64,43,4 script Roberto 709,{
+ mes "[Roberto]";
+ mes "Muhahaha... What a stupid man! Now that's easy money! (~counts his money~)";
+ emotion 29;
+ 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 1;
+ 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 0;
+ 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 29;
+ 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 accomidate 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 fascilitates a more sophisticated level of gaming.";
+ mes "If you're interested in a more easy going gaming environment, I recomend choosing a more genral 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 19;
+ 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 28;
+ 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 3;
+ 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 21;
+ 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 19;
+ 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 guidlines 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 parites!";
+ 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 0;
+ 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 15;
+ next;
+ mes "[Rochito]";
+ mes "Hey everybody! Tausupa has sent us some Koserahserah seasoning!!";
+ next;
+ mes "[Emralhandas]";
+ mes "Our old freind?";
+ 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~ recieved '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 greatful if you did.";
+ close;
+
+L_3:
+ mes "[Rochito]";
+ mes "You've returned..... Oh! Thank you for the delivering the wine for us.";
+ emotion 15;
+ 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 recieve their unique qualitites 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 18;
+ 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 powerfull sword near ^5555FFGlastheim^000000.";
+ mes "This has brought us yet another challenge.....";
+ next;
+ mes "[Rotute]";
+ mes "We must find this new sword!! A new expidition 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 27;
+ 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 0;
+ next;
+ mes "[Rotute";
+ mes "I can only hope that I find a freind 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 15;
+ 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 freinds!!";
+ emotion 21;
+ 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 0;
+ 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 feirce determination we were able to defeat the witch and inprison her beneath the earth.";
+ next;
+ mes "[Emralhandas]";
+ mes "Of all of those who risked their lives that day, one stood out amoungst 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 greatful 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 untill 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 freinds 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 5;
+ 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 fullfill 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 greatful.";
+ 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. Everytime 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 heros, 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 heros 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 lurke in the shadows awaiting their master's return.";
+ next;
+ mes "[TORUNA]";
+ mes "So be cautious when venturing into the unkown 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 5;
+ next;
+ mes "[TORUNA]";
+ mes "This special Cheese is simply DELICIOUS! You will understand how good the Cheese is once you try it.";
+ emotion 14;
+ 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 3;
+ next;
+ mes "[TORUNA]";
+ mes "Oh if I could just have one piece.... I'd be soooo 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 reffered 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 prepapred and expect trouble.";
+ mes "These dungeons are definately 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 possiblity 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 32;
+ 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 7;
+ 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 irresistable smell of that amazing ^5533FFCheese^000000!! It's so delicious!.... Oh, I can't wait any longer......";
+ emotion 3;
+ next;
+ mes "[Magatu]";
+ mes "No matter what anyone else says..... Comodo Cheese is truly the BEST!!! Kekekeke!!";
+ emotion 21;
+ next;
+ mes "[Magatu]";
+ mes "Cheese! CHEESE!! WONDERFULL Comodo CHEESE!!!.... soooo.... tas... ty.... (~drooools~)";
+ emotion 3;
+ 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 1;
+ 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 gotta tell you my friend's name.....";
+ next;
+ mes "[Magatu]";
+ mes "O? I already told you? Bah, I am sooo drunk....... ^5533FFManzi^000000... he's in the ^009500Casino^000000, got it?";
+ emotion 20;
+ 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(Class == 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 becareful 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 5;
+ 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 incharge 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 reffer to Comodo's unique form of dancing as simply a hula dance, is just insulting!";
+ emotion 6;
+ 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 29;
+ 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 20;
+ 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 0;
+ 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 undescribable 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 priviledged 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 tastey 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 nauscious and start having hallucinations, that means you have succomb 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 18;
+ 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 extremley cold and dizzy.... ~";
+ mes "~ your body feels weak and you are getting drowzy.... ~^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 hadle 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 dont seem to have any ill effects from the posion.";
+ mes "You must be in top shape both mentally and physically.";
+ emotion 5;
+ next;
+ mes "[Nigirboran]";
+ mes "You have proven 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;
+}
+
+
+
+//============================================================================//
+// Comodo Pharos Lightouse (Beacon Island)
+//============================================================================//
+
+//==================================================
+cmd_fild07.gat,192,58,4 script Light House Guard 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 lighhouses 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 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 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 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 mintues...";
+ 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/geffen.txt b/npc/cities/geffen.txt
index 05d19cb1c..4f8c32f3b 100644
--- a/npc/cities/geffen.txt
+++ b/npc/cities/geffen.txt
@@ -1,659 +1,659 @@
-//===== eAthena Script =======================================
-//= Geffen Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-// Lady -------------------------------------------------------
-geffen.gat,59,143,8 script Lady 91,{
- mes "[Lady]";
- mes "Oh, you must be a Stranger here.";
- next;
- mes "[Lady]";
- mes "Wellcome 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 gatthered by Hornets for the queen bee ^ff0000Mistress^000000. MIstress is a very rare and powerfull 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 Womankind 101,{
- mes "[Womankind]";
- mes "Good Day, adventurer.";
- next;
- mes "[Womankind]";
- mes "Have you ever seen the ^ff0000Orcs^000000, the Demi-Human Tribe?";
- next;
- mes "[Womankind]";
- mes "South of here, deep in the forest, lies the home land of the Orcs. I here they have a unique culture and language that is much different from our own.";
- next;
- mes "[Womankind]";
- 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" 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 phisycal 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" 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 realised 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 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!... everytime he drinks... he gets like that! Ugh!!";
- emotion 6;
- next;
- mes "[Waitress]";
- mes "(~yells to the man~)'Hey mister! I TOLD you... THIS.. IS.. AN INN, NOT A BAR!!'";
- emotion 32;
- 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 32;
- 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 liquior 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 latelty, 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, afterall 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;
-}
-
-// Merhcant Daven -------------------------------------------------------------------
-geffen_in.gat,79,75,2 script Merchant Daven 61,
-{
- mes "[Merchant Daven]";
- mes "Back in the day when I frist 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 Academey^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 powerfull 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 "Blaksmiths 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 benificial to a character.";
- goto M_Menu;
- M_2:
- mes "[Merchant Daven]";
- mes "Me?.... Oh I'm the world's PRETTIEST street merchant!!..... teh he he...";
- emotion 30;
- next;
- menu "..... I'm gonna 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 18;
- goto M_Menu;
- sM_1:
- mes "~^FF8000!!!^FF0000THWAAACCCKKK^FF8000!!!^000000~";
- next;
- mes "[Merchant Daven]";
- mes "OW!! Ok! Ok! I was just kidding.... sheesh....";
- emotion 16;
- goto M_Menu;
- M_End:
- close;
-}
-
-// Drunkard -------------------------------------------------------------------
-geffen_in.gat,59,62,2 script Drunkard 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 18;
- close;
- M_2:
- mes "[Drunkard]";
- mes "Oh... I see, I see. My appologies. You seem to be sensative 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 28;
- next;
- mes "[Waitress]";
- mes "ARGH!! STOP being so noisey!";
- 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 plentifull 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 69,
-{
- mes "[Waitress]";
- mes "Meh! ALWAYS drinking and ALWAYS fighting..... HEY Mister! This is a place of BUSINESS!!";
- emotion 6;
- 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 32;
-M_Menu:
- next;
- menu "Could I get drink?",M_0, "Anything interesting goin on lately?",M_1, "End Conversation",M_End;
-
- M_0:
- mes "[Waitress]";
- mes "Jeez, I'm real sorry but we ran out of liquior. 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 52,
-{
- mes "[Drunkard]";
- mes "You want to be an idiotic magician? Is that why you came here??";
- emotion 1;
- 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 perservere, you will be able to enjoy the sweet taste of acomplishment.";
- 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 evny 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 sitiuations.";
- mes "Remain calm however, and continue to prepapre 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 21;
- 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 1;
- 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 0;
- 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 21;
- next;
- goto R1_End;
- R1_2:
- mes "[Friend of Youth]";
- mes "Oh ho! To be in love is a wonderful existance!";
- 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 21;
- 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 20;
- next;
- goto R1_End;
- R1_End:
- mes "[Friend of Youth]";
- mes "Even in this bleek world, love is all around you! Love can be fun so treasure the heart and come back for another reading!";
- emotion 22;
- 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 wonderfull 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 aquiring wealth is your sole purpose in life....";
- mes "you will ultimately find yourself dissapointed and empty.";
- goto M_Menu;
- R2_2:
- mes "[Friend of Youth]";
- mes "Are you envious of someones 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 habbit of buying cheap things you can afford right away.";
- mes "It's better to wait untill 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 embarressed 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 preseverance you'll surely achieve your goals.";
- next;
- goto R3_End;
- R3_End:
- mes "[Friend of Youth]";
- mes "Concentrating on studies is difficult. Come back anytime 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 prepapred to face what lies ahead!";
- emotion 21;
- next;
- goto R4_End;
- R4_End:
- mes "[Friend of Youth]";
- mes "There are many reasons to look forward to the future. So untill 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 23;
- 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 1;
- 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 19;
- 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(Class == 2 || Class == 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 powerfull 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 remeber that magic should only be used for the bennefit of people, not to do them harm.";
- close;
-}
+//===== eAthena Script =======================================
+//= Geffen Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+// Lady -------------------------------------------------------
+geffen.gat,59,143,8 script Lady 91,{
+ mes "[Lady]";
+ mes "Oh, you must be a Stranger here.";
+ next;
+ mes "[Lady]";
+ mes "Wellcome 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 gatthered by Hornets for the queen bee ^ff0000Mistress^000000. MIstress is a very rare and powerfull 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 Womankind 101,{
+ mes "[Womankind]";
+ mes "Good Day, adventurer.";
+ next;
+ mes "[Womankind]";
+ mes "Have you ever seen the ^ff0000Orcs^000000, the Demi-Human Tribe?";
+ next;
+ mes "[Womankind]";
+ mes "South of here, deep in the forest, lies the home land of the Orcs. I here they have a unique culture and language that is much different from our own.";
+ next;
+ mes "[Womankind]";
+ 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" 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 phisycal 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" 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 realised 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 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!... everytime he drinks... he gets like that! Ugh!!";
+ emotion 6;
+ next;
+ mes "[Waitress]";
+ mes "(~yells to the man~)'Hey mister! I TOLD you... THIS.. IS.. AN INN, NOT A BAR!!'";
+ emotion 32;
+ 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 32;
+ 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 liquior 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 latelty, 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, afterall 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;
+}
+
+// Merhcant Daven -------------------------------------------------------------------
+geffen_in.gat,79,75,2 script Merchant Daven 61,
+{
+ mes "[Merchant Daven]";
+ mes "Back in the day when I frist 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 Academey^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 powerfull 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 "Blaksmiths 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 benificial to a character.";
+ goto M_Menu;
+ M_2:
+ mes "[Merchant Daven]";
+ mes "Me?.... Oh I'm the world's PRETTIEST street merchant!!..... teh he he...";
+ emotion 30;
+ next;
+ menu "..... I'm gonna 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 18;
+ goto M_Menu;
+ sM_1:
+ mes "~^FF8000!!!^FF0000THWAAACCCKKK^FF8000!!!^000000~";
+ next;
+ mes "[Merchant Daven]";
+ mes "OW!! Ok! Ok! I was just kidding.... sheesh....";
+ emotion 16;
+ goto M_Menu;
+ M_End:
+ close;
+}
+
+// Drunkard -------------------------------------------------------------------
+geffen_in.gat,59,62,2 script Drunkard 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 18;
+ close;
+ M_2:
+ mes "[Drunkard]";
+ mes "Oh... I see, I see. My appologies. You seem to be sensative 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 28;
+ next;
+ mes "[Waitress]";
+ mes "ARGH!! STOP being so noisey!";
+ 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 plentifull 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 69,
+{
+ mes "[Waitress]";
+ mes "Meh! ALWAYS drinking and ALWAYS fighting..... HEY Mister! This is a place of BUSINESS!!";
+ emotion 6;
+ 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 32;
+M_Menu:
+ next;
+ menu "Could I get drink?",M_0, "Anything interesting goin on lately?",M_1, "End Conversation",M_End;
+
+ M_0:
+ mes "[Waitress]";
+ mes "Jeez, I'm real sorry but we ran out of liquior. 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 52,
+{
+ mes "[Drunkard]";
+ mes "You want to be an idiotic magician? Is that why you came here??";
+ emotion 1;
+ 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 perservere, you will be able to enjoy the sweet taste of acomplishment.";
+ 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 evny 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 sitiuations.";
+ mes "Remain calm however, and continue to prepapre 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 21;
+ 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 1;
+ 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 0;
+ 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 21;
+ next;
+ goto R1_End;
+ R1_2:
+ mes "[Friend of Youth]";
+ mes "Oh ho! To be in love is a wonderful existance!";
+ 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 21;
+ 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 20;
+ next;
+ goto R1_End;
+ R1_End:
+ mes "[Friend of Youth]";
+ mes "Even in this bleek world, love is all around you! Love can be fun so treasure the heart and come back for another reading!";
+ emotion 22;
+ 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 wonderfull 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 aquiring wealth is your sole purpose in life....";
+ mes "you will ultimately find yourself dissapointed and empty.";
+ goto M_Menu;
+ R2_2:
+ mes "[Friend of Youth]";
+ mes "Are you envious of someones 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 habbit of buying cheap things you can afford right away.";
+ mes "It's better to wait untill 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 embarressed 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 preseverance you'll surely achieve your goals.";
+ next;
+ goto R3_End;
+ R3_End:
+ mes "[Friend of Youth]";
+ mes "Concentrating on studies is difficult. Come back anytime 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 prepapred to face what lies ahead!";
+ emotion 21;
+ next;
+ goto R4_End;
+ R4_End:
+ mes "[Friend of Youth]";
+ mes "There are many reasons to look forward to the future. So untill 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 23;
+ 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 1;
+ 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 19;
+ 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(Class == 2 || Class == 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 powerfull 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 remeber that magic should only be used for the bennefit of people, not to do them harm.";
+ close;
+}
diff --git a/npc/cities/gonryun.txt b/npc/cities/gonryun.txt
index 244fe5d0e..c78fa28eb 100644
--- a/npc/cities/gonryun.txt
+++ b/npc/cities/gonryun.txt
@@ -1,318 +1,318 @@
-//===== eAthena Script =======================================
-//= Gonryun Town
-//===== By: ==================================================
-//= edited by x[tsk] 4/30/04
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//
-//===== Additional Comments: =================================
-// May be missing npc's and dialogue.
-//============================================================
-
-
-
-//Event–¢’²¸I
-
-alberta.gat,245,69,4 script Gonryun Public Relations Official 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 beacuse 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) goto L_NoZeny;
- set Zeny,Zeny-10000;
- warp "gon_fild01.gat",258,82;
- end;
- L_Zeny:
- mes "[Waba]";
- mes "I am sorry if it seems like alot, but the ^0000ff10,000 zeny^000000 we request is necessary in order to make the trip.";
- close;
- 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 Gonryun Public Relations Official 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 Gonryun Public Relations Official 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 Gonryun Public Relations Official 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;
-}
-
-//===============================================================================
-//In h
-//===============================================================================
-
-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;
-}
-
-//===============================================================================
-
-gon_in.gat,173,27,2 script Kuhau 774,{
- mes "[Kuhau]";
- mes "This hotel sells the best drinks! Not only is it potent, but it tastes great, too! Of course that's only for the adults.";
- next;
- mes "[Kuhau]";
- mes "But what about the children? We have a secret recipe for brewing great tea! Not only is it excellent, it's also good for them.";
- close;
-}
-
-//===============================================================================
-
-gon_in.gat,165,16,4 script Drunkard 748,{
- mes "[Sorubun]";
- mes "Oh my head! I had too much to drink yesterday and passed out right here on the table.";
- mes "The manager told me that I shouldn't drink anymore and I should have listened.";
- emotion 19;
- next;
- mes "[Sorubun]";
- mes "Wow, the drinks here are strong! Much stronger than anything we have back home.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,139,142,6 script Girl 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 sooooo afraid of the foreigners.....";
- emotion 16;
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,113,135,6 script Guardsman 780,{
- mes "[Guardsman]";
- mes "Welcome to Gonryun. This is the home of our governor, Sayoumun.";
- next;
- mes "[Guardsman]";
- mes "We're sure your intentions are benign, but any wrong moves and we'll be forced to take action.";
- next;
- mes "[Guardsman]";
- mes "Such a thing rarely happens, but when it does.... we are always ready to deal with any problems!";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,113,127,6 script Guardsman 780,{
- mes "[Guardsman]";
- mes "Welcome to Gonryun. This is the home of our elder, Sayoumun. He rules all of Gonryun.";
- next;
- mes "[Guardsman]";
- mes "We're sure your intentions are benign, but any wrong moves and we'll be forced to take action.";
- next;
- mes "[Guardsman]";
- mes "Such a thing rarely happens, but when it does. We are always ready to deal with any problems!";
- 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;
-}
-
-//===============================================================================
-
-gon_in.gat,17,93,4 script Village Elder 775,{
- mes "[Sayoumun]";
- emotion 45;
- mes "Zzzzzzzzzzz.......";
- next;
- mes "[Sayoumun]";
- mes "Huh, a visitor?! Oh, hello! I was just, uhm, meditating. I am Sayoumun, mayor of Gonryun village. I welcome you to Gonryun.";
- next;
- mes "[Sayoumun]";
- mes "There used to not be many visitors to this land, until the University of Foreign Studies in Alberta began offering trips to our small island.";
- next;
- mes "[Sayoumun]";
- mes "I personally don't like all these outsiders coming all of the sudden. Alot of them are reckless, but I suppose it's good for business.";
- next;
- mes "[Sayoumun]";
- mes "These reports of a thief in my town continually worry me, however I just know he's an outsider!";
- 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,100,241,5 script Unsociable Man 733,{
- emotion 9;
- mes "[Saunso]";
- mes "I am too busy to talk, come back later!";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,268,88,4 script Ryan Chun Ho 776,{
- mes "[Ryan Chun Ho]";
- mes "We are an independent race, submitting to no aggressor! This is the blessed area which we will never give up.";
- next;
- mes "[Ryan Chun Ho]";
- mes "We believe in victory, it is our glory.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,181,161,4 script Chon Munjin 773,{
- mes "[Chon Munjin]";
- mes "The men of Gonryun must be powerful and bold! But being such a man, one just can not get married. Don't you think?";
- next;
- mes "[Chon Munjin]";
- mes "There's so many more men than women now it makes it even harder to find a woman. I wonder if my son will find himself a good woman?";
- 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 4;
- mes "..............";
- next;
- mes "[Gaiysonchoru]";
- mes "Well......... I'm worried.";
- next;
- mes "[Gaiysonchoru]";
- mes "So very worried.";
- close;
-}
-
-//===============================================================================
-
-gonryun.gat,166,196,4 script Soldier 780,{
- mes "[Wagou]";
- mes "Do you know what this is?";
- next;
- menu "Yes.",-, "No.",M_End;
-
- mes "[Wagou]";
- mes "I just have to make sure all citizens are warned of the dangers inside before going any further.";
- close;
-
- M_End:
- mes "[Wagou]";
- mes "Long ago, this was the great hall, but once the great beast had arrived it quickly turned to ruin and became overrun with monsters.";
- next;
- mes "[Wagou]";
- mes "I just have to make sure all citizens are warned of the dangers inside before going any further.";
- close;
-}
+//===== eAthena Script =======================================
+//= Gonryun Town
+//===== By: ==================================================
+//= edited by x[tsk] 4/30/04
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//
+//===== Additional Comments: =================================
+// May be missing npc's and dialogue.
+//============================================================
+
+
+
+//Event–¢’²¸I
+
+alberta.gat,245,69,4 script Gonryun Public Relations Official 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 beacuse 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) goto L_NoZeny;
+ set Zeny,Zeny-10000;
+ warp "gon_fild01.gat",258,82;
+ end;
+ L_Zeny:
+ mes "[Waba]";
+ mes "I am sorry if it seems like alot, but the ^0000ff10,000 zeny^000000 we request is necessary in order to make the trip.";
+ close;
+ 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 Gonryun Public Relations Official 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 Gonryun Public Relations Official 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 Gonryun Public Relations Official 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;
+}
+
+//===============================================================================
+//In h
+//===============================================================================
+
+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;
+}
+
+//===============================================================================
+
+gon_in.gat,173,27,2 script Kuhau 774,{
+ mes "[Kuhau]";
+ mes "This hotel sells the best drinks! Not only is it potent, but it tastes great, too! Of course that's only for the adults.";
+ next;
+ mes "[Kuhau]";
+ mes "But what about the children? We have a secret recipe for brewing great tea! Not only is it excellent, it's also good for them.";
+ close;
+}
+
+//===============================================================================
+
+gon_in.gat,165,16,4 script Drunkard 748,{
+ mes "[Sorubun]";
+ mes "Oh my head! I had too much to drink yesterday and passed out right here on the table.";
+ mes "The manager told me that I shouldn't drink anymore and I should have listened.";
+ emotion 19;
+ next;
+ mes "[Sorubun]";
+ mes "Wow, the drinks here are strong! Much stronger than anything we have back home.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,139,142,6 script Girl 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 sooooo afraid of the foreigners.....";
+ emotion 16;
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,113,135,6 script Guardsman 780,{
+ mes "[Guardsman]";
+ mes "Welcome to Gonryun. This is the home of our governor, Sayoumun.";
+ next;
+ mes "[Guardsman]";
+ mes "We're sure your intentions are benign, but any wrong moves and we'll be forced to take action.";
+ next;
+ mes "[Guardsman]";
+ mes "Such a thing rarely happens, but when it does.... we are always ready to deal with any problems!";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,113,127,6 script Guardsman 780,{
+ mes "[Guardsman]";
+ mes "Welcome to Gonryun. This is the home of our elder, Sayoumun. He rules all of Gonryun.";
+ next;
+ mes "[Guardsman]";
+ mes "We're sure your intentions are benign, but any wrong moves and we'll be forced to take action.";
+ next;
+ mes "[Guardsman]";
+ mes "Such a thing rarely happens, but when it does. We are always ready to deal with any problems!";
+ 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;
+}
+
+//===============================================================================
+
+gon_in.gat,17,93,4 script Village Elder 775,{
+ mes "[Sayoumun]";
+ emotion 45;
+ mes "Zzzzzzzzzzz.......";
+ next;
+ mes "[Sayoumun]";
+ mes "Huh, a visitor?! Oh, hello! I was just, uhm, meditating. I am Sayoumun, mayor of Gonryun village. I welcome you to Gonryun.";
+ next;
+ mes "[Sayoumun]";
+ mes "There used to not be many visitors to this land, until the University of Foreign Studies in Alberta began offering trips to our small island.";
+ next;
+ mes "[Sayoumun]";
+ mes "I personally don't like all these outsiders coming all of the sudden. Alot of them are reckless, but I suppose it's good for business.";
+ next;
+ mes "[Sayoumun]";
+ mes "These reports of a thief in my town continually worry me, however I just know he's an outsider!";
+ 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,100,241,5 script Unsociable Man 733,{
+ emotion 9;
+ mes "[Saunso]";
+ mes "I am too busy to talk, come back later!";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,268,88,4 script Ryan Chun Ho 776,{
+ mes "[Ryan Chun Ho]";
+ mes "We are an independent race, submitting to no aggressor! This is the blessed area which we will never give up.";
+ next;
+ mes "[Ryan Chun Ho]";
+ mes "We believe in victory, it is our glory.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,181,161,4 script Chon Munjin 773,{
+ mes "[Chon Munjin]";
+ mes "The men of Gonryun must be powerful and bold! But being such a man, one just can not get married. Don't you think?";
+ next;
+ mes "[Chon Munjin]";
+ mes "There's so many more men than women now it makes it even harder to find a woman. I wonder if my son will find himself a good woman?";
+ 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 4;
+ mes "..............";
+ next;
+ mes "[Gaiysonchoru]";
+ mes "Well......... I'm worried.";
+ next;
+ mes "[Gaiysonchoru]";
+ mes "So very worried.";
+ close;
+}
+
+//===============================================================================
+
+gonryun.gat,166,196,4 script Soldier 780,{
+ mes "[Wagou]";
+ mes "Do you know what this is?";
+ next;
+ menu "Yes.",-, "No.",M_End;
+
+ mes "[Wagou]";
+ mes "I just have to make sure all citizens are warned of the dangers inside before going any further.";
+ close;
+
+ M_End:
+ mes "[Wagou]";
+ mes "Long ago, this was the great hall, but once the great beast had arrived it quickly turned to ruin and became overrun with monsters.";
+ next;
+ mes "[Wagou]";
+ mes "I just have to make sure all citizens are warned of the dangers inside before going any further.";
+ close;
+}
diff --git a/npc/cities/izlude.txt b/npc/cities/izlude.txt
index 5e15b7448..51b67823e 100644
--- a/npc/cities/izlude.txt
+++ b/npc/cities/izlude.txt
@@ -1,547 +1,547 @@
-//===== eAthena Script =======================================
-//= Izlude Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 fixed 2 zeny bugs/checks [Lupus]
-//============================================================
-
-
-
-// Welcome Sign ----------------------------------------------------------
-izlude.gat,125,116,1 script Welcome Sign 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 "Izlude welcomes you.";
- next;
- mes "[Bonne]";
- mes "Izlude is the satellite city of Prontera, capital of the kingdom of Rune-Midgard.";
- next;
- mes "[Bonne]";
- mes "Izlude is veeeerrrrry important not only because the Swordsman Association resides here, but also because we guard and secure the coast line.";
- next;
- mes "[Bonne]";
- mes "As for this bridge, though it might look weak and feeble, it is actually state of the art, built with the most sophisticated technology the earth's ever seen.";
- next;
- mes "[Bonne]";
- mes "No matter how strong storms may be, or how many people may stand on it, this bridge will NEEEEVER collapse. You could test it, if you'd like.";
- next;
- mes "[Bonne]";
- mes "Please enjoy your visit here at 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 is THE place for capable young people from every part of the Rune-Midgard Kingdom to test their skills.";
- mes "You could battle with monsters of different levels. How many stages you can survive through will determine your ability level";
- next;
- mes "[Cuskoal]";
- mes "So What'd you say?";
- close;
-
- L_R0:
- mes "The pubs in Prontera are always full of people, from local and out-of-towners. They are very boisterous.";
- next;
- mes "[Cuskoal]";
- mes "They're always a good place for information and rumors because a peole are constantly comming in and out them.";
- next;
- mes "[Cuskoal]";
- mes "If you listen to the people carefully, you just might get lucky and get very useful information for 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 insult our city by reffering to it as just being the satellite city of Prontera.... but Izlude is actually an excellent city.";
- mes "It's home to the Izlude Swordsman Association and is situated next to the sea and the beautiful island of Byalan.";
- next;
- mes "[Charfri]";
- mes "You'll have to board on a ship at the port to get to Byalan Island. There is a dangerous dungeon on the island, so don't go there if you plan on wandering around aimlessly.";
- close;
-
- L_R0:
- mes "Though it is very beautiful, the Byalan Island has a mysterious dungeon extending deep under the sea.";
- next;
- mes "[Charfri]";
- mes "People who've been there have said that some parts of the dungeon are actually underwater.";
- next;
- mes "[Charfri]";
- mes "Those who saw the underwater view said it was just so fantastic that they've kept dreaming of it ever since.";
- mes "Unfortunately the monsters there are too strong for ordinary people to visit there.";
- next;
- mes "[Charfri]";
- mes "I wish I could get a glimps of the underwater view everyone talks about.... alas I can only dream.";
- close;
-}
-
-//Dega-------------------------------------------------------------------------------------
-izlude.gat,150,118,3 script Dega 84,{
- set @TEMP,rand(3);
- mes "[Dega]";
- if(@TEMP != 0) goto L_R0;
- mes "Mt. Mjornir located north of Prontera is extremely tough to travel through. Not only is the trek up the mountain difficult, but extremely aggressive insects live there too.";
- next;
- mes "[Dega]";
- mes "I mean, some of them just start attacking you for no reason whatsoever.";
- next;
- mes "[Dega]";
- mes "If you ever want to go through Mt. Mjornir, make sure you prepare yourself and build up your confidence. Otherwise, go around it.";
- close;
-
- L_R0:
- if(@TEMP != 1) goto L_R1;
- mes "Some monsters in Rune-Midgard can detect the use of a spell by a character before it is used.";
- next;
- mes "[Dega]";
- mes "Golems that live in the desert are one of those monsters. If you underestimate their sluggish movement and try to cast a spell on them...,";
- next;
- mes "[Dega]";
- mes "(snaps fingers) just like that they'll disappear from your sight.";
- close;
- L_R1:
- mes "There is a very delightful place where you can find every type of Poring.";
- mes "It is somewhere near the bridge, connecting the forest and the desert on the way to the city called Payon to the Southeast from here.";
- next;
- mes "[Dega]";
- mes "There are not only pink Porings but also orange Drops, which can be found at the desert, and green PoPoring.";
- next;
- mes "[Dega]";
- mes "But be careful, before you know it, you might be face to face with a Ghostring that floats around in the air like a ghost.";
- mes "Although most porings tend to be very cute and gentle, Ghostring is an EXCEPTION. It is very very dangerous.";
- next;
- mes "[Dega]";
- mes "If you are lucky enough, you might even bump into and Angelring. It's a Poring with wings like an angel.";
- next;
- menu "Ghostring?",-,"Angelring?",M1,"End Conversation.",MEnd;
-
- mes "[Dega]";
- mes "Ghostring is a grayish Poring that floats around in the air like a ghost. Since it's ghostlike, physical attack can't do any damage to it.";
- next;
- mes "[Dega]";
- mes "Those who rely on physical attacks, like Swordsmen and Archers, will most likely have to run for their lives if they bump into a Ghostring.";
- next;
- mes "[Dega]";
- mes "Of course there is hope for people in those job classes. If equiped with weapons with elemental properities, a Ghostring CAN be defeated.";
- next;
- close;
- M1:
- mes "[Dega]";
- mes "Unlike Ghostrings, Angelrings can be hit by physical attacks but are inturn immune to Magic attacks.";
- mes "So Mages and Acolytes will have difficulty against Angelrings.";
- next;
- close;
- MEnd:
- mes "[Dega]";
- mes "Good Luck~";
- close;
-}
-
-//Kylick-------------------------------------------------------------------------------------
-izlude.gat,150,143,4 script Kylick 97,{
- mes "[Kylick]";
- mes "Don't you think Binoculars are really COOL?! YOU can see SUPER FAR AWAY...";
- emotion 5;
- next;
- mes "[Kylick]";
- mes "... Ahem~! We, here at Izlude, are responsable for maintaining peace, not only on land, but also at sea.";
- next;
- mes "[Kylick]";
- mes "That's why we have that huge Parascope to constantly watch over the sea and help prevent any serious problems beforehand.";
- next;
- mes "[Kylick]";
- mes "After all, being well prepared is always better than being unprepared.";
- emotion 33;
- 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?";
- emotion 18;
- next;
- menu "Sure, why?",-, "Not really, I don't care.",M_1;
-
- mes "[Soldier]";
- mes "Ah~~ There is not much for us to do these days. Merchants buy items which monsters drop.... you knew that, right?";
- next;
- menu "Of course",sM_0, "Eh? Really?",sM_1;
-
- sM_0:
- mes "[Soldier]";
- mes "HaHa In fact, that was actually our job.";
- mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
- next;
- mes "[Soldier]";
- mes "We had to work over time every day. Ah~~~ that was a nightmare!!!...~~~";
- emotion 16;
- next;
- mes "[Soldier]";
- mes "Anyways, the government made a smart move and created the Registration System.";
- mes "The Office of Prize Compensation only pays those who have been registered.";
- next;
- mes "[Soldier]";
- mes "The requirements for registration are for a merchant to secure sufficient funds and to stay at one place all the time.";
- mes "The Office gives away the registration to any merchant who fullfills those requirements.";
- next;
- mes "[Soldier]";
- mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
- next;
- mes "[Soldier]";
- mes "People who have suffered are able to appreicate even the slightest in comforts.";
- next;
- mes "[Soldier]";
- mes "HaHaHaHaHa!";
- emotion 18;
- close;
- sM_1:
- mes "[Soldier]";
- mes "What?! What do you mean you didn't know?!";
- emotion 1;
- next;
- mes "[Soldier]";
- mes "Hm... well... you know you could get items by killing monsters right?";
- mes "You could make some money out of it by selling those items to a merchant.";
- next;
- goto sM_0;
- M_1:
- mes "[Soldier]";
- mes "OK Good bye~~";
- close;
-}
-
-//Red-------------------------------------------------------------------------------------
-izlude.gat,58,126,1 script Red 98,{
- mes "[Red]";
- mes "The only skill that a Swordsman needs is 'Bash'! 'Bash'! 'Bash'! ONLY 'Bash'!";
- mes "There's no need to waste any time and effort on other minor skills ~~ unless you're some kind of wuss!";
- emotion 29;
- next;
- mes "[Cebalis]";
- mes "What are you talking about?";
- emotion 1;
- next;
- mes "[Cebalis]";
- mes "The mark of a true Swordsman is the ability to bravely stand alone against a mob of enemies and SQUASH them ALL!";
- next;
- mes "[Cebalis]";
- mes "AND the only skill that can do that is 'Magnum Break'!!";
- next;
- mes "[Cebalis]";
- mes "It's a little bit risky to use because the explosive impact it creates may hit un-intended targets... which will then come after you... ";
- mes "but its a risk a Swordsman SHOULD BE willing to take!!";
- next;
- mes "[Red]";
- mes "That's exactly why you're a dumb, idiot! The mark of a true Swordsman?! I still remmember the last time you used 'Magnum Break'....";
- emotion 32;
- next;
- mes "[Red]";
- mes "You were just busy running away from all of those Porings that got hit by that stupid skill! You weakling!";
- mes "'Bash' hits ONE target with DEADLY PRECISION!! No need to fear accicental mobs.";
- next;
- mes "[Cebalis]";
- mes "Ahem..... Why do you always have to bring up insiginfigant incidents that have long sinced passed?";
- mes "I'm TELLING YOU, 'Magnum Break' is THE skill for a SWORDSMAN~!!";
- next;
- mes "[Cebalis]";
- mes "'Bash' is just a stepping stone to getting 'Magnum Break'. After all you need 5 levels of 'Bash before you can get lvl 1 'Magnum Break'.";
- next;
- mes "[Red]";
- mes "Ooohhh maaaann.....";
- emotion 9;
- next;
- mes "[Red]";
- mes "Hey! You there! which do you think is better? 'Bash', a powerfull and precise blow used on a single enemy,.......";
- mes "or 'Magnum Break', a firey strike that does splash damage to many enemies??";
- next;
- menu "Bash",-,"Magnum Break",L1;
-
- mes "[Red]";
- if( callfunc("Is_Sword_Class") != 0 ) goto L00;
- mes "Hahahaha!! See!? Someone who pursues a different job agrees with me~! You really are a great person!";
- mes "Hahaha!! Undoubtedly only 'Bash' is suitable for a Swordman. Please tell that to this BONEHEAD over here!! Hahaha.";
- emotion 21;
- close;
-
- L00:
- mes "Hahahaha!!! I knew you'd choose 'Bash'!! Without a doubt only 'Bash' suits a Swordsman. Please tell that to the BONEHEAD over there!! Hahaha.";
- emotion 21;
- next;
- mes "[Red]";
- mes "Hm, Let me give you a bit of advice. After you achieve level 5 'Bash', the amount of SP the skill consumes doubles, so keep an eye on your SP guage.";
- close;
- L1:
- mes "[Cebalis]";
- if( callfunc("Is_Sword_Class") != 0 ) goto L01;
- mes "Right! 'Magnum Break' is THE BEST!!! You know what you're talking about, huh? I don't know why this bonehead is sooooo stubborn.";
- close;
-
- L01:
- mes "Darn Right!! 'Magnum Break' IS the BETTER skill!! You know what your talking about freind. HaHaHa.";
- next;
- mes "[Cebalis]";
- mes "You want some useful information? Okay, lemme tell ya! 'Magnum Break' has the elemental Property of 'Fire'.";
- mes "It won't be too effective against monsters with the 'Water' property, but it works great against 'Undead' and 'Earth' property monsters.!";
- next;
- mes "[Cebalis]";
- mes "And most importantly, check your surroundings before you use it. If you don't you may end up taking on more monsters than you can handle.";
- close;
-}
-
-//Cebalis-------------------------------------------------------------------------------------
-izlude.gat,56,126,7 script Cebalis 85,{
- mes "[Cebalis]";
- mes "The mark of a true Swordsman is the ability to bravely stand alone against a mob of enemies and SQUASH them ALL!!";
- emotion 29;
- next;
- mes "[Cebalis]";
- mes "AND the only skill that can do that is 'Magnum Break'!!";
- next;
- mes "[Cebalis]";
- mes "It's a little bit risky to use because the explosive impact it creates may hit un-intended targets...which will then come after you...";
- mes "but its a risk a Swordsman SHOULD BE willing to take!";
- next;
- mes "[Red]";
- mes "What are you talking about?";
- next;
- mes "[Red]";
- mes "The only skill that a Swordsman needs is 'Bash'! 'Bash'! 'Bash'! ONLY 'Bash'!";
- mes "There's no need to waste any time and effort on other minor skills ~~ unless you're some kind of wuss!";
- next;
- mes "[Red]";
- mes "That's exactly why you're a dumb, idiot! The mark of a true Swordsman?! I still remmember the last time you used 'Magnum Break'....";
- next;
- mes "[Red]";
- mes "You were just busy running away from all of the Porings that got hit by that stupid skill! You weakling!";
- mes "'Bash' hits ONE target with DEADLY PRECISION!! No need to fear accicental mobs.";
- next;
- mes "[Cebalis]";
- mes "Ahem... Why do you always have to bring up insiginfigant incidents that have long sinced passed?";
- mes "I'm TELLING YOU, 'Magnum Break' is the skill for a SWORDSMAN~!!";
- emotion 4;
- next;
- mes "[Cebalis]";
- mes "'Bash' is just a stepping stone to getting 'Magnum Break'. After all you need 5 levels of 'Bash before you can get lvl 1 'Magnum Break'.";
- next;
- mes "[Red]";
- mes "Ooohhh maaaann.....";
- next;
- mes "[Red]";
- mes "Hey! You there! what do you think is better? 'Bash', a powerfull and precise blow used on a single enemy,.......";
- mes "or 'Magnum Break', a firey strike that does splash damage to many enemies??";
- next;
- menu "Bash",-,"Magnum Break",L1;
-
- mes "[Red]";
- if( callfunc("Is_Sword_Class") != 0 ) goto L00;
- mes "Hahahaha!! See!? Someone who pursues a different job agrees with me~! You really are a great person!";
- mes "Hahaha!! Undoubtedly only 'Bash' is suitable for a Swordman. Please tell that to this BONEHEAD over here!! Hahaha.";
- close;
-
- L00:
- mes "Hahahaha!!! I knew you'd choose 'Bash'!! Without a doubt only 'Bash' suits a Swordsman. Please tell that to the BONEHEAD over there!! Hahaha.";
- next;
- mes "[Red]";
- mes "Hm, Let me give you a bit of advice. After you achieve level 5 'Bash', the amount of SP the skill consumes doubles, so keep an eye on your SP guage.";
- close;
- L1:
- mes "[Cebalis]";
- if( callfunc("Is_Sword_Class") != 0 ) goto L01;
- mes "Right! 'Magnum Break' is THE BEST!!! You know what you're talking about, huh? I don't know why this bonehead is sooooo stubborn.";
- emotion 21;
- close;
-
- L01:
- mes "Darn Right!! 'Magnum Break' IS the BETTER skill!! You know what your talking about freind. HaHaHa.";
- emotion 21;
- next;
- mes "[Cebalis]";
- mes "You want some useful information? Okay, lemme tell ya! 'Magnum Break' has the elemental Property of 'Fire'.";
- mes "It won't be too effective against monsters with the 'Water' property, but it works great against 'Undead' and 'Earth' property monsters.!";
- next;
- mes "[Cebalis]";
- mes "And most importantly, check your surroundings before you use it. If you don't you may end up taking on more monsters than you can handle.";
- close;
-}
-
-//Aaron-------------------------------------------------------------------------------------
-izlude_in.gat,125,164,5 script Aaron 65,{
- mes "[Aaron]";
- mes "Hm? A Swordman?..........";
- emotion 1;
- next;
- mes "[Aaron]";
- mes "Do you think strong VIT and a highly trained and unique breathing method enabling quick HP recovery, are the greatest advantages of a Swordman?";
- next;
- mes "[Aaron]";
- mes "If you train hard enough, you can even notice your HP recovering. The amount that recovers depends on your VIT level.";
- next;
- mes "[Aaron]";
- mes "So if you invest in your VIT more, then the recovery amount will increase accordingly.";
- next;
- mes "[Aaron]";
- mes "But of course it'd be good to have a high Attack, wouldn't it? You can either acquire a good weapon or increase your STR level to enhance your Attack.";
- next;
- mes "[Aaron]";
- mes "You will also need strength to handle weapons more easily as well as to increase the amount of weight you can carry.";
- next;
- mes "[Aaron]";
- mes "Another important thing is how accurate you can hit your opponents. DEX is the key here. Dexterity also decreases the gap between the MIN and MAX damage you can deal.";
- next;
- mes "[Aaron]";
- mes "Hm... Are you bored? Want me to go on?";
- emotion 20;
- next;
- menu "Tell me more please.",-,"End conversation",LEnd;
-
- mes "[Aaron]";
- mes "Hm... in that case, I'll explain about the other attributes to you briefly. In order to attack and evade quickly, you've gotta have a good amount of AGI.";
- next;
- mes "[Aaron]";
- mes "A high AGI level will ensure that you can avoid attacks making you almost unhittable.";
- next;
- mes "[Aaron]";
- mes "In case you want to land more critical hits, it's a good idea to invest in LUK. INT increases max SP, which is needed to use various skills.";
- next;
- mes "[Aaron]";
- mes "Well it's up to you on what you type of attributes you focus on.";
- next;
- LEnd:
- mes "[Aaron]";
- mes "OK, train hard~~";
- emotion 21;
- close;
-}
-
-//Edgar-------------------------------------------------------------------------------------
-izlude.gat,182,186,6 script Edgar 709,{
-
- mes "[Edgar]";
- mes "Izlude is connected with Alberta by the harbor at the west. There is soo much traffic between the 2 cities that I sometimes feel like an Albertian. Hahahah";
-M_Menu:
- next;
- menu "Tell me more",-,"Can you tell me the way to Alberta?",M_1,"End Conversation",M_End;
-
- mes "[Edgar]";
- mes "I have a freind named Phelix in Alberta. He is a little stingy but he's a gernerally nice guy and likes helping others.";
- mes "He has a big heart and can help you get some usefull items in exchange for monster drops.";
- next;
- mes "[Edgar]";
- mes "Latley those in Alberta have been saying that he is helping out people in exchange for Jellopies or something like that.";
- mes "You might be able to save some zeny if you talk to him.";
- goto M_Menu;
-
- M_1:
- mes "[Edgar]";
- mes "Well you can always walk there. It's south of here and past the city of Payon. However the walk is rather long so I suggest you take a ship over there.";
- next;
- menu "Ok gotcha.",-,"Sick of walking and no money now.",sM_1;
-
- mes "[Edgar]";
- mes "Alright, Take Care~";
- goto M_Menu;
-
- sM_1:
- mes "[Edgar]";
- mes "Hmm..., you hate to walk and are low on money, but you want to go there...(sigh)...Oh boy...";
- emotion 4;
- next;
- mes "[Edgar]";
- mes "Well I am the captian of a small ship so I could bring you there at the low price of 250 Zeny.";
- next;
- menu "Alright~!",-,"Bah, what a rip off!!!",sm_1b;
-
- if(Zeny < 250) goto sl_NoZeny;
- set iz_move_alberta,1;
- set Zeny, Zeny - 250;
- warp "alberta.gat",195,164;
-
- sl_NoZeny:
- mes "[Edgar]";
- mes "Oh boy you don't have enough money! Go get more.";
- close;
-
- sm_1b:
- mes "[Edgar]";
- mes "What!!... ahg... bah... guh... I'm NOT ripping you off!!!...";
- emotion 23;
- close;
-
- M_End:
- mes "[Edgar]";
- mes "Well I've got other business to attend too.";
- close;
-
-}
-
-//Sailor-------------------------------------------------------------------------------------
-izlude.gat,201,181,2 script Sailor 100,{
- mes "[Sailor]";
- mes "Hey Everybody, Attention! Come and Ride the Wind on a Fantastic Ship!!! Come on! Hurry up!";
- next;
- menu "Byalan Island -> 150 Zeny.",-,"Alberta Marina -> 500 Zeny.",L1,"Cancel",LEnd;
-
- if(Zeny < 150) goto sl_NoZeny;
- set Zeny, Zeny - 150;
- warp "izlu2dun.gat",107,50;
- close;
- L1:
- if(Zeny < 500) goto sl_NoZeny;
- set Zeny, Zeny - 500;
- warp "alberta.gat",188,169;
- LEnd:
- close;
- sl_NoZeny:
- mes "[Sailor]";
- mes "You don't have enough money!";
- close;
-}
-
-//Sailor-------------------------------------------------------------------------------------
-izlu2dun.gat,108,27,4 script Sailor 100,{
- mes "[Sailor]";
- mes "Wanna return?";
- next;
- menu "Yeah, I am Tired to Death.",-,"Nope I love this place.",L1;
-
- warp "izlude.gat",176,182;
- L1:
- close;
-}
+//===== eAthena Script =======================================
+//= Izlude Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 fixed 2 zeny bugs/checks [Lupus]
+//============================================================
+
+
+
+// Welcome Sign ----------------------------------------------------------
+izlude.gat,125,116,1 script Welcome Sign 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 "Izlude welcomes you.";
+ next;
+ mes "[Bonne]";
+ mes "Izlude is the satellite city of Prontera, capital of the kingdom of Rune-Midgard.";
+ next;
+ mes "[Bonne]";
+ mes "Izlude is veeeerrrrry important not only because the Swordsman Association resides here, but also because we guard and secure the coast line.";
+ next;
+ mes "[Bonne]";
+ mes "As for this bridge, though it might look weak and feeble, it is actually state of the art, built with the most sophisticated technology the earth's ever seen.";
+ next;
+ mes "[Bonne]";
+ mes "No matter how strong storms may be, or how many people may stand on it, this bridge will NEEEEVER collapse. You could test it, if you'd like.";
+ next;
+ mes "[Bonne]";
+ mes "Please enjoy your visit here at 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 is THE place for capable young people from every part of the Rune-Midgard Kingdom to test their skills.";
+ mes "You could battle with monsters of different levels. How many stages you can survive through will determine your ability level";
+ next;
+ mes "[Cuskoal]";
+ mes "So What'd you say?";
+ close;
+
+ L_R0:
+ mes "The pubs in Prontera are always full of people, from local and out-of-towners. They are very boisterous.";
+ next;
+ mes "[Cuskoal]";
+ mes "They're always a good place for information and rumors because a peole are constantly comming in and out them.";
+ next;
+ mes "[Cuskoal]";
+ mes "If you listen to the people carefully, you just might get lucky and get very useful information for 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 insult our city by reffering to it as just being the satellite city of Prontera.... but Izlude is actually an excellent city.";
+ mes "It's home to the Izlude Swordsman Association and is situated next to the sea and the beautiful island of Byalan.";
+ next;
+ mes "[Charfri]";
+ mes "You'll have to board on a ship at the port to get to Byalan Island. There is a dangerous dungeon on the island, so don't go there if you plan on wandering around aimlessly.";
+ close;
+
+ L_R0:
+ mes "Though it is very beautiful, the Byalan Island has a mysterious dungeon extending deep under the sea.";
+ next;
+ mes "[Charfri]";
+ mes "People who've been there have said that some parts of the dungeon are actually underwater.";
+ next;
+ mes "[Charfri]";
+ mes "Those who saw the underwater view said it was just so fantastic that they've kept dreaming of it ever since.";
+ mes "Unfortunately the monsters there are too strong for ordinary people to visit there.";
+ next;
+ mes "[Charfri]";
+ mes "I wish I could get a glimps of the underwater view everyone talks about.... alas I can only dream.";
+ close;
+}
+
+//Dega-------------------------------------------------------------------------------------
+izlude.gat,150,118,3 script Dega 84,{
+ set @TEMP,rand(3);
+ mes "[Dega]";
+ if(@TEMP != 0) goto L_R0;
+ mes "Mt. Mjornir located north of Prontera is extremely tough to travel through. Not only is the trek up the mountain difficult, but extremely aggressive insects live there too.";
+ next;
+ mes "[Dega]";
+ mes "I mean, some of them just start attacking you for no reason whatsoever.";
+ next;
+ mes "[Dega]";
+ mes "If you ever want to go through Mt. Mjornir, make sure you prepare yourself and build up your confidence. Otherwise, go around it.";
+ close;
+
+ L_R0:
+ if(@TEMP != 1) goto L_R1;
+ mes "Some monsters in Rune-Midgard can detect the use of a spell by a character before it is used.";
+ next;
+ mes "[Dega]";
+ mes "Golems that live in the desert are one of those monsters. If you underestimate their sluggish movement and try to cast a spell on them...,";
+ next;
+ mes "[Dega]";
+ mes "(snaps fingers) just like that they'll disappear from your sight.";
+ close;
+ L_R1:
+ mes "There is a very delightful place where you can find every type of Poring.";
+ mes "It is somewhere near the bridge, connecting the forest and the desert on the way to the city called Payon to the Southeast from here.";
+ next;
+ mes "[Dega]";
+ mes "There are not only pink Porings but also orange Drops, which can be found at the desert, and green PoPoring.";
+ next;
+ mes "[Dega]";
+ mes "But be careful, before you know it, you might be face to face with a Ghostring that floats around in the air like a ghost.";
+ mes "Although most porings tend to be very cute and gentle, Ghostring is an EXCEPTION. It is very very dangerous.";
+ next;
+ mes "[Dega]";
+ mes "If you are lucky enough, you might even bump into and Angelring. It's a Poring with wings like an angel.";
+ next;
+ menu "Ghostring?",-,"Angelring?",M1,"End Conversation.",MEnd;
+
+ mes "[Dega]";
+ mes "Ghostring is a grayish Poring that floats around in the air like a ghost. Since it's ghostlike, physical attack can't do any damage to it.";
+ next;
+ mes "[Dega]";
+ mes "Those who rely on physical attacks, like Swordsmen and Archers, will most likely have to run for their lives if they bump into a Ghostring.";
+ next;
+ mes "[Dega]";
+ mes "Of course there is hope for people in those job classes. If equiped with weapons with elemental properities, a Ghostring CAN be defeated.";
+ next;
+ close;
+ M1:
+ mes "[Dega]";
+ mes "Unlike Ghostrings, Angelrings can be hit by physical attacks but are inturn immune to Magic attacks.";
+ mes "So Mages and Acolytes will have difficulty against Angelrings.";
+ next;
+ close;
+ MEnd:
+ mes "[Dega]";
+ mes "Good Luck~";
+ close;
+}
+
+//Kylick-------------------------------------------------------------------------------------
+izlude.gat,150,143,4 script Kylick 97,{
+ mes "[Kylick]";
+ mes "Don't you think Binoculars are really COOL?! YOU can see SUPER FAR AWAY...";
+ emotion 5;
+ next;
+ mes "[Kylick]";
+ mes "... Ahem~! We, here at Izlude, are responsable for maintaining peace, not only on land, but also at sea.";
+ next;
+ mes "[Kylick]";
+ mes "That's why we have that huge Parascope to constantly watch over the sea and help prevent any serious problems beforehand.";
+ next;
+ mes "[Kylick]";
+ mes "After all, being well prepared is always better than being unprepared.";
+ emotion 33;
+ 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?";
+ emotion 18;
+ next;
+ menu "Sure, why?",-, "Not really, I don't care.",M_1;
+
+ mes "[Soldier]";
+ mes "Ah~~ There is not much for us to do these days. Merchants buy items which monsters drop.... you knew that, right?";
+ next;
+ menu "Of course",sM_0, "Eh? Really?",sM_1;
+
+ sM_0:
+ mes "[Soldier]";
+ mes "HaHa In fact, that was actually our job.";
+ mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
+ next;
+ mes "[Soldier]";
+ mes "We had to work over time every day. Ah~~~ that was a nightmare!!!...~~~";
+ emotion 16;
+ next;
+ mes "[Soldier]";
+ mes "Anyways, the government made a smart move and created the Registration System.";
+ mes "The Office of Prize Compensation only pays those who have been registered.";
+ next;
+ mes "[Soldier]";
+ mes "The requirements for registration are for a merchant to secure sufficient funds and to stay at one place all the time.";
+ mes "The Office gives away the registration to any merchant who fullfills those requirements.";
+ next;
+ mes "[Soldier]";
+ mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
+ next;
+ mes "[Soldier]";
+ mes "People who have suffered are able to appreicate even the slightest in comforts.";
+ next;
+ mes "[Soldier]";
+ mes "HaHaHaHaHa!";
+ emotion 18;
+ close;
+ sM_1:
+ mes "[Soldier]";
+ mes "What?! What do you mean you didn't know?!";
+ emotion 1;
+ next;
+ mes "[Soldier]";
+ mes "Hm... well... you know you could get items by killing monsters right?";
+ mes "You could make some money out of it by selling those items to a merchant.";
+ next;
+ goto sM_0;
+ M_1:
+ mes "[Soldier]";
+ mes "OK Good bye~~";
+ close;
+}
+
+//Red-------------------------------------------------------------------------------------
+izlude.gat,58,126,1 script Red 98,{
+ mes "[Red]";
+ mes "The only skill that a Swordsman needs is 'Bash'! 'Bash'! 'Bash'! ONLY 'Bash'!";
+ mes "There's no need to waste any time and effort on other minor skills ~~ unless you're some kind of wuss!";
+ emotion 29;
+ next;
+ mes "[Cebalis]";
+ mes "What are you talking about?";
+ emotion 1;
+ next;
+ mes "[Cebalis]";
+ mes "The mark of a true Swordsman is the ability to bravely stand alone against a mob of enemies and SQUASH them ALL!";
+ next;
+ mes "[Cebalis]";
+ mes "AND the only skill that can do that is 'Magnum Break'!!";
+ next;
+ mes "[Cebalis]";
+ mes "It's a little bit risky to use because the explosive impact it creates may hit un-intended targets... which will then come after you... ";
+ mes "but its a risk a Swordsman SHOULD BE willing to take!!";
+ next;
+ mes "[Red]";
+ mes "That's exactly why you're a dumb, idiot! The mark of a true Swordsman?! I still remmember the last time you used 'Magnum Break'....";
+ emotion 32;
+ next;
+ mes "[Red]";
+ mes "You were just busy running away from all of those Porings that got hit by that stupid skill! You weakling!";
+ mes "'Bash' hits ONE target with DEADLY PRECISION!! No need to fear accicental mobs.";
+ next;
+ mes "[Cebalis]";
+ mes "Ahem..... Why do you always have to bring up insiginfigant incidents that have long sinced passed?";
+ mes "I'm TELLING YOU, 'Magnum Break' is THE skill for a SWORDSMAN~!!";
+ next;
+ mes "[Cebalis]";
+ mes "'Bash' is just a stepping stone to getting 'Magnum Break'. After all you need 5 levels of 'Bash before you can get lvl 1 'Magnum Break'.";
+ next;
+ mes "[Red]";
+ mes "Ooohhh maaaann.....";
+ emotion 9;
+ next;
+ mes "[Red]";
+ mes "Hey! You there! which do you think is better? 'Bash', a powerfull and precise blow used on a single enemy,.......";
+ mes "or 'Magnum Break', a firey strike that does splash damage to many enemies??";
+ next;
+ menu "Bash",-,"Magnum Break",L1;
+
+ mes "[Red]";
+ if( callfunc("Is_Sword_Class") != 0 ) goto L00;
+ mes "Hahahaha!! See!? Someone who pursues a different job agrees with me~! You really are a great person!";
+ mes "Hahaha!! Undoubtedly only 'Bash' is suitable for a Swordman. Please tell that to this BONEHEAD over here!! Hahaha.";
+ emotion 21;
+ close;
+
+ L00:
+ mes "Hahahaha!!! I knew you'd choose 'Bash'!! Without a doubt only 'Bash' suits a Swordsman. Please tell that to the BONEHEAD over there!! Hahaha.";
+ emotion 21;
+ next;
+ mes "[Red]";
+ mes "Hm, Let me give you a bit of advice. After you achieve level 5 'Bash', the amount of SP the skill consumes doubles, so keep an eye on your SP guage.";
+ close;
+ L1:
+ mes "[Cebalis]";
+ if( callfunc("Is_Sword_Class") != 0 ) goto L01;
+ mes "Right! 'Magnum Break' is THE BEST!!! You know what you're talking about, huh? I don't know why this bonehead is sooooo stubborn.";
+ close;
+
+ L01:
+ mes "Darn Right!! 'Magnum Break' IS the BETTER skill!! You know what your talking about freind. HaHaHa.";
+ next;
+ mes "[Cebalis]";
+ mes "You want some useful information? Okay, lemme tell ya! 'Magnum Break' has the elemental Property of 'Fire'.";
+ mes "It won't be too effective against monsters with the 'Water' property, but it works great against 'Undead' and 'Earth' property monsters.!";
+ next;
+ mes "[Cebalis]";
+ mes "And most importantly, check your surroundings before you use it. If you don't you may end up taking on more monsters than you can handle.";
+ close;
+}
+
+//Cebalis-------------------------------------------------------------------------------------
+izlude.gat,56,126,7 script Cebalis 85,{
+ mes "[Cebalis]";
+ mes "The mark of a true Swordsman is the ability to bravely stand alone against a mob of enemies and SQUASH them ALL!!";
+ emotion 29;
+ next;
+ mes "[Cebalis]";
+ mes "AND the only skill that can do that is 'Magnum Break'!!";
+ next;
+ mes "[Cebalis]";
+ mes "It's a little bit risky to use because the explosive impact it creates may hit un-intended targets...which will then come after you...";
+ mes "but its a risk a Swordsman SHOULD BE willing to take!";
+ next;
+ mes "[Red]";
+ mes "What are you talking about?";
+ next;
+ mes "[Red]";
+ mes "The only skill that a Swordsman needs is 'Bash'! 'Bash'! 'Bash'! ONLY 'Bash'!";
+ mes "There's no need to waste any time and effort on other minor skills ~~ unless you're some kind of wuss!";
+ next;
+ mes "[Red]";
+ mes "That's exactly why you're a dumb, idiot! The mark of a true Swordsman?! I still remmember the last time you used 'Magnum Break'....";
+ next;
+ mes "[Red]";
+ mes "You were just busy running away from all of the Porings that got hit by that stupid skill! You weakling!";
+ mes "'Bash' hits ONE target with DEADLY PRECISION!! No need to fear accicental mobs.";
+ next;
+ mes "[Cebalis]";
+ mes "Ahem... Why do you always have to bring up insiginfigant incidents that have long sinced passed?";
+ mes "I'm TELLING YOU, 'Magnum Break' is the skill for a SWORDSMAN~!!";
+ emotion 4;
+ next;
+ mes "[Cebalis]";
+ mes "'Bash' is just a stepping stone to getting 'Magnum Break'. After all you need 5 levels of 'Bash before you can get lvl 1 'Magnum Break'.";
+ next;
+ mes "[Red]";
+ mes "Ooohhh maaaann.....";
+ next;
+ mes "[Red]";
+ mes "Hey! You there! what do you think is better? 'Bash', a powerfull and precise blow used on a single enemy,.......";
+ mes "or 'Magnum Break', a firey strike that does splash damage to many enemies??";
+ next;
+ menu "Bash",-,"Magnum Break",L1;
+
+ mes "[Red]";
+ if( callfunc("Is_Sword_Class") != 0 ) goto L00;
+ mes "Hahahaha!! See!? Someone who pursues a different job agrees with me~! You really are a great person!";
+ mes "Hahaha!! Undoubtedly only 'Bash' is suitable for a Swordman. Please tell that to this BONEHEAD over here!! Hahaha.";
+ close;
+
+ L00:
+ mes "Hahahaha!!! I knew you'd choose 'Bash'!! Without a doubt only 'Bash' suits a Swordsman. Please tell that to the BONEHEAD over there!! Hahaha.";
+ next;
+ mes "[Red]";
+ mes "Hm, Let me give you a bit of advice. After you achieve level 5 'Bash', the amount of SP the skill consumes doubles, so keep an eye on your SP guage.";
+ close;
+ L1:
+ mes "[Cebalis]";
+ if( callfunc("Is_Sword_Class") != 0 ) goto L01;
+ mes "Right! 'Magnum Break' is THE BEST!!! You know what you're talking about, huh? I don't know why this bonehead is sooooo stubborn.";
+ emotion 21;
+ close;
+
+ L01:
+ mes "Darn Right!! 'Magnum Break' IS the BETTER skill!! You know what your talking about freind. HaHaHa.";
+ emotion 21;
+ next;
+ mes "[Cebalis]";
+ mes "You want some useful information? Okay, lemme tell ya! 'Magnum Break' has the elemental Property of 'Fire'.";
+ mes "It won't be too effective against monsters with the 'Water' property, but it works great against 'Undead' and 'Earth' property monsters.!";
+ next;
+ mes "[Cebalis]";
+ mes "And most importantly, check your surroundings before you use it. If you don't you may end up taking on more monsters than you can handle.";
+ close;
+}
+
+//Aaron-------------------------------------------------------------------------------------
+izlude_in.gat,125,164,5 script Aaron 65,{
+ mes "[Aaron]";
+ mes "Hm? A Swordman?..........";
+ emotion 1;
+ next;
+ mes "[Aaron]";
+ mes "Do you think strong VIT and a highly trained and unique breathing method enabling quick HP recovery, are the greatest advantages of a Swordman?";
+ next;
+ mes "[Aaron]";
+ mes "If you train hard enough, you can even notice your HP recovering. The amount that recovers depends on your VIT level.";
+ next;
+ mes "[Aaron]";
+ mes "So if you invest in your VIT more, then the recovery amount will increase accordingly.";
+ next;
+ mes "[Aaron]";
+ mes "But of course it'd be good to have a high Attack, wouldn't it? You can either acquire a good weapon or increase your STR level to enhance your Attack.";
+ next;
+ mes "[Aaron]";
+ mes "You will also need strength to handle weapons more easily as well as to increase the amount of weight you can carry.";
+ next;
+ mes "[Aaron]";
+ mes "Another important thing is how accurate you can hit your opponents. DEX is the key here. Dexterity also decreases the gap between the MIN and MAX damage you can deal.";
+ next;
+ mes "[Aaron]";
+ mes "Hm... Are you bored? Want me to go on?";
+ emotion 20;
+ next;
+ menu "Tell me more please.",-,"End conversation",LEnd;
+
+ mes "[Aaron]";
+ mes "Hm... in that case, I'll explain about the other attributes to you briefly. In order to attack and evade quickly, you've gotta have a good amount of AGI.";
+ next;
+ mes "[Aaron]";
+ mes "A high AGI level will ensure that you can avoid attacks making you almost unhittable.";
+ next;
+ mes "[Aaron]";
+ mes "In case you want to land more critical hits, it's a good idea to invest in LUK. INT increases max SP, which is needed to use various skills.";
+ next;
+ mes "[Aaron]";
+ mes "Well it's up to you on what you type of attributes you focus on.";
+ next;
+ LEnd:
+ mes "[Aaron]";
+ mes "OK, train hard~~";
+ emotion 21;
+ close;
+}
+
+//Edgar-------------------------------------------------------------------------------------
+izlude.gat,182,186,6 script Edgar 709,{
+
+ mes "[Edgar]";
+ mes "Izlude is connected with Alberta by the harbor at the west. There is soo much traffic between the 2 cities that I sometimes feel like an Albertian. Hahahah";
+M_Menu:
+ next;
+ menu "Tell me more",-,"Can you tell me the way to Alberta?",M_1,"End Conversation",M_End;
+
+ mes "[Edgar]";
+ mes "I have a freind named Phelix in Alberta. He is a little stingy but he's a gernerally nice guy and likes helping others.";
+ mes "He has a big heart and can help you get some usefull items in exchange for monster drops.";
+ next;
+ mes "[Edgar]";
+ mes "Latley those in Alberta have been saying that he is helping out people in exchange for Jellopies or something like that.";
+ mes "You might be able to save some zeny if you talk to him.";
+ goto M_Menu;
+
+ M_1:
+ mes "[Edgar]";
+ mes "Well you can always walk there. It's south of here and past the city of Payon. However the walk is rather long so I suggest you take a ship over there.";
+ next;
+ menu "Ok gotcha.",-,"Sick of walking and no money now.",sM_1;
+
+ mes "[Edgar]";
+ mes "Alright, Take Care~";
+ goto M_Menu;
+
+ sM_1:
+ mes "[Edgar]";
+ mes "Hmm..., you hate to walk and are low on money, but you want to go there...(sigh)...Oh boy...";
+ emotion 4;
+ next;
+ mes "[Edgar]";
+ mes "Well I am the captian of a small ship so I could bring you there at the low price of 250 Zeny.";
+ next;
+ menu "Alright~!",-,"Bah, what a rip off!!!",sm_1b;
+
+ if(Zeny < 250) goto sl_NoZeny;
+ set iz_move_alberta,1;
+ set Zeny, Zeny - 250;
+ warp "alberta.gat",195,164;
+
+ sl_NoZeny:
+ mes "[Edgar]";
+ mes "Oh boy you don't have enough money! Go get more.";
+ close;
+
+ sm_1b:
+ mes "[Edgar]";
+ mes "What!!... ahg... bah... guh... I'm NOT ripping you off!!!...";
+ emotion 23;
+ close;
+
+ M_End:
+ mes "[Edgar]";
+ mes "Well I've got other business to attend too.";
+ close;
+
+}
+
+//Sailor-------------------------------------------------------------------------------------
+izlude.gat,201,181,2 script Sailor 100,{
+ mes "[Sailor]";
+ mes "Hey Everybody, Attention! Come and Ride the Wind on a Fantastic Ship!!! Come on! Hurry up!";
+ next;
+ menu "Byalan Island -> 150 Zeny.",-,"Alberta Marina -> 500 Zeny.",L1,"Cancel",LEnd;
+
+ if(Zeny < 150) goto sl_NoZeny;
+ set Zeny, Zeny - 150;
+ warp "izlu2dun.gat",107,50;
+ close;
+ L1:
+ if(Zeny < 500) goto sl_NoZeny;
+ set Zeny, Zeny - 500;
+ warp "alberta.gat",188,169;
+ LEnd:
+ close;
+ sl_NoZeny:
+ mes "[Sailor]";
+ mes "You don't have enough money!";
+ close;
+}
+
+//Sailor-------------------------------------------------------------------------------------
+izlu2dun.gat,108,27,4 script Sailor 100,{
+ mes "[Sailor]";
+ mes "Wanna return?";
+ next;
+ menu "Yeah, I am Tired to Death.",-,"Nope I love this place.",L1;
+
+ warp "izlude.gat",176,182;
+ L1:
+ close;
+}
diff --git a/npc/cities/lutie.txt b/npc/cities/lutie.txt
index 177458bd8..4934d9c66 100644
--- a/npc/cities/lutie.txt
+++ b/npc/cities/lutie.txt
@@ -1,963 +1,963 @@
-//===== eAthena Script =======================================
-//= Lutie Town
-//===== By: ==================================================
-//=
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 Edited some text and updated/enabled some triggers
-//= for the quest.[kobra_k88]
-//============================================================
-
-
-//=====================================================
-// 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 mosters 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 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 wonderfull 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;
- 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:
- 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 sloitude, 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 definately knows...";
- next;
- mes "[Peterson]";
- mes "One day when an apprentice of the great alchemist visted 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 recomend 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 wan't, otherwise";
- mes "...... you won't get what YOU want.... *Chuckles*";
- close;
-
- XmasL0:
- mes "[Hairy Uncle Ken]";
- mes "Oh ?! *Chuckles* !! You seem to be a reliable person..";
- mes "Gooooooood! Ok, first I need something to drink....";
- next;
- delitem 1024,1;
- delitem 938,1;
- 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 destoryed.... 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 sacficed 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 sooo lonely..... I can't go anywhere! I";
- mes "am stuck here day and night... frozen to this cold earth....";
- emotion 28;
- 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 powerfull 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 soooo lonely.......";
- emotion 28;
- 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 28;
- 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 thouhgts -^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 thouhgts -^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 stomachahe.";
- 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 soooo 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 "talentless 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;
- 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:
- set xmas_npc,1;
- 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:
- set xmas_npc,1;
- 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:
- set xmas_npc,1;
- 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:
- set xmas_npc,11;
- 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:
- set xmas_npc,1;
- 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:
- set xmas_npc,1;
- 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:
- set xmas_npc,11;
- 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:
- set xmas_npc,11;
- 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 20;
- 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 remeber 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 ulimate sacrifce 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 5;
- 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 20;
- 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 alot 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.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 Edited some text and updated/enabled some triggers
+//= for the quest.[kobra_k88]
+//============================================================
+
+
+//=====================================================
+// 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 mosters 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 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 wonderfull 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;
+ 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:
+ 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 sloitude, 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 definately knows...";
+ next;
+ mes "[Peterson]";
+ mes "One day when an apprentice of the great alchemist visted 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 recomend 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 wan't, otherwise";
+ mes "...... you won't get what YOU want.... *Chuckles*";
+ close;
+
+ XmasL0:
+ mes "[Hairy Uncle Ken]";
+ mes "Oh ?! *Chuckles* !! You seem to be a reliable person..";
+ mes "Gooooooood! Ok, first I need something to drink....";
+ next;
+ delitem 1024,1;
+ delitem 938,1;
+ 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 destoryed.... 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 sacficed 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 sooo lonely..... I can't go anywhere! I";
+ mes "am stuck here day and night... frozen to this cold earth....";
+ emotion 28;
+ 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 powerfull 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 soooo lonely.......";
+ emotion 28;
+ 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 28;
+ 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 thouhgts -^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 thouhgts -^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 stomachahe.";
+ 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 soooo 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 "talentless 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;
+ 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:
+ set xmas_npc,1;
+ 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:
+ set xmas_npc,1;
+ 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:
+ set xmas_npc,1;
+ 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:
+ set xmas_npc,11;
+ 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:
+ set xmas_npc,1;
+ 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:
+ set xmas_npc,1;
+ 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:
+ set xmas_npc,11;
+ 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:
+ set xmas_npc,11;
+ 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 20;
+ 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 remeber 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 ulimate sacrifce 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 5;
+ 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 20;
+ 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 alot 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 ead9710e9..409ed7330 100644
--- a/npc/cities/morocc.txt
+++ b/npc/cities/morocc.txt
@@ -1,411 +1,411 @@
-//===== eAthena Script =======================================
-//= Morroc Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3b
-//===== 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]
-//============================================================
-
-
-//==================================================== 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 confindent 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 20;
- 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 litterally 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 traine because of the numerous amounts of ant eggs. But be carefull...";
- 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 0;
- 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 fiercesome of the ants. Pieres lay somewhere in the middle.";
- next;
- mes "[Ant Man Akira]";
- mes "Becarefull 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 watchout 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 musroom type creature....";
- next;
- mes "[Poring Lady Syvia]";
- mes "Or Pickys, desert chicks that wear egg shells on their heads and jump around in the Morrc 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 definately 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 immume to physical attacks. So Archers, Swordsman, and Thieves beware!";
- mes "Only weapons with elemental properites 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 23;
- 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 32;
- 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 carefull 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 populare 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 23;
- 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 carefull 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 5;
- next;
- mes "[Fly Man Armani]";
- mes "I saw the rare ^ff0000Dragon Fly^000000 just North 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 ordanary 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 everykind 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 20;
- close;
- M_1:
- mes "[Fly Man Armani]";
- mes "SO WHAT!!??";
- emotion 23;
- next;
- mes "[Fly Man Armani]";
- mes "Do you dare underestimate the Dragon Fly?? Bleh! It may be a fly, but I gaurantee you THIS FLY is more than you can handle!";
- emotion 32;
- next;
- mes "[Fly Man Armani]";
- mes "No matter. If you ARE fortunate enough to run into it, you'll quickly see what I mean. Afterall, it IS the FLY of ALL FLIES!!!!";
- next;
- mes "[Fly Man Armani]";
- mes "^ff0000Dragon Fly^000000. Remeber 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 temperatutres, and limited water, living creatures still find a way to survive in the desert.";
- next;
- mes "[Uncle Phlanette]";
- mes "Unfortunately, for unkown reasons, some of the plants and animals in the desert have turned into dangerous monsters.";
- mes "The ^00cc00'Mukas'^000000 are one of those mosters. They were originaly cactus plants.";
- goto M_Menu;
- M_End:
- mes "[Uncle Phlanette]";
- mes "Sand HERE! Sand THERE! Sand EVERYWHERE!!!!";
- emotion 0;
- 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 32;
- 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 intellegence, 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 unoticed. 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(Class == Job_Assassin) mes "Welcome.";
- if(Class == Job_Assassin) 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.3b
+//===== 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]
+//============================================================
+
+
+//==================================================== 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 confindent 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 20;
+ 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 litterally 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 traine because of the numerous amounts of ant eggs. But be carefull...";
+ 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 0;
+ 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 fiercesome of the ants. Pieres lay somewhere in the middle.";
+ next;
+ mes "[Ant Man Akira]";
+ mes "Becarefull 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 watchout 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 musroom type creature....";
+ next;
+ mes "[Poring Lady Syvia]";
+ mes "Or Pickys, desert chicks that wear egg shells on their heads and jump around in the Morrc 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 definately 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 immume to physical attacks. So Archers, Swordsman, and Thieves beware!";
+ mes "Only weapons with elemental properites 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 23;
+ 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 32;
+ 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 carefull 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 populare 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 23;
+ 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 carefull 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 5;
+ next;
+ mes "[Fly Man Armani]";
+ mes "I saw the rare ^ff0000Dragon Fly^000000 just North 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 ordanary 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 everykind 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 20;
+ close;
+ M_1:
+ mes "[Fly Man Armani]";
+ mes "SO WHAT!!??";
+ emotion 23;
+ next;
+ mes "[Fly Man Armani]";
+ mes "Do you dare underestimate the Dragon Fly?? Bleh! It may be a fly, but I gaurantee you THIS FLY is more than you can handle!";
+ emotion 32;
+ next;
+ mes "[Fly Man Armani]";
+ mes "No matter. If you ARE fortunate enough to run into it, you'll quickly see what I mean. Afterall, it IS the FLY of ALL FLIES!!!!";
+ next;
+ mes "[Fly Man Armani]";
+ mes "^ff0000Dragon Fly^000000. Remeber 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 temperatutres, and limited water, living creatures still find a way to survive in the desert.";
+ next;
+ mes "[Uncle Phlanette]";
+ mes "Unfortunately, for unkown reasons, some of the plants and animals in the desert have turned into dangerous monsters.";
+ mes "The ^00cc00'Mukas'^000000 are one of those mosters. They were originaly cactus plants.";
+ goto M_Menu;
+ M_End:
+ mes "[Uncle Phlanette]";
+ mes "Sand HERE! Sand THERE! Sand EVERYWHERE!!!!";
+ emotion 0;
+ 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 32;
+ 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 intellegence, 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 unoticed. 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(Class == Job_Assassin) mes "Welcome.";
+ if(Class == Job_Assassin) 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 1df1c151b..987fb4f8b 100644
--- a/npc/cities/niflheim.txt
+++ b/npc/cities/niflheim.txt
@@ -1,557 +1,557 @@
-//===== eAthena Script =======================================
-//= Niflheim Script
-//===== By: ==================================================
-//= Fyrien, Dizzy, PKGINGO
-//= Official NPCs translated and re-edited by Celest
-//===== Current Version: =====================================
-//= 1.05
-//===== 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]
-//=
-//= TODO: remove any save points from Niflheim (from Kafra)
-//= remove or commetn Warpers (they make Niflheim Piano Quest meaningless)
-//============================================================
-
-prontera.gat,164,161,4 script Traveler::NifTrav 68,{
- mes "[Traveler]";
- mes "I've come across some strange things in my time. Things you'd have to see to belive. Have you heard of Niffleheim, the City of the Dead?";
- next;
- menu "Show me, please...",M_show, "Sounds scarey...Nevermind...",-;
-
- mes "[Traveler]";
- mes "A wise choice by any means...";
- close;
-M_show:
- warp "niflheim.gat",202,171;
- close;
-}
-- script EDNifTrav -1,{
-OnInit:
-OnMinute00:
- disablenpc "NifTrav";
- end;
-OnMinute56:
- enablenpc "NifTrav";
- end;
-}
-
-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,184,199,5 script Little Girl 793,{
- mes "[Sairin]";
- if(niflheimlost2 == 1) goto L_thanks;
- if(niflheimlost == 1) goto L_foundhim;
- if(lostgirl == 1) goto L_sure2;
- mes "Sir, will you please help me?";
- if(Class==Job_Novice) mes "Oh... you are lost, too..."; //Exploit fix
- if(Class==Job_Novice) 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",-, "No",M_no;
-L_sure2:
- set lostgirl,1;
- mes "Please find him and tell him where I am! I saw him last in Niflheim Field, the first one...";
- close;
-
-L_foundhim:
- 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 niflheimlost2,1;
- close;
-L_thanks:
- mes "Thanks again!";
-M_no:
- close;
-}
-
-nif_fild01.gat,213,268,5 script Little Boy 797,{
- mes "[Marius]";
- if(niflheimlost == 1) goto L_alreadydone;
- if(lostgirl == 1) goto L_sure2;
- mes "Sairin...where are you?";
- close;
-L_alreadydone:
- mes "Thank you for helping us!";
- close;
-L_sure2:
- mes "Who are you?";
- mes "...";
- mes "You found Sairin?";
- mes "She ran to Niflheim?";
- next;
- set niflheimlost,1;
- 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.";
- menu "Yes",L_alreadydone, "No",-;
-
- close;
-}
-
-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 "[Anne]";
- 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 "[Anne]";
- 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 "[Anne]";
- 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 "[Anne]";
- mes "Curse... My grandma told me";
- mes "she has a way to avoid any curse";
- mes "unlifteable by holy blessings...";
- next;
- mes "[Anne]";
- mes "Klaatu...";
- mes "Verata.....";
- mes "And... something... something... what was it?";
- mes "I can't remember the last one.";
- next;
- mes "[Anne]";
- 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 "[Anne]";
- 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 802,{
- killmonster "niflheim.gat","mymob";
- mes "[Aesop 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 "[Aesop]";
- 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,"mymob";
- close;
-
-L_book2:
- mes "[Aesop 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;
- set @nif_random1,rand(1,10);
- mes "[Aesop Bruce]";
- mes "Ahahaha.... i see you are brave!!";
- mes "Start reading your prayersahahahah!!";
- next;
-L_MENU1:
- menu "Clover.",L_MENU1_1,"Klaatu.",L_MENU1_2,"Kleitos.",L_MENU1_3;
-
- L_MENU1_1:
- goto L_MENU2;
-
- L_MENU1_2:
- set nif_t,nif_t + 10;
- goto L_MENU2;
-
- L_MENU1_3:
- goto L_MENU2;
-
-L_MENU2:
- menu "Verit.",L_MENU2_1,"Veritas.",L_MENU2_2,"Verata.",L_MENU2_3;
-
- L_MENU2_1:
- goto L_MENU3;
-
- L_MENU2_2:
- goto L_MENU3;
-
- L_MENU2_3:
- set nif_t,nif_t + 10;
- goto L_MENU3;
-
-L_MENU3:
- menu "Necktie.",L_MENU3_1,"Necklace.",L_MENU3_2,"Nero.",L_MENU3_3,"^FFFFFFNictu.^000000",L_MENU3_4;
-
- L_MENU3_1:
- goto L_score;
-
- L_MENU3_2:
- goto L_score;
-
- L_MENU3_3:
- goto L_score;
-
- L_MENU3_4:
- set nif_t,nif_t + 10;
- goto L_score;
-
-
-L_score:
- if (nif_t == 30) goto L_sucess1;
- mes "[Aesop Bruce]";
- mes "Hahahaha!! Your prayers were wrong!!";
- mes "Time to face deathohohohoho,";
- mes "May you be cured forevahahahaha!!";
- monster "niflheim.gat",349,256,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",347,258,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",347,254,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",350,252,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",344,255,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",348,252,"Orc Skeleton",1462,1,"mymob";
- monster "niflheim.gat",347,259,"Orc Skeleton",1462,1,"mymob";
- close;
-
-L_sucess1:
- if (@nif_random1 == 10) goto L_sucess2;
- mes "[Aesop Bruce]";
- mes "Your prayers were correctaaahhhh...";
- mes "but your curse still remainsaaahhhh!!";
- mes "Haahahahaha.....!!!";
- close;
-
-L_sucess2:
- mes "[Aesop Bruce]";
- mes "Hahahaha!! Your curse has been lifted!!";
- mes "Gahahahaha.....!!!";
- close;
-
-L_back:
- mes "[Aesop Bruce]";
- mes "Ahahahaha! Not bad thinking at alllhhhaahaaa...";
- mes "I shall pray that you live to returnahhhh....";
- close;
-}
-
-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_quest1 == 1 || nif_q_done == 1) 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_quest1, 1;
- close;
-L_end:
- percentheal -30,0;
- close;
-}
-
-nif_in.gat,105,81,3 script Grey 794,{
- mes "[Grey]";
- 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 "[Grey]";
- 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;
- if (nif_quest2 == 1 || nif_q_done == 1) goto L_end;
- set @nif_random,rand(1,4);
- mes "[Grey]";
- 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$;
- if (@nif_random == 2) goto L_RAN_2;
- if (@nif_random == 3) goto L_RAN_3;
- if (@nif_random == 4) goto L_RAN_4;
- //if (@nif_random == 1) goto L_RAN_1;
- L_RAN_1:
- set @str1$,"When the sun sets in the western hills,";
- goto L_RAN_B;
-
- L_RAN_2:
- set @str1$,"Where points the velvet gloom of dawn,";
- goto L_RAN_B;
-
- L_RAN_3:
- set @str1$,"The beautiful melody surrounding thy soul,";
- goto L_RAN_B;
-
- L_RAN_4:
- set @str1$,"Is the key from Lord Death's wrath.";
- goto L_RAN_B;
-
- L_RAN_B:
- if (@inputstr1$ == @str1$) goto L_RAN_SC;
- mes "[Grey]";
- 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;
-
- L_RAN_SC:
- mes "[Grey]";
- 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_quest2, 1;
- next;
- mes "[Grey]";
- mes "I hope you will treat other poets";
- mes "as well as you treated me, farewell.";
- close;
-
-L_end:
- mes "[Grey]";
- 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 myterious secret";
- mes "hidden within these words...";
- 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_quest3 == 1 || nif_q_done == 1) 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_quest3, 1;
- 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 (nif_q_done == 1) end;
- if (nif_quest4 == 1) 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_quest4, 1;
-L_end:
- close;
-}
-
-niflheim.gat,208,103,5 script #2 111,2,2{
- if (nif_q_done == 1) end;
- if (nif_quest5 == 1) goto L_key2;
- if (nif_quest5 >= 2) 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_quest5, 1;
- close;
-L_key2:
- 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_quest5, 2;
-L_end:
- close;
-}
-
-nif_in.gat,115,181,5 script #4 111,3,3{
- mes "- You see a huge old piano -";
- if if (nif_q_done==0) mes "- with a few keys missing -";
- if if (nif_q_done==1) mes "- with one key missing -";
- if (nif_q_done==0 && countitem(7184) > 5) goto L_event;//Items: Piano Key,
- close;
-
-L_event:
- delitem 7184,6;//Items: Piano Key,
- set nif_quest_done, 1;
- //clear auxiliary vars now
- set nif_quest1, 0;
- set nif_quest2, 0;
- set nif_quest3, 0;
- set nif_quest4, 0;
- set nif_quest5, 0;
- set nif_random,0; //clear garbage
- set nif_random1,0; //clear garbage
- mes "- You slide the 6 piano keys one -";
- mes "- by one into the missing slots -";
- mes "- on the piano, but you realise -";
- 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 (nif_q_done != 1) 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 "[Kilgana]";
- 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 "[Kilgana]";
- mes "I shall use my powers to send you back";
- mes "but you should not return in the future.";
- warp "umbala.gat",138,208;
- close;
-}
+//===== eAthena Script =======================================
+//= Niflheim Script
+//===== By: ==================================================
+//= Fyrien, Dizzy, PKGINGO
+//= Official NPCs translated and re-edited by Celest
+//===== Current Version: =====================================
+//= 1.05
+//===== 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]
+//=
+//= TODO: remove any save points from Niflheim (from Kafra)
+//= remove or commetn Warpers (they make Niflheim Piano Quest meaningless)
+//============================================================
+
+prontera.gat,164,161,4 script Traveler::NifTrav 68,{
+ mes "[Traveler]";
+ mes "I've come across some strange things in my time. Things you'd have to see to belive. Have you heard of Niffleheim, the City of the Dead?";
+ next;
+ menu "Show me, please...",M_show, "Sounds scarey...Nevermind...",-;
+
+ mes "[Traveler]";
+ mes "A wise choice by any means...";
+ close;
+M_show:
+ warp "niflheim.gat",202,171;
+ close;
+}
+- script EDNifTrav -1,{
+OnInit:
+OnMinute00:
+ disablenpc "NifTrav";
+ end;
+OnMinute56:
+ enablenpc "NifTrav";
+ end;
+}
+
+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,184,199,5 script Little Girl 793,{
+ mes "[Sairin]";
+ if(niflheimlost2 == 1) goto L_thanks;
+ if(niflheimlost == 1) goto L_foundhim;
+ if(lostgirl == 1) goto L_sure2;
+ mes "Sir, will you please help me?";
+ if(Class==Job_Novice) mes "Oh... you are lost, too..."; //Exploit fix
+ if(Class==Job_Novice) 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",-, "No",M_no;
+L_sure2:
+ set lostgirl,1;
+ mes "Please find him and tell him where I am! I saw him last in Niflheim Field, the first one...";
+ close;
+
+L_foundhim:
+ 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 niflheimlost2,1;
+ close;
+L_thanks:
+ mes "Thanks again!";
+M_no:
+ close;
+}
+
+nif_fild01.gat,213,268,5 script Little Boy 797,{
+ mes "[Marius]";
+ if(niflheimlost == 1) goto L_alreadydone;
+ if(lostgirl == 1) goto L_sure2;
+ mes "Sairin...where are you?";
+ close;
+L_alreadydone:
+ mes "Thank you for helping us!";
+ close;
+L_sure2:
+ mes "Who are you?";
+ mes "...";
+ mes "You found Sairin?";
+ mes "She ran to Niflheim?";
+ next;
+ set niflheimlost,1;
+ 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.";
+ menu "Yes",L_alreadydone, "No",-;
+
+ close;
+}
+
+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 "[Anne]";
+ 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 "[Anne]";
+ 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 "[Anne]";
+ 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 "[Anne]";
+ mes "Curse... My grandma told me";
+ mes "she has a way to avoid any curse";
+ mes "unlifteable by holy blessings...";
+ next;
+ mes "[Anne]";
+ mes "Klaatu...";
+ mes "Verata.....";
+ mes "And... something... something... what was it?";
+ mes "I can't remember the last one.";
+ next;
+ mes "[Anne]";
+ 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 "[Anne]";
+ 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 802,{
+ killmonster "niflheim.gat","mymob";
+ mes "[Aesop 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 "[Aesop]";
+ 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,"mymob";
+ close;
+
+L_book2:
+ mes "[Aesop 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;
+ set @nif_random1,rand(1,10);
+ mes "[Aesop Bruce]";
+ mes "Ahahaha.... i see you are brave!!";
+ mes "Start reading your prayersahahahah!!";
+ next;
+L_MENU1:
+ menu "Clover.",L_MENU1_1,"Klaatu.",L_MENU1_2,"Kleitos.",L_MENU1_3;
+
+ L_MENU1_1:
+ goto L_MENU2;
+
+ L_MENU1_2:
+ set nif_t,nif_t + 10;
+ goto L_MENU2;
+
+ L_MENU1_3:
+ goto L_MENU2;
+
+L_MENU2:
+ menu "Verit.",L_MENU2_1,"Veritas.",L_MENU2_2,"Verata.",L_MENU2_3;
+
+ L_MENU2_1:
+ goto L_MENU3;
+
+ L_MENU2_2:
+ goto L_MENU3;
+
+ L_MENU2_3:
+ set nif_t,nif_t + 10;
+ goto L_MENU3;
+
+L_MENU3:
+ menu "Necktie.",L_MENU3_1,"Necklace.",L_MENU3_2,"Nero.",L_MENU3_3,"^FFFFFFNictu.^000000",L_MENU3_4;
+
+ L_MENU3_1:
+ goto L_score;
+
+ L_MENU3_2:
+ goto L_score;
+
+ L_MENU3_3:
+ goto L_score;
+
+ L_MENU3_4:
+ set nif_t,nif_t + 10;
+ goto L_score;
+
+
+L_score:
+ if (nif_t == 30) goto L_sucess1;
+ mes "[Aesop Bruce]";
+ mes "Hahahaha!! Your prayers were wrong!!";
+ mes "Time to face deathohohohoho,";
+ mes "May you be cured forevahahahaha!!";
+ monster "niflheim.gat",349,256,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",347,258,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",347,254,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",350,252,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",344,255,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",348,252,"Orc Skeleton",1462,1,"mymob";
+ monster "niflheim.gat",347,259,"Orc Skeleton",1462,1,"mymob";
+ close;
+
+L_sucess1:
+ if (@nif_random1 == 10) goto L_sucess2;
+ mes "[Aesop Bruce]";
+ mes "Your prayers were correctaaahhhh...";
+ mes "but your curse still remainsaaahhhh!!";
+ mes "Haahahahaha.....!!!";
+ close;
+
+L_sucess2:
+ mes "[Aesop Bruce]";
+ mes "Hahahaha!! Your curse has been lifted!!";
+ mes "Gahahahaha.....!!!";
+ close;
+
+L_back:
+ mes "[Aesop Bruce]";
+ mes "Ahahahaha! Not bad thinking at alllhhhaahaaa...";
+ mes "I shall pray that you live to returnahhhh....";
+ close;
+}
+
+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_quest1 == 1 || nif_q_done == 1) 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_quest1, 1;
+ close;
+L_end:
+ percentheal -30,0;
+ close;
+}
+
+nif_in.gat,105,81,3 script Grey 794,{
+ mes "[Grey]";
+ 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 "[Grey]";
+ 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;
+ if (nif_quest2 == 1 || nif_q_done == 1) goto L_end;
+ set @nif_random,rand(1,4);
+ mes "[Grey]";
+ 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$;
+ if (@nif_random == 2) goto L_RAN_2;
+ if (@nif_random == 3) goto L_RAN_3;
+ if (@nif_random == 4) goto L_RAN_4;
+ //if (@nif_random == 1) goto L_RAN_1;
+ L_RAN_1:
+ set @str1$,"When the sun sets in the western hills,";
+ goto L_RAN_B;
+
+ L_RAN_2:
+ set @str1$,"Where points the velvet gloom of dawn,";
+ goto L_RAN_B;
+
+ L_RAN_3:
+ set @str1$,"The beautiful melody surrounding thy soul,";
+ goto L_RAN_B;
+
+ L_RAN_4:
+ set @str1$,"Is the key from Lord Death's wrath.";
+ goto L_RAN_B;
+
+ L_RAN_B:
+ if (@inputstr1$ == @str1$) goto L_RAN_SC;
+ mes "[Grey]";
+ 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;
+
+ L_RAN_SC:
+ mes "[Grey]";
+ 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_quest2, 1;
+ next;
+ mes "[Grey]";
+ mes "I hope you will treat other poets";
+ mes "as well as you treated me, farewell.";
+ close;
+
+L_end:
+ mes "[Grey]";
+ 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 myterious secret";
+ mes "hidden within these words...";
+ 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_quest3 == 1 || nif_q_done == 1) 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_quest3, 1;
+ 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 (nif_q_done == 1) end;
+ if (nif_quest4 == 1) 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_quest4, 1;
+L_end:
+ close;
+}
+
+niflheim.gat,208,103,5 script #2 111,2,2{
+ if (nif_q_done == 1) end;
+ if (nif_quest5 == 1) goto L_key2;
+ if (nif_quest5 >= 2) 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_quest5, 1;
+ close;
+L_key2:
+ 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_quest5, 2;
+L_end:
+ close;
+}
+
+nif_in.gat,115,181,5 script #4 111,3,3{
+ mes "- You see a huge old piano -";
+ if if (nif_q_done==0) mes "- with a few keys missing -";
+ if if (nif_q_done==1) mes "- with one key missing -";
+ if (nif_q_done==0 && countitem(7184) > 5) goto L_event;//Items: Piano Key,
+ close;
+
+L_event:
+ delitem 7184,6;//Items: Piano Key,
+ set nif_quest_done, 1;
+ //clear auxiliary vars now
+ set nif_quest1, 0;
+ set nif_quest2, 0;
+ set nif_quest3, 0;
+ set nif_quest4, 0;
+ set nif_quest5, 0;
+ set nif_random,0; //clear garbage
+ set nif_random1,0; //clear garbage
+ mes "- You slide the 6 piano keys one -";
+ mes "- by one into the missing slots -";
+ mes "- on the piano, but you realise -";
+ 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 (nif_q_done != 1) 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 "[Kilgana]";
+ 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 "[Kilgana]";
+ mes "I shall use my powers to send you back";
+ mes "but you should not return in the future.";
+ warp "umbala.gat",138,208;
+ close;
+}
diff --git a/npc/cities/payon.txt b/npc/cities/payon.txt
index 746410668..b507a447b 100644
--- a/npc/cities/payon.txt
+++ b/npc/cities/payon.txt
@@ -1,816 +1,816 @@
-//===== eAthena Script =======================================
-//= Payon City
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//= Muad Dib (1.2)
-//= Darkchild (1.3)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= (New) Payon City Npcs
-//===== Additional Comments: =================================
-//= Most Credits To Muad Dib, Some Stuff By Me
-//============================================================
-
-payon.gat,190,115,0 script Lady 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 0;
- 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 consiquences for this town.";
- next;
- mes "[Lady]";
- mes "You see, because they were not given a proper burrial, the dead were not able to leave this world and pass on to the other world.";
- mes "Instead they became mindless zombies, wrethced 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 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 magics, 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 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 16;
- 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 feell so melancholy and bored.";
- emotion 28;
- 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?";
- check Gender = 1,-,LStartF;
- mes "[Waitress]";
- mes "Hello, mister?";
-LStartF:
- mes "[Waitress]";
- 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 managable life everyday!!";
- mes "Oh..boy. What a dumb wishy-washy person I am.";
- emotion 6;
- 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 misbehaviour.";
- emotion 4;
- next;
- mes "[Waitress]";
- mes "So, how may I help you? ";
- 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 5;
- 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 alchohol 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 17;
- close;
-L_Menu4:
- mes "[Waitress]";
- mes "Have a nice day, dear.";
- mes "Sob...I wish I could be in bed of roses.";
- emotion 28;
- close;
-}
-
-payon.gat,193,116,1 script Woman 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 == 0) goto LStartF;
- 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 20;
-LStartF:
- 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 20;
- 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 20;
- close;
-L_Menu2:
- mes "[Woman]";
- mes "No need to worry about prepapring 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 husban... oops... I mean an aquantence of mine... heh heh..";
- emotion 4;
- 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 5;
- 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 18;
- close;
-}
-
-payon.gat,190,119,5 script Woman 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 9;
- 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 == 0) goto LStartF;
- 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 30;
-LStartF:
- mes "Don't you think your dress is too lousy?";
- mes "I don't like young ladies pounce up.";
- next;
- menu "Fortune Telling?",L_Menu1,"...Good Bye.",L_Menu2;
-L_Menu1:
- 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 acurate 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 == 0) goto L_2;
- mes ".......... tehehe. (winks at you)";
-L_2:
- emotion 3;
- close;
-L_Menu2:
- 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,{
- if(Class != 3) goto L_Menu1_F1;
- mes "[Drunk]";
- 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 18;
-L_Menu1_F1:
- mes "[Drunk]";
- mes "Yoyo! Archer brother! Salute to your fingers stratching bowstring!";
- emotion 2;
- 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:
- if(Class == 3) goto L1L;
- mes "Thanksh!... shhtrangersszz are alwayssszz a generoushhh bunch!... archer guysh are penny pinchershh nowadayssszz!..(hicup!)";
- goto L1L;
-L1L:
- if(Class != 3) goto L2L;
- mes "Thanksh brothaaa!... archerrrzzz are alwayssszz a generoushhh bunch!...(hicup!)";
- goto L2L;
-L2L:
- emotion 15;
- 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 consmetics and stuff!";
- next;
- mes "[Drunk]";
- mes "Gulp~Gulp~Man! This is great! Thank you may man! Thank you! Muhahahahaha!";
- emotion 21;
- 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 32;
- close;
-L_Menu3:
- mes "[Drunk]";
- mes "Umm, oookay. Fine by me...";
- emotion 21;
- 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 7;
- next;
- menu "Archer?",L_Menu1,"Chief?",L_Menu2,"Big Mouth?",L_Menu3;
-L_Menu1:
- 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 realised 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 "Tactiturnity 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 dilligent.";
- next;
- mes "[Archer Wolt]";
- mes "Are you curious about HOW we practice?";
- emotion 1;
- 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 5;
- 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 21;
- 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 gererations to come.";
- next;
- mes "[Archer Wolt]";
- mes "Unfortunatley many of the wonderfull 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 beatifull 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 realise 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 realise 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 4;
- 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 thats 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 trys 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 gotta 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 dilligent.";
- 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 21;
- 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 33;
- 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 33;
- 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 0;
- 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 23;
- next;
- mes "[Archer Joe]";
- mes "Please come back later when you become more skillfull! 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 20;
- close;
-}
-
-payon_in01.gat,144,9,2 script Monster Scholar 98,{
- mes "[Monster Scholar Vuicokk]";
- mes "Nice to meet you. I am Vuicokk the cholar in the monster research organization of Rune Midgard.";
- mes "Do you have any questions about monsters of Rune Midgard?";
- next;
- menu "Late News.",L_Menu1,"Undead Monster.",L_Menu2,"Monster Research Organization.",L_Menu3,"Good day",L_End;
-L_Menu1:
- 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 analysing 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 totaly 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 "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 scientest 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 reaserch team.";
- next;
- mes "[Monster Scholar Vuicokk]";
- mes "However NOTHING can stop us! We will continue to perservere for the bennifit of the people of RUNE MIDGARD!!!";
- emotion 0;
- 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.";
-L_End:
- mes "[Monster Scholar Vuicokk]";
- mes "Have a nice day.";
- close;
-}
-
-payon_in03.gat,100,186,4 script Chief 120,{
- if(BaseLevel > 30) goto L_Menu1;
- set @R_SEL_NUM,rand(2);
- if(@R_SEL_NUM != 0) goto T_TALK0;
- mes "[Palace Guardsman]";
- mes "Hey hey! Show your respect to the chief!";
- close;
-T_TALK0:
- if(@R_SEL_NUM != 1) goto T_TALK2;
- mes "[Palace Guardsman]";
- mes "Hey! I said...";
- next;
- mes "[Chief]";
- mes "That's fine, I am ok. It's been a long time since I talked to such young people.";
- 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 civillized 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 elemetal 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 goto 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 approch 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 challange on the class.";
- close;
- next;
-T_TALK2:
- if(@R_SEL_NUM != 3) goto T_TALK3;
- mes "[Chief]";
- mes "Tired... I'd better take a rest then. Take care of yourself.";
- close;
-T_TALK3:
- mes "[Palace Guardsman]";
- mes "The Chief is taking a rest. Would you mind if I ask you to come back later?";
- close;
-}
-
-payon.gat,160,246,4 script Palace Guardsman 708,{
- mes "[Place Guardsman]";
- mes "Halt!";
- next;
- mes "[Palace Guardsman]";
- mes "You are about to enter the Royal Palace, home of the Payon Royal Family. You must be at your best behavior at all times while in the palace.";
- next;
- mes "[Palace Guardsman]";
- mes "I will need to disarm you for the time being. If you do not cooperate you will not be able to enter the Palace";
- nude;
-//nude; will disarm you
- next;
- warp "payon_in03.gat",98,118;
- close;
-}
-
-payon.gat,151,246,4 script Palace Guardsman 708,{
- mes "[Palace Guardsman]";
- mes ".............";
- close;
-}
-
-payon_in03.gat,102,116,4 script Palace Guardsman 708,{
- mes "[Place Guardsman]";
- mes "What brings you here?";
- emotion 1;
- next;
- mes "[Palace Guardsman]";
- mes "I can see that you are not from around here. I suggest that you behave yourself while you are here.";
- mes "We will not tolerate any direspectfull or abberant behavior.";
- close;
-}
-
-payon_in03.gat,95,116,4 script Palace Guardsman 708,{
- mes "[Palace Guardsman]";
- mes ".............";
- close;
-}
-
-payon_in03.gat,92,157,4 script Palace Guardsman 708,{
- mes "[Palace Guardsman]";
- mes ".............";
- close;
-}
-
-payon_in03.gat,107,157,4 script Palace Guard Chief 708,{
- if(BaseLevel < 30) goto L_Less;
- mes "[Palace Guard Chief]";
- mes "I see that you are a well trained warrior. You may have the privalege of speaking with the Elder Chief. But remember to be respectfull to him at all times!!!";
- next;
- mes "[Palace Guard Chief]";
- mes "If NOT......(cracks his nuckles)....!!!";
- emotion 29;
- close;
-L_Less:
- mes "[Palace Guard Chief]";
- mes "Halt. Only mighty warriors are worthy to speak face to face with the Elder Chief. You still need to train more";
- next;
- mes "[Palace Guard Chief]";
- mes "Please leave";
- next;
- warp "payon_in03.gat",99,129;
- close;
-}
-
-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;
-}
-
-// New kRO Npc's
-
-payon.gat,173,238,4 script Unknown 740,{
- mes "[Unknown]";
- mes "This is an new kRO Npc";
- mes "This Npc hasn't been translated yet";
- mes "I by excident you know what this npc is and could translate it";
- mes "Please contact Darkchild (eAthena Dev)";
- close;
-}
-
-payon_in03.gat,75,129,4 script Unknown 704,{
- mes "[Unknown]";
- mes "This is an new kRO Npc";
- mes "This Npc hasn't been translated yet";
- mes "I by excident you know what this npc is and could translate it";
- mes "Please contact Darkchild (eAthena Dev)";
- close;
-}
-
-payon_in03.gat,117,128,4 script Unknown 704,{
- mes "[Unknown]";
- mes "This is an new kRO Npc";
- mes "This Npc hasn't been translated yet";
- mes "I by excident you know what this npc is and could translate it";
- mes "Please contact Darkchild (eAthena Dev)";
- close;
-}
-
-payon_in03.gat,118,119,8 script Unknown 101,{
- mes "[Unknown]";
- mes "This is an new kRO Npc";
- mes "This Npc hasn't been translated yet";
- mes "I by excident you know what this npc is and could translate it";
- mes "Please contact Darkchild (eAthena Dev)";
- close;
-}
-
-payon_in03.gat,131,7,4 script Unknown 59,{
- mes "[Unknown]";
- mes "This is an new kRO Npc";
- mes "This Npc hasn't been translated yet";
- mes "I by excident you know what this npc is and could translate it";
- mes "Please contact Darkchild (eAthena Dev)";
- close;
-}
-
+//===== eAthena Script =======================================
+//= Payon City
+//===== By: ==================================================
+//= Muad Dib (1.0)
+//= Darkchild (1.1)
+//= Muad Dib (1.2)
+//= Darkchild (1.3)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= (New) Payon City Npcs
+//===== Additional Comments: =================================
+//= Most Credits To Muad Dib, Some Stuff By Me
+//============================================================
+
+payon.gat,190,115,0 script Lady 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 0;
+ 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 consiquences for this town.";
+ next;
+ mes "[Lady]";
+ mes "You see, because they were not given a proper burrial, the dead were not able to leave this world and pass on to the other world.";
+ mes "Instead they became mindless zombies, wrethced 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 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 magics, 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 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 16;
+ 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 feell so melancholy and bored.";
+ emotion 28;
+ 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?";
+ check Gender = 1,-,LStartF;
+ mes "[Waitress]";
+ mes "Hello, mister?";
+LStartF:
+ mes "[Waitress]";
+ 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 managable life everyday!!";
+ mes "Oh..boy. What a dumb wishy-washy person I am.";
+ emotion 6;
+ 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 misbehaviour.";
+ emotion 4;
+ next;
+ mes "[Waitress]";
+ mes "So, how may I help you? ";
+ 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 5;
+ 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 alchohol 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 17;
+ close;
+L_Menu4:
+ mes "[Waitress]";
+ mes "Have a nice day, dear.";
+ mes "Sob...I wish I could be in bed of roses.";
+ emotion 28;
+ close;
+}
+
+payon.gat,193,116,1 script Woman 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 == 0) goto LStartF;
+ 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 20;
+LStartF:
+ 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 20;
+ 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 20;
+ close;
+L_Menu2:
+ mes "[Woman]";
+ mes "No need to worry about prepapring 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 husban... oops... I mean an aquantence of mine... heh heh..";
+ emotion 4;
+ 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 5;
+ 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 18;
+ close;
+}
+
+payon.gat,190,119,5 script Woman 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 9;
+ 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 == 0) goto LStartF;
+ 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 30;
+LStartF:
+ mes "Don't you think your dress is too lousy?";
+ mes "I don't like young ladies pounce up.";
+ next;
+ menu "Fortune Telling?",L_Menu1,"...Good Bye.",L_Menu2;
+L_Menu1:
+ 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 acurate 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 == 0) goto L_2;
+ mes ".......... tehehe. (winks at you)";
+L_2:
+ emotion 3;
+ close;
+L_Menu2:
+ 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,{
+ if(Class != 3) goto L_Menu1_F1;
+ mes "[Drunk]";
+ 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 18;
+L_Menu1_F1:
+ mes "[Drunk]";
+ mes "Yoyo! Archer brother! Salute to your fingers stratching bowstring!";
+ emotion 2;
+ 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:
+ if(Class == 3) goto L1L;
+ mes "Thanksh!... shhtrangersszz are alwayssszz a generoushhh bunch!... archer guysh are penny pinchershh nowadayssszz!..(hicup!)";
+ goto L1L;
+L1L:
+ if(Class != 3) goto L2L;
+ mes "Thanksh brothaaa!... archerrrzzz are alwayssszz a generoushhh bunch!...(hicup!)";
+ goto L2L;
+L2L:
+ emotion 15;
+ 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 consmetics and stuff!";
+ next;
+ mes "[Drunk]";
+ mes "Gulp~Gulp~Man! This is great! Thank you may man! Thank you! Muhahahahaha!";
+ emotion 21;
+ 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 32;
+ close;
+L_Menu3:
+ mes "[Drunk]";
+ mes "Umm, oookay. Fine by me...";
+ emotion 21;
+ 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 7;
+ next;
+ menu "Archer?",L_Menu1,"Chief?",L_Menu2,"Big Mouth?",L_Menu3;
+L_Menu1:
+ 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 realised 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 "Tactiturnity 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 dilligent.";
+ next;
+ mes "[Archer Wolt]";
+ mes "Are you curious about HOW we practice?";
+ emotion 1;
+ 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 5;
+ 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 21;
+ 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 gererations to come.";
+ next;
+ mes "[Archer Wolt]";
+ mes "Unfortunatley many of the wonderfull 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 beatifull 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 realise 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 realise 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 4;
+ 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 thats 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 trys 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 gotta 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 dilligent.";
+ 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 21;
+ 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 33;
+ 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 33;
+ 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 0;
+ 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 23;
+ next;
+ mes "[Archer Joe]";
+ mes "Please come back later when you become more skillfull! 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 20;
+ close;
+}
+
+payon_in01.gat,144,9,2 script Monster Scholar 98,{
+ mes "[Monster Scholar Vuicokk]";
+ mes "Nice to meet you. I am Vuicokk the cholar in the monster research organization of Rune Midgard.";
+ mes "Do you have any questions about monsters of Rune Midgard?";
+ next;
+ menu "Late News.",L_Menu1,"Undead Monster.",L_Menu2,"Monster Research Organization.",L_Menu3,"Good day",L_End;
+L_Menu1:
+ 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 analysing 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 totaly 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 "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 scientest 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 reaserch team.";
+ next;
+ mes "[Monster Scholar Vuicokk]";
+ mes "However NOTHING can stop us! We will continue to perservere for the bennifit of the people of RUNE MIDGARD!!!";
+ emotion 0;
+ 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.";
+L_End:
+ mes "[Monster Scholar Vuicokk]";
+ mes "Have a nice day.";
+ close;
+}
+
+payon_in03.gat,100,186,4 script Chief 120,{
+ if(BaseLevel > 30) goto L_Menu1;
+ set @R_SEL_NUM,rand(2);
+ if(@R_SEL_NUM != 0) goto T_TALK0;
+ mes "[Palace Guardsman]";
+ mes "Hey hey! Show your respect to the chief!";
+ close;
+T_TALK0:
+ if(@R_SEL_NUM != 1) goto T_TALK2;
+ mes "[Palace Guardsman]";
+ mes "Hey! I said...";
+ next;
+ mes "[Chief]";
+ mes "That's fine, I am ok. It's been a long time since I talked to such young people.";
+ 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 civillized 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 elemetal 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 goto 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 approch 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 challange on the class.";
+ close;
+ next;
+T_TALK2:
+ if(@R_SEL_NUM != 3) goto T_TALK3;
+ mes "[Chief]";
+ mes "Tired... I'd better take a rest then. Take care of yourself.";
+ close;
+T_TALK3:
+ mes "[Palace Guardsman]";
+ mes "The Chief is taking a rest. Would you mind if I ask you to come back later?";
+ close;
+}
+
+payon.gat,160,246,4 script Palace Guardsman 708,{
+ mes "[Place Guardsman]";
+ mes "Halt!";
+ next;
+ mes "[Palace Guardsman]";
+ mes "You are about to enter the Royal Palace, home of the Payon Royal Family. You must be at your best behavior at all times while in the palace.";
+ next;
+ mes "[Palace Guardsman]";
+ mes "I will need to disarm you for the time being. If you do not cooperate you will not be able to enter the Palace";
+ nude;
+//nude; will disarm you
+ next;
+ warp "payon_in03.gat",98,118;
+ close;
+}
+
+payon.gat,151,246,4 script Palace Guardsman 708,{
+ mes "[Palace Guardsman]";
+ mes ".............";
+ close;
+}
+
+payon_in03.gat,102,116,4 script Palace Guardsman 708,{
+ mes "[Place Guardsman]";
+ mes "What brings you here?";
+ emotion 1;
+ next;
+ mes "[Palace Guardsman]";
+ mes "I can see that you are not from around here. I suggest that you behave yourself while you are here.";
+ mes "We will not tolerate any direspectfull or abberant behavior.";
+ close;
+}
+
+payon_in03.gat,95,116,4 script Palace Guardsman 708,{
+ mes "[Palace Guardsman]";
+ mes ".............";
+ close;
+}
+
+payon_in03.gat,92,157,4 script Palace Guardsman 708,{
+ mes "[Palace Guardsman]";
+ mes ".............";
+ close;
+}
+
+payon_in03.gat,107,157,4 script Palace Guard Chief 708,{
+ if(BaseLevel < 30) goto L_Less;
+ mes "[Palace Guard Chief]";
+ mes "I see that you are a well trained warrior. You may have the privalege of speaking with the Elder Chief. But remember to be respectfull to him at all times!!!";
+ next;
+ mes "[Palace Guard Chief]";
+ mes "If NOT......(cracks his nuckles)....!!!";
+ emotion 29;
+ close;
+L_Less:
+ mes "[Palace Guard Chief]";
+ mes "Halt. Only mighty warriors are worthy to speak face to face with the Elder Chief. You still need to train more";
+ next;
+ mes "[Palace Guard Chief]";
+ mes "Please leave";
+ next;
+ warp "payon_in03.gat",99,129;
+ close;
+}
+
+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;
+}
+
+// New kRO Npc's
+
+payon.gat,173,238,4 script Unknown 740,{
+ mes "[Unknown]";
+ mes "This is an new kRO Npc";
+ mes "This Npc hasn't been translated yet";
+ mes "I by excident you know what this npc is and could translate it";
+ mes "Please contact Darkchild (eAthena Dev)";
+ close;
+}
+
+payon_in03.gat,75,129,4 script Unknown 704,{
+ mes "[Unknown]";
+ mes "This is an new kRO Npc";
+ mes "This Npc hasn't been translated yet";
+ mes "I by excident you know what this npc is and could translate it";
+ mes "Please contact Darkchild (eAthena Dev)";
+ close;
+}
+
+payon_in03.gat,117,128,4 script Unknown 704,{
+ mes "[Unknown]";
+ mes "This is an new kRO Npc";
+ mes "This Npc hasn't been translated yet";
+ mes "I by excident you know what this npc is and could translate it";
+ mes "Please contact Darkchild (eAthena Dev)";
+ close;
+}
+
+payon_in03.gat,118,119,8 script Unknown 101,{
+ mes "[Unknown]";
+ mes "This is an new kRO Npc";
+ mes "This Npc hasn't been translated yet";
+ mes "I by excident you know what this npc is and could translate it";
+ mes "Please contact Darkchild (eAthena Dev)";
+ close;
+}
+
+payon_in03.gat,131,7,4 script Unknown 59,{
+ mes "[Unknown]";
+ mes "This is an new kRO Npc";
+ mes "This Npc hasn't been translated yet";
+ mes "I by excident you know what this npc is and could translate it";
+ mes "Please contact Darkchild (eAthena Dev)";
+ close;
+}
+
diff --git a/npc/cities/prontera.txt b/npc/cities/prontera.txt
index 4a75d9cac..9d8ef9394 100644
--- a/npc/cities/prontera.txt
+++ b/npc/cities/prontera.txt
@@ -1,618 +1,618 @@
-//===== eAthena Script =======================================
-//= Prontera Town
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-
-// 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",L0,"Cancel",LEnd;
-
- L0:
- 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 Colors.";
- next;
- mes "[Town girl Dairenne]";
- mes "To enchance your Clothing with those Dazzling Colors, 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;
-
- LEnd:
- 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 23;
- next;
- mes "[Merideth]";
- mes "If only a girl like myself had that much power over guys.... NOW THAT, would be really cool!!";
- emotion 29;
- close;
-}
-
-// YuNa ---------------------------------------------------------------------
-prontera.gat,146,204,2 script YuNa 700,{
- mes "[YuNa]";
- mes "Odin is the god of wisdom and war. He couragously 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 pitty because.... becasue....";
- next;
- mes "[YuNa]";
- mes "HE DID IT ALL WRONG!!";
- emotion 7;
- 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 32;
- 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 colored 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;
-}
-
-// ------------------------------------------------------------------------------------------- Culvert -------------------------------------------------------------------------------\\
-// Culvert Gaurdian ----------------------------------------------------
-prt_fild05.gat,270,212,5 script Culvert Gaurdian 105,{
- if(sewer_prt == 1) goto L0;
- mes "[Culvert Guardian]";
- 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;
-
- L0:
- mes "[Culvert Guardian]";
- mes "Here you are. The entrance of the Culvert. Are you sure you want to Go inside?";
- next;
- menu "Sure.",L0a,"Quit.",L1a;
-
- L0a:
- warp "prt_sewb1.gat",131,247;
- close;
- L1a:
- close;
-}
-
-// Recruiter -----------------------------------------------------------
-prt_in.gat,88,105,2 script Recruiter 105,{
- if(sewer_prt == 1) goto L0a;
- mes "[Recruiter]";
- mes "Let me inform about the official Notice from the Capital Defense 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.",L0,"Issues...?",L1,"Quit",LEnd;
-
- L0:
- 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 Defense Headquarter. Here are some subsidies....";
- next;
- mes "[Recruiter]";
- mes "3 Red Potions, 1 Milk, and 1 Orange Potion for an emergency.";
- set sewer_prt,1;
- getitem 501,3;
- getitem 519,1;
- getitem 502,1;
- next;
-
- L0a:
- mes "[Recruiter]";
- mes "Are you ready? I will warp you to the Culvert.";
- next;
- warp "prt_fild05.gat",274,208;
- close;
-
- L1:
- mes "[Recruiter]";
- mes "Didn't you hear yet? The Culvert is infested with noxious insects. We found bugs, moggots, and other creatures there.";
- mes "They've become a huge problem... You've Never heard of this?";
- emotion 1;
- 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 inconvienced 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 restlesness among the people!!";
- next;
- mes "[Recruiter]";
- mes "Mighty Warrior!! The People NEED YOU!! Let's EXPEL these VILE creatures from our land!!!";
- emotion 27;
- next;
- mes "[Recruiter]";
- mes "WILL YOU volunteer????";
- next;
- menu "Volunteer.",L1a,"Quit.",L1aEnd;
-
- L1a:
- goto L0;
- close;
-
- L1aEnd:
- mes "[Recruiter]";
- mes "..............";
- emotion 4;
- close;
- LEnd:
- 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?";
-qMenu:
- next;
- menu "About Divine Protection",L0, "About Demon Bane",L1, "About Decrease AGI",L2, "About Signum Crisis",L3, "About Pneuma",L4,
- "About Ruwach",L5, "About Teleport",L6, "End conversation.",LEnd;
-
- L0:
- mes "[Henson]";
- mes "If you want to improve your Defense 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 qMenu;
- 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 whith 'Devine Protection', 'Demon Bane' is a passive skill and requires no sp and has no time limit.";
- next;
- mes "[Henson]";
- mes "Also, you have to aquire 3 levels of 'Demon Bane' to use a skill called, 'Signum Crisis', which lowers the Defense of Undead and Dark property monsters.";
- next;
- goto qMenu;
- close;
- 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.";
- next;
- goto qMenu;
- close;
- L3:
- mes "[Henson]";
- mes "You can lower the defense 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.";
- next;
- goto qMenu;
- close;
- 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.";
- next;
- goto qMenu;
- close;
- L5:
- mes "[Henson]";
- mes "Ruwach allows you to see hidden monsters or players. You also need this skill to learn 'Teleport.";
- next;
- goto qMenu;
- close;
- 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.";
- next;
- goto qMenu;
- close;
- LEnd:
- 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 preist scolds me for my lack of skill, I can assure you I have a VERY STRONG grasp of the theories.";
- next;
- qMenu:
- menu "About Heal",L0,"About Cure",L1,"About Increase AGI",L2,"About Angelus",L3,"Abour Blessing",L4,"About Warp Portal",L5,"End conversation",LEnd;
-
- L0:
- 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~~!";
- next;
- goto qMenu;
- close;
- L1:
- mes "[Garnet]";
- mes "'Cure' can allieviate any abnormal status effects you may have. You have to have level 2 'Heal' in order to learn Cure though.";
- next;
- goto qMenu;
- close;
- 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'.";
- next;
- goto qMenu;
- close;
- L3:
- mes "[Garnet]";
- mes "You can use 'Angelus' in order to increase the Defense 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.";
- next;
- goto qMenu;
- close;
- 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.";
- next;
- goto qMenu;
- close;
- 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.";
- next;
- goto qMenu;
- close;
- LEnd:
- 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 0;
- 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?",L0,"Never mind",LEnd;
-
- L0:
- mes "[Shevild]";
- mes "In spite of how I look, I'm a all around-player~~!!!";
- mes "I go hunting, I carry waepons 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 20;
- next;
- qMenu:
- menu "The mysterious Dungeon?",L00,"The dangerous forest?",L01,"End conversation",L00End;
-
- L00:
- 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 "Rumor says that the monsters are very tough there, but because of the high risk that you take, you get rewarded with valuble 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?",L00a,"End conversation",L00End;
-
- L00a:
- 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 ot the north-west side of the forest.";
- emotion 1;
- next;
- goto qMenu;
-
- 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 sone as you drop something on the ground, a Yoyo jumps out of nowhere and snatches it.";
- next;
- menu "How can I get there?",L01a,"End conversation",L00End;
-
- L01a:
- 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 qMenu;
-
- L00End:
- mes "[Shevild]";
- mes "Okay... Anyways watch out while you're traveling outhere ~ pal!!";
- close;
- LEnd:
- mes "[Shevild]";
- mes "Sure... if you wanna hear more, come back here anytime. No problem~~";
- close;
-}
-
-// Bartender ---------------------------------------------------------
-prt_in.gat,181,21,2 script Bartender 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 townn anymore.";
- 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 thing's don't change... my special menu of 'Sour Crunches' and 'Tasty Yum-Yum' will disappear from people's memories, sob... sob...";
- emotion 28;
- next;
- qMenu:
- menu "'Sour Crunches'?",L0,"'Tasty Yum-Yum?'",L1,"Better let him be....",LEnd;
-
- L0:
- 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 Morrocco.";
- mes "The problem is that the number of ants grows exponentialy 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 qMenu;
- L1:
- mes "[Bartender]";
- mes "It is a very tasty dish preparred 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 qMenu;
- LEnd:
- 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 requiere 1 or 2 levels.";
- mes "How pitiful would it be if you didn't learn a tremendously useful skill only beacuse 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,0;
- set @TEMP,rand(3);
- if(@TEMP == 2) goto Rmsg2;
- if(@TEMP == 1) goto Rmsg1;
- if(@TEMP == 0) goto Rmsg0;
-
- Rmsg2:
- 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 satelitte of Prontera.";
- emotion 1;
- next;
- mes "[TenSue]";
- mes "Cool Event Corp. has opened up the arena called Time Limit Fight and Battle Ordeal, to fullfill the young poeple'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;
- Rmsg1:
- mes "One time I walked all the way to a place called 'Al de Baran'. 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;
- Rmsg0:
- mes "Prontera is presently under the reign of Tristram the 3rd. Everything we have now is only avaiable 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,{
- mes "[Librarian Ellen]";
- mes "Welcome. You can find books about monsters, organized by thier 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.";
- 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 thier properties.";
- mes "If you are interested, you should stop by there, too.";
- close;
-}
+//===== eAthena Script =======================================
+//= Prontera Town
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+
+// 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",L0,"Cancel",LEnd;
+
+ L0:
+ 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 Colors.";
+ next;
+ mes "[Town girl Dairenne]";
+ mes "To enchance your Clothing with those Dazzling Colors, 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;
+
+ LEnd:
+ 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 23;
+ next;
+ mes "[Merideth]";
+ mes "If only a girl like myself had that much power over guys.... NOW THAT, would be really cool!!";
+ emotion 29;
+ close;
+}
+
+// YuNa ---------------------------------------------------------------------
+prontera.gat,146,204,2 script YuNa 700,{
+ mes "[YuNa]";
+ mes "Odin is the god of wisdom and war. He couragously 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 pitty because.... becasue....";
+ next;
+ mes "[YuNa]";
+ mes "HE DID IT ALL WRONG!!";
+ emotion 7;
+ 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 32;
+ 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 colored 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;
+}
+
+// ------------------------------------------------------------------------------------------- Culvert -------------------------------------------------------------------------------\\
+// Culvert Gaurdian ----------------------------------------------------
+prt_fild05.gat,270,212,5 script Culvert Gaurdian 105,{
+ if(sewer_prt == 1) goto L0;
+ mes "[Culvert Guardian]";
+ 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;
+
+ L0:
+ mes "[Culvert Guardian]";
+ mes "Here you are. The entrance of the Culvert. Are you sure you want to Go inside?";
+ next;
+ menu "Sure.",L0a,"Quit.",L1a;
+
+ L0a:
+ warp "prt_sewb1.gat",131,247;
+ close;
+ L1a:
+ close;
+}
+
+// Recruiter -----------------------------------------------------------
+prt_in.gat,88,105,2 script Recruiter 105,{
+ if(sewer_prt == 1) goto L0a;
+ mes "[Recruiter]";
+ mes "Let me inform about the official Notice from the Capital Defense 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.",L0,"Issues...?",L1,"Quit",LEnd;
+
+ L0:
+ 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 Defense Headquarter. Here are some subsidies....";
+ next;
+ mes "[Recruiter]";
+ mes "3 Red Potions, 1 Milk, and 1 Orange Potion for an emergency.";
+ set sewer_prt,1;
+ getitem 501,3;
+ getitem 519,1;
+ getitem 502,1;
+ next;
+
+ L0a:
+ mes "[Recruiter]";
+ mes "Are you ready? I will warp you to the Culvert.";
+ next;
+ warp "prt_fild05.gat",274,208;
+ close;
+
+ L1:
+ mes "[Recruiter]";
+ mes "Didn't you hear yet? The Culvert is infested with noxious insects. We found bugs, moggots, and other creatures there.";
+ mes "They've become a huge problem... You've Never heard of this?";
+ emotion 1;
+ 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 inconvienced 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 restlesness among the people!!";
+ next;
+ mes "[Recruiter]";
+ mes "Mighty Warrior!! The People NEED YOU!! Let's EXPEL these VILE creatures from our land!!!";
+ emotion 27;
+ next;
+ mes "[Recruiter]";
+ mes "WILL YOU volunteer????";
+ next;
+ menu "Volunteer.",L1a,"Quit.",L1aEnd;
+
+ L1a:
+ goto L0;
+ close;
+
+ L1aEnd:
+ mes "[Recruiter]";
+ mes "..............";
+ emotion 4;
+ close;
+ LEnd:
+ 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?";
+qMenu:
+ next;
+ menu "About Divine Protection",L0, "About Demon Bane",L1, "About Decrease AGI",L2, "About Signum Crisis",L3, "About Pneuma",L4,
+ "About Ruwach",L5, "About Teleport",L6, "End conversation.",LEnd;
+
+ L0:
+ mes "[Henson]";
+ mes "If you want to improve your Defense 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 qMenu;
+ 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 whith 'Devine Protection', 'Demon Bane' is a passive skill and requires no sp and has no time limit.";
+ next;
+ mes "[Henson]";
+ mes "Also, you have to aquire 3 levels of 'Demon Bane' to use a skill called, 'Signum Crisis', which lowers the Defense of Undead and Dark property monsters.";
+ next;
+ goto qMenu;
+ close;
+ 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.";
+ next;
+ goto qMenu;
+ close;
+ L3:
+ mes "[Henson]";
+ mes "You can lower the defense 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.";
+ next;
+ goto qMenu;
+ close;
+ 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.";
+ next;
+ goto qMenu;
+ close;
+ L5:
+ mes "[Henson]";
+ mes "Ruwach allows you to see hidden monsters or players. You also need this skill to learn 'Teleport.";
+ next;
+ goto qMenu;
+ close;
+ 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.";
+ next;
+ goto qMenu;
+ close;
+ LEnd:
+ 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 preist scolds me for my lack of skill, I can assure you I have a VERY STRONG grasp of the theories.";
+ next;
+ qMenu:
+ menu "About Heal",L0,"About Cure",L1,"About Increase AGI",L2,"About Angelus",L3,"Abour Blessing",L4,"About Warp Portal",L5,"End conversation",LEnd;
+
+ L0:
+ 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~~!";
+ next;
+ goto qMenu;
+ close;
+ L1:
+ mes "[Garnet]";
+ mes "'Cure' can allieviate any abnormal status effects you may have. You have to have level 2 'Heal' in order to learn Cure though.";
+ next;
+ goto qMenu;
+ close;
+ 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'.";
+ next;
+ goto qMenu;
+ close;
+ L3:
+ mes "[Garnet]";
+ mes "You can use 'Angelus' in order to increase the Defense 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.";
+ next;
+ goto qMenu;
+ close;
+ 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.";
+ next;
+ goto qMenu;
+ close;
+ 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.";
+ next;
+ goto qMenu;
+ close;
+ LEnd:
+ 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 0;
+ 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?",L0,"Never mind",LEnd;
+
+ L0:
+ mes "[Shevild]";
+ mes "In spite of how I look, I'm a all around-player~~!!!";
+ mes "I go hunting, I carry waepons 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 20;
+ next;
+ qMenu:
+ menu "The mysterious Dungeon?",L00,"The dangerous forest?",L01,"End conversation",L00End;
+
+ L00:
+ 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 "Rumor says that the monsters are very tough there, but because of the high risk that you take, you get rewarded with valuble 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?",L00a,"End conversation",L00End;
+
+ L00a:
+ 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 ot the north-west side of the forest.";
+ emotion 1;
+ next;
+ goto qMenu;
+
+ 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 sone as you drop something on the ground, a Yoyo jumps out of nowhere and snatches it.";
+ next;
+ menu "How can I get there?",L01a,"End conversation",L00End;
+
+ L01a:
+ 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 qMenu;
+
+ L00End:
+ mes "[Shevild]";
+ mes "Okay... Anyways watch out while you're traveling outhere ~ pal!!";
+ close;
+ LEnd:
+ mes "[Shevild]";
+ mes "Sure... if you wanna hear more, come back here anytime. No problem~~";
+ close;
+}
+
+// Bartender ---------------------------------------------------------
+prt_in.gat,181,21,2 script Bartender 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 townn anymore.";
+ 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 thing's don't change... my special menu of 'Sour Crunches' and 'Tasty Yum-Yum' will disappear from people's memories, sob... sob...";
+ emotion 28;
+ next;
+ qMenu:
+ menu "'Sour Crunches'?",L0,"'Tasty Yum-Yum?'",L1,"Better let him be....",LEnd;
+
+ L0:
+ 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 Morrocco.";
+ mes "The problem is that the number of ants grows exponentialy 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 qMenu;
+ L1:
+ mes "[Bartender]";
+ mes "It is a very tasty dish preparred 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 qMenu;
+ LEnd:
+ 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 requiere 1 or 2 levels.";
+ mes "How pitiful would it be if you didn't learn a tremendously useful skill only beacuse 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,0;
+ set @TEMP,rand(3);
+ if(@TEMP == 2) goto Rmsg2;
+ if(@TEMP == 1) goto Rmsg1;
+ if(@TEMP == 0) goto Rmsg0;
+
+ Rmsg2:
+ 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 satelitte of Prontera.";
+ emotion 1;
+ next;
+ mes "[TenSue]";
+ mes "Cool Event Corp. has opened up the arena called Time Limit Fight and Battle Ordeal, to fullfill the young poeple'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;
+ Rmsg1:
+ mes "One time I walked all the way to a place called 'Al de Baran'. 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;
+ Rmsg0:
+ mes "Prontera is presently under the reign of Tristram the 3rd. Everything we have now is only avaiable 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,{
+ mes "[Librarian Ellen]";
+ mes "Welcome. You can find books about monsters, organized by thier 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.";
+ 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 thier properties.";
+ mes "If you are interested, you should stop by there, too.";
+ close;
+}
diff --git a/npc/cities/umbala.txt b/npc/cities/umbala.txt
index fcb609058..e5531a2c8 100644
--- a/npc/cities/umbala.txt
+++ b/npc/cities/umbala.txt
@@ -1,1666 +1,1666 @@
-//===== eAthena script =======================================
-//= Umbala Town script
-//===== By: ==================================================
-//= jAthena (1.0)
-//= Fusion Dev Team (1.1)
-//= Muad Dib (1.2)
-//= Darkchild (1.3)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Episode XX
-//===== Description: =========================================
-//= Umbala Town Npcs
-//==================================================
-//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: =================================
-//= 1.0 - Done By jAthena (dunno Who)
-//= 1.1 - Translated by Fusion Dev Team
-//= 1.2 - Fixed Something by Muad Dib
-//= 1.2 - Fixed up For eA by Darkchild
-//============================================================
-
-
-//========================================================
-// == 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 20;
- end;
-On_Emotion29:
- emotion 29;
- 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 29;
- mes "[Heath]";
- mes "Hey, Reid, come on!";
- next;
- mes "[Reid]";
- mes "............";
- next;
- donpcevent "Reid::On_Emotion29";
- emotion 20;
- 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 29;
- mes "[Heath]";
- mes "Oh, you want to hear the story of the";
- mes "treasure, huh? Well, how imporant";
- mes "is it to you, really?";
- next;
- mes "[Reid and Heath]";
- donpcevent "Reid::On_Emotion29";
- emotion 29;
- 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 20;
- 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 20;
- 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 rumor 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 Komodo 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 18;
- 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 28;
- 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 28;
- 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 19;
- next;
- mes "[Hatan]";
- mes "Please take this as a token of my gratitude.";
- emotion 18;
- close;
-
- LError2:
- mes "[Hatan]";
- mes "Well, maybe I misunderestimated your";
- mes "wealth, but you shouldn't lie...";
- emotion 32;
- close;
- Lend2:
- mes "[Hatan]";
- mes "...Awwwww.";
- emotion 28;
- close;
-
-LumWord:
- mes "[???]";
- mes "Umba!";
- mes "Umbaluwababawamuba.";
- next;
- mes "[???]";
- mes "Umba! Umbaumba!";
- mes "Umbabama Hatan baba.";
- emotion 18;
- next;
- mes "[Hatan]";
- mes "...Umba, Umbaumbaumba.";
- mes "Umbaumbaumbababa.";
- mes "Umbabawaumbaumbaba.";
- mes "Umbaumba.";
- mes "...Umbaumbamabababumba.";
- emotion 28;
- next;
- mes "[Hatan]";
- mes "...!";
- next;
- mes "[Hatan]";
- mes "Umba!";
- mes "Umbaumbaumbababa.";
- mes "Umbababaumbawabaumba!";
- mes "Umbaumbaumbababa.";
- mes "wamfuba! Umba!";
- emotion 28;
- 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 19;
- next;
- mes "[Hatan]";
- mes "Umbaumba....";
- emotion 18;
- close;
-
- LError:
- mes "[Hatan]";
- mes "Umba-Umbana!";
- emotion 32;
- close;
- Lend:
- mes "[Hatan]";
- mes "....Umba....";
- emotion 28;
- 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,
- mes "[Kotan]";
- mes "Hey, thanks!";
- mes "Take these!";
- emotion 10;
- delitem 517,1;//Items: Meat,
- 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 28;
- close;
-LError:
- mes "[Kotan]";
- mes "Hey! You said you have";
- mes "meat! So you were lying?";
- mes "I hate you!";
- emotion 6;
- close;
-LumWord:
- mes "[???]";
- mes "....";
- mes "....";
- mes "...Umbaba!";
- mes "...Famba!";
- emotion 11;
- next;
- menu "Umba",-,"Umbabu",Lu2;
- if(countitem(517) < 1) goto LuError;//Items: Meat,
- mes "[???]";
- mes "Umbaumbaumbababa.";
- mes "Umbababauma.";
- emotion 10;
- delitem 517,1;//Items: Meat,
- getitem 909,2;//Items: Jellopy,
- getitem 914,2;//Items: Fluff,
- getitem 705,2;//Items: Clover,
- close;
- Lu2:
- mes "[???]";
- mes "....";
- mes "......Unguba!";
- mes "....Umbababa.";
- emotion 28;
- close;
-LuError:
- mes "[???]";
- mes "Umbawamufumabababa!";
- mes "Umbabababaumbaumbu!";
- emotion 6;
- 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 "left 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 "left 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 "left 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 LLSecondCheck;
- if(@ryumon == 33) goto Lwarp;
- LSecondCheck:
- if(event_umbala >= 6) goto LLNewEnd;
- 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 pleasent?";
- 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 geniune";
- mes "feelings.";
- //Activate Sphinx Mask Quest (optional)
- set mask_q,1;
- 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 Oily Paper^000000, and ^3377FF5x Smooth Paper^000000.";
- mes "I also need something to write with.";
- mes "of course.";
- mes "For that, ^3377FF1x India Ink^000000 and ^3377FF1x Bird Feather^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 Oily Paper^000000,";
- mes "^3377FF5x Smooth Paper^000000,";
- mes "^3377FF1x India Ink^000000, and";
- mes "^3377FF1x Bird Feather^000000.";
- mes "Once you have gathered those, I can teach";
- mes "you Utan tribal language.";
- close;
-Lchkok:
- 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.";
- 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,
- 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 honor, 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:
- 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.";
- delitem 2278,1;//Items: Mr. Smile,
- 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;
-}
-
-//=====================================================================
-um_in.gat,44,71,2 script Utan Tribe Shaman 782,{
- if(event_umbala < 3) goto LumWord;
- if(event_umbala == 4) goto LStart2;
- if(event_umbala == 5) goto LStart2;
- if(event_umbala == 6) goto LStart3;
- if(event_umbala == 7) goto LStart4;
- 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;
-LStart2:
- mes "[Putsuchiritan]";
- mes "Didn't you hear me? You need";
- mes "to get the elder's permission before";
- mes "I can help you.";
- close;
-LStart3:
- 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;
-LStart4:
- set @umchange[1],0;
- set @umchange[2],0;
- set @umchange[3],0;
- set @umchange[4],0;
- 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;
- menu "Create Essence",L1,"Dismantle Elemental Stone",L2,"Nothing",-;
- 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;
-L1:
- mes "[Putsuchiritan]";
- mes "Which elemental essence would you";
- mes "like to create? I can create earth, water,";
- mes "fire, and wind essence.";
- next;
- menu "Earth",L1_1,"Water",L1_2,"Fire",L1_3,"Wind",L1_4;
- L1_1:
- if (countitem(947)<15) goto L1_1e;//Items: Horn,
- set @umchange[1],947;
- set @umchange[2],15;
- set @umchange[3],993;
- goto L1_ketugou;
- L1_2:
- if (countitem(946)<20) goto L1_2e;//Items: Snails Shell,
- set @umchange[1],946;
- set @umchange[2],20;
- set @umchange[3],991;
- goto L1_ketugou;
- L1_3:
- if (countitem(904)<20) goto L1_3e;//Items: Scorpion Tail,
- set @umchange[1],904;
- set @umchange[2],20;
- set @umchange[3],990;
- goto L1_ketugou;
- L1_4:
- if (countitem(1013)<25) goto L1_4e;//Items: Rainbow Shell,
- set @umchange[1],1013;
- set @umchange[2],25;
- set @umchange[3],992;
- goto L1_ketugou;
- L1_ketugou:
- 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.";
- next;
- L1_input:
- input @umchange[4];
- if (@umchange[4]==0) goto L1_cancel;
- if (@umchange[4]>9) goto L1_numError;
- mes "[Putsuchiritan]";
- if (@umchange[1]==947) mes "The horn begins to vibrate.";
- if (@umchange[1]==904) mes "The tail begins to vibrate.";
- if ((@umchange[1]==1013) && (@umchange[1]==946)) mes "The skin begins to vibrate.";
-//End Possible Conversion
- 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;
- delitem @umchange[1],@umchange[2];
- getitem @umchange[3],@umchange[4];
- mes "[Putsuchiritan]";
- mes "There. Your inner power has converted";
- mes "these objects from nature into";
- mes "elemental essence. Put";
- mes "it to good use.";
- close;
-L1_cancel:
- 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;
-L1_numError:
- 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.";
- next;
- goto L1_input;
-L1_1e:
- 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.";
- goto L1_empty;
-L1_2e:
- mes "[Putsuchiritan]";
- mes "Water...You need that which is";
- mes "saturated with water. Explore";
- mes "the area around here and find";
- mes "^3377FF20x Katashimuri Skin^000000 for the ritual.";
- goto L1_empty;
-L1_3e:
- 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.";
- goto L1_empty;
-L1_4e:
- mes "[Putsuchiritan]";
- mes "Wind...You need that which";
- mes "has an easy camaraderie with";
- mes "the sky itself.";
- mes "You need ^3377FF25x Radiant Pelt^000000";
- mes "to complete the ritual.";
-L1_empty:
- next;
- mes "[Putsuchiritan]";
- mes "Once you've prepared these";
- mes "objects from nature, please return here";
- mes "so we can complete the ritual.";
- close;
-//----------------------------------------------------------
-L2:
- mes "[Putsuchiritan]";
- mes "What type of stone would you like to";
- mes "dismantle? Please choose earth, water,";
- mes "fire, or wind.";
- next;
- menu "Earth",L2_1,"Water",L2_2,"Fire",L2_3,"Wind",L2_4;
- L2_1:
- if (countitem(997)<1) goto L2_1e;//Items: Great Nature,
- set @umchange[1],997;
- set @umchange[2],1;
- set @umchange[3],993;
- goto L2_bunkai;
- L2_2:
- if (countitem(995)<1) goto L2_2e;//Items: Mystic Frozen,
- set @umchange[1],995;
- set @umchange[2],1;
- set @umchange[3],991;
- goto L2_bunkai;
- L2_3:
- if (countitem(994)<1) goto L2_3e;//Items: Flame Heart,
- set @umchange[1],994;
- set @umchange[2],1;
- set @umchange[3],990;
- goto L2_bunkai;
- L2_4:
- if (countitem(996)<1) goto L2_4e;//Items: Rough Wind,
- set @umchange[1],996;
- set @umchange[2],1;
- set @umchange[3],992;
- goto L2_bunkai;
- L2_bunkai:
- mes "[Putsuchiritan]";
- if (@umchange[1]==997) mes "I will dismantle your earth crystal";
- if (@umchange[1]==995) mes "I will dismantle your frozen crystal";
- if (@umchange[1]==994) mes "I will dismantle your heart of flame";
- if (@umchange[1]==996) mes "I will dismantle your rough wind stone";
- 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.";
- next;
- L2_input:
- input @umchange[4];
- if (@umchange[4]==0) goto L2_cancel;
- if (@umchange[4]>9) goto L2_numError;
-//Calculating number of essences
- set @umchange[4],rand(5)+@umchange[4];
- set @umchange,@umchange + @rand;
- if (@umchange[4]>10) set @umchange[4],@umchange[4]-10;
- if (@umchange[4]<5) set @umchange[4],@umchange[4]+5;
- 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!";
- mes "Kan Tsun Rakarakan! Unba! Ha!";
- next;
- delitem @umchange[1],@umchange[2];
- getitem @umchange[3],@umchange[4];
- mes "[Putsuchiritan]";
- mes "The elemental stone has been";
- mes "dismantled into its natural";
- mes "essence. Please put it to";
- mes "good use.";
- close;
-L2_cancel:
- 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;
-L2_numError:
- 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.";
- next;
- goto L2_input;
-L2_1e: mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Great Nature^000000";
- mes "to disassemble into its";
- mes "component essence.";
- goto L2_empty;
-L2_2e:
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Mystic Frozen^000000";
- mes "to disassemble into its";
- mes "component essence.";
- goto L2_empty;
-L2_3e:
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Flaming Heart^000000";
- mes "to disassemble into its";
- mes "component essence.";
- goto L2_empty;
-L2_4e:
- mes "[Putsuchiritan]";
- mes "You need to have";
- mes "^3377FF1x Rough Wind^000000";
- mes "to disassemble into its";
- mes "component essence.";
-L2_empty:
- next;
- 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;
-LumWord:
- mes "[?????]";
- mes "Umbaumbaumbaba Utan Umbaba";
- mes "Umbaumbaumbafumbabauma...";
- mes "Umbabaumbaumbabaumbabaumba";
- mes "Umbabaumbabaumbaumbabaumba";
- mes "Fumbaumba.";
- next;
- warp "umbala.gat",217,186;
- close;
-}
-
-//=====================================================================
-umbala.gat,177,153,3 script Bast 97,{
- if (event_umbala>=3) emotion 0;
- 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 color";
- 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 28;
- 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 < 30) 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#1 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 28;
- 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#5 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 favorite 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 33;
- 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 21;
- next;
- mes "[Mutakutan]";
- mes "It has a slightly sour taste. Eating";
- mes "it makes me feel all tingly inside!!";
- emotion 21;
- 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 28;
- 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 6;
- next;
- mes "[Purenotan]";
- mes "Umbaumabaumbaumbaba!";
- mes "Umbababababaugau!";
- mes "Uguugaumbabaumbagumba!";
- emotion 24;
- next;
- emotion 27;
- close;
-On_emo:
-emotion 6;
-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 18;
- next;
- donpcevent "Purenotan::On_emo";
- close;
-}
-
-//==============================================================================
-//Bungee jumping!
-//==============================================================================
-//umbala.gat,140,197,0 script #Shibonochikka 139,0,1,{
-set @jumprand,rand(4);
-if (@jumprand == 1) goto L1;
-if (@jumprand == 2) goto L2;
-if (@jumprand == 3) goto L3;
-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;
-}
-
-//=====================================================================
-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.3
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Episode XX
+//===== Description: =========================================
+//= Umbala Town Npcs
+//==================================================
+//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: =================================
+//= 1.0 - Done By jAthena (dunno Who)
+//= 1.1 - Translated by Fusion Dev Team
+//= 1.2 - Fixed Something by Muad Dib
+//= 1.2 - Fixed up For eA by Darkchild
+//============================================================
+
+
+//========================================================
+// == 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 20;
+ end;
+On_Emotion29:
+ emotion 29;
+ 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 29;
+ mes "[Heath]";
+ mes "Hey, Reid, come on!";
+ next;
+ mes "[Reid]";
+ mes "............";
+ next;
+ donpcevent "Reid::On_Emotion29";
+ emotion 20;
+ 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 29;
+ mes "[Heath]";
+ mes "Oh, you want to hear the story of the";
+ mes "treasure, huh? Well, how imporant";
+ mes "is it to you, really?";
+ next;
+ mes "[Reid and Heath]";
+ donpcevent "Reid::On_Emotion29";
+ emotion 29;
+ 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 20;
+ 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 20;
+ 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 rumor 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 Komodo 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 18;
+ 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 28;
+ 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 28;
+ 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 19;
+ next;
+ mes "[Hatan]";
+ mes "Please take this as a token of my gratitude.";
+ emotion 18;
+ close;
+
+ LError2:
+ mes "[Hatan]";
+ mes "Well, maybe I misunderestimated your";
+ mes "wealth, but you shouldn't lie...";
+ emotion 32;
+ close;
+ Lend2:
+ mes "[Hatan]";
+ mes "...Awwwww.";
+ emotion 28;
+ close;
+
+LumWord:
+ mes "[???]";
+ mes "Umba!";
+ mes "Umbaluwababawamuba.";
+ next;
+ mes "[???]";
+ mes "Umba! Umbaumba!";
+ mes "Umbabama Hatan baba.";
+ emotion 18;
+ next;
+ mes "[Hatan]";
+ mes "...Umba, Umbaumbaumba.";
+ mes "Umbaumbaumbababa.";
+ mes "Umbabawaumbaumbaba.";
+ mes "Umbaumba.";
+ mes "...Umbaumbamabababumba.";
+ emotion 28;
+ next;
+ mes "[Hatan]";
+ mes "...!";
+ next;
+ mes "[Hatan]";
+ mes "Umba!";
+ mes "Umbaumbaumbababa.";
+ mes "Umbababaumbawabaumba!";
+ mes "Umbaumbaumbababa.";
+ mes "wamfuba! Umba!";
+ emotion 28;
+ 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 19;
+ next;
+ mes "[Hatan]";
+ mes "Umbaumba....";
+ emotion 18;
+ close;
+
+ LError:
+ mes "[Hatan]";
+ mes "Umba-Umbana!";
+ emotion 32;
+ close;
+ Lend:
+ mes "[Hatan]";
+ mes "....Umba....";
+ emotion 28;
+ 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,
+ mes "[Kotan]";
+ mes "Hey, thanks!";
+ mes "Take these!";
+ emotion 10;
+ delitem 517,1;//Items: Meat,
+ 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 28;
+ close;
+LError:
+ mes "[Kotan]";
+ mes "Hey! You said you have";
+ mes "meat! So you were lying?";
+ mes "I hate you!";
+ emotion 6;
+ close;
+LumWord:
+ mes "[???]";
+ mes "....";
+ mes "....";
+ mes "...Umbaba!";
+ mes "...Famba!";
+ emotion 11;
+ next;
+ menu "Umba",-,"Umbabu",Lu2;
+ if(countitem(517) < 1) goto LuError;//Items: Meat,
+ mes "[???]";
+ mes "Umbaumbaumbababa.";
+ mes "Umbababauma.";
+ emotion 10;
+ delitem 517,1;//Items: Meat,
+ getitem 909,2;//Items: Jellopy,
+ getitem 914,2;//Items: Fluff,
+ getitem 705,2;//Items: Clover,
+ close;
+ Lu2:
+ mes "[???]";
+ mes "....";
+ mes "......Unguba!";
+ mes "....Umbababa.";
+ emotion 28;
+ close;
+LuError:
+ mes "[???]";
+ mes "Umbawamufumabababa!";
+ mes "Umbabababaumbaumbu!";
+ emotion 6;
+ 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 "left 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 "left 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 "left 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 LLSecondCheck;
+ if(@ryumon == 33) goto Lwarp;
+ LSecondCheck:
+ if(event_umbala >= 6) goto LLNewEnd;
+ 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 pleasent?";
+ 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 geniune";
+ mes "feelings.";
+ //Activate Sphinx Mask Quest (optional)
+ set mask_q,1;
+ 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 Oily Paper^000000, and ^3377FF5x Smooth Paper^000000.";
+ mes "I also need something to write with.";
+ mes "of course.";
+ mes "For that, ^3377FF1x India Ink^000000 and ^3377FF1x Bird Feather^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 Oily Paper^000000,";
+ mes "^3377FF5x Smooth Paper^000000,";
+ mes "^3377FF1x India Ink^000000, and";
+ mes "^3377FF1x Bird Feather^000000.";
+ mes "Once you have gathered those, I can teach";
+ mes "you Utan tribal language.";
+ close;
+Lchkok:
+ 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.";
+ 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,
+ 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 honor, 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:
+ 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.";
+ delitem 2278,1;//Items: Mr. Smile,
+ 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;
+}
+
+//=====================================================================
+um_in.gat,44,71,2 script Utan Tribe Shaman 782,{
+ if(event_umbala < 3) goto LumWord;
+ if(event_umbala == 4) goto LStart2;
+ if(event_umbala == 5) goto LStart2;
+ if(event_umbala == 6) goto LStart3;
+ if(event_umbala == 7) goto LStart4;
+ 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;
+LStart2:
+ mes "[Putsuchiritan]";
+ mes "Didn't you hear me? You need";
+ mes "to get the elder's permission before";
+ mes "I can help you.";
+ close;
+LStart3:
+ 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;
+LStart4:
+ set @umchange[1],0;
+ set @umchange[2],0;
+ set @umchange[3],0;
+ set @umchange[4],0;
+ 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;
+ menu "Create Essence",L1,"Dismantle Elemental Stone",L2,"Nothing",-;
+ 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;
+L1:
+ mes "[Putsuchiritan]";
+ mes "Which elemental essence would you";
+ mes "like to create? I can create earth, water,";
+ mes "fire, and wind essence.";
+ next;
+ menu "Earth",L1_1,"Water",L1_2,"Fire",L1_3,"Wind",L1_4;
+ L1_1:
+ if (countitem(947)<15) goto L1_1e;//Items: Horn,
+ set @umchange[1],947;
+ set @umchange[2],15;
+ set @umchange[3],993;
+ goto L1_ketugou;
+ L1_2:
+ if (countitem(946)<20) goto L1_2e;//Items: Snails Shell,
+ set @umchange[1],946;
+ set @umchange[2],20;
+ set @umchange[3],991;
+ goto L1_ketugou;
+ L1_3:
+ if (countitem(904)<20) goto L1_3e;//Items: Scorpion Tail,
+ set @umchange[1],904;
+ set @umchange[2],20;
+ set @umchange[3],990;
+ goto L1_ketugou;
+ L1_4:
+ if (countitem(1013)<25) goto L1_4e;//Items: Rainbow Shell,
+ set @umchange[1],1013;
+ set @umchange[2],25;
+ set @umchange[3],992;
+ goto L1_ketugou;
+ L1_ketugou:
+ 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.";
+ next;
+ L1_input:
+ input @umchange[4];
+ if (@umchange[4]==0) goto L1_cancel;
+ if (@umchange[4]>9) goto L1_numError;
+ mes "[Putsuchiritan]";
+ if (@umchange[1]==947) mes "The horn begins to vibrate.";
+ if (@umchange[1]==904) mes "The tail begins to vibrate.";
+ if ((@umchange[1]==1013) && (@umchange[1]==946)) mes "The skin begins to vibrate.";
+//End Possible Conversion
+ 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;
+ delitem @umchange[1],@umchange[2];
+ getitem @umchange[3],@umchange[4];
+ mes "[Putsuchiritan]";
+ mes "There. Your inner power has converted";
+ mes "these objects from nature into";
+ mes "elemental essence. Put";
+ mes "it to good use.";
+ close;
+L1_cancel:
+ 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;
+L1_numError:
+ 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.";
+ next;
+ goto L1_input;
+L1_1e:
+ 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.";
+ goto L1_empty;
+L1_2e:
+ mes "[Putsuchiritan]";
+ mes "Water...You need that which is";
+ mes "saturated with water. Explore";
+ mes "the area around here and find";
+ mes "^3377FF20x Katashimuri Skin^000000 for the ritual.";
+ goto L1_empty;
+L1_3e:
+ 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.";
+ goto L1_empty;
+L1_4e:
+ mes "[Putsuchiritan]";
+ mes "Wind...You need that which";
+ mes "has an easy camaraderie with";
+ mes "the sky itself.";
+ mes "You need ^3377FF25x Radiant Pelt^000000";
+ mes "to complete the ritual.";
+L1_empty:
+ next;
+ mes "[Putsuchiritan]";
+ mes "Once you've prepared these";
+ mes "objects from nature, please return here";
+ mes "so we can complete the ritual.";
+ close;
+//----------------------------------------------------------
+L2:
+ mes "[Putsuchiritan]";
+ mes "What type of stone would you like to";
+ mes "dismantle? Please choose earth, water,";
+ mes "fire, or wind.";
+ next;
+ menu "Earth",L2_1,"Water",L2_2,"Fire",L2_3,"Wind",L2_4;
+ L2_1:
+ if (countitem(997)<1) goto L2_1e;//Items: Great Nature,
+ set @umchange[1],997;
+ set @umchange[2],1;
+ set @umchange[3],993;
+ goto L2_bunkai;
+ L2_2:
+ if (countitem(995)<1) goto L2_2e;//Items: Mystic Frozen,
+ set @umchange[1],995;
+ set @umchange[2],1;
+ set @umchange[3],991;
+ goto L2_bunkai;
+ L2_3:
+ if (countitem(994)<1) goto L2_3e;//Items: Flame Heart,
+ set @umchange[1],994;
+ set @umchange[2],1;
+ set @umchange[3],990;
+ goto L2_bunkai;
+ L2_4:
+ if (countitem(996)<1) goto L2_4e;//Items: Rough Wind,
+ set @umchange[1],996;
+ set @umchange[2],1;
+ set @umchange[3],992;
+ goto L2_bunkai;
+ L2_bunkai:
+ mes "[Putsuchiritan]";
+ if (@umchange[1]==997) mes "I will dismantle your earth crystal";
+ if (@umchange[1]==995) mes "I will dismantle your frozen crystal";
+ if (@umchange[1]==994) mes "I will dismantle your heart of flame";
+ if (@umchange[1]==996) mes "I will dismantle your rough wind stone";
+ 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.";
+ next;
+ L2_input:
+ input @umchange[4];
+ if (@umchange[4]==0) goto L2_cancel;
+ if (@umchange[4]>9) goto L2_numError;
+//Calculating number of essences
+ set @umchange[4],rand(5)+@umchange[4];
+ set @umchange,@umchange + @rand;
+ if (@umchange[4]>10) set @umchange[4],@umchange[4]-10;
+ if (@umchange[4]<5) set @umchange[4],@umchange[4]+5;
+ 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!";
+ mes "Kan Tsun Rakarakan! Unba! Ha!";
+ next;
+ delitem @umchange[1],@umchange[2];
+ getitem @umchange[3],@umchange[4];
+ mes "[Putsuchiritan]";
+ mes "The elemental stone has been";
+ mes "dismantled into its natural";
+ mes "essence. Please put it to";
+ mes "good use.";
+ close;
+L2_cancel:
+ 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;
+L2_numError:
+ 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.";
+ next;
+ goto L2_input;
+L2_1e: mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Great Nature^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ goto L2_empty;
+L2_2e:
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Mystic Frozen^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ goto L2_empty;
+L2_3e:
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Flaming Heart^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+ goto L2_empty;
+L2_4e:
+ mes "[Putsuchiritan]";
+ mes "You need to have";
+ mes "^3377FF1x Rough Wind^000000";
+ mes "to disassemble into its";
+ mes "component essence.";
+L2_empty:
+ next;
+ 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;
+LumWord:
+ mes "[?????]";
+ mes "Umbaumbaumbaba Utan Umbaba";
+ mes "Umbaumbaumbafumbabauma...";
+ mes "Umbabaumbaumbabaumbabaumba";
+ mes "Umbabaumbabaumbaumbabaumba";
+ mes "Fumbaumba.";
+ next;
+ warp "umbala.gat",217,186;
+ close;
+}
+
+//=====================================================================
+umbala.gat,177,153,3 script Bast 97,{
+ if (event_umbala>=3) emotion 0;
+ 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 color";
+ 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 28;
+ 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 < 30) 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#1 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 28;
+ 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#5 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 favorite 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 33;
+ 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 21;
+ next;
+ mes "[Mutakutan]";
+ mes "It has a slightly sour taste. Eating";
+ mes "it makes me feel all tingly inside!!";
+ emotion 21;
+ 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 28;
+ 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 6;
+ next;
+ mes "[Purenotan]";
+ mes "Umbaumabaumbaumbaba!";
+ mes "Umbababababaugau!";
+ mes "Uguugaumbabaumbagumba!";
+ emotion 24;
+ next;
+ emotion 27;
+ close;
+On_emo:
+emotion 6;
+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 18;
+ next;
+ donpcevent "Purenotan::On_emo";
+ close;
+}
+
+//==============================================================================
+//Bungee jumping!
+//==============================================================================
+//umbala.gat,140,197,0 script #Shibonochikka 139,0,1,{
+set @jumprand,rand(4);
+if (@jumprand == 1) goto L1;
+if (@jumprand == 2) goto L2;
+if (@jumprand == 3) goto L3;
+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;
+}
+
+//=====================================================================
+umbala.gat,136,195,0 script #Warp Point 139,1,1,{
+ warp "umbala.gat",145,166;
+ end;
+}
diff --git a/npc/cities/yuno.txt b/npc/cities/yuno.txt
index 8bd391811..e6199a54d 100644
--- a/npc/cities/yuno.txt
+++ b/npc/cities/yuno.txt
@@ -1,616 +1,616 @@
-//===== eAthena Script =======================================
-//= Yuno City
-//===== By: ==================================================
-//= KitsuneStarwind, kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== 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.
-//============================================================
-
-
-
-
-//=================================================================================================//
-// NPCs Found outside
-//=================================================================================================//
-
-//======================================================================================
-yuno.gat,156,87,4 script Citizen of Yuno 47,{
- mes "[Hans]";
- mes "If you go north from Al De Baran you will arrive at 'Elmeth Plateau'.";
- mes "It is a place that was once covered with molten rocks and lava.";
- next;
- mes "[Hans]";
- mes "At the top of a mountain connected to the plateau, you can find a bridge that will lead you here to Yuno.";
- next;
- mes "[Hans]";
- mes "Here in Yuno, you can visit world famous places such as the:";
- mes "^5533FF'Yuphero Plaza'";
- mes "'Yuno Conference Hall'";
- mes "'Schweicherbil Magic Academy'^000000";
- mes "and the ^5533FF'Museum of Monsters'^000000";
- next;
- mes "[Hans]";
- mes "There is also the ^5533FF'Sage Castle'^000000 which is the greatest attraction in this city.";
- mes "The castle is where people go to become Sages.";
- next;
- mes "[Hans]";
- mes "If you have any interest in becoming a Sage, why not have a look around the castle?";
- close;
-}
-
-//=======================================================================================
-yuno.gat,158,205,4 script Artisan 54,{
- mes "[Artisan]";
- mes "~(mumbling to himself.......)~";
- next;
- mes "[Artisan]";
- mes "Oh hello there. Let me introduce myself. I am an artisan who is trying to carry on the traditions and duties of the master craftsmen here in Yuno.";
- M_Menu:
- next;
- menu "About powerful equipment.",M_1,"About special items",M_2,"About authentic foods",M_3,"End conversation",M_End;
-
- M_1:
- mes "[Artisan]";
- mes "For Crusaders, I suggest looking into the ^5533FF'Holy Guard' and 'Holy Avenger'^000000.";
- mes "They are both light weight pieces of equipment and they perform remarkably well.";
- next;
- mes "[Artisan]";
- mes "They also posses the holy property so they are even more powerful against undead and ghost creatures,";
- next;
- mes "[Artisan]";
- mes "I've heard that these pieces of equipment are quite rare, and that only a chosen few are able to obtain them.";
- goto M_Menu;
-
- M_2:
- mes "[Artisan]";
- mes "One item that I know about is a magic scroll called the ^5533FF'Worn-Out Magic Scroll'^000000.";
- mes "It is described to have a circle inside of another circle.... and a star...... ";
- next;
- mes "[Artisan]";
- mes "Although the scroll is very old and tattered, it very special to many Sages who use it for their research.";
- mes "Apparently it can be used with very high level magic spells.";
- goto M_Menu;
-
- M_3:
- mes "[Artisan]";
- mes "^5533FF'Rice Cake'^000000!! A traditional food that has been a favorite of many people over the years.";
- mes "It has a way of reminding people of those old traditional markets and fairs.";
- next;
- mes "[Artisan]";
- mes "Ah.... Rice Cake..... I sure wish I could eat some now..............";
- //possible quest here .. not sure though
- goto M_Menu;
-
- M_End:
- mes "[Artisan]";
- mes "Although Yuno is known as the city of Sages,..............";
- mes "I hope you will understand that Yuno is also home to many kind and gentle people who live ordinary lives.";
- next;
- mes "[Artisan]";
- mes "Please enjoy everything this unique city has to offer.";
- close;
-}
-
-//======================================================================================
-yuno.gat,336,227,4 script Yuno Granny 103,
-{
- mes "[Granny]";
- mes "Here you are......... I am an elderly Sage who can forsee everything before it happens.";
- next;
- mes "[Granny]";
- mes "Have you heard about the boss monster, who's name has been buzzing around Yuno for the longest time?";
- mes "It's called ^FF3355'Lord of the Dead'^000000. Rumor has it that it comes form the realm of the dead.";
- next;
- mes "[Granny]";
- mes "It brings with it many undead monsters that are intent on leading the living to the cold and icy land of the dead.";
- next;
- mes "[Granny]";
- mes "I know that you have already chosen whether or not you will fight the Lord of the Dead.";
- mes "The only thing left for you to do is find out why you made that choice......";
- close;
-}
-
-//========================================================================================
-yuno.gat,329,239,4 script Yuno Fighter 732,
-{
- mes "[Sergiof]";
- mes "My name is Sergiof and I am Granny's protector.";
- next;
- mes "[Sergiof]";
- mes "Let me tell you about the ^5533FF'Grand Peco'^000000, which is a high level Peco Peco.";
- mes "The Grand Peco is faster than regular Peco Pecos and has aggressive tendencies.";
- next;
- mes "[Sergiof]";
- mes "It attacks its targets using its strong bill. It is always surrounded by a large group of Peco Pecos.";
- next;
- mes "[Sergiof]";
- mes ".... Unfortunately it is time for us to part...... farewell...........";
- close;
-}
-
-//========================================================================================
-yuno.gat,344,68,4 script Yuno Tyrant 730,
-{
- mes "[Ninno]";
- mes "Have you ever heard of an Egyptian king who was once believed to be the son of a god?";
- mes "His name was ^5533FF'Pharaoh'^000000";
- next;
- mes "[Ninno]";
- mes "Rumor has it that he was a high sorcerer and that he used his abilities to curse innocent people.";
- mes "There are people that say he is still around, and continues to place curses on people.";
- next;
- mes "[Ninno]";
- mes "Have you ever seen him before?";
- close;
-}
-
-//=======================================================================================
-yuno.gat,261,98,4 script Ykla 735,{
- mes "[Ykla]";
- mes "^5533FFYuphero^000000......,";
- mes "That was the name of the ancient city where the most intelligent and talented people used to live.";
- next;
- mes "[Ykla]";
- mes "By finding a way to harness the power from the pieces of Ymir's heart, they became the most advanced city know to man.";
- next;
- mes "[Ykla]";
- mes "However, over time they came to abuse that power and ended up destroying themselves.";
- next;
- mes "[Ykla]";
- mes "If you ever find yourself in the position of acquiring this kind of power, make sure you remain humble to it.";
- next;
- mes "[Ykla]";
- mes "Power without humility is nothing more than a fools path to destruction.";
- close;
-}
-
-//=========================================================================================
-yuno.gat,306,207,6 script Sage Sykla 735,
-{
- mes "[Sykla]";
- mes "There is talk about a suspicious man living somewhere here in Yuno.";
- mes "Apparently he is a dangerous person who is immersed in some kind of wicked research.";
- next;
- mes "[Sykla]";
- mes "This so called 'Mad Scientist' spends his time working on complex ideas that cannot be understood by normal people.";
- next;
- mes "[Sykla]";
- mes "Just outside of town you will find a monster called ^FF3355'Blazer'^000000.";
- mes "This ball of magic flame attacks any living creature it finds with horrible spells such as fire bolt and fire ball.";
- next;
- mes "[Sykla]";
- mes "This hiddeous creature is feared my most, if not all, of the people here in Yuno.";
- mes "But what's even more frightening than the monster itself, is the rumor that the mad scientist was the one who created it....";
- next;
- mes "[Sykla]";
- mes "Imagine if this mad man were to create more of these creatures..... possibly create monsters even more powerfull than Blazer....";
- close;
-}
-
-//==========================================================================================
-yuno.gat,162,328,4 script Sage Eskla 735,
-{
- mes "[Eskla]";
- mes "I remember seeing it once........ Yeah... I remember now....... ";
- mes "There was this piece of paper floating in the air. I asked myself, 'Hmm... who lost a piece of paper out here?'.";
- next;
- mes "[Eskla]";
- mes "Then... without warning.... the piece of paper attacked me!! ME! One of the GREATEST Sages in Yuno!!";
- emotion 23;
- next;
- mes "[Eskla]";
- mes "I said to the piece of paper, 'How dare you attack me you little piece of paper!!' and struck it with my trusty sword.";
- mes "But that piece of paper was persistant and annoying at that.";
- emotion 0;
- next;
- mes "[Eskla]";
- mes "Using its paper thin body it dodged my sword simply by turning itself. The way it was turned I couldn't even tell if it was still there.";
- mes "Dammint it was thin!!!";
- next;
- mes "[Eskla]";
- mes "I decided to finally put an end to things and used a powerful magic spell to destroy that little piece of paper.";
- mes "Because I had so much difficulty in defeating it, I decided to ask my collegues if they knew anything about it.";
- next;
- mes "[Eskla]";
- mes "I found out what I had fought was called ^FF3355'The Paper'^000000.";
- mes "People say that it used to be part of an old book that contained a great deal of ancient knowledge about Yuno.";
- next;
- mes "[Eskla]";
- mes "Somehow it became a monster....... isn't that weird?";
- close;
-}
-
-
-
-//======================================================================================
-yuno.gat,166,111,4 script Remorpheous 120,{
- mes "[Remorpheous]";
- mes "'Apocalypse'. he, an artificial human being,";
- mes "was the chief of gatekeepers and in charge of public order of the city";
- mes "of [Yuno] during the Ancient times civilization...";
- close;
- mes "[Remorpheus]";
- mes "....similar to Robot. After living for a long time,";
- mes "its A.I. totally screwed up,it couldn't recognize friend or foe anymore,";
- mes "so without consideration of friends or foe......";
- close;
- mes "[Remorpheus]";
- mes ".... it became a monster that attacks anyone regardless";
- close;
-}
-
-//=====================================================================================
-yuno.gat,185,173,3 script Impressor 729,{
- mes "[Impressor]";
- mes "Scholar's city, 'Yuno' is made of 3 big islands.";
- next;
- mes "[Impressor]";
- mes "those are,";
- mes "The island of Glory - Solomon";
- mes "The island of Prosperity - Minetta";
- mes "The island of Wisdom - Snottra";
- next;
- mes "[Impressor]";
- mes "Each island's location are:";
- mes "Northwest: Solomon";
- mes "Northeast: Snottra";
- mes "South: Minetta";
- close;
-}
-
-//=====================================================================================
-yuno.gat,80,150,4 script Young Woman 746,{
- mes "[Young Woman]";
- mes "Have you ever seen such a beautiful city?";
- mes "And Yuno at night time is so wonderful with its lights shiny through the clouds";
- next;
- mes "[Young Woman]";
- mes "I'm sorry i got carried away , its my first time being here in the City of Sages";
- mes "i sugest you go look around and enjoy your self";
- next;
- mes "[Young Woman]";
- mes "I believe i shall wait around here till nightfall just so i can see the lights clearly";
- mes "maybe i will see you here later";
- close;
-}
-
-
-//===================================================================================================//
-// Metto Quest
-//===================================================================================================//
-
-//========================================================================
-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, tommorrow, 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 hellp, this would be much easier.... Pray! Pray to whatever God you believe in that we will succed!";
- 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 19;
- 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 29;
- 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 16;
- next;
- mes "[Metto]";
- mes "NOOOOOOO!!! Why?? How?? Why would he do that? Are the Gods cursing me?!?";
- emotion 6;
- 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 29;
- 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 28;
- 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 28;
- 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 assisstant and is going to STEAL all the CREDIT for our discoveries?!!";
- emotion 23;
- 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 32;
- next;
- mes "[Stangckle]";
- mes "I don't think I can even bear to see his distugusting 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 4;
- close;
-L_Done:
- mes "So Metto was truly a mad scientist afterall...... 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 lastest 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 23;
- 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 destory it.... my Great Z.... *sigh*";
- emotion 28;
- 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 handywork.";
- 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 egostical 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 32;
- next;
- mes "[CiCi]";
- mes "I have half a mind to teach him a little something about TRUE science and INTELLIGENT research!!";
- emotion 7;
- 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 4;
- 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 6;
- 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 definately lost his sanity and has gone too far!!";
- emotion 7;
- 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 1;
- 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 appreicate 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 5;
- next;
- mes "[Wagan]";
- mes "The people of this city are greateful to you. Here is a little token of our appreciation......";
- next;
- mes "[Wagan]";
- mes "Thank you once again for your assisstance! I wish you the best of luck in all of your future endeavors!!!";
- getitem 715,10;
- emotion 15;
- 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 15;
- close;
-}
+//===== eAthena Script =======================================
+//= Yuno City
+//===== By: ==================================================
+//= KitsuneStarwind, kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== 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.
+//============================================================
+
+
+
+
+//=================================================================================================//
+// NPCs Found outside
+//=================================================================================================//
+
+//======================================================================================
+yuno.gat,156,87,4 script Citizen of Yuno 47,{
+ mes "[Hans]";
+ mes "If you go north from Al De Baran you will arrive at 'Elmeth Plateau'.";
+ mes "It is a place that was once covered with molten rocks and lava.";
+ next;
+ mes "[Hans]";
+ mes "At the top of a mountain connected to the plateau, you can find a bridge that will lead you here to Yuno.";
+ next;
+ mes "[Hans]";
+ mes "Here in Yuno, you can visit world famous places such as the:";
+ mes "^5533FF'Yuphero Plaza'";
+ mes "'Yuno Conference Hall'";
+ mes "'Schweicherbil Magic Academy'^000000";
+ mes "and the ^5533FF'Museum of Monsters'^000000";
+ next;
+ mes "[Hans]";
+ mes "There is also the ^5533FF'Sage Castle'^000000 which is the greatest attraction in this city.";
+ mes "The castle is where people go to become Sages.";
+ next;
+ mes "[Hans]";
+ mes "If you have any interest in becoming a Sage, why not have a look around the castle?";
+ close;
+}
+
+//=======================================================================================
+yuno.gat,158,205,4 script Artisan 54,{
+ mes "[Artisan]";
+ mes "~(mumbling to himself.......)~";
+ next;
+ mes "[Artisan]";
+ mes "Oh hello there. Let me introduce myself. I am an artisan who is trying to carry on the traditions and duties of the master craftsmen here in Yuno.";
+ M_Menu:
+ next;
+ menu "About powerful equipment.",M_1,"About special items",M_2,"About authentic foods",M_3,"End conversation",M_End;
+
+ M_1:
+ mes "[Artisan]";
+ mes "For Crusaders, I suggest looking into the ^5533FF'Holy Guard' and 'Holy Avenger'^000000.";
+ mes "They are both light weight pieces of equipment and they perform remarkably well.";
+ next;
+ mes "[Artisan]";
+ mes "They also posses the holy property so they are even more powerful against undead and ghost creatures,";
+ next;
+ mes "[Artisan]";
+ mes "I've heard that these pieces of equipment are quite rare, and that only a chosen few are able to obtain them.";
+ goto M_Menu;
+
+ M_2:
+ mes "[Artisan]";
+ mes "One item that I know about is a magic scroll called the ^5533FF'Worn-Out Magic Scroll'^000000.";
+ mes "It is described to have a circle inside of another circle.... and a star...... ";
+ next;
+ mes "[Artisan]";
+ mes "Although the scroll is very old and tattered, it very special to many Sages who use it for their research.";
+ mes "Apparently it can be used with very high level magic spells.";
+ goto M_Menu;
+
+ M_3:
+ mes "[Artisan]";
+ mes "^5533FF'Rice Cake'^000000!! A traditional food that has been a favorite of many people over the years.";
+ mes "It has a way of reminding people of those old traditional markets and fairs.";
+ next;
+ mes "[Artisan]";
+ mes "Ah.... Rice Cake..... I sure wish I could eat some now..............";
+ //possible quest here .. not sure though
+ goto M_Menu;
+
+ M_End:
+ mes "[Artisan]";
+ mes "Although Yuno is known as the city of Sages,..............";
+ mes "I hope you will understand that Yuno is also home to many kind and gentle people who live ordinary lives.";
+ next;
+ mes "[Artisan]";
+ mes "Please enjoy everything this unique city has to offer.";
+ close;
+}
+
+//======================================================================================
+yuno.gat,336,227,4 script Yuno Granny 103,
+{
+ mes "[Granny]";
+ mes "Here you are......... I am an elderly Sage who can forsee everything before it happens.";
+ next;
+ mes "[Granny]";
+ mes "Have you heard about the boss monster, who's name has been buzzing around Yuno for the longest time?";
+ mes "It's called ^FF3355'Lord of the Dead'^000000. Rumor has it that it comes form the realm of the dead.";
+ next;
+ mes "[Granny]";
+ mes "It brings with it many undead monsters that are intent on leading the living to the cold and icy land of the dead.";
+ next;
+ mes "[Granny]";
+ mes "I know that you have already chosen whether or not you will fight the Lord of the Dead.";
+ mes "The only thing left for you to do is find out why you made that choice......";
+ close;
+}
+
+//========================================================================================
+yuno.gat,329,239,4 script Yuno Fighter 732,
+{
+ mes "[Sergiof]";
+ mes "My name is Sergiof and I am Granny's protector.";
+ next;
+ mes "[Sergiof]";
+ mes "Let me tell you about the ^5533FF'Grand Peco'^000000, which is a high level Peco Peco.";
+ mes "The Grand Peco is faster than regular Peco Pecos and has aggressive tendencies.";
+ next;
+ mes "[Sergiof]";
+ mes "It attacks its targets using its strong bill. It is always surrounded by a large group of Peco Pecos.";
+ next;
+ mes "[Sergiof]";
+ mes ".... Unfortunately it is time for us to part...... farewell...........";
+ close;
+}
+
+//========================================================================================
+yuno.gat,344,68,4 script Yuno Tyrant 730,
+{
+ mes "[Ninno]";
+ mes "Have you ever heard of an Egyptian king who was once believed to be the son of a god?";
+ mes "His name was ^5533FF'Pharaoh'^000000";
+ next;
+ mes "[Ninno]";
+ mes "Rumor has it that he was a high sorcerer and that he used his abilities to curse innocent people.";
+ mes "There are people that say he is still around, and continues to place curses on people.";
+ next;
+ mes "[Ninno]";
+ mes "Have you ever seen him before?";
+ close;
+}
+
+//=======================================================================================
+yuno.gat,261,98,4 script Ykla 735,{
+ mes "[Ykla]";
+ mes "^5533FFYuphero^000000......,";
+ mes "That was the name of the ancient city where the most intelligent and talented people used to live.";
+ next;
+ mes "[Ykla]";
+ mes "By finding a way to harness the power from the pieces of Ymir's heart, they became the most advanced city know to man.";
+ next;
+ mes "[Ykla]";
+ mes "However, over time they came to abuse that power and ended up destroying themselves.";
+ next;
+ mes "[Ykla]";
+ mes "If you ever find yourself in the position of acquiring this kind of power, make sure you remain humble to it.";
+ next;
+ mes "[Ykla]";
+ mes "Power without humility is nothing more than a fools path to destruction.";
+ close;
+}
+
+//=========================================================================================
+yuno.gat,306,207,6 script Sage Sykla 735,
+{
+ mes "[Sykla]";
+ mes "There is talk about a suspicious man living somewhere here in Yuno.";
+ mes "Apparently he is a dangerous person who is immersed in some kind of wicked research.";
+ next;
+ mes "[Sykla]";
+ mes "This so called 'Mad Scientist' spends his time working on complex ideas that cannot be understood by normal people.";
+ next;
+ mes "[Sykla]";
+ mes "Just outside of town you will find a monster called ^FF3355'Blazer'^000000.";
+ mes "This ball of magic flame attacks any living creature it finds with horrible spells such as fire bolt and fire ball.";
+ next;
+ mes "[Sykla]";
+ mes "This hiddeous creature is feared my most, if not all, of the people here in Yuno.";
+ mes "But what's even more frightening than the monster itself, is the rumor that the mad scientist was the one who created it....";
+ next;
+ mes "[Sykla]";
+ mes "Imagine if this mad man were to create more of these creatures..... possibly create monsters even more powerfull than Blazer....";
+ close;
+}
+
+//==========================================================================================
+yuno.gat,162,328,4 script Sage Eskla 735,
+{
+ mes "[Eskla]";
+ mes "I remember seeing it once........ Yeah... I remember now....... ";
+ mes "There was this piece of paper floating in the air. I asked myself, 'Hmm... who lost a piece of paper out here?'.";
+ next;
+ mes "[Eskla]";
+ mes "Then... without warning.... the piece of paper attacked me!! ME! One of the GREATEST Sages in Yuno!!";
+ emotion 23;
+ next;
+ mes "[Eskla]";
+ mes "I said to the piece of paper, 'How dare you attack me you little piece of paper!!' and struck it with my trusty sword.";
+ mes "But that piece of paper was persistant and annoying at that.";
+ emotion 0;
+ next;
+ mes "[Eskla]";
+ mes "Using its paper thin body it dodged my sword simply by turning itself. The way it was turned I couldn't even tell if it was still there.";
+ mes "Dammint it was thin!!!";
+ next;
+ mes "[Eskla]";
+ mes "I decided to finally put an end to things and used a powerful magic spell to destroy that little piece of paper.";
+ mes "Because I had so much difficulty in defeating it, I decided to ask my collegues if they knew anything about it.";
+ next;
+ mes "[Eskla]";
+ mes "I found out what I had fought was called ^FF3355'The Paper'^000000.";
+ mes "People say that it used to be part of an old book that contained a great deal of ancient knowledge about Yuno.";
+ next;
+ mes "[Eskla]";
+ mes "Somehow it became a monster....... isn't that weird?";
+ close;
+}
+
+
+
+//======================================================================================
+yuno.gat,166,111,4 script Remorpheous 120,{
+ mes "[Remorpheous]";
+ mes "'Apocalypse'. he, an artificial human being,";
+ mes "was the chief of gatekeepers and in charge of public order of the city";
+ mes "of [Yuno] during the Ancient times civilization...";
+ close;
+ mes "[Remorpheus]";
+ mes "....similar to Robot. After living for a long time,";
+ mes "its A.I. totally screwed up,it couldn't recognize friend or foe anymore,";
+ mes "so without consideration of friends or foe......";
+ close;
+ mes "[Remorpheus]";
+ mes ".... it became a monster that attacks anyone regardless";
+ close;
+}
+
+//=====================================================================================
+yuno.gat,185,173,3 script Impressor 729,{
+ mes "[Impressor]";
+ mes "Scholar's city, 'Yuno' is made of 3 big islands.";
+ next;
+ mes "[Impressor]";
+ mes "those are,";
+ mes "The island of Glory - Solomon";
+ mes "The island of Prosperity - Minetta";
+ mes "The island of Wisdom - Snottra";
+ next;
+ mes "[Impressor]";
+ mes "Each island's location are:";
+ mes "Northwest: Solomon";
+ mes "Northeast: Snottra";
+ mes "South: Minetta";
+ close;
+}
+
+//=====================================================================================
+yuno.gat,80,150,4 script Young Woman 746,{
+ mes "[Young Woman]";
+ mes "Have you ever seen such a beautiful city?";
+ mes "And Yuno at night time is so wonderful with its lights shiny through the clouds";
+ next;
+ mes "[Young Woman]";
+ mes "I'm sorry i got carried away , its my first time being here in the City of Sages";
+ mes "i sugest you go look around and enjoy your self";
+ next;
+ mes "[Young Woman]";
+ mes "I believe i shall wait around here till nightfall just so i can see the lights clearly";
+ mes "maybe i will see you here later";
+ close;
+}
+
+
+//===================================================================================================//
+// Metto Quest
+//===================================================================================================//
+
+//========================================================================
+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, tommorrow, 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 hellp, this would be much easier.... Pray! Pray to whatever God you believe in that we will succed!";
+ 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 19;
+ 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 29;
+ 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 16;
+ next;
+ mes "[Metto]";
+ mes "NOOOOOOO!!! Why?? How?? Why would he do that? Are the Gods cursing me?!?";
+ emotion 6;
+ 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 29;
+ 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 28;
+ 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 28;
+ 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 assisstant and is going to STEAL all the CREDIT for our discoveries?!!";
+ emotion 23;
+ 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 32;
+ next;
+ mes "[Stangckle]";
+ mes "I don't think I can even bear to see his distugusting 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 4;
+ close;
+L_Done:
+ mes "So Metto was truly a mad scientist afterall...... 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 lastest 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 23;
+ 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 destory it.... my Great Z.... *sigh*";
+ emotion 28;
+ 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 handywork.";
+ 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 egostical 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 32;
+ next;
+ mes "[CiCi]";
+ mes "I have half a mind to teach him a little something about TRUE science and INTELLIGENT research!!";
+ emotion 7;
+ 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 4;
+ 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 6;
+ 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 definately lost his sanity and has gone too far!!";
+ emotion 7;
+ 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 1;
+ 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 appreicate 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 5;
+ next;
+ mes "[Wagan]";
+ mes "The people of this city are greateful to you. Here is a little token of our appreciation......";
+ next;
+ mes "[Wagan]";
+ mes "Thank you once again for your assisstance! I wish you the best of luck in all of your future endeavors!!!";
+ getitem 715,10;
+ emotion 15;
+ 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 15;
+ close;
+}
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/draculax.txt b/npc/events/custom/draculax.txt
index 87020e9f6..907580554 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.0
-//===== 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;
- Break;
-
-OnKilled:
- MapAnnounce "mag_dun02.gat","Dracula's curse has been lifted!",17;
- set $dracula_event,0;
- initnpctimer;
- Break;
-
-OnTimer7200000:
- if($dracula_event==0)
- stopnpctimer;
- enablenpc "Dracula_Event";
- Break;
-}
-
-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;
- Break;
-
-OnTimer500:
- npcskilleffect 21,10,74,187;
- Break;
-
-OnTimer1000:
- npcskilleffect 21,10,80,180;
- Break;
-
-OnTimer1500:
- npcskilleffect 21,10,79,183;
- Break;
-
-OnTimer2000:
- npcskilleffect 21,10,66,175;
- Break;
-
-OnTimer2500:
- npcskilleffect 21,10,63,186;
- Break;
-
-OnTimer3000:
- npcskilleffect 21,10,75,186;
- Break;
-
-OnTimer3500:
- npcskilleffect 21,10,75,173;
- Break;
-
-OnTimer4000:
- npcskilleffect 21,10,80,170;
- Break;
-
-OnTimer4500:
- npcskilleffect 21,10,60,179;
- Break;
-
-OnTimer5000:
- npcskilleffect 21,10,74,187;
- Break;
-
-OnTimer6000:
- npcskilleffect 21,10,69,182;
- Break;
-
-OnTimer6500:
- npcskilleffect 21,10,80,180;
- Break;
-
-OnTimer7000:
- npcskilleffect 21,10,60,179;
- Break;
-
-OnTimer7500:
- npcskilleffect 21,10,66,175;
- Break;
-
-OnTimer8000:
- npcskilleffect 21,10,80,187;
- Break;
-
-OnTimer8500:
- npcskilleffect 21,10,75,186;
- Break;
-
-OnTimer9000:
- npcskilleffect 21,10,75,173;
- Break;
-
-OnTimer9500:
- npcskilleffect 21,10,80,170;
- Break;
-
-OnTimer10000:
- npcskilleffect 21,10,63,186;
- Break;
-
-OnTimer10500:
- npcskilleffect 21,10,74,187;
- Break;
-
-OnTimer11000:
- npcskilleffect 21,10,72,182;
- monster "mag_dun02.gat",72,182,"Count Dracula",1389,1,"Dracula_Init::OnKilled";
- stopnpctimer;
- disablenpc "Dracula_Event";
- Break;
+//===== eAthena Script =======================================
+//= Dracula X Script
+//===== By: ==================================================
+//= valaris (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== 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;
+ Break;
+
+OnKilled:
+ MapAnnounce "mag_dun02.gat","Dracula's curse has been lifted!",17;
+ set $dracula_event,0;
+ initnpctimer;
+ Break;
+
+OnTimer7200000:
+ if($dracula_event==0)
+ stopnpctimer;
+ enablenpc "Dracula_Event";
+ Break;
+}
+
+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;
+ Break;
+
+OnTimer500:
+ npcskilleffect 21,10,74,187;
+ Break;
+
+OnTimer1000:
+ npcskilleffect 21,10,80,180;
+ Break;
+
+OnTimer1500:
+ npcskilleffect 21,10,79,183;
+ Break;
+
+OnTimer2000:
+ npcskilleffect 21,10,66,175;
+ Break;
+
+OnTimer2500:
+ npcskilleffect 21,10,63,186;
+ Break;
+
+OnTimer3000:
+ npcskilleffect 21,10,75,186;
+ Break;
+
+OnTimer3500:
+ npcskilleffect 21,10,75,173;
+ Break;
+
+OnTimer4000:
+ npcskilleffect 21,10,80,170;
+ Break;
+
+OnTimer4500:
+ npcskilleffect 21,10,60,179;
+ Break;
+
+OnTimer5000:
+ npcskilleffect 21,10,74,187;
+ Break;
+
+OnTimer6000:
+ npcskilleffect 21,10,69,182;
+ Break;
+
+OnTimer6500:
+ npcskilleffect 21,10,80,180;
+ Break;
+
+OnTimer7000:
+ npcskilleffect 21,10,60,179;
+ Break;
+
+OnTimer7500:
+ npcskilleffect 21,10,66,175;
+ Break;
+
+OnTimer8000:
+ npcskilleffect 21,10,80,187;
+ Break;
+
+OnTimer8500:
+ npcskilleffect 21,10,75,186;
+ Break;
+
+OnTimer9000:
+ npcskilleffect 21,10,75,173;
+ Break;
+
+OnTimer9500:
+ npcskilleffect 21,10,80,170;
+ Break;
+
+OnTimer10000:
+ npcskilleffect 21,10,63,186;
+ Break;
+
+OnTimer10500:
+ npcskilleffect 21,10,74,187;
+ Break;
+
+OnTimer11000:
+ npcskilleffect 21,10,72,182;
+ monster "mag_dun02.gat",72,182,"Count Dracula",1389,1,"Dracula_Init::OnKilled";
+ stopnpctimer;
+ disablenpc "Dracula_Event";
+ Break;
} \ No newline at end of file
diff --git a/npc/events/custom/uneasy_cemetery.txt b/npc/events/custom/uneasy_cemetery.txt
index e8bf9cf86..13300b828 100644
--- a/npc/events/custom/uneasy_cemetery.txt
+++ b/npc/events/custom/uneasy_cemetery.txt
@@ -1,135 +1,135 @@
-//===== 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;
- monster "prontera.gat",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 became 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 resless cemetery, we should pour all these grave with the Holy Water. But our sisters and broters are 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 "On 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 nedd " + $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 could 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;
+ monster "prontera.gat",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 became 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 resless cemetery, we should pour all these grave with the Holy Water. But our sisters and broters are 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 "On 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 nedd " + $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 could 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;
} \ No newline at end of file
diff --git a/npc/events/easter.txt b/npc/events/easter.txt
index fa7bc790d..867565005 100644
--- a/npc/events/easter.txt
+++ b/npc/events/easter.txt
@@ -1,196 +1,196 @@
-//===== eAthena Script =======================================
-//= Easter Egg Event
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== 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.
-//============================================================
-
-
-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;
-
- L_10:
- getitem 671,1;
- goto L_Cont;
- L_50:
- getitem 603,1;
- goto L_Cont;
- L_150:
- getitem 617,1;
-
- 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
+//===== eAthena Script =======================================
+//= Easter Egg Event
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== 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.
+//============================================================
+
+
+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;
+
+ L_10:
+ getitem 671,1;
+ goto L_Cont;
+ L_50:
+ getitem 603,1;
+ goto L_Cont;
+ L_150:
+ getitem 617,1;
+
+ 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
diff --git a/npc/events/twintowers.txt b/npc/events/twintowers.txt
index cdb5d7962..5b7db213a 100644
--- a/npc/events/twintowers.txt
+++ b/npc/events/twintowers.txt
@@ -1,93 +1,93 @@
-//===== eAthena Script =======================================
-//= Twin Towers NPCs
-//===== By: ==================================================
-//= sEiKaN (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; 0315+
-//===== Description: =========================================
-//= mRO Event: Twin Towers NPCs
-//===== Additional Comments: =================================
-//= 1.1 by Akaru
-//= 1.2 by Akaru
-//============================================================
-
-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 supposed 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 "but 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. Travelling 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, morever, adventure isn't an easy task in the first place.";
- mes "Isn't this true?";
- mes "Feel free to come to us when you are having 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 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 yout 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,101,116,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,145,118,4 duplicate(Twin-Towers) Twin Towers#tt7 812
+//===== eAthena Script =======================================
+//= Twin Towers NPCs
+//===== By: ==================================================
+//= sEiKaN (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; 0315+
+//===== Description: =========================================
+//= mRO Event: Twin Towers NPCs
+//===== Additional Comments: =================================
+//= 1.1 by Akaru
+//= 1.2 by Akaru
+//============================================================
+
+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 supposed 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 "but 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. Travelling 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, morever, adventure isn't an easy task in the first place.";
+ mes "Isn't this true?";
+ mes "Feel free to come to us when you are having 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 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 yout 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,101,116,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,145,118,4 duplicate(Twin-Towers) Twin Towers#tt7 812
comodo.gat,194,158,4 duplicate(Twin-Towers) Twin Towers#tt7 812 \ No newline at end of file
diff --git a/npc/events/valentinesday.txt b/npc/events/valentinesday.txt
index 1669c1b22..d9669ca94 100644
--- a/npc/events/valentinesday.txt
+++ b/npc/events/valentinesday.txt
@@ -1,272 +1,272 @@
-//Valentine Script 2004-02-12
-// input exploit fixed [Lupus]
-
-
-alberta.gat,26,243,4 script Trader 58,{
-//’j—w“ü‰Â”\
- mes "[Marco Bascinio]";
- mes "A special treat... Not easily found";
- mes "in Rune-Midgard Kingdom!";
- mes "No one can resist the temptation";
- mes "of its wonderful taste!";
- mes "Makes a great gift for a friend, or even for yourself!";
- next;
- mes "[Marco Bascinio]";
- mes "A gorgeous fancy looking chocolate for...";
- mes "only 5000z each!";
- next;
- menu "I want it!",L1,"Nah, I'll pass",Lend;
-Lend:
- mes "[Marco Bascinio]";
- mes "ƒEƒzH‚±`‚ñ‚ȃXƒyƒVƒƒƒ‹‚ȃ`ƒ‡ƒRƒŒ[";
- mes "ƒg‚ª—~‚µ‚­‚È‚¢‚ÆccŽc”O‚Å‚·‚ËI";
- mes "¡‚¾‚¯‚µ‚©”ƒ‚¦‚È‚¢ƒXƒyƒVƒƒƒ‹‚Å“Á•Ê‚È";
- mes "‚¨‰ÙŽq‚Å‚·‚æIl‚¦’¼‚µ‚ÄAƒ`ƒ‡ƒRƒŒ[";
- mes "ƒg‚ª—~‚µ‚­‚È‚Á‚½‚祔ñ¥”ñ¥”ñ‚Ü‚½";
- mes "—ˆ‚Ä‚­‚¾‚³‚¢I‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·I";
- close;
-L1:
- mes "[Marco Bascinio]";
- mes "No way! The chocolate has the spirit of it's maker!";
- mes "That is why I only sell not more than five to each person";
- mes "If you want more than five, come back again";
- mes "So how many do you want?";
- next;
- goto Linput;
-Linput:
- input @choconum;
- if (@choconum > 5) goto LError;
- if (@choconum <= 0) goto Lend;
- set @chocoprice,@choconum*5000;
- if (Zeny < @chocoprice) goto LError2;
- set Zeny,Zeny-@chocoprice;
- getitem 558,@choconum;
- mes "[Marco Bascinio]";
- mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·I";
- mes "Ž„‚ÍA‚à‚¤‚µ‚΂炭‚±‚±‚É‚¢‚Ü‚·‚©‚ç";
- mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ª—~‚µ‚­‚È‚Á‚½‚çA‚Ü‚½";
- mes "‚Ç‚¤‚¼I‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·I";
- close;
-LError:
- mes "[Marco Bascinio]";
- mes "ƒEƒzƒzƒzƒzƒzƒzA‘Ê–ÚA‘Ê–Ú‘Ê–ÚI";
- mes "ˆê‰ñ‚Ì‚¨”ƒ‚¢ã‚°‚Å5ŒÂ‚Ü‚Å‚Æà–¾‚µ‚Ü";
- mes "‚µ‚½‚æ‚ËIŽ„‚Í‚½‚­‚³[‚ñ‚Ìl‚ÉA‚±‚Ì";
- mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ð–¡‚í‚Á‚Ä—~‚µ‚¢‚Ì‚Å‚·I";
- mes "‚»‚ê‚ÉAH‚ׂ·‚¬‚é‚Æ‘¾‚è‚Ü‚·I";
- next;
- goto Linput;
-LError2:
- mes "[Marco Bascinio]";
- mes "ƒEƒzH‚ ‚ê‚ ‚êA‚ ‚ê‚êcc‚¨‹q‚³‚ñI";
- mes "‚¨‹à‚ª‘«‚è‚Ü‚¹‚ñ‚æB‚»‚ê‚ł̓`ƒ‡ƒR";
- mes "ƒŒ[ƒg‚𔄂邱‚Æ‚Ío—ˆ‚Ü‚¹‚ñI";
- mes "Ž„‚ÍA‚à‚¤‚µ‚΂炭‚±‚±‚É‚¢‚Ü‚·‚©‚ç";
- mes "‚¨‹à‚ªo—ˆ‚½‚ç‚Ü‚½‚Ç‚¤‚¼I";
- close;
-}
-
-alberta.gat,29,243,4 script ƒ`ƒ‡ƒRƒŒ[ƒg¤l‚Ì—öl 53,{
- if ((Sex == 0) && (countitem(7182) >= 5) && (countitem(7134) >= 1) && (countitem(519) >= 1) && (countitem(612) >= 1)) goto Lmake;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "‚±‚ñ‚É‚¿‚ÍBŽÀ‚ÍAŽ„‚̔ނª”„‚Á‚Ä‚¢‚é";
- mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ÍŽ„‚ªì‚Á‚Ä‚¢‚é‚ñ‚Å‚·B";
- mes "ŠO‘‚ÅAì‚é•û–@‚ðŠw‚ñ‚Å‚«‚½‚Ì‚Å‚·B";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "ŠO‘‚Å‚ÍA‚±‚ÌŽžŠú‚ÉD‚«‚Èl‚Ƀ`ƒ‡ƒR";
- mes "ƒŒ[ƒg‚ðƒvƒŒƒ[ƒ“ƒg‚·‚é•—K‚ª‚ ‚è‚Ü";
- mes "‚·BŠÃ‚¢‹CŽ‚¿‚ðAŠÃ‚¢ƒ`ƒ‡ƒRƒŒ[ƒg‚É";
- mes "‘õ‚·cc‚·‚΂炵‚¢‚ÆŽv‚¢‚Ü‚¹‚ñ‚©H";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "Ž„‚̃`ƒ‡ƒRƒŒ[ƒg‚ª­‚µ‚Å‚à‚¨–ð‚É—§‚Ä";
- mes "‚ê‚΂ÆA‚½‚­‚³‚ñ‚½‚­‚³‚ñAƒ`ƒ‡ƒRƒŒ[";
- mes "ƒg‚ðì‚Á‚½‚ñ‚Å‚·B";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "”Þ‚ÍA‚»‚ñ‚ÈŽ„‚ðŒ©‚Ä¢Ž©•ª‚Éo—ˆ‚é";
- mes "‚±‚Æ‚ð‚·‚é‚ñ‚¾£‚Á‚ÄŠæ’£‚Á‚ă`ƒ‡ƒR";
- mes "ƒŒ[ƒg‚𔄂Á‚Ä‚­‚ê‚Ä‚¢‚é‚ñ‚Å‚·B";
- mes "‚»‚Ì‹CŽ‚¿‚àŠð‚µ‚¢‚¯‚ÇAƒ`ƒ‡ƒRƒŒ[";
- mes "ƒg‚𔃂Á‚Ä‚­‚ꂽ•ûX‚ÌΊ炪A‰½‚æ‚è";
- mes "Ž„‚ðK‚¹‚É‚µ‚Ä‚­‚ê‚é‚ñ‚Å‚·B";
- next;
- if (Sex == 1) goto LMan;
-LWoman:
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "æ‚Ù‚Ç‚àŒ¾‚¢‚Ü‚µ‚½‚ªAŠO‘‚Å‚Í‚±‚ÌŽžŠú";
- mes "D‚«‚Èl‚Ƀ`ƒ‡ƒRƒŒ[ƒg‚ðƒvƒŒƒ[ƒ“ƒg";
- mes "‚·‚é‚ñ‚Å‚·B‚à‚µAD‚«‚È•û‚ª‚¢‚é‚È‚ç";
- mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ƈê‚É‹CŽ‚¿‚ð“`‚¦‚Ä";
- mes "‚Ý‚Ü‚¹‚ñ‚©H";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "Þ—¿‚ðŽ‚Á‚Ä—ˆ‚Ä‚­‚ê‚ê‚ÎAƒ`ƒ‡ƒRƒŒ[";
- mes "ƒg‚ðì‚è‚Ü‚·BŽ„‚̔ނª”„‚Á‚Ä‚¢‚éƒ`ƒ‡";
- mes "ƒRƒŒ[ƒg‚Å‚à‚¢‚¢‚Ì‚Å‚·‚ªcc";
- mes "‚¨‹à‚Å”ƒ‚¤‚æ‚èAŽ©•ª‚ÅW‚ß‚½Þ—¿‚Å";
- mes "ì‚Á‚½ƒ`ƒ‡ƒRƒŒ[ƒg‚Ì‚Ù‚¤‚ªA‚»‚Ìcc";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "Ž©•ª‚Ì‹CŽ‚¿‚ª‘ŠŽè‚É“`‚í‚é‚悤‚È‹C‚ª";
- mes "‚µ‚Ü‚¹‚ñ‚©H";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "Þ—¿‚Å‚·‚ªAƒƒ‚‚Ì€”õ‚Í‚¢‚¢‚Å‚·‚©H";
- mes "^3355ffƒJƒJƒI 5ŒÂ";
- mes "ƒ~ƒ‹ƒN 1ŒÂ";
- mes "“û”« 1ŒÂ";
- mes "Œg‘Ñ—p—nz˜F 1ŒÂ^000000";
- next;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "€”õ‚ª‚Å‚«‚½‚çA‹³‚¦‚Ä‚­‚¾‚³‚¢B";
- mes "”ü–¡‚µ‚¢ƒ`ƒ‡ƒRƒŒ[ƒg‚ðì‚点‚Ä";
- mes "‚¢‚½‚¾‚«‚Ü‚·B";
- close;
-LMan:
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "‚¾‚©‚çAˆêŒÂˆêŒÂ‘厖‚ɑ厖‚Éì‚Á‚Ä";
- mes "‚¢‚é‚ñ‚Å‚·BŽ©•ª‚Å‚à”ü–¡‚µ‚­‚Å‚«‚½";
- mes "‚ÆŽv‚¢‚Ü‚·‚µAˆê“x¢‚µã‚ª‚Á‚Ä‚Ý‚Ä";
- mes "‚­‚¾‚³‚¢‚ËB‚Ó‚¤AŠæ’£‚Á‚Ä‚à‚Á‚Æ";
- mes "ì‚ç‚È‚«‚áI";
- close;
-Lmake:
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "€”õ‚ªo—ˆ‚½‚ñ‚Å‚·‚ËI‚Å‚ÍA‘‘¬˜r‚ð";
- mes "•±‚킹‚Ä‚¢‚½‚¾‚«‚Ü‚·I";
- mes "‚ A—ׂɂ¢‚é”Þ‚É‚Í“à‚Å‚·‚æB";
- next;
- delitem 7182,5;
- delitem 7134,1;
- delitem 519,1;
- delitem 612,1;
- getitem 558,1;
- mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
- mes "‚Í‚¢Ao—ˆã‚ª‚è‚Ü‚µ‚½I";
- mes "ƒvƒŒƒ[ƒ“ƒg‚È‚³‚é‚Ì‚Å‚·‚©H";
- mes "‹CŽ‚¿‚ª“`‚í‚é‚Æ‚¢‚¢‚Å‚·‚ËB";
- mes "K‚¹‚É‚È‚Á‚Ä‚­‚¾‚³‚¢`B";
- close;
-}
-
-prt_castle.gat,42,35,3 script Dessert Manager 47,{
- if (Sex == 1) goto LStartMan;
-LStartWomen:
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
- mes "‹M•û‚ª‚»‚±‚É‚¢‚邾‚¯‚ÅA‚±‚Ì‚Þ‚³";
- mes "‹ê‚µ‚¢êŠ‚ª“V‘‚É“™‚µ‚­‚È‚éB";
- next;
- mes "[Charl Orleang]";
- mes "“VŽg‚̂悤‚Ɉ¤‚­‚邵‚¢‹M•û‚ª";
- mes "‚¢‚Á‚½‚¢‰½—p‚Å‚±‚±‚É‚¢‚炵‚½‚Ì‚©‚ÈH";
- mes "ƒƒ^ƒNƒV‚߂ł悯‚ê‚ÎA‰½‚Å‚àŠè‚¢‚ð";
- mes "•·‚«‚Ü‚µ‚傤B";
- next;
- menu "ƒ`ƒ‡ƒRƒŒ[ƒg‚ðì‚Á‚Ä‚­‚ê‚Ü‚·‚©H",L1,"‚¨”æ‚ê—l‚Å‚·B",-;
- mes "[Charl Orleang]";
- mes "ƒIƒDA‚»‚̈ꌾccƒƒ^ƒNƒV‚Ì‘¶Ý‚ð";
- mes "–³‚É‹A‚·‚悤‚Ècc‚»‚Ì•X‚Ìn‚̂悤‚È";
- mes "ˆêŒ¾‚ªAŽ„‚Ìg‚ðí‚èA°‚³‚¦‘‰‚¹Š‚¦";
- mes "‚³‚¹‚Ä‚µ‚Ü‚¤cc";
- next;
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
- mes "‚Ç‚¤‚·‚ê‚΂ǂ¤‚·‚ê‚Îcc‹M•û‚ÌS‚ð";
- mes "Ăуƒ^ƒNƒV‚Ì—¸‚Æo—ˆ‚é‚Ì‚©!?";
- close;
-L1:
- if (countitem(558) >= 3) goto L2;
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
- mes "ƒƒ^ƒNƒV‚Í_‚Å‚à˜B‹àpŽt‚Å‚à‚È‚¢‚Ì‚Å";
- mes "‚·B•Ï‚ÈÞ—¿‚©‚çŒ|p•i‚ð‘n‚èo‚·‚±‚Æ";
- mes "‚È‚Ço—ˆ‚Ü‚¹‚ñI‚»‚µ‚ÄA•½–}‚ȃAƒCƒe";
- mes "ƒ€‚©‚畽–}‚Èì•i‚ðì‚é‚È‚ÇAˆÌ‘å‚ÈŒ|";
- mes "p‰Æ‚̃ƒ^ƒNƒV‚É‚Í•s‰Â”\!!";
- next;
- mes "[Charl Orleang]";
- mes "ƒƒ^ƒNƒV‚ª‘n‘¢‚·‚镨‚ÍA¢ŠE’†‚Ì’N‚à";
- mes "‚ªŠ´’Q‚Ì‚½‚ß‘§‚ð“f‚­A’N‚É‚à“ž’ê^Ž—";
- mes "o—ˆ‚È‚¢Œ|p•i‚È‚Ì‚Å‚·B";
- next;
- mes "[Charl Orleang]";
- mes "ƒƒ^ƒNƒV‚ª‹M•û‚Ì‹ê˜J‚É•ñ‚¢‚éˆ×‚É‚Í";
- mes "^3355ffƒ`ƒ‡ƒRƒŒ[ƒg3ŒÂ^000000‚ªâ‘ΕK—v‚È‚Ì‚Å‚·B";
- mes "‚»‚êˆÈ‰º‚Å‚àA‚»‚êˆÈã‚Å‚à‚È‚¢B";
- mes "ƒsƒbƒ^ƒŠ3ŒÂccB";
- next;
- mes "[Charl Orleang]";
- mes "ƒ}ƒhƒ‚ƒAƒ[ƒ‹‚ÌŒõ‹P‚­”ü–e‚Ɖؚø‚Èg‚É";
- mes "‰B‚³‚ꂽ‹­x‚Ȉӎu‚È‚çA‚«‚Á‚ÆŽè‚É";
- mes "“ü‚ê‚Ä‚­‚邱‚Æ‚ª‰Â”\‚Å‚µ‚傤B";
- next;
- mes "[Charl Orleang]";
- mes "‚¢‚¢‚Å‚·‚©B^3355ffƒ`ƒ‡ƒRƒŒ[ƒg3ŒÂ^000000‚ðŽ‚Á‚Ä";
- mes "—ˆ‚Ä‚­‚¾‚³‚¢Bo—ˆ‚邱‚Æ‚È‚ç‰Î‚Ì’†";
- mes "…‚Ì’†A’n–‚Ì’ê‚Ö‚Å‚àA‹M•û‚ׂ̈É";
- mes "ƒƒ^ƒNƒV‚ª’¼ÚŽè‚É“ü‚ê‚Ä·‚µã‚°‚½‚¢";
- mes "‚ªA¡‚̃ƒ^ƒNƒV‚͉¤‹{‚Ì‹Æ–±‚ÉIŽn";
- mes "I‚í‚ê‚égccƒIƒDcc";
- next;
- mes "[Charl Orleang]";
- mes "ƒI ƒŒƒ”ƒHƒ[ ƒ}ƒhƒ‚ƒAƒ[ƒ‹cc";
- mes "‹M•û‚Ì‹A‚è‚ðS‚©‚炨‘Ò‚¿‚µ‚Ä";
- mes "‚¨‚è‚Ü‚·cc";
- close;
-L2:
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
- mes "ƒƒ^ƒNƒV‚ÌŽ‚Ä‚é‘S‚Ä‚ÌŠ´«‚ðŽ‚Á‚Ä";
- mes "‹M•û‚̃`ƒ‡ƒRƒŒ[ƒg‚ð”ü‚µ‚­‚·‚΂炵‚­";
- mes "àŠ‚Ñ‚â‚©‚ÈŒ|p‚ւƸ‰Ø‚³‚¹‚Ä‚¢‚½‚¾";
- mes "‚«‚Ü‚µ‚傤I";
- next;
- mes "[Charl Orleang]";
- mes "‹M•û‚Ì“µ‚Æ‚¢‚¤•ó΂ªA¢ŠE’†‚Ì’N‚à‚ð";
- mes "–£—¹‚·‚éA“§–¾‚Å_”é“I‚Ȉ¤‚ÌŒõ‚ð•ú‚Â";
- mes "‚悤‚Écc";
- next;
- mes "[Charl Orleang]";
- mes "ƒAƒ“ ƒhƒD ƒgƒƒ ƒNƒ@ƒgƒ‹cc";
- mes "‚Ý‚É‚­‚¢ƒAƒqƒ‹‚ÌŽq‚ª”ü‚µ‚¢”’’¹‚É•Ïg";
- mes "‚µ‚½‚悤‚Écc•½–}‚ȃ`ƒ‡ƒRƒŒ[ƒg‚ª”ü";
- mes "‚µ‚¢Œ|p‚É•Ïg‚·‚é‚Ì‚¾cc!!";
- next;
- mes "[Charl Orleang]";
- mes "’g‚©‚­•ï‚Ýž‚Ýcc‚»‚µ‚Ä‚Ó‚ñ‚í‚è‚Æ";
- mes "•Ï‰»‚·‚邪‚¢‚¢I";
- mes "‹­x‚É‚ÄAˆÌ‘å‚Ȃ鎞‘ã‚Ì–¼ì‚æccI";
- next;
- delitem 558,3;
- getitem 559,1;
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒtƒFƒŠƒVƒ^ƒVƒIƒ“IƒIƒD`ƒ‰ƒ‰ô";
- mes "‚±‚ñ‚È‘f“G‚Èì•i‚ðì‚èo‚¹‚é‚Æ‚Ícc";
- mes "ƒƒ^ƒNƒV‚Í‚È‚ñ‚Æß[‚¢‚Ì‚¾ccI";
- mes "ƒ}ƒhƒ‚ƒAƒ[ƒ‹A‚±‚Ì‹M•û‚ÌŽŠ‹É‚Ì”÷΂Ý";
- mes "‚Æ‚àŒ¾‚¦‚éŒ|p•iA‹C‚É“ü‚Á‚Ä‚¢‚½‚¾‚¯";
- mes "‚½‚©‚ÈB";
- next;
- mes "[Charl Orleang]";
- mes "‚Å‚ÍAƒI ƒŒƒ”ƒHƒ`B";
- close;
-LStartMan:
- mes "[Charl Orleang]";
- mes "ƒ{ƒ“ƒWƒ…`ƒ‹_ƒ€ƒbƒVƒ…[Bƒƒ^ƒNƒV‚Í";
- mes "—y‚©‰“‚¢êŠ‚©‚çŒ|p‚ð¶‚Ýo‚·‚½‚ßA";
- mes "‚±‚̃AƒgƒŠƒG‚É•‘‚¢~‚肽‚Æ‚±‚ë‚È‚Ì";
- mes "‚Å‚·B";
- next;
- mes "[Charl Orleang]";
- mes "ƒIƒDAƒmƒ“ƒmƒ“IŽ„‚Ì´‚ç‚©‚È“µ‚Í";
- mes "ˆ¤‚炵‚¢—«‚Ì‚Ý‚ð‰f‚·‹¾‚È‚Ì‚Å‚·B";
- next;
- mes "[Charl Orleang]";
- mes "ƒIƒD`A‚»‚ê‚Å‚È‚­‚Ä‚à–Z‚µ‚¢‚Ì‚É";
- mes "‚±‚̃Vƒƒƒ‹ƒ‹=ƒIƒ‹ƒŒƒAƒ“‚ð”ς킹‚é";
- mes "‚È‚ñ‚ÄBƒIƒD`Aƒmƒ“ƒmƒ“ƒmƒ“B";
- close;
+//Valentine Script 2004-02-12
+// input exploit fixed [Lupus]
+
+
+alberta.gat,26,243,4 script Trader 58,{
+//’j—w“ü‰Â”\
+ mes "[Marco Bascinio]";
+ mes "A special treat... Not easily found";
+ mes "in Rune-Midgard Kingdom!";
+ mes "No one can resist the temptation";
+ mes "of its wonderful taste!";
+ mes "Makes a great gift for a friend, or even for yourself!";
+ next;
+ mes "[Marco Bascinio]";
+ mes "A gorgeous fancy looking chocolate for...";
+ mes "only 5000z each!";
+ next;
+ menu "I want it!",L1,"Nah, I'll pass",Lend;
+Lend:
+ mes "[Marco Bascinio]";
+ mes "ƒEƒzH‚±`‚ñ‚ȃXƒyƒVƒƒƒ‹‚ȃ`ƒ‡ƒRƒŒ[";
+ mes "ƒg‚ª—~‚µ‚­‚È‚¢‚ÆccŽc”O‚Å‚·‚ËI";
+ mes "¡‚¾‚¯‚µ‚©”ƒ‚¦‚È‚¢ƒXƒyƒVƒƒƒ‹‚Å“Á•Ê‚È";
+ mes "‚¨‰ÙŽq‚Å‚·‚æIl‚¦’¼‚µ‚ÄAƒ`ƒ‡ƒRƒŒ[";
+ mes "ƒg‚ª—~‚µ‚­‚È‚Á‚½‚祔ñ¥”ñ¥”ñ‚Ü‚½";
+ mes "—ˆ‚Ä‚­‚¾‚³‚¢I‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·I";
+ close;
+L1:
+ mes "[Marco Bascinio]";
+ mes "No way! The chocolate has the spirit of it's maker!";
+ mes "That is why I only sell not more than five to each person";
+ mes "If you want more than five, come back again";
+ mes "So how many do you want?";
+ next;
+ goto Linput;
+Linput:
+ input @choconum;
+ if (@choconum > 5) goto LError;
+ if (@choconum <= 0) goto Lend;
+ set @chocoprice,@choconum*5000;
+ if (Zeny < @chocoprice) goto LError2;
+ set Zeny,Zeny-@chocoprice;
+ getitem 558,@choconum;
+ mes "[Marco Bascinio]";
+ mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·I";
+ mes "Ž„‚ÍA‚à‚¤‚µ‚΂炭‚±‚±‚É‚¢‚Ü‚·‚©‚ç";
+ mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ª—~‚µ‚­‚È‚Á‚½‚çA‚Ü‚½";
+ mes "‚Ç‚¤‚¼I‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·I";
+ close;
+LError:
+ mes "[Marco Bascinio]";
+ mes "ƒEƒzƒzƒzƒzƒzƒzA‘Ê–ÚA‘Ê–Ú‘Ê–ÚI";
+ mes "ˆê‰ñ‚Ì‚¨”ƒ‚¢ã‚°‚Å5ŒÂ‚Ü‚Å‚Æà–¾‚µ‚Ü";
+ mes "‚µ‚½‚æ‚ËIŽ„‚Í‚½‚­‚³[‚ñ‚Ìl‚ÉA‚±‚Ì";
+ mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ð–¡‚í‚Á‚Ä—~‚µ‚¢‚Ì‚Å‚·I";
+ mes "‚»‚ê‚ÉAH‚ׂ·‚¬‚é‚Æ‘¾‚è‚Ü‚·I";
+ next;
+ goto Linput;
+LError2:
+ mes "[Marco Bascinio]";
+ mes "ƒEƒzH‚ ‚ê‚ ‚êA‚ ‚ê‚êcc‚¨‹q‚³‚ñI";
+ mes "‚¨‹à‚ª‘«‚è‚Ü‚¹‚ñ‚æB‚»‚ê‚ł̓`ƒ‡ƒR";
+ mes "ƒŒ[ƒg‚𔄂邱‚Æ‚Ío—ˆ‚Ü‚¹‚ñI";
+ mes "Ž„‚ÍA‚à‚¤‚µ‚΂炭‚±‚±‚É‚¢‚Ü‚·‚©‚ç";
+ mes "‚¨‹à‚ªo—ˆ‚½‚ç‚Ü‚½‚Ç‚¤‚¼I";
+ close;
+}
+
+alberta.gat,29,243,4 script ƒ`ƒ‡ƒRƒŒ[ƒg¤l‚Ì—öl 53,{
+ if ((Sex == 0) && (countitem(7182) >= 5) && (countitem(7134) >= 1) && (countitem(519) >= 1) && (countitem(612) >= 1)) goto Lmake;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "‚±‚ñ‚É‚¿‚ÍBŽÀ‚ÍAŽ„‚̔ނª”„‚Á‚Ä‚¢‚é";
+ mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ÍŽ„‚ªì‚Á‚Ä‚¢‚é‚ñ‚Å‚·B";
+ mes "ŠO‘‚ÅAì‚é•û–@‚ðŠw‚ñ‚Å‚«‚½‚Ì‚Å‚·B";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "ŠO‘‚Å‚ÍA‚±‚ÌŽžŠú‚ÉD‚«‚Èl‚Ƀ`ƒ‡ƒR";
+ mes "ƒŒ[ƒg‚ðƒvƒŒƒ[ƒ“ƒg‚·‚é•—K‚ª‚ ‚è‚Ü";
+ mes "‚·BŠÃ‚¢‹CŽ‚¿‚ðAŠÃ‚¢ƒ`ƒ‡ƒRƒŒ[ƒg‚É";
+ mes "‘õ‚·cc‚·‚΂炵‚¢‚ÆŽv‚¢‚Ü‚¹‚ñ‚©H";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "Ž„‚̃`ƒ‡ƒRƒŒ[ƒg‚ª­‚µ‚Å‚à‚¨–ð‚É—§‚Ä";
+ mes "‚ê‚΂ÆA‚½‚­‚³‚ñ‚½‚­‚³‚ñAƒ`ƒ‡ƒRƒŒ[";
+ mes "ƒg‚ðì‚Á‚½‚ñ‚Å‚·B";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "”Þ‚ÍA‚»‚ñ‚ÈŽ„‚ðŒ©‚Ä¢Ž©•ª‚Éo—ˆ‚é";
+ mes "‚±‚Æ‚ð‚·‚é‚ñ‚¾£‚Á‚ÄŠæ’£‚Á‚ă`ƒ‡ƒR";
+ mes "ƒŒ[ƒg‚𔄂Á‚Ä‚­‚ê‚Ä‚¢‚é‚ñ‚Å‚·B";
+ mes "‚»‚Ì‹CŽ‚¿‚àŠð‚µ‚¢‚¯‚ÇAƒ`ƒ‡ƒRƒŒ[";
+ mes "ƒg‚𔃂Á‚Ä‚­‚ꂽ•ûX‚ÌΊ炪A‰½‚æ‚è";
+ mes "Ž„‚ðK‚¹‚É‚µ‚Ä‚­‚ê‚é‚ñ‚Å‚·B";
+ next;
+ if (Sex == 1) goto LMan;
+LWoman:
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "æ‚Ù‚Ç‚àŒ¾‚¢‚Ü‚µ‚½‚ªAŠO‘‚Å‚Í‚±‚ÌŽžŠú";
+ mes "D‚«‚Èl‚Ƀ`ƒ‡ƒRƒŒ[ƒg‚ðƒvƒŒƒ[ƒ“ƒg";
+ mes "‚·‚é‚ñ‚Å‚·B‚à‚µAD‚«‚È•û‚ª‚¢‚é‚È‚ç";
+ mes "ƒ`ƒ‡ƒRƒŒ[ƒg‚ƈê‚É‹CŽ‚¿‚ð“`‚¦‚Ä";
+ mes "‚Ý‚Ü‚¹‚ñ‚©H";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "Þ—¿‚ðŽ‚Á‚Ä—ˆ‚Ä‚­‚ê‚ê‚ÎAƒ`ƒ‡ƒRƒŒ[";
+ mes "ƒg‚ðì‚è‚Ü‚·BŽ„‚̔ނª”„‚Á‚Ä‚¢‚éƒ`ƒ‡";
+ mes "ƒRƒŒ[ƒg‚Å‚à‚¢‚¢‚Ì‚Å‚·‚ªcc";
+ mes "‚¨‹à‚Å”ƒ‚¤‚æ‚èAŽ©•ª‚ÅW‚ß‚½Þ—¿‚Å";
+ mes "ì‚Á‚½ƒ`ƒ‡ƒRƒŒ[ƒg‚Ì‚Ù‚¤‚ªA‚»‚Ìcc";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "Ž©•ª‚Ì‹CŽ‚¿‚ª‘ŠŽè‚É“`‚í‚é‚悤‚È‹C‚ª";
+ mes "‚µ‚Ü‚¹‚ñ‚©H";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "Þ—¿‚Å‚·‚ªAƒƒ‚‚Ì€”õ‚Í‚¢‚¢‚Å‚·‚©H";
+ mes "^3355ffƒJƒJƒI 5ŒÂ";
+ mes "ƒ~ƒ‹ƒN 1ŒÂ";
+ mes "“û”« 1ŒÂ";
+ mes "Œg‘Ñ—p—nz˜F 1ŒÂ^000000";
+ next;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "€”õ‚ª‚Å‚«‚½‚çA‹³‚¦‚Ä‚­‚¾‚³‚¢B";
+ mes "”ü–¡‚µ‚¢ƒ`ƒ‡ƒRƒŒ[ƒg‚ðì‚点‚Ä";
+ mes "‚¢‚½‚¾‚«‚Ü‚·B";
+ close;
+LMan:
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "‚¾‚©‚çAˆêŒÂˆêŒÂ‘厖‚ɑ厖‚Éì‚Á‚Ä";
+ mes "‚¢‚é‚ñ‚Å‚·BŽ©•ª‚Å‚à”ü–¡‚µ‚­‚Å‚«‚½";
+ mes "‚ÆŽv‚¢‚Ü‚·‚µAˆê“x¢‚µã‚ª‚Á‚Ä‚Ý‚Ä";
+ mes "‚­‚¾‚³‚¢‚ËB‚Ó‚¤AŠæ’£‚Á‚Ä‚à‚Á‚Æ";
+ mes "ì‚ç‚È‚«‚áI";
+ close;
+Lmake:
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "€”õ‚ªo—ˆ‚½‚ñ‚Å‚·‚ËI‚Å‚ÍA‘‘¬˜r‚ð";
+ mes "•±‚킹‚Ä‚¢‚½‚¾‚«‚Ü‚·I";
+ mes "‚ A—ׂɂ¢‚é”Þ‚É‚Í“à‚Å‚·‚æB";
+ next;
+ delitem 7182,5;
+ delitem 7134,1;
+ delitem 519,1;
+ delitem 612,1;
+ getitem 558,1;
+ mes "[ƒGƒXƒeƒ‹=ƒ[ƒY]";
+ mes "‚Í‚¢Ao—ˆã‚ª‚è‚Ü‚µ‚½I";
+ mes "ƒvƒŒƒ[ƒ“ƒg‚È‚³‚é‚Ì‚Å‚·‚©H";
+ mes "‹CŽ‚¿‚ª“`‚í‚é‚Æ‚¢‚¢‚Å‚·‚ËB";
+ mes "K‚¹‚É‚È‚Á‚Ä‚­‚¾‚³‚¢`B";
+ close;
+}
+
+prt_castle.gat,42,35,3 script Dessert Manager 47,{
+ if (Sex == 1) goto LStartMan;
+LStartWomen:
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
+ mes "‹M•û‚ª‚»‚±‚É‚¢‚邾‚¯‚ÅA‚±‚Ì‚Þ‚³";
+ mes "‹ê‚µ‚¢êŠ‚ª“V‘‚É“™‚µ‚­‚È‚éB";
+ next;
+ mes "[Charl Orleang]";
+ mes "“VŽg‚̂悤‚Ɉ¤‚­‚邵‚¢‹M•û‚ª";
+ mes "‚¢‚Á‚½‚¢‰½—p‚Å‚±‚±‚É‚¢‚炵‚½‚Ì‚©‚ÈH";
+ mes "ƒƒ^ƒNƒV‚߂ł悯‚ê‚ÎA‰½‚Å‚àŠè‚¢‚ð";
+ mes "•·‚«‚Ü‚µ‚傤B";
+ next;
+ menu "ƒ`ƒ‡ƒRƒŒ[ƒg‚ðì‚Á‚Ä‚­‚ê‚Ü‚·‚©H",L1,"‚¨”æ‚ê—l‚Å‚·B",-;
+ mes "[Charl Orleang]";
+ mes "ƒIƒDA‚»‚̈ꌾccƒƒ^ƒNƒV‚Ì‘¶Ý‚ð";
+ mes "–³‚É‹A‚·‚悤‚Ècc‚»‚Ì•X‚Ìn‚̂悤‚È";
+ mes "ˆêŒ¾‚ªAŽ„‚Ìg‚ðí‚èA°‚³‚¦‘‰‚¹Š‚¦";
+ mes "‚³‚¹‚Ä‚µ‚Ü‚¤cc";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
+ mes "‚Ç‚¤‚·‚ê‚΂ǂ¤‚·‚ê‚Îcc‹M•û‚ÌS‚ð";
+ mes "Ăуƒ^ƒNƒV‚Ì—¸‚Æo—ˆ‚é‚Ì‚©!?";
+ close;
+L1:
+ if (countitem(558) >= 3) goto L2;
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
+ mes "ƒƒ^ƒNƒV‚Í_‚Å‚à˜B‹àpŽt‚Å‚à‚È‚¢‚Ì‚Å";
+ mes "‚·B•Ï‚ÈÞ—¿‚©‚çŒ|p•i‚ð‘n‚èo‚·‚±‚Æ";
+ mes "‚È‚Ço—ˆ‚Ü‚¹‚ñI‚»‚µ‚ÄA•½–}‚ȃAƒCƒe";
+ mes "ƒ€‚©‚畽–}‚Èì•i‚ðì‚é‚È‚ÇAˆÌ‘å‚ÈŒ|";
+ mes "p‰Æ‚̃ƒ^ƒNƒV‚É‚Í•s‰Â”\!!";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒƒ^ƒNƒV‚ª‘n‘¢‚·‚镨‚ÍA¢ŠE’†‚Ì’N‚à";
+ mes "‚ªŠ´’Q‚Ì‚½‚ß‘§‚ð“f‚­A’N‚É‚à“ž’ê^Ž—";
+ mes "o—ˆ‚È‚¢Œ|p•i‚È‚Ì‚Å‚·B";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒƒ^ƒNƒV‚ª‹M•û‚Ì‹ê˜J‚É•ñ‚¢‚éˆ×‚É‚Í";
+ mes "^3355ffƒ`ƒ‡ƒRƒŒ[ƒg3ŒÂ^000000‚ªâ‘ΕK—v‚È‚Ì‚Å‚·B";
+ mes "‚»‚êˆÈ‰º‚Å‚àA‚»‚êˆÈã‚Å‚à‚È‚¢B";
+ mes "ƒsƒbƒ^ƒŠ3ŒÂccB";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒ}ƒhƒ‚ƒAƒ[ƒ‹‚ÌŒõ‹P‚­”ü–e‚Ɖؚø‚Èg‚É";
+ mes "‰B‚³‚ꂽ‹­x‚Ȉӎu‚È‚çA‚«‚Á‚ÆŽè‚É";
+ mes "“ü‚ê‚Ä‚­‚邱‚Æ‚ª‰Â”\‚Å‚µ‚傤B";
+ next;
+ mes "[Charl Orleang]";
+ mes "‚¢‚¢‚Å‚·‚©B^3355ffƒ`ƒ‡ƒRƒŒ[ƒg3ŒÂ^000000‚ðŽ‚Á‚Ä";
+ mes "—ˆ‚Ä‚­‚¾‚³‚¢Bo—ˆ‚邱‚Æ‚È‚ç‰Î‚Ì’†";
+ mes "…‚Ì’†A’n–‚Ì’ê‚Ö‚Å‚àA‹M•û‚ׂ̈É";
+ mes "ƒƒ^ƒNƒV‚ª’¼ÚŽè‚É“ü‚ê‚Ä·‚µã‚°‚½‚¢";
+ mes "‚ªA¡‚̃ƒ^ƒNƒV‚͉¤‹{‚Ì‹Æ–±‚ÉIŽn";
+ mes "I‚í‚ê‚égccƒIƒDcc";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒI ƒŒƒ”ƒHƒ[ ƒ}ƒhƒ‚ƒAƒ[ƒ‹cc";
+ mes "‹M•û‚Ì‹A‚è‚ðS‚©‚炨‘Ò‚¿‚µ‚Ä";
+ mes "‚¨‚è‚Ü‚·cc";
+ close;
+L2:
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒ}ƒhƒ‚ƒAƒ[ƒ‹I";
+ mes "ƒƒ^ƒNƒV‚ÌŽ‚Ä‚é‘S‚Ä‚ÌŠ´«‚ðŽ‚Á‚Ä";
+ mes "‹M•û‚̃`ƒ‡ƒRƒŒ[ƒg‚ð”ü‚µ‚­‚·‚΂炵‚­";
+ mes "àŠ‚Ñ‚â‚©‚ÈŒ|p‚ւƸ‰Ø‚³‚¹‚Ä‚¢‚½‚¾";
+ mes "‚«‚Ü‚µ‚傤I";
+ next;
+ mes "[Charl Orleang]";
+ mes "‹M•û‚Ì“µ‚Æ‚¢‚¤•ó΂ªA¢ŠE’†‚Ì’N‚à‚ð";
+ mes "–£—¹‚·‚éA“§–¾‚Å_”é“I‚Ȉ¤‚ÌŒõ‚ð•ú‚Â";
+ mes "‚悤‚Écc";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒAƒ“ ƒhƒD ƒgƒƒ ƒNƒ@ƒgƒ‹cc";
+ mes "‚Ý‚É‚­‚¢ƒAƒqƒ‹‚ÌŽq‚ª”ü‚µ‚¢”’’¹‚É•Ïg";
+ mes "‚µ‚½‚悤‚Écc•½–}‚ȃ`ƒ‡ƒRƒŒ[ƒg‚ª”ü";
+ mes "‚µ‚¢Œ|p‚É•Ïg‚·‚é‚Ì‚¾cc!!";
+ next;
+ mes "[Charl Orleang]";
+ mes "’g‚©‚­•ï‚Ýž‚Ýcc‚»‚µ‚Ä‚Ó‚ñ‚í‚è‚Æ";
+ mes "•Ï‰»‚·‚邪‚¢‚¢I";
+ mes "‹­x‚É‚ÄAˆÌ‘å‚Ȃ鎞‘ã‚Ì–¼ì‚æccI";
+ next;
+ delitem 558,3;
+ getitem 559,1;
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒtƒFƒŠƒVƒ^ƒVƒIƒ“IƒIƒD`ƒ‰ƒ‰ô";
+ mes "‚±‚ñ‚È‘f“G‚Èì•i‚ðì‚èo‚¹‚é‚Æ‚Ícc";
+ mes "ƒƒ^ƒNƒV‚Í‚È‚ñ‚Æß[‚¢‚Ì‚¾ccI";
+ mes "ƒ}ƒhƒ‚ƒAƒ[ƒ‹A‚±‚Ì‹M•û‚ÌŽŠ‹É‚Ì”÷΂Ý";
+ mes "‚Æ‚àŒ¾‚¦‚éŒ|p•iA‹C‚É“ü‚Á‚Ä‚¢‚½‚¾‚¯";
+ mes "‚½‚©‚ÈB";
+ next;
+ mes "[Charl Orleang]";
+ mes "‚Å‚ÍAƒI ƒŒƒ”ƒHƒ`B";
+ close;
+LStartMan:
+ mes "[Charl Orleang]";
+ mes "ƒ{ƒ“ƒWƒ…`ƒ‹_ƒ€ƒbƒVƒ…[Bƒƒ^ƒNƒV‚Í";
+ mes "—y‚©‰“‚¢êŠ‚©‚çŒ|p‚ð¶‚Ýo‚·‚½‚ßA";
+ mes "‚±‚̃AƒgƒŠƒG‚É•‘‚¢~‚肽‚Æ‚±‚ë‚È‚Ì";
+ mes "‚Å‚·B";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒIƒDAƒmƒ“ƒmƒ“IŽ„‚Ì´‚ç‚©‚È“µ‚Í";
+ mes "ˆ¤‚炵‚¢—«‚Ì‚Ý‚ð‰f‚·‹¾‚È‚Ì‚Å‚·B";
+ next;
+ mes "[Charl Orleang]";
+ mes "ƒIƒD`A‚»‚ê‚Å‚È‚­‚Ä‚à–Z‚µ‚¢‚Ì‚É";
+ mes "‚±‚̃Vƒƒƒ‹ƒ‹=ƒIƒ‹ƒŒƒAƒ“‚ð”ς킹‚é";
+ mes "‚È‚ñ‚ÄBƒIƒD`Aƒmƒ“ƒmƒ“ƒmƒ“B";
+ close;
} \ No newline at end of file
diff --git a/npc/events/xmas.txt b/npc/events/xmas.txt
index 57b1e9c63..71bda8e84 100644
--- a/npc/events/xmas.txt
+++ b/npc/events/xmas.txt
@@ -1,251 +1,251 @@
-//===== eAthena Script =======================================
-//= X-mas Event
-//===== By: ==================================================
-//=
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//=
-//===== 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 Claus npc.
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-xmas_in.gat,100,96,4 script Father Christmas::Santa2 718,{
- mes "[Santa Claus]";
- 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 children's 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 into another place when";
- mes "you attack him each time.";
- 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 children's 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;
- mes "Seems you've been doing a";
- mes "good job of taking down those";
- mes "fake Santas. Keep it up!";
- next;
- delitem 7034,3;
- getitem 644,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";
- mes "reward you.";
- close;
- M_End:
- mes "[Santa Claus]";
- mes "I see. Well, at the very least";
- mes "we shall meet again on Chirstmas morning.";
- close;
-
-OnInit:
- disablenpc "Santa1";
- end;
-}
-
-
-//========================================================
-// X-mas Mobs
-//========================================================
-gef_fild00.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild00.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild02.gat,0,0,0,0 monster Gobline Xmas 1245,5,0,0,0
-gef_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild11.gat,0,0,0,0 monster Gobline Xmas 1245,5,0,0,0
-gef_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-
-glast_01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-glast_01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-
-mjolnir_01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-mjolnir_12.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-
-moc_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild12.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild13.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild13.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild14.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild14.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild15.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild15.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild16.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild16.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild17.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild17.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-moc_fild18.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-
-pay_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-pay_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-pay_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-
-prt_fild00.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild00.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-prt_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-prt_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
-gef_fild12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild13.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-gef_fild14.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-
-cmd_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
-cmd_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+//===== eAthena Script =======================================
+//= X-mas Event
+//===== By: ==================================================
+//=
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//=
+//===== 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 Claus npc.
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+xmas_in.gat,100,96,4 script Father Christmas::Santa2 718,{
+ mes "[Santa Claus]";
+ 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 children's 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 into another place when";
+ mes "you attack him each time.";
+ 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 children's 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;
+ mes "Seems you've been doing a";
+ mes "good job of taking down those";
+ mes "fake Santas. Keep it up!";
+ next;
+ delitem 7034,3;
+ getitem 644,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";
+ mes "reward you.";
+ close;
+ M_End:
+ mes "[Santa Claus]";
+ mes "I see. Well, at the very least";
+ mes "we shall meet again on Chirstmas morning.";
+ close;
+
+OnInit:
+ disablenpc "Santa1";
+ end;
+}
+
+
+//========================================================
+// X-mas Mobs
+//========================================================
+gef_fild00.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild00.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild02.gat,0,0,0,0 monster Gobline Xmas 1245,5,0,0,0
+gef_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild11.gat,0,0,0,0 monster Gobline Xmas 1245,5,0,0,0
+gef_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+
+glast_01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+glast_01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+
+mjolnir_01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+mjolnir_12.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+
+moc_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild12.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild13.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild13.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild14.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild14.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild15.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild15.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild16.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild16.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild17.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild17.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+moc_fild18.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+
+pay_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+pay_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+pay_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+
+prt_fild00.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild00.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild01.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild02.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild03.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild04.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild05.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild06.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild07.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild08.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild09.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild10.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild10.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+prt_fild11.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+prt_fild11.gat,0,0,0,0 monster Santa Poring 1062,35,0,0,0
+gef_fild12.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild13.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+gef_fild14.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+
+cmd_fild01.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild02.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild03.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild06.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild07.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
+cmd_fild09.gat,0,0,0,0 monster Antonio 1062,5,0,0,0
diff --git a/npc/guides/guides_alb.txt b/npc/guides/guides_alb.txt
index 53ad0530a..5840dda88 100644
--- a/npc/guides/guides_alb.txt
+++ b/npc/guides/guides_alb.txt
@@ -1,109 +1,109 @@
-//===== eAthena Script =======================================
-//= Alberta Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Now using duplicate command.
-//============================================================
-
-
-
-
-// North --------------------------------------------------------
-alberta.gat,23,238,4 script Guide#1::Guide 105,{
- cutin "prt_soldier",2;
- mes "[Alberta Soldier]";
- mes "Welcome to Alberta, the Port Town.";
- next;
- mes "[Alberta Soldier]";
- mes "We are here to help you find your way. Please feel free to speak to us anytime.";
- mes "Oh, and if you're a newbie you should read the notice first.";
-M_Menu:
- next;
- menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Alberta Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- set @COMPASS_CHECK,0;
- goto L_Cont;
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Alberta Soldier]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "^FF0000Merchant Guild^000000",sM_2a,"Armory",sM_2b,"Item Shop",sM_2c,"Inn",sM_2d, "Wipe all indications from mini-map.",sM_2e, "Cancel",M_End;
-
- sM_2a:
- mes "[Alberta Soldier]";
- mes "The 'Merchant Guild' is located in the SouthWestern part of town. The Merchant Guild is the place to go to become a merchant.";
- viewpoint 1,33,41,1,0xFF0000;
- goto sL_Wipe;
- sM_2b:
- mes "[Alberta Soldier]";
- mes "The 'Armory' is located in the Southern part of town. Go there to buy weapons and armor.";
- viewpoint 1,148,57,2,0x6666FF;
- goto sL_Wipe;
- sM_2c:
- mes "[Alberta Soldier]";
- mes "The 'Item Shop' is located in the Centre of town.";
- viewpoint 1,98,154,3,0xFF00FF;
- goto sL_Wipe;
- sM_2d:
- mes "[Alberta Soldier]";
- mes "There are 2 'Inns' located in the Northern and Southern parts of town. Go there if you need to rest.";
- viewpoint 1,65,233,4,0xF5AD05;
- viewpoint 1,136,38,5,0xF5AD05;
- goto sL_Wipe;
- sM_2e:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next;
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,33,41,1,0xFF0000;
- viewpoint 2,148,57,2,0x6666FF;
- viewpoint 2,98,154,3,0xFF00FF;
- viewpoint 2,65,233,4,0xF5AD05;
- viewpoint 2,136,38,5,0xF5AD05;
- if(@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Alberta Soldier]";
- mes "All indications have been removed";
- cutin "prt_soldier",255;
- close;
-
- M_2:
- mes "[Alberta Soldier]";
- mes "We upgraded the Location Guide to the newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Alberta Soldier]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Alberta 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 "[Alberta Soldier]";
- mes "Ta Ta.";
- cutin "prt_soldier",255;
- close;
-}
-
-// South --------------------------------------------------------
-alberta.gat,120,60,3 duplicate(Guide) Guide#2 105
+//===== eAthena Script =======================================
+//= Alberta Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Now using duplicate command.
+//============================================================
+
+
+
+
+// North --------------------------------------------------------
+alberta.gat,23,238,4 script Guide#1::Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Alberta Soldier]";
+ mes "Welcome to Alberta, the Port Town.";
+ next;
+ mes "[Alberta Soldier]";
+ mes "We are here to help you find your way. Please feel free to speak to us anytime.";
+ mes "Oh, and if you're a newbie you should read the notice first.";
+M_Menu:
+ next;
+ menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Alberta Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Alberta Soldier]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "^FF0000Merchant Guild^000000",sM_2a,"Armory",sM_2b,"Item Shop",sM_2c,"Inn",sM_2d, "Wipe all indications from mini-map.",sM_2e, "Cancel",M_End;
+
+ sM_2a:
+ mes "[Alberta Soldier]";
+ mes "The 'Merchant Guild' is located in the SouthWestern part of town. The Merchant Guild is the place to go to become a merchant.";
+ viewpoint 1,33,41,1,0xFF0000;
+ goto sL_Wipe;
+ sM_2b:
+ mes "[Alberta Soldier]";
+ mes "The 'Armory' is located in the Southern part of town. Go there to buy weapons and armor.";
+ viewpoint 1,148,57,2,0x6666FF;
+ goto sL_Wipe;
+ sM_2c:
+ mes "[Alberta Soldier]";
+ mes "The 'Item Shop' is located in the Centre of town.";
+ viewpoint 1,98,154,3,0xFF00FF;
+ goto sL_Wipe;
+ sM_2d:
+ mes "[Alberta Soldier]";
+ mes "There are 2 'Inns' located in the Northern and Southern parts of town. Go there if you need to rest.";
+ viewpoint 1,65,233,4,0xF5AD05;
+ viewpoint 1,136,38,5,0xF5AD05;
+ goto sL_Wipe;
+ sM_2e:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next;
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,33,41,1,0xFF0000;
+ viewpoint 2,148,57,2,0x6666FF;
+ viewpoint 2,98,154,3,0xFF00FF;
+ viewpoint 2,65,233,4,0xF5AD05;
+ viewpoint 2,136,38,5,0xF5AD05;
+ if(@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Alberta Soldier]";
+ mes "All indications have been removed";
+ cutin "prt_soldier",255;
+ close;
+
+ M_2:
+ mes "[Alberta Soldier]";
+ mes "We upgraded the Location Guide to the newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Alberta Soldier]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Alberta 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 "[Alberta Soldier]";
+ mes "Ta Ta.";
+ cutin "prt_soldier",255;
+ close;
+}
+
+// South --------------------------------------------------------
+alberta.gat,120,60,3 duplicate(Guide) Guide#2 105
diff --git a/npc/guides/guides_alde.txt b/npc/guides/guides_alde.txt
index 3443f9c2a..63af44078 100644
--- a/npc/guides/guides_alde.txt
+++ b/npc/guides/guides_alde.txt
@@ -1,116 +1,116 @@
-//===== eAthena Script =======================================
-//= Al De Baran Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Corrected building locations and descriptions
-//============================================================
-
-
-
-
-aldebaran.gat,139,63,4 script Soldier 105,{
- cutin "prt_soldier",2;
- mes "[Al De Baran Guard]";
- mes "Welcome to Al De Baran, the home of the lovely Kafras!";
- next;
- mes "[Al De Baran Guard]";
- mes "We are here to help you find your way. Please feel free to speak to us anytime.";
-M_Menu:
- next;
- menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Al De Baran Guard]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Al De Baran Guard]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "^FF0000Kafra Main Office^000000",sM_2a, "Armory",sM_2b, "Item Shop",sM_2c, "Pub",sM_2d,
- "^00AAFFSorcerer Guild (Closed)^000000",sM_2e, "^DDAA00Chemical Academy^000000",sM_2f,
- "Wipe all indications from mini-map",sM_2g, "Cancel", M_End;
-
- sM_2a:
- mes "[Al De Baran Guard]";
- mes "The 'Kafra Main Office' is the place where you can redeem your special researve points.";
- viewpoint 1,56,225,1,0xFF0000;
- goto sL_Wipe;
- sM_2b:
- mes "[Al De Baran Guard]";
- mes "Go to the 'Armory' to buy weapons and armor.";
- viewpoint 1,72,194,2,0x0000FF;
- goto sL_Wipe;
- sM_2c:
- mes "[Al De Baran Guard]";
- mes "The 'Item Shop' has all sort of usefull tools for you to buy.";
- viewpoint 1,197,68,3,0x00FF00;
- goto sL_Wipe;
- sM_2d:
- mes "[Al De Baran Guard]";
- mes "Stop by the 'Pub' to relax and have a drink.";
- viewpoint 1,231,107,4,0xFF00FF;
- goto sL_Wipe;
- sM_2e:
- mes "[Al De Baran Guard]";
- mes "The 'Sorcerer Guild' is closed right now.";
- //viewpoint 1,48,198,5,0x00AAFF;
- goto sL_Wipe;
- sM_2f:
- mes "[Al De Baran Guard]";
- mes "The ^DDAA00'Chemical Academy'^000000 is where Merchants go to become Alchemists.";
- viewpoint 1,58,61,6,0xDDAA00;
- goto sL_Wipe;
- sM_2g:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next;
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- viewpoint 2,56,225,1,0xFF0000;
- viewpoint 2,72,194,2,0x0000FF;
- viewpoint 2,197,68,3,0x00FF00;
- viewpoint 2,231,107,4,0xFF00FF;
- viewpoint 2,48,198,5,0x00AAFF;
- viewpoint 2,58,61,6,0xDDAA00;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Al De Baran Guard]";
- mes "All indications have been removed";
- cutin "prt_soldier",255;
- close;
-
- M_2:
- mes "[Al De Baran Guard]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Al De Baran Guard]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Al De Baran Guard]";
- 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 "[Al De Baran Guard]";
- mes "Good day.";
- cutin "prt_soldier",255;
- close;
-}
+//===== eAthena Script =======================================
+//= Al De Baran Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Corrected building locations and descriptions
+//============================================================
+
+
+
+
+aldebaran.gat,139,63,4 script Soldier 105,{
+ cutin "prt_soldier",2;
+ mes "[Al De Baran Guard]";
+ mes "Welcome to Al De Baran, the home of the lovely Kafras!";
+ next;
+ mes "[Al De Baran Guard]";
+ mes "We are here to help you find your way. Please feel free to speak to us anytime.";
+M_Menu:
+ next;
+ menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Al De Baran Guard]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Al De Baran Guard]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "^FF0000Kafra Main Office^000000",sM_2a, "Armory",sM_2b, "Item Shop",sM_2c, "Pub",sM_2d,
+ "^00AAFFSorcerer Guild (Closed)^000000",sM_2e, "^DDAA00Chemical Academy^000000",sM_2f,
+ "Wipe all indications from mini-map",sM_2g, "Cancel", M_End;
+
+ sM_2a:
+ mes "[Al De Baran Guard]";
+ mes "The 'Kafra Main Office' is the place where you can redeem your special researve points.";
+ viewpoint 1,56,225,1,0xFF0000;
+ goto sL_Wipe;
+ sM_2b:
+ mes "[Al De Baran Guard]";
+ mes "Go to the 'Armory' to buy weapons and armor.";
+ viewpoint 1,72,194,2,0x0000FF;
+ goto sL_Wipe;
+ sM_2c:
+ mes "[Al De Baran Guard]";
+ mes "The 'Item Shop' has all sort of usefull tools for you to buy.";
+ viewpoint 1,197,68,3,0x00FF00;
+ goto sL_Wipe;
+ sM_2d:
+ mes "[Al De Baran Guard]";
+ mes "Stop by the 'Pub' to relax and have a drink.";
+ viewpoint 1,231,107,4,0xFF00FF;
+ goto sL_Wipe;
+ sM_2e:
+ mes "[Al De Baran Guard]";
+ mes "The 'Sorcerer Guild' is closed right now.";
+ //viewpoint 1,48,198,5,0x00AAFF;
+ goto sL_Wipe;
+ sM_2f:
+ mes "[Al De Baran Guard]";
+ mes "The ^DDAA00'Chemical Academy'^000000 is where Merchants go to become Alchemists.";
+ viewpoint 1,58,61,6,0xDDAA00;
+ goto sL_Wipe;
+ sM_2g:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next;
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ viewpoint 2,56,225,1,0xFF0000;
+ viewpoint 2,72,194,2,0x0000FF;
+ viewpoint 2,197,68,3,0x00FF00;
+ viewpoint 2,231,107,4,0xFF00FF;
+ viewpoint 2,48,198,5,0x00AAFF;
+ viewpoint 2,58,61,6,0xDDAA00;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Al De Baran Guard]";
+ mes "All indications have been removed";
+ cutin "prt_soldier",255;
+ close;
+
+ M_2:
+ mes "[Al De Baran Guard]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Al De Baran Guard]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Al De Baran Guard]";
+ 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 "[Al De Baran Guard]";
+ mes "Good day.";
+ cutin "prt_soldier",255;
+ close;
+}
diff --git a/npc/guides/guides_com.txt b/npc/guides/guides_com.txt
index 033e11158..05a06d5a9 100644
--- a/npc/guides/guides_com.txt
+++ b/npc/guides/guides_com.txt
@@ -1,141 +1,141 @@
-//===== eAthena Script =======================================
-//= Comodo Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Now using duplicate command.
-//============================================================
-
-
-
-
-// East -------------------------------------------------------------------------------------
-comodo.gat,322,178,4 script Comodo Guide#1::Comodo_Guide 724,{
- mes "[Comodo Guide]";
- mes "The city of Dreams and Fantasy, where the night life continues 24 hours a day, we welcome you to the land of Comodo!";
- next;
- mes "[Comodo Guide]";
- mes "I know the area very well. If you need directions, ask me for asistance anytime.";
-M_Menu:
- next;
- menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Comodo Guide]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Comodo Guide]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- mes "[Comodo Guide]";
- menu "^FF8000Casino^000000",sM_1, "^34B4A0Hula dancing stage^000000",sM_2, "Weapons and Armor Shop",sM_3, "Tool store",sM_4,
- "Tourist Shop",sM_5, "^F1BE0EKafra Corp. Western Branch^000000",sM_6, "^FF5555Chief's House^000000",sM_7, "Pub",sM_8,
- "^00B200Camp Grounds^000000",sM_9, "Clear all indications from mini-map.",sM_10, "End Conversation",M_End;
-
- sM_1:
- mes "The heart of Comodo's night life!";
- mes "A heaven of rest for tired travelers!";
- mes "The Comodo Casino ~!";
- viewpoint 1,140,98,1,0xFF8000;
- goto sL_Wipe;
- sM_2:
- mes "Hula Hula - Hula Hula";
- next;
- mes "[Comodo Guide]";
- mes "When you become more comfortable performing on stage, you should consider changing your job to a '^FF0000Dancer^000000'.";
- viewpoint 1,188,168,2,0x34B4A0;
- goto sL_Wipe;
- sM_3:
- mes "Here in Comodo, you can find unique weapons and armor only found in this area.";
- viewpoint 1,266,70,3,0xFF00FF;
- goto sL_Wipe;
- sM_4:
- mes "Here in Comodo, you can find usefull items only found in this area.";
- mes "'Comodo Tool Store'";
- viewpoint 1,86,128,4,0xFF00FF;
- goto sL_Wipe;
- sM_5:
- mes "Here in Comodo, you can find unique gifts only found in this area.";
- mes "'Comodo Tourist Shop'";
- viewpoint 1,298,124,5,0x00FFFF;
- goto sL_Wipe;
- sM_6:
- mes "Kafra Corp.'s Western Branch center is located here in Comodo, offering you superior service.";
- viewpoint 1,136,202,6,0xF1BE0E;
- goto sL_Wipe;
- sM_7:
- mes "This is the house where the Chief of Comodo resides.";
- mes "If you are one who posseses a serious interest in Comodo, you can meet the Chief in person.";
- mes "I think that would be okay with him.";
- viewpoint 1,114,294,7,0xFF5555;
- goto sL_Wipe;
- sM_8:
- mes "The pub is a place where tourists from all over the world come to converse and exchange ideas.";
- viewpoint 1,166,298,8,0x6666FF;
- goto sL_Wipe;
- sM_9:
- mes "Freinds and family often come to the Comodo Camp Grounds for the mermorable experiences.";
- mes "It is also the place to experience Comodo's unique, ethinic BBQ!!";
- viewpoint 1,210,308,9,0x00B200;
- goto sL_Wipe;
- sM_10:
- 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,140,98,1,0xFF8000;
- viewpoint 2,188,168,2,0x34B4A0;
- viewpoint 2,266,70,3,0xFF00FF;
- viewpoint 2,86,128,4,0xFF00FF;
- viewpoint 2,298,124,5,0x00FFFF;
- viewpoint 2,136,202,6,0xF1BE0E;
- viewpoint 2,114,294,7,0xFF5555;
- viewpoint 2,166,298,8,0x6666FF;
- viewpoint 2,210,308,9,0x00B200;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "All indications have been removed";
- close;
-
- M_2:
- mes "[Comodo Guide]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Comodo Guide]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Comodo Guide]";
- 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 "[Comodo Guide]";
- mes "Because Comodo is located in a cave, there is absolutely no sunlight. It is dark 24 hours a day!";
- mes "The residents of Comodo are using this unusual circumstance to draw tourists to our area...";
- close;
-}
-
-// North ----------------------------------------------------------------------------------------
-comodo.gat,176,350,4 duplicate(Comodo_Guide) Comodo Guide#2 724
-// West -----------------------------------------------------------------------------------------
-comodo.gat,37,219,4 duplicate(Comodo_Guide) Comodo Guide#3 724
-
+//===== eAthena Script =======================================
+//= Comodo Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Now using duplicate command.
+//============================================================
+
+
+
+
+// East -------------------------------------------------------------------------------------
+comodo.gat,322,178,4 script Comodo Guide#1::Comodo_Guide 724,{
+ mes "[Comodo Guide]";
+ mes "The city of Dreams and Fantasy, where the night life continues 24 hours a day, we welcome you to the land of Comodo!";
+ next;
+ mes "[Comodo Guide]";
+ mes "I know the area very well. If you need directions, ask me for asistance anytime.";
+M_Menu:
+ next;
+ menu "View Buildings",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Comodo Guide]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Comodo Guide]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ mes "[Comodo Guide]";
+ menu "^FF8000Casino^000000",sM_1, "^34B4A0Hula dancing stage^000000",sM_2, "Weapons and Armor Shop",sM_3, "Tool store",sM_4,
+ "Tourist Shop",sM_5, "^F1BE0EKafra Corp. Western Branch^000000",sM_6, "^FF5555Chief's House^000000",sM_7, "Pub",sM_8,
+ "^00B200Camp Grounds^000000",sM_9, "Clear all indications from mini-map.",sM_10, "End Conversation",M_End;
+
+ sM_1:
+ mes "The heart of Comodo's night life!";
+ mes "A heaven of rest for tired travelers!";
+ mes "The Comodo Casino ~!";
+ viewpoint 1,140,98,1,0xFF8000;
+ goto sL_Wipe;
+ sM_2:
+ mes "Hula Hula - Hula Hula";
+ next;
+ mes "[Comodo Guide]";
+ mes "When you become more comfortable performing on stage, you should consider changing your job to a '^FF0000Dancer^000000'.";
+ viewpoint 1,188,168,2,0x34B4A0;
+ goto sL_Wipe;
+ sM_3:
+ mes "Here in Comodo, you can find unique weapons and armor only found in this area.";
+ viewpoint 1,266,70,3,0xFF00FF;
+ goto sL_Wipe;
+ sM_4:
+ mes "Here in Comodo, you can find usefull items only found in this area.";
+ mes "'Comodo Tool Store'";
+ viewpoint 1,86,128,4,0xFF00FF;
+ goto sL_Wipe;
+ sM_5:
+ mes "Here in Comodo, you can find unique gifts only found in this area.";
+ mes "'Comodo Tourist Shop'";
+ viewpoint 1,298,124,5,0x00FFFF;
+ goto sL_Wipe;
+ sM_6:
+ mes "Kafra Corp.'s Western Branch center is located here in Comodo, offering you superior service.";
+ viewpoint 1,136,202,6,0xF1BE0E;
+ goto sL_Wipe;
+ sM_7:
+ mes "This is the house where the Chief of Comodo resides.";
+ mes "If you are one who posseses a serious interest in Comodo, you can meet the Chief in person.";
+ mes "I think that would be okay with him.";
+ viewpoint 1,114,294,7,0xFF5555;
+ goto sL_Wipe;
+ sM_8:
+ mes "The pub is a place where tourists from all over the world come to converse and exchange ideas.";
+ viewpoint 1,166,298,8,0x6666FF;
+ goto sL_Wipe;
+ sM_9:
+ mes "Freinds and family often come to the Comodo Camp Grounds for the mermorable experiences.";
+ mes "It is also the place to experience Comodo's unique, ethinic BBQ!!";
+ viewpoint 1,210,308,9,0x00B200;
+ goto sL_Wipe;
+ sM_10:
+ 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,140,98,1,0xFF8000;
+ viewpoint 2,188,168,2,0x34B4A0;
+ viewpoint 2,266,70,3,0xFF00FF;
+ viewpoint 2,86,128,4,0xFF00FF;
+ viewpoint 2,298,124,5,0x00FFFF;
+ viewpoint 2,136,202,6,0xF1BE0E;
+ viewpoint 2,114,294,7,0xFF5555;
+ viewpoint 2,166,298,8,0x6666FF;
+ viewpoint 2,210,308,9,0x00B200;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "All indications have been removed";
+ close;
+
+ M_2:
+ mes "[Comodo Guide]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Comodo Guide]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Comodo Guide]";
+ 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 "[Comodo Guide]";
+ mes "Because Comodo is located in a cave, there is absolutely no sunlight. It is dark 24 hours a day!";
+ mes "The residents of Comodo are using this unusual circumstance to draw tourists to our area...";
+ close;
+}
+
+// North ----------------------------------------------------------------------------------------
+comodo.gat,176,350,4 duplicate(Comodo_Guide) Comodo Guide#2 724
+// West -----------------------------------------------------------------------------------------
+comodo.gat,37,219,4 duplicate(Comodo_Guide) Comodo Guide#3 724
+
diff --git a/npc/guides/guides_gef.txt b/npc/guides/guides_gef.txt
index f09cf781c..b2b49467c 100644
--- a/npc/guides/guides_gef.txt
+++ b/npc/guides/guides_gef.txt
@@ -1,135 +1,135 @@
-//===== eAthena Script =======================================
-//= Geffen Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. Added a guide at every exit.
-//= v1.1 Now using duplicate command.
-//============================================================
-
-
-
-
-
-
-
-// North --------------------------------------------
-geffen.gat,123,202,5 script Guide#1::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",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Geffen Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- 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",M_1_1, "^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;
-
- M_1_1:
- 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. It is where Merchants train to become Blacksmiths.";
- mes "You can also get your weapons and armor upgraded there.";
- 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(Guide) Guide#2 705
-// East -----------------------------------------------------
-geffen.gat,203,116,2 duplicate(Guide) Guide#3 705
-// West ----------------------------------------------
-geffen.gat,37,123,5 duplicate(Guide) Guide#4 705
+//===== eAthena Script =======================================
+//= Geffen Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. Added a guide at every exit.
+//= v1.1 Now using duplicate command.
+//============================================================
+
+
+
+
+
+
+
+// North --------------------------------------------
+geffen.gat,123,202,5 script Guide#1::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",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Geffen Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ 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",M_1_1, "^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;
+
+ M_1_1:
+ 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. It is where Merchants train to become Blacksmiths.";
+ mes "You can also get your weapons and armor upgraded there.";
+ 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(Guide) Guide#2 705
+// East -----------------------------------------------------
+geffen.gat,203,116,2 duplicate(Guide) Guide#3 705
+// West ----------------------------------------------
+geffen.gat,37,123,5 duplicate(Guide) Guide#4 705
diff --git a/npc/guides/guides_izl.txt b/npc/guides/guides_izl.txt
index dc66e834e..0f087a034 100644
--- a/npc/guides/guides_izl.txt
+++ b/npc/guides/guides_izl.txt
@@ -1,118 +1,118 @@
-//===== eAthena Script =======================================
-//= Izlude Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-
-
-// South ----------------------------------------
-izlude.gat,123,87,6 script Guide 105,{
- cutin "prt_soldier",2;
- mes "[Izlude Soldier]";
- mes "Welcome to Izlude, the satelite city of Prontera and home to the Swordsman Association!.";
- next;
- mes "[Izlude 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",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Izlude Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Izlude Soldier]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "^FF0000Swordsman Association^000000",M_1_1, "Swordsman Hall",M_1_2, "The Arena",M_1_3,
- "Izlude Marina",M_1_4, "Armory",M_1_5, "Item Shop",M_1_6, "Wipe all Indications on Mini-Map",M_1_7, "Cancel",M_End;
-
- M_1_1:
- mes "[Izlude Soldier]";
- mes "Do you want to be a Swordsman? Then head over to the Swordsman Association in the Western part of town.";
- viewpoint 1,52,140,1,0xFF0000;
- goto sL_Wipe;
- M_1_2:
- mes "[Izlude Soldier]";
- mes "Swordman Hall, the official Training Center of the Swordsman Assosiation, is located in the Eastern part of town.";
- viewpoint 1,214,130,2,0x00FF00;
- goto sL_Wipe;
- M_1_3:
- mes "[Izlude Soldier]";
- mes "The 'Arena' is a popular place for young warriors to train. Just head north and you'll find it.";
- mes "You can have fun there, you know.";
- viewpoint 1,128,225,3,0x00FF00;
- goto sL_Wipe;
- M_1_4:
- mes "[Izlude Soldier]";
- mes "The beautifull Marina is where you should go if you would like to take a ship to 'Alberta' or 'Byalan Island'. It is in the Northeastern part of town.";
- viewpoint 1,200,180,4,0xFF0000;
- goto sL_Wipe;
- M_1_5:
- mes "[Izlude Soldier]";
- mes "The Armory is located NorthWest of the Center Food Court.";
- viewpoint 1,111,149,5,0xFF00FF;
- goto sL_Wipe;
- M_1_6:
- mes "[Izlude Soldier]";
- mes "The Item Shop is located NorthEast of the Center Food Court.";
- viewpoint 1,148,148,6,0xFF00FF;
- goto sL_Wipe;
- M_1_7:
- set @COMPASS_CHECK, 2;
-
- sL_Wipe:
- if(@COMPASS_CHECK != 2) next;
- if(@COMPASS_CHECK == 1) goto sM_Menu;
- 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;
- if(@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Izlude Soldier]";
- mes "All indications have been removed";
- cutin "prt_soldier",255;
- close;
-
- M_2:
- mes "[Izlude Soldier]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Izlude Soldier]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Izlude 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 "[Izlude Soldier]";
- mes "Try not to get lost.";
- cutin "prt_soldier",255;
- close;
-}
+//===== eAthena Script =======================================
+//= Izlude Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+
+
+// South ----------------------------------------
+izlude.gat,123,87,6 script Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Izlude Soldier]";
+ mes "Welcome to Izlude, the satelite city of Prontera and home to the Swordsman Association!.";
+ next;
+ mes "[Izlude 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",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Izlude Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Izlude Soldier]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "^FF0000Swordsman Association^000000",M_1_1, "Swordsman Hall",M_1_2, "The Arena",M_1_3,
+ "Izlude Marina",M_1_4, "Armory",M_1_5, "Item Shop",M_1_6, "Wipe all Indications on Mini-Map",M_1_7, "Cancel",M_End;
+
+ M_1_1:
+ mes "[Izlude Soldier]";
+ mes "Do you want to be a Swordsman? Then head over to the Swordsman Association in the Western part of town.";
+ viewpoint 1,52,140,1,0xFF0000;
+ goto sL_Wipe;
+ M_1_2:
+ mes "[Izlude Soldier]";
+ mes "Swordman Hall, the official Training Center of the Swordsman Assosiation, is located in the Eastern part of town.";
+ viewpoint 1,214,130,2,0x00FF00;
+ goto sL_Wipe;
+ M_1_3:
+ mes "[Izlude Soldier]";
+ mes "The 'Arena' is a popular place for young warriors to train. Just head north and you'll find it.";
+ mes "You can have fun there, you know.";
+ viewpoint 1,128,225,3,0x00FF00;
+ goto sL_Wipe;
+ M_1_4:
+ mes "[Izlude Soldier]";
+ mes "The beautifull Marina is where you should go if you would like to take a ship to 'Alberta' or 'Byalan Island'. It is in the Northeastern part of town.";
+ viewpoint 1,200,180,4,0xFF0000;
+ goto sL_Wipe;
+ M_1_5:
+ mes "[Izlude Soldier]";
+ mes "The Armory is located NorthWest of the Center Food Court.";
+ viewpoint 1,111,149,5,0xFF00FF;
+ goto sL_Wipe;
+ M_1_6:
+ mes "[Izlude Soldier]";
+ mes "The Item Shop is located NorthEast of the Center Food Court.";
+ viewpoint 1,148,148,6,0xFF00FF;
+ goto sL_Wipe;
+ M_1_7:
+ set @COMPASS_CHECK, 2;
+
+ sL_Wipe:
+ if(@COMPASS_CHECK != 2) next;
+ if(@COMPASS_CHECK == 1) goto sM_Menu;
+ 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;
+ if(@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Izlude Soldier]";
+ mes "All indications have been removed";
+ cutin "prt_soldier",255;
+ close;
+
+ M_2:
+ mes "[Izlude Soldier]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Izlude Soldier]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Izlude 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 "[Izlude Soldier]";
+ mes "Try not to get lost.";
+ cutin "prt_soldier",255;
+ close;
+}
diff --git a/npc/guides/guides_mor.txt b/npc/guides/guides_mor.txt
index 17f47e89b..e2269d962 100644
--- a/npc/guides/guides_mor.txt
+++ b/npc/guides/guides_mor.txt
@@ -1,121 +1,121 @@
-//===== eAthena Script =======================================
-//= Morroc Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. Added a guide at every exit.
-//= v1.1 Now using duplicate command.
-//============================================================
-
-
-
-
-
-// North ------------------------------------------------
-morocc.gat,153,286,6 script Guide#1::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",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Morroc Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- 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",M_1_1, "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;
-
- M_1_1:
- 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(Guide) Guide#2 707
-// West --------------------------------------------
-morocc.gat,28,161,6 duplicate(Guide) Guide#3 707
-// East --------------------------------------------
-morocc.gat,294,203,9 duplicate(Guide) Guide#4 707
+//===== eAthena Script =======================================
+//= Morroc Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. Added a guide at every exit.
+//= v1.1 Now using duplicate command.
+//============================================================
+
+
+
+
+
+// North ------------------------------------------------
+morocc.gat,153,286,6 script Guide#1::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",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Morroc Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ 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",M_1_1, "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;
+
+ M_1_1:
+ 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(Guide) Guide#2 707
+// West --------------------------------------------
+morocc.gat,28,161,6 duplicate(Guide) Guide#3 707
+// East --------------------------------------------
+morocc.gat,294,203,9 duplicate(Guide) Guide#4 707
diff --git a/npc/guides/guides_nif.txt b/npc/guides/guides_nif.txt
index cf382e95a..7431a3f27 100644
--- a/npc/guides/guides_nif.txt
+++ b/npc/guides/guides_nif.txt
@@ -1,82 +1,82 @@
-//===== eAthena Script =======================================
-//= Niflheim Guide
-//===== By: ==================================================
-//=
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 Fixed location command format [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",M_Magic,"Equipment Shop",M_item,"Weapon Shop",M_weapon,"Inn",M_hotel,"Cancel",L_cancel;
-
- M_Magic:
- 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: ==================================================
+//=
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 Fixed location command format [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",M_Magic,"Equipment Shop",M_item,"Weapon Shop",M_weapon,"Inn",M_hotel,"Cancel",L_cancel;
+
+ M_Magic:
+ 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_pron.txt b/npc/guides/guides_pron.txt
index 67458d4e1..d228d0cdb 100644
--- a/npc/guides/guides_pron.txt
+++ b/npc/guides/guides_pron.txt
@@ -1,206 +1,206 @@
-//===== eAthena Script =======================================
-//= Prontera Guides
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= v1.1 Now using duplicate command.
-//============================================================
-
-
-
-
-
-// Center ---------------------------------------------------------
-prontera.gat,154,187,4 script Guide#1::Guide 105,{
- cutin "prt_soldier",2;
- mes "[Prontera Soldier]";
- mes "Welcome to Prontera, the capital city of Rune-Midgard Kingdom.";
- next;
- mes "[Prontera 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",M_1, "Notice",M_2, "Cancel",M_End;
-
- M_1:
- mes "[Prontera Soldier]";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "No Thanks",sM_1a,"Yes Please",sM_1b;
-
- sM_1a:
- set @COMPASS_CHECK,0;
- goto L_Cont;
-
- sM_1b:
- set @COMPASS_CHECK,1;
-
- L_Cont:
- mes "[Prontera Soldier]";
- mes "Please choose a building to view.";
- next;
- sM_Menu:
- menu "Swordman Asosiation",M_1_1, "^9999F5Sanctuary^000000",M_1_2, "^ff0000Prontera Chivalry^000000",M_1_3, "Armory",M_1_4,
- "Item Shop",M_1_5, "Inn",M_1_6, "Trading Post",M_1_7, "Pub",M_1_8, "^FF8800Library^000000",M_1_9, "Job Agency",M_1_10,
- "^AABBCCCastle of Prontera^000000",M_1_11, "City Hall",M_1_12, "Forge Workshop",M_1_13,
- "Wipe all indications from mini-map.",M_1_14, "Cancel",M_End;
-
- M_1_1:
- mes "[Prontera Soldier]";
- mes "The 'Swordman Assosiation' has moved to Izlude, the Sattelite of Prontera. That building is now empty";
- viewpoint 1,237,41,1,0x2222AA;
- goto sL_Wipe;
- M_1_2:
- mes "[Prontera Soldier]";
- mes "The main Church of the Rune-Midgard Kingdom, the `Santuary', is located in the Northeast part of town.";
- mes "This is where you go to pray or serve the church as an Acolyte.";
- viewpoint 1,236,316,2,0xAAAAF5;
- goto sL_Wipe;
- M_1_3:
- mes "[Prontera Soldier]";
- mes "The 'Prontera Chivalry' trains Knights and serves as Prontera's protectors. It is located in the Northwest part of town.";
- viewpoint 1,46,345,3,0xFF0000;
- goto sL_Wipe;
- M_1_4:
- mes "[Prontera Soldier]";
- mes "The 'Armory' has an excellent selection of weapons and armor.";
- viewpoint 1,175,220,4,0xFF00FF;
- goto sL_Wipe;
- M_1_5:
- mes "[Prontera Soldier]";
- mes "You can find many usefull things at the 'Item Shop'.";
- viewpoint 1,134,221,5,0xFF00FF;
- goto sL_Wipe;
- M_1_6:
- mes "[Prontera Soldier]";
- mes "There are 2 'Inn's' located on the far Western and Eastern sides of town.";
- viewpoint 1,204,195,6,0x00DD55;
- viewpoint 1,107,212,7,0x00DD55;
- goto sL_Wipe;
- M_1_7:
- mes "[Prontera Soldier]";
- mes "The 'Trading Post' is located Southeast of the Fountain.";
- viewpoint 1,179,184,8,0x7901AD;
- goto sL_Wipe;
- M_1_8:
- mes "[Prontera Soldier]";
- mes "The 'Pub' is Prontera's hot spot.";
- viewpoint 1,208,154,9,0xAA0077;
- goto sL_Wipe;
- M_1_9:
- mes "[Prontera Soldier]";
- mes "The 'Library' houses a vast amount of information on the monsters of Rune-Midgard. There are 2 Buildings that make up the 'Library'.";
- viewpoint 1,120,267,10,0xFF8800;
- viewpoint 1,192,267,11,0xFF8800;
- goto sL_Wipe;
- M_1_10:
- mes "[Prontera Soldier]";
- mes "The 'Job Agency' is located SouthWest of the Fountain.";
- viewpoint 1,133,183,12,0x4444FF;
- goto sL_Wipe;
- M_1_11:
- mes "[Prontera Soldier]";
- mes "The 'Castle Of Prontera' is located in the Northern most part of the city.";
- mes "On the other side of the Castle is North Prontera Field.";
- viewpoint 1,156,360,13,0xAABBCC;
- goto sL_Wipe;
- M_1_12:
- mes "[Prontera Soldier]";
- mes "'City Hall' is located in the SouthWest corner of town.";
- viewpoint 1,75,91,14,0xAAEE00;
- goto sL_Wipe;
-
- M_1_13:
- mes "[Prontera Soldier]";
- mes "The 'Forge Workshop' is where you can refine your weapons and armor.";
- viewpoint 1,180,183,15,0xFF4477;
- goto sL_Wipe;
- M_1_14:
- 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,237,41,1,0x2222AA;
- viewpoint 2,236,316,2,0xAAAAF5;
- viewpoint 2,46,345,3,0xFF0000;
- viewpoint 2,175,220,4,0xFF00FF;
- viewpoint 2,134,221,5,0xFF00FF;
- viewpoint 2,204,195,6,0x00DD55;
- viewpoint 2,107,212,7,0x00DD55;
- viewpoint 2,179,184,8,0x7901AD;
- viewpoint 2,208,154,9,0xAA0077;
- viewpoint 2,120,267,10,0xFF8800;
- viewpoint 2,192,267,11,0xFF8800;
- viewpoint 2,133,183,12,0x4444FF;
- viewpoint 2,156,360,13,0xAABBCC;
- viewpoint 2,75,91,14,0xAAEE00;
- viewpoint 2,180,183,15,0xFF4477;
- if (@COMPASS_CHECK == 0) goto sM_Menu;
- mes "[Prontera Soldier]";
- mes "All indications have been removed";
- cutin "prt_soldier",255;
- close;
-
- M_2:
- mes "[Prontera Soldier]";
- mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
- next;
- mes "[Prontera Soldier]";
- mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
- next;
- mes "[Prontera 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 "[Prontera Soldier]";
- mes "Have a nice day.";
- cutin "prt_soldier",255;
- close;
-}
-
-// East ----------------------------------------------------
-prontera.gat,282,208,2 duplicate(Guide) Guide#2 105
-//West --------------------------------------------------
-prontera.gat,29,200,6 duplicate(Guide) Guide#3 105
-// South -----------------------------------------------------
-prontera.gat,160,29,0 duplicate(Guide) Guide#4 105
-// North -----------------------------------------------
-prontera.gat,151,330,4 duplicate(Guide) Guide#5 105
-
-
-// Guard -----------------------------------------------------
-prontera.gat,160,330,4 script Guard#1::Guard 105,{
- mes "Welcome to Prontera.";
- close;
-}
-
-prontera.gat,223,99,1 duplicate(Guard) Guard#2 105
-prontera.gat,229,104,1 duplicate(Guard) Guard#3 105
-prontera.gat,47,339,5 duplicate(Guard) Guard#4 105
-prontera.gat,52,344,5 duplicate(Guard) Guard#5 105
-
-
-//---------------------------------------------------------------------------------------- Prontera Maze ----------------------------------------------------------------------------------\\
-prt_maze02.gat,100,69,4 script Soldier 105,{
- mes "[Soldier]";
- mes "Yo yo, you'd be better not to go in there. It has rumored there is a Demon living in the forest.";
- mes "Of course it is just a rumor because no one see the people turning back from the palce.";
- mes "hmmm... it's up to you to go in or leave.";
- close;
-}
-prt_maze02.gat,110,69,4 script Soldier 105,{
- mes "[Soldier]";
- mes "Sigh... the last guy entered this place haven't come back either. He didn't listen to me and went in to gather herbs or something like that...";
- mes "He was a really stupid, if I were him, I wouldn't give up my life just for those lame herbs or something.";
- close;
-}
+//===== eAthena Script =======================================
+//= Prontera Guides
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= v1.1 Now using duplicate command.
+//============================================================
+
+
+
+
+
+// Center ---------------------------------------------------------
+prontera.gat,154,187,4 script Guide#1::Guide 105,{
+ cutin "prt_soldier",2;
+ mes "[Prontera Soldier]";
+ mes "Welcome to Prontera, the capital city of Rune-Midgard Kingdom.";
+ next;
+ mes "[Prontera 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",M_1, "Notice",M_2, "Cancel",M_End;
+
+ M_1:
+ mes "[Prontera Soldier]";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "No Thanks",sM_1a,"Yes Please",sM_1b;
+
+ sM_1a:
+ set @COMPASS_CHECK,0;
+ goto L_Cont;
+
+ sM_1b:
+ set @COMPASS_CHECK,1;
+
+ L_Cont:
+ mes "[Prontera Soldier]";
+ mes "Please choose a building to view.";
+ next;
+ sM_Menu:
+ menu "Swordman Asosiation",M_1_1, "^9999F5Sanctuary^000000",M_1_2, "^ff0000Prontera Chivalry^000000",M_1_3, "Armory",M_1_4,
+ "Item Shop",M_1_5, "Inn",M_1_6, "Trading Post",M_1_7, "Pub",M_1_8, "^FF8800Library^000000",M_1_9, "Job Agency",M_1_10,
+ "^AABBCCCastle of Prontera^000000",M_1_11, "City Hall",M_1_12, "Forge Workshop",M_1_13,
+ "Wipe all indications from mini-map.",M_1_14, "Cancel",M_End;
+
+ M_1_1:
+ mes "[Prontera Soldier]";
+ mes "The 'Swordman Assosiation' has moved to Izlude, the Sattelite of Prontera. That building is now empty";
+ viewpoint 1,237,41,1,0x2222AA;
+ goto sL_Wipe;
+ M_1_2:
+ mes "[Prontera Soldier]";
+ mes "The main Church of the Rune-Midgard Kingdom, the `Santuary', is located in the Northeast part of town.";
+ mes "This is where you go to pray or serve the church as an Acolyte.";
+ viewpoint 1,236,316,2,0xAAAAF5;
+ goto sL_Wipe;
+ M_1_3:
+ mes "[Prontera Soldier]";
+ mes "The 'Prontera Chivalry' trains Knights and serves as Prontera's protectors. It is located in the Northwest part of town.";
+ viewpoint 1,46,345,3,0xFF0000;
+ goto sL_Wipe;
+ M_1_4:
+ mes "[Prontera Soldier]";
+ mes "The 'Armory' has an excellent selection of weapons and armor.";
+ viewpoint 1,175,220,4,0xFF00FF;
+ goto sL_Wipe;
+ M_1_5:
+ mes "[Prontera Soldier]";
+ mes "You can find many usefull things at the 'Item Shop'.";
+ viewpoint 1,134,221,5,0xFF00FF;
+ goto sL_Wipe;
+ M_1_6:
+ mes "[Prontera Soldier]";
+ mes "There are 2 'Inn's' located on the far Western and Eastern sides of town.";
+ viewpoint 1,204,195,6,0x00DD55;
+ viewpoint 1,107,212,7,0x00DD55;
+ goto sL_Wipe;
+ M_1_7:
+ mes "[Prontera Soldier]";
+ mes "The 'Trading Post' is located Southeast of the Fountain.";
+ viewpoint 1,179,184,8,0x7901AD;
+ goto sL_Wipe;
+ M_1_8:
+ mes "[Prontera Soldier]";
+ mes "The 'Pub' is Prontera's hot spot.";
+ viewpoint 1,208,154,9,0xAA0077;
+ goto sL_Wipe;
+ M_1_9:
+ mes "[Prontera Soldier]";
+ mes "The 'Library' houses a vast amount of information on the monsters of Rune-Midgard. There are 2 Buildings that make up the 'Library'.";
+ viewpoint 1,120,267,10,0xFF8800;
+ viewpoint 1,192,267,11,0xFF8800;
+ goto sL_Wipe;
+ M_1_10:
+ mes "[Prontera Soldier]";
+ mes "The 'Job Agency' is located SouthWest of the Fountain.";
+ viewpoint 1,133,183,12,0x4444FF;
+ goto sL_Wipe;
+ M_1_11:
+ mes "[Prontera Soldier]";
+ mes "The 'Castle Of Prontera' is located in the Northern most part of the city.";
+ mes "On the other side of the Castle is North Prontera Field.";
+ viewpoint 1,156,360,13,0xAABBCC;
+ goto sL_Wipe;
+ M_1_12:
+ mes "[Prontera Soldier]";
+ mes "'City Hall' is located in the SouthWest corner of town.";
+ viewpoint 1,75,91,14,0xAAEE00;
+ goto sL_Wipe;
+
+ M_1_13:
+ mes "[Prontera Soldier]";
+ mes "The 'Forge Workshop' is where you can refine your weapons and armor.";
+ viewpoint 1,180,183,15,0xFF4477;
+ goto sL_Wipe;
+ M_1_14:
+ 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,237,41,1,0x2222AA;
+ viewpoint 2,236,316,2,0xAAAAF5;
+ viewpoint 2,46,345,3,0xFF0000;
+ viewpoint 2,175,220,4,0xFF00FF;
+ viewpoint 2,134,221,5,0xFF00FF;
+ viewpoint 2,204,195,6,0x00DD55;
+ viewpoint 2,107,212,7,0x00DD55;
+ viewpoint 2,179,184,8,0x7901AD;
+ viewpoint 2,208,154,9,0xAA0077;
+ viewpoint 2,120,267,10,0xFF8800;
+ viewpoint 2,192,267,11,0xFF8800;
+ viewpoint 2,133,183,12,0x4444FF;
+ viewpoint 2,156,360,13,0xAABBCC;
+ viewpoint 2,75,91,14,0xAAEE00;
+ viewpoint 2,180,183,15,0xFF4477;
+ if (@COMPASS_CHECK == 0) goto sM_Menu;
+ mes "[Prontera Soldier]";
+ mes "All indications have been removed";
+ cutin "prt_soldier",255;
+ close;
+
+ M_2:
+ mes "[Prontera Soldier]";
+ mes "We upgraded the Location Guide to the Newest Digital Style. We hope you like this gorgeous new system.";
+ next;
+ mes "[Prontera Soldier]";
+ mes "Don't forget to refer to the Mini-Map on the Upper-Right corner of your screen.";
+ next;
+ mes "[Prontera 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 "[Prontera Soldier]";
+ mes "Have a nice day.";
+ cutin "prt_soldier",255;
+ close;
+}
+
+// East ----------------------------------------------------
+prontera.gat,282,208,2 duplicate(Guide) Guide#2 105
+//West --------------------------------------------------
+prontera.gat,29,200,6 duplicate(Guide) Guide#3 105
+// South -----------------------------------------------------
+prontera.gat,160,29,0 duplicate(Guide) Guide#4 105
+// North -----------------------------------------------
+prontera.gat,151,330,4 duplicate(Guide) Guide#5 105
+
+
+// Guard -----------------------------------------------------
+prontera.gat,160,330,4 script Guard#1::Guard 105,{
+ mes "Welcome to Prontera.";
+ close;
+}
+
+prontera.gat,223,99,1 duplicate(Guard) Guard#2 105
+prontera.gat,229,104,1 duplicate(Guard) Guard#3 105
+prontera.gat,47,339,5 duplicate(Guard) Guard#4 105
+prontera.gat,52,344,5 duplicate(Guard) Guard#5 105
+
+
+//---------------------------------------------------------------------------------------- Prontera Maze ----------------------------------------------------------------------------------\\
+prt_maze02.gat,100,69,4 script Soldier 105,{
+ mes "[Soldier]";
+ mes "Yo yo, you'd be better not to go in there. It has rumored there is a Demon living in the forest.";
+ mes "Of course it is just a rumor because no one see the people turning back from the palce.";
+ mes "hmmm... it's up to you to go in or leave.";
+ close;
+}
+prt_maze02.gat,110,69,4 script Soldier 105,{
+ mes "[Soldier]";
+ mes "Sigh... the last guy entered this place haven't come back either. He didn't listen to me and went in to gather herbs or something like that...";
+ mes "He was a really stupid, if I were him, I wouldn't give up my life just for those lame herbs or something.";
+ close;
+}
diff --git a/npc/guides/guides_umb.txt b/npc/guides/guides_umb.txt
index 95f303f18..3b85760a3 100644
--- a/npc/guides/guides_umb.txt
+++ b/npc/guides/guides_umb.txt
@@ -1,107 +1,107 @@
-//===== eAthena Script =======================================
-//= Umbala Guides
-//===== By: ==================================================
-//= Dizzy
-//= Translated by Celest
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 1.1 Fixed location command format [Lupus]
-//============================================================
-
-
-//=====================================================================================
-//umbala.gat,174,147,5 script Umbalian Guide 789,{
-// mes "[Umbalian Guide]";
-// mes "-Under Development-";
-// close;
-//}
-
-// Umbala tour guide
-//===========================================================================
-umbala.gat,128,94,3 script Ricard 702,{
- mes "[Ricard]";
- mes "This sure is an odd place,";
- mes "perhaps due to the fact that it hasn't been developed,";
- mes "the roads here can be very perilous.";
- next;
- mes "[Ricard]";
- mes "Good thing i've already been here ";
- mes "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;
-
-L_MENU_1:
- mes "[Ricard]";
- mes "Where would you want to know about?";
- next;
- menu "Village Chieftain's house",L_room1,"Village Shaman's house",L_room2,"Weapon shop",L_room3,"Equipment shop",L_room4,"Bungee Jumping Spot",L_room5,"Cancel",L_end2;
-
- L_room1:
- mes "[Ricard]";
- mes "The chieftain lives ^FF0000here^000000,";
- mes "only he understands the languages of outsiders,";
- mes "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,";
- mes "his house would be right ^996600here^000000,";
- mes "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,";
- mes "because of threats from the outside world,";
- mes "they have been stocking up on";
- mes "all kinds of weapons.";
- viewpoint 1,125,155,3,0x009933;
- close;
-
- L_room4:
- mes "[Ricard]";
- mes "^3333FFThat^000000 would be the equipment shop,";
- mes "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";
- mes "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";
- mes "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 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.1
+//===== Compatible With: =====================================
+//= eAthena 1.0 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 1.1 Fixed location command format [Lupus]
+//============================================================
+
+
+//=====================================================================================
+//umbala.gat,174,147,5 script Umbalian Guide 789,{
+// mes "[Umbalian Guide]";
+// mes "-Under Development-";
+// close;
+//}
+
+// Umbala tour guide
+//===========================================================================
+umbala.gat,128,94,3 script Ricard 702,{
+ mes "[Ricard]";
+ mes "This sure is an odd place,";
+ mes "perhaps due to the fact that it hasn't been developed,";
+ mes "the roads here can be very perilous.";
+ next;
+ mes "[Ricard]";
+ mes "Good thing i've already been here ";
+ mes "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;
+
+L_MENU_1:
+ mes "[Ricard]";
+ mes "Where would you want to know about?";
+ next;
+ menu "Village Chieftain's house",L_room1,"Village Shaman's house",L_room2,"Weapon shop",L_room3,"Equipment shop",L_room4,"Bungee Jumping Spot",L_room5,"Cancel",L_end2;
+
+ L_room1:
+ mes "[Ricard]";
+ mes "The chieftain lives ^FF0000here^000000,";
+ mes "only he understands the languages of outsiders,";
+ mes "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,";
+ mes "his house would be right ^996600here^000000,";
+ mes "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,";
+ mes "because of threats from the outside world,";
+ mes "they have been stocking up on";
+ mes "all kinds of weapons.";
+ viewpoint 1,125,155,3,0x009933;
+ close;
+
+ L_room4:
+ mes "[Ricard]";
+ mes "^3333FFThat^000000 would be the equipment shop,";
+ mes "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";
+ mes "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";
+ mes "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 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 bb9507616..0a73f9457 100644
--- a/npc/guides/guides_yun.txt
+++ b/npc/guides/guides_yun.txt
@@ -1,223 +1,223 @@
-//===== eAthena Script =======================================
-//= Yuno Guides
-//===== By: ==================================================
-//= KitsuneStarwind, usul, kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-
-//=====================================================================================
-yuno.gat,153,47,4 script Yuno Guide 700,{
- mes "[Miss Yoon]";
- mes "A place that understands the present and envisions the future............";
- mes "This is Yuno, the city of Sages. Welcome to Yuno.";
- set @name$,"[Miss Yoon]";
- next;
- callfunc "F_YunoLoc",2;
-}
-
-//=====================================================================
-yuno.gat,333,182,2 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "^5533FF'Dagger of Counter'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "Among the Sage class weapons, there is a dagger called ^5533FF'The Dagger of Counter'^000000.";
- mes "It increases the chances for landing a critical attack and can only be used by Sages.";
- next;
- mes "[Yuno Soldier]";
- mes "Not only is this dagger very useful but it is very stylish as well.";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,264,320,2 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "Holy shield, ^5533FF'Sacred Mission'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "There is a holy shield named ^5533FF'Sacred Mission'^000000, that can only be used by Cusadors.";
- mes "The shield itself is long and narrow and has the wings of an angel engraved on its front.";
- next;
- mes "[Yuno Soldier]";
- mes "This shield is especially effective against the undead and other demonic monsters.";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,228,292,2 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "^FF3355'False Angel'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "Near Yuno, there lives a fallen angel known as ^FF3355''False Angel'^000000.";
- mes "It pretends to be a real angel by blessing adventurers, but then it stabs them in the back afterwards.";
- next;
- mes "[Yuno Soldier]";
- mes "Do not be fooled by its beautifull appereance, otherwise you will find yourself in great peril.";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,164,283,4 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "^FF3355'Geographer'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "There is a monster called the ^FF3355'Geographer'^000000 that looks like a flower in bloom.";
- mes "Although it is planted firmly into the ground, this creature has the ability to extend itself a great distance.";
- next;
- mes "[Yuno Soldier]";
- mes "Its name comes from a story about a poor geographer who was eaten by one of these monsters while studying.";
- mes "Unless you want to end up like that poor geographer, I suggest you stay away from these creatures.";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,151,283,4 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "^FF3355'Lava Golem'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "There is a monster called the ^FF3355'Lava Golem'^000000.";
- mes "It is made out of stone heart that gained magical powers while being swept away by molten lava.";
- next;
- mes "[Yuno Soldier]";
- mes "The lava that dripps down its body is so hot that it can melt weapons and armor made out of even the highest quality steel.";
- next;
- mes "[Yuno Soldier]";
- mes "Be very careful if you ever encounter this monster. Before you know it your equipment will become nothing more than metled pieces of junk.";
- mes "More importantly, the damage it will inflict on you will turn you into a...... well I think you get the point......";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,164,228,4 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "Killer ^FF3355'Goats'^000000.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "^FF3355'Goats'^000000 are monsters that used to be antelopes that lived high up the montains of Yuno.";
- mes "No one has ever survived a direct hit from a Goat's mighty horns.";
- next;
- mes "[Yuno Soldier]";
- mes "As fierce as those horns are, the legs of a Goat are also to be feared. They are tough and strong because of all of the climbing Goats do.";
- callfunc "F_YunoLoc",1;
-}
-
-//=====================================================================
-yuno.gat,151,228,4 script Yuno Soldier 105,
-{
- cutin "prt_soldier",2;
- set @name$, "[Yuno Soldier]";
- set @menu1$, "Large Jellopy.....";
- callfunc "F_YunoLoc",0;
- mes "[Yuno Soldier]";
- mes "Have you ever seen that extraordinarily large jellopy?? It's huuuuge!!! It's a very, very, large and shiny jellopy!!";
- emotion 1;
- callfunc "F_YunoLoc",1;
-}
-
-
-//======================================================================
-function script F_YunoLoc {
-
- if(getarg(0) == 1) goto M_Menu;
- if(getarg(0) == 2) menu "View city locations.",M_0, "End conversation.",M_End;
- mes @name$;
- mes "Welcome to Yuno, the city of noble-mindedness.";
- M_Menu:
- next;
- menu "View city locations.",M_0, @menu1$,M_1, "End conversation.",M_End;
-
- M_0:
- mes @name$;
- mes "Please choose a building to view...";
- sM_Menu:
- next;
- menu "Armory",sM_1, "Tool Dealer",sM_2, "Sage Castle",sM_3, "Street of Book Stores",sM_4, "Yuphero Plaza",sM_5,
- "Library of the Republic",sM_6, "Schwheicherbil Magic Academy",sM_7, "Museum of Monsters",sM_8,
- "Wipe all indications from mini-map",sM_Wipe, "Cancel",M_End;
-
- sM_1:
- mes @name$;
- mes "This is the Weapon and Armor Shop.";
- viewpoint 1,117,135,1,0xFF0000;
- goto sM_Menu;
- sM_2:
- mes @name$;
- mes "This is the Tool Dealer.";
- viewpoint 1,163,189,2,0xFFFF00;
- goto sM_Menu;
- sM_3:
- mes @name$;
- mes "Sage Castle is where Mages can go to become Sages.";
- viewpoint 1,89,320,3,0xff00FF;
- goto sM_Menu;
- sM_4:
- mes @name$;
- mes "The Street of Books. This is where you will find the largest selection of books for sale";
- viewpoint 1,196,138,4,0x00ff00;
- goto sM_Menu;
- sM_5:
- mes @name$;
- mes "Yuphero Plaza is the main gathering place in Yuno.";
- viewpoint 1,157,327,5,0x00ffff;
- goto sM_Menu;
- sM_6:
- mes "[Miss Yoon]";
- mes "The Library of Republic houses an extensive collection of important historical books.";
- viewpoint 1,335,204,6,0x0000ff;
- goto sM_Menu;
- sM_7:
- mes @name$;
- mes "The Shchweicherbil Magic Academy is a prestigous school where Mages study to become Sages.";
- viewpoint 1,323,280,7,0xFFCCFF;
- goto sM_Menu;
- sM_8:
- mes @name$;
- mes "The Museum of Monsters contains many exhibits of the monsters found throughout Rune Midgard.";
- viewpoint 1,278,291,8,0xFFFFFF;
- goto sM_Menu;
- sM_Wipe:
- viewpoint 2,117,135,1,0xFF0000;
- viewpoint 2,163,189,2,0xFFFF00;
- viewpoint 2,89,320,3,0xff00FF;
- viewpoint 2,196,138,4,0x00ff00;
- viewpoint 2,157,327,5,0x00ffff;
- viewpoint 2,335,204,6,0x0000ff;
- viewpoint 2,323,280,7,0xFFCCFF;
- viewpoint 2,278,291,8,0xFFFFFF;
- mes @name$;
- mes "All indications have been wiped.";
- cutin "prt_soldier",255;
- close;
- M_1:
- return;
- M_End:
- mes @name$;
- mes "Have a nice day.";
- cutin "prt_soldier",255;
- close;
-}
+//===== eAthena Script =======================================
+//= Yuno Guides
+//===== By: ==================================================
+//= KitsuneStarwind, usul, kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+
+//=====================================================================================
+yuno.gat,153,47,4 script Yuno Guide 700,{
+ mes "[Miss Yoon]";
+ mes "A place that understands the present and envisions the future............";
+ mes "This is Yuno, the city of Sages. Welcome to Yuno.";
+ set @name$,"[Miss Yoon]";
+ next;
+ callfunc "F_YunoLoc",2;
+}
+
+//=====================================================================
+yuno.gat,333,182,2 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "^5533FF'Dagger of Counter'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "Among the Sage class weapons, there is a dagger called ^5533FF'The Dagger of Counter'^000000.";
+ mes "It increases the chances for landing a critical attack and can only be used by Sages.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Not only is this dagger very useful but it is very stylish as well.";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,264,320,2 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "Holy shield, ^5533FF'Sacred Mission'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "There is a holy shield named ^5533FF'Sacred Mission'^000000, that can only be used by Cusadors.";
+ mes "The shield itself is long and narrow and has the wings of an angel engraved on its front.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "This shield is especially effective against the undead and other demonic monsters.";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,228,292,2 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "^FF3355'False Angel'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "Near Yuno, there lives a fallen angel known as ^FF3355''False Angel'^000000.";
+ mes "It pretends to be a real angel by blessing adventurers, but then it stabs them in the back afterwards.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Do not be fooled by its beautifull appereance, otherwise you will find yourself in great peril.";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,164,283,4 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "^FF3355'Geographer'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "There is a monster called the ^FF3355'Geographer'^000000 that looks like a flower in bloom.";
+ mes "Although it is planted firmly into the ground, this creature has the ability to extend itself a great distance.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Its name comes from a story about a poor geographer who was eaten by one of these monsters while studying.";
+ mes "Unless you want to end up like that poor geographer, I suggest you stay away from these creatures.";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,151,283,4 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "^FF3355'Lava Golem'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "There is a monster called the ^FF3355'Lava Golem'^000000.";
+ mes "It is made out of stone heart that gained magical powers while being swept away by molten lava.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "The lava that dripps down its body is so hot that it can melt weapons and armor made out of even the highest quality steel.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Be very careful if you ever encounter this monster. Before you know it your equipment will become nothing more than metled pieces of junk.";
+ mes "More importantly, the damage it will inflict on you will turn you into a...... well I think you get the point......";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,164,228,4 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "Killer ^FF3355'Goats'^000000.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "^FF3355'Goats'^000000 are monsters that used to be antelopes that lived high up the montains of Yuno.";
+ mes "No one has ever survived a direct hit from a Goat's mighty horns.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "As fierce as those horns are, the legs of a Goat are also to be feared. They are tough and strong because of all of the climbing Goats do.";
+ callfunc "F_YunoLoc",1;
+}
+
+//=====================================================================
+yuno.gat,151,228,4 script Yuno Soldier 105,
+{
+ cutin "prt_soldier",2;
+ set @name$, "[Yuno Soldier]";
+ set @menu1$, "Large Jellopy.....";
+ callfunc "F_YunoLoc",0;
+ mes "[Yuno Soldier]";
+ mes "Have you ever seen that extraordinarily large jellopy?? It's huuuuge!!! It's a very, very, large and shiny jellopy!!";
+ emotion 1;
+ callfunc "F_YunoLoc",1;
+}
+
+
+//======================================================================
+function script F_YunoLoc {
+
+ if(getarg(0) == 1) goto M_Menu;
+ if(getarg(0) == 2) menu "View city locations.",M_0, "End conversation.",M_End;
+ mes @name$;
+ mes "Welcome to Yuno, the city of noble-mindedness.";
+ M_Menu:
+ next;
+ menu "View city locations.",M_0, @menu1$,M_1, "End conversation.",M_End;
+
+ M_0:
+ mes @name$;
+ mes "Please choose a building to view...";
+ sM_Menu:
+ next;
+ menu "Armory",sM_1, "Tool Dealer",sM_2, "Sage Castle",sM_3, "Street of Book Stores",sM_4, "Yuphero Plaza",sM_5,
+ "Library of the Republic",sM_6, "Schwheicherbil Magic Academy",sM_7, "Museum of Monsters",sM_8,
+ "Wipe all indications from mini-map",sM_Wipe, "Cancel",M_End;
+
+ sM_1:
+ mes @name$;
+ mes "This is the Weapon and Armor Shop.";
+ viewpoint 1,117,135,1,0xFF0000;
+ goto sM_Menu;
+ sM_2:
+ mes @name$;
+ mes "This is the Tool Dealer.";
+ viewpoint 1,163,189,2,0xFFFF00;
+ goto sM_Menu;
+ sM_3:
+ mes @name$;
+ mes "Sage Castle is where Mages can go to become Sages.";
+ viewpoint 1,89,320,3,0xff00FF;
+ goto sM_Menu;
+ sM_4:
+ mes @name$;
+ mes "The Street of Books. This is where you will find the largest selection of books for sale";
+ viewpoint 1,196,138,4,0x00ff00;
+ goto sM_Menu;
+ sM_5:
+ mes @name$;
+ mes "Yuphero Plaza is the main gathering place in Yuno.";
+ viewpoint 1,157,327,5,0x00ffff;
+ goto sM_Menu;
+ sM_6:
+ mes "[Miss Yoon]";
+ mes "The Library of Republic houses an extensive collection of important historical books.";
+ viewpoint 1,335,204,6,0x0000ff;
+ goto sM_Menu;
+ sM_7:
+ mes @name$;
+ mes "The Shchweicherbil Magic Academy is a prestigous school where Mages study to become Sages.";
+ viewpoint 1,323,280,7,0xFFCCFF;
+ goto sM_Menu;
+ sM_8:
+ mes @name$;
+ mes "The Museum of Monsters contains many exhibits of the monsters found throughout Rune Midgard.";
+ viewpoint 1,278,291,8,0xFFFFFF;
+ goto sM_Menu;
+ sM_Wipe:
+ viewpoint 2,117,135,1,0xFF0000;
+ viewpoint 2,163,189,2,0xFFFF00;
+ viewpoint 2,89,320,3,0xff00FF;
+ viewpoint 2,196,138,4,0x00ff00;
+ viewpoint 2,157,327,5,0x00ffff;
+ viewpoint 2,335,204,6,0x0000ff;
+ viewpoint 2,323,280,7,0xFFCCFF;
+ viewpoint 2,278,291,8,0xFFFFFF;
+ mes @name$;
+ mes "All indications have been wiped.";
+ cutin "prt_soldier",255;
+ close;
+ M_1:
+ return;
+ M_End:
+ mes @name$;
+ mes "Have a nice day.";
+ cutin "prt_soldier",255;
+ 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 bdbc85e81..8287ad417 100644
--- a/npc/guild/aldeg/aldeg_ev_agit.txt
+++ b/npc/guild/aldeg/aldeg_ev_agit.txt
@@ -1,130 +1,130 @@
-//===== 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.2
-//===== 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]
-//============================================================
-
-
-// Castle 1 ================================================================
-aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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.2
+//===== 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]
+//============================================================
+
+
+// Castle 1 ================================================================
+aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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 ec4969e88..1ed3dc08e 100644
--- a/npc/guild/aldeg/aldeg_flags.txt
+++ b/npc/guild/aldeg/aldeg_flags.txt
@@ -1,199 +1,199 @@
-//===== 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.2
-//===== 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]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-aldebaran.gat,152,97,4 script Noisyubantian#a1-1::Noisyubantian 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170;
- close;
-
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- end;
-}
-
-// In Guild =============================================
-alde_gld.gat,61,87,6 duplicate(Noisyubantian) Noisyubantian#a1-2 722
-alde_gld.gat,61,79,6 duplicate(Noisyubantian) Noisyubantian#a1-3 722
-alde_gld.gat,45,87,8 duplicate(Noisyubantian) Noisyubantian#a1-4 722
-alde_gld.gat,51,87,8 duplicate(Noisyubantian) Noisyubantian#a1-5 722
-// In Castle ============================================
-aldeg_cas01.gat,30,248,4 duplicate(Noisyubantian) Noisyubantian#a1-6 722
-aldeg_cas01.gat,30,246,4 duplicate(Noisyubantian) Noisyubantian#a1-7 722
-aldeg_cas01.gat,37,248,4 duplicate(Noisyubantian) Noisyubantian#a1-8 722
-aldeg_cas01.gat,37,246,4 duplicate(Noisyubantian) Noisyubantian#a1-9 722
-aldeg_cas01.gat,95,80,2 duplicate(Noisyubantian) Noisyubantian#a1-10 722
-aldeg_cas01.gat,95,59,2 duplicate(Noisyubantian) Noisyubantian#a1-11 722
-aldeg_cas01.gat,62,75,2 duplicate(Noisyubantian) Noisyubantian#a1-12 722
-aldeg_cas01.gat,70,75,2 duplicate(Noisyubantian) Noisyubantian#a1-13 722
-aldeg_cas01.gat,74,75,2 duplicate(Noisyubantian) Noisyubantian#a1-14 722
-aldeg_cas01.gat,62,64,2 duplicate(Noisyubantian) Noisyubantian#a1-15 722
-aldeg_cas01.gat,66,64,2 duplicate(Noisyubantian) Noisyubantian#a1-16 722
-aldeg_cas01.gat,70,64,2 duplicate(Noisyubantian) Noisyubantian#a1-17 722
-aldeg_cas01.gat,74,64,2 duplicate(Noisyubantian) Noisyubantian#a1-18 722
-aldeg_cas01.gat,203,150,4 duplicate(Noisyubantian) Noisyubantian#a1-19 722
-aldeg_cas01.gat,210,150,4 duplicate(Noisyubantian) Noisyubantian#a1-20 722
-
-
-
-
-//================================================================================//
-// Castle 2
-//================================================================================//
-aldebaran.gat,149,97,4 script Hohensyubangawoo#a2-1::Hohensyubangawoo 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72;
- close;
-
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- end;
-}
-
-// In Guild =================================================
-alde_gld.gat,93,250,5 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-2 722
-alde_gld.gat,98,250,5 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-3 722
-// In Castle =============================================
-aldeg_cas02.gat,82,71,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-4 722
-aldeg_cas02.gat,67,30,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-5 722
-aldeg_cas02.gat,183,140,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-6 722
-aldeg_cas02.gat,212,152,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-7 722
-aldeg_cas02.gat,108,39,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-8 722
-aldeg_cas02.gat,57,213,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-9 722
-aldeg_cas02.gat,91,181,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-10 722
-aldeg_cas02.gat,103,53,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-11 722
-aldeg_cas02.gat,73,53,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-12 722
-aldeg_cas02.gat,63,41,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-13 722
-aldeg_cas02.gat,229,6,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-14 722
-aldeg_cas02.gat,230,40,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-15 722
-aldeg_cas02.gat,197,40,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-16 722
-aldeg_cas02.gat,32,213,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-17 722
-aldeg_cas02.gat,88,180,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-18 722
-aldeg_cas02.gat,121,29,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-19 722
-
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-aldebaran.gat,134,97,4 script Nyirenverk#a3-1::Nyirenverk 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76;
- close;
-
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- end;
-}
-// In Guild ===============================================
-alde_gld.gat,139,83,1 duplicate(Nyirenverk) Nyirenverk#a3-2 722
-alde_gld.gat,145,83,1 duplicate(Nyirenverk) Nyirenverk#a3-3 722
-// In Castle =============================================
-aldeg_cas03.gat,176,175,2 duplicate(Nyirenverk) Nyirenverk#a3-4 722
-aldeg_cas03.gat,85,103,2 duplicate(Nyirenverk) Nyirenverk#a3-5 722
-aldeg_cas03.gat,77,115,2 duplicate(Nyirenverk) Nyirenverk#a3-6 722
-aldeg_cas03.gat,77,215,2 duplicate(Nyirenverk) Nyirenverk#a3-7 722
-aldeg_cas03.gat,112,107,2 duplicate(Nyirenverk) Nyirenverk#a3-8 722
-aldeg_cas03.gat,112,117,2 duplicate(Nyirenverk) Nyirenverk#a3-9 722
-aldeg_cas03.gat,69,71,2 duplicate(Nyirenverk) Nyirenverk#a3-10 722
-aldeg_cas03.gat,91,69,2 duplicate(Nyirenverk) Nyirenverk#a3-11 722
-aldeg_cas03.gat,108,60,2 duplicate(Nyirenverk) Nyirenverk#a3-12 722
-aldeg_cas03.gat,121,73,2 duplicate(Nyirenverk) Nyirenverk#a3-13 722
-aldeg_cas03.gat,121,73,2 duplicate(Nyirenverk) Nyirenverk#a3-14 722
-aldeg_cas03.gat,75,102,2 duplicate(Nyirenverk) Nyirenverk#a3-15 722
-aldeg_cas03.gat,199,169,2 duplicate(Nyirenverk) Nyirenverk#a3-16 722
-aldeg_cas03.gat,181,179,2 duplicate(Nyirenverk) Nyirenverk#a3-17 722
-aldeg_cas03.gat,192,44,2 duplicate(Nyirenverk) Nyirenverk#a3-18 722
-aldeg_cas03.gat,88,108,2 duplicate(Nyirenverk) Nyirenverk#a3-19 722
-aldeg_cas03.gat,208,145,2 duplicate(Nyirenverk) Nyirenverk#a3-20 722
-aldeg_cas03.gat,207,75,2 duplicate(Nyirenverk) Nyirenverk#a3-21 722
-aldeg_cas03.gat,96,62,2 duplicate(Nyirenverk) Nyirenverk#a3-22 722
-
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-aldebaran.gat,131,97,4 script Byirtsburi#a4-1::Byirtsburi 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88;
- close;
-
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-alde_gld.gat,239,247,1 duplicate(Byirtsburi) Byirtsburi#a4-2 722
-alde_gld.gat,234,247,1 duplicate(Byirtsburi) Byirtsburi#a4-3 722
-alde_gld.gat,241,239,7 duplicate(Byirtsburi) Byirtsburi#a4-4 722
-alde_gld.gat,241,234,7 duplicate(Byirtsburi) Byirtsburi#a4-5 722
-// In Castle =============================================
-aldeg_cas04.gat,167,61,2 duplicate(Byirtsburi) Byirtsburi#a4-6 722
-aldeg_cas04.gat,164,90,2 duplicate(Byirtsburi) Byirtsburi#a4-7 722
-aldeg_cas04.gat,143,209,2 duplicate(Byirtsburi) Byirtsburi#a4-8 722
-aldeg_cas04.gat,129,193,2 duplicate(Byirtsburi) Byirtsburi#a4-9 722
-aldeg_cas04.gat,112,206,2 duplicate(Byirtsburi) Byirtsburi#a4-10 722
-aldeg_cas04.gat,113,212,2 duplicate(Byirtsburi) Byirtsburi#a4-11 722
-aldeg_cas04.gat,77,117,2 duplicate(Byirtsburi) Byirtsburi#a4-12 722
-aldeg_cas04.gat,186,42,2 duplicate(Byirtsburi) Byirtsburi#a4-13 722
-aldeg_cas04.gat,30,69,2 duplicate(Byirtsburi) Byirtsburi#a4-14 722
-aldeg_cas04.gat,55,97,2 duplicate(Byirtsburi) Byirtsburi#a4-15 722
-aldeg_cas04.gat,45,98,2 duplicate(Byirtsburi) Byirtsburi#a4-16 722
-aldeg_cas04.gat,33,116,2 duplicate(Byirtsburi) Byirtsburi#a4-17 722
-aldeg_cas04.gat,130,180,2 duplicate(Byirtsburi) Byirtsburi#a4-18 722
-aldeg_cas04.gat,129,193,2 duplicate(Byirtsburi) Byirtsburi#a4-19 722
-aldeg_cas04.gat,142,209,2 duplicate(Byirtsburi) Byirtsburi#a4-20 722
-aldeg_cas04.gat,33,107,2 duplicate(Byirtsburi) Byirtsburi#a4-21 722
-aldeg_cas04.gat,133,220,2 duplicate(Byirtsburi) Byirtsburi#a4-22 722
-aldeg_cas04.gat,169,22,2 duplicate(Byirtsburi) Byirtsburi#a4-23 722
-aldeg_cas04.gat,169,15,2 duplicate(Byirtsburi) Byirtsburi#a4-24 722
-
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-aldebaran.gat,128,97,4 script Rotenburk#a5-1::Rotenburk 722,{
- callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190;
- close;
-
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- end;
-}
-// In Guild ===============================================
-alde_gld.gat,266,92,7 duplicate(Rotenburk) Rotenburk#a5-2 722
-alde_gld.gat,266,88,7 duplicate(Rotenburk) Rotenburk#a5-3 722
-// In Castle =============================================
-aldeg_cas05.gat,170,85,2 duplicate(Rotenburk) Rotenburk#a5-4 722
-aldeg_cas05.gat,142,212,2 duplicate(Rotenburk) Rotenburk#a5-5 722
-aldeg_cas05.gat,149,196,2 duplicate(Rotenburk) Rotenburk#a5-6 722
-aldeg_cas05.gat,41,180,2 duplicate(Rotenburk) Rotenburk#a5-7 722
-aldeg_cas05.gat,38,201,2 duplicate(Rotenburk) Rotenburk#a5-8 722
-aldeg_cas05.gat,65,182,2 duplicate(Rotenburk) Rotenburk#a5-9 722
-aldeg_cas05.gat,65,205,2 duplicate(Rotenburk) Rotenburk#a5-10 722
-aldeg_cas05.gat,10,218,2 duplicate(Rotenburk) Rotenburk#a5-11 722
-aldeg_cas05.gat,164,201,2 duplicate(Rotenburk) Rotenburk#a5-12 722
-aldeg_cas05.gat,216,96,2 duplicate(Rotenburk) Rotenburk#a5-13 722
-aldeg_cas05.gat,217,80,2 duplicate(Rotenburk) Rotenburk#a5-14 722
-aldeg_cas05.gat,14,117,2 duplicate(Rotenburk) Rotenburk#a5-15 722
-aldeg_cas05.gat,10,225,2 duplicate(Rotenburk) Rotenburk#a5-16 722
-aldeg_cas05.gat,187,59,2 duplicate(Rotenburk) Rotenburk#a5-17 722
-aldeg_cas05.gat,154,51,2 duplicate(Rotenburk) Rotenburk#a5-18 722
-aldeg_cas05.gat,22,211,2 duplicate(Rotenburk) Rotenburk#a5-19 722
-aldeg_cas05.gat,150,202,2 duplicate(Rotenburk) Rotenburk#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.2
+//===== 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]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+aldebaran.gat,152,97,4 script Noisyubantian#a1-1::Noisyubantian 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas01",218,170;
+ close;
+
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ end;
+}
+
+// In Guild =============================================
+alde_gld.gat,61,87,6 duplicate(Noisyubantian) Noisyubantian#a1-2 722
+alde_gld.gat,61,79,6 duplicate(Noisyubantian) Noisyubantian#a1-3 722
+alde_gld.gat,45,87,8 duplicate(Noisyubantian) Noisyubantian#a1-4 722
+alde_gld.gat,51,87,8 duplicate(Noisyubantian) Noisyubantian#a1-5 722
+// In Castle ============================================
+aldeg_cas01.gat,30,248,4 duplicate(Noisyubantian) Noisyubantian#a1-6 722
+aldeg_cas01.gat,30,246,4 duplicate(Noisyubantian) Noisyubantian#a1-7 722
+aldeg_cas01.gat,37,248,4 duplicate(Noisyubantian) Noisyubantian#a1-8 722
+aldeg_cas01.gat,37,246,4 duplicate(Noisyubantian) Noisyubantian#a1-9 722
+aldeg_cas01.gat,95,80,2 duplicate(Noisyubantian) Noisyubantian#a1-10 722
+aldeg_cas01.gat,95,59,2 duplicate(Noisyubantian) Noisyubantian#a1-11 722
+aldeg_cas01.gat,62,75,2 duplicate(Noisyubantian) Noisyubantian#a1-12 722
+aldeg_cas01.gat,70,75,2 duplicate(Noisyubantian) Noisyubantian#a1-13 722
+aldeg_cas01.gat,74,75,2 duplicate(Noisyubantian) Noisyubantian#a1-14 722
+aldeg_cas01.gat,62,64,2 duplicate(Noisyubantian) Noisyubantian#a1-15 722
+aldeg_cas01.gat,66,64,2 duplicate(Noisyubantian) Noisyubantian#a1-16 722
+aldeg_cas01.gat,70,64,2 duplicate(Noisyubantian) Noisyubantian#a1-17 722
+aldeg_cas01.gat,74,64,2 duplicate(Noisyubantian) Noisyubantian#a1-18 722
+aldeg_cas01.gat,203,150,4 duplicate(Noisyubantian) Noisyubantian#a1-19 722
+aldeg_cas01.gat,210,150,4 duplicate(Noisyubantian) Noisyubantian#a1-20 722
+
+
+
+
+//================================================================================//
+// Castle 2
+//================================================================================//
+aldebaran.gat,149,97,4 script Hohensyubangawoo#a2-1::Hohensyubangawoo 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas02",85,72;
+ close;
+
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ end;
+}
+
+// In Guild =================================================
+alde_gld.gat,93,250,5 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-2 722
+alde_gld.gat,98,250,5 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-3 722
+// In Castle =============================================
+aldeg_cas02.gat,82,71,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-4 722
+aldeg_cas02.gat,67,30,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-5 722
+aldeg_cas02.gat,183,140,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-6 722
+aldeg_cas02.gat,212,152,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-7 722
+aldeg_cas02.gat,108,39,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-8 722
+aldeg_cas02.gat,57,213,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-9 722
+aldeg_cas02.gat,91,181,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-10 722
+aldeg_cas02.gat,103,53,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-11 722
+aldeg_cas02.gat,73,53,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-12 722
+aldeg_cas02.gat,63,41,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-13 722
+aldeg_cas02.gat,229,6,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-14 722
+aldeg_cas02.gat,230,40,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-15 722
+aldeg_cas02.gat,197,40,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-16 722
+aldeg_cas02.gat,32,213,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-17 722
+aldeg_cas02.gat,88,180,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-18 722
+aldeg_cas02.gat,121,29,2 duplicate(Hohensyubangawoo) Hohensyubangawoo#a2-19 722
+
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+aldebaran.gat,134,97,4 script Nyirenverk#a3-1::Nyirenverk 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas03",118,76;
+ close;
+
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ end;
+}
+// In Guild ===============================================
+alde_gld.gat,139,83,1 duplicate(Nyirenverk) Nyirenverk#a3-2 722
+alde_gld.gat,145,83,1 duplicate(Nyirenverk) Nyirenverk#a3-3 722
+// In Castle =============================================
+aldeg_cas03.gat,176,175,2 duplicate(Nyirenverk) Nyirenverk#a3-4 722
+aldeg_cas03.gat,85,103,2 duplicate(Nyirenverk) Nyirenverk#a3-5 722
+aldeg_cas03.gat,77,115,2 duplicate(Nyirenverk) Nyirenverk#a3-6 722
+aldeg_cas03.gat,77,215,2 duplicate(Nyirenverk) Nyirenverk#a3-7 722
+aldeg_cas03.gat,112,107,2 duplicate(Nyirenverk) Nyirenverk#a3-8 722
+aldeg_cas03.gat,112,117,2 duplicate(Nyirenverk) Nyirenverk#a3-9 722
+aldeg_cas03.gat,69,71,2 duplicate(Nyirenverk) Nyirenverk#a3-10 722
+aldeg_cas03.gat,91,69,2 duplicate(Nyirenverk) Nyirenverk#a3-11 722
+aldeg_cas03.gat,108,60,2 duplicate(Nyirenverk) Nyirenverk#a3-12 722
+aldeg_cas03.gat,121,73,2 duplicate(Nyirenverk) Nyirenverk#a3-13 722
+aldeg_cas03.gat,121,73,2 duplicate(Nyirenverk) Nyirenverk#a3-14 722
+aldeg_cas03.gat,75,102,2 duplicate(Nyirenverk) Nyirenverk#a3-15 722
+aldeg_cas03.gat,199,169,2 duplicate(Nyirenverk) Nyirenverk#a3-16 722
+aldeg_cas03.gat,181,179,2 duplicate(Nyirenverk) Nyirenverk#a3-17 722
+aldeg_cas03.gat,192,44,2 duplicate(Nyirenverk) Nyirenverk#a3-18 722
+aldeg_cas03.gat,88,108,2 duplicate(Nyirenverk) Nyirenverk#a3-19 722
+aldeg_cas03.gat,208,145,2 duplicate(Nyirenverk) Nyirenverk#a3-20 722
+aldeg_cas03.gat,207,75,2 duplicate(Nyirenverk) Nyirenverk#a3-21 722
+aldeg_cas03.gat,96,62,2 duplicate(Nyirenverk) Nyirenverk#a3-22 722
+
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+aldebaran.gat,131,97,4 script Byirtsburi#a4-1::Byirtsburi 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas04",45,88;
+ close;
+
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+alde_gld.gat,239,247,1 duplicate(Byirtsburi) Byirtsburi#a4-2 722
+alde_gld.gat,234,247,1 duplicate(Byirtsburi) Byirtsburi#a4-3 722
+alde_gld.gat,241,239,7 duplicate(Byirtsburi) Byirtsburi#a4-4 722
+alde_gld.gat,241,234,7 duplicate(Byirtsburi) Byirtsburi#a4-5 722
+// In Castle =============================================
+aldeg_cas04.gat,167,61,2 duplicate(Byirtsburi) Byirtsburi#a4-6 722
+aldeg_cas04.gat,164,90,2 duplicate(Byirtsburi) Byirtsburi#a4-7 722
+aldeg_cas04.gat,143,209,2 duplicate(Byirtsburi) Byirtsburi#a4-8 722
+aldeg_cas04.gat,129,193,2 duplicate(Byirtsburi) Byirtsburi#a4-9 722
+aldeg_cas04.gat,112,206,2 duplicate(Byirtsburi) Byirtsburi#a4-10 722
+aldeg_cas04.gat,113,212,2 duplicate(Byirtsburi) Byirtsburi#a4-11 722
+aldeg_cas04.gat,77,117,2 duplicate(Byirtsburi) Byirtsburi#a4-12 722
+aldeg_cas04.gat,186,42,2 duplicate(Byirtsburi) Byirtsburi#a4-13 722
+aldeg_cas04.gat,30,69,2 duplicate(Byirtsburi) Byirtsburi#a4-14 722
+aldeg_cas04.gat,55,97,2 duplicate(Byirtsburi) Byirtsburi#a4-15 722
+aldeg_cas04.gat,45,98,2 duplicate(Byirtsburi) Byirtsburi#a4-16 722
+aldeg_cas04.gat,33,116,2 duplicate(Byirtsburi) Byirtsburi#a4-17 722
+aldeg_cas04.gat,130,180,2 duplicate(Byirtsburi) Byirtsburi#a4-18 722
+aldeg_cas04.gat,129,193,2 duplicate(Byirtsburi) Byirtsburi#a4-19 722
+aldeg_cas04.gat,142,209,2 duplicate(Byirtsburi) Byirtsburi#a4-20 722
+aldeg_cas04.gat,33,107,2 duplicate(Byirtsburi) Byirtsburi#a4-21 722
+aldeg_cas04.gat,133,220,2 duplicate(Byirtsburi) Byirtsburi#a4-22 722
+aldeg_cas04.gat,169,22,2 duplicate(Byirtsburi) Byirtsburi#a4-23 722
+aldeg_cas04.gat,169,15,2 duplicate(Byirtsburi) Byirtsburi#a4-24 722
+
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+aldebaran.gat,128,97,4 script Rotenburk#a5-1::Rotenburk 722,{
+ callfunc "F_Flags","Al De Baran","aldeg_cas05",31,190;
+ close;
+
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ end;
+}
+// In Guild ===============================================
+alde_gld.gat,266,92,7 duplicate(Rotenburk) Rotenburk#a5-2 722
+alde_gld.gat,266,88,7 duplicate(Rotenburk) Rotenburk#a5-3 722
+// In Castle =============================================
+aldeg_cas05.gat,170,85,2 duplicate(Rotenburk) Rotenburk#a5-4 722
+aldeg_cas05.gat,142,212,2 duplicate(Rotenburk) Rotenburk#a5-5 722
+aldeg_cas05.gat,149,196,2 duplicate(Rotenburk) Rotenburk#a5-6 722
+aldeg_cas05.gat,41,180,2 duplicate(Rotenburk) Rotenburk#a5-7 722
+aldeg_cas05.gat,38,201,2 duplicate(Rotenburk) Rotenburk#a5-8 722
+aldeg_cas05.gat,65,182,2 duplicate(Rotenburk) Rotenburk#a5-9 722
+aldeg_cas05.gat,65,205,2 duplicate(Rotenburk) Rotenburk#a5-10 722
+aldeg_cas05.gat,10,218,2 duplicate(Rotenburk) Rotenburk#a5-11 722
+aldeg_cas05.gat,164,201,2 duplicate(Rotenburk) Rotenburk#a5-12 722
+aldeg_cas05.gat,216,96,2 duplicate(Rotenburk) Rotenburk#a5-13 722
+aldeg_cas05.gat,217,80,2 duplicate(Rotenburk) Rotenburk#a5-14 722
+aldeg_cas05.gat,14,117,2 duplicate(Rotenburk) Rotenburk#a5-15 722
+aldeg_cas05.gat,10,225,2 duplicate(Rotenburk) Rotenburk#a5-16 722
+aldeg_cas05.gat,187,59,2 duplicate(Rotenburk) Rotenburk#a5-17 722
+aldeg_cas05.gat,154,51,2 duplicate(Rotenburk) Rotenburk#a5-18 722
+aldeg_cas05.gat,22,211,2 duplicate(Rotenburk) Rotenburk#a5-19 722
+aldeg_cas05.gat,150,202,2 duplicate(Rotenburk) Rotenburk#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 e0f2e65dd..166097638 100644
--- a/npc/guild/aldeg/aldeg_managers.txt
+++ b/npc/guild/aldeg/aldeg_managers.txt
@@ -1,110 +1,110 @@
-//===== 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.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.2 Optimized with functions.[kobra_k88]
-//============================================================
-
-
-// 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 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 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 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 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.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.2 Optimized with functions.[kobra_k88]
+//============================================================
+
+
+// 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 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 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 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 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 a6f9ffb61..5ab6dacfc 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.2
-//===== 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:
- if($boxNumA01 == 0) end;
- set $@bxA01, $boxNumA01;
- callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,0;
- 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:
- if($boxNumA02 == 0) end;
- set $@bxA02, $boxNumA02;
- callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,0;
- 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:
- if($boxNumA03 == 0) end;
- set $@bxA03, $boxNumA03;
- callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,0;
- 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:
- if($boxNumA04 == 0) end;
- set $@bxA04, $boxNumA04;
- callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,0;
- 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:
- if($boxNumA05 == 0) end;
- set $@bxA05, $boxNumA05;
- callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,0;
- 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.2
+//===== 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:
+ if($boxNumA01 == 0) end;
+ set $@bxA01, $boxNumA01;
+ callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","aldeg_cas01","A01",$boxNumA01,$@bxA01,$@boxIdA01,1324,114,218,123,227,0;
+ 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:
+ if($boxNumA02 == 0) end;
+ set $@bxA02, $boxNumA02;
+ callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","aldeg_cas02","A02",$boxNumA02,$@bxA02,$@boxIdA02,1326,130,226,138,235,0;
+ 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:
+ if($boxNumA03 == 0) end;
+ set $@bxA03, $boxNumA03;
+ callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","aldeg_cas03","A03",$boxNumA03,$@bxA03,$@boxIdA03,1328,220,264,229,273,0;
+ 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:
+ if($boxNumA04 == 0) end;
+ set $@bxA04, $boxNumA04;
+ callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","aldeg_cas04","A04",$boxNumA04,$@bxA04,$@boxIdA04,1330,80,8,89,17,0;
+ 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:
+ if($boxNumA05 == 0) end;
+ set $@bxA05, $boxNumA05;
+ callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","aldeg_cas05","A05",$boxNumA05,$@bxA05,$@boxIdA05,1332,58,8,65,15,0;
+ 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 49946d92d..7a7e89bab 100644
--- a/npc/guild/ev_agit_event.txt
+++ b/npc/guild/ev_agit_event.txt
@@ -1,41 +1,41 @@
-//===== eAthena Script =======================================
-//= War of Emperium - WoE Auto-Start
-//===== By: ==================================================
-//= kalen (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Auto Start for War of Emperium
-//=============================================
-//= gettime(3): Gets hour (24 hour time)
-//= gettime(4): Use it if you only want to have WoE start on
-//= certain days.
-//= 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]
-//============================================================
-
-// Auto Start Agit NPC
-- script Agit_Event -1,{
- end;
-
-OnAgitInit:
- if(gettime(3) >= 21 || gettime(3) < 11) goto L_Stop;
-
-OnClock1100:
-// if(gettime(4)!=1 || gettime(4)!=3 || gettime(4)!=6) end;
- Announce "The War Of Emperium has begun!",8;
- AgitStart;
- Break;
-
-OnClock2100:
-L_Stop:
-// if(gettime(4)!=1 || gettime(4)!=3 || gettime(4)!=6) end;
- Announce "The War Of Emperium is over!",8;
- AgitEnd;
- Break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - WoE Auto-Start
+//===== By: ==================================================
+//= kalen (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Auto Start for War of Emperium
+//=============================================
+//= gettime(3): Gets hour (24 hour time)
+//= gettime(4): Use it if you only want to have WoE start on
+//= certain days.
+//= 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]
+//============================================================
+
+// Auto Start Agit NPC
+- script Agit_Event -1,{
+ end;
+
+OnAgitInit:
+ if(gettime(3) >= 21 || gettime(3) < 11) goto L_Stop;
+
+OnClock1100:
+// if(gettime(4)!=1 || gettime(4)!=3 || gettime(4)!=6) end;
+ Announce "The War Of Emperium has begun!",8;
+ AgitStart;
+ Break;
+
+OnClock2100:
+L_Stop:
+// if(gettime(4)!=1 || gettime(4)!=3 || gettime(4)!=6) end;
+ Announce "The War Of Emperium is over!",8;
+ AgitEnd;
+ Break;
+}
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 48417b2af..5be223f03 100644
--- a/npc/guild/gefg/gefg_ev_agit.txt
+++ b/npc/guild/gefg/gefg_ev_agit.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Geffen Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-// Castle 1 ================================================================
-gefg_cas01.gat,198,182,0 script Agit_G01 -1,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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.2
+//===== 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]
+//============================================================
+
+
+// Castle 1 ================================================================
+gefg_cas01.gat,198,182,0 script Agit_G01 -1,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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 d31db1f69..8f1e30d0c 100644
--- a/npc/guild/gefg/gefg_flags.txt
+++ b/npc/guild/gefg/gefg_flags.txt
@@ -1,154 +1,154 @@
-//===== 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.2
-//===== 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]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-geffen.gat,109,123,2 script Reprion#g1-1::Reprion 722,
-{
- callfunc "F_Flags","Geffen","gefg_cas01",83,47;
- close;
-
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,148,51,5 duplicate(Reprion) Reprion#g1-2 722
-gef_fild13.gat,155,54,5 duplicate(Reprion) Reprion#g1-3 722
-gef_fild13.gat,212,79,6 duplicate(Reprion) Reprion#g1-4 722
-gef_fild13.gat,211,71,6 duplicate(Reprion) Reprion#g1-5 722
-// In Castle =============================================
-gefg_cas01.gat,28,157,4 duplicate(Reprion) Reprion#g1-6 722
-gefg_cas01.gat,32,157,4 duplicate(Reprion) Reprion#g1-7 722
-gefg_cas01.gat,22,156,5 duplicate(Reprion) Reprion#g1-8 722
-gefg_cas01.gat,68,185,3 duplicate(Reprion) Reprion#g1-9 722
-gefg_cas01.gat,17,171,5 duplicate(Reprion) Reprion#g1-10 722
-gefg_cas01.gat,59,16,4 duplicate(Reprion) Reprion#g1-11 722
-gefg_cas01.gat,64,16,4 duplicate(Reprion) Reprion#g1-12 722
-
-
-
-//===================================================================================//
-// Castle 2
-//===================================================================================//
-geffen.gat,112,129,1 script Yolbriger#g2-1::Yolbriger 722,
-{
- callfunc "F_Flags","Geffen","gefg_cas02",23,66;
- close;
-
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- end;
-}
-// In Guild ==============================================
-gef_fild13.gat,303,243,4 duplicate(Yolbriger) Yolbriger#g2-2 722
-gef_fild13.gat,312,243,4 duplicate(Yolbriger) Yolbriger#g2-3 722
-gef_fild13.gat,290,243,4 duplicate(Yolbriger) Yolbriger#g2-4 722
-gef_fild13.gat,324,243,4 duplicate(Yolbriger) Yolbriger#g2-5 722
-// In Castle ============================================
-gefg_cas02.gat,65,130,5 duplicate(Yolbriger) Yolbriger#g2-6 722
-gefg_cas02.gat,30,123,5 duplicate(Yolbriger) Yolbriger#g2-7 722
-gefg_cas02.gat,65,139,6 duplicate(Yolbriger) Yolbriger#g2-8 722
-gefg_cas02.gat,37,177,6 duplicate(Yolbriger) Yolbriger#g2-9 722
-gefg_cas02.gat,37,168,6 duplicate(Yolbriger) Yolbriger#g2-10 722
-gefg_cas02.gat,68,47,2 duplicate(Yolbriger) Yolbriger#g2-11 722
-gefg_cas02.gat,68,36,2 duplicate(Yolbriger) Yolbriger#g2-12 722
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-geffen.gat,120,132,8 script Isinlife#g3-1::Isinlife 722,
-{
- callfunc "F_Flags","Geffen","gefg_cas03",116,89;
- close;
-
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,78,182,4 duplicate(Isinlife) Isinlife#g3-2 722
-gef_fild13.gat,87,182,4 duplicate(Isinlife) Isinlife#g3-3 722
-gef_fild13.gat,73,295,7 duplicate(Isinlife) Isinlife#g3-4 722
-gef_fild13.gat,113,274,7 duplicate(Isinlife) Isinlife#g3-5 722
-gef_fild13.gat,144,235,6 duplicate(Isinlife) Isinlife#g3-6 722
-gef_fild13.gat,144,244,4 duplicate(Isinlife) Isinlife#g3-7 722
-// In Castle =============================================
-gefg_cas03.gat,122,220,6 duplicate(Isinlife) Isinlife#g3-8 722
-gefg_cas03.gat,122,229,6 duplicate(Isinlife) Isinlife#g3-9 722
-gefg_cas03.gat,91,257,7 duplicate(Isinlife) Isinlife#g3-10 722
-gefg_cas03.gat,52,276,7 duplicate(Isinlife) Isinlife#g3-11 722
-gefg_cas03.gat,56,164,4 duplicate(Isinlife) Isinlife#g3-12 722
-gefg_cas03.gat,65,164,4 duplicate(Isinlife) Isinlife#g3-13 722
-gefg_cas03.gat,37,214,1 duplicate(Isinlife) Isinlife#g3-14 722
-gefg_cas03.gat,34,208,1 duplicate(Isinlife) Isinlife#g3-15 722
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-geffen.gat,127,130,7 script Berigel#g4-1::Berigel 722,
-{
- callfunc "F_Flags","Geffen","gefg_cas04",59,70;
- close;
-
-OnRecvCastleG04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,190,283,3 duplicate(Berigel) Berigel#g4-2 722
-gef_fild13.gat,199,274,3 duplicate(Berigel) Berigel#g4-3 722
-// In Castle =============================================
-gefg_cas04.gat,24,157,4 duplicate(Berigel) Berigel#g4-4 722
-gefg_cas04.gat,35,158,4 duplicate(Berigel) Berigel#g4-5 722
-gefg_cas04.gat,44,184,4 duplicate(Berigel) Berigel#g4-6 722
-gefg_cas04.gat,51,184,4 duplicate(Berigel) Berigel#g4-7 722
-gefg_cas04.gat,39,212,7 duplicate(Berigel) Berigel#g4-8 722
-gefg_cas04.gat,29,212,1 duplicate(Berigel) Berigel#g4-9 722
-gefg_cas04.gat,24,73,1 duplicate(Berigel) Berigel#g4-10 722
-gefg_cas04.gat,35,73,4 duplicate(Berigel) Berigel#g4-11 722
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-geffen.gat,131,123,6 script Melsedetsu#g5-1::Melsedetsu 722,
-{
- callfunc "F_Flags","Geffen","gefg_cas05",61,52;
- close;
-
-OnRecvCastleG05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- end;
-}
-// In Guild ===============================================
-gef_fild13.gat,302,87,7 duplicate(Melsedetsu) Melsedetsu#g5-2 722
-gef_fild13.gat,313,83,0 duplicate(Melsedetsu) Melsedetsu#g5-3 722
-gef_fild13.gat,252,51,2 duplicate(Melsedetsu) Melsedetsu#g5-4 722
-gef_fild13.gat,26,147,2 duplicate(Melsedetsu) Melsedetsu#g5-5 722
-// In Castle =============================================
-gefg_cas05.gat,77,185,7 duplicate(Melsedetsu) Melsedetsu#g5-6 722
-gefg_cas05.gat,92,181,0 duplicate(Melsedetsu) Melsedetsu#g5-7 722
-gefg_cas05.gat,83,158,1 duplicate(Melsedetsu) Melsedetsu#g5-8 722
-gefg_cas05.gat,62,144,7 duplicate(Melsedetsu) Melsedetsu#g5-9 722
-gefg_cas05.gat,62,66,4 duplicate(Melsedetsu) Melsedetsu#g5-10 722
-gefg_cas05.gat,69,66,4 duplicate(Melsedetsu) Melsedetsu#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.2
+//===== 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]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+geffen.gat,109,123,2 script Reprion#g1-1::Reprion 722,
+{
+ callfunc "F_Flags","Geffen","gefg_cas01",83,47;
+ close;
+
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,148,51,5 duplicate(Reprion) Reprion#g1-2 722
+gef_fild13.gat,155,54,5 duplicate(Reprion) Reprion#g1-3 722
+gef_fild13.gat,212,79,6 duplicate(Reprion) Reprion#g1-4 722
+gef_fild13.gat,211,71,6 duplicate(Reprion) Reprion#g1-5 722
+// In Castle =============================================
+gefg_cas01.gat,28,157,4 duplicate(Reprion) Reprion#g1-6 722
+gefg_cas01.gat,32,157,4 duplicate(Reprion) Reprion#g1-7 722
+gefg_cas01.gat,22,156,5 duplicate(Reprion) Reprion#g1-8 722
+gefg_cas01.gat,68,185,3 duplicate(Reprion) Reprion#g1-9 722
+gefg_cas01.gat,17,171,5 duplicate(Reprion) Reprion#g1-10 722
+gefg_cas01.gat,59,16,4 duplicate(Reprion) Reprion#g1-11 722
+gefg_cas01.gat,64,16,4 duplicate(Reprion) Reprion#g1-12 722
+
+
+
+//===================================================================================//
+// Castle 2
+//===================================================================================//
+geffen.gat,112,129,1 script Yolbriger#g2-1::Yolbriger 722,
+{
+ callfunc "F_Flags","Geffen","gefg_cas02",23,66;
+ close;
+
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ end;
+}
+// In Guild ==============================================
+gef_fild13.gat,303,243,4 duplicate(Yolbriger) Yolbriger#g2-2 722
+gef_fild13.gat,312,243,4 duplicate(Yolbriger) Yolbriger#g2-3 722
+gef_fild13.gat,290,243,4 duplicate(Yolbriger) Yolbriger#g2-4 722
+gef_fild13.gat,324,243,4 duplicate(Yolbriger) Yolbriger#g2-5 722
+// In Castle ============================================
+gefg_cas02.gat,65,130,5 duplicate(Yolbriger) Yolbriger#g2-6 722
+gefg_cas02.gat,30,123,5 duplicate(Yolbriger) Yolbriger#g2-7 722
+gefg_cas02.gat,65,139,6 duplicate(Yolbriger) Yolbriger#g2-8 722
+gefg_cas02.gat,37,177,6 duplicate(Yolbriger) Yolbriger#g2-9 722
+gefg_cas02.gat,37,168,6 duplicate(Yolbriger) Yolbriger#g2-10 722
+gefg_cas02.gat,68,47,2 duplicate(Yolbriger) Yolbriger#g2-11 722
+gefg_cas02.gat,68,36,2 duplicate(Yolbriger) Yolbriger#g2-12 722
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+geffen.gat,120,132,8 script Isinlife#g3-1::Isinlife 722,
+{
+ callfunc "F_Flags","Geffen","gefg_cas03",116,89;
+ close;
+
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,78,182,4 duplicate(Isinlife) Isinlife#g3-2 722
+gef_fild13.gat,87,182,4 duplicate(Isinlife) Isinlife#g3-3 722
+gef_fild13.gat,73,295,7 duplicate(Isinlife) Isinlife#g3-4 722
+gef_fild13.gat,113,274,7 duplicate(Isinlife) Isinlife#g3-5 722
+gef_fild13.gat,144,235,6 duplicate(Isinlife) Isinlife#g3-6 722
+gef_fild13.gat,144,244,4 duplicate(Isinlife) Isinlife#g3-7 722
+// In Castle =============================================
+gefg_cas03.gat,122,220,6 duplicate(Isinlife) Isinlife#g3-8 722
+gefg_cas03.gat,122,229,6 duplicate(Isinlife) Isinlife#g3-9 722
+gefg_cas03.gat,91,257,7 duplicate(Isinlife) Isinlife#g3-10 722
+gefg_cas03.gat,52,276,7 duplicate(Isinlife) Isinlife#g3-11 722
+gefg_cas03.gat,56,164,4 duplicate(Isinlife) Isinlife#g3-12 722
+gefg_cas03.gat,65,164,4 duplicate(Isinlife) Isinlife#g3-13 722
+gefg_cas03.gat,37,214,1 duplicate(Isinlife) Isinlife#g3-14 722
+gefg_cas03.gat,34,208,1 duplicate(Isinlife) Isinlife#g3-15 722
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+geffen.gat,127,130,7 script Berigel#g4-1::Berigel 722,
+{
+ callfunc "F_Flags","Geffen","gefg_cas04",59,70;
+ close;
+
+OnRecvCastleG04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,190,283,3 duplicate(Berigel) Berigel#g4-2 722
+gef_fild13.gat,199,274,3 duplicate(Berigel) Berigel#g4-3 722
+// In Castle =============================================
+gefg_cas04.gat,24,157,4 duplicate(Berigel) Berigel#g4-4 722
+gefg_cas04.gat,35,158,4 duplicate(Berigel) Berigel#g4-5 722
+gefg_cas04.gat,44,184,4 duplicate(Berigel) Berigel#g4-6 722
+gefg_cas04.gat,51,184,4 duplicate(Berigel) Berigel#g4-7 722
+gefg_cas04.gat,39,212,7 duplicate(Berigel) Berigel#g4-8 722
+gefg_cas04.gat,29,212,1 duplicate(Berigel) Berigel#g4-9 722
+gefg_cas04.gat,24,73,1 duplicate(Berigel) Berigel#g4-10 722
+gefg_cas04.gat,35,73,4 duplicate(Berigel) Berigel#g4-11 722
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+geffen.gat,131,123,6 script Melsedetsu#g5-1::Melsedetsu 722,
+{
+ callfunc "F_Flags","Geffen","gefg_cas05",61,52;
+ close;
+
+OnRecvCastleG05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ end;
+}
+// In Guild ===============================================
+gef_fild13.gat,302,87,7 duplicate(Melsedetsu) Melsedetsu#g5-2 722
+gef_fild13.gat,313,83,0 duplicate(Melsedetsu) Melsedetsu#g5-3 722
+gef_fild13.gat,252,51,2 duplicate(Melsedetsu) Melsedetsu#g5-4 722
+gef_fild13.gat,26,147,2 duplicate(Melsedetsu) Melsedetsu#g5-5 722
+// In Castle =============================================
+gefg_cas05.gat,77,185,7 duplicate(Melsedetsu) Melsedetsu#g5-6 722
+gefg_cas05.gat,92,181,0 duplicate(Melsedetsu) Melsedetsu#g5-7 722
+gefg_cas05.gat,83,158,1 duplicate(Melsedetsu) Melsedetsu#g5-8 722
+gefg_cas05.gat,62,144,7 duplicate(Melsedetsu) Melsedetsu#g5-9 722
+gefg_cas05.gat,62,66,4 duplicate(Melsedetsu) Melsedetsu#g5-10 722
+gefg_cas05.gat,69,66,4 duplicate(Melsedetsu) Melsedetsu#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 77fccddfa..94eaa093a 100644
--- a/npc/guild/gefg/gefg_kafras.txt
+++ b/npc/guild/gefg/gefg_kafras.txt
@@ -1,71 +1,71 @@
-//===== 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 331756b79..95bd57542 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.2
-//===== 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:
- if($boxNumG01 == 0) end;
- set $@bxG01, $boxNumG01;
- callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,0;
- 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:
- if($boxNumG02 == 0) end;
- set $@bxG02, $boxNumG02;
- callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,0;
- 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:
- if($boxNumG03 == 0) end;
- set $@bxG03, $boxNumG03;
- callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,0;
- 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:
- if($boxNumG04 == 0) end;
- set $@bxG04, $boxNumG04;
- callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,0;
- 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:
- if($boxNumG05 == 0) end;
- set $@bxG05, $boxNumG05;
- callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,0;
- 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.2
+//===== 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:
+ if($boxNumG01 == 0) end;
+ set $@bxG01, $boxNumG01;
+ callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","gefg_cas01","G01",$boxNumG01,$@bxG01,$@boxIdG01,1334,150,108,158,114,0;
+ 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:
+ if($boxNumG02 == 0) end;
+ set $@bxG02, $boxNumG02;
+ callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","gefg_cas02","G02",$boxNumG02,$@bxG02,$@boxIdG02,1336,136,112,145,118,0;
+ 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:
+ if($boxNumG03 == 0) end;
+ set $@bxG03, $boxNumG03;
+ callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","gefg_cas03","G03",$boxNumG03,$@bxG03,$@boxIdG03,1338,266,286,275,293,0;
+ 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:
+ if($boxNumG04 == 0) end;
+ set $@bxG04, $boxNumG04;
+ callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","gefg_cas04","G04",$boxNumG04,$@bxG04,$@boxIdG04,1340,112,114,119,123,0;
+ 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:
+ if($boxNumG05 == 0) end;
+ set $@bxG05, $boxNumG05;
+ callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","gefg_cas05","G05",$boxNumG05,$@bxG05,$@boxIdG05,1342,140,106,147,113,0;
+ 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 ebcda54fa..6d954c639 100644
--- a/npc/guild/gldfunc_dunsw.txt
+++ b/npc/guild/gldfunc_dunsw.txt
@@ -1,42 +1,42 @@
-//===== 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.2
-//===== 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: =================================
-//= v1.2: All guild Dungeon Switch npcs use this function.[kobra_k88]
-//============================================================
-
-//==================================================
-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 (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.2
+//===== 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: =================================
+//= v1.2: All guild Dungeon Switch npcs use this function.[kobra_k88]
+//============================================================
+
+//==================================================
+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 (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 460f95ffa..ee4216904 100644
--- a/npc/guild/gldfunc_ev_agit.txt
+++ b/npc/guild/gldfunc_ev_agit.txt
@@ -1,149 +1,149 @@
-//===== 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.2a
-//===== 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]
-//============================================================
-
-
-
-// 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 OnAgitBreak ======================================
-function script F_AgitBreak {
- //killmonsterall getarg(0)+".gat";
- set @GID,getcharid(2);
- if (@GID <= 0) return;
- set @Economy,GetCastleData(getarg(0)+".gat",2);
- SetCastleData getarg(0)+".gat",2, @Economy-5;
- if (GetCastleData(getarg(0)+".gat",2) < 0) SetCastleData getarg(0)+".gat",2,0;
- set @Defence,GetCastleData(getarg(0)+".gat",3);
- SetCastleData getarg(0)+".gat",3, @Defence-5;
- if (GetCastleData(getarg(0)+".gat",3) < 0) SetCastleData getarg(0)+".gat",3,0;
- 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 {
-// if (GetCastleData(getarg(0)+".gat",1) == 0) return;
- MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),4;
- KillMonster getarg(0)+".gat","Agit_"+getarg(1)+"::OnAgitBreak";
- GvgOff getarg(0)+".gat";
- 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.2a
+//===== 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]
+//============================================================
+
+
+
+// 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 OnAgitBreak ======================================
+function script F_AgitBreak {
+ //killmonsterall getarg(0)+".gat";
+ set @GID,getcharid(2);
+ if (@GID <= 0) return;
+ set @Economy,GetCastleData(getarg(0)+".gat",2);
+ SetCastleData getarg(0)+".gat",2, @Economy-5;
+ if (GetCastleData(getarg(0)+".gat",2) < 0) SetCastleData getarg(0)+".gat",2,0;
+ set @Defence,GetCastleData(getarg(0)+".gat",3);
+ SetCastleData getarg(0)+".gat",3, @Defence-5;
+ if (GetCastleData(getarg(0)+".gat",3) < 0) SetCastleData getarg(0)+".gat",3,0;
+ 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 {
+// if (GetCastleData(getarg(0)+".gat",1) == 0) return;
+ MapRespawnGuildID getarg(0)+".gat",GetCastleData(getarg(0)+".gat",1),4;
+ KillMonster getarg(0)+".gat","Agit_"+getarg(1)+"::OnAgitBreak";
+ GvgOff getarg(0)+".gat";
+ end;
+}
diff --git a/npc/guild/gldfunc_flag.txt b/npc/guild/gldfunc_flag.txt
index d24076cda..f20c2fdeb 100644
--- a/npc/guild/gldfunc_flag.txt
+++ b/npc/guild/gldfunc_flag.txt
@@ -1,58 +1,58 @@
-//===== 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.2
-//===== 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
-//===== Additional Comments: =================================
-//= v1.2: All Guild flags scripts use this function. [kobra_k88]
-//============================================================
-
-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) 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 "Go back to your Guild Castle.",M_Enter,"Cancel.",-;
- return;
-
- M_Enter:
- 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.2
+//===== 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
+//===== Additional Comments: =================================
+//= v1.2: All Guild flags scripts use this function. [kobra_k88]
+//============================================================
+
+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) 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 "Go back to your Guild Castle.",M_Enter,"Cancel.",-;
+ return;
+
+ M_Enter:
+ warp getarg(1)+".gat",getarg(2),getarg(3);
+ return;
+}
diff --git a/npc/guild/gldfunc_kafra.txt b/npc/guild/gldfunc_kafra.txt
index f70c62af4..df96573bc 100644
--- a/npc/guild/gldfunc_kafra.txt
+++ b/npc/guild/gldfunc_kafra.txt
@@ -1,37 +1,37 @@
-//===== eAthena Script =======================================
-//= War of Emperium Kafras Function
-//===== 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: =========================================
-//= 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]
-//============================================================
-
-function script F_GKafra {
- cutin "kafra_01",2;
- set @GID, GetCastleData(getarg(0)+".gat",1);
- if (getcharid(2) == @GID) 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;
- 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.2
+//===== 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]
+//============================================================
+
+function script F_GKafra {
+ cutin "kafra_01",2;
+ set @GID, GetCastleData(getarg(0)+".gat",1);
+ if (getcharid(2) == @GID) 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;
+ end;
+}
diff --git a/npc/guild/gldfunc_manager.txt b/npc/guild/gldfunc_manager.txt
index 7b192a96d..bbf913b8a 100644
--- a/npc/guild/gldfunc_manager.txt
+++ b/npc/guild/gldfunc_manager.txt
@@ -1,429 +1,429 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Manager Function
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//===== Current Version: =====================================
-//= 1.2b
-//===== 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, gaurdian scripts etc.
-//===== Additional Comments: =================================
-//= v1.2: All Guild manager scripts use this function. Optimized
-//= Comerce and Defense investment. [kobra_k88]
-//= v1.2a Function now returns to script that called it.
-//= Added disablenpc line to surrender castle option to remove kafra
-//= upon surrender.[kobra_k88]
-//= v1.2b U can't surrender the base during WOE [Lupus]
-//============================================================
-
-
-
-//==============================================
-function script F_GldManager {
-
- set @GID, GetCastleData(getarg(1)+".gat",1);
- if (strcharinfo(0) == getguildmaster(@GID)) goto L_Start;
- if (@GID == 0) goto L_NotOwn;
- if (getcharid(2) == @GID) goto L_Mem;
-
-L_NotMem:
- mes "[ "+getarg(0)+" ]";
- 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;
-
-L_NotOwn:
- mes "[ "+getarg(0)+" ]";
- mes "I am waiting for my master. Brave adventurer, follow your destiny!";
- return 0;
-
-L_Mem:
- mes "[ "+getarg(0)+" ]";
- mes "You're not ^5533FF" + getguildmaster(@GID) + "^000000! I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command only";
- return 0;
-
-L_Start:
- mes "[ "+getarg(0)+" ]";
- mes "Welcome Master ^5533FF" + getguildmaster(@GID) + "^000000 ! I will assist you in any way I can!";
- next;
- menu "Guild Base Briefing",M_Base, "Commerce Investment",M_Comrc, "Defence Investment",M_Def, "Guardian Installation",M_Gaurd,
- "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Surrender Guild Base",M_Sur, "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) goto L_MaxTimesC;
- if(@Economy >= 100) goto L_MaxInvesC;
- 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";
- if(@TriggerE == 0) mes "The needed investment amount is ^5533FF" + @eco_invest + "^000000 zeny.";
- if(@TriggerE == 1) set @eco_invest,@eco_invest*4;
- if(@TriggerE == 1) 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;
-
- if(Zeny < @eco_invest) goto sL_NoZenyC;
- set Zeny,Zeny-@eco_invest;
- SetCastleData getarg(1)+".gat",4,@TriggerE+1;
- SetCastleData getarg(1)+".gat",2,@Economy+1;
- mes "[ "+getarg(0)+" ]";
- mes "You have invested successfully.";
- return 0;
-
- sL_NoZenyC:
- mes "[ "+getarg(0)+" ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- return 0;
- L_MaxTimesC:
- 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;
- L_MaxInvestC:
- mes "[ "+getarg(0)+" ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- 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) goto L_MaxTimesD;
- if(@Defence >= 100) goto L_MaxInvestD;
- 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";
- if(@TriggerD == 0) mes "The needed investment amount is ^5533FF" + @def_invest + "^000000 zeny.";
- if(@TriggerD == 1) set @def_invest,@def_invest*4;
- if(@TriggerD == 1) 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;
-
- if(Zeny < @def_invest) goto sL_NoZenyD;
- set Zeny,Zeny-@def_invest;
- SetCastleData getarg(1)+".gat",5,@TriggerD+1;
- SetCastleData getarg(1)+".gat",3,@Defence+1;
- mes "[ "+getarg(0)+" ]";
- mes "You have invested successfully.";
- return 0;
-
- sL_NoZenyD:
- mes "[ "+getarg(0)+" ]";
- mes "Master, you do not have enough money to invest in Defence. Defence investment has been cancelled.";
- return 0;
- L_MaxTimesD:
- 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;
- L_MaxInvestD:
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- return 0;
-
- //=========================
- M_Gaurd:
- //=========
- if (getgdskilllv(@GID,10002) == 0) goto L_NoSkGuard;
- 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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ "+getarg(0)+" ]";
- 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) goto sL_NoZenyG;
- set Zeny,Zeny-10000;
- SetCastleData getarg(1)+".gat",@GDnum,1;
- SetCastleData getarg(1)+".gat",@GDnum2,@GuardianHP;
- return 1;
-
- sL_NoZenyG:
- mes "[ "+getarg(0)+" ]";
- mes "I'm sorry Master, but you do not have enough zeny for a Guardian.";
- return 0;
- L_NoSkGuard:
- mes "[ "+getarg(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;
- L_GotGuard:
- mes "[ "+getarg(0)+" ]";
- mes "Excuse me Master, but that guardian has already been installed.....";
- emotion 4;
- return 0;
-
- //===========================
- M_Kaf:
- //======
- mes "[ "+getarg(0)+" ]";
- if (GetCastleData(getarg(1)+".gat",9) == 1) goto L_Dismiss;
- if (getgdskilllv(@GID,10001) == 0) goto L_NoSkKaf;
-
- 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) goto sL_NoZenyK;
- 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;
-
- sL_NoZenyK:
- mes "Master, you do not have enough money to employ a Kafra. Employment has been cancelled.";
- 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;
-
- L_NoSkKaf:
- 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;
-
- //=========================
- 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_Sur:
- //=======
- mes "[ "+getarg(0)+" ]";
- emotion 19;
- if(agitcheck(0) == 0) goto L_No_WOE;
- mes "Master.... don't you know that we can't give up this guild base during the War Of Emperium?!!";
- close;
- return 0;
- L_No_WOE:
- mes "Master.... Do you really want to give up this guild base?? It is not worth it master!!! Please reconsider, master!!";
-
- next;
- menu "Surrender Guild Base",-, "Cancel",sM_SurEnd;
-
- mes "[ "+getarg(0)+" ]";
- mes "Master, please reconsider...!!";
- emotion 16;
- next;
- menu "Surrender Guild Base",-, "Cancel",sM_SurEnd;
-
- mes "[ "+getarg(0)+" ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- disablenpc "Kafra Service#"+getarg(4);
- set @i, 0;
- L_Loop:
- set @i, @i + 1;
- SetCastleData getarg(1)+".gat",@i,0;
- if(@i < 25) goto L_Loop;
-
- Announce "[" + GetGuildName(@GID) + "] has surrendered the Guild Castle [" + GetCastleName(getarg(1)+".gat") + "]",0;
- MapRespawnGuildID getarg(1)+".gat",GetCastleData(getarg(1)+".gat",1),7;
- return 0;
- sM_SurEnd:
- mes "[ "+getarg(0)+" ]";
- mes "I knew it master!! Please, don't scare me like that again.";
- emotion 33;
- 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)
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//===== Current Version: =====================================
+//= 1.2b
+//===== 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, gaurdian scripts etc.
+//===== Additional Comments: =================================
+//= v1.2: All Guild manager scripts use this function. Optimized
+//= Comerce and Defense investment. [kobra_k88]
+//= v1.2a Function now returns to script that called it.
+//= Added disablenpc line to surrender castle option to remove kafra
+//= upon surrender.[kobra_k88]
+//= v1.2b U can't surrender the base during WOE [Lupus]
+//============================================================
+
+
+
+//==============================================
+function script F_GldManager {
+
+ set @GID, GetCastleData(getarg(1)+".gat",1);
+ if (strcharinfo(0) == getguildmaster(@GID)) goto L_Start;
+ if (@GID == 0) goto L_NotOwn;
+ if (getcharid(2) == @GID) goto L_Mem;
+
+L_NotMem:
+ mes "[ "+getarg(0)+" ]";
+ 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;
+
+L_NotOwn:
+ mes "[ "+getarg(0)+" ]";
+ mes "I am waiting for my master. Brave adventurer, follow your destiny!";
+ return 0;
+
+L_Mem:
+ mes "[ "+getarg(0)+" ]";
+ mes "You're not ^5533FF" + getguildmaster(@GID) + "^000000! I am here to follow ^5533FF" + getguildmaster(@GID) + "^000000's command only";
+ return 0;
+
+L_Start:
+ mes "[ "+getarg(0)+" ]";
+ mes "Welcome Master ^5533FF" + getguildmaster(@GID) + "^000000 ! I will assist you in any way I can!";
+ next;
+ menu "Guild Base Briefing",M_Base, "Commerce Investment",M_Comrc, "Defence Investment",M_Def, "Guardian Installation",M_Gaurd,
+ "Kafra Service Employment / Dismissal",M_Kaf, "Enter Treasure Room",M_Treas, "Surrender Guild Base",M_Sur, "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) goto L_MaxTimesC;
+ if(@Economy >= 100) goto L_MaxInvesC;
+ 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";
+ if(@TriggerE == 0) mes "The needed investment amount is ^5533FF" + @eco_invest + "^000000 zeny.";
+ if(@TriggerE == 1) set @eco_invest,@eco_invest*4;
+ if(@TriggerE == 1) 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;
+
+ if(Zeny < @eco_invest) goto sL_NoZenyC;
+ set Zeny,Zeny-@eco_invest;
+ SetCastleData getarg(1)+".gat",4,@TriggerE+1;
+ SetCastleData getarg(1)+".gat",2,@Economy+1;
+ mes "[ "+getarg(0)+" ]";
+ mes "You have invested successfully.";
+ return 0;
+
+ sL_NoZenyC:
+ mes "[ "+getarg(0)+" ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ return 0;
+ L_MaxTimesC:
+ 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;
+ L_MaxInvestC:
+ mes "[ "+getarg(0)+" ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ 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) goto L_MaxTimesD;
+ if(@Defence >= 100) goto L_MaxInvestD;
+ 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";
+ if(@TriggerD == 0) mes "The needed investment amount is ^5533FF" + @def_invest + "^000000 zeny.";
+ if(@TriggerD == 1) set @def_invest,@def_invest*4;
+ if(@TriggerD == 1) 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;
+
+ if(Zeny < @def_invest) goto sL_NoZenyD;
+ set Zeny,Zeny-@def_invest;
+ SetCastleData getarg(1)+".gat",5,@TriggerD+1;
+ SetCastleData getarg(1)+".gat",3,@Defence+1;
+ mes "[ "+getarg(0)+" ]";
+ mes "You have invested successfully.";
+ return 0;
+
+ sL_NoZenyD:
+ mes "[ "+getarg(0)+" ]";
+ mes "Master, you do not have enough money to invest in Defence. Defence investment has been cancelled.";
+ return 0;
+ L_MaxTimesD:
+ 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;
+ L_MaxInvestD:
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ return 0;
+
+ //=========================
+ M_Gaurd:
+ //=========
+ if (getgdskilllv(@GID,10002) == 0) goto L_NoSkGuard;
+ 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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ "+getarg(0)+" ]";
+ 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) goto sL_NoZenyG;
+ set Zeny,Zeny-10000;
+ SetCastleData getarg(1)+".gat",@GDnum,1;
+ SetCastleData getarg(1)+".gat",@GDnum2,@GuardianHP;
+ return 1;
+
+ sL_NoZenyG:
+ mes "[ "+getarg(0)+" ]";
+ mes "I'm sorry Master, but you do not have enough zeny for a Guardian.";
+ return 0;
+ L_NoSkGuard:
+ mes "[ "+getarg(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;
+ L_GotGuard:
+ mes "[ "+getarg(0)+" ]";
+ mes "Excuse me Master, but that guardian has already been installed.....";
+ emotion 4;
+ return 0;
+
+ //===========================
+ M_Kaf:
+ //======
+ mes "[ "+getarg(0)+" ]";
+ if (GetCastleData(getarg(1)+".gat",9) == 1) goto L_Dismiss;
+ if (getgdskilllv(@GID,10001) == 0) goto L_NoSkKaf;
+
+ 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) goto sL_NoZenyK;
+ 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;
+
+ sL_NoZenyK:
+ mes "Master, you do not have enough money to employ a Kafra. Employment has been cancelled.";
+ 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;
+
+ L_NoSkKaf:
+ 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;
+
+ //=========================
+ 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_Sur:
+ //=======
+ mes "[ "+getarg(0)+" ]";
+ emotion 19;
+ if(agitcheck(0) == 0) goto L_No_WOE;
+ mes "Master.... don't you know that we can't give up this guild base during the War Of Emperium?!!";
+ close;
+ return 0;
+ L_No_WOE:
+ mes "Master.... Do you really want to give up this guild base?? It is not worth it master!!! Please reconsider, master!!";
+
+ next;
+ menu "Surrender Guild Base",-, "Cancel",sM_SurEnd;
+
+ mes "[ "+getarg(0)+" ]";
+ mes "Master, please reconsider...!!";
+ emotion 16;
+ next;
+ menu "Surrender Guild Base",-, "Cancel",sM_SurEnd;
+
+ mes "[ "+getarg(0)+" ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ disablenpc "Kafra Service#"+getarg(4);
+ set @i, 0;
+ L_Loop:
+ set @i, @i + 1;
+ SetCastleData getarg(1)+".gat",@i,0;
+ if(@i < 25) goto L_Loop;
+
+ Announce "[" + GetGuildName(@GID) + "] has surrendered the Guild Castle [" + GetCastleName(getarg(1)+".gat") + "]",0;
+ MapRespawnGuildID getarg(1)+".gat",GetCastleData(getarg(1)+".gat",1),7;
+ return 0;
+ sM_SurEnd:
+ mes "[ "+getarg(0)+" ]";
+ mes "I knew it master!! Please, don't scare me like that again.";
+ emotion 33;
+ 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 2e6b85b07..187d80dd2 100644
--- a/npc/guild/gldfunc_treasure.txt
+++ b/npc/guild/gldfunc_treasure.txt
@@ -1,78 +1,78 @@
-//===== eAthena Script =======================================
-//= War of Emperium Guild Treasure Room Functions
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//= 1.1 by Akaru and ho|yAnge|X
-//===== Current Version: =====================================
-//= 1.2b
-//===== Compatible With: =====================================
-//= eAthena 0.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): $variable for number of boxes to spawn for specific castle
-//= arg(2): $variable to be used as a counter
-//= arg(4): $variable for box/monster id number.
-//= 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
-//= arg(10):
-//= 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: =================================
-//= v1.2 Treasure room Spawn, and Treasure room Switch scripts now use these functions.[kobra_k88]
-//= v1.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]
-//= v1.2b Added a check to allow un broken treasure chests to respawn after map server restart.[kobra_k88]
-//============================================================
-
-
-//================================================
-// Treasure Spawning Script
-//================================================
-
-function script F_GldTreas {
-
- if(getarg(10) == 1) goto TreasureSpawn;
- 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) return;
- if (GetCastleData(getarg(0)+".gat",1) == 0) return;
- 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
-
-TreasureSpawn:
- set getarg(4), getarg(5); //sets the box id variable = to the box id
- set $@temp, rand(4);
- if ($@temp > 2) set getarg(4), getarg(4) + 1;
- 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 TreasureSpawn;
- 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)
+//= 1.1 by Akaru and ho|yAnge|X
+//===== Current Version: =====================================
+//= 1.2b
+//===== Compatible With: =====================================
+//= eAthena 0.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): $variable for number of boxes to spawn for specific castle
+//= arg(2): $variable to be used as a counter
+//= arg(4): $variable for box/monster id number.
+//= 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
+//= arg(10):
+//= 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: =================================
+//= v1.2 Treasure room Spawn, and Treasure room Switch scripts now use these functions.[kobra_k88]
+//= v1.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]
+//= v1.2b Added a check to allow un broken treasure chests to respawn after map server restart.[kobra_k88]
+//============================================================
+
+
+//================================================
+// Treasure Spawning Script
+//================================================
+
+function script F_GldTreas {
+
+ if(getarg(10) == 1) goto TreasureSpawn;
+ 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) return;
+ if (GetCastleData(getarg(0)+".gat",1) == 0) return;
+ 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
+
+TreasureSpawn:
+ set getarg(4), getarg(5); //sets the box id variable = to the box id
+ set $@temp, rand(4);
+ if ($@temp > 2) set getarg(4), getarg(4) + 1;
+ 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 TreasureSpawn;
+ 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 8e8b779fc..52fd1dbab 100644
--- a/npc/guild/nguild/nguild_dunsw.txt
+++ b/npc/guild/nguild/nguild_dunsw.txt
@@ -1,39 +1,39 @@
-//===== eAthena Script =======================================
-//= War of Emperium Dungeon Switch for NGuild 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: =================================
-//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: ==================================================
+//= 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: =================================
+//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 75d2c1990..ee5b71255 100644
--- a/npc/guild/nguild/nguild_ev_agit.txt
+++ b/npc/guild/nguild/nguild_ev_agit.txt
@@ -1,107 +1,107 @@
-//===== eAthena Script =======================================
-//= War of Emperium - NGuild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-// Castle 1 ================================================================
-nguild_alde.gat,0,0,0 script Agit_N01 -1,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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: ==================================================
+//= jAthena (1.0)
+//= 1.1 by Akaru and ho|yAnge|
+//===== Current Version: =====================================
+//= 1.2
+//===== 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]
+//============================================================
+
+
+// Castle 1 ================================================================
+nguild_alde.gat,0,0,0 script Agit_N01 -1,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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_guardians.txt b/npc/guild/nguild/nguild_guardians.txt
index bed162100..98872d9f9 100644
--- a/npc/guild/nguild/nguild_guardians.txt
+++ b/npc/guild/nguild/nguild_guardians.txt
@@ -1,91 +1,91 @@
-//===== eAthena Script =======================================
-//= War of Emperium - nguild guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//===== 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: =================================
-//= 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: ==================================================
+//= holyAngelX (1.0)
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//===== 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: =================================
+//= 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 b5d6b2d3a..a302efece 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: ==================================================
-//= 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 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]
-//============================================================
-
-
-// Castle 1 ===============================================
-nguild_alde.gat,218,170,0 script Kafra Service#N01 117,{
- callfunc "F_GKafra", "nguild_alde", "Al De Baran";
- 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", "Geffen";
- 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", "Payon";
- 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: ==================================================
+//= 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 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]
+//============================================================
+
+
+// Castle 1 ===============================================
+nguild_alde.gat,218,170,0 script Kafra Service#N01 117,{
+ callfunc "F_GKafra", "nguild_alde", "Al De Baran";
+ 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", "Geffen";
+ 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", "Payon";
+ 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/old/aldeg_cas01.txt b/npc/guild/old/aldeg_cas01.txt
index d61a2d5c7..350e79f3c 100644
--- a/npc/guild/old/aldeg_cas01.txt
+++ b/npc/guild/old/aldeg_cas01.txt
@@ -1,675 +1,675 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas01 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-aldeg_cas01.gat,30,248,4 script Noisyubantian#a1-6::NoisyubantianNW 722,{
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (@GIDa1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- break;
-}
-
-aldeg_cas01.gat,30,246,4 duplicate(NoisyubantianNW) Noisyubantian#a1-7 722
-aldeg_cas01.gat,37,248,4 duplicate(NoisyubantianNW) Noisyubantian#a1-8 722
-aldeg_cas01.gat,37,246,4 duplicate(NoisyubantianNW) Noisyubantian#a1-9 722
-aldeg_cas01.gat,95,80,2 duplicate(NoisyubantianNW) Noisyubantian#a1-10 722
-aldeg_cas01.gat,95,59,2 duplicate(NoisyubantianNW) Noisyubantian#a1-11 722
-aldeg_cas01.gat,62,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-12 722
-aldeg_cas01.gat,70,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-13 722
-aldeg_cas01.gat,74,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-14 722
-aldeg_cas01.gat,62,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-15 722
-aldeg_cas01.gat,66,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-16 722
-aldeg_cas01.gat,70,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-17 722
-aldeg_cas01.gat,74,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-18 722
-aldeg_cas01.gat,203,150,4 duplicate(NoisyubantianNW) Noisyubantian#a1-19 722
-aldeg_cas01.gat,210,150,4 duplicate(NoisyubantianNW) Noisyubantian#a1-20 722
-
-//================================================
-// Kafra Service
-//================================================
-aldeg_cas01.gat,218,170,0 script Kafra Service#alde1 117,{
- cutin "kafra_01",2;
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (getcharid(2) == @GIDa1) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa1) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDa1) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "aldebaran.gat",132,103;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("aldeg_cas01.gat",9) == 1) break;
- disablenpc "Kafra Service#alde1";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-aldeg_cas01.gat,123,223,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (getcharid(2) != @GIDa1) goto L1n;
- warp "gld_dun02.gat",32,122;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-aldeg_cas01.gat,218,175,0 script Arl Fredo 55,{
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (@GIDa1 == 0) goto LStart;
- if (getcharid(2) != @GIDa1) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDa1)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Arl Fredo ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDa1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa1) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Arl Fredo ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Arl Fredo ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDa1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Arl Fredo ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDa1) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Arl Fredo ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas01.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("aldeg_cas01.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("aldeg_cas01.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("aldeg_cas01.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("aldeg_cas01.gat",4);
- set @Economy,GetCastleData("aldeg_cas01.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Arl Fredo ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Arl Fredo ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Arl Fredo ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas01.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas01.gat",2,@Economy+1;
- mes "[ Arl Fredo ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Arl Fredo ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Arl Fredo ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas01.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas01.gat",2,@Economy+1;
- mes "[ Arl Fredo ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Arl Fredo ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Arl Fredo ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("aldeg_cas01.gat",5);
- set @Defence,GetCastleData("aldeg_cas01.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Arl Fredo ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Arl Fredo ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Arl Fredo ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas01.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas01.gat",3,@Defence+1;
- mes "[ Arl Fredo ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Arl Fredo ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Arl Fredo ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas01.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas01.gat",3,@Defence+1;
- mes "[ Arl Fredo ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Arl Fredo ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Arl Fredo ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("aldeg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Arl Fredo ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("aldeg_cas01.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("aldeg_cas01.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("aldeg_cas01.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("aldeg_cas01.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("aldeg_cas01.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("aldeg_cas01.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("aldeg_cas01.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("aldeg_cas01.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Arl Fredo ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Arl Fredo ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "aldeg_cas01.gat",@GDnum,1;
- SetCastleData "aldeg_cas01.gat",@GDnum2,@GuardianHP;
- 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, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Arl Fredo ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Arl Fredo ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Arl Fredo ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("aldeg_cas01.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Arl Fredo ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Arl Fredo ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Arl Fredo ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#alde1";
- SetCastleData "aldeg_cas01.gat",9,1;
- mes "[ Arl Fredo ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Arl Fredo ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to alde again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Arl Fredo ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Arl Fredo ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#alde1";
- SetCastleData "aldeg_cas01.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Arl Fredo ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Arl Fredo ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Arl Fredo ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Arl Fredo ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "aldeg_cas01",119,223;
- L6_1:
- mes "[ Arl Fredo ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Arl Fredo ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Arl Fredo ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Arl Fredo ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "aldeg_cas01.gat",1,0;
- SetCastleData "aldeg_cas01.gat",2,0;
- SetCastleData "aldeg_cas01.gat",3,0;
- SetCastleData "aldeg_cas01.gat",4,0;
- SetCastleData "aldeg_cas01.gat",5,0;
- SetCastleData "aldeg_cas01.gat",6,0;
- SetCastleData "aldeg_cas01.gat",7,0;
- SetCastleData "aldeg_cas01.gat",8,0;
- SetCastleData "aldeg_cas01.gat",9,0;
- SetCastleData "aldeg_cas01.gat",10,0;
- SetCastleData "aldeg_cas01.gat",11,0;
- SetCastleData "aldeg_cas01.gat",12,0;
- SetCastleData "aldeg_cas01.gat",13,0;
- SetCastleData "aldeg_cas01.gat",14,0;
- SetCastleData "aldeg_cas01.gat",15,0;
- SetCastleData "aldeg_cas01.gat",16,0;
- SetCastleData "aldeg_cas01.gat",17,0;
- SetCastleData "aldeg_cas01.gat",18,0;
- SetCastleData "aldeg_cas01.gat",19,0;
- SetCastleData "aldeg_cas01.gat",20,0;
- SetCastleData "aldeg_cas01.gat",21,0;
- SetCastleData "aldeg_cas01.gat",22,0;
- SetCastleData "aldeg_cas01.gat",23,0;
- SetCastleData "aldeg_cas01.gat",24,0;
- SetCastleData "aldeg_cas01.gat",25,0;
- Announce "[" + GetGuildName(@GIDa1) + "] has surrendered Agit [" + GetCastleName("aldeg_cas01.gat") + "]",0;
- MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),7;
- break;
- L7_2:
- mes "[ Arl Fredo ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas01 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+aldeg_cas01.gat,30,248,4 script Noisyubantian#a1-6::NoisyubantianNW 722,{
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (@GIDa1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ break;
+}
+
+aldeg_cas01.gat,30,246,4 duplicate(NoisyubantianNW) Noisyubantian#a1-7 722
+aldeg_cas01.gat,37,248,4 duplicate(NoisyubantianNW) Noisyubantian#a1-8 722
+aldeg_cas01.gat,37,246,4 duplicate(NoisyubantianNW) Noisyubantian#a1-9 722
+aldeg_cas01.gat,95,80,2 duplicate(NoisyubantianNW) Noisyubantian#a1-10 722
+aldeg_cas01.gat,95,59,2 duplicate(NoisyubantianNW) Noisyubantian#a1-11 722
+aldeg_cas01.gat,62,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-12 722
+aldeg_cas01.gat,70,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-13 722
+aldeg_cas01.gat,74,75,2 duplicate(NoisyubantianNW) Noisyubantian#a1-14 722
+aldeg_cas01.gat,62,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-15 722
+aldeg_cas01.gat,66,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-16 722
+aldeg_cas01.gat,70,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-17 722
+aldeg_cas01.gat,74,64,2 duplicate(NoisyubantianNW) Noisyubantian#a1-18 722
+aldeg_cas01.gat,203,150,4 duplicate(NoisyubantianNW) Noisyubantian#a1-19 722
+aldeg_cas01.gat,210,150,4 duplicate(NoisyubantianNW) Noisyubantian#a1-20 722
+
+//================================================
+// Kafra Service
+//================================================
+aldeg_cas01.gat,218,170,0 script Kafra Service#alde1 117,{
+ cutin "kafra_01",2;
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (getcharid(2) == @GIDa1) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa1) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDa1) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "aldebaran.gat",132,103;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("aldeg_cas01.gat",9) == 1) break;
+ disablenpc "Kafra Service#alde1";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+aldeg_cas01.gat,123,223,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (getcharid(2) != @GIDa1) goto L1n;
+ warp "gld_dun02.gat",32,122;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+aldeg_cas01.gat,218,175,0 script Arl Fredo 55,{
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (@GIDa1 == 0) goto LStart;
+ if (getcharid(2) != @GIDa1) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDa1)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Arl Fredo ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDa1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa1) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Arl Fredo ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Arl Fredo ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDa1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Arl Fredo ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDa1) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Arl Fredo ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas01.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("aldeg_cas01.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("aldeg_cas01.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("aldeg_cas01.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("aldeg_cas01.gat",4);
+ set @Economy,GetCastleData("aldeg_cas01.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Arl Fredo ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Arl Fredo ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Arl Fredo ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas01.gat",2,@Economy+1;
+ mes "[ Arl Fredo ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Arl Fredo ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Arl Fredo ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas01.gat",2,@Economy+1;
+ mes "[ Arl Fredo ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Arl Fredo ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Arl Fredo ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("aldeg_cas01.gat",5);
+ set @Defence,GetCastleData("aldeg_cas01.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Arl Fredo ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Arl Fredo ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Arl Fredo ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas01.gat",3,@Defence+1;
+ mes "[ Arl Fredo ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Arl Fredo ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Arl Fredo ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas01.gat",3,@Defence+1;
+ mes "[ Arl Fredo ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Arl Fredo ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Arl Fredo ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("aldeg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Arl Fredo ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("aldeg_cas01.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("aldeg_cas01.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("aldeg_cas01.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("aldeg_cas01.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("aldeg_cas01.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("aldeg_cas01.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("aldeg_cas01.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("aldeg_cas01.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Arl Fredo ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Arl Fredo ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "aldeg_cas01.gat",@GDnum,1;
+ SetCastleData "aldeg_cas01.gat",@GDnum2,@GuardianHP;
+ 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, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Arl Fredo ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Arl Fredo ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Arl Fredo ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("aldeg_cas01.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Arl Fredo ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Arl Fredo ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Arl Fredo ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#alde1";
+ SetCastleData "aldeg_cas01.gat",9,1;
+ mes "[ Arl Fredo ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Arl Fredo ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to alde again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Arl Fredo ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Arl Fredo ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#alde1";
+ SetCastleData "aldeg_cas01.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Arl Fredo ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Arl Fredo ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Arl Fredo ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Arl Fredo ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "aldeg_cas01",119,223;
+ L6_1:
+ mes "[ Arl Fredo ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Arl Fredo ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Arl Fredo ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Arl Fredo ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "aldeg_cas01.gat",1,0;
+ SetCastleData "aldeg_cas01.gat",2,0;
+ SetCastleData "aldeg_cas01.gat",3,0;
+ SetCastleData "aldeg_cas01.gat",4,0;
+ SetCastleData "aldeg_cas01.gat",5,0;
+ SetCastleData "aldeg_cas01.gat",6,0;
+ SetCastleData "aldeg_cas01.gat",7,0;
+ SetCastleData "aldeg_cas01.gat",8,0;
+ SetCastleData "aldeg_cas01.gat",9,0;
+ SetCastleData "aldeg_cas01.gat",10,0;
+ SetCastleData "aldeg_cas01.gat",11,0;
+ SetCastleData "aldeg_cas01.gat",12,0;
+ SetCastleData "aldeg_cas01.gat",13,0;
+ SetCastleData "aldeg_cas01.gat",14,0;
+ SetCastleData "aldeg_cas01.gat",15,0;
+ SetCastleData "aldeg_cas01.gat",16,0;
+ SetCastleData "aldeg_cas01.gat",17,0;
+ SetCastleData "aldeg_cas01.gat",18,0;
+ SetCastleData "aldeg_cas01.gat",19,0;
+ SetCastleData "aldeg_cas01.gat",20,0;
+ SetCastleData "aldeg_cas01.gat",21,0;
+ SetCastleData "aldeg_cas01.gat",22,0;
+ SetCastleData "aldeg_cas01.gat",23,0;
+ SetCastleData "aldeg_cas01.gat",24,0;
+ SetCastleData "aldeg_cas01.gat",25,0;
+ Announce "[" + GetGuildName(@GIDa1) + "] has surrendered Agit [" + GetCastleName("aldeg_cas01.gat") + "]",0;
+ MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Arl Fredo ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/aldeg_cas02.txt b/npc/guild/old/aldeg_cas02.txt
index cfe9c8071..5b673995c 100644
--- a/npc/guild/old/aldeg_cas02.txt
+++ b/npc/guild/old/aldeg_cas02.txt
@@ -1,676 +1,676 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas02 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-aldeg_cas02.gat,82,71,2 script Hohensyubangawoo#a2-4::HohensyubangawooNW 722,{
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (@GIDa2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- break;
-}
-
-aldeg_cas02.gat,67,30,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-5 722
-aldeg_cas02.gat,183,140,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-6 722
-aldeg_cas02.gat,212,152,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-7 722
-aldeg_cas02.gat,108,39,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-8 722
-aldeg_cas02.gat,57,213,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-9 722
-aldeg_cas02.gat,91,181,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-10 722
-aldeg_cas02.gat,103,53,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-11 722
-aldeg_cas02.gat,73,53,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-12 722
-aldeg_cas02.gat,63,41,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-13 722
-aldeg_cas02.gat,229,6,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-14 722
-aldeg_cas02.gat,230,40,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-15 722
-aldeg_cas02.gat,197,40,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-16 722
-aldeg_cas02.gat,32,213,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-17 722
-aldeg_cas02.gat,88,180,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-18 722
-aldeg_cas02.gat,121,29,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-19 722
-
-//================================================
-// Kafra Service
-//================================================
-aldeg_cas02.gat,84,74,0 script Kafra Service#alde2 117,{
- cutin "kafra_01",2;
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (getcharid(2) == @GIDa2) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa2) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDa2) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "aldebaran.gat",132,103;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("aldeg_cas02.gat",9) == 1) break;
- disablenpc "Kafra Service#alde2";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-aldeg_cas02.gat,194,136,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (getcharid(2) != @GIDa2) goto L1n;
- warp "gld_dun02.gat",79,30;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-aldeg_cas02.gat,78,74,0 script Chen Lee 55,{
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (@GIDa2 == 0) goto LStart;
- if (getcharid(2) != @GIDa2) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDa2)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Chen Lee ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDa2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa2) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Chen Lee ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Chen Lee ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDa2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Chen Lee ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDa2) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Chen Lee ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas02.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("aldeg_cas02.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("aldeg_cas02.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("aldeg_cas02.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("aldeg_cas02.gat",4);
- set @Economy,GetCastleData("aldeg_cas02.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas02.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas02.gat",2,@Economy+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas02.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas02.gat",2,@Economy+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Chen Lee ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("aldeg_cas02.gat",5);
- set @Defence,GetCastleData("aldeg_cas02.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas02.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas02.gat",3,@Defence+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas02.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas02.gat",3,@Defence+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Chen Lee ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("aldeg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Chen Lee ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("aldeg_cas02.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("aldeg_cas02.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("aldeg_cas02.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("aldeg_cas02.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("aldeg_cas02.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("aldeg_cas02.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("aldeg_cas02.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("aldeg_cas02.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Chen Lee ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "aldeg_cas02.gat",@GDnum,1;
- SetCastleData "aldeg_cas02.gat",@GDnum2,@GuardianHP;
- 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;
-L4Error:
- mes "[ Chen Lee ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Chen Lee ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("aldeg_cas02.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Chen Lee ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Chen Lee ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#alde2";
- SetCastleData "aldeg_cas02.gat",9,1;
- mes "[ Chen Lee ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Chen Lee ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to alde again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Chen Lee ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Chen Lee ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#alde2";
- SetCastleData "aldeg_cas02.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Chen Lee ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Chen Lee ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Chen Lee ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Chen Lee ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "aldeg_cas02",135,231;
- L6_1:
- mes "[ Chen Lee ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Chen Lee ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Chen Lee ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Chen Lee ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "aldeg_cas02.gat",1,0;
- SetCastleData "aldeg_cas02.gat",2,0;
- SetCastleData "aldeg_cas02.gat",3,0;
- SetCastleData "aldeg_cas02.gat",4,0;
- SetCastleData "aldeg_cas02.gat",5,0;
- SetCastleData "aldeg_cas02.gat",6,0;
- SetCastleData "aldeg_cas02.gat",7,0;
- SetCastleData "aldeg_cas02.gat",8,0;
- SetCastleData "aldeg_cas02.gat",9,0;
- SetCastleData "aldeg_cas02.gat",10,0;
- SetCastleData "aldeg_cas02.gat",11,0;
- SetCastleData "aldeg_cas02.gat",12,0;
- SetCastleData "aldeg_cas02.gat",13,0;
- SetCastleData "aldeg_cas02.gat",14,0;
- SetCastleData "aldeg_cas02.gat",15,0;
- SetCastleData "aldeg_cas02.gat",16,0;
- SetCastleData "aldeg_cas02.gat",17,0;
- SetCastleData "aldeg_cas02.gat",18,0;
- SetCastleData "aldeg_cas02.gat",19,0;
- SetCastleData "aldeg_cas02.gat",20,0;
- SetCastleData "aldeg_cas02.gat",21,0;
- SetCastleData "aldeg_cas02.gat",22,0;
- SetCastleData "aldeg_cas02.gat",23,0;
- SetCastleData "aldeg_cas02.gat",24,0;
- SetCastleData "aldeg_cas02.gat",25,0;
- Announce "[" + GetGuildName(@GIDa2) + "] has surrendered Agit [" + GetCastleName("aldeg_cas02.gat") + "]",0;
- MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),7;
- break;
- L7_2:
- mes "[ Chen Lee ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas02 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+aldeg_cas02.gat,82,71,2 script Hohensyubangawoo#a2-4::HohensyubangawooNW 722,{
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (@GIDa2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ break;
+}
+
+aldeg_cas02.gat,67,30,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-5 722
+aldeg_cas02.gat,183,140,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-6 722
+aldeg_cas02.gat,212,152,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-7 722
+aldeg_cas02.gat,108,39,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-8 722
+aldeg_cas02.gat,57,213,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-9 722
+aldeg_cas02.gat,91,181,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-10 722
+aldeg_cas02.gat,103,53,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-11 722
+aldeg_cas02.gat,73,53,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-12 722
+aldeg_cas02.gat,63,41,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-13 722
+aldeg_cas02.gat,229,6,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-14 722
+aldeg_cas02.gat,230,40,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-15 722
+aldeg_cas02.gat,197,40,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-16 722
+aldeg_cas02.gat,32,213,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-17 722
+aldeg_cas02.gat,88,180,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-18 722
+aldeg_cas02.gat,121,29,2 duplicate(HohensyubangawooNW) Hohensyubangawoo#a2-19 722
+
+//================================================
+// Kafra Service
+//================================================
+aldeg_cas02.gat,84,74,0 script Kafra Service#alde2 117,{
+ cutin "kafra_01",2;
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (getcharid(2) == @GIDa2) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa2) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDa2) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "aldebaran.gat",132,103;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("aldeg_cas02.gat",9) == 1) break;
+ disablenpc "Kafra Service#alde2";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+aldeg_cas02.gat,194,136,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (getcharid(2) != @GIDa2) goto L1n;
+ warp "gld_dun02.gat",79,30;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+aldeg_cas02.gat,78,74,0 script Chen Lee 55,{
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (@GIDa2 == 0) goto LStart;
+ if (getcharid(2) != @GIDa2) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDa2)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Chen Lee ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDa2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa2) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Chen Lee ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Chen Lee ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDa2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Chen Lee ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDa2) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Chen Lee ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas02.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("aldeg_cas02.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("aldeg_cas02.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("aldeg_cas02.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("aldeg_cas02.gat",4);
+ set @Economy,GetCastleData("aldeg_cas02.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas02.gat",2,@Economy+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas02.gat",2,@Economy+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Chen Lee ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("aldeg_cas02.gat",5);
+ set @Defence,GetCastleData("aldeg_cas02.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas02.gat",3,@Defence+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas02.gat",3,@Defence+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Chen Lee ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("aldeg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Chen Lee ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("aldeg_cas02.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("aldeg_cas02.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("aldeg_cas02.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("aldeg_cas02.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("aldeg_cas02.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("aldeg_cas02.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("aldeg_cas02.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("aldeg_cas02.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Chen Lee ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "aldeg_cas02.gat",@GDnum,1;
+ SetCastleData "aldeg_cas02.gat",@GDnum2,@GuardianHP;
+ 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;
+L4Error:
+ mes "[ Chen Lee ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Chen Lee ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("aldeg_cas02.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Chen Lee ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Chen Lee ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#alde2";
+ SetCastleData "aldeg_cas02.gat",9,1;
+ mes "[ Chen Lee ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Chen Lee ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to alde again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Chen Lee ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Chen Lee ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#alde2";
+ SetCastleData "aldeg_cas02.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Chen Lee ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Chen Lee ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Chen Lee ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Chen Lee ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "aldeg_cas02",135,231;
+ L6_1:
+ mes "[ Chen Lee ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Chen Lee ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Chen Lee ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Chen Lee ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "aldeg_cas02.gat",1,0;
+ SetCastleData "aldeg_cas02.gat",2,0;
+ SetCastleData "aldeg_cas02.gat",3,0;
+ SetCastleData "aldeg_cas02.gat",4,0;
+ SetCastleData "aldeg_cas02.gat",5,0;
+ SetCastleData "aldeg_cas02.gat",6,0;
+ SetCastleData "aldeg_cas02.gat",7,0;
+ SetCastleData "aldeg_cas02.gat",8,0;
+ SetCastleData "aldeg_cas02.gat",9,0;
+ SetCastleData "aldeg_cas02.gat",10,0;
+ SetCastleData "aldeg_cas02.gat",11,0;
+ SetCastleData "aldeg_cas02.gat",12,0;
+ SetCastleData "aldeg_cas02.gat",13,0;
+ SetCastleData "aldeg_cas02.gat",14,0;
+ SetCastleData "aldeg_cas02.gat",15,0;
+ SetCastleData "aldeg_cas02.gat",16,0;
+ SetCastleData "aldeg_cas02.gat",17,0;
+ SetCastleData "aldeg_cas02.gat",18,0;
+ SetCastleData "aldeg_cas02.gat",19,0;
+ SetCastleData "aldeg_cas02.gat",20,0;
+ SetCastleData "aldeg_cas02.gat",21,0;
+ SetCastleData "aldeg_cas02.gat",22,0;
+ SetCastleData "aldeg_cas02.gat",23,0;
+ SetCastleData "aldeg_cas02.gat",24,0;
+ SetCastleData "aldeg_cas02.gat",25,0;
+ Announce "[" + GetGuildName(@GIDa2) + "] has surrendered Agit [" + GetCastleName("aldeg_cas02.gat") + "]",0;
+ MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Chen Lee ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/aldeg_cas03.txt b/npc/guild/old/aldeg_cas03.txt
index 92e61414d..987b017e6 100644
--- a/npc/guild/old/aldeg_cas03.txt
+++ b/npc/guild/old/aldeg_cas03.txt
@@ -1,679 +1,679 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas03 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-aldeg_cas03.gat,176,175,2 script Nyirenverk#a3-4::NyirenverkNW 722,{
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (@GIDa3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- break;
-}
-
-aldeg_cas03.gat,85,103,2 duplicate(NyirenverkNW) Nyirenverk#a3-5 722
-aldeg_cas03.gat,77,115,2 duplicate(NyirenverkNW) Nyirenverk#a3-6 722
-aldeg_cas03.gat,77,215,2 duplicate(NyirenverkNW) Nyirenverk#a3-7 722
-aldeg_cas03.gat,112,107,2 duplicate(NyirenverkNW) Nyirenverk#a3-8 722
-aldeg_cas03.gat,112,117,2 duplicate(NyirenverkNW) Nyirenverk#a3-9 722
-aldeg_cas03.gat,69,71,2 duplicate(NyirenverkNW) Nyirenverk#a3-10 722
-aldeg_cas03.gat,91,69,2 duplicate(NyirenverkNW) Nyirenverk#a3-11 722
-aldeg_cas03.gat,108,60,2 duplicate(NyirenverkNW) Nyirenverk#a3-12 722
-aldeg_cas03.gat,121,73,2 duplicate(NyirenverkNW) Nyirenverk#a3-13 722
-aldeg_cas03.gat,121,73,2 duplicate(NyirenverkNW) Nyirenverk#a3-14 722
-aldeg_cas03.gat,75,102,2 duplicate(NyirenverkNW) Nyirenverk#a3-15 722
-aldeg_cas03.gat,199,169,2 duplicate(NyirenverkNW) Nyirenverk#a3-16 722
-aldeg_cas03.gat,181,179,2 duplicate(NyirenverkNW) Nyirenverk#a3-17 722
-aldeg_cas03.gat,192,44,2 duplicate(NyirenverkNW) Nyirenverk#a3-18 722
-aldeg_cas03.gat,88,108,2 duplicate(NyirenverkNW) Nyirenverk#a3-19 722
-aldeg_cas03.gat,208,145,2 duplicate(NyirenverkNW) Nyirenverk#a3-20 722
-aldeg_cas03.gat,207,75,2 duplicate(NyirenverkNW) Nyirenverk#a3-21 722
-aldeg_cas03.gat,96,62,2 duplicate(NyirenverkNW) Nyirenverk#a3-22 722
-
-//================================================
-// Kafra Service
-//================================================
-aldeg_cas03.gat,118,76,0 script Kafra Service#alde3 117,{
- cutin "kafra_01",2;
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (getcharid(2) == @GIDa3) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa3) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDa3) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "aldebaran.gat",132,103;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("aldeg_cas03.gat",9) == 1) break;
- disablenpc "Kafra Service#alde3";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-aldeg_cas03.gat,200,177,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (getcharid(2) != @GIDa3) goto L1n;
- warp "gld_dun02.gat",165,38;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-aldeg_cas03.gat,110,118,0 script Chen Lee 55,{
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (@GIDa3 == 0) goto LStart;
- if (getcharid(2) != @GIDa3) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDa3)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Chen Lee ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDa3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa3) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Chen Lee ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Chen Lee ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDa3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Chen Lee ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDa3) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Chen Lee ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas03.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("aldeg_cas03.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("aldeg_cas03.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("aldeg_cas03.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("aldeg_cas03.gat",4);
- set @Economy,GetCastleData("aldeg_cas03.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas03.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas03.gat",2,@Economy+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Chen Lee ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas03.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas03.gat",2,@Economy+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Chen Lee ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("aldeg_cas03.gat",5);
- set @Defence,GetCastleData("aldeg_cas03.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas03.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas03.gat",3,@Defence+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Chen Lee ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas03.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas03.gat",3,@Defence+1;
- mes "[ Chen Lee ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Chen Lee ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("aldeg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Chen Lee ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("aldeg_cas03.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("aldeg_cas03.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("aldeg_cas03.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("aldeg_cas03.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("aldeg_cas03.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("aldeg_cas03.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("aldeg_cas03.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("aldeg_cas03.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Chen Lee ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Chen Lee ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "aldeg_cas03.gat",@GDnum,1;
- SetCastleData "aldeg_cas03.gat",@GDnum2,@GuardianHP;
- 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;
-L4Error:
- mes "[ Chen Lee ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Chen Lee ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("aldeg_cas03.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Chen Lee ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Chen Lee ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Chen Lee ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#alde3";
- SetCastleData "aldeg_cas03.gat",9,1;
- mes "[ Chen Lee ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Chen Lee ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to alde again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Chen Lee ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Chen Lee ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#alde3";
- SetCastleData "aldeg_cas03.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Chen Lee ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Chen Lee ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Chen Lee ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Chen Lee ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "aldeg_cas03",225,269;
- L6_1:
- mes "[ Chen Lee ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Chen Lee ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Chen Lee ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Chen Lee ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "aldeg_cas03.gat",1,0;
- SetCastleData "aldeg_cas03.gat",2,0;
- SetCastleData "aldeg_cas03.gat",3,0;
- SetCastleData "aldeg_cas03.gat",4,0;
- SetCastleData "aldeg_cas03.gat",5,0;
- SetCastleData "aldeg_cas03.gat",6,0;
- SetCastleData "aldeg_cas03.gat",7,0;
- SetCastleData "aldeg_cas03.gat",8,0;
- SetCastleData "aldeg_cas03.gat",9,0;
- SetCastleData "aldeg_cas03.gat",10,0;
- SetCastleData "aldeg_cas03.gat",11,0;
- SetCastleData "aldeg_cas03.gat",12,0;
- SetCastleData "aldeg_cas03.gat",13,0;
- SetCastleData "aldeg_cas03.gat",14,0;
- SetCastleData "aldeg_cas03.gat",15,0;
- SetCastleData "aldeg_cas03.gat",16,0;
- SetCastleData "aldeg_cas03.gat",17,0;
- SetCastleData "aldeg_cas03.gat",18,0;
- SetCastleData "aldeg_cas03.gat",19,0;
- SetCastleData "aldeg_cas03.gat",20,0;
- SetCastleData "aldeg_cas03.gat",21,0;
- SetCastleData "aldeg_cas03.gat",22,0;
- SetCastleData "aldeg_cas03.gat",23,0;
- SetCastleData "aldeg_cas03.gat",24,0;
- SetCastleData "aldeg_cas03.gat",25,0;
- Announce "[" + GetGuildName(@GIDa3) + "] has surrendered Agit [" + GetCastleName("aldeg_cas03.gat") + "]",0;
- MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),7;
- break;
- L7_2:
- mes "[ Chen Lee ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas03 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+aldeg_cas03.gat,176,175,2 script Nyirenverk#a3-4::NyirenverkNW 722,{
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (@GIDa3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ break;
+}
+
+aldeg_cas03.gat,85,103,2 duplicate(NyirenverkNW) Nyirenverk#a3-5 722
+aldeg_cas03.gat,77,115,2 duplicate(NyirenverkNW) Nyirenverk#a3-6 722
+aldeg_cas03.gat,77,215,2 duplicate(NyirenverkNW) Nyirenverk#a3-7 722
+aldeg_cas03.gat,112,107,2 duplicate(NyirenverkNW) Nyirenverk#a3-8 722
+aldeg_cas03.gat,112,117,2 duplicate(NyirenverkNW) Nyirenverk#a3-9 722
+aldeg_cas03.gat,69,71,2 duplicate(NyirenverkNW) Nyirenverk#a3-10 722
+aldeg_cas03.gat,91,69,2 duplicate(NyirenverkNW) Nyirenverk#a3-11 722
+aldeg_cas03.gat,108,60,2 duplicate(NyirenverkNW) Nyirenverk#a3-12 722
+aldeg_cas03.gat,121,73,2 duplicate(NyirenverkNW) Nyirenverk#a3-13 722
+aldeg_cas03.gat,121,73,2 duplicate(NyirenverkNW) Nyirenverk#a3-14 722
+aldeg_cas03.gat,75,102,2 duplicate(NyirenverkNW) Nyirenverk#a3-15 722
+aldeg_cas03.gat,199,169,2 duplicate(NyirenverkNW) Nyirenverk#a3-16 722
+aldeg_cas03.gat,181,179,2 duplicate(NyirenverkNW) Nyirenverk#a3-17 722
+aldeg_cas03.gat,192,44,2 duplicate(NyirenverkNW) Nyirenverk#a3-18 722
+aldeg_cas03.gat,88,108,2 duplicate(NyirenverkNW) Nyirenverk#a3-19 722
+aldeg_cas03.gat,208,145,2 duplicate(NyirenverkNW) Nyirenverk#a3-20 722
+aldeg_cas03.gat,207,75,2 duplicate(NyirenverkNW) Nyirenverk#a3-21 722
+aldeg_cas03.gat,96,62,2 duplicate(NyirenverkNW) Nyirenverk#a3-22 722
+
+//================================================
+// Kafra Service
+//================================================
+aldeg_cas03.gat,118,76,0 script Kafra Service#alde3 117,{
+ cutin "kafra_01",2;
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (getcharid(2) == @GIDa3) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa3) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDa3) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "aldebaran.gat",132,103;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("aldeg_cas03.gat",9) == 1) break;
+ disablenpc "Kafra Service#alde3";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+aldeg_cas03.gat,200,177,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (getcharid(2) != @GIDa3) goto L1n;
+ warp "gld_dun02.gat",165,38;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+aldeg_cas03.gat,110,118,0 script Chen Lee 55,{
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (@GIDa3 == 0) goto LStart;
+ if (getcharid(2) != @GIDa3) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDa3)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Chen Lee ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDa3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa3) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Chen Lee ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Chen Lee ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDa3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Chen Lee ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDa3) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Chen Lee ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas03.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("aldeg_cas03.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("aldeg_cas03.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("aldeg_cas03.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("aldeg_cas03.gat",4);
+ set @Economy,GetCastleData("aldeg_cas03.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas03.gat",2,@Economy+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Chen Lee ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas03.gat",2,@Economy+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Chen Lee ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("aldeg_cas03.gat",5);
+ set @Defence,GetCastleData("aldeg_cas03.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas03.gat",3,@Defence+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Chen Lee ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas03.gat",3,@Defence+1;
+ mes "[ Chen Lee ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Chen Lee ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("aldeg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Chen Lee ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("aldeg_cas03.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("aldeg_cas03.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("aldeg_cas03.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("aldeg_cas03.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("aldeg_cas03.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("aldeg_cas03.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("aldeg_cas03.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("aldeg_cas03.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Chen Lee ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Chen Lee ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "aldeg_cas03.gat",@GDnum,1;
+ SetCastleData "aldeg_cas03.gat",@GDnum2,@GuardianHP;
+ 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;
+L4Error:
+ mes "[ Chen Lee ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Chen Lee ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("aldeg_cas03.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Chen Lee ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Chen Lee ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Chen Lee ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#alde3";
+ SetCastleData "aldeg_cas03.gat",9,1;
+ mes "[ Chen Lee ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Chen Lee ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to alde again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Chen Lee ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Chen Lee ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#alde3";
+ SetCastleData "aldeg_cas03.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Chen Lee ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Chen Lee ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Chen Lee ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Chen Lee ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "aldeg_cas03",225,269;
+ L6_1:
+ mes "[ Chen Lee ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Chen Lee ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Chen Lee ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Chen Lee ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "aldeg_cas03.gat",1,0;
+ SetCastleData "aldeg_cas03.gat",2,0;
+ SetCastleData "aldeg_cas03.gat",3,0;
+ SetCastleData "aldeg_cas03.gat",4,0;
+ SetCastleData "aldeg_cas03.gat",5,0;
+ SetCastleData "aldeg_cas03.gat",6,0;
+ SetCastleData "aldeg_cas03.gat",7,0;
+ SetCastleData "aldeg_cas03.gat",8,0;
+ SetCastleData "aldeg_cas03.gat",9,0;
+ SetCastleData "aldeg_cas03.gat",10,0;
+ SetCastleData "aldeg_cas03.gat",11,0;
+ SetCastleData "aldeg_cas03.gat",12,0;
+ SetCastleData "aldeg_cas03.gat",13,0;
+ SetCastleData "aldeg_cas03.gat",14,0;
+ SetCastleData "aldeg_cas03.gat",15,0;
+ SetCastleData "aldeg_cas03.gat",16,0;
+ SetCastleData "aldeg_cas03.gat",17,0;
+ SetCastleData "aldeg_cas03.gat",18,0;
+ SetCastleData "aldeg_cas03.gat",19,0;
+ SetCastleData "aldeg_cas03.gat",20,0;
+ SetCastleData "aldeg_cas03.gat",21,0;
+ SetCastleData "aldeg_cas03.gat",22,0;
+ SetCastleData "aldeg_cas03.gat",23,0;
+ SetCastleData "aldeg_cas03.gat",24,0;
+ SetCastleData "aldeg_cas03.gat",25,0;
+ Announce "[" + GetGuildName(@GIDa3) + "] has surrendered Agit [" + GetCastleName("aldeg_cas03.gat") + "]",0;
+ MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Chen Lee ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/aldeg_cas04.txt b/npc/guild/old/aldeg_cas04.txt
index f93ebac09..48e220322 100644
--- a/npc/guild/old/aldeg_cas04.txt
+++ b/npc/guild/old/aldeg_cas04.txt
@@ -1,679 +1,679 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas04 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-aldeg_cas04.gat,167,61,2 script Byirtsburi#a4-4::ByirtsburiNW 722,{
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (@GIDa4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- break;
-}
-
-aldeg_cas04.gat,164,90,2 duplicate(ByirtsburiNW) Byirtsburi#a4-5 722
-aldeg_cas04.gat,143,209,2 duplicate(ByirtsburiNW) Byirtsburi#a4-6 722
-aldeg_cas04.gat,129,193,2 duplicate(ByirtsburiNW) Byirtsburi#a4-7 722
-aldeg_cas04.gat,112,206,2 duplicate(ByirtsburiNW) Byirtsburi#a4-8 722
-aldeg_cas04.gat,113,212,2 duplicate(ByirtsburiNW) Byirtsburi#a4-9 722
-aldeg_cas04.gat,77,117,2 duplicate(ByirtsburiNW) Byirtsburi#a4-10 722
-aldeg_cas04.gat,186,42,2 duplicate(ByirtsburiNW) Byirtsburi#a4-11 722
-aldeg_cas04.gat,30,69,2 duplicate(ByirtsburiNW) Byirtsburi#a4-12 722
-aldeg_cas04.gat,55,97,2 duplicate(ByirtsburiNW) Byirtsburi#a4-13 722
-aldeg_cas04.gat,45,98,2 duplicate(ByirtsburiNW) Byirtsburi#a4-14 722
-aldeg_cas04.gat,33,116,2 duplicate(ByirtsburiNW) Byirtsburi#a4-15 722
-aldeg_cas04.gat,130,180,2 duplicate(ByirtsburiNW) Byirtsburi#a4-16 722
-aldeg_cas04.gat,129,193,2 duplicate(ByirtsburiNW) Byirtsburi#a4-17 722
-aldeg_cas04.gat,142,209,2 duplicate(ByirtsburiNW) Byirtsburi#a4-18 722
-aldeg_cas04.gat,33,107,2 duplicate(ByirtsburiNW) Byirtsburi#a4-19 722
-aldeg_cas04.gat,133,220,2 duplicate(ByirtsburiNW) Byirtsburi#a4-20 722
-aldeg_cas04.gat,169,22,2 duplicate(ByirtsburiNW) Byirtsburi#a4-21 722
-aldeg_cas04.gat,169,15,2 duplicate(ByirtsburiNW) Byirtsburi#a4-22 722
-
-//================================================
-// Kafra Service
-//================================================
-aldeg_cas04.gat,45,88,0 script Kafra Service#alde4 117,{
- cutin "kafra_01",2;
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (getcharid(2) == @GIDa4) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa4) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDa4) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "aldebaran.gat",132,103;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("aldeg_cas04.gat",9) == 1) break;
- disablenpc "Kafra Service#alde4";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-aldeg_cas04.gat,76,64,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (getcharid(2) != @GIDa4) goto L1n;
- warp "gld_dun02.gat",160,148;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-aldeg_cas04.gat,218,175,0 script Brimhemsen 55,{
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (@GIDa4 == 0) goto LStart;
- if (getcharid(2) != @GIDa4) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDa4)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Brimhemsen ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDa4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa4) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Brimhemsen ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Brimhemsen ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDa4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Brimhemsen ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDa4) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Brimhemsen ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas04.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("aldeg_cas04.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("aldeg_cas04.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("aldeg_cas04.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("aldeg_cas04.gat",4);
- set @Economy,GetCastleData("aldeg_cas04.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas04.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas04.gat",2,@Economy+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas04.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas04.gat",2,@Economy+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Brimhemsen ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("aldeg_cas04.gat",5);
- set @Defence,GetCastleData("aldeg_cas04.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas04.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas04.gat",3,@Defence+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas04.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas04.gat",3,@Defence+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Brimhemsen ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("aldeg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Brimhemsen ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("aldeg_cas04.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("aldeg_cas04.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("aldeg_cas04.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("aldeg_cas04.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("aldeg_cas04.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("aldeg_cas04.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("aldeg_cas04.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("aldeg_cas04.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Brimhemsen ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "aldeg_cas04.gat",@GDnum,1;
- SetCastleData "aldeg_cas04.gat",@GDnum2,@GuardianHP;
- 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;
-L4Error:
- mes "[ Brimhemsen ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Brimhemsen ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("aldeg_cas04.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Brimhemsen ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Brimhemsen ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#alde4";
- SetCastleData "aldeg_cas04.gat",9,1;
- mes "[ Brimhemsen ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Brimhemsen ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to alde again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Brimhemsen ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Brimhemsen ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#alde4";
- SetCastleData "aldeg_cas04.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Brimhemsen ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Brimhemsen ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Brimhemsen ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Brimhemsen ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "aldeg_cas04",85,12;
- L6_1:
- mes "[ Brimhemsen ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Brimhemsen ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Brimhemsen ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Brimhemsen ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "aldeg_cas04.gat",1,0;
- SetCastleData "aldeg_cas04.gat",2,0;
- SetCastleData "aldeg_cas04.gat",3,0;
- SetCastleData "aldeg_cas04.gat",4,0;
- SetCastleData "aldeg_cas04.gat",5,0;
- SetCastleData "aldeg_cas04.gat",6,0;
- SetCastleData "aldeg_cas04.gat",7,0;
- SetCastleData "aldeg_cas04.gat",8,0;
- SetCastleData "aldeg_cas04.gat",9,0;
- SetCastleData "aldeg_cas04.gat",10,0;
- SetCastleData "aldeg_cas04.gat",11,0;
- SetCastleData "aldeg_cas04.gat",12,0;
- SetCastleData "aldeg_cas04.gat",13,0;
- SetCastleData "aldeg_cas04.gat",14,0;
- SetCastleData "aldeg_cas04.gat",15,0;
- SetCastleData "aldeg_cas04.gat",16,0;
- SetCastleData "aldeg_cas04.gat",17,0;
- SetCastleData "aldeg_cas04.gat",18,0;
- SetCastleData "aldeg_cas04.gat",19,0;
- SetCastleData "aldeg_cas04.gat",20,0;
- SetCastleData "aldeg_cas04.gat",21,0;
- SetCastleData "aldeg_cas04.gat",22,0;
- SetCastleData "aldeg_cas04.gat",23,0;
- SetCastleData "aldeg_cas04.gat",24,0;
- SetCastleData "aldeg_cas04.gat",25,0;
- Announce "[" + GetGuildName(@GIDa4) + "] has surrendered Agit [" + GetCastleName("aldeg_cas04.gat") + "]",0;
- MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),7;
- break;
- L7_2:
- mes "[ Brimhemsen ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas04 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+aldeg_cas04.gat,167,61,2 script Byirtsburi#a4-4::ByirtsburiNW 722,{
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (@GIDa4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ break;
+}
+
+aldeg_cas04.gat,164,90,2 duplicate(ByirtsburiNW) Byirtsburi#a4-5 722
+aldeg_cas04.gat,143,209,2 duplicate(ByirtsburiNW) Byirtsburi#a4-6 722
+aldeg_cas04.gat,129,193,2 duplicate(ByirtsburiNW) Byirtsburi#a4-7 722
+aldeg_cas04.gat,112,206,2 duplicate(ByirtsburiNW) Byirtsburi#a4-8 722
+aldeg_cas04.gat,113,212,2 duplicate(ByirtsburiNW) Byirtsburi#a4-9 722
+aldeg_cas04.gat,77,117,2 duplicate(ByirtsburiNW) Byirtsburi#a4-10 722
+aldeg_cas04.gat,186,42,2 duplicate(ByirtsburiNW) Byirtsburi#a4-11 722
+aldeg_cas04.gat,30,69,2 duplicate(ByirtsburiNW) Byirtsburi#a4-12 722
+aldeg_cas04.gat,55,97,2 duplicate(ByirtsburiNW) Byirtsburi#a4-13 722
+aldeg_cas04.gat,45,98,2 duplicate(ByirtsburiNW) Byirtsburi#a4-14 722
+aldeg_cas04.gat,33,116,2 duplicate(ByirtsburiNW) Byirtsburi#a4-15 722
+aldeg_cas04.gat,130,180,2 duplicate(ByirtsburiNW) Byirtsburi#a4-16 722
+aldeg_cas04.gat,129,193,2 duplicate(ByirtsburiNW) Byirtsburi#a4-17 722
+aldeg_cas04.gat,142,209,2 duplicate(ByirtsburiNW) Byirtsburi#a4-18 722
+aldeg_cas04.gat,33,107,2 duplicate(ByirtsburiNW) Byirtsburi#a4-19 722
+aldeg_cas04.gat,133,220,2 duplicate(ByirtsburiNW) Byirtsburi#a4-20 722
+aldeg_cas04.gat,169,22,2 duplicate(ByirtsburiNW) Byirtsburi#a4-21 722
+aldeg_cas04.gat,169,15,2 duplicate(ByirtsburiNW) Byirtsburi#a4-22 722
+
+//================================================
+// Kafra Service
+//================================================
+aldeg_cas04.gat,45,88,0 script Kafra Service#alde4 117,{
+ cutin "kafra_01",2;
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (getcharid(2) == @GIDa4) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa4) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDa4) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "aldebaran.gat",132,103;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("aldeg_cas04.gat",9) == 1) break;
+ disablenpc "Kafra Service#alde4";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+aldeg_cas04.gat,76,64,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (getcharid(2) != @GIDa4) goto L1n;
+ warp "gld_dun02.gat",160,148;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+aldeg_cas04.gat,218,175,0 script Brimhemsen 55,{
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (@GIDa4 == 0) goto LStart;
+ if (getcharid(2) != @GIDa4) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDa4)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Brimhemsen ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDa4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa4) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Brimhemsen ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Brimhemsen ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDa4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Brimhemsen ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDa4) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Brimhemsen ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas04.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("aldeg_cas04.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("aldeg_cas04.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("aldeg_cas04.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("aldeg_cas04.gat",4);
+ set @Economy,GetCastleData("aldeg_cas04.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas04.gat",2,@Economy+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas04.gat",2,@Economy+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Brimhemsen ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("aldeg_cas04.gat",5);
+ set @Defence,GetCastleData("aldeg_cas04.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas04.gat",3,@Defence+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas04.gat",3,@Defence+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Brimhemsen ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("aldeg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Brimhemsen ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("aldeg_cas04.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("aldeg_cas04.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("aldeg_cas04.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("aldeg_cas04.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("aldeg_cas04.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("aldeg_cas04.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("aldeg_cas04.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("aldeg_cas04.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Brimhemsen ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "aldeg_cas04.gat",@GDnum,1;
+ SetCastleData "aldeg_cas04.gat",@GDnum2,@GuardianHP;
+ 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;
+L4Error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Brimhemsen ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("aldeg_cas04.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Brimhemsen ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Brimhemsen ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#alde4";
+ SetCastleData "aldeg_cas04.gat",9,1;
+ mes "[ Brimhemsen ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Brimhemsen ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to alde again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Brimhemsen ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Brimhemsen ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#alde4";
+ SetCastleData "aldeg_cas04.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Brimhemsen ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Brimhemsen ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Brimhemsen ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Brimhemsen ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "aldeg_cas04",85,12;
+ L6_1:
+ mes "[ Brimhemsen ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Brimhemsen ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Brimhemsen ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Brimhemsen ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "aldeg_cas04.gat",1,0;
+ SetCastleData "aldeg_cas04.gat",2,0;
+ SetCastleData "aldeg_cas04.gat",3,0;
+ SetCastleData "aldeg_cas04.gat",4,0;
+ SetCastleData "aldeg_cas04.gat",5,0;
+ SetCastleData "aldeg_cas04.gat",6,0;
+ SetCastleData "aldeg_cas04.gat",7,0;
+ SetCastleData "aldeg_cas04.gat",8,0;
+ SetCastleData "aldeg_cas04.gat",9,0;
+ SetCastleData "aldeg_cas04.gat",10,0;
+ SetCastleData "aldeg_cas04.gat",11,0;
+ SetCastleData "aldeg_cas04.gat",12,0;
+ SetCastleData "aldeg_cas04.gat",13,0;
+ SetCastleData "aldeg_cas04.gat",14,0;
+ SetCastleData "aldeg_cas04.gat",15,0;
+ SetCastleData "aldeg_cas04.gat",16,0;
+ SetCastleData "aldeg_cas04.gat",17,0;
+ SetCastleData "aldeg_cas04.gat",18,0;
+ SetCastleData "aldeg_cas04.gat",19,0;
+ SetCastleData "aldeg_cas04.gat",20,0;
+ SetCastleData "aldeg_cas04.gat",21,0;
+ SetCastleData "aldeg_cas04.gat",22,0;
+ SetCastleData "aldeg_cas04.gat",23,0;
+ SetCastleData "aldeg_cas04.gat",24,0;
+ SetCastleData "aldeg_cas04.gat",25,0;
+ Announce "[" + GetGuildName(@GIDa4) + "] has surrendered Agit [" + GetCastleName("aldeg_cas04.gat") + "]",0;
+ MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Brimhemsen ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/aldeg_cas05.txt b/npc/guild/old/aldeg_cas05.txt
index a1a64863c..831b76ebb 100644
--- a/npc/guild/old/aldeg_cas05.txt
+++ b/npc/guild/old/aldeg_cas05.txt
@@ -1,677 +1,677 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas05 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-aldeg_cas05.gat,170,85,2 script Rotenburk#a5-4::RotenburkNW 722,{
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (@GIDa5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- break;
-}
-
-aldeg_cas05.gat,142,212,2 duplicate(RotenburkNW) Rotenburk#a5-5 722
-aldeg_cas05.gat,149,196,2 duplicate(RotenburkNW) Rotenburk#a5-6 722
-aldeg_cas05.gat,41,180,2 duplicate(RotenburkNW) Rotenburk#a5-7 722
-aldeg_cas05.gat,38,201,2 duplicate(RotenburkNW) Rotenburk#a5-8 722
-aldeg_cas05.gat,65,182,2 duplicate(RotenburkNW) Rotenburk#a5-9 722
-aldeg_cas05.gat,65,205,2 duplicate(RotenburkNW) Rotenburk#a5-10 722
-aldeg_cas05.gat,10,218,2 duplicate(RotenburkNW) Rotenburk#a5-11 722
-aldeg_cas05.gat,164,201,2 duplicate(RotenburkNW) Rotenburk#a5-12 722
-aldeg_cas05.gat,216,96,2 duplicate(RotenburkNW) Rotenburk#a5-13 722
-aldeg_cas05.gat,217,80,2 duplicate(RotenburkNW) Rotenburk#a5-14 722
-aldeg_cas05.gat,14,117,2 duplicate(RotenburkNW) Rotenburk#a5-15 722
-aldeg_cas05.gat,10,225,2 duplicate(RotenburkNW) Rotenburk#a5-16 722
-aldeg_cas05.gat,187,59,2 duplicate(RotenburkNW) Rotenburk#a5-17 722
-aldeg_cas05.gat,154,51,2 duplicate(RotenburkNW) Rotenburk#a5-18 722
-aldeg_cas05.gat,22,211,2 duplicate(RotenburkNW) Rotenburk#a5-19 722
-aldeg_cas05.gat,150,202,2 duplicate(RotenburkNW) Rotenburk#a5-20 722
-
-//================================================
-// Kafra Service
-//================================================
-aldeg_cas05.gat,31,190,0 script Kafra Service#alde5 117,{
- cutin "kafra_01",2;
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (getcharid(2) == @GIDa5) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa5) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDa5) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "aldebaran.gat",132,103;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("aldeg_cas05.gat",9) == 1) break;
- disablenpc "Kafra Service#alde5";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-aldeg_cas05.gat,22,205,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (getcharid(2) != @GIDa5) goto L1n;
- warp "gld_dun02.gat",103,169;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-aldeg_cas05.gat,51,179,0 script Brimhemsen 55,{
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (@GIDa5 == 0) goto LStart;
- if (getcharid(2) != @GIDa5) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDa5)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Brimhemsen ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDa5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa5) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Brimhemsen ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Brimhemsen ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDa5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Brimhemsen ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDa5) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Brimhemsen ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas05.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("aldeg_cas05.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("aldeg_cas05.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("aldeg_cas05.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("aldeg_cas05.gat",4);
- set @Economy,GetCastleData("aldeg_cas05.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas05.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas05.gat",2,@Economy+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Brimhemsen ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "aldeg_cas05.gat",4,@TriggerE+1;
- SetCastleData "aldeg_cas05.gat",2,@Economy+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Brimhemsen ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("aldeg_cas05.gat",5);
- set @Defence,GetCastleData("aldeg_cas05.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas05.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas05.gat",3,@Defence+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Brimhemsen ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "aldeg_cas05.gat",5,@TriggerD+1;
- SetCastleData "aldeg_cas05.gat",3,@Defence+1;
- mes "[ Brimhemsen ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Brimhemsen ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("aldeg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Brimhemsen ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("aldeg_cas05.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("aldeg_cas05.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("aldeg_cas05.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("aldeg_cas05.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("aldeg_cas05.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("aldeg_cas05.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("aldeg_cas05.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("aldeg_cas05.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Brimhemsen ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Brimhemsen ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "aldeg_cas05.gat",@GDnum,1;
- SetCastleData "aldeg_cas05.gat",@GDnum2,@GuardianHP;
- 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;
-L4Error:
- mes "[ Brimhemsen ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Brimhemsen ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("aldeg_cas05.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Brimhemsen ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Brimhemsen ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Brimhemsen ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#alde5";
- SetCastleData "aldeg_cas05.gat",9,1;
- mes "[ Brimhemsen ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Brimhemsen ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to alde again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Brimhemsen ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Brimhemsen ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#alde5";
- SetCastleData "aldeg_cas05.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Brimhemsen ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Brimhemsen ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Brimhemsen ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Brimhemsen ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "aldeg_cas05",15,209;
- L6_1:
- mes "[ Brimhemsen ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Brimhemsen ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Brimhemsen ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Brimhemsen ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "aldeg_cas05.gat",1,0;
- SetCastleData "aldeg_cas05.gat",2,0;
- SetCastleData "aldeg_cas05.gat",3,0;
- SetCastleData "aldeg_cas05.gat",4,0;
- SetCastleData "aldeg_cas05.gat",5,0;
- SetCastleData "aldeg_cas05.gat",6,0;
- SetCastleData "aldeg_cas05.gat",7,0;
- SetCastleData "aldeg_cas05.gat",8,0;
- SetCastleData "aldeg_cas05.gat",9,0;
- SetCastleData "aldeg_cas05.gat",10,0;
- SetCastleData "aldeg_cas05.gat",11,0;
- SetCastleData "aldeg_cas05.gat",12,0;
- SetCastleData "aldeg_cas05.gat",13,0;
- SetCastleData "aldeg_cas05.gat",14,0;
- SetCastleData "aldeg_cas05.gat",15,0;
- SetCastleData "aldeg_cas05.gat",16,0;
- SetCastleData "aldeg_cas05.gat",17,0;
- SetCastleData "aldeg_cas05.gat",18,0;
- SetCastleData "aldeg_cas05.gat",19,0;
- SetCastleData "aldeg_cas05.gat",20,0;
- SetCastleData "aldeg_cas05.gat",21,0;
- SetCastleData "aldeg_cas05.gat",22,0;
- SetCastleData "aldeg_cas05.gat",23,0;
- SetCastleData "aldeg_cas05.gat",24,0;
- SetCastleData "aldeg_cas05.gat",25,0;
- Announce "[" + GetGuildName(@GIDa5) + "] has surrendered Agit [" + GetCastleName("aldeg_cas05.gat") + "]",0;
- MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),7;
- break;
- L7_2:
- mes "[ Brimhemsen ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas05 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in aldeg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+aldeg_cas05.gat,170,85,2 script Rotenburk#a5-4::RotenburkNW 722,{
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (@GIDa5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ break;
+}
+
+aldeg_cas05.gat,142,212,2 duplicate(RotenburkNW) Rotenburk#a5-5 722
+aldeg_cas05.gat,149,196,2 duplicate(RotenburkNW) Rotenburk#a5-6 722
+aldeg_cas05.gat,41,180,2 duplicate(RotenburkNW) Rotenburk#a5-7 722
+aldeg_cas05.gat,38,201,2 duplicate(RotenburkNW) Rotenburk#a5-8 722
+aldeg_cas05.gat,65,182,2 duplicate(RotenburkNW) Rotenburk#a5-9 722
+aldeg_cas05.gat,65,205,2 duplicate(RotenburkNW) Rotenburk#a5-10 722
+aldeg_cas05.gat,10,218,2 duplicate(RotenburkNW) Rotenburk#a5-11 722
+aldeg_cas05.gat,164,201,2 duplicate(RotenburkNW) Rotenburk#a5-12 722
+aldeg_cas05.gat,216,96,2 duplicate(RotenburkNW) Rotenburk#a5-13 722
+aldeg_cas05.gat,217,80,2 duplicate(RotenburkNW) Rotenburk#a5-14 722
+aldeg_cas05.gat,14,117,2 duplicate(RotenburkNW) Rotenburk#a5-15 722
+aldeg_cas05.gat,10,225,2 duplicate(RotenburkNW) Rotenburk#a5-16 722
+aldeg_cas05.gat,187,59,2 duplicate(RotenburkNW) Rotenburk#a5-17 722
+aldeg_cas05.gat,154,51,2 duplicate(RotenburkNW) Rotenburk#a5-18 722
+aldeg_cas05.gat,22,211,2 duplicate(RotenburkNW) Rotenburk#a5-19 722
+aldeg_cas05.gat,150,202,2 duplicate(RotenburkNW) Rotenburk#a5-20 722
+
+//================================================
+// Kafra Service
+//================================================
+aldeg_cas05.gat,31,190,0 script Kafra Service#alde5 117,{
+ cutin "kafra_01",2;
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (getcharid(2) == @GIDa5) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDa5) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDa5) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Al de Baran -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "aldebaran.gat",132,103;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("aldeg_cas05.gat",9) == 1) break;
+ disablenpc "Kafra Service#alde5";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+aldeg_cas05.gat,22,205,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (getcharid(2) != @GIDa5) goto L1n;
+ warp "gld_dun02.gat",103,169;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+aldeg_cas05.gat,51,179,0 script Brimhemsen 55,{
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (@GIDa5 == 0) goto LStart;
+ if (getcharid(2) != @GIDa5) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDa5)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Brimhemsen ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDa5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDa5) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Brimhemsen ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Brimhemsen ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDa5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Brimhemsen ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDa5) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Brimhemsen ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("aldeg_cas05.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("aldeg_cas05.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("aldeg_cas05.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("aldeg_cas05.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("aldeg_cas05.gat",4);
+ set @Economy,GetCastleData("aldeg_cas05.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas05.gat",2,@Economy+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Brimhemsen ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "aldeg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "aldeg_cas05.gat",2,@Economy+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Brimhemsen ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("aldeg_cas05.gat",5);
+ set @Defence,GetCastleData("aldeg_cas05.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas05.gat",3,@Defence+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Brimhemsen ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "aldeg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "aldeg_cas05.gat",3,@Defence+1;
+ mes "[ Brimhemsen ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Brimhemsen ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("aldeg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Brimhemsen ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("aldeg_cas05.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("aldeg_cas05.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("aldeg_cas05.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("aldeg_cas05.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("aldeg_cas05.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("aldeg_cas05.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("aldeg_cas05.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("aldeg_cas05.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Brimhemsen ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Brimhemsen ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "aldeg_cas05.gat",@GDnum,1;
+ SetCastleData "aldeg_cas05.gat",@GDnum2,@GuardianHP;
+ 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;
+L4Error:
+ mes "[ Brimhemsen ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Brimhemsen ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("aldeg_cas05.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Brimhemsen ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Brimhemsen ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Brimhemsen ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#alde5";
+ SetCastleData "aldeg_cas05.gat",9,1;
+ mes "[ Brimhemsen ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Brimhemsen ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to alde again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Brimhemsen ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Brimhemsen ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#alde5";
+ SetCastleData "aldeg_cas05.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Brimhemsen ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Brimhemsen ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Brimhemsen ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Brimhemsen ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "aldeg_cas05",15,209;
+ L6_1:
+ mes "[ Brimhemsen ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Brimhemsen ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Brimhemsen ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Brimhemsen ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "aldeg_cas05.gat",1,0;
+ SetCastleData "aldeg_cas05.gat",2,0;
+ SetCastleData "aldeg_cas05.gat",3,0;
+ SetCastleData "aldeg_cas05.gat",4,0;
+ SetCastleData "aldeg_cas05.gat",5,0;
+ SetCastleData "aldeg_cas05.gat",6,0;
+ SetCastleData "aldeg_cas05.gat",7,0;
+ SetCastleData "aldeg_cas05.gat",8,0;
+ SetCastleData "aldeg_cas05.gat",9,0;
+ SetCastleData "aldeg_cas05.gat",10,0;
+ SetCastleData "aldeg_cas05.gat",11,0;
+ SetCastleData "aldeg_cas05.gat",12,0;
+ SetCastleData "aldeg_cas05.gat",13,0;
+ SetCastleData "aldeg_cas05.gat",14,0;
+ SetCastleData "aldeg_cas05.gat",15,0;
+ SetCastleData "aldeg_cas05.gat",16,0;
+ SetCastleData "aldeg_cas05.gat",17,0;
+ SetCastleData "aldeg_cas05.gat",18,0;
+ SetCastleData "aldeg_cas05.gat",19,0;
+ SetCastleData "aldeg_cas05.gat",20,0;
+ SetCastleData "aldeg_cas05.gat",21,0;
+ SetCastleData "aldeg_cas05.gat",22,0;
+ SetCastleData "aldeg_cas05.gat",23,0;
+ SetCastleData "aldeg_cas05.gat",24,0;
+ SetCastleData "aldeg_cas05.gat",25,0;
+ Announce "[" + GetGuildName(@GIDa5) + "] has surrendered Agit [" + GetCastleName("aldeg_cas05.gat") + "]",0;
+ MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Brimhemsen ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/aldeg_flag.txt b/npc/guild/old/aldeg_flag.txt
index feec15fd3..4b807fca9 100644
--- a/npc/guild/old/aldeg_flag.txt
+++ b/npc/guild/old/aldeg_flag.txt
@@ -1,351 +1,351 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Al de Baran Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in aldebaran and alde_gld
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//============================================================
-
-//Al de Baran Castle 01 - Noisyubantian
-
-aldebaran.gat,155,190,4 script Noisyubantian#a1-1 722,{
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (@GIDa1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- break;
-}
-
-alde_gld.gat,61,87,6 script Noisyubantian#a1-2::NoisyubantianW 722,{
- set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
- if (@GIDa1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDa1) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "aldeg_cas01.gat",218,170;
- break;
-OnRecvCastleA01:
- FlagEmblem GetCastleData("aldeg_cas01.gat",1);
- break;
-}
-
-alde_gld.gat,61,79,6 duplicate(NoisyubantianW) Noisyubantian#a1-3 722
-alde_gld.gat,45,87,8 duplicate(NoisyubantianW) Noisyubantian#a1-4 722
-alde_gld.gat,51,87,8 duplicate(NoisyubantianW) Noisyubantian#a1-5 722
-
-//Al de Baran Castle 02 - Hohensyubangawoo
-
-aldebaran.gat,146,194,3 script Hohensyubangawoo#a2-1 722,{
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (@GIDa2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- break;
-}
-
-alde_gld.gat,93,250,5 script Hohensyubangawoo#a2-2::HohensyubangawooW 722,{
- set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
- if (@GIDa2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDa2) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "aldeg_cas02.gat",84,74;
- break;
-OnRecvCastleA02:
- FlagEmblem GetCastleData("aldeg_cas02.gat",1);
- break;
-}
-
-alde_gld.gat,98,250,5 duplicate(HohensyubangawooW) Hohensyubangawoo#a2-3 722
-
-//Al de Baran Castle 03 - Nyirenverk
-
-aldebaran.gat,143,203,2 script Nyirenverk#a3-1 722,{
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (@GIDa3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- break;
-}
-
-alde_gld.gat,139,83,1 script Nyirenverk#a3-2::NyirenverkW 722,{
- set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
- if (@GIDa3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDa3) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "aldeg_cas03.gat",118,76;
- break;
-OnRecvCastleA03:
- FlagEmblem GetCastleData("aldeg_cas03.gat",1);
- break;
-}
-
-alde_gld.gat,145,83,1 duplicate(NyirenverkW) Nyirenverk#a3-3 722
-
-//Al de Baran Castle 04 - Byirtsburi
-
-aldebaran.gat,167,203,6 script Byirtsburi#a4-1 722,{
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (@GIDa4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- break;
-}
-
-
-alde_gld.gat,239,247,1 script Byirtsburi#a4-2::ByirtsburiW 722,{
- set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
- if (@GIDa4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDa4) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "aldeg_cas04.gat",45,88;
- break;
-OnRecvCastleA04:
- FlagEmblem GetCastleData("aldeg_cas04.gat",1);
- break;
-}
-
-alde_gld.gat,234,247,1 duplicate(ByirtsburiW) Byirtsburi#a4-3 722
-
-//Al de Baran Castle 05 - Rotenburk
-
-aldebaran.gat,165,194,5 script Rotenburk#a5-1 722,{
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (@GIDa5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- break;
-}
-
-alde_gld.gat,266,92,7 script Rotenburk#a5-2::RotenburkW 722,{
- set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
- if (@GIDa5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDa5) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "aldeg_cas05.gat",31,190;
- break;
-OnRecvCastleA05:
- FlagEmblem GetCastleData("aldeg_cas05.gat",1);
- break;
-}
-
+//===== eAthena Script =======================================
+//= War of Emperium - Al de Baran Guild Flags
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in aldebaran and alde_gld
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//============================================================
+
+//Al de Baran Castle 01 - Noisyubantian
+
+aldebaran.gat,155,190,4 script Noisyubantian#a1-1 722,{
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (@GIDa1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ break;
+}
+
+alde_gld.gat,61,87,6 script Noisyubantian#a1-2::NoisyubantianW 722,{
+ set @GIDa1,GetCastleData("aldeg_cas01.gat",1);
+ if (@GIDa1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDa1) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "aldeg_cas01.gat",218,170;
+ break;
+OnRecvCastleA01:
+ FlagEmblem GetCastleData("aldeg_cas01.gat",1);
+ break;
+}
+
+alde_gld.gat,61,79,6 duplicate(NoisyubantianW) Noisyubantian#a1-3 722
+alde_gld.gat,45,87,8 duplicate(NoisyubantianW) Noisyubantian#a1-4 722
+alde_gld.gat,51,87,8 duplicate(NoisyubantianW) Noisyubantian#a1-5 722
+
+//Al de Baran Castle 02 - Hohensyubangawoo
+
+aldebaran.gat,146,194,3 script Hohensyubangawoo#a2-1 722,{
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (@GIDa2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ break;
+}
+
+alde_gld.gat,93,250,5 script Hohensyubangawoo#a2-2::HohensyubangawooW 722,{
+ set @GIDa2,GetCastleData("aldeg_cas02.gat",1);
+ if (@GIDa2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDa2) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "aldeg_cas02.gat",84,74;
+ break;
+OnRecvCastleA02:
+ FlagEmblem GetCastleData("aldeg_cas02.gat",1);
+ break;
+}
+
+alde_gld.gat,98,250,5 duplicate(HohensyubangawooW) Hohensyubangawoo#a2-3 722
+
+//Al de Baran Castle 03 - Nyirenverk
+
+aldebaran.gat,143,203,2 script Nyirenverk#a3-1 722,{
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (@GIDa3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ break;
+}
+
+alde_gld.gat,139,83,1 script Nyirenverk#a3-2::NyirenverkW 722,{
+ set @GIDa3,GetCastleData("aldeg_cas03.gat",1);
+ if (@GIDa3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDa3) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "aldeg_cas03.gat",118,76;
+ break;
+OnRecvCastleA03:
+ FlagEmblem GetCastleData("aldeg_cas03.gat",1);
+ break;
+}
+
+alde_gld.gat,145,83,1 duplicate(NyirenverkW) Nyirenverk#a3-3 722
+
+//Al de Baran Castle 04 - Byirtsburi
+
+aldebaran.gat,167,203,6 script Byirtsburi#a4-1 722,{
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (@GIDa4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ break;
+}
+
+
+alde_gld.gat,239,247,1 script Byirtsburi#a4-2::ByirtsburiW 722,{
+ set @GIDa4,GetCastleData("aldeg_cas04.gat",1);
+ if (@GIDa4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDa4) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "aldeg_cas04.gat",45,88;
+ break;
+OnRecvCastleA04:
+ FlagEmblem GetCastleData("aldeg_cas04.gat",1);
+ break;
+}
+
+alde_gld.gat,234,247,1 duplicate(ByirtsburiW) Byirtsburi#a4-3 722
+
+//Al de Baran Castle 05 - Rotenburk
+
+aldebaran.gat,165,194,5 script Rotenburk#a5-1 722,{
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (@GIDa5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ break;
+}
+
+alde_gld.gat,266,92,7 script Rotenburk#a5-2::RotenburkW 722,{
+ set @GIDa5,GetCastleData("aldeg_cas05.gat",1);
+ if (@GIDa5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDa5) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Al de Baran ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Al de Baran,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDa5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDa5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDa5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "aldeg_cas05.gat",31,190;
+ break;
+OnRecvCastleA05:
+ FlagEmblem GetCastleData("aldeg_cas05.gat",1);
+ break;
+}
+
alde_gld.gat,266,88,7 duplicate(RotenburkW) Rotenburk#a5-3 722 \ No newline at end of file
diff --git a/npc/guild/old/ev_agit_aldeg.txt b/npc/guild/old/ev_agit_aldeg.txt
index 617836cc6..dde9e82cf 100644
--- a/npc/guild/old/ev_agit_aldeg.txt
+++ b/npc/guild/old/ev_agit_aldeg.txt
@@ -1,476 +1,476 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Al de Baran Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Al de Baran Guild Wars
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//= 1.2 by Akaru (Castle spawn/conquering fix)
-//============================================================
-
-
-aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
-OnAgitInit:
- GetCastleData "aldeg_cas01.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
- Break;
-OnRecvCastleA01:
- RequestGuildInfo GetCastleData("aldeg_cas01.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),2;
- Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
- GvgOn "aldeg_cas01.gat";
- Break;
-OnAgitBreak:
- set @GIDa1,getcharid(2);
- if (@GIDa1 <= 0) Break;
- set @Economy,GetCastleData("aldeg_cas01.gat",2);
- SetCastleData "aldeg_cas01.gat",2,@Economy-5;
- if (GetCastleData("aldeg_cas01.gat",2) < 0) SetCastleData "aldeg_cas01.gat",2,0;
- set @Defence,GetCastleData("aldeg_cas01.gat",3);
- SetCastleData "aldeg_cas01.gat",3,@Defence-5;
- if (GetCastleData("aldeg_cas01.gat",3) < 0) SetCastleData "aldeg_cas01.gat",3,0;
- SetCastleData "aldeg_cas01.gat",1,@GIDa1;
- Announce "Guild Base [" + GetCastleName("aldeg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDa1) + "] guild.",0;
- MapAnnounce "aldeg_cas01.gat","The emperium has been destroyed.",17;
- GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
- SetCastleData "aldeg_cas01.gat",2,0;
- SetCastleData "aldeg_cas01.gat",3,0;
- SetCastleData "aldeg_cas01.gat",4,0;
- SetCastleData "aldeg_cas01.gat",5,0;
- SetCastleData "aldeg_cas01.gat",6,0;
- SetCastleData "aldeg_cas01.gat",7,0;
- SetCastleData "aldeg_cas01.gat",8,0;
- SetCastleData "aldeg_cas01.gat",9,0;
- SetCastleData "aldeg_cas01.gat",10,0;
- SetCastleData "aldeg_cas01.gat",11,0;
- SetCastleData "aldeg_cas01.gat",12,0;
- SetCastleData "aldeg_cas01.gat",13,0;
- SetCastleData "aldeg_cas01.gat",14,0;
- SetCastleData "aldeg_cas01.gat",15,0;
- SetCastleData "aldeg_cas01.gat",16,0;
- SetCastleData "aldeg_cas01.gat",17,0;
- SetCastleData "aldeg_cas01.gat",18,0;
- SetCastleData "aldeg_cas01.gat",19,0;
- SetCastleData "aldeg_cas01.gat",20,0;
- SetCastleData "aldeg_cas01.gat",21,0;
- SetCastleData "aldeg_cas01.gat",22,0;
- SetCastleData "aldeg_cas01.gat",23,0;
- SetCastleData "aldeg_cas01.gat",24,0;
- SetCastleData "aldeg_cas01.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),6;
- Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),4;
- KillMonster "aldeg_cas01.gat","Agit_A01::OnAgitBreak";
- GvgOff "aldeg_cas01.gat";
- Break;
-OnInit:
-initnpctimer "Agit_A01_Timer";
-}
-
-aldeg_cas01.gat,1,1,1 script Agit_A01_Timer -1,{
-OnTimer500:
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1132,4;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1219,2;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1205,1;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1216,10;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1193,17;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1269,9;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1276,7;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1208,3;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1268,1;
- areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1272,1;
- monster "aldeg_cas01.gat",216,23,"--ja--",1272,1;
- monster "aldeg_cas01.gat",216,23,"--ja--",1270,4;
- monster "aldeg_cas01.gat",216,23,"--ja--",1268,1;
- monster "aldeg_cas01.gat",216,23,"--ja--",1219,1;
- monster "aldeg_cas01.gat",216,23,"--ja--",1276,5;
- Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
- stopnpctimer "Agit_A01_Timer";
- Break;
- }
-//--------------------------------------------------------------------------------------------------------------------------
-aldeg_cas02.gat,214,24,0 script Agit_A02 -1,{
-OnAgitInit:
- GetCastleData "aldeg_cas02.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
- Break;
-OnRecvCastleA02:
- RequestGuildInfo GetCastleData("aldeg_cas02.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),2;
- Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
- GvgOn "aldeg_cas02.gat";
- Break;
-OnAgitBreak:
- set @GIDa2,getcharid(2);
- if (@GIDa2 <= 0) Break;
- set @Economy,GetCastleData("aldeg_cas02.gat",2);
- SetCastleData "aldeg_cas02.gat",2,@Economy-5;
- if (GetCastleData("aldeg_cas02.gat",2) < 0) SetCastleData "aldeg_cas02.gat",2,0;
- set @Defence,GetCastleData("aldeg_cas02.gat",3);
- SetCastleData "aldeg_cas02.gat",3,@Defence-5;
- if (GetCastleData("aldeg_cas02.gat",3) < 0) SetCastleData "aldeg_cas02.gat",3,0;
- SetCastleData "aldeg_cas02.gat",1,@GIDa2;
- Announce "Guild Base [" + GetCastleName("aldeg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDa2) + "] guild.",0;
- MapAnnounce "aldeg_cas02.gat","The emperium has been destroyed.",17;
- GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
- SetCastleData "aldeg_cas02.gat",2,0;
- SetCastleData "aldeg_cas02.gat",3,0;
- SetCastleData "aldeg_cas02.gat",4,0;
- SetCastleData "aldeg_cas02.gat",5,0;
- SetCastleData "aldeg_cas02.gat",6,0;
- SetCastleData "aldeg_cas02.gat",7,0;
- SetCastleData "aldeg_cas02.gat",8,0;
- SetCastleData "aldeg_cas02.gat",9,0;
- SetCastleData "aldeg_cas02.gat",10,0;
- SetCastleData "aldeg_cas02.gat",11,0;
- SetCastleData "aldeg_cas02.gat",12,0;
- SetCastleData "aldeg_cas02.gat",13,0;
- SetCastleData "aldeg_cas02.gat",14,0;
- SetCastleData "aldeg_cas02.gat",15,0;
- SetCastleData "aldeg_cas02.gat",16,0;
- SetCastleData "aldeg_cas02.gat",17,0;
- SetCastleData "aldeg_cas02.gat",18,0;
- SetCastleData "aldeg_cas02.gat",19,0;
- SetCastleData "aldeg_cas02.gat",20,0;
- SetCastleData "aldeg_cas02.gat",21,0;
- SetCastleData "aldeg_cas02.gat",22,0;
- SetCastleData "aldeg_cas02.gat",23,0;
- SetCastleData "aldeg_cas02.gat",24,0;
- SetCastleData "aldeg_cas02.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),6;
- Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),4;
- KillMonster "aldeg_cas02.gat","Agit_A02::OnAgitBreak";
- GvgOff "aldeg_cas02.gat";
- Break;
-OnInit:
-initnpctimer "Agit_A02_Timer";
-}
-
-aldeg_cas02.gat,1,1,1 script Agit_A02_Timer -1,{
-OnTimer500:
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1132,4;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1219,2;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1205,1;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1216,10;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1193,18;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1269,9;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1276,7;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1208,3;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1268,1;
- areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1272,1;
- monster "aldeg_cas02.gat",213,23,"--ja--",1272,1;
- monster "aldeg_cas02.gat",213,23,"--ja--",1270,4;
- monster "aldeg_cas02.gat",213,23,"--ja--",1268,1;
- monster "aldeg_cas02.gat",213,23,"--ja--",1219,1;
- monster "aldeg_cas02.gat",213,23,"--ja--",1276,5;
- Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
- stopnpctimer "Agit_A02_Timer";
- Break;
- }
-//--------------------------------------------------------------------------------------------------------------------------
-aldeg_cas03.gat,206,32,0 script Agit_A03 -1,{
-OnAgitInit:
- GetCastleData "aldeg_cas03.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
- Break;
-OnRecvCastleA03:
- RequestGuildInfo GetCastleData("aldeg_cas03.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),2;
- Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
- GvgOn "aldeg_cas03.gat";
- Break;
-OnAgitBreak:
- set @GIDa3,getcharid(2);
- if (@GIDa3 <= 0) Break;
- set @Economy,GetCastleData("aldeg_cas03.gat",2);
- SetCastleData "aldeg_cas03.gat",2,@Economy-5;
- if (GetCastleData("aldeg_cas03.gat",2) < 0) SetCastleData "aldeg_cas03.gat",2,0;
- set @Defence,GetCastleData("aldeg_cas03.gat",3);
- SetCastleData "aldeg_cas03.gat",3,@Defence-5;
- if (GetCastleData("aldeg_cas01.gat",3) < 0) SetCastleData "aldeg_cas03.gat",3,0;
- SetCastleData "aldeg_cas03.gat",1,@GIDa3;
- Announce "Guild Base [" + GetCastleName("aldeg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDa3) + "] guild.",0;
- MapAnnounce "aldeg_cas03.gat","The emperium has been destroyed.",17;
- GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
- SetCastleData "aldeg_cas03.gat",2,0;
- SetCastleData "aldeg_cas03.gat",3,0;
- SetCastleData "aldeg_cas03.gat",4,0;
- SetCastleData "aldeg_cas03.gat",5,0;
- SetCastleData "aldeg_cas03.gat",6,0;
- SetCastleData "aldeg_cas03.gat",7,0;
- SetCastleData "aldeg_cas03.gat",8,0;
- SetCastleData "aldeg_cas03.gat",9,0;
- SetCastleData "aldeg_cas03.gat",10,0;
- SetCastleData "aldeg_cas03.gat",11,0;
- SetCastleData "aldeg_cas03.gat",12,0;
- SetCastleData "aldeg_cas03.gat",13,0;
- SetCastleData "aldeg_cas03.gat",14,0;
- SetCastleData "aldeg_cas03.gat",15,0;
- SetCastleData "aldeg_cas03.gat",16,0;
- SetCastleData "aldeg_cas03.gat",17,0;
- SetCastleData "aldeg_cas03.gat",18,0;
- SetCastleData "aldeg_cas03.gat",19,0;
- SetCastleData "aldeg_cas03.gat",20,0;
- SetCastleData "aldeg_cas03.gat",21,0;
- SetCastleData "aldeg_cas03.gat",22,0;
- SetCastleData "aldeg_cas03.gat",23,0;
- SetCastleData "aldeg_cas03.gat",24,0;
- SetCastleData "aldeg_cas03.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),6;
- Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),4;
- KillMonster "aldeg_cas03.gat","Agit_A03::OnAgitBreak";
- GvgOff "aldeg_cas03.gat";
- Break;
-OnInit:
-initnpctimer "Agit_A03_Timer";
-}
-
-aldeg_cas03.gat,1,1,1 script Agit_A03_Timer -1,{
-OnTimer500:
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1132,4;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1219,2;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1205,1;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1216,10;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1193,18;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1269,9;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1276,7;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1208,3;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1268,1;
- areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1272,1;
- monster "aldeg_cas03.gat",205,31,"--ja--",1272,1;
- monster "aldeg_cas03.gat",205,31,"--ja--",1270,4;
- monster "aldeg_cas03.gat",205,31,"--ja--",1268,1;
- monster "aldeg_cas03.gat",205,31,"--ja--",1219,1;
- monster "aldeg_cas03.gat",205,31,"--ja--",1276,5;
- Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
- stopnpctimer "Agit_A03_Timer";
- Break;
- }
-//--------------------------------------------------------------------------------------------------------------------------
-aldeg_cas04.gat,36,218,0 script Agit_A04 -1,{
-OnAgitInit:
- GetCastleData "aldeg_cas04.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
- Break;
-OnRecvCastleA04:
- RequestGuildInfo GetCastleData("aldeg_cas04.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),2;
- Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
- GvgOn "aldeg_cas04.gat";
- Break;
-OnAgitBreak:
- set @GIDa4,getcharid(2);
- if (@GIDa4 <= 0) Break;
- set @Economy,GetCastleData("aldeg_cas04.gat",2);
- SetCastleData "aldeg_cas04.gat",2,@Economy-5;
- if (GetCastleData("aldeg_cas04.gat",2) < 0) SetCastleData "aldeg_cas04.gat",2,0;
- set @Defence,GetCastleData("aldeg_cas04.gat",3);
- SetCastleData "aldeg_cas04.gat",3,@Defence-5;
- if (GetCastleData("aldeg_cas04.gat",3) < 0) SetCastleData "aldeg_cas04.gat",3,0;
- SetCastleData "aldeg_cas04.gat",1,@GIDa4;
- Announce "Guild Base [" + GetCastleName("aldeg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDa4) + "] guild.",0;
- MapAnnounce "aldeg_cas04.gat","The emperium has been destroyed.",17;
- GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
- SetCastleData "aldeg_cas04.gat",2,0;
- SetCastleData "aldeg_cas04.gat",3,0;
- SetCastleData "aldeg_cas04.gat",4,0;
- SetCastleData "aldeg_cas04.gat",5,0;
- SetCastleData "aldeg_cas04.gat",6,0;
- SetCastleData "aldeg_cas04.gat",7,0;
- SetCastleData "aldeg_cas04.gat",8,0;
- SetCastleData "aldeg_cas04.gat",9,0;
- SetCastleData "aldeg_cas04.gat",10,0;
- SetCastleData "aldeg_cas04.gat",11,0;
- SetCastleData "aldeg_cas04.gat",12,0;
- SetCastleData "aldeg_cas04.gat",13,0;
- SetCastleData "aldeg_cas04.gat",14,0;
- SetCastleData "aldeg_cas04.gat",15,0;
- SetCastleData "aldeg_cas04.gat",16,0;
- SetCastleData "aldeg_cas04.gat",17,0;
- SetCastleData "aldeg_cas04.gat",18,0;
- SetCastleData "aldeg_cas04.gat",19,0;
- SetCastleData "aldeg_cas04.gat",20,0;
- SetCastleData "aldeg_cas04.gat",21,0;
- SetCastleData "aldeg_cas04.gat",22,0;
- SetCastleData "aldeg_cas04.gat",23,0;
- SetCastleData "aldeg_cas04.gat",24,0;
- SetCastleData "aldeg_cas04.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),6;
- Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),4;
- KillMonster "aldeg_cas04.gat","Agit_A04::OnAgitBreak";
- GvgOff "aldeg_cas04.gat";
- Break;
-OnInit:
-initnpctimer "Agit_A04_Timer";
-}
-
-aldeg_cas04.gat,1,1,1 script Agit_A04_Timer -1,{
-OnTimer500:
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1132,4;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1219,2;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1205,1;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1216,10;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1193,18;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1269,9;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1276,7;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1208,3;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1268,1;
- areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1272,1;
- monster "aldeg_cas04.gat",36,217,"--ja--",1272,1;
- monster "aldeg_cas04.gat",36,217,"--ja--",1270,4;
- monster "aldeg_cas04.gat",36,217,"--ja--",1268,1;
- monster "aldeg_cas04.gat",36,217,"--ja--",1219,1;
- monster "aldeg_cas04.gat",36,217,"--ja--",1276,5;
- Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
- stopnpctimer "Agit_A04_Timer";
- Break;
- }
-//--------------------------------------------------------------------------------------------------------------------------
-aldeg_cas05.gat,28,102,0 script Agit_A05 -1,{
-OnAgitInit:
- GetCastleData "aldeg_cas05.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
- Break;
-OnRecvCastleA05:
- RequestGuildInfo GetCastleData("aldeg_cas05.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),2;
- Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
- GvgOn "aldeg_cas05.gat";
- Break;
-OnAgitBreak:
- set @GIDa5,getcharid(2);
- if (@GIDa5 <= 0) Break;
- set @Economy,GetCastleData("aldeg_cas05.gat",2);
- SetCastleData "aldeg_cas05.gat",2,@Economy-5;
- if (GetCastleData("aldeg_cas05.gat",2) < 0) SetCastleData "aldeg_cas05.gat",2,0;
- set @Defence,GetCastleData("aldeg_cas05.gat",3);
- SetCastleData "aldeg_cas05.gat",3,@Defence-5;
- if (GetCastleData("aldeg_cas05.gat",3) < 0) SetCastleData "aldeg_cas05.gat",3,0;
- SetCastleData "aldeg_cas05.gat",1,@GIDa5;
- Announce "Guild Base [" + GetCastleName("aldeg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDa5) + "] guild.",0;
- MapAnnounce "aldeg_cas05.gat","The emperium has been destroyed.",17;
- GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
- SetCastleData "aldeg_cas05.gat",2,0;
- SetCastleData "aldeg_cas05.gat",3,0;
- SetCastleData "aldeg_cas05.gat",4,0;
- SetCastleData "aldeg_cas05.gat",5,0;
- SetCastleData "aldeg_cas05.gat",6,0;
- SetCastleData "aldeg_cas05.gat",7,0;
- SetCastleData "aldeg_cas05.gat",8,0;
- SetCastleData "aldeg_cas05.gat",9,0;
- SetCastleData "aldeg_cas05.gat",10,0;
- SetCastleData "aldeg_cas05.gat",11,0;
- SetCastleData "aldeg_cas05.gat",12,0;
- SetCastleData "aldeg_cas05.gat",13,0;
- SetCastleData "aldeg_cas05.gat",14,0;
- SetCastleData "aldeg_cas05.gat",15,0;
- SetCastleData "aldeg_cas05.gat",16,0;
- SetCastleData "aldeg_cas05.gat",17,0;
- SetCastleData "aldeg_cas05.gat",18,0;
- SetCastleData "aldeg_cas05.gat",19,0;
- SetCastleData "aldeg_cas05.gat",20,0;
- SetCastleData "aldeg_cas05.gat",21,0;
- SetCastleData "aldeg_cas05.gat",22,0;
- SetCastleData "aldeg_cas05.gat",23,0;
- SetCastleData "aldeg_cas05.gat",24,0;
- SetCastleData "aldeg_cas05.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),6;
- Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),4;
- KillMonster "aldeg_cas05.gat","Agit_A05::OnAgitBreak";
- GvgOff "aldeg_cas05.gat";
- Break;
-OnInit:
-initnpctimer "Agit_A05_Timer";
-}
-
-aldeg_cas05.gat,1,1,1 script Agit_A05_Timer -1,{
-OnTimer500:
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1132,4;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1219,2;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1205,1;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1216,10;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1193,18;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1269,9;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1276,7;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1208,3;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1268,1;
- areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1272,1;
- monster "aldeg_cas05.gat",27,101,"--ja--",1272,1;
- monster "aldeg_cas05.gat",27,101,"--ja--",1270,4;
- monster "aldeg_cas05.gat",27,101,"--ja--",1268,1;
- monster "aldeg_cas05.gat",27,101,"--ja--",1219,1;
- monster "aldeg_cas05.gat",27,101,"--ja--",1276,5;
- Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
- stopnpctimer "Agit_A05_Timer";
- Break;
- }
-//--------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - Al de Baran Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Al de Baran Guild Wars
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//= 1.2 by Akaru (Castle spawn/conquering fix)
+//============================================================
+
+
+aldeg_cas01.gat,216,24,0 script Agit_A01 -1,{
+OnAgitInit:
+ GetCastleData "aldeg_cas01.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
+ Break;
+OnRecvCastleA01:
+ RequestGuildInfo GetCastleData("aldeg_cas01.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),2;
+ Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
+ GvgOn "aldeg_cas01.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa1,getcharid(2);
+ if (@GIDa1 <= 0) Break;
+ set @Economy,GetCastleData("aldeg_cas01.gat",2);
+ SetCastleData "aldeg_cas01.gat",2,@Economy-5;
+ if (GetCastleData("aldeg_cas01.gat",2) < 0) SetCastleData "aldeg_cas01.gat",2,0;
+ set @Defence,GetCastleData("aldeg_cas01.gat",3);
+ SetCastleData "aldeg_cas01.gat",3,@Defence-5;
+ if (GetCastleData("aldeg_cas01.gat",3) < 0) SetCastleData "aldeg_cas01.gat",3,0;
+ SetCastleData "aldeg_cas01.gat",1,@GIDa1;
+ Announce "Guild Base [" + GetCastleName("aldeg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDa1) + "] guild.",0;
+ MapAnnounce "aldeg_cas01.gat","The emperium has been destroyed.",17;
+ GetCastleData "aldeg_cas01.gat",0,"::OnRecvCastleA01";
+ SetCastleData "aldeg_cas01.gat",2,0;
+ SetCastleData "aldeg_cas01.gat",3,0;
+ SetCastleData "aldeg_cas01.gat",4,0;
+ SetCastleData "aldeg_cas01.gat",5,0;
+ SetCastleData "aldeg_cas01.gat",6,0;
+ SetCastleData "aldeg_cas01.gat",7,0;
+ SetCastleData "aldeg_cas01.gat",8,0;
+ SetCastleData "aldeg_cas01.gat",9,0;
+ SetCastleData "aldeg_cas01.gat",10,0;
+ SetCastleData "aldeg_cas01.gat",11,0;
+ SetCastleData "aldeg_cas01.gat",12,0;
+ SetCastleData "aldeg_cas01.gat",13,0;
+ SetCastleData "aldeg_cas01.gat",14,0;
+ SetCastleData "aldeg_cas01.gat",15,0;
+ SetCastleData "aldeg_cas01.gat",16,0;
+ SetCastleData "aldeg_cas01.gat",17,0;
+ SetCastleData "aldeg_cas01.gat",18,0;
+ SetCastleData "aldeg_cas01.gat",19,0;
+ SetCastleData "aldeg_cas01.gat",20,0;
+ SetCastleData "aldeg_cas01.gat",21,0;
+ SetCastleData "aldeg_cas01.gat",22,0;
+ SetCastleData "aldeg_cas01.gat",23,0;
+ SetCastleData "aldeg_cas01.gat",24,0;
+ SetCastleData "aldeg_cas01.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),6;
+ Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas01.gat",GetCastleData("aldeg_cas01.gat",1),4;
+ KillMonster "aldeg_cas01.gat","Agit_A01::OnAgitBreak";
+ GvgOff "aldeg_cas01.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_A01_Timer";
+}
+
+aldeg_cas01.gat,1,1,1 script Agit_A01_Timer -1,{
+OnTimer500:
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1132,4;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1219,2;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1205,1;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1216,10;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1193,17;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1269,9;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1276,7;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1208,3;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1268,1;
+ areamonster "aldeg_cas01.gat",0,0,300,300,"--ja--",1272,1;
+ monster "aldeg_cas01.gat",216,23,"--ja--",1272,1;
+ monster "aldeg_cas01.gat",216,23,"--ja--",1270,4;
+ monster "aldeg_cas01.gat",216,23,"--ja--",1268,1;
+ monster "aldeg_cas01.gat",216,23,"--ja--",1219,1;
+ monster "aldeg_cas01.gat",216,23,"--ja--",1276,5;
+ Monster "aldeg_cas01.gat",216,24,"EMPERIUM",1288,1,"Agit_A01::OnAgitBreak";
+ stopnpctimer "Agit_A01_Timer";
+ Break;
+ }
+//--------------------------------------------------------------------------------------------------------------------------
+aldeg_cas02.gat,214,24,0 script Agit_A02 -1,{
+OnAgitInit:
+ GetCastleData "aldeg_cas02.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
+ Break;
+OnRecvCastleA02:
+ RequestGuildInfo GetCastleData("aldeg_cas02.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),2;
+ Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
+ GvgOn "aldeg_cas02.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa2,getcharid(2);
+ if (@GIDa2 <= 0) Break;
+ set @Economy,GetCastleData("aldeg_cas02.gat",2);
+ SetCastleData "aldeg_cas02.gat",2,@Economy-5;
+ if (GetCastleData("aldeg_cas02.gat",2) < 0) SetCastleData "aldeg_cas02.gat",2,0;
+ set @Defence,GetCastleData("aldeg_cas02.gat",3);
+ SetCastleData "aldeg_cas02.gat",3,@Defence-5;
+ if (GetCastleData("aldeg_cas02.gat",3) < 0) SetCastleData "aldeg_cas02.gat",3,0;
+ SetCastleData "aldeg_cas02.gat",1,@GIDa2;
+ Announce "Guild Base [" + GetCastleName("aldeg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDa2) + "] guild.",0;
+ MapAnnounce "aldeg_cas02.gat","The emperium has been destroyed.",17;
+ GetCastleData "aldeg_cas02.gat",0,"::OnRecvCastleA02";
+ SetCastleData "aldeg_cas02.gat",2,0;
+ SetCastleData "aldeg_cas02.gat",3,0;
+ SetCastleData "aldeg_cas02.gat",4,0;
+ SetCastleData "aldeg_cas02.gat",5,0;
+ SetCastleData "aldeg_cas02.gat",6,0;
+ SetCastleData "aldeg_cas02.gat",7,0;
+ SetCastleData "aldeg_cas02.gat",8,0;
+ SetCastleData "aldeg_cas02.gat",9,0;
+ SetCastleData "aldeg_cas02.gat",10,0;
+ SetCastleData "aldeg_cas02.gat",11,0;
+ SetCastleData "aldeg_cas02.gat",12,0;
+ SetCastleData "aldeg_cas02.gat",13,0;
+ SetCastleData "aldeg_cas02.gat",14,0;
+ SetCastleData "aldeg_cas02.gat",15,0;
+ SetCastleData "aldeg_cas02.gat",16,0;
+ SetCastleData "aldeg_cas02.gat",17,0;
+ SetCastleData "aldeg_cas02.gat",18,0;
+ SetCastleData "aldeg_cas02.gat",19,0;
+ SetCastleData "aldeg_cas02.gat",20,0;
+ SetCastleData "aldeg_cas02.gat",21,0;
+ SetCastleData "aldeg_cas02.gat",22,0;
+ SetCastleData "aldeg_cas02.gat",23,0;
+ SetCastleData "aldeg_cas02.gat",24,0;
+ SetCastleData "aldeg_cas02.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),6;
+ Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas02.gat",GetCastleData("aldeg_cas02.gat",1),4;
+ KillMonster "aldeg_cas02.gat","Agit_A02::OnAgitBreak";
+ GvgOff "aldeg_cas02.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_A02_Timer";
+}
+
+aldeg_cas02.gat,1,1,1 script Agit_A02_Timer -1,{
+OnTimer500:
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1132,4;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1219,2;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1205,1;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1216,10;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1193,18;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1269,9;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1276,7;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1208,3;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1268,1;
+ areamonster "aldeg_cas02.gat",0,0,300,300,"--ja--",1272,1;
+ monster "aldeg_cas02.gat",213,23,"--ja--",1272,1;
+ monster "aldeg_cas02.gat",213,23,"--ja--",1270,4;
+ monster "aldeg_cas02.gat",213,23,"--ja--",1268,1;
+ monster "aldeg_cas02.gat",213,23,"--ja--",1219,1;
+ monster "aldeg_cas02.gat",213,23,"--ja--",1276,5;
+ Monster "aldeg_cas02.gat",214,24,"EMPERIUM",1288,1,"Agit_A02::OnAgitBreak";
+ stopnpctimer "Agit_A02_Timer";
+ Break;
+ }
+//--------------------------------------------------------------------------------------------------------------------------
+aldeg_cas03.gat,206,32,0 script Agit_A03 -1,{
+OnAgitInit:
+ GetCastleData "aldeg_cas03.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
+ Break;
+OnRecvCastleA03:
+ RequestGuildInfo GetCastleData("aldeg_cas03.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),2;
+ Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
+ GvgOn "aldeg_cas03.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa3,getcharid(2);
+ if (@GIDa3 <= 0) Break;
+ set @Economy,GetCastleData("aldeg_cas03.gat",2);
+ SetCastleData "aldeg_cas03.gat",2,@Economy-5;
+ if (GetCastleData("aldeg_cas03.gat",2) < 0) SetCastleData "aldeg_cas03.gat",2,0;
+ set @Defence,GetCastleData("aldeg_cas03.gat",3);
+ SetCastleData "aldeg_cas03.gat",3,@Defence-5;
+ if (GetCastleData("aldeg_cas01.gat",3) < 0) SetCastleData "aldeg_cas03.gat",3,0;
+ SetCastleData "aldeg_cas03.gat",1,@GIDa3;
+ Announce "Guild Base [" + GetCastleName("aldeg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDa3) + "] guild.",0;
+ MapAnnounce "aldeg_cas03.gat","The emperium has been destroyed.",17;
+ GetCastleData "aldeg_cas03.gat",0,"::OnRecvCastleA03";
+ SetCastleData "aldeg_cas03.gat",2,0;
+ SetCastleData "aldeg_cas03.gat",3,0;
+ SetCastleData "aldeg_cas03.gat",4,0;
+ SetCastleData "aldeg_cas03.gat",5,0;
+ SetCastleData "aldeg_cas03.gat",6,0;
+ SetCastleData "aldeg_cas03.gat",7,0;
+ SetCastleData "aldeg_cas03.gat",8,0;
+ SetCastleData "aldeg_cas03.gat",9,0;
+ SetCastleData "aldeg_cas03.gat",10,0;
+ SetCastleData "aldeg_cas03.gat",11,0;
+ SetCastleData "aldeg_cas03.gat",12,0;
+ SetCastleData "aldeg_cas03.gat",13,0;
+ SetCastleData "aldeg_cas03.gat",14,0;
+ SetCastleData "aldeg_cas03.gat",15,0;
+ SetCastleData "aldeg_cas03.gat",16,0;
+ SetCastleData "aldeg_cas03.gat",17,0;
+ SetCastleData "aldeg_cas03.gat",18,0;
+ SetCastleData "aldeg_cas03.gat",19,0;
+ SetCastleData "aldeg_cas03.gat",20,0;
+ SetCastleData "aldeg_cas03.gat",21,0;
+ SetCastleData "aldeg_cas03.gat",22,0;
+ SetCastleData "aldeg_cas03.gat",23,0;
+ SetCastleData "aldeg_cas03.gat",24,0;
+ SetCastleData "aldeg_cas03.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),6;
+ Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas03.gat",GetCastleData("aldeg_cas03.gat",1),4;
+ KillMonster "aldeg_cas03.gat","Agit_A03::OnAgitBreak";
+ GvgOff "aldeg_cas03.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_A03_Timer";
+}
+
+aldeg_cas03.gat,1,1,1 script Agit_A03_Timer -1,{
+OnTimer500:
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1132,4;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1219,2;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1205,1;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1216,10;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1193,18;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1269,9;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1276,7;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1208,3;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1268,1;
+ areamonster "aldeg_cas03.gat",0,0,300,300,"--ja--",1272,1;
+ monster "aldeg_cas03.gat",205,31,"--ja--",1272,1;
+ monster "aldeg_cas03.gat",205,31,"--ja--",1270,4;
+ monster "aldeg_cas03.gat",205,31,"--ja--",1268,1;
+ monster "aldeg_cas03.gat",205,31,"--ja--",1219,1;
+ monster "aldeg_cas03.gat",205,31,"--ja--",1276,5;
+ Monster "aldeg_cas03.gat",206,32,"EMPERIUM",1288,1,"Agit_A03::OnAgitBreak";
+ stopnpctimer "Agit_A03_Timer";
+ Break;
+ }
+//--------------------------------------------------------------------------------------------------------------------------
+aldeg_cas04.gat,36,218,0 script Agit_A04 -1,{
+OnAgitInit:
+ GetCastleData "aldeg_cas04.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
+ Break;
+OnRecvCastleA04:
+ RequestGuildInfo GetCastleData("aldeg_cas04.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),2;
+ Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
+ GvgOn "aldeg_cas04.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa4,getcharid(2);
+ if (@GIDa4 <= 0) Break;
+ set @Economy,GetCastleData("aldeg_cas04.gat",2);
+ SetCastleData "aldeg_cas04.gat",2,@Economy-5;
+ if (GetCastleData("aldeg_cas04.gat",2) < 0) SetCastleData "aldeg_cas04.gat",2,0;
+ set @Defence,GetCastleData("aldeg_cas04.gat",3);
+ SetCastleData "aldeg_cas04.gat",3,@Defence-5;
+ if (GetCastleData("aldeg_cas04.gat",3) < 0) SetCastleData "aldeg_cas04.gat",3,0;
+ SetCastleData "aldeg_cas04.gat",1,@GIDa4;
+ Announce "Guild Base [" + GetCastleName("aldeg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDa4) + "] guild.",0;
+ MapAnnounce "aldeg_cas04.gat","The emperium has been destroyed.",17;
+ GetCastleData "aldeg_cas04.gat",0,"::OnRecvCastleA04";
+ SetCastleData "aldeg_cas04.gat",2,0;
+ SetCastleData "aldeg_cas04.gat",3,0;
+ SetCastleData "aldeg_cas04.gat",4,0;
+ SetCastleData "aldeg_cas04.gat",5,0;
+ SetCastleData "aldeg_cas04.gat",6,0;
+ SetCastleData "aldeg_cas04.gat",7,0;
+ SetCastleData "aldeg_cas04.gat",8,0;
+ SetCastleData "aldeg_cas04.gat",9,0;
+ SetCastleData "aldeg_cas04.gat",10,0;
+ SetCastleData "aldeg_cas04.gat",11,0;
+ SetCastleData "aldeg_cas04.gat",12,0;
+ SetCastleData "aldeg_cas04.gat",13,0;
+ SetCastleData "aldeg_cas04.gat",14,0;
+ SetCastleData "aldeg_cas04.gat",15,0;
+ SetCastleData "aldeg_cas04.gat",16,0;
+ SetCastleData "aldeg_cas04.gat",17,0;
+ SetCastleData "aldeg_cas04.gat",18,0;
+ SetCastleData "aldeg_cas04.gat",19,0;
+ SetCastleData "aldeg_cas04.gat",20,0;
+ SetCastleData "aldeg_cas04.gat",21,0;
+ SetCastleData "aldeg_cas04.gat",22,0;
+ SetCastleData "aldeg_cas04.gat",23,0;
+ SetCastleData "aldeg_cas04.gat",24,0;
+ SetCastleData "aldeg_cas04.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),6;
+ Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas04.gat",GetCastleData("aldeg_cas04.gat",1),4;
+ KillMonster "aldeg_cas04.gat","Agit_A04::OnAgitBreak";
+ GvgOff "aldeg_cas04.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_A04_Timer";
+}
+
+aldeg_cas04.gat,1,1,1 script Agit_A04_Timer -1,{
+OnTimer500:
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1132,4;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1219,2;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1205,1;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1216,10;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1193,18;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1269,9;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1276,7;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1208,3;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1268,1;
+ areamonster "aldeg_cas04.gat",0,0,300,300,"--ja--",1272,1;
+ monster "aldeg_cas04.gat",36,217,"--ja--",1272,1;
+ monster "aldeg_cas04.gat",36,217,"--ja--",1270,4;
+ monster "aldeg_cas04.gat",36,217,"--ja--",1268,1;
+ monster "aldeg_cas04.gat",36,217,"--ja--",1219,1;
+ monster "aldeg_cas04.gat",36,217,"--ja--",1276,5;
+ Monster "aldeg_cas04.gat",36,218,"EMPERIUM",1288,1,"Agit_A04::OnAgitBreak";
+ stopnpctimer "Agit_A04_Timer";
+ Break;
+ }
+//--------------------------------------------------------------------------------------------------------------------------
+aldeg_cas05.gat,28,102,0 script Agit_A05 -1,{
+OnAgitInit:
+ GetCastleData "aldeg_cas05.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
+ Break;
+OnRecvCastleA05:
+ RequestGuildInfo GetCastleData("aldeg_cas05.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),2;
+ Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
+ GvgOn "aldeg_cas05.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa5,getcharid(2);
+ if (@GIDa5 <= 0) Break;
+ set @Economy,GetCastleData("aldeg_cas05.gat",2);
+ SetCastleData "aldeg_cas05.gat",2,@Economy-5;
+ if (GetCastleData("aldeg_cas05.gat",2) < 0) SetCastleData "aldeg_cas05.gat",2,0;
+ set @Defence,GetCastleData("aldeg_cas05.gat",3);
+ SetCastleData "aldeg_cas05.gat",3,@Defence-5;
+ if (GetCastleData("aldeg_cas05.gat",3) < 0) SetCastleData "aldeg_cas05.gat",3,0;
+ SetCastleData "aldeg_cas05.gat",1,@GIDa5;
+ Announce "Guild Base [" + GetCastleName("aldeg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDa5) + "] guild.",0;
+ MapAnnounce "aldeg_cas05.gat","The emperium has been destroyed.",17;
+ GetCastleData "aldeg_cas05.gat",0,"::OnRecvCastleA05";
+ SetCastleData "aldeg_cas05.gat",2,0;
+ SetCastleData "aldeg_cas05.gat",3,0;
+ SetCastleData "aldeg_cas05.gat",4,0;
+ SetCastleData "aldeg_cas05.gat",5,0;
+ SetCastleData "aldeg_cas05.gat",6,0;
+ SetCastleData "aldeg_cas05.gat",7,0;
+ SetCastleData "aldeg_cas05.gat",8,0;
+ SetCastleData "aldeg_cas05.gat",9,0;
+ SetCastleData "aldeg_cas05.gat",10,0;
+ SetCastleData "aldeg_cas05.gat",11,0;
+ SetCastleData "aldeg_cas05.gat",12,0;
+ SetCastleData "aldeg_cas05.gat",13,0;
+ SetCastleData "aldeg_cas05.gat",14,0;
+ SetCastleData "aldeg_cas05.gat",15,0;
+ SetCastleData "aldeg_cas05.gat",16,0;
+ SetCastleData "aldeg_cas05.gat",17,0;
+ SetCastleData "aldeg_cas05.gat",18,0;
+ SetCastleData "aldeg_cas05.gat",19,0;
+ SetCastleData "aldeg_cas05.gat",20,0;
+ SetCastleData "aldeg_cas05.gat",21,0;
+ SetCastleData "aldeg_cas05.gat",22,0;
+ SetCastleData "aldeg_cas05.gat",23,0;
+ SetCastleData "aldeg_cas05.gat",24,0;
+ SetCastleData "aldeg_cas05.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),6;
+ Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "aldeg_cas05.gat",GetCastleData("aldeg_cas05.gat",1),4;
+ KillMonster "aldeg_cas05.gat","Agit_A05::OnAgitBreak";
+ GvgOff "aldeg_cas05.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_A05_Timer";
+}
+
+aldeg_cas05.gat,1,1,1 script Agit_A05_Timer -1,{
+OnTimer500:
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1132,4;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1219,2;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1205,1;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1216,10;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1193,18;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1269,9;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1276,7;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1208,3;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1268,1;
+ areamonster "aldeg_cas05.gat",0,0,300,300,"--ja--",1272,1;
+ monster "aldeg_cas05.gat",27,101,"--ja--",1272,1;
+ monster "aldeg_cas05.gat",27,101,"--ja--",1270,4;
+ monster "aldeg_cas05.gat",27,101,"--ja--",1268,1;
+ monster "aldeg_cas05.gat",27,101,"--ja--",1219,1;
+ monster "aldeg_cas05.gat",27,101,"--ja--",1276,5;
+ Monster "aldeg_cas05.gat",28,102,"EMPERIUM",1288,1,"Agit_A05::OnAgitBreak";
+ stopnpctimer "Agit_A05_Timer";
+ Break;
+ }
+//--------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/ev_agit_event.txt b/npc/guild/old/ev_agit_event.txt
index c68bec74a..d71beb179 100644
--- a/npc/guild/old/ev_agit_event.txt
+++ b/npc/guild/old/ev_agit_event.txt
@@ -1,34 +1,34 @@
-//===== eAthena Script =======================================
-//= War of Emperium - WoE Auto-Start
-//===== By: ==================================================
-//= kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Auto Start for War of Emperium
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//============================================================
-
-// Auto Start Agit NPC
-prontera.gat,116,72,0 script Agit_Event -1,{
-OnInit:
- if ($AgitStarted == 1) goto AgitReboot;
- Break;
-OnClock1900:
- Announce "The War Of Emperium has begun!",8;
- AgitStart;
- set $AgitStarted,1;
- Break;
-OnClock2100:
- Announce "The War Of Emperium is over!",8;
- AgitEnd;
- set $AgitStarted,0;
- Break;
-AgitReboot:
- AgitStart;
- set $AgitStarted,1;
- Break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - WoE Auto-Start
+//===== By: ==================================================
+//= kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Auto Start for War of Emperium
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//============================================================
+
+// Auto Start Agit NPC
+prontera.gat,116,72,0 script Agit_Event -1,{
+OnInit:
+ if ($AgitStarted == 1) goto AgitReboot;
+ Break;
+OnClock1900:
+ Announce "The War Of Emperium has begun!",8;
+ AgitStart;
+ set $AgitStarted,1;
+ Break;
+OnClock2100:
+ Announce "The War Of Emperium is over!",8;
+ AgitEnd;
+ set $AgitStarted,0;
+ Break;
+AgitReboot:
+ AgitStart;
+ set $AgitStarted,1;
+ Break;
+}
diff --git a/npc/guild/old/ev_agit_gefg.txt b/npc/guild/old/ev_agit_gefg.txt
index bcb6640ac..684491760 100644
--- a/npc/guild/old/ev_agit_gefg.txt
+++ b/npc/guild/old/ev_agit_gefg.txt
@@ -1,464 +1,464 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Geffen Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Geffen Guild Wars
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//= 1.2 by Akaru (Castle spawn/conquering fix)
-//============================================================
-
-
-gefg_cas01.gat,198,182,0 script Agit_B01 -1,{
-OnAgitInit:
- GetCastleData "gefg_cas01.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
- Break;
-OnRecvCastleG01:
- RequestGuildInfo GetCastleData("gefg_cas01.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("gefg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),2;
- Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
- GvgOn "gefg_cas01.gat";
- Break;
-OnAgitBreak:
- set @GIDa1,getcharid(2);
- if (@GIDa1 <= 0) Break;
- set @Economy,GetCastleData("gefg_cas01.gat",2);
- SetCastleData "gefg_cas01.gat",2,@Economy-5;
- if (GetCastleData("gefg_cas01.gat",2) < 0) SetCastleData "gefg_cas01.gat",2,0;
- set @Defence,GetCastleData("gefg_cas01.gat",3);
- SetCastleData "gefg_cas01.gat",3,@Defence-5;
- if (GetCastleData("gefg_cas01.gat",3) < 0) SetCastleData "gefg_cas01.gat",3,0;
- SetCastleData "gefg_cas01.gat",1,@GIDa1;
- Announce "Guild Base [" + GetCastleName("gefg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDa1) + "] guild.",0;
- MapAnnounce "gefg_cas01.gat","The emperium has been destroyed.",17;
- GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
- SetCastleData "gefg_cas01.gat",2,0;
- SetCastleData "gefg_cas01.gat",3,0;
- SetCastleData "gefg_cas01.gat",4,0;
- SetCastleData "gefg_cas01.gat",5,0;
- SetCastleData "gefg_cas01.gat",6,0;
- SetCastleData "gefg_cas01.gat",7,0;
- SetCastleData "gefg_cas01.gat",8,0;
- SetCastleData "gefg_cas01.gat",9,0;
- SetCastleData "gefg_cas01.gat",10,0;
- SetCastleData "gefg_cas01.gat",11,0;
- SetCastleData "gefg_cas01.gat",12,0;
- SetCastleData "gefg_cas01.gat",13,0;
- SetCastleData "gefg_cas01.gat",14,0;
- SetCastleData "gefg_cas01.gat",15,0;
- SetCastleData "gefg_cas01.gat",16,0;
- SetCastleData "gefg_cas01.gat",17,0;
- SetCastleData "gefg_cas01.gat",18,0;
- SetCastleData "gefg_cas01.gat",19,0;
- SetCastleData "gefg_cas01.gat",20,0;
- SetCastleData "gefg_cas01.gat",21,0;
- SetCastleData "gefg_cas01.gat",22,0;
- SetCastleData "gefg_cas01.gat",23,0;
- SetCastleData "gefg_cas01.gat",24,0;
- SetCastleData "gefg_cas01.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),6;
- Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("gefg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),4;
- KillMonster "gefg_cas01.gat","Agit_B01::OnAgitBreak";
- GvgOff "gefg_cas01.gat";
- Break;
-OnInit:
-initnpctimer "Agit_B01_Timer";
-}
-
-gefg_cas01.gat,1,1,1 script Agit_B01_Timer -1,{
-OnTimer500:
- if (GetCastleData("gefg_cas01.gat",1) != 0) break;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1263,11;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1102,10;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1130,10;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1140,20;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1163,9;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1219,1;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1159,1;
- monster "gefg_cas01.gat",197,181,"--ja--",1203,1;
- monster "gefg_cas01.gat",197,181,"--ja--",1087,1;
- monster "gefg_cas01.gat",197,181,"--ja--",1213,10;
- monster "gefg_cas01.gat",197,181,"--ja--",1189,10;
- monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
- stopnpctimer "Agit_B01_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-gefg_cas02.gat,176,178,0 script Agit_B02 -1,{
-OnAgitInit:
- GetCastleData "gefg_cas02.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
- Break;
-OnRecvCastleG02:
- RequestGuildInfo GetCastleData("gefg_cas02.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("gefg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),2;
- Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
- GvgOn "gefg_cas02.gat";
- Break;
-OnAgitBreak:
- set @GIDa2,getcharid(2);
- if (@GIDa2 <= 0) Break;
- set @Economy,GetCastleData("gefg_cas02.gat",2);
- SetCastleData "gefg_cas02.gat",2,@Economy-5;
- if (GetCastleData("gefg_cas02.gat",2) < 0) SetCastleData "gefg_cas02.gat",2,0;
- set @Defence,GetCastleData("gefg_cas02.gat",3);
- SetCastleData "gefg_cas02.gat",3,@Defence-5;
- if (GetCastleData("gefg_cas02.gat",3) < 0) SetCastleData "gefg_cas02.gat",3,0;
- SetCastleData "gefg_cas02.gat",1,@GIDa2;
- Announce "Guild Base [" + GetCastleName("gefg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDa2) + "] guild.",0;
- MapAnnounce "gefg_cas02.gat","The emperium has been destroyed.",17;
- GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
- SetCastleData "gefg_cas02.gat",2,0;
- SetCastleData "gefg_cas02.gat",3,0;
- SetCastleData "gefg_cas02.gat",4,0;
- SetCastleData "gefg_cas02.gat",5,0;
- SetCastleData "gefg_cas02.gat",6,0;
- SetCastleData "gefg_cas02.gat",7,0;
- SetCastleData "gefg_cas02.gat",8,0;
- SetCastleData "gefg_cas02.gat",9,0;
- SetCastleData "gefg_cas02.gat",10,0;
- SetCastleData "gefg_cas02.gat",11,0;
- SetCastleData "gefg_cas02.gat",12,0;
- SetCastleData "gefg_cas02.gat",13,0;
- SetCastleData "gefg_cas02.gat",14,0;
- SetCastleData "gefg_cas02.gat",15,0;
- SetCastleData "gefg_cas02.gat",16,0;
- SetCastleData "gefg_cas02.gat",17,0;
- SetCastleData "gefg_cas02.gat",18,0;
- SetCastleData "gefg_cas02.gat",19,0;
- SetCastleData "gefg_cas02.gat",20,0;
- SetCastleData "gefg_cas02.gat",21,0;
- SetCastleData "gefg_cas02.gat",22,0;
- SetCastleData "gefg_cas02.gat",23,0;
- SetCastleData "gefg_cas02.gat",24,0;
- SetCastleData "gefg_cas02.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),6;
- Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("gefg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),4;
- KillMonster "gefg_cas02.gat","Agit_B02::OnAgitBreak";
- GvgOff "gefg_cas02.gat";
- Break;
-OnInit:
-initnpctimer "Agit_B02_Timer";
-}
-
-gefg_cas02.gat,1,1,1 script Agit_B02_Timer -1,{
-OnTimer500:
- if (GetCastleData("gefg_cas02.gat",1) != 0) break;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1263,11;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1102,10;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1130,10;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1140,20;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1163,9;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1219,1;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1159,1;
- monster "gefg_cas02.gat",176,178,"--ja--",1203,1;
- monster "gefg_cas02.gat",176,178,"--ja--",1087,1;
- monster "gefg_cas02.gat",176,178,"--ja--",1213,7;
- monster "gefg_cas02.gat",176,178,"--ja--",1189,7;
- Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
- stopnpctimer "Agit_B02_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-gefg_cas03.gat,245,167,0 script Agit_B03 -1,{
-OnAgitInit:
- GetCastleData "gefg_cas03.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
- Break;
-OnRecvCastleG03:
- RequestGuildInfo GetCastleData("gefg_cas03.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("gefg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),2;
- Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
- GvgOn "gefg_cas03.gat";
- Break;
-OnAgitBreak:
- set @GIDa3,getcharid(2);
- if (@GIDa3 <= 0) Break;
- set @Economy,GetCastleData("gefg_cas03.gat",2);
- SetCastleData "gefg_cas03.gat",2,@Economy-5;
- if (GetCastleData("gefg_cas03.gat",2) < 0) SetCastleData "gefg_cas03.gat",2,0;
- set @Defence,GetCastleData("gefg_cas03.gat",3);
- SetCastleData "gefg_cas03.gat",3,@Defence-5;
- if (GetCastleData("gefg_cas01.gat",3) < 0) SetCastleData "gefg_cas03.gat",3,0;
- SetCastleData "gefg_cas03.gat",1,@GIDa3;
- Announce "Guild Base [" + GetCastleName("gefg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDa3) + "] guild.",0;
- MapAnnounce "gefg_cas03.gat","The emperium has been destroyed.",17;
- GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
- SetCastleData "gefg_cas03.gat",2,0;
- SetCastleData "gefg_cas03.gat",3,0;
- SetCastleData "gefg_cas03.gat",4,0;
- SetCastleData "gefg_cas03.gat",5,0;
- SetCastleData "gefg_cas03.gat",6,0;
- SetCastleData "gefg_cas03.gat",7,0;
- SetCastleData "gefg_cas03.gat",8,0;
- SetCastleData "gefg_cas03.gat",9,0;
- SetCastleData "gefg_cas03.gat",10,0;
- SetCastleData "gefg_cas03.gat",11,0;
- SetCastleData "gefg_cas03.gat",12,0;
- SetCastleData "gefg_cas03.gat",13,0;
- SetCastleData "gefg_cas03.gat",14,0;
- SetCastleData "gefg_cas03.gat",15,0;
- SetCastleData "gefg_cas03.gat",16,0;
- SetCastleData "gefg_cas03.gat",17,0;
- SetCastleData "gefg_cas03.gat",18,0;
- SetCastleData "gefg_cas03.gat",19,0;
- SetCastleData "gefg_cas03.gat",20,0;
- SetCastleData "gefg_cas03.gat",21,0;
- SetCastleData "gefg_cas03.gat",22,0;
- SetCastleData "gefg_cas03.gat",23,0;
- SetCastleData "gefg_cas03.gat",24,0;
- SetCastleData "gefg_cas03.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),6;
- Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("gefg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),4;
- KillMonster "gefg_cas03.gat","Agit_B03::OnAgitBreak";
- GvgOff "gefg_cas03.gat";
- Break;
-OnInit:
-initnpctimer "Agit_B03_Timer";
-}
-
-gefg_cas03.gat,1,1,1 script Agit_B03_Timer -1,{
-OnTimer500:
- if (GetCastleData("gefg_cas03.gat",1) != 0) break;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1263,11;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1102,10;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1130,10;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1140,20;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1163,9;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1219,1;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1159,1;
- monster "gefg_cas03.gat",244,166,"--ja--",1203,1;
- monster "gefg_cas03.gat",244,166,"--ja--",1087,1;
- monster "gefg_cas03.gat",244,166,"--ja--",1213,7;
- monster "gefg_cas03.gat",244,166,"--ja--",1189,7;
- Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
- stopnpctimer "Agit_B03_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-gefg_cas04.gat,174,178,0 script Agit_B04 -1,{
-OnAgitInit:
- GetCastleData "gefg_cas04.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
- Break;
-OnRecvCastleG04:
- RequestGuildInfo GetCastleData("gefg_cas04.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("gefg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),2;
- Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
- GvgOn "gefg_cas04.gat";
- Break;
-OnAgitBreak:
- set @GIDa4,getcharid(2);
- if (@GIDa4 <= 0) Break;
- set @Economy,GetCastleData("gefg_cas04.gat",2);
- SetCastleData "gefg_cas04.gat",2,@Economy-5;
- if (GetCastleData("gefg_cas04.gat",2) < 0) SetCastleData "gefg_cas04.gat",2,0;
- set @Defence,GetCastleData("gefg_cas04.gat",3);
- SetCastleData "gefg_cas04.gat",3,@Defence-5;
- if (GetCastleData("gefg_cas04.gat",3) < 0) SetCastleData "gefg_cas04.gat",3,0;
- SetCastleData "gefg_cas04.gat",1,@GIDa4;
- Announce "Guild Base [" + GetCastleName("gefg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDa4) + "] guild.",0;
- MapAnnounce "gefg_cas04.gat","The emperium has been destroyed.",17;
- GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
- SetCastleData "gefg_cas04.gat",2,0;
- SetCastleData "gefg_cas04.gat",3,0;
- SetCastleData "gefg_cas04.gat",4,0;
- SetCastleData "gefg_cas04.gat",5,0;
- SetCastleData "gefg_cas04.gat",6,0;
- SetCastleData "gefg_cas04.gat",7,0;
- SetCastleData "gefg_cas04.gat",8,0;
- SetCastleData "gefg_cas04.gat",9,0;
- SetCastleData "gefg_cas04.gat",10,0;
- SetCastleData "gefg_cas04.gat",11,0;
- SetCastleData "gefg_cas04.gat",12,0;
- SetCastleData "gefg_cas04.gat",13,0;
- SetCastleData "gefg_cas04.gat",14,0;
- SetCastleData "gefg_cas04.gat",15,0;
- SetCastleData "gefg_cas04.gat",16,0;
- SetCastleData "gefg_cas04.gat",17,0;
- SetCastleData "gefg_cas04.gat",18,0;
- SetCastleData "gefg_cas04.gat",19,0;
- SetCastleData "gefg_cas04.gat",20,0;
- SetCastleData "gefg_cas04.gat",21,0;
- SetCastleData "gefg_cas04.gat",22,0;
- SetCastleData "gefg_cas04.gat",23,0;
- SetCastleData "gefg_cas04.gat",24,0;
- SetCastleData "gefg_cas04.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),6;
- Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("gefg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),4;
- KillMonster "gefg_cas04.gat","Agit_B04::OnAgitBreak";
- GvgOff "gefg_cas04.gat";
- Break;
-OnInit:
-initnpctimer "Agit_B04_Timer";
-}
-
-gefg_cas04.gat,1,1,1 script Agit_B04_Timer -1,{
-OnTimer500:
- if (GetCastleData("gefg_cas04.gat",1) != 0) break;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1263,11;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1102,10;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1130,10;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1140,20;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1163,9;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1219,1;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1159,1;
- monster "gefg_cas04.gat",174,177,"--ja--",1203,1;
- monster "gefg_cas04.gat",174,177,"--ja--",1087,1;
- monster "gefg_cas04.gat",174,177,"--ja--",1213,7;
- monster "gefg_cas04.gat",174,177,"--ja--",1189,7;
- Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
- stopnpctimer "Agit_B04_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-gefg_cas05.gat,194,184,0 script Agit_B05 -1,{
-OnAgitInit:
- GetCastleData "gefg_cas05.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
- Break;
-OnRecvCastleG05:
- RequestGuildInfo GetCastleData("gefg_cas05.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("gefg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),2;
- Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
- GvgOn "gefg_cas05.gat";
- Break;
-OnAgitBreak:
- set @GIDa5,getcharid(2);
- if (@GIDa5 <= 0) Break;
- set @Economy,GetCastleData("gefg_cas05.gat",2);
- SetCastleData "gefg_cas05.gat",2,@Economy-5;
- if (GetCastleData("gefg_cas05.gat",2) < 0) SetCastleData "gefg_cas05.gat",2,0;
- set @Defence,GetCastleData("gefg_cas05.gat",3);
- SetCastleData "gefg_cas05.gat",3,@Defence-5;
- if (GetCastleData("gefg_cas05.gat",3) < 0) SetCastleData "gefg_cas05.gat",3,0;
- SetCastleData "gefg_cas05.gat",1,@GIDa5;
- Announce "Guild Base [" + GetCastleName("gefg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDa5) + "] guild.",0;
- MapAnnounce "gefg_cas05.gat","The emperium has been destroyed.",17;
- GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
- SetCastleData "gefg_cas05.gat",2,0;
- SetCastleData "gefg_cas05.gat",3,0;
- SetCastleData "gefg_cas05.gat",4,0;
- SetCastleData "gefg_cas05.gat",5,0;
- SetCastleData "gefg_cas05.gat",6,0;
- SetCastleData "gefg_cas05.gat",7,0;
- SetCastleData "gefg_cas05.gat",8,0;
- SetCastleData "gefg_cas05.gat",9,0;
- SetCastleData "gefg_cas05.gat",10,0;
- SetCastleData "gefg_cas05.gat",11,0;
- SetCastleData "gefg_cas05.gat",12,0;
- SetCastleData "gefg_cas05.gat",13,0;
- SetCastleData "gefg_cas05.gat",14,0;
- SetCastleData "gefg_cas05.gat",15,0;
- SetCastleData "gefg_cas05.gat",16,0;
- SetCastleData "gefg_cas05.gat",17,0;
- SetCastleData "gefg_cas05.gat",18,0;
- SetCastleData "gefg_cas05.gat",19,0;
- SetCastleData "gefg_cas05.gat",20,0;
- SetCastleData "gefg_cas05.gat",21,0;
- SetCastleData "gefg_cas05.gat",22,0;
- SetCastleData "gefg_cas05.gat",23,0;
- SetCastleData "gefg_cas05.gat",24,0;
- SetCastleData "gefg_cas05.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),6;
- Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("gefg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),4;
- KillMonster "gefg_cas05.gat","Agit_B05::OnAgitBreak";
- GvgOff "gefg_cas05.gat";
- Break;
-OnInit:
-initnpctimer "Agit_B05_Timer";
-}
-
-gefg_cas05.gat,1,1,1 script Agit_B05_Timer -1,{
-OnTimer500:
- if (GetCastleData("gefg_cas05.gat",1) != 0) break;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1117,10;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1263,11;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1102,10;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1130,10;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1140,20;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1163,9;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1219,1;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1159,1;
- monster "gefg_cas05.gat",194,184,"--ja--",1203,1;
- monster "gefg_cas05.gat",194,184,"--ja--",1087,1;
- monster "gefg_cas05.gat",194,184,"--ja--",1213,7;
- monster "gefg_cas05.gat",194,184,"--ja--",1189,7;
- Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
-}
-//--------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - Geffen Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Geffen Guild Wars
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//= 1.2 by Akaru (Castle spawn/conquering fix)
+//============================================================
+
+
+gefg_cas01.gat,198,182,0 script Agit_B01 -1,{
+OnAgitInit:
+ GetCastleData "gefg_cas01.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
+ Break;
+OnRecvCastleG01:
+ RequestGuildInfo GetCastleData("gefg_cas01.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("gefg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),2;
+ Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
+ GvgOn "gefg_cas01.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa1,getcharid(2);
+ if (@GIDa1 <= 0) Break;
+ set @Economy,GetCastleData("gefg_cas01.gat",2);
+ SetCastleData "gefg_cas01.gat",2,@Economy-5;
+ if (GetCastleData("gefg_cas01.gat",2) < 0) SetCastleData "gefg_cas01.gat",2,0;
+ set @Defence,GetCastleData("gefg_cas01.gat",3);
+ SetCastleData "gefg_cas01.gat",3,@Defence-5;
+ if (GetCastleData("gefg_cas01.gat",3) < 0) SetCastleData "gefg_cas01.gat",3,0;
+ SetCastleData "gefg_cas01.gat",1,@GIDa1;
+ Announce "Guild Base [" + GetCastleName("gefg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDa1) + "] guild.",0;
+ MapAnnounce "gefg_cas01.gat","The emperium has been destroyed.",17;
+ GetCastleData "gefg_cas01.gat",0,"::OnRecvCastleG01";
+ SetCastleData "gefg_cas01.gat",2,0;
+ SetCastleData "gefg_cas01.gat",3,0;
+ SetCastleData "gefg_cas01.gat",4,0;
+ SetCastleData "gefg_cas01.gat",5,0;
+ SetCastleData "gefg_cas01.gat",6,0;
+ SetCastleData "gefg_cas01.gat",7,0;
+ SetCastleData "gefg_cas01.gat",8,0;
+ SetCastleData "gefg_cas01.gat",9,0;
+ SetCastleData "gefg_cas01.gat",10,0;
+ SetCastleData "gefg_cas01.gat",11,0;
+ SetCastleData "gefg_cas01.gat",12,0;
+ SetCastleData "gefg_cas01.gat",13,0;
+ SetCastleData "gefg_cas01.gat",14,0;
+ SetCastleData "gefg_cas01.gat",15,0;
+ SetCastleData "gefg_cas01.gat",16,0;
+ SetCastleData "gefg_cas01.gat",17,0;
+ SetCastleData "gefg_cas01.gat",18,0;
+ SetCastleData "gefg_cas01.gat",19,0;
+ SetCastleData "gefg_cas01.gat",20,0;
+ SetCastleData "gefg_cas01.gat",21,0;
+ SetCastleData "gefg_cas01.gat",22,0;
+ SetCastleData "gefg_cas01.gat",23,0;
+ SetCastleData "gefg_cas01.gat",24,0;
+ SetCastleData "gefg_cas01.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),6;
+ Monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("gefg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),4;
+ KillMonster "gefg_cas01.gat","Agit_B01::OnAgitBreak";
+ GvgOff "gefg_cas01.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_B01_Timer";
+}
+
+gefg_cas01.gat,1,1,1 script Agit_B01_Timer -1,{
+OnTimer500:
+ if (GetCastleData("gefg_cas01.gat",1) != 0) break;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1263,11;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1102,10;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1130,10;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1140,20;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1163,9;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1219,1;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "gefg_cas01.gat",0,0,300,300,"--ja--",1159,1;
+ monster "gefg_cas01.gat",197,181,"--ja--",1203,1;
+ monster "gefg_cas01.gat",197,181,"--ja--",1087,1;
+ monster "gefg_cas01.gat",197,181,"--ja--",1213,10;
+ monster "gefg_cas01.gat",197,181,"--ja--",1189,10;
+ monster "gefg_cas01.gat",198,182,"EMPERIUM",1288,1,"Agit_B01::OnAgitBreak";
+ stopnpctimer "Agit_B01_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+gefg_cas02.gat,176,178,0 script Agit_B02 -1,{
+OnAgitInit:
+ GetCastleData "gefg_cas02.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
+ Break;
+OnRecvCastleG02:
+ RequestGuildInfo GetCastleData("gefg_cas02.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("gefg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),2;
+ Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
+ GvgOn "gefg_cas02.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa2,getcharid(2);
+ if (@GIDa2 <= 0) Break;
+ set @Economy,GetCastleData("gefg_cas02.gat",2);
+ SetCastleData "gefg_cas02.gat",2,@Economy-5;
+ if (GetCastleData("gefg_cas02.gat",2) < 0) SetCastleData "gefg_cas02.gat",2,0;
+ set @Defence,GetCastleData("gefg_cas02.gat",3);
+ SetCastleData "gefg_cas02.gat",3,@Defence-5;
+ if (GetCastleData("gefg_cas02.gat",3) < 0) SetCastleData "gefg_cas02.gat",3,0;
+ SetCastleData "gefg_cas02.gat",1,@GIDa2;
+ Announce "Guild Base [" + GetCastleName("gefg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDa2) + "] guild.",0;
+ MapAnnounce "gefg_cas02.gat","The emperium has been destroyed.",17;
+ GetCastleData "gefg_cas02.gat",0,"::OnRecvCastleG02";
+ SetCastleData "gefg_cas02.gat",2,0;
+ SetCastleData "gefg_cas02.gat",3,0;
+ SetCastleData "gefg_cas02.gat",4,0;
+ SetCastleData "gefg_cas02.gat",5,0;
+ SetCastleData "gefg_cas02.gat",6,0;
+ SetCastleData "gefg_cas02.gat",7,0;
+ SetCastleData "gefg_cas02.gat",8,0;
+ SetCastleData "gefg_cas02.gat",9,0;
+ SetCastleData "gefg_cas02.gat",10,0;
+ SetCastleData "gefg_cas02.gat",11,0;
+ SetCastleData "gefg_cas02.gat",12,0;
+ SetCastleData "gefg_cas02.gat",13,0;
+ SetCastleData "gefg_cas02.gat",14,0;
+ SetCastleData "gefg_cas02.gat",15,0;
+ SetCastleData "gefg_cas02.gat",16,0;
+ SetCastleData "gefg_cas02.gat",17,0;
+ SetCastleData "gefg_cas02.gat",18,0;
+ SetCastleData "gefg_cas02.gat",19,0;
+ SetCastleData "gefg_cas02.gat",20,0;
+ SetCastleData "gefg_cas02.gat",21,0;
+ SetCastleData "gefg_cas02.gat",22,0;
+ SetCastleData "gefg_cas02.gat",23,0;
+ SetCastleData "gefg_cas02.gat",24,0;
+ SetCastleData "gefg_cas02.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),6;
+ Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("gefg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),4;
+ KillMonster "gefg_cas02.gat","Agit_B02::OnAgitBreak";
+ GvgOff "gefg_cas02.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_B02_Timer";
+}
+
+gefg_cas02.gat,1,1,1 script Agit_B02_Timer -1,{
+OnTimer500:
+ if (GetCastleData("gefg_cas02.gat",1) != 0) break;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1263,11;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1102,10;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1130,10;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1140,20;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1163,9;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1219,1;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "gefg_cas02.gat",0,0,300,300,"--ja--",1159,1;
+ monster "gefg_cas02.gat",176,178,"--ja--",1203,1;
+ monster "gefg_cas02.gat",176,178,"--ja--",1087,1;
+ monster "gefg_cas02.gat",176,178,"--ja--",1213,7;
+ monster "gefg_cas02.gat",176,178,"--ja--",1189,7;
+ Monster "gefg_cas02.gat",176,178,"EMPERIUM",1288,1,"Agit_B02::OnAgitBreak";
+ stopnpctimer "Agit_B02_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+gefg_cas03.gat,245,167,0 script Agit_B03 -1,{
+OnAgitInit:
+ GetCastleData "gefg_cas03.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
+ Break;
+OnRecvCastleG03:
+ RequestGuildInfo GetCastleData("gefg_cas03.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("gefg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),2;
+ Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
+ GvgOn "gefg_cas03.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa3,getcharid(2);
+ if (@GIDa3 <= 0) Break;
+ set @Economy,GetCastleData("gefg_cas03.gat",2);
+ SetCastleData "gefg_cas03.gat",2,@Economy-5;
+ if (GetCastleData("gefg_cas03.gat",2) < 0) SetCastleData "gefg_cas03.gat",2,0;
+ set @Defence,GetCastleData("gefg_cas03.gat",3);
+ SetCastleData "gefg_cas03.gat",3,@Defence-5;
+ if (GetCastleData("gefg_cas01.gat",3) < 0) SetCastleData "gefg_cas03.gat",3,0;
+ SetCastleData "gefg_cas03.gat",1,@GIDa3;
+ Announce "Guild Base [" + GetCastleName("gefg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDa3) + "] guild.",0;
+ MapAnnounce "gefg_cas03.gat","The emperium has been destroyed.",17;
+ GetCastleData "gefg_cas03.gat",0,"::OnRecvCastleG03";
+ SetCastleData "gefg_cas03.gat",2,0;
+ SetCastleData "gefg_cas03.gat",3,0;
+ SetCastleData "gefg_cas03.gat",4,0;
+ SetCastleData "gefg_cas03.gat",5,0;
+ SetCastleData "gefg_cas03.gat",6,0;
+ SetCastleData "gefg_cas03.gat",7,0;
+ SetCastleData "gefg_cas03.gat",8,0;
+ SetCastleData "gefg_cas03.gat",9,0;
+ SetCastleData "gefg_cas03.gat",10,0;
+ SetCastleData "gefg_cas03.gat",11,0;
+ SetCastleData "gefg_cas03.gat",12,0;
+ SetCastleData "gefg_cas03.gat",13,0;
+ SetCastleData "gefg_cas03.gat",14,0;
+ SetCastleData "gefg_cas03.gat",15,0;
+ SetCastleData "gefg_cas03.gat",16,0;
+ SetCastleData "gefg_cas03.gat",17,0;
+ SetCastleData "gefg_cas03.gat",18,0;
+ SetCastleData "gefg_cas03.gat",19,0;
+ SetCastleData "gefg_cas03.gat",20,0;
+ SetCastleData "gefg_cas03.gat",21,0;
+ SetCastleData "gefg_cas03.gat",22,0;
+ SetCastleData "gefg_cas03.gat",23,0;
+ SetCastleData "gefg_cas03.gat",24,0;
+ SetCastleData "gefg_cas03.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),6;
+ Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("gefg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),4;
+ KillMonster "gefg_cas03.gat","Agit_B03::OnAgitBreak";
+ GvgOff "gefg_cas03.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_B03_Timer";
+}
+
+gefg_cas03.gat,1,1,1 script Agit_B03_Timer -1,{
+OnTimer500:
+ if (GetCastleData("gefg_cas03.gat",1) != 0) break;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1263,11;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1102,10;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1130,10;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1140,20;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1163,9;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1219,1;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "gefg_cas03.gat",0,0,300,300,"--ja--",1159,1;
+ monster "gefg_cas03.gat",244,166,"--ja--",1203,1;
+ monster "gefg_cas03.gat",244,166,"--ja--",1087,1;
+ monster "gefg_cas03.gat",244,166,"--ja--",1213,7;
+ monster "gefg_cas03.gat",244,166,"--ja--",1189,7;
+ Monster "gefg_cas03.gat",245,167,"EMPERIUM",1288,1,"Agit_B03::OnAgitBreak";
+ stopnpctimer "Agit_B03_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+gefg_cas04.gat,174,178,0 script Agit_B04 -1,{
+OnAgitInit:
+ GetCastleData "gefg_cas04.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
+ Break;
+OnRecvCastleG04:
+ RequestGuildInfo GetCastleData("gefg_cas04.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("gefg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),2;
+ Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
+ GvgOn "gefg_cas04.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa4,getcharid(2);
+ if (@GIDa4 <= 0) Break;
+ set @Economy,GetCastleData("gefg_cas04.gat",2);
+ SetCastleData "gefg_cas04.gat",2,@Economy-5;
+ if (GetCastleData("gefg_cas04.gat",2) < 0) SetCastleData "gefg_cas04.gat",2,0;
+ set @Defence,GetCastleData("gefg_cas04.gat",3);
+ SetCastleData "gefg_cas04.gat",3,@Defence-5;
+ if (GetCastleData("gefg_cas04.gat",3) < 0) SetCastleData "gefg_cas04.gat",3,0;
+ SetCastleData "gefg_cas04.gat",1,@GIDa4;
+ Announce "Guild Base [" + GetCastleName("gefg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDa4) + "] guild.",0;
+ MapAnnounce "gefg_cas04.gat","The emperium has been destroyed.",17;
+ GetCastleData "gefg_cas04.gat",0,"::OnRecvCastleG04";
+ SetCastleData "gefg_cas04.gat",2,0;
+ SetCastleData "gefg_cas04.gat",3,0;
+ SetCastleData "gefg_cas04.gat",4,0;
+ SetCastleData "gefg_cas04.gat",5,0;
+ SetCastleData "gefg_cas04.gat",6,0;
+ SetCastleData "gefg_cas04.gat",7,0;
+ SetCastleData "gefg_cas04.gat",8,0;
+ SetCastleData "gefg_cas04.gat",9,0;
+ SetCastleData "gefg_cas04.gat",10,0;
+ SetCastleData "gefg_cas04.gat",11,0;
+ SetCastleData "gefg_cas04.gat",12,0;
+ SetCastleData "gefg_cas04.gat",13,0;
+ SetCastleData "gefg_cas04.gat",14,0;
+ SetCastleData "gefg_cas04.gat",15,0;
+ SetCastleData "gefg_cas04.gat",16,0;
+ SetCastleData "gefg_cas04.gat",17,0;
+ SetCastleData "gefg_cas04.gat",18,0;
+ SetCastleData "gefg_cas04.gat",19,0;
+ SetCastleData "gefg_cas04.gat",20,0;
+ SetCastleData "gefg_cas04.gat",21,0;
+ SetCastleData "gefg_cas04.gat",22,0;
+ SetCastleData "gefg_cas04.gat",23,0;
+ SetCastleData "gefg_cas04.gat",24,0;
+ SetCastleData "gefg_cas04.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),6;
+ Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("gefg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),4;
+ KillMonster "gefg_cas04.gat","Agit_B04::OnAgitBreak";
+ GvgOff "gefg_cas04.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_B04_Timer";
+}
+
+gefg_cas04.gat,1,1,1 script Agit_B04_Timer -1,{
+OnTimer500:
+ if (GetCastleData("gefg_cas04.gat",1) != 0) break;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1263,11;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1102,10;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1130,10;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1140,20;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1163,9;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1219,1;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "gefg_cas04.gat",0,0,300,300,"--ja--",1159,1;
+ monster "gefg_cas04.gat",174,177,"--ja--",1203,1;
+ monster "gefg_cas04.gat",174,177,"--ja--",1087,1;
+ monster "gefg_cas04.gat",174,177,"--ja--",1213,7;
+ monster "gefg_cas04.gat",174,177,"--ja--",1189,7;
+ Monster "gefg_cas04.gat",174,178,"EMPERIUM",1288,1,"Agit_B04::OnAgitBreak";
+ stopnpctimer "Agit_B04_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+gefg_cas05.gat,194,184,0 script Agit_B05 -1,{
+OnAgitInit:
+ GetCastleData "gefg_cas05.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
+ Break;
+OnRecvCastleG05:
+ RequestGuildInfo GetCastleData("gefg_cas05.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("gefg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),2;
+ Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
+ GvgOn "gefg_cas05.gat";
+ Break;
+OnAgitBreak:
+ set @GIDa5,getcharid(2);
+ if (@GIDa5 <= 0) Break;
+ set @Economy,GetCastleData("gefg_cas05.gat",2);
+ SetCastleData "gefg_cas05.gat",2,@Economy-5;
+ if (GetCastleData("gefg_cas05.gat",2) < 0) SetCastleData "gefg_cas05.gat",2,0;
+ set @Defence,GetCastleData("gefg_cas05.gat",3);
+ SetCastleData "gefg_cas05.gat",3,@Defence-5;
+ if (GetCastleData("gefg_cas05.gat",3) < 0) SetCastleData "gefg_cas05.gat",3,0;
+ SetCastleData "gefg_cas05.gat",1,@GIDa5;
+ Announce "Guild Base [" + GetCastleName("gefg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDa5) + "] guild.",0;
+ MapAnnounce "gefg_cas05.gat","The emperium has been destroyed.",17;
+ GetCastleData "gefg_cas05.gat",0,"::OnRecvCastleG05";
+ SetCastleData "gefg_cas05.gat",2,0;
+ SetCastleData "gefg_cas05.gat",3,0;
+ SetCastleData "gefg_cas05.gat",4,0;
+ SetCastleData "gefg_cas05.gat",5,0;
+ SetCastleData "gefg_cas05.gat",6,0;
+ SetCastleData "gefg_cas05.gat",7,0;
+ SetCastleData "gefg_cas05.gat",8,0;
+ SetCastleData "gefg_cas05.gat",9,0;
+ SetCastleData "gefg_cas05.gat",10,0;
+ SetCastleData "gefg_cas05.gat",11,0;
+ SetCastleData "gefg_cas05.gat",12,0;
+ SetCastleData "gefg_cas05.gat",13,0;
+ SetCastleData "gefg_cas05.gat",14,0;
+ SetCastleData "gefg_cas05.gat",15,0;
+ SetCastleData "gefg_cas05.gat",16,0;
+ SetCastleData "gefg_cas05.gat",17,0;
+ SetCastleData "gefg_cas05.gat",18,0;
+ SetCastleData "gefg_cas05.gat",19,0;
+ SetCastleData "gefg_cas05.gat",20,0;
+ SetCastleData "gefg_cas05.gat",21,0;
+ SetCastleData "gefg_cas05.gat",22,0;
+ SetCastleData "gefg_cas05.gat",23,0;
+ SetCastleData "gefg_cas05.gat",24,0;
+ SetCastleData "gefg_cas05.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),6;
+ Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("gefg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),4;
+ KillMonster "gefg_cas05.gat","Agit_B05::OnAgitBreak";
+ GvgOff "gefg_cas05.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_B05_Timer";
+}
+
+gefg_cas05.gat,1,1,1 script Agit_B05_Timer -1,{
+OnTimer500:
+ if (GetCastleData("gefg_cas05.gat",1) != 0) break;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1117,10;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1263,11;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1102,10;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1130,10;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1140,20;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1163,9;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1219,1;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "gefg_cas05.gat",0,0,300,300,"--ja--",1159,1;
+ monster "gefg_cas05.gat",194,184,"--ja--",1203,1;
+ monster "gefg_cas05.gat",194,184,"--ja--",1087,1;
+ monster "gefg_cas05.gat",194,184,"--ja--",1213,7;
+ monster "gefg_cas05.gat",194,184,"--ja--",1189,7;
+ Monster "gefg_cas05.gat",194,184,"EMPERIUM",1288,1,"Agit_B05::OnAgitBreak";
+}
+//--------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/ev_agit_payg.txt b/npc/guild/old/ev_agit_payg.txt
index 6857f10b1..bb19d761f 100644
--- a/npc/guild/old/ev_agit_payg.txt
+++ b/npc/guild/old/ev_agit_payg.txt
@@ -1,466 +1,466 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Payon Guild Wars
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//= 1.2 by Akaru (Castle spawn/conquering fix)
-//============================================================
-
-
-payg_cas01.gat,139,139,0 script Agit_C01 -1,{
-OnAgitInit:
- GetCastleData "payg_cas01.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "payg_cas01.gat",0,"::OnRecvCastleF01";
- Break;
-OnRecvCastleF01:
- RequestGuildInfo GetCastleData("payg_cas01.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("payg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),2;
- Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
- GvgOn "payg_cas01.gat";
- Break;
-OnAgitBreak:
- set @GIDf1,getcharid(2);
- if (@GIDf1 <= 0) Break;
- set @Economy,GetCastleData("payg_cas01.gat",2);
- SetCastleData "payg_cas01.gat",2,@Economy-5;
- if (GetCastleData("payg_cas01.gat",2) < 0) SetCastleData "payg_cas01.gat",2,0;
- set @Defence,GetCastleData("payg_cas01.gat",3);
- SetCastleData "payg_cas01.gat",3,@Defence-5;
- if (GetCastleData("payg_cas01.gat",3) < 0) SetCastleData "payg_cas01.gat",3,0;
- SetCastleData "payg_cas01.gat",1,@GIDf1;
- Announce "Guild Base [" + GetCastleName("payg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDf1) + "] guild.",0;
- MapAnnounce "payg_cas01.gat","The emperium has been destroyed.",17;
- GetCastleData "payg_cas01.gat",0,"::OnRecvCastleF01";
- SetCastleData "payg_cas01.gat",2,0;
- SetCastleData "payg_cas01.gat",3,0;
- SetCastleData "payg_cas01.gat",4,0;
- SetCastleData "payg_cas01.gat",5,0;
- SetCastleData "payg_cas01.gat",6,0;
- SetCastleData "payg_cas01.gat",7,0;
- SetCastleData "payg_cas01.gat",8,0;
- SetCastleData "payg_cas01.gat",9,0;
- SetCastleData "payg_cas01.gat",10,0;
- SetCastleData "payg_cas01.gat",11,0;
- SetCastleData "payg_cas01.gat",12,0;
- SetCastleData "payg_cas01.gat",13,0;
- SetCastleData "payg_cas01.gat",14,0;
- SetCastleData "payg_cas01.gat",15,0;
- SetCastleData "payg_cas01.gat",16,0;
- SetCastleData "payg_cas01.gat",17,0;
- SetCastleData "payg_cas01.gat",18,0;
- SetCastleData "payg_cas01.gat",19,0;
- SetCastleData "payg_cas01.gat",20,0;
- SetCastleData "payg_cas01.gat",21,0;
- SetCastleData "payg_cas01.gat",22,0;
- SetCastleData "payg_cas01.gat",23,0;
- SetCastleData "payg_cas01.gat",24,0;
- SetCastleData "payg_cas01.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),6;
- Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("payg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas02.gat",1),4;
- KillMonster "payg_cas01.gat","Agit_C01::OnAgitBreak";
- GvgOff "payg_cas01.gat";
- Break;
-OnInit:
-initnpctimer "Agit_C01_Timer";
-}
-
-payg_cas01.gat,1,1,1 script Agit_C01_Timer -1,{
-OnTimer500:
- if (GetCastleData("payg_cas01.gat",1) != 0) break;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1277,10;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1208,10;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1262,5;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1102,5;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1115,1;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1129,11;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1282,4;
- areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1253,5;
- monster "payg_cas01.gat",138,138,"--ja--",1150,1;
- monster "payg_cas01.gat",138,138,"--ja--",1115,1;
- monster "payg_cas01.gat",138,138,"--ja--",1208,6;
- monster "payg_cas01.gat",138,138,"--ja--",1276,5;
- monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
- stopnpctimer "Agit_C01_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-payg_cas02.gat,39,25,0 script Agit_C02 -1,{
-OnAgitInit:
- GetCastleData "payg_cas02.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "payg_cas02.gat",0,"::OnRecvCastleF02";
- Break;
-OnRecvCastleF02:
- RequestGuildInfo GetCastleData("payg_cas02.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("payg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),2;
- Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
- GvgOn "payg_cas02.gat";
- Break;
-OnAgitBreak:
- set @GIDf2,getcharid(2);
- if (@GIDf2 <= 0) Break;
- set @Economy,GetCastleData("payg_cas02.gat",2);
- SetCastleData "payg_cas02.gat",2,@Economy-5;
- if (GetCastleData("payg_cas02.gat",2) < 0) SetCastleData "payg_cas02.gat",2,0;
- set @Defence,GetCastleData("payg_cas02.gat",3);
- SetCastleData "payg_cas02.gat",3,@Defence-5;
- if (GetCastleData("payg_cas02.gat",3) < 0) SetCastleData "payg_cas02.gat",3,0;
- SetCastleData "payg_cas02.gat",1,@GIDf2;
- Announce "Guild Base [" + GetCastleName("payg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDf2) + "] guild.",0;
- MapAnnounce "payg_cas02.gat","The emperium has been destroyed.",17;
- GetCastleData "payg_cas02.gat",0,"::OnRecvCastleF02";
- SetCastleData "payg_cas02.gat",2,0;
- SetCastleData "payg_cas02.gat",3,0;
- SetCastleData "payg_cas02.gat",4,0;
- SetCastleData "payg_cas02.gat",5,0;
- SetCastleData "payg_cas02.gat",6,0;
- SetCastleData "payg_cas02.gat",7,0;
- SetCastleData "payg_cas02.gat",8,0;
- SetCastleData "payg_cas02.gat",9,0;
- SetCastleData "payg_cas02.gat",10,0;
- SetCastleData "payg_cas02.gat",11,0;
- SetCastleData "payg_cas02.gat",12,0;
- SetCastleData "payg_cas02.gat",13,0;
- SetCastleData "payg_cas02.gat",14,0;
- SetCastleData "payg_cas02.gat",15,0;
- SetCastleData "payg_cas02.gat",16,0;
- SetCastleData "payg_cas02.gat",17,0;
- SetCastleData "payg_cas02.gat",18,0;
- SetCastleData "payg_cas02.gat",19,0;
- SetCastleData "payg_cas02.gat",20,0;
- SetCastleData "payg_cas02.gat",21,0;
- SetCastleData "payg_cas02.gat",22,0;
- SetCastleData "payg_cas02.gat",23,0;
- SetCastleData "payg_cas02.gat",24,0;
- SetCastleData "payg_cas02.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),6;
- Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("payg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),4;
- KillMonster "payg_cas02.gat","Agit_C02::OnAgitBreak";
- GvgOff "payg_cas02.gat";
- Break;
-OnInit:
-initnpctimer "Agit_C02_Timer";
-}
-
-payg_cas02.gat,1,1,1 script Agit_C02_Timer -1,{
-OnTimer500:
- if (GetCastleData("payg_cas02.gat",1) != 0) break;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1277,10;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1208,10;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1262,5;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1102,5;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1115,1;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1129,11;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1282,4;
- areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1253,5;
- monster "payg_cas02.gat",138,138,"--ja--",1150,1;
- monster "payg_cas02.gat",138,138,"--ja--",1115,1;
- monster "payg_cas02.gat",138,138,"--ja--",1208,6;
- monster "payg_cas02.gat",138,138,"--ja--",1276,5;
- monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
- stopnpctimer "Agit_C02_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-payg_cas03.gat,269,265,0 script Agit_C03 -1,{
-OnAgitInit:
- GetCastleData "payg_cas03.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "payg_cas03.gat",0,"::OnRecvCastleF03";
- Break;
-OnRecvCastleF03:
- RequestGuildInfo GetCastleData("payg_cas03.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("payg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),2;
- Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
- GvgOn "payg_cas03.gat";
- Break;
-OnAgitBreak:
- set @GIDf3,getcharid(2);
- if (@GIDf3 <= 0) Break;
- set @Economy,GetCastleData("payg_cas03.gat",2);
- SetCastleData "payg_cas03.gat",2,@Economy-5;
- if (GetCastleData("payg_cas03.gat",2) < 0) SetCastleData "payg_cas03.gat",2,0;
- set @Defence,GetCastleData("payg_cas03.gat",3);
- SetCastleData "payg_cas03.gat",3,@Defence-5;
- if (GetCastleData("payg_cas01.gat",3) < 0) SetCastleData "payg_cas03.gat",3,0;
- SetCastleData "payg_cas03.gat",1,@GIDf3;
- Announce "Guild Base [" + GetCastleName("payg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDf3) + "] guild.",0;
- MapAnnounce "payg_cas03.gat","The emperium has been destroyed.",17;
- GetCastleData "payg_cas03.gat",0,"::OnRecvCastleF03";
- SetCastleData "payg_cas03.gat",2,0;
- SetCastleData "payg_cas03.gat",3,0;
- SetCastleData "payg_cas03.gat",4,0;
- SetCastleData "payg_cas03.gat",5,0;
- SetCastleData "payg_cas03.gat",6,0;
- SetCastleData "payg_cas03.gat",7,0;
- SetCastleData "payg_cas03.gat",8,0;
- SetCastleData "payg_cas03.gat",9,0;
- SetCastleData "payg_cas03.gat",10,0;
- SetCastleData "payg_cas03.gat",11,0;
- SetCastleData "payg_cas03.gat",12,0;
- SetCastleData "payg_cas03.gat",13,0;
- SetCastleData "payg_cas03.gat",14,0;
- SetCastleData "payg_cas03.gat",15,0;
- SetCastleData "payg_cas03.gat",16,0;
- SetCastleData "payg_cas03.gat",17,0;
- SetCastleData "payg_cas03.gat",18,0;
- SetCastleData "payg_cas03.gat",19,0;
- SetCastleData "payg_cas03.gat",20,0;
- SetCastleData "payg_cas03.gat",21,0;
- SetCastleData "payg_cas03.gat",22,0;
- SetCastleData "payg_cas03.gat",23,0;
- SetCastleData "payg_cas03.gat",24,0;
- SetCastleData "payg_cas03.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),6;
- Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("payg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),4;
- KillMonster "payg_cas03.gat","Agit_C03::OnAgitBreak";
- GvgOff "payg_cas03.gat";
- Break;
-OnInit:
-initnpctimer "Agit_C03_Timer";
-}
-
-payg_cas03.gat,1,1,1 script Agit_C03_Timer -1,{
-OnTimer500:
- if (GetCastleData("payg_cas03.gat",1) != 0) break;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1277,10;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1208,10;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1262,5;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1102,5;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1115,1;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1129,11;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1282,4;
- areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1253,5;
- monster "payg_cas03.gat",268,264,"--ja--",1150,1;
- monster "payg_cas03.gat",268,264,"--ja--",1115,1;
- monster "payg_cas03.gat",268,264,"--ja--",1208,6;
- monster "payg_cas03.gat",268,264,"--ja--",1276,5;
- monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
- stopnpctimer "Agit_C03_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-payg_cas04.gat,271,29,0 script Agit_C04 -1,{
-OnAgitInit:
- GetCastleData "payg_cas04.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "payg_cas04.gat",0,"::OnRecvCastleF04";
- Break;
-OnRecvCastleF04:
- RequestGuildInfo GetCastleData("payg_cas04.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("payg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),2;
- Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
- GvgOn "payg_cas04.gat";
- Break;
-OnAgitBreak:
- set @GIDf4,getcharid(2);
- if (@GIDf4 <= 0) Break;
- set @Economy,GetCastleData("payg_cas04.gat",2);
- SetCastleData "payg_cas04.gat",2,@Economy-5;
- if (GetCastleData("payg_cas04.gat",2) < 0) SetCastleData "payg_cas04.gat",2,0;
- set @Defence,GetCastleData("payg_cas04.gat",3);
- SetCastleData "payg_cas04.gat",3,@Defence-5;
- if (GetCastleData("payg_cas04.gat",3) < 0) SetCastleData "payg_cas04.gat",3,0;
- SetCastleData "payg_cas04.gat",1,@GIDf4;
- Announce "Guild Base [" + GetCastleName("payg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDf4) + "] guild.",0;
- MapAnnounce "payg_cas04.gat","The emperium has been destroyed.",17;
- GetCastleData "payg_cas04.gat",0,"::OnRecvCastleF04";
- SetCastleData "payg_cas04.gat",2,0;
- SetCastleData "payg_cas04.gat",3,0;
- SetCastleData "payg_cas04.gat",4,0;
- SetCastleData "payg_cas04.gat",5,0;
- SetCastleData "payg_cas04.gat",6,0;
- SetCastleData "payg_cas04.gat",7,0;
- SetCastleData "payg_cas04.gat",8,0;
- SetCastleData "payg_cas04.gat",9,0;
- SetCastleData "payg_cas04.gat",10,0;
- SetCastleData "payg_cas04.gat",11,0;
- SetCastleData "payg_cas04.gat",12,0;
- SetCastleData "payg_cas04.gat",13,0;
- SetCastleData "payg_cas04.gat",14,0;
- SetCastleData "payg_cas04.gat",15,0;
- SetCastleData "payg_cas04.gat",16,0;
- SetCastleData "payg_cas04.gat",17,0;
- SetCastleData "payg_cas04.gat",18,0;
- SetCastleData "payg_cas04.gat",19,0;
- SetCastleData "payg_cas04.gat",20,0;
- SetCastleData "payg_cas04.gat",21,0;
- SetCastleData "payg_cas04.gat",22,0;
- SetCastleData "payg_cas04.gat",23,0;
- SetCastleData "payg_cas04.gat",24,0;
- SetCastleData "payg_cas04.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),6;
- Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("payg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),4;
- KillMonster "payg_cas04.gat","Agit_C04::OnAgitBreak";
- GvgOff "payg_cas04.gat";
- Break;
-OnInit:
-initnpctimer "Agit_C04_Timer";
-}
-
-payg_cas04.gat,1,1,1 script Agit_C04_Timer -1,{
-OnTimer500:
- if (GetCastleData("payg_cas04.gat",1) != 0) break;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1277,10;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1208,10;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1262,5;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1102,5;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1115,1;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1129,11;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1282,4;
- areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1253,5;
- monster "payg_cas04.gat",270,28,"--ja--",1150,1;
- monster "payg_cas04.gat",270,28,"--ja--",1115,1;
- monster "payg_cas04.gat",270,28,"--ja--",1208,6;
- monster "payg_cas04.gat",270,28,"--ja--",1276,5;
- monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
- stopnpctimer "Agit_C04_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-payg_cas05.gat,30,30,0 script Agit_C05 -1,{
-OnAgitInit:
- GetCastleData "payg_cas05.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "payg_cas05.gat",0,"::OnRecvCastleF05";
- Break;
-OnRecvCastleF05:
- RequestGuildInfo GetCastleData("payg_cas05.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("payg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),2;
- Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
- GvgOn "payg_cas05.gat";
- Break;
-OnAgitBreak:
- set @GIDf5,getcharid(2);
- if (@GIDf5 <= 0) Break;
- set @Economy,GetCastleData("payg_cas05.gat",2);
- SetCastleData "payg_cas05.gat",2,@Economy-5;
- if (GetCastleData("payg_cas05.gat",2) < 0) SetCastleData "payg_cas05.gat",2,0;
- set @Defence,GetCastleData("payg_cas05.gat",3);
- SetCastleData "payg_cas05.gat",3,@Defence-5;
- if (GetCastleData("payg_cas05.gat",3) < 0) SetCastleData "payg_cas05.gat",3,0;
- SetCastleData "payg_cas05.gat",1,@GIDf5;
- Announce "Guild Base [" + GetCastleName("payg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDf5) + "] guild.",0;
- MapAnnounce "payg_cas05.gat","The emperium has been destroyed.",17;
- GetCastleData "payg_cas05.gat",0,"::OnRecvCastleF05";
- SetCastleData "payg_cas05.gat",2,0;
- SetCastleData "payg_cas05.gat",3,0;
- SetCastleData "payg_cas05.gat",4,0;
- SetCastleData "payg_cas05.gat",5,0;
- SetCastleData "payg_cas05.gat",6,0;
- SetCastleData "payg_cas05.gat",7,0;
- SetCastleData "payg_cas05.gat",8,0;
- SetCastleData "payg_cas05.gat",9,0;
- SetCastleData "payg_cas05.gat",10,0;
- SetCastleData "payg_cas05.gat",11,0;
- SetCastleData "payg_cas05.gat",12,0;
- SetCastleData "payg_cas05.gat",13,0;
- SetCastleData "payg_cas05.gat",14,0;
- SetCastleData "payg_cas05.gat",15,0;
- SetCastleData "payg_cas05.gat",16,0;
- SetCastleData "payg_cas05.gat",17,0;
- SetCastleData "payg_cas05.gat",18,0;
- SetCastleData "payg_cas05.gat",19,0;
- SetCastleData "payg_cas05.gat",20,0;
- SetCastleData "payg_cas05.gat",21,0;
- SetCastleData "payg_cas05.gat",22,0;
- SetCastleData "payg_cas05.gat",23,0;
- SetCastleData "payg_cas05.gat",24,0;
- SetCastleData "payg_cas05.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),6;
- Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("payg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),4;
- KillMonster "payg_cas05.gat","Agit_C05::OnAgitBreak";
- GvgOff "payg_cas05.gat";
- Break;
-OnInit:
-initnpctimer "Agit_C05_Timer";
-}
-
-payg_cas05.gat,1,1,1 script Agit_C05_Timer -1,{
-OnTimer500:
- if (GetCastleData("payg_cas05.gat",1) != 0) break;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1277,10;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1208,10;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1262,5;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1102,5;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1150,1;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1115,1;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1129,11;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1282,4;
- areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1253,5;
- monster "payg_cas05.gat",30,30,"--ja--",1150,1;
- monster "payg_cas05.gat",30,30,"--ja--",1115,1;
- monster "payg_cas05.gat",30,30,"--ja--",1208,6;
- monster "payg_cas05.gat",30,30,"--ja--",1276,5;
- monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
- stopnpctimer "Agit_C05_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - Payon Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Payon Guild Wars
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//= 1.2 by Akaru (Castle spawn/conquering fix)
+//============================================================
+
+
+payg_cas01.gat,139,139,0 script Agit_C01 -1,{
+OnAgitInit:
+ GetCastleData "payg_cas01.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "payg_cas01.gat",0,"::OnRecvCastleF01";
+ Break;
+OnRecvCastleF01:
+ RequestGuildInfo GetCastleData("payg_cas01.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("payg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),2;
+ Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
+ GvgOn "payg_cas01.gat";
+ Break;
+OnAgitBreak:
+ set @GIDf1,getcharid(2);
+ if (@GIDf1 <= 0) Break;
+ set @Economy,GetCastleData("payg_cas01.gat",2);
+ SetCastleData "payg_cas01.gat",2,@Economy-5;
+ if (GetCastleData("payg_cas01.gat",2) < 0) SetCastleData "payg_cas01.gat",2,0;
+ set @Defence,GetCastleData("payg_cas01.gat",3);
+ SetCastleData "payg_cas01.gat",3,@Defence-5;
+ if (GetCastleData("payg_cas01.gat",3) < 0) SetCastleData "payg_cas01.gat",3,0;
+ SetCastleData "payg_cas01.gat",1,@GIDf1;
+ Announce "Guild Base [" + GetCastleName("payg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDf1) + "] guild.",0;
+ MapAnnounce "payg_cas01.gat","The emperium has been destroyed.",17;
+ GetCastleData "payg_cas01.gat",0,"::OnRecvCastleF01";
+ SetCastleData "payg_cas01.gat",2,0;
+ SetCastleData "payg_cas01.gat",3,0;
+ SetCastleData "payg_cas01.gat",4,0;
+ SetCastleData "payg_cas01.gat",5,0;
+ SetCastleData "payg_cas01.gat",6,0;
+ SetCastleData "payg_cas01.gat",7,0;
+ SetCastleData "payg_cas01.gat",8,0;
+ SetCastleData "payg_cas01.gat",9,0;
+ SetCastleData "payg_cas01.gat",10,0;
+ SetCastleData "payg_cas01.gat",11,0;
+ SetCastleData "payg_cas01.gat",12,0;
+ SetCastleData "payg_cas01.gat",13,0;
+ SetCastleData "payg_cas01.gat",14,0;
+ SetCastleData "payg_cas01.gat",15,0;
+ SetCastleData "payg_cas01.gat",16,0;
+ SetCastleData "payg_cas01.gat",17,0;
+ SetCastleData "payg_cas01.gat",18,0;
+ SetCastleData "payg_cas01.gat",19,0;
+ SetCastleData "payg_cas01.gat",20,0;
+ SetCastleData "payg_cas01.gat",21,0;
+ SetCastleData "payg_cas01.gat",22,0;
+ SetCastleData "payg_cas01.gat",23,0;
+ SetCastleData "payg_cas01.gat",24,0;
+ SetCastleData "payg_cas01.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),6;
+ Monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("payg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas02.gat",1),4;
+ KillMonster "payg_cas01.gat","Agit_C01::OnAgitBreak";
+ GvgOff "payg_cas01.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_C01_Timer";
+}
+
+payg_cas01.gat,1,1,1 script Agit_C01_Timer -1,{
+OnTimer500:
+ if (GetCastleData("payg_cas01.gat",1) != 0) break;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1277,10;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1208,10;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1262,5;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1102,5;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1115,1;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1129,11;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1282,4;
+ areamonster "payg_cas01.gat",0,0,300,300,"--ja--",1253,5;
+ monster "payg_cas01.gat",138,138,"--ja--",1150,1;
+ monster "payg_cas01.gat",138,138,"--ja--",1115,1;
+ monster "payg_cas01.gat",138,138,"--ja--",1208,6;
+ monster "payg_cas01.gat",138,138,"--ja--",1276,5;
+ monster "payg_cas01.gat",139,139,"EMPERIUM",1288,1,"Agit_C01::OnAgitBreak";
+ stopnpctimer "Agit_C01_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+payg_cas02.gat,39,25,0 script Agit_C02 -1,{
+OnAgitInit:
+ GetCastleData "payg_cas02.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "payg_cas02.gat",0,"::OnRecvCastleF02";
+ Break;
+OnRecvCastleF02:
+ RequestGuildInfo GetCastleData("payg_cas02.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("payg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),2;
+ Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
+ GvgOn "payg_cas02.gat";
+ Break;
+OnAgitBreak:
+ set @GIDf2,getcharid(2);
+ if (@GIDf2 <= 0) Break;
+ set @Economy,GetCastleData("payg_cas02.gat",2);
+ SetCastleData "payg_cas02.gat",2,@Economy-5;
+ if (GetCastleData("payg_cas02.gat",2) < 0) SetCastleData "payg_cas02.gat",2,0;
+ set @Defence,GetCastleData("payg_cas02.gat",3);
+ SetCastleData "payg_cas02.gat",3,@Defence-5;
+ if (GetCastleData("payg_cas02.gat",3) < 0) SetCastleData "payg_cas02.gat",3,0;
+ SetCastleData "payg_cas02.gat",1,@GIDf2;
+ Announce "Guild Base [" + GetCastleName("payg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDf2) + "] guild.",0;
+ MapAnnounce "payg_cas02.gat","The emperium has been destroyed.",17;
+ GetCastleData "payg_cas02.gat",0,"::OnRecvCastleF02";
+ SetCastleData "payg_cas02.gat",2,0;
+ SetCastleData "payg_cas02.gat",3,0;
+ SetCastleData "payg_cas02.gat",4,0;
+ SetCastleData "payg_cas02.gat",5,0;
+ SetCastleData "payg_cas02.gat",6,0;
+ SetCastleData "payg_cas02.gat",7,0;
+ SetCastleData "payg_cas02.gat",8,0;
+ SetCastleData "payg_cas02.gat",9,0;
+ SetCastleData "payg_cas02.gat",10,0;
+ SetCastleData "payg_cas02.gat",11,0;
+ SetCastleData "payg_cas02.gat",12,0;
+ SetCastleData "payg_cas02.gat",13,0;
+ SetCastleData "payg_cas02.gat",14,0;
+ SetCastleData "payg_cas02.gat",15,0;
+ SetCastleData "payg_cas02.gat",16,0;
+ SetCastleData "payg_cas02.gat",17,0;
+ SetCastleData "payg_cas02.gat",18,0;
+ SetCastleData "payg_cas02.gat",19,0;
+ SetCastleData "payg_cas02.gat",20,0;
+ SetCastleData "payg_cas02.gat",21,0;
+ SetCastleData "payg_cas02.gat",22,0;
+ SetCastleData "payg_cas02.gat",23,0;
+ SetCastleData "payg_cas02.gat",24,0;
+ SetCastleData "payg_cas02.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),6;
+ Monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("payg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),4;
+ KillMonster "payg_cas02.gat","Agit_C02::OnAgitBreak";
+ GvgOff "payg_cas02.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_C02_Timer";
+}
+
+payg_cas02.gat,1,1,1 script Agit_C02_Timer -1,{
+OnTimer500:
+ if (GetCastleData("payg_cas02.gat",1) != 0) break;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1277,10;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1208,10;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1262,5;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1102,5;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1115,1;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1129,11;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1282,4;
+ areamonster "payg_cas02.gat",0,0,300,300,"--ja--",1253,5;
+ monster "payg_cas02.gat",138,138,"--ja--",1150,1;
+ monster "payg_cas02.gat",138,138,"--ja--",1115,1;
+ monster "payg_cas02.gat",138,138,"--ja--",1208,6;
+ monster "payg_cas02.gat",138,138,"--ja--",1276,5;
+ monster "payg_cas02.gat",39,25,"EMPERIUM",1288,1,"Agit_C02::OnAgitBreak";
+ stopnpctimer "Agit_C02_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+payg_cas03.gat,269,265,0 script Agit_C03 -1,{
+OnAgitInit:
+ GetCastleData "payg_cas03.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "payg_cas03.gat",0,"::OnRecvCastleF03";
+ Break;
+OnRecvCastleF03:
+ RequestGuildInfo GetCastleData("payg_cas03.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("payg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),2;
+ Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
+ GvgOn "payg_cas03.gat";
+ Break;
+OnAgitBreak:
+ set @GIDf3,getcharid(2);
+ if (@GIDf3 <= 0) Break;
+ set @Economy,GetCastleData("payg_cas03.gat",2);
+ SetCastleData "payg_cas03.gat",2,@Economy-5;
+ if (GetCastleData("payg_cas03.gat",2) < 0) SetCastleData "payg_cas03.gat",2,0;
+ set @Defence,GetCastleData("payg_cas03.gat",3);
+ SetCastleData "payg_cas03.gat",3,@Defence-5;
+ if (GetCastleData("payg_cas01.gat",3) < 0) SetCastleData "payg_cas03.gat",3,0;
+ SetCastleData "payg_cas03.gat",1,@GIDf3;
+ Announce "Guild Base [" + GetCastleName("payg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDf3) + "] guild.",0;
+ MapAnnounce "payg_cas03.gat","The emperium has been destroyed.",17;
+ GetCastleData "payg_cas03.gat",0,"::OnRecvCastleF03";
+ SetCastleData "payg_cas03.gat",2,0;
+ SetCastleData "payg_cas03.gat",3,0;
+ SetCastleData "payg_cas03.gat",4,0;
+ SetCastleData "payg_cas03.gat",5,0;
+ SetCastleData "payg_cas03.gat",6,0;
+ SetCastleData "payg_cas03.gat",7,0;
+ SetCastleData "payg_cas03.gat",8,0;
+ SetCastleData "payg_cas03.gat",9,0;
+ SetCastleData "payg_cas03.gat",10,0;
+ SetCastleData "payg_cas03.gat",11,0;
+ SetCastleData "payg_cas03.gat",12,0;
+ SetCastleData "payg_cas03.gat",13,0;
+ SetCastleData "payg_cas03.gat",14,0;
+ SetCastleData "payg_cas03.gat",15,0;
+ SetCastleData "payg_cas03.gat",16,0;
+ SetCastleData "payg_cas03.gat",17,0;
+ SetCastleData "payg_cas03.gat",18,0;
+ SetCastleData "payg_cas03.gat",19,0;
+ SetCastleData "payg_cas03.gat",20,0;
+ SetCastleData "payg_cas03.gat",21,0;
+ SetCastleData "payg_cas03.gat",22,0;
+ SetCastleData "payg_cas03.gat",23,0;
+ SetCastleData "payg_cas03.gat",24,0;
+ SetCastleData "payg_cas03.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),6;
+ Monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("payg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),4;
+ KillMonster "payg_cas03.gat","Agit_C03::OnAgitBreak";
+ GvgOff "payg_cas03.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_C03_Timer";
+}
+
+payg_cas03.gat,1,1,1 script Agit_C03_Timer -1,{
+OnTimer500:
+ if (GetCastleData("payg_cas03.gat",1) != 0) break;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1277,10;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1208,10;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1262,5;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1102,5;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1115,1;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1129,11;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1282,4;
+ areamonster "payg_cas03.gat",0,0,300,300,"--ja--",1253,5;
+ monster "payg_cas03.gat",268,264,"--ja--",1150,1;
+ monster "payg_cas03.gat",268,264,"--ja--",1115,1;
+ monster "payg_cas03.gat",268,264,"--ja--",1208,6;
+ monster "payg_cas03.gat",268,264,"--ja--",1276,5;
+ monster "payg_cas03.gat",269,265,"EMPERIUM",1288,1,"Agit_C03::OnAgitBreak";
+ stopnpctimer "Agit_C03_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+payg_cas04.gat,271,29,0 script Agit_C04 -1,{
+OnAgitInit:
+ GetCastleData "payg_cas04.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "payg_cas04.gat",0,"::OnRecvCastleF04";
+ Break;
+OnRecvCastleF04:
+ RequestGuildInfo GetCastleData("payg_cas04.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("payg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),2;
+ Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
+ GvgOn "payg_cas04.gat";
+ Break;
+OnAgitBreak:
+ set @GIDf4,getcharid(2);
+ if (@GIDf4 <= 0) Break;
+ set @Economy,GetCastleData("payg_cas04.gat",2);
+ SetCastleData "payg_cas04.gat",2,@Economy-5;
+ if (GetCastleData("payg_cas04.gat",2) < 0) SetCastleData "payg_cas04.gat",2,0;
+ set @Defence,GetCastleData("payg_cas04.gat",3);
+ SetCastleData "payg_cas04.gat",3,@Defence-5;
+ if (GetCastleData("payg_cas04.gat",3) < 0) SetCastleData "payg_cas04.gat",3,0;
+ SetCastleData "payg_cas04.gat",1,@GIDf4;
+ Announce "Guild Base [" + GetCastleName("payg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDf4) + "] guild.",0;
+ MapAnnounce "payg_cas04.gat","The emperium has been destroyed.",17;
+ GetCastleData "payg_cas04.gat",0,"::OnRecvCastleF04";
+ SetCastleData "payg_cas04.gat",2,0;
+ SetCastleData "payg_cas04.gat",3,0;
+ SetCastleData "payg_cas04.gat",4,0;
+ SetCastleData "payg_cas04.gat",5,0;
+ SetCastleData "payg_cas04.gat",6,0;
+ SetCastleData "payg_cas04.gat",7,0;
+ SetCastleData "payg_cas04.gat",8,0;
+ SetCastleData "payg_cas04.gat",9,0;
+ SetCastleData "payg_cas04.gat",10,0;
+ SetCastleData "payg_cas04.gat",11,0;
+ SetCastleData "payg_cas04.gat",12,0;
+ SetCastleData "payg_cas04.gat",13,0;
+ SetCastleData "payg_cas04.gat",14,0;
+ SetCastleData "payg_cas04.gat",15,0;
+ SetCastleData "payg_cas04.gat",16,0;
+ SetCastleData "payg_cas04.gat",17,0;
+ SetCastleData "payg_cas04.gat",18,0;
+ SetCastleData "payg_cas04.gat",19,0;
+ SetCastleData "payg_cas04.gat",20,0;
+ SetCastleData "payg_cas04.gat",21,0;
+ SetCastleData "payg_cas04.gat",22,0;
+ SetCastleData "payg_cas04.gat",23,0;
+ SetCastleData "payg_cas04.gat",24,0;
+ SetCastleData "payg_cas04.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),6;
+ Monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("payg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),4;
+ KillMonster "payg_cas04.gat","Agit_C04::OnAgitBreak";
+ GvgOff "payg_cas04.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_C04_Timer";
+}
+
+payg_cas04.gat,1,1,1 script Agit_C04_Timer -1,{
+OnTimer500:
+ if (GetCastleData("payg_cas04.gat",1) != 0) break;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1277,10;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1208,10;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1262,5;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1102,5;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1115,1;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1129,11;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1282,4;
+ areamonster "payg_cas04.gat",0,0,300,300,"--ja--",1253,5;
+ monster "payg_cas04.gat",270,28,"--ja--",1150,1;
+ monster "payg_cas04.gat",270,28,"--ja--",1115,1;
+ monster "payg_cas04.gat",270,28,"--ja--",1208,6;
+ monster "payg_cas04.gat",270,28,"--ja--",1276,5;
+ monster "payg_cas04.gat",271,29,"EMPERIUM",1288,1,"Agit_C04::OnAgitBreak";
+ stopnpctimer "Agit_C04_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+payg_cas05.gat,30,30,0 script Agit_C05 -1,{
+OnAgitInit:
+ GetCastleData "payg_cas05.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "payg_cas05.gat",0,"::OnRecvCastleF05";
+ Break;
+OnRecvCastleF05:
+ RequestGuildInfo GetCastleData("payg_cas05.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("payg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),2;
+ Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
+ GvgOn "payg_cas05.gat";
+ Break;
+OnAgitBreak:
+ set @GIDf5,getcharid(2);
+ if (@GIDf5 <= 0) Break;
+ set @Economy,GetCastleData("payg_cas05.gat",2);
+ SetCastleData "payg_cas05.gat",2,@Economy-5;
+ if (GetCastleData("payg_cas05.gat",2) < 0) SetCastleData "payg_cas05.gat",2,0;
+ set @Defence,GetCastleData("payg_cas05.gat",3);
+ SetCastleData "payg_cas05.gat",3,@Defence-5;
+ if (GetCastleData("payg_cas05.gat",3) < 0) SetCastleData "payg_cas05.gat",3,0;
+ SetCastleData "payg_cas05.gat",1,@GIDf5;
+ Announce "Guild Base [" + GetCastleName("payg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDf5) + "] guild.",0;
+ MapAnnounce "payg_cas05.gat","The emperium has been destroyed.",17;
+ GetCastleData "payg_cas05.gat",0,"::OnRecvCastleF05";
+ SetCastleData "payg_cas05.gat",2,0;
+ SetCastleData "payg_cas05.gat",3,0;
+ SetCastleData "payg_cas05.gat",4,0;
+ SetCastleData "payg_cas05.gat",5,0;
+ SetCastleData "payg_cas05.gat",6,0;
+ SetCastleData "payg_cas05.gat",7,0;
+ SetCastleData "payg_cas05.gat",8,0;
+ SetCastleData "payg_cas05.gat",9,0;
+ SetCastleData "payg_cas05.gat",10,0;
+ SetCastleData "payg_cas05.gat",11,0;
+ SetCastleData "payg_cas05.gat",12,0;
+ SetCastleData "payg_cas05.gat",13,0;
+ SetCastleData "payg_cas05.gat",14,0;
+ SetCastleData "payg_cas05.gat",15,0;
+ SetCastleData "payg_cas05.gat",16,0;
+ SetCastleData "payg_cas05.gat",17,0;
+ SetCastleData "payg_cas05.gat",18,0;
+ SetCastleData "payg_cas05.gat",19,0;
+ SetCastleData "payg_cas05.gat",20,0;
+ SetCastleData "payg_cas05.gat",21,0;
+ SetCastleData "payg_cas05.gat",22,0;
+ SetCastleData "payg_cas05.gat",23,0;
+ SetCastleData "payg_cas05.gat",24,0;
+ SetCastleData "payg_cas05.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),6;
+ Monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("payg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),4;
+ KillMonster "payg_cas05.gat","Agit_C05::OnAgitBreak";
+ GvgOff "payg_cas05.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_C05_Timer";
+}
+
+payg_cas05.gat,1,1,1 script Agit_C05_Timer -1,{
+OnTimer500:
+ if (GetCastleData("payg_cas05.gat",1) != 0) break;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1277,10;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1208,10;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1262,5;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1102,5;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1150,1;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1115,1;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1129,11;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1282,4;
+ areamonster "payg_cas05.gat",0,0,300,300,"--ja--",1253,5;
+ monster "payg_cas05.gat",30,30,"--ja--",1150,1;
+ monster "payg_cas05.gat",30,30,"--ja--",1115,1;
+ monster "payg_cas05.gat",30,30,"--ja--",1208,6;
+ monster "payg_cas05.gat",30,30,"--ja--",1276,5;
+ monster "payg_cas05.gat",30,30,"EMPERIUM",1288,1,"Agit_C05::OnAgitBreak";
+ stopnpctimer "Agit_C05_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/ev_agit_prtg.txt b/npc/guild/old/ev_agit_prtg.txt
index 85de425fd..26cfde0ec 100644
--- a/npc/guild/old/ev_agit_prtg.txt
+++ b/npc/guild/old/ev_agit_prtg.txt
@@ -1,476 +1,476 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Prontera Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Event Triggers of Prontera Guild Wars
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//= 1.2 by Akaru (Castle spawn/conquering fix)
-//============================================================
-
-
-prtg_cas01.gat,197,197,0 script Agit_D01 -1,{
-OnAgitInit:
- GetCastleData "prtg_cas01.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "prtg_cas01.gat",0,"::OnRecvCastleP01";
- Break;
-OnRecvCastleP01:
- RequestGuildInfo GetCastleData("prtg_cas01.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("prtg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),2;
- Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
- GvgOn "prtg_cas01.gat";
- Break;
-OnAgitBreak:
- set @GIDp1,getcharid(2);
- if (@GIDp1 <= 0) Break;
- set @Economy,GetCastleData("prtg_cas01.gat",2);
- SetCastleData "prtg_cas01.gat",2,@Economy-5;
- if (GetCastleData("prtg_cas01.gat",2) < 0) SetCastleData "prtg_cas01.gat",2,0;
- set @Defence,GetCastleData("prtg_cas01.gat",3);
- SetCastleData "prtg_cas01.gat",3,@Defence-5;
- if (GetCastleData("prtg_cas01.gat",3) < 0) SetCastleData "prtg_cas01.gat",3,0;
- SetCastleData "prtg_cas01.gat",1,@GIDp1;
- Announce "Guild Base [" + GetCastleName("prtg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDp1) + "] guild.",0;
- MapAnnounce "prtg_cas01.gat","The emperium has been destroyed.",17;
- GetCastleData "prtg_cas01.gat",0,"::OnRecvCastleP01";
- SetCastleData "prtg_cas01.gat",2,0;
- SetCastleData "prtg_cas01.gat",3,0;
- SetCastleData "prtg_cas01.gat",4,0;
- SetCastleData "prtg_cas01.gat",5,0;
- SetCastleData "prtg_cas01.gat",6,0;
- SetCastleData "prtg_cas01.gat",7,0;
- SetCastleData "prtg_cas01.gat",8,0;
- SetCastleData "prtg_cas01.gat",9,0;
- SetCastleData "prtg_cas01.gat",10,0;
- SetCastleData "prtg_cas01.gat",11,0;
- SetCastleData "prtg_cas01.gat",12,0;
- SetCastleData "prtg_cas01.gat",13,0;
- SetCastleData "prtg_cas01.gat",14,0;
- SetCastleData "prtg_cas01.gat",15,0;
- SetCastleData "prtg_cas01.gat",16,0;
- SetCastleData "prtg_cas01.gat",17,0;
- SetCastleData "prtg_cas01.gat",18,0;
- SetCastleData "prtg_cas01.gat",19,0;
- SetCastleData "prtg_cas01.gat",20,0;
- SetCastleData "prtg_cas01.gat",21,0;
- SetCastleData "prtg_cas01.gat",22,0;
- SetCastleData "prtg_cas01.gat",23,0;
- SetCastleData "prtg_cas01.gat",24,0;
- SetCastleData "prtg_cas01.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),6;
- Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("prtg_cas01.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),4;
- KillMonster "prtg_cas01.gat","Agit_D01::OnAgitBreak";
- GvgOff "prtg_cas01.gat";
- Break;
-OnInit:
-initnpctimer "Agit_D01_Timer";
-}
-
-prtg_cas01.gat,1,1,1 script Agit_D01_Timer -1,{
-OnTimer500:
- if (GetCastleData("prtg_cas01.gat",1) != 0) break;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1163,15;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1132,10;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1219,5;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1268,5;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1251,1;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1252,1;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1259,1;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1283,1;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1200,1;
- monster "prtg_cas01.gat",197,197,"--ja--",1268,1;
- monster "prtg_cas01.gat",197,197,"--ja--",1251,1;
- monster "prtg_cas01.gat",197,197,"--ja--",1252,1;
- monster "prtg_cas01.gat",197,197,"--ja--",1219,2;
- monster "prtg_cas01.gat",197,197,"--ja--",1276,5;
- Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
- stopnpctimer "Agit_D01_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-prtg_cas02.gat,158,174,0 script Agit_D02 -1,{
-OnAgitInit:
- GetCastleData "prtg_cas02.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "prtg_cas02.gat",0,"::OnRecvCastleP02";
- Break;
-OnRecvCastleP02:
- RequestGuildInfo GetCastleData("prtg_cas02.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("prtg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),2;
- Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
- GvgOn "prtg_cas02.gat";
- Break;
-OnAgitBreak:
- set @GIDp2,getcharid(2);
- if (@GIDp2 <= 0) Break;
- set @Economy,GetCastleData("prtg_cas02.gat",2);
- SetCastleData "prtg_cas02.gat",2,@Economy-5;
- if (GetCastleData("prtg_cas02.gat",2) < 0) SetCastleData "prtg_cas02.gat",2,0;
- set @Defence,GetCastleData("prtg_cas02.gat",3);
- SetCastleData "prtg_cas02.gat",3,@Defence-5;
- if (GetCastleData("prtg_cas02.gat",3) < 0) SetCastleData "prtg_cas02.gat",3,0;
- SetCastleData "prtg_cas02.gat",1,@GIDp2;
- Announce "Guild Base [" + GetCastleName("prtg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDp2) + "] guild.",0;
- MapAnnounce "prtg_cas02.gat","The emperium has been destroyed.",17;
- GetCastleData "prtg_cas02.gat",0,"::OnRecvCastleP02";
- SetCastleData "prtg_cas02.gat",2,0;
- SetCastleData "prtg_cas02.gat",3,0;
- SetCastleData "prtg_cas02.gat",4,0;
- SetCastleData "prtg_cas02.gat",5,0;
- SetCastleData "prtg_cas02.gat",6,0;
- SetCastleData "prtg_cas02.gat",7,0;
- SetCastleData "prtg_cas02.gat",8,0;
- SetCastleData "prtg_cas02.gat",9,0;
- SetCastleData "prtg_cas02.gat",10,0;
- SetCastleData "prtg_cas02.gat",11,0;
- SetCastleData "prtg_cas02.gat",12,0;
- SetCastleData "prtg_cas02.gat",13,0;
- SetCastleData "prtg_cas02.gat",14,0;
- SetCastleData "prtg_cas02.gat",15,0;
- SetCastleData "prtg_cas02.gat",16,0;
- SetCastleData "prtg_cas02.gat",17,0;
- SetCastleData "prtg_cas02.gat",18,0;
- SetCastleData "prtg_cas02.gat",19,0;
- SetCastleData "prtg_cas02.gat",20,0;
- SetCastleData "prtg_cas02.gat",21,0;
- SetCastleData "prtg_cas02.gat",22,0;
- SetCastleData "prtg_cas02.gat",23,0;
- SetCastleData "prtg_cas02.gat",24,0;
- SetCastleData "prtg_cas02.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),6;
- Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("prtg_cas02.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),4;
- KillMonster "prtg_cas02.gat","Agit_D02::OnAgitBreak";
- GvgOff "prtg_cas02.gat";
- Break;
-OnInit:
-initnpctimer "Agit_D02_Timer";
-}
-
-prtg_cas02.gat,1,1,1 script Agit_D02_Timer -1,{
-OnTimer500:
- if (GetCastleData("prtg_cas02.gat",1) != 0) break;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1163,15;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1132,10;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1219,5;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1268,5;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1251,1;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1252,1;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1259,1;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1283,1;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1200,1;
- monster "prtg_cas02.gat",157,174,"--ja--",1268,1;
- monster "prtg_cas02.gat",157,174,"--ja--",1251,1;
- monster "prtg_cas02.gat",157,174,"--ja--",1252,1;
- monster "prtg_cas02.gat",157,174,"--ja--",1219,2;
- monster "prtg_cas02.gat",157,174,"--ja--",1276,5;
- Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
- stopnpctimer "Agit_D02_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-prtg_cas03.gat,17,221,0 script Agit_D03 -1,{
-OnAgitInit:
- GetCastleData "prtg_cas03.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "prtg_cas03.gat",0,"::OnRecvCastleP03";
- Break;
-OnRecvCastleP03:
- RequestGuildInfo GetCastleData("prtg_cas03.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("prtg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),2;
- Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
- GvgOn "prtg_cas03.gat";
- Break;
-OnAgitBreak:
- set @GIDp3,getcharid(2);
- if (@GIDp3 <= 0) Break;
- set @Economy,GetCastleData("prtg_cas03.gat",2);
- SetCastleData "prtg_cas03.gat",2,@Economy-5;
- if (GetCastleData("prtg_cas03.gat",2) < 0) SetCastleData "prtg_cas03.gat",2,0;
- set @Defence,GetCastleData("prtg_cas03.gat",3);
- SetCastleData "prtg_cas03.gat",3,@Defence-5;
- if (GetCastleData("prtg_cas01.gat",3) < 0) SetCastleData "prtg_cas03.gat",3,0;
- SetCastleData "prtg_cas03.gat",1,@GIDp3;
- Announce "Guild Base [" + GetCastleName("prtg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDp3) + "] guild.",0;
- MapAnnounce "prtg_cas03.gat","The emperium has been destroyed.",17;
- GetCastleData "prtg_cas03.gat",0,"::OnRecvCastleP03";
- SetCastleData "prtg_cas03.gat",2,0;
- SetCastleData "prtg_cas03.gat",3,0;
- SetCastleData "prtg_cas03.gat",4,0;
- SetCastleData "prtg_cas03.gat",5,0;
- SetCastleData "prtg_cas03.gat",6,0;
- SetCastleData "prtg_cas03.gat",7,0;
- SetCastleData "prtg_cas03.gat",8,0;
- SetCastleData "prtg_cas03.gat",9,0;
- SetCastleData "prtg_cas03.gat",10,0;
- SetCastleData "prtg_cas03.gat",11,0;
- SetCastleData "prtg_cas03.gat",12,0;
- SetCastleData "prtg_cas03.gat",13,0;
- SetCastleData "prtg_cas03.gat",14,0;
- SetCastleData "prtg_cas03.gat",15,0;
- SetCastleData "prtg_cas03.gat",16,0;
- SetCastleData "prtg_cas03.gat",17,0;
- SetCastleData "prtg_cas03.gat",18,0;
- SetCastleData "prtg_cas03.gat",19,0;
- SetCastleData "prtg_cas03.gat",20,0;
- SetCastleData "prtg_cas03.gat",21,0;
- SetCastleData "prtg_cas03.gat",22,0;
- SetCastleData "prtg_cas03.gat",23,0;
- SetCastleData "prtg_cas03.gat",24,0;
- SetCastleData "prtg_cas03.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),6;
- Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("prtg_cas03.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),4;
- KillMonster "prtg_cas03.gat","Agit_D03::OnAgitBreak";
- GvgOff "prtg_cas03.gat";
- Break;
-OnInit:
-initnpctimer "Agit_D03_Timer";
-}
-
-prtg_cas03.gat,1,1,1 script Agit_D03_Timer -1,{
-OnTimer500:
- if (GetCastleData("prtg_cas03.gat",1) != 0) break;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1163,15;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1132,10;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1219,5;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1268,5;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1251,1;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1252,1;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1259,1;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1283,1;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1200,1;
- monster "prtg_cas03.gat",16,220,"--ja--",1268,1;
- monster "prtg_cas03.gat",16,220,"--ja--",1251,1;
- monster "prtg_cas03.gat",16,220,"--ja--",1252,1;
- monster "prtg_cas03.gat",16,220,"--ja--",1219,2;
- monster "prtg_cas03.gat",16,220,"--ja--",1276,5;
- Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
- stopnpctimer "Agit_D03_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-prtg_cas04.gat,292,14,0 script Agit_D04 -1,{
-OnAgitInit:
- GetCastleData "prtg_cas04.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "prtg_cas04.gat",0,"::OnRecvCastleP04";
- Break;
-OnRecvCastleP04:
- RequestGuildInfo GetCastleData("prtg_cas04.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("prtg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),2;
- Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
- GvgOn "prtg_cas04.gat";
- Break;
-OnAgitBreak:
- set @GIDp4,getcharid(2);
- if (@GIDp4 <= 0) Break;
- set @Economy,GetCastleData("prtg_cas04.gat",2);
- SetCastleData "prtg_cas04.gat",2,@Economy-5;
- if (GetCastleData("prtg_cas04.gat",2) < 0) SetCastleData "prtg_cas04.gat",2,0;
- set @Defence,GetCastleData("prtg_cas04.gat",3);
- SetCastleData "prtg_cas04.gat",3,@Defence-5;
- if (GetCastleData("prtg_cas04.gat",3) < 0) SetCastleData "prtg_cas04.gat",3,0;
- SetCastleData "prtg_cas04.gat",1,@GIDp4;
- Announce "Guild Base [" + GetCastleName("prtg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDp4) + "] guild.",0;
- MapAnnounce "prtg_cas04.gat","The emperium has been destroyed.",17;
- GetCastleData "prtg_cas04.gat",0,"::OnRecvCastleP04";
- SetCastleData "prtg_cas04.gat",2,0;
- SetCastleData "prtg_cas04.gat",3,0;
- SetCastleData "prtg_cas04.gat",4,0;
- SetCastleData "prtg_cas04.gat",5,0;
- SetCastleData "prtg_cas04.gat",6,0;
- SetCastleData "prtg_cas04.gat",7,0;
- SetCastleData "prtg_cas04.gat",8,0;
- SetCastleData "prtg_cas04.gat",9,0;
- SetCastleData "prtg_cas04.gat",10,0;
- SetCastleData "prtg_cas04.gat",11,0;
- SetCastleData "prtg_cas04.gat",12,0;
- SetCastleData "prtg_cas04.gat",13,0;
- SetCastleData "prtg_cas04.gat",14,0;
- SetCastleData "prtg_cas04.gat",15,0;
- SetCastleData "prtg_cas04.gat",16,0;
- SetCastleData "prtg_cas04.gat",17,0;
- SetCastleData "prtg_cas04.gat",18,0;
- SetCastleData "prtg_cas04.gat",19,0;
- SetCastleData "prtg_cas04.gat",20,0;
- SetCastleData "prtg_cas04.gat",21,0;
- SetCastleData "prtg_cas04.gat",22,0;
- SetCastleData "prtg_cas04.gat",23,0;
- SetCastleData "prtg_cas04.gat",24,0;
- SetCastleData "prtg_cas04.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),6;
- Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("prtg_cas04.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),4;
- KillMonster "prtg_cas04.gat","Agit_D04::OnAgitBreak";
- GvgOff "prtg_cas04.gat";
- Break;
-OnInit:
-initnpctimer "Agit_D04_Timer";
-}
-
-prtg_cas04.gat,1,1,1 script Agit_D04_Timer -1,{
-OnTimer500:
- if (GetCastleData("prtg_cas04.gat",1) != 0) break;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1163,15;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1132,10;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1219,5;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1268,5;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1251,1;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1252,1;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1259,1;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1283,1;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1200,1;
- monster "prtg_cas04.gat",291,14,"--ja--",1268,1;
- monster "prtg_cas04.gat",291,14,"--ja--",1251,1;
- monster "prtg_cas04.gat",291,14,"--ja--",1252,1;
- monster "prtg_cas04.gat",291,14,"--ja--",1219,2;
- monster "prtg_cas04.gat",291,14,"--ja--",1276,5;
- Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
- stopnpctimer "Agit_D04_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
-prtg_cas05.gat,266,266,0 script Agit_D05 -1,{
-OnAgitInit:
- GetCastleData "prtg_cas05.gat",0;
- Break;
-OnInterIfInit:
- GetCastleData "prtg_cas05.gat",0,"::OnRecvCastleP05";
- Break;
-OnRecvCastleP05:
- RequestGuildInfo GetCastleData("prtg_cas05.gat",1);
- Break;
-OnAgitStart:
- if (GetCastleData("prtg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),2;
- Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
- GvgOn "prtg_cas05.gat";
- Break;
-OnAgitBreak:
- set @GIDp5,getcharid(2);
- if (@GIDp5 <= 0) Break;
- set @Economy,GetCastleData("prtg_cas05.gat",2);
- SetCastleData "prtg_cas05.gat",2,@Economy-5;
- if (GetCastleData("prtg_cas05.gat",2) < 0) SetCastleData "prtg_cas05.gat",2,0;
- set @Defence,GetCastleData("prtg_cas05.gat",3);
- SetCastleData "prtg_cas05.gat",3,@Defence-5;
- if (GetCastleData("prtg_cas05.gat",3) < 0) SetCastleData "prtg_cas05.gat",3,0;
- SetCastleData "prtg_cas05.gat",1,@GIDp5;
- Announce "Guild Base [" + GetCastleName("prtg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDp5) + "] guild.",0;
- MapAnnounce "prtg_cas05.gat","The emperium has been destroyed.",17;
- GetCastleData "prtg_cas05.gat",0,"::OnRecvCastleP05";
- SetCastleData "prtg_cas05.gat",2,0;
- SetCastleData "prtg_cas05.gat",3,0;
- SetCastleData "prtg_cas05.gat",4,0;
- SetCastleData "prtg_cas05.gat",5,0;
- SetCastleData "prtg_cas05.gat",6,0;
- SetCastleData "prtg_cas05.gat",7,0;
- SetCastleData "prtg_cas05.gat",8,0;
- SetCastleData "prtg_cas05.gat",9,0;
- SetCastleData "prtg_cas05.gat",10,0;
- SetCastleData "prtg_cas05.gat",11,0;
- SetCastleData "prtg_cas05.gat",12,0;
- SetCastleData "prtg_cas05.gat",13,0;
- SetCastleData "prtg_cas05.gat",14,0;
- SetCastleData "prtg_cas05.gat",15,0;
- SetCastleData "prtg_cas05.gat",16,0;
- SetCastleData "prtg_cas05.gat",17,0;
- SetCastleData "prtg_cas05.gat",18,0;
- SetCastleData "prtg_cas05.gat",19,0;
- SetCastleData "prtg_cas05.gat",20,0;
- SetCastleData "prtg_cas05.gat",21,0;
- SetCastleData "prtg_cas05.gat",22,0;
- SetCastleData "prtg_cas05.gat",23,0;
- SetCastleData "prtg_cas05.gat",24,0;
- SetCastleData "prtg_cas05.gat",25,0;
- Break;
-OnAgitEliminate:
- MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),6;
- Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
- Break;
-OnAgitEnd:
- if (GetCastleData("prtg_cas05.gat",1) == 0) break;
- MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),4;
- KillMonster "prtg_cas05.gat","Agit_D05::OnAgitBreak";
- GvgOff "prtg_cas05.gat";
- Break;
-OnInit:
-initnpctimer "Agit_D05_Timer";
-}
-
-prtg_cas05.gat,1,1,1 script Agit_D05_Timer -1,{
-OnTimer500:
- if (GetCastleData("prtg_cas05.gat",1) != 0) break;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1163,15;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1132,10;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1219,5;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1268,5;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1251,1;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1252,1;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1276,5;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1259,1;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1283,1;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1275,1;
- areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1200,1;
- monster "prtg_cas05.gat",266,266,"--ja--",1268,1;
- monster "prtg_cas05.gat",266,266,"--ja--",1251,1;
- monster "prtg_cas05.gat",266,266,"--ja--",1252,1;
- monster "prtg_cas05.gat",266,266,"--ja--",1219,2;
- monster "prtg_cas05.gat",266,266,"--ja--",1276,5;
- Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
- stopnpctimer "Agit_D05_Timer";
- Break;
-}
-//--------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - Prontera Guild Wars Events
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Event Triggers of Prontera Guild Wars
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//= 1.2 by Akaru (Castle spawn/conquering fix)
+//============================================================
+
+
+prtg_cas01.gat,197,197,0 script Agit_D01 -1,{
+OnAgitInit:
+ GetCastleData "prtg_cas01.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "prtg_cas01.gat",0,"::OnRecvCastleP01";
+ Break;
+OnRecvCastleP01:
+ RequestGuildInfo GetCastleData("prtg_cas01.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("prtg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),2;
+ Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
+ GvgOn "prtg_cas01.gat";
+ Break;
+OnAgitBreak:
+ set @GIDp1,getcharid(2);
+ if (@GIDp1 <= 0) Break;
+ set @Economy,GetCastleData("prtg_cas01.gat",2);
+ SetCastleData "prtg_cas01.gat",2,@Economy-5;
+ if (GetCastleData("prtg_cas01.gat",2) < 0) SetCastleData "prtg_cas01.gat",2,0;
+ set @Defence,GetCastleData("prtg_cas01.gat",3);
+ SetCastleData "prtg_cas01.gat",3,@Defence-5;
+ if (GetCastleData("prtg_cas01.gat",3) < 0) SetCastleData "prtg_cas01.gat",3,0;
+ SetCastleData "prtg_cas01.gat",1,@GIDp1;
+ Announce "Guild Base [" + GetCastleName("prtg_cas01.gat") + "] has been taken by the [" + GetGuildName(@GIDp1) + "] guild.",0;
+ MapAnnounce "prtg_cas01.gat","The emperium has been destroyed.",17;
+ GetCastleData "prtg_cas01.gat",0,"::OnRecvCastleP01";
+ SetCastleData "prtg_cas01.gat",2,0;
+ SetCastleData "prtg_cas01.gat",3,0;
+ SetCastleData "prtg_cas01.gat",4,0;
+ SetCastleData "prtg_cas01.gat",5,0;
+ SetCastleData "prtg_cas01.gat",6,0;
+ SetCastleData "prtg_cas01.gat",7,0;
+ SetCastleData "prtg_cas01.gat",8,0;
+ SetCastleData "prtg_cas01.gat",9,0;
+ SetCastleData "prtg_cas01.gat",10,0;
+ SetCastleData "prtg_cas01.gat",11,0;
+ SetCastleData "prtg_cas01.gat",12,0;
+ SetCastleData "prtg_cas01.gat",13,0;
+ SetCastleData "prtg_cas01.gat",14,0;
+ SetCastleData "prtg_cas01.gat",15,0;
+ SetCastleData "prtg_cas01.gat",16,0;
+ SetCastleData "prtg_cas01.gat",17,0;
+ SetCastleData "prtg_cas01.gat",18,0;
+ SetCastleData "prtg_cas01.gat",19,0;
+ SetCastleData "prtg_cas01.gat",20,0;
+ SetCastleData "prtg_cas01.gat",21,0;
+ SetCastleData "prtg_cas01.gat",22,0;
+ SetCastleData "prtg_cas01.gat",23,0;
+ SetCastleData "prtg_cas01.gat",24,0;
+ SetCastleData "prtg_cas01.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),6;
+ Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("prtg_cas01.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),4;
+ KillMonster "prtg_cas01.gat","Agit_D01::OnAgitBreak";
+ GvgOff "prtg_cas01.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_D01_Timer";
+}
+
+prtg_cas01.gat,1,1,1 script Agit_D01_Timer -1,{
+OnTimer500:
+ if (GetCastleData("prtg_cas01.gat",1) != 0) break;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1163,15;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1132,10;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1219,5;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1268,5;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1251,1;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1252,1;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1259,1;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1283,1;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "prtg_cas01.gat",0,0,300,300,"--ja--",1200,1;
+ monster "prtg_cas01.gat",197,197,"--ja--",1268,1;
+ monster "prtg_cas01.gat",197,197,"--ja--",1251,1;
+ monster "prtg_cas01.gat",197,197,"--ja--",1252,1;
+ monster "prtg_cas01.gat",197,197,"--ja--",1219,2;
+ monster "prtg_cas01.gat",197,197,"--ja--",1276,5;
+ Monster "prtg_cas01.gat",197,197,"EMPERIUM",1288,1,"Agit_D01::OnAgitBreak";
+ stopnpctimer "Agit_D01_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+prtg_cas02.gat,158,174,0 script Agit_D02 -1,{
+OnAgitInit:
+ GetCastleData "prtg_cas02.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "prtg_cas02.gat",0,"::OnRecvCastleP02";
+ Break;
+OnRecvCastleP02:
+ RequestGuildInfo GetCastleData("prtg_cas02.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("prtg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),2;
+ Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
+ GvgOn "prtg_cas02.gat";
+ Break;
+OnAgitBreak:
+ set @GIDp2,getcharid(2);
+ if (@GIDp2 <= 0) Break;
+ set @Economy,GetCastleData("prtg_cas02.gat",2);
+ SetCastleData "prtg_cas02.gat",2,@Economy-5;
+ if (GetCastleData("prtg_cas02.gat",2) < 0) SetCastleData "prtg_cas02.gat",2,0;
+ set @Defence,GetCastleData("prtg_cas02.gat",3);
+ SetCastleData "prtg_cas02.gat",3,@Defence-5;
+ if (GetCastleData("prtg_cas02.gat",3) < 0) SetCastleData "prtg_cas02.gat",3,0;
+ SetCastleData "prtg_cas02.gat",1,@GIDp2;
+ Announce "Guild Base [" + GetCastleName("prtg_cas02.gat") + "] has been taken by the [" + GetGuildName(@GIDp2) + "] guild.",0;
+ MapAnnounce "prtg_cas02.gat","The emperium has been destroyed.",17;
+ GetCastleData "prtg_cas02.gat",0,"::OnRecvCastleP02";
+ SetCastleData "prtg_cas02.gat",2,0;
+ SetCastleData "prtg_cas02.gat",3,0;
+ SetCastleData "prtg_cas02.gat",4,0;
+ SetCastleData "prtg_cas02.gat",5,0;
+ SetCastleData "prtg_cas02.gat",6,0;
+ SetCastleData "prtg_cas02.gat",7,0;
+ SetCastleData "prtg_cas02.gat",8,0;
+ SetCastleData "prtg_cas02.gat",9,0;
+ SetCastleData "prtg_cas02.gat",10,0;
+ SetCastleData "prtg_cas02.gat",11,0;
+ SetCastleData "prtg_cas02.gat",12,0;
+ SetCastleData "prtg_cas02.gat",13,0;
+ SetCastleData "prtg_cas02.gat",14,0;
+ SetCastleData "prtg_cas02.gat",15,0;
+ SetCastleData "prtg_cas02.gat",16,0;
+ SetCastleData "prtg_cas02.gat",17,0;
+ SetCastleData "prtg_cas02.gat",18,0;
+ SetCastleData "prtg_cas02.gat",19,0;
+ SetCastleData "prtg_cas02.gat",20,0;
+ SetCastleData "prtg_cas02.gat",21,0;
+ SetCastleData "prtg_cas02.gat",22,0;
+ SetCastleData "prtg_cas02.gat",23,0;
+ SetCastleData "prtg_cas02.gat",24,0;
+ SetCastleData "prtg_cas02.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),6;
+ Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("prtg_cas02.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),4;
+ KillMonster "prtg_cas02.gat","Agit_D02::OnAgitBreak";
+ GvgOff "prtg_cas02.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_D02_Timer";
+}
+
+prtg_cas02.gat,1,1,1 script Agit_D02_Timer -1,{
+OnTimer500:
+ if (GetCastleData("prtg_cas02.gat",1) != 0) break;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1163,15;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1132,10;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1219,5;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1268,5;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1251,1;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1252,1;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1259,1;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1283,1;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "prtg_cas02.gat",0,0,300,300,"--ja--",1200,1;
+ monster "prtg_cas02.gat",157,174,"--ja--",1268,1;
+ monster "prtg_cas02.gat",157,174,"--ja--",1251,1;
+ monster "prtg_cas02.gat",157,174,"--ja--",1252,1;
+ monster "prtg_cas02.gat",157,174,"--ja--",1219,2;
+ monster "prtg_cas02.gat",157,174,"--ja--",1276,5;
+ Monster "prtg_cas02.gat",158,174,"EMPERIUM",1288,1,"Agit_D02::OnAgitBreak";
+ stopnpctimer "Agit_D02_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+prtg_cas03.gat,17,221,0 script Agit_D03 -1,{
+OnAgitInit:
+ GetCastleData "prtg_cas03.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "prtg_cas03.gat",0,"::OnRecvCastleP03";
+ Break;
+OnRecvCastleP03:
+ RequestGuildInfo GetCastleData("prtg_cas03.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("prtg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),2;
+ Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
+ GvgOn "prtg_cas03.gat";
+ Break;
+OnAgitBreak:
+ set @GIDp3,getcharid(2);
+ if (@GIDp3 <= 0) Break;
+ set @Economy,GetCastleData("prtg_cas03.gat",2);
+ SetCastleData "prtg_cas03.gat",2,@Economy-5;
+ if (GetCastleData("prtg_cas03.gat",2) < 0) SetCastleData "prtg_cas03.gat",2,0;
+ set @Defence,GetCastleData("prtg_cas03.gat",3);
+ SetCastleData "prtg_cas03.gat",3,@Defence-5;
+ if (GetCastleData("prtg_cas01.gat",3) < 0) SetCastleData "prtg_cas03.gat",3,0;
+ SetCastleData "prtg_cas03.gat",1,@GIDp3;
+ Announce "Guild Base [" + GetCastleName("prtg_cas03.gat") + "] has been taken by the [" + GetGuildName(@GIDp3) + "] guild.",0;
+ MapAnnounce "prtg_cas03.gat","The emperium has been destroyed.",17;
+ GetCastleData "prtg_cas03.gat",0,"::OnRecvCastleP03";
+ SetCastleData "prtg_cas03.gat",2,0;
+ SetCastleData "prtg_cas03.gat",3,0;
+ SetCastleData "prtg_cas03.gat",4,0;
+ SetCastleData "prtg_cas03.gat",5,0;
+ SetCastleData "prtg_cas03.gat",6,0;
+ SetCastleData "prtg_cas03.gat",7,0;
+ SetCastleData "prtg_cas03.gat",8,0;
+ SetCastleData "prtg_cas03.gat",9,0;
+ SetCastleData "prtg_cas03.gat",10,0;
+ SetCastleData "prtg_cas03.gat",11,0;
+ SetCastleData "prtg_cas03.gat",12,0;
+ SetCastleData "prtg_cas03.gat",13,0;
+ SetCastleData "prtg_cas03.gat",14,0;
+ SetCastleData "prtg_cas03.gat",15,0;
+ SetCastleData "prtg_cas03.gat",16,0;
+ SetCastleData "prtg_cas03.gat",17,0;
+ SetCastleData "prtg_cas03.gat",18,0;
+ SetCastleData "prtg_cas03.gat",19,0;
+ SetCastleData "prtg_cas03.gat",20,0;
+ SetCastleData "prtg_cas03.gat",21,0;
+ SetCastleData "prtg_cas03.gat",22,0;
+ SetCastleData "prtg_cas03.gat",23,0;
+ SetCastleData "prtg_cas03.gat",24,0;
+ SetCastleData "prtg_cas03.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),6;
+ Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("prtg_cas03.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),4;
+ KillMonster "prtg_cas03.gat","Agit_D03::OnAgitBreak";
+ GvgOff "prtg_cas03.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_D03_Timer";
+}
+
+prtg_cas03.gat,1,1,1 script Agit_D03_Timer -1,{
+OnTimer500:
+ if (GetCastleData("prtg_cas03.gat",1) != 0) break;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1163,15;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1132,10;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1219,5;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1268,5;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1251,1;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1252,1;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1259,1;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1283,1;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "prtg_cas03.gat",0,0,300,300,"--ja--",1200,1;
+ monster "prtg_cas03.gat",16,220,"--ja--",1268,1;
+ monster "prtg_cas03.gat",16,220,"--ja--",1251,1;
+ monster "prtg_cas03.gat",16,220,"--ja--",1252,1;
+ monster "prtg_cas03.gat",16,220,"--ja--",1219,2;
+ monster "prtg_cas03.gat",16,220,"--ja--",1276,5;
+ Monster "prtg_cas03.gat",17,221,"EMPERIUM",1288,1,"Agit_D03::OnAgitBreak";
+ stopnpctimer "Agit_D03_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+prtg_cas04.gat,292,14,0 script Agit_D04 -1,{
+OnAgitInit:
+ GetCastleData "prtg_cas04.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "prtg_cas04.gat",0,"::OnRecvCastleP04";
+ Break;
+OnRecvCastleP04:
+ RequestGuildInfo GetCastleData("prtg_cas04.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("prtg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),2;
+ Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
+ GvgOn "prtg_cas04.gat";
+ Break;
+OnAgitBreak:
+ set @GIDp4,getcharid(2);
+ if (@GIDp4 <= 0) Break;
+ set @Economy,GetCastleData("prtg_cas04.gat",2);
+ SetCastleData "prtg_cas04.gat",2,@Economy-5;
+ if (GetCastleData("prtg_cas04.gat",2) < 0) SetCastleData "prtg_cas04.gat",2,0;
+ set @Defence,GetCastleData("prtg_cas04.gat",3);
+ SetCastleData "prtg_cas04.gat",3,@Defence-5;
+ if (GetCastleData("prtg_cas04.gat",3) < 0) SetCastleData "prtg_cas04.gat",3,0;
+ SetCastleData "prtg_cas04.gat",1,@GIDp4;
+ Announce "Guild Base [" + GetCastleName("prtg_cas04.gat") + "] has been taken by the [" + GetGuildName(@GIDp4) + "] guild.",0;
+ MapAnnounce "prtg_cas04.gat","The emperium has been destroyed.",17;
+ GetCastleData "prtg_cas04.gat",0,"::OnRecvCastleP04";
+ SetCastleData "prtg_cas04.gat",2,0;
+ SetCastleData "prtg_cas04.gat",3,0;
+ SetCastleData "prtg_cas04.gat",4,0;
+ SetCastleData "prtg_cas04.gat",5,0;
+ SetCastleData "prtg_cas04.gat",6,0;
+ SetCastleData "prtg_cas04.gat",7,0;
+ SetCastleData "prtg_cas04.gat",8,0;
+ SetCastleData "prtg_cas04.gat",9,0;
+ SetCastleData "prtg_cas04.gat",10,0;
+ SetCastleData "prtg_cas04.gat",11,0;
+ SetCastleData "prtg_cas04.gat",12,0;
+ SetCastleData "prtg_cas04.gat",13,0;
+ SetCastleData "prtg_cas04.gat",14,0;
+ SetCastleData "prtg_cas04.gat",15,0;
+ SetCastleData "prtg_cas04.gat",16,0;
+ SetCastleData "prtg_cas04.gat",17,0;
+ SetCastleData "prtg_cas04.gat",18,0;
+ SetCastleData "prtg_cas04.gat",19,0;
+ SetCastleData "prtg_cas04.gat",20,0;
+ SetCastleData "prtg_cas04.gat",21,0;
+ SetCastleData "prtg_cas04.gat",22,0;
+ SetCastleData "prtg_cas04.gat",23,0;
+ SetCastleData "prtg_cas04.gat",24,0;
+ SetCastleData "prtg_cas04.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),6;
+ Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("prtg_cas04.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),4;
+ KillMonster "prtg_cas04.gat","Agit_D04::OnAgitBreak";
+ GvgOff "prtg_cas04.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_D04_Timer";
+}
+
+prtg_cas04.gat,1,1,1 script Agit_D04_Timer -1,{
+OnTimer500:
+ if (GetCastleData("prtg_cas04.gat",1) != 0) break;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1163,15;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1132,10;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1219,5;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1268,5;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1251,1;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1252,1;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1259,1;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1283,1;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "prtg_cas04.gat",0,0,300,300,"--ja--",1200,1;
+ monster "prtg_cas04.gat",291,14,"--ja--",1268,1;
+ monster "prtg_cas04.gat",291,14,"--ja--",1251,1;
+ monster "prtg_cas04.gat",291,14,"--ja--",1252,1;
+ monster "prtg_cas04.gat",291,14,"--ja--",1219,2;
+ monster "prtg_cas04.gat",291,14,"--ja--",1276,5;
+ Monster "prtg_cas04.gat",292,14,"EMPERIUM",1288,1,"Agit_D04::OnAgitBreak";
+ stopnpctimer "Agit_D04_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
+prtg_cas05.gat,266,266,0 script Agit_D05 -1,{
+OnAgitInit:
+ GetCastleData "prtg_cas05.gat",0;
+ Break;
+OnInterIfInit:
+ GetCastleData "prtg_cas05.gat",0,"::OnRecvCastleP05";
+ Break;
+OnRecvCastleP05:
+ RequestGuildInfo GetCastleData("prtg_cas05.gat",1);
+ Break;
+OnAgitStart:
+ if (GetCastleData("prtg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),2;
+ Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
+ GvgOn "prtg_cas05.gat";
+ Break;
+OnAgitBreak:
+ set @GIDp5,getcharid(2);
+ if (@GIDp5 <= 0) Break;
+ set @Economy,GetCastleData("prtg_cas05.gat",2);
+ SetCastleData "prtg_cas05.gat",2,@Economy-5;
+ if (GetCastleData("prtg_cas05.gat",2) < 0) SetCastleData "prtg_cas05.gat",2,0;
+ set @Defence,GetCastleData("prtg_cas05.gat",3);
+ SetCastleData "prtg_cas05.gat",3,@Defence-5;
+ if (GetCastleData("prtg_cas05.gat",3) < 0) SetCastleData "prtg_cas05.gat",3,0;
+ SetCastleData "prtg_cas05.gat",1,@GIDp5;
+ Announce "Guild Base [" + GetCastleName("prtg_cas05.gat") + "] has been taken by [" + GetGuildName(@GIDp5) + "] guild.",0;
+ MapAnnounce "prtg_cas05.gat","The emperium has been destroyed.",17;
+ GetCastleData "prtg_cas05.gat",0,"::OnRecvCastleP05";
+ SetCastleData "prtg_cas05.gat",2,0;
+ SetCastleData "prtg_cas05.gat",3,0;
+ SetCastleData "prtg_cas05.gat",4,0;
+ SetCastleData "prtg_cas05.gat",5,0;
+ SetCastleData "prtg_cas05.gat",6,0;
+ SetCastleData "prtg_cas05.gat",7,0;
+ SetCastleData "prtg_cas05.gat",8,0;
+ SetCastleData "prtg_cas05.gat",9,0;
+ SetCastleData "prtg_cas05.gat",10,0;
+ SetCastleData "prtg_cas05.gat",11,0;
+ SetCastleData "prtg_cas05.gat",12,0;
+ SetCastleData "prtg_cas05.gat",13,0;
+ SetCastleData "prtg_cas05.gat",14,0;
+ SetCastleData "prtg_cas05.gat",15,0;
+ SetCastleData "prtg_cas05.gat",16,0;
+ SetCastleData "prtg_cas05.gat",17,0;
+ SetCastleData "prtg_cas05.gat",18,0;
+ SetCastleData "prtg_cas05.gat",19,0;
+ SetCastleData "prtg_cas05.gat",20,0;
+ SetCastleData "prtg_cas05.gat",21,0;
+ SetCastleData "prtg_cas05.gat",22,0;
+ SetCastleData "prtg_cas05.gat",23,0;
+ SetCastleData "prtg_cas05.gat",24,0;
+ SetCastleData "prtg_cas05.gat",25,0;
+ Break;
+OnAgitEliminate:
+ MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),6;
+ Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
+ Break;
+OnAgitEnd:
+ if (GetCastleData("prtg_cas05.gat",1) == 0) break;
+ MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),4;
+ KillMonster "prtg_cas05.gat","Agit_D05::OnAgitBreak";
+ GvgOff "prtg_cas05.gat";
+ Break;
+OnInit:
+initnpctimer "Agit_D05_Timer";
+}
+
+prtg_cas05.gat,1,1,1 script Agit_D05_Timer -1,{
+OnTimer500:
+ if (GetCastleData("prtg_cas05.gat",1) != 0) break;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1163,15;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1132,10;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1219,5;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1268,5;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1251,1;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1252,1;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1276,5;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1259,1;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1283,1;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1275,1;
+ areamonster "prtg_cas05.gat",0,0,300,300,"--ja--",1200,1;
+ monster "prtg_cas05.gat",266,266,"--ja--",1268,1;
+ monster "prtg_cas05.gat",266,266,"--ja--",1251,1;
+ monster "prtg_cas05.gat",266,266,"--ja--",1252,1;
+ monster "prtg_cas05.gat",266,266,"--ja--",1219,2;
+ monster "prtg_cas05.gat",266,266,"--ja--",1276,5;
+ Monster "prtg_cas05.gat",266,266,"EMPERIUM",1288,1,"Agit_D05::OnAgitBreak";
+ stopnpctimer "Agit_D05_Timer";
+ Break;
+}
+//--------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/gefg_cas01.txt b/npc/guild/old/gefg_cas01.txt
index ccfdc658e..0d61bd009 100644
--- a/npc/guild/old/gefg_cas01.txt
+++ b/npc/guild/old/gefg_cas01.txt
@@ -1,667 +1,667 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas01 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-gefg_cas01.gat,28,157,4 script Reprion#g1-6::ReprionNW 722,{
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (@GIDg1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- break;
-}
-
-gefg_cas01.gat,28,157,4 duplicate(ReprionNW) Reprion#g1-7 722
-gefg_cas01.gat,22,156,5 duplicate(ReprionNW) Reprion#g1-8 722
-gefg_cas01.gat,68,185,3 duplicate(ReprionNW) Reprion#g1-9 722
-gefg_cas01.gat,17,171,5 duplicate(ReprionNW) Reprion#g1-10 722
-gefg_cas01.gat,59,16,4 duplicate(ReprionNW) Reprion#g1-11 722
-gefg_cas01.gat,64,16,4 duplicate(ReprionNW) Reprion#g1-12 722
-
-//================================================
-// Kafra Service
-//================================================
-gefg_cas01.gat,96,173,0 script Kafra Service#gef1 117,{
- cutin "kafra_01",2;
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (getcharid(2) == @GIDg1) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg1) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDg1) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "geffen.gat",120,39;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("gefg_cas01.gat",9) == 1) break;
- disablenpc "Kafra Service#gef1";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-gefg_cas01.gat,78,84,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (getcharid(2) != @GIDg1) goto L1n;
- warp "gld_dun04.gat",39,258;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-gefg_cas01.gat,40,48,5 script Gnaucher 55,{
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (@GIDg1 == 0) goto LStart;
- if (getcharid(2) != @GIDg1) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDg1)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Gnaucher ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDg1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg1) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Gnaucher ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Gnaucher ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDg1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Gnaucher ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDg1) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Gnaucher ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("gefg_cas01.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("gefg_cas01.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("gefg_cas01.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("gefg_cas01.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("gefg_cas01.gat",4);
- set @Economy,GetCastleData("gefg_cas01.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Gnaucher ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Gnaucher ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Gnaucher ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas01.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas01.gat",2,@Economy+1;
- mes "[ Gnaucher ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Gnaucher ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Gnaucher ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas01.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas01.gat",2,@Economy+1;
- mes "[ Gnaucher ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Gnaucher ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Gnaucher ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("gefg_cas01.gat",5);
- set @Defence,GetCastleData("gefg_cas01.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Gnaucher ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Gnaucher ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Gnaucher ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas01.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas01.gat",3,@Defence+1;
- mes "[ Gnaucher ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Gnaucher ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Gnaucher ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas01.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas01.gat",3,@Defence+1;
- mes "[ Gnaucher ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Gnaucher ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Gnaucher ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("gefg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Gnaucher ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("gefg_cas01.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("gefg_cas01.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("gefg_cas01.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("gefg_cas01.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("gefg_cas01.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("gefg_cas01.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("gefg_cas01.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("gefg_cas01.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Gnaucher ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Gnaucher ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "gefg_cas01.gat",@GDnum,1;
- SetCastleData "gefg_cas01.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
- mes "[ Gnaucher ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Gnaucher ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Gnaucher ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Gnaucher ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("gefg_cas01.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Gnaucher ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Gnaucher ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Gnaucher ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#gef1";
- SetCastleData "gefg_cas01.gat",9,1;
- mes "[ Gnaucher ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Gnaucher ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Gnaucher ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Gnaucher ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#gef1";
- SetCastleData "gefg_cas01.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Gnaucher ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Gnaucher ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Gnaucher ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Gnaucher ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "gefg_cas01",155,112;
- L6_1:
- mes "[ Gnaucher ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Gnaucher ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Gnaucher ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Gnaucher ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "gefg_cas01.gat",1,0;
- SetCastleData "gefg_cas01.gat",2,0;
- SetCastleData "gefg_cas01.gat",3,0;
- SetCastleData "gefg_cas01.gat",4,0;
- SetCastleData "gefg_cas01.gat",5,0;
- SetCastleData "gefg_cas01.gat",6,0;
- SetCastleData "gefg_cas01.gat",7,0;
- SetCastleData "gefg_cas01.gat",8,0;
- SetCastleData "gefg_cas01.gat",9,0;
- SetCastleData "gefg_cas01.gat",10,0;
- SetCastleData "gefg_cas01.gat",11,0;
- SetCastleData "gefg_cas01.gat",12,0;
- SetCastleData "gefg_cas01.gat",13,0;
- SetCastleData "gefg_cas01.gat",14,0;
- SetCastleData "gefg_cas01.gat",15,0;
- SetCastleData "gefg_cas01.gat",16,0;
- SetCastleData "gefg_cas01.gat",17,0;
- SetCastleData "gefg_cas01.gat",18,0;
- SetCastleData "gefg_cas01.gat",19,0;
- SetCastleData "gefg_cas01.gat",20,0;
- SetCastleData "gefg_cas01.gat",21,0;
- SetCastleData "gefg_cas01.gat",22,0;
- SetCastleData "gefg_cas01.gat",23,0;
- SetCastleData "gefg_cas01.gat",24,0;
- SetCastleData "gefg_cas01.gat",25,0;
- Announce "[" + GetGuildName(@GIDg1) + "] has surrendered Agit [" + GetCastleName("gefg_cas01.gat") + "]",0;
- MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),7;
- break;
- L7_2:
- mes "[ Gnaucher ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas01 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+gefg_cas01.gat,28,157,4 script Reprion#g1-6::ReprionNW 722,{
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (@GIDg1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ break;
+}
+
+gefg_cas01.gat,28,157,4 duplicate(ReprionNW) Reprion#g1-7 722
+gefg_cas01.gat,22,156,5 duplicate(ReprionNW) Reprion#g1-8 722
+gefg_cas01.gat,68,185,3 duplicate(ReprionNW) Reprion#g1-9 722
+gefg_cas01.gat,17,171,5 duplicate(ReprionNW) Reprion#g1-10 722
+gefg_cas01.gat,59,16,4 duplicate(ReprionNW) Reprion#g1-11 722
+gefg_cas01.gat,64,16,4 duplicate(ReprionNW) Reprion#g1-12 722
+
+//================================================
+// Kafra Service
+//================================================
+gefg_cas01.gat,96,173,0 script Kafra Service#gef1 117,{
+ cutin "kafra_01",2;
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (getcharid(2) == @GIDg1) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg1) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDg1) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "geffen.gat",120,39;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("gefg_cas01.gat",9) == 1) break;
+ disablenpc "Kafra Service#gef1";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+gefg_cas01.gat,78,84,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (getcharid(2) != @GIDg1) goto L1n;
+ warp "gld_dun04.gat",39,258;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+gefg_cas01.gat,40,48,5 script Gnaucher 55,{
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (@GIDg1 == 0) goto LStart;
+ if (getcharid(2) != @GIDg1) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDg1)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Gnaucher ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDg1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg1) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Gnaucher ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Gnaucher ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDg1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Gnaucher ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDg1) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Gnaucher ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("gefg_cas01.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("gefg_cas01.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("gefg_cas01.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("gefg_cas01.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("gefg_cas01.gat",4);
+ set @Economy,GetCastleData("gefg_cas01.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Gnaucher ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Gnaucher ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Gnaucher ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas01.gat",2,@Economy+1;
+ mes "[ Gnaucher ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Gnaucher ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Gnaucher ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas01.gat",2,@Economy+1;
+ mes "[ Gnaucher ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Gnaucher ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Gnaucher ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("gefg_cas01.gat",5);
+ set @Defence,GetCastleData("gefg_cas01.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Gnaucher ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Gnaucher ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Gnaucher ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas01.gat",3,@Defence+1;
+ mes "[ Gnaucher ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Gnaucher ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Gnaucher ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas01.gat",3,@Defence+1;
+ mes "[ Gnaucher ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Gnaucher ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Gnaucher ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("gefg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Gnaucher ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("gefg_cas01.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("gefg_cas01.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("gefg_cas01.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("gefg_cas01.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("gefg_cas01.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("gefg_cas01.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("gefg_cas01.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("gefg_cas01.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Gnaucher ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Gnaucher ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "gefg_cas01.gat",@GDnum,1;
+ SetCastleData "gefg_cas01.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
+ mes "[ Gnaucher ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Gnaucher ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Gnaucher ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Gnaucher ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("gefg_cas01.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Gnaucher ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Gnaucher ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Gnaucher ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#gef1";
+ SetCastleData "gefg_cas01.gat",9,1;
+ mes "[ Gnaucher ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Gnaucher ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Gnaucher ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Gnaucher ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#gef1";
+ SetCastleData "gefg_cas01.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Gnaucher ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Gnaucher ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Gnaucher ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Gnaucher ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "gefg_cas01",155,112;
+ L6_1:
+ mes "[ Gnaucher ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Gnaucher ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Gnaucher ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Gnaucher ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "gefg_cas01.gat",1,0;
+ SetCastleData "gefg_cas01.gat",2,0;
+ SetCastleData "gefg_cas01.gat",3,0;
+ SetCastleData "gefg_cas01.gat",4,0;
+ SetCastleData "gefg_cas01.gat",5,0;
+ SetCastleData "gefg_cas01.gat",6,0;
+ SetCastleData "gefg_cas01.gat",7,0;
+ SetCastleData "gefg_cas01.gat",8,0;
+ SetCastleData "gefg_cas01.gat",9,0;
+ SetCastleData "gefg_cas01.gat",10,0;
+ SetCastleData "gefg_cas01.gat",11,0;
+ SetCastleData "gefg_cas01.gat",12,0;
+ SetCastleData "gefg_cas01.gat",13,0;
+ SetCastleData "gefg_cas01.gat",14,0;
+ SetCastleData "gefg_cas01.gat",15,0;
+ SetCastleData "gefg_cas01.gat",16,0;
+ SetCastleData "gefg_cas01.gat",17,0;
+ SetCastleData "gefg_cas01.gat",18,0;
+ SetCastleData "gefg_cas01.gat",19,0;
+ SetCastleData "gefg_cas01.gat",20,0;
+ SetCastleData "gefg_cas01.gat",21,0;
+ SetCastleData "gefg_cas01.gat",22,0;
+ SetCastleData "gefg_cas01.gat",23,0;
+ SetCastleData "gefg_cas01.gat",24,0;
+ SetCastleData "gefg_cas01.gat",25,0;
+ Announce "[" + GetGuildName(@GIDg1) + "] has surrendered Agit [" + GetCastleName("gefg_cas01.gat") + "]",0;
+ MapRespawnGuildID "gefg_cas01.gat",GetCastleData("gefg_cas01.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Gnaucher ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/gefg_cas02.txt b/npc/guild/old/gefg_cas02.txt
index d03415a49..e1e7de8c8 100644
--- a/npc/guild/old/gefg_cas02.txt
+++ b/npc/guild/old/gefg_cas02.txt
@@ -1,667 +1,667 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas02 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-gefg_cas02.gat,65,130,5 script Yolbriger#g2-6::YolbrigerNW 722,{
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (@GIDg2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- break;
-}
-
-gefg_cas02.gat,30,123,5 duplicate(YolbrigerNW) Yolbriger#g2-7 722
-gefg_cas02.gat,65,139,6 duplicate(YolbrigerNW) Yolbriger#g2-8 722
-gefg_cas02.gat,37,177,6 duplicate(YolbrigerNW) Yolbriger#g2-9 722
-gefg_cas02.gat,37,168,6 duplicate(YolbrigerNW) Yolbriger#g2-10 722
-gefg_cas02.gat,68,47,2 duplicate(YolbrigerNW) Yolbriger#g2-11 722
-gefg_cas02.gat,68,36,2 duplicate(YolbrigerNW) Yolbriger#g2-12 722
-
-//================================================
-// Kafra Service
-//================================================
-gefg_cas02.gat,23,66,3 script Kafra Service#gef2 117,{
- cutin "kafra_01",2;
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (getcharid(2) == @GIDg2) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg2) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDg2) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "geffen.gat",120,39;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("gefg_cas02.gat",9) == 1) break;
- disablenpc "Kafra Service#gef2";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-gefg_cas02.gat,145,115,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (getcharid(2) != @GIDg2) goto L1n;
- warp "gld_dun04.gat",125,270;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-gefg_cas02.gat,12,66,5 script Esmark 55,{
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (@GIDg2 == 0) goto LStart;
- if (getcharid(2) != @GIDg2) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDg2)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Esmark ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDg2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg2) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Esmark ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Esmark ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDg2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Esmark ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDg2) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Esmark ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("gefg_cas02.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("gefg_cas02.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("gefg_cas02.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("gefg_cas02.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("gefg_cas02.gat",4);
- set @Economy,GetCastleData("gefg_cas02.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Esmark ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Esmark ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Esmark ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas02.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas02.gat",2,@Economy+1;
- mes "[ Esmark ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Esmark ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Esmark ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas02.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas02.gat",2,@Economy+1;
- mes "[ Esmark ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Esmark ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Esmark ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("gefg_cas02.gat",5);
- set @Defence,GetCastleData("gefg_cas02.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Esmark ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Esmark ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Esmark ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas02.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas02.gat",3,@Defence+1;
- mes "[ Esmark ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Esmark ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Esmark ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas02.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas02.gat",3,@Defence+1;
- mes "[ Esmark ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Esmark ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Esmark ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("gefg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Esmark ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("gefg_cas02.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("gefg_cas02.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("gefg_cas02.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("gefg_cas02.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("gefg_cas02.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("gefg_cas02.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("gefg_cas02.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("gefg_cas02.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Esmark ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Esmark ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "gefg_cas02.gat",@GDnum,1;
- SetCastleData "gefg_cas02.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
- mes "[ Esmark ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Esmark ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Esmark ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Esmark ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("gefg_cas02.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Esmark ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Esmark ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Esmark ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#gef2";
- SetCastleData "gefg_cas02.gat",9,1;
- mes "[ Esmark ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Esmark ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Esmark ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Esmark ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#gef2";
- SetCastleData "gefg_cas02.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Esmark ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Esmark ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Esmark ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Esmark ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "gefg_cas02",141,115;
- L6_1:
- mes "[ Esmark ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Esmark ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Esmark ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Esmark ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "gefg_cas02.gat",1,0;
- SetCastleData "gefg_cas02.gat",2,0;
- SetCastleData "gefg_cas02.gat",3,0;
- SetCastleData "gefg_cas02.gat",4,0;
- SetCastleData "gefg_cas02.gat",5,0;
- SetCastleData "gefg_cas02.gat",6,0;
- SetCastleData "gefg_cas02.gat",7,0;
- SetCastleData "gefg_cas02.gat",8,0;
- SetCastleData "gefg_cas02.gat",9,0;
- SetCastleData "gefg_cas02.gat",10,0;
- SetCastleData "gefg_cas02.gat",11,0;
- SetCastleData "gefg_cas02.gat",12,0;
- SetCastleData "gefg_cas02.gat",13,0;
- SetCastleData "gefg_cas02.gat",14,0;
- SetCastleData "gefg_cas02.gat",15,0;
- SetCastleData "gefg_cas02.gat",16,0;
- SetCastleData "gefg_cas02.gat",17,0;
- SetCastleData "gefg_cas02.gat",18,0;
- SetCastleData "gefg_cas02.gat",19,0;
- SetCastleData "gefg_cas02.gat",20,0;
- SetCastleData "gefg_cas02.gat",21,0;
- SetCastleData "gefg_cas02.gat",22,0;
- SetCastleData "gefg_cas02.gat",23,0;
- SetCastleData "gefg_cas02.gat",24,0;
- SetCastleData "gefg_cas02.gat",25,0;
- Announce "[" + GetGuildName(@GIDg2) + "] has surrendered Agit [" + GetCastleName("gefg_cas02.gat") + "]",0;
- MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),7;
- break;
- L7_2:
- mes "[ Esmark ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas02 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+gefg_cas02.gat,65,130,5 script Yolbriger#g2-6::YolbrigerNW 722,{
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (@GIDg2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ break;
+}
+
+gefg_cas02.gat,30,123,5 duplicate(YolbrigerNW) Yolbriger#g2-7 722
+gefg_cas02.gat,65,139,6 duplicate(YolbrigerNW) Yolbriger#g2-8 722
+gefg_cas02.gat,37,177,6 duplicate(YolbrigerNW) Yolbriger#g2-9 722
+gefg_cas02.gat,37,168,6 duplicate(YolbrigerNW) Yolbriger#g2-10 722
+gefg_cas02.gat,68,47,2 duplicate(YolbrigerNW) Yolbriger#g2-11 722
+gefg_cas02.gat,68,36,2 duplicate(YolbrigerNW) Yolbriger#g2-12 722
+
+//================================================
+// Kafra Service
+//================================================
+gefg_cas02.gat,23,66,3 script Kafra Service#gef2 117,{
+ cutin "kafra_01",2;
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (getcharid(2) == @GIDg2) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg2) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDg2) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "geffen.gat",120,39;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("gefg_cas02.gat",9) == 1) break;
+ disablenpc "Kafra Service#gef2";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+gefg_cas02.gat,145,115,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (getcharid(2) != @GIDg2) goto L1n;
+ warp "gld_dun04.gat",125,270;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+gefg_cas02.gat,12,66,5 script Esmark 55,{
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (@GIDg2 == 0) goto LStart;
+ if (getcharid(2) != @GIDg2) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDg2)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Esmark ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDg2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg2) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Esmark ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Esmark ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDg2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Esmark ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDg2) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Esmark ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("gefg_cas02.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("gefg_cas02.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("gefg_cas02.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("gefg_cas02.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("gefg_cas02.gat",4);
+ set @Economy,GetCastleData("gefg_cas02.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Esmark ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Esmark ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Esmark ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas02.gat",2,@Economy+1;
+ mes "[ Esmark ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Esmark ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Esmark ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas02.gat",2,@Economy+1;
+ mes "[ Esmark ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Esmark ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Esmark ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("gefg_cas02.gat",5);
+ set @Defence,GetCastleData("gefg_cas02.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Esmark ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Esmark ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Esmark ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas02.gat",3,@Defence+1;
+ mes "[ Esmark ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Esmark ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Esmark ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas02.gat",3,@Defence+1;
+ mes "[ Esmark ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Esmark ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Esmark ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("gefg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Esmark ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("gefg_cas02.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("gefg_cas02.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("gefg_cas02.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("gefg_cas02.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("gefg_cas02.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("gefg_cas02.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("gefg_cas02.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("gefg_cas02.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Esmark ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Esmark ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "gefg_cas02.gat",@GDnum,1;
+ SetCastleData "gefg_cas02.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
+ mes "[ Esmark ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Esmark ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Esmark ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Esmark ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("gefg_cas02.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Esmark ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Esmark ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Esmark ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#gef2";
+ SetCastleData "gefg_cas02.gat",9,1;
+ mes "[ Esmark ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Esmark ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Esmark ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Esmark ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#gef2";
+ SetCastleData "gefg_cas02.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Esmark ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Esmark ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Esmark ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Esmark ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "gefg_cas02",141,115;
+ L6_1:
+ mes "[ Esmark ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Esmark ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Esmark ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Esmark ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "gefg_cas02.gat",1,0;
+ SetCastleData "gefg_cas02.gat",2,0;
+ SetCastleData "gefg_cas02.gat",3,0;
+ SetCastleData "gefg_cas02.gat",4,0;
+ SetCastleData "gefg_cas02.gat",5,0;
+ SetCastleData "gefg_cas02.gat",6,0;
+ SetCastleData "gefg_cas02.gat",7,0;
+ SetCastleData "gefg_cas02.gat",8,0;
+ SetCastleData "gefg_cas02.gat",9,0;
+ SetCastleData "gefg_cas02.gat",10,0;
+ SetCastleData "gefg_cas02.gat",11,0;
+ SetCastleData "gefg_cas02.gat",12,0;
+ SetCastleData "gefg_cas02.gat",13,0;
+ SetCastleData "gefg_cas02.gat",14,0;
+ SetCastleData "gefg_cas02.gat",15,0;
+ SetCastleData "gefg_cas02.gat",16,0;
+ SetCastleData "gefg_cas02.gat",17,0;
+ SetCastleData "gefg_cas02.gat",18,0;
+ SetCastleData "gefg_cas02.gat",19,0;
+ SetCastleData "gefg_cas02.gat",20,0;
+ SetCastleData "gefg_cas02.gat",21,0;
+ SetCastleData "gefg_cas02.gat",22,0;
+ SetCastleData "gefg_cas02.gat",23,0;
+ SetCastleData "gefg_cas02.gat",24,0;
+ SetCastleData "gefg_cas02.gat",25,0;
+ Announce "[" + GetGuildName(@GIDg2) + "] has surrendered Agit [" + GetCastleName("gefg_cas02.gat") + "]",0;
+ MapRespawnGuildID "gefg_cas02.gat",GetCastleData("gefg_cas02.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Esmark ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/gefg_cas03.txt b/npc/guild/old/gefg_cas03.txt
index 4c8e46b47..7dbd1e5c6 100644
--- a/npc/guild/old/gefg_cas03.txt
+++ b/npc/guild/old/gefg_cas03.txt
@@ -1,668 +1,668 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas03 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-gefg_cas03.gat,122,220,6 script Isinlife#g3-8::IsinlifeNW 722,{
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (@GIDg3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- break;
-}
-
-gefg_cas03.gat,122,229,6 duplicate(IsinlifeNW) Isinlife#g3-8 722
-gefg_cas03.gat,91,257,7 duplicate(IsinlifeNW) Isinlife#g3-9 722
-gefg_cas03.gat,52,276,7 duplicate(IsinlifeNW) Isinlife#g3-10 722
-gefg_cas03.gat,56,164,4 duplicate(IsinlifeNW) Isinlife#g3-11 722
-gefg_cas03.gat,65,164,4 duplicate(IsinlifeNW) Isinlife#g3-12 722
-gefg_cas03.gat,37,214,1 duplicate(IsinlifeNW) Isinlife#g3-13 722
-gefg_cas03.gat,34,208,1 duplicate(IsinlifeNW) Isinlife#g3-14 722
-
-//================================================
-// Kafra Service
-//================================================
-gefg_cas03.gat,116,89,5 script Kafra Service#gef3 117,{
- cutin "kafra_01",2;
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (getcharid(2) == @GIDg3) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg3) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDg3) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "geffen.gat",120,39;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("gefg_cas03.gat",9) == 1) break;
- disablenpc "Kafra Service#gef3";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-gefg_cas03.gat,221,43,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (getcharid(2) != @GIDg3) goto L1n;
- warp "gld_dun04.gat",268,251;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-gefg_cas03.gat,106,23,5 script Jyang 55,{
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (@GIDg3 == 0) goto LStart;
- if (getcharid(2) != @GIDg3) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDg3)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Jyang ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDg3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg3) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Jyang ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Jyang ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDg3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Jyang ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDg3) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Jyang ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("gefg_cas03.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("gefg_cas03.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("gefg_cas03.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("gefg_cas03.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("gefg_cas03.gat",4);
- set @Economy,GetCastleData("gefg_cas03.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Jyang ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Jyang ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Jyang ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas03.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas03.gat",2,@Economy+1;
- mes "[ Jyang ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Jyang ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Jyang ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas03.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas03.gat",2,@Economy+1;
- mes "[ Jyang ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Jyang ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Jyang ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("gefg_cas03.gat",5);
- set @Defence,GetCastleData("gefg_cas03.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Jyang ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Jyang ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Jyang ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas03.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas03.gat",3,@Defence+1;
- mes "[ Jyang ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Jyang ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Jyang ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas03.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas03.gat",3,@Defence+1;
- mes "[ Jyang ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Jyang ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Jyang ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("gefg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Jyang ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("gefg_cas03.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("gefg_cas03.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("gefg_cas03.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("gefg_cas03.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("gefg_cas03.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("gefg_cas03.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("gefg_cas03.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("gefg_cas03.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Jyang ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Jyang ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "gefg_cas03.gat",@GDnum,1;
- SetCastleData "gefg_cas03.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",7;
- mes "[ Jyang ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Jyang ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Jyang ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Jyang ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("gefg_cas03.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Jyang ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Jyang ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Jyang ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#gef3";
- SetCastleData "gefg_cas03.gat",9,1;
- mes "[ Jyang ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Jyang ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Jyang ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Jyang ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#gef3";
- SetCastleData "gefg_cas03.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Jyang ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Jyang ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Jyang ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Jyang ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "gefg_cas03",270,290;
- L6_1:
- mes "[ Jyang ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Jyang ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Jyang ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Jyang ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "gefg_cas03.gat",1,0;
- SetCastleData "gefg_cas03.gat",2,0;
- SetCastleData "gefg_cas03.gat",3,0;
- SetCastleData "gefg_cas03.gat",4,0;
- SetCastleData "gefg_cas03.gat",5,0;
- SetCastleData "gefg_cas03.gat",6,0;
- SetCastleData "gefg_cas03.gat",7,0;
- SetCastleData "gefg_cas03.gat",8,0;
- SetCastleData "gefg_cas03.gat",9,0;
- SetCastleData "gefg_cas03.gat",10,0;
- SetCastleData "gefg_cas03.gat",11,0;
- SetCastleData "gefg_cas03.gat",12,0;
- SetCastleData "gefg_cas03.gat",13,0;
- SetCastleData "gefg_cas03.gat",14,0;
- SetCastleData "gefg_cas03.gat",15,0;
- SetCastleData "gefg_cas03.gat",16,0;
- SetCastleData "gefg_cas03.gat",17,0;
- SetCastleData "gefg_cas03.gat",18,0;
- SetCastleData "gefg_cas03.gat",19,0;
- SetCastleData "gefg_cas03.gat",20,0;
- SetCastleData "gefg_cas03.gat",21,0;
- SetCastleData "gefg_cas03.gat",22,0;
- SetCastleData "gefg_cas03.gat",23,0;
- SetCastleData "gefg_cas03.gat",24,0;
- SetCastleData "gefg_cas03.gat",25,0;
- Announce "[" + GetGuildName(@GIDg3) + "] has surrendered Agit [" + GetCastleName("gefg_cas03.gat") + "]",0;
- MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),7;
- break;
- L7_2:
- mes "[ Jyang ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas03 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+gefg_cas03.gat,122,220,6 script Isinlife#g3-8::IsinlifeNW 722,{
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (@GIDg3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ break;
+}
+
+gefg_cas03.gat,122,229,6 duplicate(IsinlifeNW) Isinlife#g3-8 722
+gefg_cas03.gat,91,257,7 duplicate(IsinlifeNW) Isinlife#g3-9 722
+gefg_cas03.gat,52,276,7 duplicate(IsinlifeNW) Isinlife#g3-10 722
+gefg_cas03.gat,56,164,4 duplicate(IsinlifeNW) Isinlife#g3-11 722
+gefg_cas03.gat,65,164,4 duplicate(IsinlifeNW) Isinlife#g3-12 722
+gefg_cas03.gat,37,214,1 duplicate(IsinlifeNW) Isinlife#g3-13 722
+gefg_cas03.gat,34,208,1 duplicate(IsinlifeNW) Isinlife#g3-14 722
+
+//================================================
+// Kafra Service
+//================================================
+gefg_cas03.gat,116,89,5 script Kafra Service#gef3 117,{
+ cutin "kafra_01",2;
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (getcharid(2) == @GIDg3) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg3) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDg3) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "geffen.gat",120,39;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("gefg_cas03.gat",9) == 1) break;
+ disablenpc "Kafra Service#gef3";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+gefg_cas03.gat,221,43,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (getcharid(2) != @GIDg3) goto L1n;
+ warp "gld_dun04.gat",268,251;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+gefg_cas03.gat,106,23,5 script Jyang 55,{
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (@GIDg3 == 0) goto LStart;
+ if (getcharid(2) != @GIDg3) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDg3)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Jyang ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDg3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg3) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Jyang ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Jyang ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDg3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Jyang ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDg3) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Jyang ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("gefg_cas03.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("gefg_cas03.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("gefg_cas03.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("gefg_cas03.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("gefg_cas03.gat",4);
+ set @Economy,GetCastleData("gefg_cas03.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Jyang ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Jyang ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Jyang ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas03.gat",2,@Economy+1;
+ mes "[ Jyang ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Jyang ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Jyang ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas03.gat",2,@Economy+1;
+ mes "[ Jyang ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Jyang ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Jyang ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("gefg_cas03.gat",5);
+ set @Defence,GetCastleData("gefg_cas03.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Jyang ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Jyang ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Jyang ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas03.gat",3,@Defence+1;
+ mes "[ Jyang ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Jyang ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Jyang ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas03.gat",3,@Defence+1;
+ mes "[ Jyang ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Jyang ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Jyang ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("gefg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Jyang ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("gefg_cas03.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("gefg_cas03.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("gefg_cas03.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("gefg_cas03.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("gefg_cas03.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("gefg_cas03.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("gefg_cas03.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("gefg_cas03.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Jyang ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Jyang ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "gefg_cas03.gat",@GDnum,1;
+ SetCastleData "gefg_cas03.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",7;
+ mes "[ Jyang ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Jyang ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Jyang ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Jyang ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("gefg_cas03.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Jyang ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Jyang ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Jyang ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#gef3";
+ SetCastleData "gefg_cas03.gat",9,1;
+ mes "[ Jyang ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Jyang ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Jyang ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Jyang ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#gef3";
+ SetCastleData "gefg_cas03.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Jyang ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Jyang ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Jyang ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Jyang ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "gefg_cas03",270,290;
+ L6_1:
+ mes "[ Jyang ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Jyang ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Jyang ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Jyang ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "gefg_cas03.gat",1,0;
+ SetCastleData "gefg_cas03.gat",2,0;
+ SetCastleData "gefg_cas03.gat",3,0;
+ SetCastleData "gefg_cas03.gat",4,0;
+ SetCastleData "gefg_cas03.gat",5,0;
+ SetCastleData "gefg_cas03.gat",6,0;
+ SetCastleData "gefg_cas03.gat",7,0;
+ SetCastleData "gefg_cas03.gat",8,0;
+ SetCastleData "gefg_cas03.gat",9,0;
+ SetCastleData "gefg_cas03.gat",10,0;
+ SetCastleData "gefg_cas03.gat",11,0;
+ SetCastleData "gefg_cas03.gat",12,0;
+ SetCastleData "gefg_cas03.gat",13,0;
+ SetCastleData "gefg_cas03.gat",14,0;
+ SetCastleData "gefg_cas03.gat",15,0;
+ SetCastleData "gefg_cas03.gat",16,0;
+ SetCastleData "gefg_cas03.gat",17,0;
+ SetCastleData "gefg_cas03.gat",18,0;
+ SetCastleData "gefg_cas03.gat",19,0;
+ SetCastleData "gefg_cas03.gat",20,0;
+ SetCastleData "gefg_cas03.gat",21,0;
+ SetCastleData "gefg_cas03.gat",22,0;
+ SetCastleData "gefg_cas03.gat",23,0;
+ SetCastleData "gefg_cas03.gat",24,0;
+ SetCastleData "gefg_cas03.gat",25,0;
+ Announce "[" + GetGuildName(@GIDg3) + "] has surrendered Agit [" + GetCastleName("gefg_cas03.gat") + "]",0;
+ MapRespawnGuildID "gefg_cas03.gat",GetCastleData("gefg_cas03.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Jyang ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/gefg_cas04.txt b/npc/guild/old/gefg_cas04.txt
index 88b8649e3..43f5509d7 100644
--- a/npc/guild/old/gefg_cas04.txt
+++ b/npc/guild/old/gefg_cas04.txt
@@ -1,668 +1,668 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas04 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-gefg_cas04.gat,24,157,4 script Berigel#g4-4::BerigelNW 722,{
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (@GIDg4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- break;
-}
-
-gefg_cas04.gat,35,158,4 duplicate(BerigelNW) Berigel#g4-5 722
-gefg_cas04.gat,44,184,4 duplicate(BerigelNW) Berigel#g4-6 722
-gefg_cas04.gat,51,184,4 duplicate(BerigelNW) Berigel#g4-7 722
-gefg_cas04.gat,39,212,7 duplicate(BerigelNW) Berigel#g4-8 722
-gefg_cas04.gat,29,212,1 duplicate(BerigelNW) Berigel#g4-9 722
-gefg_cas04.gat,24,73,1 duplicate(BerigelNW) Berigel#g4-10 722
-gefg_cas04.gat,35,73,4 duplicate(BerigelNW) Berigel#g4-11 722
-
-//================================================
-// Kafra Service
-//================================================
-gefg_cas04.gat,59,70,3 script Kafra Service#gef4 117,{
- cutin "kafra_01",2;
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (getcharid(2) == @GIDg4) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg4) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDg4) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "geffen.gat",120,39;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("gefg_cas04.gat",9) == 1) break;
- disablenpc "Kafra Service#gef4";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-gefg_cas04.gat,58,75,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (getcharid(2) != @GIDg4) goto L1n;
- warp "gld_dun04.gat",268,108;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-gefg_cas04.gat,73,46,5 script Kelbany 55,{
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (@GIDg4 == 0) goto LStart;
- if (getcharid(2) != @GIDg4) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDg4)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Kelbany ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDg4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg4) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Kelbany ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Kelbany ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDg4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Kelbany ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDg4) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Kelbany ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("gefg_cas04.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("gefg_cas04.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("gefg_cas04.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("gefg_cas04.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("gefg_cas04.gat",4);
- set @Economy,GetCastleData("gefg_cas04.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Kelbany ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Kelbany ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Kelbany ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas04.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas04.gat",2,@Economy+1;
- mes "[ Kelbany ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Kelbany ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Kelbany ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas04.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas04.gat",2,@Economy+1;
- mes "[ Kelbany ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Kelbany ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Kelbany ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("gefg_cas04.gat",5);
- set @Defence,GetCastleData("gefg_cas04.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Kelbany ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Kelbany ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Kelbany ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas04.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas04.gat",3,@Defence+1;
- mes "[ Kelbany ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Kelbany ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Kelbany ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas04.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas04.gat",3,@Defence+1;
- mes "[ Kelbany ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Kelbany ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Kelbany ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("gefg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Kelbany ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("gefg_cas04.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("gefg_cas04.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("gefg_cas04.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("gefg_cas04.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("gefg_cas04.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("gefg_cas04.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("gefg_cas04.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("gefg_cas04.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Kelbany ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Kelbany ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "gefg_cas04.gat",@GDnum,1;
- SetCastleData "gefg_cas04.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",7;
- mes "[ Kelbany ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Kelbany ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Kelbany ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Kelbany ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("gefg_cas04.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Kelbany ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Kelbany ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Kelbany ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#gef4";
- SetCastleData "gefg_cas04.gat",9,1;
- mes "[ Kelbany ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Kelbany ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Kelbany ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Kelbany ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#gef4";
- SetCastleData "gefg_cas04.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Kelbany ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Kelbany ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Kelbany ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Kelbany ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "gefg_cas04",116,118;
- L6_1:
- mes "[ Kelbany ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Kelbany ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Kelbany ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Kelbany ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "gefg_cas04.gat",1,0;
- SetCastleData "gefg_cas04.gat",2,0;
- SetCastleData "gefg_cas04.gat",3,0;
- SetCastleData "gefg_cas04.gat",4,0;
- SetCastleData "gefg_cas04.gat",5,0;
- SetCastleData "gefg_cas04.gat",6,0;
- SetCastleData "gefg_cas04.gat",7,0;
- SetCastleData "gefg_cas04.gat",8,0;
- SetCastleData "gefg_cas04.gat",9,0;
- SetCastleData "gefg_cas04.gat",10,0;
- SetCastleData "gefg_cas04.gat",11,0;
- SetCastleData "gefg_cas04.gat",12,0;
- SetCastleData "gefg_cas04.gat",13,0;
- SetCastleData "gefg_cas04.gat",14,0;
- SetCastleData "gefg_cas04.gat",15,0;
- SetCastleData "gefg_cas04.gat",16,0;
- SetCastleData "gefg_cas04.gat",17,0;
- SetCastleData "gefg_cas04.gat",18,0;
- SetCastleData "gefg_cas04.gat",19,0;
- SetCastleData "gefg_cas04.gat",20,0;
- SetCastleData "gefg_cas04.gat",21,0;
- SetCastleData "gefg_cas04.gat",22,0;
- SetCastleData "gefg_cas04.gat",23,0;
- SetCastleData "gefg_cas04.gat",24,0;
- SetCastleData "gefg_cas04.gat",25,0;
- Announce "[" + GetGuildName(@GIDg4) + "] has surrendered Agit [" + GetCastleName("gefg_cas04.gat") + "]",0;
- MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),7;
- break;
- L7_2:
- mes "[ Kelbany ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas04 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+gefg_cas04.gat,24,157,4 script Berigel#g4-4::BerigelNW 722,{
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (@GIDg4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ break;
+}
+
+gefg_cas04.gat,35,158,4 duplicate(BerigelNW) Berigel#g4-5 722
+gefg_cas04.gat,44,184,4 duplicate(BerigelNW) Berigel#g4-6 722
+gefg_cas04.gat,51,184,4 duplicate(BerigelNW) Berigel#g4-7 722
+gefg_cas04.gat,39,212,7 duplicate(BerigelNW) Berigel#g4-8 722
+gefg_cas04.gat,29,212,1 duplicate(BerigelNW) Berigel#g4-9 722
+gefg_cas04.gat,24,73,1 duplicate(BerigelNW) Berigel#g4-10 722
+gefg_cas04.gat,35,73,4 duplicate(BerigelNW) Berigel#g4-11 722
+
+//================================================
+// Kafra Service
+//================================================
+gefg_cas04.gat,59,70,3 script Kafra Service#gef4 117,{
+ cutin "kafra_01",2;
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (getcharid(2) == @GIDg4) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg4) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDg4) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "geffen.gat",120,39;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("gefg_cas04.gat",9) == 1) break;
+ disablenpc "Kafra Service#gef4";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+gefg_cas04.gat,58,75,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (getcharid(2) != @GIDg4) goto L1n;
+ warp "gld_dun04.gat",268,108;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+gefg_cas04.gat,73,46,5 script Kelbany 55,{
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (@GIDg4 == 0) goto LStart;
+ if (getcharid(2) != @GIDg4) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDg4)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Kelbany ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDg4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg4) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Kelbany ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Kelbany ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDg4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Kelbany ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDg4) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Kelbany ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("gefg_cas04.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("gefg_cas04.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("gefg_cas04.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("gefg_cas04.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("gefg_cas04.gat",4);
+ set @Economy,GetCastleData("gefg_cas04.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Kelbany ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Kelbany ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Kelbany ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas04.gat",2,@Economy+1;
+ mes "[ Kelbany ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Kelbany ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Kelbany ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas04.gat",2,@Economy+1;
+ mes "[ Kelbany ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Kelbany ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Kelbany ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("gefg_cas04.gat",5);
+ set @Defence,GetCastleData("gefg_cas04.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Kelbany ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Kelbany ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Kelbany ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas04.gat",3,@Defence+1;
+ mes "[ Kelbany ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Kelbany ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Kelbany ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas04.gat",3,@Defence+1;
+ mes "[ Kelbany ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Kelbany ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Kelbany ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("gefg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Kelbany ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("gefg_cas04.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("gefg_cas04.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("gefg_cas04.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("gefg_cas04.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("gefg_cas04.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("gefg_cas04.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("gefg_cas04.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("gefg_cas04.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Kelbany ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Kelbany ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "gefg_cas04.gat",@GDnum,1;
+ SetCastleData "gefg_cas04.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",7;
+ mes "[ Kelbany ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Kelbany ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Kelbany ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Kelbany ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("gefg_cas04.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Kelbany ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Kelbany ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Kelbany ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#gef4";
+ SetCastleData "gefg_cas04.gat",9,1;
+ mes "[ Kelbany ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Kelbany ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Kelbany ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Kelbany ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#gef4";
+ SetCastleData "gefg_cas04.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Kelbany ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Kelbany ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Kelbany ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Kelbany ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "gefg_cas04",116,118;
+ L6_1:
+ mes "[ Kelbany ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Kelbany ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Kelbany ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Kelbany ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "gefg_cas04.gat",1,0;
+ SetCastleData "gefg_cas04.gat",2,0;
+ SetCastleData "gefg_cas04.gat",3,0;
+ SetCastleData "gefg_cas04.gat",4,0;
+ SetCastleData "gefg_cas04.gat",5,0;
+ SetCastleData "gefg_cas04.gat",6,0;
+ SetCastleData "gefg_cas04.gat",7,0;
+ SetCastleData "gefg_cas04.gat",8,0;
+ SetCastleData "gefg_cas04.gat",9,0;
+ SetCastleData "gefg_cas04.gat",10,0;
+ SetCastleData "gefg_cas04.gat",11,0;
+ SetCastleData "gefg_cas04.gat",12,0;
+ SetCastleData "gefg_cas04.gat",13,0;
+ SetCastleData "gefg_cas04.gat",14,0;
+ SetCastleData "gefg_cas04.gat",15,0;
+ SetCastleData "gefg_cas04.gat",16,0;
+ SetCastleData "gefg_cas04.gat",17,0;
+ SetCastleData "gefg_cas04.gat",18,0;
+ SetCastleData "gefg_cas04.gat",19,0;
+ SetCastleData "gefg_cas04.gat",20,0;
+ SetCastleData "gefg_cas04.gat",21,0;
+ SetCastleData "gefg_cas04.gat",22,0;
+ SetCastleData "gefg_cas04.gat",23,0;
+ SetCastleData "gefg_cas04.gat",24,0;
+ SetCastleData "gefg_cas04.gat",25,0;
+ Announce "[" + GetGuildName(@GIDg4) + "] has surrendered Agit [" + GetCastleName("gefg_cas04.gat") + "]",0;
+ MapRespawnGuildID "gefg_cas04.gat",GetCastleData("gefg_cas04.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Kelbany ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/gefg_cas05.txt b/npc/guild/old/gefg_cas05.txt
index 02e30ee78..c25621c39 100644
--- a/npc/guild/old/gefg_cas05.txt
+++ b/npc/guild/old/gefg_cas05.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas05 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-gefg_cas05.gat,77,185,7 script Melsedetsu#g5-6::MelsedetsuNW 722,{
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (@GIDg5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- break;
-}
-
-gefg_cas05.gat,92,181,0 duplicate(MelsedetsuNW) Melsedetsu#g5-7 722
-gefg_cas05.gat,83,158,1 duplicate(MelsedetsuNW) Melsedetsu#g5-8 722
-gefg_cas05.gat,62,144,7 duplicate(MelsedetsuNW) Melsedetsu#g5-9 722
-gefg_cas05.gat,62,66,4 duplicate(MelsedetsuNW) Melsedetsu#g5-10 722
-gefg_cas05.gat,69,66,4 duplicate(MelsedetsuNW) Melsedetsu#g5-11 722
-
-//================================================
-// Kafra Service
-//================================================
-gefg_cas05.gat,61,52,5 script Kafra Service#gef5 117,{
- cutin "kafra_01",2;
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (getcharid(2) == @GIDg5) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg5) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDg5) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "geffen.gat",120,39;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("gefg_cas05.gat",9) == 1) break;
- disablenpc "Kafra Service#gef5";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-gefg_cas05.gat,65,22,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (getcharid(2) != @GIDg5) goto L1n;
- warp "gld_dun04.gat",230,35;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-gefg_cas05.gat,70,52,5 script Beeor 55,{
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (@GIDg5 == 0) goto LStart;
- if (getcharid(2) != @GIDg5) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDg5)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Beeor ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDg5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg5) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Beeor ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Beeor ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDg5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Beeor ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDg5) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Beeor ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("gefg_cas05.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("gefg_cas05.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("gefg_cas05.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("gefg_cas05.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("gefg_cas05.gat",4);
- set @Economy,GetCastleData("gefg_cas05.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Beeor ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Beeor ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Beeor ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas05.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas05.gat",2,@Economy+1;
- mes "[ Beeor ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Beeor ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Beeor ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "gefg_cas05.gat",4,@TriggerE+1;
- SetCastleData "gefg_cas05.gat",2,@Economy+1;
- mes "[ Beeor ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Beeor ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Beeor ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("gefg_cas05.gat",5);
- set @Defence,GetCastleData("gefg_cas05.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Beeor ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Beeor ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Beeor ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas05.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas05.gat",3,@Defence+1;
- mes "[ Beeor ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Beeor ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Beeor ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "gefg_cas05.gat",5,@TriggerD+1;
- SetCastleData "gefg_cas05.gat",3,@Defence+1;
- mes "[ Beeor ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Beeor ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Beeor ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("gefg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Beeor ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("gefg_cas05.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("gefg_cas05.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("gefg_cas05.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("gefg_cas05.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("gefg_cas05.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("gefg_cas05.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("gefg_cas05.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("gefg_cas05.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Beeor ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Beeor ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "gefg_cas05.gat",@GDnum,1;
- SetCastleData "gefg_cas05.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",0;
- if(@GDnum==11) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",1;
- if(@GDnum==12) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",2;
- if(@GDnum==13) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",3;
- if(@GDnum==14) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",4;
- if(@GDnum==15) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",5;
- if(@GDnum==16) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",6;
- if(@GDnum==17) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",7;
- mes "[ Beeor ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Beeor ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Beeor ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Beeor ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("gefg_cas05.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Beeor ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Beeor ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Beeor ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#gef5";
- SetCastleData "gefg_cas05.gat",9,1;
- mes "[ Beeor ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Beeor ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Beeor ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Beeor ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#gef5";
- SetCastleData "gefg_cas05.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Beeor ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Beeor ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Beeor ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Beeor ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "gefg_cas05",144,110;
- L6_1:
- mes "[ Beeor ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Beeor ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Beeor ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Beeor ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "gefg_cas05.gat",1,0;
- SetCastleData "gefg_cas05.gat",2,0;
- SetCastleData "gefg_cas05.gat",3,0;
- SetCastleData "gefg_cas05.gat",4,0;
- SetCastleData "gefg_cas05.gat",5,0;
- SetCastleData "gefg_cas05.gat",6,0;
- SetCastleData "gefg_cas05.gat",7,0;
- SetCastleData "gefg_cas05.gat",8,0;
- SetCastleData "gefg_cas05.gat",9,0;
- SetCastleData "gefg_cas05.gat",10,0;
- SetCastleData "gefg_cas05.gat",11,0;
- SetCastleData "gefg_cas05.gat",12,0;
- SetCastleData "gefg_cas05.gat",13,0;
- SetCastleData "gefg_cas05.gat",14,0;
- SetCastleData "gefg_cas05.gat",15,0;
- SetCastleData "gefg_cas05.gat",16,0;
- SetCastleData "gefg_cas05.gat",17,0;
- SetCastleData "gefg_cas05.gat",18,0;
- SetCastleData "gefg_cas05.gat",19,0;
- SetCastleData "gefg_cas05.gat",20,0;
- SetCastleData "gefg_cas05.gat",21,0;
- SetCastleData "gefg_cas05.gat",22,0;
- SetCastleData "gefg_cas05.gat",23,0;
- SetCastleData "gefg_cas05.gat",24,0;
- SetCastleData "gefg_cas05.gat",25,0;
- Announce "[" + GetGuildName(@GIDg5) + "] has surrendered Agit [" + GetCastleName("gefg_cas05.gat") + "]",0;
- MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),7;
- break;
- L7_2:
- mes "[ Beeor ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas05 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in gefg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+gefg_cas05.gat,77,185,7 script Melsedetsu#g5-6::MelsedetsuNW 722,{
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (@GIDg5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ break;
+}
+
+gefg_cas05.gat,92,181,0 duplicate(MelsedetsuNW) Melsedetsu#g5-7 722
+gefg_cas05.gat,83,158,1 duplicate(MelsedetsuNW) Melsedetsu#g5-8 722
+gefg_cas05.gat,62,144,7 duplicate(MelsedetsuNW) Melsedetsu#g5-9 722
+gefg_cas05.gat,62,66,4 duplicate(MelsedetsuNW) Melsedetsu#g5-10 722
+gefg_cas05.gat,69,66,4 duplicate(MelsedetsuNW) Melsedetsu#g5-11 722
+
+//================================================
+// Kafra Service
+//================================================
+gefg_cas05.gat,61,52,5 script Kafra Service#gef5 117,{
+ cutin "kafra_01",2;
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (getcharid(2) == @GIDg5) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDg5) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDg5) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Geffen -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "geffen.gat",120,39;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("gefg_cas05.gat",9) == 1) break;
+ disablenpc "Kafra Service#gef5";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+gefg_cas05.gat,65,22,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (getcharid(2) != @GIDg5) goto L1n;
+ warp "gld_dun04.gat",230,35;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+gefg_cas05.gat,70,52,5 script Beeor 55,{
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (@GIDg5 == 0) goto LStart;
+ if (getcharid(2) != @GIDg5) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDg5)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Beeor ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDg5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDg5) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Beeor ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Beeor ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDg5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Beeor ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDg5) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Beeor ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("gefg_cas05.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("gefg_cas05.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("gefg_cas05.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("gefg_cas05.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("gefg_cas05.gat",4);
+ set @Economy,GetCastleData("gefg_cas05.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Beeor ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Beeor ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Beeor ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas05.gat",2,@Economy+1;
+ mes "[ Beeor ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Beeor ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Beeor ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "gefg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "gefg_cas05.gat",2,@Economy+1;
+ mes "[ Beeor ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Beeor ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Beeor ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("gefg_cas05.gat",5);
+ set @Defence,GetCastleData("gefg_cas05.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Beeor ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Beeor ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Beeor ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas05.gat",3,@Defence+1;
+ mes "[ Beeor ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Beeor ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Beeor ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "gefg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "gefg_cas05.gat",3,@Defence+1;
+ mes "[ Beeor ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Beeor ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Beeor ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("gefg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Beeor ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("gefg_cas05.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("gefg_cas05.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("gefg_cas05.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("gefg_cas05.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("gefg_cas05.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("gefg_cas05.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("gefg_cas05.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("gefg_cas05.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Beeor ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Beeor ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "gefg_cas05.gat",@GDnum,1;
+ SetCastleData "gefg_cas05.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",7;
+ mes "[ Beeor ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Beeor ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Beeor ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Beeor ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("gefg_cas05.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Beeor ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Beeor ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Beeor ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#gef5";
+ SetCastleData "gefg_cas05.gat",9,1;
+ mes "[ Beeor ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Beeor ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Beeor ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Beeor ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#gef5";
+ SetCastleData "gefg_cas05.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Beeor ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Beeor ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Beeor ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Beeor ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "gefg_cas05",144,110;
+ L6_1:
+ mes "[ Beeor ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Beeor ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Beeor ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Beeor ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "gefg_cas05.gat",1,0;
+ SetCastleData "gefg_cas05.gat",2,0;
+ SetCastleData "gefg_cas05.gat",3,0;
+ SetCastleData "gefg_cas05.gat",4,0;
+ SetCastleData "gefg_cas05.gat",5,0;
+ SetCastleData "gefg_cas05.gat",6,0;
+ SetCastleData "gefg_cas05.gat",7,0;
+ SetCastleData "gefg_cas05.gat",8,0;
+ SetCastleData "gefg_cas05.gat",9,0;
+ SetCastleData "gefg_cas05.gat",10,0;
+ SetCastleData "gefg_cas05.gat",11,0;
+ SetCastleData "gefg_cas05.gat",12,0;
+ SetCastleData "gefg_cas05.gat",13,0;
+ SetCastleData "gefg_cas05.gat",14,0;
+ SetCastleData "gefg_cas05.gat",15,0;
+ SetCastleData "gefg_cas05.gat",16,0;
+ SetCastleData "gefg_cas05.gat",17,0;
+ SetCastleData "gefg_cas05.gat",18,0;
+ SetCastleData "gefg_cas05.gat",19,0;
+ SetCastleData "gefg_cas05.gat",20,0;
+ SetCastleData "gefg_cas05.gat",21,0;
+ SetCastleData "gefg_cas05.gat",22,0;
+ SetCastleData "gefg_cas05.gat",23,0;
+ SetCastleData "gefg_cas05.gat",24,0;
+ SetCastleData "gefg_cas05.gat",25,0;
+ Announce "[" + GetGuildName(@GIDg5) + "] has surrendered Agit [" + GetCastleName("gefg_cas05.gat") + "]",0;
+ MapRespawnGuildID "gefg_cas05.gat",GetCastleData("gefg_cas05.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Beeor ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/gefg_flag.txt b/npc/guild/old/gefg_flag.txt
index 5e0158cca..30a391359 100644
--- a/npc/guild/old/gefg_flag.txt
+++ b/npc/guild/old/gefg_flag.txt
@@ -1,359 +1,359 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Geffen Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in prontera and prt_gld
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//============================================================
-
-//Geffen Castle 01 - Reprion
-
-geffen.gat,109,123,2 script Reprion#g1-1 722,{
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (@GIDg1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- break;
-}
-
-gef_fild13.gat,148,51,5 script Reprion#g1-2::ReprionW 722,{
- set @GIDg1,GetCastleData("gefg_cas01.gat",1);
- if (@GIDg1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDg1) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "gefg_cas01.gat",83,47;
- break;
-OnRecvCastleG01:
- FlagEmblem GetCastleData("gefg_cas01.gat",1);
- break;
-}
-
-gef_fild13.gat,155,54,5 duplicate(ReprionW) Reprion#g1-3 722
-gef_fild13.gat,212,79,6 duplicate(ReprionW) Reprion#g1-4 722
-gef_fild13.gat,211,71,6 duplicate(ReprionW) Reprion#g1-5 722
-
-
-//Geffen Castle 02 - Yolbriger
-
-geffen.gat,112,129,1 script Yolbriger#g2-1 722,{
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (@GIDg2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- break;
-}
-
-gef_fild13.gat,303,243,4 script Yolbriger#g2-2::YolbrigerW 722,{
- set @GIDg2,GetCastleData("gefg_cas02.gat",1);
- if (@GIDg2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDg2) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "gefg_cas02.gat",23,66;
- break;
-OnRecvCastleG02:
- FlagEmblem GetCastleData("gefg_cas02.gat",1);
- break;
-}
-
-gef_fild13.gat,312,243,4 duplicate(YolbrigerW) Yolbriger#g2-3 722
-gef_fild13.gat,290,243,4 duplicate(YolbrigerW) Yolbriger#g2-4 722
-gef_fild13.gat,324,243,4 duplicate(YolbrigerW) Yolbriger#g2-5 722
-
-//Geffen Castle 03 - Isinlife
-
-geffen.gat,120,132,8 script Isinlife#g3-1 722,{
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (@GIDg3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- break;
-}
-
-gef_fild13.gat,78,182,4 script Isinlife#g3-2::IsinlifeW 722,{
- set @GIDg3,GetCastleData("gefg_cas03.gat",1);
- if (@GIDg3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDg3) goto LStartg3;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg3:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "gefg_cas03.gat",116,89;
- break;
-OnRecvCastleG03:
- FlagEmblem GetCastleData("gefg_cas03.gat",1);
- break;
-}
-
-gef_fild13.gat,87,182,4 duplicate(IsinlifeW) Isinlife#g3-3 722
-gef_fild13.gat,73,295,7 duplicate(IsinlifeW) Isinlife#g3-4 722
-gef_fild13.gat,113,274,7 duplicate(IsinlifeW) Isinlife#g3-5 722
-gef_fild13.gat,144,235,6 duplicate(IsinlifeW) Isinlife#g3-6 722
-gef_fild13.gat,144,244,4 duplicate(IsinlifeW) Isinlife#g3-7 722
-
-//Geffen Castle 04 - Berigel
-
-geffen.gat,127,130,7 script Berigel#g4-1 722,{
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (@GIDg4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleg04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- break;
-}
-
-gef_fild13.gat,190,283,3 script Berigel#g4-2::BerigelW 722,{
- set @GIDg4,GetCastleData("gefg_cas04.gat",1);
- if (@GIDg4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDg4) goto LStartg4;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg4:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "gefg_cas04.gat",59,70;
- break;
-OnRecvCastleG04:
- FlagEmblem GetCastleData("gefg_cas04.gat",1);
- break;
-}
-
-gef_fild13.gat,199,274,3 duplicate(BerigelW) Berigel#g4-3 722
-
-//Geffen Castle 05 - Melsedetsu
-
-geffen.gat,131,123,6 script Melsedetsu#g5-1 722,{
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (@GIDg5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleg05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- break;
-}
-
-gef_fild13.gat,302,87,7 script Melsedetsu#g5-2::MelsedetsuW 722,{
- set @GIDg5,GetCastleData("gefg_cas05.gat",1);
- if (@GIDg5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDg5) goto LStartg5;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg5:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "gefg_cas05.gat",61,52;
- break;
-OnRecvCastleG05:
- FlagEmblem GetCastleData("gefg_cas05.gat",1);
- break;
-}
-
-gef_fild13.gat,313,83,0 duplicate(MelsedetsuW) Melsedetsu#g5-3 722
-gef_fild13.gat,252,51,2 duplicate(MelsedetsuW) Melsedetsu#g5-4 722
+//===== eAthena Script =======================================
+//= War of Emperium - Geffen Guild Flags
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in prontera and prt_gld
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//============================================================
+
+//Geffen Castle 01 - Reprion
+
+geffen.gat,109,123,2 script Reprion#g1-1 722,{
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (@GIDg1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ break;
+}
+
+gef_fild13.gat,148,51,5 script Reprion#g1-2::ReprionW 722,{
+ set @GIDg1,GetCastleData("gefg_cas01.gat",1);
+ if (@GIDg1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDg1) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "gefg_cas01.gat",83,47;
+ break;
+OnRecvCastleG01:
+ FlagEmblem GetCastleData("gefg_cas01.gat",1);
+ break;
+}
+
+gef_fild13.gat,155,54,5 duplicate(ReprionW) Reprion#g1-3 722
+gef_fild13.gat,212,79,6 duplicate(ReprionW) Reprion#g1-4 722
+gef_fild13.gat,211,71,6 duplicate(ReprionW) Reprion#g1-5 722
+
+
+//Geffen Castle 02 - Yolbriger
+
+geffen.gat,112,129,1 script Yolbriger#g2-1 722,{
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (@GIDg2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ break;
+}
+
+gef_fild13.gat,303,243,4 script Yolbriger#g2-2::YolbrigerW 722,{
+ set @GIDg2,GetCastleData("gefg_cas02.gat",1);
+ if (@GIDg2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDg2) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "gefg_cas02.gat",23,66;
+ break;
+OnRecvCastleG02:
+ FlagEmblem GetCastleData("gefg_cas02.gat",1);
+ break;
+}
+
+gef_fild13.gat,312,243,4 duplicate(YolbrigerW) Yolbriger#g2-3 722
+gef_fild13.gat,290,243,4 duplicate(YolbrigerW) Yolbriger#g2-4 722
+gef_fild13.gat,324,243,4 duplicate(YolbrigerW) Yolbriger#g2-5 722
+
+//Geffen Castle 03 - Isinlife
+
+geffen.gat,120,132,8 script Isinlife#g3-1 722,{
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (@GIDg3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ break;
+}
+
+gef_fild13.gat,78,182,4 script Isinlife#g3-2::IsinlifeW 722,{
+ set @GIDg3,GetCastleData("gefg_cas03.gat",1);
+ if (@GIDg3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDg3) goto LStartg3;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg3:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "gefg_cas03.gat",116,89;
+ break;
+OnRecvCastleG03:
+ FlagEmblem GetCastleData("gefg_cas03.gat",1);
+ break;
+}
+
+gef_fild13.gat,87,182,4 duplicate(IsinlifeW) Isinlife#g3-3 722
+gef_fild13.gat,73,295,7 duplicate(IsinlifeW) Isinlife#g3-4 722
+gef_fild13.gat,113,274,7 duplicate(IsinlifeW) Isinlife#g3-5 722
+gef_fild13.gat,144,235,6 duplicate(IsinlifeW) Isinlife#g3-6 722
+gef_fild13.gat,144,244,4 duplicate(IsinlifeW) Isinlife#g3-7 722
+
+//Geffen Castle 04 - Berigel
+
+geffen.gat,127,130,7 script Berigel#g4-1 722,{
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (@GIDg4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleg04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ break;
+}
+
+gef_fild13.gat,190,283,3 script Berigel#g4-2::BerigelW 722,{
+ set @GIDg4,GetCastleData("gefg_cas04.gat",1);
+ if (@GIDg4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDg4) goto LStartg4;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg4:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "gefg_cas04.gat",59,70;
+ break;
+OnRecvCastleG04:
+ FlagEmblem GetCastleData("gefg_cas04.gat",1);
+ break;
+}
+
+gef_fild13.gat,199,274,3 duplicate(BerigelW) Berigel#g4-3 722
+
+//Geffen Castle 05 - Melsedetsu
+
+geffen.gat,131,123,6 script Melsedetsu#g5-1 722,{
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (@GIDg5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleg05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ break;
+}
+
+gef_fild13.gat,302,87,7 script Melsedetsu#g5-2::MelsedetsuW 722,{
+ set @GIDg5,GetCastleData("gefg_cas05.gat",1);
+ if (@GIDg5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDg5) goto LStartg5;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Geffen ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Geffen,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDg5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDg5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDg5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg5:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "gefg_cas05.gat",61,52;
+ break;
+OnRecvCastleG05:
+ FlagEmblem GetCastleData("gefg_cas05.gat",1);
+ break;
+}
+
+gef_fild13.gat,313,83,0 duplicate(MelsedetsuW) Melsedetsu#g5-3 722
+gef_fild13.gat,252,51,2 duplicate(MelsedetsuW) Melsedetsu#g5-4 722
gef_fild13.gat,26,147,2 duplicate(MelsedetsuW) Melsedetsu#g5-5 722 \ No newline at end of file
diff --git a/npc/guild/old/gswitch.txt b/npc/guild/old/gswitch.txt
index b0b19aeb1..2922d6ef9 100644
--- a/npc/guild/old/gswitch.txt
+++ b/npc/guild/old/gswitch.txt
@@ -1,444 +1,444 @@
-//Payon City for Athena by Script&DB Team
-
-payg_cas01.gat,287,5,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "payg_cas01.gat",120,59;
-L2:
- close;
-}
-
-payg_cas01.gat,101,25,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun01.gat",186,165;
-L2:
-close;
-}
-
-payg_cas02.gat,141,141,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "payg_cas02.gat",22,261;
-L2:
- close;
-}
-
-payg_cas02.gat,278,247,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun01.gat.gat",54,165;
-L2:
-close;
-}
-
-
-payg_cas03.gat,155,165,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "payg_cas03.gat",50,261;
-L2:
- close;
-}
-
-payg_cas03.gat,38,42,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun01.gat",54,39;
-L2:
-close;
-}
-
-
-payg_cas04.gat,143,45,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "payg_cas04.gat",38,285;
-L2:
- close;
-}
-
-payg_cas04.gat,52,48,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun01.gat",186,39;
-L2:
-close;
-}
-
-
-payg_cas05.gat,153,129,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "payg_cas05.gat",277,250;
-L2:
- close;
-}
-
-payg_cas05.gat,248,14,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun01.gat",223,202;
-L2:
-close;
-}
-
-prtg_cas01.gat,15,208,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "prtg_cas01.gat",110,181;
-L2:
-close;
-}
-
-prtg_cas01.gat,94,200,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun03.gat",28,251;
-L2:
-close;
-}
-
-prtg_cas02.gat,206,228,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "prtg_cas02.gat",94,62;
-L2:
-close;
-}
-
-prtg_cas02.gat,84,72,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun03.gat",164,268;
-L2:
-close;
-}
-
-prtg_cas03.gat,192,134,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "prtg_cas03.gat",51,101;
-L2:
-close;
-}
-
-prtg_cas03.gat,5,70,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun03.gat",164,179;
-L2:
-close;
-}
-
-prtg_cas04.gat,274,160,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "prtg_cas04.gat",259,265;
-L2:
-close;
-}
-
-prtg_cas04.gat,56,283,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun03.gat",268,203;
-L2:
-close;
-}
-
-prtg_cas05.gat,280,177,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "prtg_cas05.gat",36,38;
-L2:
-close;
-}
-
-prtg_cas05.gat,212,95,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun03.gat",199,28;
-L2:
-close;
-}
-
-aldeg_cas01.gat,123,223,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "aldeg_cas01.gat",218,176;
-L2:
- close;
-}
-
-aldeg_cas01.gat,123,233,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun02.gat",32,122;
-L2:
-close;
-}
-
-aldeg_cas02.gat,139,234,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "aldeg_cas02.gat",78,75;
-L2:
- close;
-}
-
-aldeg_cas02.gat,194,236,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun02.gat",79,30;
-L2:
-close;
-}
-
-aldeg_cas03.gat,219,259,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "aldeg_cas03.gat",110,119;
-L2:
- close;
-}
-
-aldeg_cas03.gat,200,177,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun02.gat",165,38;
-L2:
-close;
-}
-
-aldeg_cas04.gat,79,15,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "aldeg_cas04.gat",67,117;
-L2:
- close;
-}
-
-aldeg_cas04.gat,76,64,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun02.gat",160,148;
-L2:
-close;
-}
-
-aldeg_cas05.gat,68,13,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
- warp "aldeg_cas05.gat",51,179;
-L2:
- close;
-}
-
-aldeg_cas05.gat,22,205,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun02.gat",103,169;
-L2:
-close;
-}
-
-gefg_cas01.gat,151,109,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gefg_cas01.gat",40,49;
-L2:
-close;
-}
-
-gefg_cas01.gat,78,84,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun04.gat",39,258;
-L2:
-close;
-}
-
-gefg_cas02.gat,137,113,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gefg_cas02.gat",12,67;
-L2:
-close;
-}
-
-gefg_cas02.gat,167,40,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun04.gat",125,270;
-L2:
-close;
-}
-
-gefg_cas03.gat,267,287,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gefg_cas03.gat",106,24;
-L2:
-close;
-}
-
-gefg_cas03.gat,221,43,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun04.gat",268,251;
-L2:
-close;
-}
-
-gefg_cas04.gat,113,115,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gefg_cas04.gat",73,47;
-L2:
-close;
-}
-
-gefg_cas04.gat,58,75,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun04.gat",268,108;
-L2:
-close;
-}
-
-gefg_cas05.gat,141,187,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gefg_cas05.gat",70,53;
-L2:
-close;
-}
-
-gefg_cas05.gat,62,22,0 script Switch 111,{
-mes " ";
-mes "There is a little switch here. Would you like to pull the switch down?";
-next;
-menu "Yes",L1,"No",L2;
-L1:
-warp "gld_dun04.gat",230,35;
-L2:
-close;
+//Payon City for Athena by Script&DB Team
+
+payg_cas01.gat,287,5,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "payg_cas01.gat",120,59;
+L2:
+ close;
+}
+
+payg_cas01.gat,101,25,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun01.gat",186,165;
+L2:
+close;
+}
+
+payg_cas02.gat,141,141,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "payg_cas02.gat",22,261;
+L2:
+ close;
+}
+
+payg_cas02.gat,278,247,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun01.gat.gat",54,165;
+L2:
+close;
+}
+
+
+payg_cas03.gat,155,165,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "payg_cas03.gat",50,261;
+L2:
+ close;
+}
+
+payg_cas03.gat,38,42,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun01.gat",54,39;
+L2:
+close;
+}
+
+
+payg_cas04.gat,143,45,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "payg_cas04.gat",38,285;
+L2:
+ close;
+}
+
+payg_cas04.gat,52,48,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun01.gat",186,39;
+L2:
+close;
+}
+
+
+payg_cas05.gat,153,129,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "payg_cas05.gat",277,250;
+L2:
+ close;
+}
+
+payg_cas05.gat,248,14,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun01.gat",223,202;
+L2:
+close;
+}
+
+prtg_cas01.gat,15,208,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "prtg_cas01.gat",110,181;
+L2:
+close;
+}
+
+prtg_cas01.gat,94,200,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun03.gat",28,251;
+L2:
+close;
+}
+
+prtg_cas02.gat,206,228,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "prtg_cas02.gat",94,62;
+L2:
+close;
+}
+
+prtg_cas02.gat,84,72,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun03.gat",164,268;
+L2:
+close;
+}
+
+prtg_cas03.gat,192,134,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "prtg_cas03.gat",51,101;
+L2:
+close;
+}
+
+prtg_cas03.gat,5,70,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun03.gat",164,179;
+L2:
+close;
+}
+
+prtg_cas04.gat,274,160,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "prtg_cas04.gat",259,265;
+L2:
+close;
+}
+
+prtg_cas04.gat,56,283,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun03.gat",268,203;
+L2:
+close;
+}
+
+prtg_cas05.gat,280,177,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "prtg_cas05.gat",36,38;
+L2:
+close;
+}
+
+prtg_cas05.gat,212,95,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun03.gat",199,28;
+L2:
+close;
+}
+
+aldeg_cas01.gat,123,223,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "aldeg_cas01.gat",218,176;
+L2:
+ close;
+}
+
+aldeg_cas01.gat,123,233,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun02.gat",32,122;
+L2:
+close;
+}
+
+aldeg_cas02.gat,139,234,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "aldeg_cas02.gat",78,75;
+L2:
+ close;
+}
+
+aldeg_cas02.gat,194,236,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun02.gat",79,30;
+L2:
+close;
+}
+
+aldeg_cas03.gat,219,259,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "aldeg_cas03.gat",110,119;
+L2:
+ close;
+}
+
+aldeg_cas03.gat,200,177,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun02.gat",165,38;
+L2:
+close;
+}
+
+aldeg_cas04.gat,79,15,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "aldeg_cas04.gat",67,117;
+L2:
+ close;
+}
+
+aldeg_cas04.gat,76,64,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun02.gat",160,148;
+L2:
+close;
+}
+
+aldeg_cas05.gat,68,13,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+ warp "aldeg_cas05.gat",51,179;
+L2:
+ close;
+}
+
+aldeg_cas05.gat,22,205,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun02.gat",103,169;
+L2:
+close;
+}
+
+gefg_cas01.gat,151,109,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gefg_cas01.gat",40,49;
+L2:
+close;
+}
+
+gefg_cas01.gat,78,84,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun04.gat",39,258;
+L2:
+close;
+}
+
+gefg_cas02.gat,137,113,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gefg_cas02.gat",12,67;
+L2:
+close;
+}
+
+gefg_cas02.gat,167,40,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun04.gat",125,270;
+L2:
+close;
+}
+
+gefg_cas03.gat,267,287,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gefg_cas03.gat",106,24;
+L2:
+close;
+}
+
+gefg_cas03.gat,221,43,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun04.gat",268,251;
+L2:
+close;
+}
+
+gefg_cas04.gat,113,115,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gefg_cas04.gat",73,47;
+L2:
+close;
+}
+
+gefg_cas04.gat,58,75,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun04.gat",268,108;
+L2:
+close;
+}
+
+gefg_cas05.gat,141,187,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gefg_cas05.gat",70,53;
+L2:
+close;
+}
+
+gefg_cas05.gat,62,22,0 script Switch 111,{
+mes " ";
+mes "There is a little switch here. Would you like to pull the switch down?";
+next;
+menu "Yes",L1,"No",L2;
+L1:
+warp "gld_dun04.gat",230,35;
+L2:
+close;
} \ No newline at end of file
diff --git a/npc/guild/old/guardian/aldeg_cas01_guardian.txt b/npc/guild/old/guardian/aldeg_cas01_guardian.txt
index 9a636a2e1..ec7e271d4 100644
--- a/npc/guild/old/guardian/aldeg_cas01_guardian.txt
+++ b/npc/guild/old/guardian/aldeg_cas01_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas01 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in aldeg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-aldeg_cas01.gat,216,24,0 script Guardian_A01 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas01.gat",10) <= 0) goto Guardian2;
- guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("aldeg_cas01.gat",11) <= 0) goto Guardian3;
- guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("aldeg_cas01.gat",12) <= 0) goto Guardian4;
- guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("aldeg_cas01.gat",13) <= 0) goto Guardian5;
- guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("aldeg_cas01.gat",14) <= 0) goto Guardian6;
- guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("aldeg_cas01.gat",15) <= 0) goto Guardian7;
- guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("aldeg_cas01.gat",16) <= 0) goto Guardian8;
- guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("aldeg_cas01.gat",17) <= 0) goto NoSpawn;
- guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "aldeg_cas01.gat","Guardian_A01::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas01.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas01 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in aldeg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+aldeg_cas01.gat,216,24,0 script Guardian_A01 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas01.gat",10) <= 0) goto Guardian2;
+ guardian "aldeg_cas01.gat",18,219,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("aldeg_cas01.gat",11) <= 0) goto Guardian3;
+ guardian "aldeg_cas01.gat",117,42,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("aldeg_cas01.gat",12) <= 0) goto Guardian4;
+ guardian "aldeg_cas01.gat",207,153,"Soldier Guardian",1287,1,"Guardian_A01::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("aldeg_cas01.gat",13) <= 0) goto Guardian5;
+ guardian "aldeg_cas01.gat",68,70,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("aldeg_cas01.gat",14) <= 0) goto Guardian6;
+ guardian "aldeg_cas01.gat",187,140,"Archer Guardian",1285,1,"Guardian_A01::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("aldeg_cas01.gat",15) <= 0) goto Guardian7;
+ guardian "aldeg_cas01.gat",62,204,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("aldeg_cas01.gat",16) <= 0) goto Guardian8;
+ guardian "aldeg_cas01.gat",113,100,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("aldeg_cas01.gat",17) <= 0) goto NoSpawn;
+ guardian "aldeg_cas01.gat",211,174,"Knight Guardian",1286,1,"Guardian_A01::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "aldeg_cas01.gat","Guardian_A01::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas01.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/aldeg_cas02_guardian.txt b/npc/guild/old/guardian/aldeg_cas02_guardian.txt
index 64671a472..149d6207d 100644
--- a/npc/guild/old/guardian/aldeg_cas02_guardian.txt
+++ b/npc/guild/old/guardian/aldeg_cas02_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas02 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in aldeg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-aldeg_cas02.gat,214,24,0 script Guardian_A02 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas02.gat",10) <= 0) goto Guardian2;
- guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("aldeg_cas02.gat",11) <= 0) goto Guardian3;
- guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("aldeg_cas02.gat",12) <= 0) goto Guardian4;
- guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("aldeg_cas02.gat",13) <= 0) goto Guardian5;
- guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("aldeg_cas02.gat",14) <= 0) goto Guardian6;
- guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("aldeg_cas02.gat",15) <= 0) goto Guardian7;
- guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("aldeg_cas02.gat",16) <= 0) goto Guardian8;
- guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("aldeg_cas02.gat",17) <= 0) goto NoSpawn;
- guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "aldeg_cas02.gat","Guardian_A02::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas02.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas02 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in aldeg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+aldeg_cas02.gat,214,24,0 script Guardian_A02 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas02.gat",10) <= 0) goto Guardian2;
+ guardian "aldeg_cas02.gat",22,186,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("aldeg_cas02.gat",11) <= 0) goto Guardian3;
+ guardian "aldeg_cas02.gat",88,31,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("aldeg_cas02.gat",12) <= 0) goto Guardian4;
+ guardian "aldeg_cas02.gat",207,176,"Soldier Guardian",1287,1,"Guardian_A02::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("aldeg_cas02.gat",13) <= 0) goto Guardian5;
+ guardian "aldeg_cas02.gat",50,201,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("aldeg_cas02.gat",14) <= 0) goto Guardian6;
+ guardian "aldeg_cas02.gat",197,146,"Archer Guardian",1285,1,"Guardian_A02::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("aldeg_cas02.gat",15) <= 0) goto Guardian7;
+ guardian "aldeg_cas02.gat",71,193,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("aldeg_cas02.gat",16) <= 0) goto Guardian8;
+ guardian "aldeg_cas02.gat",88,31,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("aldeg_cas02.gat",17) <= 0) goto NoSpawn;
+ guardian "aldeg_cas02.gat",219,148,"Knight Guardian",1286,1,"Guardian_A02::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "aldeg_cas02.gat","Guardian_A02::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas02.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/aldeg_cas03_guardian.txt b/npc/guild/old/guardian/aldeg_cas03_guardian.txt
index 30fd74dd7..eca9faa5e 100644
--- a/npc/guild/old/guardian/aldeg_cas03_guardian.txt
+++ b/npc/guild/old/guardian/aldeg_cas03_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas03 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in aldeg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-aldeg_cas03.gat,206,32,0 script Guardian_A03 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas03.gat",10) <= 0) goto Guardian2;
- guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("aldeg_cas03.gat",11) <= 0) goto Guardian3;
- guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("aldeg_cas03.gat",12) <= 0) goto Guardian4;
- guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("aldeg_cas03.gat",13) <= 0) goto Guardian5;
- guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("aldeg_cas03.gat",14) <= 0) goto Guardian6;
- guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("aldeg_cas03.gat",15) <= 0) goto Guardian7;
- guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("aldeg_cas03.gat",16) <= 0) goto Guardian8;
- guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("aldeg_cas03.gat",17) <= 0) goto NoSpawn;
- guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "aldeg_cas03.gat","Guardian_A03::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas03.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas03 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in aldeg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+aldeg_cas03.gat,206,32,0 script Guardian_A03 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas03.gat",10) <= 0) goto Guardian2;
+ guardian "aldeg_cas03.gat",57,216,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("aldeg_cas03.gat",11) <= 0) goto Guardian3;
+ guardian "aldeg_cas03.gat",80,108,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("aldeg_cas03.gat",12) <= 0) goto Guardian4;
+ guardian "aldeg_cas03.gat",199,183,"Soldier Guardian",1287,1,"Guardian_A03::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("aldeg_cas03.gat",13) <= 0) goto Guardian5;
+ guardian "aldeg_cas03.gat",98,267,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("aldeg_cas03.gat",14) <= 0) goto Guardian6;
+ guardian "aldeg_cas03.gat",91,88,"Archer Guardian",1285,1,"Guardian_A03::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("aldeg_cas03.gat",15) <= 0) goto Guardian7;
+ guardian "aldeg_cas03.gat",78,121,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("aldeg_cas03.gat",16) <= 0) goto Guardian8;
+ guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("aldeg_cas03.gat",17) <= 0) goto NoSpawn;
+ guardian "aldeg_cas03.gat",200,164,"Knight Guardian",1286,1,"Guardian_A03::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "aldeg_cas03.gat","Guardian_A03::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas03.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/aldeg_cas04_guardian.txt b/npc/guild/old/guardian/aldeg_cas04_guardian.txt
index 26b6ccd79..f34678ef9 100644
--- a/npc/guild/old/guardian/aldeg_cas04_guardian.txt
+++ b/npc/guild/old/guardian/aldeg_cas04_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas04 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in aldeg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-aldeg_cas04.gat,36,218,0 script Guardian_A04 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas04.gat",10) <= 0) goto Guardian2;
- guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("aldeg_cas04.gat",11) <= 0) goto Guardian3;
- guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("aldeg_cas04.gat",12) <= 0) goto Guardian4;
- guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("aldeg_cas04.gat",13) <= 0) goto Guardian5;
- guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("aldeg_cas04.gat",14) <= 0) goto Guardian6;
- guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("aldeg_cas04.gat",15) <= 0) goto Guardian7;
- guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("aldeg_cas04.gat",16) <= 0) goto Guardian8;
- guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("aldeg_cas04.gat",17) <= 0) goto NoSpawn;
- guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "aldeg_cas04.gat","Guardian_A04::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas04.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas04 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in aldeg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+aldeg_cas04.gat,36,218,0 script Guardian_A04 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas04.gat",10) <= 0) goto Guardian2;
+ guardian "aldeg_cas04.gat",181,33,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("aldeg_cas04.gat",11) <= 0) goto Guardian3;
+ guardian "aldeg_cas04.gat",50,68,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("aldeg_cas04.gat",12) <= 0) goto Guardian4;
+ guardian "aldeg_cas04.gat",50,119,"Soldier Guardian",1287,1,"Guardian_A04::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("aldeg_cas04.gat",13) <= 0) goto Guardian5;
+ guardian "aldeg_cas04.gat",169,49,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("aldeg_cas04.gat",14) <= 0) goto Guardian6;
+ guardian "aldeg_cas04.gat",133,196,"Archer Guardian",1285,1,"Guardian_A04::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("aldeg_cas04.gat",15) <= 0) goto Guardian7;
+ guardian "aldeg_cas04.gat",177,87,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("aldeg_cas04.gat",16) <= 0) goto Guardian8;
+ guardian "aldeg_cas04.gat",50,119,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("aldeg_cas04.gat",17) <= 0) goto NoSpawn;
+ guardian "aldeg_cas04.gat",133,196,"Knight Guardian",1286,1,"Guardian_A04::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "aldeg_cas04.gat","Guardian_A04::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas04.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/aldeg_cas05_guardian.txt b/npc/guild/old/guardian/aldeg_cas05_guardian.txt
index 9e8a400ec..53a62f565 100644
--- a/npc/guild/old/guardian/aldeg_cas05_guardian.txt
+++ b/npc/guild/old/guardian/aldeg_cas05_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas05 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in aldeg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-aldeg_cas05.gat,28,102,0 script Guardian_A05 -1,{
-OnAgitInit:
- if (GetCastleData("aldeg_cas05.gat",10) <= 0) goto Guardian2;
- guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("aldeg_cas05.gat",11) <= 0) goto Guardian3;
- guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("aldeg_cas05.gat",12) <= 0) goto Guardian4;
- guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("aldeg_cas05.gat",13) <= 0) goto Guardian5;
- guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("aldeg_cas05.gat",14) <= 0) goto Guardian6;
- guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("aldeg_cas05.gat",15) <= 0) goto Guardian7;
- guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("aldeg_cas05.gat",16) <= 0) goto Guardian8;
- guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("aldeg_cas05.gat",17) <= 0) goto NoSpawn;
- guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "aldeg_cas05.gat","Guardian_A05::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "aldeg_cas05.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas05 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in aldeg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+aldeg_cas05.gat,28,102,0 script Guardian_A05 -1,{
+OnAgitInit:
+ if (GetCastleData("aldeg_cas05.gat",10) <= 0) goto Guardian2;
+ guardian "aldeg_cas05.gat",157,192,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("aldeg_cas05.gat",11) <= 0) goto Guardian3;
+ guardian "aldeg_cas05.gat",194,46,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("aldeg_cas05.gat",12) <= 0) goto Guardian4;
+ guardian "aldeg_cas05.gat",146,214,"Soldier Guardian",1287,1,"Guardian_A05::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("aldeg_cas05.gat",13) <= 0) goto Guardian5;
+ guardian "aldeg_cas05.gat",223,95,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("aldeg_cas05.gat",14) <= 0) goto Guardian6;
+ guardian "aldeg_cas05.gat",131,223,"Archer Guardian",1285,1,"Guardian_A05::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("aldeg_cas05.gat",15) <= 0) goto Guardian7;
+ guardian "aldeg_cas05.gat",191,68,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("aldeg_cas05.gat",16) <= 0) goto Guardian8;
+ guardian "aldeg_cas05.gat",160,194,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("aldeg_cas05.gat",17) <= 0) goto NoSpawn;
+ guardian "aldeg_cas05.gat",49,225,"Knight Guardian",1286,1,"Guardian_A05::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "aldeg_cas05.gat","Guardian_A05::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "aldeg_cas05.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/gefg_cas01_guardian.txt b/npc/guild/old/guardian/gefg_cas01_guardian.txt
index 06996e4d5..269b73001 100644
--- a/npc/guild/old/guardian/gefg_cas01_guardian.txt
+++ b/npc/guild/old/guardian/gefg_cas01_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas01 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in gefg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-gefg_cas01.gat,198,182,0 script Guardian_B01 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas01.gat",10) <= 0) goto Guardian2;
- guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("gefg_cas01.gat",11) <= 0) goto Guardian3;
- guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("gefg_cas01.gat",12) <= 0) goto Guardian4;
- guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("gefg_cas01.gat",13) <= 0) goto Guardian5;
- guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("gefg_cas01.gat",14) <= 0) goto Guardian6;
- guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("gefg_cas01.gat",15) <= 0) goto Guardian7;
- guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("gefg_cas01.gat",16) <= 0) goto Guardian8;
- guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("gefg_cas01.gat",17) <= 0) goto NoSpawn;
- guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "gefg_cas01.gat","Guardian_B01::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas01.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas01 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in gefg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+gefg_cas01.gat,198,182,0 script Guardian_B01 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas01.gat",10) <= 0) goto Guardian2;
+ guardian "gefg_cas01.gat",30,178,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("gefg_cas01.gat",11) <= 0) goto Guardian3;
+ guardian "gefg_cas01.gat",64,180,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("gefg_cas01.gat",12) <= 0) goto Guardian4;
+ guardian "gefg_cas01.gat",61,25,"Soldier Guardian",1287,1,"Guardian_B01::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("gefg_cas01.gat",13) <= 0) goto Guardian5;
+ guardian "gefg_cas01.gat",61,44,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("gefg_cas01.gat",14) <= 0) goto Guardian6;
+ guardian "gefg_cas01.gat",189,43,"Archer Guardian",1285,1,"Guardian_B01::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("gefg_cas01.gat",15) <= 0) goto Guardian7;
+ guardian "gefg_cas01.gat",51,192,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("gefg_cas01.gat",16) <= 0) goto Guardian8;
+ guardian "gefg_cas01.gat",49,67,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("gefg_cas01.gat",17) <= 0) goto NoSpawn;
+ guardian "gefg_cas01.gat",181,14,"Knight Guardian",1286,1,"Guardian_B01::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "gefg_cas01.gat","Guardian_B01::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas01.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/gefg_cas02_guardian.txt b/npc/guild/old/guardian/gefg_cas02_guardian.txt
index 4d50c0ce2..98d7770b7 100644
--- a/npc/guild/old/guardian/gefg_cas02_guardian.txt
+++ b/npc/guild/old/guardian/gefg_cas02_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas02 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in gefg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-gefg_cas02.gat,176,178,0 script Guardian_B02 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas02.gat",10) <= 0) goto Guardian2;
- guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("gefg_cas02.gat",11) <= 0) goto Guardian3;
- guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("gefg_cas02.gat",12) <= 0) goto Guardian4;
- guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("gefg_cas02.gat",13) <= 0) goto Guardian5;
- guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_B02::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("gefg_cas02.gat",14) <= 0) goto Guardian6;
- guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_B02::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("gefg_cas02.gat",15) <= 0) goto Guardian7;
- guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("gefg_cas02.gat",16) <= 0) goto Guardian8;
- guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("gefg_cas02.gat",17) <= 0) goto NoSpawn;
- guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "gefg_cas02.gat","Guardian_B02::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas02.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas02 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in gefg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+gefg_cas02.gat,176,178,0 script Guardian_B02 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas02.gat",10) <= 0) goto Guardian2;
+ guardian "gefg_cas02.gat",22,135,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("gefg_cas02.gat",11) <= 0) goto Guardian3;
+ guardian "gefg_cas02.gat",33,40,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("gefg_cas02.gat",12) <= 0) goto Guardian4;
+ guardian "gefg_cas02.gat",158,11,"Soldier Guardian",1287,1,"Guardian_B02::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("gefg_cas02.gat",13) <= 0) goto Guardian5;
+ guardian "gefg_cas02.gat",64,140,"Archer Guardian",1285,1,"Guardian_B02::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("gefg_cas02.gat",14) <= 0) goto Guardian6;
+ guardian "gefg_cas02.gat",36,140,"Archer Guardian",1285,1,"Guardian_B02::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("gefg_cas02.gat",15) <= 0) goto Guardian7;
+ guardian "gefg_cas02.gat",166,45,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("gefg_cas02.gat",16) <= 0) goto Guardian8;
+ guardian "gefg_cas02.gat",10,39,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("gefg_cas02.gat",17) <= 0) goto NoSpawn;
+ guardian "gefg_cas02.gat",166,35,"Knight Guardian",1286,1,"Guardian_B02::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "gefg_cas02.gat","Guardian_B02::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas02.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/gefg_cas03_guardian.txt b/npc/guild/old/guardian/gefg_cas03_guardian.txt
index 882118a73..92079febd 100644
--- a/npc/guild/old/guardian/gefg_cas03_guardian.txt
+++ b/npc/guild/old/guardian/gefg_cas03_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas03 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in gefg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-gefg_cas03.gat,245,167,0 script Guardian_B03 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas03.gat",10) <= 0) goto Guardian2;
- guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("gefg_cas03.gat",11) <= 0) goto Guardian3;
- guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("gefg_cas03.gat",12) <= 0) goto Guardian4;
- guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("gefg_cas03.gat",13) <= 0) goto Guardian5;
- guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("gefg_cas03.gat",14) <= 0) goto Guardian6;
- guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("gefg_cas03.gat",15) <= 0) goto Guardian7;
- guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("gefg_cas03.gat",16) <= 0) goto Guardian8;
- guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("gefg_cas03.gat",17) <= 0) goto NoSpawn;
- guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "gefg_cas03.gat","Guardian_B03::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas03.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas03 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in gefg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+gefg_cas03.gat,245,167,0 script Guardian_B03 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas03.gat",10) <= 0) goto Guardian2;
+ guardian "gefg_cas03.gat",101,53,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("gefg_cas03.gat",11) <= 0) goto Guardian3;
+ guardian "gefg_cas03.gat",158,40,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("gefg_cas03.gat",12) <= 0) goto Guardian4;
+ guardian "gefg_cas03.gat",158,67,"Soldier Guardian",1287,1,"Guardian_B03::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("gefg_cas03.gat",13) <= 0) goto Guardian5;
+ guardian "gefg_cas03.gat",229,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("gefg_cas03.gat",14) <= 0) goto Guardian6;
+ guardian "gefg_cas03.gat",248,53,"Archer Guardian",1285,1,"Guardian_B03::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("gefg_cas03.gat",15) <= 0) goto Guardian7;
+ guardian "gefg_cas03.gat",122,53,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("gefg_cas03.gat",16) <= 0) goto Guardian8;
+ guardian "gefg_cas03.gat",243,35,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("gefg_cas03.gat",17) <= 0) goto NoSpawn;
+ guardian "gefg_cas03.gat",234,33,"Knight Guardian",1286,1,"Guardian_B03::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "gefg_cas03.gat","Guardian_B03::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas03.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/gefg_cas04_guardian.txt b/npc/guild/old/guardian/gefg_cas04_guardian.txt
index fef453ee3..b61d54d69 100644
--- a/npc/guild/old/guardian/gefg_cas04_guardian.txt
+++ b/npc/guild/old/guardian/gefg_cas04_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas04 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in gefg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-gefg_cas04.gat,174,178,0 script Guardian_B04 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas04.gat",10) <= 0) goto Guardian2;
- guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("gefg_cas04.gat",11) <= 0) goto Guardian3;
- guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("gefg_cas04.gat",12) <= 0) goto Guardian4;
- guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("gefg_cas04.gat",13) <= 0) goto Guardian5;
- guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("gefg_cas04.gat",14) <= 0) goto Guardian6;
- guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("gefg_cas04.gat",15) <= 0) goto Guardian7;
- guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("gefg_cas04.gat",16) <= 0) goto Guardian8;
- guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("gefg_cas04.gat",17) <= 0) goto NoSpawn;
- guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "gefg_cas04.gat","Guardian_B04::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas04.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas04 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in gefg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+gefg_cas04.gat,174,178,0 script Guardian_B04 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas04.gat",10) <= 0) goto Guardian2;
+ guardian "gefg_cas04.gat",49,203,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("gefg_cas04.gat",11) <= 0) goto Guardian3;
+ guardian "gefg_cas04.gat",148,50,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("gefg_cas04.gat",12) <= 0) goto Guardian4;
+ guardian "gefg_cas04.gat",57,20,"Soldier Guardian",1287,1,"Guardian_B04::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("gefg_cas04.gat",13) <= 0) goto Guardian5;
+ guardian "gefg_cas04.gat",34,218,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("gefg_cas04.gat",14) <= 0) goto Guardian6;
+ guardian "gefg_cas04.gat",167,42,"Archer Guardian",1285,1,"Guardian_B04::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("gefg_cas04.gat",15) <= 0) goto Guardian7;
+ guardian "gefg_cas04.gat",18,52,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("gefg_cas04.gat",16) <= 0) goto Guardian8;
+ guardian "gefg_cas04.gat",50,48,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("gefg_cas04.gat",17) <= 0) goto NoSpawn;
+ guardian "gefg_cas04.gat",160,66,"Knight Guardian",1286,1,"Guardian_B04::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "gefg_cas04.gat","Guardian_B04::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas04.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/gefg_cas05_guardian.txt b/npc/guild/old/guardian/gefg_cas05_guardian.txt
index c3254cab5..c7949af86 100644
--- a/npc/guild/old/guardian/gefg_cas05_guardian.txt
+++ b/npc/guild/old/guardian/gefg_cas05_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas05 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in gefg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-gefg_cas05.gat,194,184,0 script Guardian_B05 -1,{
-OnAgitInit:
- if (GetCastleData("gefg_cas05.gat",10) <= 0) goto Guardian2;
- guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("gefg_cas05.gat",11) <= 0) goto Guardian3;
- guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("gefg_cas05.gat",12) <= 0) goto Guardian4;
- guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("gefg_cas05.gat",13) <= 0) goto Guardian5;
- guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("gefg_cas05.gat",14) <= 0) goto Guardian6;
- guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("gefg_cas05.gat",15) <= 0) goto Guardian7;
- guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("gefg_cas05.gat",16) <= 0) goto Guardian8;
- guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("gefg_cas05.gat",17) <= 0) goto NoSpawn;
- guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "gefg_cas05.gat","Guardian_B05::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "gefg_cas05.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas05 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in gefg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+gefg_cas05.gat,194,184,0 script Guardian_B05 -1,{
+OnAgitInit:
+ if (GetCastleData("gefg_cas05.gat",10) <= 0) goto Guardian2;
+ guardian "gefg_cas05.gat",54,149,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("gefg_cas05.gat",11) <= 0) goto Guardian3;
+ guardian "gefg_cas05.gat",80,31,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("gefg_cas05.gat",12) <= 0) goto Guardian4;
+ guardian "gefg_cas05.gat",52,32,"Soldier Guardian",1287,1,"Guardian_B05::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("gefg_cas05.gat",13) <= 0) goto Guardian5;
+ guardian "gefg_cas05.gat",77,149,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("gefg_cas05.gat",14) <= 0) goto Guardian6;
+ guardian "gefg_cas05.gat",65,18,"Archer Guardian",1285,1,"Guardian_B05::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("gefg_cas05.gat",15) <= 0) goto Guardian7;
+ guardian "gefg_cas05.gat",66,54,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("gefg_cas05.gat",16) <= 0) goto Guardian8;
+ guardian "gefg_cas05.gat",187,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("gefg_cas05.gat",17) <= 0) goto NoSpawn;
+ guardian "gefg_cas05.gat",167,43,"Knight Guardian",1286,1,"Guardian_B05::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "gefg_cas05.gat","Guardian_B05::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "gefg_cas05.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/payg_cas01_guardian.txt b/npc/guild/old/guardian/payg_cas01_guardian.txt
index 8431608d9..7da9fd847 100644
--- a/npc/guild/old/guardian/payg_cas01_guardian.txt
+++ b/npc/guild/old/guardian/payg_cas01_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas01 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in payg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-payg_cas01.gat,139,139,0 script Guardian_C01 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas01.gat",10) <= 0) goto Guardian2;
- guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("payg_cas01.gat",11) <= 0) goto Guardian3;
- guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("payg_cas01.gat",12) <= 0) goto Guardian4;
- guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("payg_cas01.gat",13) <= 0) goto Guardian5;
- guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("payg_cas01.gat",14) <= 0) goto Guardian6;
- guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("payg_cas01.gat",15) <= 0) goto Guardian7;
- guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("payg_cas01.gat",16) <= 0) goto Guardian8;
- guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("payg_cas01.gat",17) <= 0) goto NoSpawn;
- guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "payg_cas01.gat","Guardian_C01::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas01.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas01 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in payg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+payg_cas01.gat,139,139,0 script Guardian_C01 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas01.gat",10) <= 0) goto Guardian2;
+ guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("payg_cas01.gat",11) <= 0) goto Guardian3;
+ guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("payg_cas01.gat",12) <= 0) goto Guardian4;
+ guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("payg_cas01.gat",13) <= 0) goto Guardian5;
+ guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("payg_cas01.gat",14) <= 0) goto Guardian6;
+ guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("payg_cas01.gat",15) <= 0) goto Guardian7;
+ guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("payg_cas01.gat",16) <= 0) goto Guardian8;
+ guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("payg_cas01.gat",17) <= 0) goto NoSpawn;
+ guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "payg_cas01.gat","Guardian_C01::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas01.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/payg_cas02_guardian.txt b/npc/guild/old/guardian/payg_cas02_guardian.txt
index ff2235c4f..02a9d7a8d 100644
--- a/npc/guild/old/guardian/payg_cas02_guardian.txt
+++ b/npc/guild/old/guardian/payg_cas02_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas02 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in payg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-payg_cas02.gat,39,25,0 script Guardian_C02 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas02.gat",10) <= 0) goto Guardian2;
- guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("payg_cas02.gat",11) <= 0) goto Guardian3;
- guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("payg_cas02.gat",12) <= 0) goto Guardian4;
- guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("payg_cas02.gat",13) <= 0) goto Guardian5;
- guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("payg_cas02.gat",14) <= 0) goto Guardian6;
- guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("payg_cas02.gat",15) <= 0) goto Guardian7;
- guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("payg_cas02.gat",16) <= 0) goto Guardian8;
- guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("payg_cas02.gat",17) <= 0) goto NoSpawn;
- guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "payg_cas02.gat","Guardian_C02::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas02.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas02 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in payg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+payg_cas02.gat,39,25,0 script Guardian_C02 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas02.gat",10) <= 0) goto Guardian2;
+ guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("payg_cas02.gat",11) <= 0) goto Guardian3;
+ guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("payg_cas02.gat",12) <= 0) goto Guardian4;
+ guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("payg_cas02.gat",13) <= 0) goto Guardian5;
+ guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("payg_cas02.gat",14) <= 0) goto Guardian6;
+ guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("payg_cas02.gat",15) <= 0) goto Guardian7;
+ guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("payg_cas02.gat",16) <= 0) goto Guardian8;
+ guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("payg_cas02.gat",17) <= 0) goto NoSpawn;
+ guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "payg_cas02.gat","Guardian_C02::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas02.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/payg_cas03_guardian.txt b/npc/guild/old/guardian/payg_cas03_guardian.txt
index 05150bd9e..4d1da422d 100644
--- a/npc/guild/old/guardian/payg_cas03_guardian.txt
+++ b/npc/guild/old/guardian/payg_cas03_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas03 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in payg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-payg_cas03.gat,269,265,0 script Guardian_C03 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas03.gat",10) <= 0) goto Guardian2;
- guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("payg_cas03.gat",11) <= 0) goto Guardian3;
- guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("payg_cas03.gat",12) <= 0) goto Guardian4;
- guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("payg_cas03.gat",13) <= 0) goto Guardian5;
- guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("payg_cas03.gat",14) <= 0) goto Guardian6;
- guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("payg_cas03.gat",15) <= 0) goto Guardian7;
- guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("payg_cas03.gat",16) <= 0) goto Guardian8;
- guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("payg_cas03.gat",17) <= 0) goto NoSpawn;
- guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "payg_cas03.gat","Guardian_C03::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas03.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas03 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in payg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+payg_cas03.gat,269,265,0 script Guardian_C03 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas03.gat",10) <= 0) goto Guardian2;
+ guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("payg_cas03.gat",11) <= 0) goto Guardian3;
+ guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("payg_cas03.gat",12) <= 0) goto Guardian4;
+ guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("payg_cas03.gat",13) <= 0) goto Guardian5;
+ guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("payg_cas03.gat",14) <= 0) goto Guardian6;
+ guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("payg_cas03.gat",15) <= 0) goto Guardian7;
+ guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("payg_cas03.gat",16) <= 0) goto Guardian8;
+ guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("payg_cas03.gat",17) <= 0) goto NoSpawn;
+ guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "payg_cas03.gat","Guardian_C03::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas03.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/payg_cas04_guardian.txt b/npc/guild/old/guardian/payg_cas04_guardian.txt
index fa303988e..6d34ac8dc 100644
--- a/npc/guild/old/guardian/payg_cas04_guardian.txt
+++ b/npc/guild/old/guardian/payg_cas04_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas04 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in payg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-payg_cas04.gat,271,29,0 script Guardian_C04 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas04.gat",10) <= 0) goto Guardian2;
- guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("payg_cas04.gat",11) <= 0) goto Guardian3;
- guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("payg_cas04.gat",12) <= 0) goto Guardian4;
- guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("payg_cas04.gat",13) <= 0) goto Guardian5;
- guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("payg_cas04.gat",14) <= 0) goto Guardian6;
- guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("payg_cas04.gat",15) <= 0) goto Guardian7;
- guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("payg_cas04.gat",16) <= 0) goto Guardian8;
- guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("payg_cas04.gat",17) <= 0) goto NoSpawn;
- guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "payg_cas04.gat","Guardian_C04::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas04.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas04 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in payg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+payg_cas04.gat,271,29,0 script Guardian_C04 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas04.gat",10) <= 0) goto Guardian2;
+ guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("payg_cas04.gat",11) <= 0) goto Guardian3;
+ guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("payg_cas04.gat",12) <= 0) goto Guardian4;
+ guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("payg_cas04.gat",13) <= 0) goto Guardian5;
+ guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("payg_cas04.gat",14) <= 0) goto Guardian6;
+ guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("payg_cas04.gat",15) <= 0) goto Guardian7;
+ guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("payg_cas04.gat",16) <= 0) goto Guardian8;
+ guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("payg_cas04.gat",17) <= 0) goto NoSpawn;
+ guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "payg_cas04.gat","Guardian_C04::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas04.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/payg_cas05_guardian.txt b/npc/guild/old/guardian/payg_cas05_guardian.txt
index 526de5d4f..b45431ead 100644
--- a/npc/guild/old/guardian/payg_cas05_guardian.txt
+++ b/npc/guild/old/guardian/payg_cas05_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas05 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in payg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-payg_cas05.gat,30,30,0 script Guardian_C05 -1,{
-OnAgitInit:
- if (GetCastleData("payg_cas05.gat",10) <= 0) goto Guardian2;
- guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("payg_cas05.gat",11) <= 0) goto Guardian3;
- guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("payg_cas05.gat",12) <= 0) goto Guardian4;
- guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("payg_cas05.gat",13) <= 0) goto Guardian5;
- guardian "payg_cas05.gat",46,273,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("payg_cas05.gat",14) <= 0) goto Guardian6;
- guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("payg_cas05.gat",15) <= 0) goto Guardian7;
- guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("payg_cas05.gat",16) <= 0) goto Guardian8;
- guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("payg_cas05.gat",17) <= 0) goto NoSpawn;
- guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "payg_cas05.gat","Guardian_C05::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "payg_cas05.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas05 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in payg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+payg_cas05.gat,30,30,0 script Guardian_C05 -1,{
+OnAgitInit:
+ if (GetCastleData("payg_cas05.gat",10) <= 0) goto Guardian2;
+ guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("payg_cas05.gat",11) <= 0) goto Guardian3;
+ guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("payg_cas05.gat",12) <= 0) goto Guardian4;
+ guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("payg_cas05.gat",13) <= 0) goto Guardian5;
+ guardian "payg_cas05.gat",46,273,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("payg_cas05.gat",14) <= 0) goto Guardian6;
+ guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("payg_cas05.gat",15) <= 0) goto Guardian7;
+ guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("payg_cas05.gat",16) <= 0) goto Guardian8;
+ guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("payg_cas05.gat",17) <= 0) goto NoSpawn;
+ guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "payg_cas05.gat","Guardian_C05::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "payg_cas05.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/prtg_cas01_guardian.txt b/npc/guild/old/guardian/prtg_cas01_guardian.txt
index d8ffaf243..9bcacacff 100644
--- a/npc/guild/old/guardian/prtg_cas01_guardian.txt
+++ b/npc/guild/old/guardian/prtg_cas01_guardian.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas01 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in prtg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-prtg_cas01.gat,197,197,0 script Guardian_D01 -1,{
-OnAgitInit:
- if (GetCastleData("prtg_cas01.gat",10) <= 0) goto Guardian2;
- guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("prtg_cas01.gat",11) <= 0) goto Guardian3;
- guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("prtg_cas01.gat",12) <= 0) goto Guardian4;
- guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("prtg_cas01.gat",13) <= 0) goto Guardian5;
- guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("prtg_cas01.gat",14) <= 0) goto Guardian6;
- guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("prtg_cas01.gat",15) <= 0) goto Guardian7;
- guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("prtg_cas01.gat",16) <= 0) goto Guardian8;
- guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("prtg_cas01.gat",17) <= 0) goto NoSpawn;
- guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",7;
- break;
-
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "prtg_cas01.gat","Guardian_D01::GuardianDied";
- break;
-
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas01.gat","A Guardian Has Fallen",17;
- break;
-
-OnAgitEnd:
- break;
-
-NoSpawn:
- break;
-
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas01 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in prtg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+prtg_cas01.gat,197,197,0 script Guardian_D01 -1,{
+OnAgitInit:
+ if (GetCastleData("prtg_cas01.gat",10) <= 0) goto Guardian2;
+ guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("prtg_cas01.gat",11) <= 0) goto Guardian3;
+ guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("prtg_cas01.gat",12) <= 0) goto Guardian4;
+ guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("prtg_cas01.gat",13) <= 0) goto Guardian5;
+ guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("prtg_cas01.gat",14) <= 0) goto Guardian6;
+ guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("prtg_cas01.gat",15) <= 0) goto Guardian7;
+ guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("prtg_cas01.gat",16) <= 0) goto Guardian8;
+ guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("prtg_cas01.gat",17) <= 0) goto NoSpawn;
+ guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",7;
+ break;
+
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "prtg_cas01.gat","Guardian_D01::GuardianDied";
+ break;
+
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas01.gat","A Guardian Has Fallen",17;
+ break;
+
+OnAgitEnd:
+ break;
+
+NoSpawn:
+ break;
+
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/prtg_cas02_guardian.txt b/npc/guild/old/guardian/prtg_cas02_guardian.txt
index 3858f1c64..e8e9a35d8 100644
--- a/npc/guild/old/guardian/prtg_cas02_guardian.txt
+++ b/npc/guild/old/guardian/prtg_cas02_guardian.txt
@@ -1,62 +1,62 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas02 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in prtg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-prtg_cas02.gat,158,174,0 script Guardian_D02 -1,{
-OnAgitStart:
- if (GetCastleData("prtg_cas02.gat",10) <= 0) goto Guardian2;
- guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("prtg_cas02.gat",11) <= 0) goto Guardian3;
- guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("prtg_cas02.gat",12) <= 0) goto Guardian4;
- guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("prtg_cas02.gat",13) <= 0) goto Guardian5;
- guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("prtg_cas02.gat",14) <= 0) goto Guardian6;
- guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("prtg_cas02.gat",15) <= 0) goto Guardian7;
- guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("prtg_cas02.gat",16) <= 0) goto Guardian8;
- guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("prtg_cas02.gat",17) <= 0) goto NoSpawn;
- guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",7;
- break;
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "prtg_cas02.gat","Guardian_D02::GuardianDied";
- break;
-GuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas02.gat","A Guardian Has Fallen",17;
- break;
-OnAgitEnd:
- break;
-NoSpawn:
- break;
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas02 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in prtg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+prtg_cas02.gat,158,174,0 script Guardian_D02 -1,{
+OnAgitStart:
+ if (GetCastleData("prtg_cas02.gat",10) <= 0) goto Guardian2;
+ guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("prtg_cas02.gat",11) <= 0) goto Guardian3;
+ guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("prtg_cas02.gat",12) <= 0) goto Guardian4;
+ guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("prtg_cas02.gat",13) <= 0) goto Guardian5;
+ guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("prtg_cas02.gat",14) <= 0) goto Guardian6;
+ guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("prtg_cas02.gat",15) <= 0) goto Guardian7;
+ guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("prtg_cas02.gat",16) <= 0) goto Guardian8;
+ guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("prtg_cas02.gat",17) <= 0) goto NoSpawn;
+ guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",7;
+ break;
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "prtg_cas02.gat","Guardian_D02::GuardianDied";
+ break;
+GuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas02.gat","A Guardian Has Fallen",17;
+ break;
+OnAgitEnd:
+ break;
+NoSpawn:
+ break;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/prtg_cas03_guardian.txt b/npc/guild/old/guardian/prtg_cas03_guardian.txt
index 1f5becb9e..35ad52fb8 100644
--- a/npc/guild/old/guardian/prtg_cas03_guardian.txt
+++ b/npc/guild/old/guardian/prtg_cas03_guardian.txt
@@ -1,62 +1,62 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas03 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in prtg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-prtg_cas03.gat,17,221,0 script Guardian_D03 -1,{
-OnAgitStart:
- if (GetCastleData("prtg_cas03.gat",10) <= 0) goto Guardian2;
- guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("prtg_cas03.gat",11) <= 0) goto Guardian3;
- guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("prtg_cas03.gat",12) <= 0) goto Guardian4;
- guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("prtg_cas03.gat",13) <= 0) goto Guardian5;
- guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("prtg_cas03.gat",14) <= 0) goto Guardian6;
- guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("prtg_cas03.gat",15) <= 0) goto Guardian7;
- guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("prtg_cas03.gat",16) <= 0) goto Guardian8;
- guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("prtg_cas03.gat",17) <= 0) goto NoSpawn;
- guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",7;
- break;
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "prtg_cas03.gat","Guardian_D03::OnGuardianDied";
- break;
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas03.gat","A Guardian Has Fallen",17;
- break;
-OnAgitEnd:
- break;
-NoSpawn:
- break;
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas03 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in prtg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+prtg_cas03.gat,17,221,0 script Guardian_D03 -1,{
+OnAgitStart:
+ if (GetCastleData("prtg_cas03.gat",10) <= 0) goto Guardian2;
+ guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("prtg_cas03.gat",11) <= 0) goto Guardian3;
+ guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("prtg_cas03.gat",12) <= 0) goto Guardian4;
+ guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("prtg_cas03.gat",13) <= 0) goto Guardian5;
+ guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("prtg_cas03.gat",14) <= 0) goto Guardian6;
+ guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("prtg_cas03.gat",15) <= 0) goto Guardian7;
+ guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("prtg_cas03.gat",16) <= 0) goto Guardian8;
+ guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("prtg_cas03.gat",17) <= 0) goto NoSpawn;
+ guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",7;
+ break;
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "prtg_cas03.gat","Guardian_D03::OnGuardianDied";
+ break;
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas03.gat","A Guardian Has Fallen",17;
+ break;
+OnAgitEnd:
+ break;
+NoSpawn:
+ break;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/prtg_cas04_guardian.txt b/npc/guild/old/guardian/prtg_cas04_guardian.txt
index 7a5d86062..ea410b7f8 100644
--- a/npc/guild/old/guardian/prtg_cas04_guardian.txt
+++ b/npc/guild/old/guardian/prtg_cas04_guardian.txt
@@ -1,62 +1,62 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas04 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in prtg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-prtg_cas04.gat,292,14,0 script Guardian_D04 -1,{
-OnAgitStart:
- if (GetCastleData("prtg_cas04.gat",10) <= 0) goto Guardian2;
- guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("prtg_cas04.gat",11) <= 0) goto Guardian3;
- guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("prtg_cas04.gat",12) <= 0) goto Guardian4;
- guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("prtg_cas04.gat",13) <= 0) goto Guardian5;
- guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("prtg_cas04.gat",14) <= 0) goto Guardian6;
- guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("prtg_cas04.gat",15) <= 0) goto Guardian7;
- guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("prtg_cas04.gat",16) <= 0) goto Guardian8;
- guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("prtg_cas04.gat",17) <= 0) goto NoSpawn;
- guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
- break;
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "prtg_cas04.gat","Guardian_D04::OnGuardianDied";
- break;
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas04.gat","A Guardian Has Fallen",17;
- break;
-OnAgitEnd:
- break;
-NoSpawn:
- break;
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas04 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in prtg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+prtg_cas04.gat,292,14,0 script Guardian_D04 -1,{
+OnAgitStart:
+ if (GetCastleData("prtg_cas04.gat",10) <= 0) goto Guardian2;
+ guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("prtg_cas04.gat",11) <= 0) goto Guardian3;
+ guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("prtg_cas04.gat",12) <= 0) goto Guardian4;
+ guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("prtg_cas04.gat",13) <= 0) goto Guardian5;
+ guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("prtg_cas04.gat",14) <= 0) goto Guardian6;
+ guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("prtg_cas04.gat",15) <= 0) goto Guardian7;
+ guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("prtg_cas04.gat",16) <= 0) goto Guardian8;
+ guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("prtg_cas04.gat",17) <= 0) goto NoSpawn;
+ guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
+ break;
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "prtg_cas04.gat","Guardian_D04::OnGuardianDied";
+ break;
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas04.gat","A Guardian Has Fallen",17;
+ break;
+OnAgitEnd:
+ break;
+NoSpawn:
+ break;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/guardian/prtg_cas05_guardian.txt b/npc/guild/old/guardian/prtg_cas05_guardian.txt
index 392623a11..ff3ff1992 100644
--- a/npc/guild/old/guardian/prtg_cas05_guardian.txt
+++ b/npc/guild/old/guardian/prtg_cas05_guardian.txt
@@ -1,62 +1,62 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas05 guardians script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guardians Spawn Script in prtg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by joedukk
-//= 1.2 by Akaru and Valaris
-//============================================================
-
-prtg_cas05.gat,266,266,0 script Guardian_D05 -1,{
-OnAgitStart:
- if (GetCastleData("prtg_cas05.gat",10) <= 0) goto Guardian2;
- guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",0;
- goto Guardian2;
-Guardian2:
- if (GetCastleData("prtg_cas05.gat",11) <= 0) goto Guardian3;
- guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",1;
- goto Guardian3;
-Guardian3:
- if (GetCastleData("prtg_cas05.gat",12) <= 0) goto Guardian4;
- guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",2;
- goto Guardian4;
-Guardian4:
- if (GetCastleData("prtg_cas05.gat",13) <= 0) goto Guardian5;
- guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_D05::OnGuardianDied",3;
- goto Guardian5;
-Guardian5:
- if (GetCastleData("prtg_cas05.gat",14) <= 0) goto Guardian6;
- guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_D05::OnGuardianDied",4;
- goto Guardian6;
-Guardian6:
- if (GetCastleData("prtg_cas05.gat",15) <= 0) goto Guardian7;
- guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",5;
- goto Guardian7;
-Guardian7:
- if (GetCastleData("prtg_cas05.gat",16) <= 0) goto Guardian8;
- guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",6;
- goto Guardian8;
-Guardian8:
- if (GetCastleData("prtg_cas05.gat",17) <= 0) goto NoSpawn;
- guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",7;
- break;
-OnAgitEliminate:
- //Kill all guardians on castle takeover
- //killmonster "prtg_cas05.gat","Guardian_D05::OnGuardianDied";
- break;
-OnGuardianDied:
- // Event when Guardian dies
- MapAnnounce "prtg_cas05.gat","A Guardian Has Fallen",17;
- break;
-OnAgitEnd:
- break;
-NoSpawn:
- break;
-}
-//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas05 guardians script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guardians Spawn Script in prtg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by joedukk
+//= 1.2 by Akaru and Valaris
+//============================================================
+
+prtg_cas05.gat,266,266,0 script Guardian_D05 -1,{
+OnAgitStart:
+ if (GetCastleData("prtg_cas05.gat",10) <= 0) goto Guardian2;
+ guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",0;
+ goto Guardian2;
+Guardian2:
+ if (GetCastleData("prtg_cas05.gat",11) <= 0) goto Guardian3;
+ guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",1;
+ goto Guardian3;
+Guardian3:
+ if (GetCastleData("prtg_cas05.gat",12) <= 0) goto Guardian4;
+ guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_D05::OnGuardianDied",2;
+ goto Guardian4;
+Guardian4:
+ if (GetCastleData("prtg_cas05.gat",13) <= 0) goto Guardian5;
+ guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_D05::OnGuardianDied",3;
+ goto Guardian5;
+Guardian5:
+ if (GetCastleData("prtg_cas05.gat",14) <= 0) goto Guardian6;
+ guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_D05::OnGuardianDied",4;
+ goto Guardian6;
+Guardian6:
+ if (GetCastleData("prtg_cas05.gat",15) <= 0) goto Guardian7;
+ guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",5;
+ goto Guardian7;
+Guardian7:
+ if (GetCastleData("prtg_cas05.gat",16) <= 0) goto Guardian8;
+ guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",6;
+ goto Guardian8;
+Guardian8:
+ if (GetCastleData("prtg_cas05.gat",17) <= 0) goto NoSpawn;
+ guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_D05::OnGuardianDied",7;
+ break;
+OnAgitEliminate:
+ //Kill all guardians on castle takeover
+ //killmonster "prtg_cas05.gat","Guardian_D05::OnGuardianDied";
+ break;
+OnGuardianDied:
+ // Event when Guardian dies
+ MapAnnounce "prtg_cas05.gat","A Guardian Has Fallen",17;
+ break;
+OnAgitEnd:
+ break;
+NoSpawn:
+ break;
+}
+//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/npc/guild/old/payg_cas01.txt b/npc/guild/old/payg_cas01.txt
index 16992f39d..7484a3d24 100644
--- a/npc/guild/old/payg_cas01.txt
+++ b/npc/guild/old/payg_cas01.txt
@@ -1,667 +1,667 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas01 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in payg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-payg_cas01.gat,238,67,4 script Mingting#f1-6::MingtingNW 722,{
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (@GIDf1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- break;
-}
-
-
-payg_cas01.gat,233,67,4 duplicate(MingtingNW) Mingting#f1-7 722
-payg_cas01.gat,221,123,4 duplicate(MingtingNW) Mingting#f1-8 722
-payg_cas01.gat,221,116,4 duplicate(MingtingNW) Mingting#f1-9 722
-payg_cas01.gat,206,108,4 duplicate(MingtingNW) Mingting#f1-10 722
-payg_cas01.gat,212,108,4 duplicate(MingtingNW) Mingting#f1-11 722
-
-//================================================
-// Kafra Service
-//================================================
-payg_cas01.gat,128,58,3 script Kafra Service#pay1 117,{
- cutin "kafra_01",2;
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (getcharid(2) == @GIDf1) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf1) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDf1) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "payon.gat",82,128;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("payg_cas01.gat",9) == 1) break;
- disablenpc "Kafra Service#pay1";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-payg_cas01.gat,101,25,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (getcharid(2) != @GIDf1) goto L1n;
- warp "gld_dun01.gat",186,165;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-payg_cas01.gat,120,58,4 script Grunday 55,{
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (@GIDf1 == 0) goto LStart;
- if (getcharid(2) != @GIDf1) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDf1)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Grunday ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDf1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf1) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Grunday ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Grunday ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDf1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Grunday ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDf1) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Grunday ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("payg_cas01.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("payg_cas01.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("payg_cas01.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("payg_cas01.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("payg_cas01.gat",4);
- set @Economy,GetCastleData("payg_cas01.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Grunday ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Grunday ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Grunday ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas01.gat",4,@TriggerE+1;
- SetCastleData "payg_cas01.gat",2,@Economy+1;
- mes "[ Grunday ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Grunday ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Grunday ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas01.gat",4,@TriggerE+1;
- SetCastleData "payg_cas01.gat",2,@Economy+1;
- mes "[ Grunday ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Grunday ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Grunday ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("payg_cas01.gat",5);
- set @Defence,GetCastleData("payg_cas01.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Grunday ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Grunday ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Grunday ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas01.gat",5,@TriggerD+1;
- SetCastleData "payg_cas01.gat",3,@Defence+1;
- mes "[ Grunday ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Grunday ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Grunday ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas01.gat",5,@TriggerD+1;
- SetCastleData "payg_cas01.gat",3,@Defence+1;
- mes "[ Grunday ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Grunday ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Grunday ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("payg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Grunday ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("payg_cas01.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("payg_cas01.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("payg_cas01.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("payg_cas01.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("payg_cas01.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("payg_cas01.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("payg_cas01.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("payg_cas01.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Grunday ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Grunday ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "payg_cas01.gat",@GDnum,1;
- SetCastleData "payg_cas01.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",7;
- mes "[ Grunday ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Grunday ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Grunday ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Grunday ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("payg_cas01.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Grunday ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Grunday ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Grunday ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#pay1";
- SetCastleData "payg_cas01.gat",9,1;
- mes "[ Grunday ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Grunday ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Grunday ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Grunday ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#pay1";
- SetCastleData "payg_cas01.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Grunday ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Grunday ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Grunday ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Grunday ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "payg_cas01",290,7;
- L6_1:
- mes "[ Grunday ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Grunday ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Grunday ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Grunday ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "payg_cas01.gat",1,0;
- SetCastleData "payg_cas01.gat",2,0;
- SetCastleData "payg_cas01.gat",3,0;
- SetCastleData "payg_cas01.gat",4,0;
- SetCastleData "payg_cas01.gat",5,0;
- SetCastleData "payg_cas01.gat",6,0;
- SetCastleData "payg_cas01.gat",7,0;
- SetCastleData "payg_cas01.gat",8,0;
- SetCastleData "payg_cas01.gat",9,0;
- SetCastleData "payg_cas01.gat",10,0;
- SetCastleData "payg_cas01.gat",11,0;
- SetCastleData "payg_cas01.gat",12,0;
- SetCastleData "payg_cas01.gat",13,0;
- SetCastleData "payg_cas01.gat",14,0;
- SetCastleData "payg_cas01.gat",15,0;
- SetCastleData "payg_cas01.gat",16,0;
- SetCastleData "payg_cas01.gat",17,0;
- SetCastleData "payg_cas01.gat",18,0;
- SetCastleData "payg_cas01.gat",19,0;
- SetCastleData "payg_cas01.gat",20,0;
- SetCastleData "payg_cas01.gat",21,0;
- SetCastleData "payg_cas01.gat",22,0;
- SetCastleData "payg_cas01.gat",23,0;
- SetCastleData "payg_cas01.gat",24,0;
- SetCastleData "payg_cas01.gat",25,0;
- Announce "[" + GetGuildName(@GIDf1) + "] has surrendered Agit [" + GetCastleName("payg_cas01.gat") + "]",0;
- MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),7;
- break;
- L7_2:
- mes "[ Grunday ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas01 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in payg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+payg_cas01.gat,238,67,4 script Mingting#f1-6::MingtingNW 722,{
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (@GIDf1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ break;
+}
+
+
+payg_cas01.gat,233,67,4 duplicate(MingtingNW) Mingting#f1-7 722
+payg_cas01.gat,221,123,4 duplicate(MingtingNW) Mingting#f1-8 722
+payg_cas01.gat,221,116,4 duplicate(MingtingNW) Mingting#f1-9 722
+payg_cas01.gat,206,108,4 duplicate(MingtingNW) Mingting#f1-10 722
+payg_cas01.gat,212,108,4 duplicate(MingtingNW) Mingting#f1-11 722
+
+//================================================
+// Kafra Service
+//================================================
+payg_cas01.gat,128,58,3 script Kafra Service#pay1 117,{
+ cutin "kafra_01",2;
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (getcharid(2) == @GIDf1) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf1) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDf1) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "payon.gat",82,128;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("payg_cas01.gat",9) == 1) break;
+ disablenpc "Kafra Service#pay1";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+payg_cas01.gat,101,25,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (getcharid(2) != @GIDf1) goto L1n;
+ warp "gld_dun01.gat",186,165;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+payg_cas01.gat,120,58,4 script Grunday 55,{
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (@GIDf1 == 0) goto LStart;
+ if (getcharid(2) != @GIDf1) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDf1)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Grunday ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDf1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf1) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Grunday ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Grunday ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDf1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Grunday ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDf1) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Grunday ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("payg_cas01.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("payg_cas01.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("payg_cas01.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("payg_cas01.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("payg_cas01.gat",4);
+ set @Economy,GetCastleData("payg_cas01.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Grunday ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Grunday ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Grunday ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas01.gat",2,@Economy+1;
+ mes "[ Grunday ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Grunday ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Grunday ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas01.gat",2,@Economy+1;
+ mes "[ Grunday ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Grunday ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Grunday ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("payg_cas01.gat",5);
+ set @Defence,GetCastleData("payg_cas01.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Grunday ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Grunday ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Grunday ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas01.gat",3,@Defence+1;
+ mes "[ Grunday ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Grunday ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Grunday ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas01.gat",3,@Defence+1;
+ mes "[ Grunday ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Grunday ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Grunday ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("payg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Grunday ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("payg_cas01.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("payg_cas01.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("payg_cas01.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("payg_cas01.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("payg_cas01.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("payg_cas01.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("payg_cas01.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("payg_cas01.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Grunday ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Grunday ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "payg_cas01.gat",@GDnum,1;
+ SetCastleData "payg_cas01.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "payg_cas01.gat",210,120,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas01.gat",69,26,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas01.gat",23,141,"Soldier Guardian",1287,1,"Guardian_C01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas01.gat",224,87,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas01.gat",81,45,"Archer Guardian",1285,1,"Guardian_C01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas01.gat",214,53,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas01.gat",69,26,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas01.gat",23,141,"Knight Guardian",1286,1,"Guardian_C01::OnGuardianDied",7;
+ mes "[ Grunday ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Grunday ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Grunday ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Grunday ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("payg_cas01.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Grunday ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Grunday ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Grunday ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#pay1";
+ SetCastleData "payg_cas01.gat",9,1;
+ mes "[ Grunday ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Grunday ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Grunday ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Grunday ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#pay1";
+ SetCastleData "payg_cas01.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Grunday ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Grunday ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Grunday ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Grunday ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "payg_cas01",290,7;
+ L6_1:
+ mes "[ Grunday ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Grunday ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Grunday ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Grunday ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "payg_cas01.gat",1,0;
+ SetCastleData "payg_cas01.gat",2,0;
+ SetCastleData "payg_cas01.gat",3,0;
+ SetCastleData "payg_cas01.gat",4,0;
+ SetCastleData "payg_cas01.gat",5,0;
+ SetCastleData "payg_cas01.gat",6,0;
+ SetCastleData "payg_cas01.gat",7,0;
+ SetCastleData "payg_cas01.gat",8,0;
+ SetCastleData "payg_cas01.gat",9,0;
+ SetCastleData "payg_cas01.gat",10,0;
+ SetCastleData "payg_cas01.gat",11,0;
+ SetCastleData "payg_cas01.gat",12,0;
+ SetCastleData "payg_cas01.gat",13,0;
+ SetCastleData "payg_cas01.gat",14,0;
+ SetCastleData "payg_cas01.gat",15,0;
+ SetCastleData "payg_cas01.gat",16,0;
+ SetCastleData "payg_cas01.gat",17,0;
+ SetCastleData "payg_cas01.gat",18,0;
+ SetCastleData "payg_cas01.gat",19,0;
+ SetCastleData "payg_cas01.gat",20,0;
+ SetCastleData "payg_cas01.gat",21,0;
+ SetCastleData "payg_cas01.gat",22,0;
+ SetCastleData "payg_cas01.gat",23,0;
+ SetCastleData "payg_cas01.gat",24,0;
+ SetCastleData "payg_cas01.gat",25,0;
+ Announce "[" + GetGuildName(@GIDf1) + "] has surrendered Agit [" + GetCastleName("payg_cas01.gat") + "]",0;
+ MapRespawnGuildID "payg_cas01.gat",GetCastleData("payg_cas01.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Grunday ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/payg_cas02.txt b/npc/guild/old/payg_cas02.txt
index 4dae578cd..46437e5ba 100644
--- a/npc/guild/old/payg_cas02.txt
+++ b/npc/guild/old/payg_cas02.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas02 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in payg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-payg_cas02.gat,254,40,6 script Tiantan#f2-6::TiantanNW 722,{
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (@GIDf2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- break;
-}
-
-payg_cas02.gat,254,48,6 duplicate(TiantanNW) Tiantan#f2-7 722
-payg_cas02.gat,202,49,0 duplicate(TiantanNW) Tiantan#f2-8 722
-payg_cas02.gat,209,49,0 duplicate(TiantanNW) Tiantan#f2-9 722
-payg_cas02.gat,59,282,4 duplicate(TiantanNW) Tiantan#f2-10 722
-payg_cas02.gat,70,282,4 duplicate(TiantanNW) Tiantan#f2-11 722
-
-//================================================
-// Kafra Service
-//================================================
-payg_cas02.gat,22,275,5 script Kafra Service#pay2 117,{
- cutin "kafra_01",2;
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (getcharid(2) == @GIDf2) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf2) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDf2) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "payon.gat",82,128;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("payg_cas02.gat",9) == 1) break;
- disablenpc "Kafra Service#pay2";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-payg_cas02.gat,278,247,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (getcharid(2) != @GIDf2) goto L1n;
- warp "gld_dun01.gat",54,165;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-payg_cas02.gat,22,260,7 script Cherrios 55,{
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (@GIDf2 == 0) goto LStart;
- if (getcharid(2) != @GIDf2) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDf2)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Cherrios ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDf2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf2) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Cherrios ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Cherrios ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDf2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Cherrios ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDf2) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Cherrios ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("payg_cas02.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("payg_cas02.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("payg_cas02.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("payg_cas02.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("payg_cas02.gat",4);
- set @Economy,GetCastleData("payg_cas02.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Cherrios ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Cherrios ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Cherrios ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas02.gat",4,@TriggerE+1;
- SetCastleData "payg_cas02.gat",2,@Economy+1;
- mes "[ Cherrios ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Cherrios ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Cherrios ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas02.gat",4,@TriggerE+1;
- SetCastleData "payg_cas02.gat",2,@Economy+1;
- mes "[ Cherrios ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Cherrios ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Cherrios ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("payg_cas02.gat",5);
- set @Defence,GetCastleData("payg_cas02.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Cherrios ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Cherrios ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Cherrios ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas02.gat",5,@TriggerD+1;
- SetCastleData "payg_cas02.gat",3,@Defence+1;
- mes "[ Cherrios ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Cherrios ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Cherrios ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas02.gat",5,@TriggerD+1;
- SetCastleData "payg_cas02.gat",3,@Defence+1;
- mes "[ Cherrios ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Cherrios ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Cherrios ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("payg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Cherrios ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("payg_cas02.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("payg_cas02.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("payg_cas02.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("payg_cas02.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("payg_cas02.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("payg_cas02.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("payg_cas02.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("payg_cas02.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Cherrios ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Cherrios ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "payg_cas02.gat",@GDnum,1;
- SetCastleData "payg_cas02.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",7;
- mes "[ Cherrios ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Cherrios ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Cherrios ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Cherrios ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("payg_cas02.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Cherrios ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Cherrios ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Cherrios ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#pay2";
- SetCastleData "payg_cas02.gat",9,1;
- mes "[ Cherrios ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Cherrios ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Cherrios ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Cherrios ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#pay2";
- SetCastleData "payg_cas02.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Cherrios ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Cherrios ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Cherrios ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Cherrios ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "payg_cas02",145,143;
- L6_1:
- mes "[ Cherrios ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Cherrios ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Cherrios ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Cherrios ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "payg_cas02.gat",1,0;
- SetCastleData "payg_cas02.gat",2,0;
- SetCastleData "payg_cas02.gat",3,0;
- SetCastleData "payg_cas02.gat",4,0;
- SetCastleData "payg_cas02.gat",5,0;
- SetCastleData "payg_cas02.gat",6,0;
- SetCastleData "payg_cas02.gat",7,0;
- SetCastleData "payg_cas02.gat",8,0;
- SetCastleData "payg_cas02.gat",9,0;
- SetCastleData "payg_cas02.gat",10,0;
- SetCastleData "payg_cas02.gat",11,0;
- SetCastleData "payg_cas02.gat",12,0;
- SetCastleData "payg_cas02.gat",13,0;
- SetCastleData "payg_cas02.gat",14,0;
- SetCastleData "payg_cas02.gat",15,0;
- SetCastleData "payg_cas02.gat",16,0;
- SetCastleData "payg_cas02.gat",17,0;
- SetCastleData "payg_cas02.gat",18,0;
- SetCastleData "payg_cas02.gat",19,0;
- SetCastleData "payg_cas02.gat",20,0;
- SetCastleData "payg_cas02.gat",21,0;
- SetCastleData "payg_cas02.gat",22,0;
- SetCastleData "payg_cas02.gat",23,0;
- SetCastleData "payg_cas02.gat",24,0;
- SetCastleData "payg_cas02.gat",25,0;
- Announce "[" + GetGuildName(@GIDf2) + "] has surrendered Agit [" + GetCastleName("payg_cas02.gat") + "]",0;
- MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),7;
- break;
- L7_2:
- mes "[ Cherrios ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas02 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in payg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+payg_cas02.gat,254,40,6 script Tiantan#f2-6::TiantanNW 722,{
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (@GIDf2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ break;
+}
+
+payg_cas02.gat,254,48,6 duplicate(TiantanNW) Tiantan#f2-7 722
+payg_cas02.gat,202,49,0 duplicate(TiantanNW) Tiantan#f2-8 722
+payg_cas02.gat,209,49,0 duplicate(TiantanNW) Tiantan#f2-9 722
+payg_cas02.gat,59,282,4 duplicate(TiantanNW) Tiantan#f2-10 722
+payg_cas02.gat,70,282,4 duplicate(TiantanNW) Tiantan#f2-11 722
+
+//================================================
+// Kafra Service
+//================================================
+payg_cas02.gat,22,275,5 script Kafra Service#pay2 117,{
+ cutin "kafra_01",2;
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (getcharid(2) == @GIDf2) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf2) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDf2) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "payon.gat",82,128;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("payg_cas02.gat",9) == 1) break;
+ disablenpc "Kafra Service#pay2";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+payg_cas02.gat,278,247,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (getcharid(2) != @GIDf2) goto L1n;
+ warp "gld_dun01.gat",54,165;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+payg_cas02.gat,22,260,7 script Cherrios 55,{
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (@GIDf2 == 0) goto LStart;
+ if (getcharid(2) != @GIDf2) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDf2)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Cherrios ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDf2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf2) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Cherrios ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Cherrios ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDf2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Cherrios ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDf2) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Cherrios ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("payg_cas02.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("payg_cas02.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("payg_cas02.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("payg_cas02.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("payg_cas02.gat",4);
+ set @Economy,GetCastleData("payg_cas02.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Cherrios ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Cherrios ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Cherrios ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas02.gat",2,@Economy+1;
+ mes "[ Cherrios ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Cherrios ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Cherrios ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas02.gat",2,@Economy+1;
+ mes "[ Cherrios ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Cherrios ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Cherrios ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("payg_cas02.gat",5);
+ set @Defence,GetCastleData("payg_cas02.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Cherrios ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Cherrios ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Cherrios ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas02.gat",3,@Defence+1;
+ mes "[ Cherrios ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Cherrios ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Cherrios ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas02.gat",3,@Defence+1;
+ mes "[ Cherrios ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Cherrios ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Cherrios ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("payg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Cherrios ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("payg_cas02.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("payg_cas02.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("payg_cas02.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("payg_cas02.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("payg_cas02.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("payg_cas02.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("payg_cas02.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("payg_cas02.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Cherrios ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Cherrios ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "payg_cas02.gat",@GDnum,1;
+ SetCastleData "payg_cas02.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "payg_cas02.gat",208,37,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas02.gat",51,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas02.gat",286,245,"Soldier Guardian",1287,1,"Guardian_C02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas02.gat",217,42,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas02.gat",264,266,"Archer Guardian",1285,1,"Guardian_C02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas02.gat",51,245,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas02.gat",279,263,"Knight Guardian",1286,1,"Guardian_C02::OnGuardianDied",7;
+ mes "[ Cherrios ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Cherrios ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Cherrios ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Cherrios ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("payg_cas02.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Cherrios ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Cherrios ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Cherrios ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#pay2";
+ SetCastleData "payg_cas02.gat",9,1;
+ mes "[ Cherrios ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Cherrios ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Cherrios ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Cherrios ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#pay2";
+ SetCastleData "payg_cas02.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Cherrios ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Cherrios ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Cherrios ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Cherrios ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "payg_cas02",145,143;
+ L6_1:
+ mes "[ Cherrios ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Cherrios ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Cherrios ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Cherrios ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "payg_cas02.gat",1,0;
+ SetCastleData "payg_cas02.gat",2,0;
+ SetCastleData "payg_cas02.gat",3,0;
+ SetCastleData "payg_cas02.gat",4,0;
+ SetCastleData "payg_cas02.gat",5,0;
+ SetCastleData "payg_cas02.gat",6,0;
+ SetCastleData "payg_cas02.gat",7,0;
+ SetCastleData "payg_cas02.gat",8,0;
+ SetCastleData "payg_cas02.gat",9,0;
+ SetCastleData "payg_cas02.gat",10,0;
+ SetCastleData "payg_cas02.gat",11,0;
+ SetCastleData "payg_cas02.gat",12,0;
+ SetCastleData "payg_cas02.gat",13,0;
+ SetCastleData "payg_cas02.gat",14,0;
+ SetCastleData "payg_cas02.gat",15,0;
+ SetCastleData "payg_cas02.gat",16,0;
+ SetCastleData "payg_cas02.gat",17,0;
+ SetCastleData "payg_cas02.gat",18,0;
+ SetCastleData "payg_cas02.gat",19,0;
+ SetCastleData "payg_cas02.gat",20,0;
+ SetCastleData "payg_cas02.gat",21,0;
+ SetCastleData "payg_cas02.gat",22,0;
+ SetCastleData "payg_cas02.gat",23,0;
+ SetCastleData "payg_cas02.gat",24,0;
+ SetCastleData "payg_cas02.gat",25,0;
+ Announce "[" + GetGuildName(@GIDf2) + "] has surrendered Agit [" + GetCastleName("payg_cas02.gat") + "]",0;
+ MapRespawnGuildID "payg_cas02.gat",GetCastleData("payg_cas02.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Cherrios ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/payg_cas03.txt b/npc/guild/old/payg_cas03.txt
index 7d9aee3e9..bf7b2218e 100644
--- a/npc/guild/old/payg_cas03.txt
+++ b/npc/guild/old/payg_cas03.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas03 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in payg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-payg_cas03.gat,236,54,2 script Fuying#f3-6::FuyingNW 722,{
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (@GIDf3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- break;
-}
-
-payg_cas03.gat,236,45,2 duplicate(FuyingNW) Fuying#f3-7 722
-payg_cas03.gat,259,66,4 duplicate(FuyingNW) Fuying#f3-8 722
-payg_cas03.gat,266,66,4 duplicate(FuyingNW) Fuying#f3-9 722
-payg_cas03.gat,34,31,4 duplicate(FuyingNW) Fuying#f3-10 722
-payg_cas03.gat,43,31,4 duplicate(FuyingNW) Fuying#f3-11 722
-
-//================================================
-// Kafra Service
-//================================================
-payg_cas03.gat,9,263,5 script Kafra Service#pay3 117,{
- cutin "kafra_01",2;
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (getcharid(2) == @GIDf3) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf3) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDf3) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "payon.gat",82,128;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("payg_cas03.gat",9) == 1) break;
- disablenpc "Kafra Service#pay3";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-payg_cas03.gat,38,42,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (getcharid(2) != @GIDf3) goto L1n;
- warp "gld_dun01.gat",54,39;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-payg_cas03.gat,268,264,0 script Garriet 55,{
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (@GIDf3 == 0) goto LStart;
- if (getcharid(2) != @GIDf3) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDf3)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Garriet ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDf3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf3) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Garriet ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Garriet ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDf3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Garriet ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDf3) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Garriet ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("payg_cas03.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("payg_cas03.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("payg_cas03.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("payg_cas03.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("payg_cas03.gat",4);
- set @Economy,GetCastleData("payg_cas03.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Garriet ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Garriet ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Garriet ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas03.gat",4,@TriggerE+1;
- SetCastleData "payg_cas03.gat",2,@Economy+1;
- mes "[ Garriet ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Garriet ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Garriet ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas03.gat",4,@TriggerE+1;
- SetCastleData "payg_cas03.gat",2,@Economy+1;
- mes "[ Garriet ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Garriet ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Garriet ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("payg_cas03.gat",5);
- set @Defence,GetCastleData("payg_cas03.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Garriet ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Garriet ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Garriet ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas03.gat",5,@TriggerD+1;
- SetCastleData "payg_cas03.gat",3,@Defence+1;
- mes "[ Garriet ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Garriet ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Garriet ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas03.gat",5,@TriggerD+1;
- SetCastleData "payg_cas03.gat",3,@Defence+1;
- mes "[ Garriet ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Garriet ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Garriet ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("payg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Garriet ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("payg_cas03.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("payg_cas03.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("payg_cas03.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("payg_cas03.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("payg_cas03.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("payg_cas03.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("payg_cas03.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("payg_cas03.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Garriet ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Garriet ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "payg_cas03.gat",@GDnum,1;
- SetCastleData "payg_cas03.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",7;
- mes "[ Garriet ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Garriet ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Garriet ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Garriet ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("payg_cas03.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Garriet ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Garriet ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Garriet ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#pay3";
- SetCastleData "payg_cas03.gat",9,1;
- mes "[ Garriet ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Garriet ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Garriet ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Garriet ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#pay3";
- SetCastleData "payg_cas03.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Garriet ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Garriet ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Garriet ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Garriet ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "payg_cas03",158,168;
- L6_1:
- mes "[ Garriet ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Garriet ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Garriet ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Garriet ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "payg_cas03.gat",1,0;
- SetCastleData "payg_cas03.gat",2,0;
- SetCastleData "payg_cas03.gat",3,0;
- SetCastleData "payg_cas03.gat",4,0;
- SetCastleData "payg_cas03.gat",5,0;
- SetCastleData "payg_cas03.gat",6,0;
- SetCastleData "payg_cas03.gat",7,0;
- SetCastleData "payg_cas03.gat",8,0;
- SetCastleData "payg_cas03.gat",9,0;
- SetCastleData "payg_cas03.gat",10,0;
- SetCastleData "payg_cas03.gat",11,0;
- SetCastleData "payg_cas03.gat",12,0;
- SetCastleData "payg_cas03.gat",13,0;
- SetCastleData "payg_cas03.gat",14,0;
- SetCastleData "payg_cas03.gat",15,0;
- SetCastleData "payg_cas03.gat",16,0;
- SetCastleData "payg_cas03.gat",17,0;
- SetCastleData "payg_cas03.gat",18,0;
- SetCastleData "payg_cas03.gat",19,0;
- SetCastleData "payg_cas03.gat",20,0;
- SetCastleData "payg_cas03.gat",21,0;
- SetCastleData "payg_cas03.gat",22,0;
- SetCastleData "payg_cas03.gat",23,0;
- SetCastleData "payg_cas03.gat",24,0;
- SetCastleData "payg_cas03.gat",25,0;
- Announce "[" + GetGuildName(@GIDf3) + "] has surrendered Agit [" + GetCastleName("payg_cas03.gat") + "]",0;
- MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),7;
- break;
- L7_2:
- mes "[ Garriet ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas03 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in payg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+payg_cas03.gat,236,54,2 script Fuying#f3-6::FuyingNW 722,{
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (@GIDf3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ break;
+}
+
+payg_cas03.gat,236,45,2 duplicate(FuyingNW) Fuying#f3-7 722
+payg_cas03.gat,259,66,4 duplicate(FuyingNW) Fuying#f3-8 722
+payg_cas03.gat,266,66,4 duplicate(FuyingNW) Fuying#f3-9 722
+payg_cas03.gat,34,31,4 duplicate(FuyingNW) Fuying#f3-10 722
+payg_cas03.gat,43,31,4 duplicate(FuyingNW) Fuying#f3-11 722
+
+//================================================
+// Kafra Service
+//================================================
+payg_cas03.gat,9,263,5 script Kafra Service#pay3 117,{
+ cutin "kafra_01",2;
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (getcharid(2) == @GIDf3) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf3) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDf3) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "payon.gat",82,128;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("payg_cas03.gat",9) == 1) break;
+ disablenpc "Kafra Service#pay3";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+payg_cas03.gat,38,42,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (getcharid(2) != @GIDf3) goto L1n;
+ warp "gld_dun01.gat",54,39;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+payg_cas03.gat,268,264,0 script Garriet 55,{
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (@GIDf3 == 0) goto LStart;
+ if (getcharid(2) != @GIDf3) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDf3)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Garriet ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDf3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf3) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Garriet ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Garriet ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDf3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Garriet ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDf3) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Garriet ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("payg_cas03.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("payg_cas03.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("payg_cas03.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("payg_cas03.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("payg_cas03.gat",4);
+ set @Economy,GetCastleData("payg_cas03.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Garriet ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Garriet ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Garriet ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas03.gat",2,@Economy+1;
+ mes "[ Garriet ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Garriet ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Garriet ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas03.gat",2,@Economy+1;
+ mes "[ Garriet ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Garriet ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Garriet ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("payg_cas03.gat",5);
+ set @Defence,GetCastleData("payg_cas03.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Garriet ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Garriet ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Garriet ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas03.gat",3,@Defence+1;
+ mes "[ Garriet ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Garriet ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Garriet ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas03.gat",3,@Defence+1;
+ mes "[ Garriet ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Garriet ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Garriet ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("payg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Garriet ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("payg_cas03.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("payg_cas03.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("payg_cas03.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("payg_cas03.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("payg_cas03.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("payg_cas03.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("payg_cas03.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("payg_cas03.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Garriet ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Garriet ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "payg_cas03.gat",@GDnum,1;
+ SetCastleData "payg_cas03.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "payg_cas03.gat",252,39,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas03.gat",23,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas03.gat",34,283,"Soldier Guardian",1287,1,"Guardian_C03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas03.gat",57,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas03.gat",20,36,"Archer Guardian",1285,1,"Guardian_C03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas03.gat",34,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas03.gat",23,283,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas03.gat",28,253,"Knight Guardian",1286,1,"Guardian_C03::OnGuardianDied",7;
+ mes "[ Garriet ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Garriet ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Garriet ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Garriet ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("payg_cas03.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Garriet ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Garriet ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Garriet ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#pay3";
+ SetCastleData "payg_cas03.gat",9,1;
+ mes "[ Garriet ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Garriet ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Garriet ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Garriet ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#pay3";
+ SetCastleData "payg_cas03.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Garriet ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Garriet ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Garriet ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Garriet ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "payg_cas03",158,168;
+ L6_1:
+ mes "[ Garriet ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Garriet ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Garriet ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Garriet ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "payg_cas03.gat",1,0;
+ SetCastleData "payg_cas03.gat",2,0;
+ SetCastleData "payg_cas03.gat",3,0;
+ SetCastleData "payg_cas03.gat",4,0;
+ SetCastleData "payg_cas03.gat",5,0;
+ SetCastleData "payg_cas03.gat",6,0;
+ SetCastleData "payg_cas03.gat",7,0;
+ SetCastleData "payg_cas03.gat",8,0;
+ SetCastleData "payg_cas03.gat",9,0;
+ SetCastleData "payg_cas03.gat",10,0;
+ SetCastleData "payg_cas03.gat",11,0;
+ SetCastleData "payg_cas03.gat",12,0;
+ SetCastleData "payg_cas03.gat",13,0;
+ SetCastleData "payg_cas03.gat",14,0;
+ SetCastleData "payg_cas03.gat",15,0;
+ SetCastleData "payg_cas03.gat",16,0;
+ SetCastleData "payg_cas03.gat",17,0;
+ SetCastleData "payg_cas03.gat",18,0;
+ SetCastleData "payg_cas03.gat",19,0;
+ SetCastleData "payg_cas03.gat",20,0;
+ SetCastleData "payg_cas03.gat",21,0;
+ SetCastleData "payg_cas03.gat",22,0;
+ SetCastleData "payg_cas03.gat",23,0;
+ SetCastleData "payg_cas03.gat",24,0;
+ SetCastleData "payg_cas03.gat",25,0;
+ Announce "[" + GetGuildName(@GIDf3) + "] has surrendered Agit [" + GetCastleName("payg_cas03.gat") + "]",0;
+ MapRespawnGuildID "payg_cas03.gat",GetCastleData("payg_cas03.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Garriet ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/payg_cas04.txt b/npc/guild/old/payg_cas04.txt
index 634560c59..040f270cf 100644
--- a/npc/guild/old/payg_cas04.txt
+++ b/npc/guild/old/payg_cas04.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas04 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in payg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-payg_cas04.gat,255,259,0 script Honglou#f4-6::HonglouNW 722,{
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (@GIDf4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- break;
-}
-
-payg_cas04.gat,248,259,0 duplicate(HonglouNW) Honglou#f4-7 722
-payg_cas04.gat,248,168,6 duplicate(HonglouNW) Honglou#f4-8 722
-payg_cas04.gat,248,160,6 duplicate(HonglouNW) Honglou#f4-9 722
-payg_cas04.gat,232,181,4 duplicate(HonglouNW) Honglou#f4-10 722
-payg_cas04.gat,239,181,4 duplicate(HonglouNW) Honglou#f4-11 722
-
-//================================================
-// Kafra Service
-//================================================
-payg_cas04.gat,40,235,1 script Kafra Service#pay4 117,{
- cutin "kafra_01",2;
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (getcharid(2) == @GIDf4) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf4) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDf4) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "payon.gat",82,128;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("payg_cas04.gat",9) == 1) break;
- disablenpc "Kafra Service#pay4";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-payg_cas04.gat,52,48,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (getcharid(2) != @GIDf4) goto L1n;
- warp "gld_dun01.gat",186,39;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-payg_cas04.gat,38,284,3 script DJ 55,{
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (@GIDf4 == 0) goto LStart;
- if (getcharid(2) != @GIDf4) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDf4)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ DJ ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDf4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf4) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ DJ ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ DJ ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDf4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ DJ ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDf4) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ DJ ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("payg_cas04.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("payg_cas04.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("payg_cas04.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("payg_cas04.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("payg_cas04.gat",4);
- set @Economy,GetCastleData("payg_cas04.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ DJ ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ DJ ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ DJ ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas04.gat",4,@TriggerE+1;
- SetCastleData "payg_cas04.gat",2,@Economy+1;
- mes "[ DJ ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ DJ ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ DJ ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas04.gat",4,@TriggerE+1;
- SetCastleData "payg_cas04.gat",2,@Economy+1;
- mes "[ DJ ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ DJ ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ DJ ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("payg_cas04.gat",5);
- set @Defence,GetCastleData("payg_cas04.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ DJ ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ DJ ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ DJ ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas04.gat",5,@TriggerD+1;
- SetCastleData "payg_cas04.gat",3,@Defence+1;
- mes "[ DJ ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ DJ ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ DJ ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas04.gat",5,@TriggerD+1;
- SetCastleData "payg_cas04.gat",3,@Defence+1;
- mes "[ DJ ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ DJ ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ DJ ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("payg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ DJ ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("payg_cas04.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("payg_cas04.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("payg_cas04.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("payg_cas04.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("payg_cas04.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("payg_cas04.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("payg_cas04.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("payg_cas04.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ DJ ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ DJ ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "payg_cas04.gat",@GDnum,1;
- SetCastleData "payg_cas04.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",7;
- mes "[ DJ ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ DJ ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ DJ ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ DJ ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("payg_cas04.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ DJ ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ DJ ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ DJ ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#pay4";
- SetCastleData "payg_cas04.gat",9,1;
- mes "[ DJ ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ DJ ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ DJ ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ DJ ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#pay4";
- SetCastleData "payg_cas04.gat",9,0;
- cutin "kafra_01",255;
- mes "[ DJ ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ DJ ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ DJ ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ DJ ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "payg_cas04",146,48;
- L6_1:
- mes "[ DJ ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ DJ ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ DJ ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ DJ ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "payg_cas04.gat",1,0;
- SetCastleData "payg_cas04.gat",2,0;
- SetCastleData "payg_cas04.gat",3,0;
- SetCastleData "payg_cas04.gat",4,0;
- SetCastleData "payg_cas04.gat",5,0;
- SetCastleData "payg_cas04.gat",6,0;
- SetCastleData "payg_cas04.gat",7,0;
- SetCastleData "payg_cas04.gat",8,0;
- SetCastleData "payg_cas04.gat",9,0;
- SetCastleData "payg_cas04.gat",10,0;
- SetCastleData "payg_cas04.gat",11,0;
- SetCastleData "payg_cas04.gat",12,0;
- SetCastleData "payg_cas04.gat",13,0;
- SetCastleData "payg_cas04.gat",14,0;
- SetCastleData "payg_cas04.gat",15,0;
- SetCastleData "payg_cas04.gat",16,0;
- SetCastleData "payg_cas04.gat",17,0;
- SetCastleData "payg_cas04.gat",18,0;
- SetCastleData "payg_cas04.gat",19,0;
- SetCastleData "payg_cas04.gat",20,0;
- SetCastleData "payg_cas04.gat",21,0;
- SetCastleData "payg_cas04.gat",22,0;
- SetCastleData "payg_cas04.gat",23,0;
- SetCastleData "payg_cas04.gat",24,0;
- SetCastleData "payg_cas04.gat",25,0;
- Announce "[" + GetGuildName(@GIDf4) + "] has surrendered Agit [" + GetCastleName("payg_cas04.gat") + "]",0;
- MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),7;
- break;
- L7_2:
- mes "[ DJ ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas04 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in payg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+payg_cas04.gat,255,259,0 script Honglou#f4-6::HonglouNW 722,{
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (@GIDf4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ break;
+}
+
+payg_cas04.gat,248,259,0 duplicate(HonglouNW) Honglou#f4-7 722
+payg_cas04.gat,248,168,6 duplicate(HonglouNW) Honglou#f4-8 722
+payg_cas04.gat,248,160,6 duplicate(HonglouNW) Honglou#f4-9 722
+payg_cas04.gat,232,181,4 duplicate(HonglouNW) Honglou#f4-10 722
+payg_cas04.gat,239,181,4 duplicate(HonglouNW) Honglou#f4-11 722
+
+//================================================
+// Kafra Service
+//================================================
+payg_cas04.gat,40,235,1 script Kafra Service#pay4 117,{
+ cutin "kafra_01",2;
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (getcharid(2) == @GIDf4) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf4) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDf4) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "payon.gat",82,128;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("payg_cas04.gat",9) == 1) break;
+ disablenpc "Kafra Service#pay4";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+payg_cas04.gat,52,48,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (getcharid(2) != @GIDf4) goto L1n;
+ warp "gld_dun01.gat",186,39;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+payg_cas04.gat,38,284,3 script DJ 55,{
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (@GIDf4 == 0) goto LStart;
+ if (getcharid(2) != @GIDf4) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDf4)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ DJ ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDf4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf4) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ DJ ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ DJ ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDf4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ DJ ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDf4) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ DJ ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("payg_cas04.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("payg_cas04.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("payg_cas04.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("payg_cas04.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("payg_cas04.gat",4);
+ set @Economy,GetCastleData("payg_cas04.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ DJ ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ DJ ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ DJ ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas04.gat",2,@Economy+1;
+ mes "[ DJ ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ DJ ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ DJ ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas04.gat",2,@Economy+1;
+ mes "[ DJ ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ DJ ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ DJ ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("payg_cas04.gat",5);
+ set @Defence,GetCastleData("payg_cas04.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ DJ ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ DJ ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ DJ ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas04.gat",3,@Defence+1;
+ mes "[ DJ ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ DJ ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ DJ ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas04.gat",3,@Defence+1;
+ mes "[ DJ ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ DJ ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ DJ ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("payg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ DJ ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("payg_cas04.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("payg_cas04.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("payg_cas04.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("payg_cas04.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("payg_cas04.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("payg_cas04.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("payg_cas04.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("payg_cas04.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ DJ ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ DJ ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "payg_cas04.gat",@GDnum,1;
+ SetCastleData "payg_cas04.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "payg_cas04.gat",236,172,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas04.gat",14,260,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas04.gat",15,30,"Soldier Guardian",1287,1,"Guardian_C04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas04.gat",257,166,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas04.gat",65,261,"Archer Guardian",1285,1,"Guardian_C04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas04.gat",65,261,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas04.gat",52,29,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas04.gat",15,30,"Knight Guardian",1286,1,"Guardian_C04::OnGuardianDied",7;
+ mes "[ DJ ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ DJ ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ DJ ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ DJ ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("payg_cas04.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ DJ ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ DJ ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ DJ ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#pay4";
+ SetCastleData "payg_cas04.gat",9,1;
+ mes "[ DJ ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ DJ ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ DJ ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ DJ ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#pay4";
+ SetCastleData "payg_cas04.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ DJ ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ DJ ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ DJ ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ DJ ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "payg_cas04",146,48;
+ L6_1:
+ mes "[ DJ ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ DJ ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ DJ ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ DJ ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "payg_cas04.gat",1,0;
+ SetCastleData "payg_cas04.gat",2,0;
+ SetCastleData "payg_cas04.gat",3,0;
+ SetCastleData "payg_cas04.gat",4,0;
+ SetCastleData "payg_cas04.gat",5,0;
+ SetCastleData "payg_cas04.gat",6,0;
+ SetCastleData "payg_cas04.gat",7,0;
+ SetCastleData "payg_cas04.gat",8,0;
+ SetCastleData "payg_cas04.gat",9,0;
+ SetCastleData "payg_cas04.gat",10,0;
+ SetCastleData "payg_cas04.gat",11,0;
+ SetCastleData "payg_cas04.gat",12,0;
+ SetCastleData "payg_cas04.gat",13,0;
+ SetCastleData "payg_cas04.gat",14,0;
+ SetCastleData "payg_cas04.gat",15,0;
+ SetCastleData "payg_cas04.gat",16,0;
+ SetCastleData "payg_cas04.gat",17,0;
+ SetCastleData "payg_cas04.gat",18,0;
+ SetCastleData "payg_cas04.gat",19,0;
+ SetCastleData "payg_cas04.gat",20,0;
+ SetCastleData "payg_cas04.gat",21,0;
+ SetCastleData "payg_cas04.gat",22,0;
+ SetCastleData "payg_cas04.gat",23,0;
+ SetCastleData "payg_cas04.gat",24,0;
+ SetCastleData "payg_cas04.gat",25,0;
+ Announce "[" + GetGuildName(@GIDf4) + "] has surrendered Agit [" + GetCastleName("payg_cas04.gat") + "]",0;
+ MapRespawnGuildID "payg_cas04.gat",GetCastleData("payg_cas04.gat",1),7;
+ break;
+ L7_2:
+ mes "[ DJ ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/payg_cas05.txt b/npc/guild/old/payg_cas05.txt
index 90261b0e8..8035bfd21 100644
--- a/npc/guild/old/payg_cas05.txt
+++ b/npc/guild/old/payg_cas05.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas05 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in payg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-payg_cas05.gat,32,249,4 script Zhulinxian#f5-6::ZhulinxianNW 722,{
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (@GIDf5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- break;
-}
-
-payg_cas05.gat,24,249,4 duplicate(ZhulinxianNW) Zhulinxian#f5-7 722
-payg_cas05.gat,62,271,0 duplicate(ZhulinxianNW) Zhulinxian#f5-8 722
-payg_cas05.gat,57,271,0 duplicate(ZhulinxianNW) Zhulinxian#f5-9 722
-payg_cas05.gat,55,252,2 duplicate(ZhulinxianNW) Zhulinxian#f5-10 722
-payg_cas05.gat,55,260,2 duplicate(ZhulinxianNW) Zhulinxian#f5-11 722
-
-//================================================
-// Kafra Service
-//================================================
-payg_cas05.gat,276,227,1 script Kafra Service#pay5 117,{
- cutin "kafra_01",2;
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (getcharid(2) == @GIDf5) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf5) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDf5) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "payon.gat",82,128;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("payg_cas05.gat",9) == 1) break;
- disablenpc "Kafra Service#pay5";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-payg_cas05.gat,238,11,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (getcharid(2) != @GIDf5) goto L1n;
- warp "gld_dun01.gat",223,202;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-payg_cas05.gat,277,249,3 script Najarf 55,{
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (@GIDf5 == 0) goto LStart;
- if (getcharid(2) != @GIDf5) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDf5)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Najarf ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDf5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf5) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Najarf ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Najarf ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDf5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Najarf ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDf5) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Najarf ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("payg_cas05.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("payg_cas05.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("payg_cas05.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("payg_cas05.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("payg_cas05.gat",4);
- set @Economy,GetCastleData("payg_cas05.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Najarf ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Najarf ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Najarf ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas05.gat",4,@TriggerE+1;
- SetCastleData "payg_cas05.gat",2,@Economy+1;
- mes "[ Najarf ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Najarf ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Najarf ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "payg_cas05.gat",4,@TriggerE+1;
- SetCastleData "payg_cas05.gat",2,@Economy+1;
- mes "[ Najarf ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Najarf ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Najarf ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("payg_cas05.gat",5);
- set @Defence,GetCastleData("payg_cas05.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Najarf ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Najarf ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Najarf ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas05.gat",5,@TriggerD+1;
- SetCastleData "payg_cas05.gat",3,@Defence+1;
- mes "[ Najarf ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Najarf ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Najarf ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "payg_cas05.gat",5,@TriggerD+1;
- SetCastleData "payg_cas05.gat",3,@Defence+1;
- mes "[ Najarf ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Najarf ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Najarf ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("payg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Najarf ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("payg_cas05.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("payg_cas05.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("payg_cas05.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("payg_cas05.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("payg_cas05.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("payg_cas05.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("payg_cas05.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("payg_cas05.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Najarf ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Najarf ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "payg_cas05.gat",@GDnum,1;
- SetCastleData "payg_cas05.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",0;
- if(@GDnum==11) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",1;
- if(@GDnum==12) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",2;
- if(@GDnum==13) guardian "payg_cas05.gat",46,273,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",3;
- if(@GDnum==14) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",4;
- if(@GDnum==15) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",5;
- if(@GDnum==16) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",6;
- if(@GDnum==17) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",7;
- mes "[ Najarf ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Najarf ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Najarf ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Najarf ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("payg_cas05.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Najarf ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Najarf ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Najarf ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#pay5";
- SetCastleData "payg_cas05.gat",9,1;
- mes "[ Najarf ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Najarf ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Najarf ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Najarf ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#pay5";
- SetCastleData "payg_cas05.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Najarf ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Najarf ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Najarf ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Najarf ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "payg_cas05",156,131;
- L6_1:
- mes "[ Najarf ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Najarf ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Najarf ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Najarf ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "payg_cas05.gat",1,0;
- SetCastleData "payg_cas05.gat",2,0;
- SetCastleData "payg_cas05.gat",3,0;
- SetCastleData "payg_cas05.gat",4,0;
- SetCastleData "payg_cas05.gat",5,0;
- SetCastleData "payg_cas05.gat",6,0;
- SetCastleData "payg_cas05.gat",7,0;
- SetCastleData "payg_cas05.gat",8,0;
- SetCastleData "payg_cas05.gat",9,0;
- SetCastleData "payg_cas05.gat",10,0;
- SetCastleData "payg_cas05.gat",11,0;
- SetCastleData "payg_cas05.gat",12,0;
- SetCastleData "payg_cas05.gat",13,0;
- SetCastleData "payg_cas05.gat",14,0;
- SetCastleData "payg_cas05.gat",15,0;
- SetCastleData "payg_cas05.gat",16,0;
- SetCastleData "payg_cas05.gat",17,0;
- SetCastleData "payg_cas05.gat",18,0;
- SetCastleData "payg_cas05.gat",19,0;
- SetCastleData "payg_cas05.gat",20,0;
- SetCastleData "payg_cas05.gat",21,0;
- SetCastleData "payg_cas05.gat",22,0;
- SetCastleData "payg_cas05.gat",23,0;
- SetCastleData "payg_cas05.gat",24,0;
- SetCastleData "payg_cas05.gat",25,0;
- Announce "[" + GetGuildName(@GIDf5) + "] has surrendered Agit [" + GetCastleName("payg_cas05.gat") + "]",0;
- MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),7;
- break;
- L7_2:
- mes "[ Najarf ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas05 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in payg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+payg_cas05.gat,32,249,4 script Zhulinxian#f5-6::ZhulinxianNW 722,{
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (@GIDf5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ break;
+}
+
+payg_cas05.gat,24,249,4 duplicate(ZhulinxianNW) Zhulinxian#f5-7 722
+payg_cas05.gat,62,271,0 duplicate(ZhulinxianNW) Zhulinxian#f5-8 722
+payg_cas05.gat,57,271,0 duplicate(ZhulinxianNW) Zhulinxian#f5-9 722
+payg_cas05.gat,55,252,2 duplicate(ZhulinxianNW) Zhulinxian#f5-10 722
+payg_cas05.gat,55,260,2 duplicate(ZhulinxianNW) Zhulinxian#f5-11 722
+
+//================================================
+// Kafra Service
+//================================================
+payg_cas05.gat,276,227,1 script Kafra Service#pay5 117,{
+ cutin "kafra_01",2;
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (getcharid(2) == @GIDf5) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDf5) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDf5) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Payon -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "payon.gat",82,128;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("payg_cas05.gat",9) == 1) break;
+ disablenpc "Kafra Service#pay5";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+payg_cas05.gat,238,11,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (getcharid(2) != @GIDf5) goto L1n;
+ warp "gld_dun01.gat",223,202;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+payg_cas05.gat,277,249,3 script Najarf 55,{
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (@GIDf5 == 0) goto LStart;
+ if (getcharid(2) != @GIDf5) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDf5)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Najarf ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDf5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDf5) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Najarf ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Najarf ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDf5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Najarf ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDf5) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Najarf ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("payg_cas05.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("payg_cas05.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("payg_cas05.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("payg_cas05.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("payg_cas05.gat",4);
+ set @Economy,GetCastleData("payg_cas05.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Najarf ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Najarf ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Najarf ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas05.gat",2,@Economy+1;
+ mes "[ Najarf ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Najarf ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Najarf ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "payg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "payg_cas05.gat",2,@Economy+1;
+ mes "[ Najarf ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Najarf ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Najarf ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("payg_cas05.gat",5);
+ set @Defence,GetCastleData("payg_cas05.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Najarf ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Najarf ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Najarf ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas05.gat",3,@Defence+1;
+ mes "[ Najarf ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Najarf ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Najarf ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "payg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "payg_cas05.gat",3,@Defence+1;
+ mes "[ Najarf ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Najarf ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Najarf ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("payg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Najarf ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("payg_cas05.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("payg_cas05.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("payg_cas05.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("payg_cas05.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("payg_cas05.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("payg_cas05.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("payg_cas05.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("payg_cas05.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Najarf ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Najarf ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "payg_cas05.gat",@GDnum,1;
+ SetCastleData "payg_cas05.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "payg_cas05.gat",51,258,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",0;
+ if(@GDnum==11) guardian "payg_cas05.gat",286,235,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",1;
+ if(@GDnum==12) guardian "payg_cas05.gat",282,277,"Soldier Guardian",1287,1,"Guardian_C05::OnGuardianDied",2;
+ if(@GDnum==13) guardian "payg_cas05.gat",46,273,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",3;
+ if(@GDnum==14) guardian "payg_cas05.gat",289,256,"Archer Guardian",1285,1,"Guardian_C05::OnGuardianDied",4;
+ if(@GDnum==15) guardian "payg_cas05.gat",275,42,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",5;
+ if(@GDnum==16) guardian "payg_cas05.gat",254,9,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",6;
+ if(@GDnum==17) guardian "payg_cas05.gat",236,256,"Knight Guardian",1286,1,"Guardian_C05::OnGuardianDied",7;
+ mes "[ Najarf ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Najarf ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Najarf ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Najarf ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("payg_cas05.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Najarf ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Najarf ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Najarf ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#pay5";
+ SetCastleData "payg_cas05.gat",9,1;
+ mes "[ Najarf ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Najarf ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Najarf ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Najarf ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#pay5";
+ SetCastleData "payg_cas05.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Najarf ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Najarf ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Najarf ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Najarf ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "payg_cas05",156,131;
+ L6_1:
+ mes "[ Najarf ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Najarf ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Najarf ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Najarf ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "payg_cas05.gat",1,0;
+ SetCastleData "payg_cas05.gat",2,0;
+ SetCastleData "payg_cas05.gat",3,0;
+ SetCastleData "payg_cas05.gat",4,0;
+ SetCastleData "payg_cas05.gat",5,0;
+ SetCastleData "payg_cas05.gat",6,0;
+ SetCastleData "payg_cas05.gat",7,0;
+ SetCastleData "payg_cas05.gat",8,0;
+ SetCastleData "payg_cas05.gat",9,0;
+ SetCastleData "payg_cas05.gat",10,0;
+ SetCastleData "payg_cas05.gat",11,0;
+ SetCastleData "payg_cas05.gat",12,0;
+ SetCastleData "payg_cas05.gat",13,0;
+ SetCastleData "payg_cas05.gat",14,0;
+ SetCastleData "payg_cas05.gat",15,0;
+ SetCastleData "payg_cas05.gat",16,0;
+ SetCastleData "payg_cas05.gat",17,0;
+ SetCastleData "payg_cas05.gat",18,0;
+ SetCastleData "payg_cas05.gat",19,0;
+ SetCastleData "payg_cas05.gat",20,0;
+ SetCastleData "payg_cas05.gat",21,0;
+ SetCastleData "payg_cas05.gat",22,0;
+ SetCastleData "payg_cas05.gat",23,0;
+ SetCastleData "payg_cas05.gat",24,0;
+ SetCastleData "payg_cas05.gat",25,0;
+ Announce "[" + GetGuildName(@GIDf5) + "] has surrendered Agit [" + GetCastleName("payg_cas05.gat") + "]",0;
+ MapRespawnGuildID "payg_cas05.gat",GetCastleData("payg_cas05.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Najarf ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/payg_flag.txt b/npc/guild/old/payg_flag.txt
index e00a87c08..7009f67a0 100644
--- a/npc/guild/old/payg_flag.txt
+++ b/npc/guild/old/payg_flag.txt
@@ -1,360 +1,360 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in Payon and pay_gld
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//= 1.2 Darkchild/MissActek Flags moved to a better spot till we know exact
-//= 1.3 To exact spot
-//= 1.4 Better spots
-//============================================================
-
-//Payon Castle 01 - Mingting
-payon.gat,165,177,3 script Mingting#f1-1 722,{
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (@GIDf1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- break;
-}
-
-pay_gld.gat,125,236,4 script Mingting#f1-2::MingtingW 722,{
- set @GIDf1,GetCastleData("payg_cas01.gat",1);
- if (@GIDf1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDf1) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "payg_cas01.gat",87,29;
- break;
-OnRecvCastleF01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- break;
-}
-
-pay_gld.gat,110,233,4 duplicate(MingtingW) Mingting#f1-3 722
-pay_gld.gat,116,233,4 duplicate(MingtingW) Mingting#f1-4 722
-pay_gld.gat,91,239,2 duplicate(MingtingW) Mingting#f1-5 722
-
-//Payon Castle 02 - Tiantan
-
-payon.gat,165,173,3 script Tiantan#f2-1 722,{
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (@GIDf2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- break;
-}
-
-pay_gld.gat,292,112,6 script Tiantan#f2-2::TiantanW 722,{
- set @GIDf2,GetCastleData("payg_cas02.gat",1);
- if (@GIDf2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDf2) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "payg_cas02.gat",22,275;
- break;
-OnRecvCastleF02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- break;
-}
-
-pay_gld.gat,292,120,6 duplicate(TiantanW) Tiantan#f2-3 722
-pay_gld.gat,291,135,6 duplicate(TiantanW) Tiantan#f2-4 722
-pay_gld.gat,271,163,0 duplicate(TiantanW) Tiantan#f2-5 722
-
-//Payon Castle 03 - Fuying
-
-payon.gat,165,169,3 script Fuying#f3-1 722,{
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (@GIDf3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- break;
-}
-
-pay_gld.gat,321,298,2 script Fuying#f3-2::FuyingW 722,{
- set @GIDf3,GetCastleData("payg_cas03.gat",1);
- if (@GIDf3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDf3) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "payg_cas03.gat",9,263;
- break;
-OnRecvCastleF03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- break;
-}
-
-pay_gld.gat,321,289,2 duplicate(FuyingW) Fuying#f3-3 722
-pay_gld.gat,327,304,1 duplicate(FuyingW) Fuying#f3-4 722
-pay_gld.gat,333,254,4 duplicate(FuyingW) Fuying#f3-5 722
-
-//Payon Castle 04 - Honglou
-
-payon.gat,165,165,3 script Honglou#f4-1 722,{
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (@GIDf4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- break;
-}
-
-pay_gld.gat,143,160,0 script Honglou#f4-2::HonglouW 722,{
- set @GIDf4,GetCastleData("payg_cas04.gat",1);
- if (@GIDf4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDf4) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "payg_cas04.gat",40,235;
- break;
-OnRecvCastleF04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- break;
-}
-
-pay_gld.gat,143,160,0 duplicate(HonglouW) Honglou#f4-3 722
-pay_gld.gat,133,151,2 duplicate(HonglouW) Honglou#f4-4 722
-pay_gld.gat,153,166,1 duplicate(HonglouW) Honglou#f4-5 722
-
-//Payon Castle 05 - Zhulinxian
-
-payon.gat,165,161,3 script Zhulinxian#f5-1 722,{
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (@GIDf5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleF05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- break;
-}
-
-pay_gld.gat,208,268,4 script Zhulinxian#f5-2::ZhulinxianW 722,{
- set @GIDf5,GetCastleData("payg_cas05.gat",1);
- if (@GIDf5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDf5) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "payg_cas05.gat",276,227;
- break;
-OnRecvCastleF05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- break;
-}
-
-pay_gld.gat,199,268,4 duplicate(ZhulinxianW) Zhulinxian#f5-3 722
-pay_gld.gat,190,277,3 duplicate(ZhulinxianW) Zhulinxian#f5-4 722
+//===== eAthena Script =======================================
+//= War of Emperium - Payon Guild Flags
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in Payon and pay_gld
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//= 1.2 Darkchild/MissActek Flags moved to a better spot till we know exact
+//= 1.3 To exact spot
+//= 1.4 Better spots
+//============================================================
+
+//Payon Castle 01 - Mingting
+payon.gat,165,177,3 script Mingting#f1-1 722,{
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (@GIDf1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ break;
+}
+
+pay_gld.gat,125,236,4 script Mingting#f1-2::MingtingW 722,{
+ set @GIDf1,GetCastleData("payg_cas01.gat",1);
+ if (@GIDf1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDf1) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "payg_cas01.gat",87,29;
+ break;
+OnRecvCastleF01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ break;
+}
+
+pay_gld.gat,110,233,4 duplicate(MingtingW) Mingting#f1-3 722
+pay_gld.gat,116,233,4 duplicate(MingtingW) Mingting#f1-4 722
+pay_gld.gat,91,239,2 duplicate(MingtingW) Mingting#f1-5 722
+
+//Payon Castle 02 - Tiantan
+
+payon.gat,165,173,3 script Tiantan#f2-1 722,{
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (@GIDf2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ break;
+}
+
+pay_gld.gat,292,112,6 script Tiantan#f2-2::TiantanW 722,{
+ set @GIDf2,GetCastleData("payg_cas02.gat",1);
+ if (@GIDf2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDf2) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "payg_cas02.gat",22,275;
+ break;
+OnRecvCastleF02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ break;
+}
+
+pay_gld.gat,292,120,6 duplicate(TiantanW) Tiantan#f2-3 722
+pay_gld.gat,291,135,6 duplicate(TiantanW) Tiantan#f2-4 722
+pay_gld.gat,271,163,0 duplicate(TiantanW) Tiantan#f2-5 722
+
+//Payon Castle 03 - Fuying
+
+payon.gat,165,169,3 script Fuying#f3-1 722,{
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (@GIDf3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ break;
+}
+
+pay_gld.gat,321,298,2 script Fuying#f3-2::FuyingW 722,{
+ set @GIDf3,GetCastleData("payg_cas03.gat",1);
+ if (@GIDf3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDf3) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "payg_cas03.gat",9,263;
+ break;
+OnRecvCastleF03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ break;
+}
+
+pay_gld.gat,321,289,2 duplicate(FuyingW) Fuying#f3-3 722
+pay_gld.gat,327,304,1 duplicate(FuyingW) Fuying#f3-4 722
+pay_gld.gat,333,254,4 duplicate(FuyingW) Fuying#f3-5 722
+
+//Payon Castle 04 - Honglou
+
+payon.gat,165,165,3 script Honglou#f4-1 722,{
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (@GIDf4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ break;
+}
+
+pay_gld.gat,143,160,0 script Honglou#f4-2::HonglouW 722,{
+ set @GIDf4,GetCastleData("payg_cas04.gat",1);
+ if (@GIDf4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDf4) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "payg_cas04.gat",40,235;
+ break;
+OnRecvCastleF04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ break;
+}
+
+pay_gld.gat,143,160,0 duplicate(HonglouW) Honglou#f4-3 722
+pay_gld.gat,133,151,2 duplicate(HonglouW) Honglou#f4-4 722
+pay_gld.gat,153,166,1 duplicate(HonglouW) Honglou#f4-5 722
+
+//Payon Castle 05 - Zhulinxian
+
+payon.gat,165,161,3 script Zhulinxian#f5-1 722,{
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (@GIDf5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleF05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ break;
+}
+
+pay_gld.gat,208,268,4 script Zhulinxian#f5-2::ZhulinxianW 722,{
+ set @GIDf5,GetCastleData("payg_cas05.gat",1);
+ if (@GIDf5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDf5) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Payon ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Payon,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDf5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDf5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDf5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "payg_cas05.gat",276,227;
+ break;
+OnRecvCastleF05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ break;
+}
+
+pay_gld.gat,199,268,4 duplicate(ZhulinxianW) Zhulinxian#f5-3 722
+pay_gld.gat,190,277,3 duplicate(ZhulinxianW) Zhulinxian#f5-4 722
pay_gld.gat,187,294,2 duplicate(ZhulinxianW) Zhulinxian#f5-5 722 \ No newline at end of file
diff --git a/npc/guild/old/prtg_cas01.txt b/npc/guild/old/prtg_cas01.txt
index e1698b435..fe1e285da 100644
--- a/npc/guild/old/prtg_cas01.txt
+++ b/npc/guild/old/prtg_cas01.txt
@@ -1,670 +1,670 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas01 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-prtg_cas01.gat,58,56,4 script Creamhilt#p1-7::CreamhiltNW 722,{
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (@GIDp1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- break;
-}
-
-prtg_cas01.gat,64,56,4 duplicate(CreamhiltNW) Creamhilt#p1-8 722
-prtg_cas01.gat,76,32,4 duplicate(CreamhiltNW) Creamhilt#p1-9 722
-prtg_cas01.gat,84,32,4 duplicate(CreamhiltNW) Creamhilt#p1-10 722
-prtg_cas01.gat,94,39,4 duplicate(CreamhiltNW) Creamhilt#p1-11 722
-prtg_cas01.gat,94,24,4 duplicate(CreamhiltNW) Creamhilt#p1-12 722
-prtg_cas01.gat,73,14,4 duplicate(CreamhiltNW) Creamhilt#p1-13 722
-prtg_cas01.gat,73,6,4 duplicate(CreamhiltNW) Creamhilt#p1-14 722
-prtg_cas01.gat,55,46,4 duplicate(CreamhiltNW) Creamhilt#p1-15 722
-prtg_cas01.gat,45,46,4 duplicate(CreamhiltNW) Creamhilt#p1-16 722
-
-//================================================
-// Kafra Service
-//================================================
-prtg_cas01.gat,96,173,0 script Kafra Service#prt1 117,{
- cutin "kafra_01",2;
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (getcharid(2) == @GIDp1) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp1) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDp1) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "prontera.gat",278,211;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("prtg_cas01.gat",9) == 1) break;
- disablenpc "Kafra Service#prt1";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-prtg_cas01.gat,94,200,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (getcharid(2) != @GIDp1) goto L1n;
- warp "gld_dun03.gat",28,251;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-prtg_cas01.gat,112,181,0 script Abrai 55,{
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (@GIDp1 == 0) goto LStart;
- if (getcharid(2) != @GIDp1) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDp1)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Abrai ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDp1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp1) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Abrai ]";
- mes "I am waiting for my master.";
- mes "Brave Player! Follow your destiny!";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Abrai ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDp1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Abrai ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDp1) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Abrai ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("prtg_cas01.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("prtg_cas01.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("prtg_cas01.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("prtg_cas01.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("prtg_cas01.gat",4);
- set @Economy,GetCastleData("prtg_cas01.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Abrai ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Abrai ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Abrai ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas01.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas01.gat",2,@Economy+1;
- mes "[ Abrai ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Abrai ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Abrai ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas01.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas01.gat",2,@Economy+1;
- mes "[ Abrai ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Abrai ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Abrai ]";
- mes "Master, you do not have enough money to invest. Investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("prtg_cas01.gat",5);
- set @Defence,GetCastleData("prtg_cas01.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Abrai ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Abrai ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Abrai ]";
- mes "As you wish, master.";
- close;
-
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas01.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas01.gat",3,@Defence+1;
- mes "[ Abrai ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Abrai ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Abrai ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas01.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas01.gat",3,@Defence+1;
- mes "[ Abrai ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Abrai ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Abrai ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("prtg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Abrai ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("prtg_cas01.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("prtg_cas01.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("prtg_cas01.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("prtg_cas01.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("prtg_cas01.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("prtg_cas01.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("prtg_cas01.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("prtg_cas01.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
-
- L4_9:
- mes "[ Abrai ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Abrai ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "prtg_cas01.gat",@GDnum,1;
- SetCastleData "prtg_cas01.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",7;
- mes "[ Abrai ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Abrai ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Abrai ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Abrai ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("prtg_cas01.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Abrai ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Abrai ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Abrai ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#prt1";
- SetCastleData "prtg_cas01.gat",9,1;
- mes "[ Abrai ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Abrai ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Abrai ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Abrai ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#prt1";
- SetCastleData "prtg_cas01.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Abrai ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Abrai ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Abrai ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Abrai ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "prtg_cas01",15,209;
- L6_1:
- mes "[ Abrai ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Abrai ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Abrai ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Abrai ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "prtg_cas01.gat",1,0;
- SetCastleData "prtg_cas01.gat",2,0;
- SetCastleData "prtg_cas01.gat",3,0;
- SetCastleData "prtg_cas01.gat",4,0;
- SetCastleData "prtg_cas01.gat",5,0;
- SetCastleData "prtg_cas01.gat",6,0;
- SetCastleData "prtg_cas01.gat",7,0;
- SetCastleData "prtg_cas01.gat",8,0;
- SetCastleData "prtg_cas01.gat",9,0;
- SetCastleData "prtg_cas01.gat",10,0;
- SetCastleData "prtg_cas01.gat",11,0;
- SetCastleData "prtg_cas01.gat",12,0;
- SetCastleData "prtg_cas01.gat",13,0;
- SetCastleData "prtg_cas01.gat",14,0;
- SetCastleData "prtg_cas01.gat",15,0;
- SetCastleData "prtg_cas01.gat",16,0;
- SetCastleData "prtg_cas01.gat",17,0;
- SetCastleData "prtg_cas01.gat",18,0;
- SetCastleData "prtg_cas01.gat",19,0;
- SetCastleData "prtg_cas01.gat",20,0;
- SetCastleData "prtg_cas01.gat",21,0;
- SetCastleData "prtg_cas01.gat",22,0;
- SetCastleData "prtg_cas01.gat",23,0;
- SetCastleData "prtg_cas01.gat",24,0;
- SetCastleData "prtg_cas01.gat",25,0;
- Announce "[" + GetGuildName(@GIDp1) + "] has surrendered Agit [" + GetCastleName("prtg_cas01.gat") + "]",0;
- MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),7;
- break;
- L7_2:
- mes "[ Abrai ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas01 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+prtg_cas01.gat,58,56,4 script Creamhilt#p1-7::CreamhiltNW 722,{
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (@GIDp1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ break;
+}
+
+prtg_cas01.gat,64,56,4 duplicate(CreamhiltNW) Creamhilt#p1-8 722
+prtg_cas01.gat,76,32,4 duplicate(CreamhiltNW) Creamhilt#p1-9 722
+prtg_cas01.gat,84,32,4 duplicate(CreamhiltNW) Creamhilt#p1-10 722
+prtg_cas01.gat,94,39,4 duplicate(CreamhiltNW) Creamhilt#p1-11 722
+prtg_cas01.gat,94,24,4 duplicate(CreamhiltNW) Creamhilt#p1-12 722
+prtg_cas01.gat,73,14,4 duplicate(CreamhiltNW) Creamhilt#p1-13 722
+prtg_cas01.gat,73,6,4 duplicate(CreamhiltNW) Creamhilt#p1-14 722
+prtg_cas01.gat,55,46,4 duplicate(CreamhiltNW) Creamhilt#p1-15 722
+prtg_cas01.gat,45,46,4 duplicate(CreamhiltNW) Creamhilt#p1-16 722
+
+//================================================
+// Kafra Service
+//================================================
+prtg_cas01.gat,96,173,0 script Kafra Service#prt1 117,{
+ cutin "kafra_01",2;
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (getcharid(2) == @GIDp1) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp1) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDp1) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "prontera.gat",278,211;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("prtg_cas01.gat",9) == 1) break;
+ disablenpc "Kafra Service#prt1";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+prtg_cas01.gat,94,200,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (getcharid(2) != @GIDp1) goto L1n;
+ warp "gld_dun03.gat",28,251;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+prtg_cas01.gat,112,181,0 script Abrai 55,{
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (@GIDp1 == 0) goto LStart;
+ if (getcharid(2) != @GIDp1) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDp1)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Abrai ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDp1) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp1) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Abrai ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! Follow your destiny!";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Abrai ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDp1) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Abrai ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDp1) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Abrai ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("prtg_cas01.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("prtg_cas01.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("prtg_cas01.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("prtg_cas01.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("prtg_cas01.gat",4);
+ set @Economy,GetCastleData("prtg_cas01.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Abrai ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Abrai ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Abrai ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas01.gat",2,@Economy+1;
+ mes "[ Abrai ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Abrai ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Abrai ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas01.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas01.gat",2,@Economy+1;
+ mes "[ Abrai ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Abrai ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Abrai ]";
+ mes "Master, you do not have enough money to invest. Investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("prtg_cas01.gat",5);
+ set @Defence,GetCastleData("prtg_cas01.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Abrai ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Abrai ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Abrai ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas01.gat",3,@Defence+1;
+ mes "[ Abrai ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Abrai ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Abrai ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas01.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas01.gat",3,@Defence+1;
+ mes "[ Abrai ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Abrai ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Abrai ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("prtg_cas01.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Abrai ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("prtg_cas01.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("prtg_cas01.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("prtg_cas01.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("prtg_cas01.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("prtg_cas01.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("prtg_cas01.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("prtg_cas01.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("prtg_cas01.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+
+ L4_9:
+ mes "[ Abrai ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Abrai ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "prtg_cas01.gat",@GDnum,1;
+ SetCastleData "prtg_cas01.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "prtg_cas01.gat",196,92,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas01.gat",113,200,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas01.gat",111,186,"Soldier Guardian",1287,1,"Guardian_D01::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas01.gat",76,202,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas01.gat",90,26,"Archer Guardian",1285,1,"Guardian_D01::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas01.gat",58,59,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas01.gat",112,200,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas01.gat",101,194,"Knight Guardian",1286,1,"Guardian_D01::OnGuardianDied",7;
+ mes "[ Abrai ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Abrai ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Abrai ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Abrai ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("prtg_cas01.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Abrai ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Abrai ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Abrai ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#prt1";
+ SetCastleData "prtg_cas01.gat",9,1;
+ mes "[ Abrai ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Abrai ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Abrai ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Abrai ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#prt1";
+ SetCastleData "prtg_cas01.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Abrai ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Abrai ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Abrai ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Abrai ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "prtg_cas01",15,209;
+ L6_1:
+ mes "[ Abrai ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Abrai ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Abrai ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Abrai ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "prtg_cas01.gat",1,0;
+ SetCastleData "prtg_cas01.gat",2,0;
+ SetCastleData "prtg_cas01.gat",3,0;
+ SetCastleData "prtg_cas01.gat",4,0;
+ SetCastleData "prtg_cas01.gat",5,0;
+ SetCastleData "prtg_cas01.gat",6,0;
+ SetCastleData "prtg_cas01.gat",7,0;
+ SetCastleData "prtg_cas01.gat",8,0;
+ SetCastleData "prtg_cas01.gat",9,0;
+ SetCastleData "prtg_cas01.gat",10,0;
+ SetCastleData "prtg_cas01.gat",11,0;
+ SetCastleData "prtg_cas01.gat",12,0;
+ SetCastleData "prtg_cas01.gat",13,0;
+ SetCastleData "prtg_cas01.gat",14,0;
+ SetCastleData "prtg_cas01.gat",15,0;
+ SetCastleData "prtg_cas01.gat",16,0;
+ SetCastleData "prtg_cas01.gat",17,0;
+ SetCastleData "prtg_cas01.gat",18,0;
+ SetCastleData "prtg_cas01.gat",19,0;
+ SetCastleData "prtg_cas01.gat",20,0;
+ SetCastleData "prtg_cas01.gat",21,0;
+ SetCastleData "prtg_cas01.gat",22,0;
+ SetCastleData "prtg_cas01.gat",23,0;
+ SetCastleData "prtg_cas01.gat",24,0;
+ SetCastleData "prtg_cas01.gat",25,0;
+ Announce "[" + GetGuildName(@GIDp1) + "] has surrendered Agit [" + GetCastleName("prtg_cas01.gat") + "]",0;
+ MapRespawnGuildID "prtg_cas01.gat",GetCastleData("prtg_cas01.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Abrai ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/prtg_cas02.txt b/npc/guild/old/prtg_cas02.txt
index cb38318c6..bd7469c5c 100644
--- a/npc/guild/old/prtg_cas02.txt
+++ b/npc/guild/old/prtg_cas02.txt
@@ -1,667 +1,667 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas02 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-prtg_cas02.gat,40,227,4 script Sbanhealt#p2-7::SbanhealtNW 722,{
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (@GIDp2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- break;
-}
-
-prtg_cas02.gat,46,227,4 duplicate(SbanhealtNW) Sbanhealt#p2-8 722
-prtg_cas02.gat,11,219,4 duplicate(SbanhealtNW) Sbanhealt#p2-9 722
-prtg_cas02.gat,11,214,4 duplicate(SbanhealtNW) Sbanhealt#p2-10 722
-prtg_cas02.gat,20,219,4 duplicate(SbanhealtNW) Sbanhealt#p2-11 722
-prtg_cas02.gat,20,214,4 duplicate(SbanhealtNW) Sbanhealt#p2-12 722
-prtg_cas02.gat,79,227,8 duplicate(SbanhealtNW) Sbanhealt#p2-13 722
-prtg_cas02.gat,70,227,8 duplicate(SbanhealtNW) Sbanhealt#p2-14 722
-prtg_cas02.gat,38,189,8 duplicate(SbanhealtNW) Sbanhealt#p2-15 722
-prtg_cas02.gat,34,189,8 duplicate(SbanhealtNW) Sbanhealt#p2-16 722
-prtg_cas02.gat,153,161,4 duplicate(SbanhealtNW) Sbanhealt#p2-17 722
-prtg_cas02.gat,162,161,4 duplicate(SbanhealtNW) Sbanhealt#p2-18 722
-
-//================================================
-// Kafra Service
-//================================================
-prtg_cas02.gat,71,36,4 script Kafra Service#prt2 117,{
- cutin "kafra_01",2;
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (getcharid(2) == @GIDp2) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp2) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome, ^ff0000" + GetGuildName(@GIDp2) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "prontera.gat",278,211;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("prtg_cas02.gat",9) == 1) break;
- disablenpc "Kafra Service#prt2";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-prtg_cas02.gat,84,72,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (getcharid(2) != @GIDp2) goto L1n;
- warp "gld_dun03.gat",164,268;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-//================================================
-// Guild Castle Manager
-//================================================
-
-prtg_cas02.gat,94,61,0 script Rhay 55,{
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (@GIDp2 == 0) goto LStart;
- if (getcharid(2) != @GIDp2) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDp2)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Rhay ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDp2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp2) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Rhay ]";
- mes "I am waiting for my master.";
- mes "Brave Player! follow your destiny!...";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Rhay ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDp2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Rhay ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDp2) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employement / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Rhay ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("prtg_cas02.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("prtg_cas02.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("prtg_cas02.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("prtg_cas02.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("prtg_cas02.gat",4);
- set @Economy,GetCastleData("prtg_cas02.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Rhay ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Rhay ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Rhay ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas02.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas02.gat",2,@Economy+1;
- mes "[ Rhay ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Rhay ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Rhay ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas02.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas02.gat",2,@Economy+1;
- mes "[ Rhay ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Rhay ]";
- mes " ";
- mes "^ff0000This Castle's Commerce Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Rhay ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("prtg_cas02.gat",5);
- set @Defence,GetCastleData("prtg_cas02.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Rhay ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Rhay ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Rhay ]";
- mes "As you wish, master.";
- close;
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas02.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas02.gat",3,@Deffence+1;
- mes "[ Rhay ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Rhay ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Rhay ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas02.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas02.gat",3,@Defence+1;
- mes "[ Rhay ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Rhay ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Rhay ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("prtg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
- mes "[ Rhay ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("prtg_cas02.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("prtg_cas02.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("prtg_cas02.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("prtg_cas02.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("prtg_cas02.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("prtg_cas02.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("prtg_cas02.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("prtg_cas02.gat",17) == 1) goto L4Error2;
- set @GDnum,17;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_9:
- mes "[ Rhay ]";
- mes "Would you really like to install guardian? You need 10000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Rhay ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "prtg_cas02.gat",@GDnum,1;
-SetCastleData "prtg_cas01.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_D02::GuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",7;
- mes "[ Rhay ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Rhay ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Rhay ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Rhay ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("prtg_cas02.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Rhay ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Rhay ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Rhay ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#prt2";
- SetCastleData "prtg_cas02.gat",9,1;
- mes "[ Rhay ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Rhay ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Rhay ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Rhay ]";
- mes "Would you like to dismiss the current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "Have I did anything wrong? If yes, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#prt2";
- SetCastleData "prtg_cas02.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Rhay ]";
-mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Rhay ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Rhay ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Rhay ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "prtg_cas02",15,209;
- L6_1:
- mes "[ Rhay ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Rhay ]";
- mes "Master!!";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Rhay ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Rhay ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "prtg_cas02.gat",1,0;
- SetCastleData "prtg_cas02.gat",2,0;
- SetCastleData "prtg_cas02.gat",3,0;
- SetCastleData "prtg_cas02.gat",4,0;
- SetCastleData "prtg_cas02.gat",5,0;
- SetCastleData "prtg_cas02.gat",6,0;
- SetCastleData "prtg_cas02.gat",7,0;
- SetCastleData "prtg_cas02.gat",8,0;
- SetCastleData "prtg_cas02.gat",9,0;
- SetCastleData "prtg_cas02.gat",10,0;
- SetCastleData "prtg_cas02.gat",11,0;
- SetCastleData "prtg_cas02.gat",12,0;
- SetCastleData "prtg_cas02.gat",13,0;
- SetCastleData "prtg_cas02.gat",14,0;
- SetCastleData "prtg_cas02.gat",15,0;
- SetCastleData "prtg_cas02.gat",16,0;
- SetCastleData "prtg_cas02.gat",17,0;
- SetCastleData "prtg_cas02.gat",18,0;
- SetCastleData "prtg_cas02.gat",19,0;
- SetCastleData "prtg_cas02.gat",20,0;
- SetCastleData "prtg_cas02.gat",21,0;
- SetCastleData "prtg_cas02.gat",22,0;
- SetCastleData "prtg_cas02.gat",23,0;
- SetCastleData "prtg_cas02.gat",24,0;
- SetCastleData "prtg_cas02.gat",25,0;
- Announce "[" + GetGuildName(@GIDp2) + "] has surrendered Agit [" + GetCastleName("prtg_cas02.gat") + "]",0;
- MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),7;
- break;
- L7_2:
- mes "[ Rhay ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas02 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+prtg_cas02.gat,40,227,4 script Sbanhealt#p2-7::SbanhealtNW 722,{
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (@GIDp2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ break;
+}
+
+prtg_cas02.gat,46,227,4 duplicate(SbanhealtNW) Sbanhealt#p2-8 722
+prtg_cas02.gat,11,219,4 duplicate(SbanhealtNW) Sbanhealt#p2-9 722
+prtg_cas02.gat,11,214,4 duplicate(SbanhealtNW) Sbanhealt#p2-10 722
+prtg_cas02.gat,20,219,4 duplicate(SbanhealtNW) Sbanhealt#p2-11 722
+prtg_cas02.gat,20,214,4 duplicate(SbanhealtNW) Sbanhealt#p2-12 722
+prtg_cas02.gat,79,227,8 duplicate(SbanhealtNW) Sbanhealt#p2-13 722
+prtg_cas02.gat,70,227,8 duplicate(SbanhealtNW) Sbanhealt#p2-14 722
+prtg_cas02.gat,38,189,8 duplicate(SbanhealtNW) Sbanhealt#p2-15 722
+prtg_cas02.gat,34,189,8 duplicate(SbanhealtNW) Sbanhealt#p2-16 722
+prtg_cas02.gat,153,161,4 duplicate(SbanhealtNW) Sbanhealt#p2-17 722
+prtg_cas02.gat,162,161,4 duplicate(SbanhealtNW) Sbanhealt#p2-18 722
+
+//================================================
+// Kafra Service
+//================================================
+prtg_cas02.gat,71,36,4 script Kafra Service#prt2 117,{
+ cutin "kafra_01",2;
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (getcharid(2) == @GIDp2) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp2) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome, ^ff0000" + GetGuildName(@GIDp2) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "prontera.gat",278,211;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("prtg_cas02.gat",9) == 1) break;
+ disablenpc "Kafra Service#prt2";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+prtg_cas02.gat,84,72,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (getcharid(2) != @GIDp2) goto L1n;
+ warp "gld_dun03.gat",164,268;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+//================================================
+// Guild Castle Manager
+//================================================
+
+prtg_cas02.gat,94,61,0 script Rhay 55,{
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (@GIDp2 == 0) goto LStart;
+ if (getcharid(2) != @GIDp2) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDp2)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Rhay ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDp2) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp2) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Rhay ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! follow your destiny!...";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Rhay ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDp2) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Rhay ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDp2) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employement / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Rhay ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("prtg_cas02.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("prtg_cas02.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("prtg_cas02.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("prtg_cas02.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("prtg_cas02.gat",4);
+ set @Economy,GetCastleData("prtg_cas02.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Rhay ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Rhay ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Rhay ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas02.gat",2,@Economy+1;
+ mes "[ Rhay ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Rhay ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Rhay ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas02.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas02.gat",2,@Economy+1;
+ mes "[ Rhay ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Rhay ]";
+ mes " ";
+ mes "^ff0000This Castle's Commerce Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Rhay ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("prtg_cas02.gat",5);
+ set @Defence,GetCastleData("prtg_cas02.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Rhay ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Rhay ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Rhay ]";
+ mes "As you wish, master.";
+ close;
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas02.gat",3,@Deffence+1;
+ mes "[ Rhay ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Rhay ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Rhay ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas02.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas02.gat",3,@Defence+1;
+ mes "[ Rhay ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Rhay ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Rhay ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("prtg_cas02.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+ mes "[ Rhay ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("prtg_cas02.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("prtg_cas02.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("prtg_cas02.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("prtg_cas02.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("prtg_cas02.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("prtg_cas02.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("prtg_cas02.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("prtg_cas02.gat",17) == 1) goto L4Error2;
+ set @GDnum,17;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_9:
+ mes "[ Rhay ]";
+ mes "Would you really like to install guardian? You need 10000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Rhay ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "prtg_cas02.gat",@GDnum,1;
+SetCastleData "prtg_cas01.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "prtg_cas02.gat",75,71,"Soldier Guardian",1287,1,"Guardian_D02::GuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas02.gat",56,31,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas02.gat",42,223,"Soldier Guardian",1287,1,"Guardian_D02::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas02.gat",44,195,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas02.gat",197,22,"Archer Guardian",1285,1,"Guardian_D02::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas02.gat",68,71,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas02.gat",202,27,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas02.gat",59,24,"Knight Guardian",1286,1,"Guardian_D02::OnGuardianDied",7;
+ mes "[ Rhay ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Rhay ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Rhay ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Rhay ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("prtg_cas02.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Rhay ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Rhay ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Rhay ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#prt2";
+ SetCastleData "prtg_cas02.gat",9,1;
+ mes "[ Rhay ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Rhay ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Rhay ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Rhay ]";
+ mes "Would you like to dismiss the current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "Have I did anything wrong? If yes, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#prt2";
+ SetCastleData "prtg_cas02.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Rhay ]";
+mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Rhay ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Rhay ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Rhay ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "prtg_cas02",15,209;
+ L6_1:
+ mes "[ Rhay ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Rhay ]";
+ mes "Master!!";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Rhay ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Rhay ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "prtg_cas02.gat",1,0;
+ SetCastleData "prtg_cas02.gat",2,0;
+ SetCastleData "prtg_cas02.gat",3,0;
+ SetCastleData "prtg_cas02.gat",4,0;
+ SetCastleData "prtg_cas02.gat",5,0;
+ SetCastleData "prtg_cas02.gat",6,0;
+ SetCastleData "prtg_cas02.gat",7,0;
+ SetCastleData "prtg_cas02.gat",8,0;
+ SetCastleData "prtg_cas02.gat",9,0;
+ SetCastleData "prtg_cas02.gat",10,0;
+ SetCastleData "prtg_cas02.gat",11,0;
+ SetCastleData "prtg_cas02.gat",12,0;
+ SetCastleData "prtg_cas02.gat",13,0;
+ SetCastleData "prtg_cas02.gat",14,0;
+ SetCastleData "prtg_cas02.gat",15,0;
+ SetCastleData "prtg_cas02.gat",16,0;
+ SetCastleData "prtg_cas02.gat",17,0;
+ SetCastleData "prtg_cas02.gat",18,0;
+ SetCastleData "prtg_cas02.gat",19,0;
+ SetCastleData "prtg_cas02.gat",20,0;
+ SetCastleData "prtg_cas02.gat",21,0;
+ SetCastleData "prtg_cas02.gat",22,0;
+ SetCastleData "prtg_cas02.gat",23,0;
+ SetCastleData "prtg_cas02.gat",24,0;
+ SetCastleData "prtg_cas02.gat",25,0;
+ Announce "[" + GetGuildName(@GIDp2) + "] has surrendered Agit [" + GetCastleName("prtg_cas02.gat") + "]",0;
+ MapRespawnGuildID "prtg_cas02.gat",GetCastleData("prtg_cas02.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Rhay ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+
+}
diff --git a/npc/guild/old/prtg_cas03.txt b/npc/guild/old/prtg_cas03.txt
index ef81bbef9..87782693a 100644
--- a/npc/guild/old/prtg_cas03.txt
+++ b/npc/guild/old/prtg_cas03.txt
@@ -1,667 +1,667 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas03 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-
-prtg_cas03.gat,168,28,4 script Lazrigees#p3-7::LazrigeesNW 722,{
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (@GIDp3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- break;
-}
-
-prtg_cas03.gat,182,28,4 duplicate(LazrigeesNW) Lazrigees#p3-8 722
-prtg_cas03.gat,43,50,4 duplicate(LazrigeesNW) Lazrigees#p3-9 722
-prtg_cas03.gat,48,50,4 duplicate(LazrigeesNW) Lazrigees#p3-10 722
-prtg_cas03.gat,43,58,4 duplicate(LazrigeesNW) Lazrigees#p3-11 722
-prtg_cas03.gat,48,58,4 duplicate(LazrigeesNW) Lazrigees#p3-12 722
-prtg_cas03.gat,158,210,4 duplicate(LazrigeesNW) Lazrigees#p3-13 722
-prtg_cas03.gat,169,210,4 duplicate(LazrigeesNW) Lazrigees#p3-14 722
-prtg_cas03.gat,162,201,4 duplicate(LazrigeesNW) Lazrigees#p3-15 722
-prtg_cas03.gat,165,201,4 duplicate(LazrigeesNW) Lazrigees#p3-16 722
-
-//================================================
-// Kafra Service
-//================================================
-prtg_cas03.gat,181,215,4 script Kafra Service#prt3 117,{
- cutin "kafra_01",2;
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (getcharid(2) == @GIDp3) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp3) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome. ^ff0000" + GetGuildName(@GIDp3) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "prontera.gat",278,211;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("prtg_cas03.gat",9) == 1) break;
- disablenpc "Kafra Service#prt3";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-
-prtg_cas03.gat,5,70,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (getcharid(2) != @GIDp3) goto L1n;
- warp "gld_dun03.gat",164,179;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-prtg_cas03.gat,51,100,4 script Stick 55,{
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (@GIDp3 == 0) goto LStart;
- if (getcharid(2) != @GIDp3) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDp3)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Stick ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDp3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp3) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Stick ]";
- mes "I am waiting for my master.";
- mes "Brave Player! follow your destiny!...";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Stick ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDp3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Stick ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDp3) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Stick ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("prtg_cas03.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("prtg_cas03.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("prtg_cas03.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("prtg_cas03.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("prtg_cas03.gat",4);
- set @Economy,GetCastleData("prtg_cas03.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Stick ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Stick ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Stick ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas03.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas03.gat",2,@Economy+1;
- mes "[ Stick ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Stick ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Stick ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas03.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas03.gat",2,@Economy+1;
- mes "[ Stick ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Stick ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Stick ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("prtg_cas03.gat",5);
- set @Defence,GetCastleData("prtg_cas03.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Stick ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Stick ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Stick ]";
- mes "As you wish, master.";
- close;
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas03.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas03.gat",3,@Defence+1;
- mes "[ Stick ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Stick ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Stick ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas03.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas03.gat",3,@Defence+1;
- mes "[ Stick ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Stick ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Stick ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("prtg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Stick ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("prtg_cas03.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("prtg_cas03.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("prtg_cas03.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("prtg_cas03.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("prtg_cas03.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("prtg_cas03.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("prtg_cas03.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("prtg_cas03.gat",17) == 1) goto L4Error2;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_9:
- mes "[ Stick ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Stick ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "prtg_cas03.gat",@GDnum,1;
- SetCastleData "prtg_cas03.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",7;
- mes "[ Stick ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Stick ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Stick ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Stick ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("prtg_cas03.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Stick ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Stick ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Stick ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#prt3";
- SetCastleData "prtg_cas03.gat",9,1;
- mes "[ Stick ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Stick ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Stick ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Stick ]";
- mes "Would you like to dismiss current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "What have I done wrong? if so, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#prt3";
- SetCastleData "prtg_cas03.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Stick ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Stick ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Stick ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Stick ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "prtg_cas03",189,132;
- L6_1:
- mes "[ Stick ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Stick ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Stick ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Stick ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "prtg_cas03.gat",1,0;
- SetCastleData "prtg_cas03.gat",2,0;
- SetCastleData "prtg_cas03.gat",3,0;
- SetCastleData "prtg_cas03.gat",4,0;
- SetCastleData "prtg_cas03.gat",5,0;
- SetCastleData "prtg_cas03.gat",6,0;
- SetCastleData "prtg_cas03.gat",7,0;
- SetCastleData "prtg_cas03.gat",8,0;
- SetCastleData "prtg_cas03.gat",9,0;
- SetCastleData "prtg_cas03.gat",10,0;
- SetCastleData "prtg_cas03.gat",11,0;
- SetCastleData "prtg_cas03.gat",12,0;
- SetCastleData "prtg_cas03.gat",13,0;
- SetCastleData "prtg_cas03.gat",14,0;
- SetCastleData "prtg_cas03.gat",15,0;
- SetCastleData "prtg_cas03.gat",16,0;
- SetCastleData "prtg_cas03.gat",17,0;
- SetCastleData "prtg_cas03.gat",18,0;
- SetCastleData "prtg_cas03.gat",19,0;
- SetCastleData "prtg_cas03.gat",20,0;
- SetCastleData "prtg_cas03.gat",21,0;
- SetCastleData "prtg_cas03.gat",22,0;
- SetCastleData "prtg_cas03.gat",23,0;
- SetCastleData "prtg_cas03.gat",24,0;
- SetCastleData "prtg_cas03.gat",25,0;
- Announce "[" + GetGuildName(@GIDp3) + "] has surrendered Agit [" + GetCastleName("prtg_cas03.gat") + "]",0;
- MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),7;
- break;
- L7_2:
- mes "[ Stick ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas03 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+
+prtg_cas03.gat,168,28,4 script Lazrigees#p3-7::LazrigeesNW 722,{
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (@GIDp3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ break;
+}
+
+prtg_cas03.gat,182,28,4 duplicate(LazrigeesNW) Lazrigees#p3-8 722
+prtg_cas03.gat,43,50,4 duplicate(LazrigeesNW) Lazrigees#p3-9 722
+prtg_cas03.gat,48,50,4 duplicate(LazrigeesNW) Lazrigees#p3-10 722
+prtg_cas03.gat,43,58,4 duplicate(LazrigeesNW) Lazrigees#p3-11 722
+prtg_cas03.gat,48,58,4 duplicate(LazrigeesNW) Lazrigees#p3-12 722
+prtg_cas03.gat,158,210,4 duplicate(LazrigeesNW) Lazrigees#p3-13 722
+prtg_cas03.gat,169,210,4 duplicate(LazrigeesNW) Lazrigees#p3-14 722
+prtg_cas03.gat,162,201,4 duplicate(LazrigeesNW) Lazrigees#p3-15 722
+prtg_cas03.gat,165,201,4 duplicate(LazrigeesNW) Lazrigees#p3-16 722
+
+//================================================
+// Kafra Service
+//================================================
+prtg_cas03.gat,181,215,4 script Kafra Service#prt3 117,{
+ cutin "kafra_01",2;
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (getcharid(2) == @GIDp3) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp3) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome. ^ff0000" + GetGuildName(@GIDp3) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "prontera.gat",278,211;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("prtg_cas03.gat",9) == 1) break;
+ disablenpc "Kafra Service#prt3";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+
+prtg_cas03.gat,5,70,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (getcharid(2) != @GIDp3) goto L1n;
+ warp "gld_dun03.gat",164,179;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+prtg_cas03.gat,51,100,4 script Stick 55,{
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (@GIDp3 == 0) goto LStart;
+ if (getcharid(2) != @GIDp3) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDp3)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Stick ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDp3) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp3) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Stick ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! follow your destiny!...";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Stick ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDp3) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Stick ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDp3) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Stick ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("prtg_cas03.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("prtg_cas03.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("prtg_cas03.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("prtg_cas03.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("prtg_cas03.gat",4);
+ set @Economy,GetCastleData("prtg_cas03.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Stick ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Stick ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Stick ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas03.gat",2,@Economy+1;
+ mes "[ Stick ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Stick ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Stick ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas03.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas03.gat",2,@Economy+1;
+ mes "[ Stick ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Stick ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Stick ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("prtg_cas03.gat",5);
+ set @Defence,GetCastleData("prtg_cas03.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Stick ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Stick ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Stick ]";
+ mes "As you wish, master.";
+ close;
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas03.gat",3,@Defence+1;
+ mes "[ Stick ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Stick ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Stick ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas03.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas03.gat",3,@Defence+1;
+ mes "[ Stick ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Stick ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Stick ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("prtg_cas03.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Stick ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("prtg_cas03.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("prtg_cas03.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("prtg_cas03.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("prtg_cas03.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("prtg_cas03.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("prtg_cas03.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("prtg_cas03.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("prtg_cas03.gat",17) == 1) goto L4Error2;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_9:
+ mes "[ Stick ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Stick ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "prtg_cas03.gat",@GDnum,1;
+ SetCastleData "prtg_cas03.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "prtg_cas03.gat",165,55,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas03.gat",161,181,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas03.gat",165,199,"Soldier Guardian",1287,1,"Guardian_D03::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas03.gat",169,22,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas03.gat",165,191,"Archer Guardian",1285,1,"Guardian_D03::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas03.gat",175,13,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas03.gat",169,180,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas03.gat",142,217,"Knight Guardian",1286,1,"Guardian_D03::OnGuardianDied",7;
+ mes "[ Stick ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Stick ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Stick ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Stick ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("prtg_cas03.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Stick ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Stick ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Stick ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#prt3";
+ SetCastleData "prtg_cas03.gat",9,1;
+ mes "[ Stick ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Stick ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Stick ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Stick ]";
+ mes "Would you like to dismiss current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "What have I done wrong? if so, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#prt3";
+ SetCastleData "prtg_cas03.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Stick ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Stick ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Stick ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Stick ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "prtg_cas03",189,132;
+ L6_1:
+ mes "[ Stick ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Stick ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Stick ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Stick ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "prtg_cas03.gat",1,0;
+ SetCastleData "prtg_cas03.gat",2,0;
+ SetCastleData "prtg_cas03.gat",3,0;
+ SetCastleData "prtg_cas03.gat",4,0;
+ SetCastleData "prtg_cas03.gat",5,0;
+ SetCastleData "prtg_cas03.gat",6,0;
+ SetCastleData "prtg_cas03.gat",7,0;
+ SetCastleData "prtg_cas03.gat",8,0;
+ SetCastleData "prtg_cas03.gat",9,0;
+ SetCastleData "prtg_cas03.gat",10,0;
+ SetCastleData "prtg_cas03.gat",11,0;
+ SetCastleData "prtg_cas03.gat",12,0;
+ SetCastleData "prtg_cas03.gat",13,0;
+ SetCastleData "prtg_cas03.gat",14,0;
+ SetCastleData "prtg_cas03.gat",15,0;
+ SetCastleData "prtg_cas03.gat",16,0;
+ SetCastleData "prtg_cas03.gat",17,0;
+ SetCastleData "prtg_cas03.gat",18,0;
+ SetCastleData "prtg_cas03.gat",19,0;
+ SetCastleData "prtg_cas03.gat",20,0;
+ SetCastleData "prtg_cas03.gat",21,0;
+ SetCastleData "prtg_cas03.gat",22,0;
+ SetCastleData "prtg_cas03.gat",23,0;
+ SetCastleData "prtg_cas03.gat",24,0;
+ SetCastleData "prtg_cas03.gat",25,0;
+ Announce "[" + GetGuildName(@GIDp3) + "] has surrendered Agit [" + GetCastleName("prtg_cas03.gat") + "]",0;
+ MapRespawnGuildID "prtg_cas03.gat",GetCastleData("prtg_cas03.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Stick ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
+}
diff --git a/npc/guild/old/prtg_cas04.txt b/npc/guild/old/prtg_cas04.txt
index 8579401ae..9fec3417b 100644
--- a/npc/guild/old/prtg_cas04.txt
+++ b/npc/guild/old/prtg_cas04.txt
@@ -1,666 +1,666 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas04 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-prtg_cas04.gat,82,29,4 script Squagul#p4-7::SquagulNW 722,{
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (@GIDp4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- break;
-}
-
-prtg_cas04.gat,75,29,4 duplicate(SquagulNW) Squagul#p4-8 722
-prtg_cas04.gat,75,27,4 duplicate(SquagulNW) Squagul#p4-9 722
-prtg_cas04.gat,82,27,4 duplicate(SquagulNW) Squagul#p4-10 722
-prtg_cas04.gat,59,29,4 duplicate(SquagulNW) Squagul#p4-11 722
-prtg_cas04.gat,67,29,4 duplicate(SquagulNW) Squagul#p4-12 722
-prtg_cas04.gat,258,25,4 duplicate(SquagulNW) Squagul#p4-13 722
-prtg_cas04.gat,258,20,4 duplicate(SquagulNW) Squagul#p4-14 722
-prtg_cas04.gat,263,20,4 duplicate(SquagulNW) Squagul#p4-15 722
-prtg_cas04.gat,263,27,4 duplicate(SquagulNW) Squagul#p4-16 722
-
-//================================================
-// Kafra Service
-//================================================
-prtg_cas04.gat,258,247,4 script Kafra Service#prt4 117,{
- cutin "kafra_01",2;
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (getcharid(2) == @GIDp4) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp4) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome. ^ff0000" + GetGuildName(@GIDp4) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "prontera.gat",278,211;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
-//No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("prtg_cas04.gat",9) == 1) break;
- disablenpc "Kafra Service#prt4";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-
-prtg_cas04.gat,56,283,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (getcharid(2) != @GIDp4) goto L1n;
- warp "gld_dun03.gat",268,203;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-prtg_cas04.gat,259,265,4 script Bandred 55,{
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (@GIDp4 == 0) goto LStart;
- if (getcharid(2) != @GIDp4) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDp4)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Bandred ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDp4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp4) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Bandred ]";
- mes "I am waiting for my master.";
- mes "Brave Player! follow your destiny!...";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Bandred ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDp4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Bandred ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDp4) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Bandred ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("prtg_cas04.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("prtg_cas04.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("prtg_cas04.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("prtg_cas04.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("prtg_cas04.gat",4);
- set @Economy,GetCastleData("prtg_cas04.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Bandred ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Bandred ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Bandred ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas04.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas04.gat",2,@Economy+1;
- mes "[ Bandred ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Bandred ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Bandred ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas04.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas04.gat",2,@Economy+1;
- mes "[ Bandred ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Bandred ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Bandred ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("prtg_cas04.gat",5);
- set @Defence,GetCastleData("prtg_cas04.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Bandred ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Bandred ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Bandred ]";
- mes "As you wish, master.";
- close;
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas04.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas04.gat",3,@Defence+1;
- mes "[ Bandred ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Bandred ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Bandred ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas04.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas04.gat",3,@Defence+1;
- mes "[ Bandred ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Bandred ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Bandred ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("prtg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Bandred ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("prtg_cas04.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("prtg_cas04.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("prtg_cas04.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("prtg_cas04.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("prtg_cas04.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("prtg_cas04.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("prtg_cas04.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("prtg_cas04.gat",17) == 1) goto L4Error2;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_9:
- mes "[ Bandred ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Bandred ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "prtg_cas04.gat",@GDnum,1;
- SetCastleData "prtg_cas04.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
- mes "[ Bandred ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Bandred ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Bandred ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Bandred ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("prtg_cas04.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Bandred ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Bandred ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Bandred ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#prt4";
- SetCastleData "prtg_cas04.gat",9,1;
- mes "[ Bandred ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Bandred ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Bandred ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Bandred ]";
- mes "Would you like to dismiss current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "What have I done wrong? if so, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#prt4";
- SetCastleData "prtg_cas04.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Bandred ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Bandred ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Bandred ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Bandred ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "prtg_cas04",271,162;
- L6_1:
- mes "[ Bandred ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Bandred ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Bandred ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Bandred ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "prtg_cas04.gat",1,0;
- SetCastleData "prtg_cas04.gat",2,0;
- SetCastleData "prtg_cas04.gat",3,0;
- SetCastleData "prtg_cas04.gat",4,0;
- SetCastleData "prtg_cas04.gat",5,0;
- SetCastleData "prtg_cas04.gat",6,0;
- SetCastleData "prtg_cas04.gat",7,0;
- SetCastleData "prtg_cas04.gat",8,0;
- SetCastleData "prtg_cas04.gat",9,0;
- SetCastleData "prtg_cas04.gat",10,0;
- SetCastleData "prtg_cas04.gat",11,0;
- SetCastleData "prtg_cas04.gat",12,0;
- SetCastleData "prtg_cas04.gat",13,0;
- SetCastleData "prtg_cas04.gat",14,0;
- SetCastleData "prtg_cas04.gat",15,0;
- SetCastleData "prtg_cas04.gat",16,0;
- SetCastleData "prtg_cas04.gat",17,0;
- SetCastleData "prtg_cas04.gat",18,0;
- SetCastleData "prtg_cas04.gat",19,0;
- SetCastleData "prtg_cas04.gat",20,0;
- SetCastleData "prtg_cas04.gat",21,0;
- SetCastleData "prtg_cas04.gat",22,0;
- SetCastleData "prtg_cas04.gat",23,0;
- SetCastleData "prtg_cas04.gat",24,0;
- SetCastleData "prtg_cas04.gat",25,0;
- Announce "[" + GetGuildName(@GIDp4) + "] has surrendered Agit [" + GetCastleName("prtg_cas04.gat") + "]",0;
- MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),7;
- break;
- L7_2:
- mes "[ Bandred ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas04 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+prtg_cas04.gat,82,29,4 script Squagul#p4-7::SquagulNW 722,{
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (@GIDp4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ break;
+}
+
+prtg_cas04.gat,75,29,4 duplicate(SquagulNW) Squagul#p4-8 722
+prtg_cas04.gat,75,27,4 duplicate(SquagulNW) Squagul#p4-9 722
+prtg_cas04.gat,82,27,4 duplicate(SquagulNW) Squagul#p4-10 722
+prtg_cas04.gat,59,29,4 duplicate(SquagulNW) Squagul#p4-11 722
+prtg_cas04.gat,67,29,4 duplicate(SquagulNW) Squagul#p4-12 722
+prtg_cas04.gat,258,25,4 duplicate(SquagulNW) Squagul#p4-13 722
+prtg_cas04.gat,258,20,4 duplicate(SquagulNW) Squagul#p4-14 722
+prtg_cas04.gat,263,20,4 duplicate(SquagulNW) Squagul#p4-15 722
+prtg_cas04.gat,263,27,4 duplicate(SquagulNW) Squagul#p4-16 722
+
+//================================================
+// Kafra Service
+//================================================
+prtg_cas04.gat,258,247,4 script Kafra Service#prt4 117,{
+ cutin "kafra_01",2;
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (getcharid(2) == @GIDp4) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp4) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome. ^ff0000" + GetGuildName(@GIDp4) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "prontera.gat",278,211;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+//No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("prtg_cas04.gat",9) == 1) break;
+ disablenpc "Kafra Service#prt4";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+
+prtg_cas04.gat,56,283,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (getcharid(2) != @GIDp4) goto L1n;
+ warp "gld_dun03.gat",268,203;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+prtg_cas04.gat,259,265,4 script Bandred 55,{
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (@GIDp4 == 0) goto LStart;
+ if (getcharid(2) != @GIDp4) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDp4)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Bandred ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDp4) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp4) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Bandred ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! follow your destiny!...";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Bandred ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDp4) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Bandred ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDp4) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Bandred ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("prtg_cas04.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("prtg_cas04.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("prtg_cas04.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("prtg_cas04.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("prtg_cas04.gat",4);
+ set @Economy,GetCastleData("prtg_cas04.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Bandred ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Bandred ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Bandred ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas04.gat",2,@Economy+1;
+ mes "[ Bandred ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Bandred ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Bandred ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas04.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas04.gat",2,@Economy+1;
+ mes "[ Bandred ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Bandred ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Bandred ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("prtg_cas04.gat",5);
+ set @Defence,GetCastleData("prtg_cas04.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Bandred ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Bandred ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Bandred ]";
+ mes "As you wish, master.";
+ close;
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas04.gat",3,@Defence+1;
+ mes "[ Bandred ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Bandred ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Bandred ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas04.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas04.gat",3,@Defence+1;
+ mes "[ Bandred ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Bandred ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Bandred ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("prtg_cas04.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Bandred ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("prtg_cas04.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("prtg_cas04.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("prtg_cas04.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("prtg_cas04.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("prtg_cas04.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("prtg_cas04.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("prtg_cas04.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("prtg_cas04.gat",17) == 1) goto L4Error2;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_9:
+ mes "[ Bandred ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Bandred ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "prtg_cas04.gat",@GDnum,1;
+ SetCastleData "prtg_cas04.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "prtg_cas04.gat",30,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas04.gat",38,234,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas04.gat",63,26,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas04.gat",253,274,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas04.gat",269,256,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas04.gat",267,271,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas04.gat",34,281,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas04.gat",33,232,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
+ mes "[ Bandred ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Bandred ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Bandred ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Bandred ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("prtg_cas04.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Bandred ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Bandred ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Bandred ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#prt4";
+ SetCastleData "prtg_cas04.gat",9,1;
+ mes "[ Bandred ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Bandred ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Bandred ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Bandred ]";
+ mes "Would you like to dismiss current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "What have I done wrong? if so, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#prt4";
+ SetCastleData "prtg_cas04.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Bandred ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Bandred ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Bandred ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Bandred ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "prtg_cas04",271,162;
+ L6_1:
+ mes "[ Bandred ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Bandred ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Bandred ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Bandred ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "prtg_cas04.gat",1,0;
+ SetCastleData "prtg_cas04.gat",2,0;
+ SetCastleData "prtg_cas04.gat",3,0;
+ SetCastleData "prtg_cas04.gat",4,0;
+ SetCastleData "prtg_cas04.gat",5,0;
+ SetCastleData "prtg_cas04.gat",6,0;
+ SetCastleData "prtg_cas04.gat",7,0;
+ SetCastleData "prtg_cas04.gat",8,0;
+ SetCastleData "prtg_cas04.gat",9,0;
+ SetCastleData "prtg_cas04.gat",10,0;
+ SetCastleData "prtg_cas04.gat",11,0;
+ SetCastleData "prtg_cas04.gat",12,0;
+ SetCastleData "prtg_cas04.gat",13,0;
+ SetCastleData "prtg_cas04.gat",14,0;
+ SetCastleData "prtg_cas04.gat",15,0;
+ SetCastleData "prtg_cas04.gat",16,0;
+ SetCastleData "prtg_cas04.gat",17,0;
+ SetCastleData "prtg_cas04.gat",18,0;
+ SetCastleData "prtg_cas04.gat",19,0;
+ SetCastleData "prtg_cas04.gat",20,0;
+ SetCastleData "prtg_cas04.gat",21,0;
+ SetCastleData "prtg_cas04.gat",22,0;
+ SetCastleData "prtg_cas04.gat",23,0;
+ SetCastleData "prtg_cas04.gat",24,0;
+ SetCastleData "prtg_cas04.gat",25,0;
+ Announce "[" + GetGuildName(@GIDp4) + "] has surrendered Agit [" + GetCastleName("prtg_cas04.gat") + "]",0;
+ MapRespawnGuildID "prtg_cas04.gat",GetCastleData("prtg_cas04.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Bandred ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
} \ No newline at end of file
diff --git a/npc/guild/old/prtg_cas05.txt b/npc/guild/old/prtg_cas05.txt
index 8f39492e0..6fb3309b9 100644
--- a/npc/guild/old/prtg_cas05.txt
+++ b/npc/guild/old/prtg_cas05.txt
@@ -1,664 +1,664 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas05 script
-//===== By: ==================================================
-//= jAthena - kalen (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru, ho|yAnge|X, and Valaris
-//============================================================
-
-prtg_cas05.gat,19,247,4 script Guindull#p5-7::GuindullNW 722,{
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (@GIDp5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP04:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- break;
-}
-
-prtg_cas05.gat,19,243,4 duplicate(GuindullNW) Guindull#p5-8 722
-prtg_cas05.gat,26,247,4 duplicate(GuindullNW) Guindull#p5-9 722
-prtg_cas05.gat,26,243,4 duplicate(GuindullNW) Guindull#p5-10 722
-prtg_cas05.gat,249,289,4 duplicate(GuindullNW) Guindull#p5-11 722
-prtg_cas05.gat,256,289,4 duplicate(GuindullNW) Guindull#p5-12 722
-prtg_cas05.gat,253,271,4 duplicate(GuindullNW) Guindull#p5-13 722
-prtg_cas05.gat,273,257,4 duplicate(GuindullNW) Guindull#p5-14 722
-
-//================================================
-// Kafra Service
-//================================================
-prtg_cas05.gat,52,41,4 script Kafra Service#prt5 117,{
- cutin "kafra_01",2;
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (getcharid(2) == @GIDp5) goto LStartg;
- mes "[Kafra Service]";
- mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp5) + "^000000 members. Please use different Kafra Service. Thank you.";
- goto L_EXIT;
-LStartg:
- mes "[Kafra Service]";
- mes "Welcome. ^ff0000" + GetGuildName(@GIDp5) + "^000000 members";
- mes "We will stay with you wherever you go";
- next;
- menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
-//================================================
-// Storage
-//================================================
-L2:
- if(getskilllv(1) < 6) goto Lerror2_1;
- openstorage;
- goto L_EXIT;
- Lerror2_1:
- mes "[Kafra Service]";
- mes "You must have lvl 6 or higher novice skill.";
- goto L_EXIT;
-//================================================
-// Teleport Service
-//================================================
-L3:
- mes "[Kafra Service]";
- mes "Please confirm your destination.";
- next;
- menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
- L3_1:
- if (Zeny < 200) goto Lerror3;
- set Zeny,Zeny-200;
- warp "prontera.gat",278,211;
-break;
- L3_2:
- mes "[Kafra Service]";
- mes "Kafra Service always trying to offer best service for you.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- Lerror3:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough Zeny to use the teleport service.";
- goto L_EXIT;
-//================================================
-// Cart Rental
-//================================================
-L4:
- if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
- if (checkcart(0) == 1) goto Lerror4_3;
- mes "[Kafra Service]";
- mes "The cart rental fee is 800 Zeny.";
- mes "Would you like to rent a cart?";
- next;
- menu "Rent a Cart",L4_1,"Cancel",-;
- mes "[Kafra Service]";
- mes "We always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
- L4_1:
- If(getskilllv(39) == 0) goto Lerror4_4;
- if (Zeny < 800) goto Lerror4_2;
- set Zeny,Zeny-800;
- setcart;
- goto L_EXIT;
- //Not a merchant class
- Lerror4_1:
- mes "[Kafra Service]";
- mes "Sorry, the cart rental service is only for the merchant class.";
- goto L_EXIT;
- //Not enough zenny
- Lerror4_2:
- mes "[Kafra Service]";
- mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
- goto L_EXIT;
- //Already have cart
- Lerror4_3:
- mes "[Kafra Service]";
- mes "Sorry, you already have a cart now.";
- mes "Return when you dont have one and are in need of our service.";
- goto L_EXIT;
- //No Pushcart Skill
- Lerror4_4:
- mes "[Kafra Service]";
- mes "Sorry, you need to learn the skill [Pushcart] first";
- goto L_EXIT;
-//================================================
-// Cancel
-//================================================
-L7:
- mes "[Kafra Service]";
- mes "We will always try to serve you better.";
- mes "Thank you for using our service.";
- goto L_EXIT;
-L_EXIT:
- cutin "kafra_01",255;
- close;
-OnInit:
- if (GetCastleData("prtg_cas05.gat",9) == 1) break;
- disablenpc "Kafra Service#prt5";
- break;
-}
-
-//================================================
-// Guild Dungeon Switch
-//================================================
-
-prtg_cas05.gat,56,283,0 script Switch 111,{
- mes "[ Vibration of Man's Voice ]";
- mes " ' Only brave man get to lead the guild base.. '";
- next;
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",-,"No",L2;
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (getcharid(2) != @GIDp5) goto L1n;
- warp "gld_dun03.gat",199,28;
- break;
-L1n:
- mes "[ Vibration of Man's Voice ]";
- mes " ' ... ' ";
-L2:
- close;
-}
-
-//================================================
-// Guild Castle Manager
-//================================================
-
-prtg_cas05.gat,36,37,4 script Reiner 55,{
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (@GIDp5 == 0) goto LStart;
- if (getcharid(2) != @GIDp5) goto LStart2;
- if (strcharinfo(0) == getguildmaster(@GIDp5)) goto LStart3;
- goto LStart1;
-
-//================================================
-// Guild Members
-//================================================
-LStart1:
- mes "[ Reiner ]";
- mes "You're not ^ff0000" + getguildmaster(@GIDp5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp5) + "^000000 's command only";
- close;
-//================================================
-// Castle not owned
-//================================================
-LStart:
- mes "[ Reiner ]";
- mes "I am waiting for my master.";
- mes "Brave Player! follow your destiny!...";
- close;
-//================================================
-// Non-Guild Members
-//================================================
-LStart2:
- mes "[ Reiner ]";
- mes "I am here to follow ^ff0000" + getguildmaster(@GIDp5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
- close;
-//================================================
-// Guild Leader
-//================================================
-LStart3:
- mes "[ Reiner ]";
- mes "Welcome Master ^ff0000" + getguildmaster(@GIDp5) + "^000000 !";
- mes "I'll do anything you tell me to do sir!.";
- next;
- menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
-//-----------------------------------------------------------
-//================================================
-// Guild Base Briefing
-//================================================
-L1:
- mes "[ Reiner ]";
- mes "Guild Base Investment Information.";
- mes " ";
- mes "Current Commerce Investment is : " + GetCastleData("prtg_cas05.gat",2) + " points.";
- mes "^0000ff - You have invested " + GetCastleData("prtg_cas05.gat",4) + "times today.^000000";
- mes " ";
- mes "Current Defence Investment is : " + GetCastleData("prtg_cas05.gat",3) + "points.";
- mes "^0000ff- You have invested" + GetCastleData("prtg_cas05.gat",5) + "times today.^000000";
- mes " ";
- mes "That is about it.";
- close;
-//================================================
-// Commerce Investment
-//================================================
-L2:
- set @TriggerE,GetCastleData("prtg_cas05.gat",4);
- set @Economy,GetCastleData("prtg_cas05.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;
- if(@TriggerE == 0) goto L2_1;
- if(@TriggerE == 1) goto L2_1_2;
- if(@Economy >= 100) goto L2_2;
- mes "[ Reiner ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-L2_1:
- if(@TriggerE == 1) goto L2_1_2;
- mes "[ Reiner ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Commerce.",L2_1_1,"Cancel.",-;
- mes "[ Reiner ]";
- mes "As you wish, master.";
- close;
- L2_1_1:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas05.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas05.gat",2,@Economy+1;
- mes "[ Reiner ]";
- mes "You have invested successfully.";
- close;
-
-L2_1_2:
- set $eco_invest,$eco_invest*4;
- mes "[ Reiner ]";
- mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Commerce.",L2_1_3,"Cancel.",-;
- mes "[ Reiner ]";
- mes "As you wish, master.";
- close;
- L2_1_3:
- if(Zeny < $eco_invest) goto L2_error;
- set Zeny,Zeny-$eco_invest;
- SetCastleData "prtg_cas05.gat",4,@TriggerE+1;
- SetCastleData "prtg_cas05.gat",2,@Economy+1;
- mes "[ Reiner ]";
- mes "You have invested successfully";
- close;
-
-L2_2:
- mes "[ Reiner ]";
- mes " ";
- mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-
-L2_error:
- mes "[ Reiner ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Defence Investment
-//================================================
-L3:
- set @TriggerD,GetCastleData("prtg_cas05.gat",5);
- set @Defence,GetCastleData("prtg_cas05.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;
- if(@TriggerD == 0) goto L3_1;
- if(@TriggerD == 1) goto L3_1_2;
- if(@Defence >= 100) goto L3_2;
- mes "[ Reiner ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- 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.";
- close;
-
-L3_1:
- if(@TriggerD == 1) goto L3_1_2;
- mes "[ Reiner ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
- next;
- menu "Invest Defence.",L3_1_1,"Cancel",-;
- mes "[ Reiner ]";
- mes "As you wish, master.";
- close;
- L3_1_1:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas05.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas05.gat",3,@Defence+1;
- mes "[ Reiner ]";
- mes "You have invested successfully.";
- close;
-L3_1_2:
- set $def_invest,$def_invest*4;
- mes "[ Reiner ]";
- mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
- mes " ";
- mes "You can invest up to two times a day, but the second time costs more";
- mes " ";
- mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
- next;
- menu "Invest Defence.",L3_1_3,"Cancel",-;
- mes "[ Reiner ]";
- mes "As you wish, master.";
- close;
-
- L3_1_3:
- if(Zeny < $def_invest) goto L3_error;
- set Zeny,Zeny-$def_invest;
- SetCastleData "prtg_cas05.gat",5,@TriggerD+1;
- SetCastleData "prtg_cas05.gat",3,@Defence+1;
- mes "[ Reiner ]";
- mes "You have invested successfully.";
- close;
-L3_2:
- mes "[ Reiner ]";
- mes " ";
- mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
- close;
-L3_error:
- mes "[ Reiner ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Guardian Installation
-//================================================
-L4:
- If(getskilllv(10002) == 0) goto L4Error;
- set @Defence,GetCastleData("prtg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
- set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
- set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
-
- mes "[ Reiner ]";
- mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
- mes "Please choose 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("prtg_cas05.gat",10) == 1) goto L4Error2;
- set @GDnum,10;
- set @GDnum2,18;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_2:
- if (GetCastleData("prtg_cas05.gat",11) == 1) goto L4Error2;
- set @GDnum,11;
- set @GDnum2,19;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_3:
- if (GetCastleData("prtg_cas05.gat",12) == 1) goto L4Error2;
- set @GDnum,12;
- set @GDnum2,20;
- set @GuardianHP,@SGuardian;
- goto L4_9;
- L4_4:
- if (GetCastleData("prtg_cas05.gat",13) == 1) goto L4Error2;
- set @GDnum,13;
- set @GDnum2,21;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_5:
- if (GetCastleData("prtg_cas05.gat",14) == 1) goto L4Error2;
- set @GDnum,14;
- set @GDnum2,22;
- set @GuardianHP,@AGuardian;
- goto L4_9;
- L4_6:
- if (GetCastleData("prtg_cas05.gat",15) == 1) goto L4Error2;
- set @GDnum,15;
- set @GDnum2,23;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_7:
- if (GetCastleData("prtg_cas05.gat",16) == 1) goto L4Error2;
- set @GDnum,16;
- set @GDnum2,24;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_8:
- if (GetCastleData("prtg_cas05.gat",17) == 1) goto L4Error2;
- set @GDnum2,25;
- set @GuardianHP,@KGuardian;
- goto L4_9;
- L4_9:
- mes "[ Reiner ]";
- mes "Would you really like to install guardian? You need 10,000 zeny to install.";
- next;
- menu "Install",L4_9_1,"Cancel",-;
- mes "[ Reiner ]";
- mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
- close;
- L4_9_1:
- if (Zeny < 10000) goto L4Error3;
- set Zeny,Zeny-10000;
- SetCastleData "prtg_cas05.gat",@GDnum,1;
- SetCastleData "prtg_cas05.gat",@GDnum2,@GuardianHP;
- if(@GDnum==10) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
- if(@GDnum==11) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
- if(@GDnum==12) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
- if(@GDnum==13) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
- if(@GDnum==14) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
- if(@GDnum==15) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
- if(@GDnum==16) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
- if(@GDnum==17) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
- mes "[ Reiner ]";
- mes "Guardian has been installed, guardian will protect our guild base against enemies.";
- close;
-L4Error:
- mes "[ Reiner ]";
- mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
- close;
-L4Error2:
- mes "[ Reiner ]";
- mes "Master, that guardian has already been installed..";
- close;
-L4Error3:
- mes "[ Reiner ]";
- mes "Master, you do not have enough money to invest, investment has been cancelled.";
- close;
-//================================================
-// Kafra Employment
-//================================================
-L5:
- if (GetCastleData("prtg_cas05.gat",9) == 1) goto Lkafra_dimi;
-//================================================
-//(When Kafra is off) Employment
-//================================================
- If(getskilllv(10001) == 0) goto L_k_a;
- mes "[ Reiner ]";
- mes "Would you like to employ the services of a Kafra Service?";
- mes "^ff0000 You need 10,000 Zeny to employ... ";
- next;
- menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
-
- L_k_a:
- mes "[ Reiner ]";
- mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
- close;
- L_k_0:
- if (Zeny > 10000) goto L_k_1;
- mes "[ Reiner ]";
- mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
- close;
- L_k_1:
- set Zeny,Zeny-10000;
- enablenpc "Kafra Service#prt5";
- SetCastleData "prtg_cas05.gat",9,1;
- mes "[ Reiner ]";
- mes "You have been contracted with Kafra Service Company.";
- next;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "How do you do? I came here to follow your orders!.";
- mes "I'll do the best I can to serve you better.";
- next;
- cutin "kafra_01",255;
- mes "[ Reiner ]";
- mes "Your employment contract lasts one month.";
- mes "After this term, you'll have to pay again.";
- mes "I think the Kafra Service will benefit our guild members.";
- close;
-L_k_e:
- mes "[ Reiner ]";
- mes "Yes, Master. But we should really get a Kafra as soon as possible!";
- close;
-//=========================
-//(When Kafra is on) Dismissal
-//=========================
-Lkafra_dimi:
- mes "[ Reiner ]";
- mes "Would you like to dismiss current Kafra Service?";
- next;
- menu "Dismissal",-,"Cancel",L_D_1;
- cutin "kafra_01",2;
- mes "[ Kafra Service ]";
- mes "What have I done wrong? if so, would you please forgive me?";
- next;
- menu "Dismiss",-,"Cancel",L_D_2;
- mes "[ Kafra Service ]";
- mes "It's such unfortunate that I'm unable to serve master anymore";
- next;
- disablenpc "Kafra Service#prt5";
- SetCastleData "prtg_cas05.gat",9,0;
- cutin "kafra_01",255;
- mes "[ Reiner ]";
- mes "The Kafra Service had been dismissed";
- mes "But... we should really get a Kafra as soon as possible!";
- close;
- L_D_2:
- mes "[ Kafra Service ]";
- mes "Thank you master, I'll do my best! ^^.";
- cutin "kafra_01",255;
- close;
- L_D_1:
- mes "[ Reiner ]";
- mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
- close;
-L5_1:
-//================================================
-// Guild Treasure Room
-//================================================
-L6:
- mes "[ Reiner ]";
- mes "Would you like to get into our treasure room?";
- mes "That place is only for guild master, which means you are the only one who has access to enter.";
- next;
- menu "Enter Master's room.",-,"Cancel",L6_1;
- mes "[ Reiner ]";
- mes "Please follow me through the secret way.";
- mes "You must push down the secret switch in order to get out.";
- next;
- warp "prtg_cas05",15,209;
- L6_1:
- mes "[ Reiner ]";
- 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.";
- close;
-//================================================
-// Surrender Castle
-//================================================
-L7:
- mes "[ Reiner ]";
- mes "Master..";
- mes "Do you really want to give up this guild base?";
- mes "It is not worth it to give up this guild base, master!!!";
- mes "Please reconsider, master!!";
- next;
- menu "Empty Guild Base",L7_1,"Cancel",L7_2;
- L7_1:
- mes "[ Reiner ]";
- mes "Master, please reconsider...!!";
- next;
- menu "Cancel",L7_2,"Empty Guild Base",-;
- mes "[ Reiner ]";
- mes "Master!!.....";
- mes "Oh well..";
- next;
- SetCastleData "prtg_cas05.gat",1,0;
- SetCastleData "prtg_cas05.gat",2,0;
- SetCastleData "prtg_cas05.gat",3,0;
- SetCastleData "prtg_cas05.gat",4,0;
- SetCastleData "prtg_cas05.gat",5,0;
- SetCastleData "prtg_cas05.gat",6,0;
- SetCastleData "prtg_cas05.gat",7,0;
- SetCastleData "prtg_cas05.gat",8,0;
- SetCastleData "prtg_cas05.gat",9,0;
- SetCastleData "prtg_cas05.gat",10,0;
- SetCastleData "prtg_cas05.gat",11,0;
- SetCastleData "prtg_cas05.gat",12,0;
- SetCastleData "prtg_cas05.gat",13,0;
- SetCastleData "prtg_cas05.gat",14,0;
- SetCastleData "prtg_cas05.gat",15,0;
- SetCastleData "prtg_cas05.gat",16,0;
- SetCastleData "prtg_cas05.gat",17,0;
- SetCastleData "prtg_cas05.gat",18,0;
- SetCastleData "prtg_cas05.gat",19,0;
- SetCastleData "prtg_cas05.gat",20,0;
- SetCastleData "prtg_cas05.gat",21,0;
- SetCastleData "prtg_cas05.gat",22,0;
- SetCastleData "prtg_cas05.gat",23,0;
- SetCastleData "prtg_cas05.gat",24,0;
- SetCastleData "prtg_cas05.gat",25,0;
- Announce "[" + GetGuildName(@GIDp5) + "] has surrendered Agit [" + GetCastleName("prtg_cas05.gat") + "]",0;
- MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),7;
- break;
- L7_2:
- mes "[ Reiner ]";
- mes "I knew it master!!";
- mes "Please, don't freak me out like that again.";
- close;
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas05 script
+//===== By: ==================================================
+//= jAthena - kalen (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Guild Flags, Kafra and Guild Manager scripts in prtg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru, ho|yAnge|X, and Valaris
+//============================================================
+
+prtg_cas05.gat,19,247,4 script Guindull#p5-7::GuindullNW 722,{
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (@GIDp5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP04:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ break;
+}
+
+prtg_cas05.gat,19,243,4 duplicate(GuindullNW) Guindull#p5-8 722
+prtg_cas05.gat,26,247,4 duplicate(GuindullNW) Guindull#p5-9 722
+prtg_cas05.gat,26,243,4 duplicate(GuindullNW) Guindull#p5-10 722
+prtg_cas05.gat,249,289,4 duplicate(GuindullNW) Guindull#p5-11 722
+prtg_cas05.gat,256,289,4 duplicate(GuindullNW) Guindull#p5-12 722
+prtg_cas05.gat,253,271,4 duplicate(GuindullNW) Guindull#p5-13 722
+prtg_cas05.gat,273,257,4 duplicate(GuindullNW) Guindull#p5-14 722
+
+//================================================
+// Kafra Service
+//================================================
+prtg_cas05.gat,52,41,4 script Kafra Service#prt5 117,{
+ cutin "kafra_01",2;
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (getcharid(2) == @GIDp5) goto LStartg;
+ mes "[Kafra Service]";
+ mes "I am here to serve only ^ff0000" + GetGuildName(@GIDp5) + "^000000 members. Please use different Kafra Service. Thank you.";
+ goto L_EXIT;
+LStartg:
+ mes "[Kafra Service]";
+ mes "Welcome. ^ff0000" + GetGuildName(@GIDp5) + "^000000 members";
+ mes "We will stay with you wherever you go";
+ next;
+ menu "Open Storage",L2,"Teleport Service",L3,"Use Cart Service",L4,"Cancel",L7;
+//================================================
+// Storage
+//================================================
+L2:
+ if(getskilllv(1) < 6) goto Lerror2_1;
+ openstorage;
+ goto L_EXIT;
+ Lerror2_1:
+ mes "[Kafra Service]";
+ mes "You must have lvl 6 or higher novice skill.";
+ goto L_EXIT;
+//================================================
+// Teleport Service
+//================================================
+L3:
+ mes "[Kafra Service]";
+ mes "Please confirm your destination.";
+ next;
+ menu "Prontera -> 200 z",L3_1,"Cancel",L3_2;
+ L3_1:
+ if (Zeny < 200) goto Lerror3;
+ set Zeny,Zeny-200;
+ warp "prontera.gat",278,211;
+break;
+ L3_2:
+ mes "[Kafra Service]";
+ mes "Kafra Service always trying to offer best service for you.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ Lerror3:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough Zeny to use the teleport service.";
+ goto L_EXIT;
+//================================================
+// Cart Rental
+//================================================
+L4:
+ if (!((Class == 5) || (Class == 10) || (Class == 18) || (Class == 4006) || (Class == 4011) || (Class == 4019))) goto Lerror4_1;
+ if (checkcart(0) == 1) goto Lerror4_3;
+ mes "[Kafra Service]";
+ mes "The cart rental fee is 800 Zeny.";
+ mes "Would you like to rent a cart?";
+ next;
+ menu "Rent a Cart",L4_1,"Cancel",-;
+ mes "[Kafra Service]";
+ mes "We always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+ L4_1:
+ If(getskilllv(39) == 0) goto Lerror4_4;
+ if (Zeny < 800) goto Lerror4_2;
+ set Zeny,Zeny-800;
+ setcart;
+ goto L_EXIT;
+ //Not a merchant class
+ Lerror4_1:
+ mes "[Kafra Service]";
+ mes "Sorry, the cart rental service is only for the merchant class.";
+ goto L_EXIT;
+ //Not enough zenny
+ Lerror4_2:
+ mes "[Kafra Service]";
+ mes "Sorry, you don't have enough zeny. You need 800 Zeny.";
+ goto L_EXIT;
+ //Already have cart
+ Lerror4_3:
+ mes "[Kafra Service]";
+ mes "Sorry, you already have a cart now.";
+ mes "Return when you dont have one and are in need of our service.";
+ goto L_EXIT;
+ //No Pushcart Skill
+ Lerror4_4:
+ mes "[Kafra Service]";
+ mes "Sorry, you need to learn the skill [Pushcart] first";
+ goto L_EXIT;
+//================================================
+// Cancel
+//================================================
+L7:
+ mes "[Kafra Service]";
+ mes "We will always try to serve you better.";
+ mes "Thank you for using our service.";
+ goto L_EXIT;
+L_EXIT:
+ cutin "kafra_01",255;
+ close;
+OnInit:
+ if (GetCastleData("prtg_cas05.gat",9) == 1) break;
+ disablenpc "Kafra Service#prt5";
+ break;
+}
+
+//================================================
+// Guild Dungeon Switch
+//================================================
+
+prtg_cas05.gat,56,283,0 script Switch 111,{
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' Only brave man get to lead the guild base.. '";
+ next;
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",-,"No",L2;
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (getcharid(2) != @GIDp5) goto L1n;
+ warp "gld_dun03.gat",199,28;
+ break;
+L1n:
+ mes "[ Vibration of Man's Voice ]";
+ mes " ' ... ' ";
+L2:
+ close;
+}
+
+//================================================
+// Guild Castle Manager
+//================================================
+
+prtg_cas05.gat,36,37,4 script Reiner 55,{
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (@GIDp5 == 0) goto LStart;
+ if (getcharid(2) != @GIDp5) goto LStart2;
+ if (strcharinfo(0) == getguildmaster(@GIDp5)) goto LStart3;
+ goto LStart1;
+
+//================================================
+// Guild Members
+//================================================
+LStart1:
+ mes "[ Reiner ]";
+ mes "You're not ^ff0000" + getguildmaster(@GIDp5) + "^000000 ! I am here to follow ^ff0000" + getguildmaster(@GIDp5) + "^000000 's command only";
+ close;
+//================================================
+// Castle not owned
+//================================================
+LStart:
+ mes "[ Reiner ]";
+ mes "I am waiting for my master.";
+ mes "Brave Player! follow your destiny!...";
+ close;
+//================================================
+// Non-Guild Members
+//================================================
+LStart2:
+ mes "[ Reiner ]";
+ mes "I am here to follow ^ff0000" + getguildmaster(@GIDp5) + "^000000 's command! Where are the guardians? Destroy these bastards!";
+ close;
+//================================================
+// Guild Leader
+//================================================
+LStart3:
+ mes "[ Reiner ]";
+ mes "Welcome Master ^ff0000" + getguildmaster(@GIDp5) + "^000000 !";
+ mes "I'll do anything you tell me to do sir!.";
+ next;
+ menu "Guild Base Briefing",L1,"Commerce Investment",L2,"Defence Investment",L3,"Guardian Installation",L4,"Kafra Service Employment / Dismissal",L5,"Enter Master's Room",L6,"Empty Guild Base",L7;
+//-----------------------------------------------------------
+//================================================
+// Guild Base Briefing
+//================================================
+L1:
+ mes "[ Reiner ]";
+ mes "Guild Base Investment Information.";
+ mes " ";
+ mes "Current Commerce Investment is : " + GetCastleData("prtg_cas05.gat",2) + " points.";
+ mes "^0000ff - You have invested " + GetCastleData("prtg_cas05.gat",4) + "times today.^000000";
+ mes " ";
+ mes "Current Defence Investment is : " + GetCastleData("prtg_cas05.gat",3) + "points.";
+ mes "^0000ff- You have invested" + GetCastleData("prtg_cas05.gat",5) + "times today.^000000";
+ mes " ";
+ mes "That is about it.";
+ close;
+//================================================
+// Commerce Investment
+//================================================
+L2:
+ set @TriggerE,GetCastleData("prtg_cas05.gat",4);
+ set @Economy,GetCastleData("prtg_cas05.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;
+ if(@TriggerE == 0) goto L2_1;
+ if(@TriggerE == 1) goto L2_1_2;
+ if(@Economy >= 100) goto L2_2;
+ mes "[ Reiner ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+L2_1:
+ if(@TriggerE == 1) goto L2_1_2;
+ mes "[ Reiner ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $eco_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Commerce.",L2_1_1,"Cancel.",-;
+ mes "[ Reiner ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_1:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas05.gat",2,@Economy+1;
+ mes "[ Reiner ]";
+ mes "You have invested successfully.";
+ close;
+
+L2_1_2:
+ set $eco_invest,$eco_invest*4;
+ mes "[ Reiner ]";
+ mes "If you improve your Commerce Investment, the guild's productive power increases to produce more goods. So an investment will be required if you consider the future";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Commerce.",L2_1_3,"Cancel.",-;
+ mes "[ Reiner ]";
+ mes "As you wish, master.";
+ close;
+ L2_1_3:
+ if(Zeny < $eco_invest) goto L2_error;
+ set Zeny,Zeny-$eco_invest;
+ SetCastleData "prtg_cas05.gat",4,@TriggerE+1;
+ SetCastleData "prtg_cas05.gat",2,@Economy+1;
+ mes "[ Reiner ]";
+ mes "You have invested successfully";
+ close;
+
+L2_2:
+ mes "[ Reiner ]";
+ mes " ";
+ mes "^ff0000This Castle's commerce investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+
+L2_error:
+ mes "[ Reiner ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Defence Investment
+//================================================
+L3:
+ set @TriggerD,GetCastleData("prtg_cas05.gat",5);
+ set @Defence,GetCastleData("prtg_cas05.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;
+ if(@TriggerD == 0) goto L3_1;
+ if(@TriggerD == 1) goto L3_1_2;
+ if(@Defence >= 100) goto L3_2;
+ mes "[ Reiner ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ 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.";
+ close;
+
+L3_1:
+ if(@TriggerD == 1) goto L3_1_2;
+ mes "[ Reiner ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "The needed investment amount is ^ff0000" + $def_invest + "^000000 zeny. Would you like to invest?";
+ next;
+ menu "Invest Defence.",L3_1_1,"Cancel",-;
+ mes "[ Reiner ]";
+ mes "As you wish, master.";
+ close;
+ L3_1_1:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas05.gat",3,@Defence+1;
+ mes "[ Reiner ]";
+ mes "You have invested successfully.";
+ close;
+L3_1_2:
+ set $def_invest,$def_invest*4;
+ mes "[ Reiner ]";
+ mes "If you improve investment of defence, the durability of our guardians and the emperium will increase. So if you consider our future battles, an investment will be required.";
+ mes " ";
+ mes "You can invest up to two times a day, but the second time costs more";
+ mes " ";
+ mes "You've already invested once today, but you can invest again at ^ff0000" + $eco_invest + "^000000 Zeny. Would you like to invest again?";
+ next;
+ menu "Invest Defence.",L3_1_3,"Cancel",-;
+ mes "[ Reiner ]";
+ mes "As you wish, master.";
+ close;
+
+ L3_1_3:
+ if(Zeny < $def_invest) goto L3_error;
+ set Zeny,Zeny-$def_invest;
+ SetCastleData "prtg_cas05.gat",5,@TriggerD+1;
+ SetCastleData "prtg_cas05.gat",3,@Defence+1;
+ mes "[ Reiner ]";
+ mes "You have invested successfully.";
+ close;
+L3_2:
+ mes "[ Reiner ]";
+ mes " ";
+ mes "^ff0000This Castle's Defence Investment is already maxed at 100 points. You don't have to invest any further.^000000";
+ close;
+L3_error:
+ mes "[ Reiner ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Guardian Installation
+//================================================
+L4:
+ If(getskilllv(10002) == 0) goto L4Error;
+ set @Defence,GetCastleData("prtg_cas05.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 @SGuardian,strmobinfo(4,1287)+2000*@Defence;
+ set @AGuardian,strmobinfo(4,1286)+2000*@Defence;
+ set @KGuardian,strmobinfo(4,1285)+2000*@Defence;
+
+ mes "[ Reiner ]";
+ mes "Would you like to install a guardian? Guardian will protect guild base from enemies.";
+ mes "Please choose 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("prtg_cas05.gat",10) == 1) goto L4Error2;
+ set @GDnum,10;
+ set @GDnum2,18;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_2:
+ if (GetCastleData("prtg_cas05.gat",11) == 1) goto L4Error2;
+ set @GDnum,11;
+ set @GDnum2,19;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_3:
+ if (GetCastleData("prtg_cas05.gat",12) == 1) goto L4Error2;
+ set @GDnum,12;
+ set @GDnum2,20;
+ set @GuardianHP,@SGuardian;
+ goto L4_9;
+ L4_4:
+ if (GetCastleData("prtg_cas05.gat",13) == 1) goto L4Error2;
+ set @GDnum,13;
+ set @GDnum2,21;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_5:
+ if (GetCastleData("prtg_cas05.gat",14) == 1) goto L4Error2;
+ set @GDnum,14;
+ set @GDnum2,22;
+ set @GuardianHP,@AGuardian;
+ goto L4_9;
+ L4_6:
+ if (GetCastleData("prtg_cas05.gat",15) == 1) goto L4Error2;
+ set @GDnum,15;
+ set @GDnum2,23;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_7:
+ if (GetCastleData("prtg_cas05.gat",16) == 1) goto L4Error2;
+ set @GDnum,16;
+ set @GDnum2,24;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_8:
+ if (GetCastleData("prtg_cas05.gat",17) == 1) goto L4Error2;
+ set @GDnum2,25;
+ set @GuardianHP,@KGuardian;
+ goto L4_9;
+ L4_9:
+ mes "[ Reiner ]";
+ mes "Would you really like to install guardian? You need 10,000 zeny to install.";
+ next;
+ menu "Install",L4_9_1,"Cancel",-;
+ mes "[ Reiner ]";
+ mes "I'll follow your order sir, but it is worth to have a guardian soon or later.";
+ close;
+ L4_9_1:
+ if (Zeny < 10000) goto L4Error3;
+ set Zeny,Zeny-10000;
+ SetCastleData "prtg_cas05.gat",@GDnum,1;
+ SetCastleData "prtg_cas05.gat",@GDnum2,@GuardianHP;
+ if(@GDnum==10) guardian "prtg_cas05.gat",244,15,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",0;
+ if(@GDnum==11) guardian "prtg_cas05.gat",241,14,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",1;
+ if(@GDnum==12) guardian "prtg_cas05.gat",68,40,"Soldier Guardian",1287,1,"Guardian_D04::OnGuardianDied",2;
+ if(@GDnum==13) guardian "prtg_cas05.gat",62,264,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",3;
+ if(@GDnum==14) guardian "prtg_cas05.gat",244,61,"Archer Guardian",1285,1,"Guardian_D04::OnGuardianDied",4;
+ if(@GDnum==15) guardian "prtg_cas05.gat",34,24,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",5;
+ if(@GDnum==16) guardian "prtg_cas05.gat",208,86,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",6;
+ if(@GDnum==17) guardian "prtg_cas05.gat",43,70,"Knight Guardian",1286,1,"Guardian_D04::OnGuardianDied",7;
+ mes "[ Reiner ]";
+ mes "Guardian has been installed, guardian will protect our guild base against enemies.";
+ close;
+L4Error:
+ mes "[ Reiner ]";
+ mes "Master, you cannot install guardians because the guild had not learnt the ^ff0000Guardian Research^000000 skill. Guardian Installation has been cancelled.";
+ close;
+L4Error2:
+ mes "[ Reiner ]";
+ mes "Master, that guardian has already been installed..";
+ close;
+L4Error3:
+ mes "[ Reiner ]";
+ mes "Master, you do not have enough money to invest, investment has been cancelled.";
+ close;
+//================================================
+// Kafra Employment
+//================================================
+L5:
+ if (GetCastleData("prtg_cas05.gat",9) == 1) goto Lkafra_dimi;
+//================================================
+//(When Kafra is off) Employment
+//================================================
+ If(getskilllv(10001) == 0) goto L_k_a;
+ mes "[ Reiner ]";
+ mes "Would you like to employ the services of a Kafra Service?";
+ mes "^ff0000 You need 10,000 Zeny to employ... ";
+ next;
+ menu "Employ Kafra.",L_k_0,"Cancel",L_k_E;
+
+ L_k_a:
+ mes "[ Reiner ]";
+ mes "Master, you don't have a contract with the Kafra Service Company. In order to hire, a kafra, it is important to be contracted with the Kafra Service by having Guild Skill ^ff0000Contract With Kafra^000000. Employment has been cancelled .";
+ close;
+ L_k_0:
+ if (Zeny > 10000) goto L_k_1;
+ mes "[ Reiner ]";
+ mes "Master, you do not have enough money to employ Kafra. Employment has been cancelled.";
+ close;
+ L_k_1:
+ set Zeny,Zeny-10000;
+ enablenpc "Kafra Service#prt5";
+ SetCastleData "prtg_cas05.gat",9,1;
+ mes "[ Reiner ]";
+ mes "You have been contracted with Kafra Service Company.";
+ next;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "How do you do? I came here to follow your orders!.";
+ mes "I'll do the best I can to serve you better.";
+ next;
+ cutin "kafra_01",255;
+ mes "[ Reiner ]";
+ mes "Your employment contract lasts one month.";
+ mes "After this term, you'll have to pay again.";
+ mes "I think the Kafra Service will benefit our guild members.";
+ close;
+L_k_e:
+ mes "[ Reiner ]";
+ mes "Yes, Master. But we should really get a Kafra as soon as possible!";
+ close;
+//=========================
+//(When Kafra is on) Dismissal
+//=========================
+Lkafra_dimi:
+ mes "[ Reiner ]";
+ mes "Would you like to dismiss current Kafra Service?";
+ next;
+ menu "Dismissal",-,"Cancel",L_D_1;
+ cutin "kafra_01",2;
+ mes "[ Kafra Service ]";
+ mes "What have I done wrong? if so, would you please forgive me?";
+ next;
+ menu "Dismiss",-,"Cancel",L_D_2;
+ mes "[ Kafra Service ]";
+ mes "It's such unfortunate that I'm unable to serve master anymore";
+ next;
+ disablenpc "Kafra Service#prt5";
+ SetCastleData "prtg_cas05.gat",9,0;
+ cutin "kafra_01",255;
+ mes "[ Reiner ]";
+ mes "The Kafra Service had been dismissed";
+ mes "But... we should really get a Kafra as soon as possible!";
+ close;
+ L_D_2:
+ mes "[ Kafra Service ]";
+ mes "Thank you master, I'll do my best! ^^.";
+ cutin "kafra_01",255;
+ close;
+ L_D_1:
+ mes "[ Reiner ]";
+ mes "Master, I think you should keep the current Kafra Service because she is already trying her best to serve us";
+ close;
+L5_1:
+//================================================
+// Guild Treasure Room
+//================================================
+L6:
+ mes "[ Reiner ]";
+ mes "Would you like to get into our treasure room?";
+ mes "That place is only for guild master, which means you are the only one who has access to enter.";
+ next;
+ menu "Enter Master's room.",-,"Cancel",L6_1;
+ mes "[ Reiner ]";
+ mes "Please follow me through the secret way.";
+ mes "You must push down the secret switch in order to get out.";
+ next;
+ warp "prtg_cas05",15,209;
+ L6_1:
+ mes "[ Reiner ]";
+ 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.";
+ close;
+//================================================
+// Surrender Castle
+//================================================
+L7:
+ mes "[ Reiner ]";
+ mes "Master..";
+ mes "Do you really want to give up this guild base?";
+ mes "It is not worth it to give up this guild base, master!!!";
+ mes "Please reconsider, master!!";
+ next;
+ menu "Empty Guild Base",L7_1,"Cancel",L7_2;
+ L7_1:
+ mes "[ Reiner ]";
+ mes "Master, please reconsider...!!";
+ next;
+ menu "Cancel",L7_2,"Empty Guild Base",-;
+ mes "[ Reiner ]";
+ mes "Master!!.....";
+ mes "Oh well..";
+ next;
+ SetCastleData "prtg_cas05.gat",1,0;
+ SetCastleData "prtg_cas05.gat",2,0;
+ SetCastleData "prtg_cas05.gat",3,0;
+ SetCastleData "prtg_cas05.gat",4,0;
+ SetCastleData "prtg_cas05.gat",5,0;
+ SetCastleData "prtg_cas05.gat",6,0;
+ SetCastleData "prtg_cas05.gat",7,0;
+ SetCastleData "prtg_cas05.gat",8,0;
+ SetCastleData "prtg_cas05.gat",9,0;
+ SetCastleData "prtg_cas05.gat",10,0;
+ SetCastleData "prtg_cas05.gat",11,0;
+ SetCastleData "prtg_cas05.gat",12,0;
+ SetCastleData "prtg_cas05.gat",13,0;
+ SetCastleData "prtg_cas05.gat",14,0;
+ SetCastleData "prtg_cas05.gat",15,0;
+ SetCastleData "prtg_cas05.gat",16,0;
+ SetCastleData "prtg_cas05.gat",17,0;
+ SetCastleData "prtg_cas05.gat",18,0;
+ SetCastleData "prtg_cas05.gat",19,0;
+ SetCastleData "prtg_cas05.gat",20,0;
+ SetCastleData "prtg_cas05.gat",21,0;
+ SetCastleData "prtg_cas05.gat",22,0;
+ SetCastleData "prtg_cas05.gat",23,0;
+ SetCastleData "prtg_cas05.gat",24,0;
+ SetCastleData "prtg_cas05.gat",25,0;
+ Announce "[" + GetGuildName(@GIDp5) + "] has surrendered Agit [" + GetCastleName("prtg_cas05.gat") + "]",0;
+ MapRespawnGuildID "prtg_cas05.gat",GetCastleData("prtg_cas05.gat",1),7;
+ break;
+ L7_2:
+ mes "[ Reiner ]";
+ mes "I knew it master!!";
+ mes "Please, don't freak me out like that again.";
+ close;
} \ No newline at end of file
diff --git a/npc/guild/old/prtg_flag.txt b/npc/guild/old/prtg_flag.txt
index 156b3b09c..0a64c64e8 100644
--- a/npc/guild/old/prtg_flag.txt
+++ b/npc/guild/old/prtg_flag.txt
@@ -1,364 +1,364 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Prontera Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in prontera and prt_gld
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|
-//============================================================
-
-//Prontera Castle 01 - Creamhilt
-
-prontera.gat,155,190,4 script Creamhilt#p1-1 722,{
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (@GIDp1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- break;
-}
-
-prt_gld.gat,131,60,6 script Creamhilt#p1-2::CreamhiltW 722,{
- set @GIDp1,GetCastleData("prtg_cas01.gat",1);
- if (@GIDp1 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDp1) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "prtg_cas01.gat",97,174;
- break;
-OnRecvCastleP01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- break;
-}
-
-prt_gld.gat,138,68,6 duplicate(CreamhiltW) Creamhilt#p1-3 722
-prt_gld.gat,138,60,6 duplicate(CreamhiltW) Creamhilt#p1-4 722
-prt_gld.gat,135,60,6 duplicate(CreamhiltW) Creamhilt#p1-5 722
-prt_gld.gat,160,210,4 duplicate(CreamhiltW) Creamhilt#p1-6 722
-
-//Prontera Castle 02 - Sbanhealt
-
-prontera.gat,146,194,3 script Sbanhealt#p2-1 722,{
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (@GIDp2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- break;
-}
-
-prt_gld.gat,153,213,3 script Sbanhealt#p2-2::SbanhealtW 722,{
- set @GIDp2,GetCastleData("prtg_cas02.gat",1);
- if (@GIDp2 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDp2) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "prtg_cas02.gat",71,36;
- break;
-OnRecvCastleP02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- break;
-}
-
-prt_gld.gat,244,126,8 duplicate(SbanhealtW) Sbanhealt#p2-3 722
-prt_gld.gat,244,128,8 duplicate(SbanhealtW) Sbanhealt#p2-4 722
-prt_gld.gat,236,126,8 duplicate(SbanhealtW) Sbanhealt#p2-5 722
-prt_gld.gat,236,128,8 duplicate(SbanhealtW) Sbanhealt#p2-6 722
-
-//Prontera Castle 03 - Lazrigees
-
-prontera.gat,143,203,2 script Lazrigees#p3-1 722,{
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (@GIDp3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- break;
-}
-
-prt_gld.gat,150,220,2 script Lazrigees#p3-2::LazrigeesW 722,{
- set @GIDp3,GetCastleData("prtg_cas03.gat",1);
- if (@GIDp3 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDp3) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "prtg_cas03.gat",97,174;
- break;
-OnRecvCastleP03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- break;
-}
-
-prt_gld.gat,147,140,4 duplicate(LazrigeesW) Lazrigees#p3-3 722
-prt_gld.gat,147,136,4 duplicate(LazrigeesW) Lazrigees#p3-4 722
-prt_gld.gat,158,140,4 duplicate(LazrigeesW) Lazrigees#p3-5 722
-prt_gld.gat,158,136,4 duplicate(LazrigeesW) Lazrigees#p3-6 722
-
-//Prontera Castle 04 - Squagul
-
-prontera.gat,167,203,6 script Squagul#p4-1 722,{
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (@GIDp4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- break;
-}
-
-
-prt_gld.gat,169,220,6 script Squagul#p4-2::SquagulW 722,{
- set @GIDp4,GetCastleData("prtg_cas04.gat",1);
- if (@GIDp4 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDp4) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "prtg_cas04.gat",97,174;
- break;
-OnRecvCastleP04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- break;
-}
-
-prt_gld.gat,120,243,6 duplicate(SquagulW) Squagul#p4-3 722
-prt_gld.gat,120,236,6 duplicate(SquagulW) Squagul#p4-4 722
-prt_gld.gat,122,243,6 duplicate(SquagulW) Squagul#p4-5 722
-prt_gld.gat,122,246,6 duplicate(SquagulW) Squagul#p4-6 722
-
-//Prontera Castle 05 - Guindull
-
-prontera.gat,165,194,5 script Guindull#p5-1 722,{
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (@GIDp5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-OnRecvCastleP05:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- break;
-}
-
-prt_gld.gat,167,213,5 script Guindull#p5-2::GuindullW 722,{
- set @GIDp5,GetCastleData("prtg_cas05.gat",1);
- if (@GIDp5 != 0) goto LStartg;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " 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";
- mes " that are protecting the guild base and eliminate the Emperium";
- close;
-LStartg:
- if (getcharid(2) == @GIDp5) goto LStartg2;
- mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
- mes " ";
- mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
- mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
- mes " ";
- mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
- mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
- mes " raise your sword to honor yourself.";
- close;
-LStartg2:
- mes "[ Ringing Voice ]";
- mes "Brave man...";
- mes "Would you return to your honorable be?";
- next;
- menu "Go back to your agitating point",Lenter,"Cancel",-;
- close;
-Lenter:
- warp "prtg_cas05.gat",97,174;
- break;
-OnRecvCastleP05:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- break;
-}
-
-prt_gld.gat,199,243,2 duplicate(GuindullW) Guindull#p5-3 722
-prt_gld.gat,199,236,2 duplicate(GuindullW) Guindull#p5-4 722
-prt_gld.gat,197,243,2 duplicate(GuindullW) Guindull#p5-5 722
+//===== eAthena Script =======================================
+//= War of Emperium - Prontera Guild Flags
+//===== By: ==================================================
+//= jAthena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in prontera and prt_gld
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|
+//============================================================
+
+//Prontera Castle 01 - Creamhilt
+
+prontera.gat,155,190,4 script Creamhilt#p1-1 722,{
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (@GIDp1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ break;
+}
+
+prt_gld.gat,131,60,6 script Creamhilt#p1-2::CreamhiltW 722,{
+ set @GIDp1,GetCastleData("prtg_cas01.gat",1);
+ if (@GIDp1 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDp1) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp1) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp1) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp1) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "prtg_cas01.gat",97,174;
+ break;
+OnRecvCastleP01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ break;
+}
+
+prt_gld.gat,138,68,6 duplicate(CreamhiltW) Creamhilt#p1-3 722
+prt_gld.gat,138,60,6 duplicate(CreamhiltW) Creamhilt#p1-4 722
+prt_gld.gat,135,60,6 duplicate(CreamhiltW) Creamhilt#p1-5 722
+prt_gld.gat,160,210,4 duplicate(CreamhiltW) Creamhilt#p1-6 722
+
+//Prontera Castle 02 - Sbanhealt
+
+prontera.gat,146,194,3 script Sbanhealt#p2-1 722,{
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (@GIDp2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ break;
+}
+
+prt_gld.gat,153,213,3 script Sbanhealt#p2-2::SbanhealtW 722,{
+ set @GIDp2,GetCastleData("prtg_cas02.gat",1);
+ if (@GIDp2 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDp2) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp2) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp2) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp2) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "prtg_cas02.gat",71,36;
+ break;
+OnRecvCastleP02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ break;
+}
+
+prt_gld.gat,244,126,8 duplicate(SbanhealtW) Sbanhealt#p2-3 722
+prt_gld.gat,244,128,8 duplicate(SbanhealtW) Sbanhealt#p2-4 722
+prt_gld.gat,236,126,8 duplicate(SbanhealtW) Sbanhealt#p2-5 722
+prt_gld.gat,236,128,8 duplicate(SbanhealtW) Sbanhealt#p2-6 722
+
+//Prontera Castle 03 - Lazrigees
+
+prontera.gat,143,203,2 script Lazrigees#p3-1 722,{
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (@GIDp3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ break;
+}
+
+prt_gld.gat,150,220,2 script Lazrigees#p3-2::LazrigeesW 722,{
+ set @GIDp3,GetCastleData("prtg_cas03.gat",1);
+ if (@GIDp3 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDp3) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp3) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp3) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp3) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "prtg_cas03.gat",97,174;
+ break;
+OnRecvCastleP03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ break;
+}
+
+prt_gld.gat,147,140,4 duplicate(LazrigeesW) Lazrigees#p3-3 722
+prt_gld.gat,147,136,4 duplicate(LazrigeesW) Lazrigees#p3-4 722
+prt_gld.gat,158,140,4 duplicate(LazrigeesW) Lazrigees#p3-5 722
+prt_gld.gat,158,136,4 duplicate(LazrigeesW) Lazrigees#p3-6 722
+
+//Prontera Castle 04 - Squagul
+
+prontera.gat,167,203,6 script Squagul#p4-1 722,{
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (@GIDp4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ break;
+}
+
+
+prt_gld.gat,169,220,6 script Squagul#p4-2::SquagulW 722,{
+ set @GIDp4,GetCastleData("prtg_cas04.gat",1);
+ if (@GIDp4 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDp4) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp4) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp4) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp4) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "prtg_cas04.gat",97,174;
+ break;
+OnRecvCastleP04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ break;
+}
+
+prt_gld.gat,120,243,6 duplicate(SquagulW) Squagul#p4-3 722
+prt_gld.gat,120,236,6 duplicate(SquagulW) Squagul#p4-4 722
+prt_gld.gat,122,243,6 duplicate(SquagulW) Squagul#p4-5 722
+prt_gld.gat,122,246,6 duplicate(SquagulW) Squagul#p4-6 722
+
+//Prontera Castle 05 - Guindull
+
+prontera.gat,165,194,5 script Guindull#p5-1 722,{
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (@GIDp5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+OnRecvCastleP05:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ break;
+}
+
+prt_gld.gat,167,213,5 script Guindull#p5-2::GuindullW 722,{
+ set @GIDp5,GetCastleData("prtg_cas05.gat",1);
+ if (@GIDp5 != 0) goto LStartg;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " 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";
+ mes " that are protecting the guild base and eliminate the Emperium";
+ close;
+LStartg:
+ if (getcharid(2) == @GIDp5) goto LStartg2;
+ mes "[ Edict of the Divine Rune Midgard Kingdom of Prontera ]";
+ mes " ";
+ mes "1. Honoring the ordinance of the Divine Rune Midgard Kingdom of Prontera,";
+ mes " we approve that this base is in the private possession of ^ff0000" + GetGuildName(@GIDp5) + "^000000 guild";
+ mes " ";
+ mes "2. The guild master of ^ff0000" + GetGuildName(@GIDp5) + "^000000 is";
+ mes " ^ff0000" + GetGuildMaster(@GIDp5) + "^000000. If anyone who objects to that,";
+ mes " raise your sword to honor yourself.";
+ close;
+LStartg2:
+ mes "[ Ringing Voice ]";
+ mes "Brave man...";
+ mes "Would you return to your honorable be?";
+ next;
+ menu "Go back to your agitating point",Lenter,"Cancel",-;
+ close;
+Lenter:
+ warp "prtg_cas05.gat",97,174;
+ break;
+OnRecvCastleP05:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ break;
+}
+
+prt_gld.gat,199,243,2 duplicate(GuindullW) Guindull#p5-3 722
+prt_gld.gat,199,236,2 duplicate(GuindullW) Guindull#p5-4 722
+prt_gld.gat,197,243,2 duplicate(GuindullW) Guindull#p5-5 722
prt_gld.gat,197,236,2 duplicate(GuindullW) Guindull#p5-6 722 \ No newline at end of file
diff --git a/npc/guild/old/treasure/aldeg_cas01_treasure.txt b/npc/guild/old/treasure/aldeg_cas01_treasure.txt
index 7ee9a5d93..cf5557ade 100644
--- a/npc/guild/old/treasure/aldeg_cas01_treasure.txt
+++ b/npc/guild/old/treasure/aldeg_cas01_treasure.txt
@@ -1,72 +1,72 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas01 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in aldeg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-aldeg_cas01.gat,123,223,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "aldeg_cas01.gat",218,176;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-aldeg_cas01.gat,119,223,0 script Treasure_A01 -1,{
-OnClock1200:
- SetCastleData "aldeg_cas01.gat",4,0;
- SetCastleData "aldeg_cas01.gat",5,0;
- KillMonster "aldeg_cas01.gat","Treasure_A01::TreasureDied";
- set $Economy,GetCastleData("aldeg_cas01.gat",2);
- if ($Economy > 100) break;
- if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
- set $boxnum,GetCastleData("aldeg_cas01.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum <= 0) break;
- set $boxid,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid > 2) goto TreasureSpawn2;
- areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",1324,1,"Treasure_A01::TreasureDied";
- set $boxnum,$boxnum-1;
- if ($boxnum <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",1325,1,"Treasure_A01::TreasureDied";
- set $boxnum,$boxnum-1;
- if ($boxnum <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "aldeg_cas01.gat","Treasure Chest Broken Open",17;
- break;
-
-Rehash:
- set $boxid,1324;
- areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",$boxid,$boxnum,"Treasure_A01::TreasureDied";
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas01 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in aldeg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+aldeg_cas01.gat,123,223,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "aldeg_cas01.gat",218,176;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+aldeg_cas01.gat,119,223,0 script Treasure_A01 -1,{
+OnClock1200:
+ SetCastleData "aldeg_cas01.gat",4,0;
+ SetCastleData "aldeg_cas01.gat",5,0;
+ KillMonster "aldeg_cas01.gat","Treasure_A01::TreasureDied";
+ set $Economy,GetCastleData("aldeg_cas01.gat",2);
+ if ($Economy > 100) break;
+ if (GetCastleData("aldeg_cas01.gat",1) == 0) break;
+ set $boxnum,GetCastleData("aldeg_cas01.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum <= 0) break;
+ set $boxid,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid > 2) goto TreasureSpawn2;
+ areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",1324,1,"Treasure_A01::TreasureDied";
+ set $boxnum,$boxnum-1;
+ if ($boxnum <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",1325,1,"Treasure_A01::TreasureDied";
+ set $boxnum,$boxnum-1;
+ if ($boxnum <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "aldeg_cas01.gat","Treasure Chest Broken Open",17;
+ break;
+
+Rehash:
+ set $boxid,1324;
+ areamonster "aldeg_cas01.gat",114,218,123,227,"Treasure Chest",$boxid,$boxnum,"Treasure_A01::TreasureDied";
+ break;
+}
diff --git a/npc/guild/old/treasure/aldeg_cas02_treasure.txt b/npc/guild/old/treasure/aldeg_cas02_treasure.txt
index 9144bd2a6..7d7779d09 100644
--- a/npc/guild/old/treasure/aldeg_cas02_treasure.txt
+++ b/npc/guild/old/treasure/aldeg_cas02_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas02 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in aldeg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-aldeg_cas02.gat,139,235,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "aldeg_cas02.gat",78,75;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-aldeg_cas02.gat,135,231,0 script Treasure_A02 -1,{
-OnClock1200:
- SetCastleData "aldeg_cas02.gat",4,0;
- SetCastleData "aldeg_cas02.gat",5,0;
- KillMonster "aldeg_cas02.gat","Treasure_A02::TreasureDied";
- set $Economy1,GetCastleData("aldeg_cas02.gat",2);
- if ($Economy1 > 100) break;
- if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
- set $boxnum1,GetCastleData("aldeg_cas02.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum1 <= 0) break;
- set $boxid1,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid1 > 2) goto TreasureSpawn2;
- areamonster "aldeg_cas02.gat",130,226,138,235,"Treasure Chest",1326,1,"Treasure_A02::TreasureDied";
- set $boxnum1,$boxnum1-1;
- if ($boxnum1 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "aldeg_cas02.gat",130,226,138,235,"Treasure Chest",1327,1,"Treasure_A02::TreasureDied";
- set $boxnum1,$boxnum1-1;
- if ($boxnum1 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "aldeg_cas02.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas02 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in aldeg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+aldeg_cas02.gat,139,235,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "aldeg_cas02.gat",78,75;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+aldeg_cas02.gat,135,231,0 script Treasure_A02 -1,{
+OnClock1200:
+ SetCastleData "aldeg_cas02.gat",4,0;
+ SetCastleData "aldeg_cas02.gat",5,0;
+ KillMonster "aldeg_cas02.gat","Treasure_A02::TreasureDied";
+ set $Economy1,GetCastleData("aldeg_cas02.gat",2);
+ if ($Economy1 > 100) break;
+ if (GetCastleData("aldeg_cas02.gat",1) == 0) break;
+ set $boxnum1,GetCastleData("aldeg_cas02.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum1 <= 0) break;
+ set $boxid1,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid1 > 2) goto TreasureSpawn2;
+ areamonster "aldeg_cas02.gat",130,226,138,235,"Treasure Chest",1326,1,"Treasure_A02::TreasureDied";
+ set $boxnum1,$boxnum1-1;
+ if ($boxnum1 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "aldeg_cas02.gat",130,226,138,235,"Treasure Chest",1327,1,"Treasure_A02::TreasureDied";
+ set $boxnum1,$boxnum1-1;
+ if ($boxnum1 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "aldeg_cas02.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/aldeg_cas03_treasure.txt b/npc/guild/old/treasure/aldeg_cas03_treasure.txt
index 4b75e4b48..db47ae991 100644
--- a/npc/guild/old/treasure/aldeg_cas03_treasure.txt
+++ b/npc/guild/old/treasure/aldeg_cas03_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas03 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in aldeg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-aldeg_cas03.gat,229,267,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "aldeg_cas03.gat",110,119;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-aldeg_cas03.gat,225,269,0 script Treasure_A03 -1,{
-OnClock1200:
- SetCastleData "aldeg_cas03.gat",4,0;
- SetCastleData "aldeg_cas03.gat",5,0;
- KillMonster "aldeg_cas03.gat","Treasure_A03::TreasureDied";
- set $Economy2,GetCastleData("aldeg_cas03.gat",2);
- if ($Economy2 > 100) break;
- if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
- set $boxnum2,GetCastleData("aldeg_cas03.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum2 <= 0) break;
- set $boxid2,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid2 > 2) goto TreasureSpawn2;
- areamonster "aldeg_cas03.gat",220,264,229,273,"Treasure Chest",1328,1,"Treasure_A03::TreasureDied";
- set $boxnum2,$boxnum2-1;
- if ($boxnum2 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "aldeg_cas03.gat",220,264,229,273,"Treasure Chest",1329,1,"Treasure_A03::TreasureDied";
- set $boxnum2,$boxnum2-1;
- if ($boxnum2 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "aldeg_cas03.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas03 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in aldeg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+aldeg_cas03.gat,229,267,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "aldeg_cas03.gat",110,119;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+aldeg_cas03.gat,225,269,0 script Treasure_A03 -1,{
+OnClock1200:
+ SetCastleData "aldeg_cas03.gat",4,0;
+ SetCastleData "aldeg_cas03.gat",5,0;
+ KillMonster "aldeg_cas03.gat","Treasure_A03::TreasureDied";
+ set $Economy2,GetCastleData("aldeg_cas03.gat",2);
+ if ($Economy2 > 100) break;
+ if (GetCastleData("aldeg_cas03.gat",1) == 0) break;
+ set $boxnum2,GetCastleData("aldeg_cas03.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum2 <= 0) break;
+ set $boxid2,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid2 > 2) goto TreasureSpawn2;
+ areamonster "aldeg_cas03.gat",220,264,229,273,"Treasure Chest",1328,1,"Treasure_A03::TreasureDied";
+ set $boxnum2,$boxnum2-1;
+ if ($boxnum2 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "aldeg_cas03.gat",220,264,229,273,"Treasure Chest",1329,1,"Treasure_A03::TreasureDied";
+ set $boxnum2,$boxnum2-1;
+ if ($boxnum2 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "aldeg_cas03.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/aldeg_cas04_treasure.txt b/npc/guild/old/treasure/aldeg_cas04_treasure.txt
index 346a905a3..31f90af4b 100644
--- a/npc/guild/old/treasure/aldeg_cas04_treasure.txt
+++ b/npc/guild/old/treasure/aldeg_cas04_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas04 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in aldeg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-aldeg_cas04.gat,83,17,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "aldeg_cas04.gat",67,117;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-aldeg_cas04.gat,85,12,0 script Treasure_A04 -1,{
-OnClock1200:
- SetCastleData "aldeg_cas04.gat",4,0;
- SetCastleData "aldeg_cas04.gat",5,0;
- KillMonster "aldeg_cas04.gat","Treasure_A04::TreasureDied";
- set $Economy3,GetCastleData("aldeg_cas04.gat",2);
- if ($Economy3 > 100) break;
- if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
- set $boxnum3,GetCastleData("aldeg_cas04.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum3 <= 0) break;
- set $boxid3,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid3 > 2) goto TreasureSpawn2;
- areamonster "aldeg_cas04.gat",80,8,89,17,"Treasure Chest",1330,1,"Treasure_A04::TreasureDied";
- set $boxnum3,$boxnum3-1;
- if ($boxnum3 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "aldeg_cas04.gat",80,8,89,17,"Treasure Chest",1331,1,"Treasure_A04::TreasureDied";
- set $boxnum3,$boxnum3-1;
- if ($boxnum3 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "aldeg_cas04.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas04 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in aldeg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+aldeg_cas04.gat,83,17,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "aldeg_cas04.gat",67,117;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+aldeg_cas04.gat,85,12,0 script Treasure_A04 -1,{
+OnClock1200:
+ SetCastleData "aldeg_cas04.gat",4,0;
+ SetCastleData "aldeg_cas04.gat",5,0;
+ KillMonster "aldeg_cas04.gat","Treasure_A04::TreasureDied";
+ set $Economy3,GetCastleData("aldeg_cas04.gat",2);
+ if ($Economy3 > 100) break;
+ if (GetCastleData("aldeg_cas04.gat",1) == 0) break;
+ set $boxnum3,GetCastleData("aldeg_cas04.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum3 <= 0) break;
+ set $boxid3,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid3 > 2) goto TreasureSpawn2;
+ areamonster "aldeg_cas04.gat",80,8,89,17,"Treasure Chest",1330,1,"Treasure_A04::TreasureDied";
+ set $boxnum3,$boxnum3-1;
+ if ($boxnum3 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "aldeg_cas04.gat",80,8,89,17,"Treasure Chest",1331,1,"Treasure_A04::TreasureDied";
+ set $boxnum3,$boxnum3-1;
+ if ($boxnum3 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "aldeg_cas04.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/aldeg_cas05_treasure.txt b/npc/guild/old/treasure/aldeg_cas05_treasure.txt
index 3a3bbbc86..1324502e7 100644
--- a/npc/guild/old/treasure/aldeg_cas05_treasure.txt
+++ b/npc/guild/old/treasure/aldeg_cas05_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - aldeg_cas05 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in aldeg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-aldeg_cas05.gat,64,8,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "aldeg_cas05.gat",51,179;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-aldeg_cas05.gat,62,12,0 script Treasure_A05 -1,{
-OnClock1200:
- SetCastleData "aldeg_cas05.gat",4,0;
- SetCastleData "aldeg_cas05.gat",5,0;
- KillMonster "aldeg_cas05.gat","Treasure_A05::TreasureDied";
- set $Economy4,GetCastleData("aldeg_cas05.gat",2);
- if ($Economy4 > 100) break;
- if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
- set $boxnum4,GetCastleData("aldeg_cas05.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum4 <= 0) break;
- set $boxid4,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid4 > 2) goto TreasureSpawn2;
- areamonster "aldeg_cas05.gat",58,8,65,15,"Treasure Chest",1332,1,"Treasure_A05::TreasureDied";
- set $boxnum4,$boxnum4-1;
- if ($boxnum4 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "aldeg_cas05.gat",58,8,65,15,"Treasure Chest",1333,1,"Treasure_A05::TreasureDied";
- set $boxnum4,$boxnum4-1;
- if ($boxnum4 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "aldeg_cas05.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - aldeg_cas05 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in aldeg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+aldeg_cas05.gat,64,8,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "aldeg_cas05.gat",51,179;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+aldeg_cas05.gat,62,12,0 script Treasure_A05 -1,{
+OnClock1200:
+ SetCastleData "aldeg_cas05.gat",4,0;
+ SetCastleData "aldeg_cas05.gat",5,0;
+ KillMonster "aldeg_cas05.gat","Treasure_A05::TreasureDied";
+ set $Economy4,GetCastleData("aldeg_cas05.gat",2);
+ if ($Economy4 > 100) break;
+ if (GetCastleData("aldeg_cas05.gat",1) == 0) break;
+ set $boxnum4,GetCastleData("aldeg_cas05.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum4 <= 0) break;
+ set $boxid4,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid4 > 2) goto TreasureSpawn2;
+ areamonster "aldeg_cas05.gat",58,8,65,15,"Treasure Chest",1332,1,"Treasure_A05::TreasureDied";
+ set $boxnum4,$boxnum4-1;
+ if ($boxnum4 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "aldeg_cas05.gat",58,8,65,15,"Treasure Chest",1333,1,"Treasure_A05::TreasureDied";
+ set $boxnum4,$boxnum4-1;
+ if ($boxnum4 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "aldeg_cas05.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/gefg_cas01_treasure.txt b/npc/guild/old/treasure/gefg_cas01_treasure.txt
index 122fb660b..8a850c93b 100644
--- a/npc/guild/old/treasure/gefg_cas01_treasure.txt
+++ b/npc/guild/old/treasure/gefg_cas01_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas01 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in gefg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-gefg_cas01.gat,151,109,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "gefg_cas01.gat",40,49;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-gefg_cas01.gat,155,112,0 script Treasure_B01 -1,{
-OnClock1200:
- SetCastleData "gefg_cas01.gat",4,0;
- SetCastleData "gefg_cas01.gat",5,0;
- KillMonster "gefg_cas01.gat","Treasure_B01::TreasureDied";
- set $Economy5,GetCastleData("gefg_cas01.gat",2);
- if ($Economy5 > 100) break;
- if (GetCastleData("gefg_cas01.gat",1) == 0) break;
- set $boxnum5,GetCastleData("gefg_cas01.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum5 <= 0) break;
- set $boxid5,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid5 > 2) goto TreasureSpawn2;
- areamonster "gefg_cas01.gat",150,108,158,114,"Treasure Chest",1334,1,"Treasure_B01::TreasureDied";
- set $boxnum5,$boxnum5-1;
- if ($boxnum5 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "gefg_cas01.gat",150,108,158,114,"Treasure Chest",1335,1,"Treasure_B01::TreasureDied";
- set $boxnum5,$boxnum5-1;
- if ($boxnum5 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "gefg_cas01.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas01 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in gefg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+gefg_cas01.gat,151,109,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "gefg_cas01.gat",40,49;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+gefg_cas01.gat,155,112,0 script Treasure_B01 -1,{
+OnClock1200:
+ SetCastleData "gefg_cas01.gat",4,0;
+ SetCastleData "gefg_cas01.gat",5,0;
+ KillMonster "gefg_cas01.gat","Treasure_B01::TreasureDied";
+ set $Economy5,GetCastleData("gefg_cas01.gat",2);
+ if ($Economy5 > 100) break;
+ if (GetCastleData("gefg_cas01.gat",1) == 0) break;
+ set $boxnum5,GetCastleData("gefg_cas01.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum5 <= 0) break;
+ set $boxid5,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid5 > 2) goto TreasureSpawn2;
+ areamonster "gefg_cas01.gat",150,108,158,114,"Treasure Chest",1334,1,"Treasure_B01::TreasureDied";
+ set $boxnum5,$boxnum5-1;
+ if ($boxnum5 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "gefg_cas01.gat",150,108,158,114,"Treasure Chest",1335,1,"Treasure_B01::TreasureDied";
+ set $boxnum5,$boxnum5-1;
+ if ($boxnum5 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "gefg_cas01.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/gefg_cas02_treasure.txt b/npc/guild/old/treasure/gefg_cas02_treasure.txt
index a161f7190..b6a99c640 100644
--- a/npc/guild/old/treasure/gefg_cas02_treasure.txt
+++ b/npc/guild/old/treasure/gefg_cas02_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas02 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in gefg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-gefg_cas02.gat,137,113,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "gefg_cas02.gat",12,67;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-gefg_cas02.gat,141,115,0 script Treasure_B02 -1,{
-OnClock1200:
- SetCastleData "gefg_cas02.gat",4,0;
- SetCastleData "gefg_cas02.gat",5,0;
- KillMonster "gefg_cas02.gat","Treasure_B02::TreasureDied";
- set $Economy6,GetCastleData("gefg_cas02.gat",2);
- if ($Economy6 > 100) break;
- if (GetCastleData("gefg_cas02.gat",1) == 0) break;
- set $boxnum6,GetCastleData("gefg_cas02.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum6 <= 0) break;
- set $boxid6,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid6 > 2) goto TreasureSpawn2;
- areamonster "gefg_cas02.gat",136,112,145,118,"Treasure Chest",1336,1,"Treasure_B02::TreasureDied";
- set $boxnum6,$boxnum6-1;
- if ($boxnum6 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "gefg_cas02.gat",136,112,145,118,"Treasure Chest",1337,1,"Treasure_B02::TreasureDied";
- set $boxnum6,$boxnum6-1;
- if ($boxnum6 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "gefg_cas02.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas02 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in gefg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+gefg_cas02.gat,137,113,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "gefg_cas02.gat",12,67;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+gefg_cas02.gat,141,115,0 script Treasure_B02 -1,{
+OnClock1200:
+ SetCastleData "gefg_cas02.gat",4,0;
+ SetCastleData "gefg_cas02.gat",5,0;
+ KillMonster "gefg_cas02.gat","Treasure_B02::TreasureDied";
+ set $Economy6,GetCastleData("gefg_cas02.gat",2);
+ if ($Economy6 > 100) break;
+ if (GetCastleData("gefg_cas02.gat",1) == 0) break;
+ set $boxnum6,GetCastleData("gefg_cas02.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum6 <= 0) break;
+ set $boxid6,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid6 > 2) goto TreasureSpawn2;
+ areamonster "gefg_cas02.gat",136,112,145,118,"Treasure Chest",1336,1,"Treasure_B02::TreasureDied";
+ set $boxnum6,$boxnum6-1;
+ if ($boxnum6 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "gefg_cas02.gat",136,112,145,118,"Treasure Chest",1337,1,"Treasure_B02::TreasureDied";
+ set $boxnum6,$boxnum6-1;
+ if ($boxnum6 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "gefg_cas02.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/gefg_cas03_treasure.txt b/npc/guild/old/treasure/gefg_cas03_treasure.txt
index 7cf919115..85ec32e4c 100644
--- a/npc/guild/old/treasure/gefg_cas03_treasure.txt
+++ b/npc/guild/old/treasure/gefg_cas03_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas03 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in gefg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-gefg_cas03.gat,275,289,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "gefg_cas03.gat",106,24;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-gefg_cas03.gat,270,290,0 script Treasure_B03 -1,{
-OnClock1200:
- SetCastleData "gefg_cas03.gat",4,0;
- SetCastleData "gefg_cas03.gat",5,0;
- KillMonster "gefg_cas03.gat","Treasure_B03::TreasureDied";
- set $Economy7,GetCastleData("gefg_cas03.gat",2);
- if ($Economy7 > 100) break;
- if (GetCastleData("gefg_cas03.gat",1) == 0) break;
- set $boxnum7,GetCastleData("gefg_cas03.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum7 <= 0) break;
- set $boxid7,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid7 > 2) goto TreasureSpawn2;
- areamonster "gefg_cas03.gat",266,286,275,293,"Treasure Chest",1338,1,"Treasure_B03::TreasureDied";
- set $boxnum7,$boxnum7-1;
- if ($boxnum7 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "gefg_cas03.gat",266,286,275,293,"Treasure Chest",1339,1,"Treasure_B03::TreasureDied";
- set $boxnum7,$boxnum7-1;
- if ($boxnum7 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "gefg_cas03.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas03 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in gefg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+gefg_cas03.gat,275,289,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "gefg_cas03.gat",106,24;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+gefg_cas03.gat,270,290,0 script Treasure_B03 -1,{
+OnClock1200:
+ SetCastleData "gefg_cas03.gat",4,0;
+ SetCastleData "gefg_cas03.gat",5,0;
+ KillMonster "gefg_cas03.gat","Treasure_B03::TreasureDied";
+ set $Economy7,GetCastleData("gefg_cas03.gat",2);
+ if ($Economy7 > 100) break;
+ if (GetCastleData("gefg_cas03.gat",1) == 0) break;
+ set $boxnum7,GetCastleData("gefg_cas03.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum7 <= 0) break;
+ set $boxid7,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid7 > 2) goto TreasureSpawn2;
+ areamonster "gefg_cas03.gat",266,286,275,293,"Treasure Chest",1338,1,"Treasure_B03::TreasureDied";
+ set $boxnum7,$boxnum7-1;
+ if ($boxnum7 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "gefg_cas03.gat",266,286,275,293,"Treasure Chest",1339,1,"Treasure_B03::TreasureDied";
+ set $boxnum7,$boxnum7-1;
+ if ($boxnum7 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "gefg_cas03.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/gefg_cas04_treasure.txt b/npc/guild/old/treasure/gefg_cas04_treasure.txt
index 648fa5740..3923ac738 100644
--- a/npc/guild/old/treasure/gefg_cas04_treasure.txt
+++ b/npc/guild/old/treasure/gefg_cas04_treasure.txt
@@ -1,68 +1,68 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas04 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in gefg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-
-gefg_cas04.gat,117,123,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "gefg_cas04.gat",73,47;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-gefg_cas04.gat,116,118,0 script Treasure_B04 -1,{
-OnClock1200:
- SetCastleData "gefg_cas04.gat",4,0;
- SetCastleData "gefg_cas04.gat",5,0;
- KillMonster "gefg_cas04.gat","Treasure_B04::TreasureDied";
- set $Economy8,GetCastleData("gefg_cas04.gat",2);
- if ($Economy8 > 100) break;
- if (GetCastleData("gefg_cas04.gat",1) == 0) break;
- set $boxnum8,GetCastleData("gefg_cas04.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum8 <= 0) break;
- set $boxid8,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid8 > 2) goto TreasureSpawn2;
- areamonster "gefg_cas04.gat",112,114,119,123,"Treasure Chest",1340,1,"Treasure_B04::TreasureDied";
- set $boxnum8,$boxnum8-1;
- if ($boxnum8 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "gefg_cas04.gat",112,114,119,123,"Treasure Chest",1341,1,"Treasure_B04::TreasureDied";
- set $boxnum8,$boxnum8-1;
- if ($boxnum8 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "gefg_cas04.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas04 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in gefg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+
+gefg_cas04.gat,117,123,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "gefg_cas04.gat",73,47;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+gefg_cas04.gat,116,118,0 script Treasure_B04 -1,{
+OnClock1200:
+ SetCastleData "gefg_cas04.gat",4,0;
+ SetCastleData "gefg_cas04.gat",5,0;
+ KillMonster "gefg_cas04.gat","Treasure_B04::TreasureDied";
+ set $Economy8,GetCastleData("gefg_cas04.gat",2);
+ if ($Economy8 > 100) break;
+ if (GetCastleData("gefg_cas04.gat",1) == 0) break;
+ set $boxnum8,GetCastleData("gefg_cas04.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum8 <= 0) break;
+ set $boxid8,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid8 > 2) goto TreasureSpawn2;
+ areamonster "gefg_cas04.gat",112,114,119,123,"Treasure Chest",1340,1,"Treasure_B04::TreasureDied";
+ set $boxnum8,$boxnum8-1;
+ if ($boxnum8 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "gefg_cas04.gat",112,114,119,123,"Treasure Chest",1341,1,"Treasure_B04::TreasureDied";
+ set $boxnum8,$boxnum8-1;
+ if ($boxnum8 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "gefg_cas04.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/gefg_cas05_treasure.txt b/npc/guild/old/treasure/gefg_cas05_treasure.txt
index af54278e0..b02c89f70 100644
--- a/npc/guild/old/treasure/gefg_cas05_treasure.txt
+++ b/npc/guild/old/treasure/gefg_cas05_treasure.txt
@@ -1,68 +1,68 @@
-//===== eAthena Script =======================================
-//= War of Emperium - gefg_cas05 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in gefg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-
-gefg_cas05.gat,149,107,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "gefg_cas05.gat",70,53;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-gefg_cas05.gat,144,110,0 script Treasure_B05 -1,{
-OnClock1200:
- SetCastleData "gefg_cas05.gat",4,0;
- SetCastleData "gefg_cas05.gat",5,0;
- KillMonster "gefg_cas05.gat","Treasure_B05::TreasureDied";
- set $Economy9,GetCastleData("gefg_cas05.gat",2);
- if ($Economy9 > 100) break;
- if (GetCastleData("gefg_cas05.gat",1) == 0) break;
- set $boxnum9,GetCastleData("gefg_cas05.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum9 <= 0) break;
- set $boxid9,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid9 > 2) goto TreasureSpawn2;
- areamonster "gefg_cas05.gat",140,106,147,113,"Treasure Chest",1342,1,"Treasure_B05::TreasureDied";
- set $boxnum9,$boxnum9-1;
- if ($boxnum9 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "gefg_cas05.gat",140,106,147,113,"Treasure Chest",1343,1,"Treasure_B05::TreasureDied";
- set $boxnum9,$boxnum9-1;
- if ($boxnum9 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "gefg_cas05.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - gefg_cas05 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in gefg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+
+gefg_cas05.gat,149,107,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "gefg_cas05.gat",70,53;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+gefg_cas05.gat,144,110,0 script Treasure_B05 -1,{
+OnClock1200:
+ SetCastleData "gefg_cas05.gat",4,0;
+ SetCastleData "gefg_cas05.gat",5,0;
+ KillMonster "gefg_cas05.gat","Treasure_B05::TreasureDied";
+ set $Economy9,GetCastleData("gefg_cas05.gat",2);
+ if ($Economy9 > 100) break;
+ if (GetCastleData("gefg_cas05.gat",1) == 0) break;
+ set $boxnum9,GetCastleData("gefg_cas05.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum9 <= 0) break;
+ set $boxid9,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid9 > 2) goto TreasureSpawn2;
+ areamonster "gefg_cas05.gat",140,106,147,113,"Treasure Chest",1342,1,"Treasure_B05::TreasureDied";
+ set $boxnum9,$boxnum9-1;
+ if ($boxnum9 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "gefg_cas05.gat",140,106,147,113,"Treasure Chest",1343,1,"Treasure_B05::TreasureDied";
+ set $boxnum9,$boxnum9-1;
+ if ($boxnum9 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "gefg_cas05.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/payg_cas01_treasure.txt b/npc/guild/old/treasure/payg_cas01_treasure.txt
index c2a382316..3e6cbd035 100644
--- a/npc/guild/old/treasure/payg_cas01_treasure.txt
+++ b/npc/guild/old/treasure/payg_cas01_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas01 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in payg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-payg_cas01.gat,295,8,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "payg_cas01.gat",120,59;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-payg_cas01.gat,290,7,0 script Treasure_C01 -1,{
-OnClock1200:
- SetCastleData "payg_cas01.gat",4,0;
- SetCastleData "payg_cas01.gat",5,0;
- KillMonster "payg_cas01.gat","Treasure_C01::TreasureDied";
- set $Economy10,GetCastleData("payg_cas01.gat",2);
- if ($Economy10 > 100) break;
- if (GetCastleData("payg_cas01.gat",1) == 0) break;
- set $boxnum10,GetCastleData("payg_cas01.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum10 <= 0) break;
- set $boxid10,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid10 > 2) goto TreasureSpawn2;
- areamonster "payg_cas01.gat",286,4,295,13,"Treasure Chest",1344,1,"Treasure_C01::TreasureDied";
- set $boxnum10,$boxnum10-1;
- if ($boxnum10 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "payg_cas01.gat",286,4,295,13,"Treasure Chest",1345,1,"Treasure_C01::TreasureDied";
- set $boxnum10,$boxnum10-1;
- if ($boxnum10 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "payg_cas01.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas01 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in payg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+payg_cas01.gat,295,8,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "payg_cas01.gat",120,59;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+payg_cas01.gat,290,7,0 script Treasure_C01 -1,{
+OnClock1200:
+ SetCastleData "payg_cas01.gat",4,0;
+ SetCastleData "payg_cas01.gat",5,0;
+ KillMonster "payg_cas01.gat","Treasure_C01::TreasureDied";
+ set $Economy10,GetCastleData("payg_cas01.gat",2);
+ if ($Economy10 > 100) break;
+ if (GetCastleData("payg_cas01.gat",1) == 0) break;
+ set $boxnum10,GetCastleData("payg_cas01.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum10 <= 0) break;
+ set $boxid10,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid10 > 2) goto TreasureSpawn2;
+ areamonster "payg_cas01.gat",286,4,295,13,"Treasure Chest",1344,1,"Treasure_C01::TreasureDied";
+ set $boxnum10,$boxnum10-1;
+ if ($boxnum10 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "payg_cas01.gat",286,4,295,13,"Treasure Chest",1345,1,"Treasure_C01::TreasureDied";
+ set $boxnum10,$boxnum10-1;
+ if ($boxnum10 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "payg_cas01.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/payg_cas02_treasure.txt b/npc/guild/old/treasure/payg_cas02_treasure.txt
index c09679306..f0048c64b 100644
--- a/npc/guild/old/treasure/payg_cas02_treasure.txt
+++ b/npc/guild/old/treasure/payg_cas02_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas02 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in payg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-payg_cas02.gat,149,148,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "payg_cas02.gat",22,261;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-payg_cas02.gat,145,143,0 script Treasure_C02 -1,{
-OnClock1200:
- SetCastleData "payg_cas02.gat",4,0;
- SetCastleData "payg_cas02.gat",5,0;
- KillMonster "payg_cas02.gat","Treasure_C02::TreasureDied";
- set $Economy11,GetCastleData("payg_cas02.gat",2);
- if ($Economy11 > 100) break;
- if (GetCastleData("payg_cas02.gat",1) == 0) break;
- set $boxnum11,GetCastleData("payg_cas02.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum11 <= 0) break;
- set $boxid11,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid11 > 2) goto TreasureSpawn2;
- areamonster "payg_cas02.gat",140,140,148,149,"Treasure Chest",1346,1,"Treasure_C02::TreasureDied";
- set $boxnum11,$boxnum11-1;
- if ($boxnum11 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "payg_cas02.gat",140,140,148,149,"Treasure Chest",1347,1,"Treasure_C02::TreasureDied";
- set $boxnum11,$boxnum11-1;
- if ($boxnum11 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "payg_cas02.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas02 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in payg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+payg_cas02.gat,149,148,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "payg_cas02.gat",22,261;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+payg_cas02.gat,145,143,0 script Treasure_C02 -1,{
+OnClock1200:
+ SetCastleData "payg_cas02.gat",4,0;
+ SetCastleData "payg_cas02.gat",5,0;
+ KillMonster "payg_cas02.gat","Treasure_C02::TreasureDied";
+ set $Economy11,GetCastleData("payg_cas02.gat",2);
+ if ($Economy11 > 100) break;
+ if (GetCastleData("payg_cas02.gat",1) == 0) break;
+ set $boxnum11,GetCastleData("payg_cas02.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum11 <= 0) break;
+ set $boxid11,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid11 > 2) goto TreasureSpawn2;
+ areamonster "payg_cas02.gat",140,140,148,149,"Treasure Chest",1346,1,"Treasure_C02::TreasureDied";
+ set $boxnum11,$boxnum11-1;
+ if ($boxnum11 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "payg_cas02.gat",140,140,148,149,"Treasure Chest",1347,1,"Treasure_C02::TreasureDied";
+ set $boxnum11,$boxnum11-1;
+ if ($boxnum11 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "payg_cas02.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/payg_cas03_treasure.txt b/npc/guild/old/treasure/payg_cas03_treasure.txt
index 7e2345df5..fa2e1e5a4 100644
--- a/npc/guild/old/treasure/payg_cas03_treasure.txt
+++ b/npc/guild/old/treasure/payg_cas03_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas03 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in payg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-payg_cas03.gat,163,167,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "payg_cas03.gat",50,261;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-payg_cas03.gat,158,168,0 script Treasure_C03 -1,{
-OnClock1200:
- SetCastleData "payg_cas03.gat",4,0;
- SetCastleData "payg_cas03.gat",5,0;
- KillMonster "payg_cas03.gat","Treasure_C03::TreasureDied";
- set $Economy12,GetCastleData("payg_cas03.gat",2);
- if ($Economy12 > 100) break;
- if (GetCastleData("payg_cas03.gat",1) == 0) break;
- set $boxnum12,GetCastleData("payg_cas03.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum12 <= 0) break;
- set $boxid12,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid12 > 2) goto TreasureSpawn2;
- areamonster "payg_cas03.gat",154,164,162,173,"Treasure Chest",1348,1,"Treasure_C03::TreasureDied";
- set $boxnum12,$boxnum12-1;
- if ($boxnum12 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "payg_cas03.gat",154,164,162,173,"Treasure Chest",1349,1,"Treasure_C03::TreasureDied";
- set $boxnum12,$boxnum12-1;
- if ($boxnum12 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "payg_cas03.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas03 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in payg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+payg_cas03.gat,163,167,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "payg_cas03.gat",50,261;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+payg_cas03.gat,158,168,0 script Treasure_C03 -1,{
+OnClock1200:
+ SetCastleData "payg_cas03.gat",4,0;
+ SetCastleData "payg_cas03.gat",5,0;
+ KillMonster "payg_cas03.gat","Treasure_C03::TreasureDied";
+ set $Economy12,GetCastleData("payg_cas03.gat",2);
+ if ($Economy12 > 100) break;
+ if (GetCastleData("payg_cas03.gat",1) == 0) break;
+ set $boxnum12,GetCastleData("payg_cas03.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum12 <= 0) break;
+ set $boxid12,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid12 > 2) goto TreasureSpawn2;
+ areamonster "payg_cas03.gat",154,164,162,173,"Treasure Chest",1348,1,"Treasure_C03::TreasureDied";
+ set $boxnum12,$boxnum12-1;
+ if ($boxnum12 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "payg_cas03.gat",154,164,162,173,"Treasure Chest",1349,1,"Treasure_C03::TreasureDied";
+ set $boxnum12,$boxnum12-1;
+ if ($boxnum12 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "payg_cas03.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/payg_cas04_treasure.txt b/npc/guild/old/treasure/payg_cas04_treasure.txt
index 1b9b47399..4e4ff095d 100644
--- a/npc/guild/old/treasure/payg_cas04_treasure.txt
+++ b/npc/guild/old/treasure/payg_cas04_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas04 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in payg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-payg_cas04.gat,151,47,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "payg_cas04.gat",38,285;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-payg_cas04.gat,146,48,0 script Treasure_C04 -1,{
-OnClock1200:
- SetCastleData "payg_cas04.gat",4,0;
- SetCastleData "payg_cas04.gat",5,0;
- KillMonster "payg_cas04.gat","Treasure_C04::TreasureDied";
- set $Economy13,GetCastleData("payg_cas04.gat",2);
- if ($Economy13 > 100) break;
- if (GetCastleData("payg_cas04.gat",1) == 0) break;
- set $boxnum13,GetCastleData("payg_cas04.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum13 <= 0) break;
- set $boxid13,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid13 > 2) goto TreasureSpawn2;
- areamonster "payg_cas04.gat",142,44,151,51,"Treasure Chest",1350,1,"Treasure_C04::TreasureDied";
- set $boxnum13,$boxnum13-1;
- if ($boxnum13 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "payg_cas04.gat",142,44,151,51,"Treasure Chest",1351,1,"Treasure_C04::TreasureDied";
- set $boxnum13,$boxnum13-1;
- if ($boxnum13 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "payg_cas04.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas04 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in payg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+payg_cas04.gat,151,47,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "payg_cas04.gat",38,285;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+payg_cas04.gat,146,48,0 script Treasure_C04 -1,{
+OnClock1200:
+ SetCastleData "payg_cas04.gat",4,0;
+ SetCastleData "payg_cas04.gat",5,0;
+ KillMonster "payg_cas04.gat","Treasure_C04::TreasureDied";
+ set $Economy13,GetCastleData("payg_cas04.gat",2);
+ if ($Economy13 > 100) break;
+ if (GetCastleData("payg_cas04.gat",1) == 0) break;
+ set $boxnum13,GetCastleData("payg_cas04.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum13 <= 0) break;
+ set $boxid13,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid13 > 2) goto TreasureSpawn2;
+ areamonster "payg_cas04.gat",142,44,151,51,"Treasure Chest",1350,1,"Treasure_C04::TreasureDied";
+ set $boxnum13,$boxnum13-1;
+ if ($boxnum13 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "payg_cas04.gat",142,44,151,51,"Treasure Chest",1351,1,"Treasure_C04::TreasureDied";
+ set $boxnum13,$boxnum13-1;
+ if ($boxnum13 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "payg_cas04.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/payg_cas05_treasure.txt b/npc/guild/old/treasure/payg_cas05_treasure.txt
index f4d494870..e7268e769 100644
--- a/npc/guild/old/treasure/payg_cas05_treasure.txt
+++ b/npc/guild/old/treasure/payg_cas05_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - payg_cas05 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in payg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-payg_cas05.gat,161,136,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "payg_cas05.gat",277,250;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-payg_cas05.gat,156,131,0 script Treasure_C05 -1,{
-OnClock1200:
- SetCastleData "payg_cas05.gat",4,0;
- SetCastleData "payg_cas05.gat",5,0;
- KillMonster "payg_cas05.gat","Treasure_C05::TreasureDied";
- set $Economy14,GetCastleData("payg_cas05.gat",2);
- if ($Economy14 > 100) break;
- if (GetCastleData("payg_cas05.gat",1) == 0) break;
- set $boxnum14,GetCastleData("payg_cas05.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum14 <= 0) break;
- set $boxid14,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid14 > 2) goto TreasureSpawn2;
- areamonster "payg_cas05.gat",152,128,160,135,"Treasure Chest",1352,1,"Treasure_C05::TreasureDied";
- set $boxnum14,$boxnum14-1;
- if ($boxnum14 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "payg_cas05.gat",152,128,160,135,"Treasure Chest",1353,1,"Treasure_C05::TreasureDied";
- set $boxnum14,$boxnum14-1;
- if ($boxnum14 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "payg_cas05.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - payg_cas05 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in payg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+payg_cas05.gat,161,136,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "payg_cas05.gat",277,250;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+payg_cas05.gat,156,131,0 script Treasure_C05 -1,{
+OnClock1200:
+ SetCastleData "payg_cas05.gat",4,0;
+ SetCastleData "payg_cas05.gat",5,0;
+ KillMonster "payg_cas05.gat","Treasure_C05::TreasureDied";
+ set $Economy14,GetCastleData("payg_cas05.gat",2);
+ if ($Economy14 > 100) break;
+ if (GetCastleData("payg_cas05.gat",1) == 0) break;
+ set $boxnum14,GetCastleData("payg_cas05.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum14 <= 0) break;
+ set $boxid14,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid14 > 2) goto TreasureSpawn2;
+ areamonster "payg_cas05.gat",152,128,160,135,"Treasure Chest",1352,1,"Treasure_C05::TreasureDied";
+ set $boxnum14,$boxnum14-1;
+ if ($boxnum14 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "payg_cas05.gat",152,128,160,135,"Treasure Chest",1353,1,"Treasure_C05::TreasureDied";
+ set $boxnum14,$boxnum14-1;
+ if ($boxnum14 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "payg_cas05.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/prtg_cas01_treasure.txt b/npc/guild/old/treasure/prtg_cas01_treasure.txt
index 64ac99730..1595c8a57 100644
--- a/npc/guild/old/treasure/prtg_cas01_treasure.txt
+++ b/npc/guild/old/treasure/prtg_cas01_treasure.txt
@@ -1,72 +1,72 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas01 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in prtg_cas01
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-prtg_cas01.gat,15,209,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "prtg_cas01.gat",112,183;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-prtg_cas01.gat,11,208,0 script Treasure_D01 -1,{
-OnClock1200:
- SetCastleData "prtg_cas01.gat",4,0;
- SetCastleData "prtg_cas01.gat",5,0;
- KillMonster "prtg_cas01.gat","Treasure_D01::TreasureDied";
- set $Economy15,GetCastleData("prtg_cas01.gat",2);
- if ($Economy15 > 100) break;
- if (GetCastleData("prtg_cas01.gat",1) == 0) break;
- set $boxnum15,GetCastleData("prtg_cas01.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum15 <= 0) break;
- set $boxid15,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid15 > 2) goto TreasureSpawn2;
- areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",1354,1,"Treasure_D01::TreasureDied";
- set $boxnum15,$boxnum15-1;
- if ($boxnum15 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",1355,1,"Treasure_D01::TreasureDied";
- set $boxnum15,$boxnum15-1;
- if ($boxnum15 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "prtg_cas01.gat","Treasure Chest Broken Open",17;
- break;
-
-Rehash:
- set $boxid15,1324;
- areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",$boxid15,$boxnum15,"Treasure_D01::TreasureDied";
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas01 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in prtg_cas01
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+prtg_cas01.gat,15,209,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "prtg_cas01.gat",112,183;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+prtg_cas01.gat,11,208,0 script Treasure_D01 -1,{
+OnClock1200:
+ SetCastleData "prtg_cas01.gat",4,0;
+ SetCastleData "prtg_cas01.gat",5,0;
+ KillMonster "prtg_cas01.gat","Treasure_D01::TreasureDied";
+ set $Economy15,GetCastleData("prtg_cas01.gat",2);
+ if ($Economy15 > 100) break;
+ if (GetCastleData("prtg_cas01.gat",1) == 0) break;
+ set $boxnum15,GetCastleData("prtg_cas01.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum15 <= 0) break;
+ set $boxid15,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid15 > 2) goto TreasureSpawn2;
+ areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",1354,1,"Treasure_D01::TreasureDied";
+ set $boxnum15,$boxnum15-1;
+ if ($boxnum15 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",1355,1,"Treasure_D01::TreasureDied";
+ set $boxnum15,$boxnum15-1;
+ if ($boxnum15 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "prtg_cas01.gat","Treasure Chest Broken Open",17;
+ break;
+
+Rehash:
+ set $boxid15,1324;
+ areamonster "prtg_cas01.gat",6,204,15,213,"Treasure Chest",$boxid15,$boxnum15,"Treasure_D01::TreasureDied";
+ break;
+}
diff --git a/npc/guild/old/treasure/prtg_cas02_treasure.txt b/npc/guild/old/treasure/prtg_cas02_treasure.txt
index c0ca674fb..3c51b90cc 100644
--- a/npc/guild/old/treasure/prtg_cas02_treasure.txt
+++ b/npc/guild/old/treasure/prtg_cas02_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas02 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in prtg_cas02
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-prtg_cas02.gat,207,228,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "prtg_cas02.gat",94,62;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-prtg_cas02.gat,202,228,0 script Treasure_D02 -1,{
-OnClock1200:
- SetCastleData "prtg_cas02.gat",4,0;
- SetCastleData "prtg_cas02.gat",5,0;
- KillMonster "prtg_cas02.gat","Treasure_D02::TreasureDied";
- set $Economy16,GetCastleData("prtg_cas02.gat",2);
- if ($Economy16 > 100) break;
- if (GetCastleData("prtg_cas02.gat",1) == 0) break;
- set $boxnum16,GetCastleData("prtg_cas02.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum16 <= 0) break;
- set $boxid16,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid16 > 2) goto TreasureSpawn2;
- areamonster "prtg_cas02.gat",198,224,207,233,"Treasure Chest",1356,1,"Treasure_D02::TreasureDied";
- set $boxnum16,$boxnum16-1;
- if ($boxnum16 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "prtg_cas02.gat",198,224,207,233,"Treasure Chest",1357,1,"Treasure_D02::TreasureDied";
- set $boxnum16,$boxnum16-1;
- if ($boxnum16 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "prtg_cas02.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas02 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in prtg_cas02
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+prtg_cas02.gat,207,228,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "prtg_cas02.gat",94,62;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+prtg_cas02.gat,202,228,0 script Treasure_D02 -1,{
+OnClock1200:
+ SetCastleData "prtg_cas02.gat",4,0;
+ SetCastleData "prtg_cas02.gat",5,0;
+ KillMonster "prtg_cas02.gat","Treasure_D02::TreasureDied";
+ set $Economy16,GetCastleData("prtg_cas02.gat",2);
+ if ($Economy16 > 100) break;
+ if (GetCastleData("prtg_cas02.gat",1) == 0) break;
+ set $boxnum16,GetCastleData("prtg_cas02.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum16 <= 0) break;
+ set $boxid16,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid16 > 2) goto TreasureSpawn2;
+ areamonster "prtg_cas02.gat",198,224,207,233,"Treasure Chest",1356,1,"Treasure_D02::TreasureDied";
+ set $boxnum16,$boxnum16-1;
+ if ($boxnum16 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "prtg_cas02.gat",198,224,207,233,"Treasure Chest",1357,1,"Treasure_D02::TreasureDied";
+ set $boxnum16,$boxnum16-1;
+ if ($boxnum16 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "prtg_cas02.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/prtg_cas03_treasure.txt b/npc/guild/old/treasure/prtg_cas03_treasure.txt
index d32485b7e..3051e190b 100644
--- a/npc/guild/old/treasure/prtg_cas03_treasure.txt
+++ b/npc/guild/old/treasure/prtg_cas03_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas03 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in prtg_cas03
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-prtg_cas03.gat,193,130,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "prtg_cas03.gat",51,101;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-prtg_cas03.gat,189,132,0 script Treasure_D03 -1,{
-OnClock1200:
- SetCastleData "prtg_cas03.gat",4,0;
- SetCastleData "prtg_cas03.gat",5,0;
- KillMonster "prtg_cas03.gat","Treasure_D03::TreasureDied";
- set $Economy17,GetCastleData("prtg_cas03.gat",2);
- if ($Economy17 > 100) break;
- if (GetCastleData("prtg_cas03.gat",1) == 0) break;
- set $boxnum17,GetCastleData("prtg_cas03.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum17 <= 0) break;
- set $boxid17,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid17 > 2) goto TreasureSpawn2;
- areamonster "prtg_cas03.gat",184,128,193,135,"Treasure Chest",1358,1,"Treasure_D03::TreasureDied";
- set $boxnum17,$boxnum17-1;
- if ($boxnum17 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "prtg_cas03.gat",184,128,193,135,"Treasure Chest",1359,1,"Treasure_D03::TreasureDied";
- set $boxnum17,$boxnum17-1;
- if ($boxnum17 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "prtg_cas03.gat","Treasure Chest Broken Open",17;
- break;
-}
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas03 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in prtg_cas03
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+prtg_cas03.gat,193,130,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "prtg_cas03.gat",51,101;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+prtg_cas03.gat,189,132,0 script Treasure_D03 -1,{
+OnClock1200:
+ SetCastleData "prtg_cas03.gat",4,0;
+ SetCastleData "prtg_cas03.gat",5,0;
+ KillMonster "prtg_cas03.gat","Treasure_D03::TreasureDied";
+ set $Economy17,GetCastleData("prtg_cas03.gat",2);
+ if ($Economy17 > 100) break;
+ if (GetCastleData("prtg_cas03.gat",1) == 0) break;
+ set $boxnum17,GetCastleData("prtg_cas03.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum17 <= 0) break;
+ set $boxid17,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid17 > 2) goto TreasureSpawn2;
+ areamonster "prtg_cas03.gat",184,128,193,135,"Treasure Chest",1358,1,"Treasure_D03::TreasureDied";
+ set $boxnum17,$boxnum17-1;
+ if ($boxnum17 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "prtg_cas03.gat",184,128,193,135,"Treasure Chest",1359,1,"Treasure_D03::TreasureDied";
+ set $boxnum17,$boxnum17-1;
+ if ($boxnum17 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "prtg_cas03.gat","Treasure Chest Broken Open",17;
+ break;
+}
diff --git a/npc/guild/old/treasure/prtg_cas04_treasure.txt b/npc/guild/old/treasure/prtg_cas04_treasure.txt
index ee5dbcc16..a4890dc38 100644
--- a/npc/guild/old/treasure/prtg_cas04_treasure.txt
+++ b/npc/guild/old/treasure/prtg_cas04_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas04 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in prtg_cas04
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-prtg_cas04.gat,275,160,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "prtg_cas04.gat",259,265;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-prtg_cas04.gat,271,162,0 script Treasure_D04 -1,{
-OnClock1200:
- SetCastleData "prtg_cas04.gat",4,0;
- SetCastleData "prtg_cas04.gat",5,0;
- KillMonster "prtg_cas04.gat","Treasure_D04::TreasureDied";
- set $Economy18,GetCastleData("prtg_cas04.gat",2);
- if ($Economy18 > 100) break;
- if (GetCastleData("prtg_cas04.gat",1) == 0) break;
- set $boxnum18,GetCastleData("prtg_cas04.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum18 <= 0) break;
- set $boxid18,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid18 > 2) goto TreasureSpawn2;
- areamonster "prtg_cas04.gat",266,158,275,167,"Treasure Chest",1360,1,"Treasure_D04::TreasureDied";
- set $boxnum18,$boxnum18-1;
- if ($boxnum18 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "prtg_cas04.gat",266,158,275,167,"Treasure Chest",1361,1,"Treasure_D04::TreasureDied";
- set $boxnum18,$boxnum18-1;
- if ($boxnum18 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "prtg_cas04.gat","Treasure Chest Broken Open",17;
- break;
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas04 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in prtg_cas04
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+prtg_cas04.gat,275,160,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "prtg_cas04.gat",259,265;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+prtg_cas04.gat,271,162,0 script Treasure_D04 -1,{
+OnClock1200:
+ SetCastleData "prtg_cas04.gat",4,0;
+ SetCastleData "prtg_cas04.gat",5,0;
+ KillMonster "prtg_cas04.gat","Treasure_D04::TreasureDied";
+ set $Economy18,GetCastleData("prtg_cas04.gat",2);
+ if ($Economy18 > 100) break;
+ if (GetCastleData("prtg_cas04.gat",1) == 0) break;
+ set $boxnum18,GetCastleData("prtg_cas04.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum18 <= 0) break;
+ set $boxid18,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid18 > 2) goto TreasureSpawn2;
+ areamonster "prtg_cas04.gat",266,158,275,167,"Treasure Chest",1360,1,"Treasure_D04::TreasureDied";
+ set $boxnum18,$boxnum18-1;
+ if ($boxnum18 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "prtg_cas04.gat",266,158,275,167,"Treasure Chest",1361,1,"Treasure_D04::TreasureDied";
+ set $boxnum18,$boxnum18-1;
+ if ($boxnum18 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "prtg_cas04.gat","Treasure Chest Broken Open",17;
+ break;
} \ No newline at end of file
diff --git a/npc/guild/old/treasure/prtg_cas05_treasure.txt b/npc/guild/old/treasure/prtg_cas05_treasure.txt
index 7d126ef31..5678799af 100644
--- a/npc/guild/old/treasure/prtg_cas05_treasure.txt
+++ b/npc/guild/old/treasure/prtg_cas05_treasure.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script =======================================
-//= War of Emperium - prtg_cas05 Treasure Room Script
-//===== By: ==================================================
-//= holyAngelX (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Treasure Room Script in prtg_cas05
-//===== Additional Comments: =================================
-//= 1.1 by Akaru and ho|yAnge|X
-//============================================================
-
-//================================================
-// Exit Treasure Room Switch
-//================================================
-prtg_cas05.gat,281,176,0 script Switch 111,{
- mes " ";
- mes "There is little switch over here";
- mes "Would you like to pull the switch down?";
- next;
- menu "Yes",L1,"No",L2;
-
-L1:
- warp "prtg_cas05.gat",36,38;
-
-L2:
- close;
-}
-
-//================================================
-// Treasure Spawning Script
-//================================================
-prtg_cas05.gat,277,178,0 script Treasure_D05 -1,{
-OnClock1200:
- SetCastleData "prtg_cas05.gat",4,0;
- SetCastleData "prtg_cas05.gat",5,0;
- KillMonster "prtg_cas05.gat","Treasure_D05::TreasureDied";
- set $Economy19,GetCastleData("prtg_cas05.gat",2);
- if ($Economy19 > 100) break;
- if (GetCastleData("prtg_cas05.gat",1) == 0) break;
- set $boxnum19,GetCastleData("prtg_cas05.gat",2)/5+4;
- goto TreasureCheck;
-
-TreasureCheck:
- if ($boxnum19 <= 0) break;
- set $boxid19,rand(4);
- goto TreasureSpawn;
-
-TreasureSpawn:
- if ($boxid19 > 2) goto TreasureSpawn2;
- areamonster "prtg_cas05.gat",272,174,279,181,"Treasure Chest",1362,1,"Treasure_D05::TreasureDied";
- set $boxnum19,$boxnum19-1;
- if ($boxnum19 <= 0) break;
- goto TreasureCheck;
-
-TreasureSpawn2:
- areamonster "prtg_cas05.gat",272,174,279,181,"Treasure Chest",1363,1,"Treasure_D05::TreasureDied";
- set $boxnum19,$boxnum19-1;
- if ($boxnum19 <= 0) break;
- goto TreasureCheck;
-
-TreasureDied:
- MapAnnounce "prtg_cas05.gat","Treasure Chest Broken Open",17;
- break;
+//===== eAthena Script =======================================
+//= War of Emperium - prtg_cas05 Treasure Room Script
+//===== By: ==================================================
+//= holyAngelX (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Treasure Room Script in prtg_cas05
+//===== Additional Comments: =================================
+//= 1.1 by Akaru and ho|yAnge|X
+//============================================================
+
+//================================================
+// Exit Treasure Room Switch
+//================================================
+prtg_cas05.gat,281,176,0 script Switch 111,{
+ mes " ";
+ mes "There is little switch over here";
+ mes "Would you like to pull the switch down?";
+ next;
+ menu "Yes",L1,"No",L2;
+
+L1:
+ warp "prtg_cas05.gat",36,38;
+
+L2:
+ close;
+}
+
+//================================================
+// Treasure Spawning Script
+//================================================
+prtg_cas05.gat,277,178,0 script Treasure_D05 -1,{
+OnClock1200:
+ SetCastleData "prtg_cas05.gat",4,0;
+ SetCastleData "prtg_cas05.gat",5,0;
+ KillMonster "prtg_cas05.gat","Treasure_D05::TreasureDied";
+ set $Economy19,GetCastleData("prtg_cas05.gat",2);
+ if ($Economy19 > 100) break;
+ if (GetCastleData("prtg_cas05.gat",1) == 0) break;
+ set $boxnum19,GetCastleData("prtg_cas05.gat",2)/5+4;
+ goto TreasureCheck;
+
+TreasureCheck:
+ if ($boxnum19 <= 0) break;
+ set $boxid19,rand(4);
+ goto TreasureSpawn;
+
+TreasureSpawn:
+ if ($boxid19 > 2) goto TreasureSpawn2;
+ areamonster "prtg_cas05.gat",272,174,279,181,"Treasure Chest",1362,1,"Treasure_D05::TreasureDied";
+ set $boxnum19,$boxnum19-1;
+ if ($boxnum19 <= 0) break;
+ goto TreasureCheck;
+
+TreasureSpawn2:
+ areamonster "prtg_cas05.gat",272,174,279,181,"Treasure Chest",1363,1,"Treasure_D05::TreasureDied";
+ set $boxnum19,$boxnum19-1;
+ if ($boxnum19 <= 0) break;
+ goto TreasureCheck;
+
+TreasureDied:
+ MapAnnounce "prtg_cas05.gat","Treasure Chest Broken Open",17;
+ break;
} \ 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 19b783d91..a873f9bea 100644
--- a/npc/guild/payg/payg_ev_agit.txt
+++ b/npc/guild/payg/payg_ev_agit.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-// Castle 1 ================================================================
-payg_cas01.gat,139,139,0 script Agit_Py01 -1,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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","Py01";
- 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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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.2
+//===== 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]
+//============================================================
+
+
+// Castle 1 ================================================================
+payg_cas01.gat,139,139,0 script Agit_Py01 -1,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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","Py01";
+ 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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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 5619bf779..619cddaf7 100644
--- a/npc/guild/payg/payg_flags.txt
+++ b/npc/guild/payg/payg_flags.txt
@@ -1,148 +1,148 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Payon Guild Flags
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.1+; RO Episode 4+
-//===== Description: =========================================
-//= Castle Guild Flags in Payon and pay_gld
-//===== Additional Comments: =================================
-//= Optimized with functions.[kobra_k88]
-//============================================================
-
-
-//============================================================================//
-// Castle 1
-//============================================================================//
-payon.gat,165,177,3 script Mingting#f1-1::Mingting 722,
-{
- callfunc "F_Flags","Payon","payg_cas01",87,29;
- close;
-
-OnRecvCastlePy01:
- FlagEmblem GetCastleData("payg_cas01.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,125,236,4 duplicate(Mingting) Mingting#f1-2 722
-pay_gld.gat,110,233,4 duplicate(Mingting) Mingting#f1-3 722
-pay_gld.gat,116,233,4 duplicate(Mingting) Mingting#f1-4 722
-pay_gld.gat,91,239,2 duplicate(Mingting) Mingting#f1-5 722
-// In Castle ===============================================
-payg_cas01.gat,238,67,4 duplicate(Mingting) Mingting#f1-6 722
-payg_cas01.gat,233,67,4 duplicate(Mingting) Mingting#f1-7 722
-payg_cas01.gat,221,123,4 duplicate(Mingting) Mingting#f1-8 722
-payg_cas01.gat,221,116,4 duplicate(Mingting) Mingting#f1-9 722
-payg_cas01.gat,206,108,4 duplicate(Mingting) Mingting#f1-10 722
-payg_cas01.gat,212,108,4 duplicate(Mingting) Mingting#f1-11 722
-
-
-
-//===========================================================================//
-// Castle 2
-//============================================================================//
-payon.gat,165,173,3 script Tiantan#f2-1::Tiantan 722,
-{
- callfunc "F_Flags","Payon","payg_cas02",25,266;
- close;
-
-OnRecvCastlePy02:
- FlagEmblem GetCastleData("payg_cas02.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,292,112,6 duplicate(Tiantan) Tiantan#f2-2 722
-pay_gld.gat,292,120,6 duplicate(Tiantan) Tiantan#f2-3 722
-pay_gld.gat,291,135,6 duplicate(Tiantan) Tiantan#f2-4 722
-pay_gld.gat,271,163,0 duplicate(Tiantan) Tiantan#f2-5 722
-// In Castle ===============================================
-payg_cas02.gat,254,40,6 duplicate(Tiantan) Tiantan#f2-6 722
-payg_cas02.gat,254,48,6 duplicate(Tiantan) Tiantan#f2-7 722
-payg_cas02.gat,202,49,0 duplicate(Tiantan) Tiantan#f2-8 722
-payg_cas02.gat,209,49,0 duplicate(Tiantan) Tiantan#f2-9 722
-payg_cas02.gat,59,282,4 duplicate(Tiantan) Tiantan#f2-10 722
-payg_cas02.gat,70,282,4 duplicate(Tiantan) Tiantan#f2-11 722
-
-
-
-//============================================================================//
-// Castle 3
-//============================================================================//
-payon.gat,165,169,3 script Fuying#f3-1::Fuying 722,
-{
- callfunc "F_Flags","Payon","payg_cas03",9,263;
- close;
-
-OnRecvCastlePy03:
- FlagEmblem GetCastleData("payg_cas03.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,321,298,2 duplicate(Fuying) Fuying#f3-2 722
-pay_gld.gat,321,289,2 duplicate(Fuying) Fuying#f3-3 722
-pay_gld.gat,327,304,1 duplicate(Fuying) Fuying#f3-4 722
-pay_gld.gat,333,254,4 duplicate(Fuying) Fuying#f3-5 722
-// In Castle ===============================================
-payg_cas03.gat,236,54,2 duplicate(Fuying) Fuying#f3-6 722
-payg_cas03.gat,236,45,2 duplicate(Fuying) Fuying#f3-7 722
-payg_cas03.gat,259,66,4 duplicate(Fuying) Fuying#f3-8 722
-payg_cas03.gat,266,66,4 duplicate(Fuying) Fuying#f3-9 722
-payg_cas03.gat,34,31,4 duplicate(Fuying) Fuying#f3-10 722
-payg_cas03.gat,43,31,4 duplicate(Fuying) Fuying#f3-11 722
-
-
-
-//============================================================================//
-// Castle 4
-//============================================================================//
-payon.gat,165,165,3 script Honglou#f4-1::Honglou 722,
-{
- callfunc "F_Flags","Payon","payg_cas04",40,235;
- close;
-
-OnRecvCastlePy04:
- FlagEmblem GetCastleData("payg_cas04.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,143,160,0 duplicate(Honglou) Honglou#f4-2 722
-pay_gld.gat,143,160,0 duplicate(Honglou) Honglou#f4-3 722
-pay_gld.gat,133,151,2 duplicate(Honglou) Honglou#f4-4 722
-pay_gld.gat,153,166,1 duplicate(Honglou) Honglou#f4-5 722
-// In Castle ===============================================
-payg_cas04.gat,255,259,0 duplicate(Honglou) Honglou#f4-6 722
-payg_cas04.gat,248,259,0 duplicate(Honglou) Honglou#f4-7 722
-payg_cas04.gat,248,168,6 duplicate(Honglou) Honglou#f4-8 722
-payg_cas04.gat,248,160,6 duplicate(Honglou) Honglou#f4-9 722
-payg_cas04.gat,232,181,4 duplicate(Honglou) Honglou#f4-10 722
-payg_cas04.gat,239,181,4 duplicate(Honglou) Honglou#f4-11 722
-
-
-
-//============================================================================//
-// Castle 5
-//============================================================================//
-payon.gat,165,161,3 script Zhulinxian#f5-1::Zhulinxian 722,
-{
- callfunc "F_Flags","Payon","payg_cas05",276,227;
- close;
-
-OnRecvCastlePy05:
- FlagEmblem GetCastleData("payg_cas05.gat",1);
- end;
-}
-// In Guild ===============================================
-pay_gld.gat,208,268,4 duplicate(Zhulinxian) Zhulinxian#f5-2 722
-pay_gld.gat,199,268,4 duplicate(Zhulinxian) Zhulinxian#f5-3 722
-pay_gld.gat,190,277,3 duplicate(Zhulinxian) Zhulinxian#f5-4 722
-pay_gld.gat,187,294,2 duplicate(Zhulinxian) Zhulinxian#f5-5 722
-// In Castle ===============================================
-payg_cas05.gat,32,249,4 duplicate(Zhulinxian) Zhulinxian#f5-6 722
-payg_cas05.gat,24,249,4 duplicate(Zhulinxian) Zhulinxian#f5-7 722
-payg_cas05.gat,62,271,0 duplicate(Zhulinxian) Zhulinxian#f5-8 722
-payg_cas05.gat,57,271,0 duplicate(Zhulinxian) Zhulinxian#f5-9 722
-payg_cas05.gat,55,252,2 duplicate(Zhulinxian) Zhulinxian#f5-10 722
-payg_cas05.gat,55,260,2 duplicate(Zhulinxian) Zhulinxian#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.1
+//===== Compatible With: =====================================
+//= eAthena 0.1+; RO Episode 4+
+//===== Description: =========================================
+//= Castle Guild Flags in Payon and pay_gld
+//===== Additional Comments: =================================
+//= Optimized with functions.[kobra_k88]
+//============================================================
+
+
+//============================================================================//
+// Castle 1
+//============================================================================//
+payon.gat,165,177,3 script Mingting#f1-1::Mingting 722,
+{
+ callfunc "F_Flags","Payon","payg_cas01",87,29;
+ close;
+
+OnRecvCastlePy01:
+ FlagEmblem GetCastleData("payg_cas01.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,125,236,4 duplicate(Mingting) Mingting#f1-2 722
+pay_gld.gat,110,233,4 duplicate(Mingting) Mingting#f1-3 722
+pay_gld.gat,116,233,4 duplicate(Mingting) Mingting#f1-4 722
+pay_gld.gat,91,239,2 duplicate(Mingting) Mingting#f1-5 722
+// In Castle ===============================================
+payg_cas01.gat,238,67,4 duplicate(Mingting) Mingting#f1-6 722
+payg_cas01.gat,233,67,4 duplicate(Mingting) Mingting#f1-7 722
+payg_cas01.gat,221,123,4 duplicate(Mingting) Mingting#f1-8 722
+payg_cas01.gat,221,116,4 duplicate(Mingting) Mingting#f1-9 722
+payg_cas01.gat,206,108,4 duplicate(Mingting) Mingting#f1-10 722
+payg_cas01.gat,212,108,4 duplicate(Mingting) Mingting#f1-11 722
+
+
+
+//===========================================================================//
+// Castle 2
+//============================================================================//
+payon.gat,165,173,3 script Tiantan#f2-1::Tiantan 722,
+{
+ callfunc "F_Flags","Payon","payg_cas02",25,266;
+ close;
+
+OnRecvCastlePy02:
+ FlagEmblem GetCastleData("payg_cas02.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,292,112,6 duplicate(Tiantan) Tiantan#f2-2 722
+pay_gld.gat,292,120,6 duplicate(Tiantan) Tiantan#f2-3 722
+pay_gld.gat,291,135,6 duplicate(Tiantan) Tiantan#f2-4 722
+pay_gld.gat,271,163,0 duplicate(Tiantan) Tiantan#f2-5 722
+// In Castle ===============================================
+payg_cas02.gat,254,40,6 duplicate(Tiantan) Tiantan#f2-6 722
+payg_cas02.gat,254,48,6 duplicate(Tiantan) Tiantan#f2-7 722
+payg_cas02.gat,202,49,0 duplicate(Tiantan) Tiantan#f2-8 722
+payg_cas02.gat,209,49,0 duplicate(Tiantan) Tiantan#f2-9 722
+payg_cas02.gat,59,282,4 duplicate(Tiantan) Tiantan#f2-10 722
+payg_cas02.gat,70,282,4 duplicate(Tiantan) Tiantan#f2-11 722
+
+
+
+//============================================================================//
+// Castle 3
+//============================================================================//
+payon.gat,165,169,3 script Fuying#f3-1::Fuying 722,
+{
+ callfunc "F_Flags","Payon","payg_cas03",9,263;
+ close;
+
+OnRecvCastlePy03:
+ FlagEmblem GetCastleData("payg_cas03.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,321,298,2 duplicate(Fuying) Fuying#f3-2 722
+pay_gld.gat,321,289,2 duplicate(Fuying) Fuying#f3-3 722
+pay_gld.gat,327,304,1 duplicate(Fuying) Fuying#f3-4 722
+pay_gld.gat,333,254,4 duplicate(Fuying) Fuying#f3-5 722
+// In Castle ===============================================
+payg_cas03.gat,236,54,2 duplicate(Fuying) Fuying#f3-6 722
+payg_cas03.gat,236,45,2 duplicate(Fuying) Fuying#f3-7 722
+payg_cas03.gat,259,66,4 duplicate(Fuying) Fuying#f3-8 722
+payg_cas03.gat,266,66,4 duplicate(Fuying) Fuying#f3-9 722
+payg_cas03.gat,34,31,4 duplicate(Fuying) Fuying#f3-10 722
+payg_cas03.gat,43,31,4 duplicate(Fuying) Fuying#f3-11 722
+
+
+
+//============================================================================//
+// Castle 4
+//============================================================================//
+payon.gat,165,165,3 script Honglou#f4-1::Honglou 722,
+{
+ callfunc "F_Flags","Payon","payg_cas04",40,235;
+ close;
+
+OnRecvCastlePy04:
+ FlagEmblem GetCastleData("payg_cas04.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,143,160,0 duplicate(Honglou) Honglou#f4-2 722
+pay_gld.gat,143,160,0 duplicate(Honglou) Honglou#f4-3 722
+pay_gld.gat,133,151,2 duplicate(Honglou) Honglou#f4-4 722
+pay_gld.gat,153,166,1 duplicate(Honglou) Honglou#f4-5 722
+// In Castle ===============================================
+payg_cas04.gat,255,259,0 duplicate(Honglou) Honglou#f4-6 722
+payg_cas04.gat,248,259,0 duplicate(Honglou) Honglou#f4-7 722
+payg_cas04.gat,248,168,6 duplicate(Honglou) Honglou#f4-8 722
+payg_cas04.gat,248,160,6 duplicate(Honglou) Honglou#f4-9 722
+payg_cas04.gat,232,181,4 duplicate(Honglou) Honglou#f4-10 722
+payg_cas04.gat,239,181,4 duplicate(Honglou) Honglou#f4-11 722
+
+
+
+//============================================================================//
+// Castle 5
+//============================================================================//
+payon.gat,165,161,3 script Zhulinxian#f5-1::Zhulinxian 722,
+{
+ callfunc "F_Flags","Payon","payg_cas05",276,227;
+ close;
+
+OnRecvCastlePy05:
+ FlagEmblem GetCastleData("payg_cas05.gat",1);
+ end;
+}
+// In Guild ===============================================
+pay_gld.gat,208,268,4 duplicate(Zhulinxian) Zhulinxian#f5-2 722
+pay_gld.gat,199,268,4 duplicate(Zhulinxian) Zhulinxian#f5-3 722
+pay_gld.gat,190,277,3 duplicate(Zhulinxian) Zhulinxian#f5-4 722
+pay_gld.gat,187,294,2 duplicate(Zhulinxian) Zhulinxian#f5-5 722
+// In Castle ===============================================
+payg_cas05.gat,32,249,4 duplicate(Zhulinxian) Zhulinxian#f5-6 722
+payg_cas05.gat,24,249,4 duplicate(Zhulinxian) Zhulinxian#f5-7 722
+payg_cas05.gat,62,271,0 duplicate(Zhulinxian) Zhulinxian#f5-8 722
+payg_cas05.gat,57,271,0 duplicate(Zhulinxian) Zhulinxian#f5-9 722
+payg_cas05.gat,55,252,2 duplicate(Zhulinxian) Zhulinxian#f5-10 722
+payg_cas05.gat,55,260,2 duplicate(Zhulinxian) Zhulinxian#f5-11 722
diff --git a/npc/guild/payg/payg_guardians.txt b/npc/guild/payg/payg_guardians.txt
index e89ac7910..02243dfad 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",46,273,"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",46,273,"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 f1811a9d2..cc888975f 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",46,273,"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",46,273,"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 063540f77..b1e253df6 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.2
-//===== 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:
- if($boxNumPy01 == 0) end;
- set $@bxPy01, $boxNumPy01;
- callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,0;
- 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:
- if($boxNumPy02 == 0) end;
- set $@bxPy02, $boxNumPy02;
- callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,0;
- 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:
- if($boxNumPy03 == 0) end;
- set $@bxPy03, $boxNumPy03;
- callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,0;
- 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:
- if($boxNumPy04 == 0) end;
- set $@bxPy04, $boxNumPy04;
- callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,0;
- 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:
- if($boxNumPy05 == 0) end;
- set $@bxPy05, $boxNumPy05;
- callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,0;
- 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.2
+//===== 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:
+ if($boxNumPy01 == 0) end;
+ set $@bxPy01, $boxNumPy01;
+ callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","payg_cas01","Py01",$boxNumPy01,$@bxPy01,$@boxIdPy01,1344,286,4,295,13,0;
+ 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:
+ if($boxNumPy02 == 0) end;
+ set $@bxPy02, $boxNumPy02;
+ callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","payg_cas02","Py02",$boxNumPy02,$@bxPy02,$@boxIdPy02,1346,140,140,148,149,0;
+ 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:
+ if($boxNumPy03 == 0) end;
+ set $@bxPy03, $boxNumPy03;
+ callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","payg_cas03","Py03",$boxNumPy03,$@bxPy03,$@boxIdPy03,1348,154,164,162,173,0;
+ 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:
+ if($boxNumPy04 == 0) end;
+ set $@bxPy04, $boxNumPy04;
+ callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","payg_cas04","Py04",$boxNumPy04,$@bxPy04,$@boxIdPy04,1350,142,44,151,51,0;
+ 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:
+ if($boxNumPy05 == 0) end;
+ set $@bxPy05, $boxNumPy05;
+ callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","payg_cas05","Py05",$boxNumPy05,$@bxPy05,$@boxIdPy05,1352,152,128,160,135,0;
+ 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 73ac15119..6c83ad390 100644
--- a/npc/guild/prtg/prtg_ev_agit.txt
+++ b/npc/guild/prtg/prtg_ev_agit.txt
@@ -1,130 +1,130 @@
-//===== eAthena Script =======================================
-//= War of Emperium - Prontera Guild Wars Events
-//===== By: ==================================================
-//= jAthena (1.0)
-//= 1.1 by Akaru and ho|yAnge|
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-// Castle 1 ================================================================
-prtg_cas01.gat,197,197,0 script Agit_Pt01 -1,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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,{
-OnInterIfInit:
- 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;
-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.2
+//===== 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]
+//============================================================
+
+
+// Castle 1 ================================================================
+prtg_cas01.gat,197,197,0 script Agit_Pt01 -1,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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,{
+OnInterIfInit:
+ 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;
+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 653e69333..c43d2b2ec 100644
--- a/npc/guild/prtg/prtg_flags.txt
+++ b/npc/guild/prtg/prtg_flags.txt
@@ -1,175 +1,175 @@
-//===== 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.2
-//===== 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]
-//============================================================
-
-
-//================================================================================//
-// Castle 1
-//================================================================================//
-prontera.gat,155,190,4 script Creamhilt#p1-1::Creamhilt 722,
-{
- callfunc "F_Flags","Prontera","prtg_cas01",97,174;
- close;
-
-OnRecvCastlePt01:
- FlagEmblem GetCastleData("prtg_cas01.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,131,60,6 duplicate(Creamhilt) Creamhilt#p1-2 722
-prt_gld.gat,138,68,6 duplicate(Creamhilt) Creamhilt#p1-3 722
-prt_gld.gat,138,60,6 duplicate(Creamhilt) Creamhilt#p1-4 722
-prt_gld.gat,135,60,6 duplicate(Creamhilt) Creamhilt#p1-5 722
-prt_gld.gat,160,210,4 duplicate(Creamhilt) Creamhilt#p1-6 722
-// In Castle =============================================
-prtg_cas01.gat,58,56,4 duplicate(Creamhilt) Creamhilt#p1-7 722
-prtg_cas01.gat,64,56,4 duplicate(Creamhilt) Creamhilt#p1-8 722
-prtg_cas01.gat,76,32,4 duplicate(Creamhilt) Creamhilt#p1-9 722
-prtg_cas01.gat,84,32,4 duplicate(Creamhilt) Creamhilt#p1-10 722
-prtg_cas01.gat,94,39,4 duplicate(Creamhilt) Creamhilt#p1-11 722
-prtg_cas01.gat,94,24,4 duplicate(Creamhilt) Creamhilt#p1-12 722
-prtg_cas01.gat,73,14,4 duplicate(Creamhilt) Creamhilt#p1-13 722
-prtg_cas01.gat,73,6,4 duplicate(Creamhilt) Creamhilt#p1-14 722
-prtg_cas01.gat,55,46,4 duplicate(Creamhilt) Creamhilt#p1-15 722
-prtg_cas01.gat,45,46,4 duplicate(Creamhilt) Creamhilt#p1-16 722
-
-
-
-//================================================================================//
-// Castle 2
-//================================================================================//
-prontera.gat,146,194,3 script Sbanhealt#p2-1::Sbanhealt 722,
-{
- callfunc "F_Flags","Prontera","prtg_cas02",71,36;
- close;
-
-OnRecvCastlePt02:
- FlagEmblem GetCastleData("prtg_cas02.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,153,213,3 duplicate(Sbanhealt) Sbanhealt#p2-2 722
-prt_gld.gat,244,126,8 duplicate(Sbanhealt) Sbanhealt#p2-3 722
-prt_gld.gat,244,128,8 duplicate(Sbanhealt) Sbanhealt#p2-4 722
-prt_gld.gat,236,126,8 duplicate(Sbanhealt) Sbanhealt#p2-5 722
-prt_gld.gat,236,128,8 duplicate(Sbanhealt) Sbanhealt#p2-6 722
-// In Castle =============================================
-prtg_cas02.gat,40,227,4 duplicate(Sbanhealt) Sbanhealt#p2-7 722
-prtg_cas02.gat,46,227,4 duplicate(Sbanhealt) Sbanhealt#p2-8 722
-prtg_cas02.gat,11,219,4 duplicate(Sbanhealt) Sbanhealt#p2-9 722
-prtg_cas02.gat,11,214,4 duplicate(Sbanhealt) Sbanhealt#p2-10 722
-prtg_cas02.gat,20,219,4 duplicate(Sbanhealt) Sbanhealt#p2-11 722
-prtg_cas02.gat,20,214,4 duplicate(Sbanhealt) Sbanhealt#p2-12 722
-prtg_cas02.gat,79,227,8 duplicate(Sbanhealt) Sbanhealt#p2-13 722
-prtg_cas02.gat,70,227,8 duplicate(Sbanhealt) Sbanhealt#p2-14 722
-prtg_cas02.gat,38,189,8 duplicate(Sbanhealt) Sbanhealt#p2-15 722
-prtg_cas02.gat,34,189,8 duplicate(Sbanhealt) Sbanhealt#p2-16 722
-prtg_cas02.gat,153,161,4 duplicate(Sbanhealt) Sbanhealt#p2-17 722
-prtg_cas02.gat,162,161,4 duplicate(Sbanhealt) Sbanhealt#p2-18 722
-
-
-
-
-//================================================================================//
-// Castle 3
-//================================================================================//
-prontera.gat,143,203,2 script Lazrigees#p3-1::Lazrigees 722,
-{
- callfunc "F_Flags","Prontera","prtg_cas03",45,99;
- close;
-
-OnRecvCastlePt03:
- FlagEmblem GetCastleData("prtg_cas03.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,150,220,2 duplicate(Lazrigees) Lazrigees#p3-2 722
-prt_gld.gat,147,140,4 duplicate(Lazrigees) Lazrigees#p3-3 722
-prt_gld.gat,147,136,4 duplicate(Lazrigees) Lazrigees#p3-4 722
-prt_gld.gat,158,140,4 duplicate(Lazrigees) Lazrigees#p3-5 722
-prt_gld.gat,158,136,4 duplicate(Lazrigees) Lazrigees#p3-6 722
-// In Castle =============================================
-prtg_cas03.gat,168,28,4 duplicate(Lazrigees) Lazrigees#p3-7 722
-prtg_cas03.gat,182,28,4 duplicate(Lazrigees) Lazrigees#p3-8 722
-prtg_cas03.gat,43,50,4 duplicate(Lazrigees) Lazrigees#p3-9 722
-prtg_cas03.gat,48,50,4 duplicate(Lazrigees) Lazrigees#p3-10 722
-prtg_cas03.gat,43,58,4 duplicate(Lazrigees) Lazrigees#p3-11 722
-prtg_cas03.gat,48,58,4 duplicate(Lazrigees) Lazrigees#p3-12 722
-prtg_cas03.gat,158,210,4 duplicate(Lazrigees) Lazrigees#p3-13 722
-prtg_cas03.gat,169,210,4 duplicate(Lazrigees) Lazrigees#p3-14 722
-prtg_cas03.gat,162,201,4 duplicate(Lazrigees) Lazrigees#p3-15 722
-prtg_cas03.gat,165,201,4 duplicate(Lazrigees) Lazrigees#p3-16 722
-
-
-
-//================================================================================//
-// Castle 4
-//================================================================================//
-prontera.gat,167,203,6 script Squagul#p4-1::Squagul 722,
-{
- callfunc "F_Flags","Prontera","prtg_cas04",259,265;
- close;
-
-OnRecvCastlePt04:
- FlagEmblem GetCastleData("prtg_cas04.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,169,220,6 duplicate(Squagul) Squagul#p4-2 722
-prt_gld.gat,120,243,6 duplicate(Squagul) Squagul#p4-3 722
-prt_gld.gat,120,236,6 duplicate(Squagul) Squagul#p4-4 722
-prt_gld.gat,122,243,6 duplicate(Squagul) Squagul#p4-5 722
-prt_gld.gat,122,246,6 duplicate(Squagul) Squagul#p4-6 722
-// In Castle =============================================
-prtg_cas04.gat,82,29,4 duplicate(Squagul) Squagul#p4-7 722
-prtg_cas04.gat,75,29,4 duplicate(Squagul) Squagul#p4-8 722
-prtg_cas04.gat,75,27,4 duplicate(Squagul) Squagul#p4-9 722
-prtg_cas04.gat,82,27,4 duplicate(Squagul) Squagul#p4-10 722
-prtg_cas04.gat,59,29,4 duplicate(Squagul) Squagul#p4-11 722
-prtg_cas04.gat,67,29,4 duplicate(Squagul) Squagul#p4-12 722
-prtg_cas04.gat,258,25,4 duplicate(Squagul) Squagul#p4-13 722
-prtg_cas04.gat,258,20,4 duplicate(Squagul) Squagul#p4-14 722
-prtg_cas04.gat,263,20,4 duplicate(Squagul) Squagul#p4-15 722
-prtg_cas04.gat,263,27,4 duplicate(Squagul) Squagul#p4-16 722
-
-
-
-
-//================================================================================//
-// Castle 5
-//================================================================================//
-prontera.gat,165,194,5 script Guindull#p5-1::Guindull 722,
-{
- callfunc "F_Flags","Prontera","prtg_cas05",34,30;
- close;
-
-OnRecvCastlePt05:
- FlagEmblem GetCastleData("prtg_cas05.gat",1);
- end;
-}
-// In Guild ===========================================
-prt_gld.gat,167,213,5 duplicate(Guindull) Guindull#p5-2 722
-prt_gld.gat,199,243,2 duplicate(Guindull) Guindull#p5-3 722
-prt_gld.gat,199,236,2 duplicate(Guindull) Guindull#p5-4 722
-prt_gld.gat,197,243,2 duplicate(Guindull) Guindull#p5-5 722
-prt_gld.gat,197,236,2 duplicate(Guindull) Guindull#p5-6 722
-// In Castle =============================================
-prtg_cas05.gat,19,247,4 duplicate(Guindull) Guindull#p5-7 722
-prtg_cas05.gat,19,243,4 duplicate(Guindull) Guindull#p5-8 722
-prtg_cas05.gat,26,247,4 duplicate(Guindull) Guindull#p5-9 722
-prtg_cas05.gat,26,243,4 duplicate(Guindull) Guindull#p5-10 722
-prtg_cas05.gat,249,289,4 duplicate(Guindull) Guindull#p5-11 722
-prtg_cas05.gat,256,289,4 duplicate(Guindull) Guindull#p5-12 722
-prtg_cas05.gat,253,271,4 duplicate(Guindull) Guindull#p5-13 722
-prtg_cas05.gat,273,257,4 duplicate(Guindull) Guindull#p5-14 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.2
+//===== 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]
+//============================================================
+
+
+//================================================================================//
+// Castle 1
+//================================================================================//
+prontera.gat,155,190,4 script Creamhilt#p1-1::Creamhilt 722,
+{
+ callfunc "F_Flags","Prontera","prtg_cas01",97,174;
+ close;
+
+OnRecvCastlePt01:
+ FlagEmblem GetCastleData("prtg_cas01.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,131,60,6 duplicate(Creamhilt) Creamhilt#p1-2 722
+prt_gld.gat,138,68,6 duplicate(Creamhilt) Creamhilt#p1-3 722
+prt_gld.gat,138,60,6 duplicate(Creamhilt) Creamhilt#p1-4 722
+prt_gld.gat,135,60,6 duplicate(Creamhilt) Creamhilt#p1-5 722
+prt_gld.gat,160,210,4 duplicate(Creamhilt) Creamhilt#p1-6 722
+// In Castle =============================================
+prtg_cas01.gat,58,56,4 duplicate(Creamhilt) Creamhilt#p1-7 722
+prtg_cas01.gat,64,56,4 duplicate(Creamhilt) Creamhilt#p1-8 722
+prtg_cas01.gat,76,32,4 duplicate(Creamhilt) Creamhilt#p1-9 722
+prtg_cas01.gat,84,32,4 duplicate(Creamhilt) Creamhilt#p1-10 722
+prtg_cas01.gat,94,39,4 duplicate(Creamhilt) Creamhilt#p1-11 722
+prtg_cas01.gat,94,24,4 duplicate(Creamhilt) Creamhilt#p1-12 722
+prtg_cas01.gat,73,14,4 duplicate(Creamhilt) Creamhilt#p1-13 722
+prtg_cas01.gat,73,6,4 duplicate(Creamhilt) Creamhilt#p1-14 722
+prtg_cas01.gat,55,46,4 duplicate(Creamhilt) Creamhilt#p1-15 722
+prtg_cas01.gat,45,46,4 duplicate(Creamhilt) Creamhilt#p1-16 722
+
+
+
+//================================================================================//
+// Castle 2
+//================================================================================//
+prontera.gat,146,194,3 script Sbanhealt#p2-1::Sbanhealt 722,
+{
+ callfunc "F_Flags","Prontera","prtg_cas02",71,36;
+ close;
+
+OnRecvCastlePt02:
+ FlagEmblem GetCastleData("prtg_cas02.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,153,213,3 duplicate(Sbanhealt) Sbanhealt#p2-2 722
+prt_gld.gat,244,126,8 duplicate(Sbanhealt) Sbanhealt#p2-3 722
+prt_gld.gat,244,128,8 duplicate(Sbanhealt) Sbanhealt#p2-4 722
+prt_gld.gat,236,126,8 duplicate(Sbanhealt) Sbanhealt#p2-5 722
+prt_gld.gat,236,128,8 duplicate(Sbanhealt) Sbanhealt#p2-6 722
+// In Castle =============================================
+prtg_cas02.gat,40,227,4 duplicate(Sbanhealt) Sbanhealt#p2-7 722
+prtg_cas02.gat,46,227,4 duplicate(Sbanhealt) Sbanhealt#p2-8 722
+prtg_cas02.gat,11,219,4 duplicate(Sbanhealt) Sbanhealt#p2-9 722
+prtg_cas02.gat,11,214,4 duplicate(Sbanhealt) Sbanhealt#p2-10 722
+prtg_cas02.gat,20,219,4 duplicate(Sbanhealt) Sbanhealt#p2-11 722
+prtg_cas02.gat,20,214,4 duplicate(Sbanhealt) Sbanhealt#p2-12 722
+prtg_cas02.gat,79,227,8 duplicate(Sbanhealt) Sbanhealt#p2-13 722
+prtg_cas02.gat,70,227,8 duplicate(Sbanhealt) Sbanhealt#p2-14 722
+prtg_cas02.gat,38,189,8 duplicate(Sbanhealt) Sbanhealt#p2-15 722
+prtg_cas02.gat,34,189,8 duplicate(Sbanhealt) Sbanhealt#p2-16 722
+prtg_cas02.gat,153,161,4 duplicate(Sbanhealt) Sbanhealt#p2-17 722
+prtg_cas02.gat,162,161,4 duplicate(Sbanhealt) Sbanhealt#p2-18 722
+
+
+
+
+//================================================================================//
+// Castle 3
+//================================================================================//
+prontera.gat,143,203,2 script Lazrigees#p3-1::Lazrigees 722,
+{
+ callfunc "F_Flags","Prontera","prtg_cas03",45,99;
+ close;
+
+OnRecvCastlePt03:
+ FlagEmblem GetCastleData("prtg_cas03.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,150,220,2 duplicate(Lazrigees) Lazrigees#p3-2 722
+prt_gld.gat,147,140,4 duplicate(Lazrigees) Lazrigees#p3-3 722
+prt_gld.gat,147,136,4 duplicate(Lazrigees) Lazrigees#p3-4 722
+prt_gld.gat,158,140,4 duplicate(Lazrigees) Lazrigees#p3-5 722
+prt_gld.gat,158,136,4 duplicate(Lazrigees) Lazrigees#p3-6 722
+// In Castle =============================================
+prtg_cas03.gat,168,28,4 duplicate(Lazrigees) Lazrigees#p3-7 722
+prtg_cas03.gat,182,28,4 duplicate(Lazrigees) Lazrigees#p3-8 722
+prtg_cas03.gat,43,50,4 duplicate(Lazrigees) Lazrigees#p3-9 722
+prtg_cas03.gat,48,50,4 duplicate(Lazrigees) Lazrigees#p3-10 722
+prtg_cas03.gat,43,58,4 duplicate(Lazrigees) Lazrigees#p3-11 722
+prtg_cas03.gat,48,58,4 duplicate(Lazrigees) Lazrigees#p3-12 722
+prtg_cas03.gat,158,210,4 duplicate(Lazrigees) Lazrigees#p3-13 722
+prtg_cas03.gat,169,210,4 duplicate(Lazrigees) Lazrigees#p3-14 722
+prtg_cas03.gat,162,201,4 duplicate(Lazrigees) Lazrigees#p3-15 722
+prtg_cas03.gat,165,201,4 duplicate(Lazrigees) Lazrigees#p3-16 722
+
+
+
+//================================================================================//
+// Castle 4
+//================================================================================//
+prontera.gat,167,203,6 script Squagul#p4-1::Squagul 722,
+{
+ callfunc "F_Flags","Prontera","prtg_cas04",259,265;
+ close;
+
+OnRecvCastlePt04:
+ FlagEmblem GetCastleData("prtg_cas04.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,169,220,6 duplicate(Squagul) Squagul#p4-2 722
+prt_gld.gat,120,243,6 duplicate(Squagul) Squagul#p4-3 722
+prt_gld.gat,120,236,6 duplicate(Squagul) Squagul#p4-4 722
+prt_gld.gat,122,243,6 duplicate(Squagul) Squagul#p4-5 722
+prt_gld.gat,122,246,6 duplicate(Squagul) Squagul#p4-6 722
+// In Castle =============================================
+prtg_cas04.gat,82,29,4 duplicate(Squagul) Squagul#p4-7 722
+prtg_cas04.gat,75,29,4 duplicate(Squagul) Squagul#p4-8 722
+prtg_cas04.gat,75,27,4 duplicate(Squagul) Squagul#p4-9 722
+prtg_cas04.gat,82,27,4 duplicate(Squagul) Squagul#p4-10 722
+prtg_cas04.gat,59,29,4 duplicate(Squagul) Squagul#p4-11 722
+prtg_cas04.gat,67,29,4 duplicate(Squagul) Squagul#p4-12 722
+prtg_cas04.gat,258,25,4 duplicate(Squagul) Squagul#p4-13 722
+prtg_cas04.gat,258,20,4 duplicate(Squagul) Squagul#p4-14 722
+prtg_cas04.gat,263,20,4 duplicate(Squagul) Squagul#p4-15 722
+prtg_cas04.gat,263,27,4 duplicate(Squagul) Squagul#p4-16 722
+
+
+
+
+//================================================================================//
+// Castle 5
+//================================================================================//
+prontera.gat,165,194,5 script Guindull#p5-1::Guindull 722,
+{
+ callfunc "F_Flags","Prontera","prtg_cas05",34,30;
+ close;
+
+OnRecvCastlePt05:
+ FlagEmblem GetCastleData("prtg_cas05.gat",1);
+ end;
+}
+// In Guild ===========================================
+prt_gld.gat,167,213,5 duplicate(Guindull) Guindull#p5-2 722
+prt_gld.gat,199,243,2 duplicate(Guindull) Guindull#p5-3 722
+prt_gld.gat,199,236,2 duplicate(Guindull) Guindull#p5-4 722
+prt_gld.gat,197,243,2 duplicate(Guindull) Guindull#p5-5 722
+prt_gld.gat,197,236,2 duplicate(Guindull) Guindull#p5-6 722
+// In Castle =============================================
+prtg_cas05.gat,19,247,4 duplicate(Guindull) Guindull#p5-7 722
+prtg_cas05.gat,19,243,4 duplicate(Guindull) Guindull#p5-8 722
+prtg_cas05.gat,26,247,4 duplicate(Guindull) Guindull#p5-9 722
+prtg_cas05.gat,26,243,4 duplicate(Guindull) Guindull#p5-10 722
+prtg_cas05.gat,249,289,4 duplicate(Guindull) Guindull#p5-11 722
+prtg_cas05.gat,256,289,4 duplicate(Guindull) Guindull#p5-12 722
+prtg_cas05.gat,253,271,4 duplicate(Guindull) Guindull#p5-13 722
+prtg_cas05.gat,273,257,4 duplicate(Guindull) Guindull#p5-14 722
diff --git a/npc/guild/prtg/prtg_guardians.txt b/npc/guild/prtg/prtg_guardians.txt
index 0ed441b9d..55d83309b 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;
-
-GuardianDied:
- // 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;
+
+GuardianDied:
+ // 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 6549af533..b14db6b9e 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 f5b4c012d..3b7376279 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.2
-//===== 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:
- if($boxNumPt01 == 0) end;
- set $@bxPt01, $boxNumPt01;
- callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,0;
- 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:
- if($boxNumPt02 == 0) end;
- set $@bxPt02, $boxNumPt02;
- callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,0;
- 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:
- if($boxNumPt03 == 0) end;
- set $@bxPt03, $boxNumPt03;
- callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,0;
- 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:
- if($boxNumPt04 == 0) end;
- set $@bxPt04, $boxNumPt04;
- callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,0;
- 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:
- if($boxNumPt05 == 0) end;
- set $@bxPt05, $boxNumPt05;
- callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,1;
- end;
-OnClock1200:
- callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,0;
- 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.2
+//===== 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:
+ if($boxNumPt01 == 0) end;
+ set $@bxPt01, $boxNumPt01;
+ callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","prtg_cas01","Pt01",$boxNumPt01,$@bxPt01,$@boxIdPt01,1354,6,204,15,213,0;
+ 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:
+ if($boxNumPt02 == 0) end;
+ set $@bxPt02, $boxNumPt02;
+ callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","prtg_cas02","Pt02",$boxNumPt02,$@bxPt02,$@boxIdPt02,1356,198,224,207,233,0;
+ 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:
+ if($boxNumPt03 == 0) end;
+ set $@bxPt03, $boxNumPt03;
+ callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","prtg_cas03","Pt03",$boxNumPt03,$@bxPt03,$@boxIdPt03,1358,184,128,193,135,0;
+ 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:
+ if($boxNumPt04 == 0) end;
+ set $@bxPt04, $boxNumPt04;
+ callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","prtg_cas04","Pt04",$boxNumPt04,$@bxPt04,$@boxIdPt04,1360,266,158,275,167,0;
+ 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:
+ if($boxNumPt05 == 0) end;
+ set $@bxPt05, $boxNumPt05;
+ callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,1;
+ end;
+OnClock1200:
+ callfunc "F_GldTreas","prtg_cas05","Pt05",$boxNumPt05,$@bxPt05,$@boxIdPt05,1362,272,174,279,181,0;
+ 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 d8fa85d92..df02e4310 100644
--- a/npc/jobs/1-1/acolyte.txt
+++ b/npc/jobs/1-1/acolyte.txt
@@ -1,349 +1,349 @@
-//===== eAthena Script =======================================
-//= Acolyte Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +, dev mod 1009 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0 Fully working.
-//= v1.1 Added function calls for Priest Quest.
-//= v1.2 Fixed Marthilda, Yosuke bugs. [Lupus]
-//============================================================
-
-
-// -- Father Mareusis --
-prt_church.gat,184,41,4 script "Father Mareusis" 60,
-{
- mes "[Father Mareusis]";
- if(Class==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(Class == Job_Acolyte) goto JobAco;
- if(Class != Job_Novice) goto NotNov;
- if(JobLevel < 10) goto JobLess10;
- 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 1 map 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 19;
- close;
-
- JobAco:
- mes "Are you feeling okay?....";
- emotion 20;
- 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 18;
- close;
-
- NotNov:
- 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;
-
- JobLess10:
- 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;
-
- M_1:
- mes "[Father Mareusis]";
- if(Class == Job_Acolyte) goto M1b;
- if(Class != 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;
- set job_acolyte_q,0;
- set job_acolyte_q2,0;
- JobChange Job_Acolyte;
- 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(Class==Job_Acolyte || Class==Job_Priest) callfunc "F_FatherRub";
- if(Class==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 0;
- 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 18;
- 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 20;
- 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(Class == Job_Acolyte || Class==Job_Priest) callfunc "F_MotherMart";
- if(Class == 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 0;
- 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 20;
- 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(Class == Job_Acolyte || Class==Job_Priest) callfunc "F_FatherYos";
- if(Class == 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 27;
- set job_acolyte_q,6;
- close;
-
- Goback:
- mes "[Father Yosuke]";
- mes "Interesting.. I can't find your name on my list..";
- emotion 20;
- 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 1;
- next;
- mes "[Father Yosuke]";
- mes "Your Divine Quest is complete. Go back to the Sanctuary Now!";
- emotion 27;
- close;
-}
-
+//===== eAthena Script =======================================
+//= Acolyte Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +, dev mod 1009 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0 Fully working.
+//= v1.1 Added function calls for Priest Quest.
+//= v1.2 Fixed Marthilda, Yosuke bugs. [Lupus]
+//============================================================
+
+
+// -- Father Mareusis --
+prt_church.gat,184,41,4 script "Father Mareusis" 60,
+{
+ mes "[Father Mareusis]";
+ if(Class==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(Class == Job_Acolyte) goto JobAco;
+ if(Class != Job_Novice) goto NotNov;
+ if(JobLevel < 10) goto JobLess10;
+ 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 1 map 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 19;
+ close;
+
+ JobAco:
+ mes "Are you feeling okay?....";
+ emotion 20;
+ 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 18;
+ close;
+
+ NotNov:
+ 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;
+
+ JobLess10:
+ 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;
+
+ M_1:
+ mes "[Father Mareusis]";
+ if(Class == Job_Acolyte) goto M1b;
+ if(Class != 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;
+ set job_acolyte_q,0;
+ set job_acolyte_q2,0;
+ JobChange Job_Acolyte;
+ 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(Class==Job_Acolyte || Class==Job_Priest) callfunc "F_FatherRub";
+ if(Class==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 0;
+ 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 18;
+ 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 20;
+ 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(Class == Job_Acolyte || Class==Job_Priest) callfunc "F_MotherMart";
+ if(Class == 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 0;
+ 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 20;
+ 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(Class == Job_Acolyte || Class==Job_Priest) callfunc "F_FatherYos";
+ if(Class == 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 27;
+ set job_acolyte_q,6;
+ close;
+
+ Goback:
+ mes "[Father Yosuke]";
+ mes "Interesting.. I can't find your name on my list..";
+ emotion 20;
+ 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 1;
+ next;
+ mes "[Father Yosuke]";
+ mes "Your Divine Quest is complete. Go back to the Sanctuary Now!";
+ emotion 27;
+ close;
+}
+
diff --git a/npc/jobs/1-1/archer.txt b/npc/jobs/1-1/archer.txt
index 172114572..0d2d0c6e2 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.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-// -- Archer Guildsman --
-payon_in02.gat,64,71,4 script Archer Guildsman 59,
-{
- mes "[Archer Guildsman]";
- if(Class==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(Class == Job_Archer) goto sL_Archer;
- if(Class != Job_Novice) goto sL_Other;
-
- mes "You have made an execellent 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) goto sL_LowLvl;
- 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;
-
- sL_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 18;
- close;
-
- sL_Other:
- 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;
-
- sL_LowLvl:
- mes "It seems that you are not qualified to become an Archer yet. Please take a look at the job requirments once more.";
- close;
-
-
- M_1:
- mes "[Archer Guildsman]";
- if(Class == Job_Archer) goto sM_1a;
- if(Class != 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;
- JobChange Job_Archer;
- set job_archer_q, 0;
- 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.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+// -- Archer Guildsman --
+payon_in02.gat,64,71,4 script Archer Guildsman 59,
+{
+ mes "[Archer Guildsman]";
+ if(Class==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(Class == Job_Archer) goto sL_Archer;
+ if(Class != Job_Novice) goto sL_Other;
+
+ mes "You have made an execellent 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) goto sL_LowLvl;
+ 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;
+
+ sL_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 18;
+ close;
+
+ sL_Other:
+ 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;
+
+ sL_LowLvl:
+ mes "It seems that you are not qualified to become an Archer yet. Please take a look at the job requirments once more.";
+ close;
+
+
+ M_1:
+ mes "[Archer Guildsman]";
+ if(Class == Job_Archer) goto sM_1a;
+ if(Class != 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;
+ JobChange Job_Archer;
+ set job_archer_q, 0;
+ 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 600e254e9..05e74513a 100644
--- a/npc/jobs/1-1/mage.txt
+++ b/npc/jobs/1-1/mage.txt
@@ -1,497 +1,497 @@
-//===== eAthena Script =======================================
-//= Mage Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed input ingridients bug [Lupus]
-//============================================================
-
-
-// -- Expert Mage --
-geffen_in.gat,164,124,4 script Expert Mage 123,
-{
- if(Class==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(Class == 2) goto L_JobMage;
- if(Class != 0) goto L_JobOther;
-
- 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) goto L_JobLvl;
-
- 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;
-
- L_JobMage:
- 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 4;
- close;
- L_JobOther:
- 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 22;
- close;
-
- L_JobLvl:
- 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 22;
- 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 percipitate..... 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 officialy qualified to become a mage!";
- emotion 21;
- next;
- mes "[Expert Mage]";
- mes "Abra-kadabra and hocus pocus, turn this young novice into a ^00aa00MAGE^000000!!";
- next;
- JobChange 2;// Job: 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,
- set job_magician_q,0;
- 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 18;
- 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 exlpain the test for you once more okays.";
- emotion 4;
- 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 1;
- 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 inputed 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 21;
- 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 21;
- 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.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed input ingridients bug [Lupus]
+//============================================================
+
+
+// -- Expert Mage --
+geffen_in.gat,164,124,4 script Expert Mage 123,
+{
+ if(Class==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(Class == 2) goto L_JobMage;
+ if(Class != 0) goto L_JobOther;
+
+ 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) goto L_JobLvl;
+
+ 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;
+
+ L_JobMage:
+ 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 4;
+ close;
+ L_JobOther:
+ 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 22;
+ close;
+
+ L_JobLvl:
+ 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 22;
+ 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 percipitate..... 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 officialy qualified to become a mage!";
+ emotion 21;
+ next;
+ mes "[Expert Mage]";
+ mes "Abra-kadabra and hocus pocus, turn this young novice into a ^00aa00MAGE^000000!!";
+ next;
+ JobChange 2;// Job: 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,
+ set job_magician_q,0;
+ 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 18;
+ 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 exlpain the test for you once more okays.";
+ emotion 4;
+ 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 1;
+ 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 inputed 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 21;
+ 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 21;
+ 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 0e596c367..8204df6a9 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.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-// == Guild NPCs ==
-// -- Mahnsoo --
-alberta_in.gat,53,43,6 script Chief Mahnsoo 86,
-{
- mes "[Chief Mahnsoo]";
- if(Class==Job_Novice && job_merchant_q3 == 4) goto L_MakeMerc;
- if(Class==Job_Novice && job_merchant_q3 == 3) goto L_GiveRecpt;
- if(Class==Job_Novice && job_merchant_q3 == 5) goto L_Failed;
- if(Class==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(Class==5) goto L_JobMer;
- if(Class !=0) goto L_JobOther;
- if(JobLevel < 10) goto L_JobLvl;
-
- 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 4;
- 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 4;
- 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 "[Cheif Mahnsoo]";
- mes "Oh, but before we get started I must say one thing.....";
- next;
- mes "[Cheif 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 "[Cheif 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;
-
- L_JobMer:
- 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 1;
- emotion 0;
- close;
-
- L_JobOther:
- 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;
- L_JobLvl:
- 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;
-
- 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 1;
- 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;
- JobChange 5;// Job: Job_Merchant
- set job_merchant_q,0;
- set job_merchant_q2,0;
- set job_merchant_q3,0;
-
- mes "[Chief Mahnsoo]";
- mes "Congratulations! You are now one of us, A PROUD MERCHANT!!";
- emotion 21;
- 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 20;
- 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 4;
- close;
-
- sM_1b:
- mes "[Chief Mahnsoo]";
- mes "WHAT THE??? Hey come back here! YOU STILL HAVE TO PAY THE FEE!!!!!";
- emotion 19;
- 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 32;
- 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 0;
- 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(Class==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(Class!=0) 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 21;
- 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 23;
- 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 32;
- 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 6;
- 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 20;
- 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 32;
- 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 1;
- next;
- mes "[Wharehouse Manager Kay]";
- mes "Holy crap!! YOU LOST the product??!! What have you done, you moron!!!";
- emotion 23;
- 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 7;
- 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 15;
- 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 1;
- next;
- mes "[Kafra]";
- mes "I really appreciate what you've done for me. Here is a small gift to show you my thanks.";
- emotion 15;
- 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 1;
- 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 4;
- 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 4;
- cutin "kafra_03",255;
- close;
-}
-
-// -- Kafra(Prontera) --
-prontera.gat,248,42,8 script Kafra 115,
-{
- cutin "kafra_03",2;
- if(Class==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 900 zeny however.";
- next;
- menu "Warp.",M_Warp, "Cancel.",M_End;
-
- M_Warp:
- if(Zeny < 900) goto sL_NdZeny;
- set Zeny, Zeny - 900;
- set RESRVPTS, RESRVPTS + 54;
- 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 15;
- 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 15;
- cutin "kafra_03",255;
- close;
-
-L_NoProd:
- mes "Umm......... excuse me... but where is the Product your supposed to give me....?";
- emotion 20;
- 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 4;
- 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 4;
- cutin "kafra_03",255;
- close;
-}
-
-
-// == Other Npcs ==
-// -- Guild Staff --
-geffen_in.gat,155,122,4 script Guild Staff 47,
-{
-
- if(Class==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 15;
- close;
-L_NoProd:
- mes "Huh? Where? Where is the Box?";
- emotion 1;
- 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 19;
- 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 19;
- set job_merchant_q3,2;
- close;
-}
-
-
-// -- Dyer's Student --
-morocc_in.gat,140,102,4 script Dyer's Student 86,
-{
- if(Class==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 15;
- close;
-
-L_NoProd:
- mes "But where's the Product?";
- emotion 20;
- 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 20;
- 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 32;
- 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 20;
- close;
-
-
-}
+//===== eAthena Script =======================================
+//= Merchant Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+// == Guild NPCs ==
+// -- Mahnsoo --
+alberta_in.gat,53,43,6 script Chief Mahnsoo 86,
+{
+ mes "[Chief Mahnsoo]";
+ if(Class==Job_Novice && job_merchant_q3 == 4) goto L_MakeMerc;
+ if(Class==Job_Novice && job_merchant_q3 == 3) goto L_GiveRecpt;
+ if(Class==Job_Novice && job_merchant_q3 == 5) goto L_Failed;
+ if(Class==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(Class==5) goto L_JobMer;
+ if(Class !=0) goto L_JobOther;
+ if(JobLevel < 10) goto L_JobLvl;
+
+ 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 4;
+ 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 4;
+ 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 "[Cheif Mahnsoo]";
+ mes "Oh, but before we get started I must say one thing.....";
+ next;
+ mes "[Cheif 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 "[Cheif 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;
+
+ L_JobMer:
+ 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 1;
+ emotion 0;
+ close;
+
+ L_JobOther:
+ 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;
+ L_JobLvl:
+ 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;
+
+ 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 1;
+ 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;
+ JobChange 5;// Job: Job_Merchant
+ set job_merchant_q,0;
+ set job_merchant_q2,0;
+ set job_merchant_q3,0;
+
+ mes "[Chief Mahnsoo]";
+ mes "Congratulations! You are now one of us, A PROUD MERCHANT!!";
+ emotion 21;
+ 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 20;
+ 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 4;
+ close;
+
+ sM_1b:
+ mes "[Chief Mahnsoo]";
+ mes "WHAT THE??? Hey come back here! YOU STILL HAVE TO PAY THE FEE!!!!!";
+ emotion 19;
+ 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 32;
+ 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 0;
+ 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(Class==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(Class!=0) 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 21;
+ 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 23;
+ 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 32;
+ 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 6;
+ 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 20;
+ 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 32;
+ 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 1;
+ next;
+ mes "[Wharehouse Manager Kay]";
+ mes "Holy crap!! YOU LOST the product??!! What have you done, you moron!!!";
+ emotion 23;
+ 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 7;
+ 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 15;
+ 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 1;
+ next;
+ mes "[Kafra]";
+ mes "I really appreciate what you've done for me. Here is a small gift to show you my thanks.";
+ emotion 15;
+ 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 1;
+ 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 4;
+ 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 4;
+ cutin "kafra_03",255;
+ close;
+}
+
+// -- Kafra(Prontera) --
+prontera.gat,248,42,8 script Kafra 115,
+{
+ cutin "kafra_03",2;
+ if(Class==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 900 zeny however.";
+ next;
+ menu "Warp.",M_Warp, "Cancel.",M_End;
+
+ M_Warp:
+ if(Zeny < 900) goto sL_NdZeny;
+ set Zeny, Zeny - 900;
+ set RESRVPTS, RESRVPTS + 54;
+ 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 15;
+ 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 15;
+ cutin "kafra_03",255;
+ close;
+
+L_NoProd:
+ mes "Umm......... excuse me... but where is the Product your supposed to give me....?";
+ emotion 20;
+ 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 4;
+ 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 4;
+ cutin "kafra_03",255;
+ close;
+}
+
+
+// == Other Npcs ==
+// -- Guild Staff --
+geffen_in.gat,155,122,4 script Guild Staff 47,
+{
+
+ if(Class==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 15;
+ close;
+L_NoProd:
+ mes "Huh? Where? Where is the Box?";
+ emotion 1;
+ 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 19;
+ 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 19;
+ set job_merchant_q3,2;
+ close;
+}
+
+
+// -- Dyer's Student --
+morocc_in.gat,140,102,4 script Dyer's Student 86,
+{
+ if(Class==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 15;
+ close;
+
+L_NoProd:
+ mes "But where's the Product?";
+ emotion 20;
+ 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 20;
+ 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 32;
+ 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 20;
+ close;
+
+
+}
diff --git a/npc/jobs/1-1/swordsman.txt b/npc/jobs/1-1/swordsman.txt
index 35b68285c..68447a583 100644
--- a/npc/jobs/1-1/swordsman.txt
+++ b/npc/jobs/1-1/swordsman.txt
@@ -1,795 +1,795 @@
-//===== eAthena Script =======================================
-//= Swordsman Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== 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.
-//============================================================
-
-
-// == Monsters ==
-//Spawn is included in this file so make shure its not elsewhere to!
-sword_1-1.gat,35,78,0,0 monster Fabre 1184,4,0,0,0
-sword_1-1.gat,50,108,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,61,28,0,0 monster Fabre 1184,4,0,0,0
-sword_1-1.gat,61,92,0,0 monster Fabre 1184,2,0,0,0
-//
-sword_1-1.gat,110,112,0,0 monster Fabre 1184,3,0,0,0
-sword_1-1.gat,161,94,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,130,76,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,103,58,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,130,24,0,0 monster Fabre 1184,3,0,0,0
-//
-sword_1-1.gat,201,36,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,201,16,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,239,44,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,239,76,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,231,101,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,234,117,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,198,91,0,0 monster Fabre 1184,2,0,0,0
-sword_1-1.gat,200,63,0,0 monster Fabre 1184,2,0,0,0
-
-
-// == Warp ==
-// -- Warp to test room --
-izlude_in.gat,62,170,0 script w1039 45,1,1,
-{
- if(Class==Job_Novice && job_sword_q > 0) warp "izlude_in.gat",40,170;
- if(job_sword_q == 0) doevent "Swordsman::OnStart";
- end;
-}
-
-
-// == Npcs ==
-// -- Master Swordsman --
-izlude_in.gat,74,172,5 script Master Swordsman 119,
-{
- mes "[Master Swordsman]";
- if(Class==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(Class == Job_Swordman) goto O_1b;
- if(Class != Job_Novice) goto O_1c;
- 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) goto O_1d;
-
- O_1a:
- 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;
-
- O_1b:
- mes "Muhahaha! You must be kidding me! You're already a swordsman.";
- emotion 18;
- close;
-
- O_1c:
- 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 18;
- close;
-
- O_1d:
- mes "A hem...., you have yet to learn all of the 'Basic Skills' needed to become a Swordsman. Please check the requirements again.";
- 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 18;
- goto L_Menu;
-
- M_2:
- mes "[Master Swordsman]";
- mes "So you wish to become a swordsman....";
- next;
- if(Class == Job_Novice) goto O_2a;
- if(Class == Job_Swordman) goto O_2b;
- 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;
-
- O_2b:
- mes "[Master Swordsman]";
- mes "....but you're already a Swordsman...????";
- emotion 20;
- close;
-
- M_End:
- mes "[Master Swordsman]";
- mes "Enjoy your youth before you lose it~~ Muhahahaha!!!!";
- emotion 18;
- 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;
- JobChange Job_Swordman;
- set job_sword_q,0;
- 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;
-}
-
-// -- Swordsman --
-izlude_in.gat,65,171,5 script Swordsman 85,{
- doevent "Swordsman";
- end;
-}
-
-// -- Hidden Npc --
-izlude_in.gat,65,171,5 script Swordsman -1,{
-
-OnStart:
- mes "[Swordsman]";
- if(Class == 1) goto L_Sword;
- if(Class == 0) goto L_Novice;
-
-L_Other:
- mes "Who might you be?! Those who are not Novices are not permitted to go in! Please leave.";
- emotion 1;
- close;
-L_Sword:
- mes "You're already a Swordsman!! You don't need to take this silly test!";
- emotion 0;
- 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 0;
- 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 becarefull!";
- 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!!",M_yes,"Ah..maybe later..",M_no;
- close;
-
- M_yes:
- set SWTEST, SWTEST + 1;
- savepoint "izlude_in.gat",39,170;
- warp "sword_1-1.gat",10,245;
- deltimer "Test Hall Staff::OnTimer7min";
- deltimer "Test Hall Staff::OnTimer4min";
- deltimer "Test Hall Staff::OnTimer2min";
- deltimer "Test Hall Staff::OnTimer1min";
- deltimer "Test Hall Staff::OnTimer30sec";
- deltimer "Test Hall Staff::OnTimer0min";
- addtimer 2000, "Test Hall Staff::OnTimer7min";
- addtimer 182000, "Test Hall Staff::OnTimer4min";
- addtimer 302000, "Test Hall Staff::OnTimer2min";
- addtimer 362000, "Test Hall Staff::OnTimer1min";
- addtimer 392000, "Test Hall Staff::OnTimer30sec";
- addtimer 422000, "Test Hall Staff::OnTimer0min";
- 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;
-
-L_Timer:
- OnTimer7min:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: Your 7 minutes starts now!",0;
- end;
- OnTimer4min:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 4 minutes left!",0;
- end;
- OnTimer2min:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 2 minutes left!",0;
- end;
- OnTimer1min:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 1minute left",0;
- end;
- OnTimer30sec:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 30 seconds left, hurry!",0;
- end;
- OnTimer0min:
- areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: Your times up! You failed the test.",0;
- addtimer 4000, "Test Hall Staff::OnTimerWarp";
- end;
- OnTimerWarp:
- warp "izlude_in.gat",39,170;
-}
-
-
-// -- Medic 1 --
-sword_1-1.gat,230,245,2 script Medic 105,{
- mes "[Medic]";
- mes "This is the 1st check point! You're doing great!";
- percentheal 100, 100;
- close;
-}
-
-// -- Test Hall Staff 2 --
-sword_1-1.gat,230,242,2 script Test Hall Staff 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 --
-sword_1-1.gat,230,207,2 script Medic 105,{
- mes "[Medic]";
- mes "This is the 2nd check point! Keep up the good work!";
- percentheal 100, 100;
- close;
-}
-
-// -- Test Hall Staff 3 --
-sword_1-1.gat,230,204,2 script Test Hall Staff 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) --
-sword_1-1.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;
- 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 -
-sword_1-1.gat,22,172,1 script 1green_1::green 139,0,0,{
- heal (-4),0;
- end;
-}
-
-// -- Duplicates --
-sword_1-1.gat,22,173,1 duplicate(green) 1green_2 139,0,0
-sword_1-1.gat,23,172,1 duplicate(green) 1green_3 139,0,0
-sword_1-1.gat,23,173,1 duplicate(green) 1green_4 139,0,0
-sword_1-1.gat,34,172,1 duplicate(green) 1green_5 139,0,0
-sword_1-1.gat,34,173,1 duplicate(green) 1green_6 139,0,0
-sword_1-1.gat,35,172,1 duplicate(green) 1green_7 139,0,0
-sword_1-1.gat,35,173,1 duplicate(green) 1green_8 139,0,0
-sword_1-1.gat,66,170,1 duplicate(green) 1green_9 139,0,0
-sword_1-1.gat,66,171,1 duplicate(green) 1green_10 139,0,0
-sword_1-1.gat,67,170,1 duplicate(green) 1green_11 139,0,0
-sword_1-1.gat,67,171,1 duplicate(green) 1green_12 139,0,0
-sword_1-1.gat,70,170,1 duplicate(green) 1green_13 139,0,0
-sword_1-1.gat,70,171,1 duplicate(green) 1green_14 139,0,0
-sword_1-1.gat,71,170,1 duplicate(green) 1green_15 139,0,0
-sword_1-1.gat,71,171,1 duplicate(green) 1green_16 139,0,0
-
-// - Right -
-sword_1-1.gat,22,164,1 duplicate(green) 1green_17 139,0,0
-sword_1-1.gat,22,165,1 duplicate(green) 1green_18 139,0,0
-sword_1-1.gat,23,164,1 duplicate(green) 1green_19 139,0,0
-sword_1-1.gat,23,165,1 duplicate(green) 1green_20 139,0,0
-sword_1-1.gat,34,164,1 duplicate(green) 1green_21 139,0,0
-sword_1-1.gat,34,165,1 duplicate(green) 1green_22 139,0,0
-sword_1-1.gat,35,164,1 duplicate(green) 1green_23 139,0,0
-sword_1-1.gat,35,165,1 duplicate(green) 1green_24 139,0,0
-sword_1-1.gat,66,166,1 duplicate(green) 1green_25 139,0,0
-sword_1-1.gat,66,167,1 duplicate(green) 1green_26 139,0,0
-sword_1-1.gat,67,166,1 duplicate(green) 1green_27 139,0,0
-sword_1-1.gat,67,167,1 duplicate(green) 1green_28 139,0,0
-sword_1-1.gat,70,166,1 duplicate(green) 1green_29 139,0,0
-sword_1-1.gat,70,167,1 duplicate(green) 1green_30 139,0,0
-sword_1-1.gat,71,166,1 duplicate(green) 1green_31 139,0,0
-sword_1-1.gat,71,167,1 duplicate(green) 1green_32 139,0,0
-// - Center -
-sword_1-1.gat,86,168,1 duplicate(green) 1green_33 139,0,0
-sword_1-1.gat,86,169,1 duplicate(green) 1green_34 139,0,0
-sword_1-1.gat,87,168,1 duplicate(green) 1green_35 139,0,0
-sword_1-1.gat,87,169,1 duplicate(green) 1green_36 139,0,0
-
-// -- Second Section --
-// - Left -
-sword_1-1.gat,83,171,1 duplicate(green) 2green_1 139,0,1
-sword_1-1.gat,82,171,1 duplicate(green) 2green_2 139,0,1
-sword_1-1.gat,90,171,1 duplicate(green) 2green_3 139,0,1
-sword_1-1.gat,91,171,1 duplicate(green) 2green_4 139,0,1
-sword_1-1.gat,84,173,1 duplicate(green) 2green_5 139,1,0
-sword_1-1.gat,90,173,1 duplicate(green) 2green_6 139,1,0
-sword_1-1.gat,83,166,1 duplicate(green) 2green_7 139,0,1
-sword_1-1.gat,82,166,1 duplicate(green) 2green_8 139,0,1
-sword_1-1.gat,90,166,1 duplicate(green) 2green_9 139,0,1
-sword_1-1.gat,91,166,1 duplicate(green) 2green_10 139,0,1
-sword_1-1.gat,84,164,1 duplicate(green) 2green_11 139,1,0
-sword_1-1.gat,90,164,1 duplicate(green) 2green_12 139,1,0
-sword_1-1.gat,102,168,1 duplicate(green) 2green_13 139,0,0
-sword_1-1.gat,102,169,1 duplicate(green) 2green_14 139,0,0
-// - Right -
-sword_1-1.gat,102,172,1 duplicate(green) 2green_15 139,0,0
-sword_1-1.gat,102,173,1 duplicate(green) 2green_16 139,0,0
-sword_1-1.gat,103,172,1 duplicate(green) 2green_17 139,0,0
-sword_1-1.gat,103,173,1 duplicate(green) 2green_18 139,0,0
-sword_1-1.gat,106,172,1 duplicate(green) 2green_19 139,0,0
-sword_1-1.gat,106,173,1 duplicate(green) 2green_20 139,0,0
-sword_1-1.gat,107,172,1 duplicate(green) 2green_21 139,0,0
-sword_1-1.gat,107,173,1 duplicate(green) 2green_22 139,0,0
-sword_1-1.gat,110,172,1 duplicate(green) 2green_23 139,0,0
-sword_1-1.gat,110,173,1 duplicate(green) 2green_24 139,0,0
-sword_1-1.gat,111,172,1 duplicate(green) 2green_25 139,0,0
-sword_1-1.gat,111,173,1 duplicate(green) 2green_26 139,0,0
-// - Center -
-sword_1-1.gat,102,164,1 duplicate(green) 2green_27 139,0,0
-sword_1-1.gat,102,165,1 duplicate(green) 2green_28 139,0,0
-sword_1-1.gat,103,164,1 duplicate(green) 2green_29 139,0,0
-sword_1-1.gat,103,165,1 duplicate(green) 2green_30 139,0,0
-sword_1-1.gat,106,164,1 duplicate(green) 2green_31 139,0,0
-sword_1-1.gat,106,165,1 duplicate(green) 2green_32 139,0,0
-sword_1-1.gat,107,164,1 duplicate(green) 2green_33 139,0,0
-sword_1-1.gat,107,165,1 duplicate(green) 2green_34 139,0,0
-sword_1-1.gat,110,164,1 duplicate(green) 2green_35 139,0,0
-sword_1-1.gat,110,165,1 duplicate(green) 2green_36 139,0,0
-sword_1-1.gat,111,164,1 duplicate(green) 2green_37 139,0,0
-sword_1-1.gat,111,165,1 duplicate(green) 2green_38 139,0,0
-
-
-// -- Third Section --
-sword_1-1.gat,121,172,1 duplicate(green) 3green_1 139,2,0
-sword_1-1.gat,121,173,1 duplicate(green) 3green_2 139,2,0
-sword_1-1.gat,121,164,1 duplicate(green) 3green_3 139,2,0
-sword_1-1.gat,121,165,1 duplicate(green) 3green_4 139,2,0
-sword_1-1.gat,121,168,1 duplicate(green) 3green_5 139,2,0
-sword_1-1.gat,121,169,1 duplicate(green) 3green_6 139,2,0
-
-// -- Fourth Section --
-sword_1-1.gat,130,169,1 duplicate(green) 4green_1 139,0,4
-sword_1-1.gat,131,169,1 duplicate(green) 4green_2 139,0,4
-sword_1-1.gat,135,164,1 duplicate(green) 4green_3 139,5,0
-sword_1-1.gat,136,165,1 duplicate(green) 4green_4 139,4,0
-sword_1-1.gat,140,169,1 duplicate(green) 4green_5 139,0,3
-sword_1-1.gat,141,168,1 duplicate(green) 4green_6 139,0,4
-sword_1-1.gat,137,172,1 duplicate(green) 4green_7 139,2,0
-sword_1-1.gat,138,173,1 duplicate(green) 4green_8 139,3,0
-sword_1-1.gat,134,171,1 duplicate(green) 4green_9 139,0,2
-sword_1-1.gat,135,168,1 duplicate(green) 4green_10 139,0,1
-sword_1-1.gat,135,170,1 duplicate(green) 4green_11 139,1,0
-
-// -- Fifth Section --
-sword_1-1.gat,144,169,1 duplicate(green) 5green_1 139,0,4
-sword_1-1.gat,145,169,1 duplicate(green) 5green_2 139,0,4
-sword_1-1.gat,148,164,1 duplicate(green) 5green_3 139,4,0
-sword_1-1.gat,149,165,1 duplicate(green) 5green_4 139,3,0
-sword_1-1.gat,156,166,1 duplicate(green) 5green_5 139,0,2
-sword_1-1.gat,157,166,1 duplicate(green) 5green_6 139,0,2
-sword_1-1.gat,153,169,1 duplicate(green) 5green_7 139,4,0
-sword_1-1.gat,152,168,1 duplicate(green) 5green_8 139,3,0
-sword_1-1.gat,149,171,1 duplicate(green) 5green_9 139,0,1
-sword_1-1.gat,148,171,1 duplicate(green) 5green_10 139,0,2
-sword_1-1.gat,154,173,1 duplicate(green) 5green_11 139,2,0
-sword_1-1.gat,154,172,1 duplicate(green) 5green_12 139,2,0
-
-// -- Last Section --
-sword_1-1.gat,164,172,1 duplicate(green) 6green_1 139,0,0
-sword_1-1.gat,164,173,1 duplicate(green) 6green_2 139,0,0
-sword_1-1.gat,165,172,1 duplicate(green) 6green_3 139,0,0
-sword_1-1.gat,165,173,1 duplicate(green) 6green_4 139,0,0
-sword_1-1.gat,172,172,1 duplicate(green) 6green_5 139,0,0
-sword_1-1.gat,172,173,1 duplicate(green) 6green_6 139,0,0
-sword_1-1.gat,173,172,1 duplicate(green) 6green_7 139,0,0
-sword_1-1.gat,173,173,1 duplicate(green) 6green_8 139,0,0
-
-sword_1-1.gat,164,168,1 duplicate(green) 6green_9 139,0,0
-sword_1-1.gat,164,169,1 duplicate(green) 6green_10 139,0,0
-sword_1-1.gat,165,168,1 duplicate(green) 6green_11 139,0,0
-sword_1-1.gat,165,169,1 duplicate(green) 6green_12 139,0,0
-sword_1-1.gat,172,168,1 duplicate(green) 6green_13 139,0,0
-sword_1-1.gat,172,169,1 duplicate(green) 6green_14 139,0,0
-sword_1-1.gat,173,168,1 duplicate(green) 6green_15 139,0,0
-sword_1-1.gat,173,169,1 duplicate(green) 6green_16 139,0,0
-
-sword_1-1.gat,164,164,1 duplicate(green) 6green_17 139,0,0
-sword_1-1.gat,164,165,1 duplicate(green) 6green_18 139,0,0
-sword_1-1.gat,165,164,1 duplicate(green) 6green_19 139,0,0
-sword_1-1.gat,165,165,1 duplicate(green) 6green_20 139,0,0
-sword_1-1.gat,172,164,1 duplicate(green) 6green_21 139,0,0
-sword_1-1.gat,172,165,1 duplicate(green) 6green_22 139,0,0
-sword_1-1.gat,173,164,1 duplicate(green) 6green_23 139,0,0
-sword_1-1.gat,173,165,1 duplicate(green) 6green_24 139,0,0
-
-
-
-// == Fall Warps ==
-
-sword_1-1.gat,16,251,4 script 1_blank_1a#1::1_blank 139,0,1,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "sword_1-1.gat",65,56;
- if (@TEMP==1) warp "sword_1-1.gat",29,26;
- if (@TEMP==2) warp "sword_1-1.gat",43,16;
- if (@TEMP==3) warp "sword_1-1.gat",23,112;
- if (@TEMP==4) warp "sword_1-1.gat",58,83;
- end;
-}
-
-// -- Duplicates --
-sword_1-1.gat,19,251,4 duplicate(1_blank) 1_blank_1b 139,0,1
-sword_1-1.gat,17,250,4 duplicate(1_blank) 1_blank_1c 139,1,0
-sword_1-1.gat,17,251,4 duplicate(1_blank) 1_blank_1a 139,1,1
-sword_1-1.gat,18,251,4 duplicate(1_blank) 1_blank_1b 139,1,1
-sword_1-1.gat,17,251,4 duplicate(1_blank) 1_blank_1c 139,1,1
-sword_1-1.gat,16,238,4 duplicate(1_blank) 1_blank_2a 139,0,1
-sword_1-1.gat,19,238,4 duplicate(1_blank) 1_blank_2b 139,0,1
-sword_1-1.gat,17,239,4 duplicate(1_blank) 1_blank_2c 139,0,1
-sword_1-1.gat,28,246,4 duplicate(1_blank) 1_blank_3a 139,4,1
-sword_1-1.gat,33,245,4 duplicate(1_blank) 1_blank_3b 139,0,2
-sword_1-1.gat,29,242,4 duplicate(1_blank) 1_blank_3c 139,4,0
-sword_1-1.gat,24,244,4 duplicate(1_blank) 1_blank_3d 139,0,2
-sword_1-1.gat,38,251,4 duplicate(1_blank) 1_blank_4a 139,0,1
-sword_1-1.gat,41,251,4 duplicate(1_blank) 1_blank_4b 139,0,1
-sword_1-1.gat,39,250,4 duplicate(1_blank) 1_blank_4c 139,1,0
-sword_1-1.gat,38,238,4 duplicate(1_blank) 1_blank_5a 139,0,1
-sword_1-1.gat,41,238,4 duplicate(1_blank) 1_blank_5_b 139,0,1
-sword_1-1.gat,39,239,4 duplicate(1_blank) 1_blank_5_c 139,1,0
-sword_1-1.gat,54,251,4 duplicate(1_blank) 1_blank_6_a 139,0,1
-sword_1-1.gat,71,251,4 duplicate(1_blank) 1_blank_6_b 139,0,1
-sword_1-1.gat,62,250,4 duplicate(1_blank) 1_blank_6_c 139,9,0
-sword_1-1.gat,62,247,4 duplicate(1_blank) 1_blank_7_a 139,8,0
-sword_1-1.gat,71,244,4 duplicate(1_blank) 1_blank_7_b 139,0,2
-sword_1-1.gat,63,242,4 duplicate(1_blank) 1_blank_7_c 139,8,0
-sword_1-1.gat,54,244,4 duplicate(1_blank) 1_blank_7_d 139,0,2
-sword_1-1.gat,54,238,4 duplicate(1_blank) 1_blank_8_a 139,0,1
-sword_1-1.gat,71,238,4 duplicate(1_blank) 1_blank_8_b 139,0,1
-sword_1-1.gat,62,239,4 duplicate(1_blank) 1_blank_8_c 139,9,0
-sword_1-1.gat,102,247,4 duplicate(1_blank) 1_blank_9_a 139,2,0
-sword_1-1.gat,105,245,4 duplicate(1_blank) 1_blank_9_b 139,0,2
-sword_1-1.gat,103,242,4 duplicate(1_blank) 1_blank_9_c 139,2,0
-sword_1-1.gat,100,244,4 duplicate(1_blank) 1_blank_9_d 139,0,2
-sword_1-1.gat,156,249,4 duplicate(1_blank) 1_blank_10_a 139,14,0
-sword_1-1.gat,156,248,4 duplicate(1_blank) 1_blank_10_b 139,14,0
-sword_1-1.gat,170,249,4 duplicate(1_blank) 1_blank_10_c 139,1,0
-sword_1-1.gat,170,248,4 duplicate(1_blank) 1_blank_10_d 139,1,0
-sword_1-1.gat,156,245,4 duplicate(1_blank) 1_blank_11_a 139,14,0
-sword_1-1.gat,156,244,4 duplicate(1_blank) 1_blank_11_b 139,14,0
-sword_1-1.gat,170,245,4 duplicate(1_blank) 1_blank_11_c 139,1,0
-sword_1-1.gat,170,244,4 duplicate(1_blank) 1_blank_11_d 139,1,0
-sword_1-1.gat,156,241,4 duplicate(1_blank) 1_blank_12_a 139,14,0
-sword_1-1.gat,156,240,4 duplicate(1_blank) 1_blank_12_b 139,14,0
-sword_1-1.gat,170,241,4 duplicate(1_blank) 1_blank_12_c 139,1,0
-sword_1-1.gat,170,240,4 duplicate(1_blank) 1_blank_12_d 139,1,0
-sword_1-1.gat,180,251,4 duplicate(1_blank) 1_blank_13_a 139,0,1
-sword_1-1.gat,183,251,4 duplicate(1_blank) 1_blank_13_b 139,0,1
-sword_1-1.gat,181,250,4 duplicate(1_blank) 1_blank_13_c 139,1,0
-sword_1-1.gat,180,238,4 duplicate(1_blank) 1_blank_14_a 139,0,1
-sword_1-1.gat,183,238,4 duplicate(1_blank) 1_blank_14_b 139,0,1
-sword_1-1.gat,181,239,4 duplicate(1_blank) 1_blank_14_c 139,1,0
-
-
-sword_1-1.gat,56,212,4 script 2_blank_1_a::2_blank 139,40,0,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "sword_1-1.gat",162,120;
- if (@TEMP==1) warp "sword_1-1.gat",94,120;
- if (@TEMP==2) warp "sword_1-1.gat",94,85;
- if (@TEMP==3) warp "sword_1-1.gat",162,85;
- if (@TEMP==4) warp "sword_1-1.gat",130,47;
- end;
-}
-
-// -- Duplicates --
-sword_1-1.gat,95,212,4 duplicate(2_blank) 2_blank_1_b 139,2,0
-sword_1-1.gat,56,210,4 duplicate(2_blank) 2_blank_2_a 139,40,0
-sword_1-1.gat,95,210,4 duplicate(2_blank) 2_blank_2_b 139,2,0
-sword_1-1.gat,16,206,4 duplicate(2_blank) 2_blank_2_c 139,0,3
-sword_1-1.gat,97,206,4 duplicate(2_blank) 2_blank_2_d 139,0,3
-sword_1-1.gat,56,203,4 duplicate(2_blank) 2_blank_2_e 139,40,0
-sword_1-1.gat,95,203,4 duplicate(2_blank) 2_blank_2_f 139,2,0
-sword_1-1.gat,56,201,4 duplicate(2_blank) 2_blank_3_a 139,40,0
-sword_1-1.gat,95,201,4 duplicate(2_blank) 2_blank_3_b 139,2,0
-
-// - part 2 -
-sword_1-1.gat,113,212,4 duplicate(2_blank) 2_blank_4_a 139,14,0
-sword_1-1.gat,125,212,4 duplicate(2_blank) 2_blank_4_b 139,2,0
-sword_1-1.gat,113,210,4 duplicate(2_blank) 2_blank_5_a 139,14,0
-sword_1-1.gat,125,210,4 duplicate(2_blank) 2_blank_5_b 139,2,0
-sword_1-1.gat,100,206,4 duplicate(2_blank) 2_blank_5_c 139,0,3
-sword_1-1.gat,127,206,4 duplicate(2_blank) 2_blank_5_d 139,0,3
-sword_1-1.gat,113,203,4 duplicate(2_blank) 2_blank_5_e 139,14,0
-sword_1-1.gat,125,210,4 duplicate(2_blank) 2_blank_5_f 139,2,0
-sword_1-1.gat,113,201,4 duplicate(2_blank) 2_blank_6_a 139,14,0
-sword_1-1.gat,113,201,4 duplicate(2_blank) 2_blank_6_b 139,2,0
-
-// - part 3 -
-sword_1-1.gat,155,212,4 duplicate(2_blank) 2_blank_7_a 139,21,0
-sword_1-1.gat,181,212,4 duplicate(2_blank) 2_blank_7_b 139,2,0
-sword_1-1.gat,155,210,4 duplicate(2_blank) 2_blank_8_a 139,21,0
-sword_1-1.gat,181,210,4 duplicate(2_blank) 2_blank_8_b 139,2,0
-sword_1-1.gat,130,206,4 duplicate(2_blank) 2_blank_8_c 139,0,3
-sword_1-1.gat,183,206,4 duplicate(2_blank) 2_blank_8_d 139,0,3
-sword_1-1.gat,155,203,4 duplicate(2_blank) 2_blank_8_e 139,21,0
-sword_1-1.gat,181,203,4 duplicate(2_blank) 2_blank_8_f 139,2,0
-sword_1-1.gat,155,201,4 duplicate(2_blank) 2_blank_9_a 139,40,0
-sword_1-1.gat,181,201,4 duplicate(2_blank) 2_blank_9_b 139,2,0
-
-sword_1-1.gat,17,174,4 script 3_blank_1_a::3_blank 139,2,0,{
- set @TEMP,rand(5);
- if (@TEMP==0) warp "sword_1-1.gat",195,15;
- if (@TEMP==1) warp "sword_1-1.gat",195,38;
- if (@TEMP==2) warp "sword_1-1.gat",231,30;
- if (@TEMP==3) warp "sword_1-1.gat",198,65;
- if (@TEMP==4) warp "sword_1-1.gat",196,116;
- end;
-}
-
-// -- Duplicates --
-sword_1-1.gat,17,163,4 duplicate(3_blank) 3_blank_2_a 139,2,0
-sword_1-1.gat,29,171,4 duplicate(3_blank) 3_blank_3_a 139,2,0
-sword_1-1.gat,31,168,4 duplicate(3_blank) 3_blank_3_b 139,0,2
-sword_1-1.gat,28,166,4 duplicate(3_blank) 3_blank_3_c 139,2,0
-sword_1-1.gat,26,168,4 duplicate(3_blank) 3_blank_3_d 139,0,2
-sword_1-1.gat,36,169,4 duplicate(3_blank) 3_blank_4_a 139,0,0
-sword_1-1.gat,37,169,4 duplicate(3_blank) 3_blank_4_b 139,0,0
-sword_1-1.gat,37,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
-sword_1-1.gat,36,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
-sword_1-1.gat,40,175,4 duplicate(3_blank) 3_blank_5_a 139,0,1
-sword_1-1.gat,41,175,4 duplicate(3_blank) 3_blank_5_b 139,0,1
-sword_1-1.gat,41,171,4 duplicate(3_blank) 3_blank_6_a 139,1,0
-sword_1-1.gat,41,170,4 duplicate(3_blank) 3_blank_6_b 139,1,0
-sword_1-1.gat,41,167,4 duplicate(3_blank) 3_blank_6_c 139,1,0
-sword_1-1.gat,41,166,4 duplicate(3_blank) 3_blank_6_d 139,1,0
-sword_1-1.gat,42,169,4 duplicate(3_blank) 3_blank_6_e 139,0,1
-sword_1-1.gat,43,170,4 duplicate(3_blank) 3_blank_6_f 139,0,1
-sword_1-1.gat,43,167,4 duplicate(3_blank) 3_blank_6_g 139,0,1
-sword_1-1.gat,40,162,4 duplicate(3_blank) 3_blank_7_a 139,0,1
-sword_1-1.gat,41,162,4 duplicate(3_blank) 3_blank_7_b 139,0,1
-sword_1-1.gat,46,175,4 duplicate(3_blank) 3_blank_8_a 139,0,1
-sword_1-1.gat,51,175,4 duplicate(3_blank) 3_blank_8_b 139,0,1
-sword_1-1.gat,47,174,4 duplicate(3_blank) 3_blank_8_c 139,1,0
-sword_1-1.gat,50,174,4 duplicate(3_blank) 3_blank_8_d 139,1,0
-sword_1-1.gat,48,173,4 duplicate(3_blank) 3_blank_8_e 139,0,1
-sword_1-1.gat,49,173,4 duplicate(3_blank) 3_blank_8_f 139,0,1
-sword_1-1.gat,46,162,4 duplicate(3_blank) 3_blank_9_a 139,0,1
-sword_1-1.gat,51,162,4 duplicate(3_blank) 3_blank_9_b 139,0,1
-sword_1-1.gat,47,163,4 duplicate(3_blank) 3_blank_9_c 139,1,0
-sword_1-1.gat,50,163,4 duplicate(3_blank) 3_blank_9_d 139,1,0
-sword_1-1.gat,48,164,4 duplicate(3_blank) 3_blank_9_e 139,0,1
-sword_1-1.gat,49,164,4 duplicate(3_blank) 3_blank_9_f 139,0,1
-sword_1-1.gat,54,170,4 duplicate(3_blank) 3_blank_10_a 139,0,1
-sword_1-1.gat,55,170,4 duplicate(3_blank) 3_blank_10_b 139,0,1
-sword_1-1.gat,54,167,4 duplicate(3_blank) 3_blank_10_c 139,0,1
-sword_1-1.gat,55,167,4 duplicate(3_blank) 3_blank_10_d 139,0,1
-sword_1-1.gat,53,169,4 duplicate(3_blank) 3_blank_10_e 139,1,0
-sword_1-1.gat,53,168,4 duplicate(3_blank) 3_blank_10_f 139,1,0
-sword_1-1.gat,56,169,4 duplicate(3_blank) 3_blank_10_g 139,1,0
-sword_1-1.gat,56,168,4 duplicate(3_blank) 3_blank_10_h 139,1,0
-sword_1-1.gat,58,175,4 duplicate(3_blank) 3_blank_11_a 139,0,1
-sword_1-1.gat,59,174,4 duplicate(3_blank) 3_blank_11_b 139,1,0
-sword_1-1.gat,60,173,4 duplicate(3_blank) 3_blank_11_c 139,0,1
-sword_1-1.gat,61,172,4 duplicate(3_blank) 3_blank_11_d 139,1,0
-sword_1-1.gat,58,162,4 duplicate(3_blank) 3_blank_12_a 139,0,1
-sword_1-1.gat,59,163,4 duplicate(3_blank) 3_blank_12_b 139,1,0
-sword_1-1.gat,60,164,4 duplicate(3_blank) 3_blank_12_c 139,0,1
-sword_1-1.gat,61,165,4 duplicate(3_blank) 3_blank_12_d 139,1,0
-sword_1-1.gat,76,172,4 duplicate(3_blank) 3_blank_13_a 139,1,0
-sword_1-1.gat,77,173,4 duplicate(3_blank) 3_blank_13_b 139,0,1
-sword_1-1.gat,78,174,4 duplicate(3_blank) 3_blank_13_c 139,1,0
-sword_1-1.gat,79,175,4 duplicate(3_blank) 3_blank_13_d 139,0,1
-sword_1-1.gat,76,165,4 duplicate(3_blank) 3_blank_14_a 139,1,0
-sword_1-1.gat,77,164,4 duplicate(3_blank) 3_blank_14_b 139,0,1
-sword_1-1.gat,78,163,4 duplicate(3_blank) 3_blank_14_c 139,1,0
-sword_1-1.gat,79,162,4 duplicate(3_blank) 3_blank_14_d 139,0,1
-sword_1-1.gat,94,175,4 duplicate(3_blank) 3_blank_15_a 139,0,1
-sword_1-1.gat,95,174,4 duplicate(3_blank) 3_blank_15_b 139,1,0
-sword_1-1.gat,98,174,4 duplicate(3_blank) 3_blank_15_c 139,1,0
-sword_1-1.gat,99,175,4 duplicate(3_blank) 3_blank_16_d 139,0,1
-sword_1-1.gat,96,169,4 duplicate(3_blank) 3_blank_17_a 139,0,0
-sword_1-1.gat,97,169,4 duplicate(3_blank) 3_blank_17_b 139,0,0
-sword_1-1.gat,97,168,4 duplicate(3_blank) 3_blank_17_c 139,0,0
-sword_1-1.gat,96,168,4 duplicate(3_blank) 3_blank_17_d 139,0,0
-sword_1-1.gat,94,162,4 duplicate(3_blank) 3_blank_18_a 139,0,1
-sword_1-1.gat,95,163,4 duplicate(3_blank) 3_blank_18_b 139,1,0
-sword_1-1.gat,98,163,4 duplicate(3_blank) 3_blank_18_c 139,1,0
-sword_1-1.gat,99,162,4 duplicate(3_blank) 3_blank_18_d 139,0,1
-sword_1-1.gat,114,175,4 duplicate(3_blank) 3_blank_19_a 139,0,1
-sword_1-1.gat,115,175,4 duplicate(3_blank) 3_blank_19_b 139,0,1
-sword_1-1.gat,114,162,4 duplicate(3_blank) 3_blank_20_a 139,0,1
-sword_1-1.gat,115,162,4 duplicate(3_blank) 3_blank_20_b 139,0,1
-sword_1-1.gat,126,175,4 duplicate(3_blank) 3_blank_21_a 139,0,1
-sword_1-1.gat,127,175,4 duplicate(3_blank) 3_blank_21_b 139,0,1
-sword_1-1.gat,126,162,4 duplicate(3_blank) 3_blank_23_a 139,0,1
-sword_1-1.gat,127,162,4 duplicate(3_blank) 3_blank_23_b 139,0,1
-sword_1-1.gat,160,174,4 duplicate(3_blank) 3_blank_24_a 139,0,2
-sword_1-1.gat,161,174,4 duplicate(3_blank) 3_blank_24_b 139,0,2
-sword_1-1.gat,160,163,4 duplicate(3_blank) 3_blank_25_a 139,0,2
-sword_1-1.gat,161,163,4 duplicate(3_blank) 3_blank_25_b 139,0,2
-sword_1-1.gat,168,175,4 duplicate(3_blank) 3_blank_26_a 139,0,2
-sword_1-1.gat,169,175,4 duplicate(3_blank) 3_blank_26_b 139,0,2
-sword_1-1.gat,168,162,4 duplicate(3_blank) 3_blank_27_a 139,0,2
-sword_1-1.gat,169,162,4 duplicate(3_blank) 3_blank_27_b 139,0,2
-sword_1-1.gat,176,174,4 duplicate(3_blank) 3_blank_28_a 139,0,2
-sword_1-1.gat,177,174,4 duplicate(3_blank) 3_blank_28_b 139,0,2
-sword_1-1.gat,178,173,4 duplicate(3_blank) 3_blank_28_c 139,1,0
-sword_1-1.gat,178,172,4 duplicate(3_blank) 3_blank_28_d 139,1,0
-sword_1-1.gat,181,174,4 duplicate(3_blank) 3_blank_28_e 139,2,0
-sword_1-1.gat,179,169,4 duplicate(3_blank) 3_blank_29_a 139,3,0
-sword_1-1.gat,179,168,4 duplicate(3_blank) 3_blank_29_b 139,3,0
-sword_1-1.gat,182,169,4 duplicate(3_blank) 3_blank_29_c 139,0,2
-sword_1-1.gat,183,169,4 duplicate(3_blank) 3_blank_29_d 139,0,2
-sword_1-1.gat,181,167,4 duplicate(3_blank) 3_blank_29_e 139,1,0
-sword_1-1.gat,181,166,4 duplicate(3_blank) 3_blank_29_f 139,1,0
-sword_1-1.gat,183,167,4 duplicate(3_blank) 3_blank_29_g 139,0,1
-sword_1-1.gat,176,163,4 duplicate(3_blank) 3_blank_30_a 139,0,2
-sword_1-1.gat,177,163,4 duplicate(3_blank) 3_blank_30_b 139,0,2
-sword_1-1.gat,181,163,4 duplicate(3_blank) 3_blank_30_c 139,2,0
+//===== eAthena Script =======================================
+//= Swordsman Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== 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.
+//============================================================
+
+
+// == Monsters ==
+//Spawn is included in this file so make shure its not elsewhere to!
+sword_1-1.gat,35,78,0,0 monster Fabre 1184,4,0,0,0
+sword_1-1.gat,50,108,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,61,28,0,0 monster Fabre 1184,4,0,0,0
+sword_1-1.gat,61,92,0,0 monster Fabre 1184,2,0,0,0
+//
+sword_1-1.gat,110,112,0,0 monster Fabre 1184,3,0,0,0
+sword_1-1.gat,161,94,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,130,76,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,103,58,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,130,24,0,0 monster Fabre 1184,3,0,0,0
+//
+sword_1-1.gat,201,36,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,201,16,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,239,44,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,239,76,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,231,101,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,234,117,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,198,91,0,0 monster Fabre 1184,2,0,0,0
+sword_1-1.gat,200,63,0,0 monster Fabre 1184,2,0,0,0
+
+
+// == Warp ==
+// -- Warp to test room --
+izlude_in.gat,62,170,0 script w1039 45,1,1,
+{
+ if(Class==Job_Novice && job_sword_q > 0) warp "izlude_in.gat",40,170;
+ if(job_sword_q == 0) doevent "Swordsman::OnStart";
+ end;
+}
+
+
+// == Npcs ==
+// -- Master Swordsman --
+izlude_in.gat,74,172,5 script Master Swordsman 119,
+{
+ mes "[Master Swordsman]";
+ if(Class==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(Class == Job_Swordman) goto O_1b;
+ if(Class != Job_Novice) goto O_1c;
+ 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) goto O_1d;
+
+ O_1a:
+ 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;
+
+ O_1b:
+ mes "Muhahaha! You must be kidding me! You're already a swordsman.";
+ emotion 18;
+ close;
+
+ O_1c:
+ 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 18;
+ close;
+
+ O_1d:
+ mes "A hem...., you have yet to learn all of the 'Basic Skills' needed to become a Swordsman. Please check the requirements again.";
+ 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 18;
+ goto L_Menu;
+
+ M_2:
+ mes "[Master Swordsman]";
+ mes "So you wish to become a swordsman....";
+ next;
+ if(Class == Job_Novice) goto O_2a;
+ if(Class == Job_Swordman) goto O_2b;
+ 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;
+
+ O_2b:
+ mes "[Master Swordsman]";
+ mes "....but you're already a Swordsman...????";
+ emotion 20;
+ close;
+
+ M_End:
+ mes "[Master Swordsman]";
+ mes "Enjoy your youth before you lose it~~ Muhahahaha!!!!";
+ emotion 18;
+ 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;
+ JobChange Job_Swordman;
+ set job_sword_q,0;
+ 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;
+}
+
+// -- Swordsman --
+izlude_in.gat,65,171,5 script Swordsman 85,{
+ doevent "Swordsman";
+ end;
+}
+
+// -- Hidden Npc --
+izlude_in.gat,65,171,5 script Swordsman -1,{
+
+OnStart:
+ mes "[Swordsman]";
+ if(Class == 1) goto L_Sword;
+ if(Class == 0) goto L_Novice;
+
+L_Other:
+ mes "Who might you be?! Those who are not Novices are not permitted to go in! Please leave.";
+ emotion 1;
+ close;
+L_Sword:
+ mes "You're already a Swordsman!! You don't need to take this silly test!";
+ emotion 0;
+ 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 0;
+ 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 becarefull!";
+ 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!!",M_yes,"Ah..maybe later..",M_no;
+ close;
+
+ M_yes:
+ set SWTEST, SWTEST + 1;
+ savepoint "izlude_in.gat",39,170;
+ warp "sword_1-1.gat",10,245;
+ deltimer "Test Hall Staff::OnTimer7min";
+ deltimer "Test Hall Staff::OnTimer4min";
+ deltimer "Test Hall Staff::OnTimer2min";
+ deltimer "Test Hall Staff::OnTimer1min";
+ deltimer "Test Hall Staff::OnTimer30sec";
+ deltimer "Test Hall Staff::OnTimer0min";
+ addtimer 2000, "Test Hall Staff::OnTimer7min";
+ addtimer 182000, "Test Hall Staff::OnTimer4min";
+ addtimer 302000, "Test Hall Staff::OnTimer2min";
+ addtimer 362000, "Test Hall Staff::OnTimer1min";
+ addtimer 392000, "Test Hall Staff::OnTimer30sec";
+ addtimer 422000, "Test Hall Staff::OnTimer0min";
+ 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;
+
+L_Timer:
+ OnTimer7min:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: Your 7 minutes starts now!",0;
+ end;
+ OnTimer4min:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 4 minutes left!",0;
+ end;
+ OnTimer2min:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 2 minutes left!",0;
+ end;
+ OnTimer1min:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 1minute left",0;
+ end;
+ OnTimer30sec:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: You have 30 seconds left, hurry!",0;
+ end;
+ OnTimer0min:
+ areaannounce "sword_1-1.gat", 8, 162, 191, 251, "[Test Hall Staff]: Your times up! You failed the test.",0;
+ addtimer 4000, "Test Hall Staff::OnTimerWarp";
+ end;
+ OnTimerWarp:
+ warp "izlude_in.gat",39,170;
+}
+
+
+// -- Medic 1 --
+sword_1-1.gat,230,245,2 script Medic 105,{
+ mes "[Medic]";
+ mes "This is the 1st check point! You're doing great!";
+ percentheal 100, 100;
+ close;
+}
+
+// -- Test Hall Staff 2 --
+sword_1-1.gat,230,242,2 script Test Hall Staff 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 --
+sword_1-1.gat,230,207,2 script Medic 105,{
+ mes "[Medic]";
+ mes "This is the 2nd check point! Keep up the good work!";
+ percentheal 100, 100;
+ close;
+}
+
+// -- Test Hall Staff 3 --
+sword_1-1.gat,230,204,2 script Test Hall Staff 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) --
+sword_1-1.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;
+ 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 -
+sword_1-1.gat,22,172,1 script 1green_1::green 139,0,0,{
+ heal (-4),0;
+ end;
+}
+
+// -- Duplicates --
+sword_1-1.gat,22,173,1 duplicate(green) 1green_2 139,0,0
+sword_1-1.gat,23,172,1 duplicate(green) 1green_3 139,0,0
+sword_1-1.gat,23,173,1 duplicate(green) 1green_4 139,0,0
+sword_1-1.gat,34,172,1 duplicate(green) 1green_5 139,0,0
+sword_1-1.gat,34,173,1 duplicate(green) 1green_6 139,0,0
+sword_1-1.gat,35,172,1 duplicate(green) 1green_7 139,0,0
+sword_1-1.gat,35,173,1 duplicate(green) 1green_8 139,0,0
+sword_1-1.gat,66,170,1 duplicate(green) 1green_9 139,0,0
+sword_1-1.gat,66,171,1 duplicate(green) 1green_10 139,0,0
+sword_1-1.gat,67,170,1 duplicate(green) 1green_11 139,0,0
+sword_1-1.gat,67,171,1 duplicate(green) 1green_12 139,0,0
+sword_1-1.gat,70,170,1 duplicate(green) 1green_13 139,0,0
+sword_1-1.gat,70,171,1 duplicate(green) 1green_14 139,0,0
+sword_1-1.gat,71,170,1 duplicate(green) 1green_15 139,0,0
+sword_1-1.gat,71,171,1 duplicate(green) 1green_16 139,0,0
+
+// - Right -
+sword_1-1.gat,22,164,1 duplicate(green) 1green_17 139,0,0
+sword_1-1.gat,22,165,1 duplicate(green) 1green_18 139,0,0
+sword_1-1.gat,23,164,1 duplicate(green) 1green_19 139,0,0
+sword_1-1.gat,23,165,1 duplicate(green) 1green_20 139,0,0
+sword_1-1.gat,34,164,1 duplicate(green) 1green_21 139,0,0
+sword_1-1.gat,34,165,1 duplicate(green) 1green_22 139,0,0
+sword_1-1.gat,35,164,1 duplicate(green) 1green_23 139,0,0
+sword_1-1.gat,35,165,1 duplicate(green) 1green_24 139,0,0
+sword_1-1.gat,66,166,1 duplicate(green) 1green_25 139,0,0
+sword_1-1.gat,66,167,1 duplicate(green) 1green_26 139,0,0
+sword_1-1.gat,67,166,1 duplicate(green) 1green_27 139,0,0
+sword_1-1.gat,67,167,1 duplicate(green) 1green_28 139,0,0
+sword_1-1.gat,70,166,1 duplicate(green) 1green_29 139,0,0
+sword_1-1.gat,70,167,1 duplicate(green) 1green_30 139,0,0
+sword_1-1.gat,71,166,1 duplicate(green) 1green_31 139,0,0
+sword_1-1.gat,71,167,1 duplicate(green) 1green_32 139,0,0
+// - Center -
+sword_1-1.gat,86,168,1 duplicate(green) 1green_33 139,0,0
+sword_1-1.gat,86,169,1 duplicate(green) 1green_34 139,0,0
+sword_1-1.gat,87,168,1 duplicate(green) 1green_35 139,0,0
+sword_1-1.gat,87,169,1 duplicate(green) 1green_36 139,0,0
+
+// -- Second Section --
+// - Left -
+sword_1-1.gat,83,171,1 duplicate(green) 2green_1 139,0,1
+sword_1-1.gat,82,171,1 duplicate(green) 2green_2 139,0,1
+sword_1-1.gat,90,171,1 duplicate(green) 2green_3 139,0,1
+sword_1-1.gat,91,171,1 duplicate(green) 2green_4 139,0,1
+sword_1-1.gat,84,173,1 duplicate(green) 2green_5 139,1,0
+sword_1-1.gat,90,173,1 duplicate(green) 2green_6 139,1,0
+sword_1-1.gat,83,166,1 duplicate(green) 2green_7 139,0,1
+sword_1-1.gat,82,166,1 duplicate(green) 2green_8 139,0,1
+sword_1-1.gat,90,166,1 duplicate(green) 2green_9 139,0,1
+sword_1-1.gat,91,166,1 duplicate(green) 2green_10 139,0,1
+sword_1-1.gat,84,164,1 duplicate(green) 2green_11 139,1,0
+sword_1-1.gat,90,164,1 duplicate(green) 2green_12 139,1,0
+sword_1-1.gat,102,168,1 duplicate(green) 2green_13 139,0,0
+sword_1-1.gat,102,169,1 duplicate(green) 2green_14 139,0,0
+// - Right -
+sword_1-1.gat,102,172,1 duplicate(green) 2green_15 139,0,0
+sword_1-1.gat,102,173,1 duplicate(green) 2green_16 139,0,0
+sword_1-1.gat,103,172,1 duplicate(green) 2green_17 139,0,0
+sword_1-1.gat,103,173,1 duplicate(green) 2green_18 139,0,0
+sword_1-1.gat,106,172,1 duplicate(green) 2green_19 139,0,0
+sword_1-1.gat,106,173,1 duplicate(green) 2green_20 139,0,0
+sword_1-1.gat,107,172,1 duplicate(green) 2green_21 139,0,0
+sword_1-1.gat,107,173,1 duplicate(green) 2green_22 139,0,0
+sword_1-1.gat,110,172,1 duplicate(green) 2green_23 139,0,0
+sword_1-1.gat,110,173,1 duplicate(green) 2green_24 139,0,0
+sword_1-1.gat,111,172,1 duplicate(green) 2green_25 139,0,0
+sword_1-1.gat,111,173,1 duplicate(green) 2green_26 139,0,0
+// - Center -
+sword_1-1.gat,102,164,1 duplicate(green) 2green_27 139,0,0
+sword_1-1.gat,102,165,1 duplicate(green) 2green_28 139,0,0
+sword_1-1.gat,103,164,1 duplicate(green) 2green_29 139,0,0
+sword_1-1.gat,103,165,1 duplicate(green) 2green_30 139,0,0
+sword_1-1.gat,106,164,1 duplicate(green) 2green_31 139,0,0
+sword_1-1.gat,106,165,1 duplicate(green) 2green_32 139,0,0
+sword_1-1.gat,107,164,1 duplicate(green) 2green_33 139,0,0
+sword_1-1.gat,107,165,1 duplicate(green) 2green_34 139,0,0
+sword_1-1.gat,110,164,1 duplicate(green) 2green_35 139,0,0
+sword_1-1.gat,110,165,1 duplicate(green) 2green_36 139,0,0
+sword_1-1.gat,111,164,1 duplicate(green) 2green_37 139,0,0
+sword_1-1.gat,111,165,1 duplicate(green) 2green_38 139,0,0
+
+
+// -- Third Section --
+sword_1-1.gat,121,172,1 duplicate(green) 3green_1 139,2,0
+sword_1-1.gat,121,173,1 duplicate(green) 3green_2 139,2,0
+sword_1-1.gat,121,164,1 duplicate(green) 3green_3 139,2,0
+sword_1-1.gat,121,165,1 duplicate(green) 3green_4 139,2,0
+sword_1-1.gat,121,168,1 duplicate(green) 3green_5 139,2,0
+sword_1-1.gat,121,169,1 duplicate(green) 3green_6 139,2,0
+
+// -- Fourth Section --
+sword_1-1.gat,130,169,1 duplicate(green) 4green_1 139,0,4
+sword_1-1.gat,131,169,1 duplicate(green) 4green_2 139,0,4
+sword_1-1.gat,135,164,1 duplicate(green) 4green_3 139,5,0
+sword_1-1.gat,136,165,1 duplicate(green) 4green_4 139,4,0
+sword_1-1.gat,140,169,1 duplicate(green) 4green_5 139,0,3
+sword_1-1.gat,141,168,1 duplicate(green) 4green_6 139,0,4
+sword_1-1.gat,137,172,1 duplicate(green) 4green_7 139,2,0
+sword_1-1.gat,138,173,1 duplicate(green) 4green_8 139,3,0
+sword_1-1.gat,134,171,1 duplicate(green) 4green_9 139,0,2
+sword_1-1.gat,135,168,1 duplicate(green) 4green_10 139,0,1
+sword_1-1.gat,135,170,1 duplicate(green) 4green_11 139,1,0
+
+// -- Fifth Section --
+sword_1-1.gat,144,169,1 duplicate(green) 5green_1 139,0,4
+sword_1-1.gat,145,169,1 duplicate(green) 5green_2 139,0,4
+sword_1-1.gat,148,164,1 duplicate(green) 5green_3 139,4,0
+sword_1-1.gat,149,165,1 duplicate(green) 5green_4 139,3,0
+sword_1-1.gat,156,166,1 duplicate(green) 5green_5 139,0,2
+sword_1-1.gat,157,166,1 duplicate(green) 5green_6 139,0,2
+sword_1-1.gat,153,169,1 duplicate(green) 5green_7 139,4,0
+sword_1-1.gat,152,168,1 duplicate(green) 5green_8 139,3,0
+sword_1-1.gat,149,171,1 duplicate(green) 5green_9 139,0,1
+sword_1-1.gat,148,171,1 duplicate(green) 5green_10 139,0,2
+sword_1-1.gat,154,173,1 duplicate(green) 5green_11 139,2,0
+sword_1-1.gat,154,172,1 duplicate(green) 5green_12 139,2,0
+
+// -- Last Section --
+sword_1-1.gat,164,172,1 duplicate(green) 6green_1 139,0,0
+sword_1-1.gat,164,173,1 duplicate(green) 6green_2 139,0,0
+sword_1-1.gat,165,172,1 duplicate(green) 6green_3 139,0,0
+sword_1-1.gat,165,173,1 duplicate(green) 6green_4 139,0,0
+sword_1-1.gat,172,172,1 duplicate(green) 6green_5 139,0,0
+sword_1-1.gat,172,173,1 duplicate(green) 6green_6 139,0,0
+sword_1-1.gat,173,172,1 duplicate(green) 6green_7 139,0,0
+sword_1-1.gat,173,173,1 duplicate(green) 6green_8 139,0,0
+
+sword_1-1.gat,164,168,1 duplicate(green) 6green_9 139,0,0
+sword_1-1.gat,164,169,1 duplicate(green) 6green_10 139,0,0
+sword_1-1.gat,165,168,1 duplicate(green) 6green_11 139,0,0
+sword_1-1.gat,165,169,1 duplicate(green) 6green_12 139,0,0
+sword_1-1.gat,172,168,1 duplicate(green) 6green_13 139,0,0
+sword_1-1.gat,172,169,1 duplicate(green) 6green_14 139,0,0
+sword_1-1.gat,173,168,1 duplicate(green) 6green_15 139,0,0
+sword_1-1.gat,173,169,1 duplicate(green) 6green_16 139,0,0
+
+sword_1-1.gat,164,164,1 duplicate(green) 6green_17 139,0,0
+sword_1-1.gat,164,165,1 duplicate(green) 6green_18 139,0,0
+sword_1-1.gat,165,164,1 duplicate(green) 6green_19 139,0,0
+sword_1-1.gat,165,165,1 duplicate(green) 6green_20 139,0,0
+sword_1-1.gat,172,164,1 duplicate(green) 6green_21 139,0,0
+sword_1-1.gat,172,165,1 duplicate(green) 6green_22 139,0,0
+sword_1-1.gat,173,164,1 duplicate(green) 6green_23 139,0,0
+sword_1-1.gat,173,165,1 duplicate(green) 6green_24 139,0,0
+
+
+
+// == Fall Warps ==
+
+sword_1-1.gat,16,251,4 script 1_blank_1a#1::1_blank 139,0,1,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "sword_1-1.gat",65,56;
+ if (@TEMP==1) warp "sword_1-1.gat",29,26;
+ if (@TEMP==2) warp "sword_1-1.gat",43,16;
+ if (@TEMP==3) warp "sword_1-1.gat",23,112;
+ if (@TEMP==4) warp "sword_1-1.gat",58,83;
+ end;
+}
+
+// -- Duplicates --
+sword_1-1.gat,19,251,4 duplicate(1_blank) 1_blank_1b 139,0,1
+sword_1-1.gat,17,250,4 duplicate(1_blank) 1_blank_1c 139,1,0
+sword_1-1.gat,17,251,4 duplicate(1_blank) 1_blank_1a 139,1,1
+sword_1-1.gat,18,251,4 duplicate(1_blank) 1_blank_1b 139,1,1
+sword_1-1.gat,17,251,4 duplicate(1_blank) 1_blank_1c 139,1,1
+sword_1-1.gat,16,238,4 duplicate(1_blank) 1_blank_2a 139,0,1
+sword_1-1.gat,19,238,4 duplicate(1_blank) 1_blank_2b 139,0,1
+sword_1-1.gat,17,239,4 duplicate(1_blank) 1_blank_2c 139,0,1
+sword_1-1.gat,28,246,4 duplicate(1_blank) 1_blank_3a 139,4,1
+sword_1-1.gat,33,245,4 duplicate(1_blank) 1_blank_3b 139,0,2
+sword_1-1.gat,29,242,4 duplicate(1_blank) 1_blank_3c 139,4,0
+sword_1-1.gat,24,244,4 duplicate(1_blank) 1_blank_3d 139,0,2
+sword_1-1.gat,38,251,4 duplicate(1_blank) 1_blank_4a 139,0,1
+sword_1-1.gat,41,251,4 duplicate(1_blank) 1_blank_4b 139,0,1
+sword_1-1.gat,39,250,4 duplicate(1_blank) 1_blank_4c 139,1,0
+sword_1-1.gat,38,238,4 duplicate(1_blank) 1_blank_5a 139,0,1
+sword_1-1.gat,41,238,4 duplicate(1_blank) 1_blank_5_b 139,0,1
+sword_1-1.gat,39,239,4 duplicate(1_blank) 1_blank_5_c 139,1,0
+sword_1-1.gat,54,251,4 duplicate(1_blank) 1_blank_6_a 139,0,1
+sword_1-1.gat,71,251,4 duplicate(1_blank) 1_blank_6_b 139,0,1
+sword_1-1.gat,62,250,4 duplicate(1_blank) 1_blank_6_c 139,9,0
+sword_1-1.gat,62,247,4 duplicate(1_blank) 1_blank_7_a 139,8,0
+sword_1-1.gat,71,244,4 duplicate(1_blank) 1_blank_7_b 139,0,2
+sword_1-1.gat,63,242,4 duplicate(1_blank) 1_blank_7_c 139,8,0
+sword_1-1.gat,54,244,4 duplicate(1_blank) 1_blank_7_d 139,0,2
+sword_1-1.gat,54,238,4 duplicate(1_blank) 1_blank_8_a 139,0,1
+sword_1-1.gat,71,238,4 duplicate(1_blank) 1_blank_8_b 139,0,1
+sword_1-1.gat,62,239,4 duplicate(1_blank) 1_blank_8_c 139,9,0
+sword_1-1.gat,102,247,4 duplicate(1_blank) 1_blank_9_a 139,2,0
+sword_1-1.gat,105,245,4 duplicate(1_blank) 1_blank_9_b 139,0,2
+sword_1-1.gat,103,242,4 duplicate(1_blank) 1_blank_9_c 139,2,0
+sword_1-1.gat,100,244,4 duplicate(1_blank) 1_blank_9_d 139,0,2
+sword_1-1.gat,156,249,4 duplicate(1_blank) 1_blank_10_a 139,14,0
+sword_1-1.gat,156,248,4 duplicate(1_blank) 1_blank_10_b 139,14,0
+sword_1-1.gat,170,249,4 duplicate(1_blank) 1_blank_10_c 139,1,0
+sword_1-1.gat,170,248,4 duplicate(1_blank) 1_blank_10_d 139,1,0
+sword_1-1.gat,156,245,4 duplicate(1_blank) 1_blank_11_a 139,14,0
+sword_1-1.gat,156,244,4 duplicate(1_blank) 1_blank_11_b 139,14,0
+sword_1-1.gat,170,245,4 duplicate(1_blank) 1_blank_11_c 139,1,0
+sword_1-1.gat,170,244,4 duplicate(1_blank) 1_blank_11_d 139,1,0
+sword_1-1.gat,156,241,4 duplicate(1_blank) 1_blank_12_a 139,14,0
+sword_1-1.gat,156,240,4 duplicate(1_blank) 1_blank_12_b 139,14,0
+sword_1-1.gat,170,241,4 duplicate(1_blank) 1_blank_12_c 139,1,0
+sword_1-1.gat,170,240,4 duplicate(1_blank) 1_blank_12_d 139,1,0
+sword_1-1.gat,180,251,4 duplicate(1_blank) 1_blank_13_a 139,0,1
+sword_1-1.gat,183,251,4 duplicate(1_blank) 1_blank_13_b 139,0,1
+sword_1-1.gat,181,250,4 duplicate(1_blank) 1_blank_13_c 139,1,0
+sword_1-1.gat,180,238,4 duplicate(1_blank) 1_blank_14_a 139,0,1
+sword_1-1.gat,183,238,4 duplicate(1_blank) 1_blank_14_b 139,0,1
+sword_1-1.gat,181,239,4 duplicate(1_blank) 1_blank_14_c 139,1,0
+
+
+sword_1-1.gat,56,212,4 script 2_blank_1_a::2_blank 139,40,0,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "sword_1-1.gat",162,120;
+ if (@TEMP==1) warp "sword_1-1.gat",94,120;
+ if (@TEMP==2) warp "sword_1-1.gat",94,85;
+ if (@TEMP==3) warp "sword_1-1.gat",162,85;
+ if (@TEMP==4) warp "sword_1-1.gat",130,47;
+ end;
+}
+
+// -- Duplicates --
+sword_1-1.gat,95,212,4 duplicate(2_blank) 2_blank_1_b 139,2,0
+sword_1-1.gat,56,210,4 duplicate(2_blank) 2_blank_2_a 139,40,0
+sword_1-1.gat,95,210,4 duplicate(2_blank) 2_blank_2_b 139,2,0
+sword_1-1.gat,16,206,4 duplicate(2_blank) 2_blank_2_c 139,0,3
+sword_1-1.gat,97,206,4 duplicate(2_blank) 2_blank_2_d 139,0,3
+sword_1-1.gat,56,203,4 duplicate(2_blank) 2_blank_2_e 139,40,0
+sword_1-1.gat,95,203,4 duplicate(2_blank) 2_blank_2_f 139,2,0
+sword_1-1.gat,56,201,4 duplicate(2_blank) 2_blank_3_a 139,40,0
+sword_1-1.gat,95,201,4 duplicate(2_blank) 2_blank_3_b 139,2,0
+
+// - part 2 -
+sword_1-1.gat,113,212,4 duplicate(2_blank) 2_blank_4_a 139,14,0
+sword_1-1.gat,125,212,4 duplicate(2_blank) 2_blank_4_b 139,2,0
+sword_1-1.gat,113,210,4 duplicate(2_blank) 2_blank_5_a 139,14,0
+sword_1-1.gat,125,210,4 duplicate(2_blank) 2_blank_5_b 139,2,0
+sword_1-1.gat,100,206,4 duplicate(2_blank) 2_blank_5_c 139,0,3
+sword_1-1.gat,127,206,4 duplicate(2_blank) 2_blank_5_d 139,0,3
+sword_1-1.gat,113,203,4 duplicate(2_blank) 2_blank_5_e 139,14,0
+sword_1-1.gat,125,210,4 duplicate(2_blank) 2_blank_5_f 139,2,0
+sword_1-1.gat,113,201,4 duplicate(2_blank) 2_blank_6_a 139,14,0
+sword_1-1.gat,113,201,4 duplicate(2_blank) 2_blank_6_b 139,2,0
+
+// - part 3 -
+sword_1-1.gat,155,212,4 duplicate(2_blank) 2_blank_7_a 139,21,0
+sword_1-1.gat,181,212,4 duplicate(2_blank) 2_blank_7_b 139,2,0
+sword_1-1.gat,155,210,4 duplicate(2_blank) 2_blank_8_a 139,21,0
+sword_1-1.gat,181,210,4 duplicate(2_blank) 2_blank_8_b 139,2,0
+sword_1-1.gat,130,206,4 duplicate(2_blank) 2_blank_8_c 139,0,3
+sword_1-1.gat,183,206,4 duplicate(2_blank) 2_blank_8_d 139,0,3
+sword_1-1.gat,155,203,4 duplicate(2_blank) 2_blank_8_e 139,21,0
+sword_1-1.gat,181,203,4 duplicate(2_blank) 2_blank_8_f 139,2,0
+sword_1-1.gat,155,201,4 duplicate(2_blank) 2_blank_9_a 139,40,0
+sword_1-1.gat,181,201,4 duplicate(2_blank) 2_blank_9_b 139,2,0
+
+sword_1-1.gat,17,174,4 script 3_blank_1_a::3_blank 139,2,0,{
+ set @TEMP,rand(5);
+ if (@TEMP==0) warp "sword_1-1.gat",195,15;
+ if (@TEMP==1) warp "sword_1-1.gat",195,38;
+ if (@TEMP==2) warp "sword_1-1.gat",231,30;
+ if (@TEMP==3) warp "sword_1-1.gat",198,65;
+ if (@TEMP==4) warp "sword_1-1.gat",196,116;
+ end;
+}
+
+// -- Duplicates --
+sword_1-1.gat,17,163,4 duplicate(3_blank) 3_blank_2_a 139,2,0
+sword_1-1.gat,29,171,4 duplicate(3_blank) 3_blank_3_a 139,2,0
+sword_1-1.gat,31,168,4 duplicate(3_blank) 3_blank_3_b 139,0,2
+sword_1-1.gat,28,166,4 duplicate(3_blank) 3_blank_3_c 139,2,0
+sword_1-1.gat,26,168,4 duplicate(3_blank) 3_blank_3_d 139,0,2
+sword_1-1.gat,36,169,4 duplicate(3_blank) 3_blank_4_a 139,0,0
+sword_1-1.gat,37,169,4 duplicate(3_blank) 3_blank_4_b 139,0,0
+sword_1-1.gat,37,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
+sword_1-1.gat,36,168,4 duplicate(3_blank) 3_blank_4_c 139,0,0
+sword_1-1.gat,40,175,4 duplicate(3_blank) 3_blank_5_a 139,0,1
+sword_1-1.gat,41,175,4 duplicate(3_blank) 3_blank_5_b 139,0,1
+sword_1-1.gat,41,171,4 duplicate(3_blank) 3_blank_6_a 139,1,0
+sword_1-1.gat,41,170,4 duplicate(3_blank) 3_blank_6_b 139,1,0
+sword_1-1.gat,41,167,4 duplicate(3_blank) 3_blank_6_c 139,1,0
+sword_1-1.gat,41,166,4 duplicate(3_blank) 3_blank_6_d 139,1,0
+sword_1-1.gat,42,169,4 duplicate(3_blank) 3_blank_6_e 139,0,1
+sword_1-1.gat,43,170,4 duplicate(3_blank) 3_blank_6_f 139,0,1
+sword_1-1.gat,43,167,4 duplicate(3_blank) 3_blank_6_g 139,0,1
+sword_1-1.gat,40,162,4 duplicate(3_blank) 3_blank_7_a 139,0,1
+sword_1-1.gat,41,162,4 duplicate(3_blank) 3_blank_7_b 139,0,1
+sword_1-1.gat,46,175,4 duplicate(3_blank) 3_blank_8_a 139,0,1
+sword_1-1.gat,51,175,4 duplicate(3_blank) 3_blank_8_b 139,0,1
+sword_1-1.gat,47,174,4 duplicate(3_blank) 3_blank_8_c 139,1,0
+sword_1-1.gat,50,174,4 duplicate(3_blank) 3_blank_8_d 139,1,0
+sword_1-1.gat,48,173,4 duplicate(3_blank) 3_blank_8_e 139,0,1
+sword_1-1.gat,49,173,4 duplicate(3_blank) 3_blank_8_f 139,0,1
+sword_1-1.gat,46,162,4 duplicate(3_blank) 3_blank_9_a 139,0,1
+sword_1-1.gat,51,162,4 duplicate(3_blank) 3_blank_9_b 139,0,1
+sword_1-1.gat,47,163,4 duplicate(3_blank) 3_blank_9_c 139,1,0
+sword_1-1.gat,50,163,4 duplicate(3_blank) 3_blank_9_d 139,1,0
+sword_1-1.gat,48,164,4 duplicate(3_blank) 3_blank_9_e 139,0,1
+sword_1-1.gat,49,164,4 duplicate(3_blank) 3_blank_9_f 139,0,1
+sword_1-1.gat,54,170,4 duplicate(3_blank) 3_blank_10_a 139,0,1
+sword_1-1.gat,55,170,4 duplicate(3_blank) 3_blank_10_b 139,0,1
+sword_1-1.gat,54,167,4 duplicate(3_blank) 3_blank_10_c 139,0,1
+sword_1-1.gat,55,167,4 duplicate(3_blank) 3_blank_10_d 139,0,1
+sword_1-1.gat,53,169,4 duplicate(3_blank) 3_blank_10_e 139,1,0
+sword_1-1.gat,53,168,4 duplicate(3_blank) 3_blank_10_f 139,1,0
+sword_1-1.gat,56,169,4 duplicate(3_blank) 3_blank_10_g 139,1,0
+sword_1-1.gat,56,168,4 duplicate(3_blank) 3_blank_10_h 139,1,0
+sword_1-1.gat,58,175,4 duplicate(3_blank) 3_blank_11_a 139,0,1
+sword_1-1.gat,59,174,4 duplicate(3_blank) 3_blank_11_b 139,1,0
+sword_1-1.gat,60,173,4 duplicate(3_blank) 3_blank_11_c 139,0,1
+sword_1-1.gat,61,172,4 duplicate(3_blank) 3_blank_11_d 139,1,0
+sword_1-1.gat,58,162,4 duplicate(3_blank) 3_blank_12_a 139,0,1
+sword_1-1.gat,59,163,4 duplicate(3_blank) 3_blank_12_b 139,1,0
+sword_1-1.gat,60,164,4 duplicate(3_blank) 3_blank_12_c 139,0,1
+sword_1-1.gat,61,165,4 duplicate(3_blank) 3_blank_12_d 139,1,0
+sword_1-1.gat,76,172,4 duplicate(3_blank) 3_blank_13_a 139,1,0
+sword_1-1.gat,77,173,4 duplicate(3_blank) 3_blank_13_b 139,0,1
+sword_1-1.gat,78,174,4 duplicate(3_blank) 3_blank_13_c 139,1,0
+sword_1-1.gat,79,175,4 duplicate(3_blank) 3_blank_13_d 139,0,1
+sword_1-1.gat,76,165,4 duplicate(3_blank) 3_blank_14_a 139,1,0
+sword_1-1.gat,77,164,4 duplicate(3_blank) 3_blank_14_b 139,0,1
+sword_1-1.gat,78,163,4 duplicate(3_blank) 3_blank_14_c 139,1,0
+sword_1-1.gat,79,162,4 duplicate(3_blank) 3_blank_14_d 139,0,1
+sword_1-1.gat,94,175,4 duplicate(3_blank) 3_blank_15_a 139,0,1
+sword_1-1.gat,95,174,4 duplicate(3_blank) 3_blank_15_b 139,1,0
+sword_1-1.gat,98,174,4 duplicate(3_blank) 3_blank_15_c 139,1,0
+sword_1-1.gat,99,175,4 duplicate(3_blank) 3_blank_16_d 139,0,1
+sword_1-1.gat,96,169,4 duplicate(3_blank) 3_blank_17_a 139,0,0
+sword_1-1.gat,97,169,4 duplicate(3_blank) 3_blank_17_b 139,0,0
+sword_1-1.gat,97,168,4 duplicate(3_blank) 3_blank_17_c 139,0,0
+sword_1-1.gat,96,168,4 duplicate(3_blank) 3_blank_17_d 139,0,0
+sword_1-1.gat,94,162,4 duplicate(3_blank) 3_blank_18_a 139,0,1
+sword_1-1.gat,95,163,4 duplicate(3_blank) 3_blank_18_b 139,1,0
+sword_1-1.gat,98,163,4 duplicate(3_blank) 3_blank_18_c 139,1,0
+sword_1-1.gat,99,162,4 duplicate(3_blank) 3_blank_18_d 139,0,1
+sword_1-1.gat,114,175,4 duplicate(3_blank) 3_blank_19_a 139,0,1
+sword_1-1.gat,115,175,4 duplicate(3_blank) 3_blank_19_b 139,0,1
+sword_1-1.gat,114,162,4 duplicate(3_blank) 3_blank_20_a 139,0,1
+sword_1-1.gat,115,162,4 duplicate(3_blank) 3_blank_20_b 139,0,1
+sword_1-1.gat,126,175,4 duplicate(3_blank) 3_blank_21_a 139,0,1
+sword_1-1.gat,127,175,4 duplicate(3_blank) 3_blank_21_b 139,0,1
+sword_1-1.gat,126,162,4 duplicate(3_blank) 3_blank_23_a 139,0,1
+sword_1-1.gat,127,162,4 duplicate(3_blank) 3_blank_23_b 139,0,1
+sword_1-1.gat,160,174,4 duplicate(3_blank) 3_blank_24_a 139,0,2
+sword_1-1.gat,161,174,4 duplicate(3_blank) 3_blank_24_b 139,0,2
+sword_1-1.gat,160,163,4 duplicate(3_blank) 3_blank_25_a 139,0,2
+sword_1-1.gat,161,163,4 duplicate(3_blank) 3_blank_25_b 139,0,2
+sword_1-1.gat,168,175,4 duplicate(3_blank) 3_blank_26_a 139,0,2
+sword_1-1.gat,169,175,4 duplicate(3_blank) 3_blank_26_b 139,0,2
+sword_1-1.gat,168,162,4 duplicate(3_blank) 3_blank_27_a 139,0,2
+sword_1-1.gat,169,162,4 duplicate(3_blank) 3_blank_27_b 139,0,2
+sword_1-1.gat,176,174,4 duplicate(3_blank) 3_blank_28_a 139,0,2
+sword_1-1.gat,177,174,4 duplicate(3_blank) 3_blank_28_b 139,0,2
+sword_1-1.gat,178,173,4 duplicate(3_blank) 3_blank_28_c 139,1,0
+sword_1-1.gat,178,172,4 duplicate(3_blank) 3_blank_28_d 139,1,0
+sword_1-1.gat,181,174,4 duplicate(3_blank) 3_blank_28_e 139,2,0
+sword_1-1.gat,179,169,4 duplicate(3_blank) 3_blank_29_a 139,3,0
+sword_1-1.gat,179,168,4 duplicate(3_blank) 3_blank_29_b 139,3,0
+sword_1-1.gat,182,169,4 duplicate(3_blank) 3_blank_29_c 139,0,2
+sword_1-1.gat,183,169,4 duplicate(3_blank) 3_blank_29_d 139,0,2
+sword_1-1.gat,181,167,4 duplicate(3_blank) 3_blank_29_e 139,1,0
+sword_1-1.gat,181,166,4 duplicate(3_blank) 3_blank_29_f 139,1,0
+sword_1-1.gat,183,167,4 duplicate(3_blank) 3_blank_29_g 139,0,1
+sword_1-1.gat,176,163,4 duplicate(3_blank) 3_blank_30_a 139,0,2
+sword_1-1.gat,177,163,4 duplicate(3_blank) 3_blank_30_b 139,0,2
+sword_1-1.gat,181,163,4 duplicate(3_blank) 3_blank_30_c 139,2,0
diff --git a/npc/jobs/1-1/thief.txt b/npc/jobs/1-1/thief.txt
index 6b0f931fe..1acc28314 100644
--- a/npc/jobs/1-1/thief.txt
+++ b/npc/jobs/1-1/thief.txt
@@ -1,443 +1,443 @@
-//===== eAthena Script =======================================
-//= Thief Job Quest
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-// == 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,
-{
- if(Class== Job_Thief) goto L_JobThief;
- if(Class == Job_Novice) goto L_Start;
-
-L_JobOther:
- mes "[Thief Guide]";
- if(Class==1 || Class==7 || Class==14) goto L_Swordman;
- if(Class==2 || Class==9 || Class==16) goto L_Mage;
- if(Class==3 || Class==11 || Class==19 || Class==20) goto L_Archer;
- if(Class==4 || Class==8 || Class==15) goto L_Acolyte;
- if(Class==5 || Class==10 || Class==18) goto L_Merchant;
-
- mes "You already have a job. Stop bothering me and go help out some newbies or something.";
- emotion 21;
- close;
- L_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;
- L_Archer:
- mes "What the heck...? Hahahaha~are you a 'Kill Stealing' Archer...?";
- emotion 18;
- close;
- L_Mage:
- mes "What the heck...? Ehhh??? A Circus Sideshow? Make a fire without a Matchstick, will ya?";
- emotion 19;
- close;
-
- L_Merchant:
- mes "What the heck...? Eeeeeek~Merchant Scammer here...!!!! I am gonna report you to the GM!!!";
- emotion 0;
- close;
- L_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 29;
- close;
-
-L_JobThief:
- mes "[Thief Guide]";
- mes "You're already a thief..... What do you want from me... go away!";
- emotion 4;
- close;
-
-L_Start:
- if(job_thief_q==2) goto L_1;
- if(job_thief_q==1) goto L_Back;
-
- mes "[Thief Guide]";
- if(Sex == 0)mes "Heh... You look like a well to do boy... what brought you down to this rat hole?";
- if(Sex == 1)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 atomosphere.....",M_0,"Me? I'm just looking around...",M_End;
-
- M_0:
- mes "[Thief Guide]";
- mes "Hmph... you sound a little cocky.... Ya 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.... it was my first robbery....";
- next;
- mes "[Thief Guide]";
- mes "Hahahaha... I can still remember the look on that guy's face...";
- emotion 18;
- 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 6;
- 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_End:
- mes "[Thief Guide]";
- mes "Must you people keep wasting my time!!?";
- emotion 32;
- close;
-
- L_Test:
- mes "[Thief Guide]";
- mes "Ok then. First, fill out this application form.";
- next;
- mes "(you fill out the form and hand it back)";
- 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 gota do is pass the Morroc Thief Test.";
- next;
-
- L_Explain:
- mes "[Thief Guide]";
- mes " The test will require you to ^ff0000'sneak'^000000 into ^ff0000'Shibu's Farm'^000000, and ^ff0000'steal'^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 your 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 25 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 you know there are Monsters which keep Mushrooms from the robbery^000000?"; //had to leave the engrish in, it was to good not too. d^_^b
- mes " Please ^0000ffget yourself out of the Fairy Tales^000000 and ^ff0000'Brace up your nerves. That will be the toughest experience to you^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^000000.";
- mes " You don't want 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 27;
- 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_,
-
- sL_0:
- mes "[Thief Guide]";
- 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 20;
- 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 32;
- 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 7;
- close;
-
- sL_1:
- mes "[Thief Guide]";
- 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 1;
- next;
- mes "[Thief Guide]";
- mes ".... Psych!! Just kidding... heheheh! Speak with the guy next to me about rating the mushrooms you swiped.";
- emotion 18;
- close;
-
- L_1:
- mes "[Thief Guide]";
- mes "So how was the Mushroom Farm. Did ya 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 `S@#$ Bloody As#$%^&s'.";
- next;
- mes "[Thief Guide]";
- 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.
- emotion 0;
- 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 ya mean. I was there before and it was awfull. 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 16;
- close;
-}
-
-
-// -- Test Grader --
-moc_prydb1.gat,42,133,2 script Comrade Brad 118,
-{
- if(Class == 0) goto L_Novice;
- if(Class == 6) 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 23;
- 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 theif, 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, kewl. You passed the Test!";
- 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 21;
- next;
- if(SkillPoint > 0) goto sL_SkPoint;
- delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
- delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
- JobChange 6;// Job: Job_Thief
- set job_thief_q,0;
- 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 Theif.";
- 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 29;
- next;
- mes "[Comrade Brad]";
- mes "Good luck and always remeber the ^0000cc'Theif 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 ok?";
- close;
-
-}
-
-
-// -- Irrelevant Man --
-moc_ruins.gat,141,125,3 script Irrelevant Man 118,
-{
- if(Class == 6) goto L_Thief;
- if(Class == 0) 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 6;
- close;
- L_1e:
- mes "[Irrelevant Man]";
- mes "Dude! I got nothin to say with you! Mind your own business! Sheesh!!";
- emotion 32;
- close;
-
-L_Thief:
- mes "[Irrelevant Man]";
- mes "Yah Hoo! Look at you! You became a Kool Thief!";
- emotion 21;
- next;
- mes "[Irrelevant Man]";
- mes "Don't worry about Shibu's Farm. Let the newbies handle that. Why don't ya 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 "Ok! 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 18;
- next;
- mes "[Irrelevant Man]";
- mes "Just kidding..... NOT!!. Anywho I'll let ya back in!";
- next;
- menu "Ready",M_Yes,"Not yet",M_No;
-
- M_Yes:
- goto L_Warp;
-
- M_No:
- mes "[Irrelevant Man]";
- mes "Ok, let me know when you are.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Thief Job Quest
+//===== By: ==================================================
+//= eAthena dev team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+// == 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,
+{
+ if(Class== Job_Thief) goto L_JobThief;
+ if(Class == Job_Novice) goto L_Start;
+
+L_JobOther:
+ mes "[Thief Guide]";
+ if(Class==1 || Class==7 || Class==14) goto L_Swordman;
+ if(Class==2 || Class==9 || Class==16) goto L_Mage;
+ if(Class==3 || Class==11 || Class==19 || Class==20) goto L_Archer;
+ if(Class==4 || Class==8 || Class==15) goto L_Acolyte;
+ if(Class==5 || Class==10 || Class==18) goto L_Merchant;
+
+ mes "You already have a job. Stop bothering me and go help out some newbies or something.";
+ emotion 21;
+ close;
+ L_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;
+ L_Archer:
+ mes "What the heck...? Hahahaha~are you a 'Kill Stealing' Archer...?";
+ emotion 18;
+ close;
+ L_Mage:
+ mes "What the heck...? Ehhh??? A Circus Sideshow? Make a fire without a Matchstick, will ya?";
+ emotion 19;
+ close;
+
+ L_Merchant:
+ mes "What the heck...? Eeeeeek~Merchant Scammer here...!!!! I am gonna report you to the GM!!!";
+ emotion 0;
+ close;
+ L_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 29;
+ close;
+
+L_JobThief:
+ mes "[Thief Guide]";
+ mes "You're already a thief..... What do you want from me... go away!";
+ emotion 4;
+ close;
+
+L_Start:
+ if(job_thief_q==2) goto L_1;
+ if(job_thief_q==1) goto L_Back;
+
+ mes "[Thief Guide]";
+ if(Sex == 0)mes "Heh... You look like a well to do boy... what brought you down to this rat hole?";
+ if(Sex == 1)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 atomosphere.....",M_0,"Me? I'm just looking around...",M_End;
+
+ M_0:
+ mes "[Thief Guide]";
+ mes "Hmph... you sound a little cocky.... Ya 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.... it was my first robbery....";
+ next;
+ mes "[Thief Guide]";
+ mes "Hahahaha... I can still remember the look on that guy's face...";
+ emotion 18;
+ 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 6;
+ 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_End:
+ mes "[Thief Guide]";
+ mes "Must you people keep wasting my time!!?";
+ emotion 32;
+ close;
+
+ L_Test:
+ mes "[Thief Guide]";
+ mes "Ok then. First, fill out this application form.";
+ next;
+ mes "(you fill out the form and hand it back)";
+ 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 gota do is pass the Morroc Thief Test.";
+ next;
+
+ L_Explain:
+ mes "[Thief Guide]";
+ mes " The test will require you to ^ff0000'sneak'^000000 into ^ff0000'Shibu's Farm'^000000, and ^ff0000'steal'^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 your 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 25 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 you know there are Monsters which keep Mushrooms from the robbery^000000?"; //had to leave the engrish in, it was to good not too. d^_^b
+ mes " Please ^0000ffget yourself out of the Fairy Tales^000000 and ^ff0000'Brace up your nerves. That will be the toughest experience to you^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^000000.";
+ mes " You don't want 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 27;
+ 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_,
+
+ sL_0:
+ mes "[Thief Guide]";
+ 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 20;
+ 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 32;
+ 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 7;
+ close;
+
+ sL_1:
+ mes "[Thief Guide]";
+ 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 1;
+ next;
+ mes "[Thief Guide]";
+ mes ".... Psych!! Just kidding... heheheh! Speak with the guy next to me about rating the mushrooms you swiped.";
+ emotion 18;
+ close;
+
+ L_1:
+ mes "[Thief Guide]";
+ mes "So how was the Mushroom Farm. Did ya 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 `S@#$ Bloody As#$%^&s'.";
+ next;
+ mes "[Thief Guide]";
+ 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.
+ emotion 0;
+ 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 ya mean. I was there before and it was awfull. 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 16;
+ close;
+}
+
+
+// -- Test Grader --
+moc_prydb1.gat,42,133,2 script Comrade Brad 118,
+{
+ if(Class == 0) goto L_Novice;
+ if(Class == 6) 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 23;
+ 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 theif, 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, kewl. You passed the Test!";
+ 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 21;
+ next;
+ if(SkillPoint > 0) goto sL_SkPoint;
+ delitem 1069, countitem(1069);//Items: Orange_Net_Mushroom,
+ delitem 1070, countitem(1070);//Items: Orange_Gooey_Mushroom_,
+ JobChange 6;// Job: Job_Thief
+ set job_thief_q,0;
+ 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 Theif.";
+ 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 29;
+ next;
+ mes "[Comrade Brad]";
+ mes "Good luck and always remeber the ^0000cc'Theif 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 ok?";
+ close;
+
+}
+
+
+// -- Irrelevant Man --
+moc_ruins.gat,141,125,3 script Irrelevant Man 118,
+{
+ if(Class == 6) goto L_Thief;
+ if(Class == 0) 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 6;
+ close;
+ L_1e:
+ mes "[Irrelevant Man]";
+ mes "Dude! I got nothin to say with you! Mind your own business! Sheesh!!";
+ emotion 32;
+ close;
+
+L_Thief:
+ mes "[Irrelevant Man]";
+ mes "Yah Hoo! Look at you! You became a Kool Thief!";
+ emotion 21;
+ next;
+ mes "[Irrelevant Man]";
+ mes "Don't worry about Shibu's Farm. Let the newbies handle that. Why don't ya 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 "Ok! 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 18;
+ next;
+ mes "[Irrelevant Man]";
+ mes "Just kidding..... NOT!!. Anywho I'll let ya back in!";
+ next;
+ menu "Ready",M_Yes,"Not yet",M_No;
+
+ M_Yes:
+ goto L_Warp;
+
+ M_No:
+ mes "[Irrelevant Man]";
+ mes "Ok, let me know when you are.";
+ close;
+
+}
diff --git a/npc/jobs/2-1-1/AssassinCross.txt b/npc/jobs/2-1-1/AssassinCross.txt
index da841b601..d46fa2d70 100644
--- a/npc/jobs/2-1-1/AssassinCross.txt
+++ b/npc/jobs/2-1-1/AssassinCross.txt
@@ -1,70 +1,70 @@
-//Assasin Cross Made by Evera/Lorri
-valkyrie.gat,44,58,6 script Assassin Cross 725,{
- if ((readparam(11)>=99) && (readparam(19)==12) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19)==4001) && (readparam(55) >= 10)) goto Lhtheif;
- if ((readparam(19)==4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19)==4007) && (readparam(55) >= 40)) goto Lhsin;
- if ((readparam(19)==4007) && (readparam(55) < 40)) goto LCem;
- if ((readparam(19)) && (readparam(19))) goto LCongrats;
- if (readparam(19)==4013) goto Lcrazy;
- if (readparam(12) != 0) goto Lskpt;
- mes "[Assasin Cross]";
- mes "Who are you?";
- mes "Meet all the req. first.";
- close;
-Lnovice:
- mes "[Assasin Cross]";
- mes "Now, here's the deal. I change you into a High Novice.";
- mes "You come back to become a High Theif, then become an Assassin Cross.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lhtheif:
- mes "[Assasin Cross]";
- mes "Wanna become a High Theif?";
- menu "Yes",Lhtheif2,"No",Lcancel;
-Lhtheif2:
- mes "[Assasin Cross]";
- mes "We shall start the ceremony....";
- next;
- jobchange 30;// Job: Job_Thief_High
- close;
-Lhsin:
- mes "[Assasin Cross]";
- mes "Ready to become a Assassin Cross?";
- menu "Yes",Lhsin2,"No",Lcancel;
-Lhsin2:
- mes "[Assasin Cross]";
- mes "We shall start the ceremony....";
- jobchange 36;// Job: Job_Assassin_Cross
- close;
-Lcrazy:
- mes "[Assassin Cross]";
- mes "We shall start the ceremony....";
- next;
- mes "[Assassin Cross]";
- mes "You've already gone to the next level";
- close;
-Lskpt:
- mes "[Assasin Cross]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "We shall start the ceremony....";
- next;
- mes "[Assassin Cross]";
- mes "You're not ready to go to the next level";
- close;
-LCongrats:
- mes "Congratulations on your victory.";
- mes "May you and others have honor and glory!";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Assasin Cross Made by Evera/Lorri
+valkyrie.gat,44,58,6 script Assassin Cross 725,{
+ if ((readparam(11)>=99) && (readparam(19)==12) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19)==4001) && (readparam(55) >= 10)) goto Lhtheif;
+ if ((readparam(19)==4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19)==4007) && (readparam(55) >= 40)) goto Lhsin;
+ if ((readparam(19)==4007) && (readparam(55) < 40)) goto LCem;
+ if ((readparam(19)) && (readparam(19))) goto LCongrats;
+ if (readparam(19)==4013) goto Lcrazy;
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[Assasin Cross]";
+ mes "Who are you?";
+ mes "Meet all the req. first.";
+ close;
+Lnovice:
+ mes "[Assasin Cross]";
+ mes "Now, here's the deal. I change you into a High Novice.";
+ mes "You come back to become a High Theif, then become an Assassin Cross.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lhtheif:
+ mes "[Assasin Cross]";
+ mes "Wanna become a High Theif?";
+ menu "Yes",Lhtheif2,"No",Lcancel;
+Lhtheif2:
+ mes "[Assasin Cross]";
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 30;// Job: Job_Thief_High
+ close;
+Lhsin:
+ mes "[Assasin Cross]";
+ mes "Ready to become a Assassin Cross?";
+ menu "Yes",Lhsin2,"No",Lcancel;
+Lhsin2:
+ mes "[Assasin Cross]";
+ mes "We shall start the ceremony....";
+ jobchange 36;// Job: Job_Assassin_Cross
+ close;
+Lcrazy:
+ mes "[Assassin Cross]";
+ mes "We shall start the ceremony....";
+ next;
+ mes "[Assassin Cross]";
+ mes "You've already gone to the next level";
+ close;
+Lskpt:
+ mes "[Assasin Cross]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "We shall start the ceremony....";
+ next;
+ mes "[Assassin Cross]";
+ mes "You're not ready to go to the next level";
+ close;
+LCongrats:
+ mes "Congratulations on your victory.";
+ mes "May you and others have honor and glory!";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1-1/HighPriest.txt b/npc/jobs/2-1-1/HighPriest.txt
index c7f08c2d6..ba569125e 100644
--- a/npc/jobs/2-1-1/HighPriest.txt
+++ b/npc/jobs/2-1-1/HighPriest.txt
@@ -1,61 +1,61 @@
-//High Priest Made by Evera/Lorri
-valkyrie.gat,44,42,6 script High Priest 60,{
- if ((readparam(11) >= 99) && (readparam(19) == 8) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4005) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4005) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4009) goto Lcrazy;
- if (readparam(12) != 0) goto Lskpt;
- mes "[High Priest]";
- mes "Hello";
- mes "God bless you.";
- close;
-Lnovice:
- mes "[High Priest]";
- mes "Hi! I'm a little different from you, have you noticed?";
- mes "If you devote yourself entirely you can be just like me.";
- mes "There is a catch though, you have to go back through novice and acolyte.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[High Priest]";
- mes "Ready to become a high acolyte?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[High Priest]";
- mes "God please bestow this enlightened soul with a drip of your mighty power.";
- next;
- jobchange 28;// Job: Job_Acolyte_High
- close;
-Lh2:
- mes "[High Priest]";
- mes "Your holy power grows stronger. Will you become a high priest?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[High Priest]";
- mes "God please bestow this enlightened soul with a drip of your mighty power.";
- jobchange 32;// Job: Job_High_Priest
- close;
-Lcrazy:
- mes "[High Priest]";
- mes "Nice day isn't it?";
- close;
-Lskpt:
- mes "[High Priest]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[High Priest]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//High Priest Made by Evera/Lorri
+valkyrie.gat,44,42,6 script High Priest 60,{
+ if ((readparam(11) >= 99) && (readparam(19) == 8) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4005) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4005) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4009) goto Lcrazy;
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[High Priest]";
+ mes "Hello";
+ mes "God bless you.";
+ close;
+Lnovice:
+ mes "[High Priest]";
+ mes "Hi! I'm a little different from you, have you noticed?";
+ mes "If you devote yourself entirely you can be just like me.";
+ mes "There is a catch though, you have to go back through novice and acolyte.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[High Priest]";
+ mes "Ready to become a high acolyte?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[High Priest]";
+ mes "God please bestow this enlightened soul with a drip of your mighty power.";
+ next;
+ jobchange 28;// Job: Job_Acolyte_High
+ close;
+Lh2:
+ mes "[High Priest]";
+ mes "Your holy power grows stronger. Will you become a high priest?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[High Priest]";
+ mes "God please bestow this enlightened soul with a drip of your mighty power.";
+ jobchange 32;// Job: Job_High_Priest
+ close;
+Lcrazy:
+ mes "[High Priest]";
+ mes "Nice day isn't it?";
+ close;
+Lskpt:
+ mes "[High Priest]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[High Priest]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1-1/HighWizard.txt b/npc/jobs/2-1-1/HighWizard.txt
index 1e747000c..356c287b4 100644
--- a/npc/jobs/2-1-1/HighWizard.txt
+++ b/npc/jobs/2-1-1/HighWizard.txt
@@ -1,60 +1,60 @@
-//High Wizard Made by Evera/Lorri
-valkyrie.gat,44,47,6 script High Wizard 735,{
- if ((readparam(11) >= 99) && (readparam(19) == 9) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4003) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4003) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4010) goto Lcrazy;
- if (readparam(12) != 0) goto Lskpt;
- mes "[High Wizard]";
- mes "Hello";
- mes "The magic surrounds you.";
- close;
-Lnovice:
- mes "[High Wizard]";
- mes "Hey you! It appears that your intelligence is very high. Would you like to become a high wizard like me?";
- mes "There is a catch though, you have to go back through novice and mage.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[High Wizard]";
- mes "Ready to become a high mage?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[High Wizard]";
- mes "The magic enchants and suppresses you.";
- next;
- jobchange 26;// Job: Job_Mage_High
- close;
-Lh2:
- mes "[High Wizard]";
- mes "The magic grows strong in you. You appear ready. Will you become a high wizard?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[High Wizard]";
- mes "The magic enchants and suppresses you.";
- jobchange 33;// Job: Job_High_Wizard
- close;
-Lcrazy:
- mes "[High Wizard]";
- mes "I cannot bestow you with more of my magic.";
- close;
-Lskpt:
- mes "[High Wizard]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[High Wizard]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//High Wizard Made by Evera/Lorri
+valkyrie.gat,44,47,6 script High Wizard 735,{
+ if ((readparam(11) >= 99) && (readparam(19) == 9) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4003) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4003) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4010) goto Lcrazy;
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[High Wizard]";
+ mes "Hello";
+ mes "The magic surrounds you.";
+ close;
+Lnovice:
+ mes "[High Wizard]";
+ mes "Hey you! It appears that your intelligence is very high. Would you like to become a high wizard like me?";
+ mes "There is a catch though, you have to go back through novice and mage.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[High Wizard]";
+ mes "Ready to become a high mage?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[High Wizard]";
+ mes "The magic enchants and suppresses you.";
+ next;
+ jobchange 26;// Job: Job_Mage_High
+ close;
+Lh2:
+ mes "[High Wizard]";
+ mes "The magic grows strong in you. You appear ready. Will you become a high wizard?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[High Wizard]";
+ mes "The magic enchants and suppresses you.";
+ jobchange 33;// Job: Job_High_Wizard
+ close;
+Lcrazy:
+ mes "[High Wizard]";
+ mes "I cannot bestow you with more of my magic.";
+ close;
+Lskpt:
+ mes "[High Wizard]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[High Wizard]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1-1/LordKnight.txt b/npc/jobs/2-1-1/LordKnight.txt
index 01791b798..705d55b52 100644
--- a/npc/jobs/2-1-1/LordKnight.txt
+++ b/npc/jobs/2-1-1/LordKnight.txt
@@ -1,62 +1,62 @@
-//Lord Knight Made by Evera/Lorri
-//Fixed by PoW
-valkyrie.gat,44,39,6 script Lord Knight 56,{
- if ((readparam(11) >= 99) && (readparam(19) == 7) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(11) >= 99) && (readparam(19) == 13) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lhsword;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4002) && (readparam(55) >= 40)) goto Lhkni;
- if ((readparam(19) == 4002) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4008) goto Lcrazy;
- if (readparam(12) != 0) goto Lskpt;
- mes "[Lord Knight]";
- mes "Hello";
- mes "It's a nice day, isnt it?";
- close;
-Lnovice:
- mes "[Lord Knight]";
- mes "The honor a knight carries is high, but there is something beyond that. The lord knight.";
- mes "You come back to become a High Swordsman, then become a Lord Knight.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lhsword:
- mes "[Lord Knight]";
- mes "Ready to become a high swordsman??";
- menu "Yes",Lhsword2,"No",Lcancel;
-Lhsword2:
- mes "[Lord Knight]";
- mes "By the vow of my sword, here is the one bestowed upon with the truthful heart";
- next;
- jobchange 25;// Job: Job_Swordman_High
- close;
-Lhkni:
- mes "[Lord Knight]";
- mes "The final step in a knight's quest for honor. Will you become a lord knight?";
- menu "Yes",Lhkni2,"No",Lcancel;
-Lhkni2:
- mes "[Lord Knight]";
- mes "By the vow of my sword, here is the one bestowed upon with the truthful heart";
- jobchange 31;// Job: Job_Lord_Knight
- close;
-Lcrazy:
- mes "[Lord Knight]";
- mes "Nice day isn't it?";
- close;
-Lskpt:
- mes "[Lord Knight]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Lord Knight]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Lord Knight Made by Evera/Lorri
+//Fixed by PoW
+valkyrie.gat,44,39,6 script Lord Knight 56,{
+ if ((readparam(11) >= 99) && (readparam(19) == 7) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(11) >= 99) && (readparam(19) == 13) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lhsword;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4002) && (readparam(55) >= 40)) goto Lhkni;
+ if ((readparam(19) == 4002) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4008) goto Lcrazy;
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[Lord Knight]";
+ mes "Hello";
+ mes "It's a nice day, isnt it?";
+ close;
+Lnovice:
+ mes "[Lord Knight]";
+ mes "The honor a knight carries is high, but there is something beyond that. The lord knight.";
+ mes "You come back to become a High Swordsman, then become a Lord Knight.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lhsword:
+ mes "[Lord Knight]";
+ mes "Ready to become a high swordsman??";
+ menu "Yes",Lhsword2,"No",Lcancel;
+Lhsword2:
+ mes "[Lord Knight]";
+ mes "By the vow of my sword, here is the one bestowed upon with the truthful heart";
+ next;
+ jobchange 25;// Job: Job_Swordman_High
+ close;
+Lhkni:
+ mes "[Lord Knight]";
+ mes "The final step in a knight's quest for honor. Will you become a lord knight?";
+ menu "Yes",Lhkni2,"No",Lcancel;
+Lhkni2:
+ mes "[Lord Knight]";
+ mes "By the vow of my sword, here is the one bestowed upon with the truthful heart";
+ jobchange 31;// Job: Job_Lord_Knight
+ close;
+Lcrazy:
+ mes "[Lord Knight]";
+ mes "Nice day isn't it?";
+ close;
+Lskpt:
+ mes "[Lord Knight]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Lord Knight]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1-1/Sniper.txt b/npc/jobs/2-1-1/Sniper.txt
index 91524c9a4..32468bfae 100644
--- a/npc/jobs/2-1-1/Sniper.txt
+++ b/npc/jobs/2-1-1/Sniper.txt
@@ -1,64 +1,64 @@
-//Sniper Made by Evera/Lorri
-valkyrie.gat,44,55,6 script Sniper 727,{
- if ((readparam(11) >= 99) && (Class == 11) && (JobLevel >= 50)) goto Lnovice;
- if ((Class == 4001) && (readparam(55) >= 10)) goto Lharcher;
- if ((Class == 4001) && (readparam(55) < 10)) goto LCem;
- if ((Class == 4004) && (readparam(55) >= 40)) goto Lhsni;
- if ((Class == 4004) && (readparam(55) < 40)) goto LCem;
- if (Class == 4012) goto Lcrazy;
- mes "[Sniper]";
- mes "Who are you?";
- mes "Only the archer class can become a Sniper...";
- mes "Meet all the requirements first.";
- close;
-Lnovice:
- mes "[Sniper]";
- mes "Now, here's the deal. I change you into a High Novice.";
- mes "You come back to become a Sniper, then become a sniper.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- if (readparam(12) != 0) goto Lskpt;
- mes "By the tip of my arrow.. The distance it moves...";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lharcher:
- mes "[Sniper]";
- mes "Wanna become a High Arhcer?";
- menu "Yes",Lhtheif2,"No",Lcancel;
-Lhtheif2:
- if (readparam(12) != 0) goto Lskpt;
- mes "[Sniper]";
- mes "By the tip of my arrow.. The distance it moves...";
- next;
- jobchange 27;// Job: Job_Archer_High
- close;
-Lhsni:
- mes "[Sniper]";
- mes "Ready to become a sniper, like me??";
- menu "Yes",Lhsni2,"No",Lcancel;
-Lhsni2:
- if (readparam(12) != 0) goto Lskpt;
- mes "[Sniper]";
- mes "By the tip of my arrow.. The distance it moves...";
- jobchange 35;// Job: Job_Sniper
- close;
-Lcrazy:
- mes "[Sniper]";
- mes "You're already a Sniper!";
- mes "How are you doing?";
- close;
-Lskpt:
- mes "[Sniper]";
- mes "Please finish up your skillpoints first";
- close;
-LCem:
- mes "[Sniper]";
- mes "Please train your arrows to move faster.";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Sniper Made by Evera/Lorri
+valkyrie.gat,44,55,6 script Sniper 727,{
+ if ((readparam(11) >= 99) && (Class == 11) && (JobLevel >= 50)) goto Lnovice;
+ if ((Class == 4001) && (readparam(55) >= 10)) goto Lharcher;
+ if ((Class == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((Class == 4004) && (readparam(55) >= 40)) goto Lhsni;
+ if ((Class == 4004) && (readparam(55) < 40)) goto LCem;
+ if (Class == 4012) goto Lcrazy;
+ mes "[Sniper]";
+ mes "Who are you?";
+ mes "Only the archer class can become a Sniper...";
+ mes "Meet all the requirements first.";
+ close;
+Lnovice:
+ mes "[Sniper]";
+ mes "Now, here's the deal. I change you into a High Novice.";
+ mes "You come back to become a Sniper, then become a sniper.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ if (readparam(12) != 0) goto Lskpt;
+ mes "By the tip of my arrow.. The distance it moves...";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lharcher:
+ mes "[Sniper]";
+ mes "Wanna become a High Arhcer?";
+ menu "Yes",Lhtheif2,"No",Lcancel;
+Lhtheif2:
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[Sniper]";
+ mes "By the tip of my arrow.. The distance it moves...";
+ next;
+ jobchange 27;// Job: Job_Archer_High
+ close;
+Lhsni:
+ mes "[Sniper]";
+ mes "Ready to become a sniper, like me??";
+ menu "Yes",Lhsni2,"No",Lcancel;
+Lhsni2:
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[Sniper]";
+ mes "By the tip of my arrow.. The distance it moves...";
+ jobchange 35;// Job: Job_Sniper
+ close;
+Lcrazy:
+ mes "[Sniper]";
+ mes "You're already a Sniper!";
+ mes "How are you doing?";
+ close;
+Lskpt:
+ mes "[Sniper]";
+ mes "Please finish up your skillpoints first";
+ close;
+LCem:
+ mes "[Sniper]";
+ mes "Please train your arrows to move faster.";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1-1/WhiteSmith.txt b/npc/jobs/2-1-1/WhiteSmith.txt
index d652ac93b..d65900f69 100644
--- a/npc/jobs/2-1-1/WhiteSmith.txt
+++ b/npc/jobs/2-1-1/WhiteSmith.txt
@@ -1,60 +1,60 @@
-//Whitesmith Made by Evera/Lorri
-valkyrie.gat,44,50,6 script Whitesmith 731,{
- if ((readparam(11) >= 99) && (readparam(19) == 10) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4006) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4006) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4010) goto Lcrazy;
- if (readparam(12) != 0) goto Lskpt;
- mes "[Whitesmith]";
- mes "Hello";
- mes "I am not currently available for forging, please ask another forger.";
- close;
-Lnovice:
- mes "[Whitesmith]";
- mes "Hm. You weild your hammer pretty good. You wanna become a whitesmith?";
- mes "There is a catch though, you have to go back through novice and merchant.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Whitesmith]";
- mes "Ready to become a high merchant?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Whitesmith]";
- mes "You're on your way to making upgraded items.";
- next;
- jobchange 29;// Job: Job_Merchant_High
- close;
-Lh2:
- mes "[Whitesmith]";
- mes "Hey, you've grown a lot. Will you become a whitesmith?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Whitesmith]";
- mes "The magic enchants and suppresses you.";
- jobchange 34;// Job: Job_Whitesmith
- close;
-Lcrazy:
- mes "[Whitesmith]";
- mes "Hm. You look like me.";
- close;
-Lskpt:
- mes "[Whitesmith]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Whitesmith]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Whitesmith Made by Evera/Lorri
+valkyrie.gat,44,50,6 script Whitesmith 731,{
+ if ((readparam(11) >= 99) && (readparam(19) == 10) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4006) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4006) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4010) goto Lcrazy;
+ if (readparam(12) != 0) goto Lskpt;
+ mes "[Whitesmith]";
+ mes "Hello";
+ mes "I am not currently available for forging, please ask another forger.";
+ close;
+Lnovice:
+ mes "[Whitesmith]";
+ mes "Hm. You weild your hammer pretty good. You wanna become a whitesmith?";
+ mes "There is a catch though, you have to go back through novice and merchant.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Whitesmith]";
+ mes "Ready to become a high merchant?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Whitesmith]";
+ mes "You're on your way to making upgraded items.";
+ next;
+ jobchange 29;// Job: Job_Merchant_High
+ close;
+Lh2:
+ mes "[Whitesmith]";
+ mes "Hey, you've grown a lot. Will you become a whitesmith?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Whitesmith]";
+ mes "The magic enchants and suppresses you.";
+ jobchange 34;// Job: Job_Whitesmith
+ close;
+Lcrazy:
+ mes "[Whitesmith]";
+ mes "Hm. You look like me.";
+ close;
+Lskpt:
+ mes "[Whitesmith]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Whitesmith]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-1/assassin.txt b/npc/jobs/2-1/assassin.txt
index e5665243c..7986cd91e 100644
--- a/npc/jobs/2-1/assassin.txt
+++ b/npc/jobs/2-1/assassin.txt
@@ -1,1918 +1,1918 @@
-//===== eAthena Script =======================================
-//= Assassin Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-
-//============================================================================//
-// Job Changer
-//****************************************************************************//
-
-in_moc_16.gat,19,33,4 script Guildsman 55,{
- if(Class==Job_Assassin) goto L_JobSin;
- mes "[Angry looking man]";
- if(Class==Job_Thief) goto L_Thief;
- if(callfunc("Is_Sword_Class")) goto L_JobSwo;
- if(callfunc("Is_Magic_Class")) goto L_JobMag;
- if(callfunc("Is_Bow_Class")) goto L_JobArch;
- if(callfunc("Is_Holy_Class")) goto L_JobAco;
- if(callfunc("Is_Merc_Class")) goto L_JobMerc;
- if(callfunc("Is_Thief_Class")) goto L_JobOther;
-
-L_JobNov:
- mes "....HEY Novice!!! GET out of here now!! I won't be held responsible if anything bad happens to you.......";
- emotion 0;
- close;
-L_JobSwo:
- mes "....What are you doing here???";
- emotion 1;
- 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 32;
- close;
-L_JobMag:
- mes "...What's a mage like you doing here? You should be paying more attention to your training.....";
- emotion 20;
- close;
-L_JobArch:
- mes "Uh.... you're one of those people with bows right? Sorry but there are no cute pets here for u to kill..........";
- emotion 4;
- next;
- mes "[Angry looking man]";
- mes "Wait...... You're not here to create trouble eh!!? ....LEAVE AT ONCE!!";
- emotion 0;
- close;
-L_JobAco:
- 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 20;
- close;
-L_JobMerc:
- mes ".... What the??? Do you have any idea where you are??...... GREEDY SCAMMERS like you are not welcome here!!";
- emotion 29;
- close;
-L_JobOther:
- mes ".... Hmm.... although you're not an Assassin or Thief... I have to say I like your sense of style.";
- close;
-L_JobSin:
- 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;
-
-L_Thief:
- 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 1;
- 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 18;
- 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 'Khai'^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 (skpoint > 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 21;
- 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;
- jobchange 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 1;
- 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 1;
- next;
- mes "[Assassin Kai]";
- mes "What's this?..... You failed the first test?";
- next;
- mes "[Assassin Kai]";
- mes "HAHAHAHAAHAHAHAHA!!!!";
- emotion 18;
- 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 18;
- next;
- mes "[Assassin Kai]";
- mes "Oh...sorry for laughing in your face like this.... but it's just too funny... hahahehehe....";
- emotion 18;
- 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 18;
- next;
- mes "[Nameless One]";
- mes ".....Hahaha.";
- next;
- mes "[Assasin Kai]";
- mes "HAHAHAHA!! Nameless One, you think its funny too?";
- emotion 18;
- 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 18;
- 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 23;
- 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 6;
- next;
- mes "[Assassin Kai]";
- mes "GET OUT! Get out of here right now!! You're not fit to become an Assassin!!!";
- emotion 32;
- 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 Rohda 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
-//****************************************************************************//
-
-// ----------------------------------------------------------------
-// Keeps the player from moving to far into the room.
-// This is to avoid cheaters who might try to take Bakardi's test first.
-in_moc_16.gat,19,144,1 script getbacker 139,8,0,{
- if(ASSIN_Q > 1) end;
- warp "in_moc_16.gat",19,142;
- addtimer 700, "Nameless One::OnTimer700";
- end;
-}
-
-// Namelss One ====================================================
-in_moc_16.gat,19,150,1 script Nameless One 139,{
-
-OnTimer700:
- 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 beome 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 'Khai', 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 32;
- 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";
- end;
-}
-
-// Job Change Monsters ======================>\\
-in_moc_16.gat,1,1,0 script SinTest2 -1,{
- 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..",10631,"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";
- 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";
- 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,{
- 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";
- announce ". . . 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 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 "Dante#End";
- disablenpc "Gail#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#2 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;}
-
+//===== eAthena Script =======================================
+//= Assassin Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+
+//============================================================================//
+// Job Changer
+//****************************************************************************//
+
+in_moc_16.gat,19,33,4 script Guildsman 55,{
+ if(Class==Job_Assassin) goto L_JobSin;
+ mes "[Angry looking man]";
+ if(Class==Job_Thief) goto L_Thief;
+ if(callfunc("Is_Sword_Class")) goto L_JobSwo;
+ if(callfunc("Is_Magic_Class")) goto L_JobMag;
+ if(callfunc("Is_Bow_Class")) goto L_JobArch;
+ if(callfunc("Is_Holy_Class")) goto L_JobAco;
+ if(callfunc("Is_Merc_Class")) goto L_JobMerc;
+ if(callfunc("Is_Thief_Class")) goto L_JobOther;
+
+L_JobNov:
+ mes "....HEY Novice!!! GET out of here now!! I won't be held responsible if anything bad happens to you.......";
+ emotion 0;
+ close;
+L_JobSwo:
+ mes "....What are you doing here???";
+ emotion 1;
+ 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 32;
+ close;
+L_JobMag:
+ mes "...What's a mage like you doing here? You should be paying more attention to your training.....";
+ emotion 20;
+ close;
+L_JobArch:
+ mes "Uh.... you're one of those people with bows right? Sorry but there are no cute pets here for u to kill..........";
+ emotion 4;
+ next;
+ mes "[Angry looking man]";
+ mes "Wait...... You're not here to create trouble eh!!? ....LEAVE AT ONCE!!";
+ emotion 0;
+ close;
+L_JobAco:
+ 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 20;
+ close;
+L_JobMerc:
+ mes ".... What the??? Do you have any idea where you are??...... GREEDY SCAMMERS like you are not welcome here!!";
+ emotion 29;
+ close;
+L_JobOther:
+ mes ".... Hmm.... although you're not an Assassin or Thief... I have to say I like your sense of style.";
+ close;
+L_JobSin:
+ 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;
+
+L_Thief:
+ 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 1;
+ 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 18;
+ 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 'Khai'^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 (skpoint > 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 21;
+ 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;
+ jobchange 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 1;
+ 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 1;
+ next;
+ mes "[Assassin Kai]";
+ mes "What's this?..... You failed the first test?";
+ next;
+ mes "[Assassin Kai]";
+ mes "HAHAHAHAAHAHAHAHA!!!!";
+ emotion 18;
+ 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 18;
+ next;
+ mes "[Assassin Kai]";
+ mes "Oh...sorry for laughing in your face like this.... but it's just too funny... hahahehehe....";
+ emotion 18;
+ 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 18;
+ next;
+ mes "[Nameless One]";
+ mes ".....Hahaha.";
+ next;
+ mes "[Assasin Kai]";
+ mes "HAHAHAHA!! Nameless One, you think its funny too?";
+ emotion 18;
+ 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 18;
+ 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 23;
+ 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 6;
+ next;
+ mes "[Assassin Kai]";
+ mes "GET OUT! Get out of here right now!! You're not fit to become an Assassin!!!";
+ emotion 32;
+ 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 Rohda 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
+//****************************************************************************//
+
+// ----------------------------------------------------------------
+// Keeps the player from moving to far into the room.
+// This is to avoid cheaters who might try to take Bakardi's test first.
+in_moc_16.gat,19,144,1 script getbacker 139,8,0,{
+ if(ASSIN_Q > 1) end;
+ warp "in_moc_16.gat",19,142;
+ addtimer 700, "Nameless One::OnTimer700";
+ end;
+}
+
+// Namelss One ====================================================
+in_moc_16.gat,19,150,1 script Nameless One 139,{
+
+OnTimer700:
+ 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 beome 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 'Khai', 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 32;
+ 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";
+ end;
+}
+
+// Job Change Monsters ======================>\\
+in_moc_16.gat,1,1,0 script SinTest2 -1,{
+ 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..",10631,"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";
+ 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";
+ 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,{
+ 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";
+ announce ". . . 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 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 "Dante#End";
+ disablenpc "Gail#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#2 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;}
+
diff --git a/npc/jobs/2-1/blacksmith.txt b/npc/jobs/2-1/blacksmith.txt
index bf718fb69..0f1b71eb4 100644
--- a/npc/jobs/2-1/blacksmith.txt
+++ b/npc/jobs/2-1/blacksmith.txt
@@ -1,1436 +1,1436 @@
-//===== 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: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== 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]
-==============================================================
-
-
-
-//<==================================================== Blacksmith Altiregen (Job changer)==================================================>\\
-geffen_in.gat,110,169,4 script Guildsman 731,{
-
- if (class == 5) 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 a art form!.";
- next;
- mes "[Blacksmith Altiregen]";
- mes "Those weapons, heh, can be sold for quite a profit as well.";
- next;
- mes "[Blacksmith Altiregen]";
- if (class == 0) goto L_Nov;
- if (callfunc("Is_Sword_Class")) goto L_Sword;
- if (callfunc("Is_Holy_Class")) goto L_Aco;
- if (callfunc("Is_Thief_Class")) goto L_Theif;
- if (callfunc("Is_Magic_Class")) goto L_Wiz;
- if (callfunc("Is_Bow_Class")) goto L_Arc;
- if (class == 10) goto L_Black;
- mes "Only Merchants can become Blacksmiths.";
- close;
-
-L_Nov:
- if(sex==0) mes "...Hello little lady! If you wish to be a blacksmith, you have to be a merchant first!";
- if(sex==1) mes "Hmmm, you look like you wish to be a blacksmith! Sorry, but only merchants can be blacksmiths!.";
- close;
-L_Sword:
- mes "Hello! Come here to order a sword? Sorry, but I have some paperwork to do, so I can't forge anything now.";
- close;
-L_Arc:
- mes "Hmmm, sorry, but we're not hiring anyone that isn't a merchent.";
- close;
-L_Wiz:
- mes "Interested in training? Our guild cannot assist magic users is such matters.";
- close;
-L_Aco:
- mes "Oh! A Holy one...! Do me a favor and bless the sword I'm crafting!";
- close;
-L_Theif:
- mes "Sorry, but this is more of a office, so there's nothing worth money. We CAN do knife forges though.";
- close;
-L_Black:
- mes "Hey! Been a while, running a errand for Christopher? I feel like my hammer is getting rusty after all this office work.";
- 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 Alberta^000000, says he's 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 1;
- next;
- mes "[Blacksmith Altiregen]";
- mes "Well, first things first..... The guildsman ^5533FFGeshupenschte in Alberta^000000, says he's 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 Alberta. See you then.";
- emotion 1;
- 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 in Morroc, go there 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 know its far away, but it's not in my power. Besides, you know the region well, right?";
- 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..... Get to Morroc and find her!";
- close;
- M_dontgo:
- mes "[Blacksmith Altiregen]";
- mes "What!? You're giving up!?!.........";
- emotion 1;
- 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 23;
- 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 6;
- close;
-
- L_NotDone:
- mes "Hmmm? Didn't you say you're going to Morroc?";
- mes "Sorry, but you gotta pass the test there.";
- 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 "Lo, 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;
- jobchange 10;
- 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 == 40) getitem 999,5;
- if(JBLVL == 50) getitem 999,10;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- emotion 21;
- 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 7;
- 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 32;
- close;
-}
-
-
-//<=============================================== Geshupenschte: 1st, 2nd, 3rd Test ===================================================>\\
-alberta_in.gat,174,22,4 script Geshupenschte 63,{
-
- if(Class==5) 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 18;
- 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 1;
- 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^000000";
- mes "2 Red Bloods";
- 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) < 1 || 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,1;
- 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;
- next;
-
- 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(1210) < 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 23;
- 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 7;
- 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 Geffen!";
- 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 23;
- 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 32;
- 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 Morroc or Geffen?";
- 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 20;
- 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 32;
- L_Wrong:
- mes "[Baisulitst]";
- mes "..... Hmm?.... What's this?..... This is not what I ordered.....";
- emotion 32;
- 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 20;
- next;
- mes "[Wickebine]";
- mes "The Geffen Blacksmith Guild and Geshupenschte are both CHRONICALLY LATE!";
- emotion 32;
- 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.";
-
- L_NoItem:
- mes "[Wickebine]";
- mes "Ung! You came all this way to deliver my item and you lost it??!!";
- emotion 6;
- close;
- L_Wrong:
- mes "[Wickebine]";
- mes "I think you're supposed to deliver this somewhere else.....";
- emotion 4;
- 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 20;
- 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 1;
- next;
- mes "[Tilpitz]";
- mes "Don't play bad jokes on people!";
- emotion 7;
- 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 4;
- 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 23;
- close;
- L_Wrong:
- mes "[Bismarck]";
- mes "I NEED AN ANTIDOTE DAMMIT!! Not this stuff ~ack~........";
- emotion 23;
- close;
- L_Done:
- mes "[Bismarck]";
- mes "Whew, thank you.";
- close;
-}
-
-
-
-//<===================================================== Mitehmaeeuh: Last Test ===================================================>\\
-morocc.gat,95,133,4 script BS Guildsman 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 19;
- 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 % ",-,"24 % ",sM_1e;
-
- 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 21;
- 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 0;
- next;
- mes "[Mitmayer]";
- mes "Well, good luck!!!!";
- 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: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== 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]
+==============================================================
+
+
+
+//<==================================================== Blacksmith Altiregen (Job changer)==================================================>\\
+geffen_in.gat,110,169,4 script Guildsman 731,{
+
+ if (class == 5) 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 a art form!.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Those weapons, heh, can be sold for quite a profit as well.";
+ next;
+ mes "[Blacksmith Altiregen]";
+ if (class == 0) goto L_Nov;
+ if (callfunc("Is_Sword_Class")) goto L_Sword;
+ if (callfunc("Is_Holy_Class")) goto L_Aco;
+ if (callfunc("Is_Thief_Class")) goto L_Theif;
+ if (callfunc("Is_Magic_Class")) goto L_Wiz;
+ if (callfunc("Is_Bow_Class")) goto L_Arc;
+ if (class == 10) goto L_Black;
+ mes "Only Merchants can become Blacksmiths.";
+ close;
+
+L_Nov:
+ if(sex==0) mes "...Hello little lady! If you wish to be a blacksmith, you have to be a merchant first!";
+ if(sex==1) mes "Hmmm, you look like you wish to be a blacksmith! Sorry, but only merchants can be blacksmiths!.";
+ close;
+L_Sword:
+ mes "Hello! Come here to order a sword? Sorry, but I have some paperwork to do, so I can't forge anything now.";
+ close;
+L_Arc:
+ mes "Hmmm, sorry, but we're not hiring anyone that isn't a merchent.";
+ close;
+L_Wiz:
+ mes "Interested in training? Our guild cannot assist magic users is such matters.";
+ close;
+L_Aco:
+ mes "Oh! A Holy one...! Do me a favor and bless the sword I'm crafting!";
+ close;
+L_Theif:
+ mes "Sorry, but this is more of a office, so there's nothing worth money. We CAN do knife forges though.";
+ close;
+L_Black:
+ mes "Hey! Been a while, running a errand for Christopher? I feel like my hammer is getting rusty after all this office work.";
+ 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 Alberta^000000, says he's 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 1;
+ next;
+ mes "[Blacksmith Altiregen]";
+ mes "Well, first things first..... The guildsman ^5533FFGeshupenschte in Alberta^000000, says he's 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 Alberta. See you then.";
+ emotion 1;
+ 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 in Morroc, go there 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 know its far away, but it's not in my power. Besides, you know the region well, right?";
+ 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..... Get to Morroc and find her!";
+ close;
+ M_dontgo:
+ mes "[Blacksmith Altiregen]";
+ mes "What!? You're giving up!?!.........";
+ emotion 1;
+ 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 23;
+ 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 6;
+ close;
+
+ L_NotDone:
+ mes "Hmmm? Didn't you say you're going to Morroc?";
+ mes "Sorry, but you gotta pass the test there.";
+ 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 "Lo, 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;
+ jobchange 10;
+ 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 == 40) getitem 999,5;
+ if(JBLVL == 50) getitem 999,10;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ emotion 21;
+ 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 7;
+ 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 32;
+ close;
+}
+
+
+//<=============================================== Geshupenschte: 1st, 2nd, 3rd Test ===================================================>\\
+alberta_in.gat,174,22,4 script Geshupenschte 63,{
+
+ if(Class==5) 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 18;
+ 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 1;
+ 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^000000";
+ mes "2 Red Bloods";
+ 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) < 1 || 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,1;
+ 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;
+ next;
+
+ 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(1210) < 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 23;
+ 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 7;
+ 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 Geffen!";
+ 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 23;
+ 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 32;
+ 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 Morroc or Geffen?";
+ 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 20;
+ 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 32;
+ L_Wrong:
+ mes "[Baisulitst]";
+ mes "..... Hmm?.... What's this?..... This is not what I ordered.....";
+ emotion 32;
+ 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 20;
+ next;
+ mes "[Wickebine]";
+ mes "The Geffen Blacksmith Guild and Geshupenschte are both CHRONICALLY LATE!";
+ emotion 32;
+ 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.";
+
+ L_NoItem:
+ mes "[Wickebine]";
+ mes "Ung! You came all this way to deliver my item and you lost it??!!";
+ emotion 6;
+ close;
+ L_Wrong:
+ mes "[Wickebine]";
+ mes "I think you're supposed to deliver this somewhere else.....";
+ emotion 4;
+ 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 20;
+ 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 1;
+ next;
+ mes "[Tilpitz]";
+ mes "Don't play bad jokes on people!";
+ emotion 7;
+ 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 4;
+ 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 23;
+ close;
+ L_Wrong:
+ mes "[Bismarck]";
+ mes "I NEED AN ANTIDOTE DAMMIT!! Not this stuff ~ack~........";
+ emotion 23;
+ close;
+ L_Done:
+ mes "[Bismarck]";
+ mes "Whew, thank you.";
+ close;
+}
+
+
+
+//<===================================================== Mitehmaeeuh: Last Test ===================================================>\\
+morocc.gat,95,133,4 script BS Guildsman 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 19;
+ 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 % ",-,"24 % ",sM_1e;
+
+ 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 21;
+ 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 0;
+ next;
+ mes "[Mitmayer]";
+ mes "Well, good luck!!!!";
+ close;
+}
diff --git a/npc/jobs/2-1/hunter.txt b/npc/jobs/2-1/hunter.txt
index cd284c1de..b49b98d3f 100644
--- a/npc/jobs/2-1/hunter.txt
+++ b/npc/jobs/2-1/hunter.txt
@@ -1,1250 +1,1250 @@
-//===== 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: =====================================
-//= 1.7
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Hunter Job Quest converted from aegis script
-//===== Additional Comments: =================================
-//= v1.0 Fully working.
-//= v1.1 Changed global variable names to unique ones.
-//= v1.2 - 1.3 Updates for eAthena +Knight2,Crusader2 fix
-//= v1.4 Rollback from the wrong Kashy's fix
-//= v1.5 Fixed items quest fork bug [Lupus]
-//= v1.6 Fixed items quest bug: added extra condition [Lupus]
-//= v1.7 Fixed skillpoints check bug [Lupus]
-//============================================================
-
-
-
-// Please add this warp to your warp/s script/s if it is not already there, or you can enable it here
-//in_hunter.gat,100,13,0 warp hnt_to_payfild10 1,2,pay_fild10,145,250
-
-
-//<================================ Guildsman: Warps you to guild =======================================>\\
-pay_fild10.gat,148,251,4 script Hunter Guildsman 98,{
- warp "in_hunter.gat",100,18;
- end;
-}
-
-
-//<====================================== Job Changer ========================================>\\
-in_hunter.gat,99,99,4 script Hunter Sharon 727,
-{
- if(Class==Job_Archer) goto L_Start;
- if(Class==Job_Hunter) goto L_Hunt;
- if(callfunc("Is_Bow_Class")) goto L_Other;
- if(callfunc("Is_Sword_Class")) goto L_Swo;
- if(callfunc("Is_Magic_Class")) goto L_Mage;
- if(callfunc("Is_Thief_Class")) goto L_Thf;
- if(callfunc("Is_Holy_Class")) goto L_Aco;
- if(callfunc("Is_Merc_Class")) goto L_Merc;
-
-L_Nov:
- mes "[Hunter Sharon]";
- mes "What's a novice like you doing here? Leave, we have nothing for you.";
- emotion 1;
- close;
-L_Swo:
- mes "[Hunter Sharon]";
- mes "A follower of the way of the blade! We have nothing for you here so please leave.";
- close;
-L_Mage:
- mes "[Hunter Sharon]";
- mes "Hello mage type person. If you have no business here, please leave,";
- close;
-L_Aco:
- mes "[Hunter Sharon]";
- mes "Good day, religious zealot! It's nice to meet you and all, but you have no buisiness here.";
- close;
-L_Merc:
- mes "[Hunter Sharon]";
- mes "Hey, how's buisiness? Perhaps if you want to sell something, go back to town.";
- close;
-L_Thf:
- mes "[Hunter Sharon]";
- mes "Eeep! There's nothing to steal here!! Leave us alone..... go rob an old lady or something......";
- emotion 23;
- close;
-L_Hunt:
- mes "[Hunter Sharon]";
- mes "What up! "+strcharinfo(0)+" Why did you come back? Falcon run away or something? Te hehe.";
- emotion 18;
- 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;
-L_Other:
- mes "[Hunter Sharon]";
- mes "What are YOU doing her? Did you come to do a little song and dance... ke.. keke....kekekeHahahahhaha!!!";
- emotion 18;
- close;
-
-
-L_Start:
- mes "[Hunter Sharon]";
- 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 5;
- 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 a 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 "[Hunter Sharon]";
- 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 21;
- next;
- mes "[Hunter Sharon]";
- mes "With your kind of additude and values, you should have no problems becoming a Hunter.";
- next;
- 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;
- 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 4;
- 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:
- mes "What you have to do next is go see ^5533FFMr. Demon Hunter^000000 over there to my left. He'll tell you about the second test.";
- next;
- mes "[Hunter Sharon]";
- mes "Good luck!";
- set HNTR_Q, 1;
- set HNTR_Q2, 0;
- close;
-
-L_Test3:
- mes "Hmmm? The guild master? Oh, he's out right now.";
- emotion 20;
- 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 21;
- 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";
- jobchange Job_HUNTER;
- emotion 21;
- 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 == 40) 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 20;
- 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 6;
- close;
- sM_ReStart:
- mes "[Hunter Sharon]";
- mes "..... That's just pathetic....... Have fun re-doing the ENTIRE TEST!";
- emotion 32;
- set HNTR_Q, 0;
- set HNTR_Q2, 0;
- close;
-}
-
-
-//<=========================== Demon Hunter: Second Test ===============================>\\
-in_hunter.gat,55,99,7 script Demon Hunter 732,
-{
- if(Class == Job_Archer) goto L_Arc;
- if(Class == 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 29;
- 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 0;
- 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 7;
- 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,5);
- if(HNTR_Q2 == 2) goto sL_2;
- if(HNTR_Q2 == 3) goto sL_3;
- if(HNTR_Q2 == 4) goto sL_4;
- if(HNTR_Q2 == 5) goto sL_5;
-
- sL_1:
- mes "[Demon Hunter]";
- mes "^5533FF20 Bill of Birds^000000 for arrow heads.";
- mes "^5533FF5 Skel-Bones^000000 used here and there.";
- mes "and ^5533FF20 green herbs^000000.";
- goto L_Cont;
- sL_2:
- mes "[Demon Hunter]";
- mes "^5533FF7 Venom Canine.";
- mes "20 Animal Skins.";
- mes "and 15 red herbs^000000.";
- goto L_Cont;
- sL_3:
- mes "[Demon Hunter]";
- mes "^5533FF3 Dokaebi Horns";
- mes "3 Pieces of Egg Shell.";
- mes "and 10 Feathers^000000.";
- goto L_Cont;
- sL_4:
- mes "[Demon Hunter]";
- mes "^5533FF20 Rainbow Shells";
- mes "20 Chrysalis";
- mes "9 Yellow Herbs^000000";
- goto L_Cont;
- sL_5:
- mes "[Demon Hunter]";
- mes "^5533FF20 Tooths of Bat.";
- mes "20 Sticky Mucus.";
- mes "and 5 Bears foot skin^000000";
-
- L_Cont:
- 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?";
- 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 32;
- warp "pay_fild10.gat", 133, 235;
- end;
-
-L_Check:
- mes "Yes?";
- next;
- if(HNTR_Q2 == 1) goto L_1;
- if(HNTR_Q2 == 2) goto L_2;
- if(HNTR_Q2 == 3) goto L_3;
- if(HNTR_Q2 == 4) goto L_4;
- if(HNTR_Q2 == 5) goto L_5;
-
- L_1:
- if(countitem(925)<20 || countitem(932)<5 || countitem(511)<20) goto sL_1;
- delitem 925, 20;
- delitem 932, 5;
- delitem 511, 20;
- goto L_End;
- L_2:
- if(countitem(937)<7 || countitem(919)<20 || countitem(507)<15) goto sL_2;
- delitem 937, 7;
- delitem 919, 20;
- delitem 507, 15;
- goto L_End;
- L_3:
- if(countitem(1021)<3 || countitem(7032)<3 || countitem(949)<10) goto sL_3;
- delitem 1021, 3;
- delitem 7032, 3;
- delitem 949, 10;
- goto L_End;
- L_4:
- if(countitem(1013)<20 || countitem(915)<20 || countitem(508)<9) goto sL_4;
- delitem 1013, 20;
- delitem 915, 20;
- delitem 508, 9;
- goto L_End;
- L_5:
- if(countitem(913)<20 || countitem(938)<20 || countitem(948)<5) goto sL_5;
- delitem 913, 20;
- delitem 938, 20;
- delitem 948, 5;
-
- L_End:
- 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 20;
- 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 59,
-{
- if(Class == Job_Archer) goto L_Archer;
- if(Class == 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 20;
- 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) callsub sF_GetArrows;
- mes "[Guild Master]";
- mes "Good luck, I'll send you to the test room now.";
- next;
- set HNTR_Q2, 1;
- 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;
- 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 21;
- 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";
- end;
-
-}
-
-
-// Ev_HntRm: Test room --------------------------------------------------------
-job_hunte.gat,1,1,1 script Ev_HntRm -1,{
-
- 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";
- 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;
- set HNTR_Q2, 2;
- end;
-
-}
-
-// Ev_HntRm2: Spawns the Decoy Monsters ----------------------------------------
-job_hunte.gat,1,1,1 script Ev_HntRm2 -1,{
-
- // 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";
- 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,10
-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: =====================================
+//= 1.7
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Hunter Job Quest converted from aegis script
+//===== Additional Comments: =================================
+//= v1.0 Fully working.
+//= v1.1 Changed global variable names to unique ones.
+//= v1.2 - 1.3 Updates for eAthena +Knight2,Crusader2 fix
+//= v1.4 Rollback from the wrong Kashy's fix
+//= v1.5 Fixed items quest fork bug [Lupus]
+//= v1.6 Fixed items quest bug: added extra condition [Lupus]
+//= v1.7 Fixed skillpoints check bug [Lupus]
+//============================================================
+
+
+
+// Please add this warp to your warp/s script/s if it is not already there, or you can enable it here
+//in_hunter.gat,100,13,0 warp hnt_to_payfild10 1,2,pay_fild10,145,250
+
+
+//<================================ Guildsman: Warps you to guild =======================================>\\
+pay_fild10.gat,148,251,4 script Hunter Guildsman 98,{
+ warp "in_hunter.gat",100,18;
+ end;
+}
+
+
+//<====================================== Job Changer ========================================>\\
+in_hunter.gat,99,99,4 script Hunter Sharon 727,
+{
+ if(Class==Job_Archer) goto L_Start;
+ if(Class==Job_Hunter) goto L_Hunt;
+ if(callfunc("Is_Bow_Class")) goto L_Other;
+ if(callfunc("Is_Sword_Class")) goto L_Swo;
+ if(callfunc("Is_Magic_Class")) goto L_Mage;
+ if(callfunc("Is_Thief_Class")) goto L_Thf;
+ if(callfunc("Is_Holy_Class")) goto L_Aco;
+ if(callfunc("Is_Merc_Class")) goto L_Merc;
+
+L_Nov:
+ mes "[Hunter Sharon]";
+ mes "What's a novice like you doing here? Leave, we have nothing for you.";
+ emotion 1;
+ close;
+L_Swo:
+ mes "[Hunter Sharon]";
+ mes "A follower of the way of the blade! We have nothing for you here so please leave.";
+ close;
+L_Mage:
+ mes "[Hunter Sharon]";
+ mes "Hello mage type person. If you have no business here, please leave,";
+ close;
+L_Aco:
+ mes "[Hunter Sharon]";
+ mes "Good day, religious zealot! It's nice to meet you and all, but you have no buisiness here.";
+ close;
+L_Merc:
+ mes "[Hunter Sharon]";
+ mes "Hey, how's buisiness? Perhaps if you want to sell something, go back to town.";
+ close;
+L_Thf:
+ mes "[Hunter Sharon]";
+ mes "Eeep! There's nothing to steal here!! Leave us alone..... go rob an old lady or something......";
+ emotion 23;
+ close;
+L_Hunt:
+ mes "[Hunter Sharon]";
+ mes "What up! "+strcharinfo(0)+" Why did you come back? Falcon run away or something? Te hehe.";
+ emotion 18;
+ 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;
+L_Other:
+ mes "[Hunter Sharon]";
+ mes "What are YOU doing her? Did you come to do a little song and dance... ke.. keke....kekekeHahahahhaha!!!";
+ emotion 18;
+ close;
+
+
+L_Start:
+ mes "[Hunter Sharon]";
+ 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 5;
+ 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 a 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 "[Hunter Sharon]";
+ 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 21;
+ next;
+ mes "[Hunter Sharon]";
+ mes "With your kind of additude and values, you should have no problems becoming a Hunter.";
+ next;
+ 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;
+ 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 4;
+ 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:
+ mes "What you have to do next is go see ^5533FFMr. Demon Hunter^000000 over there to my left. He'll tell you about the second test.";
+ next;
+ mes "[Hunter Sharon]";
+ mes "Good luck!";
+ set HNTR_Q, 1;
+ set HNTR_Q2, 0;
+ close;
+
+L_Test3:
+ mes "Hmmm? The guild master? Oh, he's out right now.";
+ emotion 20;
+ 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 21;
+ 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";
+ jobchange Job_HUNTER;
+ emotion 21;
+ 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 == 40) 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 20;
+ 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 6;
+ close;
+ sM_ReStart:
+ mes "[Hunter Sharon]";
+ mes "..... That's just pathetic....... Have fun re-doing the ENTIRE TEST!";
+ emotion 32;
+ set HNTR_Q, 0;
+ set HNTR_Q2, 0;
+ close;
+}
+
+
+//<=========================== Demon Hunter: Second Test ===============================>\\
+in_hunter.gat,55,99,7 script Demon Hunter 732,
+{
+ if(Class == Job_Archer) goto L_Arc;
+ if(Class == 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 29;
+ 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 0;
+ 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 7;
+ 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,5);
+ if(HNTR_Q2 == 2) goto sL_2;
+ if(HNTR_Q2 == 3) goto sL_3;
+ if(HNTR_Q2 == 4) goto sL_4;
+ if(HNTR_Q2 == 5) goto sL_5;
+
+ sL_1:
+ mes "[Demon Hunter]";
+ mes "^5533FF20 Bill of Birds^000000 for arrow heads.";
+ mes "^5533FF5 Skel-Bones^000000 used here and there.";
+ mes "and ^5533FF20 green herbs^000000.";
+ goto L_Cont;
+ sL_2:
+ mes "[Demon Hunter]";
+ mes "^5533FF7 Venom Canine.";
+ mes "20 Animal Skins.";
+ mes "and 15 red herbs^000000.";
+ goto L_Cont;
+ sL_3:
+ mes "[Demon Hunter]";
+ mes "^5533FF3 Dokaebi Horns";
+ mes "3 Pieces of Egg Shell.";
+ mes "and 10 Feathers^000000.";
+ goto L_Cont;
+ sL_4:
+ mes "[Demon Hunter]";
+ mes "^5533FF20 Rainbow Shells";
+ mes "20 Chrysalis";
+ mes "9 Yellow Herbs^000000";
+ goto L_Cont;
+ sL_5:
+ mes "[Demon Hunter]";
+ mes "^5533FF20 Tooths of Bat.";
+ mes "20 Sticky Mucus.";
+ mes "and 5 Bears foot skin^000000";
+
+ L_Cont:
+ 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?";
+ 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 32;
+ warp "pay_fild10.gat", 133, 235;
+ end;
+
+L_Check:
+ mes "Yes?";
+ next;
+ if(HNTR_Q2 == 1) goto L_1;
+ if(HNTR_Q2 == 2) goto L_2;
+ if(HNTR_Q2 == 3) goto L_3;
+ if(HNTR_Q2 == 4) goto L_4;
+ if(HNTR_Q2 == 5) goto L_5;
+
+ L_1:
+ if(countitem(925)<20 || countitem(932)<5 || countitem(511)<20) goto sL_1;
+ delitem 925, 20;
+ delitem 932, 5;
+ delitem 511, 20;
+ goto L_End;
+ L_2:
+ if(countitem(937)<7 || countitem(919)<20 || countitem(507)<15) goto sL_2;
+ delitem 937, 7;
+ delitem 919, 20;
+ delitem 507, 15;
+ goto L_End;
+ L_3:
+ if(countitem(1021)<3 || countitem(7032)<3 || countitem(949)<10) goto sL_3;
+ delitem 1021, 3;
+ delitem 7032, 3;
+ delitem 949, 10;
+ goto L_End;
+ L_4:
+ if(countitem(1013)<20 || countitem(915)<20 || countitem(508)<9) goto sL_4;
+ delitem 1013, 20;
+ delitem 915, 20;
+ delitem 508, 9;
+ goto L_End;
+ L_5:
+ if(countitem(913)<20 || countitem(938)<20 || countitem(948)<5) goto sL_5;
+ delitem 913, 20;
+ delitem 938, 20;
+ delitem 948, 5;
+
+ L_End:
+ 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 20;
+ 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 59,
+{
+ if(Class == Job_Archer) goto L_Archer;
+ if(Class == 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 20;
+ 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) callsub sF_GetArrows;
+ mes "[Guild Master]";
+ mes "Good luck, I'll send you to the test room now.";
+ next;
+ set HNTR_Q2, 1;
+ 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;
+ 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 21;
+ 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";
+ end;
+
+}
+
+
+// Ev_HntRm: Test room --------------------------------------------------------
+job_hunte.gat,1,1,1 script Ev_HntRm -1,{
+
+ 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";
+ 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;
+ set HNTR_Q2, 2;
+ end;
+
+}
+
+// Ev_HntRm2: Spawns the Decoy Monsters ----------------------------------------
+job_hunte.gat,1,1,1 script Ev_HntRm2 -1,{
+
+ // 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";
+ 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,10
+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 2eba470d5..8335316a7 100644
--- a/npc/jobs/2-1/knight.txt
+++ b/npc/jobs/2-1/knight.txt
@@ -1,1858 +1,1858 @@
-//===== eAthena Script =======================================
-//= Knight Job Quest
-//===== By: ==================================================
-//= PGRO TEAM (Aegis).
-//= Converted by kobra_k88
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== 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: =================================
-//=v1.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.
-//= v1.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.
-//= v1.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.
-//= v1.3 Rollback from the wrong Kashy's fix
-//============================================================
-
-
-
-//<------------------------------------------------------------------------------------ Chivalry Captain Herman------------------------------------------------------------------------------------------>\\
-prt_in.gat,88,101,3 script Chivalry Captain Herman 56,
-{
- if (Class == 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(Class != Job_Swordman) goto L_NotSwo;
-
- 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) goto L_NotLvl;
-
- 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;
-
- L_NotLvl:
- 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;
- L_NotSwo:
- if(Class == Job_Knight) goto sL_JobKni;
- if(Class == Job_Novice) goto sL_JobNov;
-
- sL_JobOther:
- mes "I'm sorry but only Swordsmen can become Knights.";
- close;
-
- sL_JobKni:
- mes "...(sighs)...what are you doing here WASTING my time?? GO FORTH!!, and continue protecting Rune Midgard my young Knight.";
- emotion 32;
- close;
-
- sL_JobNov:
- mes "Hahahaha!! You have no job experience what so ever and yet you stumble in here asking to be a knight. Hahahaha!!";
- emotion 18;
- 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;
-
- 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;
- JobChange Job_Knight;
- if(JBLVL == 40) 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 21;
- close;
-
- sL_SKpoint:
- mes "Please use up all of your skill points so that I can make you a Knight.";
- emotion 5;
- close;
-}
-
-
-//<--------------------------------------------------------------------------------- Sir Andrew Syloc (1st test) ------------------------------------------------------------------------------------------>\\
-prt_in.gat,75,107,4 script SIr Andrew Syloc 65,
-{
- mes "[Sir Andrew Syloc]";
- if (Class == Job_Knight) goto L_Knight;
- if (Class == Job_Novice) goto L_Novice;
- if (Class == Job_Swordman && KNIGHT_Q == 1) goto L_Test;
- if (Class == 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 4;
- 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 (class == Job_Knight) goto L_Knight;
- if (class == Job_Novice) goto L_Novice;
- if (class == Job_Swordman && KNIGHT_Q == 2) goto L_Test;
- if (class == 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(Class == Job_Knight) goto L_Knight;
- if(Class == Job_Novice) goto L_Novice;
- if(Class == Job_Swordman && KNIGHT_Q == 3) goto L_Test;
- if(Class == 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 9;
- 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";
- end;
-}
-
-// First Level ---------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl1 -1,
-{
- 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";
- end;
-}
-
-
-// Second Level ---------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl2 -1,
-{
- 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";
- end;
-
-}
-
-// Third Level ---------------------------------------------------------------
-job_knt.gat,1,1,1 script KntLvl3 -1,
-{
- 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 (class == Job_Knight) goto L_Knight;
- if (class == Job_Novice) goto L_Novice;
- if (class == Job_Swordman && KNIGHT_Q == 4) goto L_Test;
- if (class == Job_Swordman && KNIGHT_Q == 5) mes "Speak to the Chivalry Captain Herman about your next test.";
- if (class == 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 14;
- 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 14;
- 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 3;
- 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 6;
- 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 32;
- 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 18;
- 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 21;
- 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 (class == Job_Knight) goto L_Knight;
- if (class == Job_Swordman) goto L_Sword;
- if (class == 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";
- 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";
- 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,
-{
- 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 (class == Job_Knight) goto L_Knight;
- if (class == Job_Novice) goto L_Novice;
- if (class == Job_Swordman && KNIGHT_Q == 6) goto L_Test;
- if (class == Job_Swordman && KNIGHT_Q == 7) mes "Go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
- if (class == 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 18;
- 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;
-
+//===== eAthena Script =======================================
+//= Knight Job Quest
+//===== By: ==================================================
+//= PGRO TEAM (Aegis).
+//= Converted by kobra_k88
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== 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: =================================
+//=v1.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.
+//= v1.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.
+//= v1.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.
+//= v1.3 Rollback from the wrong Kashy's fix
+//============================================================
+
+
+
+//<------------------------------------------------------------------------------------ Chivalry Captain Herman------------------------------------------------------------------------------------------>\\
+prt_in.gat,88,101,3 script Chivalry Captain Herman 56,
+{
+ if (Class == 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(Class != Job_Swordman) goto L_NotSwo;
+
+ 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) goto L_NotLvl;
+
+ 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;
+
+ L_NotLvl:
+ 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;
+ L_NotSwo:
+ if(Class == Job_Knight) goto sL_JobKni;
+ if(Class == Job_Novice) goto sL_JobNov;
+
+ sL_JobOther:
+ mes "I'm sorry but only Swordsmen can become Knights.";
+ close;
+
+ sL_JobKni:
+ mes "...(sighs)...what are you doing here WASTING my time?? GO FORTH!!, and continue protecting Rune Midgard my young Knight.";
+ emotion 32;
+ close;
+
+ sL_JobNov:
+ mes "Hahahaha!! You have no job experience what so ever and yet you stumble in here asking to be a knight. Hahahaha!!";
+ emotion 18;
+ 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;
+
+ 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;
+ JobChange Job_Knight;
+ if(JBLVL == 40) 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 21;
+ close;
+
+ sL_SKpoint:
+ mes "Please use up all of your skill points so that I can make you a Knight.";
+ emotion 5;
+ close;
+}
+
+
+//<--------------------------------------------------------------------------------- Sir Andrew Syloc (1st test) ------------------------------------------------------------------------------------------>\\
+prt_in.gat,75,107,4 script SIr Andrew Syloc 65,
+{
+ mes "[Sir Andrew Syloc]";
+ if (Class == Job_Knight) goto L_Knight;
+ if (Class == Job_Novice) goto L_Novice;
+ if (Class == Job_Swordman && KNIGHT_Q == 1) goto L_Test;
+ if (Class == 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 4;
+ 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 (class == Job_Knight) goto L_Knight;
+ if (class == Job_Novice) goto L_Novice;
+ if (class == Job_Swordman && KNIGHT_Q == 2) goto L_Test;
+ if (class == 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(Class == Job_Knight) goto L_Knight;
+ if(Class == Job_Novice) goto L_Novice;
+ if(Class == Job_Swordman && KNIGHT_Q == 3) goto L_Test;
+ if(Class == 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 9;
+ 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";
+ end;
+}
+
+// First Level ---------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl1 -1,
+{
+ 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";
+ end;
+}
+
+
+// Second Level ---------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl2 -1,
+{
+ 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";
+ end;
+
+}
+
+// Third Level ---------------------------------------------------------------
+job_knt.gat,1,1,1 script KntLvl3 -1,
+{
+ 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 (class == Job_Knight) goto L_Knight;
+ if (class == Job_Novice) goto L_Novice;
+ if (class == Job_Swordman && KNIGHT_Q == 4) goto L_Test;
+ if (class == Job_Swordman && KNIGHT_Q == 5) mes "Speak to the Chivalry Captain Herman about your next test.";
+ if (class == 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 14;
+ 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 14;
+ 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 3;
+ 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 6;
+ 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 32;
+ 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 18;
+ 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 21;
+ 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 (class == Job_Knight) goto L_Knight;
+ if (class == Job_Swordman) goto L_Sword;
+ if (class == 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";
+ 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";
+ 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,
+{
+ 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 (class == Job_Knight) goto L_Knight;
+ if (class == Job_Novice) goto L_Novice;
+ if (class == Job_Swordman && KNIGHT_Q == 6) goto L_Test;
+ if (class == Job_Swordman && KNIGHT_Q == 7) mes "Go to Chivalry Captain Herman and allow him to bestow upon you the great honor of Knighthood.";
+ if (class == 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 18;
+ 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;
+
} \ No newline at end of file
diff --git a/npc/jobs/2-1/priest.txt b/npc/jobs/2-1/priest.txt
index 53a3841db..cb9bbe68b 100644
--- a/npc/jobs/2-1/priest.txt
+++ b/npc/jobs/2-1/priest.txt
@@ -1,1430 +1,1430 @@
-//===== eAthena Script =======================================
-//= Priest Quest
-//===== By: ==================================================
-//= Translated By: Pgro Team (OwNaGe)(Aegis)
-//= Converted by: kobra_k88.
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 1.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.
-//= v1.1 Rollback from the wrong Kashy's fix
-==========================================================
-
-
-
-
-
-//*********************************************************************************************************************************************************************************\\
-//============================================ Father Thomas: Job changer, Test 1 =============================================\\
-//*********************************************************************************************************************************************************************************\\
-prt_church.gat,16,41,4 script Father Thomas 60,
-{
- mes "[Father Thomas]";
- if (class == Job_Novice) goto L_Novice;
- if (class == Job_Priest) goto L_Priest;
- if (class == Job_Acolyte) goto L_Start;
-
-L_Other:
- 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_Novice:
- mes "May God bless you, child. This is the Prontera Church. What are you here for?";
- next;
- menu "I want to become an acolyote.",M_0a, "I want to become a ^5533FFPriest^000000.",M_0b, "Iam just walking around.",M_0End;
-
- M_0a:
- mes "[Father Thomas]";
- mes "Haha.. so you want to become an Acolyote eh? To apply to become an Acolyote, 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 Acolyote. To become an Acolyote, 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;
-
-L_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.",M_1a, "I am here to help the Acolytes.",M_1b, "Life is really hard... I was wondering if you could help.",M_1End;
-
- M_1a:
- mes "[Father Thomas]";
- mes "Oh, well I am 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 5;
- 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.",sM_1a, "I will come back later.",sM_1End;
-
- sM_1a:
- if (countitem(2608) < 1) goto sL_NoRosary;
- mes "[Father Thomas]";
- 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;
-
- sL_NoRosary:
- mes "[Father Thomas]";
- 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;
- 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;
-
-
-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 am Father Thomas. I am 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 Preist.";
- 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 am 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 am amazed at your dedication and hard work!";
- emotion 0;
- 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 am 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 1;
- 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 21;
- next;
- mes "[Father Thomas]";
- mes "God, please endow "+strcharinfo(0)+" with the strength and courage to fight evil and help mankind.";
- next;
- jobchange 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 == 40) 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 1;
- 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 21;
- 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 4;
- 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 1;
- 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 1;
- 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 quiet 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.";
- next;
-
- L_Cont:
- 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";
- end;
-}
-
-
-//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
-// Test 2, Part 1: Kill the Zombies \\
-//********************************************************************************************************************************\\
-job_prist.gat,1,1,1 script PrstTest2_1 -1,{
- 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(class == 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(class == 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, iam 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, Iam 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.. Iam 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;
- //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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;
- //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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:
- //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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(class == 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, iam 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(class == 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 "Iam 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, iam 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(class == 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(class == 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(class == 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(Class == Job_Priest) goto L_Prst;
- if(Class == Job_Acolyte) goto L_Aco;
- if(Class == 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.",-, "Iam 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.",-, "Iam 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, Iam 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 theif.";
- 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;
-}
+//===== eAthena Script =======================================
+//= Priest Quest
+//===== By: ==================================================
+//= Translated By: Pgro Team (OwNaGe)(Aegis)
+//= Converted by: kobra_k88.
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 1.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.
+//= v1.1 Rollback from the wrong Kashy's fix
+==========================================================
+
+
+
+
+
+//*********************************************************************************************************************************************************************************\\
+//============================================ Father Thomas: Job changer, Test 1 =============================================\\
+//*********************************************************************************************************************************************************************************\\
+prt_church.gat,16,41,4 script Father Thomas 60,
+{
+ mes "[Father Thomas]";
+ if (class == Job_Novice) goto L_Novice;
+ if (class == Job_Priest) goto L_Priest;
+ if (class == Job_Acolyte) goto L_Start;
+
+L_Other:
+ 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_Novice:
+ mes "May God bless you, child. This is the Prontera Church. What are you here for?";
+ next;
+ menu "I want to become an acolyote.",M_0a, "I want to become a ^5533FFPriest^000000.",M_0b, "Iam just walking around.",M_0End;
+
+ M_0a:
+ mes "[Father Thomas]";
+ mes "Haha.. so you want to become an Acolyote eh? To apply to become an Acolyote, 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 Acolyote. To become an Acolyote, 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;
+
+L_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.",M_1a, "I am here to help the Acolytes.",M_1b, "Life is really hard... I was wondering if you could help.",M_1End;
+
+ M_1a:
+ mes "[Father Thomas]";
+ mes "Oh, well I am 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 5;
+ 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.",sM_1a, "I will come back later.",sM_1End;
+
+ sM_1a:
+ if (countitem(2608) < 1) goto sL_NoRosary;
+ mes "[Father Thomas]";
+ 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;
+
+ sL_NoRosary:
+ mes "[Father Thomas]";
+ 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;
+ 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;
+
+
+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 am Father Thomas. I am 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 Preist.";
+ 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 am 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 am amazed at your dedication and hard work!";
+ emotion 0;
+ 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 am 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 1;
+ 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 21;
+ next;
+ mes "[Father Thomas]";
+ mes "God, please endow "+strcharinfo(0)+" with the strength and courage to fight evil and help mankind.";
+ next;
+ jobchange 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 == 40) 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 1;
+ 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 21;
+ 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 4;
+ 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 1;
+ 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 1;
+ 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 quiet 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.";
+ next;
+
+ L_Cont:
+ 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";
+ end;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------------------------------------------\\
+// Test 2, Part 1: Kill the Zombies \\
+//********************************************************************************************************************************\\
+job_prist.gat,1,1,1 script PrstTest2_1 -1,{
+ 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(class == 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(class == 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, iam 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, Iam 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.. Iam 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;
+ //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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;
+ //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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:
+ //showimage "¹Ì½ºÆ®·¹½ºÄ«µå.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(class == 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, iam 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(class == 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 "Iam 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, iam 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(class == 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(class == 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(class == 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(Class == Job_Priest) goto L_Prst;
+ if(Class == Job_Acolyte) goto L_Aco;
+ if(Class == 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.",-, "Iam 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.",-, "Iam 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, Iam 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 theif.";
+ 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;
+}
diff --git a/npc/jobs/2-1/wizard.txt b/npc/jobs/2-1/wizard.txt
index 2a77c10ee..d899a8ba4 100644
--- a/npc/jobs/2-1/wizard.txt
+++ b/npc/jobs/2-1/wizard.txt
@@ -1,1446 +1,1446 @@
-//===== eAthena Script =======================================
-//= Wizard Job Quest
-//===== By: ==================================================
-//= ?? (Aegis)
-//= Translated by yoshiki
-//= converted by kobra_k88
-//= Further bugfixed and tested by Lupus
-//===== Current Version: =====================================
-//= 1.3a
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Wizard job quest converted from aegis script, plus my own RO screenies.
-//===== Additional Comments: =================================
-//= v1.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.
-//= v1.2 Changed global variable names to unique ones.
-//= v1.3 Rollback from the wrong Kashy's fix
-//= v1.3a Fixed issue with duplicating monsters thx to Bison.[kobra_k88]
-//============================================================
-
-
-
-//<=================== Some dog =========================>
-gef_tower.gat,107,35,5 script Some Dog 81,
-{
- if(Class == Job_Mage) goto L_JobMage;
- if(callfunc("Is_Magic_Class")) goto L_Magic;
- if(callfunc("Is_Holy_Class")) goto L_Holy;
-L_Other:
- mes "[Dog]";
- 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 32;
- next;
- mes "[Dog]";
- mes "~WOOF~ Get lost! I don't have time for people like you!!";
- emotion 27;
- close;
-L_Holy:
- mes "[Dog]";
- 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;
-L_Magic:
- mes "[Dog]";
- 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;
-
-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 1;
- 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 6;
- 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 20;
- 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 6;
- next;
- mes "[Maria]";
- mes "Dang it! I hope you FAIL!! Now go get lost!";
- emotion 27;
- 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 32;
- next;
- goto L_Cont;
-
-}
-
-
-//<=========================================== Registrar and Examiner Catherine Medichi ==============================================>\\
-gef_tower.gat,111,37,4 script Catherine Medichi 68,
-{
- mes "[Catherine Medichi]";
- if(Class == Job_Wizard) goto L_Wizard;
- if(Class == Job_Novice) goto L_Novice;
- if(Class == Job_Mage) goto L_Mage;
-L_Other:
- 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_Novice:
- mes "Awwww, a little novice! How cute! This place is for Wizards only though.";
- emotion 14;
- next;
- mes "[Catherine Medichi]";
- mes "If you're interested in magic, the ^0000FFMagician's Guild^000000 is the place for you.";
- close;
-L_Wizard:
- mes "What do you need fellow Wizard? If it's nothing, please leave...";
- next;
- mes "[Catherine Medichi]";
- if(sex==1) mes "... Of course, if your here to ask me out... (*giggles*)....";
- if(sex==0) mes "If you get yourself a boyfriend, feel free to drop by and show him off. XD";
- emotion 3;
- 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 1;
- 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 21;
- 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 1;
- next;
- mes "[Catherine Medichi]";
- mes "You want to be a wizard and you can't answer a couple of questions?? Sheesh.";
- emotion 4;
- 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 21;
- next;
- mes "[Catherine Medichi]";
- mes "Ack, I'm wasting time, I better change you!";
- next;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- JobChange Job_Wizard;
-
- 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(Class == Job_Mage) goto L_Mage;
- if(Class == Job_Wizard) goto L_Wizard;
- if(callfunc("Is_Holy_Class")) goto L_Holy;
- if(Class == 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 0;
- close;
-L_Novice:
- mes "What's a little kid like you doing here? Get out!!";
- emotion 0;
- 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 21;
- 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 32;
- 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 29;
- 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. What ISN'T required for 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. What happens to a monster's element after it's frozen by Frost Diver?";
- next;
- menu "Changes to Water",sM0_1a, "Changes to Earth",sM0_1b, "Changes to Fire",sM0_1b, "Changes to Wind",sM0_1b;
-
- sM0_1a:
- set @SCORE, @SCORE + 10;
-
- sM0_1b:
-
- mes "[Raul Expagarus]";
- mes "3. When you max out Napalm Beat, how many times matk will the dmg be?";
- next;
- menu "1.6x",sM0_2b, "1.7x",sM0_2a, "2x",sM0_2b, "20x",sM0_2b;
-
- sM0_2a:
- set @SCORE, @SCORE + 10;
-
- sM0_2b:
-
- mes "[Raul Expagarus]";
- mes "4. What item is required for stone curse?";
- next;
- menu "Red Blood",sM0_3b, "Blue Gem",sM0_3b, "Yellow Gem",sM0_3b, "Red Gem",sM0_3a;
-
- sM0_3a:
- set @SCORE, @SCORE + 10;
-
- sM0_3b:
-
- mes "[Raul Expagarus]";
- mes "5. What isn't required for Safety Wall?";
- next;
- menu "Napalm Beat Lv 4",sM0_4b, "Soul Strike Lv 5",sM0_4b, "SP Recovery Lv. 6",sM0_4b, "Ice Wall Lv 7",sM0_4a;
-
- sM0_4a:
- set @SCORE, @SCORE + 10;
-
- sM0_4b:
-
- mes "[Raul Expagarus]";
- mes "6. How much SP will you regain every 10 sec with lvl 7 SP Rec.?";
- 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. You have 50% SP, how much dmg will Energy Coat reduce and how much sp will it use?";
- next;
- menu "dmg 18%, SP1.5%",sM0_6b, "dmg18%, SP2%",sM0_6a, "dmg 24%, SP1.5%",sM0_6b, "dmg 24%, SP2%",sM0_6b;
-
- sM0_6a:
- set @SCORE, @SCORE + 10;
-
- sM0_6b:
-
- mes "[Raul Expagarus]";
- mes "8. Lvl 6 Safety Wall sp consumtion, and number of hits absorbed?";
- next;
- menu "SP 40, 6hits",sM0_7b, "SP 35, 6hits",sM0_7b, "SP 40, 7hits",sM0_7a, "SP 35, 7hits",sM0_7b;
-
- sM0_7a:
- set @SCORE, @SCORE + 10;
-
- sM0_7b:
-
- mes "[Raul Expagarus]";
- mes "9. Lv. 10 Thunder Storm's Sp Consume";
- 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. What would be a good skill to use in 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. What drops a slot guard?";
- next;
- menu "Thief Bug",sM1_0b, "Peco Peco",sM1_0b, "Pupa",sM1_0a, "Mace Kobold",sM1_0b;
-
- sM1_0a:
- set @SCORE, @SCORE + 10;
-
- sM1_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Which monster is the easiest for magicians?";
- 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. What monster is completly immune to Stone Curse?";
- next;
- menu "Elder Willow",sM1_2b, "Evil Druid",sM1_2a, "Baek-Ryuhn-Oak",sM1_2b, "Marc",sM1_2b;
-
- sM1_2a:
- set @SCORE, @SCORE + 10;
-
- sM1_2b:
-:
- mes "[Raul Expagarus]";
- mes "4. How much dmg do you do with a wind spell to a Water 3 monster?";
- 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. Baby Desert Wolves vs Familiar, which one wins?";
- next;
- menu "Baby Desert Wolf",sM1_4a, "Farmiliar",sM1_4b, "Tie",sM1_4b, "Don't Know",sM1_4b;
-
- sM1_4a:
- set @SCORE, @SCORE + 10;
-
- sM1_4b:
-
- mes "[Raul Expagarus]";
- mes "6. Which monster can't be tamed as a 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. Which monster is weak against fire?.";
- next;
- menu "Knife Goblin",sM1_6b, "Mace Goblin",sM1_6b, "Flail Goblin",sM1_6b, "Hammer Goblin",sM1_6a;
-
- sM1_6a:
- set @SCORE, @SCORE + 10;
-
- sM1_6b:
-
- mes "[Raul Expagarus]";
- mes "8. Which monster has the highest magic def?";
- next;
- menu "Horong",sM1_7b, "ChonChon",sM1_7b, "Andre",sM1_7b, "Caramel",sM1_7a;
-
- sM1_7a:
- set @SCORE, @SCORE + 10;
-
- sM1_7b:
-
- mes "[Raul Expagarus]";
- mes "9. Pick the monster that doesn't belong.";
- next;
- menu "Poring",sM1_8b, "Mastering",sM1_8b, "Ghostring",sM1_8b, "Spore",sM1_8a;
-
- sM1_8a:
- set @SCORE, @SCORE + 10;
-
- sM1_8b:
-
- mes "[Raul Expagarus]";
- mes "10. Which is not a undead?";
- 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. What is the most important stat for a Wizard?";
- 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 element doesn't have a bolt spell?";
- 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. What is NOT a characteristic of a Wizard?";
- next;
- menu "Weak physical abilites",sM2_2b, "Distance Attacks",sM2_2b, "Good money maker",sM2_2a, "High Magic Def",sM2_2b;
-
- sM2_2a:
- set @SCORE, @SCORE + 10;
-
- sM2_2b:
-
- mes "[Raul Expagarus]";
- mes "4. Which town is the home of Wizards?";
- 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 card has nothing to do with INT?";
- next;
- menu "Andre 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 superior about the mage class compared to others?";
- next;
- menu "Close Range Combat",sM2_5b, "High Dodge",sM2_5b, "Dance Skills",sM2_5b, "Magical Power",sM2_5a;
-
- sM2_5a:
- set @SCORE, @SCORE + 10;
-
- sM2_5b:
-
- mes "[Raul Expagarus]";
- mes "7. What is the INT bonus at job lvl 40?";
- 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 equiped by mages?";
- next;
- menu "Knife",sM2_7b, "Cap",sM2_7a, "Sandel",sM2_7b, "Eye of Dullahan",sM2_7b;
-
- sM2_7a:
- set @SCORE, @SCORE + 10;
-
- sM2_7b:
-
- mes "[Raul Expagarus]";
- mes "9. During the mage test, which stone is NOT one of the Catalysts?";
- next;
- menu "Yellow Gemstone",sM2_8b, "Red Gemstone",sM2_8b, "Blue Gemstone",sM2_8b, "Red Blood",sM2_8a;
-
- sM2_8a:
- set @SCORE, @SCORE + 10;
-
- sM2_8b:
-
- mes "[Raul Expagarus]";
- mes "10. Which card has nothing to do with magic?";
- next;
- menu "Marduk Card",sM2_9b, "Baek-Rhyun-Oak 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 23;
- 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 1;
- 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. Which monster doesn't exist?";
- next;
- menu "Mantis",sM_0b, "Cunner Tooth",sM_0a, "Giearth",sM_0b, "Caramel",sM_0b;
-
- sM_0a:
- set @SCORE, @SCORE + 20;
-
- sM_0b:
-
- mes "[Raul Expagarus]";
- mes "2. Which monster is NOT a animal type?";
- next;
- menu "Yoyo",sM_1b, "Bigfoot",sM_1b, "Metaller",sM_1b, "Zerom",sM_1a;
-
- sM_1a:
- set @SCORE, @SCORE + 20;
-
- sM_1b:
-
- mes "[Raul Expagarus]";
- mes "3. Which monster has no cast sense?";
- 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. What's a good spell to use on Marin Spheres?";
- 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. Which monster can 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";
- end;
-}
-
-// Room of Water -----------------------------------------------------------------------------
-job_wiz.gat,1,1,1 script WaterRm -1,
-{
- 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,
-{
- 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,
-{
- set $@WzRm, 3;
- set $@WzMOB, 8;
- 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";
- monster "job_wiz.gat",54,89,"Desert Wolf",1106,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";
- 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";
- 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
+//===== eAthena Script =======================================
+//= Wizard Job Quest
+//===== By: ==================================================
+//= ?? (Aegis)
+//= Translated by yoshiki
+//= converted by kobra_k88
+//= Further bugfixed and tested by Lupus
+//===== Current Version: =====================================
+//= 1.3a
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Wizard job quest converted from aegis script, plus my own RO screenies.
+//===== Additional Comments: =================================
+//= v1.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.
+//= v1.2 Changed global variable names to unique ones.
+//= v1.3 Rollback from the wrong Kashy's fix
+//= v1.3a Fixed issue with duplicating monsters thx to Bison.[kobra_k88]
+//============================================================
+
+
+
+//<=================== Some dog =========================>
+gef_tower.gat,107,35,5 script Some Dog 81,
+{
+ if(Class == Job_Mage) goto L_JobMage;
+ if(callfunc("Is_Magic_Class")) goto L_Magic;
+ if(callfunc("Is_Holy_Class")) goto L_Holy;
+L_Other:
+ mes "[Dog]";
+ 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 32;
+ next;
+ mes "[Dog]";
+ mes "~WOOF~ Get lost! I don't have time for people like you!!";
+ emotion 27;
+ close;
+L_Holy:
+ mes "[Dog]";
+ 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;
+L_Magic:
+ mes "[Dog]";
+ 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;
+
+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 1;
+ 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 6;
+ 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 20;
+ 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 6;
+ next;
+ mes "[Maria]";
+ mes "Dang it! I hope you FAIL!! Now go get lost!";
+ emotion 27;
+ 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 32;
+ next;
+ goto L_Cont;
+
+}
+
+
+//<=========================================== Registrar and Examiner Catherine Medichi ==============================================>\\
+gef_tower.gat,111,37,4 script Catherine Medichi 68,
+{
+ mes "[Catherine Medichi]";
+ if(Class == Job_Wizard) goto L_Wizard;
+ if(Class == Job_Novice) goto L_Novice;
+ if(Class == Job_Mage) goto L_Mage;
+L_Other:
+ 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_Novice:
+ mes "Awwww, a little novice! How cute! This place is for Wizards only though.";
+ emotion 14;
+ next;
+ mes "[Catherine Medichi]";
+ mes "If you're interested in magic, the ^0000FFMagician's Guild^000000 is the place for you.";
+ close;
+L_Wizard:
+ mes "What do you need fellow Wizard? If it's nothing, please leave...";
+ next;
+ mes "[Catherine Medichi]";
+ if(sex==1) mes "... Of course, if your here to ask me out... (*giggles*)....";
+ if(sex==0) mes "If you get yourself a boyfriend, feel free to drop by and show him off. XD";
+ emotion 3;
+ 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 1;
+ 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 21;
+ 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 1;
+ next;
+ mes "[Catherine Medichi]";
+ mes "You want to be a wizard and you can't answer a couple of questions?? Sheesh.";
+ emotion 4;
+ 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 21;
+ next;
+ mes "[Catherine Medichi]";
+ mes "Ack, I'm wasting time, I better change you!";
+ next;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ JobChange Job_Wizard;
+
+ 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(Class == Job_Mage) goto L_Mage;
+ if(Class == Job_Wizard) goto L_Wizard;
+ if(callfunc("Is_Holy_Class")) goto L_Holy;
+ if(Class == 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 0;
+ close;
+L_Novice:
+ mes "What's a little kid like you doing here? Get out!!";
+ emotion 0;
+ 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 21;
+ 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 32;
+ 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 29;
+ 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. What ISN'T required for 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. What happens to a monster's element after it's frozen by Frost Diver?";
+ next;
+ menu "Changes to Water",sM0_1a, "Changes to Earth",sM0_1b, "Changes to Fire",sM0_1b, "Changes to Wind",sM0_1b;
+
+ sM0_1a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. When you max out Napalm Beat, how many times matk will the dmg be?";
+ next;
+ menu "1.6x",sM0_2b, "1.7x",sM0_2a, "2x",sM0_2b, "20x",sM0_2b;
+
+ sM0_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. What item is required for stone curse?";
+ next;
+ menu "Red Blood",sM0_3b, "Blue Gem",sM0_3b, "Yellow Gem",sM0_3b, "Red Gem",sM0_3a;
+
+ sM0_3a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_3b:
+
+ mes "[Raul Expagarus]";
+ mes "5. What isn't required for Safety Wall?";
+ next;
+ menu "Napalm Beat Lv 4",sM0_4b, "Soul Strike Lv 5",sM0_4b, "SP Recovery Lv. 6",sM0_4b, "Ice Wall Lv 7",sM0_4a;
+
+ sM0_4a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_4b:
+
+ mes "[Raul Expagarus]";
+ mes "6. How much SP will you regain every 10 sec with lvl 7 SP Rec.?";
+ 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. You have 50% SP, how much dmg will Energy Coat reduce and how much sp will it use?";
+ next;
+ menu "dmg 18%, SP1.5%",sM0_6b, "dmg18%, SP2%",sM0_6a, "dmg 24%, SP1.5%",sM0_6b, "dmg 24%, SP2%",sM0_6b;
+
+ sM0_6a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_6b:
+
+ mes "[Raul Expagarus]";
+ mes "8. Lvl 6 Safety Wall sp consumtion, and number of hits absorbed?";
+ next;
+ menu "SP 40, 6hits",sM0_7b, "SP 35, 6hits",sM0_7b, "SP 40, 7hits",sM0_7a, "SP 35, 7hits",sM0_7b;
+
+ sM0_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM0_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. Lv. 10 Thunder Storm's Sp Consume";
+ 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. What would be a good skill to use in 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. What drops a slot guard?";
+ next;
+ menu "Thief Bug",sM1_0b, "Peco Peco",sM1_0b, "Pupa",sM1_0a, "Mace Kobold",sM1_0b;
+
+ sM1_0a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Which monster is the easiest for magicians?";
+ 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. What monster is completly immune to Stone Curse?";
+ next;
+ menu "Elder Willow",sM1_2b, "Evil Druid",sM1_2a, "Baek-Ryuhn-Oak",sM1_2b, "Marc",sM1_2b;
+
+ sM1_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_2b:
+:
+ mes "[Raul Expagarus]";
+ mes "4. How much dmg do you do with a wind spell to a Water 3 monster?";
+ 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. Baby Desert Wolves vs Familiar, which one wins?";
+ next;
+ menu "Baby Desert Wolf",sM1_4a, "Farmiliar",sM1_4b, "Tie",sM1_4b, "Don't Know",sM1_4b;
+
+ sM1_4a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_4b:
+
+ mes "[Raul Expagarus]";
+ mes "6. Which monster can't be tamed as a 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. Which monster is weak against fire?.";
+ next;
+ menu "Knife Goblin",sM1_6b, "Mace Goblin",sM1_6b, "Flail Goblin",sM1_6b, "Hammer Goblin",sM1_6a;
+
+ sM1_6a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_6b:
+
+ mes "[Raul Expagarus]";
+ mes "8. Which monster has the highest magic def?";
+ next;
+ menu "Horong",sM1_7b, "ChonChon",sM1_7b, "Andre",sM1_7b, "Caramel",sM1_7a;
+
+ sM1_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. Pick the monster that doesn't belong.";
+ next;
+ menu "Poring",sM1_8b, "Mastering",sM1_8b, "Ghostring",sM1_8b, "Spore",sM1_8a;
+
+ sM1_8a:
+ set @SCORE, @SCORE + 10;
+
+ sM1_8b:
+
+ mes "[Raul Expagarus]";
+ mes "10. Which is not a undead?";
+ 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. What is the most important stat for a Wizard?";
+ 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 element doesn't have a bolt spell?";
+ 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. What is NOT a characteristic of a Wizard?";
+ next;
+ menu "Weak physical abilites",sM2_2b, "Distance Attacks",sM2_2b, "Good money maker",sM2_2a, "High Magic Def",sM2_2b;
+
+ sM2_2a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_2b:
+
+ mes "[Raul Expagarus]";
+ mes "4. Which town is the home of Wizards?";
+ 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 card has nothing to do with INT?";
+ next;
+ menu "Andre 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 superior about the mage class compared to others?";
+ next;
+ menu "Close Range Combat",sM2_5b, "High Dodge",sM2_5b, "Dance Skills",sM2_5b, "Magical Power",sM2_5a;
+
+ sM2_5a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_5b:
+
+ mes "[Raul Expagarus]";
+ mes "7. What is the INT bonus at job lvl 40?";
+ 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 equiped by mages?";
+ next;
+ menu "Knife",sM2_7b, "Cap",sM2_7a, "Sandel",sM2_7b, "Eye of Dullahan",sM2_7b;
+
+ sM2_7a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_7b:
+
+ mes "[Raul Expagarus]";
+ mes "9. During the mage test, which stone is NOT one of the Catalysts?";
+ next;
+ menu "Yellow Gemstone",sM2_8b, "Red Gemstone",sM2_8b, "Blue Gemstone",sM2_8b, "Red Blood",sM2_8a;
+
+ sM2_8a:
+ set @SCORE, @SCORE + 10;
+
+ sM2_8b:
+
+ mes "[Raul Expagarus]";
+ mes "10. Which card has nothing to do with magic?";
+ next;
+ menu "Marduk Card",sM2_9b, "Baek-Rhyun-Oak 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 23;
+ 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 1;
+ 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. Which monster doesn't exist?";
+ next;
+ menu "Mantis",sM_0b, "Cunner Tooth",sM_0a, "Giearth",sM_0b, "Caramel",sM_0b;
+
+ sM_0a:
+ set @SCORE, @SCORE + 20;
+
+ sM_0b:
+
+ mes "[Raul Expagarus]";
+ mes "2. Which monster is NOT a animal type?";
+ next;
+ menu "Yoyo",sM_1b, "Bigfoot",sM_1b, "Metaller",sM_1b, "Zerom",sM_1a;
+
+ sM_1a:
+ set @SCORE, @SCORE + 20;
+
+ sM_1b:
+
+ mes "[Raul Expagarus]";
+ mes "3. Which monster has no cast sense?";
+ 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. What's a good spell to use on Marin Spheres?";
+ 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. Which monster can 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";
+ end;
+}
+
+// Room of Water -----------------------------------------------------------------------------
+job_wiz.gat,1,1,1 script WaterRm -1,
+{
+ 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,
+{
+ 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,
+{
+ set $@WzRm, 3;
+ set $@WzMOB, 8;
+ 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";
+ monster "job_wiz.gat",54,89,"Desert Wolf",1106,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";
+ 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";
+ 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
diff --git a/npc/jobs/2-2-1/Champion.txt b/npc/jobs/2-2-1/Champion.txt
index 746f79cf9..70b27c23c 100644
--- a/npc/jobs/2-2-1/Champion.txt
+++ b/npc/jobs/2-2-1/Champion.txt
@@ -1,61 +1,61 @@
-//Champion Made by Evera/Lorri
-valkyrie.gat,53,42,4 script Champion 52,{
- if (readparam(12) != 0) goto Lskpt;
- if ((readparam(11) >= 99) && (readparam(19) == 15) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4005) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4005) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4016) goto Lcrazy;
- mes "[Champion]";
- mes "Hello";
- mes "Nice day isn't it?";
- close;
-Lnovice:
- mes "[Champion]";
- mes "Your holy fist seems strong enough. Hmm..";
- mes "If you devote yourself entirely you can be just like me.";
- mes "There is a catch though, you have to go back through novice and acolyte.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Champion]";
- mes "Ready to become a high acolyte?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Champion]";
- mes "Your hands are now enchanted with a portion of my power.";
- next;
- jobchange 28;// Job: Job_Acolyte_High
- close;
-Lh2:
- mes "[Champion]";
- mes "Your fists are now as strong as mine. Will you take the final step and become a champion?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Champion]";
- mes "Your hands are now enchanted with a portion of my power.";
- jobchange 39;// Job: Job_Champion
- close;
-Lcrazy:
- mes "[Champion]";
- mes "No, I'm not here to fight?";
- close;
-Lskpt:
- mes "[Champion]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Champion]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Champion Made by Evera/Lorri
+valkyrie.gat,53,42,4 script Champion 52,{
+ if (readparam(12) != 0) goto Lskpt;
+ if ((readparam(11) >= 99) && (readparam(19) == 15) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4005) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4005) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4016) goto Lcrazy;
+ mes "[Champion]";
+ mes "Hello";
+ mes "Nice day isn't it?";
+ close;
+Lnovice:
+ mes "[Champion]";
+ mes "Your holy fist seems strong enough. Hmm..";
+ mes "If you devote yourself entirely you can be just like me.";
+ mes "There is a catch though, you have to go back through novice and acolyte.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Champion]";
+ mes "Ready to become a high acolyte?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Champion]";
+ mes "Your hands are now enchanted with a portion of my power.";
+ next;
+ jobchange 28;// Job: Job_Acolyte_High
+ close;
+Lh2:
+ mes "[Champion]";
+ mes "Your fists are now as strong as mine. Will you take the final step and become a champion?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Champion]";
+ mes "Your hands are now enchanted with a portion of my power.";
+ jobchange 39;// Job: Job_Champion
+ close;
+Lcrazy:
+ mes "[Champion]";
+ mes "No, I'm not here to fight?";
+ close;
+Lskpt:
+ mes "[Champion]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Champion]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Clown.txt b/npc/jobs/2-2-1/Clown.txt
index eb88a88ee..29b919382 100644
--- a/npc/jobs/2-2-1/Clown.txt
+++ b/npc/jobs/2-2-1/Clown.txt
@@ -1,122 +1,122 @@
-//Made by Veev for eAthena
-valkyrie.gat,53,54,4z script Clown 741,{
-
-mes "[Clown]";
-mes "Well, would you like to sing a song...?";
-mes "But I'll start the song off for you...";
-goto cmenu;
-
- cmenu:
- menu "I'm not here to sing.",nosing,"Alright...",alright;
-
- nosing:
- mes "[Clown]";
- mes "Really?... I see. What brings you here then?";
- menu "I would like to become a Clown",clown,"Nothing...",nothing;
-
- clown:
- mes "[Clown]";
- mes "Hmm... Let me make sure you are clown-material...";
- next;
- if (sex==0) goto female;
- if (SkillPoint != 0) goto useskpt;
- if ((BaseLevel >= 99) && (Class == 19) && (readparam(55) >= 50)) goto highnovice;
- if ((Class == 4001) && (readparam(55) >= 10)) goto higharcher;
- if ((Class == 4004) && (readparam(55) >= 40)) goto turnclown;
- if ((Class == 4004) && (readparam(55) < 40)) goto toolowha;
- if (Class == 4020) goto alreadyclown;
- mes "Sorry, but you can't become a clown just yet...";
- close;
-
- female:
- mes "[Clown]";
- mes "This job is only for guys... Maybe you should talk to the Gypsy...";
- close;
-
- highnovice:
- mes "[Clown]";
- mes "You are on the right track... But first I need to turn you into a High Novice...";
- mes "Would you like to become a High Novice now?";
- menu "Yes",hn_yes,"No",hn_no;
-
- hn_yes:
- mes "[Clown]";
- mes "This will only be a second...";
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-
- hn_no:
- mes "[Clown]";
- mes "Come back later if you want to change...";
- close;
-
- higharcher:
- mes "[Clown]";
- mes "Even closer to clown now!";
- mes "Wanna change into a High Archer now?";
- menu "Yes",ha_yes,"No",ha_no;
-
- ha_yes:
- mes "[Clown]";
- mes "After this step, you'll be a clown in no time!";
- jobchange 27;// Job: Job_Archer_High
- close;
-
- ha_no:
- mes "[Clown]";
- mes "Well... You can always come back.";
- close;
-
- turnclown:
- mes "[Clown]";
- mes "My favorite part of this job! This is exciting!";
- mes "I'll change you into a Clown now.";
- menu "Alright!",tc_yes,"Not yet...",tc_no;
-
- tc_yes:
- mes "[Clown]";
- mes "I love this job!";
- jobchange 43;// Job: Job_Clown
- next;
- mes "[Clown]";
- mes "Have fun!";
- close;
-
- tc_no:
- mes "[Clown]";
- mes "Well... That kinda ruined my day...";
- close;
-
- alreadyclown:
- mes "[Clown]";
- mes "You are already a Clown!";
- mes "Move out of the way and let other people become one";
- close;
-
- useskpt:
- mes "[Clown]";
- mes "You need to use those skillpoitns up first.";
- close;
-
- towlowha:
- mes "[Clown]";
- mes "Aww, you aren't ready yet! Please come back again when you are ready.";
- close;
-
- nothing:
- mes "[Clown]";
- mes "Sigh...";
- close;
-
- alright:
- mes "[Clown]";
- if (class != 19) goto notbard;
- mes "Actually you know what... Maybe another time... You don't look like a singer...";
- close;
-
- notbard:
- mes "[Clown]";
- mes "... Nice try, but you aren't a Bard... Go bother someone else.";
- close;
-}
+//Made by Veev for eAthena
+valkyrie.gat,53,54,4z script Clown 741,{
+
+mes "[Clown]";
+mes "Well, would you like to sing a song...?";
+mes "But I'll start the song off for you...";
+goto cmenu;
+
+ cmenu:
+ menu "I'm not here to sing.",nosing,"Alright...",alright;
+
+ nosing:
+ mes "[Clown]";
+ mes "Really?... I see. What brings you here then?";
+ menu "I would like to become a Clown",clown,"Nothing...",nothing;
+
+ clown:
+ mes "[Clown]";
+ mes "Hmm... Let me make sure you are clown-material...";
+ next;
+ if (sex==0) goto female;
+ if (SkillPoint != 0) goto useskpt;
+ if ((BaseLevel >= 99) && (Class == 19) && (readparam(55) >= 50)) goto highnovice;
+ if ((Class == 4001) && (readparam(55) >= 10)) goto higharcher;
+ if ((Class == 4004) && (readparam(55) >= 40)) goto turnclown;
+ if ((Class == 4004) && (readparam(55) < 40)) goto toolowha;
+ if (Class == 4020) goto alreadyclown;
+ mes "Sorry, but you can't become a clown just yet...";
+ close;
+
+ female:
+ mes "[Clown]";
+ mes "This job is only for guys... Maybe you should talk to the Gypsy...";
+ close;
+
+ highnovice:
+ mes "[Clown]";
+ mes "You are on the right track... But first I need to turn you into a High Novice...";
+ mes "Would you like to become a High Novice now?";
+ menu "Yes",hn_yes,"No",hn_no;
+
+ hn_yes:
+ mes "[Clown]";
+ mes "This will only be a second...";
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+
+ hn_no:
+ mes "[Clown]";
+ mes "Come back later if you want to change...";
+ close;
+
+ higharcher:
+ mes "[Clown]";
+ mes "Even closer to clown now!";
+ mes "Wanna change into a High Archer now?";
+ menu "Yes",ha_yes,"No",ha_no;
+
+ ha_yes:
+ mes "[Clown]";
+ mes "After this step, you'll be a clown in no time!";
+ jobchange 27;// Job: Job_Archer_High
+ close;
+
+ ha_no:
+ mes "[Clown]";
+ mes "Well... You can always come back.";
+ close;
+
+ turnclown:
+ mes "[Clown]";
+ mes "My favorite part of this job! This is exciting!";
+ mes "I'll change you into a Clown now.";
+ menu "Alright!",tc_yes,"Not yet...",tc_no;
+
+ tc_yes:
+ mes "[Clown]";
+ mes "I love this job!";
+ jobchange 43;// Job: Job_Clown
+ next;
+ mes "[Clown]";
+ mes "Have fun!";
+ close;
+
+ tc_no:
+ mes "[Clown]";
+ mes "Well... That kinda ruined my day...";
+ close;
+
+ alreadyclown:
+ mes "[Clown]";
+ mes "You are already a Clown!";
+ mes "Move out of the way and let other people become one";
+ close;
+
+ useskpt:
+ mes "[Clown]";
+ mes "You need to use those skillpoitns up first.";
+ close;
+
+ towlowha:
+ mes "[Clown]";
+ mes "Aww, you aren't ready yet! Please come back again when you are ready.";
+ close;
+
+ nothing:
+ mes "[Clown]";
+ mes "Sigh...";
+ close;
+
+ alright:
+ mes "[Clown]";
+ if (class != 19) goto notbard;
+ mes "Actually you know what... Maybe another time... You don't look like a singer...";
+ close;
+
+ notbard:
+ mes "[Clown]";
+ mes "... Nice try, but you aren't a Bard... Go bother someone else.";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Creator.txt b/npc/jobs/2-2-1/Creator.txt
index 0b0913cf9..07bd0cc93 100644
--- a/npc/jobs/2-2-1/Creator.txt
+++ b/npc/jobs/2-2-1/Creator.txt
@@ -1,61 +1,61 @@
-//Creator Made by Evera/Lorri 1.1
-
-valkyrie.gat,53,50,6 script Creator 122,{
- if (readparam(12) != 0) goto Lskpt;
- if ((readparam(11) >= 99) && (readparam(19) == 18) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4006) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4006) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4019) goto Lcrazy;
- mes "[Creator]";
- mes "Hello";
- mes "Sorry, no potions for sale.";
- close;
-Lnovice:
- mes "[Creator]";
- mes "Hm. You seem to have extensive knowledge in chemistry. Would you like to become a creator?";
- mes "There is a catch though, you have to go back through novice and merchant.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Creator]";
- mes "Ready to become a high merchant?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Creator]";
- mes "Here, take this potion.";
- next;
- jobchange 29;// Job: Job_Merchant_High
- close;
-Lh2:
- mes "[Creator]";
- mes "You knowledge unbounds you. Will you become a professor?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Creator]";
- mes "Here, take this potion.";
- jobchange Job_Creator; //42
- close;
-Lcrazy:
- mes "[Creator]";
- mes "Hm. You look like me.";
- close;
-Lskpt:
- mes "[Creator]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Creator]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Creator Made by Evera/Lorri 1.1
+
+valkyrie.gat,53,50,6 script Creator 122,{
+ if (readparam(12) != 0) goto Lskpt;
+ if ((readparam(11) >= 99) && (readparam(19) == 18) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4006) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4006) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4019) goto Lcrazy;
+ mes "[Creator]";
+ mes "Hello";
+ mes "Sorry, no potions for sale.";
+ close;
+Lnovice:
+ mes "[Creator]";
+ mes "Hm. You seem to have extensive knowledge in chemistry. Would you like to become a creator?";
+ mes "There is a catch though, you have to go back through novice and merchant.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Creator]";
+ mes "Ready to become a high merchant?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Creator]";
+ mes "Here, take this potion.";
+ next;
+ jobchange 29;// Job: Job_Merchant_High
+ close;
+Lh2:
+ mes "[Creator]";
+ mes "You knowledge unbounds you. Will you become a professor?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Creator]";
+ mes "Here, take this potion.";
+ jobchange Job_Creator; //42
+ close;
+Lcrazy:
+ mes "[Creator]";
+ mes "Hm. You look like me.";
+ close;
+Lskpt:
+ mes "[Creator]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Creator]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Gypsy.txt b/npc/jobs/2-2-1/Gypsy.txt
index 24efc9d86..41c42ec02 100644
--- a/npc/jobs/2-2-1/Gypsy.txt
+++ b/npc/jobs/2-2-1/Gypsy.txt
@@ -1,89 +1,89 @@
-//Made by Evera/Lorri
-valkyrie.gat,53,56,4 script Gypsy 101,{
-if (sex==1) goto Lmale;
-if (readparam(12) != 0) goto Lskpt;
-if ((BaseLevel >= 99) && (readparam(19) == 20) && (readparam(55) >= 50)) goto Lnovice;
-if ((readparam(19) == 24) && (joblevel >= 10)) goto Larcher;
-if ((readparam(19) == 27) && (joblevel >= 40)) goto Lgypsy2;
-if ((readparam(19) == 27) && (joblevel < 40)) goto Lgypsy3;
-if (readparam(19) == 44) goto Lomg;
-
-Lnovice:
-mes "[Gypsy]";
-mes "Hey you there! Are you a dancer?";
-mes "There's a secret I wanna tell you.. You can get even more dances if you become a Gypsy! So do you wanna be a gypsy?";
-menu
-"Yes",Lyes,"No way, you crazy?",Lcancel;
-Lyes:
- mes "Hmm...?";
- next;
- mes "Alright, do you know the requirements? You have to be strong and adept at battling and dancing.";
- mes "Level 99 and Job Level 50!";
- mes "You have to be a dancer ofcourse";
- mes "You sure you want to become a gypsy? You'll go back to a 1/1 novice...";
- menu "Yes",Lnyes,"No",Lano;
-
-Lmale:
- mes "[Gypsy]";
- mes "Shoo! Boys!";
- close;
-
-Lnyes:
-if (readparam(12) != 0) goto Lskpt;
- mes "Come back in 10 job levels then. Good luck!";
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-
-Larcher:
- mes "[Gypsy]";
- mes "You can almost dance!";
- mes "Change into a high archer?";
- menu "Yes",Layes,"No",Lano;
-
-Layes:
-if (readparam(12) != 0) goto Lskpt;
- mes "Hurry up and get 40 job levels!";
- jobchange 27;// Job: Job_Archer_High
- close;
-
-
-
-Lgypsy2:
- mes "I will now dance a magical dance for you.";
- mes "One last chance, do you truly want to become a gypsy?";
- menu "..Yes",Lcyes,"Not yet...",Lano;
-
-Lcyes:
-if (readparam(12) != 0) goto Lskpt;
- mes "Congratulations! You are now a gypsy";
- jobchange 44;// Job: Job_Gypsy
- next;
- mes "[Gypsy]";
- mes "Don't outdo yourself";
- close;
-
-Lskpt:
- mes "[Gypsy]";
- mes "You need to use those skillpoints up first.";
- close;
-
-Lgypsy3:
- mes "[Gypsy]";
- mes "Doesn't look like you're sufficient for the job";
- close;
-
-Lano:
- mes "Well, goodbye!";
- close;
-
-Lcancel:
- mes "[Gypsy]";
- mes "Well bye then..";
- close;
-
-Lomg:
- mes "[Gypsy]";
- mes "Wait.. Haven't I seen you before?";
- close;
-}
+//Made by Evera/Lorri
+valkyrie.gat,53,56,4 script Gypsy 101,{
+if (sex==1) goto Lmale;
+if (readparam(12) != 0) goto Lskpt;
+if ((BaseLevel >= 99) && (readparam(19) == 20) && (readparam(55) >= 50)) goto Lnovice;
+if ((readparam(19) == 24) && (joblevel >= 10)) goto Larcher;
+if ((readparam(19) == 27) && (joblevel >= 40)) goto Lgypsy2;
+if ((readparam(19) == 27) && (joblevel < 40)) goto Lgypsy3;
+if (readparam(19) == 44) goto Lomg;
+
+Lnovice:
+mes "[Gypsy]";
+mes "Hey you there! Are you a dancer?";
+mes "There's a secret I wanna tell you.. You can get even more dances if you become a Gypsy! So do you wanna be a gypsy?";
+menu
+"Yes",Lyes,"No way, you crazy?",Lcancel;
+Lyes:
+ mes "Hmm...?";
+ next;
+ mes "Alright, do you know the requirements? You have to be strong and adept at battling and dancing.";
+ mes "Level 99 and Job Level 50!";
+ mes "You have to be a dancer ofcourse";
+ mes "You sure you want to become a gypsy? You'll go back to a 1/1 novice...";
+ menu "Yes",Lnyes,"No",Lano;
+
+Lmale:
+ mes "[Gypsy]";
+ mes "Shoo! Boys!";
+ close;
+
+Lnyes:
+if (readparam(12) != 0) goto Lskpt;
+ mes "Come back in 10 job levels then. Good luck!";
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+
+Larcher:
+ mes "[Gypsy]";
+ mes "You can almost dance!";
+ mes "Change into a high archer?";
+ menu "Yes",Layes,"No",Lano;
+
+Layes:
+if (readparam(12) != 0) goto Lskpt;
+ mes "Hurry up and get 40 job levels!";
+ jobchange 27;// Job: Job_Archer_High
+ close;
+
+
+
+Lgypsy2:
+ mes "I will now dance a magical dance for you.";
+ mes "One last chance, do you truly want to become a gypsy?";
+ menu "..Yes",Lcyes,"Not yet...",Lano;
+
+Lcyes:
+if (readparam(12) != 0) goto Lskpt;
+ mes "Congratulations! You are now a gypsy";
+ jobchange 44;// Job: Job_Gypsy
+ next;
+ mes "[Gypsy]";
+ mes "Don't outdo yourself";
+ close;
+
+Lskpt:
+ mes "[Gypsy]";
+ mes "You need to use those skillpoints up first.";
+ close;
+
+Lgypsy3:
+ mes "[Gypsy]";
+ mes "Doesn't look like you're sufficient for the job";
+ close;
+
+Lano:
+ mes "Well, goodbye!";
+ close;
+
+Lcancel:
+ mes "[Gypsy]";
+ mes "Well bye then..";
+ close;
+
+Lomg:
+ mes "[Gypsy]";
+ mes "Wait.. Haven't I seen you before?";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Paladin.txt b/npc/jobs/2-2-1/Paladin.txt
index e7e82c0a4..245660c34 100644
--- a/npc/jobs/2-2-1/Paladin.txt
+++ b/npc/jobs/2-2-1/Paladin.txt
@@ -1,62 +1,62 @@
-//Paladin Made by Evera/Lorri
-//Fixed by PoW
-valkyrie.gat,53,39,4 script Paladin 752,{
- if (SkillPoint != 0) goto Lskpt;
- if ((readparam(11) >= 99) && (readparam(19) == 14) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(11) >= 99) && (readparam(19) == 21) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4002) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4002) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4015) goto Lcrazy;
- mes "[Paladin]";
- mes "Hello";
- mes "God will always be there to help.";
- close;
-Lnovice:
- mes "[Paladin]";
- mes "Your holy aura is strong. Will you become a paladin?";
- mes "There is a catch though, you have to go back through novice and merchant.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Paladin]";
- mes "Ready to become a high swordsman?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Paladin]";
- mes "By the holy resovoir in this blessed sword, I crown you.";
- next;
- jobchange 25;// Job: Job_Swordman_High
- close;
-Lh2:
- mes "[Paladin]";
- mes "Your holy aura is extremely high. You are ready. Will you become a paladin?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Paladin]";
- mes "By the holy resovoir in this blessed sword, I crown you.";
- jobchange 38;// Job: Job_Paladin
- close;
-Lcrazy:
- mes "[Paladin]";
- mes "God has helped you very much.";
- close;
-Lskpt:
- mes "[Paladin]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Paladin]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Paladin Made by Evera/Lorri
+//Fixed by PoW
+valkyrie.gat,53,39,4 script Paladin 752,{
+ if (SkillPoint != 0) goto Lskpt;
+ if ((readparam(11) >= 99) && (readparam(19) == 14) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(11) >= 99) && (readparam(19) == 21) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4002) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4002) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4015) goto Lcrazy;
+ mes "[Paladin]";
+ mes "Hello";
+ mes "God will always be there to help.";
+ close;
+Lnovice:
+ mes "[Paladin]";
+ mes "Your holy aura is strong. Will you become a paladin?";
+ mes "There is a catch though, you have to go back through novice and merchant.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Paladin]";
+ mes "Ready to become a high swordsman?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Paladin]";
+ mes "By the holy resovoir in this blessed sword, I crown you.";
+ next;
+ jobchange 25;// Job: Job_Swordman_High
+ close;
+Lh2:
+ mes "[Paladin]";
+ mes "Your holy aura is extremely high. You are ready. Will you become a paladin?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Paladin]";
+ mes "By the holy resovoir in this blessed sword, I crown you.";
+ jobchange 38;// Job: Job_Paladin
+ close;
+Lcrazy:
+ mes "[Paladin]";
+ mes "God has helped you very much.";
+ close;
+Lskpt:
+ mes "[Paladin]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Paladin]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Professor.txt b/npc/jobs/2-2-1/Professor.txt
index 5ce78da48..c0c1cb78f 100644
--- a/npc/jobs/2-2-1/Professor.txt
+++ b/npc/jobs/2-2-1/Professor.txt
@@ -1,61 +1,61 @@
-//Professor Made by Evera/Lorri
-//Fixed by PoW
-valkyrie.gat,53,47,4 script Professor 743,{
- if (readparam(12) != 0) goto Lskpt;
- if ((readparam(11) >= 99) && (readparam(19) == 16) && (readparam(55) >= 50)) goto Lnovice;
- if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
- if ((readparam(19) == 4003) && (readparam(55) >= 40)) goto Lh2;
- if ((readparam(19) == 4003) && (readparam(55) < 40)) goto LCem;
- if (readparam(19) == 4017) goto Lcrazy;
- mes "[Professor]";
- mes "Hello";
- mes "Knowledge is the key.";
- close;
-Lnovice:
- mes "[Professor]";
- mes "You seem smart. Hm. Do you wish to persue your dream of knowledge and become a professor like me?";
- mes "There is a catch though, you have to go back through novice and mage.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Professor]";
- mes "Ready to become a high mage?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Professor]";
- mes "Read this book, you'll be enchanted by its magic";
- next;
- jobchange 26;// Job: Job_Mage_High
- close;
-Lh2:
- mes "[Professor]";
- mes "It appears as your intelligence quota surpasses mine. Will you become a professor";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Professor]";
- mes "Read this book, you'll be enchanted by its magic";
- jobchange 40;// Job: Job_Professor
- close;
-Lcrazy:
- mes "[Professor]";
- mes "Your intelligence will surpass many other unfortunate souls who have not found truth in a book.";
- close;
-Lskpt:
- mes "[Professor]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Professor]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Professor Made by Evera/Lorri
+//Fixed by PoW
+valkyrie.gat,53,47,4 script Professor 743,{
+ if (readparam(12) != 0) goto Lskpt;
+ if ((readparam(11) >= 99) && (readparam(19) == 16) && (readparam(55) >= 50)) goto Lnovice;
+ if ((readparam(19) == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((readparam(19) == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((readparam(19) == 4003) && (readparam(55) >= 40)) goto Lh2;
+ if ((readparam(19) == 4003) && (readparam(55) < 40)) goto LCem;
+ if (readparam(19) == 4017) goto Lcrazy;
+ mes "[Professor]";
+ mes "Hello";
+ mes "Knowledge is the key.";
+ close;
+Lnovice:
+ mes "[Professor]";
+ mes "You seem smart. Hm. Do you wish to persue your dream of knowledge and become a professor like me?";
+ mes "There is a catch though, you have to go back through novice and mage.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Professor]";
+ mes "Ready to become a high mage?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Professor]";
+ mes "Read this book, you'll be enchanted by its magic";
+ next;
+ jobchange 26;// Job: Job_Mage_High
+ close;
+Lh2:
+ mes "[Professor]";
+ mes "It appears as your intelligence quota surpasses mine. Will you become a professor";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Professor]";
+ mes "Read this book, you'll be enchanted by its magic";
+ jobchange 40;// Job: Job_Professor
+ close;
+Lcrazy:
+ mes "[Professor]";
+ mes "Your intelligence will surpass many other unfortunate souls who have not found truth in a book.";
+ close;
+Lskpt:
+ mes "[Professor]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Professor]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-2-1/Stalker.txt b/npc/jobs/2-2-1/Stalker.txt
index cb1b9119d..176fef3db 100644
--- a/npc/jobs/2-2-1/Stalker.txt
+++ b/npc/jobs/2-2-1/Stalker.txt
@@ -1,59 +1,59 @@
-//Stalker Made by Evera/Lorri
-valkyrie.gat,53,58,4 script Stalker 747,{
- if (readparam(12) != 0) goto Lskpt;
- if ((readparam(11) >= 99) && (Class == 18) && (JobLevel >= 50)) goto Lnovice;
- if ((Class == 4001) && (readparam(55) >= 10)) goto Lh1;
- if ((Class == 4001) && (readparam(55) < 10)) goto LCem;
- if ((Class == 4007) && (readparam(55) >= 40)) goto Lh2;
- if ((Class == 4007) && (readparam(55) < 40)) goto LCem;
- if (Class == 4018) goto Lcrazy;
- mes "[Stalker]";
- mes "...";
- close;
-Lnovice:
- mes "[Stalker]";
- mes "Hm. You seem like a person that would be interested. Would you want to become a stalker?";
- mes "There is a catch though, you have to go back through novice and theif.";
- mes "You wanna do it?";
- menu "Yes",Lnovice2,"No",Lcancel;
-Lnovice2:
- mes "We shall start the ceremony....";
- next;
- jobchange 24;// Job: Job_Novice_High
- resetlvl(1);
- close;
-Lh1:
- mes "[Stalker]";
- mes "Ready to become a theif?";
- menu "Yes",Lh12,"No",Lcancel;
-Lh12:
- mes "[Stalker]";
- mes "Hmf.";
- next;
- jobchange 30;// Job: Job_Thief_High
- close;
-Lh2:
- mes "[Stalker]";
- mes "Hm. You're ready. Become a stalker?";
- menu "Yes",Lh22,"No",Lcancel;
-Lh22:
- mes "[Stalker]";
- mes "Hmf.";
- jobchange 41;// Job: Job_Stalker
- close;
-Lcrazy:
- mes "[Stalker]";
- mes "I'm done with you.";
- close;
-Lskpt:
- mes "[Stalker]";
- mes "Use your skillpoints first";
- close;
-LCem:
- mes "[Stalker]";
- mes "You're not ready to go to the next level";
- close;
-Lcancel:
- mes "Bye";
- close;
-}
+//Stalker Made by Evera/Lorri
+valkyrie.gat,53,58,4 script Stalker 747,{
+ if (readparam(12) != 0) goto Lskpt;
+ if ((readparam(11) >= 99) && (Class == 18) && (JobLevel >= 50)) goto Lnovice;
+ if ((Class == 4001) && (readparam(55) >= 10)) goto Lh1;
+ if ((Class == 4001) && (readparam(55) < 10)) goto LCem;
+ if ((Class == 4007) && (readparam(55) >= 40)) goto Lh2;
+ if ((Class == 4007) && (readparam(55) < 40)) goto LCem;
+ if (Class == 4018) goto Lcrazy;
+ mes "[Stalker]";
+ mes "...";
+ close;
+Lnovice:
+ mes "[Stalker]";
+ mes "Hm. You seem like a person that would be interested. Would you want to become a stalker?";
+ mes "There is a catch though, you have to go back through novice and theif.";
+ mes "You wanna do it?";
+ menu "Yes",Lnovice2,"No",Lcancel;
+Lnovice2:
+ mes "We shall start the ceremony....";
+ next;
+ jobchange 24;// Job: Job_Novice_High
+ resetlvl(1);
+ close;
+Lh1:
+ mes "[Stalker]";
+ mes "Ready to become a theif?";
+ menu "Yes",Lh12,"No",Lcancel;
+Lh12:
+ mes "[Stalker]";
+ mes "Hmf.";
+ next;
+ jobchange 30;// Job: Job_Thief_High
+ close;
+Lh2:
+ mes "[Stalker]";
+ mes "Hm. You're ready. Become a stalker?";
+ menu "Yes",Lh22,"No",Lcancel;
+Lh22:
+ mes "[Stalker]";
+ mes "Hmf.";
+ jobchange 41;// Job: Job_Stalker
+ close;
+Lcrazy:
+ mes "[Stalker]";
+ mes "I'm done with you.";
+ close;
+Lskpt:
+ mes "[Stalker]";
+ mes "Use your skillpoints first";
+ close;
+LCem:
+ mes "[Stalker]";
+ mes "You're not ready to go to the next level";
+ close;
+Lcancel:
+ mes "Bye";
+ close;
+}
diff --git a/npc/jobs/2-2/crusader.txt b/npc/jobs/2-2/crusader.txt
index 076ef2ce6..456861df0 100644
--- a/npc/jobs/2-2/crusader.txt
+++ b/npc/jobs/2-2/crusader.txt
@@ -1,1164 +1,1164 @@
-////===== eAthena Script =======================================
-//= Crusader Quest
-//===== By: ==================================================
-//= Made by: Black Dragon
-//= Converted by: Shin
-//=
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 0.5.2 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Need optimalization and fixing
-//= thanks to Komurka, KiLLaLeN, Lupus (fixing error)
-//= just a temp Job Quest
-//============================================================
-
-prt_castle.gat,178,99,6 script Lothar 752,{
- mes "[^000080Lothar^000000]";
- if (Class > 0) goto NEXT_0;
- if (Class == 0) goto NOV;
- mes "Hello "+ strcharinfo(0);
- mes "I see that you've registered to the ^008000Swordsman's Association^000000.";
- TALK:
- next;
- mes "[^000080Lothar^000000]";
- mes "If you become a ^800000Swordsman^000000, you will gain the privelege of becoming a ^800000Knight^000000 or ^800000Crusader^000000.";
- next;
- mes "[^000080Lothar^000000]";
- mes "If you decide to go along the path of the ^800000Crusader^000000, come back here.";
- mes "Just take note that you must obtain a job level of at least 40 first before you can move up to the 2nd job.";
- close;
- NOV:
- mes "Hello there.";
- goto TALK;
-NEXT_0:
- if (Class > 1) goto NEXT0;
- if (Job_CR == 1) goto CONT;
- if (Job_CR == 2) goto CONT0;
- if (Job_CR == 3) goto CONT1;
- if (Job_CR == 4) goto CONT2;
- if (Job_CR > 4) goto CONT3;
- mes "Welcome, can I help you with something?";
- next;
- menu "I want to become a ^800000Crusader^000000.",JOB,"What's being a ^800000Crusader^000000 like?",ASK,"What is the purpose of a ^800000Crusader^000000?",ASK0,"I was just looking around.",-;
- mes "[^000080Lothar^000000]";
- mes "Oh, all right.";
- next;
- mes "[^000080Lothar^000000]";
- mes "If you decide to take the path of the ^800000Crusader^000000, feel free to come back.";
- close;
- JOB:
- mes "[^000080Lothar^000000]";
- mes "All right, let me take a look at you first.";
- next;
- mes "[^000080Lothar^000000]";
- if (readparam(55) != 50) goto SKIP;
- set JLCC,1;
- set Job_CR,5;
- goto TEST1;
- SKIP:
- if (readparam(55) > 39) goto OKAY;
- mes "[^000080Lothar^000000]";
- mes "I'm sorry, but you need to be at least at a job level of 40.";
- next;
- mes "[^000080Lothar^000000]";
- mes "All 2nd jobs require that.";
- close;
- OKAY:
- if (SkillPoint == 0) goto OKAY0;
- JOB0:
- mes "[^000080Lothar^000000]";
- mes "In order to become a ^800000Crusader^000000, you have to have used all your available skill points first.";
- close;
- OKAY0:
- mes "[^000080Lothar^000000]";
- mes "Everything looks all right.";
- set Job_CR,1;
- next;
- mes "[^000080Lothar^000000]";
- mes "All right, shall we begin the tests?";
- next;
- menu "Yes, of course.",OKAY1,"Not yet.",-;
- mes "[^000080Lothar^000000]";
- mes "Oh, all right. Come back when you're ready.";
- close;
- OKAY1:
- if (SkillPoint != 0) goto JOB0;
- set Job_CR,2;
- mes "[^000080Lothar^000000]";
- mes "All right, the first test requires you to collect items.";
- next;
- set Job_CR, rand (2);
- set Job_CR,Job_CR + 3;
- mes "[^000080Lothar^000000]";
- mes "Bring back the following items:";
- if (Job_CR != 3) goto IT;
- mes "- 10 ^FF0000Decayed Nail^000000";
- mes "- 10 ^FF0000Danggies^000000";
- mes "- 10 ^FF0000Stinky Scales^000000";
- mes "- 10 ^FF0000Mementos^000000";
- close;
- IT:
- mes "- 10 ^FF0000Decayed Nail^000000";
- mes "- 10 ^FF0000Danggies^000000";
- mes "- 10 ^FF0000Stinky Scales^000000";
- mes "- 10 ^FF0000Mementos^000000";
- close;
-
- ASK:
- mes "[^000080Lothar^000000]";
- mes "To be a ^800000Crusader^000000 is to fight for the righteous people.";
- mes "Not always those who are in power, but rather for the justly cause.";
- next;
- mes "[^000080Lothar^000000]";
- mes "I hope that you consider to become one.";
- mes "To fight for good is a job that should be done by everyone to some extent.";
- close;
- ASK0:
- mes "[^000080Lothar^000000]";
- mes "The purpose of a ^800000Crusader^000000 is to work for the good in the world.";
- mes "A ^800000Crusader^000000 is a person of righteousness at work.";
- close;
- CONT:
- mes "Have you changed your mind?";
- next;
- menu "Yes, I want to become a ^800000Crusader^000000.",JOB,"Sorry, but I don't want to.",-;
- mes "[^000080Lothar^000000]";
- mes "I see... That's a shame.";
- next;
- mes "[^000080Lothar^000000]";
- mes "Come back if you do want to.";
- close;
- CONT0:
- mes "Well, hm...";
- next;
- mes "[^000080Lothar^000000]";
- mes "I was expecting that someone like you would pass.";
- next;
- mes "[^000080Lothar^000000]";
- mes "Mind to try again?";
- next;
- menu "Yes, of course.",OKAY1,"No, I'm all right.",-;
- mes "[^000080Lothar^000000]";
- mes "Oh, all right.";
- close;
- CONT1:
- set @item,0;
- if(countitem(957)>=10) goto ITEM7;//Items: Decayed Nail,
- mes "- 10 ^FF0000Decayed Nails^000000";
- set @item, item +1;
- ITEM7:
- if(countitem(901)>=10) goto ITEM8;//Items: Danggie,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Danggies^000000";
- set @item, item +1;
- ITEM8:
- if(countitem(959)>=10) goto ITEM9;//Items: Stinky Scale,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Stinky Scales^000000";
- set @item, item +1;
- ITEM9:
- if(countitem(934)>=10) goto ITEM10;//Items: Memento,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Mementos^000000";
- set @item, item +1;
- ITEM10:
- if (@item == 0) goto DONE;
- close;
- DONE:
- mes "Good job!";
- mes "You collected everything!";
- delitem 957,10;//Items: Decayed Nail,
- delitem 901,10;//Items: Danggie,
- delitem 959,10;//Items: Stinky Scale,
- delitem 934,10;//Items: Memento,
- set Job_CR,5;
- TEST1:
- next;
- mes "[^000080Lothar^000000]";
- mes "All right, let's move on to the 2nd test.";
- next;
- mes "[^000080Lothar^000000]";
- mes "Go to the prison, it's in the basement";
- mes "Before you do, make sure that you bring a ^FF0000Rosary^000000 with you.";
- close;
- CONT2:
- set @item, 0;
- if(countitem(932)>=10) goto ITEM11;//Items: Skel-Bone,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Skel-Bones^000000";
- set @item, item +1;
- ITEM11:
- if(countitem(1043)>=10) goto ITEM12;//Items: Orc Claw,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Orc Claws^000000";
- set @item, item +1;
- ITEM12:
- if(countitem(2408)>=1) goto ITEM13;//Items: Ball'n'Chain,
- mes "You still miss the this item";
- mes "- 1 ^FF0000Ball 'n Chain^000000";
- set @item, item +1;
- ITEM13:
- if(countitem(901)>=10) goto ITEM14;//Items: Danggie,
- mes "You still miss the this item";
- mes "- 10 ^FF0000Danggie^000000";
- set @item, item +1;
- ITEM14:
- if (@item== 0) GOTO DONE0;
- close;
- DONE0:
- mes "Good job!";
- mes "You collected everything!";
- delitem 932,10;//Items: Skel-Bone,
- delitem 1043,10;//Items: Orc Claw,
- delitem 2408,1;//Items: Ball'n'Chain,
- delitem 901,10;//Items: Danggie,
- set Job_CR,5;
- goto TEST1;
- CONT3:
- if (Job_CR == 8) goto CONT4;
- if (Job_CR > 8) goto CONT5;
- mes "Please talk to the man in the prison to continue.";
- mes "Make sure you bring a ^FF0000Rosary^000000 with you.";
- close;
- CONT4:
- mes "Great job in accomplishing the ^FF8000Patience Test^000000!";
- next;
- mes "[^000080Lothar^000000]";
- mes "Now to move on to the ^FF8000Knowledge Test^000000.";
- mes "Please talk to the Knight at the Cathedral, he will test your knowledge.";
- set Job_CR,9;
- close;
- CONT5:
- if (Job_CR == 13) goto CONT6;
- if (Job_CR == 14) goto CONT7;
- mes "Please go talk to the Knight at the Cathedral to continue.";
- close;
- CONT6:
- mes "Excellent work in completing all the necessary tests!";
- mes "Now let me examine you before you become a ^800000Crusader^000000.";
- next;
- set Job_CR,14;
- mes "[^000080Lothar^000000]";
- CONT7:
- if (SkillPoint == 0) goto GOOD;
- mes "I'm sorry, but you'll need to use up all your skill points first.";
- close;
- GOOD:
- mes "This is to compliment your job change.";
- if (JLCC != 1) goto OTHR;
- getitem (1408),1;
- goto END_0;
- OTHR:
- getitem (1409),1;
- END_0:
- jobchange 14;// Job: Job_Crusader
- set JobLevel,JobLevel+1;
- callfunc "F_ClearJobVar"; // clears all job variables for the current player
- close;
-NEXT0:
- if (Class != 2) goto NEXT1;
- mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
- mes "Hope you have a good day!";
- close;
-NEXT1:
- if (Class != 3) goto NEXT2;
- mes "Good luck in your hunting.";
- close;
-NEXT2:
- if (Class != 4) goto NEXT3;
- mes "Good day to you!";
- mes "Hope you do well to find your path.";
- close;
-NEXT3:
- if (Class != 5) goto NEXT4;
- mes "Hello, we don't currently need anything, sorry about that.";
- close;
-NEXT4:
- if (Class != 6) goto NEXT5;
- mes "Better watch yourself.";
- close;
-NEXT5:
- if (Class != 7) goto NEXT6;
- mes "Good day to you, " + strcharinfo(0);
- close;
-NEXT6:
- if (Class != 8) goto NEXT7;
- mes "Good day, "+ strcharinfo(0);
- mes "I would hope to believe that all is going well.";
- close;
-NEXT7:
- if (Class != 9) goto NEXT8;
- mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
- mes "Nice to have you wish us.";
- close;
-NEXT8:
- if (Class != 10) goto NEXT9;
- mes "Hello, we're not in need of any weapons or armour at the moment, thank you.";
- close;
-NEXT9:
- if (Class != 11) goto NEXT10;
- mes "Hello, wish you luck for your success.";
- close;
-NEXT10:
- if (Class != 12) goto NEXT11;
- mes "Stay out of trouble, you don't want the guards to come after you, now do you?";
- close;
-NEXT11:
- if (Class != 14) goto NEXT12;
- mes "Good day, "+ strcharinfo(0);
- close;
-NEXT12:
- if (Class != 15) goto NEXT13;
- mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
- close;
-NEXT13:
- if (Class != 16) goto NEXT14;
- mes "Welcome to the ^008000Castle of Prontera^000000, I hope you enjoy your stay.";
- close;
-NEXT14:
- if (Class != 17) goto NEXT15;
- mes "Stay out of trouble if you know what's good for you.";
- close;
-NEXT15:
- if (Class != 18) goto NEXT16;
- mes "So, how are the experiments going down in ^00FF00Al de Baran^000000?";
- close;
-NEXT16:
- if (Class != 19) goto NEXT17;
- mes "Welcome to the castle, good sir.";
- close;
-NEXT17:
- if (Class != 20) goto NEXT18;
- mes "Good day, miss.";
- close;
-NEXT18:
- if (Class != 22) goto NEXT19;
- if (Gender != 0) goto MALE;
- mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
- close;
- MALE:
- mes "Well done, sir!";
- close;
-NEXT19:
- mes "Hello and good day!";
- close;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Man in Pain - Crusader Job Quest - 2nd Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-prt_castle.gat,163,33,0 script Man in Pain 107,{
-
- if (Job_CR == 7) goto CONT;
- if (Job_CR > 7) goto CONT0;
- mes "[^000080Man in Pain^000000]";
- mes "Who... who are you?";
- next;
- if (Job_CR == 5) goto CHECK;
-
- OTHER:
- if (Job_CR == 6) goto EXIT1;
- mes "[^000080Man in Pain^000000]";
- mes "What do you want?";
- mes "Leave me alone~!";
- close;
- CHECK:
- if (countitem(2608) == 0) goto NOT;//Items: Rosary,
-
- mes "[^000080Man in Pain^000000]";
- mes "I see, you're here for the job.";
- next;
- mes "[^000080Man in Pain^000000]";
- mes "It's torture.";
- mes "They send me to that room time and time again.";
- next;
- mes "[^000080Man in Pain^000000]";
- mes "I've grown awefully weak from it.";
- next;
- mes "[^000080Man in Pain^000000]";
- mes "But if it's your wish, I will send to there.";
- next;
- menu "Yes.",-,"On second thought...",EXIT;
- mes "[^000080Man in Pain^000000]";
- mes "All right then... I'll tell you where to go.";
- GO:
- next;
- savepoint "prt_castle.gat",162,27;
- if (getmapusers("job_cru.gat") > 0) goto EXIT0;
- set Job_CR,6;
- warp "job_cru.gat",23,42;
- EXIT0:
- mes "[^000080Man in Pain^000000]";
- mes "I'm sorry, there's already another person there right now.";
- mes "Please wait a little longer.";
- close;
- EXIT:
- mes "[^000080Man in Pain^000000]";
- mes "Please do not disturb me then!";
- close;
- NOT:
- mes "[^000080Man in Pain^000000]";
- mes "Leave me alone!";
- mes "Can't you leave someone in pain alone ?";
- close;
-
- CONT:
- mes "[^000080Man in Pain^000000]";
- mes "I see you've passed. Good work.";
- set Job_CR,8;
- close;
- EXIT1:
- mes "[^000080Man in Pain^000000]";
- mes "Sorry but you're going to need to go again.";
- goto GO;
- CONT0:
- mes "[^000080Man in Pain^000000]";
- mes "There is nothing else you need from me.";
- mes "Let me be...";
- close;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Arthur - Crusader Job Quest - Knowledge Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-prt_church.gat,94,116,0 script Arthur 56,{
- mes "[^000080Arthur^000000]";
- if (Class != 0) goto NEXT_o;
- mes "Hello young traveler.";
- close;
-NEXT_o:
- if (Class != 1) goto NEXT0;
- mes "Hello," + strcharinfo(0);
- next;
- if (Job_CR != 9) goto EXIT;
- BEGIN:
- menu "Take the Knowledge test.",-,"Nothing.",EXIT;
- mes "[^000080Arthur^000000]";
- mes "Oh, on your way to become a ^800000Crusader^000000 huh?";
- mes "Okay...";
- next;
- START:
- set @Q , 0;
- set @Q1 , 0;
- set @Q2 , 0;
- set @Q3 , 0;
- set @Q4 , 0;
- set @Q5 , 0;
- set @Q6 , 0;
- set @Q7 , 0;
- set @Q8 , 0;
- set @Q9 , 0;
- set @Q10 , 0;
- set @Q11 , 0;
- set @Q12 , 0;
- set @Q13 , 0;
- set @Q14 , 0;
- set @Q15 , 0;
- set @Q16 , 0;
- set @Q17 , 0;
- set @Q18 , 0;
- set @Q19 , 0;
- set @Q20 , 0;
- set @ANS , 0;
- RND:
- if (@Q > 10) goto DONE;
- set @RND, rand(20);
- if (@RND > 9) goto G1;
- if (@RND > 4) goto G1A;
- if (@RND > 3) goto G1A1;
- if (@RND == 0) goto Q1;
- if (@RND == 1) goto Q2;
- if (@RND != 1) goto Q3;
- G1A1:
- if (@RND == 3) goto Q4;
- if (@RND != 3) goto Q5;
- G1A:
- if (@RND > 8) goto G1A2;
- if (@RND == 5) goto Q6;
- if (@RND == 6) goto Q7;
- if (@RND != 6) goto Q8;
- G1A2:
- if (@RND == 8) goto Q9;
- if (@RND != 8) goto Q10;
- G1:
- if (@RND > 14) goto G2A;
- if (@RND > 13) goto G2A1;
- if (@RND == 10) goto Q11;
- if (@RND == 11) goto Q12;
- if (@RND == 12) goto Q13;
- G2A1:
- if (@RND == 13) goto Q14;
- if (@RND == 14) goto Q15;
- G2A:
- if (@RND > 18) goto G2A2;
- if (@RND == 15) goto Q16;
- if (@RND == 16) goto Q17;
- if (@RND == 17) goto Q18;
- G2A2:
- if (@RND == 18) goto Q19;
- if (@Q20 != 0) goto RND;
- set @Q20,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Are you willing to risk your life to save someone else?";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q1:
- if (@Q1 != 0) goto RND;
- set @Q1,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "If someone asks you to help them for a good cause, will you oblige?";
- next;
- menu "Yes",-,"No",RND;
- set @ANS, @ANS + 1;
- goto RND;
- Q2:
- if (@Q2 != 0) goto RND;
- set @Q2, 1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Would you allow a robber to get away with stolen goods?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q3:
- if (@Q3 != 0) goto RND;
- set @Q3,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Do you wish that the world was at harmony?";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q4:
- if (@Q4 != 0) goto RND;
- set @Q4,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Will you ever attempt suicide?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q5:
- if (@Q5 != 0) goto RND;
- set @Q5,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Will you intoxicate yourself at parties?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q6:
- if (@Q6 != 0) goto RND;
- set @Q6,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Will you openly massacre?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q7:
- if (@Q7 != 0) goto RND;
- set @Q7,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Will you hold your temper during arguments?";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q8:
- if (@Q8 != 0) goto RND;
- set @Q8,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "Would you allow alchemists to perform illegal experiments?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q9:
- if (@Q9 != 0) goto RND;
- set @Q9,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "If someone threw a stone at you, you'd become furious.";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q10:
- if (@Q10 != 0) goto RND;
- set @Q10,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "If someone offered you money that belongs to someone poor, would you take it?";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q11:
- if (@Q11 != 0) goto RND;
- set @Q11,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You think highly of yourself.";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q12:
- if (@Q12 != 0) goto RND;
- set @Q12,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You are humble before others.";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q13:
- if (@Q13 != 0) goto RND;
- set @Q13,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You answer people full of respect and with kindness.";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q14:
- if (@Q14 != 0) goto RND;
- set @Q14,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You fight when you feel like it.";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q15:
- if (@Q15 != 0) goto RND;
- set @Q15,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You go to the pub every night.";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q16:
- if (@Q16 != 0) goto RND;
- set @Q16,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You believe in the Father, Son and Holy Spirit.";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- Q17:
- if (@Q17 != 0) goto RND;
- set @Q17,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You believe that the Devil is evil and cruel and should be treated the same way.";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q18:
- if (@Q18 != 0) goto RND;
- set @Q18,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "You believe that talk is for wimps and that action plays the main role in peace-making";
- next;
- menu "Yes",RND,"No",-;
- set @ANS,@ANS + 1;
- goto RND;
- Q19:
- if (@Q19 != 0) goto RND;
- set @Q19,1;
- set @Q,@Q + 1;
- mes "[^000080Arthur^000000]";
- mes "If all other means to keep peace fail, THEN it is all right to resort to violence.";
- next;
- menu "Yes",-,"No",RND;
- set @ANS,@ANS + 1;
- goto RND;
- DONE:
- mes "[^000080Arthur^000000]";
- mes "You got "+ @ANS +" / 10 questions correct.";
- next;
- if (Job_CR != 10) goto secND;
- if (@ANS < 8) goto NO;
- PASS:
- mes "[^000080Arthur^000000]";
- mes "Excellent work! You qualify to pass the ^FF8000Knowledge Test^000000!";
- mes "You're almost done, you are now at the ^FF8000Purification Test^000000, find the Guardian Knight at ^008000Prontera Castle^000000.";
- set Job_CR, 11;
- close;
- NO:
- set Job_CR, 10;
- mes "[^000080Arthur^000000]";
- mes "I'm sorry, you didn't get enough to qualify.";
- next;
- mes "[^000080Arthur^000000]";
- mes "Try giving it another go when you feel you're ready.";
- mes "I'll only expect you to get at least 8 correct from now on.";
- close;
- secND:
- if (@ANS > 7) goto PASS;
- mes "[^000080Arthur^000000]";
- mes "I'm sorry, you didn't get enough correct.";
- close;
- EXIT:
- if (Job_CR == 10) goto BEGIN;
- if (Job_CR > 10) goto FINISH;
- close;
- FINISH:
- mes "[^000080Arthur^000000]";
- mes "Please go to the Guardian Knight at ^008000Prontera Castle^000000 to continue on to the ^FF8000Purification Test^000000.";
- close;
-NEXT0:
- if (Class != 2) goto NEXT1;
- mes "Hello, welcome to the ^008000Prontera ChivalryY^000000.";
- mes "Hope you have a good day!";
- close;
-NEXT1:
- if (Class != 3) goto NEXT2;
- mes "Good luck in your hunting.";
- close;
-NEXT2:
- if (Class != 4) goto NEXT3;
- mes "Good day to you!";
- mes "Hope you do well to find your path.";
- close;
-NEXT3:
- if (Class != 5) goto NEXT4;
- mes "Hello, we don't currently need anything, sorry about that.";
- close;
-NEXT4:
- if (Class != 6) goto NEXT5;
- mes "Better watch yourself.";
- close;
-NEXT5:
- if (Class != 7) goto NEXT6;
- mes "Good day to you, "+ strcharinfo(0);
- close;
-NEXT6:
- if (Class != 8) goto NEXT7;
- mes "Good day, " + strcharinfo(0);
- mes "I would hope to believe that all is going well.";
- close;
-NEXT7:
- if (Class != 9) goto NEXT8;
- mes "Hello! Nice to have you wish us.";
- close;
-NEXT8:
- if (Class != 10) goto NEXT9;
- mes "Hello, we're not in need of any weapons or armour at the moment, thank you.";
- close;
-NEXT9:
- if (Class != 11) goto NEXT10;
- mes "Hello, wish you luck for your success.";
- close;
-NEXT10:
- if (Class != 12) goto NEXT11;
- mes "Stay out of trouble, you don't want the guards to come after you, now do you?";
- close;
-NEXT11:
- if (Class != 14) goto NEXT12;
- mes "Good day" + strcharinfo(0);
- close;
-NEXT12:
- if (Class != 15) goto NEXT13;
- mes "Hello, welcome to the ^008000Knight's Headquarters^000000.";
- close;
-NEXT13:
- if (Class != 16) goto NEXT14;
- mes "Welcome to the ^008000Knight's Headquarters^000000, I hope you enjoy your stay.";
- close;
-NEXT14:
- if (Class != 17) goto NEXT15;
- mes "Stay out of trouble if you know what's good for you.";
- close;
-NEXT15:
- if (Class != 18) goto NEXT16;
- mes "So, how are the experiments going down in ^00FF00Al de Baran^000000?";
- close;
-NEXT16:
- if (Class != 19) goto NEXT17;
- mes "Welcome to the castle, good sir.";
- close;
-NEXT17:
- if (Class != 20) goto NEXT18;
- mes "Good day, miss.";
- close;
-NEXT18:
- if (Class != 22) goto NEXT19;
- if (Gender != 0) goto MALE;
- mes "Hello, welcome to the ^008000Knight's Headquarters^000000.";
- close;
- MALE:
- mes "Well done, sir!";
- close;
-NEXT19:
- mes "Hello and good day!";
- close;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Harrison - Crusader Job Quest - Purification Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-prt_in.gat,83,97,0 script Harrison 734,{
- mes "[^000080Harrison^000000]";
- if (Class != 0) goto NEXT_o;
- mes "Hello, young traveler.";
- mes "Welcome.";
- close;
-NEXT_o:
- if (Class != 1) goto NEXT0;
- if (Job_CR == 11) goto PART1;
- if (Job_CR == 12) goto PART2;
- if (Job_CR != 13) goto EXIT;
- mes "Well done!";
- mes "Go talk to ^000080Lothar^000000, he will turn you into a ^800000Crusader^000000.";
- close;
- PART2:
- if (@cru2 == 43) goto EXIT2;
- PART2A:
- mes "So, do you want to try again?";
- next;
- menu "Yes",TEST,"No",-;
- mes "[^000080Harrison^000000]";
- mes "Oh, okay then.";
- close;
- PART1:
- mes "Hello, " + strcharinfo(0);
- mes "I see that you've passed thus far.";
- next;
- mes "[^000080Harrison^000000]";
- mes "Don't let me down in this test.";
- mes "This is the ^FF8000Purification Test^000000.";
- mes "I will take you to the proper location when you are ready.";
- next;
- menu "I want to go now.",-,"All right, just a second.",EXIT0;
- TEST:
- mes "[^000080Harrison^000000]";
- mes "Let me make sure it's empty first.";
- next;
- if( getmapusers("job_cru.gat")>0 ) goto EXIT1;
- savepoint "prt_in.gat",81,100;
- set Job_CR, 12;
- warp "job_cru",167,175;
- EXIT1:
- mes "[^000080Harrison^000000]";
- mes "I'm sorry, but someone else is inside at the moment.";
- close;
- EXIT0:
- mes "[^000080Harrison^000000]";
- mes "No problem, take as long as you need.";
- close;
- EXIT:
- mes "Hello, " + strcharinfo(0);
- mes "So how are things coming along with building up your abilities?";
- mes "Are you strong enough to become a ^800000Crusader^000000 yet?";
- next;
- mes "[^000080Harrison^000000]";
- mes "If you do, you'll find yourself coming back to me for one of the tests.";
- close;
- EXIT2:
- if( getmapusers("job_cru.gat") != 0 ) goto PART2A;
- mes "Well done!";
- set Job_CR,13;
- next;
- mes "Return to ^000080Lothar^000000 and he will make you a ^800000Crusader^000000.";
- close;
-NEXT0:
- if (Class != 2) goto NEXT1;
- mes "It's nice to see you.";
- mes "Hope we'll be able to work together to keep ^00FF00Prontera^000000 safe.";
- close;
-NEXT1:
- if (Class != 3) goto NEXT2;
- mes "Welcome, I hope you have a great day!";
- close;
-NEXT2:
- if (Class != 4) goto NEXT3;
- mes "Good day to you!";
- close;
-NEXT3:
- if (Class != 5) goto NEXT4;
- mes "Hello, sorry but I'm not in need of anything.";
- close;
-NEXT4:
- if (Class != 6) goto NEXT5;
- mes "Don't think you can get away with theft in ^00FF00Prontera^000000, we have soldiers watching everywhere.";
- close;
-NEXT5:
- if (Class != 7) goto NEXT6;
- mes "Welcome!";
- mes "I hope you have a great day!";
- close;
-NEXT6:
- if (Class != 8) goto NEXT7;
- mes "Welcome to ^00FF00Prontera^000000!";
- mes "Hope you have a good day!";
- close;
-NEXT7:
- if (Class != 9) goto NEXT8;
- mes "Hello! Glad to see people of your stature here!";
- close;
-NEXT8:
- if (Class != 10) goto NEXT9;
- mes "I appreciate your presence, but I don't need anything at the moment.";
- mes "Sorry about that.";
- close;
-NEXT9:
- if (Class != 11) goto NEXT10;
- mes "How goes the hunting campaign?";
- mes "Hope everything is going all right.";
- close;
-NEXT10:
- if (Class != 12) goto NEXT11;
- mes "Stay out of trouble, you hear me?";
- close;
-NEXT11:
- if (Class != 14) goto NEXT12;
- mes "Welcome! Good day to you!";
- close;
-NEXT12:
- if (Class != 15) goto NEXT13;
- mes "Good day, I hope your stay in ^00FF00Prontera^000000 will be a peaceful one.";
- close;
-NEXT13:
- if (Class != 16) goto NEXT14;
- mes "It's good to see people of your stature here in ^00FF00Prontera^000000!";
- close;
-NEXT14:
- if (Class != 17) goto NEXT15;
- mes "Be careful if you don't want to get caught.";
- mes "I don't want to have to hang you or something.";
- close;
-NEXT15:
- if (Class != 18) goto NEXT16;
- mes "I hope the experiments in ^00FF00Al de Baran^000000 are legal, or we'll have to send someone to clear it up.";
- close;
-NEXT16:
- if (Class != 19) goto NEXT17;
- mes "Ah, what a fine day it is to have such a person as yourself to come and visit.";
- close;
-NEXT17:
- if (Class != 20) goto NEXT18;
- mes "Welcome, good day to you!";
- close;
-NEXT18:
- if (Class != 22) goto NEXT19;
- if (Gender != 0) goto MALE;
- mes "Wow! Congratulations on your marriage!";
- close;
- MALE:
- mes "Well done! I congratulate you upon your marriage!";
- close;
-NEXT19:
- mes "Good day to you!";
- close;
-}
-
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Entry A - Crusader Job Quest - Patience Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-
-job_cru.gat,23,42,0 script dead -1,{
- killmonster "job_cru.gat","dead";
- enablenpc "Test_2";
- warp "prt_castle.gat",162,27;
-}
-
-
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Entry - Crusader Job Quest - Patience Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-job_cru.gat,23,42,0 script Test_2 139,8,8,{
-
- if (Job_CR != 6) goto EXIT;
- set @CR_etmp,1;
- announce "Please endure here and go to exit",8;
-
- monster "job_cru.gat",10,43,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",14,47,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",26,46,"Injustice",1446,1,"dead";
- monster "job_cru.gat",31,46,"Requium",1468,1,"dead";
- monster "job_cru.gat",16,52,"Raydric Archer",1453,0,"dead";
- monster "job_cru.gat",22,53,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",28,49,"Injustice",1446,1,"dead";
- monster "job_cru.gat",12,54,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",17,55,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",21,57,"Injustice",1446,1,"dead";
- monster "job_cru.gat",30,58,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",11,64,"Raydric Archer",1453,1,"dead";
- monster "job_cru.gat",19,67,"Injustice",1446,1,"dead";
- monster "job_cru.gat",24,62,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",13,70,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",18,69,"Injustice",1446,1,"dead";
- monster "job_cru.gat",29,67,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",32,68,"Requium",1468,1,"dead";
- monster "job_cru.gat",16,75,"Raydric Archer",1453,1,"dead";
- monster "job_cru.gat",21,74,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",27,76,"Injustice",1446,1,"dead";
- monster "job_cru.gat",14,78,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",19,76,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",24,79,"Requium",1468,1,"dead";
- monster "job_cru.gat",14,83,"Raydric Archer",1453,1,"dead";
- monster "job_cru.gat",18,85,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",22,84,"Injustice",1446,1,"dead";
- monster "job_cru.gat",33,86,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",13,89,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",17,92,"Injustice",1446,1,"dead";
- monster "job_cru.gat",23,90,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",26,88,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",17,97,"Khalitzburg",1438,1,"dead";
- monster "job_cru.gat",23,100,"Injustice",1446,1,"dead";
- monster "job_cru.gat",31,101,"Ghoul",1423,1,"dead";
- monster "job_cru.gat",13,103,"Raydric Archer",1453,1,"dead";
- monster "job_cru.gat",22,105,"Injustice",1446,1,"dead";
- monster "job_cru.gat",30,107,"Khalitzburg",1438,1,"dead";
- disablenpc "Test_2";
- end;
- EXIT:
- warp "prt_castle.gat",162,27;
-}
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Exit - Crusader Job Quest - Patience Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-job_cru.gat,23,109,0 script Exit_1 139,1,1,{
-
-if (@CR_etmp == 0) goto JUMP;
- set Job_CR,7;
- enablenpc "Test_2";
-JUMP:
- warp "prt_castle.gat",162,28;
-}
-
-
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Fighting Area - Crusader Job Quest - 4th Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-
-job_cru.gat,167,175,0 script kill -1,{
-
- if (@cru2 == 43) goto good;
-
- set @cru2,@cru2 +1;
- announce " You killed another monster",3;
- end;
-
- good:
- announce " You killed all monster, you may go to exit",3;
- end;
-}
-
-
-job_cru.gat,167,175,0 script Test_4 139,1,1,{
-
- if(Job_CR != 12) goto EXIT;
- set @CRU2,1;
- announce "Defeat all the enemies.",3;
- monster "job_cru.gat",163,42,"Bongun",1188,1,"kill";
- monster "job_cru.gat",171,66,"Bongun",1188,1,"kill";
- monster "job_cru.gat",163,89,"Bongun",1188,1,"kill";
- monster "job_cru.gat",171,115,"Bongun",1188,1,"kill";
- monster "job_cru.gat",166,141,"Bongun",1188,1,"kill";
- monster "job_cru.gat",168,166,"Bongun",1188,1,"kill";
- monster "job_cru.gat",164,170,"Munak",1026,1,"kill";
- monster "job_cru.gat",173,153,"Munak",1026,1,"kill";
- monster "job_cru.gat",164,138,"Munak",1026,1,"kill";
- monster "job_cru.gat",166,128,"Munak",1026,1,"kill";
- monster "job_cru.gat",171,117,"Munak",1026,1,"kill";
- monster "job_cru.gat",163,102,"Munak",1026,1,"kill";
- monster "job_cru.gat",172,84,"Munak",1026,1,"kill";
- monster "job_cru.gat",162,76,"Munak",1026,1,"kill";
- monster "job_cru.gat",167,65,"Munak",1026,1,"kill";
- monster "job_cru.gat",171,58,"Munak",1026,1,"kill";
- monster "job_cru.gat",162,48,"Munak",1026,1,"kill";
- monster "job_cru.gat",170,33,"Munak",1026,1,"kill";
- monster "job_cru.gat",170,26,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",166,37,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",171,47,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",165,61,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",172,65,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",163,77,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",164,86,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",165,98,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",170,101,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",163,110,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",164,117,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",166,129,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",165,139,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",166,151,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",168,160,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",162,169,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",171,171,"Skeleton",1076,1,"kill";
- monster "job_cru.gat",162,32,"Zombie",1015,1,"kill";
- monster "job_cru.gat",165,51,"Zombie",1015,1,"kill";
- monster "job_cru.gat",172,73,"Zombie",1015,1,"kill";
- monster "job_cru.gat",170,92,"Zombie",1015,1,"kill";
- monster "job_cru.gat",173,111,"Zombie",1015,1,"kill";
- monster "job_cru.gat",170,124,"Zombie",1015,1,"kill";
- monster "job_cru.gat",171,147,"Zombie",1015,1,"kill";
- monster "job_cru.gat",163,162,"Zombie",1015,1,"kill";
- disablenpc "Test_4";
- EXIT:
- end;
-}
-
-
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-//
-// Test 4 Exit - Crusader Job Quest - 4th Test
-// By Black Dragon based on the information at RagnaInfo
-//
-//-----------------------------------------------------------------------------------------------------------------------------------------------------
-job_cru.gat,167,17,0 script Exit4 139,2,2,{
-enablenpc "Test_4";
-warp "prt_in.gat",81,100;
-}
+////===== eAthena Script =======================================
+//= Crusader Quest
+//===== By: ==================================================
+//= Made by: Black Dragon
+//= Converted by: Shin
+//=
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 0.5.2 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Need optimalization and fixing
+//= thanks to Komurka, KiLLaLeN, Lupus (fixing error)
+//= just a temp Job Quest
+//============================================================
+
+prt_castle.gat,178,99,6 script Lothar 752,{
+ mes "[^000080Lothar^000000]";
+ if (Class > 0) goto NEXT_0;
+ if (Class == 0) goto NOV;
+ mes "Hello "+ strcharinfo(0);
+ mes "I see that you've registered to the ^008000Swordsman's Association^000000.";
+ TALK:
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "If you become a ^800000Swordsman^000000, you will gain the privelege of becoming a ^800000Knight^000000 or ^800000Crusader^000000.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "If you decide to go along the path of the ^800000Crusader^000000, come back here.";
+ mes "Just take note that you must obtain a job level of at least 40 first before you can move up to the 2nd job.";
+ close;
+ NOV:
+ mes "Hello there.";
+ goto TALK;
+NEXT_0:
+ if (Class > 1) goto NEXT0;
+ if (Job_CR == 1) goto CONT;
+ if (Job_CR == 2) goto CONT0;
+ if (Job_CR == 3) goto CONT1;
+ if (Job_CR == 4) goto CONT2;
+ if (Job_CR > 4) goto CONT3;
+ mes "Welcome, can I help you with something?";
+ next;
+ menu "I want to become a ^800000Crusader^000000.",JOB,"What's being a ^800000Crusader^000000 like?",ASK,"What is the purpose of a ^800000Crusader^000000?",ASK0,"I was just looking around.",-;
+ mes "[^000080Lothar^000000]";
+ mes "Oh, all right.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "If you decide to take the path of the ^800000Crusader^000000, feel free to come back.";
+ close;
+ JOB:
+ mes "[^000080Lothar^000000]";
+ mes "All right, let me take a look at you first.";
+ next;
+ mes "[^000080Lothar^000000]";
+ if (readparam(55) != 50) goto SKIP;
+ set JLCC,1;
+ set Job_CR,5;
+ goto TEST1;
+ SKIP:
+ if (readparam(55) > 39) goto OKAY;
+ mes "[^000080Lothar^000000]";
+ mes "I'm sorry, but you need to be at least at a job level of 40.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "All 2nd jobs require that.";
+ close;
+ OKAY:
+ if (SkillPoint == 0) goto OKAY0;
+ JOB0:
+ mes "[^000080Lothar^000000]";
+ mes "In order to become a ^800000Crusader^000000, you have to have used all your available skill points first.";
+ close;
+ OKAY0:
+ mes "[^000080Lothar^000000]";
+ mes "Everything looks all right.";
+ set Job_CR,1;
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "All right, shall we begin the tests?";
+ next;
+ menu "Yes, of course.",OKAY1,"Not yet.",-;
+ mes "[^000080Lothar^000000]";
+ mes "Oh, all right. Come back when you're ready.";
+ close;
+ OKAY1:
+ if (SkillPoint != 0) goto JOB0;
+ set Job_CR,2;
+ mes "[^000080Lothar^000000]";
+ mes "All right, the first test requires you to collect items.";
+ next;
+ set Job_CR, rand (2);
+ set Job_CR,Job_CR + 3;
+ mes "[^000080Lothar^000000]";
+ mes "Bring back the following items:";
+ if (Job_CR != 3) goto IT;
+ mes "- 10 ^FF0000Decayed Nail^000000";
+ mes "- 10 ^FF0000Danggies^000000";
+ mes "- 10 ^FF0000Stinky Scales^000000";
+ mes "- 10 ^FF0000Mementos^000000";
+ close;
+ IT:
+ mes "- 10 ^FF0000Decayed Nail^000000";
+ mes "- 10 ^FF0000Danggies^000000";
+ mes "- 10 ^FF0000Stinky Scales^000000";
+ mes "- 10 ^FF0000Mementos^000000";
+ close;
+
+ ASK:
+ mes "[^000080Lothar^000000]";
+ mes "To be a ^800000Crusader^000000 is to fight for the righteous people.";
+ mes "Not always those who are in power, but rather for the justly cause.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "I hope that you consider to become one.";
+ mes "To fight for good is a job that should be done by everyone to some extent.";
+ close;
+ ASK0:
+ mes "[^000080Lothar^000000]";
+ mes "The purpose of a ^800000Crusader^000000 is to work for the good in the world.";
+ mes "A ^800000Crusader^000000 is a person of righteousness at work.";
+ close;
+ CONT:
+ mes "Have you changed your mind?";
+ next;
+ menu "Yes, I want to become a ^800000Crusader^000000.",JOB,"Sorry, but I don't want to.",-;
+ mes "[^000080Lothar^000000]";
+ mes "I see... That's a shame.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "Come back if you do want to.";
+ close;
+ CONT0:
+ mes "Well, hm...";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "I was expecting that someone like you would pass.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "Mind to try again?";
+ next;
+ menu "Yes, of course.",OKAY1,"No, I'm all right.",-;
+ mes "[^000080Lothar^000000]";
+ mes "Oh, all right.";
+ close;
+ CONT1:
+ set @item,0;
+ if(countitem(957)>=10) goto ITEM7;//Items: Decayed Nail,
+ mes "- 10 ^FF0000Decayed Nails^000000";
+ set @item, item +1;
+ ITEM7:
+ if(countitem(901)>=10) goto ITEM8;//Items: Danggie,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Danggies^000000";
+ set @item, item +1;
+ ITEM8:
+ if(countitem(959)>=10) goto ITEM9;//Items: Stinky Scale,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Stinky Scales^000000";
+ set @item, item +1;
+ ITEM9:
+ if(countitem(934)>=10) goto ITEM10;//Items: Memento,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Mementos^000000";
+ set @item, item +1;
+ ITEM10:
+ if (@item == 0) goto DONE;
+ close;
+ DONE:
+ mes "Good job!";
+ mes "You collected everything!";
+ delitem 957,10;//Items: Decayed Nail,
+ delitem 901,10;//Items: Danggie,
+ delitem 959,10;//Items: Stinky Scale,
+ delitem 934,10;//Items: Memento,
+ set Job_CR,5;
+ TEST1:
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "All right, let's move on to the 2nd test.";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "Go to the prison, it's in the basement";
+ mes "Before you do, make sure that you bring a ^FF0000Rosary^000000 with you.";
+ close;
+ CONT2:
+ set @item, 0;
+ if(countitem(932)>=10) goto ITEM11;//Items: Skel-Bone,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Skel-Bones^000000";
+ set @item, item +1;
+ ITEM11:
+ if(countitem(1043)>=10) goto ITEM12;//Items: Orc Claw,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Orc Claws^000000";
+ set @item, item +1;
+ ITEM12:
+ if(countitem(2408)>=1) goto ITEM13;//Items: Ball'n'Chain,
+ mes "You still miss the this item";
+ mes "- 1 ^FF0000Ball 'n Chain^000000";
+ set @item, item +1;
+ ITEM13:
+ if(countitem(901)>=10) goto ITEM14;//Items: Danggie,
+ mes "You still miss the this item";
+ mes "- 10 ^FF0000Danggie^000000";
+ set @item, item +1;
+ ITEM14:
+ if (@item== 0) GOTO DONE0;
+ close;
+ DONE0:
+ mes "Good job!";
+ mes "You collected everything!";
+ delitem 932,10;//Items: Skel-Bone,
+ delitem 1043,10;//Items: Orc Claw,
+ delitem 2408,1;//Items: Ball'n'Chain,
+ delitem 901,10;//Items: Danggie,
+ set Job_CR,5;
+ goto TEST1;
+ CONT3:
+ if (Job_CR == 8) goto CONT4;
+ if (Job_CR > 8) goto CONT5;
+ mes "Please talk to the man in the prison to continue.";
+ mes "Make sure you bring a ^FF0000Rosary^000000 with you.";
+ close;
+ CONT4:
+ mes "Great job in accomplishing the ^FF8000Patience Test^000000!";
+ next;
+ mes "[^000080Lothar^000000]";
+ mes "Now to move on to the ^FF8000Knowledge Test^000000.";
+ mes "Please talk to the Knight at the Cathedral, he will test your knowledge.";
+ set Job_CR,9;
+ close;
+ CONT5:
+ if (Job_CR == 13) goto CONT6;
+ if (Job_CR == 14) goto CONT7;
+ mes "Please go talk to the Knight at the Cathedral to continue.";
+ close;
+ CONT6:
+ mes "Excellent work in completing all the necessary tests!";
+ mes "Now let me examine you before you become a ^800000Crusader^000000.";
+ next;
+ set Job_CR,14;
+ mes "[^000080Lothar^000000]";
+ CONT7:
+ if (SkillPoint == 0) goto GOOD;
+ mes "I'm sorry, but you'll need to use up all your skill points first.";
+ close;
+ GOOD:
+ mes "This is to compliment your job change.";
+ if (JLCC != 1) goto OTHR;
+ getitem (1408),1;
+ goto END_0;
+ OTHR:
+ getitem (1409),1;
+ END_0:
+ jobchange 14;// Job: Job_Crusader
+ set JobLevel,JobLevel+1;
+ callfunc "F_ClearJobVar"; // clears all job variables for the current player
+ close;
+NEXT0:
+ if (Class != 2) goto NEXT1;
+ mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
+ mes "Hope you have a good day!";
+ close;
+NEXT1:
+ if (Class != 3) goto NEXT2;
+ mes "Good luck in your hunting.";
+ close;
+NEXT2:
+ if (Class != 4) goto NEXT3;
+ mes "Good day to you!";
+ mes "Hope you do well to find your path.";
+ close;
+NEXT3:
+ if (Class != 5) goto NEXT4;
+ mes "Hello, we don't currently need anything, sorry about that.";
+ close;
+NEXT4:
+ if (Class != 6) goto NEXT5;
+ mes "Better watch yourself.";
+ close;
+NEXT5:
+ if (Class != 7) goto NEXT6;
+ mes "Good day to you, " + strcharinfo(0);
+ close;
+NEXT6:
+ if (Class != 8) goto NEXT7;
+ mes "Good day, "+ strcharinfo(0);
+ mes "I would hope to believe that all is going well.";
+ close;
+NEXT7:
+ if (Class != 9) goto NEXT8;
+ mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
+ mes "Nice to have you wish us.";
+ close;
+NEXT8:
+ if (Class != 10) goto NEXT9;
+ mes "Hello, we're not in need of any weapons or armour at the moment, thank you.";
+ close;
+NEXT9:
+ if (Class != 11) goto NEXT10;
+ mes "Hello, wish you luck for your success.";
+ close;
+NEXT10:
+ if (Class != 12) goto NEXT11;
+ mes "Stay out of trouble, you don't want the guards to come after you, now do you?";
+ close;
+NEXT11:
+ if (Class != 14) goto NEXT12;
+ mes "Good day, "+ strcharinfo(0);
+ close;
+NEXT12:
+ if (Class != 15) goto NEXT13;
+ mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
+ close;
+NEXT13:
+ if (Class != 16) goto NEXT14;
+ mes "Welcome to the ^008000Castle of Prontera^000000, I hope you enjoy your stay.";
+ close;
+NEXT14:
+ if (Class != 17) goto NEXT15;
+ mes "Stay out of trouble if you know what's good for you.";
+ close;
+NEXT15:
+ if (Class != 18) goto NEXT16;
+ mes "So, how are the experiments going down in ^00FF00Al de Baran^000000?";
+ close;
+NEXT16:
+ if (Class != 19) goto NEXT17;
+ mes "Welcome to the castle, good sir.";
+ close;
+NEXT17:
+ if (Class != 20) goto NEXT18;
+ mes "Good day, miss.";
+ close;
+NEXT18:
+ if (Class != 22) goto NEXT19;
+ if (Gender != 0) goto MALE;
+ mes "Hello, welcome to the ^008000Castle of Prontera^000000.";
+ close;
+ MALE:
+ mes "Well done, sir!";
+ close;
+NEXT19:
+ mes "Hello and good day!";
+ close;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Man in Pain - Crusader Job Quest - 2nd Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+prt_castle.gat,163,33,0 script Man in Pain 107,{
+
+ if (Job_CR == 7) goto CONT;
+ if (Job_CR > 7) goto CONT0;
+ mes "[^000080Man in Pain^000000]";
+ mes "Who... who are you?";
+ next;
+ if (Job_CR == 5) goto CHECK;
+
+ OTHER:
+ if (Job_CR == 6) goto EXIT1;
+ mes "[^000080Man in Pain^000000]";
+ mes "What do you want?";
+ mes "Leave me alone~!";
+ close;
+ CHECK:
+ if (countitem(2608) == 0) goto NOT;//Items: Rosary,
+
+ mes "[^000080Man in Pain^000000]";
+ mes "I see, you're here for the job.";
+ next;
+ mes "[^000080Man in Pain^000000]";
+ mes "It's torture.";
+ mes "They send me to that room time and time again.";
+ next;
+ mes "[^000080Man in Pain^000000]";
+ mes "I've grown awefully weak from it.";
+ next;
+ mes "[^000080Man in Pain^000000]";
+ mes "But if it's your wish, I will send to there.";
+ next;
+ menu "Yes.",-,"On second thought...",EXIT;
+ mes "[^000080Man in Pain^000000]";
+ mes "All right then... I'll tell you where to go.";
+ GO:
+ next;
+ savepoint "prt_castle.gat",162,27;
+ if (getmapusers("job_cru.gat") > 0) goto EXIT0;
+ set Job_CR,6;
+ warp "job_cru.gat",23,42;
+ EXIT0:
+ mes "[^000080Man in Pain^000000]";
+ mes "I'm sorry, there's already another person there right now.";
+ mes "Please wait a little longer.";
+ close;
+ EXIT:
+ mes "[^000080Man in Pain^000000]";
+ mes "Please do not disturb me then!";
+ close;
+ NOT:
+ mes "[^000080Man in Pain^000000]";
+ mes "Leave me alone!";
+ mes "Can't you leave someone in pain alone ?";
+ close;
+
+ CONT:
+ mes "[^000080Man in Pain^000000]";
+ mes "I see you've passed. Good work.";
+ set Job_CR,8;
+ close;
+ EXIT1:
+ mes "[^000080Man in Pain^000000]";
+ mes "Sorry but you're going to need to go again.";
+ goto GO;
+ CONT0:
+ mes "[^000080Man in Pain^000000]";
+ mes "There is nothing else you need from me.";
+ mes "Let me be...";
+ close;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Arthur - Crusader Job Quest - Knowledge Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+prt_church.gat,94,116,0 script Arthur 56,{
+ mes "[^000080Arthur^000000]";
+ if (Class != 0) goto NEXT_o;
+ mes "Hello young traveler.";
+ close;
+NEXT_o:
+ if (Class != 1) goto NEXT0;
+ mes "Hello," + strcharinfo(0);
+ next;
+ if (Job_CR != 9) goto EXIT;
+ BEGIN:
+ menu "Take the Knowledge test.",-,"Nothing.",EXIT;
+ mes "[^000080Arthur^000000]";
+ mes "Oh, on your way to become a ^800000Crusader^000000 huh?";
+ mes "Okay...";
+ next;
+ START:
+ set @Q , 0;
+ set @Q1 , 0;
+ set @Q2 , 0;
+ set @Q3 , 0;
+ set @Q4 , 0;
+ set @Q5 , 0;
+ set @Q6 , 0;
+ set @Q7 , 0;
+ set @Q8 , 0;
+ set @Q9 , 0;
+ set @Q10 , 0;
+ set @Q11 , 0;
+ set @Q12 , 0;
+ set @Q13 , 0;
+ set @Q14 , 0;
+ set @Q15 , 0;
+ set @Q16 , 0;
+ set @Q17 , 0;
+ set @Q18 , 0;
+ set @Q19 , 0;
+ set @Q20 , 0;
+ set @ANS , 0;
+ RND:
+ if (@Q > 10) goto DONE;
+ set @RND, rand(20);
+ if (@RND > 9) goto G1;
+ if (@RND > 4) goto G1A;
+ if (@RND > 3) goto G1A1;
+ if (@RND == 0) goto Q1;
+ if (@RND == 1) goto Q2;
+ if (@RND != 1) goto Q3;
+ G1A1:
+ if (@RND == 3) goto Q4;
+ if (@RND != 3) goto Q5;
+ G1A:
+ if (@RND > 8) goto G1A2;
+ if (@RND == 5) goto Q6;
+ if (@RND == 6) goto Q7;
+ if (@RND != 6) goto Q8;
+ G1A2:
+ if (@RND == 8) goto Q9;
+ if (@RND != 8) goto Q10;
+ G1:
+ if (@RND > 14) goto G2A;
+ if (@RND > 13) goto G2A1;
+ if (@RND == 10) goto Q11;
+ if (@RND == 11) goto Q12;
+ if (@RND == 12) goto Q13;
+ G2A1:
+ if (@RND == 13) goto Q14;
+ if (@RND == 14) goto Q15;
+ G2A:
+ if (@RND > 18) goto G2A2;
+ if (@RND == 15) goto Q16;
+ if (@RND == 16) goto Q17;
+ if (@RND == 17) goto Q18;
+ G2A2:
+ if (@RND == 18) goto Q19;
+ if (@Q20 != 0) goto RND;
+ set @Q20,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Are you willing to risk your life to save someone else?";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q1:
+ if (@Q1 != 0) goto RND;
+ set @Q1,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "If someone asks you to help them for a good cause, will you oblige?";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS, @ANS + 1;
+ goto RND;
+ Q2:
+ if (@Q2 != 0) goto RND;
+ set @Q2, 1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Would you allow a robber to get away with stolen goods?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q3:
+ if (@Q3 != 0) goto RND;
+ set @Q3,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Do you wish that the world was at harmony?";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q4:
+ if (@Q4 != 0) goto RND;
+ set @Q4,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Will you ever attempt suicide?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q5:
+ if (@Q5 != 0) goto RND;
+ set @Q5,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Will you intoxicate yourself at parties?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q6:
+ if (@Q6 != 0) goto RND;
+ set @Q6,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Will you openly massacre?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q7:
+ if (@Q7 != 0) goto RND;
+ set @Q7,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Will you hold your temper during arguments?";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q8:
+ if (@Q8 != 0) goto RND;
+ set @Q8,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "Would you allow alchemists to perform illegal experiments?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q9:
+ if (@Q9 != 0) goto RND;
+ set @Q9,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "If someone threw a stone at you, you'd become furious.";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q10:
+ if (@Q10 != 0) goto RND;
+ set @Q10,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "If someone offered you money that belongs to someone poor, would you take it?";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q11:
+ if (@Q11 != 0) goto RND;
+ set @Q11,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You think highly of yourself.";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q12:
+ if (@Q12 != 0) goto RND;
+ set @Q12,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You are humble before others.";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q13:
+ if (@Q13 != 0) goto RND;
+ set @Q13,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You answer people full of respect and with kindness.";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q14:
+ if (@Q14 != 0) goto RND;
+ set @Q14,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You fight when you feel like it.";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q15:
+ if (@Q15 != 0) goto RND;
+ set @Q15,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You go to the pub every night.";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q16:
+ if (@Q16 != 0) goto RND;
+ set @Q16,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You believe in the Father, Son and Holy Spirit.";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q17:
+ if (@Q17 != 0) goto RND;
+ set @Q17,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You believe that the Devil is evil and cruel and should be treated the same way.";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q18:
+ if (@Q18 != 0) goto RND;
+ set @Q18,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "You believe that talk is for wimps and that action plays the main role in peace-making";
+ next;
+ menu "Yes",RND,"No",-;
+ set @ANS,@ANS + 1;
+ goto RND;
+ Q19:
+ if (@Q19 != 0) goto RND;
+ set @Q19,1;
+ set @Q,@Q + 1;
+ mes "[^000080Arthur^000000]";
+ mes "If all other means to keep peace fail, THEN it is all right to resort to violence.";
+ next;
+ menu "Yes",-,"No",RND;
+ set @ANS,@ANS + 1;
+ goto RND;
+ DONE:
+ mes "[^000080Arthur^000000]";
+ mes "You got "+ @ANS +" / 10 questions correct.";
+ next;
+ if (Job_CR != 10) goto secND;
+ if (@ANS < 8) goto NO;
+ PASS:
+ mes "[^000080Arthur^000000]";
+ mes "Excellent work! You qualify to pass the ^FF8000Knowledge Test^000000!";
+ mes "You're almost done, you are now at the ^FF8000Purification Test^000000, find the Guardian Knight at ^008000Prontera Castle^000000.";
+ set Job_CR, 11;
+ close;
+ NO:
+ set Job_CR, 10;
+ mes "[^000080Arthur^000000]";
+ mes "I'm sorry, you didn't get enough to qualify.";
+ next;
+ mes "[^000080Arthur^000000]";
+ mes "Try giving it another go when you feel you're ready.";
+ mes "I'll only expect you to get at least 8 correct from now on.";
+ close;
+ secND:
+ if (@ANS > 7) goto PASS;
+ mes "[^000080Arthur^000000]";
+ mes "I'm sorry, you didn't get enough correct.";
+ close;
+ EXIT:
+ if (Job_CR == 10) goto BEGIN;
+ if (Job_CR > 10) goto FINISH;
+ close;
+ FINISH:
+ mes "[^000080Arthur^000000]";
+ mes "Please go to the Guardian Knight at ^008000Prontera Castle^000000 to continue on to the ^FF8000Purification Test^000000.";
+ close;
+NEXT0:
+ if (Class != 2) goto NEXT1;
+ mes "Hello, welcome to the ^008000Prontera ChivalryY^000000.";
+ mes "Hope you have a good day!";
+ close;
+NEXT1:
+ if (Class != 3) goto NEXT2;
+ mes "Good luck in your hunting.";
+ close;
+NEXT2:
+ if (Class != 4) goto NEXT3;
+ mes "Good day to you!";
+ mes "Hope you do well to find your path.";
+ close;
+NEXT3:
+ if (Class != 5) goto NEXT4;
+ mes "Hello, we don't currently need anything, sorry about that.";
+ close;
+NEXT4:
+ if (Class != 6) goto NEXT5;
+ mes "Better watch yourself.";
+ close;
+NEXT5:
+ if (Class != 7) goto NEXT6;
+ mes "Good day to you, "+ strcharinfo(0);
+ close;
+NEXT6:
+ if (Class != 8) goto NEXT7;
+ mes "Good day, " + strcharinfo(0);
+ mes "I would hope to believe that all is going well.";
+ close;
+NEXT7:
+ if (Class != 9) goto NEXT8;
+ mes "Hello! Nice to have you wish us.";
+ close;
+NEXT8:
+ if (Class != 10) goto NEXT9;
+ mes "Hello, we're not in need of any weapons or armour at the moment, thank you.";
+ close;
+NEXT9:
+ if (Class != 11) goto NEXT10;
+ mes "Hello, wish you luck for your success.";
+ close;
+NEXT10:
+ if (Class != 12) goto NEXT11;
+ mes "Stay out of trouble, you don't want the guards to come after you, now do you?";
+ close;
+NEXT11:
+ if (Class != 14) goto NEXT12;
+ mes "Good day" + strcharinfo(0);
+ close;
+NEXT12:
+ if (Class != 15) goto NEXT13;
+ mes "Hello, welcome to the ^008000Knight's Headquarters^000000.";
+ close;
+NEXT13:
+ if (Class != 16) goto NEXT14;
+ mes "Welcome to the ^008000Knight's Headquarters^000000, I hope you enjoy your stay.";
+ close;
+NEXT14:
+ if (Class != 17) goto NEXT15;
+ mes "Stay out of trouble if you know what's good for you.";
+ close;
+NEXT15:
+ if (Class != 18) goto NEXT16;
+ mes "So, how are the experiments going down in ^00FF00Al de Baran^000000?";
+ close;
+NEXT16:
+ if (Class != 19) goto NEXT17;
+ mes "Welcome to the castle, good sir.";
+ close;
+NEXT17:
+ if (Class != 20) goto NEXT18;
+ mes "Good day, miss.";
+ close;
+NEXT18:
+ if (Class != 22) goto NEXT19;
+ if (Gender != 0) goto MALE;
+ mes "Hello, welcome to the ^008000Knight's Headquarters^000000.";
+ close;
+ MALE:
+ mes "Well done, sir!";
+ close;
+NEXT19:
+ mes "Hello and good day!";
+ close;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Harrison - Crusader Job Quest - Purification Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+prt_in.gat,83,97,0 script Harrison 734,{
+ mes "[^000080Harrison^000000]";
+ if (Class != 0) goto NEXT_o;
+ mes "Hello, young traveler.";
+ mes "Welcome.";
+ close;
+NEXT_o:
+ if (Class != 1) goto NEXT0;
+ if (Job_CR == 11) goto PART1;
+ if (Job_CR == 12) goto PART2;
+ if (Job_CR != 13) goto EXIT;
+ mes "Well done!";
+ mes "Go talk to ^000080Lothar^000000, he will turn you into a ^800000Crusader^000000.";
+ close;
+ PART2:
+ if (@cru2 == 43) goto EXIT2;
+ PART2A:
+ mes "So, do you want to try again?";
+ next;
+ menu "Yes",TEST,"No",-;
+ mes "[^000080Harrison^000000]";
+ mes "Oh, okay then.";
+ close;
+ PART1:
+ mes "Hello, " + strcharinfo(0);
+ mes "I see that you've passed thus far.";
+ next;
+ mes "[^000080Harrison^000000]";
+ mes "Don't let me down in this test.";
+ mes "This is the ^FF8000Purification Test^000000.";
+ mes "I will take you to the proper location when you are ready.";
+ next;
+ menu "I want to go now.",-,"All right, just a second.",EXIT0;
+ TEST:
+ mes "[^000080Harrison^000000]";
+ mes "Let me make sure it's empty first.";
+ next;
+ if( getmapusers("job_cru.gat")>0 ) goto EXIT1;
+ savepoint "prt_in.gat",81,100;
+ set Job_CR, 12;
+ warp "job_cru",167,175;
+ EXIT1:
+ mes "[^000080Harrison^000000]";
+ mes "I'm sorry, but someone else is inside at the moment.";
+ close;
+ EXIT0:
+ mes "[^000080Harrison^000000]";
+ mes "No problem, take as long as you need.";
+ close;
+ EXIT:
+ mes "Hello, " + strcharinfo(0);
+ mes "So how are things coming along with building up your abilities?";
+ mes "Are you strong enough to become a ^800000Crusader^000000 yet?";
+ next;
+ mes "[^000080Harrison^000000]";
+ mes "If you do, you'll find yourself coming back to me for one of the tests.";
+ close;
+ EXIT2:
+ if( getmapusers("job_cru.gat") != 0 ) goto PART2A;
+ mes "Well done!";
+ set Job_CR,13;
+ next;
+ mes "Return to ^000080Lothar^000000 and he will make you a ^800000Crusader^000000.";
+ close;
+NEXT0:
+ if (Class != 2) goto NEXT1;
+ mes "It's nice to see you.";
+ mes "Hope we'll be able to work together to keep ^00FF00Prontera^000000 safe.";
+ close;
+NEXT1:
+ if (Class != 3) goto NEXT2;
+ mes "Welcome, I hope you have a great day!";
+ close;
+NEXT2:
+ if (Class != 4) goto NEXT3;
+ mes "Good day to you!";
+ close;
+NEXT3:
+ if (Class != 5) goto NEXT4;
+ mes "Hello, sorry but I'm not in need of anything.";
+ close;
+NEXT4:
+ if (Class != 6) goto NEXT5;
+ mes "Don't think you can get away with theft in ^00FF00Prontera^000000, we have soldiers watching everywhere.";
+ close;
+NEXT5:
+ if (Class != 7) goto NEXT6;
+ mes "Welcome!";
+ mes "I hope you have a great day!";
+ close;
+NEXT6:
+ if (Class != 8) goto NEXT7;
+ mes "Welcome to ^00FF00Prontera^000000!";
+ mes "Hope you have a good day!";
+ close;
+NEXT7:
+ if (Class != 9) goto NEXT8;
+ mes "Hello! Glad to see people of your stature here!";
+ close;
+NEXT8:
+ if (Class != 10) goto NEXT9;
+ mes "I appreciate your presence, but I don't need anything at the moment.";
+ mes "Sorry about that.";
+ close;
+NEXT9:
+ if (Class != 11) goto NEXT10;
+ mes "How goes the hunting campaign?";
+ mes "Hope everything is going all right.";
+ close;
+NEXT10:
+ if (Class != 12) goto NEXT11;
+ mes "Stay out of trouble, you hear me?";
+ close;
+NEXT11:
+ if (Class != 14) goto NEXT12;
+ mes "Welcome! Good day to you!";
+ close;
+NEXT12:
+ if (Class != 15) goto NEXT13;
+ mes "Good day, I hope your stay in ^00FF00Prontera^000000 will be a peaceful one.";
+ close;
+NEXT13:
+ if (Class != 16) goto NEXT14;
+ mes "It's good to see people of your stature here in ^00FF00Prontera^000000!";
+ close;
+NEXT14:
+ if (Class != 17) goto NEXT15;
+ mes "Be careful if you don't want to get caught.";
+ mes "I don't want to have to hang you or something.";
+ close;
+NEXT15:
+ if (Class != 18) goto NEXT16;
+ mes "I hope the experiments in ^00FF00Al de Baran^000000 are legal, or we'll have to send someone to clear it up.";
+ close;
+NEXT16:
+ if (Class != 19) goto NEXT17;
+ mes "Ah, what a fine day it is to have such a person as yourself to come and visit.";
+ close;
+NEXT17:
+ if (Class != 20) goto NEXT18;
+ mes "Welcome, good day to you!";
+ close;
+NEXT18:
+ if (Class != 22) goto NEXT19;
+ if (Gender != 0) goto MALE;
+ mes "Wow! Congratulations on your marriage!";
+ close;
+ MALE:
+ mes "Well done! I congratulate you upon your marriage!";
+ close;
+NEXT19:
+ mes "Good day to you!";
+ close;
+}
+
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Entry A - Crusader Job Quest - Patience Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+job_cru.gat,23,42,0 script dead -1,{
+ killmonster "job_cru.gat","dead";
+ enablenpc "Test_2";
+ warp "prt_castle.gat",162,27;
+}
+
+
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Entry - Crusader Job Quest - Patience Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+job_cru.gat,23,42,0 script Test_2 139,8,8,{
+
+ if (Job_CR != 6) goto EXIT;
+ set @CR_etmp,1;
+ announce "Please endure here and go to exit",8;
+
+ monster "job_cru.gat",10,43,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",14,47,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",26,46,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",31,46,"Requium",1468,1,"dead";
+ monster "job_cru.gat",16,52,"Raydric Archer",1453,0,"dead";
+ monster "job_cru.gat",22,53,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",28,49,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",12,54,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",17,55,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",21,57,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",30,58,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",11,64,"Raydric Archer",1453,1,"dead";
+ monster "job_cru.gat",19,67,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",24,62,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",13,70,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",18,69,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",29,67,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",32,68,"Requium",1468,1,"dead";
+ monster "job_cru.gat",16,75,"Raydric Archer",1453,1,"dead";
+ monster "job_cru.gat",21,74,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",27,76,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",14,78,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",19,76,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",24,79,"Requium",1468,1,"dead";
+ monster "job_cru.gat",14,83,"Raydric Archer",1453,1,"dead";
+ monster "job_cru.gat",18,85,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",22,84,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",33,86,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",13,89,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",17,92,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",23,90,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",26,88,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",17,97,"Khalitzburg",1438,1,"dead";
+ monster "job_cru.gat",23,100,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",31,101,"Ghoul",1423,1,"dead";
+ monster "job_cru.gat",13,103,"Raydric Archer",1453,1,"dead";
+ monster "job_cru.gat",22,105,"Injustice",1446,1,"dead";
+ monster "job_cru.gat",30,107,"Khalitzburg",1438,1,"dead";
+ disablenpc "Test_2";
+ end;
+ EXIT:
+ warp "prt_castle.gat",162,27;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Exit - Crusader Job Quest - Patience Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+job_cru.gat,23,109,0 script Exit_1 139,1,1,{
+
+if (@CR_etmp == 0) goto JUMP;
+ set Job_CR,7;
+ enablenpc "Test_2";
+JUMP:
+ warp "prt_castle.gat",162,28;
+}
+
+
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Fighting Area - Crusader Job Quest - 4th Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+job_cru.gat,167,175,0 script kill -1,{
+
+ if (@cru2 == 43) goto good;
+
+ set @cru2,@cru2 +1;
+ announce " You killed another monster",3;
+ end;
+
+ good:
+ announce " You killed all monster, you may go to exit",3;
+ end;
+}
+
+
+job_cru.gat,167,175,0 script Test_4 139,1,1,{
+
+ if(Job_CR != 12) goto EXIT;
+ set @CRU2,1;
+ announce "Defeat all the enemies.",3;
+ monster "job_cru.gat",163,42,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",171,66,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",163,89,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",171,115,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",166,141,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",168,166,"Bongun",1188,1,"kill";
+ monster "job_cru.gat",164,170,"Munak",1026,1,"kill";
+ monster "job_cru.gat",173,153,"Munak",1026,1,"kill";
+ monster "job_cru.gat",164,138,"Munak",1026,1,"kill";
+ monster "job_cru.gat",166,128,"Munak",1026,1,"kill";
+ monster "job_cru.gat",171,117,"Munak",1026,1,"kill";
+ monster "job_cru.gat",163,102,"Munak",1026,1,"kill";
+ monster "job_cru.gat",172,84,"Munak",1026,1,"kill";
+ monster "job_cru.gat",162,76,"Munak",1026,1,"kill";
+ monster "job_cru.gat",167,65,"Munak",1026,1,"kill";
+ monster "job_cru.gat",171,58,"Munak",1026,1,"kill";
+ monster "job_cru.gat",162,48,"Munak",1026,1,"kill";
+ monster "job_cru.gat",170,33,"Munak",1026,1,"kill";
+ monster "job_cru.gat",170,26,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",166,37,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",171,47,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",165,61,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",172,65,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",163,77,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",164,86,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",165,98,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",170,101,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",163,110,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",164,117,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",166,129,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",165,139,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",166,151,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",168,160,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",162,169,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",171,171,"Skeleton",1076,1,"kill";
+ monster "job_cru.gat",162,32,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",165,51,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",172,73,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",170,92,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",173,111,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",170,124,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",171,147,"Zombie",1015,1,"kill";
+ monster "job_cru.gat",163,162,"Zombie",1015,1,"kill";
+ disablenpc "Test_4";
+ EXIT:
+ end;
+}
+
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+//
+// Test 4 Exit - Crusader Job Quest - 4th Test
+// By Black Dragon based on the information at RagnaInfo
+//
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+job_cru.gat,167,17,0 script Exit4 139,2,2,{
+enablenpc "Test_4";
+warp "prt_in.gat",81,100;
+}
diff --git a/npc/jobs/2-2/noquest/crusader.txt b/npc/jobs/2-2/noquest/crusader.txt
index b977baf71..dd569b25d 100644
--- a/npc/jobs/2-2/noquest/crusader.txt
+++ b/npc/jobs/2-2/noquest/crusader.txt
@@ -1,54 +1,54 @@
-//Crusader NPC for Athena by DiaDz
-//1.1 Added SkillPoint check [Lupus]
-
-//Crusader prt_in 88 103
-prt_in.gat,88,103,3 script Crusader Trainer 752,{
- if(Class==14) goto crus;
- if(Class !=1) goto notsword;
-
- mes "[Crusader Trainer]";
-mes "Welcome Have you come to Join our ranks?.";
- next;
- mes "[Crusader Trainer]";
- mes "How may I be of Service to you?";
- next;
- menu "Change Job into a Crusader.",case1,"The Requirements.",case2,"Quit.",case3;
- case1:
- if(JobLevel < 40) goto notlvl;
- mes "[Crusader Trainer]";
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Crusader.";
- if(SkillPoint > 0) close;
- mes "Welcome to the Crusaders Guild";
- jobchange 14;// Job: Job_Crusader
- close;
-
- notlvl:
- mes "[Crusader Trainer]";
- mes "you need to be at least Job level 40";
- close;
-
- case2:
- mes "[Crusader Trainer]";
- mes "You need to be a Swordsman of Job Level 40 to become a Crusader";
- next;
- mes "[Crusader Trainer]";
- mes "We are destined to protect all who live in Midgard";
- close;
-
- case3:
- mes "[Crusader Trainer]";
- mes "Please come again sometime";
- close;
-
- crus:
- mes "[Crusader Trainer]";
- mes "You are already a Mighty Crusader";
- mes "May the Blessings of the Gods go with you";
- close;
-
- notsword:
- mes "[Crusader Trainer]";
- mes "I'm sorry but there is nothing I can help you with.";
- mes "Only stout Swordsman can follow the holy path in order to become a 'Crusader'.";
- close;
-}
+//Crusader NPC for Athena by DiaDz
+//1.1 Added SkillPoint check [Lupus]
+
+//Crusader prt_in 88 103
+prt_in.gat,88,103,3 script Crusader Trainer 752,{
+ if(Class==14) goto crus;
+ if(Class !=1) goto notsword;
+
+ mes "[Crusader Trainer]";
+mes "Welcome Have you come to Join our ranks?.";
+ next;
+ mes "[Crusader Trainer]";
+ mes "How may I be of Service to you?";
+ next;
+ menu "Change Job into a Crusader.",case1,"The Requirements.",case2,"Quit.",case3;
+ case1:
+ if(JobLevel < 40) goto notlvl;
+ mes "[Crusader Trainer]";
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Crusader.";
+ if(SkillPoint > 0) close;
+ mes "Welcome to the Crusaders Guild";
+ jobchange 14;// Job: Job_Crusader
+ close;
+
+ notlvl:
+ mes "[Crusader Trainer]";
+ mes "you need to be at least Job level 40";
+ close;
+
+ case2:
+ mes "[Crusader Trainer]";
+ mes "You need to be a Swordsman of Job Level 40 to become a Crusader";
+ next;
+ mes "[Crusader Trainer]";
+ mes "We are destined to protect all who live in Midgard";
+ close;
+
+ case3:
+ mes "[Crusader Trainer]";
+ mes "Please come again sometime";
+ close;
+
+ crus:
+ mes "[Crusader Trainer]";
+ mes "You are already a Mighty Crusader";
+ mes "May the Blessings of the Gods go with you";
+ close;
+
+ notsword:
+ mes "[Crusader Trainer]";
+ mes "I'm sorry but there is nothing I can help you with.";
+ mes "Only stout Swordsman can follow the holy path in order to become a 'Crusader'.";
+ close;
+}
diff --git a/npc/jobs/2-2/noquest/dancer-bard.txt b/npc/jobs/2-2/noquest/dancer-bard.txt
index 352708ac2..2d0dc8484 100644
--- a/npc/jobs/2-2/noquest/dancer-bard.txt
+++ b/npc/jobs/2-2/noquest/dancer-bard.txt
@@ -1,72 +1,72 @@
-//Dancer/Bard NPC for Athena by DiaDz
-//No Quests, just npc on location
-//1.1 Added SkillPoint check [Lupus]
-
-//Dancer & Bard - Comodo 189 166 4_F_07
-comodo.gat,189,166,4 script Performance Master 741,{
- if(Class==19) goto bard;
- if(Class==20) goto dance;
- if(Class !=3) goto notarch;
-
- mes "[Performance Master]";
- mes "Welcome to Comodo and the Performers Guild.";
- next;
- mes "[Performance Master]";
- mes "What can I do for you , a Song or Dance perhaps?";
- next;
- menu "Change Job into a Bard/Dancer.",case1,"The Requirements.",case2,"Quit.",case3;
- case1:
- if(JobLevel < 40) goto notlvl;
- if(sex==1) goto M;
- mes "[Performance Master]";
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Dancer.";
- if(SkillPoint > 0) close;
- mes "Welcome Glorious Dancer";
- jobchange 20;// Job: Job_Dancer
- close;
-
- M:
- mes "[Performance Master]";
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Bard.";
- if(SkillPoint > 0) close;
- mes "Welcome Master Bard";
- jobchange 19;// Job: Job_Bard
- close;
-
- notlvl:
- mes "[Performance Master]";
- mes "you need to be at least Job level 40";
- close;
-
- case2:
- mes "[Performance Master]";
- mes "Archers of Job Level 40 and above may become Dancers or Bards";
- next;
- mes "[Performance Master]";
- mes "Its a Great Time to become a Bard or Dancer they are in Much demand!";
- mes "You can't miss the perfect chance!";
- close;
-
- case3:
- mes "[Performance Master]";
- mes "Please come again sometime";
- close;
-
- dance:
- mes "[Performance Master]";
- mes "You are already a Glorious Dancer.";
- mes "Roam our world and bring joy and harmony to the masses of Midgard.";
- close;
-
- bard:
- mes "[Performance Master]";
- mes "You are already a Masterful Bard.";
- mes "Roam our world and bring joy and harmony to the masses of Midgard.";
- close;
-
- notarch:
- mes "[Performance Master]";
- mes "I'm sorry but there is nothing I can help you with.";
- mes "Only Archers are nimble and dexterous enough to be as graceful as a 'Dancer' or 'Bard'.";
- close;
-}
+//Dancer/Bard NPC for Athena by DiaDz
+//No Quests, just npc on location
+//1.1 Added SkillPoint check [Lupus]
+
+//Dancer & Bard - Comodo 189 166 4_F_07
+comodo.gat,189,166,4 script Performance Master 741,{
+ if(Class==19) goto bard;
+ if(Class==20) goto dance;
+ if(Class !=3) goto notarch;
+
+ mes "[Performance Master]";
+ mes "Welcome to Comodo and the Performers Guild.";
+ next;
+ mes "[Performance Master]";
+ mes "What can I do for you , a Song or Dance perhaps?";
+ next;
+ menu "Change Job into a Bard/Dancer.",case1,"The Requirements.",case2,"Quit.",case3;
+ case1:
+ if(JobLevel < 40) goto notlvl;
+ if(sex==1) goto M;
+ mes "[Performance Master]";
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Dancer.";
+ if(SkillPoint > 0) close;
+ mes "Welcome Glorious Dancer";
+ jobchange 20;// Job: Job_Dancer
+ close;
+
+ M:
+ mes "[Performance Master]";
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Bard.";
+ if(SkillPoint > 0) close;
+ mes "Welcome Master Bard";
+ jobchange 19;// Job: Job_Bard
+ close;
+
+ notlvl:
+ mes "[Performance Master]";
+ mes "you need to be at least Job level 40";
+ close;
+
+ case2:
+ mes "[Performance Master]";
+ mes "Archers of Job Level 40 and above may become Dancers or Bards";
+ next;
+ mes "[Performance Master]";
+ mes "Its a Great Time to become a Bard or Dancer they are in Much demand!";
+ mes "You can't miss the perfect chance!";
+ close;
+
+ case3:
+ mes "[Performance Master]";
+ mes "Please come again sometime";
+ close;
+
+ dance:
+ mes "[Performance Master]";
+ mes "You are already a Glorious Dancer.";
+ mes "Roam our world and bring joy and harmony to the masses of Midgard.";
+ close;
+
+ bard:
+ mes "[Performance Master]";
+ mes "You are already a Masterful Bard.";
+ mes "Roam our world and bring joy and harmony to the masses of Midgard.";
+ close;
+
+ notarch:
+ mes "[Performance Master]";
+ mes "I'm sorry but there is nothing I can help you with.";
+ mes "Only Archers are nimble and dexterous enough to be as graceful as a 'Dancer' or 'Bard'.";
+ close;
+}
diff --git a/npc/jobs/2-2/noquest/monk.txt b/npc/jobs/2-2/noquest/monk.txt
index 36072dcdd..55ce3f120 100644
--- a/npc/jobs/2-2/noquest/monk.txt
+++ b/npc/jobs/2-2/noquest/monk.txt
@@ -1,54 +1,54 @@
-//Monk NPC for Athena by DiaDz
-//No Quests, just npc on location
-//1.1 Added SkillPoint check [Lupus]
-
-//Monk Job Change Monk_in 99 64 4_M_MONK (new temp 55 cause of error)
-monk_in.gat,99,64,5 script Master Monk 753,{
- if(Class==15) goto monk;
- if(Class !=4) goto notaco;
-
- mes "[Master Monk]";
- mes "Good Day,This is the Monk's Guild.";
- next;
- mes "[Master Monk]";
- mes "How may I be of Service to you?";
- next;
- menu "Change Job into a Monk.",Lcase1,"The Requirements.",Lcase2,"Quit.",Lcase3;
- Lcase1:
- if(JobLevel < 40) goto notlvl;
- mes "[Master Monk]";
- if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Monk.";
- if(SkillPoint > 0) close;
- mes "Your Welcome to Stay here at the Abbey since you are now a Monk.";
- jobchange 15;// Job: Job_Monk
- close;
-
- notlvl:
- mes "[Master Monk]";
- mes "you need to be at least Job level 40";
- close;
-
- Lcase2:
- mes "[Master Monk]";
- mes "You need to be a Acolyte of Job Level 40 to become a Monk";
- next;
- mes "[Master Monk]";
- mes "We Monks are the masters of Hand to Hand Combat";
- close;
-
- Lcase3:
- mes "[Master Monk]";
- mes "Please come again sometime";
- close;
-
- monk:
- mes "[Master Monk]";
- mes "You are already a Monk of much Skill and prowess";
- close;
-
- notaco:
- mes "[Master Monk]";
- mes "I'm sorry but there is nothing I can help you with.";
- mes "Divine fists can only be forged by Divine Acolytes in order to become a 'Monk'.";
- close;
-}
+//Monk NPC for Athena by DiaDz
+//No Quests, just npc on location
+//1.1 Added SkillPoint check [Lupus]
+
+//Monk Job Change Monk_in 99 64 4_M_MONK (new temp 55 cause of error)
+monk_in.gat,99,64,5 script Master Monk 753,{
+ if(Class==15) goto monk;
+ if(Class !=4) goto notaco;
+
+ mes "[Master Monk]";
+ mes "Good Day,This is the Monk's Guild.";
+ next;
+ mes "[Master Monk]";
+ mes "How may I be of Service to you?";
+ next;
+ menu "Change Job into a Monk.",Lcase1,"The Requirements.",Lcase2,"Quit.",Lcase3;
+ Lcase1:
+ if(JobLevel < 40) goto notlvl;
+ mes "[Master Monk]";
+ if(SkillPoint > 0) mes "You need to use up all of your skill points before I can make you a Monk.";
+ if(SkillPoint > 0) close;
+ mes "Your Welcome to Stay here at the Abbey since you are now a Monk.";
+ jobchange 15;// Job: Job_Monk
+ close;
+
+ notlvl:
+ mes "[Master Monk]";
+ mes "you need to be at least Job level 40";
+ close;
+
+ Lcase2:
+ mes "[Master Monk]";
+ mes "You need to be a Acolyte of Job Level 40 to become a Monk";
+ next;
+ mes "[Master Monk]";
+ mes "We Monks are the masters of Hand to Hand Combat";
+ close;
+
+ Lcase3:
+ mes "[Master Monk]";
+ mes "Please come again sometime";
+ close;
+
+ monk:
+ mes "[Master Monk]";
+ mes "You are already a Monk of much Skill and prowess";
+ close;
+
+ notaco:
+ mes "[Master Monk]";
+ mes "I'm sorry but there is nothing I can help you with.";
+ mes "Divine fists can only be forged by Divine Acolytes in order to become a 'Monk'.";
+ close;
+}
diff --git a/npc/jobs/2-2/rogue.txt b/npc/jobs/2-2/rogue.txt
index 15f37ba25..7c7dd099e 100644
--- a/npc/jobs/2-2/rogue.txt
+++ b/npc/jobs/2-2/rogue.txt
@@ -1,943 +1,943 @@
-//===== eAthena Script =======================================
-//= Rogue Job Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== 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: =================================
-//= Working.
-//============================================================
-
-
-
-//=======================================================================================================//
-// Markie: Test 1 and Jobchange //
-//***********************************************************************************************************************************************************//
-in_rogue.gat,363,123,3 script Markie 747,{
-
- mes "[Markie]";
- if(Class == Job_Thief) goto L_Thief;
- if(Class == 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) goto L_Start;
- 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;
-
-L_Start:
- 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, 40; // 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
- 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;
- set @temp, rand(2);
- if(@temp == 1) goto L_QSet2;
-
- L_QSet1:
- 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 "30",-, "40",sM1_1, "160",sM1_1, "20",sM1_1;
-
- set @score, @score + 10;
-
- sM1_1:
-
- mes "[Markie]";
- mes "2) Choose a monster that can detect a hidden or cloaked character?";
- next;
- menu "Worm Tail",-, "Argos",sM1_2, "Mummy",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 ^5533FFStalk^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 ^5533FFSlyness^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, "Stalk",-, "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;
- 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 4;
- 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 1;
- 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 5;
- next;
- mes "[Markie]";
- mes "Tada! Congratulations on becoming a Rogue. You showed a lot of effort and deserve a reward for it......";
- setlook 7,0;
- jobchange Job_Rogue;
- emotion 46;
- 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 == 40) getitem 1219,1; // 2 slott gladius
- if(JBLVL == 50) 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;
-}
-
-
-
-//=======================================================================================================//
-// Mr. Smith: Tests 2 and 3 //
-//***********************************************************************************************************************************************************//
-in_rogue.gat,376,23,3 script Mr. Smith 57,{
-
- mes "[Mr. Smith]";
- if(Class == Job_Thief) goto L_Thief;
- if(Class == 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 16;
- 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 1;
- 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 32;
- close;
-
-
-//----------------------------------------------------------------------------------------------
-L_Test3:
-//---------------
- if(ROGUE_Q2 > 0) goto L_Check3;
- mes "Let me see..... Who should I have you go find........ hmm.........";
- emotion 20;
- 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 5;
- 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 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 "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 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 "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 1;
- next;
- mes "[Mr. Smith]";
- mes "GRRRR!!! That's why you need to WRITE down important things! Geez......";
- emotion 6;
- 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 1;
- 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 0;
- next;
- mes "[Hermanthorn Jr.]";
- mes "Aaaaaaaaaaaaaahhhh!! Go away! Get lost! Otherwise I am gonna KILL YOU!!!";
- emotion 16;
- close;
-}
-
-// --------------------------------------------------------------------------
-cmd_fild09.gat,106,195,0 script Aragham Junior 45,1,1,{
- callfunc "F_RogueTest3", 1, "Aragham", "never", "hoarded", "upgrade items.", 244, 24;
-}
-
-// -----------------------------------------------------------------------------
-cmd_fild09.gat,335,143,0 script Hollgrehen Junior 45,1,1,{
- callfunc "F_RogueTest3", 2, "My father", "never", "hoarded", "upgrade items.", 168, 34;
-}
-
-// ------------------------------------------------------------------------------
-cmd_fild04.gat,304,179,0 script Antonio Junior 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(Class!=Job_Thief || ROGUE_Q<3 || ROGUE_Q2==0) close;
-L_Start:
- 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(ROGUE_Q2 != getarg(0)) goto L_Wrong;
- 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 99,
-{
- callfunc "F_RogueTest4", "Aragham Junior", 245, 27;
-}
-//---------------------------------------------------------------------------
-in_rogue.gat,152,27,6 script Hollgrehen Junior 85,
-{
- callfunc "F_RogueTest4", "Hollgrehen Junior", 160, 32;
-}
-//---------------------------------------------------------------------------
-in_rogue.gat,183,105,4 script Antonio Junior 88,
-{
- callfunc "F_RogueTest4", "Antonio Junior", 175, 107;
-}
-
-// Function for Guildsman =============================
-function script F_RogueTest4 {
-
- if(ROGUE_Q == 4) goto L_Restart;
- mes "[" + getarg(0) + "]";
- mes "Hello there... You must be from the Rogue guild. My name is " + getarg(0) + "...... I am the Rogue of the Desert..............";
- next;
- mes "[" + getarg(0) + "]";
- mes "Aww who am I kidding...... Let's cut the crap. So are you ready to become a rogue?";
- emotion 4;
- next;
- mes "[" + getarg(0) + "]";
- 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(0) + "]";
- 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(0) + "]";
- 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(0) + "]";
- 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(0) + "]";
- mes "Good luck then.";
- next;
- set ROGUE_Q, 4;
- killmonsterall "in_rogue.gat";
- savepoint "in_rogue.gat", getarg(1), getarg(2);
- warp "in_rogue.gat", 15, 105;
- end;
-
- M_End:
- mes "[" + getarg(0) + "]";
- mes ".....................";
- next;
- mes "[" + getarg(0) + "]";
- mes "Well take your time then...... I guess.......";
- close;
-
-L_Restart:
- mes "[" + getarg(0) + "]";
- mes "....... Looks like you got creamed.......";
- emotion 4;
- next;
- mes "[" + getarg(0) + "]";
- 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;
-}
-
-//================================================
-// 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;
-}
-
-
+//===== eAthena Script =======================================
+//= Rogue Job Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== 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: =================================
+//= Working.
+//============================================================
+
+
+
+//=======================================================================================================//
+// Markie: Test 1 and Jobchange //
+//***********************************************************************************************************************************************************//
+in_rogue.gat,363,123,3 script Markie 747,{
+
+ mes "[Markie]";
+ if(Class == Job_Thief) goto L_Thief;
+ if(Class == 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) goto L_Start;
+ 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;
+
+L_Start:
+ 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, 40; // 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
+ 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;
+ set @temp, rand(2);
+ if(@temp == 1) goto L_QSet2;
+
+ L_QSet1:
+ 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 "30",-, "40",sM1_1, "160",sM1_1, "20",sM1_1;
+
+ set @score, @score + 10;
+
+ sM1_1:
+
+ mes "[Markie]";
+ mes "2) Choose a monster that can detect a hidden or cloaked character?";
+ next;
+ menu "Worm Tail",-, "Argos",sM1_2, "Mummy",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 ^5533FFStalk^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 ^5533FFSlyness^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, "Stalk",-, "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;
+ 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 4;
+ 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 1;
+ 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 5;
+ next;
+ mes "[Markie]";
+ mes "Tada! Congratulations on becoming a Rogue. You showed a lot of effort and deserve a reward for it......";
+ setlook 7,0;
+ jobchange Job_Rogue;
+ emotion 46;
+ 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 == 40) getitem 1219,1; // 2 slott gladius
+ if(JBLVL == 50) 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;
+}
+
+
+
+//=======================================================================================================//
+// Mr. Smith: Tests 2 and 3 //
+//***********************************************************************************************************************************************************//
+in_rogue.gat,376,23,3 script Mr. Smith 57,{
+
+ mes "[Mr. Smith]";
+ if(Class == Job_Thief) goto L_Thief;
+ if(Class == 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 16;
+ 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 1;
+ 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 32;
+ close;
+
+
+//----------------------------------------------------------------------------------------------
+L_Test3:
+//---------------
+ if(ROGUE_Q2 > 0) goto L_Check3;
+ mes "Let me see..... Who should I have you go find........ hmm.........";
+ emotion 20;
+ 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 5;
+ 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 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 "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 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 "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 1;
+ next;
+ mes "[Mr. Smith]";
+ mes "GRRRR!!! That's why you need to WRITE down important things! Geez......";
+ emotion 6;
+ 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 1;
+ 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 0;
+ next;
+ mes "[Hermanthorn Jr.]";
+ mes "Aaaaaaaaaaaaaahhhh!! Go away! Get lost! Otherwise I am gonna KILL YOU!!!";
+ emotion 16;
+ close;
+}
+
+// --------------------------------------------------------------------------
+cmd_fild09.gat,106,195,0 script Aragham Junior 45,1,1,{
+ callfunc "F_RogueTest3", 1, "Aragham", "never", "hoarded", "upgrade items.", 244, 24;
+}
+
+// -----------------------------------------------------------------------------
+cmd_fild09.gat,335,143,0 script Hollgrehen Junior 45,1,1,{
+ callfunc "F_RogueTest3", 2, "My father", "never", "hoarded", "upgrade items.", 168, 34;
+}
+
+// ------------------------------------------------------------------------------
+cmd_fild04.gat,304,179,0 script Antonio Junior 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(Class!=Job_Thief || ROGUE_Q<3 || ROGUE_Q2==0) close;
+L_Start:
+ 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(ROGUE_Q2 != getarg(0)) goto L_Wrong;
+ 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 99,
+{
+ callfunc "F_RogueTest4", "Aragham Junior", 245, 27;
+}
+//---------------------------------------------------------------------------
+in_rogue.gat,152,27,6 script Hollgrehen Junior 85,
+{
+ callfunc "F_RogueTest4", "Hollgrehen Junior", 160, 32;
+}
+//---------------------------------------------------------------------------
+in_rogue.gat,183,105,4 script Antonio Junior 88,
+{
+ callfunc "F_RogueTest4", "Antonio Junior", 175, 107;
+}
+
+// Function for Guildsman =============================
+function script F_RogueTest4 {
+
+ if(ROGUE_Q == 4) goto L_Restart;
+ mes "[" + getarg(0) + "]";
+ mes "Hello there... You must be from the Rogue guild. My name is " + getarg(0) + "...... I am the Rogue of the Desert..............";
+ next;
+ mes "[" + getarg(0) + "]";
+ mes "Aww who am I kidding...... Let's cut the crap. So are you ready to become a rogue?";
+ emotion 4;
+ next;
+ mes "[" + getarg(0) + "]";
+ 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(0) + "]";
+ 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(0) + "]";
+ 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(0) + "]";
+ 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(0) + "]";
+ mes "Good luck then.";
+ next;
+ set ROGUE_Q, 4;
+ killmonsterall "in_rogue.gat";
+ savepoint "in_rogue.gat", getarg(1), getarg(2);
+ warp "in_rogue.gat", 15, 105;
+ end;
+
+ M_End:
+ mes "[" + getarg(0) + "]";
+ mes ".....................";
+ next;
+ mes "[" + getarg(0) + "]";
+ mes "Well take your time then...... I guess.......";
+ close;
+
+L_Restart:
+ mes "[" + getarg(0) + "]";
+ mes "....... Looks like you got creamed.......";
+ emotion 4;
+ next;
+ mes "[" + getarg(0) + "]";
+ 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;
+}
+
+//================================================
+// 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;
+}
+
+
diff --git a/npc/jobs/2-2/sage.txt b/npc/jobs/2-2/sage.txt
index 38d128d11..f27ff032d 100644
--- a/npc/jobs/2-2/sage.txt
+++ b/npc/jobs/2-2/sage.txt
@@ -1,2146 +1,2146 @@
-//===== eAthena Script =======================================
-//= Sage Job Quest
-//===== By: ==================================================
-//= jAthena (1.0) - I guess
-//= Unknown Translator (2.0)
-//= Darkchild (3.0)
-//===== Current Version: =====================================
-//= 3.0
-//===== 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
-//============================================================
-
-//==================================
-//Sage Castle
-//==================================
-yuno_in02.gat,38,61,4 script Magic Academy Headmaster 743,{
- if (Class == 16) goto L_Menu3_3;
- if (Class != 2) goto L_Menu2_1;
- if (job2nd_sage == 11) goto L_Menu3_1;
- if (job2nd_sage >= 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:
- jobchange 16;
- 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 (Class == 16) goto L_Menu3_2;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 11) goto L_Menu3_1;
- if (job2nd_sage2 == 8) goto L_Menu2_1;
- if (job2nd_sage2 == 9) goto L_Menu2_3;
- if (job2nd_sage2 == 10) goto L_Menu2_5;
- if (job2nd_sage2 == 11) goto L_ThesisStart1;
- if (job2nd_sage == 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 job2nd_sage2,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 job2nd_sage2,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 job2nd_sage2,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 job2nd_sage2,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 Rabbit Headband",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 Rabbit Headband.";
- 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 "Rabbit Headbands 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 "Rabbit Headbands 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 job2nd_sage,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 (Class == 16) goto L_Menu5_4;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 11) goto L_Menu5_3;
- if ((job2nd_sage2 >= 1) && (job2nd_sage2 <= 3)) goto L_Menu3_1;
- if ((job2nd_sage2 >= 4) && (job2nd_sage2 <= 6)) goto L_Menu4_1;
- if (job2nd_sage2 == 7) goto L_Menu5_1;
- if (job2nd_sage == 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 job2nd_sage2,1;
- mes "^3051FD5x Tendons^000000";
- mes "^3051FD5x Nippers^000000";
- mes "^3051FD5x Sharp Scales^000000";
- next;
- goto L_Menu2_6;
- L_Menu2_4:
- set job2nd_sage2,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 job2nd_sage2,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) && (job2nd_sage2 == 1)) goto L_Menu3_4;
- if ((countitem(966) >= 5) && (countitem(960) >= 5) && (countitem(950) >= 5) && (job2nd_sage2 == 2)) goto L_Menu3_4;
- if ((countitem(1052) >= 5) && (countitem(962) >= 5) && (countitem(1023) >= 5) && (job2nd_sage2 == 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 (job2nd_sage2 == 2) goto L_Menu3_2;
- if (job2nd_sage2 == 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_5,"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 Deva",-;
-//==================================
-//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 Penomeni and starfish 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 Penomeni and starfish 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 job2nd_sage2,4;
- mes "^3051FD5x Cobweb^000000";
- mes "^3051FD5x Shell^000000";
- mes "^3051FD5x Insect Feeler^000000";
- next;
- goto L_Menu2_6;
- L_Menu3_10:
- set job2nd_sage2,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 job2nd_sage2,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) && (job2nd_sage2 == 4)) goto L_Menu4_4;
- if ((countitem(1057) >= 5) && (countitem(946) >= 5) && (countitem(947) >= 5) && (job2nd_sage2 == 5)) goto L_Menu4_4;
- if ((countitem(1031) >= 5) && (countitem(955) >= 5) && (countitem(1013) >= 5) && (job2nd_sage2 == 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 (job2nd_sage2 == 5) goto L_Menu4_2;
- if (job2nd_sage2 == 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 job2nd_sage2,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) && (job2nd_sage2 == 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 job2nd_sage,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,{
- if (Class == 16) goto L_Menu6_4;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 11) goto L_Menu6_3;
- if (job2nd_sage >= 4) goto L_Menu6_2;
- if (job2nd_sage == 3) goto L_Menu6_1;
- if (job2nd_sage == 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 and 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 job2nd_sage,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) >= 1) && (countitem(1007) >= 1)) goto L_Menu5_4;
- if (Zeny < 70000) goto L_Menu5_2;
- set Zeny,Zeny-70000;
- set job2nd_sage,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 (job2nd_sage == 3) goto L_Menu5_6;
- if ((countitem(1006) >= 1) || (countitem(1007) >= 1)) goto L_Menu5_7;
- if (Zeny < 70000) goto L_Menu5_2;
- set Zeny,Zeny-70000;
- set job2nd_sage,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 job2nd_sage,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 (job2nd_sage != 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:
-//==================================
-//mes–¢‰ñŽû
- if (Zeny < 30000) goto L_Menu5_8;
- delitem 916,50;
- delitem 914,50;
- delitem 705,50;
- delitem 949,50;
- set Zeny,Zeny-30000;
- set job2nd_sage,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 job2nd_sage,3;
- next;
- goto L_Menu5_5;
- L_Menu5_4:
- delitem 1006,1;
- delitem 1007,1;
- set job2nd_sage,3;
- mes "[Mathias]";
- mes "Oh, you have the special items.";
- mes "I'll accept those in lieu of tuition.";
- next;
- goto L_Menu5_5;
- L_Menu5_7:
- delitem 1006,1;
- delitem 1007,1;
- set job2nd_sage,3;
- mes "[Mathias]";
- mes "Oh, you have the special items.";
- mes "I'll accept those 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 (Class == 16) goto L_Menu4_5;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 5) goto L_Menu2_1;
- if (job2nd_sage == 6) goto L_Menu2_3;
- if (job2nd_sage == 7) goto L_Menu3_1;
- if (job2nd_sage == 8) goto L_Menu4_1;
- if (job2nd_sage == 9) goto L_Menu4_2;
- if (job2nd_sage == 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 (job2nd_sage == 3) goto L_Menu1_2;
- if (job2nd_sage >= 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 job2nd_sage,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!";
- next;
- 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!";
- next;
- warp "job_sage",50,154;
- next;
- 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 job2nd_sage,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 job2nd_sage,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 (Class == 16) goto L_Menu2_2;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 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 (Class == 16) goto L_Menu3_4;
- if (Class != 2) goto L_Menu1_1;
- if (job2nd_sage == 11) goto L_Menu3_3;
- if (job2nd_sage >= 6) goto L_Menu3_2;
- if (job2nd_sage == 3) goto L_Menu1_2;
- if (job2nd_sage == 4) goto L_Menu2_1;
- if (job2nd_sage == 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 job2nd_sage,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 Rabbit Headband?";
- 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 job2nd_sage,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 mapflag nobranch dummy
-job_sage.gat mapflag noteleport dummy
-job_sage.gat mapflag nopenalty dummy
-job_sage.gat mapflag nosave SavePoint
-
-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(1,"jobsage_1st") < 60000 ) set sagecheck,sagecheck+1;
- if ((getnpctimer(1,"jobsage_1st") >= 120000 ) && (getnpctimer(1,"jobsage_1st") <= 170000 )) set sagecheck,sagecheck-1;
- if (getnpctimer(1,"jobsage_1st") > 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(1,"jobsage_2nd") < 60000 ) set sagecheck,sagecheck+1;
- if ((getnpctimer(1,"jobsage_2nd") >= 120000 ) && (getnpctimer(1,"jobsage_2nd") <= 170000 )) set sagecheck,sagecheck-1;
- if (getnpctimer(1,"jobsage_2nd") > 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 job2nd_sage,7;
- if (getnpctimer(1,"jobsage_3rd") < 20000 ) set sagecheck,sagecheck+1;
- if ((getnpctimer(1,"jobsage_3rd") >= 30000 ) && (getnpctimer(1,"jobsage_2nd") <= 50000 )) set sagecheck,sagecheck-1;
- if (getnpctimer(1,"jobsage_3rd") > 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;
-}
+//===== eAthena Script =======================================
+//= Sage Job Quest
+//===== By: ==================================================
+//= jAthena (1.0) - I guess
+//= Unknown Translator (2.0)
+//= Darkchild (3.0)
+//===== Current Version: =====================================
+//= 3.0
+//===== 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
+//============================================================
+
+//==================================
+//Sage Castle
+//==================================
+yuno_in02.gat,38,61,4 script Magic Academy Headmaster 743,{
+ if (Class == 16) goto L_Menu3_3;
+ if (Class != 2) goto L_Menu2_1;
+ if (job2nd_sage == 11) goto L_Menu3_1;
+ if (job2nd_sage >= 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:
+ jobchange 16;
+ 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 (Class == 16) goto L_Menu3_2;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 11) goto L_Menu3_1;
+ if (job2nd_sage2 == 8) goto L_Menu2_1;
+ if (job2nd_sage2 == 9) goto L_Menu2_3;
+ if (job2nd_sage2 == 10) goto L_Menu2_5;
+ if (job2nd_sage2 == 11) goto L_ThesisStart1;
+ if (job2nd_sage == 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 job2nd_sage2,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 job2nd_sage2,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 job2nd_sage2,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 job2nd_sage2,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 Rabbit Headband",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 Rabbit Headband.";
+ 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 "Rabbit Headbands 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 "Rabbit Headbands 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 job2nd_sage,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 (Class == 16) goto L_Menu5_4;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 11) goto L_Menu5_3;
+ if ((job2nd_sage2 >= 1) && (job2nd_sage2 <= 3)) goto L_Menu3_1;
+ if ((job2nd_sage2 >= 4) && (job2nd_sage2 <= 6)) goto L_Menu4_1;
+ if (job2nd_sage2 == 7) goto L_Menu5_1;
+ if (job2nd_sage == 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 job2nd_sage2,1;
+ mes "^3051FD5x Tendons^000000";
+ mes "^3051FD5x Nippers^000000";
+ mes "^3051FD5x Sharp Scales^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu2_4:
+ set job2nd_sage2,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 job2nd_sage2,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) && (job2nd_sage2 == 1)) goto L_Menu3_4;
+ if ((countitem(966) >= 5) && (countitem(960) >= 5) && (countitem(950) >= 5) && (job2nd_sage2 == 2)) goto L_Menu3_4;
+ if ((countitem(1052) >= 5) && (countitem(962) >= 5) && (countitem(1023) >= 5) && (job2nd_sage2 == 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 (job2nd_sage2 == 2) goto L_Menu3_2;
+ if (job2nd_sage2 == 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_5,"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 Deva",-;
+//==================================
+//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 Penomeni and starfish 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 Penomeni and starfish 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 job2nd_sage2,4;
+ mes "^3051FD5x Cobweb^000000";
+ mes "^3051FD5x Shell^000000";
+ mes "^3051FD5x Insect Feeler^000000";
+ next;
+ goto L_Menu2_6;
+ L_Menu3_10:
+ set job2nd_sage2,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 job2nd_sage2,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) && (job2nd_sage2 == 4)) goto L_Menu4_4;
+ if ((countitem(1057) >= 5) && (countitem(946) >= 5) && (countitem(947) >= 5) && (job2nd_sage2 == 5)) goto L_Menu4_4;
+ if ((countitem(1031) >= 5) && (countitem(955) >= 5) && (countitem(1013) >= 5) && (job2nd_sage2 == 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 (job2nd_sage2 == 5) goto L_Menu4_2;
+ if (job2nd_sage2 == 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 job2nd_sage2,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) && (job2nd_sage2 == 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 job2nd_sage,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,{
+ if (Class == 16) goto L_Menu6_4;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 11) goto L_Menu6_3;
+ if (job2nd_sage >= 4) goto L_Menu6_2;
+ if (job2nd_sage == 3) goto L_Menu6_1;
+ if (job2nd_sage == 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 and 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 job2nd_sage,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) >= 1) && (countitem(1007) >= 1)) goto L_Menu5_4;
+ if (Zeny < 70000) goto L_Menu5_2;
+ set Zeny,Zeny-70000;
+ set job2nd_sage,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 (job2nd_sage == 3) goto L_Menu5_6;
+ if ((countitem(1006) >= 1) || (countitem(1007) >= 1)) goto L_Menu5_7;
+ if (Zeny < 70000) goto L_Menu5_2;
+ set Zeny,Zeny-70000;
+ set job2nd_sage,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 job2nd_sage,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 (job2nd_sage != 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:
+//==================================
+//mes–¢‰ñŽû
+ if (Zeny < 30000) goto L_Menu5_8;
+ delitem 916,50;
+ delitem 914,50;
+ delitem 705,50;
+ delitem 949,50;
+ set Zeny,Zeny-30000;
+ set job2nd_sage,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 job2nd_sage,3;
+ next;
+ goto L_Menu5_5;
+ L_Menu5_4:
+ delitem 1006,1;
+ delitem 1007,1;
+ set job2nd_sage,3;
+ mes "[Mathias]";
+ mes "Oh, you have the special items.";
+ mes "I'll accept those in lieu of tuition.";
+ next;
+ goto L_Menu5_5;
+ L_Menu5_7:
+ delitem 1006,1;
+ delitem 1007,1;
+ set job2nd_sage,3;
+ mes "[Mathias]";
+ mes "Oh, you have the special items.";
+ mes "I'll accept those 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 (Class == 16) goto L_Menu4_5;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 5) goto L_Menu2_1;
+ if (job2nd_sage == 6) goto L_Menu2_3;
+ if (job2nd_sage == 7) goto L_Menu3_1;
+ if (job2nd_sage == 8) goto L_Menu4_1;
+ if (job2nd_sage == 9) goto L_Menu4_2;
+ if (job2nd_sage == 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 (job2nd_sage == 3) goto L_Menu1_2;
+ if (job2nd_sage >= 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 job2nd_sage,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!";
+ next;
+ 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!";
+ next;
+ warp "job_sage",50,154;
+ next;
+ 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 job2nd_sage,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 job2nd_sage,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 (Class == 16) goto L_Menu2_2;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 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 (Class == 16) goto L_Menu3_4;
+ if (Class != 2) goto L_Menu1_1;
+ if (job2nd_sage == 11) goto L_Menu3_3;
+ if (job2nd_sage >= 6) goto L_Menu3_2;
+ if (job2nd_sage == 3) goto L_Menu1_2;
+ if (job2nd_sage == 4) goto L_Menu2_1;
+ if (job2nd_sage == 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 job2nd_sage,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 Rabbit Headband?";
+ 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 job2nd_sage,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 mapflag nobranch dummy
+job_sage.gat mapflag noteleport dummy
+job_sage.gat mapflag nopenalty dummy
+job_sage.gat mapflag nosave SavePoint
+
+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(1,"jobsage_1st") < 60000 ) set sagecheck,sagecheck+1;
+ if ((getnpctimer(1,"jobsage_1st") >= 120000 ) && (getnpctimer(1,"jobsage_1st") <= 170000 )) set sagecheck,sagecheck-1;
+ if (getnpctimer(1,"jobsage_1st") > 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(1,"jobsage_2nd") < 60000 ) set sagecheck,sagecheck+1;
+ if ((getnpctimer(1,"jobsage_2nd") >= 120000 ) && (getnpctimer(1,"jobsage_2nd") <= 170000 )) set sagecheck,sagecheck-1;
+ if (getnpctimer(1,"jobsage_2nd") > 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 job2nd_sage,7;
+ if (getnpctimer(1,"jobsage_3rd") < 20000 ) set sagecheck,sagecheck+1;
+ if ((getnpctimer(1,"jobsage_3rd") >= 30000 ) && (getnpctimer(1,"jobsage_2nd") <= 50000 )) set sagecheck,sagecheck-1;
+ if (getnpctimer(1,"jobsage_3rd") > 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;
+}
diff --git a/npc/jobs/custom/jobchange.txt b/npc/jobs/custom/jobchange.txt
index 8d0ee1e18..b5533fdf4 100644
--- a/npc/jobs/custom/jobchange.txt
+++ b/npc/jobs/custom/jobchange.txt
@@ -1,646 +1,646 @@
-//===== eAthena Script =======================================
-//= Jobchanger Script
-//===== By: ==================================================
-//= eAthena Scripting Team
-//===== Current Version: =====================================
-//= 2.0
-//===== 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]
-//============================================================
-
-prontera.gat,160,186,6 script Jobchanger 94,{
-mes "[ ^0065DFJobra^000000 ]";
-mes "Sup? I'm the insanely cool and supra-l337 jobchanger thingy for Athena! 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",Ladvclasses,"Advance Second Class",Ladvclasses,"Super Novice",LSuperNovice;
-LNovice2:
- if ((readparam(11) >= 99) && (readparam(55) >= 50) || (readparam(19) > 20)) goto Lchange;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Ummmm, excuse me... o.O...";
- mes "You don't MEET the class requirements...";
- mes "Hey! You're not ready! Get away, punk! *rolls eyes*";
- mes "Only 2nd Classes and Alternate 2nd Classes can change into the Novice High... jeeze.";
- cutin "kafra_01",255;
- close;
-
-Lchange:
- 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;
-
-Llevelcheck:
- if(readparam(55) >= 45 || readparam(19) == 4001 && readparam(55) >= 10) goto Lexisting;
- mes "[ ^0065DFJobra^000000 ]";
- mes "You need a higher level to change...";
- cutin "kafra_01",255;
- close;
-
-Ladvclasses:
-//Lord Knight & Paladin
- if(oldclass == 7 && readparam(19) == 4001 || oldclass == 14 && readparam(19) == 4001) goto Lswordsmanhigh;
- if(readparam(19) == 4002 && oldclass == 7) goto Llordknight;
- if(readparam(19) == 4002 && oldclass == 14) goto Lpaladin;
-//Assassin Cross & Stalker
- if(oldclass == 12 && readparam(19) == 4001 || oldclass == 17 && readparam(19) == 4001) goto Ltheifhigh;
- 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;
- mes "[ ^0065DFJobra^000000 ]";
- mes "Please... Remove your cart, leave your falcon and get off your peco before.";
- mes "[" + readparam(19) + "] [" + oldclass + "]";
- cutin "kafra_01",255;
- close;
-//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
-Ltheifhigh:
- 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 swordmen of Rune-Midgart";
- cutin "kafra_01",255;
- jobchange 42;
- close;
-//High Wizard & Professor
-Lmagehigh:
- 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:
- 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! *rolls eyes*";
- mes "Only NOVICES can change into the First Job... jeeze.";
- cutin "kafra_01",255;
- close;
-
-Lskillpt:
- mes "[ ^0065DFJobra^000000 ]";
- mes "Please use up all your skill points before changing into the next job! ";
- cutin "kafra_01",255;
- close;
-
-Ljobten:
- 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:
- 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..";
- cutin "kafra_01",255;
- jobchange 7;// Job: Job_Knight
- 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 LBard;
- if(sex==1) goto LDancer;
-
- 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.0
+//===== 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]
+//============================================================
+
+prontera.gat,160,186,6 script Jobchanger 94,{
+mes "[ ^0065DFJobra^000000 ]";
+mes "Sup? I'm the insanely cool and supra-l337 jobchanger thingy for Athena! 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",Ladvclasses,"Advance Second Class",Ladvclasses,"Super Novice",LSuperNovice;
+LNovice2:
+ if ((readparam(11) >= 99) && (readparam(55) >= 50) || (readparam(19) > 20)) goto Lchange;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Ummmm, excuse me... o.O...";
+ mes "You don't MEET the class requirements...";
+ mes "Hey! You're not ready! Get away, punk! *rolls eyes*";
+ mes "Only 2nd Classes and Alternate 2nd Classes can change into the Novice High... jeeze.";
+ cutin "kafra_01",255;
+ close;
+
+Lchange:
+ 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;
+
+Llevelcheck:
+ if(readparam(55) >= 45 || readparam(19) == 4001 && readparam(55) >= 10) goto Lexisting;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "You need a higher level to change...";
+ cutin "kafra_01",255;
+ close;
+
+Ladvclasses:
+//Lord Knight & Paladin
+ if(oldclass == 7 && readparam(19) == 4001 || oldclass == 14 && readparam(19) == 4001) goto Lswordsmanhigh;
+ if(readparam(19) == 4002 && oldclass == 7) goto Llordknight;
+ if(readparam(19) == 4002 && oldclass == 14) goto Lpaladin;
+//Assassin Cross & Stalker
+ if(oldclass == 12 && readparam(19) == 4001 || oldclass == 17 && readparam(19) == 4001) goto Ltheifhigh;
+ 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;
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Please... Remove your cart, leave your falcon and get off your peco before.";
+ mes "[" + readparam(19) + "] [" + oldclass + "]";
+ cutin "kafra_01",255;
+ close;
+//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
+Ltheifhigh:
+ 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 swordmen of Rune-Midgart";
+ cutin "kafra_01",255;
+ jobchange 42;
+ close;
+//High Wizard & Professor
+Lmagehigh:
+ 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:
+ 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! *rolls eyes*";
+ mes "Only NOVICES can change into the First Job... jeeze.";
+ cutin "kafra_01",255;
+ close;
+
+Lskillpt:
+ mes "[ ^0065DFJobra^000000 ]";
+ mes "Please use up all your skill points before changing into the next job! ";
+ cutin "kafra_01",255;
+ close;
+
+Ljobten:
+ 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:
+ 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..";
+ cutin "kafra_01",255;
+ jobchange 7;// Job: Job_Knight
+ 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 LBard;
+ if(sex==1) goto LDancer;
+
+ 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/jobs/custom/reset.txt b/npc/jobs/custom/reset.txt
index 5caaf6ad2..2a00d686a 100644
--- a/npc/jobs/custom/reset.txt
+++ b/npc/jobs/custom/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";
- next;
- mes "Please select the service you want:";
- 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";
+ next;
+ mes "Please select the service you want:";
+ 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/jobs/novice/novice.txt b/npc/jobs/novice/novice.txt
index 6e8ea3146..cd9c6235c 100644
--- a/npc/jobs/novice/novice.txt
+++ b/npc/jobs/novice/novice.txt
@@ -1,2339 +1,2339 @@
-//===== eAthena Script =======================================
-//= Novice Training Grounds
-//===== By: ==================================================
-//= eAthena Dev Team (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-//--------------------------------------------------------------
-//------------------ EXPLANATION OF VARIABLES ------------------
-// Permanent variables:
-// before first course:
-// - nov_get_item01: flag to know if Usher had given 150 z
-// in first course:
-// - nov_1_2_cos_c: to know first course advancement
-// - nov_1st_cos: to know number of right/correct answers with Leo Von Frisch
-// - Done_milk: to know if milk has been given by the Newbie Instructor
-// in third course:
-// - set nov_1_4_cos_c: to know third course advancement (to avoid to repeat question)
-// - nov_3_merchant: count the number of answers to become merchant
-// - nov_3_swordman: count the number of answers to become swordman
-// - nov_3_archer: count the number of answers to become archer
-// - nov_3_thief: count the number of answers to become thief
-// - nov_3_magician: count the number of answers to become magician
-// - nov_3_acolyte: count the number of answers to become acolyte
-
-
-// == MONSTERS ==
-//Spawn is included in this file so make shure its not elsewhere to!
-new_1-3.gat,0,0,0,0 monster FABRE 1184,50,0,0,0
-
-
-// == NPCs ==
-// -- Board --
-new_1-1.gat,66,114,1 script Bulletin Board 111,{
- mes "^FF0000=================================^000000";
- mes "^FF0000 == ^E40CAA[Welcome] ^CC0000to^FF9000Training ^0000FFGround ^FF0000==^000000";
- mes "^FF0000=================================^000000";
- close;
-}
-
-// -- Guards --
-new_1-1.gat,117,107,2 script Guard 105,{
- set @TEMP,rand(2);
- if (@TEMP !=0) goto L0;
- mes "[Guard]";
- mes "Go! Newbie! Go! You will see a New sun tomorrow!";
- close;
-
- L0:
- mes "[Guard]";
- mes "Come in! Welcome to the Real world!";
- mes "We are trying to do our best to support newbies like you!";
- close;
-}
-
-new_1-1.gat,117,116,2 script Guard 105,{
- mes "[Guard]";
- mes "Welcome~ Now, you're in Training Ground~";
- mes "Please go inside the Castle.";
- close;
-}
-
-// -- Chief --
-new_1-1.gat,157,124,3 script Training Ground Chief 56,{
- mes "[Training Ground Chief]";
- mes "Umm...? Aren't you a Freshman? You have a lot of guts to dare to come up.";
- mes "Didn't that Guide stop you?";
- next;
- menu "He did, but I didn't listen to him.",Lyes,"Nope, he didn't.",Lno;
-
- Lyes:
- mes "[Training Ground Chief]";
- mes "He did? And you came up without any timidity!?";
- mes "Giggle... giggle...";
- mes "Muhahahahaha!";
- next;
- mes "[Training Ground Chief]";
- mes "Wow man! You are really something, huh?";
- mes "Well... Rune-Midgard wants brave man like you. I expect you will be the most efficient man for Ragnarok. Do your best.";
- close;
- Lno:
- mes "[Training Ground Chief]";
- mes "What...? He didn't? Hmm... I need to improve the moral fiber. Even though the World is in Great fear...";
- next;
- mes "[Training Ground Chief]";
- mes "Go downstairs. Don't disturb me. I need time to think of.";
- close;
-}
-
-// -- Usher --
-// nov_get_item01: flag to know if Usher had given 150 z.
-// 0: not given
-// 1: given
-new_1-2.gat,100,29,4 script Usher 86,{
- mes "[Usher]";
- mes "Welcome to the ^FF0000Training Ground^000000 .";
- mes "Please choose ^0099FFIntroduction^000000 first if you need to check detailed information about Training Ground.";
- next;
- menu "Sign Up on the Training Ground.",Lsign,"Direct Access to Ragnarok.",Ldirect,"^0099FFIntroduction.^000000",Lintro,"Cancel.",Lcancel;
-
- Lsign:
- mes "[Usher]";
- mes "Registration has been confirmed.";
- mes "Please inquire at each Guide on the course when you need.";
- next;
- if (nov_get_item01 == 1) goto Lsign1;
-
- set nov_get_item01,1;
- set Zeny,Zeny+150;
- mes "[Usher]";
- mes "Training Subsidy 150 Zeny supplied. Please inquire at a Guide on the Center when you need to know your Current Progress.";
- mes "I will lead you into the Hall.";
- next;
-
- Lsign1:
- set nov_get_item01,0;
- warp "new_1-2",100,70;
- close;
-
- Ldirect:
- mes "[Usher]";
- mes "I see.";
- mes "Hopefully you will contribute to public wellfare in near future, good luck.";
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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 @TEMP,rand(6);
-
- if (@TEMP !=0) goto Ldirect0;
- savepoint "prontera.gat",273,354;
- warp "prontera.gat",273,354;
- close;
- Ldirect0:
- if (@TEMP !=1) goto Ldirect1;
- savepoint "morocc.gat",160,94;
- warp "morocc.gat",160,94;
- close;
- Ldirect1:
- if (@TEMP !=2) goto Ldirect2;
- savepoint "geffen.gat",120,100;
- warp "geffen.gat",120,100;
- close;
- Ldirect2:
- if (@TEMP !=3) goto Ldirect3;
- savepoint "payon.gat",87,117;
- warp "payon.gat",87,117;
- close;
- Ldirect3:
- if (@TEMP !=4) goto Ldirect4;
- savepoint "alberta.gat",116,57;
- warp "alberta.gat",116,57;
- close;
- Ldirect4:
- savepoint "izlude.gat",94,103;
- warp "izlude.gat",94,103;
- close;
-
- Lintro:
- mes "[Usher]";
- mes "The Training Grounds were founded to support New Players of Ragnarok Online,";
- mes "under the Auspices of the Ministry of Education in Rune Midgard Kingdom.";
- next;
- mes "[Usher]";
- mes "We guide you on to adapt the Mechanics of Ragnarok at ease, also we recommend the Best profession for your personality through the Typology Test.";
- next;
- mes "[Usher]";
- mes "You can train yourself with 3 courses in here.";
- next;
- mes "[Usher]";
- mes "You can learn entire theoretical information in the First Course.";
- next;
- mes "[Usher]";
- mes "You will practice on the Actual spot in Fabres Field, the Second Course. Please do everything as you can do before jumping into the Real Ragnarok World.";
- next;
- mes "[Usher]";
- mes "The Third course is the Typology Test. You will figure out the best job for you with this test.";
- mes "You just answer the most suited answer when the course master asks you.";
- next;
- mes "[Usher]";
- mes "When you finish whole courses, we'll inform you the result and recommend the Job for you.";
- mes "Also if you accept our recommendation, we will tender you with small subsidy and let you begin in the specfic town for that Job.";
- mes "For example, when the result comes 'Archer', you will start in 'Payon'.";
- next;
- mes "[Usher]";
- mes "If you want to apply on the Training Ground, Please choose 'Sign Up on the Training Ground'.";
- mes "if you not, choose 'Direct Access to Ragnarok'.";
- next;
- menu "Sign Up on the Training Ground.",Lsign,"Direct Access to Ragnarok.",Ldirect,"^0099FFIntroduction.^000000",Lintro,"Cancel.",Lcancel;
- close;
-
- Lcancel:
- mes "[Usher]";
- mes "Take your time.";
- close;
-}
-
-
-// == FIRST COURSE ==
-// nov_1_2_cos_c: to know first course advancement
-// 0: newbie. Have not begin to speak (must speak to Leo Von Frish).
-// 1: Question 1 Leo Von Frisch done
-// 2: Question 2 Leo Von Frisch done
-// 3: Question 3 Leo Von Frisch done
-// 4: Question 4 Leo Von Frisch done
-// 5: Question 5 Leo Von Frisch done
-// 6: Question 6 Leo Von Frisch done
-// 7: Question 7 Leo Von Frisch done
-// 8: 'NPC Guide' Master done.
-// 9: 'Manner Master' done. Must register for Fabres forest.
-// 10: Register for Fabres forest. Must begin 2nd Course 1th test
-// 11: have been at least once in the Fabres forest.
-// nov_1st_cos: to know number of right/correct answers with Leo Von Frisch
-
-// Done_milk: to know if milk has been given by the Newbie Instructor
-// 0: not speak to Newbie Instructor (or at Fabres forest or more)
-// 1: speak to Newbie Instructor
-
-// -- Instructor --
-new_1-2.gat,81,110,4 script Newbie Instructor 84,{
- if (Done_milk==0) goto Lyes;
-
- mes "[Newbie Instructor]";
- mes "Do you want listen me again?";
- next;
- menu "Yes!",Lyes,"No, not again.",Lno;
-
- Lno:
- mes "[Newbie Instructor]";
- mes "Move along to the next course!";
- close;
-
- Lyes:
- mes "[Newbie Instructor]";
- mes "Ho? A Rookie? So, are you gonna get some education from Sir Leo Von Frisch?";
- mes "Well ~ I must say he is sort of restless person, so that he tends to skip important issues while training.";
- mes "I am afraid to say you need aditional education besides his lecture... Alright! I will give you a favour, buddy!";
- next;
- mes "[Newbie Instructor]";
- mes "First off all you need to realise yourself. Your Chracter, the avatar of yourself inside the game has various distictive quality.";
- mes "Level, EXPerience points, Status et cetera et cetera... many facts gather and construct your character.";
- mes "Now let's take a look on character Status.";
- next;
- mes "[Newbie Instructor]";
- mes "^FF0000STR (Strength)^000000";
- mes "- Increase hit point and maximum weight.";
- mes "^FF0000AGI (Agility)^000000";
- mes "- Increase flee rate and attack speed.";
- mes "^FF0000VIT (Vitality)^000000";
- mes "- Increase defence, maximum health point and HP recovering amount.";
- next;
- mes "[Newbie Instructor]";
- mes "^FF0000INT (intelligence)^000000";
- mes "- Increase magic attack and magic defence.";
- mes "^FF0000DEX (Dexterity)^000000";
- mes "- Increase hitting accuracy and weapon damage.";
- mes "^FF0000LUK (Luck)^000000";
- mes "- Affect on various parts.";
- next;
- mes "[Newbie Instructor]";
- mes "You must keep Status abilities in mind before everything.";
- next;
- mes "[Newbie Instructor]";
- mes "When right-clicking on the 'status' button, you will see 'Status window' which shows current condition of a character. Shortcut is 'Alt + A'.";
- mes "When you bring a cursor on each status, you can see the real meaning of it.";
- mes "You will gain some points everytime Base Level is up, you can freely distribute them into ^FF00006 status^000000.";
- next;
- mes "[Newbie Instructor]";
- mes "The boxes next to each stat show the ^FF0000base value of the stat plus any bonuses from equipment. The left box shows the point cost to upgrade the stat by 1^000000.";
- mes "When the character levels up, Blue button appears on the bottom of right side of the monitor screen. Click it to open the status window.";
- mes "Click the blue Arrow to spend the points you get, ^FF0000You can upgrade stats as you want ^000000.";
- next;
- mes "[Newbie Instructor]";
- mes "Oh well, 'Tendency' hasn't been implemented yet, let's talk later then.";
- next;
- mes "[Newbie Instructor]";
- mes "Shall we move onto the next issue?";
- next;
- mes "[Newbie Instructor]";
- mes "Right-clicking on a character leads you to see individual menu including Trade command.";
- mes "When left-clicking on Trade menu, ^FF0000'Trade window'^000000 pops up. That's the way you can exchange ^FF0000items or zeny, Ragnarok currency^000000 with another character.";
- mes "There are 2 different buttons on the bottom of trade window, one is ´OK´ the other is ´Cancel´.";
- mes "Press ´OK´ if you are ready or ´Cancel´ if you want to cancel the deal.";
- next;
- mes "[Newbie Instructor]";
- mes "Let's check the ^FF0000'Chat Window'^000000 on the bottom of game screen, which allows you to chat with others. It is devided into 2 parts, you can enter a ^FF0000character name you want to whisper^000000 at the left part.";
- mes "If you click the button beside the left part, you can check all character names who you have already whispered to or you got whispered so far. So you can whisper to the characters without typing their names again.";
- mes "At the right part of chat window, you can type the message you want to send. And with the first button beside this part, you can choose chat type as public or private among party members.";
- mes "With the last button on the chat window, you can arrange chat window size.";
- next;
- mes "[Newbie Instructor]";
- mes "The following text tells you more about the 'Character View'.";
- mes "When you drag mouse from right to left with the right mouse button held down, the character view rotates (360°).";
- mes "Holding down the 'Ctrl' key and the right mouse button while dragging the mouse up and down, makes the view ^FF0000Zooming in and out toward the character^000000.";
- mes "Holding down the 'Shift' key and the right mouse button while dragging the mouse up and down, controls the angle of the view ^FF0000for fixed range^000000.";
- next;
- mes "[Newbie Instructor]";
- mes "This is the last thing I have to teach you about shorcuts. You will realize how important Shorcuts are if you want to play with efficiency.";
- next;
- mes "[Newbie Instructor]";
- mes "^FF0000The 'ESC' ^000000key is the function key, it ^0087FFcalls 'Exit to window' command or 'Return to game' command^000000.";
- mes "^FF0000 Keys From 'F1' to 'F9'^000000 are shortcut keys for ^0087FFeach item registered on Hot key window^000000.";
- mes "^FF0000The Key 'F10'^000000 adjusts ^0087FFthe size of chat window^000000.";
- next;
- mes "[Newbie Instructor]";
- mes "^FF0000The key 'F11'^000000 clears ^0087FFall windows except basic information window and chatting box^000000.";
- mes "^FF0000The key 'F12'^000000 calls ^0087FFHot key window^000000.";
- mes "^FF0000The key 'insert' on the keyboard^000000 is the hot key for character's to ^0087FFsit or stand^000000. Also you can type ^0087FF'/sit or /stand'^000000 in the chatting Box.";
- next;
- mes "[Newbie Instructor]";
- mes "^FF0000The key 'alt+home'^000000 is ^0087FFShorcut for Ground cursor on / off^000000.";
- mes "^FF0000The key 'alt+end'^000000 is ^0087FFShorcut for character Health and SKill Point gauge on / off ^000000. You'd better turn it on all the time.";
- mes "^FF0000The key 'page up & down'^000000 will scroll ^0087FFText in interfaces and the chatting box, Mouse whirl will also scroll^000000.";
- next;
- mes "[Newbie Instructor]";
- mes "We have a system called 'Alignment System'.";
- mes "When you meet somebody nice or somebody helps you, you can give the person a good point in recognition of services.";
- mes "On the contrary, to someone who is ill-mannered or doing evil things on people, you can give the person 2 bad points. Meanwhile you will get 1 bad point for the penalty. This is to prevent abuse of the alignment system.";
- next;
- mes "[Newbie Instructor]";
- mes "The Alignment system is only available for adult characters over Novice level 8 and can be used once a day.";
- mes "I know you don't think this is not important right now, but be careful, it causes you the cumulative effects on your character.";
- mes "Somehow I believe nice persons will play fair even without this kind of restriction!";
- next;
- if (Done_milk==1) goto AfterMilk;
- set Done_milk,1;
- getitem 519,1;
- goto AfterMilk;
-
- AfterMilk:
- mes "[Newbie Instructor]";
- mes "Well... This is all I can tell you, buddy. Leo Von Frisch will take care of you from now on.";
- mes "Do your best, Ok? Ragnarok is a worthwhile game.";
- mes "By the way... this is my present for you. I sneaked this from mess hall. Promise me you will do your best, OK?";
- close;
-}
-
-// -- Leo, Quiz Npc --
-new_1-2.gat,84,115,4 script Leo Von Frisch 85,{
- if (nov_1_2_cos_c<1) goto startL0;
- if (nov_1_2_cos_c<7) goto Lcontinue;
- if (nov_1_2_cos_c==7) goto LNPCMaster;
- if (nov_1_2_cos_c==8) goto LMannerMaster;
-
- mes "[Leo Von Frisch]";
- mes "Umm? What brings you to me? My time is already over. You have finish the First course...";
- next;
- goto Lend;
-
- LMannerMaster:
- mes "[Leo Von Frisch]";
- mes "Umm? What brings you to me? My time is already over. Probably your next course will be to speak to the 'Manner Master'...";
- next;
- goto Lend;
-
- LNPCMaster:
- mes "[Leo Von Frisch]";
- mes "Um? What's matter? My class is over. Your next course would be 'NPC Guide'...";
- next;
- goto Lend;
-
- Lend:
- mes "Or... Are you willing to attend again?";
- next;
- menu "No, Sir! I apologise about my behaviour!",Lendno,"Yes, Sir! I am!",Lendyes;
-
- Lendno:
- mes "[Leo Von Frisch]";
- mes "If you think not enough, come anytime. Dismissed.";
- close;
- Lendyes:
- mes "[Leo Von Frisch]";
- mes "Ok! I love your passionate answer!! Let's begin!";
- next;
- goto LQ2;
-
- Lcontinue:
- set nov_1st_cos, 0;
- mes "[Leo Von Frisch]";
- mes "Um... Something interrupted my class without reason.";
- mes "Anyhow alright. Shall we begin all over again!";
- next;
- mes "[Leo Von Frisch]";
- mes "Are you ready!? Answer me!";
- next;
- menu "Yes sir!",LcontinueY,"No,I am not ready yet.",Lno;
- LcontinueY:
- if (nov_1_2_cos_c==1) goto LQ2;
- if (nov_1_2_cos_c==2) goto LQ3;
- if (nov_1_2_cos_c==3) goto LQ4;
- if (nov_1_2_cos_c==4) goto LQ5;
- if (nov_1_2_cos_c==5) goto LQ6;
- if (nov_1_2_cos_c==6) goto LQ7;
- close;
- Lno:
- mes "[Leo Von Frisch]";
- mes "'Noooo.'?! You said 'Noooo.'! What were you thinking, you rascal! Go get ready to move! Right now!";
- close;
-
- startL0:
- mes "[Leo Von Frisch]";
- mes "Come on! Beginner!! Now You are with an Expert of Ragnarok!!";
- mes "Me! I am God of beginners and I enlighten your pathetic souls from the Darkened World.";
- mes "Besides I am a Tutor and an itelligence Officer in the 4th Chivarly of Prontera!";
- mes "You can call me Sir Leo Von Frisch, got that clear?";
- next;
- mes "[Leo Von Frisch]";
- mes "Are you ready!? Answer me!";
- next;
- menu "Yes sir!",Lyes,"No, I am not ready yet.",Lno;
-
- Lyes:
- mes "[Leo Von Frisch]";
- mes "Well Done! Ok, Let's begin!! The first chapter is 'Let's Start Ragnarok'!";
- next;
- mes "[Leo Von Frisch]";
- mes "Ah~ I almost forgot to question you something.";
- mes "What is the best introduction for 'Ragnarok'?";
- next;
- menu "War among human beings",LQ1_1,"War between human beings and monsters",LQ1_2,"World that humans have taken over",LQ1_3,"World humans have coexisted with monsters",LQ1_4;
-
- LQ1_1:
- set nov_1_2_cos_c,1;
- mes "[Leo Von Frisch]";
- mes "Umm... Be cooperate with other people. The world will be end without nothing.";
- mes "Answer is ^FF0000War between human beings and monsters^000000.";
- next;
- mes "[Leo Von Frisch]";
- mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
- mes "I meant you, dumbhead, alright?";
- mes "Let's carry on.";
- next;
- goto LQ2;
- LQ1_2:
- getitem 513,1;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,1;
- mes "[Leo Von Frisch]";
- mes "Yes, that's right. You know well. We are fighting with evil creatures. In most of MMORPG games, they are known as Monsters or commonly just called as Mob.";
- next;
- mes "[Leo Von Frisch]";
- mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
- mes "I meant you, dumbhead, alright?";
- mes "Let's carry on.";
- next;
- goto LQ2;
- LQ1_3:
- set nov_1_2_cos_c,1;
- mes "[Leo Von Frisch]";
- mes "...What the bloody hell are you saying? Why would humans torment creatures for?";
- mes "Answer is ^FF0000War between human beings and monsters^000000.";
- next;
- mes "[Leo Von Frisch]";
- mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
- mes "I meant you, dumbhead, alright?";
- mes "Let's carry on.";
- next;
- goto LQ2;
- LQ1_4:
- set nov_1_2_cos_c,1;
- mes "[Leo Von Frisch]";
- mes "Oh well... I fully understand your pursue ideal world... Not now, not now.";
- mes "Answer is ^FF0000War between human beings and monsters^000000.";
- next;
- mes "[Leo Von Frisch]";
- mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
- mes "I meant you, dumbhead, alright?";
- mes "Let's carry on.";
- next;
- goto LQ2;
-
- LQ2:
- mes "[Leo Von Frisch]";
- mes "When you click the shortcut for Ragnarok, it will be automatically connected to patch server, which enables you to continually update game articles. MMORPG game keeps being developed to improve its quality.";
- mes "In the meantime, you can check ^FF0000the Notice^000000 on the patch window.";
- mes "Read that notice if you don't want to miss any game event or update articles.";
- next;
- mes "[Leo Von Frisch]";
- mes "You can coose between one or more servers.";
- mes "After choosing one of game servers, you can make a character.";
- mes "3 empty slots or more for character are given to you on the first place, you can have 3 kinds of different characters.";
- mes "For character appearance, you can choose a favourable hairstyle from a lot of kinds and from some kinds of hair colour. In near future, we will introduce more hair colour and clothings.";
- next;
- mes "[Leo Von Frisch]";
- mes "Double Click an empty slot and you can make your character.";
- mes "^FF0000You can arrange beginning Stats of your character. With that, Your character could be the best for job you wish for.^000000.";
- mes "So You should consider beginning Stats as well fitting for the job you want your character to be in the future.";
- next;
- if (nov_1_2_cos_c>1) goto LQ3;
- mes "[Leo Von Frisch]";
- mes "I give you one easy question!";
- mes "What is the wrong description for each Stat? You should choose WRONG one not right one!!";
- next;
- menu "STR - Increase hit point and maximum weight.",LQ2_1,"AGI - Increase flee rate and attack speed.",LQ2_2,"DEX - Increase accuracy and magic defence.",LQ2_3,"INT - Increase magic attack/defence.",LQ2_4;
-
- LQ2_1:
- set nov_1_2_cos_c,2;
- mes "That's wrong!";
- mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
- mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
- next;
- goto LQ3;
- LQ2_2:
- set nov_1_2_cos_c,2;
- mes "That's wrong!";
- mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
- mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
- next;
- goto LQ3;
- LQ2_3:
- getitem 513,1;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,2;
- mes "[Leo Von Frisch]";
- mes "Alright! You got it.";
- mes "It is not 'DEX - Increase accuracy and magic defence.', correct description is:";
- mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
- mes "This is reward. Take it.";
- next;
- goto LQ3;
- LQ2_4:
- set nov_1_2_cos_c,2;
- mes "That's wrong!";
- mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
- mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
- next;
- goto LQ3;
-
- LQ3:
- mes "[Leo Von Frisch]";
- mes "Let's go on.";
- next;
- mes "[Leo Von Frisch]";
- mes "Let's move on to 'Basic Interface'.";
- mes "Alright, check 'Basic Information window' on the upper-left side of your screen. You can see full screen of it with ^FF0000Double Click^000000, when it's shown as the smallest one.";
- next;
- mes "[Leo Von Frisch]";
- mes "'Basic Information Window shows ^FF0000Every Fundamental Functions^000000. Also, you can click the specific function windows with the pertinent button .";
- next;
- mes "[Leo Von Frisch]";
- mes "^FF0000'Base Lv'^000000 is the level of character. ^FF0000'Job Lv'^000000 Specializes the Character, it allows a character to learn a skill with ^FF0000Skill Point^000000 everytime at levelup.";
- mes "Let's spare skill point part for later.";
- mes "The Gauge bar beside each level is shown how much % of EXP Point you've gained for a next levelup. When it goes into 100% you will raise one level up, this bar will reset into 0 for a next turn.";
- next;
- mes "[Leo Von Frisch]";
- mes "Weight shows 'Current Belongings/Maximum Belongings'. When a player possesses things more than a half, it will shown in ^FF0000Red Colour^000000.";
- mes "From this moment, this player ^FF0000cannot regenerate HP, SP naturally^000000. Furthermore when its amount is over than 90%, ^FF0000a player cannot Fight.^000000";
- next;
- mes "[Leo Von Frisch]";
- mes "If you don't want to be murdered due to your stupidity, lighten your weight as you can.";
- mes "You can use Kafra Wearhouse to store items. And it will cost you the different local fee from 35 Zeny to 50 Zeny.";
- next;
- if (nov_1_2_cos_c>2) goto LQ4;
- mes "[Leo Von Frisch]";
- mes "Let's take a break~ Phew...";
- mes "Ah~ I have an idea~ I will give you a 'for-Fun' question.";
- next;
- mes "[Leo Von Frisch]";
- mes "You... Do you remember who I am?";
- mes "I told you about me before the lesson got started. Now remember? Or you just ignored me as 'Poof~ you are just a nothing but a NPC~'...";
- next;
- mes "[Leo Von Frisch]";
- mes "Ah Ah~ I don't want to show off myself but because I am your tutor. I am just curious. By the way this is just '^990000for fun^000000', you know.";
- mes "Choose one thing which has nothing to do with me.";
- next;
- menu "Instructor.",LQ3_1,"An Intelligence Officer in the 4th Chivarly of Prontera.",LQ3_2,"Public Prosecutor.",LQ3_3,"I have no idea.",LQ3_4;
-
- LQ3_1:
- set nov_1_2_cos_c,3;
- mes "[Leo Von Frisch]";
- mes "Damn you!... Next!";
- next;
- goto LQ4;
- LQ3_2:
- set nov_1_2_cos_c,3;
- mes "[Leo Von Frisch]";
- mes "Damn you!... Next!";
- next;
- goto LQ4;
- LQ3_3:
- mes "[Leo Von Frisch]";
- mes "Fine! I am not a 'Public Prosecutor' but a ^ff0000'Newbie Tutor^000000!";
- next;
- getitem 516,3;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,3;
- mes "[Leo Von Frisch]";
- mes "Take this. It is nothing, but I am so pleased that you remembered me in detail. Share with your pals.";
- next;
- goto LQ4;
- LQ3_4:
- set nov_1_2_cos_c,3;
- mes "[Leo Von Frisch]";
- mes "Damn you!... Next!";
- next;
- goto LQ4;
-
- LQ4:
- mes "[Leo Von Frisch]";
- mes "When you click 'Item' button, it shows your inventory. Shortcut is 'Alt + E'.";
- mes "Item windows is devided into 3 parts, the equipment you are wearing is not shown on the item window.";
- mes "^FF0000Right Click^000000on each item, you can see its description and a picture.";
- next;
- mes "[Leo Von Frisch]";
- mes "To equip items, ^FF0000it is possible to change equipment by Dragging & Dropping it onto your equipment window, Shorcut is 'ALT+Q'. You can also double click the item ^000000.";
- mes "^FF0000You can register 9 items or skills from F1 to F9 in the hotkey window^000000.";
- mes "You should have the hot key window open at all time. You can play easier that way.";
- next;
- mes "[Leo Von Frisch]";
- mes "You can see ^FF0000Present skills^000000when you click 'Skill' button. Shorcut is 'Alt + S'.";
- mes "^FF0000Every time the character's job levels up, you get skill points^000000. You will see blue button in the bottom left corner of your monitor screen.";
- mes "You can check skill informations ^FF0000by right clicking on each Skill Icon^000000.";
- next;
- mes "[Leo Von Frisch]";
- mes "Passive skill means ^FF0000You don't have to spend your SP to use it. It is always in effect^000000. The opposite from Active skill.";
- mes "Also skills are ^FF0000possible to register on the Hot key window^000000, you can use your favorite skills quickly and easily this way.";
- next;
- if (nov_1_2_cos_c>3) goto LQ5;
- mes "[Leo Von Frisch]";
- mes "One Question for you!";
- mes "How to see each item's description and the picture with the mouse?";
- next;
- menu "Double Click",LQ4_1,"Right Click",LQ4_2,"Drag & Drop",LQ4_3;
-
- LQ4_1:
- set nov_1_2_cos_c,4;
- mes "[Leo Von Frisch]";
- mes "That's wrong!";
- mes "It is ^FF0000'Right Click'^000000!";
- next;
- goto LQ5;
- LQ4_2:
- getitem 512,1;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,4;
- mes "[Leo Von Frisch]";
- mes "It is ^FF0000'Right Click'^000000! Correct!";
- mes "I will reward you for the correct answer. Take it.";
- next;
- goto LQ5;
- LQ4_3:
- set nov_1_2_cos_c,4;
- mes "[Leo Von Frisch]";
- mes "That's wrong!";
- mes "It is ^FF0000'Right Click'^000000!";
- next;
- goto LQ5;
-
- LQ5:
- mes "[Leo Von Frisch]";
- mes "Ok, Back to the Lesson.";
- next;
- mes "[Leo Von Frisch]";
- mes "^FF0000At novice level 4 or above, you can make your own chat room with 'Chat' Button^000000. Shorcut is 'Alt + C'.";
- mes "You can't move when you are in chatroom, but chatting and item trading are available.";
- next;
- mes "[Leo Von Frisch]";
- mes "With 'Friend' button, a 'Party' window pops up. You can see all party members and their present location.";
- mes "Shorcut is 'Alt + Z'.";
- next;
- mes "[Leo Von Frisch]";
- mes "Party members being on the same map with you, ^FF0000are shown on the mini-map^000000, Party window is going to be updated.";
- mes "So that it will act as messenger function like party members log-in. Also it will be upgraded like G-Freind that can connect between Ragnarok and outside.";
- next;
- mes "[Leo Von Frisch]";
- mes "With 'Map' button, you can use mini-map in various ways. It can be translucent, opaque and invisible. Also with the +, - button, ^FF0000it is possible to enlarge and reduce its Size^000000. Shorcut is 'Ctrl + Tab'.";
- mes "Red spot on the mini-map is the loading point to the next map. Player's location is shown like a white arrow. The direction of the white arrow shows which way the player facing.";
- next;
- mes "[Leo Von Frisch]";
- mes "The 'Equip' button, ^FF0000opens The window showing the character's equipped items^000000. Shorcut is 'Alt + Q'.";
- mes "Each equipped item can be ^FF0000right clicked for description and picture^000000, ^FF0000You can equip and unequip items by dragging and dropping between the equipment and inventory windows^000000.";
- mes "Also Every equipment can be registered on the Hot Key window so you can change your weapon easily.";
- next;
- mes "[Leo Von Frisch]";
- mes "The 'Option' button opens the window that allows you to controll the BGM and Sound Effect and turn on/off them. Shorcut is 'Alt + O'.";
- mes "After Feb 2002, you can also select a window skin from self-made skins shared in fansites.";
- next;
- if (nov_1_2_cos_c>4) goto LQ6;
- mes "[Leo Von Frisch]";
- mes "Another Question!";
- mes "Which one is the shortcut for hot key window that hleps you to play easier ?";
- next;
- menu "F1",LQ5_1,"F15",LQ5_2,"F16",LQ5_3,"F12",LQ5_4;
-
- LQ5_1:
- set nov_1_2_cos_c,5;
- mes "[Leo Von Frisch]";
- mes "That's wrong!";
- mes "The right key is 'F12'";
- next;
- goto LQ6;
- LQ5_2:
- set nov_1_2_cos_c,5;
- mes "[Leo Von Frisch]";
- mes "That's wrong!";
- mes "The right key is 'F12'";
- next;
- goto LQ6;
- LQ5_3:
- set nov_1_2_cos_c,5;
- mes "[Leo Von Frisch]";
- mes "That's wrong!";
- mes "The right key is 'F12'";
- next;
- goto LQ6;
- LQ5_4:
- getitem 517,1;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,5;
- mes "[Leo Von Frisch]";
- mes "That's right. 'F12' is correct answer.";
- mes "This is for you.";
- next;
- goto LQ6;
-
- LQ6:
- mes "[Leo Von Frisch]";
- mes "OK Let's move on.";
- next;
- mes "[Leo Von Frisch]";
- mes "The End.";
- next;
- if (nov_1_2_cos_c>5) goto LQ7;
- mes "[Leo Von Frisch]";
- mes "Quiz time!";
- mes "Choose One showing the Right Shortcut for 'Sit' and the Command you type in the Chat Box.";
- next;
- menu "'insert' - /Sit",LQ6_1,"'page down' - /Sitting",LQ6_2,"'home' - /Sitdown",LQ6_3,"'delete' - /stand",LQ6_4;
-
- LQ6_1:
- getitem 519,1;
- set nov_1st_cos, nov_1st_cos+1;
- set nov_1_2_cos_c,6;
- mes "[Leo Von Frisch]";
- mes "Yeah, correct.";
- next;
- goto LQ7;
- LQ6_2:
- set nov_1_2_cos_c,6;
- mes "[Leo Von Frisch]";
- mes "Wrong. 'insert' - /Sit is the correct one.";
- next;
- goto LQ7;
- LQ6_3:
- set nov_1_2_cos_c,6;
- mes "[Leo Von Frisch]";
- mes "Wrong. 'insert' - /Sit is the correct one.";
- next;
- goto LQ7;
- LQ6_4:
- set nov_1_2_cos_c,6;
- mes "[Leo Von Frisch]";
- mes "Wrong. 'insert' - /Sit is the correct one.";
- next;
- goto LQ7;
-
- LQ7:
- mes "[Leo Von Frisch]";
- mes "Guys, Thank you for standing my boring class for now. And I am not sure whether you fully understand or not.";
- mes "If you can't get it, play by yourself. 'The proof of the pudding is in the eating.', the proverb.";
- mes "I hope my class will be helpful to your wretched future in Ragnarok.";
- next;
- if (nov_1_2_cos_c > 6) goto LFinishAgain;
- if (nov_1st_cos > 0) goto nov1stcosCont;
- mes "[Leo Von Frisch]";
- mes "By the way... You've missed all answer!!!";
- mes "You are the worst trainee I've ever had. Sigh...";
- next;
- goto nov1stcosCont;
-
- nov1stcosCont:
- if (nov_1st_cos < 5) goto nov1stcosCheckL5;
- if (nov_1st_cos == 5) goto nov1stcosCheckE5;
- if (nov_1st_cos == 6) goto nov1stcosCheckE6;
-
- nov1stcosCheckL5:
- getitem 507,1;
- goto nov1stcosContNext;
- nov1stcosCheckE5:
- getitem 507,2;
- goto nov1stcosContNext;
- nov1stcosCheckE6:
- getitem 507,4;
- goto nov1stcosContNext;
-
- nov1stcosContNext:
- set nov_1_2_cos_c,7;
- mes "[Leo Von Frisch]";
- mes "I will reward you for the successful lesson. Take it. They will be useful when you have a hard time to fight.";
- next;
- mes "[Leo Von Frisch]";
- mes "Anyway, Let's call it a day with me, you may go to the 'NPC' master.";
- mes "If you can't find him, inquire at the sly dog at the centre";
- close;
-
- LFinishAgain:
- mes "[Leo Von Frisch]";
- mes "Anyway, Let's call it a day with me, you may go to the 'Guide' to know what you must do now.";
- mes "If you can't find him, search at the centre of the room.";
- close;
-
-}
-
-// -- Guide Npc --
-new_1-2.gat,99,156,4 script Guide 105,{
- mes "[Guide]";
- mes "Hey Hey Where are you going? There is nothing for a Newbie like you upstairs.";
- mes "Go and take the required trainings!";
- close;
-}
-
-// -- Guide Npc --
-new_1-2.gat,100,113,4 script Guide 97,{
- set @R_SEL_NUM,rand(2);
- mes "[Guide]";
- if (@R_SEL_NUM != 0) goto tmp1;
- mes "Mumble~Mumble~Life is getting Sick~What a boring Job I have~~ I was stupid enough to choose this Boring and Solitary thing! Ah~";
- goto NMes;
- tmp1:
- mes "I miss my good-for-nothing day~ Phew~ I should never accepted the Full time job... Eh?!";
- goto NMes;
-
- NMes:
- mes "Hey Buddy~ Want some Help?";
- next;
- menu "Current Course State.",-, "Quit.",L0;
-
- mes "[Guide]";
- mes "Hmm... Let me see...";
- if (nov_1_2_cos_c == 9) goto L00a;
- if (nov_1_2_cos_c == 8) goto L00b;
- if (nov_1_2_cos_c == 7) goto L00c;
- mes "I assure you are at the first place with this empty list of yours. You must go toward the Northwest.";
- mes "And meet 'Leo Von Frisch', the odd veteran Knight. He is a little bit boring, but that's ok. If you work out a correct answer to his question, he will give you some Snacks. So concentrate on him, Okay?";
- close;
-
- L00a:
- mes "Ah...? finished the First Course?";
- mes "Then meet the guy over there at the southwest, tell him 'I got the 1st lesson.'. He will lead you to the Second Hall.";
- mes "Well done~ Bye Bye~ Take Care, Okay?";
- close;
- L00b:
- mes "Err...? Didn't you hear the 'NPC Guide' Master's saying? Told you to go to the table right next him. Sigh~ Hurry up~";
- close;
- L00c:
- mes "Did you attend to 'Sir Leo Von Frisch''s Lesson already? Umm the next is...";
- mes "Go toward next hall at the Southeast, you will see two guys over there.";
- mes "Ask either of them~";
- close;
-
- L0:
- mes "[Guide]";
- mes "Alright~ Bye Bye~ Don't comback unless you have no idea~";
- close;
-}
-
-// -- Monster Explaination --
-new_1-2.gat,115,115,4 script Monster Expert 93,{
- mes "[Monster Expert]";
- mes "Hello My name is 'Rane' the Monster Expert in Rune-Midagrd Kingdom.";
- mes "I'll explain things about Monsters, Briefly.";
- next;
- mes "[Monster Expert]";
- mes "You can See 2 types of Monsters, Non-Aggressive One and Hostile One.";
- mes "Luckily, there are Non-Aggressive ones around Every City or town so that you don't have to worry about getting assaulted, but in Caves, Dungeons or even the Deep Forest Hostile Monsters are ready to attack you.";
- next;
- mes "[Monster Expert]";
- mes "Besides, the round and pink monster 'Poring' or 'Thief Bug' tends to swallows items rather than attack.";
- mes "So just ignore them even if they walk up to near you. They won't harm you before you attack.";
- next;
- mes "[Monster Expert]";
- mes "You can see a living statue of the famous 'Poring', a looter, behind me,";
- mes "and another of the little 'Baphomet Jr.', one of the strongest agressiv monster.";
- next;
- mes "[Monster Expert]";
- mes "And Just run away when you feel danger while fighting. If you go to the distance they won't be able to follow you.";
- mes "Good Luck.";
- close;
-}
-
-// -- Fake Poring --
-new_1-2.gat,112,120,5 script Statue of Poring 1002,{
- mes "[Living statue of Poring]";
- mes "'Don't touch please.'";
- close;
-}
-
-// -- Fake Bapho Jr. --
-new_1-2.gat,119,120,3 script Statue of Baphomet Jr. 1101,{
- mes "[Living statue of Baphomet Jr.]";
- mes "'Don't touch please.'";
- close;
-}
-
-// -- Fake Kafra --
-new_1-2.gat,158,158,8 script Kafra 117,{
- mes "'Please leave me alone.'";
- close;
-}
-
-// -- Fake Guide --
-new_1-2.gat,161,158,8 script Guide 105,{
- mes "'Please leave me alone.'";
- close;
-}
-
-// -- Npc Explanation --
-new_1-2.gat,160,183,5 script NPC Master 83,{
- if (nov_1_2_cos_c==7) goto Lstart;
- if (nov_1_2_cos_c>7) goto nov12coscM7;
-
- mes "[NPC Master]";
- mes "You are not supposed to be here yet. Attend 'Sir Leo Von Frisch''s Lesson first.";
- mes "If you can't find him, go outside this hall, inquire at the Guide on the Centre.";
- close;
-
- nov12coscM7:
- mes "[NPC Master]";
- mes "Huh? Why are you here again? I told you everything. Do you want me to do that again?";
- next;
- menu "Yeah.",L0,"No not really.",L1;
-
- L0:
- mes "[NPC Master]";
- mes "Alright alrighty. I will repeat for you.";
- next;
- goto Ltell;
- L1:
- if (nov_1_2_cos_c>8) goto nov12coscM8;
- mes "[NPC Master]";
- mes "Next Course is about 'Various examples of rude mannered players and cheaters'. Go to the right table.";
- close;
-
- nov12coscM8:
- mes "[NPC Master]";
- mes "Did you finish the Newbie Class? What am I talking about? Err... You know what I am saying~whatever...";
- close;
-
- Lstart:
- mes "[NPC Master]";
- mes "You said you finished the Newbie Class, didn't you? Then from now on I will give tips about NPCs which serve you in Ragnarok.";
- next;
- goto Ltell;
-
- Ltell:
- mes "[NPC Master]";
- mes "First, Rune-Midgard Troops which^ff0000 have building locations of each Town^000000.";
- next;
- mes "[NPC Master]";
- mes "They are standing at ^FF0000the enterance or the centre of Town^000000, if you don't know much about buildings, inquire at them. You won't ever be disappointed.";
- next;
- mes "[NPC Master]";
- mes "Second, Kafra Wearhouse where you can ^ff0000'Save'^000000and ^ff0000'Store items'^000000 and ^ff0000'Rent a Cart'^000000.";
- mes "'Save' means, ^ff0000set your respawn point preparing death while fighting or for the next time ^000000.";
- mes "So better save than forget? Kafra Staffs are standing at the similar spots as Rune-Midgard Troops.";
- mes "If you don't save at all, you walk a long way and bam~!you die. Then~There is no choice but to walk all the way back again. Doesn't it sound horrible?";
- next;
- mes "[NPC Master]";
- mes "And you can store your extra items in 'Kafra Wearhouse'. You can access the Storage wherever Kafra Staffs are located.";
- mes "I always think: 'Use storage' Service is the best for Infrastructure among MMORPG world!! Muhahahaha!!!";
- if (nov_1_2_cos_c==7) goto LtellNext;
- mes "Heh Heh~ And they are all beautiful girls~ What about their boss...? Is it a she or He? I am curious...";
- goto LtellNext;
-
- LtellNext:
- next;
- mes "[NPC Master]";
- mes "Unlike 'Save', 'Use the Storage' requires a small fee. The fee is different in different areas.";
- next;
- mes "[NPC Master]";
- mes "Last, Those Babes allow you to rent a Cart for the merchant's skill, 'Pushcart'...";
- next;
- mes "[NPC Master]";
- mes "Now let's check how they look like. So You will find them easily next time.";
- mes "We display figures of them over there. Just take a look before you go the next course.";
- next;
- if (nov_1_2_cos_c>7) goto LtellM7;
- mes "[NPC Master]";
- mes "Those figures... they were supposed to be right beside me first time... For me they felt really spooky... Imagine, Someone behind you without motion... spooky, huh?";
- mes "That's why I moved them over there... And now I can see them in front of my eyes... They feel more spooky now...";
- next;
- set nov_1_2_cos_c,8;
- goto LtellM7;
-
- LtellM7:
- mes "[NPC Master]";
- mes "Let's call it a day. Next Course is about 'Various examples of rude mannered players and cheaters'. Go to the right table.";
- close;
-}
-
-// -- Guide --
-new_1-2.gat,183,183,3 script Guide 95,{
- if (nov_1_2_cos_c==8) goto Lstart;
- if (nov_1_2_cos_c>=9) goto Lagain;
- mes "[Manner Master]";
- mes "Eh... Ah... Not here not yet... Well... What I mean is... Well... uh...";
- mes "What I mean is... You should attend to ^FF0000Leo Von Frisch's class on beginner help^000000 first...";
- mes "Eh... And after... Speak to 'NPC Master'... uh...";
- close;
-
- Lstart:
- mes "[Manner Master]";
- mes "Greetings~ I am just simple man who will inform you of 'Various examples of Ill-mannered players and cheaters'.";
- mes "Shall we begin?";
- next;
- goto Ltell;
-
- Ltell:
- mes "[Manner Master]";
- mes "1st, Let's get Started with ^ff0000Examples for Ill-manners and attentions ^000000. Just sit down and take it easy.";
- next;
- mes "[Manner Master]";
- mes "There are 3 kinds of Rude manners, 'Mob Stealing', 'Looting' and 'Mob Train'. First off I will tell you about 'Mob Stealing'.";
- mes "Ah~Before get started, let me tell you about 'Experience Points System in Ragnarok' that is much helpful to your understanding of 'Mob Stealing'. This is very important, Please listen.";
- next;
- mes "[Manner Master]";
- mes "The player who deals the most damage to the monster, takes the most Experience Points. It is based on the percentage of damage you do. You can get more Experience Points by doing more damages.";
- next;
- mes "[Manner Master]";
- mes "For example, if the player named 'Kitten the cat' attacks a monster having 100 HP and he does 65 damage on it, 'Kitten the cat' can get 65% of Experience Points from the monster.";
- mes "Usually this is the way you get Experience Points from Monsters. But it could be different in some situation.";
- next;
- mes "[Manner Master]";
- mes "This is a different situation when someone joins in on the attack.";
- next;
- mes "[Manner Master]";
- mes "First, the previous player 'Kitten the cat' attacks a monster having 100 HP and he does 50 damage, the other player 'Polar bear' attacks that monster and does the same damage.";
- next;
- mes "[Manner Master]";
- mes "In this situation, 'Kitten the cat' can get double the Experience Points of 'Polar bear'. 'Kitten the cat' gets '66.6%'of the Experience Points, 'Polar bear' gets '33.3%' of the Experience Points.";
- mes "Get it? Don't ask me about the remaining '0.1' of the Experience Points.I don't know where it goes~.I am not a director.HeHe~";
- next;
- mes "[Manner Master]";
- mes "'Kitten the cat' takes damage from the monster during the fight,";
- mes "'Polar Bear', a stranger to 'Kitten the cat' can get 1/2 of the Experience Points from 'Kitten the cat' without taking any damage.";
- mes "That's why we called this '^ff0000Mob Stealing^000000'.";
- next;
- mes "[Manner Master]";
- mes "Briefely and clearly, 'Mob Stealing' is a behaviour of a player ^970197Who doesn't care about the others^000000.";
- mes "And ^970197Just try to take advantage of others^000000 without any self-effort.";
- next;
- mes "[Manner Master]";
- mes "'Looting' is similar as Mob Stealing. While 'Mob Stealing', when a Player who Never fought picks up items belonging others, it is called '^ff0000Looting^000000'.";
- mes "Difference Between 'Mob Stealing' and 'Looting'is 'Experience Points'and 'Item'. Very Simple.";
- mes "But, after the Anti-Loot Patch came, The Sistuation has been getting better. And Anti-Loot wll be patched continuously.";
- next;
- mes "[Manner Master]";
- mes "Let's talk about 'Mob Train'.";
- mes "One player starts to attack a bunch of monsters. Those monsters start to follow that player. Because Monster AI is not fully implemented yet.";
- mes "The player then walks near other players and either exits the game or uses the thief skill hide. The monsters lose their target and immediately attack the nearlest person.";
- next;
- mes "[Manner Master]";
- mes "Briefly, 'Mob Train' means attacking a bunch of monsters with a purpose of abusing other players.";
- mes "If you want to be infamous in Ragnarokonline, I will suggest you do these things above. But if you do that, you would be the worst enemy to the public. Many players will dislike you.";
- next;
- mes "[Manner Master]";
- mes "OK the Next topic is 'The Cheaters'.";
- mes "The Cheaters are usually called 'Impersonating Server Staffs', 'Scammers', 'Beginer Scammers'.";
- mes "Umm... Let's start with 'Server Staff Imposter'.";
- next;
- mes "[Manner Master]";
- mes "Usually There are Players who pretend to be Management Crews. They ask other players let them know things like userID and Password. They then try to steal players' items and zeny.";
- mes "But Management Crews will never ask you for your userID or password. Please remember.";
- next;
- mes "[Manner Master]";
- mes "And please check out the official board frequently as you can. You can see what is going on clearly.";
- next;
- mes "[Manner Master]";
- mes "'Scammer' means a merchant player who try to cheat on the price of their items to the other players.";
- mes "For example, A Merchant opens a shop with the name 'Weapon price 20,000 zeny', but the actual weapon price in his Shop is 200,000 zeny.";
- mes "When you trade with merchants, Please always check the price of item. Here is a tip, Zeny is separated with a comma after every three units.like this:'2,000', '20,000' or '200,000'.";
- next;
- mes "[Manner Master]";
- mes "Our last one is 'Beginner Scammers'.";
- mes "Beginners are especially easy to be cheated. The cheaters tempt you with unavailable items or weapon upgrading.";
- next;
- mes "[Manner Master]";
- mes "So beginners should refer item descriptions on the website. You can check them in 'Guide' section.";
- mes "In addition, In Ragnarokonline Unathorized item Duplication is a Violation of applicable laws. Please remember that.";
- next;
- mes "[Manner Master]";
- mes "Heh~ It's a lot of informations for you right...? I didn't mean to take so long. Heh Heh...";
- mes "Ah~ Right! I forgot one really important thing.";
- next;
- mes "[Manner Master]";
- mes "About 'Swearing'... Heh Heh~~I believe you already know... Anyway... No way No swearwords~~";
- mes "Rude behaviour plus! Swearing... Ummm This is what they mean by ^970197the audacity of the thief^000000...";
- mes "... That would be '^FF0000The worst kind of player in Ragnarokonline^000000'...?";
- next;
- mes "[Manner Master]";
- mes "Please E-mail us when you want to report these rude players showing the chat window text. You can use 'Print Screen' button when you want to take a picture of screen.";
- mes "If you report to us with the perfect proof, The player accused of being rude mannered could be warned at first time. Then he could be banned forever.";
- next;
- mes "[Manner Master]";
- mes "Especially to players with a past conviction for rude behaviour, we take strong actions~.";
- next;
- mes "[Manner Master]";
- mes "Listen, Rude players~! When The day comes to PK...";
- mes "You might be dead under the feet of outraged players who have been abused...";
- mes "Also You would be freaked out and could not play forever.";
- next;
- mes "[Manner Master]";
- mes "Ok, This is the end of my lesson. You just finished your 1st course. Congratulations.";
- mes "When you go to the west side through the centre, See the helper who help you to go to the 2nd Course.";
- if (nov_1_2_cos_c>8) goto LtellM8;
- set nov_1_2_cos_c,9;
- goto LtellM8;
-
- LtellM8:
- close;
-
- Lagain:
- mes "[Manner Master]";
- mes "Ah... Well... Going to next is no problem... But...";
- mes "Would you like to attend to 'Various examples of Ill-mannered players and cheaters' again...?";
- next;
- menu "Yes.",Ltell,"No.",Lno;
-
- Lno:
- mes "[Manner Master]";
- mes "Umm Sorry. I don't know well about your next course so please inquire at the guide in the Central Hall.";
- close;
-}
-
-// == SECOND COURSE ==
-// -- Helper --
-new_1-2.gat,78,101,6 script Helper 105,{
- if (nov_1_2_cos_c>= 9) goto Lcourse2;
- mes "[Helper]";
- mes "I am a helper who will guide you to the 2nd registration office. Please attend all classes in 1st course First.";
- close;
-
- Lcourse2:
- mes "[Helper]";
- mes "You just finished 1st course... OK.";
- mes "I will let you go to the 2nd registration office.";
- next;
- set Done_milk,0;
- warp "new_1-2.gat",44,171;
- close;
-}
-
-// -- Helper --
-new_1-2.gat,39,183,3 script Helper 92,{
- if (nov_1_2_cos_c>=10) goto Lend;
- mes "[Helper]";
- mes "Your registration has confirmed. I would like to say 'Congratulations' also.";
- mes "I will let you know about 2nd course breifly.";
- next;
- mes "[Helper]";
- mes "Your mission is: You must reach at the Castle of the other side from here, through the Fabres Forest. You can do it easily.";
- next;
- mes "[Helper]";
- mes "Notice - If you lose consciousness during fight, you will lose your points and come back here automatically.";
- next;
- mes "[Helper]";
- mes "Ask the helper located in the left side about the entrance of 2nd Course.";
- mes "OK, We wish you luck.";
- set nov_1_2_cos_c,10;
- close;
-
- Lend:
- mes "[Helper]";
- mes "You can ask the helper located in the left side when you are ready for 2nd course.";
- close;
-}
-
-// -- Helper --
-new_1-2.gat,16,183,5 script Helper 84,{
- if (nov_1_2_cos_c==10) goto Lstep2;
- if (nov_1_2_cos_c>=11) goto Lrespawn;
- mes "[Helper]";
- mes "Heh... I can't find your name on the list.";
- mes "Could you register first at the front desk?";
- close;
-
- Lstep2:
- mes "[Helper]";
- mes "Heh... I can't find your name on the list...";
- mes "Ah! Here you are. Ok " + strcharinfo(0) + ". Are you ready?";
- next;
- menu "Yes.",Lyes,"No.",Lno;
-
- Lyes:
- set nov_1_2_cos_c,11;
- mes "[Helper]";
- mes "Well... We wish you luck.";
- savepoint "new_1-2.gat",23,183;
- warp "new_1-3.gat",96,21;
- close;
- Lno:
- mes "[Helper]";
- mes "Take some rest before the 2nd Course.";
- close;
- Lrespawn:
- mes "[Helper]";
- mes "You've been knocked out by Fabre. Yeah you can't fight with a bunch of Fabres anyway.";
- mes "By the way, 2nd Course 1th test. Are you going to start now?";
- next;
- menu "Yes.",Lspawnyes,"No.",Lno;
-
- Lspawnyes:
- mes "[Helper]";
- mes "Well... We wish you luck.";
- next;
- warp "new_1-3.gat",96,21;
- close;
-}
-
-
-// == THIRD COURSE ==
-// nov_3_merchant: count the number of answers to become merchant
-// nov_3_swordman: count the number of answers to become swordman
-// nov_3_archer: count the number of answers to become archer
-// nov_3_thief: count the number of answers to become thief
-// nov_3_magician: count the number of answers to become magician
-// nov_3_acolyte: count the number of answers to become acolyte
-// set nov_1_4_cos_c: to know third course advancement (to avoid to repeat question)
-
-// -- Helper --
-new_1-4.gat,100,29,4 script Helper 54,{
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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 @TEMP,rand(4);
- mes "[Helper]";
- mes "Welcome, Newbie!! I don't have much time to talk. I just tell you the basic details.";
- mes "Your registration has been confirmed at the time you arrived here! You can go directly through to the next 3 courses...";
- mes "Are you gonna start now?";
- next;
- menu "Let's Rock!",-,"Quit",L1;
-
- mes "[Helper]";
- mes "The guide will inform you details!";
- mes "Bye!";
- next;
- if (@TEMP != 0) goto L0a;
- warp "new_1-4.gat",94,56;
- close;
- L0a:
- if (@TEMP != 1) goto L0b;
- warp "new_1-4.gat",98,56;
- close;
- L0b:
- if (@TEMP != 2) goto L0c;
- warp "new_1-4.gat",102,56;
- close;
- L0c:
- warp "new_1-4.gat",106,56;
- close;
-
- L1:
- mes "[Helper]";
- mes "Are you waiting for someone here..?";
- close;
-}
-
-// -- Helper --
-new_1-4.gat,100,70,4 script Helper 67,{
- if (nov_1_4_cos_c > 13) goto LQFin;
- if (nov_1_4_cos_c > 5) goto LQ00;
- if (nov_1_4_cos_c > 0) goto ContinueQuestions;
- mes "[Helper]";
- mes "Here we are. From now on we will have 1st personality test.";
- mes "Take it easy and choose the right one for you.";
- mes "There are no standards for good and evil, it's just a test for your personality.";
- mes "Shall we start now?";
- next;
- goto ContinueQuestions;
-
- ContinueQuestions:
- mes "[Helper]";
- mes "Choose one word most familiar to you.";
- next;
- if (nov_1_4_cos_c == 1) goto LQ1;
- if (nov_1_4_cos_c == 2) goto LQ2;
- if (nov_1_4_cos_c == 3) goto LQ3;
- if (nov_1_4_cos_c == 4) goto LQ4;
- if (nov_1_4_cos_c == 5) goto LQ5;
-
- menu "Individual",LQ0a,"Public",LQ0b;
-
- LQ0a:
- set nov_1_4_cos_c,1;
- set nov_3_archer,nov_3_archer+1;
- goto LQ1;
- LQ0b:
- set nov_1_4_cos_c,1;
- set nov_3_thief,nov_3_thief+1;
- goto LQ1;
-
- LQ1:
- menu "Chances",LQ1a,"Permanence",LQ1b;
-
- LQ1a:
- set nov_1_4_cos_c,2;
- set nov_3_magician,nov_3_magician+1;
- goto LQ2;
- LQ1b:
- set nov_1_4_cos_c,2;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ2;
-
- LQ2:
- menu "Consumer",LQ2a,"Distributor",LQ2b;
-
- LQ2a:
- set nov_1_4_cos_c,3;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ3;
- LQ2b:
- set nov_1_4_cos_c,3;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ3;
-
- LQ3:
- menu "Swiftness",LQ3a,"Prudence",LQ3b;
-
- LQ3a:
- set nov_1_4_cos_c,4;
- set nov_3_thief,nov_3_thief+1;
- goto LQ4;
- LQ3b:
- set nov_1_4_cos_c,4;
- set nov_3_archer,nov_3_archer+1;
- goto LQ4;
-
- LQ4:
- menu "Theory",LQ4a,"Experience",LQ4b;
-
- LQ4a:
- set nov_1_4_cos_c,5;
- set nov_3_magician,nov_3_magician+1;
- goto LQ5;
- LQ4b:
- set nov_1_4_cos_c,5;
- goto LQ5;
-
- LQ5:
- menu "Reality",LQ5a,"Ideal",LQ5b;
-
- LQ5a:
- set nov_1_4_cos_c,6;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ00;
- LQ5b:
- set nov_1_4_cos_c,6;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ00;
-
- LQ00:
- mes "[Helper]";
- mes "Choose 'Yes' or 'No'.";
- next;
- if (nov_1_4_cos_c == 7) goto LQ01;
- if (nov_1_4_cos_c == 8) goto LQ02;
- if (nov_1_4_cos_c == 9) goto LQ03;
- if (nov_1_4_cos_c == 10) goto LQ04;
- if (nov_1_4_cos_c == 11) goto LQ05;
- if (nov_1_4_cos_c == 12) goto LQ06;
- if (nov_1_4_cos_c == 13) goto LQ07;
- mes "[Helper]";
- mes "To die with honor is better than to live with disgrace.";
- next;
- menu "Yes",LQ00a,"No",LQ00b;
-
- LQ00a:
- set nov_1_4_cos_c,7;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ01;
- LQ00b:
- set nov_1_4_cos_c,7;
- set nov_3_thief,nov_3_thief+1;
- goto LQ01;
-
- LQ01:
- mes "[Helper]";
- mes "It gives me headache even when my cousin makes big success.";
- next;
- menu "Yes",LQ01a,"No",LQ01b;
-
- LQ01a:
- set nov_1_4_cos_c,8;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ02;
- LQ01b:
- set nov_1_4_cos_c,8;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ02;
-
- LQ02:
- mes "[Helper]";
- mes "Always check the manual first before assemble something like household electric appliance.";
- next;
- menu "Yes",LQ02a,"No",LQ02b;
-
- LQ02a:
- set nov_1_4_cos_c,9;
- set nov_3_magician,nov_3_magician+1;
- goto LQ03;
- LQ02b:
- set nov_1_4_cos_c,9;
- set nov_3_archer,nov_3_archer+1;
- goto LQ03;
-
- LQ03:
- mes "[Helper]";
- mes "I am always at the head of everything.";
- next;
- menu "Yes",LQ03a,"No",LQ03b;
-
- LQ03a:
- set nov_1_4_cos_c,10;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ04;
- LQ03b:
- set nov_1_4_cos_c,10;
- set nov_3_archer,nov_3_archer+1;
- goto LQ04;
-
- LQ04:
- mes "[Helper]";
- mes "When I see the sign 'PULL' on the door I want to PUSH.";
- next;
- menu "Yes",LQ04a,"No",LQ04b;
-
- LQ04a:
- set nov_1_4_cos_c,11;
- set nov_3_thief,nov_3_thief+1;
- goto LQ05;
- LQ04b:
- set nov_1_4_cos_c,11;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ05;
-
- LQ05:
- mes "[Helper]";
- mes "Sometimes I see things unreal.";
- next;
- menu "Yes",LQ05a,"No",LQ05b;
-
- LQ05a:
- set nov_1_4_cos_c,12;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ06;
- LQ05b:
- set nov_1_4_cos_c,12;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ06;
-
- LQ06:
- mes "[Helper]";
- mes "I could fly if I fall off.";
- next;
- menu "Yes",LQ06a,"No",LQ06b;
-
- LQ06a:
- set nov_1_4_cos_c,13;
- goto LQ07;
- LQ06b:
- set nov_1_4_cos_c,13;
- set nov_3_magician,nov_3_magician+1;
- goto LQ07;
-
- LQ07:
- mes "[Helper]";
- mes "Money talks. I can buy even human being if I want.";
- next;
- menu "Yes",LQ07a,"No",LQ07b;
-
- LQ07a:
- set nov_1_4_cos_c,14;
- set nov_3_merchant,nov_3_merchant+1;
- set nov_3_magician,nov_3_magician+1;
- set nov_3_thief,nov_3_thief+1;
- goto LQFin;
- LQ07b:
- set nov_1_4_cos_c,14;
- set nov_3_swordman,nov_3_swordman+1;
- set nov_3_archer,nov_3_archer+1;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQFin;
-
- LQFin:
- set @TEMP,rand(4);
- mes "[Helper]";
- mes "You just finished 1st test. Congratulations.";
- mes "You can now go to the next test right away";
- next;
- if (@TEMP != 0) goto LQFin1;
- warp "new_1-4.gat",13,96;
- close;
- LQFin1:
- if (@TEMP != 1) goto LQFin2;
- warp "new_1-4.gat",17,96;
- close;
- LQFin2:
- if (@TEMP != 2) goto LQFin3;
- warp "new_1-4.gat",21,96;
- close;
- LQFin3:
- warp "new_1-4.gat",25,96;
- close;
-}
-
-// -- Helper --
-// nov_1_4_cos_c (variable) starts with value 14
-new_1-4.gat,20,109,4 script Helper 48,{
- if (nov_1_4_cos_c > 22) goto LQFin;
- if (nov_1_4_cos_c > 14) goto ContinueQuestions;
- mes "[Helper]";
- mes "We start your 2nd test now!";
- mes "Take it easy and choose the right answer for you!";
- mes "OK Start now!";
- next;
- goto LQ1;
-
- ContinueQuestions:
- mes "[Helper]";
- mes "We continue your 2nd test now!";
- mes "Take it easy and choose the right answer for you!";
- mes "OK continue now!";
- next;
- if (nov_1_4_cos_c == 15) goto LQ2;
- if (nov_1_4_cos_c == 16) goto LQ3;
- if (nov_1_4_cos_c == 17) goto LQ4;
- if (nov_1_4_cos_c == 18) goto LQ5;
- if (nov_1_4_cos_c == 19) goto LQ6;
- if (nov_1_4_cos_c == 20) goto LQ7;
- if (nov_1_4_cos_c == 21) goto LQ8;
- if (nov_1_4_cos_c == 22) goto LQ9;
-
- LQ1:
- mes "[Helper]";
- mes "For you life means...";
- next;
- menu "Feel irritated.",LQ1a,"I like it.",LQ1b,"Doesn't come to my mind.",LQ1c;
-
- LQ1a:
- set nov_1_4_cos_c,15;
- set nov_3_swordman,nov_3_swordman+1;
- set nov_3_thief,nov_3_thief+1;
- goto LQ2;
- LQ1b:
- set nov_1_4_cos_c,15;
- set nov_3_merchant,nov_3_merchant+1;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ2;
- LQ1c:
- set nov_1_4_cos_c,15;
- set nov_3_archer,nov_3_archer+1;
- set nov_3_magician,nov_3_magician+1;
- goto LQ2;
-
- LQ2:
- mes "[Helper]";
- mes "Before you buy something in a shop...";
- next;
- menu "Check first whether it's neccessary.",LQ2a,"Check the cash first.",LQ2b,"Regret after shopping.",LQ2c;
-
- LQ2a:
- set nov_1_4_cos_c,16;
- set nov_3_archer,nov_3_archer+1;
- goto LQ3;
- LQ2b:
- set nov_1_4_cos_c,16;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ3;
- LQ2c:
- set nov_1_4_cos_c,16;
- set nov_3_thief,nov_3_thief+1;
- goto LQ3;
-
- LQ3:
- mes "[Helper]";
- mes "When you have to compete with others...";
- next;
- menu "I enjoy it.",LQ3a,"I do if I have to.",LQ3b,"I hate it.",LQ3c;
-
- LQ3a:
- set nov_1_4_cos_c,17;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ4;
- LQ3b:
- set nov_1_4_cos_c,17;
- set nov_3_archer,nov_3_archer+1;
- goto LQ4;
- LQ3c:
- set nov_1_4_cos_c,17;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ4;
-
- LQ4:
- mes "[Helper]";
- mes "When you deal something...";
- next;
- menu "I prefer to deal alone.",LQ4a,"I prefer to deal together.",LQ4b;
-
- LQ4a:
- set nov_1_4_cos_c,18;
- set nov_3_magician,nov_3_magician+1;
- goto LQ5;
- LQ4b:
- set nov_1_4_cos_c,18;
- set nov_3_thief,nov_3_thief+1;
- goto LQ5;
-
- LQ5:
- mes "[Helper]";
- mes "If anyone ask you a favour...";
- next;
- menu "Anything I can help, I will do my best.",LQ5a,"Simply I would help.",LQ5b,"Just ignore.",LQ5c;
-
- LQ5a:
- set nov_1_4_cos_c,19;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ6;
- LQ5b:
- set nov_1_4_cos_c,19;
- set nov_3_archer,nov_3_archer+1;
- goto LQ6;
- LQ5c:
- set nov_1_4_cos_c,19;
- set nov_3_magician,nov_3_magician+1;
- goto LQ6;
-
- LQ6:
- mes "[Helper]";
- mes "If anyone offer you to be President / Vise-President / a Congressman...";
- next;
- menu "President.",LQ6a,"Vise-President",LQ6b,"Congressman is ok.",LQ6c,"I don't want to be a politican.",LQ6d;
-
- LQ6a:
- set nov_1_4_cos_c,20;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ7;
- LQ6b:
- set nov_1_4_cos_c,20;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ7;
- LQ6c:
- set nov_1_4_cos_c,20;
- set nov_3_thief,nov_3_thief+1;
- goto LQ7;
- LQ6d:
- set nov_1_4_cos_c,20;
- goto LQ7;
-
- LQ7:
- mes "[Helper]";
- mes "If you come across the keen knife on the street then you think...";
- next;
- menu "'Look so sharp!'",LQ7a,"'Who the hell is the owner of this?'",LQ7b,"'Could be dead harm to people. Should be careful!'",LQ7c,"'Nice Brand~!'",LQ7d;
-
- LQ7a:
- set nov_1_4_cos_c,21;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ8;
- LQ7b:
- set nov_1_4_cos_c,21;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ8;
- LQ7c:
- set nov_1_4_cos_c,21;
- set nov_3_magician,nov_3_magician+1;
- goto LQ8;
- LQ7d:
- set nov_1_4_cos_c,21;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQ8;
-
- LQ8:
- mes "[Helper]";
- mes "When you meet a difficult situation during conversation";
- next;
- menu "I hush up with a joke.",LQ8a,"I change subject.",LQ8b,"I try to excuse.",LQ8c,"I appoligize even though it's not my fault.",LQ8d;
-
- LQ8a:
- set nov_1_4_cos_c,22;
- set nov_3_thief,nov_3_thief+1;
- goto LQ9;
- LQ8b:
- set nov_1_4_cos_c,22;
- set nov_3_swordman,nov_3_swordman+1;
- goto LQ9;
- LQ8c:
- set nov_1_4_cos_c,22;
- set nov_3_magician,nov_3_magician+1;
- goto LQ9;
- LQ8d:
- set nov_1_4_cos_c,22;
- set nov_3_acolyte,nov_3_acolyte+1;
- goto LQ9;
-
- LQ9:
- mes "[Helper]";
- if (sex==1) goto SexLQ9;
- mes "Now your girl friend asks you to buy a useless gift like souvenir...";
- next;
- goto LQ9Norm;
-
- SexLQ9:
- mes "Now your boy friend asks you to buy a useless gift like souvenir...";
- next;
- goto LQ9Norm;
-
- LQ9Norm:
- menu "I would do anything for that person.",LQ9a,"I try to bring around not to buy it.",LQ9b;
-
- LQ9a:
- set nov_1_4_cos_c,23;
- set nov_3_archer,nov_3_archer+1;
- goto LQFin;
- LQ9b:
- set nov_1_4_cos_c,23;
- set nov_3_merchant,nov_3_merchant+1;
- goto LQFin;
-
- LQFin:
- mes "[Helper]";
- mes "Now you finished 2nd test! Good job!!";
- mes "You can go to the result room now.";
- next;
- set @TEMP,rand(4);
- if (@TEMP !=0 ) goto LQFin0;
- warp "new_1-4.gat",54,136;
- close;
- LQFin0:
- if (@TEMP !=1 ) goto LQFin1;
- warp "new_1-4.gat",58,136;
- close;
- LQFin1:
- if (@TEMP !=2 ) goto LQFin2;
- warp "new_1-4.gat",62,136;
- close;
- LQFin2:
- warp "new_1-4.gat",66,136;
- close;
-}
-
-// -- Helper --
-// @job_number: best job (0: Swordman, 1: Archer, 2: Thief, 3: Magican, 4: Acolyte, 5: Merchant)
-// @nov_2nd_cos: number of answers for the best job
-// nov_1_4_cos_c (variable) starts with value 23
-new_1-4.gat,60,149,4 script Helper 55,{
- mes "[Helper]";
- mes "Congratulations~! You finished whole courses by yourself!";
- mes "You should remember what you've learned from Training Ground. It would be useful to you.";
- next;
- mes "[Helper]";
- mes "Ok, here is the result of your own.";
- next;
-
- set @nov_2nd_cos,nov_3_swordman;
- set @job_number,0;
-
- if (@nov_2nd_cos >= nov_3_archer) goto L_ROOT_1;
- set @nov_2nd_cos,nov_3_archer;
- set @job_number,1;
- goto L_ROOT_1;
-
- L_ROOT_1:
- if (@nov_2nd_cos >= nov_3_thief) goto L_ROOT_2;
- set @nov_2nd_cos,nov_3_thief;
- set @job_number,2;
- goto L_ROOT_2;
-
- L_ROOT_2:
- if (@nov_2nd_cos >= nov_3_magician) goto L_ROOT_3;
- set @nov_2nd_cos,nov_3_magician;
- set @job_number,3;
- goto L_ROOT_3;
-
- L_ROOT_3:
- if (@nov_2nd_cos >= nov_3_acolyte) goto L_ROOT_4;
- set @nov_2nd_cos,nov_3_acolyte;
- set @job_number,4;
- goto L_ROOT_4;
-
- L_ROOT_4:
- if (@nov_2nd_cos >= nov_3_merchant) goto L_START;
- set @nov_2nd_cos,nov_3_merchant;
- set @job_number,5;
- goto L_START;
-
- L_START:
- mes "[Helper]";
- if (nov_1st_cos != 0) goto L_SCORE_1;
- mes "1st course: 0 / 6 Points.";
- goto L_SCORE_2;
- L_SCORE_1:
- mes "1st course: " + nov_1st_cos + " / 6 Points.";
- goto L_SCORE_2;
-
- L_SCORE_2:
- if (@nov_2nd_cos != 0) goto L_SCORE_3;
- mes "2nd course: 0 / 10 Points";
- goto L_SCORE_4;
- L_SCORE_3:
- mes "2nd course: " + @nov_2nd_cos + " / 10 Points.";
- goto L_SCORE_4;
-
- L_SCORE_4:
- mes "And the result of personally test is...";
- next;
-
- if (@job_number==0) goto JobSwordman;
- if (@job_number==1) goto JobArcher;
- if (@job_number==2) goto JobThief;
- if (@job_number==3) goto JobMagican;
- if (@job_number==4) goto JobAcolyte;
- if (@job_number==5) goto JobMerchant;
-
- JobSwordman:
- mes "[Helper]";
- mes "'You have simple-minded and always talk straight. And you have an unshaken faith so that you want to rule the world. Also you always stand by the weak.'";
- mes "'So We suggest you ^696969Swordman^000000.";
- goto SelJob;
- JobArcher:
- mes "[Helper]";
- mes "'You are very emotional and sensitive person. And you have open-minded.'";
- mes "'Also, You don't want to be ordinary, always eager for valuable life of your own.'";
- mes "'So we suggest you ^696969Archer^000000.'";
- goto SelJob;
- JobThief:
- mes "[Helper]";
- mes "'You always try to enjoy your life. Life is like adventure for you.'";
- mes "'So we suggest you ^696969Thief^000000.'";
- goto SelJob;
- JobMagican:
- mes "[Helper]";
- mes "'You are self-diciplined person. Sometimes you pretend to understand whole things in the world not to be silly to the other person.";
- mes "'You are man of reason, an introvert, an analyst, a man of keen insight.'";
- mes "'So we suggest you ^696969Mage^000000.";
- goto SelJob;
- JobAcolyte:
- mes "[Helper]";
- mes "'You are warm-hearted, easy-going person, taking care of people.'";
- mes "'But actually you pretend not to need help from the other, people think you are an altruist*.";
- mes "'So we suggest you ^696969Acolyte^000000.'";
- mes " ";
- mes "'* The person who really enjoy helping people with self-sacrifice.'";
- goto SelJob;
- JobMerchant:
- mes "[Helper]";
- mes "'You can easily catch what the public wants, and you have a talent to organize system, and you have a strong sense of responsibility.'";
- mes "'So we suggest you ^696969Merchant^000000.'";
- goto SelJob;
-
- SelJob:
- next;
- mes "[Helper]";
- mes "...Report says like this. It is not my intention, I don't mean to nice to you!! To me you are just a novice!!";
- mes "Never take it seriously, it's just a game.";
- next;
- mes "[Helper]";
- mes "Here are the subsides from the Training Ground. Even if they are not worthless to veteran players, not to you.";
- next;
- if (nov_1_4_cos_c > 23) goto BeL0;
-
- nov12coscE0:
- getitem 519,1;
- set nov_1_4_cos_c,24;
- set @temp,nov_1st_cos+@nov_2nd_cos;
- if (@temp <= 8) goto nov1stcosPnov2ndcosL8;
- if (@temp <= 15) goto nov1stcosPnov2ndcosL15;
- if (@temp == 16) goto nov1stcosPnov2ndcosE16;
- set Zeny,Zeny-500;
- getitem 507,10;
- goto BeL0;
-
- nov1stcosPnov2ndcosL8:
- set Zeny,Zeny+500;
- getitem 507,10;
- goto BeL0;
- nov1stcosPnov2ndcosL15:
- set Zeny,Zeny+100;
- getitem 507,1;
- goto BeL0;
- nov1stcosPnov2ndcosE16:
- set Zeny,Zeny+300;
- getitem 507,3;
- goto BeL0;
-
- BeL0:
- mes "[Helper]";
- mes "Now I will let you go to the Job Agency. Before going there are a few things you have to know.";
- next;
- mes "[Helper]";
- mes "Are you going to choose the job following the test? Or are you going to choose you job by your own will?";
- next;
- mes "[Helper]";
- mes "If you follow the test, you can get a lot of subsidy for headstart from guild and association and get to start in the specific town for your job.";
- mes "If you follow your will, you get to start in specific town for your job with 100 zeny before we gave you.";
- next;
- mes "[Helper]";
- mes "Choose one. This is your only chance.";
- next;
- menu "I want to be what I wanted!",L0,"I will follow the result of the test",L1;
-
- L0:
- mes "[Helper]";
- mes "Ok. I see. Choose one what you wanted to be. I will send you to the town right away.";
- if (nov_1_4_cos_c > 24) goto JobMenu;
- set nov_1_4_cos_c,25;
- set Zeny,Zeny+100;
- mes "I give you 100z to begin in the great world or ragnarok.";
- goto JobMenu;
-
- JobMenu:
- next;
- menu "Swordman.",L00,"Archer.",L01,"Thief.",L02,"Mage.",L03,"Acolyte.",L04,"Merchant",L05;
-
- L00:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "izlude.gat",94,104;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "izlude_in.gat",121,165;
- close;
- L01:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "payon.gat",87,117;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "payon_in02.gat",21,71;
- close;
- L02:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "morocc.gat",160,94;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "morocc.gat",27,291;
- close;
- L03:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "geffen.gat",120,100;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "geffen.gat",66,175;
- close;
- L04:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "prontera.gat",273,354;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "prontera.gat",233,313;
- close;
- L05:
- mes "[Helper]";
- mes "I expect you the best.";
- savepoint "alberta.gat",116,57;
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "alberta.gat",40,42;
- close;
-
- L1:
- if (@job_number==0) goto WarpJobSwordman;
- if (@job_number==1) goto WarpJobArcher;
- if (@job_number==2) goto WarpJobThief;
- if (@job_number==3) goto WarpJobMagican;
- if (@job_number==4) goto WarpJobAcolyte;
- if (@job_number==5) goto WarpJobMerchant;
-
- WarpJobSwordman:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new_1-4.gat",20,176;
- close;
- WarpJobArcher:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new_1-4.gat",60,176;
- close;
- WarpJobThief:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new-5_4.gat",100,176;
- close;
- WarpJobMagican:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new_1-4.gat",140,176;
- close;
- WarpJobAcolyte:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new_1-4.gat",180,176;
- close;
- WarpJobMerchant:
- mes "[Helper]";
- mes "Let warp you";
- next;
- warp "new_1-4.gat",180,136;
- close;
-}
-
-// == JOB AGENCIES ==
-
-// -- Swordman --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 1 Sword, 1 Red Potion, 3 Meats
-new_1-4.gat,19,189,4 script Swordman's Helper 105,{
- save "izlude_in.gat",121,165;
- mes "['Swordman' Agency Helper]";
- mes "Welcome!";
- mes "Here is Swordman Agency";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Swordman' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Swordman' Agency Helper]";
- mes "Ok.";
- mes "I will give you a few subsidy and let you get there.";
- mes "Here are 1 Sword, 1 Red Potion and 3 Meats for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 1103,1;
- getitem 501,1;
- getitem 517,3;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "izlude_in.gat",121,165;
- close;
-}
-
-// -- Archer --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 3 Red Potions, 50 zenys
-new_1-4.gat,59,186,4 script Archer's Helper 105,{
- savepoint "payon.gat",87,117;
- mes "['Archer' Agency Helper]";
- mes "Wecome!";
- mes "Here is Archer Agency.";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Archer' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Archer' Agency Helper]";
- mes "Ok.";
- mes "I will give you a few subsidy and let you get there.";
- mes "Here are 3 Red potions and 50 zeny for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 501,3;
- set Zeny,Zeny+50;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "payon_in02.gat",21,71;
- close;
-}
-
-// -- Thief --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 1 Jacket, 6 Sweet Patatos
-new_1-4.gat,99,186,4 script Thief's Helper 105,{
- savepoint "morocc.gat",160,94;
- mes "['Thief' Agency Helper]";
- mes "Welcome!";
- mes "Here is the thief agency.";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Thief' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Thief' Agency Helper]";
- mes "Ok.";
- mes "I will give a few subsidy and let you get there.";
- mes "Here are 1 Jacket and 6 Sweet Patatos for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 2303,1;
- getitem 516,6;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "morocc.gat",27,291;
- close;
-}
-
-// -- Mage --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 3 Red Potions, 100 zenys
-new_1-4.gat,139,186,4 script Mage's Helper 105,{
- savepoint "geffen.gat",120,100;
- mes "['Mage' Agency Helper]";
- mes "Wecome!";
- mes "Here is Mage Agency.";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Mage' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Mage'Agency Helper]";
- mes "Ok.";
- mes "I will give you a few subsidy and let you get there.";
- mes "Here are 3 Red potions and 100 Zeny for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 501,3;
- set Zeny,Zeny+100;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "geffen.gat",66,175;
- close;
-}
-
-// -- Acolyte --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 3 Red Potions, 1 Club
-new_1-4.gat,179,186,4 script Acolyte's Helper 105,{
- savepoint "prontera.gat",273,354;
- mes "['Acolyte' Agency Helper]";
- mes "Wecome!";
- mes "Here is Acolyte Agency.";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Acolyte' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Acolyte' Agency Helper]";
- mes "Ok.";
- mes "I will give you a few subsidy and let you get there.";
- mes "Here are 3 Red Potions and a Club for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 501,3;
- getitem 1503,1;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "prontera.gat",233,313;
- close;
-}
-
-// -- Merchant --
-// nov_1_4_cos_c (variable) starts with value 25
-// Bonus: 3 Red Potions, 100 zenys
-new_1-4.gat,180,146,4 script Merchant's Helper 105,{
- savepoint "alberta.gat",116,57;
- mes "['Merchant' Agency Helper]";
- mes "Wecome!";
- mes "Here is Merchant Agency.";
- mes "We are so pleased with you doing great until now.";
- next;
- mes "['Merchant' Agency Helper]";
- mes "Also we hope you will become the greatest adventurer in Ragnarok.";
- mes "Are you ready?";
- next;
- mes "['Merchant' Agency Helper]";
- mes "Ok.";
- mes "I will give you a few subsidy and let you get there.";
- mes "Here are 3 Red potions and 100 Zeny for you.";
- if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
- set nov_1_4_cos_c,26;
- getitem 501,3;
- set Zeny,Zeny+100;
- goto nov_get_item05cont;
-
- nov_get_item05cont:
- next;
- set nov_1st_cos,0;
- set nov_get_item01,0;
- set nov_1_2_cos_c,0;
- set Done_milk,0;
- set nov_1_4_cos_c,0;
- set nov_3_merchant,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;
- warp "alberta.gat",40,42;
- close;
-}
-
+//===== eAthena Script =======================================
+//= Novice Training Grounds
+//===== By: ==================================================
+//= eAthena Dev Team (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+//--------------------------------------------------------------
+//------------------ EXPLANATION OF VARIABLES ------------------
+// Permanent variables:
+// before first course:
+// - nov_get_item01: flag to know if Usher had given 150 z
+// in first course:
+// - nov_1_2_cos_c: to know first course advancement
+// - nov_1st_cos: to know number of right/correct answers with Leo Von Frisch
+// - Done_milk: to know if milk has been given by the Newbie Instructor
+// in third course:
+// - set nov_1_4_cos_c: to know third course advancement (to avoid to repeat question)
+// - nov_3_merchant: count the number of answers to become merchant
+// - nov_3_swordman: count the number of answers to become swordman
+// - nov_3_archer: count the number of answers to become archer
+// - nov_3_thief: count the number of answers to become thief
+// - nov_3_magician: count the number of answers to become magician
+// - nov_3_acolyte: count the number of answers to become acolyte
+
+
+// == MONSTERS ==
+//Spawn is included in this file so make shure its not elsewhere to!
+new_1-3.gat,0,0,0,0 monster FABRE 1184,50,0,0,0
+
+
+// == NPCs ==
+// -- Board --
+new_1-1.gat,66,114,1 script Bulletin Board 111,{
+ mes "^FF0000=================================^000000";
+ mes "^FF0000 == ^E40CAA[Welcome] ^CC0000to^FF9000Training ^0000FFGround ^FF0000==^000000";
+ mes "^FF0000=================================^000000";
+ close;
+}
+
+// -- Guards --
+new_1-1.gat,117,107,2 script Guard 105,{
+ set @TEMP,rand(2);
+ if (@TEMP !=0) goto L0;
+ mes "[Guard]";
+ mes "Go! Newbie! Go! You will see a New sun tomorrow!";
+ close;
+
+ L0:
+ mes "[Guard]";
+ mes "Come in! Welcome to the Real world!";
+ mes "We are trying to do our best to support newbies like you!";
+ close;
+}
+
+new_1-1.gat,117,116,2 script Guard 105,{
+ mes "[Guard]";
+ mes "Welcome~ Now, you're in Training Ground~";
+ mes "Please go inside the Castle.";
+ close;
+}
+
+// -- Chief --
+new_1-1.gat,157,124,3 script Training Ground Chief 56,{
+ mes "[Training Ground Chief]";
+ mes "Umm...? Aren't you a Freshman? You have a lot of guts to dare to come up.";
+ mes "Didn't that Guide stop you?";
+ next;
+ menu "He did, but I didn't listen to him.",Lyes,"Nope, he didn't.",Lno;
+
+ Lyes:
+ mes "[Training Ground Chief]";
+ mes "He did? And you came up without any timidity!?";
+ mes "Giggle... giggle...";
+ mes "Muhahahahaha!";
+ next;
+ mes "[Training Ground Chief]";
+ mes "Wow man! You are really something, huh?";
+ mes "Well... Rune-Midgard wants brave man like you. I expect you will be the most efficient man for Ragnarok. Do your best.";
+ close;
+ Lno:
+ mes "[Training Ground Chief]";
+ mes "What...? He didn't? Hmm... I need to improve the moral fiber. Even though the World is in Great fear...";
+ next;
+ mes "[Training Ground Chief]";
+ mes "Go downstairs. Don't disturb me. I need time to think of.";
+ close;
+}
+
+// -- Usher --
+// nov_get_item01: flag to know if Usher had given 150 z.
+// 0: not given
+// 1: given
+new_1-2.gat,100,29,4 script Usher 86,{
+ mes "[Usher]";
+ mes "Welcome to the ^FF0000Training Ground^000000 .";
+ mes "Please choose ^0099FFIntroduction^000000 first if you need to check detailed information about Training Ground.";
+ next;
+ menu "Sign Up on the Training Ground.",Lsign,"Direct Access to Ragnarok.",Ldirect,"^0099FFIntroduction.^000000",Lintro,"Cancel.",Lcancel;
+
+ Lsign:
+ mes "[Usher]";
+ mes "Registration has been confirmed.";
+ mes "Please inquire at each Guide on the course when you need.";
+ next;
+ if (nov_get_item01 == 1) goto Lsign1;
+
+ set nov_get_item01,1;
+ set Zeny,Zeny+150;
+ mes "[Usher]";
+ mes "Training Subsidy 150 Zeny supplied. Please inquire at a Guide on the Center when you need to know your Current Progress.";
+ mes "I will lead you into the Hall.";
+ next;
+
+ Lsign1:
+ set nov_get_item01,0;
+ warp "new_1-2",100,70;
+ close;
+
+ Ldirect:
+ mes "[Usher]";
+ mes "I see.";
+ mes "Hopefully you will contribute to public wellfare in near future, good luck.";
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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 @TEMP,rand(6);
+
+ if (@TEMP !=0) goto Ldirect0;
+ savepoint "prontera.gat",273,354;
+ warp "prontera.gat",273,354;
+ close;
+ Ldirect0:
+ if (@TEMP !=1) goto Ldirect1;
+ savepoint "morocc.gat",160,94;
+ warp "morocc.gat",160,94;
+ close;
+ Ldirect1:
+ if (@TEMP !=2) goto Ldirect2;
+ savepoint "geffen.gat",120,100;
+ warp "geffen.gat",120,100;
+ close;
+ Ldirect2:
+ if (@TEMP !=3) goto Ldirect3;
+ savepoint "payon.gat",87,117;
+ warp "payon.gat",87,117;
+ close;
+ Ldirect3:
+ if (@TEMP !=4) goto Ldirect4;
+ savepoint "alberta.gat",116,57;
+ warp "alberta.gat",116,57;
+ close;
+ Ldirect4:
+ savepoint "izlude.gat",94,103;
+ warp "izlude.gat",94,103;
+ close;
+
+ Lintro:
+ mes "[Usher]";
+ mes "The Training Grounds were founded to support New Players of Ragnarok Online,";
+ mes "under the Auspices of the Ministry of Education in Rune Midgard Kingdom.";
+ next;
+ mes "[Usher]";
+ mes "We guide you on to adapt the Mechanics of Ragnarok at ease, also we recommend the Best profession for your personality through the Typology Test.";
+ next;
+ mes "[Usher]";
+ mes "You can train yourself with 3 courses in here.";
+ next;
+ mes "[Usher]";
+ mes "You can learn entire theoretical information in the First Course.";
+ next;
+ mes "[Usher]";
+ mes "You will practice on the Actual spot in Fabres Field, the Second Course. Please do everything as you can do before jumping into the Real Ragnarok World.";
+ next;
+ mes "[Usher]";
+ mes "The Third course is the Typology Test. You will figure out the best job for you with this test.";
+ mes "You just answer the most suited answer when the course master asks you.";
+ next;
+ mes "[Usher]";
+ mes "When you finish whole courses, we'll inform you the result and recommend the Job for you.";
+ mes "Also if you accept our recommendation, we will tender you with small subsidy and let you begin in the specfic town for that Job.";
+ mes "For example, when the result comes 'Archer', you will start in 'Payon'.";
+ next;
+ mes "[Usher]";
+ mes "If you want to apply on the Training Ground, Please choose 'Sign Up on the Training Ground'.";
+ mes "if you not, choose 'Direct Access to Ragnarok'.";
+ next;
+ menu "Sign Up on the Training Ground.",Lsign,"Direct Access to Ragnarok.",Ldirect,"^0099FFIntroduction.^000000",Lintro,"Cancel.",Lcancel;
+ close;
+
+ Lcancel:
+ mes "[Usher]";
+ mes "Take your time.";
+ close;
+}
+
+
+// == FIRST COURSE ==
+// nov_1_2_cos_c: to know first course advancement
+// 0: newbie. Have not begin to speak (must speak to Leo Von Frish).
+// 1: Question 1 Leo Von Frisch done
+// 2: Question 2 Leo Von Frisch done
+// 3: Question 3 Leo Von Frisch done
+// 4: Question 4 Leo Von Frisch done
+// 5: Question 5 Leo Von Frisch done
+// 6: Question 6 Leo Von Frisch done
+// 7: Question 7 Leo Von Frisch done
+// 8: 'NPC Guide' Master done.
+// 9: 'Manner Master' done. Must register for Fabres forest.
+// 10: Register for Fabres forest. Must begin 2nd Course 1th test
+// 11: have been at least once in the Fabres forest.
+// nov_1st_cos: to know number of right/correct answers with Leo Von Frisch
+
+// Done_milk: to know if milk has been given by the Newbie Instructor
+// 0: not speak to Newbie Instructor (or at Fabres forest or more)
+// 1: speak to Newbie Instructor
+
+// -- Instructor --
+new_1-2.gat,81,110,4 script Newbie Instructor 84,{
+ if (Done_milk==0) goto Lyes;
+
+ mes "[Newbie Instructor]";
+ mes "Do you want listen me again?";
+ next;
+ menu "Yes!",Lyes,"No, not again.",Lno;
+
+ Lno:
+ mes "[Newbie Instructor]";
+ mes "Move along to the next course!";
+ close;
+
+ Lyes:
+ mes "[Newbie Instructor]";
+ mes "Ho? A Rookie? So, are you gonna get some education from Sir Leo Von Frisch?";
+ mes "Well ~ I must say he is sort of restless person, so that he tends to skip important issues while training.";
+ mes "I am afraid to say you need aditional education besides his lecture... Alright! I will give you a favour, buddy!";
+ next;
+ mes "[Newbie Instructor]";
+ mes "First off all you need to realise yourself. Your Chracter, the avatar of yourself inside the game has various distictive quality.";
+ mes "Level, EXPerience points, Status et cetera et cetera... many facts gather and construct your character.";
+ mes "Now let's take a look on character Status.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "^FF0000STR (Strength)^000000";
+ mes "- Increase hit point and maximum weight.";
+ mes "^FF0000AGI (Agility)^000000";
+ mes "- Increase flee rate and attack speed.";
+ mes "^FF0000VIT (Vitality)^000000";
+ mes "- Increase defence, maximum health point and HP recovering amount.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "^FF0000INT (intelligence)^000000";
+ mes "- Increase magic attack and magic defence.";
+ mes "^FF0000DEX (Dexterity)^000000";
+ mes "- Increase hitting accuracy and weapon damage.";
+ mes "^FF0000LUK (Luck)^000000";
+ mes "- Affect on various parts.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "You must keep Status abilities in mind before everything.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "When right-clicking on the 'status' button, you will see 'Status window' which shows current condition of a character. Shortcut is 'Alt + A'.";
+ mes "When you bring a cursor on each status, you can see the real meaning of it.";
+ mes "You will gain some points everytime Base Level is up, you can freely distribute them into ^FF00006 status^000000.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "The boxes next to each stat show the ^FF0000base value of the stat plus any bonuses from equipment. The left box shows the point cost to upgrade the stat by 1^000000.";
+ mes "When the character levels up, Blue button appears on the bottom of right side of the monitor screen. Click it to open the status window.";
+ mes "Click the blue Arrow to spend the points you get, ^FF0000You can upgrade stats as you want ^000000.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "Oh well, 'Tendency' hasn't been implemented yet, let's talk later then.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "Shall we move onto the next issue?";
+ next;
+ mes "[Newbie Instructor]";
+ mes "Right-clicking on a character leads you to see individual menu including Trade command.";
+ mes "When left-clicking on Trade menu, ^FF0000'Trade window'^000000 pops up. That's the way you can exchange ^FF0000items or zeny, Ragnarok currency^000000 with another character.";
+ mes "There are 2 different buttons on the bottom of trade window, one is ´OK´ the other is ´Cancel´.";
+ mes "Press ´OK´ if you are ready or ´Cancel´ if you want to cancel the deal.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "Let's check the ^FF0000'Chat Window'^000000 on the bottom of game screen, which allows you to chat with others. It is devided into 2 parts, you can enter a ^FF0000character name you want to whisper^000000 at the left part.";
+ mes "If you click the button beside the left part, you can check all character names who you have already whispered to or you got whispered so far. So you can whisper to the characters without typing their names again.";
+ mes "At the right part of chat window, you can type the message you want to send. And with the first button beside this part, you can choose chat type as public or private among party members.";
+ mes "With the last button on the chat window, you can arrange chat window size.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "The following text tells you more about the 'Character View'.";
+ mes "When you drag mouse from right to left with the right mouse button held down, the character view rotates (360°).";
+ mes "Holding down the 'Ctrl' key and the right mouse button while dragging the mouse up and down, makes the view ^FF0000Zooming in and out toward the character^000000.";
+ mes "Holding down the 'Shift' key and the right mouse button while dragging the mouse up and down, controls the angle of the view ^FF0000for fixed range^000000.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "This is the last thing I have to teach you about shorcuts. You will realize how important Shorcuts are if you want to play with efficiency.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "^FF0000The 'ESC' ^000000key is the function key, it ^0087FFcalls 'Exit to window' command or 'Return to game' command^000000.";
+ mes "^FF0000 Keys From 'F1' to 'F9'^000000 are shortcut keys for ^0087FFeach item registered on Hot key window^000000.";
+ mes "^FF0000The Key 'F10'^000000 adjusts ^0087FFthe size of chat window^000000.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "^FF0000The key 'F11'^000000 clears ^0087FFall windows except basic information window and chatting box^000000.";
+ mes "^FF0000The key 'F12'^000000 calls ^0087FFHot key window^000000.";
+ mes "^FF0000The key 'insert' on the keyboard^000000 is the hot key for character's to ^0087FFsit or stand^000000. Also you can type ^0087FF'/sit or /stand'^000000 in the chatting Box.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "^FF0000The key 'alt+home'^000000 is ^0087FFShorcut for Ground cursor on / off^000000.";
+ mes "^FF0000The key 'alt+end'^000000 is ^0087FFShorcut for character Health and SKill Point gauge on / off ^000000. You'd better turn it on all the time.";
+ mes "^FF0000The key 'page up & down'^000000 will scroll ^0087FFText in interfaces and the chatting box, Mouse whirl will also scroll^000000.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "We have a system called 'Alignment System'.";
+ mes "When you meet somebody nice or somebody helps you, you can give the person a good point in recognition of services.";
+ mes "On the contrary, to someone who is ill-mannered or doing evil things on people, you can give the person 2 bad points. Meanwhile you will get 1 bad point for the penalty. This is to prevent abuse of the alignment system.";
+ next;
+ mes "[Newbie Instructor]";
+ mes "The Alignment system is only available for adult characters over Novice level 8 and can be used once a day.";
+ mes "I know you don't think this is not important right now, but be careful, it causes you the cumulative effects on your character.";
+ mes "Somehow I believe nice persons will play fair even without this kind of restriction!";
+ next;
+ if (Done_milk==1) goto AfterMilk;
+ set Done_milk,1;
+ getitem 519,1;
+ goto AfterMilk;
+
+ AfterMilk:
+ mes "[Newbie Instructor]";
+ mes "Well... This is all I can tell you, buddy. Leo Von Frisch will take care of you from now on.";
+ mes "Do your best, Ok? Ragnarok is a worthwhile game.";
+ mes "By the way... this is my present for you. I sneaked this from mess hall. Promise me you will do your best, OK?";
+ close;
+}
+
+// -- Leo, Quiz Npc --
+new_1-2.gat,84,115,4 script Leo Von Frisch 85,{
+ if (nov_1_2_cos_c<1) goto startL0;
+ if (nov_1_2_cos_c<7) goto Lcontinue;
+ if (nov_1_2_cos_c==7) goto LNPCMaster;
+ if (nov_1_2_cos_c==8) goto LMannerMaster;
+
+ mes "[Leo Von Frisch]";
+ mes "Umm? What brings you to me? My time is already over. You have finish the First course...";
+ next;
+ goto Lend;
+
+ LMannerMaster:
+ mes "[Leo Von Frisch]";
+ mes "Umm? What brings you to me? My time is already over. Probably your next course will be to speak to the 'Manner Master'...";
+ next;
+ goto Lend;
+
+ LNPCMaster:
+ mes "[Leo Von Frisch]";
+ mes "Um? What's matter? My class is over. Your next course would be 'NPC Guide'...";
+ next;
+ goto Lend;
+
+ Lend:
+ mes "Or... Are you willing to attend again?";
+ next;
+ menu "No, Sir! I apologise about my behaviour!",Lendno,"Yes, Sir! I am!",Lendyes;
+
+ Lendno:
+ mes "[Leo Von Frisch]";
+ mes "If you think not enough, come anytime. Dismissed.";
+ close;
+ Lendyes:
+ mes "[Leo Von Frisch]";
+ mes "Ok! I love your passionate answer!! Let's begin!";
+ next;
+ goto LQ2;
+
+ Lcontinue:
+ set nov_1st_cos, 0;
+ mes "[Leo Von Frisch]";
+ mes "Um... Something interrupted my class without reason.";
+ mes "Anyhow alright. Shall we begin all over again!";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Are you ready!? Answer me!";
+ next;
+ menu "Yes sir!",LcontinueY,"No,I am not ready yet.",Lno;
+ LcontinueY:
+ if (nov_1_2_cos_c==1) goto LQ2;
+ if (nov_1_2_cos_c==2) goto LQ3;
+ if (nov_1_2_cos_c==3) goto LQ4;
+ if (nov_1_2_cos_c==4) goto LQ5;
+ if (nov_1_2_cos_c==5) goto LQ6;
+ if (nov_1_2_cos_c==6) goto LQ7;
+ close;
+ Lno:
+ mes "[Leo Von Frisch]";
+ mes "'Noooo.'?! You said 'Noooo.'! What were you thinking, you rascal! Go get ready to move! Right now!";
+ close;
+
+ startL0:
+ mes "[Leo Von Frisch]";
+ mes "Come on! Beginner!! Now You are with an Expert of Ragnarok!!";
+ mes "Me! I am God of beginners and I enlighten your pathetic souls from the Darkened World.";
+ mes "Besides I am a Tutor and an itelligence Officer in the 4th Chivarly of Prontera!";
+ mes "You can call me Sir Leo Von Frisch, got that clear?";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Are you ready!? Answer me!";
+ next;
+ menu "Yes sir!",Lyes,"No, I am not ready yet.",Lno;
+
+ Lyes:
+ mes "[Leo Von Frisch]";
+ mes "Well Done! Ok, Let's begin!! The first chapter is 'Let's Start Ragnarok'!";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Ah~ I almost forgot to question you something.";
+ mes "What is the best introduction for 'Ragnarok'?";
+ next;
+ menu "War among human beings",LQ1_1,"War between human beings and monsters",LQ1_2,"World that humans have taken over",LQ1_3,"World humans have coexisted with monsters",LQ1_4;
+
+ LQ1_1:
+ set nov_1_2_cos_c,1;
+ mes "[Leo Von Frisch]";
+ mes "Umm... Be cooperate with other people. The world will be end without nothing.";
+ mes "Answer is ^FF0000War between human beings and monsters^000000.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
+ mes "I meant you, dumbhead, alright?";
+ mes "Let's carry on.";
+ next;
+ goto LQ2;
+ LQ1_2:
+ getitem 513,1;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,1;
+ mes "[Leo Von Frisch]";
+ mes "Yes, that's right. You know well. We are fighting with evil creatures. In most of MMORPG games, they are known as Monsters or commonly just called as Mob.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
+ mes "I meant you, dumbhead, alright?";
+ mes "Let's carry on.";
+ next;
+ goto LQ2;
+ LQ1_3:
+ set nov_1_2_cos_c,1;
+ mes "[Leo Von Frisch]";
+ mes "...What the bloody hell are you saying? Why would humans torment creatures for?";
+ mes "Answer is ^FF0000War between human beings and monsters^000000.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
+ mes "I meant you, dumbhead, alright?";
+ mes "Let's carry on.";
+ next;
+ goto LQ2;
+ LQ1_4:
+ set nov_1_2_cos_c,1;
+ mes "[Leo Von Frisch]";
+ mes "Oh well... I fully understand your pursue ideal world... Not now, not now.";
+ mes "Answer is ^FF0000War between human beings and monsters^000000.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "I will keep surprising you with unexpectable questions, concentrate on my lesson.";
+ mes "I meant you, dumbhead, alright?";
+ mes "Let's carry on.";
+ next;
+ goto LQ2;
+
+ LQ2:
+ mes "[Leo Von Frisch]";
+ mes "When you click the shortcut for Ragnarok, it will be automatically connected to patch server, which enables you to continually update game articles. MMORPG game keeps being developed to improve its quality.";
+ mes "In the meantime, you can check ^FF0000the Notice^000000 on the patch window.";
+ mes "Read that notice if you don't want to miss any game event or update articles.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "You can coose between one or more servers.";
+ mes "After choosing one of game servers, you can make a character.";
+ mes "3 empty slots or more for character are given to you on the first place, you can have 3 kinds of different characters.";
+ mes "For character appearance, you can choose a favourable hairstyle from a lot of kinds and from some kinds of hair colour. In near future, we will introduce more hair colour and clothings.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Double Click an empty slot and you can make your character.";
+ mes "^FF0000You can arrange beginning Stats of your character. With that, Your character could be the best for job you wish for.^000000.";
+ mes "So You should consider beginning Stats as well fitting for the job you want your character to be in the future.";
+ next;
+ if (nov_1_2_cos_c>1) goto LQ3;
+ mes "[Leo Von Frisch]";
+ mes "I give you one easy question!";
+ mes "What is the wrong description for each Stat? You should choose WRONG one not right one!!";
+ next;
+ menu "STR - Increase hit point and maximum weight.",LQ2_1,"AGI - Increase flee rate and attack speed.",LQ2_2,"DEX - Increase accuracy and magic defence.",LQ2_3,"INT - Increase magic attack/defence.",LQ2_4;
+
+ LQ2_1:
+ set nov_1_2_cos_c,2;
+ mes "That's wrong!";
+ mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
+ mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
+ next;
+ goto LQ3;
+ LQ2_2:
+ set nov_1_2_cos_c,2;
+ mes "That's wrong!";
+ mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
+ mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
+ next;
+ goto LQ3;
+ LQ2_3:
+ getitem 513,1;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,2;
+ mes "[Leo Von Frisch]";
+ mes "Alright! You got it.";
+ mes "It is not 'DEX - Increase accuracy and magic defence.', correct description is:";
+ mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
+ mes "This is reward. Take it.";
+ next;
+ goto LQ3;
+ LQ2_4:
+ set nov_1_2_cos_c,2;
+ mes "That's wrong!";
+ mes "'DEX - Increase accuracy and magic defence.' is not correct, it should be:";
+ mes "^FF0000'DEX - Increase accuracy and weapon damage.'^000000.";
+ next;
+ goto LQ3;
+
+ LQ3:
+ mes "[Leo Von Frisch]";
+ mes "Let's go on.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Let's move on to 'Basic Interface'.";
+ mes "Alright, check 'Basic Information window' on the upper-left side of your screen. You can see full screen of it with ^FF0000Double Click^000000, when it's shown as the smallest one.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "'Basic Information Window shows ^FF0000Every Fundamental Functions^000000. Also, you can click the specific function windows with the pertinent button .";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "^FF0000'Base Lv'^000000 is the level of character. ^FF0000'Job Lv'^000000 Specializes the Character, it allows a character to learn a skill with ^FF0000Skill Point^000000 everytime at levelup.";
+ mes "Let's spare skill point part for later.";
+ mes "The Gauge bar beside each level is shown how much % of EXP Point you've gained for a next levelup. When it goes into 100% you will raise one level up, this bar will reset into 0 for a next turn.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Weight shows 'Current Belongings/Maximum Belongings'. When a player possesses things more than a half, it will shown in ^FF0000Red Colour^000000.";
+ mes "From this moment, this player ^FF0000cannot regenerate HP, SP naturally^000000. Furthermore when its amount is over than 90%, ^FF0000a player cannot Fight.^000000";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "If you don't want to be murdered due to your stupidity, lighten your weight as you can.";
+ mes "You can use Kafra Wearhouse to store items. And it will cost you the different local fee from 35 Zeny to 50 Zeny.";
+ next;
+ if (nov_1_2_cos_c>2) goto LQ4;
+ mes "[Leo Von Frisch]";
+ mes "Let's take a break~ Phew...";
+ mes "Ah~ I have an idea~ I will give you a 'for-Fun' question.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "You... Do you remember who I am?";
+ mes "I told you about me before the lesson got started. Now remember? Or you just ignored me as 'Poof~ you are just a nothing but a NPC~'...";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Ah Ah~ I don't want to show off myself but because I am your tutor. I am just curious. By the way this is just '^990000for fun^000000', you know.";
+ mes "Choose one thing which has nothing to do with me.";
+ next;
+ menu "Instructor.",LQ3_1,"An Intelligence Officer in the 4th Chivarly of Prontera.",LQ3_2,"Public Prosecutor.",LQ3_3,"I have no idea.",LQ3_4;
+
+ LQ3_1:
+ set nov_1_2_cos_c,3;
+ mes "[Leo Von Frisch]";
+ mes "Damn you!... Next!";
+ next;
+ goto LQ4;
+ LQ3_2:
+ set nov_1_2_cos_c,3;
+ mes "[Leo Von Frisch]";
+ mes "Damn you!... Next!";
+ next;
+ goto LQ4;
+ LQ3_3:
+ mes "[Leo Von Frisch]";
+ mes "Fine! I am not a 'Public Prosecutor' but a ^ff0000'Newbie Tutor^000000!";
+ next;
+ getitem 516,3;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,3;
+ mes "[Leo Von Frisch]";
+ mes "Take this. It is nothing, but I am so pleased that you remembered me in detail. Share with your pals.";
+ next;
+ goto LQ4;
+ LQ3_4:
+ set nov_1_2_cos_c,3;
+ mes "[Leo Von Frisch]";
+ mes "Damn you!... Next!";
+ next;
+ goto LQ4;
+
+ LQ4:
+ mes "[Leo Von Frisch]";
+ mes "When you click 'Item' button, it shows your inventory. Shortcut is 'Alt + E'.";
+ mes "Item windows is devided into 3 parts, the equipment you are wearing is not shown on the item window.";
+ mes "^FF0000Right Click^000000on each item, you can see its description and a picture.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "To equip items, ^FF0000it is possible to change equipment by Dragging & Dropping it onto your equipment window, Shorcut is 'ALT+Q'. You can also double click the item ^000000.";
+ mes "^FF0000You can register 9 items or skills from F1 to F9 in the hotkey window^000000.";
+ mes "You should have the hot key window open at all time. You can play easier that way.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "You can see ^FF0000Present skills^000000when you click 'Skill' button. Shorcut is 'Alt + S'.";
+ mes "^FF0000Every time the character's job levels up, you get skill points^000000. You will see blue button in the bottom left corner of your monitor screen.";
+ mes "You can check skill informations ^FF0000by right clicking on each Skill Icon^000000.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Passive skill means ^FF0000You don't have to spend your SP to use it. It is always in effect^000000. The opposite from Active skill.";
+ mes "Also skills are ^FF0000possible to register on the Hot key window^000000, you can use your favorite skills quickly and easily this way.";
+ next;
+ if (nov_1_2_cos_c>3) goto LQ5;
+ mes "[Leo Von Frisch]";
+ mes "One Question for you!";
+ mes "How to see each item's description and the picture with the mouse?";
+ next;
+ menu "Double Click",LQ4_1,"Right Click",LQ4_2,"Drag & Drop",LQ4_3;
+
+ LQ4_1:
+ set nov_1_2_cos_c,4;
+ mes "[Leo Von Frisch]";
+ mes "That's wrong!";
+ mes "It is ^FF0000'Right Click'^000000!";
+ next;
+ goto LQ5;
+ LQ4_2:
+ getitem 512,1;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,4;
+ mes "[Leo Von Frisch]";
+ mes "It is ^FF0000'Right Click'^000000! Correct!";
+ mes "I will reward you for the correct answer. Take it.";
+ next;
+ goto LQ5;
+ LQ4_3:
+ set nov_1_2_cos_c,4;
+ mes "[Leo Von Frisch]";
+ mes "That's wrong!";
+ mes "It is ^FF0000'Right Click'^000000!";
+ next;
+ goto LQ5;
+
+ LQ5:
+ mes "[Leo Von Frisch]";
+ mes "Ok, Back to the Lesson.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "^FF0000At novice level 4 or above, you can make your own chat room with 'Chat' Button^000000. Shorcut is 'Alt + C'.";
+ mes "You can't move when you are in chatroom, but chatting and item trading are available.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "With 'Friend' button, a 'Party' window pops up. You can see all party members and their present location.";
+ mes "Shorcut is 'Alt + Z'.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Party members being on the same map with you, ^FF0000are shown on the mini-map^000000, Party window is going to be updated.";
+ mes "So that it will act as messenger function like party members log-in. Also it will be upgraded like G-Freind that can connect between Ragnarok and outside.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "With 'Map' button, you can use mini-map in various ways. It can be translucent, opaque and invisible. Also with the +, - button, ^FF0000it is possible to enlarge and reduce its Size^000000. Shorcut is 'Ctrl + Tab'.";
+ mes "Red spot on the mini-map is the loading point to the next map. Player's location is shown like a white arrow. The direction of the white arrow shows which way the player facing.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "The 'Equip' button, ^FF0000opens The window showing the character's equipped items^000000. Shorcut is 'Alt + Q'.";
+ mes "Each equipped item can be ^FF0000right clicked for description and picture^000000, ^FF0000You can equip and unequip items by dragging and dropping between the equipment and inventory windows^000000.";
+ mes "Also Every equipment can be registered on the Hot Key window so you can change your weapon easily.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "The 'Option' button opens the window that allows you to controll the BGM and Sound Effect and turn on/off them. Shorcut is 'Alt + O'.";
+ mes "After Feb 2002, you can also select a window skin from self-made skins shared in fansites.";
+ next;
+ if (nov_1_2_cos_c>4) goto LQ6;
+ mes "[Leo Von Frisch]";
+ mes "Another Question!";
+ mes "Which one is the shortcut for hot key window that hleps you to play easier ?";
+ next;
+ menu "F1",LQ5_1,"F15",LQ5_2,"F16",LQ5_3,"F12",LQ5_4;
+
+ LQ5_1:
+ set nov_1_2_cos_c,5;
+ mes "[Leo Von Frisch]";
+ mes "That's wrong!";
+ mes "The right key is 'F12'";
+ next;
+ goto LQ6;
+ LQ5_2:
+ set nov_1_2_cos_c,5;
+ mes "[Leo Von Frisch]";
+ mes "That's wrong!";
+ mes "The right key is 'F12'";
+ next;
+ goto LQ6;
+ LQ5_3:
+ set nov_1_2_cos_c,5;
+ mes "[Leo Von Frisch]";
+ mes "That's wrong!";
+ mes "The right key is 'F12'";
+ next;
+ goto LQ6;
+ LQ5_4:
+ getitem 517,1;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,5;
+ mes "[Leo Von Frisch]";
+ mes "That's right. 'F12' is correct answer.";
+ mes "This is for you.";
+ next;
+ goto LQ6;
+
+ LQ6:
+ mes "[Leo Von Frisch]";
+ mes "OK Let's move on.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "The End.";
+ next;
+ if (nov_1_2_cos_c>5) goto LQ7;
+ mes "[Leo Von Frisch]";
+ mes "Quiz time!";
+ mes "Choose One showing the Right Shortcut for 'Sit' and the Command you type in the Chat Box.";
+ next;
+ menu "'insert' - /Sit",LQ6_1,"'page down' - /Sitting",LQ6_2,"'home' - /Sitdown",LQ6_3,"'delete' - /stand",LQ6_4;
+
+ LQ6_1:
+ getitem 519,1;
+ set nov_1st_cos, nov_1st_cos+1;
+ set nov_1_2_cos_c,6;
+ mes "[Leo Von Frisch]";
+ mes "Yeah, correct.";
+ next;
+ goto LQ7;
+ LQ6_2:
+ set nov_1_2_cos_c,6;
+ mes "[Leo Von Frisch]";
+ mes "Wrong. 'insert' - /Sit is the correct one.";
+ next;
+ goto LQ7;
+ LQ6_3:
+ set nov_1_2_cos_c,6;
+ mes "[Leo Von Frisch]";
+ mes "Wrong. 'insert' - /Sit is the correct one.";
+ next;
+ goto LQ7;
+ LQ6_4:
+ set nov_1_2_cos_c,6;
+ mes "[Leo Von Frisch]";
+ mes "Wrong. 'insert' - /Sit is the correct one.";
+ next;
+ goto LQ7;
+
+ LQ7:
+ mes "[Leo Von Frisch]";
+ mes "Guys, Thank you for standing my boring class for now. And I am not sure whether you fully understand or not.";
+ mes "If you can't get it, play by yourself. 'The proof of the pudding is in the eating.', the proverb.";
+ mes "I hope my class will be helpful to your wretched future in Ragnarok.";
+ next;
+ if (nov_1_2_cos_c > 6) goto LFinishAgain;
+ if (nov_1st_cos > 0) goto nov1stcosCont;
+ mes "[Leo Von Frisch]";
+ mes "By the way... You've missed all answer!!!";
+ mes "You are the worst trainee I've ever had. Sigh...";
+ next;
+ goto nov1stcosCont;
+
+ nov1stcosCont:
+ if (nov_1st_cos < 5) goto nov1stcosCheckL5;
+ if (nov_1st_cos == 5) goto nov1stcosCheckE5;
+ if (nov_1st_cos == 6) goto nov1stcosCheckE6;
+
+ nov1stcosCheckL5:
+ getitem 507,1;
+ goto nov1stcosContNext;
+ nov1stcosCheckE5:
+ getitem 507,2;
+ goto nov1stcosContNext;
+ nov1stcosCheckE6:
+ getitem 507,4;
+ goto nov1stcosContNext;
+
+ nov1stcosContNext:
+ set nov_1_2_cos_c,7;
+ mes "[Leo Von Frisch]";
+ mes "I will reward you for the successful lesson. Take it. They will be useful when you have a hard time to fight.";
+ next;
+ mes "[Leo Von Frisch]";
+ mes "Anyway, Let's call it a day with me, you may go to the 'NPC' master.";
+ mes "If you can't find him, inquire at the sly dog at the centre";
+ close;
+
+ LFinishAgain:
+ mes "[Leo Von Frisch]";
+ mes "Anyway, Let's call it a day with me, you may go to the 'Guide' to know what you must do now.";
+ mes "If you can't find him, search at the centre of the room.";
+ close;
+
+}
+
+// -- Guide Npc --
+new_1-2.gat,99,156,4 script Guide 105,{
+ mes "[Guide]";
+ mes "Hey Hey Where are you going? There is nothing for a Newbie like you upstairs.";
+ mes "Go and take the required trainings!";
+ close;
+}
+
+// -- Guide Npc --
+new_1-2.gat,100,113,4 script Guide 97,{
+ set @R_SEL_NUM,rand(2);
+ mes "[Guide]";
+ if (@R_SEL_NUM != 0) goto tmp1;
+ mes "Mumble~Mumble~Life is getting Sick~What a boring Job I have~~ I was stupid enough to choose this Boring and Solitary thing! Ah~";
+ goto NMes;
+ tmp1:
+ mes "I miss my good-for-nothing day~ Phew~ I should never accepted the Full time job... Eh?!";
+ goto NMes;
+
+ NMes:
+ mes "Hey Buddy~ Want some Help?";
+ next;
+ menu "Current Course State.",-, "Quit.",L0;
+
+ mes "[Guide]";
+ mes "Hmm... Let me see...";
+ if (nov_1_2_cos_c == 9) goto L00a;
+ if (nov_1_2_cos_c == 8) goto L00b;
+ if (nov_1_2_cos_c == 7) goto L00c;
+ mes "I assure you are at the first place with this empty list of yours. You must go toward the Northwest.";
+ mes "And meet 'Leo Von Frisch', the odd veteran Knight. He is a little bit boring, but that's ok. If you work out a correct answer to his question, he will give you some Snacks. So concentrate on him, Okay?";
+ close;
+
+ L00a:
+ mes "Ah...? finished the First Course?";
+ mes "Then meet the guy over there at the southwest, tell him 'I got the 1st lesson.'. He will lead you to the Second Hall.";
+ mes "Well done~ Bye Bye~ Take Care, Okay?";
+ close;
+ L00b:
+ mes "Err...? Didn't you hear the 'NPC Guide' Master's saying? Told you to go to the table right next him. Sigh~ Hurry up~";
+ close;
+ L00c:
+ mes "Did you attend to 'Sir Leo Von Frisch''s Lesson already? Umm the next is...";
+ mes "Go toward next hall at the Southeast, you will see two guys over there.";
+ mes "Ask either of them~";
+ close;
+
+ L0:
+ mes "[Guide]";
+ mes "Alright~ Bye Bye~ Don't comback unless you have no idea~";
+ close;
+}
+
+// -- Monster Explaination --
+new_1-2.gat,115,115,4 script Monster Expert 93,{
+ mes "[Monster Expert]";
+ mes "Hello My name is 'Rane' the Monster Expert in Rune-Midagrd Kingdom.";
+ mes "I'll explain things about Monsters, Briefly.";
+ next;
+ mes "[Monster Expert]";
+ mes "You can See 2 types of Monsters, Non-Aggressive One and Hostile One.";
+ mes "Luckily, there are Non-Aggressive ones around Every City or town so that you don't have to worry about getting assaulted, but in Caves, Dungeons or even the Deep Forest Hostile Monsters are ready to attack you.";
+ next;
+ mes "[Monster Expert]";
+ mes "Besides, the round and pink monster 'Poring' or 'Thief Bug' tends to swallows items rather than attack.";
+ mes "So just ignore them even if they walk up to near you. They won't harm you before you attack.";
+ next;
+ mes "[Monster Expert]";
+ mes "You can see a living statue of the famous 'Poring', a looter, behind me,";
+ mes "and another of the little 'Baphomet Jr.', one of the strongest agressiv monster.";
+ next;
+ mes "[Monster Expert]";
+ mes "And Just run away when you feel danger while fighting. If you go to the distance they won't be able to follow you.";
+ mes "Good Luck.";
+ close;
+}
+
+// -- Fake Poring --
+new_1-2.gat,112,120,5 script Statue of Poring 1002,{
+ mes "[Living statue of Poring]";
+ mes "'Don't touch please.'";
+ close;
+}
+
+// -- Fake Bapho Jr. --
+new_1-2.gat,119,120,3 script Statue of Baphomet Jr. 1101,{
+ mes "[Living statue of Baphomet Jr.]";
+ mes "'Don't touch please.'";
+ close;
+}
+
+// -- Fake Kafra --
+new_1-2.gat,158,158,8 script Kafra 117,{
+ mes "'Please leave me alone.'";
+ close;
+}
+
+// -- Fake Guide --
+new_1-2.gat,161,158,8 script Guide 105,{
+ mes "'Please leave me alone.'";
+ close;
+}
+
+// -- Npc Explanation --
+new_1-2.gat,160,183,5 script NPC Master 83,{
+ if (nov_1_2_cos_c==7) goto Lstart;
+ if (nov_1_2_cos_c>7) goto nov12coscM7;
+
+ mes "[NPC Master]";
+ mes "You are not supposed to be here yet. Attend 'Sir Leo Von Frisch''s Lesson first.";
+ mes "If you can't find him, go outside this hall, inquire at the Guide on the Centre.";
+ close;
+
+ nov12coscM7:
+ mes "[NPC Master]";
+ mes "Huh? Why are you here again? I told you everything. Do you want me to do that again?";
+ next;
+ menu "Yeah.",L0,"No not really.",L1;
+
+ L0:
+ mes "[NPC Master]";
+ mes "Alright alrighty. I will repeat for you.";
+ next;
+ goto Ltell;
+ L1:
+ if (nov_1_2_cos_c>8) goto nov12coscM8;
+ mes "[NPC Master]";
+ mes "Next Course is about 'Various examples of rude mannered players and cheaters'. Go to the right table.";
+ close;
+
+ nov12coscM8:
+ mes "[NPC Master]";
+ mes "Did you finish the Newbie Class? What am I talking about? Err... You know what I am saying~whatever...";
+ close;
+
+ Lstart:
+ mes "[NPC Master]";
+ mes "You said you finished the Newbie Class, didn't you? Then from now on I will give tips about NPCs which serve you in Ragnarok.";
+ next;
+ goto Ltell;
+
+ Ltell:
+ mes "[NPC Master]";
+ mes "First, Rune-Midgard Troops which^ff0000 have building locations of each Town^000000.";
+ next;
+ mes "[NPC Master]";
+ mes "They are standing at ^FF0000the enterance or the centre of Town^000000, if you don't know much about buildings, inquire at them. You won't ever be disappointed.";
+ next;
+ mes "[NPC Master]";
+ mes "Second, Kafra Wearhouse where you can ^ff0000'Save'^000000and ^ff0000'Store items'^000000 and ^ff0000'Rent a Cart'^000000.";
+ mes "'Save' means, ^ff0000set your respawn point preparing death while fighting or for the next time ^000000.";
+ mes "So better save than forget? Kafra Staffs are standing at the similar spots as Rune-Midgard Troops.";
+ mes "If you don't save at all, you walk a long way and bam~!you die. Then~There is no choice but to walk all the way back again. Doesn't it sound horrible?";
+ next;
+ mes "[NPC Master]";
+ mes "And you can store your extra items in 'Kafra Wearhouse'. You can access the Storage wherever Kafra Staffs are located.";
+ mes "I always think: 'Use storage' Service is the best for Infrastructure among MMORPG world!! Muhahahaha!!!";
+ if (nov_1_2_cos_c==7) goto LtellNext;
+ mes "Heh Heh~ And they are all beautiful girls~ What about their boss...? Is it a she or He? I am curious...";
+ goto LtellNext;
+
+ LtellNext:
+ next;
+ mes "[NPC Master]";
+ mes "Unlike 'Save', 'Use the Storage' requires a small fee. The fee is different in different areas.";
+ next;
+ mes "[NPC Master]";
+ mes "Last, Those Babes allow you to rent a Cart for the merchant's skill, 'Pushcart'...";
+ next;
+ mes "[NPC Master]";
+ mes "Now let's check how they look like. So You will find them easily next time.";
+ mes "We display figures of them over there. Just take a look before you go the next course.";
+ next;
+ if (nov_1_2_cos_c>7) goto LtellM7;
+ mes "[NPC Master]";
+ mes "Those figures... they were supposed to be right beside me first time... For me they felt really spooky... Imagine, Someone behind you without motion... spooky, huh?";
+ mes "That's why I moved them over there... And now I can see them in front of my eyes... They feel more spooky now...";
+ next;
+ set nov_1_2_cos_c,8;
+ goto LtellM7;
+
+ LtellM7:
+ mes "[NPC Master]";
+ mes "Let's call it a day. Next Course is about 'Various examples of rude mannered players and cheaters'. Go to the right table.";
+ close;
+}
+
+// -- Guide --
+new_1-2.gat,183,183,3 script Guide 95,{
+ if (nov_1_2_cos_c==8) goto Lstart;
+ if (nov_1_2_cos_c>=9) goto Lagain;
+ mes "[Manner Master]";
+ mes "Eh... Ah... Not here not yet... Well... What I mean is... Well... uh...";
+ mes "What I mean is... You should attend to ^FF0000Leo Von Frisch's class on beginner help^000000 first...";
+ mes "Eh... And after... Speak to 'NPC Master'... uh...";
+ close;
+
+ Lstart:
+ mes "[Manner Master]";
+ mes "Greetings~ I am just simple man who will inform you of 'Various examples of Ill-mannered players and cheaters'.";
+ mes "Shall we begin?";
+ next;
+ goto Ltell;
+
+ Ltell:
+ mes "[Manner Master]";
+ mes "1st, Let's get Started with ^ff0000Examples for Ill-manners and attentions ^000000. Just sit down and take it easy.";
+ next;
+ mes "[Manner Master]";
+ mes "There are 3 kinds of Rude manners, 'Mob Stealing', 'Looting' and 'Mob Train'. First off I will tell you about 'Mob Stealing'.";
+ mes "Ah~Before get started, let me tell you about 'Experience Points System in Ragnarok' that is much helpful to your understanding of 'Mob Stealing'. This is very important, Please listen.";
+ next;
+ mes "[Manner Master]";
+ mes "The player who deals the most damage to the monster, takes the most Experience Points. It is based on the percentage of damage you do. You can get more Experience Points by doing more damages.";
+ next;
+ mes "[Manner Master]";
+ mes "For example, if the player named 'Kitten the cat' attacks a monster having 100 HP and he does 65 damage on it, 'Kitten the cat' can get 65% of Experience Points from the monster.";
+ mes "Usually this is the way you get Experience Points from Monsters. But it could be different in some situation.";
+ next;
+ mes "[Manner Master]";
+ mes "This is a different situation when someone joins in on the attack.";
+ next;
+ mes "[Manner Master]";
+ mes "First, the previous player 'Kitten the cat' attacks a monster having 100 HP and he does 50 damage, the other player 'Polar bear' attacks that monster and does the same damage.";
+ next;
+ mes "[Manner Master]";
+ mes "In this situation, 'Kitten the cat' can get double the Experience Points of 'Polar bear'. 'Kitten the cat' gets '66.6%'of the Experience Points, 'Polar bear' gets '33.3%' of the Experience Points.";
+ mes "Get it? Don't ask me about the remaining '0.1' of the Experience Points.I don't know where it goes~.I am not a director.HeHe~";
+ next;
+ mes "[Manner Master]";
+ mes "'Kitten the cat' takes damage from the monster during the fight,";
+ mes "'Polar Bear', a stranger to 'Kitten the cat' can get 1/2 of the Experience Points from 'Kitten the cat' without taking any damage.";
+ mes "That's why we called this '^ff0000Mob Stealing^000000'.";
+ next;
+ mes "[Manner Master]";
+ mes "Briefely and clearly, 'Mob Stealing' is a behaviour of a player ^970197Who doesn't care about the others^000000.";
+ mes "And ^970197Just try to take advantage of others^000000 without any self-effort.";
+ next;
+ mes "[Manner Master]";
+ mes "'Looting' is similar as Mob Stealing. While 'Mob Stealing', when a Player who Never fought picks up items belonging others, it is called '^ff0000Looting^000000'.";
+ mes "Difference Between 'Mob Stealing' and 'Looting'is 'Experience Points'and 'Item'. Very Simple.";
+ mes "But, after the Anti-Loot Patch came, The Sistuation has been getting better. And Anti-Loot wll be patched continuously.";
+ next;
+ mes "[Manner Master]";
+ mes "Let's talk about 'Mob Train'.";
+ mes "One player starts to attack a bunch of monsters. Those monsters start to follow that player. Because Monster AI is not fully implemented yet.";
+ mes "The player then walks near other players and either exits the game or uses the thief skill hide. The monsters lose their target and immediately attack the nearlest person.";
+ next;
+ mes "[Manner Master]";
+ mes "Briefly, 'Mob Train' means attacking a bunch of monsters with a purpose of abusing other players.";
+ mes "If you want to be infamous in Ragnarokonline, I will suggest you do these things above. But if you do that, you would be the worst enemy to the public. Many players will dislike you.";
+ next;
+ mes "[Manner Master]";
+ mes "OK the Next topic is 'The Cheaters'.";
+ mes "The Cheaters are usually called 'Impersonating Server Staffs', 'Scammers', 'Beginer Scammers'.";
+ mes "Umm... Let's start with 'Server Staff Imposter'.";
+ next;
+ mes "[Manner Master]";
+ mes "Usually There are Players who pretend to be Management Crews. They ask other players let them know things like userID and Password. They then try to steal players' items and zeny.";
+ mes "But Management Crews will never ask you for your userID or password. Please remember.";
+ next;
+ mes "[Manner Master]";
+ mes "And please check out the official board frequently as you can. You can see what is going on clearly.";
+ next;
+ mes "[Manner Master]";
+ mes "'Scammer' means a merchant player who try to cheat on the price of their items to the other players.";
+ mes "For example, A Merchant opens a shop with the name 'Weapon price 20,000 zeny', but the actual weapon price in his Shop is 200,000 zeny.";
+ mes "When you trade with merchants, Please always check the price of item. Here is a tip, Zeny is separated with a comma after every three units.like this:'2,000', '20,000' or '200,000'.";
+ next;
+ mes "[Manner Master]";
+ mes "Our last one is 'Beginner Scammers'.";
+ mes "Beginners are especially easy to be cheated. The cheaters tempt you with unavailable items or weapon upgrading.";
+ next;
+ mes "[Manner Master]";
+ mes "So beginners should refer item descriptions on the website. You can check them in 'Guide' section.";
+ mes "In addition, In Ragnarokonline Unathorized item Duplication is a Violation of applicable laws. Please remember that.";
+ next;
+ mes "[Manner Master]";
+ mes "Heh~ It's a lot of informations for you right...? I didn't mean to take so long. Heh Heh...";
+ mes "Ah~ Right! I forgot one really important thing.";
+ next;
+ mes "[Manner Master]";
+ mes "About 'Swearing'... Heh Heh~~I believe you already know... Anyway... No way No swearwords~~";
+ mes "Rude behaviour plus! Swearing... Ummm This is what they mean by ^970197the audacity of the thief^000000...";
+ mes "... That would be '^FF0000The worst kind of player in Ragnarokonline^000000'...?";
+ next;
+ mes "[Manner Master]";
+ mes "Please E-mail us when you want to report these rude players showing the chat window text. You can use 'Print Screen' button when you want to take a picture of screen.";
+ mes "If you report to us with the perfect proof, The player accused of being rude mannered could be warned at first time. Then he could be banned forever.";
+ next;
+ mes "[Manner Master]";
+ mes "Especially to players with a past conviction for rude behaviour, we take strong actions~.";
+ next;
+ mes "[Manner Master]";
+ mes "Listen, Rude players~! When The day comes to PK...";
+ mes "You might be dead under the feet of outraged players who have been abused...";
+ mes "Also You would be freaked out and could not play forever.";
+ next;
+ mes "[Manner Master]";
+ mes "Ok, This is the end of my lesson. You just finished your 1st course. Congratulations.";
+ mes "When you go to the west side through the centre, See the helper who help you to go to the 2nd Course.";
+ if (nov_1_2_cos_c>8) goto LtellM8;
+ set nov_1_2_cos_c,9;
+ goto LtellM8;
+
+ LtellM8:
+ close;
+
+ Lagain:
+ mes "[Manner Master]";
+ mes "Ah... Well... Going to next is no problem... But...";
+ mes "Would you like to attend to 'Various examples of Ill-mannered players and cheaters' again...?";
+ next;
+ menu "Yes.",Ltell,"No.",Lno;
+
+ Lno:
+ mes "[Manner Master]";
+ mes "Umm Sorry. I don't know well about your next course so please inquire at the guide in the Central Hall.";
+ close;
+}
+
+// == SECOND COURSE ==
+// -- Helper --
+new_1-2.gat,78,101,6 script Helper 105,{
+ if (nov_1_2_cos_c>= 9) goto Lcourse2;
+ mes "[Helper]";
+ mes "I am a helper who will guide you to the 2nd registration office. Please attend all classes in 1st course First.";
+ close;
+
+ Lcourse2:
+ mes "[Helper]";
+ mes "You just finished 1st course... OK.";
+ mes "I will let you go to the 2nd registration office.";
+ next;
+ set Done_milk,0;
+ warp "new_1-2.gat",44,171;
+ close;
+}
+
+// -- Helper --
+new_1-2.gat,39,183,3 script Helper 92,{
+ if (nov_1_2_cos_c>=10) goto Lend;
+ mes "[Helper]";
+ mes "Your registration has confirmed. I would like to say 'Congratulations' also.";
+ mes "I will let you know about 2nd course breifly.";
+ next;
+ mes "[Helper]";
+ mes "Your mission is: You must reach at the Castle of the other side from here, through the Fabres Forest. You can do it easily.";
+ next;
+ mes "[Helper]";
+ mes "Notice - If you lose consciousness during fight, you will lose your points and come back here automatically.";
+ next;
+ mes "[Helper]";
+ mes "Ask the helper located in the left side about the entrance of 2nd Course.";
+ mes "OK, We wish you luck.";
+ set nov_1_2_cos_c,10;
+ close;
+
+ Lend:
+ mes "[Helper]";
+ mes "You can ask the helper located in the left side when you are ready for 2nd course.";
+ close;
+}
+
+// -- Helper --
+new_1-2.gat,16,183,5 script Helper 84,{
+ if (nov_1_2_cos_c==10) goto Lstep2;
+ if (nov_1_2_cos_c>=11) goto Lrespawn;
+ mes "[Helper]";
+ mes "Heh... I can't find your name on the list.";
+ mes "Could you register first at the front desk?";
+ close;
+
+ Lstep2:
+ mes "[Helper]";
+ mes "Heh... I can't find your name on the list...";
+ mes "Ah! Here you are. Ok " + strcharinfo(0) + ". Are you ready?";
+ next;
+ menu "Yes.",Lyes,"No.",Lno;
+
+ Lyes:
+ set nov_1_2_cos_c,11;
+ mes "[Helper]";
+ mes "Well... We wish you luck.";
+ savepoint "new_1-2.gat",23,183;
+ warp "new_1-3.gat",96,21;
+ close;
+ Lno:
+ mes "[Helper]";
+ mes "Take some rest before the 2nd Course.";
+ close;
+ Lrespawn:
+ mes "[Helper]";
+ mes "You've been knocked out by Fabre. Yeah you can't fight with a bunch of Fabres anyway.";
+ mes "By the way, 2nd Course 1th test. Are you going to start now?";
+ next;
+ menu "Yes.",Lspawnyes,"No.",Lno;
+
+ Lspawnyes:
+ mes "[Helper]";
+ mes "Well... We wish you luck.";
+ next;
+ warp "new_1-3.gat",96,21;
+ close;
+}
+
+
+// == THIRD COURSE ==
+// nov_3_merchant: count the number of answers to become merchant
+// nov_3_swordman: count the number of answers to become swordman
+// nov_3_archer: count the number of answers to become archer
+// nov_3_thief: count the number of answers to become thief
+// nov_3_magician: count the number of answers to become magician
+// nov_3_acolyte: count the number of answers to become acolyte
+// set nov_1_4_cos_c: to know third course advancement (to avoid to repeat question)
+
+// -- Helper --
+new_1-4.gat,100,29,4 script Helper 54,{
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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 @TEMP,rand(4);
+ mes "[Helper]";
+ mes "Welcome, Newbie!! I don't have much time to talk. I just tell you the basic details.";
+ mes "Your registration has been confirmed at the time you arrived here! You can go directly through to the next 3 courses...";
+ mes "Are you gonna start now?";
+ next;
+ menu "Let's Rock!",-,"Quit",L1;
+
+ mes "[Helper]";
+ mes "The guide will inform you details!";
+ mes "Bye!";
+ next;
+ if (@TEMP != 0) goto L0a;
+ warp "new_1-4.gat",94,56;
+ close;
+ L0a:
+ if (@TEMP != 1) goto L0b;
+ warp "new_1-4.gat",98,56;
+ close;
+ L0b:
+ if (@TEMP != 2) goto L0c;
+ warp "new_1-4.gat",102,56;
+ close;
+ L0c:
+ warp "new_1-4.gat",106,56;
+ close;
+
+ L1:
+ mes "[Helper]";
+ mes "Are you waiting for someone here..?";
+ close;
+}
+
+// -- Helper --
+new_1-4.gat,100,70,4 script Helper 67,{
+ if (nov_1_4_cos_c > 13) goto LQFin;
+ if (nov_1_4_cos_c > 5) goto LQ00;
+ if (nov_1_4_cos_c > 0) goto ContinueQuestions;
+ mes "[Helper]";
+ mes "Here we are. From now on we will have 1st personality test.";
+ mes "Take it easy and choose the right one for you.";
+ mes "There are no standards for good and evil, it's just a test for your personality.";
+ mes "Shall we start now?";
+ next;
+ goto ContinueQuestions;
+
+ ContinueQuestions:
+ mes "[Helper]";
+ mes "Choose one word most familiar to you.";
+ next;
+ if (nov_1_4_cos_c == 1) goto LQ1;
+ if (nov_1_4_cos_c == 2) goto LQ2;
+ if (nov_1_4_cos_c == 3) goto LQ3;
+ if (nov_1_4_cos_c == 4) goto LQ4;
+ if (nov_1_4_cos_c == 5) goto LQ5;
+
+ menu "Individual",LQ0a,"Public",LQ0b;
+
+ LQ0a:
+ set nov_1_4_cos_c,1;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ1;
+ LQ0b:
+ set nov_1_4_cos_c,1;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ1;
+
+ LQ1:
+ menu "Chances",LQ1a,"Permanence",LQ1b;
+
+ LQ1a:
+ set nov_1_4_cos_c,2;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ2;
+ LQ1b:
+ set nov_1_4_cos_c,2;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ2;
+
+ LQ2:
+ menu "Consumer",LQ2a,"Distributor",LQ2b;
+
+ LQ2a:
+ set nov_1_4_cos_c,3;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ3;
+ LQ2b:
+ set nov_1_4_cos_c,3;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ3;
+
+ LQ3:
+ menu "Swiftness",LQ3a,"Prudence",LQ3b;
+
+ LQ3a:
+ set nov_1_4_cos_c,4;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ4;
+ LQ3b:
+ set nov_1_4_cos_c,4;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ4;
+
+ LQ4:
+ menu "Theory",LQ4a,"Experience",LQ4b;
+
+ LQ4a:
+ set nov_1_4_cos_c,5;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ5;
+ LQ4b:
+ set nov_1_4_cos_c,5;
+ goto LQ5;
+
+ LQ5:
+ menu "Reality",LQ5a,"Ideal",LQ5b;
+
+ LQ5a:
+ set nov_1_4_cos_c,6;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ00;
+ LQ5b:
+ set nov_1_4_cos_c,6;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ00;
+
+ LQ00:
+ mes "[Helper]";
+ mes "Choose 'Yes' or 'No'.";
+ next;
+ if (nov_1_4_cos_c == 7) goto LQ01;
+ if (nov_1_4_cos_c == 8) goto LQ02;
+ if (nov_1_4_cos_c == 9) goto LQ03;
+ if (nov_1_4_cos_c == 10) goto LQ04;
+ if (nov_1_4_cos_c == 11) goto LQ05;
+ if (nov_1_4_cos_c == 12) goto LQ06;
+ if (nov_1_4_cos_c == 13) goto LQ07;
+ mes "[Helper]";
+ mes "To die with honor is better than to live with disgrace.";
+ next;
+ menu "Yes",LQ00a,"No",LQ00b;
+
+ LQ00a:
+ set nov_1_4_cos_c,7;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ01;
+ LQ00b:
+ set nov_1_4_cos_c,7;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ01;
+
+ LQ01:
+ mes "[Helper]";
+ mes "It gives me headache even when my cousin makes big success.";
+ next;
+ menu "Yes",LQ01a,"No",LQ01b;
+
+ LQ01a:
+ set nov_1_4_cos_c,8;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ02;
+ LQ01b:
+ set nov_1_4_cos_c,8;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ02;
+
+ LQ02:
+ mes "[Helper]";
+ mes "Always check the manual first before assemble something like household electric appliance.";
+ next;
+ menu "Yes",LQ02a,"No",LQ02b;
+
+ LQ02a:
+ set nov_1_4_cos_c,9;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ03;
+ LQ02b:
+ set nov_1_4_cos_c,9;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ03;
+
+ LQ03:
+ mes "[Helper]";
+ mes "I am always at the head of everything.";
+ next;
+ menu "Yes",LQ03a,"No",LQ03b;
+
+ LQ03a:
+ set nov_1_4_cos_c,10;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ04;
+ LQ03b:
+ set nov_1_4_cos_c,10;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ04;
+
+ LQ04:
+ mes "[Helper]";
+ mes "When I see the sign 'PULL' on the door I want to PUSH.";
+ next;
+ menu "Yes",LQ04a,"No",LQ04b;
+
+ LQ04a:
+ set nov_1_4_cos_c,11;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ05;
+ LQ04b:
+ set nov_1_4_cos_c,11;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ05;
+
+ LQ05:
+ mes "[Helper]";
+ mes "Sometimes I see things unreal.";
+ next;
+ menu "Yes",LQ05a,"No",LQ05b;
+
+ LQ05a:
+ set nov_1_4_cos_c,12;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ06;
+ LQ05b:
+ set nov_1_4_cos_c,12;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ06;
+
+ LQ06:
+ mes "[Helper]";
+ mes "I could fly if I fall off.";
+ next;
+ menu "Yes",LQ06a,"No",LQ06b;
+
+ LQ06a:
+ set nov_1_4_cos_c,13;
+ goto LQ07;
+ LQ06b:
+ set nov_1_4_cos_c,13;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ07;
+
+ LQ07:
+ mes "[Helper]";
+ mes "Money talks. I can buy even human being if I want.";
+ next;
+ menu "Yes",LQ07a,"No",LQ07b;
+
+ LQ07a:
+ set nov_1_4_cos_c,14;
+ set nov_3_merchant,nov_3_merchant+1;
+ set nov_3_magician,nov_3_magician+1;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQFin;
+ LQ07b:
+ set nov_1_4_cos_c,14;
+ set nov_3_swordman,nov_3_swordman+1;
+ set nov_3_archer,nov_3_archer+1;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQFin;
+
+ LQFin:
+ set @TEMP,rand(4);
+ mes "[Helper]";
+ mes "You just finished 1st test. Congratulations.";
+ mes "You can now go to the next test right away";
+ next;
+ if (@TEMP != 0) goto LQFin1;
+ warp "new_1-4.gat",13,96;
+ close;
+ LQFin1:
+ if (@TEMP != 1) goto LQFin2;
+ warp "new_1-4.gat",17,96;
+ close;
+ LQFin2:
+ if (@TEMP != 2) goto LQFin3;
+ warp "new_1-4.gat",21,96;
+ close;
+ LQFin3:
+ warp "new_1-4.gat",25,96;
+ close;
+}
+
+// -- Helper --
+// nov_1_4_cos_c (variable) starts with value 14
+new_1-4.gat,20,109,4 script Helper 48,{
+ if (nov_1_4_cos_c > 22) goto LQFin;
+ if (nov_1_4_cos_c > 14) goto ContinueQuestions;
+ mes "[Helper]";
+ mes "We start your 2nd test now!";
+ mes "Take it easy and choose the right answer for you!";
+ mes "OK Start now!";
+ next;
+ goto LQ1;
+
+ ContinueQuestions:
+ mes "[Helper]";
+ mes "We continue your 2nd test now!";
+ mes "Take it easy and choose the right answer for you!";
+ mes "OK continue now!";
+ next;
+ if (nov_1_4_cos_c == 15) goto LQ2;
+ if (nov_1_4_cos_c == 16) goto LQ3;
+ if (nov_1_4_cos_c == 17) goto LQ4;
+ if (nov_1_4_cos_c == 18) goto LQ5;
+ if (nov_1_4_cos_c == 19) goto LQ6;
+ if (nov_1_4_cos_c == 20) goto LQ7;
+ if (nov_1_4_cos_c == 21) goto LQ8;
+ if (nov_1_4_cos_c == 22) goto LQ9;
+
+ LQ1:
+ mes "[Helper]";
+ mes "For you life means...";
+ next;
+ menu "Feel irritated.",LQ1a,"I like it.",LQ1b,"Doesn't come to my mind.",LQ1c;
+
+ LQ1a:
+ set nov_1_4_cos_c,15;
+ set nov_3_swordman,nov_3_swordman+1;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ2;
+ LQ1b:
+ set nov_1_4_cos_c,15;
+ set nov_3_merchant,nov_3_merchant+1;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ2;
+ LQ1c:
+ set nov_1_4_cos_c,15;
+ set nov_3_archer,nov_3_archer+1;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ2;
+
+ LQ2:
+ mes "[Helper]";
+ mes "Before you buy something in a shop...";
+ next;
+ menu "Check first whether it's neccessary.",LQ2a,"Check the cash first.",LQ2b,"Regret after shopping.",LQ2c;
+
+ LQ2a:
+ set nov_1_4_cos_c,16;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ3;
+ LQ2b:
+ set nov_1_4_cos_c,16;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ3;
+ LQ2c:
+ set nov_1_4_cos_c,16;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ3;
+
+ LQ3:
+ mes "[Helper]";
+ mes "When you have to compete with others...";
+ next;
+ menu "I enjoy it.",LQ3a,"I do if I have to.",LQ3b,"I hate it.",LQ3c;
+
+ LQ3a:
+ set nov_1_4_cos_c,17;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ4;
+ LQ3b:
+ set nov_1_4_cos_c,17;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ4;
+ LQ3c:
+ set nov_1_4_cos_c,17;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ4;
+
+ LQ4:
+ mes "[Helper]";
+ mes "When you deal something...";
+ next;
+ menu "I prefer to deal alone.",LQ4a,"I prefer to deal together.",LQ4b;
+
+ LQ4a:
+ set nov_1_4_cos_c,18;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ5;
+ LQ4b:
+ set nov_1_4_cos_c,18;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ5;
+
+ LQ5:
+ mes "[Helper]";
+ mes "If anyone ask you a favour...";
+ next;
+ menu "Anything I can help, I will do my best.",LQ5a,"Simply I would help.",LQ5b,"Just ignore.",LQ5c;
+
+ LQ5a:
+ set nov_1_4_cos_c,19;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ6;
+ LQ5b:
+ set nov_1_4_cos_c,19;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQ6;
+ LQ5c:
+ set nov_1_4_cos_c,19;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ6;
+
+ LQ6:
+ mes "[Helper]";
+ mes "If anyone offer you to be President / Vise-President / a Congressman...";
+ next;
+ menu "President.",LQ6a,"Vise-President",LQ6b,"Congressman is ok.",LQ6c,"I don't want to be a politican.",LQ6d;
+
+ LQ6a:
+ set nov_1_4_cos_c,20;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ7;
+ LQ6b:
+ set nov_1_4_cos_c,20;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ7;
+ LQ6c:
+ set nov_1_4_cos_c,20;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ7;
+ LQ6d:
+ set nov_1_4_cos_c,20;
+ goto LQ7;
+
+ LQ7:
+ mes "[Helper]";
+ mes "If you come across the keen knife on the street then you think...";
+ next;
+ menu "'Look so sharp!'",LQ7a,"'Who the hell is the owner of this?'",LQ7b,"'Could be dead harm to people. Should be careful!'",LQ7c,"'Nice Brand~!'",LQ7d;
+
+ LQ7a:
+ set nov_1_4_cos_c,21;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ8;
+ LQ7b:
+ set nov_1_4_cos_c,21;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ8;
+ LQ7c:
+ set nov_1_4_cos_c,21;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ8;
+ LQ7d:
+ set nov_1_4_cos_c,21;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQ8;
+
+ LQ8:
+ mes "[Helper]";
+ mes "When you meet a difficult situation during conversation";
+ next;
+ menu "I hush up with a joke.",LQ8a,"I change subject.",LQ8b,"I try to excuse.",LQ8c,"I appoligize even though it's not my fault.",LQ8d;
+
+ LQ8a:
+ set nov_1_4_cos_c,22;
+ set nov_3_thief,nov_3_thief+1;
+ goto LQ9;
+ LQ8b:
+ set nov_1_4_cos_c,22;
+ set nov_3_swordman,nov_3_swordman+1;
+ goto LQ9;
+ LQ8c:
+ set nov_1_4_cos_c,22;
+ set nov_3_magician,nov_3_magician+1;
+ goto LQ9;
+ LQ8d:
+ set nov_1_4_cos_c,22;
+ set nov_3_acolyte,nov_3_acolyte+1;
+ goto LQ9;
+
+ LQ9:
+ mes "[Helper]";
+ if (sex==1) goto SexLQ9;
+ mes "Now your girl friend asks you to buy a useless gift like souvenir...";
+ next;
+ goto LQ9Norm;
+
+ SexLQ9:
+ mes "Now your boy friend asks you to buy a useless gift like souvenir...";
+ next;
+ goto LQ9Norm;
+
+ LQ9Norm:
+ menu "I would do anything for that person.",LQ9a,"I try to bring around not to buy it.",LQ9b;
+
+ LQ9a:
+ set nov_1_4_cos_c,23;
+ set nov_3_archer,nov_3_archer+1;
+ goto LQFin;
+ LQ9b:
+ set nov_1_4_cos_c,23;
+ set nov_3_merchant,nov_3_merchant+1;
+ goto LQFin;
+
+ LQFin:
+ mes "[Helper]";
+ mes "Now you finished 2nd test! Good job!!";
+ mes "You can go to the result room now.";
+ next;
+ set @TEMP,rand(4);
+ if (@TEMP !=0 ) goto LQFin0;
+ warp "new_1-4.gat",54,136;
+ close;
+ LQFin0:
+ if (@TEMP !=1 ) goto LQFin1;
+ warp "new_1-4.gat",58,136;
+ close;
+ LQFin1:
+ if (@TEMP !=2 ) goto LQFin2;
+ warp "new_1-4.gat",62,136;
+ close;
+ LQFin2:
+ warp "new_1-4.gat",66,136;
+ close;
+}
+
+// -- Helper --
+// @job_number: best job (0: Swordman, 1: Archer, 2: Thief, 3: Magican, 4: Acolyte, 5: Merchant)
+// @nov_2nd_cos: number of answers for the best job
+// nov_1_4_cos_c (variable) starts with value 23
+new_1-4.gat,60,149,4 script Helper 55,{
+ mes "[Helper]";
+ mes "Congratulations~! You finished whole courses by yourself!";
+ mes "You should remember what you've learned from Training Ground. It would be useful to you.";
+ next;
+ mes "[Helper]";
+ mes "Ok, here is the result of your own.";
+ next;
+
+ set @nov_2nd_cos,nov_3_swordman;
+ set @job_number,0;
+
+ if (@nov_2nd_cos >= nov_3_archer) goto L_ROOT_1;
+ set @nov_2nd_cos,nov_3_archer;
+ set @job_number,1;
+ goto L_ROOT_1;
+
+ L_ROOT_1:
+ if (@nov_2nd_cos >= nov_3_thief) goto L_ROOT_2;
+ set @nov_2nd_cos,nov_3_thief;
+ set @job_number,2;
+ goto L_ROOT_2;
+
+ L_ROOT_2:
+ if (@nov_2nd_cos >= nov_3_magician) goto L_ROOT_3;
+ set @nov_2nd_cos,nov_3_magician;
+ set @job_number,3;
+ goto L_ROOT_3;
+
+ L_ROOT_3:
+ if (@nov_2nd_cos >= nov_3_acolyte) goto L_ROOT_4;
+ set @nov_2nd_cos,nov_3_acolyte;
+ set @job_number,4;
+ goto L_ROOT_4;
+
+ L_ROOT_4:
+ if (@nov_2nd_cos >= nov_3_merchant) goto L_START;
+ set @nov_2nd_cos,nov_3_merchant;
+ set @job_number,5;
+ goto L_START;
+
+ L_START:
+ mes "[Helper]";
+ if (nov_1st_cos != 0) goto L_SCORE_1;
+ mes "1st course: 0 / 6 Points.";
+ goto L_SCORE_2;
+ L_SCORE_1:
+ mes "1st course: " + nov_1st_cos + " / 6 Points.";
+ goto L_SCORE_2;
+
+ L_SCORE_2:
+ if (@nov_2nd_cos != 0) goto L_SCORE_3;
+ mes "2nd course: 0 / 10 Points";
+ goto L_SCORE_4;
+ L_SCORE_3:
+ mes "2nd course: " + @nov_2nd_cos + " / 10 Points.";
+ goto L_SCORE_4;
+
+ L_SCORE_4:
+ mes "And the result of personally test is...";
+ next;
+
+ if (@job_number==0) goto JobSwordman;
+ if (@job_number==1) goto JobArcher;
+ if (@job_number==2) goto JobThief;
+ if (@job_number==3) goto JobMagican;
+ if (@job_number==4) goto JobAcolyte;
+ if (@job_number==5) goto JobMerchant;
+
+ JobSwordman:
+ mes "[Helper]";
+ mes "'You have simple-minded and always talk straight. And you have an unshaken faith so that you want to rule the world. Also you always stand by the weak.'";
+ mes "'So We suggest you ^696969Swordman^000000.";
+ goto SelJob;
+ JobArcher:
+ mes "[Helper]";
+ mes "'You are very emotional and sensitive person. And you have open-minded.'";
+ mes "'Also, You don't want to be ordinary, always eager for valuable life of your own.'";
+ mes "'So we suggest you ^696969Archer^000000.'";
+ goto SelJob;
+ JobThief:
+ mes "[Helper]";
+ mes "'You always try to enjoy your life. Life is like adventure for you.'";
+ mes "'So we suggest you ^696969Thief^000000.'";
+ goto SelJob;
+ JobMagican:
+ mes "[Helper]";
+ mes "'You are self-diciplined person. Sometimes you pretend to understand whole things in the world not to be silly to the other person.";
+ mes "'You are man of reason, an introvert, an analyst, a man of keen insight.'";
+ mes "'So we suggest you ^696969Mage^000000.";
+ goto SelJob;
+ JobAcolyte:
+ mes "[Helper]";
+ mes "'You are warm-hearted, easy-going person, taking care of people.'";
+ mes "'But actually you pretend not to need help from the other, people think you are an altruist*.";
+ mes "'So we suggest you ^696969Acolyte^000000.'";
+ mes " ";
+ mes "'* The person who really enjoy helping people with self-sacrifice.'";
+ goto SelJob;
+ JobMerchant:
+ mes "[Helper]";
+ mes "'You can easily catch what the public wants, and you have a talent to organize system, and you have a strong sense of responsibility.'";
+ mes "'So we suggest you ^696969Merchant^000000.'";
+ goto SelJob;
+
+ SelJob:
+ next;
+ mes "[Helper]";
+ mes "...Report says like this. It is not my intention, I don't mean to nice to you!! To me you are just a novice!!";
+ mes "Never take it seriously, it's just a game.";
+ next;
+ mes "[Helper]";
+ mes "Here are the subsides from the Training Ground. Even if they are not worthless to veteran players, not to you.";
+ next;
+ if (nov_1_4_cos_c > 23) goto BeL0;
+
+ nov12coscE0:
+ getitem 519,1;
+ set nov_1_4_cos_c,24;
+ set @temp,nov_1st_cos+@nov_2nd_cos;
+ if (@temp <= 8) goto nov1stcosPnov2ndcosL8;
+ if (@temp <= 15) goto nov1stcosPnov2ndcosL15;
+ if (@temp == 16) goto nov1stcosPnov2ndcosE16;
+ set Zeny,Zeny-500;
+ getitem 507,10;
+ goto BeL0;
+
+ nov1stcosPnov2ndcosL8:
+ set Zeny,Zeny+500;
+ getitem 507,10;
+ goto BeL0;
+ nov1stcosPnov2ndcosL15:
+ set Zeny,Zeny+100;
+ getitem 507,1;
+ goto BeL0;
+ nov1stcosPnov2ndcosE16:
+ set Zeny,Zeny+300;
+ getitem 507,3;
+ goto BeL0;
+
+ BeL0:
+ mes "[Helper]";
+ mes "Now I will let you go to the Job Agency. Before going there are a few things you have to know.";
+ next;
+ mes "[Helper]";
+ mes "Are you going to choose the job following the test? Or are you going to choose you job by your own will?";
+ next;
+ mes "[Helper]";
+ mes "If you follow the test, you can get a lot of subsidy for headstart from guild and association and get to start in the specific town for your job.";
+ mes "If you follow your will, you get to start in specific town for your job with 100 zeny before we gave you.";
+ next;
+ mes "[Helper]";
+ mes "Choose one. This is your only chance.";
+ next;
+ menu "I want to be what I wanted!",L0,"I will follow the result of the test",L1;
+
+ L0:
+ mes "[Helper]";
+ mes "Ok. I see. Choose one what you wanted to be. I will send you to the town right away.";
+ if (nov_1_4_cos_c > 24) goto JobMenu;
+ set nov_1_4_cos_c,25;
+ set Zeny,Zeny+100;
+ mes "I give you 100z to begin in the great world or ragnarok.";
+ goto JobMenu;
+
+ JobMenu:
+ next;
+ menu "Swordman.",L00,"Archer.",L01,"Thief.",L02,"Mage.",L03,"Acolyte.",L04,"Merchant",L05;
+
+ L00:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "izlude.gat",94,104;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "izlude_in.gat",121,165;
+ close;
+ L01:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "payon.gat",87,117;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "payon_in02.gat",21,71;
+ close;
+ L02:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "morocc.gat",160,94;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "morocc.gat",27,291;
+ close;
+ L03:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "geffen.gat",120,100;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "geffen.gat",66,175;
+ close;
+ L04:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "prontera.gat",273,354;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "prontera.gat",233,313;
+ close;
+ L05:
+ mes "[Helper]";
+ mes "I expect you the best.";
+ savepoint "alberta.gat",116,57;
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "alberta.gat",40,42;
+ close;
+
+ L1:
+ if (@job_number==0) goto WarpJobSwordman;
+ if (@job_number==1) goto WarpJobArcher;
+ if (@job_number==2) goto WarpJobThief;
+ if (@job_number==3) goto WarpJobMagican;
+ if (@job_number==4) goto WarpJobAcolyte;
+ if (@job_number==5) goto WarpJobMerchant;
+
+ WarpJobSwordman:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new_1-4.gat",20,176;
+ close;
+ WarpJobArcher:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new_1-4.gat",60,176;
+ close;
+ WarpJobThief:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new-5_4.gat",100,176;
+ close;
+ WarpJobMagican:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new_1-4.gat",140,176;
+ close;
+ WarpJobAcolyte:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new_1-4.gat",180,176;
+ close;
+ WarpJobMerchant:
+ mes "[Helper]";
+ mes "Let warp you";
+ next;
+ warp "new_1-4.gat",180,136;
+ close;
+}
+
+// == JOB AGENCIES ==
+
+// -- Swordman --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 1 Sword, 1 Red Potion, 3 Meats
+new_1-4.gat,19,189,4 script Swordman's Helper 105,{
+ save "izlude_in.gat",121,165;
+ mes "['Swordman' Agency Helper]";
+ mes "Welcome!";
+ mes "Here is Swordman Agency";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Swordman' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Swordman' Agency Helper]";
+ mes "Ok.";
+ mes "I will give you a few subsidy and let you get there.";
+ mes "Here are 1 Sword, 1 Red Potion and 3 Meats for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 1103,1;
+ getitem 501,1;
+ getitem 517,3;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "izlude_in.gat",121,165;
+ close;
+}
+
+// -- Archer --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 3 Red Potions, 50 zenys
+new_1-4.gat,59,186,4 script Archer's Helper 105,{
+ savepoint "payon.gat",87,117;
+ mes "['Archer' Agency Helper]";
+ mes "Wecome!";
+ mes "Here is Archer Agency.";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Archer' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Archer' Agency Helper]";
+ mes "Ok.";
+ mes "I will give you a few subsidy and let you get there.";
+ mes "Here are 3 Red potions and 50 zeny for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 501,3;
+ set Zeny,Zeny+50;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "payon_in02.gat",21,71;
+ close;
+}
+
+// -- Thief --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 1 Jacket, 6 Sweet Patatos
+new_1-4.gat,99,186,4 script Thief's Helper 105,{
+ savepoint "morocc.gat",160,94;
+ mes "['Thief' Agency Helper]";
+ mes "Welcome!";
+ mes "Here is the thief agency.";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Thief' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Thief' Agency Helper]";
+ mes "Ok.";
+ mes "I will give a few subsidy and let you get there.";
+ mes "Here are 1 Jacket and 6 Sweet Patatos for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 2303,1;
+ getitem 516,6;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "morocc.gat",27,291;
+ close;
+}
+
+// -- Mage --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 3 Red Potions, 100 zenys
+new_1-4.gat,139,186,4 script Mage's Helper 105,{
+ savepoint "geffen.gat",120,100;
+ mes "['Mage' Agency Helper]";
+ mes "Wecome!";
+ mes "Here is Mage Agency.";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Mage' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Mage'Agency Helper]";
+ mes "Ok.";
+ mes "I will give you a few subsidy and let you get there.";
+ mes "Here are 3 Red potions and 100 Zeny for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 501,3;
+ set Zeny,Zeny+100;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "geffen.gat",66,175;
+ close;
+}
+
+// -- Acolyte --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 3 Red Potions, 1 Club
+new_1-4.gat,179,186,4 script Acolyte's Helper 105,{
+ savepoint "prontera.gat",273,354;
+ mes "['Acolyte' Agency Helper]";
+ mes "Wecome!";
+ mes "Here is Acolyte Agency.";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Acolyte' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Acolyte' Agency Helper]";
+ mes "Ok.";
+ mes "I will give you a few subsidy and let you get there.";
+ mes "Here are 3 Red Potions and a Club for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 501,3;
+ getitem 1503,1;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "prontera.gat",233,313;
+ close;
+}
+
+// -- Merchant --
+// nov_1_4_cos_c (variable) starts with value 25
+// Bonus: 3 Red Potions, 100 zenys
+new_1-4.gat,180,146,4 script Merchant's Helper 105,{
+ savepoint "alberta.gat",116,57;
+ mes "['Merchant' Agency Helper]";
+ mes "Wecome!";
+ mes "Here is Merchant Agency.";
+ mes "We are so pleased with you doing great until now.";
+ next;
+ mes "['Merchant' Agency Helper]";
+ mes "Also we hope you will become the greatest adventurer in Ragnarok.";
+ mes "Are you ready?";
+ next;
+ mes "['Merchant' Agency Helper]";
+ mes "Ok.";
+ mes "I will give you a few subsidy and let you get there.";
+ mes "Here are 3 Red potions and 100 Zeny for you.";
+ if (nov_1_4_cos_c > 25) goto nov_get_item05cont;
+ set nov_1_4_cos_c,26;
+ getitem 501,3;
+ set Zeny,Zeny+100;
+ goto nov_get_item05cont;
+
+ nov_get_item05cont:
+ next;
+ set nov_1st_cos,0;
+ set nov_get_item01,0;
+ set nov_1_2_cos_c,0;
+ set Done_milk,0;
+ set nov_1_4_cos_c,0;
+ set nov_3_merchant,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;
+ warp "alberta.gat",40,42;
+ close;
+}
+
diff --git a/npc/jobs/novice/supernovice.txt b/npc/jobs/novice/supernovice.txt
index 82ecda020..f0319c4e8 100644
--- a/npc/jobs/novice/supernovice.txt
+++ b/npc/jobs/novice/supernovice.txt
@@ -1,271 +1,271 @@
-//===== eAthena Script =======================================
-//= Super Novice Script
-//===== By: ==================================================
-//= Darkchild
-//===== Current Version: =====================================
-//= 1.1
-//===== 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)
-//============================================================
-
-// -- Jobchanger --
-aldeba_in.gat,223,167,3 script Tozel 709,{
- if(job_snovice == 1) goto L_Start2;
- if(Class == 23) goto L_Twice;
- if(Class != 0) 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 job_snovice,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;
- 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;
- jobchange 23;
- delitem 938,30;
- delitem 907,30;
- getitem 2339,1;
- 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.";
- set job_snovice,2;
- 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(Class == 23) goto L_Supernovice;
- if(Class != 0) 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(Class != 23) 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(Zeny < 1900) goto L_Error;
- set Zeny,Zeny-1900;
- if(getskilllv(39)==0) goto L_End;
- 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.1
+//===== 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)
+//============================================================
+
+// -- Jobchanger --
+aldeba_in.gat,223,167,3 script Tozel 709,{
+ if(job_snovice == 1) goto L_Start2;
+ if(Class == 23) goto L_Twice;
+ if(Class != 0) 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 job_snovice,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;
+ 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;
+ jobchange 23;
+ delitem 938,30;
+ delitem 907,30;
+ getitem 2339,1;
+ 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.";
+ set job_snovice,2;
+ 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(Class == 23) goto L_Supernovice;
+ if(Class != 0) 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(Class != 23) 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(Zeny < 1900) goto L_Error;
+ set Zeny,Zeny-1900;
+ if(getskilllv(39)==0) goto L_End;
+ 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 2bf04f1f6..0483ebafe 100644
--- a/npc/kafras/functions_kafras.txt
+++ b/npc/kafras/functions_kafras.txt
@@ -1,345 +1,345 @@
-//===== eAthena Script =======================================
-//= Kafra Functions
-//===== By: ==================================================
-//= Lotsa People (1.0)
-//= eAthena Dev Team
-//= Darlskies
-//= Darkchild
-//= Syrus22
-//= Lupus
-//= kobra_k88 (2.0)
-//===== Current Version: =====================================
-//= 2.2b
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: ===============================================
-//= These functions handle save, storage, cart rental, teleport,
-//= and Kafra pass 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]
-//= Fixed typo >_< [Aria]
-//============================================================
-
-
-// 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 {
- set @kafPass, 0;
- mes "[Kafra]";
- if(getarg(0)==0) mes "Welcome to Kafra Corp. We will stay with you wherever you go.";
- if(getarg(0)==1) mes "Welcome... Kafra Services.... Will be with you even if you die.....";
- if(getarg(0)==2) mes "Welcome, ^5533FF" + GetGuildName(@GID) + "^000000 members. We will stay with you wherever you go";
- next;
- M_Menu:
-
- if(getarg(0)==2) menu "-Use Storage",M_Storage, "-Use Guild Storage",M_GStorage, "-Rent a Cart",M_Cart, "-Use Teleport Service",M_Teleport, "-Cancel",M_End;
-
- if(getarg(1)==1) menu "-Save",M_Save, "-Use Storage",M_Storage, "-Rent a Cart",M_Cart, "-Kafra Pass",M_Pass, "-Other Information Check",M_Info,
- "-Cancel",M_End;
-
- menu "-Save",M_Save, "-Use Storage",M_Storage, "-Use Teleport Service",M_Teleport, "-Rent a Cart",M_Cart, "-Kafra Pass",M_Pass,
- "-Other Information Check",M_Info, "-Cancel",M_End;
-
- M_Save:
- return;
- M_Storage:
- callfunc "F_KafStor",getarg(0);
- next;
- goto M_Menu;
- M_GStorage:
- callfunc "F_KafStor",3;
- next;
- goto M_Menu;
- M_Teleport:
- callfunc "F_KafTele",getarg(0);
- goto M_Menu;
- M_Cart:
- if(callfunc("F_KafCart",getarg(0)) == 1) next;
- goto M_Menu;
- M_Pass:
- if(callfunc("F_KafPass") == 1) next;
- goto M_Menu;
- M_Info:
- callfunc "F_KafInfo",getarg(2);
- goto M_Menu;
- M_End:
- callfunc "F_KafEnd",getarg(0),0;
- end;
-}
-
-
-// Storage Function =======================================================
-function script F_KafStor {
- if(getarg(0) == 3) goto L_Guild;
- if((class ==Job_Novice) && (JobLevel<6)) goto sL_JbLvl;
- if(Class == Job_Novice) set @fee, 30;
- if(Class != Job_Novice) set @fee, 60;
- if(@kafPass==1 || getarg(0)==2) set @fee, 0;
- if(Zeny<@fee) goto sL_Zeny;
- set Zeny, Zeny-@fee;
- set RESRVPTS, RESRVPTS + (@fee/5);
- openstorage;
- cutin "", 255;
- close;
-
- sL_JbLvl:
- mes "[Kafra]";
- mes "I am sorry but you have to be at leaset Novice level 6 if you want to use the storage.";
- return;
- sL_Zeny:
- mes "[Kafra]";
- mes "Dear you don't have enough money. The Storage fee is "+@fee+" Zeny.";
- return;
-L_Guild:
- if(guildopenstorage(0) == 1) goto L_InUse;
- cutin "", 255;
- close;
-
- L_InUse:
- mes "[Kafra]";
- mes "I'm sorry but another guild member is using the guild storage";
- mes "right now. Please wait untill that person is finished.";
- close2;
- cutin "", 255;
- end;
-
-}
-
-
-// Teleport Function ==================================================
-function script F_KafTele {
- mes "[Kafra]";
- if (@kafPass==1) mes "Since you're using a Kafra Pass, any warp is free!";
- 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;
- if (@kafPass==1) set @wrpP[@num], 0;
- if (Zeny<@wrpP[@num]) goto sL_CantTele;
- set Zeny, Zeny-@wrpP[@num];
- if (@kafPass==0) 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] == "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;
- close2; // this part safegaurds against errors/typos
- set zeny, zeny + @wrpP[@num];
- cutin "", 255;
- end;
-
- sL_CantTele:
- mes "[Kafra]";
- mes "Dear you don't have enough money. Please check your funds again.";
- close2;
- cutin "", 255;
- end;
-}
-
-
-// Cart Function ========================================================
-function script F_KafCart {
- if(callfunc("Is_Merc_Class") == 0) goto sL_CantRent;
- if(getskilllv(39)==0) goto sL_NeedSkill;
- if(checkcart(0) == 1) goto sL_GotCart;
- if(getarg(0) == 2) goto L_Guild;
- mes "[Kafra]";
- if(@kafPass==0) mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
- if(@kafPass==1) mes "Since you're using a Kafra Pass, you can rent a cart for free!";
- next;
- menu "-Rent a Cart.",-, "-Cancel.",M_End;
-
- if(Zeny<800 && kafPass==0) goto sL_CartFee;
- if(@kafPass==0) set Zeny,Zeny-800;
- if(@kafPass==0) set RESRVPTS, RESRVPTS + 48;
- L_Guild:
- setcart;
- mes "[Kafra]";
- mes "Here is your cart.";
- return 1;
-
- sL_CantRent:
- mes "[Kafra]";
- mes "I'm sorry dear. The Cart service is only provided for the Merchant and Blacksmith Class.";
- return 1;
- sL_NeedSkill:
- mes "[Kafra]";
- mes "I'm sorry but you need the skill ^0000FF'Pushcart'^000000 to rent a cart.";
- return 1;
- sL_GotCart:
- mes "[Kafra]";
- mes "Excuse me... but you already have a cart....";
- emotion 4;
- return 1;
- sL_CartFee:
- mes "[Kafra]";
- mes "Dear, you don't have enough Money. You need 800 Zeny.";
- return 1;
- M_End:
- return 0;
-}
-
-
-// Pass Function ===============================================================
-function script F_KafPass {
-
- sM_Menu:
- menu "Use a Kafra Pass.",-, "What is a Kafra Pass?",sM_PassInfo, "Cancel",sM_End;
-
- mes "[Kafra]";
- mes "Let me just check your pass.....";
- next;
- if(usedKafPass==0 && countitem(1084)<1) goto sL_NeedPass;
- set @kafPass,1;
- set usedKafPass, usedKafPass + 1;
- if(usedKafPass>=3) goto sL_PassExpire;
- if(usedKafPass > 1) goto L_Cont; //fixed Lupus
- mes "(you hand her your pass)";
- next;
- mes "[Kafra]";
- mes "Great! Everything seems to be in order. Now that your pass is activated, you may rent a cart or use the teleport services for free.";
- mes "Your pass number has been entered into our database so you no longer need it.";
- delitem 1084,1;
- next;
-
- L_Cont:
- mes "[Kafra]";
- mes "You will be able to use the Cart Rental and Teleport services free of charge ^5533FF"+(3 - usedKafPass)+"^000000 more times with any Kafra service agent you choose.";
- return 1;
-
- sL_NeedPass:
- mes "[Kafra]";
- mes "I'm sorry but you don't have a kafra pass to use....";
- next;
- goto sM_Menu;
- sL_PassExpire:
- mes "[Kafra]";
- mes "This is going to be the 3rd and final time you use this pass, therefore it is now expired.";
- next;
- set usedKafPass,0;
- mes "[Kafra]";
- mes "You may now use the Teleport and Cart Rental services for free.";
- return 1;
- sM_PassInfo:
- mes "[Kafra]";
- mes "A ^5533FFKafra Pass^000000 is a unique voucher that lets you use Kafra services for free!";
- mes "The Kafra services that you may use for free are the ^FF3355Teleport^000000 service and the ^FF3355Cart Rental^000000 service.";
- next;
- mes "[Kafra]";
- mes "Kafra passes can be purchased at the Kafra Corp. Main office in Al De Baran.";
- next;
- mes "[Kafra]";
- mes "To use a Kafra Pass, simply choose the option to 'Use a Kafra Pass', when speaking with a Kafra agent such as myself.";
- mes "Your pass number will be entered into our database, and you will then be able to use the Teleport, and Cart Rental Kafra services free of charge.";
- next;
- mes "[Kafra]";
- mes "Once you have finished using the desired services, and have stoped interacting with the Kafra, your 'free use' session will end.";
- mes "You will have a total of ^5533FF 3 'free use' sessions^000000 available upon activation of your Kafra Pass.";
- next;
- mes "[Kafra]";
- mes "To begin another 'free use' session, simply select the 'Use a Kafra Pass' option when speaking with a Kafra Agent.";
- next;
- mes "[Kafra]";
- mes "Believe me when I say that the Kafra Pass is a great bargain!!";
- mes "With the Kafra Pass, we hope to give players some incentive to use our great services.";
- next;
- goto sM_Menu;
-
- sM_End:
- return 0;
-}
-
-// Special Reserve Points Function ===========================================
-function script F_KafInfo {
-
- sM_Menu:
- if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-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 usefull 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_End:
- return;
-}
-
-
-// End Function =====================================================
-// arg(0): used to determine what message to display.
-// arg(1): used to determine if save message is diplayed.
-//===================================================================
-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 15;
- end;
-}
+//===== eAthena Script =======================================
+//= Kafra Functions
+//===== By: ==================================================
+//= Lotsa People (1.0)
+//= eAthena Dev Team
+//= Darlskies
+//= Darkchild
+//= Syrus22
+//= Lupus
+//= kobra_k88 (2.0)
+//===== Current Version: =====================================
+//= 2.2b
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: ===============================================
+//= These functions handle save, storage, cart rental, teleport,
+//= and Kafra pass 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]
+//= Fixed typo >_< [Aria]
+//============================================================
+
+
+// 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 {
+ set @kafPass, 0;
+ mes "[Kafra]";
+ if(getarg(0)==0) mes "Welcome to Kafra Corp. We will stay with you wherever you go.";
+ if(getarg(0)==1) mes "Welcome... Kafra Services.... Will be with you even if you die.....";
+ if(getarg(0)==2) mes "Welcome, ^5533FF" + GetGuildName(@GID) + "^000000 members. We will stay with you wherever you go";
+ next;
+ M_Menu:
+
+ if(getarg(0)==2) menu "-Use Storage",M_Storage, "-Use Guild Storage",M_GStorage, "-Rent a Cart",M_Cart, "-Use Teleport Service",M_Teleport, "-Cancel",M_End;
+
+ if(getarg(1)==1) menu "-Save",M_Save, "-Use Storage",M_Storage, "-Rent a Cart",M_Cart, "-Kafra Pass",M_Pass, "-Other Information Check",M_Info,
+ "-Cancel",M_End;
+
+ menu "-Save",M_Save, "-Use Storage",M_Storage, "-Use Teleport Service",M_Teleport, "-Rent a Cart",M_Cart, "-Kafra Pass",M_Pass,
+ "-Other Information Check",M_Info, "-Cancel",M_End;
+
+ M_Save:
+ return;
+ M_Storage:
+ callfunc "F_KafStor",getarg(0);
+ next;
+ goto M_Menu;
+ M_GStorage:
+ callfunc "F_KafStor",3;
+ next;
+ goto M_Menu;
+ M_Teleport:
+ callfunc "F_KafTele",getarg(0);
+ goto M_Menu;
+ M_Cart:
+ if(callfunc("F_KafCart",getarg(0)) == 1) next;
+ goto M_Menu;
+ M_Pass:
+ if(callfunc("F_KafPass") == 1) next;
+ goto M_Menu;
+ M_Info:
+ callfunc "F_KafInfo",getarg(2);
+ goto M_Menu;
+ M_End:
+ callfunc "F_KafEnd",getarg(0),0;
+ end;
+}
+
+
+// Storage Function =======================================================
+function script F_KafStor {
+ if(getarg(0) == 3) goto L_Guild;
+ if((class ==Job_Novice) && (JobLevel<6)) goto sL_JbLvl;
+ if(Class == Job_Novice) set @fee, 30;
+ if(Class != Job_Novice) set @fee, 60;
+ if(@kafPass==1 || getarg(0)==2) set @fee, 0;
+ if(Zeny<@fee) goto sL_Zeny;
+ set Zeny, Zeny-@fee;
+ set RESRVPTS, RESRVPTS + (@fee/5);
+ openstorage;
+ cutin "", 255;
+ close;
+
+ sL_JbLvl:
+ mes "[Kafra]";
+ mes "I am sorry but you have to be at leaset Novice level 6 if you want to use the storage.";
+ return;
+ sL_Zeny:
+ mes "[Kafra]";
+ mes "Dear you don't have enough money. The Storage fee is "+@fee+" Zeny.";
+ return;
+L_Guild:
+ if(guildopenstorage(0) == 1) goto L_InUse;
+ cutin "", 255;
+ close;
+
+ L_InUse:
+ mes "[Kafra]";
+ mes "I'm sorry but another guild member is using the guild storage";
+ mes "right now. Please wait untill that person is finished.";
+ close2;
+ cutin "", 255;
+ end;
+
+}
+
+
+// Teleport Function ==================================================
+function script F_KafTele {
+ mes "[Kafra]";
+ if (@kafPass==1) mes "Since you're using a Kafra Pass, any warp is free!";
+ 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;
+ if (@kafPass==1) set @wrpP[@num], 0;
+ if (Zeny<@wrpP[@num]) goto sL_CantTele;
+ set Zeny, Zeny-@wrpP[@num];
+ if (@kafPass==0) 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] == "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;
+ close2; // this part safegaurds against errors/typos
+ set zeny, zeny + @wrpP[@num];
+ cutin "", 255;
+ end;
+
+ sL_CantTele:
+ mes "[Kafra]";
+ mes "Dear you don't have enough money. Please check your funds again.";
+ close2;
+ cutin "", 255;
+ end;
+}
+
+
+// Cart Function ========================================================
+function script F_KafCart {
+ if(callfunc("Is_Merc_Class") == 0) goto sL_CantRent;
+ if(getskilllv(39)==0) goto sL_NeedSkill;
+ if(checkcart(0) == 1) goto sL_GotCart;
+ if(getarg(0) == 2) goto L_Guild;
+ mes "[Kafra]";
+ if(@kafPass==0) mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
+ if(@kafPass==1) mes "Since you're using a Kafra Pass, you can rent a cart for free!";
+ next;
+ menu "-Rent a Cart.",-, "-Cancel.",M_End;
+
+ if(Zeny<800 && kafPass==0) goto sL_CartFee;
+ if(@kafPass==0) set Zeny,Zeny-800;
+ if(@kafPass==0) set RESRVPTS, RESRVPTS + 48;
+ L_Guild:
+ setcart;
+ mes "[Kafra]";
+ mes "Here is your cart.";
+ return 1;
+
+ sL_CantRent:
+ mes "[Kafra]";
+ mes "I'm sorry dear. The Cart service is only provided for the Merchant and Blacksmith Class.";
+ return 1;
+ sL_NeedSkill:
+ mes "[Kafra]";
+ mes "I'm sorry but you need the skill ^0000FF'Pushcart'^000000 to rent a cart.";
+ return 1;
+ sL_GotCart:
+ mes "[Kafra]";
+ mes "Excuse me... but you already have a cart....";
+ emotion 4;
+ return 1;
+ sL_CartFee:
+ mes "[Kafra]";
+ mes "Dear, you don't have enough Money. You need 800 Zeny.";
+ return 1;
+ M_End:
+ return 0;
+}
+
+
+// Pass Function ===============================================================
+function script F_KafPass {
+
+ sM_Menu:
+ menu "Use a Kafra Pass.",-, "What is a Kafra Pass?",sM_PassInfo, "Cancel",sM_End;
+
+ mes "[Kafra]";
+ mes "Let me just check your pass.....";
+ next;
+ if(usedKafPass==0 && countitem(1084)<1) goto sL_NeedPass;
+ set @kafPass,1;
+ set usedKafPass, usedKafPass + 1;
+ if(usedKafPass>=3) goto sL_PassExpire;
+ if(usedKafPass > 1) goto L_Cont; //fixed Lupus
+ mes "(you hand her your pass)";
+ next;
+ mes "[Kafra]";
+ mes "Great! Everything seems to be in order. Now that your pass is activated, you may rent a cart or use the teleport services for free.";
+ mes "Your pass number has been entered into our database so you no longer need it.";
+ delitem 1084,1;
+ next;
+
+ L_Cont:
+ mes "[Kafra]";
+ mes "You will be able to use the Cart Rental and Teleport services free of charge ^5533FF"+(3 - usedKafPass)+"^000000 more times with any Kafra service agent you choose.";
+ return 1;
+
+ sL_NeedPass:
+ mes "[Kafra]";
+ mes "I'm sorry but you don't have a kafra pass to use....";
+ next;
+ goto sM_Menu;
+ sL_PassExpire:
+ mes "[Kafra]";
+ mes "This is going to be the 3rd and final time you use this pass, therefore it is now expired.";
+ next;
+ set usedKafPass,0;
+ mes "[Kafra]";
+ mes "You may now use the Teleport and Cart Rental services for free.";
+ return 1;
+ sM_PassInfo:
+ mes "[Kafra]";
+ mes "A ^5533FFKafra Pass^000000 is a unique voucher that lets you use Kafra services for free!";
+ mes "The Kafra services that you may use for free are the ^FF3355Teleport^000000 service and the ^FF3355Cart Rental^000000 service.";
+ next;
+ mes "[Kafra]";
+ mes "Kafra passes can be purchased at the Kafra Corp. Main office in Al De Baran.";
+ next;
+ mes "[Kafra]";
+ mes "To use a Kafra Pass, simply choose the option to 'Use a Kafra Pass', when speaking with a Kafra agent such as myself.";
+ mes "Your pass number will be entered into our database, and you will then be able to use the Teleport, and Cart Rental Kafra services free of charge.";
+ next;
+ mes "[Kafra]";
+ mes "Once you have finished using the desired services, and have stoped interacting with the Kafra, your 'free use' session will end.";
+ mes "You will have a total of ^5533FF 3 'free use' sessions^000000 available upon activation of your Kafra Pass.";
+ next;
+ mes "[Kafra]";
+ mes "To begin another 'free use' session, simply select the 'Use a Kafra Pass' option when speaking with a Kafra Agent.";
+ next;
+ mes "[Kafra]";
+ mes "Believe me when I say that the Kafra Pass is a great bargain!!";
+ mes "With the Kafra Pass, we hope to give players some incentive to use our great services.";
+ next;
+ goto sM_Menu;
+
+ sM_End:
+ return 0;
+}
+
+// Special Reserve Points Function ===========================================
+function script F_KafInfo {
+
+ sM_Menu:
+ if(getarg(0) == 0) menu "-Special Reserve Check",sM_ResChk, "-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 usefull 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_End:
+ return;
+}
+
+
+// End Function =====================================================
+// arg(0): used to determine what message to display.
+// arg(1): used to determine if save message is diplayed.
+//===================================================================
+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 15;
+ end;
+}
diff --git a/npc/kafras/kafras_alb.txt b/npc/kafras/kafras_alb.txt
index adea64b95..e34a2fc1b 100644
--- a/npc/kafras/kafras_alb.txt
+++ b/npc/kafras/kafras_alb.txt
@@ -1,67 +1,67 @@
-//===== eAthena Script ============
-//= Alberta Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// NorthWest -----------------------------------------------------------------
-alberta.gat,28,229,8 script Kafra 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetAlb";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save Outside City.",sM_Out, "-Save inside City",sM_In;
-
- sM_Out:
- savepoint "pay_fild03.gat",386,76;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "alberta.gat",31,231;
- callfunc "F_KafEnd",0,1;
-}
-
-// South ---------------------------------------------------------------------
-alberta.gat,113,60,5 script Kafra 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 {
-
- setarray @wrpP[0], 900, 1400, 1700, 2400;
- setarray @wrpD$[0], "Payon", "Prontera", "Morroc", "Comodo";
- 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";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+// NorthWest -----------------------------------------------------------------
+alberta.gat,28,229,8 script Kafra 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetAlb";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save Outside City.",sM_Out, "-Save inside City",sM_In;
+
+ sM_Out:
+ savepoint "pay_fild03.gat",386,76;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "alberta.gat",31,231;
+ callfunc "F_KafEnd",0,1;
+}
+
+// South ---------------------------------------------------------------------
+alberta.gat,113,60,5 script Kafra 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 {
+
+ setarray @wrpP[0], 900, 1400, 1700, 2400;
+ setarray @wrpD$[0], "Payon", "Prontera", "Morroc", "Comodo";
+ 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";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 61f518e37..ee2c5f570 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.1b
-//===== 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]
-//=====================================================================
-
-
-// Kafra Main Office (Kafra Leilah) ------------------------------------
-aldeba_in.gat,96,181,4 script Kafra Leilah 113,{
- cutin "kafra_05",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "aldeba_in.gat",96,179;
- callfunc "F_KafEnd",0,1;
-
-}
-
-// South --------------------------------------------------
-aldebaran.gat,143,119,4 script Kafra 113,{
- cutin "kafra_05",2;
- setarray @wrpP[0], 1600, 2000, 1700, 2200;
- setarray @wrpD$[0], "Geffen", "Payon", "Coal Mine(Dead Pit)", "Comodo";
- 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";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+// Kafra Main Office (Kafra Leilah) ------------------------------------
+aldeba_in.gat,96,181,4 script Kafra Leilah 113,{
+ cutin "kafra_05",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "aldeba_in.gat",96,179;
+ callfunc "F_KafEnd",0,1;
+
+}
+
+// South --------------------------------------------------
+aldebaran.gat,143,119,4 script Kafra 113,{
+ cutin "kafra_05",2;
+ setarray @wrpP[0], 1600, 2000, 1700, 2200;
+ setarray @wrpD$[0], "Geffen", "Payon", "Coal Mine(Dead Pit)", "Comodo";
+ 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";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 31afc191e..ac5ed4d8a 100644
--- a/npc/kafras/kafras_com.txt
+++ b/npc/kafras/kafras_com.txt
@@ -1,60 +1,60 @@
-//===== eAthena Script ===============
-//= Comodo Kafras
-//===== By: ============================
-//= eAthena Dev Team
-//===== Current Version: =======================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// In Town ==============================================>\\
-comodo.gat,200,148,4 script Kafra 721,{
- cutin "kafra_07",2;
- setarray @wrpD$[0], "Comodo Pharos Lighthouse", "Morroc", "Prontera", "Umbala";
- setarray @wrpP[0], 800, 1500, 2100, 3000;
- 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";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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 721,{
- cutin "kafra_07",2;
- setarray @wrpD$[0], "Comodo", "Morroc";
- setarray @wrpP[0], 500, 2500;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], "Cancel";
- set @wrpC$[3], "";
- set @wrpC$[4], "";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+// In Town ==============================================>\\
+comodo.gat,200,148,4 script Kafra 721,{
+ cutin "kafra_07",2;
+ setarray @wrpD$[0], "Comodo Pharos Lighthouse", "Morroc", "Prontera", "Umbala";
+ setarray @wrpP[0], 800, 1500, 2100, 3000;
+ 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";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 721,{
+ cutin "kafra_07",2;
+ setarray @wrpD$[0], "Comodo", "Morroc";
+ setarray @wrpP[0], 500, 2500;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], "Cancel";
+ set @wrpC$[3], "";
+ set @wrpC$[4], "";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 6c621bd33..0e8834495 100644
--- a/npc/kafras/kafras_dungeons.txt
+++ b/npc/kafras/kafras_dungeons.txt
@@ -1,129 +1,129 @@
-//===== eAthena Script ================
-//= Kafras in Dungeons and Fields
-//===== By: ============================
-//= eAthena Dev Team
-//===== Current Version: =======================
-//= 2.1b
-//===== 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]
-//===============================================================
-
-
-//<============================= Ant Hell ==============================>\\
-// Mocfild04 -----------------------------------------
-moc_fild04.gat,230,329,3 script Kafra 115,{
-
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "moc_fild04.gat",231,339;
- callfunc "F_KafEnd",0,1;
-}
-
-// Mocfild15 --------------------------------------------
-moc_fild15.gat,264,260,3 script Kafra 115,{
-
- cutin "kafra_03",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "moc_fild15.gat",266,271;
- callfunc "F_KafEnd",0,1;
-}
-
-//<============================= Byalan Island ============================>\\
-izlu2dun.gat,106,58,8 script Kafra 115,{
-
- cutin "kafra_03",2;
- if(Class==Job_Novice && job_merchant_q3>0) callfunc "F_MercKafra"; //F_MercKafra found in merchant.txt
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "izlu2dun.gat",87,170;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<============================ Culvert Sewers ============================>\\
-prt_fild05.gat,290,224,1 script Kafra 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 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetOrcCoal";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "mjolnir_02.gat",98,352;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<=============================== Morroc Ruins ============================>\\
-moc_ruins.gat,61,156,5 script Kafra 114,{
- cutin "kafra_04",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "moc_ruins.gat",41,141;
- callfunc "F_KafEnd",0,1;
-}
-
-
-//<================================ Orc Dungeon ============================>\\
-gef_fild10.gat,73,340,4 script Kafra 115,{
- cutin "kafra_02",2;
- callfunc "F_KafSetOrcCoal";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "gef_fild10.gat",54,326;
- callfunc "F_KafEnd",0,1;
-}
-
-// Function: Sets variables for Kafras at the Orc Dungeon and the Coal Mines
-function script F_KafSetOrcCoal {
- setarray @wrpD$[0], "Prontera", "Geffen";
- setarray @wrpP[0], 3000, 3000;
- set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
- set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
- set @wrpC$[2], "Cancel";
- set @wrpC$[3], "";
- set @wrpC$[4], "";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- return;
-}
-
-
-//<============================== Treasure Island ==========================>\\
-alb2trea.gat,59,69,1 script Kafra 117,{
- cutin "kafra_01",2;
- callfunc "F_Kafra",0,1,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.1b
+//===== 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]
+//===============================================================
+
+
+//<============================= Ant Hell ==============================>\\
+// Mocfild04 -----------------------------------------
+moc_fild04.gat,230,329,3 script Kafra 115,{
+
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "moc_fild04.gat",231,339;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Mocfild15 --------------------------------------------
+moc_fild15.gat,264,260,3 script Kafra 115,{
+
+ cutin "kafra_03",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "moc_fild15.gat",266,271;
+ callfunc "F_KafEnd",0,1;
+}
+
+//<============================= Byalan Island ============================>\\
+izlu2dun.gat,106,58,8 script Kafra 115,{
+
+ cutin "kafra_03",2;
+ if(Class==Job_Novice && job_merchant_q3>0) callfunc "F_MercKafra"; //F_MercKafra found in merchant.txt
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "izlu2dun.gat",87,170;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<============================ Culvert Sewers ============================>\\
+prt_fild05.gat,290,224,1 script Kafra 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 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetOrcCoal";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "mjolnir_02.gat",98,352;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<=============================== Morroc Ruins ============================>\\
+moc_ruins.gat,61,156,5 script Kafra 114,{
+ cutin "kafra_04",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "moc_ruins.gat",41,141;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+//<================================ Orc Dungeon ============================>\\
+gef_fild10.gat,73,340,4 script Kafra 115,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetOrcCoal";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "gef_fild10.gat",54,326;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Function: Sets variables for Kafras at the Orc Dungeon and the Coal Mines
+function script F_KafSetOrcCoal {
+ setarray @wrpD$[0], "Prontera", "Geffen";
+ setarray @wrpP[0], 3000, 3000;
+ set @wrpC$[0], @wrpD$[0]+" -> "+@wrpP[0];
+ set @wrpC$[1], @wrpD$[1]+" -> "+@wrpP[1];
+ set @wrpC$[2], "Cancel";
+ set @wrpC$[3], "";
+ set @wrpC$[4], "";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ return;
+}
+
+
+//<============================== Treasure Island ==========================>\\
+alb2trea.gat,59,69,1 script Kafra 117,{
+ cutin "kafra_01",2;
+ callfunc "F_Kafra",0,1,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 afd211a50..b61fa5982 100644
--- a/npc/kafras/kafras_gef.txt
+++ b/npc/kafras/kafras_gef.txt
@@ -1,101 +1,101 @@
-//===== eAthena Script =======================================
-//= Geffen Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// South =====================================
-geffen.gat,120,62,8 script Kafra 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 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "gef_fild00.gat",51,194;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "geffen.gat",200,124;
- callfunc "F_KafEnd",0,1;
-}
-
-// North ==============================================
-geffen.gat,116,202,3 script Kafra 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "gef_fild04.gat",192,49;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "geffen.gat",110,199;
- callfunc "F_KafEnd",0,1;
-}
-
-// West =========================================
-geffen.gat,37,116,6 script Kafra 117,{
- cutin "kafra_01",2;
- callfunc "F_KafSetGef";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "gef_fild07.gat",330,192;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "geffen.gat",43,108;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Geffen Kafras -------------------
-function script F_KafSetGef {
-
- setarray @wrpD$[0], "Prontera", "Payon", "Al De Baran", "Morroc";
- setarray @wrpP[0], 1400, 1800, 1800, 2200;
- 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";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+// South =====================================
+geffen.gat,120,62,8 script Kafra 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 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "gef_fild00.gat",51,194;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "geffen.gat",200,124;
+ callfunc "F_KafEnd",0,1;
+}
+
+// North ==============================================
+geffen.gat,116,202,3 script Kafra 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "gef_fild04.gat",192,49;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "geffen.gat",110,199;
+ callfunc "F_KafEnd",0,1;
+}
+
+// West =========================================
+geffen.gat,37,116,6 script Kafra 117,{
+ cutin "kafra_01",2;
+ callfunc "F_KafSetGef";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out, "-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "gef_fild07.gat",330,192;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "geffen.gat",43,108;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Geffen Kafras -------------------
+function script F_KafSetGef {
+
+ setarray @wrpD$[0], "Prontera", "Payon", "Al De Baran", "Morroc";
+ setarray @wrpP[0], 1400, 1800, 1800, 2200;
+ 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";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 f3fd63c63..2fcc86e83 100644
--- a/npc/kafras/kafras_izl.txt
+++ b/npc/kafras/kafras_izl.txt
@@ -1,39 +1,39 @@
-//===== eAthena Script =======================================
-//= Izlude Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-izlude.gat,134,87,3 script Kafra 117,{
- cutin "kafra_01",2;
- setarray @wrpD$[0], "Prontera", "Payon", "Geffen";
- setarray @wrpP[0], 900, 1700, 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";
- set @wrpC$[4], "";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+izlude.gat,134,87,3 script Kafra 117,{
+ cutin "kafra_01",2;
+ setarray @wrpD$[0], "Prontera", "Payon", "Geffen";
+ setarray @wrpP[0], 900, 1700, 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";
+ set @wrpC$[4], "";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ 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 5395de0d1..a666e4c77 100644
--- a/npc/kafras/kafras_mor.txt
+++ b/npc/kafras/kafras_mor.txt
@@ -1,100 +1,100 @@
-//===== eAthena Script =======================================
-//= Morroc Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// South ================================
-morocc.gat,156,97,4 script Kafra 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 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "moc_fild07.gat",212,30;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "morocc.gat",157,272;
- callfunc "F_KafEnd",0,1;
-}
-
-// West =================================
-morocc.gat,28,167,6 script Kafra 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "moc_fild19.gat",164,107;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "morocc.gat",31,164;
- callfunc "F_KafEnd",0,1;
-}
-
-// East =================================
-morocc.gat,292,211,4 script Kafra 112,{
- cutin "kafra_06",2;
- callfunc "F_KafSetMoc";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "moc_fild10.gat",24,107;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "morocc.gat",294,207;
- callfunc "F_KafEnd",0,1;
-}
-
-// Function: Sets variables for Morroc Kafras --------------------------------
-function script F_KafSetMoc {
-
- setarray @wrpD$[0], "Comodo", "Prontera", "Payon", "Geffen", "Alberta";
- setarray @wrpP[0], 1400, 1400, 1800, 2100, 2200;
- 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";
- set @wrpC$[6], "";
- 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.1b
+//===== 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]
+//=====================================================================
+
+
+// South ================================
+morocc.gat,156,97,4 script Kafra 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 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "moc_fild07.gat",212,30;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "morocc.gat",157,272;
+ callfunc "F_KafEnd",0,1;
+}
+
+// West =================================
+morocc.gat,28,167,6 script Kafra 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "moc_fild19.gat",164,107;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "morocc.gat",31,164;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East =================================
+morocc.gat,292,211,4 script Kafra 112,{
+ cutin "kafra_06",2;
+ callfunc "F_KafSetMoc";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "moc_fild10.gat",24,107;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "morocc.gat",294,207;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Function: Sets variables for Morroc Kafras --------------------------------
+function script F_KafSetMoc {
+
+ setarray @wrpD$[0], "Comodo", "Prontera", "Payon", "Geffen", "Alberta";
+ setarray @wrpP[0], 1400, 1400, 1800, 2100, 2200;
+ 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";
+ set @wrpC$[6], "";
+ 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 6a8092f8d..2f2a6a3d5 100644
--- a/npc/kafras/kafras_new.txt
+++ b/npc/kafras/kafras_new.txt
@@ -1,53 +1,53 @@
-//===== eAthena Script ===========
-//= New Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//==========================================================================
-
-
-// Gonryun -----------------------------------------------------------------
-gonryun.gat,159,122,4 script Kafra 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "gonryun.gat",160,62;
- callfunc "F_KafEnd",0,1;
-}
-
-// Umbala Kafra ------------------------------------------------------------
-umbala.gat,128,133,4 script Kafra 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "umbala.gat",126,131;
- callfunc "F_KafEnd",0,1;
-}
-
-// Niflheim ----------------------------------------------------------------
-niflheim.gat,190,180,5 script Kafra 791,{
- callfunc "F_Kafra",1,1,1;
-
- M_Save:
- savepoint "niflheim.gat",192,182;
- callfunc "F_KafEnd",1,1;
-}
+//===== eAthena Script ===========
+//= New Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.1b
+//===== 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]
+//==========================================================================
+
+
+// Gonryun -----------------------------------------------------------------
+gonryun.gat,159,122,4 script Kafra 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "gonryun.gat",160,62;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Umbala Kafra ------------------------------------------------------------
+umbala.gat,128,133,4 script Kafra 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "umbala.gat",126,131;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Niflheim ----------------------------------------------------------------
+niflheim.gat,190,180,5 script Kafra 791,{
+ callfunc "F_Kafra",1,1,1;
+
+ 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 e62316f49..bf92e5300 100644
--- a/npc/kafras/kafras_pay.txt
+++ b/npc/kafras/kafras_pay.txt
@@ -1,65 +1,65 @@
-//===== eAthena Script =======================================
-//= Payon 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]
-//= v2.2 New Payon Locations. [Darkchild]
-//==========================================================================
-
-
-// Main Town ----------------------------------------------------------------
-payon.gat,181,104,4 script Kafra 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetPay";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "pay_fild01.gat",340,347;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "payon.gat",179,97;
- callfunc "F_KafEnd",0,1;
-}
-
-// Archer Village ------------------------------------------------------------
-pay_arche.gat,55,123,8 script Kafra 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetPay";
- callfunc "F_Kafra",0,0,1;
-
- M_Save:
- savepoint "pay_arche.gat",49,144;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Payon Kafras ---------------------------------
-function script F_KafSetPay {
- setarray @wrpD$[0], "Alberta", "Prontera", "Morroc";
- setarray @wrpP[0], 1200, 1800, 2000;
- 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";
- set @wrpC$[4], "";
- set @wrpC$[5], "";
- set @wrpC$[6], "";
- return;
-}
+//===== eAthena Script =======================================
+//= Payon 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]
+//= v2.2 New Payon Locations. [Darkchild]
+//==========================================================================
+
+
+// Main Town ----------------------------------------------------------------
+payon.gat,181,104,4 script Kafra 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetPay";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "pay_fild01.gat",340,347;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "payon.gat",179,97;
+ callfunc "F_KafEnd",0,1;
+}
+
+// Archer Village ------------------------------------------------------------
+pay_arche.gat,55,123,8 script Kafra 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetPay";
+ callfunc "F_Kafra",0,0,1;
+
+ M_Save:
+ savepoint "pay_arche.gat",49,144;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Payon Kafras ---------------------------------
+function script F_KafSetPay {
+ setarray @wrpD$[0], "Alberta", "Prontera", "Morroc";
+ setarray @wrpP[0], 1200, 1800, 2000;
+ 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";
+ set @wrpC$[4], "";
+ set @wrpC$[5], "";
+ set @wrpC$[6], "";
+ return;
+}
diff --git a/npc/kafras/kafras_pron.txt b/npc/kafras/kafras_pron.txt
index 6429bbce1..b81cd9c8b 100644
--- a/npc/kafras/kafras_pron.txt
+++ b/npc/kafras/kafras_pron.txt
@@ -1,100 +1,100 @@
-//===== eAthena Script =======================================
-//= Prontera Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// North of Prontera==================================
-prt_fild01.gat,198,47,8 script Kafra 112,{
- cutin "kafra_06",2;
- callfunc "F_Kafra",0,1,1;
-
- M_Save:
- savepoint "prt_fild01.gat",197,50;
- callfunc "F_KafEnd",0,1;
-}
-
-// SOUTH ======================================
-prontera.gat,151,29,8 script Kafra 116,{
- cutin "kafra_02",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "prt_fild08.gat",170,369;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "prontera.gat",150,33;
- callfunc "F_KafEnd",0,1;
-}
-
-//WEST=========================================
-prontera.gat,29,207,6 script Kafra 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "prt_fild05.gat",367,205;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "prontera.gat",33,208;
- callfunc "F_KafEnd",0,1;
-}
-
-// East ===========================================
-prontera.gat,282,200,4 script Kafra 115,{
- cutin "kafra_03",2;
- callfunc "F_KafSetPront";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
-
- sM_Out:
- savepoint "prt_fild06.gat",31,192;
- callfunc "F_KafEnd",0,1;
- sM_In:
- savepoint "prontera.gat",281,203;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Prontera Kafras ----------------------------
-function script F_KafSetPront {
-
- setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Comodo", "Orc Dungeon";
- setarray @wrpP[0], 900, 1400, 1700, 1800, 2100, 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], @wrpD$[4]+" -> "+@wrpP[4];
- set @wrpC$[5], @wrpD$[5]+" -> "+@wrpP[5];
- set @wrpC$[6], "Cancel";
- setarray @viewpX[0], 151, 29, 282, 0;
- setarray @viewpY[0], 29, 207, 200, 0;
- return;
-}
+//===== eAthena Script =======================================
+//= Prontera Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.1b
+//===== 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]
+//=====================================================================
+
+
+// North of Prontera==================================
+prt_fild01.gat,198,47,8 script Kafra 112,{
+ cutin "kafra_06",2;
+ callfunc "F_Kafra",0,1,1;
+
+ M_Save:
+ savepoint "prt_fild01.gat",197,50;
+ callfunc "F_KafEnd",0,1;
+}
+
+// SOUTH ======================================
+prontera.gat,151,29,8 script Kafra 116,{
+ cutin "kafra_02",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "prt_fild08.gat",170,369;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "prontera.gat",150,33;
+ callfunc "F_KafEnd",0,1;
+}
+
+//WEST=========================================
+prontera.gat,29,207,6 script Kafra 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "prt_fild05.gat",367,205;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "prontera.gat",33,208;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East ===========================================
+prontera.gat,282,200,4 script Kafra 115,{
+ cutin "kafra_03",2;
+ callfunc "F_KafSetPront";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ menu "-Save outside city.",sM_Out,"-Save inside city.",sM_In;
+
+ sM_Out:
+ savepoint "prt_fild06.gat",31,192;
+ callfunc "F_KafEnd",0,1;
+ sM_In:
+ savepoint "prontera.gat",281,203;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Prontera Kafras ----------------------------
+function script F_KafSetPront {
+
+ setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Comodo", "Orc Dungeon";
+ setarray @wrpP[0], 900, 1400, 1700, 1800, 2100, 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], @wrpD$[4]+" -> "+@wrpP[4];
+ set @wrpC$[5], @wrpD$[5]+" -> "+@wrpP[5];
+ set @wrpC$[6], "Cancel";
+ setarray @viewpX[0], 151, 29, 282, 0;
+ setarray @viewpY[0], 29, 207, 200, 0;
+ return;
+}
diff --git a/npc/kafras/kafras_yun.txt b/npc/kafras/kafras_yun.txt
index 3116f74ae..0009a2989 100644
--- a/npc/kafras/kafras_yun.txt
+++ b/npc/kafras/kafras_yun.txt
@@ -1,71 +1,71 @@
-//===== eAthena Script =======================================
-//= Yuno Kafras
-//===== By: =========================
-//= eAthena Dev Team
-//===== Current Version: ===================
-//= 2.1b
-//===== 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]
-//=====================================================================
-
-
-// Center ------------------------------------------------------------------
-yuno.gat,153,187,6 script Kafra 114,{
- cutin "kafra_04",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",332,107;
- callfunc "F_KafEnd",0,1;
-}
-
-// South East --------------------------------------------------------------
-yuno.gat,328,108,6 script Kafra 113,{
- cutin "kafra_05",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",332,107;
- callfunc "F_KafEnd",0,1;
-}
-
-// East --------------------------------------------------------------------
-yuno.gat,278,221,6 script Kafra 117,{
- cutin "kafra_01",2;
- callfunc "F_KafSetYun";
- callfunc "F_Kafra",0,0,0;
-
- M_Save:
- savepoint "yuno.gat",332,107;
- callfunc "F_KafEnd",0,1;
-}
-
-
-// Function: Sets variables for Yuno Kafras ------------
-function script F_KafSetYun {
- setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Orc Dungeon", "Comodo";
- setarray @wrpP[0], 1000, 1400, 1700, 1800, 2500, 3000;
- 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], 328, 278, 153, 0;
- setarray @viewpY[0], 108, 221, 187, 0;
- return;
-}
+//===== eAthena Script =======================================
+//= Yuno Kafras
+//===== By: =========================
+//= eAthena Dev Team
+//===== Current Version: ===================
+//= 2.1b
+//===== 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]
+//=====================================================================
+
+
+// Center ------------------------------------------------------------------
+yuno.gat,153,187,6 script Kafra 114,{
+ cutin "kafra_04",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",332,107;
+ callfunc "F_KafEnd",0,1;
+}
+
+// South East --------------------------------------------------------------
+yuno.gat,328,108,6 script Kafra 113,{
+ cutin "kafra_05",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",332,107;
+ callfunc "F_KafEnd",0,1;
+}
+
+// East --------------------------------------------------------------------
+yuno.gat,278,221,6 script Kafra 117,{
+ cutin "kafra_01",2;
+ callfunc "F_KafSetYun";
+ callfunc "F_Kafra",0,0,0;
+
+ M_Save:
+ savepoint "yuno.gat",332,107;
+ callfunc "F_KafEnd",0,1;
+}
+
+
+// Function: Sets variables for Yuno Kafras ------------
+function script F_KafSetYun {
+ setarray @wrpD$[0], "Izlude", "Geffen", "Payon", "Morroc", "Orc Dungeon", "Comodo";
+ setarray @wrpP[0], 1000, 1400, 1700, 1800, 2500, 3000;
+ 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], 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 41f8d1e8f..c0999273e 100644
--- a/npc/merchants/alchemist.txt
+++ b/npc/merchants/alchemist.txt
@@ -1,120 +1,120 @@
-//===== eAthena Script =======================================
-//= Alchemist Shop
-//===== By: ==================================================
-//= Darkchild (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Selling Alchemist Shit :)
-//===== Additional Comments: =================================
-//= Working.
-//============================================================
-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 > 10000)) goto M_Bye;
- set @price,@num * 8;
- mes "[Gever AI Sharp]";
- if(zeny < @price) goto sL_NoZeny;
- if (checkweight(@item,@num) == 0) goto sL_OverW;
- set zeny,Zeny-@price;
- getitem 7134,@num;
- 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, "Alchohol 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, "Concentration 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$,"Concentration Potion";
- goto L_Choice;
- L_Choice:
- mes "[Gever AI Sharp]";
- mes "An " + @itemname$ + " Creation Guide??";
- if(@price == 100000) mes "That will be 100,000 Zeny";
- if(@price == 240000) mes "That will be 240,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;
- getitem @itemid,1;
- set zeny,zeny-@price;
- L_Bye:
- mes "Thank you for buying!";
- mes "Come again.";
- close;
-
- sL_NoZeny:
- mes "You dont 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: ==================================================
+//= Darkchild (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Selling Alchemist Shit :)
+//===== Additional Comments: =================================
+//= Working.
+//============================================================
+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 > 10000)) goto M_Bye;
+ set @price,@num * 8;
+ mes "[Gever AI Sharp]";
+ if(zeny < @price) goto sL_NoZeny;
+ if (checkweight(@item,@num) == 0) goto sL_OverW;
+ set zeny,Zeny-@price;
+ getitem 7134,@num;
+ 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, "Alchohol 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, "Concentration 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$,"Concentration Potion";
+ goto L_Choice;
+ L_Choice:
+ mes "[Gever AI Sharp]";
+ mes "An " + @itemname$ + " Creation Guide??";
+ if(@price == 100000) mes "That will be 100,000 Zeny";
+ if(@price == 240000) mes "That will be 240,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;
+ getitem @itemid,1;
+ set zeny,zeny-@price;
+ L_Bye:
+ mes "Thank you for buying!";
+ mes "Come again.";
+ close;
+
+ sL_NoZeny:
+ mes "You dont 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/clothes_dyer.txt b/npc/merchants/clothes_dyer.txt
index 374435892..f0cc8bff8 100644
--- a/npc/merchants/clothes_dyer.txt
+++ b/npc/merchants/clothes_dyer.txt
@@ -1,325 +1,325 @@
-//===== eAthena Script =======================================
-//= Clothes Dyer
-//===== By: ==================================================
-//= Usnul
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= eAthena 1.0+
-//===== Description: =========================================
-//= Clothes dyer with standard palletes
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-// 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 ot finish before tonights 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_Dye, "-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 recieved... 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]";
- if(Class==0) goto sL_Novice;
- 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:
- //1 Class
- if(Class==5 || Class==1) goto L_Wiz_Hunt_Bard_SN_M;
- if(Class==2) goto L_Mage_M;
- if(Class==3) goto L_Archer_M;
- if(Class==4) goto L_Aco_M;
- if(Class==6) goto L_Thief_M;
-
- //2 Class
- if(Class==7 || Class==14) goto L_Knight_Crus_M;
- if(Class==8 || Class==15) goto L_Priest_Monk_M;
- if(Class==9 || Class==11 || Class==19 || Class==23) goto L_Wiz_Hunt_Bard_SN_M;
- if(Class==10 || Class==18) goto L_BlackSmith_Alchemist_M;
- if(Class==12) goto L_Assassin_M;
- if(Class==17) goto L_Rogue_M;
-
- //1 Class
- L_Mage_M:
- set @red, 1;
- set @violet, 2;
- set @orange, 3;
- set @white, 4;
- menu "- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Orange",L_Dye_Orange,"- White",L_Dye_White,"- Cancel",L_End;
- L_Archer_M:
- set @red, 1;
- set @violet, 2;
- set @green, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Aco_M:
- set @blue, 1;
- set @red, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Thief_M:
- set @blue, 1;
- set @red, 2;
- set @green, 3;
- set @white, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Cancel",L_End;
-
- //2 Class
- L_Knight_Crus_M:
- set @orange, 1;
- set @violet, 2;
- set @red, 3;
- set @black, 4;
- menu "- Orange",L_Dye_Orange,"- Violet",L_Dye_Violet,"- Red",L_Dye_Red,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Priest_Monk_M:
- set @blue, 1;
- set @green, 2;
- set @red, 3;
- set @white, 4;
- menu "- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
- L_Wiz_Hunt_Bard_SN_M:
- set @red, 1;
- set @blue, 2;
- set @green, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_BlackSmith_Alchemist_M:
- set @red, 1;
- set @green, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Assassin_M:
- set @blue, 1;
- set @red, 2;
- set @green, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Rogue_M:
- set @red, 2;
- set @green, 3;
- menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Cancel",L_End;
-
-//=================================
-// Clothing Dyeing for Females
-//=================================
-Female_dye:
- //1 Class
- if(Class==1 || Class==4) goto L_Sword_Aco_F;
- if(Class==2) goto L_Knight_Crus_F;
- if(Class==3) goto L_Priest_F;
- if(Class==5) goto L_Merch_F;
- //2 Class
- if(Class==7 || Class==14) goto L_Knight_Crus_F;
- if(Class==8) goto L_Priest_F;
- if(Class==9 || Class==16) goto L_Wiz_Sage_F;
- if(Class==10 || Class==18) goto L_BlackSmith_Alchemist_F;
- if(Class==11 || Class==20) goto L_Hunt_Dancer_F;
- if(Class==12 || Class==17) goto L_Assassin_Rogue_F;
- if(Class==23) goto L_SN_F;
-
- //1 Class
- L_Sword_Aco_F:
- set @blue, 1;
- set @red, 2;
- set @green, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Merch_F:
- set @violet, 1;
- set @blue, 2;
- set @green, 3;
- set @black, 4;
- menu "- Violet",L_Dye_Violet,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Thief_F:
- set @blue, 1;
- set @red, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-
- //2 Class
- L_Knight_Crus_F:
- set @red, 1;
- set @blue, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Priest_F:
- set @red, 1;
- set @green, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Wiz_Sage_F:
- set @red, 1;
- set @blue, 2;
- set @white, 3;
- set @green, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Green",L_Dye_Green,"- Cancel",L_End;
- L_Hunt_Dancer_F:
- set @red, 1;
- set @blue, 2;
- set @green, 3;
- set @violet, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Cancel",L_End;
- L_BlackSmith_Alchemist_F:
- set @red, 1;
- set @green, 2;
- set @violet, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_Assassin_Rogue_F:
- set @red, 1;
- set @yellow, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
- L_SN_F:
- set @blue, 1;
- set @red, 2;
- set @white, 3;
- set @black, 4;
- menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
-
-L_Dye_Orange:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(980) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes Orange.";
- setlook 7,@orange;
- delitem 980,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Violet:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(981) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes Violet.";
- setlook 7,@violet;
- delitem 981,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Red:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(975) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes red.";
- setlook 7,@red;
- delitem 975,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Black:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(983) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes black.";
- setlook 7,@black;
- delitem 983,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Green:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(979) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes green.";
- setlook 7,@green;
- delitem 979,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Blue:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(978) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes blue.";
- setlook 7,@blue;
- delitem 978,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_White:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(982) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes white.";
- setlook 7,@white;
- delitem 982,1;
- set Zeny, Zeny - 10000;
- close;
-L_Dye_Yellow:
- mes "[Dyer Ginedin Rephere]";
- if(countitem(976) < 1) goto sL_NoDye;
- if(Zeny < 10000) goto sL_Zeny;
- mes "Ok. I will dye you clothes yellow.";
- setlook 7,@yellow;
- delitem 976,1;
- set Zeny, Zeny - 10000;
- 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_NoDye:
- mes "For me to dye your clothes, I'll need the appropriate Dyestuff. Please check my price list for the information.";
- next;
- goto L_PriceList;
-
- sL_Zeny:
- mes "I'm sorry but you don't have enough money.";
- close;
-
- sL_Novice:
- mes "I'm sorry, but first you need to get a job.";
- close;
-
-
- L_PriceList:
- mes "[Dyer Ginedin Rephere]";
- mes "Here is the list of colors you can choose from and their prices:";
- mes " - Red: 10000 zeny, 1 Scarlet Dyestuff";
- mes " - Yellow: 10000 zeny, 1 Lemon Dyestuff";
- mes " - Violet: 10000 zeny, 1 Violet Dyestuff";
- mes " - Orange: 10000 zeny, 1 Orange Dyestuff";
- mes " - Blue: 10000 zeny, 1 CobaltBlue Dyestuff";
- mes " - Green: 10000 zeny, 1 DarkGreen 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.0
+//===== Compatible With: =====================================
+//= eAthena 1.0+
+//===== Description: =========================================
+//= Clothes dyer with standard palletes
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+// 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 ot finish before tonights 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_Dye, "-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 recieved... 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]";
+ if(Class==0) goto sL_Novice;
+ 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:
+ //1 Class
+ if(Class==5 || Class==1) goto L_Wiz_Hunt_Bard_SN_M;
+ if(Class==2) goto L_Mage_M;
+ if(Class==3) goto L_Archer_M;
+ if(Class==4) goto L_Aco_M;
+ if(Class==6) goto L_Thief_M;
+
+ //2 Class
+ if(Class==7 || Class==14) goto L_Knight_Crus_M;
+ if(Class==8 || Class==15) goto L_Priest_Monk_M;
+ if(Class==9 || Class==11 || Class==19 || Class==23) goto L_Wiz_Hunt_Bard_SN_M;
+ if(Class==10 || Class==18) goto L_BlackSmith_Alchemist_M;
+ if(Class==12) goto L_Assassin_M;
+ if(Class==17) goto L_Rogue_M;
+
+ //1 Class
+ L_Mage_M:
+ set @red, 1;
+ set @violet, 2;
+ set @orange, 3;
+ set @white, 4;
+ menu "- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Orange",L_Dye_Orange,"- White",L_Dye_White,"- Cancel",L_End;
+ L_Archer_M:
+ set @red, 1;
+ set @violet, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Violet",L_Dye_Violet,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Aco_M:
+ set @blue, 1;
+ set @red, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Thief_M:
+ set @blue, 1;
+ set @red, 2;
+ set @green, 3;
+ set @white, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Cancel",L_End;
+
+ //2 Class
+ L_Knight_Crus_M:
+ set @orange, 1;
+ set @violet, 2;
+ set @red, 3;
+ set @black, 4;
+ menu "- Orange",L_Dye_Orange,"- Violet",L_Dye_Violet,"- Red",L_Dye_Red,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Priest_Monk_M:
+ set @blue, 1;
+ set @green, 2;
+ set @red, 3;
+ set @white, 4;
+ menu "- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Red",L_Dye_Red,"- White",L_Dye_White,"- Cancel",L_End;
+ L_Wiz_Hunt_Bard_SN_M:
+ set @red, 1;
+ set @blue, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_BlackSmith_Alchemist_M:
+ set @red, 1;
+ set @green, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Assassin_M:
+ set @blue, 1;
+ set @red, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Rogue_M:
+ set @red, 2;
+ set @green, 3;
+ menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Cancel",L_End;
+
+//=================================
+// Clothing Dyeing for Females
+//=================================
+Female_dye:
+ //1 Class
+ if(Class==1 || Class==4) goto L_Sword_Aco_F;
+ if(Class==2) goto L_Knight_Crus_F;
+ if(Class==3) goto L_Priest_F;
+ if(Class==5) goto L_Merch_F;
+ //2 Class
+ if(Class==7 || Class==14) goto L_Knight_Crus_F;
+ if(Class==8) goto L_Priest_F;
+ if(Class==9 || Class==16) goto L_Wiz_Sage_F;
+ if(Class==10 || Class==18) goto L_BlackSmith_Alchemist_F;
+ if(Class==11 || Class==20) goto L_Hunt_Dancer_F;
+ if(Class==12 || Class==17) goto L_Assassin_Rogue_F;
+ if(Class==23) goto L_SN_F;
+
+ //1 Class
+ L_Sword_Aco_F:
+ set @blue, 1;
+ set @red, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Merch_F:
+ set @violet, 1;
+ set @blue, 2;
+ set @green, 3;
+ set @black, 4;
+ menu "- Violet",L_Dye_Violet,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Thief_F:
+ set @blue, 1;
+ set @red, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+
+ //2 Class
+ L_Knight_Crus_F:
+ set @red, 1;
+ set @blue, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Priest_F:
+ set @red, 1;
+ set @green, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Wiz_Sage_F:
+ set @red, 1;
+ set @blue, 2;
+ set @white, 3;
+ set @green, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Green",L_Dye_Green,"- Cancel",L_End;
+ L_Hunt_Dancer_F:
+ set @red, 1;
+ set @blue, 2;
+ set @green, 3;
+ set @violet, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Cancel",L_End;
+ L_BlackSmith_Alchemist_F:
+ set @red, 1;
+ set @green, 2;
+ set @violet, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Green",L_Dye_Green,"- Violet",L_Dye_Violet,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_Assassin_Rogue_F:
+ set @red, 1;
+ set @yellow, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Yellow",L_Dye_Yellow,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+ L_SN_F:
+ set @blue, 1;
+ set @red, 2;
+ set @white, 3;
+ set @black, 4;
+ menu "- Red",L_Dye_Red,"- Blue",L_Dye_Blue,"- White",L_Dye_White,"- Black",L_Dye_Black,"- Cancel",L_End;
+
+L_Dye_Orange:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(980) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes Orange.";
+ setlook 7,@orange;
+ delitem 980,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Violet:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(981) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes Violet.";
+ setlook 7,@violet;
+ delitem 981,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Red:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(975) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes red.";
+ setlook 7,@red;
+ delitem 975,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Black:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(983) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes black.";
+ setlook 7,@black;
+ delitem 983,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Green:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(979) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes green.";
+ setlook 7,@green;
+ delitem 979,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Blue:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(978) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes blue.";
+ setlook 7,@blue;
+ delitem 978,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_White:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(982) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes white.";
+ setlook 7,@white;
+ delitem 982,1;
+ set Zeny, Zeny - 10000;
+ close;
+L_Dye_Yellow:
+ mes "[Dyer Ginedin Rephere]";
+ if(countitem(976) < 1) goto sL_NoDye;
+ if(Zeny < 10000) goto sL_Zeny;
+ mes "Ok. I will dye you clothes yellow.";
+ setlook 7,@yellow;
+ delitem 976,1;
+ set Zeny, Zeny - 10000;
+ 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_NoDye:
+ mes "For me to dye your clothes, I'll need the appropriate Dyestuff. Please check my price list for the information.";
+ next;
+ goto L_PriceList;
+
+ sL_Zeny:
+ mes "I'm sorry but you don't have enough money.";
+ close;
+
+ sL_Novice:
+ mes "I'm sorry, but first you need to get a job.";
+ close;
+
+
+ L_PriceList:
+ mes "[Dyer Ginedin Rephere]";
+ mes "Here is the list of colors you can choose from and their prices:";
+ mes " - Red: 10000 zeny, 1 Scarlet Dyestuff";
+ mes " - Yellow: 10000 zeny, 1 Lemon Dyestuff";
+ mes " - Violet: 10000 zeny, 1 Violet Dyestuff";
+ mes " - Orange: 10000 zeny, 1 Orange Dyestuff";
+ mes " - Blue: 10000 zeny, 1 CobaltBlue Dyestuff";
+ mes " - Green: 10000 zeny, 1 DarkGreen 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/custom/breeder.txt b/npc/merchants/custom/breeder.txt
index 76fe3a700..b5fc6f793 100644
--- a/npc/merchants/custom/breeder.txt
+++ b/npc/merchants/custom/breeder.txt
@@ -1,67 +1,67 @@
-//Peco Peco breeder for Knight by Darkchild v1.1
-//FIXED checkriding/cart/falcon funcs [Lupus]
-
-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(Class == 5 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 10 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 18 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4006 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4011 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4019 && 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 Merchants, Blacksmiths and Alchimists 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(Class == 11 && checkfalcon(0) == 0) goto L_falc;
- if(Class == 4012 && 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 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 (Class == 7 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 14 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 4008 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 4015 && 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 Knight and Crusader 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;
+//Peco Peco breeder for Knight by Darkchild v1.1
+//FIXED checkriding/cart/falcon funcs [Lupus]
+
+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(Class == 5 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 10 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 18 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4006 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4011 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4019 && 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 Merchants, Blacksmiths and Alchimists 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(Class == 11 && checkfalcon(0) == 0) goto L_falc;
+ if(Class == 4012 && 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 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 (Class == 7 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 14 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 4008 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 4015 && 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 Knight and Crusader 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;
} \ No newline at end of file
diff --git a/npc/merchants/custom/dye.txt b/npc/merchants/custom/dye.txt
index 0c5d19741..0b2738e9f 100644
--- a/npc/merchants/custom/dye.txt
+++ b/npc/merchants/custom/dye.txt
@@ -1,176 +1,176 @@
-//===== eAthena Script =======================================
-//= Stylist & Tailor Script (former Dye Script)
-//===== By: ==================================================
-//= eAthena Dev team
-//= Revised by Nekosume [pyRO v3.0]
-//===== Current Version: =====================================
-//= 4.0
-//===== Compatible With: =====================================
-//= Any eAthena Version
-//===== Description: =========================================
-//= Revised dye NPC, split into two NPCs, one for hair color
-//= and style, the other for clothes color.
-//===== Additional Comments: =================================
-//= 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,149,189,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 18^000000.";
- mes "Number 0, by the way, is the default style for your character.";
- next;
- input @sty;
- if (@sty>18) 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 == 18) menu "Back To The Begin",Lbrowsesty,"I like this one",Lstop;
- if(@look != 18) 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 & Tailor Script (former Dye Script)
+//===== By: ==================================================
+//= eAthena Dev team
+//= Revised by Nekosume [pyRO v3.0]
+//===== Current Version: =====================================
+//= 4.0
+//===== Compatible With: =====================================
+//= Any eAthena Version
+//===== Description: =========================================
+//= Revised dye NPC, split into two NPCs, one for hair color
+//= and style, the other for clothes color.
+//===== Additional Comments: =================================
+//= 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,149,189,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 18^000000.";
+ mes "Number 0, by the way, is the default style for your character.";
+ next;
+ input @sty;
+ if (@sty>18) 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 == 18) menu "Back To The Begin",Lbrowsesty,"I like this one",Lstop;
+ if(@look != 18) 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/merchants/dye_maker.txt b/npc/merchants/dye_maker.txt
index d8b1cb181..456499f2f 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.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-// 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 durring 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 disapointed 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 beautifull each time...";
- mes "Maybe he wanted to find his own perfet 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;
- mes "Missing text.";
- mes "Under development";
- delitem 507,30;
- delitem 973,1;
- delitem 713,1;
- set Zeny, Zeny - 3000;
- getitem 975,1;
- 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 977,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 977,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.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+// 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 durring 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 disapointed 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 beautifull each time...";
+ mes "Maybe he wanted to find his own perfet 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;
+ mes "Missing text.";
+ mes "Under development";
+ delitem 507,30;
+ delitem 973,1;
+ delitem 713,1;
+ set Zeny, Zeny - 3000;
+ getitem 975,1;
+ 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 977,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 977,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 35e662a85..bbeaf97d0 100644
--- a/npc/merchants/grandpa_pharmacist.txt
+++ b/npc/merchants/grandpa_pharmacist.txt
@@ -1,186 +1,186 @@
-//===== eAthena Script =======================================
-//= Grandpa Pharmacist
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= trade in items for potions
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Negative input bug fixed [Lupus]
-//============================================================
-
-
-
-
-alberta_in.gat,16,28,4 script Grampa Pharmacist 61,
-{
- set @count, 0;
-
- 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:
- if(countitem(713) < 1) goto ssL_NdBottle;
- 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:
- set @pot$, "red";
- set @pot, 501;
- set @item1, 507;
- set @zeny, 3;
- goto sL_Make;
- M_1:
- if(countitem(507)<1 || countitem(508)<1) goto ssL_NdHerbs;
- if(Zeny < 5) goto ssL_NdZeny;
- set @pot$, "orange";
- set @pot, 502;
- mes "[Grampa Pharmacist]";
- mes "How many?";
- next;
- menu "As many as possible.",sM_1a, "I will set the amount.",sM_1b, "Nah, forget about it",M_Menu;
-
- sM_1a:
- if(countitem(507)<1 || countitem(508)<1 || countitem(713)<1 || Zeny< 5) goto ssL_End;
- set @count, @count +1;
- delitem 507, 1;
- delitem 508, 1;
- delitem 713, 1;
- set Zeny, Zeny - 5;
- goto sM_1a;
-
- sM_1b:
- input @count;
- if(@count<1) goto ssL_NdNegative;
- if(countitem(507)<@count || countitem(508)<@count) goto ssL_NdHerbs;
- if(countitem(713) < @count) goto ssL_NdBottle;
- if(Zeny<(5*@count)) goto ssL_NdZeny;
- delitem 507, @count;
- delitem 508, @count;
- delitem 713, @count;
- set Zeny, Zeny - (@zeny*@count);
- goto ssL_End;
-
- M_2:
- set @pot$, "yellow";
- set @pot, 503;
- set @item1, 508;
- set @zeny, 10;
- goto sL_Make;
- M_3:
- set @pot$, "white";
- set @pot, 504;
- set @item1, 509;
- set @zeny, 20;
- goto sL_Make;
- M_4:
- set @pot$, "blue";
- set @pot, 505;
- set @item1, 510;
- set @zeny, 30;
- goto sL_Make;
- M_5:
- set @pot$, "green";
- set @pot, 506;
- set @item1, 511;
- set @zeny, 3;
-
- sL_Make:
- if(countitem(@item1) < 2) goto ssL_NdHerbs;
- if(Zeny < @zeny) goto ssL_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_Menu;
-
- sM_0a:
- if((countitem(@item1) < 2) || (countitem(713) < 1) || (Zeny < @zeny)) goto ssL_End;
- set @count, @count +1;
- delitem @item1, 2;
- delitem 713, 1;
- set Zeny, Zeny - @zeny;
- goto sM_0a;
-
- sM_0b:
- input @count;
- if(@count<1) goto ssL_NdNegative;
- if(countitem(@item1) < (2*@count)) goto ssL_NdHerbs;
- if(countitem(713) < @count) goto ssL_NdBottle;
- if(Zeny < (@zeny*@count)) goto ssL_NdZeny;
- delitem @item1, (2*@count);
- delitem 713, @count;
- set Zeny, Zeny - (@zeny*@count);
-
- ssL_End:
- mes "[Grampa Pharmacist]";
- mes "Here are your "+@pot$+" potions.";
- getitem @pot, @count;
- close;
-
- ssL_NdBottle:
- mes "[Grampa Pharmacist]";
- mes "You don't have enough empty tubes to put the medicine in you idiot!!";
- close;
-
- ssL_NdHerbs:
- mes "[Grampa Pharmacist]";
- mes "You rascal! What did you expect from me? You didn't even bring all of the right herbs!";
- mes "Get lost!";
- close;
-
- ssL_NdNegative:
- mes "[Grampa Pharmacist]";
- mes "You dirty cheater! What did you expect from me? Next time set positive amount of the potions!";
- mes "Get off!";
- close;
-
- ssL_NdZeny:
- mes "[Gramp Pharmacist]";
- mes "You don't have enough zeny for potions.";
- close;
-
- 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 must be getting old.....";
- next;
- mes "[Grampa Pharmacist]";
- mes "Anyways, a potion is merely an, 'easy to use', form of medicinal Herbs..... nothing more and nothing less.";
- close;
- M_Info:
- mes "[Grampa Pharmacist]";
- mes "~Sigh~... you young ones can be quite bothersome... Fine, I will explain to you how potions work....";
- next;
- mes "[Grampa Pharmacist]";
- mes "Though the bennefits from consuming the various Herbs found around Rune-Midgard are great......";
- mes "By refining them into potions, the 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 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;
-}
+//===== eAthena Script =======================================
+//= Grandpa Pharmacist
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= trade in items for potions
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Negative input bug fixed [Lupus]
+//============================================================
+
+
+
+
+alberta_in.gat,16,28,4 script Grampa Pharmacist 61,
+{
+ set @count, 0;
+
+ 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:
+ if(countitem(713) < 1) goto ssL_NdBottle;
+ 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:
+ set @pot$, "red";
+ set @pot, 501;
+ set @item1, 507;
+ set @zeny, 3;
+ goto sL_Make;
+ M_1:
+ if(countitem(507)<1 || countitem(508)<1) goto ssL_NdHerbs;
+ if(Zeny < 5) goto ssL_NdZeny;
+ set @pot$, "orange";
+ set @pot, 502;
+ mes "[Grampa Pharmacist]";
+ mes "How many?";
+ next;
+ menu "As many as possible.",sM_1a, "I will set the amount.",sM_1b, "Nah, forget about it",M_Menu;
+
+ sM_1a:
+ if(countitem(507)<1 || countitem(508)<1 || countitem(713)<1 || Zeny< 5) goto ssL_End;
+ set @count, @count +1;
+ delitem 507, 1;
+ delitem 508, 1;
+ delitem 713, 1;
+ set Zeny, Zeny - 5;
+ goto sM_1a;
+
+ sM_1b:
+ input @count;
+ if(@count<1) goto ssL_NdNegative;
+ if(countitem(507)<@count || countitem(508)<@count) goto ssL_NdHerbs;
+ if(countitem(713) < @count) goto ssL_NdBottle;
+ if(Zeny<(5*@count)) goto ssL_NdZeny;
+ delitem 507, @count;
+ delitem 508, @count;
+ delitem 713, @count;
+ set Zeny, Zeny - (@zeny*@count);
+ goto ssL_End;
+
+ M_2:
+ set @pot$, "yellow";
+ set @pot, 503;
+ set @item1, 508;
+ set @zeny, 10;
+ goto sL_Make;
+ M_3:
+ set @pot$, "white";
+ set @pot, 504;
+ set @item1, 509;
+ set @zeny, 20;
+ goto sL_Make;
+ M_4:
+ set @pot$, "blue";
+ set @pot, 505;
+ set @item1, 510;
+ set @zeny, 30;
+ goto sL_Make;
+ M_5:
+ set @pot$, "green";
+ set @pot, 506;
+ set @item1, 511;
+ set @zeny, 3;
+
+ sL_Make:
+ if(countitem(@item1) < 2) goto ssL_NdHerbs;
+ if(Zeny < @zeny) goto ssL_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_Menu;
+
+ sM_0a:
+ if((countitem(@item1) < 2) || (countitem(713) < 1) || (Zeny < @zeny)) goto ssL_End;
+ set @count, @count +1;
+ delitem @item1, 2;
+ delitem 713, 1;
+ set Zeny, Zeny - @zeny;
+ goto sM_0a;
+
+ sM_0b:
+ input @count;
+ if(@count<1) goto ssL_NdNegative;
+ if(countitem(@item1) < (2*@count)) goto ssL_NdHerbs;
+ if(countitem(713) < @count) goto ssL_NdBottle;
+ if(Zeny < (@zeny*@count)) goto ssL_NdZeny;
+ delitem @item1, (2*@count);
+ delitem 713, @count;
+ set Zeny, Zeny - (@zeny*@count);
+
+ ssL_End:
+ mes "[Grampa Pharmacist]";
+ mes "Here are your "+@pot$+" potions.";
+ getitem @pot, @count;
+ close;
+
+ ssL_NdBottle:
+ mes "[Grampa Pharmacist]";
+ mes "You don't have enough empty tubes to put the medicine in you idiot!!";
+ close;
+
+ ssL_NdHerbs:
+ mes "[Grampa Pharmacist]";
+ mes "You rascal! What did you expect from me? You didn't even bring all of the right herbs!";
+ mes "Get lost!";
+ close;
+
+ ssL_NdNegative:
+ mes "[Grampa Pharmacist]";
+ mes "You dirty cheater! What did you expect from me? Next time set positive amount of the potions!";
+ mes "Get off!";
+ close;
+
+ ssL_NdZeny:
+ mes "[Gramp Pharmacist]";
+ mes "You don't have enough zeny for potions.";
+ close;
+
+ 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 must be getting old.....";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "Anyways, a potion is merely an, 'easy to use', form of medicinal Herbs..... nothing more and nothing less.";
+ close;
+ M_Info:
+ mes "[Grampa Pharmacist]";
+ mes "~Sigh~... you young ones can be quite bothersome... Fine, I will explain to you how potions work....";
+ next;
+ mes "[Grampa Pharmacist]";
+ mes "Though the bennefits from consuming the various Herbs found around Rune-Midgard are great......";
+ mes "By refining them into potions, the 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 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;
+}
diff --git a/npc/merchants/hair_dyer.txt b/npc/merchants/hair_dyer.txt
index 61bda6f1b..02dfbae64 100644
--- a/npc/merchants/hair_dyer.txt
+++ b/npc/merchants/hair_dyer.txt
@@ -1,158 +1,158 @@
-//===== 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;
- mes "Ok. I will dye you hair red.";
- setlook 6,8;
- delitem 975,1;
- set Zeny, Zeny - 1000;
- 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;
+ mes "Ok. I will dye you hair red.";
+ setlook 6,8;
+ delitem 975,1;
+ set Zeny, Zeny - 1000;
+ 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/inn.txt b/npc/merchants/inn.txt
index dfc0e7c3c..63a9d6d08 100644
--- a/npc/merchants/inn.txt
+++ b/npc/merchants/inn.txt
@@ -1,172 +1,172 @@
-//===== eAthena Script =======================================
-//= Inn Npcs
-//===== By: ==================================================
-//= Darkchild (1.1)
-//===== Current Version: =====================================
-//= 1.1a
-//===== 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]
-//============================================================
-
-
-//======================== 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;
- addtimer 3900, "Sammy::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "prt_in.gat",237,102;
- sc_end SC_BLIND;
- end;
-}
-// East Side Inn ------------------
-prt_in.gat,61,141,2 script Inn Maid::Ahlma 53,{
-
- callfunc "F_InnMaid","[Ahlma]","East Inn","prt_in.gat",64,136;
- addtimer 3900, "Ahlma::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "prt_in.gat",49,173;
- sc_end SC_BLIND;
- end;
-}
-
-//======================== Alberta ====================================
-// North --------------------------
-alberta_in.gat,32,142,5 script Inn Maid::Moira 53,{
-
- callfunc "F_InnMaid","[Moira]","North Inn","alberta_in.gat",26,138;
- addtimer 3900, "Moira::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "alberta_in.gat",18,188;
- sc_end SC_BLIND;
- end;
-}
-// South -----------------------------
-alberta_in.gat,55,142,8 script Inn Maid::Tina 53,{
-
- callfunc "F_InnMaid","[Tina]","South Inn","alberta_in.gat",60,140;
- addtimer 3900, "Tina::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "alberta_in.gat",68,188;
- sc_end SC_BLIND;
- end;
-}
-
-//====================== Geffen ======================================
-geffen_in.gat,70,64,5 script Inn Maid::Betty 53,{
-
- callfunc "F_InnMaid","[Betty]","Inn","geffen_in.gat",74,60;
- addtimer 3900, "Betty::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "geffen_in.gat",106,106;
- sc_end SC_BLIND;
- end;
-}
-
-//======================= Payon ======================================
-payon_in01.gat,131,62,5 script Inn Maid::SunHee 53,{
-
- callfunc "F_InnMaid","[Sun Hee]","Inn","payon_in01.gat",132,56;
- addtimer 3900, "SunHee::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "payon_in01.gat",140,15;
- sc_end SC_BLIND;
- close;
-}
-
-//======================== 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;
- addtimer 3900, "Suzie::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "morocc_in.gat",174,144;
- sc_end SC_BLIND;
- end;
-}
-// South --------------------------------
-morocc_in.gat,80,100,5 script Inn Maid::Shala 53,{
-
- callfunc "F_InnMaid","[Shala]","South Inn","morocc_in.gat",78,95;
- addtimer 3900, "Shala::OnTimerWarp";
- close;
-
-OnTimerWarp:
- warp "morocc_in.gat",74,128;
- sc_end SC_BLIND;
- end;
-}
-
-//======================= Inn Function ==============================
-function script F_InnMaid {
- mes getarg(0);
- mes "Welcome to Nenkaras " + getarg(1) + ". What can I do for you?";
- next;
- menu "Save",Msave, "Rent a Room",Mrent, "Nothing",Mend;
-
- Msave:
- mes getarg(0);
- mes "Location Saved.";
- mes "I am waiting for another job to do.";
- savepoint getarg(2),getarg(3),getarg(4);
- close;
- Mrent:
- set @cost,50;
- if(BaseLevel > 15) set @cost,100;
- if(BaseLevel > 30) set @cost,200;
- if(BaseLevel > 50) set @cost,300;
- if(BaseLevel > 75) set @cost,400;
- mes getarg(0);
- mes "It will cost " + @cost + " zeny to rent a room for 1 night.";
- mes "In the morning your HP and SP will be fully recovered.";
- next;
- menu "Ok.",-,"No thanks.",Mend;
-
- mes getarg(0);
- mes "Thank you and enjoy your stay here.";
- emotion 15;
- if(Zeny < @cost) goto NoZeny;
- set Zeny,Zeny - @cost;
- sc_start SC_BLIND,500000,1;
- percentheal 100,100;
- return;
-
- NoZeny:
- mes getarg(0);
- mes "I'm sorry but you don't have enough money.";
- close;
- Mend:
- mes getarg(0);
- mes "I am waiting for a job to do.";
- close;
-}
+//===== eAthena Script =======================================
+//= Inn Npcs
+//===== By: ==================================================
+//= Darkchild (1.1)
+//===== Current Version: =====================================
+//= 1.1a
+//===== 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]
+//============================================================
+
+
+//======================== 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;
+ addtimer 3900, "Sammy::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "prt_in.gat",237,102;
+ sc_end SC_BLIND;
+ end;
+}
+// East Side Inn ------------------
+prt_in.gat,61,141,2 script Inn Maid::Ahlma 53,{
+
+ callfunc "F_InnMaid","[Ahlma]","East Inn","prt_in.gat",64,136;
+ addtimer 3900, "Ahlma::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "prt_in.gat",49,173;
+ sc_end SC_BLIND;
+ end;
+}
+
+//======================== Alberta ====================================
+// North --------------------------
+alberta_in.gat,32,142,5 script Inn Maid::Moira 53,{
+
+ callfunc "F_InnMaid","[Moira]","North Inn","alberta_in.gat",26,138;
+ addtimer 3900, "Moira::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "alberta_in.gat",18,188;
+ sc_end SC_BLIND;
+ end;
+}
+// South -----------------------------
+alberta_in.gat,55,142,8 script Inn Maid::Tina 53,{
+
+ callfunc "F_InnMaid","[Tina]","South Inn","alberta_in.gat",60,140;
+ addtimer 3900, "Tina::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "alberta_in.gat",68,188;
+ sc_end SC_BLIND;
+ end;
+}
+
+//====================== Geffen ======================================
+geffen_in.gat,70,64,5 script Inn Maid::Betty 53,{
+
+ callfunc "F_InnMaid","[Betty]","Inn","geffen_in.gat",74,60;
+ addtimer 3900, "Betty::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "geffen_in.gat",106,106;
+ sc_end SC_BLIND;
+ end;
+}
+
+//======================= Payon ======================================
+payon_in01.gat,131,62,5 script Inn Maid::SunHee 53,{
+
+ callfunc "F_InnMaid","[Sun Hee]","Inn","payon_in01.gat",132,56;
+ addtimer 3900, "SunHee::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "payon_in01.gat",140,15;
+ sc_end SC_BLIND;
+ close;
+}
+
+//======================== 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;
+ addtimer 3900, "Suzie::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "morocc_in.gat",174,144;
+ sc_end SC_BLIND;
+ end;
+}
+// South --------------------------------
+morocc_in.gat,80,100,5 script Inn Maid::Shala 53,{
+
+ callfunc "F_InnMaid","[Shala]","South Inn","morocc_in.gat",78,95;
+ addtimer 3900, "Shala::OnTimerWarp";
+ close;
+
+OnTimerWarp:
+ warp "morocc_in.gat",74,128;
+ sc_end SC_BLIND;
+ end;
+}
+
+//======================= Inn Function ==============================
+function script F_InnMaid {
+ mes getarg(0);
+ mes "Welcome to Nenkaras " + getarg(1) + ". What can I do for you?";
+ next;
+ menu "Save",Msave, "Rent a Room",Mrent, "Nothing",Mend;
+
+ Msave:
+ mes getarg(0);
+ mes "Location Saved.";
+ mes "I am waiting for another job to do.";
+ savepoint getarg(2),getarg(3),getarg(4);
+ close;
+ Mrent:
+ set @cost,50;
+ if(BaseLevel > 15) set @cost,100;
+ if(BaseLevel > 30) set @cost,200;
+ if(BaseLevel > 50) set @cost,300;
+ if(BaseLevel > 75) set @cost,400;
+ mes getarg(0);
+ mes "It will cost " + @cost + " zeny to rent a room for 1 night.";
+ mes "In the morning your HP and SP will be fully recovered.";
+ next;
+ menu "Ok.",-,"No thanks.",Mend;
+
+ mes getarg(0);
+ mes "Thank you and enjoy your stay here.";
+ emotion 15;
+ if(Zeny < @cost) goto NoZeny;
+ set Zeny,Zeny - @cost;
+ sc_start SC_BLIND,500000,1;
+ percentheal 100,100;
+ return;
+
+ NoZeny:
+ mes getarg(0);
+ mes "I'm sorry but you don't have enough money.";
+ close;
+ Mend:
+ mes getarg(0);
+ mes "I am waiting for a job to do.";
+ close;
+}
diff --git a/npc/merchants/milk_trader.txt b/npc/merchants/milk_trader.txt
index 54863f8e5..b8d66c46d 100644
--- a/npc/merchants/milk_trader.txt
+++ b/npc/merchants/milk_trader.txt
@@ -1,64 +1,64 @@
-//===== eAthena Script =======================================
-//= Milk Trader
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-
-
-// 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 all empty bottles",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
-
- M_0:
- if(countitem(713) < 1) goto L_NoBottle;
- if(Zeny < 20) goto L_NoZeny;
-
- sL_GetMilk:
- if(countitem(713)<1 || Zeny<20) goto M_End;
- getitem 519,1;
- delitem 713,1;
- set Zeny, Zeny - 20;
- goto sL_GetMilk;
-
- M_1:
- set @INPUT,0;
- input @INPUT;
- if(@INPUT < 1 || @INPUT > 100) goto M_End;
- if(countitem(713) < @INPUT) goto L_NoBottle;
- if(Zeny < (@INPUT*20)) goto L_NoZeny;
- getitem 519, @INPUT;
- delitem 713, @INPUT;
- set Zeny, Zeny - (@INPUT*20);
- goto M_End;
-
- 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 money.";
- close;
-}
+//===== eAthena Script =======================================
+//= Milk Trader
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+
+
+// 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 all empty bottles",M_0, "-Let me set the amount.",M_1, "-Cancel",M_End;
+
+ M_0:
+ if(countitem(713) < 1) goto L_NoBottle;
+ if(Zeny < 20) goto L_NoZeny;
+
+ sL_GetMilk:
+ if(countitem(713)<1 || Zeny<20) goto M_End;
+ getitem 519,1;
+ delitem 713,1;
+ set Zeny, Zeny - 20;
+ goto sL_GetMilk;
+
+ M_1:
+ set @INPUT,0;
+ input @INPUT;
+ if(@INPUT < 1 || @INPUT > 100) goto M_End;
+ if(countitem(713) < @INPUT) goto L_NoBottle;
+ if(Zeny < (@INPUT*20)) goto L_NoZeny;
+ getitem 519, @INPUT;
+ delitem 713, @INPUT;
+ set Zeny, Zeny - (@INPUT*20);
+ goto M_End;
+
+ 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 money.";
+ close;
+}
diff --git a/npc/merchants/refine.txt b/npc/merchants/refine.txt
index cd69b55d9..bb2796357 100644
--- a/npc/merchants/refine.txt
+++ b/npc/merchants/refine.txt
@@ -1,880 +1,880 @@
-//===== eAthena Script =======================================
-//= Refining NPCs
-//===== By: ==================================================
-//= Syrus22 (1.1)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= Any Athena 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 expliot. Need to check sources
-//= to fully fix bug [Shinigami]
-//============================================================
-
-
-//=========================================================
-// Christopher: Geffen Blacksmith
-//=========================================================
-geffen_in.gat,110,172,2 script Christopher 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;
- mes "[Christopher Guillenrow]";
- mes "This is the cheapest one but it's very efficient.";
- set Zeny, Zeny - 30000;
- getitem 986,1;
- next;
- goto L_Thanks;
- sM_OriAnvil:
- if(Zeny < 120000) goto L_NoZeny;
- mes "[Christopher Guillenrow]";
- mes "Ah! Ye have a good eye for anvils. This here is the proper anvil for a Blacksmith.";
- set Zeny, Zeny - 120000;
- getitem 987,1;
- next;
- goto L_Thanks;
- sM_GolAnvil:
- if(Zeny < 300000) goto L_NoZeny;
- mes "[Christopher Guillenrow]";
- mes "This is the best anvil in my workshop! With this ye'll be the best Blasksmith in no time.";
- set Zeny, Zeny - 300000;
- 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;
- set Zeny, Zeny - (150 * @input);
- getitem 612, @input;
- goto L_Thanks;
- sM_IrHam:
- if(Zeny < 1000) goto L_NoZeny;
- set Zeny, Zeny - 1000;
- getitem 613,1;
- goto L_Thanks;
- sM_GldHam:
- if(Zeny < 3000) goto L_NoZeny;
- set Zeny, Zeny - 3000;
- getitem 614,1;
- goto L_Thanks;
- sM_OriHam:
- if(Zeny < 5000) goto L_NoZeny;
- 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_Thanks:
- mes "[Christopher Guillenrow]";
- mes "Thank you for shopping at my workshop. Feel free to come anytime whenever you need.";
- emotion 15;
- close;
-
-}
-
-
-
-//=====================================================================================
-//= Weapon/Armor Refiners
-//=====================================================================================
-prt_in.gat,63,60,4 script Hollengrhen 85,{
- set @name$,"Hollengrhen";
- callfunc "refinemain";
- break;
-}
-morocc_in.gat,73,38,4 script Aragham 99,{
- set @name$,"Aragham";
- callfunc "refinemain";
- break;
-}
-payon.gat,144,173,4 script Antonio 88,{
- set @name$,"Antonio";
- callfunc "refinemain";
- break;
-}
-alberta_in.gat,28,58,4 script Fredrik 85,{
- set @name$,"Fredrik";
- callfunc "refinemain";
- break;
-}
-yuno_in01.gat,164,26,6 script Disturb 88,{
- set @name$,"Disturb";
- callfunc "refinemain";
- break;
-}
-
-//============================================================
-//= 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 definately 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 equiped 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 equiped 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 allready at its maximum level and can no longer be refined.";
- close;
-
-//Refine Armor
-REFINE0:
- if(getequipweaponlv(@part) > 0) goto REFINE1;
- set @matname$,"Elunium";
- set @material,985;
- set @price,2000;
- set @safe,4;
- if(@features == 1) callfunc "refinefeatures";
- callfunc "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) callfunc "refinefeatures";
- callfunc "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) callfunc "refinefeatures";
- callfunc "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) callfunc "refinefeatures";
- callfunc "refinenormal";
-//Refine Level 4 Weapon
-REFINE4:
- set @matname$,"Oridecon";
- set @material,984;
- set @price,20000;
- set @safe,4;
- if(@features == 1) callfunc "refinefeatures";
- callfunc "refinenormal";
-}
-
-// Normal Refining Functions =========================
-function script refinenormal -1,{
- 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 gaurantee my work...";
- next;
- menu "Yes",L_Sub,"No",Lcancel1;
-
- L_Sub:
- if ((countitem(@material) < 1) || (Zeny < @price)) goto Lcancel2;
- delitem @material,1;
- set Zeny,Zeny-@price;
-
-Lrefine:
- 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 proccess ^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;
-
-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 awfull 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 ========================
-function script 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;
- delitem @material,@refinecnt;
- set Zeny,Zeny - @fullprice;
- callfunc "refinesafe";
- break;
-
-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 " + @price + " Zeny... Is that ok?";
- next;
- menu "Yes...",-,"No...",Lcancel;
- if(@refinecheck > @safe) goto Lwarn;
- if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
- delitem @material,@refinecnt;
- set Zeny,Zeny - @fullprice;
- callfunc "refinenumber";
- break;
-
- 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;
- delitem @material,@refinecnt;
- set Zeny,Zeny - @fullprice;
- callfunc "refinenumber";
- break;
-Lcancel:
- mes "[" + @name$ + "]";
- mes "If you say so... See you again soon I hope.";
- close;
-Lcancel1:
- mes "[" + @name$ + "]";
- mes "Good... I don't like to break people's equipment...";
- close;
-Lcancel2:
- mes "[" + @name$ + "]";
- mes "Sorry but you don't have everything I need...";
- close;
-Lcancel3:
- mes "[" + @name$ + "]";
- mes "I can't refine this item that many times.";
- close;
-}
-
-// Function: Safe Refine ---------------------
-function script refinesafe {
- mes "Clang, clang!!!";
- successrefitem @part;
- emotion 21;
- set @refinecnt,@refinecnt - 1;
- next;
- if(@refinecnt == 0) goto Lend;
- callfunc "refinesafe";
- break;
-
- Lend:
- mes "[" + @name$ + "]";
- mes "All finished... Come again soon.";
- close;
-}
-// Function: Refine
-function script refinenumber {
- mes "Clang, clang!!!";
- if (getequippercentrefinery(@part)<=rand(100)) goto Lfail;
- successrefitem @part;
- emotion 21;
- set @refinecnt,@refinecnt - 1;
- next;
- if(@refinecnt == 0) goto Lend;
- callfunc "refinenumber";
- break;
-
- Lend:
- mes "[" + @name$ + "]";
- mes "All finished... Come again soon.";
- close;
-
- Lfail:
- 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";
- break;
-}
-payon.gat,145,178,4 script Begnahd 88,{
- set @name$,"Begnahd";
- callfunc "phramain";
- break;
-}
-morocc_in.gat,65,37,4 script Sade 99,{
- set @name$,"Sade";
- callfunc "phramain";
- break;
-}
-alberta_in.gat,18,59,5 script Kahlamanlith 86,{
- set @name$,"Kahlamanlith";
- callfunc "phramain";
- break;
-}
-yuno_in01.gat,171,26,6 script Dillemat 88,{
- set @name$,"Dillemat";
- callfunc "phramain";
- break;
-}
-
-//============================================================
-//= 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,"Emveretarcon - 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(@item,@ammount) == 0) goto L_WEIGHT;
- getitem @itemid,@ammount;
- set Zeny,Zeny-@value*@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";
- break;
-}
-payon.gat,137,178,4 script Hakhim 88,{
- set @name$,"Hakhim";
- callfunc "orimain";
- break;
-}
-morocc_in.gat,72,32,4 script Abdul 99,{
- set @name$,"Abdul";
- callfunc "orimain";
- break;
-}
-alberta_in.gat,21,63,5 script Xenophon 84,{
- set @name$,"Xenophon";
- callfunc "orimain";
- break;
-}
-yuno_in01.gat,171,22,6 script Delayt 88,{
- set @name$,"Delayt";
- callfunc "orimain";
-break;
-}
-
-//============================================================
-//= 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 stonesmith 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 durring the refining process, that weapon will possess the same property as the stone.";
- next;
- mes "[" + @name$ + "]";
- mes "Of course, that person needs to be skillfull enough to work on it.";
- goto M_Menu;
-}
-
-
-
-//=====================================================================================
-//= Equipment Repairmen
-//=====================================================================================
-prt_in.gat,62,54,2 script Grendal 84,{
- set @name$,"Grendal";
- callfunc "repairmain";
- break;
-}
-
-//Temp Spot, Not Shure Where To place
-payon.gat,149,182,2 script Repairman 88,{
- set @name$,"Repairman";
- callfunc "repairmain";
- break;
-}
-
-morocc_in.gat,71,40,2 script Repairman 99,{
- set @name$,"Repairman";
- callfunc "repairmain";
- break;
-}
-
-//============================================================
-//= Equipment Repair Function
-//============================================================
-function script repairmain {
- 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.";
- set @broken1,getbrokenid(1);
- 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);
- next;
- if(@broken1==NULL) goto L_CANCEL_3;
- menu getitemname(@broken1),REPAIR1,getitemname(@broken2),REPAIR2,getitemname(@broken3),REPAIR3,
- getitemname(@broken4),REPAIR4,getitemname(@broken5),REPAIR5,getitemname(@broken6),REPAIR6,
- getitemname(@broken7),REPAIR7,getitemname(@broken8),REPAIR8,getitemname(@broken9),REPAIR9,
- getitemname(@broken10),REPAIR10;
- REPAIR1:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(1);
- goto L_CLOSE;
- REPAIR2:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(2);
- goto L_CLOSE;
- REPAIR3:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(3);
- goto L_CLOSE;
- REPAIR4:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(4);
- goto L_CLOSE;
- REPAIR5:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(5);
- goto L_CLOSE;
- REPAIR6:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(6);
- goto L_CLOSE;
- REPAIR7:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(7);
- goto L_CLOSE;
- REPAIR8:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(8);
- goto L_CLOSE;
- REPAIR9:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(9);
- goto L_CLOSE;
- REPAIR10:
- mes "[" + @name$ + "]";
- mes "You're gonna repair " + getitemname(@broken1) + ".";
- mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
- mes "Continue?";
- next;
- menu "Yes",-,"No",L_CANCEL_2;
- if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
- delitem 999,1;
- set Zeny,Zeny-10000;
- repair(10);
- goto L_CLOSE;
-
-L_CANCEL_1:
- mes "[" + @name$ + "]";
- mes "Is it all you got?";
- mes "Unfortunately, I have kids to feed...";
- goto L_CLOSE;
-L_CANCEL_2:
- mes "[" + @name$ + "]";
- mes "Ok, but don't expect to be using that...";
- goto L_CLOSE;
-L_CANCEL_3:
- mes "[" + @name$ + "]";
- mes "Looks like you don't need anything repaired today...";
- goto L_CLOSE;
-L_CLOSE:
- close;
-}
+//===== eAthena Script =======================================
+//= Refining NPCs
+//===== By: ==================================================
+//= Syrus22 (1.1)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= Any Athena 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 expliot. Need to check sources
+//= to fully fix bug [Shinigami]
+//============================================================
+
+
+//=========================================================
+// Christopher: Geffen Blacksmith
+//=========================================================
+geffen_in.gat,110,172,2 script Christopher 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;
+ mes "[Christopher Guillenrow]";
+ mes "This is the cheapest one but it's very efficient.";
+ set Zeny, Zeny - 30000;
+ getitem 986,1;
+ next;
+ goto L_Thanks;
+ sM_OriAnvil:
+ if(Zeny < 120000) goto L_NoZeny;
+ mes "[Christopher Guillenrow]";
+ mes "Ah! Ye have a good eye for anvils. This here is the proper anvil for a Blacksmith.";
+ set Zeny, Zeny - 120000;
+ getitem 987,1;
+ next;
+ goto L_Thanks;
+ sM_GolAnvil:
+ if(Zeny < 300000) goto L_NoZeny;
+ mes "[Christopher Guillenrow]";
+ mes "This is the best anvil in my workshop! With this ye'll be the best Blasksmith in no time.";
+ set Zeny, Zeny - 300000;
+ 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;
+ set Zeny, Zeny - (150 * @input);
+ getitem 612, @input;
+ goto L_Thanks;
+ sM_IrHam:
+ if(Zeny < 1000) goto L_NoZeny;
+ set Zeny, Zeny - 1000;
+ getitem 613,1;
+ goto L_Thanks;
+ sM_GldHam:
+ if(Zeny < 3000) goto L_NoZeny;
+ set Zeny, Zeny - 3000;
+ getitem 614,1;
+ goto L_Thanks;
+ sM_OriHam:
+ if(Zeny < 5000) goto L_NoZeny;
+ 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_Thanks:
+ mes "[Christopher Guillenrow]";
+ mes "Thank you for shopping at my workshop. Feel free to come anytime whenever you need.";
+ emotion 15;
+ close;
+
+}
+
+
+
+//=====================================================================================
+//= Weapon/Armor Refiners
+//=====================================================================================
+prt_in.gat,63,60,4 script Hollengrhen 85,{
+ set @name$,"Hollengrhen";
+ callfunc "refinemain";
+ break;
+}
+morocc_in.gat,73,38,4 script Aragham 99,{
+ set @name$,"Aragham";
+ callfunc "refinemain";
+ break;
+}
+payon.gat,144,173,4 script Antonio 88,{
+ set @name$,"Antonio";
+ callfunc "refinemain";
+ break;
+}
+alberta_in.gat,28,58,4 script Fredrik 85,{
+ set @name$,"Fredrik";
+ callfunc "refinemain";
+ break;
+}
+yuno_in01.gat,164,26,6 script Disturb 88,{
+ set @name$,"Disturb";
+ callfunc "refinemain";
+ break;
+}
+
+//============================================================
+//= 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 definately 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 equiped 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 equiped 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 allready at its maximum level and can no longer be refined.";
+ close;
+
+//Refine Armor
+REFINE0:
+ if(getequipweaponlv(@part) > 0) goto REFINE1;
+ set @matname$,"Elunium";
+ set @material,985;
+ set @price,2000;
+ set @safe,4;
+ if(@features == 1) callfunc "refinefeatures";
+ callfunc "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) callfunc "refinefeatures";
+ callfunc "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) callfunc "refinefeatures";
+ callfunc "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) callfunc "refinefeatures";
+ callfunc "refinenormal";
+//Refine Level 4 Weapon
+REFINE4:
+ set @matname$,"Oridecon";
+ set @material,984;
+ set @price,20000;
+ set @safe,4;
+ if(@features == 1) callfunc "refinefeatures";
+ callfunc "refinenormal";
+}
+
+// Normal Refining Functions =========================
+function script refinenormal -1,{
+ 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 gaurantee my work...";
+ next;
+ menu "Yes",L_Sub,"No",Lcancel1;
+
+ L_Sub:
+ if ((countitem(@material) < 1) || (Zeny < @price)) goto Lcancel2;
+ delitem @material,1;
+ set Zeny,Zeny-@price;
+
+Lrefine:
+ 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 proccess ^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;
+
+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 awfull 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 ========================
+function script 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;
+ delitem @material,@refinecnt;
+ set Zeny,Zeny - @fullprice;
+ callfunc "refinesafe";
+ break;
+
+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 " + @price + " Zeny... Is that ok?";
+ next;
+ menu "Yes...",-,"No...",Lcancel;
+ if(@refinecheck > @safe) goto Lwarn;
+ if((countitem(@material) < @refinecnt) || (Zeny < @fullprice)) goto Lcancel2;
+ delitem @material,@refinecnt;
+ set Zeny,Zeny - @fullprice;
+ callfunc "refinenumber";
+ break;
+
+ 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;
+ delitem @material,@refinecnt;
+ set Zeny,Zeny - @fullprice;
+ callfunc "refinenumber";
+ break;
+Lcancel:
+ mes "[" + @name$ + "]";
+ mes "If you say so... See you again soon I hope.";
+ close;
+Lcancel1:
+ mes "[" + @name$ + "]";
+ mes "Good... I don't like to break people's equipment...";
+ close;
+Lcancel2:
+ mes "[" + @name$ + "]";
+ mes "Sorry but you don't have everything I need...";
+ close;
+Lcancel3:
+ mes "[" + @name$ + "]";
+ mes "I can't refine this item that many times.";
+ close;
+}
+
+// Function: Safe Refine ---------------------
+function script refinesafe {
+ mes "Clang, clang!!!";
+ successrefitem @part;
+ emotion 21;
+ set @refinecnt,@refinecnt - 1;
+ next;
+ if(@refinecnt == 0) goto Lend;
+ callfunc "refinesafe";
+ break;
+
+ Lend:
+ mes "[" + @name$ + "]";
+ mes "All finished... Come again soon.";
+ close;
+}
+// Function: Refine
+function script refinenumber {
+ mes "Clang, clang!!!";
+ if (getequippercentrefinery(@part)<=rand(100)) goto Lfail;
+ successrefitem @part;
+ emotion 21;
+ set @refinecnt,@refinecnt - 1;
+ next;
+ if(@refinecnt == 0) goto Lend;
+ callfunc "refinenumber";
+ break;
+
+ Lend:
+ mes "[" + @name$ + "]";
+ mes "All finished... Come again soon.";
+ close;
+
+ Lfail:
+ 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";
+ break;
+}
+payon.gat,145,178,4 script Begnahd 88,{
+ set @name$,"Begnahd";
+ callfunc "phramain";
+ break;
+}
+morocc_in.gat,65,37,4 script Sade 99,{
+ set @name$,"Sade";
+ callfunc "phramain";
+ break;
+}
+alberta_in.gat,18,59,5 script Kahlamanlith 86,{
+ set @name$,"Kahlamanlith";
+ callfunc "phramain";
+ break;
+}
+yuno_in01.gat,171,26,6 script Dillemat 88,{
+ set @name$,"Dillemat";
+ callfunc "phramain";
+ break;
+}
+
+//============================================================
+//= 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,"Emveretarcon - 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(@item,@ammount) == 0) goto L_WEIGHT;
+ getitem @itemid,@ammount;
+ set Zeny,Zeny-@value*@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";
+ break;
+}
+payon.gat,137,178,4 script Hakhim 88,{
+ set @name$,"Hakhim";
+ callfunc "orimain";
+ break;
+}
+morocc_in.gat,72,32,4 script Abdul 99,{
+ set @name$,"Abdul";
+ callfunc "orimain";
+ break;
+}
+alberta_in.gat,21,63,5 script Xenophon 84,{
+ set @name$,"Xenophon";
+ callfunc "orimain";
+ break;
+}
+yuno_in01.gat,171,22,6 script Delayt 88,{
+ set @name$,"Delayt";
+ callfunc "orimain";
+break;
+}
+
+//============================================================
+//= 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 stonesmith 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 durring the refining process, that weapon will possess the same property as the stone.";
+ next;
+ mes "[" + @name$ + "]";
+ mes "Of course, that person needs to be skillfull enough to work on it.";
+ goto M_Menu;
+}
+
+
+
+//=====================================================================================
+//= Equipment Repairmen
+//=====================================================================================
+prt_in.gat,62,54,2 script Grendal 84,{
+ set @name$,"Grendal";
+ callfunc "repairmain";
+ break;
+}
+
+//Temp Spot, Not Shure Where To place
+payon.gat,149,182,2 script Repairman 88,{
+ set @name$,"Repairman";
+ callfunc "repairmain";
+ break;
+}
+
+morocc_in.gat,71,40,2 script Repairman 99,{
+ set @name$,"Repairman";
+ callfunc "repairmain";
+ break;
+}
+
+//============================================================
+//= Equipment Repair Function
+//============================================================
+function script repairmain {
+ 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.";
+ set @broken1,getbrokenid(1);
+ 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);
+ next;
+ if(@broken1==NULL) goto L_CANCEL_3;
+ menu getitemname(@broken1),REPAIR1,getitemname(@broken2),REPAIR2,getitemname(@broken3),REPAIR3,
+ getitemname(@broken4),REPAIR4,getitemname(@broken5),REPAIR5,getitemname(@broken6),REPAIR6,
+ getitemname(@broken7),REPAIR7,getitemname(@broken8),REPAIR8,getitemname(@broken9),REPAIR9,
+ getitemname(@broken10),REPAIR10;
+ REPAIR1:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(1);
+ goto L_CLOSE;
+ REPAIR2:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(2);
+ goto L_CLOSE;
+ REPAIR3:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(3);
+ goto L_CLOSE;
+ REPAIR4:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(4);
+ goto L_CLOSE;
+ REPAIR5:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(5);
+ goto L_CLOSE;
+ REPAIR6:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(6);
+ goto L_CLOSE;
+ REPAIR7:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(7);
+ goto L_CLOSE;
+ REPAIR8:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(8);
+ goto L_CLOSE;
+ REPAIR9:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(9);
+ goto L_CLOSE;
+ REPAIR10:
+ mes "[" + @name$ + "]";
+ mes "You're gonna repair " + getitemname(@broken1) + ".";
+ mes "To repair this, I need ^ff9999One Steel^000000, and 10,000 Zeny.";
+ mes "Continue?";
+ next;
+ menu "Yes",-,"No",L_CANCEL_2;
+ if (countitem(999) < 1 || Zeny < 10000) goto L_CANCEL_1;
+ delitem 999,1;
+ set Zeny,Zeny-10000;
+ repair(10);
+ goto L_CLOSE;
+
+L_CANCEL_1:
+ mes "[" + @name$ + "]";
+ mes "Is it all you got?";
+ mes "Unfortunately, I have kids to feed...";
+ goto L_CLOSE;
+L_CANCEL_2:
+ mes "[" + @name$ + "]";
+ mes "Ok, but don't expect to be using that...";
+ goto L_CLOSE;
+L_CANCEL_3:
+ mes "[" + @name$ + "]";
+ mes "Looks like you don't need anything repaired today...";
+ goto L_CLOSE;
+L_CLOSE:
+ close;
+}
diff --git a/npc/merchants/renters.txt b/npc/merchants/renters.txt
index 81f7985f3..7d025919d 100644
--- a/npc/merchants/renters.txt
+++ b/npc/merchants/renters.txt
@@ -1,155 +1,155 @@
-//===== eAthena Script =======================================
-//= Renters
-//===== By: ==================================================
-//= kobra_k88, mod by Lupus
-//===== Current Version: =====================================
-//= 1.3
-//===== 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 for Lord_Knight(2),Paladin(2) and Sniper.
-//============================================================
-
-// PecoPeco Breeder (for Knights)-------------------------------------------
-prontera.gat,61,338,3 script PecoPeco Breeder 86,{
- mes "[PecoPeco Breeder]";
- if((Class == 7)||(Class == 4008)) goto L_Start;
- mes "I'm a PecoPeco breeder and I rent out PecoPeco's for^4444FF Knights ^000000to ride on.";
- close;
-
-L_Start:
- mes "Good day. Would you like to ride a PecoPeco?";
- next;
- mes "[PecoPeco Breeder]";
- mes "You can rent one PecoPeco for 2500 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 < 2500) goto sL_Zeny;
- if(checkriding(0) != 0) goto sL_GotPeco;
- set Zeny, Zeny - 2500;
- setriding;
- mes "Thank you and good day.";
- emotion 15;
- close;
-
- sL_NeedSkill:
- mes "[PecoPeco Breeder]";
- mes "As I mentioned earlier, you need the^3333FF Riding ^000000skill in order to rent a PecoPeco.";
- close;
- sL_Zeny:
- mes "[PecoPeco Breeder]";
- mes "As I said before it will be 2500z. Come back when you aquire 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,{
- mes "[Grand PecoPeco Breeder]";
- if((Class == 14)||(Class == 4015)) goto L_Start;
-
- mes "I'm a Grand PecoPeco breeder and I rent out Grand PecoPeco's for^4444FF Crusaders ^000000to ride on.";
- close;
-
-L_Start:
- mes "Good day. Would you like to ride a Grand PecoPeco?";
- next;
- mes "[Grand PecoPeco Breeder]";
- mes "You can rent one Grand PecoPeco for 2500 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 < 2500) goto sL_Zeny;
- if(checkriding(0) != 0) goto sL_GotPeco;
- set Zeny, Zeny - 2500;
- setriding;
- mes "Thank you and good day.";
- emotion 15;
- close;
-
- sL_NeedSkill:
- mes "[Grand PecoPeco Breeder]";
- mes "As I mentioned earlier, you need the^3333FF Riding ^000000skill in order to rent a Grand PecoPeco.";
- close;
- sL_Zeny:
- mes "[Grand PecoPeco Breeder]";
- mes "As I said before it will be 2500z. Come back when you aquire 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--------------------------------------------------------------
-in_hunter.gat,146,100,2 script Falcon Master 59,{
- 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]";
- mes "I can train a Falcon for you, but you need to be a Hunter and have mastered the ^5555FF'Falcon Taming' skill^000000.";
- next;
- menu "Ok",sM_0, "No thanks",M_End;
-
- sM_0:
- if(Class != Job_Hunter && Class != 4012 && Class != Job_Sniper) goto sL_NotHunter;
-
- if(checkfalcon(0) != 0) goto sL_GotFalc;
- if(getskilllv(127)==0) goto sL_NoSkill;
- 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 valuble 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 Taming skill. Please come back when you have learned it.";
- close;
- M_End:
- mes "[Falcon Master]";
- mes "Have a nice day.";
- close;
-}
-
-//Not Supposed To Be One In Payon!
-//Coordinate IS Correct For New Payon Map Though IF You Enable It
-//payon_in01.gat,206,175,4 duplicate(Falcon Master) Falcon Master 59
+//===== eAthena Script =======================================
+//= Renters
+//===== By: ==================================================
+//= kobra_k88, mod by Lupus
+//===== Current Version: =====================================
+//= 1.3
+//===== 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 for Lord_Knight(2),Paladin(2) and Sniper.
+//============================================================
+
+// PecoPeco Breeder (for Knights)-------------------------------------------
+prontera.gat,61,338,3 script PecoPeco Breeder 86,{
+ mes "[PecoPeco Breeder]";
+ if((Class == 7)||(Class == 4008)) goto L_Start;
+ mes "I'm a PecoPeco breeder and I rent out PecoPeco's for^4444FF Knights ^000000to ride on.";
+ close;
+
+L_Start:
+ mes "Good day. Would you like to ride a PecoPeco?";
+ next;
+ mes "[PecoPeco Breeder]";
+ mes "You can rent one PecoPeco for 2500 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 < 2500) goto sL_Zeny;
+ if(checkriding(0) != 0) goto sL_GotPeco;
+ set Zeny, Zeny - 2500;
+ setriding;
+ mes "Thank you and good day.";
+ emotion 15;
+ close;
+
+ sL_NeedSkill:
+ mes "[PecoPeco Breeder]";
+ mes "As I mentioned earlier, you need the^3333FF Riding ^000000skill in order to rent a PecoPeco.";
+ close;
+ sL_Zeny:
+ mes "[PecoPeco Breeder]";
+ mes "As I said before it will be 2500z. Come back when you aquire 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,{
+ mes "[Grand PecoPeco Breeder]";
+ if((Class == 14)||(Class == 4015)) goto L_Start;
+
+ mes "I'm a Grand PecoPeco breeder and I rent out Grand PecoPeco's for^4444FF Crusaders ^000000to ride on.";
+ close;
+
+L_Start:
+ mes "Good day. Would you like to ride a Grand PecoPeco?";
+ next;
+ mes "[Grand PecoPeco Breeder]";
+ mes "You can rent one Grand PecoPeco for 2500 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 < 2500) goto sL_Zeny;
+ if(checkriding(0) != 0) goto sL_GotPeco;
+ set Zeny, Zeny - 2500;
+ setriding;
+ mes "Thank you and good day.";
+ emotion 15;
+ close;
+
+ sL_NeedSkill:
+ mes "[Grand PecoPeco Breeder]";
+ mes "As I mentioned earlier, you need the^3333FF Riding ^000000skill in order to rent a Grand PecoPeco.";
+ close;
+ sL_Zeny:
+ mes "[Grand PecoPeco Breeder]";
+ mes "As I said before it will be 2500z. Come back when you aquire 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--------------------------------------------------------------
+in_hunter.gat,146,100,2 script Falcon Master 59,{
+ 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]";
+ mes "I can train a Falcon for you, but you need to be a Hunter and have mastered the ^5555FF'Falcon Taming' skill^000000.";
+ next;
+ menu "Ok",sM_0, "No thanks",M_End;
+
+ sM_0:
+ if(Class != Job_Hunter && Class != 4012 && Class != Job_Sniper) goto sL_NotHunter;
+
+ if(checkfalcon(0) != 0) goto sL_GotFalc;
+ if(getskilllv(127)==0) goto sL_NoSkill;
+ 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 valuble 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 Taming skill. Please come back when you have learned it.";
+ close;
+ M_End:
+ mes "[Falcon Master]";
+ mes "Have a nice day.";
+ close;
+}
+
+//Not Supposed To Be One In Payon!
+//Coordinate IS Correct For New Payon Map Though IF You Enable It
+//payon_in01.gat,206,175,4 duplicate(Falcon Master) Falcon Master 59
diff --git a/npc/merchants/shops.txt b/npc/merchants/shops.txt
index a8c43c398..795bf4678 100644
--- a/npc/merchants/shops.txt
+++ b/npc/merchants/shops.txt
@@ -1,208 +1,208 @@
-//===== eAthena Script =======================================
-//= Shops
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= 1.6
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= 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)
-//= Raised selling price of Empty Bottles to 10 (it's a quest item...)
-//============================================================
-
-
-
-//=======================================================
-//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,657:-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,657:-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,657:-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
-//alberta_in.gat,18,59,5 shop Miner 48,1010:-1,1011:-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
-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
-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,657:-1
-
-//=======================================================
-//AMATSU
-//=======================================================
-//Fruit merchant opens a zeny exploit (due to Juice Maker NPC)
-amatsu.gat,176,126,4 shop Fruit Merchant 53,512:-1,513:-1,515:-1,516:-1,531:-1,532:-1,534:-1,533:-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,2215:-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,713:10,519:-1
-//1st set
-//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
-//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
-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:-11154:-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
-
-//=======================================================
-//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,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,5
-
-//=======================================================
-//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
-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,657:-1
-geffen_in.gat,77,173,1 shop Magical Tool Trade 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
-
-//=======================================================
-//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
-
-//=======================================================
-//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
-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,657:-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 770,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2503:-1
-lou_in02.gat,130,182,5 shop Weapon Dealer 774,1204:-1,1216:-1,1107:-1,1113:-1,1116:-1,1157:-1,1407:-1,1410:-1,1354:-1,1519:-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
-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,657:-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,657:-1
-morocc.gat,157,72,6 shop Butcher 49,517:-1
-morocc.gat,166,51,1 shop Jewel Seller 102,721:-1,722:-1,726:-1,728:-1,729:-1
-morocc.gat,170,101,3 shop Tool Dealer 85,909:-1,528:-1,919:-1,925:-1
-morocc.gat,206,250,1 shop Tool Dealer 85,909:-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_in.gat,65,37,4 shop Miner 48,1010:-1,1011:-1
-
-//=======================================================
-//NIFLHEIM
-//=======================================================
-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,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,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,657:-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
-
-//=======================================================
-//PAYON
-//=======================================================
-payon_in01.gat,7,119,4 shop Weapon Dealer 86,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
-payon_in01.gat,15,119,4 shop Armor Dealer 87,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
-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,657:-1
-payon.gat,160,97,4 shop Tool Dealer 88,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,525:-1,602:-1,1065:-1,645:-1,656:-1,657:-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
-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
-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,657:-1
-prt_in.gat,211,169,1 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-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,657:-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
-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
-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
-
-//=======================================================
-//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,657:-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
-
-
-//=======================================================
-//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,505:-1,506:-1,645:-1,656:-1,601:-1,602:-1
-yuno.gat,226,106,5 shop Trader 97, 909:-1, 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 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,505:-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
-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
-
-
-//=======================================================
-// ST. CAPITOLINA ABBEY
-//======================================
-//= Monk shop, sells Knuckle weapons)
-//=======================================================
-prt_monk.gat,135,263,3 shop Blacksmith 726, 1801:8000//Waghnak, 1803:25000//Knuckle Dusters, 1805:32000//Studded Knuckles
-
+//===== eAthena Script =======================================
+//= Shops
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= 1.6
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= 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)
+//= Raised selling price of Empty Bottles to 10 (it's a quest item...)
+//============================================================
+
+
+
+//=======================================================
+//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,657:-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,657:-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,657:-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
+//alberta_in.gat,18,59,5 shop Miner 48,1010:-1,1011:-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
+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
+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,657:-1
+
+//=======================================================
+//AMATSU
+//=======================================================
+//Fruit merchant opens a zeny exploit (due to Juice Maker NPC)
+amatsu.gat,176,126,4 shop Fruit Merchant 53,512:-1,513:-1,515:-1,516:-1,531:-1,532:-1,534:-1,533:-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,2215:-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,713:10,519:-1
+//1st set
+//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
+//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
+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:-11154:-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
+
+//=======================================================
+//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,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,5
+
+//=======================================================
+//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
+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,657:-1
+geffen_in.gat,77,173,1 shop Magical Tool Trade 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
+
+//=======================================================
+//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
+
+//=======================================================
+//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
+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,657:-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 770,2211:-1,2401:-1,2403:-1,2501:-1,2503:-1,2101:-1,2103:-1,2503:-1
+lou_in02.gat,130,182,5 shop Weapon Dealer 774,1204:-1,1216:-1,1107:-1,1113:-1,1116:-1,1157:-1,1407:-1,1410:-1,1354:-1,1519:-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
+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,657:-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,657:-1
+morocc.gat,157,72,6 shop Butcher 49,517:-1
+morocc.gat,166,51,1 shop Jewel Seller 102,721:-1,722:-1,726:-1,728:-1,729:-1
+morocc.gat,170,101,3 shop Tool Dealer 85,909:-1,528:-1,919:-1,925:-1
+morocc.gat,206,250,1 shop Tool Dealer 85,909:-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_in.gat,65,37,4 shop Miner 48,1010:-1,1011:-1
+
+//=======================================================
+//NIFLHEIM
+//=======================================================
+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,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,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,657:-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
+
+//=======================================================
+//PAYON
+//=======================================================
+payon_in01.gat,7,119,4 shop Weapon Dealer 86,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
+payon_in01.gat,15,119,4 shop Armor Dealer 87,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
+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,657:-1
+payon.gat,160,97,4 shop Tool Dealer 88,1750:-1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,601:-1,525:-1,602:-1,1065:-1,645:-1,656:-1,657:-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
+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
+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,657:-1
+prt_in.gat,211,169,1 shop Wedding Goods Merchant 71,744:-1,745:-1,2338:-1,2206:-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,657:-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
+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
+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
+
+//=======================================================
+//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,657:-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
+
+
+//=======================================================
+//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,505:-1,506:-1,645:-1,656:-1,601:-1,602:-1
+yuno.gat,226,106,5 shop Trader 97, 909:-1, 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 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,505:-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
+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
+
+
+//=======================================================
+// ST. CAPITOLINA ABBEY
+//======================================
+//= Monk shop, sells Knuckle weapons)
+//=======================================================
+prt_monk.gat,135,263,3 shop Blacksmith 726, 1801:8000//Waghnak, 1803:25000//Knuckle Dusters, 1805:32000//Studded Knuckles
+
diff --git a/npc/mobs/dungeons/amatdun.txt b/npc/mobs/dungeons/amatdun.txt
index 75b5c131d..66ea6f308 100644
--- a/npc/mobs/dungeons/amatdun.txt
+++ b/npc/mobs/dungeons/amatdun.txt
@@ -1,33 +1,33 @@
-//===== eAthena Script =======================================
-//= Amatsu Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(ama_dun03.gat)*
-ama_dun03.gat,0,0,0,0 monster Shinobi 1401,55,0,0,0
-ama_dun03.gat,0,0,0,0 monster Tengu 1405,55,0,0,0
-ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,0,0,0
-ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
-ama_dun03.gat,0,0,0,0 monster Antique Firelock 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 Incantation Samurai 1492,1,5400000,5400000,0
-
-//(ama_dun02.gat)*
-ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,0,0,0
-ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,0,0,0
-ama_dun02.gat,0,0,0,0 monster Antique Firelock 1403,20,0,0,0
-ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,0,0,0
-ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
-ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,0,0,0
-
-//(ama_dun01.gat)*
-ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,0,0,0
-ama_dun01.gat,0,0,0,0 monster Antique Firelock 1403,45,0,0,0
-ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
+//===== eAthena Script =======================================
+//= Amatsu Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(ama_dun03.gat)*
+ama_dun03.gat,0,0,0,0 monster Shinobi 1401,55,0,0,0
+ama_dun03.gat,0,0,0,0 monster Tengu 1405,55,0,0,0
+ama_dun03.gat,0,0,0,0 monster The Paper 1375,20,0,0,0
+ama_dun03.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
+ama_dun03.gat,0,0,0,0 monster Antique Firelock 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 Incantation Samurai 1492,1,5400000,5400000,0
+
+//(ama_dun02.gat)*
+ama_dun02.gat,0,0,0,0 monster Shinobi 1401,2,0,0,0
+ama_dun02.gat,0,0,0,0 monster The Paper 1375,1,0,0,0
+ama_dun02.gat,0,0,0,0 monster Antique Firelock 1403,20,0,0,0
+ama_dun02.gat,0,0,0,0 monster Poison Toad 1402,35,0,0,0
+ama_dun02.gat,0,0,0,0 monster Horong 1129,10,0,0,0
+ama_dun02.gat,0,0,0,0 monster Miyabi Doll 1404,5,0,0,0
+
+//(ama_dun01.gat)*
+ama_dun01.gat,0,0,0,0 monster Shinobi 1401,2,0,0,0
+ama_dun01.gat,0,0,0,0 monster Antique Firelock 1403,45,0,0,0
+ama_dun01.gat,0,0,0,0 monster Miyabi Doll 1404,65,0,0,0
diff --git a/npc/mobs/dungeons/anthell.txt b/npc/mobs/dungeons/anthell.txt
index c3ac3cd71..fe13e2f26 100644
--- a/npc/mobs/dungeons/anthell.txt
+++ b/npc/mobs/dungeons/anthell.txt
@@ -1,117 +1,117 @@
-//===== eAthena Script =======================================
-//= Ant Hell Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(anthell01.gat)*
-anthell01.gat,0,0,0,0 monster Giearth 1121,1,60000,30000,0
-anthell01.gat,0,0,0,0 monster Vitata 1176,10,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 Andre 1095,25,0,0,0
-anthell01.gat,0,0,0,0 monster Familiar 1005,20,0,0,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,102,121,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,104,120,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,123,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,105,124,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,28,263,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,265,0,0 monster Ant Egg 1097,1,60000,30000,0
-anthell01.gat,28,266,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,29,262,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,264,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,266,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,30,190,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,30,198,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,30,262,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,264,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,31,186,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,31,194,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,31,198,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,31,263,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,32,186,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,189,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,32,197,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,263,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,35,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,36,187,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,37,186,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,38,184,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,40,168,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,40,266,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,268,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,270,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,41,168,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,41,266,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,268,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,42,165,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,167,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,43,165,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,44,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,45,165,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,97,124,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,126,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,98,121,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,99,121,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,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,0
-
-//(anthell02.gat)*
-anthell02.gat,0,0,0,0 monster Giearth 1121,3,60000,30000,0
-anthell02.gat,0,0,0,0 monster Vitata 1176,30,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 Andre 1095,40,0,0,0
-anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(anthell01.gat)*
+anthell01.gat,0,0,0,0 monster Giearth 1121,1,60000,30000,0
+anthell01.gat,0,0,0,0 monster Vitata 1176,10,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 Andre 1095,25,0,0,0
+anthell01.gat,0,0,0,0 monster Familiar 1005,20,0,0,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,102,121,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,104,120,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,123,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,105,124,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,28,263,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,265,0,0 monster Ant Egg 1097,1,60000,30000,0
+anthell01.gat,28,266,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,29,262,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,264,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,266,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,30,190,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,30,198,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,30,262,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,264,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,31,186,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,31,194,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,31,198,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,31,263,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,32,186,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,189,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,32,197,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,263,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,35,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,36,187,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,37,186,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,38,184,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,40,168,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,40,266,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,268,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,270,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,41,168,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,41,266,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,268,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,42,165,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,167,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,43,165,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,44,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,45,165,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,97,124,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,126,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,98,121,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,99,121,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,0,0,0,0 monster Maya Purple 1289,1,7200000,3600000,0
+
+//(anthell02.gat)*
+anthell02.gat,0,0,0,0 monster Giearth 1121,3,60000,30000,0
+anthell02.gat,0,0,0,0 monster Vitata 1176,30,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 Andre 1095,40,0,0,0
+anthell02.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+anthell02.gat,0,0,0,0 monster Ant Egg 1097,15,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 7001b5dd7..50b78ff66 100644
--- a/npc/mobs/dungeons/ayodun.txt
+++ b/npc/mobs/dungeons/ayodun.txt
@@ -1,24 +1,24 @@
-//===== eAthena Script =======================================
-//= Ayothana Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-// Mob IDs are right, need to check the amount, spawntime, etc.
-//(ayothana dungeon 01)?
-ayo_dun01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Mime Monkey 1585,20,0,0,0
-ayo_dun01.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
-
-//(ayothana dungeon 02)?
-ayo_dun02.gat,0,0,0,0 monster Kraben 1587,30,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,20,0,0,0
-ayo_dun02.gat,0,0,0,0 monster Tao Gunka 1583,1,3600000,1800000,1
-
-
+//===== eAthena Script =======================================
+//= Ayothana Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+// Mob IDs are right, need to check the amount, spawntime, etc.
+//(ayothana dungeon 01)?
+ayo_dun01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Ghoul 1036,30,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Mime Monkey 1585,20,0,0,0
+ayo_dun01.gat,0,0,0,0 monster Kraben 1587,20,0,0,0
+
+//(ayothana dungeon 02)?
+ayo_dun02.gat,0,0,0,0 monster Kraben 1587,30,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Tamruan 1584,20,0,0,0
+ayo_dun02.gat,0,0,0,0 monster Tao Gunka 1583,1,3600000,1800000,1
+
+
diff --git a/npc/mobs/dungeons/beachdun.txt b/npc/mobs/dungeons/beachdun.txt
index 97e7cfa0f..50d479a1f 100644
--- a/npc/mobs/dungeons/beachdun.txt
+++ b/npc/mobs/dungeons/beachdun.txt
@@ -1,32 +1,32 @@
-//===== eAthena Script =======================================
-//= Beach Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(beach_dun.gat)*
-beach_dun.gat,0,0,0,0 monster Medusa 1148,20,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 Merman 1264,3,10000,20,0
-beach_dun.gat,0,0,0,0 monster Neraid 1255,15,0,0,0
-beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-//(beach_dun2.gat)*
-beach_dun2.gat,0,0,0,0 monster Stalactite Golem 1278,40,5000,0,0
-beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
-beach_dun2.gat,0,0,0,0 monster Neraid 1255,5,0,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.gat)*
-beach_dun3.gat,0,0,0,0 monster Penomena 1216,3,30000,0,0
-beach_dun3.gat,0,0,0,0 monster Neraid 1255,1,0,0,0
-beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,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
+//===== eAthena Script =======================================
+//= Beach Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(beach_dun.gat)*
+beach_dun.gat,0,0,0,0 monster Medusa 1148,20,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 Merman 1264,3,10000,20,0
+beach_dun.gat,0,0,0,0 monster Neraid 1255,15,0,0,0
+beach_dun.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+//(beach_dun2.gat)*
+beach_dun2.gat,0,0,0,0 monster Stalactite Golem 1278,40,5000,0,0
+beach_dun2.gat,0,0,0,0 monster Megalith 1274,30,0,0,0
+beach_dun2.gat,0,0,0,0 monster Neraid 1255,5,0,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.gat)*
+beach_dun3.gat,0,0,0,0 monster Penomena 1216,3,30000,0,0
+beach_dun3.gat,0,0,0,0 monster Neraid 1255,1,0,0,0
+beach_dun3.gat,0,0,0,0 monster Megalodon 1064,30,0,0,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
diff --git a/npc/mobs/dungeons/byalan.txt b/npc/mobs/dungeons/byalan.txt
index a3e753bbe..af9da09de 100644
--- a/npc/mobs/dungeons/byalan.txt
+++ b/npc/mobs/dungeons/byalan.txt
@@ -1,104 +1,104 @@
-//===== eAthena Script =======================================
-//= Byalan Island Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(iz_dun00.gat)*
-iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
-iz_dun00.gat,0,0,0,0 monster Vadon 1066,30,0,0,0
-iz_dun00.gat,0,0,0,0 monster Hydra 1068,30,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 Plankton 1161,65,0,0,0
-iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,360000,180000,1
-
-//(iz_dun01.gat)*
-iz_dun01.gat,0,0,0,0 monster Cornutus 1067,30,300000,150000,1
-iz_dun01.gat,0,0,0,0 monster Marina 1141,40,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 Hydra 1068,30,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 Plankton 1161,10,0,0,0
-iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,360000,180000,1
-
-//(iz_dun02.gat)*
-iz_dun02.gat,0,0,0,0 monster Merman 1264,1,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 Cornutus 1067,60,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 Black Mushroom 1084,15,360000,180000,1
-
-//(iz_dun03.gat)*
-iz_dun03.gat,0,0,0,0 monster Merman 1264,3,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 Marine Sphere 1142,20,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 Hydra 1068,10,0,0,0
-iz_dun03.gat,108,249,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,178,253,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,191,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,194,144,0,0 monster Hydra 1068,1,316000,150000,0
-iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,2960000,150000,0
-iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
-iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,203,50,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,56,0,0 monster Hydra 1068,1,323000,150000,0
-iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
-iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
-iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
-iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
-iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
-iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
-iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
-iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
-
-//(iz_dun04.gat)*
-iz_dun04.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,1
-iz_dun04.gat,0,0,0,0 monster Merman 1264,38,0,0,0
-iz_dun04.gat,103,231,10,10 monster Merman 1264,5,150000,0,0
-iz_dun04.gat,130,216,15,15 monster Merman 1264,5,160000,0,0
-iz_dun04.gat,160,231,10,10 monster Merman 1264,5,170000,0,0
-iz_dun04.gat,95,147,10,10 monster Merman 1264,5,150000,0,0
-iz_dun04.gat,0,0,0,0 monster Strouf 1065,3,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 Marine Sphere 1142,20,0,0,0
-iz_dun04.gat,111,35,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,41,0,0 monster Hydra 1068,1,300000,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,33,115,0,0 monster Hydra 1068,1,321000,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,38,129,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
-iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,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,69,243,0,0 monster Hydra 1068,1,321000,150000,0
-iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
-iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
-iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
-iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
-iz_dun04.gat,95,147,35,35 monster Deviace 1108,3,60000,30000,0
+//===== eAthena Script =======================================
+//= Byalan Island Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(iz_dun00.gat)*
+iz_dun00.gat,0,0,0,0 monster Marina 1141,45,0,0,0
+iz_dun00.gat,0,0,0,0 monster Vadon 1066,30,0,0,0
+iz_dun00.gat,0,0,0,0 monster Hydra 1068,30,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 Plankton 1161,65,0,0,0
+iz_dun00.gat,0,0,0,0 monster Black Mushroom 1084,5,360000,180000,1
+
+//(iz_dun01.gat)*
+iz_dun01.gat,0,0,0,0 monster Cornutus 1067,30,300000,150000,1
+iz_dun01.gat,0,0,0,0 monster Marina 1141,40,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 Hydra 1068,30,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 Plankton 1161,10,0,0,0
+iz_dun01.gat,0,0,0,0 monster Black Mushroom 1084,10,360000,180000,1
+
+//(iz_dun02.gat)*
+iz_dun02.gat,0,0,0,0 monster Merman 1264,1,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 Cornutus 1067,60,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 Black Mushroom 1084,15,360000,180000,1
+
+//(iz_dun03.gat)*
+iz_dun03.gat,0,0,0,0 monster Merman 1264,3,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 Marine Sphere 1142,20,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 Hydra 1068,10,0,0,0
+iz_dun03.gat,108,249,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,178,253,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,191,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,194,144,0,0 monster Hydra 1068,1,316000,150000,0
+iz_dun03.gat,196,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,197,144,0,0 monster Hydra 1068,1,2960000,150000,0
+iz_dun03.gat,199,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,200,144,0,0 monster Hydra 1068,1,282000,150000,0
+iz_dun03.gat,202,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,203,144,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,203,47,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,203,50,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,56,0,0 monster Hydra 1068,1,323000,150000,0
+iz_dun03.gat,203,59,0,0 monster Hydra 1068,1,312000,150000,0
+iz_dun03.gat,204,48,0,0 monster Hydra 1068,1,313000,150000,0
+iz_dun03.gat,204,51,0,0 monster Hydra 1068,1,309000,150000,0
+iz_dun03.gat,204,54,0,0 monster Hydra 1068,1,310000,150000,0
+iz_dun03.gat,204,57,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun03.gat,204,60,0,0 monster Hydra 1068,1,304000,150000,0
+iz_dun03.gat,205,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,206,144,0,0 monster Hydra 1068,1,305000,150000,0
+iz_dun03.gat,208,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,209,144,0,0 monster Hydra 1068,1,308000,150000,0
+iz_dun03.gat,211,143,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun03.gat,212,144,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun03.gat,80,163,0,0 monster Hydra 1068,1,300000,150000,0
+
+//(iz_dun04.gat)*
+iz_dun04.gat,0,0,0,0 monster Penomena 1216,10,300000,150000,1
+iz_dun04.gat,0,0,0,0 monster Merman 1264,38,0,0,0
+iz_dun04.gat,103,231,10,10 monster Merman 1264,5,150000,0,0
+iz_dun04.gat,130,216,15,15 monster Merman 1264,5,160000,0,0
+iz_dun04.gat,160,231,10,10 monster Merman 1264,5,170000,0,0
+iz_dun04.gat,95,147,10,10 monster Merman 1264,5,150000,0,0
+iz_dun04.gat,0,0,0,0 monster Strouf 1065,3,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 Marine Sphere 1142,20,0,0,0
+iz_dun04.gat,111,35,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,41,0,0 monster Hydra 1068,1,300000,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,33,115,0,0 monster Hydra 1068,1,321000,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,38,129,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,42,116,0,0 monster Hydra 1068,1,306000,150000,0
+iz_dun04.gat,42,129,0,0 monster Hydra 1068,1,312000,150000,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,69,243,0,0 monster Hydra 1068,1,321000,150000,0
+iz_dun04.gat,79,234,0,0 monster Hydra 1068,1,302000,150000,0
+iz_dun04.gat,79,246,0,0 monster Hydra 1068,1,300000,150000,0
+iz_dun04.gat,80,233,0,0 monster Hydra 1068,1,318000,150000,0
+iz_dun04.gat,80,246,0,0 monster Hydra 1068,1,294000,150000,0
+iz_dun04.gat,95,147,35,35 monster Deviace 1108,3,60000,30000,0
diff --git a/npc/mobs/dungeons/clocktower.txt b/npc/mobs/dungeons/clocktower.txt
index a907529a5..fed9f4970 100644
--- a/npc/mobs/dungeons/clocktower.txt
+++ b/npc/mobs/dungeons/clocktower.txt
@@ -1,122 +1,122 @@
-//===== eAthena Script =======================================
-//= Clock Tower Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(alde_dun01.gat)*
-alde_dun01.gat,0,0,0,0 monster Arclouse 1194,50,0,0,0
-alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
-
-//(alde_dun02.gat)*
-alde_dun02.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
-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_dun03.gat)*
-alde_dun03.gat,102,40,10,10 monster Penomena 1216,12,300000,150000,0
-alde_dun03.gat,120,157,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,126,53,20,20 monster Penomena 1216,12,300000,150000,0
-alde_dun03.gat,127,204,9,9 monster Penomena 1216,8,300000,150000,0
-alde_dun03.gat,130,220,40,40 monster Penomena 1216,20,300000,150000,0
-alde_dun03.gat,135,140,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,142,157,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,147,30,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,155,201,25,25 monster Penomena 1216,12,300000,150000,0
-alde_dun03.gat,160,181,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,163,56,10,10 monster Penomena 1216,8,300000,150000,0
-alde_dun03.gat,168,42,6,6 monster Penomena 1216,4,300000,150000,0
-alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,300000,150000,0
-alde_dun03.gat,184,61,30,30 monster Penomena 1216,14,300000,150000,0
-alde_dun03.gat,194,37,8,8 monster Penomena 1216,6,300000,150000,0
-alde_dun03.gat,0,0,0,0 monster Cramp 1209,55,0,0,0
-alde_dun03.gat,77,28,5,5 monster Cramp 1209,1,40000,20000,0
-alde_dun03.gat,0,0,0,0 monster Drainliar 1111,55,0,0,0
-
-//(alde_dun04.gat)*
-alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,0
-alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,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 Bathory 1102,50,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 Tyrfing 1204,1,7200000,3600000,0
-
-//(c_tower1.gat)*
-c_tower1.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
-c_tower1.gat,0,0,0,0 monster Rideword 1195,70,0,0,0
-c_tower1.gat,205,210,85,90 monster Bathory 1102,1,0,0,0
-c_tower1.gat,250,345,110,35 monster Punk 1199,17,0,0,0
-c_tower1.gat,250,60,140,50 monster Punk 1199,17,0,0,0
-c_tower1.gat,60,197,40,177 monster Punk 1199,36,0,0,0
-
-//(c_tower2.gat)*
-c_tower2.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
-c_tower2.gat,0,0,0,0 monster Clock 1269,25,0,0,0
-c_tower2.gat,100,233,0,0 monster Clock 1269,1,355000,150000,1
-c_tower2.gat,100,233,0,0 monster Clock 1269,1,420000,150000,1
-c_tower2.gat,100,242,0,0 monster Clock 1269,1,395000,150000,1
-c_tower2.gat,101,242,0,0 monster Clock 1269,1,325000,150000,1
-c_tower2.gat,102,233,0,0 monster Clock 1269,1,450000,150000,1
-c_tower2.gat,103,234,0,0 monster Clock 1269,1,445000,150000,1
-c_tower2.gat,103,240,0,0 monster Clock 1269,1,430000,150000,1
-c_tower2.gat,185,110,0,0 monster Clock 1269,1,320000,180000,1
-c_tower2.gat,185,154,0,0 monster Clock 1269,1,340000,180000,1
-c_tower2.gat,187,194,0,0 monster Clock 1269,1,360000,180000,1
-c_tower2.gat,95,237,0,0 monster Clock 1269,1,475000,150000,1
-c_tower2.gat,95,238,0,0 monster Clock 1269,1,480000,150000,1
-c_tower2.gat,95,241,0,0 monster Clock 1269,1,385000,150000,1
-c_tower2.gat,96,242,0,0 monster Clock 1269,1,490000,150000,1
-c_tower2.gat,99,242,0,0 monster Clock 1269,1,400000,150000,1
-c_tower2.gat,0,0,0,0 monster Rideword 1195,16,0,0,0
-c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
-c_tower2.gat,0,0,0,0 monster Punk 1199,40,0,0,0
-
-//(c_tower3.gat)*
-c_tower3.gat,0,0,0,0 monster Mimic 1191,15,0,0,0
-c_tower3.gat,0,0,0,0 monster Alarm 1193,70,0,0,0
-c_tower3.gat,0,0,0,0 monster Rideword 1195,11,0,0,0
-c_tower3.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
-
-//(c_tower4.gat)*
-c_tower4.gat,0,0,0,0 monster Owl Duke 1320,30,0,0,0
-c_tower4.gat,0,0,0,0 monster Tower Keeper 1270,1,3600000,0,0
-c_tower4.gat,0,0,0,0 monster Tower Keeper 1270,2,1800000,0,0
-c_tower4.gat,0,0,0,0 monster Clock 1269,35,0,0,0
-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,86,180,0,0 monster Rideword 1195,1,380000,150000,1
-c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
-c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
-c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
-c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
-c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
-c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
-c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
-c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
-c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
-c_tower4.gat,0,0,0,0 monster Alarm 1193,35,0,0,0
-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,128,194,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,170,34,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,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,31,139,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,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
-c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
-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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(alde_dun01.gat)*
+alde_dun01.gat,0,0,0,0 monster Arclouse 1194,50,0,0,0
+alde_dun01.gat,0,0,0,0 monster Drainliar 1111,40,0,0,0
+
+//(alde_dun02.gat)*
+alde_dun02.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
+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_dun03.gat)*
+alde_dun03.gat,102,40,10,10 monster Penomena 1216,12,300000,150000,0
+alde_dun03.gat,120,157,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,126,53,20,20 monster Penomena 1216,12,300000,150000,0
+alde_dun03.gat,127,204,9,9 monster Penomena 1216,8,300000,150000,0
+alde_dun03.gat,130,220,40,40 monster Penomena 1216,20,300000,150000,0
+alde_dun03.gat,135,140,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,142,157,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,147,30,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,155,201,25,25 monster Penomena 1216,12,300000,150000,0
+alde_dun03.gat,160,181,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,163,56,10,10 monster Penomena 1216,8,300000,150000,0
+alde_dun03.gat,168,42,6,6 monster Penomena 1216,4,300000,150000,0
+alde_dun03.gat,179,166,6,6 monster Penomena 1216,4,300000,150000,0
+alde_dun03.gat,184,61,30,30 monster Penomena 1216,14,300000,150000,0
+alde_dun03.gat,194,37,8,8 monster Penomena 1216,6,300000,150000,0
+alde_dun03.gat,0,0,0,0 monster Cramp 1209,55,0,0,0
+alde_dun03.gat,77,28,5,5 monster Cramp 1209,1,40000,20000,0
+alde_dun03.gat,0,0,0,0 monster Drainliar 1111,55,0,0,0
+
+//(alde_dun04.gat)*
+alde_dun04.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,0
+alde_dun04.gat,0,0,0,0 monster Executioner 1205,1,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 Bathory 1102,50,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 Tyrfing 1204,1,7200000,3600000,0
+
+//(c_tower1.gat)*
+c_tower1.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
+c_tower1.gat,0,0,0,0 monster Rideword 1195,70,0,0,0
+c_tower1.gat,205,210,85,90 monster Bathory 1102,1,0,0,0
+c_tower1.gat,250,345,110,35 monster Punk 1199,17,0,0,0
+c_tower1.gat,250,60,140,50 monster Punk 1199,17,0,0,0
+c_tower1.gat,60,197,40,177 monster Punk 1199,36,0,0,0
+
+//(c_tower2.gat)*
+c_tower2.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
+c_tower2.gat,0,0,0,0 monster Clock 1269,25,0,0,0
+c_tower2.gat,100,233,0,0 monster Clock 1269,1,355000,150000,1
+c_tower2.gat,100,233,0,0 monster Clock 1269,1,420000,150000,1
+c_tower2.gat,100,242,0,0 monster Clock 1269,1,395000,150000,1
+c_tower2.gat,101,242,0,0 monster Clock 1269,1,325000,150000,1
+c_tower2.gat,102,233,0,0 monster Clock 1269,1,450000,150000,1
+c_tower2.gat,103,234,0,0 monster Clock 1269,1,445000,150000,1
+c_tower2.gat,103,240,0,0 monster Clock 1269,1,430000,150000,1
+c_tower2.gat,185,110,0,0 monster Clock 1269,1,320000,180000,1
+c_tower2.gat,185,154,0,0 monster Clock 1269,1,340000,180000,1
+c_tower2.gat,187,194,0,0 monster Clock 1269,1,360000,180000,1
+c_tower2.gat,95,237,0,0 monster Clock 1269,1,475000,150000,1
+c_tower2.gat,95,238,0,0 monster Clock 1269,1,480000,150000,1
+c_tower2.gat,95,241,0,0 monster Clock 1269,1,385000,150000,1
+c_tower2.gat,96,242,0,0 monster Clock 1269,1,490000,150000,1
+c_tower2.gat,99,242,0,0 monster Clock 1269,1,400000,150000,1
+c_tower2.gat,0,0,0,0 monster Rideword 1195,16,0,0,0
+c_tower2.gat,0,0,0,0 monster Mimic 1191,3,0,0,0
+c_tower2.gat,0,0,0,0 monster Punk 1199,40,0,0,0
+
+//(c_tower3.gat)*
+c_tower3.gat,0,0,0,0 monster Mimic 1191,15,0,0,0
+c_tower3.gat,0,0,0,0 monster Alarm 1193,70,0,0,0
+c_tower3.gat,0,0,0,0 monster Rideword 1195,11,0,0,0
+c_tower3.gat,0,0,0,0 monster Tower Keeper 1270,1,0,0,0
+
+//(c_tower4.gat)*
+c_tower4.gat,0,0,0,0 monster Owl Duke 1320,30,0,0,0
+c_tower4.gat,0,0,0,0 monster Tower Keeper 1270,1,3600000,0,0
+c_tower4.gat,0,0,0,0 monster Tower Keeper 1270,2,1800000,0,0
+c_tower4.gat,0,0,0,0 monster Clock 1269,35,0,0,0
+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,86,180,0,0 monster Rideword 1195,1,380000,150000,1
+c_tower4.gat,87,180,0,0 monster Rideword 1195,1,400000,150000,1
+c_tower4.gat,91,180,0,0 monster Rideword 1195,1,330000,150000,1
+c_tower4.gat,92,180,0,0 monster Rideword 1195,1,280000,150000,1
+c_tower4.gat,93,180,0,0 monster Rideword 1195,1,260000,150000,1
+c_tower4.gat,94,180,0,0 monster Rideword 1195,1,320000,150000,1
+c_tower4.gat,95,180,0,0 monster Rideword 1195,1,410000,150000,1
+c_tower4.gat,96,180,0,0 monster Rideword 1195,1,350000,150000,1
+c_tower4.gat,97,180,0,0 monster Rideword 1195,1,240000,150000,1
+c_tower4.gat,98,180,0,0 monster Rideword 1195,1,300000,150000,1
+c_tower4.gat,0,0,0,0 monster Alarm 1193,35,0,0,0
+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,128,194,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,170,34,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,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,31,139,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,38,193,0,0 monster Mimic 1191,1,1800000,900000,1
+c_tower4.gat,0,0,0,0 monster Whisper 1179,5,0,0,0
+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 6ebc4a5f8..dfa43db02 100644
--- a/npc/mobs/dungeons/coalmine.txt
+++ b/npc/mobs/dungeons/coalmine.txt
@@ -1,29 +1,29 @@
-//===== eAthena Script =======================================
-//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(mjo_dun01.gat)*
-mjo_dun01.gat,0,0,0,0 monster Martin 1145,40,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 Familiar 1005,20,0,0,0
-
-//(mjo_dun02.gat)*
-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,25,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 Martin 1145,60,0,0,0
-
-//(mjo_dun03.gat)*
-mjo_dun03.gat,0,0,0,0 monster Cramp 1209,3,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 Skeleton Worker 1169,70,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 Martin 1145,10,0,0,0
+//===== eAthena Script =======================================
+//= Coal Mine(Dead pit) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(mjo_dun01.gat)*
+mjo_dun01.gat,0,0,0,0 monster Martin 1145,40,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 Familiar 1005,20,0,0,0
+
+//(mjo_dun02.gat)*
+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,25,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 Martin 1145,60,0,0,0
+
+//(mjo_dun03.gat)*
+mjo_dun03.gat,0,0,0,0 monster Cramp 1209,3,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 Skeleton Worker 1169,70,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 Martin 1145,10,0,0,0
diff --git a/npc/mobs/dungeons/geftower.txt b/npc/mobs/dungeons/geftower.txt
index 9c61d986d..310b3f672 100644
--- a/npc/mobs/dungeons/geftower.txt
+++ b/npc/mobs/dungeons/geftower.txt
@@ -1,68 +1,68 @@
-//===== eAthena Script =======================================
-//= Geffen Tower Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(gef_dun00.gat)*
-gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,20,0,0,0
-gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,25,0,0,0
-gef_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,600000,300000,1
-gef_dun00.gat,109,121,0,0 monster Shining Plant 1083,1,1800000,900000,1
-gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
-gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
-gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,1
-gef_dun00.gat,109,121,10,10 monster Red Plant 1078,6,300000,150000,1
-gef_dun00.gat,91,106,10,10 monster Red Plant 1078,6,300000,150000,1
-
-//(gef_dun01.gat)*
-gef_dun01.gat,0,0,0,0 monster Tyrfing 1204,1,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 Ghoul 1036,40,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,0,0,0,0 monster White Plant 1082,10,180000,90000,1
-gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,150000,0
-gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,0
-gef_dun01.gat,89,111,3,3 monster Black Mushroom 1084,5,180000,90000,1
-
-//(gef_dun02.gat)*
-gef_dun02.gat,0,0,0,0 monster Nightmare 1061,50,300000,100000,0
-gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,15,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,15,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 Whisper 1179,20,0,0,0
-gef_dun02.gat,0,0,0,0 monster White Plant 1082,12,0,0,1
-gef_dun02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
-gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
-
-//(gef_dun03.gat)?
-gef_dun03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
-gef_dun03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,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,3600000,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,3600000,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
+//===== eAthena Script =======================================
+//= Geffen Tower Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(gef_dun00.gat)*
+gef_dun00.gat,0,0,0,0 monster Hunter Fly 1035,20,0,0,0
+gef_dun00.gat,0,0,0,0 monster Poison Spore 1077,25,0,0,0
+gef_dun00.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_dun00.gat,92,108,0,0 monster Yellow Plant 1081,1,600000,300000,1
+gef_dun00.gat,109,121,0,0 monster Shining Plant 1083,1,1800000,900000,1
+gef_dun00.gat,121,109,3,3 monster Black Mushroom 1084,3,180000,90000,1
+gef_dun00.gat,89,111,3,3 monster Black Mushroom 1084,3,180000,90000,1
+gef_dun00.gat,114,106,0,0 monster Green Plant 1080,1,300000,150000,1
+gef_dun00.gat,109,121,10,10 monster Red Plant 1078,6,300000,150000,1
+gef_dun00.gat,91,106,10,10 monster Red Plant 1078,6,300000,150000,1
+
+//(gef_dun01.gat)*
+gef_dun01.gat,0,0,0,0 monster Tyrfing 1204,1,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 Ghoul 1036,40,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,0,0,0,0 monster White Plant 1082,10,180000,90000,1
+gef_dun01.gat,0,0,0,0 monster Jakk 1130,30,300000,150000,0
+gef_dun01.gat,234,121,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_dun01.gat,0,0,0,0 monster Dracula 1389,1,3600000,1800000,0
+gef_dun01.gat,89,111,3,3 monster Black Mushroom 1084,5,180000,90000,1
+
+//(gef_dun02.gat)*
+gef_dun02.gat,0,0,0,0 monster Nightmare 1061,50,300000,100000,0
+gef_dun02.gat,0,0,0,0 monster Deviruchi 1109,15,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,15,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 Whisper 1179,20,0,0,0
+gef_dun02.gat,0,0,0,0 monster White Plant 1082,12,0,0,1
+gef_dun02.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
+gef_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,1
+
+//(gef_dun03.gat)?
+gef_dun03.gat,0,0,0,0 monster Baphomet 1039,1,7200000,3600000,1
+gef_dun03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,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,3600000,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,3600000,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
diff --git a/npc/mobs/dungeons/glastheim.txt b/npc/mobs/dungeons/glastheim.txt
index 83f2f6308..fd22479ad 100644
--- a/npc/mobs/dungeons/glastheim.txt
+++ b/npc/mobs/dungeons/glastheim.txt
@@ -1,159 +1,159 @@
-//===== eAthena Script =======================================
-//= Glast Heim Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(glast_01.gat)*
-glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
-glast_01.gat,0,0,0,0 monster Knight of Abyss 1219,2,0,0,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,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
-
-//(gl_cas01.gat)*
-gl_cas01.gat,0,0,0,0 monster Alice 1275,1,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 Carat 1267,40,0,0,0
-gl_cas01.gat,0,0,0,0 monster Sageworm 1281,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 Owl Baron 1295,3,30000,15000,0
-gl_cas01.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
-
-//(gl_cas02.gat)?
-gl_cas02.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
-gl_cas02.gat,133,83,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,182,65,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
-gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,360000,180000,1
-gl_cas02.gat,0,0,0,0 monster Raydric 1163,45,0,0,0
-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,83,80,2,2 monster Mimic 1191,1,360000,180000,1
-gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
-gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
-gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
-gl_cas02.gat,0,0,0,0 monster Mysteltainn 1203,1,7200000,3600000,1
-gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
-gl_cas02.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,0
-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,360000,180000,0
-gl_cas02.gat,104,38,4,4 monster Knight of Abyss 1219,1,1800000,900000,1
-gl_cas02.gat,115,177,3,3 monster Knight of Abyss 1219,1,1800000,900000,1
-gl_cas02.gat,24,35,4,4 monster Knight of Abyss 1219,1,1800000,900000,1
-gl_cas02.gat,93,177,3,3 monster Knight of Abyss 1219,1,1800000,900000,1
-gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,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,360000,180000,0
-gl_cas02.gat,0,0,0,0 monster Chimera 1283,1,7200000,3600000,0
-
-//(gl_church.gat)?
-gl_church.gat,0,0,0,0 monster Ghoul 1036,25,0,0,0
-gl_church.gat,0,0,0,0 monster Evil Druid 1117,15,0,0,0
-gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
-gl_church.gat,0,0,0,0 monster Wraith 1192,10,0,0,0
-gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,0,0,0
-
-//(gl_chyard.gat)?
-gl_chyard.gat,0,0,0,0 monster Zombie 1015,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 Ghoul 1036,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 Mimic 1191,5,0,0,0
-gl_chyard.gat,0,0,0,0 monster Wraith 1192,15,0,0,0
-gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,0
-
-//(gl_dun01.gat)?
-gl_dun01.gat,0,0,0,0 monster Arclouse 1194,100,0,0,0
-gl_dun01.gat,0,0,0,0 monster Sting 1207,20,0,0,0
-
-//(gl_dun02.gat)?
-gl_dun02.gat,0,0,0,0 monster Minorous 1149,20,0,0,0
-gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
-gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
-
-//(gl_in01.gat)?
-gl_in01.gat,0,0,0,0 monster Marionette 1143,10,0,0,0
-gl_in01.gat,0,0,0,0 monster Rideword 1195,10,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 Dark Frame 1260,10,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 Sageworm 1281,20,0,0,0
-
-//(gl_knt01.gat)?
-gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,5,0,0,0
-gl_knt01.gat,0,0,0,0 monster Raydric 1163,60,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,26,223,20,20 monster Rideword 1195,10,120000,60000,1
-gl_knt01.gat,33,120,30,30 monster Rideword 1195,30,120000,60000,1
-gl_knt01.gat,0,0,0,0 monster Knight of Abyss 1219,20,60000,30000,1
-gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,1
-gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
-
-//(gl_knt02.gat)?
-gl_knt02.gat,0,0,0,0 monster Joker 1131,20,0,0,0
-gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,2,1800000,900000,1
-gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,2,1800000,900000,1
-gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,2,1800000,900000,1
-gl_knt02.gat,243,74,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,62,80,5,5 monster Khalitzburg 1132,2,1800000,900000,1
-gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
-gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,2,1800000,900000,1
-gl_knt02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
-gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,1
-gl_knt02.gat,149,26,5,5 monster Knight of Abyss 1219,10,60000,30000,1
-gl_knt02.gat,0,0,0,0 monster Blood Knight 1268,1,3600000,1800000,1
-gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,1
-gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
-
-//(gl_prison.gat)?
-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,20,0,0,0
-gl_prison.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
-gl_prison.gat,0,0,0,0 monster Injustice 1257,10,0,0,0
-
-//(gl_prison1.gat)?
-gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
-gl_prison1.gat,0,0,0,0 monster Zherlthsh 1200,1,3600000,0,0
-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
-gl_prison1.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
-gl_prison1.gat,0,0,0,0 monster Injustice 1257,50,0,0,0
-
-//(gl_sew01.gat)?
-gl_sew01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
-gl_sew01.gat,0,0,0,0 monster Arclouse 1194,10,0,0,0
-gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
-
-//(gl_sew02.gat)?
-gl_sew02.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
-gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
-
-//(gl_sew03.gat)?
-gl_sew03.gat,0,0,0,0 monster Sting 1207,50,0,0,0
-gl_sew03.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
-gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
-
-//(gl_sew04.gat)?
-gl_sew04.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-gl_sew04.gat,0,0,0,0 monster Anolian 1206,10,0,0,0
-gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
-
-//(gl_step.gat)?
-gl_step.gat,0,0,0,0 monster Mimic 1191,30,60000,30000,1
-gl_step.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
-gl_step.gat,0,0,0,0 monster Raydric Archer 1276,30,0,0,0
+//===== eAthena Script =======================================
+//= Glast Heim Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(glast_01.gat)*
+glast_01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
+glast_01.gat,0,0,0,0 monster Knight of Abyss 1219,2,0,0,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,233,209,15,15 monster Green Plant 1080,8,360000,180000,1
+
+//(gl_cas01.gat)*
+gl_cas01.gat,0,0,0,0 monster Alice 1275,1,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 Carat 1267,40,0,0,0
+gl_cas01.gat,0,0,0,0 monster Sageworm 1281,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 Owl Baron 1295,3,30000,15000,0
+gl_cas01.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,1
+
+//(gl_cas02.gat)?
+gl_cas02.gat,0,0,0,0 monster Evil Druid 1117,10,0,0,0
+gl_cas02.gat,133,83,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,182,65,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,189,20,1,1 monster Khalitzburg 1132,1,360000,180000,0
+gl_cas02.gat,45,177,3,3 monster Khalitzburg 1132,1,360000,180000,1
+gl_cas02.gat,0,0,0,0 monster Raydric 1163,45,0,0,0
+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,83,80,2,2 monster Mimic 1191,1,360000,180000,1
+gl_cas02.gat,83,84,2,2 monster Mimic 1191,1,360000,180000,1
+gl_cas02.gat,185,11,8,8 monster Rideword 1195,4,120000,60000,1
+gl_cas02.gat,46,124,15,15 monster Rideword 1195,15,360000,180000,1
+gl_cas02.gat,0,0,0,0 monster Mysteltainn 1203,1,7200000,3600000,1
+gl_cas02.gat,104,145,5,5 monster Mysteltainn 1203,1,7200000,3600000,1
+gl_cas02.gat,0,0,0,0 monster Tyrfing 1204,1,7200000,3600000,0
+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,360000,180000,0
+gl_cas02.gat,104,38,4,4 monster Knight of Abyss 1219,1,1800000,900000,1
+gl_cas02.gat,115,177,3,3 monster Knight of Abyss 1219,1,1800000,900000,1
+gl_cas02.gat,24,35,4,4 monster Knight of Abyss 1219,1,1800000,900000,1
+gl_cas02.gat,93,177,3,3 monster Knight of Abyss 1219,1,1800000,900000,1
+gl_cas02.gat,0,0,0,0 monster Alice 1275,1,0,0,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,360000,180000,0
+gl_cas02.gat,0,0,0,0 monster Chimera 1283,1,7200000,3600000,0
+
+//(gl_church.gat)?
+gl_church.gat,0,0,0,0 monster Ghoul 1036,25,0,0,0
+gl_church.gat,0,0,0,0 monster Evil Druid 1117,15,0,0,0
+gl_church.gat,0,0,0,0 monster Mimic 1191,10,0,0,0
+gl_church.gat,0,0,0,0 monster Wraith 1192,10,0,0,0
+gl_church.gat,0,0,0,0 monster Dark Illusion 1302,1,0,0,0
+
+//(gl_chyard.gat)?
+gl_chyard.gat,0,0,0,0 monster Zombie 1015,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 Ghoul 1036,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 Mimic 1191,5,0,0,0
+gl_chyard.gat,0,0,0,0 monster Wraith 1192,15,0,0,0
+gl_chyard.gat,0,0,0,0 monster Dark Lord 1272,1,3600000,1800000,0
+
+//(gl_dun01.gat)?
+gl_dun01.gat,0,0,0,0 monster Arclouse 1194,100,0,0,0
+gl_dun01.gat,0,0,0,0 monster Sting 1207,20,0,0,0
+
+//(gl_dun02.gat)?
+gl_dun02.gat,0,0,0,0 monster Minorous 1149,20,0,0,0
+gl_dun02.gat,0,0,0,0 monster Gargoyle 1253,20,0,0,0
+gl_dun02.gat,0,0,0,0 monster Majoruros 1310,40,0,0,0
+
+//(gl_in01.gat)?
+gl_in01.gat,0,0,0,0 monster Marionette 1143,10,0,0,0
+gl_in01.gat,0,0,0,0 monster Rideword 1195,10,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 Dark Frame 1260,10,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 Sageworm 1281,20,0,0,0
+
+//(gl_knt01.gat)?
+gl_knt01.gat,0,0,0,0 monster Khalitzburg 1132,5,0,0,0
+gl_knt01.gat,0,0,0,0 monster Raydric 1163,60,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,26,223,20,20 monster Rideword 1195,10,120000,60000,1
+gl_knt01.gat,33,120,30,30 monster Rideword 1195,30,120000,60000,1
+gl_knt01.gat,0,0,0,0 monster Knight of Abyss 1219,20,60000,30000,1
+gl_knt01.gat,0,0,0,0 monster Alice 1275,1,0,0,1
+gl_knt01.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
+
+//(gl_knt02.gat)?
+gl_knt02.gat,0,0,0,0 monster Joker 1131,20,0,0,0
+gl_knt02.gat,114,194,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,118,241,5,5 monster Khalitzburg 1132,2,1800000,900000,1
+gl_knt02.gat,196,239,5,5 monster Khalitzburg 1132,2,1800000,900000,1
+gl_knt02.gat,208,45,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,232,132,5,5 monster Khalitzburg 1132,2,1800000,900000,1
+gl_knt02.gat,243,74,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,62,80,5,5 monster Khalitzburg 1132,2,1800000,900000,1
+gl_knt02.gat,82,134,5,5 monster Khalitzburg 1132,1,1800000,900000,1
+gl_knt02.gat,99,49,5,5 monster Khalitzburg 1132,2,1800000,900000,1
+gl_knt02.gat,0,0,0,0 monster Raydric 1163,50,0,0,0
+gl_knt02.gat,0,0,0,0 monster Mysteltainn 1203,1,0,0,1
+gl_knt02.gat,149,26,5,5 monster Knight of Abyss 1219,10,60000,30000,1
+gl_knt02.gat,0,0,0,0 monster Blood Knight 1268,1,3600000,1800000,1
+gl_knt02.gat,0,0,0,0 monster Alice 1275,1,0,0,1
+gl_knt02.gat,0,0,0,0 monster Raydric Archer 1276,25,0,0,0
+
+//(gl_prison.gat)?
+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,20,0,0,0
+gl_prison.gat,0,0,0,0 monster Rybio 1201,10,0,0,0
+gl_prison.gat,0,0,0,0 monster Injustice 1257,10,0,0,0
+
+//(gl_prison1.gat)?
+gl_prison1.gat,0,0,0,0 monster Hunter Fly 1035,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Skeleton Prisoner 1196,10,0,0,0
+gl_prison1.gat,0,0,0,0 monster Zherlthsh 1200,1,3600000,0,0
+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
+gl_prison1.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
+gl_prison1.gat,0,0,0,0 monster Injustice 1257,50,0,0,0
+
+//(gl_sew01.gat)?
+gl_sew01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
+gl_sew01.gat,0,0,0,0 monster Arclouse 1194,10,0,0,0
+gl_sew01.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
+
+//(gl_sew02.gat)?
+gl_sew02.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
+gl_sew02.gat,0,0,0,0 monster Gargoyle 1253,30,0,0,0
+
+//(gl_sew03.gat)?
+gl_sew03.gat,0,0,0,0 monster Sting 1207,50,0,0,0
+gl_sew03.gat,0,0,0,0 monster Cramp 1209,30,0,0,0
+gl_sew03.gat,0,0,0,0 monster Gargoyle 1253,15,0,0,0
+
+//(gl_sew04.gat)?
+gl_sew04.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+gl_sew04.gat,0,0,0,0 monster Anolian 1206,10,0,0,0
+gl_sew04.gat,0,0,0,0 monster Gargoyle 1253,10,0,0,0
+
+//(gl_step.gat)?
+gl_step.gat,0,0,0,0 monster Mimic 1191,30,60000,30000,1
+gl_step.gat,0,0,0,0 monster Wind Ghost 1263,30,0,0,0
+gl_step.gat,0,0,0,0 monster Raydric Archer 1276,30,0,0,0
diff --git a/npc/mobs/dungeons/gondun.txt b/npc/mobs/dungeons/gondun.txt
index 12fbfbbc2..aed5bf360 100644
--- a/npc/mobs/dungeons/gondun.txt
+++ b/npc/mobs/dungeons/gondun.txt
@@ -1,39 +1,39 @@
-//===== eAthena Script =======================================
-//= Gonryun Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(gon_dun01.gat)*
-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,1
-gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,1
-gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,1
-gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,900000,900000,0
-
-//(gon_dun02.gat)*
-gon_dun02.gat,240,223,35,40 monster Baby Leopard 1415,5,15000,30000,0
-gon_dun02.gat,37,110,20,38 monster Baby Leopard 1415,7,15000,30000,0
-gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
-gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,25,0,0,0
-gon_dun02.gat,37,110,20,38 monster Enchanted Peach Tree 1410,5,10000,30000,0
-gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,9,0,0,0
-gon_dun02.gat,27,100,16,33 monster Enchanted Peach Tree 1410,2,15000,30000,0
-gon_dun02.gat,47,120,16,33 monster Enchanted Peach Tree 1410,2,15000,30000,0
-gon_dun02.gat,250,243,25,34 monster Enchanted Peach Tree 1410,7,15000,30000,0
-gon_dun02.gat,230,203,25,34 monster Enchanted Peach Tree 1410,5,15000,30000,0
-gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,4,600000,600000,1
-
-//(gon_dun03.gat)*
-gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
-gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,0,0,0
-gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,0,0,1
-gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,1
-gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,7200000,3600000,0
+//===== eAthena Script =======================================
+//= Gonryun Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(gon_dun01.gat)*
+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,1
+gon_dun01.gat,0,0,0,0 monster White Plant 1082,10,0,0,1
+gon_dun01.gat,0,0,0,0 monster Yellow Plant 1081,10,0,0,1
+gon_dun01.gat,0,0,0,0 monster Bloody Butterfly 1408,55,900000,900000,0
+
+//(gon_dun02.gat)*
+gon_dun02.gat,240,223,35,40 monster Baby Leopard 1415,5,15000,30000,0
+gon_dun02.gat,37,110,20,38 monster Baby Leopard 1415,7,15000,30000,0
+gon_dun02.gat,0,0,0,0 monster Bloody Butterfly 1408,20,0,0,0
+gon_dun02.gat,0,0,0,0 monster Taoist Hermit 1412,25,0,0,0
+gon_dun02.gat,37,110,20,38 monster Enchanted Peach Tree 1410,5,10000,30000,0
+gon_dun02.gat,0,0,0,0 monster Enchanted Peach Tree 1410,9,0,0,0
+gon_dun02.gat,27,100,16,33 monster Enchanted Peach Tree 1410,2,15000,30000,0
+gon_dun02.gat,47,120,16,33 monster Enchanted Peach Tree 1410,2,15000,30000,0
+gon_dun02.gat,250,243,25,34 monster Enchanted Peach Tree 1410,7,15000,30000,0
+gon_dun02.gat,230,203,25,34 monster Enchanted Peach Tree 1410,5,15000,30000,0
+gon_dun02.gat,0,0,0,0 monster Yellow Plant 1081,4,600000,600000,1
+
+//(gon_dun03.gat)*
+gon_dun03.gat,0,0,0,0 monster Taoist Hermit 1412,30,0,0,0
+gon_dun03.gat,0,0,0,0 monster Evil Nymph 1416,50,0,0,0
+gon_dun03.gat,0,0,0,0 monster Hermit Plant 1413,20,0,0,1
+gon_dun03.gat,0,0,0,0 monster White Plant 1082,10,0,0,1
+gon_dun03.gat,0,0,0,0 monster Evil Snake Lord 1418,1,7200000,3600000,0
diff --git a/npc/mobs/dungeons/guilddun.txt b/npc/mobs/dungeons/guilddun.txt
index b261b4349..67d8d664b 100644
--- a/npc/mobs/dungeons/guilddun.txt
+++ b/npc/mobs/dungeons/guilddun.txt
@@ -1,43 +1,43 @@
-//===== eAthena Script =======================================
-//= Guild Dungeons Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(gld_dun01.gat)*
-gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
-gld_dun01.gat,0,0,0,0 monster Am Mut 1301,10,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 Vagabond Wolf 1092,1,14400000,7200000,1
-gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,28800000,1
-
-//(gld_dun02.gat)*
-gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
-gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,8,0,0,0
-gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,8,0,0,0
-gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,8,0,0,0
-gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,8,0,0,0
-gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,28800000,1
-
-//(gld_dun03.gat)*
-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,28800001,28800000,1
-
-//(gld_dun04.gat)*
-gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
-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 Ghostring 1120,1,10800000,10800000,1
-gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,28800000,1
+//===== eAthena Script =======================================
+//= Guild Dungeons Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(gld_dun01.gat)*
+gld_dun01.gat,0,0,0,0 monster Skeleton General 1290,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Gajomart 1309,10,0,0,0
+gld_dun01.gat,0,0,0,0 monster Am Mut 1301,10,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 Vagabond Wolf 1092,1,14400000,7200000,1
+gld_dun01.gat,0,0,0,0 monster Eddga 1115,1,28800000,28800000,1
+
+//(gld_dun02.gat)*
+gld_dun02.gat,0,0,0,0 monster Owl Baron 1295,3,0,0,0
+gld_dun02.gat,0,0,0,0 monster Ancient Worm 1305,8,0,0,0
+gld_dun02.gat,0,0,0,0 monster Killer Mantis 1294,8,0,0,0
+gld_dun02.gat,0,0,0,0 monster Giant Hornet 1303,8,0,0,0
+gld_dun02.gat,0,0,0,0 monster Giant Spider 1304,8,0,0,0
+gld_dun02.gat,0,0,0,0 monster Doppelganger 1046,1,28800000,28800000,1
+
+//(gld_dun03.gat)*
+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,28800001,28800000,1
+
+//(gld_dun04.gat)*
+gld_dun04.gat,0,0,0,0 monster Dark Illusion 1302,1,1200000,0,0
+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 Ghostring 1120,1,10800000,10800000,1
+gld_dun04.gat,0,0,0,0 monster Dark Lord 1272,1,28800000,28800000,1
diff --git a/npc/mobs/dungeons/louydun.txt b/npc/mobs/dungeons/louydun.txt
index f19d27af4..54593bc32 100644
--- a/npc/mobs/dungeons/louydun.txt
+++ b/npc/mobs/dungeons/louydun.txt
@@ -1,33 +1,33 @@
-//===== eAthena Script =======================================
-//= Louyang Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//lou_dun01)?
-lou_dun01.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-lou_dun01.gat,0,0,0,0 monster Sidewinder 1037,25,0,0,0
-lou_dun01.gat,0,0,0,0 monster Horong 1129,25,0,0,0
-lou_dun01.gat,0,0,0,0 monster Bigfoot 1060,15,0,0,0
-lou_dun01.gat,0,0,0,0 monster Zipper Bear 1417,15,0,0,0
-
-//lou_dun02)?
-lou_dun02.gat,0,0,0,0 monster Bon Gun 1188,30,0,0,0
-lou_dun02.gat,0,0,0,0 monster Munak 1026,30,0,0,0
-lou_dun02.gat,0,0,0,0 monster Hyegun 1512,15,0,0,0
-lou_dun02.gat,0,0,0,0 monster Dancing Dragon 1514,25,0,0,0
-
-//lou_dun03)?
-lou_dun03.gat,0,0,0,0 monster Chung E 1519,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Li Me Mang Ryang 1517,25,0,0,0
-lou_dun03.gat,0,0,0,0 monster Increase Soil 1516,15,0,0,0
-lou_dun03.gat,0,0,0,0 monster Dancing Dragon 1514,20,0,0,0
-lou_dun03.gat,0,0,0,0 monster Bon Gun 1188,20,0,0,0
-lou_dun03.gat,0,0,0,0 monster Munak 1026,20,0,0,0
-lou_dun03.gat,0,0,0,0 monster Bacsojin 1518,1,3600000,7200000,0
+//===== eAthena Script =======================================
+//= Louyang Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//lou_dun01)?
+lou_dun01.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+lou_dun01.gat,0,0,0,0 monster Sidewinder 1037,25,0,0,0
+lou_dun01.gat,0,0,0,0 monster Horong 1129,25,0,0,0
+lou_dun01.gat,0,0,0,0 monster Bigfoot 1060,15,0,0,0
+lou_dun01.gat,0,0,0,0 monster Zipper Bear 1417,15,0,0,0
+
+//lou_dun02)?
+lou_dun02.gat,0,0,0,0 monster Bon Gun 1188,30,0,0,0
+lou_dun02.gat,0,0,0,0 monster Munak 1026,30,0,0,0
+lou_dun02.gat,0,0,0,0 monster Hyegun 1512,15,0,0,0
+lou_dun02.gat,0,0,0,0 monster Dancing Dragon 1514,25,0,0,0
+
+//lou_dun03)?
+lou_dun03.gat,0,0,0,0 monster Chung E 1519,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Li Me Mang Ryang 1517,25,0,0,0
+lou_dun03.gat,0,0,0,0 monster Increase Soil 1516,15,0,0,0
+lou_dun03.gat,0,0,0,0 monster Dancing Dragon 1514,20,0,0,0
+lou_dun03.gat,0,0,0,0 monster Bon Gun 1188,20,0,0,0
+lou_dun03.gat,0,0,0,0 monster Munak 1026,20,0,0,0
+lou_dun03.gat,0,0,0,0 monster Bacsojin 1518,1,3600000,7200000,0
diff --git a/npc/mobs/dungeons/magmadun.txt b/npc/mobs/dungeons/magmadun.txt
index 2129deb4a..96dabc16c 100644
--- a/npc/mobs/dungeons/magmadun.txt
+++ b/npc/mobs/dungeons/magmadun.txt
@@ -1,25 +1,25 @@
-//===== eAthena Script =======================================
-//= Magma Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 fixed 2,3,4 tabs instead of 1... and wrong mob names [Lupus]
-//============================================================
-
-//(mag_dun02.gat)*
-mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,30,0,0,0
-mag_dun02.gat,0,0,0,0 monster Diabolic 1382,10,0,0,0
-mag_dun02.gat,0,0,0,0 monster Sky Deleter 1384,10,0,0,0
-mag_dun02.gat,0,0,0,0 monster Earth Deleter 1385,10,0,0,0
-mag_dun02.gat,0,0,0,0 monster Gig 1387,20,0,0,0
-mag_dun02.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
-
-//(mag_dun01.gat)*
-mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,15,0,0,0
-mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
-mag_dun01.gat,0,0,0,0 monster Diabolic 1382,10,0,0,0
-mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
+//===== eAthena Script =======================================
+//= Magma Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 fixed 2,3,4 tabs instead of 1... and wrong mob names [Lupus]
+//============================================================
+
+//(mag_dun02.gat)*
+mag_dun02.gat,0,0,0,0 monster Nightmare Terror 1379,30,0,0,0
+mag_dun02.gat,0,0,0,0 monster Diabolic 1382,10,0,0,0
+mag_dun02.gat,0,0,0,0 monster Sky Deleter 1384,10,0,0,0
+mag_dun02.gat,0,0,0,0 monster Earth Deleter 1385,10,0,0,0
+mag_dun02.gat,0,0,0,0 monster Gig 1387,20,0,0,0
+mag_dun02.gat,0,0,0,0 monster Blazer 1367,20,0,0,0
+
+//(mag_dun01.gat)*
+mag_dun01.gat,0,0,0,0 monster Lava Golem 1366,15,0,0,0
+mag_dun01.gat,0,0,0,0 monster Grizzly 1381,10,0,0,0
+mag_dun01.gat,0,0,0,0 monster Diabolic 1382,10,0,0,0
+mag_dun01.gat,0,0,0,0 monster Explosion 1383,30,0,0,0
diff --git a/npc/mobs/dungeons/moc_pyramid.txt b/npc/mobs/dungeons/moc_pyramid.txt
index f1f3d7747..51d4e2e30 100644
--- a/npc/mobs/dungeons/moc_pyramid.txt
+++ b/npc/mobs/dungeons/moc_pyramid.txt
@@ -1,50 +1,50 @@
-//===== eAthena Script =======================================
-//= Morocc Pryamid Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(moc_pryd01.gat)*
-moc_pryd01.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
-
-//(moc_pryd02.gat)*
-moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,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 Skeleton Archer 1016,20,0,0,0
-moc_pryd02.gat,0,0,0,0 monster Skeleton Soldier 1028,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 Poporing 1031,20,0,0,0
-
-//(moc_pryd03.gat)*
-moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
-moc_pryd03.gat,0,0,0,0 monster Verit 1032,40,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 Matyr 1146,15,0,0,0
-moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
-
-//(moc_pryd04.gat)*
-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 Isis 1029,50,150000,75000,0
-moc_pryd04.gat,0,0,0,0 monster Mummy 1041,40,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 Osiris 1038,1,3600000,7200000,0
-
-//(moc_pryd05.gat)*
-moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
-moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
-
-//(moc_pryd06.gat)*
-moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
-moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
-moc_pryd06.gat,100,90,80,50 monster Amon Ra 1511,1,3600000,7200000,0
+//===== eAthena Script =======================================
+//= Morocc Pryamid Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(moc_pryd01.gat)*
+moc_pryd01.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+moc_pryd01.gat,0,0,0,0 monster Familiar 1005,50,0,0,0
+
+//(moc_pryd02.gat)*
+moc_pryd02.gat,0,0,0,0 monster Isis 1029,25,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 Skeleton Archer 1016,20,0,0,0
+moc_pryd02.gat,0,0,0,0 monster Skeleton Soldier 1028,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 Poporing 1031,20,0,0,0
+
+//(moc_pryd03.gat)*
+moc_pryd03.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
+moc_pryd03.gat,0,0,0,0 monster Verit 1032,40,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 Matyr 1146,15,0,0,0
+moc_pryd03.gat,0,0,0,0 monster Drainliar 1111,15,0,0,0
+
+//(moc_pryd04.gat)*
+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 Isis 1029,50,150000,75000,0
+moc_pryd04.gat,0,0,0,0 monster Mummy 1041,40,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 Osiris 1038,1,3600000,7200000,0
+
+//(moc_pryd05.gat)*
+moc_pryd05.gat,0,0,0,0 monster Minorous 1149,60,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Verit 1032,50,0,0,0
+moc_pryd05.gat,0,0,0,0 monster Mummy 1041,10,0,0,0
+
+//(moc_pryd06.gat)*
+moc_pryd06.gat,100,90,80,50 monster Ancient Mummy 1297,20,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Arclouse 1194,20,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Mimic 1191,20,0,0,0
+moc_pryd06.gat,0,0,0,0 monster Verit 1032,10,0,0,0
+moc_pryd06.gat,100,90,80,50 monster Amon Ra 1511,1,3600000,7200000,0
diff --git a/npc/mobs/dungeons/moc_sphinx.txt b/npc/mobs/dungeons/moc_sphinx.txt
index 392513009..bb57c4c61 100644
--- a/npc/mobs/dungeons/moc_sphinx.txt
+++ b/npc/mobs/dungeons/moc_sphinx.txt
@@ -1,44 +1,44 @@
-//===== eAthena Script =======================================
-//= Morocc Sphinx Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(in_sphinx1.gat)*
-in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
-in_sphinx1.gat,0,0,0,0 monster Matyr 1146,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 Zerom 1178,30,0,0,0
-
-//(in_sphinx2.gat)*
-in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,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 Zerom 1178,50,0,0,0
-
-//(in_sphinx3.gat)*
-in_sphinx3.gat,0,0,0,0 monster Pasana 1154,15,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
-in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Requiem 1164,22,0,0,0
-in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
-
-//(in_sphinx4.gat)*
-in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,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 Mimic 1191,4,600000,300000,1
-in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
-
-//(in_sphinx5.gat)*
-in_sphinx5.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Sidewinder 1037,20,0,0,0
-in_sphinx5.gat,0,0,0,0 monster Pasana 1154,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 Marduk 1140,30,0,0,0
-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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(in_sphinx1.gat)*
+in_sphinx1.gat,0,0,0,0 monster Requiem 1164,20,0,0,0
+in_sphinx1.gat,0,0,0,0 monster Matyr 1146,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 Zerom 1178,30,0,0,0
+
+//(in_sphinx2.gat)*
+in_sphinx2.gat,0,0,0,0 monster Requiem 1164,50,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 Zerom 1178,50,0,0,0
+
+//(in_sphinx3.gat)*
+in_sphinx3.gat,0,0,0,0 monster Pasana 1154,15,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Mimic 1191,10,600000,300000,1
+in_sphinx3.gat,0,0,0,0 monster Marduk 1140,30,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Requiem 1164,22,0,0,0
+in_sphinx3.gat,0,0,0,0 monster Matyr 1146,25,0,0,0
+
+//(in_sphinx4.gat)*
+in_sphinx4.gat,0,0,0,0 monster Minorous 1149,50,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 Mimic 1191,4,600000,300000,1
+in_sphinx4.gat,0,0,0,0 monster Marduk 1140,15,0,0,0
+
+//(in_sphinx5.gat)*
+in_sphinx5.gat,0,0,0,0 monster Matyr 1146,30,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Sidewinder 1037,20,0,0,0
+in_sphinx5.gat,0,0,0,0 monster Pasana 1154,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 Marduk 1140,30,0,0,0
+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 67d061551..82ec94230 100644
--- a/npc/mobs/dungeons/orcdun.txt
+++ b/npc/mobs/dungeons/orcdun.txt
@@ -1,30 +1,30 @@
-//===== eAthena Script =======================================
-//= Orc Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(orcsdun01.gat)*
-orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,30000,60000,0
-orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,70,3000,5000,0
-orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
-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,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,0,0,0,0 monster White Plant 1082,5,180000,90000,1
-
-//(orcsdun02.gat)*
-orcsdun02.gat,0,0,0,0 monster Zenorc 1177,50,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,50,3000,5000,0
-orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster Steel ChonChon 1042,20,0,0,0
-orcsdun02.gat,0,0,0,0 monster White Plant 1082,5,180000,90000,1
-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,900000,450000,1
+//===== eAthena Script =======================================
+//= Orc Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(orcsdun01.gat)*
+orcsdun01.gat,0,0,0,0 monster Orc Skeleton 1152,10,30000,60000,0
+orcsdun01.gat,0,0,0,0 monster Orc Zombie 1153,70,3000,5000,0
+orcsdun01.gat,0,0,0,0 monster Drainliar 1111,5,0,0,0
+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,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,0,0,0,0 monster White Plant 1082,5,180000,90000,1
+
+//(orcsdun02.gat)*
+orcsdun02.gat,0,0,0,0 monster Zenorc 1177,50,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Orc Skeleton 1152,50,3000,5000,0
+orcsdun02.gat,0,0,0,0 monster Drainliar 1111,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster Steel ChonChon 1042,20,0,0,0
+orcsdun02.gat,0,0,0,0 monster White Plant 1082,5,180000,90000,1
+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,900000,450000,1
diff --git a/npc/mobs/dungeons/payoncave.txt b/npc/mobs/dungeons/payoncave.txt
index b514ff42c..6a7e9d6fc 100644
--- a/npc/mobs/dungeons/payoncave.txt
+++ b/npc/mobs/dungeons/payoncave.txt
@@ -1,150 +1,150 @@
-//===== eAthena Script =======================================
-//= Payon Cave Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(pay_dun00.gat)*
-pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,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 Skeleton 1076,35,0,0,0
-pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
-pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
-pay_dun00.gat,140,140,35,35 monster Red Plant 1078,15,180000,90000,1
-
-//(pay_dun01.gat)*
-pay_dun01.gat,0,0,0,0 monster Skeleton Soldier 1028,60,0,0,0
-pay_dun01.gat,0,0,0,0 monster Skeleton Archer 1016,30,0,0,0
-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,235,54,10,10 monster Black Mushroom 1084,5,900000,450000,1
-pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-
-//(pay_dun02.gat)*
-pay_dun02.gat,0,0,0,0 monster Bon Gun 1188,30,0,0,0
-pay_dun02.gat,0,0,0,0 monster Skeleton Archer 1016,20,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 Skeleton Soldier 1028,15,180000,90000,1
-pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
-pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
-pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
-pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,112,192,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,113,194,0,0 monster Hydra 1068,1,319000,100000,1
-pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
-pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
-pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
-pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
-pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
-pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
-pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
-pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
-pay_dun02.gat,118,201,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,119,196,0,0 monster Hydra 1068,1,315000,100000,1
-pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
-pay_dun02.gat,120,194,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,203,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,197,0,0 monster Hydra 1068,1,321000,100000,1
-pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
-pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_dun02.gat,0,0,0,0 monster Mandragora 1020,3,300000,100000,1
-pay_dun02.gat,0,0,0,0 monster Nine-Tail 1180,1,3600000,1800000,0
-pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
-pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
-pay_dun02.gat,0,0,0,0 monster Red Plant 1078,9,600000,300000,1
-
-//(pay_dun03.gat)*
-pay_dun03.gat,0,0,0,0 monster Nine-Tail 1180,2,0,0,0
-pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Sohee 1170,40,0,0,0
-pay_dun03.gat,115,190,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,219,185,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,219,244,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,228,185,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,230,244,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,240,244,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,243,220,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,71,243,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,85,178,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,86,248,0,0 monster Sohee 1170,3,300000,100000,1
-pay_dun03.gat,0,0,0,0 monster Bon Gun 1188,3,0,0,0
-pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
-pay_dun03.gat,57,65,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,59,64,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,62,67,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,64,66,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,66,65,0,0 monster Hydra 1068,1,600000,300000,1
-pay_dun03.gat,66,73,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,67,71,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,68,72,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,71,64,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,126,131,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,133,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,135,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,179,131,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,133,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,138,42,0,0 monster Blue Plant 1079,1,600000,900000,1
-pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
-pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,900000,1
-pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,900000,1
-pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,900000,1
-pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,900000,1
-pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
-pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
-pay_dun03.gat,228,61,40,40 monster Red Plant 1078,16,600000,300000,1
-pay_dun03.gat,49,264,0,6 monster White Plant 1082,2,600000,300000,1
-pay_dun03.gat,225,62,6,12 monster White Plant 1082,3,600000,300000,1
-
-//(pay_dun04.gat)*
-pay_dun04.gat,0,0,0,0 monster Nine-Tail 1180,1,0,0,0
-pay_dun04.gat,0,0,0,0 monster Greatest General 1277,16,0,0,0
-pay_dun04.gat,123,99,0,0 monster Greatest General 1277,1,3600000,7200000,1
-pay_dun04.gat,140,114,0,0 monster Greatest General 1277,1,3600000,7200000,1
-pay_dun04.gat,154,75,0,0 monster Greatest General 1277,1,600000,300000,1
-pay_dun04.gat,77,163,0,0 monster Greatest General 1277,1,600000,300000,1
-pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
-pay_dun04.gat,0,0,0,0 monster Sohee 1170,4,0,0,0
-pay_dun04.gat,100,133,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,103,110,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,106,139,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,109,103,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,129,140,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,131,106,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,135,134,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,136,111,0,0 monster Sohee 1170,2,300000,100000,1
-pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
-pay_dun04.gat,0,0,0,0 monster Skeleton Soldier 1028,10,0,0,0
-pay_dun04.gat,0,0,0,0 monster Skeleton Archer 1016,20,0,0,0
-pay_dun04.gat,0,0,0,0 monster White Plant 1082,6,600000,300000,1
-pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,2,1800000,900000,1
-pay_dun04.gat,120,115,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
-pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+//===== eAthena Script =======================================
+//= Payon Cave Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(pay_dun00.gat)*
+pay_dun00.gat,0,0,0,0 monster Zombie 1015,20,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 Skeleton 1076,35,0,0,0
+pay_dun00.gat,0,0,0,0 monster Familiar 1005,15,0,0,0
+pay_dun00.gat,140,140,5,5 monster Black Mushroom 1084,3,360000,180000,1
+pay_dun00.gat,140,140,35,35 monster Red Plant 1078,15,180000,90000,1
+
+//(pay_dun01.gat)*
+pay_dun01.gat,0,0,0,0 monster Skeleton Soldier 1028,60,0,0,0
+pay_dun01.gat,0,0,0,0 monster Skeleton Archer 1016,30,0,0,0
+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,235,54,10,10 monster Black Mushroom 1084,5,900000,450000,1
+pay_dun01.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+
+//(pay_dun02.gat)*
+pay_dun02.gat,0,0,0,0 monster Bon Gun 1188,30,0,0,0
+pay_dun02.gat,0,0,0,0 monster Skeleton Archer 1016,20,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 Skeleton Soldier 1028,15,180000,90000,1
+pay_dun02.gat,107,190,0,0 monster Hydra 1068,1,320000,100000,1
+pay_dun02.gat,108,191,0,0 monster Hydra 1068,1,332000,100000,1
+pay_dun02.gat,109,192,0,0 monster Hydra 1068,1,374000,100000,1
+pay_dun02.gat,109,193,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,110,190,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,110,194,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,111,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,112,192,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,113,194,0,0 monster Hydra 1068,1,319000,100000,1
+pay_dun02.gat,116,190,0,0 monster Hydra 1068,1,326000,100000,1
+pay_dun02.gat,116,196,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,116,199,0,0 monster Hydra 1068,1,306000,100000,1
+pay_dun02.gat,116,205,0,0 monster Hydra 1068,1,345000,100000,1
+pay_dun02.gat,117,191,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,117,197,0,0 monster Hydra 1068,1,314000,100000,1
+pay_dun02.gat,117,200,0,0 monster Hydra 1068,1,275000,100000,1
+pay_dun02.gat,117,206,0,0 monster Hydra 1068,1,302000,100000,1
+pay_dun02.gat,118,192,0,0 monster Hydra 1068,1,285000,100000,1
+pay_dun02.gat,118,198,0,0 monster Hydra 1068,1,312000,100000,1
+pay_dun02.gat,118,201,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,119,196,0,0 monster Hydra 1068,1,315000,100000,1
+pay_dun02.gat,119,199,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,119,205,0,0 monster Hydra 1068,1,324000,100000,1
+pay_dun02.gat,120,194,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,203,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,197,0,0 monster Hydra 1068,1,321000,100000,1
+pay_dun02.gat,122,200,0,0 monster Hydra 1068,1,300000,100000,1
+pay_dun02.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_dun02.gat,0,0,0,0 monster Mandragora 1020,3,300000,100000,1
+pay_dun02.gat,0,0,0,0 monster Nine-Tail 1180,1,3600000,1800000,0
+pay_dun02.gat,111,199,10,10 monster Black Mushroom 1084,7,900000,450000,1
+pay_dun02.gat,37,243,0,0 monster Black Mushroom 1084,1,600000,300000,1
+pay_dun02.gat,0,0,0,0 monster Red Plant 1078,9,600000,300000,1
+
+//(pay_dun03.gat)*
+pay_dun03.gat,0,0,0,0 monster Nine-Tail 1180,2,0,0,0
+pay_dun03.gat,0,0,0,0 monster Greatest General 1277,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Sohee 1170,40,0,0,0
+pay_dun03.gat,115,190,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,219,185,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,219,244,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,228,185,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,230,244,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,240,244,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,243,220,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,71,243,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,85,178,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,86,248,0,0 monster Sohee 1170,3,300000,100000,1
+pay_dun03.gat,0,0,0,0 monster Bon Gun 1188,3,0,0,0
+pay_dun03.gat,0,0,0,0 monster Munak 1026,3,0,0,0
+pay_dun03.gat,57,65,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,59,64,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,62,67,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,64,66,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,66,65,0,0 monster Hydra 1068,1,600000,300000,1
+pay_dun03.gat,66,73,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,67,71,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,68,72,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,71,64,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,126,131,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,133,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,135,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,179,131,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,133,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,138,42,0,0 monster Blue Plant 1079,1,600000,900000,1
+pay_dun03.gat,88,35,0,0 monster Yellow Plant 1081,1,600000,300000,1
+pay_dun03.gat,154,112,0,0 monster Whisper 1185,1,1800000,900000,1
+pay_dun03.gat,161,117,0,0 monster Whisper 1185,1,1800000,900000,1
+pay_dun03.gat,81,61,0,0 monster Whisper 1185,1,1800000,900000,1
+pay_dun03.gat,84,63,0,0 monster Whisper 1185,1,1800000,900000,1
+pay_dun03.gat,89,147,0,0 monster Giant Whisper 1186,1,3600000,1800000,1
+pay_dun03.gat,120,186,0,0 monster Green Plant 1080,1,600000,300000,1
+pay_dun03.gat,228,61,40,40 monster Red Plant 1078,16,600000,300000,1
+pay_dun03.gat,49,264,0,6 monster White Plant 1082,2,600000,300000,1
+pay_dun03.gat,225,62,6,12 monster White Plant 1082,3,600000,300000,1
+
+//(pay_dun04.gat)*
+pay_dun04.gat,0,0,0,0 monster Nine-Tail 1180,1,0,0,0
+pay_dun04.gat,0,0,0,0 monster Greatest General 1277,16,0,0,0
+pay_dun04.gat,123,99,0,0 monster Greatest General 1277,1,3600000,7200000,1
+pay_dun04.gat,140,114,0,0 monster Greatest General 1277,1,3600000,7200000,1
+pay_dun04.gat,154,75,0,0 monster Greatest General 1277,1,600000,300000,1
+pay_dun04.gat,77,163,0,0 monster Greatest General 1277,1,600000,300000,1
+pay_dun04.gat,0,0,0,0 monster Horong 1129,30,0,0,0
+pay_dun04.gat,0,0,0,0 monster Sohee 1170,4,0,0,0
+pay_dun04.gat,100,133,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,103,110,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,106,139,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,109,103,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,129,140,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,131,106,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,135,134,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,136,111,0,0 monster Sohee 1170,2,300000,100000,1
+pay_dun04.gat,0,0,0,0 monster Dokebi 1110,40,0,0,0
+pay_dun04.gat,0,0,0,0 monster Skeleton Soldier 1028,10,0,0,0
+pay_dun04.gat,0,0,0,0 monster Skeleton Archer 1016,20,0,0,0
+pay_dun04.gat,0,0,0,0 monster White Plant 1082,6,600000,300000,1
+pay_dun04.gat,120,120,10,10 monster Shining Plant 1083,2,1800000,900000,1
+pay_dun04.gat,120,115,0,0 monster Moonlight Flower 1150,1,3600000,7200000,1
+pay_dun04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
diff --git a/npc/mobs/dungeons/pront_maze.txt b/npc/mobs/dungeons/pront_maze.txt
index 0ac0718f2..58bd00bfd 100644
--- a/npc/mobs/dungeons/pront_maze.txt
+++ b/npc/mobs/dungeons/pront_maze.txt
@@ -1,75 +1,75 @@
-//===== eAthena Script =======================================
-//= Prontera Maze(Hidden Temple) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(prt_maze01.gat)*
-prt_maze01.gat,99,140,21,21 monster Sidewinder 1037,3,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
-prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,4,120000,40000,1
-prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
-prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
-prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
-prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
-prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
-prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
-prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
-prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
-prt_maze01.gat,19,140,21,21 monster Steel ChonChon 1042,5,120000,40000,1
-prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
-prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
-prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
-prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
-prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
-prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
-prt_maze01.gat,99,100,21,21 monster ChonChon 1011,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,179,20,21,21 monster Poring 1002,5,120000,40000,1
-prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
-prt_maze01.gat,19,180,21,21 monster Savage Babe 1167,3,120000,40000,1
-prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
-prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
-prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
-prt_maze01.gat,0,0,0,0 monster Yellow Plant 1081,2,180000,90000,1
-prt_maze01.gat,0,0,0,0 monster Blue Plant 1079,3,360000,180000,1
-prt_maze01.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
-prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,1
-prt_maze01.gat,0,0,0,0 monster Black Mushroom 1084,5,360000,180000,1
-prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
-prt_maze01.gat,0,0,0,0 monster Red Mushroom 1085,5,180000,90000,1
-prt_maze01.gat,0,0,0,0 monster White Plant 1082,3,180000,90000,1
-
-//(prt_maze02.gat)*
-prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
-prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
-prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,600000,300000,1
-prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,1
-
-//(prt_maze03.gat)*
-prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
-prt_maze03.gat,0,0,0,0 monster Baphomet Jr. 1101,25,0,0,0
-prt_maze03.gat,0,0,0,0 monster Sidewinder 1037,30,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 Stem Worm 1215,20,0,0,0
-prt_maze03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
-prt_maze03.gat,0,0,0,0 monster Yellow Plant 1081,1,600000,300000,1
-prt_maze03.gat,0,0,0,0 monster Blue Plant 1079,5,900000,450000,1
-prt_maze03.gat,0,0,0,0 monster Vocal 1088,1,1800000,200000,1
-prt_maze03.gat,0,0,0,0 monster Eclipse 1093,1,1800000,200000,1
-prt_maze03.gat,0,0,0,0 monster Mastering 1090,1,1800000,200000,1
-prt_maze03.gat,0,0,0,0 monster Shining Plant 1083,5,1800000,200000,1
-prt_maze03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,200000,1
-prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,3600000,7200000,1
-prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,3600000,7200000,1
-prt_maze03.gat,0,0,0,0 monster Black Mushroom 1084,6,360000,180000,1
-prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,360000,180000,1
-prt_maze03.gat,0,0,0,0 monster Red Mushroom 1085,5,180000,90000,1
+//===== eAthena Script =======================================
+//= Prontera Maze(Hidden Temple) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(prt_maze01.gat)*
+prt_maze01.gat,99,140,21,21 monster Sidewinder 1037,3,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Choco 1214,2,120000,40000,1
+prt_maze01.gat,19,100,21,21 monster Hunter Fly 1035,4,120000,40000,1
+prt_maze01.gat,179,100,21,21 monster Argiope 1099,3,120000,40000,1
+prt_maze01.gat,179,140,21,21 monster Mantis 1139,3,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage 1166,5,120000,40000,1
+prt_maze01.gat,139,60,21,21 monster Bigfoot 1060,5,120000,40000,1
+prt_maze01.gat,139,100,21,21 monster Argos 1100,3,120000,40000,1
+prt_maze01.gat,139,180,21,21 monster Caramel 1103,5,120000,40000,1
+prt_maze01.gat,59,140,21,21 monster Yoyo 1057,4,120000,40000,1
+prt_maze01.gat,59,180,21,21 monster Martin 1145,5,120000,40000,1
+prt_maze01.gat,179,180,21,21 monster Coco 1104,5,120000,40000,1
+prt_maze01.gat,19,140,21,21 monster Steel ChonChon 1042,5,120000,40000,1
+prt_maze01.gat,99,20,21,21 monster Creamy 1018,1,120000,40000,1
+prt_maze01.gat,139,140,21,21 monster Stainer 1174,5,120000,40000,1
+prt_maze01.gat,59,60,21,21 monster Boa 1025,5,120000,40000,1
+prt_maze01.gat,19,20,21,21 monster Poporing 1031,5,120000,40000,1
+prt_maze01.gat,19,60,21,21 monster Wolf 1013,5,120000,40000,1
+prt_maze01.gat,179,60,21,21 monster Rocker 1052,5,120000,40000,1
+prt_maze01.gat,99,100,21,21 monster ChonChon 1011,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,179,20,21,21 monster Poring 1002,5,120000,40000,1
+prt_maze01.gat,99,60,21,21 monster Smokie 1056,5,120000,40000,1
+prt_maze01.gat,19,180,21,21 monster Savage Babe 1167,3,120000,40000,1
+prt_maze01.gat,99,180,21,21 monster Dustiness 1114,5,120000,40000,1
+prt_maze01.gat,59,20,21,21 monster Pupa 1008,5,120000,40000,1
+prt_maze01.gat,59,100,21,21 monster Horn 1128,5,120000,40000,1
+prt_maze01.gat,0,0,0,0 monster Yellow Plant 1081,2,180000,90000,1
+prt_maze01.gat,0,0,0,0 monster Blue Plant 1079,3,360000,180000,1
+prt_maze01.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
+prt_maze01.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,1800000,1
+prt_maze01.gat,0,0,0,0 monster Black Mushroom 1084,5,360000,180000,1
+prt_maze01.gat,0,0,0,0 monster Red Plant 1078,5,180000,90000,1
+prt_maze01.gat,0,0,0,0 monster Red Mushroom 1085,5,180000,90000,1
+prt_maze01.gat,0,0,0,0 monster White Plant 1082,3,180000,90000,1
+
+//(prt_maze02.gat)*
+prt_maze02.gat,0,0,0,0 monster Bigfoot 1060,5,0,0,0
+prt_maze02.gat,0,0,0,0 monster Poporing 1031,25,0,0,0
+prt_maze02.gat,0,0,0,0 monster Sasquatch 1243,1,600000,300000,1
+prt_maze02.gat,0,0,0,0 monster Leib Olmai 1306,1,1800000,900000,1
+
+//(prt_maze03.gat)*
+prt_maze03.gat,0,0,0,0 monster Killer Mantis 1294,1,0,0,0
+prt_maze03.gat,0,0,0,0 monster Baphomet Jr. 1101,25,0,0,0
+prt_maze03.gat,0,0,0,0 monster Sidewinder 1037,30,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 Stem Worm 1215,20,0,0,0
+prt_maze03.gat,0,0,0,0 monster Mantis 1139,30,0,0,0
+prt_maze03.gat,0,0,0,0 monster Yellow Plant 1081,1,600000,300000,1
+prt_maze03.gat,0,0,0,0 monster Blue Plant 1079,5,900000,450000,1
+prt_maze03.gat,0,0,0,0 monster Vocal 1088,1,1800000,200000,1
+prt_maze03.gat,0,0,0,0 monster Eclipse 1093,1,1800000,200000,1
+prt_maze03.gat,0,0,0,0 monster Mastering 1090,1,1800000,200000,1
+prt_maze03.gat,0,0,0,0 monster Shining Plant 1083,5,1800000,200000,1
+prt_maze03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,3600000,200000,1
+prt_maze03.gat,0,0,0,0 monster Baphomet 1039,1,3600000,7200000,1
+prt_maze03.gat,0,0,0,0 monster Ghostring 1120,1,3600000,7200000,1
+prt_maze03.gat,0,0,0,0 monster Black Mushroom 1084,6,360000,180000,1
+prt_maze03.gat,0,0,0,0 monster Red Plant 1078,5,360000,180000,1
+prt_maze03.gat,0,0,0,0 monster Red Mushroom 1085,5,180000,90000,1
diff --git a/npc/mobs/dungeons/pront_sewers.txt b/npc/mobs/dungeons/pront_sewers.txt
index 7ab142335..bac25a8d3 100644
--- a/npc/mobs/dungeons/pront_sewers.txt
+++ b/npc/mobs/dungeons/pront_sewers.txt
@@ -1,44 +1,44 @@
-//===== eAthena Script =======================================
-//= Prontera Sewers(Culvert) Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(prt_sewb1.gat)*
-prt_sewb1.gat,0,0,0,0 monster Tarou 1175,20,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 Thief Bug Larva 1051,40,0,0,0
-prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,90,0,0,0
-
-//(prt_sewb2.gat)*
-prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,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 Spore 1014,20,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 Thief Bug Larva 1051,70,0,0,0
-prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
-
-//(prt_sewb3.gat)*
-prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,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 Thief Bug Female 1053,65,0,0,0
-prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-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 Larva 1051,20,0,0,0
-
-//(prt_sewb4.gat)*
-prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,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 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 Thief Bug Larva 1051,20,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
-prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,7200000,0
+//===== eAthena Script =======================================
+//= Prontera Sewers(Culvert) Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(prt_sewb1.gat)*
+prt_sewb1.gat,0,0,0,0 monster Tarou 1175,20,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 Thief Bug Larva 1051,40,0,0,0
+prt_sewb1.gat,0,0,0,0 monster Thief Bug Egg 1048,90,0,0,0
+
+//(prt_sewb2.gat)*
+prt_sewb2.gat,0,0,0,0 monster Tarou 1175,60,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 Spore 1014,20,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 Thief Bug Larva 1051,70,0,0,0
+prt_sewb2.gat,0,0,0,0 monster Thief Bug Egg 1048,20,0,0,0
+
+//(prt_sewb3.gat)*
+prt_sewb3.gat,0,0,0,0 monster Poison Spore 1077,15,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 Thief Bug Female 1053,65,0,0,0
+prt_sewb3.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+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 Larva 1051,20,0,0,0
+
+//(prt_sewb4.gat)*
+prt_sewb4.gat,0,0,0,0 monster Cramp 1209,5,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 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 Thief Bug Larva 1051,20,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Thief Bug Egg 1048,10,0,0,0
+prt_sewb4.gat,0,0,0,0 monster Golden Thief Bug 1086,1,3600000,7200000,0
diff --git a/npc/mobs/dungeons/sunkenship.txt b/npc/mobs/dungeons/sunkenship.txt
index 5db290792..c75307cf7 100644
--- a/npc/mobs/dungeons/sunkenship.txt
+++ b/npc/mobs/dungeons/sunkenship.txt
@@ -1,141 +1,141 @@
-//===== eAthena Script =======================================
-//= Sunken Ship Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(treasure01.gat)*
-treasure01.gat,164,59,12,10 monster Whisper 1179,10,300000,100000,1
-treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,3,180000,90000,1
-treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
-treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,9,180000,90000,1
-treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
-treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
-treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
-treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
-treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
-treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,42,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,44,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
-treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
-treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
-treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,164,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,165,70,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
-treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
-treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,168,43,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,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,40,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,42,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
-treasure01.gat,49,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,50,160,0,0 monster Hydra 1068,1,301000,100000,1
-treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
-treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
-treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
-treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
-treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
-treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
-treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
-treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
-treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
-treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
-treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
-treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
-treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
-treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
-treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
-treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
-treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
-treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
-treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
-treasure01.gat,0,0,0,0 monster Kukre 1070,10,0,0,1
-treasure01.gat,21,165,5,9 monster Kukre 1070,10,300000,150000,1
-treasure01.gat,162,58,0,0 monster Penomena 1216,1,900000,450000,0
-treasure01.gat,168,59,0,0 monster Wanderer 1208,1,1800000,900000,0
-
-//(treasure02.gat)*
-treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
-treasure02.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
-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,101,151,10,10 monster Penomena 1216,4,100000,100000,1
-treasure02.gat,0,0,0,0 monster Penomena 1216,2,0,0,0
-treasure02.gat,101,150,15,10 monster Whisper 1179,8,200000,100000,1
-treasure02.gat,102,68,13,13 monster Whisper 1179,6,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,151,138,1,1 monster Whisper 1179,1,100000,100000,1
-treasure02.gat,157,143,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,163,151,5,5 monster Pirate Skeleton 1071,35,300000,100000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
-treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
-treasure02.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
-treasure02.gat,100,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,100,85,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,101,57,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,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,102,57,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,136,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
-treasure02.gat,103,85,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,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,0,0,0,0 monster Kukre 1070,20,0,0,1
-treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1800000,900000,1
-treasure02.gat,101,151,8,8 monster Drake 1112,1,3600000,7200000,1
+//===== eAthena Script =======================================
+//= Sunken Ship Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(treasure01.gat)*
+treasure01.gat,164,59,12,10 monster Whisper 1179,10,300000,100000,1
+treasure01.gat,106,111,9,9 monster Pirate Skeleton 1071,3,180000,90000,1
+treasure01.gat,150,162,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,160,60,27,19 monster Pirate Skeleton 1071,10,300000,100000,1
+treasure01.gat,163,141,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,151,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,163,161,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,34,112,17,11 monster Pirate Skeleton 1071,9,180000,90000,1
+treasure01.gat,58,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,69,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,79,165,5,5 monster Pirate Skeleton 1071,3,300000,100000,1
+treasure01.gat,107,39,15,15 monster Poison Spore 1077,3,180000,90000,1
+treasure01.gat,29,38,15,15 monster Poison Spore 1077,3,180000,90000,1
+treasure01.gat,54,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+treasure01.gat,82,154,11,9 monster Poison Spore 1077,3,100000,100000,1
+treasure01.gat,107,39,15,15 monster Hydra 1068,1,180000,90000,1
+treasure01.gat,150,162,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,40,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,158,41,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,42,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,44,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,45,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,158,62,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,158,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,40,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,159,41,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,159,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,43,0,0 monster Hydra 1068,1,318000,100000,1
+treasure01.gat,159,44,0,0 monster Hydra 1068,1,312000,100000,1
+treasure01.gat,159,45,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,159,62,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,159,63,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,162,70,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,162,71,0,0 monster Hydra 1068,1,273000,100000,1
+treasure01.gat,163,141,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,151,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,161,5,5 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,70,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,163,71,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,164,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,165,70,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,165,71,0,0 monster Hydra 1068,1,307000,100000,1
+treasure01.gat,168,40,0,0 monster Hydra 1068,1,322000,100000,1
+treasure01.gat,168,41,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,168,42,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,168,43,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,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,40,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,42,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,169,43,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,169,44,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,169,45,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,48,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,48,161,0,0 monster Hydra 1068,1,316000,100000,1
+treasure01.gat,49,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,50,160,0,0 monster Hydra 1068,1,301000,100000,1
+treasure01.gat,50,161,0,0 monster Hydra 1068,1,308000,100000,1
+treasure01.gat,51,160,0,0 monster Hydra 1068,1,270000,100000,1
+treasure01.gat,51,161,0,0 monster Hydra 1068,1,314000,100000,1
+treasure01.gat,60,182,0,0 monster Hydra 1068,1,313000,100000,1
+treasure01.gat,67,160,0,0 monster Hydra 1068,1,293000,100000,1
+treasure01.gat,67,161,0,0 monster Hydra 1068,1,263000,100000,1
+treasure01.gat,68,160,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,68,161,0,0 monster Hydra 1068,1,317000,100000,1
+treasure01.gat,68,66,13,11 monster Hydra 1068,4,180000,90000,1
+treasure01.gat,69,160,0,0 monster Hydra 1068,1,290000,100000,1
+treasure01.gat,69,161,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,70,160,0,0 monster Hydra 1068,1,306000,100000,1
+treasure01.gat,70,161,0,0 monster Hydra 1068,1,302000,100000,1
+treasure01.gat,76,182,0,0 monster Hydra 1068,1,269000,100000,1
+treasure01.gat,86,160,0,0 monster Hydra 1068,1,310000,100000,1
+treasure01.gat,86,161,0,0 monster Hydra 1068,1,285000,100000,1
+treasure01.gat,87,160,0,0 monster Hydra 1068,1,268000,100000,1
+treasure01.gat,87,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,88,160,0,0 monster Hydra 1068,1,296000,100000,1
+treasure01.gat,88,161,0,0 monster Hydra 1068,1,281000,100000,1
+treasure01.gat,89,160,0,0 monster Hydra 1068,1,305000,100000,1
+treasure01.gat,89,161,0,0 monster Hydra 1068,1,300000,100000,1
+treasure01.gat,0,0,0,0 monster Kukre 1070,10,0,0,1
+treasure01.gat,21,165,5,9 monster Kukre 1070,10,300000,150000,1
+treasure01.gat,162,58,0,0 monster Penomena 1216,1,900000,450000,0
+treasure01.gat,168,59,0,0 monster Wanderer 1208,1,1800000,900000,0
+
+//(treasure02.gat)*
+treasure02.gat,23,142,1,1 monster Marionette 1143,1,200000,100000,1
+treasure02.gat,0,0,0,0 monster Wanderer 1208,1,0,0,0
+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,101,151,10,10 monster Penomena 1216,4,100000,100000,1
+treasure02.gat,0,0,0,0 monster Penomena 1216,2,0,0,0
+treasure02.gat,101,150,15,10 monster Whisper 1179,8,200000,100000,1
+treasure02.gat,102,68,13,13 monster Whisper 1179,6,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,151,138,1,1 monster Whisper 1179,1,100000,100000,1
+treasure02.gat,157,143,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,163,151,5,5 monster Pirate Skeleton 1071,35,300000,100000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,2,100000,100000,1
+treasure02.gat,101,151,10,10 monster Mimic 1191,3,500000,200000,1
+treasure02.gat,0,0,0,0 monster Mimic 1191,5,0,0,1
+treasure02.gat,100,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,100,85,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,101,57,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,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,102,57,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,136,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,143,0,0 monster Hydra 1068,1,300000,100000,1
+treasure02.gat,103,85,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,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,0,0,0,0 monster Kukre 1070,20,0,0,1
+treasure02.gat,0,0,0,0 monster Ghostring 1120,1,1800000,900000,1
+treasure02.gat,101,151,8,8 monster Drake 1112,1,3600000,7200000,1
diff --git a/npc/mobs/dungeons/toyfactory.txt b/npc/mobs/dungeons/toyfactory.txt
index f9ab1b090..914acfdc5 100644
--- a/npc/mobs/dungeons/toyfactory.txt
+++ b/npc/mobs/dungeons/toyfactory.txt
@@ -1,30 +1,30 @@
-//===== eAthena Script =======================================
-//= Toy Factory Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//xmas_dun01
-//xmas_dun01.gat,0,0,0,0 monster Poring 1002,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 Mastering 1090,1,1800000,900000,0
-xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
-xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Marin 1242,30,0,0,0
-xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,50,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,900000,450000,0
-
-//xmas_dun02
-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,40,0,0,0
-xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,55,0,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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//xmas_dun01
+//xmas_dun01.gat,0,0,0,0 monster Poring 1002,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 Mastering 1090,1,1800000,900000,0
+xmas_dun01.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,0
+xmas_dun01.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Marin 1242,30,0,0,0
+xmas_dun01.gat,0,0,0,0 monster Christmas Cookie 1246,50,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,900000,450000,0
+
+//xmas_dun02
+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,40,0,0,0
+xmas_dun02.gat,0,0,0,0 monster Myst Case 1249,55,0,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 d2d83d2bc..b1d246c68 100644
--- a/npc/mobs/dungeons/turtleisland.txt
+++ b/npc/mobs/dungeons/turtleisland.txt
@@ -1,47 +1,47 @@
-//===== eAthena Script =======================================
-//= Turtle Island Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(tur_dun01.gat)*
-tur_dun01.gat,0,0,0,0 monster Perimeter 1314,10,0,0,0
-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 Pest 1256,15,0,0,0
-tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
-
-//(tur_dun02.gat)*
-tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
-tur_dun02.gat,0,0,0,0 monster Soldier 1316,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Perimeter 1314,40,0,0,0
-tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
-
-//(tur_dun03.gat)*
-tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,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 Heater 1318,10,0,0,0
-tur_dun03.gat,0,0,0,0 monster Perimeter 1314,15,0,0,0
-
-//(tur_dun04.gat)*
-tur_dun04.gat,0,0,0,0 monster Wanderer 1208,5,0,0,0
-tur_dun04.gat,99,92,10,10 monster Wanderer 1208,2,60000,30000,0
-tur_dun04.gat,0,0,0,0 monster Assaulter 1315,26,0,0,0
-tur_dun04.gat,100,93,20,20 monster Assaulter 1315,15,120000,60000,0
-tur_dun04.gat,0,0,0,0 monster Freezer 1319,11,0,0,0
-tur_dun04.gat,100,93,20,20 monster Freezer 1319,4,120000,60000,0
-tur_dun04.gat,0,0,0,0 monster Heater 1318,30,0,0,0
-tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
-tur_dun04.gat,0,0,0,0 monster Perimeter 1314,4,0,0,0
-tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,7200000,0
-
-//(tur_dun05.gat)? //no data at emp.org
-tur_dun05.gat,0,0,0,0 monster Perimeter 1314,3,20000,0,0
-tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
-tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
+//===== eAthena Script =======================================
+//= Turtle Island Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(tur_dun01.gat)*
+tur_dun01.gat,0,0,0,0 monster Perimeter 1314,10,0,0,0
+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 Pest 1256,15,0,0,0
+tur_dun01.gat,0,0,0,0 monster Thara Frog 1034,10,0,0,0
+
+//(tur_dun02.gat)*
+tur_dun02.gat,0,0,0,0 monster Freezer 1319,20,0,0,0
+tur_dun02.gat,0,0,0,0 monster Soldier 1316,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Perimeter 1314,40,0,0,0
+tur_dun02.gat,0,0,0,0 monster Pest 1256,15,0,0,0
+
+//(tur_dun03.gat)*
+tur_dun03.gat,0,0,0,0 monster Assaulter 1315,35,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 Heater 1318,10,0,0,0
+tur_dun03.gat,0,0,0,0 monster Perimeter 1314,15,0,0,0
+
+//(tur_dun04.gat)*
+tur_dun04.gat,0,0,0,0 monster Wanderer 1208,5,0,0,0
+tur_dun04.gat,99,92,10,10 monster Wanderer 1208,2,60000,30000,0
+tur_dun04.gat,0,0,0,0 monster Assaulter 1315,26,0,0,0
+tur_dun04.gat,100,93,20,20 monster Assaulter 1315,15,120000,60000,0
+tur_dun04.gat,0,0,0,0 monster Freezer 1319,11,0,0,0
+tur_dun04.gat,100,93,20,20 monster Freezer 1319,4,120000,60000,0
+tur_dun04.gat,0,0,0,0 monster Heater 1318,30,0,0,0
+tur_dun04.gat,100,93,20,20 monster Heater 1318,3,120000,60000,0
+tur_dun04.gat,0,0,0,0 monster Perimeter 1314,4,0,0,0
+tur_dun04.gat,99,93,20,20 monster Turtle General 1312,1,3600000,7200000,0
+
+//(tur_dun05.gat)? //no data at emp.org
+tur_dun05.gat,0,0,0,0 monster Perimeter 1314,3,20000,0,0
+tur_dun05.gat,0,0,0,0 monster Assaulter 1315,1,20000,0,0
+tur_dun05.gat,0,0,0,0 monster Freezer 1319,5,30000,0,0
diff --git a/npc/mobs/dungeons/umbaladun.txt b/npc/mobs/dungeons/umbaladun.txt
index b4cca25a8..6e8cdbe2f 100644
--- a/npc/mobs/dungeons/umbaladun.txt
+++ b/npc/mobs/dungeons/umbaladun.txt
@@ -1,25 +1,25 @@
-//===== eAthena Script =======================================
-//= Umbala Dungeon Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-//(um_dun01.gat)?
-um_dun01.gat,0,0,0,0 monster Stainer 1174,35,0,0,0
-um_dun01.gat,0,0,0,0 monster Dustiness 1114,15,0,0,0
-um_dun01.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
-um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,20,0,0,0
-
-//(um_dun02.gat)?
-um_dun02.gat,0,0,0,0 monster Wooden Fighter 1499,35,0,0,0
-um_dun02.gat,0,0,0,0 monster Wooden Shooter 1498,25,0,0,0
-um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
-um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,25,0,0,0
-um_dun02.gat,0,0,0,0 monster Stone Shooter 1495,25,0,0,0
+//===== eAthena Script =======================================
+//= Umbala Dungeon Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+//(um_dun01.gat)?
+um_dun01.gat,0,0,0,0 monster Stainer 1174,35,0,0,0
+um_dun01.gat,0,0,0,0 monster Dustiness 1114,15,0,0,0
+um_dun01.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
+um_dun01.gat,0,0,0,0 monster Stone Shooter 1495,20,0,0,0
+
+//(um_dun02.gat)?
+um_dun02.gat,0,0,0,0 monster Wooden Fighter 1499,35,0,0,0
+um_dun02.gat,0,0,0,0 monster Wooden Shooter 1498,25,0,0,0
+um_dun02.gat,0,0,0,0 monster Dryad 1493,10,0,0,0
+um_dun02.gat,0,0,0,0 monster Wooden Golem 1497,25,0,0,0
+um_dun02.gat,0,0,0,0 monster Stone Shooter 1495,25,0,0,0
diff --git a/npc/mobs/fields/amatsu.txt b/npc/mobs/fields/amatsu.txt
index 39218ffc2..b646c9303 100644
--- a/npc/mobs/fields/amatsu.txt
+++ b/npc/mobs/fields/amatsu.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= Amatsu Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(ama_fild01.gat)*
-ama_fild01.gat,0,0,0,0 monster Kapha 1406,50,0,0,0
-ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,0,0,0
-ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,0,0,0
-ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
-ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,0,0,0
-ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,312,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,172,311,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,173,312,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,174,311,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,312,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
-ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+//===== eAthena Script =======================================
+//= Amatsu Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(ama_fild01.gat)*
+ama_fild01.gat,0,0,0,0 monster Kapha 1406,50,0,0,0
+ama_fild01.gat,0,0,0,0 monster Poison Toad 1402,1,0,0,0
+ama_fild01.gat,0,0,0,0 monster Miyabi Doll 1404,2,0,0,0
+ama_fild01.gat,0,0,0,0 monster Karakasa 1400,50,0,0,0
+ama_fild01.gat,0,0,0,0 monster Bigfoot 1060,15,0,0,0
+ama_fild01.gat,169,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,169,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,312,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,313,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,171,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,172,311,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,173,310,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,173,312,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,173,313,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,173,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,173,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,174,311,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,312,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,313,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,175,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,177,314,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,177,315,0,0 monster Hydra 1068,1,60000,30000,0
+ama_fild01.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
diff --git a/npc/mobs/fields/ayothana.txt b/npc/mobs/fields/ayothana.txt
index 59a744ccf..405cd18d0 100644
--- a/npc/mobs/fields/ayothana.txt
+++ b/npc/mobs/fields/ayothana.txt
@@ -1,23 +1,23 @@
-//===== eAthena Script =======================================
-//= Ayothana Field Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-// Mob IDs are right, need to check the amount, spawntime, etc.
-//(ayothana Field 01)?
-ayo_fild01.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,20,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,20,0,0,0
-ayo_fild01.gat,0,0,0,0 monster Coco 1104,25,0,0,0
-
-//(ayothana Field 02)?
-ayo_fild02.gat,0,0,0,0 monster Coco 1104,25,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Yoyo 1057,20,0,0,0
-ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,20,0,0,0
+//===== eAthena Script =======================================
+//= Ayothana Field Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+// Mob IDs are right, need to check the amount, spawntime, etc.
+//(ayothana Field 01)?
+ayo_fild01.gat,0,0,0,0 monster Smokie 1056,20,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Yoyo 1057,20,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Leaf Cat 1586,20,0,0,0
+ayo_fild01.gat,0,0,0,0 monster Coco 1104,25,0,0,0
+
+//(ayothana Field 02)?
+ayo_fild02.gat,0,0,0,0 monster Coco 1104,25,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Yoyo 1057,20,0,0,0
+ayo_fild02.gat,0,0,0,0 monster Leaf Cat 1586,20,0,0,0
ayo_fild02.gat,0,0,0,0 monster Smokie 1056,20,0,0,0 \ No newline at end of file
diff --git a/npc/mobs/fields/comodo.txt b/npc/mobs/fields/comodo.txt
index 13ca8ba29..71ec603d0 100644
--- a/npc/mobs/fields/comodo.txt
+++ b/npc/mobs/fields/comodo.txt
@@ -1,151 +1,151 @@
-//===== eAthena Script =======================================
-//= Comodo Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(cmd_fild01.gat)*
-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 Poison Spore 1077,20,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 Blue Plant 1079,6,1800000,1800000,1
-cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,1800000,1
-cmd_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,1800000,1
-
-//(cmd_fild02.gat)*
-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_fild02.gat,342,134,50,50 monster Alligator 1271,5,0,0,0
-cmd_fild02.gat,122,119,50,40 monster Alligator 1271,5,0,0,0
-cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,7,60000,0,0
-cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,8,180000,0,0
-cmd_fild02.gat,0,0,0,0 monster Raggler 1254,27,0,0,0
-cmd_fild02.gat,94,85,40,80 monster Raggler 1254,5,60000,0,0
-cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
-cmd_fild02.gat,200,130,150,50 monster Aster 1266,7,0,0,0
-cmd_fild02.gat,73,100,40,100 monster Aster 1266,3,0,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_fild03.gat)*
-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 Toad 1089,1,1800000,1500000,0
-cmd_fild03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,1800000,1
-cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,2000000,0
-
-//(cmd_fild04.gat)*
-cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
-cmd_fild04.gat,296,311,100,100 monster Alligator 1271,13,0,0,0
-cmd_fild04.gat,93,222,100,100 monster Alligator 1271,13,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Alligator 1271,14,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 Crab 1073,20,0,0,0
-cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
-cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
-
-//(cmd_fild05.gat)*
-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 Pest 1256,20,0,0,0
-cmd_fild05.gat,206,98,20,50 monster Frilldora 1119,7,60000,0,0
-cmd_fild05.gat,263,274,50,40 monster Frilldora 1119,8,60000,0,0
-cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,1800000,1
-cmd_fild05.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,1800000,1
-cmd_fild05.gat,0,0,0,0 monster Yellow Plant 1081,6,360000,180000,1
-
-//(cmd_fild06.gat)*
-cmd_fild06.gat,0,0,0,0 monster Stem Worm 1215,55,0,0,0
-cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,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,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
-cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
-cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
-cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
-cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
-cmd_fild06.gat,244,110,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,279,199,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,284,186,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,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,340,334,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,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
-cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,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,1800000,0,0
-cmd_fild06.gat,0,0,0,0 monster Yellow Plant 1081,4,360000,180000,1
-
-//(cmd_fild07.gat)*
-cmd_fild07.gat,101,176,60,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,241,106,40,90 monster Raggler 1254,1,180000,0,0
-cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
-cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
-cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
-cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
-cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
-cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
-cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
-cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-
-//(cmd_fild08.gat)*
-cmd_fild08.gat,0,0,0,0 monster Sidewinder 1037,3,0,0,0
-cmd_fild08.gat,130,192,110,150 monster Sidewinder 1037,15,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Sidewinder 1037,2,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Stem Worm 1215,25,0,0,0
-cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
-cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,10,60000,0,0
-cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,9,0,0,0
-cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,10,0,0,0
-cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,9,0,0,0
-cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,157,329,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,175,367,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,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
-cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,7,60000,0,0
-cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,18,0,0,0
-cmd_fild08.gat,52,238,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,73,132,40,100 monster Kobold Archer 1282,7,0,0,0
-cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,37,129,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,55,45,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,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
-cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
-cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
-cmd_fild08.gat,0,0,0,0 monster Green Plant 1080,8,1800000,1800000,1
-cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
-
-//(cmd_fild09.gat)*
-cmd_fild09.gat,0,0,0,0 monster Hode 1127,3,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 Condor 1009,60,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 Gargoyle 1253,2,180000,1800000,0
+//===== eAthena Script =======================================
+//= Comodo Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(cmd_fild01.gat)*
+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 Poison Spore 1077,20,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 Blue Plant 1079,6,1800000,1800000,1
+cmd_fild01.gat,0,0,0,0 monster Green Plant 1080,5,1800000,1800000,1
+cmd_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,1800000,1
+
+//(cmd_fild02.gat)*
+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_fild02.gat,342,134,50,50 monster Alligator 1271,5,0,0,0
+cmd_fild02.gat,122,119,50,40 monster Alligator 1271,5,0,0,0
+cmd_fild02.gat,279,78,100,20 monster Cornutus 1067,7,60000,0,0
+cmd_fild02.gat,95,89,40,80 monster Cornutus 1067,8,180000,0,0
+cmd_fild02.gat,0,0,0,0 monster Raggler 1254,27,0,0,0
+cmd_fild02.gat,94,85,40,80 monster Raggler 1254,5,60000,0,0
+cmd_fild02.gat,0,0,0,0 monster Crab 1073,20,0,0,0
+cmd_fild02.gat,200,130,150,50 monster Aster 1266,7,0,0,0
+cmd_fild02.gat,73,100,40,100 monster Aster 1266,3,0,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_fild03.gat)*
+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 Toad 1089,1,1800000,1500000,0
+cmd_fild03.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,1800000,1
+cmd_fild03.gat,0,0,0,0 monster Mutant Dragonoid 1262,1,3600000,2000000,0
+
+//(cmd_fild04.gat)*
+cmd_fild04.gat,221,120,120,40 monster Sea Otter 1323,20,0,0,0
+cmd_fild04.gat,296,311,100,100 monster Alligator 1271,13,0,0,0
+cmd_fild04.gat,93,222,100,100 monster Alligator 1271,13,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Alligator 1271,14,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 Crab 1073,20,0,0,0
+cmd_fild04.gat,221,120,120,40 monster Aster 1266,45,0,0,0
+cmd_fild04.gat,0,0,0,0 monster Shellfish 1074,20,0,0,0
+
+//(cmd_fild05.gat)*
+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 Pest 1256,20,0,0,0
+cmd_fild05.gat,206,98,20,50 monster Frilldora 1119,7,60000,0,0
+cmd_fild05.gat,263,274,50,40 monster Frilldora 1119,8,60000,0,0
+cmd_fild05.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+cmd_fild05.gat,0,0,0,0 monster Green Plant 1080,5,1800000,1800000,1
+cmd_fild05.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,1800000,1
+cmd_fild05.gat,0,0,0,0 monster Yellow Plant 1081,6,360000,180000,1
+
+//(cmd_fild06.gat)*
+cmd_fild06.gat,0,0,0,0 monster Stem Worm 1215,55,0,0,0
+cmd_fild06.gat,244,113,0,0 monster Kobold Archer 1282,1,180000,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,290,164,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild06.gat,314,267,0,0 monster Kobold Archer 1282,1,180000,0,0
+cmd_fild06.gat,318,146,120,80 monster Kobold Archer 1282,7,0,0,0
+cmd_fild06.gat,357,299,80,70 monster Kobold Archer 1282,5,0,0,0
+cmd_fild06.gat,100,265,10,40 monster Goblin Archer 1258,3,130000,0,0
+cmd_fild06.gat,184,126,0,0 monster Goblin Archer 1258,1,180000,0,0
+cmd_fild06.gat,244,110,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,279,199,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,284,186,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,307,97,70,200 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,340,334,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,355,294,80,70 monster Goblin Archer 1258,7,0,0,0
+cmd_fild06.gat,365,342,0,0 monster Goblin Archer 1258,1,180000,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,1800000,0,0
+cmd_fild06.gat,0,0,0,0 monster Yellow Plant 1081,4,360000,180000,1
+
+//(cmd_fild07.gat)*
+cmd_fild07.gat,101,176,60,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,241,106,40,90 monster Raggler 1254,1,180000,0,0
+cmd_fild07.gat,323,310,60,60 monster Raggler 1254,1,60000,0,0
+cmd_fild07.gat,100,175,60,90 monster Crab 1073,2,60000,0,0
+cmd_fild07.gat,240,107,40,90 monster Crab 1073,3,60000,0,0
+cmd_fild07.gat,102,177,60,90 monster Aster 1266,3,60000,0,0
+cmd_fild07.gat,242,108,40,90 monster Aster 1266,2,60000,0,0
+cmd_fild07.gat,104,180,40,90 monster Shellfish 1074,3,60000,0,0
+cmd_fild07.gat,239,105,40,90 monster Shellfish 1074,2,60000,0,0
+cmd_fild07.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+
+//(cmd_fild08.gat)*
+cmd_fild08.gat,0,0,0,0 monster Sidewinder 1037,3,0,0,0
+cmd_fild08.gat,130,192,110,150 monster Sidewinder 1037,15,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Sidewinder 1037,2,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Stem Worm 1215,25,0,0,0
+cmd_fild08.gat,326,258,50,110 monster Sandman 1165,15,0,0,0
+cmd_fild08.gat,127,279,30,50 monster Kobold Archer 1282,10,60000,0,0
+cmd_fild08.gat,130,192,110,150 monster Kobold Archer 1282,9,0,0,0
+cmd_fild08.gat,146,136,30,80 monster Kobold Archer 1282,10,0,0,0
+cmd_fild08.gat,146,136,30,90 monster Kobold Archer 1282,9,0,0,0
+cmd_fild08.gat,150,320,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,157,329,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,175,367,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,195,174,0,0 monster Kobold Archer 1282,1,190000,0,0
+cmd_fild08.gat,272,175,40,2 monster Kobold Archer 1282,7,60000,0,0
+cmd_fild08.gat,326,258,50,110 monster Kobold Archer 1282,18,0,0,0
+cmd_fild08.gat,52,238,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,73,132,40,100 monster Kobold Archer 1282,7,0,0,0
+cmd_fild08.gat,104,313,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,130,192,110,150 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,177,210,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,182,205,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,194,291,25,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,37,129,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,55,45,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,73,132,40,100 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,80,348,60,40 monster Goblin Archer 1258,5,0,0,0
+cmd_fild08.gat,98,307,0,0 monster Goblin Archer 1258,1,150000,0,0
+cmd_fild08.gat,0,0,0,0 monster Drops 1113,10,0,0,0
+cmd_fild08.gat,0,0,0,0 monster Green Plant 1080,8,1800000,1800000,1
+cmd_fild08.gat,0,0,0,0 monster Gryphon 1259,1,3600000,1800000,0
+
+//(cmd_fild09.gat)*
+cmd_fild09.gat,0,0,0,0 monster Hode 1127,3,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 Condor 1009,60,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 Gargoyle 1253,2,180000,1800000,0
diff --git a/npc/mobs/fields/gefenia.txt b/npc/mobs/fields/gefenia.txt
index 0c20a9826..04ee95355 100644
--- a/npc/mobs/fields/gefenia.txt
+++ b/npc/mobs/fields/gefenia.txt
@@ -1,49 +1,49 @@
-//===== eAthena Script =======================================
-//= Gefenia Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//gefenia01.gat
-gefenia01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-gefenia01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-gefenia01.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
-gefenia01.gat,0,0,0,0 monster Argos 1100,25,0,0,0
-gefenia01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
-
-//gefenia02.gat
-gefenia02.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-gefenia02.gat,0,0,0,0 monster Argos 1100,15,0,0,0
-gefenia02.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
-gefenia02.gat,0,0,0,0 monster Jakk 1130,20,300000,100000,0
-gefenia02.gat,0,0,0,0 monster Blue Plant 1079,10,300000,100000,1
-gefenia02.gat,0,0,0,0 monster Myst 1151,10,0,0,0
-gefenia02.gat,0,0,0,0 monster Nightmare 1061,8,300000,100000,0
-
-//gefenia03.gat
-gefenia03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,0
-gefenia03.gat,0,0,0,0 monster Deviruchi 1109,15,0,0,0
-gefenia03.gat,0,0,0,0 monster Raydric 1163,15,0,0,0
-gefenia03.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
-gefenia03.gat,0,0,0,0 monster Joker 1131,15,300000,100000,0
-gefenia03.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-gefenia03.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
-
-//gefenia04.gat
-gefenia04.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
-gefenia04.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
-gefenia04.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
-gefenia04.gat,0,0,0,0 monster Argos 1100,25,0,0,0
-gefenia04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
-gefenia04.gat,0,0,0,0 monster Jakk 1130,10,300000,100000,0
-gefenia04.gat,0,0,0,0 monster Blue Plant 1079,10,300000,100000,1
-gefenia04.gat,0,0,0,0 monster Myst 1151,10,0,0,0
-gefenia04.gat,0,0,0,0 monster Nightmare 1061,8,300000,100000,0
+//===== eAthena Script =======================================
+//= Gefenia Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//gefenia01.gat
+gefenia01.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+gefenia01.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+gefenia01.gat,0,0,0,0 monster Poison Spore 1077,40,0,0,0
+gefenia01.gat,0,0,0,0 monster Argos 1100,25,0,0,0
+gefenia01.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
+
+//gefenia02.gat
+gefenia02.gat,0,0,0,0 monster Familiar 1005,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Dustiness 1114,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+gefenia02.gat,0,0,0,0 monster Argos 1100,15,0,0,0
+gefenia02.gat,0,0,0,0 monster Whisper 1179,30,0,0,0
+gefenia02.gat,0,0,0,0 monster Jakk 1130,20,300000,100000,0
+gefenia02.gat,0,0,0,0 monster Blue Plant 1079,10,300000,100000,1
+gefenia02.gat,0,0,0,0 monster Myst 1151,10,0,0,0
+gefenia02.gat,0,0,0,0 monster Nightmare 1061,8,300000,100000,0
+
+//gefenia03.gat
+gefenia03.gat,0,0,0,0 monster Doppelganger 1046,1,7200000,3600000,0
+gefenia03.gat,0,0,0,0 monster Deviruchi 1109,15,0,0,0
+gefenia03.gat,0,0,0,0 monster Raydric 1163,15,0,0,0
+gefenia03.gat,0,0,0,0 monster Raydric Archer 1276,20,0,0,0
+gefenia03.gat,0,0,0,0 monster Joker 1131,15,300000,100000,0
+gefenia03.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+gefenia03.gat,0,0,0,0 monster Whisper 1179,20,0,0,0
+
+//gefenia04.gat
+gefenia04.gat,0,0,0,0 monster Familiar 1005,20,0,0,0
+gefenia04.gat,0,0,0,0 monster Dustiness 1114,20,0,0,0
+gefenia04.gat,0,0,0,0 monster Poison Spore 1077,20,0,0,0
+gefenia04.gat,0,0,0,0 monster Argos 1100,25,0,0,0
+gefenia04.gat,0,0,0,0 monster Whisper 1179,10,0,0,0
+gefenia04.gat,0,0,0,0 monster Jakk 1130,10,300000,100000,0
+gefenia04.gat,0,0,0,0 monster Blue Plant 1079,10,300000,100000,1
+gefenia04.gat,0,0,0,0 monster Myst 1151,10,0,0,0
+gefenia04.gat,0,0,0,0 monster Nightmare 1061,8,300000,100000,0
diff --git a/npc/mobs/fields/geffen.txt b/npc/mobs/fields/geffen.txt
index c64d2093a..db662dbb2 100644
--- a/npc/mobs/fields/geffen.txt
+++ b/npc/mobs/fields/geffen.txt
@@ -1,195 +1,195 @@
-//===== eAthena Script =======================================
-//= Geffen Field Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(gef_fild00.gat)*
-gef_fild00.gat,0,0,0,0 monster Poporing 1031,20,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 Fabre 1007,80,0,0,0
-gef_fild00.gat,0,0,0,0 monster Poring 1002,80,0,0,0
-gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
-gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
-
-//(gef_fild01.gat)*
-gef_fild01.gat,0,0,0,0 monster Poporing 1031,40,0,0,0
-gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,80,0,0,0
-gef_fild01.gat,0,0,0,0 monster Toad 1089,1,1800000,200000,1
-gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
-
-//(gef_fild02.gat)*
-gef_fild02.gat,0,0,0,0 monster Choco 1214,1,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 Yoyo 1057,10,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 Coco 1104,20,0,0,0
-gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
-gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,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_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_fild03.gat)*
-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 Orc Warrior 1023,30,0,0,0
-gef_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-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,169,92,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,216,135,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,282,192,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,304,202,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,326,79,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,350,247,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,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
-gef_fild03.gat,45,350,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,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_fild04.gat)*
-gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,30,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 Poring 1002,40,0,0,0
-gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
-gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
-
-//(gef_fild05.gat)*
-gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,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 Dustiness 1114,40,0,0,0
-gef_fild05.gat,0,0,0,0 monster Poring 1002,50,0,0,0
-gef_fild05.gat,108,317,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,130,293,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,170,337,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,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,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,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_fild06.gat)*
-gef_fild06.gat,0,0,0,0 monster Sky Petite 1156,30,60000,30000,0
-gef_fild06.gat,0,0,0,0 monster Kobold 3 1135,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 2 1134,10,0,0,0
-gef_fild06.gat,0,0,0,0 monster Kobold 1 1133,20,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 Poporing 1031,30,0,0,0
-gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
-
-//(gef_fild07.gat)*
-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_fild07.gat,0,0,0,0 monster Poring 1002,70,0,0,0
-gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
-gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
-gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
-gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
-
-//(gef_fild08.gat)*
-gef_fild08.gat,0,0,0,0 monster Kobold 3 1135,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 2 1134,40,0,0,0
-gef_fild08.gat,0,0,0,0 monster Kobold 1 1133,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 Poison Spore 1077,20,0,0,0
-gef_fild08.gat,0,0,0,0 monster Steel ChonChon 1042,80,0,0,0
-gef_fild08.gat,111,319,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,162,247,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,344,78,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,65,341,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_fild09.gat)*
-gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,20,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 Ambernite 1094,70,0,0,0
-gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,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,258,24,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,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,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//(gef_fild10.gat)*
-gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
-gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
-gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
-gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
-gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
-
-//(gef_fild11.gat)*
-gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,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 Rotar Zairo 1392,10,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 1 1122,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 2 1123,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 3 1124,30,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 4 1125,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Goblin 5 1126,20,0,0,0
-gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
-gef_fild11.gat,101,277,4,1 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,176,288,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,253,357,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,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
-
-//(gef_fild12.gat)*
-gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,240000,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 Kobold 3 1135,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 2 1134,30,0,0,0
-gef_fild12.gat,0,0,0,0 monster Kobold 1 1133,20,0,0,0
-gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-
-//(gef_fild13.gat)*
-gef_fild13.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
-gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gef_fild13.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
-
-//(gef_fild14.gat)
-gef_fild14.gat,0,0,0,0 monster High Orc 1213,40,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 Orc Lady 1273,40,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
-gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,3600000,0
+//===== eAthena Script =======================================
+//= Geffen Field Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(gef_fild00.gat)*
+gef_fild00.gat,0,0,0,0 monster Poporing 1031,20,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 Fabre 1007,80,0,0,0
+gef_fild00.gat,0,0,0,0 monster Poring 1002,80,0,0,0
+gef_fild00.gat,124,321,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,95,128,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild00.gat,54,186,5,5 monster Green Plant 1080,3,360000,180000,1
+gef_fild00.gat,54,212,5,5 monster Green Plant 1080,3,360000,180000,1
+
+//(gef_fild01.gat)*
+gef_fild01.gat,0,0,0,0 monster Poporing 1031,40,0,0,0
+gef_fild01.gat,0,0,0,0 monster Roda Frog 1012,80,0,0,0
+gef_fild01.gat,0,0,0,0 monster Toad 1089,1,1800000,200000,1
+gef_fild01.gat,215,225,10,10 monster Green Plant 1080,5,360000,180000,1
+
+//(gef_fild02.gat)*
+gef_fild02.gat,0,0,0,0 monster Choco 1214,1,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 Yoyo 1057,10,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 Coco 1104,20,0,0,0
+gef_fild02.gat,207,214,1,1 monster Blue Plant 1079,1,360000,180000,1
+gef_fild02.gat,215,209,2,1 monster Blue Plant 1079,2,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_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_fild03.gat)*
+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 Orc Warrior 1023,30,0,0,0
+gef_fild03.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+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,169,92,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,216,135,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,282,192,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,304,202,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,326,79,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,350,247,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,44,133,3,3 monster Green Plant 1080,1,180000,90000,1
+gef_fild03.gat,45,350,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,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_fild04.gat)*
+gef_fild04.gat,0,0,0,0 monster Roda Frog 1012,30,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 Poring 1002,40,0,0,0
+gef_fild04.gat,152,82,5,2 monster Green Plant 1080,3,360000,180000,1
+gef_fild04.gat,224,82,5,2 monster Green Plant 1080,3,360000,180000,1
+
+//(gef_fild05.gat)*
+gef_fild05.gat,0,0,0,0 monster Wild Rose 1261,50,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 Dustiness 1114,40,0,0,0
+gef_fild05.gat,0,0,0,0 monster Poring 1002,50,0,0,0
+gef_fild05.gat,108,317,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,130,293,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,170,337,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,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,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,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_fild06.gat)*
+gef_fild06.gat,0,0,0,0 monster Sky Petite 1156,30,60000,30000,0
+gef_fild06.gat,0,0,0,0 monster Kobold 3 1135,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 2 1134,10,0,0,0
+gef_fild06.gat,0,0,0,0 monster Kobold 1 1133,20,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 Poporing 1031,30,0,0,0
+gef_fild06.gat,0,0,0,0 monster Shining Plant 1083,4,1800000,900000,1
+
+//(gef_fild07.gat)*
+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_fild07.gat,0,0,0,0 monster Poring 1002,70,0,0,0
+gef_fild07.gat,269,289,0,0 monster Blue Plant 1079,1,900000,450000,1
+gef_fild07.gat,185,247,0,0 monster Shining Plant 1083,1,1800000,900000,1
+gef_fild07.gat,122,221,0,0 monster Green Plant 1080,3,360000,180000,1
+gef_fild07.gat,269,289,3,3 monster Green Plant 1080,3,360000,180000,1
+
+//(gef_fild08.gat)*
+gef_fild08.gat,0,0,0,0 monster Kobold 3 1135,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 2 1134,40,0,0,0
+gef_fild08.gat,0,0,0,0 monster Kobold 1 1133,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 Poison Spore 1077,20,0,0,0
+gef_fild08.gat,0,0,0,0 monster Steel ChonChon 1042,80,0,0,0
+gef_fild08.gat,111,319,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,162,247,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,344,78,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,65,341,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_fild09.gat)*
+gef_fild09.gat,0,0,0,0 monster Poison Spore 1077,20,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 Ambernite 1094,70,0,0,0
+gef_fild09.gat,277,201,5,5 monster Blue Plant 1079,3,900000,450000,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,258,24,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,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,51,43,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//(gef_fild10.gat)*
+gef_fild10.gat,0,0,0,0 monster Orc Lady 1273,40,0,0,0
+gef_fild10.gat,0,0,0,0 monster Orc Warrior 1023,50,0,0,0
+gef_fild10.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild10.gat,287,61,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,46,350,5,5 monster Blue Plant 1079,3,900000,450000,1
+gef_fild10.gat,0,0,0,0 monster Orc Lord 1190,1,7200000,3600000,0
+gef_fild10.gat,300,253,5,5 monster Green Plant 1080,3,360000,180000,1
+
+//(gef_fild11.gat)*
+gef_fild11.gat,0,0,0,0 monster Goblin Leader 1299,1,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 Rotar Zairo 1392,10,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 1 1122,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 2 1123,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 3 1124,30,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 4 1125,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Goblin 5 1126,20,0,0,0
+gef_fild11.gat,0,0,0,0 monster Poporing 1031,15,0,0,0
+gef_fild11.gat,101,277,4,1 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,176,288,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,253,357,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,283,100,4,1 monster Black Mushroom 1084,3,360000,180000,1
+
+//(gef_fild12.gat)*
+gef_fild12.gat,0,0,0,0 monster Kobold Leader 1296,1,240000,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 Kobold 3 1135,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 2 1134,30,0,0,0
+gef_fild12.gat,0,0,0,0 monster Kobold 1 1133,20,0,0,0
+gef_fild12.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+
+//(gef_fild13.gat)*
+gef_fild13.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
+gef_fild13.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gef_fild13.gat,0,0,0,0 monster Ambernite 1094,30,0,0,0
+
+//(gef_fild14.gat)
+gef_fild14.gat,0,0,0,0 monster High Orc 1213,40,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 Orc Lady 1273,40,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Warrior 1023,20,0,0,0
+gef_fild14.gat,0,0,0,0 monster Orc Hero 1087,1,3600000,3600000,0
diff --git a/npc/mobs/fields/gonryun.txt b/npc/mobs/fields/gonryun.txt
index 051650b9d..0711c816a 100644
--- a/npc/mobs/fields/gonryun.txt
+++ b/npc/mobs/fields/gonryun.txt
@@ -1,20 +1,20 @@
-//===== eAthena Script =======================================
-//= Gon Ryun Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(gon_fild01.gat)*
-gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,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 Zipper Bear 1417,20,0,0,0
-gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,1
-gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,1
-gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,60000,120000,1
+//===== eAthena Script =======================================
+//= Gon Ryun Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(gon_fild01.gat)*
+gon_fild01.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Baby Leopard 1415,40,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 Zipper Bear 1417,20,0,0,0
+gon_fild01.gat,0,0,0,0 monster Green Plant 1080,5,0,0,1
+gon_fild01.gat,0,0,0,0 monster Shining Plant 1083,1,0,0,1
+gon_fild01.gat,0,0,0,0 monster Hermit Plant 1413,2,60000,120000,1
diff --git a/npc/mobs/fields/louyang.txt b/npc/mobs/fields/louyang.txt
index 4c8a445d8..dae40366e 100644
--- a/npc/mobs/fields/louyang.txt
+++ b/npc/mobs/fields/louyang.txt
@@ -1,15 +1,15 @@
-//===== eAthena Script =======================================
-//= Louyang Fields Monster Spawn Script
-//===== By: ==================================================
-//= Evera/Lorri
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= May be more
-//============================================================
-
-//lou_fild01)?
-lou_fild01.gat,0,0,00 monster Mantis 1139,25,0,0,0
-lou_fild01.gat,0,0,00 monster Civil Servant 1513,25,0,0,0
+//===== eAthena Script =======================================
+//= Louyang Fields Monster Spawn Script
+//===== By: ==================================================
+//= Evera/Lorri
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= May be more
+//============================================================
+
+//lou_fild01)?
+lou_fild01.gat,0,0,00 monster Mantis 1139,25,0,0,0
+lou_fild01.gat,0,0,00 monster Civil Servant 1513,25,0,0,0
diff --git a/npc/mobs/fields/lutie.txt b/npc/mobs/fields/lutie.txt
index de58b998c..ccb62a3a2 100644
--- a/npc/mobs/fields/lutie.txt
+++ b/npc/mobs/fields/lutie.txt
@@ -1,16 +1,16 @@
-//===== eAthena Script =======================================
-//= Lutie Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//xmas_fild01
-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 1252,1,3600000,7200000,0
+//===== eAthena Script =======================================
+//= Lutie Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//xmas_fild01
+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 1252,1,3600000,7200000,0
diff --git a/npc/mobs/fields/mjolnir.txt b/npc/mobs/fields/mjolnir.txt
index 1854174cd..0f78d9642 100644
--- a/npc/mobs/fields/mjolnir.txt
+++ b/npc/mobs/fields/mjolnir.txt
@@ -1,226 +1,226 @@
-//===== eAthena Script =======================================
-//= Mt. Mjolnir Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(mjolnir_01.gat)*
-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,311,271,25,25 monster Blue Plant 1079,5,360000,180000,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,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,0,0,0,0 monster Caramel 1103,40,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 Horn 1128,20,0,0,0
-
-//(mjolnir_02.gat)*
-mjolnir_02.gat,0,0,0,0 monster Earth Petite 1155,50,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Flora 1118,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 Poporing 1031,10,0,0,0
-mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
-mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
-mjolnir_02.gat,133,80,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,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,318,205,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,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
-mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,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,107,128,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,191,71,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,204,263,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,243,208,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,273,240,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,289,276,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,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,325,146,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,349,45,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,180,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,270,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//(mjolnir_03.gat)*
-mjolnir_03.gat,0,0,0,0 monster Sky Petite 1156,70,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 Flora 1118,10,0,0,0
-mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,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 Poporing 1031,10,0,0,0
-mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_03.gat,135,94,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,199,97,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,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,324,355,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,356,213,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,77,271,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.gat)*
-mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,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 Flora 1118,30,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 Hornet 1004,70,0,0,0
-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,0
-mjolnir_04.gat,107,357,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,173,369,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,177,34,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,269,39,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,31,194,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,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,42,252,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,64,323,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,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//(mjolnir_05.gat)*
-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,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
-mjolnir_05.gat,200,240,40,40 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_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-
-//(mjolnir_06.gat)*
-mjolnir_06.gat,0,0,0,0 monster Caramel 1103,30,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 Stainer 1174,70,0,0,0
-mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
-mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
-mjolnir_06.gat,279,174,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,304,98,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,45,345,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,69,225,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_07.gat)*
-mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,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 Coco 1104,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 Ambernite 1094,30,0,0,0
-mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
-mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,1800000,900000,1
-mjolnir_07.gat,140,179,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,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,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_07.gat,314,133,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,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
-mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//(mjolnir_08.gat)*
-mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
-mjolnir_08.gat,0,0,0,0 monster Mantis 1139,60,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,840000,420000,1
-mjolnir_08.gat,149,328,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,176,153,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,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
-mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//(mjolnir_09.gat)*
-mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
-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 Poporing 1031,30,0,0,0
-mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
-mjolnir_09.gat,120,126,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_09.gat,139,84,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,199,344,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,205,352,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,212,312,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_10.gat)*
-mjolnir_10.gat,0,0,0,0 monster Earth Petite 1155,10,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Mantis 1139,30,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,70,0,0,0
-mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,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.gat)*
-mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,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 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 Mandragora 1020,50,0,0,0
-mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,900000,900000,1
-mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,900000,900000,1
-mjolnir_11.gat,112,276,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,129,135,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,146,215,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,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_12.gat)*
-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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(mjolnir_01.gat)*
+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,311,271,25,25 monster Blue Plant 1079,5,360000,180000,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,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,0,0,0,0 monster Caramel 1103,40,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 Horn 1128,20,0,0,0
+
+//(mjolnir_02.gat)*
+mjolnir_02.gat,0,0,0,0 monster Earth Petite 1155,50,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Flora 1118,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 Poporing 1031,10,0,0,0
+mjolnir_02.gat,0,0,0,0 monster Hornet 1004,30,0,0,0
+mjolnir_02.gat,122,195,0,0 monster Red Plant 1078,1,180000,90000,1
+mjolnir_02.gat,133,80,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,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,318,205,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,188,192,10,10 monster Blue Plant 1079,2,360000,180000,1
+mjolnir_02.gat,273,74,0,0 monster Blue Plant 1079,1,360000,180000,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,107,128,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,191,71,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,204,263,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,243,208,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,273,240,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,289,276,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,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,325,146,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,349,45,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,180,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,270,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//(mjolnir_03.gat)*
+mjolnir_03.gat,0,0,0,0 monster Sky Petite 1156,70,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 Flora 1118,10,0,0,0
+mjolnir_03.gat,0,0,0,0 monster Argos 1100,20,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 Poporing 1031,10,0,0,0
+mjolnir_03.gat,128,319,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_03.gat,135,94,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,199,97,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,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,324,355,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,356,213,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,77,271,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.gat)*
+mjolnir_04.gat,0,0,0,0 monster Argiope 1099,20,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 Flora 1118,30,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 Hornet 1004,70,0,0,0
+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,0
+mjolnir_04.gat,107,357,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,173,369,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,177,34,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,269,39,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,31,194,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,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,42,252,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,64,323,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,76,53,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//(mjolnir_05.gat)*
+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,134,103,20,20 monster Blue Plant 1079,3,360000,180000,1
+mjolnir_05.gat,200,240,40,40 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_05.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+
+//(mjolnir_06.gat)*
+mjolnir_06.gat,0,0,0,0 monster Caramel 1103,30,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 Stainer 1174,70,0,0,0
+mjolnir_06.gat,0,0,0,0 monster Poporing 1031,20,0,0,0
+mjolnir_06.gat,162,255,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,162,285,0,0 monster Blue Plant 1079,1,360000,180000,1
+mjolnir_06.gat,279,174,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,304,98,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,45,345,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,69,225,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_07.gat)*
+mjolnir_07.gat,0,0,0,0 monster Poison Spore 1077,60,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 Coco 1104,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 Ambernite 1094,30,0,0,0
+mjolnir_07.gat,0,0,0,0 monster Hornet 1004,20,0,0,0
+mjolnir_07.gat,249,214,0,0 monster Blue Plant 1079,2,1800000,900000,1
+mjolnir_07.gat,140,179,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,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,299,145,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_07.gat,314,133,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,217,185,0,0 monster Red Mushroom 1085,1,180000,90000,1
+mjolnir_07.gat,245,168,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//(mjolnir_08.gat)*
+mjolnir_08.gat,0,0,0,0 monster Argiope 1099,30,0,0,0
+mjolnir_08.gat,0,0,0,0 monster Mantis 1139,60,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,840000,420000,1
+mjolnir_08.gat,149,328,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,176,153,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,207,232,0,0 monster Green Plant 1080,1,180000,90000,1
+mjolnir_08.gat,207,83,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//(mjolnir_09.gat)*
+mjolnir_09.gat,0,0,0,0 monster Horn 1128,100,0,0,0
+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 Poporing 1031,30,0,0,0
+mjolnir_09.gat,0,0,0,0 monster Wolf 1013,40,0,0,0
+mjolnir_09.gat,120,126,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_09.gat,139,84,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,199,344,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,205,352,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,212,312,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_10.gat)*
+mjolnir_10.gat,0,0,0,0 monster Earth Petite 1155,10,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Mantis 1139,30,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,70,0,0,0
+mjolnir_10.gat,0,0,0,0 monster Poporing 1031,30,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.gat)*
+mjolnir_11.gat,0,0,0,0 monster Argiope 1099,10,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 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 Mandragora 1020,50,0,0,0
+mjolnir_11.gat,126,93,0,0 monster Blue Plant 1079,1,900000,900000,1
+mjolnir_11.gat,332,327,0,0 monster Blue Plant 1079,1,900000,900000,1
+mjolnir_11.gat,112,276,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,129,135,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,146,215,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,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_12.gat)*
+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 07cabb55a..f01a85702 100644
--- a/npc/mobs/fields/morocc.txt
+++ b/npc/mobs/fields/morocc.txt
@@ -1,256 +1,256 @@
-//===== eAthena Script =======================================
-//= Morocc Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚P(moc_fild01.gat)*
-moc_fild01.gat,0,0,0,0 monster Desert Wolf Puppy 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 PecoPeco 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
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚Q(moc_fild02.gat)*
-moc_fild02.gat,0,0,0,0 monster PecoPeco 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 PecoPeco 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,132,307,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,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,89,315,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,99,261,0,0 monster Yellow Plant 1081,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,313,149,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_fild02.gat,342,267,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,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚R(moc_fild03.gat)*
-moc_fild03.gat,0,0,0,0 monster Greatest General 1277,40,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 Elder Willow 1033,80,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 Willow 1010,30,0,0,0
-moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,1800000,900000,0
-moc_fild03.gat,108,199,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_fild03.gat,213,201,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,77,311,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
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚S(moc_fild04.gat)*
-moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,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 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 Deniro 1105,20,0,0,0
-moc_fild04.gat,0,0,0,0 monster Piere 1160,20,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 Ant Egg 1097,10,0,0,0
-moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚T(moc_fild05.gat)*
-moc_fild05.gat,0,0,0,0 monster Magnolia 1138,50,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 Metaller 1058,40,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,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚U(moc_fild06.gat)*
-moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,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 Deniro 1105,5,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 Muka 1055,30,0,0,0
-moc_fild06.gat,0,0,0,0 monster PecoPeco 1019,70,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 Ant Egg 1097,10,0,0,0
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚V(moc_fild07.gat)*
-moc_fild07.gat,0,0,0,0 monster Shell Picky 1050,30,0,0,0
-moc_fild07.gat,0,0,0,0 monster PecoPeco Egg 1047,50,0,0,0
-moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
-moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
-moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚W(moc_fild08.gat)*
-moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,40,0,0,0
-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 Anacondaq 1030,30,0,0,0
-moc_fild08.gat,0,0,0,0 monster Desert Wolf Puppy 1107,20,0,0,0
-moc_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚O‚X(moc_fild09.gat)*
-moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
-moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,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 Metaller 1058,70,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 Andre 1095,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,20,0,0,0
-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,332,341,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_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚O(moc_fild10.gat)*
-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,0,0,0,0 monster Shell Picky 1050,50,0,0,0
-moc_fild10.gat,0,0,0,0 monster PecoPeco 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 Drops 1113,30,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
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚P(moc_fild11.gat)*
-moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
-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 Deniro 1105,10,60000,30000,0
-moc_fild11.gat,0,0,0,0 monster Piere 1160,10,60000,30000,0
-moc_fild11.gat,0,0,0,0 monster Andre 1095,10,60000,30000,0
-moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
-moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚Q(moc_fild12.gat)*
-moc_fild12.gat,0,0,0,0 monster Shell 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 Drops 1113,35,0,0,0
-moc_fild12.gat,0,0,0,0 monster PecoPeco Egg 1047,35,0,0,0
-moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚R(moc_fild13.gat)*
-moc_fild13.gat,0,0,0,0 monster Sidewinder 1037,35,0,0,0
-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,35,0,0,0
-moc_fild13.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-moc_fild13.gat,0,0,0,0 monster Drops 1113,20,0,0,0
-moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,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,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
-moc_fild13.gat,84,329,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,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
-moc_fild13.gat,264,136,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,265,197,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,280,99,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,282,155,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,295,358,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,304,333,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,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚S(moc_fild14.gat)*
-moc_fild14.gat,0,0,0,0 monster Sidewinder 1037,20,0,0,0
-moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
-moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
-moc_fild14.gat,0,0,0,0 monster Desert Wolf Puppy 1107,40,0,0,0
-moc_fild14.gat,149,333,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_fild14.gat,165,282,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,85,271,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
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚T(moc_fild15.gat)*
-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 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 Andre 1095,40,0,0,0
-moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
-moc_fild15.gat,104,347,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,195,373,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_fild15.gat,341,164,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,370,85,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,46,250,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,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,0
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚U(moc_fild16.gat)*
-moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,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 Hode 1127,30,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
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚V(moc_fild17.gat)*
-moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
-moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,60000,30000,0
-moc_fild17.gat,0,0,0,0 monster Magnolia 1138,15,0,0,0
-moc_fild17.gat,0,0,0,0 monster Hode 1127,50,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 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 Andre 1095,10,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 Ant Egg 1097,10,0,0,0
-moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,1200000,600000,1
-moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,1800000,900000,1
-
-//ƒ\ƒOƒ‰ƒg»”™ ‚P‚W(moc_fild18.gat)*
-moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,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 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 Andre 1095,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster Steel ChonChon 1042,70,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 Ant Egg 1097,5,0,0,0
-moc_fild18.gat,0,0,0,0 monster ChonChon 1011,40,0,0,0
-moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,600000,300000,1
-moc_fild18.gat,0,0,0,0 monster Dragonfly 1091,1,3600000,1800000,0
-moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,3600000,1800000,0
+//===== eAthena Script =======================================
+//= Morocc Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚P(moc_fild01.gat)*
+moc_fild01.gat,0,0,0,0 monster Desert Wolf Puppy 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 PecoPeco 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
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚Q(moc_fild02.gat)*
+moc_fild02.gat,0,0,0,0 monster PecoPeco 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 PecoPeco 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,132,307,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,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,89,315,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,99,261,0,0 monster Yellow Plant 1081,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,313,149,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_fild02.gat,342,267,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,359,215,0,0 monster Green Plant 1080,1,180000,90000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚R(moc_fild03.gat)*
+moc_fild03.gat,0,0,0,0 monster Greatest General 1277,40,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 Elder Willow 1033,80,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 Willow 1010,30,0,0,0
+moc_fild03.gat,0,0,0,0 monster Vagabond Wolf 1092,1,1800000,900000,0
+moc_fild03.gat,108,199,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_fild03.gat,213,201,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,77,311,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
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚S(moc_fild04.gat)*
+moc_fild04.gat,0,0,0,0 monster Desert Wolf 1106,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 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 Deniro 1105,20,0,0,0
+moc_fild04.gat,0,0,0,0 monster Piere 1160,20,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 Ant Egg 1097,10,0,0,0
+moc_fild04.gat,313,84,10,10 monster Yellow Plant 1081,10,900000,450000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚T(moc_fild05.gat)*
+moc_fild05.gat,0,0,0,0 monster Magnolia 1138,50,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 Metaller 1058,40,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,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild05.gat,208,233,10,10 monster Yellow Plant 1081,5,360000,180000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚U(moc_fild06.gat)*
+moc_fild06.gat,0,0,0,0 monster Magnolia 1138,10,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 Deniro 1105,5,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 Muka 1055,30,0,0,0
+moc_fild06.gat,0,0,0,0 monster PecoPeco 1019,70,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 Ant Egg 1097,10,0,0,0
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚V(moc_fild07.gat)*
+moc_fild07.gat,0,0,0,0 monster Shell Picky 1050,30,0,0,0
+moc_fild07.gat,0,0,0,0 monster PecoPeco Egg 1047,50,0,0,0
+moc_fild07.gat,0,0,0,0 monster Picky 1049,30,0,0,0
+moc_fild07.gat,0,0,0,0 monster Drops 1113,70,0,0,0
+moc_fild07.gat,162,333,12,12 monster Yellow Plant 1081,5,360000,180000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚W(moc_fild08.gat)*
+moc_fild08.gat,0,0,0,0 monster Desert Wolf 1106,40,0,0,0
+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 Anacondaq 1030,30,0,0,0
+moc_fild08.gat,0,0,0,0 monster Desert Wolf Puppy 1107,20,0,0,0
+moc_fild08.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚O‚X(moc_fild09.gat)*
+moc_fild09.gat,0,0,0,0 monster Frilldora 1119,6,0,0,0
+moc_fild09.gat,0,0,0,0 monster Desert Wolf 1106,10,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 Metaller 1058,70,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 Andre 1095,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,20,0,0,0
+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,332,341,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_fild09.gat,64,78,5,5 monster Yellow Plant 1081,2,180000,90000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚O(moc_fild10.gat)*
+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,0,0,0,0 monster Shell Picky 1050,50,0,0,0
+moc_fild10.gat,0,0,0,0 monster PecoPeco 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 Drops 1113,30,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
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚P(moc_fild11.gat)*
+moc_fild11.gat,0,0,0,0 monster Magnolia 1138,20,0,0,0
+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 Deniro 1105,10,60000,30000,0
+moc_fild11.gat,0,0,0,0 monster Piere 1160,10,60000,30000,0
+moc_fild11.gat,0,0,0,0 monster Andre 1095,10,60000,30000,0
+moc_fild11.gat,0,0,0,0 monster Muka 1055,20,0,0,0
+moc_fild11.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild11.gat,197,216,0,0 monster Shining Plant 1083,1,1800000,900000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚Q(moc_fild12.gat)*
+moc_fild12.gat,0,0,0,0 monster Shell 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 Drops 1113,35,0,0,0
+moc_fild12.gat,0,0,0,0 monster PecoPeco Egg 1047,35,0,0,0
+moc_fild12.gat,181,336,40,20 monster Yellow Plant 1081,10,180000,90000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚R(moc_fild13.gat)*
+moc_fild13.gat,0,0,0,0 monster Sidewinder 1037,35,0,0,0
+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,35,0,0,0
+moc_fild13.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+moc_fild13.gat,0,0,0,0 monster Drops 1113,20,0,0,0
+moc_fild13.gat,101,185,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,101,297,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,106,258,5,5 monster Yellow Plant 1081,3,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,161,273,5,5 monster Yellow Plant 1081,3,180000,90000,1
+moc_fild13.gat,84,329,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,93,301,0,0 monster Yellow Plant 1081,1,180000,90000,1
+moc_fild13.gat,264,136,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,265,197,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,280,99,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,282,155,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,295,358,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,304,333,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,307,307,0,0 monster Red Mushroom 1085,1,180000,90000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚S(moc_fild14.gat)*
+moc_fild14.gat,0,0,0,0 monster Sidewinder 1037,20,0,0,0
+moc_fild14.gat,0,0,0,0 monster Desert Wolf 1106,80,0,0,0
+moc_fild14.gat,0,0,0,0 monster Magnolia 1138,25,0,0,0
+moc_fild14.gat,0,0,0,0 monster Desert Wolf Puppy 1107,40,0,0,0
+moc_fild14.gat,149,333,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_fild14.gat,165,282,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,85,271,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
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚T(moc_fild15.gat)*
+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 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 Andre 1095,40,0,0,0
+moc_fild15.gat,0,0,0,0 monster Ant Egg 1097,10,0,0,0
+moc_fild15.gat,104,347,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,195,373,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_fild15.gat,341,164,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,370,85,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,46,250,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,0,0,0,0 monster Phreeoni 1159,1,7200000,3600000,0
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚U(moc_fild16.gat)*
+moc_fild16.gat,0,0,0,0 monster Sandman 1165,70,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 Hode 1127,30,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
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚V(moc_fild17.gat)*
+moc_fild17.gat,0,0,0,0 monster Sandman 1165,5,0,0,0
+moc_fild17.gat,0,0,0,0 monster Frilldora 1119,15,60000,30000,0
+moc_fild17.gat,0,0,0,0 monster Magnolia 1138,15,0,0,0
+moc_fild17.gat,0,0,0,0 monster Hode 1127,50,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 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 Andre 1095,10,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 Ant Egg 1097,10,0,0,0
+moc_fild17.gat,144,151,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,243,138,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,335,191,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,347,224,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,359,258,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,40,258,0,0 monster Yellow Plant 1081,1,1200000,600000,1
+moc_fild17.gat,270,106,0,0 monster Blue Plant 1079,1,1800000,900000,1
+
+//ƒ\ƒOƒ‰ƒg»”™ ‚P‚W(moc_fild18.gat)*
+moc_fild18.gat,0,0,0,0 monster Magnolia 1138,25,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 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 Andre 1095,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster Steel ChonChon 1042,70,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 Ant Egg 1097,5,0,0,0
+moc_fild18.gat,0,0,0,0 monster ChonChon 1011,40,0,0,0
+moc_fild18.gat,119,285,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,135,119,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,143,352,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,230,144,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,325,207,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,325,272,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,71,210,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,72,333,0,0 monster Yellow Plant 1081,1,600000,300000,1
+moc_fild18.gat,0,0,0,0 monster Dragonfly 1091,1,3600000,1800000,0
+moc_fild18.gat,0,0,0,0 monster Hunter Fly 1035,1,3600000,1800000,0
diff --git a/npc/mobs/fields/niflheim.txt b/npc/mobs/fields/niflheim.txt
index 1dbe535ae..05909cec0 100644
--- a/npc/mobs/fields/niflheim.txt
+++ b/npc/mobs/fields/niflheim.txt
@@ -1,42 +1,42 @@
-//===== eAthena Script =======================================
-//= Niflheim Temporary Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 commented the town mobs
-//============================================================
-
-//niflheim
-//niflheim.gat,0,0,0,0 monster Lord Of Death 1373,1,3600000,1800000,1
-//niflheim.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-//niflheim.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
-//niflheim.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
-//niflheim.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
-//niflheim.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
-//niflheim.gat,0,0,0,0 monster Quve 1508,10,0,0,0
-//niflheim.gat,0,0,0,0 monster Lude 1509,20,0,0,0
-//niflheim.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
-
-//nif_fild01)?
-nif_fild01.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-nif_fild01.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
-nif_fild01.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
-nif_fild01.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
-nif_fild01.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
-nif_fild01.gat,0,0,0,0 monster Quve 1508,10,0,0,0
-nif_fild01.gat,0,0,0,0 monster Lude 1509,20,0,0,0
-nif_fild01.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
-
-//nif_fild02)?
-nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
-nif_fild02.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
-nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
-nif_fild02.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
-nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
-nif_fild02.gat,0,0,0,0 monster Quve 1508,10,0,0,0
-nif_fild02.gat,0,0,0,0 monster Lude 1509,20,0,0,0
-nif_fild02.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
+//===== eAthena Script =======================================
+//= Niflheim Temporary Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 commented the town mobs
+//============================================================
+
+//niflheim
+//niflheim.gat,0,0,0,0 monster Lord Of Death 1373,1,3600000,1800000,1
+//niflheim.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+//niflheim.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
+//niflheim.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
+//niflheim.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
+//niflheim.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
+//niflheim.gat,0,0,0,0 monster Quve 1508,10,0,0,0
+//niflheim.gat,0,0,0,0 monster Lude 1509,20,0,0,0
+//niflheim.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
+
+//nif_fild01)?
+nif_fild01.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+nif_fild01.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
+nif_fild01.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
+nif_fild01.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
+nif_fild01.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
+nif_fild01.gat,0,0,0,0 monster Quve 1508,10,0,0,0
+nif_fild01.gat,0,0,0,0 monster Lude 1509,20,0,0,0
+nif_fild01.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
+
+//nif_fild02)?
+nif_fild02.gat,0,0,0,0 monster Gibbet 1503,10,0,0,0
+nif_fild02.gat,0,0,0,0 monster Dullahan 1504,10,0,0,0
+nif_fild02.gat,0,0,0,0 monster Loli Ruri 1505,8,0,0,0
+nif_fild02.gat,0,0,0,0 monster Disguise 1506,15,0,0,0
+nif_fild02.gat,0,0,0,0 monster Bloody Murderer 1507,2,0,0,0
+nif_fild02.gat,0,0,0,0 monster Quve 1508,10,0,0,0
+nif_fild02.gat,0,0,0,0 monster Lude 1509,20,0,0,0
+nif_fild02.gat,0,0,0,0 monster Hylozoist 1510,8,0,0,0
diff --git a/npc/mobs/fields/payon.txt b/npc/mobs/fields/payon.txt
index 21a205b5e..8bce8a562 100644
--- a/npc/mobs/fields/payon.txt
+++ b/npc/mobs/fields/payon.txt
@@ -1,128 +1,128 @@
-//===== eAthena Script =======================================
-//= Payon Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(pay_fild01.gat)*
-pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
-pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
-pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
-pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
-pay_fild01.gat,129,288,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,225,310,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,336,116,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,340,89,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,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,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
-
-//(pay_fild02.gat)*
-pay_fild02.gat,0,0,0,0 monster Boa 1025,50,150000,75000,1
-pay_fild02.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-pay_fild02.gat,0,0,0,0 monster Wolf 1013,100,0,0,0
-pay_fild02.gat,0,0,0,0 monster Spore 1014,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.gat)*
-pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
-pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,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 Poring 1002,30,0,0,0
-pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
-pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
-
-//(pay_fild04.gat)*
-pay_fild04.gat,0,0,0,0 monster Marin 1242,10,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 Drops 1113,40,0,0,0
-pay_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
-pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,1
-pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
-pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
-pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
-pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
-
-//(pay_fild05.gat)*
-pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,5,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,70,0,0,0
-pay_fild05.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
-pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
-pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
-
-//(pay_fild06.gat)*
-pay_fild06.gat,0,0,0,0 monster Worm Tail 1024,100,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,0,0,0,0 monster Spore 1014,40,0,0,0
-pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
-pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
-pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
-
-//(pay_fild07.gat)*
-pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,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 Elder Willow 1033,70,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,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
-
-//(pay_fild08.gat)*
-pay_fild08.gat,0,0,0,0 monster Spore 1014,50,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 Poring 1002,30,0,0,0
-pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
-pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
-
-//(pay_fild09.gat)*
-pay_fild09.gat,0,0,0,0 monster Wanderer 1208,1,3600000,1800000,0
-pay_fild09.gat,0,0,0,0 monster Sohee 1170,3,0,0,0
-pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,50,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 Boa 1025,30,0,0,0
-pay_fild09.gat,0,0,0,0 monster Worm Tail 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 Spore 1014,20,0,0,0
-pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
-pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,1
-
-//(pay_fild10.gat)*
-pay_fild10.gat,0,0,0,0 monster Nine-Tail 1180,3,0,0,0
-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,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_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_fild11.gat)*
-pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,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 Horong 1129,50,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 Poison Spore 1077,40,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 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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(pay_fild01.gat)*
+pay_fild01.gat,0,0,0,0 monster Poporing 1031,10,0,0,0
+pay_fild01.gat,0,0,0,0 monster Spore 1014,20,0,0,0
+pay_fild01.gat,0,0,0,0 monster Willow 1010,50,0,0,0
+pay_fild01.gat,0,0,0,0 monster Poring 1002,60,0,0,0
+pay_fild01.gat,129,288,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,225,310,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,336,116,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,340,89,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,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,0,0,0,0 monster Green Plant 1080,5,180000,90000,1
+
+//(pay_fild02.gat)*
+pay_fild02.gat,0,0,0,0 monster Boa 1025,50,150000,75000,1
+pay_fild02.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+pay_fild02.gat,0,0,0,0 monster Wolf 1013,100,0,0,0
+pay_fild02.gat,0,0,0,0 monster Spore 1014,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.gat)*
+pay_fild03.gat,0,0,0,0 monster Willow 1010,30,0,0,0
+pay_fild03.gat,0,0,0,0 monster Lunatic 1063,50,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 Poring 1002,30,0,0,0
+pay_fild03.gat,372,64,15,15 monster Green Plant 1080,4,180000,90000,1
+pay_fild03.gat,153,216,10,10 monster Red Mushroom 1085,6,900000,450000,1
+
+//(pay_fild04.gat)*
+pay_fild04.gat,0,0,0,0 monster Marin 1242,10,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 Drops 1113,40,0,0,0
+pay_fild04.gat,0,0,0,0 monster Poring 1002,40,0,0,0
+pay_fild04.gat,0,0,0,0 monster Mastering 1090,1,1800000,900000,1
+pay_fild04.gat,346,335,5,5 monster Shining Plant 1083,1,1800000,900000,1
+pay_fild04.gat,0,0,0,0 monster Angeling 1096,1,3600000,1800000,1
+pay_fild04.gat,0,0,0,0 monster Ghostring 1120,1,3600000,1800000,1
+pay_fild04.gat,254,193,10,10 monster Green Plant 1080,5,360000,180000,1
+
+//(pay_fild05.gat)*
+pay_fild05.gat,0,0,0,0 monster Dragon Tail 1321,5,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poison Spore 1077,70,0,0,0
+pay_fild05.gat,0,0,0,0 monster Poporing 1031,50,0,0,0
+pay_fild05.gat,86,90,5,5 monster Green Plant 1080,4,900000,450000,1
+pay_fild05.gat,95,147,5,5 monster Green Plant 1080,4,900000,450000,1
+
+//(pay_fild06.gat)*
+pay_fild06.gat,0,0,0,0 monster Worm Tail 1024,100,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,0,0,0,0 monster Spore 1014,40,0,0,0
+pay_fild06.gat,268,155,20,20 monster Shining Plant 1083,1,1800000,900000,1
+pay_fild06.gat,268,155,20,20 monster Green Plant 1080,10,360000,180000,1
+pay_fild06.gat,211,191,2,10 monster Red Mushroom 1085,8,180000,90000,1
+
+//(pay_fild07.gat)*
+pay_fild07.gat,0,0,0,0 monster Bigfoot 1060,30,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 Elder Willow 1033,70,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,171,331,20,20 monster Green Plant 1080,8,900000,450000,1
+
+//(pay_fild08.gat)*
+pay_fild08.gat,0,0,0,0 monster Spore 1014,50,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 Poring 1002,30,0,0,0
+pay_fild08.gat,143,156,40,40 monster Shining Plant 1083,1,3600000,1800000,1
+pay_fild08.gat,0,0,0,0 monster Green Plant 1080,10,60000,30000,1
+
+//(pay_fild09.gat)*
+pay_fild09.gat,0,0,0,0 monster Wanderer 1208,1,3600000,1800000,0
+pay_fild09.gat,0,0,0,0 monster Sohee 1170,3,0,0,0
+pay_fild09.gat,0,0,0,0 monster Bigfoot 1060,50,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 Boa 1025,30,0,0,0
+pay_fild09.gat,0,0,0,0 monster Worm Tail 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 Spore 1014,20,0,0,0
+pay_fild09.gat,198,217,30,30 monster Shining Plant 1083,1,1800000,900000,1
+pay_fild09.gat,198,217,30,30 monster Green Plant 1080,10,360000,180000,1
+
+//(pay_fild10.gat)*
+pay_fild10.gat,0,0,0,0 monster Nine-Tail 1180,3,0,0,0
+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,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_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_fild11.gat)*
+pay_fild11.gat,0,0,0,0 monster Dragon Tail 1321,10,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 Horong 1129,50,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 Poison Spore 1077,40,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 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 60c269e02..534e2e5a9 100644
--- a/npc/mobs/fields/prontera.txt
+++ b/npc/mobs/fields/prontera.txt
@@ -1,113 +1,113 @@
-//===== eAthena Script =======================================
-//= Prontera Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-//(prt_fild00.gat)*
-prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
-prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,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 Pupa 1008,50,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 Poring 1002,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.gat)*
-prt_fild01.gat,0,0,0,0 monster Thief Bug Larva 1051,30,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 Pupa 1008,10,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 Poring 1002,30,0,0,0
-prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
-prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
-
-//(prt_fild02.gat)*
-prt_fild02.gat,0,0,0,0 monster Mandragora 1020,75,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 Pupa 1008,20,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 Poring 1002,30,0,0,0
-prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,1800000,900000,1
-prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
-
-//(prt_fild03.gat)*
-prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
-prt_fild03.gat,0,0,0,0 monster Choco 1214,3,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 Fabre 1007,10,0,0,0
-prt_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
-prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
-prt_fild03.gat,296,58,15,15 monster Green Plant 1080,20,180000,90000,1
-
-//(prt_fild04.gat)*
-prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
-prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,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_fild04.gat,147,319,5,5 monster Green Plant 1080,2,360000,180000,1
-prt_fild04.gat,148,107,5,5 monster Green Plant 1080,1,360000,180000,1
-prt_fild04.gat,307,75,5,5 monster Green Plant 1080,2,360000,180000,1
-
-//(prt_fild05.gat)*
-prt_fild05.gat,0,0,0,0 monster Thief Bug Larva 1051,10,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 Poring 1002,70,0,0,0
-prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
-prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
-
-//(prt_fild06.gat)*
-prt_fild06.gat,0,0,0,0 monster Thief Bug Larva 1051,10,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 Lunatic 1063,60,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.gat)*
-prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
-prt_fild07.gat,0,0,0,0 monster Rocker 1052,120,0,0,0
-prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
-
-//(prt_fild08.gat)*
-prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
-prt_fild08.gat,0,0,0,0 monster Drops 1113,10,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_fild09.gat)*
-prt_fild09.gat,0,0,0,0 monster Desert Wolf Puppy 1107,20,0,0,0
-prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
-prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
-moc_fild09.gat,0,0,0,0 monster PecoPeco Egg 1047,10,0,0,0
-prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
-prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
-
-//(prt_fild10.gat)*
-prt_fild10.gat,0,0,0,0 monster Savage 1166,70,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 Savage Babe 1167,40,0,0,0
-prt_fild10.gat,0,0,0,0 monster Thief Bug Larva 1051,10,0,0,0
-prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
-prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
-
-//(prt_fild11.gat)*
-prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,0,0,0
-prt_fild11.gat,0,0,0,0 monster Steam Goblin 1280,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 Goblin 5 1126,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 4 1125,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 3 1124,20,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 2 1123,30,0,0,0
-prt_fild11.gat,0,0,0,0 monster Goblin 1 1122,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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+//(prt_fild00.gat)*
+prt_fild00.gat,0,0,0,0 monster Creamy 1018,10,0,0,0
+prt_fild00.gat,0,0,0,0 monster Hornet 1004,40,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 Pupa 1008,50,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 Poring 1002,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.gat)*
+prt_fild01.gat,0,0,0,0 monster Thief Bug Larva 1051,30,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 Pupa 1008,10,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 Poring 1002,30,0,0,0
+prt_fild01.gat,199,266,3,3 monster Blue Plant 1079,1,900000,450000,1
+prt_fild01.gat,199,266,3,3 monster Green Plant 1080,3,360000,180000,1
+
+//(prt_fild02.gat)*
+prt_fild02.gat,0,0,0,0 monster Mandragora 1020,75,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 Pupa 1008,20,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 Poring 1002,30,0,0,0
+prt_fild02.gat,0,0,0,0 monster Eclipse 1093,1,1800000,900000,1
+prt_fild02.gat,339,309,3,3 monster Shining Plant 1083,1,1800000,900000,1
+
+//(prt_fild03.gat)*
+prt_fild03.gat,0,0,0,0 monster Yoyo 1057,70,0,0,0
+prt_fild03.gat,0,0,0,0 monster Choco 1214,3,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 Fabre 1007,10,0,0,0
+prt_fild03.gat,0,0,0,0 monster Poring 1002,30,0,0,0
+prt_fild03.gat,296,58,15,15 monster Blue Plant 1079,2,900000,450000,1
+prt_fild03.gat,296,58,15,15 monster Green Plant 1080,20,180000,90000,1
+
+//(prt_fild04.gat)*
+prt_fild04.gat,0,0,0,0 monster Creamy 1018,40,0,0,0
+prt_fild04.gat,0,0,0,0 monster Rocker 1052,70,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_fild04.gat,147,319,5,5 monster Green Plant 1080,2,360000,180000,1
+prt_fild04.gat,148,107,5,5 monster Green Plant 1080,1,360000,180000,1
+prt_fild04.gat,307,75,5,5 monster Green Plant 1080,2,360000,180000,1
+
+//(prt_fild05.gat)*
+prt_fild05.gat,0,0,0,0 monster Thief Bug Larva 1051,10,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 Poring 1002,70,0,0,0
+prt_fild05.gat,208,37,10,10 monster Blue Plant 1079,1,900000,450000,1
+prt_fild05.gat,208,37,10,10 monster Green Plant 1080,6,900000,450000,1
+
+//(prt_fild06.gat)*
+prt_fild06.gat,0,0,0,0 monster Thief Bug Larva 1051,10,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 Lunatic 1063,60,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.gat)*
+prt_fild07.gat,0,0,0,0 monster Poporing 1031,30,0,0,0
+prt_fild07.gat,0,0,0,0 monster Rocker 1052,120,0,0,0
+prt_fild07.gat,225,110,5,5 monster Black Mushroom 1084,3,360000,180000,1
+
+//(prt_fild08.gat)*
+prt_fild08.gat,0,0,0,0 monster Lunatic 1063,40,0,0,0
+prt_fild08.gat,0,0,0,0 monster Drops 1113,10,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_fild09.gat)*
+prt_fild09.gat,0,0,0,0 monster Desert Wolf Puppy 1107,20,0,0,0
+prt_fild09.gat,0,0,0,0 monster Savage Babe 1167,70,0,0,0
+prt_fild09.gat,0,0,0,0 monster Condor 1009,10,0,0,0
+moc_fild09.gat,0,0,0,0 monster PecoPeco Egg 1047,10,0,0,0
+prt_fild09.gat,0,0,0,0 monster Picky 1049,20,0,0,0
+prt_fild09.gat,237,115,5,5 monster Yellow Plant 1081,3,360000,180000,1
+
+//(prt_fild10.gat)*
+prt_fild10.gat,0,0,0,0 monster Savage 1166,70,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 Savage Babe 1167,40,0,0,0
+prt_fild10.gat,0,0,0,0 monster Thief Bug Larva 1051,10,0,0,0
+prt_fild10.gat,155,179,10,10 monster Shining Plant 1083,1,1800000,900000,1
+prt_fild10.gat,99,114,20,5 monster Red Mushroom 1085,15,360000,180000,1
+
+//(prt_fild11.gat)*
+prt_fild11.gat,0,0,0,0 monster Panzer Goblin 1308,1,0,0,0
+prt_fild11.gat,0,0,0,0 monster Steam Goblin 1280,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 Goblin 5 1126,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 4 1125,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 3 1124,20,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 2 1123,30,0,0,0
+prt_fild11.gat,0,0,0,0 monster Goblin 1 1122,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/umbala.txt b/npc/mobs/fields/umbala.txt
index 3189d0523..aa4e2eae6 100644
--- a/npc/mobs/fields/umbala.txt
+++ b/npc/mobs/fields/umbala.txt
@@ -1,38 +1,38 @@
-//===== eAthena Script =======================================
-//= Umbala Monster Spawn
-//===== By: ==================================================
-//= Darkchild (1.0)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Ep6+
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-//(um_fild01.gat)? no info
-um_fild01.gat,0,0,0,0 monster Stem Worm 1215,15,0,0,0
-um_fild01.gat,0,0,0,0 monster Wooden Fighter 1499,40,0,0,0
-um_fild01.gat,0,0,0,0 monster Dryad 1493,15,0,0,0
-um_fild01.gat,0,0,0,0 monster Harpy 1376,25,0,0,0
-
-//(um_fild02.gat)?
-um_fild02.gat,0,0,0,0 monster Dustiness 1114,25,0,0,0
-um_fild02.gat,0,0,0,0 monster Kind of Beetle 1494,15,0,0,0
-um_fild02.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
-um_fild02.gat,0,0,0,0 monster Wooden Shooter 1498,20,0,0,0
-
-//(um_fild03.gat)?
-um_fild03.gat,0,0,0,0 monster Pest 1256,25,0,0,0
-//um_fild03.gat,0,0,0,0 monster ƒtƒFƒAƒŠ[ƒt ????,30,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 Dragon Tail 1321,20,0,0,0
-um_fild03.gat,0,0,0,0 monster Gryphon 1447,1,150000,150000,0
-
-//(um_fild04.gat)?
-um_fild04.gat,0,0,0,0 monster Stainer 1174,25,0,0,0
-um_fild04.gat,0,0,0,0 monster Kind of Beetle 1494,20,0,0,0
-um_fild04.gat,0,0,0,0 monster Wooden Shooter 1498,20,0,0,0
-um_fild04.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
-um_fild04.gat,0,0,0,0 monster Choco 1214,1,0,0,0
+//===== eAthena Script =======================================
+//= Umbala Monster Spawn
+//===== By: ==================================================
+//= Darkchild (1.0)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Ep6+
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+
+//(um_fild01.gat)? no info
+um_fild01.gat,0,0,0,0 monster Stem Worm 1215,15,0,0,0
+um_fild01.gat,0,0,0,0 monster Wooden Fighter 1499,40,0,0,0
+um_fild01.gat,0,0,0,0 monster Dryad 1493,15,0,0,0
+um_fild01.gat,0,0,0,0 monster Harpy 1376,25,0,0,0
+
+//(um_fild02.gat)?
+um_fild02.gat,0,0,0,0 monster Dustiness 1114,25,0,0,0
+um_fild02.gat,0,0,0,0 monster Kind of Beetle 1494,15,0,0,0
+um_fild02.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
+um_fild02.gat,0,0,0,0 monster Wooden Shooter 1498,20,0,0,0
+
+//(um_fild03.gat)?
+um_fild03.gat,0,0,0,0 monster Pest 1256,25,0,0,0
+//um_fild03.gat,0,0,0,0 monster ƒtƒFƒAƒŠ[ƒt ????,30,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 Dragon Tail 1321,20,0,0,0
+um_fild03.gat,0,0,0,0 monster Gryphon 1447,1,150000,150000,0
+
+//(um_fild04.gat)?
+um_fild04.gat,0,0,0,0 monster Stainer 1174,25,0,0,0
+um_fild04.gat,0,0,0,0 monster Kind of Beetle 1494,20,0,0,0
+um_fild04.gat,0,0,0,0 monster Wooden Shooter 1498,20,0,0,0
+um_fild04.gat,0,0,0,0 monster Wooden Fighter 1499,30,0,0,0
+um_fild04.gat,0,0,0,0 monster Choco 1214,1,0,0,0
diff --git a/npc/mobs/fields/yuno.txt b/npc/mobs/fields/yuno.txt
index 67e49a00c..7b0cbbb27 100644
--- a/npc/mobs/fields/yuno.txt
+++ b/npc/mobs/fields/yuno.txt
@@ -1,60 +1,60 @@
-//===== eAthena Script =======================================
-//= Yuno Fields Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//= 1.1 fixed tabs, names [Lupus]
-//============================================================
-
-//(yuno_fild04.gat)*
-yuno_fild04.gat,0,0,0,0 monster Goat 1372,40,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Sleeper 1386,5,0,0,0
-yuno_fild04.gat,0,0,0,0 monster The Paper 1375,3,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Driller 1380,10,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Poring 1002,20,0,0,0
-yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
-yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
-yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,360000,180000,1
-yuno_fild04.gat,0,0,0,0 monster Harpy 1376,1,0,0,0
-
-//(yuno_fild03.gat)*
-yuno_fild03.gat,0,0,0,0 monster Goat 1372,60,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Sleeper 1386,30,0,0,0
-yuno_fild03.gat,0,0,0,0 monster The Paper 1375,3,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
-yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-yuno_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
-yuno_fild03.gat,0,0,0,0 monster Blue Plant 1079,4,360000,180000,1
-yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1
-yuno_fild03.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
-
-//(yuno_fild02.gat)*
-yuno_fild02.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Grand Peco 1369,70,0,0,0
-yuno_fild02.gat,0,0,0,0 monster The Paper 1375,1,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Driller 1380,30,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 Poring 1002,20,0,0,0
-yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,20,180000,90000,1
-yuno_fild02.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
-yuno_fild02.gat,0,0,0,0 monster Blue Plant 1079,3,360000,180000,1
-yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1
-yuno_fild02.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1
-
-//(yuno_fild01.gat)*
-yuno_fild01.gat,0,0,0,0 monster Grand Peco 1369,3,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
-yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,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 Green Plant 1080,20,180000,90000,1
-yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
-yuno_fild01.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
-yuno_fild01.gat,0,0,0,0 monster Blue Plant 1079,2,360000,180000,1
-yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,23,360000,180000,1
+//===== eAthena Script =======================================
+//= Yuno Fields Monster Spawn Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Additional Comments: =================================
+//= 1.1 fixed tabs, names [Lupus]
+//============================================================
+
+//(yuno_fild04.gat)*
+yuno_fild04.gat,0,0,0,0 monster Goat 1372,40,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Sleeper 1386,5,0,0,0
+yuno_fild04.gat,0,0,0,0 monster The Paper 1375,3,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Driller 1380,10,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Poring 1002,20,0,0,0
+yuno_fild04.gat,0,0,0,0 monster Green Plant 1080,10,180000,90000,1
+yuno_fild04.gat,0,0,0,0 monster Red Plant 1078,10,180000,90000,1
+yuno_fild04.gat,0,0,0,0 monster Yellow Plant 1081,10,360000,180000,1
+yuno_fild04.gat,0,0,0,0 monster Harpy 1376,1,0,0,0
+
+//(yuno_fild03.gat)*
+yuno_fild03.gat,0,0,0,0 monster Goat 1372,60,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Sleeper 1386,30,0,0,0
+yuno_fild03.gat,0,0,0,0 monster The Paper 1375,3,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Demon Pungus 1378,30,0,0,0
+yuno_fild03.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+yuno_fild03.gat,0,0,0,0 monster Shining Plant 1083,2,1800000,900000,1
+yuno_fild03.gat,0,0,0,0 monster Blue Plant 1079,4,360000,180000,1
+yuno_fild03.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1
+yuno_fild03.gat,0,0,0,0 monster Harpy 1376,2,0,0,0
+
+//(yuno_fild02.gat)*
+yuno_fild02.gat,0,0,0,0 monster Sleeper 1386,10,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Grand Peco 1369,70,0,0,0
+yuno_fild02.gat,0,0,0,0 monster The Paper 1375,1,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Geographer 1368,20,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Driller 1380,30,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 Poring 1002,20,0,0,0
+yuno_fild02.gat,0,0,0,0 monster Red Plant 1078,20,180000,90000,1
+yuno_fild02.gat,0,0,0,0 monster Shining Plant 1083,1,1800000,900000,1
+yuno_fild02.gat,0,0,0,0 monster Blue Plant 1079,3,360000,180000,1
+yuno_fild02.gat,0,0,0,0 monster Yellow Plant 1081,20,360000,180000,1
+yuno_fild02.gat,0,0,0,0 monster Archangeling 1388,1,3600000,1800000,1
+
+//(yuno_fild01.gat)*
+yuno_fild01.gat,0,0,0,0 monster Grand Peco 1369,3,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Dustiness 1114,50,0,0,0
+yuno_fild01.gat,0,0,0,0 monster Poporing 1031,20,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 Green Plant 1080,20,180000,90000,1
+yuno_fild01.gat,0,0,0,0 monster Red Plant 1078,15,180000,90000,1
+yuno_fild01.gat,0,0,0,0 monster Shining Plant 1083,3,1800000,900000,1
+yuno_fild01.gat,0,0,0,0 monster Blue Plant 1079,2,360000,180000,1
+yuno_fild01.gat,0,0,0,0 monster Yellow Plant 1081,23,360000,180000,1
diff --git a/npc/mobs/pvp.txt b/npc/mobs/pvp.txt
index dbdfd0c61..61d2d01dd 100644
--- a/npc/mobs/pvp.txt
+++ b/npc/mobs/pvp.txt
@@ -1,31 +1,31 @@
-//===== eAthena Script =======================================
-//= PvP Nightmare Rooms Monster Spawn Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-
-//PvP : “ì–k푈(pvp_n_8-1)
-pvp_n_8-1.gat,0,0,0,0 monster Sidewinder 1037,2,360000,180000,1
-pvp_n_8-1.gat,0,0,0,0 monster Bigfoot 1060,2,360000,180000,1
-
-//PvP : ƒƒbƒNƒIƒ“(pvp_n_8-2)
-pvp_n_8-2.gat,0,0,0,0 monster Cramp 1209,4,360000,180000,1
-
-//PvP : ƒtƒH[ƒ‹[ƒ€(pvp_n_8-3)
-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 : ƒAƒ“ƒ_[ƒNƒƒX(pvp_n_8-4)
-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 : ƒUƒiƒNƒ‹[ƒ€(pvp_n_8-5)
-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 : “ì–k푈(pvp_n_8-1)
+pvp_n_8-1.gat,0,0,0,0 monster Sidewinder 1037,2,360000,180000,1
+pvp_n_8-1.gat,0,0,0,0 monster Bigfoot 1060,2,360000,180000,1
+
+//PvP : ƒƒbƒNƒIƒ“(pvp_n_8-2)
+pvp_n_8-2.gat,0,0,0,0 monster Cramp 1209,4,360000,180000,1
+
+//PvP : ƒtƒH[ƒ‹[ƒ€(pvp_n_8-3)
+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 : ƒAƒ“ƒ_[ƒNƒƒX(pvp_n_8-4)
+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 : ƒUƒiƒNƒ‹[ƒ€(pvp_n_8-5)
+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 4c45a1db5..b9cb96183 100644
--- a/npc/other/Global_Functions.txt
+++ b/npc/other/Global_Functions.txt
@@ -1,80 +1,80 @@
-//===== eAthena Script =======================================
-//= Global Functions
-//===== By: ==================================================
-//= Lupus, kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-//=========================================
-// Function that clears job quest variables
-//=========================================
-function script F_ClearJobVar {
- // Misc ---------------------------------
- set JBLVL,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 job_sword_q2,0;
- set job_thief_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;
- return;
-}
-
-//=====================================================
-// 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 or Priest, 0 otherwise
-function script Is_Holy_Class {
- return ( Class==Job_Acolyte || Class==Job_Priest || Class==Job_Monk || Class==4005 || Class==4009 || Class==4016 );
-}
-//------------------------------------------------------
-//returns 1 if the player is either Archer,Hunter,Bard,Dancer, 0 otherwise
-function script Is_Bow_Class {
- return ( Class==Job_Archer || Class==Job_Hunter || Class==Job_Bard || Class==Job_Dancer || Class==4004 || Class==4012 || Class==4020 || Class==4021);
-}
-//------------------------------------------------------
-//returns 1 if the player is either Mage,Wizard,Sage, 0 otherwise
-function script Is_Magic_Class {
- return ( Class==Job_Mage || Class==Job_Wizard || Class==Job_Sage || Class==4003 || Class==4010 || Class==4017 );
-}
-//----------------------------------------------------
-//returns 1 if the player is either Merchant,Blacksmith,Alchemist, 0 otherwise
-function script Is_Merc_Class {
- return ( Class==Job_Merchant || Class==Job_Blacksmith || Class==Job_Alchem || Class==4006 || Class==4011 || Class==4019 );
-}
-//------------------------------------------------------
-//returns 1 if the player is either Thief,Assassin,Rogue, 0 otherwise
-function script Is_Thief_Class {
- return ( Class==Job_Thief || Class==Job_Assassin || Class==Job_Rogue || Class==4007 || Class==4013 || Class==4018 );
-}
-//-----------------------------------------------------
-//returns 1 if the player is either Swordsman,Knight,Crusader, 0 otherwise
-function script Is_Sword_Class {
- return ( Class==Job_Swordman || Class==Job_Knight || Class==Job_Knight2 || Class==Job_Crusader || Class==Job_Crusader2 || Class==4002 || Class==4008 || Class==4014 || Class==4015 || Class==4022 );
-}
+//===== eAthena Script =======================================
+//= Global Functions
+//===== By: ==================================================
+//= Lupus, kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+//=========================================
+// Function that clears job quest variables
+//=========================================
+function script F_ClearJobVar {
+ // Misc ---------------------------------
+ set JBLVL,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 job_sword_q2,0;
+ set job_thief_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;
+ return;
+}
+
+//=====================================================
+// 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 or Priest, 0 otherwise
+function script Is_Holy_Class {
+ return ( Class==Job_Acolyte || Class==Job_Priest || Class==Job_Monk || Class==4005 || Class==4009 || Class==4016 );
+}
+//------------------------------------------------------
+//returns 1 if the player is either Archer,Hunter,Bard,Dancer, 0 otherwise
+function script Is_Bow_Class {
+ return ( Class==Job_Archer || Class==Job_Hunter || Class==Job_Bard || Class==Job_Dancer || Class==4004 || Class==4012 || Class==4020 || Class==4021);
+}
+//------------------------------------------------------
+//returns 1 if the player is either Mage,Wizard,Sage, 0 otherwise
+function script Is_Magic_Class {
+ return ( Class==Job_Mage || Class==Job_Wizard || Class==Job_Sage || Class==4003 || Class==4010 || Class==4017 );
+}
+//----------------------------------------------------
+//returns 1 if the player is either Merchant,Blacksmith,Alchemist, 0 otherwise
+function script Is_Merc_Class {
+ return ( Class==Job_Merchant || Class==Job_Blacksmith || Class==Job_Alchem || Class==4006 || Class==4011 || Class==4019 );
+}
+//------------------------------------------------------
+//returns 1 if the player is either Thief,Assassin,Rogue, 0 otherwise
+function script Is_Thief_Class {
+ return ( Class==Job_Thief || Class==Job_Assassin || Class==Job_Rogue || Class==4007 || Class==4013 || Class==4018 );
+}
+//-----------------------------------------------------
+//returns 1 if the player is either Swordsman,Knight,Crusader, 0 otherwise
+function script Is_Sword_Class {
+ return ( Class==Job_Swordman || Class==Job_Knight || Class==Job_Knight2 || Class==Job_Crusader || Class==Job_Crusader2 || Class==4002 || Class==4008 || Class==4014 || Class==4015 || Class==4022 );
+}
diff --git a/npc/other/IceCream.txt b/npc/other/IceCream.txt
index fd35caf54..dcac8f6e0 100644
--- a/npc/other/IceCream.txt
+++ b/npc/other/IceCream.txt
@@ -1,64 +1,64 @@
-// $Id: IceCream.txt,v 1.1.1.1 2004/09/10 17:26:42 MagicalTux Exp $
-//===== eAthena Script =======================================
-//= Ice Cream Maker
-//===== By: ==================================================
-//= KOOK SWU
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= A man makes you ice-cream
-//===== Additional Comments: =================================
-//= 1.1 Optimized, changed overlapping coords in Alberta [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;
- if(@input<1) goto L_inpC;
- if(@input>5) goto L_inpM;
- if(Zeny< @input*100) goto L_NoZ;
- getitem 536,@input;
- set Zeny,Zeny-100*@input;
- mes "[Ice Cream Maker]";
- mes "Here you go " +@input+ " Ice Cream for you.";
- close;
-
- L_inpC:
- mes "[Ice Cream Maker]";
- mes "Deal is canceled.";
- close;
- L_inpM:
- mes "[Ice Cream Maker]";
- mes "Sorry, but you can only buy 5 at a time.";
- close;
- L_NoZ:
- mes "[Ice Cream Maker]";
- 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
+// $Id: IceCream.txt,v 1.1.1.1 2004/09/10 17:26:42 MagicalTux Exp $
+//===== eAthena Script =======================================
+//= Ice Cream Maker
+//===== By: ==================================================
+//= KOOK SWU
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= A man makes you ice-cream
+//===== Additional Comments: =================================
+//= 1.1 Optimized, changed overlapping coords in Alberta [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;
+ if(@input<1) goto L_inpC;
+ if(@input>5) goto L_inpM;
+ if(Zeny< @input*100) goto L_NoZ;
+ getitem 536,@input;
+ set Zeny,Zeny-100*@input;
+ mes "[Ice Cream Maker]";
+ mes "Here you go " +@input+ " Ice Cream for you.";
+ close;
+
+ L_inpC:
+ mes "[Ice Cream Maker]";
+ mes "Deal is canceled.";
+ close;
+ L_inpM:
+ mes "[Ice Cream Maker]";
+ mes "Sorry, but you can only buy 5 at a time.";
+ close;
+ L_NoZ:
+ mes "[Ice Cream Maker]";
+ 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/other/Valkyrie.txt b/npc/other/Valkyrie.txt
index 82a52a5db..810c75e75 100644
--- a/npc/other/Valkyrie.txt
+++ b/npc/other/Valkyrie.txt
@@ -1,50 +1,50 @@
-//1.1 label fixed [Lupus]
-
-yuno_in02.gat,93,207,0 script Heaven's Door 111,{
- if (Class < 7) goto L_Can;
- mes "[The writing on the paper]";
- mes "You have found the entrance to the temple.";
- mes "This path is only open to those who are born again.";
- mes "Only heroes can open new paths.";
- next;
- mes "[The writing on the paper]";
- mes "The area for heroes has been completed,";
- mes "You cannot be immortal, but in this land...";
- mes "Heroes are able to.";
- next;
- mes "[The writing on the paper]";
- mes "The area for heroes has been completed,";
- mes "You cannot be immortal, but in this land...";
- mes "Heroes are able to.";
- next;
- menu "Continue reading",-,"Stop reading",L_Can;
- mes "[The writing on the paper]";
- mes "Heaven and the closest palce,";
- mes "In the Valkyrie's temple you shall find the path";
- mes "A normal mortal cannot live for ever.";
- next;
- warp "valkyrie",48,8;
- close;
-L_Can:
- mes "[The writing on the paper]";
- mes "....................";
- close;
-
-}
-
-valkyrie.gat,48,86,6 script Valkyrie 811,{
- if (class > 7) goto L_Rest;
- mes "[Valkyrie]";
- mes "Welcome to Valhalla.";
- mes "But, you have not been invited yet.";
- mes "Leave here without leaving a trace.";
- mes "Glory to the Swordsmans!";
- warp "yuno_in02",93,205;
- close;
-L_Rest:
- mes "[Valkyrie]";
- mes "Welcome to Valhalla.";
- mes "Take plenty of rest while you are here.";
- mes "Honor and glory to the Swordsmans";
- close;
+//1.1 label fixed [Lupus]
+
+yuno_in02.gat,93,207,0 script Heaven's Door 111,{
+ if (Class < 7) goto L_Can;
+ mes "[The writing on the paper]";
+ mes "You have found the entrance to the temple.";
+ mes "This path is only open to those who are born again.";
+ mes "Only heroes can open new paths.";
+ next;
+ mes "[The writing on the paper]";
+ mes "The area for heroes has been completed,";
+ mes "You cannot be immortal, but in this land...";
+ mes "Heroes are able to.";
+ next;
+ mes "[The writing on the paper]";
+ mes "The area for heroes has been completed,";
+ mes "You cannot be immortal, but in this land...";
+ mes "Heroes are able to.";
+ next;
+ menu "Continue reading",-,"Stop reading",L_Can;
+ mes "[The writing on the paper]";
+ mes "Heaven and the closest palce,";
+ mes "In the Valkyrie's temple you shall find the path";
+ mes "A normal mortal cannot live for ever.";
+ next;
+ warp "valkyrie",48,8;
+ close;
+L_Can:
+ mes "[The writing on the paper]";
+ mes "....................";
+ close;
+
+}
+
+valkyrie.gat,48,86,6 script Valkyrie 811,{
+ if (class > 7) goto L_Rest;
+ mes "[Valkyrie]";
+ mes "Welcome to Valhalla.";
+ mes "But, you have not been invited yet.";
+ mes "Leave here without leaving a trace.";
+ mes "Glory to the Swordsmans!";
+ warp "yuno_in02",93,205;
+ close;
+L_Rest:
+ mes "[Valkyrie]";
+ mes "Welcome to Valhalla.";
+ mes "Take plenty of rest while you are here.";
+ mes "Honor and glory to the Swordsmans";
+ close;
} \ No newline at end of file
diff --git a/npc/other/arena.txt b/npc/other/arena.txt
index 38436d8ba..fb5414406 100644
--- a/npc/other/arena.txt
+++ b/npc/other/arena.txt
@@ -1,568 +1,568 @@
-// ------------------------------------------------------------------
-// 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;
- break;
-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;
- break;
-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;
- break;
-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","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","arenalv3mon";
- monster "force_1-1.gat",25,25,"Arena Enemy",1002,1,"arenalv1mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1002,1,"arenalv1mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1002,1,"arenalv1mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1002,1,"arenalv1mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1002,1,"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";
-}
-
-//Time Attack Level 2
-force_1-1.gat,99,12,0 script arenalv2fgt -1,{
- killmonster "force_1-1.gat","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","arenalv3mon";
- monster "force_1-1.gat",20,20,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",20,30,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",30,20,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",30,30,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1012,1,"arenalv2mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1012,1,"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";
-}
-
-//Time Attack Level 3
-force_1-1.gat,99,12,0 script arenalv3fgt -1,{
- killmonster "force_1-1.gat","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","arenalv3mon";
- monster "force_1-1.gat",20,20,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",20,25,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",20,30,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",30,20,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",30,25,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",30,30,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",25,30,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",25,25,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",25,20,"Arena Enemy",1019,1,"arenalv3mon";
- monster "force_1-1.gat",20,35,"Arena Enemy",1019,1,"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";
-}
-
-// 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:
- break;
-}
-
-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:
- break;
-}
-
-
-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:
- break;
-}
-
-// Timeout
-force_1-1.gat,25,26,0 script arenalv1fail -1,{
- set $arena00,99;
- killmonster "force_1-1.gat","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","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","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","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","arenalv1mon";
- killmonster "force_1-1.gat","arenalv2mon";
- killmonster "force_1-1.gat","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;
+// ------------------------------------------------------------------
+// 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;
+ break;
+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;
+ break;
+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;
+ break;
+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","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3mon";
+ monster "force_1-1.gat",25,25,"Arena Enemy",1002,1,"arenalv1mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1002,1,"arenalv1mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1002,1,"arenalv1mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1002,1,"arenalv1mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1002,1,"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";
+}
+
+//Time Attack Level 2
+force_1-1.gat,99,12,0 script arenalv2fgt -1,{
+ killmonster "force_1-1.gat","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3mon";
+ monster "force_1-1.gat",20,20,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",20,30,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",30,20,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",30,30,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1012,1,"arenalv2mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1012,1,"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";
+}
+
+//Time Attack Level 3
+force_1-1.gat,99,12,0 script arenalv3fgt -1,{
+ killmonster "force_1-1.gat","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","arenalv3mon";
+ monster "force_1-1.gat",20,20,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",20,25,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",20,30,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",30,20,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",30,25,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",30,30,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",25,30,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",25,25,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",25,20,"Arena Enemy",1019,1,"arenalv3mon";
+ monster "force_1-1.gat",20,35,"Arena Enemy",1019,1,"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";
+}
+
+// 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:
+ break;
+}
+
+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:
+ break;
+}
+
+
+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:
+ break;
+}
+
+// Timeout
+force_1-1.gat,25,26,0 script arenalv1fail -1,{
+ set $arena00,99;
+ killmonster "force_1-1.gat","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","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","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","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","arenalv1mon";
+ killmonster "force_1-1.gat","arenalv2mon";
+ killmonster "force_1-1.gat","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;
} \ No newline at end of file
diff --git a/npc/other/arena_mvp.txt b/npc/other/arena_mvp.txt
index 8253e1aa1..19c59f311 100644
--- a/npc/other/arena_mvp.txt
+++ b/npc/other/arena_mvp.txt
@@ -1,1105 +1,1105 @@
-// ---- MVP ARENA!!!!!! By Darkchild with 16 diff MVP's inside
-// --- NPC in prontera
-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",44,24;
-close;
-L_No:
-close;
-}
-// --- Inside the Arena
-// --- NPC's That explains thigns
-quiz_00.gat,49,31,4 script MVP Arena Guide 778,{
-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;
-}
-
-// --- 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;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_1-2",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-2.gat") > 49) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_2-2",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_3-2",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_4-2",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_5-2",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_6-2",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_7-2",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-2.gat") > 14) goto Lsorry;
-mes "[ ^0065DFAlpha MVP^000000 ]";
-mes "Here you go!";
-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;
-
-Larena1:
-if (getmapusers("pvp_n_1-3.gat") > 49) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_1-3",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_2-3",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_3-3",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_4-3.gat",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_5-3.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_6-3.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_7-3.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-3.gat") > 14) goto Lsorry;
-mes "[ ^0065DFBeta MVP^000000 ]";
-mes "Here you go!";
-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;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_1-4.gat",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_2-4.gat",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-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;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_5-4.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_6-4.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_7-4.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-4.gat") > 14) goto Lsorry;
-mes "[ ^0065DFTheta MVP^000000 ]";
-mes "Here you go!";
-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;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_1-5.gat",102,102;
-close;
-
-Larena2:
-if (getmapusers("pvp_n_2-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_2-5.gat",102,102;
-close;
-
-Larena3:
-if (getmapusers("pvp_n_3-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_3-5.gat",102,102;
-close;
-
-Larena4:
-if (getmapusers("pvp_n_4-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_4-5.gat",102,102;
-close;
-
-Larena5:
-if (getmapusers("pvp_n_5-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_5-5.gat",102,102;
-close;
-
-Larena6:
-if (getmapusers("pvp_n_6-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_6-5.gat",102,102;
-close;
-
-Larena7:
-if (getmapusers("pvp_n_7-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-warp "pvp_n_7-5.gat",102,102;
-close;
-
-Larena8:
-if (getmapusers("pvp_n_8-5.gat") > 14) goto Lsorry;
-mes "[ ^0065DFEpsilon MVP^000000 ]";
-mes "Here you go!";
-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 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_2-2",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera",156,179;
- close;
-}
-
-// --- Alpha-MVP #2
-pvp_n_2-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_3-2",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera",156,179;
- close;
-}
-// --- Alpha-MVP #3
-pvp_n_3-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_4-2.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Alpha-MVP #4
-pvp_n_4-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_5-2.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Alpha-MVP #5
-pvp_n_5-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_6-2.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Alpha-MVP #6
-pvp_n_6-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_7-2.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Alpha-MVP #7
-pvp_n_7-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_8-2.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Alpha-MVP #8
-pvp_n_8-2.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #1
-pvp_n_1-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_2-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-
-// --- Beta-MVP #2
-pvp_n_2-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_3-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #3
-pvp_n_3-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_4-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #4
-pvp_n_4-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_5-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #5
-pvp_n_5-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_6-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #6
-pvp_n_6-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_7-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #7
-pvp_n_7-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_8-3.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Beta-MVP #8
-pvp_n_8-3.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #1
-pvp_n_1-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_2-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-
-// --- Theta-MVP #2
-pvp_n_2-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_3-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #3
-pvp_n_3-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_4-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #4
-pvp_n_4-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_5-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #5
-pvp_n_5-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_6-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #6
-pvp_n_6-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_7-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #7
-pvp_n_7-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_8-4.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Theta-MVP #8
-pvp_n_8-4.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #1
-pvp_n_1-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_2-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-
-// --- Epsilon-MVP #2
-pvp_n_2-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_3-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #3
-pvp_n_3-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_4-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #4
-pvp_n_4-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_5-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #5
-pvp_n_5-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_6-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #6
-pvp_n_6-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_7-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #7
-pvp_n_7-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Next:
- warp "pvp_n_8-5.gat",102,102;
- close;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-// --- Epsilon-MVP #8
-pvp_n_8-5.gat,100,100,4 script MVP-Protector 727,{
- mes "[ ^0065DFMVP-Protector^000000 ]";
- mes "How do you need help?.";
- menu "Heal Please",L_Heal,"Leave",L_Leave;
-
- L_Heal:
- Heal 32500,32500;
- close;
-
- L_Leave:
- warp "prontera.gat",156,179;
- close;
-}
-
-// ---- 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
+// --- NPC in prontera
+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",44,24;
+close;
+L_No:
+close;
+}
+// --- Inside the Arena
+// --- NPC's That explains thigns
+quiz_00.gat,49,31,4 script MVP Arena Guide 778,{
+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;
+}
+
+// --- 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;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_1-2",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-2.gat") > 49) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_2-2",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_3-2",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_4-2",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_5-2",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_6-2",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_7-2",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-2.gat") > 14) goto Lsorry;
+mes "[ ^0065DFAlpha MVP^000000 ]";
+mes "Here you go!";
+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;
+
+Larena1:
+if (getmapusers("pvp_n_1-3.gat") > 49) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_1-3",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_2-3",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_3-3",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_4-3.gat",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_5-3.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_6-3.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_7-3.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-3.gat") > 14) goto Lsorry;
+mes "[ ^0065DFBeta MVP^000000 ]";
+mes "Here you go!";
+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;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_1-4.gat",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_2-4.gat",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+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;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_5-4.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_6-4.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_7-4.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-4.gat") > 14) goto Lsorry;
+mes "[ ^0065DFTheta MVP^000000 ]";
+mes "Here you go!";
+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;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_1-5.gat",102,102;
+close;
+
+Larena2:
+if (getmapusers("pvp_n_2-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_2-5.gat",102,102;
+close;
+
+Larena3:
+if (getmapusers("pvp_n_3-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_3-5.gat",102,102;
+close;
+
+Larena4:
+if (getmapusers("pvp_n_4-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_4-5.gat",102,102;
+close;
+
+Larena5:
+if (getmapusers("pvp_n_5-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_5-5.gat",102,102;
+close;
+
+Larena6:
+if (getmapusers("pvp_n_6-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_6-5.gat",102,102;
+close;
+
+Larena7:
+if (getmapusers("pvp_n_7-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+warp "pvp_n_7-5.gat",102,102;
+close;
+
+Larena8:
+if (getmapusers("pvp_n_8-5.gat") > 14) goto Lsorry;
+mes "[ ^0065DFEpsilon MVP^000000 ]";
+mes "Here you go!";
+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 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_2-2",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera",156,179;
+ close;
+}
+
+// --- Alpha-MVP #2
+pvp_n_2-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_3-2",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera",156,179;
+ close;
+}
+// --- Alpha-MVP #3
+pvp_n_3-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_4-2.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Alpha-MVP #4
+pvp_n_4-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_5-2.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Alpha-MVP #5
+pvp_n_5-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_6-2.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Alpha-MVP #6
+pvp_n_6-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_7-2.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Alpha-MVP #7
+pvp_n_7-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_8-2.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Alpha-MVP #8
+pvp_n_8-2.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #1
+pvp_n_1-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_2-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+
+// --- Beta-MVP #2
+pvp_n_2-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_3-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #3
+pvp_n_3-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_4-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #4
+pvp_n_4-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_5-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #5
+pvp_n_5-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_6-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #6
+pvp_n_6-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_7-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #7
+pvp_n_7-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_8-3.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Beta-MVP #8
+pvp_n_8-3.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #1
+pvp_n_1-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_2-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+
+// --- Theta-MVP #2
+pvp_n_2-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_3-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #3
+pvp_n_3-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_4-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #4
+pvp_n_4-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_5-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #5
+pvp_n_5-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_6-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #6
+pvp_n_6-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_7-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #7
+pvp_n_7-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_8-4.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Theta-MVP #8
+pvp_n_8-4.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #1
+pvp_n_1-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_2-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+
+// --- Epsilon-MVP #2
+pvp_n_2-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_3-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #3
+pvp_n_3-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_4-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #4
+pvp_n_4-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_5-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #5
+pvp_n_5-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_6-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #6
+pvp_n_6-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_7-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #7
+pvp_n_7-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Harder Monsters",L_Next,"Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Next:
+ warp "pvp_n_8-5.gat",102,102;
+ close;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+// --- Epsilon-MVP #8
+pvp_n_8-5.gat,100,100,4 script MVP-Protector 727,{
+ mes "[ ^0065DFMVP-Protector^000000 ]";
+ mes "How do you need help?.";
+ menu "Heal Please",L_Heal,"Leave",L_Leave;
+
+ L_Heal:
+ Heal 32500,32500;
+ close;
+
+ L_Leave:
+ warp "prontera.gat",156,179;
+ close;
+}
+
+// ---- 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/other/bank.txt b/npc/other/bank.txt
index ae8ce7829..a02412e3c 100644
--- a/npc/other/bank.txt
+++ b/npc/other/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,0;
-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,0;
+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/other/blackjack.txt b/npc/other/blackjack.txt
index 0f8aa4e2a..c3429b5ec 100644
--- a/npc/other/blackjack.txt
+++ b/npc/other/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/other/books.txt b/npc/other/books.txt
index ece0e4d63..23e24a61b 100644
--- a/npc/other/books.txt
+++ b/npc/other/books.txt
@@ -1,2291 +1,2291 @@
-// $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)
-//<--------------- NPCs BOOKS [Update: July. 27, 2004] --------------->\\
-
-//<=========== Library - Begin ==========>\\
-prt_in.gat,159,56,4 script Monster Encyclopedia 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 deosn'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 shapeshift 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[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 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[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 immeduately.";
- 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 feagure 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 Grasshpper 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 Cloloured 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 realise 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 "Maneater 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 realised 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 thier 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 wich has spell-bound by Black Magic.Its gigantic body makes its moving slow.Recognises 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 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 outregeously 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.Dokkaebi";
- mes "Korean Traditional Ghost with Dark Skin. It looks so cute and has a small horn on the head.";
- mes "^0099FFFound Items^000000: Dokkaebi 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 "Mutent 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 passangers who intend to go over Mt.Mjornir. Be cautious of Argos,if you are the one of those passangers.";
- 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 "Corpes 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 Skeletion 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 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 everything's sold out,the shop will be closed automatically.";
- close;
- CloseB:
- close;
-}
-
-prt_in.gat,164,96,4 script Monster Encyclopedia 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 outregeously 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 "Corpes 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 outregeously 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 "Mutent 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,Scell,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 outregeously 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 outregeously 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 outregeously 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 human's 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 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 stonger 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 buttefly!'. 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 realise 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 shapeshift 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 deosn'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 Grasshpper 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 realise 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 shapeshift 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 Cloloured 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 passangers.";
- 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 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 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 immeduately.";
- 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 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",EndWatPro;
-
- 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 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 possiblity to be failed.";
- 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 be disapeared whenever 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 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 outregeously 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 outregeously 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 passangers.";
- 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 passangers.";
- 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 swordman,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 outregeously 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 Cloloured 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 outregeously 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 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 outregeously 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 Skeletion 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 Skeletion 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 outregeously 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 outregeously 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 outregeously 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.Recognises 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.Recognises 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 outregeously 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)
+//<--------------- NPCs BOOKS [Update: July. 27, 2004] --------------->\\
+
+//<=========== Library - Begin ==========>\\
+prt_in.gat,159,56,4 script Monster Encyclopedia 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 deosn'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 shapeshift 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[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 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[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 immeduately.";
+ 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 feagure 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 Grasshpper 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 Cloloured 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 realise 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 "Maneater 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 realised 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 thier 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 wich has spell-bound by Black Magic.Its gigantic body makes its moving slow.Recognises 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 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 outregeously 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.Dokkaebi";
+ mes "Korean Traditional Ghost with Dark Skin. It looks so cute and has a small horn on the head.";
+ mes "^0099FFFound Items^000000: Dokkaebi 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 "Mutent 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 passangers who intend to go over Mt.Mjornir. Be cautious of Argos,if you are the one of those passangers.";
+ 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 "Corpes 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 Skeletion 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 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 everything's sold out,the shop will be closed automatically.";
+ close;
+ CloseB:
+ close;
+}
+
+prt_in.gat,164,96,4 script Monster Encyclopedia 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 outregeously 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 "Corpes 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 outregeously 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 "Mutent 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,Scell,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 outregeously 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 outregeously 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 outregeously 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 human's 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 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 stonger 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 buttefly!'. 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 realise 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 shapeshift 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 deosn'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 Grasshpper 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 realise 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 shapeshift 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 Cloloured 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 passangers.";
+ 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 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 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 immeduately.";
+ 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 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",EndWatPro;
+
+ 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 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 possiblity to be failed.";
+ 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 be disapeared whenever 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 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 outregeously 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 outregeously 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 passangers.";
+ 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 passangers.";
+ 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 swordman,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 outregeously 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 Cloloured 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 outregeously 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 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 outregeously 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 Skeletion 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 Skeletion 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 outregeously 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 outregeously 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 outregeously 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.Recognises 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.Recognises 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 outregeously 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/breeder.txt b/npc/other/breeder.txt
index 86cb9aa99..af9d56bbb 100644
--- a/npc/other/breeder.txt
+++ b/npc/other/breeder.txt
@@ -1,65 +1,65 @@
-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(Class == 5 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 10 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 18 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4006 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4011 && checkcart(0) == 0) goto L_Cart_Ok;
-if(Class == 4019 && 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 Merchants, Blacksmiths and Alchimists 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(Class == 11 && checkfalcon(0) == 0) goto L_falc;
- if(Class == 4012 && 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 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 tame a Falcon.";
-close;
-L_Peco:
-if (Class == 7 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 14 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 4008 && checkriding(0) == 0) goto L_Peco_Ok;
-if (Class == 4015 && 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 can harness them.";
-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;
+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(Class == 5 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 10 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 18 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4006 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4011 && checkcart(0) == 0) goto L_Cart_Ok;
+if(Class == 4019 && 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 Merchants, Blacksmiths and Alchimists 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(Class == 11 && checkfalcon(0) == 0) goto L_falc;
+ if(Class == 4012 && 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 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 tame a Falcon.";
+close;
+L_Peco:
+if (Class == 7 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 14 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 4008 && checkriding(0) == 0) goto L_Peco_Ok;
+if (Class == 4015 && 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 can harness them.";
+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;
} \ No newline at end of file
diff --git a/npc/other/card_remover.txt b/npc/other/card_remover.txt
index be3ec14a8..460171461 100644
--- a/npc/other/card_remover.txt
+++ b/npc/other/card_remover.txt
@@ -1,169 +1,169 @@
-// Card removal NPC by TyrNemesis^
-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.";
- 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 < 8) && (@failtype == 1)) goto FAILREMOVECARD1;
-// if((@failchance < 8) && (@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.";
- close;
-
-FAILREMOVECARD0:
- mes "[Wise Old Woman]";
- mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
- 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.";
- 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.";
- 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.";
- 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.";
- 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.";
- close;
-
-CLOSEOUT:
- mes "[Wise Old Woman]";
- mes "Very well. Return at once if you seek my services.";
- close;
-
-}
+// Card removal NPC by TyrNemesis^
+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.";
+ 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 < 8) && (@failtype == 1)) goto FAILREMOVECARD1;
+// if((@failchance < 8) && (@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.";
+ close;
+
+FAILREMOVECARD0:
+ mes "[Wise Old Woman]";
+ mes "The process was a total failure. I am afraid the item and the cards were destroyed.";
+ 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.";
+ 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.";
+ 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.";
+ 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.";
+ 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.";
+ close;
+
+CLOSEOUT:
+ mes "[Wise Old Woman]";
+ mes "Very well. Return at once if you seek my services.";
+ close;
+
+}
diff --git a/npc/other/devnpc.txt b/npc/other/devnpc.txt
index 4a06cfcdd..6b61b4615 100644
--- a/npc/other/devnpc.txt
+++ b/npc/other/devnpc.txt
@@ -1,193 +1,193 @@
-//===== eAthena Script =======================================
-//= Dev edition NPCs!
-//===== By: ==================================================
-//= Most NPCs by Aria
-//= MouseJstr NPC by MouseJstr
-//===== 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 100;
- 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";
- initnpctimer;
- 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;
- break;
-Lquote1:
- npctalk "The only difference between a hurricane and skydiving is which direction the tree's come at you from..";
- setnpctimer 0;
- break;
-Lquote2:
- npctalk "Wanna be a GM? Write me a C routine that reverses a string in place..";
- setnpctimer 0;
- break;
-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;
- break;
-Lquote4:
- npctalk "I am the dark angel of eAthena.. withen weeks of my arrival, almost everybody was gone or dead.. fear me...";
- setnpctimer 0;
- break;
-}
-
-// MC Cameri =========================================================>\\
-morocc.gat,160,97,4 script MC Cameri 706,{
- npcspeed 150;
- mes "[MC Cameri]";
- mes "I'm the @command guy from oA...";
- mes "^FF00FFReal Name^000000: Can't tell you my name";
- mes "^FF00FFAge^000000: 16 years";
- mes "^FF00FFWhere I live^000000: Dominican Republic, in the caribbean";
- next;
- mes "[MC Cameri]";
- mes "^FF00FFWhat I Do^000000: mostly working on @commands for GMs...";
- mes "^FF00FFWhy 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.";
- initnpctimer;
- 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;
- break;
-Lquote1:
- npctalk "160,95-I owns you all, under my commands. *lol*";
- setnpctimer 0;
- break;
-Lquote2:
- npctalk "I forgot what my script, what do I have to say again? *_*U";
- setnpctimer 0;
- break;
-Lquote3:
- npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
- setnpctimer 0;
- break;
-Lquote4:
- npctalk "Are you guys my friends?";
- setnpctimer 0;
- break;
-Lquote5:
- npctalk "My mom told me not to talk to strangers. *stares*";
- setnpctimer 0;
- break;
-Lquote6:
- npctalk "How can you be SO ugly!?";
- setnpctimer 0;
- break;
-Lquote7:
- npctalk "I need a friend to play with =(. *sobs*";
- setnpctimer 0;
- break;
-Lquote8:
- npctalk "I've been kicking this rock for as long as I can remember.";
- setnpctimer 0;
- break;
-Lquote9:
- npctalk "My computer just broke, and I don't know how to format. *sobs*";
- setnpctimer 0;
- break;
-Lquote10:
- setnpctimer 0;
- break;
-}
-
-
-// Davidsiaw =========================================================>\\
-payon.gat,182,104,4 script Davidsiaw 1002,{
- npcspeed 150;
- mes "[Davidsiaw]";
- mes "omghi";
- initnpctimer;
- 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;
- break;
-Lquote1:
- npctalk "Wud are you looking at?";
- setnpctimer 0;
- break;
-Lquote2:
- npctalk "baka...";
- setnpctimer 0;
- break;
-Lquote3:
- npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
- setnpctimer 0;
- break;
-Lquote4:
- npctalk "*drops 100 Mjolnirs on the floor*";
- setnpctimer 0;
- break;
-Lquote5:
- npctalk "There ya go ;)";
- setnpctimer 0;
- break;
-Lquote6:
- setnpctimer 0;
- break;
+//===== eAthena Script =======================================
+//= Dev edition NPCs!
+//===== By: ==================================================
+//= Most NPCs by Aria
+//= MouseJstr NPC by MouseJstr
+//===== 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 100;
+ 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";
+ initnpctimer;
+ 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;
+ break;
+Lquote1:
+ npctalk "The only difference between a hurricane and skydiving is which direction the tree's come at you from..";
+ setnpctimer 0;
+ break;
+Lquote2:
+ npctalk "Wanna be a GM? Write me a C routine that reverses a string in place..";
+ setnpctimer 0;
+ break;
+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;
+ break;
+Lquote4:
+ npctalk "I am the dark angel of eAthena.. withen weeks of my arrival, almost everybody was gone or dead.. fear me...";
+ setnpctimer 0;
+ break;
+}
+
+// MC Cameri =========================================================>\\
+morocc.gat,160,97,4 script MC Cameri 706,{
+ npcspeed 150;
+ mes "[MC Cameri]";
+ mes "I'm the @command guy from oA...";
+ mes "^FF00FFReal Name^000000: Can't tell you my name";
+ mes "^FF00FFAge^000000: 16 years";
+ mes "^FF00FFWhere I live^000000: Dominican Republic, in the caribbean";
+ next;
+ mes "[MC Cameri]";
+ mes "^FF00FFWhat I Do^000000: mostly working on @commands for GMs...";
+ mes "^FF00FFWhy 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.";
+ initnpctimer;
+ 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;
+ break;
+Lquote1:
+ npctalk "160,95-I owns you all, under my commands. *lol*";
+ setnpctimer 0;
+ break;
+Lquote2:
+ npctalk "I forgot what my script, what do I have to say again? *_*U";
+ setnpctimer 0;
+ break;
+Lquote3:
+ npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
+ setnpctimer 0;
+ break;
+Lquote4:
+ npctalk "Are you guys my friends?";
+ setnpctimer 0;
+ break;
+Lquote5:
+ npctalk "My mom told me not to talk to strangers. *stares*";
+ setnpctimer 0;
+ break;
+Lquote6:
+ npctalk "How can you be SO ugly!?";
+ setnpctimer 0;
+ break;
+Lquote7:
+ npctalk "I need a friend to play with =(. *sobs*";
+ setnpctimer 0;
+ break;
+Lquote8:
+ npctalk "I've been kicking this rock for as long as I can remember.";
+ setnpctimer 0;
+ break;
+Lquote9:
+ npctalk "My computer just broke, and I don't know how to format. *sobs*";
+ setnpctimer 0;
+ break;
+Lquote10:
+ setnpctimer 0;
+ break;
+}
+
+
+// Davidsiaw =========================================================>\\
+payon.gat,182,104,4 script Davidsiaw 1002,{
+ npcspeed 150;
+ mes "[Davidsiaw]";
+ mes "omghi";
+ initnpctimer;
+ 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;
+ break;
+Lquote1:
+ npctalk "Wud are you looking at?";
+ setnpctimer 0;
+ break;
+Lquote2:
+ npctalk "baka...";
+ setnpctimer 0;
+ break;
+Lquote3:
+ npctalk "¿Donde estoy? *wonders* (<-- Means, where am I?)";
+ setnpctimer 0;
+ break;
+Lquote4:
+ npctalk "*drops 100 Mjolnirs on the floor*";
+ setnpctimer 0;
+ break;
+Lquote5:
+ npctalk "There ya go ;)";
+ setnpctimer 0;
+ break;
+Lquote6:
+ setnpctimer 0;
+ break;
} \ No newline at end of file
diff --git a/npc/other/gefenia.txt b/npc/other/gefenia.txt
index dbda378ce..28b93601c 100644
--- a/npc/other/gefenia.txt
+++ b/npc/other/gefenia.txt
@@ -1,31 +1,31 @@
-//===== 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
-//============================================================
-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
+//============================================================
+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/other/heal.txt b/npc/other/heal.txt
index b8df478b9..69fc7bf6a 100644
--- a/npc/other/heal.txt
+++ b/npc/other/heal.txt
@@ -1,41 +1,41 @@
-//===== eAthena Script =======================================
-//= Heal Npc
-//===== By: ==================================================
-//= Lotsa People (1.x)
-//===== Current Version: =====================================
-//= 2.0
-//===== Compatible With: =====================================
-//= eAthena 0.1+;
-//===== Description: =========================================
-//= Poring Which Heals For Free
-//===== Additional Comments: =================================
-//= 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 Healring#h1-1::Healring 1002,{
- mes "[Healring]";
- mes "Booooiiing!!";
- next;
- menu "Heal",-,"Quit",CANCEL;
- percentheal 100,100;
- mes "[Healring]";
- mes "Boooing! Booiing Boing! (Healed! Have fun!)";
- close;
- CANCEL:
- mes "[Healring]";
- mes "Boing Boing! (Bye Bye!)";
- close;
-}
-
-morocc.gat,159,96,5 duplicate(Healring) Healring#h1-2 1002
-geffen.gat,121,61,5 duplicate(Healring) Healring#h1-3 1002
-payon.gat,180,105,5 duplicate(Healring) Healring#h1-4 1002
-alberta.gat,185,144,5 duplicate(Healring) Healring#h1-5 1002
-aldebaran.gat,134,123,5 duplicate(Healring) Healring#h1-6 1002
-izlude.gat,125,118,5 duplicate(Healring) Healring#h1-7 1002
-xmas.gat,149,136,5 duplicate(Healring) Healring#h1-8 1002
-comodo.gat,188,162,5 duplicate(Healring) Healring#h1-9 1002
-amatsu.gat,200,80,5 duplicate(Healring) Healring#h1-10 1002
+//===== eAthena Script =======================================
+//= Heal Npc
+//===== By: ==================================================
+//= Lotsa People (1.x)
+//===== Current Version: =====================================
+//= 2.0
+//===== Compatible With: =====================================
+//= eAthena 0.1+;
+//===== Description: =========================================
+//= Poring Which Heals For Free
+//===== Additional Comments: =================================
+//= 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 Healring#h1-1::Healring 1002,{
+ mes "[Healring]";
+ mes "Booooiiing!!";
+ next;
+ menu "Heal",-,"Quit",CANCEL;
+ percentheal 100,100;
+ mes "[Healring]";
+ mes "Boooing! Booiing Boing! (Healed! Have fun!)";
+ close;
+ CANCEL:
+ mes "[Healring]";
+ mes "Boing Boing! (Bye Bye!)";
+ close;
+}
+
+morocc.gat,159,96,5 duplicate(Healring) Healring#h1-2 1002
+geffen.gat,121,61,5 duplicate(Healring) Healring#h1-3 1002
+payon.gat,180,105,5 duplicate(Healring) Healring#h1-4 1002
+alberta.gat,185,144,5 duplicate(Healring) Healring#h1-5 1002
+aldebaran.gat,134,123,5 duplicate(Healring) Healring#h1-6 1002
+izlude.gat,125,118,5 duplicate(Healring) Healring#h1-7 1002
+xmas.gat,149,136,5 duplicate(Healring) Healring#h1-8 1002
+comodo.gat,188,162,5 duplicate(Healring) Healring#h1-9 1002
+amatsu.gat,200,80,5 duplicate(Healring) Healring#h1-10 1002
gonryun.gat,164,130,5 duplicate(Healring) Healring#h1-1 1002 \ No newline at end of file
diff --git a/npc/other/heal_payment.txt b/npc/other/heal_payment.txt
index 344ee96d9..39a832985 100644
--- a/npc/other/heal_payment.txt
+++ b/npc/other/heal_payment.txt
@@ -1,99 +1,99 @@
-//===== eAthena Script =======================================
-//= Dog Script (for healings)
-//===== By: ==================================================
-//= Yor
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version (need dog sprite)
-//===== Description: =========================================
-//= Dog 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]
-//============================================================
-
-prontera.gat,150,184,5 script Healring#h2-1::Healring 1002,{
- set @tempHp, MaxHp-Hp;
- set @tempSp, ((MaxSp-Sp) * BaseLevel) / 5;
- if (@tempHp > 0) goto WOUNDED;
- if (@tempSp > 0) goto ONLY_REGENERATION;
-
- mes "[Healring]";
- mes "Booiiing Boiing (You don't need healings).";
- mes "Boing Boing! (Bye Bye!)";
- close;
-
- WOUNDED:
- if (@tempSp > 0) goto WITH_REGENERATION;
- mes "[Healring]";
- mes "Booiing: BoooiiinnnG (Need healings: "+@tempHp+" z)?";
- mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
- next;
- menu "Healing ("+@tempHp+"z)",HEALINGS,"No, thanks",CANCEL;
-
- WITH_REGENERATION:
- mes "[Healring]";
- mes "Booiing: BoooiiinnnG (Need only healing: "+@tempHp+" z)?";
- mes "Boooing: BoooiiinnnG (Only a regeneration: "+@tempSp+" z)?";
- mes "Booiing Boooing: BoooiiinnnG (or healing and regeneration: "+(@tempHp+@tempSp)+" z)?";
- mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
- next;
- menu "Only healings ("+@tempHp+"z)",HEALINGS,"Only a regeneration ("+@tempSp+"z)",REGENERATION,"Healings with regeneration ("+(@tempHp+@tempSp)+"z)",HEALINGS_AND_REGENERATION,"Nothing, thanks",CANCEL;
-
- ONLY_REGENERATION:
- mes "[Healring]";
- mes "Boooing: BoooiiinnnG (Need a regeneration: "+@tempSp+" z)?";
- mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
- next;
- menu "Regeneration ("+@tempSp+"z)",REGENERATION,"No, thanks",CANCEL;
-
- HEALINGS:
- if (Zeny < @tempHp) goto NO_ZENYS;
- set Zeny, Zeny-@tempHp;
- heal 30000,0;
- goto FIN;
-
- REGENERATION:
- if (Zeny < @tempSp) goto NO_ZENYS;
- set Zeny, Zeny-@tempSp;
- heal 0,30000;
- goto FIN;
-
- HEALINGS_AND_REGENERATION:
- if (Zeny < (@tempHp+@tempSp)) goto NO_ZENYS;
- set Zeny, Zeny-(@tempHp+@tempSp);
- heal 30000,30000;
- goto FIN;
-
- NO_ZENYS:
- mes "[Healring]";
- mes "BOIING! (You don't have enough zenys)!";
- mes "BOING BOING!! (Starver)!";
- close;
-
- FIN:
- mes "[Healring]";
- mes "Boooing! Booiing Boing! (Healed! Have fun!)";
- close;
-
- CANCEL:
- mes "[Healring]";
- mes "Boing Boing! (Bye Bye!)";
- close;
-}
-
-
-morocc.gat,159,96,5 duplicate(Healring) Healring#h2-2 1002
-geffen.gat,121,61,5 duplicate(Healring) Healring#h2-3 1002
-payon.gat,180,105,5 duplicate(Healring) Healring#h2-4 1002
-alberta.gat,185,144,5 duplicate(Healring) Healring#h2-5 1002
-aldebaran.gat,134,123,5 duplicate(Healring) Healring#h2-6 1002
-izlude.gat,125,118,5 duplicate(Healring) Healring#h2-7 1002
-xmas.gat,149,136,5 duplicate(Healring) Healring#h2-8 1002
-comodo.gat,188,162,5 duplicate(Healring) Healring#h2-9 1002
-amatsu.gat,200,80,5 duplicate(Healring) Healring#h2-10 1002
+//===== eAthena Script =======================================
+//= Dog Script (for healings)
+//===== By: ==================================================
+//= Yor
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version (need dog sprite)
+//===== Description: =========================================
+//= Dog 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]
+//============================================================
+
+prontera.gat,150,184,5 script Healring#h2-1::Healring 1002,{
+ set @tempHp, MaxHp-Hp;
+ set @tempSp, ((MaxSp-Sp) * BaseLevel) / 5;
+ if (@tempHp > 0) goto WOUNDED;
+ if (@tempSp > 0) goto ONLY_REGENERATION;
+
+ mes "[Healring]";
+ mes "Booiiing Boiing (You don't need healings).";
+ mes "Boing Boing! (Bye Bye!)";
+ close;
+
+ WOUNDED:
+ if (@tempSp > 0) goto WITH_REGENERATION;
+ mes "[Healring]";
+ mes "Booiing: BoooiiinnnG (Need healings: "+@tempHp+" z)?";
+ mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
+ next;
+ menu "Healing ("+@tempHp+"z)",HEALINGS,"No, thanks",CANCEL;
+
+ WITH_REGENERATION:
+ mes "[Healring]";
+ mes "Booiing: BoooiiinnnG (Need only healing: "+@tempHp+" z)?";
+ mes "Boooing: BoooiiinnnG (Only a regeneration: "+@tempSp+" z)?";
+ mes "Booiing Boooing: BoooiiinnnG (or healing and regeneration: "+(@tempHp+@tempSp)+" z)?";
+ mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
+ next;
+ menu "Only healings ("+@tempHp+"z)",HEALINGS,"Only a regeneration ("+@tempSp+"z)",REGENERATION,"Healings with regeneration ("+(@tempHp+@tempSp)+"z)",HEALINGS_AND_REGENERATION,"Nothing, thanks",CANCEL;
+
+ ONLY_REGENERATION:
+ mes "[Healring]";
+ mes "Boooing: BoooiiinnnG (Need a regeneration: "+@tempSp+" z)?";
+ mes "BOINNG: Booing (I use zenys for a good cause: my medicines and my Poring Food)!";
+ next;
+ menu "Regeneration ("+@tempSp+"z)",REGENERATION,"No, thanks",CANCEL;
+
+ HEALINGS:
+ if (Zeny < @tempHp) goto NO_ZENYS;
+ set Zeny, Zeny-@tempHp;
+ heal 30000,0;
+ goto FIN;
+
+ REGENERATION:
+ if (Zeny < @tempSp) goto NO_ZENYS;
+ set Zeny, Zeny-@tempSp;
+ heal 0,30000;
+ goto FIN;
+
+ HEALINGS_AND_REGENERATION:
+ if (Zeny < (@tempHp+@tempSp)) goto NO_ZENYS;
+ set Zeny, Zeny-(@tempHp+@tempSp);
+ heal 30000,30000;
+ goto FIN;
+
+ NO_ZENYS:
+ mes "[Healring]";
+ mes "BOIING! (You don't have enough zenys)!";
+ mes "BOING BOING!! (Starver)!";
+ close;
+
+ FIN:
+ mes "[Healring]";
+ mes "Boooing! Booiing Boing! (Healed! Have fun!)";
+ close;
+
+ CANCEL:
+ mes "[Healring]";
+ mes "Boing Boing! (Bye Bye!)";
+ close;
+}
+
+
+morocc.gat,159,96,5 duplicate(Healring) Healring#h2-2 1002
+geffen.gat,121,61,5 duplicate(Healring) Healring#h2-3 1002
+payon.gat,180,105,5 duplicate(Healring) Healring#h2-4 1002
+alberta.gat,185,144,5 duplicate(Healring) Healring#h2-5 1002
+aldebaran.gat,134,123,5 duplicate(Healring) Healring#h2-6 1002
+izlude.gat,125,118,5 duplicate(Healring) Healring#h2-7 1002
+xmas.gat,149,136,5 duplicate(Healring) Healring#h2-8 1002
+comodo.gat,188,162,5 duplicate(Healring) Healring#h2-9 1002
+amatsu.gat,200,80,5 duplicate(Healring) Healring#h2-10 1002
gonryun.gat,164,130,5 duplicate(Healring) Healring#h2-1 1002 \ No newline at end of file
diff --git a/npc/other/kafra_bank.txt b/npc/other/kafra_bank.txt
index f332dcada..8d8bf4fc9 100644
--- a/npc/other/kafra_bank.txt
+++ b/npc/other/kafra_bank.txt
@@ -1,106 +1,106 @@
-//===== eAthena Script =======================================
-//= 2nd Bank of Prontera ( with daily 0.01% income! )
-//===== By: ==================================================
-//= Lupus (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== 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
-//============================================================
-
-prontera.gat,131,190,1 script Bank Clerk 112,{
- cutin "kafra_06",2;
- mes"[Manya]";
- 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 summ
-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 a bank account",-,"-Quit",B_EXIT2;
- if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2;
-
- mes"[Manya]";
- mes "Please, tell me how much zeny you would like to deposit.";
- next;
- input @kafrabank;
-
- if(@kafrabank<1000) goto L_LESS_1000;
- if(@kafrabank>1000000) goto L_TOO_BIG_AMOUNT;
- if(@kafrabank>zeny) goto L_NOT_ENOUGH;
- set zeny,zeny-@kafrabank;
- set #kafrabank,#kafrabank+@kafrabank;
- mes"[Manya]";
- mes "You've made a deposit of ^135445" + @kafrabank + "z^000000.";
-
- goto B_EXIT;
-
-M_WITHDRAW:
- if(#kafrabank==0) goto L_ZERO_ACCOUNT;
- mes"[Manya]";
- 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>1000000) goto L_TOO_BIG_AMOUNT;
- if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH;
- set #kafrabank,#kafrabank-@kafrabank;
- set zeny,zeny+@kafrabank;
- mes"[Manya]";
- mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here...";
- goto B_EXIT;
-
-L_NOT_ENOUGH:
- mes"[Manya]";
- mes "You don't have enough zeny for this operation.";
- next;
- goto B_EXIT2;
-
-L_ZERO_ACCOUNT:
- mes"[Manya]";
- mes "You don't have any zeny on your account!";
- next;
- goto B_EXIT2;
-
-L_TOO_BIG_AMOUNT:
- mes"[Manya]";
- mes "Sorry. The maximum deposit you can make on a time is 1,000,000 zeny.";
- next;
- goto B_EXIT2;
-
-L_LESS_1000:
- mes"[Manya]";
- 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"[Manya]";
- mes "Thank you for using our Bank Service. We hope to see you again soon.";
- cutin "kafra_06",255;
- close;
-
+//===== eAthena Script =======================================
+//= 2nd Bank of Prontera ( with daily 0.01% income! )
+//===== By: ==================================================
+//= Lupus (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== 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
+//============================================================
+
+prontera.gat,131,190,1 script Bank Clerk 112,{
+ cutin "kafra_06",2;
+ mes"[Manya]";
+ 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 summ
+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 a bank account",-,"-Quit",B_EXIT2;
+ if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2;
+
+ mes"[Manya]";
+ mes "Please, tell me how much zeny you would like to deposit.";
+ next;
+ input @kafrabank;
+
+ if(@kafrabank<1000) goto L_LESS_1000;
+ if(@kafrabank>1000000) goto L_TOO_BIG_AMOUNT;
+ if(@kafrabank>zeny) goto L_NOT_ENOUGH;
+ set zeny,zeny-@kafrabank;
+ set #kafrabank,#kafrabank+@kafrabank;
+ mes"[Manya]";
+ mes "You've made a deposit of ^135445" + @kafrabank + "z^000000.";
+
+ goto B_EXIT;
+
+M_WITHDRAW:
+ if(#kafrabank==0) goto L_ZERO_ACCOUNT;
+ mes"[Manya]";
+ 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>1000000) goto L_TOO_BIG_AMOUNT;
+ if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH;
+ set #kafrabank,#kafrabank-@kafrabank;
+ set zeny,zeny+@kafrabank;
+ mes"[Manya]";
+ mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here...";
+ goto B_EXIT;
+
+L_NOT_ENOUGH:
+ mes"[Manya]";
+ mes "You don't have enough zeny for this operation.";
+ next;
+ goto B_EXIT2;
+
+L_ZERO_ACCOUNT:
+ mes"[Manya]";
+ mes "You don't have any zeny on your account!";
+ next;
+ goto B_EXIT2;
+
+L_TOO_BIG_AMOUNT:
+ mes"[Manya]";
+ mes "Sorry. The maximum deposit you can make on a time is 1,000,000 zeny.";
+ next;
+ goto B_EXIT2;
+
+L_LESS_1000:
+ mes"[Manya]";
+ 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"[Manya]";
+ mes "Thank you for using our Bank Service. We hope to see you again soon.";
+ cutin "kafra_06",255;
+ close;
+
} \ No newline at end of file
diff --git a/npc/other/mc_cameri/bank.txt b/npc/other/mc_cameri/bank.txt
index 45216738b..25074f4c7 100644
--- a/npc/other/mc_cameri/bank.txt
+++ b/npc/other/mc_cameri/bank.txt
@@ -1,2794 +1,2794 @@
-//========================================================================================
-// -»» OmniAthena Scripts ««-
-// Copyright (c) 2004, Athena Advanced
-// http://agelessanime.com/aaforums/
-// By MC_Cameri
-// This Bank NPC doesn't need any items.
-// It is useful for servers in which you
-// lose zeny when you die.
-// Also, if you have 1,000,000,000z this
-// will be good to use.
-//========================================================================================
-//0072FF (sky blue)
-//FF7F01 (orange)
-
-prt_in.gat,165,141,4 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-izlude_in.gat,57,110,4 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-morocc_in.gat,142,64,3 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-geffen_in.gat,77,169,2 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-//Fixed location for new payon
-payon.gat,155,97,4 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-alberta_in.gat,187,26,2 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-aldebaran.gat,144,120,4 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-xmas_in.gat,35,37,5 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-cmd_in01.gat,115,171,7 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-yuno_in01.gat,119,29,2 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-amatsu.gat,189,108,6 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-gonryun.gat,146,142,3 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
-}
-
-um_in.gat,154,125,4 script Bank Manager 109,{
- set @tInterestRate, 2; //no decimals
- set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
- set @tMaxZeny, 1000000000; //max zeny that a player can carry
- set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
- set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
- set @tMinDeposit,100; //min zeny to deposit
- set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
- mes "^0072FF[Bank Manager]^000000";
- mes "Welcome to this office branch of Midgard's Bank.";
- next;
- if (vBankAccActive==1) goto AccMenu;
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
- mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
- next;
- menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
- BankInfo:
- mes "^0072FF[Bank Manager]^000000";
- mes "Here are some points that you need to know:";
- mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
- mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
- mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
- next;
- mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
- mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
- mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
- close;
- CreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
- mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
- mes "Are you sure you want to continue?";
- next;
- menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
- CreateAccCont:
- if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
- set Zeny, Zeny - @tCreateZeny;
- set vBankAccActive,1;
- set vBankAccZeny, @tBeginningZeny;
- set vBankAccLastZeny, @tBeginningZeny;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
- mes "You may now proceed to do any transactions.";
- next;
- goto AccMenu;
- CreateAccNoEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Didn't I tell you to make sure you had enough zeny?";
- mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
- mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
- next;
- goto EndNPC;
- NoCreateAcc:
- mes "^0072FF[Bank Manager]^000000";
- mes "Come back when you change your mind!";
- next;
- goto EndNPC;
- AccMenu:
- mes "^0072FF[Bank Manager]^000000";
- mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
- mes "What would you like to do now?";
- next;
- menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
- AccDeposit:
- mes "^0072FF[Bank Manager]^000000";
- mes "It's always good to deposit every once in a while.";
- mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
- mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
- mes "How much are you willing to deposit?";
- next;
- AccDepositInput:
- input @tDeposit;
- set @tDepositTax, @tDeposit * @tInterestRate / 100;
- set @tDepositTotal, @tDeposit - @tDepositTax;
- if (@tDeposit <= 0) goto AccDepositNoInput;
- if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
- if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
- set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
- if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
- if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, for some weird reason I couldn't deposit your money.";
- next;
- goto AccMenu;
- AccDepositCont:
- set Zeny, Zeny - @tDeposit;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, @tBankAccZenyTemp;
- set vBankAccInterests, vBankAccInterests + @tDepositTax;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
- mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
- next;
- goto AccMenu;
- AccDepositOver:
- mes "^0072FF[Bank Manager]^000000";
- mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
- mes "You can't deposit more than that, please try again.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You need to put more money in order to make a deposit.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccDepositNotEnoughZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
- mes "Remember that taxes are being applied.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdraw:
- mes "^0072FF[Bank Manager]^000000";
- mes "This is the only transaction I don't like... you figure out why...";
- mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
- mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
- mes "How much are you going to widthdraw?";
- next;
- AccWithdrawInput:
- input @tWithdraw;
- set @tZenyLeft, vBankAccZeny - @tWithdraw;
- set @tZenyTemp, Zeny + @tWithdraw;
- if (@tWithdraw == 0) goto AccWithdrawNoInput;
- if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
- if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
- set Zeny, Zeny + @tWithdraw;
- set vBankAccLastZeny, vBankAccZeny;
- set vBankAccZeny, vBankAccZeny - @tWithdraw;
- mes "^0072FF[Bank Manager]^000000";
- mes "Transaction completed successfully.";
- mes "Thank you for using our services.";
- next;
- goto AccMenu;
- AccWithdrawNoInput:
- mes "^0072FF[Bank Manager]^000000";
- mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithdrawMinZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "I'm sorry...";
- mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
- mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccWithDrawOverCharZeny:
- mes "^0072FF[Bank Manager]^000000";
- mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
- mes "Do you want to try again?";
- next;
- menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
- AccBalance:
- mes "^0072FF[Bank Manager]^000000";
- mes "Account Status:";
- //shown in blue if the same or more, show in red if less than previous balance
- if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
- mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance2:
- mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
- goto AccBalance3;
- AccBalance3:
- mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
- mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
- mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
- next;
- goto AccMenu;
- AccClose:
- mes "^0072FF[Bank Manager]^000000";
- mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
- mes "Of course, you will get all your money back.";
- mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
- next;
- menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
- AccCloseConfirm:
- set vBankAccActive,0;
- set Zeny, Zeny + vBankAccZeny;
- set vBankAccZeny,0;
- set vBankAccLastZeny,0;
- set vBankAccInterests,0;
- mes "^0072FF[Bank Manager]^000000";
- mes "Thanks for using our services, we hope you come back to visit us.";
- mes "Here's your money.";
- next;
- goto EndNPC;
- AccCloseKeep:
- mes "^0072FF[Bank Manager]^000000";
- mes "Good choice, thanks for staying with us.";
- next;
- goto AccMenu;
- EndNPC:
- set @random,rand(4);
- mes "^0072FF[Bank Manager]^000000";
- if (@random == 0) mes "Have a nice day!";
- if (@random == 1) mes "See you soon!";
- if (@random == 2) mes "See you next time!";
- if (@random == 3) mes "Come back soon!";
- close;
+//========================================================================================
+// -»» OmniAthena Scripts ««-
+// Copyright (c) 2004, Athena Advanced
+// http://agelessanime.com/aaforums/
+// By MC_Cameri
+// This Bank NPC doesn't need any items.
+// It is useful for servers in which you
+// lose zeny when you die.
+// Also, if you have 1,000,000,000z this
+// will be good to use.
+//========================================================================================
+//0072FF (sky blue)
+//FF7F01 (orange)
+
+prt_in.gat,165,141,4 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+izlude_in.gat,57,110,4 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+morocc_in.gat,142,64,3 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+geffen_in.gat,77,169,2 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+//Fixed location for new payon
+payon.gat,155,97,4 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+alberta_in.gat,187,26,2 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+aldebaran.gat,144,120,4 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+xmas_in.gat,35,37,5 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+cmd_in01.gat,115,171,7 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+yuno_in01.gat,119,29,2 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+amatsu.gat,189,108,6 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+gonryun.gat,146,142,3 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
+}
+
+um_in.gat,154,125,4 script Bank Manager 109,{
+ set @tInterestRate, 2; //no decimals
+ set @tMaxAccZeny, 1000000000; //max zeny allowed in ^FF7F01Bank Account^000000 1,000,000,000=1 billion
+ set @tMaxZeny, 1000000000; //max zeny that a player can carry
+ set @tMinZeny, 100; //min zeny allowed or Bank Account is closed
+ set @tCreateZeny, 500; //zeny needed in order to create a Bank Account
+ set @tMinDeposit,100; //min zeny to deposit
+ set @tBeginningZeny, 100; //amount of zeny in Bank Account after creating
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Welcome to this office branch of Midgard's Bank.";
+ next;
+ if (vBankAccActive==1) goto AccMenu;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have a ^FF7F01Bank Account^000000 yet, you must buy one.";
+ mes "It will cost you ^0000FF" + @tCreateZeny + "z^000000 to create it.";
+ next;
+ menu "^FF7F01Create Account.^000000",CreateAcc,"^FF7F01Information.^000000",BankInfo,"^FF7F01No thanks.^000000",NoCreateAcc;
+ BankInfo:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Here are some points that you need to know:";
+ mes "1. To create a ^FF7F01Bank Account^000000 you have to pay ^0000FF" + @tCreateZeny + "z^000000.";
+ mes "2. You will be charged ^0000FF" + @tInterestRate + " percent^000000 everytime you Deposit.";
+ mes "3. You must always have no less than ^0000FF" + @tMinZeny + "z^000000 on your ^FF7F01Bank Account^000000.";
+ next;
+ mes "4. You can save up to ^0000FF" + @tMaxAccZeny + "z^000000 in your bank account.";
+ mes "5. You will be able to access your ^FF7F01Bank Account^000000 in any town with a Bank Office.";
+ mes "6. You will start by having ^0000FF" + @tBeginningZeny + "z^000000 in your bank account.";
+ close;
+ CreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "First of all, you will have to have at least ^0000FF" + @tCreateZeny + "z^000000 with you.";
+ mes "Your account will start with ^0000FF" + @tBeginningZeny +"z^000000.";
+ mes "Are you sure you want to continue?";
+ next;
+ menu "^FF7F01Sure.^000000",CreateAccCont,"^FF7F01Nah, it's ok.^000000",NoCreateAcc;
+ CreateAccCont:
+ if (@tCreateZeny > Zeny) goto CreateAccNoEnoughZeny;
+ set Zeny, Zeny - @tCreateZeny;
+ set vBankAccActive,1;
+ set vBankAccZeny, @tBeginningZeny;
+ set vBankAccLastZeny, @tBeginningZeny;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Congratulations, your ^FF7F01Bank Account^000000 is now created with ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "You may now proceed to do any transactions.";
+ next;
+ goto AccMenu;
+ CreateAccNoEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Didn't I tell you to make sure you had enough zeny?";
+ mes "You can't create it with just ^0000FF" + Zeny + "z^000000.";
+ mes "Come back when you get those ^0000FF" + @tCreateZeny + "z^000000...";
+ next;
+ goto EndNPC;
+ NoCreateAcc:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Come back when you change your mind!";
+ next;
+ goto EndNPC;
+ AccMenu:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Your current balance is ^0000FF" + vBankAccZeny +"z^000000.";
+ mes "What would you like to do now?";
+ next;
+ menu "^FF7F01Deposit.^000000",AccDeposit,"^FF7F01Withdraw.^000000",AccWithdraw,"^FF7F01Bank Account Info.^000000",AccBalance,"^FF7F01Close Bank Account^000000",AccClose,"^FF7F01Cancel.^000000",EndNPC;
+ AccDeposit:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "It's always good to deposit every once in a while.";
+ mes "Be noticed that we charge a ^0000FF" + @tInterestRate + " percent ^000000 of interest rate in every deposit you make.";
+ mes "This means that to deposit ^0000FF100z^000000 you need to have pay us ^0000FF" + 100 * @tInterestRate / 100 + "z^000000.";
+ mes "How much are you willing to deposit?";
+ next;
+ AccDepositInput:
+ input @tDeposit;
+ set @tDepositTax, @tDeposit * @tInterestRate / 100;
+ set @tDepositTotal, @tDeposit - @tDepositTax;
+ if (@tDeposit <= 0) goto AccDepositNoInput;
+ if (@tDeposit < @tMinDeposit) goto AccDepositNotEnoughInput;
+ if (@tDepositTotal > Zeny) goto AccDepositNotEnoughZeny;
+ set @tBankAccZenyTemp, vBankAccZeny + @tDepositTotal;
+ if (@tBankAccZenyTemp > @tMaxAccZeny) goto AccDepositOver;
+ if ((@tDeposit <= Zeny) && (@tBankAccZenyTemp <= @tMaxAccZeny)) goto AccDepositCont;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, for some weird reason I couldn't deposit your money.";
+ next;
+ goto AccMenu;
+ AccDepositCont:
+ set Zeny, Zeny - @tDeposit;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, @tBankAccZenyTemp;
+ set vBankAccInterests, vBankAccInterests + @tDepositTax;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "^0000FF" + @tDeposit + "z^000000 substracted from your money (Taxes applied).";
+ mes "^0000FF" + @tDepositTotal + "z^000000 successfully added to your ^FF7F01Bank Account^000000.";
+ next;
+ goto AccMenu;
+ AccDepositOver:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "There is a limit of ^0000FF" + @tMaxAccZeny + "z^000000 of how much zeny your ^FF7F01Bank Account^000000 can hold.";
+ mes "You can't deposit more than that, please try again.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You need to put more money in order to make a deposit.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You must enter a value higher than ^0000FF" + @tMinDeposit + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccDepositNotEnoughZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "You don't have ^0000FF" + @tDepositTotal + "z^000000.";
+ mes "Remember that taxes are being applied.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccDepositInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdraw:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "This is the only transaction I don't like... you figure out why...";
+ mes "You can't withdraw leaving less than ^0000FF" + @tMinZeny +"z^000000 in your ^FF7F01Bank Account^000000.";
+ mes "Your current balance is ^0000FF" + vBankAccZeny + "z^000000.";
+ mes "How much are you going to widthdraw?";
+ next;
+ AccWithdrawInput:
+ input @tWithdraw;
+ set @tZenyLeft, vBankAccZeny - @tWithdraw;
+ set @tZenyTemp, Zeny + @tWithdraw;
+ if (@tWithdraw == 0) goto AccWithdrawNoInput;
+ if (@tZenyLeft < @tMinZeny) goto AccWithdrawMinZeny;
+ if (@tZenyTemp > @tMaxZeny) goto AccWithDrawOverCharZeny;
+ set Zeny, Zeny + @tWithdraw;
+ set vBankAccLastZeny, vBankAccZeny;
+ set vBankAccZeny, vBankAccZeny - @tWithdraw;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Transaction completed successfully.";
+ mes "Thank you for using our services.";
+ next;
+ goto AccMenu;
+ AccWithdrawNoInput:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "In order to withdraw from the bank, you must withdraw more than 0 zeny.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithdrawMinZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "I'm sorry...";
+ mes "You can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your ^FF7F01Bank Account^000000 must have ^0000FF" + @tMinZeny + "z^000000 left or more at all times.";
+ mes "In order to take all your money from the bank you must select Close Account in the Account Menu.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccWithDrawOverCharZeny:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Sorry, but you can't withdraw ^0000FF" + @tWithdraw + "z^000000 because your Player can't carry more than ^0000FF" + @tMaxZeny + "z^000000.";
+ mes "Do you want to try again?";
+ next;
+ menu "^FF7F01Yes, please.^000000",AccWithdrawInput,"^FF7F01No, thanks.^000000",AccMenu;
+ AccBalance:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Account Status:";
+ //shown in blue if the same or more, show in red if less than previous balance
+ if (vBankAccZeny >= vBankAccLastZeny) goto AccBalance2;
+ mes "Current Balance: ^FF0000" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance2:
+ mes "Current Balance: ^0000FF" + vBankAccZeny +"z^000000.";
+ goto AccBalance3;
+ AccBalance3:
+ mes "Previous Balance: ^0000FF" + vBankAccLastZeny +"z^000000.";
+ mes "Interest Rate: ^0000FF" + @tInterestRate + "%^000000.";
+ mes "Interests Payed: ^0000FF" + vBankAccInterests + "z^000000.";
+ next;
+ goto AccMenu;
+ AccClose:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "If you close your ^FF7F01Bank Account^000000, it means you eliminate it.";
+ mes "Of course, you will get all your money back.";
+ mes "Are you sure you want to close your ^FF7F01Bank Account^000000?";
+ next;
+ menu "^FF7F01I don't want it anymore.^000000",AccCloseConfirm,"^FF7F01No, I'll keep it.^000000",AccCloseKeep;
+ AccCloseConfirm:
+ set vBankAccActive,0;
+ set Zeny, Zeny + vBankAccZeny;
+ set vBankAccZeny,0;
+ set vBankAccLastZeny,0;
+ set vBankAccInterests,0;
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Thanks for using our services, we hope you come back to visit us.";
+ mes "Here's your money.";
+ next;
+ goto EndNPC;
+ AccCloseKeep:
+ mes "^0072FF[Bank Manager]^000000";
+ mes "Good choice, thanks for staying with us.";
+ next;
+ goto AccMenu;
+ EndNPC:
+ set @random,rand(4);
+ mes "^0072FF[Bank Manager]^000000";
+ if (@random == 0) mes "Have a nice day!";
+ if (@random == 1) mes "See you soon!";
+ if (@random == 2) mes "See you next time!";
+ if (@random == 3) mes "Come back soon!";
+ close;
} \ No newline at end of file
diff --git a/npc/other/momotaro.txt b/npc/other/momotaro.txt
index 4ca7aaad2..745ad5540 100644
--- a/npc/other/momotaro.txt
+++ b/npc/other/momotaro.txt
@@ -1,443 +1,443 @@
-//=====================================================================
-//MOMOTARO event (translated thanks to Shinomori)
-//=====================================================================
-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 "I represent ^009CFFTsurukame Publishing Inc.^000000 and handle the legends that are told in the village for generations.";
- mes "A popular legend among men and women of all ages is ^009CFF<Momotaro>^000000......";
- next;
- mes "[Publisher]";
- mes "One Million copies were sold!";
- mes "To celebrate the anniversary, the ^3163FFMomotaro Event Hall^000000 was established.";
- next;
- mes "[Publisher]";
- mes "You practical become the protagonist of the Momotaro Story and fight against a small demon.";
- mes "There are also presents!";
- next;
- menu "Who is Momotaro?",-,"I really wanna do that!",L1,"I'm busy right now......",L2;
- mes "[Publisher]";
- mes "What? You do not know Momotaro? Oh my, what an insensitive person......";
- mes "Well then, I will tell you......";
- next;
- mes "[Publisher]";
- mes "Once upon a time, there was an old couple......";
- mes "The couple had a very good relation, but they had no children...";
- next;
- mes "[Publisher]";
- mes "Someday, the grandmother did their laundry at the river, a big peach flowed by. ";
- mes "The Grandmother picked up the peach and returned home, where the grandfather tried to divide the fruit...... ";
- mes "But from the middle of the peach a baby appeared.";
- next;
- mes "[Publisher]";
- mes "Grandfather and Grandmother were surprised very much, but decided to raise the baby as their own child.";
- next;
- mes "[Publisher]";
- mes "The Child grow up rapidly and became a strong young boy several days later.";
- next;
- mes "[Publisher]";
- mes "The name of the child was ^3163FF<Momotaro>^000000.";
- mes "In those days a small demon appeard and tormented the village people so Momotaro decided to go on a travel to exterminate the demon......";
- next;
- mes "[Publisher]";
- mes "Along the way Momotaro met a ^3163FFmonkey^000000, a ^3163FFpheasant^000000 and a ^3163FFdog^000000m which followed him as companions.";
- mes " Finally they defeated the demon and lived with the grandfather and the grandmother in happiness...... ";
- mes "- the end -";
- next;
- mes "[Publisher]";
- mes "How was it?";
- mes "It was of interest One Million times!";
- close;
-L1:
- mes "[Publisher]";
- mes "Oh! You are a good and powerfull person! To me you seem to be vigorous. ";
- mes "Well then, this application form has to be filled......";
- next;
- mes "[Publisher]";
- mes "......";
- mes "......Hmm hmm......";
- mes "......Well! Everything ok!";
- mes "We can start at once. Please enjoy the ^3163FFMomotaro Event Hall^000000.";
- next;
-//modification
-// warp "ama_test",52,35;
- warp "ama_fild01",330,130;
-//end modification
- break;
-L2:
- mes "[Publisher]";
- mes "There are also premium presents, you know....... (wink)";
- 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) getitem 627,1; //sweet milk
- if (event_momo == 2) getitem 629,1; //singing flower
- if (event_momo == 3) getitem 625,1; //rusty iron
-//Am Mut successful finish unknown
- if (event_momo == 4) getitem 627,1; //sweet milk
- if (event_momo == 4) getitem 629,1; //singing flower
- if (event_momo == 4) getitem 625,1; //rusty iron
- set event_momo,10;
- 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,52,44,4 script Waiting Room Staff 109,{
- mes "[Satoshi]";
- mes "Welcome to the Momotaro Event Hall";
- next;
- mes "[Satoshi]";
- mes "I'm in charge of the waiting room of the Momotaro Event Hall. My name is Satoshi.";
- next;
- mes "[Satoshi]";
- mes "Originally this was the work of the publisher, but...... she was not sufficient for that job and got transfered suddenly......";
- mes "But this was good! Because this way we could make the attraction even more challenging for the visitors.";
- next;
- mes "[Satoshi]";
- mes "......hehehe, no no, it was just a joke...... (sweat)";
- next;
- mes "[Satoshi]";
- mes "Well, I will give you an explanation about the Event Hall.";
- next;
- mes "[Satoshi]";
- mes "Did you ask the Publisher outside about the Momotaro Story?";
- next;
- menu "Yes",L1,"No",-;
- mes "[Satoshi]";
- mes "What the heck? You come here without knowing the story?";
- mes "......";
- mes "You are by no means a fan of Momotaro.";
- next;
- mes "[Satoshi]";
- mes "The Story is told by the publisher outside. Well then...... Goodby.";
- next;
- warp "amatsu.gat",223,230;
- break;
-L1:
- mes "[Satoshi]";
- mes "Hmm......";
- mes "The story of Momotaro is the best work of this Publisher. Maybe it is even a supreme masterpiece?";
- mes "Hahaha!!!";
- next;
- mes "[Satoshi]";
- mes "...... So, what's next...";
- next;
- mes "[Satoshi]";
- mes "The rule of the Event Hall are simple. Just go in, like the brave Momotaro! And if the small demon is defeated, everything will be good.";
- mes "Well, be brave!";
- next;
- mes "[Satoshi]";
- mes "Furthermore, there are 3 important points.";
- next;
- mes "[Satoshi]";
- mes "First:";
- mes "When the Event Hall is cleared it cannot be entered again.";
- mes "Please pay attention to this point.";
- next;
- mes "[Satoshi]";
- mes "Second:";
- mes "Please do not go accompanied by a pet inside the Event Hall. If you have a pet with you, please change it back to an egg before entering.";
- next;
- mes "[Satoshi]";
- mes "And the last important point:";
- mes "There is a time restriction of 6 minutes for people entering the Event Hall.";
- next;
- mes "[Satoshi]";
- mes "Well then, Please enter the Waiting Room Chat and wait for your turn. I wish you a good fight.";
- close;
-OnInit:
- waitingroom "Event Hall Waiting Room",1,"Waiting Room Staff::OnMax";
-//modification
-//do clear everything in case of somebody got stuck in the hall
- areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
- disablenpc "Manager";
- enablenpc "Grandfather";
- enablenpc "Grandmother";
- killmonsterall "ama_test.gat";
- stopnpctimer "roomtimer";
-//end modification
- break;
-OnMax:
-//modification
-// doevent "roomt";
- initnpctimer "roomtimer";
-//end modification
- warpwaitingpc "ama_test.gat",50,83;
- disablenpc "Waiting Room Staff";
- disablenpc "Manager";
- enablenpc "Grandfather";
- enablenpc "Grandmother";
- break;
-}
-
-ama_test.gat,49,95,4 script Grandfather 766,{
-//modification
- mes "[Grandfather]";
- mes "Zzzzzz......";
-//end modification
- close;
-}
-
-ama_test.gat,51,95,4 script Grandmother 761,{
- mes "[Grandmother]";
- mes "Oh....!?";
- next;
- mes "[Grandmother]";
- mes "Grandfather, do you know where I put my money?";
- next;
- mes "[Grandfather]";
- mes "Grandmother...... The village headman said, that the small demons recently stole money from people right in the middle of the village, causing big tumult...";
- next;
- mes "[Grandmother]";
- mes "Iiiiiii......!";
- next;
- mes "[Grandfather]";
- mes "This is the recent talk in the village......";
- next;
- mes "[Grandfather]";
- mes "Oh, there is Momotaro......";
- next;
- mes "[Grandfather]";
- mes "As you probably know, there are only cowards here with no power to fight the small demons....";
- mes "So I would like to ask you a favour, Momotaro.";
- next;
- mes "[Grandmother]";
- mes "Momotaro......";
- mes "Your Grandmother would like to give you ^3355ffthe tastiest red portion on this world^000000...... but I cannot...... ";
- next;
- mes "[Grandmother]";
- mes "I'm so sorry...... Momotaro......";
- next;
- mes "[Grandmother & Grandfather]";
- mes "Please, Momotaro, help us......";
-//modification
- addtimer 5000, "Grandmother::OnTimer5000";
- close;
-OnTimer5000:
-//end modification
- disablenpc "Grandfather";
- disablenpc "Grandmother";
- set @mobdie,0;
- monster "ama_test.gat",47,101,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",51,101,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",55,101,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",55,97,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",55,93,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",53,91,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",49,91,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",45,96,"Small Demon",1110,1,"mobcount";
- monster "ama_test.gat",45,99,"Small Demon",1110,1,"mobcount";
- end;
-}
-
-ama_test.gat,50,100,4 script Manager 762,{
-//modification
- if (event_momo >= 4) goto LSecondFin;
-//end modification
- 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!";
- next;
- set event_momo,1;
-//modification
-// deltimer "roomt";
-//end modification
- disablenpc "Manager";
- enablenpc "Waiting Room Staff";
- warp "amatsu.gat",223,230;
- break;
-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 Grad^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;
-//modification
- goto LWarpOut;
-// break;
-//end modification
-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!";
-//modification
- addtimer 5000, "Manager::OnTimer5000";
-//end modification
- close;
-OnTimer5000:
- monster "ama_test.gat",35,103,"Demon",1301,1,"mobcount2";
- monster "ama_test.gat",56,111,"Demon",1301,1,"mobcount2";
- monster "ama_test.gat",40,91,"Demon",1301,1,"mobcount2";
- disablenpc "Manager";
- set event_momo,3;
- end;
-//modification
-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.";
- next;
- set event_momo,4;
-LWarpOut:
-//end modification
- mes "[Manager]";
- mes "Whatever you encounter, never loose that strong spirit!";
- next;
- warp "amatsu.gat",223,230;
- disablenpc "Manager";
- enablenpc "Waiting Room Staff";
- donpcevent "Waiting Room Staff::OnInit";
- break;
-Onstart:
- mes "[Manager]";
- mes "Hohoho......";
- close;
-}
-//=======================================MobCount===============================-
-ama_test.gat,0,1,0 script mobcount -1,{
- if (@mobdie >= 8) goto Lfin;
- set @mobdie,@mobdie+1;
- set @mobrand,rand(4);
- if (@mobrand == 1) goto Lrand2;
- if (@mobrand == 2) goto Lrand3;
- if (@mobrand == 3) goto Lrand4;
-Lrand1:
- areaannounce "ama_test.gat",30,78,68,120,"Small Demon: I havn't done anything!",8;break;
-Lrand2:
- areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Excuse me, Excuse me",8;break;
-Lrand3:
- areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Ahhh......",8;break;
-Lrand4:
- areaannounce "ama_test.gat",30,78,68,120,"Small Demon: I've been hit on surprise...",8;break;
-Lfin:
- areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Uhhaaa......",8;
- addtimer 5000, "mobcount2::OnTimer5000";
-//modification
- stopnpctimer "roomtimer";
- end;
-// enablenpc "Manager";
-// doevent "Manager::Onstart";
-// end;
-//end modification
-}
-//=======================================MobCount2==============================-
-ama_test.gat,50,101,0 script mobcount2 -1,{
- if (@mobdie2 == 2) goto Lfin;
- set @mobdie2,@mobdie2+1;
- areaannounce "ama_test.gat",30,78,68,120,"Am Mut: Uhaaa...",8;break;
-Lfin:
- set event_momo,4;
-//modification
- addtimer 5000, "mobcount2::OnTimer5000";
- end;
-OnTimer5000:
-//end modification
- enablenpc "Manager";
- doevent "Manager::Onstart";
- end;
-}
-//=======================================TIMER==================================-
-
-//modification
-//dead code
-//ama_test.gat,50,102,0 script roomt -1,{
-//
-// deltimer "roomt";
-// mapannounce "ama_test.gat","Time limit is 6 Minutes from now.",8;
-// addtimer 180000,"roomt::On180000";
-// end;
-//
-//OnTestTime:
-// mapannounce "ama_test.gat","Time left: "+temp_time+"sec ",8;
-// break;
-//
-//On180000:
-// deltimer "roomt";
-// mapannounce "ama_test.gat","3 Minutes left.",8;
-// addtimer 120000,"roomt::On300000";
-// break;
-//On300000:
-// deltimer "roomt";
-// mapannounce "ama_test.gat","One Minute left.",8;
-// addtimer 60000,"roomt::On360000";
-// break;
-//On360000:
-// mapannounce "ama_test.gat","Hohoho - Time limit is exceeded.",8;
-// disablenpc "Manager";
-// enablenpc "Waiting Room Staff";
-// areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
-// break;
-//}
-
-ama_test.gat,50,102,0 script roomtimer -1,{
-
-OnTimer1000:
- mapannounce "ama_test.gat","Time limit is 6 Minutes from now.",8;
- end;
-OnTimer180000:
- mapannounce "ama_test.gat","3 Minutes left.",8;
- end;
-OnTimer300000:
- mapannounce "ama_test.gat","One Minute left.",8;
- end;
-OnTimer360000:
- stopnpctimer "roomtimer";
- mapannounce "ama_test.gat","Hohoho - Time limit is exceeded.",8;
- areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
- disablenpc "Manager";
- enablenpc "Waiting Room Staff";
- donpcevent "Waiting Room Staff::OnInit";
- end;
-}
+//=====================================================================
+//MOMOTARO event (translated thanks to Shinomori)
+//=====================================================================
+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 "I represent ^009CFFTsurukame Publishing Inc.^000000 and handle the legends that are told in the village for generations.";
+ mes "A popular legend among men and women of all ages is ^009CFF<Momotaro>^000000......";
+ next;
+ mes "[Publisher]";
+ mes "One Million copies were sold!";
+ mes "To celebrate the anniversary, the ^3163FFMomotaro Event Hall^000000 was established.";
+ next;
+ mes "[Publisher]";
+ mes "You practical become the protagonist of the Momotaro Story and fight against a small demon.";
+ mes "There are also presents!";
+ next;
+ menu "Who is Momotaro?",-,"I really wanna do that!",L1,"I'm busy right now......",L2;
+ mes "[Publisher]";
+ mes "What? You do not know Momotaro? Oh my, what an insensitive person......";
+ mes "Well then, I will tell you......";
+ next;
+ mes "[Publisher]";
+ mes "Once upon a time, there was an old couple......";
+ mes "The couple had a very good relation, but they had no children...";
+ next;
+ mes "[Publisher]";
+ mes "Someday, the grandmother did their laundry at the river, a big peach flowed by. ";
+ mes "The Grandmother picked up the peach and returned home, where the grandfather tried to divide the fruit...... ";
+ mes "But from the middle of the peach a baby appeared.";
+ next;
+ mes "[Publisher]";
+ mes "Grandfather and Grandmother were surprised very much, but decided to raise the baby as their own child.";
+ next;
+ mes "[Publisher]";
+ mes "The Child grow up rapidly and became a strong young boy several days later.";
+ next;
+ mes "[Publisher]";
+ mes "The name of the child was ^3163FF<Momotaro>^000000.";
+ mes "In those days a small demon appeard and tormented the village people so Momotaro decided to go on a travel to exterminate the demon......";
+ next;
+ mes "[Publisher]";
+ mes "Along the way Momotaro met a ^3163FFmonkey^000000, a ^3163FFpheasant^000000 and a ^3163FFdog^000000m which followed him as companions.";
+ mes " Finally they defeated the demon and lived with the grandfather and the grandmother in happiness...... ";
+ mes "- the end -";
+ next;
+ mes "[Publisher]";
+ mes "How was it?";
+ mes "It was of interest One Million times!";
+ close;
+L1:
+ mes "[Publisher]";
+ mes "Oh! You are a good and powerfull person! To me you seem to be vigorous. ";
+ mes "Well then, this application form has to be filled......";
+ next;
+ mes "[Publisher]";
+ mes "......";
+ mes "......Hmm hmm......";
+ mes "......Well! Everything ok!";
+ mes "We can start at once. Please enjoy the ^3163FFMomotaro Event Hall^000000.";
+ next;
+//modification
+// warp "ama_test",52,35;
+ warp "ama_fild01",330,130;
+//end modification
+ break;
+L2:
+ mes "[Publisher]";
+ mes "There are also premium presents, you know....... (wink)";
+ 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) getitem 627,1; //sweet milk
+ if (event_momo == 2) getitem 629,1; //singing flower
+ if (event_momo == 3) getitem 625,1; //rusty iron
+//Am Mut successful finish unknown
+ if (event_momo == 4) getitem 627,1; //sweet milk
+ if (event_momo == 4) getitem 629,1; //singing flower
+ if (event_momo == 4) getitem 625,1; //rusty iron
+ set event_momo,10;
+ 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,52,44,4 script Waiting Room Staff 109,{
+ mes "[Satoshi]";
+ mes "Welcome to the Momotaro Event Hall";
+ next;
+ mes "[Satoshi]";
+ mes "I'm in charge of the waiting room of the Momotaro Event Hall. My name is Satoshi.";
+ next;
+ mes "[Satoshi]";
+ mes "Originally this was the work of the publisher, but...... she was not sufficient for that job and got transfered suddenly......";
+ mes "But this was good! Because this way we could make the attraction even more challenging for the visitors.";
+ next;
+ mes "[Satoshi]";
+ mes "......hehehe, no no, it was just a joke...... (sweat)";
+ next;
+ mes "[Satoshi]";
+ mes "Well, I will give you an explanation about the Event Hall.";
+ next;
+ mes "[Satoshi]";
+ mes "Did you ask the Publisher outside about the Momotaro Story?";
+ next;
+ menu "Yes",L1,"No",-;
+ mes "[Satoshi]";
+ mes "What the heck? You come here without knowing the story?";
+ mes "......";
+ mes "You are by no means a fan of Momotaro.";
+ next;
+ mes "[Satoshi]";
+ mes "The Story is told by the publisher outside. Well then...... Goodby.";
+ next;
+ warp "amatsu.gat",223,230;
+ break;
+L1:
+ mes "[Satoshi]";
+ mes "Hmm......";
+ mes "The story of Momotaro is the best work of this Publisher. Maybe it is even a supreme masterpiece?";
+ mes "Hahaha!!!";
+ next;
+ mes "[Satoshi]";
+ mes "...... So, what's next...";
+ next;
+ mes "[Satoshi]";
+ mes "The rule of the Event Hall are simple. Just go in, like the brave Momotaro! And if the small demon is defeated, everything will be good.";
+ mes "Well, be brave!";
+ next;
+ mes "[Satoshi]";
+ mes "Furthermore, there are 3 important points.";
+ next;
+ mes "[Satoshi]";
+ mes "First:";
+ mes "When the Event Hall is cleared it cannot be entered again.";
+ mes "Please pay attention to this point.";
+ next;
+ mes "[Satoshi]";
+ mes "Second:";
+ mes "Please do not go accompanied by a pet inside the Event Hall. If you have a pet with you, please change it back to an egg before entering.";
+ next;
+ mes "[Satoshi]";
+ mes "And the last important point:";
+ mes "There is a time restriction of 6 minutes for people entering the Event Hall.";
+ next;
+ mes "[Satoshi]";
+ mes "Well then, Please enter the Waiting Room Chat and wait for your turn. I wish you a good fight.";
+ close;
+OnInit:
+ waitingroom "Event Hall Waiting Room",1,"Waiting Room Staff::OnMax";
+//modification
+//do clear everything in case of somebody got stuck in the hall
+ areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
+ disablenpc "Manager";
+ enablenpc "Grandfather";
+ enablenpc "Grandmother";
+ killmonsterall "ama_test.gat";
+ stopnpctimer "roomtimer";
+//end modification
+ break;
+OnMax:
+//modification
+// doevent "roomt";
+ initnpctimer "roomtimer";
+//end modification
+ warpwaitingpc "ama_test.gat",50,83;
+ disablenpc "Waiting Room Staff";
+ disablenpc "Manager";
+ enablenpc "Grandfather";
+ enablenpc "Grandmother";
+ break;
+}
+
+ama_test.gat,49,95,4 script Grandfather 766,{
+//modification
+ mes "[Grandfather]";
+ mes "Zzzzzz......";
+//end modification
+ close;
+}
+
+ama_test.gat,51,95,4 script Grandmother 761,{
+ mes "[Grandmother]";
+ mes "Oh....!?";
+ next;
+ mes "[Grandmother]";
+ mes "Grandfather, do you know where I put my money?";
+ next;
+ mes "[Grandfather]";
+ mes "Grandmother...... The village headman said, that the small demons recently stole money from people right in the middle of the village, causing big tumult...";
+ next;
+ mes "[Grandmother]";
+ mes "Iiiiiii......!";
+ next;
+ mes "[Grandfather]";
+ mes "This is the recent talk in the village......";
+ next;
+ mes "[Grandfather]";
+ mes "Oh, there is Momotaro......";
+ next;
+ mes "[Grandfather]";
+ mes "As you probably know, there are only cowards here with no power to fight the small demons....";
+ mes "So I would like to ask you a favour, Momotaro.";
+ next;
+ mes "[Grandmother]";
+ mes "Momotaro......";
+ mes "Your Grandmother would like to give you ^3355ffthe tastiest red portion on this world^000000...... but I cannot...... ";
+ next;
+ mes "[Grandmother]";
+ mes "I'm so sorry...... Momotaro......";
+ next;
+ mes "[Grandmother & Grandfather]";
+ mes "Please, Momotaro, help us......";
+//modification
+ addtimer 5000, "Grandmother::OnTimer5000";
+ close;
+OnTimer5000:
+//end modification
+ disablenpc "Grandfather";
+ disablenpc "Grandmother";
+ set @mobdie,0;
+ monster "ama_test.gat",47,101,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",51,101,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",55,101,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",55,97,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",55,93,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",53,91,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",49,91,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",45,96,"Small Demon",1110,1,"mobcount";
+ monster "ama_test.gat",45,99,"Small Demon",1110,1,"mobcount";
+ end;
+}
+
+ama_test.gat,50,100,4 script Manager 762,{
+//modification
+ if (event_momo >= 4) goto LSecondFin;
+//end modification
+ 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!";
+ next;
+ set event_momo,1;
+//modification
+// deltimer "roomt";
+//end modification
+ disablenpc "Manager";
+ enablenpc "Waiting Room Staff";
+ warp "amatsu.gat",223,230;
+ break;
+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 Grad^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;
+//modification
+ goto LWarpOut;
+// break;
+//end modification
+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!";
+//modification
+ addtimer 5000, "Manager::OnTimer5000";
+//end modification
+ close;
+OnTimer5000:
+ monster "ama_test.gat",35,103,"Demon",1301,1,"mobcount2";
+ monster "ama_test.gat",56,111,"Demon",1301,1,"mobcount2";
+ monster "ama_test.gat",40,91,"Demon",1301,1,"mobcount2";
+ disablenpc "Manager";
+ set event_momo,3;
+ end;
+//modification
+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.";
+ next;
+ set event_momo,4;
+LWarpOut:
+//end modification
+ mes "[Manager]";
+ mes "Whatever you encounter, never loose that strong spirit!";
+ next;
+ warp "amatsu.gat",223,230;
+ disablenpc "Manager";
+ enablenpc "Waiting Room Staff";
+ donpcevent "Waiting Room Staff::OnInit";
+ break;
+Onstart:
+ mes "[Manager]";
+ mes "Hohoho......";
+ close;
+}
+//=======================================MobCount===============================-
+ama_test.gat,0,1,0 script mobcount -1,{
+ if (@mobdie >= 8) goto Lfin;
+ set @mobdie,@mobdie+1;
+ set @mobrand,rand(4);
+ if (@mobrand == 1) goto Lrand2;
+ if (@mobrand == 2) goto Lrand3;
+ if (@mobrand == 3) goto Lrand4;
+Lrand1:
+ areaannounce "ama_test.gat",30,78,68,120,"Small Demon: I havn't done anything!",8;break;
+Lrand2:
+ areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Excuse me, Excuse me",8;break;
+Lrand3:
+ areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Ahhh......",8;break;
+Lrand4:
+ areaannounce "ama_test.gat",30,78,68,120,"Small Demon: I've been hit on surprise...",8;break;
+Lfin:
+ areaannounce "ama_test.gat",30,78,68,120,"Small Demon: Uhhaaa......",8;
+ addtimer 5000, "mobcount2::OnTimer5000";
+//modification
+ stopnpctimer "roomtimer";
+ end;
+// enablenpc "Manager";
+// doevent "Manager::Onstart";
+// end;
+//end modification
+}
+//=======================================MobCount2==============================-
+ama_test.gat,50,101,0 script mobcount2 -1,{
+ if (@mobdie2 == 2) goto Lfin;
+ set @mobdie2,@mobdie2+1;
+ areaannounce "ama_test.gat",30,78,68,120,"Am Mut: Uhaaa...",8;break;
+Lfin:
+ set event_momo,4;
+//modification
+ addtimer 5000, "mobcount2::OnTimer5000";
+ end;
+OnTimer5000:
+//end modification
+ enablenpc "Manager";
+ doevent "Manager::Onstart";
+ end;
+}
+//=======================================TIMER==================================-
+
+//modification
+//dead code
+//ama_test.gat,50,102,0 script roomt -1,{
+//
+// deltimer "roomt";
+// mapannounce "ama_test.gat","Time limit is 6 Minutes from now.",8;
+// addtimer 180000,"roomt::On180000";
+// end;
+//
+//OnTestTime:
+// mapannounce "ama_test.gat","Time left: "+temp_time+"sec ",8;
+// break;
+//
+//On180000:
+// deltimer "roomt";
+// mapannounce "ama_test.gat","3 Minutes left.",8;
+// addtimer 120000,"roomt::On300000";
+// break;
+//On300000:
+// deltimer "roomt";
+// mapannounce "ama_test.gat","One Minute left.",8;
+// addtimer 60000,"roomt::On360000";
+// break;
+//On360000:
+// mapannounce "ama_test.gat","Hohoho - Time limit is exceeded.",8;
+// disablenpc "Manager";
+// enablenpc "Waiting Room Staff";
+// areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
+// break;
+//}
+
+ama_test.gat,50,102,0 script roomtimer -1,{
+
+OnTimer1000:
+ mapannounce "ama_test.gat","Time limit is 6 Minutes from now.",8;
+ end;
+OnTimer180000:
+ mapannounce "ama_test.gat","3 Minutes left.",8;
+ end;
+OnTimer300000:
+ mapannounce "ama_test.gat","One Minute left.",8;
+ end;
+OnTimer360000:
+ stopnpctimer "roomtimer";
+ mapannounce "ama_test.gat","Hohoho - Time limit is exceeded.",8;
+ areawarp "ama_test.gat",30,78,68,120,"amatsu.gat",223,230;
+ disablenpc "Manager";
+ enablenpc "Waiting Room Staff";
+ donpcevent "Waiting Room Staff::OnInit";
+ end;
+}
diff --git a/npc/other/msg_boards.txt b/npc/other/msg_boards.txt
index a3dfe38f2..634337abf 100644
--- a/npc/other/msg_boards.txt
+++ b/npc/other/msg_boards.txt
@@ -1,175 +1,175 @@
-//===== eAthena Script =======================================
-//= Message Boards
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Rearranged [Lupus]
-//============================================================
-
-
-
-//=======================================================================//
-// Al De Baran //
-//=======================================================================//
-/ Welcome Sign ------------------------------------------------
-aldebaran.gat,133,104,1 script Welcome Sign 111,
-{
- mes "~sign reads....~";
- mes "Hello and enjoy your visit to Aldebaran! Aldebaran is the mystical city of clocks and Kafras!";
- close;
-}
-
-// Kafra Corp. Main Office Sign ---------------------------------------------------------------
-aldebaran.gat,53,223,1 script Kafra Corp. Main Office 111,
-{
- mes "~sign reads...~";
- mes "This is the Kafra Services Main Office, home to the lovely Kafra employees.";
- 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 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 111,
-{
- mes "~sign reads...~";
- mes "Greetings!! You are in the wonderfull city of Geffen! Geffen is the city of Magic and home to Mages and Wizards!.";
- close;
-}
-
-// Sign: Restaurant Inn ---------------------------------------------
-geffen.gat,167,175,1 script Geffen Restaurant Inn 111,
-{
- mes "~sign reads..... ~";
- mes "Welcome weary travelers! Have a hot meal and stay the night at the the Geffen Restaurant Inn!";
- close;
-}
-
-// Sign: Mage Association ---------------------------------------
-geffen.gat,61,174,1 script Mage Association 111,
-{
- mes "~sign reads...~";
- mes "Greetings!! This is the Geffen Magic Academy. Come in if you have an interest in all things magic!";
- 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 Academey 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 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 //
-//=======================================================================//
-// Welcome Sign ---------------------------------------------------
-morocc.gat,168,264,1 script Welcome Sign 111,
-{
- mes "~sign reads...~";
- mes "Morocc welcomes you! Morocc is the city of the desert and home to Thieves, Assassins, and alls sorts of Egyption temptations!";
- close;
-}
-
-// 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 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 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.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Rearranged [Lupus]
+//============================================================
+
+
+
+//=======================================================================//
+// Al De Baran //
+//=======================================================================//
+/ Welcome Sign ------------------------------------------------
+aldebaran.gat,133,104,1 script Welcome Sign 111,
+{
+ mes "~sign reads....~";
+ mes "Hello and enjoy your visit to Aldebaran! Aldebaran is the mystical city of clocks and Kafras!";
+ close;
+}
+
+// Kafra Corp. Main Office Sign ---------------------------------------------------------------
+aldebaran.gat,53,223,1 script Kafra Corp. Main Office 111,
+{
+ mes "~sign reads...~";
+ mes "This is the Kafra Services Main Office, home to the lovely Kafra employees.";
+ 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 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 111,
+{
+ mes "~sign reads...~";
+ mes "Greetings!! You are in the wonderfull city of Geffen! Geffen is the city of Magic and home to Mages and Wizards!.";
+ close;
+}
+
+// Sign: Restaurant Inn ---------------------------------------------
+geffen.gat,167,175,1 script Geffen Restaurant Inn 111,
+{
+ mes "~sign reads..... ~";
+ mes "Welcome weary travelers! Have a hot meal and stay the night at the the Geffen Restaurant Inn!";
+ close;
+}
+
+// Sign: Mage Association ---------------------------------------
+geffen.gat,61,174,1 script Mage Association 111,
+{
+ mes "~sign reads...~";
+ mes "Greetings!! This is the Geffen Magic Academy. Come in if you have an interest in all things magic!";
+ 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 Academey 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 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 //
+//=======================================================================//
+// Welcome Sign ---------------------------------------------------
+morocc.gat,168,264,1 script Welcome Sign 111,
+{
+ mes "~sign reads...~";
+ mes "Morocc welcomes you! Morocc is the city of the desert and home to Thieves, Assassins, and alls sorts of Egyption temptations!";
+ close;
+}
+
+// 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 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 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;
+}
diff --git a/npc/other/old/guide.txt b/npc/other/old/guide.txt
index 8952fd20b..1e21387c4 100644
--- a/npc/other/old/guide.txt
+++ b/npc/other/old/guide.txt
@@ -1,1153 +1,1153 @@
-//===== eAthena Script =======================================
-//= Guide Script
-//===== By: ==================================================
-//= Lotsa People (1.0)
-//= Even More People (1.1)
-//= Darkchild (1.2)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any eAthena Version In Which Duplicate Works
-//===== Description: =========================================
-//= Guides In RO World
-//===== Additional Comments: =================================
-//= 1.2 - Used the duplicate and fixed minor things
-//============================================================
-
-//[Prontera Guide]
-
-//Complete
-prontera.gat,154,187,4 script Guide#p1-1::guide_p 105,{
- cutin "prt_soldier",2;
- mes "[Prontera Squad]";
- mes "Welcome to Prontera,the Capital City of Rune-Midgard Kingdom.";
- mes "We can help you to find Buildings easily, Feel free to inquire at us anytime.";
- mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
- mes "[Prontera Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please.",-,"No, Thanks.",L_MENU_1_ROOT;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- mes "[Prontera Squad]";
- mes "Please select location you want me to show you.";
- L_SUB_1:
- next;
- menu "Swordman Asosiation",L_MENU_1_1,"^0000FFSantuary^000000",L_MENU_1_2,"Prontera Chivalry",L_MENU_1_3,"Armory",L_MENU_1_4,"Kit Shop",L_MENU_1_5,"Inn",L_MENU_1_6,"Trading Post",L_MENU_1_7,"Pub",L_MENU_1_8,"Library",L_MENU_1_9,"Job Agency",L_MENU_1_10,"The Castle of Prontera",L_MENU_1_11,"City Hall",L_MENU_1_12,"Cancel",L_MENU_1_13;
- L_MENU_1_1:
- mes "[Prontera Squad]";
- mes "The 'Swordman Assosiation' has moved to Izlude, the Sattelite of Prontera, now that Building is Empty";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,237,41,1,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Prontera Squad]";
- mes "The main Chapel of Rune-Midgard Kingdom, `Santuary' is located at Northeast. Usually citizens visit there to become Acolyte";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,236,316,2,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Prontera Squad]";
- mes "'Prontera Chivalry' the Defense Force of Prontera City is located at Northwest.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,46,345,3,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Prontera Squad]";
- mes "'Armory' is located at Northeast around the Fountain.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,175,220,4,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Prontera Squad]";
- mes "'Kit Shop' is located Northwest around the Fountain.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,134,221,5,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_6:
- mes "[Prontera Squad]";
- mes "There are 2 'Inn's' around the Fountain, on is located at West, other one at East.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,204,214,6,0xFF00FF;
- viewpoint 1,107,192,7,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_7:
- mes "[Prontera Squad]";
- mes "'Trading Post' is located at Southeast around the Fountain.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,179,184,8,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_8:
- mes "[Prontera Squad]";
- mes "'Pub is located at Southeast around the Fountain, right behind Trading Post building.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,208,154,9,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_9:
- mes "[Prontera Squad]";
- mes "There are 2 Buildings of 'Library', located both at Northern East and Northern West around the Fountain.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,120,267,10,0x00FF00;
- viewpoint 1,192,267,11,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_10:
- mes "[Prontera Squad]";
- mes "'Job Agency' is located at Southeast of the Fountain.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,133,183,12,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_11:
- mes "[Prontera Squad]";
- mes "'The Castle Of Prontera' is located at Due North. Clockwise rotation is 12.";
- mes "And when you go outside the Castle through a postern, you will see the North Prontera Field.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,156,360,13,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_12:
- mes "[Prontera Squad]";
- mes "City Hall is located at Southeast Contour. The Clockwise rotarion is 7.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,75,91,14,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_13:
- mes "[Prontera Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
- goto L_START_1;
- 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;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Prontera Squad]";
- mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Prontera Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Prontera Squad]";
- mes "Have a nice day.";
- cutin "prt_soldier",255;
- close;
-}
-//Duplicate
-prontera.gat,282,208,2 duplicate(guide_p) Guide#p1-2 105
-
-prontera.gat,29,200,6 duplicate(guide_p) Guide#p1-3 105
-
-prontera.gat,160,29,0 duplicate(guide_p) Guide#p1-4 105
-
-prontera.gat,151,330,4 duplicate(guide_p) Guide#p1-5 105
-
-
-//[Izlude]
-
-//Complete
-izlude.gat,123,87,6 script Guide 105,{
- mes "[Izlude Squad]";
- mes "Welcome to Izlude, the New Satelite of Prontera.";
- mes "Feel free to inquire at us anytime, Algight?";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
- mes "[Izlude Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please",-,"No, Thanks",L_SUB_1;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- L_SUB_1:
- next;
- menu "^FF0000Swordman Asosiation^000000",L_MENU_1_1,"Swordman Hall",L_MENU_1_2,"Arena",L_MENU_1_3,"Izlude Marina",L_MENU_1_4,"Armory",L_MENU_1_5,"Kit Shop",L_MENU_1_6,"Cancel",L_MENU_1_7;
- L_MENU_1_1:
- mes "[Izlude Squad]";
- mes "Do you want to be a Swordman?";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,52,140,1,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Izlude Squad]";
- mes "Swordman Hall, the official Building of Swordman Assosiation is at East Contour.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,214,130,2,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Izlude Squad]";
- mes "'Arena' the Popular Colosseum is at Due North. The Clockwise totation is 12.";
- mes "You can have fun there, you know.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,128,225,3,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Izlude Squad]";
- mes "Marina which allows you to go to 'Alberta' or 'Byalan Island' is at Northeast.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,200,180,4,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Izlude Squad]";
- mes "Armory is near at Northwest, and you can find it easily.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,111,149,5,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_6:
- mes "[Izlude Squad]";
- mes "Kit Shop is near at Northeast, and you can find it easily.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,148,148,6,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_7:
- mes "[Izlude Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
- goto L_START_1;
- 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;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Izlude Squad]";
- mes "We altered the Location Guideinto de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Izlude Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Izlude Squad]";
- mes "Don't get lost.";
- close;
-}
-
-//[Geffen]
-
-//Complete
-geffen.gat,203,116,0 script Guide#p1-6::guide_g 705,{
- cutin "gef_soldier",2;
- mes "[Geffen Squad]";
- mes "Welcome to Geffen, the City of Magic.";
- mes "We will help you when you take the Wrong way, Feel free to inquire at us anytime.";
- mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
- mes "[Geffen Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- L_SUB_1:
- next;
- menu "^FF0000Magic Acadamy^000000",L_MENU_1_1,"Forge",L_MENU_1_2,"Armory",L_MENU_1_3,"Kit Shop",L_MENU_1_4,"Pub",L_MENU_1_5,"Inn",L_MENU_1_6,"Cancel",L_MENU_1_7;
- L_MENU_1_1:
- mes "[Geffen Squad]";
- mes "'Magic Acadamy' is the Building in charge of Every Magical Theory.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,61,180,1,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Geffen Squad]";
- mes "'Forge' is located at Southeast around the Tower of Magic.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,182,59,2,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Geffen Squad]";
- mes "'Armory' is located at Northwest oround the Tower of Magic.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,99,140,3,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Geffen Squad]";
- mes "'Kit Shop' is located at Southwest arround the Tower of Magic.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,44,86,4,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Geffen Squad]";
- mes "'Pub' is located at Northeast around the Tower of Magic.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,138,138,5,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_6:
- mes "[Geffen Squad]";
- mes "'Inn' is located at Northeast around the Tower of Magic.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,172,174,6,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_7:
- mes "[Geffen Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
- goto L_START_1;
- L_MENU_2:
- viewpoint 2,61,180,1,0xFF0000;
- viewpoint 2,182,59,2,0x00FF00;
- viewpoint 2,99,140,3,0xFF00FF;
- viewpoint 2,44,86,4,0xFF00FF;
- viewpoint 2,138,138,5,0xFF00FF;
- viewpoint 2,172,174,6,0xFF00FF;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Geffen Squad]";
- mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Geffen Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Geffen Squad]";
- mes "Have a nice day.";
- cutin "gef_soldier",255;
- close;
-}
-
-//Duplicate
-geffen.gat,118,62,0 duplicate(guide_g) Guide#p1-7 105
-
-//[Payon]
-payon.gat,82,116,4 script Guide#p1-8::guide_p 708,{
- cutin "pay_soldier",2;
- mes "[Payon Squad]";
- mes "Welcome to Payon, the uplander village.";
- mes "We will help you when you take the wrong way, Feel free to inquire at us anytime.";
- mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
- mes "[Payon Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- L_SUB_1:
- next;
- menu "^FF0000Archer Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Kit Shop",L_MENU_1_3,"Inn",L_MENU_1_4,"Central Palace",L_MENU_1_5,"Cancel",L_MENU_1_6;
- L_MENU_1_1:
- mes "[Payon Squad]";
- mes "'Archer Guild' is a Control Office of Archers. It is located at Northeast Contour of the Archer Village.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,174,189,1,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Payon Squad]";
- mes "'Armory' is located at Northwest around the Centre.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,30,176,2,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Payon Squad]";
- mes "'Kit Shop' is located at Northwest Contour of the Archer Village.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,174,189,3,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Payon Squad]";
- mes "'Inn' is located at East around the Centre.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,172,134,4,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Payon Squad]";
- mes "'Central Palace' is at North around the Centre.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,89,166,5,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_6:
- mes "[Payon Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on the Mini-Map.'.";
- goto L_START_1;
- L_MENU_2:
- viewpoint 2,174,189,1,0xFF0000;
- viewpoint 2,30,176,2,0xFF00FF;
- viewpoint 2,174,189,3,0xFF00FF;
- viewpoint 2,172,134,4,0xFF00FF;
- viewpoint 2,89,166,5,0x00FF00;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Payon Squad]";
- mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Payon Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Payon Squad]";
- mes "Bon Voyage, Wanderer.";
- cutin "pay_soldier",255;
- close;
-}
-
-//Duplicate
-pay_arche.gat,85,30,2 duplicate(guide_p) Guide#p1-9 105
-
-//[Alberta]
-
-alberta.gat,23,238,4 script Guide#p1-10::guide_a 105,{
- mes "[Alberta Squad]";
- mes "Welcome to Alberta, the The Port Town.";
- mes "We will helpyou when you take a wrong way, Feel free to inquire at us anytime.";
- mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_SUB_1;
- mes "[Alberta Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- L_SUB_1:
- menu "^FF0000Merchant Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Kit Shop",L_MENU_1_3,"Inn",L_MENU_1_4,"Cancel",L_MENU_1_5;
- L_MENU_1_1:
- mes "[Alberta Squad]";
- mes "'Merchant Guild' will help you to transform into a Merchant.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,33,41,1,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Alberta Squad]";
- mes "'Armory' is located at North Contour from the Centre of Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,117,37,2,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Alberta Squad]";
- mes "'Kit Shop' is located at the Centre of Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,98,154,3,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Alberta Squad]";
- mes "'Armory' is located at North Contour around the Centre of Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,65,233,4,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Alberta Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
- goto L_START_1;
- 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;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Alberta Squad]";
- mes "We altered the Location Guideinto de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Alberta Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Alberta Squad]";
- mes "Ta Ta.";
- close;
-}
-
-//Duplicate
-alberta.gat,120,60,3 duplicate(guide_a) Guide#p1-11 105
-
-//[Morroc]
-
-morocc.gat,153,286,6 script Guide#p1-12::guide_m 707,{
- cutin "moc_soldier",2;
- mes "[Morocc Squad]";
- mes "Welcome to Morroc,the Frontier.";
- mes "We will help you when you take a Wrong Way, Feel free to inquire at us anytime, Algight?";
-L_START_1:
- next;
- menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
- L_MENU_1:
- if (@COMPASS_CHECK != 0) goto L_SUB_1;
- mes "[Morocc Squad]";
- mes "Please choose a Menu first.";
- mes "Do you want me to leave indications on the Mini-Map?";
- next;
- menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
- set @COMPASS_CHECK,1;
- L_MENU_1_ROOT:
- L_SUB_1:
- next;
- menu "^FF0000Thief Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Inn",L_MENU_1_3,"Pub",L_MENU_1_4,"Mercenary Guild",L_MENU_1_5,"Cancel",L_MENU_1_6;
- L_MENU_1_1:
- mes "[Morocc Squad]";
- mes "'Thief Guild' wich grants you to be a Thief is located inside by hearsay...";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,24,297,1,0xFF0000;
- goto L_SUB_1;
- L_MENU_1_2:
- mes "[Morocc Squad]";
- mes "'Armory' is located at Southwest around the Centre of Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,253,56,2,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_3:
- mes "[Morocc Squad]";
- mes "In Morroc there are 2 'Inn's' located both at South and Northeast around the Centre on Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,274,269,3,0xFF00FF;
- viewpoint 1,197,66,3,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_4:
- mes "[Morocc Squad]";
- mes "'Pub' is located at Northwest around the Centre.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,52,259,4,0xFF00FF;
- goto L_SUB_1;
- L_MENU_1_5:
- mes "[Morocc Squad]";
- mes "'Mercenary Guild' is at East Contour around the Centre of Mini-Map.";
- if (@COMPASS_CHECK != 1) goto L_SUB_1;
- viewpoint 1,284,171,5,0x00FF00;
- goto L_SUB_1;
- L_MENU_1_6:
- mes "[Morocc Squad]";
- mes "If you want to remove location marks, Please choose 'Wipe all Indications on the Mini-Map.'.";
- goto L_START_1;
- L_MENU_2:
- viewpoint 2,24,297,1,0xFF0000;
- viewpoint 2,253,56,2,0xFF00FF;
- viewpoint 2,274,269,3,0xFF00FF;
- viewpoint 2,197,66,3,0xFF00FF;
- viewpoint 2,52,259,4,0xFF00FF;
- viewpoint 2,284,171,5,0x00FF00;
- set @COMPASS_CHECK,0;
- goto L_START_1;
- L_MENU_3:
- mes "[Morocc Squad]";
- mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
- mes "Please Check this gorgeous newest system with your own eyes.";
- next;
- mes "[Morroc Squad]";
- mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
- mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
- mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
- goto L_START_1;
- L_MENU_4:
- mes "[Morocc Squad]";
- mes "Good by for now.";
- cutin "moc_soldier",255;
- close;
-}
-
-//Duplicate
-morocc.gat,54,97,6 duplicate(guide_m) Guide#p1-13 707
-
-
-//[Comodo]
-
-comodo.gat,322,178,4 script Guide#p1-14::guide_c 700,{
- mes "[Native Papaya]";
- mes "Where the night life continues 24 hours a day";
- mes "The city of Dreams and Fantasy!";
- mes "We welcome you to the land of Comodo!";
- mes "I know the area very well.";
- mes "If you need directions, ask me anytime for asistance";
- next;
- menu "Casino",L_MENU_1,"Hula dancing stage ^0000FF(Dancer Job Change)^000000",L_MENU_2,"Weapons and Armor Shop",L_MENU_3,"Tool store",L_MENU_4,"Tourist Shop",L_MENU_5,"Kafra 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:
- viewpoint 1,140,98,1,0xFF6633;
- mes "^FF0000+^000000 -> Casino!";
- mes "The heart of Comodo's night life!";
- mes "A heaven of rest for tired travelers!";
- mes "Another service provided here.!";
- mes "The COmodo Casino ~!";
- close;
- L_MENU_2:
- viewpoint 1,188,168,2,0x0000FF;
- mes "^0000FF+^000000 -> Hula dancing Stage";
- mes "Hula Hula - Hula Hula";
- mes "When you become more comfortable performing on stage, you should consider changing job to be a Dancer";
- mes "What do you think? Hula Dancing Stage - ^0000FF(Change job to Dancer)^000000";
- close;
- L_MENU_3:
- viewpoint 1,266,70,3,0x00FFFF;
- mes "^00FFFF+^000000 -> Weapons and Armor Shop";
- mes "Here in Comodo, you can find unique items only found in Comodo.";
- mes "'Comodo Weapons and Armor Shop'";
- close;
- L_MENU_4:
- viewpoint 1,86,128,4,0x515151;
- mes "^808080+^000000 -> Tool Shop";
- mes "Here in Comodo, you can find tools only found in Comodo";
- mes "'Comodo Tool Store'";
- close;
- L_MENU_5:
- viewpoint 1,298,124,5,0x3355FF;
- mes "^0000FF+^000000 -> Tourist Shop";
- mes "Here in Comodo, you can find unique gifts only found in Comodo";
- mes "'Comodo Tourist Shop'";
- close;
- L_MENU_6:
- viewpoint 1,136,202,6,0xFF5555;
- mes "^FF0000+^000000 -> Kafra Corp. Western Branch";
- mes "The Western Branch of Midgards Kafra Corp.";
- mes "Ofering you the best service!";
- mes "Kafra Corp.'s Western Branch center is located here in Comodo";
- close;
- L_MENU_7:
- viewpoint 1,114,294,7,0xFF5555;
- mes "^FF0000+^000000 -> Chief's House";
- mes "This is the house where the Chief of Comodo resides.";
- mes "If you are one who posseses a serious interest in Comodo, you can meet the Chief in person.";
- mes "I think that would be okay with him.";
- close;
- L_MENU_8:
- viewpoint 1,166,298,8,0xFF5555;
- mes "^FF0000+^000000 -> Pub";
- mes "The pub is a place where tourists from all over the world come to converse and exchange ideas";
- mes "Bringing the ethnic atmosphere of Comodo, to an environment which tourists can enjoy";
- close;
- L_MENU_9:
- viewpoint 1,210,308,9,0xFF5555;
- mes "^FF0000+^000000 -> Camp Ground";
- mes "Sometimes with family and sometimes with friends, people come to Comodo campground to creat great memories.";
- mes "BBQ Camp Ground is where you can taste the ethnic flavors of Comodo's Spit BBQ!";
- close;
- L_MENU_10:
- mes "[Native Papaya]";
- mes "Because Comodo is located in a cave, sunlight cannot shine into this area.";
- mes "It is dark 24 hours a day!";
- mes "The residents of Comodo are using this unusual circumstance to draw tourists to our area...";
- close;
-}
-
-//Duplicates
-comodo.gat,176,350,4 duplicate(guide_c) Guide#p1-14 700
-
-comodo.gat,37,219,4 duplicate(guide_c) Guide#p1-15 700
-
-//[Yuno]
-
-//Needs Translation
-yuno.gat,153,47,4 script "ƒWƒ…ƒm[ƒKƒCƒh" 700,{
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- mes "‰ß‹Ž‚ð’m‚ècc";
- mes "Œ»Ý‚ðŒ©‚Â‚ßcc";
- mes "–¢—ˆ‚ð—\’m‚·‚écc";
- mes "‚±‚±‚ÍŒ«ŽÒ‚½‚¿‚Ì“sŽs";
- mes "- ƒWƒ…ƒm[ -";
- mes "ƒWƒ…ƒm[‚ɂ悤‚±‚»";
- next;
- menu "•Ší–h‹ï“X",L1,"“¹‹ï“X",L2,"ƒZ[ƒWƒLƒƒƒbƒXƒ‹ (ƒZ[ƒW“]EŠ)",L3,"‘“X’Ê‚è",L4,"’†‰›Lê",L5,"‹¤˜a‘}‘ŠÙ",L6,"ƒVƒ…ƒoƒCƒ`ƒFƒ‹–‚–@ƒAƒJƒfƒ~[",L7,"ƒ‚ƒ“ƒXƒ^[”Ž•¨ŠÙ",L8,"‰ï˜b‚ðCancel",LEnd;
-L1:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,120,138,1,0xFF3355;
- mes "^FF3355+^000000 -> •Ší–h‹ï“X";
- goto Lgo;
-L2:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,193,142,2,0x3355FF;
- mes "^3355FF+^000000 -> “¹‹ï“X";
- goto Lgo;
-L3:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,90,318,3,0x33FF55;
- mes "^33FF55+^000000 -> ƒZ[ƒWƒLƒƒƒbƒXƒ‹";
- mes "(ƒZ[ƒW“]EŠ)";
- goto Lgo;
-L4:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,257,102,4,0xFF3355;
- mes "^FF3355+^000000 -> ‘“X’Ê‚è";
- goto Lgo;
-L5:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,157,170,5,0x3355FF;
- mes "^3355FF+^000000 -> ’†‰›Lê";
- goto Lgo;
-L6:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,336,204,6,0x33FF55;
- mes "^33FF55+^000000 -> ‹¤˜a‘}‘ŠÙ";
- goto Lgo;
-L7:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,323,281,7,0xFF3355;
- mes "^FF3355+^000000 -> ƒVƒ…ƒoƒCƒ`ƒFƒ‹–‚–@ƒAƒJƒfƒ~[";
- goto Lgo;
-L8:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- viewpoint 1,278,288,8,0x3355FF;
- mes "^3355FF+^000000 -> ƒ‚ƒ“ƒXƒ^[”Ž•¨ŠÙ";
- goto Lgo;
-Lgo:
- mes "‚É‚È‚è‚Ü‚·B";
- mes "—Ç‚¢Žž‚ð‚¨‰ß‚²‚µ‚­‚¾‚³‚¢B";
- close;
-LEnd:
- mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
- mes "Œ«ŽÒ‚½‚¿‚Ì‘å“sŽs";
- mes "‚»‚µ‚Ä’mŽ¯‚Ì•óŒÉ";
- mes "ƒWƒ…ƒm[‚ւ悤‚±‚»I";
- close;
-}
-
-//[Amatsu]
-
-//Needs Translation
-amatsu.gat,207,91,4 script ƒ~ƒXEƒAƒ}ƒc 758,{
- mes "[Œu‚¿‚á‚ñ]";
- mes "Ž„‚ÍA‘æ13‘ãƒ~ƒXEƒAƒ}ƒc";
- mes "¢Œu£‚Æ\‚µ‚Ü‚·B";
- mes "ƒAƒ}ƒc‘ã•\‚Æ‚µ‚Ä";
- mes "‘º‚̈ēà‚ð‹Â‚¹‚‚©‚Á‚Ä‚¨‚è‚Ü‚·B";
- mes "‚È‚É‚©‚²Ž¿–₪‚ ‚è‚Ü‚µ‚½‚ç";
- mes "‚È‚ñ‚È‚è‚Æ‚¨‚Á‚µ‚á‚Á‚Ä‚­‚¾‚³‚¢‚Ü‚¹B";
- next;
- menu "é",L1,"“¹‹ï“X",L2,"•Ší“X",L3,"‹Žð‰®",L4;
-L1:
- viewpoint 1,85,235,0,0xFF3355;
- mes "[Œu‚¿‚á‚ñ]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^FF3355+^000000•”•ª‚ª";
- mes "é‚Å‚²‚´‚¢‚Ü‚·B";
- goto LEnd;
-L2:
- viewpoint 1,96,118,1,0xCE6300;
- mes "[Œu‚¿‚á‚ñ]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^CE6300+^000000•”•ª‚ª";
- mes "“¹‹ï“X‚É‚È‚è‚Ü‚·B";
- goto LEnd;
-L3:
- viewpoint 1,132,117,2,0x55FF33;
- mes "[Œu‚¿‚á‚ñ]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^55FF33+^000000•”•ª‚ª";
- mes "•Ší“X‚É‚È‚è‚Ü‚·B";
- goto LEnd;
-L4:
- viewpoint 1,217,116,3,0x3355FF;
- mes "[Œu‚¿‚á‚ñ]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^3355FF+^000000•”•ª‚ª";
- mes "‹Žð‰®‚É‚È‚è‚Ü‚·B";
-LEnd:
- mes "‚»‚ê‚Å‚ÍAƒAƒ}ƒc‚Å";
- mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‰º‚³‚¢‚Ü‚¹B";
- close;
-}
-
-amatsu.gat,251,283,4 script ˆÄ“àl 767,{
- mes "[ˆÄ“àl]";
- mes "‚悤‚±‚»B";
- mes "—·‚ð‚·‚é‚É‚Í—Ç‚¢‹Gß‚Å‚·‚ËB";
- mes "Ž„‚Í‚±‚̃Aƒ}ƒc‚Ì";
- mes "ˆÄ“à‚ðˆø‚«Žó‚¯‚Ä‚¨‚éŽÒ‚Å‚·B";
- next;
- mes "[ˆÄ“àl]";
- mes "‰½‚ð‚¨’T‚µ‚Å‚·‚©H";
- next;
- menu "é",L1,"“¹‹ï“X",L2,"•Ší“X",L3,"‹Žð‰®",L4;
-L1:
- viewpoint 1,85,235,0,0xFF3355;
- mes "[ˆÄ“àl]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^FF3355+^000000•”•ª‚ª";
- mes "é‚Å‚²‚´‚¢‚Ü‚·B";
- goto LEnd;
-L2:
- viewpoint 1,96,118,1,0xCE6300;
- mes "[ˆÄ“àl]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^CE6300+^000000•”•ª‚ª";
- mes "“¹‹ï“X‚É‚È‚è‚Ü‚·B";
- goto LEnd;
-L3:
- viewpoint 1,132,117,2,0x55FF33;
- mes "[ˆÄ“àl]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^55FF33+^000000•”•ª‚ª";
- mes "•Ší“X‚É‚È‚è‚Ü‚·B";
- goto LEnd;
-L4:
- viewpoint 1,217,116,3,0x3355FF;
- mes "[ˆÄ“àl]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^3355FF+^000000•”•ª‚ª";
- mes "‹Žð‰®‚É‚È‚è‚Ü‚·B";
-LEnd:
- mes "‚»‚ê‚Å‚ÍAƒAƒ}ƒc‚Å";
- mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‰º‚³‚¢‚Ü‚¹B";
- close;
-}
-
-
-//[Gonryun]
-
-//Needs Translation
-gonryun.gat,163,60,4 script ƒRƒ“ƒƒ“ƒKƒCƒh 780,{
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "‚¢‚Â‚àŠˆ‹C‚É–ž‚¿‚ÄA”M‹C‚ª‚ ‚Ó‚ê";
- mes "–ˆ“úlX‚ªs‚«Œð‚Á‚Ä‚¢‚é";
- mes "ƒRƒ“ƒƒ“‚É‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹!";
- next;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "¤”„‚ª‚çA‘º‚̈ēà‚ð‚µ‚Ä";
- mes "‚¢‚Ü‚·B’m‚肽‚¢‚±‚Æ‚ª‚ ‚ê‚Î";
- mes "‰½‚Å‚à•·‚¢‚Ä‚­‚¾‚³‚¢B";
- next;
- menu "‘º’·‚̉Æ",L1,"“¹‹ï¤l",L2,"•Ší¤l",L3,"–h‹ï¤l",L4,"—·ŠÙ",L5;
-L1:
- viewpoint 1,109,131,0,0xff3355;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^ff3355+^000000‚̈ʒu‚É";
- mes "‘º’·‚̉Ƃª‚ ‚è‚Ü‚·B";
- goto Lend;
-L2:
- viewpoint 1,147,84,1,0xce6300;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^ce6300+^000000‚̈ʒu‚É";
- mes "“¹‹ï¤l‚ª‚¢‚Ü‚·B";
- goto Lend;
-L3:
- viewpoint 1,174,101,2,0x55ff33;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^55ff33+^000000‚̈ʒu‚É";
- mes "•Ší¤l‚ª‚¢‚Ü‚·B";
- goto Lend;
-L4:
- viewpoint 1,173,84,3,0x3355ff;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^3355ff+^000000‚̈ʒu‚É";
- mes "–h‹ï¤l‚ª‚¢‚Ü‚·B";
- goto Lend;
-L5:
- viewpoint 1,215,114,4,0xffffff;
- mes "[ƒn ƒEƒHƒ“ƒ`]";
- mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
- mes "^ffffff+^000000‚̈ʒu‚É";
- mes "—·ŠÙ‚ª‚ ‚è‚Ü‚·B";
- goto Lend;
-Lend:
- mes "Ž„’B‚ÌŠy‚µ‚¢ƒRƒ“ƒƒ“‚ð";
- mes "Žv‚¢‚Á‚«‚èŠy‚µ‚ñ‚Å‚­‚¾‚³‚¢I";
- close;
-}
-
-// Below not in japanese NPC
-
-aldebaran.gat,139,63,4 script Soldier 105,{
- mes "[Al De Baran Guard]";
- mes "I am just any ordinary guard you could find in any other cities!!";
- mes "I am in charge of Service Guide in Al De Baran Garrison, and the name is Al De Baran Guard (No Name) !!";
- mes "I will guide you though our town!";
- next;
- menu "Get Location Guide",L0,"End conversation",End;
-
- L0:
- mes "^FF0000+^000000 -> Kafra Main Office";
- mes "^0000FF+^000000 -> Weapon Shop";
- mes "^00F0F0+^000000 -> Sorcerer Guild (Closed)";
- mes "^808080+^000000 -> Pub";
- mes "^00FF00+^000000 -> Item Shop";
- mes "^F0F000+^000000 -> Chemical Acadamy (Closed)";
- viewpoint 0,53,228,1,0xFF0000;
- viewpoint 1,48,198,1,0x0000FF;
- viewpoint 2,48,198,1,0x00F0F0;
- viewpoint 3,48,198,1,0x808080;
- viewpoint 4,48,198,1,0x00FF00;
- viewpoint 5,35,35,1,0xF0F000;
- close;
- LEnd:
- mes "[Al De Baran Guard]";
- mes "We are shown to protect Al De Baran!!";
- close;
-}
-
-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?",Sure,"Not really, I don't care.",NotReally;
-
- Sure:
- mes "[Soldier]";
- mes "Ah~~ There is not much for us to do these days. Merchants buy items, which monsters drop. You knew that, right?";
- next;
- menu "Of course",OfCourse,"Eh? Really?",EhReally;
-
- OfCourse:
- mes "[Soldier]";
- mes "HaHa In fact, that was actually our job.";
- mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
- next;
- mes "[Soldier]";
- mes "We had to work over time every day.";
- mes "Ah~~~ that was a nightmare...~~~";
- mes "Anyways, the government took a smart action, making the Registration System. The Office of Prize Compensation only pays those who have the Registration.";
- next;
- mes "[Soldier]";
- mes "Requirements for the Registration are for a merchant to secure sufficient funds and to stay at one place all the time. The Office gives away the registration to any merchant who fullfills those requirements.";
- next;
- mes "[Soldier]";
- mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
- mes "People who suffered first know how to thank even the slightest comfort.";
- mes "HaHaHaHaHa!";
- close;
- EhReally:
- mes "[Soldier]";
- mes "What?! What do you mean you didn't know?!";
- mes "Hm... well... well... You know you could get some items killing some monsters. You could make some money out of it if you bring and sell those to a merchant.";
- mes "ANYWAYS!";
- next;
- mes "[Soldier]";
- mes "HaHa In fact, that was actually our job.";
- mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
- next;
- mes "[Soldier]";
- mes "We had to work over time every day.";
- mes "Ah~~~ that was a nightmare...~~~";
- mes "Anyways, the government took a smart action, making the Registration System. The Office of Prize Compensation only pays those who have the Registration.";
- next;
- mes "[Soldier]";
- mes "Requirements for the Registration are for a merchant to secure sufficient funds and to stay at one place all the time. The Office gives away the registration to any merchant who fullfills those requirements.";
- next;
- mes "[Soldier]";
- mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
- mes "People who suffered first know how to thank even the slightest comfort.";
- mes "HaHaHaHaHa!";
- close;
- NotReally:
- mes "[Soldier]";
- mes "OK Good bye~~";
- close;
-}
-
-prontera.gat,160,330,4 script Guard#p2-1::guard_p 105,{
- mes "Welcome to Prontera.";
- close;
-}
-
-prontera.gat,223,99,1 duplicate(guard_p) Guard#p2-2 105
-
-prontera.gat,229,104,1 duplicate(guard_p) Guard#p2-3 105
-
-prontera.gat,47,339,5 duplicate(guard_p) Guard#p2-4 105
-
-prontera.gat,52,344,5 duplicate(guard_p) Guard#p2-5 105
-
-
-prt_maze02.gat,100,69,4 script Soldier#p3-1::soldier_p 105,{
- mes "[Soldier]";
- mes "Yo yo, you'd be better not to go in there. It has rumored there is a Demon living in the forest.";
- mes "Of course it is just a rumor because no one see the people turning back from the palce.";
- mes "hmmm... it's up to you to go in or leave.";
- close;
-}
-prt_maze02.gat,110,69,4 duplicate(soldier_p) Soldier#p3-2 105
-
-//Yuno
-yuno.gat,46,165,4 script Soldier#p4-1::soldier_y 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- close;
-}
-
-yuno.gat,61,165,4 duplicate(soldier_y) Soldier#p4-2 105
-
-yuno.gat,150,228,4 duplicate(soldier_y) Soldier#p4-2 105
-
-yuno.gat,165,228,4 duplicate(soldier_y) Soldier#p4-2 105
-
-yuno.gat,262,319,2 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to Yuno, the scholar's city where ancient wisdom exists.";
- next;
- mes "[Yuno Soldier]";
- mes "There is a holy shield for Crusaders called 'The Messenger of the God'.";
- next;
- mes "[Yuno Soldier]";
- mes "It looks like a long shield with a angel's wing image on its center.";
- mes " It is especially strong against undead or demons.";
- close;
-}
-
-yuno.gat,227,292,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists, Yuno.";
- next;
- mes "[Yuno Soldier]";
- mes "Around the City of Juno, there is fallen angel that fakes himself as the real angel, named 'Fake Angel'.";
- next;
- mes "[Yuno Soldier]";
- mes "This one fakes itself as the real angel, and acts as if it's blessing travelers, and attacks them.";
- mes "It looks all beautiful, so it's bad if you fall for its appearance.";
- close;
-}
-
-yuno.gat,150,283,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists, Yuno.";
- next;
- mes "[Yuno Soldier]";
- mes "Larva Golem is a stone doll that has a stone heart in which its magical power was induced by magma.";
- mes "....from the body, it flows...";
- next;
- mes "[Yuno Soldier]";
- mes "Magma is really hot as to even melt away armor and weapon made with steel.";
- mes "if you attack thoughtlessly, ";
- next;
- mes "[Yuno Soldier]";
- mes "you might get a lot of damage on yourself and even get your armor and weapon broken.";
- close;
-}
-
-yuno.gat,165,283,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- next;
- mes "[Yuno Soldier]";
- mes "'Geographer', it is a hard shell type thing that grows around flowers from the earth.";
- mes "Thus, even if it's far away, you can't think less of it.";
- next;
- mes "[Yuno Soldier]";
- mes "it got such name 'cause the passing-by geography scholar got eaten away during his research.";
- close;
-}
-
-//Comodo
-
-//Yuno
-yuno.gat,46,165,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- close;
-}
-
-yuno.gat,61,165,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- close;
-}
-
-
-yuno.gat,150,228,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- close;
-}
-
-yuno.gat,165,228,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- close;
-}
-
-yuno.gat,262,319,2 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to Yuno, the scholar's city where ancient wisdom exists.";
- next;
- mes "[Yuno Soldier]";
- mes "There is a holy shield for Crusaders called 'The Messenger of the God'.";
- next;
- mes "[Yuno Soldier]";
- mes "It looks like a long shield with a angel's wing image on its center.";
- mes " It is especially strong against undead or demons.";
- close;
-}
-
-yuno.gat,227,292,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists, Yuno.";
- next;
- mes "[Yuno Soldier]";
- mes "Around the City of Juno, there is fallen angel that fakes himself as the real angel, named 'Fake Angel'.";
- next;
- mes "[Yuno Soldier]";
- mes "This one fakes itself as the real angel, and acts as if it's blessing travelers, and attacks them.";
- mes "It looks all beautiful, so it's bad if you fall for its appearance.";
- close;
-}
-
-yuno.gat,150,283,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists, Yuno.";
- next;
- mes "[Yuno Soldier]";
- mes "Larva Golem is a stone doll that has a stone heart in which its magical power was induced by magma.";
- mes "....from the body, it flows...";
- next;
- mes "[Yuno Soldier]";
- mes "Magma is really hot as to even melt away armor and weapon made with steel.";
- mes "if you attack thoughtlessly, ";
- next;
- mes "[Yuno Soldier]";
- mes "you might get a lot of damage on yourself and even get your armor and weapon broken.";
- close;
-}
-
-yuno.gat,165,283,4 script Yuno Soldier 105,{
- mes "[Yuno Soldier]";
- mes "Welcome to City of scholars where wisdom exists.";
- next;
- mes "[Yuno Soldier]";
- mes "'Geographer', it is a hard shell type thing that grows around flowers from the earth.";
- mes "Thus, even if it's far away, you can't think less of it.";
- next;
- mes "[Yuno Soldier]";
- mes "it got such name 'cause the passing-by geography scholar got eaten away during his research.";
- close;
-}
+//===== eAthena Script =======================================
+//= Guide Script
+//===== By: ==================================================
+//= Lotsa People (1.0)
+//= Even More People (1.1)
+//= Darkchild (1.2)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any eAthena Version In Which Duplicate Works
+//===== Description: =========================================
+//= Guides In RO World
+//===== Additional Comments: =================================
+//= 1.2 - Used the duplicate and fixed minor things
+//============================================================
+
+//[Prontera Guide]
+
+//Complete
+prontera.gat,154,187,4 script Guide#p1-1::guide_p 105,{
+ cutin "prt_soldier",2;
+ mes "[Prontera Squad]";
+ mes "Welcome to Prontera,the Capital City of Rune-Midgard Kingdom.";
+ mes "We can help you to find Buildings easily, Feel free to inquire at us anytime.";
+ mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
+ mes "[Prontera Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please.",-,"No, Thanks.",L_MENU_1_ROOT;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ mes "[Prontera Squad]";
+ mes "Please select location you want me to show you.";
+ L_SUB_1:
+ next;
+ menu "Swordman Asosiation",L_MENU_1_1,"^0000FFSantuary^000000",L_MENU_1_2,"Prontera Chivalry",L_MENU_1_3,"Armory",L_MENU_1_4,"Kit Shop",L_MENU_1_5,"Inn",L_MENU_1_6,"Trading Post",L_MENU_1_7,"Pub",L_MENU_1_8,"Library",L_MENU_1_9,"Job Agency",L_MENU_1_10,"The Castle of Prontera",L_MENU_1_11,"City Hall",L_MENU_1_12,"Cancel",L_MENU_1_13;
+ L_MENU_1_1:
+ mes "[Prontera Squad]";
+ mes "The 'Swordman Assosiation' has moved to Izlude, the Sattelite of Prontera, now that Building is Empty";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,237,41,1,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Prontera Squad]";
+ mes "The main Chapel of Rune-Midgard Kingdom, `Santuary' is located at Northeast. Usually citizens visit there to become Acolyte";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,236,316,2,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Prontera Squad]";
+ mes "'Prontera Chivalry' the Defense Force of Prontera City is located at Northwest.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,46,345,3,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Prontera Squad]";
+ mes "'Armory' is located at Northeast around the Fountain.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,175,220,4,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Prontera Squad]";
+ mes "'Kit Shop' is located Northwest around the Fountain.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,134,221,5,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_6:
+ mes "[Prontera Squad]";
+ mes "There are 2 'Inn's' around the Fountain, on is located at West, other one at East.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,204,214,6,0xFF00FF;
+ viewpoint 1,107,192,7,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_7:
+ mes "[Prontera Squad]";
+ mes "'Trading Post' is located at Southeast around the Fountain.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,179,184,8,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_8:
+ mes "[Prontera Squad]";
+ mes "'Pub is located at Southeast around the Fountain, right behind Trading Post building.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,208,154,9,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_9:
+ mes "[Prontera Squad]";
+ mes "There are 2 Buildings of 'Library', located both at Northern East and Northern West around the Fountain.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,120,267,10,0x00FF00;
+ viewpoint 1,192,267,11,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_10:
+ mes "[Prontera Squad]";
+ mes "'Job Agency' is located at Southeast of the Fountain.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,133,183,12,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_11:
+ mes "[Prontera Squad]";
+ mes "'The Castle Of Prontera' is located at Due North. Clockwise rotation is 12.";
+ mes "And when you go outside the Castle through a postern, you will see the North Prontera Field.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,156,360,13,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_12:
+ mes "[Prontera Squad]";
+ mes "City Hall is located at Southeast Contour. The Clockwise rotarion is 7.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,75,91,14,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_13:
+ mes "[Prontera Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
+ goto L_START_1;
+ 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;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Prontera Squad]";
+ mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Prontera Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Prontera Squad]";
+ mes "Have a nice day.";
+ cutin "prt_soldier",255;
+ close;
+}
+//Duplicate
+prontera.gat,282,208,2 duplicate(guide_p) Guide#p1-2 105
+
+prontera.gat,29,200,6 duplicate(guide_p) Guide#p1-3 105
+
+prontera.gat,160,29,0 duplicate(guide_p) Guide#p1-4 105
+
+prontera.gat,151,330,4 duplicate(guide_p) Guide#p1-5 105
+
+
+//[Izlude]
+
+//Complete
+izlude.gat,123,87,6 script Guide 105,{
+ mes "[Izlude Squad]";
+ mes "Welcome to Izlude, the New Satelite of Prontera.";
+ mes "Feel free to inquire at us anytime, Algight?";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
+ mes "[Izlude Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please",-,"No, Thanks",L_SUB_1;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ L_SUB_1:
+ next;
+ menu "^FF0000Swordman Asosiation^000000",L_MENU_1_1,"Swordman Hall",L_MENU_1_2,"Arena",L_MENU_1_3,"Izlude Marina",L_MENU_1_4,"Armory",L_MENU_1_5,"Kit Shop",L_MENU_1_6,"Cancel",L_MENU_1_7;
+ L_MENU_1_1:
+ mes "[Izlude Squad]";
+ mes "Do you want to be a Swordman?";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,52,140,1,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Izlude Squad]";
+ mes "Swordman Hall, the official Building of Swordman Assosiation is at East Contour.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,214,130,2,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Izlude Squad]";
+ mes "'Arena' the Popular Colosseum is at Due North. The Clockwise totation is 12.";
+ mes "You can have fun there, you know.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,128,225,3,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Izlude Squad]";
+ mes "Marina which allows you to go to 'Alberta' or 'Byalan Island' is at Northeast.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,200,180,4,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Izlude Squad]";
+ mes "Armory is near at Northwest, and you can find it easily.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,111,149,5,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_6:
+ mes "[Izlude Squad]";
+ mes "Kit Shop is near at Northeast, and you can find it easily.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,148,148,6,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_7:
+ mes "[Izlude Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
+ goto L_START_1;
+ 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;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Izlude Squad]";
+ mes "We altered the Location Guideinto de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Izlude Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Izlude Squad]";
+ mes "Don't get lost.";
+ close;
+}
+
+//[Geffen]
+
+//Complete
+geffen.gat,203,116,0 script Guide#p1-6::guide_g 705,{
+ cutin "gef_soldier",2;
+ mes "[Geffen Squad]";
+ mes "Welcome to Geffen, the City of Magic.";
+ mes "We will help you when you take the Wrong way, Feel free to inquire at us anytime.";
+ mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
+ mes "[Geffen Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ L_SUB_1:
+ next;
+ menu "^FF0000Magic Acadamy^000000",L_MENU_1_1,"Forge",L_MENU_1_2,"Armory",L_MENU_1_3,"Kit Shop",L_MENU_1_4,"Pub",L_MENU_1_5,"Inn",L_MENU_1_6,"Cancel",L_MENU_1_7;
+ L_MENU_1_1:
+ mes "[Geffen Squad]";
+ mes "'Magic Acadamy' is the Building in charge of Every Magical Theory.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,61,180,1,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Geffen Squad]";
+ mes "'Forge' is located at Southeast around the Tower of Magic.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,182,59,2,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Geffen Squad]";
+ mes "'Armory' is located at Northwest oround the Tower of Magic.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,99,140,3,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Geffen Squad]";
+ mes "'Kit Shop' is located at Southwest arround the Tower of Magic.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,44,86,4,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Geffen Squad]";
+ mes "'Pub' is located at Northeast around the Tower of Magic.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,138,138,5,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_6:
+ mes "[Geffen Squad]";
+ mes "'Inn' is located at Northeast around the Tower of Magic.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,172,174,6,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_7:
+ mes "[Geffen Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
+ goto L_START_1;
+ L_MENU_2:
+ viewpoint 2,61,180,1,0xFF0000;
+ viewpoint 2,182,59,2,0x00FF00;
+ viewpoint 2,99,140,3,0xFF00FF;
+ viewpoint 2,44,86,4,0xFF00FF;
+ viewpoint 2,138,138,5,0xFF00FF;
+ viewpoint 2,172,174,6,0xFF00FF;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Geffen Squad]";
+ mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Geffen Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Geffen Squad]";
+ mes "Have a nice day.";
+ cutin "gef_soldier",255;
+ close;
+}
+
+//Duplicate
+geffen.gat,118,62,0 duplicate(guide_g) Guide#p1-7 105
+
+//[Payon]
+payon.gat,82,116,4 script Guide#p1-8::guide_p 708,{
+ cutin "pay_soldier",2;
+ mes "[Payon Squad]";
+ mes "Welcome to Payon, the uplander village.";
+ mes "We will help you when you take the wrong way, Feel free to inquire at us anytime.";
+ mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_MENU_1_ROOT;
+ mes "[Payon Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ L_SUB_1:
+ next;
+ menu "^FF0000Archer Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Kit Shop",L_MENU_1_3,"Inn",L_MENU_1_4,"Central Palace",L_MENU_1_5,"Cancel",L_MENU_1_6;
+ L_MENU_1_1:
+ mes "[Payon Squad]";
+ mes "'Archer Guild' is a Control Office of Archers. It is located at Northeast Contour of the Archer Village.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,174,189,1,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Payon Squad]";
+ mes "'Armory' is located at Northwest around the Centre.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,30,176,2,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Payon Squad]";
+ mes "'Kit Shop' is located at Northwest Contour of the Archer Village.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,174,189,3,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Payon Squad]";
+ mes "'Inn' is located at East around the Centre.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,172,134,4,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Payon Squad]";
+ mes "'Central Palace' is at North around the Centre.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,89,166,5,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_6:
+ mes "[Payon Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on the Mini-Map.'.";
+ goto L_START_1;
+ L_MENU_2:
+ viewpoint 2,174,189,1,0xFF0000;
+ viewpoint 2,30,176,2,0xFF00FF;
+ viewpoint 2,174,189,3,0xFF00FF;
+ viewpoint 2,172,134,4,0xFF00FF;
+ viewpoint 2,89,166,5,0x00FF00;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Payon Squad]";
+ mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Payon Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Payon Squad]";
+ mes "Bon Voyage, Wanderer.";
+ cutin "pay_soldier",255;
+ close;
+}
+
+//Duplicate
+pay_arche.gat,85,30,2 duplicate(guide_p) Guide#p1-9 105
+
+//[Alberta]
+
+alberta.gat,23,238,4 script Guide#p1-10::guide_a 105,{
+ mes "[Alberta Squad]";
+ mes "Welcome to Alberta, the The Port Town.";
+ mes "We will helpyou when you take a wrong way, Feel free to inquire at us anytime.";
+ mes "Please Choose a menu `Notice' if you are a beginner of Ragnarok.";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_SUB_1;
+ mes "[Alberta Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ L_SUB_1:
+ menu "^FF0000Merchant Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Kit Shop",L_MENU_1_3,"Inn",L_MENU_1_4,"Cancel",L_MENU_1_5;
+ L_MENU_1_1:
+ mes "[Alberta Squad]";
+ mes "'Merchant Guild' will help you to transform into a Merchant.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,33,41,1,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Alberta Squad]";
+ mes "'Armory' is located at North Contour from the Centre of Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,117,37,2,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Alberta Squad]";
+ mes "'Kit Shop' is located at the Centre of Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,98,154,3,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Alberta Squad]";
+ mes "'Armory' is located at North Contour around the Centre of Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,65,233,4,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Alberta Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on Mini-Map.'.";
+ goto L_START_1;
+ 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;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Alberta Squad]";
+ mes "We altered the Location Guideinto de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Alberta Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Alberta Squad]";
+ mes "Ta Ta.";
+ close;
+}
+
+//Duplicate
+alberta.gat,120,60,3 duplicate(guide_a) Guide#p1-11 105
+
+//[Morroc]
+
+morocc.gat,153,286,6 script Guide#p1-12::guide_m 707,{
+ cutin "moc_soldier",2;
+ mes "[Morocc Squad]";
+ mes "Welcome to Morroc,the Frontier.";
+ mes "We will help you when you take a Wrong Way, Feel free to inquire at us anytime, Algight?";
+L_START_1:
+ next;
+ menu "View Buildings",L_MENU_1,"Wipe all Indications on Mini-Map.",L_MENU_2,"Notice",L_MENU_3,"Cancel",L_MENU_4;
+ L_MENU_1:
+ if (@COMPASS_CHECK != 0) goto L_SUB_1;
+ mes "[Morocc Squad]";
+ mes "Please choose a Menu first.";
+ mes "Do you want me to leave indications on the Mini-Map?";
+ next;
+ menu "Yes, Please",-,"No, Thanks",L_MENU_1_ROOT;
+ set @COMPASS_CHECK,1;
+ L_MENU_1_ROOT:
+ L_SUB_1:
+ next;
+ menu "^FF0000Thief Guild^000000",L_MENU_1_1,"Armory",L_MENU_1_2,"Inn",L_MENU_1_3,"Pub",L_MENU_1_4,"Mercenary Guild",L_MENU_1_5,"Cancel",L_MENU_1_6;
+ L_MENU_1_1:
+ mes "[Morocc Squad]";
+ mes "'Thief Guild' wich grants you to be a Thief is located inside by hearsay...";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,24,297,1,0xFF0000;
+ goto L_SUB_1;
+ L_MENU_1_2:
+ mes "[Morocc Squad]";
+ mes "'Armory' is located at Southwest around the Centre of Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,253,56,2,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_3:
+ mes "[Morocc Squad]";
+ mes "In Morroc there are 2 'Inn's' located both at South and Northeast around the Centre on Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,274,269,3,0xFF00FF;
+ viewpoint 1,197,66,3,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_4:
+ mes "[Morocc Squad]";
+ mes "'Pub' is located at Northwest around the Centre.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,52,259,4,0xFF00FF;
+ goto L_SUB_1;
+ L_MENU_1_5:
+ mes "[Morocc Squad]";
+ mes "'Mercenary Guild' is at East Contour around the Centre of Mini-Map.";
+ if (@COMPASS_CHECK != 1) goto L_SUB_1;
+ viewpoint 1,284,171,5,0x00FF00;
+ goto L_SUB_1;
+ L_MENU_1_6:
+ mes "[Morocc Squad]";
+ mes "If you want to remove location marks, Please choose 'Wipe all Indications on the Mini-Map.'.";
+ goto L_START_1;
+ L_MENU_2:
+ viewpoint 2,24,297,1,0xFF0000;
+ viewpoint 2,253,56,2,0xFF00FF;
+ viewpoint 2,274,269,3,0xFF00FF;
+ viewpoint 2,197,66,3,0xFF00FF;
+ viewpoint 2,52,259,4,0xFF00FF;
+ viewpoint 2,284,171,5,0x00FF00;
+ set @COMPASS_CHECK,0;
+ goto L_START_1;
+ L_MENU_3:
+ mes "[Morocc Squad]";
+ mes "We altered the Location Guide into de Newest Digital Style, out of the former Analog One.";
+ mes "Please Check this gorgeous newest system with your own eyes.";
+ next;
+ mes "[Morroc Squad]";
+ mes "Don't forget to refer the Mini-Map on Upper-Right of the Screen.";
+ mes "If you can't see the Mini-Map, just use Shortcut 'ctrl+tab' or Click 'map' button on the Basic Information Window";
+ mes "After that, Click '-' button on the Mini-Map until whole buildings are shown on it.";
+ goto L_START_1;
+ L_MENU_4:
+ mes "[Morocc Squad]";
+ mes "Good by for now.";
+ cutin "moc_soldier",255;
+ close;
+}
+
+//Duplicate
+morocc.gat,54,97,6 duplicate(guide_m) Guide#p1-13 707
+
+
+//[Comodo]
+
+comodo.gat,322,178,4 script Guide#p1-14::guide_c 700,{
+ mes "[Native Papaya]";
+ mes "Where the night life continues 24 hours a day";
+ mes "The city of Dreams and Fantasy!";
+ mes "We welcome you to the land of Comodo!";
+ mes "I know the area very well.";
+ mes "If you need directions, ask me anytime for asistance";
+ next;
+ menu "Casino",L_MENU_1,"Hula dancing stage ^0000FF(Dancer Job Change)^000000",L_MENU_2,"Weapons and Armor Shop",L_MENU_3,"Tool store",L_MENU_4,"Tourist Shop",L_MENU_5,"Kafra 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:
+ viewpoint 1,140,98,1,0xFF6633;
+ mes "^FF0000+^000000 -> Casino!";
+ mes "The heart of Comodo's night life!";
+ mes "A heaven of rest for tired travelers!";
+ mes "Another service provided here.!";
+ mes "The COmodo Casino ~!";
+ close;
+ L_MENU_2:
+ viewpoint 1,188,168,2,0x0000FF;
+ mes "^0000FF+^000000 -> Hula dancing Stage";
+ mes "Hula Hula - Hula Hula";
+ mes "When you become more comfortable performing on stage, you should consider changing job to be a Dancer";
+ mes "What do you think? Hula Dancing Stage - ^0000FF(Change job to Dancer)^000000";
+ close;
+ L_MENU_3:
+ viewpoint 1,266,70,3,0x00FFFF;
+ mes "^00FFFF+^000000 -> Weapons and Armor Shop";
+ mes "Here in Comodo, you can find unique items only found in Comodo.";
+ mes "'Comodo Weapons and Armor Shop'";
+ close;
+ L_MENU_4:
+ viewpoint 1,86,128,4,0x515151;
+ mes "^808080+^000000 -> Tool Shop";
+ mes "Here in Comodo, you can find tools only found in Comodo";
+ mes "'Comodo Tool Store'";
+ close;
+ L_MENU_5:
+ viewpoint 1,298,124,5,0x3355FF;
+ mes "^0000FF+^000000 -> Tourist Shop";
+ mes "Here in Comodo, you can find unique gifts only found in Comodo";
+ mes "'Comodo Tourist Shop'";
+ close;
+ L_MENU_6:
+ viewpoint 1,136,202,6,0xFF5555;
+ mes "^FF0000+^000000 -> Kafra Corp. Western Branch";
+ mes "The Western Branch of Midgards Kafra Corp.";
+ mes "Ofering you the best service!";
+ mes "Kafra Corp.'s Western Branch center is located here in Comodo";
+ close;
+ L_MENU_7:
+ viewpoint 1,114,294,7,0xFF5555;
+ mes "^FF0000+^000000 -> Chief's House";
+ mes "This is the house where the Chief of Comodo resides.";
+ mes "If you are one who posseses a serious interest in Comodo, you can meet the Chief in person.";
+ mes "I think that would be okay with him.";
+ close;
+ L_MENU_8:
+ viewpoint 1,166,298,8,0xFF5555;
+ mes "^FF0000+^000000 -> Pub";
+ mes "The pub is a place where tourists from all over the world come to converse and exchange ideas";
+ mes "Bringing the ethnic atmosphere of Comodo, to an environment which tourists can enjoy";
+ close;
+ L_MENU_9:
+ viewpoint 1,210,308,9,0xFF5555;
+ mes "^FF0000+^000000 -> Camp Ground";
+ mes "Sometimes with family and sometimes with friends, people come to Comodo campground to creat great memories.";
+ mes "BBQ Camp Ground is where you can taste the ethnic flavors of Comodo's Spit BBQ!";
+ close;
+ L_MENU_10:
+ mes "[Native Papaya]";
+ mes "Because Comodo is located in a cave, sunlight cannot shine into this area.";
+ mes "It is dark 24 hours a day!";
+ mes "The residents of Comodo are using this unusual circumstance to draw tourists to our area...";
+ close;
+}
+
+//Duplicates
+comodo.gat,176,350,4 duplicate(guide_c) Guide#p1-14 700
+
+comodo.gat,37,219,4 duplicate(guide_c) Guide#p1-15 700
+
+//[Yuno]
+
+//Needs Translation
+yuno.gat,153,47,4 script "ƒWƒ…ƒm[ƒKƒCƒh" 700,{
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ mes "‰ß‹Ž‚ð’m‚ècc";
+ mes "Œ»Ý‚ðŒ©‚Â‚ßcc";
+ mes "–¢—ˆ‚ð—\’m‚·‚écc";
+ mes "‚±‚±‚ÍŒ«ŽÒ‚½‚¿‚Ì“sŽs";
+ mes "- ƒWƒ…ƒm[ -";
+ mes "ƒWƒ…ƒm[‚ɂ悤‚±‚»";
+ next;
+ menu "•Ší–h‹ï“X",L1,"“¹‹ï“X",L2,"ƒZ[ƒWƒLƒƒƒbƒXƒ‹ (ƒZ[ƒW“]EŠ)",L3,"‘“X’Ê‚è",L4,"’†‰›Lê",L5,"‹¤˜a‘}‘ŠÙ",L6,"ƒVƒ…ƒoƒCƒ`ƒFƒ‹–‚–@ƒAƒJƒfƒ~[",L7,"ƒ‚ƒ“ƒXƒ^[”Ž•¨ŠÙ",L8,"‰ï˜b‚ðCancel",LEnd;
+L1:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,120,138,1,0xFF3355;
+ mes "^FF3355+^000000 -> •Ší–h‹ï“X";
+ goto Lgo;
+L2:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,193,142,2,0x3355FF;
+ mes "^3355FF+^000000 -> “¹‹ï“X";
+ goto Lgo;
+L3:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,90,318,3,0x33FF55;
+ mes "^33FF55+^000000 -> ƒZ[ƒWƒLƒƒƒbƒXƒ‹";
+ mes "(ƒZ[ƒW“]EŠ)";
+ goto Lgo;
+L4:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,257,102,4,0xFF3355;
+ mes "^FF3355+^000000 -> ‘“X’Ê‚è";
+ goto Lgo;
+L5:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,157,170,5,0x3355FF;
+ mes "^3355FF+^000000 -> ’†‰›Lê";
+ goto Lgo;
+L6:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,336,204,6,0x33FF55;
+ mes "^33FF55+^000000 -> ‹¤˜a‘}‘ŠÙ";
+ goto Lgo;
+L7:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,323,281,7,0xFF3355;
+ mes "^FF3355+^000000 -> ƒVƒ…ƒoƒCƒ`ƒFƒ‹–‚–@ƒAƒJƒfƒ~[";
+ goto Lgo;
+L8:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ viewpoint 1,278,288,8,0x3355FF;
+ mes "^3355FF+^000000 -> ƒ‚ƒ“ƒXƒ^[”Ž•¨ŠÙ";
+ goto Lgo;
+Lgo:
+ mes "‚É‚È‚è‚Ü‚·B";
+ mes "—Ç‚¢Žž‚ð‚¨‰ß‚²‚µ‚­‚¾‚³‚¢B";
+ close;
+LEnd:
+ mes "[ƒWƒ…ƒm[ƒKƒCƒh]";
+ mes "Œ«ŽÒ‚½‚¿‚Ì‘å“sŽs";
+ mes "‚»‚µ‚Ä’mŽ¯‚Ì•óŒÉ";
+ mes "ƒWƒ…ƒm[‚ւ悤‚±‚»I";
+ close;
+}
+
+//[Amatsu]
+
+//Needs Translation
+amatsu.gat,207,91,4 script ƒ~ƒXEƒAƒ}ƒc 758,{
+ mes "[Œu‚¿‚á‚ñ]";
+ mes "Ž„‚ÍA‘æ13‘ãƒ~ƒXEƒAƒ}ƒc";
+ mes "¢Œu£‚Æ\‚µ‚Ü‚·B";
+ mes "ƒAƒ}ƒc‘ã•\‚Æ‚µ‚Ä";
+ mes "‘º‚̈ēà‚ð‹Â‚¹‚‚©‚Á‚Ä‚¨‚è‚Ü‚·B";
+ mes "‚È‚É‚©‚²Ž¿–₪‚ ‚è‚Ü‚µ‚½‚ç";
+ mes "‚È‚ñ‚È‚è‚Æ‚¨‚Á‚µ‚á‚Á‚Ä‚­‚¾‚³‚¢‚Ü‚¹B";
+ next;
+ menu "é",L1,"“¹‹ï“X",L2,"•Ší“X",L3,"‹Žð‰®",L4;
+L1:
+ viewpoint 1,85,235,0,0xFF3355;
+ mes "[Œu‚¿‚á‚ñ]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^FF3355+^000000•”•ª‚ª";
+ mes "é‚Å‚²‚´‚¢‚Ü‚·B";
+ goto LEnd;
+L2:
+ viewpoint 1,96,118,1,0xCE6300;
+ mes "[Œu‚¿‚á‚ñ]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^CE6300+^000000•”•ª‚ª";
+ mes "“¹‹ï“X‚É‚È‚è‚Ü‚·B";
+ goto LEnd;
+L3:
+ viewpoint 1,132,117,2,0x55FF33;
+ mes "[Œu‚¿‚á‚ñ]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^55FF33+^000000•”•ª‚ª";
+ mes "•Ší“X‚É‚È‚è‚Ü‚·B";
+ goto LEnd;
+L4:
+ viewpoint 1,217,116,3,0x3355FF;
+ mes "[Œu‚¿‚á‚ñ]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^3355FF+^000000•”•ª‚ª";
+ mes "‹Žð‰®‚É‚È‚è‚Ü‚·B";
+LEnd:
+ mes "‚»‚ê‚Å‚ÍAƒAƒ}ƒc‚Å";
+ mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‰º‚³‚¢‚Ü‚¹B";
+ close;
+}
+
+amatsu.gat,251,283,4 script ˆÄ“àl 767,{
+ mes "[ˆÄ“àl]";
+ mes "‚悤‚±‚»B";
+ mes "—·‚ð‚·‚é‚É‚Í—Ç‚¢‹Gß‚Å‚·‚ËB";
+ mes "Ž„‚Í‚±‚̃Aƒ}ƒc‚Ì";
+ mes "ˆÄ“à‚ðˆø‚«Žó‚¯‚Ä‚¨‚éŽÒ‚Å‚·B";
+ next;
+ mes "[ˆÄ“àl]";
+ mes "‰½‚ð‚¨’T‚µ‚Å‚·‚©H";
+ next;
+ menu "é",L1,"“¹‹ï“X",L2,"•Ší“X",L3,"‹Žð‰®",L4;
+L1:
+ viewpoint 1,85,235,0,0xFF3355;
+ mes "[ˆÄ“àl]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^FF3355+^000000•”•ª‚ª";
+ mes "é‚Å‚²‚´‚¢‚Ü‚·B";
+ goto LEnd;
+L2:
+ viewpoint 1,96,118,1,0xCE6300;
+ mes "[ˆÄ“àl]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^CE6300+^000000•”•ª‚ª";
+ mes "“¹‹ï“X‚É‚È‚è‚Ü‚·B";
+ goto LEnd;
+L3:
+ viewpoint 1,132,117,2,0x55FF33;
+ mes "[ˆÄ“àl]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^55FF33+^000000•”•ª‚ª";
+ mes "•Ší“X‚É‚È‚è‚Ü‚·B";
+ goto LEnd;
+L4:
+ viewpoint 1,217,116,3,0x3355FF;
+ mes "[ˆÄ“àl]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^3355FF+^000000•”•ª‚ª";
+ mes "‹Žð‰®‚É‚È‚è‚Ü‚·B";
+LEnd:
+ mes "‚»‚ê‚Å‚ÍAƒAƒ}ƒc‚Å";
+ mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‰º‚³‚¢‚Ü‚¹B";
+ close;
+}
+
+
+//[Gonryun]
+
+//Needs Translation
+gonryun.gat,163,60,4 script ƒRƒ“ƒƒ“ƒKƒCƒh 780,{
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "‚¢‚Â‚àŠˆ‹C‚É–ž‚¿‚ÄA”M‹C‚ª‚ ‚Ó‚ê";
+ mes "–ˆ“úlX‚ªs‚«Œð‚Á‚Ä‚¢‚é";
+ mes "ƒRƒ“ƒƒ“‚É‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹!";
+ next;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "¤”„‚ª‚çA‘º‚̈ēà‚ð‚µ‚Ä";
+ mes "‚¢‚Ü‚·B’m‚肽‚¢‚±‚Æ‚ª‚ ‚ê‚Î";
+ mes "‰½‚Å‚à•·‚¢‚Ä‚­‚¾‚³‚¢B";
+ next;
+ menu "‘º’·‚̉Æ",L1,"“¹‹ï¤l",L2,"•Ší¤l",L3,"–h‹ï¤l",L4,"—·ŠÙ",L5;
+L1:
+ viewpoint 1,109,131,0,0xff3355;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^ff3355+^000000‚̈ʒu‚É";
+ mes "‘º’·‚̉Ƃª‚ ‚è‚Ü‚·B";
+ goto Lend;
+L2:
+ viewpoint 1,147,84,1,0xce6300;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^ce6300+^000000‚̈ʒu‚É";
+ mes "“¹‹ï¤l‚ª‚¢‚Ü‚·B";
+ goto Lend;
+L3:
+ viewpoint 1,174,101,2,0x55ff33;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^55ff33+^000000‚̈ʒu‚É";
+ mes "•Ší¤l‚ª‚¢‚Ü‚·B";
+ goto Lend;
+L4:
+ viewpoint 1,173,84,3,0x3355ff;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^3355ff+^000000‚̈ʒu‚É";
+ mes "–h‹ï¤l‚ª‚¢‚Ü‚·B";
+ goto Lend;
+L5:
+ viewpoint 1,215,114,4,0xffffff;
+ mes "[ƒn ƒEƒHƒ“ƒ`]";
+ mes "ƒ~ƒjƒ}ƒbƒv‚Ì";
+ mes "^ffffff+^000000‚̈ʒu‚É";
+ mes "—·ŠÙ‚ª‚ ‚è‚Ü‚·B";
+ goto Lend;
+Lend:
+ mes "Ž„’B‚ÌŠy‚µ‚¢ƒRƒ“ƒƒ“‚ð";
+ mes "Žv‚¢‚Á‚«‚èŠy‚µ‚ñ‚Å‚­‚¾‚³‚¢I";
+ close;
+}
+
+// Below not in japanese NPC
+
+aldebaran.gat,139,63,4 script Soldier 105,{
+ mes "[Al De Baran Guard]";
+ mes "I am just any ordinary guard you could find in any other cities!!";
+ mes "I am in charge of Service Guide in Al De Baran Garrison, and the name is Al De Baran Guard (No Name) !!";
+ mes "I will guide you though our town!";
+ next;
+ menu "Get Location Guide",L0,"End conversation",End;
+
+ L0:
+ mes "^FF0000+^000000 -> Kafra Main Office";
+ mes "^0000FF+^000000 -> Weapon Shop";
+ mes "^00F0F0+^000000 -> Sorcerer Guild (Closed)";
+ mes "^808080+^000000 -> Pub";
+ mes "^00FF00+^000000 -> Item Shop";
+ mes "^F0F000+^000000 -> Chemical Acadamy (Closed)";
+ viewpoint 0,53,228,1,0xFF0000;
+ viewpoint 1,48,198,1,0x0000FF;
+ viewpoint 2,48,198,1,0x00F0F0;
+ viewpoint 3,48,198,1,0x808080;
+ viewpoint 4,48,198,1,0x00FF00;
+ viewpoint 5,35,35,1,0xF0F000;
+ close;
+ LEnd:
+ mes "[Al De Baran Guard]";
+ mes "We are shown to protect Al De Baran!!";
+ close;
+}
+
+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?",Sure,"Not really, I don't care.",NotReally;
+
+ Sure:
+ mes "[Soldier]";
+ mes "Ah~~ There is not much for us to do these days. Merchants buy items, which monsters drop. You knew that, right?";
+ next;
+ menu "Of course",OfCourse,"Eh? Really?",EhReally;
+
+ OfCourse:
+ mes "[Soldier]";
+ mes "HaHa In fact, that was actually our job.";
+ mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
+ next;
+ mes "[Soldier]";
+ mes "We had to work over time every day.";
+ mes "Ah~~~ that was a nightmare...~~~";
+ mes "Anyways, the government took a smart action, making the Registration System. The Office of Prize Compensation only pays those who have the Registration.";
+ next;
+ mes "[Soldier]";
+ mes "Requirements for the Registration are for a merchant to secure sufficient funds and to stay at one place all the time. The Office gives away the registration to any merchant who fullfills those requirements.";
+ next;
+ mes "[Soldier]";
+ mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
+ mes "People who suffered first know how to thank even the slightest comfort.";
+ mes "HaHaHaHaHa!";
+ close;
+ EhReally:
+ mes "[Soldier]";
+ mes "What?! What do you mean you didn't know?!";
+ mes "Hm... well... well... You know you could get some items killing some monsters. You could make some money out of it if you bring and sell those to a merchant.";
+ mes "ANYWAYS!";
+ next;
+ mes "[Soldier]";
+ mes "HaHa In fact, that was actually our job.";
+ mes "But there were more and more hunters who come in order to get paid. So it was just too much to handle.";
+ next;
+ mes "[Soldier]";
+ mes "We had to work over time every day.";
+ mes "Ah~~~ that was a nightmare...~~~";
+ mes "Anyways, the government took a smart action, making the Registration System. The Office of Prize Compensation only pays those who have the Registration.";
+ next;
+ mes "[Soldier]";
+ mes "Requirements for the Registration are for a merchant to secure sufficient funds and to stay at one place all the time. The Office gives away the registration to any merchant who fullfills those requirements.";
+ next;
+ mes "[Soldier]";
+ mes "So there aren't too many people that come to us any more. I mean we are still busy, but that's nothing compared to how it was before~~";
+ mes "People who suffered first know how to thank even the slightest comfort.";
+ mes "HaHaHaHaHa!";
+ close;
+ NotReally:
+ mes "[Soldier]";
+ mes "OK Good bye~~";
+ close;
+}
+
+prontera.gat,160,330,4 script Guard#p2-1::guard_p 105,{
+ mes "Welcome to Prontera.";
+ close;
+}
+
+prontera.gat,223,99,1 duplicate(guard_p) Guard#p2-2 105
+
+prontera.gat,229,104,1 duplicate(guard_p) Guard#p2-3 105
+
+prontera.gat,47,339,5 duplicate(guard_p) Guard#p2-4 105
+
+prontera.gat,52,344,5 duplicate(guard_p) Guard#p2-5 105
+
+
+prt_maze02.gat,100,69,4 script Soldier#p3-1::soldier_p 105,{
+ mes "[Soldier]";
+ mes "Yo yo, you'd be better not to go in there. It has rumored there is a Demon living in the forest.";
+ mes "Of course it is just a rumor because no one see the people turning back from the palce.";
+ mes "hmmm... it's up to you to go in or leave.";
+ close;
+}
+prt_maze02.gat,110,69,4 duplicate(soldier_p) Soldier#p3-2 105
+
+//Yuno
+yuno.gat,46,165,4 script Soldier#p4-1::soldier_y 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ close;
+}
+
+yuno.gat,61,165,4 duplicate(soldier_y) Soldier#p4-2 105
+
+yuno.gat,150,228,4 duplicate(soldier_y) Soldier#p4-2 105
+
+yuno.gat,165,228,4 duplicate(soldier_y) Soldier#p4-2 105
+
+yuno.gat,262,319,2 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to Yuno, the scholar's city where ancient wisdom exists.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "There is a holy shield for Crusaders called 'The Messenger of the God'.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "It looks like a long shield with a angel's wing image on its center.";
+ mes " It is especially strong against undead or demons.";
+ close;
+}
+
+yuno.gat,227,292,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists, Yuno.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Around the City of Juno, there is fallen angel that fakes himself as the real angel, named 'Fake Angel'.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "This one fakes itself as the real angel, and acts as if it's blessing travelers, and attacks them.";
+ mes "It looks all beautiful, so it's bad if you fall for its appearance.";
+ close;
+}
+
+yuno.gat,150,283,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists, Yuno.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Larva Golem is a stone doll that has a stone heart in which its magical power was induced by magma.";
+ mes "....from the body, it flows...";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Magma is really hot as to even melt away armor and weapon made with steel.";
+ mes "if you attack thoughtlessly, ";
+ next;
+ mes "[Yuno Soldier]";
+ mes "you might get a lot of damage on yourself and even get your armor and weapon broken.";
+ close;
+}
+
+yuno.gat,165,283,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "'Geographer', it is a hard shell type thing that grows around flowers from the earth.";
+ mes "Thus, even if it's far away, you can't think less of it.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "it got such name 'cause the passing-by geography scholar got eaten away during his research.";
+ close;
+}
+
+//Comodo
+
+//Yuno
+yuno.gat,46,165,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ close;
+}
+
+yuno.gat,61,165,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ close;
+}
+
+
+yuno.gat,150,228,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ close;
+}
+
+yuno.gat,165,228,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ close;
+}
+
+yuno.gat,262,319,2 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to Yuno, the scholar's city where ancient wisdom exists.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "There is a holy shield for Crusaders called 'The Messenger of the God'.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "It looks like a long shield with a angel's wing image on its center.";
+ mes " It is especially strong against undead or demons.";
+ close;
+}
+
+yuno.gat,227,292,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists, Yuno.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Around the City of Juno, there is fallen angel that fakes himself as the real angel, named 'Fake Angel'.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "This one fakes itself as the real angel, and acts as if it's blessing travelers, and attacks them.";
+ mes "It looks all beautiful, so it's bad if you fall for its appearance.";
+ close;
+}
+
+yuno.gat,150,283,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists, Yuno.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Larva Golem is a stone doll that has a stone heart in which its magical power was induced by magma.";
+ mes "....from the body, it flows...";
+ next;
+ mes "[Yuno Soldier]";
+ mes "Magma is really hot as to even melt away armor and weapon made with steel.";
+ mes "if you attack thoughtlessly, ";
+ next;
+ mes "[Yuno Soldier]";
+ mes "you might get a lot of damage on yourself and even get your armor and weapon broken.";
+ close;
+}
+
+yuno.gat,165,283,4 script Yuno Soldier 105,{
+ mes "[Yuno Soldier]";
+ mes "Welcome to City of scholars where wisdom exists.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "'Geographer', it is a hard shell type thing that grows around flowers from the earth.";
+ mes "Thus, even if it's far away, you can't think less of it.";
+ next;
+ mes "[Yuno Soldier]";
+ mes "it got such name 'cause the passing-by geography scholar got eaten away during his research.";
+ close;
+}
diff --git a/npc/other/old/kafra.txt b/npc/other/old/kafra.txt
index dcf05a1ce..9d25b078c 100644
--- a/npc/other/old/kafra.txt
+++ b/npc/other/old/kafra.txt
@@ -1,1866 +1,1866 @@
-//===== eAthena Script =======================================
-//= Kafra Script
-//===== By: ==================================================
-//= Lotsa People (1.0)
-//= Darlskies (1.1)
-//= Darkchild (1.2)
-//= Syrus22 (2.0)
-//= Syrus22 (2.1)
-//= Darkchild (2.2)
-//===== Current Version: =====================================
-//= 2.2
-//===== Compatible With: =====================================
-//= Any eAthena Version In Which functions work.
-//===== Description: =========================================
-//= All The Kafra's In Ro, Incl HQ
-//===== Additional Comments: =================================
-//= Darkskies did all the kafra points stuff.
-//= Syrus22 - I compltely rewrote the script pretty much except for
-//= the normal conversation text in the Kafra HQ NPCs.
-//= Syrus22 - I fixed the Special Reserve in the Kafra HQ to really
-//= give you items. I will add the Lottery Chances when I get
-//= full info on the prizes.
-//= Syrus22 - I will add a Louyang Kafra when I get better location info.
-//= Darkchild - Added Comodo
-//============================================================
-
-//**********************************************//
-//Actual Kafra NPCs //
-//**********************************************//
-//These will set the necessary variables for my //
-//functions to work. //
-//**********************************************//
-//---Orc Dungeon Kafra---
-gef_fild10.gat,73,340,4 script Kafra#orc1 115,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"gef_fild10.gat";
-set @save1x,54;
-set @save1y,232;
-
-callfunc "kaframain";
-break;
-}
-//---Byalan Kafra---
-izlu2dun.gat,106,58,8 script Kafra 115,{
-if (class != Job_Novice) goto Lkafra;
-if((job_merchant_q==8) || (job_merchant_q==7)) goto JobMerQE8oE7;
-if((job_merchant_q==6) || (job_merchant_q==5)) goto JobMerQE6oE5;
-
-JobMerQE8oE7:
- if(countitem(Delivery_Message) != 0) goto JobMerQE8oE7Cont;
-
-JobMerQE8oE7Cont:
- menu "Excuse me.",M0;
-
- M0:
- mes "[Kafra]";
- mes "Yes?";
- cutin "kafra_03",255;
- close;
-
-JobMerQE6oE5:
- mes "[Kafra]";
- mes "Delivery fro the Merchant Guild?? Ah, Right! Yes! I almost forgot.";
- mes "Okay,Please put down here....";
- if((countitem(1081)==1) || (countitem(1082)==1) || (countitem(1083)==1)) goto MerBox123E1;
- mes ".... I think our orders are almost one Box of Oversized and Heavy....But you seem to carry it on without difficulty.";
- close;
-
- MerBox123E1:
- next;
- mes "[Kafra]";
- mes "Let me check its Serial numbers, I have to give the receipt to you anyhow.";
- if(nov_1_2_cos_c==7) goto JobMerQ2E7;
- if(nov_1_2_cos_c==8) goto JobMerQ2E8;
- next;
- mes "[Kafra]";
- mes "......? Excuse me! I think you gave me the wrong one.";
- mes "Our order should have the serial numbers as either of 3318702 or 3543625...";
- cutin "kafra_03",255;
- close;
-
-JobMerQ2E7:
- if(countitem(1081) !=0) goto MerBox1NE0;
-
- MerBox1NE0:
- mes "Um.... 3012685. Yes! This is the right one we ordered. Here, your receipt.";
- delitem 1081,1;
- getitem 1079,1;
- goto JobMerQ2Cont;
-
-JobMerQ2E8:
- if(countitem(1081) !=0) goto MerBox2NE0;
-
- MerBox2NE0:
- mes "Um.... 3543625. Yes! This is the right one we ordered. Here, your receipt.";
- delitem 1082,1;
- getitem 1080,1;
- goto JobMerQ2Cont;
-
-JobMerQ2Cont:
- if(job_merchant_q==6) goto JobMerQE6;
- getitem 3005,2;
- goto JobMerQ2Cont1;
-
-JobMerQE6:
- getitem 3005,2;
- goto JobMerQ2Cont1;
-
-JobMerQ2Cont1:
- getitem 3017,1;
- if(countitem(Delivery_Message) != 0) goto DevMsg;
- goto DevMsgCont;
-
-DevMsg:
- menu "This is from Mr. Mahnsoo...",M1;
-
- M1:
- delitem 1072,1;
- set nov_3_merchant,11;
- mes "[Kapra]";
- 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 so soon like this time~";
- goto DevMsgCont;
-
- DevMsgCont:
- next;
- mes "[Kafra]";
- mes "I really appreciate you for what you've done so far. This is my Small Gift for you to lay my heart.";
- mes "I hope you will help me next time.";
- set @TEMP,rand(2);
- goto R0;
-
- R0:
- if(@TEMP !=0) goto R1;
- getitem 513,3;
- cutin "kafra_03",255;
- close;
- R1:
- getitem 512,3;
- cutin "kafra_03",255;
- close;
-
-Lkafra:
-set @cutinpic$,"kafra_03";
-
-set @save,1;
-set @save1map$,"izlu2dun.gat";
-set @save1x,87;
-set @save1y,170;
-
-callfunc "kaframain";
-break;
-}
-//---Pyramids Kafra---
-moc_ruins.gat,61,156,5 script Kafra#pyr1 114,{
-set @cutinpic$,"kafra_04";
-
-set @save,1;
-set @save1map$,"moc_ruins.gat";
-set @save1x,41;
-set @save1y,141;
-
-callfunc "kaframain";
-break;
-}
-//---Northern Prontera Field Kafra---
-prt_fild01.gat,198,47,8 script Kafra#pfl1 112,{
-set @cutinpic$,"kafra_06";
-
-set @save,1;
-set @save1map$,"prt_fild01.gat";
-set @save1x,197;
-set @save1y,50;
-
-callfunc "kaframain";
-break;
-}
-//---Culvert Kafra---
-prt_fild05.gat,290,224,1 script Kafra#pfl2 114,{
-set @cutinpic$,"kafra_04";
-
-set @save,1;
-set @save1map$,"prt_fild05.gat";
-set @save1x,274;
-set @save1y,243;
-
-callfunc "kaframain";
-break;
-}
-//---In Alberta Kafras---
-alberta.gat,28,229,8 script Kafra#alb1 115,{
-set @cutinpic$,"kafra_02";
-
-set @save1map$,"alberta.gat";
-set @save1x,31;
-set @save1y,231;
-set @save2map$,"pay_fild03.gat";
-set @save2x,386;
-set @save2y,76;
-
-set @warps,4;
-
-set @warp1$,"Payon";
-set @warp1name$,"payon.gat";
-set @warp1x,69;
-set @warp1y,100;
-set @warp1zeny,1300;
-
-set @warp2$,"Prontera";
-set @warp2name$,"prontera.gat";
-set @warp2x,116;
-set @warp2y,75;
-set @warp2zeny,2100;
-
-set @warp3$,"Morocc";
-set @warp3name$,"morocc.gat";
-set @warp3x,156;
-set @warp3y,46;
-set @warp3zeny,2200;
-
-set @warp4$,"Comodo";
-set @warp4name$,"comodo.gat";
-set @warp4x,209;
-set @warp4y,143;
-set @warp4zeny,2400;
-
-set @kaflocations,1;
-set @location1x,113;
-set @location1y,60;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-alberta.gat,113,60,5 script Kafra#alb2 112,{
-set @cutinpic$,"kafra_06";
-
-set @save,1;
-set @save1map$,"alberta.gat";
-set @save1x,117;
-set @save1y,57;
-
-set @warps,4;
-
-set @warp1$,"Payon";
-set @warp1name$,"payon.gat";
-set @warp1x,69;
-set @warp1y,100;
-set @warp1zeny,1300;
-
-set @warp2$,"Prontera";
-set @warp2name$,"prontera.gat";
-set @warp2x,116;
-set @warp2y,75;
-set @warp2zeny,2100;
-
-set @warp3$,"Morocc";
-set @warp3name$,"morocc.gat";
-set @warp3x,156;
-set @warp3y,46;
-set @warp3zeny,2200;
-
-set @warp4$,"Comodo";
-set @warp4name$,"comodo.gat";
-set @warp4x,209;
-set @warp4y,143;
-set @warp4zeny,2400;
-
-set @kaflocations,1;
-set @location1x,28;
-set @location1y,229;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---Sunken Ship Kafra---
-alb2trea.gat,59,69,1 script Kafra#snk1 117,{
-set @cutinpic$,"kafra_03";
-
-set @save,1;
-set @save1map$,"alb2trea.gat";
-set @save1x,92;
-set @save1y,64;
-
-callfunc "kaframain";
-break;
-}
-//---In Al De Baran Kafra---
-aldebaran.gat,143,119,4 script Kafra#ald1 113,{
-set @cutinpic$,"kafra_05";
-
-set @save,1;
-set @save1map$,"aldebaran.gat";
-set @save1x,143;
-set @save1y,109;
-
-set @warps,3;
-
-set @warp1$,"Geffen";
-set @warp1name$,"geffen.gat";
-set @warp1x,120;
-set @warp1y,39;
-set @warp1zeny,1600;
-
-set @warp2$,"Mjolnir Dead Pit";
-set @warp2name$,"mjolnir_02.gat";
-set @warp2x,99;
-set @warp2y,351;
-set @warp2zeny,1700;
-
-set @warp3$,"Comodo";
-set @warp3name$,"comodo.gat";
-set @warp3x,209;
-set @warp3y,143;
-set @warp3zeny,2200;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Geffen Kafras---
-geffen.gat,120,62,8 script Kafra#gef1 115,{
-set @cutinpic$,"kafra_03";
-
-set @save,1;
-set @save1map$,"geffen.gat";
-set @save1x,119;
-set @save1y,40;
-
-set @warps,5;
-
-set @warp1$,"Prontera";
-set @warp1name$,"prontera.gat";
-set @warp1x,116;
-set @warp1y,75;
-set @warp1zeny,1400;
-
-set @warp2$,"Izlude";
-set @warp2name$,"izlude.gat";
-set @warp2x,91;
-set @warp2y,105;
-set @warp2zeny,1800;
-
-set @warp3$,"Al De Baran";
-set @warp3name$,"aldebaran.gat";
-set @warp3x,143;
-set @warp3y,110;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2200;
-
-set @warp5$,"Comodo";
-set @warp5name$,"comodo.gat";
-set @warp5x,209;
-set @warp5y,143;
-set @warp5zeny,2400;
-
-set @kaflocations,1;
-set @location1x,203;
-set @location1y,123;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-geffen.gat,203,123,3 script Kafra#gef2 114,{
-set @cutinpic$,"kafra_04";
-
-set @save1map$,"geffen.gat";
-set @save1x,200;
-set @save1y,124;
-set @save2map$,"gef_fild00.gat";
-set @save2x,51;
-set @save2y,194;
-
-set @warps,5;
-
-set @warp1$,"Prontera";
-set @warp1name$,"prontera.gat";
-set @warp1x,116;
-set @warp1y,75;
-set @warp1zeny,1400;
-
-set @warp2$,"Izlude";
-set @warp2name$,"izlude.gat";
-set @warp2x,91;
-set @warp2y,105;
-set @warp2zeny,1800;
-
-set @warp3$,"Al De Baran";
-set @warp3name$,"aldebaran.gat";
-set @warp3x,143;
-set @warp3y,110;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2200;
-
-set @warp5$,"Comodo";
-set @warp5name$,"comodo.gat";
-set @warp5x,209;
-set @warp5y,143;
-set @warp5zeny,2400;
-
-set @kaflocations,1;
-set @location1x,120;
-set @location1y,62;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Izlude Kafra---
-izlude.gat,124,115,6 script Kafra#izl1 117,{
-set @cutinpic$,"kafra_01";
-
-set @save1map$,"izlude.gat";
-set @save1x,128;
-set @save1y,111;
-set @save2map$,"prt_fild08.gat";
-set @save2x,349;
-set @save2y,202;
-
-set @warps,4;
-
-set @warp1$,"Prontera";
-set @warp1name$,"prontera.gat";
-set @warp1x,116;
-set @warp1y,75;
-set @warp1zeny,900;
-
-set @warp2$,"Payon";
-set @warp2name$,"payon.gat";
-set @warp2x,69;
-set @warp2y,100;
-set @warp2zeny,1700;
-
-set @warp3$,"Geffen";
-set @warp3name$,"geffen.gat";
-set @warp3x,120;
-set @warp3y,39;
-set @warp3zeny,1800;
-
-set @warp4$,"Comodo";
-set @warp4name$,"comodo.gat";
-set @warp4x,209;
-set @warp4y,143;
-set @warp4zeny,2000;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Morocc Kafras---
-morocc.gat,156,97,4 script Kafra#moc1 115,{
-set @cutinpic$,"kafra_03";
-
-set @save,1;
-set @save1map$,"morocc.gat";
-set @save1x,156;
-set @save1y,46;
-
-set @warps,5;
-
-set @warp1$,"Prontera";
-set @warp1name$,"prontera.gat";
-set @warp1x,116;
-set @warp1y,75;
-set @warp1zeny,1800;
-
-set @warp2$,"Payon";
-set @warp2name$,"payon.gat";
-set @warp2x,69;
-set @warp2y,100;
-set @warp2zeny,1800;
-
-set @warp3$,"Alberta";
-set @warp3name$,"alberta.gat";
-set @warp3x,117;
-set @warp3y,56;
-set @warp3zeny,2200;
-
-set @warp4$,"Geffen";
-set @warp4name$,"geffen.gat";
-set @warp4x,120;
-set @warp4y,39;
-set @warp4zeny,2200;
-
-set @warp5$,"Comodo";
-set @warp5name$,"comodo.gat";
-set @warp5x,209;
-set @warp5y,143;
-set @warp5zeny,1800;
-
-set @kaflocations,1;
-set @location1x,163;
-set @location1y,260;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-morocc.gat,163,260,4 script Kafra 114,{
-set @cutinpic$,"kafra_04";
-
-set @save1map$,"morocc.gat";
-set @save1x,187;
-set @save1y,281;
-set @save2map$,"moc_fild07.gat";
-set @save2x,212;
-set @save2y,30;
-
-set @warps,5;
-
-set @warp1$,"Prontera";
-set @warp1name$,"prontera.gat";
-set @warp1x,116;
-set @warp1y,75;
-set @warp1zeny,1800;
-
-set @warp2$,"Payon";
-set @warp2name$,"payon.gat";
-set @warp2x,69;
-set @warp2y,100;
-set @warp2zeny,1800;
-
-set @warp3$,"Alberta";
-set @warp3name$,"alberta.gat";
-set @warp3x,117;
-set @warp3y,56;
-set @warp3zeny,2200;
-
-set @warp4$,"Geffen";
-set @warp4name$,"geffen.gat";
-set @warp4x,120;
-set @warp4y,39;
-set @warp4zeny,2200;
-
-set @warp5$,"Comodo";
-set @warp5name$,"comodo.gat";
-set @warp5x,209;
-set @warp5y,143;
-set @warp5zeny,1800;
-
-set @kaflocations,1;
-set @location1x,156;
-set @location1y,97;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Payon Kafra---
-payon.gat,99,116,4 script Kafra#pay1 113,{
-set @cutinpic$,"kafra_05";
-
-set @save1map$,"payon.gat";
-set @save1x,69;
-set @save1y,100;
-set @save2map$,"pay_fild01.gat";
-set @save2x,340;
-set @save2y,347;
-
-set @warps,4;
-
-set @warp1$,"Alberta";
-set @warp1name$,"alberta.gat";
-set @warp1x,117;
-set @warp1y,56;
-set @warp1zeny,1300;
-
-set @warp2$,"Prontera";
-set @warp2name$,"prontera.gat";
-set @warp2x,116;
-set @warp2y,72;
-set @warp2zeny,1800;
-
-set @warp3$,"Morocc";
-set @warp3name$,"morocc.gat";
-set @warp3x,156;
-set @warp3y,46;
-set @warp3zeny,1800;
-
-set @warp4$,"Comodo";
-set @warp4name$,"comodo.gat";
-set @warp4x,209;
-set @warp4y,143;
-set @warp4zeny,2000;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---Archer Village Kafra---
-pay_arche.gat,55,123,8 script Kafra 117,{
-set @cutinpic$,"kafra_01";
-
-set @save,1;
-set @save1map$,"pay_arche.gat";
-set @save1x,49;
-set @save1y,144;
-
-callfunc "kaframain";
-break;
-}
-//---In Prontera Kafras---
-prontera.gat,29,207,6 script Kafra#pro2 113,{
-set @cutinpic$,"kafra_05";
-
-set @warps,6;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,1400;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,1700;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,1800;
-
-set @warp5$,"Orc Dungeon";
-set @warp5name$,"gef_fild10.gat";
-set @warp5x,52;
-set @warp5y,326;
-set @warp5zeny,1700;
-
-set @warp6$,"Comodo";
-set @warp6name$,"comodo.gat";
-set @warp6x,209;
-set @warp6y,143;
-set @warp6zeny,2000;
-
-set @save1map$,"prontera.gat";
-set @save1x,33;
-set @save1y,208;
-set @save2map$,"prt_fild05.gat";
-set @save2x,367;
-set @save2y,205;
-
-set @kaflocations,1;
-set @location1x,146;
-set @location1y,89;
-set @location2x,282;
-set @location2y,200;
-set @location3x,151;
-set @location3y,29;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-prontera.gat,146,89,6 script Kafra#pro1 115,{
-set @cutinpic$,"kafra_03";
-
-set @warps,6;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,1400;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,1700;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,1800;
-
-set @warp5$,"Orc Dungeon";
-set @warp5name$,"gef_fild10.gat";
-set @warp5x,52;
-set @warp5y,326;
-set @warp5zeny,1700;
-
-set @warp6$,"Comodo";
-set @warp6name$,"comodo.gat";
-set @warp6x,209;
-set @warp6y,143;
-set @warp6zeny,2000;
-
-set @save,1;
-set @save1map$,"prontera.gat";
-set @save1x,116;
-set @save1y,73;
-
-set @kaflocations,1;
-set @location1x,29;
-set @location1y,207;
-set @location2x,282;
-set @location2y,200;
-set @location3x,151;
-set @location3y,29;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-prontera.gat,282,199,6 script Kafra 115,{
-set @cutinpic$,"kafra_03";
-
-set @warps,6;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,1400;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,1700;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,1800;
-
-set @warp5$,"Orc Dungeon";
-set @warp5name$,"gef_fild10.gat";
-set @warp5x,52;
-set @warp5y,326;
-set @warp5zeny,1700;
-
-set @warp6$,"Comodo";
-set @warp6name$,"comodo.gat";
-set @warp6x,209;
-set @warp6y,143;
-set @warp6zeny,2000;
-
-set @save,1;
-set @save1map$,"prontera.gat";
-set @save1x,117;
-set @save1y,73;
-
-set @kaflocations,1;
-set @location1x,29;
-set @location1y,207;
-set @location2x,146;
-set @location2y,89;
-set @location3x,151;
-set @location3y,29;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-prontera.gat,151,29,8 script Kafra 115,{
-set @cutinpic$,"kafra_03";
-
-set @warps,6;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,1400;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,1700;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,1800;
-
-set @warp5$,"Orc Dungeon";
-set @warp5name$,"gef_fild10.gat";
-set @warp5x,52;
-set @warp5y,326;
-set @warp5zeny,1700;
-
-set @warp6$,"Comodo";
-set @warp6name$,"comodo.gat";
-set @warp6x,209;
-set @warp6y,143;
-set @warp6zeny,2000;
-
-set @save1map$,"prontera.gat";
-set @save1x,150;
-set @save1y,33;
-set @save2map$,"prt_fild08.gat";
-set @save2x,170;
-set @save2y,369;
-
-set @kaflocations,1;
-set @location1x,29;
-set @location1y,207;
-set @location2x,146;
-set @location2y,89;
-set @location3x,282;
-set @location3y,199;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Yuno Kafras---
-yuno.gat,328,108,6 script Kafra 117,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"yuno.gat";
-set @save1x,332;
-set @save1y,107;
-
-set @warps,4;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2100;
-
-set @kafralocations,1;
-set @location1x,151;
-set @location1y,87;
-set @location2x,278;
-set @location2y,221;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-yuno.gat,151,87,4 script Kafra 115,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"yuno.gat";
-set @save1x,154;
-set @save1y,75;
-
-set @warps,4;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2100;
-
-set @kafralocations,1;
-set @location1x,328;
-set @location1y,108;
-set @location2x,278;
-set @location2y,221;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-yuno.gat,278,221,6 script Kafra 117,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"yuno.gat";
-set @save1x,332;
-set @save1y,107;
-
-set @warps,4;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2100;
-
-set @kafralocations,1;
-set @location1x,328;
-set @location1y,108;
-set @location2x,151;
-set @location2y,87;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Umbala Kafra---
-umbala.gat,128,133,4 script Kafra 115,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"umbala.gat";
-set @save1x,126;
-set @save1y,131;
-
-set @warps,4;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2100;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---In Gonryun Kafra---
-//Note: Gave this Kafra the same warps as Umbala and Yuno till I get the
-//real warp information.
-gonryun.gat,159,122,4 script Kafra 116,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"gonryun.gat";
-set @save1x,160;
-set @save1y,62;
-
-set @warps,4;
-
-set @warp1$,"Izlude";
-set @warp1name$,"izlude.gat";
-set @warp1x,91;
-set @warp1y,105;
-set @warp1zeny,900;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @warp3$,"Payon";
-set @warp3name$,"payon.gat";
-set @warp3x,69;
-set @warp3y,100;
-set @warp3zeny,2100;
-
-set @warp4$,"Morocc";
-set @warp4name$,"morocc.gat";
-set @warp4x,156;
-set @warp4y,46;
-set @warp4zeny,2100;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//---Comodo---
-comodo.gat,166,163,3 script Kafra 721,{
-set @cutinpic$,"kafra_02";
-
-set @save,1;
-set @save1map$,"comodo.gat";
-set @save1x,188;
-set @save1y,148;
-
-set @warps,2;
-
-set @warp1$,"Morroc";
-set @warp1name$,"morocc.gat";
-set @warp1x,156;
-set @warp1y,46;
-set @warp1pay,2400;
-
-set @warp2$,"Geffen";
-set @warp2name$,"geffen.gat";
-set @warp2x,120;
-set @warp2y,39;
-set @warp2zeny,2100;
-
-set @special,1;
-
-callfunc "kaframain";
-break;
-}
-//**********************************************//
-//Kafra Main //
-//**********************************************//
-//The main kafra script. This will call the //
-//necessary functions from the rest of the //
-//script. //
-//**********************************************//
-function script kaframain -1,{
-cutin @cutinpic$,2;
-mes "[Kafra Employee]";
-mes "Welcome to Kafra Corporation. The Kafra services are always by your side.";
-mes "How may I assist you?";
-next;
-if ((@warps > 0) && (@special > 0)) goto Lallmenu;
-if ((@warps > 0) && (@special == 0)) goto Lwarpmenu;
-if (@warps == 0) goto Lnowarpmenu;
-
-Lallmenu:
-menu "Save",Lsave,"Use Storage",Lstorage,"Use Teleport Service",Lwarp,"Rent a Cart",Lcart,"Check Other Information",Lother,"Cancel",Lcancel;
-
-Lwarpmenu:
-menu "Save",Lsave,"Use Storage",Lstorage,"Use Teleport Service",Lwarp,"Rent a Cart",Lcart,"Cancel",Lcancel;
-
-Lnowarpmenu:
-menu "Save",Lsave,"Use Storage",Lstorage,"Rent a Cart",Lcart,"Cancel",Lcancel;
-
-Lsave:
-callfunc "kafrasave";
-break;
-
-Lstorage:
-callfunc "kafrastorage";
-break;
-
-Lwarp:
-callfunc "kafrawarps";
-break;
-
-Lcart:
-callfunc "kafracart";
-break;
-
-Lother:
-callfunc "kafrainfo";
-break;
-
-Lcancel:
-callfunc "kafraend";
-break;
-}
-//**********************************************//
-//Kafra Save //
-//**********************************************//
-//This will handle the save function for all the//
-//kafras. //
-//**********************************************//
-function script kafrasave -1,{
-if (@save == 1) goto Lsavein;
-mes "[Kafra]";
-mes "Where would you like to save?";
-next;
-menu "Save Outside City",Lsaveout,"Save Inside City",Lsavein;
-
-Lsavein:
- savepoint @save1map$,@save1x,@save1y;
- mes "[Kafra]";
- mes "Your respawn point has been saved. Thank you.";
- callfunc "kafraend";
- break;
-
-Lsaveout:
- savepoint @save2map$,@save2x,@save2y;
- mes "[Kafra]";
- mes "Your respawn point has been saved. Thank you.";
- callfunc "kafraend";
- break;
-}
-//**********************************************//
-//Kafra Storage //
-//**********************************************//
-//This will handle the storage functions for //
-//all the kafras. //
-//**********************************************//
-function script kafrastorage -1,{
-if (getskilllv(1) < 6) goto NeedJobLevel;
-if (Zeny < 30) goto NeedZenys;
-set specialreserve,specialreserve + 30;
-set Zeny, Zeny - 30;
-mes "[Kafra]";
-mes "Ok let me just open your storage for you.";
-openstorage;
-callfunc "kafraend";
-break;
-
-NeedJobLevel:
- mes "[Kafra]";
- mes "I'm sorry but you must have Basic Skill 6 to use storage.";
- callfunc "kafraend";
- break;
-
-NeedZenys:
- mes "[Kafra]";
- mes "I'm sorry but you are short on Zeny.";
- callfunc "kafraend";
- break;
-}
-//**********************************************//
-//Kafra Warps //
-//**********************************************//
-//This will handle all the actual warping and //
-//the payment of Zeny //
-//**********************************************//
-function script kafrawarps -1,{
-mes "[Kafra]";
-mes "Please choose your destination.";
-next;
-if (@warps == 7) goto L7;
-if (@warps == 6) goto L6;
-if (@warps == 5) goto L5;
-if (@warps == 4) goto L4;
-if (@warps == 3) goto L3;
-if (@warps == 2) goto L2;
-
-L2:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,"Cancel",Lcancel;
-
-L3:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,"Cancel",Lcancel;
-
-L4:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,"Cancel",Lcancel;
-
-L5:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,"Cancel",Lcancel;
-
-L6:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,@warp6$ + " -> " + @warp6zeny,Lwarp6,"Cancel",Lcancel;
-
-L7:
- menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,@warp6$ + " -> " + @warp6zeny,Lwarp6,@warp7$ + " -> " + @warp7zeny,Lwarp7,"Cancel",Lcancel;
-
-Lwarp1:
- if (Zeny < @warp1zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp1zeny;
- set Zeny,Zeny - @warp1zeny;
- warp @warp1name$,@warp1x,@warp1y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp2:
- if (Zeny < @warp2zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp2zeny;
- set Zeny,Zeny - @warp2zeny;
- warp @warp2name$,@warp2x,@warp2y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp3:
- if (Zeny < @warp3zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp3zeny;
- set Zeny,Zeny - @warp3zeny;
- warp @warp3name$,@warp3x,@warp3y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp4:
- if (Zeny < @warp4zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp4zeny;
- set Zeny,Zeny - @warp4zeny;
- warp @warp4name$,@warp4x,@warp4y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp5:
- if (Zeny < @warp5zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp5zeny;
- set Zeny,Zeny - @warp5zeny;
- warp @warp5name$,@warp5x,@warp5y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp6:
- if (Zeny < @warp6zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp6zeny;
- set Zeny,Zeny - @warp6zeny;
- warp @warp6name$,@warp6x,@warp6y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lwarp7:
- if (Zeny < @warp7zeny) goto Lneedzeny;
- set specialreserve,specialreserve + @warp7zeny;
- set Zeny,Zeny - @warp7zeny;
- warp @warp7name$,@warp7x,@warp7y;
- set @end,1;
- callfunc "kafraend";
- break;
-
-Lneedzeny:
- mes "[Kafra]";
- mes "I'm sorry you don't have the necessary amount of zeny.";
- callfunc "kafraend";
- break;
-
-Lcancel:
- mes "[Kafra]";
- mes "Ok, Come again soon.";
- callfunc "kafraend";
- break;
-}
-//**********************************************//
-//Kafra Cart //
-//**********************************************//
-//This will handle the cart rental function for //
-//all the Kafras. //
-//**********************************************//
-function script kafracart -1,{
-if ((class == Job_Merchant) || (class == Job_Blacksmith) || (class == Job_Alchem) || (class == Job_Merchant_High) || (class == Job_Whitesmith) || (class == Job_Creator)) goto Lrentcart;
-mes "[Kafra]";
-mes "Sorry this service is only provided for Merchant classes.";
-callfunc "kafraend";
-break;
-
-Lrentcart:
- if (getskilllv(39) < 1) goto Lnopush;
- mes "[Kafra]";
- mes "The cart rental fee is 800 zeny. Do you want to rent a cart?";
- next;
- menu "Rent a Cart",Lrent,"Cancel",Lcancel;
-
-Lrent:
- if (Zeny < 800) goto Lneedzeny;
- set specialreserve,specialreserve + 800;
- set Zeny,Zeny - 800;
- setcart;
- mes "[Kafra]";
- mes "There ya go...";
- callfunc "kafraend";
- break;
-
-Lnopush:
- mes "[Kafra]";
- mes "Sorry but you must have at least ^ff0000Pushcart^000000 level 1.";
- callfunc "kafraend";
- break;
-
-Lneedzeny:
- mes "[Kafra]";
- mes "Sorry but you don't have the zeny.";
- callfunc "kafraend";
- break;
-
-Lcancel:
- mes "[Kafra]";
- mes "Ok. Goodbye then";
- callfunc "kafraend";
- break;
-}
-//**********************************************//
-//Kafra Information //
-//**********************************************//
-//This will handle the extra Kafra functions //
-//such as your kafra points and the locations of//
-//other kafras. //
-//**********************************************//
-function script kafrainfo -1,{
-if (@kaflocations == 1) goto Lfullmenu;
-menu "Check Special Reserve Points",Lreserve,"Cancel",Lcancel;
-
-Lfullmenu:
- menu "Check Special Reserve Points",Lreserve,"Location Tip",Llocation,"Cancel",Lcancel;
-
-Lreserve:
- mes "[Kafra]";
- mes strcharinfo(0) + ", you have accumulated " + specialreserve + " Special Reserve Points.";
- next;
- mes "[Kafra]";
- mes "You can redeem your points at our Headquarters in Al De Baran.";
- callfunc "kafraend";
- break;
-
-Llocation:
- mes "[Kafra]";
- mes "Ok I'll mark them on your map.";
- if (@location1x == 0) goto Lfinished;
- viewpoint 0,@location1x,@location1y,1,0x0000FF;
- if (@location2x == 0) goto Lfinished;
- viewpoint 1,@location2x,@location2y,1,0x0000FF;
- if (@location3x == 0) goto Lfinished;
- viewpoint 2,@location3x,@location3y,1,0x0000FF;
- if (@location4x == 0) goto Lfinished;
- viewpoint 3,@location4x,@location4y,1,0x0000FF;
- callfunc "kafraend";
- break;
-
-Lfinished:
- callfunc "kafraend";
- break;
-
-Lcancel:
- mes "[Kafra]";
- mes "Ok. Bye then...";
- callfunc "kafraend";
- break;
-}
-//**********************************************//
-//End Kafra Function //
-//**********************************************//
-//This will empty all possible variables and end//
-//the kafra scripts. //
-//**********************************************//
-function script kafraend -1,{
-set @warps,0;
-set @save,0;
-set @special,0;
-set @kaflocations,0;
-set @location1x,0;
-set @location2x,0;
-set @location3x,0;
-set @location4x,0;
-if (@end == 1) goto Lbreak;
-cutin @cutinpic$,255;
-close;
-
-Lbreak:
- set @end,0;
- cutin @cutinpic$,255;
- break;
-}
-//---Kafra Warehouse---
-aldeba_in.gat,24,245,4 script Kafra Service 115,{
- cutin "kafra_03",2;
- mes "[Kapra Jasmine]";
- mes "Hi~ I am Kafra No. 1 Type Jasmine.";
- mes "Thank you for comming all the way to Kafra Main Office here at Al De Baran!";
- next;
- mes "[Kapra Jasmine]";
- mes "Our Kapra Service is always together with our customers!";
- mes "Our Kapra Service has a history and legacy of 5 thousand 8 hundred years old...";
- mes "Blah-blah-blah.....";
- next;
- menu "FIVE THOUSNAD AND EIGHT HUNDRED YEARS?!",L0,"Ahh~ Shut Up!",L1,"You go a boyfriend?",L3;
-
- L0:
- mes "[Kapra Jasmine]";
- mes "Shut UP! And listen! It to me a week to memorice this!";
- mes "I've got poor memory unlike other Kafra agents!";
- mes "..... Eh!... What did I just say...";
- next;
- mes "[Kapra Jasmine]";
- mes "Hohohoho. S-sorry... I-it was a show, a standing comedy...";
- mes "Right... Dream Show only for Ka-Kafra customers~!";
- mes "(but a solo show)";
- close;
- L1:
- mes "[Kapra Jasmine]";
- mes ". . . . .";
- mes "I was the member of Kafra Garrion before I joined Kafra Service Team...";
- mes "The speciality was 'Bash'!!";
- mes "I'm trying to be feminine and live a quiet life";
- mes "So please don0t tempt me...";
- close;
- L2:
- mes "[Kapra Jasmine]";
- mes "My, my~. Kafra Service has a ridiculous rule that no Agent can have a boyfriend";
- mes ". . . . .";
- mes ". . . . . . . . . .";
- next;
- mes "[Kapra Jasmine]";
- mes "Just kidding~~ Hehe";
- close;
-}
-
-aldeba_in.gat,79,161,6 script Kafra 115,{
- mes "[Kafra]";
- mes "Welcome, my dearest " + strcharinfo(0) + ".";
- mes "Take goods as many as you've got speacial reserve from Kafra Service~";
- next;
- mes "[Kafra]";
- mes "Please keep in mind that each window requires a different special reserve for your information.";
- mes "Window I am at allows you to use special reserve form ^FF00FF100p to 3000p^000000.";
- next;
- mes "[Kafra]";
- mes "Your special reserve is ^FF0000" + specialreserve + "^000000~";
- mes "Please choose the items you want.";
- next;
- menu "100 = Carrot 7 ea",100,"200 = Carrot 15 ea",200,"300 = Carrot 25 ea",300,"400 = Carrot 35 ea",400,"500 = Carrot 50 ea",500,"600 = Carrot 60 ea",600,"700 = Carrot 75 ea",700,"800 = Carrot 85 ea",800,"900 = Carrot 100 ea",900,"1000 = 1st Lotery Chance!",1000,"Next Articles",L0,"Cancel",LEnd;
-
- 100:
- if(specialreserve < 100) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,7;
- set specialreserve,specialreserve - 100;
- close;
- 200:
- if(specialreserve < 200) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,15;
- set specialreserve,specialreserve - 200;
- close;
- 300:
- if(specialreserve < 300) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,25;
- set specialreserve,specialreserve - 300;
- close;
- 400:
- if(specialreserve < 400) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,35;
- set specialreserve,specialreserve - 400;
- close;
- 500:
- if(specialreserve < 500) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,50;
- set specialreserve,specialreserve - 500;
- close;
- 600:
- if(specialreserve < 600) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,60;
- set specialreserve,specialreserve - 600;
- close;
- 700:
- if(specialreserve < 700) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,75;
- set specialreserve,specialreserve - 700;
- close;
- 800:
- if(specialreserve < 800) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,85;
- set specialreserve,specialreserve - 800;
- close;
- 900:
- if(specialreserve < 900) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 515,100;
- set specialreserve,specialreserve - 900;
- close;
- 1000:
- mes "^FF0000Under Construction^000000";
- close;
- L0:
- menu "1100 = Red Potion 7 ea",1100,"1300 = Red Potion 15 ea",1300,"1500 = Red Potion 25 ea",1500,"1700 = Red Potion 35 ea",1700,"1900 = Red Potion 50 ea",1900,"2100 = Red Potion 60 ea",2100,"2300 = Red Potion 75 ea",2300,"2500 = Red Potion 85 ea",2500,"2800 = Red Potion 100 ea",2800,"3000 = 2nd Lotery Chance!",3000,"Cancel",EndL0;
-
- 1100:
- if(specialreserve < 1100) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,7;
- set specialreserve,specialreserve - 1100;
- close;
- 1300:
- if(specialreserve < 1300) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,15;
- set specialreserve,specialreserve - 1300;
- close;
- 1500:
- if(specialreserve < 1500) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,25;
- set specialreserve,specialreserve - 1500;
- close;
- 1700:
- if(specialreserve < 1700) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,35;
- set specialreserve,specialreserve - 1700;
- close;
- 1900:
- if(specialreserve < 1900) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,50;
- set specialreserve,specialreserve - 1900;
- close;
- 2100:
- if(specialreserve < 2100) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,60;
- set specialreserve,specialreserve - 2100;
- close;
- 2300:
- if(specialreserve < 2300) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,75;
- set specialreserve,specialreserve - 2300;
- close;
- 2500:
- if(specialreserve < 2500) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,85;
- set specialreserve,specialreserve - 2500;
- close;
- 2800:
- if(specialreserve < 2800) goto Lneedpoints;
- mes "[Kafra]";
- mes "Good choice... Here ya go.";
- getitem 501,100;
- set specialreserve,specialreserve - 2800;
- close;
- 3000:
- mes "^FF0000Under Construction^000000";
- close;
-Lend:
- mes "[Kafra]";
- mes "Ok then... Come again if you change your mind.";
- close;
-}
-
-aldeba_in.gat,81,166,4 script Kafra Service 117,{
- cutin "kafra_01",2;
- mes "[Kafra Pavianne]";
- mes "Welcome! I'm Kafra service's the first Kapra Type 'Pavianne'";
- next;
- mes "[Kafra Pavianne]";
- mes "Our Kapra Service is always trying to meet 100% customers satisfaction based on 3 principles, Trust, Devotion and Truest.";
- mes "With complete Service training and supervision, we serve our customers to meet thier needs.";
- next;
- menu "Buy Kafra Pass",L0,"What is Kafra Pass",L1,"Good Bye",L3;
-
- L0:
- getitem 1084,1;
- set Zeny, Zeny-2000;
- mes "[Kafra Pavianne]";
- mes "Thank you for using our Kapra Service all the time!";
- mes "Have a Nice Day!";
- cutin "kafra_01",255;
- close;
- L1:
- mes "[Kafra Pavianne]";
- mes "The best gift you could get only at Kafra Main Office!";
- mes "^4040FF'K A P R A's P A S S'^000000!!";
- mes "TaDa~!";
- next;
- mes "[Kafra Pavianne]";
- mes "With Kafra Pass, you could experience the convenience of Kafra Service world-wide! No Hassle!";
- mes "The price is 2000 zeny~~";
- next;
- mes "[Kafra Pavianne]";
- mes "Visit any Kafra Service in Midgard, and you could enjoy Kafra Service any time any where for once.";
- mes "Ending a a conversation with Kafra Service Agent will expire the pass.";
- cutin "kafra_01",255;
- close;
- L3:
- mes "[Kafra Pavianne]";
- mes "Thank you for using Kafra Service!";
- mes "It was Kafra Pavianne";
- cutin "kafra_01",255;
- close;
-}
-
-aldeba_in.gat,83,244,4 script Kafra Service 116,{
- cutin "kafra_02",2;
- mes "[Kafra Blossom]";
- mes "..... Pavianne is such an old-timer!";
- mes "Too stubborn...";
- mes "We should make customers to experience more unique, never-seen, aspects of Kafra here at Main Office.";
- next;
- mes "[Kafra Blossom]";
- mes "Now! WELCOOOOOME~~ I am Kafra Tailing Type.";
- mes "Please don't forget to continue using our Kafra Service, and ask for me, Tailing~~";
- next;
- menu "I'm an admirer of you~!",L0,"Ehhaha",L1;
-
- L0:
- mes "[Kafra Blossom]";
- mes "Really!";
- mes "Thank you sooo much~";
- mes "Here is... my... autograph...";
- next;
- mes "[Kafra Blossom]";
- mes "Don't even bother to look in your Item Iventory. It won't be there... Hehe..";
- mes "My autograph will remail win your heart.";
- cutin "kafra_02",255;
- close;
- L1:
- mes "[Kafra Blossom]";
- mes "Huh?";
- mes ". . . . .";
- mes "That's all?";
- mes "Phew~ such a dull customer...";
- cutin "kafra_02",255;
- close;
-}
-
-aldeba_in.gat,91,244,4 script Kafra Service 112,{
- cutin "kafra_06",2;
- mes "[Kafra Curly Sue]";
- mes "Hello, hello?!!";
- mes "The youngest of all! Kafra cutty~~";
- mes "I am Kafra Type 'Curly Sue'";
- next;
- mes "[Kafra Curly Sue]";
- mes "It hasn't been long meeting customers since I am new, but I am always doing my best!!";
- next;
- menu "Where is your mom?",L0,"End conversation",LEnd;
-
- L0:
- mes "[Kafra Curly Sue]";
- mes ". . . . .";
- mes "Sob sob ...";
- mes "I am no a KID!!";
- next;
- cutin "kafra_06",255;
- close;
- LEnd:
- mes "[Kafra Curly Sue]";
- mes "Here at Kafra Service, We're all doing out B-E-S-T! to provide our customers the B-E-S-T! services.";
- mes "We really appreciate your business with us.";
- next;
- cutin "kafra_06",255;
- close;
-}
-
-aldeba_in.gat,96,181,4 script Kafra Service 113,{
- cutin "kafra_05",2;
- mes "[Kafra Leilah]";
- mes "Kafra Service.";
- mes "What can I do for you?";
- next;
- menu "Save.",Lsave,"Use Storage Service",Lstorage,"Use Cart Service.",Lcart,"End conversation.",Lcancel;
-
- Lsave:
- mes "[Kafra Leilah]";
- mes "Please. This is Kafra Service Command Center in charge of training Kafra Service Agent.";
- next;
- mes "[Kafra Leilah]";
- mes "For Actual Services you must visit Kafra Service Center Agent at each city including Al De Baran.";
- mes "... But I will do that for you...";
- next;
- savepoint "aldeba_in.gat",96,179;
- cutin "kafra_05",255;
- close;
- Lstorage:
- if((class ==Job_Novice) && (JobLevel<6)) goto NeedJobLevel;
- if(Zeny<30) goto NeedZenys;
- set Zeny, Zeny-30;
- openstorage;
- cutin "kafra_02",255;
- close;
-
- NeedJobLevel:
- mes "[Kafra Leilah]";
- mes "I am sorry but you have to be at least novice with job level 6 if you want to use the storage";
- cutin "kafra_05",255;
- close;
- NeedZenys:
- mes "[Kafra Leilah]";
- mes "Dear, you don't have enough zeny. The Storage fee is 30 Zeny.";
- cutin "kafra_05",255;
- close;
- Lcart:
- if((class ==Job_Merchant) || (class==Job_Blacksmith) || (class==Job_Alchem)) goto UseCart;
- mes "[Kafra Leilah]";
- mes "I'm sorry. The cart service is only provided for Merchants, Blacksmiths and Alchemists only.";
- cutin "kafra_04",255;
- close;
-
- UseCart:
- mes "[Kafra Leilah]";
- mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
- next;
- menu "Rent a Cart.",RentCart,"Cancel.",RCCancel;
-
- RentCart:
- if(Zeny<800) goto RCNeedZenys;
- if(getskilllv(39) < 1) got Lneedskill;
- if((CheckCart)==1) goto GetCart;
-
- GetCart:
- set Zeny,Zeny-800;
- set specialreserve,specialreserve + 800;
- setcart;
- mes "[Kafra]";
- mes "There you go..";
- cutin "kafra_08",255;
- close;
- RCNeedZenys:
- mes "[Kafra Leilah]";
- mes "Dear, you don't have enough zeny. You need 800 Zeny.";
- cutin "kafra_04",255;
- close;
- Lneedskill:
- mes "[Kafra Leilah]";
- mes "Sorry dear but you need the Pushcart skill to rent a cart.";
- cutin "kafra_04",255;
- close;
- RCCancel:
- cutin "kafra_04",255;
- close;
- Lcancel:
- cutin "kafra_05",2;
- close;
-}
-
-aldeba_in.gat,142,238,4 script Kafra Service 114,{
- cutin "kafra_04",2;
- mes "[Kafra Roxie]";
- mes "Welcome! I'm Kafra Type 'Roxie'";
- mes "The Special Secret about Kapra only for you Kapra!";
- next;
- mes "[Kafra Roxie]";
- mes "You know... Our Kapra Service wasn't actually called Kapra originally~~";
- mes "Well what do you think it actually was?~";
- next;
- mes "[Kafra Roxie]";
- mes "TaDa~ Surprisingly it was~~~!";
- mes "Ka! P (Ring Ring Ring)";
- mes "Oh... my phone... Sorry please wait...";
- next;
- mes "[Kafra Roxie]";
- mes "Hi? Kapra Type Roxie";
- mes "Huh! Director, sir! Yes! Yes! I understand! ..... Sure!";
- mes "Ah... Huh?!";
- next;
- mes "[Kafra Roxie]";
- mes "No-no sir!";
- mes "Yes! I understand!!";
- next;
- mes "[Kafra Roxie]";
- mes "*Click*";
- mes "..... Hehehe...";
- mes ". . . . .";
- next;
- mes "[Kafra Roxie]";
- mes "Ah... Please ignore what you've just heard from me, haha.";
- mes ". . . . .";
- close;
+//===== eAthena Script =======================================
+//= Kafra Script
+//===== By: ==================================================
+//= Lotsa People (1.0)
+//= Darlskies (1.1)
+//= Darkchild (1.2)
+//= Syrus22 (2.0)
+//= Syrus22 (2.1)
+//= Darkchild (2.2)
+//===== Current Version: =====================================
+//= 2.2
+//===== Compatible With: =====================================
+//= Any eAthena Version In Which functions work.
+//===== Description: =========================================
+//= All The Kafra's In Ro, Incl HQ
+//===== Additional Comments: =================================
+//= Darkskies did all the kafra points stuff.
+//= Syrus22 - I compltely rewrote the script pretty much except for
+//= the normal conversation text in the Kafra HQ NPCs.
+//= Syrus22 - I fixed the Special Reserve in the Kafra HQ to really
+//= give you items. I will add the Lottery Chances when I get
+//= full info on the prizes.
+//= Syrus22 - I will add a Louyang Kafra when I get better location info.
+//= Darkchild - Added Comodo
+//============================================================
+
+//**********************************************//
+//Actual Kafra NPCs //
+//**********************************************//
+//These will set the necessary variables for my //
+//functions to work. //
+//**********************************************//
+//---Orc Dungeon Kafra---
+gef_fild10.gat,73,340,4 script Kafra#orc1 115,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"gef_fild10.gat";
+set @save1x,54;
+set @save1y,232;
+
+callfunc "kaframain";
+break;
+}
+//---Byalan Kafra---
+izlu2dun.gat,106,58,8 script Kafra 115,{
+if (class != Job_Novice) goto Lkafra;
+if((job_merchant_q==8) || (job_merchant_q==7)) goto JobMerQE8oE7;
+if((job_merchant_q==6) || (job_merchant_q==5)) goto JobMerQE6oE5;
+
+JobMerQE8oE7:
+ if(countitem(Delivery_Message) != 0) goto JobMerQE8oE7Cont;
+
+JobMerQE8oE7Cont:
+ menu "Excuse me.",M0;
+
+ M0:
+ mes "[Kafra]";
+ mes "Yes?";
+ cutin "kafra_03",255;
+ close;
+
+JobMerQE6oE5:
+ mes "[Kafra]";
+ mes "Delivery fro the Merchant Guild?? Ah, Right! Yes! I almost forgot.";
+ mes "Okay,Please put down here....";
+ if((countitem(1081)==1) || (countitem(1082)==1) || (countitem(1083)==1)) goto MerBox123E1;
+ mes ".... I think our orders are almost one Box of Oversized and Heavy....But you seem to carry it on without difficulty.";
+ close;
+
+ MerBox123E1:
+ next;
+ mes "[Kafra]";
+ mes "Let me check its Serial numbers, I have to give the receipt to you anyhow.";
+ if(nov_1_2_cos_c==7) goto JobMerQ2E7;
+ if(nov_1_2_cos_c==8) goto JobMerQ2E8;
+ next;
+ mes "[Kafra]";
+ mes "......? Excuse me! I think you gave me the wrong one.";
+ mes "Our order should have the serial numbers as either of 3318702 or 3543625...";
+ cutin "kafra_03",255;
+ close;
+
+JobMerQ2E7:
+ if(countitem(1081) !=0) goto MerBox1NE0;
+
+ MerBox1NE0:
+ mes "Um.... 3012685. Yes! This is the right one we ordered. Here, your receipt.";
+ delitem 1081,1;
+ getitem 1079,1;
+ goto JobMerQ2Cont;
+
+JobMerQ2E8:
+ if(countitem(1081) !=0) goto MerBox2NE0;
+
+ MerBox2NE0:
+ mes "Um.... 3543625. Yes! This is the right one we ordered. Here, your receipt.";
+ delitem 1082,1;
+ getitem 1080,1;
+ goto JobMerQ2Cont;
+
+JobMerQ2Cont:
+ if(job_merchant_q==6) goto JobMerQE6;
+ getitem 3005,2;
+ goto JobMerQ2Cont1;
+
+JobMerQE6:
+ getitem 3005,2;
+ goto JobMerQ2Cont1;
+
+JobMerQ2Cont1:
+ getitem 3017,1;
+ if(countitem(Delivery_Message) != 0) goto DevMsg;
+ goto DevMsgCont;
+
+DevMsg:
+ menu "This is from Mr. Mahnsoo...",M1;
+
+ M1:
+ delitem 1072,1;
+ set nov_3_merchant,11;
+ mes "[Kapra]";
+ 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 so soon like this time~";
+ goto DevMsgCont;
+
+ DevMsgCont:
+ next;
+ mes "[Kafra]";
+ mes "I really appreciate you for what you've done so far. This is my Small Gift for you to lay my heart.";
+ mes "I hope you will help me next time.";
+ set @TEMP,rand(2);
+ goto R0;
+
+ R0:
+ if(@TEMP !=0) goto R1;
+ getitem 513,3;
+ cutin "kafra_03",255;
+ close;
+ R1:
+ getitem 512,3;
+ cutin "kafra_03",255;
+ close;
+
+Lkafra:
+set @cutinpic$,"kafra_03";
+
+set @save,1;
+set @save1map$,"izlu2dun.gat";
+set @save1x,87;
+set @save1y,170;
+
+callfunc "kaframain";
+break;
+}
+//---Pyramids Kafra---
+moc_ruins.gat,61,156,5 script Kafra#pyr1 114,{
+set @cutinpic$,"kafra_04";
+
+set @save,1;
+set @save1map$,"moc_ruins.gat";
+set @save1x,41;
+set @save1y,141;
+
+callfunc "kaframain";
+break;
+}
+//---Northern Prontera Field Kafra---
+prt_fild01.gat,198,47,8 script Kafra#pfl1 112,{
+set @cutinpic$,"kafra_06";
+
+set @save,1;
+set @save1map$,"prt_fild01.gat";
+set @save1x,197;
+set @save1y,50;
+
+callfunc "kaframain";
+break;
+}
+//---Culvert Kafra---
+prt_fild05.gat,290,224,1 script Kafra#pfl2 114,{
+set @cutinpic$,"kafra_04";
+
+set @save,1;
+set @save1map$,"prt_fild05.gat";
+set @save1x,274;
+set @save1y,243;
+
+callfunc "kaframain";
+break;
+}
+//---In Alberta Kafras---
+alberta.gat,28,229,8 script Kafra#alb1 115,{
+set @cutinpic$,"kafra_02";
+
+set @save1map$,"alberta.gat";
+set @save1x,31;
+set @save1y,231;
+set @save2map$,"pay_fild03.gat";
+set @save2x,386;
+set @save2y,76;
+
+set @warps,4;
+
+set @warp1$,"Payon";
+set @warp1name$,"payon.gat";
+set @warp1x,69;
+set @warp1y,100;
+set @warp1zeny,1300;
+
+set @warp2$,"Prontera";
+set @warp2name$,"prontera.gat";
+set @warp2x,116;
+set @warp2y,75;
+set @warp2zeny,2100;
+
+set @warp3$,"Morocc";
+set @warp3name$,"morocc.gat";
+set @warp3x,156;
+set @warp3y,46;
+set @warp3zeny,2200;
+
+set @warp4$,"Comodo";
+set @warp4name$,"comodo.gat";
+set @warp4x,209;
+set @warp4y,143;
+set @warp4zeny,2400;
+
+set @kaflocations,1;
+set @location1x,113;
+set @location1y,60;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+alberta.gat,113,60,5 script Kafra#alb2 112,{
+set @cutinpic$,"kafra_06";
+
+set @save,1;
+set @save1map$,"alberta.gat";
+set @save1x,117;
+set @save1y,57;
+
+set @warps,4;
+
+set @warp1$,"Payon";
+set @warp1name$,"payon.gat";
+set @warp1x,69;
+set @warp1y,100;
+set @warp1zeny,1300;
+
+set @warp2$,"Prontera";
+set @warp2name$,"prontera.gat";
+set @warp2x,116;
+set @warp2y,75;
+set @warp2zeny,2100;
+
+set @warp3$,"Morocc";
+set @warp3name$,"morocc.gat";
+set @warp3x,156;
+set @warp3y,46;
+set @warp3zeny,2200;
+
+set @warp4$,"Comodo";
+set @warp4name$,"comodo.gat";
+set @warp4x,209;
+set @warp4y,143;
+set @warp4zeny,2400;
+
+set @kaflocations,1;
+set @location1x,28;
+set @location1y,229;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---Sunken Ship Kafra---
+alb2trea.gat,59,69,1 script Kafra#snk1 117,{
+set @cutinpic$,"kafra_03";
+
+set @save,1;
+set @save1map$,"alb2trea.gat";
+set @save1x,92;
+set @save1y,64;
+
+callfunc "kaframain";
+break;
+}
+//---In Al De Baran Kafra---
+aldebaran.gat,143,119,4 script Kafra#ald1 113,{
+set @cutinpic$,"kafra_05";
+
+set @save,1;
+set @save1map$,"aldebaran.gat";
+set @save1x,143;
+set @save1y,109;
+
+set @warps,3;
+
+set @warp1$,"Geffen";
+set @warp1name$,"geffen.gat";
+set @warp1x,120;
+set @warp1y,39;
+set @warp1zeny,1600;
+
+set @warp2$,"Mjolnir Dead Pit";
+set @warp2name$,"mjolnir_02.gat";
+set @warp2x,99;
+set @warp2y,351;
+set @warp2zeny,1700;
+
+set @warp3$,"Comodo";
+set @warp3name$,"comodo.gat";
+set @warp3x,209;
+set @warp3y,143;
+set @warp3zeny,2200;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Geffen Kafras---
+geffen.gat,120,62,8 script Kafra#gef1 115,{
+set @cutinpic$,"kafra_03";
+
+set @save,1;
+set @save1map$,"geffen.gat";
+set @save1x,119;
+set @save1y,40;
+
+set @warps,5;
+
+set @warp1$,"Prontera";
+set @warp1name$,"prontera.gat";
+set @warp1x,116;
+set @warp1y,75;
+set @warp1zeny,1400;
+
+set @warp2$,"Izlude";
+set @warp2name$,"izlude.gat";
+set @warp2x,91;
+set @warp2y,105;
+set @warp2zeny,1800;
+
+set @warp3$,"Al De Baran";
+set @warp3name$,"aldebaran.gat";
+set @warp3x,143;
+set @warp3y,110;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2200;
+
+set @warp5$,"Comodo";
+set @warp5name$,"comodo.gat";
+set @warp5x,209;
+set @warp5y,143;
+set @warp5zeny,2400;
+
+set @kaflocations,1;
+set @location1x,203;
+set @location1y,123;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+geffen.gat,203,123,3 script Kafra#gef2 114,{
+set @cutinpic$,"kafra_04";
+
+set @save1map$,"geffen.gat";
+set @save1x,200;
+set @save1y,124;
+set @save2map$,"gef_fild00.gat";
+set @save2x,51;
+set @save2y,194;
+
+set @warps,5;
+
+set @warp1$,"Prontera";
+set @warp1name$,"prontera.gat";
+set @warp1x,116;
+set @warp1y,75;
+set @warp1zeny,1400;
+
+set @warp2$,"Izlude";
+set @warp2name$,"izlude.gat";
+set @warp2x,91;
+set @warp2y,105;
+set @warp2zeny,1800;
+
+set @warp3$,"Al De Baran";
+set @warp3name$,"aldebaran.gat";
+set @warp3x,143;
+set @warp3y,110;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2200;
+
+set @warp5$,"Comodo";
+set @warp5name$,"comodo.gat";
+set @warp5x,209;
+set @warp5y,143;
+set @warp5zeny,2400;
+
+set @kaflocations,1;
+set @location1x,120;
+set @location1y,62;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Izlude Kafra---
+izlude.gat,124,115,6 script Kafra#izl1 117,{
+set @cutinpic$,"kafra_01";
+
+set @save1map$,"izlude.gat";
+set @save1x,128;
+set @save1y,111;
+set @save2map$,"prt_fild08.gat";
+set @save2x,349;
+set @save2y,202;
+
+set @warps,4;
+
+set @warp1$,"Prontera";
+set @warp1name$,"prontera.gat";
+set @warp1x,116;
+set @warp1y,75;
+set @warp1zeny,900;
+
+set @warp2$,"Payon";
+set @warp2name$,"payon.gat";
+set @warp2x,69;
+set @warp2y,100;
+set @warp2zeny,1700;
+
+set @warp3$,"Geffen";
+set @warp3name$,"geffen.gat";
+set @warp3x,120;
+set @warp3y,39;
+set @warp3zeny,1800;
+
+set @warp4$,"Comodo";
+set @warp4name$,"comodo.gat";
+set @warp4x,209;
+set @warp4y,143;
+set @warp4zeny,2000;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Morocc Kafras---
+morocc.gat,156,97,4 script Kafra#moc1 115,{
+set @cutinpic$,"kafra_03";
+
+set @save,1;
+set @save1map$,"morocc.gat";
+set @save1x,156;
+set @save1y,46;
+
+set @warps,5;
+
+set @warp1$,"Prontera";
+set @warp1name$,"prontera.gat";
+set @warp1x,116;
+set @warp1y,75;
+set @warp1zeny,1800;
+
+set @warp2$,"Payon";
+set @warp2name$,"payon.gat";
+set @warp2x,69;
+set @warp2y,100;
+set @warp2zeny,1800;
+
+set @warp3$,"Alberta";
+set @warp3name$,"alberta.gat";
+set @warp3x,117;
+set @warp3y,56;
+set @warp3zeny,2200;
+
+set @warp4$,"Geffen";
+set @warp4name$,"geffen.gat";
+set @warp4x,120;
+set @warp4y,39;
+set @warp4zeny,2200;
+
+set @warp5$,"Comodo";
+set @warp5name$,"comodo.gat";
+set @warp5x,209;
+set @warp5y,143;
+set @warp5zeny,1800;
+
+set @kaflocations,1;
+set @location1x,163;
+set @location1y,260;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+morocc.gat,163,260,4 script Kafra 114,{
+set @cutinpic$,"kafra_04";
+
+set @save1map$,"morocc.gat";
+set @save1x,187;
+set @save1y,281;
+set @save2map$,"moc_fild07.gat";
+set @save2x,212;
+set @save2y,30;
+
+set @warps,5;
+
+set @warp1$,"Prontera";
+set @warp1name$,"prontera.gat";
+set @warp1x,116;
+set @warp1y,75;
+set @warp1zeny,1800;
+
+set @warp2$,"Payon";
+set @warp2name$,"payon.gat";
+set @warp2x,69;
+set @warp2y,100;
+set @warp2zeny,1800;
+
+set @warp3$,"Alberta";
+set @warp3name$,"alberta.gat";
+set @warp3x,117;
+set @warp3y,56;
+set @warp3zeny,2200;
+
+set @warp4$,"Geffen";
+set @warp4name$,"geffen.gat";
+set @warp4x,120;
+set @warp4y,39;
+set @warp4zeny,2200;
+
+set @warp5$,"Comodo";
+set @warp5name$,"comodo.gat";
+set @warp5x,209;
+set @warp5y,143;
+set @warp5zeny,1800;
+
+set @kaflocations,1;
+set @location1x,156;
+set @location1y,97;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Payon Kafra---
+payon.gat,99,116,4 script Kafra#pay1 113,{
+set @cutinpic$,"kafra_05";
+
+set @save1map$,"payon.gat";
+set @save1x,69;
+set @save1y,100;
+set @save2map$,"pay_fild01.gat";
+set @save2x,340;
+set @save2y,347;
+
+set @warps,4;
+
+set @warp1$,"Alberta";
+set @warp1name$,"alberta.gat";
+set @warp1x,117;
+set @warp1y,56;
+set @warp1zeny,1300;
+
+set @warp2$,"Prontera";
+set @warp2name$,"prontera.gat";
+set @warp2x,116;
+set @warp2y,72;
+set @warp2zeny,1800;
+
+set @warp3$,"Morocc";
+set @warp3name$,"morocc.gat";
+set @warp3x,156;
+set @warp3y,46;
+set @warp3zeny,1800;
+
+set @warp4$,"Comodo";
+set @warp4name$,"comodo.gat";
+set @warp4x,209;
+set @warp4y,143;
+set @warp4zeny,2000;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---Archer Village Kafra---
+pay_arche.gat,55,123,8 script Kafra 117,{
+set @cutinpic$,"kafra_01";
+
+set @save,1;
+set @save1map$,"pay_arche.gat";
+set @save1x,49;
+set @save1y,144;
+
+callfunc "kaframain";
+break;
+}
+//---In Prontera Kafras---
+prontera.gat,29,207,6 script Kafra#pro2 113,{
+set @cutinpic$,"kafra_05";
+
+set @warps,6;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,1400;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,1700;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,1800;
+
+set @warp5$,"Orc Dungeon";
+set @warp5name$,"gef_fild10.gat";
+set @warp5x,52;
+set @warp5y,326;
+set @warp5zeny,1700;
+
+set @warp6$,"Comodo";
+set @warp6name$,"comodo.gat";
+set @warp6x,209;
+set @warp6y,143;
+set @warp6zeny,2000;
+
+set @save1map$,"prontera.gat";
+set @save1x,33;
+set @save1y,208;
+set @save2map$,"prt_fild05.gat";
+set @save2x,367;
+set @save2y,205;
+
+set @kaflocations,1;
+set @location1x,146;
+set @location1y,89;
+set @location2x,282;
+set @location2y,200;
+set @location3x,151;
+set @location3y,29;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+prontera.gat,146,89,6 script Kafra#pro1 115,{
+set @cutinpic$,"kafra_03";
+
+set @warps,6;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,1400;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,1700;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,1800;
+
+set @warp5$,"Orc Dungeon";
+set @warp5name$,"gef_fild10.gat";
+set @warp5x,52;
+set @warp5y,326;
+set @warp5zeny,1700;
+
+set @warp6$,"Comodo";
+set @warp6name$,"comodo.gat";
+set @warp6x,209;
+set @warp6y,143;
+set @warp6zeny,2000;
+
+set @save,1;
+set @save1map$,"prontera.gat";
+set @save1x,116;
+set @save1y,73;
+
+set @kaflocations,1;
+set @location1x,29;
+set @location1y,207;
+set @location2x,282;
+set @location2y,200;
+set @location3x,151;
+set @location3y,29;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+prontera.gat,282,199,6 script Kafra 115,{
+set @cutinpic$,"kafra_03";
+
+set @warps,6;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,1400;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,1700;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,1800;
+
+set @warp5$,"Orc Dungeon";
+set @warp5name$,"gef_fild10.gat";
+set @warp5x,52;
+set @warp5y,326;
+set @warp5zeny,1700;
+
+set @warp6$,"Comodo";
+set @warp6name$,"comodo.gat";
+set @warp6x,209;
+set @warp6y,143;
+set @warp6zeny,2000;
+
+set @save,1;
+set @save1map$,"prontera.gat";
+set @save1x,117;
+set @save1y,73;
+
+set @kaflocations,1;
+set @location1x,29;
+set @location1y,207;
+set @location2x,146;
+set @location2y,89;
+set @location3x,151;
+set @location3y,29;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+prontera.gat,151,29,8 script Kafra 115,{
+set @cutinpic$,"kafra_03";
+
+set @warps,6;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,1400;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,1700;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,1800;
+
+set @warp5$,"Orc Dungeon";
+set @warp5name$,"gef_fild10.gat";
+set @warp5x,52;
+set @warp5y,326;
+set @warp5zeny,1700;
+
+set @warp6$,"Comodo";
+set @warp6name$,"comodo.gat";
+set @warp6x,209;
+set @warp6y,143;
+set @warp6zeny,2000;
+
+set @save1map$,"prontera.gat";
+set @save1x,150;
+set @save1y,33;
+set @save2map$,"prt_fild08.gat";
+set @save2x,170;
+set @save2y,369;
+
+set @kaflocations,1;
+set @location1x,29;
+set @location1y,207;
+set @location2x,146;
+set @location2y,89;
+set @location3x,282;
+set @location3y,199;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Yuno Kafras---
+yuno.gat,328,108,6 script Kafra 117,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"yuno.gat";
+set @save1x,332;
+set @save1y,107;
+
+set @warps,4;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2100;
+
+set @kafralocations,1;
+set @location1x,151;
+set @location1y,87;
+set @location2x,278;
+set @location2y,221;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+yuno.gat,151,87,4 script Kafra 115,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"yuno.gat";
+set @save1x,154;
+set @save1y,75;
+
+set @warps,4;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2100;
+
+set @kafralocations,1;
+set @location1x,328;
+set @location1y,108;
+set @location2x,278;
+set @location2y,221;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+yuno.gat,278,221,6 script Kafra 117,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"yuno.gat";
+set @save1x,332;
+set @save1y,107;
+
+set @warps,4;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2100;
+
+set @kafralocations,1;
+set @location1x,328;
+set @location1y,108;
+set @location2x,151;
+set @location2y,87;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Umbala Kafra---
+umbala.gat,128,133,4 script Kafra 115,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"umbala.gat";
+set @save1x,126;
+set @save1y,131;
+
+set @warps,4;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2100;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---In Gonryun Kafra---
+//Note: Gave this Kafra the same warps as Umbala and Yuno till I get the
+//real warp information.
+gonryun.gat,159,122,4 script Kafra 116,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"gonryun.gat";
+set @save1x,160;
+set @save1y,62;
+
+set @warps,4;
+
+set @warp1$,"Izlude";
+set @warp1name$,"izlude.gat";
+set @warp1x,91;
+set @warp1y,105;
+set @warp1zeny,900;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @warp3$,"Payon";
+set @warp3name$,"payon.gat";
+set @warp3x,69;
+set @warp3y,100;
+set @warp3zeny,2100;
+
+set @warp4$,"Morocc";
+set @warp4name$,"morocc.gat";
+set @warp4x,156;
+set @warp4y,46;
+set @warp4zeny,2100;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//---Comodo---
+comodo.gat,166,163,3 script Kafra 721,{
+set @cutinpic$,"kafra_02";
+
+set @save,1;
+set @save1map$,"comodo.gat";
+set @save1x,188;
+set @save1y,148;
+
+set @warps,2;
+
+set @warp1$,"Morroc";
+set @warp1name$,"morocc.gat";
+set @warp1x,156;
+set @warp1y,46;
+set @warp1pay,2400;
+
+set @warp2$,"Geffen";
+set @warp2name$,"geffen.gat";
+set @warp2x,120;
+set @warp2y,39;
+set @warp2zeny,2100;
+
+set @special,1;
+
+callfunc "kaframain";
+break;
+}
+//**********************************************//
+//Kafra Main //
+//**********************************************//
+//The main kafra script. This will call the //
+//necessary functions from the rest of the //
+//script. //
+//**********************************************//
+function script kaframain -1,{
+cutin @cutinpic$,2;
+mes "[Kafra Employee]";
+mes "Welcome to Kafra Corporation. The Kafra services are always by your side.";
+mes "How may I assist you?";
+next;
+if ((@warps > 0) && (@special > 0)) goto Lallmenu;
+if ((@warps > 0) && (@special == 0)) goto Lwarpmenu;
+if (@warps == 0) goto Lnowarpmenu;
+
+Lallmenu:
+menu "Save",Lsave,"Use Storage",Lstorage,"Use Teleport Service",Lwarp,"Rent a Cart",Lcart,"Check Other Information",Lother,"Cancel",Lcancel;
+
+Lwarpmenu:
+menu "Save",Lsave,"Use Storage",Lstorage,"Use Teleport Service",Lwarp,"Rent a Cart",Lcart,"Cancel",Lcancel;
+
+Lnowarpmenu:
+menu "Save",Lsave,"Use Storage",Lstorage,"Rent a Cart",Lcart,"Cancel",Lcancel;
+
+Lsave:
+callfunc "kafrasave";
+break;
+
+Lstorage:
+callfunc "kafrastorage";
+break;
+
+Lwarp:
+callfunc "kafrawarps";
+break;
+
+Lcart:
+callfunc "kafracart";
+break;
+
+Lother:
+callfunc "kafrainfo";
+break;
+
+Lcancel:
+callfunc "kafraend";
+break;
+}
+//**********************************************//
+//Kafra Save //
+//**********************************************//
+//This will handle the save function for all the//
+//kafras. //
+//**********************************************//
+function script kafrasave -1,{
+if (@save == 1) goto Lsavein;
+mes "[Kafra]";
+mes "Where would you like to save?";
+next;
+menu "Save Outside City",Lsaveout,"Save Inside City",Lsavein;
+
+Lsavein:
+ savepoint @save1map$,@save1x,@save1y;
+ mes "[Kafra]";
+ mes "Your respawn point has been saved. Thank you.";
+ callfunc "kafraend";
+ break;
+
+Lsaveout:
+ savepoint @save2map$,@save2x,@save2y;
+ mes "[Kafra]";
+ mes "Your respawn point has been saved. Thank you.";
+ callfunc "kafraend";
+ break;
+}
+//**********************************************//
+//Kafra Storage //
+//**********************************************//
+//This will handle the storage functions for //
+//all the kafras. //
+//**********************************************//
+function script kafrastorage -1,{
+if (getskilllv(1) < 6) goto NeedJobLevel;
+if (Zeny < 30) goto NeedZenys;
+set specialreserve,specialreserve + 30;
+set Zeny, Zeny - 30;
+mes "[Kafra]";
+mes "Ok let me just open your storage for you.";
+openstorage;
+callfunc "kafraend";
+break;
+
+NeedJobLevel:
+ mes "[Kafra]";
+ mes "I'm sorry but you must have Basic Skill 6 to use storage.";
+ callfunc "kafraend";
+ break;
+
+NeedZenys:
+ mes "[Kafra]";
+ mes "I'm sorry but you are short on Zeny.";
+ callfunc "kafraend";
+ break;
+}
+//**********************************************//
+//Kafra Warps //
+//**********************************************//
+//This will handle all the actual warping and //
+//the payment of Zeny //
+//**********************************************//
+function script kafrawarps -1,{
+mes "[Kafra]";
+mes "Please choose your destination.";
+next;
+if (@warps == 7) goto L7;
+if (@warps == 6) goto L6;
+if (@warps == 5) goto L5;
+if (@warps == 4) goto L4;
+if (@warps == 3) goto L3;
+if (@warps == 2) goto L2;
+
+L2:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,"Cancel",Lcancel;
+
+L3:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,"Cancel",Lcancel;
+
+L4:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,"Cancel",Lcancel;
+
+L5:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,"Cancel",Lcancel;
+
+L6:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,@warp6$ + " -> " + @warp6zeny,Lwarp6,"Cancel",Lcancel;
+
+L7:
+ menu @warp1$ + " -> " + @warp1zeny,Lwarp1,@warp2$ + " -> " + @warp2zeny,Lwarp2,@warp3$ + " -> " + @warp3zeny,Lwarp3,@warp4$ + " -> " + @warp4zeny,Lwarp4,@warp5$ + " -> " + @warp5zeny,Lwarp5,@warp6$ + " -> " + @warp6zeny,Lwarp6,@warp7$ + " -> " + @warp7zeny,Lwarp7,"Cancel",Lcancel;
+
+Lwarp1:
+ if (Zeny < @warp1zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp1zeny;
+ set Zeny,Zeny - @warp1zeny;
+ warp @warp1name$,@warp1x,@warp1y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp2:
+ if (Zeny < @warp2zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp2zeny;
+ set Zeny,Zeny - @warp2zeny;
+ warp @warp2name$,@warp2x,@warp2y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp3:
+ if (Zeny < @warp3zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp3zeny;
+ set Zeny,Zeny - @warp3zeny;
+ warp @warp3name$,@warp3x,@warp3y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp4:
+ if (Zeny < @warp4zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp4zeny;
+ set Zeny,Zeny - @warp4zeny;
+ warp @warp4name$,@warp4x,@warp4y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp5:
+ if (Zeny < @warp5zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp5zeny;
+ set Zeny,Zeny - @warp5zeny;
+ warp @warp5name$,@warp5x,@warp5y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp6:
+ if (Zeny < @warp6zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp6zeny;
+ set Zeny,Zeny - @warp6zeny;
+ warp @warp6name$,@warp6x,@warp6y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lwarp7:
+ if (Zeny < @warp7zeny) goto Lneedzeny;
+ set specialreserve,specialreserve + @warp7zeny;
+ set Zeny,Zeny - @warp7zeny;
+ warp @warp7name$,@warp7x,@warp7y;
+ set @end,1;
+ callfunc "kafraend";
+ break;
+
+Lneedzeny:
+ mes "[Kafra]";
+ mes "I'm sorry you don't have the necessary amount of zeny.";
+ callfunc "kafraend";
+ break;
+
+Lcancel:
+ mes "[Kafra]";
+ mes "Ok, Come again soon.";
+ callfunc "kafraend";
+ break;
+}
+//**********************************************//
+//Kafra Cart //
+//**********************************************//
+//This will handle the cart rental function for //
+//all the Kafras. //
+//**********************************************//
+function script kafracart -1,{
+if ((class == Job_Merchant) || (class == Job_Blacksmith) || (class == Job_Alchem) || (class == Job_Merchant_High) || (class == Job_Whitesmith) || (class == Job_Creator)) goto Lrentcart;
+mes "[Kafra]";
+mes "Sorry this service is only provided for Merchant classes.";
+callfunc "kafraend";
+break;
+
+Lrentcart:
+ if (getskilllv(39) < 1) goto Lnopush;
+ mes "[Kafra]";
+ mes "The cart rental fee is 800 zeny. Do you want to rent a cart?";
+ next;
+ menu "Rent a Cart",Lrent,"Cancel",Lcancel;
+
+Lrent:
+ if (Zeny < 800) goto Lneedzeny;
+ set specialreserve,specialreserve + 800;
+ set Zeny,Zeny - 800;
+ setcart;
+ mes "[Kafra]";
+ mes "There ya go...";
+ callfunc "kafraend";
+ break;
+
+Lnopush:
+ mes "[Kafra]";
+ mes "Sorry but you must have at least ^ff0000Pushcart^000000 level 1.";
+ callfunc "kafraend";
+ break;
+
+Lneedzeny:
+ mes "[Kafra]";
+ mes "Sorry but you don't have the zeny.";
+ callfunc "kafraend";
+ break;
+
+Lcancel:
+ mes "[Kafra]";
+ mes "Ok. Goodbye then";
+ callfunc "kafraend";
+ break;
+}
+//**********************************************//
+//Kafra Information //
+//**********************************************//
+//This will handle the extra Kafra functions //
+//such as your kafra points and the locations of//
+//other kafras. //
+//**********************************************//
+function script kafrainfo -1,{
+if (@kaflocations == 1) goto Lfullmenu;
+menu "Check Special Reserve Points",Lreserve,"Cancel",Lcancel;
+
+Lfullmenu:
+ menu "Check Special Reserve Points",Lreserve,"Location Tip",Llocation,"Cancel",Lcancel;
+
+Lreserve:
+ mes "[Kafra]";
+ mes strcharinfo(0) + ", you have accumulated " + specialreserve + " Special Reserve Points.";
+ next;
+ mes "[Kafra]";
+ mes "You can redeem your points at our Headquarters in Al De Baran.";
+ callfunc "kafraend";
+ break;
+
+Llocation:
+ mes "[Kafra]";
+ mes "Ok I'll mark them on your map.";
+ if (@location1x == 0) goto Lfinished;
+ viewpoint 0,@location1x,@location1y,1,0x0000FF;
+ if (@location2x == 0) goto Lfinished;
+ viewpoint 1,@location2x,@location2y,1,0x0000FF;
+ if (@location3x == 0) goto Lfinished;
+ viewpoint 2,@location3x,@location3y,1,0x0000FF;
+ if (@location4x == 0) goto Lfinished;
+ viewpoint 3,@location4x,@location4y,1,0x0000FF;
+ callfunc "kafraend";
+ break;
+
+Lfinished:
+ callfunc "kafraend";
+ break;
+
+Lcancel:
+ mes "[Kafra]";
+ mes "Ok. Bye then...";
+ callfunc "kafraend";
+ break;
+}
+//**********************************************//
+//End Kafra Function //
+//**********************************************//
+//This will empty all possible variables and end//
+//the kafra scripts. //
+//**********************************************//
+function script kafraend -1,{
+set @warps,0;
+set @save,0;
+set @special,0;
+set @kaflocations,0;
+set @location1x,0;
+set @location2x,0;
+set @location3x,0;
+set @location4x,0;
+if (@end == 1) goto Lbreak;
+cutin @cutinpic$,255;
+close;
+
+Lbreak:
+ set @end,0;
+ cutin @cutinpic$,255;
+ break;
+}
+//---Kafra Warehouse---
+aldeba_in.gat,24,245,4 script Kafra Service 115,{
+ cutin "kafra_03",2;
+ mes "[Kapra Jasmine]";
+ mes "Hi~ I am Kafra No. 1 Type Jasmine.";
+ mes "Thank you for comming all the way to Kafra Main Office here at Al De Baran!";
+ next;
+ mes "[Kapra Jasmine]";
+ mes "Our Kapra Service is always together with our customers!";
+ mes "Our Kapra Service has a history and legacy of 5 thousand 8 hundred years old...";
+ mes "Blah-blah-blah.....";
+ next;
+ menu "FIVE THOUSNAD AND EIGHT HUNDRED YEARS?!",L0,"Ahh~ Shut Up!",L1,"You go a boyfriend?",L3;
+
+ L0:
+ mes "[Kapra Jasmine]";
+ mes "Shut UP! And listen! It to me a week to memorice this!";
+ mes "I've got poor memory unlike other Kafra agents!";
+ mes "..... Eh!... What did I just say...";
+ next;
+ mes "[Kapra Jasmine]";
+ mes "Hohohoho. S-sorry... I-it was a show, a standing comedy...";
+ mes "Right... Dream Show only for Ka-Kafra customers~!";
+ mes "(but a solo show)";
+ close;
+ L1:
+ mes "[Kapra Jasmine]";
+ mes ". . . . .";
+ mes "I was the member of Kafra Garrion before I joined Kafra Service Team...";
+ mes "The speciality was 'Bash'!!";
+ mes "I'm trying to be feminine and live a quiet life";
+ mes "So please don0t tempt me...";
+ close;
+ L2:
+ mes "[Kapra Jasmine]";
+ mes "My, my~. Kafra Service has a ridiculous rule that no Agent can have a boyfriend";
+ mes ". . . . .";
+ mes ". . . . . . . . . .";
+ next;
+ mes "[Kapra Jasmine]";
+ mes "Just kidding~~ Hehe";
+ close;
+}
+
+aldeba_in.gat,79,161,6 script Kafra 115,{
+ mes "[Kafra]";
+ mes "Welcome, my dearest " + strcharinfo(0) + ".";
+ mes "Take goods as many as you've got speacial reserve from Kafra Service~";
+ next;
+ mes "[Kafra]";
+ mes "Please keep in mind that each window requires a different special reserve for your information.";
+ mes "Window I am at allows you to use special reserve form ^FF00FF100p to 3000p^000000.";
+ next;
+ mes "[Kafra]";
+ mes "Your special reserve is ^FF0000" + specialreserve + "^000000~";
+ mes "Please choose the items you want.";
+ next;
+ menu "100 = Carrot 7 ea",100,"200 = Carrot 15 ea",200,"300 = Carrot 25 ea",300,"400 = Carrot 35 ea",400,"500 = Carrot 50 ea",500,"600 = Carrot 60 ea",600,"700 = Carrot 75 ea",700,"800 = Carrot 85 ea",800,"900 = Carrot 100 ea",900,"1000 = 1st Lotery Chance!",1000,"Next Articles",L0,"Cancel",LEnd;
+
+ 100:
+ if(specialreserve < 100) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,7;
+ set specialreserve,specialreserve - 100;
+ close;
+ 200:
+ if(specialreserve < 200) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,15;
+ set specialreserve,specialreserve - 200;
+ close;
+ 300:
+ if(specialreserve < 300) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,25;
+ set specialreserve,specialreserve - 300;
+ close;
+ 400:
+ if(specialreserve < 400) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,35;
+ set specialreserve,specialreserve - 400;
+ close;
+ 500:
+ if(specialreserve < 500) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,50;
+ set specialreserve,specialreserve - 500;
+ close;
+ 600:
+ if(specialreserve < 600) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,60;
+ set specialreserve,specialreserve - 600;
+ close;
+ 700:
+ if(specialreserve < 700) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,75;
+ set specialreserve,specialreserve - 700;
+ close;
+ 800:
+ if(specialreserve < 800) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,85;
+ set specialreserve,specialreserve - 800;
+ close;
+ 900:
+ if(specialreserve < 900) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 515,100;
+ set specialreserve,specialreserve - 900;
+ close;
+ 1000:
+ mes "^FF0000Under Construction^000000";
+ close;
+ L0:
+ menu "1100 = Red Potion 7 ea",1100,"1300 = Red Potion 15 ea",1300,"1500 = Red Potion 25 ea",1500,"1700 = Red Potion 35 ea",1700,"1900 = Red Potion 50 ea",1900,"2100 = Red Potion 60 ea",2100,"2300 = Red Potion 75 ea",2300,"2500 = Red Potion 85 ea",2500,"2800 = Red Potion 100 ea",2800,"3000 = 2nd Lotery Chance!",3000,"Cancel",EndL0;
+
+ 1100:
+ if(specialreserve < 1100) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,7;
+ set specialreserve,specialreserve - 1100;
+ close;
+ 1300:
+ if(specialreserve < 1300) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,15;
+ set specialreserve,specialreserve - 1300;
+ close;
+ 1500:
+ if(specialreserve < 1500) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,25;
+ set specialreserve,specialreserve - 1500;
+ close;
+ 1700:
+ if(specialreserve < 1700) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,35;
+ set specialreserve,specialreserve - 1700;
+ close;
+ 1900:
+ if(specialreserve < 1900) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,50;
+ set specialreserve,specialreserve - 1900;
+ close;
+ 2100:
+ if(specialreserve < 2100) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,60;
+ set specialreserve,specialreserve - 2100;
+ close;
+ 2300:
+ if(specialreserve < 2300) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,75;
+ set specialreserve,specialreserve - 2300;
+ close;
+ 2500:
+ if(specialreserve < 2500) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,85;
+ set specialreserve,specialreserve - 2500;
+ close;
+ 2800:
+ if(specialreserve < 2800) goto Lneedpoints;
+ mes "[Kafra]";
+ mes "Good choice... Here ya go.";
+ getitem 501,100;
+ set specialreserve,specialreserve - 2800;
+ close;
+ 3000:
+ mes "^FF0000Under Construction^000000";
+ close;
+Lend:
+ mes "[Kafra]";
+ mes "Ok then... Come again if you change your mind.";
+ close;
+}
+
+aldeba_in.gat,81,166,4 script Kafra Service 117,{
+ cutin "kafra_01",2;
+ mes "[Kafra Pavianne]";
+ mes "Welcome! I'm Kafra service's the first Kapra Type 'Pavianne'";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Our Kapra Service is always trying to meet 100% customers satisfaction based on 3 principles, Trust, Devotion and Truest.";
+ mes "With complete Service training and supervision, we serve our customers to meet thier needs.";
+ next;
+ menu "Buy Kafra Pass",L0,"What is Kafra Pass",L1,"Good Bye",L3;
+
+ L0:
+ getitem 1084,1;
+ set Zeny, Zeny-2000;
+ mes "[Kafra Pavianne]";
+ mes "Thank you for using our Kapra Service all the time!";
+ mes "Have a Nice Day!";
+ cutin "kafra_01",255;
+ close;
+ L1:
+ mes "[Kafra Pavianne]";
+ mes "The best gift you could get only at Kafra Main Office!";
+ mes "^4040FF'K A P R A's P A S S'^000000!!";
+ mes "TaDa~!";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "With Kafra Pass, you could experience the convenience of Kafra Service world-wide! No Hassle!";
+ mes "The price is 2000 zeny~~";
+ next;
+ mes "[Kafra Pavianne]";
+ mes "Visit any Kafra Service in Midgard, and you could enjoy Kafra Service any time any where for once.";
+ mes "Ending a a conversation with Kafra Service Agent will expire the pass.";
+ cutin "kafra_01",255;
+ close;
+ L3:
+ mes "[Kafra Pavianne]";
+ mes "Thank you for using Kafra Service!";
+ mes "It was Kafra Pavianne";
+ cutin "kafra_01",255;
+ close;
+}
+
+aldeba_in.gat,83,244,4 script Kafra Service 116,{
+ cutin "kafra_02",2;
+ mes "[Kafra Blossom]";
+ mes "..... Pavianne is such an old-timer!";
+ mes "Too stubborn...";
+ mes "We should make customers to experience more unique, never-seen, aspects of Kafra here at Main Office.";
+ next;
+ mes "[Kafra Blossom]";
+ mes "Now! WELCOOOOOME~~ I am Kafra Tailing Type.";
+ mes "Please don't forget to continue using our Kafra Service, and ask for me, Tailing~~";
+ next;
+ menu "I'm an admirer of you~!",L0,"Ehhaha",L1;
+
+ L0:
+ mes "[Kafra Blossom]";
+ mes "Really!";
+ mes "Thank you sooo much~";
+ mes "Here is... my... autograph...";
+ next;
+ mes "[Kafra Blossom]";
+ mes "Don't even bother to look in your Item Iventory. It won't be there... Hehe..";
+ mes "My autograph will remail win your heart.";
+ cutin "kafra_02",255;
+ close;
+ L1:
+ mes "[Kafra Blossom]";
+ mes "Huh?";
+ mes ". . . . .";
+ mes "That's all?";
+ mes "Phew~ such a dull customer...";
+ cutin "kafra_02",255;
+ close;
+}
+
+aldeba_in.gat,91,244,4 script Kafra Service 112,{
+ cutin "kafra_06",2;
+ mes "[Kafra Curly Sue]";
+ mes "Hello, hello?!!";
+ mes "The youngest of all! Kafra cutty~~";
+ mes "I am Kafra Type 'Curly Sue'";
+ next;
+ mes "[Kafra Curly Sue]";
+ mes "It hasn't been long meeting customers since I am new, but I am always doing my best!!";
+ next;
+ menu "Where is your mom?",L0,"End conversation",LEnd;
+
+ L0:
+ mes "[Kafra Curly Sue]";
+ mes ". . . . .";
+ mes "Sob sob ...";
+ mes "I am no a KID!!";
+ next;
+ cutin "kafra_06",255;
+ close;
+ LEnd:
+ mes "[Kafra Curly Sue]";
+ mes "Here at Kafra Service, We're all doing out B-E-S-T! to provide our customers the B-E-S-T! services.";
+ mes "We really appreciate your business with us.";
+ next;
+ cutin "kafra_06",255;
+ close;
+}
+
+aldeba_in.gat,96,181,4 script Kafra Service 113,{
+ cutin "kafra_05",2;
+ mes "[Kafra Leilah]";
+ mes "Kafra Service.";
+ mes "What can I do for you?";
+ next;
+ menu "Save.",Lsave,"Use Storage Service",Lstorage,"Use Cart Service.",Lcart,"End conversation.",Lcancel;
+
+ Lsave:
+ mes "[Kafra Leilah]";
+ mes "Please. This is Kafra Service Command Center in charge of training Kafra Service Agent.";
+ next;
+ mes "[Kafra Leilah]";
+ mes "For Actual Services you must visit Kafra Service Center Agent at each city including Al De Baran.";
+ mes "... But I will do that for you...";
+ next;
+ savepoint "aldeba_in.gat",96,179;
+ cutin "kafra_05",255;
+ close;
+ Lstorage:
+ if((class ==Job_Novice) && (JobLevel<6)) goto NeedJobLevel;
+ if(Zeny<30) goto NeedZenys;
+ set Zeny, Zeny-30;
+ openstorage;
+ cutin "kafra_02",255;
+ close;
+
+ NeedJobLevel:
+ mes "[Kafra Leilah]";
+ mes "I am sorry but you have to be at least novice with job level 6 if you want to use the storage";
+ cutin "kafra_05",255;
+ close;
+ NeedZenys:
+ mes "[Kafra Leilah]";
+ mes "Dear, you don't have enough zeny. The Storage fee is 30 Zeny.";
+ cutin "kafra_05",255;
+ close;
+ Lcart:
+ if((class ==Job_Merchant) || (class==Job_Blacksmith) || (class==Job_Alchem)) goto UseCart;
+ mes "[Kafra Leilah]";
+ mes "I'm sorry. The cart service is only provided for Merchants, Blacksmiths and Alchemists only.";
+ cutin "kafra_04",255;
+ close;
+
+ UseCart:
+ mes "[Kafra Leilah]";
+ mes "The Cart Fee is 800 Zeny. Do you want to Rent a Cart?";
+ next;
+ menu "Rent a Cart.",RentCart,"Cancel.",RCCancel;
+
+ RentCart:
+ if(Zeny<800) goto RCNeedZenys;
+ if(getskilllv(39) < 1) got Lneedskill;
+ if((CheckCart)==1) goto GetCart;
+
+ GetCart:
+ set Zeny,Zeny-800;
+ set specialreserve,specialreserve + 800;
+ setcart;
+ mes "[Kafra]";
+ mes "There you go..";
+ cutin "kafra_08",255;
+ close;
+ RCNeedZenys:
+ mes "[Kafra Leilah]";
+ mes "Dear, you don't have enough zeny. You need 800 Zeny.";
+ cutin "kafra_04",255;
+ close;
+ Lneedskill:
+ mes "[Kafra Leilah]";
+ mes "Sorry dear but you need the Pushcart skill to rent a cart.";
+ cutin "kafra_04",255;
+ close;
+ RCCancel:
+ cutin "kafra_04",255;
+ close;
+ Lcancel:
+ cutin "kafra_05",2;
+ close;
+}
+
+aldeba_in.gat,142,238,4 script Kafra Service 114,{
+ cutin "kafra_04",2;
+ mes "[Kafra Roxie]";
+ mes "Welcome! I'm Kafra Type 'Roxie'";
+ mes "The Special Secret about Kapra only for you Kapra!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "You know... Our Kapra Service wasn't actually called Kapra originally~~";
+ mes "Well what do you think it actually was?~";
+ next;
+ mes "[Kafra Roxie]";
+ mes "TaDa~ Surprisingly it was~~~!";
+ mes "Ka! P (Ring Ring Ring)";
+ mes "Oh... my phone... Sorry please wait...";
+ next;
+ mes "[Kafra Roxie]";
+ mes "Hi? Kapra Type Roxie";
+ mes "Huh! Director, sir! Yes! Yes! I understand! ..... Sure!";
+ mes "Ah... Huh?!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "No-no sir!";
+ mes "Yes! I understand!!";
+ next;
+ mes "[Kafra Roxie]";
+ mes "*Click*";
+ mes "..... Hehehe...";
+ mes ". . . . .";
+ next;
+ mes "[Kafra Roxie]";
+ mes "Ah... Please ignore what you've just heard from me, haha.";
+ mes ". . . . .";
+ close;
} \ No newline at end of file
diff --git a/npc/other/old/pvp.txt b/npc/other/old/pvp.txt
index 6dcbdfec3..3bdc2853c 100644
--- a/npc/other/old/pvp.txt
+++ b/npc/other/old/pvp.txt
@@ -1,1455 +1,1455 @@
-// Original Athena Japanese Dev PVP Script
-// *With added NPCs, missing Warps, and Warpers*
-// *Caution! This is an intended version/addition of the Izlude Arena!*
-//
-// Additions/Translation By DiaDz
-// Jan 24, 2004
-//
-//Addition 2v2 script by: Unknown - added
-
-
-
-// Begin PVP Room N
-pvp_y_room.gat,30,85,4 script Usher 31~40 105,{
- if ((BaseLevel < 31) || (BaseLevel > 40)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_1-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_1-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_1-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_1-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_1-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_1-1.gat") >= 128 ) goto LError;
- warp "pvp_y_1-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_1-2.gat") >= 128 ) goto LError;
- warp "pvp_y_1-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_1-3.gat") >= 128 ) goto LError;
- warp "pvp_y_1-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_1-4.gat") >= 128 ) goto LError;
- warp "pvp_y_1-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_1-5.gat") >= 128 ) goto LError;
- warp "pvp_y_1-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 31~40";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 41 ~ LV 50",0;
- break;
-}
-pvp_y_room.gat,38,85,4 script Usher 41~50 105,{
- if ((BaseLevel < 41) || (BaseLevel > 50)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_2-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_2-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_2-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_2-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_2-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_2-1.gat") >= 128 ) goto LError;
- warp "pvp_y_2-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_2-2.gat") >= 128 ) goto LError;
- warp "pvp_y_2-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_2-3.gat") >= 128 ) goto LError;
- warp "pvp_y_2-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_2-4.gat") >= 128 ) goto LError;
- warp "pvp_y_2-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_2-5.gat") >= 128 ) goto LError;
- warp "pvp_y_2-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 41~50";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 40 ~ LV 50",0;
- break;
-}
-pvp_y_room.gat,46,85,4 script Usher 51~60 105,{
- if ((BaseLevel < 51) || (BaseLevel > 60)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_3-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_3-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_3-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_3-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_3-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_3-1.gat") >= 128 ) goto LError;
- warp "pvp_y_3-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_3-2.gat") >= 128 ) goto LError;
- warp "pvp_y_3-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_3-3.gat") >= 128 ) goto LError;
- warp "pvp_y_3-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_3-4.gat") >= 128 ) goto LError;
- warp "pvp_y_3-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_3-5.gat") >= 128 ) goto LError;
- warp "pvp_y_3-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 51~60";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 51 ~ LV 60",0;
- break;
-}
-pvp_y_room.gat,54,85,4 script Usher 61~70 105,{
- if ((BaseLevel < 61) || (BaseLevel > 70)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_4-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_4-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_4-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_4-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_4-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_4-1.gat") >= 128 ) goto LError;
- warp "pvp_y_4-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_4-2.gat") >= 128 ) goto LError;
- warp "pvp_y_4-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_4-3.gat") >= 128 ) goto LError;
- warp "pvp_y_4-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_4-4.gat") >= 128 ) goto LError;
- warp "pvp_y_4-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_4-5.gat") >= 128 ) goto LError;
- warp "pvp_y_4-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 61~70";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 61 ~ LV 70",0;
- break;
-}
-pvp_y_room.gat,62,85,4 script Usher 71~80 105,{
- if ((BaseLevel < 71) || (BaseLevel > 80)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_5-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_5-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_5-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_5-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_5-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_5-1.gat") >= 128 ) goto LError;
- warp "pvp_y_5-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_5-2.gat") >= 128 ) goto LError;
- warp "pvp_y_5-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_5-3.gat") >= 128 ) goto LError;
- warp "pvp_y_5-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_5-4.gat") >= 128 ) goto LError;
- warp "pvp_y_5-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_5-5.gat") >= 128 ) goto LError;
- warp "pvp_y_5-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 71~80";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 71 ~ LV 80",0;
- break;
-}
-pvp_y_room.gat,70,85,4 script Usher 81~90 105,{
- if ((BaseLevel < 81) || (BaseLevel > 90)) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_6-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_6-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_6-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_6-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_6-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_6-1.gat") >= 128 ) goto LError;
- warp "pvp_y_6-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_6-2.gat") >= 128 ) goto LError;
- warp "pvp_y_6-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_6-3.gat") >= 128 ) goto LError;
- warp "pvp_y_6-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_6-4.gat") >= 128 ) goto LError;
- warp "pvp_y_6-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_6-5.gat") >= 128 ) goto LError;
- warp "pvp_y_6-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 81~90";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 81 ~ LV 90",0;
- break;
-}
-pvp_y_room.gat,78,85,4 script Usher 91~Higher 105,{
- if (BaseLevel < 91) goto LVNG;
- menu "Prontera Arena [" + getmapusers("pvp_y_7-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_7-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_7-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_7-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_7-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_7-1.gat") >= 128 ) goto LError;
- warp "pvp_y_7-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_7-2.gat") >= 128 ) goto LError;
- warp "pvp_y_7-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_7-3.gat") >= 128 ) goto LError;
- warp "pvp_y_7-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_7-4.gat") >= 128 ) goto LError;
- warp "pvp_y_7-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_7-5.gat") >= 128 ) goto LError;
- warp "pvp_y_7-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 91~Higher";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 91 ~ Higher",0;
- break;
-}
-pvp_y_room.gat,86,85,4 script Usher All Levels 105,{
- menu "Prontera Arena [" + getmapusers("pvp_y_8-1.gat") + " / 128]",Lpro,
- "Izlude Arena [" + getmapusers("pvp_y_8-2.gat") + " / 128]",Lizu,
- "Payon Arena [" + getmapusers("pvp_y_8-3.gat") + " / 128]",Lpay,
- "Alberta Arena [" + getmapusers("pvp_y_8-4.gat") + " / 128]",Lalb,
- "Morroc Arena [" + getmapusers("pvp_y_8-5.gat") + " / 128]",Lmoc,
- "Quit",Lcancel;
-Lpro:
- if(getmapusers("pvp_y_8-1.gat") >= 128 ) goto LError;
- warp "pvp_y_8-1",0,0;
- break;
-Lizu:
- if(getmapusers("pvp_y_8-2.gat") >= 128 ) goto LError;
- warp "pvp_y_8-2",0,0;
- break;
-Lpay:
- if(getmapusers("pvp_y_8-3.gat") >= 128 ) goto LError;
- warp "pvp_y_8-3",0,0;
- break;
-Lalb:
- if(getmapusers("pvp_y_8-4.gat") >= 128 ) goto LError;
- warp "pvp_y_8-4",0,0;
- break;
-Lmoc:
- if(getmapusers("pvp_y_8-5.gat") >= 128 ) goto LError;
- warp "pvp_y_8-5",0,0;
- break;
-Lcancel:
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "All Levels",0;
- break;
-}
-
-// Begin PVP Room N
-pvp_n_room.gat,30,85,4 script Usher 31~40 105,{
- if ((BaseLevel < 31) || (BaseLevel > 40)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_1-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_1-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_1-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_1-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_1-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_1-1.gat") >= 64 ) goto LError;
- warp "pvp_n_1-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_1-2.gat") >= 32 ) goto LError;
- warp "pvp_n_1-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_1-3.gat") >= 32 ) goto LError;
- warp "pvp_n_1-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_1-4.gat") >= 32 ) goto LError;
- warp "pvp_n_1-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_1-5.gat") >= 32 ) goto LError;
- warp "pvp_n_1-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 31~40";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 31 ~ LV 40",0;
- break;
-}
-pvp_n_room.gat,38,85,4 script Usher 41~50 105,{
- if ((BaseLevel < 41) || (BaseLevel > 50)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_2-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_2-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_2-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_2-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_2-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_2-1.gat") >= 64 ) goto LError;
- warp "pvp_n_2-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_2-2.gat") >= 32 ) goto LError;
- warp "pvp_n_2-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_2-3.gat") >= 32 ) goto LError;
- warp "pvp_n_2-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_2-4.gat") >= 32 ) goto LError;
- warp "pvp_n_2-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_2-5.gat") >= 32 ) goto LError;
- warp "pvp_n_2-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 41~50";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 41 ~ LV 50",0;
- break;
-}
-pvp_n_room.gat,46,85,4 script Usher 51~60 105,{
- if ((BaseLevel < 51) || (BaseLevel > 60)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_3-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_3-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_3-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_3-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_3-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_3-1.gat") >= 64 ) goto LError;
- warp "pvp_n_3-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_3-2.gat") >= 32 ) goto LError;
- warp "pvp_n_3-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_3-3.gat") >= 32 ) goto LError;
- warp "pvp_n_3-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_3-4.gat") >= 32 ) goto LError;
- warp "pvp_n_3-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_3-5.gat") >= 32 ) goto LError;
- warp "pvp_n_3-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 51~60";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 51 ~ LV 60",0;
- break;
-}
-pvp_n_room.gat,54,85,4 script Usher 61~70 105,{
- if ((BaseLevel < 61) || (BaseLevel > 70)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_4-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_4-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_4-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_4-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_4-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_4-1.gat") >= 64 ) goto LError;
- warp "pvp_n_4-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_4-2.gat") >= 32 ) goto LError;
- warp "pvp_n_4-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_4-3.gat") >= 32 ) goto LError;
- warp "pvp_n_4-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_4-4.gat") >= 32 ) goto LError;
- warp "pvp_n_4-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_4-5.gat") >= 32 ) goto LError;
- warp "pvp_n_4-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 61~70";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 61 ~ LV 70",0;
- break;
-}
-pvp_n_room.gat,62,85,4 script Usher 71~80 105,{
- if ((BaseLevel < 71) || (BaseLevel > 80)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_5-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_5-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_5-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_5-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_5-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_5-1.gat") >= 64 ) goto LError;
- warp "pvp_n_5-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_5-2.gat") >= 32 ) goto LError;
- warp "pvp_n_5-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_5-3.gat") >= 32 ) goto LError;
- warp "pvp_n_5-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_5-4.gat") >= 32 ) goto LError;
- warp "pvp_n_5-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_5-5.gat") >= 32 ) goto LError;
- warp "pvp_n_5-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 71~80";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 71 ~ LV 80",0;
- break;
-}
-pvp_n_room.gat,70,85,4 script Usher 81~90 105,{
- if ((BaseLevel < 81) || (BaseLevel > 90)) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_6-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_6-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_6-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_6-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_6-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_6-1.gat") >= 64 ) goto LError;
- warp "pvp_n_6-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_6-2.gat") >= 32 ) goto LError;
- warp "pvp_n_6-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_6-3.gat") >= 32 ) goto LError;
- warp "pvp_n_6-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_6-4.gat") >= 32 ) goto LError;
- warp "pvp_n_6-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_6-5.gat") >= 32 ) goto LError;
- warp "pvp_n_6-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 81~90";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 81 ~ LV 90",0;
- break;
-}
-pvp_n_room.gat,78,85,4 script Usher 91~Higher 105,{
- if (BaseLevel < 91) goto LVNG;
- menu "Sandwich Arena [" + getmapusers("pvp_n_7-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_7-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_7-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_7-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_7-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_7-1.gat") >= 64 ) goto LError;
- warp "pvp_n_7-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_7-2.gat") >= 32 ) goto LError;
- warp "pvp_n_7-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_7-3.gat") >= 32 ) goto LError;
- warp "pvp_n_7-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_7-4.gat") >= 32 ) goto LError;
- warp "pvp_n_7-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_7-5.gat") >= 32 ) goto LError;
- warp "pvp_n_7-5",0,0;
- break;
-Lcancel:
- close;
-LVNG:
- mes "[PVP Usher]";
- mes "Sorry, this arena is only for levels 91~Higher0";
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "LV 91 ~ Higher",0;
- break;
-}
-pvp_n_room.gat,86,85,4 script Usher All Levels 105,{
- menu "Sandwich Arena [" + getmapusers("pvp_n_8-1.gat") + " / 64]",Lsand,
- "Rock Arena [" + getmapusers("pvp_n_8-2.gat") + " / 32]",Llock,
- "Four Arena [" + getmapusers("pvp_n_8-3.gat") + " / 32]",Lpolu,
- "Undercross Arena [" + getmapusers("pvp_n_8-4.gat") + " / 32]",Lunder,
- "Copass Arena [" + getmapusers("pvp_n_8-5.gat") + " / 32]",Lcom,
- "Quit",Lcancel;
-Lsand:
- if(getmapusers("pvp_n_8-1.gat") >= 64 ) goto LError;
- warp "pvp_n_8-1",0,0;
- break;
-Llock:
- if(getmapusers("pvp_n_8-2.gat") >= 32 ) goto LError;
- warp "pvp_n_8-2",0,0;
- break;
-Lpolu:
- if(getmapusers("pvp_n_8-3.gat") >= 32 ) goto LError;
- warp "pvp_n_8-3",0,0;
- break;
-Lunder:
- if(getmapusers("pvp_n_8-4.gat") >= 32 ) goto LError;
- warp "pvp_n_8-4",0,0;
- break;
-Lcom:
- if(getmapusers("pvp_n_8-5.gat") >= 32 ) goto LError;
- warp "pvp_n_8-5",0,0;
- break;
-Lcancel:
- close;
-LError:
- mes "[PVP Usher]";
- mes "Sorry, this arena is currently full";
- close;
-OnInit:
- waitingroom "All Levels",0;
- break;
-}
-
-// PvP Representative NPC prontera 164 175
-prontera.gat,164,175,5 script PvP Representative 116,{
- mes "[PvP Representative]";
- mes "Hello there! I'm the PvP Representative!";
- next;
- mes "[PvP Representative]";
- mes "I'm here to advertise our Arena in Izlude! It's specially designed for you players to beat each other up!";
- next;
- menu "Sounds interesting! I'll join!",entrance,"PvP? Whats that?",info,"Nah, maybe later.",quit;
-entrance:
- mes "[PvP Representative]";
- mes "Most excellent! I'll warp you to our Arena's Front Gate!";
- next;
- warp "izlude.gat",128,218;
- close;
-info:
- mes "[PvP Representative]";
- mes "PvP Stands For 'Player versus Player', where you get to choose from a variety of arenas in which to fight in!";
- next;
- mes "[PvP Representative]";
- mes "You don't have to worry about losing items, we have a NO PENALTY rule that states you cannot loose items or EXP!";
- next;
- mes "[PvP Representative]";
- mes "So whadduya think?";
- next;
- menu "Sounds interesting! I'll join!",entrance,"Nah, maybe later.",quit;
-quit:
- mes "[PvP Representative]";
- mes "'Kay - I hope you change your mind in the near future.";
- mes " ";
- mes "Come Again! ^_^";
- close;
-}
-
-// Arena Bulletin Board NPC izlude 125 219
-izlude.gat,125,219,5 script Arena Bulletin Board 111,{
- mes "[Arena Bulletin Board]";
- mes "Welcome to the one and only...";
- mes " ";
- mes "Player Versus Player Arena!";
- close;
-}
-
-// Arena Master NPC prt_are_in 100 84
-prt_are_in.gat,100,84,4 script Arena Master 734,{
- mes "[Arena Master]";
- mes "Aaahh yes! Welcome to my humble and world renown PvP Arena!";
- next;
- mes "[Arena Master]";
- mes "Tell me...do you wish to learn more of my Arena?";
- next;
- menu "Sure",sure,"Maybe later...",later;
-sure:
- mes "[Arena Master]";
- mes "After much boredom that I've went through all my life of killing simple monsters, I decided that it wasn't enough!";
- next;
- mes "[Arena Master]";
- mes "I needed HUMAN FLESH! To satisfy my need to kill...";
- next;
- mes "[Arena Master]";
- mes "And after years of construction and planning ~ it's finally complete for all of Midgard to see and cherish!";
- next;
- mes "[Arena Master]";
- mes "I present you...";
- mes " ";
- mes "MY ARENA!!!";
- close;
-later:
- mes "[Arena Master]";
- mes "Fine fine, please do enjoy your stay.";
- close;
-}
-
-// PvP Attendant NPC prt_are_in 97 86
-prt_are_in.gat,97,86,4 script PvP Attendant 98,{
- mes "[PvP Attendant]";
- mes "Welcome To The PVP ARENA!";
- next;
- mes "[PvP Attendant]";
- mes "The Hall to the Left leads to City simulation Arenas";
- next;
- mes "[PvP Attendant]";
- mes "The Hall to the Right leads to our Special map Arenas";
- close;
-}
-
-// PvP Attendant NPC prt_are_in 102 86
-prt_are_in.gat,102,86,4 script PvP Attendant 98,{
- mes "[PvP Attendant]";
- mes "Welcome To The PVP ARENA!";
- next;
- mes "[PvP Attendant]";
- mes "The Hall to the Left leads to City simulation Arenas";
- next;
- mes "[PvP Attendant]";
- mes "The Hall to the Right are our Special map Arenas";
- close;
-}
-
-// Begin 2v2 pvp Script
-pvp_2vs2.gat,32,22,2 script Bruno 87,{
- mes "[Bruno]";
- mes "You wimpin out already?";
- menu "Yes",goback,"No",stay;
- goback:
- mes "Man!, you don't even got scratches, you wimp.";
- next;
- warp "prt_are_in.gat",167,90;
- close;
- stay:
- mes "Impressive!, I respect your stamina!";
- close;
-}
-
-prt_are_in.gat,167,92,4 script Bruno 87,{
- mes "[Bruno]";
- mes "You sure you wanna goto our underground 2vs2 arena dork?";
- menu "Yes",gopvp,"No",nopvp;
- gopvp:
- mes "Was nice knowin you chump.";
- next;
- warp "pvp_2vs2.gat",36,49;
- close;
- nopvp:
- mes "Didn't think so, wuss!";
- close;
-}
-
-prt_are_in.gat,92,86,4 script Herman 125,{
- mes "[Herman]";
- mes "Welcome to Royal Rumble!";
- mes "Ladies and Gents, my name is Herman from 'Cool Event Corp.'!";
- next;
- menu "What's Royal Rumble?",M0,"Boo~Go Home~",MEnd;
-
- M0:
- mes "[Herman]";
- mes "We, Cool Event Corp., have opened a special event open to everyone visiting the Arena.";
- mes "You can escape your monotonous life with this really great even we are providing you!";
- next;
- mes "[Herman]";
- mes "This event is called ..Rooooooyal Rumbbbbbbble!!";
- mes "*Cough*..*Cough*..*Cough* !!";
- next;
- mes "[Herman]";
- mes ". . . . .";
- mes "Arrggghhh Sooorry...";
- next;
- mes "[Herman]";
- mes "When there are enough players in every 'Stand-By Room',";
- mes "We will guide you to the beautiful Colosseum.";
- next;
- mes "[Herman]";
- mes "In that Colosseum, you have to fight with hard and hostile Monsters within 5 minutes,";
- mes "Using 8 warp zones located in 8 directions.";
- next;
- mes "[Herman]";
- mes "When you strike into the deep inside of Monsters you will see Organ NPCs which control and generate Monsters.";
- mes "You should have to speak them if you want to make an easy way to get a victory. They will release you from enemies.";
- next;
- mes "[Herman]";
- mes "Whatever you eliminate all enemies by yourself or get helped by Organ NPCs, When you kill them all,";
- mes "It is regarded as the Perfect Clear on Royal Rumble!";
- next;
- mes "[Herman]";
- mes "Have some fun in Royal Rumble with your companions.";
- mes "Once again, My name is Herman from Cool Event Corp. Thank you!";
- close;
-
- MEnd:
- mes "[Herman]";
- mes "You go Home, Baby";
- close;
-}
-
-prt_are_in.gat,93,86,4 script Lancelot 125,{
- mes "[Lancelot]";
- mes "Hi Hi! Come on ! Make yourself at Home!";
- mes "My name is Lacelot from Cool Event Corp. I am here to tell you about Time Limit Fight. Do you want to Listen?";
- next;
- menu "Yeah, Cool.",M0,"Sorry, I don't want to.",MEnd;
-
- M0:
- mes "[Lancelot]";
- mes "We, Cool Event Corp., open a Special event to give a fun to everybody visiting Arena.";
- mes "You can slip your monotonous day life for the moment during the event we provide you!";
- next;
- mes "[Lancelot]";
- mes "The Event Called ..Timeeeee-- Limmmmmitttt---Figgggghhtt !!";
- mes "*Aaahchoo* !! *Achoo* !! *Cough**Cough* ..";
- next;
- mes "[Lancelot]";
- mes ". . . . . Whack..";
- mes "Oh Boy.. Really Sorry to make you uncomfortable with this.";
- next;
- mes "[Lancelot]";
- mes "When players gather as many as we need in Each Standbyroom";
- mes "We will guide you to the Labylinth.";
- next;
- mes "[Lancelot]";
- mes "In that Labylinth,you have to terminate all monsters within 5 minutes,";
- mes "Using this Warp zone and that warp zone...";
- next;
- mes "[Lancelot]";
- mes "When you kill all Monsters in one room,another gate will be opened ..and you can go in there.";
- mes "One thing you must know is when you enter the new room door is totally closed to block your exit ..";
- next;
- mes "[Lancelot]";
- mes "You cannot go back to where you're from.";
- next;
- mes "[Lancelot]";
- mes "In case of Level 1 Stage, the door of Boss Stage will be opened when you eliminate all monsters in every room ..";
- mes "But in Level 2 and 3, even though there are many complexed corridors, if you follow the shortcut, you will enter the Boss Room at ease.";
- next;
- mes "[Lancelot]";
- mes "Get some fun with your companions.";
- mes "Thank you for your time, once again my name is Lancelot!";
- close;
- MEnd:
- mes "[Lancelot]";
- mes "Alright, Bye Bye";
- close;
-}
-
-prt_are_in.gat,94,85,4 Zakkie 84,{
- mes "[Zakkie]";
- mes "Welcome to Royal Rumble,the World of Fighters!";
- mes "My name is Zakkie from Cool Event Corp.!";
- mes "If you don't mind let me give you some tips for more fun.";
- next;
- menu "No!i don't mind.Go ahead.",M0,"Errr....I know already.",MEnd;
-
- M0:
- mes "[Zakkie]";
- mes "when get started, You will ecounter many monsters through 8 warp zones.";
- mes "You can choose either way of the Battle. You can find Organ NPCs behind each Warp Zone or You can kill all Enemies by yourself.";
- next;
- mes "[Zakkie]";
- mes "When you satisfy one of them, it is regarded as Clear on that Round.";
- mes "We suggest you to discuss with party members to find out better way of the Battle.";
- close;
- MEnd:
- mes "[Zakkie]";
- mes "Whattt!! Did you say you know the tips?!";
- mes "Wow~Excellent. Then you don't need my help. Well have fun~!";
- close;
-}
-
-prt_are_in.gat,108,86,4 script Boris 84,{
- mes "[Boris]";
- mes "Hmm.. I can easily imagine how frustrated you have been in your life, dear.. Because Common people cannot dare to visit me.";
- mes "Let me introduce myself. My name is Boris and the director of Customer Support Team in Cool Event Corp.";
- mes "I will give you the exceptional tips only for the Bloodthirsty.";
- next;
- menu "Will you please?",M0,"Thank you but I already know about it.",MEnd;
-
- M0:
- mes "[Boris]";
- mes "Before get started, you must work out a strategy considering your members.";
- mes "Then you can warp into the Battle.";
- next;
- mes "[Boris]";
- mes "If 8 men jump into the Warp zone together, You will succeed.";
- mes "Otherwise If a man or two, I don't think you can survive.";
- next;
- mes "[Boris]";
- mes "And let's talk about the Running Time of Royal Rumble and of Time Limit Fight.";
- mes "Although every Battle Time is limitted, but sometimes it is increased by a Bonus when you clear One Round.";
- next;
- mes "[Boris]";
- mes "Bonus Time will be increased by Second.. When you get a Bonus Time";
- mes "Definately you could extent the Limit of Battle. You can check the Time passage with the announcement of our employee.";
- close;
-
- MEnd:
- mes "[Boris]";
- mes ".. Ahh...I need my room in Dark ..";
- mes "Hmm Hmm Nothing, Nothing.";
- close;
-}
-
-// Add missing Warps Begins Here
-prt_are_in.gat,32,95,0 warp areawarpfix1 1,1,pvp_y_room.gat,52,23
-prt_are_in.gat,170,95,0 warp areawarpfix2 1,1,pvp_n_room.gat,52,23
-pvp_y_room.gat,52,18,0 warp areawarpfix3 1,1,prt_are_in.gat,32,92
-pvp_n_room.gat,52,18,0 warp areawarpfix4 1,1,prt_are_in.gat,170,92
-
-// PvP Mapflags
-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
-
-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
-
-pvp_y_1-1.gat mapflag pvp_noparty
-pvp_y_1-2.gat mapflag pvp_noparty
-pvp_y_1-3.gat mapflag pvp_noparty
-pvp_y_1-4.gat mapflag pvp_noparty
-pvp_y_1-5.gat mapflag pvp_noparty
-pvp_y_2-1.gat mapflag pvp_noparty
-pvp_y_2-2.gat mapflag pvp_noparty
-pvp_y_2-3.gat mapflag pvp_noparty
-pvp_y_2-4.gat mapflag pvp_noparty
-pvp_y_2-5.gat mapflag pvp_noparty
-pvp_y_3-1.gat mapflag pvp_noparty
-pvp_y_3-2.gat mapflag pvp_noparty
-pvp_y_3-3.gat mapflag pvp_noparty
-pvp_y_3-4.gat mapflag pvp_noparty
-pvp_y_3-5.gat mapflag pvp_noparty
-pvp_y_4-1.gat mapflag pvp_noparty
-pvp_y_4-2.gat mapflag pvp_noparty
-pvp_y_4-3.gat mapflag pvp_noparty
-pvp_y_4-4.gat mapflag pvp_noparty
-pvp_y_4-5.gat mapflag pvp_noparty
-pvp_y_5-1.gat mapflag pvp_noparty
-pvp_y_5-2.gat mapflag pvp_noparty
-pvp_y_5-3.gat mapflag pvp_noparty
-pvp_y_5-4.gat mapflag pvp_noparty
-pvp_y_5-5.gat mapflag pvp_noparty
-pvp_y_6-1.gat mapflag pvp_noparty
-pvp_y_6-2.gat mapflag pvp_noparty
-pvp_y_6-3.gat mapflag pvp_noparty
-pvp_y_6-4.gat mapflag pvp_noparty
-pvp_y_6-5.gat mapflag pvp_noparty
-pvp_y_7-1.gat mapflag pvp_noparty
-pvp_y_7-2.gat mapflag pvp_noparty
-pvp_y_7-3.gat mapflag pvp_noparty
-pvp_y_7-4.gat mapflag pvp_noparty
-pvp_y_7-5.gat mapflag pvp_noparty
-pvp_y_8-1.gat mapflag pvp_noparty
-pvp_y_8-2.gat mapflag pvp_noparty
-pvp_y_8-3.gat mapflag pvp_noparty
-pvp_y_8-4.gat mapflag pvp_noparty
-pvp_y_8-5.gat mapflag pvp_noparty
-pvp_n_1-1.gat mapflag pvp_noparty
-pvp_n_1-2.gat mapflag pvp_noparty
-pvp_n_1-3.gat mapflag pvp_noparty
-pvp_n_1-4.gat mapflag pvp_noparty
-pvp_n_1-5.gat mapflag pvp_noparty
-pvp_n_2-1.gat mapflag pvp_noparty
-pvp_n_2-2.gat mapflag pvp_noparty
-pvp_n_2-3.gat mapflag pvp_noparty
-pvp_n_2-4.gat mapflag pvp_noparty
-pvp_n_2-5.gat mapflag pvp_noparty
-pvp_n_3-1.gat mapflag pvp_noparty
-pvp_n_3-2.gat mapflag pvp_noparty
-pvp_n_3-3.gat mapflag pvp_noparty
-pvp_n_3-4.gat mapflag pvp_noparty
-pvp_n_3-5.gat mapflag pvp_noparty
-pvp_n_4-1.gat mapflag pvp_noparty
-pvp_n_4-2.gat mapflag pvp_noparty
-pvp_n_4-3.gat mapflag pvp_noparty
-pvp_n_4-4.gat mapflag pvp_noparty
-pvp_n_4-5.gat mapflag pvp_noparty
-pvp_n_5-1.gat mapflag pvp_noparty
-pvp_n_5-2.gat mapflag pvp_noparty
-pvp_n_5-3.gat mapflag pvp_noparty
-pvp_n_5-4.gat mapflag pvp_noparty
-pvp_n_5-5.gat mapflag pvp_noparty
-pvp_n_6-1.gat mapflag pvp_noparty
-pvp_n_6-2.gat mapflag pvp_noparty
-pvp_n_6-3.gat mapflag pvp_noparty
-pvp_n_6-4.gat mapflag pvp_noparty
-pvp_n_6-5.gat mapflag pvp_noparty
-pvp_n_7-1.gat mapflag pvp_noparty
-pvp_n_7-2.gat mapflag pvp_noparty
-pvp_n_7-3.gat mapflag pvp_noparty
-pvp_n_7-4.gat mapflag pvp_noparty
-pvp_n_7-5.gat mapflag pvp_noparty
-pvp_n_8-1.gat mapflag pvp_noparty
-pvp_n_8-2.gat mapflag pvp_noparty
-pvp_n_8-3.gat mapflag pvp_noparty
-pvp_n_8-4.gat mapflag pvp_noparty
-pvp_n_8-5.gat mapflag pvp_noparty
-
-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_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
-
-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_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
-
-pvp_y_1-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_1-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_1-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_1-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_1-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_2-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_2-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_2-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_2-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_2-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_3-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_3-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_3-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_3-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_3-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_4-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_4-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_4-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_4-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_4-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_5-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_5-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_5-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_5-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_5-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_6-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_6-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_6-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_6-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_6-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_7-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_7-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_7-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_7-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_7-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_8-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_8-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_8-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_8-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_y_8-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_1-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_1-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_1-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_1-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_1-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_2-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_2-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_2-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_2-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_2-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_3-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_3-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_3-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_3-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_3-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_4-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_4-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_4-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_4-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_4-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_5-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_5-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_5-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_5-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_5-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_6-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_6-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_6-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_6-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_6-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_7-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_7-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_7-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_7-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_7-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_8-1.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_8-2.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_8-3.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_8-4.gat mapflag nosave prt_are_in.gat,100,80
-pvp_n_8-5.gat mapflag nosave prt_are_in.gat,100,80
-pvp_2vs2.gat mapflag nosave prt_are_in.gat,100,80
+// Original Athena Japanese Dev PVP Script
+// *With added NPCs, missing Warps, and Warpers*
+// *Caution! This is an intended version/addition of the Izlude Arena!*
+//
+// Additions/Translation By DiaDz
+// Jan 24, 2004
+//
+//Addition 2v2 script by: Unknown - added
+
+
+
+// Begin PVP Room N
+pvp_y_room.gat,30,85,4 script Usher 31~40 105,{
+ if ((BaseLevel < 31) || (BaseLevel > 40)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_1-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_1-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_1-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_1-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_1-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_1-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_1-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_1-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_1-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_1-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_1-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_1-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_1-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_1-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_1-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 31~40";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 41 ~ LV 50",0;
+ break;
+}
+pvp_y_room.gat,38,85,4 script Usher 41~50 105,{
+ if ((BaseLevel < 41) || (BaseLevel > 50)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_2-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_2-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_2-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_2-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_2-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_2-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_2-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_2-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_2-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_2-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_2-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_2-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_2-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_2-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_2-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 41~50";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 40 ~ LV 50",0;
+ break;
+}
+pvp_y_room.gat,46,85,4 script Usher 51~60 105,{
+ if ((BaseLevel < 51) || (BaseLevel > 60)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_3-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_3-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_3-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_3-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_3-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_3-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_3-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_3-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_3-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_3-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_3-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_3-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_3-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_3-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_3-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 51~60";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 51 ~ LV 60",0;
+ break;
+}
+pvp_y_room.gat,54,85,4 script Usher 61~70 105,{
+ if ((BaseLevel < 61) || (BaseLevel > 70)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_4-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_4-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_4-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_4-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_4-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_4-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_4-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_4-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_4-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_4-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_4-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_4-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_4-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_4-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_4-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 61~70";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 61 ~ LV 70",0;
+ break;
+}
+pvp_y_room.gat,62,85,4 script Usher 71~80 105,{
+ if ((BaseLevel < 71) || (BaseLevel > 80)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_5-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_5-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_5-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_5-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_5-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_5-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_5-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_5-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_5-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_5-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_5-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_5-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_5-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_5-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_5-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 71~80";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 71 ~ LV 80",0;
+ break;
+}
+pvp_y_room.gat,70,85,4 script Usher 81~90 105,{
+ if ((BaseLevel < 81) || (BaseLevel > 90)) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_6-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_6-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_6-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_6-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_6-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_6-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_6-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_6-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_6-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_6-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_6-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_6-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_6-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_6-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_6-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 81~90";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 81 ~ LV 90",0;
+ break;
+}
+pvp_y_room.gat,78,85,4 script Usher 91~Higher 105,{
+ if (BaseLevel < 91) goto LVNG;
+ menu "Prontera Arena [" + getmapusers("pvp_y_7-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_7-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_7-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_7-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_7-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_7-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_7-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_7-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_7-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_7-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_7-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_7-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_7-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_7-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_7-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 91~Higher";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 91 ~ Higher",0;
+ break;
+}
+pvp_y_room.gat,86,85,4 script Usher All Levels 105,{
+ menu "Prontera Arena [" + getmapusers("pvp_y_8-1.gat") + " / 128]",Lpro,
+ "Izlude Arena [" + getmapusers("pvp_y_8-2.gat") + " / 128]",Lizu,
+ "Payon Arena [" + getmapusers("pvp_y_8-3.gat") + " / 128]",Lpay,
+ "Alberta Arena [" + getmapusers("pvp_y_8-4.gat") + " / 128]",Lalb,
+ "Morroc Arena [" + getmapusers("pvp_y_8-5.gat") + " / 128]",Lmoc,
+ "Quit",Lcancel;
+Lpro:
+ if(getmapusers("pvp_y_8-1.gat") >= 128 ) goto LError;
+ warp "pvp_y_8-1",0,0;
+ break;
+Lizu:
+ if(getmapusers("pvp_y_8-2.gat") >= 128 ) goto LError;
+ warp "pvp_y_8-2",0,0;
+ break;
+Lpay:
+ if(getmapusers("pvp_y_8-3.gat") >= 128 ) goto LError;
+ warp "pvp_y_8-3",0,0;
+ break;
+Lalb:
+ if(getmapusers("pvp_y_8-4.gat") >= 128 ) goto LError;
+ warp "pvp_y_8-4",0,0;
+ break;
+Lmoc:
+ if(getmapusers("pvp_y_8-5.gat") >= 128 ) goto LError;
+ warp "pvp_y_8-5",0,0;
+ break;
+Lcancel:
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "All Levels",0;
+ break;
+}
+
+// Begin PVP Room N
+pvp_n_room.gat,30,85,4 script Usher 31~40 105,{
+ if ((BaseLevel < 31) || (BaseLevel > 40)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_1-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_1-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_1-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_1-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_1-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_1-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_1-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_1-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_1-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_1-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_1-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_1-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_1-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_1-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_1-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 31~40";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 31 ~ LV 40",0;
+ break;
+}
+pvp_n_room.gat,38,85,4 script Usher 41~50 105,{
+ if ((BaseLevel < 41) || (BaseLevel > 50)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_2-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_2-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_2-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_2-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_2-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_2-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_2-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_2-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_2-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_2-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_2-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_2-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_2-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_2-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_2-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 41~50";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 41 ~ LV 50",0;
+ break;
+}
+pvp_n_room.gat,46,85,4 script Usher 51~60 105,{
+ if ((BaseLevel < 51) || (BaseLevel > 60)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_3-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_3-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_3-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_3-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_3-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_3-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_3-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_3-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_3-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_3-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_3-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_3-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_3-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_3-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_3-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 51~60";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 51 ~ LV 60",0;
+ break;
+}
+pvp_n_room.gat,54,85,4 script Usher 61~70 105,{
+ if ((BaseLevel < 61) || (BaseLevel > 70)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_4-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_4-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_4-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_4-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_4-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_4-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_4-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_4-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_4-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_4-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_4-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_4-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_4-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_4-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_4-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 61~70";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 61 ~ LV 70",0;
+ break;
+}
+pvp_n_room.gat,62,85,4 script Usher 71~80 105,{
+ if ((BaseLevel < 71) || (BaseLevel > 80)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_5-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_5-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_5-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_5-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_5-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_5-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_5-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_5-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_5-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_5-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_5-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_5-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_5-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_5-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_5-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 71~80";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 71 ~ LV 80",0;
+ break;
+}
+pvp_n_room.gat,70,85,4 script Usher 81~90 105,{
+ if ((BaseLevel < 81) || (BaseLevel > 90)) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_6-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_6-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_6-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_6-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_6-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_6-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_6-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_6-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_6-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_6-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_6-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_6-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_6-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_6-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_6-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 81~90";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 81 ~ LV 90",0;
+ break;
+}
+pvp_n_room.gat,78,85,4 script Usher 91~Higher 105,{
+ if (BaseLevel < 91) goto LVNG;
+ menu "Sandwich Arena [" + getmapusers("pvp_n_7-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_7-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_7-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_7-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_7-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_7-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_7-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_7-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_7-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_7-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_7-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_7-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_7-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_7-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_7-5",0,0;
+ break;
+Lcancel:
+ close;
+LVNG:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is only for levels 91~Higher0";
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "LV 91 ~ Higher",0;
+ break;
+}
+pvp_n_room.gat,86,85,4 script Usher All Levels 105,{
+ menu "Sandwich Arena [" + getmapusers("pvp_n_8-1.gat") + " / 64]",Lsand,
+ "Rock Arena [" + getmapusers("pvp_n_8-2.gat") + " / 32]",Llock,
+ "Four Arena [" + getmapusers("pvp_n_8-3.gat") + " / 32]",Lpolu,
+ "Undercross Arena [" + getmapusers("pvp_n_8-4.gat") + " / 32]",Lunder,
+ "Copass Arena [" + getmapusers("pvp_n_8-5.gat") + " / 32]",Lcom,
+ "Quit",Lcancel;
+Lsand:
+ if(getmapusers("pvp_n_8-1.gat") >= 64 ) goto LError;
+ warp "pvp_n_8-1",0,0;
+ break;
+Llock:
+ if(getmapusers("pvp_n_8-2.gat") >= 32 ) goto LError;
+ warp "pvp_n_8-2",0,0;
+ break;
+Lpolu:
+ if(getmapusers("pvp_n_8-3.gat") >= 32 ) goto LError;
+ warp "pvp_n_8-3",0,0;
+ break;
+Lunder:
+ if(getmapusers("pvp_n_8-4.gat") >= 32 ) goto LError;
+ warp "pvp_n_8-4",0,0;
+ break;
+Lcom:
+ if(getmapusers("pvp_n_8-5.gat") >= 32 ) goto LError;
+ warp "pvp_n_8-5",0,0;
+ break;
+Lcancel:
+ close;
+LError:
+ mes "[PVP Usher]";
+ mes "Sorry, this arena is currently full";
+ close;
+OnInit:
+ waitingroom "All Levels",0;
+ break;
+}
+
+// PvP Representative NPC prontera 164 175
+prontera.gat,164,175,5 script PvP Representative 116,{
+ mes "[PvP Representative]";
+ mes "Hello there! I'm the PvP Representative!";
+ next;
+ mes "[PvP Representative]";
+ mes "I'm here to advertise our Arena in Izlude! It's specially designed for you players to beat each other up!";
+ next;
+ menu "Sounds interesting! I'll join!",entrance,"PvP? Whats that?",info,"Nah, maybe later.",quit;
+entrance:
+ mes "[PvP Representative]";
+ mes "Most excellent! I'll warp you to our Arena's Front Gate!";
+ next;
+ warp "izlude.gat",128,218;
+ close;
+info:
+ mes "[PvP Representative]";
+ mes "PvP Stands For 'Player versus Player', where you get to choose from a variety of arenas in which to fight in!";
+ next;
+ mes "[PvP Representative]";
+ mes "You don't have to worry about losing items, we have a NO PENALTY rule that states you cannot loose items or EXP!";
+ next;
+ mes "[PvP Representative]";
+ mes "So whadduya think?";
+ next;
+ menu "Sounds interesting! I'll join!",entrance,"Nah, maybe later.",quit;
+quit:
+ mes "[PvP Representative]";
+ mes "'Kay - I hope you change your mind in the near future.";
+ mes " ";
+ mes "Come Again! ^_^";
+ close;
+}
+
+// Arena Bulletin Board NPC izlude 125 219
+izlude.gat,125,219,5 script Arena Bulletin Board 111,{
+ mes "[Arena Bulletin Board]";
+ mes "Welcome to the one and only...";
+ mes " ";
+ mes "Player Versus Player Arena!";
+ close;
+}
+
+// Arena Master NPC prt_are_in 100 84
+prt_are_in.gat,100,84,4 script Arena Master 734,{
+ mes "[Arena Master]";
+ mes "Aaahh yes! Welcome to my humble and world renown PvP Arena!";
+ next;
+ mes "[Arena Master]";
+ mes "Tell me...do you wish to learn more of my Arena?";
+ next;
+ menu "Sure",sure,"Maybe later...",later;
+sure:
+ mes "[Arena Master]";
+ mes "After much boredom that I've went through all my life of killing simple monsters, I decided that it wasn't enough!";
+ next;
+ mes "[Arena Master]";
+ mes "I needed HUMAN FLESH! To satisfy my need to kill...";
+ next;
+ mes "[Arena Master]";
+ mes "And after years of construction and planning ~ it's finally complete for all of Midgard to see and cherish!";
+ next;
+ mes "[Arena Master]";
+ mes "I present you...";
+ mes " ";
+ mes "MY ARENA!!!";
+ close;
+later:
+ mes "[Arena Master]";
+ mes "Fine fine, please do enjoy your stay.";
+ close;
+}
+
+// PvP Attendant NPC prt_are_in 97 86
+prt_are_in.gat,97,86,4 script PvP Attendant 98,{
+ mes "[PvP Attendant]";
+ mes "Welcome To The PVP ARENA!";
+ next;
+ mes "[PvP Attendant]";
+ mes "The Hall to the Left leads to City simulation Arenas";
+ next;
+ mes "[PvP Attendant]";
+ mes "The Hall to the Right leads to our Special map Arenas";
+ close;
+}
+
+// PvP Attendant NPC prt_are_in 102 86
+prt_are_in.gat,102,86,4 script PvP Attendant 98,{
+ mes "[PvP Attendant]";
+ mes "Welcome To The PVP ARENA!";
+ next;
+ mes "[PvP Attendant]";
+ mes "The Hall to the Left leads to City simulation Arenas";
+ next;
+ mes "[PvP Attendant]";
+ mes "The Hall to the Right are our Special map Arenas";
+ close;
+}
+
+// Begin 2v2 pvp Script
+pvp_2vs2.gat,32,22,2 script Bruno 87,{
+ mes "[Bruno]";
+ mes "You wimpin out already?";
+ menu "Yes",goback,"No",stay;
+ goback:
+ mes "Man!, you don't even got scratches, you wimp.";
+ next;
+ warp "prt_are_in.gat",167,90;
+ close;
+ stay:
+ mes "Impressive!, I respect your stamina!";
+ close;
+}
+
+prt_are_in.gat,167,92,4 script Bruno 87,{
+ mes "[Bruno]";
+ mes "You sure you wanna goto our underground 2vs2 arena dork?";
+ menu "Yes",gopvp,"No",nopvp;
+ gopvp:
+ mes "Was nice knowin you chump.";
+ next;
+ warp "pvp_2vs2.gat",36,49;
+ close;
+ nopvp:
+ mes "Didn't think so, wuss!";
+ close;
+}
+
+prt_are_in.gat,92,86,4 script Herman 125,{
+ mes "[Herman]";
+ mes "Welcome to Royal Rumble!";
+ mes "Ladies and Gents, my name is Herman from 'Cool Event Corp.'!";
+ next;
+ menu "What's Royal Rumble?",M0,"Boo~Go Home~",MEnd;
+
+ M0:
+ mes "[Herman]";
+ mes "We, Cool Event Corp., have opened a special event open to everyone visiting the Arena.";
+ mes "You can escape your monotonous life with this really great even we are providing you!";
+ next;
+ mes "[Herman]";
+ mes "This event is called ..Rooooooyal Rumbbbbbbble!!";
+ mes "*Cough*..*Cough*..*Cough* !!";
+ next;
+ mes "[Herman]";
+ mes ". . . . .";
+ mes "Arrggghhh Sooorry...";
+ next;
+ mes "[Herman]";
+ mes "When there are enough players in every 'Stand-By Room',";
+ mes "We will guide you to the beautiful Colosseum.";
+ next;
+ mes "[Herman]";
+ mes "In that Colosseum, you have to fight with hard and hostile Monsters within 5 minutes,";
+ mes "Using 8 warp zones located in 8 directions.";
+ next;
+ mes "[Herman]";
+ mes "When you strike into the deep inside of Monsters you will see Organ NPCs which control and generate Monsters.";
+ mes "You should have to speak them if you want to make an easy way to get a victory. They will release you from enemies.";
+ next;
+ mes "[Herman]";
+ mes "Whatever you eliminate all enemies by yourself or get helped by Organ NPCs, When you kill them all,";
+ mes "It is regarded as the Perfect Clear on Royal Rumble!";
+ next;
+ mes "[Herman]";
+ mes "Have some fun in Royal Rumble with your companions.";
+ mes "Once again, My name is Herman from Cool Event Corp. Thank you!";
+ close;
+
+ MEnd:
+ mes "[Herman]";
+ mes "You go Home, Baby";
+ close;
+}
+
+prt_are_in.gat,93,86,4 script Lancelot 125,{
+ mes "[Lancelot]";
+ mes "Hi Hi! Come on ! Make yourself at Home!";
+ mes "My name is Lacelot from Cool Event Corp. I am here to tell you about Time Limit Fight. Do you want to Listen?";
+ next;
+ menu "Yeah, Cool.",M0,"Sorry, I don't want to.",MEnd;
+
+ M0:
+ mes "[Lancelot]";
+ mes "We, Cool Event Corp., open a Special event to give a fun to everybody visiting Arena.";
+ mes "You can slip your monotonous day life for the moment during the event we provide you!";
+ next;
+ mes "[Lancelot]";
+ mes "The Event Called ..Timeeeee-- Limmmmmitttt---Figgggghhtt !!";
+ mes "*Aaahchoo* !! *Achoo* !! *Cough**Cough* ..";
+ next;
+ mes "[Lancelot]";
+ mes ". . . . . Whack..";
+ mes "Oh Boy.. Really Sorry to make you uncomfortable with this.";
+ next;
+ mes "[Lancelot]";
+ mes "When players gather as many as we need in Each Standbyroom";
+ mes "We will guide you to the Labylinth.";
+ next;
+ mes "[Lancelot]";
+ mes "In that Labylinth,you have to terminate all monsters within 5 minutes,";
+ mes "Using this Warp zone and that warp zone...";
+ next;
+ mes "[Lancelot]";
+ mes "When you kill all Monsters in one room,another gate will be opened ..and you can go in there.";
+ mes "One thing you must know is when you enter the new room door is totally closed to block your exit ..";
+ next;
+ mes "[Lancelot]";
+ mes "You cannot go back to where you're from.";
+ next;
+ mes "[Lancelot]";
+ mes "In case of Level 1 Stage, the door of Boss Stage will be opened when you eliminate all monsters in every room ..";
+ mes "But in Level 2 and 3, even though there are many complexed corridors, if you follow the shortcut, you will enter the Boss Room at ease.";
+ next;
+ mes "[Lancelot]";
+ mes "Get some fun with your companions.";
+ mes "Thank you for your time, once again my name is Lancelot!";
+ close;
+ MEnd:
+ mes "[Lancelot]";
+ mes "Alright, Bye Bye";
+ close;
+}
+
+prt_are_in.gat,94,85,4 Zakkie 84,{
+ mes "[Zakkie]";
+ mes "Welcome to Royal Rumble,the World of Fighters!";
+ mes "My name is Zakkie from Cool Event Corp.!";
+ mes "If you don't mind let me give you some tips for more fun.";
+ next;
+ menu "No!i don't mind.Go ahead.",M0,"Errr....I know already.",MEnd;
+
+ M0:
+ mes "[Zakkie]";
+ mes "when get started, You will ecounter many monsters through 8 warp zones.";
+ mes "You can choose either way of the Battle. You can find Organ NPCs behind each Warp Zone or You can kill all Enemies by yourself.";
+ next;
+ mes "[Zakkie]";
+ mes "When you satisfy one of them, it is regarded as Clear on that Round.";
+ mes "We suggest you to discuss with party members to find out better way of the Battle.";
+ close;
+ MEnd:
+ mes "[Zakkie]";
+ mes "Whattt!! Did you say you know the tips?!";
+ mes "Wow~Excellent. Then you don't need my help. Well have fun~!";
+ close;
+}
+
+prt_are_in.gat,108,86,4 script Boris 84,{
+ mes "[Boris]";
+ mes "Hmm.. I can easily imagine how frustrated you have been in your life, dear.. Because Common people cannot dare to visit me.";
+ mes "Let me introduce myself. My name is Boris and the director of Customer Support Team in Cool Event Corp.";
+ mes "I will give you the exceptional tips only for the Bloodthirsty.";
+ next;
+ menu "Will you please?",M0,"Thank you but I already know about it.",MEnd;
+
+ M0:
+ mes "[Boris]";
+ mes "Before get started, you must work out a strategy considering your members.";
+ mes "Then you can warp into the Battle.";
+ next;
+ mes "[Boris]";
+ mes "If 8 men jump into the Warp zone together, You will succeed.";
+ mes "Otherwise If a man or two, I don't think you can survive.";
+ next;
+ mes "[Boris]";
+ mes "And let's talk about the Running Time of Royal Rumble and of Time Limit Fight.";
+ mes "Although every Battle Time is limitted, but sometimes it is increased by a Bonus when you clear One Round.";
+ next;
+ mes "[Boris]";
+ mes "Bonus Time will be increased by Second.. When you get a Bonus Time";
+ mes "Definately you could extent the Limit of Battle. You can check the Time passage with the announcement of our employee.";
+ close;
+
+ MEnd:
+ mes "[Boris]";
+ mes ".. Ahh...I need my room in Dark ..";
+ mes "Hmm Hmm Nothing, Nothing.";
+ close;
+}
+
+// Add missing Warps Begins Here
+prt_are_in.gat,32,95,0 warp areawarpfix1 1,1,pvp_y_room.gat,52,23
+prt_are_in.gat,170,95,0 warp areawarpfix2 1,1,pvp_n_room.gat,52,23
+pvp_y_room.gat,52,18,0 warp areawarpfix3 1,1,prt_are_in.gat,32,92
+pvp_n_room.gat,52,18,0 warp areawarpfix4 1,1,prt_are_in.gat,170,92
+
+// PvP Mapflags
+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
+
+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
+
+pvp_y_1-1.gat mapflag pvp_noparty
+pvp_y_1-2.gat mapflag pvp_noparty
+pvp_y_1-3.gat mapflag pvp_noparty
+pvp_y_1-4.gat mapflag pvp_noparty
+pvp_y_1-5.gat mapflag pvp_noparty
+pvp_y_2-1.gat mapflag pvp_noparty
+pvp_y_2-2.gat mapflag pvp_noparty
+pvp_y_2-3.gat mapflag pvp_noparty
+pvp_y_2-4.gat mapflag pvp_noparty
+pvp_y_2-5.gat mapflag pvp_noparty
+pvp_y_3-1.gat mapflag pvp_noparty
+pvp_y_3-2.gat mapflag pvp_noparty
+pvp_y_3-3.gat mapflag pvp_noparty
+pvp_y_3-4.gat mapflag pvp_noparty
+pvp_y_3-5.gat mapflag pvp_noparty
+pvp_y_4-1.gat mapflag pvp_noparty
+pvp_y_4-2.gat mapflag pvp_noparty
+pvp_y_4-3.gat mapflag pvp_noparty
+pvp_y_4-4.gat mapflag pvp_noparty
+pvp_y_4-5.gat mapflag pvp_noparty
+pvp_y_5-1.gat mapflag pvp_noparty
+pvp_y_5-2.gat mapflag pvp_noparty
+pvp_y_5-3.gat mapflag pvp_noparty
+pvp_y_5-4.gat mapflag pvp_noparty
+pvp_y_5-5.gat mapflag pvp_noparty
+pvp_y_6-1.gat mapflag pvp_noparty
+pvp_y_6-2.gat mapflag pvp_noparty
+pvp_y_6-3.gat mapflag pvp_noparty
+pvp_y_6-4.gat mapflag pvp_noparty
+pvp_y_6-5.gat mapflag pvp_noparty
+pvp_y_7-1.gat mapflag pvp_noparty
+pvp_y_7-2.gat mapflag pvp_noparty
+pvp_y_7-3.gat mapflag pvp_noparty
+pvp_y_7-4.gat mapflag pvp_noparty
+pvp_y_7-5.gat mapflag pvp_noparty
+pvp_y_8-1.gat mapflag pvp_noparty
+pvp_y_8-2.gat mapflag pvp_noparty
+pvp_y_8-3.gat mapflag pvp_noparty
+pvp_y_8-4.gat mapflag pvp_noparty
+pvp_y_8-5.gat mapflag pvp_noparty
+pvp_n_1-1.gat mapflag pvp_noparty
+pvp_n_1-2.gat mapflag pvp_noparty
+pvp_n_1-3.gat mapflag pvp_noparty
+pvp_n_1-4.gat mapflag pvp_noparty
+pvp_n_1-5.gat mapflag pvp_noparty
+pvp_n_2-1.gat mapflag pvp_noparty
+pvp_n_2-2.gat mapflag pvp_noparty
+pvp_n_2-3.gat mapflag pvp_noparty
+pvp_n_2-4.gat mapflag pvp_noparty
+pvp_n_2-5.gat mapflag pvp_noparty
+pvp_n_3-1.gat mapflag pvp_noparty
+pvp_n_3-2.gat mapflag pvp_noparty
+pvp_n_3-3.gat mapflag pvp_noparty
+pvp_n_3-4.gat mapflag pvp_noparty
+pvp_n_3-5.gat mapflag pvp_noparty
+pvp_n_4-1.gat mapflag pvp_noparty
+pvp_n_4-2.gat mapflag pvp_noparty
+pvp_n_4-3.gat mapflag pvp_noparty
+pvp_n_4-4.gat mapflag pvp_noparty
+pvp_n_4-5.gat mapflag pvp_noparty
+pvp_n_5-1.gat mapflag pvp_noparty
+pvp_n_5-2.gat mapflag pvp_noparty
+pvp_n_5-3.gat mapflag pvp_noparty
+pvp_n_5-4.gat mapflag pvp_noparty
+pvp_n_5-5.gat mapflag pvp_noparty
+pvp_n_6-1.gat mapflag pvp_noparty
+pvp_n_6-2.gat mapflag pvp_noparty
+pvp_n_6-3.gat mapflag pvp_noparty
+pvp_n_6-4.gat mapflag pvp_noparty
+pvp_n_6-5.gat mapflag pvp_noparty
+pvp_n_7-1.gat mapflag pvp_noparty
+pvp_n_7-2.gat mapflag pvp_noparty
+pvp_n_7-3.gat mapflag pvp_noparty
+pvp_n_7-4.gat mapflag pvp_noparty
+pvp_n_7-5.gat mapflag pvp_noparty
+pvp_n_8-1.gat mapflag pvp_noparty
+pvp_n_8-2.gat mapflag pvp_noparty
+pvp_n_8-3.gat mapflag pvp_noparty
+pvp_n_8-4.gat mapflag pvp_noparty
+pvp_n_8-5.gat mapflag pvp_noparty
+
+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_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
+
+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_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
+
+pvp_y_1-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_1-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_1-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_1-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_1-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_2-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_2-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_2-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_2-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_2-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_3-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_3-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_3-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_3-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_3-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_4-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_4-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_4-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_4-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_4-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_5-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_5-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_5-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_5-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_5-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_6-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_6-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_6-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_6-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_6-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_7-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_7-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_7-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_7-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_7-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_8-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_8-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_8-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_8-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_y_8-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_1-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_1-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_1-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_1-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_1-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_2-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_2-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_2-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_2-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_2-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_3-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_3-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_3-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_3-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_3-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_4-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_4-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_4-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_4-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_4-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_5-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_5-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_5-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_5-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_5-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_6-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_6-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_6-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_6-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_6-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_7-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_7-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_7-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_7-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_7-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_8-1.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_8-2.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_8-3.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_8-4.gat mapflag nosave prt_are_in.gat,100,80
+pvp_n_8-5.gat mapflag nosave prt_are_in.gat,100,80
+pvp_2vs2.gat mapflag nosave prt_are_in.gat,100,80
diff --git a/npc/other/platinum_skills.txt b/npc/other/platinum_skills.txt
index cd3e06687..765982fe3 100644
--- a/npc/other/platinum_skills.txt
+++ b/npc/other/platinum_skills.txt
@@ -1,110 +1,110 @@
-//===== eAthena Script ======================================================================
-//= Platinum Skills NPC
-//===== By: =================================================================================
-//= Keichii and edited by DarkChild
-//===== Current Version: ====================================================================
-//= 2.0
-//===== Compatible With: ====================================================================
-//= Any eAthena Version
-//===== Description: ========================================================================
-//= Single NPC that assigns quests skills for all classes.
-//===== Additional Comments: ================================================================
-//= Added advanced classes by ShadowLady.
-//===========================================================================================
-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 ((Class==Job_Novice) || (Class==4001)) goto Lskillsnovice;
-if ((Class==Job_Swordman) || (Class==7) || (Class==Job_Knight2) || (Class==14)|| (Class==Job_Crusader2) || (Class==4002) || (Class==4008) || (Class==Job_Lord_Knight2) || (Class==4015) || (Class==Job_Paladin2)) goto Lskillsswordie;
-if ((Class==Job_Mage) || (Class==9) || (Class==16) || (Class==4003) || (Class==4010) || (Class==4017)) goto Lskillsmage;
-if ((Class==Job_Archer) || (Class==11) || (Class==19) || (Class==20) || (Class==4004) || (Class==4012) || (Class==4020) || (Class==4021)) goto Lskillsarcher;
-if ((Class==Job_Acolyte) || (Class==8) || (Class==15) || (Class==4005) || (Class==4009) || (Class==4016)) goto Lskillsaco;
-if ((Class==Job_Merchant) || (Class==10) || (Class==18) || (Class==4006) || (Class==4011) || (Class==4019)) goto Lskillsmerchie;
-if ((Class==Job_Thief) || (Class==12) || (Class==17) || (Class==4007) || (Class==4013) || (Class==4018)) goto Lskillsthief;
-Lskillsnovice:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Novice. I will now add the special skills available to the Novice job.";
-skill 142,1,0;
-skill 143,1,0;
-mes " ";
-mes "You now have all the special skills available to the Novice job.";
-next;
-goto LskillsEND;
-Lskillsswordie:
-mes "[Platinum Skill NPC]";
-mes "I see that you are a Swordman, Knight, Crusader, Lord Knight or Paladin. 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.0
+//===== Compatible With: ====================================================================
+//= Any eAthena Version
+//===== Description: ========================================================================
+//= Single NPC that assigns quests skills for all classes.
+//===== Additional Comments: ================================================================
+//= Added advanced classes by ShadowLady.
+//===========================================================================================
+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 ((Class==Job_Novice) || (Class==4001)) goto Lskillsnovice;
+if ((Class==Job_Swordman) || (Class==7) || (Class==Job_Knight2) || (Class==14)|| (Class==Job_Crusader2) || (Class==4002) || (Class==4008) || (Class==Job_Lord_Knight2) || (Class==4015) || (Class==Job_Paladin2)) goto Lskillsswordie;
+if ((Class==Job_Mage) || (Class==9) || (Class==16) || (Class==4003) || (Class==4010) || (Class==4017)) goto Lskillsmage;
+if ((Class==Job_Archer) || (Class==11) || (Class==19) || (Class==20) || (Class==4004) || (Class==4012) || (Class==4020) || (Class==4021)) goto Lskillsarcher;
+if ((Class==Job_Acolyte) || (Class==8) || (Class==15) || (Class==4005) || (Class==4009) || (Class==4016)) goto Lskillsaco;
+if ((Class==Job_Merchant) || (Class==10) || (Class==18) || (Class==4006) || (Class==4011) || (Class==4019)) goto Lskillsmerchie;
+if ((Class==Job_Thief) || (Class==12) || (Class==17) || (Class==4007) || (Class==4013) || (Class==4018)) goto Lskillsthief;
+Lskillsnovice:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Novice. I will now add the special skills available to the Novice job.";
+skill 142,1,0;
+skill 143,1,0;
+mes " ";
+mes "You now have all the special skills available to the Novice job.";
+next;
+goto LskillsEND;
+Lskillsswordie:
+mes "[Platinum Skill NPC]";
+mes "I see that you are a Swordman, Knight, Crusader, Lord Knight or Paladin. 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/other/pvp.txt b/npc/other/pvp.txt
index 0a9542489..b4d2fe583 100644
--- a/npc/other/pvp.txt
+++ b/npc/other/pvp.txt
@@ -1,420 +1,420 @@
-//===== 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/other/tougijou.txt b/npc/other/tougijou.txt
index 85d8324a5..af71ce270 100644
--- a/npc/other/tougijou.txt
+++ b/npc/other/tougijou.txt
@@ -1,372 +1,372 @@
-/===============================================================================
-// “¬‹ZêEVENT
-//===============================================================================
-gonryun.gat,180,117,0 script ƒ\ƒ“ ƒ€ƒh 85,{
- if (Class == 0) goto Lnovice;
- if (event_tougijou == 1) goto LStart2;
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚ ‚ `A‰´‚ðŠy‚µ‚Ü‚¹‚é“z‚ª";
- mes "—ˆ‚È‚¢‚©‚È‚ B‚ñHŒNA—Í‚ª";
- mes "‚ ‚é‚悤‚¾‚ÈB‚¿‚å‚Á‚Æ‚µ‚½‚à‚Ì‚ª";
- mes "‚ ‚é‚ñ‚¾‚ªA‚â‚Á‚Ä‚Ý‚é‚©H";
- next;
- menu "‚â‚Á‚Ä‚Ý‚é",L1,"‹»–¡‚È‚¢",L2,"–³Ž‹‚·‚é",L3;
-L1:
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚¨‚¨`A‚â‚Á‚ς艴‚Ì–Ú‚É‹¶‚¢‚Í";
- mes "‚È‚©‚Á‚½B‚±‚ê‚ðŽ‚¿ã‚°‚½‚ç";
- mes "‚¢‚¢‚±‚Æ‚ð‹³‚¦‚Ä‚â‚éB";
- mes "‚³‚ A€”õ‚µ‚ëB";
- next;
-//ƒvƒŠƒnƒ“ƒ^[730ƒAƒR690BS770(ATK‚ÅŒˆ‚Ü‚éHܶÝÈ)
- if (checkweight(7049,730)) goto Lweightok;
- mes "^0000ffƒ\ƒ“ ƒ€ƒh‚ÍA‚ ‚È‚½‚æ‚è";
- mes "‚©‚È‚è‘å‚«‚»‚¤‚È΂ðŽw‚µA";
- mes "Ž‚¿ã‚°‚Ä‚Ý‚ë‚ÆŒ¾‚Á‚½B";
- mes "‚¾‚ªAd‚·‚¬‚ÄŽ‚¿ã‚°‚ç‚ê‚È‚©‚Á‚½B^000000";
- next;
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚Ü‚¾Cs•s‘«‚¾‚ÈB";
- mes "‚à‚¤­‚µCs‚µ‚Ä‚©‚ç—ˆ‚ÈB";
- close;
-Lweightok:
- getitem 7049,730;
- set event_tougijou,1;
- mes "^0000ffƒ\ƒ“ ƒ€ƒh‚ÍA‚ ‚È‚½‚æ‚è";
- mes "‚©‚È‚è‘å‚«‚»‚¤‚È΂ðŽw‚µA";
- mes "Ž‚¿ã‚°‚Ä‚Ý‚ë‚ÆŒ¾‚Á‚½B";
- mes "‚ ‚È‚½‚ÍAŒyX‚ÆÎ‚ðŽ‚¿ã‚°‚½B^000000";
- next;
- emotion 21;
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚Í‚Í‚ÁA‚â‚Á‚ς艴‚Ì–Ú‚É";
- mes "‹¶‚¢‚Í‚È‚©‚Á‚½B¡“x—ˆ‚½Žž‚ÉA";
- mes "‚¢‚¢Š‚ð‹³‚¦‚Ä‚â‚é‚æB";
- mes "‚»‚ꂶ‚á‚ ‚ÈI";
- close;
-L2:
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚»‚¤‚©B";
- mes "‚¾‚ªA‚¿‚å‚Á‚Æ—Í‚ª‚ ‚ê‚ÎA";
- mes "–Ê”’‚¢‘ÌŒ±‚ª‚Å‚«‚é‚ñ‚¾‚ª‚ËB";
- mes "‚Í‚Í‚ÁA‹C‚ªŒü‚¢‚½‚çA";
- mes "’§í‚µ‚Ä‚Ý‚ÈB";
- close;
-L3:
- emotion 32;
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚±‚ê‚ÍAl‚ðŒ©Œë‚Á‚½‚ÈB";
- mes "‚Í‚ ‚ŸccB";
- close;
-LStart2:
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚¨`A‚Ü‚½‰ï‚Á‚½‚ÈI";
- mes "–Ê”’‚¢Š‚És‚Á‚Ä‚Ý‚½‚¢‚©H";
- next;
- menu "s‚­",-,"‚â‚ß‚é",Lno;
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚»‚¤‚±‚È‚­‚Á‚¿‚áB";
- mes "‚ ‚Í‚Í‚Í‚Í‚ÁB";
- mes "‚»‚ꂶ‚á‚ AŠy‚µ‚ñ‚Å‚±‚¢I";
- next;
- warp "gon_test.gat",53,6;
- break;
- Lno:
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "‚â‚ß‚é‚Ì‚©B‚Ü‚ A";
- mes "‚»‚ê‚à‚¢‚¢‚©‚à‚ÈB";
- mes "‚»‚ꂶ‚á‚ ‚ÈI";
- close;
-Lnovice:
- mes "[ƒ\ƒ“ ƒ€ƒh]";
- mes "ƒm[ƒrƒX‚ÍAŠX‚Ös‚¯B";
- close;
-}
-//===============================================================================
-gon_test.gat,50,14,4 script TŽºŠÇ—ŽÒ 780,{
- close;
-OnInit:
- waitingroom "“ü‚Á‚Ä‚­‚¾‚³‚¢!!",1,"TŽºŠÇ—ŽÒ::Onwarp";
- break;
-Onwarp:
- set @addmon,0;
- set @kengaku,0;
- warp "gon_test.gat",44,86;
- KillMonster "gon_test.gat","All";
- addtimer 120000,"gontimer120000";
- disablenpc "TŽºŠÇ—ŽÒ";
- break;
-}
-//===============================================================================
-gon_test.gat,46,14,4 script “¬‹ZêˆÄ“àˆõ 770,{
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "cc";
- mes "‚ cc‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
- mes "‚±‚¿‚ç‚Í“¬‹Zê‚Å‚·B";
- mes "‰½‚©‚²‚´‚¢‚Ü‚·‚©H";
- next;
- menu "“¬‹Zê‚Á‚ÄH",L1,"‚¨ì‚³‚ñA‚¨ŽžŠÔ‚Í‚ ‚è‚Ü‚·‚©H",L2,"ŠÏ——È‚És‚«‚½‚¢",L3,"‹A‚é",L4,"“Á‚É‚È‚¢",L5;
-L1:
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "“¬‹Zê‚ÍAŽš‚Ì‚²‚Æ‚­A";
- mes "ƒ‚ƒ“ƒXƒ^[‚Æ키Š‚Å‚·B";
- next;
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "ƒŒƒxƒ‹•Ê‚̃‚ƒ“ƒXƒ^[‚ð—pˆÓ‚µ‚Ä‚ ‚è";
- mes "‚Ü‚·‚Ì‚ÅA“¬‹Zê“üŽºŒãA¢Š«ŽÒ‚É";
- mes "˜b‚µ‚©‚¯A‚¨D‚«‚ȃ‚ƒ“ƒXƒ^[‚ð";
- mes "‚¨ŒÄ‚Ñ‚­‚¾‚³‚¢B";
- next;
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "‚Ü‚½A§ŒÀŽžŠÔ‚Í“üê‚©‚ç3•ª‚Å‚·B";
- mes "‚²’ˆÓ‚­‚¾‚³‚¢B";
- close;
-L2:
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "‚¦cc‚Í‚¢H";
- mes "¡AŽdŽ–’†‚Å‚·‚©‚çccB";
- mes "\‚µ–󂲂´‚¢‚Ü‚¹‚ñB";
- close;
-L3:
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "‚©‚µ‚±‚Ü‚è‚Ü‚µ‚½B";
- mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B";
- mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‚­‚¾‚³‚¢B";
- next;
- set @kengaku,1;
- warp "gon_test.gat",25,99;
- break;
-L4:
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
- mes "¥”ñAŽŸ‰ñ‚à‚²—˜—p‰º‚³‚¢B";
- next;
- warp "gonryun.gat",177,112;
- break;
-L5:
- mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
- mes "ccB";
- mes "‚³‚悤‚È‚çB";
- close;
-}
-//===============================================================================
-gon_test.gat,42,89,4 script ¢Š«ŽÒ 774,{
- if (@kengaku == 1) goto LError;
- if (@addmon == 1) goto Lalready;
- mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
- mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
- mes "‚ǂ̃‚ƒ“ƒXƒ^[‚𢊫‚µ‚Ü‚·‚©H";
- next;
- menu "ƒOƒ‹[ƒv‚P",L1,"ƒOƒ‹[ƒv‚Q",L2,"ƒOƒ‹[ƒv‚R",L3,"ƒOƒ‹[ƒv‚S",L4,"ƒOƒ‹[ƒv‚T",L5,"ƒOƒ‹[ƒv‚U",L6,"ƒOƒ‹[ƒv‚V",L7,"ƒOƒ‹[ƒv‚W",L8,"ƒOƒ‹[ƒv‚X",L9,"ƒOƒ‹[ƒv‚P‚O",L10,"ƒOƒ‹[ƒv‚P‚P",L11;
- L1:
- menu "‚ß‚Ü‚¢",L1_1,"H’†“Å",L1_2,"•nŒŒ",L1_3,"’Ž‚³‚³‚ê",L1_4,"Ø‚è",L1_5,"‹¶Œ¢•a",L1_6;
- L1_1:
- monster "gon_test.gat",58,87,"‚ß‚Ü‚¢",1419,1,"mobend";set @addmon,1;close;
- L1_2:
- monster "gon_test.gat",58,87,"Hՠҁ",1428,1,"mobend";set @addmon,1;close;
- L1_3:
- monster "gon_test.gat",58,87,"•nŒŒ",1434,1,"mobend";set @addmon,1;close;
- L1_4:
- monster "gon_test.gat",58,87,"’Ž",1430,1,"mobend";set @addmon,1;close;
- L1_5:
- monster "gon_test.gat",58,87,"Ø‚è",1457,1,"mobend";set @addmon,1;close;
- L1_6:
- monster "gon_test.gat",58,87,"‹¶Œ¢•a",1432,1,"mobend";set @addmon,1;close;
- L2:
- menu "ƒTƒ}ƒGƒ‹",L2_1,"ƒgƒƒ‹",L2_2,"ƒJƒ“ƒQƒCƒV",L2_3,"ƒuƒ‰ƒbƒNƒhƒbƒN",L2_4,"ƒƒƒE",L2_5,"ƒLƒ‡ƒEƒV",L2_6;
- L2_1:
- monster "gon_test.gat",58,87,"ƒTƒ}ƒGƒ‹",1462,1,"mobend";set @addmon,1;close;
- L2_2:
- monster "gon_test.gat",58,87,"ƒgƒƒ‹",1442,1,"mobend";set @addmon,1;close;
- L2_3:
- monster "gon_test.gat",58,87,"ƒJƒ“ƒQƒCƒV",1469,1,"mobend";set @addmon,1;close;
- L2_4:
- monster "gon_test.gat",58,87,"ƒuƒ‰ƒbƒNƒhƒbƒN",1460,1,"mobend";set @addmon,1;close;
- L2_5:
- monster "gon_test.gat",58,87,"ƒƒƒE",1425,1,"mobend";set @addmon,1;close;
- L2_6:
- monster "gon_test.gat",58,87,"ƒLƒ‡ƒEƒV",1472,1,"mobend";set @addmon,1;close;
- L3:
- menu "‘«Œ³",L3_1,"I‚Þ",L3_2,"‹ó‚Á‚Û",L3_3,"—₽‚¢",L3_4,"”M‚¢",L3_5,"•…‚é",L3_6;
- L3_1:
- monster "gon_test.gat",58,87,"‘«Œ³",1454,1,"mobend";set @addmon,1;close;
- L3_2:
- monster "gon_test.gat",58,87,"I‚Þ",1443,1,"mobend";set @addmon,1;close;
- L3_3:
- monster "gon_test.gat",58,87,"‹ó‚Á‚Û",1455,1,"mobend";set @addmon,1;close;
- L3_4:
- monster "gon_test.gat",58,87,"—₽‚¢",1426,1,"mobend";set @addmon,1;close;
- L3_5:
- monster "gon_test.gat",58,87,"”M‚¢",1436,1,"mobend";set @addmon,1;close;
- L3_6:
- monster "gon_test.gat",58,87,"•…‚é",1423,1,"mobend";set @addmon,1;close;
- L4:
- menu "ÕŽi",L4_1,"ƒ^ƒ}ƒlƒM",L4_2,"‘å•S‘«",L4_3,"‘€‚èlŒ`",L4_4,"ƒ}ƒbƒ`”„‚è‚Ì­—",L4_5,"å¢",L4_6;
- L4_1:
- monster "gon_test.gat",58,87,"ÕŽi",1458,1,"mobend";set @addmon,1;close;
- L4_2:
- monster "gon_test.gat",58,87,"ƒ^ƒ}ƒlƒM",1440,1,"mobend";set @addmon,1;close;
- L4_3:
- monster "gon_test.gat",58,87,"‘å•S‘«",1429,1,"mobend";set @addmon,1;close;
- L4_4:
- monster "gon_test.gat",58,87,"‘€‚èlŒ`",1459,1,"mobend";set @addmon,1;close;
- L4_5:
- monster "gon_test.gat",58,87,"ƒ}ƒbƒ`”„‚è‚Ì­—",1444,1,"mobend";set @addmon,1;close;
- L4_6:
- monster "gon_test.gat",58,87,"å¢",1422,1,"mobend";set @addmon,1;close;
- L5:
- menu "—‰Ð",L5_1,"‘§ë",L5_2,"CŽÖ",L5_3,"“Å—´",L5_4,"—³",L5_5,"‰u‹S",L5_6;
- L5_1:
- monster "gon_test.gat",58,87,"—‰Ð",1421,1,"mobend";set @addmon,1;close;
- L5_2:
- monster "gon_test.gat",58,87,"‘§ë",1481,1,"mobend";set @addmon,1;close;
- L5_3:
- monster "gon_test.gat",58,87,"CŽÖ",1424,1,"mobend";set @addmon,1;close;
- L5_4:
- monster "gon_test.gat",58,87,"“Å—´",1465,1,"mobend";set @addmon,1;close;
- L5_5:
- monster "gon_test.gat",58,87,"—³",1466,1,"mobend";set @addmon,1;close;
- L5_6:
- monster "gon_test.gat",58,87,"‰u‹S",1433,1,"mobend";set @addmon,1;close;
- L6:
- menu "àÑ",L6_1,"‚¨‚¢‚Ä‚¯Œ@",L6_2,"—‹_",L6_3,"‰…—ì",L6_4,"•t‘r_",L6_5,"”Ñj",L6_6;
- L6_1:
- monster "gon_test.gat",58,87,"àÑ",1427,1,"mobend";set @addmon,1;close;
- L6_2:
- monster "gon_test.gat",58,87,"‚¨‚¢‚Ä‚¯–x",1473,1,"mobend";set @addmon,1;close;
- L6_3:
- monster "gon_test.gat",58,87,"—‹_",1431,1,"mobend";set @addmon,1;close;
- L6_4:
- monster "gon_test.gat",58,87,"‰…—ì",1446,1,"mobend";set @addmon,1;close;
- L6_5:
- monster "gon_test.gat",58,87,"•t‘r_",1474,1,"mobend";set @addmon,1;close;
- L6_6:
- monster "gon_test.gat",58,87,"ӄj",1471,1,"mobend";set @addmon,1;close;
- L7:
- menu "ñ",L7_1,"•€",L7_2,"‘å’Æ",L7_3,"ŠZ",L7_4,"‹|",L7_5,"“S‹…",L7_6;
- L7_1:
- monster "gon_test.gat",58,87,"ñ",1450,1,"mobend";set @addmon,1;close;
- L7_2:
- monster "gon_test.gat",58,87,"•€",1439,1,"mobend";set @addmon,1;close;
- L7_3:
- monster "gon_test.gat",58,87,"‘å’Æ",1461,1,"mobend";set @addmon,1;close;
- L7_4:
- monster "gon_test.gat",58,87,"ŠZ",1467,1,"mobend";set @addmon,1;close;
- L7_5:
- monster "gon_test.gat",58,87,"‹|",1453,1,"mobend";set @addmon,1;close;
- L7_6:
- monster "gon_test.gat",58,87,"“S‹…",1479,1,"mobend";set @addmon,1;close;
- L8:
- menu "O",L8_1,"Ž•",L8_2,"”¯",L8_3,"Žè",L8_4,"‹Ø“÷",L8_5,"œ",L8_6;
- L8_1:
- monster "gon_test.gat",58,87,"O",1451,1,"mobend";set @addmon,1;close;
- L8_2:
- monster "gon_test.gat",58,87,"Ž•",1475,1,"mobend";set @addmon,1;close;
- L8_3:
- monster "gon_test.gat",58,87,"”¯",1437,1,"mobend";set @addmon,1;close;
- L8_4:
- monster "gon_test.gat",58,87,"Žè",1441,1,"mobend";set @addmon,1;close;
- L8_5:
- monster "gon_test.gat",58,87,"‹Ø“÷",1476,1,"mobend";set @addmon,1;close;
- L8_6:
- monster "gon_test.gat",58,87,"œ",1435,1,"mobend";set @addmon,1;close;
- L9:
- menu "‹…",L9_1,"‹¾",L9_2,"–{",L9_3,"Žè‘Ü",L9_4,"Š“",L9_5,"•ž",L9_6;
- L9_1:
- monster "gon_test.gat",58,87,"‹…",1477,1,"mobend";set @addmon,1;close;
- L9_2:
- monster "gon_test.gat",58,87,"‹¾",1448,1,"mobend";set @addmon,1;close;
- L9_3:
- monster "gon_test.gat",58,87,"–{",1478,1,"mobend";set @addmon,1;close;
- L9_4:
- monster "gon_test.gat",58,87,"Žè‘Ü",1489,1,"mobend";set @addmon,1;close;
- L9_5:
- monster "gon_test.gat",58,87,"Š“",1488,1,"mobend";set @addmon,1;close;
- L9_6:
- monster "gon_test.gat",58,87,"•ž",1438,1,"mobend";set @addmon,1;close;
- L10:
- menu "—‰¤",L10_1,"”MŒŒ’j",L10_2,"Ž€ŒYŽ·sl",L10_3,"“Ë‘R•ÏˆÙ—³",L10_4,"‡¬b",L10_5,"ˆ«–‚",L10_6;
- L10_1:
- monster "gon_test.gat",58,87,"—‰¤",1482,1,"mobend";set @addmon,1;close;
- L10_2:
- monster "gon_test.gat",58,87,"”MŒŒ’j",1464,1,"mobend";set @addmon,1;close;
- L10_3:
- monster "gon_test.gat",58,87,"Ž€ŒYŽ·sl",1487,1,"mobend";set @addmon,1;close;
- L10_4:
- monster "gon_test.gat",58,87,"“Ë‘R•ÏˆÙ—³",1449,1,"mobend";set @addmon,1;close;
- L10_5:
- monster "gon_test.gat",58,87,"‡¬b",1456,1,"mobend";set @addmon,1;close;
- L10_6:
- monster "gon_test.gat",58,87,"ˆ«–‚",1486,1,"mobend";set @addmon,1;close;
- L11:
- menu "Žël",L11_1,"ˆÃŽEŽÒ",L11_2,"Ž˜",L11_3,"•“¹‰Æ",L11_4,"Œ•Žm",L11_5;
- L11_1:
- monster "gon_test.gat",58,87,"Žël",1447,1,"mobend";set @addmon,1;close;
- L11_2:
- monster "gon_test.gat",58,87,"ˆÃŽEŽÒ",1483,1,"mobend";set @addmon,1;close;
- L11_3:
- monster "gon_test.gat",58,87,"Ž˜",1490,1,"mobend";set @addmon,1;close;
- L11_4:
- monster "gon_test.gat",58,87,"•“¹‰Æ",1484,1,"mobend";set @addmon,1;close;
- L11_5:
- monster "gon_test.gat",58,87,"Œ•Žm",1485,1,"mobend";set @addmon,1;close;
-Lalready:
- mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
- mes "Šù‚Ƀ‚ƒ“ƒXƒ^[‚𢊫‚µ‚Ü‚µ‚½B";
- mes "1‰ñ‚Ƀ‚ƒ“ƒXƒ^[‚ð1•C‚¾‚¯";
- mes "‘¼‚̃‚ƒ“ƒXƒ^[‚𢊫‚·‚é‚È‚ç‚ÎA";
- mes "Ä“üꂵ‚Ä‚­‚¾‚³‚¢B";
- close;
-LError:
- mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
- mes "³Ž®‚É\‚µž‚Ý‚ð‚µ‚Ä‚©‚ç";
- mes "‚²—ˆê‚­‚¾‚³‚¢B";
- close;
-}
-//===============================================================================
-gon_test.gat,51,90,0 script gontimer120000 -1,{
- mapannounce "gon_test.gat",": Žc‚è‚P•ª‚Å‚·B",0;
- deltimer "gontimer120000";
- addtimer 60000,"gontimer180000";
- break;
-}
-gon_test.gat,50,90,0 script gontimer180000 -1,{
-Onend:
- mapannounce "gon_test.gat",": §ŒÀŽžŠÔ‚É‚È‚è‚Ü‚µ‚½B",0;
- areawarp "gon_test.gat",42,82,73,91,"gon_test.gat",44,4;
- deltimer "gontimer180000";
- enablenpc "TŽºŠÇ—ŽÒ";
- killmonster "gon_test.gat","All";
- break;
-}
-//===============================================================================
-gon_test.gat,58,87,0 script mobend -1,{
- mapannounce "gon_test.gat","¢Š«ŽÒ : ‚¨‚ß‚Å‚Æ‚¤‚²‚´‚¢‚Ü‚·I‚Ü‚½‚Ì‚²—ˆê‚ð‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·B",0;
- addtimer 3000,"mobend::OnReturn";
- break;
-OnReturn:
- warp "gon_test.gat",44,4;
- deltimer "mobend";
- deltimer "gontimer180000";
- deltimer "gontimer120000";
- enablenpc "TŽºŠÇ—ŽÒ";
- break;
-}
-//===============================================================================
-gon_test.gat,70,103,4 script oŒûˆÄ“àˆõ 773,{
- mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
- mes "‹A‚è‚Ü‚·‚©H";
- next;
- menu "‹A‚é",-,"‹A‚ç‚È‚¢",Lno;
- mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
- mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
- mes "‚悯‚ê‚ÎA‚Ü‚½—ˆ‚Ä‚­‚¾‚³‚¢‚ËB";
- next;
- warp "gon_test.gat",44,4;
- set @kengaku,0;
- break;
- Lno:
- mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
- mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
- close;
-}
+/===============================================================================
+// “¬‹ZêEVENT
+//===============================================================================
+gonryun.gat,180,117,0 script ƒ\ƒ“ ƒ€ƒh 85,{
+ if (Class == 0) goto Lnovice;
+ if (event_tougijou == 1) goto LStart2;
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚ ‚ `A‰´‚ðŠy‚µ‚Ü‚¹‚é“z‚ª";
+ mes "—ˆ‚È‚¢‚©‚È‚ B‚ñHŒNA—Í‚ª";
+ mes "‚ ‚é‚悤‚¾‚ÈB‚¿‚å‚Á‚Æ‚µ‚½‚à‚Ì‚ª";
+ mes "‚ ‚é‚ñ‚¾‚ªA‚â‚Á‚Ä‚Ý‚é‚©H";
+ next;
+ menu "‚â‚Á‚Ä‚Ý‚é",L1,"‹»–¡‚È‚¢",L2,"–³Ž‹‚·‚é",L3;
+L1:
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚¨‚¨`A‚â‚Á‚ς艴‚Ì–Ú‚É‹¶‚¢‚Í";
+ mes "‚È‚©‚Á‚½B‚±‚ê‚ðŽ‚¿ã‚°‚½‚ç";
+ mes "‚¢‚¢‚±‚Æ‚ð‹³‚¦‚Ä‚â‚éB";
+ mes "‚³‚ A€”õ‚µ‚ëB";
+ next;
+//ƒvƒŠƒnƒ“ƒ^[730ƒAƒR690BS770(ATK‚ÅŒˆ‚Ü‚éHܶÝÈ)
+ if (checkweight(7049,730)) goto Lweightok;
+ mes "^0000ffƒ\ƒ“ ƒ€ƒh‚ÍA‚ ‚È‚½‚æ‚è";
+ mes "‚©‚È‚è‘å‚«‚»‚¤‚È΂ðŽw‚µA";
+ mes "Ž‚¿ã‚°‚Ä‚Ý‚ë‚ÆŒ¾‚Á‚½B";
+ mes "‚¾‚ªAd‚·‚¬‚ÄŽ‚¿ã‚°‚ç‚ê‚È‚©‚Á‚½B^000000";
+ next;
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚Ü‚¾Cs•s‘«‚¾‚ÈB";
+ mes "‚à‚¤­‚µCs‚µ‚Ä‚©‚ç—ˆ‚ÈB";
+ close;
+Lweightok:
+ getitem 7049,730;
+ set event_tougijou,1;
+ mes "^0000ffƒ\ƒ“ ƒ€ƒh‚ÍA‚ ‚È‚½‚æ‚è";
+ mes "‚©‚È‚è‘å‚«‚»‚¤‚È΂ðŽw‚µA";
+ mes "Ž‚¿ã‚°‚Ä‚Ý‚ë‚ÆŒ¾‚Á‚½B";
+ mes "‚ ‚È‚½‚ÍAŒyX‚ÆÎ‚ðŽ‚¿ã‚°‚½B^000000";
+ next;
+ emotion 21;
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚Í‚Í‚ÁA‚â‚Á‚ς艴‚Ì–Ú‚É";
+ mes "‹¶‚¢‚Í‚È‚©‚Á‚½B¡“x—ˆ‚½Žž‚ÉA";
+ mes "‚¢‚¢Š‚ð‹³‚¦‚Ä‚â‚é‚æB";
+ mes "‚»‚ꂶ‚á‚ ‚ÈI";
+ close;
+L2:
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚»‚¤‚©B";
+ mes "‚¾‚ªA‚¿‚å‚Á‚Æ—Í‚ª‚ ‚ê‚ÎA";
+ mes "–Ê”’‚¢‘ÌŒ±‚ª‚Å‚«‚é‚ñ‚¾‚ª‚ËB";
+ mes "‚Í‚Í‚ÁA‹C‚ªŒü‚¢‚½‚çA";
+ mes "’§í‚µ‚Ä‚Ý‚ÈB";
+ close;
+L3:
+ emotion 32;
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚±‚ê‚ÍAl‚ðŒ©Œë‚Á‚½‚ÈB";
+ mes "‚Í‚ ‚ŸccB";
+ close;
+LStart2:
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚¨`A‚Ü‚½‰ï‚Á‚½‚ÈI";
+ mes "–Ê”’‚¢Š‚És‚Á‚Ä‚Ý‚½‚¢‚©H";
+ next;
+ menu "s‚­",-,"‚â‚ß‚é",Lno;
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚»‚¤‚±‚È‚­‚Á‚¿‚áB";
+ mes "‚ ‚Í‚Í‚Í‚Í‚ÁB";
+ mes "‚»‚ꂶ‚á‚ AŠy‚µ‚ñ‚Å‚±‚¢I";
+ next;
+ warp "gon_test.gat",53,6;
+ break;
+ Lno:
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "‚â‚ß‚é‚Ì‚©B‚Ü‚ A";
+ mes "‚»‚ê‚à‚¢‚¢‚©‚à‚ÈB";
+ mes "‚»‚ꂶ‚á‚ ‚ÈI";
+ close;
+Lnovice:
+ mes "[ƒ\ƒ“ ƒ€ƒh]";
+ mes "ƒm[ƒrƒX‚ÍAŠX‚Ös‚¯B";
+ close;
+}
+//===============================================================================
+gon_test.gat,50,14,4 script TŽºŠÇ—ŽÒ 780,{
+ close;
+OnInit:
+ waitingroom "“ü‚Á‚Ä‚­‚¾‚³‚¢!!",1,"TŽºŠÇ—ŽÒ::Onwarp";
+ break;
+Onwarp:
+ set @addmon,0;
+ set @kengaku,0;
+ warp "gon_test.gat",44,86;
+ KillMonster "gon_test.gat","All";
+ addtimer 120000,"gontimer120000";
+ disablenpc "TŽºŠÇ—ŽÒ";
+ break;
+}
+//===============================================================================
+gon_test.gat,46,14,4 script “¬‹ZêˆÄ“àˆõ 770,{
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "cc";
+ mes "‚ cc‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
+ mes "‚±‚¿‚ç‚Í“¬‹Zê‚Å‚·B";
+ mes "‰½‚©‚²‚´‚¢‚Ü‚·‚©H";
+ next;
+ menu "“¬‹Zê‚Á‚ÄH",L1,"‚¨ì‚³‚ñA‚¨ŽžŠÔ‚Í‚ ‚è‚Ü‚·‚©H",L2,"ŠÏ——È‚És‚«‚½‚¢",L3,"‹A‚é",L4,"“Á‚É‚È‚¢",L5;
+L1:
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "“¬‹Zê‚ÍAŽš‚Ì‚²‚Æ‚­A";
+ mes "ƒ‚ƒ“ƒXƒ^[‚Æ키Š‚Å‚·B";
+ next;
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "ƒŒƒxƒ‹•Ê‚̃‚ƒ“ƒXƒ^[‚ð—pˆÓ‚µ‚Ä‚ ‚è";
+ mes "‚Ü‚·‚Ì‚ÅA“¬‹Zê“üŽºŒãA¢Š«ŽÒ‚É";
+ mes "˜b‚µ‚©‚¯A‚¨D‚«‚ȃ‚ƒ“ƒXƒ^[‚ð";
+ mes "‚¨ŒÄ‚Ñ‚­‚¾‚³‚¢B";
+ next;
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "‚Ü‚½A§ŒÀŽžŠÔ‚Í“üê‚©‚ç3•ª‚Å‚·B";
+ mes "‚²’ˆÓ‚­‚¾‚³‚¢B";
+ close;
+L2:
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "‚¦cc‚Í‚¢H";
+ mes "¡AŽdŽ–’†‚Å‚·‚©‚çccB";
+ mes "\‚µ–󂲂´‚¢‚Ü‚¹‚ñB";
+ close;
+L3:
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "‚©‚µ‚±‚Ü‚è‚Ü‚µ‚½B";
+ mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·B";
+ mes "Šy‚µ‚¢ŽžŠÔ‚ð‚¨‰ß‚²‚µ‚­‚¾‚³‚¢B";
+ next;
+ set @kengaku,1;
+ warp "gon_test.gat",25,99;
+ break;
+L4:
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
+ mes "¥”ñAŽŸ‰ñ‚à‚²—˜—p‰º‚³‚¢B";
+ next;
+ warp "gonryun.gat",177,112;
+ break;
+L5:
+ mes "[ƒ\ƒ“ ƒtƒBƒˆƒ“]";
+ mes "ccB";
+ mes "‚³‚悤‚È‚çB";
+ close;
+}
+//===============================================================================
+gon_test.gat,42,89,4 script ¢Š«ŽÒ 774,{
+ if (@kengaku == 1) goto LError;
+ if (@addmon == 1) goto Lalready;
+ mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
+ mes "‚¢‚ç‚Á‚µ‚á‚¢‚Ü‚¹B";
+ mes "‚ǂ̃‚ƒ“ƒXƒ^[‚𢊫‚µ‚Ü‚·‚©H";
+ next;
+ menu "ƒOƒ‹[ƒv‚P",L1,"ƒOƒ‹[ƒv‚Q",L2,"ƒOƒ‹[ƒv‚R",L3,"ƒOƒ‹[ƒv‚S",L4,"ƒOƒ‹[ƒv‚T",L5,"ƒOƒ‹[ƒv‚U",L6,"ƒOƒ‹[ƒv‚V",L7,"ƒOƒ‹[ƒv‚W",L8,"ƒOƒ‹[ƒv‚X",L9,"ƒOƒ‹[ƒv‚P‚O",L10,"ƒOƒ‹[ƒv‚P‚P",L11;
+ L1:
+ menu "‚ß‚Ü‚¢",L1_1,"H’†“Å",L1_2,"•nŒŒ",L1_3,"’Ž‚³‚³‚ê",L1_4,"Ø‚è",L1_5,"‹¶Œ¢•a",L1_6;
+ L1_1:
+ monster "gon_test.gat",58,87,"‚ß‚Ü‚¢",1419,1,"mobend";set @addmon,1;close;
+ L1_2:
+ monster "gon_test.gat",58,87,"Hՠҁ",1428,1,"mobend";set @addmon,1;close;
+ L1_3:
+ monster "gon_test.gat",58,87,"•nŒŒ",1434,1,"mobend";set @addmon,1;close;
+ L1_4:
+ monster "gon_test.gat",58,87,"’Ž",1430,1,"mobend";set @addmon,1;close;
+ L1_5:
+ monster "gon_test.gat",58,87,"Ø‚è",1457,1,"mobend";set @addmon,1;close;
+ L1_6:
+ monster "gon_test.gat",58,87,"‹¶Œ¢•a",1432,1,"mobend";set @addmon,1;close;
+ L2:
+ menu "ƒTƒ}ƒGƒ‹",L2_1,"ƒgƒƒ‹",L2_2,"ƒJƒ“ƒQƒCƒV",L2_3,"ƒuƒ‰ƒbƒNƒhƒbƒN",L2_4,"ƒƒƒE",L2_5,"ƒLƒ‡ƒEƒV",L2_6;
+ L2_1:
+ monster "gon_test.gat",58,87,"ƒTƒ}ƒGƒ‹",1462,1,"mobend";set @addmon,1;close;
+ L2_2:
+ monster "gon_test.gat",58,87,"ƒgƒƒ‹",1442,1,"mobend";set @addmon,1;close;
+ L2_3:
+ monster "gon_test.gat",58,87,"ƒJƒ“ƒQƒCƒV",1469,1,"mobend";set @addmon,1;close;
+ L2_4:
+ monster "gon_test.gat",58,87,"ƒuƒ‰ƒbƒNƒhƒbƒN",1460,1,"mobend";set @addmon,1;close;
+ L2_5:
+ monster "gon_test.gat",58,87,"ƒƒƒE",1425,1,"mobend";set @addmon,1;close;
+ L2_6:
+ monster "gon_test.gat",58,87,"ƒLƒ‡ƒEƒV",1472,1,"mobend";set @addmon,1;close;
+ L3:
+ menu "‘«Œ³",L3_1,"I‚Þ",L3_2,"‹ó‚Á‚Û",L3_3,"—₽‚¢",L3_4,"”M‚¢",L3_5,"•…‚é",L3_6;
+ L3_1:
+ monster "gon_test.gat",58,87,"‘«Œ³",1454,1,"mobend";set @addmon,1;close;
+ L3_2:
+ monster "gon_test.gat",58,87,"I‚Þ",1443,1,"mobend";set @addmon,1;close;
+ L3_3:
+ monster "gon_test.gat",58,87,"‹ó‚Á‚Û",1455,1,"mobend";set @addmon,1;close;
+ L3_4:
+ monster "gon_test.gat",58,87,"—₽‚¢",1426,1,"mobend";set @addmon,1;close;
+ L3_5:
+ monster "gon_test.gat",58,87,"”M‚¢",1436,1,"mobend";set @addmon,1;close;
+ L3_6:
+ monster "gon_test.gat",58,87,"•…‚é",1423,1,"mobend";set @addmon,1;close;
+ L4:
+ menu "ÕŽi",L4_1,"ƒ^ƒ}ƒlƒM",L4_2,"‘å•S‘«",L4_3,"‘€‚èlŒ`",L4_4,"ƒ}ƒbƒ`”„‚è‚Ì­—",L4_5,"å¢",L4_6;
+ L4_1:
+ monster "gon_test.gat",58,87,"ÕŽi",1458,1,"mobend";set @addmon,1;close;
+ L4_2:
+ monster "gon_test.gat",58,87,"ƒ^ƒ}ƒlƒM",1440,1,"mobend";set @addmon,1;close;
+ L4_3:
+ monster "gon_test.gat",58,87,"‘å•S‘«",1429,1,"mobend";set @addmon,1;close;
+ L4_4:
+ monster "gon_test.gat",58,87,"‘€‚èlŒ`",1459,1,"mobend";set @addmon,1;close;
+ L4_5:
+ monster "gon_test.gat",58,87,"ƒ}ƒbƒ`”„‚è‚Ì­—",1444,1,"mobend";set @addmon,1;close;
+ L4_6:
+ monster "gon_test.gat",58,87,"å¢",1422,1,"mobend";set @addmon,1;close;
+ L5:
+ menu "—‰Ð",L5_1,"‘§ë",L5_2,"CŽÖ",L5_3,"“Å—´",L5_4,"—³",L5_5,"‰u‹S",L5_6;
+ L5_1:
+ monster "gon_test.gat",58,87,"—‰Ð",1421,1,"mobend";set @addmon,1;close;
+ L5_2:
+ monster "gon_test.gat",58,87,"‘§ë",1481,1,"mobend";set @addmon,1;close;
+ L5_3:
+ monster "gon_test.gat",58,87,"CŽÖ",1424,1,"mobend";set @addmon,1;close;
+ L5_4:
+ monster "gon_test.gat",58,87,"“Å—´",1465,1,"mobend";set @addmon,1;close;
+ L5_5:
+ monster "gon_test.gat",58,87,"—³",1466,1,"mobend";set @addmon,1;close;
+ L5_6:
+ monster "gon_test.gat",58,87,"‰u‹S",1433,1,"mobend";set @addmon,1;close;
+ L6:
+ menu "àÑ",L6_1,"‚¨‚¢‚Ä‚¯Œ@",L6_2,"—‹_",L6_3,"‰…—ì",L6_4,"•t‘r_",L6_5,"”Ñj",L6_6;
+ L6_1:
+ monster "gon_test.gat",58,87,"àÑ",1427,1,"mobend";set @addmon,1;close;
+ L6_2:
+ monster "gon_test.gat",58,87,"‚¨‚¢‚Ä‚¯–x",1473,1,"mobend";set @addmon,1;close;
+ L6_3:
+ monster "gon_test.gat",58,87,"—‹_",1431,1,"mobend";set @addmon,1;close;
+ L6_4:
+ monster "gon_test.gat",58,87,"‰…—ì",1446,1,"mobend";set @addmon,1;close;
+ L6_5:
+ monster "gon_test.gat",58,87,"•t‘r_",1474,1,"mobend";set @addmon,1;close;
+ L6_6:
+ monster "gon_test.gat",58,87,"ӄj",1471,1,"mobend";set @addmon,1;close;
+ L7:
+ menu "ñ",L7_1,"•€",L7_2,"‘å’Æ",L7_3,"ŠZ",L7_4,"‹|",L7_5,"“S‹…",L7_6;
+ L7_1:
+ monster "gon_test.gat",58,87,"ñ",1450,1,"mobend";set @addmon,1;close;
+ L7_2:
+ monster "gon_test.gat",58,87,"•€",1439,1,"mobend";set @addmon,1;close;
+ L7_3:
+ monster "gon_test.gat",58,87,"‘å’Æ",1461,1,"mobend";set @addmon,1;close;
+ L7_4:
+ monster "gon_test.gat",58,87,"ŠZ",1467,1,"mobend";set @addmon,1;close;
+ L7_5:
+ monster "gon_test.gat",58,87,"‹|",1453,1,"mobend";set @addmon,1;close;
+ L7_6:
+ monster "gon_test.gat",58,87,"“S‹…",1479,1,"mobend";set @addmon,1;close;
+ L8:
+ menu "O",L8_1,"Ž•",L8_2,"”¯",L8_3,"Žè",L8_4,"‹Ø“÷",L8_5,"œ",L8_6;
+ L8_1:
+ monster "gon_test.gat",58,87,"O",1451,1,"mobend";set @addmon,1;close;
+ L8_2:
+ monster "gon_test.gat",58,87,"Ž•",1475,1,"mobend";set @addmon,1;close;
+ L8_3:
+ monster "gon_test.gat",58,87,"”¯",1437,1,"mobend";set @addmon,1;close;
+ L8_4:
+ monster "gon_test.gat",58,87,"Žè",1441,1,"mobend";set @addmon,1;close;
+ L8_5:
+ monster "gon_test.gat",58,87,"‹Ø“÷",1476,1,"mobend";set @addmon,1;close;
+ L8_6:
+ monster "gon_test.gat",58,87,"œ",1435,1,"mobend";set @addmon,1;close;
+ L9:
+ menu "‹…",L9_1,"‹¾",L9_2,"–{",L9_3,"Žè‘Ü",L9_4,"Š“",L9_5,"•ž",L9_6;
+ L9_1:
+ monster "gon_test.gat",58,87,"‹…",1477,1,"mobend";set @addmon,1;close;
+ L9_2:
+ monster "gon_test.gat",58,87,"‹¾",1448,1,"mobend";set @addmon,1;close;
+ L9_3:
+ monster "gon_test.gat",58,87,"–{",1478,1,"mobend";set @addmon,1;close;
+ L9_4:
+ monster "gon_test.gat",58,87,"Žè‘Ü",1489,1,"mobend";set @addmon,1;close;
+ L9_5:
+ monster "gon_test.gat",58,87,"Š“",1488,1,"mobend";set @addmon,1;close;
+ L9_6:
+ monster "gon_test.gat",58,87,"•ž",1438,1,"mobend";set @addmon,1;close;
+ L10:
+ menu "—‰¤",L10_1,"”MŒŒ’j",L10_2,"Ž€ŒYŽ·sl",L10_3,"“Ë‘R•ÏˆÙ—³",L10_4,"‡¬b",L10_5,"ˆ«–‚",L10_6;
+ L10_1:
+ monster "gon_test.gat",58,87,"—‰¤",1482,1,"mobend";set @addmon,1;close;
+ L10_2:
+ monster "gon_test.gat",58,87,"”MŒŒ’j",1464,1,"mobend";set @addmon,1;close;
+ L10_3:
+ monster "gon_test.gat",58,87,"Ž€ŒYŽ·sl",1487,1,"mobend";set @addmon,1;close;
+ L10_4:
+ monster "gon_test.gat",58,87,"“Ë‘R•ÏˆÙ—³",1449,1,"mobend";set @addmon,1;close;
+ L10_5:
+ monster "gon_test.gat",58,87,"‡¬b",1456,1,"mobend";set @addmon,1;close;
+ L10_6:
+ monster "gon_test.gat",58,87,"ˆ«–‚",1486,1,"mobend";set @addmon,1;close;
+ L11:
+ menu "Žël",L11_1,"ˆÃŽEŽÒ",L11_2,"Ž˜",L11_3,"•“¹‰Æ",L11_4,"Œ•Žm",L11_5;
+ L11_1:
+ monster "gon_test.gat",58,87,"Žël",1447,1,"mobend";set @addmon,1;close;
+ L11_2:
+ monster "gon_test.gat",58,87,"ˆÃŽEŽÒ",1483,1,"mobend";set @addmon,1;close;
+ L11_3:
+ monster "gon_test.gat",58,87,"Ž˜",1490,1,"mobend";set @addmon,1;close;
+ L11_4:
+ monster "gon_test.gat",58,87,"•“¹‰Æ",1484,1,"mobend";set @addmon,1;close;
+ L11_5:
+ monster "gon_test.gat",58,87,"Œ•Žm",1485,1,"mobend";set @addmon,1;close;
+Lalready:
+ mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
+ mes "Šù‚Ƀ‚ƒ“ƒXƒ^[‚𢊫‚µ‚Ü‚µ‚½B";
+ mes "1‰ñ‚Ƀ‚ƒ“ƒXƒ^[‚ð1•C‚¾‚¯";
+ mes "‘¼‚̃‚ƒ“ƒXƒ^[‚𢊫‚·‚é‚È‚ç‚ÎA";
+ mes "Ä“üꂵ‚Ä‚­‚¾‚³‚¢B";
+ close;
+LError:
+ mes "[ƒ\ƒ“ ƒˆƒ“ƒE]";
+ mes "³Ž®‚É\‚µž‚Ý‚ð‚µ‚Ä‚©‚ç";
+ mes "‚²—ˆê‚­‚¾‚³‚¢B";
+ close;
+}
+//===============================================================================
+gon_test.gat,51,90,0 script gontimer120000 -1,{
+ mapannounce "gon_test.gat",": Žc‚è‚P•ª‚Å‚·B",0;
+ deltimer "gontimer120000";
+ addtimer 60000,"gontimer180000";
+ break;
+}
+gon_test.gat,50,90,0 script gontimer180000 -1,{
+Onend:
+ mapannounce "gon_test.gat",": §ŒÀŽžŠÔ‚É‚È‚è‚Ü‚µ‚½B",0;
+ areawarp "gon_test.gat",42,82,73,91,"gon_test.gat",44,4;
+ deltimer "gontimer180000";
+ enablenpc "TŽºŠÇ—ŽÒ";
+ killmonster "gon_test.gat","All";
+ break;
+}
+//===============================================================================
+gon_test.gat,58,87,0 script mobend -1,{
+ mapannounce "gon_test.gat","¢Š«ŽÒ : ‚¨‚ß‚Å‚Æ‚¤‚²‚´‚¢‚Ü‚·I‚Ü‚½‚Ì‚²—ˆê‚ð‚¨‘Ò‚¿‚µ‚Ä‚¨‚è‚Ü‚·B",0;
+ addtimer 3000,"mobend::OnReturn";
+ break;
+OnReturn:
+ warp "gon_test.gat",44,4;
+ deltimer "mobend";
+ deltimer "gontimer180000";
+ deltimer "gontimer120000";
+ enablenpc "TŽºŠÇ—ŽÒ";
+ break;
+}
+//===============================================================================
+gon_test.gat,70,103,4 script oŒûˆÄ“àˆõ 773,{
+ mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
+ mes "‹A‚è‚Ü‚·‚©H";
+ next;
+ menu "‹A‚é",-,"‹A‚ç‚È‚¢",Lno;
+ mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
+ mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
+ mes "‚悯‚ê‚ÎA‚Ü‚½—ˆ‚Ä‚­‚¾‚³‚¢‚ËB";
+ next;
+ warp "gon_test.gat",44,4;
+ set @kengaku,0;
+ break;
+ Lno:
+ mes "[ƒ`ƒF ƒGƒ“ƒGƒ“]";
+ mes "‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚µ‚½B";
+ close;
+}
diff --git a/npc/other/warper.txt b/npc/other/warper.txt
index 064cd0728..933dc59ed 100644
--- a/npc/other/warper.txt
+++ b/npc/other/warper.txt
@@ -1,99 +1,99 @@
-//===== eAthena Script =======================================
-//= Warper Script
-//===== By: ==================================================
-//= Darkchild
-//===== Current Version: =====================================
-//= 1.3
-//===== 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]
-//============================================================
-
-- script Warp NPC::warpra 115,{
- mes "[Warp NPC]";
- mes "Hello,";
- mes "I can warp you to any Town and Dungeon!";
- mes "Were do you want to go?";
- next;
- menu "Towns",stadt,"Dungeons",dungeon;
-
- stadt:
- menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Comodo",wcomodo,"Geffen",wgeffen,"Gonryun",wgonryun,"Izlude",wizlude,"Louyang",wlouyang,"Lutie",wxmas,"Morroc",wmorroc,"Niflheim",wniflheim,"Payon",wpayon,"Prontera",wprontera,"Umbala",wumbala,"Yuno",wyuno;
-
- dungeon:
- menu "Amatsu Dungeon",damatsu,"Anthell",dant,"Bibilan Dungeon",dbibilan,"Coal Mine (Dead Pit)",dcoal,"Culvert",dculvert,"Glast Heim",dglast,"Gonryun Dungeon",dgonryun,"Magma-Dungeon",dmagma,"Orc-Dungeon",dorc,"Payon-Dungeon",dpayon,"Pyramids",dpyramids,"Sphinx",dsphinx,"Sunken Ship",dsunken,"Turtle Dungeon",dturtle;
-
-
-//----------------Towns----------------\\
-
-walberta: warp "alberta.gat", 27, 236; close;
-waldebaran: warp "aldebaran.gat", 145, 120; close;
-wamatsu: warp "amatsu.gat", 197, 86; close;
-wcomodo: warp "comodo.gat", 188, 161; close;
-wgonryun: warp "gonryun.gat", 150, 130; close;
-wgeffen: warp "geffen.gat", 119, 66; close;
-wizlude: warp "izlude.gat", 128, 111; close;
-wlouyang: warp "louyang.gat", 210, 108; close;
-wmorroc: warp "morocc.gat", 159, 93; close;
-wniflheim: warp "niflheim.gat", 35, 161; close;
-wprontera: warp "prontera.gat", 156, 187; close;
-wpayon: warp "payon.gat", 152, 75; close;
-wumbala: warp "umbala.gat", 130, 130; close;
-wxmas: warp "xmas.gat", 148, 131; close;
-wyuno: warp "yuno.gat", 160, 168; close;
-
-//----------------Dungeons----------------\\
-
-damatsu: warp "ama_fild01.gat", 172, 324; close;
-dant: warp "moc_fild04.gat", 210, 328; close;
-dbibilan: warp "izlu2dun.gat", 106, 88; close;
-dculvert: warp "prt_fild05.gat", 273, 210; close;
-dcoal: warp "mjolnir_02.gat", 81, 359; close;
-dglast: warp "glast_01.gat", 368, 303; close;
-dgonryun: warp "gonryun.gat", 160, 195; close;
-dmagma: warp "yuno_fild03.gat", 39, 140; close;
-dorc: warp "gef_fild10.gat", 70, 332; close;
-dpayon: warp "pay_arche.gat", 43, 132; close;
-dpyramids: warp "moc_ruins.gat", 62, 162; close;
-dsphinx: warp "moc_fild19.gat", 107, 100; close;
-dsunken: warp "alb2trea.gat", 75, 98; close;
-dturtle: warp "tur_dun01.gat", 149, 238; close;
-}
-
-alb2trea.gat,73,101,4 duplicate(warpra) Warp NPC 115
-alberta.gat,31,240,4 duplicate(warpra) Warp NPC 115
-aldebaran.gat,145,118,4 duplicate(warpra) Warp NPC 115
-amatsu.gat,192,81,1 duplicate(warpra) Warp NPC 115
-ama_fild01.gat,178,325,1 duplicate(warpra) Warp NPC 115
-comodo.gat,194,158,4 duplicate(warpra) Warp NPC 115
-gef_fild10.gat,71,339,4 duplicate(warpra) Warp NPC 115
-geffen.gat,115,66,4 duplicate(warpra) Warp NPC 115
-glast_01.gat,370,308,4 duplicate(warpra) Warp NPC 115
-gonryun.gat,151,130,4 duplicate(warpra) Warp NPC 115
-gonryun.gat,164,196,4 duplicate(warpra) Warp NPC 115
-izlude.gat,131,116,4 duplicate(warpra) Warp NPC 115
-izlu2dun.gat,104,82,4 duplicate(warpra) Warp NPC 115
-louyang.gat,210,106,4 duplicate(warpra) Warp NPC 115
-mjolnir_02.gat,85,363,4 duplicate(warpra) Warp NPC 115
-moc_fild04.gat,207,331,4 duplicate(warpra) Warp NPC 115
-moc_fild19.gat,106,97,4 duplicate(warpra) Warp NPC 115
-moc_ruins.gat,64,166,4 duplicate(warpra) Warp NPC 115
-morocc.gat,156,95,4 duplicate(warpra) Warp NPC 115
-niflheim.gat,32,161,4 duplicate(warpra) Warp NPC 115
-pay_arche.gat,39,135,4 duplicate(warpra) Warp NPC 115
-payon.gat,182,110,4 duplicate(warpra) Warp NPC 115
-prontera.gat,161,192,4 duplicate(warpra) Warp NPC 115
-prt_fild05.gat,273,215,4 duplicate(warpra) Warp NPC 115
-tur_dun01.gat,148,239,4 duplicate(warpra) Warp NPC 115
-umbala.gat,132,130,4 duplicate(warpra) Warp NPC 115
-xmas_fild01.gat,115,174,4 duplicate(warpra) Warp NPC 115
-yuno.gat,137,162,4 duplicate(warpra) Warp NPC 115
-yuno_fild03.gat,37,135,4 duplicate(warpra) Warp NPC 115
+//===== eAthena Script =======================================
+//= Warper Script
+//===== By: ==================================================
+//= Darkchild
+//===== Current Version: =====================================
+//= 1.3
+//===== 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]
+//============================================================
+
+- script Warp NPC::warpra 115,{
+ mes "[Warp NPC]";
+ mes "Hello,";
+ mes "I can warp you to any Town and Dungeon!";
+ mes "Were do you want to go?";
+ next;
+ menu "Towns",stadt,"Dungeons",dungeon;
+
+ stadt:
+ menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Comodo",wcomodo,"Geffen",wgeffen,"Gonryun",wgonryun,"Izlude",wizlude,"Louyang",wlouyang,"Lutie",wxmas,"Morroc",wmorroc,"Niflheim",wniflheim,"Payon",wpayon,"Prontera",wprontera,"Umbala",wumbala,"Yuno",wyuno;
+
+ dungeon:
+ menu "Amatsu Dungeon",damatsu,"Anthell",dant,"Bibilan Dungeon",dbibilan,"Coal Mine (Dead Pit)",dcoal,"Culvert",dculvert,"Glast Heim",dglast,"Gonryun Dungeon",dgonryun,"Magma-Dungeon",dmagma,"Orc-Dungeon",dorc,"Payon-Dungeon",dpayon,"Pyramids",dpyramids,"Sphinx",dsphinx,"Sunken Ship",dsunken,"Turtle Dungeon",dturtle;
+
+
+//----------------Towns----------------\\
+
+walberta: warp "alberta.gat", 27, 236; close;
+waldebaran: warp "aldebaran.gat", 145, 120; close;
+wamatsu: warp "amatsu.gat", 197, 86; close;
+wcomodo: warp "comodo.gat", 188, 161; close;
+wgonryun: warp "gonryun.gat", 150, 130; close;
+wgeffen: warp "geffen.gat", 119, 66; close;
+wizlude: warp "izlude.gat", 128, 111; close;
+wlouyang: warp "louyang.gat", 210, 108; close;
+wmorroc: warp "morocc.gat", 159, 93; close;
+wniflheim: warp "niflheim.gat", 35, 161; close;
+wprontera: warp "prontera.gat", 156, 187; close;
+wpayon: warp "payon.gat", 152, 75; close;
+wumbala: warp "umbala.gat", 130, 130; close;
+wxmas: warp "xmas.gat", 148, 131; close;
+wyuno: warp "yuno.gat", 160, 168; close;
+
+//----------------Dungeons----------------\\
+
+damatsu: warp "ama_fild01.gat", 172, 324; close;
+dant: warp "moc_fild04.gat", 210, 328; close;
+dbibilan: warp "izlu2dun.gat", 106, 88; close;
+dculvert: warp "prt_fild05.gat", 273, 210; close;
+dcoal: warp "mjolnir_02.gat", 81, 359; close;
+dglast: warp "glast_01.gat", 368, 303; close;
+dgonryun: warp "gonryun.gat", 160, 195; close;
+dmagma: warp "yuno_fild03.gat", 39, 140; close;
+dorc: warp "gef_fild10.gat", 70, 332; close;
+dpayon: warp "pay_arche.gat", 43, 132; close;
+dpyramids: warp "moc_ruins.gat", 62, 162; close;
+dsphinx: warp "moc_fild19.gat", 107, 100; close;
+dsunken: warp "alb2trea.gat", 75, 98; close;
+dturtle: warp "tur_dun01.gat", 149, 238; close;
+}
+
+alb2trea.gat,73,101,4 duplicate(warpra) Warp NPC 115
+alberta.gat,31,240,4 duplicate(warpra) Warp NPC 115
+aldebaran.gat,145,118,4 duplicate(warpra) Warp NPC 115
+amatsu.gat,192,81,1 duplicate(warpra) Warp NPC 115
+ama_fild01.gat,178,325,1 duplicate(warpra) Warp NPC 115
+comodo.gat,194,158,4 duplicate(warpra) Warp NPC 115
+gef_fild10.gat,71,339,4 duplicate(warpra) Warp NPC 115
+geffen.gat,115,66,4 duplicate(warpra) Warp NPC 115
+glast_01.gat,370,308,4 duplicate(warpra) Warp NPC 115
+gonryun.gat,151,130,4 duplicate(warpra) Warp NPC 115
+gonryun.gat,164,196,4 duplicate(warpra) Warp NPC 115
+izlude.gat,131,116,4 duplicate(warpra) Warp NPC 115
+izlu2dun.gat,104,82,4 duplicate(warpra) Warp NPC 115
+louyang.gat,210,106,4 duplicate(warpra) Warp NPC 115
+mjolnir_02.gat,85,363,4 duplicate(warpra) Warp NPC 115
+moc_fild04.gat,207,331,4 duplicate(warpra) Warp NPC 115
+moc_fild19.gat,106,97,4 duplicate(warpra) Warp NPC 115
+moc_ruins.gat,64,166,4 duplicate(warpra) Warp NPC 115
+morocc.gat,156,95,4 duplicate(warpra) Warp NPC 115
+niflheim.gat,32,161,4 duplicate(warpra) Warp NPC 115
+pay_arche.gat,39,135,4 duplicate(warpra) Warp NPC 115
+payon.gat,182,110,4 duplicate(warpra) Warp NPC 115
+prontera.gat,161,192,4 duplicate(warpra) Warp NPC 115
+prt_fild05.gat,273,215,4 duplicate(warpra) Warp NPC 115
+tur_dun01.gat,148,239,4 duplicate(warpra) Warp NPC 115
+umbala.gat,132,130,4 duplicate(warpra) Warp NPC 115
+xmas_fild01.gat,115,174,4 duplicate(warpra) Warp NPC 115
+yuno.gat,137,162,4 duplicate(warpra) Warp NPC 115
+yuno_fild03.gat,37,135,4 duplicate(warpra) Warp NPC 115
diff --git a/npc/other/warper2.txt b/npc/other/warper2.txt
index 92275d551..3cd601ba1 100644
--- a/npc/other/warper2.txt
+++ b/npc/other/warper2.txt
@@ -1,263 +1,263 @@
-//===== eAthena Script =======================================
-//= Warp Npc With Warp To Almost Everywhere
-//===== By: ==================================================
-//= Someone(thats his name!) (1.0)
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= Any eAthena Version with duplicate; RO Ep6+
-//===== Description: =========================================
-//= -
-//===== Additional Comments: =================================
-//= 1.1 by Darkchild
-//= 1.2 by Darkchild
-//= 1.3 Fixed by x[tsk] Added missing code for Valkyrie + Added
-//= a warp NPC in Valkyrie it self. Checked/Added by Lupus
-//= 1.4 morocc coords overlapping fixed
-//============================================================
-
-- script Warp NPC::warpra 115,{
- mes "[Warp NPC]";
- mes "Hello, I can warp you to any Town and Dungeon! Were do you want to go?";
- next;
- menu "Towns",town,"Dungeons",dungeon;
-town:
- menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Comodo",wcomodo,"Gonryun",wgonryun,"Geffen",wgeffen,"Izlude",wizlude,"Lutie",wxmas,"Morroc",wmorroc,"Niflheim",wniflheim,"Payon",wpayon,"Prontera",wprontera,"Yuno",wyuno,"Umbala",wumbala,"Valkyrie",wvalk,"Louyang",wlouyang;
-dungeon:
- menu "Amatsu Dungeon",ama,"Gonryun Dungeon",gon,"Anthell",ant,"Beach Dungeon",beach,"Byalan Dungeon",byalan,"Clock Tower",clock,"Coal Mines",coal,"Culvert",culvert,"Geffen Dungeon",geffen,"Glast Heim",glast,"Hidden Dungeon",hidden,"Magma Dungeon",magma,"Orc Dungeon",orc,"Payon Dungeon",payon,"Pyramids",pyramids,"Sphinx",sphinx,"Sunken Ship",sunken,"Toy Factory",toy,"Turtle Dungeon",turtle,"Gefenia",gefenia;
-ant:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",danthell1,"Level 2",danthell2;
-beach:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dbeach1,"Level 2",dbeach2,"Level 3",dbeach3;
-byalan:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dbyalan1,"Level 2",dbyalan2,"Level 3",dbyalan3,"Level 4",dbyalan4,"Level 5",dbyalan5;
-clock:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dclock1,"Level 2",dclock2,"Level 3",dclock3,"Level 4",dclock4,"Basement 1",dalde1,"Basement 2",dalde2,"Basement 3",dalde3,"Basement 4",dalde4;
-coal:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dcoal1,"Level 2",dcoal2,"Level 3",dcoal3;
-culvert:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dculvert1,"Level 2",dculvert2,"Level 3",dculvert3,"Level 4",dculvert4;
-geffen:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dgeffen1,"Level 2",dgeffen2,"Level 3",dgeffen3,"Level 4",dgeffen4;
-glast:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Entrance",dglastent,"Castle 1",dglastcast1,"Castle 2",dglastcast2,"Chivalry 1",dglastchiv1,"Chivalry 2",dglastchiv2,"Churchyard",dglastyard,"Culvert 1",dglastcul1,"Culvert 2",dglastcul1,"Culvert 3",dglastcul3,"Culvert 4",dglastcul4,"St.Abbey",dglastchur,"Staircase Dungeon",dglaststep,"Underground Cave 1",dglastcave1,"Underground Cave 2",dglastcave2,"Underground Prison 1",dglastpris1,"Underground Prison 2",dglastpris2;
-hidden:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dhidden1,"Level 2",dhidden2,"Level 3",dhidden3;
-magma:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dmagma1,"Level 2",dmagma2;
-orc:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dorc1,"Level 2",dorc2;
-payon:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dpayon1,"Level 2",dpayon2,"Level 3",dpayon3,"Level 4",dpayon4,"Level 5",dpayon5;
-pyramids:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dpyramids1,"Level 2",dpyramids2,"Level 3",dpyramids3,"Level 4",dpyramids4,"Basement 1",dpyramidsb1,"Basement 2",dpyramidsb2;
-sphinx:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dsphinx1,"Level 2",dsphinx2,"Level 3",dsphinx3,"Level 4",dsphinx4,"Level 5",dsphinx5;
-sunken:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dsunken1,"Level 2",dsunken2;
-toy:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dtoy1,"Level 2",dtoy2;
-turtle:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Entrance",dturtleent,"Level 1",dturtle1,"Level 2",dturtle2,"Level 3",dturtle3;
-ama:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dama1,"Level 2",dama2,"Level 3",dama3;
-gon:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dgon1,"Level 2",dgon2,"Level 3",dgon3;
-gefenia:
- mes "[Warp NPC]";
- mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
- next;
- menu "Level 1",dgefenia1,"Level 2",dgefenia2,"Level 3",dgefenia3,"Level 4",dgefenia4;
-
-//----------------Towns----------------\\
-
-walberta: warp "alberta.gat",192,147; close;
-waldebaran: warp "aldebaran.gat",140,131; close;
-wamatsu: warp "amatsu.gat",198,84; close;
-wcomodo: warp "comodo.gat",209,143; close;
-wgonryun: warp "gonryun.gat",160,121; close;
-wgeffen: warp "geffen.gat",119,59; close;
-wizlude: warp "izlude.gat",128,114; close;
-wxmas: warp "xmas.gat",147,134; close;
-wmorroc: warp "morocc.gat",156,93; close;
-wniflheim: warp "niflheim.gat",85,154; close;
-wpayon: warp "payon.gat",152,75; close;
-wprontera: warp "prontera.gat",156,191; close;
-wyuno: warp "yuno.gat",157,51; close;
-wumbala: warp "umbala.gat",145,155; close;
-wlouyang: warp "louyang.gat",210,108; close;
-wvalk: warp "valkyrie",48,8; close;
-
-//----------------Dungeons----------------\\
-
-danthell1: warp "anthell01.gat",35,262; close;
-danthell2: warp "anthell02.gat",168,170; close;
-dbeach1: warp "beach_dun.gat",266,67; close;
-dbeach2: warp "beach_dun2.gat",255,244; close;
-dbeach3: warp "beach_dun3.gat",23,260; close;
-dbyalan1: warp "iz_dun00.gat",168,168; close;
-dbyalan2: warp "iz_dun01.gat",253,252; close;
-dbyalan3: warp "iz_dun02.gat",236,204; close;
-dbyalan4: warp "iz_dun03.gat",32,63; close;
-dbyalan5: warp "iz_dun04.gat",26,27; close;
-dalde1: warp "alde_dun01.gat",297,25; close;
-dalde2: warp "alde_dun02.gat",127,169; close;
-dalde3: warp "alde_dun03.gat",277,178; close;
-dalde4: warp "alde_dun04.gat",268,74; close;
-dclock1: warp "c_tower1.gat",199,159; close;
-dclock2: warp "c_tower2.gat",148,283; close;
-dclock3: warp "c_tower3.gat",65,147; close;
-dclock4: warp "c_tower4.gat",56,155; close;
-dcoal1: warp "mjo_dun01.gat",52,17; close;
-dcoal2: warp "mjo_dun02.gat",381,343; close;
-dcoal3: warp "mjo_dun03.gat",302,262; close;
-dculvert1: warp "prt_sewb1.gat",131,247; close;
-dculvert2: warp "prt_sewb2.gat",19,19; close;
-dculvert3: warp "prt_sewb3.gat",180,169; close;
-dculvert4: warp "prt_sewb4.gat",100,92; close;
-dgeffen1: warp "gef_dun00.gat",104,99; close;
-dgeffen2: warp "gef_dun01.gat",115,236; close;
-dgeffen3: warp "gef_dun02.gat",106,132; close;
-dgeffen4: warp "gef_dun03.gat",203,200; close;
-dglastent: warp "glast_01.gat",375,304; close;
-dglastcast1: warp "gl_cas01.gat",199,29; close;
-dglastcast2: warp "gl_cas02.gat",104,25; close;
-dglastchiv1: warp "gl_knt01.gat",150,15; close;
-dglastchiv2: warp "gl_knt02.gat",157,287; close;
-dglastyard: warp "gl_chyard.gat",147,15; close;
-dglastcul1: warp "gl_sew01.gat",258,255; close;
-dglastcul2: warp "gl_sew02.gat",108,291; close;
-dglastcul3: warp "gl_sew03.gat",171,283; close;
-dglastcul4: warp "gl_sew04.gat",68,277; close;
-dglastchur: warp "gl_church.gat",156,7; close;
-dglaststep: warp "gl_step.gat",12,7; close;
-dglastcave1: warp "gl_dun01.gat",133,271; close;
-dglastcave2: warp "gl_dun02.gat",224,274; close;
-dglastpris1: warp "gl_prison.gat",14,70; close;
-dglastpris2: warp "gl_prison1.gat",150,14; close;
-dhidden1: warp "prt_maze01.gat",176,7; close;
-dhidden2: warp "prt_maze02.gat",94,9; close;
-dhidden3: warp "prt_maze03.gat",23,8; close;
-dmagma1: warp "mag_dun01.gat",126,68; close;
-dmagma2: warp "mag_dun02.gat",47,30; close;
-dorc1: warp "orcsdun01.gat",32,170; close;
-dorc2: warp "orcsdun02.gat",21,185; close;
-dpayon1: warp "pay_dun00.gat",21,183; close;
-dpayon2: warp "pay_dun01.gat",19,33; close;
-dpayon3: warp "pay_dun02.gat",19,63; close;
-dpayon4: warp "pay_dun03.gat",155,159; close;
-dpayon5: warp "pay_dun04.gat",201,204; close;
-dpyramids1: warp "moc_pryd01.gat",192,9; close;
-dpyramids2: warp "moc_pryd02.gat",10,192; close;
-dpyramids3: warp "moc_pryd03.gat",100,92; close;
-dpyramids4: warp "moc_pryd04.gat",181,11; close;
-dpyramidsb1: warp "moc_pryd05.gat",94,96; close;
-dpyramidsb2: warp "moc_pryd06.gat",192,8; close;
-dsphinx1: warp "in_sphinx1.gat",288,9; close;
-dsphinx2: warp "in_sphinx2.gat",149,81; close;
-dsphinx3: warp "in_sphinx3.gat",210,54; close;
-dsphinx4: warp "in_sphinx4.gat",10,222; close;
-dsphinx5: warp "in_sphinx5.gat",100,99; close;
-dsunken1: warp "treasure01.gat",69,24; close;
-dsunken2: warp "treasure02.gat",102,27; close;
-dtoy1: warp "xmas_dun01.gat",205,15; close;
-dtoy2: warp "xmas_dun02.gat",129,133; close;
-dturtleent: warp "tur_dun01.gat",154,49; close;
-dturtle1: warp "tur_dun02.gat",148,261; close;
-dturtle2: warp "tur_dun03.gat",132,189; close;
-dturtle3: warp "tur_dun04.gat",100,192; close;
-dama1: warp "ama_dun01.gat",228,11; close;
-dama2: warp "ama_dun02.gat",34,41; close;
-dama3: warp "ama_dun03.gat",119,14; close;
-dgon1: warp "gon_dun01.gat",153,53; close;
-dgon2: warp "gon_dun02.gat",28,113; close;
-dgon3: warp "gon_dun03.gat",68,16; close;
-dgefenia1: warp "gefenia01.gat",40,103; close;
-dgefenia2: warp "gefenia02.gat",203,34; close;
-dgefenia3: warp "gefenia03.gat",266,168; close;
-dgefenia4: warp "gefenia04.gat",130,272; close;
-}
-alberta.gat,31,240,4 duplicate(warpra) Warp NPC 115
-aldebaran.gat,145,118,4 duplicate(warpra) Warp NPC 115
-amatsu.gat,194,79,1 duplicate(warpra) Warp NPC 115
-comodo.gat,194,158,4 duplicate(warpra) Warp NPC 115
-geffen.gat,115,66,4 duplicate(warpra) Warp NPC 115
-izlude.gat,131,116,4 duplicate(warpra) Warp NPC 115
-xmas_fild01.gat,115,174,4 duplicate(warpra) Warp NPC 115
-morocc.gat,156,99,4 duplicate(warpra) Warp NPC 115
-payon.gat,182,110,4 duplicate(warpra) Warp NPC 115
-prontera.gat,153,183,4 duplicate(warpra) Warp NPC 115
-yuno.gat,137,162,4 duplicate(warpra) Warp NPC 115
-moc_fild04.gat,207,331,4 duplicate(warpra) Warp NPC 115
-izlu2dun.gat,104,82,4 duplicate(warpra) Warp NPC 115
-mjolnir_02.gat,85,363,4 duplicate(warpra) Warp NPC 115
-prt_fild05.gat,273,215,4 duplicate(warpra) Warp NPC 115
-glast_01.gat,370,308,4 duplicate(warpra) Warp NPC 115
-yuno_fild03.gat,37,135,4 duplicate(warpra) Warp NPC 115
-gef_fild10.gat,71,339,4 duplicate(warpra) Warp NPC 115
-pay_arche.gat,39,135,4 duplicate(warpra) Warp NPC 115
-moc_ruins.gat,64,166,4 duplicate(warpra) Warp NPC 115
-moc_fild19.gat,106,97,4 duplicate(warpra) Warp NPC 115
-alb2trea.gat,73,101,4 duplicate(warpra) Warp NPC 115
-tur_dun01.gat,148,239,4 duplicate(warpra) Warp NPC 115
-gonryun.gat,151,130,4 duplicate(warpra) Warp NPC 115
-louyang.gat,210,106,4 duplicate(warpra) Warp NPC 115
-umbala.gat,132,130,4 duplicate(warpra) Warp NPC 115
-valkyrie.gat,48,35,8 duplicate(warpra) Warp NPC 115
+//===== eAthena Script =======================================
+//= Warp Npc With Warp To Almost Everywhere
+//===== By: ==================================================
+//= Someone(thats his name!) (1.0)
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= Any eAthena Version with duplicate; RO Ep6+
+//===== Description: =========================================
+//= -
+//===== Additional Comments: =================================
+//= 1.1 by Darkchild
+//= 1.2 by Darkchild
+//= 1.3 Fixed by x[tsk] Added missing code for Valkyrie + Added
+//= a warp NPC in Valkyrie it self. Checked/Added by Lupus
+//= 1.4 morocc coords overlapping fixed
+//============================================================
+
+- script Warp NPC::warpra 115,{
+ mes "[Warp NPC]";
+ mes "Hello, I can warp you to any Town and Dungeon! Were do you want to go?";
+ next;
+ menu "Towns",town,"Dungeons",dungeon;
+town:
+ menu "Alberta",walberta,"Aldebaran",waldebaran,"Amatsu",wamatsu,"Comodo",wcomodo,"Gonryun",wgonryun,"Geffen",wgeffen,"Izlude",wizlude,"Lutie",wxmas,"Morroc",wmorroc,"Niflheim",wniflheim,"Payon",wpayon,"Prontera",wprontera,"Yuno",wyuno,"Umbala",wumbala,"Valkyrie",wvalk,"Louyang",wlouyang;
+dungeon:
+ menu "Amatsu Dungeon",ama,"Gonryun Dungeon",gon,"Anthell",ant,"Beach Dungeon",beach,"Byalan Dungeon",byalan,"Clock Tower",clock,"Coal Mines",coal,"Culvert",culvert,"Geffen Dungeon",geffen,"Glast Heim",glast,"Hidden Dungeon",hidden,"Magma Dungeon",magma,"Orc Dungeon",orc,"Payon Dungeon",payon,"Pyramids",pyramids,"Sphinx",sphinx,"Sunken Ship",sunken,"Toy Factory",toy,"Turtle Dungeon",turtle,"Gefenia",gefenia;
+ant:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",danthell1,"Level 2",danthell2;
+beach:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dbeach1,"Level 2",dbeach2,"Level 3",dbeach3;
+byalan:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dbyalan1,"Level 2",dbyalan2,"Level 3",dbyalan3,"Level 4",dbyalan4,"Level 5",dbyalan5;
+clock:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dclock1,"Level 2",dclock2,"Level 3",dclock3,"Level 4",dclock4,"Basement 1",dalde1,"Basement 2",dalde2,"Basement 3",dalde3,"Basement 4",dalde4;
+coal:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dcoal1,"Level 2",dcoal2,"Level 3",dcoal3;
+culvert:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dculvert1,"Level 2",dculvert2,"Level 3",dculvert3,"Level 4",dculvert4;
+geffen:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dgeffen1,"Level 2",dgeffen2,"Level 3",dgeffen3,"Level 4",dgeffen4;
+glast:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Entrance",dglastent,"Castle 1",dglastcast1,"Castle 2",dglastcast2,"Chivalry 1",dglastchiv1,"Chivalry 2",dglastchiv2,"Churchyard",dglastyard,"Culvert 1",dglastcul1,"Culvert 2",dglastcul1,"Culvert 3",dglastcul3,"Culvert 4",dglastcul4,"St.Abbey",dglastchur,"Staircase Dungeon",dglaststep,"Underground Cave 1",dglastcave1,"Underground Cave 2",dglastcave2,"Underground Prison 1",dglastpris1,"Underground Prison 2",dglastpris2;
+hidden:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dhidden1,"Level 2",dhidden2,"Level 3",dhidden3;
+magma:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dmagma1,"Level 2",dmagma2;
+orc:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dorc1,"Level 2",dorc2;
+payon:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dpayon1,"Level 2",dpayon2,"Level 3",dpayon3,"Level 4",dpayon4,"Level 5",dpayon5;
+pyramids:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dpyramids1,"Level 2",dpyramids2,"Level 3",dpyramids3,"Level 4",dpyramids4,"Basement 1",dpyramidsb1,"Basement 2",dpyramidsb2;
+sphinx:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dsphinx1,"Level 2",dsphinx2,"Level 3",dsphinx3,"Level 4",dsphinx4,"Level 5",dsphinx5;
+sunken:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dsunken1,"Level 2",dsunken2;
+toy:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dtoy1,"Level 2",dtoy2;
+turtle:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Entrance",dturtleent,"Level 1",dturtle1,"Level 2",dturtle2,"Level 3",dturtle3;
+ama:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dama1,"Level 2",dama2,"Level 3",dama3;
+gon:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dgon1,"Level 2",dgon2,"Level 3",dgon3;
+gefenia:
+ mes "[Warp NPC]";
+ mes "Please select a Level. Beware that you will be warped directly into the dungeon.";
+ next;
+ menu "Level 1",dgefenia1,"Level 2",dgefenia2,"Level 3",dgefenia3,"Level 4",dgefenia4;
+
+//----------------Towns----------------\\
+
+walberta: warp "alberta.gat",192,147; close;
+waldebaran: warp "aldebaran.gat",140,131; close;
+wamatsu: warp "amatsu.gat",198,84; close;
+wcomodo: warp "comodo.gat",209,143; close;
+wgonryun: warp "gonryun.gat",160,121; close;
+wgeffen: warp "geffen.gat",119,59; close;
+wizlude: warp "izlude.gat",128,114; close;
+wxmas: warp "xmas.gat",147,134; close;
+wmorroc: warp "morocc.gat",156,93; close;
+wniflheim: warp "niflheim.gat",85,154; close;
+wpayon: warp "payon.gat",152,75; close;
+wprontera: warp "prontera.gat",156,191; close;
+wyuno: warp "yuno.gat",157,51; close;
+wumbala: warp "umbala.gat",145,155; close;
+wlouyang: warp "louyang.gat",210,108; close;
+wvalk: warp "valkyrie",48,8; close;
+
+//----------------Dungeons----------------\\
+
+danthell1: warp "anthell01.gat",35,262; close;
+danthell2: warp "anthell02.gat",168,170; close;
+dbeach1: warp "beach_dun.gat",266,67; close;
+dbeach2: warp "beach_dun2.gat",255,244; close;
+dbeach3: warp "beach_dun3.gat",23,260; close;
+dbyalan1: warp "iz_dun00.gat",168,168; close;
+dbyalan2: warp "iz_dun01.gat",253,252; close;
+dbyalan3: warp "iz_dun02.gat",236,204; close;
+dbyalan4: warp "iz_dun03.gat",32,63; close;
+dbyalan5: warp "iz_dun04.gat",26,27; close;
+dalde1: warp "alde_dun01.gat",297,25; close;
+dalde2: warp "alde_dun02.gat",127,169; close;
+dalde3: warp "alde_dun03.gat",277,178; close;
+dalde4: warp "alde_dun04.gat",268,74; close;
+dclock1: warp "c_tower1.gat",199,159; close;
+dclock2: warp "c_tower2.gat",148,283; close;
+dclock3: warp "c_tower3.gat",65,147; close;
+dclock4: warp "c_tower4.gat",56,155; close;
+dcoal1: warp "mjo_dun01.gat",52,17; close;
+dcoal2: warp "mjo_dun02.gat",381,343; close;
+dcoal3: warp "mjo_dun03.gat",302,262; close;
+dculvert1: warp "prt_sewb1.gat",131,247; close;
+dculvert2: warp "prt_sewb2.gat",19,19; close;
+dculvert3: warp "prt_sewb3.gat",180,169; close;
+dculvert4: warp "prt_sewb4.gat",100,92; close;
+dgeffen1: warp "gef_dun00.gat",104,99; close;
+dgeffen2: warp "gef_dun01.gat",115,236; close;
+dgeffen3: warp "gef_dun02.gat",106,132; close;
+dgeffen4: warp "gef_dun03.gat",203,200; close;
+dglastent: warp "glast_01.gat",375,304; close;
+dglastcast1: warp "gl_cas01.gat",199,29; close;
+dglastcast2: warp "gl_cas02.gat",104,25; close;
+dglastchiv1: warp "gl_knt01.gat",150,15; close;
+dglastchiv2: warp "gl_knt02.gat",157,287; close;
+dglastyard: warp "gl_chyard.gat",147,15; close;
+dglastcul1: warp "gl_sew01.gat",258,255; close;
+dglastcul2: warp "gl_sew02.gat",108,291; close;
+dglastcul3: warp "gl_sew03.gat",171,283; close;
+dglastcul4: warp "gl_sew04.gat",68,277; close;
+dglastchur: warp "gl_church.gat",156,7; close;
+dglaststep: warp "gl_step.gat",12,7; close;
+dglastcave1: warp "gl_dun01.gat",133,271; close;
+dglastcave2: warp "gl_dun02.gat",224,274; close;
+dglastpris1: warp "gl_prison.gat",14,70; close;
+dglastpris2: warp "gl_prison1.gat",150,14; close;
+dhidden1: warp "prt_maze01.gat",176,7; close;
+dhidden2: warp "prt_maze02.gat",94,9; close;
+dhidden3: warp "prt_maze03.gat",23,8; close;
+dmagma1: warp "mag_dun01.gat",126,68; close;
+dmagma2: warp "mag_dun02.gat",47,30; close;
+dorc1: warp "orcsdun01.gat",32,170; close;
+dorc2: warp "orcsdun02.gat",21,185; close;
+dpayon1: warp "pay_dun00.gat",21,183; close;
+dpayon2: warp "pay_dun01.gat",19,33; close;
+dpayon3: warp "pay_dun02.gat",19,63; close;
+dpayon4: warp "pay_dun03.gat",155,159; close;
+dpayon5: warp "pay_dun04.gat",201,204; close;
+dpyramids1: warp "moc_pryd01.gat",192,9; close;
+dpyramids2: warp "moc_pryd02.gat",10,192; close;
+dpyramids3: warp "moc_pryd03.gat",100,92; close;
+dpyramids4: warp "moc_pryd04.gat",181,11; close;
+dpyramidsb1: warp "moc_pryd05.gat",94,96; close;
+dpyramidsb2: warp "moc_pryd06.gat",192,8; close;
+dsphinx1: warp "in_sphinx1.gat",288,9; close;
+dsphinx2: warp "in_sphinx2.gat",149,81; close;
+dsphinx3: warp "in_sphinx3.gat",210,54; close;
+dsphinx4: warp "in_sphinx4.gat",10,222; close;
+dsphinx5: warp "in_sphinx5.gat",100,99; close;
+dsunken1: warp "treasure01.gat",69,24; close;
+dsunken2: warp "treasure02.gat",102,27; close;
+dtoy1: warp "xmas_dun01.gat",205,15; close;
+dtoy2: warp "xmas_dun02.gat",129,133; close;
+dturtleent: warp "tur_dun01.gat",154,49; close;
+dturtle1: warp "tur_dun02.gat",148,261; close;
+dturtle2: warp "tur_dun03.gat",132,189; close;
+dturtle3: warp "tur_dun04.gat",100,192; close;
+dama1: warp "ama_dun01.gat",228,11; close;
+dama2: warp "ama_dun02.gat",34,41; close;
+dama3: warp "ama_dun03.gat",119,14; close;
+dgon1: warp "gon_dun01.gat",153,53; close;
+dgon2: warp "gon_dun02.gat",28,113; close;
+dgon3: warp "gon_dun03.gat",68,16; close;
+dgefenia1: warp "gefenia01.gat",40,103; close;
+dgefenia2: warp "gefenia02.gat",203,34; close;
+dgefenia3: warp "gefenia03.gat",266,168; close;
+dgefenia4: warp "gefenia04.gat",130,272; close;
+}
+alberta.gat,31,240,4 duplicate(warpra) Warp NPC 115
+aldebaran.gat,145,118,4 duplicate(warpra) Warp NPC 115
+amatsu.gat,194,79,1 duplicate(warpra) Warp NPC 115
+comodo.gat,194,158,4 duplicate(warpra) Warp NPC 115
+geffen.gat,115,66,4 duplicate(warpra) Warp NPC 115
+izlude.gat,131,116,4 duplicate(warpra) Warp NPC 115
+xmas_fild01.gat,115,174,4 duplicate(warpra) Warp NPC 115
+morocc.gat,156,99,4 duplicate(warpra) Warp NPC 115
+payon.gat,182,110,4 duplicate(warpra) Warp NPC 115
+prontera.gat,153,183,4 duplicate(warpra) Warp NPC 115
+yuno.gat,137,162,4 duplicate(warpra) Warp NPC 115
+moc_fild04.gat,207,331,4 duplicate(warpra) Warp NPC 115
+izlu2dun.gat,104,82,4 duplicate(warpra) Warp NPC 115
+mjolnir_02.gat,85,363,4 duplicate(warpra) Warp NPC 115
+prt_fild05.gat,273,215,4 duplicate(warpra) Warp NPC 115
+glast_01.gat,370,308,4 duplicate(warpra) Warp NPC 115
+yuno_fild03.gat,37,135,4 duplicate(warpra) Warp NPC 115
+gef_fild10.gat,71,339,4 duplicate(warpra) Warp NPC 115
+pay_arche.gat,39,135,4 duplicate(warpra) Warp NPC 115
+moc_ruins.gat,64,166,4 duplicate(warpra) Warp NPC 115
+moc_fild19.gat,106,97,4 duplicate(warpra) Warp NPC 115
+alb2trea.gat,73,101,4 duplicate(warpra) Warp NPC 115
+tur_dun01.gat,148,239,4 duplicate(warpra) Warp NPC 115
+gonryun.gat,151,130,4 duplicate(warpra) Warp NPC 115
+louyang.gat,210,106,4 duplicate(warpra) Warp NPC 115
+umbala.gat,132,130,4 duplicate(warpra) Warp NPC 115
+valkyrie.gat,48,35,8 duplicate(warpra) Warp NPC 115
diff --git a/npc/other/wedding.txt b/npc/other/wedding.txt
index a2271350f..87a994765 100644
--- a/npc/other/wedding.txt
+++ b/npc/other/wedding.txt
@@ -1,707 +1,707 @@
-//////////////////////////////////////////////////////////
-// Wedding Script Alpha (v1.4) //
-//////////////////////////////////////////////////////////
-//
-//=====eAthena Script====================================
-// Wedding Script
-//=====By================================================
-// AppleGirl and Evera(version 1.0)
-//=====Current Version===================================
-// 1.4
-//=====Compatible With:==================================
-// Any eAthena Version; RO Episode 6+
-//=====Description=======================================
-// Fully working wedding script for all kind of weddings
-//=====Additional Comments:==============================
-// Tested and debugged by whocares (maybe 1-2 bugs left)(version 1.1)
-//======= Version 1.2 By ShadowLady =====================
-// Same Sex Weddings.
-// Now the script(npcs) tell the players how they must perform exactly.
-//======= Version 1.3 By ShadowLady =====================
-// You might need to update the wedding rings in item_db
-// Same for the tux/dress, so all classes and lvs can use it ^^
-// And check if they are wearing the tux/dress and not only have it on the inventory.
-//======= Version 1.4 By ShadowLady =====================
-// Added some code ideas. Thanks to Jbain for help me debbuging
-// Added @outfit variable, to check if you already bought a tux/dress
-// No need to buy a tuxedo/dress everytime you register anymore, unless you divorce
-// Fixed some of that bugged timers (*stares whocares*) Now it is exactly 5 minutes and not 2
-// Fixed "part" of the divorce npc. The code is bugged by itself -_- Need both chars to be online yet.
-////======= Version 1.45 By ShadowLady =====================
-// Fixed some minor bugs. Same-sex is disabled by default now.
-// Change $progress variable to $@progress, so it dont screw up the ceremony on a server crash.
-// Added a Special GM Menu to enable/disable same-sex weddings and reset most variables.
-//=======================================================
-// Variable Notes:
-//
-// event_wedding - 1 signifies marriage
-// $groom$ - Groom's name storage
-// $bride$ - Bride's name storage
-// $progress - Sets global restriction upon wedding
-// @register - Temporary registration check
-// @zleft - Temporary zeny needed check
-// $name$ - Insert name for bride
-// $name2$ - Insert name for groom
-// $get_ring - Check so you can't get ring twice
-// $reason$ - Objection to wedding
-// @outfit - Check if the char already got a dress or tuxedo from the npc
-// Tristan
-prt_church.gat,99,125,4 script Tristan the Third 108,{
- if($groom$ == strcharinfo(0) && $progress != 3) goto L_GroomCeremony;
- if(@register == 0) goto L_GroomNeedToRegister;
- if($bride$ == strcharinfo(0)) goto L_BrideCeremony;
- menu "Here To Attend",L_Wedding,"Here for another reason",L_OtherReason;
-L_GroomCeremony:
- if(@register == 0) goto L_GroomNeedToRegister;
- if($progress == 1) goto L_BrideNeedToRegister;
- if($progress == 0) goto L_Wedding;
- if(countitem(2613) < 1) goto L_NeedRing;//Items: Diamond_Ring,
- if((getequipid(2) != 2338) && (getequipid(2) != 7170)) goto L_Attire;
- mes "[Tristan the Third]";
- mes "Everything is ready, it's your call now...";
- next;
- menu "Perform Wedding.",-,"Cancel Wedding.",L_CancelWedding;
- set $progress,3;
- mes "[Tristan the Third]";
- mes "Well all you have to do now is the easy part input your bride's name, remember to spell it correctly.";
- input $name2$;
- next;
- if($name2$ != $bride$) goto L_WrongBrideName;
- deltimer "a13";
- marriage $name2$;
- mes "[Tristan the Third]";
- mes "Please tell your wife to speak to me, and then we will start exchanging rings";
- delitem 2613,1;//Items: Diamond_Ring,
- getitem 2635,1;//Items: Wedding_Ring_F,
- set @get_ring,1;
- next;
- mes "[Tristan the Third]";
- mes "Will you and your bride please move onto the stand. I will now preform the Wedding Ceremony!";
- set event_wedding,1;
- deltimer "weddinglimit1";
- deltimer "weddinglimit2";
- announce "The Wedding of "+$groom$+" and "+$bride$+", will now be held at Prontera Church.",5;
- addtimer 50000,"a1";
- addtimer 55000,"a2";
- addtimer 60000,"a3";
- addtimer 65000,"a4";
- addtimer 70000,"a5";
- addtimer 75000,"a6";
- addtimer 80000,"a7";
- addtimer 85000,"a8";
- addtimer 90000,"a9";
- addtimer 95000,"a10";
- addtimer 100000,"a11";
- addtimer 105000,"a12";
- close;
-L_BrideCeremony:
- if(countitem(2613) < 1) goto L_NeedRing;//Items: Diamond_Ring,
- if((getequipid(2) != 2338) && (getequipid(2) != 7170)) goto L_Attire;
- mes "[Tristan the Third]";
- mes "Well all you have to do now is the easy part input your groom's name, remember to spell it correctly.";
- input $name$;
- next;
- if($name$ != $groom$) goto L_WrongGroomName;
- deltimer "a13";
- deltimer "weddinglimit1";
- deltimer "weddinglimit2";
- marriage $name$;
- delitem 2613,1;//Items: Diamond_Ring,
- getitem 2634,1;//Items: Wedding_Ring_M,
- set @get_ring,1;
- close;
-L_CancelWedding:
- mes "[Tristan the Third]";
- mes "The wedding has been cancelled by "+strcharinfo(0)+".";
- set $progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set @register,0;
- set event_wedding,0;
- set @get_ring,0;
- deltimer "a1";
- deltimer "a2";
- deltimer "a3";
- deltimer "a4";
- deltimer "a5";
- deltimer "a6";
- deltimer "a7";
- deltimer "a8";
- deltimer "a9";
- deltimer "a10";
- deltimer "a11";
- deltimer "a12";
- deltimer "a13";
- close;
-L_GroomNeedToRegister:
- mes "[Tristan the Third]";
- mes "Hello, please register with Mary if you want me to perform a marriage for you.";
- close;
-L_Wedding:
- if(event_wedding != 1) goto L_Guest;
- mes "[Tristan the Third]";
- mes "Hello again "+strcharinfo(0)+", I hope wish for the best of luck in your life.";
- close;
-L_BrideNeedToRegister:
- mes "[Tristan the Third]";
- mes "I'm sorry, I cannot start the ceremony if the bride has not registered yet.";
- close;
-L_OtherReason:
- if(@get_ring == 1) goto L_Wedding;
- mes "[Tristan the Third]";
- mes "Do you have a reason why these two should not be bonded in holy matrimony?";
- next;
- menu "Yes I Do.",-,"No",L_NoReason;
- areaannounce "prt_church.gat",0,0,350,350,"Ladies and Gentlemen,"+strcharinfo(0)+" has an objection to this marriage",0;
- mes "[Tristan the Third]";
- mes "Please enter your reason, for this action.";
- input $reason$;
- next;
- areaannounce "prt_church.gat",0,0,350,350,""+$reason$+"",0;
- set $progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set $name$,"null";
- set $name2$,"null";
- set @register,0;
- set event_wedding,0;
- set @get_ring,0;
- deltimer "a1";
- deltimer "a2";
- deltimer "a3";
- deltimer "a4";
- deltimer "a5";
- deltimer "a6";
- deltimer "a7";
- deltimer "a8";
- deltimer "a9";
- deltimer "a10";
- deltimer "a11";
- deltimer "a12";
- mes "The wedding has been called off.";
- close;
-L_NoReason:
- if($groom$ == strcharinfo(0)) goto L_InProgress;
- if($bride$ == strcharinfo(0)) goto L_InProgress;
- mes "[Tristan the Third]";
- mes "Please have a seat than and let me continue the wedding.";
- close;
-L_Guest:
- mes "[Tristan the Third]";
- mes "Enjoy the cerimony.";
- mes "But I must continue the cerimony, so lets talk after.";
- close;
-L_InProgress:
- mes "[Tristan the Third]";
- mes "Your wedding is in progress, please try talking with me later.";
- close;
-L_WrongBrideName:
- mes "[Mary Happy]";
- mes "How come you forgot your wife name!? Sorry come back later when you know who you want to marry.";
- close;
-L_WrongGroomName:
- mes "[Mary Happy]";
- mes "How come you forgot your husband name!? Sorry come back later when you know who you want to marry.";
- close;
-L_NeedRing:
- mes "[Tristan the Third]";
- mes "You need a Diamond Ring in order to perform the wedding.";
- close;
-L_Attire:
- if(sex == 1) goto L_NeedTuxedo;
- if(sex == 0) goto L_NeedDress;
- close;
-L_NeedTuxedo:
- mes "[Tristan the Third]";
- mes "You need a Tuxedo before we can continue the ceremony.";
- close;
-L_NeedDress:
- mes "[Tristan the Third]";
- mes "Oh my is it your wedding day?";
- mes "Well sorry to break it to you, you need a wedding dress to get married.";
- close;
-}
-
-// Mary
-prt_church.gat,95,100,4 script Mary 71,{
- mes "[Mary Happy]";
- mes "Getting married bring a lot of joy.";
- mes "By any chance, you you want to get engaged with someone?";
- next;
- menu "Explain the principles of Marrige",L_Principles,"How does the marrige system work.",L_WeddingSystem,"I want to get married with someone.",L_Marry,"I live solo forever!",L_LiveSolo,"Special Menu",L_GmMenu;
-L_GmMenu:
- set @gmlevel,getgmlevel(50);
- if(@gmlevel < 50) goto L_NotGM;
- mes "Hello " + strcharinfo(0) + " How i can serve you?";
- menu "Enable Same-Sex Weddings",L_EnableSameSex,"Disable Same-Sex Weddings",L_DisableSameSex,"Reset the Variables",L_ResetVariables,"Just Checking...",L_Bye;
-L_NotGM:
- mes "You cant have access to this special menu " + strcharinfo(0) + "";
- mes "Only GMs can change the ceremony options.";
- close;
-L_EnableSameSex:
- set $samesex,1;
- mes "Same-Sex Weddings are enabled now!";
- close;
-L_DisableSameSex:
- set $samesex,0;
- mes "Same-Sex Weddings are disabled now!";
- close;
-L_ResetVariables:
- set $@progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set $name$,"null";
- set $name2$,"null";
- set @register,0;
- set event_wedding,0;
- set @get_ring,0;
- set @outfit,0;
- deltimer "weddinglimit1";
- deltimer "weddinglimit2";
- deltimer "a1";
- deltimer "a2";
- deltimer "a3";
- deltimer "a4";
- deltimer "a5";
- deltimer "a6";
- deltimer "a7";
- deltimer "a8";
- deltimer "a9";
- deltimer "a10";
- deltimer "a11";
- deltimer "a12";
- deltimer "a13";
- mes "All variables are reseted and timers off!";
- close;
-L_Principles:
- mes "[Mary Happy]";
- mes "His Majesty King Tristan III of the Rune Midgard Kingdom will be officiating this wedding, with the intent of blessing all the people through his noble message.";
- next;
- mes "[Mary Happy]";
- mes "Although His Majesty has a rather busy agenda, for the sake of newly married couples, he has personally come here, to the Prontera Church.";
- mes "It is the favor of our King that everyone would live happily ever after.";
- next;
- mes "[Mary Happy]";
- mes "The proposal must be done with prudence and courtesy.";
- mes "Once the wedlocks have been made, they cannot be undone.";
- mes "The two who are united in marriage must be with the other forever until the day they leave this world.";
- next;
- mes "[Mary Happy]";
- mes "Also, males only with females, and females only with males can be wed. Although there may be those who desire a homosexual or bestial marriage... it is approved.";
- next;
- mes "[Mary Happy]";
- mes "If there is a significant other whom you want to spend the rest of your life with, then don't be shy to propose.";
- mes "Wishing for many blessings upon couples who wish to live happily ever after..";
- close;
-L_WeddingSystem:
- mes "[Mary Happy]";
- mes "First make sure both players a registered to get married.";
- mes "Obviously, you must know each other to get married?";
- mes "If both have registered, and you must be on the same party.";
- mes "Then talk to Thristan the Third.";
- next;
- mes "[Mary Happy]";
- mes "You must go to Thristan the Third,";
- mes "and the Groom must talk to him first.";
- mes "And you must tell him the Bride";
- mes "you wish to get married with.";
- mes "Be sure to tell him exactly who you want to marry.";
- next;
- mes "[Mary Happy]";
- mes "After the Groom has spoken, next the Bride must talk.";
- mes "Then when both of you have spoken each others names,";
- mes "Thristan the third will read out both of your names.";
- next;
- mes "[Mary Happy]";
- mes "After you have got married,";
- mes "you will both recive a ring of marrige.";
- mes "And as soon as both of you wear these rings,";
- mes "you will be forever married with each other.";
- mes "You can also be refused of a lasting marrige.";
- mes "But, dont be sad.";
- next;
- mes "[Mary Happy]";
- mes "If there are many people that wish to get married,";
- mes "So please keep to the order you register.";
- mes "Thristan does not do multiple marriges at once.";
- mes "He will only see one couple at a time.";
- next;
- mes "[Mary Happy]";
- mes "Lastly, you must put forth your name quickly";
- mes "to Thristan the third.";
- mes "After the male has said yes to marrage ";
- mes "the female has 3 minutes to reply.";
- mes "Or you shall forever never be able";
- mes "to get married.";
- next;
- mes "[Mary Happy]";
- mes "An easy way to write down the each others name,";
- mes "Send a message to each other";
- mes "then in the private message window press up";
- next;
- mes "[Mary Happy]";
- mes "Then it will show the other persons name.";
- mes "If you press ctrl + C that name will be saved.";
- mes "Next time you need that name";
- mes "you can press shift + insert.";
- mes "Then you will get that name quickly and easily.";
- next;
- mes "[Mary Happy]";
- mes "You should have a go at using this method.";
- mes "Remeber, Press ctrl + C to save that name.";
- next;
- input $nametest$;
- mes "[Mary Happy]";
- mes "Hopefully you will remember this method.";
- mes "If you ever decide to get married.";
- mes "Remember to register.";
- close;
-L_Marry:
- mes "[Mary Happy]";
- mes "If you wish to get married you must first register.";
- mes "Male is ^FF00FF120,000^000000 zeny and female is ^FF00FF100,000^000000 zeny";
- if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) mes "But only ^FF00FF60,000^000000 zeny for male and ^FF00FF50,000^000000 zeny for female if you already have registered before";
- mes "Both male and female must have registered,";
- mes "and both must have paid fees, have Diamond Rings and be on same party!";
- mes "The Bride will get a Wedding Dress, while the Groom will get a Chinese Tuxedo";
- next;
- mes "[Mary Happy]";
- mes "If both people have paid and meet recquirements";
- mes "you are able to get married strait away.";
- mes "One must be the Groom and the other the Bride.";
- mes "Do you wish to register to get married?";
- if($SameSex == 1) menu "I'm gonna be the Groom",-,"I,m gonna be the Bride",L_BrideRegister,"Never mind",L_Bye;
- if(event_wedding == 1) goto L_Married;
- if(@register >= 1) goto L_AlreadyRegistered;
- if($progress >= 2) goto L_InProgress;
- if(($samesex == 0) && (sex == 0)) goto L_BrideRegister;
- if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) goto L_GroomRegister2;
- mes "[Mary Happy]";
- if(sex == 1) mes "No problem sir, please fill out your name here.";
- if(sex == 0) mes "No problem miss, please fill out your name here.";
- mes "And I'll need to collect a 120,000z fee for your wedding fees and outfit.";
- next;
- mes "[Mary Happy]";
- mes "Now You Must Insert The Your Bride's Name";
- input $name$;
- next;
- if(zeny < 120000) goto L_NeedZeny1;
- set $groom$,strcharinfo(0);
- set @register,1;
- set zeny,zeny-120000;
- set $progress,1;
- if(sex == 1) getitem 7170,1;
- if(sex == 0) getitem 2338,1;
- set @outfit,1;
- mes "[Mary Happy]";
- mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your marriage.";
- addtimer 300000,"weddinglimit1";
- areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
- next;
- mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
- deltimer "a13";
- addtimer 300000,"a13";
- close;
-L_BrideRegister:
- if ($name$ != strcharinfo(0)) goto L_NotBride;
- if($groom$ == strcharinfo(0)) goto L_CantMarryYourself;
- if($progress != 1) goto L_GroomNotRegistered;
- if(@register >= 1) goto L_AlreadyRegistered;
- if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) goto L_BrideRegister2;
- mes "[Mary Happy]";
- if(sex == 1) mes "No problem sir, please fill out your name here.";
- if(sex == 0) mes "No problem mis, please fill out your name here.";
- mes "And I'll need to collect a 100,000z fee for your wedding fees and outfit.";
- next;
- if(zeny < 100000) goto L_NeedZeny2;
- mes "[Mary Happy]";
- mes "Now You Must Insert The Your Groom's Name";
- input $name2$;
- if($name2$ != $groom$) goto L_WrongName;
- set $bride$,strcharinfo(0);
- set @register,1;
- set zeny,zeny-100000;
- set $progress,2;
- set event_wedding,1;
- if(sex == 1) getitem 7170,1;
- if(sex == 0) getitem 2338,1;
- set @outfit,1;
- deltimer "weddinglimit1";
- addtimer 300000,"weddinglimit2";
- next;
- mes "[Mary Happy]";
- mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your wedding.";
- areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
- next;
- mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
- deltimer "a13";
- addtimer 300000,"a13";
- close;
-
-L_GroomRegister2:
- mes "[Mary Happy]";
- if(sex == 1) mes "No problem sir, please fill out your name here.";
- if(sex == 0) mes "No problem mis, please fill out your name here.";
- mes "And I'll need to collect a 60,000z fee for your wedding fees.";
- next;
- mes "[Mary Happy]";
- mes "Now You Must Insert The Your Bride's Name";
- input $name$;
- next;
- if(zeny < 60000) goto L_NeedZeny3;
- set $groom$,strcharinfo(0);
- set @register,1;
- set zeny,zeny-60000;
- set $progress,1;
- mes "[Mary Happy]";
- mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your marriage.";
- addtimer 300000,"weddinglimit1";
- areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
- next;
- mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
- deltimer "a13";
- addtimer 300000,"a13";
- close;
-L_BrideRegister2:
- mes "[Mary Happy]";
- if(sex == 1) mes "No problem sir, please fill out your name here.";
- if(sex == 0) mes "No problem mis, please fill out your name here.";
- mes "And I'll need to collect a 50,000z fee for your wedding fees.";
- next;
- if(zeny < 50000) goto L_NeedZeny4;
- mes "[Mary Happy]";
- mes "Now You Must Insert The Your Groom's Name";
- input $name2$;
- if($name2$ != $groom$) goto L_WrongName;
- set $bride$,strcharinfo(0);
- set @register,1;
- set zeny,zeny-50000;
- set $progress,2;
- set event_wedding,1;
- deltimer "weddinglimit1";
- addtimer 300000,"weddinglimit2";
- next;
- mes "[Mary Happy]";
- mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your wedding.";
- areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
- next;
- mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
- deltimer "a13";
- addtimer 300000,"a13";
- close;
-
-L_NeedZeny1:
- set @zleft,120000-zeny;
- mes "[Mary Happy]";
- mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
- set @zleft,0;
- close;
-L_NeedZeny2:
- set @zleft,100000-zeny;
- mes "[Mary Happy]";
- mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
- set @zleft,0;
- close;
-L_NeedZeny3:
- set @zleft,60000-zeny;
- mes "[Mary Happy]";
- mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
- set @zleft,0;
- close;
-L_NeedZeny4:
- set @zleft,50000-zeny;
- mes "[Mary Happy]";
- mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
- set @zleft,0;
- close;
-L_AlreadyRegistered:
- mes "[Mary Happy]";
- mes "You can't register a second time silly.";
- close;
-
-L_Bye:
- mes "[Mary Happy]";
- mes "Alrighty then, come back soon!";
- close;
-
-L_InProgress:
- mes "[Mary Happy]";
- mes "I cannot accept registrations while a wedding is in progress, try again later.";
- close;
-L_WrongName:
- mes "[Mary Happy]";
- mes "No one have registered with that name. Sorry.";
- close;
-L_GroomNotRegistered:
- mes "[Mary Happy]";
- mes "The groom must register first in order to initiate the wedding.";
- close;
-
-L_Married:
- mes "[Mary Happy]";
- mes "Hello again "+strcharinfo(0)+", I hope wish for the best of luck in your life.";
- close;
-L_LiveSolo:
- mes "[Mary Happy]";
- mes "Well live a happy bachelors life";
- close;
-L_NotBride:
- mes "[Mary Happy]";
- mes "You're not the bride";
- close;
-L_YouCantMarryYourself:
- mes "[Mary Happy]";
- mes "What the hell you trying to do? Marry yourself?O_O";
- close;
-}
-
-prt_church.gat,95,95,4 script Mary 71,{
- mes "[Mary Sad]";
- mes "Getting divorce can bring a lot of sorrow.";
- mes "By any chance, you you want to get divorced?";
- next;
- menu "I came to get a divorce",L_FirstDivorce,"What do I need for a divorce",L_DivorceSystem;
-L_FirstDivorce:
- if(divorce > 0) goto L_AlreadyDivorced;
- mes "[Mary Sad]";
- mes "So you came for a divorce, i have been divorced 2 times myself.";
- mes "Life will continue whoever said you need a partner was wrong.";
- mes "Dont forget that you and your partner must be online!";
- next;
- menu "Are you sure",-,"No i'm not ready",L_No;
- mes "[Mary Sad]";
- mes "You have made your choice,";
- mes "now you must live with it.";
- next;
- mes "You have been divorced!";
- set event_wedding,0;
- set divorce,1;
- set @register,0;
- divorce;
- close;
-L_AlreadyDivorced:
- mes "[Mary Sad]";
- mes "So you came for another divorce,wow you must be trying to find true love.";
- mes "Dont worry about it, it's not you, it's their fault.";
- next;
- menu "Are you sure",-,"No i'm not ready",L_No;
- mes "[Mary Sad]";
- mes "You have made your choice,";
- mes "now you must live with it.";
- next;
- mes "You have been divorced again!";
- set event_wedding,0;
- set divorce,2;
- set @register,0;
- divorce;
- close;
-L_No:
- mes "[Mary Sad]";
- mes "You should always be sure about what step you take in life.";
- close;
-L_DivorceSystem:
- mes "[Mary Sad]";
- mes "You just need to wish to not be married again and i will perform the divorce.";
- mes "Both you and your partner must be online.";
- close;
-}
-prt_church.gat,99,124,0 script weddinglimit1 -1,{
- announce "The bride has not registered within the alotted time frame.",3;
- announce "Your wedding has been cancelled.",3;
- set $progress,0;
- set $groom$,"null";
- set $name$,"null";
- set $name2$,"null";
- set @register,0;
- deltimer "a1";
- deltimer "a2";
- deltimer "a3";
- deltimer "a4";
- deltimer "a5";
- deltimer "a6";
- deltimer "a7";
- deltimer "a8";
- deltimer "a9";
- deltimer "a10";
- deltimer "a11";
- deltimer "a12";
-}
-
-prt_church.gat,99,124,0 script weddinglimit2 -1,{
- announce "The groom has not begun the wedding ceremony by speaking to Tristan the Third.",3;
- announce "Your wedding has been cancelled.",3;
- set $progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set $name$,"null";
- set $name2$,"null";
- set @register,0;
- set event_wedding,0;
- deltimer "a1";
- deltimer "a2";
- deltimer "a3";
- deltimer "a4";
- deltimer "a5";
- deltimer "a6";
- deltimer "a7";
- deltimer "a8";
- deltimer "a9";
- deltimer "a10";
- deltimer "a11";
- deltimer "a12";
-}
-
-prt_church.gat,99,124,0 script a1 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"Ladies and Gentlemen, We will now join in holy matrimony these two lovers.",0;
-}
-prt_church.gat,99,124,0 script a2 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"Now more than ever, will both of your lives be entwined together as so will be your souls.",0;
-}
-prt_church.gat,99,124,0 script a3 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"You will both honor and cherish each other through the best and worst of times.",0;
-}
-prt_church.gat,99,124,0 script a4 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"The safety and well being of your other will now also be your responsibility.",0;
-}
-prt_church.gat,99,124,0 script a5 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"May in sickness or good health, your love will burn bright as no force can extinguish it.",0;
-}
-prt_church.gat,99,124,0 script a6 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"Those here stand witness to these vows bestowed upon you, you must act accordingly to them.",0;
-}
-prt_church.gat,99,124,0 script a7 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"Understanding that, we are nothing more but mortals on this earth, but this is our triumph.",0;
-}
-prt_church.gat,99,124,0 script a8 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"We here will now join these two mortal entities, and create an immortal love.",0;
-}
-prt_church.gat,99,124,0 script a9 -1,{
-areaannounce "prt_church.gat",0,0,350,350,$groom$+", do you you wish to take "+$bride$+" as your lawfully beloved wife?",0;
-}
-prt_church.gat,99,124,0 script a10 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"And do you "+$bride$+", wish to take "+$groom$+" as your lawfully beloved husband?",0;
-}
-prt_church.gat,99,124,0 script a11 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"And so be it, by the powers vested in me...",0;
-}
-prt_church.gat,99,124,0 script a12 -1,{
-areaannounce "prt_church.gat",0,0,350,350,"I pronouce you Husband and Wife, you may kiss the bride.",0;
- wedding;
- set $progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set $name$,"null";
- set $name2$,"null";
-}
-prt_church.gat,99,124,0 script a13 -1,{
-
-areaannounce "prt_church.gat",0,0,350,350,"The wedding has been cancelled.",0;
- set $progress,0;
- set $groom$,"null";
- set $bride$,"null";
- set $name$,"null";
- set $name2$,"null";
- set @register,0;
- set event_wedding,0;
- set @get_ring,0;
+//////////////////////////////////////////////////////////
+// Wedding Script Alpha (v1.4) //
+//////////////////////////////////////////////////////////
+//
+//=====eAthena Script====================================
+// Wedding Script
+//=====By================================================
+// AppleGirl and Evera(version 1.0)
+//=====Current Version===================================
+// 1.4
+//=====Compatible With:==================================
+// Any eAthena Version; RO Episode 6+
+//=====Description=======================================
+// Fully working wedding script for all kind of weddings
+//=====Additional Comments:==============================
+// Tested and debugged by whocares (maybe 1-2 bugs left)(version 1.1)
+//======= Version 1.2 By ShadowLady =====================
+// Same Sex Weddings.
+// Now the script(npcs) tell the players how they must perform exactly.
+//======= Version 1.3 By ShadowLady =====================
+// You might need to update the wedding rings in item_db
+// Same for the tux/dress, so all classes and lvs can use it ^^
+// And check if they are wearing the tux/dress and not only have it on the inventory.
+//======= Version 1.4 By ShadowLady =====================
+// Added some code ideas. Thanks to Jbain for help me debbuging
+// Added @outfit variable, to check if you already bought a tux/dress
+// No need to buy a tuxedo/dress everytime you register anymore, unless you divorce
+// Fixed some of that bugged timers (*stares whocares*) Now it is exactly 5 minutes and not 2
+// Fixed "part" of the divorce npc. The code is bugged by itself -_- Need both chars to be online yet.
+////======= Version 1.45 By ShadowLady =====================
+// Fixed some minor bugs. Same-sex is disabled by default now.
+// Change $progress variable to $@progress, so it dont screw up the ceremony on a server crash.
+// Added a Special GM Menu to enable/disable same-sex weddings and reset most variables.
+//=======================================================
+// Variable Notes:
+//
+// event_wedding - 1 signifies marriage
+// $groom$ - Groom's name storage
+// $bride$ - Bride's name storage
+// $progress - Sets global restriction upon wedding
+// @register - Temporary registration check
+// @zleft - Temporary zeny needed check
+// $name$ - Insert name for bride
+// $name2$ - Insert name for groom
+// $get_ring - Check so you can't get ring twice
+// $reason$ - Objection to wedding
+// @outfit - Check if the char already got a dress or tuxedo from the npc
+// Tristan
+prt_church.gat,99,125,4 script Tristan the Third 108,{
+ if($groom$ == strcharinfo(0) && $progress != 3) goto L_GroomCeremony;
+ if(@register == 0) goto L_GroomNeedToRegister;
+ if($bride$ == strcharinfo(0)) goto L_BrideCeremony;
+ menu "Here To Attend",L_Wedding,"Here for another reason",L_OtherReason;
+L_GroomCeremony:
+ if(@register == 0) goto L_GroomNeedToRegister;
+ if($progress == 1) goto L_BrideNeedToRegister;
+ if($progress == 0) goto L_Wedding;
+ if(countitem(2613) < 1) goto L_NeedRing;//Items: Diamond_Ring,
+ if((getequipid(2) != 2338) && (getequipid(2) != 7170)) goto L_Attire;
+ mes "[Tristan the Third]";
+ mes "Everything is ready, it's your call now...";
+ next;
+ menu "Perform Wedding.",-,"Cancel Wedding.",L_CancelWedding;
+ set $progress,3;
+ mes "[Tristan the Third]";
+ mes "Well all you have to do now is the easy part input your bride's name, remember to spell it correctly.";
+ input $name2$;
+ next;
+ if($name2$ != $bride$) goto L_WrongBrideName;
+ deltimer "a13";
+ marriage $name2$;
+ mes "[Tristan the Third]";
+ mes "Please tell your wife to speak to me, and then we will start exchanging rings";
+ delitem 2613,1;//Items: Diamond_Ring,
+ getitem 2635,1;//Items: Wedding_Ring_F,
+ set @get_ring,1;
+ next;
+ mes "[Tristan the Third]";
+ mes "Will you and your bride please move onto the stand. I will now preform the Wedding Ceremony!";
+ set event_wedding,1;
+ deltimer "weddinglimit1";
+ deltimer "weddinglimit2";
+ announce "The Wedding of "+$groom$+" and "+$bride$+", will now be held at Prontera Church.",5;
+ addtimer 50000,"a1";
+ addtimer 55000,"a2";
+ addtimer 60000,"a3";
+ addtimer 65000,"a4";
+ addtimer 70000,"a5";
+ addtimer 75000,"a6";
+ addtimer 80000,"a7";
+ addtimer 85000,"a8";
+ addtimer 90000,"a9";
+ addtimer 95000,"a10";
+ addtimer 100000,"a11";
+ addtimer 105000,"a12";
+ close;
+L_BrideCeremony:
+ if(countitem(2613) < 1) goto L_NeedRing;//Items: Diamond_Ring,
+ if((getequipid(2) != 2338) && (getequipid(2) != 7170)) goto L_Attire;
+ mes "[Tristan the Third]";
+ mes "Well all you have to do now is the easy part input your groom's name, remember to spell it correctly.";
+ input $name$;
+ next;
+ if($name$ != $groom$) goto L_WrongGroomName;
+ deltimer "a13";
+ deltimer "weddinglimit1";
+ deltimer "weddinglimit2";
+ marriage $name$;
+ delitem 2613,1;//Items: Diamond_Ring,
+ getitem 2634,1;//Items: Wedding_Ring_M,
+ set @get_ring,1;
+ close;
+L_CancelWedding:
+ mes "[Tristan the Third]";
+ mes "The wedding has been cancelled by "+strcharinfo(0)+".";
+ set $progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set @register,0;
+ set event_wedding,0;
+ set @get_ring,0;
+ deltimer "a1";
+ deltimer "a2";
+ deltimer "a3";
+ deltimer "a4";
+ deltimer "a5";
+ deltimer "a6";
+ deltimer "a7";
+ deltimer "a8";
+ deltimer "a9";
+ deltimer "a10";
+ deltimer "a11";
+ deltimer "a12";
+ deltimer "a13";
+ close;
+L_GroomNeedToRegister:
+ mes "[Tristan the Third]";
+ mes "Hello, please register with Mary if you want me to perform a marriage for you.";
+ close;
+L_Wedding:
+ if(event_wedding != 1) goto L_Guest;
+ mes "[Tristan the Third]";
+ mes "Hello again "+strcharinfo(0)+", I hope wish for the best of luck in your life.";
+ close;
+L_BrideNeedToRegister:
+ mes "[Tristan the Third]";
+ mes "I'm sorry, I cannot start the ceremony if the bride has not registered yet.";
+ close;
+L_OtherReason:
+ if(@get_ring == 1) goto L_Wedding;
+ mes "[Tristan the Third]";
+ mes "Do you have a reason why these two should not be bonded in holy matrimony?";
+ next;
+ menu "Yes I Do.",-,"No",L_NoReason;
+ areaannounce "prt_church.gat",0,0,350,350,"Ladies and Gentlemen,"+strcharinfo(0)+" has an objection to this marriage",0;
+ mes "[Tristan the Third]";
+ mes "Please enter your reason, for this action.";
+ input $reason$;
+ next;
+ areaannounce "prt_church.gat",0,0,350,350,""+$reason$+"",0;
+ set $progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+ set @register,0;
+ set event_wedding,0;
+ set @get_ring,0;
+ deltimer "a1";
+ deltimer "a2";
+ deltimer "a3";
+ deltimer "a4";
+ deltimer "a5";
+ deltimer "a6";
+ deltimer "a7";
+ deltimer "a8";
+ deltimer "a9";
+ deltimer "a10";
+ deltimer "a11";
+ deltimer "a12";
+ mes "The wedding has been called off.";
+ close;
+L_NoReason:
+ if($groom$ == strcharinfo(0)) goto L_InProgress;
+ if($bride$ == strcharinfo(0)) goto L_InProgress;
+ mes "[Tristan the Third]";
+ mes "Please have a seat than and let me continue the wedding.";
+ close;
+L_Guest:
+ mes "[Tristan the Third]";
+ mes "Enjoy the cerimony.";
+ mes "But I must continue the cerimony, so lets talk after.";
+ close;
+L_InProgress:
+ mes "[Tristan the Third]";
+ mes "Your wedding is in progress, please try talking with me later.";
+ close;
+L_WrongBrideName:
+ mes "[Mary Happy]";
+ mes "How come you forgot your wife name!? Sorry come back later when you know who you want to marry.";
+ close;
+L_WrongGroomName:
+ mes "[Mary Happy]";
+ mes "How come you forgot your husband name!? Sorry come back later when you know who you want to marry.";
+ close;
+L_NeedRing:
+ mes "[Tristan the Third]";
+ mes "You need a Diamond Ring in order to perform the wedding.";
+ close;
+L_Attire:
+ if(sex == 1) goto L_NeedTuxedo;
+ if(sex == 0) goto L_NeedDress;
+ close;
+L_NeedTuxedo:
+ mes "[Tristan the Third]";
+ mes "You need a Tuxedo before we can continue the ceremony.";
+ close;
+L_NeedDress:
+ mes "[Tristan the Third]";
+ mes "Oh my is it your wedding day?";
+ mes "Well sorry to break it to you, you need a wedding dress to get married.";
+ close;
+}
+
+// Mary
+prt_church.gat,95,100,4 script Mary 71,{
+ mes "[Mary Happy]";
+ mes "Getting married bring a lot of joy.";
+ mes "By any chance, you you want to get engaged with someone?";
+ next;
+ menu "Explain the principles of Marrige",L_Principles,"How does the marrige system work.",L_WeddingSystem,"I want to get married with someone.",L_Marry,"I live solo forever!",L_LiveSolo,"Special Menu",L_GmMenu;
+L_GmMenu:
+ set @gmlevel,getgmlevel(50);
+ if(@gmlevel < 50) goto L_NotGM;
+ mes "Hello " + strcharinfo(0) + " How i can serve you?";
+ menu "Enable Same-Sex Weddings",L_EnableSameSex,"Disable Same-Sex Weddings",L_DisableSameSex,"Reset the Variables",L_ResetVariables,"Just Checking...",L_Bye;
+L_NotGM:
+ mes "You cant have access to this special menu " + strcharinfo(0) + "";
+ mes "Only GMs can change the ceremony options.";
+ close;
+L_EnableSameSex:
+ set $samesex,1;
+ mes "Same-Sex Weddings are enabled now!";
+ close;
+L_DisableSameSex:
+ set $samesex,0;
+ mes "Same-Sex Weddings are disabled now!";
+ close;
+L_ResetVariables:
+ set $@progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+ set @register,0;
+ set event_wedding,0;
+ set @get_ring,0;
+ set @outfit,0;
+ deltimer "weddinglimit1";
+ deltimer "weddinglimit2";
+ deltimer "a1";
+ deltimer "a2";
+ deltimer "a3";
+ deltimer "a4";
+ deltimer "a5";
+ deltimer "a6";
+ deltimer "a7";
+ deltimer "a8";
+ deltimer "a9";
+ deltimer "a10";
+ deltimer "a11";
+ deltimer "a12";
+ deltimer "a13";
+ mes "All variables are reseted and timers off!";
+ close;
+L_Principles:
+ mes "[Mary Happy]";
+ mes "His Majesty King Tristan III of the Rune Midgard Kingdom will be officiating this wedding, with the intent of blessing all the people through his noble message.";
+ next;
+ mes "[Mary Happy]";
+ mes "Although His Majesty has a rather busy agenda, for the sake of newly married couples, he has personally come here, to the Prontera Church.";
+ mes "It is the favor of our King that everyone would live happily ever after.";
+ next;
+ mes "[Mary Happy]";
+ mes "The proposal must be done with prudence and courtesy.";
+ mes "Once the wedlocks have been made, they cannot be undone.";
+ mes "The two who are united in marriage must be with the other forever until the day they leave this world.";
+ next;
+ mes "[Mary Happy]";
+ mes "Also, males only with females, and females only with males can be wed. Although there may be those who desire a homosexual or bestial marriage... it is approved.";
+ next;
+ mes "[Mary Happy]";
+ mes "If there is a significant other whom you want to spend the rest of your life with, then don't be shy to propose.";
+ mes "Wishing for many blessings upon couples who wish to live happily ever after..";
+ close;
+L_WeddingSystem:
+ mes "[Mary Happy]";
+ mes "First make sure both players a registered to get married.";
+ mes "Obviously, you must know each other to get married?";
+ mes "If both have registered, and you must be on the same party.";
+ mes "Then talk to Thristan the Third.";
+ next;
+ mes "[Mary Happy]";
+ mes "You must go to Thristan the Third,";
+ mes "and the Groom must talk to him first.";
+ mes "And you must tell him the Bride";
+ mes "you wish to get married with.";
+ mes "Be sure to tell him exactly who you want to marry.";
+ next;
+ mes "[Mary Happy]";
+ mes "After the Groom has spoken, next the Bride must talk.";
+ mes "Then when both of you have spoken each others names,";
+ mes "Thristan the third will read out both of your names.";
+ next;
+ mes "[Mary Happy]";
+ mes "After you have got married,";
+ mes "you will both recive a ring of marrige.";
+ mes "And as soon as both of you wear these rings,";
+ mes "you will be forever married with each other.";
+ mes "You can also be refused of a lasting marrige.";
+ mes "But, dont be sad.";
+ next;
+ mes "[Mary Happy]";
+ mes "If there are many people that wish to get married,";
+ mes "So please keep to the order you register.";
+ mes "Thristan does not do multiple marriges at once.";
+ mes "He will only see one couple at a time.";
+ next;
+ mes "[Mary Happy]";
+ mes "Lastly, you must put forth your name quickly";
+ mes "to Thristan the third.";
+ mes "After the male has said yes to marrage ";
+ mes "the female has 3 minutes to reply.";
+ mes "Or you shall forever never be able";
+ mes "to get married.";
+ next;
+ mes "[Mary Happy]";
+ mes "An easy way to write down the each others name,";
+ mes "Send a message to each other";
+ mes "then in the private message window press up";
+ next;
+ mes "[Mary Happy]";
+ mes "Then it will show the other persons name.";
+ mes "If you press ctrl + C that name will be saved.";
+ mes "Next time you need that name";
+ mes "you can press shift + insert.";
+ mes "Then you will get that name quickly and easily.";
+ next;
+ mes "[Mary Happy]";
+ mes "You should have a go at using this method.";
+ mes "Remeber, Press ctrl + C to save that name.";
+ next;
+ input $nametest$;
+ mes "[Mary Happy]";
+ mes "Hopefully you will remember this method.";
+ mes "If you ever decide to get married.";
+ mes "Remember to register.";
+ close;
+L_Marry:
+ mes "[Mary Happy]";
+ mes "If you wish to get married you must first register.";
+ mes "Male is ^FF00FF120,000^000000 zeny and female is ^FF00FF100,000^000000 zeny";
+ if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) mes "But only ^FF00FF60,000^000000 zeny for male and ^FF00FF50,000^000000 zeny for female if you already have registered before";
+ mes "Both male and female must have registered,";
+ mes "and both must have paid fees, have Diamond Rings and be on same party!";
+ mes "The Bride will get a Wedding Dress, while the Groom will get a Chinese Tuxedo";
+ next;
+ mes "[Mary Happy]";
+ mes "If both people have paid and meet recquirements";
+ mes "you are able to get married strait away.";
+ mes "One must be the Groom and the other the Bride.";
+ mes "Do you wish to register to get married?";
+ if($SameSex == 1) menu "I'm gonna be the Groom",-,"I,m gonna be the Bride",L_BrideRegister,"Never mind",L_Bye;
+ if(event_wedding == 1) goto L_Married;
+ if(@register >= 1) goto L_AlreadyRegistered;
+ if($progress >= 2) goto L_InProgress;
+ if(($samesex == 0) && (sex == 0)) goto L_BrideRegister;
+ if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) goto L_GroomRegister2;
+ mes "[Mary Happy]";
+ if(sex == 1) mes "No problem sir, please fill out your name here.";
+ if(sex == 0) mes "No problem miss, please fill out your name here.";
+ mes "And I'll need to collect a 120,000z fee for your wedding fees and outfit.";
+ next;
+ mes "[Mary Happy]";
+ mes "Now You Must Insert The Your Bride's Name";
+ input $name$;
+ next;
+ if(zeny < 120000) goto L_NeedZeny1;
+ set $groom$,strcharinfo(0);
+ set @register,1;
+ set zeny,zeny-120000;
+ set $progress,1;
+ if(sex == 1) getitem 7170,1;
+ if(sex == 0) getitem 2338,1;
+ set @outfit,1;
+ mes "[Mary Happy]";
+ mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your marriage.";
+ addtimer 300000,"weddinglimit1";
+ areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
+ next;
+ mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
+ deltimer "a13";
+ addtimer 300000,"a13";
+ close;
+L_BrideRegister:
+ if ($name$ != strcharinfo(0)) goto L_NotBride;
+ if($groom$ == strcharinfo(0)) goto L_CantMarryYourself;
+ if($progress != 1) goto L_GroomNotRegistered;
+ if(@register >= 1) goto L_AlreadyRegistered;
+ if((countitem(2338) > 0) || (countitem(7170) > 0) || (@outfit == 1)) goto L_BrideRegister2;
+ mes "[Mary Happy]";
+ if(sex == 1) mes "No problem sir, please fill out your name here.";
+ if(sex == 0) mes "No problem mis, please fill out your name here.";
+ mes "And I'll need to collect a 100,000z fee for your wedding fees and outfit.";
+ next;
+ if(zeny < 100000) goto L_NeedZeny2;
+ mes "[Mary Happy]";
+ mes "Now You Must Insert The Your Groom's Name";
+ input $name2$;
+ if($name2$ != $groom$) goto L_WrongName;
+ set $bride$,strcharinfo(0);
+ set @register,1;
+ set zeny,zeny-100000;
+ set $progress,2;
+ set event_wedding,1;
+ if(sex == 1) getitem 7170,1;
+ if(sex == 0) getitem 2338,1;
+ set @outfit,1;
+ deltimer "weddinglimit1";
+ addtimer 300000,"weddinglimit2";
+ next;
+ mes "[Mary Happy]";
+ mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your wedding.";
+ areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
+ next;
+ mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
+ deltimer "a13";
+ addtimer 300000,"a13";
+ close;
+
+L_GroomRegister2:
+ mes "[Mary Happy]";
+ if(sex == 1) mes "No problem sir, please fill out your name here.";
+ if(sex == 0) mes "No problem mis, please fill out your name here.";
+ mes "And I'll need to collect a 60,000z fee for your wedding fees.";
+ next;
+ mes "[Mary Happy]";
+ mes "Now You Must Insert The Your Bride's Name";
+ input $name$;
+ next;
+ if(zeny < 60000) goto L_NeedZeny3;
+ set $groom$,strcharinfo(0);
+ set @register,1;
+ set zeny,zeny-60000;
+ set $progress,1;
+ mes "[Mary Happy]";
+ mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your marriage.";
+ addtimer 300000,"weddinglimit1";
+ areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
+ next;
+ mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
+ deltimer "a13";
+ addtimer 300000,"a13";
+ close;
+L_BrideRegister2:
+ mes "[Mary Happy]";
+ if(sex == 1) mes "No problem sir, please fill out your name here.";
+ if(sex == 0) mes "No problem mis, please fill out your name here.";
+ mes "And I'll need to collect a 50,000z fee for your wedding fees.";
+ next;
+ if(zeny < 50000) goto L_NeedZeny4;
+ mes "[Mary Happy]";
+ mes "Now You Must Insert The Your Groom's Name";
+ input $name2$;
+ if($name2$ != $groom$) goto L_WrongName;
+ set $bride$,strcharinfo(0);
+ set @register,1;
+ set zeny,zeny-50000;
+ set $progress,2;
+ set event_wedding,1;
+ deltimer "weddinglimit1";
+ addtimer 300000,"weddinglimit2";
+ next;
+ mes "[Mary Happy]";
+ mes "You are now registered "+strcharinfo(0)+", I wish you the best of luck with your wedding.";
+ areaannounce "prt_church.gat",0,0,350,350,strcharinfo(0)+" has registered for the wedding.",0;
+ next;
+ mes "Please hurry to the altar. We have to be ready for another wedding in 5 minutes.";
+ deltimer "a13";
+ addtimer 300000,"a13";
+ close;
+
+L_NeedZeny1:
+ set @zleft,120000-zeny;
+ mes "[Mary Happy]";
+ mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
+ set @zleft,0;
+ close;
+L_NeedZeny2:
+ set @zleft,100000-zeny;
+ mes "[Mary Happy]";
+ mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
+ set @zleft,0;
+ close;
+L_NeedZeny3:
+ set @zleft,60000-zeny;
+ mes "[Mary Happy]";
+ mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
+ set @zleft,0;
+ close;
+L_NeedZeny4:
+ set @zleft,50000-zeny;
+ mes "[Mary Happy]";
+ mes "I'm terribly sorry, I am unable to register you. You seem to be "+@zleft+"z short.";
+ set @zleft,0;
+ close;
+L_AlreadyRegistered:
+ mes "[Mary Happy]";
+ mes "You can't register a second time silly.";
+ close;
+
+L_Bye:
+ mes "[Mary Happy]";
+ mes "Alrighty then, come back soon!";
+ close;
+
+L_InProgress:
+ mes "[Mary Happy]";
+ mes "I cannot accept registrations while a wedding is in progress, try again later.";
+ close;
+L_WrongName:
+ mes "[Mary Happy]";
+ mes "No one have registered with that name. Sorry.";
+ close;
+L_GroomNotRegistered:
+ mes "[Mary Happy]";
+ mes "The groom must register first in order to initiate the wedding.";
+ close;
+
+L_Married:
+ mes "[Mary Happy]";
+ mes "Hello again "+strcharinfo(0)+", I hope wish for the best of luck in your life.";
+ close;
+L_LiveSolo:
+ mes "[Mary Happy]";
+ mes "Well live a happy bachelors life";
+ close;
+L_NotBride:
+ mes "[Mary Happy]";
+ mes "You're not the bride";
+ close;
+L_YouCantMarryYourself:
+ mes "[Mary Happy]";
+ mes "What the hell you trying to do? Marry yourself?O_O";
+ close;
+}
+
+prt_church.gat,95,95,4 script Mary 71,{
+ mes "[Mary Sad]";
+ mes "Getting divorce can bring a lot of sorrow.";
+ mes "By any chance, you you want to get divorced?";
+ next;
+ menu "I came to get a divorce",L_FirstDivorce,"What do I need for a divorce",L_DivorceSystem;
+L_FirstDivorce:
+ if(divorce > 0) goto L_AlreadyDivorced;
+ mes "[Mary Sad]";
+ mes "So you came for a divorce, i have been divorced 2 times myself.";
+ mes "Life will continue whoever said you need a partner was wrong.";
+ mes "Dont forget that you and your partner must be online!";
+ next;
+ menu "Are you sure",-,"No i'm not ready",L_No;
+ mes "[Mary Sad]";
+ mes "You have made your choice,";
+ mes "now you must live with it.";
+ next;
+ mes "You have been divorced!";
+ set event_wedding,0;
+ set divorce,1;
+ set @register,0;
+ divorce;
+ close;
+L_AlreadyDivorced:
+ mes "[Mary Sad]";
+ mes "So you came for another divorce,wow you must be trying to find true love.";
+ mes "Dont worry about it, it's not you, it's their fault.";
+ next;
+ menu "Are you sure",-,"No i'm not ready",L_No;
+ mes "[Mary Sad]";
+ mes "You have made your choice,";
+ mes "now you must live with it.";
+ next;
+ mes "You have been divorced again!";
+ set event_wedding,0;
+ set divorce,2;
+ set @register,0;
+ divorce;
+ close;
+L_No:
+ mes "[Mary Sad]";
+ mes "You should always be sure about what step you take in life.";
+ close;
+L_DivorceSystem:
+ mes "[Mary Sad]";
+ mes "You just need to wish to not be married again and i will perform the divorce.";
+ mes "Both you and your partner must be online.";
+ close;
+}
+prt_church.gat,99,124,0 script weddinglimit1 -1,{
+ announce "The bride has not registered within the alotted time frame.",3;
+ announce "Your wedding has been cancelled.",3;
+ set $progress,0;
+ set $groom$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+ set @register,0;
+ deltimer "a1";
+ deltimer "a2";
+ deltimer "a3";
+ deltimer "a4";
+ deltimer "a5";
+ deltimer "a6";
+ deltimer "a7";
+ deltimer "a8";
+ deltimer "a9";
+ deltimer "a10";
+ deltimer "a11";
+ deltimer "a12";
+}
+
+prt_church.gat,99,124,0 script weddinglimit2 -1,{
+ announce "The groom has not begun the wedding ceremony by speaking to Tristan the Third.",3;
+ announce "Your wedding has been cancelled.",3;
+ set $progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+ set @register,0;
+ set event_wedding,0;
+ deltimer "a1";
+ deltimer "a2";
+ deltimer "a3";
+ deltimer "a4";
+ deltimer "a5";
+ deltimer "a6";
+ deltimer "a7";
+ deltimer "a8";
+ deltimer "a9";
+ deltimer "a10";
+ deltimer "a11";
+ deltimer "a12";
+}
+
+prt_church.gat,99,124,0 script a1 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"Ladies and Gentlemen, We will now join in holy matrimony these two lovers.",0;
+}
+prt_church.gat,99,124,0 script a2 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"Now more than ever, will both of your lives be entwined together as so will be your souls.",0;
+}
+prt_church.gat,99,124,0 script a3 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"You will both honor and cherish each other through the best and worst of times.",0;
+}
+prt_church.gat,99,124,0 script a4 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"The safety and well being of your other will now also be your responsibility.",0;
+}
+prt_church.gat,99,124,0 script a5 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"May in sickness or good health, your love will burn bright as no force can extinguish it.",0;
+}
+prt_church.gat,99,124,0 script a6 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"Those here stand witness to these vows bestowed upon you, you must act accordingly to them.",0;
+}
+prt_church.gat,99,124,0 script a7 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"Understanding that, we are nothing more but mortals on this earth, but this is our triumph.",0;
+}
+prt_church.gat,99,124,0 script a8 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"We here will now join these two mortal entities, and create an immortal love.",0;
+}
+prt_church.gat,99,124,0 script a9 -1,{
+areaannounce "prt_church.gat",0,0,350,350,$groom$+", do you you wish to take "+$bride$+" as your lawfully beloved wife?",0;
+}
+prt_church.gat,99,124,0 script a10 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"And do you "+$bride$+", wish to take "+$groom$+" as your lawfully beloved husband?",0;
+}
+prt_church.gat,99,124,0 script a11 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"And so be it, by the powers vested in me...",0;
+}
+prt_church.gat,99,124,0 script a12 -1,{
+areaannounce "prt_church.gat",0,0,350,350,"I pronouce you Husband and Wife, you may kiss the bride.",0;
+ wedding;
+ set $progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+}
+prt_church.gat,99,124,0 script a13 -1,{
+
+areaannounce "prt_church.gat",0,0,350,350,"The wedding has been cancelled.",0;
+ set $progress,0;
+ set $groom$,"null";
+ set $bride$,"null";
+ set $name$,"null";
+ set $name2$,"null";
+ set @register,0;
+ set event_wedding,0;
+ set @get_ring,0;
} \ No newline at end of file
diff --git a/npc/other/weddingtxt.txt b/npc/other/weddingtxt.txt
index 2caea19d6..1bc3a47c3 100644
--- a/npc/other/weddingtxt.txt
+++ b/npc/other/weddingtxt.txt
@@ -1,277 +1,277 @@
-//UNFINISHED! need to set names and give rings!
-//Made by AppleGirl and Evera/Lorri.
-//PROPERTY OF eATHENA! OTHER ATHENAS DON'T TOUCH THIS!
-//Note: permanent variables event_marriage. 0=nothing done yet 1=m registered 2=f registered 3=m before ring 4=f before ring 5=m married 6=f married
-
-prt_church.gat,99,125,8 script Tristan the Third 108,{
-mes "[Thristan the Third]";
-if(event_marriage == 0) goto Lreg;
-if(event_marriage == 1) goto Lmale;
-if(event_marriage == 2) goto Lfemale;
-if(event_marriage == 3) && (countitem(2634)<1) || (event_marriage == 3) && (getequipname(136) == 2634) goto Lmcere;
-if(event_marriage == 4) && (countitem(2635)<1) || (event_marriage == 4) && (getequipname(136) == 2635) goto Lfcere;
-if(event_marriage >= 5) goto Lhappy;
-//else goto Lhappy;
-//if(even
-Lreg:
-mes "If you wish to get married you must first register";
-Lmale:
-if (getequipname(16) == 7170) goto Lmale2;
-if (getequipname(16) != 7170) goto Lmale3;
-mes "OmG1! H4X0Rz!1";
-close;
-Lmale2:
-if (zeny >= 30000) goto Lmale4;
-if (zeny <= 29999) goto Lmale3;
-mes "OmG1! H4X0Rz!1";
-close;
-//NOTE! Triggers to save/respond names aren't done!
-Lmale4:
- mes "Hello, how are you doing this wonderful day? Ah. I see you've registered to marry";
- mes "Do you wish to marry?";
-menu
-"yes",Lmyes,"No",Lcancel;
-Lmyes:
-//enable for input; can't be done with current script.c
-// mes"What is your bride's name?";
-// input @namemale;
- next;
- mes "I will now collect your ^FF00FFmoney^000000.";
- set Zeny, Zeny-30000;
- next;
-//enable for input; can't be done with current script.c
-// input @namemale;
- mes "Here is the ring. Please put it on your bride's hand";
- mes "By the holy power invested in me..";
- mes "I now pronounce you husband and wife!";
- mes "you may now kiss the bride.";
- emotion 46;
-//enable for setvariable
- set event_marriage,3;
- getitem 2634,1;
- close;
-Lmale3:
- mes "Hm, have you forgotten to bring your ^FF00FFTuxedo^000000 or ^FF00FFmoney^000000?";
- mes "Have a good look for it.";
- mes "Because you must bring it in order to get married.";
- mes "If you have it right now, please show me";
-close;
-Lfemale:
-if (zeny >= 20000) goto Lfemale4;
-if (zeny <= 19999) goto Lfemale3;
-mes "OmG1! H4X0Rz!1";
-close;
-Lfemale4:
- mes "Hello, how are you doing this wonderful day? Ah. I see you've registered to marry";
- mes "Do you wish to marry?";
-menu
-"yes",Lfyes,"No",Lcancel;
-Lfyes:
-//enable for input; can't be done with current script.c
-// mes "What is your groom's name?";
-// input @namefemale;
- next;
- mes "I will now collect your ^FF00FFmoney^000000.";
- set Zeny, Zeny-20000;
- next;
-//enable for input; can't be done with current script.c
- input @namefemale;
- mes "Here is the ring. Please put it on your groom's hand";
- mes "By the holy power invested in me..";
- mes "I now pronounce you husband and wife!";
-//enable for setvariable
- set event_marriage,4;
- getitem 2635,1;
- close;
-Lfemale3:
- mes "Hm, have you forgotten to bring your ^FF00FFWedding Veil^000000, ^FF00FFWedding Dress^000000, or ^FF00FFMoney^000000?";
- mes "Have a good look for it.";
- mes "Because you must bring it in order to get married.";
- mes "If you have it right now, please show me";
-close;
-Lmcere:
- mes "By the holy power invested in me..";
- mes "I now pronounce you husband and wife!";
- mes "you may now kiss the bride.";
- emotion 46;
- set event_marriage,5;
-close;
-Lfcere:
-
- mes "By the holy power invested in me..";
- mes "I now pronounce you husband and wife!";
- emotion 46;
- set event_marriage,6;
-close;
-Lhappy:
-mes "I hope your marriage is happy and successful!";
-close;
-Lcancel:
-mes "A true pity. I hope to see you another time.";
-close;
-}
-prt_church.gat,95,100,3 script Mary 71,{
-mes "[Mary Happy]";
-if(event_marriage == 0) goto Lstart;
-if(event_marriage != 0) goto Lhappy;
-mes "OmG1! H4X0Rz!1";
-close;
-Lstart:
-mes "Getting married bring a lot of joy.";
-mes "By any chance, you you want to get engaged with someone?";
-next;
-menu "Explain the principles of Marrige",Lprinciples,"How does the marrige system work.",Lsystem,"I want to get married with someone.",Lmarried,"I live solo forever!",Lsolo;
-
-Lprinciples:
- mes "[Mary Happy]";
- mes "His Majesty King Tristan III of the Rune Midgard Kingdom will be officiating this wedding, with the intent of blessing all the people through his noble message.";
- next;
- mes "[Mary Happy]";
- mes "Although His Majesty has a rather busy agenda, for the sake of newly married couples, he has personally come here, to the Prontera Church.";
- mes "It is the favor of our King that everyone would live happily ever after.";
- next;
- mes "[Mary Happy]";
- mes "The proposal must be done with prudence and courtesy.";
- mes "Once the wedlocks have been made, they cannot be undone.";
- mes "The two who are united in marriage must be with the other forever until the day they leave this world.";
- next;
- mes "[Mary Happy]";
- mes "Also, males only with females, and females only with males can be wed. Although there may be those who desire a homosexual or bestial marriage... it is not approved.";
- next;
- mes "[Mary Happy]";
- mes "If there is a significant other whom you want to spend the rest of your life with, then don't be shy to propose.";
- mes "Wishing for many blessings upon couples who wish to live happily ever after..";
- close;
-Lsystem:
- mes "[Mary Happy]";
- mes "First make sure both players a registered to get married.";
- mes "Obviously, you must know each other to get married?";
- mes "If both have registered, and you must be on the same party.";
- mes "Then talk to Thristan the Third.";
- next;
- mes "[Mary Happy]";
- mes "You must go to Thristan the Third,";
- mes "and the male must talk to him first.";
- mes "And you must tell him the girl";
- mes "you wish to get married with.";
- mes "Be sure to tell him exactly who you want to marry.";
- next;
- mes "[Mary Happy]";
- mes "After the male has spoken, next the female must talk.";
- mes "Then when both of you have spoken each others names,";
- mes "Thristan the third will read out both of your names.";
- next;
- mes "[Mary Happy]";
- mes "After you have got married,";
- mes "you will both recive a ring of marrige.";
- mes "And as soon as both of you wear these rings,";
- mes "you will be forever married with each other.";
- mes "You can also be refused of a lasting marrige.";
- mes "But, dont be sad.";
- next;
- mes "[Mary Happy]";
- mes "If there are many people that wish to get married,";
- mes "So please keep to the order you register.";
- mes "Thristan does not do multiple marriges at once.";
- mes "He will only see one couple at a time.";
- next;
- mes "[Mary Happy]";
- mes "Lastly, you must put forth your name quickly";
- mes "to Thristan the third.";
- mes "After the male has said yes to marrage ";
- mes "the female has 3 minutes to reply.";
- mes "Or you shall forever never be able";
- mes "to get married.";
- next;
- mes "[Mary Happy]";
- mes "An easy way to write down the each others name,";
- mes "Send a message to each other";
- mes "then in the private message window press up";
- next;
-//o_O who removed this part? we use a diff system now
-// mes "[Mary Happy]";
-// mes "Then it will show the other persons name.";
-// mes "If you press ctrl + C that name will be saved.";
-// mes "Next time you need that name";
-// mes "you can press shift + insert.";
-// mes "Then you will get that name quickly and easily.";
-// next;
-// mes "[Mary Happy]";
-// mes "You should have a go at using this method.";
-// mes "Remeber, Press ctrl + C to save that name.";
-// next;
-// input @nametest;
- mes "[Mary Happy]";
- mes "Hopefully you will remember this method.";
- mes "If you ever decide to get married.";
- mes "Remember to register.";
-Lmarried:
- mes "[Mary Happy]";
- mes "If you wish to get married you must first register.";
- mes "Male is ^FF00FF30,000^000000 zeny and female is ^FF00FF20,000^000000 zeny";
- mes "Both male and female must have registered,";
- mes "and both must have paid fees,";
- mes "and the female must have a wedding veil.";
- next;
- mes "[Mary Happy]";
- mes "If both people have paid and meet recquirements";
- mes "you are able to get married strait away.";
- mes "Do you wish to register to get married?";
- menu "Yes",LYes,"No",LNo;
-LYes:
-//add check for sex and if veil and tuxedo and wedding dress
-if (Sex == 1) goto Lmale;
-if (Sex == 0) goto Lfemale;
-Lmale:
-if (getequipname(16) == 7170) goto Lmale2;
-if (getequipname(16) != 7170) goto Lmale3;
-mes "[Mary Happy]";
-mes "OmG1! H4X0Rz!1";
-close;
-Lmale2:
-if (zeny >= 30000) goto Lmale4;
-if (zeny <= 29999) goto Lmale3;
-mes "[Mary Happy]";
-mes "OmG1! H4X0Rz!1";
-close;
-Lmale4:
- set event_marriage,1;
- mes "[Mary Happy]";
- mes "You are now registered =) go talk to his majesty, King Tristan III for your marriage.";
-close;
-Lmale3:
- mes "[Mary Happy]";
- mes "Hm, have you forgotten to bring your ^FF00FFTuxedo^000000 or ^FF00FFmoney^000000?";
- mes "Have a good look for it.";
- mes "Because you must bring it in order to get married.";
- mes "If you have it right now, please show me";
-close;
-
-Lfemale:
-if (getequipname(16) == 2338) && (getequipname(256) == 2206) goto Lfemale2;
-if (getequipname(16) != 2338) || (getequipname(256) == 2206) goto Lfemale3;
-mes "[Mary Happy]";
-mes "OmG1! H4X0Rz!1";
-Lfemale2:
-if (zeny >= 20000) goto Lfemale4;
-if (zeny <= 19999) goto Lfemale3;
-mes "[Mary Happy]";
-mes "OmG1! H4X0Rz!1";
-Lfemale4:
- set event_marriage,2;
- mes "[Mary Happy]";
- mes "You are now registered =) go talk to his majesty, King Tristan III for your marriage.";
-Lfemale3:
- mes "[Mary Happy]";
- mes "Hm, have you forgotten to bring your ^FF00FFWedding Veil^000000, ^FF00FFWedding Dress^000000, or ^FF00FFMoney^000000?";
- mes "Have a good look for it.";
- mes "Because you must bring it in order to get married.";
- mes "If you have it right now, please show me";
-close;
-LNo:
- mes "I hope you have a wonderful day!";
-close;
-Lhappy:
- mes "I hope your marriage is happy and successful!";
-close;
+//UNFINISHED! need to set names and give rings!
+//Made by AppleGirl and Evera/Lorri.
+//PROPERTY OF eATHENA! OTHER ATHENAS DON'T TOUCH THIS!
+//Note: permanent variables event_marriage. 0=nothing done yet 1=m registered 2=f registered 3=m before ring 4=f before ring 5=m married 6=f married
+
+prt_church.gat,99,125,8 script Tristan the Third 108,{
+mes "[Thristan the Third]";
+if(event_marriage == 0) goto Lreg;
+if(event_marriage == 1) goto Lmale;
+if(event_marriage == 2) goto Lfemale;
+if(event_marriage == 3) && (countitem(2634)<1) || (event_marriage == 3) && (getequipname(136) == 2634) goto Lmcere;
+if(event_marriage == 4) && (countitem(2635)<1) || (event_marriage == 4) && (getequipname(136) == 2635) goto Lfcere;
+if(event_marriage >= 5) goto Lhappy;
+//else goto Lhappy;
+//if(even
+Lreg:
+mes "If you wish to get married you must first register";
+Lmale:
+if (getequipname(16) == 7170) goto Lmale2;
+if (getequipname(16) != 7170) goto Lmale3;
+mes "OmG1! H4X0Rz!1";
+close;
+Lmale2:
+if (zeny >= 30000) goto Lmale4;
+if (zeny <= 29999) goto Lmale3;
+mes "OmG1! H4X0Rz!1";
+close;
+//NOTE! Triggers to save/respond names aren't done!
+Lmale4:
+ mes "Hello, how are you doing this wonderful day? Ah. I see you've registered to marry";
+ mes "Do you wish to marry?";
+menu
+"yes",Lmyes,"No",Lcancel;
+Lmyes:
+//enable for input; can't be done with current script.c
+// mes"What is your bride's name?";
+// input @namemale;
+ next;
+ mes "I will now collect your ^FF00FFmoney^000000.";
+ set Zeny, Zeny-30000;
+ next;
+//enable for input; can't be done with current script.c
+// input @namemale;
+ mes "Here is the ring. Please put it on your bride's hand";
+ mes "By the holy power invested in me..";
+ mes "I now pronounce you husband and wife!";
+ mes "you may now kiss the bride.";
+ emotion 46;
+//enable for setvariable
+ set event_marriage,3;
+ getitem 2634,1;
+ close;
+Lmale3:
+ mes "Hm, have you forgotten to bring your ^FF00FFTuxedo^000000 or ^FF00FFmoney^000000?";
+ mes "Have a good look for it.";
+ mes "Because you must bring it in order to get married.";
+ mes "If you have it right now, please show me";
+close;
+Lfemale:
+if (zeny >= 20000) goto Lfemale4;
+if (zeny <= 19999) goto Lfemale3;
+mes "OmG1! H4X0Rz!1";
+close;
+Lfemale4:
+ mes "Hello, how are you doing this wonderful day? Ah. I see you've registered to marry";
+ mes "Do you wish to marry?";
+menu
+"yes",Lfyes,"No",Lcancel;
+Lfyes:
+//enable for input; can't be done with current script.c
+// mes "What is your groom's name?";
+// input @namefemale;
+ next;
+ mes "I will now collect your ^FF00FFmoney^000000.";
+ set Zeny, Zeny-20000;
+ next;
+//enable for input; can't be done with current script.c
+ input @namefemale;
+ mes "Here is the ring. Please put it on your groom's hand";
+ mes "By the holy power invested in me..";
+ mes "I now pronounce you husband and wife!";
+//enable for setvariable
+ set event_marriage,4;
+ getitem 2635,1;
+ close;
+Lfemale3:
+ mes "Hm, have you forgotten to bring your ^FF00FFWedding Veil^000000, ^FF00FFWedding Dress^000000, or ^FF00FFMoney^000000?";
+ mes "Have a good look for it.";
+ mes "Because you must bring it in order to get married.";
+ mes "If you have it right now, please show me";
+close;
+Lmcere:
+ mes "By the holy power invested in me..";
+ mes "I now pronounce you husband and wife!";
+ mes "you may now kiss the bride.";
+ emotion 46;
+ set event_marriage,5;
+close;
+Lfcere:
+
+ mes "By the holy power invested in me..";
+ mes "I now pronounce you husband and wife!";
+ emotion 46;
+ set event_marriage,6;
+close;
+Lhappy:
+mes "I hope your marriage is happy and successful!";
+close;
+Lcancel:
+mes "A true pity. I hope to see you another time.";
+close;
+}
+prt_church.gat,95,100,3 script Mary 71,{
+mes "[Mary Happy]";
+if(event_marriage == 0) goto Lstart;
+if(event_marriage != 0) goto Lhappy;
+mes "OmG1! H4X0Rz!1";
+close;
+Lstart:
+mes "Getting married bring a lot of joy.";
+mes "By any chance, you you want to get engaged with someone?";
+next;
+menu "Explain the principles of Marrige",Lprinciples,"How does the marrige system work.",Lsystem,"I want to get married with someone.",Lmarried,"I live solo forever!",Lsolo;
+
+Lprinciples:
+ mes "[Mary Happy]";
+ mes "His Majesty King Tristan III of the Rune Midgard Kingdom will be officiating this wedding, with the intent of blessing all the people through his noble message.";
+ next;
+ mes "[Mary Happy]";
+ mes "Although His Majesty has a rather busy agenda, for the sake of newly married couples, he has personally come here, to the Prontera Church.";
+ mes "It is the favor of our King that everyone would live happily ever after.";
+ next;
+ mes "[Mary Happy]";
+ mes "The proposal must be done with prudence and courtesy.";
+ mes "Once the wedlocks have been made, they cannot be undone.";
+ mes "The two who are united in marriage must be with the other forever until the day they leave this world.";
+ next;
+ mes "[Mary Happy]";
+ mes "Also, males only with females, and females only with males can be wed. Although there may be those who desire a homosexual or bestial marriage... it is not approved.";
+ next;
+ mes "[Mary Happy]";
+ mes "If there is a significant other whom you want to spend the rest of your life with, then don't be shy to propose.";
+ mes "Wishing for many blessings upon couples who wish to live happily ever after..";
+ close;
+Lsystem:
+ mes "[Mary Happy]";
+ mes "First make sure both players a registered to get married.";
+ mes "Obviously, you must know each other to get married?";
+ mes "If both have registered, and you must be on the same party.";
+ mes "Then talk to Thristan the Third.";
+ next;
+ mes "[Mary Happy]";
+ mes "You must go to Thristan the Third,";
+ mes "and the male must talk to him first.";
+ mes "And you must tell him the girl";
+ mes "you wish to get married with.";
+ mes "Be sure to tell him exactly who you want to marry.";
+ next;
+ mes "[Mary Happy]";
+ mes "After the male has spoken, next the female must talk.";
+ mes "Then when both of you have spoken each others names,";
+ mes "Thristan the third will read out both of your names.";
+ next;
+ mes "[Mary Happy]";
+ mes "After you have got married,";
+ mes "you will both recive a ring of marrige.";
+ mes "And as soon as both of you wear these rings,";
+ mes "you will be forever married with each other.";
+ mes "You can also be refused of a lasting marrige.";
+ mes "But, dont be sad.";
+ next;
+ mes "[Mary Happy]";
+ mes "If there are many people that wish to get married,";
+ mes "So please keep to the order you register.";
+ mes "Thristan does not do multiple marriges at once.";
+ mes "He will only see one couple at a time.";
+ next;
+ mes "[Mary Happy]";
+ mes "Lastly, you must put forth your name quickly";
+ mes "to Thristan the third.";
+ mes "After the male has said yes to marrage ";
+ mes "the female has 3 minutes to reply.";
+ mes "Or you shall forever never be able";
+ mes "to get married.";
+ next;
+ mes "[Mary Happy]";
+ mes "An easy way to write down the each others name,";
+ mes "Send a message to each other";
+ mes "then in the private message window press up";
+ next;
+//o_O who removed this part? we use a diff system now
+// mes "[Mary Happy]";
+// mes "Then it will show the other persons name.";
+// mes "If you press ctrl + C that name will be saved.";
+// mes "Next time you need that name";
+// mes "you can press shift + insert.";
+// mes "Then you will get that name quickly and easily.";
+// next;
+// mes "[Mary Happy]";
+// mes "You should have a go at using this method.";
+// mes "Remeber, Press ctrl + C to save that name.";
+// next;
+// input @nametest;
+ mes "[Mary Happy]";
+ mes "Hopefully you will remember this method.";
+ mes "If you ever decide to get married.";
+ mes "Remember to register.";
+Lmarried:
+ mes "[Mary Happy]";
+ mes "If you wish to get married you must first register.";
+ mes "Male is ^FF00FF30,000^000000 zeny and female is ^FF00FF20,000^000000 zeny";
+ mes "Both male and female must have registered,";
+ mes "and both must have paid fees,";
+ mes "and the female must have a wedding veil.";
+ next;
+ mes "[Mary Happy]";
+ mes "If both people have paid and meet recquirements";
+ mes "you are able to get married strait away.";
+ mes "Do you wish to register to get married?";
+ menu "Yes",LYes,"No",LNo;
+LYes:
+//add check for sex and if veil and tuxedo and wedding dress
+if (Sex == 1) goto Lmale;
+if (Sex == 0) goto Lfemale;
+Lmale:
+if (getequipname(16) == 7170) goto Lmale2;
+if (getequipname(16) != 7170) goto Lmale3;
+mes "[Mary Happy]";
+mes "OmG1! H4X0Rz!1";
+close;
+Lmale2:
+if (zeny >= 30000) goto Lmale4;
+if (zeny <= 29999) goto Lmale3;
+mes "[Mary Happy]";
+mes "OmG1! H4X0Rz!1";
+close;
+Lmale4:
+ set event_marriage,1;
+ mes "[Mary Happy]";
+ mes "You are now registered =) go talk to his majesty, King Tristan III for your marriage.";
+close;
+Lmale3:
+ mes "[Mary Happy]";
+ mes "Hm, have you forgotten to bring your ^FF00FFTuxedo^000000 or ^FF00FFmoney^000000?";
+ mes "Have a good look for it.";
+ mes "Because you must bring it in order to get married.";
+ mes "If you have it right now, please show me";
+close;
+
+Lfemale:
+if (getequipname(16) == 2338) && (getequipname(256) == 2206) goto Lfemale2;
+if (getequipname(16) != 2338) || (getequipname(256) == 2206) goto Lfemale3;
+mes "[Mary Happy]";
+mes "OmG1! H4X0Rz!1";
+Lfemale2:
+if (zeny >= 20000) goto Lfemale4;
+if (zeny <= 19999) goto Lfemale3;
+mes "[Mary Happy]";
+mes "OmG1! H4X0Rz!1";
+Lfemale4:
+ set event_marriage,2;
+ mes "[Mary Happy]";
+ mes "You are now registered =) go talk to his majesty, King Tristan III for your marriage.";
+Lfemale3:
+ mes "[Mary Happy]";
+ mes "Hm, have you forgotten to bring your ^FF00FFWedding Veil^000000, ^FF00FFWedding Dress^000000, or ^FF00FFMoney^000000?";
+ mes "Have a good look for it.";
+ mes "Because you must bring it in order to get married.";
+ mes "If you have it right now, please show me";
+close;
+LNo:
+ mes "I hope you have a wonderful day!";
+close;
+Lhappy:
+ mes "I hope your marriage is happy and successful!";
+close;
} \ No newline at end of file
diff --git a/npc/quests/all_quest.txt b/npc/quests/all_quest.txt
index b33100897..a6a6e3264 100644
--- a/npc/quests/all_quest.txt
+++ b/npc/quests/all_quest.txt
@@ -1,570 +1,570 @@
-//===== eAthena Script =======================================
-//= Some Quests Gathered Together
-//===== By: ==================================================
-//= eAthena Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Just some quests
-//===== Additional Comments: =================================
-//= Don't use it.
-//============================================================
-
-prontera.gat,147,204,4 script Quest Assistant 93,{
- mes "[Quest Assistant]";
- mes "Hello! I'm the Quest Assistant.";
- mes "Please select the Quest you need information on:";
- next;
- menu "Mr. Smile",MrSmile,"Bunny Band",BunBand,"Pretend Murdered",PreMur,"Welding Mask",WelMask,"Ear Muffs",EarMuf,"Antlers",Antler,"Stop Post",StopPas,"Doctor Hat",DocHat,"Feather Bonnet",FeaBon,"Phantom of Opera",PhaOpe,"Sakkat",Sakkat,"Boy's Cap",BoyCap,"Ph.D Hat",PhdHat,"Oxygen Mask",OxyMask,"Headset",Headset,"Binoculars",Binoc,"Cancel",MCancel;
-// Mr. Smile
-MrSmile:
- mes "[Quest Assistant]";
- mes "Hi.";
- mes "This is Smile Assistance.";
- mes "How may I help you?";
- next;
- menu "^3355FFMr. Smile^000000?",L0,"Construct ^3355FFMr. Smile^000000",L1,"Quit",LEnd;
-L0:
- mes "[Quest Assistant]";
- mes "National Event held by the command of ^0099FFHis Majesty Tristram the 3rd^000000, that intends to encourage the nation of the Rune-Midgard Kingdom to play in more enjoyable atmosphere!";
- mes "I am ^0099FF'Smile Assistance'^000000,";
- mes "... who leads the national event under the name of ^0099FFSmile throughout the Rune-Midgard Kingdom^000000.";
- next;
- mes "[Quest Assistant]";
- mes "^^3355FF10 Jellopy^000000";
- mes "^^3355FF10 Fluff^000000";
- mes "^^3355FF10 Clover^000000";
- next;
- mes "[Quest Assistant]";
- mes "With this event";
- mes "Everybody will be happy and smile, getting together with other people,";
- mes "And will try to make Ragnarok the most enjoyable game in the world.";
- close;
-L1:
- if (countitem(705) < 10) goto L10;
- if (countitem(909) < 10) goto L10;
- if (countitem(914) < 10) goto L10;
- delitem 705,10;
- delitem 909,10;
- delitem 914,10;
- getitem 2278,1;
- mes "[Quest Assistant]";
- mes "His majesty, Tristram the 3rd has promised to try his best to make Ragnarok better and more enjoyable.";
- next;
- mes "[Quest Assistant]";
- mes "The fact mentioned above was announced by the Public Information Bureau of the Rune-Midgard Kingdom.";
- close;
-L10:
- mes "[Quest Assistant]";
- mes "Oh - unfortunately";
- mes "You have not brought enough items for ^3355FFMr. Smile^000000.";
- mes "^3355FF10 Jellopy";
- mes "^3355FF10 Fluff";
- mes "^3355FF10 Clover";
- mes "Please check the requirementes above.";
- close;
-LEnd:
- mes "[Quest Assistant]";
- mes "Changed your mind eh? Well, come see me when you need a ^3355FFMr. Smile^000000!";
- close;
-// Bunny Band
-BunBand:
- mes "[Quest Assistant]";
- mes "^529DFFSpecial Festival, ^3355FFBunny Band^529DFFQuest!!^000000";
- mes "Would you like to attend? You need ^3355FF'100 Feather'^000000 + ^3355FF'1 Four Leaf Clover'^000000 + ^3355FF'1 Pearl'^000000 + ^3355FF'1 Kitty Band'^000000.";
- next;
- menu "Sure, I need one.",LYes,"Cancel.",LCancel;
-LYes:
- if(countitem(949) < 100) goto LNoItems;
- if(countitem(706) < 1) goto LNoItems;
- if(countitem(722) < 1) goto LNoItems;
- if(countitem(2213) < 1) goto LNoItems;
- delitem 949,100;
- delitem 706,1;
- delitem 722,1;
- delitem 2213,1;
- getitem 2214,1;
- mes "[Quest Assistant]";
- mes "Tah Dah!!! ^3355FF'Bunny Band'^000000...! Please Take it!";
- close;
-LNoItems:
- mes "Thank you for joining us!";
- mes "Please come back after gathering all Items for a Bunny Band!";
- close;
-LCancel:
- mes "[Quest Assistant]";
- mes "That's too bad. Come back soon!";
- close;
-// Pretend Murder
-PreMur:
- mes "[Quest Assistant]";
- mes "I wish I could make Clothings for my Grand Children in this festive season..";
- mes "Could you find me ^3355FF'Skirt of Virgin'^000000 ..I need Four of them ..Please ?";
- mes "I am begging you, Young man..";
- next;
- menu "Alright.",LYes1,"No way!",LNo1;
-LYes1:
- if(countitem(1049) < 3) goto LNoHat;
- delitem 1049,4;
- getitem 2293,1;
- mes "[Quest Assistant]";
- mes "Oh Thank you so much!";
- mes "Ah.. Wait.. I almost forgot. Well, I was a quite popular actress back in my younger days...";
- mes "My members gave me a ^3355FF'Pretend Murder'^000000 for my wedding present when I left the Troupe...I've kept it for the precious memory of my youth.";
- close;
-LNo1:
- mes "[Quest Assistant]";
- mes "Sigh..How can I get ^3355FF'Skirt of Virgin'^000000 by myself...I am so weak and tired ..Sigh..";
- mes "I really wanted to make my Babies Happy .....";
- close;
-LNoHat:
- mes "[Quest Assistant]";
- mes "I gather Mushrooms on the Mountin of Payon Everyday.I didn't even noticed time has come because of my bad memory....";
- mes ".. Hmm..Now I remember of a festive season in next month.";
- mes "I wish I could make clothings for my family in this season.";
- mes "For that, I need 4 ^3355FF'Skirt of Virgin'^000000..";
- next;
- mes "[Quest Assistant]";
- mes "Young man, please help me. When you find Some ^3355FF'Skirt of Virgin '^000000..";
- mes "please bring them to me. I won't forget it if you help me...";
- close;
-// Welding Mask
-WelMask:
- mes "[Quest Assistant]";
- mes "Who am I? I am the one and only Veteran Blacksmith in here! You heard?!";
- mes "I've been working for 30 years in this hotty, bloody Hellfire!";
- mes "Since I became a Blacksmith, I invented something really incredible. Wanna listen?";
- next;
- menu "I'd love to.",LILoveTo,"I don't think so.",LIDont;
-LILoveTo:
- mes "[Quest Assistant]";
- mes "We always make various Metal products with welding Steel under horribly hot conditions.";
- mes "So we have to face the hot-air heating and metallic fluid. Our faces are almost burnt down and sometimes injured while working...";
- mes "But with this, You dont have to be worried! The so-called .. ^3355FF' Welding Mask '^000000 !!";
- next;
- mes "[Quest Assistant]";
- mes "This one keeps your face out of the heat.";
- mes "This Must be a Most-Wanted Item !";
- mes "So how's that ? If you offer me ^3355FF'50 Steels '^000000 and ^3355FFOnly 2000 Zeny^000000,I will make it for you right away~!!";
- next;
- menu "Not bad. Alright!",LNotBad,"No thanks.",LNoThx;
-LNotBad:
- if (countitem(999) < 50) goto LHeyDork;
- if (Zeny < 2000) goto LHeyDork;
- delitem 999,50;
- set Zeny,zeny-2000;
- getitem 2292,1;
- mes "[Quest Assistant]";
- mes "I like you,Dude! Alright, I'll do it right away !!";
- mes "You are the best guy I've ever met!";
- mes "Bye bye Buddy";
- close;
-LHeyDork:
- mes "[Quest Assistant]";
- mes "Hey Dork. If you don't have enough Steels or money, Get LOST!!";
- mes "Have you ever heard about Quenching? It 's not easy as you think!";
- mes "Go get some money or whatever my Craft needs!!!!";
- close;
-LNoThx:
- mes "[Quest Assistant]";
- mes "Oh Man ! You'll probably regret this. I recommanded it for you, not me !";
- mes "Man, Everyone gets older and older. You should take care of your bloody face before it starts shirinking!";
- close;
-LIDont:
- mes "[Quest Assistant]";
- mes "I think I've wasted my precious time on you.. I have nothing more to say. Be on your way!";
- close;
-// Ear Muffs
-EarMuf:
- mes "[Quest Assistant]";
- mes "My Family has produced and sold the special Winter product ^3355FF'Ear Muffs'^000000 for many years..";
- mes "We just moved in here, but unfortunately the Weather is always Warm so we hardly live with our Job...";
- mes "If you plan to travel to the cold area I suggest you to prepare ^3355FF'Ear Muffs'^000000..";
- next;
- mes "[Quest Assistant]";
- mes "^3355FF'Ear Muffs'^000000 are the special product of my family. We provide it to customers who have ^F3355FF'1 Cursed Rubi'^000000, ^3355FF'1 Headset'^000000";
- mes "^3355FF'200 Feathers'^000000 and ^DDDD00'5000 Zeny'^000000.";
- next;
- menu "Oh Yeah? Sounds Good.",LSoundsGood,"No thank you.",LNoThx1;
-
- LSoundsGood:
- if(countitem(724) < 1) goto LWeCant;
- if(countitem(949) < 200) goto LWeCant;
- if(countitem(5001) < 1) goto LWeCant;
- if(Zeny < 5000) goto LWeCant;
- delitem 724,1;
- delitem 949,200;
- delitem 5001,1;
- set Zeny,Zeny-5000;
- getitem 2283,1;
- mes "[Quest Assistant]";
- mes "I will give you this ready-made one.";
- mes "Thank you for buying our product. You won't regret your purchase. Satisfaction is Guaranteed.";
- close;
-LWeCant:
- mes "[Quest Assistant]";
- mes "Dear .. You don't have enough money and items ..";
- mes "We can't help you if you don't bring every item needed. Please understand we have to make our living...";
- close;
-LNoThx1:
- mes "[Quest Assistant]";
- mes "That's fine. I believe we will meet again one of these days ..";
- close;
-// Antlers
-Antler:
- mes "[Quest Assistant]";
- mes "Hey I am a Horn Collector. Sonds Great, Huh?";
- mes "What do you think about Animal horns? I think they are worth it to collect.";
- mes "Besides you can decorate your house with them.";
- next;
- mes "[Quest Assistant]";
- mes "By the way..I realised there are horns I couldn't get yet. They're called ^3355FF'Evil Horn'^000000..";
- mes "And some might say ^3355FF'Evil Horn'^000000 is not the sort of Animal horn but the Devil Horn..Still I really really wish I could have it.";
- mes "Do you....? Do you have the ^3355FF'Evil Horn'^000000?";
- mes "If you offer me ^3355FF'20 Evil Horn'^000000, I will give you my precious collectible, ^3355FF'Antlers'^000000. So Deal?";
- next;
- menu "Okay, Let's Deal.",LOk,"No Thanks",LNo2;
-LOk:
- if(countitem(923) < 20) goto LUnfortune;
- delitem 923,20;
- mes "[Quest Assistant]";
- getitem 2284,1;
- mes "Whoah! This is the first time I've ever seen a real ^3355FF'Evil Horn'^000000!!";
- mes "Thank you! Here,this is my Antler for you!";
- mes "With your great help, I can make my wish come true this time. I appreciate you!";
- close;
-LUnfortune:
- mes "[Quest Assistant]";
- mes "Hmm.. Unfortunately you are not ready for my demand, ^3355FF'20 Evil Horn'^000000.";
- close;
-LNo2:
- mes "[Quest Assistant]";
- mes "Well that's fine..";
- mes "I know we will speak again ..";
- close;
-// Stop Pass
-StopPas:
- mes "[Quest Assistant]";
- mes "Welcome to MacMillan's Post Workshop .";
- next;
- mes "[Quest Assistant]";
- mes "My Clan, MacMillan..";
- mes "Has been producing Professional Traffic Signal Posts for more than 250 years.";
- mes "And nowadays we are booking Special Orders with our Unique Ornament, ^3355FF'Stop Post'^000000.";
- next;
- mes "[Quest Assistant]";
- mes "This item requires:";
- mes "^3355FF50 Trunks^000000";
- mes "^3355FF1 Black Dyestuff^000000";
- mes "^3355FF90000 Zeny^000000";
- next;
- menu "Could I order one ^3355FF'Stop Post'^000000?",LOrder,"Nah, Not my business.",LNot;
-LOrder:
- if(countitem(1019) < 50) goto LCheckAgain;
- if(countitem(983) < 1) goto LCheckAgain;
- if(Zeny < 90000) goto LCheckAgain;
- delitem 1019,50;
- delitem 983,1;
- set Zeny,zeny-90000;
- getitem 2272,1;
- mes "[Quest Assistant]";
- mes "Here you are! This is the one and only Ornament for you, ^3355FF'Stop Post'^000000!";
- mes "Thank you for coming by!";
- close;
-LCheckAgain:
- mes "[Quest Assistant]";
- mes "Why don't you check the requirements again??";
- mes "I don't think you brought every items needed.";
- close;
-LNot:
- mes "[Quest Assistant]";
- mes "Anyway, Thank you for coming by, My Clan, MacMillan's Workshop.";
- close;
-// Doctor Hat
-DocHat:
- mes "[Quest Assistant]";
- mes "I am the Very Famous, Enigmatic Dealer!";
- mes "I am Always bustling in and out of the Midgard Continent!";
- mes "Here is what my product requires:";
- mes "^3355FFDoctor Band^000000: 1 Red Bandana + 50 Iron + 1 Cracked Diamond + 3500 Zeny";
- next;
- mes "[Quest Assistant]";
- mes "Would you like one of these?";
- next;
- menu "Sure!",LSure,"Nah, I'm ok.",LNo3;
-LSure:
- if(countitem(2285) < 1) goto CantMake;
- if(countitem(998) < 50) goto CantMake;
- if(Zeny < 3500) goto CantMake;
- delitem 2285,1;
- delitem 998,50;
- set Zeny,zeny-3500;
- getitem 2273,1;
- mes "[Quest Assistant]";
- mes "Hmm! Have you a Medical License?! Alright. I've heard about a well-known unlicensed physician `Cuwaki'.. I hope you won't get caught...";
- mes "Yeah... It's your business whatever. Take this.";
- close;
-CantMake:
- mes "[Quest Assistant]";
- mes "You Dullard. Check this requirements again.";
- mes "You Don't look like an idiot though....C'Mon Man. Get real!";
- close;
-LNo3:
- mes "[Quest Assistant]";
- mes "Well, see you around!";
- close;
-// Feather Bonnet
-FeaBon:
- mes "[Quest Assistant]";
- mes "I am the Very Famous, Enigmatic Dealer!";
- mes "I am Always bustling in and out of the Midgard Continent!";
- mes "Here is what my product requires:";
- mes "^3355FFFeather Bonnet^000000 : 1 Romantic Gent + 300 Feather of Birds + 500 Zeny";
- next;
- mes "[Quest Assistant]";
- mes "Would you like one of these?";
- next;
- menu "Sure!",LSure1,"Nah, I'm ok.",LNo4;
-LSure1:
- if(countitem(2247) < 1) goto CantMake1;
- if(countitem(916) < 300) goto CantMake1;
- if(Zeny < 500) goto CantMake1;
- delitem 2247,1;
- delitem 916,300;
- set Zeny,zeny-500;
- getitem 5018,1;
- mes "[Quest Assistant]";
- mes "You have good sense, Dude.";
- mes "I know you had a hard time to collect these, but this one is worth the effort. Take it.";
- close;
-CantMake1:
- mes "[Quest Assistant]";
- mes "You Dullard. Check this requirements again.";
- mes "You Don't look like an idiot though....C'Mon Man. Get real!";
- close;
-LNo4:
- mes "[Quest Assistant]";
- mes "Well, see you around!";
- close;
-// Phantom of Opera
-PhaOpe:
- mes "[Quest Assistant]";
- mes "I am the Very Famous, Enigmatic Dealer!";
- mes "I am Always bustling in and out of the Midgard Continent!";
- mes "Here is what my product requires:";
- mes "^3355FFPhantom of Opera^000000 : 20 Iron + 1 Singing Plant + 5000 Zeny";
- next;
- mes "[Quest Assistant]";
- mes "Would you like one of these?";
- next;
- menu "Sure!",LSure2,"Nah, I'm ok.",LNo5;
-LSure2:
- if(countitem(707) < 1) goto CantMake2;
- if(countitem(998) < 20) goto CantMake2;
- if(Zeny < 5000) goto CantMake2;
- delitem 707,1;
- delitem 998,20;
- set Zeny,zeny-5000;
- getitem 2281,1;
- mes "[Quest Assistant]";
- mes "This is a pretty nice one.";
- mes "Well, little bit Scary though.. I think it has a Magnetic Attraction. What about you?";
- mes "You like it.. Alright.. Take it!";
- close;
-CantMake2:
- mes "[Quest Assistant]";
- mes "You Dullard. Check this requirements again.";
- mes "You Don't look like an idiot though....C'Mon Man. Get real!";
- close;
-LNo5:
- mes "[Quest Assistant]";
- mes "Well, see you around!";
- close;
-// Sakkat
-Sakkat:
- mes "[Quest Assistant]";
- mes "I am the Very Famous, Enigmatic Dealer!";
- mes "I am Always bustling in and out of the Midgard Continent!";
- mes "Here is what my product requires:";
- mes "^3355FFSakkat^000000 : 120 Trunk + 10000 Zeny";
- mes "Would you like one of these?";
- next;
- menu "Sure!",LSure3,"Nah, I'm ok.",LNo6;
-LSure3:
- if(countitem(1019) < 120) goto CantMake3;
- if(Zeny < 10000) goto CantMake3;
- delitem 1019,120;
- set Zeny,zeny-5000;
- getitem 2280,1;
- mes "[Quest Assistant]";
- mes "If you have a chance to, visit the Uplander Village, Payon.";
- mes "The ^3355FFSakkat^000000 Dealer has never sold ^3355FFSakkat^000000 to other Dealers but to me. Because only I can recognise its quality. Due to its rarity, ^3355FFSakkat^000000 becomes a very Unique and Exceptional product.";
- mes "OK! Take it!";
- close;
-CantMake3:
- mes "[Quest Assistant]";
- mes "You Dullard. Check this requirements again.";
- mes "You Don't look like an idiot though....C'Mon Man. Get real!";
- close;
-LNo6:
- mes "[Quest Assistant]";
- mes "Well, see you around!";
- close;
-// Boy's Cap
-BoyCap:
- mes "[Quest Assistant]";
- mes "Ohhh !! Th ..This is the one..by hearsay ..";
- mes "Gain Strength even taking a look at it! Inflame the Blood even smelling once!";
- mes "80 year-old Grampa becomes a Boy after grabbing one bite of it!!!!";
- mes "It is the ^3355FFTiger's Footskin^000000!!";
- mes "Please bring me that.. I need 10 of them..";
- next;
- menu "Ok, here you go!",LExchange,"I don't have the time.",LCancel2;
- close;
-LExchange:
- if(countitem(1030) < 10) goto CantMake4;
- delitem 1030,10;
- getitem 5016,1;
- mes "[Quest Assistant]";
- mes "T .. Tahnk you !!";
- mes "Now I can be vigorous again with this item!";
- mes "I will eat this thing right away!";
- close;
-CantMake4:
- mes "[Quest Assistant]";
- mes "Oh... It seems you don't have enough ^3355FFTiger's Footskin^000000.";
- close;
-LCancel2:
- mes "[Quest Assistant]";
- mes "He.. Hey Young one!! Wai .. Wait!";
- close;
-// Ph.D Hat
-PhdHat:
- mes "[Quest Assistant]";
- mes "Ah .. Definately ..They are 4 kinds of Flowers I was looking for ..";
- mes "I need 1 ^3355FFIllusion Flower^000000 ,1 ^3355FFHinalle^000000,1 ^3355FFAloe^000000 and 1 ^3355FFMent^000000... If you can bring them to me, I could give you my treasue...";
- next;
- menu "Sure",LYes2,"Cancel",LCancel1;
-LYes2:
- if(countitem(710) < 1) goto LNoHat1;
- if(countitem(103) < 1) goto LNoHat1;
- if(countitem(704) < 1) goto LNoHat1;
- if(countitem(708) < 1) goto LNoHat1;
- delitem 710,1;
- delitem 703,1;
- delitem 704,1;
- delitem 708,1;
- getitem 5012,1;
- mes "[Quest Assistant]";
- mes "I really really appreciate you what you've done for me. I mean I am really grateful.";
- mes "I will give my precious item to you as I promised.";
- mes "This is a Hat worn on my Graduation Day in the University. It reminds me of my happy School days.";
- mes "Please take this...";
- close;
-LNoHat1:
- mes "[Quest Assistant]";
- mes "Don't you think... Flowers are pretty?";
- mes "Unfortunately, you don't have the ones I need.";
- close;
-LCancel1:
- mes "[Quest Assistant]";
- mes "One of thesedays I will cover whole world with Flowers.";
- close;
-// Oxygen Mask
-OxyMask:
- mes "[Quest Assistant]";
- mes "Ahh! These Thief Bugs are so cute! They hurt my eyes!";
- mes "I must have 5 ^3355FFOra Ora^000000 to make it stop!";
- mes "In return, I can give you this ^3355FFOxygen Mask^000000";
- next;
- menu "No Problem!",LYes3,"What?!?",LCancel6;
-LYes3:
- if(countitem(701) < 5) goto LNoMask;
- delitem 701,5;
- getitem 5004,1;
- mes "[Quest Assistant]";
- mes "Muhahahahah!!! Finally I have this! Ora Ora!";
- mes "Stupid and Disgusting Thief Bugs!! You will get payed for !!!";
- close;
-LNoMask:
- mes "[Quest Assistant]";
- mes "AHHHHHH!!! You don't have the stuff!";
- close;
-LCancel6:
- mes "[Quest Assistant]";
- mes "Huhuhuhuhu... What If I could not get rid of Thief Bugs...";
- mes "Only one thing I could do is to Fall in Love with them..Hehehehehehe...";
- close;
-// Headset
-Headset:
- mes "[Quest Assistant]";
- mes "These are Articles needed for my Grandfather's masterpiece.";
- mes "^3355FF100 Steel^000000";
- mes "^3355FF1 Oridecon^000000";
- mes "^3355FF1 Alchol^000000";
- mes "^3355FF1 Coal^000000";
- mes "Will you help me?";
- next;
- menu "Sure Thing.",LYes4,"No Thanks",LCancel3;
-LYes4:
- if(countitem(999) < 40) goto LNoItems2;
- if(countitem(984) < 1) goto LNoItems2;
- if(countitem(970) < 1) goto LNoItems2;
- if(countitem(1003) < 1) goto LNoItems2;
- delitem 999,40;
- delitem 984,1;
- delitem 970,1;
- delitem 1003,1;
- getitem 5001,1;
- mes "[Quest Assistant]";
- mes "Thank you.";
- mes "Because of you,I could accomplish my grand father's wish.";
- mes "He would be happy if he look down on me from the Heaven..";
- close;
-LNoItems2:
- mes "[Quest Assistant]";
- mes "Thank you for trying to help me ..But you didn't bring whole items I need.";
- mes "I think you will make it soon though...";
- close;
-LCancel3:
- mes "[Quest Assistant]";
- mes "Fare well.";
- close;
-// Binoculars
-Binoc:
- mes "[Quest Assistant]";
- mes "Howdi - A new customer !";
- mes "Stop!!! I know I know what you're gonna talk about.";
- mes "You want the ^3355FFBinoculars^000000 from me,right ?";
- mes "Just gimme ^3355FF1 Geek Glasses^000000, ^3355FF40 Steel^000000, and 50,000 Zeny.";
- next;
- menu "Yeah, sure.",LYes5,"Ignore him!",LCancel4;
-LYes5:
- if(countitem(2243) < 1) goto LNoItems1;
- if(countitem(999) < 100) goto LNoItems1;
- delitem 2243,1;
- delitem 999,100;
- set Zeny,zeny-50000;
- getitem 2296,1;
- mes "[Quest Assistant]";
- mes "Here it is! The Binoculars!";
- close;
-LNoItems1:
- mes "[Quest Assistant]";
- mes "Man, don't take me for a fool! You don't have the items!!";
- close;
-LCancel4:
- mes "[Quest Assistant]";
- mes "Hey you!";
- mes "Now you're in front of Marius,";
- mes "Alchemist of the Alchemists!";
- mes "Do you ignore me now, Huh???";
- mes "Come on!! I beat your ass!!!";
- close;
-MCancel:
- mes "[Quest Assistant]";
- mes "I see. I will be here whenever you need me!";
- close;
+//===== eAthena Script =======================================
+//= Some Quests Gathered Together
+//===== By: ==================================================
+//= eAthena Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Just some quests
+//===== Additional Comments: =================================
+//= Don't use it.
+//============================================================
+
+prontera.gat,147,204,4 script Quest Assistant 93,{
+ mes "[Quest Assistant]";
+ mes "Hello! I'm the Quest Assistant.";
+ mes "Please select the Quest you need information on:";
+ next;
+ menu "Mr. Smile",MrSmile,"Bunny Band",BunBand,"Pretend Murdered",PreMur,"Welding Mask",WelMask,"Ear Muffs",EarMuf,"Antlers",Antler,"Stop Post",StopPas,"Doctor Hat",DocHat,"Feather Bonnet",FeaBon,"Phantom of Opera",PhaOpe,"Sakkat",Sakkat,"Boy's Cap",BoyCap,"Ph.D Hat",PhdHat,"Oxygen Mask",OxyMask,"Headset",Headset,"Binoculars",Binoc,"Cancel",MCancel;
+// Mr. Smile
+MrSmile:
+ mes "[Quest Assistant]";
+ mes "Hi.";
+ mes "This is Smile Assistance.";
+ mes "How may I help you?";
+ next;
+ menu "^3355FFMr. Smile^000000?",L0,"Construct ^3355FFMr. Smile^000000",L1,"Quit",LEnd;
+L0:
+ mes "[Quest Assistant]";
+ mes "National Event held by the command of ^0099FFHis Majesty Tristram the 3rd^000000, that intends to encourage the nation of the Rune-Midgard Kingdom to play in more enjoyable atmosphere!";
+ mes "I am ^0099FF'Smile Assistance'^000000,";
+ mes "... who leads the national event under the name of ^0099FFSmile throughout the Rune-Midgard Kingdom^000000.";
+ next;
+ mes "[Quest Assistant]";
+ mes "^^3355FF10 Jellopy^000000";
+ mes "^^3355FF10 Fluff^000000";
+ mes "^^3355FF10 Clover^000000";
+ next;
+ mes "[Quest Assistant]";
+ mes "With this event";
+ mes "Everybody will be happy and smile, getting together with other people,";
+ mes "And will try to make Ragnarok the most enjoyable game in the world.";
+ close;
+L1:
+ if (countitem(705) < 10) goto L10;
+ if (countitem(909) < 10) goto L10;
+ if (countitem(914) < 10) goto L10;
+ delitem 705,10;
+ delitem 909,10;
+ delitem 914,10;
+ getitem 2278,1;
+ mes "[Quest Assistant]";
+ mes "His majesty, Tristram the 3rd has promised to try his best to make Ragnarok better and more enjoyable.";
+ next;
+ mes "[Quest Assistant]";
+ mes "The fact mentioned above was announced by the Public Information Bureau of the Rune-Midgard Kingdom.";
+ close;
+L10:
+ mes "[Quest Assistant]";
+ mes "Oh - unfortunately";
+ mes "You have not brought enough items for ^3355FFMr. Smile^000000.";
+ mes "^3355FF10 Jellopy";
+ mes "^3355FF10 Fluff";
+ mes "^3355FF10 Clover";
+ mes "Please check the requirementes above.";
+ close;
+LEnd:
+ mes "[Quest Assistant]";
+ mes "Changed your mind eh? Well, come see me when you need a ^3355FFMr. Smile^000000!";
+ close;
+// Bunny Band
+BunBand:
+ mes "[Quest Assistant]";
+ mes "^529DFFSpecial Festival, ^3355FFBunny Band^529DFFQuest!!^000000";
+ mes "Would you like to attend? You need ^3355FF'100 Feather'^000000 + ^3355FF'1 Four Leaf Clover'^000000 + ^3355FF'1 Pearl'^000000 + ^3355FF'1 Kitty Band'^000000.";
+ next;
+ menu "Sure, I need one.",LYes,"Cancel.",LCancel;
+LYes:
+ if(countitem(949) < 100) goto LNoItems;
+ if(countitem(706) < 1) goto LNoItems;
+ if(countitem(722) < 1) goto LNoItems;
+ if(countitem(2213) < 1) goto LNoItems;
+ delitem 949,100;
+ delitem 706,1;
+ delitem 722,1;
+ delitem 2213,1;
+ getitem 2214,1;
+ mes "[Quest Assistant]";
+ mes "Tah Dah!!! ^3355FF'Bunny Band'^000000...! Please Take it!";
+ close;
+LNoItems:
+ mes "Thank you for joining us!";
+ mes "Please come back after gathering all Items for a Bunny Band!";
+ close;
+LCancel:
+ mes "[Quest Assistant]";
+ mes "That's too bad. Come back soon!";
+ close;
+// Pretend Murder
+PreMur:
+ mes "[Quest Assistant]";
+ mes "I wish I could make Clothings for my Grand Children in this festive season..";
+ mes "Could you find me ^3355FF'Skirt of Virgin'^000000 ..I need Four of them ..Please ?";
+ mes "I am begging you, Young man..";
+ next;
+ menu "Alright.",LYes1,"No way!",LNo1;
+LYes1:
+ if(countitem(1049) < 3) goto LNoHat;
+ delitem 1049,4;
+ getitem 2293,1;
+ mes "[Quest Assistant]";
+ mes "Oh Thank you so much!";
+ mes "Ah.. Wait.. I almost forgot. Well, I was a quite popular actress back in my younger days...";
+ mes "My members gave me a ^3355FF'Pretend Murder'^000000 for my wedding present when I left the Troupe...I've kept it for the precious memory of my youth.";
+ close;
+LNo1:
+ mes "[Quest Assistant]";
+ mes "Sigh..How can I get ^3355FF'Skirt of Virgin'^000000 by myself...I am so weak and tired ..Sigh..";
+ mes "I really wanted to make my Babies Happy .....";
+ close;
+LNoHat:
+ mes "[Quest Assistant]";
+ mes "I gather Mushrooms on the Mountin of Payon Everyday.I didn't even noticed time has come because of my bad memory....";
+ mes ".. Hmm..Now I remember of a festive season in next month.";
+ mes "I wish I could make clothings for my family in this season.";
+ mes "For that, I need 4 ^3355FF'Skirt of Virgin'^000000..";
+ next;
+ mes "[Quest Assistant]";
+ mes "Young man, please help me. When you find Some ^3355FF'Skirt of Virgin '^000000..";
+ mes "please bring them to me. I won't forget it if you help me...";
+ close;
+// Welding Mask
+WelMask:
+ mes "[Quest Assistant]";
+ mes "Who am I? I am the one and only Veteran Blacksmith in here! You heard?!";
+ mes "I've been working for 30 years in this hotty, bloody Hellfire!";
+ mes "Since I became a Blacksmith, I invented something really incredible. Wanna listen?";
+ next;
+ menu "I'd love to.",LILoveTo,"I don't think so.",LIDont;
+LILoveTo:
+ mes "[Quest Assistant]";
+ mes "We always make various Metal products with welding Steel under horribly hot conditions.";
+ mes "So we have to face the hot-air heating and metallic fluid. Our faces are almost burnt down and sometimes injured while working...";
+ mes "But with this, You dont have to be worried! The so-called .. ^3355FF' Welding Mask '^000000 !!";
+ next;
+ mes "[Quest Assistant]";
+ mes "This one keeps your face out of the heat.";
+ mes "This Must be a Most-Wanted Item !";
+ mes "So how's that ? If you offer me ^3355FF'50 Steels '^000000 and ^3355FFOnly 2000 Zeny^000000,I will make it for you right away~!!";
+ next;
+ menu "Not bad. Alright!",LNotBad,"No thanks.",LNoThx;
+LNotBad:
+ if (countitem(999) < 50) goto LHeyDork;
+ if (Zeny < 2000) goto LHeyDork;
+ delitem 999,50;
+ set Zeny,zeny-2000;
+ getitem 2292,1;
+ mes "[Quest Assistant]";
+ mes "I like you,Dude! Alright, I'll do it right away !!";
+ mes "You are the best guy I've ever met!";
+ mes "Bye bye Buddy";
+ close;
+LHeyDork:
+ mes "[Quest Assistant]";
+ mes "Hey Dork. If you don't have enough Steels or money, Get LOST!!";
+ mes "Have you ever heard about Quenching? It 's not easy as you think!";
+ mes "Go get some money or whatever my Craft needs!!!!";
+ close;
+LNoThx:
+ mes "[Quest Assistant]";
+ mes "Oh Man ! You'll probably regret this. I recommanded it for you, not me !";
+ mes "Man, Everyone gets older and older. You should take care of your bloody face before it starts shirinking!";
+ close;
+LIDont:
+ mes "[Quest Assistant]";
+ mes "I think I've wasted my precious time on you.. I have nothing more to say. Be on your way!";
+ close;
+// Ear Muffs
+EarMuf:
+ mes "[Quest Assistant]";
+ mes "My Family has produced and sold the special Winter product ^3355FF'Ear Muffs'^000000 for many years..";
+ mes "We just moved in here, but unfortunately the Weather is always Warm so we hardly live with our Job...";
+ mes "If you plan to travel to the cold area I suggest you to prepare ^3355FF'Ear Muffs'^000000..";
+ next;
+ mes "[Quest Assistant]";
+ mes "^3355FF'Ear Muffs'^000000 are the special product of my family. We provide it to customers who have ^F3355FF'1 Cursed Rubi'^000000, ^3355FF'1 Headset'^000000";
+ mes "^3355FF'200 Feathers'^000000 and ^DDDD00'5000 Zeny'^000000.";
+ next;
+ menu "Oh Yeah? Sounds Good.",LSoundsGood,"No thank you.",LNoThx1;
+
+ LSoundsGood:
+ if(countitem(724) < 1) goto LWeCant;
+ if(countitem(949) < 200) goto LWeCant;
+ if(countitem(5001) < 1) goto LWeCant;
+ if(Zeny < 5000) goto LWeCant;
+ delitem 724,1;
+ delitem 949,200;
+ delitem 5001,1;
+ set Zeny,Zeny-5000;
+ getitem 2283,1;
+ mes "[Quest Assistant]";
+ mes "I will give you this ready-made one.";
+ mes "Thank you for buying our product. You won't regret your purchase. Satisfaction is Guaranteed.";
+ close;
+LWeCant:
+ mes "[Quest Assistant]";
+ mes "Dear .. You don't have enough money and items ..";
+ mes "We can't help you if you don't bring every item needed. Please understand we have to make our living...";
+ close;
+LNoThx1:
+ mes "[Quest Assistant]";
+ mes "That's fine. I believe we will meet again one of these days ..";
+ close;
+// Antlers
+Antler:
+ mes "[Quest Assistant]";
+ mes "Hey I am a Horn Collector. Sonds Great, Huh?";
+ mes "What do you think about Animal horns? I think they are worth it to collect.";
+ mes "Besides you can decorate your house with them.";
+ next;
+ mes "[Quest Assistant]";
+ mes "By the way..I realised there are horns I couldn't get yet. They're called ^3355FF'Evil Horn'^000000..";
+ mes "And some might say ^3355FF'Evil Horn'^000000 is not the sort of Animal horn but the Devil Horn..Still I really really wish I could have it.";
+ mes "Do you....? Do you have the ^3355FF'Evil Horn'^000000?";
+ mes "If you offer me ^3355FF'20 Evil Horn'^000000, I will give you my precious collectible, ^3355FF'Antlers'^000000. So Deal?";
+ next;
+ menu "Okay, Let's Deal.",LOk,"No Thanks",LNo2;
+LOk:
+ if(countitem(923) < 20) goto LUnfortune;
+ delitem 923,20;
+ mes "[Quest Assistant]";
+ getitem 2284,1;
+ mes "Whoah! This is the first time I've ever seen a real ^3355FF'Evil Horn'^000000!!";
+ mes "Thank you! Here,this is my Antler for you!";
+ mes "With your great help, I can make my wish come true this time. I appreciate you!";
+ close;
+LUnfortune:
+ mes "[Quest Assistant]";
+ mes "Hmm.. Unfortunately you are not ready for my demand, ^3355FF'20 Evil Horn'^000000.";
+ close;
+LNo2:
+ mes "[Quest Assistant]";
+ mes "Well that's fine..";
+ mes "I know we will speak again ..";
+ close;
+// Stop Pass
+StopPas:
+ mes "[Quest Assistant]";
+ mes "Welcome to MacMillan's Post Workshop .";
+ next;
+ mes "[Quest Assistant]";
+ mes "My Clan, MacMillan..";
+ mes "Has been producing Professional Traffic Signal Posts for more than 250 years.";
+ mes "And nowadays we are booking Special Orders with our Unique Ornament, ^3355FF'Stop Post'^000000.";
+ next;
+ mes "[Quest Assistant]";
+ mes "This item requires:";
+ mes "^3355FF50 Trunks^000000";
+ mes "^3355FF1 Black Dyestuff^000000";
+ mes "^3355FF90000 Zeny^000000";
+ next;
+ menu "Could I order one ^3355FF'Stop Post'^000000?",LOrder,"Nah, Not my business.",LNot;
+LOrder:
+ if(countitem(1019) < 50) goto LCheckAgain;
+ if(countitem(983) < 1) goto LCheckAgain;
+ if(Zeny < 90000) goto LCheckAgain;
+ delitem 1019,50;
+ delitem 983,1;
+ set Zeny,zeny-90000;
+ getitem 2272,1;
+ mes "[Quest Assistant]";
+ mes "Here you are! This is the one and only Ornament for you, ^3355FF'Stop Post'^000000!";
+ mes "Thank you for coming by!";
+ close;
+LCheckAgain:
+ mes "[Quest Assistant]";
+ mes "Why don't you check the requirements again??";
+ mes "I don't think you brought every items needed.";
+ close;
+LNot:
+ mes "[Quest Assistant]";
+ mes "Anyway, Thank you for coming by, My Clan, MacMillan's Workshop.";
+ close;
+// Doctor Hat
+DocHat:
+ mes "[Quest Assistant]";
+ mes "I am the Very Famous, Enigmatic Dealer!";
+ mes "I am Always bustling in and out of the Midgard Continent!";
+ mes "Here is what my product requires:";
+ mes "^3355FFDoctor Band^000000: 1 Red Bandana + 50 Iron + 1 Cracked Diamond + 3500 Zeny";
+ next;
+ mes "[Quest Assistant]";
+ mes "Would you like one of these?";
+ next;
+ menu "Sure!",LSure,"Nah, I'm ok.",LNo3;
+LSure:
+ if(countitem(2285) < 1) goto CantMake;
+ if(countitem(998) < 50) goto CantMake;
+ if(Zeny < 3500) goto CantMake;
+ delitem 2285,1;
+ delitem 998,50;
+ set Zeny,zeny-3500;
+ getitem 2273,1;
+ mes "[Quest Assistant]";
+ mes "Hmm! Have you a Medical License?! Alright. I've heard about a well-known unlicensed physician `Cuwaki'.. I hope you won't get caught...";
+ mes "Yeah... It's your business whatever. Take this.";
+ close;
+CantMake:
+ mes "[Quest Assistant]";
+ mes "You Dullard. Check this requirements again.";
+ mes "You Don't look like an idiot though....C'Mon Man. Get real!";
+ close;
+LNo3:
+ mes "[Quest Assistant]";
+ mes "Well, see you around!";
+ close;
+// Feather Bonnet
+FeaBon:
+ mes "[Quest Assistant]";
+ mes "I am the Very Famous, Enigmatic Dealer!";
+ mes "I am Always bustling in and out of the Midgard Continent!";
+ mes "Here is what my product requires:";
+ mes "^3355FFFeather Bonnet^000000 : 1 Romantic Gent + 300 Feather of Birds + 500 Zeny";
+ next;
+ mes "[Quest Assistant]";
+ mes "Would you like one of these?";
+ next;
+ menu "Sure!",LSure1,"Nah, I'm ok.",LNo4;
+LSure1:
+ if(countitem(2247) < 1) goto CantMake1;
+ if(countitem(916) < 300) goto CantMake1;
+ if(Zeny < 500) goto CantMake1;
+ delitem 2247,1;
+ delitem 916,300;
+ set Zeny,zeny-500;
+ getitem 5018,1;
+ mes "[Quest Assistant]";
+ mes "You have good sense, Dude.";
+ mes "I know you had a hard time to collect these, but this one is worth the effort. Take it.";
+ close;
+CantMake1:
+ mes "[Quest Assistant]";
+ mes "You Dullard. Check this requirements again.";
+ mes "You Don't look like an idiot though....C'Mon Man. Get real!";
+ close;
+LNo4:
+ mes "[Quest Assistant]";
+ mes "Well, see you around!";
+ close;
+// Phantom of Opera
+PhaOpe:
+ mes "[Quest Assistant]";
+ mes "I am the Very Famous, Enigmatic Dealer!";
+ mes "I am Always bustling in and out of the Midgard Continent!";
+ mes "Here is what my product requires:";
+ mes "^3355FFPhantom of Opera^000000 : 20 Iron + 1 Singing Plant + 5000 Zeny";
+ next;
+ mes "[Quest Assistant]";
+ mes "Would you like one of these?";
+ next;
+ menu "Sure!",LSure2,"Nah, I'm ok.",LNo5;
+LSure2:
+ if(countitem(707) < 1) goto CantMake2;
+ if(countitem(998) < 20) goto CantMake2;
+ if(Zeny < 5000) goto CantMake2;
+ delitem 707,1;
+ delitem 998,20;
+ set Zeny,zeny-5000;
+ getitem 2281,1;
+ mes "[Quest Assistant]";
+ mes "This is a pretty nice one.";
+ mes "Well, little bit Scary though.. I think it has a Magnetic Attraction. What about you?";
+ mes "You like it.. Alright.. Take it!";
+ close;
+CantMake2:
+ mes "[Quest Assistant]";
+ mes "You Dullard. Check this requirements again.";
+ mes "You Don't look like an idiot though....C'Mon Man. Get real!";
+ close;
+LNo5:
+ mes "[Quest Assistant]";
+ mes "Well, see you around!";
+ close;
+// Sakkat
+Sakkat:
+ mes "[Quest Assistant]";
+ mes "I am the Very Famous, Enigmatic Dealer!";
+ mes "I am Always bustling in and out of the Midgard Continent!";
+ mes "Here is what my product requires:";
+ mes "^3355FFSakkat^000000 : 120 Trunk + 10000 Zeny";
+ mes "Would you like one of these?";
+ next;
+ menu "Sure!",LSure3,"Nah, I'm ok.",LNo6;
+LSure3:
+ if(countitem(1019) < 120) goto CantMake3;
+ if(Zeny < 10000) goto CantMake3;
+ delitem 1019,120;
+ set Zeny,zeny-5000;
+ getitem 2280,1;
+ mes "[Quest Assistant]";
+ mes "If you have a chance to, visit the Uplander Village, Payon.";
+ mes "The ^3355FFSakkat^000000 Dealer has never sold ^3355FFSakkat^000000 to other Dealers but to me. Because only I can recognise its quality. Due to its rarity, ^3355FFSakkat^000000 becomes a very Unique and Exceptional product.";
+ mes "OK! Take it!";
+ close;
+CantMake3:
+ mes "[Quest Assistant]";
+ mes "You Dullard. Check this requirements again.";
+ mes "You Don't look like an idiot though....C'Mon Man. Get real!";
+ close;
+LNo6:
+ mes "[Quest Assistant]";
+ mes "Well, see you around!";
+ close;
+// Boy's Cap
+BoyCap:
+ mes "[Quest Assistant]";
+ mes "Ohhh !! Th ..This is the one..by hearsay ..";
+ mes "Gain Strength even taking a look at it! Inflame the Blood even smelling once!";
+ mes "80 year-old Grampa becomes a Boy after grabbing one bite of it!!!!";
+ mes "It is the ^3355FFTiger's Footskin^000000!!";
+ mes "Please bring me that.. I need 10 of them..";
+ next;
+ menu "Ok, here you go!",LExchange,"I don't have the time.",LCancel2;
+ close;
+LExchange:
+ if(countitem(1030) < 10) goto CantMake4;
+ delitem 1030,10;
+ getitem 5016,1;
+ mes "[Quest Assistant]";
+ mes "T .. Tahnk you !!";
+ mes "Now I can be vigorous again with this item!";
+ mes "I will eat this thing right away!";
+ close;
+CantMake4:
+ mes "[Quest Assistant]";
+ mes "Oh... It seems you don't have enough ^3355FFTiger's Footskin^000000.";
+ close;
+LCancel2:
+ mes "[Quest Assistant]";
+ mes "He.. Hey Young one!! Wai .. Wait!";
+ close;
+// Ph.D Hat
+PhdHat:
+ mes "[Quest Assistant]";
+ mes "Ah .. Definately ..They are 4 kinds of Flowers I was looking for ..";
+ mes "I need 1 ^3355FFIllusion Flower^000000 ,1 ^3355FFHinalle^000000,1 ^3355FFAloe^000000 and 1 ^3355FFMent^000000... If you can bring them to me, I could give you my treasue...";
+ next;
+ menu "Sure",LYes2,"Cancel",LCancel1;
+LYes2:
+ if(countitem(710) < 1) goto LNoHat1;
+ if(countitem(103) < 1) goto LNoHat1;
+ if(countitem(704) < 1) goto LNoHat1;
+ if(countitem(708) < 1) goto LNoHat1;
+ delitem 710,1;
+ delitem 703,1;
+ delitem 704,1;
+ delitem 708,1;
+ getitem 5012,1;
+ mes "[Quest Assistant]";
+ mes "I really really appreciate you what you've done for me. I mean I am really grateful.";
+ mes "I will give my precious item to you as I promised.";
+ mes "This is a Hat worn on my Graduation Day in the University. It reminds me of my happy School days.";
+ mes "Please take this...";
+ close;
+LNoHat1:
+ mes "[Quest Assistant]";
+ mes "Don't you think... Flowers are pretty?";
+ mes "Unfortunately, you don't have the ones I need.";
+ close;
+LCancel1:
+ mes "[Quest Assistant]";
+ mes "One of thesedays I will cover whole world with Flowers.";
+ close;
+// Oxygen Mask
+OxyMask:
+ mes "[Quest Assistant]";
+ mes "Ahh! These Thief Bugs are so cute! They hurt my eyes!";
+ mes "I must have 5 ^3355FFOra Ora^000000 to make it stop!";
+ mes "In return, I can give you this ^3355FFOxygen Mask^000000";
+ next;
+ menu "No Problem!",LYes3,"What?!?",LCancel6;
+LYes3:
+ if(countitem(701) < 5) goto LNoMask;
+ delitem 701,5;
+ getitem 5004,1;
+ mes "[Quest Assistant]";
+ mes "Muhahahahah!!! Finally I have this! Ora Ora!";
+ mes "Stupid and Disgusting Thief Bugs!! You will get payed for !!!";
+ close;
+LNoMask:
+ mes "[Quest Assistant]";
+ mes "AHHHHHH!!! You don't have the stuff!";
+ close;
+LCancel6:
+ mes "[Quest Assistant]";
+ mes "Huhuhuhuhu... What If I could not get rid of Thief Bugs...";
+ mes "Only one thing I could do is to Fall in Love with them..Hehehehehehe...";
+ close;
+// Headset
+Headset:
+ mes "[Quest Assistant]";
+ mes "These are Articles needed for my Grandfather's masterpiece.";
+ mes "^3355FF100 Steel^000000";
+ mes "^3355FF1 Oridecon^000000";
+ mes "^3355FF1 Alchol^000000";
+ mes "^3355FF1 Coal^000000";
+ mes "Will you help me?";
+ next;
+ menu "Sure Thing.",LYes4,"No Thanks",LCancel3;
+LYes4:
+ if(countitem(999) < 40) goto LNoItems2;
+ if(countitem(984) < 1) goto LNoItems2;
+ if(countitem(970) < 1) goto LNoItems2;
+ if(countitem(1003) < 1) goto LNoItems2;
+ delitem 999,40;
+ delitem 984,1;
+ delitem 970,1;
+ delitem 1003,1;
+ getitem 5001,1;
+ mes "[Quest Assistant]";
+ mes "Thank you.";
+ mes "Because of you,I could accomplish my grand father's wish.";
+ mes "He would be happy if he look down on me from the Heaven..";
+ close;
+LNoItems2:
+ mes "[Quest Assistant]";
+ mes "Thank you for trying to help me ..But you didn't bring whole items I need.";
+ mes "I think you will make it soon though...";
+ close;
+LCancel3:
+ mes "[Quest Assistant]";
+ mes "Fare well.";
+ close;
+// Binoculars
+Binoc:
+ mes "[Quest Assistant]";
+ mes "Howdi - A new customer !";
+ mes "Stop!!! I know I know what you're gonna talk about.";
+ mes "You want the ^3355FFBinoculars^000000 from me,right ?";
+ mes "Just gimme ^3355FF1 Geek Glasses^000000, ^3355FF40 Steel^000000, and 50,000 Zeny.";
+ next;
+ menu "Yeah, sure.",LYes5,"Ignore him!",LCancel4;
+LYes5:
+ if(countitem(2243) < 1) goto LNoItems1;
+ if(countitem(999) < 100) goto LNoItems1;
+ delitem 2243,1;
+ delitem 999,100;
+ set Zeny,zeny-50000;
+ getitem 2296,1;
+ mes "[Quest Assistant]";
+ mes "Here it is! The Binoculars!";
+ close;
+LNoItems1:
+ mes "[Quest Assistant]";
+ mes "Man, don't take me for a fool! You don't have the items!!";
+ close;
+LCancel4:
+ mes "[Quest Assistant]";
+ mes "Hey you!";
+ mes "Now you're in front of Marius,";
+ mes "Alchemist of the Alchemists!";
+ mes "Do you ignore me now, Huh???";
+ mes "Come on!! I beat your ass!!!";
+ close;
+MCancel:
+ mes "[Quest Assistant]";
+ mes "I see. I will be here whenever you need me!";
+ close;
} \ No newline at end of file
diff --git a/npc/quests/bongunsword.txt b/npc/quests/bongunsword.txt
index 660daf483..b0d52a09a 100644
--- a/npc/quests/bongunsword.txt
+++ b/npc/quests/bongunsword.txt
@@ -1,43 +1,43 @@
-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 NoItemS;
-mes "[Old Smith]";
-mes "Hmm, it seems as if you need something. What would that be?";
-
- menu "Can you fix this broken sword?",ExItems,"Nothing really...",ExEnd;
-
- ExItems:
- 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) goto NoItem;
- if(countitem(984)<1) goto NoItem;
- goto ExGive;
-
- NoItem:
- mes "[Old Smith]";
- mes "Hmm, you seem to be missing something...probably that 'Oridecon'.";
- close;
-
- NoItemS:
- mes "[Old Smith]";
- mes "...ah well, go out and live life young one. Time never stops!";
- close;
-
- ExGive:
- mes "[Old Smith]";
- mes "Ah yes here we go!";
- delitem 7110,1;
- delitem 984,1;
- getitem 10020,1;
- mes " ";
- mes "Haha! Gramps still has that old magic touch, Here you go!";
- close;
-
- ExEnd:
- mes "[Old Smith]";
- mes "...ah well, go out and live life young one. Time never stops!";
- 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 NoItemS;
+mes "[Old Smith]";
+mes "Hmm, it seems as if you need something. What would that be?";
+
+ menu "Can you fix this broken sword?",ExItems,"Nothing really...",ExEnd;
+
+ ExItems:
+ 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) goto NoItem;
+ if(countitem(984)<1) goto NoItem;
+ goto ExGive;
+
+ NoItem:
+ mes "[Old Smith]";
+ mes "Hmm, you seem to be missing something...probably that 'Oridecon'.";
+ close;
+
+ NoItemS:
+ mes "[Old Smith]";
+ mes "...ah well, go out and live life young one. Time never stops!";
+ close;
+
+ ExGive:
+ mes "[Old Smith]";
+ mes "Ah yes here we go!";
+ delitem 7110,1;
+ delitem 984,1;
+ getitem 10020,1;
+ mes " ";
+ mes "Haha! Gramps still has that old magic touch, Here you go!";
+ close;
+
+ 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 cfb4c8e30..81ff319c5 100644
--- a/npc/quests/bunnyband.txt
+++ b/npc/quests/bunnyband.txt
@@ -1,102 +1,102 @@
-//===== eAthena Script =======================================
-//= Bunny Band Quest
-//===== By: ==================================================
-//= eAthena Dev Team
-//===== Current Version: =====================================
-//= v1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= v1.1 using duplicate command
-//============================================================
-
-
-
-
-// Prontera ------------------------------------------------------------------------------------------------------------------------------------------
-prontera.gat,146,87,6 script Kafra Corp. Rep.#1::KCRep 83,
-{
- mes "[Kafra Corp. Rep.]";
- if (BUNYBND == 1) goto L_Check;
- mes "^529DFFSpecial Event, ^FF0000Bunny Band ^529DFFQuest!!^000000";
- next;
- menu "Information.",M_Info, "Join.",M_Join, "Cancel.",M_End;
-
- M_Info:
- 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 Assosiation.)";
- 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. Rep. such as myself.";
- mes "We will then carefully hand make 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. Rep. 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;
-
- mes "Wow!! Well-Done, well-done! You've got every single item!! I will make the Bunny Band for you right away....";
- emotion 21;
- next;
- mes "~ a few minutes later ~";
- delitem 949,100;
- delitem 706,1;
- delitem 722,1;
- delitem 2213,1;
- next;
- mes "[Kafra Corp. Rep.]";
- mes "Tah dah!!! Here is your ^FF0000Bunny Band^000000... Please take it!";
- getitem 2214,1;
- 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,
-// Alberta ------------------------------------------------------------------------------------------------------------------------------------------
-alberta.gat,26,229,1 duplicate(KCRep) Kafra Corp. Rep.#4 83,
-// Payon ------------------------------------------------------------------------------------------------------------------------------------------
-payon.gat,184,104,4 duplicate(KCRep) Kafra Corp. Rep.#5 83,
-
+//===== eAthena Script =======================================
+//= Bunny Band Quest
+//===== By: ==================================================
+//= eAthena Dev Team
+//===== Current Version: =====================================
+//= v1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= v1.1 using duplicate command
+//============================================================
+
+
+
+
+// Prontera ------------------------------------------------------------------------------------------------------------------------------------------
+prontera.gat,146,87,6 script Kafra Corp. Rep.#1::KCRep 83,
+{
+ mes "[Kafra Corp. Rep.]";
+ if (BUNYBND == 1) goto L_Check;
+ mes "^529DFFSpecial Event, ^FF0000Bunny Band ^529DFFQuest!!^000000";
+ next;
+ menu "Information.",M_Info, "Join.",M_Join, "Cancel.",M_End;
+
+ M_Info:
+ 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 Assosiation.)";
+ 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. Rep. such as myself.";
+ mes "We will then carefully hand make 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. Rep. 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;
+
+ mes "Wow!! Well-Done, well-done! You've got every single item!! I will make the Bunny Band for you right away....";
+ emotion 21;
+ next;
+ mes "~ a few minutes later ~";
+ delitem 949,100;
+ delitem 706,1;
+ delitem 722,1;
+ delitem 2213,1;
+ next;
+ mes "[Kafra Corp. Rep.]";
+ mes "Tah dah!!! Here is your ^FF0000Bunny Band^000000... Please take it!";
+ getitem 2214,1;
+ 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,
+// Alberta ------------------------------------------------------------------------------------------------------------------------------------------
+alberta.gat,26,229,1 duplicate(KCRep) Kafra Corp. Rep.#4 83,
+// Payon ------------------------------------------------------------------------------------------------------------------------------------------
+payon.gat,184,104,4 duplicate(KCRep) Kafra Corp. Rep.#5 83,
+
diff --git a/npc/quests/counteragent_mixture.txt b/npc/quests/counteragent_mixture.txt
index c6ac1a6ca..a7ad06f59 100644
--- a/npc/quests/counteragent_mixture.txt
+++ b/npc/quests/counteragent_mixture.txt
@@ -1,262 +1,262 @@
-//===== eAthena Script =======================================
-//= Counteragent and Mixture Quest(Morgenstein)
-//===== By: ==================================================
-//= kobra_k88
-//= added some dialogs for Morgenstein by Komurka
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Counteragent and mixtures for making dyes
-//===== 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]
-//============================================================
-
-
-
-
-// Merchant Louitz -----------------------------------------------------------
-alberta_in.gat,130,54,2 script Merchant Louitz 84,{
- mes "[Louitz]";
- mes "What's going on?";
- if(countitem(970) > 0 && countitem(971) > 0 && countitem(972) > 0) 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 serveral 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) > 0 && countitem(971) > 0 && countitem(972) > 0) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
- goto M_Menu;
-
- M_Solut:
- 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 0;
- next;
- mes "[Aure Dupon]";
- mes "So... why did you stop me??";
- emotion 20;
- if(MORGEN == 1) 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 excentric 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 everthing else in your life to achieve that goal? Even if it meant risking insanity??";
- if(MORGEN == 1) goto M_Menu2;
- goto M_Menu;
-
- M_Morgen:
- 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(MORGEN == 3) 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 38;
- 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 29;
- 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 29;
- 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 43;
- 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 MORGEN,3;
- if(ALCH_Q == 4) set al_morgen,1;
- 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",M_Make, "Nothing",M_End;
-
- M_Make:
- 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 29;
- next;
- menu "-Counteragent",sM_Counter, "-Mixture",sM_Mixture, "-Forget it",M_End;
-
- sM_Counter:
- 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 counteragent. 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'ty think it's rip-off?...";
- next;
- mes "[Chemist Morgenstein]";
- mes "Alright?....";
- next;
- menu "Make",-,"Cancel",M_End;
-
- mes "[Chemist Morgenstein]";
- if(countitem(970)>0 && countitem(971)>0 && countitem(713)>0 && Zeny>=3000) goto sl_GetCounter;//Items: Alcohol, Detrimindexta, Empty Bottle,
- mes "I'm sorry but you need 1 Alcohol, 1 Detrimindexta, and 3000 Zeny for me to make a Counteragent.";
- close;
-
- sl_GetCounter:
- mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
- mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
- next;
- getitem 973,1;//Items: Counteragent,
- delitem 970,1;//Items: Alcohol,
- delitem 713,1;//Items: Empty Bottle,
- delitem 971,1;//Items: Detrimindexta,
- set Zeny, Zeny-3000;
- mes "[Chemist Morgenstein]";
- mes ".... Hmmm......";
- close;
-
- sM_Mixture:
- 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'ty think it's rip-off?...";
- next;
- mes "[Chemist Morgenstein]";
- mes "Alright??...";
- next;
- menu "Make",-,"Cancel",M_End;
-
- if(countitem(970)>0 && countitem(972)>0 && countitem(713)>0 && Zeny>=4000) goto sl_GetMix;//Items: Alcohol, Karvodailnirol, Empty Bottle,
- mes "I'm sorry but you need 1 Alcohol, 1 Karvodainirol, and 4000 Zeny for me to make a Mixture.";
- close;
-
- sl_GetMix:
- mes "[Chemist Morgenstein]";
- mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
- mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
- next;
- getitem 974,1;//Items: Mixture,
- delitem 970,1;//Items: Alcohol,
- delitem 713,1;//Items: Empty Bottle,
- delitem 972,1;//Items: Karvodailnirol,
- set Zeny, Zeny-4000;
- mes "[Chemist Morgenstein]";
- mes ".... Hmmm......";
- close;
-
- M_End:
- mes "[Chemist Morgenstein]";
- mes "... Kekekekekekeke....";
- close;
-
-
-}
+//===== eAthena Script =======================================
+//= Counteragent and Mixture Quest(Morgenstein)
+//===== By: ==================================================
+//= kobra_k88
+//= added some dialogs for Morgenstein by Komurka
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Counteragent and mixtures for making dyes
+//===== 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]
+//============================================================
+
+
+
+
+// Merchant Louitz -----------------------------------------------------------
+alberta_in.gat,130,54,2 script Merchant Louitz 84,{
+ mes "[Louitz]";
+ mes "What's going on?";
+ if(countitem(970) > 0 && countitem(971) > 0 && countitem(972) > 0) 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 serveral 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) > 0 && countitem(971) > 0 && countitem(972) > 0) goto M_Menu2;//Items: Alcohol, Detrimindexta, Karvodailnirol,
+ goto M_Menu;
+
+ M_Solut:
+ 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 0;
+ next;
+ mes "[Aure Dupon]";
+ mes "So... why did you stop me??";
+ emotion 20;
+ if(MORGEN == 1) 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 excentric 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 everthing else in your life to achieve that goal? Even if it meant risking insanity??";
+ if(MORGEN == 1) goto M_Menu2;
+ goto M_Menu;
+
+ M_Morgen:
+ 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(MORGEN == 3) 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 38;
+ 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 29;
+ 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 29;
+ 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 43;
+ 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 MORGEN,3;
+ if(ALCH_Q == 4) set al_morgen,1;
+ 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",M_Make, "Nothing",M_End;
+
+ M_Make:
+ 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 29;
+ next;
+ menu "-Counteragent",sM_Counter, "-Mixture",sM_Mixture, "-Forget it",M_End;
+
+ sM_Counter:
+ 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 counteragent. 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'ty think it's rip-off?...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Alright?....";
+ next;
+ menu "Make",-,"Cancel",M_End;
+
+ mes "[Chemist Morgenstein]";
+ if(countitem(970)>0 && countitem(971)>0 && countitem(713)>0 && Zeny>=3000) goto sl_GetCounter;//Items: Alcohol, Detrimindexta, Empty Bottle,
+ mes "I'm sorry but you need 1 Alcohol, 1 Detrimindexta, and 3000 Zeny for me to make a Counteragent.";
+ close;
+
+ sl_GetCounter:
+ mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
+ mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
+ next;
+ getitem 973,1;//Items: Counteragent,
+ delitem 970,1;//Items: Alcohol,
+ delitem 713,1;//Items: Empty Bottle,
+ delitem 971,1;//Items: Detrimindexta,
+ set Zeny, Zeny-3000;
+ mes "[Chemist Morgenstein]";
+ mes ".... Hmmm......";
+ close;
+
+ sM_Mixture:
+ 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'ty think it's rip-off?...";
+ next;
+ mes "[Chemist Morgenstein]";
+ mes "Alright??...";
+ next;
+ menu "Make",-,"Cancel",M_End;
+
+ if(countitem(970)>0 && countitem(972)>0 && countitem(713)>0 && Zeny>=4000) goto sl_GetMix;//Items: Alcohol, Karvodailnirol, Empty Bottle,
+ mes "I'm sorry but you need 1 Alcohol, 1 Karvodainirol, and 4000 Zeny for me to make a Mixture.";
+ close;
+
+ sl_GetMix:
+ mes "[Chemist Morgenstein]";
+ mes "OhOhOhOh...... Heheheheheh...... Fine... Like this..... Fine... Keep... More........ Heheheheheh";
+ mes ".... Ahhhh.... ..... OhOh.... OhOh!..... OhOhOhOhOhOh!!!...!!!!!!";
+ next;
+ getitem 974,1;//Items: Mixture,
+ delitem 970,1;//Items: Alcohol,
+ delitem 713,1;//Items: Empty Bottle,
+ delitem 972,1;//Items: Karvodailnirol,
+ set Zeny, Zeny-4000;
+ mes "[Chemist Morgenstein]";
+ mes ".... Hmmm......";
+ close;
+
+ M_End:
+ mes "[Chemist Morgenstein]";
+ mes "... Kekekekekekeke....";
+ close;
+
+
+}
diff --git a/npc/quests/custom/berzebub.txt b/npc/quests/custom/berzebub.txt
index 200f0df87..b84443a99 100644
--- a/npc/quests/custom/berzebub.txt
+++ b/npc/quests/custom/berzebub.txt
@@ -1,84 +1,84 @@
-//===== eAthena Script =======================================
-//= Berzebub Card Quest Script
-//===== By: ==================================================
-//= jabs <jabbedxorz@hotmail.com>
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any eAthena Version; RO Episode XX
-//===== Description: =========================================
-//= Quest to get the Berzebub Card
-//===== Additional Comments: =================================
-//= MINE
-//============================================================
-prontera.gat,165,178,8 script Old Woman 103,{
- if(BerzQuest == 1) goto alreadyDone;
- mes "[Old Woman]";
- mes "Greeting lad. I found a really nift item while I was picking mushrooms near Glast Heim";
- next;
- menu "Keep talking", goOn, "Leave", leave;
-
- leave:
- mes "[Old Woman]";
- mes "Such a great item I have right here...";
- close;
-
- goOn:
- 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", getInfo, "Nah, I don't care about it", leave;
-
- getInfo:
- mes "[Old Woman]";
- mes "I believe the item is called a Berzebub Card. It can make any spell caster cast spells really fast!";
- next;
- mes "[Old Woman]";
- mes "I need all of the following items:";
- mes "^0080FF10^000000 Emperium";
- mes "^0080FF100^000000 Witched Starsand";
- mes "^0080FF200^000000 Needle of Alarm";
- mes "^0080FF10^000000 Worn Out Scrolls";
- mes "^0080FF1^000000 Bible";
- mes "^0080FF1^000000 Wand of the Occult";
- mes "^0080FF20^000000 Opal";
- next;
- menu "I have all that!", checkItems, "I'll get those ASAP", leave;
-
- checkItems:
- mes "[Old Woman]";
- mes "Anyone can say they have the items, but do they really have them? Let's take a look here...";
- next;
- if(countitem(714) < 10) goto noItems;
- if(countitem(1061) < 100) goto noItems;
- if(countitem(1095) < 200) goto noItems;
- if(countitem(618) < 10) goto noItems;
- if(countitem(1551) < 1) goto noItems;
- if(countitem(1614) < 1) goto noItems;
- if(countitem(727) < 20) goto noItems;
- delitem 714, 10;
- delitem 1061, 100;
- delitem 1095, 200;
- delitem 618, 10;
- delitem 1551, 1;
- delitem 1614, 1;
- delitem 727, 20;
- getitem 4145, 1;
- set BerzQuest, 1;
- mes "[Old Woman]";
- mes "Well congratulations! You have all the items. Here is your Berzebub Card, just as I promised.";
- close;
-
- noItems:
- mes "[Old Woman]";
- mes "I knew you were lying! Get out of here and get those items you sorry excuse for a rock star.";
- close;
-
- alreadyDone:
- mes "[Old Woman]";
- 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 <jabbedxorz@hotmail.com>
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any eAthena Version; RO Episode XX
+//===== Description: =========================================
+//= Quest to get the Berzebub Card
+//===== Additional Comments: =================================
+//= MINE
+//============================================================
+prontera.gat,165,178,8 script Old Woman 103,{
+ if(BerzQuest == 1) goto alreadyDone;
+ mes "[Old Woman]";
+ mes "Greeting lad. I found a really nift item while I was picking mushrooms near Glast Heim";
+ next;
+ menu "Keep talking", goOn, "Leave", leave;
+
+ leave:
+ mes "[Old Woman]";
+ mes "Such a great item I have right here...";
+ close;
+
+ goOn:
+ 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", getInfo, "Nah, I don't care about it", leave;
+
+ getInfo:
+ mes "[Old Woman]";
+ mes "I believe the item is called a Berzebub Card. It can make any spell caster cast spells really fast!";
+ next;
+ mes "[Old Woman]";
+ mes "I need all of the following items:";
+ mes "^0080FF10^000000 Emperium";
+ mes "^0080FF100^000000 Witched Starsand";
+ mes "^0080FF200^000000 Needle of Alarm";
+ mes "^0080FF10^000000 Worn Out Scrolls";
+ mes "^0080FF1^000000 Bible";
+ mes "^0080FF1^000000 Wand of the Occult";
+ mes "^0080FF20^000000 Opal";
+ next;
+ menu "I have all that!", checkItems, "I'll get those ASAP", leave;
+
+ checkItems:
+ mes "[Old Woman]";
+ mes "Anyone can say they have the items, but do they really have them? Let's take a look here...";
+ next;
+ if(countitem(714) < 10) goto noItems;
+ if(countitem(1061) < 100) goto noItems;
+ if(countitem(1095) < 200) goto noItems;
+ if(countitem(618) < 10) goto noItems;
+ if(countitem(1551) < 1) goto noItems;
+ if(countitem(1614) < 1) goto noItems;
+ if(countitem(727) < 20) goto noItems;
+ delitem 714, 10;
+ delitem 1061, 100;
+ delitem 1095, 200;
+ delitem 618, 10;
+ delitem 1551, 1;
+ delitem 1614, 1;
+ delitem 727, 20;
+ getitem 4145, 1;
+ set BerzQuest, 1;
+ mes "[Old Woman]";
+ mes "Well congratulations! You have all the items. Here is your Berzebub Card, just as I promised.";
+ close;
+
+ noItems:
+ mes "[Old Woman]";
+ mes "I knew you were lying! Get out of here and get those items you sorry excuse for a rock star.";
+ close;
+
+ alreadyDone:
+ mes "[Old Woman]";
+ mes "Hey I remember you! I already told you that you may only complete this quest once.";
+ close;
+}
diff --git a/npc/quests/custom/elvenear.txt b/npc/quests/custom/elvenear.txt
index 16d3a75d0..34ef2c46a 100644
--- a/npc/quests/custom/elvenear.txt
+++ b/npc/quests/custom/elvenear.txt
@@ -1,71 +1,71 @@
-//===== eAthena Script =======================================
-//= Daily Job Quest For Elven Ears
-//===== By: ==================================================
-//= Someone
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Elven Ears (require 75+ Base Level)
-//===== Additional Comments: =================================
-//= Optimized [Lupus], 1.1 misc fix
-//============================================================
-
-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";
- if(countitem(2213)<1)goto L_NoMake;
- if(countitem(1040)<20)goto L_NoMake;
- if (countitem(919)<20) goto L_NoMake;
- next;
-
- mes "[Elven Ears quest]";
- mes "Give me a second.....";
- next;
-
- delitem 2213,1;
- delitem 1040,20;
- delitem 919,20;
- 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 "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 "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.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Elven Ears (require 75+ Base Level)
+//===== Additional Comments: =================================
+//= Optimized [Lupus], 1.1 misc fix
+//============================================================
+
+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";
+ if(countitem(2213)<1)goto L_NoMake;
+ if(countitem(1040)<20)goto L_NoMake;
+ if (countitem(919)<20) goto L_NoMake;
+ next;
+
+ mes "[Elven Ears quest]";
+ mes "Give me a second.....";
+ next;
+
+ delitem 2213,1;
+ delitem 1040,20;
+ delitem 919,20;
+ 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 "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 "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/quests/custom/event_32_new_hats.txt b/npc/quests/custom/event_32_new_hats.txt
index 9ef1ed9d7..52056d437 100644
--- a/npc/quests/custom/event_32_new_hats.txt
+++ b/npc/quests/custom/event_32_new_hats.txt
@@ -1,1278 +1,1278 @@
-//===== eAthena Script =======================================
-//= Quest For Slotted Sunglasses
-//===== By: ==================================================
-//= RedxSwordxHero
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= 4 brothers give you quests to get 32 new hats
-//===== 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]
-//============================================================
-
-
-
-prontera.gat,140,172,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 8 hats and my brothers provides the other 24.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Zac]";
- mes "What hat do you want me to make?";
- next;
- menu "Angel Helm",L1_1,"Apple Hat",L1_2,"Blue Bandana",L1_3,"Bongun Hat",L1_4,"Cake Hat",L1_5,"Candle Hat",L1_6,"Chef's Hat",L1_7,"Colored Egg Shell",L1_8;
-L1_1:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2254) < 1)) goto L_ITEM_1;
- if((countitem(2229) < 1)) goto L_ITEM_2;
- if((countitem(7036) < 5)) goto L_ITEM_3;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Angel Helm for you right away. Please Wait a Moment.";
- delitem 2254,1;
- delitem 2229,1;
- delitem 7036,5;
- next;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Angel Helm^000000...! Please Take it!";
- getitem 5025,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1:
- mes "[Zac]";
- mes "Oh dear, you need 1 Angel Hairband...";
- close;
-L_ITEM_2:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Slotted Helm...";
- close;
-L_ITEM_3:
- mes "[Zac]";
- mes "Oh, dear. You need 5 Fangs of Garm...";
- close;
-L1_2:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(748) < 1)) goto L_ITEM_1a;
- if((countitem(512) < 300)) goto L_ITEM_2a;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Apple Hat for you right away. Please Wait a Moment.";
- delitem 748,1;
- delitem 512,300;
- next;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Apple Hat^000000...! Please Take it!";
- getitem 5037,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1a:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Witherless Rose...";
- close;
-L_ITEM_2a:
- mes "[Zac]";
- mes "Oh, dear. You need 300 Apples...";
- close;
-L1_3:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7003) < 300)) goto L_ITEM_1b;
- if((countitem(2211) < 1)) goto L_ITEM_2b;
- if((countitem(978) < 1)) goto L_ITEM_3b;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Blue Bandana for you right away. Please Wait a Moment.";
- next;
- delitem 7003,300;
- delitem 2211,1;
- delitem 978,1;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Blue Bandana^000000...! Please Take it!";
- getitem 5052,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1b:
- mes "[Zac]";
- mes "Oh, dear. You need 300 Anolian Skins...";
- close;
-L_ITEM_2b:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Bandana...";
- close;
-L_ITEM_3b:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
- close;
-L1_4:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(609) < 10)) goto L_ITEM_1c;
- if((countitem(978) < 1)) goto L_ITEM_2c;
- if((countitem(2264) < 1)) goto L_ITEM_3c;
- 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;
- delitem 609,100;
- delitem 978,1;
- delitem 2264,1;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Bongun Hat^000000...! Please Take it!";
- getitem 5046,1;
- 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;
-L1_5:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(529) < 10)) goto L_ITEM_1d;
- if((countitem(530) < 5)) goto L_ITEM_2d;
- if((countitem(538) < 15)) goto L_ITEM_3d;
- if((countitem(539) < 20)) goto L_ITEM_4d;
- if((countitem(999) < 10)) goto L_ITEM_5d;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Cake Hat for you right away. Please Wait a Moment.";
- next;
- delitem 529,10;
- delitem 530,5;
- delitem 538,15;
- delitem 539,20;
- delitem 999,10;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Cake Hat^000000...! Please Take it!";
- getitem 5024,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1d:
- mes "[Zac]";
- mes "Oh, dear. You need 10 Candys...";
- close;
-L_ITEM_2d:
- mes "[Zac]";
- mes "Oh, dear. You need 5 Candy Canes...";
- close;
-L_ITEM_3d:
- mes "[Zac]";
- mes "Oh, dear. You need 15 Well Baked Cookies...";
- close;
-L_ITEM_4d:
- mes "[Zac]";
- mes "Oh, dear. You need 20 Pieces of Cake...";
- close;
-L_ITEM_5d:
- mes "[Zac]";
- mes "Oh, dear. You need 10 Steels...";
- close;
-L1_6:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2279) < 1)) goto L_ITEM_1e;
- if((countitem(518) < 100)) goto L_ITEM_2e;
- if((countitem(7035) < 50)) goto L_ITEM_3e;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Candle Hat for you right away. Please Wait a Moment.";
- next;
- delitem 2279,1;
- delitem 518,100;
- delitem 7035,50;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Candle Hat^000000...! Please Take it!";
- getitem 5028,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1e:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Bomb Wick...";
- close;
-L_ITEM_2e:
- mes "[Zac]";
- mes "Oh, dear. You need 100 Honeys...";
- close;
-L_ITEM_3e:
- mes "[Zac]";
- mes "Oh, dear. You need 50 MatchSticks...";
- close;
-L1_7:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(539) < 120)) goto L_ITEM_1f;
- if((countitem(1036) < 450)) goto L_ITEM_2f;
- if((countitem(982) < 1)) goto L_ITEM_3f;
- if((countitem(949) < 330)) goto L_ITEM_4f;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Chef's Hat for you right away. Please Wait a Moment.";
- next;
- delitem 539,120;
- delitem 1036,450;
- delitem 982,1;
- delitem 949,330;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Chef's Hat^000000...! Please Take it!";
- getitem 5026,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1f:
- mes "[Zac]";
- mes "Oh, dear. You need 120 Pieces of Cake...";
- close;
-L_ITEM_2f:
- mes "[Zac]";
- mes "Oh, dear. You need 450 Dragon Scales...";
- close;
-L_ITEM_3f:
- mes "[Zac]";
- mes "Oh, dear. You need 1 White Dyestuff...";
- close;
-L_ITEM_4f:
- mes "[Zac]";
- mes "Oh, dear. You need 330 Feathers...";
- close;
-L1_8:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(5015) < 1)) goto L_ITEM_1g;
- if((countitem(978) < 1)) goto L_ITEM_2g;
- if((countitem(7030) < 50)) goto L_ITEM_3g;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Colored Egg Shell for you right away. Please Wait a Moment.";
- next;
- delitem 5015,1;
- delitem 978,1;
- delitem 7030,50;
- mes "[Zac]";
- mes "Tah Dah! ^FF0000Colored Egg Shell^000000...! Please Take it!";
- getitem 5039,1;
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1g:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Egg Shell...";
- close;
-L_ITEM_2g:
- mes "[Zac]";
- mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
- close;
-L_ITEM_3g:
- mes "[Zac]";
- mes "Oh, dear. You need 50 Claws of Desert Wolf...";
- close;
-L2:
- mes "[Zac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Angel Helm",L2_1,"Apple Hat",L2_2,"Blue Bandana",L2_3,"Bongun Hat", L2_4,"Cake Hat",L2_5,"Candle Hat",L2_6,"Chef's Hat",L2_7,"Colored Egg Shell",L2_8;
-L2_1:
- mes "[Zac]";
- mes "You need 1 Angel Wing, 1 Slotted Helm and 5 Fangs of Garm for Angel Helm.";
- close;
-L2_2:
- mes "[Zac]";
- mes "You need 1 Witherless Rose and 300 Apples for Apple Hat.";
- close;
-L2_3:
- mes "[Zac]";
- mes "You need 300 Anolian Skins, 1 Bandana and 1 Cobaltblue Dyestuff for Blue Bandana.";
- close;
-L2_4:
- mes "[Zac]";
- mes "You need 10 Amulets, 1 Cobaltblue Dyestuff and 1 Munak Hat for Bongun Hat.";
- close;
-L2_5:
- mes "[Zac]";
- mes "You need 10 Candys, 5 Candy Canes, 15 Well Baked Cookies, 20 Pieces Of Cake and 10 Steels for Cake Hat.";
- close;
-L2_6:
- mes "[Zac]";
- mes "You need 1 Bomb Wick, 100 Honeys and 50 Matchsticks for Candle Hat.";
- close;
-L2_7:
- mes "[Zac]";
- mes "You need 120 Pieces of Cake, 450 Dragon Scales, 1 White Dyestuff and 330 Feathers for Chef's Hat.";
- close;
-L2_8:
- mes "[Zac]";
- mes "You need 1 Egg Shell, 1 Cobaltblue Dyestuff and 50 Claws of Desert Wolf for Colored Egg Shell.";
- close;
-L3:
- mes "[Zac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-prontera.gat,143,172,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 8 hats and my brothers provides the other 24.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Blac]";
- mes "What hat do you want me to make?";
- next;
- menu "Crescent Moon Hairpin",L1_9,"Cross Hairband",L1_10,"Deviruchi Hat",L1_11,"Dumpling Decoration",L1_12,"Fashion Sunglasses",L1_13,"HandkerChief",L1_14,"Magic Instructor's Hat",L1_15,"Heart Hairpin",L1_16;
-L1_9:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(5041) < 1)) goto L_ITEM_1;
- if((countitem(999) < 10)) goto L_ITEM_2;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Crescent Moon Hairpin for you right away. Please Wait a Moment.";
- next;
- delitem 5041,1;
- delitem 999,10;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Crescent Moon Hairpin^000000...! Please Take it!";
- getitem 5048,1;
- 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;
-L1_10:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2608) < 1)) goto L_ITEM_1a;
- if((countitem(7069) < 500)) goto L_ITEM_2a;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Cross Hairband for you right away. Please Wait a Moment.";
- next;
- delitem 2608,1;
- delitem 7069,500;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Cross Hairband^000000...! Please Take it!";
- getitem 5036,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1a:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Rosary...";
- close;
-L_ITEM_2a:
- mes "[Blac]";
- mes "Oh, dear. You need 500 Destroyed Armors...";
- close;
-L1_11:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7048) < 40)) goto L_ITEM_1b;
- if((countitem(1038) < 600)) goto L_ITEM_2b;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Deviruchi Hat for you right away. Please Wait a Moment.";
- next;
- delitem 7048,40;
- delitem 1038,600;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Deviruchi Hat^000000...! Please Take it!";
- getitem 5038,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1b:
- mes "[Blac]";
- mes "Oh, dear. You need 40 Talons of Griffin...";
- close;
-L_ITEM_2b:
- mes "[Blac]";
- mes "Oh, dear. You need 600 Little Evil Horns...";
- close;
-L1_12:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(10007) < 1)) goto L_ITEM_1c;
- if((countitem(968) < 50)) goto L_ITEM_2c;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Dumpling Decoration for you right away. Please Wait a Moment.";
- next;
- delitem 10007,1;
- delitem 968,50;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Dumpling Decoration^000000...! Please Take it!";
- getitem 5042,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1c:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Silk Ribbon...";
- close;
-L_ITEM_2c:
- mes "[Blac]";
- mes "Oh, dear. You need 50 Heroic Emblems...";
- close;
-L1_13:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2271) < 1)) goto L_ITEM_1d;
- if((countitem(975) < 1)) goto L_ITEM_2d;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Fashion Sunglasses for you right away. Please Wait a Moment.";
- next;
- delitem 2271,1;
- delitem 975,1;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Fashion Sunglasses^000000...! Please Take it!";
- getitem 5047,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1d:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Jack a Dandy...";
- close;
-L_ITEM_2d:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Scarlet Dyestuff...";
- close;
-L1_14:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(1059) < 150)) goto L_ITEM_1e;
- if((countitem(978) < 1)) goto L_ITEM_2e;
- if((countitem(907) < 100)) goto L_ITEM_3e;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Handkerchief for you right away. Please Wait a Moment.";
- next;
- delitem 1059,150;
- delitem 978,1;
- delitem 907,100;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Handkerchief^000000...! Please Take it!";
- getitem 5023,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1e:
- mes "[Blac]";
- mes "Oh, dear. You need 150 Fabrics...";
- close;
-L_ITEM_2e:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
- close;
-L_ITEM_3e:
- mes "[Blac]";
- mes "Oh, dear. You need 100 Resins...";
- close;
-L1_15:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2251) < 1)) goto L_ITEM_1f;
- if((countitem(4052) < 1)) goto L_ITEM_2f;
- if((countitem(1036) < 400)) goto L_ITEM_3f;
- if((countitem(7001) < 50)) goto L_ITEM_4f;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Magic Instructor's Hat for you right away. Please Wait a Moment.";
- next;
- delitem 2251,1;
- delitem 4052,1;
- delitem 1036,400;
- delitem 7001,50;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Magic Instructor's Hat^000000...! Please Take it!";
- getitem 5027,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1f:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Wizard's Hat...";
- close;
-L_ITEM_2f:
- mes "[Blac]";
- mes "Oh, dear. You need 1 Elder Willow Card...";
- close;
-L_ITEM_3f:
- mes "[Blac]";
- mes "Oh, dear. You need 400 Dragon Scales...";
- close;
-L_ITEM_4f:
- mes "[Blac]";
- mes "Oh, dear. You need 50 Mould Powders...";
- close;
-L1_16:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7013) < 1200)) goto L_ITEM_1g;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Heart Hairpin for you right away. Please Wait a Moment.";
- next;
- delitem 7013,1200;
- mes "[Blac]";
- mes "Tah Dah! ^FF0000Heart Hairpin^000000...! Please Take it!";
- getitem 5041,1;
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1g:
- mes "[Blac]";
- mes "Oh, dear. You need 1200 Coral Reef's...";
- close;
-L2:
- mes "[Blac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Crescent Moon Hairpin",L2_9,"Cross Hairband",L2_10,"Deviruchi Hat",L2_11,"Dumpling Decoration/Chun Li Hat",L2_12,"Fashion Sunglasses",L2_13,"HandkerChief",L2_14,"Magic Instructor's Hat",L2_15,"Heart Hairpin",L2_16;
-L2_9:
- mes "[Blac]";
- mes "You need 1 Heart Hairpin and 10 Steels for Crescent Moon Hairpin.";
- close;
-L2_10:
- mes "[Blac]";
- mes "You need 1 Rosary and 500 Destroyed Armors for Cross Hairband.";
- close;
-L2_11:
- mes "[Blac]";
- mes "You need 40 Talon's of Griffin and 600 Little Evil Horns for Deviruchi Hat.";
- close;
-L2_12:
- mes "[Blac]";
- mes "You need 1 Silk Ribbon and 50 Heroic Emblems for Dumping Decoration.";
- close;
-L2_13:
- mes "[Blac]";
- mes "You need 1 Jack a Dandy and 1 Scarlet Dyestuff for Fashion Sunglasses.";
- close;
-L2_14:
- mes "[Blac]";
- mes "You need 150 Fabrics, 1 Cobaltblue Dyestuff and 100 Resins for Handkerchief.";
- close;
-L2_15:
- mes "[Blac]";
- mes "You need 1 Wizard's Hat, 1 Elder Willow Card, 400 Dragon Scales and 50 Mould Powders for Magic Instructor's Hat.";
- close;
-L2_16:
- mes "[Blac]";
- mes "You need 1200 Coral Reef's for Heart Hairpin.";
- close;
-L3:
- mes "[Blac]";
- mes "Stop by some other time with the right materials, so I can make the hats for you.";
- close;
-}
-
-prontera.gat,141,172,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 8 hats and my brothers provides the other 24.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Jac]";
- mes "What hat do you want me to make?";
- next;
- menu "Heart of Merchant",L1_17,"Innocence of Maiden",L1_18,"Kafra Band",L1_19,"Lightbulb Hairband",L1_20,"Magic Hat",L1_21,"Miner's Helm",L1_22,"Mysterious Apple Hat",L1_23,"Panda Hat",L1_24;
-L1_17:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2233) < 1)) goto L_ITEM_1;
- if((countitem(969) < 1)) goto L_ITEM_2;
- if((countitem(949) < 80)) goto L_ITEM_3;
- if((countitem(938) < 100)) goto L_ITEM_4;
- if((countitem(999) < 20)) goto L_ITEM_5;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Heart of Merchant for you right away. Please Wait a Moment.";
- next;
- delitem 2233,1;
- delitem 969,1;
- delitem 949,80;
- delitem 999,20;
- delitem 938,800;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Heart of Merchant^000000...! Please Take it!";
- getitem 5021,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Slotted Circlet...";
- close;
-L_ITEM_2:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Gold...";
- close;
-L_ITEM_3:
- mes "[Jac]";
- mes "Oh, dear. You need 80 Feather...";
- close;
-L_ITEM_4:
- mes "[Jac]";
- mes "Oh, dear. You need 800 Sticky Muscus...";
- close;
-L_ITEM_5:
- mes "[Jac]";
- mes "Oh, dear. You need 20 Steels...";
- close;
-L1_18:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7047) < 100)) goto L_ITEM_1a;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Innocence of Maiden for you right away. Please Wait a Moment.";
- next;
- delitem 7047,100;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Innocence of Maiden^000000...! Please Take it!";
- getitem 5040,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1a:
- mes "[Jac]";
- mes "Oh, dear. You need 100 Alice's Apron...";
- close;
-L1_19:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(10007) < 1)) goto L_ITEM_1b;
- if((countitem(10008) < 1)) goto L_ITEM_2b;
- 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;
- delitem 10007,1;
- delitem 10009,1;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Kafra Band^000000...! Please Take it!";
- getitem 5020,1;
- 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_20:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2233) < 1)) goto L_ITEM_1c;
- if((countitem(746) < 20)) goto L_ITEM_2c;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Lightbulb Hairband for you right away. Please Wait a Moment.";
- next;
- delitem 2233,1;
- delitem 746,20;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Lightbulb Hairband^000000...! Please Take it!";
- getitem 5034,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1c:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Slotted Criclet...";
- close;
-L_ITEM_2c:
- mes "[Jac]";
- mes "Oh, dear. You need 20 Glass Bead...";
- close;
-L1_21:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2252) < 1)) goto L_ITEM_1d;
- if((countitem(943) < 1200)) goto L_ITEM_2d;
- if((countitem(1054) < 450)) goto L_ITEM_3d;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Magic Hat for you right away. Please Wait a Moment.";
- next;
- delitem 2252,1;
- delitem 943,1200;
- delitem 1054,450;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Magic Hat^000000...! Please Take it!";
- getitem 5045,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1d:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Wizard's Hat...";
- close;
-L_ITEM_2d:
- mes "[Jac]";
- mes "Oh, dear. You need 1200 Solid Shells...";
- close;
-L_ITEM_3d:
- mes "[Jac]";
- mes "Oh, dear. You need 450 Ancient Lips...";
- close;
-L1_22:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(5009) < 1)) goto L_ITEM_1e;
- if((countitem(999) < 25)) goto L_ITEM_2e;
- if((countitem(747) < 1)) goto L_ITEM_3e;
- if((countitem(5028) < 1)) goto L_ITEM_4e;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Miner's Helm for you right away. Please Wait a Moment.";
- next;
- delitem 5009,1;
- delitem 999,25;
- delitem 747,1;
- delitem 5028,1;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Miner's Helm^000000...! Please Take it!";
- getitem 5031,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1e:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Safety Helmet...";
- close;
-L_ITEM_2e:
- mes "[Jac]";
- mes "Oh, dear. You need 25 Steels...";
- close;
-L_ITEM_3e:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Crystal Mirror...";
- close;
-L_ITEM_4e:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Candle...";
- close;
-L1_23:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(5037) < 1)) goto L_ITEM_1f;
- if((countitem(7064) < 500)) goto L_ITEM_2f;
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Mysterious Apple Hat for you right away. Please Wait a Moment.";
- next;
- delitem 5037,1;
- delitem 7064,500;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Mysterious Apple Hat^000000...! Please Take it!";
- getitem 5050,1;
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1f:
- mes "[Jac]";
- mes "Oh, dear. You need 1 Apple Hat...";
- close;
-L_ITEM_2f:
- mes "[Jac]";
- mes "Oh, dear. You need 500 Wings of Dragonfly...";
- close;
-L1_24:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(999) < 10)) goto L_ITEM_1g;
- if((countitem(948) < 200)) goto L_ITEM_2g;
- 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;
- delitem 999,10;
- delitem 948,200;
- mes "[Jac]";
- mes "Tah Dah! ^FF0000Panda Hat^000000...! Please Take it!";
- getitem 5030,1;
- 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 "Heart of Merchant",L2_17,"Innocence of Maiden",L2_18,"Kafra Band",L2_19,"Lightbulb Hairband",L2_20,"Magic Hat",L2_21,"Miner's Helm",L2_22,"Mysterious Apple Hat",L2_23,"Panda Hat",L2_24;
-L2_17:
- mes "[Jac]";
- mes "You need 1 Slotted Circlet, 1 Gold Bar, 80 Feathers, 20 Steels and 800 Sticky Muscus for Heart of Merchant";
- close;
-L2_18:
- mes "[Jac]";
- mes "You need 100 Alice's Aprons for Innocence of Maiden.";
- close;
-L2_19:
- mes "[Jac]";
- mes "You need 1 Silk Ribbon and 1 Wild Flower for Kafra Band.";
- close;
-L2_20:
- mes "[Jac]";
- mes "You need 1 Slotted Circlet and 20 Glass Beads for Lightbulb Hairband.";
- close;
-L2_21:
- mes "[Jac]";
- mes "You need 1 Wizard's Hat, 1200 Solid Shells and 450 Ancient Lips for Magic Hat.";
- close;
-L2_22:
- mes "[Jac]";
- mes "You need 1 Safety Helmet, 25 Steels, 1 Crystal Mirror and 1 Candle for Miner's Helm.";
- close;
-L2_23:
- mes "[Jac]";
- mes "You need 1 Apple Hat and 500 Wings of Dragonfly for Mysterious Apple Hat.";
- 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;
-}
-
-prontera.gat,142,172,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 8 hats and my brothers provides the other 24.";
- next;
- menu "Join",L1,"Information",L2,"Cancel",L3;
-L1:
- mes "[Pac]";
- mes "What hat do you want me to make?";
- next;
- menu "Phantom of the Opera",L1_25,"Poring Hat",L1_26,"Smokie Hat",L1_27,"Solar God Helm",L1_28,"Sphinx Hat",L1_29,"Spore Hat",L1_30,"Striped Bandana",L1_31,"Sunday Hat",L1_32;
-L1_25:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2281) < 1)) goto L_ITEM_1;
- if((countitem(1048) < 50)) goto L_ITEM_2;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Phantom of the Opera for you right away. Please Wait a Moment.";
- next;
- delitem 2281,1;
- delitem 1048,50;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Phatom of the Opera^000000...! Please Take it!";
- getitem 5043,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Opera Mask...";
- close;
-L_ITEM_2:
- mes "[Pac]";
- mes "Oh, dear. You need 50 Horrendous Hairs...";
- close;
-L1_26:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(741) < 1)) goto L_ITEM_1a;
- if((countitem(909) < 300)) goto L_ITEM_2a;
- 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;
- delitem 741,1;
- delitem 909,300;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Poring Hat^000000...! Please Take it!";
- getitem 5035,1;
- 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_27:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2213) < 1)) goto L_ITEM_1b;
- if((countitem(1036) < 20)) goto L_ITEM_2b;
- if((countitem(7012) < 200)) goto L_ITEM_3b;
- if((countitem(7065) < 300)) goto L_ITEM_4b;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Smokie Hat for you right away. Please Wait a Moment.";
- next;
- delitem 2213,1;
- delitem 1036,20;
- delitem 7012,200;
- delitem 7065,300;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Smokie Hat^000000...! Please Take it!";
- getitem 5033,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1b:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Kitty Band...";
- close;
-L_ITEM_2b:
- mes "[Pac]";
- mes "Oh, dear. You need 20 Dragon Scales...";
- close;
-L_ITEM_3b:
- mes "[Pac]";
- mes "Oh, dear. You need 200 Tough Scalelike Stems...";
- close;
-L_ITEM_4b:
- mes "[Pac]";
- mes "Oh, dear. You need 300 Fur's of Sea Otter...";
- close;
-L1_28:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7086) < 1)) goto L_ITEM_1c;
- if((countitem(999) < 40)) goto L_ITEM_2c;
- if((countitem(984) < 2)) goto L_ITEM_3c;
- if((countitem(969) < 10)) goto L_ITEM_4c;
- if((countitem(1003) < 50)) goto L_ITEM_5c;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Solar God Helm for you right away. Please Wait a Moment.";
- next;
- delitem 7086,1;
- delitem 999,40;
- delitem 984,2;
- delitem 969,10;
- delitem 1003,50;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Solar God Helm^000000...! Please Take it!";
- getitem 5022,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1c:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Emblem of the Sun God...";
- close;
-L_ITEM_2c:
- mes "[Pac]";
- mes "Oh, dear. You need 40 Steels...";
- close;
-L_ITEM_3c:
- mes "[Pac]";
- mes "Oh, dear. You need 2 Oridecons...";
- close;
-L_ITEM_4c:
- mes "[Pac]";
- mes "Oh, dear. You need 10 Gold Bar's...";
- close;
-L_ITEM_5c:
- mes "[Pac]";
- mes "Oh, dear. You need 50 Coals...";
- close;
-L1_29:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(999) < 25)) goto L_ITEM_1d;
- if((countitem(979) < 1)) goto L_ITEM_2d;
- if((countitem(976) < 1)) goto L_ITEM_3d;
- if((countitem(1059) < 150)) goto L_ITEM_4d;
- if((countitem(969) < 2)) goto L_ITEM_5d;
- 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;
- delitem 999,1;
- delitem 979,1;
- delitem 976,1;
- delitem 1059,150;
- delitem 969,2;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Sphinx Hat^000000...! Please Take it!";
- getitem 5053,1;
- 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;
-L1_30:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(7033) < 850)) goto L_ITEM_1e;
- if((countitem(7068) < 300)) goto L_ITEM_2e;
- if((countitem(1015) < 1)) goto L_ITEM_3e;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Spore Hat for you right away. Please Wait a Moment.";
- next;
- delitem 7033,850;
- delitem 7068,300;
- delitem 1015,1;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Spore Hat^000000...! Please Take it!";
- getitem 5029,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1e:
- mes "[Pac]";
- mes "Oh, dear. You need 850 Poison Spores...";
- close;
-L_ITEM_2e:
- mes "[Pac]";
- mes "Oh, dear. You need 300 Half Burnt Logs...";
- close;
-L_ITEM_3e:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Tongue...";
- close;
-L1_31:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(1099) < 1500)) goto L_ITEM_1f;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Striped Bandana for you right away. Please Wait a Moment.";
- next;
- delitem 1099,1500;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Striped Bandana^000000...! Please Take it!";
- getitem 5049,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1f:
- mes "[Pac]";
- mes "Oh, dear. You need 1500 Worn-out Prisoner Uniforms...";
- close;
-L1_32:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2221) < 1)) goto L_ITEM_1g;
- if((countitem(2227) < 1)) goto L_ITEM_2g;
- if((countitem(1059) < 250)) goto L_ITEM_3g;
- if((countitem(7063) < 600)) goto L_ITEM_4g;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Sunday Hat for you right away. Please Wait a Moment.";
- next;
- delitem 2221,1;
- delitem 2227,1;
- delitem 1059,250;
- delitem 7063,600;
- mes "[Pac]";
- mes "Tah Dah! ^FF0000Sunday Hat^000000...! Please Take it!";
- getitem 5032,1;
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more. Thank you.";
- close;
-L_ITEM_1g:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Slotted Hat...";
- close;
-L_ITEM_2g:
- mes "[Pac]";
- mes "Oh, dear. You need 1 Slotted Cap...";
- close;
-L_ITEM_3g:
- mes "[Pac]";
- mes "Oh, dear. You need 250 Fabrics...";
- close;
-L_ITEM_4g:
- mes "[Pac]";
- mes "Oh, dear. You need 600 Soft Feathers...";
- close;
-L2:
- mes "[Pac]";
- mes "Which hat materials do you wish to know?";
- next;
- menu "Phantom of the Opera",L2_25,"Poring Hat",L2_26,"Smokie Hat",L2_27,"Solar God Helm",L2_28,"Sphinx Hat",L2_29,"Spore Hat",L2_30,"Striped Bandana",L2_31,"Sunday Hat",L2_32;
-L2_25:
- mes "[Pac]";
- mes "You need 1 Opera Mask and 50 Horrendous Hairs for Phantom of the Opera.";
- close;
-L2_26:
- mes "[Pac]";
- mes "You need 1 Poring Doll and 300 Jellopys for Poring Hat.";
- close;
-L2_27:
- mes "[Pac]";
- mes "You need 1 Kitty Band, 20 Dragon Scale, 200 Tough Scalelike Stem and 300 Fur's of Sea Otter for Smokie Hat.";
- close;
-L2_28:
- mes "[Pac]";
- mes "You need 1 Emblem of the Sun God, 40 Steels, 2 Oridecons, 10 Gold Bar's and 50 Coals for Solar God Helm.";
- 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;
-L2_30:
- mes "[Pac]";
- mes "You need 850 Poison Spores, 300 Half Burnt Logs and 1 Tongue for Spore Hat.";
- close;
-L2_31:
- mes "[Pac]";
- mes "You need 1500 Worn-out Prisoner Uniforms for Striped Bandana.";
- close;
-L2_32:
- mes "[Pac]";
- mes "You need 1 Slotted Hat, 1 Slotted Cap, 250 Fabrics and 600 Soft Feathers for Sunday 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:
- enablenpc "Zac";
- end;
-}
-
-- script EDJac -1,{
-OnInit:
-OnMinute30:
- disablenpc "Jac";
- end;
-OnMinute16:
- enablenpc "Jac";
- end;
-}
-
-- script EDPac -1,{
-OnInit:
-OnMinute45:
- disablenpc "Pac";
- end;
-OnMinute31:
- enablenpc "Pac";
- end;
-}
-
-- script EDBlac -1,{
-OnInit:
-OnMinute00:
- disablenpc "Blac";
- end;
-OnMinute46:
- enablenpc "Blac";
- end;
-}
+//===== eAthena Script =======================================
+//= Quest For Slotted Sunglasses
+//===== By: ==================================================
+//= RedxSwordxHero
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= 4 brothers give you quests to get 32 new hats
+//===== 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]
+//============================================================
+
+
+
+prontera.gat,140,172,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 8 hats and my brothers provides the other 24.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Zac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Angel Helm",L1_1,"Apple Hat",L1_2,"Blue Bandana",L1_3,"Bongun Hat",L1_4,"Cake Hat",L1_5,"Candle Hat",L1_6,"Chef's Hat",L1_7,"Colored Egg Shell",L1_8;
+L1_1:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2254) < 1)) goto L_ITEM_1;
+ if((countitem(2229) < 1)) goto L_ITEM_2;
+ if((countitem(7036) < 5)) goto L_ITEM_3;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Angel Helm for you right away. Please Wait a Moment.";
+ delitem 2254,1;
+ delitem 2229,1;
+ delitem 7036,5;
+ next;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Angel Helm^000000...! Please Take it!";
+ getitem 5025,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1:
+ mes "[Zac]";
+ mes "Oh dear, you need 1 Angel Hairband...";
+ close;
+L_ITEM_2:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Slotted Helm...";
+ close;
+L_ITEM_3:
+ mes "[Zac]";
+ mes "Oh, dear. You need 5 Fangs of Garm...";
+ close;
+L1_2:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(748) < 1)) goto L_ITEM_1a;
+ if((countitem(512) < 300)) goto L_ITEM_2a;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Apple Hat for you right away. Please Wait a Moment.";
+ delitem 748,1;
+ delitem 512,300;
+ next;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Apple Hat^000000...! Please Take it!";
+ getitem 5037,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1a:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Witherless Rose...";
+ close;
+L_ITEM_2a:
+ mes "[Zac]";
+ mes "Oh, dear. You need 300 Apples...";
+ close;
+L1_3:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7003) < 300)) goto L_ITEM_1b;
+ if((countitem(2211) < 1)) goto L_ITEM_2b;
+ if((countitem(978) < 1)) goto L_ITEM_3b;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Blue Bandana for you right away. Please Wait a Moment.";
+ next;
+ delitem 7003,300;
+ delitem 2211,1;
+ delitem 978,1;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Blue Bandana^000000...! Please Take it!";
+ getitem 5052,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1b:
+ mes "[Zac]";
+ mes "Oh, dear. You need 300 Anolian Skins...";
+ close;
+L_ITEM_2b:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Bandana...";
+ close;
+L_ITEM_3b:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
+ close;
+L1_4:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(609) < 10)) goto L_ITEM_1c;
+ if((countitem(978) < 1)) goto L_ITEM_2c;
+ if((countitem(2264) < 1)) goto L_ITEM_3c;
+ 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;
+ delitem 609,100;
+ delitem 978,1;
+ delitem 2264,1;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Bongun Hat^000000...! Please Take it!";
+ getitem 5046,1;
+ 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;
+L1_5:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(529) < 10)) goto L_ITEM_1d;
+ if((countitem(530) < 5)) goto L_ITEM_2d;
+ if((countitem(538) < 15)) goto L_ITEM_3d;
+ if((countitem(539) < 20)) goto L_ITEM_4d;
+ if((countitem(999) < 10)) goto L_ITEM_5d;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Cake Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 529,10;
+ delitem 530,5;
+ delitem 538,15;
+ delitem 539,20;
+ delitem 999,10;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Cake Hat^000000...! Please Take it!";
+ getitem 5024,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1d:
+ mes "[Zac]";
+ mes "Oh, dear. You need 10 Candys...";
+ close;
+L_ITEM_2d:
+ mes "[Zac]";
+ mes "Oh, dear. You need 5 Candy Canes...";
+ close;
+L_ITEM_3d:
+ mes "[Zac]";
+ mes "Oh, dear. You need 15 Well Baked Cookies...";
+ close;
+L_ITEM_4d:
+ mes "[Zac]";
+ mes "Oh, dear. You need 20 Pieces of Cake...";
+ close;
+L_ITEM_5d:
+ mes "[Zac]";
+ mes "Oh, dear. You need 10 Steels...";
+ close;
+L1_6:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2279) < 1)) goto L_ITEM_1e;
+ if((countitem(518) < 100)) goto L_ITEM_2e;
+ if((countitem(7035) < 50)) goto L_ITEM_3e;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Candle Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 2279,1;
+ delitem 518,100;
+ delitem 7035,50;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Candle Hat^000000...! Please Take it!";
+ getitem 5028,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1e:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Bomb Wick...";
+ close;
+L_ITEM_2e:
+ mes "[Zac]";
+ mes "Oh, dear. You need 100 Honeys...";
+ close;
+L_ITEM_3e:
+ mes "[Zac]";
+ mes "Oh, dear. You need 50 MatchSticks...";
+ close;
+L1_7:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(539) < 120)) goto L_ITEM_1f;
+ if((countitem(1036) < 450)) goto L_ITEM_2f;
+ if((countitem(982) < 1)) goto L_ITEM_3f;
+ if((countitem(949) < 330)) goto L_ITEM_4f;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Chef's Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 539,120;
+ delitem 1036,450;
+ delitem 982,1;
+ delitem 949,330;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Chef's Hat^000000...! Please Take it!";
+ getitem 5026,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1f:
+ mes "[Zac]";
+ mes "Oh, dear. You need 120 Pieces of Cake...";
+ close;
+L_ITEM_2f:
+ mes "[Zac]";
+ mes "Oh, dear. You need 450 Dragon Scales...";
+ close;
+L_ITEM_3f:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 White Dyestuff...";
+ close;
+L_ITEM_4f:
+ mes "[Zac]";
+ mes "Oh, dear. You need 330 Feathers...";
+ close;
+L1_8:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(5015) < 1)) goto L_ITEM_1g;
+ if((countitem(978) < 1)) goto L_ITEM_2g;
+ if((countitem(7030) < 50)) goto L_ITEM_3g;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Colored Egg Shell for you right away. Please Wait a Moment.";
+ next;
+ delitem 5015,1;
+ delitem 978,1;
+ delitem 7030,50;
+ mes "[Zac]";
+ mes "Tah Dah! ^FF0000Colored Egg Shell^000000...! Please Take it!";
+ getitem 5039,1;
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1g:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Egg Shell...";
+ close;
+L_ITEM_2g:
+ mes "[Zac]";
+ mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
+ close;
+L_ITEM_3g:
+ mes "[Zac]";
+ mes "Oh, dear. You need 50 Claws of Desert Wolf...";
+ close;
+L2:
+ mes "[Zac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Angel Helm",L2_1,"Apple Hat",L2_2,"Blue Bandana",L2_3,"Bongun Hat", L2_4,"Cake Hat",L2_5,"Candle Hat",L2_6,"Chef's Hat",L2_7,"Colored Egg Shell",L2_8;
+L2_1:
+ mes "[Zac]";
+ mes "You need 1 Angel Wing, 1 Slotted Helm and 5 Fangs of Garm for Angel Helm.";
+ close;
+L2_2:
+ mes "[Zac]";
+ mes "You need 1 Witherless Rose and 300 Apples for Apple Hat.";
+ close;
+L2_3:
+ mes "[Zac]";
+ mes "You need 300 Anolian Skins, 1 Bandana and 1 Cobaltblue Dyestuff for Blue Bandana.";
+ close;
+L2_4:
+ mes "[Zac]";
+ mes "You need 10 Amulets, 1 Cobaltblue Dyestuff and 1 Munak Hat for Bongun Hat.";
+ close;
+L2_5:
+ mes "[Zac]";
+ mes "You need 10 Candys, 5 Candy Canes, 15 Well Baked Cookies, 20 Pieces Of Cake and 10 Steels for Cake Hat.";
+ close;
+L2_6:
+ mes "[Zac]";
+ mes "You need 1 Bomb Wick, 100 Honeys and 50 Matchsticks for Candle Hat.";
+ close;
+L2_7:
+ mes "[Zac]";
+ mes "You need 120 Pieces of Cake, 450 Dragon Scales, 1 White Dyestuff and 330 Feathers for Chef's Hat.";
+ close;
+L2_8:
+ mes "[Zac]";
+ mes "You need 1 Egg Shell, 1 Cobaltblue Dyestuff and 50 Claws of Desert Wolf for Colored Egg Shell.";
+ close;
+L3:
+ mes "[Zac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+prontera.gat,143,172,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 8 hats and my brothers provides the other 24.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Blac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Crescent Moon Hairpin",L1_9,"Cross Hairband",L1_10,"Deviruchi Hat",L1_11,"Dumpling Decoration",L1_12,"Fashion Sunglasses",L1_13,"HandkerChief",L1_14,"Magic Instructor's Hat",L1_15,"Heart Hairpin",L1_16;
+L1_9:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(5041) < 1)) goto L_ITEM_1;
+ if((countitem(999) < 10)) goto L_ITEM_2;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Crescent Moon Hairpin for you right away. Please Wait a Moment.";
+ next;
+ delitem 5041,1;
+ delitem 999,10;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Crescent Moon Hairpin^000000...! Please Take it!";
+ getitem 5048,1;
+ 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;
+L1_10:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2608) < 1)) goto L_ITEM_1a;
+ if((countitem(7069) < 500)) goto L_ITEM_2a;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Cross Hairband for you right away. Please Wait a Moment.";
+ next;
+ delitem 2608,1;
+ delitem 7069,500;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Cross Hairband^000000...! Please Take it!";
+ getitem 5036,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1a:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Rosary...";
+ close;
+L_ITEM_2a:
+ mes "[Blac]";
+ mes "Oh, dear. You need 500 Destroyed Armors...";
+ close;
+L1_11:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7048) < 40)) goto L_ITEM_1b;
+ if((countitem(1038) < 600)) goto L_ITEM_2b;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Deviruchi Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 7048,40;
+ delitem 1038,600;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Deviruchi Hat^000000...! Please Take it!";
+ getitem 5038,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1b:
+ mes "[Blac]";
+ mes "Oh, dear. You need 40 Talons of Griffin...";
+ close;
+L_ITEM_2b:
+ mes "[Blac]";
+ mes "Oh, dear. You need 600 Little Evil Horns...";
+ close;
+L1_12:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(10007) < 1)) goto L_ITEM_1c;
+ if((countitem(968) < 50)) goto L_ITEM_2c;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Dumpling Decoration for you right away. Please Wait a Moment.";
+ next;
+ delitem 10007,1;
+ delitem 968,50;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Dumpling Decoration^000000...! Please Take it!";
+ getitem 5042,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1c:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Silk Ribbon...";
+ close;
+L_ITEM_2c:
+ mes "[Blac]";
+ mes "Oh, dear. You need 50 Heroic Emblems...";
+ close;
+L1_13:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2271) < 1)) goto L_ITEM_1d;
+ if((countitem(975) < 1)) goto L_ITEM_2d;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Fashion Sunglasses for you right away. Please Wait a Moment.";
+ next;
+ delitem 2271,1;
+ delitem 975,1;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Fashion Sunglasses^000000...! Please Take it!";
+ getitem 5047,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1d:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Jack a Dandy...";
+ close;
+L_ITEM_2d:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Scarlet Dyestuff...";
+ close;
+L1_14:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(1059) < 150)) goto L_ITEM_1e;
+ if((countitem(978) < 1)) goto L_ITEM_2e;
+ if((countitem(907) < 100)) goto L_ITEM_3e;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Handkerchief for you right away. Please Wait a Moment.";
+ next;
+ delitem 1059,150;
+ delitem 978,1;
+ delitem 907,100;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Handkerchief^000000...! Please Take it!";
+ getitem 5023,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1e:
+ mes "[Blac]";
+ mes "Oh, dear. You need 150 Fabrics...";
+ close;
+L_ITEM_2e:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Cobaltblue Dyestuff...";
+ close;
+L_ITEM_3e:
+ mes "[Blac]";
+ mes "Oh, dear. You need 100 Resins...";
+ close;
+L1_15:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2251) < 1)) goto L_ITEM_1f;
+ if((countitem(4052) < 1)) goto L_ITEM_2f;
+ if((countitem(1036) < 400)) goto L_ITEM_3f;
+ if((countitem(7001) < 50)) goto L_ITEM_4f;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Magic Instructor's Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 2251,1;
+ delitem 4052,1;
+ delitem 1036,400;
+ delitem 7001,50;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Magic Instructor's Hat^000000...! Please Take it!";
+ getitem 5027,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1f:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Wizard's Hat...";
+ close;
+L_ITEM_2f:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1 Elder Willow Card...";
+ close;
+L_ITEM_3f:
+ mes "[Blac]";
+ mes "Oh, dear. You need 400 Dragon Scales...";
+ close;
+L_ITEM_4f:
+ mes "[Blac]";
+ mes "Oh, dear. You need 50 Mould Powders...";
+ close;
+L1_16:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7013) < 1200)) goto L_ITEM_1g;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Heart Hairpin for you right away. Please Wait a Moment.";
+ next;
+ delitem 7013,1200;
+ mes "[Blac]";
+ mes "Tah Dah! ^FF0000Heart Hairpin^000000...! Please Take it!";
+ getitem 5041,1;
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1g:
+ mes "[Blac]";
+ mes "Oh, dear. You need 1200 Coral Reef's...";
+ close;
+L2:
+ mes "[Blac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Crescent Moon Hairpin",L2_9,"Cross Hairband",L2_10,"Deviruchi Hat",L2_11,"Dumpling Decoration/Chun Li Hat",L2_12,"Fashion Sunglasses",L2_13,"HandkerChief",L2_14,"Magic Instructor's Hat",L2_15,"Heart Hairpin",L2_16;
+L2_9:
+ mes "[Blac]";
+ mes "You need 1 Heart Hairpin and 10 Steels for Crescent Moon Hairpin.";
+ close;
+L2_10:
+ mes "[Blac]";
+ mes "You need 1 Rosary and 500 Destroyed Armors for Cross Hairband.";
+ close;
+L2_11:
+ mes "[Blac]";
+ mes "You need 40 Talon's of Griffin and 600 Little Evil Horns for Deviruchi Hat.";
+ close;
+L2_12:
+ mes "[Blac]";
+ mes "You need 1 Silk Ribbon and 50 Heroic Emblems for Dumping Decoration.";
+ close;
+L2_13:
+ mes "[Blac]";
+ mes "You need 1 Jack a Dandy and 1 Scarlet Dyestuff for Fashion Sunglasses.";
+ close;
+L2_14:
+ mes "[Blac]";
+ mes "You need 150 Fabrics, 1 Cobaltblue Dyestuff and 100 Resins for Handkerchief.";
+ close;
+L2_15:
+ mes "[Blac]";
+ mes "You need 1 Wizard's Hat, 1 Elder Willow Card, 400 Dragon Scales and 50 Mould Powders for Magic Instructor's Hat.";
+ close;
+L2_16:
+ mes "[Blac]";
+ mes "You need 1200 Coral Reef's for Heart Hairpin.";
+ close;
+L3:
+ mes "[Blac]";
+ mes "Stop by some other time with the right materials, so I can make the hats for you.";
+ close;
+}
+
+prontera.gat,141,172,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 8 hats and my brothers provides the other 24.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Jac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Heart of Merchant",L1_17,"Innocence of Maiden",L1_18,"Kafra Band",L1_19,"Lightbulb Hairband",L1_20,"Magic Hat",L1_21,"Miner's Helm",L1_22,"Mysterious Apple Hat",L1_23,"Panda Hat",L1_24;
+L1_17:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2233) < 1)) goto L_ITEM_1;
+ if((countitem(969) < 1)) goto L_ITEM_2;
+ if((countitem(949) < 80)) goto L_ITEM_3;
+ if((countitem(938) < 100)) goto L_ITEM_4;
+ if((countitem(999) < 20)) goto L_ITEM_5;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Heart of Merchant for you right away. Please Wait a Moment.";
+ next;
+ delitem 2233,1;
+ delitem 969,1;
+ delitem 949,80;
+ delitem 999,20;
+ delitem 938,800;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Heart of Merchant^000000...! Please Take it!";
+ getitem 5021,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Slotted Circlet...";
+ close;
+L_ITEM_2:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Gold...";
+ close;
+L_ITEM_3:
+ mes "[Jac]";
+ mes "Oh, dear. You need 80 Feather...";
+ close;
+L_ITEM_4:
+ mes "[Jac]";
+ mes "Oh, dear. You need 800 Sticky Muscus...";
+ close;
+L_ITEM_5:
+ mes "[Jac]";
+ mes "Oh, dear. You need 20 Steels...";
+ close;
+L1_18:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7047) < 100)) goto L_ITEM_1a;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Innocence of Maiden for you right away. Please Wait a Moment.";
+ next;
+ delitem 7047,100;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Innocence of Maiden^000000...! Please Take it!";
+ getitem 5040,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1a:
+ mes "[Jac]";
+ mes "Oh, dear. You need 100 Alice's Apron...";
+ close;
+L1_19:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(10007) < 1)) goto L_ITEM_1b;
+ if((countitem(10008) < 1)) goto L_ITEM_2b;
+ 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;
+ delitem 10007,1;
+ delitem 10009,1;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Kafra Band^000000...! Please Take it!";
+ getitem 5020,1;
+ 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_20:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2233) < 1)) goto L_ITEM_1c;
+ if((countitem(746) < 20)) goto L_ITEM_2c;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Lightbulb Hairband for you right away. Please Wait a Moment.";
+ next;
+ delitem 2233,1;
+ delitem 746,20;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Lightbulb Hairband^000000...! Please Take it!";
+ getitem 5034,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1c:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Slotted Criclet...";
+ close;
+L_ITEM_2c:
+ mes "[Jac]";
+ mes "Oh, dear. You need 20 Glass Bead...";
+ close;
+L1_21:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2252) < 1)) goto L_ITEM_1d;
+ if((countitem(943) < 1200)) goto L_ITEM_2d;
+ if((countitem(1054) < 450)) goto L_ITEM_3d;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Magic Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 2252,1;
+ delitem 943,1200;
+ delitem 1054,450;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Magic Hat^000000...! Please Take it!";
+ getitem 5045,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1d:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Wizard's Hat...";
+ close;
+L_ITEM_2d:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1200 Solid Shells...";
+ close;
+L_ITEM_3d:
+ mes "[Jac]";
+ mes "Oh, dear. You need 450 Ancient Lips...";
+ close;
+L1_22:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(5009) < 1)) goto L_ITEM_1e;
+ if((countitem(999) < 25)) goto L_ITEM_2e;
+ if((countitem(747) < 1)) goto L_ITEM_3e;
+ if((countitem(5028) < 1)) goto L_ITEM_4e;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Miner's Helm for you right away. Please Wait a Moment.";
+ next;
+ delitem 5009,1;
+ delitem 999,25;
+ delitem 747,1;
+ delitem 5028,1;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Miner's Helm^000000...! Please Take it!";
+ getitem 5031,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1e:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Safety Helmet...";
+ close;
+L_ITEM_2e:
+ mes "[Jac]";
+ mes "Oh, dear. You need 25 Steels...";
+ close;
+L_ITEM_3e:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Crystal Mirror...";
+ close;
+L_ITEM_4e:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Candle...";
+ close;
+L1_23:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(5037) < 1)) goto L_ITEM_1f;
+ if((countitem(7064) < 500)) goto L_ITEM_2f;
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Mysterious Apple Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 5037,1;
+ delitem 7064,500;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Mysterious Apple Hat^000000...! Please Take it!";
+ getitem 5050,1;
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1f:
+ mes "[Jac]";
+ mes "Oh, dear. You need 1 Apple Hat...";
+ close;
+L_ITEM_2f:
+ mes "[Jac]";
+ mes "Oh, dear. You need 500 Wings of Dragonfly...";
+ close;
+L1_24:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(999) < 10)) goto L_ITEM_1g;
+ if((countitem(948) < 200)) goto L_ITEM_2g;
+ 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;
+ delitem 999,10;
+ delitem 948,200;
+ mes "[Jac]";
+ mes "Tah Dah! ^FF0000Panda Hat^000000...! Please Take it!";
+ getitem 5030,1;
+ 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 "Heart of Merchant",L2_17,"Innocence of Maiden",L2_18,"Kafra Band",L2_19,"Lightbulb Hairband",L2_20,"Magic Hat",L2_21,"Miner's Helm",L2_22,"Mysterious Apple Hat",L2_23,"Panda Hat",L2_24;
+L2_17:
+ mes "[Jac]";
+ mes "You need 1 Slotted Circlet, 1 Gold Bar, 80 Feathers, 20 Steels and 800 Sticky Muscus for Heart of Merchant";
+ close;
+L2_18:
+ mes "[Jac]";
+ mes "You need 100 Alice's Aprons for Innocence of Maiden.";
+ close;
+L2_19:
+ mes "[Jac]";
+ mes "You need 1 Silk Ribbon and 1 Wild Flower for Kafra Band.";
+ close;
+L2_20:
+ mes "[Jac]";
+ mes "You need 1 Slotted Circlet and 20 Glass Beads for Lightbulb Hairband.";
+ close;
+L2_21:
+ mes "[Jac]";
+ mes "You need 1 Wizard's Hat, 1200 Solid Shells and 450 Ancient Lips for Magic Hat.";
+ close;
+L2_22:
+ mes "[Jac]";
+ mes "You need 1 Safety Helmet, 25 Steels, 1 Crystal Mirror and 1 Candle for Miner's Helm.";
+ close;
+L2_23:
+ mes "[Jac]";
+ mes "You need 1 Apple Hat and 500 Wings of Dragonfly for Mysterious Apple Hat.";
+ 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;
+}
+
+prontera.gat,142,172,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 8 hats and my brothers provides the other 24.";
+ next;
+ menu "Join",L1,"Information",L2,"Cancel",L3;
+L1:
+ mes "[Pac]";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Phantom of the Opera",L1_25,"Poring Hat",L1_26,"Smokie Hat",L1_27,"Solar God Helm",L1_28,"Sphinx Hat",L1_29,"Spore Hat",L1_30,"Striped Bandana",L1_31,"Sunday Hat",L1_32;
+L1_25:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2281) < 1)) goto L_ITEM_1;
+ if((countitem(1048) < 50)) goto L_ITEM_2;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Phantom of the Opera for you right away. Please Wait a Moment.";
+ next;
+ delitem 2281,1;
+ delitem 1048,50;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Phatom of the Opera^000000...! Please Take it!";
+ getitem 5043,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Opera Mask...";
+ close;
+L_ITEM_2:
+ mes "[Pac]";
+ mes "Oh, dear. You need 50 Horrendous Hairs...";
+ close;
+L1_26:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(741) < 1)) goto L_ITEM_1a;
+ if((countitem(909) < 300)) goto L_ITEM_2a;
+ 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;
+ delitem 741,1;
+ delitem 909,300;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Poring Hat^000000...! Please Take it!";
+ getitem 5035,1;
+ 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_27:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2213) < 1)) goto L_ITEM_1b;
+ if((countitem(1036) < 20)) goto L_ITEM_2b;
+ if((countitem(7012) < 200)) goto L_ITEM_3b;
+ if((countitem(7065) < 300)) goto L_ITEM_4b;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Smokie Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 2213,1;
+ delitem 1036,20;
+ delitem 7012,200;
+ delitem 7065,300;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Smokie Hat^000000...! Please Take it!";
+ getitem 5033,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1b:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Kitty Band...";
+ close;
+L_ITEM_2b:
+ mes "[Pac]";
+ mes "Oh, dear. You need 20 Dragon Scales...";
+ close;
+L_ITEM_3b:
+ mes "[Pac]";
+ mes "Oh, dear. You need 200 Tough Scalelike Stems...";
+ close;
+L_ITEM_4b:
+ mes "[Pac]";
+ mes "Oh, dear. You need 300 Fur's of Sea Otter...";
+ close;
+L1_28:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7086) < 1)) goto L_ITEM_1c;
+ if((countitem(999) < 40)) goto L_ITEM_2c;
+ if((countitem(984) < 2)) goto L_ITEM_3c;
+ if((countitem(969) < 10)) goto L_ITEM_4c;
+ if((countitem(1003) < 50)) goto L_ITEM_5c;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Solar God Helm for you right away. Please Wait a Moment.";
+ next;
+ delitem 7086,1;
+ delitem 999,40;
+ delitem 984,2;
+ delitem 969,10;
+ delitem 1003,50;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Solar God Helm^000000...! Please Take it!";
+ getitem 5022,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1c:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Emblem of the Sun God...";
+ close;
+L_ITEM_2c:
+ mes "[Pac]";
+ mes "Oh, dear. You need 40 Steels...";
+ close;
+L_ITEM_3c:
+ mes "[Pac]";
+ mes "Oh, dear. You need 2 Oridecons...";
+ close;
+L_ITEM_4c:
+ mes "[Pac]";
+ mes "Oh, dear. You need 10 Gold Bar's...";
+ close;
+L_ITEM_5c:
+ mes "[Pac]";
+ mes "Oh, dear. You need 50 Coals...";
+ close;
+L1_29:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(999) < 25)) goto L_ITEM_1d;
+ if((countitem(979) < 1)) goto L_ITEM_2d;
+ if((countitem(976) < 1)) goto L_ITEM_3d;
+ if((countitem(1059) < 150)) goto L_ITEM_4d;
+ if((countitem(969) < 2)) goto L_ITEM_5d;
+ 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;
+ delitem 999,1;
+ delitem 979,1;
+ delitem 976,1;
+ delitem 1059,150;
+ delitem 969,2;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Sphinx Hat^000000...! Please Take it!";
+ getitem 5053,1;
+ 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;
+L1_30:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(7033) < 850)) goto L_ITEM_1e;
+ if((countitem(7068) < 300)) goto L_ITEM_2e;
+ if((countitem(1015) < 1)) goto L_ITEM_3e;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Spore Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 7033,850;
+ delitem 7068,300;
+ delitem 1015,1;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Spore Hat^000000...! Please Take it!";
+ getitem 5029,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1e:
+ mes "[Pac]";
+ mes "Oh, dear. You need 850 Poison Spores...";
+ close;
+L_ITEM_2e:
+ mes "[Pac]";
+ mes "Oh, dear. You need 300 Half Burnt Logs...";
+ close;
+L_ITEM_3e:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Tongue...";
+ close;
+L1_31:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(1099) < 1500)) goto L_ITEM_1f;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Striped Bandana for you right away. Please Wait a Moment.";
+ next;
+ delitem 1099,1500;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Striped Bandana^000000...! Please Take it!";
+ getitem 5049,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1f:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1500 Worn-out Prisoner Uniforms...";
+ close;
+L1_32:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2221) < 1)) goto L_ITEM_1g;
+ if((countitem(2227) < 1)) goto L_ITEM_2g;
+ if((countitem(1059) < 250)) goto L_ITEM_3g;
+ if((countitem(7063) < 600)) goto L_ITEM_4g;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Sunday Hat for you right away. Please Wait a Moment.";
+ next;
+ delitem 2221,1;
+ delitem 2227,1;
+ delitem 1059,250;
+ delitem 7063,600;
+ mes "[Pac]";
+ mes "Tah Dah! ^FF0000Sunday Hat^000000...! Please Take it!";
+ getitem 5032,1;
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more. Thank you.";
+ close;
+L_ITEM_1g:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Slotted Hat...";
+ close;
+L_ITEM_2g:
+ mes "[Pac]";
+ mes "Oh, dear. You need 1 Slotted Cap...";
+ close;
+L_ITEM_3g:
+ mes "[Pac]";
+ mes "Oh, dear. You need 250 Fabrics...";
+ close;
+L_ITEM_4g:
+ mes "[Pac]";
+ mes "Oh, dear. You need 600 Soft Feathers...";
+ close;
+L2:
+ mes "[Pac]";
+ mes "Which hat materials do you wish to know?";
+ next;
+ menu "Phantom of the Opera",L2_25,"Poring Hat",L2_26,"Smokie Hat",L2_27,"Solar God Helm",L2_28,"Sphinx Hat",L2_29,"Spore Hat",L2_30,"Striped Bandana",L2_31,"Sunday Hat",L2_32;
+L2_25:
+ mes "[Pac]";
+ mes "You need 1 Opera Mask and 50 Horrendous Hairs for Phantom of the Opera.";
+ close;
+L2_26:
+ mes "[Pac]";
+ mes "You need 1 Poring Doll and 300 Jellopys for Poring Hat.";
+ close;
+L2_27:
+ mes "[Pac]";
+ mes "You need 1 Kitty Band, 20 Dragon Scale, 200 Tough Scalelike Stem and 300 Fur's of Sea Otter for Smokie Hat.";
+ close;
+L2_28:
+ mes "[Pac]";
+ mes "You need 1 Emblem of the Sun God, 40 Steels, 2 Oridecons, 10 Gold Bar's and 50 Coals for Solar God Helm.";
+ 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;
+L2_30:
+ mes "[Pac]";
+ mes "You need 850 Poison Spores, 300 Half Burnt Logs and 1 Tongue for Spore Hat.";
+ close;
+L2_31:
+ mes "[Pac]";
+ mes "You need 1500 Worn-out Prisoner Uniforms for Striped Bandana.";
+ close;
+L2_32:
+ mes "[Pac]";
+ mes "You need 1 Slotted Hat, 1 Slotted Cap, 250 Fabrics and 600 Soft Feathers for Sunday 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:
+ enablenpc "Zac";
+ end;
+}
+
+- script EDJac -1,{
+OnInit:
+OnMinute30:
+ disablenpc "Jac";
+ end;
+OnMinute16:
+ enablenpc "Jac";
+ end;
+}
+
+- script EDPac -1,{
+OnInit:
+OnMinute45:
+ disablenpc "Pac";
+ end;
+OnMinute31:
+ enablenpc "Pac";
+ end;
+}
+
+- script EDBlac -1,{
+OnInit:
+OnMinute00:
+ disablenpc "Blac";
+ end;
+OnMinute46:
+ enablenpc "Blac";
+ end;
+}
diff --git a/npc/quests/custom/excalibur.txt b/npc/quests/custom/excalibur.txt
index 77db880ec..f96c25309 100644
--- a/npc/quests/custom/excalibur.txt
+++ b/npc/quests/custom/excalibur.txt
@@ -1,68 +1,68 @@
-// Excalibur Quest NPC
-// By: Syrus22
-// Version 1.0
-// Any comments or questions PM me on the Yare forums
-// Description: This is a simple item quest NPC. The player must find an
-// Angel Band, a Heaven Ring, and an Emperium. If they do they will receive
-// the Excalibur.
-prt_castle.gat,81,171,5 script Mysterious King 108,{
-mes "[Excalibur Quest Rep]";
-mes "Hello Adventurer.";
-mes "I'm glad to announce that we are sponsoring a hunt for the legendary sword, Excalibur. Or more appropriately a hunt for certain rare items that can be traded in for the legendary sword.";
-next;
-goto ExMenu;
- ExMenu:
- menu "Required Items",ExItems,"Create Excalibur",ExCreate,"End",ExEnd;
-
- ExItems:
- mes "[Excalibur Quest Rep]";
- mes "You need the following items to create the Excalibur.";
- mes "Angel Band";
- mes "Heaven Ring";
- mes "Emperium";
- next;
- goto ExMenu;
-
- ExCreate:
- mes "[Excalibur Quest Rep]";
- mes "Let me check your inventory!";
- next;
- if(countitem(2254)<1) goto NoAngel;
- if(countitem(2282)<1) goto NoHeaven;
- if(countitem(714)<1) goto NoEmp;
- goto ExGive;
-
- NoAngel:
- mes "[Excalibur Quest Rep]";
- mes "Sorry but you must have at least 1 Angel Band.";
- mes "Come back after you get ALL the items.";
- close;
-
- NoHeaven:
- mes "[Excalibur Quest Rep]";
- mes "Sorry but you must have at least 1 Heaven Ring.";
- mes "Come back after you get ALL the items.";
- close;
-
- NoEmp:
- mes "[Excalibur Quest Rep]";
- mes "Sorry but you must have at least 1 Emperium.";
- mes "Come back after you get ALL the items.";
- close;
-
- ExGive:
- mes "[Excalibur Quest Rep]";
- mes "Congratulations. You have collected all necessary items. I give to you the Excalibur!!!";
- delitem 2254,1;
- delitem 2282,1;
- delitem 714,1;
- getitem 1137,1;
- mes "Thank you for your participation!";
- close;
-
- ExEnd:
- mes "[Excalibur Quest Rep]";
- mes "Good bye then. Hope you try the quest!";
- close;
-close; }
-}
+// Excalibur Quest NPC
+// By: Syrus22
+// Version 1.0
+// Any comments or questions PM me on the Yare forums
+// Description: This is a simple item quest NPC. The player must find an
+// Angel Band, a Heaven Ring, and an Emperium. If they do they will receive
+// the Excalibur.
+prt_castle.gat,81,171,5 script Mysterious King 108,{
+mes "[Excalibur Quest Rep]";
+mes "Hello Adventurer.";
+mes "I'm glad to announce that we are sponsoring a hunt for the legendary sword, Excalibur. Or more appropriately a hunt for certain rare items that can be traded in for the legendary sword.";
+next;
+goto ExMenu;
+ ExMenu:
+ menu "Required Items",ExItems,"Create Excalibur",ExCreate,"End",ExEnd;
+
+ ExItems:
+ mes "[Excalibur Quest Rep]";
+ mes "You need the following items to create the Excalibur.";
+ mes "Angel Band";
+ mes "Heaven Ring";
+ mes "Emperium";
+ next;
+ goto ExMenu;
+
+ ExCreate:
+ mes "[Excalibur Quest Rep]";
+ mes "Let me check your inventory!";
+ next;
+ if(countitem(2254)<1) goto NoAngel;
+ if(countitem(2282)<1) goto NoHeaven;
+ if(countitem(714)<1) goto NoEmp;
+ goto ExGive;
+
+ NoAngel:
+ mes "[Excalibur Quest Rep]";
+ mes "Sorry but you must have at least 1 Angel Band.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+ NoHeaven:
+ mes "[Excalibur Quest Rep]";
+ mes "Sorry but you must have at least 1 Heaven Ring.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+ NoEmp:
+ mes "[Excalibur Quest Rep]";
+ mes "Sorry but you must have at least 1 Emperium.";
+ mes "Come back after you get ALL the items.";
+ close;
+
+ ExGive:
+ mes "[Excalibur Quest Rep]";
+ mes "Congratulations. You have collected all necessary items. I give to you the Excalibur!!!";
+ delitem 2254,1;
+ delitem 2282,1;
+ delitem 714,1;
+ getitem 1137,1;
+ mes "Thank you for your participation!";
+ close;
+
+ ExEnd:
+ mes "[Excalibur Quest Rep]";
+ mes "Good bye then. Hope you try the quest!";
+ close;
+close; }
+}
diff --git a/npc/quests/custom/ironcane.txt b/npc/quests/custom/ironcane.txt
index a3a08c40f..8694d6ebf 100644
--- a/npc/quests/custom/ironcane.txt
+++ b/npc/quests/custom/ironcane.txt
@@ -1,52 +1,52 @@
-//===== eAthena Script =======================================
-//= Quest For Iron Cain
-//===== By: ==================================================
-//= Dev Team
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Iron Cain (lower part of a full helmet)
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-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 ". . . . . .";
- 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;
- mes ". . . . .";
- mes "Wow! You are brave indeed!";
- delitem 931,200;
- delitem 968,1;
- next;
- mes "[Iron Cain Quest]";
- mes ". . . . .";
- 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 ". . . . .";
- 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: ==================================================
+//= Dev Team
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Iron Cain (lower part of a full helmet)
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+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 ". . . . . .";
+ 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;
+ mes ". . . . .";
+ mes "Wow! You are brave indeed!";
+ delitem 931,200;
+ delitem 968,1;
+ next;
+ mes "[Iron Cain Quest]";
+ mes ". . . . .";
+ 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 ". . . . .";
+ 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/quests/custom/kaho_balmung.txt b/npc/quests/custom/kaho_balmung.txt
index d10fc038b..c9e9682ab 100644
--- a/npc/quests/custom/kaho_balmung.txt
+++ b/npc/quests/custom/kaho_balmung.txt
@@ -1,97 +1,97 @@
-// $Id: kaho_balmung.txt,v 1.1.1.1 2004/09/10 17:26:46 MagicalTux Exp $
-//-------------------- 'Balmung & Lord Kaho's Horns' Quest --------------------
-
-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",Lok,"No",Lend;
-Lok:
- mes "[Royal Messenger]";
- mes "There are too quests please chose the one you must like.";
- next;
- menu "Balmung",Lb,"Lord Kahos horns",Lkahos,"No",Lend;
-Lb:
- 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) goto Lend2;
- if(countitem(984)<10) goto Lend2;
- if(countitem(996)<10) goto Lend2;
- if(countitem(994)<10) goto Lend2;
- if(countitem(995)<10) goto Lend2;
- if(countitem(997)<10) goto Lend2;
- if(Zeny<1000000) goto NoGold;
- goto Lget;
- mes "[Royal Messenger]";
- mes "Happy item hunting and good luck";
- 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) goto Lend2;
- if(countitem(1001)<10) goto Lend2;
- if(countitem(996)<10) goto Lend2;
- if(countitem(994)<10) goto Lend2;
- if(countitem(995)<10) goto Lend2;
- if(countitem(997)<10) goto Lend2;
- if(Zeny<1000000) goto NoGold;
- goto Lget1;
- mes "[Royal Messenger]";
- mes"Happy item hunting and good luck";
- close;
-Lend:
- mes "[Royal Messenger]";
- mes "Have a nice day.";
- close;
-Lend2:
- mes "[Royal Messenger]";
- mes "Sorry you dont have all the items i need.";
- mes "comeback when you have them all";
- close;
-NoGold:
- mes "[Royal Messenger]";
- mes "Sorry you dont have enought gold";
- close;
-Lget:
- 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;
-Lget1:
- 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; }
-
+// $Id: kaho_balmung.txt,v 1.1.1.1 2004/09/10 17:26:46 MagicalTux Exp $
+//-------------------- 'Balmung & Lord Kaho's Horns' Quest --------------------
+
+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",Lok,"No",Lend;
+Lok:
+ mes "[Royal Messenger]";
+ mes "There are too quests please chose the one you must like.";
+ next;
+ menu "Balmung",Lb,"Lord Kahos horns",Lkahos,"No",Lend;
+Lb:
+ 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) goto Lend2;
+ if(countitem(984)<10) goto Lend2;
+ if(countitem(996)<10) goto Lend2;
+ if(countitem(994)<10) goto Lend2;
+ if(countitem(995)<10) goto Lend2;
+ if(countitem(997)<10) goto Lend2;
+ if(Zeny<1000000) goto NoGold;
+ goto Lget;
+ mes "[Royal Messenger]";
+ mes "Happy item hunting and good luck";
+ 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) goto Lend2;
+ if(countitem(1001)<10) goto Lend2;
+ if(countitem(996)<10) goto Lend2;
+ if(countitem(994)<10) goto Lend2;
+ if(countitem(995)<10) goto Lend2;
+ if(countitem(997)<10) goto Lend2;
+ if(Zeny<1000000) goto NoGold;
+ goto Lget1;
+ mes "[Royal Messenger]";
+ mes"Happy item hunting and good luck";
+ close;
+Lend:
+ mes "[Royal Messenger]";
+ mes "Have a nice day.";
+ close;
+Lend2:
+ mes "[Royal Messenger]";
+ mes "Sorry you dont have all the items i need.";
+ mes "comeback when you have them all";
+ close;
+NoGold:
+ mes "[Royal Messenger]";
+ mes "Sorry you dont have enought gold";
+ close;
+Lget:
+ 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;
+Lget1:
+ 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; }
+
diff --git a/npc/quests/custom/kahohorn.txt b/npc/quests/custom/kahohorn.txt
index 84ed22300..d0dfbf082 100644
--- a/npc/quests/custom/kahohorn.txt
+++ b/npc/quests/custom/kahohorn.txt
@@ -1,79 +1,79 @@
-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";
- 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!",LSureAm,"These requirements are unfathomable!",LUnfathomable;
-
- LSureAm:
- 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;
- mes ". . . . .";
- 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;
-}
+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";
+ 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!",LSureAm,"These requirements are unfathomable!",LUnfathomable;
+
+ LSureAm:
+ 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;
+ mes ". . . . .";
+ 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/quests/custom/new_hats.txt b/npc/quests/custom/new_hats.txt
index 484d83e29..bdbbb93c7 100644
--- a/npc/quests/custom/new_hats.txt
+++ b/npc/quests/custom/new_hats.txt
@@ -1,1469 +1,1469 @@
-//===== eAthena Script =======================================
-//= The 32 New Hats
-//===== By: ==================================================
-//= Darkchild
-//===== Current Version: =====================================
-//= 1.4
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= 4 brothers give you quests to get 32 new hats
-//===== Additional Comments: =================================
-//= There are 2 scripts for these 32 'new' hats.
-//= The other one doesnt have all the new ones and has some old ones
-//= Advise to use this script
-//= 1.2 revision
-//= 1.3 fixed bug where npcs would give out free items [Shinigami]
-//= 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]
-//============================================================
-prontera.gat,140,172,5 script Zac 704,{
- mes "[Zac]";
- mes "I am the oldest and strongest of the 4 brothers that makes all the newer hats.";
- mes "You will need to bring me the correct items for each hat so I can make them.";
- mes "I provide 8 hats and my brothers provides the other 24.";
- mes "What hat do you want me to make?";
- next;
- menu "Attitude Campus Hat",L1_1,"Fox Mask",L1_2,"X Cross Hairpin",L1_3,"Flower Hair Pin",L1_4,"Tulip Hair Pin",L1_5,"Mushroom Hairband",L1_6,"Troublesome Raccoon Doll",L1_7,"Blue Fish",L1_8;
- L1_1:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if((countitem(2285)<1) && (countitem(1550)<1)) goto L_ITEM_1;//Items: Apple o' Archer, Book,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Attitude Campus Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2285,1;//Items: Apple o' Archer,
- delitem 1550,1;//Items: Book,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Attitude Campus Hat^000000...! Please Take it!";
- getitem 5073,1;//Items: Campus Hat,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_1:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Attitude Campus Hat requires~~";
- next;
- mes "[Zac]";
- mes "1 Apple o' Archer";
- mes "1 Book";
- mes "...Did you know this already?";
- close;
- L1_2:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(1022)<999) goto L_ITEM_2;//Items: Nine Tails,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Fox Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 1022,999;//Items: Nine Tails,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Fox Mask^000000...! Please Take it!";
- getitem 5069,1;//Items: Fox Mask,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_2:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Fox Mask requires~~";
- next;
- mes "[Zac]";
- mes "999 Nine Tails";
- mes "...Did you know this already?";
- close;
- L1_3:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(10011)<1) goto L_ITEM_3;//Items: Stellar Hairpin,
- if(countitem(2266)<1) goto L_ITEM_3;//Items: Iron Cain,
- if(countitem(909)<100) goto L_ITEM_3;//Items: Jellopy,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the X Cross Hairpin for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 10011,1;//Items: Stellar Hairpin,
- delitem 2266,1;//Items: Iron Cain,
- delitem 909,100;//Items: Jellopy,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000X Cross Hairpin^000000...! Please Take it!";
- getitem 5079,1;//Items: X Hairpin,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_3:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "X Cross Hairpin requires~~";
- next;
- mes "[Zac]";
- mes "1 Stellar Hairpin";
- mes "1 Iron Cain";
- mes "100 Jellopy";
- mes "...Did you know this already?";
- close;
- L1_4:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2270)<1) goto L_ITEM_4;//Items: Centimental Leaf,
- if(countitem(999)<10) goto L_ITEM_4;//Items: Steel,
- if(Zeny < 20000) goto L_ITEM_4;
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Flower Hair Pin for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2270,1;//Items: Centimental Leaf,
- delitem 999,10;//Items: Steel,
- set Zeny,Zeny-20000;
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Flower Hair Pin^000000...! Please Take it!";
- getitem 5061,1;//Items: Flower Hairpin,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_4:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Flower Hair Pin requires~~";
- next;
- mes "[Zac]";
- mes "1 Romantic Leaf";
- mes "10 Steel";
- mes "20,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_5:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2278)<1) goto L_ITEM_5;//Items: Mr. Smile,
- if(countitem(980)<1) goto L_ITEM_5;//Items: Orange Dyestuff,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Tulip Hair Pin for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2278,1;//Items: Mr. Smile,
- delitem 980,1;//Items: Orange Dyestuff,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Tulip Hair Pin^000000...! Please Take it!";
- getitem 5077,1;//Items: Tulip Hairpin,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_5:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Tulip Hair Pin requires~~";
- next;
- mes "[Zac]";
- mes "1 Mr. Smile";
- mes "1 Orange Dyestuffs";
- mes "...Did you know this already?";
- close;
- L1_6:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(921)<300) goto L_ITEM_6;//Items: Mushroom Spore,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Mushroom Hairband for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 921,300;//Items: Mushroom Spore,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Mushroom Hairband^000000...! Please Take it!";
- getitem 5082,1;//Items: Mushroom Hairband,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_6:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Mushroom Hairband requires~~";
- next;
- mes "[Zac]";
- mes "300 Mushroom Spores";
- mes "...Did you know this already?";
- close;
- L1_7:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(1026)<100) goto L_ITEM_7;//Items: Acorn,
- if(countitem(7065)<100) goto L_ITEM_7;//Items: Sea Otter Fur,
- if(countitem(945)<100) goto L_ITEM_7;//Items: Raccoon Leaf,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Troublesome Raccoon Doll for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 1026,100;//Items: Acorn,
- delitem 7065,100;//Items: Sea Otter Fur,
- delitem 945,100;//Items: Raccoon Leaf,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Troublesome Raccoon Doll^000000...! Please Take it!";
- getitem 5084,1;//Items: Lazy Racoon Hat,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_7:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Troublesome Raccoon Doll requires~~";
- next;
- mes "[Zac]";
- mes "100 Acorn";
- mes "100 Sea Otter Fur";
- mes "100 Raccoon Leaf";
- mes "...Did you know this already?";
- close;
- L1_8:
- mes "[Zac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(624)<2) goto L_ITEM_8;//Items: Rotten Fish,
- if(countitem(959)<300) goto L_ITEM_8;//Items: Stinky Scale,
- if(countitem(1023)<30) goto L_ITEM_8;//Items: Fish Tail,
- if(countitem(938)<100) goto L_ITEM_8;//Items: Sticky Mucus,
- mes "[Zac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Blue Fish for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 624,2;//Items: Rotten Fish,
- delitem 959,300;//Items: Stinky Scale,
- delitem 1023,30;//Items: Fish Tail,
- delitem 938,100;//Items: Sticky Mucus,
- mes "[Zac]";
- mes "Tah Dah!!!^FF0000Blue Fish^000000...! Please Take it!";
- getitem 5065,1;//Items: Fresh Blueish Fish,
- next;
- mes "[Zac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_8:
- mes "[Zac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Zac]";
- mes "Blue Fish requires~~";
- next;
- mes "[Zac]";
- mes "2 Rotten Fish";
- mes "300 Rotten Scale";
- mes "30 Fish Tail";
- mes "100 Sticky Mucus";
- mes "...Did you know this already?";
- close;
-}
-
-
-prontera.gat,141,172,5 script Jac 107,{
- mes "[Jac]";
- mes "I am the 2nd oldest and calmest of the 4 brothers that makes all the newer hats.";
- mes "You will need to bring me the correct items for each hat so I can make them.";
- mes "I provide 8 hats and my brothers provides the other 24.";
- mes "What hat do you want me to make?";
- next;
- menu "Drooped Cat",L1_9,"Leaf of Transformation",L1_10,"Bear Pebble Hat",L1_11,"Sea Otter Hat",L1_12,"Sleepy Hat",L1_13,"Straw Hat",L1_14,"Cowboy Hat",L1_15,"Sombrero",L1_16;
- L1_9:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2233)<1) goto L_ITEM_9;//Items: Circlet,
- if(countitem(983)<1) goto L_ITEM_9;//Items: Black Dyestuff,
- if(countitem(740)<1) goto L_ITEM_9;//Items: Puppet,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Drooped Cat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2233,1;//Items: Circlet,
- delitem 983,1;//Items: Black Dyestuff,
- delitem 740,1;//Items: Puppet,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Drooped Cat^000000...! Please Take it!";
- getitem 5058,1;//Items: Resting Cat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_9:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Drooped Cat requires~~";
- next;
- mes "[Jac]";
- mes "1 Slotted Circlet";
- mes "1 Black Dyestuffs";
- mes "1 Puppet";
- mes "...Did you know this already?";
- close;
- L1_10:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(945)<600) goto L_ITEM_10;//Items: Raccoon Leaf,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Leaf of Transformation for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 945,600;//Items: Raccoon Leaf,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Leaf of Transformation^000000...! Please Take it!";
- getitem 5064,1;//Items: Transformation Leaf,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_10:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Leaf of Transformation requires~~";
- next;
- mes "[Jac]";
- mes "600 Raccoon Leaf";
- mes "...Did you know this already?";
- close;
- L1_11:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(5030)<1) goto L_ITEM_11;//Items: Panda Hat,
- if(countitem(952)<100) goto L_ITEM_11;//Items: Cactus Needle,
- if(countitem(999)<20) goto L_ITEM_11;//Items: Steel,
- if(countitem(948)<200) goto L_ITEM_11;//Items: Bears Footskin,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Bear Pebble Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 5030,1;//Items: Panda Hat,
- delitem 952,100;//Items: Cactus Needle,
- delitem 999,20;//Items: Steel,
- delitem 948,200;//Items: Bears Footskin,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Bear Pebble Hat^000000...! Please Take it!";
- getitem 5059,1;//Items: Bear Hat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_11:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Bear Pebble Hat requires~~";
- next;
- mes "[Jac]";
- mes "1 Panda Hat";
- mes "100 Cactus Needle";
- mes "20 Steel";
- mes "200 Bear's Footskin";
- mes "...Did you know this already?";
- close;
- L1_12:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(5084)<1) goto L_ITEM_12;//Items: Lazy Racoon Hat,
- if(countitem(5064)<1) goto L_ITEM_12;//Items: Transformation Leaf,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Sea Otter Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 5084,1;//Items: Lazy Racoon Hat,
- delitem 5064,1;//Items: Transformation Leaf,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Sea Otter Hat^000000...! Please Take it!";
- getitem 5078,1;//Items: Sea Otter Hat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_12:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Sea Otter Hat requires~~";
- next;
- mes "[Jac]";
- mes "1 Troublesome Raccoon Doll";
- mes "1 Leaf of Transformation";
- mes "...Did you know this already?";
- close;
- L1_13:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2236)<1) goto L_ITEM_13;//Items: Santa's Hat,
- if(countitem(7111)<200) goto L_ITEM_13;//Items: String Paper,
- if(countitem(7112)<1) goto L_ITEM_13;//Items: Transparent Paper,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Sleepy Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2236,1;//Items: Santa's Hat,
- delitem 7111,200;//Items: String Paper,
- delitem 7112,1;//Items: Transparent Paper,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Sleepy Hat^000000...! Please Take it!";
- getitem 5060,1;//Items: Pointy Cap,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_13:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Sleepy Hat requires~~";
- next;
- mes "[Jac]";
- mes "1 Santa Hat";
- mes "200 String Paper";
- mes "1 Transparent Paper";
- mes "...Did you know this already?";
- close;
- L1_14:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(7012)<400) goto L_ITEM_14;//Items: Tough Scalelike Stem,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Straw Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 7012,400;//Items: Tough Scalelike Stem,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Straw Hat^000000...! Please Take it!";
- getitem 5062,1;//Items: Straw Hat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_14:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Straw Hat requires~~";
- next;
- mes "[Jac]";
- mes "400 Tough Scalelike Stem";
- mes "...Did you know this already?";
- close;
- L1_15:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2248)<1) goto L_ITEM_15;//Items: Western Grace,
- if(countitem(7030)<108) goto L_ITEM_15;//Items: Claw of Desert Wolf,
- if(countitem(7194)<100) goto L_ITEM_15;//Items: Soft Grass Leaf,
- if(countitem(7120)<4) goto L_ITEM_15;//Items: Burning Horseshoe,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Cowboy Hat for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2248,1;//Items: Western Grace,
- delitem 7030,108;//Items: Claw of Desert Wolf,
- delitem 7194,100;//Items: Soft Grass Leaf,
- delitem 7120,4;//Items: Burning Horseshoe,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Cowboy Hat^000000...! Please Take it!";
- getitem 5075,1;//Items: Cowboy Hat,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_15:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Cowboy Hat requires~~";
- next;
- mes "[Jac]";
- mes "1 Western Grace";
- mes "108 Claw of Desert Wolf";
- mes "100 Soft Grass Leaf drop by Parasite (Umbala Map)";
- mes "4 Burning Horseshoe drop by Nightmare Terror (Magma Dungeon)";
- mes "...Did you know this already?";
- close;
- L1_16:
- mes "[Jac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(5062)<1) goto L_ITEM_16;//Items: Straw Hat,
- if(countitem(952)<100) goto L_ITEM_16;//Items: Cactus Needle,
- if(countitem(1907)<1) goto L_ITEM_16;//Items: Guitar,
- mes "[Jac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Sombrero for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 5062,1;//Items: Straw Hat,
- delitem 952,100;//Items: Cactus Needle,
- delitem 1907,1;//Items: Guitar,
- mes "[Jac]";
- mes "Tah Dah!!!^FF0000Sombrero^000000...! Please Take it!";
- getitem 5067,1;//Items: Sombrero,
- next;
- mes "[Jac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_16:
- mes "[Jac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Jac]";
- mes "Sombrero requires~~";
- next;
- mes "[Jac]";
- mes "1 Straw Hat";
- mes "100 Cactus Needle";
- mes "1 Guitar";
- mes "...Did you know this already?";
- close;
-}
-
-prontera.gat,142,172,5 script Pac 705,{
- mes "[Pac]";
- mes "I am 3rd oldest and wisest of the 4 brothers that makes all the newer hats.";
- mes "You will need to bring me the correct items for each hat so I can make them.";
- mes "I provide 8 hats and my brothers provides the other 24.";
- mes "What hat do you want me to make?";
- next;
- menu "Hair Cap",L1_17,"Hot Blood Headband",L1_18,"Ear of Angel",L1_19,"Ear of Demon",L1_20,"Big Golden Bell",L1_21,"Mistress Crown",L1_22,"Crown of Ancient Queen",L1_23,"Alarm Mask",L1_24;
- L1_17:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2226)<1) goto L_ITEM_17;//Items: Cap,
- if(countitem(7107)<500) goto L_ITEM_17;//Items: Antelope Skin,
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Hair Cap for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2226,1;//Items: Cap,
- delitem 7107,500;//Items: Antelope Skin,
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Hair Cap^000000...! Please Take it!";
- getitem 5076,1;//Items: Furry Hat,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_17:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Hair Cap requires~~";
- next;
- mes "[Pac]";
- mes "1 Cap";
- mes "500 Fur of Goat";
- mes "...Did you know this already?";
- close;
- L1_18:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(10019)<1) goto L_ITEM_18;//Items: Red Muffler,
- if(countitem(7097)<300) goto L_ITEM_18;//Items: Burning Heart,
- if(countitem(982)<1) goto L_ITEM_18;//Items: White Dyestuff,
- if(countitem(2211)<1) goto L_ITEM_18;//Items: Bandana,
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Hot Blood Headband for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 10019,1;//Items: Red Muffler,
- delitem 7097,300;//Items: Burning Heart,
- delitem 982,1;//Items: White Dyestuff,
- delitem 2211,1;//Items: Bandana,
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Hot Blood Headband^000000...! Please Take it!";
- getitem 5070,1;//Items: Bandage,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_18:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Hot Blood Headband requires~~";
- next;
- mes "[Pac]";
- mes "1 Red Muffler";
- mes "300 Burning Heart";
- mes "1 White Dyestuffs";
- mes "1 Bandana";
- mes "...Did you know this already?";
- close;
- L1_19:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2254)<1) goto L_ITEM_19;//Items: Angel Wing,
- if(countitem(2286)<1) goto L_ITEM_19;//Items: Elven Ears,
- if(Zeny < 20000) goto L_ITEM_19;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Ear of Angel for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2254,1;//Items: Angel Wing,
- delitem 2286,1;//Items: Elven Ears,
- set Zeny,Zeny-20000;
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Ear of Angel^000000...! Please Take it!";
- getitem 5074,1;//Items: Ears of Angel,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_19:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Ear of Angel requires~~";
- next;
- mes "[Pac]";
- mes "1 Angel Wing";
- mes "1 Elven Ears";
- mes "20,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_20:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2255)<1) goto L_ITEM_20;//Items: Evil Wing,
- if(countitem(2286)<1) goto L_ITEM_20;//Items: Elven Ears,
- if(Zeny < 20000) goto L_ITEM_20;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Ear of Demon for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2255,1;//Items: Evil Wing,
- delitem 2286,1;//Items: Elven Ears,
- set Zeny,Zeny-20000;
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Ear of Demon^000000...! Please Take it!";
- getitem 5068,1;//Items: Ears Of Demon,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_20:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Ear of Demon requires~~";
- next;
- mes "[Pac]";
- mes "1 Evil Wing";
- mes "1 Elven Ears";
- mes "20,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_21:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(10016)<1) goto L_ITEM_21;//Items: Golden Bell,
- if(countitem(714)<1) goto L_ITEM_21;//Items: Emperium,
- if(countitem(969)<3) goto L_ITEM_21;//Items: Gold,
- if(Zeny < 25000) goto L_ITEM_21;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Big Golden Bell for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 10016,1;//Items: Golden Bell,
- delitem 714,1;//Items: Emperium,
- delitem 969,3;//Items: Gold,
- set Zeny,Zeny-25000;
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Big Golden Bell^000000...! Please Take it!";
- getitem 5091,1;//Items: Big Golden Bell,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_21:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Big Golden Bell requires~~";
- next;
- mes "[Pac]";
- mes "1 Golden Bell";
- mes "1 Emperium";
- mes "3 Gold";
- mes "25,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_22:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2249)<1) goto L_ITEM_22;//Items: Coronet,
- if(countitem(714)<1) goto L_ITEM_22;//Items: Emperium,
- if(countitem(969)<3) goto L_ITEM_22;//Items: Gold,
- if(Zeny < 25000) goto L_ITEM_22;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Mistress Crown for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2249,1;//Items: Coronet,
- delitem 714,1;//Items: Emperium,
- delitem 969,3;//Items: Gold,
- set Zeny,Zeny-25000;
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Mistress Crown^000000...! Please Take it!";
- getitem 5081,1;//Items: Crown of Mistress,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_22:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Mistress Crown requires~~";
- next;
- mes "[Pac]";
- mes "1 Coronet";
- mes "1 Emperium";
- mes "3 Gold";
- mes "25,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_23:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(10006)<1) goto L_ITEM_23;//Items: Queen's Hair Ornament,
- if(countitem(714)<1) goto L_ITEM_23;//Items: Emperium,
- if(countitem(969)<3) goto L_ITEM_23;//Items: Gold,
- if(Zeny < 25000) goto L_ITEM_23;
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Crown of Ancient Queen for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 10006,1;//Items: Queen's Hair Ornament,
- delitem 714,1;//Items: Emperium,
- delitem 969,3;//Items: Gold,
- set Zeny,Zeny-25000;
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Crown of Ancient Queen^000000...! Please Take it!";
- getitem 5080,1;//Items: Crown of The Ancient Queen,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_23:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Crown of Ancient Queen requires~~";
- next;
- mes "[Pac]";
- mes "1 Queen's Hair Ornament";
- mes "1 Emperium";
- mes "3 Gold";
- mes "25,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_24:
- mes "[Pac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(1095)<3000) goto L_ITEM_24;//Items: Needle of Alarm,
- if(countitem(2218)<1) goto L_ITEM_24;//Items: Flu Mask,
- mes "[Pac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Alarm Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 1095,3000;//Items: Needle of Alarm,
- delitem 2218,1;//Items: Flu Mask,
- mes "[Pac]";
- mes "Tah Dah!!!^FF0000Alarm Mask^000000...! Please Take it!";
- getitem 5086,1;//Items: Sad Mask,
- next;
- mes "[Pac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_24:
- mes "[Pac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Pac]";
- mes "Alarm Mask requires~~";
- next;
- mes "[Pac]";
- mes "3000 Needle of Alarm";
- mes "1 Flu Mask";
- mes "...Did you know this already?";
- close;
-}
-
-prontera.gat,143,172,5 script Blac 732,{
- mes "[Blac]";
- mes "I am the youngest and sexiest of the 4 brothers that makes all the newer hats.";
- mes "You will need to bring me the correct items for each hat so I can make them.";
- mes "I provide 8 hats and my brothers provides the other 24.";
- mes "What hat do you want me to make?";
- next;
- menu "Indian Hairband",L1_25,"Twin Ribbons",L1_26,"Expressionless Mask",L1_27,"Troublesome Mask",L1_28,"Surprise Mask",L1_29,"Goblin Leader Mask",L1_30,"Horn of Incubus",L1_31,"Horn of Succubus",L1_32;
- L1_25:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2207)<1) goto L_ITEM_25;//Items: Fancy Flower,
- if(countitem(7101)<10) goto L_ITEM_25;//Items: Peco Feather,
- if(Zeny < 10000) goto L_ITEM_25;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Indian Hairband for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2207,1;//Items: Fancy Flower,
- delitem 7101,10;//Items: Peco Feather,
- set Zeny,Zeny-10000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Indian Hairband^000000...! Please Take it!";
- getitem 5071,1;//Items: Indian Headband,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_25:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Indian Hairband requires~~";
- next;
- mes "[Blac]";
- mes "1 Fancy Flower";
- mes "10 Peco's Feather";
- mes "10,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_26:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2244)<1) goto L_ITEM_26;//Items: Big Ribbon,
- if(countitem(10007)<1) goto L_ITEM_26;//Items: Silk Ribbon,
- if(countitem(5079)<1) goto L_ITEM_26;//Items: X Hairpin,
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Twin Ribbons for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2244,1;//Items: Big Ribbon,
- delitem 10007,1;//Items: Silk Ribbon,
- delitem 5079,1;//Items: X Hairpin,
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Twin Ribbons^000000...! Please Take it!";
- getitem 5085,1;//Items: Small Twin Ribbons,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_26:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Twin Ribbons requires~~";
- next;
- mes "[Blac]";
- mes "1 Big Ribbon";
- mes "1 Silk Ribbon";
- mes "1 X Cross Hairpin";
- mes "...Did you know this already?";
- close;
- L1_27:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(999)<25) goto L_ITEM_27;//Items: Steel,
- if(countitem(5090)<1) goto L_ITEM_27;//Items: Mask of The Goblin Leader,
- if(Zeny < 50000) goto L_ITEM_27;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Expressionless Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 999,25;//Items: Steel,
- delitem 5090,1;//Items: Mask of The Goblin Leader,
- set Zeny,Zeny-50000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Expressionless Mask^000000...! Please Take it!";
- getitem 5087,1;//Items: Expressionless Mask,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_27:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Expressionless Mask requires~~";
- next;
- mes "[Blac]";
- mes "25 Steel";
- mes "1 Goblin Leader Mask";
- mes "50,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_28:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(999)<25) goto L_ITEM_28;//Items: Steel,
- if(countitem(5090)<1) goto L_ITEM_28;//Items: Mask of The Goblin Leader,
- if(Zeny < 50000) goto L_ITEM_28;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Troublesome Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 999,25;//Items: Steel,
- delitem 5090,1;//Items: Mask of The Goblin Leader,
- set Zeny,Zeny-50000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Troublesome Mask^000000...! Please Take it!";
- getitem 5089,1;//Items: Annoyed Mask,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_28:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Troublesome Mask requires~~";
- next;
- mes "[Blac]";
- mes "25 Steel";
- mes "1 Goblin Leader Mask";
- mes "50,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_29:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(999)<25) goto L_ITEM_29;//Items: Steel,
- if(countitem(5090)<1) goto L_ITEM_29;//Items: Mask of The Goblin Leader,
- if(Zeny < 50000) goto L_ITEM_29;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Surprise Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 999,25;//Items: Steel,
- delitem 5090,1;//Items: Mask of The Goblin Leader,
- set Zeny,Zeny-50000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Surprise Mask^000000...! Please Take it!";
- getitem 5088,1;//Items: Surprised Mask,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_29:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Surprise Mask requires~~";
- next;
- mes "[Blac]";
- mes "25 Steel";
- mes "1 Goblin Leader Mask";
- mes "50,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_30:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2275)<1) goto L_ITEM_30;//Items: Red Bandana,
- if(countitem(911)<100) goto L_ITEM_30;//Items: Scell,
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Goblin Leader Mask for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2275,1;//Items: Red Bandana,
- delitem 911,100;//Items: Scell,
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Goblin Leader Mask^000000...! Please Take it!";
- getitem 5090,1;//Items: Mask of The Goblin Leader,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_30:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Goblin Leader Mask requires~~";
- next;
- mes "[Blac]";
- mes "1 Red Bandana";
- mes "100 Scell";
- mes "...Did you know this already?";
- close;
- L1_31:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(1038)<500) goto L_ITEM_31;//Items: Little Evil Horn,
- if(countitem(7048)<80) goto L_ITEM_31;//Items: Talon of Griffon,
- if(Zeny < 50000) goto L_ITEM_31;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Horn of Succubus for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 1038,500;//Items: Little Evil Horn,
- delitem 7048,80;//Items: Talon of Griffon,
- set Zeny,Zeny-50000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Horn of Succubus^000000...! Please Take it!";
- getitem 5066,1;//Items: Horns of Succubus,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_31:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Horn of Succubus requires~~";
- next;
- mes "[Blac]";
- mes "500 Little Evil Horn";
- mes "80 Talon of Gryphon";
- mes "50,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_32:
- mes "[Blac]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(1038)<500) goto L_ITEM_32;//Items: Little Evil Horn,
- if(countitem(7048)<80) goto L_ITEM_32;//Items: Talon of Griffon,
- if(Zeny < 50000) goto L_ITEM_32;
- mes "[Blac]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Horn of Incubus for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 1038,500;//Items: Little Evil Horn,
- delitem 7048,80;//Items: Talon of Griffon,
- set Zeny,Zeny-50000;
- mes "[Blac]";
- mes "Tah Dah!!!^FF0000Horn of Incubus^000000...! Please Take it!";
- getitem 5072,1;//Items: Horns Of Incubus,
- next;
- mes "[Blac]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_32:
- mes "[Blac]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Blac]";
- mes "Horn of Incubus requires~~";
- next;
- mes "[Blac]";
- mes "500 Little Evil Horn";
- mes "80 Talon of Gryphon";
- mes "50,000 Zeny";
- mes "...Did you know this already?";
- close;
-}
-
-prontera.gat,144,172,5 script Angel 811,{
- mes "[Angel]";
- mes "Hello.";
- mes "Im the hottest angel in Midgard!";
- mes "What can I do for you?";
- next;
- menu "Hat of Nun",L1_33,"Black Cat Ears",L1_34,"Ribbon of Red Tail",L1_35,"Helm of Orc Hero",L1_36;
- L1_33:
- mes "[Angel]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2261)<1) goto L_ITEM_33;//Items: Army Cap,
- if(countitem(1550)<1) goto L_ITEM_33;//Items: Book,
- if(countitem(2206)<1) goto L_ITEM_33;//Items: Wedding Veil,
- if(countitem(7021)<2) goto L_ITEM_33;//Items: Foolishness of the Blind,
- mes "[Angel]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Hat of Nun for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2261,1;//Items: Army Cap,
- delitem 1550,1;//Items: Book,
- delitem 2206,1;//Items: Wedding Veil,
- delitem 7021,2;//Items: Foolishness of the Blind,
- mes "[Angel]";
- mes "Tah Dah!!!^FF0000Hat of Nun^000000...! Please Take it!";
- getitem 5093,1;//Items: Nun Hat,
- next;
- mes "[Angel]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_33:
- mes "[Angel]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Angel]";
- mes "Hat of Nun requires~~";
- next;
- mes "[Angel]";
- mes "1 Army Cap";
- mes "1 Book";
- mes "1 Wedding Veil";
- mes "2 Foolishness of the Blind";
- mes "...Did you know this already?";
- close;
- L1_34:
- mes "[Angel]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2213)<1) goto L_ITEM_34;//Items: Kitty Band,
- if(countitem(7063)<200) goto L_ITEM_34;//Items: Soft Feather,
- if(countitem(983)<1) goto L_ITEM_34;//Items: Black Dyestuff,
- if(Zeny < 10000) goto L_ITEM_34;
- mes "[Angel]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Black Cat Ears for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2213,1;//Items: Kitty Band,
- delitem 7063,200;//Items: Soft Feather,
- delitem 983,1;//Items: Black Dyestuff,
- set Zeny,Zeny-10000;
- mes "[Angel]";
- mes "Tah Dah!!!^FF0000Black Cat Ears^000000...! Please Take it!";
- getitem 5057,1;//Items: Black Cat Ears,
- next;
- mes "[Angel]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_34:
- mes "[Angel]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Angel]";
- mes "Black Cat Ears require~~";
- next;
- mes "[Angel]";
- mes "1 Kitty Band";
- mes "200 Soft Feather";
- mes "1 Black Dyestuffs";
- mes "10,000 Zeny";
- mes "...Did you know this already?";
- close;
- L1_35:
- mes "[Angel]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(2244)<1) goto L_ITEM_35;//Items: Big Ribbon,
- if(countitem(2209)<1) goto L_ITEM_35;//Items: Ribbon,
- if(countitem(10007)<1) goto L_ITEM_35;//Items: Silk Ribbon,
- mes "[Angel]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Ribbon of Red Tail for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 2244,1;//Items: Big Ribbon,
- delitem 2209,1;//Items: Ribbon,
- delitem 10007,1;//Items: Silk Ribbon,
- mes "[Angel]";
- mes "Tah Dah!!!^FF0000Ribbon of Red Tail^000000...! Please Take it!";
- getitem 5083,1;//Items: Back Ribbon,
- next;
- mes "[Angel]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_35:
- mes "[Angel]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Angel]";
- mes "Ribbon of Red Tail requires~~";
- next;
- mes "[Angel]";
- mes "1 Big Ribbon";
- mes "1 Slotted Ribbon";
- mes "1 Silk Ribbon";
- mes "...Did you know this already?";
- close;
- L1_36:
- mes "[Angel]";
- mes "Let me check the items you have brought here.";
- next;
- if(countitem(7069)<350) goto L_ITEM_36;//Items: Destroyed Armor,
- if(countitem(5006)<1) goto L_ITEM_36;//Items: Machoman's Glasses,
- if(countitem(2202)<1) goto L_ITEM_36;//Items: Sunglasses,
- if(countitem(5047)<1) goto L_ITEM_36;//Items: Fashion Sunglasses,
- if(countitem(2242)<1) goto L_ITEM_36;//Items: Purple Glasses,
- if(countitem(7098)<100) goto L_ITEM_36;//Items: Fire Seed,
- if(Zeny < 1000000) goto L_ITEM_36;
- mes "[Angel]";
- mes "Wow!! Well done! Finally you have gathered all items needed!";
- mes "We will make the Helm of Orc Hero for you right away.";
- mes "Please Wait a Moment.";
- next;
- delitem 7069,350;//Items: Destroyed Armor,
- delitem 5006,1;//Items: Machoman's Glasses,
- delitem 2202,1;//Items: Sunglasses,
- delitem 5047,1;//Items: Fashion Sunglasses,
- delitem 2242,1;//Items: Purple Glasses,
- delitem 7098,100;//Items: Fire Seed,
- set Zeny,Zeny-1000000;
- mes "[Angel]";
- mes "Tah Dah!!!^FF0000Helm of Orc Hero^000000...! Please Take it!";
- getitem 5094,1;//Items: Orc Hero Helm,
- next;
- mes "[Angel]";
- mes "I liked that, I look forward to making more.";
- mes "Thank you.";
- close;
- L_ITEM_36:
- mes "[Angel]";
- mes "Oh you already know what I create!";
- mes "Ha ha!!";
- mes "Hum~~ tell me where did you heard";
- mes "about this?";
- next;
- mes "[Angel]";
- mes "Helm of Orc Hero requires~~";
- next;
- mes "[Angel]";
- mes "350 Broken Armor Piece";
- mes "1 Machoman's Glasses";
- mes "1 Slotted Sunglasses";
- mes "1 Fashion Sunglasses";
- mes "1 Purple Glasses";
- mes "100 Fire Seed";
- mes "1,000,000 Zeny";
- mes "...Did you know this already?";
- close;
-}
+//===== eAthena Script =======================================
+//= The 32 New Hats
+//===== By: ==================================================
+//= Darkchild
+//===== Current Version: =====================================
+//= 1.4
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= 4 brothers give you quests to get 32 new hats
+//===== Additional Comments: =================================
+//= There are 2 scripts for these 32 'new' hats.
+//= The other one doesnt have all the new ones and has some old ones
+//= Advise to use this script
+//= 1.2 revision
+//= 1.3 fixed bug where npcs would give out free items [Shinigami]
+//= 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]
+//============================================================
+prontera.gat,140,172,5 script Zac 704,{
+ mes "[Zac]";
+ mes "I am the oldest and strongest of the 4 brothers that makes all the newer hats.";
+ mes "You will need to bring me the correct items for each hat so I can make them.";
+ mes "I provide 8 hats and my brothers provides the other 24.";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Attitude Campus Hat",L1_1,"Fox Mask",L1_2,"X Cross Hairpin",L1_3,"Flower Hair Pin",L1_4,"Tulip Hair Pin",L1_5,"Mushroom Hairband",L1_6,"Troublesome Raccoon Doll",L1_7,"Blue Fish",L1_8;
+ L1_1:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if((countitem(2285)<1) && (countitem(1550)<1)) goto L_ITEM_1;//Items: Apple o' Archer, Book,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Attitude Campus Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2285,1;//Items: Apple o' Archer,
+ delitem 1550,1;//Items: Book,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Attitude Campus Hat^000000...! Please Take it!";
+ getitem 5073,1;//Items: Campus Hat,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_1:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Attitude Campus Hat requires~~";
+ next;
+ mes "[Zac]";
+ mes "1 Apple o' Archer";
+ mes "1 Book";
+ mes "...Did you know this already?";
+ close;
+ L1_2:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(1022)<999) goto L_ITEM_2;//Items: Nine Tails,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Fox Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 1022,999;//Items: Nine Tails,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Fox Mask^000000...! Please Take it!";
+ getitem 5069,1;//Items: Fox Mask,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_2:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Fox Mask requires~~";
+ next;
+ mes "[Zac]";
+ mes "999 Nine Tails";
+ mes "...Did you know this already?";
+ close;
+ L1_3:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(10011)<1) goto L_ITEM_3;//Items: Stellar Hairpin,
+ if(countitem(2266)<1) goto L_ITEM_3;//Items: Iron Cain,
+ if(countitem(909)<100) goto L_ITEM_3;//Items: Jellopy,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the X Cross Hairpin for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 10011,1;//Items: Stellar Hairpin,
+ delitem 2266,1;//Items: Iron Cain,
+ delitem 909,100;//Items: Jellopy,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000X Cross Hairpin^000000...! Please Take it!";
+ getitem 5079,1;//Items: X Hairpin,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_3:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "X Cross Hairpin requires~~";
+ next;
+ mes "[Zac]";
+ mes "1 Stellar Hairpin";
+ mes "1 Iron Cain";
+ mes "100 Jellopy";
+ mes "...Did you know this already?";
+ close;
+ L1_4:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2270)<1) goto L_ITEM_4;//Items: Centimental Leaf,
+ if(countitem(999)<10) goto L_ITEM_4;//Items: Steel,
+ if(Zeny < 20000) goto L_ITEM_4;
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Flower Hair Pin for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2270,1;//Items: Centimental Leaf,
+ delitem 999,10;//Items: Steel,
+ set Zeny,Zeny-20000;
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Flower Hair Pin^000000...! Please Take it!";
+ getitem 5061,1;//Items: Flower Hairpin,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_4:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Flower Hair Pin requires~~";
+ next;
+ mes "[Zac]";
+ mes "1 Romantic Leaf";
+ mes "10 Steel";
+ mes "20,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_5:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2278)<1) goto L_ITEM_5;//Items: Mr. Smile,
+ if(countitem(980)<1) goto L_ITEM_5;//Items: Orange Dyestuff,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Tulip Hair Pin for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2278,1;//Items: Mr. Smile,
+ delitem 980,1;//Items: Orange Dyestuff,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Tulip Hair Pin^000000...! Please Take it!";
+ getitem 5077,1;//Items: Tulip Hairpin,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_5:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Tulip Hair Pin requires~~";
+ next;
+ mes "[Zac]";
+ mes "1 Mr. Smile";
+ mes "1 Orange Dyestuffs";
+ mes "...Did you know this already?";
+ close;
+ L1_6:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(921)<300) goto L_ITEM_6;//Items: Mushroom Spore,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Mushroom Hairband for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 921,300;//Items: Mushroom Spore,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Mushroom Hairband^000000...! Please Take it!";
+ getitem 5082,1;//Items: Mushroom Hairband,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_6:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Mushroom Hairband requires~~";
+ next;
+ mes "[Zac]";
+ mes "300 Mushroom Spores";
+ mes "...Did you know this already?";
+ close;
+ L1_7:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(1026)<100) goto L_ITEM_7;//Items: Acorn,
+ if(countitem(7065)<100) goto L_ITEM_7;//Items: Sea Otter Fur,
+ if(countitem(945)<100) goto L_ITEM_7;//Items: Raccoon Leaf,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Troublesome Raccoon Doll for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 1026,100;//Items: Acorn,
+ delitem 7065,100;//Items: Sea Otter Fur,
+ delitem 945,100;//Items: Raccoon Leaf,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Troublesome Raccoon Doll^000000...! Please Take it!";
+ getitem 5084,1;//Items: Lazy Racoon Hat,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_7:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Troublesome Raccoon Doll requires~~";
+ next;
+ mes "[Zac]";
+ mes "100 Acorn";
+ mes "100 Sea Otter Fur";
+ mes "100 Raccoon Leaf";
+ mes "...Did you know this already?";
+ close;
+ L1_8:
+ mes "[Zac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(624)<2) goto L_ITEM_8;//Items: Rotten Fish,
+ if(countitem(959)<300) goto L_ITEM_8;//Items: Stinky Scale,
+ if(countitem(1023)<30) goto L_ITEM_8;//Items: Fish Tail,
+ if(countitem(938)<100) goto L_ITEM_8;//Items: Sticky Mucus,
+ mes "[Zac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Blue Fish for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 624,2;//Items: Rotten Fish,
+ delitem 959,300;//Items: Stinky Scale,
+ delitem 1023,30;//Items: Fish Tail,
+ delitem 938,100;//Items: Sticky Mucus,
+ mes "[Zac]";
+ mes "Tah Dah!!!^FF0000Blue Fish^000000...! Please Take it!";
+ getitem 5065,1;//Items: Fresh Blueish Fish,
+ next;
+ mes "[Zac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_8:
+ mes "[Zac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Zac]";
+ mes "Blue Fish requires~~";
+ next;
+ mes "[Zac]";
+ mes "2 Rotten Fish";
+ mes "300 Rotten Scale";
+ mes "30 Fish Tail";
+ mes "100 Sticky Mucus";
+ mes "...Did you know this already?";
+ close;
+}
+
+
+prontera.gat,141,172,5 script Jac 107,{
+ mes "[Jac]";
+ mes "I am the 2nd oldest and calmest of the 4 brothers that makes all the newer hats.";
+ mes "You will need to bring me the correct items for each hat so I can make them.";
+ mes "I provide 8 hats and my brothers provides the other 24.";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Drooped Cat",L1_9,"Leaf of Transformation",L1_10,"Bear Pebble Hat",L1_11,"Sea Otter Hat",L1_12,"Sleepy Hat",L1_13,"Straw Hat",L1_14,"Cowboy Hat",L1_15,"Sombrero",L1_16;
+ L1_9:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2233)<1) goto L_ITEM_9;//Items: Circlet,
+ if(countitem(983)<1) goto L_ITEM_9;//Items: Black Dyestuff,
+ if(countitem(740)<1) goto L_ITEM_9;//Items: Puppet,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Drooped Cat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2233,1;//Items: Circlet,
+ delitem 983,1;//Items: Black Dyestuff,
+ delitem 740,1;//Items: Puppet,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Drooped Cat^000000...! Please Take it!";
+ getitem 5058,1;//Items: Resting Cat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_9:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Drooped Cat requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Slotted Circlet";
+ mes "1 Black Dyestuffs";
+ mes "1 Puppet";
+ mes "...Did you know this already?";
+ close;
+ L1_10:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(945)<600) goto L_ITEM_10;//Items: Raccoon Leaf,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Leaf of Transformation for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 945,600;//Items: Raccoon Leaf,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Leaf of Transformation^000000...! Please Take it!";
+ getitem 5064,1;//Items: Transformation Leaf,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_10:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Leaf of Transformation requires~~";
+ next;
+ mes "[Jac]";
+ mes "600 Raccoon Leaf";
+ mes "...Did you know this already?";
+ close;
+ L1_11:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(5030)<1) goto L_ITEM_11;//Items: Panda Hat,
+ if(countitem(952)<100) goto L_ITEM_11;//Items: Cactus Needle,
+ if(countitem(999)<20) goto L_ITEM_11;//Items: Steel,
+ if(countitem(948)<200) goto L_ITEM_11;//Items: Bears Footskin,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Bear Pebble Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 5030,1;//Items: Panda Hat,
+ delitem 952,100;//Items: Cactus Needle,
+ delitem 999,20;//Items: Steel,
+ delitem 948,200;//Items: Bears Footskin,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Bear Pebble Hat^000000...! Please Take it!";
+ getitem 5059,1;//Items: Bear Hat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_11:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Bear Pebble Hat requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Panda Hat";
+ mes "100 Cactus Needle";
+ mes "20 Steel";
+ mes "200 Bear's Footskin";
+ mes "...Did you know this already?";
+ close;
+ L1_12:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(5084)<1) goto L_ITEM_12;//Items: Lazy Racoon Hat,
+ if(countitem(5064)<1) goto L_ITEM_12;//Items: Transformation Leaf,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Sea Otter Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 5084,1;//Items: Lazy Racoon Hat,
+ delitem 5064,1;//Items: Transformation Leaf,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Sea Otter Hat^000000...! Please Take it!";
+ getitem 5078,1;//Items: Sea Otter Hat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_12:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Sea Otter Hat requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Troublesome Raccoon Doll";
+ mes "1 Leaf of Transformation";
+ mes "...Did you know this already?";
+ close;
+ L1_13:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2236)<1) goto L_ITEM_13;//Items: Santa's Hat,
+ if(countitem(7111)<200) goto L_ITEM_13;//Items: String Paper,
+ if(countitem(7112)<1) goto L_ITEM_13;//Items: Transparent Paper,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Sleepy Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2236,1;//Items: Santa's Hat,
+ delitem 7111,200;//Items: String Paper,
+ delitem 7112,1;//Items: Transparent Paper,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Sleepy Hat^000000...! Please Take it!";
+ getitem 5060,1;//Items: Pointy Cap,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_13:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Sleepy Hat requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Santa Hat";
+ mes "200 String Paper";
+ mes "1 Transparent Paper";
+ mes "...Did you know this already?";
+ close;
+ L1_14:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(7012)<400) goto L_ITEM_14;//Items: Tough Scalelike Stem,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Straw Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 7012,400;//Items: Tough Scalelike Stem,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Straw Hat^000000...! Please Take it!";
+ getitem 5062,1;//Items: Straw Hat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_14:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Straw Hat requires~~";
+ next;
+ mes "[Jac]";
+ mes "400 Tough Scalelike Stem";
+ mes "...Did you know this already?";
+ close;
+ L1_15:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2248)<1) goto L_ITEM_15;//Items: Western Grace,
+ if(countitem(7030)<108) goto L_ITEM_15;//Items: Claw of Desert Wolf,
+ if(countitem(7194)<100) goto L_ITEM_15;//Items: Soft Grass Leaf,
+ if(countitem(7120)<4) goto L_ITEM_15;//Items: Burning Horseshoe,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Cowboy Hat for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2248,1;//Items: Western Grace,
+ delitem 7030,108;//Items: Claw of Desert Wolf,
+ delitem 7194,100;//Items: Soft Grass Leaf,
+ delitem 7120,4;//Items: Burning Horseshoe,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Cowboy Hat^000000...! Please Take it!";
+ getitem 5075,1;//Items: Cowboy Hat,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_15:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Cowboy Hat requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Western Grace";
+ mes "108 Claw of Desert Wolf";
+ mes "100 Soft Grass Leaf drop by Parasite (Umbala Map)";
+ mes "4 Burning Horseshoe drop by Nightmare Terror (Magma Dungeon)";
+ mes "...Did you know this already?";
+ close;
+ L1_16:
+ mes "[Jac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(5062)<1) goto L_ITEM_16;//Items: Straw Hat,
+ if(countitem(952)<100) goto L_ITEM_16;//Items: Cactus Needle,
+ if(countitem(1907)<1) goto L_ITEM_16;//Items: Guitar,
+ mes "[Jac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Sombrero for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 5062,1;//Items: Straw Hat,
+ delitem 952,100;//Items: Cactus Needle,
+ delitem 1907,1;//Items: Guitar,
+ mes "[Jac]";
+ mes "Tah Dah!!!^FF0000Sombrero^000000...! Please Take it!";
+ getitem 5067,1;//Items: Sombrero,
+ next;
+ mes "[Jac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_16:
+ mes "[Jac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Jac]";
+ mes "Sombrero requires~~";
+ next;
+ mes "[Jac]";
+ mes "1 Straw Hat";
+ mes "100 Cactus Needle";
+ mes "1 Guitar";
+ mes "...Did you know this already?";
+ close;
+}
+
+prontera.gat,142,172,5 script Pac 705,{
+ mes "[Pac]";
+ mes "I am 3rd oldest and wisest of the 4 brothers that makes all the newer hats.";
+ mes "You will need to bring me the correct items for each hat so I can make them.";
+ mes "I provide 8 hats and my brothers provides the other 24.";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Hair Cap",L1_17,"Hot Blood Headband",L1_18,"Ear of Angel",L1_19,"Ear of Demon",L1_20,"Big Golden Bell",L1_21,"Mistress Crown",L1_22,"Crown of Ancient Queen",L1_23,"Alarm Mask",L1_24;
+ L1_17:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2226)<1) goto L_ITEM_17;//Items: Cap,
+ if(countitem(7107)<500) goto L_ITEM_17;//Items: Antelope Skin,
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Hair Cap for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2226,1;//Items: Cap,
+ delitem 7107,500;//Items: Antelope Skin,
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Hair Cap^000000...! Please Take it!";
+ getitem 5076,1;//Items: Furry Hat,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_17:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Hair Cap requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Cap";
+ mes "500 Fur of Goat";
+ mes "...Did you know this already?";
+ close;
+ L1_18:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(10019)<1) goto L_ITEM_18;//Items: Red Muffler,
+ if(countitem(7097)<300) goto L_ITEM_18;//Items: Burning Heart,
+ if(countitem(982)<1) goto L_ITEM_18;//Items: White Dyestuff,
+ if(countitem(2211)<1) goto L_ITEM_18;//Items: Bandana,
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Hot Blood Headband for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 10019,1;//Items: Red Muffler,
+ delitem 7097,300;//Items: Burning Heart,
+ delitem 982,1;//Items: White Dyestuff,
+ delitem 2211,1;//Items: Bandana,
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Hot Blood Headband^000000...! Please Take it!";
+ getitem 5070,1;//Items: Bandage,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_18:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Hot Blood Headband requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Red Muffler";
+ mes "300 Burning Heart";
+ mes "1 White Dyestuffs";
+ mes "1 Bandana";
+ mes "...Did you know this already?";
+ close;
+ L1_19:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2254)<1) goto L_ITEM_19;//Items: Angel Wing,
+ if(countitem(2286)<1) goto L_ITEM_19;//Items: Elven Ears,
+ if(Zeny < 20000) goto L_ITEM_19;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Ear of Angel for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2254,1;//Items: Angel Wing,
+ delitem 2286,1;//Items: Elven Ears,
+ set Zeny,Zeny-20000;
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Ear of Angel^000000...! Please Take it!";
+ getitem 5074,1;//Items: Ears of Angel,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_19:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Ear of Angel requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Angel Wing";
+ mes "1 Elven Ears";
+ mes "20,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_20:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2255)<1) goto L_ITEM_20;//Items: Evil Wing,
+ if(countitem(2286)<1) goto L_ITEM_20;//Items: Elven Ears,
+ if(Zeny < 20000) goto L_ITEM_20;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Ear of Demon for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2255,1;//Items: Evil Wing,
+ delitem 2286,1;//Items: Elven Ears,
+ set Zeny,Zeny-20000;
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Ear of Demon^000000...! Please Take it!";
+ getitem 5068,1;//Items: Ears Of Demon,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_20:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Ear of Demon requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Evil Wing";
+ mes "1 Elven Ears";
+ mes "20,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_21:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(10016)<1) goto L_ITEM_21;//Items: Golden Bell,
+ if(countitem(714)<1) goto L_ITEM_21;//Items: Emperium,
+ if(countitem(969)<3) goto L_ITEM_21;//Items: Gold,
+ if(Zeny < 25000) goto L_ITEM_21;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Big Golden Bell for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 10016,1;//Items: Golden Bell,
+ delitem 714,1;//Items: Emperium,
+ delitem 969,3;//Items: Gold,
+ set Zeny,Zeny-25000;
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Big Golden Bell^000000...! Please Take it!";
+ getitem 5091,1;//Items: Big Golden Bell,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_21:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Big Golden Bell requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Golden Bell";
+ mes "1 Emperium";
+ mes "3 Gold";
+ mes "25,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_22:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2249)<1) goto L_ITEM_22;//Items: Coronet,
+ if(countitem(714)<1) goto L_ITEM_22;//Items: Emperium,
+ if(countitem(969)<3) goto L_ITEM_22;//Items: Gold,
+ if(Zeny < 25000) goto L_ITEM_22;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Mistress Crown for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2249,1;//Items: Coronet,
+ delitem 714,1;//Items: Emperium,
+ delitem 969,3;//Items: Gold,
+ set Zeny,Zeny-25000;
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Mistress Crown^000000...! Please Take it!";
+ getitem 5081,1;//Items: Crown of Mistress,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_22:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Mistress Crown requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Coronet";
+ mes "1 Emperium";
+ mes "3 Gold";
+ mes "25,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_23:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(10006)<1) goto L_ITEM_23;//Items: Queen's Hair Ornament,
+ if(countitem(714)<1) goto L_ITEM_23;//Items: Emperium,
+ if(countitem(969)<3) goto L_ITEM_23;//Items: Gold,
+ if(Zeny < 25000) goto L_ITEM_23;
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Crown of Ancient Queen for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 10006,1;//Items: Queen's Hair Ornament,
+ delitem 714,1;//Items: Emperium,
+ delitem 969,3;//Items: Gold,
+ set Zeny,Zeny-25000;
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Crown of Ancient Queen^000000...! Please Take it!";
+ getitem 5080,1;//Items: Crown of The Ancient Queen,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_23:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Crown of Ancient Queen requires~~";
+ next;
+ mes "[Pac]";
+ mes "1 Queen's Hair Ornament";
+ mes "1 Emperium";
+ mes "3 Gold";
+ mes "25,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_24:
+ mes "[Pac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(1095)<3000) goto L_ITEM_24;//Items: Needle of Alarm,
+ if(countitem(2218)<1) goto L_ITEM_24;//Items: Flu Mask,
+ mes "[Pac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Alarm Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 1095,3000;//Items: Needle of Alarm,
+ delitem 2218,1;//Items: Flu Mask,
+ mes "[Pac]";
+ mes "Tah Dah!!!^FF0000Alarm Mask^000000...! Please Take it!";
+ getitem 5086,1;//Items: Sad Mask,
+ next;
+ mes "[Pac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_24:
+ mes "[Pac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Pac]";
+ mes "Alarm Mask requires~~";
+ next;
+ mes "[Pac]";
+ mes "3000 Needle of Alarm";
+ mes "1 Flu Mask";
+ mes "...Did you know this already?";
+ close;
+}
+
+prontera.gat,143,172,5 script Blac 732,{
+ mes "[Blac]";
+ mes "I am the youngest and sexiest of the 4 brothers that makes all the newer hats.";
+ mes "You will need to bring me the correct items for each hat so I can make them.";
+ mes "I provide 8 hats and my brothers provides the other 24.";
+ mes "What hat do you want me to make?";
+ next;
+ menu "Indian Hairband",L1_25,"Twin Ribbons",L1_26,"Expressionless Mask",L1_27,"Troublesome Mask",L1_28,"Surprise Mask",L1_29,"Goblin Leader Mask",L1_30,"Horn of Incubus",L1_31,"Horn of Succubus",L1_32;
+ L1_25:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2207)<1) goto L_ITEM_25;//Items: Fancy Flower,
+ if(countitem(7101)<10) goto L_ITEM_25;//Items: Peco Feather,
+ if(Zeny < 10000) goto L_ITEM_25;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Indian Hairband for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2207,1;//Items: Fancy Flower,
+ delitem 7101,10;//Items: Peco Feather,
+ set Zeny,Zeny-10000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Indian Hairband^000000...! Please Take it!";
+ getitem 5071,1;//Items: Indian Headband,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_25:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Indian Hairband requires~~";
+ next;
+ mes "[Blac]";
+ mes "1 Fancy Flower";
+ mes "10 Peco's Feather";
+ mes "10,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_26:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2244)<1) goto L_ITEM_26;//Items: Big Ribbon,
+ if(countitem(10007)<1) goto L_ITEM_26;//Items: Silk Ribbon,
+ if(countitem(5079)<1) goto L_ITEM_26;//Items: X Hairpin,
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Twin Ribbons for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2244,1;//Items: Big Ribbon,
+ delitem 10007,1;//Items: Silk Ribbon,
+ delitem 5079,1;//Items: X Hairpin,
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Twin Ribbons^000000...! Please Take it!";
+ getitem 5085,1;//Items: Small Twin Ribbons,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_26:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Twin Ribbons requires~~";
+ next;
+ mes "[Blac]";
+ mes "1 Big Ribbon";
+ mes "1 Silk Ribbon";
+ mes "1 X Cross Hairpin";
+ mes "...Did you know this already?";
+ close;
+ L1_27:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(999)<25) goto L_ITEM_27;//Items: Steel,
+ if(countitem(5090)<1) goto L_ITEM_27;//Items: Mask of The Goblin Leader,
+ if(Zeny < 50000) goto L_ITEM_27;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Expressionless Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 999,25;//Items: Steel,
+ delitem 5090,1;//Items: Mask of The Goblin Leader,
+ set Zeny,Zeny-50000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Expressionless Mask^000000...! Please Take it!";
+ getitem 5087,1;//Items: Expressionless Mask,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_27:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Expressionless Mask requires~~";
+ next;
+ mes "[Blac]";
+ mes "25 Steel";
+ mes "1 Goblin Leader Mask";
+ mes "50,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_28:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(999)<25) goto L_ITEM_28;//Items: Steel,
+ if(countitem(5090)<1) goto L_ITEM_28;//Items: Mask of The Goblin Leader,
+ if(Zeny < 50000) goto L_ITEM_28;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Troublesome Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 999,25;//Items: Steel,
+ delitem 5090,1;//Items: Mask of The Goblin Leader,
+ set Zeny,Zeny-50000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Troublesome Mask^000000...! Please Take it!";
+ getitem 5089,1;//Items: Annoyed Mask,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_28:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Troublesome Mask requires~~";
+ next;
+ mes "[Blac]";
+ mes "25 Steel";
+ mes "1 Goblin Leader Mask";
+ mes "50,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_29:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(999)<25) goto L_ITEM_29;//Items: Steel,
+ if(countitem(5090)<1) goto L_ITEM_29;//Items: Mask of The Goblin Leader,
+ if(Zeny < 50000) goto L_ITEM_29;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Surprise Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 999,25;//Items: Steel,
+ delitem 5090,1;//Items: Mask of The Goblin Leader,
+ set Zeny,Zeny-50000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Surprise Mask^000000...! Please Take it!";
+ getitem 5088,1;//Items: Surprised Mask,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_29:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Surprise Mask requires~~";
+ next;
+ mes "[Blac]";
+ mes "25 Steel";
+ mes "1 Goblin Leader Mask";
+ mes "50,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_30:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2275)<1) goto L_ITEM_30;//Items: Red Bandana,
+ if(countitem(911)<100) goto L_ITEM_30;//Items: Scell,
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Goblin Leader Mask for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2275,1;//Items: Red Bandana,
+ delitem 911,100;//Items: Scell,
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Goblin Leader Mask^000000...! Please Take it!";
+ getitem 5090,1;//Items: Mask of The Goblin Leader,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_30:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Goblin Leader Mask requires~~";
+ next;
+ mes "[Blac]";
+ mes "1 Red Bandana";
+ mes "100 Scell";
+ mes "...Did you know this already?";
+ close;
+ L1_31:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(1038)<500) goto L_ITEM_31;//Items: Little Evil Horn,
+ if(countitem(7048)<80) goto L_ITEM_31;//Items: Talon of Griffon,
+ if(Zeny < 50000) goto L_ITEM_31;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Horn of Succubus for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 1038,500;//Items: Little Evil Horn,
+ delitem 7048,80;//Items: Talon of Griffon,
+ set Zeny,Zeny-50000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Horn of Succubus^000000...! Please Take it!";
+ getitem 5066,1;//Items: Horns of Succubus,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_31:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Horn of Succubus requires~~";
+ next;
+ mes "[Blac]";
+ mes "500 Little Evil Horn";
+ mes "80 Talon of Gryphon";
+ mes "50,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_32:
+ mes "[Blac]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(1038)<500) goto L_ITEM_32;//Items: Little Evil Horn,
+ if(countitem(7048)<80) goto L_ITEM_32;//Items: Talon of Griffon,
+ if(Zeny < 50000) goto L_ITEM_32;
+ mes "[Blac]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Horn of Incubus for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 1038,500;//Items: Little Evil Horn,
+ delitem 7048,80;//Items: Talon of Griffon,
+ set Zeny,Zeny-50000;
+ mes "[Blac]";
+ mes "Tah Dah!!!^FF0000Horn of Incubus^000000...! Please Take it!";
+ getitem 5072,1;//Items: Horns Of Incubus,
+ next;
+ mes "[Blac]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_32:
+ mes "[Blac]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Blac]";
+ mes "Horn of Incubus requires~~";
+ next;
+ mes "[Blac]";
+ mes "500 Little Evil Horn";
+ mes "80 Talon of Gryphon";
+ mes "50,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+}
+
+prontera.gat,144,172,5 script Angel 811,{
+ mes "[Angel]";
+ mes "Hello.";
+ mes "Im the hottest angel in Midgard!";
+ mes "What can I do for you?";
+ next;
+ menu "Hat of Nun",L1_33,"Black Cat Ears",L1_34,"Ribbon of Red Tail",L1_35,"Helm of Orc Hero",L1_36;
+ L1_33:
+ mes "[Angel]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2261)<1) goto L_ITEM_33;//Items: Army Cap,
+ if(countitem(1550)<1) goto L_ITEM_33;//Items: Book,
+ if(countitem(2206)<1) goto L_ITEM_33;//Items: Wedding Veil,
+ if(countitem(7021)<2) goto L_ITEM_33;//Items: Foolishness of the Blind,
+ mes "[Angel]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Hat of Nun for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2261,1;//Items: Army Cap,
+ delitem 1550,1;//Items: Book,
+ delitem 2206,1;//Items: Wedding Veil,
+ delitem 7021,2;//Items: Foolishness of the Blind,
+ mes "[Angel]";
+ mes "Tah Dah!!!^FF0000Hat of Nun^000000...! Please Take it!";
+ getitem 5093,1;//Items: Nun Hat,
+ next;
+ mes "[Angel]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_33:
+ mes "[Angel]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Angel]";
+ mes "Hat of Nun requires~~";
+ next;
+ mes "[Angel]";
+ mes "1 Army Cap";
+ mes "1 Book";
+ mes "1 Wedding Veil";
+ mes "2 Foolishness of the Blind";
+ mes "...Did you know this already?";
+ close;
+ L1_34:
+ mes "[Angel]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2213)<1) goto L_ITEM_34;//Items: Kitty Band,
+ if(countitem(7063)<200) goto L_ITEM_34;//Items: Soft Feather,
+ if(countitem(983)<1) goto L_ITEM_34;//Items: Black Dyestuff,
+ if(Zeny < 10000) goto L_ITEM_34;
+ mes "[Angel]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Black Cat Ears for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2213,1;//Items: Kitty Band,
+ delitem 7063,200;//Items: Soft Feather,
+ delitem 983,1;//Items: Black Dyestuff,
+ set Zeny,Zeny-10000;
+ mes "[Angel]";
+ mes "Tah Dah!!!^FF0000Black Cat Ears^000000...! Please Take it!";
+ getitem 5057,1;//Items: Black Cat Ears,
+ next;
+ mes "[Angel]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_34:
+ mes "[Angel]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Angel]";
+ mes "Black Cat Ears require~~";
+ next;
+ mes "[Angel]";
+ mes "1 Kitty Band";
+ mes "200 Soft Feather";
+ mes "1 Black Dyestuffs";
+ mes "10,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+ L1_35:
+ mes "[Angel]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(2244)<1) goto L_ITEM_35;//Items: Big Ribbon,
+ if(countitem(2209)<1) goto L_ITEM_35;//Items: Ribbon,
+ if(countitem(10007)<1) goto L_ITEM_35;//Items: Silk Ribbon,
+ mes "[Angel]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Ribbon of Red Tail for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 2244,1;//Items: Big Ribbon,
+ delitem 2209,1;//Items: Ribbon,
+ delitem 10007,1;//Items: Silk Ribbon,
+ mes "[Angel]";
+ mes "Tah Dah!!!^FF0000Ribbon of Red Tail^000000...! Please Take it!";
+ getitem 5083,1;//Items: Back Ribbon,
+ next;
+ mes "[Angel]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_35:
+ mes "[Angel]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Angel]";
+ mes "Ribbon of Red Tail requires~~";
+ next;
+ mes "[Angel]";
+ mes "1 Big Ribbon";
+ mes "1 Slotted Ribbon";
+ mes "1 Silk Ribbon";
+ mes "...Did you know this already?";
+ close;
+ L1_36:
+ mes "[Angel]";
+ mes "Let me check the items you have brought here.";
+ next;
+ if(countitem(7069)<350) goto L_ITEM_36;//Items: Destroyed Armor,
+ if(countitem(5006)<1) goto L_ITEM_36;//Items: Machoman's Glasses,
+ if(countitem(2202)<1) goto L_ITEM_36;//Items: Sunglasses,
+ if(countitem(5047)<1) goto L_ITEM_36;//Items: Fashion Sunglasses,
+ if(countitem(2242)<1) goto L_ITEM_36;//Items: Purple Glasses,
+ if(countitem(7098)<100) goto L_ITEM_36;//Items: Fire Seed,
+ if(Zeny < 1000000) goto L_ITEM_36;
+ mes "[Angel]";
+ mes "Wow!! Well done! Finally you have gathered all items needed!";
+ mes "We will make the Helm of Orc Hero for you right away.";
+ mes "Please Wait a Moment.";
+ next;
+ delitem 7069,350;//Items: Destroyed Armor,
+ delitem 5006,1;//Items: Machoman's Glasses,
+ delitem 2202,1;//Items: Sunglasses,
+ delitem 5047,1;//Items: Fashion Sunglasses,
+ delitem 2242,1;//Items: Purple Glasses,
+ delitem 7098,100;//Items: Fire Seed,
+ set Zeny,Zeny-1000000;
+ mes "[Angel]";
+ mes "Tah Dah!!!^FF0000Helm of Orc Hero^000000...! Please Take it!";
+ getitem 5094,1;//Items: Orc Hero Helm,
+ next;
+ mes "[Angel]";
+ mes "I liked that, I look forward to making more.";
+ mes "Thank you.";
+ close;
+ L_ITEM_36:
+ mes "[Angel]";
+ mes "Oh you already know what I create!";
+ mes "Ha ha!!";
+ mes "Hum~~ tell me where did you heard";
+ mes "about this?";
+ next;
+ mes "[Angel]";
+ mes "Helm of Orc Hero requires~~";
+ next;
+ mes "[Angel]";
+ mes "350 Broken Armor Piece";
+ mes "1 Machoman's Glasses";
+ mes "1 Slotted Sunglasses";
+ mes "1 Fashion Sunglasses";
+ mes "1 Purple Glasses";
+ mes "100 Fire Seed";
+ mes "1,000,000 Zeny";
+ mes "...Did you know this already?";
+ close;
+}
diff --git a/npc/quests/custom/sunglasses.txt b/npc/quests/custom/sunglasses.txt
index 0a33321a7..18ad8ac47 100644
--- a/npc/quests/custom/sunglasses.txt
+++ b/npc/quests/custom/sunglasses.txt
@@ -1,146 +1,146 @@
-//===== eAthena Script =======================================
-//= Quest For Slotted Sunglasses
-//===== By: ==================================================
-//= Aegis - amichan
-//===== Current Version: =====================================
-//= 1.4
-//===== 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
-//============================================================
-
-// 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.",L_SG_Yes,"Nothing, sorry to bother you.",L_SG_No;
-L_SG_Yes:
- 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!",L_SG_No1;
-L_SG_No1:
- 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!",L_SG_NO;
-L_SG_NO:
- 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.",L_SG_2_No;
-L_SG_2_No:
- 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.",L_SG_2_StartNo;
-L_SG_2_StartNo:
- 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;
- mes "[Maseph]";
- mes "Thank you. I will get on it right away.";
- next;
- delitem 2201,1;
- set zeny,zeny-400000;
- 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.4
+//===== 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
+//============================================================
+
+// 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.",L_SG_Yes,"Nothing, sorry to bother you.",L_SG_No;
+L_SG_Yes:
+ 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!",L_SG_No1;
+L_SG_No1:
+ 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!",L_SG_NO;
+L_SG_NO:
+ 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.",L_SG_2_No;
+L_SG_2_No:
+ 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.",L_SG_2_StartNo;
+L_SG_2_StartNo:
+ 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;
+ mes "[Maseph]";
+ mes "Thank you. I will get on it right away.";
+ next;
+ delitem 2201,1;
+ set zeny,zeny-400000;
+ 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/quests/custom/valhallen.txt b/npc/quests/custom/valhallen.txt
index 6d6d4193d..ca0953077 100644
--- a/npc/quests/custom/valhallen.txt
+++ b/npc/quests/custom/valhallen.txt
@@ -1,199 +1,199 @@
-//===== eAthena Script =======================================
-//= Valhallen items Quests NPC
-//===== By: ==================================================
-//= Avaji
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= All-in-one: Mjolnir,Sleipnir,Brisingamen,Gleipnir,Megingjard
-//===== Additional Comments: =================================
-//= custom quest, ingridients were 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 "Mjolnir",-,"Sleipnir",L_SLE,"Brisingamen",L_BRI,"Gleipnir",L_GLE,"Megingjard",L_MEG;
-
- mes "[Lenneth]";
- mes "The ^3355FFMjolnir^000000 is a mighty mace with the power of wind.";
- mes "The items I need to transmute 2 ^3355FFSpanners^000000 into a ^3355FFMjolnir^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 the ^3355FFMjolnir^000000";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if (countitem(984) < 20 || countitem(985) < 5 || countitem(969) < 40 || countitem(1531) < 2 || countitem(7089) < 5) goto L_NOTENOUGH;
- if (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 ^3355FFMjolnir^000000 may it serve you well.";
- close;
-L_SLE:
-
- mes "[Lenneth]";
- mes "The ^3355FFSleipnir^000000 are shoes that increase your maximum hp/sp";
- mes "To be able to transmute 2 ^3355FFBoots^000000 into a ^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 the ^3355FFSleipnir^000000";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if (countitem(969) < 20 || countitem(985) < 10 || countitem(984) < 1 || countitem(2406) < 2 || countitem(7076) < 3) goto L_NOTENOUGH;
- if (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 "The ^3355FFBrisingamen^000000 increases your str agi int and vit.";
- mes "The items I need to transmute a ^3355FFNecklace^000000 into the ^3355FFBrisingamen^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 the ^3355FFBrisingamen^000000";
- next;
- menu "Yes",-,"No",L_OUT;
-
- if (countitem(969) < 20 || countitem(723) < 5 || countitem(727) < 10 || countitem(722) < 3 || countitem(726) < 2) goto L_NOTENOUGH;
- if (countitem(7090) < 3 || countitem(7088) < 3 || countitem(7077) < 4 || countitem(7073) < 4 || countitem(2603) < 1) goto L_NOTENOUGH;
- if (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 your ^3355FFBrisingamen^000000 may it serve you well.";
- close;
-L_GLE:
-
- mes "[Lenneth]";
- mes "The ^3355FFGleipnir^000000 is a light yet strong rope used to make the ^3355FFMegingjard^000000";
- mes "I will need the following essences to transmute a ^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 the ^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 a powerfull belt that greatly increases ones strength.";
- mes "To transmute a ^3355FFBelt^000000 into a ^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 the ^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 your ^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:
- next;
- 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: Mjolnir,Sleipnir,Brisingamen,Gleipnir,Megingjard
+//===== Additional Comments: =================================
+//= custom quest, ingridients were 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 "Mjolnir",-,"Sleipnir",L_SLE,"Brisingamen",L_BRI,"Gleipnir",L_GLE,"Megingjard",L_MEG;
+
+ mes "[Lenneth]";
+ mes "The ^3355FFMjolnir^000000 is a mighty mace with the power of wind.";
+ mes "The items I need to transmute 2 ^3355FFSpanners^000000 into a ^3355FFMjolnir^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 the ^3355FFMjolnir^000000";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if (countitem(984) < 20 || countitem(985) < 5 || countitem(969) < 40 || countitem(1531) < 2 || countitem(7089) < 5) goto L_NOTENOUGH;
+ if (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 ^3355FFMjolnir^000000 may it serve you well.";
+ close;
+L_SLE:
+
+ mes "[Lenneth]";
+ mes "The ^3355FFSleipnir^000000 are shoes that increase your maximum hp/sp";
+ mes "To be able to transmute 2 ^3355FFBoots^000000 into a ^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 the ^3355FFSleipnir^000000";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if (countitem(969) < 20 || countitem(985) < 10 || countitem(984) < 1 || countitem(2406) < 2 || countitem(7076) < 3) goto L_NOTENOUGH;
+ if (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 "The ^3355FFBrisingamen^000000 increases your str agi int and vit.";
+ mes "The items I need to transmute a ^3355FFNecklace^000000 into the ^3355FFBrisingamen^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 the ^3355FFBrisingamen^000000";
+ next;
+ menu "Yes",-,"No",L_OUT;
+
+ if (countitem(969) < 20 || countitem(723) < 5 || countitem(727) < 10 || countitem(722) < 3 || countitem(726) < 2) goto L_NOTENOUGH;
+ if (countitem(7090) < 3 || countitem(7088) < 3 || countitem(7077) < 4 || countitem(7073) < 4 || countitem(2603) < 1) goto L_NOTENOUGH;
+ if (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 your ^3355FFBrisingamen^000000 may it serve you well.";
+ close;
+L_GLE:
+
+ mes "[Lenneth]";
+ mes "The ^3355FFGleipnir^000000 is a light yet strong rope used to make the ^3355FFMegingjard^000000";
+ mes "I will need the following essences to transmute a ^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 the ^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 a powerfull belt that greatly increases ones strength.";
+ mes "To transmute a ^3355FFBelt^000000 into a ^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 the ^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 your ^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:
+ next;
+ mes "[Lenneth]";
+ mes "Please return when you change your mind.";
+ close;
+}
+
diff --git a/npc/quests/doomed_swords.txt b/npc/quests/doomed_swords.txt
index a878f24be..545ae2623 100644
--- a/npc/quests/doomed_swords.txt
+++ b/npc/quests/doomed_swords.txt
@@ -1,681 +1,681 @@
-//===== eAthena Script =======================================
-//= Doomed Swords Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-//=============================================================================
-// 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:
- 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;
- delitem 7017,2;
- delitem 7024,10;
- delitem 1008,3;
- delitem 609,50;
- delitem 714,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:
- 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;
- delitem 7023,10;
- delitem 724,5;
- delitem 7002,100;
- delitem 7022,1;
- delitem 714,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:
- 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;
- delitem 7021,1;
- delitem 7019,1;
- delitem 7020,1;
- delitem 7018,1;
- delitem 714,1;
- close;
-}
+//===== eAthena Script =======================================
+//= Doomed Swords Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== 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]
+//============================================================
+
+
+//=============================================================================
+// 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:
+ 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;
+ delitem 7017,2;
+ delitem 7024,10;
+ delitem 1008,3;
+ delitem 609,50;
+ delitem 714,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:
+ 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;
+ delitem 7023,10;
+ delitem 724,5;
+ delitem 7002,100;
+ delitem 7022,1;
+ delitem 714,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:
+ 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;
+ delitem 7021,1;
+ delitem 7019,1;
+ delitem 7020,1;
+ delitem 7018,1;
+ delitem 714,1;
+ close;
+}
diff --git a/npc/quests/fashion.txt b/npc/quests/fashion.txt
index 1862893aa..d53af6599 100644
--- a/npc/quests/fashion.txt
+++ b/npc/quests/fashion.txt
@@ -1,60 +1,60 @@
-//--------------Daily Job Quest---------------\\
-
-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 ^000000Quest!";
- next;
- menu "Requirements",Bl,"Make Item",B2,"Cancel",Cancel;
-
- B2:
- mes "[Fashionable Glasses Quest]";
- mes "Good good, let me just check";
- if(countitem(2271)<1)goto NoMake;
- if(countitem(975)<1)goto NoMake;
- next;
-
- mes "[Fashionable Glasses Quest]";
- mes "Give me a second.....";
- next;
- delitem 2271,1;
- delitem 975,1;
- getitem 5047,1;
- mes "[Fashionable Glasses Quest]";
- mes "Ok done!";
- close;
-
-
- NoMake:
- mes "[Fashionable Glasses Quest]";
- mes "You don't have the requirements.";
- mes "Please come back another time...";
- close;
-
- Bl:
- mes "Ok all you have to do is";
- mes "collect-";
- mes "^CC66331 Jack'a Dandy^000000";
- mes "^CC6633and 1 Scalet Dyestuff.^000000";
- next;
- menu "Accept",Acc,"Leave",Leave;
-
- Acc:
- mes "When you are done, bring the items to me,";
- mes "Ok good luck finding those items.";
- close;
-
- Leave:
- mes "[Fashionable Glasses Quest]";
- mes "Maybe another time?";
- close;
-
- 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;
-}
+//--------------Daily Job Quest---------------\\
+
+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 ^000000Quest!";
+ next;
+ menu "Requirements",Bl,"Make Item",B2,"Cancel",Cancel;
+
+ B2:
+ mes "[Fashionable Glasses Quest]";
+ mes "Good good, let me just check";
+ if(countitem(2271)<1)goto NoMake;
+ if(countitem(975)<1)goto NoMake;
+ next;
+
+ mes "[Fashionable Glasses Quest]";
+ mes "Give me a second.....";
+ next;
+ delitem 2271,1;
+ delitem 975,1;
+ getitem 5047,1;
+ mes "[Fashionable Glasses Quest]";
+ mes "Ok done!";
+ close;
+
+
+ NoMake:
+ mes "[Fashionable Glasses Quest]";
+ mes "You don't have the requirements.";
+ mes "Please come back another time...";
+ close;
+
+ Bl:
+ mes "Ok all you have to do is";
+ mes "collect-";
+ mes "^CC66331 Jack'a Dandy^000000";
+ mes "^CC6633and 1 Scalet Dyestuff.^000000";
+ next;
+ menu "Accept",Acc,"Leave",Leave;
+
+ Acc:
+ mes "When you are done, bring the items to me,";
+ mes "Ok good luck finding those items.";
+ close;
+
+ Leave:
+ mes "[Fashionable Glasses Quest]";
+ mes "Maybe another time?";
+ close;
+
+ 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/quests/juice_maker.txt b/npc/quests/juice_maker.txt
index 877622c56..aeb984143 100644
--- a/npc/quests/juice_maker.txt
+++ b/npc/quests/juice_maker.txt
@@ -1,308 +1,308 @@
-//===== eAthena Script =======================================
-//= Juice Maker Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working
-//= 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]
-//============================================================
-
-
-
-
-// Morrison ------------------------------------------------
-prt_in.gat,47,173,2 script Morrison 97,
-{
- if(MEAT > 10) goto L_Candy;
- if(MARIANNE == 10) goto L_GoAway;
-
- mes "[Little Morrison]";
- mes "Wahhhhh!!! Wahh... NO more! NO more!";
- mes "I won't... eat anymore stupid ^0000ffFruit^000000 things!!";
- next;
- menu "Talk",M_Talk,"Cancel",M_End;
-
- M_Talk:
- if(countitem(517) > 0) goto L_Meat; //Meat
-
- mes "[Little Morrison]";
- mes "Arhhggg!! I'VE HAD ENOUGH!!! I can't eat anymore ^0000ffFruits^000000!";
- mes "They taste so SOUR..... I have to PEEL them before I can eat them.....they feel sticky and squishy...... it's really ANNOYING!!!!";
- 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???";
- next;
- mes "[Little Morrison]";
- mes "Do you have some ^ff0000Meat^000000?!!!~(drools)~";
- mes "Umm... that yummy smell is making me SOOO HUNGRYYYY!!!l";
- next;
- mes "[Little Morrison]";
- mes "... Umm... excuse me..... could you give me some of that meat PLEEAASSSE?";
- next;
- menu "Give him some",sM_Give,"Ignore him",sM_Ignore;
-
- sM_Give:
- set MORRISON,1;
- set MEAT,MEAT + 1;
- delitem 517,1; //Meat
-
- 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...";
- close;
- sM_Ignore:
- set MORRISON,2;
-
- mes "[Little Morrison]";
- mes "Boo...";
- mes "Boo... Fine... Alright, Alright~!!! Selfish meanie!";
- close;
- M_End:
- mes "[Little Morrison]";
- mes "Wahhhhh!!! No matter how hard I try, I just can't eat Vegetables or ^0000ffFruit^000000! They're plain disgusting!!";
- close;
-
-L_GoAway:
- mes "[Little Morrison]";
- mes "Pffff... Leave me alone! You DON'T CARE about me! I'm gonna DIE because of these stupid Veggies and Fuits so MIND your own business!";
- close;
-L_Candy:
- mes "[Little Morrison]";
- mes "Ah..I am full now.";
- mes "You don't have to feed me any more. I think I 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 MEAT,0;
-
- mes "[Little Morrison]";
- mes "It is from my secret stash of Candy that I hide from my Mom. Since you gave me some Meat, I will give you some candy." ;
- close;
-
-}
-
-// Housewife Marianne ---------------------------------------------------
-prt_in.gat,49,172,2 script Housewife Marianne 53,
-{
- if(MORRISON == 1) goto L_GaveMeat;
- if(MORRISON == 2) goto L_Juice;
-
- mes "[Housewife Marianne]";
- mes "Morrison!! Please eat some fruit will ya? Fruit~!";
- mes "*Sob*~!! Like father like son...";
- next;
- menu "Talk",M_Talk,"Cancel",M_Cancel;
- close;
-
- M_Talk:
- mes "[Housewife Marianne]";
- mes "(~Sigh~)...This is Morrison... My one and only son.";
- mes "He's going through some kinda faze and doesn't want to eat any ^0000ffFruits^000000 or vegetables. Look at his face, it turns sour just hearing about ^0000fffFruit^000000...";
- next;
- mes "[Housewife Marianne]";
- mes "All he wants to eat is but ^ff0000Meat^000000... (sigh)...he needs ^0000ffFruits^000000 and vegetables for a proper diet.";
- next;
- close;
-
- M_Cancel:
- mes "[Housewife Marianne]";
- mes "Morrison!! I will get mad at you if you keep doing this!";
- close;
-
-L_GaveMeat:
- set MORRISON,0;
-
- mes "[Housewife Marianne]";
- mes "Oh MY GOD!!... Oh lord...";
- 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!!!!!!";
- close;
-
-L_Juice:
- set MORRISON,0;
- set MARIANNE,1;
-
- mes "[Housewife Marianne]";
- mes "Thank you for not giving my son any meat. I'm trying to feed him ^0000ffFruits^000000 and vegetables, but this child doesn't want to eat anything except Meat...";
- next;
- mes "[Housewife Marianne]";
- mes "What if I could turn ^0000ffFruits^000000 into a ^0000ffJuice^000000... for example...Orange juice... Would my child like it?";
- next;
- mes "[Housewife Marianne]";
- mes "Ah! Now I remember..There is a town where you can get a variety of ^0000ffFruit^000000 turned into ^0000ffFruit Juices^000000.";
- next;
- mes "[Housewife Marianne]";
- mes "... Was is it...^ff0000Payon^000000...or ^ff0000Morroc^000000...?";
- next;
- close;
-
-}
-
-// Juicer Marx Hansen -----------------------------------------------------------------------
-payon_in01.gat,5,48,3 script Juicer Marx Hansen 86,
-{
- mes "[Juicer Marx Hansen]";
- if(MARIANNE == 1) goto L_Juice;
- mes "Welcome to my shop. What brings you here?";
- next;
- menu "Conversation",M_0a,"I am just looking around",M_0b;
-
- M_0a:
- 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_0b:
- mes "[Juicer Marx Hansen]";
- mes "Ok then.";
- close;
-
-L_Juice:
- mes "Welcome to my shop. Do you come here to process Fruits like the rest?";
- next;
-
- menu "Yes, I do.",M_1a,"How do you make fruit juice?",M_1b,"No, I don't.",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,"Nope, I'm fine.",sM_1End;
-
- sM_1a:
- set @FRUIT,512;
- set @JUICE,531;
- goto sL_Make;
- sM_1b:
- set @FRUIT,513;
- set @JUICE,532;
- goto sL_Make;
- sM_1c:
- set @FRUIT,514;
- set @JUICE,533;
- goto sL_Make;
- sM_1d:
- set @FRUIT,515;
- set @JUICE,534;
-
- sL_Make:
- mes "[Juicer Marx Hansen]";
- mes "How many bottles would you like?";
- next;
- menu "I'll tell you.",sL_Make_InputN, "As many as possible",-, "I've changed my mind.",sM_1End;
-
- set @FRUITNUM,100; //max possible amount of Juice
- //calc max possible # juices
- if(Zeny/3 < @FRUITNUM) set @FRUITNUM,Zeny/3;
- if(countitem(@FRUIT) < @FRUITNUM) set @FRUITNUM,countitem(@FRUIT);
- if(countitem(713) < @FRUITNUM) set @FRUITNUM,countitem(713);
- if(@FRUITNUM > 0) goto sL_Make_Max;
- mes "[Juicer Marx Hansen]";
- mes "Doh! You don't have enough ingredients for a single bottle of juice.";
- emotion 0;
- close;
-
- sL_Make_Max:
- delitem @FRUIT,@FRUITNUM; //del Fruit
- delitem 713,@FRUITNUM; //del Empty Bottle
- set Zeny,Zeny-@FRUITNUM*3;
- getitem @JUICE,@FRUITNUM; //get Juice
- goto sL_Make_Got;
-
- sL_Make_InputN:
- mes "[Juicer Marx Hansen]";
- mes "Very well then. How many bottles would you like?";
- mes "Enter 0 if you don't want any.";
- next;
- input @input;
-
- if(@input < 1) goto sM_1End;
- set @FRUITNUM,(3*@input);
- set @ZENYNUM,(3*@input);
- if(countitem(@FRUIT) < @FRUITNUM) goto sl_Fruits;
- if(countitem(713) < @input) goto sl_Bottles;
- if(Zeny < @ZENYNUM) goto sl_Zeny;
-
- delitem @FRUIT,@FRUITNUM; //del Fruit
- delitem 713,@input; //del Empty Bottle
- set Zeny,Zeny - @ZENYUM; //get Juice
- getitem @JUICE,@input;
- sL_Make_Got:
- mes "[Juicer Marx Hansen]";
- mes "Here you are. Take it.";
- close;
-
-
- sl_Fruits:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough fruit.";
- if (@FRUIT == 512) mes "You need "+@FRUITNUM+" apples to make that much apple juice.";
- if (@FRUIT == 513) mes "You need "+@FRUITNUM+" bannanas to make that much bannana juice.";
- if (@FRUIT == 514) mes "You need "+@FRUITNUM+" grapes to make that much grape juice.";
- if (@FRUIT == 515) mes "You need "+@FRUITNUM+" carrots to make that much carrot juice.";
- next;
- goto M_1a;
- close;
-
- sl_Bottles:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough bottles. You need "+@input+" empty bottle(s) to make that many juice drinks.";
- next;
- goto M_1a;
-
- sl_Zeny:
- mes "[Juicer Marx Hansen]";
- mes "You don't have enough zeny. You need "+@ZENYNUM+" zeny, to make that many juice drinks.";
- next;
- goto M_1a;
-
- sM_1End:
- mes "[Juicer Marx Hansen]";
- mes "Oh well... see you next time.";
- close;
-
- M_1b:
- mes "[Juicer Marx Hansen]";
- mes "# Fruit Juice Info #";
- mes "Apple Juice - Apple x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "Banane Juice - Banana x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "Carrot Juice - Carrot x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
- mes "Grape Juice - Grape x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
- close;
-
- M_1End:
- close;
-}
-
+//===== eAthena Script =======================================
+//= Juice Maker Quest
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working
+//= 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]
+//============================================================
+
+
+
+
+// Morrison ------------------------------------------------
+prt_in.gat,47,173,2 script Morrison 97,
+{
+ if(MEAT > 10) goto L_Candy;
+ if(MARIANNE == 10) goto L_GoAway;
+
+ mes "[Little Morrison]";
+ mes "Wahhhhh!!! Wahh... NO more! NO more!";
+ mes "I won't... eat anymore stupid ^0000ffFruit^000000 things!!";
+ next;
+ menu "Talk",M_Talk,"Cancel",M_End;
+
+ M_Talk:
+ if(countitem(517) > 0) goto L_Meat; //Meat
+
+ mes "[Little Morrison]";
+ mes "Arhhggg!! I'VE HAD ENOUGH!!! I can't eat anymore ^0000ffFruits^000000!";
+ mes "They taste so SOUR..... I have to PEEL them before I can eat them.....they feel sticky and squishy...... it's really ANNOYING!!!!";
+ 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???";
+ next;
+ mes "[Little Morrison]";
+ mes "Do you have some ^ff0000Meat^000000?!!!~(drools)~";
+ mes "Umm... that yummy smell is making me SOOO HUNGRYYYY!!!l";
+ next;
+ mes "[Little Morrison]";
+ mes "... Umm... excuse me..... could you give me some of that meat PLEEAASSSE?";
+ next;
+ menu "Give him some",sM_Give,"Ignore him",sM_Ignore;
+
+ sM_Give:
+ set MORRISON,1;
+ set MEAT,MEAT + 1;
+ delitem 517,1; //Meat
+
+ 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...";
+ close;
+ sM_Ignore:
+ set MORRISON,2;
+
+ mes "[Little Morrison]";
+ mes "Boo...";
+ mes "Boo... Fine... Alright, Alright~!!! Selfish meanie!";
+ close;
+ M_End:
+ mes "[Little Morrison]";
+ mes "Wahhhhh!!! No matter how hard I try, I just can't eat Vegetables or ^0000ffFruit^000000! They're plain disgusting!!";
+ close;
+
+L_GoAway:
+ mes "[Little Morrison]";
+ mes "Pffff... Leave me alone! You DON'T CARE about me! I'm gonna DIE because of these stupid Veggies and Fuits so MIND your own business!";
+ close;
+L_Candy:
+ mes "[Little Morrison]";
+ mes "Ah..I am full now.";
+ mes "You don't have to feed me any more. I think I 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 MEAT,0;
+
+ mes "[Little Morrison]";
+ mes "It is from my secret stash of Candy that I hide from my Mom. Since you gave me some Meat, I will give you some candy." ;
+ close;
+
+}
+
+// Housewife Marianne ---------------------------------------------------
+prt_in.gat,49,172,2 script Housewife Marianne 53,
+{
+ if(MORRISON == 1) goto L_GaveMeat;
+ if(MORRISON == 2) goto L_Juice;
+
+ mes "[Housewife Marianne]";
+ mes "Morrison!! Please eat some fruit will ya? Fruit~!";
+ mes "*Sob*~!! Like father like son...";
+ next;
+ menu "Talk",M_Talk,"Cancel",M_Cancel;
+ close;
+
+ M_Talk:
+ mes "[Housewife Marianne]";
+ mes "(~Sigh~)...This is Morrison... My one and only son.";
+ mes "He's going through some kinda faze and doesn't want to eat any ^0000ffFruits^000000 or vegetables. Look at his face, it turns sour just hearing about ^0000fffFruit^000000...";
+ next;
+ mes "[Housewife Marianne]";
+ mes "All he wants to eat is but ^ff0000Meat^000000... (sigh)...he needs ^0000ffFruits^000000 and vegetables for a proper diet.";
+ next;
+ close;
+
+ M_Cancel:
+ mes "[Housewife Marianne]";
+ mes "Morrison!! I will get mad at you if you keep doing this!";
+ close;
+
+L_GaveMeat:
+ set MORRISON,0;
+
+ mes "[Housewife Marianne]";
+ mes "Oh MY GOD!!... Oh lord...";
+ 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!!!!!!";
+ close;
+
+L_Juice:
+ set MORRISON,0;
+ set MARIANNE,1;
+
+ mes "[Housewife Marianne]";
+ mes "Thank you for not giving my son any meat. I'm trying to feed him ^0000ffFruits^000000 and vegetables, but this child doesn't want to eat anything except Meat...";
+ next;
+ mes "[Housewife Marianne]";
+ mes "What if I could turn ^0000ffFruits^000000 into a ^0000ffJuice^000000... for example...Orange juice... Would my child like it?";
+ next;
+ mes "[Housewife Marianne]";
+ mes "Ah! Now I remember..There is a town where you can get a variety of ^0000ffFruit^000000 turned into ^0000ffFruit Juices^000000.";
+ next;
+ mes "[Housewife Marianne]";
+ mes "... Was is it...^ff0000Payon^000000...or ^ff0000Morroc^000000...?";
+ next;
+ close;
+
+}
+
+// Juicer Marx Hansen -----------------------------------------------------------------------
+payon_in01.gat,5,48,3 script Juicer Marx Hansen 86,
+{
+ mes "[Juicer Marx Hansen]";
+ if(MARIANNE == 1) goto L_Juice;
+ mes "Welcome to my shop. What brings you here?";
+ next;
+ menu "Conversation",M_0a,"I am just looking around",M_0b;
+
+ M_0a:
+ 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_0b:
+ mes "[Juicer Marx Hansen]";
+ mes "Ok then.";
+ close;
+
+L_Juice:
+ mes "Welcome to my shop. Do you come here to process Fruits like the rest?";
+ next;
+
+ menu "Yes, I do.",M_1a,"How do you make fruit juice?",M_1b,"No, I don't.",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,"Nope, I'm fine.",sM_1End;
+
+ sM_1a:
+ set @FRUIT,512;
+ set @JUICE,531;
+ goto sL_Make;
+ sM_1b:
+ set @FRUIT,513;
+ set @JUICE,532;
+ goto sL_Make;
+ sM_1c:
+ set @FRUIT,514;
+ set @JUICE,533;
+ goto sL_Make;
+ sM_1d:
+ set @FRUIT,515;
+ set @JUICE,534;
+
+ sL_Make:
+ mes "[Juicer Marx Hansen]";
+ mes "How many bottles would you like?";
+ next;
+ menu "I'll tell you.",sL_Make_InputN, "As many as possible",-, "I've changed my mind.",sM_1End;
+
+ set @FRUITNUM,100; //max possible amount of Juice
+ //calc max possible # juices
+ if(Zeny/3 < @FRUITNUM) set @FRUITNUM,Zeny/3;
+ if(countitem(@FRUIT) < @FRUITNUM) set @FRUITNUM,countitem(@FRUIT);
+ if(countitem(713) < @FRUITNUM) set @FRUITNUM,countitem(713);
+ if(@FRUITNUM > 0) goto sL_Make_Max;
+ mes "[Juicer Marx Hansen]";
+ mes "Doh! You don't have enough ingredients for a single bottle of juice.";
+ emotion 0;
+ close;
+
+ sL_Make_Max:
+ delitem @FRUIT,@FRUITNUM; //del Fruit
+ delitem 713,@FRUITNUM; //del Empty Bottle
+ set Zeny,Zeny-@FRUITNUM*3;
+ getitem @JUICE,@FRUITNUM; //get Juice
+ goto sL_Make_Got;
+
+ sL_Make_InputN:
+ mes "[Juicer Marx Hansen]";
+ mes "Very well then. How many bottles would you like?";
+ mes "Enter 0 if you don't want any.";
+ next;
+ input @input;
+
+ if(@input < 1) goto sM_1End;
+ set @FRUITNUM,(3*@input);
+ set @ZENYNUM,(3*@input);
+ if(countitem(@FRUIT) < @FRUITNUM) goto sl_Fruits;
+ if(countitem(713) < @input) goto sl_Bottles;
+ if(Zeny < @ZENYNUM) goto sl_Zeny;
+
+ delitem @FRUIT,@FRUITNUM; //del Fruit
+ delitem 713,@input; //del Empty Bottle
+ set Zeny,Zeny - @ZENYUM; //get Juice
+ getitem @JUICE,@input;
+ sL_Make_Got:
+ mes "[Juicer Marx Hansen]";
+ mes "Here you are. Take it.";
+ close;
+
+
+ sl_Fruits:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough fruit.";
+ if (@FRUIT == 512) mes "You need "+@FRUITNUM+" apples to make that much apple juice.";
+ if (@FRUIT == 513) mes "You need "+@FRUITNUM+" bannanas to make that much bannana juice.";
+ if (@FRUIT == 514) mes "You need "+@FRUITNUM+" grapes to make that much grape juice.";
+ if (@FRUIT == 515) mes "You need "+@FRUITNUM+" carrots to make that much carrot juice.";
+ next;
+ goto M_1a;
+ close;
+
+ sl_Bottles:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough bottles. You need "+@input+" empty bottle(s) to make that many juice drinks.";
+ next;
+ goto M_1a;
+
+ sl_Zeny:
+ mes "[Juicer Marx Hansen]";
+ mes "You don't have enough zeny. You need "+@ZENYNUM+" zeny, to make that many juice drinks.";
+ next;
+ goto M_1a;
+
+ sM_1End:
+ mes "[Juicer Marx Hansen]";
+ mes "Oh well... see you next time.";
+ close;
+
+ M_1b:
+ mes "[Juicer Marx Hansen]";
+ mes "# Fruit Juice Info #";
+ mes "Apple Juice - Apple x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "Banane Juice - Banana x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "Carrot Juice - Carrot x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
+ mes "Grape Juice - Grape x 3 ea, Empty Bottle x 1 ea, 3 zeny.";
+ close;
+
+ M_1End:
+ close;
+}
+
diff --git a/npc/quests/magicalhatquest.txt b/npc/quests/magicalhatquest.txt
index 86bb6dfbe..295a59d7e 100644
--- a/npc/quests/magicalhatquest.txt
+++ b/npc/quests/magicalhatquest.txt
@@ -1,40 +1,40 @@
-geffen.gat,126,107,5 script Magic Pimp Hat Dude 51,{
- mes "[Magic Pimp Hat Dude]";
- mes "Huh! What do you want?";
- mes "Ohh, I see, you want me to make you something";
- mes "Well if you want this Magican Hat here is a list of the items I need you to go out and get them for me:";
- mes "1 Wizard Hat";
- mes "1 Bathory Card";
- mes "and 200,000z for my efforts";
- next;
- mes "[Magic Pimp Hat Dude]";
- mes ". . . . . .";
- mes "Are you ready for me to make this magical item?";
- next;
- menu "Sure am!",LSureAm,"These requirements are unfathomable!",LUnfathomable;
-
- LSureAm:
- mes "[Magic Pimp Hat Dude]";
- if((countitem(2252) < 1) || (countitem(4119) < 1) || (Zeny < 200000)) goto LNotEnough;
- mes ". . . . .";
- delitem 2252,1;
- delitem 4119,1;
- set Zeny,Zeny-200000;
- mes "Wow! You are brave indeed!";
- getitem 5045,1;
- mes ". . . . .";
- mes "Enjoy your Magical Hat!";
- 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;
-}
+geffen.gat,126,107,5 script Magic Pimp Hat Dude 51,{
+ mes "[Magic Pimp Hat Dude]";
+ mes "Huh! What do you want?";
+ mes "Ohh, I see, you want me to make you something";
+ mes "Well if you want this Magican Hat here is a list of the items I need you to go out and get them for me:";
+ mes "1 Wizard Hat";
+ mes "1 Bathory Card";
+ mes "and 200,000z for my efforts";
+ next;
+ mes "[Magic Pimp Hat Dude]";
+ mes ". . . . . .";
+ mes "Are you ready for me to make this magical item?";
+ next;
+ menu "Sure am!",LSureAm,"These requirements are unfathomable!",LUnfathomable;
+
+ LSureAm:
+ mes "[Magic Pimp Hat Dude]";
+ if((countitem(2252) < 1) || (countitem(4119) < 1) || (Zeny < 200000)) goto LNotEnough;
+ mes ". . . . .";
+ delitem 2252,1;
+ delitem 4119,1;
+ set Zeny,Zeny-200000;
+ mes "Wow! You are brave indeed!";
+ getitem 5045,1;
+ mes ". . . . .";
+ mes "Enjoy your Magical Hat!";
+ 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/quests/monstertamers.txt b/npc/quests/monstertamers.txt
index e4de4498f..3b6868aee 100644
--- a/npc/quests/monstertamers.txt
+++ b/npc/quests/monstertamers.txt
@@ -1,443 +1,443 @@
-//===== eAthena Script =======================================
-//= Monster Tamers
-//===== By: ==================================================
-//= kobra_k88, Darkchild, x[tsk]
-//===== Current Version: =====================================
-//= 1.0
-//===== 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.
-//============================================================
-
-
-
-
-//<================================================= Alberta ===============================================>\\
-alberta_in.gat,173,77,3 script Monster Tamer 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;
- 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;
- delitem 702,1;
- delitem 512,2;
- close;
- sM_2:
- if(countitem(707)<1) goto sL_NoItems;
- 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;
- delitem 707,1;
- close;
- sM_3:
- if(countitem(2207)<1 || countitem(705)<1) goto sL_NoItems;
- 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;
- delitem 2207,1;
- delitem 705,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 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;
- 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;
- delitem 5017,1;
- close;
- sM_2:
- if(countitem(5004)<1) goto sL_NoItems;
- 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;
- delitem 5004,1;
- close;
- sM_3:
- if(countitem(2208)<1) goto sL_NoItems;
- 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;
- delitem 2208,1;
- close;
- sM_4:
- if(countitem(2294)<1) goto sL_NoItems;
- 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;
- delitem 2294,1;
- close;
- sM_5:
- if(countitem(5015)<1) goto sL_NoItems;
- 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;
- delitem 5015,1;
- close;
- sM_6:
- if(countitem(2208)<1 || countitem(912)<2 || Zeny<400) goto sL_NoItems;
- 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;
- delitem 2208,1;
- delitem 912,2;
- set Zeny, Zeny-400;
- 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 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'Deviruchi.'^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;
- 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;
- delitem 1006,1;
- delitem 958,2;
- close;
- sM_2:
- if(countitem(7014)<1) goto sL_NoItems;
- 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;
- delitem 7014,1;
- close;
- sM_3:
- if(countitem(1004)<1 || countitem(904)<1) goto sL_NoItems;
- 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;
- delitem 1004,1;
- delitem 904,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.0
+//===== 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.
+//============================================================
+
+
+
+
+//<================================================= Alberta ===============================================>\\
+alberta_in.gat,173,77,3 script Monster Tamer 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;
+ 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;
+ delitem 702,1;
+ delitem 512,2;
+ close;
+ sM_2:
+ if(countitem(707)<1) goto sL_NoItems;
+ 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;
+ delitem 707,1;
+ close;
+ sM_3:
+ if(countitem(2207)<1 || countitem(705)<1) goto sL_NoItems;
+ 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;
+ delitem 2207,1;
+ delitem 705,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 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;
+ 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;
+ delitem 5017,1;
+ close;
+ sM_2:
+ if(countitem(5004)<1) goto sL_NoItems;
+ 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;
+ delitem 5004,1;
+ close;
+ sM_3:
+ if(countitem(2208)<1) goto sL_NoItems;
+ 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;
+ delitem 2208,1;
+ close;
+ sM_4:
+ if(countitem(2294)<1) goto sL_NoItems;
+ 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;
+ delitem 2294,1;
+ close;
+ sM_5:
+ if(countitem(5015)<1) goto sL_NoItems;
+ 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;
+ delitem 5015,1;
+ close;
+ sM_6:
+ if(countitem(2208)<1 || countitem(912)<2 || Zeny<400) goto sL_NoItems;
+ 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;
+ delitem 2208,1;
+ delitem 912,2;
+ set Zeny, Zeny-400;
+ 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 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'Deviruchi.'^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;
+ 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;
+ delitem 1006,1;
+ delitem 958,2;
+ close;
+ sM_2:
+ if(countitem(7014)<1) goto sL_NoItems;
+ 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;
+ delitem 7014,1;
+ close;
+ sM_3:
+ if(countitem(1004)<1 || countitem(904)<1) goto sL_NoItems;
+ 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;
+ delitem 1004,1;
+ delitem 904,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 e4d6fbd80..eb3ffadd5 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.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== Additional Comments: =================================
-//= Fully working. 1.1 Optimized
-//============================================================
-
-
-
-// Alberta ------------------------------------------------------------------------------------------
-alberta.gat,113,53,3 script Smile Assistance::SmileAT 92,
-{
- npctalk strcharinfo(0)+ " , you suck.";
- 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;
- 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!";
- delitem 705,10;
- delitem 909,10;
- delitem 914,10;
- 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,187,104,4 duplicate(SmileAT) Smile Assistance#6 92
-// Prontera ---------------------------------------------------------------------------------
-prontera.gat,186,104,4 duplicate(SmileAT) Smile Assistance#7 92
+//===== eAthena Script =======================================
+//= Mr. Smile Quest
+//===== By: ==================================================
+//= kobra_k88, Akaru
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== Additional Comments: =================================
+//= Fully working. 1.1 Optimized
+//============================================================
+
+
+
+// Alberta ------------------------------------------------------------------------------------------
+alberta.gat,113,53,3 script Smile Assistance::SmileAT 92,
+{
+ npctalk strcharinfo(0)+ " , you suck.";
+ 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;
+ 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!";
+ delitem 705,10;
+ delitem 909,10;
+ delitem 914,10;
+ 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,187,104,4 duplicate(SmileAT) Smile Assistance#6 92
+// Prontera ---------------------------------------------------------------------------------
+prontera.gat,186,104,4 duplicate(SmileAT) Smile Assistance#7 92
diff --git a/npc/quests/quests_alberta.txt b/npc/quests/quests_alberta.txt
index d008a3be1..5c30668b8 100644
--- a/npc/quests/quests_alberta.txt
+++ b/npc/quests/quests_alberta.txt
@@ -1,684 +1,684 @@
-//===== eAthena Script =======================================
-//= Items Quest NPC's located in Alberta
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.3
-//===== 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
-//===== Additional Comments: =================================
-//= Fully working
-//= 1.1 Fixed Spore Doll exploit [Lupus], 1.2 Gramp's Tiger skin label bug
-//= 1.3 Fixed item ID 7031 -> 7013
-//============================================================
-
-
-
-//=======================================================================================================//
-// Doll Quest
-//=======================================================================================================//
-alberta.gat,117,134,8 script Elin 96,
-{
-
- mes "[Elin]";
- if(Sex == 0) mes "Hello, miss. Since you're a girl, you must like dolls, don't you?";
- if(Sex == 1) mes "Hello, mister. Hmm, since you're a boy, you don't like dolls, do you?";
- next;
- mes "[Elin]";
- mes "I LOVE dolls!!";
- emotion 14;
- 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...",M_1,"How about I give you one now?",M_2;
-
- M_1:
- mes "[Elin]";
- mes "Yeah, this time I'm hoping for a Yoyo doll. Hehe, they're so cute! They're my FAVORITE!";
- emotion 33;
- 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 0;
- next;
- menu "Puppet",sM_1,"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;
-
- sM_1:
- if(countitem(740) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Wow--! It's a rabbit! It's SOOOO cute!! Thank you SOOO much!";
- emotion 14;
- 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;
- delitem 740,1;
- 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 15;
- close;
-
-
- sM_2:
- if(countitem(741) < 1) goto L_Liar;
- 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 14;
- next;
- delitem 741,1;
- getitem 529,1;
- mes "[Elin]";
- mes "Thank you for the doll!";
- emotion 15;
- close;
-
-
- sM_3:
- if(countitem(742) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Ew whats this?.... a Chonchon ... doll? ...";
- emotion 16;
- 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.";
- delitem 742,1;
- getitem 530,1;
- next;
- mes "[Elin]";
- mes ".... chonchon.... (~grumble, grumble~)";
- emotion 7;
- close;
-
- sM_4:
- if(countitem(752) < 1) goto L_Liar;
- 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~";
- delitem 752,1;
- getitem 532,7;
- next;
- mes "[Elin]";
- mes "Thanks again for the doll!";
- emotion 15;
- close;
-
- sM_5:
- if(countitem(743) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Blehh .... It's a mushroom... Mom's always scolding me for not eating mushrooms ...";
- emotion 4;
- 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.";
- delitem 743,1;
- getitem 538,5;
- next;
- mes "[Litte Kid]";
- mes "Thank you for the doll~";
- emotion 15;
- close;
-
- sM_6:
- if(countitem(751) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Yay! It's an Osiris doll!";
- next;
- mes "[Elin]";
- mes "Here's something for you too.";
- delitem 751,1;
- getitem 522,2;
- mes "[Elin]";
- mes "Thank you for the doll!";
- close;
-
- sM_7:
- if(countitem(750) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Yay! It's a Baphomet doll!";
- next;
- mes "[Elin]";
- mes "Here's something for you too.";
- delitem 750,1;
- getitem 525,5;
- mes "[Elin]";
- mes "Thank you for the doll!";
- emotion 15;
- close;
-
- sM_8:
- if(countitem(754) < 1) goto L_Liar;
- mes "[Elin]";
- mes "Ah, it's a Smokie doll. I hate Smokies, but the doll's really cute! Thank you!";
- emotion 33;
- next;
- mes "[Elin]";
- mes "Let me give you some of Grandma's home-made cake!";
- delitem 754,1;
- 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 15;
- close;
-
- sM_9:
- if(countitem(753) < 1) goto L_Liar;
- mes "[Elin]";
- mes "WOW--!!! OH MY GOSH! It's a Yoyo doll! This is what I REALLY wanted!! It's SOOOO cute......";
- emotion 14;
- next;
- mes "[Elin]";
- mes "As a thank you, I'll give you this.";
- delitem 753,1;
- 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 15;
- close;
-
- sM_10:
- mes "[Elin]";
- mes "BLAAAAAAAAHHH!! Don't make fun of me cuz I'm young!";
- emotion 32;
- 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 0;
- next;
- mes "[Elin]";
- mes "You're a MEANIE!! I HATE YOU!!!..... sniff... sniff.... Waaaaaaaaaaaaaaaaaaaahhhhhh!!";
- emotion 28;
- 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 0;
- next;
- mes "[Grampa]";
- mes "Have you heard of the Tiger's Footskin???.....";
- emotion 1;
- 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.", sM_Give, "Walk away.", sM_End;
-
- sM_Give:
- mes "[Grampa]";
- mes "T-Thank YOU!! Thank you SO VERY MUCH!!";
- delitem 1030,10;
- getitem 5016,1;
- emotion 15;
- next;
- mes "[Grampa]";
- mes "Now my body can be reinvigorated!!! I will eat it right away!";
- 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!",M_0, "Shut up Dumbo.",M_End;
-
- M_0:
- 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 5;
- next;
- mes "[Cherokee]";
- mes "Thank you! Here are the Antlers just as I promised you!";
- emotion 15;
- 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 2;
- next;
- mes "[Zic]";
- mes "Huh?... Do you have any business with me? You came to me because I'm a merchant right?";
- emotion 20;
- 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",M_0, "-Cresent Hairpin",M_1, "-Fashionable Glasses",M_2, "-Heart Hairpin",M_3;
-
- M_0:
- 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.",sM_0a, "No thanks.",M_End;
-
- sM_0a:
- if (countitem(10007)<1 || countitem(968)<50) goto sL_NotEnuf;
- 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;
- delitem 10007, 1;
- delitem 968, 50;
- 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.",sM_1a, "No thanks.",M_End;
-
- sM_1a:
- if (countitem(5041)<1 || countitem(999)<10) goto sL_NotEnuf;
- 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;
- delitem 5041, 1;
- delitem 999, 10;
- 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.",sM_2a, "No thanks.",M_End;
-
- sM_2a:
- if (countitem(2271)<1 || countitem(975)<1) goto sL_NotEnuf;
- 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;
- delitem 2271, 1;
- delitem 975, 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 20;
- next;
- mes "[Zic]";
- mes "Would you like me to make you one?";
- next;
- menu "Sure.",sM_3a, "No thanks.",M_End;
-
- sM_3a:
- if (countitem(7013)<1200) goto sL_NotEnuf;
- 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;
- delitem 7013, 1200;
- 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 2;
- if(TEMPESTRA == 1) 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.",M_0, "Then go get one, sheesh....",M_1;
-
- M_0:
- if(countitem(503) < 1) goto L_NoPot;
- set TEMPESTRA, 1;
- mes "[Tempestra]";
- mes "Oooh! Thank you so much. I'm so glad to meet such a friendly person here....";
- emotion 15;
- 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...",sM_0, "You should wear a hat.",sM_1;
-
- sM_0:
- 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?",ssM_0a, "Mage Hat?",ssM_0b, "Magician Hat?",ssM_0c, "End Conversation.",ssM_End;
-
- ssM_0a:
- 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.";
- if (countitem(1059)<250 || countitem(2221)<1 || countitem(2227)<1 || countitem(7063)<600) goto ssM_Menu;
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5032, 1;
- delitem 1059, 250;
- delitem 2221, 1;
- delitem 2227, 1;
- delitem 7063, 600;
- mes "[Tempestra]";
- mes "All done... one Sunday Hat just for you. Thank you and come back any time.";
- emotion 15;
- 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.";
- if (countitem(2252)<1 || countitem(1036)<400 || countitem(7001)<50 || countitem(4052)<1) goto ssM_Menu;
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5027, 1;
- delitem 2252, 1;
- delitem 1036, 400;
- delitem 7001, 50;
- delitem 4052, 1;
- mes "[Tempestra]";
- mes "All done... one Mage Hat just for you. Thank you and come back any time.";
- emotion 15;
- 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.";
- if (countitem(2252)<1 || countitem(1054)<450 || countitem(943)<1200) goto ssM_Menu;
- next;
- menu "Make one for me.",-, "Cancel",ssM_End;
-
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5045, 1;
- delitem 2252, 1;
- delitem 1054, 450;
- delitem 943, 1200;
- mes "[Tempestra]";
- mes "All done... one Magician just for you. Thank you and come back any time.";
- emotion 15;
- 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 Amblem 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.",ssM_1a, "Not right now thanks.",ssM_1b;
-
- ssM_1a:
- if(countitem(7086)<1 || countitem(969)<10 || countitem(999)<40 || countitem(1003)<50 || countitem(984)<2) goto ssL_NotEnuf;
- mes "[Tempestra]";
- mes "Please wait just a moment while I make it........";
- next;
- getitem 5022, 1;
- delitem 7086, 1;
- delitem 969, 10;
- delitem 999, 40;
- delitem 1003, 50;
- delitem 984, 2;
- 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 15;
- close;
-
- ssL_NotEnuf:
- mes "[Tempestra]";
- mes "Um.... where are those items exactly???";
- emotion 20;
- 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 20;
- close;
-
- M_1:
- mes "[Tempestra]";
- mes "..... How RUDE!!";
- emotion 0;
- close;
-}
+//===== eAthena Script =======================================
+//= Items Quest NPC's located in Alberta
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.3
+//===== 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
+//===== Additional Comments: =================================
+//= Fully working
+//= 1.1 Fixed Spore Doll exploit [Lupus], 1.2 Gramp's Tiger skin label bug
+//= 1.3 Fixed item ID 7031 -> 7013
+//============================================================
+
+
+
+//=======================================================================================================//
+// Doll Quest
+//=======================================================================================================//
+alberta.gat,117,134,8 script Elin 96,
+{
+
+ mes "[Elin]";
+ if(Sex == 0) mes "Hello, miss. Since you're a girl, you must like dolls, don't you?";
+ if(Sex == 1) mes "Hello, mister. Hmm, since you're a boy, you don't like dolls, do you?";
+ next;
+ mes "[Elin]";
+ mes "I LOVE dolls!!";
+ emotion 14;
+ 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...",M_1,"How about I give you one now?",M_2;
+
+ M_1:
+ mes "[Elin]";
+ mes "Yeah, this time I'm hoping for a Yoyo doll. Hehe, they're so cute! They're my FAVORITE!";
+ emotion 33;
+ 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 0;
+ next;
+ menu "Puppet",sM_1,"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;
+
+ sM_1:
+ if(countitem(740) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Wow--! It's a rabbit! It's SOOOO cute!! Thank you SOOO much!";
+ emotion 14;
+ 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;
+ delitem 740,1;
+ 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 15;
+ close;
+
+
+ sM_2:
+ if(countitem(741) < 1) goto L_Liar;
+ 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 14;
+ next;
+ delitem 741,1;
+ getitem 529,1;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ emotion 15;
+ close;
+
+
+ sM_3:
+ if(countitem(742) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Ew whats this?.... a Chonchon ... doll? ...";
+ emotion 16;
+ 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.";
+ delitem 742,1;
+ getitem 530,1;
+ next;
+ mes "[Elin]";
+ mes ".... chonchon.... (~grumble, grumble~)";
+ emotion 7;
+ close;
+
+ sM_4:
+ if(countitem(752) < 1) goto L_Liar;
+ 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~";
+ delitem 752,1;
+ getitem 532,7;
+ next;
+ mes "[Elin]";
+ mes "Thanks again for the doll!";
+ emotion 15;
+ close;
+
+ sM_5:
+ if(countitem(743) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Blehh .... It's a mushroom... Mom's always scolding me for not eating mushrooms ...";
+ emotion 4;
+ 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.";
+ delitem 743,1;
+ getitem 538,5;
+ next;
+ mes "[Litte Kid]";
+ mes "Thank you for the doll~";
+ emotion 15;
+ close;
+
+ sM_6:
+ if(countitem(751) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Yay! It's an Osiris doll!";
+ next;
+ mes "[Elin]";
+ mes "Here's something for you too.";
+ delitem 751,1;
+ getitem 522,2;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ close;
+
+ sM_7:
+ if(countitem(750) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Yay! It's a Baphomet doll!";
+ next;
+ mes "[Elin]";
+ mes "Here's something for you too.";
+ delitem 750,1;
+ getitem 525,5;
+ mes "[Elin]";
+ mes "Thank you for the doll!";
+ emotion 15;
+ close;
+
+ sM_8:
+ if(countitem(754) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "Ah, it's a Smokie doll. I hate Smokies, but the doll's really cute! Thank you!";
+ emotion 33;
+ next;
+ mes "[Elin]";
+ mes "Let me give you some of Grandma's home-made cake!";
+ delitem 754,1;
+ 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 15;
+ close;
+
+ sM_9:
+ if(countitem(753) < 1) goto L_Liar;
+ mes "[Elin]";
+ mes "WOW--!!! OH MY GOSH! It's a Yoyo doll! This is what I REALLY wanted!! It's SOOOO cute......";
+ emotion 14;
+ next;
+ mes "[Elin]";
+ mes "As a thank you, I'll give you this.";
+ delitem 753,1;
+ 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 15;
+ close;
+
+ sM_10:
+ mes "[Elin]";
+ mes "BLAAAAAAAAHHH!! Don't make fun of me cuz I'm young!";
+ emotion 32;
+ 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 0;
+ next;
+ mes "[Elin]";
+ mes "You're a MEANIE!! I HATE YOU!!!..... sniff... sniff.... Waaaaaaaaaaaaaaaaaaaahhhhhh!!";
+ emotion 28;
+ 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 0;
+ next;
+ mes "[Grampa]";
+ mes "Have you heard of the Tiger's Footskin???.....";
+ emotion 1;
+ 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.", sM_Give, "Walk away.", sM_End;
+
+ sM_Give:
+ mes "[Grampa]";
+ mes "T-Thank YOU!! Thank you SO VERY MUCH!!";
+ delitem 1030,10;
+ getitem 5016,1;
+ emotion 15;
+ next;
+ mes "[Grampa]";
+ mes "Now my body can be reinvigorated!!! I will eat it right away!";
+ 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!",M_0, "Shut up Dumbo.",M_End;
+
+ M_0:
+ 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 5;
+ next;
+ mes "[Cherokee]";
+ mes "Thank you! Here are the Antlers just as I promised you!";
+ emotion 15;
+ 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 2;
+ next;
+ mes "[Zic]";
+ mes "Huh?... Do you have any business with me? You came to me because I'm a merchant right?";
+ emotion 20;
+ 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",M_0, "-Cresent Hairpin",M_1, "-Fashionable Glasses",M_2, "-Heart Hairpin",M_3;
+
+ M_0:
+ 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.",sM_0a, "No thanks.",M_End;
+
+ sM_0a:
+ if (countitem(10007)<1 || countitem(968)<50) goto sL_NotEnuf;
+ 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;
+ delitem 10007, 1;
+ delitem 968, 50;
+ 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.",sM_1a, "No thanks.",M_End;
+
+ sM_1a:
+ if (countitem(5041)<1 || countitem(999)<10) goto sL_NotEnuf;
+ 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;
+ delitem 5041, 1;
+ delitem 999, 10;
+ 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.",sM_2a, "No thanks.",M_End;
+
+ sM_2a:
+ if (countitem(2271)<1 || countitem(975)<1) goto sL_NotEnuf;
+ 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;
+ delitem 2271, 1;
+ delitem 975, 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 20;
+ next;
+ mes "[Zic]";
+ mes "Would you like me to make you one?";
+ next;
+ menu "Sure.",sM_3a, "No thanks.",M_End;
+
+ sM_3a:
+ if (countitem(7013)<1200) goto sL_NotEnuf;
+ 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;
+ delitem 7013, 1200;
+ 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 2;
+ if(TEMPESTRA == 1) 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.",M_0, "Then go get one, sheesh....",M_1;
+
+ M_0:
+ if(countitem(503) < 1) goto L_NoPot;
+ set TEMPESTRA, 1;
+ mes "[Tempestra]";
+ mes "Oooh! Thank you so much. I'm so glad to meet such a friendly person here....";
+ emotion 15;
+ 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...",sM_0, "You should wear a hat.",sM_1;
+
+ sM_0:
+ 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?",ssM_0a, "Mage Hat?",ssM_0b, "Magician Hat?",ssM_0c, "End Conversation.",ssM_End;
+
+ ssM_0a:
+ 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.";
+ if (countitem(1059)<250 || countitem(2221)<1 || countitem(2227)<1 || countitem(7063)<600) goto ssM_Menu;
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5032, 1;
+ delitem 1059, 250;
+ delitem 2221, 1;
+ delitem 2227, 1;
+ delitem 7063, 600;
+ mes "[Tempestra]";
+ mes "All done... one Sunday Hat just for you. Thank you and come back any time.";
+ emotion 15;
+ 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.";
+ if (countitem(2252)<1 || countitem(1036)<400 || countitem(7001)<50 || countitem(4052)<1) goto ssM_Menu;
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5027, 1;
+ delitem 2252, 1;
+ delitem 1036, 400;
+ delitem 7001, 50;
+ delitem 4052, 1;
+ mes "[Tempestra]";
+ mes "All done... one Mage Hat just for you. Thank you and come back any time.";
+ emotion 15;
+ 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.";
+ if (countitem(2252)<1 || countitem(1054)<450 || countitem(943)<1200) goto ssM_Menu;
+ next;
+ menu "Make one for me.",-, "Cancel",ssM_End;
+
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5045, 1;
+ delitem 2252, 1;
+ delitem 1054, 450;
+ delitem 943, 1200;
+ mes "[Tempestra]";
+ mes "All done... one Magician just for you. Thank you and come back any time.";
+ emotion 15;
+ 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 Amblem 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.",ssM_1a, "Not right now thanks.",ssM_1b;
+
+ ssM_1a:
+ if(countitem(7086)<1 || countitem(969)<10 || countitem(999)<40 || countitem(1003)<50 || countitem(984)<2) goto ssL_NotEnuf;
+ mes "[Tempestra]";
+ mes "Please wait just a moment while I make it........";
+ next;
+ getitem 5022, 1;
+ delitem 7086, 1;
+ delitem 969, 10;
+ delitem 999, 40;
+ delitem 1003, 50;
+ delitem 984, 2;
+ 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 15;
+ close;
+
+ ssL_NotEnuf:
+ mes "[Tempestra]";
+ mes "Um.... where are those items exactly???";
+ emotion 20;
+ 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 20;
+ close;
+
+ M_1:
+ mes "[Tempestra]";
+ mes "..... How RUDE!!";
+ emotion 0;
+ close;
+}
diff --git a/npc/quests/quests_aldebaran.txt b/npc/quests/quests_aldebaran.txt
index b21bd9601..39c1da1b1 100644
--- a/npc/quests/quests_aldebaran.txt
+++ b/npc/quests/quests_aldebaran.txt
@@ -1,93 +1,93 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Aldebaran
-//===== By: ==================================================
-//=
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-//=======================================================================================================//
-// 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quest
-//=======================================================================================================//
-aldeba_in.gat,152,166,4 script Trader 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",M_0, "Feather Bonnet",M_1, "Opera Masque",M_2, "Sakkat",M_3;
-
- M_0:
- mes "[Trader]";
- if ((countitem(2275) == 0) || (countitem(998) < 50) || (Zeny < 3500)) goto L_CantMake; //Items: Red Bandana, Iron,
- delitem 2275,1;//Items: Red Bandana,
- delitem 998,50;//Items: Iron,
- set Zeny,Zeny - 3500;
- mes "Hmm.... Do you have a.... MEDICAL LICENSE?!";
- emotion 1;
- 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 18;
- 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 6;
- close;
-}
-
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Aldebaran
+//===== By: ==================================================
+//=
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+//=======================================================================================================//
+// 'Doctor Band', 'Feather Bonnet', 'Opera Masque', 'Sakkat Hat' Quest
+//=======================================================================================================//
+aldeba_in.gat,152,166,4 script Trader 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",M_0, "Feather Bonnet",M_1, "Opera Masque",M_2, "Sakkat",M_3;
+
+ M_0:
+ mes "[Trader]";
+ if ((countitem(2275) == 0) || (countitem(998) < 50) || (Zeny < 3500)) goto L_CantMake; //Items: Red Bandana, Iron,
+ delitem 2275,1;//Items: Red Bandana,
+ delitem 998,50;//Items: Iron,
+ set Zeny,Zeny - 3500;
+ mes "Hmm.... Do you have a.... MEDICAL LICENSE?!";
+ emotion 1;
+ 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 18;
+ 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 6;
+ close;
+}
+
diff --git a/npc/quests/quests_comodo.txt b/npc/quests/quests_comodo.txt
index 79e8ebe97..37e8d8d01 100644
--- a/npc/quests/quests_comodo.txt
+++ b/npc/quests/quests_comodo.txt
@@ -1,277 +1,277 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Comodo
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== 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' Quests.
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-//============================================================================================//
-// 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 "-Crosss Hat Hairband",M_Cross, "-Bulb Hairband",M_Bulb, "-Striped Hairband",M_Striped, "-Blue Hairband",M_Blue, "-End Conversation",M_End;
-
- M_Cross:
- 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.",sM_Yes, "No thank you.",M_End;
-
- sM_Yes:
- 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:
- delitem 2608,1;
- delitem 7069,500;
- getitem 5036,1;
- goto ssL_End;
- ssL_Bulb:
- delitem 2233,1;
- delitem 746,20;
- getitem 5034,1;
- goto ssL_End;
- ssL_Striped:
- delitem 1099,1500;
- getitem 5049,1;
- goto ssL_End;
- ssL_Blue:
- 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;
-
- 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",sM_Mine, "-Parcel Hat",sM_Parcel, "-Money Loser's Grief",sM_Money, "-Phantom of the Opera Mask",sM_Phantom;
-
- sM_Mine:
- 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",sM_MakeMine, "-Parcel Hat",sM_MakePar, "-Money Loser's Grief",sM_MakeMon, "-Phantom of the Opera Mask",sM_MakePhan;
-
- sM_MakeMine:
- if (countitem(5009)<1 || countitem(5028)<1 || countitem(747)<1 || countitem(999)<25) goto ssL_NoItems;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Mine Helmet!";
- delitem 5009, 1;
- delitem 5028, 1;
- delitem 747, 1;
- delitem 999, 25;
- getitem 5031,1;
- close;
- sM_MakePar:
- if (countitem(1059)<150 || countitem(907)<100 || countitem(978)<1) goto ssL_NoItems;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Parcel Hat!";
- delitem 1059, 150;
- delitem 907, 100;
- delitem 978, 1;
- 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;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Money Loser's Grief!";
- delitem 2233, 1;
- delitem 969, 1;
- delitem 999, 20;
- delitem 949, 80;
- delitem 938, 800;
- getitem 5021,1;
- close;
- sM_MakePhan:
- if (countitem(2281)<1 || countitem(1048)<50) goto ssL_NoItems;
- mes "[Mari Isac]";
- mes "Here you go. Enjoy your Phantom of the Opera Mask!";
- delitem 2281,1;
- delitem 1048, 50;
- 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;
-
-}
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Comodo
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== 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' Quests.
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+//============================================================================================//
+// 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 "-Crosss Hat Hairband",M_Cross, "-Bulb Hairband",M_Bulb, "-Striped Hairband",M_Striped, "-Blue Hairband",M_Blue, "-End Conversation",M_End;
+
+ M_Cross:
+ 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.",sM_Yes, "No thank you.",M_End;
+
+ sM_Yes:
+ 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:
+ delitem 2608,1;
+ delitem 7069,500;
+ getitem 5036,1;
+ goto ssL_End;
+ ssL_Bulb:
+ delitem 2233,1;
+ delitem 746,20;
+ getitem 5034,1;
+ goto ssL_End;
+ ssL_Striped:
+ delitem 1099,1500;
+ getitem 5049,1;
+ goto ssL_End;
+ ssL_Blue:
+ 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;
+
+ 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",sM_Mine, "-Parcel Hat",sM_Parcel, "-Money Loser's Grief",sM_Money, "-Phantom of the Opera Mask",sM_Phantom;
+
+ sM_Mine:
+ 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",sM_MakeMine, "-Parcel Hat",sM_MakePar, "-Money Loser's Grief",sM_MakeMon, "-Phantom of the Opera Mask",sM_MakePhan;
+
+ sM_MakeMine:
+ if (countitem(5009)<1 || countitem(5028)<1 || countitem(747)<1 || countitem(999)<25) goto ssL_NoItems;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Mine Helmet!";
+ delitem 5009, 1;
+ delitem 5028, 1;
+ delitem 747, 1;
+ delitem 999, 25;
+ getitem 5031,1;
+ close;
+ sM_MakePar:
+ if (countitem(1059)<150 || countitem(907)<100 || countitem(978)<1) goto ssL_NoItems;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Parcel Hat!";
+ delitem 1059, 150;
+ delitem 907, 100;
+ delitem 978, 1;
+ 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;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Money Loser's Grief!";
+ delitem 2233, 1;
+ delitem 969, 1;
+ delitem 999, 20;
+ delitem 949, 80;
+ delitem 938, 800;
+ getitem 5021,1;
+ close;
+ sM_MakePhan:
+ if (countitem(2281)<1 || countitem(1048)<50) goto ssL_NoItems;
+ mes "[Mari Isac]";
+ mes "Here you go. Enjoy your Phantom of the Opera Mask!";
+ delitem 2281,1;
+ delitem 1048, 50;
+ 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;
+
+}
diff --git a/npc/quests/quests_geffen.txt b/npc/quests/quests_geffen.txt
index c8c46026f..a295bd180 100644
--- a/npc/quests/quests_geffen.txt
+++ b/npc/quests/quests_geffen.txt
@@ -1,186 +1,186 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Geffen
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Welding Mask and Headset Quests.
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-//==============================================================================================//
-// Blacksmith: 'Welding Mask' Quest
-//==============================================================================================//
-geffen_in.gat,144,166,4 script Blacksmith 63,{
- mes "[Blacksmith]";
- mes "Who am I?!........";
- emotion 0;
- 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 21;
- next;
- mes "[Blacksmith]";
- mes "Since I became a Blacksmith, I invented something really incredible..... wanna hear about it?";
- next;
- menu "I'd love to.",M_Yes, "Well, not really....",M_No;
-
- M_Yes:
- 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 23;
- 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 5;
- 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.",sM_Yes, "No thanks. I'd have no use for it.",sM_No;
-
- sM_Yes:
- mes "[Blacksmith]";
- if((countitem(999) < 50) || (Zeny < 2000)) goto sL_NotEnuf;
- 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!";
- delitem 999,50;
- set Zeny, Zeny - 2000;
- 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 4;
- 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 32;
- 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 28;
- next;
- menu "Listen.",M_Listen, "Ask about Items needed.",M_Ask, "Make.",M_Make, "End Conversation.",M_End;
-
- M_Listen:
- 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 28;
- 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 20;
- 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;
- mes "Oh this is GREAT!! You have all of the materials I need to make my grandfather's Headset!";
- emotion 5;
- next;
- mes "[Eric]";
- mes "Give me a few minutes to assemble it...............";
- next;
- delitem 999,40;
- delitem 984,1;
- delitem 970,1;
- delitem 1003,1;
- 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 0;
- 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 15;
- 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 4;
- close;
- M_End:
- mes "[Eric]";
- mes "Farewell..... boo hoo....";
- emotion 28;
- close;
-}
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Geffen
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Welding Mask and Headset Quests.
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+//==============================================================================================//
+// Blacksmith: 'Welding Mask' Quest
+//==============================================================================================//
+geffen_in.gat,144,166,4 script Blacksmith 63,{
+ mes "[Blacksmith]";
+ mes "Who am I?!........";
+ emotion 0;
+ 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 21;
+ next;
+ mes "[Blacksmith]";
+ mes "Since I became a Blacksmith, I invented something really incredible..... wanna hear about it?";
+ next;
+ menu "I'd love to.",M_Yes, "Well, not really....",M_No;
+
+ M_Yes:
+ 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 23;
+ 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 5;
+ 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.",sM_Yes, "No thanks. I'd have no use for it.",sM_No;
+
+ sM_Yes:
+ mes "[Blacksmith]";
+ if((countitem(999) < 50) || (Zeny < 2000)) goto sL_NotEnuf;
+ 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!";
+ delitem 999,50;
+ set Zeny, Zeny - 2000;
+ 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 4;
+ 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 32;
+ 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 28;
+ next;
+ menu "Listen.",M_Listen, "Ask about Items needed.",M_Ask, "Make.",M_Make, "End Conversation.",M_End;
+
+ M_Listen:
+ 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 28;
+ 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 20;
+ 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;
+ mes "Oh this is GREAT!! You have all of the materials I need to make my grandfather's Headset!";
+ emotion 5;
+ next;
+ mes "[Eric]";
+ mes "Give me a few minutes to assemble it...............";
+ next;
+ delitem 999,40;
+ delitem 984,1;
+ delitem 970,1;
+ delitem 1003,1;
+ 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 0;
+ 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 15;
+ 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 4;
+ close;
+ M_End:
+ mes "[Eric]";
+ mes "Farewell..... boo hoo....";
+ emotion 28;
+ close;
+}
diff --git a/npc/quests/quests_lutie.txt b/npc/quests/quests_lutie.txt
index df68b332b..ff262ea96 100644
--- a/npc/quests/quests_lutie.txt
+++ b/npc/quests/quests_lutie.txt
@@ -1,186 +1,186 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Lutie
-//===== By: ==================================================
-//= TonyMan
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 1.0
-//===== Description: =========================================
-//= Blush, Cake Hat, Candle, Chef Hat, Raccoon Hat, Rainbow Eggshell,
-//= Spore Hat, Wonder Nutshell Quests
-//===== Additional Comments: =================================
-//=
-//============================================================
-
-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", 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",cancel;
-
- blush:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "100 Alice's Apron";
- next;
- menu "Here. Now do your magic!",make_blush,"Cancel",cancel;
-
- make_blush:
- if(countitem(7047)<100) goto fail;
- 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.";
- delitem 7047,100;
- getitem 5040,1;
- 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!",make_cake_hat,"Cancel",cancel;
-
- make_cake_hat:
- if((countitem(529)<10) || (countitem(530)<5) || (countitem(539)<20) || (countitem(999)<10) || (countitem(538)<15)) goto fail;
- 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.";
- delitem 529,10;
- delitem 530,5;
- delitem 539,20;
- delitem 999,10;
- delitem 538,15;
- getitem 5024,1;
- 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!",make_candle,"Cancel",cancel;
-
- make_candle:
- if((countitem(2279)<1) || (countitem(7035)<50) || (countitem(526)<100)) goto fail;
- 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.";
- delitem 2279,1;
- delitem 7035,50;
- delitem 526,100;
- getitem 5028,1;
- close;
-
- chef_hat:
- mes "[^469ED2Titicupe^000000]";
- mes "Hmm... spell ingridients are...";
- mes "450 Dragon Scale";
- mes "300 Feather";
- mes "120 Piece of Cake";
- mes " 1 White Dyestuffs";
- next;
- menu "Here. Now do your magic!",make_chef_hat,"Cancel",cancel;
-
- make_chef_hat:
- if((countitem(1036)<450) || (countitem(949)<300) || (countitem(539)<120) || (countitem(982)<1)) goto fail;
- 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.";
- delitem 1036,450;
- delitem 949,300;
- delitem 539,120;
- delitem 982,1;
- getitem 5026,1;
- 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!",make_raccoon_hat,"Cancel",cancel;
-
- make_raccoon_hat:
- if((countitem(1036)<20) || (countitem(2213)<1) || (countitem(7065)<300) || (countitem(7012)<200)) goto fail;
- 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.";
- delitem 1036,20;
- delitem 2213,1;
- delitem 7065,300;
- delitem 7012,200;
- getitem 5033,1;
- 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!",make_rainbow_egg,"Cancel",cancel;
-
- make_rainbow_egg:
- if((countitem(7030)<50) || (countitem(978)<1) || (countitem(5015)<1)) goto fail;
- 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.";
- delitem 7030,50;
- delitem 978,1;
- delitem 5015,1;
- getitem 5039,1;
- 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!",make_spore_hat,"Cancel",cancel;
-
- make_spore_hat:
- if((countitem(7068)<300) || (countitem(7033)<850) || (countitem(1015)<1)) goto fail;
- 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.";
- delitem 7068,300;
- delitem 7033,850;
- delitem 1015,1;
- getitem 5029,1;
- 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!",make_wonder_nut,"Cancel",cancel;
-
- make_wonder_nut:
- if((countitem(5037)<1) || (countitem(7064)<500)) goto fail;
- 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.";
- delitem 5037,1;
- delitem 7064,500;
- getitem 5050,1;
- close;
-
- cancel:
- mes "[^469ED2Titicupe^000000]";
- mes "I bid you farewell, try not to catch a cold out here. It's ^5A9FD8freezing out here!^000000";
- close;
-
- fail:
- mes "[^469ED2Titicupe^000000]";
- mes "I can't cast since you don't seem to have all I need...";
- close;
-}
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Lutie
+//===== By: ==================================================
+//= TonyMan
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 1.0
+//===== Description: =========================================
+//= Blush, Cake Hat, Candle, Chef Hat, Raccoon Hat, Rainbow Eggshell,
+//= Spore Hat, Wonder Nutshell Quests
+//===== Additional Comments: =================================
+//=
+//============================================================
+
+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", 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",cancel;
+
+ blush:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "100 Alice's Apron";
+ next;
+ menu "Here. Now do your magic!",make_blush,"Cancel",cancel;
+
+ make_blush:
+ if(countitem(7047)<100) goto fail;
+ 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.";
+ delitem 7047,100;
+ getitem 5040,1;
+ 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!",make_cake_hat,"Cancel",cancel;
+
+ make_cake_hat:
+ if((countitem(529)<10) || (countitem(530)<5) || (countitem(539)<20) || (countitem(999)<10) || (countitem(538)<15)) goto fail;
+ 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.";
+ delitem 529,10;
+ delitem 530,5;
+ delitem 539,20;
+ delitem 999,10;
+ delitem 538,15;
+ getitem 5024,1;
+ 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!",make_candle,"Cancel",cancel;
+
+ make_candle:
+ if((countitem(2279)<1) || (countitem(7035)<50) || (countitem(526)<100)) goto fail;
+ 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.";
+ delitem 2279,1;
+ delitem 7035,50;
+ delitem 526,100;
+ getitem 5028,1;
+ close;
+
+ chef_hat:
+ mes "[^469ED2Titicupe^000000]";
+ mes "Hmm... spell ingridients are...";
+ mes "450 Dragon Scale";
+ mes "300 Feather";
+ mes "120 Piece of Cake";
+ mes " 1 White Dyestuffs";
+ next;
+ menu "Here. Now do your magic!",make_chef_hat,"Cancel",cancel;
+
+ make_chef_hat:
+ if((countitem(1036)<450) || (countitem(949)<300) || (countitem(539)<120) || (countitem(982)<1)) goto fail;
+ 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.";
+ delitem 1036,450;
+ delitem 949,300;
+ delitem 539,120;
+ delitem 982,1;
+ getitem 5026,1;
+ 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!",make_raccoon_hat,"Cancel",cancel;
+
+ make_raccoon_hat:
+ if((countitem(1036)<20) || (countitem(2213)<1) || (countitem(7065)<300) || (countitem(7012)<200)) goto fail;
+ 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.";
+ delitem 1036,20;
+ delitem 2213,1;
+ delitem 7065,300;
+ delitem 7012,200;
+ getitem 5033,1;
+ 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!",make_rainbow_egg,"Cancel",cancel;
+
+ make_rainbow_egg:
+ if((countitem(7030)<50) || (countitem(978)<1) || (countitem(5015)<1)) goto fail;
+ 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.";
+ delitem 7030,50;
+ delitem 978,1;
+ delitem 5015,1;
+ getitem 5039,1;
+ 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!",make_spore_hat,"Cancel",cancel;
+
+ make_spore_hat:
+ if((countitem(7068)<300) || (countitem(7033)<850) || (countitem(1015)<1)) goto fail;
+ 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.";
+ delitem 7068,300;
+ delitem 7033,850;
+ delitem 1015,1;
+ getitem 5029,1;
+ 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!",make_wonder_nut,"Cancel",cancel;
+
+ make_wonder_nut:
+ if((countitem(5037)<1) || (countitem(7064)<500)) goto fail;
+ 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.";
+ delitem 5037,1;
+ delitem 7064,500;
+ getitem 5050,1;
+ close;
+
+ cancel:
+ mes "[^469ED2Titicupe^000000]";
+ mes "I bid you farewell, try not to catch a cold out here. It's ^5A9FD8freezing out here!^000000";
+ close;
+
+ fail:
+ 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 5551108b2..1291696b7 100644
--- a/npc/quests/quests_morocc.txt
+++ b/npc/quests/quests_morocc.txt
@@ -1,125 +1,125 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Morroc
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Stop Post and Binoculars Quest.
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-//==================================================================================//
-// 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?",M_Order, "I'm not interested.",M_End;
-
- M_Order:
- 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 Dyestuffs^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:
- 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;
- delitem 1019,50;
- delitem 983,1;
- set Zeny, Zeny - 91100;
- emotion 15;
- 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 ?",M_What, "Make",M_Make, "Ignore him",M_End;
-
- M_What:
- 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 20;
- 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;
- mes "Gr~~~~eat ! You'll definitely enjoy a pair of these!";
- next;
- mes "[Marius]";
- mes "Here it is ! The Binoculars !";
- getitem 2296,1;
- delitem 2243,1;
- delitem 999,100;
- set Zeny, Zeny - 50000;
- 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 6;
- close;
-
- M_End:
- mes "[Marius]";
- mes "Hey you! You DARE IGNORE ME!! I am MARIUS the alchemist of ALCHEMISTS!!!!!";
- emotion 23;
- close;
-}
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Morroc
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Stop Post and Binoculars Quest.
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+//==================================================================================//
+// 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?",M_Order, "I'm not interested.",M_End;
+
+ M_Order:
+ 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 Dyestuffs^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:
+ 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;
+ delitem 1019,50;
+ delitem 983,1;
+ set Zeny, Zeny - 91100;
+ emotion 15;
+ 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 ?",M_What, "Make",M_Make, "Ignore him",M_End;
+
+ M_What:
+ 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 20;
+ 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;
+ mes "Gr~~~~eat ! You'll definitely enjoy a pair of these!";
+ next;
+ mes "[Marius]";
+ mes "Here it is ! The Binoculars !";
+ getitem 2296,1;
+ delitem 2243,1;
+ delitem 999,100;
+ set Zeny, Zeny - 50000;
+ 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 6;
+ close;
+
+ M_End:
+ mes "[Marius]";
+ mes "Hey you! You DARE IGNORE ME!! I am MARIUS the alchemist of ALCHEMISTS!!!!!";
+ emotion 23;
+ close;
+}
diff --git a/npc/quests/quests_payon.txt b/npc/quests/quests_payon.txt
index a9928db31..f59cd3c15 100644
--- a/npc/quests/quests_payon.txt
+++ b/npc/quests/quests_payon.txt
@@ -1,291 +1,291 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Payon
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.2
-//===== 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]
-//============================================================
-
-
-
-
-//==========================================================================================//
-// 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 20;
- 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;
-
- 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 14;
- 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 32;
- 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;
- 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;
- delitem 724,1;
- delitem 5001,1;
- delitem 949,200;
- set Zeny, Zeny-5000;
- 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 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 6;
- 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 23;
- 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 32;
- 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 32;
- 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 23;
- M_Menu:
- next;
- menu "Continue",M_Cont, "Show Ora Ora",M_Show, "Give Ora Ora",M_Give, "Cancel",M_End2;
-
- M_Show:
- 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:
- mes "[Young Man]";
- mes "Muhahahahah!!! Finally, I have it.... Ora Ora! Stupid and distgusting Thief Bugs.... you'll pay for invading MY HOME!!!";
- emotion 29;
- next;
- mes "[Young Man]";
- mes "..... Eh em... sorry. I was a little outa control there.... Ah, let me give you my valuable treasure......";
- emotion 4;
- next;
- getitem 5004,1;
- delitem 701,5;
- 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;
-
- 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 4;
- close;
-
-}
-
-
-//========================================================================================//
-// Derivuchi Cap(Hat of Petite Diablo), Helm of Angel
-//========================================================================================//
-payon_in01.gat,56,12,4 script Young Man 89,
-{
- mes "[Young Man]";
- mes "What is it?............";
- next;
- menu "Can you make me a special item?",M_0, "Nothing.",M_End;
-
- M_0:
- mes "[Young Man]";
- mes "I see.... so you know about me huh?.... Ok, tell me what you want.";
- next;
- menu "-Helm of Angel",sM_Angel, "-Deviruchi Cap(Hat of Petite Diablo)",sM_Devir, "-I'll come back later.",M_End;
-
- sM_Angel:
- 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 Cap(Hat of Petite Diablo) 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;
-
- ssL_Angel:
- if(countitem(2229)<1 || countitem(2254)<1 || countitem(7036)<5) goto ssL_NotEnuf;
- mes "[Young Man]";
- mes "Here is your Helm of Angel.";
- delitem 2229, 1;
- delitem 2254, 1;
- delitem 7036, 5;
- getitem 5025, 1;
- close;
- ssL_Devir:
- if(countitem(1038)<600 || countitem(7048)<40) goto ssL_NotEnuf;
- mes "[Young Man]";
- mes "Here is your Deviruchi Cap(Hat of Petite Diablo).";
- delitem 1038, 600;
- delitem 7048, 40;
- 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 =======================================
+//= Item Quest NPCs located in Payon
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.2
+//===== 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]
+//============================================================
+
+
+
+
+//==========================================================================================//
+// 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 20;
+ 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;
+
+ 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 14;
+ 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 32;
+ 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;
+ 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;
+ delitem 724,1;
+ delitem 5001,1;
+ delitem 949,200;
+ set Zeny, Zeny-5000;
+ 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 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 6;
+ 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 23;
+ 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 32;
+ 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 32;
+ 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 23;
+ M_Menu:
+ next;
+ menu "Continue",M_Cont, "Show Ora Ora",M_Show, "Give Ora Ora",M_Give, "Cancel",M_End2;
+
+ M_Show:
+ 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:
+ mes "[Young Man]";
+ mes "Muhahahahah!!! Finally, I have it.... Ora Ora! Stupid and distgusting Thief Bugs.... you'll pay for invading MY HOME!!!";
+ emotion 29;
+ next;
+ mes "[Young Man]";
+ mes "..... Eh em... sorry. I was a little outa control there.... Ah, let me give you my valuable treasure......";
+ emotion 4;
+ next;
+ getitem 5004,1;
+ delitem 701,5;
+ 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;
+
+ 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 4;
+ close;
+
+}
+
+
+//========================================================================================//
+// Derivuchi Cap(Hat of Petite Diablo), Helm of Angel
+//========================================================================================//
+payon_in01.gat,56,12,4 script Young Man 89,
+{
+ mes "[Young Man]";
+ mes "What is it?............";
+ next;
+ menu "Can you make me a special item?",M_0, "Nothing.",M_End;
+
+ M_0:
+ mes "[Young Man]";
+ mes "I see.... so you know about me huh?.... Ok, tell me what you want.";
+ next;
+ menu "-Helm of Angel",sM_Angel, "-Deviruchi Cap(Hat of Petite Diablo)",sM_Devir, "-I'll come back later.",M_End;
+
+ sM_Angel:
+ 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 Cap(Hat of Petite Diablo) 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;
+
+ ssL_Angel:
+ if(countitem(2229)<1 || countitem(2254)<1 || countitem(7036)<5) goto ssL_NotEnuf;
+ mes "[Young Man]";
+ mes "Here is your Helm of Angel.";
+ delitem 2229, 1;
+ delitem 2254, 1;
+ delitem 7036, 5;
+ getitem 5025, 1;
+ close;
+ ssL_Devir:
+ if(countitem(1038)<600 || countitem(7048)<40) goto ssL_NotEnuf;
+ mes "[Young Man]";
+ mes "Here is your Deviruchi Cap(Hat of Petite Diablo).";
+ delitem 1038, 600;
+ delitem 7048, 40;
+ 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 8e2d25362..b1cb63512 100644
--- a/npc/quests/quests_prontera.txt
+++ b/npc/quests/quests_prontera.txt
@@ -1,92 +1,92 @@
-//===== eAthena Script =======================================
-//= Item Quest NPCs located in Prontera
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Ph.D Hat Quest
-//===== Additional Comments: =================================
-//= Fully working
-//= Fixed flower name Dreamy -> Illusion
-//============================================================
-
-
-// Ph.D Hat Quest-------------------------------------------------------
-prt_in.gat,38,108,4 script Teacher 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.",M_Talk, "End Conversation.",M_End;
-
- M_Talk:
- 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 thesedays 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",M_Show, "Give Flowers",M_Give, "Cancel",M_End;
-
- M_Show:
- 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:
- 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 15;
- 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...";
- delitem 710,1;//Items: Illusion Flower,
- delitem 703,1;//Items: Hinalle,
- delitem 704,1;//Items: Aloe,
- delitem 708,1;//Items: Ment,
- getitem 5012,1;//Items: Ph.D Hat,
- close;
-}
+//===== eAthena Script =======================================
+//= Item Quest NPCs located in Prontera
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Ph.D Hat Quest
+//===== Additional Comments: =================================
+//= Fully working
+//= Fixed flower name Dreamy -> Illusion
+//============================================================
+
+
+// Ph.D Hat Quest-------------------------------------------------------
+prt_in.gat,38,108,4 script Teacher 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.",M_Talk, "End Conversation.",M_End;
+
+ M_Talk:
+ 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 thesedays 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",M_Show, "Give Flowers",M_Give, "Cancel",M_End;
+
+ M_Show:
+ 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:
+ 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 15;
+ 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...";
+ delitem 710,1;//Items: Illusion Flower,
+ delitem 703,1;//Items: Hinalle,
+ delitem 704,1;//Items: Aloe,
+ delitem 708,1;//Items: Ment,
+ getitem 5012,1;//Items: Ph.D Hat,
+ close;
+}
diff --git a/npc/quests/quests_umbala.txt b/npc/quests/quests_umbala.txt
index d1dbac930..510e3ab52 100644
--- a/npc/quests/quests_umbala.txt
+++ b/npc/quests/quests_umbala.txt
@@ -1,345 +1,345 @@
-//===== eAthena Script =======================================
-//= Quests NPCs related to Umbala City
-//===== By: ==================================================
-//= sabernet09 & eAthena Team
-//===== Current Version: =====================================
-//= 1.5
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Umbalian Language Quest, +
-//===== 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.5 fixed some Umbalian Language quests:
-//= - Now if Umbalian Chief tell u about meaning of masks
-//= you can interact with activated Sphinx Mask Quest
-//= - with Wise Man Fabius you can learn Umbalian Language
-//= in alternative way.
-//= TODO: Put WEREWOLF in Umbla - and add some conditions to
-//= the Dungeon entrance quest
-//============================================================
-
-
-
-//===========================================================================
-//this quest is related to Umbalian Chief
-morocc.gat,140,156,5 script Turban Thief 58,{
- if(mask_q == 0) goto AWAY;
- if(mask_q == 2) 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?";
- menu "Pay 1,000,000z",MonA,"No deal",NoGo;
- MonA:
- next;
- if(Zeny < 1000000) goto NotEnough;
- mes "[Turban Thief]";
- mes "O ho ho, its a deal then!";
- set zeny,zeny-1000000;
- getitem 7114,1;//Items: Sphinx Mask,
- set mask_q,2;
- close;
- NoGo:
- next;
- mes "[Turban Thief]";
- mes "Ahh a business man are you no? Fine, how about...";
- menu "Pay 750,000",MonB,"Nope lower",NoGoB;
- MonB:
- next;
- if(Zeny < 750000) goto NotEnough;
- mes "[Turban Thief]";
- mes "It is a done deal, no refunds!";
- set zeny,zeny-750000;
- getitem 7114,1;//Items: Sphinx Mask,
- set mask_q,2;
- close;
- NoGoB:
- mes "[Turban Thief]";
- mes "Hmmm... you drive a hard bargain, ok... my final offer...";
- menu "Pay 500,000",MonC,"It can go lower than that.",NoGoC;
- MonC:
- next;
- if(Zeny < 500000) goto NotEnough;
- mes "[Turban Thief]";
- mes "Alright, here you go then...";
- set zeny,zeny-500000;
- getitem 7114,1;//Items: Sphinx Mask,
- set mask_q,2;
- close;
- NoGoC:
- next;
- mes "[Turban Thief]";
- mes "Ack! Forgez it! I can do bettaz en elsez where!";
- 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;
-}
-
-//======================================================================================//
-// Umbala Language Quest (optional)
-//======================================================================================//
-
-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 15;
- 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 1;
- 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?";
- menu "No nothing at all.",M_NO,"Your teacher sent me.",-;
-
- mes "What does he want from me?";
- emotion 1;
- 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 1;
- mes "Hi! What do you want from me?";
- close;
-M_NO:
- 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 "Yatta! Here's a lil something in return.";
- getitem 7118,1;//Items: Torn Scroll,
- delitem 9001,1;//Items: Poring Egg,
- delitem 643,1;//Items: Pet Incubator,
- set umb_marie,1; //got Torn Scroll
- close;
-M_DOH:
- mes "O pooo... sigh...";
- close;
-L_AGAIN:
- emotion 15;
- 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 15;
- 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;
-}
-
-//========================================================================================================================\\
-// Little Quest NPC to enter the dungeon
-// Fixed by Akaru
-//========================================================================================================================\\
-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;
-}
+//===== eAthena Script =======================================
+//= Quests NPCs related to Umbala City
+//===== By: ==================================================
+//= sabernet09 & eAthena Team
+//===== Current Version: =====================================
+//= 1.5
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Umbalian Language Quest, +
+//===== 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.5 fixed some Umbalian Language quests:
+//= - Now if Umbalian Chief tell u about meaning of masks
+//= you can interact with activated Sphinx Mask Quest
+//= - with Wise Man Fabius you can learn Umbalian Language
+//= in alternative way.
+//= TODO: Put WEREWOLF in Umbla - and add some conditions to
+//= the Dungeon entrance quest
+//============================================================
+
+
+
+//===========================================================================
+//this quest is related to Umbalian Chief
+morocc.gat,140,156,5 script Turban Thief 58,{
+ if(mask_q == 0) goto AWAY;
+ if(mask_q == 2) 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?";
+ menu "Pay 1,000,000z",MonA,"No deal",NoGo;
+ MonA:
+ next;
+ if(Zeny < 1000000) goto NotEnough;
+ mes "[Turban Thief]";
+ mes "O ho ho, its a deal then!";
+ set zeny,zeny-1000000;
+ getitem 7114,1;//Items: Sphinx Mask,
+ set mask_q,2;
+ close;
+ NoGo:
+ next;
+ mes "[Turban Thief]";
+ mes "Ahh a business man are you no? Fine, how about...";
+ menu "Pay 750,000",MonB,"Nope lower",NoGoB;
+ MonB:
+ next;
+ if(Zeny < 750000) goto NotEnough;
+ mes "[Turban Thief]";
+ mes "It is a done deal, no refunds!";
+ set zeny,zeny-750000;
+ getitem 7114,1;//Items: Sphinx Mask,
+ set mask_q,2;
+ close;
+ NoGoB:
+ mes "[Turban Thief]";
+ mes "Hmmm... you drive a hard bargain, ok... my final offer...";
+ menu "Pay 500,000",MonC,"It can go lower than that.",NoGoC;
+ MonC:
+ next;
+ if(Zeny < 500000) goto NotEnough;
+ mes "[Turban Thief]";
+ mes "Alright, here you go then...";
+ set zeny,zeny-500000;
+ getitem 7114,1;//Items: Sphinx Mask,
+ set mask_q,2;
+ close;
+ NoGoC:
+ next;
+ mes "[Turban Thief]";
+ mes "Ack! Forgez it! I can do bettaz en elsez where!";
+ 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;
+}
+
+//======================================================================================//
+// Umbala Language Quest (optional)
+//======================================================================================//
+
+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 15;
+ 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 1;
+ 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?";
+ menu "No nothing at all.",M_NO,"Your teacher sent me.",-;
+
+ mes "What does he want from me?";
+ emotion 1;
+ 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 1;
+ mes "Hi! What do you want from me?";
+ close;
+M_NO:
+ 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 "Yatta! Here's a lil something in return.";
+ getitem 7118,1;//Items: Torn Scroll,
+ delitem 9001,1;//Items: Poring Egg,
+ delitem 643,1;//Items: Pet Incubator,
+ set umb_marie,1; //got Torn Scroll
+ close;
+M_DOH:
+ mes "O pooo... sigh...";
+ close;
+L_AGAIN:
+ emotion 15;
+ 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 15;
+ 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;
+}
+
+//========================================================================================================================\\
+// Little Quest NPC to enter the dungeon
+// Fixed by Akaru
+//========================================================================================================================\\
+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;
+}
diff --git a/npc/quests/quests_yuno.txt b/npc/quests/quests_yuno.txt
index 7044d21f7..53fd11525 100644
--- a/npc/quests/quests_yuno.txt
+++ b/npc/quests/quests_yuno.txt
@@ -1,135 +1,135 @@
-//===== eAthena Script =======================================
-//= Quests NPCs located in Yuno City
-//===== By: ==================================================
-//= DiaDz (v1.0)
-//===== Current Version: =====================================
-//= 1.3
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//=
-//===== 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]
-//============================================================
-
-
-
-
-//===========================================================================
-yuno_in01.gat,103,158,4 script Bain 98,
-{
- set @name$, "[Bain]";
-
-OnStart:
- mes @name$;
- if (sleiphnir_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 sleiphnir_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;
- mes "Thank you very much! You found all of the items I needed. We could not have completed this project without your help";
- next;
- 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 @name$;
-
- L_Alchemist:
- 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;
- next;
- //if u take Alchemist Job Quest then
- if(ALCH_Q == 6) set ALCH_Q2, 2;
- 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 "Thank for helping me out.";
- mes "You have my eternal gratitude.";
- mes "I wish you luck in your journeys!";
- next;
- mes "And here is something for you, to show you how much we appreciate your help.";
- getitem 2410, 1;
- set sleiphnir_q, 0;
- 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 =======================================
+//= Quests NPCs located in Yuno City
+//===== By: ==================================================
+//= DiaDz (v1.0)
+//===== Current Version: =====================================
+//= 1.3
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//=
+//===== 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]
+//============================================================
+
+
+
+
+//===========================================================================
+yuno_in01.gat,103,158,4 script Bain 98,
+{
+ set @name$, "[Bain]";
+
+OnStart:
+ mes @name$;
+ if (sleiphnir_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 sleiphnir_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;
+ mes "Thank you very much! You found all of the items I needed. We could not have completed this project without your help";
+ next;
+ 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 @name$;
+
+ L_Alchemist:
+ 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;
+ next;
+ //if u take Alchemist Job Quest then
+ if(ALCH_Q == 6) set ALCH_Q2, 2;
+ 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 "Thank for helping me out.";
+ mes "You have my eternal gratitude.";
+ mes "I wish you luck in your journeys!";
+ next;
+ mes "And here is something for you, to show you how much we appreciate your help.";
+ getitem 2410, 1;
+ set sleiphnir_q, 0;
+ 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/skills/acolyte_skills.txt b/npc/quests/skills/acolyte_skills.txt
index 6b827a8c5..795df5d90 100644
--- a/npc/quests/skills/acolyte_skills.txt
+++ b/npc/quests/skills/acolyte_skills.txt
@@ -1,126 +1,126 @@
-//===== eAthena Script =======================================
-//= Acolyte Skill Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.
-//============================================================
-
-
-prt_church.gat,173,23,4 script Acolyte Klift 79,
-{
- mes "[Acolyte Klift]";
- if (callfunc("Is_Holy_Class")) 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 == 1) 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 Bule^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 (Class==Job_Acolyte && JobLevel<30) goto L_LowLvl;
- if (countitem(727)<1 || countitem(991)<1 || countitem(2608)<1) goto L_NoItems;
-
- 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!";
- delitem 727,1;
- delitem 991,1;
- delitem 2608,1;
- skill 156,1,0;
- set HOLYLIGHT, 0;
- mes "[Priest]";
- mes "You have done well. May God bless you!";
- emotion 21;
- 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 Bule^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.0a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.
+//============================================================
+
+
+prt_church.gat,173,23,4 script Acolyte Klift 79,
+{
+ mes "[Acolyte Klift]";
+ if (callfunc("Is_Holy_Class")) 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 == 1) 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 Bule^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 (Class==Job_Acolyte && JobLevel<30) goto L_LowLvl;
+ if (countitem(727)<1 || countitem(991)<1 || countitem(2608)<1) goto L_NoItems;
+
+ 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!";
+ delitem 727,1;
+ delitem 991,1;
+ delitem 2608,1;
+ skill 156,1,0;
+ set HOLYLIGHT, 0;
+ mes "[Priest]";
+ mes "You have done well. May God bless you!";
+ emotion 21;
+ 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 Bule^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/archer_skills.txt b/npc/quests/skills/archer_skills.txt
index 4b8650d08..3839ab777 100644
--- a/npc/quests/skills/archer_skills.txt
+++ b/npc/quests/skills/archer_skills.txt
@@ -1,210 +1,210 @@
-//===== eAthena Script =======================================
-//= Archer Skill Quest
-//===== By: ==================================================
-//= eAthena dev team
-//===== Current Version: =====================================
-//= 1.0 a
-//===== 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]
-//============================================================
-
-
-
-//<======================== Roberto: Arrow crafting =========================>\\
-morocc.gat,121,109,5 script Roberto 88,
-{
- mes "[Roberto]";
- if (callfunc("Is_Bow_Class")) goto L_Start;
-
-L_Other:
- mes "Eh?... First time seeing an archer of 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 1;
- close;
-L_Start:
- if (Class==Job_Archer && JobLevel<35) goto L_LowLvl;
- if (getskilllv(147)>0) goto L_GotSkill;
- if (ARWCRFT == 1) 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 definately 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 5;
- close;
- M_1:
- mes "[Roberto]";
- mes "................................................................";
- emotion 7;
- next;
- mes "[Roberto]";
- mes "Let me teach you this special skill.... It's called, my boot up";
- mes "your A........";
- emotion 32;
- 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;
- 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. Your 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;
- delitem 907, 20;
- delitem 7033, 7;
- delitem 906, 41;
- delitem 1019, 13;
- delitem 501, 1;
- 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 "to 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 1;
- 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 abrubtly..... Maybe if you trained a";
- mes "little bit longer we would have more to talk about............";
- close;
-}
-
-
-//<============================== Arrow Repel ===============================>\\
-payon.gat,190,176,5 script Jason 88,
-{
- mes "[Jason]";
- if (callfunc("Is_Bow_Class")) 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 (Class == Job_Archer && JobLevel < 35) goto L_LowLvl;
- if (ARWREP == 1) 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;
- 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;
- delitem 721,2;
- delitem 942,3;
- delitem 962,10;
- delitem 925,10;
- delitem 532,36;
- 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.0 a
+//===== 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]
+//============================================================
+
+
+
+//<======================== Roberto: Arrow crafting =========================>\\
+morocc.gat,121,109,5 script Roberto 88,
+{
+ mes "[Roberto]";
+ if (callfunc("Is_Bow_Class")) goto L_Start;
+
+L_Other:
+ mes "Eh?... First time seeing an archer of 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 1;
+ close;
+L_Start:
+ if (Class==Job_Archer && JobLevel<35) goto L_LowLvl;
+ if (getskilllv(147)>0) goto L_GotSkill;
+ if (ARWCRFT == 1) 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 definately 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 5;
+ close;
+ M_1:
+ mes "[Roberto]";
+ mes "................................................................";
+ emotion 7;
+ next;
+ mes "[Roberto]";
+ mes "Let me teach you this special skill.... It's called, my boot up";
+ mes "your A........";
+ emotion 32;
+ 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;
+ 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. Your 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;
+ delitem 907, 20;
+ delitem 7033, 7;
+ delitem 906, 41;
+ delitem 1019, 13;
+ delitem 501, 1;
+ 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 "to 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 1;
+ 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 abrubtly..... Maybe if you trained a";
+ mes "little bit longer we would have more to talk about............";
+ close;
+}
+
+
+//<============================== Arrow Repel ===============================>\\
+payon.gat,190,176,5 script Jason 88,
+{
+ mes "[Jason]";
+ if (callfunc("Is_Bow_Class")) 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 (Class == Job_Archer && JobLevel < 35) goto L_LowLvl;
+ if (ARWREP == 1) 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;
+ 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;
+ delitem 721,2;
+ delitem 942,3;
+ delitem 962,10;
+ delitem 925,10;
+ delitem 532,36;
+ 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/mage_skills.txt b/npc/quests/skills/mage_skills.txt
index fd47c8e0b..9bcb2e5e9 100644
--- a/npc/quests/skills/mage_skills.txt
+++ b/npc/quests/skills/mage_skills.txt
@@ -1,114 +1,114 @@
-//===== eAthena Script =======================================
-//= Mage Skill Quest
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= v1.0a Now using functions found in "Global_Functions.txt"
-//= for class checks.[kobra_k88]
-//============================================================
-
-
-
-geffen_in.gat,151,119,4 script BLIZZARDRISS 71,
-{
- mes "[BLIZZARDRISS]";
- if(callfunc("Is_Magic_Class")) goto L_Start;
-
-L_Other:
- mes "What new magic spells will I discover today......??";
- emotion 20;
- close;
-
-L_Start:
- if(ENRGYCOAT == 1) 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 usefull.";
- next;
- mes "[BLIZZARDRISS]";
- mes "The spell uses your 'pyscho-kenetic 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 burried 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 6;
- close;
-
- M_End:
- mes "[BLIZZARDRISS]";
- mes "The wise man must have patience! Prepare yourself and return when you are ready.";
- close;
-
-L_GetSkill:
- if(Class==Job_Mage && JobLevel < 35) goto L_JobLvl;
- if(countitem(746)<3 || countitem(730)<1 || countitem(935)<5 || countitem(943)<1) goto L_Items;
- mes "Ohh my, ohh my...... This is going to be swell. Hand over the items... Thank you.";
- next;
- mes "~ several hours later ~";
- next;
- delitem 746,3;
- delitem 730,1;
- delitem 935,5;
- delitem 943,1;
- skill 157,1,0;
- set ENRGYCOAT,0;
- mes "[BLIZZARDRISS]";
- mes "You can now use the spell, 'Energy Coat'!! Use it wisely my friend!";
- emotion 21;
- 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 1;
- 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 1;
- 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.0a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= v1.0a Now using functions found in "Global_Functions.txt"
+//= for class checks.[kobra_k88]
+//============================================================
+
+
+
+geffen_in.gat,151,119,4 script BLIZZARDRISS 71,
+{
+ mes "[BLIZZARDRISS]";
+ if(callfunc("Is_Magic_Class")) goto L_Start;
+
+L_Other:
+ mes "What new magic spells will I discover today......??";
+ emotion 20;
+ close;
+
+L_Start:
+ if(ENRGYCOAT == 1) 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 usefull.";
+ next;
+ mes "[BLIZZARDRISS]";
+ mes "The spell uses your 'pyscho-kenetic 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 burried 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 6;
+ close;
+
+ M_End:
+ mes "[BLIZZARDRISS]";
+ mes "The wise man must have patience! Prepare yourself and return when you are ready.";
+ close;
+
+L_GetSkill:
+ if(Class==Job_Mage && JobLevel < 35) goto L_JobLvl;
+ if(countitem(746)<3 || countitem(730)<1 || countitem(935)<5 || countitem(943)<1) goto L_Items;
+ mes "Ohh my, ohh my...... This is going to be swell. Hand over the items... Thank you.";
+ next;
+ mes "~ several hours later ~";
+ next;
+ delitem 746,3;
+ delitem 730,1;
+ delitem 935,5;
+ delitem 943,1;
+ skill 157,1,0;
+ set ENRGYCOAT,0;
+ mes "[BLIZZARDRISS]";
+ mes "You can now use the spell, 'Energy Coat'!! Use it wisely my friend!";
+ emotion 21;
+ 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 1;
+ 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 1;
+ 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 f3d6adcf3..958e3b7e7 100644
--- a/npc/quests/skills/merchant_skills.txt
+++ b/npc/quests/skills/merchant_skills.txt
@@ -1,308 +1,308 @@
-//===== eAthena Script =======================================
-//= Merchant Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1a
-//===== 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]
-//============================================================
-
-
-
-
-//--------------------------------------- Necko: Crazy Uproar--------------------------------\\
-alberta.gat,89,96,5 script Necko 139,0,4,
-{
- mes "[!?]";
- mes "Muahahahahhhahahahahhahah!!";
- mes "Pukakakakakkakakakakakakaka!!";
- close;
-}
-
-alberta.gat,83,96,5 script Necko 98,
-{
- mes "[Necko]";
- if (callfunc("Is_Merc_Class")) 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 == 1) 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 "Afterall you did hear it from a far off distance.";
- emotion 1;
- 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(Class==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 5;
- 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 inturn you will recieve an additional ^3355FF4 STR for 5 min^000000!!";
- next;
- mes "[Necko]";
- mes "This skill is very usefull. 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 trully 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 "- 1Banana 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 secrect 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;
- 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!! Execellent. Your voice is now finely tuned for ^3355FFCrazy Uproar^000000. Good job.";
- delitem 722,7;
- delitem 532,1;
- delitem 921,50;
- skill 155,1,0;
- set CRAZYROAR, 0;
- emotion 21;
- close;
-
- L_Items:
- mes "You need to get these items for Crazy Uproar:";
- mes "- ^3355FF7 Pearls,";
- mes "- 1Banana 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 (callfunc("Is_Merc_Class")) goto L_Start;
-L_Other:
- mes "I am a merchant that deals in 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 == 1) 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 (Class==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 spectactular.";
- //delitem 1019,50;
- //delitem 998,10;
- //delitem 919,20;
- skill 154,1,0;
- set CHANGECART, 0;
- 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;
-
-}
-
-
-//-------------------------====-------- Gershuan: Cart Revolution ---------------------------------\\
-alberta.gat,232,106,6 script Gershaun 57,
-{
- if (callfunc("Is_Merc_Class")) goto L_Start;
-
-L_Other:
- mes "[Gershaun]";
- 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 == 1) goto L_GetSkill;
- mes "[Gershaun]";
- mes "Hmm... a young merchant. You must use carts too right? Since to have to do all of that vending..... But is that all you use your cart for?";
- emotion 20;
- next;
- mes "[Gershaun]";
- 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 23;
- 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, amorless merchant!?'";
- emotion 0;
- 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 19;
- next;
- mes "[Gershuan]";
- mes "I used my cart to attack the monster!!";
- emotion 0;
- next;
- mes "[Gershuan]";
- mes "Just like that the monster was defeated!! Finally I had found another exellent use for the cart! A WEAPON!!!";
- next;
- mes "[Gershuan]";
- mes "I called my new 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 5;
- 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 (Class==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 6;
- close;
-
-L_GetSkill:
- if ((countitem(533)<2) || (countitem(998)<15) || (countitem(938)<30) || (countitem(601)<20) || (countitem(962)<5)) goto sM_0;
- mes "[Gershaun]";
- 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 4;
- 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 becuase you have just mastered Cart Revolution!";
- emotion 21;
- next;
- delitem 533,2;
- delitem 998,15;
- delitem 938,30;
- delitem 601,20;
- delitem 962,5;
- 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 29;
- close;
-
-L_GotSkill:
- mes "[Gershaun]";
- mes "So how do you like cart revolution? Remeber, the ^3355FFheavier^000000 the cart, the ^3355FFgreater^000000 the damge.";
- close;
-
-}
+//===== eAthena Script =======================================
+//= Merchant Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1a
+//===== 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]
+//============================================================
+
+
+
+
+//--------------------------------------- Necko: Crazy Uproar--------------------------------\\
+alberta.gat,89,96,5 script Necko 139,0,4,
+{
+ mes "[!?]";
+ mes "Muahahahahhhahahahahhahah!!";
+ mes "Pukakakakakkakakakakakakaka!!";
+ close;
+}
+
+alberta.gat,83,96,5 script Necko 98,
+{
+ mes "[Necko]";
+ if (callfunc("Is_Merc_Class")) 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 == 1) 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 "Afterall you did hear it from a far off distance.";
+ emotion 1;
+ 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(Class==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 5;
+ 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 inturn you will recieve an additional ^3355FF4 STR for 5 min^000000!!";
+ next;
+ mes "[Necko]";
+ mes "This skill is very usefull. 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 trully 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 "- 1Banana 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 secrect 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;
+ 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!! Execellent. Your voice is now finely tuned for ^3355FFCrazy Uproar^000000. Good job.";
+ delitem 722,7;
+ delitem 532,1;
+ delitem 921,50;
+ skill 155,1,0;
+ set CRAZYROAR, 0;
+ emotion 21;
+ close;
+
+ L_Items:
+ mes "You need to get these items for Crazy Uproar:";
+ mes "- ^3355FF7 Pearls,";
+ mes "- 1Banana 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 (callfunc("Is_Merc_Class")) goto L_Start;
+L_Other:
+ mes "I am a merchant that deals in 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 == 1) 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 (Class==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 spectactular.";
+ //delitem 1019,50;
+ //delitem 998,10;
+ //delitem 919,20;
+ skill 154,1,0;
+ set CHANGECART, 0;
+ 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;
+
+}
+
+
+//-------------------------====-------- Gershuan: Cart Revolution ---------------------------------\\
+alberta.gat,232,106,6 script Gershaun 57,
+{
+ if (callfunc("Is_Merc_Class")) goto L_Start;
+
+L_Other:
+ mes "[Gershaun]";
+ 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 == 1) goto L_GetSkill;
+ mes "[Gershaun]";
+ mes "Hmm... a young merchant. You must use carts too right? Since to have to do all of that vending..... But is that all you use your cart for?";
+ emotion 20;
+ next;
+ mes "[Gershaun]";
+ 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 23;
+ 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, amorless merchant!?'";
+ emotion 0;
+ 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 19;
+ next;
+ mes "[Gershuan]";
+ mes "I used my cart to attack the monster!!";
+ emotion 0;
+ next;
+ mes "[Gershuan]";
+ mes "Just like that the monster was defeated!! Finally I had found another exellent use for the cart! A WEAPON!!!";
+ next;
+ mes "[Gershuan]";
+ mes "I called my new 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 5;
+ 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 (Class==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 6;
+ close;
+
+L_GetSkill:
+ if ((countitem(533)<2) || (countitem(998)<15) || (countitem(938)<30) || (countitem(601)<20) || (countitem(962)<5)) goto sM_0;
+ mes "[Gershaun]";
+ 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 4;
+ 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 becuase you have just mastered Cart Revolution!";
+ emotion 21;
+ next;
+ delitem 533,2;
+ delitem 998,15;
+ delitem 938,30;
+ delitem 601,20;
+ delitem 962,5;
+ 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 29;
+ close;
+
+L_GotSkill:
+ mes "[Gershaun]";
+ mes "So how do you like cart revolution? Remeber, the ^3355FFheavier^000000 the cart, the ^3355FFgreater^000000 the damge.";
+ close;
+
+}
diff --git a/npc/quests/skills/novice_skills.txt b/npc/quests/skills/novice_skills.txt
index aab02da0e..ad736c6e2 100644
--- a/npc/quests/skills/novice_skills.txt
+++ b/npc/quests/skills/novice_skills.txt
@@ -1,258 +1,258 @@
-//===== eAthena Script =======================================
-//= Novice Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= Customized novice skills quest
-//===== Additional Comments: =================================
-//= Fully working
-//============================================================
-
-
-
-
-//<---------------------------------------------------------------------------------------------- Nurse Aid: First Aid NPC ---------------------------------------------------------------------------->\\
-prt_in.gat,235,133,4 script Nurse Aid 90,
-{
- mes "[Nurse Aid]";
- if(FIRSTAID == 1) goto L_GetAid;
- if(getskilllv(142)>0) goto L_GotAid;
-
- 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!!",M_Nope, "Well..um..kinda..",M_Yep;
-
- M_Nope:
- 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 begining.";
- 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 5;
- next;
- menu "Would you??",sM_Yes, "(...she's nuts!...run!!!)",sM_No;
-
- 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;
-
- sM_No:
- mes "[Nurse Aid]";
- mes "Hey!...Where are you running too??...";
- emotion 4;
- close;
-
-L_GetAid:
- if((JobLevel < 3) || (CountItem(507) < 5 ) || (CountItem(705) < 5) || (CountItem(930) < 1)) goto sM_Yes;
- mes "Oh good. You have everything needed for me to teach you first aid. Here we go...";
- next;
- mes "....... 1 hour later.......";
- next;
- delitem 507,5;
- delitem 705,5;
- delitem 930,1;
- skill 142,1,0;
- set FIRSTAID,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 21;
- close;
-
-L_GotAid:
- mes "Well hello again. I sure hope the First Aid skill has been helpfull to you. Make sure to continue your hard work and don't forget to rest and heal!";
- close;
-
-}
-
-
-//<-------------------------------------------------------------------------------------------------- Bulma: Play Dead -------------------------------------------------------------------------------------------->\\
-prt_in.gat,73,87,2 script Bulma 98,
-{
- mes "[Bulma]";
- if(Class == Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Yeah... I look great.... Afterall, I'm a Knight of the Prontera Chivalry. Kuhahahaha!";
- emotion 18;
- 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 20;
- close;
-
-L_Novice:
- if(JobLevel >= 7) goto L_Start;
- mes "Hello my young friend. You remind me of myself when I was young.....";
- mes "Heh heh, I sure 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;
-
-L_Start:
- if(PLAYDEAD == 1) goto L_GetSkill;
- if(getskilllv(143)>0) goto L_GotSkill;
- mes "Hello my young friend. You remind me of myself when I was young..... Heh heh, I sure 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 recieve 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 20;
- 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 usefull.";
- 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 18;
- next;
- mes "[Bulma]";
- mes "Well get going... GO! GO! GO! RUN!!!";
- emotion 27;
- set PLAYDEAD, 1;
- close;
-
-L_GetSkill:
- if(countitem(7039)<1) goto sL_NotRdy;
- 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 undrestand 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 momement.";
- 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 TRULLY believe that you are dead.";
- mes "What a wonderful performance! BRAVO! BRAVO!";
- emotion 0;
- 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 21;
- skill 143,1,0;
- delitem 7039, 1;
- set PLAYDEAD, 0;
- close;
-
- sL_NotRdy:
- mes "HEY! What are you doing here? It's irresponsible of you to still be here while your time is running out.........";
- emotion 0;
- next;
- mes "[Bulma]";
- mes "Now GO! Run! Run! RUN!!";
- emotion 27;
- close;
-
-L_GotSkill:
- mes "Yeah.... I remember back then..... especially those embarrasing 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 best I can.";
- close;
-}
-
-
-//Newbie Assistant------------------------------------------------------------------------------
-prt_castle.gat,174,147,2 script Newbie Assistant 84,
-{
- mes "[Newbie Assistant]";
- if(Class == Job_Novice) goto L_Start;
-
-L_NonNov:
- 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 1;
- close;
-L_Start:
- if(FIRSTAID==1 && countitem(930)==0) goto L_Aid;
- if(PLAYDEAD==1 && countitem(7039)==0) goto L_Play;
- 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;
-L_Aid:
- 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;
- mes "[Newbie Assistant]";
- mes "You'll need it in order for her to teach you her exellent 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 3;
- close;
-L_Play:
- mes "So Bulma sent you uh.... okay here you go.";
- getitem 7039,1;
- next;
- mes "Good luck on your adventure.";
- close;
-}
+//===== eAthena Script =======================================
+//= Novice Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= Customized novice skills quest
+//===== Additional Comments: =================================
+//= Fully working
+//============================================================
+
+
+
+
+//<---------------------------------------------------------------------------------------------- Nurse Aid: First Aid NPC ---------------------------------------------------------------------------->\\
+prt_in.gat,235,133,4 script Nurse Aid 90,
+{
+ mes "[Nurse Aid]";
+ if(FIRSTAID == 1) goto L_GetAid;
+ if(getskilllv(142)>0) goto L_GotAid;
+
+ 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!!",M_Nope, "Well..um..kinda..",M_Yep;
+
+ M_Nope:
+ 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 begining.";
+ 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 5;
+ next;
+ menu "Would you??",sM_Yes, "(...she's nuts!...run!!!)",sM_No;
+
+ 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;
+
+ sM_No:
+ mes "[Nurse Aid]";
+ mes "Hey!...Where are you running too??...";
+ emotion 4;
+ close;
+
+L_GetAid:
+ if((JobLevel < 3) || (CountItem(507) < 5 ) || (CountItem(705) < 5) || (CountItem(930) < 1)) goto sM_Yes;
+ mes "Oh good. You have everything needed for me to teach you first aid. Here we go...";
+ next;
+ mes "....... 1 hour later.......";
+ next;
+ delitem 507,5;
+ delitem 705,5;
+ delitem 930,1;
+ skill 142,1,0;
+ set FIRSTAID,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 21;
+ close;
+
+L_GotAid:
+ mes "Well hello again. I sure hope the First Aid skill has been helpfull to you. Make sure to continue your hard work and don't forget to rest and heal!";
+ close;
+
+}
+
+
+//<-------------------------------------------------------------------------------------------------- Bulma: Play Dead -------------------------------------------------------------------------------------------->\\
+prt_in.gat,73,87,2 script Bulma 98,
+{
+ mes "[Bulma]";
+ if(Class == Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Yeah... I look great.... Afterall, I'm a Knight of the Prontera Chivalry. Kuhahahaha!";
+ emotion 18;
+ 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 20;
+ close;
+
+L_Novice:
+ if(JobLevel >= 7) goto L_Start;
+ mes "Hello my young friend. You remind me of myself when I was young.....";
+ mes "Heh heh, I sure 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;
+
+L_Start:
+ if(PLAYDEAD == 1) goto L_GetSkill;
+ if(getskilllv(143)>0) goto L_GotSkill;
+ mes "Hello my young friend. You remind me of myself when I was young..... Heh heh, I sure 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 recieve 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 20;
+ 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 usefull.";
+ 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 18;
+ next;
+ mes "[Bulma]";
+ mes "Well get going... GO! GO! GO! RUN!!!";
+ emotion 27;
+ set PLAYDEAD, 1;
+ close;
+
+L_GetSkill:
+ if(countitem(7039)<1) goto sL_NotRdy;
+ 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 undrestand 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 momement.";
+ 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 TRULLY believe that you are dead.";
+ mes "What a wonderful performance! BRAVO! BRAVO!";
+ emotion 0;
+ 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 21;
+ skill 143,1,0;
+ delitem 7039, 1;
+ set PLAYDEAD, 0;
+ close;
+
+ sL_NotRdy:
+ mes "HEY! What are you doing here? It's irresponsible of you to still be here while your time is running out.........";
+ emotion 0;
+ next;
+ mes "[Bulma]";
+ mes "Now GO! Run! Run! RUN!!";
+ emotion 27;
+ close;
+
+L_GotSkill:
+ mes "Yeah.... I remember back then..... especially those embarrasing 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 best I can.";
+ close;
+}
+
+
+//Newbie Assistant------------------------------------------------------------------------------
+prt_castle.gat,174,147,2 script Newbie Assistant 84,
+{
+ mes "[Newbie Assistant]";
+ if(Class == Job_Novice) goto L_Start;
+
+L_NonNov:
+ 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 1;
+ close;
+L_Start:
+ if(FIRSTAID==1 && countitem(930)==0) goto L_Aid;
+ if(PLAYDEAD==1 && countitem(7039)==0) goto L_Play;
+ 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;
+L_Aid:
+ 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;
+ mes "[Newbie Assistant]";
+ mes "You'll need it in order for her to teach you her exellent 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 3;
+ close;
+L_Play:
+ mes "So Bulma sent you uh.... okay here you go.";
+ getitem 7039,1;
+ next;
+ mes "Good luck on your adventure.";
+ close;
+}
diff --git a/npc/quests/skills/swordsman_skills.txt b/npc/quests/skills/swordsman_skills.txt
index 578f0a1c2..df3331525 100644
--- a/npc/quests/skills/swordsman_skills.txt
+++ b/npc/quests/skills/swordsman_skills.txt
@@ -1,371 +1,371 @@
-//===== eAthena Script =======================================
-//= Swordsman Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.0a
-//===== Compatible With: =====================================
-//= eAthena 7.15 +
-//===== Description: =========================================
-//= <Description>
-//===== Additional Comments: =================================
-//= Fully working
-//=1.0a Now using functions found in "Global_Functions.txt" for
-//= class checks.
-//============================================================
-
-
-
-//<-------------------------------------- Fatal Blow------------------------------------>\\
-prt_in.gat,75,88,5 script Leon 85,
-{
- mes "[Leon]";
- if(callfunc("Is_Sword_Class")) goto L_Start;
- if(Class == 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 18;
- 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 18;
- next;
- mes "[Leon]";
- if(sex==1)mes "I like a Swordsman who isn't afraid to use a powerfull 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 "Afterall, 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 someway to stun an opponent with it.";
- mes "I decided to withdraw from the battlefield and research ways of making bash more powerfull.";
- 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 parralyzed!!";
- next;
- mes "[Leon]";
- mes "I then went on to develop the skill, ^ff0000'Fatal Blow'^000000, which allows you to do just that!";
- mes "Will 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 33;
- close;
-
-L_Check:
- mes "So your 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;
-
- 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 21;
- next;
- delitem 1752,10;
- delitem 1751,10;
- delitem 532,1;
- delitem 962,30;
- delitem 526,5;
- 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 18;
- close;
-
-}
-
-
-//<---------------------------------- Moving HP Recovery ---------------------------------->\\
-izlude_in.gat,175,130,2 script Knight De Thomas 98,
-{
- mes "[Knight De Thomas]";
- if(callfunc("Is_Sword_Class")) 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 recieve such serious injuries....";
- emotion 19;
- next;
- mes "[Knight De Thomas]";
- mes "Being a Swordsman or Knight comes with a lot of responsiblity and requires a great deal of self sacrifice.";
- mes "For Swordsmen and Knights there is a wonderfull 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 feircely 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 recieved 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 28;
- next;
- mes "[Knight De Thomas]";
- mes "If you don't..... I won't teach you anything!! Muahahahaha!!";
- emotion 29;
- set MOVHPREC, 1;
- close;
- M_End:
- mes "[Knight De Thomas]";
- mes "What?? What did you say?.....";
- emotion 1;
- 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 (Class==Job_Swordman && JobLevel < 35) goto L_LowLvl;
-
- 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!";
- delitem 713,200;
- delitem 1058,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 21;
- 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 helpfull.";
- mes "Well, continued success on your adventure!";
- close;
-
-}
-
-
-//<----------------------------------------- Auto-Berserk --------------------------------->\\
-prt_in.gat,94,57,3 script Juan 85,
-{
- mes "[Juan]";
- if(callfunc("Is_Sword_Class")) 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 18;
- close;
-
-L_Start:
- if (Class==Job_Swordman && JobLevel<34) 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 a greater attack prowess at the cost of defensive strength.";
- mes "With this you will be able to fight on with a FIREY 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 32;
- 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 33;
- close;
-
-L_Check:
- if ((countitem(924)<35) && (countitem(957)<10) && (countitem(958)<10) && (countitem(518)<10)) goto L_NoItems;
- 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.";
- next;
- delitem 924,35;
- delitem 958,10;
- delitem 957,10;
- delitem 518,10;
- skill 146,1,0;
- set BERSERK, 0;
- mes "[Juan]";
- mes "Muhahahaha!! Don't hold back young warrior, fight without any fears or regrets!!";
- emotion 29;
- 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 0;
- close;
-}
+//===== eAthena Script =======================================
+//= Swordsman Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.0a
+//===== Compatible With: =====================================
+//= eAthena 7.15 +
+//===== Description: =========================================
+//= <Description>
+//===== Additional Comments: =================================
+//= Fully working
+//=1.0a Now using functions found in "Global_Functions.txt" for
+//= class checks.
+//============================================================
+
+
+
+//<-------------------------------------- Fatal Blow------------------------------------>\\
+prt_in.gat,75,88,5 script Leon 85,
+{
+ mes "[Leon]";
+ if(callfunc("Is_Sword_Class")) goto L_Start;
+ if(Class == 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 18;
+ 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 18;
+ next;
+ mes "[Leon]";
+ if(sex==1)mes "I like a Swordsman who isn't afraid to use a powerfull 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 "Afterall, 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 someway to stun an opponent with it.";
+ mes "I decided to withdraw from the battlefield and research ways of making bash more powerfull.";
+ 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 parralyzed!!";
+ next;
+ mes "[Leon]";
+ mes "I then went on to develop the skill, ^ff0000'Fatal Blow'^000000, which allows you to do just that!";
+ mes "Will 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 33;
+ close;
+
+L_Check:
+ mes "So your 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;
+
+ 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 21;
+ next;
+ delitem 1752,10;
+ delitem 1751,10;
+ delitem 532,1;
+ delitem 962,30;
+ delitem 526,5;
+ 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 18;
+ close;
+
+}
+
+
+//<---------------------------------- Moving HP Recovery ---------------------------------->\\
+izlude_in.gat,175,130,2 script Knight De Thomas 98,
+{
+ mes "[Knight De Thomas]";
+ if(callfunc("Is_Sword_Class")) 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 recieve such serious injuries....";
+ emotion 19;
+ next;
+ mes "[Knight De Thomas]";
+ mes "Being a Swordsman or Knight comes with a lot of responsiblity and requires a great deal of self sacrifice.";
+ mes "For Swordsmen and Knights there is a wonderfull 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 feircely 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 recieved 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 28;
+ next;
+ mes "[Knight De Thomas]";
+ mes "If you don't..... I won't teach you anything!! Muahahahaha!!";
+ emotion 29;
+ set MOVHPREC, 1;
+ close;
+ M_End:
+ mes "[Knight De Thomas]";
+ mes "What?? What did you say?.....";
+ emotion 1;
+ 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 (Class==Job_Swordman && JobLevel < 35) goto L_LowLvl;
+
+ 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!";
+ delitem 713,200;
+ delitem 1058,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 21;
+ 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 helpfull.";
+ mes "Well, continued success on your adventure!";
+ close;
+
+}
+
+
+//<----------------------------------------- Auto-Berserk --------------------------------->\\
+prt_in.gat,94,57,3 script Juan 85,
+{
+ mes "[Juan]";
+ if(callfunc("Is_Sword_Class")) 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 18;
+ close;
+
+L_Start:
+ if (Class==Job_Swordman && JobLevel<34) 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 a greater attack prowess at the cost of defensive strength.";
+ mes "With this you will be able to fight on with a FIREY 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 32;
+ 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 33;
+ close;
+
+L_Check:
+ if ((countitem(924)<35) && (countitem(957)<10) && (countitem(958)<10) && (countitem(518)<10)) goto L_NoItems;
+ 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.";
+ next;
+ delitem 924,35;
+ delitem 958,10;
+ delitem 957,10;
+ delitem 518,10;
+ skill 146,1,0;
+ set BERSERK, 0;
+ mes "[Juan]";
+ mes "Muhahahaha!! Don't hold back young warrior, fight without any fears or regrets!!";
+ emotion 29;
+ 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 0;
+ close;
+}
diff --git a/npc/quests/skills/thief_skills.txt b/npc/quests/skills/thief_skills.txt
index 1258e1bfb..039be7621 100644
--- a/npc/quests/skills/thief_skills.txt
+++ b/npc/quests/skills/thief_skills.txt
@@ -1,386 +1,386 @@
-//===== eAthena Script =======================================
-//= Thief Skills Quests
-//===== By: ==================================================
-//= kobra_k88
-//===== Current Version: =====================================
-//= 1.1a
-//===== 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 requirments
-//= 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]
-//============================================================
-
-
-
-
-//======================================================================================================
-moc_prydb1.gat,154,128,4 script Alcouskou 118,
-{
- mes "[Alcouskou]";
- if(callfunc("Is_Thief_Class")) goto L_Start;
- if(Class==Job_Novice) goto L_Novice;
-
-L_Other:
- mes "Your kind isn't welcome here.";
- close;
-
-L_Novice:
- mes "Although thieves and assasins 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 hastey with your judgement of them, for some of these experience may actually prove to be benificial 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 == 1) 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 our 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 impares 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(Class == 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 == 1)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 down side 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 Thiefs/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 situatuions.";
- 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(Class == 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 == 1) 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 wan't 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 neccessary to learn Find Stone.";
- set FINDSTONE, 1;
- goto M_Menu;
- M_Fling:
- mes "[Alcouskou]";
- if (STONEFLING == 1) 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 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 "These guild members call this skill ^5555FFStone Fling^000000. It is extrememly 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 (Class==Job_Thief && JobLevel<25) goto L_LowLvl1;
- mes "Alright, you've got all the items. Now its 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 secrect behind this skill......... SAND!!";
- next;
- mes "[Alcouskou]";
- mes "Okay, grab a handfull....... yep, that much will do....... now.........";
- next;
- mes "[Alcouskou]";
- mes "THROW IT AT ME!!!";
- emotion 27;
- next;
- mes "[Alcouskou]";
- mes "(AHHH!! My EYES!!! Son of a)......... ya see how effective that was........ (JEEZE that STINGS!!).......";
- emotion 23;
- 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 gota finda better way to teach this).........";
- emotion 4;
- delitem 7041, 5;
- delitem 7042, 1;
- skill 149,1,0;
- set SANDATTACK, 0;
- set BAGNFNTY, 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 your back... hopefully not to throw anymore sand in my eyes, heh heh.... heh........ heh..............";
- emotion 4;
- close;
-
-L_Back:
- if (countitem(940)<20) goto L_NotRdy2;
- if (Class==Thief && JobLevel<35) goto L_LowLvl2;
- 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.";
- delitem 940,20;
- 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 outa here.....";
- close;
-
-L_Find:
- if (countitem(912)<1 || countitem(948)<1 || countitem(908)<5) goto L_NotRdy3;
- 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 21;
- delitem 912,1;
- delitem 948,1;
- delitem 908,5;
- 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;
- mes "Good! You look like your 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 hurrling yourself towards it! DO IT NOW!!";
- emotion 27;
- next;
- mes "!!Whooooossshh!!................. !!Thwack!!";
- next;
- mes "[Alcouskou]";
- mes "Haha! Excellent! It's a bullseye. You have now masterd Stone Fling, congratulations.";
- emotion 21;
- delitem 910,2;
- delitem 911,2;
- 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 Zargon^000000, and the ability to use ^5555FFFind Stone^000000 to learn Stone Fling.";
- close;
- L_GotFling:
- mes "So Stone Fling is comming in handy huh? Just make sure you don't hit the wrong moster.";
- close;
-}
-
-
-//====================================================================================
-payon.gat,149,120,4 script RuRumuni 99,
-{
- mes "[RuRumuni]";
- if(SANDATTACK == 1 && BAGNFNTY != 2) 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 Inifinity'^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;
- 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;
- delitem 904, 5;
- delitem 1025, 1;
- delitem 952, 1;
- delitem 1055, 1;
- set BAGNFNTY, 2;
- close;
-}
+//===== eAthena Script =======================================
+//= Thief Skills Quests
+//===== By: ==================================================
+//= kobra_k88
+//===== Current Version: =====================================
+//= 1.1a
+//===== 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 requirments
+//= 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]
+//============================================================
+
+
+
+
+//======================================================================================================
+moc_prydb1.gat,154,128,4 script Alcouskou 118,
+{
+ mes "[Alcouskou]";
+ if(callfunc("Is_Thief_Class")) goto L_Start;
+ if(Class==Job_Novice) goto L_Novice;
+
+L_Other:
+ mes "Your kind isn't welcome here.";
+ close;
+
+L_Novice:
+ mes "Although thieves and assasins 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 hastey with your judgement of them, for some of these experience may actually prove to be benificial 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 == 1) 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 our 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 impares 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(Class == 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 == 1)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 down side 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 Thiefs/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 situatuions.";
+ 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(Class == 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 == 1) 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 wan't 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 neccessary to learn Find Stone.";
+ set FINDSTONE, 1;
+ goto M_Menu;
+ M_Fling:
+ mes "[Alcouskou]";
+ if (STONEFLING == 1) 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 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 "These guild members call this skill ^5555FFStone Fling^000000. It is extrememly 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 (Class==Job_Thief && JobLevel<25) goto L_LowLvl1;
+ mes "Alright, you've got all the items. Now its 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 secrect behind this skill......... SAND!!";
+ next;
+ mes "[Alcouskou]";
+ mes "Okay, grab a handfull....... yep, that much will do....... now.........";
+ next;
+ mes "[Alcouskou]";
+ mes "THROW IT AT ME!!!";
+ emotion 27;
+ next;
+ mes "[Alcouskou]";
+ mes "(AHHH!! My EYES!!! Son of a)......... ya see how effective that was........ (JEEZE that STINGS!!).......";
+ emotion 23;
+ 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 gota finda better way to teach this).........";
+ emotion 4;
+ delitem 7041, 5;
+ delitem 7042, 1;
+ skill 149,1,0;
+ set SANDATTACK, 0;
+ set BAGNFNTY, 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 your back... hopefully not to throw anymore sand in my eyes, heh heh.... heh........ heh..............";
+ emotion 4;
+ close;
+
+L_Back:
+ if (countitem(940)<20) goto L_NotRdy2;
+ if (Class==Thief && JobLevel<35) goto L_LowLvl2;
+ 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.";
+ delitem 940,20;
+ 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 outa here.....";
+ close;
+
+L_Find:
+ if (countitem(912)<1 || countitem(948)<1 || countitem(908)<5) goto L_NotRdy3;
+ 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 21;
+ delitem 912,1;
+ delitem 948,1;
+ delitem 908,5;
+ 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;
+ mes "Good! You look like your 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 hurrling yourself towards it! DO IT NOW!!";
+ emotion 27;
+ next;
+ mes "!!Whooooossshh!!................. !!Thwack!!";
+ next;
+ mes "[Alcouskou]";
+ mes "Haha! Excellent! It's a bullseye. You have now masterd Stone Fling, congratulations.";
+ emotion 21;
+ delitem 910,2;
+ delitem 911,2;
+ 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 Zargon^000000, and the ability to use ^5555FFFind Stone^000000 to learn Stone Fling.";
+ close;
+ L_GotFling:
+ mes "So Stone Fling is comming in handy huh? Just make sure you don't hit the wrong moster.";
+ close;
+}
+
+
+//====================================================================================
+payon.gat,149,120,4 script RuRumuni 99,
+{
+ mes "[RuRumuni]";
+ if(SANDATTACK == 1 && BAGNFNTY != 2) 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 Inifinity'^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;
+ 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;
+ delitem 904, 5;
+ delitem 1025, 1;
+ delitem 952, 1;
+ delitem 1055, 1;
+ set BAGNFNTY, 2;
+ close;
+}
diff --git a/npc/sample/PCLoginEvent.txt b/npc/sample/PCLoginEvent.txt
index 66b99e86d..d668c0960 100644
--- a/npc/sample/PCLoginEvent.txt
+++ b/npc/sample/PCLoginEvent.txt
@@ -1,33 +1,33 @@
-// 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 PCLoginEvent -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
-
-
-prontera.gat,0,0,0 script PCLoginEvent -1,{
- end;
+// 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 PCLoginEvent -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
+
+
+prontera.gat,0,0,0 script PCLoginEvent -1,{
+ end;
} \ No newline at end of file
diff --git a/npc/sample/bank_test.txt b/npc/sample/bank_test.txt
index 511790926..6a9bfe08d 100644
--- a/npc/sample/bank_test.txt
+++ b/npc/sample/bank_test.txt
@@ -1,59 +1,59 @@
-// ƒJƒvƒ‰‹âsƒT[ƒrƒX ƒeƒXƒgƒXƒNƒŠƒvƒg
-prontera.gat,162,188,1 script ‹âsˆõƒJƒvƒ‰ 112,{
- cutin "kafra_06",2;
-
- mes"[‹âsˆõƒJƒvƒ‰]";
- mes "ƒJƒvƒ‰‹âsƒT[ƒrƒX‚Å‚·B";
- mes "–ˆ“x‚²—˜—p‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·ô";
- mes "1000z‚©‚ç‚Å‚Ì‚²—˜—p‚É‚È‚è‚Ü‚·B";
- next;
- menu "—a‚¯‚é",BANK_IN,"ˆø‚«o‚·",BANK_OUT,"‚â‚Á‚Ï‚â‚ß‚é",B_EXIT2;
-BANK_IN:
- mes"[‹âsˆõƒJƒvƒ‰]";
- mes "—a‚¯‚é‹àŠz‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ô";
- mes "‚¿‚È‚Ý‚ÉAŽè”—¿‚Æ‚µ‚Ä";
- mes "—a‚©‚è‹à‚Ì1%’¸‚«‚Ü‚·B";
- 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 "Žè”—¿^135445" + @kafrabank2 + "z^000000’¸‚«‚Ü‚·‚ËB";
-
- goto B_EXIT;
-BANK_OUT:
- if(#kafrabank==0) goto BANK_F2;
- mes"[‹âsˆõƒJƒvƒ‰]";
- mes "Œ»Ý‚ ‚È‚½‚©‚炨—a‚©‚肵‚Ä‚¢‚é‚Ì‚Í";
- mes "^135445" + #kafrabank + "^000000Zeny‚Å‚·B";
- mes "ˆø‚«o‚·‹àŠz‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ô";
- 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"[‹âsˆõƒJƒvƒ‰]";
- mes "Ž‚¿‹à‚ª‘«‚è‚È‚¢‚悤‚Å‚·‚ËB";
- goto B_EXIT2;
-BANK_F2:
- mes"[‹âsˆõƒJƒvƒ‰]";
- mes "‚ ‚È‚½‚©‚ç‚ÍA1z‚à";
- mes "‚¨—a‚©‚肵‚Ä‚¢‚È‚¢‚Å‚·‚æH";
- goto B_EXIT2;
-
-B_EXIT:
- mes "–³Ž–‚ÉŽæ‚èˆø‚«‚Å‚«‚Ü‚µ‚½B";
-B_EXIT2:
- mes "‚Ü‚½‚Ì‚²—˜—p‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·ô";
- cutin "kafra_06",255;
- close;
-}
+// ƒJƒvƒ‰‹âsƒT[ƒrƒX ƒeƒXƒgƒXƒNƒŠƒvƒg
+prontera.gat,162,188,1 script ‹âsˆõƒJƒvƒ‰ 112,{
+ cutin "kafra_06",2;
+
+ mes"[‹âsˆõƒJƒvƒ‰]";
+ mes "ƒJƒvƒ‰‹âsƒT[ƒrƒX‚Å‚·B";
+ mes "–ˆ“x‚²—˜—p‚ ‚肪‚Æ‚¤‚²‚´‚¢‚Ü‚·ô";
+ mes "1000z‚©‚ç‚Å‚Ì‚²—˜—p‚É‚È‚è‚Ü‚·B";
+ next;
+ menu "—a‚¯‚é",BANK_IN,"ˆø‚«o‚·",BANK_OUT,"‚â‚Á‚Ï‚â‚ß‚é",B_EXIT2;
+BANK_IN:
+ mes"[‹âsˆõƒJƒvƒ‰]";
+ mes "—a‚¯‚é‹àŠz‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ô";
+ mes "‚¿‚È‚Ý‚ÉAŽè”—¿‚Æ‚µ‚Ä";
+ mes "—a‚©‚è‹à‚Ì1%’¸‚«‚Ü‚·B";
+ 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 "Žè”—¿^135445" + @kafrabank2 + "z^000000’¸‚«‚Ü‚·‚ËB";
+
+ goto B_EXIT;
+BANK_OUT:
+ if(#kafrabank==0) goto BANK_F2;
+ mes"[‹âsˆõƒJƒvƒ‰]";
+ mes "Œ»Ý‚ ‚È‚½‚©‚炨—a‚©‚肵‚Ä‚¢‚é‚Ì‚Í";
+ mes "^135445" + #kafrabank + "^000000Zeny‚Å‚·B";
+ mes "ˆø‚«o‚·‹àŠz‚ð“ü—Í‚µ‚Ä‚­‚¾‚³‚¢ô";
+ 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"[‹âsˆõƒJƒvƒ‰]";
+ mes "Ž‚¿‹à‚ª‘«‚è‚È‚¢‚悤‚Å‚·‚ËB";
+ goto B_EXIT2;
+BANK_F2:
+ mes"[‹âsˆõƒJƒvƒ‰]";
+ mes "‚ ‚È‚½‚©‚ç‚ÍA1z‚à";
+ mes "‚¨—a‚©‚肵‚Ä‚¢‚È‚¢‚Å‚·‚æH";
+ goto B_EXIT2;
+
+B_EXIT:
+ mes "–³Ž–‚ÉŽæ‚èˆø‚«‚Å‚«‚Ü‚µ‚½B";
+B_EXIT2:
+ mes "‚Ü‚½‚Ì‚²—˜—p‚ð‚¨‘Ò‚¿‚µ‚Ä‚¢‚Ü‚·ô";
+ cutin "kafra_06",255;
+ close;
+}
diff --git a/npc/sample/gstorage_test.txt b/npc/sample/gstorage_test.txt
index aa6749ec0..6a8816e43 100644
--- a/npc/sample/gstorage_test.txt
+++ b/npc/sample/gstorage_test.txt
@@ -1,33 +1,33 @@
-// ƒ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;
-}
+// ƒ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_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 242c900c0..3f9f71c2d 100644
--- a/npc/sample/npc_extend_shop.txt
+++ b/npc/sample/npc_extend_shop.txt
@@ -1,68 +1,68 @@
-//ƒŒƒAƒAƒCƒeƒ€‚m‚o‚bƒVƒ‡ƒbƒv
-
-
-
-// ƒAƒCƒeƒ€Œn
-prontera.gat,163,170,3 shop ‚‹‰‚ȃAƒCƒeƒ€‰® 75,507:-1,508:-1,509:-1,510:-1,514:-1,518:-1,533:-1,607:-1,608:-1,529:-1,530:-1,603:-1,604:-1,616:-1,617:-1,644:-1,724:-1,718:-1,714:-1,756:-1,757:-1,984:-1,985:-1,1002:-1,998:-1,999:-1,1003:-1,989:-1,713:-1,970:-1,971:-1,972:-1,7026:-1,7027:-1701:-1,968:-1,1029:-1,1030:-1,7034:-1,7035:-1,7036:-1,7047:-1
-
-
-
-// ‘•”õ@•ÐŽèŒ•
-prontera.gat,149,170,3 shop ‹†‹É‚̕Ў茕‰® 76,1108:-1,1111:-1,1114:-1,1120:-1,1125:-1,1127:-1,1128:-1,1130:-1,1131:-1,1132:-1,1133:-1,1134:-1,1135:-1,1136:-1,1137:-1,1138:-1,1139:-1,1140:-1,1141:-1,1144:-1,1145:-1
-// ‘•”õ@—¼ŽèŒ•
-prontera.gat,149,167,3 shop ‹†‹É‚Ì—¼ŽèŒ•‰® 76,1117:-1,1152:-1,1155:-1,1158:-1,1161:-1,1162:-1,1164:-1,1165:-1,1166:-1,1167:-1,1168:-1,1170:-1
-// ‘•”õ@’ZŒ•
-prontera.gat,149,164,3 shop ‹†‹É‚Ì’ZŒ•‰® 76,1202:-1,1205:-1,1208:-1,1211:-1,1214:-1,1220:-1,1223:-1,1226:-1,1227:-1,1228:-1,1229:-1,1231:-1,1232:-1,1233:-1,1234:-1,1236:-1,1237:-1,1239:-1
-// ‘•”õ@ƒJƒ^[ƒ‹
-prontera.gat,149,161,3 shop ‹†‹É‚̃Jƒ^[ƒ‹‰® 76,1251:-1,1253:-1,1255:-1,1256:-1,1257:-1,1258:-1,1259:-1,1260:-1,1261:-1
-// ‘•”õ@•€
-prontera.gat,149,158,3 shop ‹†‹É‚Ì•€‰® 76,1302:-1,1305:-1,1306:-1,1352:-1,1361:-1,1363:-1,1364:-1,1366:-1,1367:-1,1368:-1
-// ‘•”õ@‘„
-prontera.gat,149,155,3 shop ‹†‹É‚Ì‘„‰® 76,1402:-1,1405:-1,1408:-1,1413:-1,1414:-1,1415:-1,1417:-1,1455:-1,1461:-1,1464:-1,1466:-1,1467:-1,1468:-1,1469:-1,1470:-1,1471:-1
-// ‘•”õ@“ÝŠí
-prontera.gat,149,152,3 shop ‹†‹É‚̓݊퉮 76,1502:-1,1505:-1,1508:-1,1511:-1,1514:-1,1517:-1,1520:-1,1523:-1,1524:-1,1525:-1,1526:-1,1527:-1,1528:-1,1529:-1,1530:-1
-// ‘•”õ@–{
-prontera.gat,149,149,3 shop ‹†‹É‚Ì–{‰® 76,1550:-1,1551:-1,1552:-1,1553:-1,1554:-1,1555:-1,1556:-1,1557:-1,1558:-1
-// ‘•”õ@ñ
-prontera.gat,149,146,3 shop ‹†‹É‚Ìñ‰® 76,1602:-1,1605:-1,1608:-1,1611:-1,1613:-1,1614:-1,1615:-1,1472:-1,1473:-1
-// ‘•”õ@‹|
-prontera.gat,149,143,3 shop ‹†‹É‚Ì‹|‰® 76,1705:-1,1708:-1,1711:-1,1715:-1,1716:-1,1719:-1,1720:-1
-
-
-
-// ‘•”õ@“ª•”i‚r•t‚«j
-prontera.gat,162,167,5 shop ŽŠ‚‚Ì‚rŠ•‰® 77,2202:-1,2204:-1,2209:-1,2217:-1,2221:-1,2223:-1,2225:-1,2227:-1,2229:-1,2231:-1,2233:-1
-// ‘•”õ@“ª•”i‚r–³‚µ‚»‚Ì‚Pj
-prontera.gat,162,164,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚P 77,2207:-1,2210:-1,2213:-1,2214:-1,2215:-1,2230:-1,2234:-1,2235:-1,2236:-1,2244:-1,2245:-1,2246:-1,2247:-1,2248:-1,2249:-1,2250:-1,2251:-1,2252:-1,2253:-1,2254:-1,2255:-1,2256:-1,2257:-1,2258:-1,2259:-1,2260:-1,2261:-1,2262:-1,2263:-1,2264:-1,2271:-1,2272:-1,2273:-1,2274:-1,2275:-1,2277:-1,2279:-1,2280:-1,2282:-1,2283:-1,2284:-1,2285:-1,2287:-1,2289:-1,2290:-1,2293:-1,2294:-1,2298:-1,2299:-1
-// ‘•”õ@“ª•”i‚r–³‚µ‚»‚Ì‚Qj
-prontera.gat,162,161,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚Q 77,5001:-1,5002:-1,5003:-1,5006:-1,5007:-1,5008:-1,5009:-1,5010:-1,5011:-1,5012:-1,5013:-1,5014:-1,5015:-1,5016:-1,5017:-1,5018:-1,5019:-1,5020:-1,5021:-1,5022:-1,5023:-1,5024:-1,5025:-1,5026:-1,5027:-1,5028:-1,5029:-1,5030:-1,5031:-1,5032:-1,5033:-1,5034:-1,5035:-1,5036:-1,5037:-1,5038:-1,5039:-1,5040:-1,5041:-1,5042:-1,5043:-1,5045:-1,5046:-1,5047:-1,5048:-1,5049:-1,5050:-1,5052:-1,5053:-1
-// ‘•”õ@“ª•”i’†’i•‰º’ij
-prontera.gat,162,158,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚R 77,2276:-1,2281:-1,2286:-1,2288:-1,2291:-1,2292:-1,2295:-1,2296:-1,2297:-1,5004:-1,5005:-1,5054:-1,2265:-1,2266:-1,2267:-1,2268:-1,2269:-1,2270:-1,5051:-1
-// ‘•”õ@ŠZ
-prontera.gat,162,155,5 shop ŽŠ‚‚ÌŠZ‰® 77,2311:-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
-// ‘•”õ@‚
-prontera.gat,162,152,5 shop ŽŠ‚‚Ì‚‰® 77,2102:-1,2104:-1,2106:-1,2108:-1,2109:-1
-// ‘•”õ@ŒC
-prontera.gat,162,149,5 shop ŽŠ‚‚ÌŒC‰® 77,2402:-1,2404:-1,2406:-1,2407:-1,2410:-1,2412:-1
-// ‘•”õ@ŠO“…
-prontera.gat,162,146,5 shop ŽŠ‚‚ÌŠO“…‰® 77,2502:-1,2504:-1,2506:-1,2507:-1,2508:-1,2509:-1
-// ‘•”õ@ƒAƒNƒZƒTƒŠ
-prontera.gat,162,143,5 shop ŽŠ‚‚̃AƒNƒZƒTƒŠ‰® 77,2601:-1,2602:-1,2603:-1,2604:-1,2605:-1,2607:-1,2610:-1,2615:-1,2616:-1,2617:-1,2618:-1,2619:-1,2620:-1,2621:-1,2622:-1,2623:-1,2624:-1,2625:-1,2626:-1,2629:-1,2631:-1
-
-
-
-// •Ší‚ÉŽh‚·ƒJ[ƒh
-prontera.gat,162,235,5 shop Å‹­‚Ì•ŠíƒJ[ƒh‰® 80,4002:-1,4004:-1,4006:-1,4018:-1,4025:-1,4026:-1,4019:-1,4029:-1,4043:-1,4017:-1,4020:-1,4024:-1,4037:-1,4055:-1,4057:-1,4076:-1,4096:-1,4104:-1,4005:-1,4030:-1,4049:-1,4062:-1,4065:-1,4069:-1,4085:-1,4130:-1,4007:-1,4035:-1,4060:-1,4063:-1,4068:-1,4080:-1,4094:-1,4111:-1,4118:-1,4140:-1,4082:-1,4092:-1,4126:-1,4072:-1,4086:-1,4106:-1,4115:-1,4117:-1,4121:-1,4125:-1,4134:-1,4137:-1,4142:-1,4147:-1
-// “ª‚É‘}‚·ƒJ[ƒh
-prontera.gat,149,235,3 shop Å‹­‚Ì“ªƒJ[ƒh‰® 80,4010:-1,4039:-1,4041:-1,4046:-1,4052:-1,4087:-1,4110:-1,4112:-1,4122:-1,4127:-1,4132:-1,4143:-1,4148:-1
-// ŠZ‚É‘}‚·ƒJ[ƒh
-prontera.gat,162,238,5 shop Å‹­‚ÌŠZƒJ[ƒh‰® 80,4001:-1,4003:-1,4008:-1,4011:-1,4014:-1,4016:-1,4021:-1,4023:-1,4031:-1,4078:-1,4047:-1,4054:-1,4089:-1,4098:-1,4099:-1,4101:-1,4114:-1,4119:-1,4141:-1,4042:-1,4061:-1,4105:-1,4135:-1
-// ‚‚É‘}‚·ƒJ[ƒh
-prontera.gat,149,238,3 shop Å‹­‚Ì‚ƒJ[ƒh‰® 80,4012:-1,4013:-1,4032:-1,4058:-1,4059:-1,4066:-1,4074:-1,4083:-1,4120:-1,4124:-1,4136:-1,4138:-1,4045:-1,4067:-1,4075:-1,4090:-1,4128:-1,4146:-1
-// Œ¨‚É‚©‚¯‚é‚à‚Ì‚É‘}‚·ƒJ[ƒh
-prontera.gat,162,241,5 shop Å‹­‚ÌŠO“…ƒJ[ƒh‰® 80,4056:-1,4071:-1,4081:-1,4095:-1,4108:-1,4109:-1,4113:-1,4116:-1,4133:-1,4015:-1,4088:-1,4102:-1,4129:-1
-// ŒC‚É‘}‚·ƒJ[ƒh
-prontera.gat,149,241,3 shop Å‹­‚ÌŒCƒJ[ƒh‰® 80,4009:-1,4038:-1,4050:-1,4070:-1,4097:-1,4100:-1,4107:-1,4123:-1,4131:-1
-// ƒAƒNƒZƒTƒŠ[‚É‘}‚·ƒJ[ƒh
-prontera.gat,162,244,5 shop Å‹­‚̃AƒNƒZƒTƒŠƒJ[ƒh‰® 80,4022:-1,4027:-1,4028:-1,4034:-1,4051:-1,4064:-1,4091:-1,4079:-1,4033:-1,4040:-1,4044:-1,4048:-1,4053:-1,4073:-1,4084:-1,4093:-1,4103:-1,4139:-1,4036:-1,4077:-1,4144:-1,4145:-1
-
+//ƒŒƒAƒAƒCƒeƒ€‚m‚o‚bƒVƒ‡ƒbƒv
+
+
+
+// ƒAƒCƒeƒ€Œn
+prontera.gat,163,170,3 shop ‚‹‰‚ȃAƒCƒeƒ€‰® 75,507:-1,508:-1,509:-1,510:-1,514:-1,518:-1,533:-1,607:-1,608:-1,529:-1,530:-1,603:-1,604:-1,616:-1,617:-1,644:-1,724:-1,718:-1,714:-1,756:-1,757:-1,984:-1,985:-1,1002:-1,998:-1,999:-1,1003:-1,989:-1,713:-1,970:-1,971:-1,972:-1,7026:-1,7027:-1701:-1,968:-1,1029:-1,1030:-1,7034:-1,7035:-1,7036:-1,7047:-1
+
+
+
+// ‘•”õ@•ÐŽèŒ•
+prontera.gat,149,170,3 shop ‹†‹É‚̕Ў茕‰® 76,1108:-1,1111:-1,1114:-1,1120:-1,1125:-1,1127:-1,1128:-1,1130:-1,1131:-1,1132:-1,1133:-1,1134:-1,1135:-1,1136:-1,1137:-1,1138:-1,1139:-1,1140:-1,1141:-1,1144:-1,1145:-1
+// ‘•”õ@—¼ŽèŒ•
+prontera.gat,149,167,3 shop ‹†‹É‚Ì—¼ŽèŒ•‰® 76,1117:-1,1152:-1,1155:-1,1158:-1,1161:-1,1162:-1,1164:-1,1165:-1,1166:-1,1167:-1,1168:-1,1170:-1
+// ‘•”õ@’ZŒ•
+prontera.gat,149,164,3 shop ‹†‹É‚Ì’ZŒ•‰® 76,1202:-1,1205:-1,1208:-1,1211:-1,1214:-1,1220:-1,1223:-1,1226:-1,1227:-1,1228:-1,1229:-1,1231:-1,1232:-1,1233:-1,1234:-1,1236:-1,1237:-1,1239:-1
+// ‘•”õ@ƒJƒ^[ƒ‹
+prontera.gat,149,161,3 shop ‹†‹É‚̃Jƒ^[ƒ‹‰® 76,1251:-1,1253:-1,1255:-1,1256:-1,1257:-1,1258:-1,1259:-1,1260:-1,1261:-1
+// ‘•”õ@•€
+prontera.gat,149,158,3 shop ‹†‹É‚Ì•€‰® 76,1302:-1,1305:-1,1306:-1,1352:-1,1361:-1,1363:-1,1364:-1,1366:-1,1367:-1,1368:-1
+// ‘•”õ@‘„
+prontera.gat,149,155,3 shop ‹†‹É‚Ì‘„‰® 76,1402:-1,1405:-1,1408:-1,1413:-1,1414:-1,1415:-1,1417:-1,1455:-1,1461:-1,1464:-1,1466:-1,1467:-1,1468:-1,1469:-1,1470:-1,1471:-1
+// ‘•”õ@“ÝŠí
+prontera.gat,149,152,3 shop ‹†‹É‚̓݊퉮 76,1502:-1,1505:-1,1508:-1,1511:-1,1514:-1,1517:-1,1520:-1,1523:-1,1524:-1,1525:-1,1526:-1,1527:-1,1528:-1,1529:-1,1530:-1
+// ‘•”õ@–{
+prontera.gat,149,149,3 shop ‹†‹É‚Ì–{‰® 76,1550:-1,1551:-1,1552:-1,1553:-1,1554:-1,1555:-1,1556:-1,1557:-1,1558:-1
+// ‘•”õ@ñ
+prontera.gat,149,146,3 shop ‹†‹É‚Ìñ‰® 76,1602:-1,1605:-1,1608:-1,1611:-1,1613:-1,1614:-1,1615:-1,1472:-1,1473:-1
+// ‘•”õ@‹|
+prontera.gat,149,143,3 shop ‹†‹É‚Ì‹|‰® 76,1705:-1,1708:-1,1711:-1,1715:-1,1716:-1,1719:-1,1720:-1
+
+
+
+// ‘•”õ@“ª•”i‚r•t‚«j
+prontera.gat,162,167,5 shop ŽŠ‚‚Ì‚rŠ•‰® 77,2202:-1,2204:-1,2209:-1,2217:-1,2221:-1,2223:-1,2225:-1,2227:-1,2229:-1,2231:-1,2233:-1
+// ‘•”õ@“ª•”i‚r–³‚µ‚»‚Ì‚Pj
+prontera.gat,162,164,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚P 77,2207:-1,2210:-1,2213:-1,2214:-1,2215:-1,2230:-1,2234:-1,2235:-1,2236:-1,2244:-1,2245:-1,2246:-1,2247:-1,2248:-1,2249:-1,2250:-1,2251:-1,2252:-1,2253:-1,2254:-1,2255:-1,2256:-1,2257:-1,2258:-1,2259:-1,2260:-1,2261:-1,2262:-1,2263:-1,2264:-1,2271:-1,2272:-1,2273:-1,2274:-1,2275:-1,2277:-1,2279:-1,2280:-1,2282:-1,2283:-1,2284:-1,2285:-1,2287:-1,2289:-1,2290:-1,2293:-1,2294:-1,2298:-1,2299:-1
+// ‘•”õ@“ª•”i‚r–³‚µ‚»‚Ì‚Qj
+prontera.gat,162,161,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚Q 77,5001:-1,5002:-1,5003:-1,5006:-1,5007:-1,5008:-1,5009:-1,5010:-1,5011:-1,5012:-1,5013:-1,5014:-1,5015:-1,5016:-1,5017:-1,5018:-1,5019:-1,5020:-1,5021:-1,5022:-1,5023:-1,5024:-1,5025:-1,5026:-1,5027:-1,5028:-1,5029:-1,5030:-1,5031:-1,5032:-1,5033:-1,5034:-1,5035:-1,5036:-1,5037:-1,5038:-1,5039:-1,5040:-1,5041:-1,5042:-1,5043:-1,5045:-1,5046:-1,5047:-1,5048:-1,5049:-1,5050:-1,5052:-1,5053:-1
+// ‘•”õ@“ª•”i’†’i•‰º’ij
+prontera.gat,162,158,5 shop ŽŠ‚‚Ì•Ï‘••i‰®‚R 77,2276:-1,2281:-1,2286:-1,2288:-1,2291:-1,2292:-1,2295:-1,2296:-1,2297:-1,5004:-1,5005:-1,5054:-1,2265:-1,2266:-1,2267:-1,2268:-1,2269:-1,2270:-1,5051:-1
+// ‘•”õ@ŠZ
+prontera.gat,162,155,5 shop ŽŠ‚‚ÌŠZ‰® 77,2311:-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
+// ‘•”õ@‚
+prontera.gat,162,152,5 shop ŽŠ‚‚Ì‚‰® 77,2102:-1,2104:-1,2106:-1,2108:-1,2109:-1
+// ‘•”õ@ŒC
+prontera.gat,162,149,5 shop ŽŠ‚‚ÌŒC‰® 77,2402:-1,2404:-1,2406:-1,2407:-1,2410:-1,2412:-1
+// ‘•”õ@ŠO“…
+prontera.gat,162,146,5 shop ŽŠ‚‚ÌŠO“…‰® 77,2502:-1,2504:-1,2506:-1,2507:-1,2508:-1,2509:-1
+// ‘•”õ@ƒAƒNƒZƒTƒŠ
+prontera.gat,162,143,5 shop ŽŠ‚‚̃AƒNƒZƒTƒŠ‰® 77,2601:-1,2602:-1,2603:-1,2604:-1,2605:-1,2607:-1,2610:-1,2615:-1,2616:-1,2617:-1,2618:-1,2619:-1,2620:-1,2621:-1,2622:-1,2623:-1,2624:-1,2625:-1,2626:-1,2629:-1,2631:-1
+
+
+
+// •Ší‚ÉŽh‚·ƒJ[ƒh
+prontera.gat,162,235,5 shop Å‹­‚Ì•ŠíƒJ[ƒh‰® 80,4002:-1,4004:-1,4006:-1,4018:-1,4025:-1,4026:-1,4019:-1,4029:-1,4043:-1,4017:-1,4020:-1,4024:-1,4037:-1,4055:-1,4057:-1,4076:-1,4096:-1,4104:-1,4005:-1,4030:-1,4049:-1,4062:-1,4065:-1,4069:-1,4085:-1,4130:-1,4007:-1,4035:-1,4060:-1,4063:-1,4068:-1,4080:-1,4094:-1,4111:-1,4118:-1,4140:-1,4082:-1,4092:-1,4126:-1,4072:-1,4086:-1,4106:-1,4115:-1,4117:-1,4121:-1,4125:-1,4134:-1,4137:-1,4142:-1,4147:-1
+// “ª‚É‘}‚·ƒJ[ƒh
+prontera.gat,149,235,3 shop Å‹­‚Ì“ªƒJ[ƒh‰® 80,4010:-1,4039:-1,4041:-1,4046:-1,4052:-1,4087:-1,4110:-1,4112:-1,4122:-1,4127:-1,4132:-1,4143:-1,4148:-1
+// ŠZ‚É‘}‚·ƒJ[ƒh
+prontera.gat,162,238,5 shop Å‹­‚ÌŠZƒJ[ƒh‰® 80,4001:-1,4003:-1,4008:-1,4011:-1,4014:-1,4016:-1,4021:-1,4023:-1,4031:-1,4078:-1,4047:-1,4054:-1,4089:-1,4098:-1,4099:-1,4101:-1,4114:-1,4119:-1,4141:-1,4042:-1,4061:-1,4105:-1,4135:-1
+// ‚‚É‘}‚·ƒJ[ƒh
+prontera.gat,149,238,3 shop Å‹­‚Ì‚ƒJ[ƒh‰® 80,4012:-1,4013:-1,4032:-1,4058:-1,4059:-1,4066:-1,4074:-1,4083:-1,4120:-1,4124:-1,4136:-1,4138:-1,4045:-1,4067:-1,4075:-1,4090:-1,4128:-1,4146:-1
+// Œ¨‚É‚©‚¯‚é‚à‚Ì‚É‘}‚·ƒJ[ƒh
+prontera.gat,162,241,5 shop Å‹­‚ÌŠO“…ƒJ[ƒh‰® 80,4056:-1,4071:-1,4081:-1,4095:-1,4108:-1,4109:-1,4113:-1,4116:-1,4133:-1,4015:-1,4088:-1,4102:-1,4129:-1
+// ŒC‚É‘}‚·ƒJ[ƒh
+prontera.gat,149,241,3 shop Å‹­‚ÌŒCƒJ[ƒh‰® 80,4009:-1,4038:-1,4050:-1,4070:-1,4097:-1,4100:-1,4107:-1,4123:-1,4131:-1
+// ƒAƒNƒZƒTƒŠ[‚É‘}‚·ƒJ[ƒh
+prontera.gat,162,244,5 shop Å‹­‚̃AƒNƒZƒTƒŠƒJ[ƒh‰® 80,4022:-1,4027:-1,4028:-1,4034:-1,4051:-1,4064:-1,4091:-1,4079:-1,4033:-1,4040:-1,4044:-1,4048:-1,4053:-1,4073:-1,4084:-1,4093:-1,4103:-1,4139:-1,4036:-1,4077:-1,4144:-1,4145:-1
+
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_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 2f4950139..77591a210 100644
--- a/npc/sample/npc_test_str.txt
+++ b/npc/sample/npc_test_str.txt
@@ -1,17 +1,17 @@
-// •¶Žš—ñ•Ï”‚̃eƒXƒg
-prontera.gat,164,188,1 script •¶Žš—ñƒeƒXƒg 112,{
- set @str$, "•¶Žš—ñ‚P";
- mes "•¶Žš—ñ•Ï”F" + @str$ ;
- mes "Šm”FF" + @str$ + " ...OK?";
- next;
- mes "”äŠr`eqOKF" + (@str$=="•¶Žš—ñ‚P");
- mes "”äŠr`eqNGF" + (@str$=="•¶Žš—ñ");
- mes "”äŠr`neOKF" + (@str$!="00000");
- mes "”äŠr`neNGF" + (@str$!="•¶Žš—ñ‚P");
- mes "”äŠr`gtOKF" + ("aab">"aaa");
- mes "”äŠr`ltNGF" + ("aab"<"aaa");
- next;
- input @str2$;
- mes "“ü—̓f[ƒ^‚Í " + @str2$ + " ‚Å‚·B";
- close;
-}
+// •¶Žš—ñ•Ï”‚̃eƒXƒg
+prontera.gat,164,188,1 script •¶Žš—ñƒeƒXƒg 112,{
+ set @str$, "•¶Žš—ñ‚P";
+ mes "•¶Žš—ñ•Ï”F" + @str$ ;
+ mes "Šm”FF" + @str$ + " ...OK?";
+ next;
+ mes "”äŠr`eqOKF" + (@str$=="•¶Žš—ñ‚P");
+ mes "”äŠr`eqNGF" + (@str$=="•¶Žš—ñ");
+ mes "”äŠr`neOKF" + (@str$!="00000");
+ mes "”äŠr`neNGF" + (@str$!="•¶Žš—ñ‚P");
+ mes "”äŠr`gtOKF" + ("aab">"aaa");
+ mes "”äŠr`ltNGF" + ("aab"<"aaa");
+ next;
+ input @str2$;
+ mes "“ü—̓f[ƒ^‚Í " + @str2$ + " ‚Å‚·B";
+ 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/warps/ayothaya.txt b/npc/warps/ayothaya.txt
index 326e5a3b9..9ee6b4ce2 100644
--- a/npc/warps/ayothaya.txt
+++ b/npc/warps/ayothaya.txt
@@ -1,102 +1,102 @@
-// ---------------------------------------------------------------------------------------
-//
-// Ayothaya Town Warps - Warp Locations
-// - Created by Muad_Dib.
-//
-//========================================================================================
-
-//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
-
-//Field
-ayo_fild02.gat,18,138,0 warp ayothayawarp003 2,2,ayo_fild01.gat,120,204
-ayo_fild01.gat,123,207,0 warp ayothayawarp004 2,2,ayo_fild02.gat,21,138
-
-//Dungeon
-ayo_fild02.gat,285,150,0 warp ayothayawarp005 2,2,ayo_dun01.gat,275,17
-ayo_dun01.gat,275,14,0 warp ayothayawarp006 2,2,ayo_fild02.gat,282,150
-
-//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
-
-
-// ---------------------------------------------------------------------------------------
-//
-// Ayothaya Town Warps - Warp Locations (inside <-> outside)
-// - Created by L0ne_W0lf.
-//
-//========================================================================================
-//Restruant/Bar -- Facing North
-ayothaya.gat,229,70,0 warp ayothayawarp015 2,2,ayo_in01.gat,137,192
-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,95,174
-ayo_in01.gat,89,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,172,77,0 warp ayothayawarp021 2,2,ayo_in01.gat,75,174
-ayo_in01.gat,73,174,0 warp ayothayawarp022 2,2,ayothaya.gat,172,74
-
-//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 (Upper) -- Facing East
-ayothaya.gat,49,124,0 warp ayothayawarp027 2,2,ayo_in01.gat,191,183
-ayo_in01.gat,194,183,0 warp ayothayawarp028 2,2,ayothaya.gat,53,124
-
-//Straw-roof hut -- East Side (Middle) -- Facing East
-//ayothaya.gat,61,104,0 warp ayothayawarp029 2,2,ayo_in01.gat,,
-//ayo_in01.gat,,,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,48,94
-ayo_in01.gat,50,94,0 warp ayothayawarp036 2,2,ayothaya.gat,202,161
-//Inn -- West Door
-ayothaya.gat,193,149,0 warp ayothayawarp037 2,2,ayo_in01.gat,30,107
-ayo_in01.gat,30,110,0 warp ayothayawarp038 2,2,ayothaya.gat,189,149
-//Inn -- South Door
-ayothaya.gat,202,141,0 warp ayothayawarp039 2,2,ayo_in01.gat,14,94
-ayo_in01.gat,11,94,0 warp ayothayawarp040 2,2,ayothaya.gat,202,138
-//Inn -- East Door
-ayothaya.gat,211,149,0 warp ayothayawarp041 2,2,ayo_in01.gat,30,82
-ayo_in01.gat,30,79,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
+// ---------------------------------------------------------------------------------------
+//
+// Ayothaya Town Warps - Warp Locations
+// - Created by Muad_Dib.
+//
+//========================================================================================
+
+//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
+
+//Field
+ayo_fild02.gat,18,138,0 warp ayothayawarp003 2,2,ayo_fild01.gat,120,204
+ayo_fild01.gat,123,207,0 warp ayothayawarp004 2,2,ayo_fild02.gat,21,138
+
+//Dungeon
+ayo_fild02.gat,285,150,0 warp ayothayawarp005 2,2,ayo_dun01.gat,275,17
+ayo_dun01.gat,275,14,0 warp ayothayawarp006 2,2,ayo_fild02.gat,282,150
+
+//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
+
+
+// ---------------------------------------------------------------------------------------
+//
+// Ayothaya Town Warps - Warp Locations (inside <-> outside)
+// - Created by L0ne_W0lf.
+//
+//========================================================================================
+//Restruant/Bar -- Facing North
+ayothaya.gat,229,70,0 warp ayothayawarp015 2,2,ayo_in01.gat,137,192
+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,95,174
+ayo_in01.gat,89,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,172,77,0 warp ayothayawarp021 2,2,ayo_in01.gat,75,174
+ayo_in01.gat,73,174,0 warp ayothayawarp022 2,2,ayothaya.gat,172,74
+
+//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 (Upper) -- Facing East
+ayothaya.gat,49,124,0 warp ayothayawarp027 2,2,ayo_in01.gat,191,183
+ayo_in01.gat,194,183,0 warp ayothayawarp028 2,2,ayothaya.gat,53,124
+
+//Straw-roof hut -- East Side (Middle) -- Facing East
+//ayothaya.gat,61,104,0 warp ayothayawarp029 2,2,ayo_in01.gat,,
+//ayo_in01.gat,,,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,48,94
+ayo_in01.gat,50,94,0 warp ayothayawarp036 2,2,ayothaya.gat,202,161
+//Inn -- West Door
+ayothaya.gat,193,149,0 warp ayothayawarp037 2,2,ayo_in01.gat,30,107
+ayo_in01.gat,30,110,0 warp ayothayawarp038 2,2,ayothaya.gat,189,149
+//Inn -- South Door
+ayothaya.gat,202,141,0 warp ayothayawarp039 2,2,ayo_in01.gat,14,94
+ayo_in01.gat,11,94,0 warp ayothayawarp040 2,2,ayothaya.gat,202,138
+//Inn -- East Door
+ayothaya.gat,211,149,0 warp ayothayawarp041 2,2,ayo_in01.gat,30,82
+ayo_in01.gat,30,79,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 \ 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 1e7301d34..8523cf5a8 100644
--- a/npc/warps/cities/aldebaran.txt
+++ b/npc/warps/cities/aldebaran.txt
@@ -1,49 +1,49 @@
-//===== Athena Script ========================================
-//= Al de Baran Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Al de Baran
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//===== Al De Baran Warps =====================================
-aldebaran.gat,118,63,0 warp ald01 1,1,aldeba_in.gat,211,117
-aldebaran.gat,138,34,0 warp ald001 2,2,mjolnir_12.gat,199,375
-aldebaran.gat,197,70,0 warp ald02 1,1,aldeba_in.gat,94,41
-aldebaran.gat,225,54,0 warp ald03 1,1,aldeba_in.gat,149,120
-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,123,0 warp ald03-1 3,2,aldebaran.gat,223,56
-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
+//===== Athena Script ========================================
+//= Al de Baran Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Al de Baran
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//===== Al De Baran Warps =====================================
+aldebaran.gat,118,63,0 warp ald01 1,1,aldeba_in.gat,211,117
+aldebaran.gat,138,34,0 warp ald001 2,2,mjolnir_12.gat,199,375
+aldebaran.gat,197,70,0 warp ald02 1,1,aldeba_in.gat,94,41
+aldebaran.gat,225,54,0 warp ald03 1,1,aldeba_in.gat,149,120
+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,123,0 warp ald03-1 3,2,aldebaran.gat,223,56
+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
diff --git a/npc/warps/cities/amatsu.txt b/npc/warps/cities/amatsu.txt
index 007422c3e..29a6c80af 100644
--- a/npc/warps/cities/amatsu.txt
+++ b/npc/warps/cities/amatsu.txt
@@ -1,52 +1,52 @@
-//===== Athena Script ========================================
-//= Amatsu Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Amatsu
-//===== Additional Comments: =================================
-//= No Comments!
-//============================================================
-
-//= 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,amatsu.gat,52,144
-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,130,148
-ama_in01.gat,88,94,0 warp warp2008 1,1,amatsu.gat,99,148
-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
-ama_test.gat,50,16,0 warp warp8003 1,1,ama_fild01.gat,174,330
-ama_test.gat,50,44,0 warp warp8004 1,1,ama_test.gat,50,82
-ama_test.gat,50,79,0 warp warp8005 1,1,ama_test.gat,50,41
-//disabled due to amatsu dungeon quest
-//ama_test.gat,50,90,0 warp warp8006 1,1,ama_dun01.gat,228,9
-amatsu.gat,133,148,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,174,172
-amatsu.gat,85,235,0 warp warp1972 1,1,ama_in02.gat,224,45
-amatsu.gat,95,148,0 warp warp1990 1,1,ama_in01.gat,88,97
+//===== Athena Script ========================================
+//= Amatsu Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.2
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Amatsu
+//===== Additional Comments: =================================
+//= No Comments!
+//============================================================
+
+//= 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,amatsu.gat,52,144
+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,130,148
+ama_in01.gat,88,94,0 warp warp2008 1,1,amatsu.gat,99,148
+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
+ama_test.gat,50,16,0 warp warp8003 1,1,ama_fild01.gat,174,330
+ama_test.gat,50,44,0 warp warp8004 1,1,ama_test.gat,50,82
+ama_test.gat,50,79,0 warp warp8005 1,1,ama_test.gat,50,41
+//disabled due to amatsu dungeon quest
+//ama_test.gat,50,90,0 warp warp8006 1,1,ama_dun01.gat,228,9
+amatsu.gat,133,148,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,174,172
+amatsu.gat,85,235,0 warp warp1972 1,1,ama_in02.gat,224,45
+amatsu.gat,95,148,0 warp warp1990 1,1,ama_in01.gat,88,97
amatsu.gat,96,118,0 warp warp1962 1,1,ama_in01.gat,31,23 \ No newline at end of file
diff --git a/npc/warps/cities/comodo.txt b/npc/warps/cities/comodo.txt
index 1433dc4cd..7d8826f32 100644
--- a/npc/warps/cities/comodo.txt
+++ b/npc/warps/cities/comodo.txt
@@ -1,56 +1,56 @@
-//===== 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/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/izlude.txt b/npc/warps/cities/izlude.txt
index 704e65b79..4f9936def 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.1
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Izlude
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Izlude City ==============================================
-izlude.gat,109,151,0 warp iz01 3,3,izlude_in.gat,65,87
-izlude.gat,128,225,0 warp iz431 1,1,prt_are_in.gat,100,28
-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,63,169
-izlude_in.gat,62,170,0 warp w1039 1,1,izlude_in.gat,68,165
-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
+//===== Athena Script ========================================
+//= Izlude Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Izlude
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Izlude City ==============================================
+izlude.gat,109,151,0 warp iz01 3,3,izlude_in.gat,65,87
+izlude.gat,128,225,0 warp iz431 1,1,prt_are_in.gat,100,28
+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,63,169
+izlude_in.gat,62,170,0 warp w1039 1,1,izlude_in.gat,68,165
+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
diff --git a/npc/warps/cities/louyang.txt b/npc/warps/cities/louyang.txt
index 343e9c1f6..c39a8dcf0 100644
--- a/npc/warps/cities/louyang.txt
+++ b/npc/warps/cities/louyang.txt
@@ -1,48 +1,48 @@
-//===== Athena Script ========================================
-//= Lou Yang 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!
-//============================================================
-
-//= Lou Yang 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,30
-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_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 louwarp012 3,3,lou_in02.gat,74,190
-lou_in02.gat,80,190,0 warp louwarp012a 3,3,lou_in02.gat,246,58
-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.0
+//===== Compatible With: =====================================
+//= Any Athena Version 6.0+
+//===== Description: =========================================
+//= Warp Points for Lou Yang
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= Lou Yang 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,30
+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_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 louwarp012 3,3,lou_in02.gat,74,190
+lou_in02.gat,80,190,0 warp louwarp012a 3,3,lou_in02.gat,246,58
+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 ee485e24e..c45682d4a 100644
--- a/npc/warps/cities/lutie.txt
+++ b/npc/warps/cities/lutie.txt
@@ -1,41 +1,41 @@
-//===== Athena Script ========================================
-//= Lutie Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Lutie
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Lutie Town ===============================================
-xmas.gat,104,290,0 warp xmas12 3,3,xmas_in.gat,30,163
-xmas.gat,120,131,0 warp xmas3 3,3,xmas_in.gat,44,33
-xmas.gat,120,161,0 warp xmas4 3,3,xmas_in.gat,36,91
-xmas.gat,142,240,0 warp xmas8 3,3,xmas_in.gat,95,85
-xmas.gat,142,256,0 warp xmas11 3,3,xmas_in.gat,95,115
-xmas.gat,143,313,0 warp xmas14 3,3,xmas_dun01.gat,205,15
-xmas.gat,149,240,0 warp xmas9 3,3,xmas_in.gat,105,85
-xmas.gat,149,256,0 warp xmas10 3,3,xmas_in.gat,105,115
-xmas.gat,150,41,0 warp xmas2-1 3,3,xmas_fild01.gat,80,249
-xmas.gat,174,161,0 warp xmas6 3,3,xmas_in.gat,165,95
-xmas.gat,175,132,0 warp xmas5 3,3,xmas_in.gat,155,31
-xmas.gat,182,169,0 warp xmas7 3,3,xmas_in.gat,177,107
-xmas.gat,189,279,0 warp xmas13 3,3,xmas_in.gat,168,163
-xmas_in.gat,105,117,0 warp xmas10-1 2,2,xmas.gat,149,258
-xmas_in.gat,105,82,0 warp xmas9-1 3,3,xmas.gat,149,238
-xmas_in.gat,153,31,0 warp xmas5-1 3,3,xmas.gat,173,132
-xmas_in.gat,163,93,0 warp xmas6-1 3,3,xmas.gat,172,159
-xmas_in.gat,168,161,0 warp xmas13-1 3,3,xmas.gat,189,277
-xmas_in.gat,179,109,0 warp xmas7-1 3,3,xmas.gat,184,168
-xmas_in.gat,30,161,0 warp xmas12-1 3,3,xmas.gat,104,288
-xmas_in.gat,38,89,0 warp xmas4-1 3,3,xmas.gat,122,159
-xmas_in.gat,46,33,0 warp xmas3-1 3,3,xmas.gat,122,131
-xmas_in.gat,95,117,0 warp xmas11-1 2,2,xmas.gat,142,258
-xmas_in.gat,95,82,0 warp xmas8-1 3,3,xmas.gat,142,238
-
+//===== Athena Script ========================================
+//= Lutie Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//= Nana (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Lutie
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Lutie Town ===============================================
+xmas.gat,104,290,0 warp xmas12 3,3,xmas_in.gat,30,163
+xmas.gat,120,131,0 warp xmas3 3,3,xmas_in.gat,44,33
+xmas.gat,120,161,0 warp xmas4 3,3,xmas_in.gat,36,91
+xmas.gat,142,240,0 warp xmas8 3,3,xmas_in.gat,95,85
+xmas.gat,142,256,0 warp xmas11 3,3,xmas_in.gat,95,115
+xmas.gat,143,313,0 warp xmas14 3,3,xmas_dun01.gat,205,15
+xmas.gat,149,240,0 warp xmas9 3,3,xmas_in.gat,105,85
+xmas.gat,149,256,0 warp xmas10 3,3,xmas_in.gat,105,115
+xmas.gat,150,41,0 warp xmas2-1 3,3,xmas_fild01.gat,80,249
+xmas.gat,174,161,0 warp xmas6 3,3,xmas_in.gat,165,95
+xmas.gat,175,132,0 warp xmas5 3,3,xmas_in.gat,155,31
+xmas.gat,182,169,0 warp xmas7 3,3,xmas_in.gat,177,107
+xmas.gat,189,279,0 warp xmas13 3,3,xmas_in.gat,168,163
+xmas_in.gat,105,117,0 warp xmas10-1 2,2,xmas.gat,149,258
+xmas_in.gat,105,82,0 warp xmas9-1 3,3,xmas.gat,149,238
+xmas_in.gat,153,31,0 warp xmas5-1 3,3,xmas.gat,173,132
+xmas_in.gat,163,93,0 warp xmas6-1 3,3,xmas.gat,172,159
+xmas_in.gat,168,161,0 warp xmas13-1 3,3,xmas.gat,189,277
+xmas_in.gat,179,109,0 warp xmas7-1 3,3,xmas.gat,184,168
+xmas_in.gat,30,161,0 warp xmas12-1 3,3,xmas.gat,104,288
+xmas_in.gat,38,89,0 warp xmas4-1 3,3,xmas.gat,122,159
+xmas_in.gat,46,33,0 warp xmas3-1 3,3,xmas.gat,122,131
+xmas_in.gat,95,117,0 warp xmas11-1 2,2,xmas.gat,142,258
+xmas_in.gat,95,82,0 warp xmas8-1 3,3,xmas.gat,142,238
+
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 b76040703..b9446f9c3 100644
--- a/npc/warps/cities/niflheim.txt
+++ b/npc/warps/cities/niflheim.txt
@@ -1,35 +1,35 @@
-//===== Athena Script ========================================
-//= Niflheim Warp Script
-//===== By: ==================================================
-//= PKGINGO (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Niflheim
-//===== Additional Comments: =================================
-//= Extracted from Vidar -> Athena
-//============================================================
-
-//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 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
+//===== Athena Script ========================================
+//= Niflheim Warp Script
+//===== By: ==================================================
+//= PKGINGO (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Niflheim
+//===== Additional Comments: =================================
+//= Extracted from Vidar -> Athena
+//============================================================
+
+//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 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 \ No newline at end of file
diff --git a/npc/warps/cities/payon.txt b/npc/warps/cities/payon.txt
index 63bf950df..0d03800fe 100644
--- a/npc/warps/cities/payon.txt
+++ b/npc/warps/cities/payon.txt
@@ -1,137 +1,137 @@
-//===== eAthena Script =======================================
-//= Payon Warps
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//= Nana (1.3)
-//===== Current Version: =====================================
-//= 1.3
-//===== 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
-//============================================================
-
-// == 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,90,0 warp payonwarp005 2,4,pay_fild08.gat,20,74
-pay_fild08.gat,17,74,0 warp payonwarp006 2,4,payon.gat,264,93
-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,156,247,0 warp payonwarp030 2,2,payon_in03.gat,98,117
-payon_in03.gat,98,114,0 warp payonwarp031 2,2,payon.gat,156,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.3
+//===== 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
+//============================================================
+
+// == 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,90,0 warp payonwarp005 2,4,pay_fild08.gat,20,74
+pay_fild08.gat,17,74,0 warp payonwarp006 2,4,payon.gat,264,93
+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,156,247,0 warp payonwarp030 2,2,payon_in03.gat,98,117
+payon_in03.gat,98,114,0 warp payonwarp031 2,2,payon.gat,156,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,103,71 \ No newline at end of file
diff --git a/npc/warps/cities/prontera.txt b/npc/warps/cities/prontera.txt
index 0cd9b6785..42d2438fe 100644
--- a/npc/warps/cities/prontera.txt
+++ b/npc/warps/cities/prontera.txt
@@ -1,102 +1,102 @@
-//===== Athena Script ========================================
-//= Prontera Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//= Nana (1.2)
-//===== Current Version: =====================================
-//= 1.2
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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
-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,85,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
-
-//= 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.2
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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
+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,85,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
+
+//= 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/umbala.txt b/npc/warps/cities/umbala.txt
index 3a3d89c13..ee253386d 100644
--- a/npc/warps/cities/umbala.txt
+++ b/npc/warps/cities/umbala.txt
@@ -1,44 +1,44 @@
-//===== 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
-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
+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 05e3a3745..881ced220 100644
--- a/npc/warps/cities/yggdrasil.txt
+++ b/npc/warps/cities/yggdrasil.txt
@@ -1,25 +1,25 @@
-//===== 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
-yggdrasil01.gat,36,62,0 warp nwarp2 1,1,um_dun02.gat,126,147
-
-//Niflheim Exit
-yggdrasil01.gat,249,262,0 warp nwarp5 1,1,nif_fild01.gat,315,66
-nif_fild01.gat,315,63,0 warp nwarp6 1,1,yggdrasil01.gat,247,262
-
-//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
+yggdrasil01.gat,36,62,0 warp nwarp2 1,1,um_dun02.gat,126,147
+
+//Niflheim Exit
+yggdrasil01.gat,249,262,0 warp nwarp5 1,1,nif_fild01.gat,315,66
+nif_fild01.gat,315,63,0 warp nwarp6 1,1,yggdrasil01.gat,247,262
+
+//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 7bbfd6823..9232e7f88 100644
--- a/npc/warps/cities/yuno.txt
+++ b/npc/warps/cities/yuno.txt
@@ -1,92 +1,92 @@
-//===== Athena Script ========================================
-//= Yuno Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Yuno
-//===== Additional Comments: =================================
-//= No Comment
-//============================================================
-
-//= Yuno City ================================================
-yuno.gat,158,15,0 warp yun-yunfild 1,1,yuno_fild04.gat,231,209
-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,342,203,0 warp yun15 1,1,yuno_in04.gat,32,58
-yuno_in04.gat,28,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_in02.gat,82,14,0 warp yun59 1,1,yuno_in05.gat,192,194
-yuno_in05.gat,196,194,0 warp yun60 1,1,yuno_in02.gat,85,14
-yuno_in05.gat,153,142,0 warp yun61 1,1,yuno_in05.gat,145,83
-yuno_in05.gat,148,83,0 warp yun62 1,1,yuno_in05.gat,156,142
-yuno_in05.gat,137,71,0 warp yun63 1,1,yuno_in05.gat,15,185
-yuno_in05.gat,16,188,0 warp yun64 1,1,yuno_in05.gat,137,74
-yuno_in05.gat,181,91,0 warp yun65 1,1,yuno_in05.gat,177,49
-yuno_in05.gat,177,52,0 warp yun66 1,1,yuno_in05.gat,181,94
-yuno_in05.gat,177,9,0 warp yun67 1,1,yuno_in05.gat,177,49
-yuno_in05.gat,165,103,0 warp yun68 1,1,yuno_in05.gat,145,83
-yuno_in05.gat,125,83,0 warp yun69 1,1,yuno_in05.gat,193,102
-yuno_in05.gat,181,116,0 warp yun70 1,1,yuno_in05.gat,177,12
-yuno_in05.gat,47,185,0 warp yun71 1,1,yuno_in05.gat,181,94
-yuno_in05.gat,31,167,0 warp yun72 1,1,yuno_in05.gat,50,85
-yuno_in05.gat,50,87,0 warp yun73 1,1,yuno_in02.gat,85,14
-yuno_in01.gat,88,36,0 warp yun74 1,1,yuno_in01.gat,173,34
-yuno_in01.gat,176,34,0 warp yun75 1,1,yuno_in01.gat,91,36
+//===== Athena Script ========================================
+//= Yuno Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Yuno
+//===== Additional Comments: =================================
+//= No Comment
+//============================================================
+
+//= Yuno City ================================================
+yuno.gat,158,15,0 warp yun-yunfild 1,1,yuno_fild04.gat,231,209
+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,342,203,0 warp yun15 1,1,yuno_in04.gat,32,58
+yuno_in04.gat,28,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_in02.gat,82,14,0 warp yun59 1,1,yuno_in05.gat,192,194
+yuno_in05.gat,196,194,0 warp yun60 1,1,yuno_in02.gat,85,14
+yuno_in05.gat,153,142,0 warp yun61 1,1,yuno_in05.gat,145,83
+yuno_in05.gat,148,83,0 warp yun62 1,1,yuno_in05.gat,156,142
+yuno_in05.gat,137,71,0 warp yun63 1,1,yuno_in05.gat,15,185
+yuno_in05.gat,16,188,0 warp yun64 1,1,yuno_in05.gat,137,74
+yuno_in05.gat,181,91,0 warp yun65 1,1,yuno_in05.gat,177,49
+yuno_in05.gat,177,52,0 warp yun66 1,1,yuno_in05.gat,181,94
+yuno_in05.gat,177,9,0 warp yun67 1,1,yuno_in05.gat,177,49
+yuno_in05.gat,165,103,0 warp yun68 1,1,yuno_in05.gat,145,83
+yuno_in05.gat,125,83,0 warp yun69 1,1,yuno_in05.gat,193,102
+yuno_in05.gat,181,116,0 warp yun70 1,1,yuno_in05.gat,177,12
+yuno_in05.gat,47,185,0 warp yun71 1,1,yuno_in05.gat,181,94
+yuno_in05.gat,31,167,0 warp yun72 1,1,yuno_in05.gat,50,85
+yuno_in05.gat,50,87,0 warp yun73 1,1,yuno_in02.gat,85,14
+yuno_in01.gat,88,36,0 warp yun74 1,1,yuno_in01.gat,173,34
+yuno_in01.gat,176,34,0 warp yun75 1,1,yuno_in01.gat,91,36
yuno_in05.gat,197,102,0 warp yun76 1,1,yuno_in05.gat,168,103 \ No newline at end of file
diff --git a/npc/warps/disabled_warps.txt b/npc/warps/disabled_warps.txt
index 151b1d25c..73697a910 100644
--- a/npc/warps/disabled_warps.txt
+++ b/npc/warps/disabled_warps.txt
@@ -1,37 +1,37 @@
-//===== Athena Script ========================================
-//= Disabled Warps
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== 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
-
-//= Payon Cave
+//===== Athena Script ========================================
+//= Disabled Warps
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== 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
+
+//= Payon Cave
//pay_dun03.gat,127,62,0 warp payd04 1,2,pay_dun04.gat,201,204 \ No newline at end of file
diff --git a/npc/warps/dungeons/alberta_duns.txt b/npc/warps/dungeons/alberta_duns.txt
index 1392cab0f..d7d683104 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,41,111,0 warp tre05 1,3,treasure01.gat,63,111
-treasure01.gat,62,111,0 warp tre05-1 1,3,treasure01.gat,39,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,41,111,0 warp tre05 1,3,treasure01.gat,63,111
+treasure01.gat,62,111,0 warp tre05-1 1,3,treasure01.gat,39,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 6232ff0e8..2a3301fcb 100644
--- a/npc/warps/dungeons/alde_ct.txt
+++ b/npc/warps/dungeons/alde_ct.txt
@@ -1,226 +1,226 @@
-//===== Athena Script ========================================
-//= Al de Baran Clock Tower Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== 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
-//============================================================
-
-//= 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==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",13,282; break;
- w2: warp "alde_dun03.gat",175,131; break;
- w3: warp "c_tower3.gat",235,7; break;
-}
-//============================================================
-//= Random 2-2 ===============================================
-c_tower2.gat,223,267,4 script clt007r 45,1,1,{
- set @r,rand(3);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",288,267; break;
- w2: warp "alde_dun03.gat",130,130; break;
- w3: warp "c_tower3.gat",252,29; break;
-}
-//============================================================
-//= 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,{
- set @r,rand(2);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- w1: warp "c_tower3.gat",168,252; break;
- w2: warp "alde_dun02.gat",262,41; break;
-}
-//============================================================
-//= Random 3-2 ===============================================
-c_tower3.gat,240,7,4 script clt015r 45,1,1,{
- set @r,rand(3);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",13,282; break;
- w2: warp "alde_dun03.gat",175,131; break;
- w3: warp "c_tower3.gat",235,7; break;
-}
-//============================================================
-//= Random 3-3 ===============================================
-c_tower3.gat,252,24,4 script clt016r 45,1,1,{
- set @r,rand(3);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",228,267; break;
- w2: warp "alde_dun03.gat",130,130; break;
- w3: warp "c_tower3.gat",252,29; break;
-}
-//============================================================
-//= 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==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower3.gat",168,252; break;
- w2: warp "alde_dun02.gat",262,41; break;
- w3: warp "c_tower4.gat",73,154; break;
- w4: warp "c_tower4.gat",140,149; break;
-}
-//============================================================
-//= Random 4-2 ===============================================
-c_tower4.gat,68,79,4 script clt028r 45,0,0,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower2.gat",13,282; break;
- w2: warp "alde_dun03.gat",175,131; break;
- w3: warp "c_tower3.gat",235,7; break;
- w4: warp "c_tower4.gat",65,77; break;
-}
-//============================================================
-//= Random 4-3 ===============================================
-c_tower4.gat,142,151,4 script clt029r 45,0,0,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower3.gat",168,252; break;
- w2: warp "alde_dun02.gat",262,41; break;
- w3: warp "c_tower4.gat",73,154; break;
- w4: warp "c_tower4.gat",140,149; break;
-}
-//============================================================
-//= Random 4-4 ===============================================
-c_tower4.gat,151,96,4 script clt030r 45,0,0,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower2.gat",228,267; break;
- w2: warp "alde_dun03.gat",130,130; break;
- w3: warp "c_tower3.gat",252,29; break;
- w4: warp "c_tower4.gat",152,95; break;
-}
-//============================================================
-//= Random 4-5 ===============================================
-c_tower4.gat,189,40,4 script clt031r 45,2,2,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower2.gat",228,267; break;
- w2: warp "alde_dun03.gat",130,130; break;
- w3: warp "c_tower3.gat",252,29; break;
- w4: warp "c_tower4.gat",152,95; break;
-}
-//============================================================
-//============================================================
-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 clt008r 45,1,1,{
- set @r,rand(2);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- w1: warp "c_tower3.gat",168,252; break;
- w2: warp "alde_dun02.gat",262,141; break;
-}
-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 clt014r 45,1,1,{
- set @r,rand(3);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",228,267; break;
- w2: warp "alde_dun03.gat",130,130; break;
- w3: warp "c_tower3.gat",252,29; break;
-}
-//============================================================
-//= Random 3-2 ===============================================
-alde_dun03.gat,171,127,4 script clt015r 45,1,1,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- w1: warp "c_tower2.gat",13,282; break;
- w2: warp "alde_dun03.gat",175,131; break;
- w3: warp "c_tower3.gat",235,7; break;
-}
-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 clt022r 45,1,1,{
- set @r,rand(4);
- if(@r==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "c_tower2.gat",13,282; break;
- w2: warp "alde_dun03.gat",175,131; break;
- w3: warp "c_tower3.gat",235,7; break;
- w4: warp "alde_dun04.gat",84,36; break;
-}
-//============================================================
+//===== Athena Script ========================================
+//= Al de Baran Clock Tower Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== 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
+//============================================================
+
+//= 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==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",13,282; break;
+ w2: warp "alde_dun03.gat",175,131; break;
+ w3: warp "c_tower3.gat",235,7; break;
+}
+//============================================================
+//= Random 2-2 ===============================================
+c_tower2.gat,223,267,4 script clt007r 45,1,1,{
+ set @r,rand(3);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",288,267; break;
+ w2: warp "alde_dun03.gat",130,130; break;
+ w3: warp "c_tower3.gat",252,29; break;
+}
+//============================================================
+//= 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,{
+ set @r,rand(2);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ w1: warp "c_tower3.gat",168,252; break;
+ w2: warp "alde_dun02.gat",262,41; break;
+}
+//============================================================
+//= Random 3-2 ===============================================
+c_tower3.gat,240,7,4 script clt015r 45,1,1,{
+ set @r,rand(3);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",13,282; break;
+ w2: warp "alde_dun03.gat",175,131; break;
+ w3: warp "c_tower3.gat",235,7; break;
+}
+//============================================================
+//= Random 3-3 ===============================================
+c_tower3.gat,252,24,4 script clt016r 45,1,1,{
+ set @r,rand(3);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",228,267; break;
+ w2: warp "alde_dun03.gat",130,130; break;
+ w3: warp "c_tower3.gat",252,29; break;
+}
+//============================================================
+//= 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==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower3.gat",168,252; break;
+ w2: warp "alde_dun02.gat",262,41; break;
+ w3: warp "c_tower4.gat",73,154; break;
+ w4: warp "c_tower4.gat",140,149; break;
+}
+//============================================================
+//= Random 4-2 ===============================================
+c_tower4.gat,68,79,4 script clt028r 45,0,0,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower2.gat",13,282; break;
+ w2: warp "alde_dun03.gat",175,131; break;
+ w3: warp "c_tower3.gat",235,7; break;
+ w4: warp "c_tower4.gat",65,77; break;
+}
+//============================================================
+//= Random 4-3 ===============================================
+c_tower4.gat,142,151,4 script clt029r 45,0,0,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower3.gat",168,252; break;
+ w2: warp "alde_dun02.gat",262,41; break;
+ w3: warp "c_tower4.gat",73,154; break;
+ w4: warp "c_tower4.gat",140,149; break;
+}
+//============================================================
+//= Random 4-4 ===============================================
+c_tower4.gat,151,96,4 script clt030r 45,0,0,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower2.gat",228,267; break;
+ w2: warp "alde_dun03.gat",130,130; break;
+ w3: warp "c_tower3.gat",252,29; break;
+ w4: warp "c_tower4.gat",152,95; break;
+}
+//============================================================
+//= Random 4-5 ===============================================
+c_tower4.gat,189,40,4 script clt031r 45,2,2,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower2.gat",228,267; break;
+ w2: warp "alde_dun03.gat",130,130; break;
+ w3: warp "c_tower3.gat",252,29; break;
+ w4: warp "c_tower4.gat",152,95; break;
+}
+//============================================================
+//============================================================
+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 clt008r 45,1,1,{
+ set @r,rand(2);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ w1: warp "c_tower3.gat",168,252; break;
+ w2: warp "alde_dun02.gat",262,141; break;
+}
+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 clt014r 45,1,1,{
+ set @r,rand(3);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",228,267; break;
+ w2: warp "alde_dun03.gat",130,130; break;
+ w3: warp "c_tower3.gat",252,29; break;
+}
+//============================================================
+//= Random 3-2 ===============================================
+alde_dun03.gat,171,127,4 script clt015r 45,1,1,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ w1: warp "c_tower2.gat",13,282; break;
+ w2: warp "alde_dun03.gat",175,131; break;
+ w3: warp "c_tower3.gat",235,7; break;
+}
+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 clt022r 45,1,1,{
+ set @r,rand(4);
+ if(@r==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "c_tower2.gat",13,282; break;
+ w2: warp "alde_dun03.gat",175,131; break;
+ w3: warp "c_tower3.gat",235,7; break;
+ w4: warp "alde_dun04.gat",84,36; break;
+}
+//============================================================
//============================================================ \ No newline at end of file
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 847fb5f02..f32615499 100644
--- a/npc/warps/dungeons/ant_hell.txt
+++ b/npc/warps/dungeons/ant_hell.txt
@@ -1,27 +1,27 @@
-//===== Athena Script ========================================
-//= Ant Hell Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Ant Hell
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Ant Hell =================================================
-anthell01.gat,35,267,0 script ant001 45,1,1,{
- if( anthell==1) goto moc15;
- moc04: warp "moc_fild04.gat",213,327; break;
- moc15: warp "moc_fild15.gat",251,248; break;
-}
-anthell02.gat,171,169,0 script ant001 45,1,2,{
- if(!anthell==0) goto moc15;
- moc04: warp "moc_fild04.gat",213,327; break;
- moc15: warp "moc_fild15.gat",251,248; break;
-}
-anthell01.gat,253,32,0 warp ant01 2,1,anthell02.gat,34,263
+//===== Athena Script ========================================
+//= Ant Hell Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Ant Hell
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Ant Hell =================================================
+anthell01.gat,35,267,0 script ant001 45,1,1,{
+ if( anthell==1) goto moc15;
+ moc04: warp "moc_fild04.gat",213,327; break;
+ moc15: warp "moc_fild15.gat",251,248; break;
+}
+anthell02.gat,171,169,0 script ant001 45,1,2,{
+ if(!anthell==0) goto moc15;
+ moc04: warp "moc_fild04.gat",213,327; break;
+ moc15: warp "moc_fild15.gat",251,248; break;
+}
+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 \ No newline at end of file
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/geffen_dun.txt b/npc/warps/dungeons/geffen_dun.txt
index 05819d167..694a2692a 100644
--- a/npc/warps/dungeons/geffen_dun.txt
+++ b/npc/warps/dungeons/geffen_dun.txt
@@ -1,45 +1,45 @@
-//===== Athena Script ========================================
-//= Geffen Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Geffen Tower
-//===== Additional Comments: =================================
-//= No comment!
-//============================================================
-
-//= 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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Geffen Tower
+//===== Additional Comments: =================================
+//= No comment!
+//============================================================
+
+//= 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/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/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 4b8dadd24..217927167 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.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 2+
-//===== Description: =========================================
-//= Warp Points for Lutie Dungeon (Toy Factory)
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Toy Factory ==============================================
-xmas_dun01.gat,128,131,0 warp xmas15 3,3,xmas_dun02.gat,129,133
-xmas_dun01.gat,205,13,0 warp xmas14-1 3,3,xmas.gat,143,311
+//===== Athena Script ========================================
+//= Lutie Dungeon (Toy Factory) Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 2+
+//===== Description: =========================================
+//= Warp Points for Lutie Dungeon (Toy Factory)
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Toy Factory ==============================================
+xmas_dun01.gat,128,131,0 warp xmas15 3,3,xmas_dun02.gat,129,133
+xmas_dun01.gat,205,13,0 warp xmas14-1 3,3,xmas.gat,143,311
xmas_dun02.gat,129,129,0 warp xmas15-1 3,3,xmas_dun01.gat,128,129 \ No newline at end of file
diff --git a/npc/warps/dungeons/morroc_duns.txt b/npc/warps/dungeons/morroc_duns.txt
index 0668196cd..6ccade79f 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,8
-moc_pryd05.gat,94,98,0 warp mocp09 2,1,moc_prydb1.gat,100,57
-moc_pryd06.gat,195,8,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,8
+moc_pryd05.gat,94,98,0 warp mocp09 2,1,moc_prydb1.gat,100,57
+moc_pryd06.gat,195,8,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/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 c54be1eb7..4a064f5ad 100644
--- a/npc/warps/dungeons/payon_dun.txt
+++ b/npc/warps/dungeons/payon_dun.txt
@@ -1,37 +1,37 @@
-//===== eAthena Script =======================================
-//= Payon Cave Warps
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= Payon Dungeon Warps
-//===== Additional Comments: =================================
-//= No Comment
-//============================================================
-
-//= 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==0) goto w1;
- if(@r==1) goto w2;
- if(@r==2) goto w3;
- if(@r==3) goto w4;
- w1: warp "pay_dun04.gat",201,204; break;
- w2: warp "pay_dun04.gat",193,43; break;
- w3: warp "pay_dun04.gat",43,40; break;
- w4: warp "pay_dun04.gat",34,202; break;
-}
-pay_dun04.gat,191,41,0 warp payd04-2 1,1,pay_dun03.gat,125,62
-pay_dun04.gat,202,206,0 warp payd04-3 1,1,pay_dun03.gat,125,62
-pay_dun04.gat,32,204,0 warp payd04-4 2,1,pay_dun03.gat,125,62
+//===== eAthena Script =======================================
+//= Payon Cave Warps
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= Payon Dungeon Warps
+//===== Additional Comments: =================================
+//= No Comment
+//============================================================
+
+//= 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==0) goto w1;
+ if(@r==1) goto w2;
+ if(@r==2) goto w3;
+ if(@r==3) goto w4;
+ w1: warp "pay_dun04.gat",201,204; break;
+ w2: warp "pay_dun04.gat",193,43; break;
+ w3: warp "pay_dun04.gat",43,40; break;
+ w4: warp "pay_dun04.gat",34,202; break;
+}
+pay_dun04.gat,191,41,0 warp payd04-2 1,1,pay_dun03.gat,125,62
+pay_dun04.gat,202,206,0 warp payd04-3 1,1,pay_dun03.gat,125,62
+pay_dun04.gat,32,204,0 warp payd04-4 2,1,pay_dun03.gat,125,62
pay_dun04.gat,40,37,0 warp payd04-1 2,2,pay_dun03.gat,125,62 \ No newline at end of file
diff --git a/npc/warps/dungeons/prt_dun.txt b/npc/warps/dungeons/prt_dun.txt
index 8e46fbf7b..4ada80997 100644
--- a/npc/warps/dungeons/prt_dun.txt
+++ b/npc/warps/dungeons/prt_dun.txt
@@ -1,154 +1,154 @@
-//===== Athena Script ========================================
-//= Prontera Dungeon's Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Dungeon's
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= Hidden Temple ============================================
-prt_maze01.gat,100,35,0 warp prm101 5,2,prt_maze01.gat,139,47
-prt_maze01.gat,102,165,0 warp prm102 5,2,prt_maze01.gat,98,151
-prt_maze01.gat,105,115,0 warp prm103 5,2,prt_maze01.gat,175,168
-prt_maze01.gat,105,75,0 warp prm104 5,2,prt_maze01.gat,54,8
-prt_maze01.gat,115,145,0 warp prm105 2,5,prt_maze01.gat,8,186
-prt_maze01.gat,115,21,0 warp prm106 2,5,prt_maze01.gat,167,22
-prt_maze01.gat,115,56,0 warp prm107 2,5,prt_maze01.gat,7,57
-prt_maze01.gat,115,96,0 warp prm108 2,5,prt_maze01.gat,128,105
-prt_maze01.gat,124,105,0 warp prm108-1 2,5,prt_maze01.gat,111,96
-prt_maze01.gat,124,169,0 warp prm109 2,5,prt_maze01.gat,191,139
-prt_maze01.gat,138,124,0 warp prm110 5,2,prt_maze01.gat,142,111
-prt_maze01.gat,139,44,0 warp prm101-1 5,2,prt_maze01.gat,100,32
-prt_maze01.gat,14,75,0 warp prm111 5,2,prt_maze01.gat,63,128
-prt_maze01.gat,140,75,0 warp prm112 5,2,prt_maze01.gat,96,47
-prt_maze01.gat,142,115,0 warp prm110-1 5,2,prt_maze01.gat,138,128
-prt_maze01.gat,155,133,0 warp prm113 2,5,prt_maze01.gat,8,140
-prt_maze01.gat,155,181,0 warp prm114 2,5,prt_maze01.gat,88,145
-prt_maze01.gat,155,21,0 warp prm115 2,12,prt_maze01.gat,87,13
-prt_maze01.gat,164,140,0 warp prm116 2,5,prt_maze01.gat,70,68
-prt_maze01.gat,164,22,0 warp prm106-1 2,5,prt_maze01.gat,112,21
-prt_maze01.gat,164,93,0 warp prm117 2,5,prt_maze01.gat,72,11
-prt_maze01.gat,17,115,0 warp prm118 5,2,prt_maze01.gat,50,48
-prt_maze01.gat,17,34,0 warp prm119 5,3,prt_maze01.gat,23,128
-prt_maze01.gat,175,164,0 warp prm103-1 5,2,prt_maze01.gat,105,111
-prt_maze01.gat,176,35,0 warp prm120 5,3,prt_maze01.gat,182,88
-prt_maze01.gat,176,4,0 warp prm0001 8,2,prt_fild01.gat,136,368
-prt_maze01.gat,176,44,0 warp prm121 5,2,prt_maze01.gat,18,152
-prt_maze01.gat,18,155,0 warp prm121-1 5,2,prt_maze01.gat,176,47
-prt_maze01.gat,182,84,0 warp prm120-1 5,2,prt_maze01.gat,177,31
-prt_maze01.gat,19,195,0 warp prm2001 10,2,prt_maze02.gat,94,19
-prt_maze01.gat,195,139,0 warp prm109-1 2,5,prt_maze01.gat,129,174
-prt_maze01.gat,195,15,0 warp prm122 2,5,prt_maze01.gat,47,105
-prt_maze01.gat,195,174,0 warp prm113 2,5,prt_maze01.gat,47,23
-prt_maze01.gat,195,55,0 warp prm114 2,5,prt_maze01.gat,87,97
-prt_maze01.gat,195,93,0 warp prm115 2,5,prt_maze01.gat,88,55
-prt_maze01.gat,22,84,0 warp prm116 5,2,prt_maze01.gat,55,151
-prt_maze01.gat,23,124,0 warp prm119-1 5,2,prt_maze01.gat,17,30
-prt_maze01.gat,25,5,0 warp prm117 5,3,prt_maze01.gat,65,113
-prt_maze01.gat,4,140,0 warp prm113-1 2,5,prt_maze01.gat,151,133
-prt_maze01.gat,4,186,0 warp prm105-1 2,5,prt_maze01.gat,111,145
-prt_maze01.gat,4,57,0 warp prm107-1 2,5,prt_maze01.gat,112,56
-prt_maze01.gat,44,105,0 warp prm122-1 2,5,prt_maze01.gat,192,15
-prt_maze01.gat,44,23,0 warp prm113-1 2,5,prt_maze01.gat,192,174
-prt_maze01.gat,50,44,0 warp prm118-1 4,2,prt_maze01.gat,17,111
-prt_maze01.gat,51,195,0 warp prm118 7,2,prt_maze01.gat,63,88
-prt_maze01.gat,54,4,0 warp prm104-1 5,2,prt_maze01.gat,105,71
-prt_maze01.gat,55,155,0 warp prm116-1 5,2,prt_maze01.gat,22,88
-prt_maze01.gat,63,124,0 warp prm111-1 5,2,prt_maze01.gat,14,71
-prt_maze01.gat,63,195,0 warp prm118-1 7,2,prt_maze01.gat,63,88
-prt_maze01.gat,63,84,0 warp prm118-2 6,2,prt_maze01.gat,58,192
-prt_maze01.gat,65,116,0 warp prm117-1 5,2,prt_maze01.gat,23,9
-prt_maze01.gat,70,75,0 warp w624 7,3,prt_maze01.gat,169,140
-prt_maze01.gat,75,11,0 warp prm117-1 2,5,prt_maze01.gat,167,93
-prt_maze01.gat,75,66,0 warp prm116-1 3,10,prt_maze01.gat,169,140
-prt_maze01.gat,75,95,0 warp prm119 2,5,prt_maze01.gat,88,173
-prt_maze01.gat,84,10,0 warp prm115-1 2,5,prt_maze01.gat,152,25
-prt_maze01.gat,84,145,0 warp prm114-1 2,5,prt_maze01.gat,151,181
-prt_maze01.gat,84,173,0 warp prm119-2 2,5,prt_maze01.gat,71,95
-prt_maze01.gat,84,55,0 warp prm115-1 2,5,prt_maze01.gat,191,93
-prt_maze01.gat,84,97,0 warp prm114-1 2,5,prt_maze01.gat,192,55
-prt_maze01.gat,96,44,0 warp prm112-1 5,2,prt_maze01.gat,140,72
-prt_maze01.gat,98,155,0 warp prm102-1 5,2,prt_maze01.gat,102,169
-prt_maze02.gat,103,15,0 warp prm2002 12,2,prt_maze01.gat,22,191
-prt_maze02.gat,108,182,0 warp prm3001 12,2,prt_maze03.gat,23,8
-prt_maze02.gat,80,182,0 warp prm3002 12,2,prt_maze03.gat,23,8
-prt_maze02.gat,84,15,0 warp prm2003 12,2,prt_maze01.gat,22,191
-prt_maze03.gat,100,35,0 warp prm301 4,2,prt_maze03.gat,63,88
-prt_maze03.gat,102,164,0 warp prm302 3,2,prt_maze03.gat,143,111
-prt_maze03.gat,104,115,0 warp prm303 4,2,prt_maze03.gat,22,88
-prt_maze03.gat,105,75,0 warp prm304 6,2,prt_maze03.gat,140,47
-prt_maze03.gat,115,145,0 warp prm305 2,3,prt_maze03.gat,88,173
-prt_maze03.gat,115,21,0 warp prm306 2,4,prt_maze03.gat,128,105
-prt_maze03.gat,115,56,0 warp prm307 2,3,prt_maze03.gat,88,145
-prt_maze03.gat,115,96,0 warp prm308 2,7,prt_maze03.gat,167,22
-prt_maze03.gat,124,105,0 warp prm306-1 2,4,prt_maze03.gat,111,21
-prt_maze03.gat,124,168,0 warp prm309 2,8,prt_maze03.gat,69,69
-prt_maze03.gat,137,124,0 warp prm310 10,2,prt_maze03.gat,177,32
-prt_maze03.gat,14,75,0 warp prm311 5,2,prt_maze03.gat,54,8
-prt_maze03.gat,140,44,0 warp prm304-1 6,2,prt_maze03.gat,105,72
-prt_maze03.gat,140,75,0 warp prm312 3,2,prt_maze03.gat,97,48
-prt_maze03.gat,143,115,0 warp prm302-1 3,2,prt_maze03.gat,102,168
-prt_maze03.gat,155,133,0 warp prm313 2,3,prt_maze03.gat,8,186
-prt_maze03.gat,155,181,0 warp prm314 2,3,prt_maze03.gat,88,56
-prt_maze03.gat,155,21,0 warp prm315 2,15,prt_maze03.gat,48,22
-prt_maze03.gat,164,139,0 warp prm316 2,4,prt_maze03.gat,191,16
-prt_maze03.gat,164,22,0 warp prm308-2 2,8,prt_maze03.gat,111,95
-prt_maze03.gat,17,115,0 warp prm317 8,2,prt_maze03.gat,49,47
-prt_maze03.gat,175,164,0 warp prm318 5,2,prt_maze03.gat,18,30
-prt_maze03.gat,176,35,0 warp prm310-1 5,2,prt_maze03.gat,137,127
-prt_maze03.gat,176,44,0 warp prm319 7,2,prt_maze03.gat,55,151
-prt_maze03.gat,178,75,0 warp prm320 3,2,prt_maze03.gat,182,88
-prt_maze03.gat,18,155,0 warp prm321 4,2,prt_maze03.gat,63,128
-prt_maze03.gat,18,34,0 warp prm318-2 5,3,prt_maze03.gat,175,168
-prt_maze03.gat,182,84,0 warp prm320-1 3,2,prt_maze03.gat,178,71
-prt_maze03.gat,195,139,0 warp prm308-1 2,13,prt_maze03.gat,167,22
-prt_maze03.gat,195,16,0 warp prm316-1 2,4,prt_maze03.gat,168,139
-prt_maze03.gat,195,174,0 warp prm322 2,5,prt_maze03.gat,48,105
-prt_maze03.gat,195,54,0 warp prm323 2,3,prt_maze03.gat,88,96
-prt_maze03.gat,22,195,0 warp prm324 4,2,prt_maze03.gat,65,111
-prt_maze03.gat,22,84,0 warp prm303-1 6,2,prt_maze03.gat,104,111
-prt_maze03.gat,23,124,0 warp prm325 5,2,prt_maze03.gat,98,151
-prt_maze03.gat,25,4,0 warp prm3003 8,3,prt_maze02.gat,95,177
-prt_maze03.gat,4,140,0 warp prm326 2,3,prt_maze03.gat,60,192
-prt_maze03.gat,4,186,0 warp prm313-1 2,4,prt_maze03.gat,151,133
-prt_maze03.gat,4,57,0 warp prm327 2,4,prt_maze03.gat,71,95
-prt_maze03.gat,44,105,0 warp prm322-1 2,4,prt_maze03.gat,191,174
-prt_maze03.gat,44,22,0 warp prm315-1 2,5,prt_maze03.gat,151,25
-prt_maze03.gat,49,44,0 warp prm317-1 10,2,prt_maze03.gat,17,112
-prt_maze03.gat,53,195,0 warp prm326-2 10,2,prt_maze03.gat,7,140
-prt_maze03.gat,54,4,0 warp prm311-1 5,2,prt_maze03.gat,14,71
-prt_maze03.gat,55,155,0 warp prm319-1 3,2,prt_maze03.gat,176,48
-prt_maze03.gat,63,124,0 warp prm321-1 4,2,prt_maze03.gat,18,151
-prt_maze03.gat,63,195,0 warp prm326-1 10,2,prt_maze03.gat,7,140
-prt_maze03.gat,63,84,0 warp prm301-1 4,2,prt_maze03.gat,100,31
-prt_maze03.gat,65,115,0 warp prm324-1 4,2,prt_maze03.gat,22,191
-prt_maze03.gat,71,75,0 warp prm309-1 6,2,prt_maze03.gat,127,173
-prt_maze03.gat,75,12,0 warp prm328 2,5,prt_maze03.gat,88,13
-prt_maze03.gat,75,64,0 warp prm309-2 2,10,prt_maze03.gat,127,173
-prt_maze03.gat,75,95,0 warp prm327-1 2,4,prt_maze03.gat,8,57
-prt_maze03.gat,84,10,0 warp prm328-1 2,5,prt_maze03.gat,71,12
-prt_maze03.gat,84,145,0 warp prm307-1 2,3,prt_maze03.gat,111,56
-prt_maze03.gat,84,173,0 warp prm305-1 2,3,prt_maze03.gat,111,145
-prt_maze03.gat,84,56,0 warp prm314-1 2,3,prt_maze03.gat,151,181
-prt_maze03.gat,84,96,0 warp prm323-1 2,3,prt_maze03.gat,191,54
-prt_maze03.gat,97,44,0 warp prm312-1 3,2,prt_maze03.gat,140,71
-prt_maze03.gat,98,155,0 warp prm325-1 3,2,prt_maze03.gat,23,128
-
-//= 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 Dungeon's Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Dungeon's
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= Hidden Temple ============================================
+prt_maze01.gat,100,35,0 warp prm101 5,2,prt_maze01.gat,139,47
+prt_maze01.gat,102,165,0 warp prm102 5,2,prt_maze01.gat,98,151
+prt_maze01.gat,105,115,0 warp prm103 5,2,prt_maze01.gat,175,168
+prt_maze01.gat,105,75,0 warp prm104 5,2,prt_maze01.gat,54,8
+prt_maze01.gat,115,145,0 warp prm105 2,5,prt_maze01.gat,8,186
+prt_maze01.gat,115,21,0 warp prm106 2,5,prt_maze01.gat,167,22
+prt_maze01.gat,115,56,0 warp prm107 2,5,prt_maze01.gat,7,57
+prt_maze01.gat,115,96,0 warp prm108 2,5,prt_maze01.gat,128,105
+prt_maze01.gat,124,105,0 warp prm108-1 2,5,prt_maze01.gat,111,96
+prt_maze01.gat,124,169,0 warp prm109 2,5,prt_maze01.gat,191,139
+prt_maze01.gat,138,124,0 warp prm110 5,2,prt_maze01.gat,142,111
+prt_maze01.gat,139,44,0 warp prm101-1 5,2,prt_maze01.gat,100,32
+prt_maze01.gat,14,75,0 warp prm111 5,2,prt_maze01.gat,63,128
+prt_maze01.gat,140,75,0 warp prm112 5,2,prt_maze01.gat,96,47
+prt_maze01.gat,142,115,0 warp prm110-1 5,2,prt_maze01.gat,138,128
+prt_maze01.gat,155,133,0 warp prm113 2,5,prt_maze01.gat,8,140
+prt_maze01.gat,155,181,0 warp prm114 2,5,prt_maze01.gat,88,145
+prt_maze01.gat,155,21,0 warp prm115 2,12,prt_maze01.gat,87,13
+prt_maze01.gat,164,140,0 warp prm116 2,5,prt_maze01.gat,70,68
+prt_maze01.gat,164,22,0 warp prm106-1 2,5,prt_maze01.gat,112,21
+prt_maze01.gat,164,93,0 warp prm117 2,5,prt_maze01.gat,72,11
+prt_maze01.gat,17,115,0 warp prm118 5,2,prt_maze01.gat,50,48
+prt_maze01.gat,17,34,0 warp prm119 5,3,prt_maze01.gat,23,128
+prt_maze01.gat,175,164,0 warp prm103-1 5,2,prt_maze01.gat,105,111
+prt_maze01.gat,176,35,0 warp prm120 5,3,prt_maze01.gat,182,88
+prt_maze01.gat,176,4,0 warp prm0001 8,2,prt_fild01.gat,136,368
+prt_maze01.gat,176,44,0 warp prm121 5,2,prt_maze01.gat,18,152
+prt_maze01.gat,18,155,0 warp prm121-1 5,2,prt_maze01.gat,176,47
+prt_maze01.gat,182,84,0 warp prm120-1 5,2,prt_maze01.gat,177,31
+prt_maze01.gat,19,195,0 warp prm2001 10,2,prt_maze02.gat,94,19
+prt_maze01.gat,195,139,0 warp prm109-1 2,5,prt_maze01.gat,129,174
+prt_maze01.gat,195,15,0 warp prm122 2,5,prt_maze01.gat,47,105
+prt_maze01.gat,195,174,0 warp prm113 2,5,prt_maze01.gat,47,23
+prt_maze01.gat,195,55,0 warp prm114 2,5,prt_maze01.gat,87,97
+prt_maze01.gat,195,93,0 warp prm115 2,5,prt_maze01.gat,88,55
+prt_maze01.gat,22,84,0 warp prm116 5,2,prt_maze01.gat,55,151
+prt_maze01.gat,23,124,0 warp prm119-1 5,2,prt_maze01.gat,17,30
+prt_maze01.gat,25,5,0 warp prm117 5,3,prt_maze01.gat,65,113
+prt_maze01.gat,4,140,0 warp prm113-1 2,5,prt_maze01.gat,151,133
+prt_maze01.gat,4,186,0 warp prm105-1 2,5,prt_maze01.gat,111,145
+prt_maze01.gat,4,57,0 warp prm107-1 2,5,prt_maze01.gat,112,56
+prt_maze01.gat,44,105,0 warp prm122-1 2,5,prt_maze01.gat,192,15
+prt_maze01.gat,44,23,0 warp prm113-1 2,5,prt_maze01.gat,192,174
+prt_maze01.gat,50,44,0 warp prm118-1 4,2,prt_maze01.gat,17,111
+prt_maze01.gat,51,195,0 warp prm118 7,2,prt_maze01.gat,63,88
+prt_maze01.gat,54,4,0 warp prm104-1 5,2,prt_maze01.gat,105,71
+prt_maze01.gat,55,155,0 warp prm116-1 5,2,prt_maze01.gat,22,88
+prt_maze01.gat,63,124,0 warp prm111-1 5,2,prt_maze01.gat,14,71
+prt_maze01.gat,63,195,0 warp prm118-1 7,2,prt_maze01.gat,63,88
+prt_maze01.gat,63,84,0 warp prm118-2 6,2,prt_maze01.gat,58,192
+prt_maze01.gat,65,116,0 warp prm117-1 5,2,prt_maze01.gat,23,9
+prt_maze01.gat,70,75,0 warp w624 7,3,prt_maze01.gat,169,140
+prt_maze01.gat,75,11,0 warp prm117-1 2,5,prt_maze01.gat,167,93
+prt_maze01.gat,75,66,0 warp prm116-1 3,10,prt_maze01.gat,169,140
+prt_maze01.gat,75,95,0 warp prm119 2,5,prt_maze01.gat,88,173
+prt_maze01.gat,84,10,0 warp prm115-1 2,5,prt_maze01.gat,152,25
+prt_maze01.gat,84,145,0 warp prm114-1 2,5,prt_maze01.gat,151,181
+prt_maze01.gat,84,173,0 warp prm119-2 2,5,prt_maze01.gat,71,95
+prt_maze01.gat,84,55,0 warp prm115-1 2,5,prt_maze01.gat,191,93
+prt_maze01.gat,84,97,0 warp prm114-1 2,5,prt_maze01.gat,192,55
+prt_maze01.gat,96,44,0 warp prm112-1 5,2,prt_maze01.gat,140,72
+prt_maze01.gat,98,155,0 warp prm102-1 5,2,prt_maze01.gat,102,169
+prt_maze02.gat,103,15,0 warp prm2002 12,2,prt_maze01.gat,22,191
+prt_maze02.gat,108,182,0 warp prm3001 12,2,prt_maze03.gat,23,8
+prt_maze02.gat,80,182,0 warp prm3002 12,2,prt_maze03.gat,23,8
+prt_maze02.gat,84,15,0 warp prm2003 12,2,prt_maze01.gat,22,191
+prt_maze03.gat,100,35,0 warp prm301 4,2,prt_maze03.gat,63,88
+prt_maze03.gat,102,164,0 warp prm302 3,2,prt_maze03.gat,143,111
+prt_maze03.gat,104,115,0 warp prm303 4,2,prt_maze03.gat,22,88
+prt_maze03.gat,105,75,0 warp prm304 6,2,prt_maze03.gat,140,47
+prt_maze03.gat,115,145,0 warp prm305 2,3,prt_maze03.gat,88,173
+prt_maze03.gat,115,21,0 warp prm306 2,4,prt_maze03.gat,128,105
+prt_maze03.gat,115,56,0 warp prm307 2,3,prt_maze03.gat,88,145
+prt_maze03.gat,115,96,0 warp prm308 2,7,prt_maze03.gat,167,22
+prt_maze03.gat,124,105,0 warp prm306-1 2,4,prt_maze03.gat,111,21
+prt_maze03.gat,124,168,0 warp prm309 2,8,prt_maze03.gat,69,69
+prt_maze03.gat,137,124,0 warp prm310 10,2,prt_maze03.gat,177,32
+prt_maze03.gat,14,75,0 warp prm311 5,2,prt_maze03.gat,54,8
+prt_maze03.gat,140,44,0 warp prm304-1 6,2,prt_maze03.gat,105,72
+prt_maze03.gat,140,75,0 warp prm312 3,2,prt_maze03.gat,97,48
+prt_maze03.gat,143,115,0 warp prm302-1 3,2,prt_maze03.gat,102,168
+prt_maze03.gat,155,133,0 warp prm313 2,3,prt_maze03.gat,8,186
+prt_maze03.gat,155,181,0 warp prm314 2,3,prt_maze03.gat,88,56
+prt_maze03.gat,155,21,0 warp prm315 2,15,prt_maze03.gat,48,22
+prt_maze03.gat,164,139,0 warp prm316 2,4,prt_maze03.gat,191,16
+prt_maze03.gat,164,22,0 warp prm308-2 2,8,prt_maze03.gat,111,95
+prt_maze03.gat,17,115,0 warp prm317 8,2,prt_maze03.gat,49,47
+prt_maze03.gat,175,164,0 warp prm318 5,2,prt_maze03.gat,18,30
+prt_maze03.gat,176,35,0 warp prm310-1 5,2,prt_maze03.gat,137,127
+prt_maze03.gat,176,44,0 warp prm319 7,2,prt_maze03.gat,55,151
+prt_maze03.gat,178,75,0 warp prm320 3,2,prt_maze03.gat,182,88
+prt_maze03.gat,18,155,0 warp prm321 4,2,prt_maze03.gat,63,128
+prt_maze03.gat,18,34,0 warp prm318-2 5,3,prt_maze03.gat,175,168
+prt_maze03.gat,182,84,0 warp prm320-1 3,2,prt_maze03.gat,178,71
+prt_maze03.gat,195,139,0 warp prm308-1 2,13,prt_maze03.gat,167,22
+prt_maze03.gat,195,16,0 warp prm316-1 2,4,prt_maze03.gat,168,139
+prt_maze03.gat,195,174,0 warp prm322 2,5,prt_maze03.gat,48,105
+prt_maze03.gat,195,54,0 warp prm323 2,3,prt_maze03.gat,88,96
+prt_maze03.gat,22,195,0 warp prm324 4,2,prt_maze03.gat,65,111
+prt_maze03.gat,22,84,0 warp prm303-1 6,2,prt_maze03.gat,104,111
+prt_maze03.gat,23,124,0 warp prm325 5,2,prt_maze03.gat,98,151
+prt_maze03.gat,25,4,0 warp prm3003 8,3,prt_maze02.gat,95,177
+prt_maze03.gat,4,140,0 warp prm326 2,3,prt_maze03.gat,60,192
+prt_maze03.gat,4,186,0 warp prm313-1 2,4,prt_maze03.gat,151,133
+prt_maze03.gat,4,57,0 warp prm327 2,4,prt_maze03.gat,71,95
+prt_maze03.gat,44,105,0 warp prm322-1 2,4,prt_maze03.gat,191,174
+prt_maze03.gat,44,22,0 warp prm315-1 2,5,prt_maze03.gat,151,25
+prt_maze03.gat,49,44,0 warp prm317-1 10,2,prt_maze03.gat,17,112
+prt_maze03.gat,53,195,0 warp prm326-2 10,2,prt_maze03.gat,7,140
+prt_maze03.gat,54,4,0 warp prm311-1 5,2,prt_maze03.gat,14,71
+prt_maze03.gat,55,155,0 warp prm319-1 3,2,prt_maze03.gat,176,48
+prt_maze03.gat,63,124,0 warp prm321-1 4,2,prt_maze03.gat,18,151
+prt_maze03.gat,63,195,0 warp prm326-1 10,2,prt_maze03.gat,7,140
+prt_maze03.gat,63,84,0 warp prm301-1 4,2,prt_maze03.gat,100,31
+prt_maze03.gat,65,115,0 warp prm324-1 4,2,prt_maze03.gat,22,191
+prt_maze03.gat,71,75,0 warp prm309-1 6,2,prt_maze03.gat,127,173
+prt_maze03.gat,75,12,0 warp prm328 2,5,prt_maze03.gat,88,13
+prt_maze03.gat,75,64,0 warp prm309-2 2,10,prt_maze03.gat,127,173
+prt_maze03.gat,75,95,0 warp prm327-1 2,4,prt_maze03.gat,8,57
+prt_maze03.gat,84,10,0 warp prm328-1 2,5,prt_maze03.gat,71,12
+prt_maze03.gat,84,145,0 warp prm307-1 2,3,prt_maze03.gat,111,56
+prt_maze03.gat,84,173,0 warp prm305-1 2,3,prt_maze03.gat,111,145
+prt_maze03.gat,84,56,0 warp prm314-1 2,3,prt_maze03.gat,151,181
+prt_maze03.gat,84,96,0 warp prm323-1 2,3,prt_maze03.gat,191,54
+prt_maze03.gat,97,44,0 warp prm312-1 3,2,prt_maze03.gat,140,71
+prt_maze03.gat,98,155,0 warp prm325-1 3,2,prt_maze03.gat,23,128
+
+//= 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/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/amatsu_fild.txt b/npc/warps/fields/amatsu_fild.txt
index 24cc6091b..56506edc7 100644
--- a/npc/warps/fields/amatsu_fild.txt
+++ b/npc/warps/fields/amatsu_fild.txt
@@ -1,21 +1,21 @@
-//===== 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 ============================================
-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_test.gat,50,19
+//===== 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 ============================================
+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_test.gat,50,19
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/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 782aea9ff..6726c2720 100644
--- a/npc/warps/fields/glastheim.txt
+++ b/npc/warps/fields/glastheim.txt
@@ -1,85 +1,85 @@
-//===== Athena Script ========================================
-//= Glastheim Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-//Glastheim
-gef_fild06.gat,20,304,0 warp gef027 3,3,glast_01.gat,375,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,{
-set @r,rand(2);
-if(@r==0) goto w1;
-if(@r==1) goto w2;
-w1: 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,22,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.1
+//===== 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]
+//============================================================
+
+//Glastheim
+gef_fild06.gat,20,304,0 warp gef027 3,3,glast_01.gat,375,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,{
+set @r,rand(2);
+if(@r==0) goto w1;
+if(@r==1) goto w2;
+w1: 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,22,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/jawaii.txt b/npc/warps/fields/jawaii.txt
index 4c4c31dc2..f670b733d 100644
--- a/npc/warps/fields/jawaii.txt
+++ b/npc/warps/fields/jawaii.txt
@@ -1,25 +1,25 @@
-//===== Athena Script ========================================
-//= Jawaii Warp Script
-//===== By: ==================================================
-//= Muad Dib (1.0)
-//= Darkchild (1.1)
-//===== Current Version: =====================================
-//= 1.1
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 6+
-//===== Description: =========================================
-//= Warp Points for Jawaii
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//============================================================
-
-jawaii.gat,115,172,0 warp jawaiiwarp009 1,1,jawaii_in.gat,129,110
-jawaii.gat,109,186,0 warp jawaiiwarp007 1,1,jawaii_in.gat,85,117
-jawaii.gat,111,199,0 warp jawaiiwarp003 1,1,jawaii_in.gat,87,75
-jawaii.gat,192,215,0 warp jawaiiwarp005 1,1,jawaii_in.gat,28,94
-jawaii.gat,138,202,0 warp jawaiiwarp001 1,1,jawaii_in.gat,116,64
-jawaii_in.gat,90,78,0 warp jawaiiwarp004 1,1,jawaii.gat,113,196
-jawaii_in.gat,28,91,0 warp jawaiiwarp006 1,1,jawaii.gat,192,218
-jawaii_in.gat,113,61,0 warp jawaiiwarp002 1,1,jawaii.gat,135,200
-jawaii_in.gat,132,107,0 warp jawaiiwarp008 1,1,jawaii.gat,118,175
-jawaii_in.gat,88,117,0 warp jawaiiwarp010 1,1,jawaii.gat,113,186
+//===== Athena Script ========================================
+//= Jawaii Warp Script
+//===== By: ==================================================
+//= Muad Dib (1.0)
+//= Darkchild (1.1)
+//===== Current Version: =====================================
+//= 1.1
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 6+
+//===== Description: =========================================
+//= Warp Points for Jawaii
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//============================================================
+
+jawaii.gat,115,172,0 warp jawaiiwarp009 1,1,jawaii_in.gat,129,110
+jawaii.gat,109,186,0 warp jawaiiwarp007 1,1,jawaii_in.gat,85,117
+jawaii.gat,111,199,0 warp jawaiiwarp003 1,1,jawaii_in.gat,87,75
+jawaii.gat,192,215,0 warp jawaiiwarp005 1,1,jawaii_in.gat,28,94
+jawaii.gat,138,202,0 warp jawaiiwarp001 1,1,jawaii_in.gat,116,64
+jawaii_in.gat,90,78,0 warp jawaiiwarp004 1,1,jawaii.gat,113,196
+jawaii_in.gat,28,91,0 warp jawaiiwarp006 1,1,jawaii.gat,192,218
+jawaii_in.gat,113,61,0 warp jawaiiwarp002 1,1,jawaii.gat,135,200
+jawaii_in.gat,132,107,0 warp jawaiiwarp008 1,1,jawaii.gat,118,175
+jawaii_in.gat,88,117,0 warp jawaiiwarp010 1,1,jawaii.gat,113,186
diff --git a/npc/warps/fields/lutie_fild.txt b/npc/warps/fields/lutie_fild.txt
index b7e2a73df..afc8e2c44 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 3,3,xmas.gat,150,43
+//===== 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 3,3,xmas.gat,150,43
xmas_fild01.gat,85,49,0 warp xmas001 10,3,aldebaran.gat,140,240 \ No newline at end of file
diff --git a/npc/warps/fields/morroc_fild.txt b/npc/warps/fields/morroc_fild.txt
index b42121f6b..5d0843916 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.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Morroc Fields
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Morroc Fields
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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 529bf16fe..ab8dbdf43 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.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Mt. Mjolnir
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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,376,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
+//===== Athena Script ========================================
+//= Mt. Mjolnir Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Mt. Mjolnir
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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,376,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,43,20,0 warp mjol17 2,2,prt_maze01.gat,17,111 \ No newline at end of file
diff --git a/npc/warps/fields/payon_fild.txt b/npc/warps/fields/payon_fild.txt
index 7a4cabd99..b03739083 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.0
-//===== Compatible With: =====================================
-//= Any eAthena Mod
-//===== Description: =========================================
-//= Payon Field Warps
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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,186,69
-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.0
+//===== Compatible With: =====================================
+//= Any eAthena Mod
+//===== Description: =========================================
+//= Payon Field Warps
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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,186,69
+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 42da9dc89..010ef3d5b 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.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Field
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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 2,2,prt_maze01.gat,176,7
-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.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Field
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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 2,2,prt_maze01.gat,176,7
+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/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 50b7df78c..c501c80c5 100644
--- a/npc/warps/fields/yuno_fild.txt
+++ b/npc/warps/fields/yuno_fild.txt
@@ -1,31 +1,31 @@
-//===== Athena Script ========================================
-//= Yuno Field Warp Script
-//===== By: ==================================================
-//= Nana (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version; RO Episode 5+
-//===== Description: =========================================
-//= Warp Points for Yuno Field
-//===== Additional Comments: =================================
-//= No Comment!
-//============================================================
-
-//= 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,211,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
-
-//= 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
+//===== Athena Script ========================================
+//= Yuno Field Warp Script
+//===== By: ==================================================
+//= Nana (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version; RO Episode 5+
+//===== Description: =========================================
+//= Warp Points for Yuno Field
+//===== Additional Comments: =================================
+//= No Comment!
+//============================================================
+
+//= 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,211,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
+
+//= 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
diff --git a/npc/warps/guild/guildcastles.txt b/npc/warps/guild/guildcastles.txt
index 5f092fd4a..3ccc8befc 100644
--- a/npc/warps/guild/guildcastles.txt
+++ b/npc/warps/guild/guildcastles.txt
@@ -1,401 +1,401 @@
-//===== Athena Script ========================================
-//= Guild Castles Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.1
-//===== 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]
-//============================================================
-
-
-//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,194,0 warp aldg204 1,1,aldeg_cas02.gat,88,13
-aldeg_cas02.gat,88,9,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,86,0 warp aldg405 1,1,aldeg_cas04.gat,49,57
-aldeg_cas04.gat,49,53,0 warp aldg405-1 1,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(4);
- if(l0==0) goto w1;
- if(l0==1) goto w2;
- if(l0==2) goto w3;
- if(l0==3) goto w4;
-w1: warp "aldeg_cas04.gat",170,100; break;
-w2: warp "aldeg_cas04.gat",186,88; break;
-w3: warp "aldeg_cas04.gat",129,212; break;
-w4: warp "aldeg_cas04.gat",132,209; break;
-}
-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,270,0 warp payg05 1,1,payg_cas05.gat,62,227
-payg_cas05.gat,62,223,0 warp payg05-1 1,1,pay_gld.gat,198,264
-
-//Payon Guild Castles
-payg_cas01.gat,201,126,0 warp payg101 1,1,payg_cas01.gat,102,21
-payg_cas01.gat,102,17,0 warp payg101-1 1,1,payg_cas01.gat,201,121
-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,239,0 warp payg205 1,1,payg_cas02.gat,13,38
-payg_cas02.gat,13,42,0 warp payg205-1 1,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,272,68,0 warp payg305 1,1,payg_cas03.gat,261,38
-payg_cas03.gat,261,34,0 warp payg305-1 1,1,payg_cas03.gat,270,66
-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,260,212,0 warp payg401 1,1,payg_cas04.gat,70,240
-payg_cas04.gat,74,240,0 warp payg401-1 1,1,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,39,264,0 warp payg503 1,1,payg_cas05.gat,237,231
-payg_cas05.gat,237,227,0 warp payg503-1 1,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
-
-//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
+//===== Athena Script ========================================
+//= Guild Castles Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.1
+//===== 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]
+//============================================================
+
+
+//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,194,0 warp aldg204 1,1,aldeg_cas02.gat,88,13
+aldeg_cas02.gat,88,9,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,86,0 warp aldg405 1,1,aldeg_cas04.gat,49,57
+aldeg_cas04.gat,49,53,0 warp aldg405-1 1,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(4);
+ if(l0==0) goto w1;
+ if(l0==1) goto w2;
+ if(l0==2) goto w3;
+ if(l0==3) goto w4;
+w1: warp "aldeg_cas04.gat",170,100; break;
+w2: warp "aldeg_cas04.gat",186,88; break;
+w3: warp "aldeg_cas04.gat",129,212; break;
+w4: warp "aldeg_cas04.gat",132,209; break;
+}
+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,270,0 warp payg05 1,1,payg_cas05.gat,62,227
+payg_cas05.gat,62,223,0 warp payg05-1 1,1,pay_gld.gat,198,264
+
+//Payon Guild Castles
+payg_cas01.gat,201,126,0 warp payg101 1,1,payg_cas01.gat,102,21
+payg_cas01.gat,102,17,0 warp payg101-1 1,1,payg_cas01.gat,201,121
+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,239,0 warp payg205 1,1,payg_cas02.gat,13,38
+payg_cas02.gat,13,42,0 warp payg205-1 1,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,272,68,0 warp payg305 1,1,payg_cas03.gat,261,38
+payg_cas03.gat,261,34,0 warp payg305-1 1,1,payg_cas03.gat,270,66
+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,260,212,0 warp payg401 1,1,payg_cas04.gat,70,240
+payg_cas04.gat,74,240,0 warp payg401-1 1,1,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,39,264,0 warp payg503 1,1,payg_cas05.gat,237,231
+payg_cas05.gat,237,227,0 warp payg503-1 1,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
+
+//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 \ No newline at end of file
diff --git a/npc/warps/other/jobquests.txt b/npc/warps/other/jobquests.txt
index c94a1a1c6..817ab4b35 100644
--- a/npc/warps/other/jobquests.txt
+++ b/npc/warps/other/jobquests.txt
@@ -1,137 +1,137 @@
-//===== Athena Script ========================================
-//= Job Quest Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.3a
-//===== 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]
-//============================================================
-
-
-//==============================================================================
-//Novice
-//==============================================================================
-new_1-1.gat,148,112,0 warp new11 2,3,new_1-2.gat,100,9
-new_1-1.gat,166,112,0 warp new12 2,2,new_1-2.gat,100,153
-new_1-2.gat,100,150,0 warp new12-1 2,1,new_1-1.gat,162,112
-new_1-1.gat,169,75,0 warp new13 2,2,new_1-2.gat,182,163
-new_1-2.gat,182,159,0 warp new13-1 2,2,new_1-1.gat,165,75
-new_1-1.gat,169,147,0 warp new14 2,2,new_1-2.gat,18,163
-new_1-2.gat,18,159,0 warp new14-1 2,2,new_1-1.gat,165,147
-new_1-2.gat,100,122,0 warp new15 2,1,new_1-2.gat,100,162
-new_1-2.gat,100,165,0 warp new15-1 2,1,new_1-2.gat,100,119
-new_1-2.gat,126,106,0 warp new16 2,4,new_1-2.gat,156,171
-new_1-2.gat,153,171,0 warp new16-1 2,4,new_1-2.gat,123,106
-new_1-3.gat,96,175,0 warp new17 3,2,new_1-4.gat,100,14
-
-//==============================================================================
-//Swordman
-//==============================================================================
-sword_1-1.gat,192,244,0 warp SwordWarp0 2,2,sword_1-1.gat,215,244
-sword_1-1.gat,223,243,0 warp SwordWarp1 2,2,sword_1-1.gat,12,206
-sword_1-1.gat,192,206,0 warp SwordWarp2 2,2,sword_1-1.gat,215,205
-sword_1-1.gat,223,205,0 warp SwordWarp3 2,2,sword_1-1.gat,12,168
-sword_1-1.gat,192,168,0 warp SwordWarp4 2,2,sword_1-1.gat,215,167
-sword_2-1.gat,65,117,0 warp swd201 1,1,sword_2-1.gat,10,245
-sword_2-1.gat,98,27,0 warp swd202 1,1,sword_2-1.gat,11,207
-sword_2-1.gat,161,27,0 warp swd203 1,1,sword_2-1.gat,11,207
-sword_2-1.gat,223,205,0 warp swd204 1,1,sword_2-1.gat,11,168
-sword_2-1.gat,223,243,0 warp swd205 1,1,sword_2-1.gat,11,206
-sword_2-1.gat,239,117,0 warp swd206 1,1,sword_2-1.gat,11,169
-sword_3-1.gat,65,117,0 warp swd301 1,1,sword_3-1.gat,10,245
-sword_3-1.gat,98,27,0 warp swd302 1,1,sword_3-1.gat,11,207
-sword_3-1.gat,161,27,0 warp swd303 1,1,sword_3-1.gat,11,207
-sword_3-1.gat,223,205,0 warp swd304 1,1,sword_3-1.gat,11,168
-sword_3-1.gat,223,243,0 warp swd305 1,1,sword_3-1.gat,11,206
-sword_3-1.gat,239,117,0 warp swd306 1,1,sword_3-1.gat,11,169
-// Underground cave
-sword_1-1.gat,65,117,0 warp swd101 1,1,sword_1-1.gat,10,245
-sword_1-1.gat,98,27,0 warp swd102 1,1,sword_1-1.gat,11,207
-sword_1-1.gat,161,27,0 warp swd103 1,1,sword_1-1.gat,11,207
-sword_1-1.gat,239,117,0 warp swd106 1,1,sword_1-1.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
-
+//===== Athena Script ========================================
+//= Job Quest Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.3a
+//===== 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]
+//============================================================
+
+
+//==============================================================================
+//Novice
+//==============================================================================
+new_1-1.gat,148,112,0 warp new11 2,3,new_1-2.gat,100,9
+new_1-1.gat,166,112,0 warp new12 2,2,new_1-2.gat,100,153
+new_1-2.gat,100,150,0 warp new12-1 2,1,new_1-1.gat,162,112
+new_1-1.gat,169,75,0 warp new13 2,2,new_1-2.gat,182,163
+new_1-2.gat,182,159,0 warp new13-1 2,2,new_1-1.gat,165,75
+new_1-1.gat,169,147,0 warp new14 2,2,new_1-2.gat,18,163
+new_1-2.gat,18,159,0 warp new14-1 2,2,new_1-1.gat,165,147
+new_1-2.gat,100,122,0 warp new15 2,1,new_1-2.gat,100,162
+new_1-2.gat,100,165,0 warp new15-1 2,1,new_1-2.gat,100,119
+new_1-2.gat,126,106,0 warp new16 2,4,new_1-2.gat,156,171
+new_1-2.gat,153,171,0 warp new16-1 2,4,new_1-2.gat,123,106
+new_1-3.gat,96,175,0 warp new17 3,2,new_1-4.gat,100,14
+
+//==============================================================================
+//Swordman
+//==============================================================================
+sword_1-1.gat,192,244,0 warp SwordWarp0 2,2,sword_1-1.gat,215,244
+sword_1-1.gat,223,243,0 warp SwordWarp1 2,2,sword_1-1.gat,12,206
+sword_1-1.gat,192,206,0 warp SwordWarp2 2,2,sword_1-1.gat,215,205
+sword_1-1.gat,223,205,0 warp SwordWarp3 2,2,sword_1-1.gat,12,168
+sword_1-1.gat,192,168,0 warp SwordWarp4 2,2,sword_1-1.gat,215,167
+sword_2-1.gat,65,117,0 warp swd201 1,1,sword_2-1.gat,10,245
+sword_2-1.gat,98,27,0 warp swd202 1,1,sword_2-1.gat,11,207
+sword_2-1.gat,161,27,0 warp swd203 1,1,sword_2-1.gat,11,207
+sword_2-1.gat,223,205,0 warp swd204 1,1,sword_2-1.gat,11,168
+sword_2-1.gat,223,243,0 warp swd205 1,1,sword_2-1.gat,11,206
+sword_2-1.gat,239,117,0 warp swd206 1,1,sword_2-1.gat,11,169
+sword_3-1.gat,65,117,0 warp swd301 1,1,sword_3-1.gat,10,245
+sword_3-1.gat,98,27,0 warp swd302 1,1,sword_3-1.gat,11,207
+sword_3-1.gat,161,27,0 warp swd303 1,1,sword_3-1.gat,11,207
+sword_3-1.gat,223,205,0 warp swd304 1,1,sword_3-1.gat,11,168
+sword_3-1.gat,223,243,0 warp swd305 1,1,sword_3-1.gat,11,206
+sword_3-1.gat,239,117,0 warp swd306 1,1,sword_3-1.gat,11,169
+// Underground cave
+sword_1-1.gat,65,117,0 warp swd101 1,1,sword_1-1.gat,10,245
+sword_1-1.gat,98,27,0 warp swd102 1,1,sword_1-1.gat,11,207
+sword_1-1.gat,161,27,0 warp swd103 1,1,sword_1-1.gat,11,207
+sword_1-1.gat,239,117,0 warp swd106 1,1,sword_1-1.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
+
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/pvp/pvp.txt b/npc/warps/pvp/pvp.txt
index fc004313d..e74beeed5 100644
--- a/npc/warps/pvp/pvp.txt
+++ b/npc/warps/pvp/pvp.txt
@@ -1,259 +1,259 @@
-//===== Athena Script ========================================
-//= Prontera Arena & PvP Warp Script
-//===== By: ==================================================
-//= Athena (1.0)
-//===== Current Version: =====================================
-//= 1.0
-//===== Compatible With: =====================================
-//= Any Athena Version
-//===== Description: =========================================
-//= Warp Points for Prontera Arena and PvP Maps
-//===== Additional Comments: =================================
-//= Split off npc_warp.txt
-//============================================================
-
-//Prontera Arena
-prt_are_in.gat,127,82,0 warp warp1082 1,1,prt_are_in.gat,156,82
-prt_are_in.gat,152,82,0 warp warp1083 1,1,prt_are_in.gat,123,82
-prt_are_in.gat,169,122,0 warp warp1084 1,1,prt_are_in.gat,169,92
-prt_are_in.gat,31,122,0 warp warp1076 1,1,prt_are_in.gat,31,92
-prt_are_in.gat,49,82,0 warp warp1077 1,1,prt_are_in.gat,76,82
-prt_are_in.gat,72,82,0 warp warp1078 1,1,prt_are_in.gat,44,82
-prt_are_in.gat,99,24,0 warp warp1079 1,1,izlude.gat,127,221
-prt_are_in.gat,99,47,0 warp warp1080 1,1,prt_are_in.gat,99,76
-prt_are_in.gat,99,72,0 warp warp1081 1,1,prt_are_in.gat,99,43
-
-
-//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,99,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
-
-//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
-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
+//===== Athena Script ========================================
+//= Prontera Arena & PvP Warp Script
+//===== By: ==================================================
+//= Athena (1.0)
+//===== Current Version: =====================================
+//= 1.0
+//===== Compatible With: =====================================
+//= Any Athena Version
+//===== Description: =========================================
+//= Warp Points for Prontera Arena and PvP Maps
+//===== Additional Comments: =================================
+//= Split off npc_warp.txt
+//============================================================
+
+//Prontera Arena
+prt_are_in.gat,127,82,0 warp warp1082 1,1,prt_are_in.gat,156,82
+prt_are_in.gat,152,82,0 warp warp1083 1,1,prt_are_in.gat,123,82
+prt_are_in.gat,169,122,0 warp warp1084 1,1,prt_are_in.gat,169,92
+prt_are_in.gat,31,122,0 warp warp1076 1,1,prt_are_in.gat,31,92
+prt_are_in.gat,49,82,0 warp warp1077 1,1,prt_are_in.gat,76,82
+prt_are_in.gat,72,82,0 warp warp1078 1,1,prt_are_in.gat,44,82
+prt_are_in.gat,99,24,0 warp warp1079 1,1,izlude.gat,127,221
+prt_are_in.gat,99,47,0 warp warp1080 1,1,prt_are_in.gat,99,76
+prt_are_in.gat,99,72,0 warp warp1081 1,1,prt_are_in.gat,99,43
+
+
+//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,99,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
+
+//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
+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 \ No newline at end of file
diff --git a/object_del.bat b/object_del.bat
index ce11207fc..5cc7074d2 100644
--- a/object_del.bat
+++ b/object_del.bat
@@ -1,15 +1,15 @@
-@echo off
-echo Y | del src\char\*.o
-echo Y | del src\char\GNUmakefile
-echo Y | del src\char_sql\*.o
-echo Y | del src\char_sql\GNUmakefile
-echo Y | del src\common\*.o
-echo Y | del src\common\GNUmakefile
-echo Y | del src\login\*.o
-echo Y | del src\login\GNUmakefile
-echo Y | del src\login_sql\*.o
-echo Y | del src\login_sql\GNUmakefile
-echo Y | del src\map\*.o
-echo Y | del src\map\GNUmakefile
-echo Y | del *.exe
-
+@echo off
+echo Y | del src\char\*.o
+echo Y | del src\char\GNUmakefile
+echo Y | del src\char_sql\*.o
+echo Y | del src\char_sql\GNUmakefile
+echo Y | del src\common\*.o
+echo Y | del src\common\GNUmakefile
+echo Y | del src\login\*.o
+echo Y | del src\login\GNUmakefile
+echo Y | del src\login_sql\*.o
+echo Y | del src\login_sql\GNUmakefile
+echo Y | del src\map\*.o
+echo Y | del src\map\GNUmakefile
+echo Y | del *.exe
+
diff --git a/readme.html b/readme.html
index 79d4b6405..dfee8504c 100644
--- a/readme.html
+++ b/readme.html
@@ -1,198 +1,198 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./readme/1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./readme/banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./readme/readmelefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./readme/whttabbg.jpg">
- <b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./readme/readmerighttab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./readme/btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./readme/grntabbg.jpg" class="tab">
- <a href="./readme/support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./readme/grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./readme/topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./readme/toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Thank you for downloading eAthena 1.0.0
- </td>
- <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-eAthena is an emulator for Ragnarok Online servers.
-It's written in C, and is
-cross-platform. The officially supported platforms are Win32 and Linux.
-<p>We hope you enjoy using it!</p>
-<p>eAthena is licensed under the GPL, meaning it's open source :) There
-is no public CVS provided, however.</p>
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- The eAthena Development Team
- </td>
- <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-eAthena is based on the original
-Athena, by the
-Japanese Development Team.<br>
-A big thanks to them for working hard on Athena.<br>
- <br>
-Valaris<br>
-Mugendai<br>
-fritz<br>
-Wizputer<br>
-Aria<br>
-Nana<br>
-Shinigami<br>
-Darkchild<br>
-Lupus<br>
-moonsoul<br>
-MouseJstr<br>
-kobra_k88<br>
-Codemaster<br>
-Davidsiaw<br>
-Mass Zero<br>
-MC_Cameri<br>
-Spira<br>
-Lord<br>
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Special Thanks
- </td>
- <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-The eAthena development team would
-like to specially
-thank:<br>
- <br>
-The Japanese Development Team. A big thanks to them for
-working hard on Athena which eAthena is based on.<br>
- <br>
-RoVeRT, our ex-developer. eAthena wouldn't have this many
-features without him!<br>
- <br>
-sara-chan, who had also contributed alot to the development
-of eAthena! Thanks!<br>
- <br>
-AppleGirl, now ex-developer, previously lead the team and contributed alot of work.<br>
- <br>
-yor, for his work he did on login and char servers, not to mention
-ladmin.<br>
- <br>
-Gravity, for making Ragnarok Online. eAthena wouldn't even
-exist if it wasn't for them!<br>
- <br>
-ASB for hosting our forum section :)<br>
- <br>
-DeltaAnime for hosting our official forums among other things :)<br>
- <br>
-Ketonom for putting together a nice Win32 installer for the noobs and
-converting mob and item databases to sql.<br>
- <br>
- <br>
- <br>
- <br>
- <br>
-And others who gave continuously endless support to eAthena!<br>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./readme/btmcontentbg.jpg" height="12" align="left">
- <img src="./readme/btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./readme/btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./readme/1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./readme/banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./readme/readmelefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./readme/whttabbg.jpg">
+ <b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./readme/readmerighttab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./readme/btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./readme/grntabbg.jpg" class="tab">
+ <a href="./readme/support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./readme/grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./readme/topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./readme/toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Thank you for downloading eAthena 1.0.0
+ </td>
+ <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+eAthena is an emulator for Ragnarok Online servers.
+It's written in C, and is
+cross-platform. The officially supported platforms are Win32 and Linux.
+<p>We hope you enjoy using it!</p>
+<p>eAthena is licensed under the GPL, meaning it's open source :) There
+is no public CVS provided, however.</p>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ The eAthena Development Team
+ </td>
+ <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+eAthena is based on the original
+Athena, by the
+Japanese Development Team.<br>
+A big thanks to them for working hard on Athena.<br>
+ <br>
+Valaris<br>
+Mugendai<br>
+fritz<br>
+Wizputer<br>
+Aria<br>
+Nana<br>
+Shinigami<br>
+Darkchild<br>
+Lupus<br>
+moonsoul<br>
+MouseJstr<br>
+kobra_k88<br>
+Codemaster<br>
+Davidsiaw<br>
+Mass Zero<br>
+MC_Cameri<br>
+Spira<br>
+Lord<br>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Special Thanks
+ </td>
+ <td background="./readme/rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+The eAthena development team would
+like to specially
+thank:<br>
+ <br>
+The Japanese Development Team. A big thanks to them for
+working hard on Athena which eAthena is based on.<br>
+ <br>
+RoVeRT, our ex-developer. eAthena wouldn't have this many
+features without him!<br>
+ <br>
+sara-chan, who had also contributed alot to the development
+of eAthena! Thanks!<br>
+ <br>
+AppleGirl, now ex-developer, previously lead the team and contributed alot of work.<br>
+ <br>
+yor, for his work he did on login and char servers, not to mention
+ladmin.<br>
+ <br>
+Gravity, for making Ragnarok Online. eAthena wouldn't even
+exist if it wasn't for them!<br>
+ <br>
+ASB for hosting our forum section :)<br>
+ <br>
+DeltaAnime for hosting our official forums among other things :)<br>
+ <br>
+Ketonom for putting together a nice Win32 installer for the noobs and
+converting mob and item databases to sql.<br>
+ <br>
+ <br>
+ <br>
+ <br>
+ <br>
+And others who gave continuously endless support to eAthena!<br>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./readme/btmcontentbg.jpg" height="12" align="left">
+ <img src="./readme/btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./readme/btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/1final.css b/readme/1final.css
index 50f515707..223767b6f 100644
--- a/readme/1final.css
+++ b/readme/1final.css
@@ -1,64 +1,64 @@
-a {
- color: #C9C9C9;
- text-decoration: none;
- background-color : inherit;
-}
-
-a:link {
- color: #C9C9C9;
- text-decoration: none;
- background-color : inherit;
-}
-
-a:visited {
-color: #C9C9C9;
-text-decoration: none;
-background-color : inherit;
-}
-
-a:active {
-color: #000;
-text-decoration: none;
-background-color : inherit;
-}
-
-a:hover {
-color: #000;
-text-decoration: underline;
-background-color : inherit;
-}
-
-body {
- margin: 0px 20px 20px 0px;
- font-size: 11px;
- font-family: Lucila, Arial, Helvetica;
- background: #B1DAB2;
- color: #000;
-}
-
-.tab a,
-.tab a:link,
-.tab a:visited {
- background: transparent;
- color: #C9C9C9;
- text-decoration: none;
-}
-
-.tab a:hover,
-.tab a:active {
- background: transparent;
- color: #748C33;
- text-decoration: underline;
-}
-
-.header {
- border-bottom: 1px solid #99C;
- font-size: 37px;
- font-family: Garamond, Lucila, Helvetica;
- padding: 3px;
-}
-
-.content {
- padding: 5px;
- color: #424242;
+a {
+ color: #C9C9C9;
+ text-decoration: none;
+ background-color : inherit;
+}
+
+a:link {
+ color: #C9C9C9;
+ text-decoration: none;
+ background-color : inherit;
+}
+
+a:visited {
+color: #C9C9C9;
+text-decoration: none;
+background-color : inherit;
+}
+
+a:active {
+color: #000;
+text-decoration: none;
+background-color : inherit;
+}
+
+a:hover {
+color: #000;
+text-decoration: underline;
+background-color : inherit;
+}
+
+body {
+ margin: 0px 20px 20px 0px;
+ font-size: 11px;
+ font-family: Lucila, Arial, Helvetica;
+ background: #B1DAB2;
+ color: #000;
+}
+
+.tab a,
+.tab a:link,
+.tab a:visited {
+ background: transparent;
+ color: #C9C9C9;
+ text-decoration: none;
+}
+
+.tab a:hover,
+.tab a:active {
+ background: transparent;
+ color: #748C33;
+ text-decoration: underline;
+}
+
+.header {
+ border-bottom: 1px solid #99C;
+ font-size: 37px;
+ font-family: Garamond, Lucila, Helvetica;
+ padding: 3px;
+}
+
+.content {
+ padding: 5px;
+ color: #424242;
} \ No newline at end of file
diff --git a/readme/changelog.html b/readme/changelog.html
index 622703d1e..acac901f6 100644
--- a/readme/changelog.html
+++ b/readme/changelog.html
@@ -1,173 +1,173 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg">
- <b>Change</b><font color="#698069">log</font>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- eAthena Changelog
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-This is what has changed from eAthena 1.0.0 RC1 -&gt;
-eAthena 1.0.0 Final
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Detailed Changelog
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content"><font face="Courier New" size="2"><pre>
- .ZWBBBBBBBBBBBBBBBB0WWWWWWWWW@@@WW@WWWWW@M00Wi
- 2MMMWBBBBBBBBWWWWWWWM@@WBBB808Z8ZZZ8Z88Z88Z800WMM;
- MMMWBBBWBWWWW@BBW0088088aZZ888W00B0B0888ZZ8Z80800@MX
- WMMWWWWWW@@WB08aZZZ80WM0ZMMM@WWW@@M@WW@W@@W@@WW088880MW
- :MMM@@@WB08Zaa80BW@M@W@M0riSMMWBWBBM;MMW0WWB@B0WW@@WMMW0@M
- 7MMWB0ZZZZZ8BW@WWWBW0WBM0SZ; 2MM@BBBM@ @MW0B0WMB0BW0W0MMMMM@
- 7M@Z888Z80BWMWWBBB@WWWB@MWM7 ;@M@WBWM0 BM@BB0MMW8BBW0@@WWMM0
- M@800Z0W@WWBWBWWB@M7MW@Mr:M . WMMWWWM MMMB0WM@@0WB0B@@WW@Mr
- MM880W@WWBBBW@0BBBM2;MBMBX.W ,, .MMWBMZ :ZMMB@8@M@BMB8B@WWWMM.
- 2M80BWWWWWBB@ZWBBB@M ;MWMra M .,,,. MMMMM X8MM@@2MMWWMB0@W@WWMM
- MMW@WBWWBBBBMiM0WBMB 7MM0r M .,,,.,.; rMMM; XMMM;MMW@@@BBW@WW@M2
- MMWBBB@BWWW@8:M@WMMr iMMWr M .,,,,,. ;MM0 2MMi MMW@WW@WWWWWMM.
- M@BWBB@0WBBMZZM0WM7 MMi M, ,..,,,., MMMMMMMMMX rM@WWWW@WW@WWMM
- MBBBBBWBBBMM. MBMZ MM . 7S ,,,,,,,, MMMMMMMMa,MMM 2MWWWW@WWWWWWMM
- SMBBBBBWBWBMS MWM0MMMMMM ,.:W ,,:,,,,: M@BBBB@M8 MMMiMM@MWWW@WWWWWMB
- MMWBBWBWBW@M, MMZWMMWMMW ,. . :.,,,,., .M0WWWBBWMS aM;MZM@WW@WW@WWMMi
- M@BBWB0MBBMB MMMaMWB0BWM ,,,.,.,,,,,,: BM0@@@WWBMM aMM;MM@W@W@WWWWMM.
- MBWBWB0MWWM ;M2 MMBBWWBBMM .,,,,,,,.,,,i BM0W@@MWWBM@ MZ ZMWWWWWWWWWWMM
- M0WBBB0M8WM.MZ MWWWM@MWBM :,.,,.:,,,.: iM0W@W@@BWMM M2 ZM@WWW@WWW@WWMM
- M0WBBB0MB0MMM MBBWMBBW0MM ::,,:.,.,,,, MM@MM@@BWMM MX.a@M@WWWWBWWWW@Mi
- M0BBWB0@M MMZ MWWWMWW@0MM :,..,.,,,,,,, MMMMMM@a8MM M2:ZiMMWWWWWWWWWWMM
- MBWBWBBBM MZ MMMMMM@M0@M i:,,,.,,,.,,: M88MMi M 7MrWMWWWWWWWWWWWW
- MWBBB0BBM, MM MM,,:MMW8MM :.,,,.,,,,,,.: 2;.SM0@M8 20ZrMMWWWWWWWWW@W
- M@BBWBW0MM MM .@8aMB ,,..,.,,,..,,,. XMMMMMM. i:, .2BM.MMWWWWWWWWWWW
- MMBBW0B0@M MM :MMMMMMMMr ,,,,,. .,,..,. .,, a@7:rMW@WWWWWWWWW
- WMBB0BWB0Mi X ZMMMM2 .,,.. aS: .,,..,..,...,.,,,, 2@r;.M0MWWWWWWWWW
- ,MBBBBBB0MM ,:, i ..,,,,, B78r..:,.,,.,,,,,...,...aMi,0Ma@WWWWWWWWW
- MWBBBBBB@M .,,,.. .....,,,,,. ..,,.,,.,.,,,,::,, .Z@ ZMM8B@WWWWWWWW
- M@BBB000BMB ,,.,.....,,.,.,,,....,..,,....,..,,,.,,.,:. :a28MM@W0@@WWWWWWW
- MMWBBBWB8MM ..,.,:,...,:..,,,,,..,,...;:.,,,.,:.,,.., iWMM@W@@0B@WWWWWWW
- 0M0BBBBBBBM; .,,.,,.,,,,,..,,,. eAthena .,,,,,,,,,.,. iaMMWWW@MB8@@WWWWWW
- MWBBBBBB0MM .,.,,.,,,,,.,,.,,. Final ..,.,,,,.,:, iBMMWWWWW@WBBMWWWWWW
- MM0WBBBBBBM@ .,,,,,..,,,.,,,,, 1.0,.,.:,,,,:,., 8MMMWWWWW@WW00@WWWWWW
- ZM0WBBBBBZMMM ...,,,,.,,,,,..,.,,,.:,.,:. ZMMMWBW@WWWWWMW8W@@WWWW
- M@WBWBBB0WMMMMM, ,..,.,,,,,,,,,,,,,,,. .MMMM@W@@WW@@W@BW@0B@@WWWW
- 8MBWBBWBB0@W@MMMMMB: ..,,i.,,:,,,... rMMMMWWWWW@@WWWWMBMMB8W@@@WW
- MMBBWBBWBW@WWWW@MMMMMW; .,.,.. WMM,MWWW@WWWMWWM@@@@W@W0BMBWWW
- 8MB0@B0WB0@@@W@B@W@@MMMMMMM2. BMMZ7r,MWW@@W@BWMXMM@@WWW@B0MW@WW
- MM0WM00W8W@@B@WWWWWWWWMM SWMMMMWBW0MM877XSSiMW@WWWWWWM2 MMWWWW@00WWWWW
- 2@B0MWBWB0WWWWWWWWWWWWWMS77rrXX222SX7XXSSSX;MB@WW@WWWMM MWWWW@WBB@WWW</pre>
-</font>
-<br>
-<br>
-<iframe src="../Changelog.txt" name="Changelog"
- title="eAthena Changelog" marginwidth="10" marginheight="10" border="0"
- allowtransparency="true" frameborder="0" height="500" width="100%"></iframe></font>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg">
+ <b>Change</b><font color="#698069">log</font>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ eAthena Changelog
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+This is what has changed from eAthena 1.0.0 RC1 -&gt;
+eAthena 1.0.0 Final
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Detailed Changelog
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content"><font face="Courier New" size="2"><pre>
+ .ZWBBBBBBBBBBBBBBBB0WWWWWWWWW@@@WW@WWWWW@M00Wi
+ 2MMMWBBBBBBBBWWWWWWWM@@WBBB808Z8ZZZ8Z88Z88Z800WMM;
+ MMMWBBBWBWWWW@BBW0088088aZZ888W00B0B0888ZZ8Z80800@MX
+ WMMWWWWWW@@WB08aZZZ80WM0ZMMM@WWW@@M@WW@W@@W@@WW088880MW
+ :MMM@@@WB08Zaa80BW@M@W@M0riSMMWBWBBM;MMW0WWB@B0WW@@WMMW0@M
+ 7MMWB0ZZZZZ8BW@WWWBW0WBM0SZ; 2MM@BBBM@ @MW0B0WMB0BW0W0MMMMM@
+ 7M@Z888Z80BWMWWBBB@WWWB@MWM7 ;@M@WBWM0 BM@BB0MMW8BBW0@@WWMM0
+ M@800Z0W@WWBWBWWB@M7MW@Mr:M . WMMWWWM MMMB0WM@@0WB0B@@WW@Mr
+ MM880W@WWBBBW@0BBBM2;MBMBX.W ,, .MMWBMZ :ZMMB@8@M@BMB8B@WWWMM.
+ 2M80BWWWWWBB@ZWBBB@M ;MWMra M .,,,. MMMMM X8MM@@2MMWWMB0@W@WWMM
+ MMW@WBWWBBBBMiM0WBMB 7MM0r M .,,,.,.; rMMM; XMMM;MMW@@@BBW@WW@M2
+ MMWBBB@BWWW@8:M@WMMr iMMWr M .,,,,,. ;MM0 2MMi MMW@WW@WWWWWMM.
+ M@BWBB@0WBBMZZM0WM7 MMi M, ,..,,,., MMMMMMMMMX rM@WWWW@WW@WWMM
+ MBBBBBWBBBMM. MBMZ MM . 7S ,,,,,,,, MMMMMMMMa,MMM 2MWWWW@WWWWWWMM
+ SMBBBBBWBWBMS MWM0MMMMMM ,.:W ,,:,,,,: M@BBBB@M8 MMMiMM@MWWW@WWWWWMB
+ MMWBBWBWBW@M, MMZWMMWMMW ,. . :.,,,,., .M0WWWBBWMS aM;MZM@WW@WW@WWMMi
+ M@BBWB0MBBMB MMMaMWB0BWM ,,,.,.,,,,,,: BM0@@@WWBMM aMM;MM@W@W@WWWWMM.
+ MBWBWB0MWWM ;M2 MMBBWWBBMM .,,,,,,,.,,,i BM0W@@MWWBM@ MZ ZMWWWWWWWWWWMM
+ M0WBBB0M8WM.MZ MWWWM@MWBM :,.,,.:,,,.: iM0W@W@@BWMM M2 ZM@WWW@WWW@WWMM
+ M0WBBB0MB0MMM MBBWMBBW0MM ::,,:.,.,,,, MM@MM@@BWMM MX.a@M@WWWWBWWWW@Mi
+ M0BBWB0@M MMZ MWWWMWW@0MM :,..,.,,,,,,, MMMMMM@a8MM M2:ZiMMWWWWWWWWWWMM
+ MBWBWBBBM MZ MMMMMM@M0@M i:,,,.,,,.,,: M88MMi M 7MrWMWWWWWWWWWWWW
+ MWBBB0BBM, MM MM,,:MMW8MM :.,,,.,,,,,,.: 2;.SM0@M8 20ZrMMWWWWWWWWW@W
+ M@BBWBW0MM MM .@8aMB ,,..,.,,,..,,,. XMMMMMM. i:, .2BM.MMWWWWWWWWWWW
+ MMBBW0B0@M MM :MMMMMMMMr ,,,,,. .,,..,. .,, a@7:rMW@WWWWWWWWW
+ WMBB0BWB0Mi X ZMMMM2 .,,.. aS: .,,..,..,...,.,,,, 2@r;.M0MWWWWWWWWW
+ ,MBBBBBB0MM ,:, i ..,,,,, B78r..:,.,,.,,,,,...,...aMi,0Ma@WWWWWWWWW
+ MWBBBBBB@M .,,,.. .....,,,,,. ..,,.,,.,.,,,,::,, .Z@ ZMM8B@WWWWWWWW
+ M@BBB000BMB ,,.,.....,,.,.,,,....,..,,....,..,,,.,,.,:. :a28MM@W0@@WWWWWWW
+ MMWBBBWB8MM ..,.,:,...,:..,,,,,..,,...;:.,,,.,:.,,.., iWMM@W@@0B@WWWWWWW
+ 0M0BBBBBBBM; .,,.,,.,,,,,..,,,. eAthena .,,,,,,,,,.,. iaMMWWW@MB8@@WWWWWW
+ MWBBBBBB0MM .,.,,.,,,,,.,,.,,. Final ..,.,,,,.,:, iBMMWWWWW@WBBMWWWWWW
+ MM0WBBBBBBM@ .,,,,,..,,,.,,,,, 1.0,.,.:,,,,:,., 8MMMWWWWW@WW00@WWWWWW
+ ZM0WBBBBBZMMM ...,,,,.,,,,,..,.,,,.:,.,:. ZMMMWBW@WWWWWMW8W@@WWWW
+ M@WBWBBB0WMMMMM, ,..,.,,,,,,,,,,,,,,,. .MMMM@W@@WW@@W@BW@0B@@WWWW
+ 8MBWBBWBB0@W@MMMMMB: ..,,i.,,:,,,... rMMMMWWWWW@@WWWWMBMMB8W@@@WW
+ MMBBWBBWBW@WWWW@MMMMMW; .,.,.. WMM,MWWW@WWWMWWM@@@@W@W0BMBWWW
+ 8MB0@B0WB0@@@W@B@W@@MMMMMMM2. BMMZ7r,MWW@@W@BWMXMM@@WWW@B0MW@WW
+ MM0WM00W8W@@B@WWWWWWWWMM SWMMMMWBW0MM877XSSiMW@WWWWWWM2 MMWWWW@00WWWWW
+ 2@B0MWBWB0WWWWWWWWWWWWWMS77rrXX222SX7XXSSSX;MB@WW@WWWMM MWWWW@WBB@WWW</pre>
+</font>
+<br>
+<br>
+<iframe src="../Changelog.txt" name="Changelog"
+ title="eAthena Changelog" marginwidth="10" marginheight="10" border="0"
+ allowtransparency="true" frameborder="0" height="500" width="100%"></iframe></font>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/faq.html b/readme/faq.html
index 4ccf80992..ab296cf98 100644
--- a/readme/faq.html
+++ b/readme/faq.html
@@ -1,200 +1,200 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>FAQ</b>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Frequently Asked Questions
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<span style="font-weight: bold;">Q</span>:
-I get the error message
-"This application has failed to start because cygwin1.dll was not
-found. Re-installing the application may fix this problem."<br>
- <span style="font-weight: bold;">A</span>: You're missing
-the cygwin
-dlls. Please get the latest dll at: http://www.cygwin.com/snapshot. If
-you're unsure, asking around in our IRC chatroom will get you around
-too, but always remember - use common sense and search before asking.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: My map-server
-won't load! It
-appears to be loading things before it dissapeared suddenly! HELP!<br>
- <span style="font-weight: bold;">A</span>: Use command line
-to load
-map-server. It should tell you the error. If you're missing a map,
-update your kRO Sakray or comment the map from map_athena.conf. If you
-have an errornous NPC, fix it or comment it off. Anything other than
-that, feel free to ask around.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: My map-server
-failed to load
-'adata.grf'! Where do I find this adata.grf? My map-server won't load
-without it!<br>
- <span style="font-weight: bold;">A</span>: The error that
-caused the
-map-server to not load is not the adata.grf. adata.grf is NOT a
-requirement for the map-server to load. The error is probably related
-to something else.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: All 3 of the
-servers are
-loaded, but I am still having problems accessing it! What do I do?<br>
- <span style="font-weight: bold;">A</span>: First, check the
-IPs in
-map_athena.conf and char_athena.conf. If those are correct, check the
-ports to make sure they match. If that's correct too, you probably
-cannot handle the server load. Lower the monster spawning rate using
-mob_count in battle_athena.conf and it should be fine.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: How do I start
-Guild
-Wars/War of Emperium??? HELP!!!<br>
- <span style="font-weight: bold;">A</span>: Read the GM
-Command page for
-full list of commands that GMs can use, including the command for this.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: My Ragnarok
-Online crashed
-while playing with eAthena! What do I do now?<br>
- <span style="font-weight: bold;">A</span>: Well, if your
-Ragnarok
-crashes, it's most probably not anything to do with eAthena. Something
-is wrong with your Ragnarok installation. Try reinstalling or updating.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: Is eAthena
-compatible with
-mySQL? Can I use mySQL as the DB instead of using text files?<br>
- <span style="font-weight: bold;">A</span>: Yes, eAthena is
-compatible
-with mySQL. A tutorial on how to setup this is coming soon.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: Is eAthena
-compatible with
-msSQL? Can I use msSQL as the DB instead of using text files?<br>
- <span style="font-weight: bold;">A</span>: No, eAthena is
-not
-compatible with msSQL. You cannot use msSQL with eAthena.<br>
- <br>
- <span style="font-weight: bold;">Q</span>: I found a bug!
-Where do I
-report it?<br>
- <span style="font-weight: bold;">A</span>: Drop the
-developers a line
-at the IRC chatroom. Or just post it in the bug report forum. We check
-them out too. :)<br>
- <br>
- <span style="font-weight: bold;">Q</span>: I know alot of C
-and I'm
-able to help improve eAthena and add new features. How can I join your
-development team?<br>
- <span style="font-weight: bold;">A</span>: Try talking to
-one of the
-current developers in the eAthena channel.<span
- style="font-weight: bold;"><br>
- </span>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>FAQ</b>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Frequently Asked Questions
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<span style="font-weight: bold;">Q</span>:
+I get the error message
+"This application has failed to start because cygwin1.dll was not
+found. Re-installing the application may fix this problem."<br>
+ <span style="font-weight: bold;">A</span>: You're missing
+the cygwin
+dlls. Please get the latest dll at: http://www.cygwin.com/snapshot. If
+you're unsure, asking around in our IRC chatroom will get you around
+too, but always remember - use common sense and search before asking.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: My map-server
+won't load! It
+appears to be loading things before it dissapeared suddenly! HELP!<br>
+ <span style="font-weight: bold;">A</span>: Use command line
+to load
+map-server. It should tell you the error. If you're missing a map,
+update your kRO Sakray or comment the map from map_athena.conf. If you
+have an errornous NPC, fix it or comment it off. Anything other than
+that, feel free to ask around.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: My map-server
+failed to load
+'adata.grf'! Where do I find this adata.grf? My map-server won't load
+without it!<br>
+ <span style="font-weight: bold;">A</span>: The error that
+caused the
+map-server to not load is not the adata.grf. adata.grf is NOT a
+requirement for the map-server to load. The error is probably related
+to something else.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: All 3 of the
+servers are
+loaded, but I am still having problems accessing it! What do I do?<br>
+ <span style="font-weight: bold;">A</span>: First, check the
+IPs in
+map_athena.conf and char_athena.conf. If those are correct, check the
+ports to make sure they match. If that's correct too, you probably
+cannot handle the server load. Lower the monster spawning rate using
+mob_count in battle_athena.conf and it should be fine.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: How do I start
+Guild
+Wars/War of Emperium??? HELP!!!<br>
+ <span style="font-weight: bold;">A</span>: Read the GM
+Command page for
+full list of commands that GMs can use, including the command for this.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: My Ragnarok
+Online crashed
+while playing with eAthena! What do I do now?<br>
+ <span style="font-weight: bold;">A</span>: Well, if your
+Ragnarok
+crashes, it's most probably not anything to do with eAthena. Something
+is wrong with your Ragnarok installation. Try reinstalling or updating.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: Is eAthena
+compatible with
+mySQL? Can I use mySQL as the DB instead of using text files?<br>
+ <span style="font-weight: bold;">A</span>: Yes, eAthena is
+compatible
+with mySQL. A tutorial on how to setup this is coming soon.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: Is eAthena
+compatible with
+msSQL? Can I use msSQL as the DB instead of using text files?<br>
+ <span style="font-weight: bold;">A</span>: No, eAthena is
+not
+compatible with msSQL. You cannot use msSQL with eAthena.<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: I found a bug!
+Where do I
+report it?<br>
+ <span style="font-weight: bold;">A</span>: Drop the
+developers a line
+at the IRC chatroom. Or just post it in the bug report forum. We check
+them out too. :)<br>
+ <br>
+ <span style="font-weight: bold;">Q</span>: I know alot of C
+and I'm
+able to help improve eAthena and add new features. How can I join your
+development team?<br>
+ <span style="font-weight: bold;">A</span>: Try talking to
+one of the
+current developers in the eAthena channel.<span
+ style="font-weight: bold;"><br>
+ </span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/features.html b/readme/features.html
index 4b0365ee4..a437772c2 100644
--- a/readme/features.html
+++ b/readme/features.html
@@ -1,276 +1,276 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>Features</b>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- eAthena Changelog
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<ul>
- <li>&nbsp;PvP (Player VS Player)</li>
- <li>&nbsp;GvG (Guild VS Guild)</li>
- <li>&nbsp;qPets (Cute Pets)</li>
- <li>&nbsp;Monster skills</li>
- <li>&nbsp;2-2 Jobs (Alternate 2nd Jobs)</li>
- <li>&nbsp;SuperNovice (Alternate 1st Job)</li>
- <li>&nbsp;WoE (War of Emperium)</li>
- <li>&nbsp;Remote administration of accounts (ladmin softwares)</li>
- <li>&nbsp;Weddings</li>
- <li>&nbsp;Pet equipped mobs.<br>
- </li>
- <li>&nbsp;Management of day/night.</li>
- <li>&nbsp;Mob Disguises</li>
- <li>&nbsp;Weather and other special effects.<br>
- </li>
-</ul>
-eAthena 1.0.0
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- eAthena Features - Estimated completion rate (Detailed)
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<ul>
- <li>Novice Skills - 100% (3/3)</li>
- <li>1st Job Skills - 100%</li>
- <ul>
- <li>&nbsp;&nbsp;&nbsp; Swordsman - 100% (10/10)</li>
- </ul>
- <ul>
- <li>&nbsp;&nbsp;&nbsp; Acolyte - 100% (16/16)</li>
- </ul>
- <ul>
- <li>&nbsp;&nbsp;&nbsp; Archer - 100% (7/7)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Magician - 100% (14/14)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Merchant - 100% (10/10)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Thief - 100% (10/10)</li>
- </ul>
- <li>2-1 Skills (2nd Job Skills) - 100%</li>
- <ul>
- <li>&nbsp; &nbsp; Knight - 100% (10/10)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Priest - 100% (18/18)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; BlackSmith - 100% (21/21)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Wizard - 100% (13/13)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Assassin - 100% (10/10)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Hunter - 100% (17/17)</li>
- </ul>
- <li>2-2 Skills (Alternate 2nd Job Skills) - 91%</li>
- <ul>
- <li>&nbsp; &nbsp; Crusader - 100% (18/18)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Monk - 100% (15/15)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Alchemist - 63% (14/22)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Sage - 100% (20/20)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Rogue - 80% Complete:(12/15) Incomplete:(3/15)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Bard - 100% (16/16)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Dancer - 100% (16/16)</li>
- </ul>
- <li>2-1-1 Skills (Advanced 2-1 Job Skills) - 80.5%</li>
- <ul>
- <li>&nbsp; &nbsp; Lord Knight - 94% - Complete:(7/8)
-Incomplete:(1/8)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; High Priest - 66% - Complete:(1/3)
-Incomplete:(2/3)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; High Wizard - 100% (4/4)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Whitesmith - 75% (3/4)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Sniper - 88% - Complete:(3/4) Incomplete:(1/4)</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Assassin Cross - 60% (3/5)</li>
- </ul>
- <li>2-2-1 Skills (Advanced 2-2 Job Skills) - 47%</li>
- <ul>
- <li>&nbsp; &nbsp; Paladin - 65%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Champion - 100%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Professor - 100%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Stalker - 65%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Creator - 0%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Clown - 0%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Gypsy - 0%</li>
- </ul>
- <li>Pet Skills - 95%</li>
- <ul>
- <li>&nbsp; &nbsp; Loot Skills - 100%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Buff Skills - 100%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Attack Skills - 90%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Assist Skills - 100%</li>
- </ul>
- <li>Equipment Breaking System - 80%</li>
- <ul>
- <li>&nbsp; &nbsp; Weapon Breaking - 95%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Armor Breaking - 95%</li>
- </ul>
- <ul>
- <li>&nbsp; &nbsp; Equipment Repair - 50%</li>
- </ul>
- <li>PK Server Mode - ??%</li>
- <ul>
- <li>&nbsp; &nbsp; Need more info on this mode to be called complete.</li>
- </ul>
-</ul>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>Features</b>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ eAthena Changelog
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<ul>
+ <li>&nbsp;PvP (Player VS Player)</li>
+ <li>&nbsp;GvG (Guild VS Guild)</li>
+ <li>&nbsp;qPets (Cute Pets)</li>
+ <li>&nbsp;Monster skills</li>
+ <li>&nbsp;2-2 Jobs (Alternate 2nd Jobs)</li>
+ <li>&nbsp;SuperNovice (Alternate 1st Job)</li>
+ <li>&nbsp;WoE (War of Emperium)</li>
+ <li>&nbsp;Remote administration of accounts (ladmin softwares)</li>
+ <li>&nbsp;Weddings</li>
+ <li>&nbsp;Pet equipped mobs.<br>
+ </li>
+ <li>&nbsp;Management of day/night.</li>
+ <li>&nbsp;Mob Disguises</li>
+ <li>&nbsp;Weather and other special effects.<br>
+ </li>
+</ul>
+eAthena 1.0.0
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ eAthena Features - Estimated completion rate (Detailed)
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<ul>
+ <li>Novice Skills - 100% (3/3)</li>
+ <li>1st Job Skills - 100%</li>
+ <ul>
+ <li>&nbsp;&nbsp;&nbsp; Swordsman - 100% (10/10)</li>
+ </ul>
+ <ul>
+ <li>&nbsp;&nbsp;&nbsp; Acolyte - 100% (16/16)</li>
+ </ul>
+ <ul>
+ <li>&nbsp;&nbsp;&nbsp; Archer - 100% (7/7)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Magician - 100% (14/14)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Merchant - 100% (10/10)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Thief - 100% (10/10)</li>
+ </ul>
+ <li>2-1 Skills (2nd Job Skills) - 100%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Knight - 100% (10/10)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Priest - 100% (18/18)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; BlackSmith - 100% (21/21)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Wizard - 100% (13/13)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Assassin - 100% (10/10)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Hunter - 100% (17/17)</li>
+ </ul>
+ <li>2-2 Skills (Alternate 2nd Job Skills) - 91%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Crusader - 100% (18/18)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Monk - 100% (15/15)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Alchemist - 63% (14/22)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Sage - 100% (20/20)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Rogue - 80% Complete:(12/15) Incomplete:(3/15)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Bard - 100% (16/16)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Dancer - 100% (16/16)</li>
+ </ul>
+ <li>2-1-1 Skills (Advanced 2-1 Job Skills) - 80.5%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Lord Knight - 94% - Complete:(7/8)
+Incomplete:(1/8)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; High Priest - 66% - Complete:(1/3)
+Incomplete:(2/3)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; High Wizard - 100% (4/4)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Whitesmith - 75% (3/4)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Sniper - 88% - Complete:(3/4) Incomplete:(1/4)</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Assassin Cross - 60% (3/5)</li>
+ </ul>
+ <li>2-2-1 Skills (Advanced 2-2 Job Skills) - 47%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Paladin - 65%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Champion - 100%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Professor - 100%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Stalker - 65%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Creator - 0%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Clown - 0%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Gypsy - 0%</li>
+ </ul>
+ <li>Pet Skills - 95%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Loot Skills - 100%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Buff Skills - 100%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Attack Skills - 90%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Assist Skills - 100%</li>
+ </ul>
+ <li>Equipment Breaking System - 80%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Weapon Breaking - 95%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Armor Breaking - 95%</li>
+ </ul>
+ <ul>
+ <li>&nbsp; &nbsp; Equipment Repair - 50%</li>
+ </ul>
+ <li>PK Server Mode - ??%</li>
+ <ul>
+ <li>&nbsp; &nbsp; Need more info on this mode to be called complete.</li>
+ </ul>
+</ul>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/gmcommands.html b/readme/gmcommands.html
index bceaef774..71597fa22 100644
--- a/readme/gmcommands.html
+++ b/readme/gmcommands.html
@@ -1,736 +1,736 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>GM</b><font color="#698069">commands</font>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- GM Command List
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<font face="Verdana" size="2"><span class="GMCommandTitle">ANNOUNCEMENT COMMANDS</span>
-<span class="GMCommand">/b &lt;message&gt;<br>@broadcast &lt;message&gt;</span>
-Lets you make a GM global announcement with your name
-
-<span class="GMCommand">/nb &lt;message&gt;<br>@kamu &lt;message&gt;</span>
-Lets you make a GM global announcement withouth your name
-
-<span class="GMCommand">@kamib &lt;message&gt;<br>/bb &lt;message&gt;</span>
-Lets you make a GM global announcement withouth your name in blue
-
-<span class="GMCommandTitle">INFORMATION COMMANDS</span>
-<span class="GMCommand">@who [match_text]</span> <br>Lists who is currently online in your server and their location. [match_text] is optional <br><br><span
- class="GMCommand">@who2 [match_text] </span>
-Lists who is currently online in your server and their job. [match_text] is optional
-
-<span class="GMCommand">@who3 [match_text]</span> <br>Lists who is currently online in your server and their party/guild. [match_text] is optional<br><br><span
- class="GMCommand">@whomap [map]</span> <br>Display a listing of who is online and where in a specifical map<br><br><span
- class="GMCommand">@whomap2 [map]</span> <br>Display a listing of who is online and their job in a specifical map<br><br><span
- class="GMCommand">@whomap3 [map]</span> <br>Display a listing of who is online and their party/guild in a specifical map<br><br><span
- class="GMCommand">@whogm [match_text]</span> <br>Like @who+@who2+who3, but only for GM. [match_text] is optional <br><br><span
- class="GMCommand">@where &lt;char name&gt;</span>
-Tells you the location of a character
-
-<span class="GMCommand">@charstatsall</span>
- Displays stats of all characters.
-
-<span class="GMCommand">@charitemlist &lt;char name&gt;</span>
- Displays all items of a player.
-
-<span class="GMCommand">@charstoragelist &lt;char name&gt;</span>
- Displays all items of a player's storage.
-
-<span class="GMCommand">@charcartlist &lt;char name&gt;</span>
- Displays all items of a player's cart.
-<span class="GMCommand">@uptime</span><br>Displays how long the map-server has been running.<br><br>
-<span class="GMCommand">@time<br>@date<br>@server_date<br>@serverdate<br>@server_time<br>@servertime</span>
-Display the date/time of the server
-
-<span class="GMCommand">@idsearch &lt;part_of_item_name&gt;</span>
-Search all items that name have part_of_item_name
-
-<span class="GMCommand">@ignorelist</span>
-Displays your ignore list
-
-<span class="GMCommand">@mapinfo [&lt;1-3&gt; [map]]</span>
-Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
-
-<span class="GMCommandTitle">CONTROL COMMANDS</span>
-<span class="GMCommand">@die</span>
-Kill yourself :)
-
-<span class="GMCommand">@alive</span>
-Revive yourself from death
-
-<span class="GMCommand">@kill &lt;char name&gt;</span>
-Kills specified character name
-
-<span class="GMCommand"></span><span class="GMCommand">@save</span>
-Sets save point as current location
-
-<span class="GMCommand">@load</span>
-Warps you to your save point (a.k.a. butterfly wing)
-
-<span class="GMCommand">@warp &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>@rura &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>@mapmove &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>/mm &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>/mapmove &lt;map name&gt; &lt;x&gt; &lt;y&gt;</span>
-Warps you to the selected position
-Example:
-@warp morocc 150 160 -&gt; Warps you to Morroc (X:150, Y:160)
-@rura prontera 50 80 -&gt; Warps you to Prontera (X:50, Y:80)
-
-
-<span class="GMCommand">@rura+ &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;<br>@charwarp &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;<br>#banish &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
-Warps the selected character to the selected position
-Example:
-@charwarp morocc 150 160 Sora -&gt; Warps the character 'Sora' to Morroc (X:150, Y:160)
-@rura+ prontera 50 80 Haley -&gt; Warps the character 'Haley' to Prontera (X:50, Y:80)
-
-<span class="GMCommand">@jump [x [y]]</span>
-Teleports you randomly in the map (a.k.a. fly wing). Or to the specified location with x and y.
-
-<span class="GMCommand">/shift &lt;char name&gt;<br>@jumpto &lt;char name&gt;<br>@warpto &lt;char name&gt;<br>@goto &lt;char name&gt;</span>
-Warps you to selected character
-
-<span class="GMCommand">@go &lt;number/city_name&gt;</span>
-Warps you to a set city:</font></pre>
-<table id="table1" border="1" width="90%">
- <tbody>
- <tr>
- <td width="25%"><font face="Verdana" size="2">-3: (Memo Point 2)</font></td>
- <td width="25%"><font face="Verdana" size="2">2: Geffen</font></td>
- <td width="25%"><font face="Verdana" size="2">7: Lutie</font></td>
- <td width="25%"><font face="Verdana" size="2">12: Umbala</font></td>
- </tr>
- <tr>
- <td width="25%"><font face="Verdana" size="2">-2: (Memo Point 1)</font></td>
- <td width="25%"><font face="Verdana" size="2">3: Payon </font> </td>
- <td width="25%"><font face="Verdana" size="2">8: Comodo</font></td>
- <td width="25%"><font face="Verdana" size="2">13: Niflheim</font></td>
- </tr>
- <tr>
- <td width="25%"><font face="Verdana" size="2">-1: (Memo Point 0)</font></td>
- <td width="25%"><font face="Verdana" size="2">4: Alberta</font></td>
- <td width="25%"><font face="Verdana" size="2">9: Yuno</font></td>
- <td width="25%"><font face="Verdana" size="2">14: Louyang</font></td>
- </tr>
- <tr>
- <td width="25%"><font face="Verdana" size="2">0: Prontera</font></td>
- <td width="25%"><font face="Verdana" size="2">5: Izlude</font></td>
- <td width="25%"><font face="Verdana" size="2">10: Amatsu</font></td>
- <td width="25%"><font face="Verdana" size="2">15: Start Point</font></td>
- </tr>
- <tr>
- <td width="25%"><font face="Verdana" size="2">1: Morroc</font></td>
- <td width="25%"><font face="Verdana" size="2">6: Al de Baran</font></td>
- <td width="25%"><font face="Verdana" size="2">11: Gon Ryun</font></td>
- <td width="25%"><font face="Verdana" size="2">16: Prison/Jail</font></td>
- </tr>
- </tbody>
-</table>
-<pre class="style1"><font face="Verdana"><span class="GMCommand">/hide<br>@hide</span>
-GM Hide. Perfect hide that's totally invisible.
-
-<span class="GMCommand">@heal [&lt;HP&gt; &lt;HP&gt;]</span>
-Heals the desired amount of HP and SP. No value specified will do a full heal.
-
-<span class="GMCommand">@storage </span>
-Opens storage
-
-<span class="GMCommand">/recall &lt;char name&gt;<br>@recall &lt;char name&gt;</span>
-Recalls target character to you.
-
-<span class="GMCommand">@recallall</span>
-Recalls everyone on the server to you.
-
-<span class="GMCommand">@guildrecall &lt;guild_name/id&gt;</span>
-Warps all online character of a guild to you.
-
-<span class="GMCommand">@partyrecall &lt;party_name/id&gt;</span>
-Warps all online character of a party to you.
-
-<span class="GMCommand">@revive &lt;char name&gt;</span>
-Revives target character.
-
-<span class="GMCommand">@killmonster</span>
-Kills all spawned monsters on maps
-
-<span class="GMCommandTitle">SPAWNING COMMANDS</span>
-<span class="GMCommand">/item &lt;item_name&gt;<br></span>Gives you 1 of the desired monster<span
- class="GMCommand">
-
-@item &lt;item name or ID&gt; &lt;quantity&gt;</span>
-Gives you the desired item with the desired quantity
-
-<span class="GMCommand">/monster &lt;monster_name&gt;</span><span
- class="faqlist">
-Spawns 1 of the desired monster
-
-</span><span class="GMCommand"><font size="2">@spawn &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]<br>@monster &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]<br>@summon &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]</font></span><font
- size="2"><span class="faqlist">
-</span><span class="GMCommand">@monster2 &lt;desired_monster_name&gt; &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>OR<br>@spawn "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@summon "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster2 "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>OR<br>@spawn &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@summon &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster2 &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]</span>
-</font>
-Spawns the desired monster with any desired name, quantity and x and y location (if specified).
-There 2 last forms can use spaces for desired names (between the "").
-
-<span class="GMCommandTitle">MAP OPTIONS COMMANDS</span>
-
-<span class="GMCommand">@pvpon</span>
-Turns pvp on on the current map
-<span class="GMCommand">@pvpoff</span>
-Turns pvp off on the current map
-<span class="GMCommand">@gvgon</span>
-Turns gvg on on the current map. This does NOT enable War of Emperium.
-<span class="GMCommand">@gvgoff </span>
-Turns gvg off on the current map. This does NOT disable War of Emperium.
-
-<span class="GMCommandTitle">CHARACTER CONTROL COMMANDS</span>
-<span class="GMCommand">@baselvlup &lt;number of levels&gt;</span>
-<span class="GMCommand">@lvup &lt;number of levels&gt;<br>@blevel &lt;number of levels&gt;</span>
-Raises your base level the desired number of levels. The max is 99 (unless you change it in battle_athena.conf).
-
-<span class="GMCommand">@joblvlup &lt;number of levels&gt;</span>
-<span class="GMCommand">@joblvup &lt;number of levels&gt;<br>@jlevel &lt;number of levels&gt;</span>
-Raises your job level the desired number of levels. The max is 50 for 1st and 2nd class, and 70 for advanced classes.
-
-<span class="GMCommand">@job &lt;job ID&gt;<br>@jobchange &lt;job ID&gt;</span>
-Changes your job to the job assigned to the ID</font></pre>
-<table id="table2" border="1" width="90%">
- <tbody>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">0:
-Novice</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">6:
-Thief</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">12:
-Assassin</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">18:
-Alchemist</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">1:
-Swordsman</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">7:
-Knight</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">13:
-Knight w/ Peco</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">19:
-Bard</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">2:
-Mage</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">8:
-Priest</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">14:
-Crusader</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">20:
-Dancer</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">3:
-Archer</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">9:
-Wizard</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">15:
-Monk</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">21:
-Crusader w/ Peco</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">4:
-Acolyte</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">10:
-Blacksmith</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">16:
-Sage</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">22:
-Wedding</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">5:
-Merchant</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">11:
-Hunter</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">17:
-Rogue</font></td>
- <td width="25%"><font style="font-size: 11pt;" face="Verdana">23:
-Super Novice</font></td>
- </tr>
- </tbody>
-</table>
-<table id="table3" border="1" width="90%">
- <tbody>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">24/4001:
-Novice High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">31/4007:
-Thief High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">40/4013:
-Assassin Cross</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">46/4019:
-Creator</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">25/4002:
-Swordsman High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">35/4008:
-Lord Knight</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">41/4014:
-Lord Knight w/ Peco</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">47/4020:
-Clown</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">26/4003:
-Mage High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">36/4009:
-High Priest</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">42/4015:
-Paladin</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">48/4021:
-Gypsy</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">28/4004:
-Archer High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">37/4010:
-High Wizard</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">43/4016:
-Champion</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">49/4022:
-Paladin w/ Peco</font></td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">29/4005:
-Acolyte High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">38/4011:
-Whitesmith</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">44/4017:
-Professor</font></td>
- <td width="25%">&nbsp;</td>
- </tr>
- <tr>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">30/4006:
-Merchant High</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">39/4012:
-Sniper</font></td>
- <td width="25%"><font style="font-size: 9pt;" face="Verdana">45/4018:
-Stalker</font></td>
- <td width="25%">&nbsp;</td>
- </tr>
- </tbody>
-</table>
-<pre class="style1"><font face="Verdana"><span class="GMCommand">@option &lt;param1&gt; &lt;param2&gt; &lt;param3&gt;</span>
-Changes options for your character
- &lt;param1&gt; &lt;param2&gt; (Stackable) &lt;param3&gt; (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 ??? 16 Darkness 16 Falcon
- 32 (Depreciated)
- 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
-
-<span class="GMCommand">@mountpeco</span>
-Will (un)mount on a peco. (Class is required, but not skill)
-
-<span class="GMCommand">@speed &lt;1-1000&gt;</span>
-Changes you walking speed.
-1(Fastest)&lt;---140(Default)-----------------&gt;1000(Slowest)
-
-<span class="GMCommand">@disguise &lt;monster_name_or_monster_ID&gt;</span>
-Change your appearence to other players to a mob.
-
-<span class="GMCommand">@undisguise</span>
-Restore your normal appearance.
-
-<span class="GMCommand">@model &lt;hair ID&gt; &lt;hair color&gt; &lt;clothes color&gt;</span>
-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
-
-<span class="GMCommand">@effect &lt;effect_id&gt; [flag]</span>
- Give an efect to your character.
-
-<span class="GMCommand">@stpoint &lt;number of points&gt;</span>
-Gives you the desired number of stat points.
-
-<span class="GMCommand">@skpoint &lt;number of points&gt;</span>
-Gives you the desired number of skill points.
-
-<span class="GMCommand">@zeny &lt;amount&gt;</span>
-Gives you desired amount of Zeny.
-
-<span class="GMCommand">@str &lt;amount&gt;<br>@agi &lt;amount&gt;<br>@vit &lt;amount&gt;<br>@int &lt;amount&gt;<br>@dex &lt;amount&gt;<br>@luk &lt;amount&gt;</span>
-Adds desired amount to any stat. For example "@str 10" raises your str by 10
-
-<span class="GMCommand">@spiritball &lt;number&gt;</span>
-Number 1-1000
-Gives you monk "spirit spheres" like from the skill "Call Spirits"
-(If the number you use is &gt; 1000, your server may become instable or crash). 1000 Lags Your Client
-
-<span class="GMCommand">@memo [memo_position]</span>
-set/change a memo location (no position: display memo points).
-
-<span class="GMCommand">@questskill &lt;id&gt;</span>
-Gives you the specified quest skill
-
-<span class="GMCommand">@lostskill &lt;id&gt;</span>
-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
- Archer
- 147 Arrow Creation
- 148 Charge Arrows
- Thief
- 149 Throw Sand
- 150 Back Sliding
- 151 Take Stone
- 152 Stone Throw
- Merchant
- 153 Cart Revolution
- 154 Change Cart
- 155 Crazy Uproar/Loud Voice
- Acolyte
- 156 Holy Light
- Magician
- 157 Energy Coat
-
-<span class="GMCommand">@email &lt;actual@email&gt; &lt;new@email&gt;</span>
-to change your e-mail (characters protection)
-
-<span class="GMCommandTitle">GUILD/WoE CONTROL COMMANDS</span>
-<span class="GMCommand">@guildlvup/@guildlvlup &lt;# of levels&gt;</span>
-Raise Guild by desired number of levels
-
-<span class="GMCommand">@guild &lt;Desired Guild Name&gt;</span>
-Creates a guild with the disered name (Spaces are allow, no need to use "")
-
-<span class="GMCommand">@agitstart</span>
-Starts Guild Wars (War of Emperium)
-
-<span class="GMCommand">@agitend</span>
-Ends Guild Wars (War of Emperium)
-
-<span class="GMCommandTitle">EQUIPMENT COMMANDS</span>
-<span class="GMCommand">@refine &lt;position&gt; &lt;+/-amount&gt;</span>
-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
-
-<span class="GMCommand">@produce &lt;equip name or equip ID&gt; &lt;element&gt; &lt;# of very's&gt;</span>
-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
-
-<span class="GMCommandTitle">PET COMMANDS</span>
-<span class="GMCommand">@makeegg &lt;ID&gt;</span>
-Gives pet egg for monster ID in pet DB
-
-<span class="GMCommand">@petfriendly &lt;#&gt;</span>
-Set pet friendly amount (0-1000) 0 Min, 1000 Max
-
-<span class="GMCommand">@pethungry &lt;#&gt;</span>
-Set pet hungry amount (0-100) 0 Min, 100 Max
-
-<span class="GMCommand">@petrename</span>
-Re-enable pet rename
-
-<span class="GMCommand">@hatch</span>
-Brings up the hatch pet menu
-
-<span class="GMCommandTitle">REMOTE CHAR COMMANDS</span>
-<span class="GMCommand">@charwarp &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
-Warps character to location of choice
-Example:
-@charwarp morocc 150 160 TestChar -&gt; Warps TestChar to Morroc (X:150, Y:160)
-
-<span class="GMCommand">@charstats &lt;char name&gt;</span>
-Displays the character's stats.
-
-<span class="GMCommand">@charignorelist &lt;char name&gt;</span>
-Displays ignore list of the player
-
-<span class="GMCommand">@inall &lt;char name&gt;</span>
-Allows all wispers for the player
-
-<span class="GMCommand">@exall &lt;char name&gt;</span>
-Blocks all wispers for the player
-
-<span class="GMCommand">@charoption &lt;param1&gt; &lt;param2&gt; &lt;param3&gt; &lt;char name&gt;</span>
-Does the same as the @option command only to target character.
-
-<span class="GMCommand">@charmountpeco &lt;charname&gt;</span>
-Give/remove to a player a peco (Class is required, but not skill).
-
-<span class="GMCommand">@charpetrename &lt;charname&gt;</span>
-Re-enable pet rename to a player.
-
-<span class="GMCommand">@charsave &lt;map&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
-Changes the target player's respawn point.
-
-<span class="GMCommand">@charbaselvl &lt;#&gt; &lt;char name&gt;</span>
-Change a character's base level.
-
-<span class="GMCommand">@charjlvl &lt;#&gt; &lt;char name&gt;</span>
-Change a character's job level.
-
-<span class="GMCommand">@charjob &lt;job ID&gt; &lt;char name&gt;<br>@charjobchange &lt;job ID&gt; &lt;char name&gt;</span>
-Changes target character's job.
-
-<span class="GMCommand">@charzeny &lt;amount&gt; &lt;char name&gt;</span>
-Give/take a player's Zeny
-
-<span class="GMCommand">@charstpoint &lt;amount&gt; &lt;char name&gt;</span>
-Give/take a player's stat points
-
-<span class="GMCommand">@charskpoint &lt;amount&gt; &lt;char name&gt;</span>
-give/take a player's skill points
-
-<span class="GMCommand">@charquestskill &lt;#&gt; &lt;char name&gt;</span>
-Gives to a player the specified quest skill.
-
-<span class="GMCommand">@charlostskill &lt;#&gt; &lt;char name&gt;</span>
-Takes away the specified quest skill from the player.
-
-<span class="GMCommand">@chardelitem &lt;item_name_or_ID&gt; &lt;quantity&gt; &lt;char name&gt;</span>
-Remove items from a character
-
-<span class="GMCommand">@charmodel &lt;hair type&gt; &lt;hair color&gt; &lt;clothes color&gt; &lt;char name&gt;</span>
-Changes a player's model
-
-<span class="GMCommand">@chardisguise &lt;monster_name_or_monster_ID&gt; &lt;char name&gt;</span>
-Changes disguise of a player
-
-<span class="GMCommand">@charundisguise &lt;char name&gt;</span>
-Cancels disguise of a player
-
-<span class="GMCommand">@charreset &lt;char name&gt;</span>
-Resets the character
-
-<span class="GMCommand">@chardyeclothes &lt;#&gt; &lt;char name&gt;</span>
-Changes a player's clothes colour
-
-<span class="GMCommand">@chardyehair &lt;#&gt; &lt;char name&gt;</span>
-Changes a player's hair colour
-
-<span class="GMCommand">@charstylehair &lt;#&gt; &lt;char name&gt;</span>
-Changes a player's hair style
-
-<span class="GMCommand">@charchangesex &lt;name&gt;</span>
-Changes sex of a player (all characters of the account)
-
-<span class="GMCommand">@charblock &lt;name&gt;</span>
-Blocks definitively a account
-
-<span class="GMCommand">@charunblock &lt;name&gt;</span>
-<span class="GMCommand">@unblock &lt;name&gt;</span>
-Unblocks a account
-
-<span class="GMCommand">@charban &lt;time&gt; &lt;name&gt;</span>
-Ban temporarily a account
- time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
- Example: @ban +1m-2mn1s-6y testplayer
-
-<span class="GMCommand">@charunban &lt;name&gt;<br>@unban &lt;name&gt;<br>@unbanish &lt;name&gt;<br>@uncharbanish &lt;name&gt;</span>
-Unban a account
-
-<span class="GMCommand">@jail &lt;char_name&gt;</span>
-Sends specified character in jails
-
-<span class="GMCommand">@unjail &lt;charname&gt;<br>@discharge &lt;char_name&gt;</span>
-Discharges specified character/prisoner
-
-<span class="GMCommandTitle">MASS CONTROL COMMANDS</span>
-<span class="GMCommand">@night</span>
-All characters are in darkness
-
-<span class="GMCommand">@day</span>
-@option 00 00 00 are used on all characters
-
-<span class="GMCommand">@doom</span>
-Kills all NON GM chars on the server.
-
-<span class="GMCommand">@doommap</span>
-Kills all non GM characters on the map.
-
-<span class="GMCommand">@raise</span>
-Resurrects all characters on the server.
-
-<span class="GMCommand">@raisemap</span>
-Resurrects all characters on the map.
-
-<span class="GMCommand">@kick &lt;charname&gt;</span>
-Kicks specified character off the server
-
-<span class="GMCommand">@kickall</span>
-Kick all characters off the server
-
-<span class="GMCommandTitle">OTHER COMMANDS</span>
-<span class="GMCommand">@gat<br>@packet</span>
-Unknown
-
-<span class="GMCommandTitle">Server Control Commands</span>
-<span class="GMCommand">@reloadscript<br></span>Reloads all the scripts for the server<span
- class="GMCommand">
-
-@reloaditemdb</span>
-Reloads the itemdb
-
-<span class="GMCommand">@reloadgmdb</span>
-Reload GM levels
-
-<span class="GMCommand">@mapexit</span>
-Kick all players and shut down map-server.
-
-<span class="GMCommand">@reloadmobdb</span>
-Reload monster database
-
-<span class="GMCommand">@reloadskilldb</span>
-Reload skills definition database
-
-<span class="GMCommand">@enablenpc &lt;NPC_name&gt;</span>
-Enable a NPC
-
-<span class="GMCommand">@disablenpc &lt;NPC_name&gt;</span>
-Disable a NPC</font>
-</pre>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>GM</b><font color="#698069">commands</font>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ GM Command List
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<font face="Verdana" size="2"><span class="GMCommandTitle">ANNOUNCEMENT COMMANDS</span>
+<span class="GMCommand">/b &lt;message&gt;<br>@broadcast &lt;message&gt;</span>
+Lets you make a GM global announcement with your name
+
+<span class="GMCommand">/nb &lt;message&gt;<br>@kamu &lt;message&gt;</span>
+Lets you make a GM global announcement withouth your name
+
+<span class="GMCommand">@kamib &lt;message&gt;<br>/bb &lt;message&gt;</span>
+Lets you make a GM global announcement withouth your name in blue
+
+<span class="GMCommandTitle">INFORMATION COMMANDS</span>
+<span class="GMCommand">@who [match_text]</span> <br>Lists who is currently online in your server and their location. [match_text] is optional <br><br><span
+ class="GMCommand">@who2 [match_text] </span>
+Lists who is currently online in your server and their job. [match_text] is optional
+
+<span class="GMCommand">@who3 [match_text]</span> <br>Lists who is currently online in your server and their party/guild. [match_text] is optional<br><br><span
+ class="GMCommand">@whomap [map]</span> <br>Display a listing of who is online and where in a specifical map<br><br><span
+ class="GMCommand">@whomap2 [map]</span> <br>Display a listing of who is online and their job in a specifical map<br><br><span
+ class="GMCommand">@whomap3 [map]</span> <br>Display a listing of who is online and their party/guild in a specifical map<br><br><span
+ class="GMCommand">@whogm [match_text]</span> <br>Like @who+@who2+who3, but only for GM. [match_text] is optional <br><br><span
+ class="GMCommand">@where &lt;char name&gt;</span>
+Tells you the location of a character
+
+<span class="GMCommand">@charstatsall</span>
+ Displays stats of all characters.
+
+<span class="GMCommand">@charitemlist &lt;char name&gt;</span>
+ Displays all items of a player.
+
+<span class="GMCommand">@charstoragelist &lt;char name&gt;</span>
+ Displays all items of a player's storage.
+
+<span class="GMCommand">@charcartlist &lt;char name&gt;</span>
+ Displays all items of a player's cart.
+<span class="GMCommand">@uptime</span><br>Displays how long the map-server has been running.<br><br>
+<span class="GMCommand">@time<br>@date<br>@server_date<br>@serverdate<br>@server_time<br>@servertime</span>
+Display the date/time of the server
+
+<span class="GMCommand">@idsearch &lt;part_of_item_name&gt;</span>
+Search all items that name have part_of_item_name
+
+<span class="GMCommand">@ignorelist</span>
+Displays your ignore list
+
+<span class="GMCommand">@mapinfo [&lt;1-3&gt; [map]]</span>
+Give information about a map (general info +: 0: no more, 1: players, 2: NPC, 3: shops/chat).
+
+<span class="GMCommandTitle">CONTROL COMMANDS</span>
+<span class="GMCommand">@die</span>
+Kill yourself :)
+
+<span class="GMCommand">@alive</span>
+Revive yourself from death
+
+<span class="GMCommand">@kill &lt;char name&gt;</span>
+Kills specified character name
+
+<span class="GMCommand"></span><span class="GMCommand">@save</span>
+Sets save point as current location
+
+<span class="GMCommand">@load</span>
+Warps you to your save point (a.k.a. butterfly wing)
+
+<span class="GMCommand">@warp &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>@rura &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>@mapmove &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>/mm &lt;map name&gt; &lt;x&gt; &lt;y&gt;<br>/mapmove &lt;map name&gt; &lt;x&gt; &lt;y&gt;</span>
+Warps you to the selected position
+Example:
+@warp morocc 150 160 -&gt; Warps you to Morroc (X:150, Y:160)
+@rura prontera 50 80 -&gt; Warps you to Prontera (X:50, Y:80)
+
+
+<span class="GMCommand">@rura+ &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;<br>@charwarp &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;<br>#banish &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
+Warps the selected character to the selected position
+Example:
+@charwarp morocc 150 160 Sora -&gt; Warps the character 'Sora' to Morroc (X:150, Y:160)
+@rura+ prontera 50 80 Haley -&gt; Warps the character 'Haley' to Prontera (X:50, Y:80)
+
+<span class="GMCommand">@jump [x [y]]</span>
+Teleports you randomly in the map (a.k.a. fly wing). Or to the specified location with x and y.
+
+<span class="GMCommand">/shift &lt;char name&gt;<br>@jumpto &lt;char name&gt;<br>@warpto &lt;char name&gt;<br>@goto &lt;char name&gt;</span>
+Warps you to selected character
+
+<span class="GMCommand">@go &lt;number/city_name&gt;</span>
+Warps you to a set city:</font></pre>
+<table id="table1" border="1" width="90%">
+ <tbody>
+ <tr>
+ <td width="25%"><font face="Verdana" size="2">-3: (Memo Point 2)</font></td>
+ <td width="25%"><font face="Verdana" size="2">2: Geffen</font></td>
+ <td width="25%"><font face="Verdana" size="2">7: Lutie</font></td>
+ <td width="25%"><font face="Verdana" size="2">12: Umbala</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font face="Verdana" size="2">-2: (Memo Point 1)</font></td>
+ <td width="25%"><font face="Verdana" size="2">3: Payon </font> </td>
+ <td width="25%"><font face="Verdana" size="2">8: Comodo</font></td>
+ <td width="25%"><font face="Verdana" size="2">13: Niflheim</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font face="Verdana" size="2">-1: (Memo Point 0)</font></td>
+ <td width="25%"><font face="Verdana" size="2">4: Alberta</font></td>
+ <td width="25%"><font face="Verdana" size="2">9: Yuno</font></td>
+ <td width="25%"><font face="Verdana" size="2">14: Louyang</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font face="Verdana" size="2">0: Prontera</font></td>
+ <td width="25%"><font face="Verdana" size="2">5: Izlude</font></td>
+ <td width="25%"><font face="Verdana" size="2">10: Amatsu</font></td>
+ <td width="25%"><font face="Verdana" size="2">15: Start Point</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font face="Verdana" size="2">1: Morroc</font></td>
+ <td width="25%"><font face="Verdana" size="2">6: Al de Baran</font></td>
+ <td width="25%"><font face="Verdana" size="2">11: Gon Ryun</font></td>
+ <td width="25%"><font face="Verdana" size="2">16: Prison/Jail</font></td>
+ </tr>
+ </tbody>
+</table>
+<pre class="style1"><font face="Verdana"><span class="GMCommand">/hide<br>@hide</span>
+GM Hide. Perfect hide that's totally invisible.
+
+<span class="GMCommand">@heal [&lt;HP&gt; &lt;HP&gt;]</span>
+Heals the desired amount of HP and SP. No value specified will do a full heal.
+
+<span class="GMCommand">@storage </span>
+Opens storage
+
+<span class="GMCommand">/recall &lt;char name&gt;<br>@recall &lt;char name&gt;</span>
+Recalls target character to you.
+
+<span class="GMCommand">@recallall</span>
+Recalls everyone on the server to you.
+
+<span class="GMCommand">@guildrecall &lt;guild_name/id&gt;</span>
+Warps all online character of a guild to you.
+
+<span class="GMCommand">@partyrecall &lt;party_name/id&gt;</span>
+Warps all online character of a party to you.
+
+<span class="GMCommand">@revive &lt;char name&gt;</span>
+Revives target character.
+
+<span class="GMCommand">@killmonster</span>
+Kills all spawned monsters on maps
+
+<span class="GMCommandTitle">SPAWNING COMMANDS</span>
+<span class="GMCommand">/item &lt;item_name&gt;<br></span>Gives you 1 of the desired monster<span
+ class="GMCommand">
+
+@item &lt;item name or ID&gt; &lt;quantity&gt;</span>
+Gives you the desired item with the desired quantity
+
+<span class="GMCommand">/monster &lt;monster_name&gt;</span><span
+ class="faqlist">
+Spawns 1 of the desired monster
+
+</span><span class="GMCommand"><font size="2">@spawn &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]<br>@monster &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]<br>@summon &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;desired_monster_name&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]]</font></span><font
+ size="2"><span class="faqlist">
+</span><span class="GMCommand">@monster2 &lt;desired_monster_name&gt; &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>OR<br>@spawn "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@summon "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster2 "desired monster name" &lt;monster_name_or_monster_ID&gt; [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>OR<br>@spawn &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@summon &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]<br>@monster2 &lt;monster_name_or_monster_ID&gt; "desired monster name" [&lt;quantity&gt; [&lt;x coord&gt; [&lt;y coord&gt;]]]</span>
+</font>
+Spawns the desired monster with any desired name, quantity and x and y location (if specified).
+There 2 last forms can use spaces for desired names (between the "").
+
+<span class="GMCommandTitle">MAP OPTIONS COMMANDS</span>
+
+<span class="GMCommand">@pvpon</span>
+Turns pvp on on the current map
+<span class="GMCommand">@pvpoff</span>
+Turns pvp off on the current map
+<span class="GMCommand">@gvgon</span>
+Turns gvg on on the current map. This does NOT enable War of Emperium.
+<span class="GMCommand">@gvgoff </span>
+Turns gvg off on the current map. This does NOT disable War of Emperium.
+
+<span class="GMCommandTitle">CHARACTER CONTROL COMMANDS</span>
+<span class="GMCommand">@baselvlup &lt;number of levels&gt;</span>
+<span class="GMCommand">@lvup &lt;number of levels&gt;<br>@blevel &lt;number of levels&gt;</span>
+Raises your base level the desired number of levels. The max is 99 (unless you change it in battle_athena.conf).
+
+<span class="GMCommand">@joblvlup &lt;number of levels&gt;</span>
+<span class="GMCommand">@joblvup &lt;number of levels&gt;<br>@jlevel &lt;number of levels&gt;</span>
+Raises your job level the desired number of levels. The max is 50 for 1st and 2nd class, and 70 for advanced classes.
+
+<span class="GMCommand">@job &lt;job ID&gt;<br>@jobchange &lt;job ID&gt;</span>
+Changes your job to the job assigned to the ID</font></pre>
+<table id="table2" border="1" width="90%">
+ <tbody>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">0:
+Novice</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">6:
+Thief</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">12:
+Assassin</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">18:
+Alchemist</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">1:
+Swordsman</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">7:
+Knight</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">13:
+Knight w/ Peco</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">19:
+Bard</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">2:
+Mage</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">8:
+Priest</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">14:
+Crusader</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">20:
+Dancer</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">3:
+Archer</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">9:
+Wizard</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">15:
+Monk</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">21:
+Crusader w/ Peco</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">4:
+Acolyte</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">10:
+Blacksmith</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">16:
+Sage</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">22:
+Wedding</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">5:
+Merchant</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">11:
+Hunter</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">17:
+Rogue</font></td>
+ <td width="25%"><font style="font-size: 11pt;" face="Verdana">23:
+Super Novice</font></td>
+ </tr>
+ </tbody>
+</table>
+<table id="table3" border="1" width="90%">
+ <tbody>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">24/4001:
+Novice High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">31/4007:
+Thief High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">40/4013:
+Assassin Cross</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">46/4019:
+Creator</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">25/4002:
+Swordsman High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">35/4008:
+Lord Knight</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">41/4014:
+Lord Knight w/ Peco</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">47/4020:
+Clown</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">26/4003:
+Mage High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">36/4009:
+High Priest</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">42/4015:
+Paladin</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">48/4021:
+Gypsy</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">28/4004:
+Archer High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">37/4010:
+High Wizard</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">43/4016:
+Champion</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">49/4022:
+Paladin w/ Peco</font></td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">29/4005:
+Acolyte High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">38/4011:
+Whitesmith</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">44/4017:
+Professor</font></td>
+ <td width="25%">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">30/4006:
+Merchant High</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">39/4012:
+Sniper</font></td>
+ <td width="25%"><font style="font-size: 9pt;" face="Verdana">45/4018:
+Stalker</font></td>
+ <td width="25%">&nbsp;</td>
+ </tr>
+ </tbody>
+</table>
+<pre class="style1"><font face="Verdana"><span class="GMCommand">@option &lt;param1&gt; &lt;param2&gt; &lt;param3&gt;</span>
+Changes options for your character
+ &lt;param1&gt; &lt;param2&gt; (Stackable) &lt;param3&gt; (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 ??? 16 Darkness 16 Falcon
+ 32 (Depreciated)
+ 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
+
+<span class="GMCommand">@mountpeco</span>
+Will (un)mount on a peco. (Class is required, but not skill)
+
+<span class="GMCommand">@speed &lt;1-1000&gt;</span>
+Changes you walking speed.
+1(Fastest)&lt;---140(Default)-----------------&gt;1000(Slowest)
+
+<span class="GMCommand">@disguise &lt;monster_name_or_monster_ID&gt;</span>
+Change your appearence to other players to a mob.
+
+<span class="GMCommand">@undisguise</span>
+Restore your normal appearance.
+
+<span class="GMCommand">@model &lt;hair ID&gt; &lt;hair color&gt; &lt;clothes color&gt;</span>
+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
+
+<span class="GMCommand">@effect &lt;effect_id&gt; [flag]</span>
+ Give an efect to your character.
+
+<span class="GMCommand">@stpoint &lt;number of points&gt;</span>
+Gives you the desired number of stat points.
+
+<span class="GMCommand">@skpoint &lt;number of points&gt;</span>
+Gives you the desired number of skill points.
+
+<span class="GMCommand">@zeny &lt;amount&gt;</span>
+Gives you desired amount of Zeny.
+
+<span class="GMCommand">@str &lt;amount&gt;<br>@agi &lt;amount&gt;<br>@vit &lt;amount&gt;<br>@int &lt;amount&gt;<br>@dex &lt;amount&gt;<br>@luk &lt;amount&gt;</span>
+Adds desired amount to any stat. For example "@str 10" raises your str by 10
+
+<span class="GMCommand">@spiritball &lt;number&gt;</span>
+Number 1-1000
+Gives you monk "spirit spheres" like from the skill "Call Spirits"
+(If the number you use is &gt; 1000, your server may become instable or crash). 1000 Lags Your Client
+
+<span class="GMCommand">@memo [memo_position]</span>
+set/change a memo location (no position: display memo points).
+
+<span class="GMCommand">@questskill &lt;id&gt;</span>
+Gives you the specified quest skill
+
+<span class="GMCommand">@lostskill &lt;id&gt;</span>
+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
+ Archer
+ 147 Arrow Creation
+ 148 Charge Arrows
+ Thief
+ 149 Throw Sand
+ 150 Back Sliding
+ 151 Take Stone
+ 152 Stone Throw
+ Merchant
+ 153 Cart Revolution
+ 154 Change Cart
+ 155 Crazy Uproar/Loud Voice
+ Acolyte
+ 156 Holy Light
+ Magician
+ 157 Energy Coat
+
+<span class="GMCommand">@email &lt;actual@email&gt; &lt;new@email&gt;</span>
+to change your e-mail (characters protection)
+
+<span class="GMCommandTitle">GUILD/WoE CONTROL COMMANDS</span>
+<span class="GMCommand">@guildlvup/@guildlvlup &lt;# of levels&gt;</span>
+Raise Guild by desired number of levels
+
+<span class="GMCommand">@guild &lt;Desired Guild Name&gt;</span>
+Creates a guild with the disered name (Spaces are allow, no need to use "")
+
+<span class="GMCommand">@agitstart</span>
+Starts Guild Wars (War of Emperium)
+
+<span class="GMCommand">@agitend</span>
+Ends Guild Wars (War of Emperium)
+
+<span class="GMCommandTitle">EQUIPMENT COMMANDS</span>
+<span class="GMCommand">@refine &lt;position&gt; &lt;+/-amount&gt;</span>
+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
+
+<span class="GMCommand">@produce &lt;equip name or equip ID&gt; &lt;element&gt; &lt;# of very's&gt;</span>
+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
+
+<span class="GMCommandTitle">PET COMMANDS</span>
+<span class="GMCommand">@makeegg &lt;ID&gt;</span>
+Gives pet egg for monster ID in pet DB
+
+<span class="GMCommand">@petfriendly &lt;#&gt;</span>
+Set pet friendly amount (0-1000) 0 Min, 1000 Max
+
+<span class="GMCommand">@pethungry &lt;#&gt;</span>
+Set pet hungry amount (0-100) 0 Min, 100 Max
+
+<span class="GMCommand">@petrename</span>
+Re-enable pet rename
+
+<span class="GMCommand">@hatch</span>
+Brings up the hatch pet menu
+
+<span class="GMCommandTitle">REMOTE CHAR COMMANDS</span>
+<span class="GMCommand">@charwarp &lt;map name&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
+Warps character to location of choice
+Example:
+@charwarp morocc 150 160 TestChar -&gt; Warps TestChar to Morroc (X:150, Y:160)
+
+<span class="GMCommand">@charstats &lt;char name&gt;</span>
+Displays the character's stats.
+
+<span class="GMCommand">@charignorelist &lt;char name&gt;</span>
+Displays ignore list of the player
+
+<span class="GMCommand">@inall &lt;char name&gt;</span>
+Allows all wispers for the player
+
+<span class="GMCommand">@exall &lt;char name&gt;</span>
+Blocks all wispers for the player
+
+<span class="GMCommand">@charoption &lt;param1&gt; &lt;param2&gt; &lt;param3&gt; &lt;char name&gt;</span>
+Does the same as the @option command only to target character.
+
+<span class="GMCommand">@charmountpeco &lt;charname&gt;</span>
+Give/remove to a player a peco (Class is required, but not skill).
+
+<span class="GMCommand">@charpetrename &lt;charname&gt;</span>
+Re-enable pet rename to a player.
+
+<span class="GMCommand">@charsave &lt;map&gt; &lt;x&gt; &lt;y&gt; &lt;char name&gt;</span>
+Changes the target player's respawn point.
+
+<span class="GMCommand">@charbaselvl &lt;#&gt; &lt;char name&gt;</span>
+Change a character's base level.
+
+<span class="GMCommand">@charjlvl &lt;#&gt; &lt;char name&gt;</span>
+Change a character's job level.
+
+<span class="GMCommand">@charjob &lt;job ID&gt; &lt;char name&gt;<br>@charjobchange &lt;job ID&gt; &lt;char name&gt;</span>
+Changes target character's job.
+
+<span class="GMCommand">@charzeny &lt;amount&gt; &lt;char name&gt;</span>
+Give/take a player's Zeny
+
+<span class="GMCommand">@charstpoint &lt;amount&gt; &lt;char name&gt;</span>
+Give/take a player's stat points
+
+<span class="GMCommand">@charskpoint &lt;amount&gt; &lt;char name&gt;</span>
+give/take a player's skill points
+
+<span class="GMCommand">@charquestskill &lt;#&gt; &lt;char name&gt;</span>
+Gives to a player the specified quest skill.
+
+<span class="GMCommand">@charlostskill &lt;#&gt; &lt;char name&gt;</span>
+Takes away the specified quest skill from the player.
+
+<span class="GMCommand">@chardelitem &lt;item_name_or_ID&gt; &lt;quantity&gt; &lt;char name&gt;</span>
+Remove items from a character
+
+<span class="GMCommand">@charmodel &lt;hair type&gt; &lt;hair color&gt; &lt;clothes color&gt; &lt;char name&gt;</span>
+Changes a player's model
+
+<span class="GMCommand">@chardisguise &lt;monster_name_or_monster_ID&gt; &lt;char name&gt;</span>
+Changes disguise of a player
+
+<span class="GMCommand">@charundisguise &lt;char name&gt;</span>
+Cancels disguise of a player
+
+<span class="GMCommand">@charreset &lt;char name&gt;</span>
+Resets the character
+
+<span class="GMCommand">@chardyeclothes &lt;#&gt; &lt;char name&gt;</span>
+Changes a player's clothes colour
+
+<span class="GMCommand">@chardyehair &lt;#&gt; &lt;char name&gt;</span>
+Changes a player's hair colour
+
+<span class="GMCommand">@charstylehair &lt;#&gt; &lt;char name&gt;</span>
+Changes a player's hair style
+
+<span class="GMCommand">@charchangesex &lt;name&gt;</span>
+Changes sex of a player (all characters of the account)
+
+<span class="GMCommand">@charblock &lt;name&gt;</span>
+Blocks definitively a account
+
+<span class="GMCommand">@charunblock &lt;name&gt;</span>
+<span class="GMCommand">@unblock &lt;name&gt;</span>
+Unblocks a account
+
+<span class="GMCommand">@charban &lt;time&gt; &lt;name&gt;</span>
+Ban temporarily a account
+ time usage: adjustement (+/- value) and element (y/a, m, d/j, h, mn, s)
+ Example: @ban +1m-2mn1s-6y testplayer
+
+<span class="GMCommand">@charunban &lt;name&gt;<br>@unban &lt;name&gt;<br>@unbanish &lt;name&gt;<br>@uncharbanish &lt;name&gt;</span>
+Unban a account
+
+<span class="GMCommand">@jail &lt;char_name&gt;</span>
+Sends specified character in jails
+
+<span class="GMCommand">@unjail &lt;charname&gt;<br>@discharge &lt;char_name&gt;</span>
+Discharges specified character/prisoner
+
+<span class="GMCommandTitle">MASS CONTROL COMMANDS</span>
+<span class="GMCommand">@night</span>
+All characters are in darkness
+
+<span class="GMCommand">@day</span>
+@option 00 00 00 are used on all characters
+
+<span class="GMCommand">@doom</span>
+Kills all NON GM chars on the server.
+
+<span class="GMCommand">@doommap</span>
+Kills all non GM characters on the map.
+
+<span class="GMCommand">@raise</span>
+Resurrects all characters on the server.
+
+<span class="GMCommand">@raisemap</span>
+Resurrects all characters on the map.
+
+<span class="GMCommand">@kick &lt;charname&gt;</span>
+Kicks specified character off the server
+
+<span class="GMCommand">@kickall</span>
+Kick all characters off the server
+
+<span class="GMCommandTitle">OTHER COMMANDS</span>
+<span class="GMCommand">@gat<br>@packet</span>
+Unknown
+
+<span class="GMCommandTitle">Server Control Commands</span>
+<span class="GMCommand">@reloadscript<br></span>Reloads all the scripts for the server<span
+ class="GMCommand">
+
+@reloaditemdb</span>
+Reloads the itemdb
+
+<span class="GMCommand">@reloadgmdb</span>
+Reload GM levels
+
+<span class="GMCommand">@mapexit</span>
+Kick all players and shut down map-server.
+
+<span class="GMCommand">@reloadmobdb</span>
+Reload monster database
+
+<span class="GMCommand">@reloadskilldb</span>
+Reload skills definition database
+
+<span class="GMCommand">@enablenpc &lt;NPC_name&gt;</span>
+Enable a NPC
+
+<span class="GMCommand">@disablenpc &lt;NPC_name&gt;</span>
+Disable a NPC</font>
+</pre>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/npcfeatures.html b/readme/npcfeatures.html
index 1efe74421..be16c2e66 100644
--- a/readme/npcfeatures.html
+++ b/readme/npcfeatures.html
@@ -1,207 +1,207 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>Npc</b><font color="#698069">features</font>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- eAthena Npc Scripts
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<ul>
-<li>Town Npcs (11/13)</li>
-<ul><li>&nbsp;Prontera - 100%</li></ul>
-<ul><li>&nbsp;Morocc - 100%</li></ul>
-<ul><li>&nbsp;Geffen - 100%</li></ul>
-<ul><li>&nbsp;Izlude - 100%</li></ul>
-<ul><li>&nbsp;Alberta - 100%</li></ul>
-<ul><li>&nbsp;Al de Baran - 100%</li></ul>
-<ul><li>&nbsp;Lutie - 100%</li></ul>
-<ul><li>&nbsp;Amatsu - 100%</li></ul>
-<ul><li>&nbsp;Comodo - 100%</li></ul>
-<ul><li>&nbsp;Niflheim - 100%</li></ul>
-<ul><li>&nbsp;Umbala - 100%</li></ul>
-<ul><li>&nbsp;Gonryun - 60%</li></ul>
-<ul><li>&nbsp;Payon(New Maps) - 50%</li></ul>
-<li>Job Quests (16/33)</li>
-<ul><li>&nbsp;Novice Class (2/2)</li></ul>
-<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Super Novice - 100%</li></ul></ul>
-<ul><li>&nbsp;1-1 Class (6/6)</li></ul>
-<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
-<ul><li>&nbsp;2-1 Class (6/6)</li></ul>
-<ul><ul><li>&nbsp;Knight - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Priest - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Wizard - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Blacksmith - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Hunter - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Assassin - 100%</li></ul></ul>
-<ul><li>&nbsp;2-2 Class (2/7)</li></ul>
-<ul><ul><li>&nbsp;Crusader - 0%</li></ul></ul>
-<ul><ul><li>&nbsp;Monk - 0% (Soon)</li></ul></ul>
-<ul><ul><li>&nbsp;Sage - 0% (Soon)</li></ul></ul>
-<ul><ul><li>&nbsp;Rogue - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Alchemist - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Bard - 0%</li></ul></ul>
-<ul><ul><li>&nbsp;Dancer - 100%</li></ul></ul>
-<ul><li>&nbsp;2-1-1 Class (0/6)</li></ul>
-<ul><li>&nbsp;2-2-1 Class (0/6)</li></ul>
-<li>Kafras - 100%</li>
-<li>Guides - 100%</li>
-<li>&nbsp;War Of Emperium (4/5)</li>
-<ul><li>&nbsp;Prontera - 100%</li></ul>
-<ul><li>&nbsp;Geffen - 100%</li></ul>
-<ul><li>&nbsp;Payon - 100%</li></ul>
-<ul><li>&nbsp;Al De Baran - 100%</li></ul>
-<ul><li>&nbsp;Novice - 0%</li></ul>
-<li>Quests (24/25)</li>
-<ul><li>&nbsp;Skill Quests (7/7)</li></ul>
-<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
-<ul><li>Town Quests (9/10)</li></ul>
-<ul><ul><li>&nbsp;Prontera - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Morocc - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Geffen - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Izlude - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Alberta - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Al De Baran - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Yuno - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Lutie - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Comodo - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Payon - 20%</li></ul></ul>
-<ul><li>Other Quests (8/8)</li></ul>
-<ul><ul><li>&nbsp;Dye - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;MrSmile - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Juice Making - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Doomed Swords - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Bongun Taming - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Munak Taming - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Tamking - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Bongun Sword - 100%</li></ul></ul>
-<ul><li>Other (7/10)</li></ul>
-<ul><ul><li>&nbsp;Card Remover - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;PvP (old) - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Time Arena - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Bank - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Wedding - 80%</li></ul></ul>
-<ul><ul><li>&nbsp;Valkyrie - 10%</li></ul></ul>
-<ul><ul><li>&nbsp;Gefenia - 10%</li></ul></ul>
-<ul><ul><li>&nbsp;Heal Npc - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Warp Npc - 100%</li></ul></ul>
-<ul><ul><li>&nbsp;Jobchange - 100%</li></ul></ul>
- </li>
-</ul>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>Npc</b><font color="#698069">features</font>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ eAthena Npc Scripts
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<ul>
+<li>Town Npcs (11/13)</li>
+<ul><li>&nbsp;Prontera - 100%</li></ul>
+<ul><li>&nbsp;Morocc - 100%</li></ul>
+<ul><li>&nbsp;Geffen - 100%</li></ul>
+<ul><li>&nbsp;Izlude - 100%</li></ul>
+<ul><li>&nbsp;Alberta - 100%</li></ul>
+<ul><li>&nbsp;Al de Baran - 100%</li></ul>
+<ul><li>&nbsp;Lutie - 100%</li></ul>
+<ul><li>&nbsp;Amatsu - 100%</li></ul>
+<ul><li>&nbsp;Comodo - 100%</li></ul>
+<ul><li>&nbsp;Niflheim - 100%</li></ul>
+<ul><li>&nbsp;Umbala - 100%</li></ul>
+<ul><li>&nbsp;Gonryun - 60%</li></ul>
+<ul><li>&nbsp;Payon(New Maps) - 50%</li></ul>
+<li>Job Quests (16/33)</li>
+<ul><li>&nbsp;Novice Class (2/2)</li></ul>
+<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Super Novice - 100%</li></ul></ul>
+<ul><li>&nbsp;1-1 Class (6/6)</li></ul>
+<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
+<ul><li>&nbsp;2-1 Class (6/6)</li></ul>
+<ul><ul><li>&nbsp;Knight - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Priest - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Wizard - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Blacksmith - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Hunter - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Assassin - 100%</li></ul></ul>
+<ul><li>&nbsp;2-2 Class (2/7)</li></ul>
+<ul><ul><li>&nbsp;Crusader - 0%</li></ul></ul>
+<ul><ul><li>&nbsp;Monk - 0% (Soon)</li></ul></ul>
+<ul><ul><li>&nbsp;Sage - 0% (Soon)</li></ul></ul>
+<ul><ul><li>&nbsp;Rogue - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Alchemist - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Bard - 0%</li></ul></ul>
+<ul><ul><li>&nbsp;Dancer - 100%</li></ul></ul>
+<ul><li>&nbsp;2-1-1 Class (0/6)</li></ul>
+<ul><li>&nbsp;2-2-1 Class (0/6)</li></ul>
+<li>Kafras - 100%</li>
+<li>Guides - 100%</li>
+<li>&nbsp;War Of Emperium (4/5)</li>
+<ul><li>&nbsp;Prontera - 100%</li></ul>
+<ul><li>&nbsp;Geffen - 100%</li></ul>
+<ul><li>&nbsp;Payon - 100%</li></ul>
+<ul><li>&nbsp;Al De Baran - 100%</li></ul>
+<ul><li>&nbsp;Novice - 0%</li></ul>
+<li>Quests (24/25)</li>
+<ul><li>&nbsp;Skill Quests (7/7)</li></ul>
+<ul><ul><li>&nbsp;Novice - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Swordman - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Mage - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Archer - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Acolyte - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Merchant - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Thief - 100%</li></ul></ul>
+<ul><li>Town Quests (9/10)</li></ul>
+<ul><ul><li>&nbsp;Prontera - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Morocc - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Geffen - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Izlude - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Alberta - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Al De Baran - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Yuno - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Lutie - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Comodo - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Payon - 20%</li></ul></ul>
+<ul><li>Other Quests (8/8)</li></ul>
+<ul><ul><li>&nbsp;Dye - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;MrSmile - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Juice Making - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Doomed Swords - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Bongun Taming - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Munak Taming - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Tamking - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Bongun Sword - 100%</li></ul></ul>
+<ul><li>Other (7/10)</li></ul>
+<ul><ul><li>&nbsp;Card Remover - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;PvP (old) - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Time Arena - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Bank - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Wedding - 80%</li></ul></ul>
+<ul><ul><li>&nbsp;Valkyrie - 10%</li></ul></ul>
+<ul><ul><li>&nbsp;Gefenia - 10%</li></ul></ul>
+<ul><ul><li>&nbsp;Heal Npc - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Warp Npc - 100%</li></ul></ul>
+<ul><ul><li>&nbsp;Jobchange - 100%</li></ul></ul>
+ </li>
+</ul>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/settingup.html b/readme/settingup.html
index 463a5a8ce..3e62925ec 100644
--- a/readme/settingup.html
+++ b/readme/settingup.html
@@ -1,185 +1,185 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>Setting</b><font color="#698069">up</font>
- </td>
- <td>
- <img src="./readmerighttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
- </td>
- <td>
- <img src="./grntabfinalright.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- How to setup eAthena
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<ol>
- <li>Edit motd.txt, grf-files.txt &amp; .conf files as neccessary.</li>
- <li>If you want to add a user, run adduser.exe in the main eAthena
-directory before starting the
-server.<br>
- </li>
- <li>Run the login-server.exe, char-server.exe and map-server.exe in
-the main eAthena directory.</li>
- <li>You're done!<br>
- </li>
-</ol>
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Upgrading eAthena
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-&nbsp;<span style="font-weight: bold;">
-<br>
-From a release newer than 953 or 817:</span><br>
-<ol>
- <li>Transfer your old /save/ folder contents (Athena.txt,
-Account.txt, Storage.txt, etc.) to the new /save/ folder.</li>
- <li>Transfer/Edit grf-files.txt, gm-account.txt and motd.txt as&nbsp;
-neccessary.</li>
- <li>Transfer any extra custom NPCs to the /npc/ folder and edit if
-neccessary.</li>
- <li>Edit .conf files to setup your server.</li>
- <li>You're done!</li>
-</ol>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE</span>:
-It is not recommended to transfer your DB files<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; as the DB files are constantly
-updated by the eAthena/jAthena<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; team. Just readd your changes to
-the new DB files instead of<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; replacing the new DB file with
-your old one.<br>
-<br>
-<span style="font-weight: bold;"><br>
-From a release older than 670:</span><br>
-<ol>
- <li>Transfer your old /save/ folder contents (Athena.txt,
-Account.txt, Storage.txt, etc.) to the new /save/ folder.</li>
- <li>Transfer/Edit grf-files.txt, gm-account.txt and motd.txt as
-neccessary.</li>
- <li>Transfer any extra custom NPCs to the /npc/ folder and edit if
-neccessary.</li>
- <li>Edit .conf files to setup your server.</li>
- <li>You're done!</li>
-</ol>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE</span>:
-It is not recommended to transfer your .conf files from<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; your old eAthena setup to this
-new one because there are always<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; changes and new additions to
-these .conf files all the time<br>
-<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE
-2</span>: It is also not recommended to transfer your DB files<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; as the DB files are constantly
-updated by the eAthena/jAthena<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; team. Just readd your changes to
-the new DB files instead of<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; replacing the new DB file with
-your old one.<br>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>Setting</b><font color="#698069">up</font>
+ </td>
+ <td>
+ <img src="./readmerighttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./support.html"><b>Support</b><font color="#698069">sites</font></a>
+ </td>
+ <td>
+ <img src="./grntabfinalright.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ How to setup eAthena
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<ol>
+ <li>Edit motd.txt, grf-files.txt &amp; .conf files as neccessary.</li>
+ <li>If you want to add a user, run adduser.exe in the main eAthena
+directory before starting the
+server.<br>
+ </li>
+ <li>Run the login-server.exe, char-server.exe and map-server.exe in
+the main eAthena directory.</li>
+ <li>You're done!<br>
+ </li>
+</ol>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Upgrading eAthena
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+&nbsp;<span style="font-weight: bold;">
+<br>
+From a release newer than 953 or 817:</span><br>
+<ol>
+ <li>Transfer your old /save/ folder contents (Athena.txt,
+Account.txt, Storage.txt, etc.) to the new /save/ folder.</li>
+ <li>Transfer/Edit grf-files.txt, gm-account.txt and motd.txt as&nbsp;
+neccessary.</li>
+ <li>Transfer any extra custom NPCs to the /npc/ folder and edit if
+neccessary.</li>
+ <li>Edit .conf files to setup your server.</li>
+ <li>You're done!</li>
+</ol>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE</span>:
+It is not recommended to transfer your DB files<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; as the DB files are constantly
+updated by the eAthena/jAthena<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; team. Just readd your changes to
+the new DB files instead of<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; replacing the new DB file with
+your old one.<br>
+<br>
+<span style="font-weight: bold;"><br>
+From a release older than 670:</span><br>
+<ol>
+ <li>Transfer your old /save/ folder contents (Athena.txt,
+Account.txt, Storage.txt, etc.) to the new /save/ folder.</li>
+ <li>Transfer/Edit grf-files.txt, gm-account.txt and motd.txt as
+neccessary.</li>
+ <li>Transfer any extra custom NPCs to the /npc/ folder and edit if
+neccessary.</li>
+ <li>Edit .conf files to setup your server.</li>
+ <li>You're done!</li>
+</ol>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE</span>:
+It is not recommended to transfer your .conf files from<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; your old eAthena setup to this
+new one because there are always<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; changes and new additions to
+these .conf files all the time<br>
+<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic;">NOTE
+2</span>: It is also not recommended to transfer your DB files<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; as the DB files are constantly
+updated by the eAthena/jAthena<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; team. Just readd your changes to
+the new DB files instead of<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; replacing the new DB file with
+your old one.<br>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/readme/support.html b/readme/support.html
index d42a81ae9..0644da9f1 100644
--- a/readme/support.html
+++ b/readme/support.html
@@ -1,130 +1,130 @@
-<html>
-<head><title>eAthena 1.0 Final Readme</title>
-<meta http-equiv="expires" content="-1">
-<meta http-equiv="pragma" content="no-cache" />
-<meta name="author" content="eAthena Development Team">
-<meta name="description" content="eAthena, ro server emulator">
-<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
-<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
-</head>
-<body>
-<table width="100%" cellpadding="0" cellspacing="0" border="0">
- <tr>
- <td height="82" align="left" colspan="19">
- <img src="./banner.jpg" width="393" height="82">
- </td>
- </tr>
- <tr height="36">
- <td width="175" height="36">
- <img src="./grnlefttab.jpg" width="175" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="18" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./features.html"><b>Features</b></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
- </td>
- <td>
- <img src="./btwngreentab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./grntabbg.jpg" class="tab">
- <a href="./faq.html"><b>FAQ</b></a>
- </td>
- <td>
- <img src="./grnwhttab.jpg" width="20" height="36">
- </td>
- <td height="36" background="./whttabbg.jpg" class="tab">
- <b>Support</b><font color="#698069">sites</font>
- </td>
- <td>
- <img src="./finalwhttab.jpg" width="12" height="36">
- </td>
- <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
- </td>
- <td rowspan="3">
- <img src="./toprightcontent.jpg" width="12" height="46">
- </td>
- </tr>
- <tr height="1">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr height="9">
- <td colspan="19" bgcolor="#FCFCFC">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="header">
- Forums:
- </td>
- <td background="./rightcontentbg.jpg" width="12" rowspan="2">
- </td>
- </tr>
- <tr>
- <td colspan="18" bgcolor="#FCFCFC" class="content">
-<a
- href="http://eathena.deltaanime.net">http://eathena.deltaanime.net</a>
-Our Official Webpage.<br>
-<a href="http://forum.asb-sakray.net">http://forum.asb-sakray.net</a> Aegis
-Support Board.<br>
-<a href="http://www.evera-aura.net">http://www.evera-aura.net</a> Evera's Site<br>
-<a href="http://eathena.systeminplace.net">eathena.systeminplace.net</a> Valaris's Site<br>
-<a href="http://consonance.deltaanime.net">http://consonance.deltaanime.net</a> Aria's eAthena Reference<br>
-<br>
-<span style="font-weight: bold;">IRC Channel:<br>
-<span style="font-weight: bold;"></span></span>irc.deltaanime.net
-#athena (Please make sure to check both forums before coming into the
-channel to ask questions, or else you may not be answered and possibly
-ridiculed.)<span style="font-weight: bold;"><span
- style="font-weight: bold;"><span style="font-weight: bold;"></span></span><br>
-</span><br>
- </td>
- </tr>
- <tr>
- <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
- <img src="./btmleftcontent.jpg" height="12" width="13">
- </td>
- <td>
- <img src="./btmrightcontent.jpg" height="12 width="12">
- </td>
- </tr>
- <tr>
- <td height="10">
- </td>
- </tr>
- <tr>
- <td colspan="19" bgcolor="#E2F0E2">
- &copy; Content Copyright 2004 eAthena Development team<br>
- &copy; Design Copyright 2004 Aria
- </td>
- </tr>
-</table>
-</body>
+<html>
+<head><title>eAthena 1.0 Final Readme</title>
+<meta http-equiv="expires" content="-1">
+<meta http-equiv="pragma" content="no-cache" />
+<meta name="author" content="eAthena Development Team">
+<meta name="description" content="eAthena, ro server emulator">
+<meta name="keywords" content="eathena, ro, ragnarok online, server emulator, server software">
+<link href="./1final.css" media="screen" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table width="100%" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td height="82" align="left" colspan="19">
+ <img src="./banner.jpg" width="393" height="82">
+ </td>
+ </tr>
+ <tr height="36">
+ <td width="175" height="36">
+ <img src="./grnlefttab.jpg" width="175" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="../readme.html"><b>Intro</b><font color="#698069">duction</font>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="18" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./changelog.html"><b>Change</b><font color="#698069">log</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./features.html"><b>Features</b></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./Npcfeatures.html"><b>Npc</b><font color="#698069">features</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./settingup.html"><b>Setting</b><font color="#698069">up</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./gmcommands.html"><b>GM</b><font color="#698069">commands</font></a>
+ </td>
+ <td>
+ <img src="./btwngreentab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./grntabbg.jpg" class="tab">
+ <a href="./faq.html"><b>FAQ</b></a>
+ </td>
+ <td>
+ <img src="./grnwhttab.jpg" width="20" height="36">
+ </td>
+ <td height="36" background="./whttabbg.jpg" class="tab">
+ <b>Support</b><font color="#698069">sites</font>
+ </td>
+ <td>
+ <img src="./finalwhttab.jpg" width="12" height="36">
+ </td>
+ <td background="./topcontentbg.jpg" width="100%" height="37" rowspan="2">
+ </td>
+ <td rowspan="3">
+ <img src="./toprightcontent.jpg" width="12" height="46">
+ </td>
+ </tr>
+ <tr height="1">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr height="9">
+ <td colspan="19" bgcolor="#FCFCFC">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="header">
+ Forums:
+ </td>
+ <td background="./rightcontentbg.jpg" width="12" rowspan="2">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" bgcolor="#FCFCFC" class="content">
+<a
+ href="http://eathena.deltaanime.net">http://eathena.deltaanime.net</a>
+Our Official Webpage.<br>
+<a href="http://forum.asb-sakray.net">http://forum.asb-sakray.net</a> Aegis
+Support Board.<br>
+<a href="http://www.evera-aura.net">http://www.evera-aura.net</a> Evera's Site<br>
+<a href="http://eathena.systeminplace.net">eathena.systeminplace.net</a> Valaris's Site<br>
+<a href="http://consonance.deltaanime.net">http://consonance.deltaanime.net</a> Aria's eAthena Reference<br>
+<br>
+<span style="font-weight: bold;">IRC Channel:<br>
+<span style="font-weight: bold;"></span></span>irc.deltaanime.net
+#athena (Please make sure to check both forums before coming into the
+channel to ask questions, or else you may not be answered and possibly
+ridiculed.)<span style="font-weight: bold;"><span
+ style="font-weight: bold;"><span style="font-weight: bold;"></span></span><br>
+</span><br>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="18" background="./btmcontentbg.jpg" height="12" align="left">
+ <img src="./btmleftcontent.jpg" height="12" width="13">
+ </td>
+ <td>
+ <img src="./btmrightcontent.jpg" height="12 width="12">
+ </td>
+ </tr>
+ <tr>
+ <td height="10">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="19" bgcolor="#E2F0E2">
+ &copy; Content Copyright 2004 eAthena Development team<br>
+ &copy; Design Copyright 2004 Aria
+ </td>
+ </tr>
+</table>
+</body>
</html> \ No newline at end of file
diff --git a/runserver.bat b/runserver.bat
index 53ca33736..8f69aa292 100644
--- a/runserver.bat
+++ b/runserver.bat
@@ -1,4 +1,4 @@
-@echo off
-start /min logserv.bat
-start /min charserv.bat
+@echo off
+start /min logserv.bat
+start /min charserv.bat
start /min mapserv.bat \ No newline at end of file
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/sql-files/convert_passwords.sql b/sql-files/convert_passwords.sql
index 6d2521e56..86e4c5b08 100644
--- a/sql-files/convert_passwords.sql
+++ b/sql-files/convert_passwords.sql
@@ -1,3 +1,3 @@
-# Convert passwords to MD5 hashes
-
-UPDATE `login` SET `user_pass`=MD5(`user_pass`);
+# Convert passwords to MD5 hashes
+
+UPDATE `login` SET `user_pass`=MD5(`user_pass`);
diff --git a/sql-files/database.sql b/sql-files/database.sql
index 982775c23..e774125cf 100644
--- a/sql-files/database.sql
+++ b/sql-files/database.sql
@@ -1,2180 +1,2180 @@
-CREATE TABLE `item_db` (
- `id` smallint(5) unsigned NOT NULL default '0',
- `name_english` varchar(24) NOT NULL default '',
- `name_japanese` varchar(24) NOT NULL default '',
- `type` tinyint(2) unsigned NOT NULL default '0',
- `price_buy` int(10) unsigned default NULL,
- `price_sell` int(10) unsigned default NULL,
- `weight` int(10) unsigned NOT NULL default '0',
- `attack` mediumint(9) unsigned default NULL,
- `defence` mediumint(9) unsigned default NULL,
- `range` tinyint(2) unsigned default NULL,
- `slots` tinyint(1) unsigned default NULL,
- `equip_jobs` mediumint(8) unsigned default NULL,
- `equip_genders` tinyint(1) unsigned default NULL,
- `equip_locations` smallint(4) unsigned default NULL,
- `weapon_level` tinyint(1) unsigned default NULL,
- `equip_level` tinyint(3) unsigned default NULL,
- `view` tinyint(3) unsigned default NULL,
- `script_use` text,
- `script_equip` text,
- PRIMARY KEY (`id`)
-) TYPE=MyISAM;
-
-INSERT INTO `item_db` VALUES (501, 'Red_Potion', 'Red Potion', 0, 50, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
-INSERT INTO `item_db` VALUES (502, 'Orange_Potion', 'Orange Potion', 0, 200, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
-INSERT INTO `item_db` VALUES (503, 'Yellow_Potion', 'Yellow Potion', 0, 550, NULL, 130, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
-INSERT INTO `item_db` VALUES (504, 'White_Potion', 'White Potion', 0, 1200, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
-INSERT INTO `item_db` VALUES (505, 'Blue_Potion', 'Blue Potion', 0, 5000, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(40,59);', NULL);
-INSERT INTO `item_db` VALUES (506, 'Green_Potion', 'Green Potion', 0, 40, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion;', NULL);
-INSERT INTO `item_db` VALUES (507, 'Red_Herb', 'Red Herb', 0, 18, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(18,27),0;', NULL);
-INSERT INTO `item_db` VALUES (508, 'Yellow_Herb', 'Yellow Herb', 0, 40, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(38,57),0;', NULL);
-INSERT INTO `item_db` VALUES (509, 'White_Herb', 'White Herb', 0, 120, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(75,114),0;', NULL);
-INSERT INTO `item_db` VALUES (510, 'Blue_Herb', 'Blue Herb', 0, 60, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(15,29);', NULL);
-INSERT INTO `item_db` VALUES (511, 'Green_Herb', 'Green Herb', 0, 10, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison;', NULL);
-INSERT INTO `item_db` VALUES (512, 'Apple', 'Apple', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(16,21),0;', NULL);
-INSERT INTO `item_db` VALUES (513, 'Banana', 'Banana', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(17,20),0;', NULL);
-INSERT INTO `item_db` VALUES (514, 'Grape', 'Grape', 0, 200, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(10,14);', NULL);
-INSERT INTO `item_db` VALUES (515, 'Carrot', 'Carrot', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(18,19),0;', NULL);
-INSERT INTO `item_db` VALUES (516, 'Sweet_Potato', 'Sweet Potato', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(15,22),0;', NULL);
-INSERT INTO `item_db` VALUES (517, 'Meat', 'Meat', 0, 50, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(70,99),0;', NULL);
-INSERT INTO `item_db` VALUES (518, 'Honey', 'Honey', 0, 500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(70,99),rand(20,39);', NULL);
-INSERT INTO `item_db` VALUES (519, 'Milk', 'Milk', 0, 25, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(27,36),0;', NULL);
-INSERT INTO `item_db` VALUES (520, 'Hinalle_Leaflet', 'Hinalle Leaflet', 0, 150, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
-INSERT INTO `item_db` VALUES (521, 'Aloe_Leaflet', 'Aloe Leaflet', 0, 360, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
-INSERT INTO `item_db` VALUES (522, 'Mastela_Fruit', 'Mastela Fruit', 0, 840, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(400,599),0;', NULL);
-INSERT INTO `item_db` VALUES (523, 'Holy_Water', 'Holy Water', 0, 20, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Curse;', NULL);
-INSERT INTO `item_db` VALUES (525, 'Panacea', 'Panacea', 0, 500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse;', NULL);
-INSERT INTO `item_db` VALUES (526, 'Royal_Jelly', 'Royal Jelly', 0, 7000, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),rand(40,59); sc_end SC_Posion; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse;', NULL);
-INSERT INTO `item_db` VALUES (528, 'Monster\'s_Feed', 'Monster\'s Feed', 0, 60, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(72,107),0;', NULL);
-INSERT INTO `item_db` VALUES (529, 'Candy', 'Candy', 0, 10, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
-INSERT INTO `item_db` VALUES (530, 'Candy_Cane', 'Candy Cane', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
-INSERT INTO `item_db` VALUES (531, 'Apple_Juice', 'Apple Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(25,34),0;', NULL);
-INSERT INTO `item_db` VALUES (532, 'Banana_Juice', 'Banana Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(26,33),0;', NULL);
-INSERT INTO `item_db` VALUES (533, 'Grape_Juice', 'Grape Juice', 0, 250, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(15,24);', NULL);
-INSERT INTO `item_db` VALUES (534, 'Carrot_Juice', 'Carrot Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(27,32),0;', NULL);
-INSERT INTO `item_db` VALUES (535, 'Pumkin', 'Pumpkin', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 19,0;', NULL);
-INSERT INTO `item_db` VALUES (536, 'Ice_Cream', 'Ice Cream', 0, 150, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
-INSERT INTO `item_db` VALUES (537, 'Pet_Food', 'Pet Food', 0, 1000, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,89),0;', NULL);
-INSERT INTO `item_db` VALUES (538, 'Well-baked_Cookie', 'Well-baked Cookie', 0, 1000, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(160,199),0;', NULL);
-INSERT INTO `item_db` VALUES (539, 'Piece_of_Cake', 'Piece of Cake', 0, 3000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(270,329),0;', NULL);
-INSERT INTO `item_db` VALUES (540, 'Falcon_food', 'Falcon food', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (541, 'Pecopeco_food', 'Pecopeco food', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (542, 'Festive_Cookie', 'Festive Cookie', 0, 10, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
-INSERT INTO `item_db` VALUES (543, 'Festive_Rainbow_Cake', 'Festive Rainbow Cake', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
-INSERT INTO `item_db` VALUES (544, 'Raw_Fish', 'Raw Fish', 0, 20, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(25,59),0;', NULL);
-INSERT INTO `item_db` VALUES (545, 'Condensed_Red_Potion', 'Condensed Red Potion', 0, NULL, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
-INSERT INTO `item_db` VALUES (546, 'Condensed_Yellow_Potion', 'Condensed Yellow Potion', 0, NULL, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
-INSERT INTO `item_db` VALUES (547, 'Condensed_White_Potion', 'Condensed White Potion', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
-INSERT INTO `item_db` VALUES (548, 'Cheese', 'Cheese', 0, 2800, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(10,14);', NULL);
-INSERT INTO `item_db` VALUES (549, 'Yam', 'Hot Potato', 0, 180, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,99),0;', NULL);
-INSERT INTO `item_db` VALUES (550, 'Rice_Cake', 'Rice Popper', 0, NULL, 5, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(10,14),0;', NULL);
-INSERT INTO `item_db` VALUES (551, 'Sushi', 'Sushi', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,60),0;', NULL);
-INSERT INTO `item_db` VALUES (552, 'Ketupat', 'Ketupat', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(100,200),0;', NULL);
-INSERT INTO `item_db` VALUES (553, 'Dumpling', 'Dumpling', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(39,68),0;', NULL);
-INSERT INTO `item_db` VALUES (554, 'Mochi', 'Mochi', 0, 100, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(100,200),0;', NULL);
-INSERT INTO `item_db` VALUES (555, 'Rice_Cake', 'Rice_Cake', 0, NULL, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(30,50),0;', NULL);
-INSERT INTO `item_db` VALUES (556, 'Rolled_Rice', 'Rolled Rice', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (557, 'Cut_Rice_Rolls', 'Cut Rice Rolls', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (558, 'Chocolate', 'Chocolate', 0, 500, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 1,1;', NULL);
-INSERT INTO `item_db` VALUES (559, 'Hand-made_Chocolate', 'Hand-made Chocolate', 0, 5000, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 50,50;', NULL);
-INSERT INTO `item_db` VALUES (560, 'White_Chocolate', 'White Chocolate', 0, 0, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (561, 'Milk_Chocolate_Bar', 'Milk Chocolate', 0, 0, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (562, 'Pizza', 'Pizza', 0, NULL, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (563, 'Pizza_', 'Pizza', 0, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (564, 'Meat_Dumpling', 'Meat Dumpling', 0, NULL, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
-INSERT INTO `item_db` VALUES (601, 'Fly_Wing', 'Fly Wing', 2, 60, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'warp "Random",0,0;', NULL);
-INSERT INTO `item_db` VALUES (602, 'Butterfly_Wing', 'Butterfly Wing', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'warp "SavePoint",0,0;', NULL);
-INSERT INTO `item_db` VALUES (603, 'Old_Blue_Box', 'Old Blue Box', 2, 10000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -1,1;', NULL);
-INSERT INTO `item_db` VALUES (604, 'Dead_Branch', 'Dead Branch', 2, 50, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'monster "this",0,0,"--ja--",-1,1,;', NULL);
-INSERT INTO `item_db` VALUES (605, 'Anodyne', 'Anodyne', 2, 2000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 8,1,"??????????";', NULL);
-INSERT INTO `item_db` VALUES (606, 'Aloevera', 'Aloevera', 2, 1500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 6,1,"?????";', NULL);
-INSERT INTO `item_db` VALUES (607, 'Yggdrasilberry', 'Yggdrasilberry', 0, 2, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 100,100;', NULL);
-INSERT INTO `item_db` VALUES (608, 'Yggdrasil_Seed', 'Yggdrasil Seed', 0, 5000, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 50,50;', NULL);
-INSERT INTO `item_db` VALUES (609, 'Amulet', 'Amulet', 2, 100, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (610, 'Yggdrasil_Leaf', 'Yggdrasil Leaf', 2, 4000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 54,1,"????????";', NULL);
-INSERT INTO `item_db` VALUES (611, 'Magnifier', 'Magnifier', 2, 40, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 40,1,"???";', NULL);
-INSERT INTO `item_db` VALUES (612, 'Mini_Furnace', 'Mini Furnace', 2, 150, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 16;', NULL);
-INSERT INTO `item_db` VALUES (613, 'Iron_Hammer', 'Iron Hammer', 2, 1000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 1;', NULL);
-INSERT INTO `item_db` VALUES (614, 'Golden_Hammer', 'Golden Hammer', 2, 3000, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 2;', NULL);
-INSERT INTO `item_db` VALUES (615, 'Oridecon_Hammer', 'Oridecon Hammer', 2, 5000, NULL, 400, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 3;', NULL);
-INSERT INTO `item_db` VALUES (616, 'Old_Card_Album', 'Old Card Album', 2, 10000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -3,1;', NULL);
-INSERT INTO `item_db` VALUES (617, 'Old_Violet_Box', 'Old Violet Box', 2, 10000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -2,1;', NULL);
-INSERT INTO `item_db` VALUES (618, 'Worn_Out_Scroll', 'Worn Out Scroll', 2, 50, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -5,1;', NULL);
-INSERT INTO `item_db` VALUES (619, 'Unripe_Apple', 'Unripe Apple', 2, 1000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1002;', NULL);
-INSERT INTO `item_db` VALUES (620, 'Orange_Juice', 'Orange Juice', 2, 1500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1113;', NULL);
-INSERT INTO `item_db` VALUES (621, 'Bitter_Herb', 'Bitter Herb', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1031;', NULL);
-INSERT INTO `item_db` VALUES (622, 'Rainbow_Carrot', 'Rainbow Carrot', 2, 2500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1063;', NULL);
-INSERT INTO `item_db` VALUES (623, 'Earthworm_the_Dude', 'Earthworm the Dude', 2, 4000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1049;', NULL);
-INSERT INTO `item_db` VALUES (624, 'Rotten_Fish', 'Rotten Fish', 2, 2500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1011;', NULL);
-INSERT INTO `item_db` VALUES (625, 'Rusty_Iron', 'Rusty Iron', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1042;', NULL);
-INSERT INTO `item_db` VALUES (626, 'Monster_Juice', 'Monster Juice', 2, 1500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1035;', NULL);
-INSERT INTO `item_db` VALUES (627, 'Sweet_Milk', 'Sweet Milk', 2, 7000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1167;', NULL);
-INSERT INTO `item_db` VALUES (628, 'Well_Dried_Bone', 'Well Dried Bone', 2, 10000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1107;', NULL);
-INSERT INTO `item_db` VALUES (629, 'Singing_Flower', 'Singing Flower', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1052;', NULL);
-INSERT INTO `item_db` VALUES (630, 'Dew_Laden_Moss', 'Dew Laden Moss', 2, 10, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1014;', NULL);
-INSERT INTO `item_db` VALUES (631, 'Deadly_Noxious_Herb', 'Deadly Noxious Herb', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1077;', NULL);
-INSERT INTO `item_db` VALUES (632, 'Fatty_Chubby_Earthworm', 'Fatty Chubby Earthworm', 2, 5000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1019;', NULL);
-INSERT INTO `item_db` VALUES (633, 'Baked_Yam', 'Baked Yam', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1056;', NULL);
-INSERT INTO `item_db` VALUES (634, 'Tropical_Banana', 'Tropical Banana', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1057;', NULL);
-INSERT INTO `item_db` VALUES (635, 'Horror_of_Tribe', 'Horror of Tribe', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1023;', NULL);
-INSERT INTO `item_db` VALUES (636, 'No_Recipient', 'No Recipient', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1026;', NULL);
-INSERT INTO `item_db` VALUES (637, 'Old_Broom', 'Old Broom', 2, 350, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1110;', NULL);
-INSERT INTO `item_db` VALUES (638, 'Silver_Knife_of_Chastity', 'Silver Knife of Chastity', 2, 12000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1170;', NULL);
-INSERT INTO `item_db` VALUES (639, 'Armlet_of_Obedience', 'Armlet of Obedience', 2, 18000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1029;', NULL);
-INSERT INTO `item_db` VALUES (640, 'Shining_Stone', 'Shining Stone', 2, 3000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1155;', NULL);
-INSERT INTO `item_db` VALUES (641, 'Contract_in_Shadow', 'Contracts in Shadow', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1109;', NULL);
-INSERT INTO `item_db` VALUES (642, 'Book_of_Devil', 'Book of Devil', 2, 1800, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1101;', NULL);
-INSERT INTO `item_db` VALUES (643, 'Pet_Incubator', 'Pet Incubator', 2, 3000, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'bpet;', NULL);
-INSERT INTO `item_db` VALUES (644, 'Gift_Box', 'Gift Box', 2, 2, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
-INSERT INTO `item_db` VALUES (645, 'Concentration_Potion', 'Concentration Potion', 2, 800, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_SpeedPot0,1800,0;', NULL);
-INSERT INTO `item_db` VALUES (656, 'Awakening_Potion', 'Awakening Potion', 2, 1500, NULL, 150, NULL, NULL, NULL, NULL, 8904431, 2, NULL, NULL, 40, NULL, 'sc_start SC_SpeedPot1,1800,0;', NULL);
-INSERT INTO `item_db` VALUES (657, 'Berserk_Potion', 'Berserk Potion', 2, 3000, NULL, 200, NULL, NULL, NULL, NULL, 411302, 2, NULL, NULL, 85, NULL, 'sc_start SC_SpeedPot2,1800,0;', NULL);
-INSERT INTO `item_db` VALUES (658, 'Tribal_Solidarity', 'Tribal Solidarity', 3, 1000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (659, 'Her_Heart', 'Her Heart', 2, 500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1188;', NULL);
-INSERT INTO `item_db` VALUES (660, 'Forbidden_Red_Candle', 'Red Candle', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1200;', NULL);
-INSERT INTO `item_db` VALUES (661, 'Sky_Apron', 'Sky Apron', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1275;', NULL);
-INSERT INTO `item_db` VALUES (663, 'Rice_Cake', 'Rice Cake', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 10,10;', NULL);
-INSERT INTO `item_db` VALUES (664, 'Gift_Box_', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
-INSERT INTO `item_db` VALUES (665, 'Gift_Box__', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
-INSERT INTO `item_db` VALUES (666, 'Gift_Box___', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
-INSERT INTO `item_db` VALUES (667, 'Gift_Box____', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
-INSERT INTO `item_db` VALUES (668, 'Angpow', 'Angpow', 0, 1, NULL, 2, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'set Zeny,Zeny+rand(100,10000);', NULL);
-INSERT INTO `item_db` VALUES (669, 'Rice_Cake_Soup', 'Rice Cake Soup', 2, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (670, 'Gold_Coin_Pouch', 'Gold Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (671, 'Gold_Coin', 'Gold Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (672, 'Copper_Coin_Pouch', 'Copper Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (673, 'Copper_Coin', 'Copper_Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (674, 'Mysterious_Ore_Coin', 'Mysterious Ore Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (675, 'Silver_Coin', 'Silver Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (676, 'Silver_Coin_Pouch', 'Silver Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (677, 'Platinum Coin', 'Platinum Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (678, 'Deadly_Poison_Bottle', 'Deadly Poison Bottle', 2, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (679, 'Recall_Pills', 'Recall Pills', 2, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (680, 'Carnation', 'Carnation', 2, NULL, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (681, 'Wedding_Photo_Album', 'Wedding Photo Album', 2, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (682, 'Realgar_Wine', 'Realgar Wine', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_ATKPOT,30,30;', NULL);
-INSERT INTO `item_db` VALUES (683, 'Exorcize_Herb', 'Exorcize Herb', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_MATKPOT,30,30;', NULL);
-INSERT INTO `item_db` VALUES (701, 'Ora_Ora', 'Ora Ora', 3, 55000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (702, 'Animal_Gore', 'Animal Gore', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (703, 'Hinalle', 'Hinalle', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (704, 'Aloe', 'Aloe', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (705, 'Clover', 'Clover', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (706, 'Four_Leaf_Clover', 'Four-Leaf Clover', 3, 80000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (707, 'Singing_Plant', 'Singing Plant', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (708, 'Ment', 'Ment', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (709, 'Izidor', 'Izidor', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (710, 'Illusion_Flower', 'Illusion Flower', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (711, 'Shoot', 'Shoot', 3, 16, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (712, 'Flower', 'Flower', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (713, 'Empty_Bottle', 'Empty Bottle', 3, 6, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (714, 'Emperium', 'Emperium', 3, 2, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (715, 'Yellow_Gemstone', 'Yellow Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (716, 'Red_Gemstone', 'Red Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (717, 'Blue_Gemstone', 'Blue Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (718, 'Garnet', 'Garnet', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (719, 'Amethyst', 'Amethyst', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (720, 'Aquamarine', 'Aquamarine', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (721, 'Emerald', 'Emerald', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (722, 'Pearl', 'Pearl', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (723, 'Ruby', 'Ruby', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (724, 'Cursed_Ruby', 'Cursed Ruby', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (725, 'Sardonyx', 'Sardonyx', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (726, 'Sapphire', 'Sapphire', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (727, 'Opal', 'Opal', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (728, 'Topaz', 'Topaz', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (729, 'Zircon', 'Zircon', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (730, '1_Carat_Diamond', '1 Carat Diamond', 3, 10000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (731, '2_Carat_Diamond', '2 Carat Diamond', 3, 25000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (732, '3_Carat_Diamond', '3 Carat Diamond', 3, 55000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (733, 'Cracked_Diamond', 'Cracked Diamond', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (734, 'Red_Frame', 'Red Frame', 3, 3000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (735, 'Chung_Jah', 'Chung Jah', 3, 5000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (736, 'China', 'China', 3, 1000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (737, 'Black_Ladle', 'Black Ladle', 3, 400, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (738, 'Pencil_Case', 'Pencil Case', 3, 300, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (739, 'Rouge', 'Rouge', 3, 10000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (740, 'Puppet', 'Puppet', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (741, 'Poring_Doll', 'Poring Doll', 3, 1800, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (742, 'Chonchon_Doll', 'Chonchon Doll', 3, 3000, 1000, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (743, 'Spore_Doll', 'Spore Doll', 3, 5500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (744, 'Bouquet', 'Bouquet', 3, 2000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (745, 'Wedding_Bouquet', 'Wedding Bouquet', 3, 10000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (746, 'Glass_Bead', 'Glass Bead', 3, 1400, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (747, 'Crystal_Mirror', 'Crystal Mirror', 3, 15000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (748, 'Witherless_Rose', 'Witherless Rose', 3, 55000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (749, 'Frozen_Rose', 'Frozen Rose', 3, 35000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (750, 'Baphomet_Doll', 'Baphomet Doll', 3, 18000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (751, 'Osiris_Doll', 'Osiris Doll', 3, 14000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (752, 'Rocker_Doll', 'Grasshopper Doll', 3, 4000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (753, 'Yoyo_Doll', 'Yoyo Doll', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (754, 'Raccoon_Doll', 'Raccoon Doll', 3, 5000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (756, 'Rough_Oridecon', 'Rough Oridecon', 3, 548, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (757, 'Rough_Elunium', 'Rough Elunium', 3, 648, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (901, 'Danggie', 'Danggie', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (902, 'Tree_Root', 'Tree Root', 3, 12, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (903, 'Reptile_Tongue', 'Reptile Tongue', 3, 50, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (904, 'Scorpion_Tail', 'Scorpion Tail', 3, 124, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (905, 'Stem', 'Stem', 3, 58, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (906, 'Pointed_Scale', 'Pointed Scale', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (907, 'Resin', 'Resin', 3, 120, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (908, 'Spawn', 'Spawn', 3, 148, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (909, 'Jellopy', 'Jellopy', 3, 6, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (910, 'Garlet', 'Garlet', 3, 40, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (911, 'Scell', 'Scell', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (912, 'Zargon', 'Zargon', 3, 480, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (913, 'Tooth_of_Bat', 'Tooth of Bat', 3, 34, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (914, 'Fluff', 'Fluff', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (915, 'Chrysalis', 'Chrysalis', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (916, 'Feather_of_Birds', 'Feather of Birds', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (917, 'Talon', 'Talon', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (918, 'Sticky_Webfoot', 'Sticky Webfoot', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (919, 'Animal_Skin', 'Animal Skin', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (920, 'Wolf_Claw', 'Wolf Claw', 3, 58, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (921, 'Mushroom_Spore', 'Mushroom Spore', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (922, 'Orc\'s_Fang', 'Orc\'s Fang', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (923, 'Evil_Horn', 'Evil Horn', 3, 1020, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (924, 'Powder_of_Butterfly', 'Powder of Butterfly', 3, 90, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (925, 'Bill_of_Birds', 'Bill of Birds', 3, 64, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (926, 'Snake_Scale', 'Snake Scale', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (928, 'Insect_Feeler', 'Insect Feeler', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (929, 'Immortal_Heart', 'Immortal Heart', 3, 374, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (930, 'Rotten_Bandage', 'Rotten Bandage', 3, 358, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (931, 'Orcish_Voucher', 'Orcish Voucher', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (932, 'Skel-Bone', 'Skel-Bone', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (934, 'Memento', 'Memento', 3, 600, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (935, 'Shell', 'Shell', 3, 14, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (936, 'Scale_Shell', 'Scale Shell', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (937, 'Venom_Canine', 'Venom Canine', 3, 148, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (938, 'Sticky_Mucus', 'Sticky Mucus', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (939, 'Bee_Sting', 'Bee Sting', 3, 32, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (940, 'Grasshopper\'s_Leg', 'Grasshopper\'s Leg', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (941, 'Nose_Ring', 'Nose Ring', 3, 568, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (942, 'Yoyo_Tail', 'Yoyo Tail', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (943, 'Solid_Shell', 'Solid Shell', 3, 448, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (944, 'Horseshoe', 'Horseshoe', 3, 588, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (945, 'Raccoon_Leaf', 'Raccoon Leaf', 3, 106, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (946, 'Snail\'s_Shell', 'Snail\'s Shell', 3, 64, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (947, 'Horn', 'Horn', 3, 116, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (948, 'Bear\'s_Footskin', 'Bear\'s Footskin', 3, 174, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (949, 'Feather', 'Feather', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (950, 'Heart_of_Mermaid', 'Heart of Mermaid', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (951, 'Fin', 'Fin', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (952, 'Cactus_Needle', 'Cactus Needle', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (953, 'Stone_Heart', 'Stone Heart', 3, 184, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (954, 'Shining_Scale', 'Shining Scale', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (955, 'Worm_Peeling', 'Worm Peeling', 3, 52, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (956, 'Gill', 'Gill', 3, 342, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (957, 'Decayed_Nail', 'Decayed Nail', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (958, 'Horrendous_Mouth', 'Horrendous Mouth', 3, 390, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (959, 'Stinky_Scale', 'Stinky Scale', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (960, 'Nipper', 'Nipper', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (961, 'Conch', 'Conch', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (962, 'Tentacle', 'Tentacle', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (963, 'Sharp_scale', 'Sharp Scale', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (964, 'Crab_Shell', 'Crap Shell', 3, 90, 5, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (965, 'Clam_Shell', 'Clam Shell', 3, 56, 5, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (966, 'Clam_Flesh', 'Clam Flesh', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (967, 'Turtle_Shell', 'Turtle Shell', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (968, 'Heroic_Emblem', 'Heroic Emblem', 3, 3000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (969, 'Gold', 'Gold', 3, 200000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (970, 'Alcohol', 'Alcohol', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (971, 'Detrimindexta', 'Detrimindexta', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (972, 'Karvodailnirol', 'Karvodailnirol', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (973, 'Counteragent', 'Counteragent', 3, 200, NULL, 70, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (974, 'Mixture', 'Mixture', 3, 200, NULL, 70, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (975, 'Scarlet_Dyestuffs', 'Scarlet Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (976, 'Lemon_Dyestuffs', 'Lemon Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (978, 'Cobaltblue_Dyestuffs', 'Cobaltblue Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (979, 'Darkgreen_Dyestuffs', 'Darkgreen Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (980, 'Orange_Dyestuffs', 'Orange Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (981, 'Violet_Dyestuffs', 'Violet Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (982, 'White_Dyestuffs', 'White Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (983, 'Black_Dyestuffs', 'Black Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (984, 'Oridecon', 'Oridecon', 3, 1100, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (985, 'Elunium', 'Elunium', 3, 1100, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (986, 'Anvil', 'Anvil', 3, 30000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (987, 'Oridecon_Anvil', 'Oridecon Anvil', 3, 120000, NULL, 700, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (988, 'Golden_Anvil', 'Golden Anvil', 3, 300000, NULL, 900, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (989, 'Emperium_Anvil', 'Emperium Anvil', 3, 600000, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (990, 'Red_Blood', 'Red Blood', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (991, 'Crystal_Blue', 'Crystal Blue', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (992, 'Wind_of_Verdure', 'Wind of Verdure', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (993, 'Green_Live', 'Green Live', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (994, 'Flame_Heart', 'Flame Heart', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (995, 'Mystic_Frozen', 'Mystic Frozen', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (996, 'Rough_Wind', 'Rough Wind', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (997, 'Great_Nature', 'Great Nature', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (998, 'Iron', 'Iron', 3, 100, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (999, 'Steel', 'Steel', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1000, 'Star_Crumb', 'Star Crumb', 3, 4500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1001, 'Star_Dust', 'Star Dust', 3, 1500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1002, 'Iron_Ore', 'Iron Ore', 3, 50, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1003, 'Coal', 'Coal', 3, 500, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1004, 'Chivalry_Emblem', 'Chivalry Emblem', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1005, 'Hammer_of_Blacksmith', 'Hammer of Blacksmith', 3, 2, NULL, 800, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1006, 'Old_Magic_Book', 'Old Magic Book', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1007, 'Necklace_of_Wisdom', 'Necklace of Wisdom', 3, 2, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1008, 'Necklace_of_Oblivion', 'Necklace of Oblivion', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1009, 'Hand_of_God', 'Hand of God', 3, 2, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1010, 'Phracon', 'Phracon', 3, 200, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1011, 'Emveretarcon', 'Emveretarcon', 3, 1000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1012, 'Frill', 'Frill', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1013, 'Rainbow_Shell', 'Rainbow Shell', 3, 90, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1014, 'Ant_Jaw', 'Ant Jaw', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1015, 'Tongue', 'Tongue', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1016, 'Rat_Tail', 'Rat Tail', 3, 52, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1017, 'Mole_Whiskers', 'Mole Whiskers', 3, 106, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1018, 'Mole_Claw', 'Mole Claw', 3, 210, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1019, 'Trunk', 'Trunk', 3, 60, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1020, 'Black_Hair', 'Black Hair', 3, 292, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1021, 'Dokkaebi_Horn', 'Dokkaebi Horn', 3, 292, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1022, 'Nine_Tails', 'Nine Tails', 3, 650, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1023, 'Fish_Tail', 'Fish Tail', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1024, 'Squid_Ink', 'Squid ink', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1025, 'Cobweb', 'Cobweb', 3, 184, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1026, 'Acorn', 'Acorn', 3, 98, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1027, 'Porcupine_Quill', 'Porcupine Quill', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1028, 'Mane', 'Mane', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1029, 'Tiger_Skin', 'Tiger Skin', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1030, 'Tiger\'s_Footskin', 'Tiger\'s Footskin', 3, 1500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1031, 'Mantis_Scythe', 'Mantis Scythe', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1032, 'Maneater_Blossom', 'Maneater Blossom', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1033, 'Maneater_Root', 'Maneater Root', 3, 208, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1034, 'Blue_Hair', 'Blue Hair', 3, 342, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1035, 'Dragon_Canine', 'Dragon Canine', 3, 484, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1036, 'Dragon_Scale', 'Dragon Scale', 3, 500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1037, 'Dragon_Tail', 'Dragon Tail', 3, 1200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1038, 'Little_Evil_Horn', 'Little Evil Horn', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1039, 'Little_Evil_Wing', 'Little Evil Wing', 3, 2000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1040, 'Elder_Pixie\'s_Moustache', 'Elder Pixie\'s Moustache', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1041, 'Lantern', 'Lantern', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1042, 'Bug_Leg', 'Bug Leg', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1043, 'Orc_Claw', 'Orc Claw', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1044, 'Zenorc\'s_Fang', 'Zenorc\'s Fang', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1045, 'Cultish_Masque', 'Cultish Masque', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1046, 'Scorpion_Nipper', 'Scorpion Nipper', 3, 614, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1047, 'Dead_Medusa', 'Dead Medusa', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1048, 'Horrendous_Hair', 'Horrendous Hair', 3, 800, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1049, 'Skirt_of_Virgin', 'Skirt of Virgin', 3, 1700, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1050, 'Tendon', 'Tendon', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1051, 'Detonator', 'Detonator', 3, 450, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1052, 'Single_Cell', 'Single Cell', 3, 46, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1053, 'Ancient_Tooth', 'Ancient Tooth', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1054, 'Ancient_Lips', 'Ancient Lips', 3, 1000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1055, 'Earthworm_Peeling', 'Earthworm Peeling', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1056, 'Grit', 'Grit', 3, 306, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1057, 'Moth_Dust', 'Moth Dust', 3, 138, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1058, 'Moth_Wings', 'Moth Wings', 3, 200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1059, 'Fabric', 'Fabric', 3, 306, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1060, 'Golden_Hair', 'Golden Hair', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1061, 'Witched_Starsand', 'Witched Starsand', 3, 484, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1062, 'Jack_o\'_Pumpkin', 'Jack o\' Pumpkin', 3, 374, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1063, 'Fang', 'Fang', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1064, 'Reins', 'Reins', 3, 802, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1065, 'Trap', 'Trap', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1066, 'Fine-grained_Trunk', 'Fine-grained Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1067, 'Solid_Trunk', 'Solid Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1068, 'Barren_Trunk', 'Barren Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1069, 'Orange_Net_Mushroom', 'Orange Net Mushroom', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1070, 'Orange_Gooey_Mushroom_', 'Orange Gooey Mushroom', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1071, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1072, 'Delivery_Message', 'DEL Message', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1073, 'Voucher', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1074, 'Voucher_', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1075, 'Voucher__', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1076, 'Voucher___', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1077, 'Voucher____', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1078, 'Voucher_____', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1079, 'Voucher______', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1080, 'Voucher_______', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1081, 'Delivery_Box', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1082, 'Delivery_Box_', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1083, 'Delivery_Box__', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1084, 'Kafra_Pass', 'Kapra Pass', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1085, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1086, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1087, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1088, 'Morroc_Solution', 'Morocc Solution', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1089, 'Payon_Solution', 'Payon Solution', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1090, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1091, 'Delivery_Box', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1092, 'Empty_Test_Tube', 'Empty Testtube', 3, 3, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1093, 'Empty_Potion_Bottle', 'Empty Potion Bottle', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1094, 'Short_Daenggie', 'Short Daenggie', 3, 278, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1095, 'Clock_Hand', 'Needle of Alarm', 3, 546, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1096, 'Round_Shell', 'Round Shell', 3, 954, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1097, 'Worn_Out_Page', 'Worn Out Page', 3, 820, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1098, 'Manacles', 'Manacles', 3, 658, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1099, 'Worn-out_Prison_Uniform', 'Worn-out Prison Uniform', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1101, 'Sword', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1102, 'Sword_', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1103, 'Sword__', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1104, 'Falchion', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1105, 'Falchion_', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1106, 'Falchion__', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1107, 'Blade', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1108, 'Blade_', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1109, 'Blade__', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1110, 'Rapier', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 2, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1111, 'Rapier_', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 3, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1112, 'Rapier__', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 0, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1113, 'Scimiter', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 2, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1114, 'Scimiter_', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 3, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1115, 'Scimiter__', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 0, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1116, 'Katana', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 3, 16514, 2, 34, 1, 4, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1117, 'Katana_', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 4, 16514, 2, 34, 1, 4, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1118, 'Katana__', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 0, 16514, 2, 34, 1, 4, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1119, 'Tsurugi', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 1, 414946, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1120, 'Tsurugi_', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1121, 'Tsurugi__', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 0, 414946, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1122, 'Ring_Pommel_Saber', 'Ring Pommel Saber', 4, 24000, NULL, 900, 100, NULL, 1, 2, 414946, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1123, 'Haedonggum', 'Haedonggum', 4, 50000, NULL, 900, 120, NULL, 1, 1, 414946, 2, 2, 3, 27, 2, NULL, 'bonus bInt,3;');
-INSERT INTO `item_db` VALUES (1124, 'Orcish_Sword', 'Orcish sword', 4, 20, NULL, 800, 90, NULL, 1, 0, 8803555, 2, 2, 3, 5, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1125, 'Ring_Pommel_Saber_', 'Ring Pommel Saber', 4, 24000, NULL, 900, 100, NULL, 1, 3, 414946, 2, 2, 2, 14, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1126, 'Saber', 'Saber', 4, 49000, NULL, 1000, 115, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1127, 'Saber_', 'Saber', 4, 49000, NULL, 1000, 115, NULL, 1, 3, 414946, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1128, 'Haedonggum_', 'Haedonggum', 4, 50000, NULL, 900, 120, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, 'bonus bInt,3;');
-INSERT INTO `item_db` VALUES (1129, 'Flamberge', 'Flamberge', 4, 60000, NULL, 1500, 150, NULL, 1, 0, 16512, 2, 2, 3, 27, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1130, 'Nagan', 'Nagan', 4, 20, NULL, 500, 120, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bDoubleRate,25; bonus2 bAddRace,7,5;');
-INSERT INTO `item_db` VALUES (1131, 'Ice_Falchion', 'Ice Falchion', 4, 20, NULL, 600, 100, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,1; skill 14,3; bonus2 bAddEff,Eff_Freeze,500; bonus3 bAutoSpell,14,3,25;');
-INSERT INTO `item_db` VALUES (1132, 'Edge', 'Edge', 4, 20, NULL, 700, 115, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,11,10;');
-INSERT INTO `item_db` VALUES (1133, 'Fire_Brand', 'Fire Brand', 4, 20, NULL, 500, 100, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,3; skill 19,3; bonus3 bAutoSpell,19,3,25;');
-INSERT INTO `item_db` VALUES (1134, 'Caesar\'s_Sword', 'Caesar\'s Sword', 4, 20, NULL, 700, 140, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bAddRace,3,25; bonus bIgnoreDefRace,3;');
-INSERT INTO `item_db` VALUES (1135, 'Cutlas', 'Cutlas', 4, 20, NULL, 900, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'skill 5,5; bonus bStr,2; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (1136, 'Solar_Sword', 'Solar Sword', 4, 20, NULL, 1200, 85, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,3; bonus2 bHPDrainRate,100,1;');
-INSERT INTO `item_db` VALUES (1137, 'Excalibur', 'Excalibur', 4, 20, NULL, 1200, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,6;');
-INSERT INTO `item_db` VALUES (1138, 'Mysteltainn_', 'Mysteltainn', 4, 20, NULL, 1000, 170, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,7; bonus2 bAddEle,8,15; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3;');
-INSERT INTO `item_db` VALUES (1139, 'Talefing_', 'Talefing', 4, 20, NULL, 1000, 200, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (1140, 'Byeollungum', 'Byeollungum', 4, 20, NULL, 900, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bSubRace,11,-10; bonus2 bAddRace,10,50; bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (1141, 'Immaterial_Sword', 'Immaterial Sword', 4, 20, NULL, 900, 140, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,8;');
-INSERT INTO `item_db` VALUES (1142, 'Jewel_Sword', 'Crystal Sword', 4, 20, NULL, 2200, 104, NULL, 1, 0, 414946, 2, 2, 3, 68, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1143, 'Gaia_Sword', 'Gaia Sword', 4, 20, NULL, 2500, 115, NULL, 1, 0, 414946, 2, 2, 3, 74, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (1144, 'Sashimi', 'Sashimi', 4, 20, NULL, 1400, 75, NULL, 1, 0, 414946, 2, 2, 3, 48, 2, NULL, 'bonus bAtkEle,4; bonus3 bAddMonsterDropItem,544,5,2500;');
-INSERT INTO `item_db` VALUES (1145, 'Holy_Avenger', 'Holy Avenger', 4, 20, NULL, 1350, 125, NULL, 1, 0, 16384, 2, 2, 3, 75, 2, NULL, 'bonus bAtkEle,6; bonus bVit,2;');
-INSERT INTO `item_db` VALUES (1151, 'Slayer', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 2, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1152, 'Slayer_', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 3, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1153, 'Slayer__', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 0, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1154, 'Bastard_Sword', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 2, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1155, 'Bastard_Sword_', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 3, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1156, 'Bastard_Sword__', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 0, 16514, 2, 34, 2, 18, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1157, 'Two_hand_Sword', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 1, 16514, 2, 34, 3, 33, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1158, 'Two_hand_Sword_', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 2, 16514, 2, 34, 3, 33, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1159, 'Two_hand_Sword__', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 0, 16514, 2, 34, 3, 33, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1160, 'Broad_Sword', 'Broad Sword', 4, 65000, NULL, 2000, 140, NULL, 1, 1, 16514, 2, 34, 3, 33, 3, NULL, 'bonus bDef,5;');
-INSERT INTO `item_db` VALUES (1161, 'Balmung', 'Balmung', 4, 20, NULL, 1000, 250, NULL, 2, 0, 2088959, 2, 2, 4, 48, 1, NULL, 'bonus bInt,20; bonus bLuk,20;');
-INSERT INTO `item_db` VALUES (1162, 'Broad_Sword_', 'Broad Sword', 4, 65000, NULL, 2000, 140, NULL, 1, 2, 16514, 2, 34, 3, 33, 3, NULL, 'bonus bDef,5;');
-INSERT INTO `item_db` VALUES (1163, 'Claymore', 'Claymore', 4, 74000, NULL, 2500, 180, NULL, 1, 0, 16512, 2, 34, 3, 33, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1164, 'Muramasa', 'Muramasa', 4, 20, NULL, 1000, 155, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bCritical,30; bonus bAspdAddRate,8; bonus2 bAddEff2,Eff_Curse,200;');
-INSERT INTO `item_db` VALUES (1165, 'Masamune', 'Masamune', 4, 20, NULL, 1000, 200, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-50; bonus bDef2Rate,-50;');
-INSERT INTO `item_db` VALUES (1166, 'Dragon_Slayer', 'Dragon Slayer', 4, 20, NULL, 1300, 150, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bIgnoreDefRace,9; bonus2 bAddRace,9,15;');
-INSERT INTO `item_db` VALUES (1167, 'Schweizersabel', 'Schweizersabel', 4, 20, NULL, 1600, 160, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bAtkEle,4; skill 20,3; bonus bDef,1; bonus3 bAutoSpell,20,3,25;');
-INSERT INTO `item_db` VALUES (1168, 'Zweihander', 'Zweihander', 4, 20, NULL, 2200, 200, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (1169, 'Executioner_', 'Executioner', 4, 20, NULL, 2200, 155, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bIgnoreDefRace,7; bonus2 bAddRace,7,20; bonus2 bSubRace,7,-10; bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (1170, 'Katzbalger', 'Katzbalger', 4, 20, NULL, 2000, 175, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bVit,10; bonus bDef,10;');
-INSERT INTO `item_db` VALUES (1201, 'Knife', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1202, 'Knife_', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1203, 'Knife__', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1204, 'Cutter', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1205, 'Cutter_', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1206, 'Cutter__', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1207, 'Main_Gauche', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1208, 'Main_Gauche_', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1209, 'Main_Gauche__', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1210, 'Dirk', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1211, 'Dirk_', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1212, 'Dirk__', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1213, 'Dagger', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1214, 'Dagger_', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1215, 'Dagger__', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1216, 'Stiletto', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1217, 'Stiletto_', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1218, 'Stiletto__', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1219, 'Gladius', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 2, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1220, 'Gladius_', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 3, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1221, 'Gladius__', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 0, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1222, 'Damascus', 'Damascus', 4, 49000, NULL, 800, 118, NULL, 1, 1, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1223, 'Fortune_Sword', 'Fortune Sword', 4, 20, NULL, 500, 90, NULL, 1, 0, 2055918, 2, 2, 4, 24, 1, NULL, 'bonus bLuk,5; bonus bFlee2,20;');
-INSERT INTO `item_db` VALUES (1224, 'Sword_Breaker', 'Swordbreaker', 4, 20, NULL, 1000, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1225, 'Mail_Breaker', 'Mailbreaker', 4, 20, NULL, 1000, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1226, 'Damascus_', 'Damascus', 4, 49000, NULL, 800, 118, NULL, 1, 2, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1227, 'Weeder_Knife', 'Weeder Knife', 4, 20, NULL, 400, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,3; bonus2 bAddRace,3,15; bonus2 bSubRace,3,15;');
-INSERT INTO `item_db` VALUES (1228, 'Combat_Knife', 'Combat Knife', 4, 20, NULL, 400, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,7; bonus2 bSubRace,7,10; bonus2 bSubRace,6,-10;');
-INSERT INTO `item_db` VALUES (1229, 'Mama\'s_Knife', 'Mama\'s Knife', 4, 20, NULL, 500, 75, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bCritical,30; bonus2 bAddRace,7,3; bonus3 bAddMonsterDropItem,517,2,5000;');
-INSERT INTO `item_db` VALUES (1230, 'House_Auger', 'House Auger', 4, 20, NULL, 600, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bDefRatioAtkRace,10; bonus bDefRatioAtkRace,11;');
-INSERT INTO `item_db` VALUES (1231, 'Bazerald', 'Bazerald', 4, 20, NULL, 500, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bAtkEle,3; bonus bInt,5; bonus bMatkRate,10;');
-INSERT INTO `item_db` VALUES (1232, 'Assassin_Dagger', 'Assasin Dagger', 4, 20, NULL, 600, 140, NULL, 1, 0, 4096, 2, 2, 4, 36, 1, NULL, 'bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdAddRate,2; bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (1233, 'Exercise', 'Excorcise', 4, 20, NULL, 700, 90, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,6; bonus2 bSubRace,6,5; bonus2 bSubRace,7,-10;');
-INSERT INTO `item_db` VALUES (1234, 'Moonlight_Sword', 'Walgwanggum', 4, 20, NULL, 700, 50, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bMaxSPrate,10;');
-INSERT INTO `item_db` VALUES (1235, 'Azoth', 'Azoth', 4, 20, NULL, 700, 110, NULL, 1, 0, 262144, 2, 2, 4, 36, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1236, 'Sucsamad', 'Sucsamad', 4, 20, NULL, 800, 140, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus2 bAddEle,2,10; bonus2 bAddEle,4,10;');
-INSERT INTO `item_db` VALUES (1237, 'Grimtooth_', 'Grimtooth', 4, 20, NULL, 800, 180, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50;');
-INSERT INTO `item_db` VALUES (1238, 'Zeny_Knife', 'Zeny Knife', 4, 20, NULL, 1200, 64, NULL, 1, 0, 2055918, 2, 2, 3, 40, 1, NULL, 'bonus bGetZenyNum,100;');
-INSERT INTO `item_db` VALUES (1239, 'Poison_Knife', 'Poison Knife', 4, 20, NULL, 800, 64, NULL, 1, 0, 2055918, 2, 2, 3, 65, 1, NULL, 'bonus bAtkEle,5;');
-INSERT INTO `item_db` VALUES (1240, 'Princess_Knife', 'Princess Knife', 4, 20, NULL, 400, 84, NULL, 1, 0, 2055918, 2, 2, 4, 1, 1, NULL, 'bonus bStr,1; bonus bAgi,1; bonus bVit,1; bonus bInt,1; bonus bDex,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (1241, 'Cursed_Dagger', 'Cursed Dagger', 4, 20, NULL, 400, 55, NULL, 1, 0, 66052, 2, 2, 4, 85, 1, NULL, 'bonus2 bAddEff,Eff_Curse,500;');
-INSERT INTO `item_db` VALUES (1242, 'Counter_Dagger', 'Counter Dagger', 4, 20, NULL, 550, 75, NULL, 1, 0, 66052, 2, 2, 4, 55, 1, NULL, 'bonus bCritical,5; skill 61,1; bonus3 bAutoSpell,61,1,25;');
-INSERT INTO `item_db` VALUES (1243, 'Main_Gauche_For_Novice', 'Novice\'s Main Gauche', 4, NULL, NULL, 1, 45, NULL, 1, 0, 8388609, 2, 2, 1, 1, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (1250, 'Jur', 'Jur', 4, 19500, NULL, 800, 125, NULL, 1, 2, 4096, 2, 34, 2, 18, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (1251, 'Jur_', 'Jur', 4, 19500, NULL, 800, 125, NULL, 1, 3, 4096, 2, 34, 2, 18, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (1252, 'Katar', 'Katar', 4, 41000, NULL, 1200, 148, NULL, 1, 1, 4096, 2, 34, 3, 33, 16, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (1253, 'Katar_', 'Katar', 4, 41000, NULL, 1200, 148, NULL, 1, 2, 4096, 2, 34, 3, 33, 16, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (1254, 'Jamadhar', 'Jamadhar', 4, 37200, NULL, 1500, 165, NULL, 1, 0, 4096, 2, 34, 3, 33, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (1255, 'Jamadhar_', 'Jamadhar', 4, 37200, NULL, 1500, 165, NULL, 1, 1, 4096, 2, 34, 3, 33, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (1256, 'Katar_of_Cold_Icicle', 'Katar of Cold Icicle', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500;');
-INSERT INTO `item_db` VALUES (1257, 'Katar_of_Thornbush', 'Katar of Dusty Thornbush', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,2; bonus2 bAddEff,Eff_Blind,500;');
-INSERT INTO `item_db` VALUES (1258, 'Katar_of_Raging_Blaze', 'Katar of Raging Blaze', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,3; bonus2 bAddEff,Eff_Silence,500;');
-INSERT INTO `item_db` VALUES (1259, 'Katar_of_Piercing_Wind', 'Katar of Piercing Wind', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,4; bonus2 bAddEff,Eff_Sleep,500;');
-INSERT INTO `item_db` VALUES (1260, 'Sharpened_Legbone_of_Ghoul', 'Sharpened Legbone of Ghoul', 4, 52500, NULL, 1700, 150, NULL, 1, 0, 4096, 2, 34, 3, 65, 16, NULL, 'bonus bAtkEle,9;');
-INSERT INTO `item_db` VALUES (1261, 'Infiltrator', 'Infiltrator', 4, 57000, NULL, 1500, 140, NULL, 1, 0, 4096, 2, 34, 4, 75, 16, NULL, 'bonus2 bAddRace,7,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;');
-INSERT INTO `item_db` VALUES (1301, 'Axe', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 3, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
-INSERT INTO `item_db` VALUES (1302, 'Axe_', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 4, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
-INSERT INTO `item_db` VALUES (1303, 'Axe__', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 0, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
-INSERT INTO `item_db` VALUES (1304, 'Orcish_Axe', 'Orcish Axe', 4, 20, NULL, 1500, 75, NULL, 1, 0, 8803555, 2, 2, 3, 3, 6, NULL, NULL);
-INSERT INTO `item_db` VALUES (1305, 'Cleaver', 'Cleaver', 4, 20, NULL, 1200, 140, NULL, 1, 0, 8668323, 2, 2, 4, 44, 6, NULL, 'bonus2 bAddRace,7,5; bonus3 bAddMonsterDropItem,517,2,3000;');
-INSERT INTO `item_db` VALUES (1306, 'War_Axe', 'War Axe', 4, 20, NULL, 4200, 145, NULL, 1, 1, 263168, 2, 2, 3, 76, 6, NULL, 'bonus bDex,2; bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (1351, 'Battle_Axe', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 3, 279714, 2, 34, 1, 3, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1352, 'Battle_Axe_', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 4, 279714, 2, 34, 1, 3, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1353, 'Battle_Axe__', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 0, 279714, 2, 34, 1, 3, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1354, 'Hammer', 'Hammer', 4, 15500, NULL, 2000, 120, NULL, 1, 2, 279714, 2, 34, 2, 16, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1355, 'Hammer_', 'Hammer', 4, 15500, NULL, 2000, 120, NULL, 1, 3, 279714, 2, 34, 2, 16, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1356, 'Hammer__', 'Hammer', 4, 15500, NULL, 2200, 120, NULL, 1, 0, 279714, 2, 34, 2, 16, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1357, 'Buster', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 1, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1358, 'Buster_', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 2, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1359, 'Buster__', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 0, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1360, 'Two_handed_Axe', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 1, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1361, 'Two_handed_Axe_', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 2, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1362, 'Two_handed_Axe__', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 0, 279714, 2, 34, 3, 30, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (1363, 'Blood_Axe', 'Bloody Axe', 4, 20, NULL, 4000, 170, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bStr,10; bonus bSpeedRate,25;');
-INSERT INTO `item_db` VALUES (1364, 'Great_Axe', 'Great Axe', 4, 20, NULL, 1800, 187, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bAddEff,Eff_Stan,1500;');
-INSERT INTO `item_db` VALUES (1365, 'Sabbath', 'Sabbath', 4, 20, NULL, 2300, 120, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bWeaponComaRace,6,50; bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (1366, 'Light_Epsilon', 'Light Epsilon', 4, 20, NULL, 2300, 180, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bAtkEle,6; skill 28,3; bonus2 bAddRace,6,3;');
-INSERT INTO `item_db` VALUES (1367, 'Slaughter', 'Slaughter', 4, 20, NULL, 2500, 120, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bIgnoreDefRace,2; bonus2 bWeaponComaRace,2,40;');
-INSERT INTO `item_db` VALUES (1368, 'Tomahawk', 'Tomahawk', 4, 20, NULL, 2500, 165, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bAtkEle,4;');
-INSERT INTO `item_db` VALUES (1369, 'Guillotine', 'Guillotine', 4, 20, NULL, 3000, 215, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bWeaponComaRace,7,30;');
-INSERT INTO `item_db` VALUES (1401, 'Javelin', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1402, 'Javelin_', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1403, 'Javelin__', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1404, 'Spear', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1405, 'Spear_', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1406, 'Spear__', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1407, 'Pike', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1408, 'Pike_', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1409, 'Pike__', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1410, 'Lance', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1411, 'Lance_', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1412, 'Lance__', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1413, 'Gungnir', 'Gungnir', 4, 20, NULL, 500, 120, NULL, 3, 0, 16514, 2, 2, 4, 4, 4, NULL, 'bonus bAtkEle,4; bonus bPerfectHitRate,25; bonus bHit,30;');
-INSERT INTO `item_db` VALUES (1414, 'Gelerdria', 'Gelerdria', 4, 20, NULL, 700, 145, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, 'bonus bAtkEle,2; bonus bMaxHP,500; bonus bMaxSP,-50;');
-INSERT INTO `item_db` VALUES (1415, 'Skewer', 'Brocca', 4, 20, NULL, 850, 100, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, 'bonus bIgnoreDefRace,11; bonus2 bAddEle,0,25;');
-INSERT INTO `item_db` VALUES (1416, 'Tjungkuletti', 'Tjungkuletti', 4, 20, NULL, 1000, 95, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, NULL);
-INSERT INTO `item_db` VALUES (1417, 'Pole_Axe', 'Pole Axe', 4, 20, NULL, 3800, 160, NULL, 3, 1, 16514, 2, 2, 3, 71, 4, NULL, 'bonus bStr,1; bonus bInt,2; bonus bDex,1;');
-INSERT INTO `item_db` VALUES (1451, 'Guisarme', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1452, 'Guisarme_', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 3, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1453, 'Guisarme__', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 0, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1454, 'Glaive', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1455, 'Glaive_', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 3, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1456, 'Glaive__', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 0, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1457, 'Partizan', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 1, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1458, 'Partizan_', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1459, 'Partizan__', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1460, 'Trident', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 2, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1461, 'Trident_', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 3, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1462, 'Trident__', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1463, 'Halberd', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 1, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1464, 'Halberd_', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 2, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1465, 'Halberd__', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (1466, 'Crescent_Scythe', 'Crescent Scythe', 4, 20, NULL, 2500, 180, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bCritical,30; bonus bHit,10;');
-INSERT INTO `item_db` VALUES (1467, 'Bill_Guisarme', 'Bill Guisarme', 4, 20, NULL, 1000, 183, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus2 bAddRace,2,10; bonus2 bAddRace,7,5;');
-INSERT INTO `item_db` VALUES (1468, 'Zephyrus', 'Zephyrus', 4, 20, NULL, 2000, 170, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,4; skill 21,3; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,25;');
-INSERT INTO `item_db` VALUES (1469, 'Longinus\'s_Spear', 'Longinus\'s Spear', 4, 20, NULL, 2500, 180, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,7; bonus2 bAddRace,7,10; bonus2 bAddRace,8,10;');
-INSERT INTO `item_db` VALUES (1470, 'Brionac', 'Brionac', 4, 20, NULL, 3000, 190, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,6; skill 28,5; skill 13,3; bonus3 bAutoSpell,13,3,25;');
-INSERT INTO `item_db` VALUES (1471, 'Hellfire', 'Hellfire', 4, 20, NULL, 3500, 200, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,3; skill 17,3; bonus3 bAutoSpell,17,3,25;');
-INSERT INTO `item_db` VALUES (1472, 'Staff_of_Soul', 'Soul Staff', 4, 20, NULL, 1400, 25, NULL, 1, 0, 66052, 2, 34, 3, 73, 10, NULL, 'bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1473, 'Wizardy_Staff', 'Wizardy Staff', 4, 20, NULL, 2400, 120, NULL, 1, 0, 66052, 2, 34, 4, 90, 10, NULL, 'bonus bInt,6; bonus bDex,2; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1501, 'Club', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 3, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1502, 'Club_', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 4, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1503, 'Club__', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 0, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1504, 'Mace', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 3, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1505, 'Mace_', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 4, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1506, 'Mace__', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 0, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1507, 'Smasher', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 2, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1508, 'Smasher_', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 3, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1509, 'Smasher__', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 3, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1510, 'Flail', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 2, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1511, 'Flail_', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1512, 'Flail__', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1513, 'Morning_Star', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1514, 'Morning_Star_', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 2, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1515, 'Morning_Star__', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 2, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1516, 'Sword_Mace', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 0, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1517, 'Sword_Mace_', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1518, 'Sword_Mace__', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1519, 'Chain', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 2, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1520, 'Chain_', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1521, 'Chain__', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1522, 'Stunner', 'Stunner', 4, 60000, NULL, 2000, 140, NULL, 1, 0, 33040, 2, 2, 3, 27, 8, NULL, 'bonus2 bAddEff,Eff_Stan,1000;');
-INSERT INTO `item_db` VALUES (1523, 'Spike', 'Spike', 4, 20, NULL, 700, 85, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67;');
-INSERT INTO `item_db` VALUES (1524, 'Golden_Mace', 'Golden Mace', 4, 20, NULL, 800, 110, NULL, 1, 1, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,10;');
-INSERT INTO `item_db` VALUES (1525, 'Long_Mace', 'Long Mace', 4, 20, NULL, 800, 135, NULL, 3, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bLongAtkDef,10;');
-INSERT INTO `item_db` VALUES (1526, 'Slash', 'Slash', 4, 20, NULL, 1000, 145, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,15; bonus2 bWeaponComaRace,1,10;');
-INSERT INTO `item_db` VALUES (1527, 'Quadrille', 'Quadrille', 4, 20, NULL, 900, 165, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,10; bonus2 bAddRace,7,10; bonus2 bAddEle,2,10;');
-INSERT INTO `item_db` VALUES (1528, 'Grand_Cross', 'Grand Cross', 4, 20, NULL, 1500, 140, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bAtkEle,6; skill 77,3; bonus3 bAutoSpell,77,3,25;');
-INSERT INTO `item_db` VALUES (1529, 'Iron_Driver', 'Iron Driver', 4, 20, NULL, 3000, 155, NULL, 1, 0, 33024, 2, 2, 3, 78, 8, NULL, NULL);
-INSERT INTO `item_db` VALUES (1530, 'Mjolnir', 'Mjolnir', 4, 20, NULL, 6000, 250, NULL, 1, 0, 10477567, 2, 2, 4, 98, 8, NULL, 'bonus bAtkEle,4; bonus bDex,40; bonus bStr,15; bonus bAspdRate,30;');
-INSERT INTO `item_db` VALUES (1531, 'Spanner', 'Spanner', 4, 20, NULL, 2500, 115, NULL, 1, 0, 33040, 2, 2, 3, 55, 8, 'bonus2 bAddEff,Eff_Freeze,100; bonus2 bAddEff,Eff_Stan,100; bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Poison,100;', NULL);
-INSERT INTO `item_db` VALUES (1550, 'Book', 'Book', 4, 30000, NULL, 600, 85, NULL, 1, 3, 65792, 2, 2, 2, 14, 15, NULL, NULL);
-INSERT INTO `item_db` VALUES (1551, 'Bible', 'Bible', 4, 60000, NULL, 1000, 115, NULL, 1, 2, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (1552, 'Tablet', 'Tablet', 4, 51000, NULL, 800, 125, NULL, 1, 1, 65792, 2, 2, 3, 27, 15, NULL, NULL);
-INSERT INTO `item_db` VALUES (1553, 'Book_of_Billows', 'Book of Billows', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,1;');
-INSERT INTO `item_db` VALUES (1554, 'Book_of_Mother_Earth', 'Book of Mother Earth', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,2;');
-INSERT INTO `item_db` VALUES (1555, 'Book_of_Blazing_Sun', 'Book of Blazing Sun', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,3;');
-INSERT INTO `item_db` VALUES (1556, 'Book_of_Gust_of_Wind', 'Book of Gust of Wind', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,4;');
-INSERT INTO `item_db` VALUES (1557, 'Book_of_the_Apocalypse', 'Book of the Apocalypse', 4, 35000, NULL, 800, 120, NULL, 1, 0, 65792, 2, 2, 4, 40, 15, NULL, 'bonus bAtkEle,7; bonus2 bSubEle,6,-5; bonus2 bAddEle,1,7; bonus2 bAddEle,2,7; bonus2 bAddEle,3,7; bonus2 bAddEle,4,7;');
-INSERT INTO `item_db` VALUES (1558, 'Girl\'s_Diary', 'Girl\'s Diary', 4, 20, NULL, 300, 60, NULL, 1, 1, 65792, 2, 2, 4, 40, 15, NULL, 'bonus2 bAddDamageClass,1188,150;');
-INSERT INTO `item_db` VALUES (1599, 'Angra_Manyu', 'Angra Manyu', 4, 120, NULL, 10, 1, NULL, 1, 5, 10477567, 2, 2, 4, 2, 8, NULL, 'bonus bStr,420; bonus bAgi,420; bonus bVit,50; bonus bInt,420; bonus bDex,420; bonus bSplashRange,3; bonus bUseSPrate,-100; bonus bNoGemStone,0; bonus bSpeedRate,25; bonus bMatkRate,100;');
-INSERT INTO `item_db` VALUES (1601, 'Rod', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 3, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1602, 'Rod_', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 4, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1603, 'Rod__', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 0, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1604, 'Wand', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 2, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1605, 'Wand_', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 3, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1606, 'Wand__', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 0, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1607, 'Staff', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 2, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1608, 'Staff_', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 3, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1609, 'Staff__', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 0, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1610, 'Arc_Wand', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 1, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1611, 'Arc_Wand_', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 2, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1612, 'Arc_Wand__', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1613, 'Mighty_Staff', 'Mighty Staff', 4, 20, NULL, 700, 130, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bStr,10; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1614, 'Blessed_Wand', 'Wand of Occult', 4, 20, NULL, 700, 75, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1615, 'Bone_Wand', 'Bone Wand', 4, 20, NULL, 700, 40, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,4; bonus bAtkEle,9; bonus bMatkRate,15;');
-INSERT INTO `item_db` VALUES (1701, 'Bow', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 3, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1702, 'Bow_', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 4, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1703, 'Bow__', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 0, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1704, 'Composite_Bow', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 3, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1705, 'Composite_Bow_', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 4, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1706, 'Composite_Bow__', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 0, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1707, 'Great_Bow', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 2, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1708, 'Great_Bow_', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 3, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1709, 'Great_Bow__', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 0, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1710, 'CrossBow', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 2, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1711, 'CrossBow_', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 3, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1712, 'CrossBow__', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 0, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1713, 'Arbalest', 'Arbalest', 4, 48000, NULL, 1000, 90, NULL, 5, 1, 1706056, 2, 34, 3, 33, 11, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (1714, 'Gakkung', 'Gakkung', 4, 42000, NULL, 1100, 100, NULL, 5, 1, 1706056, 2, 34, 3, 33, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1715, 'Arbalest_', 'Arbalest', 4, 48000, NULL, 1000, 90, NULL, 5, 2, 1706056, 2, 34, 3, 33, 11, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (1716, 'Gakkung_', 'Gakkung', 4, 42000, NULL, 1100, 100, NULL, 5, 2, 1706056, 2, 34, 3, 33, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1718, 'Hunter_Bow', 'Hunter Bow', 4, 64000, NULL, 1500, 125, NULL, 5, 0, 2048, 2, 34, 3, 33, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1719, 'Bow_of_Roguemaster', 'Roguemaster\'s Bow', 4, 20, NULL, 500, 75, NULL, 11, 0, 64, 2, 34, 4, 48, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1720, 'Bow_of_Rudra', 'Rudra\'s Bow', 4, 20, NULL, 1200, 150, NULL, 5, 0, 1705992, 2, 34, 4, 48, 11, NULL, 'bonus bAtkEle,6; 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;');
-INSERT INTO `item_db` VALUES (1721, 'Repeating_Crossbow', 'Repeating Crossbow', 4, 89000, NULL, 2000, 95, NULL, 9, 1, 133184, 2, 34, 3, 65, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1722, 'Ballista', 'Ballista', 4, 20, NULL, 3500, 145, NULL, 5, 0, 1574912, 2, 34, 4, 77, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (1750, 'Arrow', 'Arrow', 10, 1, NULL, 1, 25, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1751, 'Silver_Arrow', 'Silver Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,6;');
-INSERT INTO `item_db` VALUES (1752, 'Fire_Arrow', 'Fire Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,3;');
-INSERT INTO `item_db` VALUES (1753, 'Steel_Arrow', 'Steel Arrow', 10, 3, NULL, 2, 40, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1754, 'Crystal_Arrow', 'Crystal Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,1;');
-INSERT INTO `item_db` VALUES (1755, 'Arrow_of_Wind', 'Arrow of Wind', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,4;');
-INSERT INTO `item_db` VALUES (1756, 'Stone_Arrow', 'Stone Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,2;');
-INSERT INTO `item_db` VALUES (1757, 'Immaterial_Arrow', 'Immaterial Arrow', 10, 3, NULL, 1, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,8;');
-INSERT INTO `item_db` VALUES (1758, 'Stun_Arrow', 'Stun Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,500;');
-INSERT INTO `item_db` VALUES (1759, 'Freezing_Arrow', 'Freeze Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500;');
-INSERT INTO `item_db` VALUES (1760, 'Flash_Arrow', 'Flash Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,500;');
-INSERT INTO `item_db` VALUES (1761, 'Curse_Arrow', 'Curse Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,500;');
-INSERT INTO `item_db` VALUES (1762, 'Rusty_Arrow', 'Rusted Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,5;');
-INSERT INTO `item_db` VALUES (1763, 'Poison_Arrow', 'Poison Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,500;');
-INSERT INTO `item_db` VALUES (1764, 'Incisive_Arrow', 'Sharp Arrow', 10, 3, NULL, 3, 10, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bCritical,10;');
-INSERT INTO `item_db` VALUES (1765, 'Oridecon_Arrow', 'Oridecon Arrow', 10, 3, NULL, 3, 50, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1766, 'Arrow_of_Counter_Evil', 'Arrow of Counter Evil', 10, 40, NULL, 3, 50, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,6;');
-INSERT INTO `item_db` VALUES (1767, 'Arrow_of_Shadow', 'Shadow Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (1768, 'Sleep_Arrow', 'Sleep Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,500;');
-INSERT INTO `item_db` VALUES (1769, 'Silence_Arrow', 'Mute Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,500;');
-INSERT INTO `item_db` VALUES (1770, 'Iron_Arrow', 'Iron Arrow', 10, 2, NULL, 1, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (1801, 'Waghnakh', 'Waghnakh', 4, 8000, NULL, 400, 30, NULL, 1, 3, 33024, 2, 2, 1, 1, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1802, 'Waghnakh_', 'Waghnakh', 4, 8000, NULL, 400, 30, NULL, 1, 4, 33024, 2, 2, 1, 1, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1803, 'Knuckle_Duster', 'Knuckle Duster', 4, 25000, NULL, 450, 50, NULL, 1, 2, 33024, 2, 2, 2, 12, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1804, 'Knuckle_Duster_', 'Knuckle Duster', 4, 25000, NULL, 450, 50, NULL, 1, 3, 33024, 2, 2, 2, 12, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1805, 'Hora', 'Hora', 4, 32000, NULL, 450, 65, NULL, 1, 2, 33024, 2, 2, 2, 12, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1806, 'Hora_', 'Hora', 4, 32000, NULL, 450, 65, NULL, 1, 3, 33024, 2, 2, 2, 12, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1807, 'Fist', 'Fist', 4, 53000, NULL, 650, 115, NULL, 1, 0, 33024, 2, 2, 3, 24, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1808, 'Fist_', 'Fist', 4, 53000, NULL, 650, 115, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1809, 'Claw', 'Claw', 4, 55000, NULL, 500, 86, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (1810, 'Claw_', 'Claw', 4, 55000, NULL, 500, 86, NULL, 1, 2, 33024, 2, 2, 3, 24, 12, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (1811, 'Finger', 'Finger', 4, 58000, NULL, 500, 97, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1812, 'Finger_', 'Finger', 4, 58000, NULL, 500, 97, NULL, 1, 2, 33024, 2, 2, 3, 24, 12, NULL, NULL);
-INSERT INTO `item_db` VALUES (1813, 'Kaiser_Knuckle', 'Kaiser Knuckle', 4, 20, NULL, 450, 110, NULL, 1, 0, 33024, 2, 2, 4, 36, 12, NULL, 'bonus bAtkEle,4; bonus2 bAddRace,1,5; bonus2 bAddEle,1,10; bonus2 bAddEle,2,10; bonus2 bAddEle,3,10; bonus2 bAddEle,4,10;');
-INSERT INTO `item_db` VALUES (1814, 'Berserk', 'Berserk', 4, 20, NULL, 500, 120, NULL, 1, 0, 33024, 2, 2, 4, 36, 12, NULL, 'bonus bAspdRate,12;');
-INSERT INTO `item_db` VALUES (1901, 'Violin', 'Violin', 4, 4000, NULL, 700, 50, NULL, 1, 3, 524288, 2, 2, 1, 2, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1902, 'Violin_', 'Violin', 4, 4000, NULL, 700, 50, NULL, 1, 4, 524288, 2, 2, 1, 2, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1903, 'Mandolin', 'Mandolin', 4, 18000, NULL, 400, 90, NULL, 1, 2, 524288, 2, 2, 2, 14, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1904, 'Mandolin_', 'Mandolin', 4, 18000, NULL, 400, 90, NULL, 1, 3, 524288, 2, 2, 2, 14, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1905, 'Lute', 'Lute', 4, 24500, NULL, 500, 105, NULL, 1, 2, 524288, 2, 2, 2, 14, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1906, 'Lute_', 'Lute', 4, 24500, NULL, 500, 105, NULL, 1, 3, 524288, 2, 2, 2, 14, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1907, 'Guitar', 'Guitar', 4, 47000, NULL, 900, 142, NULL, 1, 0, 524288, 2, 2, 3, 27, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1908, 'Guitar_', 'Guitar', 4, 47000, NULL, 900, 142, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1909, 'Harp', 'Harp', 4, 62000, NULL, 900, 114, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (1910, 'Harp_', 'Harp', 4, 62000, NULL, 900, 114, NULL, 1, 2, 524288, 2, 2, 3, 27, 13, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (1911, 'Guh_Moon_Goh', 'Guhmoongoh', 4, 54000, NULL, 1300, 126, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1912, 'Guh_Moon_Goh_', 'Guhmoongoh', 4, 54000, NULL, 1300, 126, NULL, 1, 2, 524288, 2, 2, 3, 27, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (1950, 'Rope', 'Rope', 4, 2500, NULL, 400, 45, NULL, 2, 3, 1048576, 2, 2, 1, 3, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1951, 'Rope_', 'Rope', 4, 2500, NULL, 400, 45, NULL, 2, 4, 1048576, 2, 2, 1, 3, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1952, 'Line', 'Line', 4, 12000, NULL, 300, 80, NULL, 2, 2, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1953, 'Line_', 'Line', 4, 12000, NULL, 300, 80, NULL, 2, 3, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1954, 'Wire', 'Wire', 4, 17500, NULL, 1000, 95, NULL, 2, 2, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1955, 'Wire_', 'Wire', 4, 17500, NULL, 1000, 95, NULL, 2, 3, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1956, 'Rante', 'Rante', 4, 32000, NULL, 900, 135, NULL, 2, 0, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1957, 'Rante_', 'Rante', 4, 32000, NULL, 900, 135, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1958, 'Tail', 'Tail', 4, 41000, NULL, 700, 105, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, 'bonus bLuk,3;');
-INSERT INTO `item_db` VALUES (1959, 'Tail_', 'Tail', 4, 41000, NULL, 700, 105, NULL, 2, 2, 1048576, 2, 2, 3, 30, 14, NULL, 'bonus bLuk,3;');
-INSERT INTO `item_db` VALUES (1960, 'Whip', 'Whip', 4, 38000, NULL, 700, 120, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1961, 'Whip_', 'Whip', 4, 38000, NULL, 700, 120, NULL, 2, 2, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (1962, 'Lariat', 'Lariat', 4, 20, NULL, 400, 100, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bDex,5; bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (1963, 'Rapture_Rose', 'Rapture Rose', 4, 20, NULL, 300, 115, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,5000;');
-INSERT INTO `item_db` VALUES (1964, 'Chemeti', 'Chemeti', 4, 20, NULL, 700, 135, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2;');
-INSERT INTO `item_db` VALUES (2101, 'Guard', 'Guard', 5, 500, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 32, NULL, 0, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (2102, 'Guard_', 'Guard', 5, 500, NULL, 300, NULL, 3, NULL, 1, 10477567, 2, 32, NULL, 0, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (2103, 'Buckler', 'Buckler', 5, 14000, NULL, 600, NULL, 4, NULL, 0, 2020850, 2, 32, NULL, 0, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (2104, 'Buckler_', 'Buckler', 5, 14000, NULL, 600, NULL, 4, NULL, 1, 2020850, 2, 32, NULL, 0, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (2105, 'Shield', 'Shield', 5, 56000, NULL, 1300, NULL, 6, NULL, 0, 16514, 2, 32, NULL, 0, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (2106, 'Shield_', 'Shield', 5, 56000, NULL, 1300, NULL, 6, NULL, 1, 16514, 2, 32, NULL, 0, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (2107, 'Mirror_Shield', 'Mirror Shield', 5, 60000, NULL, 1000, NULL, 4, NULL, 0, 16514, 2, 32, NULL, 0, 4, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2108, 'Mirror_Shield_', 'Mirror Shield', 5, 60000, NULL, 1000, NULL, 4, NULL, 1, 16514, 2, 32, NULL, 0, 4, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2109, 'Memorize_Book', 'Book of Summoning', 5, 20, NULL, 1000, NULL, 3, NULL, 0, 66052, 2, 32, NULL, 0, NULL, NULL, 'bonus bInt,1; bonus bMdef,2;');
-INSERT INTO `item_db` VALUES (2110, 'Holy_Guard', 'Holy Guard', 5, 20, NULL, 1400, NULL, 5, NULL, 0, 16384, 2, 32, NULL, 68, 3, NULL, 'bonus bVit,2; bonus bMdef,2;');
-INSERT INTO `item_db` VALUES (2111, 'Evangelist', 'Evangelist', 5, 20, NULL, 1400, NULL, 5, NULL, 0, 16384, 2, 32, NULL, 83, 3, NULL, 'bonus bVit,3; bonus bInt,2; bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2112, 'Novice_Guard', 'Novice Guard', 5, NULL, NULL, 1, NULL, 3, NULL, 0, 8388609, 2, 32, NULL, 0, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (2199, 'Ahura_Mazda', 'Ahura Mazda', 5, 20, NULL, 100, NULL, NULL, NULL, 0, 10477567, 2, 32, NULL, NULL, NULL, NULL, 'bonus bMdef,150; bonus bDef,150; bonus bFlee2,100; bonus2 bSubEle,0,100;');
-INSERT INTO `item_db` VALUES (2201, 'Sunglasses', 'Sunglasses', 5, 5000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 12, NULL, 'bonus2 bResEff,Eff_Blind,500;');
-INSERT INTO `item_db` VALUES (2202, 'Sunglasses_', 'Sunglasses', 5, 5000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 512, NULL, 0, 12, NULL, 'bonus2 bResEff,Eff_Blind,500;');
-INSERT INTO `item_db` VALUES (2203, 'Glasses', 'Glasses', 5, 4000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (2204, 'Glasses_', 'Glasses', 5, 4000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 512, NULL, 0, 3, NULL, NULL);
-INSERT INTO `item_db` VALUES (2205, 'Diver\'s_Goggles', 'Diver\'s Goggles', 5, 3500, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 10, NULL, NULL);
-INSERT INTO `item_db` VALUES (2206, 'Wedding_Veil', 'Wedding Veil', 5, 23000, NULL, 100, NULL, 0, NULL, 0, 10477567, 0, 256, NULL, 0, 44, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2207, 'Fancy_Flower', 'Fancy Flower', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 4, NULL, 'bonus2 bSubRace,3,10;');
-INSERT INTO `item_db` VALUES (2208, 'Ribbon', 'Ribbon', 5, 800, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 17, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2209, 'Ribbon_', 'Ribbon', 5, 800, NULL, 100, NULL, 1, NULL, 1, 10477567, 2, 256, NULL, 0, 17, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2210, 'Hair_Band', 'Hair Band', 5, 500, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 9, NULL, NULL);
-INSERT INTO `item_db` VALUES (2211, 'Bandana', 'Bandana', 5, 400, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 6, NULL, NULL);
-INSERT INTO `item_db` VALUES (2212, 'Eye_Bandage', 'Eye Patch', 5, 1000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 13, NULL, NULL);
-INSERT INTO `item_db` VALUES (2213, 'Kitty_Band', 'Kitty Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 2, NULL, NULL);
-INSERT INTO `item_db` VALUES (2214, 'Bunny_Band', 'Bunny Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 15, NULL, 'bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (2215, 'Flower_Hairband', 'Flower Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 5, NULL, NULL);
-INSERT INTO `item_db` VALUES (2216, 'Biretta', 'Biretta', 5, 9000, NULL, 100, NULL, 4, NULL, 0, 33040, 2, 256, NULL, 0, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (2217, 'Biretta_', 'Biretta', 5, 9000, NULL, 100, NULL, 4, NULL, 1, 33040, 2, 256, NULL, 0, 11, NULL, NULL);
-INSERT INTO `item_db` VALUES (2218, 'Flu_Mask', 'Flu Mask', 5, 300, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 8, NULL, 'bonus2 bResEff,Eff_Silence,1000;');
-INSERT INTO `item_db` VALUES (2219, 'Flu_Mask_', 'Flu Mask', 5, 300, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 1, NULL, 0, 8, NULL, 'bonus2 bResEff,Eff_Silence,1000;');
-INSERT INTO `item_db` VALUES (2220, 'Hat', 'Hat', 5, 1000, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (2221, 'Hat_', 'Hat', 5, 1000, NULL, 200, NULL, 2, NULL, 1, 10477567, 2, 256, NULL, 0, 16, NULL, NULL);
-INSERT INTO `item_db` VALUES (2222, 'Turban', 'Turban', 5, 4500, NULL, 300, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (2223, 'Turban_', 'Turban', 5, 4500, NULL, 300, NULL, 3, NULL, 1, 2088958, 2, 256, NULL, 0, 7, NULL, NULL);
-INSERT INTO `item_db` VALUES (2224, 'Goggles', 'Goggles', 5, 10000, NULL, 300, NULL, 5, NULL, 0, 1989866, 2, 768, NULL, 0, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (2225, 'Goggles_', 'Goggles', 5, 10000, NULL, 300, NULL, 5, NULL, 1, 1989866, 2, 768, NULL, 0, 1, NULL, NULL);
-INSERT INTO `item_db` VALUES (2226, 'Cap', 'Cap', 5, 12000, NULL, 400, NULL, 4, NULL, 0, 1989866, 2, 256, NULL, 0, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (2227, 'Cap_', 'Cap', 5, 12000, NULL, 400, NULL, 4, NULL, 1, 1989866, 2, 256, NULL, 0, 14, NULL, NULL);
-INSERT INTO `item_db` VALUES (2228, 'Helm', 'Helm', 5, 44000, NULL, 600, NULL, 6, NULL, 0, 16514, 2, 256, NULL, 0, 40, NULL, NULL);
-INSERT INTO `item_db` VALUES (2229, 'Helm_', 'Helm', 5, 44000, NULL, 600, NULL, 6, NULL, 1, 16514, 2, 256, NULL, 0, 40, NULL, NULL);
-INSERT INTO `item_db` VALUES (2230, 'Gemmed_Sallet', 'Gemmed Sallet', 5, 50000, NULL, 500, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 0, 0, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2231, 'Gemmed_Sallet_', 'Gemmed Sallet', 5, 50000, NULL, 500, NULL, 4, NULL, 1, 414946, 2, 256, NULL, 0, 0, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2232, 'Circlet', 'Circlet', 5, 7500, NULL, 300, NULL, 3, NULL, 0, 99092, 2, 256, NULL, 0, 18, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2233, 'Circlet_', 'Circlet', 5, 7500, NULL, 300, NULL, 3, NULL, 1, 99092, 2, 256, NULL, 0, 18, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2234, 'Tiara', 'Tiara', 5, 20, NULL, 400, NULL, 4, NULL, 0, 2088958, 0, 256, NULL, 45, 19, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (2235, 'Crown', 'Crown', 5, 20, NULL, 400, NULL, 4, NULL, 0, 2088958, 1, 256, NULL, 45, 45, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (2236, 'Santa\'s_Hat', 'Santa\'s Hat', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 20, NULL, 'bonus bMdef,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (2237, 'Weird_Goatee', 'Bandit Beard', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 21, NULL, NULL);
-INSERT INTO `item_db` VALUES (2238, 'Weird_Moustache', 'Moustache', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 22, NULL, NULL);
-INSERT INTO `item_db` VALUES (2239, 'Single_Glass', 'Single Glass', 5, 10000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 23, NULL, NULL);
-INSERT INTO `item_db` VALUES (2240, 'Beard', 'Beard', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 24, NULL, NULL);
-INSERT INTO `item_db` VALUES (2241, 'Granpa_Beard', 'Granpa Beard', 5, 5000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 25, NULL, NULL);
-INSERT INTO `item_db` VALUES (2242, 'Luxury_Sunglasses', 'Purple Glasses', 5, 24000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 26, NULL, 'bonus2 bResEff,Eff_Blind,1000;');
-INSERT INTO `item_db` VALUES (2243, 'Spinning_Eyes', 'Geek Glasses', 5, 20000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 27, NULL, 'bonus2 bResEff,Eff_Blind,1500;');
-INSERT INTO `item_db` VALUES (2244, 'Big_Ribbon', 'Big Ribbon', 5, 15000, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 28, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2245, 'Sweet_Gent', 'Sweet Gent', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 29, NULL, NULL);
-INSERT INTO `item_db` VALUES (2246, 'Golden_Gear', 'Golden Gear', 5, 20, NULL, 900, NULL, 5, NULL, 0, 2088958, 2, 256, NULL, 40, 30, NULL, NULL);
-INSERT INTO `item_db` VALUES (2247, 'Romantic_Gent', 'Romantic Gent', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 31, NULL, NULL);
-INSERT INTO `item_db` VALUES (2248, 'Western_Grace', 'Western Grace', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 32, NULL, NULL);
-INSERT INTO `item_db` VALUES (2249, 'Coronet', 'Coronet', 5, 20, NULL, 300, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 33, NULL, 'bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2250, 'Fillet', 'Cute Ribbon', 5, 500, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 34, NULL, 'bonus bMaxSP,20;');
-INSERT INTO `item_db` VALUES (2251, 'Holy_Bonnet', 'Monk Hat', 5, 30000, NULL, 100, NULL, 5, NULL, 0, 33040, 2, 256, NULL, 0, 35, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2252, 'Wizard_Hat', 'Wizard Hat', 5, 20, NULL, 300, NULL, 4, NULL, 0, 66052, 2, 256, NULL, 0, 36, NULL, 'bonus bMaxSP,100;');
-INSERT INTO `item_db` VALUES (2253, 'Sunflower', 'Sunflower', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 37, NULL, 'bonus2 bSubRace,4,10;');
-INSERT INTO `item_db` VALUES (2254, 'Angel_Wing', 'Angel Wing', 5, 20, NULL, 100, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 38, NULL, 'bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,6,3;');
-INSERT INTO `item_db` VALUES (2255, 'Evil_Wing', 'Evil Wing', 5, 20, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 39, NULL, 'bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,8,3;');
-INSERT INTO `item_db` VALUES (2256, 'Majestic_Goat', 'Majestic Goat', 5, 20, NULL, 800, NULL, 5, NULL, 0, 279714, 2, 256, NULL, 0, 41, NULL, 'bonus bStr,1;');
-INSERT INTO `item_db` VALUES (2257, 'Snow_Horn', 'Snow Horn', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 42, NULL, NULL);
-INSERT INTO `item_db` VALUES (2258, 'Spiky_Band', 'Spiky Band', 5, 20, NULL, 1000, NULL, 6, NULL, 0, 447986, 2, 256, NULL, 50, 43, NULL, NULL);
-INSERT INTO `item_db` VALUES (2259, 'Mini_Propeller', 'Mini Propeller', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 46, NULL, NULL);
-INSERT INTO `item_db` VALUES (2260, 'Mini_Glasses', 'Mini Glasses', 5, 28000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 0, 47, NULL, NULL);
-INSERT INTO `item_db` VALUES (2261, 'Prontera_Army_Cap', 'Army Cap', 5, 20, NULL, 400, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 0, 48, NULL, NULL);
-INSERT INTO `item_db` VALUES (2262, 'Pierrot_Nose', 'Pierrot Nose', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 49, NULL, NULL);
-INSERT INTO `item_db` VALUES (2263, 'Gangster_Patch', 'Zoro Masque', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 50, NULL, NULL);
-INSERT INTO `item_db` VALUES (2264, 'Munak_Hat', 'Munak Hat', 5, 20, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 769, NULL, 0, 51, NULL, 'bonus2 bSubRace,1,10;');
-INSERT INTO `item_db` VALUES (2265, 'Gangster_Mask', 'Gangster Mask', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 52, NULL, 'bonus2 bResEff,Eff_Silence,1500;');
-INSERT INTO `item_db` VALUES (2266, 'Iron_Cain', 'Iron Cain', 5, 20, NULL, 300, NULL, 1, NULL, 0, 16514, 2, 1, NULL, 50, 53, NULL, NULL);
-INSERT INTO `item_db` VALUES (2267, 'Cigar', 'Cigar', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 54, NULL, 'bonus2 bSubRace,4,3;');
-INSERT INTO `item_db` VALUES (2268, 'Pipe', 'Pipe', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 55, NULL, 'bonus2 bSubRace,4,3;');
-INSERT INTO `item_db` VALUES (2269, 'Centimental_Flower', 'Centimental Flower', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 56, NULL, 'bonus2 bSubRace,3,3;');
-INSERT INTO `item_db` VALUES (2270, 'Centimental_Leaf', 'Centimental Leaf', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 57, NULL, 'bonus2 bSubRace,3,3;');
-INSERT INTO `item_db` VALUES (2271, 'Jack_a_Dandy', 'Jack a Dandy', 5, 45000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 58, NULL, NULL);
-INSERT INTO `item_db` VALUES (2272, 'Stop_Post', 'Stop Post', 5, 20, NULL, 400, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 59, NULL, NULL);
-INSERT INTO `item_db` VALUES (2273, 'Doctor_Cap', 'Doctor Band', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 60, NULL, 'bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2274, 'Ghost_Bandana', 'Ghost Bandana', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 61, NULL, 'bonus bAgi,2; bonus2 bSubEle,8,10;');
-INSERT INTO `item_db` VALUES (2275, 'Red_Bandana', 'Red Bandana', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 62, NULL, NULL);
-INSERT INTO `item_db` VALUES (2276, 'Eagle_Eyes', 'Eagle Eyes', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 63, NULL, NULL);
-INSERT INTO `item_db` VALUES (2277, 'Nurse_Cap', 'Nurse Cap', 5, 20, NULL, 100, NULL, 1, NULL, 0, 33040, 2, 256, NULL, 0, 64, NULL, 'bonus bInt,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (2278, 'Mr_Smile', 'Mr. Smile', 5, 60, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 65, NULL, NULL);
-INSERT INTO `item_db` VALUES (2279, 'Bomb_Wick', 'Bomb Wick', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 66, NULL, NULL);
-INSERT INTO `item_db` VALUES (2280, 'Sakkat', 'Sakkat', 5, 20, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 67, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2281, 'Phantom_of_Opera', 'Opera Masque', 5, 8000, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 513, NULL, 0, 68, NULL, NULL);
-INSERT INTO `item_db` VALUES (2282, 'Heaven_Ring', 'Heaven Ring', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 69, NULL, 'bonus2 bSubEle,6,10;');
-INSERT INTO `item_db` VALUES (2283, 'Ear_Mufs', 'Ear Mufs', 5, 20, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 70, NULL, 'bonus2 bResEff,Eff_Curse,1000;');
-INSERT INTO `item_db` VALUES (2284, 'Antler', 'Antler', 5, 20, NULL, 500, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 0, 71, NULL, NULL);
-INSERT INTO `item_db` VALUES (2285, 'Apple_Of_Archer', 'Apple o\' Archer', 5, 20, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 30, 72, NULL, 'bonus bDex,3;');
-INSERT INTO `item_db` VALUES (2286, 'Elven_Ears', 'Elven Ears', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 70, 73, NULL, NULL);
-INSERT INTO `item_db` VALUES (2287, 'Pirate_Bandana', 'Pirate Bandana', 5, 20, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 74, NULL, 'bonus bStr,1;');
-INSERT INTO `item_db` VALUES (2288, 'Mr_Scream', 'Mr. Scream', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 75, NULL, NULL);
-INSERT INTO `item_db` VALUES (2289, 'Poo_Poo_Hat', 'Poo Poo Hat', 5, 20, NULL, 700, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 76, NULL, 'bonus2 bSubRace,7,10;');
-INSERT INTO `item_db` VALUES (2290, 'Funeral_Costume', 'Funeral Hat', 5, 3000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 77, NULL, NULL);
-INSERT INTO `item_db` VALUES (2291, 'Masquerade', 'Masquerade', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 78, NULL, 'bonus2 bAddRace,7,3;');
-INSERT INTO `item_db` VALUES (2292, 'Welding_Mask', 'Welding Mask', 5, 20, NULL, 300, NULL, 2, NULL, 0, 263200, 2, 513, NULL, 50, 79, NULL, 'bonus2 bSubEle,3,10;');
-INSERT INTO `item_db` VALUES (2293, 'Pretend_Murdered', 'Pretend Murdered', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 80, NULL, NULL);
-INSERT INTO `item_db` VALUES (2294, 'Stellar', 'Stellar', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 81, NULL, NULL);
-INSERT INTO `item_db` VALUES (2295, 'Blinker', 'Blinker', 5, 1500, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 82, NULL, 'bonus2 bResEff,Eff_Blind,10000;');
-INSERT INTO `item_db` VALUES (2296, 'Binoculars', 'Binoculars', 5, 20, NULL, 100, NULL, 1, NULL, 0, 1574920, 2, 512, NULL, 50, 83, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (2297, 'Goblini_Mask', 'Goblini Mask', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 84, NULL, NULL);
-INSERT INTO `item_db` VALUES (2298, 'Green_Feeler', 'Green Feeler', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 85, NULL, NULL);
-INSERT INTO `item_db` VALUES (2299, 'Viking_Helm', 'Viking Helm', 5, 20, NULL, 500, NULL, 5, NULL, 0, 414946, 2, 256, NULL, 0, 86, NULL, NULL);
-INSERT INTO `item_db` VALUES (2301, 'Cotton_Shirt', 'Cotton Shirt', 5, 10, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2302, 'Cotton_Shirt_', 'Cotton Shirt', 5, 10, NULL, 100, NULL, 1, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2303, 'Leather_Jacket', 'Leather Jacket', 5, 200, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2304, 'Leather_Jacket_', 'Leather Jacket', 5, 200, NULL, 200, NULL, 2, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2305, 'Adventure_Suit', 'Adventurer\'s Suit', 5, 1000, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2306, 'Adventure_Suit_', 'Adventurer\'s Suit', 5, 1000, NULL, 300, NULL, 3, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2307, 'Mantle', 'Mantle', 5, 10000, NULL, 600, NULL, 4, NULL, 0, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2308, 'Mantle_', 'Mantle', 5, 10000, NULL, 600, NULL, 4, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2309, 'Coat', 'Coat', 5, 22000, NULL, 1200, NULL, 5, NULL, 0, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2310, 'Coat_', 'Coat', 5, 22000, NULL, 1200, NULL, 5, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2311, 'Mink_Coat', 'Mink Coat', 5, 50000, NULL, 2300, NULL, 6, NULL, 1, 2088958, 2, 16, NULL, 30, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2312, 'Padded_Armor', 'Padded Armor', 5, 48000, NULL, 2800, NULL, 7, NULL, 0, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2313, 'Padded_Armor_', 'Padded Armor', 5, 48000, NULL, 2800, NULL, 7, NULL, 1, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2314, 'Chain_Mail', 'Chain Mail', 5, 65000, NULL, 3300, NULL, 8, NULL, 0, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2315, 'Chain_Mail_', 'Chain Mail', 5, 65000, NULL, 3300, NULL, 8, NULL, 1, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2316, 'Full_Plate', 'Full Plate', 5, 80000, NULL, 4500, NULL, 10, NULL, 0, 16514, 2, 16, NULL, 40, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2317, 'Full_Plate_', 'Full Plate', 5, 80000, NULL, 4500, NULL, 10, NULL, 1, 16514, 2, 16, NULL, 40, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2318, 'Clothes_of_the_Lord', 'Lord\'s Clothes', 5, 20, NULL, 2500, NULL, 8, NULL, 1, 263200, 2, 16, NULL, 70, 0, NULL, 'bonus bMdef,5; bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2319, 'Glittering_Clothes', 'Glittering Jacket', 5, 20, NULL, 2500, NULL, 7, NULL, 1, 10477566, 2, 16, NULL, 60, 0, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2320, 'Formal_Suit', 'Formal Suit', 5, 20, NULL, 300, NULL, 5, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2321, 'Silk_Robe', 'Silk Robe', 5, 8000, NULL, 400, NULL, 3, NULL, 0, 378806, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (2322, 'Silk_Robe_', 'Silk Robe', 5, 8000, NULL, 400, NULL, 3, NULL, 1, 378806, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (2323, 'Scapulare', 'Scapulare', 5, 6500, NULL, 400, NULL, 4, NULL, 0, 33040, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2324, 'Scapulare_', 'Scapulare', 5, 6500, NULL, 400, NULL, 4, NULL, 1, 33040, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2325, 'Saint_Robe', 'Saint\'s Robe', 5, 54000, NULL, 600, NULL, 6, NULL, 0, 296240, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2326, 'Saint_Robe_', 'Saint\'s Robe', 5, 54000, NULL, 600, NULL, 6, NULL, 1, 296240, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2327, 'Holy_Robe', 'Holy Robe', 5, 20, NULL, 1700, NULL, 7, NULL, 0, 33040, 2, 16, NULL, 60, 0, NULL, 'bonus bMdef,5; bonus2 bSubRace,6,15; bonus2 bSubEle,7,10;');
-INSERT INTO `item_db` VALUES (2328, 'Wooden_Mail', 'Wooden Mail', 5, 5500, NULL, 1000, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2329, 'Wooden_Mail_', 'Wooden Mail', 5, 5500, NULL, 1000, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2330, 'Tights', 'Tights', 5, 71000, NULL, 500, NULL, 6, NULL, 0, 1574920, 2, 16, NULL, 45, 0, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (2331, 'Tights_', 'Tights', 5, 71000, NULL, 500, NULL, 6, NULL, 1, 1574920, 2, 16, NULL, 45, 0, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (2332, 'Silver_Robe', 'Silver Robe', 5, 7000, NULL, 700, NULL, 4, NULL, 0, 66052, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2333, 'Silver_Robe_', 'Silver Robe', 5, 7000, NULL, 700, NULL, 4, NULL, 1, 66052, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2334, 'Mage_Coat', 'Mage Coat', 5, 20, NULL, 600, NULL, 5, NULL, 0, 66052, 2, 16, NULL, 50, 0, NULL, 'bonus bMdef,5; bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2335, 'Thief_Clothes', 'Thief Clothes', 5, 74000, NULL, 100, NULL, 6, NULL, 0, 135232, 2, 16, NULL, 0, 0, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2336, 'Thief_Clothes_', 'Thief Clothes', 5, 74000, NULL, 100, NULL, 6, NULL, 1, 135232, 2, 16, NULL, 0, 0, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2337, 'Ninja_Suit', 'Ninja Suit', 5, 20, NULL, 1500, NULL, 7, NULL, 0, 135232, 2, 16, NULL, 50, 0, NULL, 'bonus bAgi,1; bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2338, 'Wedding_Dress', 'Wedding Dress', 5, 43000, NULL, 500, NULL, 0, NULL, 0, 2088958, 0, 16, NULL, 0, 0, NULL, 'bonus bMdef,15; changebase 22;');
-INSERT INTO `item_db` VALUES (2339, 'Pantie', 'Pantie', 5, 1000, NULL, 100, NULL, 4, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2340, 'Novice_Breastplate', 'Novice Breastplate', 5, 89000, NULL, 500, NULL, 4, NULL, 1, 8388609, 2, 16, NULL, 10, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2341, 'Full_Plate_Armor', 'Full Plate Armor', 5, 94000, NULL, 5500, NULL, 11, NULL, 0, 16384, 2, 16, NULL, 70, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2342, 'Full_Plate_Armor_', 'Full Plate Armor', 5, 94000, NULL, 5500, NULL, 11, NULL, 1, 16384, 2, 16, NULL, 70, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2343, 'Robe_of_Casting', 'Casting Robe', 5, 20, NULL, 1100, NULL, 5, NULL, 0, 66048, 2, 16, NULL, 75, 0, NULL, 'bonus bCastrate,-3;');
-INSERT INTO `item_db` VALUES (2344, 'Armor_of_Fire', 'Fire Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,3;');
-INSERT INTO `item_db` VALUES (2345, 'Armor_of_Fire_', 'Fire Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,3;');
-INSERT INTO `item_db` VALUES (2346, 'Armor_of_Water', 'Water Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,1;');
-INSERT INTO `item_db` VALUES (2347, 'Armor_of_Water_', 'Water Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,1;');
-INSERT INTO `item_db` VALUES (2348, 'Armor_of_Wind', 'Wind Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,4;');
-INSERT INTO `item_db` VALUES (2349, 'Armor_of_Wind_', 'Wind Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,4;');
-INSERT INTO `item_db` VALUES (2350, 'Armor_of_Land', 'Earth Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,2;');
-INSERT INTO `item_db` VALUES (2351, 'Armor_of_Land_', 'Earth Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,2;');
-INSERT INTO `item_db` VALUES (2352, 'Armor_For_Novice', 'Novice Armor', 5, NULL, NULL, 1, NULL, 4, NULL, 0, 8388609, 2, 16, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2401, 'Sandals', 'Sandals', 5, 400, NULL, 200, NULL, 1, NULL, 0, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2402, 'Sandals_', 'Sandals', 5, 400, NULL, 200, NULL, 1, NULL, 1, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2403, 'Shoes', 'Shoes', 5, 3500, NULL, 400, NULL, 2, NULL, 0, 2088958, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2404, 'Shoes_', 'Shoes', 5, 3500, NULL, 400, NULL, 2, NULL, 1, 2088958, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2405, 'Boots', 'Boots', 5, 18000, NULL, 600, NULL, 4, NULL, 0, 1989866, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2406, 'Boots_', 'Boots', 5, 18000, NULL, 600, NULL, 4, NULL, 1, 1989866, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2407, 'Crystal_Pumps', 'Crystal Pumps', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 0, 64, NULL, 0, 0, NULL, 'bonus bMdef,10; bonus bLuk,5;');
-INSERT INTO `item_db` VALUES (2408, 'Cuffs', 'Ball\'n\'Chain', 5, 5000, NULL, 3000, NULL, 3, NULL, 0, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2409, 'Spiky_Heel', 'Highheals', 5, 8500, NULL, 600, NULL, 2, NULL, 0, 2088958, 2, 64, NULL, 0, 0, NULL, 'bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2410, 'Sleipnir', 'Sleipnir', 5, 20, NULL, 3500, NULL, 0, NULL, 0, 10477567, 2, 64, NULL, 95, 0, NULL, 'bonus bMdef,10; bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus bSPrecovRate,15; bonus bSpeedRate,25;');
-INSERT INTO `item_db` VALUES (2411, 'Greaves', 'Greaves', 5, 48000, NULL, 750, NULL, 5, NULL, 0, 16512, 2, 64, NULL, 65, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2412, 'Greaves_', 'Greaves', 5, 48000, NULL, 750, NULL, 5, NULL, 1, 16512, 2, 64, NULL, 65, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2413, 'Safety_Shoes', 'Safety Shoes', 5, 20, NULL, 350, NULL, 6, NULL, 0, 16514, 2, 64, NULL, 30, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2414, 'Sandal_For_Novice', 'Novice Sandal', 5, NULL, NULL, 1, NULL, 2, NULL, 0, 8388609, 2, 64, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2501, 'Hood', 'Hood', 5, 1000, NULL, 200, NULL, 1, NULL, 0, 10477567, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2502, 'Hood_', 'Hood', 5, 1000, NULL, 200, NULL, 1, NULL, 1, 10477567, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2503, 'Muffler', 'Muffler', 5, 5000, NULL, 400, NULL, 2, NULL, 0, 2088958, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2504, 'Muffler_', 'Muffler', 5, 5000, NULL, 400, NULL, 2, NULL, 1, 2088958, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2505, 'Manteau', 'Manteau', 5, 32000, NULL, 600, NULL, 4, NULL, 0, 414946, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2506, 'Manteau_', 'Manteau', 5, 32000, NULL, 600, NULL, 4, NULL, 1, 414946, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2507, 'Cape_Of_Ancient_Lord', 'Cape of Old Marquess', 5, 20, NULL, 600, NULL, 2, NULL, 0, 2088958, 2, 4, NULL, 40, 0, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2508, 'Ragamuffin_Cape', 'Ragamuffin Manteau', 5, 20, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 4, NULL, 0, 0, NULL, 'bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (2509, 'Manteau_of_Survival', 'Manteau of Life', 5, 20, NULL, 550, NULL, 0, NULL, 0, 66052, 2, 4, NULL, 75, 0, NULL, 'bonus bVit,10;');
-INSERT INTO `item_db` VALUES (2510, 'Hood_For_Novice', 'Novice Hood', 5, NULL, NULL, 1, NULL, 2, NULL, 0, 8388609, 2, 4, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2601, 'Ring', 'Ring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (2602, 'Earring', 'Earring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (2603, 'Necklace', 'Necklace', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bVit,2;');
-INSERT INTO `item_db` VALUES (2604, 'Glove', 'Glove', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (2605, 'Brooch', 'Brooch', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bAgi,2;');
-INSERT INTO `item_db` VALUES (2607, 'Clip', 'Clip', 5, 30000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 136, NULL, 0, 0, NULL, 'bonus bMaxSP,10;');
-INSERT INTO `item_db` VALUES (2608, 'Rosary', 'Rosary', 5, 15000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bMdef,5; bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (2609, 'Skull_Ring', 'Skull Ring', 5, 10000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2610, 'Gold_Ring', 'Gold Ring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2611, 'Silver_Ring', 'Silver Ring', 5, 20000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2612, 'Flower_Ring', 'Flower Ring', 5, 1500, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2613, 'Diamond_Ring', 'Diamond Ring', 5, 45000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2614, 'Eye_of_Dullahan', 'Eye of Dullahan', 5, 90000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 50, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2615, 'Safety_Ring', 'Safety Ring', 5, 75000, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 136, NULL, 40, 0, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (2616, 'Critical_Ring', 'Critical Ring', 5, 75000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 40, 0, NULL, 'bonus bCritical,5;');
-INSERT INTO `item_db` VALUES (2617, 'Celebrant\'s_Mitten', 'Celebrant\'s Mitten', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 136, NULL, 35, 0, NULL, 'bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2618, 'Matyr\'s_Leash', 'Matyr\'s Leash', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 136, NULL, 35, 0, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2619, 'Thimble_Of_Archer', 'Bow Thimble', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 1574920, 2, 136, NULL, 65, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2620, 'Ring_Of_Rogue', 'Rogue\'s Treasure', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 135232, 2, 136, NULL, 70, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2621, 'Ring_', 'Ancient Ring', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bStr,1;');
-INSERT INTO `item_db` VALUES (2622, 'Earring_', 'Ancient Earring', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bInt,1;');
-INSERT INTO `item_db` VALUES (2623, 'Necklace_', 'Ancient Necklace', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bVit,1;');
-INSERT INTO `item_db` VALUES (2624, 'Glove_', 'Ancient Glove', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (2625, 'Brooch_', 'Ancient Brooch', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (2626, 'Rosary_', 'Ancient Rosary', 5, 15000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bMdef,3; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (2627, 'Belt', 'Ancient Belt', 5, 20000, NULL, 1200, NULL, 0, NULL, 1, 10477567, 2, 136, NULL, 25, 0, NULL, NULL);
-INSERT INTO `item_db` VALUES (2628, 'Novice_Armlet', 'Novice Armlet', 5, 400, NULL, 200, NULL, 0, NULL, 1, 8388609, 2, 136, NULL, 0, 0, NULL, 'bonus bStr,1; bonus bInt,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (2629, 'Magingiorde', 'Magingiorde', 5, 20, NULL, 8000, NULL, 2, NULL, 0, 10477567, 2, 136, NULL, 90, 0, NULL, 'bonus bStr,40; bonus bMdef,7;');
-INSERT INTO `item_db` VALUES (2630, 'Brysinggamen', 'Brysinggamen', 5, 20, NULL, 1500, NULL, 1, NULL, 0, 10477567, 2, 136, NULL, 95, 0, NULL, 'bonus bStr,3; bonus bAgi,3; bonus bVit,3; bonus bInt,3; bonus bMdef,5;');
-INSERT INTO `item_db` VALUES (2631, 'Pebble_Ring', 'Pebble Ring', 5, NULL, NULL, 10, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, 'bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (2634, 'Wedding_Ring_M', 'Wedding Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 1, 136, NULL, 0, NULL, NULL, 'skill 334,1; skill 335,1; skill 336,1;');
-INSERT INTO `item_db` VALUES (2635, 'Wedding_Ring_F', 'Wedding Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 0, 136, NULL, 0, NULL, NULL, 'skill 334,1; skill 335,1; skill 336,1;');
-INSERT INTO `item_db` VALUES (2636, 'Gold_Christmas_Ring', 'Gold Christmas Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (2637, 'Silver_Christmas_Ring', 'Silver Christmas Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (2638, 'Exorcize_Sachet', 'Exorcize Sachet', 5, NULL, NULL, 100, NULL, 0, NULL, NULL, 10477567, NULL, 136, NULL, 0, NULL, NULL, 'bonus bStr,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (2639, 'Purification_Sachet', 'Purification Sachet', 5, NULL, NULL, 100, NULL, 0, NULL, NULL, 10477567, NULL, 136, NULL, 0, NULL, NULL, 'bonus bAgi,1; bonus bInt,1;');
-INSERT INTO `item_db` VALUES (4001, 'Poring_Card', 'Poring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bLuk,2; bonus bFlee2,1;');
-INSERT INTO `item_db` VALUES (4002, 'Fabre_Card', 'Fabre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bVit,1; bonus bMaxHP,100;');
-INSERT INTO `item_db` VALUES (4003, 'Pupa_Card', 'Pupa Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHP,700;');
-INSERT INTO `item_db` VALUES (4004, 'Drops_Card', 'Drops Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDex,1; bonus bHit,3;');
-INSERT INTO `item_db` VALUES (4005, 'Poring__Card', 'Poring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,7,20;');
-INSERT INTO `item_db` VALUES (4006, 'Lunatic_Card', 'Lunatic Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1;');
-INSERT INTO `item_db` VALUES (4007, 'Pecopeco_Egg_Card', 'Pecopeco Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,0,20;');
-INSERT INTO `item_db` VALUES (4008, 'Picky_Card', 'Picky Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bBaseAtk,10;');
-INSERT INTO `item_db` VALUES (4009, 'Chonchon_Card', 'Chonchon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bFlee,2;');
-INSERT INTO `item_db` VALUES (4010, 'Wilow_Card', 'Wilow Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bMaxSP,80;');
-INSERT INTO `item_db` VALUES (4011, 'Picky__Card', 'Picky Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bVit,1; bonus bMaxHP,100;');
-INSERT INTO `item_db` VALUES (4012, 'Thief_Bug_Egg_Card', 'Thief Bug Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHP,400;');
-INSERT INTO `item_db` VALUES (4013, 'Andre_Egg_Card', 'Andre Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,5;');
-INSERT INTO `item_db` VALUES (4014, 'Roda_Frog_Card', 'Roda Frog Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHP,400; bonus bMaxSP,50;');
-INSERT INTO `item_db` VALUES (4015, 'Condor_Card', 'Condor Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bFlee,10;');
-INSERT INTO `item_db` VALUES (4016, 'Thief_Bug_Card', 'Thief Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (4017, 'Savage_Babe_Card', 'Savage Babe Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,500;');
-INSERT INTO `item_db` VALUES (4018, 'Andre_Larva_Card', 'Andre Larva Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bInt,1; bonus bMaxSP,10;');
-INSERT INTO `item_db` VALUES (4019, 'Hornet_Card', 'Hornet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bBaseAtk,3;');
-INSERT INTO `item_db` VALUES (4020, 'Farmiliar_Card', 'Farmiliar Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4021, 'Rocker_Card', 'Rocker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (4022, 'Spore_Card', 'Spore Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bVit,2;');
-INSERT INTO `item_db` VALUES (4023, 'Baby_Desert_Wolf_Card', 'Baby Desert Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bInt,1;');
-INSERT INTO `item_db` VALUES (4024, 'Plankton_Card', 'Plankton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4025, 'Skeleton_Card', 'Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stan,200;');
-INSERT INTO `item_db` VALUES (4026, 'Thief_bug_Female_Card', 'Thief bug Female Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bFlee,1;');
-INSERT INTO `item_db` VALUES (4027, 'Kukre_Card', 'Kukre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bAgi,2;');
-INSERT INTO `item_db` VALUES (4028, 'Tarou_Card', 'Tarou Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (4029, 'Wolf_Card', 'Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,15; bonus bCritical,1;');
-INSERT INTO `item_db` VALUES (4030, 'Mandragora_Card', 'Mandragora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,4,20;');
-INSERT INTO `item_db` VALUES (4031, 'Pecopeco_Card', 'Pecopeco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10;');
-INSERT INTO `item_db` VALUES (4032, 'Ambernite_Card', 'Ambernite Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bDef,2;');
-INSERT INTO `item_db` VALUES (4033, 'Poporing_Card', 'Poporing Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 53,1;');
-INSERT INTO `item_db` VALUES (4034, 'Worm_Tail_Card', 'Worm Tail Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (4035, 'Hydra_Card', 'Hydra Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,7,20;');
-INSERT INTO `item_db` VALUES (4036, 'Muka_Card', 'Muka Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bHPrecovRate,10;');
-INSERT INTO `item_db` VALUES (4037, 'Snake_Card', 'Snake Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4038, 'Zombie_Card', 'Zombie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bHPrecovRate,20;');
-INSERT INTO `item_db` VALUES (4039, 'Stainer_Card', 'Stainer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Silence,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4040, 'Creamy_Card', 'Creamy Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 26,1;');
-INSERT INTO `item_db` VALUES (4041, 'Coco_Card', 'Coco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4042, 'Steel_Chonchon_Card', 'Steel Chonchon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,10; bonus bDef,2;');
-INSERT INTO `item_db` VALUES (4043, 'Andre_Card', 'Andre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,20;');
-INSERT INTO `item_db` VALUES (4044, 'Smokie_Card', 'Smokie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 51,1;');
-INSERT INTO `item_db` VALUES (4045, 'Horn_Card', 'Horn Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bLongAtkDef,35;');
-INSERT INTO `item_db` VALUES (4046, 'Martin_Card', 'Martin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Blind,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4047, 'Ghostring_Card', 'Ghostring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,8; bonus bHPrecovRate,-25;');
-INSERT INTO `item_db` VALUES (4048, 'Poison_Spore_Card', 'Poison Spore Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 52,3;');
-INSERT INTO `item_db` VALUES (4049, 'Vadon_Card', 'Vadon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,3,20;');
-INSERT INTO `item_db` VALUES (4050, 'Male_Thief_Bug_Card', 'Male Thief Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bAgi,2;');
-INSERT INTO `item_db` VALUES (4051, 'Yoyo_Card', 'Yoyo Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bFlee2,5; bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (4052, 'Elder_Willow_Card', 'Elder Willow Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (4053, 'Vitata_Card', 'Vitata Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 28,1; bonus bUseSPrate,25;');
-INSERT INTO `item_db` VALUES (4054, 'Angeling_Card', 'Angeling Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,6;');
-INSERT INTO `item_db` VALUES (4055, 'Marina_Card', 'Marina Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4056, 'Dustiness_Card', 'Dustiness Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4057, 'Metaller_Card', 'Metaller Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4058, 'Thara_Frog_Card', 'Thara Frog Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,7,30;');
-INSERT INTO `item_db` VALUES (4059, 'Soldier_Andre_Card', 'Soldier Andre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,3,30;');
-INSERT INTO `item_db` VALUES (4060, 'Goblin_Card', 'Goblin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,2,20;');
-INSERT INTO `item_db` VALUES (4061, 'Cornutus_Card', 'Cornutus Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4062, 'Anacondaq_Card', 'Anacondaq Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,5,20;');
-INSERT INTO `item_db` VALUES (4063, 'Caramel_Card', 'Caramel Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,4,20;');
-INSERT INTO `item_db` VALUES (4064, 'Zerom_Card', 'Zerom Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,3;');
-INSERT INTO `item_db` VALUES (4065, 'Kaho_Card', 'Kaho Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,2,20;');
-INSERT INTO `item_db` VALUES (4066, 'Orc_Warrior_Card', 'Orc Warrior Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,2,30;');
-INSERT INTO `item_db` VALUES (4067, 'Megalodon_Card', 'Megalodon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4068, 'Scorpion_Card', 'Scorpion Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,3,20;');
-INSERT INTO `item_db` VALUES (4069, 'Drainliar_Card', 'Drainliar Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,1,20;');
-INSERT INTO `item_db` VALUES (4070, 'Eggyra_Card', 'Eggyra Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bSPrecovRate,15;');
-INSERT INTO `item_db` VALUES (4071, 'Orc_Zombie_Card', 'Orc Zombie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,9,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4072, 'Golem_Card', 'Golem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4073, 'Pirate_Skeleton_Card', 'Pirate Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 37,5;');
-INSERT INTO `item_db` VALUES (4074, 'BigFoot_Card', 'BigFoot Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,4,30;');
-INSERT INTO `item_db` VALUES (4075, 'Argos_Card', 'Argos Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4076, 'Magnolia_Card', 'Magnolia Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4077, 'Phen_Card', 'Phen Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bNoCastCancel,0; bonus bCastrate,25;');
-INSERT INTO `item_db` VALUES (4078, 'Savage_Card', 'Savage Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bVit,3;');
-INSERT INTO `item_db` VALUES (4079, 'Mantis_Card', 'Mantis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,3;');
-INSERT INTO `item_db` VALUES (4080, 'Flora_Card', 'Flora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,5,20;');
-INSERT INTO `item_db` VALUES (4081, 'Hode_Card', 'Hode Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,2,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4082, 'Desert_Wolf_Card', 'Desert Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,0,15; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4083, 'Rafflesia_Card', 'Rafflesia Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,5,30;');
-INSERT INTO `item_db` VALUES (4084, 'Marine_Sphere_Card', 'Marine Sphere Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 7,3;');
-INSERT INTO `item_db` VALUES (4085, 'Orc_Skeleton_Card', 'Orc Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,6,20;');
-INSERT INTO `item_db` VALUES (4086, 'Soldier_Skeleton_Card', 'Soldier Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bCritical,9;');
-INSERT INTO `item_db` VALUES (4087, 'Giearth_Card', 'Giearth Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,2,15;');
-INSERT INTO `item_db` VALUES (4088, 'Frilldora_Card', 'Frilldora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'skill 135,1;');
-INSERT INTO `item_db` VALUES (4089, 'Sword_Fish_Card', 'Swordfish Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,1; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4090, 'Munak_Card', 'Munak Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,2,5; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4091, 'Kobold_Card', 'Kobold Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bCritical,4;');
-INSERT INTO `item_db` VALUES (4092, 'Skel_Worker_Card', 'Skel Worker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,1,15; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4093, 'Obeaune_Card', 'Obeaune Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 35,1;');
-INSERT INTO `item_db` VALUES (4094, 'Archer_Skeleton_Card', 'Archer Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (4095, 'Marse_Card', 'Marse Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,30;');
-INSERT INTO `item_db` VALUES (4096, 'Zenorc_Card', 'Zenorc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10;');
-INSERT INTO `item_db` VALUES (4097, 'Matyr_Card', 'Matyr Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10; bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (4098, 'Dokebi_Card', 'Dokebi Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,4; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4099, 'Pasana_Card', 'Pasana Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,3; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4100, 'Sohee_Card', 'Sohee Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxSPrate,15; bonus bSPrecovRate,3;');
-INSERT INTO `item_db` VALUES (4101, 'Sand_Man_Card', 'Sandman Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,2; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4102, 'Whisper_Card', 'Whisper Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bFlee,20; bonus2 bSubEle,8,-50;');
-INSERT INTO `item_db` VALUES (4103, 'Horong_Card', 'Horong Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 10,1;');
-INSERT INTO `item_db` VALUES (4104, 'Requiem_Card', 'Requiem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Confusion,500;');
-INSERT INTO `item_db` VALUES (4105, 'Marc_Card', 'Marc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,5; bonus2 bResEff,Eff_Freeze,10000;');
-INSERT INTO `item_db` VALUES (4106, 'Mummy_Card', 'Mummy Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,20;');
-INSERT INTO `item_db` VALUES (4107, 'Verit_Card', 'Verit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,8; bonus bMaxSPrate,8;');
-INSERT INTO `item_db` VALUES (4108, 'Myst_Card', 'Myst Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,5,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4109, 'Jakk_Card', 'Jakk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,3,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4110, 'Ghoul_Card', 'Ghoul Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Poison,2000; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4111, 'Strouf_Card', 'Strouf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,6,20;');
-INSERT INTO `item_db` VALUES (4112, 'Marduk_Card', 'Marduk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Silence,10000;');
-INSERT INTO `item_db` VALUES (4113, 'Marionette_Card', 'Marionette Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,8,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4114, 'Argiope_Card', 'Argiope Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,5; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4115, 'Hunter_Fly_Card', 'Hunter Fly Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bHpDrainRate,3,15;');
-INSERT INTO `item_db` VALUES (4116, 'Isis_Card', 'Isis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,7,30; bonus bFlee,5;');
-INSERT INTO `item_db` VALUES (4117, 'Side_Winder_Card', 'Sidewinder Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDoubleRate,5;');
-INSERT INTO `item_db` VALUES (4118, 'Petit_Card', 'Petit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,9,20;');
-INSERT INTO `item_db` VALUES (4119, 'Bathory_Card', 'Bathory Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,7;');
-INSERT INTO `item_db` VALUES (4120, 'Petit__Card', 'Petit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,9,30;');
-INSERT INTO `item_db` VALUES (4121, 'Phreeoni_Card', 'Phreeoni Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,100;');
-INSERT INTO `item_db` VALUES (4122, 'Deviruchi_Card', 'Deviruchi Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus2 bResEff,Eff_Blind,10000;');
-INSERT INTO `item_db` VALUES (4123, 'Eddga_Card', 'Eddga Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bInfiniteEndure,0; bonus bMaxHPrate,-25;');
-INSERT INTO `item_db` VALUES (4124, 'Medusa_Card', 'Medusa Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,6,15; bonus2 bResEff,Eff_Stone,10000;');
-INSERT INTO `item_db` VALUES (4125, 'Deviace_Card', 'Deviace Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,7,7; bonus2 bAddRace,2,7; bonus2 bAddRace,3,7; bonus2 bAddRace,4,7;');
-INSERT INTO `item_db` VALUES (4126, 'Minorous_Card', 'Minorous Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,2,15; bonus bBaseAtk,5;');
-INSERT INTO `item_db` VALUES (4127, 'Nightmare_Card', 'Nightmare Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (4128, 'Golden_Bug_Card', 'Golden Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bNoMagicDamage,0; bonus bUseSPrate,100;');
-INSERT INTO `item_db` VALUES (4129, 'Baphomet__Card', 'Baphomet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bAgi,3; bonus bCritical,1;');
-INSERT INTO `item_db` VALUES (4130, 'Scorpion_King_Card', 'Scorpion King Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,9,20;');
-INSERT INTO `item_db` VALUES (4131, 'Moonlight_Flower_Card', 'Moonlight Flower Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bSpeedRate,25;');
-INSERT INTO `item_db` VALUES (4132, 'Mistress_Card', 'Mistress Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bNoGemStone,0; bonus bUseSPrate,25;');
-INSERT INTO `item_db` VALUES (4133, 'Raydric_Card', 'Raydric Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,0,20;');
-INSERT INTO `item_db` VALUES (4134, 'Dracula_Card', 'Dracula Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bSpDrainRate,3,5;');
-INSERT INTO `item_db` VALUES (4135, 'Orc_Lord_Card', 'Orc Lord Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bShortWeaponDamageReturn,30;');
-INSERT INTO `item_db` VALUES (4136, 'Khalitzburg_Card', 'Khalitzburg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,6,30;');
-INSERT INTO `item_db` VALUES (4137, 'Drake_Card', 'Drake Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bNoSizeFix,0;');
-INSERT INTO `item_db` VALUES (4138, 'Anubis_Card', 'Anubis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,8,30;');
-INSERT INTO `item_db` VALUES (4139, 'Joker_Card', 'Joker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 50,1;');
-INSERT INTO `item_db` VALUES (4140, 'Knight_Of_Abyss_Card', 'Knight Of Abyss Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,10,25;');
-INSERT INTO `item_db` VALUES (4141, 'Evil_Druid_Card', 'Evil Druid Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,9; bonus bInt,1; bonus bDef,1;');
-INSERT INTO `item_db` VALUES (4142, 'Doppelganger_Card', 'Doppelganger Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAspdRate,30;');
-INSERT INTO `item_db` VALUES (4143, 'Orc_Hero_Card', 'Orc Hero Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bVit,3; bonus2 bResEff,Eff_Stan,10000;');
-INSERT INTO `item_db` VALUES (4144, 'Osiris_Card', 'Osiris Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRestartFullRecover,0;');
-INSERT INTO `item_db` VALUES (4145, 'Berzebub_Card', 'Berzebub Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bCastrate,-30;');
-INSERT INTO `item_db` VALUES (4146, 'Maya_Card', 'Maya Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMagicDamageReturn,30;');
-INSERT INTO `item_db` VALUES (4147, 'Baphomet_Card', 'Baphomet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,-10; bonus bSplashRange,1;');
-INSERT INTO `item_db` VALUES (4148, 'Pharaoh_Card', 'Pharaoh Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-30;');
-INSERT INTO `item_db` VALUES (4149, 'Bon_Gun_Card', 'Bon Gun Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bInt,2;');
-INSERT INTO `item_db` VALUES (4150, 'Orc_Archer_Card', 'Orc Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRange,1;');
-INSERT INTO `item_db` VALUES (4151, 'Mimic_Card', 'Mimic Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bDex,2; bonus bLuk,3;');
-INSERT INTO `item_db` VALUES (4152, 'Wraith_Card', 'Wraith Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bMatk,8;');
-INSERT INTO `item_db` VALUES (4153, 'Alarm_Card', 'Alarm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bCastrate,-10;');
-INSERT INTO `item_db` VALUES (4154, 'Arclouse_Card', 'Arclouse Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (4155, 'Rideword_Card', 'Rideword Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bDex,6;');
-INSERT INTO `item_db` VALUES (4156, 'Skeleton_Prisoner_Card', 'Skel Prisoner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 45,3;');
-INSERT INTO `item_db` VALUES (4157, 'Zombie_Prisoner_Card', 'Zombie Prisoner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10;');
-INSERT INTO `item_db` VALUES (4158, 'Dark_Priest_Card', 'Dark Priest Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
-INSERT INTO `item_db` VALUES (4159, 'Punk_Card', 'Punk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
-INSERT INTO `item_db` VALUES (4160, 'Zherlthsh_Card', 'Zherlthsh Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
-INSERT INTO `item_db` VALUES (4161, 'Mysteltainn_Card', 'Mysteltainn Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtk,30; bonus bMaxHPrate,-22; bonus bCastrate,-10;');
-INSERT INTO `item_db` VALUES (4162, 'Tirfing_Card', 'Tirfing Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAgi,3; bonus bFlee,10;');
-INSERT INTO `item_db` VALUES (4163, 'Executioner_Card', 'Executioner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bRandomAttackIncrease,300, 4;');
-INSERT INTO `item_db` VALUES (4164, 'Anolian_Card', 'Anolian Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (4165, 'Sting_Card', 'Sting Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,4;');
-INSERT INTO `item_db` VALUES (4166, 'Wander_Man_Card', 'Wander Man Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,30; bonus bCritical,6;');
-INSERT INTO `item_db` VALUES (4167, 'Cramp_Card', 'Cramp Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bAgi,3;');
-INSERT INTO `item_db` VALUES (4168, 'Filamentous_Card', 'Filamentous Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,100; bonus2 bResEff,Eff_Freeze,100; bonus2 bResEff,Eff_Stan,100; bonus2 bResEff,Eff_Sleep,100; bonus2 bResEff,Eff_Poison,100; bonus2 bResEff,Eff_Curse,100; bonus2 bResEff,Eff_Silence,100; bonus2 bResEff,Eff_Confusion,100; bonus2 bResEff,Eff_Blind,100;');
-INSERT INTO `item_db` VALUES (4169, 'Brilight_Card', 'Brilight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bAgi,2; bonus bLuk,3;');
-INSERT INTO `item_db` VALUES (4170, 'Iron_Fist_Card', 'Iron Fist Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bVit,2;');
-INSERT INTO `item_db` VALUES (4171, 'High_Orc_Card', 'High Orc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (4172, 'Choco_Card', 'Choco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bStr,100; bonus bAgi,100; bonus bVit,100; bonus bInt,100; bonus bDex,100; bonus bLuk,100;');
-INSERT INTO `item_db` VALUES (4173, 'Stem_Worm_Card', 'Stem Worm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (4174, 'Penonema_Card', 'Penomena Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate, 15;');
-INSERT INTO `item_db` VALUES (4175, 'Marin_Card', 'Marin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,20;');
-INSERT INTO `item_db` VALUES (4176, 'Sasquatch_Card', 'Sasquatch Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,1,50; bonus bAtk,-10;');
-INSERT INTO `item_db` VALUES (4177, 'Antonio_Card', 'Antonio Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 50,5; skill 210,5;');
-INSERT INTO `item_db` VALUES (4178, 'Cruiser_Card', 'Cruiser Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stone,50;');
-INSERT INTO `item_db` VALUES (4179, 'Mystcase_Card', 'Mystcase Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bCastrate,-50; bonus bAtk,+50;');
-INSERT INTO `item_db` VALUES (4180, 'Chepet_Card', 'Chepet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bLuk,5;');
-INSERT INTO `item_db` VALUES (4181, 'Stormy_Knight_Card', 'Stormy Knight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Freeze,25; bonus bAtk,25;');
-INSERT INTO `item_db` VALUES (4182, 'Hatii_Card', 'Hatii Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,2,50; bonus bAtk,-10;');
-INSERT INTO `item_db` VALUES (4183, 'Gargoyle_Card', 'Gargoyle Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRange,5;');
-INSERT INTO `item_db` VALUES (4184, 'Raggler_Card', 'Raggler Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,50;');
-INSERT INTO `item_db` VALUES (4185, 'Neraid_Card', 'Neraid Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,0,50; bonus bAtk,-10;');
-INSERT INTO `item_db` VALUES (4186, 'Pest_Card', 'Pest Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,0,20;');
-INSERT INTO `item_db` VALUES (4187, 'Injustice_Card', 'Injustice Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,9,20;');
-INSERT INTO `item_db` VALUES (4188, 'Goblin_Archer_Card', 'Goblin Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,2,20;');
-INSERT INTO `item_db` VALUES (4189, 'Gryphon_Card', 'Gryphon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,25; bonus bAtk,25;');
-INSERT INTO `item_db` VALUES (4190, 'Dark_Frame_Card', 'Dark Frame Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'skill 32,2;');
-INSERT INTO `item_db` VALUES (4191, 'Wind_Ghost_Card', 'Wind Ghost Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,4;');
-INSERT INTO `item_db` VALUES (4192, 'Merman_Card', 'Merman Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,1;');
-INSERT INTO `item_db` VALUES (4193, 'Cookie_Card', 'Cookie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,7;');
-INSERT INTO `item_db` VALUES (4194, 'Aster_Card', 'Aster Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,3,20;');
-INSERT INTO `item_db` VALUES (4195, 'Carat_Card', 'Carat Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,6,20;');
-INSERT INTO `item_db` VALUES (4196, 'Bloody_Knight_Card', 'Bloody Knight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,25; bonus bAtk,25;');
-INSERT INTO `item_db` VALUES (4197, 'Clock_Card', 'Clock Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bLuk,10;');
-INSERT INTO `item_db` VALUES (4198, 'Clock_Tower_Manager_Card', 'C Tower Manager Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,50;');
-INSERT INTO `item_db` VALUES (4199, 'Alligator_Card', 'Alligator Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,50;');
-INSERT INTO `item_db` VALUES (4200, 'Dark_Lord_Card', 'Dark Lord Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,9;');
-INSERT INTO `item_db` VALUES (4201, 'Orc_Lady_Card', 'Orc Lady Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,20;');
-INSERT INTO `item_db` VALUES (4202, 'Megalith_Card', 'Megalith Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'skill 9,1;');
-INSERT INTO `item_db` VALUES (4203, 'Alice_Card', 'Alice Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,6;');
-INSERT INTO `item_db` VALUES (4204, 'Raydric_Archer_Card', 'Raydric Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,3;');
-INSERT INTO `item_db` VALUES (4205, 'Greatest_General_Card', 'Greatest General Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,5,20;');
-INSERT INTO `item_db` VALUES (4206, 'Stalatic_Golem_Card', 'Stalactic Golem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHP,500; bonus bDex,-3;');
-INSERT INTO `item_db` VALUES (4207, 'Tri_Joint_Card', 'Tri Joint Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,7,20;');
-INSERT INTO `item_db` VALUES (4208, 'Steamrider_Goblin_Card', 'Steam Goblin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,8,20;');
-INSERT INTO `item_db` VALUES (4209, 'Sage_Worm_Card', 'Sage Worm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,8;');
-INSERT INTO `item_db` VALUES (4210, 'Kobold_Archer_Card', 'Kobold archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,25; bonus bAtk,25;');
-INSERT INTO `item_db` VALUES (4211, 'Chimera_Card', 'Chimera Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,25; bonus bAtk,25;');
-INSERT INTO `item_db` VALUES (5001, 'Headset', 'Headset', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 87, NULL, 'bonus2 bResEff,Eff_Curse,1000;');
-INSERT INTO `item_db` VALUES (5002, 'Jewel_Crown', 'Jewel Crown', 5, 20, NULL, 600, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 60, 88, NULL, 'bonus bMdef,3; bonus bInt,2; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (5003, 'Joker_Jester', 'Joker Jester', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 89, NULL, 'bonus bMdef,5; bonus bLuk,2;');
-INSERT INTO `item_db` VALUES (5004, 'Oxygen_Mask', 'Oxygen Mask', 5, 20, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 90, NULL, 'bonus2 bResEff,Eff_Poison,2000;');
-INSERT INTO `item_db` VALUES (5005, 'Gas_Mask', 'Gas Mask', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 91, NULL, 'bonus2 bResEff,Eff_Poison,3000;');
-INSERT INTO `item_db` VALUES (5006, 'Machoman_Glasses', 'Machoman\'s Glasses', 5, 36000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 0, 92, NULL, NULL);
-INSERT INTO `item_db` VALUES (5007, 'Grand_Circlet', 'Grand Circlet', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 55, 93, NULL, 'bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (5008, 'Puppy_Love', 'Puppy Love', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 94, NULL, NULL);
-INSERT INTO `item_db` VALUES (5009, 'Safety_Helmet', 'Safety Helmet', 5, 20, NULL, 500, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 95, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (5010, 'Indian_Hair_Piece', 'Indian Fillet', 5, 20, NULL, 100, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 96, NULL, NULL);
-INSERT INTO `item_db` VALUES (5011, 'Aerial', 'Aerial', 5, 20, NULL, 100, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 97, NULL, NULL);
-INSERT INTO `item_db` VALUES (5012, 'Ph.D_Hat', 'Ph.D Hat', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 98, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (5013, 'Horn_Of_Lord_Kaho', 'Lord Kaho\'s Horn', 5, 20, NULL, 100, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 0, 99, NULL, 'bonus bMdef,10; bonus bStr,5; bonus bAgi,10; bonus bVit,10; bonus bInt,5; bonus bLuk,20;');
-INSERT INTO `item_db` VALUES (5014, 'Fin_Helm', 'Fin Helm', 5, 20, NULL, 300, NULL, 2, NULL, 0, 16514, 2, 512, NULL, 65, 100, NULL, NULL);
-INSERT INTO `item_db` VALUES (5015, 'Egg_Shell', 'Egg Shell', 5, 20, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 101, NULL, NULL);
-INSERT INTO `item_db` VALUES (5016, 'Boy\'s_Cap', 'Boy\'s Cap', 5, 20, NULL, 100, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 102, NULL, NULL);
-INSERT INTO `item_db` VALUES (5017, 'Bone_Helm', 'Bone Helm', 5, 20, NULL, 800, NULL, 7, NULL, 0, 279714, 2, 256, NULL, 70, 103, NULL, 'bonus2 bSubEle,7,-15;');
-INSERT INTO `item_db` VALUES (5018, 'Feather_Bonnet', 'Feather Bonnet', 5, 20, NULL, 300, NULL, 4, NULL, 0, 1574920, 2, 256, NULL, 0, 104, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (5019, 'Corsair', 'Corsair', 5, 20, NULL, 500, NULL, 5, NULL, 0, 2088958, 2, 256, NULL, 0, 105, NULL, 'bonus bVit,1;');
-INSERT INTO `item_db` VALUES (5020, 'Kafra_Band', 'Kafra Band', 5, 20, NULL, 500, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 106, NULL, 'bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (5021, 'Bankruptcy_of_Heart', 'Money Loser\'s Grief', 5, NULL, NULL, 1200, NULL, 4, NULL, 0, 263200, 2, 256, NULL, 38, 107, NULL, 'bonus bInt,1; bonus bDex,1;');
-INSERT INTO `item_db` VALUES (5022, 'Solar_God_Helm', 'Solar God Helm', 5, NULL, NULL, 2400, NULL, 4, NULL, 0, 2088832, 2, 768, NULL, 0, 138, NULL, 'bonus bStr,3; bonus bInt,2;');
-INSERT INTO `item_db` VALUES (5023, 'Parcel_Hat', 'Parcel Hat', 5, NULL, NULL, 1000, NULL, 0, NULL, 0, 263200, 2, 256, NULL, 0, 108, NULL, NULL);
-INSERT INTO `item_db` VALUES (5024, 'Cake_Hat', 'Cake Hat', 5, NULL, NULL, 1500, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 109, NULL, NULL);
-INSERT INTO `item_db` VALUES (5025, 'Angel_Helm', 'Angel Helm', 5, NULL, NULL, 1600, NULL, 5, NULL, 0, 2088832, 2, 256, NULL, 74, 110, NULL, 'bonus bAgi,1; bonus bLuk,1; bonus bMdef,3;');
-INSERT INTO `item_db` VALUES (5026, 'Chef_Hat', 'Chef\'s Hat', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 50, 111, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (5027, 'Mage_Hat', 'Mage Hat', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 66052, 2, 256, NULL, 0, 112, NULL, 'bonus bInt,2; bonus bMaxSP,150;');
-INSERT INTO `item_db` VALUES (5028, 'Candle', 'Candle', 5, NULL, NULL, 150, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 0, 113, NULL, NULL);
-INSERT INTO `item_db` VALUES (5029, 'Spore_Hat', 'Spore Hat', 5, NULL, NULL, 900, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 20, 114, NULL, NULL);
-INSERT INTO `item_db` VALUES (5030, 'Panda_Hat', 'Panda Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 40, 115, NULL, NULL);
-INSERT INTO `item_db` VALUES (5031, 'Miner\'s_Helmet', 'Miner\'s Helmet', 5, NULL, NULL, 1500, NULL, 4, NULL, 0, 447986, 2, 256, NULL, 55, 116, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (5032, 'Sunday_Hat', 'Sunday Hat', 5, NULL, NULL, 800, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 117, NULL, NULL);
-INSERT INTO `item_db` VALUES (5033, 'Smokie_Hat', 'Smokie Hat', 5, NULL, NULL, 900, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 50, 118, NULL, NULL);
-INSERT INTO `item_db` VALUES (5034, 'Lightbulb_Hairband', 'Lightbulb Hairband', 5, NULL, NULL, 500, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 119, NULL, NULL);
-INSERT INTO `item_db` VALUES (5035, 'Poring_Hat', 'Poring Hat', 5, NULL, NULL, 700, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 38, 120, NULL, NULL);
-INSERT INTO `item_db` VALUES (5036, 'Cross_Hairband', 'Cross Hairband', 5, NULL, NULL, 250, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 10, 121, NULL, NULL);
-INSERT INTO `item_db` VALUES (5037, 'Fruit_Shell', 'Apple Hat', 5, NULL, NULL, 150, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 5, 122, NULL, NULL);
-INSERT INTO `item_db` VALUES (5038, 'Deviruchi_Hat', 'Deviruchi Hat', 5, NULL, NULL, 800, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 64, 123, NULL, 'bonus bStr,1; bonus bInt,1;');
-INSERT INTO `item_db` VALUES (5039, 'Rainbow_Eggshell', 'Rainbow Eggshell', 5, NULL, NULL, 400, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 19, 124, NULL, NULL);
-INSERT INTO `item_db` VALUES (5040, 'Blush', 'Blush', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 125, NULL, NULL);
-INSERT INTO `item_db` VALUES (5041, 'Heart_Hairpin', 'Heart Hairpin', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 126, NULL, NULL);
-INSERT INTO `item_db` VALUES (5042, 'Hair_Protector', 'Dumpling Decoration', 5, NULL, NULL, 150, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 14, 127, NULL, NULL);
-INSERT INTO `item_db` VALUES (5043, 'Opera_Ghost_Mask', 'Opera Ghost Mask', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 20, 128, NULL, NULL);
-INSERT INTO `item_db` VALUES (5044, 'Wing_Of_Demon', 'Wing\'s of Demon', 5, NULL, NULL, 350, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 45, 129, NULL, NULL);
-INSERT INTO `item_db` VALUES (5045, 'Magician_Hat', 'Magic Hat', 5, NULL, NULL, 500, NULL, 3, NULL, 0, 99092, 2, 256, NULL, 50, 130, NULL, 'bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50;');
-INSERT INTO `item_db` VALUES (5046, 'Bongun_Hat', 'Bongun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 769, NULL, 0, 139, NULL, NULL);
-INSERT INTO `item_db` VALUES (5047, 'Fashion_Sunglasses', 'Fashion Sunglasses', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 131, NULL, NULL);
-INSERT INTO `item_db` VALUES (5048, 'Cresent_Hairpin', 'Cresent Hairpin', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 132, NULL, NULL);
-INSERT INTO `item_db` VALUES (5049, 'Striped_Bandana', 'Striped Bandana', 5, NULL, NULL, 150, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 133, NULL, NULL);
-INSERT INTO `item_db` VALUES (5050, 'Mysterious_Fruit_Shell', 'Mysterious Fruit Shell', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 30, 134, NULL, NULL);
-INSERT INTO `item_db` VALUES (5051, 'Bell_of_Pussycat', 'Bell of Pussycat', 5, NULL, NULL, 100, NULL, 5, NULL, 0, 10477567, 2, 1, NULL, 0, 135, NULL, NULL);
-INSERT INTO `item_db` VALUES (5052, 'Blue_Bandana', 'Blue Bandana', 5, NULL, NULL, 150, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 136, NULL, NULL);
-INSERT INTO `item_db` VALUES (5053, 'Sphinx_Hat', 'Sphinx Hat', 5, NULL, NULL, 3000, NULL, 5, NULL, 0, 16514, 2, 257, NULL, 65, 137, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (5054, 'Assassin_Mask', 'Assassin Mask', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 4096, 2, 1, NULL, 70, 180, NULL, NULL);
-INSERT INTO `item_db` VALUES (5055, 'Novice_Eggshell', 'Novice Eggshell', 5, NULL, NULL, 10, NULL, 3, NULL, 0, 8388609, 2, 256, NULL, 0, 101, NULL, NULL);
-INSERT INTO `item_db` VALUES (5056, 'Seed_Of_Love', 'Seed Of Love', 5, NULL, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 140, NULL, NULL);
-INSERT INTO `item_db` VALUES (5057, 'Black_Cat_Ears', 'Black Cat Ears', 5, NULL, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 45, 141, NULL, NULL);
-INSERT INTO `item_db` VALUES (5058, 'Resting_Cat', 'Resting Cat', 5, NULL, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 142, NULL, 'bonus2 bResEff,Eff_Curse,3000; bonus bMdef,15;');
-INSERT INTO `item_db` VALUES (5059, 'Bear_Hat', 'Bear Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 143, NULL, NULL);
-INSERT INTO `item_db` VALUES (5060, 'Pointy_Cap', 'Pointy Cap', 5, NULL, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 144, NULL, 'bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (5061, 'Flower_Hairpin', 'Flower Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 145, NULL, NULL);
-INSERT INTO `item_db` VALUES (5062, 'Straw_Hat', 'Straw Hat', 5, NULL, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 146, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (5063, 'Bandaid', 'Bandaid', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 147, NULL, NULL);
-INSERT INTO `item_db` VALUES (5064, 'Transformation_Leaf', 'Transformation Leaf', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 148, NULL, NULL);
-INSERT INTO `item_db` VALUES (5065, 'Fresh_Blueish_Fish', 'Fresh Blueish Fish', 5, NULL, NULL, 500, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 50, 149, NULL, 'bonus2 bAddRace,5,10;');
-INSERT INTO `item_db` VALUES (5066, 'Horns_Of_Succubus', 'Horns of Succubus', 5, NULL, NULL, 800, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 70, 150, NULL, 'bonus bInt,1; bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (5067, 'Sombrero', 'Sombrero', 5, NULL, NULL, 350, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 0, 151, NULL, 'bonus bAgi,1;');
-INSERT INTO `item_db` VALUES (5068, 'Ears_of_Demon', 'Ears Of Demon', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 70, 152, NULL, 'bonus bStr,1;');
-INSERT INTO `item_db` VALUES (5069, 'Fox_Mask', 'Fox Mask', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 153, NULL, 'bonus bAgi,1; bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (5070, 'Bandage', 'Bandage', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 154, NULL, 'bonus bStr,2;');
-INSERT INTO `item_db` VALUES (5071, 'Indian_Headband', 'Indian Headband', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 155, NULL, 'bonus bDex,1;');
-INSERT INTO `item_db` VALUES (5072, 'Horns_Of_Incubus', 'Horns Of Incubus', 5, NULL, NULL, 800, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 70, 156, NULL, 'bonus bAgi,1; bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (5073, 'Teacher\'s_Pet', 'Teacher\'s Pet', 5, NULL, NULL, 700, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 157, NULL, 'bonus bDex,2;');
-INSERT INTO `item_db` VALUES (5074, 'Ears_of_Angel', 'Ears of Angel', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 70, 158, NULL, 'bonus bStr,1;');
-INSERT INTO `item_db` VALUES (5075, 'Cowboy_Hat', 'Cowboy Hat', 5, NULL, NULL, 500, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 0, 159, NULL, NULL);
-INSERT INTO `item_db` VALUES (5076, 'Furry_Hat', 'Furry Hat', 5, NULL, NULL, 350, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 160, NULL, 'bonus bLuk,1;');
-INSERT INTO `item_db` VALUES (5077, 'Tulip_Hairpin', 'Tulip Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 161, NULL, NULL);
-INSERT INTO `item_db` VALUES (5078, 'Sea_Otter_Hat', 'Sea Otter Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 162, NULL, 'bonus bVit,1;');
-INSERT INTO `item_db` VALUES (5079, 'X_Hairpin', 'X Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 163, NULL, NULL);
-INSERT INTO `item_db` VALUES (5080, 'Crown_of_the_Ancient_Queen', 'Crown of The Ancient Queen', 5, NULL, NULL, 400, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 45, 164, NULL, NULL);
-INSERT INTO `item_db` VALUES (5081, 'Crown_of_Mistress', 'Crown of Mistress', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 0, 256, NULL, 75, 165, NULL, 'bonus bInt,2; bonus bMaxSP,100;');
-INSERT INTO `item_db` VALUES (5082, 'Mushroom_Hairband', 'Mushroom Hairband', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 166, NULL, NULL);
-INSERT INTO `item_db` VALUES (5083, 'Back_Ribbon', 'Back Ribbon', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 10477567, 0, 256, NULL, 45, 167, NULL, 'bonus bMdef,10;');
-INSERT INTO `item_db` VALUES (5084, 'Lazy_Raccoon_Hat', 'Lazy Racoon Hat', 5, NULL, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 168, NULL, 'bonus2 bResEff,Eff_Sleep,2000;');
-INSERT INTO `item_db` VALUES (5085, 'Small_Twin_Ribbons', 'Small Twin Ribbons', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 0, 512, NULL, 45, 169, NULL, NULL);
-INSERT INTO `item_db` VALUES (5086, 'Sad_Mask', 'Sad Mask', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 513, NULL, 0, 170, NULL, 'bonus2 bResEff,Eff_Blind,5000;');
-INSERT INTO `item_db` VALUES (5087, 'Expressionless_Mask', 'Expressionless Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 171, NULL, NULL);
-INSERT INTO `item_db` VALUES (5088, 'Surprised_Mask', 'Surprised Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 172, NULL, NULL);
-INSERT INTO `item_db` VALUES (5089, 'Annoyed_Mask', 'Annoyed Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 173, NULL, NULL);
-INSERT INTO `item_db` VALUES (5090, 'Mask_of_the_Goblin_Leader', 'Mask of The Goblin Leader', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 513, NULL, 0, 174, NULL, NULL);
-INSERT INTO `item_db` VALUES (5091, 'Golden_Bell', 'Golden Bell', 5, NULL, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 768, NULL, 35, 175, NULL, NULL);
-INSERT INTO `item_db` VALUES (5092, 'Nun_Hat', 'Nun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 33024, 0, 768, NULL, 65, 176, NULL, NULL);
-INSERT INTO `item_db` VALUES (5093, 'Nun_Hat_', 'Nun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 33024, 0, 768, NULL, 65, 177, NULL, 'bonus bMaxSP,100;');
-INSERT INTO `item_db` VALUES (5094, 'Orc_Hero_Helm', 'Orc Hero Helm', 5, NULL, NULL, 900, NULL, 5, NULL, 0, 2088958, 2, 768, NULL, 55, 178, NULL, 'bonus bStr,2; bonus bVit,1;');
-INSERT INTO `item_db` VALUES (7001, 'Mold_Powder', 'Mould Powder', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7002, 'Ogre_Tooth', 'Ogre Tooth', 3, 658, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7003, 'Anolian_Skin', 'Anolian Skin', 3, 928, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7004, 'Mud_Lump', 'Mud Lump', 3, 876, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7005, 'Skull', 'Skull', 3, 1044, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7006, 'Wing_of_Red_Bat', 'Wing of Red Bat', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7007, 'Claw_of_Rat', 'Claw of Rat', 3, 748, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7008, 'Stiff_Horn', 'Stiff Horn', 3, 636, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7009, 'Glitter_Shell', 'Glitter Shell', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7010, 'Tail_of_Steel_Scorpion', 'Tail of Steel Scorpion', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7011, 'Claw_of_Monkey', 'Claw of Monkey', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7012, 'Tough_Scalelike_Stem', 'Tough Scalelike Stem', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7013, 'Coral_Reef', 'Coral Reef', 3, 772, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7014, 'Old_Portrait', 'Old Portrait', 3, 1500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7015, 'Bookclip_in_Memory', 'Bookclip in Memory', 3, 3000, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7016, 'Spoon_Stub', 'Spoon Stub', 3, 2500, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7017, 'Executioner\'s_Mitten', 'Executioner\'s Mitten', 3, 4500, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7018, 'Young_Twig', 'Young Twig', 3, 50, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7019, 'Loki\'s_Whispers', 'Loki\'s Whispers', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7020, 'Mother\'s_Nightmare', 'Mother\'s Nightmare', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7021, 'Foolishness_of_the_Blind', 'Foolishness of the Blind', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7022, 'Old_Hilt', 'Old Hilt', 3, 150, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7023, 'Blade_Lost_in_Darkness', 'Blade Lost in Darkness', 3, 12000, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7024, 'Bloody_Edge', 'Bloody Edge', 3, 10000, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7025, 'Lucifer\'s_Lament', 'Lucifer\'s Lament', 3, 30000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7026, 'Key_of_Clock_Tower', 'Key of Clock Tower', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7027, 'Key_of_Underground', 'Key of Underground', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7028, 'Invite_for_Duel', 'Invite for Duel', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7029, 'Admission_for_Duel', 'Admission for Duel', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7030, 'Claw_of_Desert_Wolf', 'Claw of Desert Wolf', 3, 208, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7031, 'Old_Frying_Pan', 'Old Frying Pan', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7032, 'Piece_of_Egg_Shell', 'Piece of Egg Shell', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7033, 'Poison_Spore', 'Poison Spore', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7034, 'Red_Socks_with_Holes', 'Red Socks with Holes', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7035, 'Matchstick', 'Matchstick', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7036, 'Fang_of_Garm', 'Fang of Garm', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7037, 'Coupon', 'Coupon', 3, 2000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7038, 'Yarn', 'Yarn', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7039, 'Novice_Nametag', 'Novice Nametag', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7040, 'Megaphone', 'Megaphone', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7041, 'Fine_Grit', 'Fine Grit', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7042, 'Leather_Bag_of_Infinity', 'Leather Bag of Infinity', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7043, 'Fine_Sand', 'Fine Sand', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7044, 'Vigorgra', 'Vigorgra', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7045, 'Magic_Paint', 'Magic Paint', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7046, 'Cart_Parts', 'Cart Parts', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7047, 'Alice\'s_Apron', 'Alice\'s Apron', 3, 2424, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7048, 'Talon_of_Griffon', 'Talon of Griffon', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7049, 'Stone', 'Stone', 3, 0, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7050, 'Cotton_Mat', 'Cotton Mat', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7051, 'Silk_Mat', 'Silk Mat', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7052, 'Wasted_Magazine', 'Wasted Magazine', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7053, 'Cyfar', 'Cyfar', 3, 772, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7054, 'Brigan', 'Brigan', 3, 746, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7055, 'Animal_Poop', 'Animal Poop', 3, NULL, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7056, 'Payment_Statement_for_Kafra_', 'Payment Statement for Ka', 3, NULL, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7057, 'Gjallar', 'Gjallar', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7058, 'Gleipnir', 'Gleipnir', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7059, 'Free_Ticket_for_Kafra_Storag', 'Free Ticket for Kafra St', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7060, 'Free_Ticket_for_Kafra_Transp', 'Free Ticket for Kafra Tr', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7061, 'Free_Ticket_for_the_Cart_Ser', 'Free Ticket for the Cart', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7062, 'Broken_Turtle_Shell', 'Broken Turtle Shell', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7063, 'Soft_Feather', 'Soft Feather', 3, 280, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7064, 'Wing_of_Dragonfly', 'Wing of Dragonfly', 3, 520, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7065, 'Sea-otter_Fur', 'Sea Otter Fur', 3, 820, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7066, 'Ice_Cubic', 'Ice Cubic', 3, 660, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7067, 'Stone_Fragment', 'Stone Fragment', 3, 640, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7068, 'Burnt_Tree', 'Burnt Tree', 3, 722, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7069, 'Destroyed_Armor', 'Destroyed Armor', 3, 1042, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7070, 'Broken_Shell', 'Broken Shell', 3, 900, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7071, 'Tattered_Clothes', 'Tattered Clothes', 3, 640, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7072, 'Old_Shuriken', 'Old Shuriken', 3, 1780, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7073, 'Freya\'s_Jewel', 'Freya\'s Jewel', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7074, 'Thor\'s_Gauntlet', 'Thor\'s Gauntlet', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7075, 'Iron_Maiden', 'Iron Maiden', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7076, 'Wheel_of_the_Unknown', 'Wheel of the Unknown', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7077, 'Silver_Ornament', 'Silver Ornament', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7078, 'Wrath_of_Valkyrie', 'Wrath of Valkyrie', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7079, 'Feather_of_Angel_Wing', 'Feather of Angel Wing', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7080, 'Cat_Tread', 'Footprints of Cat', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7081, 'Woman\'s_Moustache', 'Woman\'s Moustache', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7082, 'Root_of_Stone', 'Root of Stone', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7083, 'Spirit_of_Fish', 'Spirit of Fish', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7084, 'Sputum_of_Bird', 'Sputum of Bird', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7085, 'Sinew_of_Bear', 'Sinew of Bear', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7086, 'Emblem_of_the_Sun_God', 'Emblem of the Sun God', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7087, 'Breath_of_Spirit', 'Breath of Soul', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7088, 'Snow_Crystal', 'Snow Crystal', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7089, 'Omen_of_Tempest', 'Omen of Tempest', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7090, 'Ripple', 'Ripple', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7091, 'Billow', 'Billow', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7092, 'Drifting_Air', 'Drifting Air', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7093, 'Cogwheel', 'Metal Wheel', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7094, 'Fragment', 'Cabinet Chip', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7095, 'Metal_Fragment', 'Tooth Fragment', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7096, 'Lava', 'Hardened Lava', 3, 1108, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7097, 'Burning_Heart', 'Burning Heart', 3, 924, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7098, 'Live_Coal', 'Fire Seed', 3, 638, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7099, 'Worn-out_Magic_Scroll', 'Old Magical Circle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7100, 'Sharp_Leaf', 'Sharpened Leaf', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7101, 'PecoPeco_Feather', 'Peco\'s Feather', 3, 454, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7102, 'Nightmare', 'Nightmare', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7103, 'Unknown_Liquid_Bottle', 'Yellow Liquid Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7104, 'Fake_Angel\'s_Wing', 'Fake Angel\'s Wing', 3, 756, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7105, 'Fake_Heaven_Ring', 'Imitation Soul\'s Band', 3, 924, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7106, 'Antelope_Horn', 'Antelope Horn', 3, 672, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7107, 'Antelope_Skin', 'Antelope Skin', 3, 756, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7108, 'Piece_of_Shield', 'Broken Shield', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7109, 'Shining_Spear_Blade', 'Shiny Spear Tip', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7110, 'Broken_Sword', 'Sharp Sword', 3, 588, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7111, 'Slick_Paper', 'String Paper', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7112, 'Sharp_Paper', 'Transparent Paper', 3, 906, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7113, 'Broken_Symbol_of_Pharaoh', 'Broken Symbol of Pharaoh', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7114, 'Masque_of_Tutankhamen', 'Sphinx Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7115, 'Harpy_Feather', 'Blood Feather', 3, 1142, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7116, 'Harpy_Talon', 'Tooth of Lowblood', 3, 1210, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7117, 'Torn_Magic_Book', 'Torn Spell Book', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7118, 'Torn_Scroll', 'Torn Scroll', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7119, 'Bacillus', 'Hypha Body', 3, 1024, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7120, 'Burning_Horseshoe', 'Burning Horseshoe', 3, 822, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7121, 'Honey_Pot', 'Honey Jar', 3, 622, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7122, 'Burning_Hair', 'Hot Feather', 3, 974, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7123, 'Dragon_Skin', 'Dragon\'s Skin', 3, 1024, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7124, 'Sand_Clump', 'Sand Lump', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7125, 'Scorpion_Claw', 'Crab Shot', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7126, 'Large_Jellopy', 'Large Jellopy', 3, 840, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7127, 'Alcohol_Creation_Book', 'Alcohol Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7128, 'Bottle_Grenade_Creation_Book', 'Fire Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7129, 'Acid_Bottle_Creation_Book', 'Acid Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7130, 'Plant_Bottle_Creation_Book', 'Plant Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7131, 'Mine_Bottle_Creation_Book', 'Mine Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7132, 'Glistening_Coat_Creation_Boo', 'Glistening Coat Creation Boo', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7133, 'Condensed_Potion_Creation_Bo', 'Condensed Potion Creation Bo', 3, 240000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7134, 'Medicine_Bowl', 'Medicine Bowl', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7135, 'Bottle_Grenade', 'Fire Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7136, 'Acid_Bottle', 'Hydrobolic Acid Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7137, 'Plant_Bottle', 'Water Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7138, 'Marine_Sphere_Bottle', 'Mine Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7139, 'Glistening_Coat', 'Coating Wax', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7140, 'Seed_of_Life', 'Seed of Life', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7141, 'Morning_Dew_of_Yggdrasil', 'Water Flow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7142, 'Ancient_Life', 'Ancient Life', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7143, 'Glass_Tube', 'Seperation Tubes', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7144, 'Potion_Creation_Gude', 'Potion Making Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7145, 'Ragnarok_T-shirt', 'Ragnarok T-Shirt', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7146, 'Vacation_Ticket', 'Vacation Ticket', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7147, 'Jasmine', 'Jasmine', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7148, 'Mother\'s_Letter', 'Mother\'s Letter', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7149, 'Yellow_Plate', 'Yellow Plate', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7150, 'A_piece_of_Bamboo', 'Bamboo Trunk', 3, 310, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7151, 'Oil_Paper', 'Oiled Paper', 3, 310, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7152, 'Glossy_Hair', 'Glossy Hair', 3, 340, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7153, 'Worn-out_Kimono', 'Old Kimono', 3, 590, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7154, 'Poisonous_Powder', 'Poison Powder', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7155, 'Skin_of_Poisonous_Toad', 'Poisonous Toad\'s Skin', 3, 280, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7156, 'Broken_Shuriken', 'Broken Shuriken', 3, 470, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7157, 'Black_Mask', 'Black Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7158, 'Broken_Liquor_Bottle', 'Broken Liquor Bottle', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7159, 'Demon\'s_Nose', 'Demon\'s Nose', 3, 400, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7160, 'Passport_From_King', 'Passport From King', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7161, 'Skin_of_the_Black_Bear', 'Skin of the Black Bear', 3, 384, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7162, 'Piece_of_Cloud', 'Piece of Cloud', 3, 390, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7163, 'Hard_Antennae', 'Hard Antennae', 3, 570, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7164, 'Very_Hard_Peach', 'Very Hard Peach', 3, 400, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7165, 'Etherial_Winged_Clothing', 'Etherial Winged Clothing', 3, 650, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7166, 'Soft_Silk_Fabric', 'Soft Silk Fabric', 3, 1200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7167, 'Strange_Piece_of_Iron', 'Strange Piece of Iron', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7168, 'Big_Wing_of_Butterfly', 'Big Wing of Butterfly', 3, 614, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7169, 'Tae_Guk_Tablet', 'Tae Guk Tablet', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7170, 'Tuxedo', 'Tuxedo', 5, 2, NULL, 10, NULL, 0, NULL, 0, 2088958, 1, 16, NULL, 0, 0, NULL, 'changebase 22;');
-INSERT INTO `item_db` VALUES (7171, 'Skin of Panther', 'Skin of Panther', 3, 282, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7172, 'Claw of Panther', 'Claw of Panther', 3, 290, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7173, 'Bun Buster Bag', 'Bun Buster Bag', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7174, 'Wrapping Thread', 'Wrapping Thread', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7175, 'Wrapper', 'Wrapper', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7176, 'King\'s Proof Document', 'King\'s Proof Document', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7177, 'Piece_of_Starlight\'s_Sorrow', 'Piece of Starlight\'s Sorrow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7178, 'Starlight\'s_Sorrow', 'Starlight\'s Sorrow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7179, 'Donation_Ticket', 'Donation Ticket', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7180, 'Letter_of_Introduction', 'Letter of Introduction', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7181, 'Commodity_Receipt', 'Commodity Receipt', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7182, 'Cacao', 'Cacao', 3, 200, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7183, 'Letter_of_Younger_Sister', 'Letter of Younger Sister', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7184, 'Piano_Key', 'Piano Key', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7185, 'Quiz_Participation_Volume', 'Quiz Participation Volume', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7186, 'Slender_Stem', 'Slender Stem', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7187, 'Cultish_Mask', 'Cultish Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7188, 'Brown_Root', 'Brown_Root', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7189, 'Wooden_Heart', 'Wooden Heart', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7190, 'Hard_Back_Shell', 'Hard Back Shell', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7191, 'Paper_Lantern', 'Paper Lantern', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7192, 'Pin_Wheel', 'Pin Wheel', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7193, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7194, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7195, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7196, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7197, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7198, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7199, 'Hieroglyphic', 'Hieroglyphic', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7200, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7201, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7202, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7203, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7204, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7205, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7206, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7207, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7208, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7209, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7210, 'Unknown_Item', '??????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7211, 'Unknown_Item', '???????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7212, 'Unknown_Item', '?????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7213, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7214, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7215, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7216, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7217, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7218, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7219, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7220, 'Unknown_Item', '?????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7221, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7222, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7223, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7224, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7225, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7226, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7227, 'Unknown_Item', 'TCG???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7228, 'Unknown_Item', '??', 3, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7229, 'Unknown_Item', '??', 3, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7230, 'Unknown_Item', '????', 3, NULL, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7231, 'Unknown_Item', '???', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7232, 'Unknown_Item', '???', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7233, 'Unknown_Item', '??????', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7234, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7235, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7236, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7237, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7238, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7239, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7240, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7241, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7242, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7243, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7244, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7245, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7246, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7247, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7248, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7249, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7250, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7251, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7252, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7253, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7254, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7262, 'Grave_Lump', 'Grave Lump', 3, 233, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7263, 'Cat's_Eye', 'Cat's-Eye', 3, NULL, 477, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7264, 'Dried_Sand', 'Dried Sand', 3, NULL, 161, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7265, 'Dragon_Horn', 'Dragon Horn', 3, NULL, 272, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7266, 'Dragon_Teeth', 'Dragon Teeth', 3, 218, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7267, 'Tigerskin_Underwear', 'Tigerskin Underwear', 3, NULL, 149, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7268, 'Ghost_Doll', 'Ghost Doll', 3, NULL, 605, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7269, 'Baby_Bib', 'Baby Bib', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7270, 'Baby_Bottle', 'Baby Bottle', 3, NULL, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7271, 'Novice_Statue', 'Novice Statue', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (7272, 'Dumpling_Doll', 'Dumpling Doll', 3, NULL, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9001, 'Poring_Egg', 'Poring Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9002, 'Drops_Egg', 'Drops Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9003, 'Poporing_Egg', 'Poporing Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9004, 'Lunatic_Egg', 'Lunatic Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9005, 'Picky_Egg', 'Picky Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9006, 'Chonchon_Egg', 'Chonchon Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9007, 'Steel_Chonchon_Egg', 'Steel Chonchon Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9008, 'Hunter_Fly_Egg', 'Hunter Fly Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9009, 'Savage_Babe_Egg', 'Savage Babe Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9010, 'Baby_Desert_Wolf_Egg', 'Baby Desert Wolf Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9011, 'Rocker_Egg', 'Rocker Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9012, 'Spore_Egg', 'Spore Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9013, 'Poison_Spore_Egg', 'Poison Spore Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9014, 'PecoPeco_Egg', 'PecoPeco Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9015, 'Smokie_Egg', 'Smokie Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9016, 'Yoyo_Egg', 'Yoyo Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9017, 'Orc_Warrior_Egg', 'Orc Warrior Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9018, 'Munak_Egg', 'Munak Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9019, 'Dokkaebi_Egg', 'Dokkaebi Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9020, 'Sohee_Egg', 'Sohee Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9021, 'Isis_Egg', 'Isis Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9022, 'Green_Petite_Egg', 'Green Petite Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9023, 'Deviruchi_Egg', 'Deviruchi Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9024, 'Bapho_Jr._Egg', 'Bapho Jr. Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9025, 'Bongun_Egg', 'Bongun Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9026, 'Alice_Egg', 'Alice Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9027, 'Zherlthsh_Egg', 'Zherlthsh Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9028, 'test_Egg', 'Test Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (9029, 'test_Egg', 'Test Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10001, 'Skull_Helm', 'Skull Helm', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10002, 'Monster_Oxygen_Mask', 'Monster Oxygen Mask', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10003, 'Transparent_Head_Protector', 'Transparent Headgear', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10004, 'Pacifier', 'Pacifier', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10005, 'Wig', 'Wig', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10006, 'Queen\'s_Hair_Ornament', 'Queen\'s Hair Ornament', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10007, 'Silk_Ribbon', 'Silk Ribbon', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10008, 'Punisher', 'Punisher', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10009, 'Wild_Flower', 'Wild Flower', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10010, 'Battered_Pot', 'Battered Pot', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10011, 'Stellar_Hairpin', 'Stellar Hairpin', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10012, 'Tiny_Egg_Shell', 'Tiny Egg Shell', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10013, 'Backpack', 'Backpack', 8, 1500, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10014, 'Rocker_Glasses', 'Rocker Glasses', 8, 2000, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10015, 'Green_Lace', 'Green Lace', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10016, 'Golden_Bell', 'Golden Bell', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10017, 'Bark_Shorts', 'Bark Shorts', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10018, 'Monkey_Circlet', 'Monkey Circlet', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10019, 'Red_Muffler', 'Red Muffler', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `item_db` VALUES (10020, 'Sword_of_Chinese_Exorcist', 'Sword of Chinese Exorcist', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-CREATE TABLE `mob_db` (
- `ID` mediumint(9) NOT NULL default '0',
- `Name` text NOT NULL,
- `Name2` text NOT NULL,
- `LV` smallint(6) NOT NULL default '0',
- `HP` mediumint(9) NOT NULL default '0',
- `SP` mediumint(9) NOT NULL default '0',
- `EXP` mediumint(9) NOT NULL default '0',
- `JEXP` mediumint(9) NOT NULL default '0',
- `Range1` tinyint(4) NOT NULL default '0',
- `ATK1` smallint(6) NOT NULL default '0',
- `ATK2` smallint(6) NOT NULL default '0',
- `DEF` smallint(6) NOT NULL default '0',
- `MDEF` smallint(6) NOT NULL default '0',
- `STR` tinyint(4) NOT NULL default '0',
- `AGI` tinyint(4) NOT NULL default '0',
- `VIT` tinyint(4) NOT NULL default '0',
- `INT` tinyint(4) NOT NULL default '0',
- `DEX` tinyint(4) NOT NULL default '0',
- `LUK` tinyint(4) NOT NULL default '0',
- `Range2` tinyint(4) NOT NULL default '0',
- `Range3` tinyint(4) NOT NULL default '0',
- `Scale` tinyint(4) NOT NULL default '0',
- `Race` tinyint(4) NOT NULL default '0',
- `Element` tinyint(4) NOT NULL default '0',
- `Mode` smallint(6) NOT NULL default '0',
- `Speed` smallint(6) NOT NULL default '0',
- `ADelay` smallint(6) NOT NULL default '0',
- `aMotion` smallint(6) NOT NULL default '0',
- `dMotion` smallint(6) NOT NULL default '0',
- `Drop1id` mediumint(9) NOT NULL default '0',
- `Drop1per` mediumint(9) NOT NULL default '0',
- `Drop2id` mediumint(9) NOT NULL default '0',
- `Drop2per` mediumint(9) NOT NULL default '0',
- `Drop3id` mediumint(9) NOT NULL default '0',
- `Drop3per` mediumint(9) NOT NULL default '0',
- `Drop4id` mediumint(9) NOT NULL default '0',
- `Drop4per` mediumint(9) NOT NULL default '0',
- `Drop5id` mediumint(9) NOT NULL default '0',
- `Drop5per` mediumint(9) NOT NULL default '0',
- `Drop6id` mediumint(9) NOT NULL default '0',
- `Drop6per` mediumint(9) NOT NULL default '0',
- `Drop7id` mediumint(9) NOT NULL default '0',
- `Drop7per` mediumint(9) NOT NULL default '0',
- `Drop8id` mediumint(9) NOT NULL default '0',
- `Drop8per` mediumint(9) NOT NULL default '0',
- `MEXP` mediumint(9) NOT NULL default '0',
- `ExpPer` mediumint(9) NOT NULL default '0',
- `MVP1id` mediumint(9) NOT NULL default '0',
- `MVP1per` mediumint(9) NOT NULL default '0',
- `MVP2id` mediumint(9) NOT NULL default '0',
- `MVP2per` mediumint(9) NOT NULL default '0',
- `MVP3id` mediumint(9) NOT NULL default '0',
- `MVP3per` mediumint(9) NOT NULL default '0'
-) TYPE=MyISAM;
-
-INSERT INTO `mob_db` VALUES (1001, '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, 990, 70, 904, 5500, 757, 57, 943, 210, 7041, 100, 508, 200, 625, 20, 4068, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1002, '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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1003, 'TESTEGG', 'Test Egg', 2, 10, 0, 10000, 10000, 0, 3, 9, 99, 0, 1, 99, 1, 1, 1, 1, 10, 12, 0, 4, 22, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1004, 'HORNET', 'Hornet', 8, 169, 0, 19, 15, 1, 22, 27, 5, 5, 6, 20, 8, 10, 17, 5, 10, 12, 0, 4, 24, 145, 150, 1292, 792, 216, 992, 50, 939, 5500, 909, 3500, 1208, 15, 511, 350, 518, 100, 512, 0, 4019, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1005, 'FARMILIAR', 'Familiar', 8, 155, 0, 28, 15, 1, 20, 28, 0, 0, 1, 12, 8, 5, 28, 0, 10, 12, 0, 2, 27, 133, 150, 1276, 576, 384, 913, 5500, 1105, 20, 2209, 15, 601, 50, 514, 100, 507, 700, 645, 50, 4020, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1006, 'THIEF_BUG_LARVA', 'Thief Bug Larva', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1007, 'FABRE', 'Fabre', 2, 63, 0, 3, 2, 1, 7, 10, 0, 0, 1, 2, 4, 0, 7, 5, 10, 12, 0, 4, 22, 129, 400, 1672, 672, 480, 914, 6500, 949, 500, 1502, 80, 721, 5, 511, 700, 705, 1000, 1501, 200, 4002, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1008, 'PUPA', 'Pupa', 2, 427, 0, 2, 4, 0, 1, 2, 0, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 4, 22, 128, 1000, 1001, 1, 1, 1010, 80, 915, 5500, 938, 600, 2102, 2, 935, 1000, 938, 600, 1002, 200, 4003, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1009, 'CONDOR', 'Condor', 5, 92, 0, 6, 5, 1, 11, 14, 0, 0, 1, 13, 5, 0, 13, 10, 10, 12, 1, 2, 24, 145, 150, 1148, 648, 480, 917, 6500, 1702, 150, 715, 80, 1750, 5500, 517, 400, 916, 2000, 512, 0, 4015, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1010, '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, 902, 6500, 1019, 100, 907, 600, 516, 700, 1068, 3500, 512, 0, 1066, 2000, 4010, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1011, '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, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1012, '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, 918, 5500, 908, 500, 511, 300, 721, 7, 713, 2000, 512, 0, 512, 0, 4014, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1013, 'WOLF', 'Wolf', 12, 405, 0, 45, 32, 1, 37, 46, 0, 0, 1, 12, 24, 15, 30, 20, 10, 12, 1, 2, 22, 145, 200, 1054, 54, 432, 1011, 20, 920, 5500, 2308, 10, 517, 650, 528, 1050, 919, 5500, 512, 0, 4029, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1014, 'SPORE', 'Spore', 9, 327, 0, 22, 17, 1, 24, 29, 0, 5, 1, 9, 9, 0, 14, 5, 10, 12, 1, 3, 21, 129, 200, 1872, 672, 288, 921, 5000, 507, 800, 510, 50, 743, 5, 2220, 40, 921, 5, 512, 0, 4022, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1015, 'ZOMBIE', 'Zombie', 15, 534, 0, 50, 33, 1, 67, 79, 0, 10, 1, 8, 7, 0, 15, 0, 10, 12, 1, 1, 29, 133, 400, 2612, 912, 288, 957, 5500, 724, 5, 938, 1000, 958, 50, 727, 55, 512, 0, 512, 0, 4038, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1016, 'ARCHER_SKELETON', 'Skeleton Archer', 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, 932, 4500, 756, 70, 2285, 4, 1708, 35, 1752, 1000, 501, 800, 1701, 150, 4094, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1017, '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, 955, 3500, 910, 250, 1108, 15, 928, 200, 507, 400, 716, 50, 1002, 400, 4026, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1018, '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, 924, 5500, 2322, 10, 518, 150, 602, 100, 2207, 2, 712, 500, 512, 0, 4040, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1019, 'PECOPECO', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 5500, 2402, 20, 508, 50, 507, 900, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1020, '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, 993, 50, 905, 5500, 1405, 30, 511, 350, 711, 300, 706, 1, 512, 0, 4030, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1021, '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, 1011, 40, 928, 5500, 955, 1500, 1152, 10, 508, 90, 729, 5, 1116, 50, 4050, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1022, 'WEREWOLF', 'Werewolf', 80, 28600, 0, 11813, 7289, 1, 2560, 3280, 65, 35, 1, 97, 60, 1, 135, 52, 10, 10, 2, 0, 40, 181, 200, 1500, 768, 652, 999, 500, 1034, 4000, 984, 500, 985, 500, 7017, 800, 714, 380, 1912, 300, 4091, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1023, 'ORK_WARRIOR', 'Orc Warrior', 24, 1400, 0, 261, 160, 1, 104, 126, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 133, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1024, 'WORM_TAIL', 'Worm Tail', 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, 993, 60, 1011, 25, 906, 5500, 1408, 30, 508, 70, 721, 5, 10015, 10, 4034, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1025, 'SNAKE', 'Snake', 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, 926, 5500, 1117, 15, 507, 900, 1011, 35, 937, 800, 954, 1, 512, 0, 4037, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1026, 'MUNAK', 'Munak', 30, 2872, 0, 361, 218, 1, 180, 230, 0, 0, 1, 15, 20, 5, 46, 15, 10, 12, 1, 1, 29, 133, 200, 2468, 768, 288, 901, 5500, 2264, 1, 2404, 15, 609, 20, 2337, 1, 2305, 100, 1558, 5, 4090, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1027, 'RAPTICE', 'Raptice', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1028, 'SOLDIER_SKELETON', 'Skeleton Soldier', 29, 2334, 0, 372, 226, 1, 221, 245, 10, 15, 1, 15, 22, 5, 40, 15, 10, 12, 1, 1, 29, 133, 200, 2276, 576, 432, 932, 5500, 756, 60, 1214, 12, 501, 700, 934, 10, 1201, 150, 1216, 50, 4086, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1029, 'ISIS', 'Isis', 43, 4828, 0, 2396, 993, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 936, 5500, 2233, 5, 2603, 1, 733, 150, 732, 20, 954, 1000, 731, 5, 4116, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1030, '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, 1011, 50, 937, 5500, 1455, 10, 926, 1500, 936, 200, 508, 150, 756, 38, 4062, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1031, '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, 938, 5500, 910, 1500, 511, 500, 514, 200, 729, 5, 512, 0, 512, 0, 4033, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1032, '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, 929, 5500, 912, 700, 930, 1100, 509, 550, 512, 0, 2612, 200, 639, 20, 4107, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1033, '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, 133, 200, 1372, 672, 432, 990, 50, 907, 5500, 1019, 3500, 757, 37, 2329, 30, 516, 1000, 512, 0, 4052, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1034, '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, 1011, 45, 908, 5500, 911, 600, 509, 30, 725, 5, 918, 2000, 512, 0, 4058, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1035, '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, 133, 150, 676, 576, 480, 996, 30, 999, 100, 943, 5500, 912, 1300, 756, 129, 2259, 1, 1226, 2, 4115, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1036, 'GHOUL', 'Ghoul', 39, 5118, 0, 882, 541, 1, 420, 500, 5, 20, 1, 20, 29, 0, 33, 20, 10, 12, 1, 1, 49, 133, 250, 2456, 912, 504, 958, 5500, 756, 110, 509, 670, 506, 800, 2609, 60, 934, 150, 1260, 1, 4110, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1037, 'SIDEWINDER', 'Sidewinder', 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, 954, 5500, 912, 1400, 756, 134, 1120, 2, 937, 2500, 926, 5000, 509, 1000, 4117, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1038, 'OSIRIS', 'Osiris', 78, 415400, 0, 71500, 28600, 1, 780, 2880, 10, 25, 1, 75, 62, 37, 86, 40, 10, 10, 1, 1, 89, 181, 100, 1072, 672, 384, 617, 2000, 1232, 150, 2235, 200, 1255, 600, 1009, 1000, 985, 3500, 984, 3900, 4144, 1, 7710, 0, 603, 4000, 608, 1000, 751, 200);
-INSERT INTO `mob_db` VALUES (1039, 'BAPHOMET', 'Baphomet', 81, 668000, 0, 107250, 37895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 1068, 768, 576, 1466, 200, 2256, 200, 2607, 800, 714, 500, 617, 3000, 984, 4300, 985, 5600, 4147, 1, 13000, 0, 608, 1000, 750, 400, 923, 3800);
-INSERT INTO `mob_db` VALUES (1040, '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, 999, 150, 953, 5500, 912, 220, 757, 61, 1003, 120, 715, 200, 998, 350, 4072, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1041, 'MUMMY', 'Mummy', 37, 5176, 0, 488, 314, 1, 305, 360, 0, 10, 28, 19, 32, 0, 63, 20, 10, 12, 1, 1, 49, 133, 300, 1772, 72, 384, 930, 5500, 756, 100, 934, 550, 2604, 1, 2611, 10, 525, 250, 502, 450, 4106, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1042, '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, 992, 70, 999, 30, 910, 2400, 935, 3500, 943, 30, 998, 200, 1002, 500, 4042, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1043, 'SEAHORES', 'Seahorse', 18, 1372, 0, 122, 78, 3, 100, 150, 15, 7, 20, 1, 1, 1, 1, 1, 10, 10, 0, 5, 22, 129, 200, 1500, 800, 600, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1044, '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, 995, 13, 950, 5500, 5014, 1, 2326, 10, 720, 10, 951, 500, 748, 25, 4093, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1045, 'MARC', 'Marc', 36, 6900, 0, 988, 625, 1, 220, 280, 5, 10, 1, 36, 36, 20, 56, 30, 10, 12, 1, 5, 41, 133, 150, 1272, 72, 480, 995, 18, 956, 5500, 756, 95, 951, 1000, 720, 10, 717, 200, 509, 600, 4105, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1046, 'DOPPELGANGER', 'Doppelganger', 72, 249000, 0, 51480, 10725, 1, 1340, 1590, 60, 35, 88, 90, 90, 35, 125, 65, 10, 10, 1, 6, 67, 181, 100, 480, 480, 288, 2258, 350, 2317, 250, 1162, 220, 1168, 150, 1411, 550, 985, 3800, 984, 2400, 4142, 1, 5340, 0, 724, 1500, 505, 5100, 724, 4000);
-INSERT INTO `mob_db` VALUES (1047, 'PECOPECO_EGG', 'PecoPeco Egg', 3, 420, 0, 4, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 0, 60, 128, 1000, 1001, 1, 1, 1010, 250, 935, 1500, 2102, 2, 501, 400, 501, 400, 713, 1800, 736, 10, 4007, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1048, '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, 128, 1000, 701, 1, 1, 1010, 300, 915, 5000, 2102, 2, 938, 600, 716, 100, 737, 10, 1002, 350, 4012, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1049, '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, 916, 6500, 949, 700, 2302, 150, 507, 550, 519, 300, 715, 50, 512, 0, 4008, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1050, 'PICKY_', 'Super 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, 916, 6500, 949, 700, 5015, 10, 507, 600, 519, 300, 715, 50, 10012, 10, 4011, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1051, '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, 955, 2500, 2304, 80, 507, 350, 909, 2000, 2303, 120, 1002, 350, 512, 0, 4016, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1052, '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, 940, 5000, 909, 5500, 2298, 4, 1402, 80, 520, 10, 752, 5, 703, 3, 4021, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1053, 'THIEF_BUG_', '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, 955, 3500, 910, 250, 1108, 15, 928, 200, 507, 400, 716, 50, 1002, 400, 4026, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1054, 'THIEF_BUG__', '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, 1011, 40, 928, 5500, 955, 1500, 1152, 10, 508, 90, 729, 5, 1116, 50, 4050, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1055, 'MUKA', 'Muka', 15, 570, 0, 72, 48, 1, 40, 49, 5, 5, 15, 15, 30, 5, 20, 10, 10, 12, 2, 3, 22, 129, 300, 1960, 960, 384, 993, 70, 952, 5500, 713, 2000, 511, 400, 507, 1000, 1451, 50, 1002, 350, 4036, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1056, '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, 945, 5500, 919, 5500, 516, 800, 2213, 2, 754, 2, 912, 6, 729, 3, 4044, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1057, '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, 942, 5500, 513, 1500, 508, 100, 919, 5000, 753, 5, 756, 24, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1058, '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, 990, 60, 940, 6500, 911, 400, 757, 49, 707, 20, 935, 3000, 512, 0, 4057, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1059, 'MISTRESS', 'Mistress', 74, 212000, 0, 39325, 27170, 1, 880, 1110, 40, 60, 50, 165, 60, 95, 70, 130, 10, 12, 0, 4, 84, 181, 100, 1148, 648, 300, 1413, 150, 518, 10000, 2249, 250, 616, 1000, 7018, 10, 985, 4400, 984, 3300, 4132, 1, 2569, 5000, 996, 1500, 526, 4000, 722, 3000);
-INSERT INTO `mob_db` VALUES (1060, '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, 948, 5500, 2289, 5, 919, 5000, 740, 80, 516, 1500, 518, 400, 756, 43, 4074, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1061, '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, 944, 5500, 510, 500, 2608, 2, 603, 30, 505, 100, 1261, 1, 984, 60, 4127, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1062, '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, 529, 2000, 530, 1000, 507, 1000, 512, 1000, 2236, 100, 741, 10, 512, 0, 4005, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1063, '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, 705, 6500, 949, 1000, 2262, 4, 1102, 100, 512, 600, 515, 1100, 622, 20, 4006, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1064, '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, 959, 5500, 932, 1500, 510, 80, 717, 120, 719, 10, 603, 2, 624, 20, 4067, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1065, 'STROUF', 'Strouf', 40, 9952, 0, 1238, 752, 1, 200, 350, 5, 50, 1, 40, 45, 72, 43, 65, 10, 12, 2, 5, 61, 133, 150, 1872, 672, 384, 951, 5500, 756, 115, 2241, 2, 1461, 2, 949, 3000, 720, 20, 956, 1500, 4111, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1066, '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, 991, 35, 960, 5500, 910, 3000, 2313, 5, 943, 100, 757, 34, 717, 50, 4049, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1067, '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, 991, 45, 961, 5500, 911, 800, 757, 53, 2106, 5, 943, 1000, 717, 100, 4061, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1068, '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, 1011, 25, 962, 5500, 938, 1500, 971, 20, 525, 5, 517, 700, 512, 0, 4035, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1069, 'SWORD_FISH', 'Swordfish', 30, 4299, 0, 529, 319, 1, 168, 199, 5, 20, 1, 30, 30, 41, 62, 30, 10, 12, 2, 5, 41, 133, 200, 1968, 768, 384, 995, 10, 963, 5500, 756, 33, 2257, 2, 757, 45, 1117, 25, 956, 600, 4089, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1070, '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, 991, 30, 955, 5500, 910, 400, 528, 500, 507, 650, 928, 450, 623, 20, 4027, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1071, 'PIRATE_SKEL', 'Pirate Skeleton', 25, 1676, 0, 233, 142, 1, 145, 178, 10, 15, 25, 13, 25, 5, 25, 10, 10, 12, 1, 1, 29, 133, 200, 1754, 554, 288, 932, 3000, 2287, 15, 1125, 25, 2211, 250, 1104, 250, 756, 43, 628, 20, 4073, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1072, 'KAHO', 'Kaho', 24, 1141, 0, 287, 176, 1, 128, 156, 0, 50, 1, 24, 24, 25, 44, 5, 10, 12, 1, 6, 83, 133, 200, 1700, 1000, 500, 994, 30, 1003, 100, 953, 3000, 911, 1000, 757, 10, 716, 100, 970, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1073, '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, 964, 5500, 960, 1500, 7049, 700, 1001, 13, 512, 0, 512, 0, 757, 37, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1074, '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, 965, 5500, 966, 1000, 7049, 500, 1056, 1000, 1001, 10, 512, 0, 757, 18, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1075, 'TURTLE', 'Turtle', 3, 77, 0, 0, 0, 1, 1, 2, 35, 0, 0, 0, 0, 0, 0, 0, 7, 12, 0, 5, 22, 129, 200, 500, 500, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1076, 'SKELETON', 'Skeleton', 10, 234, 0, 18, 14, 1, 39, 47, 10, 5, 1, 5, 10, 0, 12, 0, 10, 12, 1, 1, 29, 145, 200, 2228, 528, 576, 1010, 90, 932, 800, 1505, 80, 909, 3000, 507, 850, 2609, 30, 512, 0, 4025, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1077, '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, 133, 200, 1672, 672, 288, 7033, 5500, 2221, 20, 511, 550, 510, 50, 972, 30, 921, 1200, 912, 6, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1078, '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, 507, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 914, 500, 708, 50, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1079, '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, 510, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 522, 50, 514, 1000, 2270, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1080, '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, 511, 7000, 712, 1000, 621, 20, 905, 3000, 906, 1500, 704, 50, 521, 50, 2270, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1081, '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, 508, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 707, 5, 914, 500, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1082, '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, 509, 5500, 712, 1000, 631, 20, 905, 3000, 906, 1500, 521, 50, 703, 50, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1083, '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, 510, 5500, 508, 1000, 509, 1000, 710, 5, 608, 20, 518, 500, 607, 50, 714, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1084, '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, 970, 50, 971, 50, 630, 20, 949, 2000, 991, 800, 921, 5500, 921, 5500, 7033, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1085, '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, 970, 50, 972, 50, 630, 20, 949, 2000, 990, 1000, 921, 5500, 921, 5500, 7033, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1086, 'GOLDEN_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, 969, 1000, 1524, 150, 2246, 250, 10016, 500, 714, 300, 984, 2000, 985, 2000, 4128, 1, 25, 5000, 2610, 2000, 701, 1000, 512, 0);
-INSERT INTO `mob_db` VALUES (1087, '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, 181, 150, 1678, 780, 648, 968, 10000, 10018, 500, 1366, 150, 2106, 250, 1124, 10, 984, 3700, 985, 4700, 4143, 1, 4500, 5000, 725, 2000, 607, 1200, 999, 3400);
-INSERT INTO `mob_db` VALUES (1088, 'VOCAL', 'Vocal', 18, 3016, 0, 110, 88, 1, 71, 82, 10, 30, 77, 28, 26, 30, 53, 40, 10, 10, 1, 4, 22, 181, 200, 1080, 648, 480, 2247, 50, 940, 8000, 721, 1000, 752, 1500, 912, 700, 645, 3000, 532, 60, 4021, 60, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1089, 'TOAD', 'Toad', 10, 5065, 0, 100, 50, 1, 26, 32, 0, 0, 1, 5, 10, 10, 10, 25, 10, 10, 1, 5, 21, 181, 200, 1236, 336, 432, 2244, 50, 518, 2000, 729, 1000, 746, 1500, 970, 100, 971, 100, 512, 0, 4014, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1090, 'MASTERING', 'Mastering', 2, 2415, 0, 30, 10, 1, 18, 24, 0, 10, 1, 2, 2, 0, 17, 60, 10, 10, 1, 3, 21, 181, 300, 1072, 672, 480, 2257, 200, 619, 50, 722, 1000, 741, 1500, 512, 8000, 512, 8000, 531, 4000, 4001, 100, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1091, 'DRAGONFLY', 'Dragonfly', 8, 2400, 0, 88, 44, 1, 22, 27, 40, 0, 1, 20, 8, 15, 17, 5, 10, 10, 0, 4, 24, 181, 100, 1076, 576, 480, 2245, 200, 501, 8000, 719, 1500, 742, 2000, 2607, 200, 625, 50, 533, 3000, 4009, 40, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1092, 'VAGABOND_WOLF', 'Vagabond Wolf', 24, 12240, 0, 247, 176, 1, 135, 159, 10, 0, 57, 45, 48, 20, 50, 65, 10, 10, 1, 2, 22, 181, 150, 1048, 648, 432, 2248, 200, 920, 8000, 728, 1500, 919, 5500, 725, 11, 517, 8000, 626, 50, 4029, 40, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1093, 'ECLIPSE', 'Eclipse', 6, 1800, 0, 60, 55, 1, 20, 26, 0, 40, 1, 36, 6, 0, 11, 80, 10, 10, 0, 2, 60, 181, 200, 1456, 456, 336, 2250, 200, 515, 8000, 727, 1200, 746, 1500, 706, 30, 622, 50, 534, 5000, 4006, 70, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1094, '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, 991, 35, 946, 5500, 910, 1200, 935, 3000, 943, 2, 757, 14, 1002, 250, 4032, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1095, '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, 955, 5500, 910, 1000, 938, 500, 993, 40, 1001, 4, 1002, 450, 757, 28, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1096, 'ANGELING', 'Angeling', 20, 55000, 0, 163, 144, 1, 120, 195, 0, 70, 1, 50, 20, 75, 68, 200, 10, 10, 1, 8, 86, 181, 200, 1272, 672, 672, 2254, 100, 2324, 60, 610, 500, 2282, 1, 504, 1000, 512, 250, 714, 40, 4054, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1097, '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, 128, 1000, 1001, 1, 1, 1010, 320, 935, 2500, 909, 2000, 938, 650, 713, 2000, 1002, 300, 512, 0, 4013, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1098, 'ANUBIS', 'Anubis', 55, 12359, 0, 2906, 2700, 1, 688, 812, 0, 45, 1, 69, 55, 75, 95, 95, 10, 12, 1, 8, 26, 181, 200, 2000, 1000, 500, 2602, 5, 504, 600, 2601, 5, 1007, 15, 512, 0, 512, 0, 512, 0, 4138, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1099, 'ARGIOPE', 'Argiope', 41, 4382, 0, 1797, 849, 1, 395, 480, 30, 0, 1, 41, 31, 10, 56, 30, 10, 12, 2, 4, 25, 149, 300, 1792, 792, 336, 1042, 5500, 912, 1200, 757, 175, 2406, 5, 511, 1500, 719, 10, 512, 0, 4114, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1100, '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, 1025, 5500, 911, 1200, 1042, 500, 757, 61, 511, 670, 508, 250, 10017, 15, 4075, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1101, 'BAPHOMET_', 'Baphomet Jr.', 50, 8578, 0, 2706, 1480, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1102, 'BATHORY', 'Bathory', 44, 5415, 0, 2503, 1034, 1, 198, 398, 0, 60, 1, 76, 24, 85, 65, 15, 10, 12, 1, 7, 27, 149, 100, 1504, 840, 900, 1001, 200, 1061, 5500, 2252, 3, 1611, 5, 1000, 30, 1006, 15, 637, 20, 4119, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1103, '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, 1027, 5500, 2310, 5, 919, 5500, 1455, 10, 1405, 15, 1408, 20, 512, 0, 4063, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1104, '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, 1026, 5500, 2502, 20, 914, 3000, 919, 2500, 516, 500, 2402, 25, 512, 0, 4041, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1105, '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, 955, 6000, 910, 3000, 938, 1200, 990, 45, 1001, 8, 1002, 550, 757, 34, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1106, '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, 1253, 5, 7030, 5500, 2311, 1, 517, 1200, 920, 2000, 756, 53, 1217, 140, 4082, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1107, 'DESERT_WOLF_B', 'Desert Wolf Puppy', 9, 164, 0, 20, 16, 1, 30, 36, 0, 0, 1, 9, 9, 5, 21, 40, 10, 12, 0, 2, 23, 145, 300, 1600, 900, 240, 1010, 85, 919, 5500, 2306, 60, 517, 600, 2301, 200, 512, 0, 512, 0, 4023, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1108, '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, 995, 25, 1053, 5500, 1054, 1000, 5011, 2, 971, 100, 1256, 3, 756, 161, 4125, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1109, 'DEVIRUCHI', 'Deviruchi', 46, 7360, 0, 2662, 1278, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 1038, 5500, 1039, 400, 2255, 2, 1458, 2, 1009, 5, 912, 1500, 756, 154, 4122, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1110, '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, 1021, 5500, 757, 112, 1517, 2, 1613, 1, 969, 1, 1501, 300, 1005, 5, 4098, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1111, '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, 1011, 60, 913, 3000, 725, 20, 507, 1000, 7006, 5500, 7006, 1500, 756, 40, 4069, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1112, 'DRAKE', 'Drake', 70, 326666, 0, 28600, 22880, 1, 1800, 2100, 20, 35, 85, 80, 49, 75, 79, 50, 10, 12, 1, 1, 29, 181, 400, 620, 420, 360, 1127, 600, 1125, 950, 1135, 150, 1128, 400, 5019, 300, 985, 3200, 984, 2300, 4137, 1, 4300, 5000, 504, 5000, 719, 250, 512, 0);
-INSERT INTO `mob_db` VALUES (1113, '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, 909, 7500, 1602, 80, 938, 500, 512, 1100, 713, 1700, 741, 5, 620, 20, 4004, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1114, '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, 1057, 5500, 1058, 500, 2291, 4, 928, 2000, 1001, 10, 507, 1200, 512, 0, 4056, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1115, 'EDDGA', 'Eddga', 65, 152000, 0, 25025, 12870, 1, 1215, 1565, 15, 15, 78, 70, 85, 66, 90, 85, 10, 12, 2, 2, 23, 181, 300, 872, 1344, 432, 1133, 150, 2268, 250, 518, 10000, 1258, 500, 1030, 250, 985, 2300, 984, 1700, 4123, 1, 6179, 5000, 1029, 5000, 1030, 500, 994, 1350);
-INSERT INTO `mob_db` VALUES (1116, '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, 911, 1000, 5015, 20, 7032, 550, 507, 1000, 643, 300, 645, 250, 757, 57, 4070, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1117, '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, 149, 300, 2276, 576, 336, 2217, 10, 1615, 1, 2508, 2, 1551, 10, 610, 200, 609, 10, 509, 2000, 4141, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1118, '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, 1032, 5500, 2253, 3, 704, 10, 521, 50, 629, 20, 905, 2000, 748, 1, 4080, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1119, 'FRILLDORA', 'Frilldora', 30, 2023, 0, 529, 319, 1, 200, 239, 0, 10, 35, 30, 38, 15, 53, 30, 10, 12, 1, 2, 23, 145, 300, 1540, 720, 432, 1012, 5500, 757, 90, 903, 1500, 721, 15, 715, 200, 501, 800, 912, 120, 4088, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1120, 'GHOSTRING', 'Ghostring', 18, 73300, 0, 101, 108, 1, 82, 122, 0, 60, 40, 27, 18, 45, 72, 30, 10, 12, 1, 6, 88, 181, 300, 1220, 1080, 648, 1059, 5500, 2274, 100, 2336, 50, 604, 500, 603, 10, 714, 30, 2335, 150, 4047, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1121, '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, 997, 30, 1003, 150, 1040, 5500, 2286, 1, 2227, 10, 1001, 100, 512, 0, 4087, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1122, 'GOBLIN_1', 'Goblin', 25, 1176, 0, 310, 188, 1, 118, 140, 10, 5, 1, 53, 25, 20, 38, 10, 10, 12, 1, 7, 24, 149, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 501, 800, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1123, 'GOBLIN_2', '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, 998, 250, 911, 1000, 5010, 3, 1511, 10, 2104, 1, 501, 550, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1124, 'GOBLIN_3', '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, 998, 230, 911, 1000, 2275, 3, 512, 0, 2104, 1, 501, 550, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1125, 'GOBLIN_4', '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, 993, 100, 998, 170, 911, 800, 2263, 3, 1508, 10, 2104, 1, 501, 500, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1126, 'GOBLIN_5', '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, 998, 150, 911, 800, 1605, 15, 2104, 1, 508, 100, 501, 500, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1127, '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, 993, 120, 1055, 5500, 757, 70, 938, 3000, 1001, 30, 7021, 1, 632, 20, 4081, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1128, '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, 993, 80, 1011, 35, 947, 5500, 1452, 15, 935, 5500, 943, 70, 512, 0, 4045, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1129, '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, 953, 6500, 912, 500, 2279, 5, 1752, 10000, 757, 118, 633, 20, 970, 50, 4103, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1130, 'JAKK', 'Jakk', 38, 3581, 0, 1113, 688, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 1062, 5500, 912, 900, 985, 31, 2331, 5, 1008, 5, 535, 1000, 512, 0, 4109, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1131, 'JOKER', 'Joker', 57, 12450, 0, 3706, 2362, 1, 621, 738, 10, 35, 1, 143, 47, 75, 98, 175, 10, 12, 2, 7, 84, 149, 100, 1364, 864, 432, 912, 2000, 616, 2, 641, 20, 502, 1000, 1259, 1, 984, 100, 512, 0, 4139, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1132, 'KHALITZBURG', 'Khalitzburg', 63, 19276, 0, 4378, 2750, 1, 875, 1025, 45, 10, 58, 65, 48, 5, 73, 40, 10, 12, 2, 1, 29, 149, 350, 528, 1000, 396, 932, 8000, 985, 191, 5017, 1, 2108, 2, 1004, 10, 504, 1000, 1127, 2, 4136, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1133, 'KOBOLD_1', '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, 999, 100, 1034, 5500, 912, 700, 985, 25, 1220, 2, 2104, 5, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1134, 'KOBOLD_2', '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, 999, 100, 1034, 5500, 912, 200, 2104, 3, 502, 100, 2101, 100, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1135, 'KOBOLD_3', '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, 990, 35, 999, 100, 1034, 5500, 912, 200, 512, 0, 2104, 3, 502, 100, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1136, 'KOBOLD_4', '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, 999, 50, 1034, 5500, 912, 100, 1355, 5, 2104, 3, 502, 100, 1301, 150, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1137, 'KOBOLD_5', '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, 999, 40, 1034, 5500, 912, 100, 1514, 5, 2104, 3, 502, 100, 1501, 150, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1138, '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, 7031, 5500, 910, 800, 911, 100, 912, 10, 737, 20, 508, 250, 512, 0, 4076, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1139, '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, 993, 110, 1031, 5500, 911, 1400, 757, 70, 943, 250, 721, 10, 501, 650, 4079, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1140, '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, 994, 35, 1045, 4500, 1608, 10, 2617, 1, 1614, 3, 1006, 8, 642, 20, 4112, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1141, '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, 1052, 5000, 938, 1500, 991, 45, 995, 2, 717, 200, 631, 20, 512, 0, 4055, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1142, 'MARINE_SPHERE', 'Marine Sphere', 28, 3518, 0, 461, 284, 1, 120, 320, 0, 40, 1, 28, 28, 0, 33, 50, 10, 12, 0, 3, 21, 0, 800, 1201, 1, 1, 1050, 5500, 1051, 500, 1520, 10, 720, 10, 717, 150, 10003, 10, 512, 0, 4084, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1143, '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, 1060, 5500, 2294, 5, 2605, 1, 1008, 10, 1520, 15, 2407, 1, 656, 200, 4113, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1144, 'MARSE', 'Mars', 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, 1024, 5500, 962, 3000, 717, 200, 720, 10, 995, 12, 1007, 5, 656, 200, 4095, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1145, '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, 1017, 6500, 1018, 500, 1251, 10, 2225, 5, 5009, 1, 10010, 10, 2224, 15, 4046, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1146, '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, 2618, 10, 528, 5000, 919, 5500, 537, 400, 757, 100, 656, 200, 512, 0, 4097, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1147, 'MAYA', 'Maya', 81, 169000, 0, 42900, 17875, 1, 1800, 2070, 60, 25, 95, 97, 76, 95, 82, 105, 10, 12, 2, 4, 82, 181, 100, 864, 1000, 480, 10006, 500, 2615, 200, 2234, 200, 639, 500, 7020, 10, 985, 3500, 984, 2500, 4146, 1, 10500, 5000, 730, 2000, 603, 3000, 617, 2000);
-INSERT INTO `mob_db` VALUES (1148, 'MEDUSA', 'Medusa', 79, 22408, 0, 6876, 4697, 1, 827, 1100, 48, 38, 1, 74, 50, 57, 77, 69, 10, 12, 1, 6, 40, 149, 180, 2000, 1000, 500, 1048, 6000, 522, 2500, 702, 200, 2610, 150, 722, 250, 7062, 3500, 1007, 3, 4124, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1149, '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, 941, 5500, 756, 196, 1361, 2, 1005, 10, 516, 1500, 1301, 200, 657, 150, 4126, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1150, 'MOONLIGHT', 'Moonlight', 67, 120000, 0, 27500, 14300, 1, 1200, 1700, 10, 55, 55, 99, 55, 82, 95, 120, 10, 10, 1, 6, 63, 181, 150, 1276, 576, 288, 5008, 1000, 1234, 100, 1525, 150, 10008, 500, 985, 2600, 984, 1900, 638, 500, 4131, 1, 1250, 0, 1022, 5000, 504, 750, 728, 210);
-INSERT INTO `mob_db` VALUES (1151, 'MYST', 'Myst', 38, 3745, 0, 1391, 688, 1, 365, 445, 0, 40, 1, 38, 18, 0, 53, 10, 10, 12, 2, 0, 25, 149, 200, 1576, 576, 384, 5005, 2, 1019, 800, 10005, 10, 756, 65, 757, 97, 605, 20, 512, 0, 4108, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1152, '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, 133, 200, 2420, 720, 648, 922, 5500, 932, 3500, 757, 80, 2299, 2, 1358, 10, 506, 50, 512, 0, 4085, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1153, '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, 133, 400, 2852, 1152, 840, 1043, 5500, 938, 3000, 714, 1, 512, 0, 512, 0, 512, 0, 512, 0, 4071, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1154, '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, 7110, 4500, 7121, 2500, 757, 20, 1105, 500, 1217, 150, 512, 0, 512, 0, 4099, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1155, 'PETIT', 'Petit', 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, 1035, 5500, 1037, 300, 756, 140, 509, 1000, 1510, 150, 912, 1500, 606, 15, 4118, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1156, 'PETIT_', 'Sky Petit', 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, 1036, 5500, 1037, 300, 985, 61, 509, 1000, 602, 500, 912, 1500, 606, 15, 4120, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1157, 'PHARAOH', 'Pharaoh', 93, 445997, 0, 114990, 41899, 1, 2267, 3015, 67, 70, 1, 93, 100, 104, 89, 112, 10, 12, 2, 7, 67, 181, 125, 2000, 1000, 500, 7113, 6000, 7114, 2500, 1136, 100, 2327, 150, 5002, 500, 1552, 300, 984, 4500, 4148, 1, 1, 5000, 1009, 5500, 526, 2250, 732, 1125);
-INSERT INTO `mob_db` VALUES (1158, '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, 1023, 5500, 963, 2000, 720, 5, 517, 1000, 951, 500, 756, 25, 512, 0, 4077, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1159, 'PHREEONI', 'Phreeoni', 69, 188000, 0, 32175, 16445, 1, 880, 1530, 10, 20, 1, 85, 78, 35, 130, 60, 10, 10, 2, 2, 60, 181, 200, 1020, 1020, 288, 1015, 10000, 1223, 500, 1236, 150, 1014, 5000, 2288, 300, 985, 2900, 984, 2100, 4121, 1, 2700, 0, 1008, 500, 730, 2000, 1000, 3400);
-INSERT INTO `mob_db` VALUES (1160, '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, 955, 5700, 910, 1100, 938, 600, 992, 15, 1001, 5, 1002, 500, 757, 31, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1161, '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, 1052, 5500, 910, 300, 938, 700, 970, 2, 713, 1000, 630, 20, 645, 50, 4024, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1162, 'RAFFLESIA', 'Rafflesia', 27, 1950, 0, 388, 242, 1, 105, 120, 20, 10, 1, 27, 54, 1, 76, 27, 10, 10, 0, 3, 22, 133, 200, 1000, 2652, 1056, 1033, 5500, 911, 1600, 706, 2, 708, 10, 703, 10, 711, 550, 509, 30, 4083, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1163, '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, 985, 106, 2266, 1, 2315, 2, 1158, 2, 1116, 100, 1004, 10, 7054, 5500, 4133, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1164, 'REQUIEM', 'Requiem', 35, 3089, 0, 800, 458, 1, 220, 272, 0, 15, 1, 53, 35, 5, 57, 2, 10, 12, 1, 7, 27, 133, 400, 1516, 816, 432, 603, 35, 714, 1, 912, 2500, 958, 3500, 934, 1500, 2308, 10, 512, 0, 4104, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1165, 'SAND_MAN', 'Sandman', 34, 3413, 0, 810, 492, 1, 180, 205, 10, 25, 24, 34, 58, 38, 60, 5, 10, 12, 1, 0, 62, 133, 250, 1672, 720, 288, 997, 35, 1056, 5500, 757, 118, 7043, 200, 1001, 200, 1257, 2, 728, 2, 4101, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1166, '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, 1028, 5500, 656, 150, 702, 2, 2276, 1, 605, 10, 757, 70, 526, 2, 4078, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1167, '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, 919, 5500, 1302, 100, 517, 500, 1750, 1000, 949, 850, 1010, 80, 627, 20, 4017, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1168, '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, 994, 45, 1046, 5500, 1005, 15, 904, 5000, 943, 3000, 504, 700, 512, 0, 4130, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1169, 'SKEL_WORKER', 'Skeleton Worker', 30, 2872, 0, 397, 240, 1, 242, 288, 0, 15, 1, 15, 30, 5, 42, 10, 10, 12, 1, 1, 29, 133, 400, 2420, 720, 384, 998, 400, 1041, 5500, 757, 90, 5009, 2, 999, 100, 1003, 200, 1002, 800, 4092, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1170, '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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1171, '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, 1014, 2700, 911, 800, 757, 10, 1111, 15, 1001, 30, 943, 150, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1172, '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, 1014, 5500, 911, 2000, 757, 15, 1111, 20, 943, 270, 1001, 50, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1173, '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, 1014, 3100, 911, 800, 911, 10, 1114, 15, 1001, 35, 943, 200, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1174, '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, 992, 60, 1011, 30, 1013, 5500, 910, 2100, 757, 25, 943, 10, 1002, 400, 4039, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1175, '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, 1016, 5500, 919, 3000, 949, 800, 528, 1000, 701, 1, 512, 0, 512, 0, 4028, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1176, '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, 993, 90, 955, 5000, 911, 200, 518, 350, 518, 350, 526, 200, 756, 26, 4053, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1177, '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, 1044, 5500, 756, 70, 938, 2500, 1006, 5, 503, 50, 640, 20, 512, 0, 4096, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1178, 'ZEROM', 'Zerom', 23, 1109, 0, 240, 149, 1, 127, 155, 0, 10, 1, 23, 23, 5, 42, 0, 10, 12, 1, 7, 23, 133, 200, 1780, 1080, 432, 1011, 55, 998, 190, 2339, 200, 2265, 3, 2408, 10, 1002, 400, 1002, 400, 4064, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1179, '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, 1001, 150, 1059, 5500, 2282, 1, 2333, 10, 512, 0, 512, 0, 512, 0, 4102, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1180, '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, 149, 150, 840, 540, 480, 1022, 5500, 919, 7000, 603, 100, 604, 100, 526, 250, 525, 350, 756, 100, 746, 200, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1181, 'ZOMBIE_DRAGON', 'Zombie Dragon', 1, 1000, 0, 49500, 1650, 9, 7900, 9140, 0, 0, 120, 145, 145, 145, 130, 120, 10, 12, 2, 9, 89, 181, 400, 2700, 1000, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1182, '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, 1069, 1500, 1070, 3000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1183, 'CHONCHON_', 'Angry ChonChon', 4, 67, 0, 5, 4, 1, 10, 13, 10, 0, 1, 10, 4, 5, 12, 2, 10, 12, 0, 4, 24, 149, 200, 1076, 576, 480, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1184, 'FABRE_', 'Angry Fabre', 1, 30, 0, 1, 0, 1, 4, 7, 0, 0, 1, 2, 1, 1, 4, 5, 10, 12, 0, 4, 22, 133, 400, 1672, 672, 480, 914, 2000, 949, 250, 1502, 80, 721, 2, 511, 350, 705, 500, 1501, 200, 4002, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1185, '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, 1001, 10, 1059, 100, 2282, 0, 2333, 1, 512, 0, 512, 0, 512, 0, 4102, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1186, 'WHISPER_BOSS', 'Giant Whisper', 34, 5040, 0, 537, 545, 1, 198, 239, 0, 45, 1, 51, 14, 0, 60, 0, 10, 12, 0, 6, 48, 149, 250, 2536, 1536, 672, 1001, 150, 1059, 5500, 2282, 1, 2333, 10, 512, 0, 512, 0, 512, 0, 4102, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1187, '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, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1188, 'BON_GUN', 'Bon Gun', 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, 1094, 5500, 7014, 40, 618, 60, 2337, 2, 609, 15, 508, 1000, 502, 250, 5046, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1189, '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, 1063, 5500, 1753, 1000, 1756, 2500, 1755, 2500, 1716, 2, 501, 1400, 509, 900, 2330, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1190, '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, 181, 100, 1248, 500, 360, 1363, 200, 2601, 500, 5007, 150, 2627, 1000, 512, 0, 985, 4400, 984, 3100, 512, 0, 12800, 5000, 968, 5500, 617, 900, 512, 0);
-INSERT INTO `mob_db` VALUES (1191, '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, 617, 5, 603, 45, 1065, 1200, 611, 3000, 714, 3, 2626, 1, 757, 270, 2205, 120, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1192, 'WRAITH', 'Wraith', 53, 10999, 0, 2199, 1099, 1, 580, 760, 5, 30, 1, 95, 30, 75, 95, 35, 10, 12, 2, 1, 89, 149, 300, 1816, 576, 240, 1059, 6500, 2206, 10, 2506, 2, 716, 650, 602, 1300, 2505, 10, 731, 5, 735, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1193, 'ALARM', 'Alarm', 58, 10647, 0, 3987, 2300, 1, 480, 600, 15, 15, 1, 62, 72, 10, 85, 45, 10, 12, 1, 0, 60, 149, 300, 1020, 500, 768, 1095, 5500, 2607, 20, 7005, 1500, 611, 1300, 984, 105, 7026, 20, 912, 1500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1194, 'ARCLOUSE', 'Arclouse', 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, 1096, 3500, 938, 3000, 943, 800, 912, 450, 716, 300, 997, 20, 912, 2500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1195, 'RIDEWORD', 'Rideword', 59, 11638, 0, 2007, 3106, 1, 584, 804, 5, 35, 48, 75, 10, 20, 120, 45, 10, 12, 0, 0, 60, 149, 150, 864, 500, 192, 1097, 5500, 1553, 4, 1554, 4, 1555, 3, 1556, 2, 7015, 300, 1006, 20, 722, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1196, 'SKEL_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, 1098, 3500, 7016, 100, 2320, 1, 716, 600, 930, 3500, 2408, 35, 934, 1500, 2282, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1197, '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, 1099, 3500, 7016, 105, 2266, 1, 716, 600, 930, 3500, 2408, 3, 985, 112, 1093, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1198, '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, 149, 200, 1500, 500, 1000, 1557, 2, 2608, 30, 505, 100, 716, 450, 1009, 50, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1199, '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, 7001, 5500, 715, 800, 1001, 300, 1061, 1000, 1057, 3000, 601, 1100, 10004, 10, 2502, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1200, 'ZHERLTHSH', 'Zherlthsh', 63, 18300, 0, 3608, 2304, 1, 700, 850, 10, 15, 70, 85, 40, 30, 125, 60, 10, 12, 1, 7, 60, 141, 200, 800, 792, 384, 7017, 5, 504, 800, 503, 1200, 2331, 8, 2622, 1, 984, 134, 2291, 3, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1201, 'RYBIO', 'Rybio', 71, 9572, 0, 6317, 3520, 1, 686, 912, 45, 37, 1, 97, 75, 74, 77, 90, 10, 12, 2, 6, 40, 149, 200, 1500, 500, 1000, 1015, 4000, 7017, 3, 504, 800, 731, 30, 1008, 10, 984, 100, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1202, 'PHENDARK', 'Phendark', 73, 22729, 0, 6826, 3443, 1, 794, 1056, 52, 36, 1, 62, 120, 65, 77, 66, 10, 12, 2, 7, 40, 149, 175, 1500, 500, 1000, 1015, 4000, 7017, 4, 504, 800, 512, 0, 984, 150, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1203, 'MYSTELTAINN', 'Mysteltainn', 76, 33350, 0, 6457, 5159, 2, 1160, 1440, 30, 30, 77, 139, 80, 35, 159, 65, 10, 12, 2, 0, 87, 181, 250, 1152, 500, 240, 7019, 1, 1117, 100, 1152, 70, 1155, 40, 1163, 2, 999, 120, 984, 243, 985, 210, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1204, 'TIRFING', 'Tyrfing', 71, 29900, 0, 5412, 4235, 1, 950, 1146, 30, 35, 58, 87, 55, 35, 132, 65, 10, 12, 1, 0, 67, 181, 100, 816, 500, 240, 7022, 1, 638, 50, 1211, 100, 1214, 70, 1217, 40, 999, 120, 984, 189, 1157, 25, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1205, 'EXECUTIONER', 'Executioner', 65, 28980, 0, 4730, 3536, 2, 570, 950, 35, 35, 64, 85, 40, 25, 88, 60, 10, 12, 2, 0, 47, 181, 200, 768, 500, 384, 7024, 5, 1108, 100, 1111, 80, 1114, 60, 1125, 40, 999, 120, 984, 145, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1206, 'ANOLIAN', 'Anolian', 63, 18960, 0, 4378, 2907, 1, 640, 760, 15, 15, 1, 43, 58, 25, 97, 65, 10, 12, 1, 5, 41, 149, 200, 900, 500, 864, 7003, 5500, 1754, 2000, 504, 650, 10019, 10, 943, 5500, 2625, 1, 984, 134, 526, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1207, 'STING', 'Sting', 61, 9500, 0, 4081, 2970, 1, 850, 1032, 5, 30, 57, 45, 55, 5, 120, 85, 10, 12, 1, 0, 62, 149, 300, 528, 500, 240, 7004, 5500, 1756, 1500, 2624, 2, 1003, 130, 997, 25, 10007, 10, 2209, 350, 719, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1208, 'WANDER_MAN', 'Wanderer', 74, 8170, 0, 5786, 4730, 2, 450, 550, 5, 5, 1, 192, 38, 45, 127, 85, 10, 12, 1, 6, 24, 149, 100, 672, 500, 192, 7005, 5500, 616, 1, 1164, 1, 2270, 5, 610, 650, 984, 217, 608, 3, 732, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1209, '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, 7007, 5500, 528, 1000, 726, 80, 746, 110, 657, 150, 510, 70, 984, 95, 4028, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1210, '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, 7008, 5500, 947, 8000, 943, 4000, 993, 200, 1451, 40, 757, 18, 509, 1600, 4045, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1211, '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, 7009, 5500, 992, 200, 912, 1200, 602, 1000, 757, 220, 610, 250, 509, 1600, 4039, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1212, '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, 7010, 5500, 757, 229, 757, 22, 1002, 850, 999, 180, 998, 300, 512, 0, 4068, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1213, '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, 149, 150, 1500, 500, 1000, 7002, 2500, 1304, 10, 999, 90, 931, 7500, 912, 1300, 756, 196, 502, 900, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1214, '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, 7011, 5500, 942, 7000, 985, 53, 513, 5000, 634, 20, 532, 1000, 607, 25, 4051, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1215, '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, 7012, 5500, 509, 1800, 912, 1200, 756, 115, 997, 5, 1454, 20, 608, 45, 4034, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1216, 'PENOMENA', 'Penomena', 57, 7256, 0, 2870, 2200, 7, 415, 565, 5, 50, 1, 5, 35, 15, 136, 30, 10, 12, 1, 5, 25, 149, 400, 832, 500, 600, 7013, 5500, 962, 8000, 938, 7000, 525, 200, 719, 15, 1258, 1, 716, 550, 4035, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1219, 'KNIGHT_OF_ABYSS', 'Abyss Knight', 79, 36140, 0, 8469, 6268, 1, 1600, 2150, 55, 50, 66, 68, 64, 25, 135, 50, 10, 12, 2, 7, 87, 149, 300, 1500, 500, 1000, 1064, 5500, 7023, 5, 2318, 1, 1410, 25, 1162, 1, 985, 369, 984, 259, 1162, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1220, 'M_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, 181, 200, 1120, 420, 288, 1253, 5, 7030, 5500, 2311, 1, 517, 1200, 920, 2000, 756, 53, 1217, 140, 4082, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1221, 'M_SAVAGE', 'Savage', 26, 2092, 0, 357, 226, 1, 146, 177, 10, 5, 1, 26, 54, 10, 37, 10, 10, 12, 2, 2, 42, 181, 150, 1960, 960, 384, 1028, 6000, 656, 150, 702, 3, 2276, 2, 605, 15, 757, 70, 512, 0, 4078, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1222, 'L_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, 181, 200, 1500, 500, 1000, 7002, 2500, 1304, 10, 999, 120, 931, 8000, 912, 1600, 756, 196, 502, 1100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1223, 'L_ORC', 'Orc', 24, 1400, 0, 261, 160, 1, 114, 136, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 181, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1224, 'L_POISON_SPORE', 'Poison Spore', 19, 665, 0, 169, 85, 1, 89, 101, 0, 0, 1, 19, 25, 0, 24, 0, 10, 12, 1, 3, 25, 181, 200, 1672, 672, 288, 921, 8000, 2221, 20, 511, 650, 510, 55, 972, 35, 512, 0, 512, 0, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1225, 'L_CHOCO', 'Choco', 43, 4278, 0, 1150, 1150, 1, 315, 402, 5, 5, 1, 68, 55, 45, 65, 25, 10, 12, 0, 2, 23, 181, 200, 1500, 500, 1000, 7011, 5500, 942, 7000, 508, 1900, 513, 5000, 2311, 2, 532, 1000, 607, 25, 4051, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1226, 'L_KOBOLD', 'Kobold', 36, 3893, 0, 898, 568, 1, 265, 318, 15, 10, 1, 90, 36, 30, 52, 30, 10, 12, 1, 7, 44, 181, 200, 1028, 528, 360, 999, 90, 1034, 6000, 912, 750, 985, 25, 1220, 2, 2104, 5, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1227, 'L_GOBLIN', 'Goblin', 25, 1176, 0, 282, 171, 1, 118, 140, 10, 5, 1, 63, 25, 20, 38, 45, 10, 12, 1, 7, 24, 181, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 501, 800, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1228, 'L_PHEN', 'Phen', 26, 3347, 0, 357, 226, 1, 138, 150, 0, 15, 1, 26, 26, 0, 88, 75, 10, 12, 1, 5, 41, 181, 150, 2544, 1344, 1152, 1023, 6000, 963, 2300, 720, 8, 517, 1100, 951, 550, 756, 25, 512, 0, 4077, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1229, 'META_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, 914, 6500, 949, 600, 1502, 80, 721, 8, 511, 750, 705, 1500, 1501, 200, 4002, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1230, 'META_PUPA', 'Pupa', 2, 427, 0, 2, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 4, 22, 128, 1000, 1001, 1, 1, 1010, 300, 915, 6000, 938, 700, 2102, 2, 935, 1300, 938, 700, 1002, 400, 4003, 7, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1231, 'META_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, 924, 6000, 2322, 10, 518, 180, 602, 200, 2207, 4, 712, 800, 512, 0, 4040, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1232, 'META_PECOPECO_EGG', 'PecoPeco Egg', 3, 420, 0, 4, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 0, 60, 128, 1000, 1001, 1, 1, 1010, 120, 935, 1500, 2102, 2, 501, 450, 501, 450, 713, 2000, 736, 15, 4007, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1233, 'CONCEIVE_PECOPECO', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 6000, 2402, 20, 508, 55, 507, 950, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1234, 'PROVOKE_YOYO', 'Yoyo', 19, 879, 0, 135, 85, 1, 71, 82, 0, 0, 1, 24, 30, 35, 32, 55, 10, 12, 0, 2, 22, 139, 200, 1054, 54, 384, 942, 6000, 513, 2000, 508, 130, 919, 5500, 753, 7, 512, 0, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1235, '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, 141, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1236, 'META_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, 128, 1000, 1001, 1, 1, 1010, 135, 935, 2740, 909, 3000, 938, 750, 713, 2000, 1002, 320, 512, 0, 4013, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1237, 'META_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, 576, 955, 6000, 910, 3000, 938, 1000, 935, 3000, 1001, 6, 1002, 450, 757, 28, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1238, 'META_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, 955, 5700, 910, 1100, 938, 600, 992, 15, 1001, 5, 1002, 500, 757, 31, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1239, 'META_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, 955, 6000, 910, 3000, 938, 1200, 990, 45, 1001, 8, 1002, 550, 757, 34, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1240, 'META_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, 916, 6500, 949, 850, 2302, 150, 507, 650, 519, 350, 715, 60, 512, 0, 4008, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1241, 'META_PICKY_', 'Super 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, 916, 6500, 949, 850, 5015, 7, 507, 750, 519, 350, 715, 60, 512, 0, 4011, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1242, '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, 910, 3200, 938, 1500, 512, 50, 720, 40, 510, 75, 529, 350, 5035, 1, 4001, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1243, 'SASQUATCH', 'Sasquatch', 30, 3163, 0, 529, 319, 1, 250, 280, 5, 0, 75, 25, 60, 10, 34, 20, 10, 12, 2, 2, 60, 149, 300, 1260, 192, 192, 912, 750, 509, 800, 949, 1000, 5030, 1, 948, 5000, 727, 30, 757, 90, 4074, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1244, 'JAKK_XMAS', 'Christmas Jakk', 38, 3581, 0, 1113, 688, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 1062, 5500, 912, 900, 985, 31, 2331, 5, 1008, 5, 535, 1000, 2236, 70, 4109, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1245, 'GOBLINE_XMAS', 'Christmas Goblin', 25, 1176, 0, 282, 171, 1, 118, 140, 10, 5, 1, 53, 25, 20, 38, 45, 10, 12, 1, 7, 24, 149, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 2236, 40, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1246, 'COOKIE_XMAS', '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, 538, 1500, 722, 45, 912, 200, 2502, 25, 2501, 120, 507, 1100, 501, 700, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1247, '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, 7034, 10000, 644, 200, 538, 1500, 539, 1000, 529, 5500, 530, 500, 2236, 250, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1248, 'CRUISER', 'Cruiser', 35, 2820, 0, 1100, 450, 7, 175, 215, 5, 5, 1, 40, 10, 10, 90, 25, 10, 12, 1, 0, 60, 149, 400, 1296, 1296, 432, 1098, 900, 2251, 2, 998, 320, 996, 5, 911, 3500, 719, 35, 756, 87, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1249, 'MYSTCASE', '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, 530, 90, 912, 1500, 603, 20, 539, 800, 722, 150, 731, 5, 512, 100, 529, 340, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1250, 'CHEPET', 'Chepet', 42, 4950, 0, 1518, 946, 1, 380, 440, 0, 25, 1, 72, 35, 71, 65, 85, 10, 12, 1, 7, 23, 149, 400, 672, 672, 288, 7035, 2500, 912, 750, 512, 5500, 619, 40, 10019, 5, 502, 300, 2508, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1251, '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, 181, 200, 468, 468, 288, 1468, 150, 603, 3000, 617, 4000, 2621, 200, 2506, 500, 985, 4700, 984, 3500, 5007, 1, 1, 5000, 720, 4500, 2406, 270, 995, 3000);
-INSERT INTO `mob_db` VALUES (1252, 'GARM', 'Garm', 73, 197000, 0, 50050, 20020, 3, 1700, 1900, 40, 45, 85, 126, 82, 65, 95, 60, 10, 12, 2, 2, 81, 181, 400, 608, 408, 336, 7036, 5500, 1131, 150, 1256, 500, 512, 0, 512, 0, 985, 4100, 984, 2900, 512, 0, 28473, 5000, 7036, 1000, 603, 3000, 995, 3000);
-INSERT INTO `mob_db` VALUES (1253, '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, 912, 4000, 1039, 500, 512, 0, 512, 0, 2619, 1, 1769, 2000, 757, 238, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1254, 'RAGGLER', 'Raggler', 21, 1020, 0, 218, 140, 1, 102, 113, 0, 5, 18, 10, 32, 20, 39, 35, 10, 12, 0, 2, 24, 149, 200, 1000, 900, 384, 7053, 3000, 916, 5000, 645, 200, 656, 100, 992, 90, 2225, 7, 756, 32, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1255, 'NERAID', 'Neraid', 40, 4120, 0, 1126, 684, 1, 325, 360, 0, 10, 1, 45, 50, 5, 64, 5, 10, 12, 0, 2, 22, 149, 200, 776, 576, 288, 1055, 5500, 7053, 1000, 510, 230, 717, 250, 656, 250, 757, 180, 985, 37, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1256, 'PEST', 'Pest', 40, 3240, 0, 1238, 752, 1, 375, 450, 0, 5, 1, 60, 22, 5, 80, 5, 10, 12, 0, 2, 47, 149, 200, 700, 648, 480, 1055, 5500, 7054, 200, 702, 10, 605, 60, 716, 230, 512, 0, 756, 115, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1257, 'INJUSTICE', 'Injustice', 51, 7600, 0, 2118, 1488, 1, 480, 600, 0, 0, 84, 42, 39, 0, 71, 35, 10, 12, 1, 1, 47, 149, 400, 770, 720, 336, 999, 300, 7054, 5500, 7053, 3500, 2313, 5, 2316, 2, 512, 0, 1255, 2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1258, '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, 2297, 3, 998, 250, 911, 1000, 1765, 3000, 501, 600, 1705, 25, 656, 150, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1259, 'GRYPHON', 'Gryphon', 72, 27800, 0, 5896, 4400, 1, 880, 1260, 35, 35, 68, 95, 78, 65, 115, 75, 10, 12, 2, 2, 84, 181, 100, 704, 504, 432, 7048, 2500, 7054, 5500, 7063, 120, 1452, 1500, 757, 150, 984, 185, 996, 150, 1417, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1260, '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, 149, 200, 920, 720, 200, 7054, 5500, 734, 1000, 2505, 30, 512, 0, 512, 0, 1000, 80, 747, 3, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1261, '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, 7053, 6000, 748, 50, 5037, 120, 1767, 3000, 624, 35, 528, 600, 2244, 2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1262, 'MUTANT_DRAGON', 'Mutant Dragon', 65, 62600, 0, 4730, 3536, 4, 2400, 3400, 15, 20, 75, 47, 30, 68, 45, 35, 10, 12, 2, 9, 43, 181, 250, 1280, 1080, 240, 7054, 5500, 1035, 500, 1036, 500, 930, 500, 2627, 30, 522, 150, 505, 150, 504, 250, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1263, '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, 149, 150, 1056, 1056, 336, 912, 5000, 932, 6000, 7005, 500, 1610, 25, 1611, 8, 996, 100, 1615, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1264, 'MERMAN', 'Merman', 53, 12300, 0, 3345, 2054, 2, 482, 603, 10, 35, 72, 45, 46, 15, 85, 55, 10, 12, 1, 7, 41, 149, 200, 916, 816, 336, 1054, 1300, 523, 300, 657, 200, 720, 40, 995, 35, 1460, 3, 756, 203, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1265, 'COOKIE', 'Cookie', 25, 950, 0, 310, 188, 1, 130, 153, 0, 25, 1, 35, 20, 53, 37, 90, 10, 12, 0, 7, 60, 145, 200, 1036, 936, 240, 538, 1000, 530, 150, 979, 1, 645, 280, 2402, 30, 1001, 40, 2502, 20, 529, 320, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1266, '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, 938, 500, 7013, 40, 1052, 1200, 508, 200, 912, 60, 512, 100, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1267, 'CARAT', 'Carat', 51, 5200, 0, 1926, 1353, 1, 330, 417, 0, 25, 1, 41, 45, 5, 85, 155, 10, 12, 1, 6, 44, 149, 200, 1078, 768, 384, 7054, 3200, 536, 1000, 2409, 5, 5003, 1, 512, 0, 512, 0, 504, 450, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1268, 'BLOODY_KNIGHT', 'Blood Knight', 82, 57870, 0, 10120, 6820, 3, 2150, 3030, 60, 50, 88, 75, 70, 77, 125, 55, 10, 12, 2, 0, 87, 149, 250, 828, 528, 192, 7054, 5500, 2229, 45, 2317, 5, 2106, 65, 1170, 1, 984, 304, 985, 433, 1417, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1269, '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, 1095, 5500, 1019, 800, 504, 900, 657, 220, 7026, 30, 7027, 30, 985, 163, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1270, 'C_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, 1095, 5500, 7054, 5500, 999, 500, 520, 850, 2109, 1, 7026, 2000, 7027, 2000, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1271, '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, 912, 1000, 1099, 600, 7003, 2000, 608, 50, 512, 0, 512, 0, 756, 129, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1272, '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, 181, 100, 868, 768, 480, 1615, 800, 5017, 500, 1237, 300, 2334, 300, 2507, 100, 985, 5300, 984, 4100, 2609, 140, 1, 5000, 7005, 6000, 512, 0, 617, 2000);
-INSERT INTO `mob_db` VALUES (1273, '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, 149, 200, 1050, 900, 288, 7053, 5500, 998, 300, 2602, 1, 756, 40, 1352, 10, 508, 900, 2338, 1, 2206, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1274, '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, 912, 100, 7049, 1000, 617, 1, 512, 0, 512, 0, 985, 61, 757, 207, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1275, '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, 1152, 1152, 480, 7047, 2500, 637, 40, 2407, 3, 739, 30, 512, 100, 503, 400, 2215, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1276, '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, 7054, 5500, 512, 0, 2315, 2, 1701, 150, 1764, 2000, 1715, 3, 985, 106, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1277, '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, 7054, 2000, 1019, 2000, 1501, 100, 512, 0, 2272, 1, 503, 150, 609, 35, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1278, 'STALACTIC_GOLEM', 'Stalactite Golem', 60, 18700, 0, 3872, 2695, 1, 950, 1130, 50, 5, 73, 45, 85, 5, 75, 25, 10, 12, 2, 0, 80, 145, 200, 1264, 864, 288, 7004, 2000, 7054, 5500, 1000, 250, 997, 30, 512, 0, 757, 250, 985, 163, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1279, '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, 149, 200, 860, 660, 624, 7053, 100, 943, 380, 606, 200, 993, 160, 1001, 140, 512, 0, 757, 106, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1280, 'STEAM_GOBLIN', 'Steam Goblin', 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, 911, 2500, 7053, 4000, 998, 300, 999, 55, 1003, 320, 1003, 320, 757, 124, 744, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1281, 'SAGEWORM', 'Sageworm', 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, 912, 1200, 1097, 1000, 1055, 3000, 2241, 5, 505, 40, 512, 1000, 5012, 1, 1550, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1282, '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, 912, 250, 999, 60, 1034, 5000, 512, 0, 1763, 2000, 1711, 5, 756, 79, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1283, 'CHIMERA', 'Chimera', 70, 32600, 0, 4950, 3000, 1, 1200, 1320, 30, 10, 1, 72, 110, 88, 75, 85, 10, 12, 2, 2, 63, 181, 200, 772, 672, 360, 7054, 5500, 1048, 2500, 657, 500, 1306, 1, 504, 560, 1364, 1, 984, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1284, 'HUGELING', 'Hugeling', 1, 5000, 0, 2, 1, 4, 7, 10, 0, 0, 1, 1, 1, 1, 6, 0, 10, 12, 2, 3, 21, 145, 200, 1872, 672, 480, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1285, 'ARCHER_GUARDIAN', 'Guardian Archer', 74, 28634, 0, 1, 1, 12, 1120, 1600, 35, 60, 95, 80, 80, 90, 165, 55, 14, 16, 2, 7, 80, 133, 265, 1200, 1200, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1286, 'KNIGHT_GUARDIAN', 'Guardian Knight', 86, 30214, 0, 1, 1, 2, 1280, 1560, 55, 30, 110, 40, 140, 65, 125, 65, 14, 16, 2, 7, 80, 133, 275, 1200, 1200, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1287, 'SOLDIER_GUARDIAN', 'Guardian Soldier', 56, 15670, 0, 1, 1, 1, 873, 1036, 35, 0, 85, 56, 100, 45, 103, 43, 10, 12, 0, 4, 22, 133, 265, 1288, 288, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1288, 'EMPERIUM', 'Emperium', 90, 68430, 0, 109, 71, 1, 60, 71, 40, 50, 1, 17, 80, 50, 26, 20, 10, 12, 0, 4, 22, 0, 300, 1288, 288, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1289, 'MAYA_PURPLE', 'Maya Purple', 81, 54331, 0, 10496, 3893, 2, 1446, 1999, 68, 48, 95, 90, 80, 95, 90, 119, 10, 12, 2, 4, 82, 181, 100, 1024, 1000, 480, 7053, 4550, 757, 250, 756, 300, 969, 100, 984, 150, 985, 100, 639, 50, 10006, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1290, 'SKELETON_GENERAL', 'Skeleton General', 73, 17043, 0, 8170, 3370, 1, 910, 1089, 25, 25, 90, 25, 40, 20, 77, 25, 10, 12, 1, 1, 29, 149, 150, 2276, 576, 432, 7068, 2550, 756, 160, 503, 800, 1220, 35, 1219, 80, 1222, 3, 512, 0, 2274, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1291, 'WRAITH_DEAD', 'Wraith Dead', 74, 42131, 0, 10341, 3618, 2, 1366, 1626, 25, 30, 5, 99, 55, 95, 115, 45, 10, 12, 2, 1, 89, 149, 175, 1816, 576, 240, 1059, 4550, 2206, 10, 2506, 8, 716, 700, 732, 5, 717, 850, 657, 150, 603, 100, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1292, 'MINI_DEMON', 'Mini Demon', 68, 31865, 0, 8396, 3722, 1, 1073, 1415, 30, 25, 5, 75, 40, 55, 89, 42, 10, 12, 0, 6, 27, 149, 150, 1000, 600, 384, 1038, 4550, 1039, 450, 2255, 6, 757, 160, 912, 2500, 1009, 10, 1410, 3, 7054, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1293, 'CREMY_FEAR', 'Creamy Fear', 62, 13109, 0, 7365, 2691, 2, 667, 830, 45, 30, 5, 40, 16, 15, 68, 55, 10, 12, 0, 4, 24, 149, 155, 1136, 720, 840, 924, 4550, 2333, 10, 518, 550, 602, 200, 1550, 8, 1611, 8, 522, 50, 7053, 1800, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1294, 'KILLER_MANTIS', 'Killer Mantis', 56, 12911, 0, 6509, 2366, 1, 764, 927, 35, 20, 5, 26, 24, 5, 75, 40, 10, 12, 1, 4, 22, 149, 175, 1528, 660, 432, 1031, 4550, 943, 2500, 721, 10, 504, 5, 656, 25, 2224, 3, 2108, 1, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1295, 'OWL_BARON', 'Owl Baron', 75, 59489, 0, 10967, 4811, 2, 1252, 1609, 65, 25, 25, 25, 80, 95, 95, 55, 10, 12, 2, 6, 60, 181, 175, 1345, 824, 440, 7071, 3500, 7063, 2500, 1716, 2, 1472, 1, 1402, 25, 1514, 10, 5045, 5, 7054, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1296, 'KOBOLD_LEADER', 'Kobold Leader', 65, 17935, 0, 7432, 2713, 1, 649, 957, 37, 37, 5, 90, 36, 30, 77, 59, 10, 12, 1, 7, 44, 149, 150, 1028, 528, 360, 999, 450, 1034, 6500, 912, 1200, 1511, 6, 1613, 2, 525, 150, 526, 100, 7053, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1297, 'ANCIENT_MUMMY', 'Ancient Mummy', 64, 39760, 0, 8040, 3499, 1, 836, 1129, 27, 27, 28, 19, 32, 5, 83, 35, 10, 12, 1, 1, 49, 149, 175, 1772, 120, 384, 930, 4550, 934, 1800, 2624, 1, 2611, 150, 503, 350, 756, 150, 757, 100, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1298, 'ZOMBIE_MASTER', 'Zombie Master', 62, 13917, 0, 7610, 2826, 1, 824, 1084, 37, 26, 25, 20, 30, 5, 77, 35, 10, 12, 1, 1, 29, 149, 175, 2612, 912, 288, 7071, 4550, 938, 1500, 958, 1500, 723, 200, 727, 100, 1260, 1, 2324, 2, 2627, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1299, 'GOBLIN_LEADER', 'Goblin Leader', 64, 19735, 0, 6036, 2184, 1, 663, 753, 48, 16, 5, 55, 37, 30, 69, 58, 10, 12, 1, 7, 24, 149, 120, 1120, 620, 240, 998, 1200, 999, 800, 756, 120, 2297, 5, 2106, 2, 503, 650, 2611, 240, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1300, 'CATERPILLAR', 'Caterpillar', 64, 14140, 0, 6272, 3107, 1, 895, 1448, 47, 29, 35, 25, 85, 15, 69, 45, 10, 12, 0, 4, 22, 149, 300, 1672, 672, 480, 949, 3000, 7054, 5500, 2227, 20, 1000, 100, 997, 50, 501, 1000, 502, 500, 505, 12, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1301, 'AM_MUT', 'Am Mut', 61, 11848, 0, 7709, 2690, 1, 1041, 1123, 50, 10, 50, 65, 40, 35, 83, 45, 10, 12, 0, 6, 27, 149, 200, 1156, 456, 384, 1021, 4550, 757, 250, 1517, 3, 969, 5, 2282, 1, 912, 1200, 746, 250, 616, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1302, 'DARK_ILLUSION', 'Dark Illusion', 77, 101487, 0, 11163, 4181, 2, 1300, 1982, 64, 70, 5, 100, 40, 100, 97, 40, 10, 12, 2, 6, 89, 181, 145, 1024, 768, 480, 1615, 3, 5017, 2, 2508, 3, 7054, 5500, 522, 120, 504, 550, 1162, 2, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1303, 'GIANT_HONET', 'Giant Hornet', 56, 12834, 0, 5785, 2006, 1, 650, 851, 38, 43, 35, 38, 32, 10, 71, 64, 10, 12, 0, 4, 24, 149, 155, 1292, 792, 340, 526, 550, 518, 1200, 522, 12, 610, 15, 1608, 3, 722, 20, 2627, 1, 516, 3500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1304, 'GIANT_SPIDER', 'Giant Spider', 55, 11628, 0, 6211, 2146, 1, 625, 802, 41, 28, 5, 36, 43, 5, 73, 69, 10, 12, 2, 4, 25, 149, 165, 1468, 468, 768, 1025, 4550, 1042, 1200, 757, 140, 525, 450, 943, 1200, 1096, 680, 7053, 800, 7054, 800, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1305, 'ANCIENT_WORM', 'Ancient Worm', 67, 22131, 0, 8174, 3782, 1, 947, 1115, 35, 30, 5, 35, 56, 55, 81, 72, 10, 12, 2, 4, 25, 149, 165, 1792, 792, 336, 1042, 4550, 912, 2500, 2406, 1, 719, 15, 1096, 680, 938, 3500, 7054, 2500, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1306, 'LEIB_OLMAI', 'Leib Olmai', 58, 23731, 0, 6011, 2171, 1, 740, 1390, 27, 31, 5, 35, 95, 5, 64, 85, 10, 12, 2, 2, 22, 149, 175, 1260, 230, 192, 948, 4550, 2289, 8, 740, 120, 518, 500, 526, 1, 969, 5, 7053, 800, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1307, 'CAT_O_NINE_TAIL', 'Cat\'o\'Nine Tails', 76, 63177, 0, 10869, 4283, 1, 1112, 1275, 61, 55, 55, 75, 55, 82, 86, 120, 10, 12, 1, 6, 63, 181, 155, 1276, 576, 288, 5008, 1, 638, 150, 10008, 5, 985, 600, 984, 800, 969, 6, 617, 1, 7054, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1308, 'PANZER_GOBLIN', 'Panzer Goblin', 59, 13838, 0, 7212, 2697, 1, 682, 877, 41, 28, 60, 60, 40, 20, 81, 160, 10, 12, 1, 7, 44, 149, 200, 960, 1008, 840, 7053, 4550, 7054, 3500, 999, 180, 998, 360, 1003, 580, 744, 800, 994, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1309, 'GAJOMART', 'Gajomart', 63, 13386, 0, 6625, 2900, 1, 916, 948, 85, 50, 5, 34, 10, 5, 75, 140, 10, 12, 0, 0, 83, 149, 300, 1000, 1152, 828, 953, 6500, 912, 2300, 503, 870, 2279, 8, 1752, 10000, 999, 640, 994, 180, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1310, 'MAJORUROS', 'Majoruros', 66, 56791, 0, 8525, 3799, 1, 780, 1300, 10, 25, 65, 50, 75, 50, 85, 48, 10, 12, 2, 2, 43, 149, 250, 1100, 960, 780, 941, 4550, 1361, 4, 657, 300, 984, 16, 504, 850, 2611, 160, 2607, 1, 1000, 250, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1311, 'GULLINBURSTI', 'Gullinbursti', 62, 20890, 0, 5814, 2376, 1, 699, 1431, 10, 15, 55, 25, 60, 5, 70, 45, 10, 12, 2, 2, 42, 149, 150, 1960, 960, 384, 1028, 3500, 656, 290, 702, 6, 2276, 1, 605, 15, 2627, 1, 912, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1312, 'TURTLE_GENERAL', 'Turtle General', 97, 320700, 0, 18202, 9800, 2, 2438, 3479, 50, 54, 100, 45, 55, 65, 105, 164, 10, 12, 2, 2, 42, 181, 200, 900, 1000, 500, 1529, 8, 1306, 5, 512, 0, 1417, 1, 7070, 5500, 512, 0, 912, 5500, 658, 1, 1, 5000, 967, 5500, 607, 1500, 617, 2000);
-INSERT INTO `mob_db` VALUES (1313, 'MOBSTER', 'Mobster', 61, 11347, 0, 4424, 1688, 1, 910, 1128, 41, 37, 76, 46, 20, 35, 76, 55, 10, 12, 1, 7, 20, 149, 250, 1100, 560, 580, 1239, 3, 2601, 2, 2621, 1, 716, 600, 912, 2500, 525, 450, 505, 60, 726, 4700, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1314, 'PERMETER', 'Perimeter', 63, 11684, 0, 3756, 1955, 2, 943, 1212, 46, 45, 69, 59, 60, 5, 69, 100, 10, 12, 1, 2, 40, 145, 250, 1100, 483, 528, 967, 4550, 7070, 45, 1019, 1240, 501, 2450, 912, 1240, 522, 25, 605, 1, 1519, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1315, 'ASSULTER', 'Assaulter', 71, 15861, 0, 4854, 2654, 2, 764, 1499, 35, 28, 85, 74, 10, 35, 100, 100, 10, 12, 1, 7, 44, 149, 155, 1000, 900, 432, 967, 4550, 7069, 1200, 7072, 840, 503, 1280, 912, 1240, 522, 45, 603, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1316, 'SOLIDER', 'Soldier', 70, 17181, 0, 4458, 1951, 2, 796, 978, 57, 43, 69, 35, 85, 5, 74, 100, 10, 12, 1, 2, 42, 145, 250, 1452, 483, 528, 967, 4550, 7070, 64, 7067, 850, 502, 2100, 912, 1240, 518, 850, 1519, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1317, 'FUR_SEAL', 'Fur Seal', 63, 9114, 0, 4501, 2035, 1, 845, 1202, 25, 33, 5, 28, 22, 15, 69, 84, 10, 12, 1, 2, 21, 133, 250, 1612, 622, 583, 912, 4500, 510, 250, 2310, 5, 7053, 1200, 1452, 1, 525, 200, 746, 120, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1318, 'HEATER', 'Heater', 68, 15648, 0, 3766, 2359, 2, 682, 1007, 40, 42, 69, 47, 25, 5, 71, 100, 10, 12, 1, 2, 43, 149, 250, 1452, 483, 528, 967, 4550, 7070, 750, 501, 2400, 912, 1640, 526, 140, 7054, 600, 1505, 2, 7068, 1250, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1319, 'FREEZER', 'Freezer', 72, 12263, 0, 3665, 2197, 2, 672, 984, 55, 43, 69, 41, 59, 5, 67, 100, 10, 12, 1, 2, 41, 149, 250, 1452, 483, 528, 967, 4550, 7070, 850, 7066, 1250, 912, 1800, 526, 160, 7053, 600, 1504, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1320, '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, 181, 195, 1345, 824, 440, 7071, 4550, 7063, 1500, 1714, 1, 747, 1, 1451, 3, 1513, 2, 5045, 1, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1321, 'DRAGON_TAIL', 'Dragon Tail', 61, 11883, 0, 3587, 1453, 1, 520, 715, 25, 19, 10, 68, 15, 5, 67, 67, 10, 12, 1, 4, 44, 149, 175, 862, 534, 312, 7064, 4550, 1096, 400, 943, 800, 2207, 8, 2226, 2, 601, 300, 602, 150, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1322, 'SPRING_RABBIT', 'Spring Rabbit', 58, 12844, 0, 3982, 1766, 1, 585, 813, 29, 21, 45, 61, 5, 15, 77, 90, 10, 12, 1, 2, 42, 131, 160, 1120, 552, 511, 7054, 3500, 7053, 2500, 949, 2500, 511, 800, 508, 800, 510, 200, 509, 800, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1323, 'SEE_OTTER', 'Sea Otter', 59, 9999, 0, 4267, 2040, 1, 650, 813, 33, 35, 5, 36, 40, 25, 82, 65, 10, 12, 1, 2, 61, 133, 190, 1132, 583, 532, 722, 150, 965, 5500, 7065, 4500, 725, 50, 726, 50, 746, 650, 7053, 1200, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1324, 'TREASURE_BOX1', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1325, 'TREASURE_BOX2', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7073, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1239, 1500, 2252, 75, 1165, 8, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1326, 'TREASURE_BOX3', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1327, 'TREASURE_BOX4', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7074, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2108, 1000, 1306, 75, 5022, 8, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1328, 'TREASURE_BOX5', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1329, 'TREASURE_BOX6', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7075, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2102, 834, 5019, 100, 5002, 9, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1330, 'TREASURE_BOX7', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1331, 'TREASURE_BOX8', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7076, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2616, 500, 2334, 125, 2622, 9, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1332, 'TREASURE_BOX9', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1333, 'TREASURE_BOX10', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7077, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2104, 500, 2331, 150, 2623, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1334, 'TREASURE_BOX11', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1335, 'TREASURE_BOX12', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7078, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2270, 500, 1716, 150, 2256, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1336, 'TREASURE_BOX13', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1337, 'TREASURE_BOX14', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7079, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1238, 375, 1531, 150, 2318, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1338, 'TREASURE_BOX15', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1339, 'TREASURE_BOX16', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7080, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2626, 300, 1472, 167, 2327, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1340, 'TREASURE_BOX17', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1341, 'TREASURE_BOX18', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7081, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1143, 250, 1237, 188, 2235, 12, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1342, 'TREASURE_BOX19', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1343, 'TREASURE_BOX20', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7082, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 617, 250, 1229, 188, 5007, 19, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1344, 'TREASURE_BOX21', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1345, 'TREASURE_BOX22', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7083, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2508, 1000, 2336, 69, 2621, 20, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1346, 'TREASURE_BOX23', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1347, 'TREASURE_BOX24', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7084, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2106, 1000, 1164, 50, 5025, 24, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1348, 'TREASURE_BOX25', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1349, 'TREASURE_BOX26', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7085, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2231, 750, 2624, 46, 2286, 25, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1350, 'TREASURE_BOX27', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1351, 'TREASURE_BOX28', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7086, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2283, 500, 2615, 41, 2234, 32, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1352, 'TREASURE_BOX29', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1353, 'TREASURE_BOX30', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7087, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2507, 500, 2625, 38, 5027, 34, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1354, 'TREASURE_BOX31', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1355, 'TREASURE_BOX32', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7088, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2407, 429, 2269, 250, 2317, 35, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1356, 'TREASURE_BOX33', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1357, 'TREASURE_BOX34', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7089, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2109, 300, 2406, 273, 2258, 38, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1358, 'TREASURE_BOX35', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1359, 'TREASURE_BOX36', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7090, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1142, 215, 2255, 60, 5017, 38, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1360, 'TREASURE_BOX37', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1361, 'TREASURE_BOX38', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7091, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1417, 50, 5053, 50, 2229, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1362, 'TREASURE_BOX39', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1363, 'TREASURE_BOX40', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7092, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2506, 43, 2254, 43, 1529, 38, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1364, 'G_ASSULTER', 'Assaulter', 59, 18251, 0, 1, 1, 2, 195, 227, 35, 36, 85, 55, 10, 35, 145, 100, 10, 12, 1, 7, 44, 149, 155, 1000, 900, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1365, 'APOCALIPS', 'Apocalypse', 66, 22680, 0, 6540, 4935, 2, 1030, 1370, 62, 49, 1, 48, 120, 108, 66, 85, 10, 12, 2, 0, 60, 133, 400, 1564, 864, 576, 7095, 5500, 7094, 2400, 7093, 2200, 985, 5, 757, 15, 2506, 20, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1366, 'LAVA_GOLEM', 'Lava Golem', 77, 24324, 0, 6470, 3879, 1, 1541, 2049, 65, 50, 1, 57, 115, 127, 76, 68, 10, 12, 2, 0, 83, 133, 400, 1564, 864, 576, 7096, 5000, 7097, 3800, 2317, 1, 2316, 2, 504, 2500, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1367, 'BLAZZER', 'Blazer', 43, 8252, 0, 3173, 1871, 2, 533, 709, 50, 40, 1, 52, 50, 64, 69, 40, 10, 12, 0, 6, 43, 133, 180, 1564, 864, 576, 7097, 5500, 7098, 3700, 504, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1368, 'GEOGRAPHER', 'Geographer', 56, 8071, 0, 2715, 2000, 3, 467, 621, 28, 26, 1, 67, 47, 83, 68, 44, 10, 12, 0, 3, 62, 132, 2000, 1564, 864, 576, 1032, 7500, 1033, 5500, 2253, 30, 2207, 50, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1369, 'GRAND_PECO', 'Grand Peco', 58, 8054, 0, 2387, 1361, 2, 444, 565, 37, 30, 1, 67, 66, 83, 71, 51, 10, 12, 2, 2, 43, 145, 165, 1564, 864, 576, 7101, 5000, 522, 300, 992, 1000, 969, 1, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1370, 'SUCCUBUS', 'Succubus', 85, 16955, 0, 5357, 4322, 2, 1268, 1686, 54, 48, 1, 97, 95, 150, 89, 87, 10, 12, 1, 6, 67, 133, 155, 1564, 864, 576, 522, 1500, 2407, 3, 2611, 500, 2613, 150, 2601, 2, 1472, 1, 505, 1000, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1371, 'FAKE_ANGEL', 'Fake Angel', 65, 16845, 0, 3371, 1949, 2, 513, 682, 50, 35, 1, 64, 57, 98, 61, 88, 10, 12, 0, 8, 66, 133, 160, 1564, 864, 576, 7104, 5500, 7105, 3500, 717, 1000, 715, 1000, 716, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1372, 'GOAT', 'Goat', 69, 11077, 0, 3357, 2015, 1, 457, 608, 44, 25, 1, 58, 66, 95, 67, 43, 10, 12, 2, 2, 63, 145, 165, 1564, 864, 576, 7106, 5000, 7107, 2500, 713, 5000, 507, 500, 510, 1000, 508, 2500, 511, 5500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1373, 'LORD_OF_DEATH', 'Lord of Death', 94, 303383, 0, 10000, 5000, 3, 2430, 3232, 77, 73, 1, 99, 120, 169, 100, 106, 10, 12, 2, 6, 67, 181, 300, 1564, 864, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10000, 1000, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1374, 'INCUBUS', 'Incubus', 75, 17281, 0, 5254, 4212, 2, 1408, 1873, 58, 46, 1, 97, 95, 150, 89, 87, 10, 12, 1, 6, 67, 133, 165, 1564, 864, 576, 522, 1500, 504, 5500, 1306, 2, 2621, 1, 2610, 500, 2613, 150, 504, 1200, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1375, 'THE_PAPER', 'The Paper', 56, 18557, 0, 2849, 1998, 1, 845, 1124, 25, 24, 1, 66, 52, 102, 71, 79, 10, 12, 1, 0, 60, 133, 170, 1564, 864, 576, 7111, 5500, 7112, 3200, 503, 800, 511, 2000, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1376, 'HARPY', 'Harpy', 70, 16599, 0, 3562, 2133, 1, 956, 1231, 42, 44, 1, 112, 72, 103, 74, 76, 10, 12, 1, 6, 64, 133, 155, 1564, 864, 576, 7115, 5500, 7116, 2500, 502, 1500, 503, 800, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1377, 'ELDER', 'Elder', 64, 21592, 0, 4650, 3408, 3, 421, 560, 45, 68, 1, 76, 68, 142, 72, 86, 10, 12, 2, 7, 80, 133, 165, 1564, 864, 576, 7099, 4500, 7117, 1500, 7118, 1500, 1472, 4, 1473, 1, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1378, 'DEMON_PUNGUS', 'Demon Pungus', 56, 7259, 0, 3148, 1817, 1, 360, 479, 48, 31, 1, 83, 55, 86, 63, 34, 10, 12, 0, 6, 65, 133, 170, 1564, 864, 576, 7119, 4200, 7001, 4700, 715, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1379, 'NIGHTMARE_TERROR', 'Nightmare Terror', 78, 22605, 0, 6683, 4359, 1, 757, 1007, 37, 37, 1, 76, 55, 87, 77, 54, 10, 12, 2, 6, 67, 133, 165, 1564, 864, 576, 7120, 5500, 2626, 1, 2608, 30, 505, 50, 510, 150, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1380, 'DRILLER', 'Driller', 52, 7452, 0, 3215, 1860, 1, 666, 886, 48, 31, 1, 66, 58, 79, 60, 47, 10, 12, 1, 2, 22, 133, 165, 1564, 864, 576, 1012, 7500, 715, 4000, 716, 3500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1381, 'GRIZZLY', 'Grizzly', 68, 11733, 0, 3341, 2012, 1, 809, 1076, 44, 32, 1, 54, 68, 92, 70, 61, 10, 12, 2, 2, 63, 133, 165, 1564, 864, 576, 948, 7500, 919, 7500, 549, 2500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1382, 'DIABOLIC', 'Diabolic', 67, 9642, 0, 3662, 2223, 1, 796, 1059, 64, 36, 1, 84, 53, 93, 71, 69, 10, 12, 0, 6, 47, 133, 150, 1564, 864, 576, 1038, 6800, 1039, 5700, 2605, 3, 984, 20, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1383, 'EXPLOSION', 'Explosion', 46, 8054, 0, 2404, 1642, 1, 336, 447, 35, 27, 1, 61, 56, 78, 66, 38, 10, 12, 0, 2, 63, 133, 165, 1564, 864, 576, 7006, 6500, 7097, 2500, 7122, 3500, 756, 1000, 522, 500, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1384, 'DELETER', 'Sky Deleter', 66, 17292, 0, 3403, 2066, 1, 446, 593, 45, 53, 1, 105, 40, 85, 72, 54, 10, 12, 1, 9, 44, 133, 175, 1564, 864, 576, 7123, 4200, 1035, 5500, 1037, 4000, 1036, 3700, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1385, 'DELETER_', 'Earth Deleter', 65, 15168, 0, 3403, 2066, 1, 446, 593, 52, 53, 1, 67, 40, 85, 72, 68, 10, 12, 1, 9, 42, 133, 175, 1564, 864, 576, 7123, 4200, 1035, 5500, 1037, 4000, 1036, 3700, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1386, 'SLEEPER', 'Sleeper', 67, 8237, 0, 3603, 2144, 1, 593, 789, 49, 35, 1, 48, 100, 107, 75, 28, 10, 12, 1, 0, 42, 133, 195, 1564, 864, 576, 7124, 5500, 1056, 5500, 997, 4500, 756, 300, 1226, 5, 1222, 20, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1387, 'GIG', 'Gig', 60, 8409, 0, 3934, 2039, 1, 360, 479, 60, 28, 1, 61, 80, 93, 59, 46, 10, 12, 0, 2, 41, 133, 170, 1564, 864, 576, 7125, 5000, 904, 7500, 716, 150, 525, 2500, 994, 850, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1388, 'ARCHANGELING', 'Archangeling', 60, 79523, 0, 4152, 2173, 1, 669, 890, 54, 58, 1, 65, 80, 114, 65, 105, 10, 12, 1, 8, 66, 181, 180, 1564, 864, 576, 2255, 5, 610, 1800, 608, 150, 985, 15, 984, 55, 2317, 3, 512, 500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1389, 'DRACULA', 'Dracula', 85, 320096, 0, 120157, 38870, 3, 1625, 1891, 45, 76, 1, 95, 90, 87, 85, 100, 10, 12, 2, 6, 87, 181, 145, 1564, 864, 576, 607, 4700, 1473, 5, 1722, 5, 2507, 15, 2621, 4, 1557, 4, 512, 0, 4134, 1, 500, 5000, 607, 5500, 732, 2250, 522, 1125);
-INSERT INTO `mob_db` VALUES (1390, '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, 1060, 6500, 1611, 50, 740, 1200, 2610, 800, 526, 1400, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1391, 'GALAPAGO', 'Galapago', 63, 9940, 0, 3204, 1966, 1, 457, 608, 33, 33, 1, 56, 56, 45, 66, 57, 10, 12, 1, 2, 22, 131, 165, 1564, 864, 576, 7053, 6700, 610, 1500, 503, 2500, 606, 100, 605, 100, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1392, 'ROTAR_ZAIRO', 'Rotar Zairo', 25, 1209, 0, 351, 215, 10, 109, 137, 4, 34, 1, 62, 45, 48, 55, 5, 10, 12, 1, 0, 44, 133, 155, 1564, 864, 576, 7126, 500, 2312, 1, 2309, 1, 999, 450, 984, 1, 912, 2500, 910, 5500, 7053, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1393, 'G_MUMMY', 'G Mummy', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1394, 'G_ZOMBIE', 'G Zombie', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1395, 'CRYSTAL_1', 'Wind Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 547, 5000, 526, 3000, 607, 1000, 2504, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1396, 'CRYSTAL_2', 'Earth Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 604, 5000, 999, 3000, 2104, 1000, 2213, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1397, 'CRYSTAL_3', 'Fire Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 604, 5000, 984, 3000, 7047, 1000, 2322, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1398, 'CRYSTAL_4', 'Water Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 505, 5000, 985, 3000, 706, 1000, 2404, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1399, 'EVENT_BAPHO', 'Baphomet', 99, 864960, 0, 562340, 87895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 1068, 768, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 923, 3800, 0, 0);
-INSERT INTO `mob_db` VALUES (1400, 'KARAKASA', 'Karakasa', 30, 3092, 0, 489, 322, 1, 140, 183, 1, 20, 1, 40, 12, 5, 52, 45, 10, 12, 1, 0, 60, 129, 300, 1480, 480, 1056, 7150, 4501, 7151, 5000, 912, 4001, 1019, 3501, 7111, 2501, 746, 51, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1401, 'SHINOBI', 'Shinobi', 69, 12700, 0, 4970, 3010, 1, 460, 1410, 30, 21, 1, 91, 25, 25, 89, 40, 10, 12, 1, 7, 67, 133, 200, 1480, 480, 720, 7156, 7000, 1011, 4000, 7053, 3000, 739, 200, 2337, 50, 2335, 150, 2336, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1402, 'POISON_TOAD', 'Poison Toad', 46, 6629, 0, 1929, 1457, 1, 288, 408, 5, 10, 1, 45, 19, 1, 66, 43, 10, 12, 1, 2, 45, 129, 165, 976, 576, 288, 7154, 6000, 7155, 4000, 724, 5, 526, 1500, 506, 1000, 2610, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1403, 'ANTIQUE_FIRELOCK', 'Antique Firelock', 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, 998, 5500, 7126, 1501, 549, 351, 525, 301, 503, 21, 7157, 0, 2285, 2, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1404, 'MIYABI_NINGYO', 'Miyabi Ningyo', 33, 6300, 0, 795, 493, 1, 250, 305, 1, 2, 45, 31, 15, 10, 47, 15, 10, 12, 1, 6, 27, 145, 200, 1720, 500, 420, 7153, 2501, 7152, 5500, 1000, 1301, 7005, 101, 504, 501, 2613, 2, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1405, 'TENGU', 'Tengu', 65, 16940, 0, 4207, 2843, 2, 660, 980, 12, 82, 1, 45, 69, 45, 75, 25, 10, 12, 2, 6, 42, 133, 150, 1056, 1056, 336, 7159, 5000, 7158, 4000, 999, 2500, 7063, 1500, 522, 1000, 2278, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1406, 'KAPHA', 'Kappa', 41, 7982, 0, 2278, 1552, 3, 399, 719, 20, 38, 1, 65, 49, 22, 73, 140, 10, 12, 1, 5, 21, 133, 200, 1152, 1152, 384, 7149, 6500, 7053, 4001, 912, 601, 521, 2301, 520, 2000, 640, 11, 708, 101, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1407, 'DOKEBI_', 'Dokebi', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1408, 'BLOOD_BUTTERFLY', 'Blood Butterfly', 57, 8082, 0, 2298, 1896, 2, 354, 575, 5, 23, 1, 65, 35, 37, 116, 30, 10, 13, 1, 4, 44, 133, 150, 872, 500, 300, 7163, 5000, 7168, 2501, 602, 1501, 924, 5000, 512, 1, 1802, 16, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1409, 'RICE_CAKE_BOY', 'Rice Cake Boy', 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, 7150, 5000, 7151, 4000, 512, 1500, 2262, 800, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1410, 'LIVE_PEACH_TREE', 'Live Peach Tree', 55, 10050, 0, 2965, 1999, 8, 482, 603, 10, 38, 1, 45, 120, 39, 120, 55, 10, 13, 1, 3, 42, 132, 400, 1288, 576, 288, 7164, 4000, 522, 2500, 526, 1500, 604, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1410, 'LIVE_PEACH_TREE', 'Live Peach Tree', 55, 10050, 0, 2965, 1999, 8, 482, 603, 10, 38, 1, 45, 120, 39, 120, 55, 10, 13, 1, 3, 42, 132, 400, 1288, 576, 288, 7164, 4000, 522, 2500, 526, 1500, 604, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1412, 'EVIL_CLOUD_HERMIT', 'Evil Cloud 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, 7162, 5500, 553, 5000, 548, 5500, 550, 5000, 1908, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1413, 'WILD_GINSENG', 'Wild Ginseng', 46, 6900, 0, 1038, 692, 5, 220, 280, 10, 20, 1, 42, 36, 55, 66, 30, 10, 13, 0, 3, 43, 145, 400, 2208, 1008, 324, 520, 2500, 521, 2500, 1032, 3500, 1033, 3500, 1951, 10, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1413, 'WILD_GINSENG', 'Wild Ginseng', 46, 6900, 0, 1038, 692, 5, 220, 280, 10, 20, 1, 42, 36, 55, 66, 30, 10, 13, 0, 3, 43, 145, 400, 2208, 1008, 324, 520, 2500, 521, 2500, 1032, 3500, 1033, 3500, 1951, 10, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1415, 'BABY_LEOPARD', 'Baby Leopard', 32, 2590, 0, 352, 201, 2, 155, 207, 0, 5, 1, 44, 20, 4, 49, 10, 10, 13, 0, 2, 28, 133, 150, 988, 288, 168, 7171, 4501, 7172, 4501, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1416, 'WICKED_NYMPH', 'Wicked Nymph', 63, 18029, 0, 3945, 2599, 1, 691, 1382, 12, 75, 1, 64, 12, 69, 100, 80, 10, 13, 1, 6, 67, 133, 200, 1672, 672, 288, 7165, 4000, 7166, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1417, '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, 137, 200, 976, 576, 288, 7161, 4501, 7167, 4501, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1418, 'DARK_SNAKE_LORD', 'Dark Snake Lord', 73, 254993, 0, 34288, 17950, 1, 1433, 2033, 25, 55, 1, 83, 62, 80, 164, 88, 10, 12, 2, 2, 68, 181, 200, 976, 500, 400, 7169, 1500, 10020, 2500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 524, 0, 985, 2000, 607, 3600, 608, 0);
-INSERT INTO `mob_db` VALUES (1419, 'G_FARMILIAR', 'Farmoloar', 8, 155, 0, 0, 0, 1, 20, 28, 0, 0, 1, 12, 8, 5, 28, 0, 10, 12, 0, 2, 27, 133, 150, 1276, 576, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1420, 'G_Skel_archer', 'Skeleton Archer', 31, 3040, 0, 0, 0, 9, 128, 153, 0, 0, 1, 8, 14, 5, 90, 5, 10, 12, 1, 1, 29, 133, 300, 2864, 864, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1421, 'G_ISIS', 'Isis', 43, 4828, 0, 0, 0, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1422, 'G_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, 133, 150, 676, 576, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1423, 'G_GHOUL', 'Ghoul', 39, 5118, 0, 0, 0, 1, 420, 500, 5, 20, 1, 20, 29, 0, 33, 20, 10, 12, 1, 1, 49, 133, 250, 2456, 912, 504, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1424, 'G_SIDE_WINDER', 'Sidewinder', 43, 4929, 0, 0, 0, 1, 240, 320, 5, 10, 38, 43, 40, 15, 115, 20, 10, 12, 1, 2, 25, 149, 200, 1576, 576, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1425, 'G_OBEAUNE', 'Obeaune', 31, 3952, 0, 0, 0, 1, 141, 165, 0, 40, 1, 31, 31, 55, 74, 85, 10, 12, 1, 5, 41, 149, 200, 1872, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1426, 'G_MARC', 'Marc', 36, 6900, 0, 0, 0, 1, 220, 280, 5, 10, 1, 36, 36, 20, 56, 30, 10, 12, 1, 5, 41, 133, 150, 1272, 72, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1427, 'G_NIGHTMARE', 'Nightmare', 49, 4437, 0, 0, 0, 1, 447, 529, 0, 40, 1, 74, 25, 15, 64, 10, 10, 12, 2, 6, 68, 149, 150, 1816, 816, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1428, 'G_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, 133, 200, 1672, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1429, 'G_ARGIOPE', 'Argiope', 41, 4382, 0, 0, 0, 1, 395, 480, 30, 0, 1, 41, 31, 10, 56, 30, 10, 12, 2, 4, 25, 149, 300, 1792, 792, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1430, 'G_ARGOS', 'Argor', 25, 1117, 0, 0, 0, 1, 158, 191, 15, 0, 1, 25, 25, 5, 32, 15, 10, 12, 2, 4, 25, 149, 300, 1468, 468, 768, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1431, 'G_BAPHOMET_', 'Baphomet', 50, 8578, 0, 0, 0, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1432, 'G_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, 141, 200, 1120, 420, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1433, 'G_DEVIRUCHI', 'Deviruchi', 46, 7360, 0, 0, 0, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1434, 'G_DRAINLIAR', 'Drainliar', 24, 1162, 0, 0, 0, 1, 74, 84, 0, 0, 1, 36, 24, 0, 78, 0, 10, 12, 0, 2, 47, 149, 250, 1276, 576, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1435, 'G_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, 149, 300, 2276, 576, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1436, 'G_JAKK', 'Jakk', 38, 3581, 0, 0, 0, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1437, 'G_JOKER', 'Joker', 57, 12450, 0, 0, 0, 1, 621, 738, 10, 35, 1, 143, 47, 75, 98, 175, 10, 12, 2, 7, 84, 149, 100, 1364, 864, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1438, 'G_KHALITZBURG', 'Khalitzburg', 63, 19276, 0, 0, 0, 1, 875, 1025, 45, 10, 58, 65, 48, 5, 73, 40, 10, 12, 2, 1, 29, 149, 350, 528, 1000, 396, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1439, 'G_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, 149, 150, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1440, 'G_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, 149, 200, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1441, 'G_PENOMENA', 'Penomena', 57, 7256, 0, 0, 0, 7, 415, 565, 5, 50, 1, 5, 35, 15, 136, 30, 10, 12, 1, 5, 25, 149, 400, 832, 500, 600, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1442, 'G_SASQUATCH', 'Sasquatch', 30, 3163, 0, 0, 0, 1, 250, 280, 5, 0, 75, 25, 60, 10, 34, 20, 10, 12, 2, 2, 60, 149, 300, 1260, 192, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1443, 'G_CRUISER', 'Cruiser', 35, 2820, 0, 0, 0, 7, 175, 215, 5, 5, 1, 40, 10, 10, 90, 25, 10, 12, 1, 0, 60, 149, 400, 1296, 1296, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1444, 'G_CHEPET', 'Chepet', 42, 4950, 0, 0, 0, 1, 380, 440, 0, 25, 1, 72, 35, 71, 65, 85, 10, 12, 1, 7, 23, 149, 400, 672, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1445, 'G_RAGGLER', 'Raggler', 21, 1020, 0, 0, 0, 1, 102, 113, 0, 5, 18, 10, 32, 20, 39, 35, 10, 12, 0, 2, 24, 149, 200, 1000, 900, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1446, 'G_INJUSTICE', 'Injustice', 51, 7600, 0, 0, 0, 1, 480, 600, 0, 0, 84, 42, 39, 0, 71, 35, 10, 12, 1, 1, 47, 149, 400, 770, 720, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1447, 'G_GRYPHON', 'Gryphon', 72, 27800, 0, 0, 0, 1, 880, 1260, 35, 35, 68, 95, 78, 65, 115, 75, 10, 12, 2, 2, 84, 181, 100, 704, 504, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1448, 'G_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, 149, 200, 920, 720, 200, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1449, 'G_MUTANT_DRAGON', 'Muntant Dragon', 65, 62600, 0, 0, 0, 4, 2400, 3400, 15, 20, 75, 47, 30, 68, 45, 35, 10, 12, 2, 9, 43, 181, 250, 1280, 1080, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1450, 'G_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, 149, 150, 1056, 1056, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1451, 'G_MERMAN', 'Merman', 53, 12300, 0, 0, 0, 2, 482, 603, 10, 35, 72, 45, 46, 15, 85, 55, 10, 12, 1, 7, 41, 149, 200, 916, 816, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1452, 'G_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, 149, 200, 1050, 900, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1453, 'G_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, 133, 200, 1152, 1152, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1454, 'G_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, 149, 200, 860, 660, 624, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1455, 'G_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, 133, 200, 1008, 1008, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1456, 'G_CHIMERA', 'Chimera', 70, 32600, 0, 0, 0, 1, 1200, 1320, 30, 10, 1, 72, 110, 88, 75, 85, 10, 12, 2, 2, 63, 181, 200, 772, 672, 360, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1457, 'G_MANTIS', 'Mantis', 26, 2472, 0, 0, 0, 1, 118, 149, 10, 0, 1, 26, 24, 5, 45, 15, 10, 12, 1, 4, 22, 149, 200, 1528, 660, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1458, 'G_MARDUK', 'Marduk', 40, 4214, 0, 0, 0, 1, 315, 382, 0, 60, 1, 40, 20, 79, 78, 20, 10, 12, 2, 7, 23, 149, 300, 1540, 840, 504, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1459, 'G_MARIONETTE', 'Marionette', 41, 3222, 0, 0, 0, 1, 355, 422, 0, 25, 1, 62, 36, 44, 69, 45, 10, 12, 0, 6, 68, 149, 300, 1480, 480, 1056, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1460, 'G_MATYR', 'Matyr', 31, 2585, 0, 0, 0, 1, 134, 160, 0, 0, 1, 47, 38, 5, 64, 5, 10, 12, 1, 2, 27, 149, 150, 432, 432, 360, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1461, 'G_MINOROUS', 'Minorous', 52, 7431, 0, 0, 0, 1, 590, 770, 15, 5, 65, 42, 61, 66, 52, 25, 10, 12, 2, 2, 43, 149, 200, 1360, 960, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1462, 'G_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, 133, 200, 2420, 720, 648, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1463, 'G_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, 133, 400, 2852, 1152, 840, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1464, 'G_PASANA', 'Pasana', 61, 8289, 0, 0, 0, 1, 513, 682, 29, 35, 1, 73, 50, 61, 69, 43, 10, 12, 1, 7, 43, 149, 165, 1700, 1000, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1465, 'G_PETIT', 'Petit', 44, 6881, 0, 0, 0, 1, 360, 427, 30, 30, 1, 44, 62, 69, 79, 60, 10, 12, 1, 9, 22, 149, 200, 1624, 620, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1466, 'G_PETIT_', 'Petit', 45, 5747, 0, 0, 0, 1, 300, 355, 20, 45, 1, 113, 45, 69, 73, 80, 10, 12, 1, 9, 24, 149, 150, 1420, 1080, 528, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1467, 'G_RAYDRIC', 'Raydric', 52, 8613, 0, 0, 0, 1, 830, 930, 40, 15, 58, 47, 42, 5, 69, 26, 10, 12, 2, 7, 47, 149, 150, 824, 780, 420, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1468, 'G_REQUIEM', 'Requim', 35, 3089, 0, 0, 0, 1, 220, 272, 0, 15, 1, 53, 35, 5, 57, 2, 10, 12, 1, 7, 27, 133, 400, 1516, 816, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1469, 'G_SKEL_WORKER', 'Skeletom Worker', 30, 2872, 0, 0, 0, 1, 242, 288, 0, 15, 1, 15, 30, 5, 42, 10, 10, 12, 1, 1, 29, 133, 400, 2420, 720, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1470, 'G_ZEROM', 'Zerom', 23, 1109, 0, 0, 0, 1, 127, 155, 0, 10, 1, 23, 23, 5, 42, 0, 10, 12, 1, 7, 23, 133, 200, 1780, 1080, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1471, 'G_NINE_TAIL', 'NineTail', 51, 9466, 0, 0, 0, 1, 610, 734, 10, 25, 1, 80, 46, 1, 89, 85, 10, 12, 1, 2, 63, 149, 150, 840, 540, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1472, 'G_BON_GUN', 'Bon Gun', 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, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1473, 'G_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, 149, 300, 1960, 620, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1474, 'G_MIMIC', 'Mimic', 51, 6120, 0, 0, 0, 1, 150, 900, 10, 40, 44, 121, 1, 60, 75, 110, 10, 12, 1, 0, 60, 149, 100, 972, 500, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1475, 'G_WRAITH', 'Wraith', 53, 10999, 0, 0, 0, 1, 580, 760, 5, 30, 1, 95, 30, 75, 95, 35, 10, 12, 2, 1, 89, 149, 300, 1816, 576, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1476, 'G_ALARM', 'Alarm', 58, 10647, 0, 0, 0, 1, 480, 600, 15, 15, 1, 62, 72, 10, 85, 45, 10, 12, 1, 0, 60, 149, 300, 1020, 500, 768, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1477, 'G_ARCLOUSE', 'Arclouse', 59, 6075, 0, 0, 0, 1, 570, 640, 10, 15, 1, 75, 5, 5, 75, 50, 10, 12, 1, 4, 42, 149, 100, 960, 500, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1478, 'G_RIDEWORD', 'Rideword', 59, 11638, 0, 0, 0, 1, 584, 804, 5, 35, 48, 75, 10, 20, 120, 45, 10, 12, 0, 0, 60, 149, 150, 864, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1479, 'G_SKEL_PRISONER', 'Skeleton Prisoner', 52, 8691, 0, 0, 0, 1, 660, 890, 10, 20, 55, 20, 36, 0, 76, 25, 10, 12, 1, 1, 69, 141, 350, 1848, 500, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1480, 'G_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, 141, 350, 1768, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1481, 'G_PUNK', 'Punk', 43, 3620, 0, 0, 0, 1, 292, 365, 0, 45, 1, 105, 5, 45, 65, 20, 10, 12, 0, 3, 24, 149, 300, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1482, 'G_ZHERLTHSH', 'Zherlthsh', 63, 18300, 0, 0, 0, 1, 700, 850, 10, 15, 70, 85, 40, 30, 125, 60, 10, 12, 1, 7, 60, 141, 200, 800, 792, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1483, 'G_RYBIO', 'Rybio', 71, 9572, 0, 0, 0, 1, 686, 912, 45, 37, 1, 97, 75, 74, 77, 90, 10, 12, 2, 6, 40, 149, 200, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1484, 'G_PHENDARK', 'Phendark', 73, 22729, 0, 0, 0, 1, 794, 1056, 52, 36, 1, 62, 120, 65, 77, 66, 10, 12, 2, 7, 40, 149, 175, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1485, 'G_MYSTELTAINN', 'Mysteltainn', 76, 33350, 0, 0, 0, 2, 1160, 1440, 30, 30, 77, 139, 80, 35, 159, 65, 10, 12, 2, 0, 87, 181, 250, 1152, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1486, 'G_TIRFING', 'Trifing', 71, 29900, 0, 0, 0, 1, 950, 1146, 30, 35, 58, 87, 55, 35, 132, 65, 10, 12, 1, 0, 67, 181, 100, 816, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1487, 'G_EXECUTIONER', 'Executioner', 65, 28980, 0, 0, 0, 2, 570, 950, 35, 35, 64, 85, 40, 25, 88, 60, 10, 12, 2, 0, 47, 181, 200, 768, 500, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1488, 'G_ANOLIAN', 'Anolian', 63, 18960, 0, 0, 0, 1, 640, 760, 15, 15, 1, 43, 58, 25, 97, 65, 10, 12, 1, 5, 41, 149, 200, 900, 500, 864, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1489, 'G_STING', 'Sting', 61, 9500, 0, 0, 0, 1, 850, 1032, 5, 30, 57, 45, 55, 5, 120, 85, 10, 12, 1, 0, 62, 149, 300, 528, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1490, 'G_WANDER_MAN', 'Wandering Man', 74, 8170, 0, 0, 0, 2, 750, 1000, 5, 5, 1, 192, 38, 45, 127, 85, 10, 12, 1, 6, 24, 149, 100, 672, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1491, 'G_DOKEBI', 'Dokebi', 33, 2697, 0, 0, 0, 1, 197, 249, 0, 10, 50, 50, 40, 35, 69, 40, 10, 12, 0, 6, 27, 145, 250, 1156, 456, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1492, 'INCANTATION_SAMURAI', 'Incantation Samurai', 75, 218652, 0, 33095, 18214, 1, 1219, 2169, 10, 51, 64, 85, 78, 85, 150, 60, 10, 12, 2, 7, 67, 181, 200, 1152, 1152, 480, 1164, 2, 1165, 2, 999, 500, 984, 1000, 985, 1000, 607, 500, 7151, 2000, 504, 500, 5000, 1000, 607, 500, 608, 500, 985, 500);
-INSERT INTO `mob_db` VALUES (1493, 'DRYAD', 'Dryad', 50, 8791, 0, 2763, 1493, 3, 499, 589, 15, 33, 1, 75, 55, 1, 78, 45, 10, 12, 1, 3, 64, 149, 200, 1152, 1152, 384, 7203, 1000, 7198, 1000, 7197, 1000, 1951, 10, 2269, 100, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1494, 'KIND_OF_BEETLE', 'Kind of Beetle', 34, 1874, 0, 679, 442, 3, 191, 243, 14, 12, 1, 34, 10, 0, 50, 0, 10, 12, 0, 4, 22, 149, 200, 1152, 1152, 384, 7190, 1000, 7202, 1000, 928, 100, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1495, 'STONE_SHOOTER', 'Stone Shooter', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1495, 'STONE_SHOOTER', 'Stone Shooter', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1497, 'WOODEN_GOLEM', 'Wooden Golem', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1498, '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, 133, 200, 1152, 1152, 384, 517, 5000, 513, 5000, 7195, 1000, 7200, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1499, 'WOOTAN_FIGHTER', 'Wootan Fighter', 41, 4457, 0, 1790, 833, 3, 395, 480, 30, 19, 1, 41, 31, 10, 67, 30, 10, 12, 1, 7, 43, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1500, 'PARASITE', 'Parasite', 37, 3090, 0, 1098, 478, 9, 175, 215, 5, 19, 1, 40, 20, 10, 90, 25, 10, 12, 1, 3, 44, 149, 200, 1152, 1152, 384, 7194, 1000, 7186, 1000, 7193, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1500, 'PARASITE', 'Parasite', 37, 3090, 0, 1098, 478, 9, 175, 215, 5, 19, 1, 40, 20, 10, 90, 25, 10, 12, 1, 3, 44, 149, 200, 1152, 1152, 384, 7194, 1000, 7186, 1000, 7193, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1502, 'FIRE_PORING', 'Fire 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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1503, 'GIBBET', 'Gibbet', 58, 6841, 0, 8011, 1824, 3, 238, 418, 28, 41, 1, 20, 60, 55, 182, 140, 10, 12, 2, 6, 27, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1504, 'DULLAHAN', 'Dullahan', 62, 12437, 0, 8517, 2963, 3, 418, 647, 47, 38, 1, 20, 60, 55, 282, 140, 10, 12, 1, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 2614, 5, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1505, 'LOLI_RURI', 'Loli Ruri', 71, 23470, 0, 16641, 4314, 3, 841, 1476, 39, 44, 1, 20, 60, 55, 132, 140, 10, 12, 2, 6, 82, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1506, 'DISGUISE', 'Disguise', 55, 7543, 0, 3615, 1919, 3, 267, 279, 18, 29, 1, 20, 60, 55, 102, 140, 10, 12, 1, 6, 82, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1507, 'BLOODY_MURDERER', 'Bloody Murderer', 72, 27521, 0, 18742, 3559, 3, 217, 864, 15, 15, 1, 20, 60, 55, 282, 140, 10, 12, 2, 7, 67, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 1305, 15, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1508, 'QUVE', 'Quve', 40, 4559, 0, 792, 247, 3, 170, 299, 12, 10, 1, 20, 60, 55, 102, 140, 10, 12, 0, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1509, 'LUDE', 'Lude', 36, 3214, 0, 814, 306, 3, 164, 287, 14, 12, 1, 20, 60, 55, 122, 140, 10, 12, 0, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1510, 'HYLOZOIST', 'Hylozoist', 40, 7186, 0, 4614, 1297, 3, 181, 317, 16, 51, 1, 20, 60, 55, 82, 140, 10, 12, 0, 1, 27, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1511, 'AMON_RA', 'Amon Ra', 88, 1214138, 0, 87264, 35891, 5, 929, 1647, 26, 52, 1, 1, 90, 124, 74, 45, 10, 12, 2, 7, 62, 181, 200, 1872, 672, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1512, 'HYEGUN', 'Hyegun', 56, 9981, 0, 2199, 1032, 3, 1, 1, 36, 28, 1, 1, 1, 1, 1, 1, 10, 12, 1, 1, 49, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 2614, 5, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1513, 'CIVIL_SERVANT', 'Civil Servant', 62, 14390, 0, 4023, 2750, 3, 1, 1, 20, 70, 1, 1, 1, 1, 1, 1, 10, 12, 1, 2, 44, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1514, 'DANCING_DRAGON', 'Dancing Dragon', 54, 5472, 0, 3030, 769, 3, 1, 1, 55, 52, 1, 1, 1, 1, 1, 1, 10, 12, 1, 9, 44, 131, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1515, 'GARM_BABY', 'Hatii Baby', 1, 1, 0, 1022, 2980, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 12, 1, 2, 41, 133, 300, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 1305, 15, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1516, 'INCREASE_SOIL', 'Increase Soil', 51, 8230, 0, 2760, 2110, 3, 1, 1, 23, 23, 1, 1, 1, 1, 1, 1, 10, 12, 1, 0, 62, 145, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1517, 'LI_ME_MANG_RYANG', 'Li Me Mang Ryang', 48, 5920, 0, 1643, 1643, 3, 1, 1, 19, 17, 1, 1, 1, 1, 1, 1, 10, 12, 1, 6, 62, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1517, 'LI_ME_MANG_RYANG', 'Li Me Mang Ryang', 48, 5920, 0, 1643, 1643, 3, 1, 1, 19, 17, 1, 1, 1, 1, 1, 1, 10, 12, 1, 6, 62, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1518, 'Bacsojin', 'Bacsojin', 75, 218652, 0, 33095, 18214, 1, 1219, 2169, 10, 51, 64, 85, 78, 85, 150, 60, 10, 12, 2, 1, 67, 181, 200, 1152, 1152, 480, 1164, 2, 1165, 2, 999, 500, 984, 1000, 985, 1000, 607, 500, 7151, 2000, 504, 500, 5000, 1000, 607, 500, 608, 500, 985, 500);
-INSERT INTO `mob_db` VALUES (1519, 'Chung_E', 'Chung E', 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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1520, 'Boiled_Rice', 'Boiled Rice', 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, 564, 5500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1900, 'VALARIS', 'Valaris', 99, 668000, 0, 107250, 37895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 676, 1152, 768, 1466, 200, 2256, 200, 2607, 800, 714, 500, 617, 3000, 984, 4300, 985, 5600, 4147, 1, 13000, 0, 608, 1000, 750, 400, 923, 3800);
-INSERT INTO `mob_db` VALUES (1901, 'VALARIS_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, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1970, '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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1971, '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, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1972, 'SPORE_', 'Spore', 9, 327, 0, 22, 17, 1, 24, 29, 0, 5, 1, 9, 9, 0, 14, 5, 10, 12, 1, 3, 21, 129, 200, 1872, 672, 288, 921, 5000, 507, 800, 510, 50, 743, 5, 2220, 40, 921, 5, 512, 0, 4022, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1973, 'PECOPECO_', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 5500, 2402, 20, 508, 50, 507, 900, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1974, 'ORK_WARRIOR_', 'Orc Warrior', 24, 1400, 0, 261, 160, 1, 104, 126, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 133, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1975, 'MUNAK_', 'Munak', 30, 2872, 0, 361, 218, 1, 180, 230, 0, 0, 1, 15, 20, 5, 46, 15, 10, 12, 1, 1, 29, 133, 200, 2468, 768, 288, 901, 5500, 2264, 1, 2404, 15, 609, 20, 2337, 1, 2305, 100, 1558, 5, 4090, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1976, 'ISIS_', 'Isis', 43, 4828, 0, 2396, 993, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 936, 5500, 2233, 5, 2603, 1, 733, 150, 732, 20, 954, 1000, 731, 5, 4116, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1977, '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, 938, 5500, 910, 1500, 511, 500, 514, 200, 729, 5, 512, 0, 512, 0, 4033, 5, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1978, '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, 133, 150, 676, 576, 480, 996, 30, 999, 100, 943, 5500, 912, 1300, 756, 129, 2259, 1, 1226, 2, 4115, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1979, '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, 992, 70, 999, 30, 910, 2400, 935, 3500, 943, 30, 998, 200, 1002, 500, 4042, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1980, '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, 916, 6500, 949, 700, 2302, 150, 507, 550, 519, 300, 715, 50, 512, 0, 4008, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1981, '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, 940, 5000, 909, 5500, 2298, 4, 1402, 80, 520, 10, 752, 5, 703, 3, 4021, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1982, '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, 945, 5500, 919, 5500, 516, 800, 2213, 2, 754, 2, 912, 6, 729, 3, 4044, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1983, '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, 942, 5500, 513, 1500, 508, 100, 919, 5000, 753, 5, 756, 24, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1984, '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, 990, 60, 940, 6500, 911, 400, 757, 49, 707, 20, 935, 3000, 512, 0, 4057, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1985, '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, 705, 6500, 949, 1000, 2262, 4, 1102, 100, 512, 600, 515, 1100, 622, 20, 4006, 15, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1986, '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, 133, 200, 1672, 672, 288, 7033, 5500, 2221, 20, 511, 550, 510, 50, 972, 30, 921, 1200, 912, 6, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1987, 'BAPHOMET__', 'Baphomet Jr.', 50, 8578, 0, 2706, 1480, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1988, 'DESERT_WOLF_B_', 'Desert Wolf Puppy', 9, 164, 0, 20, 16, 1, 30, 36, 0, 0, 1, 9, 9, 5, 21, 40, 10, 12, 0, 2, 23, 145, 300, 1600, 900, 240, 1010, 85, 919, 5500, 2306, 60, 517, 600, 2301, 200, 512, 0, 512, 0, 4023, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1989, 'DEVIRUCHI_', 'Deviruchi', 46, 7360, 0, 2662, 1278, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 1038, 5500, 1039, 400, 2255, 2, 1458, 2, 1009, 5, 912, 1500, 756, 154, 4122, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1990, '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, 1021, 5500, 757, 112, 1517, 2, 1613, 1, 969, 1, 1501, 300, 1005, 5, 4098, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1991, '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, 909, 7500, 1602, 80, 938, 500, 512, 1100, 713, 1700, 741, 5, 620, 20, 4004, 10, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1992, 'PETIT__', 'Petit', 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, 1035, 5500, 1037, 300, 756, 140, 509, 1000, 1510, 150, 912, 1500, 606, 15, 4118, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1993, '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, 919, 5500, 1302, 100, 517, 500, 1750, 1000, 949, 850, 1010, 80, 627, 20, 4017, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1994, '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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
-INSERT INTO `mob_db` VALUES (1995, 'BON_GUN_', 'Bon Gun', 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, 1094, 5500, 7014, 40, 618, 60, 2337, 2, 609, 15, 508, 1000, 502, 250, 5046, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+CREATE TABLE `item_db` (
+ `id` smallint(5) unsigned NOT NULL default '0',
+ `name_english` varchar(24) NOT NULL default '',
+ `name_japanese` varchar(24) NOT NULL default '',
+ `type` tinyint(2) unsigned NOT NULL default '0',
+ `price_buy` int(10) unsigned default NULL,
+ `price_sell` int(10) unsigned default NULL,
+ `weight` int(10) unsigned NOT NULL default '0',
+ `attack` mediumint(9) unsigned default NULL,
+ `defence` mediumint(9) unsigned default NULL,
+ `range` tinyint(2) unsigned default NULL,
+ `slots` tinyint(1) unsigned default NULL,
+ `equip_jobs` mediumint(8) unsigned default NULL,
+ `equip_genders` tinyint(1) unsigned default NULL,
+ `equip_locations` smallint(4) unsigned default NULL,
+ `weapon_level` tinyint(1) unsigned default NULL,
+ `equip_level` tinyint(3) unsigned default NULL,
+ `view` tinyint(3) unsigned default NULL,
+ `script_use` text,
+ `script_equip` text,
+ PRIMARY KEY (`id`)
+) TYPE=MyISAM;
+
+INSERT INTO `item_db` VALUES (501, 'Red_Potion', 'Red Potion', 0, 50, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
+INSERT INTO `item_db` VALUES (502, 'Orange_Potion', 'Orange Potion', 0, 200, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
+INSERT INTO `item_db` VALUES (503, 'Yellow_Potion', 'Yellow Potion', 0, 550, NULL, 130, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
+INSERT INTO `item_db` VALUES (504, 'White_Potion', 'White Potion', 0, 1200, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
+INSERT INTO `item_db` VALUES (505, 'Blue_Potion', 'Blue Potion', 0, 5000, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(40,59);', NULL);
+INSERT INTO `item_db` VALUES (506, 'Green_Potion', 'Green Potion', 0, 40, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion;', NULL);
+INSERT INTO `item_db` VALUES (507, 'Red_Herb', 'Red Herb', 0, 18, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(18,27),0;', NULL);
+INSERT INTO `item_db` VALUES (508, 'Yellow_Herb', 'Yellow Herb', 0, 40, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(38,57),0;', NULL);
+INSERT INTO `item_db` VALUES (509, 'White_Herb', 'White Herb', 0, 120, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(75,114),0;', NULL);
+INSERT INTO `item_db` VALUES (510, 'Blue_Herb', 'Blue Herb', 0, 60, NULL, 70, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(15,29);', NULL);
+INSERT INTO `item_db` VALUES (511, 'Green_Herb', 'Green Herb', 0, 10, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison;', NULL);
+INSERT INTO `item_db` VALUES (512, 'Apple', 'Apple', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(16,21),0;', NULL);
+INSERT INTO `item_db` VALUES (513, 'Banana', 'Banana', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(17,20),0;', NULL);
+INSERT INTO `item_db` VALUES (514, 'Grape', 'Grape', 0, 200, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(10,14);', NULL);
+INSERT INTO `item_db` VALUES (515, 'Carrot', 'Carrot', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(18,19),0;', NULL);
+INSERT INTO `item_db` VALUES (516, 'Sweet_Potato', 'Sweet Potato', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(15,22),0;', NULL);
+INSERT INTO `item_db` VALUES (517, 'Meat', 'Meat', 0, 50, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(70,99),0;', NULL);
+INSERT INTO `item_db` VALUES (518, 'Honey', 'Honey', 0, 500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(70,99),rand(20,39);', NULL);
+INSERT INTO `item_db` VALUES (519, 'Milk', 'Milk', 0, 25, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(27,36),0;', NULL);
+INSERT INTO `item_db` VALUES (520, 'Hinalle_Leaflet', 'Hinalle Leaflet', 0, 150, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
+INSERT INTO `item_db` VALUES (521, 'Aloe_Leaflet', 'Aloe Leaflet', 0, 360, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
+INSERT INTO `item_db` VALUES (522, 'Mastela_Fruit', 'Mastela Fruit', 0, 840, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(400,599),0;', NULL);
+INSERT INTO `item_db` VALUES (523, 'Holy_Water', 'Holy Water', 0, 20, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Curse;', NULL);
+INSERT INTO `item_db` VALUES (525, 'Panacea', 'Panacea', 0, 500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse;', NULL);
+INSERT INTO `item_db` VALUES (526, 'Royal_Jelly', 'Royal Jelly', 0, 7000, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),rand(40,59); sc_end SC_Posion; sc_end SC_Silence; sc_end SC_Blind; sc_end SC_Confusion; sc_end SC_Curse;', NULL);
+INSERT INTO `item_db` VALUES (528, 'Monster\'s_Feed', 'Monster\'s Feed', 0, 60, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(72,107),0;', NULL);
+INSERT INTO `item_db` VALUES (529, 'Candy', 'Candy', 0, 10, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
+INSERT INTO `item_db` VALUES (530, 'Candy_Cane', 'Candy Cane', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
+INSERT INTO `item_db` VALUES (531, 'Apple_Juice', 'Apple Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(25,34),0;', NULL);
+INSERT INTO `item_db` VALUES (532, 'Banana_Juice', 'Banana Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(26,33),0;', NULL);
+INSERT INTO `item_db` VALUES (533, 'Grape_Juice', 'Grape Juice', 0, 250, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(15,24);', NULL);
+INSERT INTO `item_db` VALUES (534, 'Carrot_Juice', 'Carrot Juice', 0, 20, NULL, 40, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(27,32),0;', NULL);
+INSERT INTO `item_db` VALUES (535, 'Pumkin', 'Pumpkin', 0, 15, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 19,0;', NULL);
+INSERT INTO `item_db` VALUES (536, 'Ice_Cream', 'Ice Cream', 0, 150, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(105,144),0;', NULL);
+INSERT INTO `item_db` VALUES (537, 'Pet_Food', 'Pet Food', 0, 1000, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,89),0;', NULL);
+INSERT INTO `item_db` VALUES (538, 'Well-baked_Cookie', 'Well-baked Cookie', 0, 1000, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(160,199),0;', NULL);
+INSERT INTO `item_db` VALUES (539, 'Piece_of_Cake', 'Piece of Cake', 0, 3000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(270,329),0;', NULL);
+INSERT INTO `item_db` VALUES (540, 'Falcon_food', 'Falcon food', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (541, 'Pecopeco_food', 'Pecopeco food', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (542, 'Festive_Cookie', 'Festive Cookie', 0, 10, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
+INSERT INTO `item_db` VALUES (543, 'Festive_Rainbow_Cake', 'Festive Rainbow Cake', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
+INSERT INTO `item_db` VALUES (544, 'Raw_Fish', 'Raw Fish', 0, 20, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(25,59),0;', NULL);
+INSERT INTO `item_db` VALUES (545, 'Condensed_Red_Potion', 'Condensed Red Potion', 0, NULL, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(45,64),0;', NULL);
+INSERT INTO `item_db` VALUES (546, 'Condensed_Yellow_Potion', 'Condensed Yellow Potion', 0, NULL, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
+INSERT INTO `item_db` VALUES (547, 'Condensed_White_Potion', 'Condensed White Potion', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(325,404),0;', NULL);
+INSERT INTO `item_db` VALUES (548, 'Cheese', 'Cheese', 0, 2800, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 0,rand(10,14);', NULL);
+INSERT INTO `item_db` VALUES (549, 'Yam', 'Hot Potato', 0, 180, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,99),0;', NULL);
+INSERT INTO `item_db` VALUES (550, 'Rice_Cake', 'Rice Popper', 0, NULL, 5, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(10,14),0;', NULL);
+INSERT INTO `item_db` VALUES (551, 'Sushi', 'Sushi', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(50,60),0;', NULL);
+INSERT INTO `item_db` VALUES (552, 'Ketupat', 'Ketupat', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(100,200),0;', NULL);
+INSERT INTO `item_db` VALUES (553, 'Dumpling', 'Dumpling', 0, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(39,68),0;', NULL);
+INSERT INTO `item_db` VALUES (554, 'Mochi', 'Mochi', 0, 100, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(100,200),0;', NULL);
+INSERT INTO `item_db` VALUES (555, 'Rice_Cake', 'Rice_Cake', 0, NULL, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal rand(30,50),0;', NULL);
+INSERT INTO `item_db` VALUES (556, 'Rolled_Rice', 'Rolled Rice', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (557, 'Cut_Rice_Rolls', 'Cut Rice Rolls', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (558, 'Chocolate', 'Chocolate', 0, 500, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 1,1;', NULL);
+INSERT INTO `item_db` VALUES (559, 'Hand-made_Chocolate', 'Hand-made Chocolate', 0, 5000, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemheal 50,50;', NULL);
+INSERT INTO `item_db` VALUES (560, 'White_Chocolate', 'White Chocolate', 0, 0, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (561, 'Milk_Chocolate_Bar', 'Milk Chocolate', 0, 0, NULL, 80, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (562, 'Pizza', 'Pizza', 0, NULL, NULL, 150, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (563, 'Pizza_', 'Pizza', 0, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (564, 'Meat_Dumpling', 'Meat Dumpling', 0, NULL, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'itemheal rand(175,234),0;', NULL);
+INSERT INTO `item_db` VALUES (601, 'Fly_Wing', 'Fly Wing', 2, 60, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'warp "Random",0,0;', NULL);
+INSERT INTO `item_db` VALUES (602, 'Butterfly_Wing', 'Butterfly Wing', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'warp "SavePoint",0,0;', NULL);
+INSERT INTO `item_db` VALUES (603, 'Old_Blue_Box', 'Old Blue Box', 2, 10000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -1,1;', NULL);
+INSERT INTO `item_db` VALUES (604, 'Dead_Branch', 'Dead Branch', 2, 50, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'monster "this",0,0,"--ja--",-1,1,;', NULL);
+INSERT INTO `item_db` VALUES (605, 'Anodyne', 'Anodyne', 2, 2000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 8,1,"??????????";', NULL);
+INSERT INTO `item_db` VALUES (606, 'Aloevera', 'Aloevera', 2, 1500, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 6,1,"?????";', NULL);
+INSERT INTO `item_db` VALUES (607, 'Yggdrasilberry', 'Yggdrasilberry', 0, 2, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 100,100;', NULL);
+INSERT INTO `item_db` VALUES (608, 'Yggdrasil_Seed', 'Yggdrasil Seed', 0, 5000, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 50,50;', NULL);
+INSERT INTO `item_db` VALUES (609, 'Amulet', 'Amulet', 2, 100, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (610, 'Yggdrasil_Leaf', 'Yggdrasil Leaf', 2, 4000, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 54,1,"????????";', NULL);
+INSERT INTO `item_db` VALUES (611, 'Magnifier', 'Magnifier', 2, 40, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'itemskill 40,1,"???";', NULL);
+INSERT INTO `item_db` VALUES (612, 'Mini_Furnace', 'Mini Furnace', 2, 150, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 16;', NULL);
+INSERT INTO `item_db` VALUES (613, 'Iron_Hammer', 'Iron Hammer', 2, 1000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 1;', NULL);
+INSERT INTO `item_db` VALUES (614, 'Golden_Hammer', 'Golden Hammer', 2, 3000, NULL, 300, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 2;', NULL);
+INSERT INTO `item_db` VALUES (615, 'Oridecon_Hammer', 'Oridecon Hammer', 2, 5000, NULL, 400, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'produce 3;', NULL);
+INSERT INTO `item_db` VALUES (616, 'Old_Card_Album', 'Old Card Album', 2, 10000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -3,1;', NULL);
+INSERT INTO `item_db` VALUES (617, 'Old_Violet_Box', 'Old Violet Box', 2, 10000, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -2,1;', NULL);
+INSERT INTO `item_db` VALUES (618, 'Worn_Out_Scroll', 'Worn Out Scroll', 2, 50, NULL, 20, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -5,1;', NULL);
+INSERT INTO `item_db` VALUES (619, 'Unripe_Apple', 'Unripe Apple', 2, 1000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1002;', NULL);
+INSERT INTO `item_db` VALUES (620, 'Orange_Juice', 'Orange Juice', 2, 1500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1113;', NULL);
+INSERT INTO `item_db` VALUES (621, 'Bitter_Herb', 'Bitter Herb', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1031;', NULL);
+INSERT INTO `item_db` VALUES (622, 'Rainbow_Carrot', 'Rainbow Carrot', 2, 2500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1063;', NULL);
+INSERT INTO `item_db` VALUES (623, 'Earthworm_the_Dude', 'Earthworm the Dude', 2, 4000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1049;', NULL);
+INSERT INTO `item_db` VALUES (624, 'Rotten_Fish', 'Rotten Fish', 2, 2500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1011;', NULL);
+INSERT INTO `item_db` VALUES (625, 'Rusty_Iron', 'Rusty Iron', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1042;', NULL);
+INSERT INTO `item_db` VALUES (626, 'Monster_Juice', 'Monster Juice', 2, 1500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1035;', NULL);
+INSERT INTO `item_db` VALUES (627, 'Sweet_Milk', 'Sweet Milk', 2, 7000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1167;', NULL);
+INSERT INTO `item_db` VALUES (628, 'Well_Dried_Bone', 'Well Dried Bone', 2, 10000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1107;', NULL);
+INSERT INTO `item_db` VALUES (629, 'Singing_Flower', 'Singing Flower', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1052;', NULL);
+INSERT INTO `item_db` VALUES (630, 'Dew_Laden_Moss', 'Dew Laden Moss', 2, 10, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1014;', NULL);
+INSERT INTO `item_db` VALUES (631, 'Deadly_Noxious_Herb', 'Deadly Noxious Herb', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1077;', NULL);
+INSERT INTO `item_db` VALUES (632, 'Fatty_Chubby_Earthworm', 'Fatty Chubby Earthworm', 2, 5000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1019;', NULL);
+INSERT INTO `item_db` VALUES (633, 'Baked_Yam', 'Baked Yam', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1056;', NULL);
+INSERT INTO `item_db` VALUES (634, 'Tropical_Banana', 'Tropical Banana', 2, 20, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1057;', NULL);
+INSERT INTO `item_db` VALUES (635, 'Horror_of_Tribe', 'Horror of Tribe', 2, 300, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1023;', NULL);
+INSERT INTO `item_db` VALUES (636, 'No_Recipient', 'No Recipient', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1026;', NULL);
+INSERT INTO `item_db` VALUES (637, 'Old_Broom', 'Old Broom', 2, 350, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1110;', NULL);
+INSERT INTO `item_db` VALUES (638, 'Silver_Knife_of_Chastity', 'Silver Knife of Chastity', 2, 12000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1170;', NULL);
+INSERT INTO `item_db` VALUES (639, 'Armlet_of_Obedience', 'Armlet of Obedience', 2, 18000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1029;', NULL);
+INSERT INTO `item_db` VALUES (640, 'Shining_Stone', 'Shining Stone', 2, 3000, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1155;', NULL);
+INSERT INTO `item_db` VALUES (641, 'Contract_in_Shadow', 'Contracts in Shadow', 2, 100, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1109;', NULL);
+INSERT INTO `item_db` VALUES (642, 'Book_of_Devil', 'Book of Devil', 2, 1800, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1101;', NULL);
+INSERT INTO `item_db` VALUES (643, 'Pet_Incubator', 'Pet Incubator', 2, 3000, NULL, 30, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'bpet;', NULL);
+INSERT INTO `item_db` VALUES (644, 'Gift_Box', 'Gift Box', 2, 2, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
+INSERT INTO `item_db` VALUES (645, 'Concentration_Potion', 'Concentration Potion', 2, 800, NULL, 100, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_SpeedPot0,1800,0;', NULL);
+INSERT INTO `item_db` VALUES (656, 'Awakening_Potion', 'Awakening Potion', 2, 1500, NULL, 150, NULL, NULL, NULL, NULL, 8904431, 2, NULL, NULL, 40, NULL, 'sc_start SC_SpeedPot1,1800,0;', NULL);
+INSERT INTO `item_db` VALUES (657, 'Berserk_Potion', 'Berserk Potion', 2, 3000, NULL, 200, NULL, NULL, NULL, NULL, 411302, 2, NULL, NULL, 85, NULL, 'sc_start SC_SpeedPot2,1800,0;', NULL);
+INSERT INTO `item_db` VALUES (658, 'Tribal_Solidarity', 'Tribal Solidarity', 3, 1000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (659, 'Her_Heart', 'Her Heart', 2, 500, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1188;', NULL);
+INSERT INTO `item_db` VALUES (660, 'Forbidden_Red_Candle', 'Red Candle', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1200;', NULL);
+INSERT INTO `item_db` VALUES (661, 'Sky_Apron', 'Sky Apron', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'pet 1275;', NULL);
+INSERT INTO `item_db` VALUES (663, 'Rice_Cake', 'Rice Cake', 0, NULL, NULL, 10, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'percentheal 10,10;', NULL);
+INSERT INTO `item_db` VALUES (664, 'Gift_Box_', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
+INSERT INTO `item_db` VALUES (665, 'Gift_Box__', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
+INSERT INTO `item_db` VALUES (666, 'Gift_Box___', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
+INSERT INTO `item_db` VALUES (667, 'Gift_Box____', 'Gift Box', 2, NULL, NULL, 200, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'getitem -4,1;', NULL);
+INSERT INTO `item_db` VALUES (668, 'Angpow', 'Angpow', 0, 1, NULL, 2, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'set Zeny,Zeny+rand(100,10000);', NULL);
+INSERT INTO `item_db` VALUES (669, 'Rice_Cake_Soup', 'Rice Cake Soup', 2, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (670, 'Gold_Coin_Pouch', 'Gold Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (671, 'Gold_Coin', 'Gold Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (672, 'Copper_Coin_Pouch', 'Copper Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (673, 'Copper_Coin', 'Copper_Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (674, 'Mysterious_Ore_Coin', 'Mysterious Ore Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (675, 'Silver_Coin', 'Silver Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (676, 'Silver_Coin_Pouch', 'Silver Coin Pouch', 2, NULL, NULL, 400, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (677, 'Platinum Coin', 'Platinum Coin', 2, NULL, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (678, 'Deadly_Poison_Bottle', 'Deadly Poison Bottle', 2, NULL, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (679, 'Recall_Pills', 'Recall Pills', 2, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (680, 'Carnation', 'Carnation', 2, NULL, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (681, 'Wedding_Photo_Album', 'Wedding Photo Album', 2, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (682, 'Realgar_Wine', 'Realgar Wine', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_ATKPOT,30,30;', NULL);
+INSERT INTO `item_db` VALUES (683, 'Exorcize_Herb', 'Exorcize Herb', 2, NULL, NULL, 50, NULL, NULL, NULL, NULL, 10477567, 2, NULL, NULL, NULL, NULL, 'sc_start SC_MATKPOT,30,30;', NULL);
+INSERT INTO `item_db` VALUES (701, 'Ora_Ora', 'Ora Ora', 3, 55000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (702, 'Animal_Gore', 'Animal Gore', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (703, 'Hinalle', 'Hinalle', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (704, 'Aloe', 'Aloe', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (705, 'Clover', 'Clover', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (706, 'Four_Leaf_Clover', 'Four-Leaf Clover', 3, 80000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (707, 'Singing_Plant', 'Singing Plant', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (708, 'Ment', 'Ment', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (709, 'Izidor', 'Izidor', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (710, 'Illusion_Flower', 'Illusion Flower', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (711, 'Shoot', 'Shoot', 3, 16, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (712, 'Flower', 'Flower', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (713, 'Empty_Bottle', 'Empty Bottle', 3, 6, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (714, 'Emperium', 'Emperium', 3, 2, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (715, 'Yellow_Gemstone', 'Yellow Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (716, 'Red_Gemstone', 'Red Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (717, 'Blue_Gemstone', 'Blue Gemstone', 3, 600, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (718, 'Garnet', 'Garnet', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (719, 'Amethyst', 'Amethyst', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (720, 'Aquamarine', 'Aquamarine', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (721, 'Emerald', 'Emerald', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (722, 'Pearl', 'Pearl', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (723, 'Ruby', 'Ruby', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (724, 'Cursed_Ruby', 'Cursed Ruby', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (725, 'Sardonyx', 'Sardonyx', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (726, 'Sapphire', 'Sapphire', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (727, 'Opal', 'Opal', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (728, 'Topaz', 'Topaz', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (729, 'Zircon', 'Zircon', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (730, '1_Carat_Diamond', '1 Carat Diamond', 3, 10000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (731, '2_Carat_Diamond', '2 Carat Diamond', 3, 25000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (732, '3_Carat_Diamond', '3 Carat Diamond', 3, 55000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (733, 'Cracked_Diamond', 'Cracked Diamond', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (734, 'Red_Frame', 'Red Frame', 3, 3000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (735, 'Chung_Jah', 'Chung Jah', 3, 5000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (736, 'China', 'China', 3, 1000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (737, 'Black_Ladle', 'Black Ladle', 3, 400, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (738, 'Pencil_Case', 'Pencil Case', 3, 300, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (739, 'Rouge', 'Rouge', 3, 10000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (740, 'Puppet', 'Puppet', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (741, 'Poring_Doll', 'Poring Doll', 3, 1800, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (742, 'Chonchon_Doll', 'Chonchon Doll', 3, 3000, 1000, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (743, 'Spore_Doll', 'Spore Doll', 3, 5500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (744, 'Bouquet', 'Bouquet', 3, 2000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (745, 'Wedding_Bouquet', 'Wedding Bouquet', 3, 10000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (746, 'Glass_Bead', 'Glass Bead', 3, 1400, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (747, 'Crystal_Mirror', 'Crystal Mirror', 3, 15000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (748, 'Witherless_Rose', 'Witherless Rose', 3, 55000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (749, 'Frozen_Rose', 'Frozen Rose', 3, 35000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (750, 'Baphomet_Doll', 'Baphomet Doll', 3, 18000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (751, 'Osiris_Doll', 'Osiris Doll', 3, 14000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (752, 'Rocker_Doll', 'Grasshopper Doll', 3, 4000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (753, 'Yoyo_Doll', 'Yoyo Doll', 3, 6000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (754, 'Raccoon_Doll', 'Raccoon Doll', 3, 5000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (756, 'Rough_Oridecon', 'Rough Oridecon', 3, 548, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (757, 'Rough_Elunium', 'Rough Elunium', 3, 648, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (901, 'Danggie', 'Danggie', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (902, 'Tree_Root', 'Tree Root', 3, 12, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (903, 'Reptile_Tongue', 'Reptile Tongue', 3, 50, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (904, 'Scorpion_Tail', 'Scorpion Tail', 3, 124, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (905, 'Stem', 'Stem', 3, 58, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (906, 'Pointed_Scale', 'Pointed Scale', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (907, 'Resin', 'Resin', 3, 120, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (908, 'Spawn', 'Spawn', 3, 148, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (909, 'Jellopy', 'Jellopy', 3, 6, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (910, 'Garlet', 'Garlet', 3, 40, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (911, 'Scell', 'Scell', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (912, 'Zargon', 'Zargon', 3, 480, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (913, 'Tooth_of_Bat', 'Tooth of Bat', 3, 34, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (914, 'Fluff', 'Fluff', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (915, 'Chrysalis', 'Chrysalis', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (916, 'Feather_of_Birds', 'Feather of Birds', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (917, 'Talon', 'Talon', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (918, 'Sticky_Webfoot', 'Sticky Webfoot', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (919, 'Animal_Skin', 'Animal Skin', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (920, 'Wolf_Claw', 'Wolf Claw', 3, 58, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (921, 'Mushroom_Spore', 'Mushroom Spore', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (922, 'Orc\'s_Fang', 'Orc\'s Fang', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (923, 'Evil_Horn', 'Evil Horn', 3, 1020, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (924, 'Powder_of_Butterfly', 'Powder of Butterfly', 3, 90, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (925, 'Bill_of_Birds', 'Bill of Birds', 3, 64, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (926, 'Snake_Scale', 'Snake Scale', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (928, 'Insect_Feeler', 'Insect Feeler', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (929, 'Immortal_Heart', 'Immortal Heart', 3, 374, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (930, 'Rotten_Bandage', 'Rotten Bandage', 3, 358, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (931, 'Orcish_Voucher', 'Orcish Voucher', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (932, 'Skel-Bone', 'Skel-Bone', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (934, 'Memento', 'Memento', 3, 600, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (935, 'Shell', 'Shell', 3, 14, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (936, 'Scale_Shell', 'Scale Shell', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (937, 'Venom_Canine', 'Venom Canine', 3, 148, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (938, 'Sticky_Mucus', 'Sticky Mucus', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (939, 'Bee_Sting', 'Bee Sting', 3, 32, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (940, 'Grasshopper\'s_Leg', 'Grasshopper\'s Leg', 3, 36, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (941, 'Nose_Ring', 'Nose Ring', 3, 568, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (942, 'Yoyo_Tail', 'Yoyo Tail', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (943, 'Solid_Shell', 'Solid Shell', 3, 448, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (944, 'Horseshoe', 'Horseshoe', 3, 588, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (945, 'Raccoon_Leaf', 'Raccoon Leaf', 3, 106, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (946, 'Snail\'s_Shell', 'Snail\'s Shell', 3, 64, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (947, 'Horn', 'Horn', 3, 116, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (948, 'Bear\'s_Footskin', 'Bear\'s Footskin', 3, 174, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (949, 'Feather', 'Feather', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (950, 'Heart_of_Mermaid', 'Heart of Mermaid', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (951, 'Fin', 'Fin', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (952, 'Cactus_Needle', 'Cactus Needle', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (953, 'Stone_Heart', 'Stone Heart', 3, 184, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (954, 'Shining_Scale', 'Shining Scale', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (955, 'Worm_Peeling', 'Worm Peeling', 3, 52, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (956, 'Gill', 'Gill', 3, 342, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (957, 'Decayed_Nail', 'Decayed Nail', 3, 82, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (958, 'Horrendous_Mouth', 'Horrendous Mouth', 3, 390, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (959, 'Stinky_Scale', 'Stinky Scale', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (960, 'Nipper', 'Nipper', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (961, 'Conch', 'Conch', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (962, 'Tentacle', 'Tentacle', 3, 70, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (963, 'Sharp_scale', 'Sharp Scale', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (964, 'Crab_Shell', 'Crap Shell', 3, 90, 5, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (965, 'Clam_Shell', 'Clam Shell', 3, 56, 5, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (966, 'Clam_Flesh', 'Clam Flesh', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (967, 'Turtle_Shell', 'Turtle Shell', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (968, 'Heroic_Emblem', 'Heroic Emblem', 3, 3000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (969, 'Gold', 'Gold', 3, 200000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (970, 'Alcohol', 'Alcohol', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (971, 'Detrimindexta', 'Detrimindexta', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (972, 'Karvodailnirol', 'Karvodailnirol', 3, 400, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (973, 'Counteragent', 'Counteragent', 3, 200, NULL, 70, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (974, 'Mixture', 'Mixture', 3, 200, NULL, 70, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (975, 'Scarlet_Dyestuffs', 'Scarlet Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (976, 'Lemon_Dyestuffs', 'Lemon Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (978, 'Cobaltblue_Dyestuffs', 'Cobaltblue Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (979, 'Darkgreen_Dyestuffs', 'Darkgreen Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (980, 'Orange_Dyestuffs', 'Orange Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (981, 'Violet_Dyestuffs', 'Violet Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (982, 'White_Dyestuffs', 'White Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (983, 'Black_Dyestuffs', 'Black Dyestuffs', 3, 1000, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (984, 'Oridecon', 'Oridecon', 3, 1100, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (985, 'Elunium', 'Elunium', 3, 1100, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (986, 'Anvil', 'Anvil', 3, 30000, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (987, 'Oridecon_Anvil', 'Oridecon Anvil', 3, 120000, NULL, 700, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (988, 'Golden_Anvil', 'Golden Anvil', 3, 300000, NULL, 900, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (989, 'Emperium_Anvil', 'Emperium Anvil', 3, 600000, NULL, 1000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (990, 'Red_Blood', 'Red Blood', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (991, 'Crystal_Blue', 'Crystal Blue', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (992, 'Wind_of_Verdure', 'Wind of Verdure', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (993, 'Green_Live', 'Green Live', 3, 1000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (994, 'Flame_Heart', 'Flame Heart', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (995, 'Mystic_Frozen', 'Mystic Frozen', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (996, 'Rough_Wind', 'Rough Wind', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (997, 'Great_Nature', 'Great Nature', 3, 3000, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (998, 'Iron', 'Iron', 3, 100, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (999, 'Steel', 'Steel', 3, 1000, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1000, 'Star_Crumb', 'Star Crumb', 3, 4500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1001, 'Star_Dust', 'Star Dust', 3, 1500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1002, 'Iron_Ore', 'Iron Ore', 3, 50, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1003, 'Coal', 'Coal', 3, 500, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1004, 'Chivalry_Emblem', 'Chivalry Emblem', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1005, 'Hammer_of_Blacksmith', 'Hammer of Blacksmith', 3, 2, NULL, 800, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1006, 'Old_Magic_Book', 'Old Magic Book', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1007, 'Necklace_of_Wisdom', 'Necklace of Wisdom', 3, 2, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1008, 'Necklace_of_Oblivion', 'Necklace of Oblivion', 3, 2, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1009, 'Hand_of_God', 'Hand of God', 3, 2, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1010, 'Phracon', 'Phracon', 3, 200, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1011, 'Emveretarcon', 'Emveretarcon', 3, 1000, NULL, 200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1012, 'Frill', 'Frill', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1013, 'Rainbow_Shell', 'Rainbow Shell', 3, 90, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1014, 'Ant_Jaw', 'Ant Jaw', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1015, 'Tongue', 'Tongue', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1016, 'Rat_Tail', 'Rat Tail', 3, 52, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1017, 'Mole_Whiskers', 'Mole Whiskers', 3, 106, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1018, 'Mole_Claw', 'Mole Claw', 3, 210, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1019, 'Trunk', 'Trunk', 3, 60, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1020, 'Black_Hair', 'Black Hair', 3, 292, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1021, 'Dokkaebi_Horn', 'Dokkaebi Horn', 3, 292, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1022, 'Nine_Tails', 'Nine Tails', 3, 650, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1023, 'Fish_Tail', 'Fish Tail', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1024, 'Squid_Ink', 'Squid ink', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1025, 'Cobweb', 'Cobweb', 3, 184, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1026, 'Acorn', 'Acorn', 3, 98, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1027, 'Porcupine_Quill', 'Porcupine Quill', 3, 158, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1028, 'Mane', 'Mane', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1029, 'Tiger_Skin', 'Tiger Skin', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1030, 'Tiger\'s_Footskin', 'Tiger\'s Footskin', 3, 1500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1031, 'Mantis_Scythe', 'Mantis Scythe', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1032, 'Maneater_Blossom', 'Maneater Blossom', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1033, 'Maneater_Root', 'Maneater Root', 3, 208, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1034, 'Blue_Hair', 'Blue Hair', 3, 342, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1035, 'Dragon_Canine', 'Dragon Canine', 3, 484, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1036, 'Dragon_Scale', 'Dragon Scale', 3, 500, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1037, 'Dragon_Tail', 'Dragon Tail', 3, 1200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1038, 'Little_Evil_Horn', 'Little Evil Horn', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1039, 'Little_Evil_Wing', 'Little Evil Wing', 3, 2000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1040, 'Elder_Pixie\'s_Moustache', 'Elder Pixie\'s Moustache', 3, 232, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1041, 'Lantern', 'Lantern', 3, 250, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1042, 'Bug_Leg', 'Bug Leg', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1043, 'Orc_Claw', 'Orc Claw', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1044, 'Zenorc\'s_Fang', 'Zenorc\'s Fang', 3, 264, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1045, 'Cultish_Masque', 'Cultish Masque', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1046, 'Scorpion_Nipper', 'Scorpion Nipper', 3, 614, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1047, 'Dead_Medusa', 'Dead Medusa', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1048, 'Horrendous_Hair', 'Horrendous Hair', 3, 800, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1049, 'Skirt_of_Virgin', 'Skirt of Virgin', 3, 1700, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1050, 'Tendon', 'Tendon', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1051, 'Detonator', 'Detonator', 3, 450, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1052, 'Single_Cell', 'Single Cell', 3, 46, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1053, 'Ancient_Tooth', 'Ancient Tooth', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1054, 'Ancient_Lips', 'Ancient Lips', 3, 1000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1055, 'Earthworm_Peeling', 'Earthworm Peeling', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1056, 'Grit', 'Grit', 3, 306, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1057, 'Moth_Dust', 'Moth Dust', 3, 138, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1058, 'Moth_Wings', 'Moth Wings', 3, 200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1059, 'Fabric', 'Fabric', 3, 306, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1060, 'Golden_Hair', 'Golden Hair', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1061, 'Witched_Starsand', 'Witched Starsand', 3, 484, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1062, 'Jack_o\'_Pumpkin', 'Jack o\' Pumpkin', 3, 374, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1063, 'Fang', 'Fang', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1064, 'Reins', 'Reins', 3, 802, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1065, 'Trap', 'Trap', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1066, 'Fine-grained_Trunk', 'Fine-grained Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1067, 'Solid_Trunk', 'Solid Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1068, 'Barren_Trunk', 'Barren Trunk', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1069, 'Orange_Net_Mushroom', 'Orange Net Mushroom', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1070, 'Orange_Gooey_Mushroom_', 'Orange Gooey Mushroom', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1071, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1072, 'Delivery_Message', 'DEL Message', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1073, 'Voucher', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1074, 'Voucher_', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1075, 'Voucher__', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1076, 'Voucher___', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1077, 'Voucher____', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1078, 'Voucher_____', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1079, 'Voucher______', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1080, 'Voucher_______', 'Voucher', 3, 2, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1081, 'Delivery_Box', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1082, 'Delivery_Box_', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1083, 'Delivery_Box__', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1084, 'Kafra_Pass', 'Kapra Pass', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1085, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1086, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1087, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1088, 'Morroc_Solution', 'Morocc Solution', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1089, 'Payon_Solution', 'Payon Solution', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1090, 'Unknown_Test_Tube', 'Unknown Testtube', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1091, 'Delivery_Box', 'DEL Box', 3, 2, NULL, 1200, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1092, 'Empty_Test_Tube', 'Empty Testtube', 3, 3, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1093, 'Empty_Potion_Bottle', 'Empty Potion Bottle', 3, 10, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1094, 'Short_Daenggie', 'Short Daenggie', 3, 278, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1095, 'Clock_Hand', 'Needle of Alarm', 3, 546, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1096, 'Round_Shell', 'Round Shell', 3, 954, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1097, 'Worn_Out_Page', 'Worn Out Page', 3, 820, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1098, 'Manacles', 'Manacles', 3, 658, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1099, 'Worn-out_Prison_Uniform', 'Worn-out Prison Uniform', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1101, 'Sword', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1102, 'Sword_', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1103, 'Sword__', 'Sword', 4, 100, NULL, 500, 25, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1104, 'Falchion', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1105, 'Falchion_', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1106, 'Falchion__', 'Falchion', 4, 1500, NULL, 600, 39, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1107, 'Blade', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 3, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1108, 'Blade_', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 4, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1109, 'Blade__', 'Blade', 4, 2900, NULL, 700, 53, NULL, 1, 0, 8803555, 2, 2, 1, 2, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1110, 'Rapier', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 2, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1111, 'Rapier_', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 3, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1112, 'Rapier__', 'Rapier', 4, 10000, NULL, 500, 70, NULL, 1, 0, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1113, 'Scimiter', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 2, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1114, 'Scimiter_', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 3, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1115, 'Scimiter__', 'Scimiter', 4, 17000, NULL, 700, 85, NULL, 1, 0, 8803555, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1116, 'Katana', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 3, 16514, 2, 34, 1, 4, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1117, 'Katana_', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 4, 16514, 2, 34, 1, 4, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1118, 'Katana__', 'Katana', 4, 2000, NULL, 1000, 60, NULL, 1, 0, 16514, 2, 34, 1, 4, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1119, 'Tsurugi', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 1, 414946, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1120, 'Tsurugi_', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1121, 'Tsurugi__', 'Tsurugi', 4, 51000, NULL, 1200, 130, NULL, 1, 0, 414946, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1122, 'Ring_Pommel_Saber', 'Ring Pommel Saber', 4, 24000, NULL, 900, 100, NULL, 1, 2, 414946, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1123, 'Haedonggum', 'Haedonggum', 4, 50000, NULL, 900, 120, NULL, 1, 1, 414946, 2, 2, 3, 27, 2, NULL, 'bonus bInt,3;');
+INSERT INTO `item_db` VALUES (1124, 'Orcish_Sword', 'Orcish sword', 4, 20, NULL, 800, 90, NULL, 1, 0, 8803555, 2, 2, 3, 5, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1125, 'Ring_Pommel_Saber_', 'Ring Pommel Saber', 4, 24000, NULL, 900, 100, NULL, 1, 3, 414946, 2, 2, 2, 14, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1126, 'Saber', 'Saber', 4, 49000, NULL, 1000, 115, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1127, 'Saber_', 'Saber', 4, 49000, NULL, 1000, 115, NULL, 1, 3, 414946, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1128, 'Haedonggum_', 'Haedonggum', 4, 50000, NULL, 900, 120, NULL, 1, 2, 414946, 2, 2, 3, 27, 2, NULL, 'bonus bInt,3;');
+INSERT INTO `item_db` VALUES (1129, 'Flamberge', 'Flamberge', 4, 60000, NULL, 1500, 150, NULL, 1, 0, 16512, 2, 2, 3, 27, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1130, 'Nagan', 'Nagan', 4, 20, NULL, 500, 120, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bDoubleRate,25; bonus2 bAddRace,7,5;');
+INSERT INTO `item_db` VALUES (1131, 'Ice_Falchion', 'Ice Falchion', 4, 20, NULL, 600, 100, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,1; skill 14,3; bonus2 bAddEff,Eff_Freeze,500; bonus3 bAutoSpell,14,3,25;');
+INSERT INTO `item_db` VALUES (1132, 'Edge', 'Edge', 4, 20, NULL, 700, 115, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bAddEff,Eff_Curse,300; bonus2 bWeaponComaRace,11,10;');
+INSERT INTO `item_db` VALUES (1133, 'Fire_Brand', 'Fire Brand', 4, 20, NULL, 500, 100, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,3; skill 19,3; bonus3 bAutoSpell,19,3,25;');
+INSERT INTO `item_db` VALUES (1134, 'Caesar\'s_Sword', 'Caesar\'s Sword', 4, 20, NULL, 700, 140, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bAddRace,3,25; bonus bIgnoreDefRace,3;');
+INSERT INTO `item_db` VALUES (1135, 'Cutlas', 'Cutlas', 4, 20, NULL, 900, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'skill 5,5; bonus bStr,2; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (1136, 'Solar_Sword', 'Solar Sword', 4, 20, NULL, 1200, 85, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,3; bonus2 bHPDrainRate,100,1;');
+INSERT INTO `item_db` VALUES (1137, 'Excalibur', 'Excalibur', 4, 20, NULL, 1200, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bInt,5; bonus bLuk,10; bonus bDex,-1; bonus bAtkEle,6;');
+INSERT INTO `item_db` VALUES (1138, 'Mysteltainn_', 'Mysteltainn', 4, 20, NULL, 1000, 170, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,7; bonus2 bAddEle,8,15; bonus2 bAddEff,Eff_Stone,100; bonus bDex,3;');
+INSERT INTO `item_db` VALUES (1139, 'Talefing_', 'Talefing', 4, 20, NULL, 1000, 200, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (1140, 'Byeollungum', 'Byeollungum', 4, 20, NULL, 900, 150, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus2 bSubRace,11,-10; bonus2 bAddRace,10,50; bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (1141, 'Immaterial_Sword', 'Immaterial Sword', 4, 20, NULL, 900, 140, NULL, 1, 0, 414946, 2, 2, 4, 40, 2, NULL, 'bonus bAtkEle,8;');
+INSERT INTO `item_db` VALUES (1142, 'Jewel_Sword', 'Crystal Sword', 4, 20, NULL, 2200, 104, NULL, 1, 0, 414946, 2, 2, 3, 68, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1143, 'Gaia_Sword', 'Gaia Sword', 4, 20, NULL, 2500, 115, NULL, 1, 0, 414946, 2, 2, 3, 74, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (1144, 'Sashimi', 'Sashimi', 4, 20, NULL, 1400, 75, NULL, 1, 0, 414946, 2, 2, 3, 48, 2, NULL, 'bonus bAtkEle,4; bonus3 bAddMonsterDropItem,544,5,2500;');
+INSERT INTO `item_db` VALUES (1145, 'Holy_Avenger', 'Holy Avenger', 4, 20, NULL, 1350, 125, NULL, 1, 0, 16384, 2, 2, 3, 75, 2, NULL, 'bonus bAtkEle,6; bonus bVit,2;');
+INSERT INTO `item_db` VALUES (1151, 'Slayer', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 2, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1152, 'Slayer_', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 3, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1153, 'Slayer__', 'Slayer', 4, 15000, NULL, 1300, 90, NULL, 1, 0, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1154, 'Bastard_Sword', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 2, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1155, 'Bastard_Sword_', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 3, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1156, 'Bastard_Sword__', 'Bastard Sword', 4, 22500, NULL, 1600, 115, NULL, 1, 0, 16514, 2, 34, 2, 18, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1157, 'Two_hand_Sword', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 1, 16514, 2, 34, 3, 33, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1158, 'Two_hand_Sword_', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 2, 16514, 2, 34, 3, 33, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1159, 'Two_hand_Sword__', 'Two-handed Sword', 4, 60000, NULL, 2200, 160, NULL, 1, 0, 16514, 2, 34, 3, 33, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1160, 'Broad_Sword', 'Broad Sword', 4, 65000, NULL, 2000, 140, NULL, 1, 1, 16514, 2, 34, 3, 33, 3, NULL, 'bonus bDef,5;');
+INSERT INTO `item_db` VALUES (1161, 'Balmung', 'Balmung', 4, 20, NULL, 1000, 250, NULL, 2, 0, 2088959, 2, 2, 4, 48, 1, NULL, 'bonus bInt,20; bonus bLuk,20;');
+INSERT INTO `item_db` VALUES (1162, 'Broad_Sword_', 'Broad Sword', 4, 65000, NULL, 2000, 140, NULL, 1, 2, 16514, 2, 34, 3, 33, 3, NULL, 'bonus bDef,5;');
+INSERT INTO `item_db` VALUES (1163, 'Claymore', 'Claymore', 4, 74000, NULL, 2500, 180, NULL, 1, 0, 16512, 2, 34, 3, 33, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1164, 'Muramasa', 'Muramasa', 4, 20, NULL, 1000, 155, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bCritical,30; bonus bAspdAddRate,8; bonus2 bAddEff2,Eff_Curse,200;');
+INSERT INTO `item_db` VALUES (1165, 'Masamune', 'Masamune', 4, 20, NULL, 1000, 200, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-50; bonus bDef2Rate,-50;');
+INSERT INTO `item_db` VALUES (1166, 'Dragon_Slayer', 'Dragon Slayer', 4, 20, NULL, 1300, 150, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bIgnoreDefRace,9; bonus2 bAddRace,9,15;');
+INSERT INTO `item_db` VALUES (1167, 'Schweizersabel', 'Schweizersabel', 4, 20, NULL, 1600, 160, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bAtkEle,4; skill 20,3; bonus bDef,1; bonus3 bAutoSpell,20,3,25;');
+INSERT INTO `item_db` VALUES (1168, 'Zweihander', 'Zweihander', 4, 20, NULL, 2200, 200, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (1169, 'Executioner_', 'Executioner', 4, 20, NULL, 2200, 155, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bIgnoreDefRace,7; bonus2 bAddRace,7,20; bonus2 bSubRace,7,-10; bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (1170, 'Katzbalger', 'Katzbalger', 4, 20, NULL, 2000, 175, NULL, 1, 0, 16514, 2, 34, 4, 48, 3, NULL, 'bonus bVit,10; bonus bDef,10;');
+INSERT INTO `item_db` VALUES (1201, 'Knife', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1202, 'Knife_', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1203, 'Knife__', 'Knife', 4, 50, NULL, 400, 17, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1204, 'Cutter', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1205, 'Cutter_', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1206, 'Cutter__', 'Cutter', 4, 1250, NULL, 500, 30, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1207, 'Main_Gauche', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 3, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1208, 'Main_Gauche_', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 4, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1209, 'Main_Gauche__', 'Main Gauche', 4, 2400, NULL, 600, 43, NULL, 1, 0, 10444527, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1210, 'Dirk', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1211, 'Dirk_', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1212, 'Dirk__', 'Dirk', 4, 8500, NULL, 500, 59, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1213, 'Dagger', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1214, 'Dagger_', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1215, 'Dagger__', 'Dagger', 4, 14000, NULL, 600, 73, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1216, 'Stiletto', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 2, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1217, 'Stiletto_', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 3, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1218, 'Stiletto__', 'Stiletto', 4, 19500, NULL, 700, 87, NULL, 1, 0, 10444527, 2, 2, 2, 12, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1219, 'Gladius', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 2, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1220, 'Gladius_', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 3, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1221, 'Gladius__', 'Gladius', 4, 43000, NULL, 700, 105, NULL, 1, 0, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1222, 'Damascus', 'Damascus', 4, 49000, NULL, 800, 118, NULL, 1, 1, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1223, 'Fortune_Sword', 'Fortune Sword', 4, 20, NULL, 500, 90, NULL, 1, 0, 2055918, 2, 2, 4, 24, 1, NULL, 'bonus bLuk,5; bonus bFlee2,20;');
+INSERT INTO `item_db` VALUES (1224, 'Sword_Breaker', 'Swordbreaker', 4, 20, NULL, 1000, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1225, 'Mail_Breaker', 'Mailbreaker', 4, 20, NULL, 1000, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1226, 'Damascus_', 'Damascus', 4, 49000, NULL, 800, 118, NULL, 1, 2, 2055918, 2, 2, 3, 24, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1227, 'Weeder_Knife', 'Weeder Knife', 4, 20, NULL, 400, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,3; bonus2 bAddRace,3,15; bonus2 bSubRace,3,15;');
+INSERT INTO `item_db` VALUES (1228, 'Combat_Knife', 'Combat Knife', 4, 20, NULL, 400, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,7; bonus2 bSubRace,7,10; bonus2 bSubRace,6,-10;');
+INSERT INTO `item_db` VALUES (1229, 'Mama\'s_Knife', 'Mama\'s Knife', 4, 20, NULL, 500, 75, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bCritical,30; bonus2 bAddRace,7,3; bonus3 bAddMonsterDropItem,517,2,5000;');
+INSERT INTO `item_db` VALUES (1230, 'House_Auger', 'House Auger', 4, 20, NULL, 600, 80, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bDefRatioAtkRace,10; bonus bDefRatioAtkRace,11;');
+INSERT INTO `item_db` VALUES (1231, 'Bazerald', 'Bazerald', 4, 20, NULL, 500, 70, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bAtkEle,3; bonus bInt,5; bonus bMatkRate,10;');
+INSERT INTO `item_db` VALUES (1232, 'Assassin_Dagger', 'Assasin Dagger', 4, 20, NULL, 600, 140, NULL, 1, 0, 4096, 2, 2, 4, 36, 1, NULL, 'bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdAddRate,2; bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (1233, 'Exercise', 'Excorcise', 4, 20, NULL, 700, 90, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bIgnoreDefRace,6; bonus2 bSubRace,6,5; bonus2 bSubRace,7,-10;');
+INSERT INTO `item_db` VALUES (1234, 'Moonlight_Sword', 'Walgwanggum', 4, 20, NULL, 700, 50, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bMaxSPrate,10;');
+INSERT INTO `item_db` VALUES (1235, 'Azoth', 'Azoth', 4, 20, NULL, 700, 110, NULL, 1, 0, 262144, 2, 2, 4, 36, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1236, 'Sucsamad', 'Sucsamad', 4, 20, NULL, 800, 140, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus2 bAddEle,2,10; bonus2 bAddEle,4,10;');
+INSERT INTO `item_db` VALUES (1237, 'Grimtooth_', 'Grimtooth', 4, 20, NULL, 800, 180, NULL, 1, 0, 2055918, 2, 2, 4, 36, 1, NULL, 'bonus bFlee,10; bonus bFlee2,5; bonus bDefRate,-50; bonus bDef2Rate,-50;');
+INSERT INTO `item_db` VALUES (1238, 'Zeny_Knife', 'Zeny Knife', 4, 20, NULL, 1200, 64, NULL, 1, 0, 2055918, 2, 2, 3, 40, 1, NULL, 'bonus bGetZenyNum,100;');
+INSERT INTO `item_db` VALUES (1239, 'Poison_Knife', 'Poison Knife', 4, 20, NULL, 800, 64, NULL, 1, 0, 2055918, 2, 2, 3, 65, 1, NULL, 'bonus bAtkEle,5;');
+INSERT INTO `item_db` VALUES (1240, 'Princess_Knife', 'Princess Knife', 4, 20, NULL, 400, 84, NULL, 1, 0, 2055918, 2, 2, 4, 1, 1, NULL, 'bonus bStr,1; bonus bAgi,1; bonus bVit,1; bonus bInt,1; bonus bDex,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (1241, 'Cursed_Dagger', 'Cursed Dagger', 4, 20, NULL, 400, 55, NULL, 1, 0, 66052, 2, 2, 4, 85, 1, NULL, 'bonus2 bAddEff,Eff_Curse,500;');
+INSERT INTO `item_db` VALUES (1242, 'Counter_Dagger', 'Counter Dagger', 4, 20, NULL, 550, 75, NULL, 1, 0, 66052, 2, 2, 4, 55, 1, NULL, 'bonus bCritical,5; skill 61,1; bonus3 bAutoSpell,61,1,25;');
+INSERT INTO `item_db` VALUES (1243, 'Main_Gauche_For_Novice', 'Novice\'s Main Gauche', 4, NULL, NULL, 1, 45, NULL, 1, 0, 8388609, 2, 2, 1, 1, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (1250, 'Jur', 'Jur', 4, 19500, NULL, 800, 125, NULL, 1, 2, 4096, 2, 34, 2, 18, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (1251, 'Jur_', 'Jur', 4, 19500, NULL, 800, 125, NULL, 1, 3, 4096, 2, 34, 2, 18, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (1252, 'Katar', 'Katar', 4, 41000, NULL, 1200, 148, NULL, 1, 1, 4096, 2, 34, 3, 33, 16, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (1253, 'Katar_', 'Katar', 4, 41000, NULL, 1200, 148, NULL, 1, 2, 4096, 2, 34, 3, 33, 16, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (1254, 'Jamadhar', 'Jamadhar', 4, 37200, NULL, 1500, 165, NULL, 1, 0, 4096, 2, 34, 3, 33, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (1255, 'Jamadhar_', 'Jamadhar', 4, 37200, NULL, 1500, 165, NULL, 1, 1, 4096, 2, 34, 3, 33, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (1256, 'Katar_of_Cold_Icicle', 'Katar of Cold Icicle', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500;');
+INSERT INTO `item_db` VALUES (1257, 'Katar_of_Thornbush', 'Katar of Dusty Thornbush', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,2; bonus2 bAddEff,Eff_Blind,500;');
+INSERT INTO `item_db` VALUES (1258, 'Katar_of_Raging_Blaze', 'Katar of Raging Blaze', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,3; bonus2 bAddEff,Eff_Silence,500;');
+INSERT INTO `item_db` VALUES (1259, 'Katar_of_Piercing_Wind', 'Katar of Piercing Wind', 4, 45000, NULL, 1200, 105, NULL, 1, 0, 4096, 2, 34, 3, 55, 16, NULL, 'bonus bAtkEle,4; bonus2 bAddEff,Eff_Sleep,500;');
+INSERT INTO `item_db` VALUES (1260, 'Sharpened_Legbone_of_Ghoul', 'Sharpened Legbone of Ghoul', 4, 52500, NULL, 1700, 150, NULL, 1, 0, 4096, 2, 34, 3, 65, 16, NULL, 'bonus bAtkEle,9;');
+INSERT INTO `item_db` VALUES (1261, 'Infiltrator', 'Infiltrator', 4, 57000, NULL, 1500, 140, NULL, 1, 0, 4096, 2, 34, 4, 75, 16, NULL, 'bonus2 bAddRace,7,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;');
+INSERT INTO `item_db` VALUES (1301, 'Axe', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 3, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
+INSERT INTO `item_db` VALUES (1302, 'Axe_', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 4, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
+INSERT INTO `item_db` VALUES (1303, 'Axe__', 'Axe', 4, 500, NULL, 800, 38, NULL, 1, 0, 8803555, 2, 2, 1, 3, 6, NULL, NULL);
+INSERT INTO `item_db` VALUES (1304, 'Orcish_Axe', 'Orcish Axe', 4, 20, NULL, 1500, 75, NULL, 1, 0, 8803555, 2, 2, 3, 3, 6, NULL, NULL);
+INSERT INTO `item_db` VALUES (1305, 'Cleaver', 'Cleaver', 4, 20, NULL, 1200, 140, NULL, 1, 0, 8668323, 2, 2, 4, 44, 6, NULL, 'bonus2 bAddRace,7,5; bonus3 bAddMonsterDropItem,517,2,3000;');
+INSERT INTO `item_db` VALUES (1306, 'War_Axe', 'War Axe', 4, 20, NULL, 4200, 145, NULL, 1, 1, 263168, 2, 2, 3, 76, 6, NULL, 'bonus bDex,2; bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (1351, 'Battle_Axe', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 3, 279714, 2, 34, 1, 3, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1352, 'Battle_Axe_', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 4, 279714, 2, 34, 1, 3, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1353, 'Battle_Axe__', 'Battle Axe', 4, 5400, NULL, 1500, 80, NULL, 1, 0, 279714, 2, 34, 1, 3, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1354, 'Hammer', 'Hammer', 4, 15500, NULL, 2000, 120, NULL, 1, 2, 279714, 2, 34, 2, 16, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1355, 'Hammer_', 'Hammer', 4, 15500, NULL, 2000, 120, NULL, 1, 3, 279714, 2, 34, 2, 16, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1356, 'Hammer__', 'Hammer', 4, 15500, NULL, 2200, 120, NULL, 1, 0, 279714, 2, 34, 2, 16, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1357, 'Buster', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 1, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1358, 'Buster_', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 2, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1359, 'Buster__', 'Buster', 4, 34000, NULL, 2200, 155, NULL, 1, 0, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1360, 'Two_handed_Axe', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 1, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1361, 'Two_handed_Axe_', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 2, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1362, 'Two_handed_Axe__', 'Two-handed Axe', 4, 55000, NULL, 2500, 185, NULL, 1, 0, 279714, 2, 34, 3, 30, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (1363, 'Blood_Axe', 'Bloody Axe', 4, 20, NULL, 4000, 170, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bStr,10; bonus bSpeedRate,25;');
+INSERT INTO `item_db` VALUES (1364, 'Great_Axe', 'Great Axe', 4, 20, NULL, 1800, 187, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bAddEff,Eff_Stan,1500;');
+INSERT INTO `item_db` VALUES (1365, 'Sabbath', 'Sabbath', 4, 20, NULL, 2300, 120, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bWeaponComaRace,6,50; bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (1366, 'Light_Epsilon', 'Light Epsilon', 4, 20, NULL, 2300, 180, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bAtkEle,6; skill 28,3; bonus2 bAddRace,6,3;');
+INSERT INTO `item_db` VALUES (1367, 'Slaughter', 'Slaughter', 4, 20, NULL, 2500, 120, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bIgnoreDefRace,2; bonus2 bWeaponComaRace,2,40;');
+INSERT INTO `item_db` VALUES (1368, 'Tomahawk', 'Tomahawk', 4, 20, NULL, 2500, 165, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus bAtkEle,4;');
+INSERT INTO `item_db` VALUES (1369, 'Guillotine', 'Guillotine', 4, 20, NULL, 3000, 215, NULL, 1, 0, 279714, 2, 34, 4, 44, 7, NULL, 'bonus2 bWeaponComaRace,7,30;');
+INSERT INTO `item_db` VALUES (1401, 'Javelin', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1402, 'Javelin_', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1403, 'Javelin__', 'Javelin', 4, 150, NULL, 700, 28, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1404, 'Spear', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1405, 'Spear_', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1406, 'Spear__', 'Spear', 4, 1700, NULL, 850, 44, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1407, 'Pike', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 3, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1408, 'Pike_', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 4, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1409, 'Pike__', 'Pike', 4, 3450, NULL, 1000, 60, NULL, 3, 0, 16514, 2, 2, 1, 4, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1410, 'Lance', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1411, 'Lance_', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1412, 'Lance__', 'Lance', 4, 60000, NULL, 2500, 185, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1413, 'Gungnir', 'Gungnir', 4, 20, NULL, 500, 120, NULL, 3, 0, 16514, 2, 2, 4, 4, 4, NULL, 'bonus bAtkEle,4; bonus bPerfectHitRate,25; bonus bHit,30;');
+INSERT INTO `item_db` VALUES (1414, 'Gelerdria', 'Gelerdria', 4, 20, NULL, 700, 145, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, 'bonus bAtkEle,2; bonus bMaxHP,500; bonus bMaxSP,-50;');
+INSERT INTO `item_db` VALUES (1415, 'Skewer', 'Brocca', 4, 20, NULL, 850, 100, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, 'bonus bIgnoreDefRace,11; bonus2 bAddEle,0,25;');
+INSERT INTO `item_db` VALUES (1416, 'Tjungkuletti', 'Tjungkuletti', 4, 20, NULL, 1000, 95, NULL, 3, 0, 16514, 2, 2, 4, 48, 4, NULL, NULL);
+INSERT INTO `item_db` VALUES (1417, 'Pole_Axe', 'Pole Axe', 4, 20, NULL, 3800, 160, NULL, 3, 1, 16514, 2, 2, 3, 71, 4, NULL, 'bonus bStr,1; bonus bInt,2; bonus bDex,1;');
+INSERT INTO `item_db` VALUES (1451, 'Guisarme', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1452, 'Guisarme_', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 3, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1453, 'Guisarme__', 'Guisarme', 4, 13000, NULL, 1000, 84, NULL, 3, 0, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1454, 'Glaive', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1455, 'Glaive_', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 3, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1456, 'Glaive__', 'Glaive', 4, 20000, NULL, 1200, 104, NULL, 3, 0, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1457, 'Partizan', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 1, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1458, 'Partizan_', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 2, 16514, 2, 34, 2, 18, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1459, 'Partizan__', 'Partizan', 4, 27000, NULL, 2000, 124, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1460, 'Trident', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 2, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1461, 'Trident_', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 3, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1462, 'Trident__', 'Trident', 4, 51000, NULL, 1200, 150, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1463, 'Halberd', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 1, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1464, 'Halberd_', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 2, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1465, 'Halberd__', 'Halberd', 4, 54000, NULL, 2500, 165, NULL, 3, 0, 16514, 2, 34, 3, 33, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (1466, 'Crescent_Scythe', 'Crescent Scythe', 4, 20, NULL, 2500, 180, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bCritical,30; bonus bHit,10;');
+INSERT INTO `item_db` VALUES (1467, 'Bill_Guisarme', 'Bill Guisarme', 4, 20, NULL, 1000, 183, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus2 bAddRace,2,10; bonus2 bAddRace,7,5;');
+INSERT INTO `item_db` VALUES (1468, 'Zephyrus', 'Zephyrus', 4, 20, NULL, 2000, 170, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,4; skill 21,3; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,21,3,25;');
+INSERT INTO `item_db` VALUES (1469, 'Longinus\'s_Spear', 'Longinus\'s Spear', 4, 20, NULL, 2500, 180, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,7; bonus2 bAddRace,7,10; bonus2 bAddRace,8,10;');
+INSERT INTO `item_db` VALUES (1470, 'Brionac', 'Brionac', 4, 20, NULL, 3000, 190, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,6; skill 28,5; skill 13,3; bonus3 bAutoSpell,13,3,25;');
+INSERT INTO `item_db` VALUES (1471, 'Hellfire', 'Hellfire', 4, 20, NULL, 3500, 200, NULL, 3, 0, 16514, 2, 34, 4, 48, 5, NULL, 'bonus bAtkEle,3; skill 17,3; bonus3 bAutoSpell,17,3,25;');
+INSERT INTO `item_db` VALUES (1472, 'Staff_of_Soul', 'Soul Staff', 4, 20, NULL, 1400, 25, NULL, 1, 0, 66052, 2, 34, 3, 73, 10, NULL, 'bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1473, 'Wizardy_Staff', 'Wizardy Staff', 4, 20, NULL, 2400, 120, NULL, 1, 0, 66052, 2, 34, 4, 90, 10, NULL, 'bonus bInt,6; bonus bDex,2; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1501, 'Club', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 3, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1502, 'Club_', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 4, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1503, 'Club__', 'Club', 4, 120, NULL, 700, 23, NULL, 1, 0, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1504, 'Mace', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 3, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1505, 'Mace_', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 4, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1506, 'Mace__', 'Mace', 4, 1600, NULL, 800, 37, NULL, 1, 0, 8836595, 2, 2, 1, 2, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1507, 'Smasher', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 2, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1508, 'Smasher_', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 3, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1509, 'Smasher__', 'Smasher', 4, 9000, NULL, 1000, 54, NULL, 1, 3, 8836595, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1510, 'Flail', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 2, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1511, 'Flail_', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1512, 'Flail__', 'Flail', 4, 16000, NULL, 900, 69, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1513, 'Morning_Star', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1514, 'Morning_Star_', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 2, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1515, 'Morning_Star__', 'Morning Star', 4, 41000, NULL, 1500, 110, NULL, 1, 2, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1516, 'Sword_Mace', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 0, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1517, 'Sword_Mace_', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1518, 'Sword_Mace__', 'Sword Mace', 4, 50000, NULL, 1200, 130, NULL, 1, 1, 447986, 2, 2, 3, 27, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1519, 'Chain', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 2, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1520, 'Chain_', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1521, 'Chain__', 'Chain', 4, 23000, NULL, 800, 84, NULL, 1, 3, 447986, 2, 2, 2, 14, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1522, 'Stunner', 'Stunner', 4, 60000, NULL, 2000, 140, NULL, 1, 0, 33040, 2, 2, 3, 27, 8, NULL, 'bonus2 bAddEff,Eff_Stan,1000;');
+INSERT INTO `item_db` VALUES (1523, 'Spike', 'Spike', 4, 20, NULL, 700, 85, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67;');
+INSERT INTO `item_db` VALUES (1524, 'Golden_Mace', 'Golden Mace', 4, 20, NULL, 800, 110, NULL, 1, 1, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,10;');
+INSERT INTO `item_db` VALUES (1525, 'Long_Mace', 'Long Mace', 4, 20, NULL, 800, 135, NULL, 3, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bLongAtkDef,10;');
+INSERT INTO `item_db` VALUES (1526, 'Slash', 'Slash', 4, 20, NULL, 1000, 145, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,15; bonus2 bWeaponComaRace,1,10;');
+INSERT INTO `item_db` VALUES (1527, 'Quadrille', 'Quadrille', 4, 20, NULL, 900, 165, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus2 bAddRace,1,10; bonus2 bAddRace,7,10; bonus2 bAddEle,2,10;');
+INSERT INTO `item_db` VALUES (1528, 'Grand_Cross', 'Grand Cross', 4, 20, NULL, 1500, 140, NULL, 1, 0, 33040, 2, 2, 4, 40, 8, NULL, 'bonus bAtkEle,6; skill 77,3; bonus3 bAutoSpell,77,3,25;');
+INSERT INTO `item_db` VALUES (1529, 'Iron_Driver', 'Iron Driver', 4, 20, NULL, 3000, 155, NULL, 1, 0, 33024, 2, 2, 3, 78, 8, NULL, NULL);
+INSERT INTO `item_db` VALUES (1530, 'Mjolnir', 'Mjolnir', 4, 20, NULL, 6000, 250, NULL, 1, 0, 10477567, 2, 2, 4, 98, 8, NULL, 'bonus bAtkEle,4; bonus bDex,40; bonus bStr,15; bonus bAspdRate,30;');
+INSERT INTO `item_db` VALUES (1531, 'Spanner', 'Spanner', 4, 20, NULL, 2500, 115, NULL, 1, 0, 33040, 2, 2, 3, 55, 8, 'bonus2 bAddEff,Eff_Freeze,100; bonus2 bAddEff,Eff_Stan,100; bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Poison,100;', NULL);
+INSERT INTO `item_db` VALUES (1550, 'Book', 'Book', 4, 30000, NULL, 600, 85, NULL, 1, 3, 65792, 2, 2, 2, 14, 15, NULL, NULL);
+INSERT INTO `item_db` VALUES (1551, 'Bible', 'Bible', 4, 60000, NULL, 1000, 115, NULL, 1, 2, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (1552, 'Tablet', 'Tablet', 4, 51000, NULL, 800, 125, NULL, 1, 1, 65792, 2, 2, 3, 27, 15, NULL, NULL);
+INSERT INTO `item_db` VALUES (1553, 'Book_of_Billows', 'Book of Billows', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,1;');
+INSERT INTO `item_db` VALUES (1554, 'Book_of_Mother_Earth', 'Book of Mother Earth', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,2;');
+INSERT INTO `item_db` VALUES (1555, 'Book_of_Blazing_Sun', 'Book of Blazing Sun', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,3;');
+INSERT INTO `item_db` VALUES (1556, 'Book_of_Gust_of_Wind', 'Book of Gust of Wind', 4, 35000, NULL, 750, 90, NULL, 1, 0, 65792, 2, 2, 3, 27, 15, NULL, 'bonus bAtkEle,4;');
+INSERT INTO `item_db` VALUES (1557, 'Book_of_the_Apocalypse', 'Book of the Apocalypse', 4, 35000, NULL, 800, 120, NULL, 1, 0, 65792, 2, 2, 4, 40, 15, NULL, 'bonus bAtkEle,7; bonus2 bSubEle,6,-5; bonus2 bAddEle,1,7; bonus2 bAddEle,2,7; bonus2 bAddEle,3,7; bonus2 bAddEle,4,7;');
+INSERT INTO `item_db` VALUES (1558, 'Girl\'s_Diary', 'Girl\'s Diary', 4, 20, NULL, 300, 60, NULL, 1, 1, 65792, 2, 2, 4, 40, 15, NULL, 'bonus2 bAddDamageClass,1188,150;');
+INSERT INTO `item_db` VALUES (1599, 'Angra_Manyu', 'Angra Manyu', 4, 120, NULL, 10, 1, NULL, 1, 5, 10477567, 2, 2, 4, 2, 8, NULL, 'bonus bStr,420; bonus bAgi,420; bonus bVit,50; bonus bInt,420; bonus bDex,420; bonus bSplashRange,3; bonus bUseSPrate,-100; bonus bNoGemStone,0; bonus bSpeedRate,25; bonus bMatkRate,100;');
+INSERT INTO `item_db` VALUES (1601, 'Rod', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 3, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1602, 'Rod_', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 4, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1603, 'Rod__', 'Rod', 4, 50, NULL, 400, 15, NULL, 1, 0, 8487701, 2, 2, 1, 1, 10, NULL, 'bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1604, 'Wand', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 2, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1605, 'Wand_', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 3, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1606, 'Wand__', 'Wand', 4, 2500, NULL, 400, 25, NULL, 1, 0, 8487701, 2, 2, 2, 12, 10, NULL, 'bonus bInt,1; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1607, 'Staff', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 2, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1608, 'Staff_', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 3, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1609, 'Staff__', 'Staff', 4, 9500, NULL, 400, 40, NULL, 1, 0, 99092, 2, 2, 2, 12, 10, NULL, 'bonus bInt,2; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1610, 'Arc_Wand', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 1, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1611, 'Arc_Wand_', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 2, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1612, 'Arc_Wand__', 'Arc Wand', 4, 45000, NULL, 400, 60, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1613, 'Mighty_Staff', 'Mighty Staff', 4, 20, NULL, 700, 130, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bStr,10; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1614, 'Blessed_Wand', 'Wand of Occult', 4, 20, NULL, 700, 75, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,3; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1615, 'Bone_Wand', 'Bone Wand', 4, 20, NULL, 700, 40, NULL, 1, 0, 99092, 2, 2, 3, 24, 10, NULL, 'bonus bInt,4; bonus bAtkEle,9; bonus bMatkRate,15;');
+INSERT INTO `item_db` VALUES (1701, 'Bow', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 3, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1702, 'Bow_', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 4, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1703, 'Bow__', 'Bow', 4, 1000, NULL, 500, 15, NULL, 5, 0, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1704, 'Composite_Bow', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 3, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1705, 'Composite_Bow_', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 4, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1706, 'Composite_Bow__', 'Composite Bow', 4, 2500, NULL, 600, 29, NULL, 5, 0, 1706056, 2, 34, 1, 4, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1707, 'Great_Bow', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 2, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1708, 'Great_Bow_', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 3, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1709, 'Great_Bow__', 'Great Bow', 4, 10000, NULL, 1000, 50, NULL, 5, 0, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1710, 'CrossBow', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 2, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1711, 'CrossBow_', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 3, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1712, 'CrossBow__', 'Cross Bow', 4, 17000, NULL, 900, 65, NULL, 5, 0, 1706056, 2, 34, 2, 18, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1713, 'Arbalest', 'Arbalest', 4, 48000, NULL, 1000, 90, NULL, 5, 1, 1706056, 2, 34, 3, 33, 11, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (1714, 'Gakkung', 'Gakkung', 4, 42000, NULL, 1100, 100, NULL, 5, 1, 1706056, 2, 34, 3, 33, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1715, 'Arbalest_', 'Arbalest', 4, 48000, NULL, 1000, 90, NULL, 5, 2, 1706056, 2, 34, 3, 33, 11, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (1716, 'Gakkung_', 'Gakkung', 4, 42000, NULL, 1100, 100, NULL, 5, 2, 1706056, 2, 34, 3, 33, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1718, 'Hunter_Bow', 'Hunter Bow', 4, 64000, NULL, 1500, 125, NULL, 5, 0, 2048, 2, 34, 3, 33, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1719, 'Bow_of_Roguemaster', 'Roguemaster\'s Bow', 4, 20, NULL, 500, 75, NULL, 11, 0, 64, 2, 34, 4, 48, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1720, 'Bow_of_Rudra', 'Rudra\'s Bow', 4, 20, NULL, 1200, 150, NULL, 5, 0, 1705992, 2, 34, 4, 48, 11, NULL, 'bonus bAtkEle,6; 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;');
+INSERT INTO `item_db` VALUES (1721, 'Repeating_Crossbow', 'Repeating Crossbow', 4, 89000, NULL, 2000, 95, NULL, 9, 1, 133184, 2, 34, 3, 65, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1722, 'Ballista', 'Ballista', 4, 20, NULL, 3500, 145, NULL, 5, 0, 1574912, 2, 34, 4, 77, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (1750, 'Arrow', 'Arrow', 10, 1, NULL, 1, 25, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1751, 'Silver_Arrow', 'Silver Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,6;');
+INSERT INTO `item_db` VALUES (1752, 'Fire_Arrow', 'Fire Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,3;');
+INSERT INTO `item_db` VALUES (1753, 'Steel_Arrow', 'Steel Arrow', 10, 3, NULL, 2, 40, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1754, 'Crystal_Arrow', 'Crystal Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,1;');
+INSERT INTO `item_db` VALUES (1755, 'Arrow_of_Wind', 'Arrow of Wind', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,4;');
+INSERT INTO `item_db` VALUES (1756, 'Stone_Arrow', 'Stone Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,2;');
+INSERT INTO `item_db` VALUES (1757, 'Immaterial_Arrow', 'Immaterial Arrow', 10, 3, NULL, 1, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,8;');
+INSERT INTO `item_db` VALUES (1758, 'Stun_Arrow', 'Stun Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,500;');
+INSERT INTO `item_db` VALUES (1759, 'Freezing_Arrow', 'Freeze Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,1; bonus2 bAddEff,Eff_Freeze,500;');
+INSERT INTO `item_db` VALUES (1760, 'Flash_Arrow', 'Flash Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,500;');
+INSERT INTO `item_db` VALUES (1761, 'Curse_Arrow', 'Curse Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,500;');
+INSERT INTO `item_db` VALUES (1762, 'Rusty_Arrow', 'Rusted Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,5;');
+INSERT INTO `item_db` VALUES (1763, 'Poison_Arrow', 'Poison Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,500;');
+INSERT INTO `item_db` VALUES (1764, 'Incisive_Arrow', 'Sharp Arrow', 10, 3, NULL, 3, 10, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bCritical,10;');
+INSERT INTO `item_db` VALUES (1765, 'Oridecon_Arrow', 'Oridecon Arrow', 10, 3, NULL, 3, 50, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1766, 'Arrow_of_Counter_Evil', 'Arrow of Counter Evil', 10, 40, NULL, 3, 50, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,6;');
+INSERT INTO `item_db` VALUES (1767, 'Arrow_of_Shadow', 'Shadow Arrow', 10, 3, NULL, 2, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (1768, 'Sleep_Arrow', 'Sleep Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,500;');
+INSERT INTO `item_db` VALUES (1769, 'Silence_Arrow', 'Mute Arrow', 10, 3, NULL, 3, 1, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,500;');
+INSERT INTO `item_db` VALUES (1770, 'Iron_Arrow', 'Iron Arrow', 10, 2, NULL, 1, 30, NULL, NULL, NULL, 1706056, 2, 32768, NULL, 1, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (1801, 'Waghnakh', 'Waghnakh', 4, 8000, NULL, 400, 30, NULL, 1, 3, 33024, 2, 2, 1, 1, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1802, 'Waghnakh_', 'Waghnakh', 4, 8000, NULL, 400, 30, NULL, 1, 4, 33024, 2, 2, 1, 1, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1803, 'Knuckle_Duster', 'Knuckle Duster', 4, 25000, NULL, 450, 50, NULL, 1, 2, 33024, 2, 2, 2, 12, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1804, 'Knuckle_Duster_', 'Knuckle Duster', 4, 25000, NULL, 450, 50, NULL, 1, 3, 33024, 2, 2, 2, 12, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1805, 'Hora', 'Hora', 4, 32000, NULL, 450, 65, NULL, 1, 2, 33024, 2, 2, 2, 12, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1806, 'Hora_', 'Hora', 4, 32000, NULL, 450, 65, NULL, 1, 3, 33024, 2, 2, 2, 12, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1807, 'Fist', 'Fist', 4, 53000, NULL, 650, 115, NULL, 1, 0, 33024, 2, 2, 3, 24, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1808, 'Fist_', 'Fist', 4, 53000, NULL, 650, 115, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1809, 'Claw', 'Claw', 4, 55000, NULL, 500, 86, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (1810, 'Claw_', 'Claw', 4, 55000, NULL, 500, 86, NULL, 1, 2, 33024, 2, 2, 3, 24, 12, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (1811, 'Finger', 'Finger', 4, 58000, NULL, 500, 97, NULL, 1, 1, 33024, 2, 2, 3, 24, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1812, 'Finger_', 'Finger', 4, 58000, NULL, 500, 97, NULL, 1, 2, 33024, 2, 2, 3, 24, 12, NULL, NULL);
+INSERT INTO `item_db` VALUES (1813, 'Kaiser_Knuckle', 'Kaiser Knuckle', 4, 20, NULL, 450, 110, NULL, 1, 0, 33024, 2, 2, 4, 36, 12, NULL, 'bonus bAtkEle,4; bonus2 bAddRace,1,5; bonus2 bAddEle,1,10; bonus2 bAddEle,2,10; bonus2 bAddEle,3,10; bonus2 bAddEle,4,10;');
+INSERT INTO `item_db` VALUES (1814, 'Berserk', 'Berserk', 4, 20, NULL, 500, 120, NULL, 1, 0, 33024, 2, 2, 4, 36, 12, NULL, 'bonus bAspdRate,12;');
+INSERT INTO `item_db` VALUES (1901, 'Violin', 'Violin', 4, 4000, NULL, 700, 50, NULL, 1, 3, 524288, 2, 2, 1, 2, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1902, 'Violin_', 'Violin', 4, 4000, NULL, 700, 50, NULL, 1, 4, 524288, 2, 2, 1, 2, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1903, 'Mandolin', 'Mandolin', 4, 18000, NULL, 400, 90, NULL, 1, 2, 524288, 2, 2, 2, 14, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1904, 'Mandolin_', 'Mandolin', 4, 18000, NULL, 400, 90, NULL, 1, 3, 524288, 2, 2, 2, 14, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1905, 'Lute', 'Lute', 4, 24500, NULL, 500, 105, NULL, 1, 2, 524288, 2, 2, 2, 14, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1906, 'Lute_', 'Lute', 4, 24500, NULL, 500, 105, NULL, 1, 3, 524288, 2, 2, 2, 14, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1907, 'Guitar', 'Guitar', 4, 47000, NULL, 900, 142, NULL, 1, 0, 524288, 2, 2, 3, 27, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1908, 'Guitar_', 'Guitar', 4, 47000, NULL, 900, 142, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1909, 'Harp', 'Harp', 4, 62000, NULL, 900, 114, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (1910, 'Harp_', 'Harp', 4, 62000, NULL, 900, 114, NULL, 1, 2, 524288, 2, 2, 3, 27, 13, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (1911, 'Guh_Moon_Goh', 'Guhmoongoh', 4, 54000, NULL, 1300, 126, NULL, 1, 1, 524288, 2, 2, 3, 27, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1912, 'Guh_Moon_Goh_', 'Guhmoongoh', 4, 54000, NULL, 1300, 126, NULL, 1, 2, 524288, 2, 2, 3, 27, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (1950, 'Rope', 'Rope', 4, 2500, NULL, 400, 45, NULL, 2, 3, 1048576, 2, 2, 1, 3, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1951, 'Rope_', 'Rope', 4, 2500, NULL, 400, 45, NULL, 2, 4, 1048576, 2, 2, 1, 3, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1952, 'Line', 'Line', 4, 12000, NULL, 300, 80, NULL, 2, 2, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1953, 'Line_', 'Line', 4, 12000, NULL, 300, 80, NULL, 2, 3, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1954, 'Wire', 'Wire', 4, 17500, NULL, 1000, 95, NULL, 2, 2, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1955, 'Wire_', 'Wire', 4, 17500, NULL, 1000, 95, NULL, 2, 3, 1048576, 2, 2, 2, 16, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1956, 'Rante', 'Rante', 4, 32000, NULL, 900, 135, NULL, 2, 0, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1957, 'Rante_', 'Rante', 4, 32000, NULL, 900, 135, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1958, 'Tail', 'Tail', 4, 41000, NULL, 700, 105, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, 'bonus bLuk,3;');
+INSERT INTO `item_db` VALUES (1959, 'Tail_', 'Tail', 4, 41000, NULL, 700, 105, NULL, 2, 2, 1048576, 2, 2, 3, 30, 14, NULL, 'bonus bLuk,3;');
+INSERT INTO `item_db` VALUES (1960, 'Whip', 'Whip', 4, 38000, NULL, 700, 120, NULL, 2, 1, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1961, 'Whip_', 'Whip', 4, 38000, NULL, 700, 120, NULL, 2, 2, 1048576, 2, 2, 3, 30, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (1962, 'Lariat', 'Lariat', 4, 20, NULL, 400, 100, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bDex,5; bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (1963, 'Rapture_Rose', 'Rapture Rose', 4, 20, NULL, 300, 115, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bAtkEle,5; bonus2 bAddEff,Eff_Poison,5000;');
+INSERT INTO `item_db` VALUES (1964, 'Chemeti', 'Chemeti', 4, 20, NULL, 700, 135, NULL, 2, 0, 1048576, 2, 2, 4, 44, 14, NULL, 'bonus bCritical,5; bonus bFlee,10; bonus bFlee2,2;');
+INSERT INTO `item_db` VALUES (2101, 'Guard', 'Guard', 5, 500, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 32, NULL, 0, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (2102, 'Guard_', 'Guard', 5, 500, NULL, 300, NULL, 3, NULL, 1, 10477567, 2, 32, NULL, 0, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (2103, 'Buckler', 'Buckler', 5, 14000, NULL, 600, NULL, 4, NULL, 0, 2020850, 2, 32, NULL, 0, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (2104, 'Buckler_', 'Buckler', 5, 14000, NULL, 600, NULL, 4, NULL, 1, 2020850, 2, 32, NULL, 0, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (2105, 'Shield', 'Shield', 5, 56000, NULL, 1300, NULL, 6, NULL, 0, 16514, 2, 32, NULL, 0, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (2106, 'Shield_', 'Shield', 5, 56000, NULL, 1300, NULL, 6, NULL, 1, 16514, 2, 32, NULL, 0, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (2107, 'Mirror_Shield', 'Mirror Shield', 5, 60000, NULL, 1000, NULL, 4, NULL, 0, 16514, 2, 32, NULL, 0, 4, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2108, 'Mirror_Shield_', 'Mirror Shield', 5, 60000, NULL, 1000, NULL, 4, NULL, 1, 16514, 2, 32, NULL, 0, 4, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2109, 'Memorize_Book', 'Book of Summoning', 5, 20, NULL, 1000, NULL, 3, NULL, 0, 66052, 2, 32, NULL, 0, NULL, NULL, 'bonus bInt,1; bonus bMdef,2;');
+INSERT INTO `item_db` VALUES (2110, 'Holy_Guard', 'Holy Guard', 5, 20, NULL, 1400, NULL, 5, NULL, 0, 16384, 2, 32, NULL, 68, 3, NULL, 'bonus bVit,2; bonus bMdef,2;');
+INSERT INTO `item_db` VALUES (2111, 'Evangelist', 'Evangelist', 5, 20, NULL, 1400, NULL, 5, NULL, 0, 16384, 2, 32, NULL, 83, 3, NULL, 'bonus bVit,3; bonus bInt,2; bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2112, 'Novice_Guard', 'Novice Guard', 5, NULL, NULL, 1, NULL, 3, NULL, 0, 8388609, 2, 32, NULL, 0, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (2199, 'Ahura_Mazda', 'Ahura Mazda', 5, 20, NULL, 100, NULL, NULL, NULL, 0, 10477567, 2, 32, NULL, NULL, NULL, NULL, 'bonus bMdef,150; bonus bDef,150; bonus bFlee2,100; bonus2 bSubEle,0,100;');
+INSERT INTO `item_db` VALUES (2201, 'Sunglasses', 'Sunglasses', 5, 5000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 12, NULL, 'bonus2 bResEff,Eff_Blind,500;');
+INSERT INTO `item_db` VALUES (2202, 'Sunglasses_', 'Sunglasses', 5, 5000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 512, NULL, 0, 12, NULL, 'bonus2 bResEff,Eff_Blind,500;');
+INSERT INTO `item_db` VALUES (2203, 'Glasses', 'Glasses', 5, 4000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (2204, 'Glasses_', 'Glasses', 5, 4000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 512, NULL, 0, 3, NULL, NULL);
+INSERT INTO `item_db` VALUES (2205, 'Diver\'s_Goggles', 'Diver\'s Goggles', 5, 3500, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 10, NULL, NULL);
+INSERT INTO `item_db` VALUES (2206, 'Wedding_Veil', 'Wedding Veil', 5, 23000, NULL, 100, NULL, 0, NULL, 0, 10477567, 0, 256, NULL, 0, 44, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2207, 'Fancy_Flower', 'Fancy Flower', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 4, NULL, 'bonus2 bSubRace,3,10;');
+INSERT INTO `item_db` VALUES (2208, 'Ribbon', 'Ribbon', 5, 800, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 17, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2209, 'Ribbon_', 'Ribbon', 5, 800, NULL, 100, NULL, 1, NULL, 1, 10477567, 2, 256, NULL, 0, 17, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2210, 'Hair_Band', 'Hair Band', 5, 500, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 9, NULL, NULL);
+INSERT INTO `item_db` VALUES (2211, 'Bandana', 'Bandana', 5, 400, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 6, NULL, NULL);
+INSERT INTO `item_db` VALUES (2212, 'Eye_Bandage', 'Eye Patch', 5, 1000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 13, NULL, NULL);
+INSERT INTO `item_db` VALUES (2213, 'Kitty_Band', 'Kitty Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 2, NULL, NULL);
+INSERT INTO `item_db` VALUES (2214, 'Bunny_Band', 'Bunny Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 15, NULL, 'bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (2215, 'Flower_Hairband', 'Flower Band', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 5, NULL, NULL);
+INSERT INTO `item_db` VALUES (2216, 'Biretta', 'Biretta', 5, 9000, NULL, 100, NULL, 4, NULL, 0, 33040, 2, 256, NULL, 0, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (2217, 'Biretta_', 'Biretta', 5, 9000, NULL, 100, NULL, 4, NULL, 1, 33040, 2, 256, NULL, 0, 11, NULL, NULL);
+INSERT INTO `item_db` VALUES (2218, 'Flu_Mask', 'Flu Mask', 5, 300, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 8, NULL, 'bonus2 bResEff,Eff_Silence,1000;');
+INSERT INTO `item_db` VALUES (2219, 'Flu_Mask_', 'Flu Mask', 5, 300, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 1, NULL, 0, 8, NULL, 'bonus2 bResEff,Eff_Silence,1000;');
+INSERT INTO `item_db` VALUES (2220, 'Hat', 'Hat', 5, 1000, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (2221, 'Hat_', 'Hat', 5, 1000, NULL, 200, NULL, 2, NULL, 1, 10477567, 2, 256, NULL, 0, 16, NULL, NULL);
+INSERT INTO `item_db` VALUES (2222, 'Turban', 'Turban', 5, 4500, NULL, 300, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (2223, 'Turban_', 'Turban', 5, 4500, NULL, 300, NULL, 3, NULL, 1, 2088958, 2, 256, NULL, 0, 7, NULL, NULL);
+INSERT INTO `item_db` VALUES (2224, 'Goggles', 'Goggles', 5, 10000, NULL, 300, NULL, 5, NULL, 0, 1989866, 2, 768, NULL, 0, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (2225, 'Goggles_', 'Goggles', 5, 10000, NULL, 300, NULL, 5, NULL, 1, 1989866, 2, 768, NULL, 0, 1, NULL, NULL);
+INSERT INTO `item_db` VALUES (2226, 'Cap', 'Cap', 5, 12000, NULL, 400, NULL, 4, NULL, 0, 1989866, 2, 256, NULL, 0, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (2227, 'Cap_', 'Cap', 5, 12000, NULL, 400, NULL, 4, NULL, 1, 1989866, 2, 256, NULL, 0, 14, NULL, NULL);
+INSERT INTO `item_db` VALUES (2228, 'Helm', 'Helm', 5, 44000, NULL, 600, NULL, 6, NULL, 0, 16514, 2, 256, NULL, 0, 40, NULL, NULL);
+INSERT INTO `item_db` VALUES (2229, 'Helm_', 'Helm', 5, 44000, NULL, 600, NULL, 6, NULL, 1, 16514, 2, 256, NULL, 0, 40, NULL, NULL);
+INSERT INTO `item_db` VALUES (2230, 'Gemmed_Sallet', 'Gemmed Sallet', 5, 50000, NULL, 500, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 0, 0, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2231, 'Gemmed_Sallet_', 'Gemmed Sallet', 5, 50000, NULL, 500, NULL, 4, NULL, 1, 414946, 2, 256, NULL, 0, 0, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2232, 'Circlet', 'Circlet', 5, 7500, NULL, 300, NULL, 3, NULL, 0, 99092, 2, 256, NULL, 0, 18, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2233, 'Circlet_', 'Circlet', 5, 7500, NULL, 300, NULL, 3, NULL, 1, 99092, 2, 256, NULL, 0, 18, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2234, 'Tiara', 'Tiara', 5, 20, NULL, 400, NULL, 4, NULL, 0, 2088958, 0, 256, NULL, 45, 19, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (2235, 'Crown', 'Crown', 5, 20, NULL, 400, NULL, 4, NULL, 0, 2088958, 1, 256, NULL, 45, 45, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (2236, 'Santa\'s_Hat', 'Santa\'s Hat', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 20, NULL, 'bonus bMdef,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (2237, 'Weird_Goatee', 'Bandit Beard', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 21, NULL, NULL);
+INSERT INTO `item_db` VALUES (2238, 'Weird_Moustache', 'Moustache', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 22, NULL, NULL);
+INSERT INTO `item_db` VALUES (2239, 'Single_Glass', 'Single Glass', 5, 10000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 23, NULL, NULL);
+INSERT INTO `item_db` VALUES (2240, 'Beard', 'Beard', 5, 2, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 24, NULL, NULL);
+INSERT INTO `item_db` VALUES (2241, 'Granpa_Beard', 'Granpa Beard', 5, 5000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 25, NULL, NULL);
+INSERT INTO `item_db` VALUES (2242, 'Luxury_Sunglasses', 'Purple Glasses', 5, 24000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 26, NULL, 'bonus2 bResEff,Eff_Blind,1000;');
+INSERT INTO `item_db` VALUES (2243, 'Spinning_Eyes', 'Geek Glasses', 5, 20000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 27, NULL, 'bonus2 bResEff,Eff_Blind,1500;');
+INSERT INTO `item_db` VALUES (2244, 'Big_Ribbon', 'Big Ribbon', 5, 15000, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 28, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2245, 'Sweet_Gent', 'Sweet Gent', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 29, NULL, NULL);
+INSERT INTO `item_db` VALUES (2246, 'Golden_Gear', 'Golden Gear', 5, 20, NULL, 900, NULL, 5, NULL, 0, 2088958, 2, 256, NULL, 40, 30, NULL, NULL);
+INSERT INTO `item_db` VALUES (2247, 'Romantic_Gent', 'Romantic Gent', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 31, NULL, NULL);
+INSERT INTO `item_db` VALUES (2248, 'Western_Grace', 'Western Grace', 5, 15000, NULL, 400, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 32, NULL, NULL);
+INSERT INTO `item_db` VALUES (2249, 'Coronet', 'Coronet', 5, 20, NULL, 300, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 33, NULL, 'bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2250, 'Fillet', 'Cute Ribbon', 5, 500, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 34, NULL, 'bonus bMaxSP,20;');
+INSERT INTO `item_db` VALUES (2251, 'Holy_Bonnet', 'Monk Hat', 5, 30000, NULL, 100, NULL, 5, NULL, 0, 33040, 2, 256, NULL, 0, 35, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2252, 'Wizard_Hat', 'Wizard Hat', 5, 20, NULL, 300, NULL, 4, NULL, 0, 66052, 2, 256, NULL, 0, 36, NULL, 'bonus bMaxSP,100;');
+INSERT INTO `item_db` VALUES (2253, 'Sunflower', 'Sunflower', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 37, NULL, 'bonus2 bSubRace,4,10;');
+INSERT INTO `item_db` VALUES (2254, 'Angel_Wing', 'Angel Wing', 5, 20, NULL, 100, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 38, NULL, 'bonus bMdef,3; bonus bAgi,1; bonus bLuk,1; bonus2 bSubRace,6,3;');
+INSERT INTO `item_db` VALUES (2255, 'Evil_Wing', 'Evil Wing', 5, 20, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 39, NULL, 'bonus bMdef,2; bonus bStr,1; bonus2 bSubRace,8,3;');
+INSERT INTO `item_db` VALUES (2256, 'Majestic_Goat', 'Majestic Goat', 5, 20, NULL, 800, NULL, 5, NULL, 0, 279714, 2, 256, NULL, 0, 41, NULL, 'bonus bStr,1;');
+INSERT INTO `item_db` VALUES (2257, 'Snow_Horn', 'Snow Horn', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 42, NULL, NULL);
+INSERT INTO `item_db` VALUES (2258, 'Spiky_Band', 'Spiky Band', 5, 20, NULL, 1000, NULL, 6, NULL, 0, 447986, 2, 256, NULL, 50, 43, NULL, NULL);
+INSERT INTO `item_db` VALUES (2259, 'Mini_Propeller', 'Mini Propeller', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 46, NULL, NULL);
+INSERT INTO `item_db` VALUES (2260, 'Mini_Glasses', 'Mini Glasses', 5, 28000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 0, 47, NULL, NULL);
+INSERT INTO `item_db` VALUES (2261, 'Prontera_Army_Cap', 'Army Cap', 5, 20, NULL, 400, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 0, 48, NULL, NULL);
+INSERT INTO `item_db` VALUES (2262, 'Pierrot_Nose', 'Pierrot Nose', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 49, NULL, NULL);
+INSERT INTO `item_db` VALUES (2263, 'Gangster_Patch', 'Zoro Masque', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 50, NULL, NULL);
+INSERT INTO `item_db` VALUES (2264, 'Munak_Hat', 'Munak Hat', 5, 20, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 769, NULL, 0, 51, NULL, 'bonus2 bSubRace,1,10;');
+INSERT INTO `item_db` VALUES (2265, 'Gangster_Mask', 'Gangster Mask', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 1, NULL, 0, 52, NULL, 'bonus2 bResEff,Eff_Silence,1500;');
+INSERT INTO `item_db` VALUES (2266, 'Iron_Cain', 'Iron Cain', 5, 20, NULL, 300, NULL, 1, NULL, 0, 16514, 2, 1, NULL, 50, 53, NULL, NULL);
+INSERT INTO `item_db` VALUES (2267, 'Cigar', 'Cigar', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 54, NULL, 'bonus2 bSubRace,4,3;');
+INSERT INTO `item_db` VALUES (2268, 'Pipe', 'Pipe', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 55, NULL, 'bonus2 bSubRace,4,3;');
+INSERT INTO `item_db` VALUES (2269, 'Centimental_Flower', 'Centimental Flower', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 56, NULL, 'bonus2 bSubRace,3,3;');
+INSERT INTO `item_db` VALUES (2270, 'Centimental_Leaf', 'Centimental Leaf', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 57, NULL, 'bonus2 bSubRace,3,3;');
+INSERT INTO `item_db` VALUES (2271, 'Jack_a_Dandy', 'Jack a Dandy', 5, 45000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 58, NULL, NULL);
+INSERT INTO `item_db` VALUES (2272, 'Stop_Post', 'Stop Post', 5, 20, NULL, 400, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 59, NULL, NULL);
+INSERT INTO `item_db` VALUES (2273, 'Doctor_Cap', 'Doctor Band', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 60, NULL, 'bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2274, 'Ghost_Bandana', 'Ghost Bandana', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 61, NULL, 'bonus bAgi,2; bonus2 bSubEle,8,10;');
+INSERT INTO `item_db` VALUES (2275, 'Red_Bandana', 'Red Bandana', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 62, NULL, NULL);
+INSERT INTO `item_db` VALUES (2276, 'Eagle_Eyes', 'Eagle Eyes', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 0, 63, NULL, NULL);
+INSERT INTO `item_db` VALUES (2277, 'Nurse_Cap', 'Nurse Cap', 5, 20, NULL, 100, NULL, 1, NULL, 0, 33040, 2, 256, NULL, 0, 64, NULL, 'bonus bInt,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (2278, 'Mr_Smile', 'Mr. Smile', 5, 60, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 65, NULL, NULL);
+INSERT INTO `item_db` VALUES (2279, 'Bomb_Wick', 'Bomb Wick', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 66, NULL, NULL);
+INSERT INTO `item_db` VALUES (2280, 'Sakkat', 'Sakkat', 5, 20, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 67, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2281, 'Phantom_of_Opera', 'Opera Masque', 5, 8000, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 513, NULL, 0, 68, NULL, NULL);
+INSERT INTO `item_db` VALUES (2282, 'Heaven_Ring', 'Heaven Ring', 5, 20, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 69, NULL, 'bonus2 bSubEle,6,10;');
+INSERT INTO `item_db` VALUES (2283, 'Ear_Mufs', 'Ear Mufs', 5, 20, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 70, NULL, 'bonus2 bResEff,Eff_Curse,1000;');
+INSERT INTO `item_db` VALUES (2284, 'Antler', 'Antler', 5, 20, NULL, 500, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 0, 71, NULL, NULL);
+INSERT INTO `item_db` VALUES (2285, 'Apple_Of_Archer', 'Apple o\' Archer', 5, 20, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 30, 72, NULL, 'bonus bDex,3;');
+INSERT INTO `item_db` VALUES (2286, 'Elven_Ears', 'Elven Ears', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 70, 73, NULL, NULL);
+INSERT INTO `item_db` VALUES (2287, 'Pirate_Bandana', 'Pirate Bandana', 5, 20, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 74, NULL, 'bonus bStr,1;');
+INSERT INTO `item_db` VALUES (2288, 'Mr_Scream', 'Mr. Scream', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 75, NULL, NULL);
+INSERT INTO `item_db` VALUES (2289, 'Poo_Poo_Hat', 'Poo Poo Hat', 5, 20, NULL, 700, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 76, NULL, 'bonus2 bSubRace,7,10;');
+INSERT INTO `item_db` VALUES (2290, 'Funeral_Costume', 'Funeral Hat', 5, 3000, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 77, NULL, NULL);
+INSERT INTO `item_db` VALUES (2291, 'Masquerade', 'Masquerade', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 78, NULL, 'bonus2 bAddRace,7,3;');
+INSERT INTO `item_db` VALUES (2292, 'Welding_Mask', 'Welding Mask', 5, 20, NULL, 300, NULL, 2, NULL, 0, 263200, 2, 513, NULL, 50, 79, NULL, 'bonus2 bSubEle,3,10;');
+INSERT INTO `item_db` VALUES (2293, 'Pretend_Murdered', 'Pretend Murdered', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 80, NULL, NULL);
+INSERT INTO `item_db` VALUES (2294, 'Stellar', 'Stellar', 5, 20, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 81, NULL, NULL);
+INSERT INTO `item_db` VALUES (2295, 'Blinker', 'Blinker', 5, 1500, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 512, NULL, 0, 82, NULL, 'bonus2 bResEff,Eff_Blind,10000;');
+INSERT INTO `item_db` VALUES (2296, 'Binoculars', 'Binoculars', 5, 20, NULL, 100, NULL, 1, NULL, 0, 1574920, 2, 512, NULL, 50, 83, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (2297, 'Goblini_Mask', 'Goblini Mask', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 84, NULL, NULL);
+INSERT INTO `item_db` VALUES (2298, 'Green_Feeler', 'Green Feeler', 5, 20, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 85, NULL, NULL);
+INSERT INTO `item_db` VALUES (2299, 'Viking_Helm', 'Viking Helm', 5, 20, NULL, 500, NULL, 5, NULL, 0, 414946, 2, 256, NULL, 0, 86, NULL, NULL);
+INSERT INTO `item_db` VALUES (2301, 'Cotton_Shirt', 'Cotton Shirt', 5, 10, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2302, 'Cotton_Shirt_', 'Cotton Shirt', 5, 10, NULL, 100, NULL, 1, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2303, 'Leather_Jacket', 'Leather Jacket', 5, 200, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2304, 'Leather_Jacket_', 'Leather Jacket', 5, 200, NULL, 200, NULL, 2, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2305, 'Adventure_Suit', 'Adventurer\'s Suit', 5, 1000, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2306, 'Adventure_Suit_', 'Adventurer\'s Suit', 5, 1000, NULL, 300, NULL, 3, NULL, 1, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2307, 'Mantle', 'Mantle', 5, 10000, NULL, 600, NULL, 4, NULL, 0, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2308, 'Mantle_', 'Mantle', 5, 10000, NULL, 600, NULL, 4, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2309, 'Coat', 'Coat', 5, 22000, NULL, 1200, NULL, 5, NULL, 0, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2310, 'Coat_', 'Coat', 5, 22000, NULL, 1200, NULL, 5, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2311, 'Mink_Coat', 'Mink Coat', 5, 50000, NULL, 2300, NULL, 6, NULL, 1, 2088958, 2, 16, NULL, 30, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2312, 'Padded_Armor', 'Padded Armor', 5, 48000, NULL, 2800, NULL, 7, NULL, 0, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2313, 'Padded_Armor_', 'Padded Armor', 5, 48000, NULL, 2800, NULL, 7, NULL, 1, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2314, 'Chain_Mail', 'Chain Mail', 5, 65000, NULL, 3300, NULL, 8, NULL, 0, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2315, 'Chain_Mail_', 'Chain Mail', 5, 65000, NULL, 3300, NULL, 8, NULL, 1, 414946, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2316, 'Full_Plate', 'Full Plate', 5, 80000, NULL, 4500, NULL, 10, NULL, 0, 16514, 2, 16, NULL, 40, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2317, 'Full_Plate_', 'Full Plate', 5, 80000, NULL, 4500, NULL, 10, NULL, 1, 16514, 2, 16, NULL, 40, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2318, 'Clothes_of_the_Lord', 'Lord\'s Clothes', 5, 20, NULL, 2500, NULL, 8, NULL, 1, 263200, 2, 16, NULL, 70, 0, NULL, 'bonus bMdef,5; bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2319, 'Glittering_Clothes', 'Glittering Jacket', 5, 20, NULL, 2500, NULL, 7, NULL, 1, 10477566, 2, 16, NULL, 60, 0, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2320, 'Formal_Suit', 'Formal Suit', 5, 20, NULL, 300, NULL, 5, NULL, 1, 2088958, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2321, 'Silk_Robe', 'Silk Robe', 5, 8000, NULL, 400, NULL, 3, NULL, 0, 378806, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (2322, 'Silk_Robe_', 'Silk Robe', 5, 8000, NULL, 400, NULL, 3, NULL, 1, 378806, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (2323, 'Scapulare', 'Scapulare', 5, 6500, NULL, 400, NULL, 4, NULL, 0, 33040, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2324, 'Scapulare_', 'Scapulare', 5, 6500, NULL, 400, NULL, 4, NULL, 1, 33040, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2325, 'Saint_Robe', 'Saint\'s Robe', 5, 54000, NULL, 600, NULL, 6, NULL, 0, 296240, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2326, 'Saint_Robe_', 'Saint\'s Robe', 5, 54000, NULL, 600, NULL, 6, NULL, 1, 296240, 2, 16, NULL, 0, 0, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2327, 'Holy_Robe', 'Holy Robe', 5, 20, NULL, 1700, NULL, 7, NULL, 0, 33040, 2, 16, NULL, 60, 0, NULL, 'bonus bMdef,5; bonus2 bSubRace,6,15; bonus2 bSubEle,7,10;');
+INSERT INTO `item_db` VALUES (2328, 'Wooden_Mail', 'Wooden Mail', 5, 5500, NULL, 1000, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2329, 'Wooden_Mail_', 'Wooden Mail', 5, 5500, NULL, 1000, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2330, 'Tights', 'Tights', 5, 71000, NULL, 500, NULL, 6, NULL, 0, 1574920, 2, 16, NULL, 45, 0, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (2331, 'Tights_', 'Tights', 5, 71000, NULL, 500, NULL, 6, NULL, 1, 1574920, 2, 16, NULL, 45, 0, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (2332, 'Silver_Robe', 'Silver Robe', 5, 7000, NULL, 700, NULL, 4, NULL, 0, 66052, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2333, 'Silver_Robe_', 'Silver Robe', 5, 7000, NULL, 700, NULL, 4, NULL, 1, 66052, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2334, 'Mage_Coat', 'Mage Coat', 5, 20, NULL, 600, NULL, 5, NULL, 0, 66052, 2, 16, NULL, 50, 0, NULL, 'bonus bMdef,5; bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2335, 'Thief_Clothes', 'Thief Clothes', 5, 74000, NULL, 100, NULL, 6, NULL, 0, 135232, 2, 16, NULL, 0, 0, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2336, 'Thief_Clothes_', 'Thief Clothes', 5, 74000, NULL, 100, NULL, 6, NULL, 1, 135232, 2, 16, NULL, 0, 0, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2337, 'Ninja_Suit', 'Ninja Suit', 5, 20, NULL, 1500, NULL, 7, NULL, 0, 135232, 2, 16, NULL, 50, 0, NULL, 'bonus bAgi,1; bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2338, 'Wedding_Dress', 'Wedding Dress', 5, 43000, NULL, 500, NULL, 0, NULL, 0, 2088958, 0, 16, NULL, 0, 0, NULL, 'bonus bMdef,15; changebase 22;');
+INSERT INTO `item_db` VALUES (2339, 'Pantie', 'Pantie', 5, 1000, NULL, 100, NULL, 4, NULL, 0, 10477567, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2340, 'Novice_Breastplate', 'Novice Breastplate', 5, 89000, NULL, 500, NULL, 4, NULL, 1, 8388609, 2, 16, NULL, 10, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2341, 'Full_Plate_Armor', 'Full Plate Armor', 5, 94000, NULL, 5500, NULL, 11, NULL, 0, 16384, 2, 16, NULL, 70, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2342, 'Full_Plate_Armor_', 'Full Plate Armor', 5, 94000, NULL, 5500, NULL, 11, NULL, 1, 16384, 2, 16, NULL, 70, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2343, 'Robe_of_Casting', 'Casting Robe', 5, 20, NULL, 1100, NULL, 5, NULL, 0, 66048, 2, 16, NULL, 75, 0, NULL, 'bonus bCastrate,-3;');
+INSERT INTO `item_db` VALUES (2344, 'Armor_of_Fire', 'Fire Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,3;');
+INSERT INTO `item_db` VALUES (2345, 'Armor_of_Fire_', 'Fire Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,3;');
+INSERT INTO `item_db` VALUES (2346, 'Armor_of_Water', 'Water Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,1;');
+INSERT INTO `item_db` VALUES (2347, 'Armor_of_Water_', 'Water Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,1;');
+INSERT INTO `item_db` VALUES (2348, 'Armor_of_Wind', 'Wind Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,4;');
+INSERT INTO `item_db` VALUES (2349, 'Armor_of_Wind_', 'Wind Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,4;');
+INSERT INTO `item_db` VALUES (2350, 'Armor_of_Land', 'Earth Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 0, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,2;');
+INSERT INTO `item_db` VALUES (2351, 'Armor_of_Land_', 'Earth Armor', 5, NULL, NULL, 2200, NULL, 4, NULL, 1, 279714, 2, 16, NULL, 45, 0, NULL, 'bonus bDefEle,2;');
+INSERT INTO `item_db` VALUES (2352, 'Armor_For_Novice', 'Novice Armor', 5, NULL, NULL, 1, NULL, 4, NULL, 0, 8388609, 2, 16, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2401, 'Sandals', 'Sandals', 5, 400, NULL, 200, NULL, 1, NULL, 0, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2402, 'Sandals_', 'Sandals', 5, 400, NULL, 200, NULL, 1, NULL, 1, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2403, 'Shoes', 'Shoes', 5, 3500, NULL, 400, NULL, 2, NULL, 0, 2088958, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2404, 'Shoes_', 'Shoes', 5, 3500, NULL, 400, NULL, 2, NULL, 1, 2088958, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2405, 'Boots', 'Boots', 5, 18000, NULL, 600, NULL, 4, NULL, 0, 1989866, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2406, 'Boots_', 'Boots', 5, 18000, NULL, 600, NULL, 4, NULL, 1, 1989866, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2407, 'Crystal_Pumps', 'Crystal Pumps', 5, 20, NULL, 100, NULL, 0, NULL, 0, 2088958, 0, 64, NULL, 0, 0, NULL, 'bonus bMdef,10; bonus bLuk,5;');
+INSERT INTO `item_db` VALUES (2408, 'Cuffs', 'Ball\'n\'Chain', 5, 5000, NULL, 3000, NULL, 3, NULL, 0, 10477567, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2409, 'Spiky_Heel', 'Highheals', 5, 8500, NULL, 600, NULL, 2, NULL, 0, 2088958, 2, 64, NULL, 0, 0, NULL, 'bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2410, 'Sleipnir', 'Sleipnir', 5, 20, NULL, 3500, NULL, 0, NULL, 0, 10477567, 2, 64, NULL, 95, 0, NULL, 'bonus bMdef,10; bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus bSPrecovRate,15; bonus bSpeedRate,25;');
+INSERT INTO `item_db` VALUES (2411, 'Greaves', 'Greaves', 5, 48000, NULL, 750, NULL, 5, NULL, 0, 16512, 2, 64, NULL, 65, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2412, 'Greaves_', 'Greaves', 5, 48000, NULL, 750, NULL, 5, NULL, 1, 16512, 2, 64, NULL, 65, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2413, 'Safety_Shoes', 'Safety Shoes', 5, 20, NULL, 350, NULL, 6, NULL, 0, 16514, 2, 64, NULL, 30, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2414, 'Sandal_For_Novice', 'Novice Sandal', 5, NULL, NULL, 1, NULL, 2, NULL, 0, 8388609, 2, 64, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2501, 'Hood', 'Hood', 5, 1000, NULL, 200, NULL, 1, NULL, 0, 10477567, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2502, 'Hood_', 'Hood', 5, 1000, NULL, 200, NULL, 1, NULL, 1, 10477567, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2503, 'Muffler', 'Muffler', 5, 5000, NULL, 400, NULL, 2, NULL, 0, 2088958, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2504, 'Muffler_', 'Muffler', 5, 5000, NULL, 400, NULL, 2, NULL, 1, 2088958, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2505, 'Manteau', 'Manteau', 5, 32000, NULL, 600, NULL, 4, NULL, 0, 414946, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2506, 'Manteau_', 'Manteau', 5, 32000, NULL, 600, NULL, 4, NULL, 1, 414946, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2507, 'Cape_Of_Ancient_Lord', 'Cape of Old Marquess', 5, 20, NULL, 600, NULL, 2, NULL, 0, 2088958, 2, 4, NULL, 40, 0, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2508, 'Ragamuffin_Cape', 'Ragamuffin Manteau', 5, 20, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 4, NULL, 0, 0, NULL, 'bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (2509, 'Manteau_of_Survival', 'Manteau of Life', 5, 20, NULL, 550, NULL, 0, NULL, 0, 66052, 2, 4, NULL, 75, 0, NULL, 'bonus bVit,10;');
+INSERT INTO `item_db` VALUES (2510, 'Hood_For_Novice', 'Novice Hood', 5, NULL, NULL, 1, NULL, 2, NULL, 0, 8388609, 2, 4, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2601, 'Ring', 'Ring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (2602, 'Earring', 'Earring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (2603, 'Necklace', 'Necklace', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bVit,2;');
+INSERT INTO `item_db` VALUES (2604, 'Glove', 'Glove', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (2605, 'Brooch', 'Brooch', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bAgi,2;');
+INSERT INTO `item_db` VALUES (2607, 'Clip', 'Clip', 5, 30000, NULL, 100, NULL, 0, NULL, 1, 10477567, 2, 136, NULL, 0, 0, NULL, 'bonus bMaxSP,10;');
+INSERT INTO `item_db` VALUES (2608, 'Rosary', 'Rosary', 5, 15000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 20, 0, NULL, 'bonus bMdef,5; bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (2609, 'Skull_Ring', 'Skull Ring', 5, 10000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2610, 'Gold_Ring', 'Gold Ring', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2611, 'Silver_Ring', 'Silver Ring', 5, 20000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2612, 'Flower_Ring', 'Flower Ring', 5, 1500, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2613, 'Diamond_Ring', 'Diamond Ring', 5, 45000, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2614, 'Eye_of_Dullahan', 'Eye of Dullahan', 5, 90000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 50, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2615, 'Safety_Ring', 'Safety Ring', 5, 75000, NULL, 100, NULL, 3, NULL, 0, 2088958, 2, 136, NULL, 40, 0, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (2616, 'Critical_Ring', 'Critical Ring', 5, 75000, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 136, NULL, 40, 0, NULL, 'bonus bCritical,5;');
+INSERT INTO `item_db` VALUES (2617, 'Celebrant\'s_Mitten', 'Celebrant\'s Mitten', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 136, NULL, 35, 0, NULL, 'bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2618, 'Matyr\'s_Leash', 'Matyr\'s Leash', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 136, NULL, 35, 0, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2619, 'Thimble_Of_Archer', 'Bow Thimble', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 1574920, 2, 136, NULL, 65, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2620, 'Ring_Of_Rogue', 'Rogue\'s Treasure', 5, 30000, NULL, 100, NULL, 0, NULL, 0, 135232, 2, 136, NULL, 70, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2621, 'Ring_', 'Ancient Ring', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bStr,1;');
+INSERT INTO `item_db` VALUES (2622, 'Earring_', 'Ancient Earring', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bInt,1;');
+INSERT INTO `item_db` VALUES (2623, 'Necklace_', 'Ancient Necklace', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bVit,1;');
+INSERT INTO `item_db` VALUES (2624, 'Glove_', 'Ancient Glove', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (2625, 'Brooch_', 'Ancient Brooch', 5, 30000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (2626, 'Rosary_', 'Ancient Rosary', 5, 15000, NULL, 200, NULL, 0, NULL, 1, 2088958, 2, 136, NULL, 90, 0, NULL, 'bonus bMdef,3; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (2627, 'Belt', 'Ancient Belt', 5, 20000, NULL, 1200, NULL, 0, NULL, 1, 10477567, 2, 136, NULL, 25, 0, NULL, NULL);
+INSERT INTO `item_db` VALUES (2628, 'Novice_Armlet', 'Novice Armlet', 5, 400, NULL, 200, NULL, 0, NULL, 1, 8388609, 2, 136, NULL, 0, 0, NULL, 'bonus bStr,1; bonus bInt,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (2629, 'Magingiorde', 'Magingiorde', 5, 20, NULL, 8000, NULL, 2, NULL, 0, 10477567, 2, 136, NULL, 90, 0, NULL, 'bonus bStr,40; bonus bMdef,7;');
+INSERT INTO `item_db` VALUES (2630, 'Brysinggamen', 'Brysinggamen', 5, 20, NULL, 1500, NULL, 1, NULL, 0, 10477567, 2, 136, NULL, 95, 0, NULL, 'bonus bStr,3; bonus bAgi,3; bonus bVit,3; bonus bInt,3; bonus bMdef,5;');
+INSERT INTO `item_db` VALUES (2631, 'Pebble_Ring', 'Pebble Ring', 5, NULL, NULL, 10, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, 0, NULL, 'bonus bStr,2; bonus bAgi,2; bonus bVit,2; bonus bInt,2; bonus bDex,2; bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (2634, 'Wedding_Ring_M', 'Wedding Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 1, 136, NULL, 0, NULL, NULL, 'skill 334,1; skill 335,1; skill 336,1;');
+INSERT INTO `item_db` VALUES (2635, 'Wedding_Ring_F', 'Wedding Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 0, 136, NULL, 0, NULL, NULL, 'skill 334,1; skill 335,1; skill 336,1;');
+INSERT INTO `item_db` VALUES (2636, 'Gold_Christmas_Ring', 'Gold Christmas Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (2637, 'Silver_Christmas_Ring', 'Silver Christmas Ring', 5, NULL, NULL, 0, NULL, 0, NULL, 0, 10477567, 2, 136, NULL, 0, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (2638, 'Exorcize_Sachet', 'Exorcize Sachet', 5, NULL, NULL, 100, NULL, 0, NULL, NULL, 10477567, NULL, 136, NULL, 0, NULL, NULL, 'bonus bStr,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (2639, 'Purification_Sachet', 'Purification Sachet', 5, NULL, NULL, 100, NULL, 0, NULL, NULL, 10477567, NULL, 136, NULL, 0, NULL, NULL, 'bonus bAgi,1; bonus bInt,1;');
+INSERT INTO `item_db` VALUES (4001, 'Poring_Card', 'Poring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bLuk,2; bonus bFlee2,1;');
+INSERT INTO `item_db` VALUES (4002, 'Fabre_Card', 'Fabre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bVit,1; bonus bMaxHP,100;');
+INSERT INTO `item_db` VALUES (4003, 'Pupa_Card', 'Pupa Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHP,700;');
+INSERT INTO `item_db` VALUES (4004, 'Drops_Card', 'Drops Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDex,1; bonus bHit,3;');
+INSERT INTO `item_db` VALUES (4005, 'Poring__Card', 'Poring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,7,20;');
+INSERT INTO `item_db` VALUES (4006, 'Lunatic_Card', 'Lunatic Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bLuk,1; bonus bCritical,1; bonus bFlee2,1;');
+INSERT INTO `item_db` VALUES (4007, 'Pecopeco_Egg_Card', 'Pecopeco Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,0,20;');
+INSERT INTO `item_db` VALUES (4008, 'Picky_Card', 'Picky Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bBaseAtk,10;');
+INSERT INTO `item_db` VALUES (4009, 'Chonchon_Card', 'Chonchon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bFlee,2;');
+INSERT INTO `item_db` VALUES (4010, 'Wilow_Card', 'Wilow Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bMaxSP,80;');
+INSERT INTO `item_db` VALUES (4011, 'Picky__Card', 'Picky Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bVit,1; bonus bMaxHP,100;');
+INSERT INTO `item_db` VALUES (4012, 'Thief_Bug_Egg_Card', 'Thief Bug Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHP,400;');
+INSERT INTO `item_db` VALUES (4013, 'Andre_Egg_Card', 'Andre Egg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,5;');
+INSERT INTO `item_db` VALUES (4014, 'Roda_Frog_Card', 'Roda Frog Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHP,400; bonus bMaxSP,50;');
+INSERT INTO `item_db` VALUES (4015, 'Condor_Card', 'Condor Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bFlee,10;');
+INSERT INTO `item_db` VALUES (4016, 'Thief_Bug_Card', 'Thief Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (4017, 'Savage_Babe_Card', 'Savage Babe Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,500;');
+INSERT INTO `item_db` VALUES (4018, 'Andre_Larva_Card', 'Andre Larva Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bInt,1; bonus bMaxSP,10;');
+INSERT INTO `item_db` VALUES (4019, 'Hornet_Card', 'Hornet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bBaseAtk,3;');
+INSERT INTO `item_db` VALUES (4020, 'Farmiliar_Card', 'Farmiliar Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4021, 'Rocker_Card', 'Rocker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (4022, 'Spore_Card', 'Spore Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bVit,2;');
+INSERT INTO `item_db` VALUES (4023, 'Baby_Desert_Wolf_Card', 'Baby Desert Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bInt,1;');
+INSERT INTO `item_db` VALUES (4024, 'Plankton_Card', 'Plankton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4025, 'Skeleton_Card', 'Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,10; bonus2 bAddEff,Eff_Stan,200;');
+INSERT INTO `item_db` VALUES (4026, 'Thief_bug_Female_Card', 'Thief bug Female Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bFlee,1;');
+INSERT INTO `item_db` VALUES (4027, 'Kukre_Card', 'Kukre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bAgi,2;');
+INSERT INTO `item_db` VALUES (4028, 'Tarou_Card', 'Tarou Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (4029, 'Wolf_Card', 'Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,15; bonus bCritical,1;');
+INSERT INTO `item_db` VALUES (4030, 'Mandragora_Card', 'Mandragora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,4,20;');
+INSERT INTO `item_db` VALUES (4031, 'Pecopeco_Card', 'Pecopeco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10;');
+INSERT INTO `item_db` VALUES (4032, 'Ambernite_Card', 'Ambernite Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bDef,2;');
+INSERT INTO `item_db` VALUES (4033, 'Poporing_Card', 'Poporing Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 53,1;');
+INSERT INTO `item_db` VALUES (4034, 'Worm_Tail_Card', 'Worm Tail Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (4035, 'Hydra_Card', 'Hydra Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,7,20;');
+INSERT INTO `item_db` VALUES (4036, 'Muka_Card', 'Muka Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bHPrecovRate,10;');
+INSERT INTO `item_db` VALUES (4037, 'Snake_Card', 'Snake Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4038, 'Zombie_Card', 'Zombie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bHPrecovRate,20;');
+INSERT INTO `item_db` VALUES (4039, 'Stainer_Card', 'Stainer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Silence,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4040, 'Creamy_Card', 'Creamy Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 26,1;');
+INSERT INTO `item_db` VALUES (4041, 'Coco_Card', 'Coco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Sleep,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4042, 'Steel_Chonchon_Card', 'Steel Chonchon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,10; bonus bDef,2;');
+INSERT INTO `item_db` VALUES (4043, 'Andre_Card', 'Andre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,20;');
+INSERT INTO `item_db` VALUES (4044, 'Smokie_Card', 'Smokie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 51,1;');
+INSERT INTO `item_db` VALUES (4045, 'Horn_Card', 'Horn Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bLongAtkDef,35;');
+INSERT INTO `item_db` VALUES (4046, 'Martin_Card', 'Martin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Blind,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4047, 'Ghostring_Card', 'Ghostring Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,8; bonus bHPrecovRate,-25;');
+INSERT INTO `item_db` VALUES (4048, 'Poison_Spore_Card', 'Poison Spore Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 52,3;');
+INSERT INTO `item_db` VALUES (4049, 'Vadon_Card', 'Vadon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,3,20;');
+INSERT INTO `item_db` VALUES (4050, 'Male_Thief_Bug_Card', 'Male Thief Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bAgi,2;');
+INSERT INTO `item_db` VALUES (4051, 'Yoyo_Card', 'Yoyo Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bFlee2,5; bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (4052, 'Elder_Willow_Card', 'Elder Willow Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (4053, 'Vitata_Card', 'Vitata Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 28,1; bonus bUseSPrate,25;');
+INSERT INTO `item_db` VALUES (4054, 'Angeling_Card', 'Angeling Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,6;');
+INSERT INTO `item_db` VALUES (4055, 'Marina_Card', 'Marina Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4056, 'Dustiness_Card', 'Dustiness Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4057, 'Metaller_Card', 'Metaller Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4058, 'Thara_Frog_Card', 'Thara Frog Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,7,30;');
+INSERT INTO `item_db` VALUES (4059, 'Soldier_Andre_Card', 'Soldier Andre Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,3,30;');
+INSERT INTO `item_db` VALUES (4060, 'Goblin_Card', 'Goblin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,2,20;');
+INSERT INTO `item_db` VALUES (4061, 'Cornutus_Card', 'Cornutus Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4062, 'Anacondaq_Card', 'Anacondaq Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,5,20;');
+INSERT INTO `item_db` VALUES (4063, 'Caramel_Card', 'Caramel Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,4,20;');
+INSERT INTO `item_db` VALUES (4064, 'Zerom_Card', 'Zerom Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,3;');
+INSERT INTO `item_db` VALUES (4065, 'Kaho_Card', 'Kaho Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,2,20;');
+INSERT INTO `item_db` VALUES (4066, 'Orc_Warrior_Card', 'Orc Warrior Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,2,30;');
+INSERT INTO `item_db` VALUES (4067, 'Megalodon_Card', 'Megalodon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Freeze,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4068, 'Scorpion_Card', 'Scorpion Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,3,20;');
+INSERT INTO `item_db` VALUES (4069, 'Drainliar_Card', 'Drainliar Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,1,20;');
+INSERT INTO `item_db` VALUES (4070, 'Eggyra_Card', 'Eggyra Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bSPrecovRate,15;');
+INSERT INTO `item_db` VALUES (4071, 'Orc_Zombie_Card', 'Orc Zombie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,9,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4072, 'Golem_Card', 'Golem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4073, 'Pirate_Skeleton_Card', 'Pirate Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 37,5;');
+INSERT INTO `item_db` VALUES (4074, 'BigFoot_Card', 'BigFoot Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,4,30;');
+INSERT INTO `item_db` VALUES (4075, 'Argos_Card', 'Argos Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4076, 'Magnolia_Card', 'Magnolia Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,500; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4077, 'Phen_Card', 'Phen Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bNoCastCancel,0; bonus bCastrate,25;');
+INSERT INTO `item_db` VALUES (4078, 'Savage_Card', 'Savage Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bVit,3;');
+INSERT INTO `item_db` VALUES (4079, 'Mantis_Card', 'Mantis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,3;');
+INSERT INTO `item_db` VALUES (4080, 'Flora_Card', 'Flora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,5,20;');
+INSERT INTO `item_db` VALUES (4081, 'Hode_Card', 'Hode Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,2,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4082, 'Desert_Wolf_Card', 'Desert Wolf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,0,15; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4083, 'Rafflesia_Card', 'Rafflesia Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,5,30;');
+INSERT INTO `item_db` VALUES (4084, 'Marine_Sphere_Card', 'Marine Sphere Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 7,3;');
+INSERT INTO `item_db` VALUES (4085, 'Orc_Skeleton_Card', 'Orc Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,6,20;');
+INSERT INTO `item_db` VALUES (4086, 'Soldier_Skeleton_Card', 'Soldier Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bCritical,9;');
+INSERT INTO `item_db` VALUES (4087, 'Giearth_Card', 'Giearth Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Confusion,10000; bonus2 bSubEle,2,15;');
+INSERT INTO `item_db` VALUES (4088, 'Frilldora_Card', 'Frilldora Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'skill 135,1;');
+INSERT INTO `item_db` VALUES (4089, 'Sword_Fish_Card', 'Swordfish Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,1; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4090, 'Munak_Card', 'Munak Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,1500; bonus2 bSubEle,2,5; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4091, 'Kobold_Card', 'Kobold Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus bCritical,4;');
+INSERT INTO `item_db` VALUES (4092, 'Skel_Worker_Card', 'Skel Worker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,1,15; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4093, 'Obeaune_Card', 'Obeaune Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 35,1;');
+INSERT INTO `item_db` VALUES (4094, 'Archer_Skeleton_Card', 'Archer Skeleton Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (4095, 'Marse_Card', 'Marse Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,30;');
+INSERT INTO `item_db` VALUES (4096, 'Zenorc_Card', 'Zenorc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,400; bonus bBaseAtk,10;');
+INSERT INTO `item_db` VALUES (4097, 'Matyr_Card', 'Matyr Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10; bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (4098, 'Dokebi_Card', 'Dokebi Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,4; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4099, 'Pasana_Card', 'Pasana Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,3; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4100, 'Sohee_Card', 'Sohee Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxSPrate,15; bonus bSPrecovRate,3;');
+INSERT INTO `item_db` VALUES (4101, 'Sand_Man_Card', 'Sandman Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,2; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4102, 'Whisper_Card', 'Whisper Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bFlee,20; bonus2 bSubEle,8,-50;');
+INSERT INTO `item_db` VALUES (4103, 'Horong_Card', 'Horong Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 10,1;');
+INSERT INTO `item_db` VALUES (4104, 'Requiem_Card', 'Requiem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Confusion,500;');
+INSERT INTO `item_db` VALUES (4105, 'Marc_Card', 'Marc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,5; bonus2 bResEff,Eff_Freeze,10000;');
+INSERT INTO `item_db` VALUES (4106, 'Mummy_Card', 'Mummy Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,20;');
+INSERT INTO `item_db` VALUES (4107, 'Verit_Card', 'Verit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,8; bonus bMaxSPrate,8;');
+INSERT INTO `item_db` VALUES (4108, 'Myst_Card', 'Myst Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,5,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4109, 'Jakk_Card', 'Jakk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,3,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4110, 'Ghoul_Card', 'Ghoul Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Poison,2000; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4111, 'Strouf_Card', 'Strouf Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,6,20;');
+INSERT INTO `item_db` VALUES (4112, 'Marduk_Card', 'Marduk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Silence,10000;');
+INSERT INTO `item_db` VALUES (4113, 'Marionette_Card', 'Marionette Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,8,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4114, 'Argiope_Card', 'Argiope Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,5; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4115, 'Hunter_Fly_Card', 'Hunter Fly Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bHpDrainRate,3,15;');
+INSERT INTO `item_db` VALUES (4116, 'Isis_Card', 'Isis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,7,30; bonus bFlee,5;');
+INSERT INTO `item_db` VALUES (4117, 'Side_Winder_Card', 'Sidewinder Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDoubleRate,5;');
+INSERT INTO `item_db` VALUES (4118, 'Petit_Card', 'Petit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,9,20;');
+INSERT INTO `item_db` VALUES (4119, 'Bathory_Card', 'Bathory Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,7;');
+INSERT INTO `item_db` VALUES (4120, 'Petit__Card', 'Petit Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,9,30;');
+INSERT INTO `item_db` VALUES (4121, 'Phreeoni_Card', 'Phreeoni Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,100;');
+INSERT INTO `item_db` VALUES (4122, 'Deviruchi_Card', 'Deviruchi Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bStr,1; bonus2 bResEff,Eff_Blind,10000;');
+INSERT INTO `item_db` VALUES (4123, 'Eddga_Card', 'Eddga Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bInfiniteEndure,0; bonus bMaxHPrate,-25;');
+INSERT INTO `item_db` VALUES (4124, 'Medusa_Card', 'Medusa Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,6,15; bonus2 bResEff,Eff_Stone,10000;');
+INSERT INTO `item_db` VALUES (4125, 'Deviace_Card', 'Deviace Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,7,7; bonus2 bAddRace,2,7; bonus2 bAddRace,3,7; bonus2 bAddRace,4,7;');
+INSERT INTO `item_db` VALUES (4126, 'Minorous_Card', 'Minorous Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,2,15; bonus bBaseAtk,5;');
+INSERT INTO `item_db` VALUES (4127, 'Nightmare_Card', 'Nightmare Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (4128, 'Golden_Bug_Card', 'Golden Bug Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bNoMagicDamage,0; bonus bUseSPrate,100;');
+INSERT INTO `item_db` VALUES (4129, 'Baphomet__Card', 'Baphomet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bAgi,3; bonus bCritical,1;');
+INSERT INTO `item_db` VALUES (4130, 'Scorpion_King_Card', 'Scorpion King Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEle,9,20;');
+INSERT INTO `item_db` VALUES (4131, 'Moonlight_Flower_Card', 'Moonlight Flower Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bSpeedRate,25;');
+INSERT INTO `item_db` VALUES (4132, 'Mistress_Card', 'Mistress Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bNoGemStone,0; bonus bUseSPrate,25;');
+INSERT INTO `item_db` VALUES (4133, 'Raydric_Card', 'Raydric Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,0,20;');
+INSERT INTO `item_db` VALUES (4134, 'Dracula_Card', 'Dracula Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bSpDrainRate,3,5;');
+INSERT INTO `item_db` VALUES (4135, 'Orc_Lord_Card', 'Orc Lord Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bShortWeaponDamageReturn,30;');
+INSERT INTO `item_db` VALUES (4136, 'Khalitzburg_Card', 'Khalitzburg Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,6,30;');
+INSERT INTO `item_db` VALUES (4137, 'Drake_Card', 'Drake Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bNoSizeFix,0;');
+INSERT INTO `item_db` VALUES (4138, 'Anubis_Card', 'Anubis Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus2 bSubRace,8,30;');
+INSERT INTO `item_db` VALUES (4139, 'Joker_Card', 'Joker Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 50,1;');
+INSERT INTO `item_db` VALUES (4140, 'Knight_Of_Abyss_Card', 'Knight Of Abyss Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddRace,10,25;');
+INSERT INTO `item_db` VALUES (4141, 'Evil_Druid_Card', 'Evil Druid Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bDefEle,9; bonus bInt,1; bonus bDef,1;');
+INSERT INTO `item_db` VALUES (4142, 'Doppelganger_Card', 'Doppelganger Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAspdRate,30;');
+INSERT INTO `item_db` VALUES (4143, 'Orc_Hero_Card', 'Orc Hero Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bVit,3; bonus2 bResEff,Eff_Stan,10000;');
+INSERT INTO `item_db` VALUES (4144, 'Osiris_Card', 'Osiris Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRestartFullRecover,0;');
+INSERT INTO `item_db` VALUES (4145, 'Berzebub_Card', 'Berzebub Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bCastrate,-30;');
+INSERT INTO `item_db` VALUES (4146, 'Maya_Card', 'Maya Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMagicDamageReturn,30;');
+INSERT INTO `item_db` VALUES (4147, 'Baphomet_Card', 'Baphomet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,-10; bonus bSplashRange,1;');
+INSERT INTO `item_db` VALUES (4148, 'Pharaoh_Card', 'Pharaoh Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-30;');
+INSERT INTO `item_db` VALUES (4149, 'Bon_Gun_Card', 'Bon Gun Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bInt,2;');
+INSERT INTO `item_db` VALUES (4150, 'Orc_Archer_Card', 'Orc Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRange,1;');
+INSERT INTO `item_db` VALUES (4151, 'Mimic_Card', 'Mimic Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bAgi,1; bonus bDex,2; bonus bLuk,3;');
+INSERT INTO `item_db` VALUES (4152, 'Wraith_Card', 'Wraith Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bMatk,8;');
+INSERT INTO `item_db` VALUES (4153, 'Alarm_Card', 'Alarm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bCastrate,-10;');
+INSERT INTO `item_db` VALUES (4154, 'Arclouse_Card', 'Arclouse Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (4155, 'Rideword_Card', 'Rideword Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bDex,6;');
+INSERT INTO `item_db` VALUES (4156, 'Skeleton_Prisoner_Card', 'Skel Prisoner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 45,3;');
+INSERT INTO `item_db` VALUES (4157, 'Zombie_Prisoner_Card', 'Zombie Prisoner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate,10;');
+INSERT INTO `item_db` VALUES (4158, 'Dark_Priest_Card', 'Dark Priest Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
+INSERT INTO `item_db` VALUES (4159, 'Punk_Card', 'Punk Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
+INSERT INTO `item_db` VALUES (4160, 'Zherlthsh_Card', 'Zherlthsh Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bUseSPrate,-15;');
+INSERT INTO `item_db` VALUES (4161, 'Mysteltainn_Card', 'Mysteltainn Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtk,30; bonus bMaxHPrate,-22; bonus bCastrate,-10;');
+INSERT INTO `item_db` VALUES (4162, 'Tirfing_Card', 'Tirfing Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAgi,3; bonus bFlee,10;');
+INSERT INTO `item_db` VALUES (4163, 'Executioner_Card', 'Executioner Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bRandomAttackIncrease,300, 4;');
+INSERT INTO `item_db` VALUES (4164, 'Anolian_Card', 'Anolian Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (4165, 'Sting_Card', 'Sting Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bDex,4;');
+INSERT INTO `item_db` VALUES (4166, 'Wander_Man_Card', 'Wander Man Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,30; bonus bCritical,6;');
+INSERT INTO `item_db` VALUES (4167, 'Cramp_Card', 'Cramp Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bAgi,3;');
+INSERT INTO `item_db` VALUES (4168, 'Filamentous_Card', 'Filamentous Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus2 bResEff,Eff_Stone,100; bonus2 bResEff,Eff_Freeze,100; bonus2 bResEff,Eff_Stan,100; bonus2 bResEff,Eff_Sleep,100; bonus2 bResEff,Eff_Poison,100; bonus2 bResEff,Eff_Curse,100; bonus2 bResEff,Eff_Silence,100; bonus2 bResEff,Eff_Confusion,100; bonus2 bResEff,Eff_Blind,100;');
+INSERT INTO `item_db` VALUES (4169, 'Brilight_Card', 'Brilight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bAgi,2; bonus bLuk,3;');
+INSERT INTO `item_db` VALUES (4170, 'Iron_Fist_Card', 'Iron Fist Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'bonus bVit,2;');
+INSERT INTO `item_db` VALUES (4171, 'High_Orc_Card', 'High Orc Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 16, NULL, NULL, NULL, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (4172, 'Choco_Card', 'Choco Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bStr,100; bonus bAgi,100; bonus bVit,100; bonus bInt,100; bonus bDex,100; bonus bLuk,100;');
+INSERT INTO `item_db` VALUES (4173, 'Stem_Worm_Card', 'Stem Worm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (4174, 'Penonema_Card', 'Penomena Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHPrate, 15;');
+INSERT INTO `item_db` VALUES (4175, 'Marin_Card', 'Marin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,1,20;');
+INSERT INTO `item_db` VALUES (4176, 'Sasquatch_Card', 'Sasquatch Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,1,50; bonus bAtk,-10;');
+INSERT INTO `item_db` VALUES (4177, 'Antonio_Card', 'Antonio Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'skill 50,5; skill 210,5;');
+INSERT INTO `item_db` VALUES (4178, 'Cruiser_Card', 'Cruiser Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stone,50;');
+INSERT INTO `item_db` VALUES (4179, 'Mystcase_Card', 'Mystcase Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus bCastrate,-50; bonus bAtk,+50;');
+INSERT INTO `item_db` VALUES (4180, 'Chepet_Card', 'Chepet Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bLuk,5;');
+INSERT INTO `item_db` VALUES (4181, 'Stormy_Knight_Card', 'Stormy Knight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Freeze,25; bonus bAtk,25;');
+INSERT INTO `item_db` VALUES (4182, 'Hatii_Card', 'Hatii Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,2,50; bonus bAtk,-10;');
+INSERT INTO `item_db` VALUES (4183, 'Gargoyle_Card', 'Gargoyle Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 136, NULL, NULL, NULL, NULL, 'bonus bRange,5;');
+INSERT INTO `item_db` VALUES (4184, 'Raggler_Card', 'Raggler Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Sleep,50;');
+INSERT INTO `item_db` VALUES (4185, 'Neraid_Card', 'Neraid Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus2 bAddSize,0,50; bonus bAtk,-10;');
+INSERT INTO `item_db` VALUES (4186, 'Pest_Card', 'Pest Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,0,20;');
+INSERT INTO `item_db` VALUES (4187, 'Injustice_Card', 'Injustice Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,9,20;');
+INSERT INTO `item_db` VALUES (4188, 'Goblin_Archer_Card', 'Goblin Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,2,20;');
+INSERT INTO `item_db` VALUES (4189, 'Gryphon_Card', 'Gryphon Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Silence,25; bonus bAtk,25;');
+INSERT INTO `item_db` VALUES (4190, 'Dark_Frame_Card', 'Dark Frame Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 769, NULL, NULL, NULL, NULL, 'skill 32,2;');
+INSERT INTO `item_db` VALUES (4191, 'Wind_Ghost_Card', 'Wind Ghost Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,4;');
+INSERT INTO `item_db` VALUES (4192, 'Merman_Card', 'Merman Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,1;');
+INSERT INTO `item_db` VALUES (4193, 'Cookie_Card', 'Cookie Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,7;');
+INSERT INTO `item_db` VALUES (4194, 'Aster_Card', 'Aster Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,3,20;');
+INSERT INTO `item_db` VALUES (4195, 'Carat_Card', 'Carat Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,6,20;');
+INSERT INTO `item_db` VALUES (4196, 'Bloody_Knight_Card', 'Bloody Knight Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Blind,25; bonus bAtk,25;');
+INSERT INTO `item_db` VALUES (4197, 'Clock_Card', 'Clock Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'bonus bLuk,10;');
+INSERT INTO `item_db` VALUES (4198, 'Clock_Tower_Manager_Card', 'C Tower Manager Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Curse,50;');
+INSERT INTO `item_db` VALUES (4199, 'Alligator_Card', 'Alligator Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Poison,50;');
+INSERT INTO `item_db` VALUES (4200, 'Dark_Lord_Card', 'Dark Lord Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,9;');
+INSERT INTO `item_db` VALUES (4201, 'Orc_Lady_Card', 'Orc Lady Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,4,20;');
+INSERT INTO `item_db` VALUES (4202, 'Megalith_Card', 'Megalith Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, NULL, NULL, 'skill 9,1;');
+INSERT INTO `item_db` VALUES (4203, 'Alice_Card', 'Alice Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,6;');
+INSERT INTO `item_db` VALUES (4204, 'Raydric_Archer_Card', 'Raydric Archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,3;');
+INSERT INTO `item_db` VALUES (4205, 'Greatest_General_Card', 'Greatest General Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,5,20;');
+INSERT INTO `item_db` VALUES (4206, 'Stalatic_Golem_Card', 'Stalactic Golem Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 32, NULL, NULL, NULL, NULL, 'bonus bMaxHP,500; bonus bDex,-3;');
+INSERT INTO `item_db` VALUES (4207, 'Tri_Joint_Card', 'Tri Joint Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,7,20;');
+INSERT INTO `item_db` VALUES (4208, 'Steamrider_Goblin_Card', 'Steam Goblin Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 64, NULL, NULL, NULL, NULL, 'bonus2 bSubEle,8,20;');
+INSERT INTO `item_db` VALUES (4209, 'Sage_Worm_Card', 'Sage Worm Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bAtkEle,8;');
+INSERT INTO `item_db` VALUES (4210, 'Kobold_Archer_Card', 'Kobold archer Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus bHit,25; bonus bAtk,25;');
+INSERT INTO `item_db` VALUES (4211, 'Chimera_Card', 'Chimera Card', 6, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, 'bonus2 bAddEff,Eff_Stan,25; bonus bAtk,25;');
+INSERT INTO `item_db` VALUES (5001, 'Headset', 'Headset', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 87, NULL, 'bonus2 bResEff,Eff_Curse,1000;');
+INSERT INTO `item_db` VALUES (5002, 'Jewel_Crown', 'Jewel Crown', 5, 20, NULL, 600, NULL, 4, NULL, 0, 414946, 2, 256, NULL, 60, 88, NULL, 'bonus bMdef,3; bonus bInt,2; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (5003, 'Joker_Jester', 'Joker Jester', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 89, NULL, 'bonus bMdef,5; bonus bLuk,2;');
+INSERT INTO `item_db` VALUES (5004, 'Oxygen_Mask', 'Oxygen Mask', 5, 20, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 1, NULL, 0, 90, NULL, 'bonus2 bResEff,Eff_Poison,2000;');
+INSERT INTO `item_db` VALUES (5005, 'Gas_Mask', 'Gas Mask', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 513, NULL, 0, 91, NULL, 'bonus2 bResEff,Eff_Poison,3000;');
+INSERT INTO `item_db` VALUES (5006, 'Machoman_Glasses', 'Machoman\'s Glasses', 5, 36000, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 0, 92, NULL, NULL);
+INSERT INTO `item_db` VALUES (5007, 'Grand_Circlet', 'Grand Circlet', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 55, 93, NULL, 'bonus bMdef,4; bonus bStr,1; bonus bInt,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (5008, 'Puppy_Love', 'Puppy Love', 5, 20, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 94, NULL, NULL);
+INSERT INTO `item_db` VALUES (5009, 'Safety_Helmet', 'Safety Helmet', 5, 20, NULL, 500, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 95, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (5010, 'Indian_Hair_Piece', 'Indian Fillet', 5, 20, NULL, 100, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 96, NULL, NULL);
+INSERT INTO `item_db` VALUES (5011, 'Aerial', 'Aerial', 5, 20, NULL, 100, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 97, NULL, NULL);
+INSERT INTO `item_db` VALUES (5012, 'Ph.D_Hat', 'Ph.D Hat', 5, 20, NULL, 200, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 0, 98, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (5013, 'Horn_Of_Lord_Kaho', 'Lord Kaho\'s Horn', 5, 20, NULL, 100, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 0, 99, NULL, 'bonus bMdef,10; bonus bStr,5; bonus bAgi,10; bonus bVit,10; bonus bInt,5; bonus bLuk,20;');
+INSERT INTO `item_db` VALUES (5014, 'Fin_Helm', 'Fin Helm', 5, 20, NULL, 300, NULL, 2, NULL, 0, 16514, 2, 512, NULL, 65, 100, NULL, NULL);
+INSERT INTO `item_db` VALUES (5015, 'Egg_Shell', 'Egg Shell', 5, 20, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 101, NULL, NULL);
+INSERT INTO `item_db` VALUES (5016, 'Boy\'s_Cap', 'Boy\'s Cap', 5, 20, NULL, 100, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 102, NULL, NULL);
+INSERT INTO `item_db` VALUES (5017, 'Bone_Helm', 'Bone Helm', 5, 20, NULL, 800, NULL, 7, NULL, 0, 279714, 2, 256, NULL, 70, 103, NULL, 'bonus2 bSubEle,7,-15;');
+INSERT INTO `item_db` VALUES (5018, 'Feather_Bonnet', 'Feather Bonnet', 5, 20, NULL, 300, NULL, 4, NULL, 0, 1574920, 2, 256, NULL, 0, 104, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (5019, 'Corsair', 'Corsair', 5, 20, NULL, 500, NULL, 5, NULL, 0, 2088958, 2, 256, NULL, 0, 105, NULL, 'bonus bVit,1;');
+INSERT INTO `item_db` VALUES (5020, 'Kafra_Band', 'Kafra Band', 5, 20, NULL, 500, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 106, NULL, 'bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (5021, 'Bankruptcy_of_Heart', 'Money Loser\'s Grief', 5, NULL, NULL, 1200, NULL, 4, NULL, 0, 263200, 2, 256, NULL, 38, 107, NULL, 'bonus bInt,1; bonus bDex,1;');
+INSERT INTO `item_db` VALUES (5022, 'Solar_God_Helm', 'Solar God Helm', 5, NULL, NULL, 2400, NULL, 4, NULL, 0, 2088832, 2, 768, NULL, 0, 138, NULL, 'bonus bStr,3; bonus bInt,2;');
+INSERT INTO `item_db` VALUES (5023, 'Parcel_Hat', 'Parcel Hat', 5, NULL, NULL, 1000, NULL, 0, NULL, 0, 263200, 2, 256, NULL, 0, 108, NULL, NULL);
+INSERT INTO `item_db` VALUES (5024, 'Cake_Hat', 'Cake Hat', 5, NULL, NULL, 1500, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 109, NULL, NULL);
+INSERT INTO `item_db` VALUES (5025, 'Angel_Helm', 'Angel Helm', 5, NULL, NULL, 1600, NULL, 5, NULL, 0, 2088832, 2, 256, NULL, 74, 110, NULL, 'bonus bAgi,1; bonus bLuk,1; bonus bMdef,3;');
+INSERT INTO `item_db` VALUES (5026, 'Chef_Hat', 'Chef\'s Hat', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 50, 111, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (5027, 'Mage_Hat', 'Mage Hat', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 66052, 2, 256, NULL, 0, 112, NULL, 'bonus bInt,2; bonus bMaxSP,150;');
+INSERT INTO `item_db` VALUES (5028, 'Candle', 'Candle', 5, NULL, NULL, 150, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 0, 113, NULL, NULL);
+INSERT INTO `item_db` VALUES (5029, 'Spore_Hat', 'Spore Hat', 5, NULL, NULL, 900, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 20, 114, NULL, NULL);
+INSERT INTO `item_db` VALUES (5030, 'Panda_Hat', 'Panda Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 40, 115, NULL, NULL);
+INSERT INTO `item_db` VALUES (5031, 'Miner\'s_Helmet', 'Miner\'s Helmet', 5, NULL, NULL, 1500, NULL, 4, NULL, 0, 447986, 2, 256, NULL, 55, 116, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (5032, 'Sunday_Hat', 'Sunday Hat', 5, NULL, NULL, 800, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 117, NULL, NULL);
+INSERT INTO `item_db` VALUES (5033, 'Smokie_Hat', 'Smokie Hat', 5, NULL, NULL, 900, NULL, 3, NULL, 0, 2088958, 2, 256, NULL, 50, 118, NULL, NULL);
+INSERT INTO `item_db` VALUES (5034, 'Lightbulb_Hairband', 'Lightbulb Hairband', 5, NULL, NULL, 500, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 119, NULL, NULL);
+INSERT INTO `item_db` VALUES (5035, 'Poring_Hat', 'Poring Hat', 5, NULL, NULL, 700, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 38, 120, NULL, NULL);
+INSERT INTO `item_db` VALUES (5036, 'Cross_Hairband', 'Cross Hairband', 5, NULL, NULL, 250, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 10, 121, NULL, NULL);
+INSERT INTO `item_db` VALUES (5037, 'Fruit_Shell', 'Apple Hat', 5, NULL, NULL, 150, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 5, 122, NULL, NULL);
+INSERT INTO `item_db` VALUES (5038, 'Deviruchi_Hat', 'Deviruchi Hat', 5, NULL, NULL, 800, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 64, 123, NULL, 'bonus bStr,1; bonus bInt,1;');
+INSERT INTO `item_db` VALUES (5039, 'Rainbow_Eggshell', 'Rainbow Eggshell', 5, NULL, NULL, 400, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 19, 124, NULL, NULL);
+INSERT INTO `item_db` VALUES (5040, 'Blush', 'Blush', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 512, NULL, 0, 125, NULL, NULL);
+INSERT INTO `item_db` VALUES (5041, 'Heart_Hairpin', 'Heart Hairpin', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 126, NULL, NULL);
+INSERT INTO `item_db` VALUES (5042, 'Hair_Protector', 'Dumpling Decoration', 5, NULL, NULL, 150, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 14, 127, NULL, NULL);
+INSERT INTO `item_db` VALUES (5043, 'Opera_Ghost_Mask', 'Opera Ghost Mask', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 2088958, 2, 512, NULL, 20, 128, NULL, NULL);
+INSERT INTO `item_db` VALUES (5044, 'Wing_Of_Demon', 'Wing\'s of Demon', 5, NULL, NULL, 350, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 45, 129, NULL, NULL);
+INSERT INTO `item_db` VALUES (5045, 'Magician_Hat', 'Magic Hat', 5, NULL, NULL, 500, NULL, 3, NULL, 0, 99092, 2, 256, NULL, 50, 130, NULL, 'bonus bDex,1; bonus bAgi,1; bonus bMaxSP,50;');
+INSERT INTO `item_db` VALUES (5046, 'Bongun_Hat', 'Bongun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 769, NULL, 0, 139, NULL, NULL);
+INSERT INTO `item_db` VALUES (5047, 'Fashion_Sunglasses', 'Fashion Sunglasses', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 131, NULL, NULL);
+INSERT INTO `item_db` VALUES (5048, 'Cresent_Hairpin', 'Cresent Hairpin', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 10477567, 2, 256, NULL, 0, 132, NULL, NULL);
+INSERT INTO `item_db` VALUES (5049, 'Striped_Bandana', 'Striped Bandana', 5, NULL, NULL, 150, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 133, NULL, NULL);
+INSERT INTO `item_db` VALUES (5050, 'Mysterious_Fruit_Shell', 'Mysterious Fruit Shell', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 10477567, 2, 256, NULL, 30, 134, NULL, NULL);
+INSERT INTO `item_db` VALUES (5051, 'Bell_of_Pussycat', 'Bell of Pussycat', 5, NULL, NULL, 100, NULL, 5, NULL, 0, 10477567, 2, 1, NULL, 0, 135, NULL, NULL);
+INSERT INTO `item_db` VALUES (5052, 'Blue_Bandana', 'Blue Bandana', 5, NULL, NULL, 150, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 136, NULL, NULL);
+INSERT INTO `item_db` VALUES (5053, 'Sphinx_Hat', 'Sphinx Hat', 5, NULL, NULL, 3000, NULL, 5, NULL, 0, 16514, 2, 257, NULL, 65, 137, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (5054, 'Assassin_Mask', 'Assassin Mask', 5, NULL, NULL, 100, NULL, 0, NULL, 0, 4096, 2, 1, NULL, 70, 180, NULL, NULL);
+INSERT INTO `item_db` VALUES (5055, 'Novice_Eggshell', 'Novice Eggshell', 5, NULL, NULL, 10, NULL, 3, NULL, 0, 8388609, 2, 256, NULL, 0, 101, NULL, NULL);
+INSERT INTO `item_db` VALUES (5056, 'Seed_Of_Love', 'Seed Of Love', 5, NULL, NULL, 200, NULL, 0, NULL, 0, 2088958, 2, 256, NULL, 0, 140, NULL, NULL);
+INSERT INTO `item_db` VALUES (5057, 'Black_Cat_Ears', 'Black Cat Ears', 5, NULL, NULL, 200, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 45, 141, NULL, NULL);
+INSERT INTO `item_db` VALUES (5058, 'Resting_Cat', 'Resting Cat', 5, NULL, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 142, NULL, 'bonus2 bResEff,Eff_Curse,3000; bonus bMdef,15;');
+INSERT INTO `item_db` VALUES (5059, 'Bear_Hat', 'Bear Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 143, NULL, NULL);
+INSERT INTO `item_db` VALUES (5060, 'Pointy_Cap', 'Pointy Cap', 5, NULL, NULL, 300, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 0, 144, NULL, 'bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (5061, 'Flower_Hairpin', 'Flower Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 145, NULL, NULL);
+INSERT INTO `item_db` VALUES (5062, 'Straw_Hat', 'Straw Hat', 5, NULL, NULL, 200, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 146, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (5063, 'Bandaid', 'Bandaid', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 147, NULL, NULL);
+INSERT INTO `item_db` VALUES (5064, 'Transformation_Leaf', 'Transformation Leaf', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 148, NULL, NULL);
+INSERT INTO `item_db` VALUES (5065, 'Fresh_Blueish_Fish', 'Fresh Blueish Fish', 5, NULL, NULL, 500, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 50, 149, NULL, 'bonus2 bAddRace,5,10;');
+INSERT INTO `item_db` VALUES (5066, 'Horns_Of_Succubus', 'Horns of Succubus', 5, NULL, NULL, 800, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 70, 150, NULL, 'bonus bInt,1; bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (5067, 'Sombrero', 'Sombrero', 5, NULL, NULL, 350, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 0, 151, NULL, 'bonus bAgi,1;');
+INSERT INTO `item_db` VALUES (5068, 'Ears_of_Demon', 'Ears Of Demon', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 70, 152, NULL, 'bonus bStr,1;');
+INSERT INTO `item_db` VALUES (5069, 'Fox_Mask', 'Fox Mask', 5, NULL, NULL, 300, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 153, NULL, 'bonus bAgi,1; bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (5070, 'Bandage', 'Bandage', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 154, NULL, 'bonus bStr,2;');
+INSERT INTO `item_db` VALUES (5071, 'Indian_Headband', 'Indian Headband', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 155, NULL, 'bonus bDex,1;');
+INSERT INTO `item_db` VALUES (5072, 'Horns_Of_Incubus', 'Horns Of Incubus', 5, NULL, NULL, 800, NULL, 4, NULL, 0, 2088958, 2, 256, NULL, 70, 156, NULL, 'bonus bAgi,1; bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (5073, 'Teacher\'s_Pet', 'Teacher\'s Pet', 5, NULL, NULL, 700, NULL, 2, NULL, 0, 2088958, 2, 256, NULL, 0, 157, NULL, 'bonus bDex,2;');
+INSERT INTO `item_db` VALUES (5074, 'Ears_of_Angel', 'Ears of Angel', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 512, NULL, 70, 158, NULL, 'bonus bStr,1;');
+INSERT INTO `item_db` VALUES (5075, 'Cowboy_Hat', 'Cowboy Hat', 5, NULL, NULL, 500, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 0, 159, NULL, NULL);
+INSERT INTO `item_db` VALUES (5076, 'Furry_Hat', 'Furry Hat', 5, NULL, NULL, 350, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 160, NULL, 'bonus bLuk,1;');
+INSERT INTO `item_db` VALUES (5077, 'Tulip_Hairpin', 'Tulip Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 161, NULL, NULL);
+INSERT INTO `item_db` VALUES (5078, 'Sea_Otter_Hat', 'Sea Otter Hat', 5, NULL, NULL, 800, NULL, 3, NULL, 0, 10477567, 2, 256, NULL, 50, 162, NULL, 'bonus bVit,1;');
+INSERT INTO `item_db` VALUES (5079, 'X_Hairpin', 'X Hairpin', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 256, NULL, 0, 163, NULL, NULL);
+INSERT INTO `item_db` VALUES (5080, 'Crown_of_the_Ancient_Queen', 'Crown of The Ancient Queen', 5, NULL, NULL, 400, NULL, 4, NULL, 0, 10477567, 2, 256, NULL, 45, 164, NULL, NULL);
+INSERT INTO `item_db` VALUES (5081, 'Crown_of_Mistress', 'Crown of Mistress', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 2088958, 0, 256, NULL, 75, 165, NULL, 'bonus bInt,2; bonus bMaxSP,100;');
+INSERT INTO `item_db` VALUES (5082, 'Mushroom_Hairband', 'Mushroom Hairband', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 256, NULL, 0, 166, NULL, NULL);
+INSERT INTO `item_db` VALUES (5083, 'Back_Ribbon', 'Back Ribbon', 5, NULL, NULL, 200, NULL, 1, NULL, 0, 10477567, 0, 256, NULL, 45, 167, NULL, 'bonus bMdef,10;');
+INSERT INTO `item_db` VALUES (5084, 'Lazy_Raccoon_Hat', 'Lazy Racoon Hat', 5, NULL, NULL, 500, NULL, 1, NULL, 0, 2088958, 2, 256, NULL, 0, 168, NULL, 'bonus2 bResEff,Eff_Sleep,2000;');
+INSERT INTO `item_db` VALUES (5085, 'Small_Twin_Ribbons', 'Small Twin Ribbons', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 0, 512, NULL, 45, 169, NULL, NULL);
+INSERT INTO `item_db` VALUES (5086, 'Sad_Mask', 'Sad Mask', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 513, NULL, 0, 170, NULL, 'bonus2 bResEff,Eff_Blind,5000;');
+INSERT INTO `item_db` VALUES (5087, 'Expressionless_Mask', 'Expressionless Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 171, NULL, NULL);
+INSERT INTO `item_db` VALUES (5088, 'Surprised_Mask', 'Surprised Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 172, NULL, NULL);
+INSERT INTO `item_db` VALUES (5089, 'Annoyed_Mask', 'Annoyed Mask', 5, NULL, NULL, 100, NULL, 1, NULL, 0, 10477567, 2, 513, NULL, 0, 173, NULL, NULL);
+INSERT INTO `item_db` VALUES (5090, 'Mask_of_the_Goblin_Leader', 'Mask of The Goblin Leader', 5, NULL, NULL, 100, NULL, 2, NULL, 0, 10477567, 2, 513, NULL, 0, 174, NULL, NULL);
+INSERT INTO `item_db` VALUES (5091, 'Golden_Bell', 'Golden Bell', 5, NULL, NULL, 200, NULL, 2, NULL, 0, 2088958, 2, 768, NULL, 35, 175, NULL, NULL);
+INSERT INTO `item_db` VALUES (5092, 'Nun_Hat', 'Nun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 33024, 0, 768, NULL, 65, 176, NULL, NULL);
+INSERT INTO `item_db` VALUES (5093, 'Nun_Hat_', 'Nun Hat', 5, NULL, NULL, 300, NULL, 5, NULL, 0, 33024, 0, 768, NULL, 65, 177, NULL, 'bonus bMaxSP,100;');
+INSERT INTO `item_db` VALUES (5094, 'Orc_Hero_Helm', 'Orc Hero Helm', 5, NULL, NULL, 900, NULL, 5, NULL, 0, 2088958, 2, 768, NULL, 55, 178, NULL, 'bonus bStr,2; bonus bVit,1;');
+INSERT INTO `item_db` VALUES (7001, 'Mold_Powder', 'Mould Powder', 3, 680, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7002, 'Ogre_Tooth', 'Ogre Tooth', 3, 658, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7003, 'Anolian_Skin', 'Anolian Skin', 3, 928, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7004, 'Mud_Lump', 'Mud Lump', 3, 876, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7005, 'Skull', 'Skull', 3, 1044, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7006, 'Wing_of_Red_Bat', 'Wing of Red Bat', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7007, 'Claw_of_Rat', 'Claw of Rat', 3, 748, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7008, 'Stiff_Horn', 'Stiff Horn', 3, 636, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7009, 'Glitter_Shell', 'Glitter Shell', 3, 528, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7010, 'Tail_of_Steel_Scorpion', 'Tail of Steel Scorpion', 3, 548, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7011, 'Claw_of_Monkey', 'Claw of Monkey', 3, 466, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7012, 'Tough_Scalelike_Stem', 'Tough Scalelike Stem', 3, 412, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7013, 'Coral_Reef', 'Coral Reef', 3, 772, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7014, 'Old_Portrait', 'Old Portrait', 3, 1500, NULL, 100, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7015, 'Bookclip_in_Memory', 'Bookclip in Memory', 3, 3000, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7016, 'Spoon_Stub', 'Spoon Stub', 3, 2500, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7017, 'Executioner\'s_Mitten', 'Executioner\'s Mitten', 3, 4500, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7018, 'Young_Twig', 'Young Twig', 3, 50, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7019, 'Loki\'s_Whispers', 'Loki\'s Whispers', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7020, 'Mother\'s_Nightmare', 'Mother\'s Nightmare', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7021, 'Foolishness_of_the_Blind', 'Foolishness of the Blind', 3, 20, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7022, 'Old_Hilt', 'Old Hilt', 3, 150, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7023, 'Blade_Lost_in_Darkness', 'Blade Lost in Darkness', 3, 12000, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7024, 'Bloody_Edge', 'Bloody Edge', 3, 10000, NULL, 40, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7025, 'Lucifer\'s_Lament', 'Lucifer\'s Lament', 3, 30000, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7026, 'Key_of_Clock_Tower', 'Key of Clock Tower', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7027, 'Key_of_Underground', 'Key of Underground', 3, 2, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7028, 'Invite_for_Duel', 'Invite for Duel', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7029, 'Admission_for_Duel', 'Admission for Duel', 3, 0, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7030, 'Claw_of_Desert_Wolf', 'Claw of Desert Wolf', 3, 208, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7031, 'Old_Frying_Pan', 'Old Frying Pan', 3, 196, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7032, 'Piece_of_Egg_Shell', 'Piece of Egg Shell', 3, 168, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7033, 'Poison_Spore', 'Poison Spore', 3, 114, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7034, 'Red_Socks_with_Holes', 'Red Socks with Holes', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7035, 'Matchstick', 'Matchstick', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7036, 'Fang_of_Garm', 'Fang of Garm', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7037, 'Coupon', 'Coupon', 3, 2000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7038, 'Yarn', 'Yarn', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7039, 'Novice_Nametag', 'Novice Nametag', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7040, 'Megaphone', 'Megaphone', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7041, 'Fine_Grit', 'Fine Grit', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7042, 'Leather_Bag_of_Infinity', 'Leather Bag of Infinity', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7043, 'Fine_Sand', 'Fine Sand', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7044, 'Vigorgra', 'Vigorgra', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7045, 'Magic_Paint', 'Magic Paint', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7046, 'Cart_Parts', 'Cart Parts', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7047, 'Alice\'s_Apron', 'Alice\'s Apron', 3, 2424, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7048, 'Talon_of_Griffon', 'Talon of Griffon', 3, 100, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7049, 'Stone', 'Stone', 3, 0, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7050, 'Cotton_Mat', 'Cotton Mat', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7051, 'Silk_Mat', 'Silk Mat', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7052, 'Wasted_Magazine', 'Wasted Magazine', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7053, 'Cyfar', 'Cyfar', 3, 772, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7054, 'Brigan', 'Brigan', 3, 746, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7055, 'Animal_Poop', 'Animal Poop', 3, NULL, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7056, 'Payment_Statement_for_Kafra_', 'Payment Statement for Ka', 3, NULL, NULL, 50, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7057, 'Gjallar', 'Gjallar', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7058, 'Gleipnir', 'Gleipnir', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7059, 'Free_Ticket_for_Kafra_Storag', 'Free Ticket for Kafra St', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7060, 'Free_Ticket_for_Kafra_Transp', 'Free Ticket for Kafra Tr', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7061, 'Free_Ticket_for_the_Cart_Ser', 'Free Ticket for the Cart', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7062, 'Broken_Turtle_Shell', 'Broken Turtle Shell', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7063, 'Soft_Feather', 'Soft Feather', 3, 280, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7064, 'Wing_of_Dragonfly', 'Wing of Dragonfly', 3, 520, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7065, 'Sea-otter_Fur', 'Sea Otter Fur', 3, 820, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7066, 'Ice_Cubic', 'Ice Cubic', 3, 660, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7067, 'Stone_Fragment', 'Stone Fragment', 3, 640, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7068, 'Burnt_Tree', 'Burnt Tree', 3, 722, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7069, 'Destroyed_Armor', 'Destroyed Armor', 3, 1042, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7070, 'Broken_Shell', 'Broken Shell', 3, 900, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7071, 'Tattered_Clothes', 'Tattered Clothes', 3, 640, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7072, 'Old_Shuriken', 'Old Shuriken', 3, 1780, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7073, 'Freya\'s_Jewel', 'Freya\'s Jewel', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7074, 'Thor\'s_Gauntlet', 'Thor\'s Gauntlet', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7075, 'Iron_Maiden', 'Iron Maiden', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7076, 'Wheel_of_the_Unknown', 'Wheel of the Unknown', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7077, 'Silver_Ornament', 'Silver Ornament', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7078, 'Wrath_of_Valkyrie', 'Wrath of Valkyrie', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7079, 'Feather_of_Angel_Wing', 'Feather of Angel Wing', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7080, 'Cat_Tread', 'Footprints of Cat', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7081, 'Woman\'s_Moustache', 'Woman\'s Moustache', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7082, 'Root_of_Stone', 'Root of Stone', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7083, 'Spirit_of_Fish', 'Spirit of Fish', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7084, 'Sputum_of_Bird', 'Sputum of Bird', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7085, 'Sinew_of_Bear', 'Sinew of Bear', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7086, 'Emblem_of_the_Sun_God', 'Emblem of the Sun God', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7087, 'Breath_of_Spirit', 'Breath of Soul', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7088, 'Snow_Crystal', 'Snow Crystal', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7089, 'Omen_of_Tempest', 'Omen of Tempest', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7090, 'Ripple', 'Ripple', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7091, 'Billow', 'Billow', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7092, 'Drifting_Air', 'Drifting Air', 3, NULL, NULL, 500, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7093, 'Cogwheel', 'Metal Wheel', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7094, 'Fragment', 'Cabinet Chip', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7095, 'Metal_Fragment', 'Tooth Fragment', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7096, 'Lava', 'Hardened Lava', 3, 1108, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7097, 'Burning_Heart', 'Burning Heart', 3, 924, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7098, 'Live_Coal', 'Fire Seed', 3, 638, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7099, 'Worn-out_Magic_Scroll', 'Old Magical Circle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7100, 'Sharp_Leaf', 'Sharpened Leaf', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7101, 'PecoPeco_Feather', 'Peco\'s Feather', 3, 454, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7102, 'Nightmare', 'Nightmare', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7103, 'Unknown_Liquid_Bottle', 'Yellow Liquid Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7104, 'Fake_Angel\'s_Wing', 'Fake Angel\'s Wing', 3, 756, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7105, 'Fake_Heaven_Ring', 'Imitation Soul\'s Band', 3, 924, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7106, 'Antelope_Horn', 'Antelope Horn', 3, 672, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7107, 'Antelope_Skin', 'Antelope Skin', 3, 756, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7108, 'Piece_of_Shield', 'Broken Shield', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7109, 'Shining_Spear_Blade', 'Shiny Spear Tip', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7110, 'Broken_Sword', 'Sharp Sword', 3, 588, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7111, 'Slick_Paper', 'String Paper', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7112, 'Sharp_Paper', 'Transparent Paper', 3, 906, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7113, 'Broken_Symbol_of_Pharaoh', 'Broken Symbol of Pharaoh', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7114, 'Masque_of_Tutankhamen', 'Sphinx Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7115, 'Harpy_Feather', 'Blood Feather', 3, 1142, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7116, 'Harpy_Talon', 'Tooth of Lowblood', 3, 1210, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7117, 'Torn_Magic_Book', 'Torn Spell Book', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7118, 'Torn_Scroll', 'Torn Scroll', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7119, 'Bacillus', 'Hypha Body', 3, 1024, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7120, 'Burning_Horseshoe', 'Burning Horseshoe', 3, 822, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7121, 'Honey_Pot', 'Honey Jar', 3, 622, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7122, 'Burning_Hair', 'Hot Feather', 3, 974, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7123, 'Dragon_Skin', 'Dragon\'s Skin', 3, 1024, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7124, 'Sand_Clump', 'Sand Lump', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7125, 'Scorpion_Claw', 'Crab Shot', 3, 706, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7126, 'Large_Jellopy', 'Large Jellopy', 3, 840, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7127, 'Alcohol_Creation_Book', 'Alcohol Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7128, 'Bottle_Grenade_Creation_Book', 'Fire Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7129, 'Acid_Bottle_Creation_Book', 'Acid Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7130, 'Plant_Bottle_Creation_Book', 'Plant Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7131, 'Mine_Bottle_Creation_Book', 'Mine Bottle Creation Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7132, 'Glistening_Coat_Creation_Boo', 'Glistening Coat Creation Boo', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7133, 'Condensed_Potion_Creation_Bo', 'Condensed Potion Creation Bo', 3, 240000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7134, 'Medicine_Bowl', 'Medicine Bowl', 3, 8, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7135, 'Bottle_Grenade', 'Fire Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7136, 'Acid_Bottle', 'Hydrobolic Acid Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7137, 'Plant_Bottle', 'Water Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7138, 'Marine_Sphere_Bottle', 'Mine Bottle', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7139, 'Glistening_Coat', 'Coating Wax', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7140, 'Seed_of_Life', 'Seed of Life', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7141, 'Morning_Dew_of_Yggdrasil', 'Water Flow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7142, 'Ancient_Life', 'Ancient Life', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7143, 'Glass_Tube', 'Seperation Tubes', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7144, 'Potion_Creation_Gude', 'Potion Making Book', 3, 100000, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7145, 'Ragnarok_T-shirt', 'Ragnarok T-Shirt', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7146, 'Vacation_Ticket', 'Vacation Ticket', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7147, 'Jasmine', 'Jasmine', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7148, 'Mother\'s_Letter', 'Mother\'s Letter', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7149, 'Yellow_Plate', 'Yellow Plate', 3, 220, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7150, 'A_piece_of_Bamboo', 'Bamboo Trunk', 3, 310, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7151, 'Oil_Paper', 'Oiled Paper', 3, 310, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7152, 'Glossy_Hair', 'Glossy Hair', 3, 340, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7153, 'Worn-out_Kimono', 'Old Kimono', 3, 590, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7154, 'Poisonous_Powder', 'Poison Powder', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7155, 'Skin_of_Poisonous_Toad', 'Poisonous Toad\'s Skin', 3, 280, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7156, 'Broken_Shuriken', 'Broken Shuriken', 3, 470, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7157, 'Black_Mask', 'Black Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7158, 'Broken_Liquor_Bottle', 'Broken Liquor Bottle', 3, 160, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7159, 'Demon\'s_Nose', 'Demon\'s Nose', 3, 400, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7160, 'Passport_From_King', 'Passport From King', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7161, 'Skin_of_the_Black_Bear', 'Skin of the Black Bear', 3, 384, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7162, 'Piece_of_Cloud', 'Piece of Cloud', 3, 390, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7163, 'Hard_Antennae', 'Hard Antennae', 3, 570, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7164, 'Very_Hard_Peach', 'Very Hard Peach', 3, 400, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7165, 'Etherial_Winged_Clothing', 'Etherial Winged Clothing', 3, 650, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7166, 'Soft_Silk_Fabric', 'Soft Silk Fabric', 3, 1200, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7167, 'Strange_Piece_of_Iron', 'Strange Piece of Iron', 3, 430, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7168, 'Big_Wing_of_Butterfly', 'Big Wing of Butterfly', 3, 614, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7169, 'Tae_Guk_Tablet', 'Tae Guk Tablet', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7170, 'Tuxedo', 'Tuxedo', 5, 2, NULL, 10, NULL, 0, NULL, 0, 2088958, 1, 16, NULL, 0, 0, NULL, 'changebase 22;');
+INSERT INTO `item_db` VALUES (7171, 'Skin of Panther', 'Skin of Panther', 3, 282, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7172, 'Claw of Panther', 'Claw of Panther', 3, 290, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7173, 'Bun Buster Bag', 'Bun Buster Bag', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7174, 'Wrapping Thread', 'Wrapping Thread', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7175, 'Wrapper', 'Wrapper', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7176, 'King\'s Proof Document', 'King\'s Proof Document', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7177, 'Piece_of_Starlight\'s_Sorrow', 'Piece of Starlight\'s Sorrow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7178, 'Starlight\'s_Sorrow', 'Starlight\'s Sorrow', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7179, 'Donation_Ticket', 'Donation Ticket', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7180, 'Letter_of_Introduction', 'Letter of Introduction', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7181, 'Commodity_Receipt', 'Commodity Receipt', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7182, 'Cacao', 'Cacao', 3, 200, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7183, 'Letter_of_Younger_Sister', 'Letter of Younger Sister', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7184, 'Piano_Key', 'Piano Key', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7185, 'Quiz_Participation_Volume', 'Quiz Participation Volume', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7186, 'Slender_Stem', 'Slender Stem', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7187, 'Cultish_Mask', 'Cultish Mask', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7188, 'Brown_Root', 'Brown_Root', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7189, 'Wooden_Heart', 'Wooden Heart', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7190, 'Hard_Back_Shell', 'Hard Back Shell', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7191, 'Paper_Lantern', 'Paper Lantern', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7192, 'Pin_Wheel', 'Pin Wheel', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7193, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7194, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7195, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7196, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7197, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7198, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7199, 'Hieroglyphic', 'Hieroglyphic', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7200, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7201, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7202, 'Unknown_Item', '????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7203, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7204, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7205, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7206, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7207, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7208, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7209, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7210, 'Unknown_Item', '??????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7211, 'Unknown_Item', '???????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7212, 'Unknown_Item', '?????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7213, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7214, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7215, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7216, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7217, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7218, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7219, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7220, 'Unknown_Item', '?????????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7221, 'Unknown_Item', '?????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7222, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7223, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7224, 'Unknown_Item', '????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7225, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7226, 'Unknown_Item', '??', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7227, 'Unknown_Item', 'TCG???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7228, 'Unknown_Item', '??', 3, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7229, 'Unknown_Item', '??', 3, NULL, NULL, 300, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7230, 'Unknown_Item', '????', 3, NULL, NULL, 30, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7231, 'Unknown_Item', '???', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7232, 'Unknown_Item', '???', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7233, 'Unknown_Item', '??????', 3, NULL, NULL, 150, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7234, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7235, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7236, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7237, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7238, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7239, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7240, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7241, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7242, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7243, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7244, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7245, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7246, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7247, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7248, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7249, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7250, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7251, 'Coupon', 'Coupon', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7252, 'Unknown_Item', '???', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7253, 'Unknown_Item', '??????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7254, 'Unknown_Item', '???????', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7262, 'Grave_Lump', 'Grave Lump', 3, 233, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7263, 'Cat's_Eye', 'Cat's-Eye', 3, NULL, 477, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7264, 'Dried_Sand', 'Dried Sand', 3, NULL, 161, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7265, 'Dragon_Horn', 'Dragon Horn', 3, NULL, 272, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7266, 'Dragon_Teeth', 'Dragon Teeth', 3, 218, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7267, 'Tigerskin_Underwear', 'Tigerskin Underwear', 3, NULL, 149, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7268, 'Ghost_Doll', 'Ghost Doll', 3, NULL, 605, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7269, 'Baby_Bib', 'Baby Bib', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7270, 'Baby_Bottle', 'Baby Bottle', 3, NULL, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7271, 'Novice_Statue', 'Novice Statue', 3, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (7272, 'Dumpling_Doll', 'Dumpling Doll', 3, NULL, 10, 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9001, 'Poring_Egg', 'Poring Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9002, 'Drops_Egg', 'Drops Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9003, 'Poporing_Egg', 'Poporing Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9004, 'Lunatic_Egg', 'Lunatic Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9005, 'Picky_Egg', 'Picky Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9006, 'Chonchon_Egg', 'Chonchon Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9007, 'Steel_Chonchon_Egg', 'Steel Chonchon Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9008, 'Hunter_Fly_Egg', 'Hunter Fly Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9009, 'Savage_Babe_Egg', 'Savage Babe Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9010, 'Baby_Desert_Wolf_Egg', 'Baby Desert Wolf Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9011, 'Rocker_Egg', 'Rocker Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9012, 'Spore_Egg', 'Spore Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9013, 'Poison_Spore_Egg', 'Poison Spore Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9014, 'PecoPeco_Egg', 'PecoPeco Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9015, 'Smokie_Egg', 'Smokie Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9016, 'Yoyo_Egg', 'Yoyo Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9017, 'Orc_Warrior_Egg', 'Orc Warrior Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9018, 'Munak_Egg', 'Munak Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9019, 'Dokkaebi_Egg', 'Dokkaebi Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9020, 'Sohee_Egg', 'Sohee Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9021, 'Isis_Egg', 'Isis Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9022, 'Green_Petite_Egg', 'Green Petite Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9023, 'Deviruchi_Egg', 'Deviruchi Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9024, 'Bapho_Jr._Egg', 'Bapho Jr. Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9025, 'Bongun_Egg', 'Bongun Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9026, 'Alice_Egg', 'Alice Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9027, 'Zherlthsh_Egg', 'Zherlthsh Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9028, 'test_Egg', 'Test Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (9029, 'test_Egg', 'Test Egg', 7, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10001, 'Skull_Helm', 'Skull Helm', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10002, 'Monster_Oxygen_Mask', 'Monster Oxygen Mask', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10003, 'Transparent_Head_Protector', 'Transparent Headgear', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10004, 'Pacifier', 'Pacifier', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10005, 'Wig', 'Wig', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10006, 'Queen\'s_Hair_Ornament', 'Queen\'s Hair Ornament', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10007, 'Silk_Ribbon', 'Silk Ribbon', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10008, 'Punisher', 'Punisher', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10009, 'Wild_Flower', 'Wild Flower', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10010, 'Battered_Pot', 'Battered Pot', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10011, 'Stellar_Hairpin', 'Stellar Hairpin', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10012, 'Tiny_Egg_Shell', 'Tiny Egg Shell', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10013, 'Backpack', 'Backpack', 8, 1500, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10014, 'Rocker_Glasses', 'Rocker Glasses', 8, 2000, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10015, 'Green_Lace', 'Green Lace', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10016, 'Golden_Bell', 'Golden Bell', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10017, 'Bark_Shorts', 'Bark Shorts', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10018, 'Monkey_Circlet', 'Monkey Circlet', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10019, 'Red_Muffler', 'Red Muffler', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `item_db` VALUES (10020, 'Sword_of_Chinese_Exorcist', 'Sword of Chinese Exorcist', 8, 20, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+CREATE TABLE `mob_db` (
+ `ID` mediumint(9) NOT NULL default '0',
+ `Name` text NOT NULL,
+ `Name2` text NOT NULL,
+ `LV` smallint(6) NOT NULL default '0',
+ `HP` mediumint(9) NOT NULL default '0',
+ `SP` mediumint(9) NOT NULL default '0',
+ `EXP` mediumint(9) NOT NULL default '0',
+ `JEXP` mediumint(9) NOT NULL default '0',
+ `Range1` tinyint(4) NOT NULL default '0',
+ `ATK1` smallint(6) NOT NULL default '0',
+ `ATK2` smallint(6) NOT NULL default '0',
+ `DEF` smallint(6) NOT NULL default '0',
+ `MDEF` smallint(6) NOT NULL default '0',
+ `STR` tinyint(4) NOT NULL default '0',
+ `AGI` tinyint(4) NOT NULL default '0',
+ `VIT` tinyint(4) NOT NULL default '0',
+ `INT` tinyint(4) NOT NULL default '0',
+ `DEX` tinyint(4) NOT NULL default '0',
+ `LUK` tinyint(4) NOT NULL default '0',
+ `Range2` tinyint(4) NOT NULL default '0',
+ `Range3` tinyint(4) NOT NULL default '0',
+ `Scale` tinyint(4) NOT NULL default '0',
+ `Race` tinyint(4) NOT NULL default '0',
+ `Element` tinyint(4) NOT NULL default '0',
+ `Mode` smallint(6) NOT NULL default '0',
+ `Speed` smallint(6) NOT NULL default '0',
+ `ADelay` smallint(6) NOT NULL default '0',
+ `aMotion` smallint(6) NOT NULL default '0',
+ `dMotion` smallint(6) NOT NULL default '0',
+ `Drop1id` mediumint(9) NOT NULL default '0',
+ `Drop1per` mediumint(9) NOT NULL default '0',
+ `Drop2id` mediumint(9) NOT NULL default '0',
+ `Drop2per` mediumint(9) NOT NULL default '0',
+ `Drop3id` mediumint(9) NOT NULL default '0',
+ `Drop3per` mediumint(9) NOT NULL default '0',
+ `Drop4id` mediumint(9) NOT NULL default '0',
+ `Drop4per` mediumint(9) NOT NULL default '0',
+ `Drop5id` mediumint(9) NOT NULL default '0',
+ `Drop5per` mediumint(9) NOT NULL default '0',
+ `Drop6id` mediumint(9) NOT NULL default '0',
+ `Drop6per` mediumint(9) NOT NULL default '0',
+ `Drop7id` mediumint(9) NOT NULL default '0',
+ `Drop7per` mediumint(9) NOT NULL default '0',
+ `Drop8id` mediumint(9) NOT NULL default '0',
+ `Drop8per` mediumint(9) NOT NULL default '0',
+ `MEXP` mediumint(9) NOT NULL default '0',
+ `ExpPer` mediumint(9) NOT NULL default '0',
+ `MVP1id` mediumint(9) NOT NULL default '0',
+ `MVP1per` mediumint(9) NOT NULL default '0',
+ `MVP2id` mediumint(9) NOT NULL default '0',
+ `MVP2per` mediumint(9) NOT NULL default '0',
+ `MVP3id` mediumint(9) NOT NULL default '0',
+ `MVP3per` mediumint(9) NOT NULL default '0'
+) TYPE=MyISAM;
+
+INSERT INTO `mob_db` VALUES (1001, '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, 990, 70, 904, 5500, 757, 57, 943, 210, 7041, 100, 508, 200, 625, 20, 4068, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1002, '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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1003, 'TESTEGG', 'Test Egg', 2, 10, 0, 10000, 10000, 0, 3, 9, 99, 0, 1, 99, 1, 1, 1, 1, 10, 12, 0, 4, 22, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1004, 'HORNET', 'Hornet', 8, 169, 0, 19, 15, 1, 22, 27, 5, 5, 6, 20, 8, 10, 17, 5, 10, 12, 0, 4, 24, 145, 150, 1292, 792, 216, 992, 50, 939, 5500, 909, 3500, 1208, 15, 511, 350, 518, 100, 512, 0, 4019, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1005, 'FARMILIAR', 'Familiar', 8, 155, 0, 28, 15, 1, 20, 28, 0, 0, 1, 12, 8, 5, 28, 0, 10, 12, 0, 2, 27, 133, 150, 1276, 576, 384, 913, 5500, 1105, 20, 2209, 15, 601, 50, 514, 100, 507, 700, 645, 50, 4020, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1006, 'THIEF_BUG_LARVA', 'Thief Bug Larva', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1007, 'FABRE', 'Fabre', 2, 63, 0, 3, 2, 1, 7, 10, 0, 0, 1, 2, 4, 0, 7, 5, 10, 12, 0, 4, 22, 129, 400, 1672, 672, 480, 914, 6500, 949, 500, 1502, 80, 721, 5, 511, 700, 705, 1000, 1501, 200, 4002, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1008, 'PUPA', 'Pupa', 2, 427, 0, 2, 4, 0, 1, 2, 0, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 4, 22, 128, 1000, 1001, 1, 1, 1010, 80, 915, 5500, 938, 600, 2102, 2, 935, 1000, 938, 600, 1002, 200, 4003, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1009, 'CONDOR', 'Condor', 5, 92, 0, 6, 5, 1, 11, 14, 0, 0, 1, 13, 5, 0, 13, 10, 10, 12, 1, 2, 24, 145, 150, 1148, 648, 480, 917, 6500, 1702, 150, 715, 80, 1750, 5500, 517, 400, 916, 2000, 512, 0, 4015, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1010, '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, 902, 6500, 1019, 100, 907, 600, 516, 700, 1068, 3500, 512, 0, 1066, 2000, 4010, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1011, '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, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1012, '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, 918, 5500, 908, 500, 511, 300, 721, 7, 713, 2000, 512, 0, 512, 0, 4014, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1013, 'WOLF', 'Wolf', 12, 405, 0, 45, 32, 1, 37, 46, 0, 0, 1, 12, 24, 15, 30, 20, 10, 12, 1, 2, 22, 145, 200, 1054, 54, 432, 1011, 20, 920, 5500, 2308, 10, 517, 650, 528, 1050, 919, 5500, 512, 0, 4029, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1014, 'SPORE', 'Spore', 9, 327, 0, 22, 17, 1, 24, 29, 0, 5, 1, 9, 9, 0, 14, 5, 10, 12, 1, 3, 21, 129, 200, 1872, 672, 288, 921, 5000, 507, 800, 510, 50, 743, 5, 2220, 40, 921, 5, 512, 0, 4022, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1015, 'ZOMBIE', 'Zombie', 15, 534, 0, 50, 33, 1, 67, 79, 0, 10, 1, 8, 7, 0, 15, 0, 10, 12, 1, 1, 29, 133, 400, 2612, 912, 288, 957, 5500, 724, 5, 938, 1000, 958, 50, 727, 55, 512, 0, 512, 0, 4038, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1016, 'ARCHER_SKELETON', 'Skeleton Archer', 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, 932, 4500, 756, 70, 2285, 4, 1708, 35, 1752, 1000, 501, 800, 1701, 150, 4094, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1017, '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, 955, 3500, 910, 250, 1108, 15, 928, 200, 507, 400, 716, 50, 1002, 400, 4026, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1018, '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, 924, 5500, 2322, 10, 518, 150, 602, 100, 2207, 2, 712, 500, 512, 0, 4040, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1019, 'PECOPECO', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 5500, 2402, 20, 508, 50, 507, 900, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1020, '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, 993, 50, 905, 5500, 1405, 30, 511, 350, 711, 300, 706, 1, 512, 0, 4030, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1021, '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, 1011, 40, 928, 5500, 955, 1500, 1152, 10, 508, 90, 729, 5, 1116, 50, 4050, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1022, 'WEREWOLF', 'Werewolf', 80, 28600, 0, 11813, 7289, 1, 2560, 3280, 65, 35, 1, 97, 60, 1, 135, 52, 10, 10, 2, 0, 40, 181, 200, 1500, 768, 652, 999, 500, 1034, 4000, 984, 500, 985, 500, 7017, 800, 714, 380, 1912, 300, 4091, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1023, 'ORK_WARRIOR', 'Orc Warrior', 24, 1400, 0, 261, 160, 1, 104, 126, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 133, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1024, 'WORM_TAIL', 'Worm Tail', 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, 993, 60, 1011, 25, 906, 5500, 1408, 30, 508, 70, 721, 5, 10015, 10, 4034, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1025, 'SNAKE', 'Snake', 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, 926, 5500, 1117, 15, 507, 900, 1011, 35, 937, 800, 954, 1, 512, 0, 4037, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1026, 'MUNAK', 'Munak', 30, 2872, 0, 361, 218, 1, 180, 230, 0, 0, 1, 15, 20, 5, 46, 15, 10, 12, 1, 1, 29, 133, 200, 2468, 768, 288, 901, 5500, 2264, 1, 2404, 15, 609, 20, 2337, 1, 2305, 100, 1558, 5, 4090, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1027, 'RAPTICE', 'Raptice', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1028, 'SOLDIER_SKELETON', 'Skeleton Soldier', 29, 2334, 0, 372, 226, 1, 221, 245, 10, 15, 1, 15, 22, 5, 40, 15, 10, 12, 1, 1, 29, 133, 200, 2276, 576, 432, 932, 5500, 756, 60, 1214, 12, 501, 700, 934, 10, 1201, 150, 1216, 50, 4086, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1029, 'ISIS', 'Isis', 43, 4828, 0, 2396, 993, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 936, 5500, 2233, 5, 2603, 1, 733, 150, 732, 20, 954, 1000, 731, 5, 4116, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1030, '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, 1011, 50, 937, 5500, 1455, 10, 926, 1500, 936, 200, 508, 150, 756, 38, 4062, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1031, '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, 938, 5500, 910, 1500, 511, 500, 514, 200, 729, 5, 512, 0, 512, 0, 4033, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1032, '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, 929, 5500, 912, 700, 930, 1100, 509, 550, 512, 0, 2612, 200, 639, 20, 4107, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1033, '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, 133, 200, 1372, 672, 432, 990, 50, 907, 5500, 1019, 3500, 757, 37, 2329, 30, 516, 1000, 512, 0, 4052, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1034, '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, 1011, 45, 908, 5500, 911, 600, 509, 30, 725, 5, 918, 2000, 512, 0, 4058, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1035, '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, 133, 150, 676, 576, 480, 996, 30, 999, 100, 943, 5500, 912, 1300, 756, 129, 2259, 1, 1226, 2, 4115, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1036, 'GHOUL', 'Ghoul', 39, 5118, 0, 882, 541, 1, 420, 500, 5, 20, 1, 20, 29, 0, 33, 20, 10, 12, 1, 1, 49, 133, 250, 2456, 912, 504, 958, 5500, 756, 110, 509, 670, 506, 800, 2609, 60, 934, 150, 1260, 1, 4110, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1037, 'SIDEWINDER', 'Sidewinder', 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, 954, 5500, 912, 1400, 756, 134, 1120, 2, 937, 2500, 926, 5000, 509, 1000, 4117, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1038, 'OSIRIS', 'Osiris', 78, 415400, 0, 71500, 28600, 1, 780, 2880, 10, 25, 1, 75, 62, 37, 86, 40, 10, 10, 1, 1, 89, 181, 100, 1072, 672, 384, 617, 2000, 1232, 150, 2235, 200, 1255, 600, 1009, 1000, 985, 3500, 984, 3900, 4144, 1, 7710, 0, 603, 4000, 608, 1000, 751, 200);
+INSERT INTO `mob_db` VALUES (1039, 'BAPHOMET', 'Baphomet', 81, 668000, 0, 107250, 37895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 1068, 768, 576, 1466, 200, 2256, 200, 2607, 800, 714, 500, 617, 3000, 984, 4300, 985, 5600, 4147, 1, 13000, 0, 608, 1000, 750, 400, 923, 3800);
+INSERT INTO `mob_db` VALUES (1040, '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, 999, 150, 953, 5500, 912, 220, 757, 61, 1003, 120, 715, 200, 998, 350, 4072, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1041, 'MUMMY', 'Mummy', 37, 5176, 0, 488, 314, 1, 305, 360, 0, 10, 28, 19, 32, 0, 63, 20, 10, 12, 1, 1, 49, 133, 300, 1772, 72, 384, 930, 5500, 756, 100, 934, 550, 2604, 1, 2611, 10, 525, 250, 502, 450, 4106, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1042, '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, 992, 70, 999, 30, 910, 2400, 935, 3500, 943, 30, 998, 200, 1002, 500, 4042, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1043, 'SEAHORES', 'Seahorse', 18, 1372, 0, 122, 78, 3, 100, 150, 15, 7, 20, 1, 1, 1, 1, 1, 10, 10, 0, 5, 22, 129, 200, 1500, 800, 600, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1044, '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, 995, 13, 950, 5500, 5014, 1, 2326, 10, 720, 10, 951, 500, 748, 25, 4093, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1045, 'MARC', 'Marc', 36, 6900, 0, 988, 625, 1, 220, 280, 5, 10, 1, 36, 36, 20, 56, 30, 10, 12, 1, 5, 41, 133, 150, 1272, 72, 480, 995, 18, 956, 5500, 756, 95, 951, 1000, 720, 10, 717, 200, 509, 600, 4105, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1046, 'DOPPELGANGER', 'Doppelganger', 72, 249000, 0, 51480, 10725, 1, 1340, 1590, 60, 35, 88, 90, 90, 35, 125, 65, 10, 10, 1, 6, 67, 181, 100, 480, 480, 288, 2258, 350, 2317, 250, 1162, 220, 1168, 150, 1411, 550, 985, 3800, 984, 2400, 4142, 1, 5340, 0, 724, 1500, 505, 5100, 724, 4000);
+INSERT INTO `mob_db` VALUES (1047, 'PECOPECO_EGG', 'PecoPeco Egg', 3, 420, 0, 4, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 0, 60, 128, 1000, 1001, 1, 1, 1010, 250, 935, 1500, 2102, 2, 501, 400, 501, 400, 713, 1800, 736, 10, 4007, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1048, '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, 128, 1000, 701, 1, 1, 1010, 300, 915, 5000, 2102, 2, 938, 600, 716, 100, 737, 10, 1002, 350, 4012, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1049, '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, 916, 6500, 949, 700, 2302, 150, 507, 550, 519, 300, 715, 50, 512, 0, 4008, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1050, 'PICKY_', 'Super 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, 916, 6500, 949, 700, 5015, 10, 507, 600, 519, 300, 715, 50, 10012, 10, 4011, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1051, '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, 955, 2500, 2304, 80, 507, 350, 909, 2000, 2303, 120, 1002, 350, 512, 0, 4016, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1052, '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, 940, 5000, 909, 5500, 2298, 4, 1402, 80, 520, 10, 752, 5, 703, 3, 4021, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1053, 'THIEF_BUG_', '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, 955, 3500, 910, 250, 1108, 15, 928, 200, 507, 400, 716, 50, 1002, 400, 4026, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1054, 'THIEF_BUG__', '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, 1011, 40, 928, 5500, 955, 1500, 1152, 10, 508, 90, 729, 5, 1116, 50, 4050, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1055, 'MUKA', 'Muka', 15, 570, 0, 72, 48, 1, 40, 49, 5, 5, 15, 15, 30, 5, 20, 10, 10, 12, 2, 3, 22, 129, 300, 1960, 960, 384, 993, 70, 952, 5500, 713, 2000, 511, 400, 507, 1000, 1451, 50, 1002, 350, 4036, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1056, '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, 945, 5500, 919, 5500, 516, 800, 2213, 2, 754, 2, 912, 6, 729, 3, 4044, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1057, '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, 942, 5500, 513, 1500, 508, 100, 919, 5000, 753, 5, 756, 24, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1058, '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, 990, 60, 940, 6500, 911, 400, 757, 49, 707, 20, 935, 3000, 512, 0, 4057, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1059, 'MISTRESS', 'Mistress', 74, 212000, 0, 39325, 27170, 1, 880, 1110, 40, 60, 50, 165, 60, 95, 70, 130, 10, 12, 0, 4, 84, 181, 100, 1148, 648, 300, 1413, 150, 518, 10000, 2249, 250, 616, 1000, 7018, 10, 985, 4400, 984, 3300, 4132, 1, 2569, 5000, 996, 1500, 526, 4000, 722, 3000);
+INSERT INTO `mob_db` VALUES (1060, '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, 948, 5500, 2289, 5, 919, 5000, 740, 80, 516, 1500, 518, 400, 756, 43, 4074, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1061, '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, 944, 5500, 510, 500, 2608, 2, 603, 30, 505, 100, 1261, 1, 984, 60, 4127, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1062, '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, 529, 2000, 530, 1000, 507, 1000, 512, 1000, 2236, 100, 741, 10, 512, 0, 4005, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1063, '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, 705, 6500, 949, 1000, 2262, 4, 1102, 100, 512, 600, 515, 1100, 622, 20, 4006, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1064, '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, 959, 5500, 932, 1500, 510, 80, 717, 120, 719, 10, 603, 2, 624, 20, 4067, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1065, 'STROUF', 'Strouf', 40, 9952, 0, 1238, 752, 1, 200, 350, 5, 50, 1, 40, 45, 72, 43, 65, 10, 12, 2, 5, 61, 133, 150, 1872, 672, 384, 951, 5500, 756, 115, 2241, 2, 1461, 2, 949, 3000, 720, 20, 956, 1500, 4111, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1066, '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, 991, 35, 960, 5500, 910, 3000, 2313, 5, 943, 100, 757, 34, 717, 50, 4049, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1067, '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, 991, 45, 961, 5500, 911, 800, 757, 53, 2106, 5, 943, 1000, 717, 100, 4061, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1068, '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, 1011, 25, 962, 5500, 938, 1500, 971, 20, 525, 5, 517, 700, 512, 0, 4035, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1069, 'SWORD_FISH', 'Swordfish', 30, 4299, 0, 529, 319, 1, 168, 199, 5, 20, 1, 30, 30, 41, 62, 30, 10, 12, 2, 5, 41, 133, 200, 1968, 768, 384, 995, 10, 963, 5500, 756, 33, 2257, 2, 757, 45, 1117, 25, 956, 600, 4089, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1070, '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, 991, 30, 955, 5500, 910, 400, 528, 500, 507, 650, 928, 450, 623, 20, 4027, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1071, 'PIRATE_SKEL', 'Pirate Skeleton', 25, 1676, 0, 233, 142, 1, 145, 178, 10, 15, 25, 13, 25, 5, 25, 10, 10, 12, 1, 1, 29, 133, 200, 1754, 554, 288, 932, 3000, 2287, 15, 1125, 25, 2211, 250, 1104, 250, 756, 43, 628, 20, 4073, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1072, 'KAHO', 'Kaho', 24, 1141, 0, 287, 176, 1, 128, 156, 0, 50, 1, 24, 24, 25, 44, 5, 10, 12, 1, 6, 83, 133, 200, 1700, 1000, 500, 994, 30, 1003, 100, 953, 3000, 911, 1000, 757, 10, 716, 100, 970, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1073, '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, 964, 5500, 960, 1500, 7049, 700, 1001, 13, 512, 0, 512, 0, 757, 37, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1074, '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, 965, 5500, 966, 1000, 7049, 500, 1056, 1000, 1001, 10, 512, 0, 757, 18, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1075, 'TURTLE', 'Turtle', 3, 77, 0, 0, 0, 1, 1, 2, 35, 0, 0, 0, 0, 0, 0, 0, 7, 12, 0, 5, 22, 129, 200, 500, 500, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1076, 'SKELETON', 'Skeleton', 10, 234, 0, 18, 14, 1, 39, 47, 10, 5, 1, 5, 10, 0, 12, 0, 10, 12, 1, 1, 29, 145, 200, 2228, 528, 576, 1010, 90, 932, 800, 1505, 80, 909, 3000, 507, 850, 2609, 30, 512, 0, 4025, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1077, '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, 133, 200, 1672, 672, 288, 7033, 5500, 2221, 20, 511, 550, 510, 50, 972, 30, 921, 1200, 912, 6, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1078, '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, 507, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 914, 500, 708, 50, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1079, '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, 510, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 522, 50, 514, 1000, 2270, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1080, '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, 511, 7000, 712, 1000, 621, 20, 905, 3000, 906, 1500, 704, 50, 521, 50, 2270, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1081, '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, 508, 5500, 712, 1000, 711, 1000, 905, 500, 906, 300, 707, 5, 914, 500, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1082, '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, 509, 5500, 712, 1000, 631, 20, 905, 3000, 906, 1500, 521, 50, 703, 50, 2269, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1083, '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, 510, 5500, 508, 1000, 509, 1000, 710, 5, 608, 20, 518, 500, 607, 50, 714, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1084, '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, 970, 50, 971, 50, 630, 20, 949, 2000, 991, 800, 921, 5500, 921, 5500, 7033, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1085, '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, 970, 50, 972, 50, 630, 20, 949, 2000, 990, 1000, 921, 5500, 921, 5500, 7033, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1086, 'GOLDEN_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, 969, 1000, 1524, 150, 2246, 250, 10016, 500, 714, 300, 984, 2000, 985, 2000, 4128, 1, 25, 5000, 2610, 2000, 701, 1000, 512, 0);
+INSERT INTO `mob_db` VALUES (1087, '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, 181, 150, 1678, 780, 648, 968, 10000, 10018, 500, 1366, 150, 2106, 250, 1124, 10, 984, 3700, 985, 4700, 4143, 1, 4500, 5000, 725, 2000, 607, 1200, 999, 3400);
+INSERT INTO `mob_db` VALUES (1088, 'VOCAL', 'Vocal', 18, 3016, 0, 110, 88, 1, 71, 82, 10, 30, 77, 28, 26, 30, 53, 40, 10, 10, 1, 4, 22, 181, 200, 1080, 648, 480, 2247, 50, 940, 8000, 721, 1000, 752, 1500, 912, 700, 645, 3000, 532, 60, 4021, 60, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1089, 'TOAD', 'Toad', 10, 5065, 0, 100, 50, 1, 26, 32, 0, 0, 1, 5, 10, 10, 10, 25, 10, 10, 1, 5, 21, 181, 200, 1236, 336, 432, 2244, 50, 518, 2000, 729, 1000, 746, 1500, 970, 100, 971, 100, 512, 0, 4014, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1090, 'MASTERING', 'Mastering', 2, 2415, 0, 30, 10, 1, 18, 24, 0, 10, 1, 2, 2, 0, 17, 60, 10, 10, 1, 3, 21, 181, 300, 1072, 672, 480, 2257, 200, 619, 50, 722, 1000, 741, 1500, 512, 8000, 512, 8000, 531, 4000, 4001, 100, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1091, 'DRAGONFLY', 'Dragonfly', 8, 2400, 0, 88, 44, 1, 22, 27, 40, 0, 1, 20, 8, 15, 17, 5, 10, 10, 0, 4, 24, 181, 100, 1076, 576, 480, 2245, 200, 501, 8000, 719, 1500, 742, 2000, 2607, 200, 625, 50, 533, 3000, 4009, 40, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1092, 'VAGABOND_WOLF', 'Vagabond Wolf', 24, 12240, 0, 247, 176, 1, 135, 159, 10, 0, 57, 45, 48, 20, 50, 65, 10, 10, 1, 2, 22, 181, 150, 1048, 648, 432, 2248, 200, 920, 8000, 728, 1500, 919, 5500, 725, 11, 517, 8000, 626, 50, 4029, 40, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1093, 'ECLIPSE', 'Eclipse', 6, 1800, 0, 60, 55, 1, 20, 26, 0, 40, 1, 36, 6, 0, 11, 80, 10, 10, 0, 2, 60, 181, 200, 1456, 456, 336, 2250, 200, 515, 8000, 727, 1200, 746, 1500, 706, 30, 622, 50, 534, 5000, 4006, 70, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1094, '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, 991, 35, 946, 5500, 910, 1200, 935, 3000, 943, 2, 757, 14, 1002, 250, 4032, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1095, '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, 955, 5500, 910, 1000, 938, 500, 993, 40, 1001, 4, 1002, 450, 757, 28, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1096, 'ANGELING', 'Angeling', 20, 55000, 0, 163, 144, 1, 120, 195, 0, 70, 1, 50, 20, 75, 68, 200, 10, 10, 1, 8, 86, 181, 200, 1272, 672, 672, 2254, 100, 2324, 60, 610, 500, 2282, 1, 504, 1000, 512, 250, 714, 40, 4054, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1097, '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, 128, 1000, 1001, 1, 1, 1010, 320, 935, 2500, 909, 2000, 938, 650, 713, 2000, 1002, 300, 512, 0, 4013, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1098, 'ANUBIS', 'Anubis', 55, 12359, 0, 2906, 2700, 1, 688, 812, 0, 45, 1, 69, 55, 75, 95, 95, 10, 12, 1, 8, 26, 181, 200, 2000, 1000, 500, 2602, 5, 504, 600, 2601, 5, 1007, 15, 512, 0, 512, 0, 512, 0, 4138, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1099, 'ARGIOPE', 'Argiope', 41, 4382, 0, 1797, 849, 1, 395, 480, 30, 0, 1, 41, 31, 10, 56, 30, 10, 12, 2, 4, 25, 149, 300, 1792, 792, 336, 1042, 5500, 912, 1200, 757, 175, 2406, 5, 511, 1500, 719, 10, 512, 0, 4114, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1100, '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, 1025, 5500, 911, 1200, 1042, 500, 757, 61, 511, 670, 508, 250, 10017, 15, 4075, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1101, 'BAPHOMET_', 'Baphomet Jr.', 50, 8578, 0, 2706, 1480, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1102, 'BATHORY', 'Bathory', 44, 5415, 0, 2503, 1034, 1, 198, 398, 0, 60, 1, 76, 24, 85, 65, 15, 10, 12, 1, 7, 27, 149, 100, 1504, 840, 900, 1001, 200, 1061, 5500, 2252, 3, 1611, 5, 1000, 30, 1006, 15, 637, 20, 4119, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1103, '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, 1027, 5500, 2310, 5, 919, 5500, 1455, 10, 1405, 15, 1408, 20, 512, 0, 4063, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1104, '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, 1026, 5500, 2502, 20, 914, 3000, 919, 2500, 516, 500, 2402, 25, 512, 0, 4041, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1105, '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, 955, 6000, 910, 3000, 938, 1200, 990, 45, 1001, 8, 1002, 550, 757, 34, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1106, '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, 1253, 5, 7030, 5500, 2311, 1, 517, 1200, 920, 2000, 756, 53, 1217, 140, 4082, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1107, 'DESERT_WOLF_B', 'Desert Wolf Puppy', 9, 164, 0, 20, 16, 1, 30, 36, 0, 0, 1, 9, 9, 5, 21, 40, 10, 12, 0, 2, 23, 145, 300, 1600, 900, 240, 1010, 85, 919, 5500, 2306, 60, 517, 600, 2301, 200, 512, 0, 512, 0, 4023, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1108, '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, 995, 25, 1053, 5500, 1054, 1000, 5011, 2, 971, 100, 1256, 3, 756, 161, 4125, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1109, 'DEVIRUCHI', 'Deviruchi', 46, 7360, 0, 2662, 1278, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 1038, 5500, 1039, 400, 2255, 2, 1458, 2, 1009, 5, 912, 1500, 756, 154, 4122, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1110, '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, 1021, 5500, 757, 112, 1517, 2, 1613, 1, 969, 1, 1501, 300, 1005, 5, 4098, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1111, '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, 1011, 60, 913, 3000, 725, 20, 507, 1000, 7006, 5500, 7006, 1500, 756, 40, 4069, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1112, 'DRAKE', 'Drake', 70, 326666, 0, 28600, 22880, 1, 1800, 2100, 20, 35, 85, 80, 49, 75, 79, 50, 10, 12, 1, 1, 29, 181, 400, 620, 420, 360, 1127, 600, 1125, 950, 1135, 150, 1128, 400, 5019, 300, 985, 3200, 984, 2300, 4137, 1, 4300, 5000, 504, 5000, 719, 250, 512, 0);
+INSERT INTO `mob_db` VALUES (1113, '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, 909, 7500, 1602, 80, 938, 500, 512, 1100, 713, 1700, 741, 5, 620, 20, 4004, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1114, '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, 1057, 5500, 1058, 500, 2291, 4, 928, 2000, 1001, 10, 507, 1200, 512, 0, 4056, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1115, 'EDDGA', 'Eddga', 65, 152000, 0, 25025, 12870, 1, 1215, 1565, 15, 15, 78, 70, 85, 66, 90, 85, 10, 12, 2, 2, 23, 181, 300, 872, 1344, 432, 1133, 150, 2268, 250, 518, 10000, 1258, 500, 1030, 250, 985, 2300, 984, 1700, 4123, 1, 6179, 5000, 1029, 5000, 1030, 500, 994, 1350);
+INSERT INTO `mob_db` VALUES (1116, '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, 911, 1000, 5015, 20, 7032, 550, 507, 1000, 643, 300, 645, 250, 757, 57, 4070, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1117, '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, 149, 300, 2276, 576, 336, 2217, 10, 1615, 1, 2508, 2, 1551, 10, 610, 200, 609, 10, 509, 2000, 4141, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1118, '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, 1032, 5500, 2253, 3, 704, 10, 521, 50, 629, 20, 905, 2000, 748, 1, 4080, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1119, 'FRILLDORA', 'Frilldora', 30, 2023, 0, 529, 319, 1, 200, 239, 0, 10, 35, 30, 38, 15, 53, 30, 10, 12, 1, 2, 23, 145, 300, 1540, 720, 432, 1012, 5500, 757, 90, 903, 1500, 721, 15, 715, 200, 501, 800, 912, 120, 4088, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1120, 'GHOSTRING', 'Ghostring', 18, 73300, 0, 101, 108, 1, 82, 122, 0, 60, 40, 27, 18, 45, 72, 30, 10, 12, 1, 6, 88, 181, 300, 1220, 1080, 648, 1059, 5500, 2274, 100, 2336, 50, 604, 500, 603, 10, 714, 30, 2335, 150, 4047, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1121, '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, 997, 30, 1003, 150, 1040, 5500, 2286, 1, 2227, 10, 1001, 100, 512, 0, 4087, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1122, 'GOBLIN_1', 'Goblin', 25, 1176, 0, 310, 188, 1, 118, 140, 10, 5, 1, 53, 25, 20, 38, 10, 10, 12, 1, 7, 24, 149, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 501, 800, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1123, 'GOBLIN_2', '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, 998, 250, 911, 1000, 5010, 3, 1511, 10, 2104, 1, 501, 550, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1124, 'GOBLIN_3', '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, 998, 230, 911, 1000, 2275, 3, 512, 0, 2104, 1, 501, 550, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1125, 'GOBLIN_4', '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, 993, 100, 998, 170, 911, 800, 2263, 3, 1508, 10, 2104, 1, 501, 500, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1126, 'GOBLIN_5', '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, 998, 150, 911, 800, 1605, 15, 2104, 1, 508, 100, 501, 500, 508, 120, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1127, '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, 993, 120, 1055, 5500, 757, 70, 938, 3000, 1001, 30, 7021, 1, 632, 20, 4081, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1128, '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, 993, 80, 1011, 35, 947, 5500, 1452, 15, 935, 5500, 943, 70, 512, 0, 4045, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1129, '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, 953, 6500, 912, 500, 2279, 5, 1752, 10000, 757, 118, 633, 20, 970, 50, 4103, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1130, 'JAKK', 'Jakk', 38, 3581, 0, 1113, 688, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 1062, 5500, 912, 900, 985, 31, 2331, 5, 1008, 5, 535, 1000, 512, 0, 4109, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1131, 'JOKER', 'Joker', 57, 12450, 0, 3706, 2362, 1, 621, 738, 10, 35, 1, 143, 47, 75, 98, 175, 10, 12, 2, 7, 84, 149, 100, 1364, 864, 432, 912, 2000, 616, 2, 641, 20, 502, 1000, 1259, 1, 984, 100, 512, 0, 4139, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1132, 'KHALITZBURG', 'Khalitzburg', 63, 19276, 0, 4378, 2750, 1, 875, 1025, 45, 10, 58, 65, 48, 5, 73, 40, 10, 12, 2, 1, 29, 149, 350, 528, 1000, 396, 932, 8000, 985, 191, 5017, 1, 2108, 2, 1004, 10, 504, 1000, 1127, 2, 4136, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1133, 'KOBOLD_1', '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, 999, 100, 1034, 5500, 912, 700, 985, 25, 1220, 2, 2104, 5, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1134, 'KOBOLD_2', '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, 999, 100, 1034, 5500, 912, 200, 2104, 3, 502, 100, 2101, 100, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1135, 'KOBOLD_3', '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, 990, 35, 999, 100, 1034, 5500, 912, 200, 512, 0, 2104, 3, 502, 100, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1136, 'KOBOLD_4', '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, 999, 50, 1034, 5500, 912, 100, 1355, 5, 2104, 3, 502, 100, 1301, 150, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1137, 'KOBOLD_5', '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, 999, 40, 1034, 5500, 912, 100, 1514, 5, 2104, 3, 502, 100, 1501, 150, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1138, '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, 7031, 5500, 910, 800, 911, 100, 912, 10, 737, 20, 508, 250, 512, 0, 4076, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1139, '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, 993, 110, 1031, 5500, 911, 1400, 757, 70, 943, 250, 721, 10, 501, 650, 4079, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1140, '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, 994, 35, 1045, 4500, 1608, 10, 2617, 1, 1614, 3, 1006, 8, 642, 20, 4112, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1141, '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, 1052, 5000, 938, 1500, 991, 45, 995, 2, 717, 200, 631, 20, 512, 0, 4055, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1142, 'MARINE_SPHERE', 'Marine Sphere', 28, 3518, 0, 461, 284, 1, 120, 320, 0, 40, 1, 28, 28, 0, 33, 50, 10, 12, 0, 3, 21, 0, 800, 1201, 1, 1, 1050, 5500, 1051, 500, 1520, 10, 720, 10, 717, 150, 10003, 10, 512, 0, 4084, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1143, '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, 1060, 5500, 2294, 5, 2605, 1, 1008, 10, 1520, 15, 2407, 1, 656, 200, 4113, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1144, 'MARSE', 'Mars', 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, 1024, 5500, 962, 3000, 717, 200, 720, 10, 995, 12, 1007, 5, 656, 200, 4095, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1145, '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, 1017, 6500, 1018, 500, 1251, 10, 2225, 5, 5009, 1, 10010, 10, 2224, 15, 4046, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1146, '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, 2618, 10, 528, 5000, 919, 5500, 537, 400, 757, 100, 656, 200, 512, 0, 4097, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1147, 'MAYA', 'Maya', 81, 169000, 0, 42900, 17875, 1, 1800, 2070, 60, 25, 95, 97, 76, 95, 82, 105, 10, 12, 2, 4, 82, 181, 100, 864, 1000, 480, 10006, 500, 2615, 200, 2234, 200, 639, 500, 7020, 10, 985, 3500, 984, 2500, 4146, 1, 10500, 5000, 730, 2000, 603, 3000, 617, 2000);
+INSERT INTO `mob_db` VALUES (1148, 'MEDUSA', 'Medusa', 79, 22408, 0, 6876, 4697, 1, 827, 1100, 48, 38, 1, 74, 50, 57, 77, 69, 10, 12, 1, 6, 40, 149, 180, 2000, 1000, 500, 1048, 6000, 522, 2500, 702, 200, 2610, 150, 722, 250, 7062, 3500, 1007, 3, 4124, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1149, '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, 941, 5500, 756, 196, 1361, 2, 1005, 10, 516, 1500, 1301, 200, 657, 150, 4126, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1150, 'MOONLIGHT', 'Moonlight', 67, 120000, 0, 27500, 14300, 1, 1200, 1700, 10, 55, 55, 99, 55, 82, 95, 120, 10, 10, 1, 6, 63, 181, 150, 1276, 576, 288, 5008, 1000, 1234, 100, 1525, 150, 10008, 500, 985, 2600, 984, 1900, 638, 500, 4131, 1, 1250, 0, 1022, 5000, 504, 750, 728, 210);
+INSERT INTO `mob_db` VALUES (1151, 'MYST', 'Myst', 38, 3745, 0, 1391, 688, 1, 365, 445, 0, 40, 1, 38, 18, 0, 53, 10, 10, 12, 2, 0, 25, 149, 200, 1576, 576, 384, 5005, 2, 1019, 800, 10005, 10, 756, 65, 757, 97, 605, 20, 512, 0, 4108, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1152, '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, 133, 200, 2420, 720, 648, 922, 5500, 932, 3500, 757, 80, 2299, 2, 1358, 10, 506, 50, 512, 0, 4085, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1153, '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, 133, 400, 2852, 1152, 840, 1043, 5500, 938, 3000, 714, 1, 512, 0, 512, 0, 512, 0, 512, 0, 4071, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1154, '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, 7110, 4500, 7121, 2500, 757, 20, 1105, 500, 1217, 150, 512, 0, 512, 0, 4099, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1155, 'PETIT', 'Petit', 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, 1035, 5500, 1037, 300, 756, 140, 509, 1000, 1510, 150, 912, 1500, 606, 15, 4118, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1156, 'PETIT_', 'Sky Petit', 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, 1036, 5500, 1037, 300, 985, 61, 509, 1000, 602, 500, 912, 1500, 606, 15, 4120, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1157, 'PHARAOH', 'Pharaoh', 93, 445997, 0, 114990, 41899, 1, 2267, 3015, 67, 70, 1, 93, 100, 104, 89, 112, 10, 12, 2, 7, 67, 181, 125, 2000, 1000, 500, 7113, 6000, 7114, 2500, 1136, 100, 2327, 150, 5002, 500, 1552, 300, 984, 4500, 4148, 1, 1, 5000, 1009, 5500, 526, 2250, 732, 1125);
+INSERT INTO `mob_db` VALUES (1158, '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, 1023, 5500, 963, 2000, 720, 5, 517, 1000, 951, 500, 756, 25, 512, 0, 4077, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1159, 'PHREEONI', 'Phreeoni', 69, 188000, 0, 32175, 16445, 1, 880, 1530, 10, 20, 1, 85, 78, 35, 130, 60, 10, 10, 2, 2, 60, 181, 200, 1020, 1020, 288, 1015, 10000, 1223, 500, 1236, 150, 1014, 5000, 2288, 300, 985, 2900, 984, 2100, 4121, 1, 2700, 0, 1008, 500, 730, 2000, 1000, 3400);
+INSERT INTO `mob_db` VALUES (1160, '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, 955, 5700, 910, 1100, 938, 600, 992, 15, 1001, 5, 1002, 500, 757, 31, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1161, '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, 1052, 5500, 910, 300, 938, 700, 970, 2, 713, 1000, 630, 20, 645, 50, 4024, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1162, 'RAFFLESIA', 'Rafflesia', 27, 1950, 0, 388, 242, 1, 105, 120, 20, 10, 1, 27, 54, 1, 76, 27, 10, 10, 0, 3, 22, 133, 200, 1000, 2652, 1056, 1033, 5500, 911, 1600, 706, 2, 708, 10, 703, 10, 711, 550, 509, 30, 4083, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1163, '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, 985, 106, 2266, 1, 2315, 2, 1158, 2, 1116, 100, 1004, 10, 7054, 5500, 4133, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1164, 'REQUIEM', 'Requiem', 35, 3089, 0, 800, 458, 1, 220, 272, 0, 15, 1, 53, 35, 5, 57, 2, 10, 12, 1, 7, 27, 133, 400, 1516, 816, 432, 603, 35, 714, 1, 912, 2500, 958, 3500, 934, 1500, 2308, 10, 512, 0, 4104, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1165, 'SAND_MAN', 'Sandman', 34, 3413, 0, 810, 492, 1, 180, 205, 10, 25, 24, 34, 58, 38, 60, 5, 10, 12, 1, 0, 62, 133, 250, 1672, 720, 288, 997, 35, 1056, 5500, 757, 118, 7043, 200, 1001, 200, 1257, 2, 728, 2, 4101, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1166, '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, 1028, 5500, 656, 150, 702, 2, 2276, 1, 605, 10, 757, 70, 526, 2, 4078, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1167, '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, 919, 5500, 1302, 100, 517, 500, 1750, 1000, 949, 850, 1010, 80, 627, 20, 4017, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1168, '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, 994, 45, 1046, 5500, 1005, 15, 904, 5000, 943, 3000, 504, 700, 512, 0, 4130, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1169, 'SKEL_WORKER', 'Skeleton Worker', 30, 2872, 0, 397, 240, 1, 242, 288, 0, 15, 1, 15, 30, 5, 42, 10, 10, 12, 1, 1, 29, 133, 400, 2420, 720, 384, 998, 400, 1041, 5500, 757, 90, 5009, 2, 999, 100, 1003, 200, 1002, 800, 4092, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1170, '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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1171, '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, 1014, 2700, 911, 800, 757, 10, 1111, 15, 1001, 30, 943, 150, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1172, '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, 1014, 5500, 911, 2000, 757, 15, 1111, 20, 943, 270, 1001, 50, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1173, '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, 1014, 3100, 911, 800, 911, 10, 1114, 15, 1001, 35, 943, 200, 512, 0, 4059, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1174, '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, 992, 60, 1011, 30, 1013, 5500, 910, 2100, 757, 25, 943, 10, 1002, 400, 4039, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1175, '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, 1016, 5500, 919, 3000, 949, 800, 528, 1000, 701, 1, 512, 0, 512, 0, 4028, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1176, '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, 993, 90, 955, 5000, 911, 200, 518, 350, 518, 350, 526, 200, 756, 26, 4053, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1177, '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, 1044, 5500, 756, 70, 938, 2500, 1006, 5, 503, 50, 640, 20, 512, 0, 4096, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1178, 'ZEROM', 'Zerom', 23, 1109, 0, 240, 149, 1, 127, 155, 0, 10, 1, 23, 23, 5, 42, 0, 10, 12, 1, 7, 23, 133, 200, 1780, 1080, 432, 1011, 55, 998, 190, 2339, 200, 2265, 3, 2408, 10, 1002, 400, 1002, 400, 4064, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1179, '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, 1001, 150, 1059, 5500, 2282, 1, 2333, 10, 512, 0, 512, 0, 512, 0, 4102, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1180, '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, 149, 150, 840, 540, 480, 1022, 5500, 919, 7000, 603, 100, 604, 100, 526, 250, 525, 350, 756, 100, 746, 200, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1181, 'ZOMBIE_DRAGON', 'Zombie Dragon', 1, 1000, 0, 49500, 1650, 9, 7900, 9140, 0, 0, 120, 145, 145, 145, 130, 120, 10, 12, 2, 9, 89, 181, 400, 2700, 1000, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1182, '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, 1069, 1500, 1070, 3000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1183, 'CHONCHON_', 'Angry ChonChon', 4, 67, 0, 5, 4, 1, 10, 13, 10, 0, 1, 10, 4, 5, 12, 2, 10, 12, 0, 4, 24, 149, 200, 1076, 576, 480, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1184, 'FABRE_', 'Angry Fabre', 1, 30, 0, 1, 0, 1, 4, 7, 0, 0, 1, 2, 1, 1, 4, 5, 10, 12, 0, 4, 22, 133, 400, 1672, 672, 480, 914, 2000, 949, 250, 1502, 80, 721, 2, 511, 350, 705, 500, 1501, 200, 4002, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1185, '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, 1001, 10, 1059, 100, 2282, 0, 2333, 1, 512, 0, 512, 0, 512, 0, 4102, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1186, 'WHISPER_BOSS', 'Giant Whisper', 34, 5040, 0, 537, 545, 1, 198, 239, 0, 45, 1, 51, 14, 0, 60, 0, 10, 12, 0, 6, 48, 149, 250, 2536, 1536, 672, 1001, 150, 1059, 5500, 2282, 1, 2333, 10, 512, 0, 512, 0, 512, 0, 4102, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1187, '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, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1188, 'BON_GUN', 'Bon Gun', 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, 1094, 5500, 7014, 40, 618, 60, 2337, 2, 609, 15, 508, 1000, 502, 250, 5046, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1189, '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, 1063, 5500, 1753, 1000, 1756, 2500, 1755, 2500, 1716, 2, 501, 1400, 509, 900, 2330, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1190, '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, 181, 100, 1248, 500, 360, 1363, 200, 2601, 500, 5007, 150, 2627, 1000, 512, 0, 985, 4400, 984, 3100, 512, 0, 12800, 5000, 968, 5500, 617, 900, 512, 0);
+INSERT INTO `mob_db` VALUES (1191, '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, 617, 5, 603, 45, 1065, 1200, 611, 3000, 714, 3, 2626, 1, 757, 270, 2205, 120, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1192, 'WRAITH', 'Wraith', 53, 10999, 0, 2199, 1099, 1, 580, 760, 5, 30, 1, 95, 30, 75, 95, 35, 10, 12, 2, 1, 89, 149, 300, 1816, 576, 240, 1059, 6500, 2206, 10, 2506, 2, 716, 650, 602, 1300, 2505, 10, 731, 5, 735, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1193, 'ALARM', 'Alarm', 58, 10647, 0, 3987, 2300, 1, 480, 600, 15, 15, 1, 62, 72, 10, 85, 45, 10, 12, 1, 0, 60, 149, 300, 1020, 500, 768, 1095, 5500, 2607, 20, 7005, 1500, 611, 1300, 984, 105, 7026, 20, 912, 1500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1194, 'ARCLOUSE', 'Arclouse', 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, 1096, 3500, 938, 3000, 943, 800, 912, 450, 716, 300, 997, 20, 912, 2500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1195, 'RIDEWORD', 'Rideword', 59, 11638, 0, 2007, 3106, 1, 584, 804, 5, 35, 48, 75, 10, 20, 120, 45, 10, 12, 0, 0, 60, 149, 150, 864, 500, 192, 1097, 5500, 1553, 4, 1554, 4, 1555, 3, 1556, 2, 7015, 300, 1006, 20, 722, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1196, 'SKEL_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, 1098, 3500, 7016, 100, 2320, 1, 716, 600, 930, 3500, 2408, 35, 934, 1500, 2282, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1197, '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, 1099, 3500, 7016, 105, 2266, 1, 716, 600, 930, 3500, 2408, 3, 985, 112, 1093, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1198, '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, 149, 200, 1500, 500, 1000, 1557, 2, 2608, 30, 505, 100, 716, 450, 1009, 50, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1199, '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, 7001, 5500, 715, 800, 1001, 300, 1061, 1000, 1057, 3000, 601, 1100, 10004, 10, 2502, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1200, 'ZHERLTHSH', 'Zherlthsh', 63, 18300, 0, 3608, 2304, 1, 700, 850, 10, 15, 70, 85, 40, 30, 125, 60, 10, 12, 1, 7, 60, 141, 200, 800, 792, 384, 7017, 5, 504, 800, 503, 1200, 2331, 8, 2622, 1, 984, 134, 2291, 3, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1201, 'RYBIO', 'Rybio', 71, 9572, 0, 6317, 3520, 1, 686, 912, 45, 37, 1, 97, 75, 74, 77, 90, 10, 12, 2, 6, 40, 149, 200, 1500, 500, 1000, 1015, 4000, 7017, 3, 504, 800, 731, 30, 1008, 10, 984, 100, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1202, 'PHENDARK', 'Phendark', 73, 22729, 0, 6826, 3443, 1, 794, 1056, 52, 36, 1, 62, 120, 65, 77, 66, 10, 12, 2, 7, 40, 149, 175, 1500, 500, 1000, 1015, 4000, 7017, 4, 504, 800, 512, 0, 984, 150, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1203, 'MYSTELTAINN', 'Mysteltainn', 76, 33350, 0, 6457, 5159, 2, 1160, 1440, 30, 30, 77, 139, 80, 35, 159, 65, 10, 12, 2, 0, 87, 181, 250, 1152, 500, 240, 7019, 1, 1117, 100, 1152, 70, 1155, 40, 1163, 2, 999, 120, 984, 243, 985, 210, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1204, 'TIRFING', 'Tyrfing', 71, 29900, 0, 5412, 4235, 1, 950, 1146, 30, 35, 58, 87, 55, 35, 132, 65, 10, 12, 1, 0, 67, 181, 100, 816, 500, 240, 7022, 1, 638, 50, 1211, 100, 1214, 70, 1217, 40, 999, 120, 984, 189, 1157, 25, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1205, 'EXECUTIONER', 'Executioner', 65, 28980, 0, 4730, 3536, 2, 570, 950, 35, 35, 64, 85, 40, 25, 88, 60, 10, 12, 2, 0, 47, 181, 200, 768, 500, 384, 7024, 5, 1108, 100, 1111, 80, 1114, 60, 1125, 40, 999, 120, 984, 145, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1206, 'ANOLIAN', 'Anolian', 63, 18960, 0, 4378, 2907, 1, 640, 760, 15, 15, 1, 43, 58, 25, 97, 65, 10, 12, 1, 5, 41, 149, 200, 900, 500, 864, 7003, 5500, 1754, 2000, 504, 650, 10019, 10, 943, 5500, 2625, 1, 984, 134, 526, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1207, 'STING', 'Sting', 61, 9500, 0, 4081, 2970, 1, 850, 1032, 5, 30, 57, 45, 55, 5, 120, 85, 10, 12, 1, 0, 62, 149, 300, 528, 500, 240, 7004, 5500, 1756, 1500, 2624, 2, 1003, 130, 997, 25, 10007, 10, 2209, 350, 719, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1208, 'WANDER_MAN', 'Wanderer', 74, 8170, 0, 5786, 4730, 2, 450, 550, 5, 5, 1, 192, 38, 45, 127, 85, 10, 12, 1, 6, 24, 149, 100, 672, 500, 192, 7005, 5500, 616, 1, 1164, 1, 2270, 5, 610, 650, 984, 217, 608, 3, 732, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1209, '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, 7007, 5500, 528, 1000, 726, 80, 746, 110, 657, 150, 510, 70, 984, 95, 4028, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1210, '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, 7008, 5500, 947, 8000, 943, 4000, 993, 200, 1451, 40, 757, 18, 509, 1600, 4045, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1211, '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, 7009, 5500, 992, 200, 912, 1200, 602, 1000, 757, 220, 610, 250, 509, 1600, 4039, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1212, '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, 7010, 5500, 757, 229, 757, 22, 1002, 850, 999, 180, 998, 300, 512, 0, 4068, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1213, '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, 149, 150, 1500, 500, 1000, 7002, 2500, 1304, 10, 999, 90, 931, 7500, 912, 1300, 756, 196, 502, 900, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1214, '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, 7011, 5500, 942, 7000, 985, 53, 513, 5000, 634, 20, 532, 1000, 607, 25, 4051, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1215, '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, 7012, 5500, 509, 1800, 912, 1200, 756, 115, 997, 5, 1454, 20, 608, 45, 4034, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1216, 'PENOMENA', 'Penomena', 57, 7256, 0, 2870, 2200, 7, 415, 565, 5, 50, 1, 5, 35, 15, 136, 30, 10, 12, 1, 5, 25, 149, 400, 832, 500, 600, 7013, 5500, 962, 8000, 938, 7000, 525, 200, 719, 15, 1258, 1, 716, 550, 4035, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1219, 'KNIGHT_OF_ABYSS', 'Abyss Knight', 79, 36140, 0, 8469, 6268, 1, 1600, 2150, 55, 50, 66, 68, 64, 25, 135, 50, 10, 12, 2, 7, 87, 149, 300, 1500, 500, 1000, 1064, 5500, 7023, 5, 2318, 1, 1410, 25, 1162, 1, 985, 369, 984, 259, 1162, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1220, 'M_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, 181, 200, 1120, 420, 288, 1253, 5, 7030, 5500, 2311, 1, 517, 1200, 920, 2000, 756, 53, 1217, 140, 4082, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1221, 'M_SAVAGE', 'Savage', 26, 2092, 0, 357, 226, 1, 146, 177, 10, 5, 1, 26, 54, 10, 37, 10, 10, 12, 2, 2, 42, 181, 150, 1960, 960, 384, 1028, 6000, 656, 150, 702, 3, 2276, 2, 605, 15, 757, 70, 512, 0, 4078, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1222, 'L_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, 181, 200, 1500, 500, 1000, 7002, 2500, 1304, 10, 999, 120, 931, 8000, 912, 1600, 756, 196, 502, 1100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1223, 'L_ORC', 'Orc', 24, 1400, 0, 261, 160, 1, 114, 136, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 181, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1224, 'L_POISON_SPORE', 'Poison Spore', 19, 665, 0, 169, 85, 1, 89, 101, 0, 0, 1, 19, 25, 0, 24, 0, 10, 12, 1, 3, 25, 181, 200, 1672, 672, 288, 921, 8000, 2221, 20, 511, 650, 510, 55, 972, 35, 512, 0, 512, 0, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1225, 'L_CHOCO', 'Choco', 43, 4278, 0, 1150, 1150, 1, 315, 402, 5, 5, 1, 68, 55, 45, 65, 25, 10, 12, 0, 2, 23, 181, 200, 1500, 500, 1000, 7011, 5500, 942, 7000, 508, 1900, 513, 5000, 2311, 2, 532, 1000, 607, 25, 4051, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1226, 'L_KOBOLD', 'Kobold', 36, 3893, 0, 898, 568, 1, 265, 318, 15, 10, 1, 90, 36, 30, 52, 30, 10, 12, 1, 7, 44, 181, 200, 1028, 528, 360, 999, 90, 1034, 6000, 912, 750, 985, 25, 1220, 2, 2104, 5, 512, 0, 4091, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1227, 'L_GOBLIN', 'Goblin', 25, 1176, 0, 282, 171, 1, 118, 140, 10, 5, 1, 63, 25, 20, 38, 45, 10, 12, 1, 7, 24, 181, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 501, 800, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1228, 'L_PHEN', 'Phen', 26, 3347, 0, 357, 226, 1, 138, 150, 0, 15, 1, 26, 26, 0, 88, 75, 10, 12, 1, 5, 41, 181, 150, 2544, 1344, 1152, 1023, 6000, 963, 2300, 720, 8, 517, 1100, 951, 550, 756, 25, 512, 0, 4077, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1229, 'META_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, 914, 6500, 949, 600, 1502, 80, 721, 8, 511, 750, 705, 1500, 1501, 200, 4002, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1230, 'META_PUPA', 'Pupa', 2, 427, 0, 2, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 4, 22, 128, 1000, 1001, 1, 1, 1010, 300, 915, 6000, 938, 700, 2102, 2, 935, 1300, 938, 700, 1002, 400, 4003, 7, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1231, 'META_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, 924, 6000, 2322, 10, 518, 180, 602, 200, 2207, 4, 712, 800, 512, 0, 4040, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1232, 'META_PECOPECO_EGG', 'PecoPeco Egg', 3, 420, 0, 4, 4, 0, 1, 2, 20, 20, 1, 1, 1, 0, 1, 20, 10, 12, 0, 0, 60, 128, 1000, 1001, 1, 1, 1010, 120, 935, 1500, 2102, 2, 501, 450, 501, 450, 713, 2000, 736, 15, 4007, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1233, 'CONCEIVE_PECOPECO', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 6000, 2402, 20, 508, 55, 507, 950, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1234, 'PROVOKE_YOYO', 'Yoyo', 19, 879, 0, 135, 85, 1, 71, 82, 0, 0, 1, 24, 30, 35, 32, 55, 10, 12, 0, 2, 22, 139, 200, 1054, 54, 384, 942, 6000, 513, 2000, 508, 130, 919, 5500, 753, 7, 512, 0, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1235, '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, 141, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1236, 'META_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, 128, 1000, 1001, 1, 1, 1010, 135, 935, 2740, 909, 3000, 938, 750, 713, 2000, 1002, 320, 512, 0, 4013, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1237, 'META_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, 576, 955, 6000, 910, 3000, 938, 1000, 935, 3000, 1001, 6, 1002, 450, 757, 28, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1238, 'META_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, 955, 5700, 910, 1100, 938, 600, 992, 15, 1001, 5, 1002, 500, 757, 31, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1239, 'META_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, 955, 6000, 910, 3000, 938, 1200, 990, 45, 1001, 8, 1002, 550, 757, 34, 4043, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1240, 'META_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, 916, 6500, 949, 850, 2302, 150, 507, 650, 519, 350, 715, 60, 512, 0, 4008, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1241, 'META_PICKY_', 'Super 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, 916, 6500, 949, 850, 5015, 7, 507, 750, 519, 350, 715, 60, 512, 0, 4011, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1242, '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, 910, 3200, 938, 1500, 512, 50, 720, 40, 510, 75, 529, 350, 5035, 1, 4001, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1243, 'SASQUATCH', 'Sasquatch', 30, 3163, 0, 529, 319, 1, 250, 280, 5, 0, 75, 25, 60, 10, 34, 20, 10, 12, 2, 2, 60, 149, 300, 1260, 192, 192, 912, 750, 509, 800, 949, 1000, 5030, 1, 948, 5000, 727, 30, 757, 90, 4074, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1244, 'JAKK_XMAS', 'Christmas Jakk', 38, 3581, 0, 1113, 688, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 1062, 5500, 912, 900, 985, 31, 2331, 5, 1008, 5, 535, 1000, 2236, 70, 4109, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1245, 'GOBLINE_XMAS', 'Christmas Goblin', 25, 1176, 0, 282, 171, 1, 118, 140, 10, 5, 1, 53, 25, 20, 38, 45, 10, 12, 1, 7, 24, 149, 100, 1120, 620, 240, 998, 270, 911, 1200, 756, 43, 2297, 3, 1211, 10, 2104, 5, 2236, 40, 4060, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1246, 'COOKIE_XMAS', '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, 538, 1500, 722, 45, 912, 200, 2502, 25, 2501, 120, 507, 1100, 501, 700, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1247, '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, 7034, 10000, 644, 200, 538, 1500, 539, 1000, 529, 5500, 530, 500, 2236, 250, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1248, 'CRUISER', 'Cruiser', 35, 2820, 0, 1100, 450, 7, 175, 215, 5, 5, 1, 40, 10, 10, 90, 25, 10, 12, 1, 0, 60, 149, 400, 1296, 1296, 432, 1098, 900, 2251, 2, 998, 320, 996, 5, 911, 3500, 719, 35, 756, 87, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1249, 'MYSTCASE', '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, 530, 90, 912, 1500, 603, 20, 539, 800, 722, 150, 731, 5, 512, 100, 529, 340, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1250, 'CHEPET', 'Chepet', 42, 4950, 0, 1518, 946, 1, 380, 440, 0, 25, 1, 72, 35, 71, 65, 85, 10, 12, 1, 7, 23, 149, 400, 672, 672, 288, 7035, 2500, 912, 750, 512, 5500, 619, 40, 10019, 5, 502, 300, 2508, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1251, '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, 181, 200, 468, 468, 288, 1468, 150, 603, 3000, 617, 4000, 2621, 200, 2506, 500, 985, 4700, 984, 3500, 5007, 1, 1, 5000, 720, 4500, 2406, 270, 995, 3000);
+INSERT INTO `mob_db` VALUES (1252, 'GARM', 'Garm', 73, 197000, 0, 50050, 20020, 3, 1700, 1900, 40, 45, 85, 126, 82, 65, 95, 60, 10, 12, 2, 2, 81, 181, 400, 608, 408, 336, 7036, 5500, 1131, 150, 1256, 500, 512, 0, 512, 0, 985, 4100, 984, 2900, 512, 0, 28473, 5000, 7036, 1000, 603, 3000, 995, 3000);
+INSERT INTO `mob_db` VALUES (1253, '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, 912, 4000, 1039, 500, 512, 0, 512, 0, 2619, 1, 1769, 2000, 757, 238, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1254, 'RAGGLER', 'Raggler', 21, 1020, 0, 218, 140, 1, 102, 113, 0, 5, 18, 10, 32, 20, 39, 35, 10, 12, 0, 2, 24, 149, 200, 1000, 900, 384, 7053, 3000, 916, 5000, 645, 200, 656, 100, 992, 90, 2225, 7, 756, 32, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1255, 'NERAID', 'Neraid', 40, 4120, 0, 1126, 684, 1, 325, 360, 0, 10, 1, 45, 50, 5, 64, 5, 10, 12, 0, 2, 22, 149, 200, 776, 576, 288, 1055, 5500, 7053, 1000, 510, 230, 717, 250, 656, 250, 757, 180, 985, 37, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1256, 'PEST', 'Pest', 40, 3240, 0, 1238, 752, 1, 375, 450, 0, 5, 1, 60, 22, 5, 80, 5, 10, 12, 0, 2, 47, 149, 200, 700, 648, 480, 1055, 5500, 7054, 200, 702, 10, 605, 60, 716, 230, 512, 0, 756, 115, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1257, 'INJUSTICE', 'Injustice', 51, 7600, 0, 2118, 1488, 1, 480, 600, 0, 0, 84, 42, 39, 0, 71, 35, 10, 12, 1, 1, 47, 149, 400, 770, 720, 336, 999, 300, 7054, 5500, 7053, 3500, 2313, 5, 2316, 2, 512, 0, 1255, 2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1258, '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, 2297, 3, 998, 250, 911, 1000, 1765, 3000, 501, 600, 1705, 25, 656, 150, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1259, 'GRYPHON', 'Gryphon', 72, 27800, 0, 5896, 4400, 1, 880, 1260, 35, 35, 68, 95, 78, 65, 115, 75, 10, 12, 2, 2, 84, 181, 100, 704, 504, 432, 7048, 2500, 7054, 5500, 7063, 120, 1452, 1500, 757, 150, 984, 185, 996, 150, 1417, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1260, '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, 149, 200, 920, 720, 200, 7054, 5500, 734, 1000, 2505, 30, 512, 0, 512, 0, 1000, 80, 747, 3, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1261, '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, 7053, 6000, 748, 50, 5037, 120, 1767, 3000, 624, 35, 528, 600, 2244, 2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1262, 'MUTANT_DRAGON', 'Mutant Dragon', 65, 62600, 0, 4730, 3536, 4, 2400, 3400, 15, 20, 75, 47, 30, 68, 45, 35, 10, 12, 2, 9, 43, 181, 250, 1280, 1080, 240, 7054, 5500, 1035, 500, 1036, 500, 930, 500, 2627, 30, 522, 150, 505, 150, 504, 250, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1263, '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, 149, 150, 1056, 1056, 336, 912, 5000, 932, 6000, 7005, 500, 1610, 25, 1611, 8, 996, 100, 1615, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1264, 'MERMAN', 'Merman', 53, 12300, 0, 3345, 2054, 2, 482, 603, 10, 35, 72, 45, 46, 15, 85, 55, 10, 12, 1, 7, 41, 149, 200, 916, 816, 336, 1054, 1300, 523, 300, 657, 200, 720, 40, 995, 35, 1460, 3, 756, 203, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1265, 'COOKIE', 'Cookie', 25, 950, 0, 310, 188, 1, 130, 153, 0, 25, 1, 35, 20, 53, 37, 90, 10, 12, 0, 7, 60, 145, 200, 1036, 936, 240, 538, 1000, 530, 150, 979, 1, 645, 280, 2402, 30, 1001, 40, 2502, 20, 529, 320, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1266, '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, 938, 500, 7013, 40, 1052, 1200, 508, 200, 912, 60, 512, 100, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1267, 'CARAT', 'Carat', 51, 5200, 0, 1926, 1353, 1, 330, 417, 0, 25, 1, 41, 45, 5, 85, 155, 10, 12, 1, 6, 44, 149, 200, 1078, 768, 384, 7054, 3200, 536, 1000, 2409, 5, 5003, 1, 512, 0, 512, 0, 504, 450, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1268, 'BLOODY_KNIGHT', 'Blood Knight', 82, 57870, 0, 10120, 6820, 3, 2150, 3030, 60, 50, 88, 75, 70, 77, 125, 55, 10, 12, 2, 0, 87, 149, 250, 828, 528, 192, 7054, 5500, 2229, 45, 2317, 5, 2106, 65, 1170, 1, 984, 304, 985, 433, 1417, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1269, '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, 1095, 5500, 1019, 800, 504, 900, 657, 220, 7026, 30, 7027, 30, 985, 163, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1270, 'C_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, 1095, 5500, 7054, 5500, 999, 500, 520, 850, 2109, 1, 7026, 2000, 7027, 2000, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1271, '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, 912, 1000, 1099, 600, 7003, 2000, 608, 50, 512, 0, 512, 0, 756, 129, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1272, '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, 181, 100, 868, 768, 480, 1615, 800, 5017, 500, 1237, 300, 2334, 300, 2507, 100, 985, 5300, 984, 4100, 2609, 140, 1, 5000, 7005, 6000, 512, 0, 617, 2000);
+INSERT INTO `mob_db` VALUES (1273, '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, 149, 200, 1050, 900, 288, 7053, 5500, 998, 300, 2602, 1, 756, 40, 1352, 10, 508, 900, 2338, 1, 2206, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1274, '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, 912, 100, 7049, 1000, 617, 1, 512, 0, 512, 0, 985, 61, 757, 207, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1275, '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, 1152, 1152, 480, 7047, 2500, 637, 40, 2407, 3, 739, 30, 512, 100, 503, 400, 2215, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1276, '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, 7054, 5500, 512, 0, 2315, 2, 1701, 150, 1764, 2000, 1715, 3, 985, 106, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1277, '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, 7054, 2000, 1019, 2000, 1501, 100, 512, 0, 2272, 1, 503, 150, 609, 35, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1278, 'STALACTIC_GOLEM', 'Stalactite Golem', 60, 18700, 0, 3872, 2695, 1, 950, 1130, 50, 5, 73, 45, 85, 5, 75, 25, 10, 12, 2, 0, 80, 145, 200, 1264, 864, 288, 7004, 2000, 7054, 5500, 1000, 250, 997, 30, 512, 0, 757, 250, 985, 163, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1279, '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, 149, 200, 860, 660, 624, 7053, 100, 943, 380, 606, 200, 993, 160, 1001, 140, 512, 0, 757, 106, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1280, 'STEAM_GOBLIN', 'Steam Goblin', 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, 911, 2500, 7053, 4000, 998, 300, 999, 55, 1003, 320, 1003, 320, 757, 124, 744, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1281, 'SAGEWORM', 'Sageworm', 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, 912, 1200, 1097, 1000, 1055, 3000, 2241, 5, 505, 40, 512, 1000, 5012, 1, 1550, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1282, '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, 912, 250, 999, 60, 1034, 5000, 512, 0, 1763, 2000, 1711, 5, 756, 79, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1283, 'CHIMERA', 'Chimera', 70, 32600, 0, 4950, 3000, 1, 1200, 1320, 30, 10, 1, 72, 110, 88, 75, 85, 10, 12, 2, 2, 63, 181, 200, 772, 672, 360, 7054, 5500, 1048, 2500, 657, 500, 1306, 1, 504, 560, 1364, 1, 984, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1284, 'HUGELING', 'Hugeling', 1, 5000, 0, 2, 1, 4, 7, 10, 0, 0, 1, 1, 1, 1, 6, 0, 10, 12, 2, 3, 21, 145, 200, 1872, 672, 480, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 512, 100, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1285, 'ARCHER_GUARDIAN', 'Guardian Archer', 74, 28634, 0, 1, 1, 12, 1120, 1600, 35, 60, 95, 80, 80, 90, 165, 55, 14, 16, 2, 7, 80, 133, 265, 1200, 1200, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1286, 'KNIGHT_GUARDIAN', 'Guardian Knight', 86, 30214, 0, 1, 1, 2, 1280, 1560, 55, 30, 110, 40, 140, 65, 125, 65, 14, 16, 2, 7, 80, 133, 275, 1200, 1200, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1287, 'SOLDIER_GUARDIAN', 'Guardian Soldier', 56, 15670, 0, 1, 1, 1, 873, 1036, 35, 0, 85, 56, 100, 45, 103, 43, 10, 12, 0, 4, 22, 133, 265, 1288, 288, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1288, 'EMPERIUM', 'Emperium', 90, 68430, 0, 109, 71, 1, 60, 71, 40, 50, 1, 17, 80, 50, 26, 20, 10, 12, 0, 4, 22, 0, 300, 1288, 288, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1289, 'MAYA_PURPLE', 'Maya Purple', 81, 54331, 0, 10496, 3893, 2, 1446, 1999, 68, 48, 95, 90, 80, 95, 90, 119, 10, 12, 2, 4, 82, 181, 100, 1024, 1000, 480, 7053, 4550, 757, 250, 756, 300, 969, 100, 984, 150, 985, 100, 639, 50, 10006, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1290, 'SKELETON_GENERAL', 'Skeleton General', 73, 17043, 0, 8170, 3370, 1, 910, 1089, 25, 25, 90, 25, 40, 20, 77, 25, 10, 12, 1, 1, 29, 149, 150, 2276, 576, 432, 7068, 2550, 756, 160, 503, 800, 1220, 35, 1219, 80, 1222, 3, 512, 0, 2274, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1291, 'WRAITH_DEAD', 'Wraith Dead', 74, 42131, 0, 10341, 3618, 2, 1366, 1626, 25, 30, 5, 99, 55, 95, 115, 45, 10, 12, 2, 1, 89, 149, 175, 1816, 576, 240, 1059, 4550, 2206, 10, 2506, 8, 716, 700, 732, 5, 717, 850, 657, 150, 603, 100, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1292, 'MINI_DEMON', 'Mini Demon', 68, 31865, 0, 8396, 3722, 1, 1073, 1415, 30, 25, 5, 75, 40, 55, 89, 42, 10, 12, 0, 6, 27, 149, 150, 1000, 600, 384, 1038, 4550, 1039, 450, 2255, 6, 757, 160, 912, 2500, 1009, 10, 1410, 3, 7054, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1293, 'CREMY_FEAR', 'Creamy Fear', 62, 13109, 0, 7365, 2691, 2, 667, 830, 45, 30, 5, 40, 16, 15, 68, 55, 10, 12, 0, 4, 24, 149, 155, 1136, 720, 840, 924, 4550, 2333, 10, 518, 550, 602, 200, 1550, 8, 1611, 8, 522, 50, 7053, 1800, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1294, 'KILLER_MANTIS', 'Killer Mantis', 56, 12911, 0, 6509, 2366, 1, 764, 927, 35, 20, 5, 26, 24, 5, 75, 40, 10, 12, 1, 4, 22, 149, 175, 1528, 660, 432, 1031, 4550, 943, 2500, 721, 10, 504, 5, 656, 25, 2224, 3, 2108, 1, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1295, 'OWL_BARON', 'Owl Baron', 75, 59489, 0, 10967, 4811, 2, 1252, 1609, 65, 25, 25, 25, 80, 95, 95, 55, 10, 12, 2, 6, 60, 181, 175, 1345, 824, 440, 7071, 3500, 7063, 2500, 1716, 2, 1472, 1, 1402, 25, 1514, 10, 5045, 5, 7054, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1296, 'KOBOLD_LEADER', 'Kobold Leader', 65, 17935, 0, 7432, 2713, 1, 649, 957, 37, 37, 5, 90, 36, 30, 77, 59, 10, 12, 1, 7, 44, 149, 150, 1028, 528, 360, 999, 450, 1034, 6500, 912, 1200, 1511, 6, 1613, 2, 525, 150, 526, 100, 7053, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1297, 'ANCIENT_MUMMY', 'Ancient Mummy', 64, 39760, 0, 8040, 3499, 1, 836, 1129, 27, 27, 28, 19, 32, 5, 83, 35, 10, 12, 1, 1, 49, 149, 175, 1772, 120, 384, 930, 4550, 934, 1800, 2624, 1, 2611, 150, 503, 350, 756, 150, 757, 100, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1298, 'ZOMBIE_MASTER', 'Zombie Master', 62, 13917, 0, 7610, 2826, 1, 824, 1084, 37, 26, 25, 20, 30, 5, 77, 35, 10, 12, 1, 1, 29, 149, 175, 2612, 912, 288, 7071, 4550, 938, 1500, 958, 1500, 723, 200, 727, 100, 1260, 1, 2324, 2, 2627, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1299, 'GOBLIN_LEADER', 'Goblin Leader', 64, 19735, 0, 6036, 2184, 1, 663, 753, 48, 16, 5, 55, 37, 30, 69, 58, 10, 12, 1, 7, 24, 149, 120, 1120, 620, 240, 998, 1200, 999, 800, 756, 120, 2297, 5, 2106, 2, 503, 650, 2611, 240, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1300, 'CATERPILLAR', 'Caterpillar', 64, 14140, 0, 6272, 3107, 1, 895, 1448, 47, 29, 35, 25, 85, 15, 69, 45, 10, 12, 0, 4, 22, 149, 300, 1672, 672, 480, 949, 3000, 7054, 5500, 2227, 20, 1000, 100, 997, 50, 501, 1000, 502, 500, 505, 12, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1301, 'AM_MUT', 'Am Mut', 61, 11848, 0, 7709, 2690, 1, 1041, 1123, 50, 10, 50, 65, 40, 35, 83, 45, 10, 12, 0, 6, 27, 149, 200, 1156, 456, 384, 1021, 4550, 757, 250, 1517, 3, 969, 5, 2282, 1, 912, 1200, 746, 250, 616, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1302, 'DARK_ILLUSION', 'Dark Illusion', 77, 101487, 0, 11163, 4181, 2, 1300, 1982, 64, 70, 5, 100, 40, 100, 97, 40, 10, 12, 2, 6, 89, 181, 145, 1024, 768, 480, 1615, 3, 5017, 2, 2508, 3, 7054, 5500, 522, 120, 504, 550, 1162, 2, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1303, 'GIANT_HONET', 'Giant Hornet', 56, 12834, 0, 5785, 2006, 1, 650, 851, 38, 43, 35, 38, 32, 10, 71, 64, 10, 12, 0, 4, 24, 149, 155, 1292, 792, 340, 526, 550, 518, 1200, 522, 12, 610, 15, 1608, 3, 722, 20, 2627, 1, 516, 3500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1304, 'GIANT_SPIDER', 'Giant Spider', 55, 11628, 0, 6211, 2146, 1, 625, 802, 41, 28, 5, 36, 43, 5, 73, 69, 10, 12, 2, 4, 25, 149, 165, 1468, 468, 768, 1025, 4550, 1042, 1200, 757, 140, 525, 450, 943, 1200, 1096, 680, 7053, 800, 7054, 800, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1305, 'ANCIENT_WORM', 'Ancient Worm', 67, 22131, 0, 8174, 3782, 1, 947, 1115, 35, 30, 5, 35, 56, 55, 81, 72, 10, 12, 2, 4, 25, 149, 165, 1792, 792, 336, 1042, 4550, 912, 2500, 2406, 1, 719, 15, 1096, 680, 938, 3500, 7054, 2500, 7053, 2500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1306, 'LEIB_OLMAI', 'Leib Olmai', 58, 23731, 0, 6011, 2171, 1, 740, 1390, 27, 31, 5, 35, 95, 5, 64, 85, 10, 12, 2, 2, 22, 149, 175, 1260, 230, 192, 948, 4550, 2289, 8, 740, 120, 518, 500, 526, 1, 969, 5, 7053, 800, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1307, 'CAT_O_NINE_TAIL', 'Cat\'o\'Nine Tails', 76, 63177, 0, 10869, 4283, 1, 1112, 1275, 61, 55, 55, 75, 55, 82, 86, 120, 10, 12, 1, 6, 63, 181, 155, 1276, 576, 288, 5008, 1, 638, 150, 10008, 5, 985, 600, 984, 800, 969, 6, 617, 1, 7054, 5500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1308, 'PANZER_GOBLIN', 'Panzer Goblin', 59, 13838, 0, 7212, 2697, 1, 682, 877, 41, 28, 60, 60, 40, 20, 81, 160, 10, 12, 1, 7, 44, 149, 200, 960, 1008, 840, 7053, 4550, 7054, 3500, 999, 180, 998, 360, 1003, 580, 744, 800, 994, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1309, 'GAJOMART', 'Gajomart', 63, 13386, 0, 6625, 2900, 1, 916, 948, 85, 50, 5, 34, 10, 5, 75, 140, 10, 12, 0, 0, 83, 149, 300, 1000, 1152, 828, 953, 6500, 912, 2300, 503, 870, 2279, 8, 1752, 10000, 999, 640, 994, 180, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1310, 'MAJORUROS', 'Majoruros', 66, 56791, 0, 8525, 3799, 1, 780, 1300, 10, 25, 65, 50, 75, 50, 85, 48, 10, 12, 2, 2, 43, 149, 250, 1100, 960, 780, 941, 4550, 1361, 4, 657, 300, 984, 16, 504, 850, 2611, 160, 2607, 1, 1000, 250, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1311, 'GULLINBURSTI', 'Gullinbursti', 62, 20890, 0, 5814, 2376, 1, 699, 1431, 10, 15, 55, 25, 60, 5, 70, 45, 10, 12, 2, 2, 42, 149, 150, 1960, 960, 384, 1028, 3500, 656, 290, 702, 6, 2276, 1, 605, 15, 2627, 1, 912, 160, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1312, 'TURTLE_GENERAL', 'Turtle General', 97, 320700, 0, 18202, 9800, 2, 2438, 3479, 50, 54, 100, 45, 55, 65, 105, 164, 10, 12, 2, 2, 42, 181, 200, 900, 1000, 500, 1529, 8, 1306, 5, 512, 0, 1417, 1, 7070, 5500, 512, 0, 912, 5500, 658, 1, 1, 5000, 967, 5500, 607, 1500, 617, 2000);
+INSERT INTO `mob_db` VALUES (1313, 'MOBSTER', 'Mobster', 61, 11347, 0, 4424, 1688, 1, 910, 1128, 41, 37, 76, 46, 20, 35, 76, 55, 10, 12, 1, 7, 20, 149, 250, 1100, 560, 580, 1239, 3, 2601, 2, 2621, 1, 716, 600, 912, 2500, 525, 450, 505, 60, 726, 4700, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1314, 'PERMETER', 'Perimeter', 63, 11684, 0, 3756, 1955, 2, 943, 1212, 46, 45, 69, 59, 60, 5, 69, 100, 10, 12, 1, 2, 40, 145, 250, 1100, 483, 528, 967, 4550, 7070, 45, 1019, 1240, 501, 2450, 912, 1240, 522, 25, 605, 1, 1519, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1315, 'ASSULTER', 'Assaulter', 71, 15861, 0, 4854, 2654, 2, 764, 1499, 35, 28, 85, 74, 10, 35, 100, 100, 10, 12, 1, 7, 44, 149, 155, 1000, 900, 432, 967, 4550, 7069, 1200, 7072, 840, 503, 1280, 912, 1240, 522, 45, 603, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1316, 'SOLIDER', 'Soldier', 70, 17181, 0, 4458, 1951, 2, 796, 978, 57, 43, 69, 35, 85, 5, 74, 100, 10, 12, 1, 2, 42, 145, 250, 1452, 483, 528, 967, 4550, 7070, 64, 7067, 850, 502, 2100, 912, 1240, 518, 850, 1519, 1, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1317, 'FUR_SEAL', 'Fur Seal', 63, 9114, 0, 4501, 2035, 1, 845, 1202, 25, 33, 5, 28, 22, 15, 69, 84, 10, 12, 1, 2, 21, 133, 250, 1612, 622, 583, 912, 4500, 510, 250, 2310, 5, 7053, 1200, 1452, 1, 525, 200, 746, 120, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1318, 'HEATER', 'Heater', 68, 15648, 0, 3766, 2359, 2, 682, 1007, 40, 42, 69, 47, 25, 5, 71, 100, 10, 12, 1, 2, 43, 149, 250, 1452, 483, 528, 967, 4550, 7070, 750, 501, 2400, 912, 1640, 526, 140, 7054, 600, 1505, 2, 7068, 1250, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1319, 'FREEZER', 'Freezer', 72, 12263, 0, 3665, 2197, 2, 672, 984, 55, 43, 69, 41, 59, 5, 67, 100, 10, 12, 1, 2, 41, 149, 250, 1452, 483, 528, 967, 4550, 7070, 850, 7066, 1250, 912, 1800, 526, 160, 7053, 600, 1504, 5, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1320, '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, 181, 195, 1345, 824, 440, 7071, 4550, 7063, 1500, 1714, 1, 747, 1, 1451, 3, 1513, 2, 5045, 1, 7054, 1500, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1321, 'DRAGON_TAIL', 'Dragon Tail', 61, 11883, 0, 3587, 1453, 1, 520, 715, 25, 19, 10, 68, 15, 5, 67, 67, 10, 12, 1, 4, 44, 149, 175, 862, 534, 312, 7064, 4550, 1096, 400, 943, 800, 2207, 8, 2226, 2, 601, 300, 602, 150, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1322, 'SPRING_RABBIT', 'Spring Rabbit', 58, 12844, 0, 3982, 1766, 1, 585, 813, 29, 21, 45, 61, 5, 15, 77, 90, 10, 12, 1, 2, 42, 131, 160, 1120, 552, 511, 7054, 3500, 7053, 2500, 949, 2500, 511, 800, 508, 800, 510, 200, 509, 800, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1323, 'SEE_OTTER', 'Sea Otter', 59, 9999, 0, 4267, 2040, 1, 650, 813, 33, 35, 5, 36, 40, 25, 82, 65, 10, 12, 1, 2, 61, 133, 190, 1132, 583, 532, 722, 150, 965, 5500, 7065, 4500, 725, 50, 726, 50, 746, 650, 7053, 1200, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1324, 'TREASURE_BOX1', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1325, 'TREASURE_BOX2', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7073, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1239, 1500, 2252, 75, 1165, 8, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1326, 'TREASURE_BOX3', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1327, 'TREASURE_BOX4', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7074, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2108, 1000, 1306, 75, 5022, 8, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1328, 'TREASURE_BOX5', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1329, 'TREASURE_BOX6', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7075, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2102, 834, 5019, 100, 5002, 9, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1330, 'TREASURE_BOX7', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1331, 'TREASURE_BOX8', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7076, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2616, 500, 2334, 125, 2622, 9, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1332, 'TREASURE_BOX9', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1333, 'TREASURE_BOX10', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7077, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2104, 500, 2331, 150, 2623, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1334, 'TREASURE_BOX11', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1335, 'TREASURE_BOX12', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7078, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2270, 500, 1716, 150, 2256, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1336, 'TREASURE_BOX13', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1337, 'TREASURE_BOX14', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7079, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1238, 375, 1531, 150, 2318, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1338, 'TREASURE_BOX15', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1339, 'TREASURE_BOX16', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7080, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2626, 300, 1472, 167, 2327, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1340, 'TREASURE_BOX17', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1341, 'TREASURE_BOX18', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7081, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1143, 250, 1237, 188, 2235, 12, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1342, 'TREASURE_BOX19', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1343, 'TREASURE_BOX20', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7082, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 617, 250, 1229, 188, 5007, 19, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1344, 'TREASURE_BOX21', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1345, 'TREASURE_BOX22', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7083, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2508, 1000, 2336, 69, 2621, 20, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1346, 'TREASURE_BOX23', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1347, 'TREASURE_BOX24', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7084, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2106, 1000, 1164, 50, 5025, 24, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1348, 'TREASURE_BOX25', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1349, 'TREASURE_BOX26', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7085, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2231, 750, 2624, 46, 2286, 25, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1350, 'TREASURE_BOX27', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1351, 'TREASURE_BOX28', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7086, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2283, 500, 2615, 41, 2234, 32, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1352, 'TREASURE_BOX29', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1353, 'TREASURE_BOX30', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7087, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2507, 500, 2625, 38, 5027, 34, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1354, 'TREASURE_BOX31', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1355, 'TREASURE_BOX32', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7088, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2407, 429, 2269, 250, 2317, 35, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1356, 'TREASURE_BOX33', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1357, 'TREASURE_BOX34', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7089, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2109, 300, 2406, 273, 2258, 38, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1358, 'TREASURE_BOX35', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1359, 'TREASURE_BOX36', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7090, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1142, 215, 2255, 60, 5017, 38, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1360, 'TREASURE_BOX37', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1361, 'TREASURE_BOX38', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7091, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 1417, 50, 5053, 50, 2229, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1362, 'TREASURE_BOX39', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 732, 8000, 608, 3000, 607, 2500, 2504, 800, 2404, 800, 2315, 800, 2104, 800, 616, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1363, 'TREASURE_BOX40', 'Treasure Chest', 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 7092, 80, 658, 500, 604, 10000, 984, 5000, 985, 7500, 2506, 43, 2254, 43, 1529, 38, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1364, 'G_ASSULTER', 'Assaulter', 59, 18251, 0, 1, 1, 2, 195, 227, 35, 36, 85, 55, 10, 35, 145, 100, 10, 12, 1, 7, 44, 149, 155, 1000, 900, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1365, 'APOCALIPS', 'Apocalypse', 66, 22680, 0, 6540, 4935, 2, 1030, 1370, 62, 49, 1, 48, 120, 108, 66, 85, 10, 12, 2, 0, 60, 133, 400, 1564, 864, 576, 7095, 5500, 7094, 2400, 7093, 2200, 985, 5, 757, 15, 2506, 20, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1366, 'LAVA_GOLEM', 'Lava Golem', 77, 24324, 0, 6470, 3879, 1, 1541, 2049, 65, 50, 1, 57, 115, 127, 76, 68, 10, 12, 2, 0, 83, 133, 400, 1564, 864, 576, 7096, 5000, 7097, 3800, 2317, 1, 2316, 2, 504, 2500, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1367, 'BLAZZER', 'Blazer', 43, 8252, 0, 3173, 1871, 2, 533, 709, 50, 40, 1, 52, 50, 64, 69, 40, 10, 12, 0, 6, 43, 133, 180, 1564, 864, 576, 7097, 5500, 7098, 3700, 504, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1368, 'GEOGRAPHER', 'Geographer', 56, 8071, 0, 2715, 2000, 3, 467, 621, 28, 26, 1, 67, 47, 83, 68, 44, 10, 12, 0, 3, 62, 132, 2000, 1564, 864, 576, 1032, 7500, 1033, 5500, 2253, 30, 2207, 50, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1369, 'GRAND_PECO', 'Grand Peco', 58, 8054, 0, 2387, 1361, 2, 444, 565, 37, 30, 1, 67, 66, 83, 71, 51, 10, 12, 2, 2, 43, 145, 165, 1564, 864, 576, 7101, 5000, 522, 300, 992, 1000, 969, 1, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1370, 'SUCCUBUS', 'Succubus', 85, 16955, 0, 5357, 4322, 2, 1268, 1686, 54, 48, 1, 97, 95, 150, 89, 87, 10, 12, 1, 6, 67, 133, 155, 1564, 864, 576, 522, 1500, 2407, 3, 2611, 500, 2613, 150, 2601, 2, 1472, 1, 505, 1000, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1371, 'FAKE_ANGEL', 'Fake Angel', 65, 16845, 0, 3371, 1949, 2, 513, 682, 50, 35, 1, 64, 57, 98, 61, 88, 10, 12, 0, 8, 66, 133, 160, 1564, 864, 576, 7104, 5500, 7105, 3500, 717, 1000, 715, 1000, 716, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1372, 'GOAT', 'Goat', 69, 11077, 0, 3357, 2015, 1, 457, 608, 44, 25, 1, 58, 66, 95, 67, 43, 10, 12, 2, 2, 63, 145, 165, 1564, 864, 576, 7106, 5000, 7107, 2500, 713, 5000, 507, 500, 510, 1000, 508, 2500, 511, 5500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1373, 'LORD_OF_DEATH', 'Lord of Death', 94, 303383, 0, 10000, 5000, 3, 2430, 3232, 77, 73, 1, 99, 120, 169, 100, 106, 10, 12, 2, 6, 67, 181, 300, 1564, 864, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10000, 1000, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1374, 'INCUBUS', 'Incubus', 75, 17281, 0, 5254, 4212, 2, 1408, 1873, 58, 46, 1, 97, 95, 150, 89, 87, 10, 12, 1, 6, 67, 133, 165, 1564, 864, 576, 522, 1500, 504, 5500, 1306, 2, 2621, 1, 2610, 500, 2613, 150, 504, 1200, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1375, 'THE_PAPER', 'The Paper', 56, 18557, 0, 2849, 1998, 1, 845, 1124, 25, 24, 1, 66, 52, 102, 71, 79, 10, 12, 1, 0, 60, 133, 170, 1564, 864, 576, 7111, 5500, 7112, 3200, 503, 800, 511, 2000, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1376, 'HARPY', 'Harpy', 70, 16599, 0, 3562, 2133, 1, 956, 1231, 42, 44, 1, 112, 72, 103, 74, 76, 10, 12, 1, 6, 64, 133, 155, 1564, 864, 576, 7115, 5500, 7116, 2500, 502, 1500, 503, 800, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1377, 'ELDER', 'Elder', 64, 21592, 0, 4650, 3408, 3, 421, 560, 45, 68, 1, 76, 68, 142, 72, 86, 10, 12, 2, 7, 80, 133, 165, 1564, 864, 576, 7099, 4500, 7117, 1500, 7118, 1500, 1472, 4, 1473, 1, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1378, 'DEMON_PUNGUS', 'Demon Pungus', 56, 7259, 0, 3148, 1817, 1, 360, 479, 48, 31, 1, 83, 55, 86, 63, 34, 10, 12, 0, 6, 65, 133, 170, 1564, 864, 576, 7119, 4200, 7001, 4700, 715, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1379, 'NIGHTMARE_TERROR', 'Nightmare Terror', 78, 22605, 0, 6683, 4359, 1, 757, 1007, 37, 37, 1, 76, 55, 87, 77, 54, 10, 12, 2, 6, 67, 133, 165, 1564, 864, 576, 7120, 5500, 2626, 1, 2608, 30, 505, 50, 510, 150, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1380, 'DRILLER', 'Driller', 52, 7452, 0, 3215, 1860, 1, 666, 886, 48, 31, 1, 66, 58, 79, 60, 47, 10, 12, 1, 2, 22, 133, 165, 1564, 864, 576, 1012, 7500, 715, 4000, 716, 3500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1381, 'GRIZZLY', 'Grizzly', 68, 11733, 0, 3341, 2012, 1, 809, 1076, 44, 32, 1, 54, 68, 92, 70, 61, 10, 12, 2, 2, 63, 133, 165, 1564, 864, 576, 948, 7500, 919, 7500, 549, 2500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1382, 'DIABOLIC', 'Diabolic', 67, 9642, 0, 3662, 2223, 1, 796, 1059, 64, 36, 1, 84, 53, 93, 71, 69, 10, 12, 0, 6, 47, 133, 150, 1564, 864, 576, 1038, 6800, 1039, 5700, 2605, 3, 984, 20, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1383, 'EXPLOSION', 'Explosion', 46, 8054, 0, 2404, 1642, 1, 336, 447, 35, 27, 1, 61, 56, 78, 66, 38, 10, 12, 0, 2, 63, 133, 165, 1564, 864, 576, 7006, 6500, 7097, 2500, 7122, 3500, 756, 1000, 522, 500, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1384, 'DELETER', 'Sky Deleter', 66, 17292, 0, 3403, 2066, 1, 446, 593, 45, 53, 1, 105, 40, 85, 72, 54, 10, 12, 1, 9, 44, 133, 175, 1564, 864, 576, 7123, 4200, 1035, 5500, 1037, 4000, 1036, 3700, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1385, 'DELETER_', 'Earth Deleter', 65, 15168, 0, 3403, 2066, 1, 446, 593, 52, 53, 1, 67, 40, 85, 72, 68, 10, 12, 1, 9, 42, 133, 175, 1564, 864, 576, 7123, 4200, 1035, 5500, 1037, 4000, 1036, 3700, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1386, 'SLEEPER', 'Sleeper', 67, 8237, 0, 3603, 2144, 1, 593, 789, 49, 35, 1, 48, 100, 107, 75, 28, 10, 12, 1, 0, 42, 133, 195, 1564, 864, 576, 7124, 5500, 1056, 5500, 997, 4500, 756, 300, 1226, 5, 1222, 20, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1387, 'GIG', 'Gig', 60, 8409, 0, 3934, 2039, 1, 360, 479, 60, 28, 1, 61, 80, 93, 59, 46, 10, 12, 0, 2, 41, 133, 170, 1564, 864, 576, 7125, 5000, 904, 7500, 716, 150, 525, 2500, 994, 850, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1388, 'ARCHANGELING', 'Archangeling', 60, 79523, 0, 4152, 2173, 1, 669, 890, 54, 58, 1, 65, 80, 114, 65, 105, 10, 12, 1, 8, 66, 181, 180, 1564, 864, 576, 2255, 5, 610, 1800, 608, 150, 985, 15, 984, 55, 2317, 3, 512, 500, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1389, 'DRACULA', 'Dracula', 85, 320096, 0, 120157, 38870, 3, 1625, 1891, 45, 76, 1, 95, 90, 87, 85, 100, 10, 12, 2, 6, 87, 181, 145, 1564, 864, 576, 607, 4700, 1473, 5, 1722, 5, 2507, 15, 2621, 4, 1557, 4, 512, 0, 4134, 1, 500, 5000, 607, 5500, 732, 2250, 522, 1125);
+INSERT INTO `mob_db` VALUES (1390, '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, 1060, 6500, 1611, 50, 740, 1200, 2610, 800, 526, 1400, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1391, 'GALAPAGO', 'Galapago', 63, 9940, 0, 3204, 1966, 1, 457, 608, 33, 33, 1, 56, 56, 45, 66, 57, 10, 12, 1, 2, 22, 131, 165, 1564, 864, 576, 7053, 6700, 610, 1500, 503, 2500, 606, 100, 605, 100, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1392, 'ROTAR_ZAIRO', 'Rotar Zairo', 25, 1209, 0, 351, 215, 10, 109, 137, 4, 34, 1, 62, 45, 48, 55, 5, 10, 12, 1, 0, 44, 133, 155, 1564, 864, 576, 7126, 500, 2312, 1, 2309, 1, 999, 450, 984, 1, 912, 2500, 910, 5500, 7053, 1000, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1393, 'G_MUMMY', 'G Mummy', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1394, 'G_ZOMBIE', 'G Zombie', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1395, 'CRYSTAL_1', 'Wind Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 547, 5000, 526, 3000, 607, 1000, 2504, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1396, 'CRYSTAL_2', 'Earth Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 604, 5000, 999, 3000, 2104, 1000, 2213, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1397, 'CRYSTAL_3', 'Fire Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 604, 5000, 984, 3000, 7047, 1000, 2322, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1398, 'CRYSTAL_4', 'Water Crystal', 1, 15, 0, 0, 0, 1, 1, 2, 100, 99, 0, 0, 0, 0, 999, 0, 7, 12, 0, 3, 22, 193, 2000, 300, 300, 1, 505, 5000, 985, 3000, 706, 1000, 2404, 500, 2631, 300, 603, 150, 617, 100, 616, 50, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1399, 'EVENT_BAPHO', 'Baphomet', 99, 864960, 0, 562340, 87895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 1068, 768, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 923, 3800, 0, 0);
+INSERT INTO `mob_db` VALUES (1400, 'KARAKASA', 'Karakasa', 30, 3092, 0, 489, 322, 1, 140, 183, 1, 20, 1, 40, 12, 5, 52, 45, 10, 12, 1, 0, 60, 129, 300, 1480, 480, 1056, 7150, 4501, 7151, 5000, 912, 4001, 1019, 3501, 7111, 2501, 746, 51, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1401, 'SHINOBI', 'Shinobi', 69, 12700, 0, 4970, 3010, 1, 460, 1410, 30, 21, 1, 91, 25, 25, 89, 40, 10, 12, 1, 7, 67, 133, 200, 1480, 480, 720, 7156, 7000, 1011, 4000, 7053, 3000, 739, 200, 2337, 50, 2335, 150, 2336, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1402, 'POISON_TOAD', 'Poison Toad', 46, 6629, 0, 1929, 1457, 1, 288, 408, 5, 10, 1, 45, 19, 1, 66, 43, 10, 12, 1, 2, 45, 129, 165, 976, 576, 288, 7154, 6000, 7155, 4000, 724, 5, 526, 1500, 506, 1000, 2610, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1403, 'ANTIQUE_FIRELOCK', 'Antique Firelock', 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, 998, 5500, 7126, 1501, 549, 351, 525, 301, 503, 21, 7157, 0, 2285, 2, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1404, 'MIYABI_NINGYO', 'Miyabi Ningyo', 33, 6300, 0, 795, 493, 1, 250, 305, 1, 2, 45, 31, 15, 10, 47, 15, 10, 12, 1, 6, 27, 145, 200, 1720, 500, 420, 7153, 2501, 7152, 5500, 1000, 1301, 7005, 101, 504, 501, 2613, 2, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1405, 'TENGU', 'Tengu', 65, 16940, 0, 4207, 2843, 2, 660, 980, 12, 82, 1, 45, 69, 45, 75, 25, 10, 12, 2, 6, 42, 133, 150, 1056, 1056, 336, 7159, 5000, 7158, 4000, 999, 2500, 7063, 1500, 522, 1000, 2278, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1406, 'KAPHA', 'Kappa', 41, 7982, 0, 2278, 1552, 3, 399, 719, 20, 38, 1, 65, 49, 22, 73, 140, 10, 12, 1, 5, 21, 133, 200, 1152, 1152, 384, 7149, 6500, 7053, 4001, 912, 601, 521, 2301, 520, 2000, 640, 11, 708, 101, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1407, 'DOKEBI_', 'Dokebi', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1408, 'BLOOD_BUTTERFLY', 'Blood Butterfly', 57, 8082, 0, 2298, 1896, 2, 354, 575, 5, 23, 1, 65, 35, 37, 116, 30, 10, 13, 1, 4, 44, 133, 150, 872, 500, 300, 7163, 5000, 7168, 2501, 602, 1501, 924, 5000, 512, 1, 1802, 16, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1409, 'RICE_CAKE_BOY', 'Rice Cake Boy', 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, 7150, 5000, 7151, 4000, 512, 1500, 2262, 800, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1410, 'LIVE_PEACH_TREE', 'Live Peach Tree', 55, 10050, 0, 2965, 1999, 8, 482, 603, 10, 38, 1, 45, 120, 39, 120, 55, 10, 13, 1, 3, 42, 132, 400, 1288, 576, 288, 7164, 4000, 522, 2500, 526, 1500, 604, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1410, 'LIVE_PEACH_TREE', 'Live Peach Tree', 55, 10050, 0, 2965, 1999, 8, 482, 603, 10, 38, 1, 45, 120, 39, 120, 55, 10, 13, 1, 3, 42, 132, 400, 1288, 576, 288, 7164, 4000, 522, 2500, 526, 1500, 604, 1000, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1412, 'EVIL_CLOUD_HERMIT', 'Evil Cloud 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, 7162, 5500, 553, 5000, 548, 5500, 550, 5000, 1908, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1413, 'WILD_GINSENG', 'Wild Ginseng', 46, 6900, 0, 1038, 692, 5, 220, 280, 10, 20, 1, 42, 36, 55, 66, 30, 10, 13, 0, 3, 43, 145, 400, 2208, 1008, 324, 520, 2500, 521, 2500, 1032, 3500, 1033, 3500, 1951, 10, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1413, 'WILD_GINSENG', 'Wild Ginseng', 46, 6900, 0, 1038, 692, 5, 220, 280, 10, 20, 1, 42, 36, 55, 66, 30, 10, 13, 0, 3, 43, 145, 400, 2208, 1008, 324, 520, 2500, 521, 2500, 1032, 3500, 1033, 3500, 1951, 10, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1415, 'BABY_LEOPARD', 'Baby Leopard', 32, 2590, 0, 352, 201, 2, 155, 207, 0, 5, 1, 44, 20, 4, 49, 10, 10, 13, 0, 2, 28, 133, 150, 988, 288, 168, 7171, 4501, 7172, 4501, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1416, 'WICKED_NYMPH', 'Wicked Nymph', 63, 18029, 0, 3945, 2599, 1, 691, 1382, 12, 75, 1, 64, 12, 69, 100, 80, 10, 13, 1, 6, 67, 133, 200, 1672, 672, 288, 7165, 4000, 7166, 4000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1417, '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, 137, 200, 976, 576, 288, 7161, 4501, 7167, 4501, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1418, 'DARK_SNAKE_LORD', 'Dark Snake Lord', 73, 254993, 0, 34288, 17950, 1, 1433, 2033, 25, 55, 1, 83, 62, 80, 164, 88, 10, 12, 2, 2, 68, 181, 200, 976, 500, 400, 7169, 1500, 10020, 2500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 524, 0, 985, 2000, 607, 3600, 608, 0);
+INSERT INTO `mob_db` VALUES (1419, 'G_FARMILIAR', 'Farmoloar', 8, 155, 0, 0, 0, 1, 20, 28, 0, 0, 1, 12, 8, 5, 28, 0, 10, 12, 0, 2, 27, 133, 150, 1276, 576, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1420, 'G_Skel_archer', 'Skeleton Archer', 31, 3040, 0, 0, 0, 9, 128, 153, 0, 0, 1, 8, 14, 5, 90, 5, 10, 12, 1, 1, 29, 133, 300, 2864, 864, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1421, 'G_ISIS', 'Isis', 43, 4828, 0, 0, 0, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1422, 'G_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, 133, 150, 676, 576, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1423, 'G_GHOUL', 'Ghoul', 39, 5118, 0, 0, 0, 1, 420, 500, 5, 20, 1, 20, 29, 0, 33, 20, 10, 12, 1, 1, 49, 133, 250, 2456, 912, 504, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1424, 'G_SIDE_WINDER', 'Sidewinder', 43, 4929, 0, 0, 0, 1, 240, 320, 5, 10, 38, 43, 40, 15, 115, 20, 10, 12, 1, 2, 25, 149, 200, 1576, 576, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1425, 'G_OBEAUNE', 'Obeaune', 31, 3952, 0, 0, 0, 1, 141, 165, 0, 40, 1, 31, 31, 55, 74, 85, 10, 12, 1, 5, 41, 149, 200, 1872, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1426, 'G_MARC', 'Marc', 36, 6900, 0, 0, 0, 1, 220, 280, 5, 10, 1, 36, 36, 20, 56, 30, 10, 12, 1, 5, 41, 133, 150, 1272, 72, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1427, 'G_NIGHTMARE', 'Nightmare', 49, 4437, 0, 0, 0, 1, 447, 529, 0, 40, 1, 74, 25, 15, 64, 10, 10, 12, 2, 6, 68, 149, 150, 1816, 816, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1428, 'G_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, 133, 200, 1672, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1429, 'G_ARGIOPE', 'Argiope', 41, 4382, 0, 0, 0, 1, 395, 480, 30, 0, 1, 41, 31, 10, 56, 30, 10, 12, 2, 4, 25, 149, 300, 1792, 792, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1430, 'G_ARGOS', 'Argor', 25, 1117, 0, 0, 0, 1, 158, 191, 15, 0, 1, 25, 25, 5, 32, 15, 10, 12, 2, 4, 25, 149, 300, 1468, 468, 768, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1431, 'G_BAPHOMET_', 'Baphomet', 50, 8578, 0, 0, 0, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1432, 'G_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, 141, 200, 1120, 420, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1433, 'G_DEVIRUCHI', 'Deviruchi', 46, 7360, 0, 0, 0, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1434, 'G_DRAINLIAR', 'Drainliar', 24, 1162, 0, 0, 0, 1, 74, 84, 0, 0, 1, 36, 24, 0, 78, 0, 10, 12, 0, 2, 47, 149, 250, 1276, 576, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1435, 'G_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, 149, 300, 2276, 576, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1436, 'G_JAKK', 'Jakk', 38, 3581, 0, 0, 0, 1, 315, 382, 5, 30, 1, 38, 38, 43, 75, 45, 10, 12, 1, 0, 43, 149, 200, 1180, 480, 648, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1437, 'G_JOKER', 'Joker', 57, 12450, 0, 0, 0, 1, 621, 738, 10, 35, 1, 143, 47, 75, 98, 175, 10, 12, 2, 7, 84, 149, 100, 1364, 864, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1438, 'G_KHALITZBURG', 'Khalitzburg', 63, 19276, 0, 0, 0, 1, 875, 1025, 45, 10, 58, 65, 48, 5, 73, 40, 10, 12, 2, 1, 29, 149, 350, 528, 1000, 396, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1439, 'G_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, 149, 150, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1440, 'G_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, 149, 200, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1441, 'G_PENOMENA', 'Penomena', 57, 7256, 0, 0, 0, 7, 415, 565, 5, 50, 1, 5, 35, 15, 136, 30, 10, 12, 1, 5, 25, 149, 400, 832, 500, 600, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1442, 'G_SASQUATCH', 'Sasquatch', 30, 3163, 0, 0, 0, 1, 250, 280, 5, 0, 75, 25, 60, 10, 34, 20, 10, 12, 2, 2, 60, 149, 300, 1260, 192, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1443, 'G_CRUISER', 'Cruiser', 35, 2820, 0, 0, 0, 7, 175, 215, 5, 5, 1, 40, 10, 10, 90, 25, 10, 12, 1, 0, 60, 149, 400, 1296, 1296, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1444, 'G_CHEPET', 'Chepet', 42, 4950, 0, 0, 0, 1, 380, 440, 0, 25, 1, 72, 35, 71, 65, 85, 10, 12, 1, 7, 23, 149, 400, 672, 672, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1445, 'G_RAGGLER', 'Raggler', 21, 1020, 0, 0, 0, 1, 102, 113, 0, 5, 18, 10, 32, 20, 39, 35, 10, 12, 0, 2, 24, 149, 200, 1000, 900, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1446, 'G_INJUSTICE', 'Injustice', 51, 7600, 0, 0, 0, 1, 480, 600, 0, 0, 84, 42, 39, 0, 71, 35, 10, 12, 1, 1, 47, 149, 400, 770, 720, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1447, 'G_GRYPHON', 'Gryphon', 72, 27800, 0, 0, 0, 1, 880, 1260, 35, 35, 68, 95, 78, 65, 115, 75, 10, 12, 2, 2, 84, 181, 100, 704, 504, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1448, 'G_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, 149, 200, 920, 720, 200, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1449, 'G_MUTANT_DRAGON', 'Muntant Dragon', 65, 62600, 0, 0, 0, 4, 2400, 3400, 15, 20, 75, 47, 30, 68, 45, 35, 10, 12, 2, 9, 43, 181, 250, 1280, 1080, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1450, 'G_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, 149, 150, 1056, 1056, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1451, 'G_MERMAN', 'Merman', 53, 12300, 0, 0, 0, 2, 482, 603, 10, 35, 72, 45, 46, 15, 85, 55, 10, 12, 1, 7, 41, 149, 200, 916, 816, 336, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1452, 'G_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, 149, 200, 1050, 900, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1453, 'G_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, 133, 200, 1152, 1152, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1454, 'G_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, 149, 200, 860, 660, 624, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1455, 'G_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, 133, 200, 1008, 1008, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1456, 'G_CHIMERA', 'Chimera', 70, 32600, 0, 0, 0, 1, 1200, 1320, 30, 10, 1, 72, 110, 88, 75, 85, 10, 12, 2, 2, 63, 181, 200, 772, 672, 360, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1457, 'G_MANTIS', 'Mantis', 26, 2472, 0, 0, 0, 1, 118, 149, 10, 0, 1, 26, 24, 5, 45, 15, 10, 12, 1, 4, 22, 149, 200, 1528, 660, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1458, 'G_MARDUK', 'Marduk', 40, 4214, 0, 0, 0, 1, 315, 382, 0, 60, 1, 40, 20, 79, 78, 20, 10, 12, 2, 7, 23, 149, 300, 1540, 840, 504, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1459, 'G_MARIONETTE', 'Marionette', 41, 3222, 0, 0, 0, 1, 355, 422, 0, 25, 1, 62, 36, 44, 69, 45, 10, 12, 0, 6, 68, 149, 300, 1480, 480, 1056, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1460, 'G_MATYR', 'Matyr', 31, 2585, 0, 0, 0, 1, 134, 160, 0, 0, 1, 47, 38, 5, 64, 5, 10, 12, 1, 2, 27, 149, 150, 432, 432, 360, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1461, 'G_MINOROUS', 'Minorous', 52, 7431, 0, 0, 0, 1, 590, 770, 15, 5, 65, 42, 61, 66, 52, 25, 10, 12, 2, 2, 43, 149, 200, 1360, 960, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1462, 'G_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, 133, 200, 2420, 720, 648, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1463, 'G_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, 133, 400, 2852, 1152, 840, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1464, 'G_PASANA', 'Pasana', 61, 8289, 0, 0, 0, 1, 513, 682, 29, 35, 1, 73, 50, 61, 69, 43, 10, 12, 1, 7, 43, 149, 165, 1700, 1000, 500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1465, 'G_PETIT', 'Petit', 44, 6881, 0, 0, 0, 1, 360, 427, 30, 30, 1, 44, 62, 69, 79, 60, 10, 12, 1, 9, 22, 149, 200, 1624, 620, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1466, 'G_PETIT_', 'Petit', 45, 5747, 0, 0, 0, 1, 300, 355, 20, 45, 1, 113, 45, 69, 73, 80, 10, 12, 1, 9, 24, 149, 150, 1420, 1080, 528, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1467, 'G_RAYDRIC', 'Raydric', 52, 8613, 0, 0, 0, 1, 830, 930, 40, 15, 58, 47, 42, 5, 69, 26, 10, 12, 2, 7, 47, 149, 150, 824, 780, 420, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1468, 'G_REQUIEM', 'Requim', 35, 3089, 0, 0, 0, 1, 220, 272, 0, 15, 1, 53, 35, 5, 57, 2, 10, 12, 1, 7, 27, 133, 400, 1516, 816, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1469, 'G_SKEL_WORKER', 'Skeletom Worker', 30, 2872, 0, 0, 0, 1, 242, 288, 0, 15, 1, 15, 30, 5, 42, 10, 10, 12, 1, 1, 29, 133, 400, 2420, 720, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1470, 'G_ZEROM', 'Zerom', 23, 1109, 0, 0, 0, 1, 127, 155, 0, 10, 1, 23, 23, 5, 42, 0, 10, 12, 1, 7, 23, 133, 200, 1780, 1080, 432, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1471, 'G_NINE_TAIL', 'NineTail', 51, 9466, 0, 0, 0, 1, 610, 734, 10, 25, 1, 80, 46, 1, 89, 85, 10, 12, 1, 2, 63, 149, 150, 840, 540, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1472, 'G_BON_GUN', 'Bon Gun', 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, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1473, 'G_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, 149, 300, 1960, 620, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1474, 'G_MIMIC', 'Mimic', 51, 6120, 0, 0, 0, 1, 150, 900, 10, 40, 44, 121, 1, 60, 75, 110, 10, 12, 1, 0, 60, 149, 100, 972, 500, 288, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1475, 'G_WRAITH', 'Wraith', 53, 10999, 0, 0, 0, 1, 580, 760, 5, 30, 1, 95, 30, 75, 95, 35, 10, 12, 2, 1, 89, 149, 300, 1816, 576, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1476, 'G_ALARM', 'Alarm', 58, 10647, 0, 0, 0, 1, 480, 600, 15, 15, 1, 62, 72, 10, 85, 45, 10, 12, 1, 0, 60, 149, 300, 1020, 500, 768, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1477, 'G_ARCLOUSE', 'Arclouse', 59, 6075, 0, 0, 0, 1, 570, 640, 10, 15, 1, 75, 5, 5, 75, 50, 10, 12, 1, 4, 42, 149, 100, 960, 500, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1478, 'G_RIDEWORD', 'Rideword', 59, 11638, 0, 0, 0, 1, 584, 804, 5, 35, 48, 75, 10, 20, 120, 45, 10, 12, 0, 0, 60, 149, 150, 864, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1479, 'G_SKEL_PRISONER', 'Skeleton Prisoner', 52, 8691, 0, 0, 0, 1, 660, 890, 10, 20, 55, 20, 36, 0, 76, 25, 10, 12, 1, 1, 69, 141, 350, 1848, 500, 576, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1480, 'G_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, 141, 350, 1768, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1481, 'G_PUNK', 'Punk', 43, 3620, 0, 0, 0, 1, 292, 365, 0, 45, 1, 105, 5, 45, 65, 20, 10, 12, 0, 3, 24, 149, 300, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1482, 'G_ZHERLTHSH', 'Zherlthsh', 63, 18300, 0, 0, 0, 1, 700, 850, 10, 15, 70, 85, 40, 30, 125, 60, 10, 12, 1, 7, 60, 141, 200, 800, 792, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1483, 'G_RYBIO', 'Rybio', 71, 9572, 0, 0, 0, 1, 686, 912, 45, 37, 1, 97, 75, 74, 77, 90, 10, 12, 2, 6, 40, 149, 200, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1484, 'G_PHENDARK', 'Phendark', 73, 22729, 0, 0, 0, 1, 794, 1056, 52, 36, 1, 62, 120, 65, 77, 66, 10, 12, 2, 7, 40, 149, 175, 1500, 500, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1485, 'G_MYSTELTAINN', 'Mysteltainn', 76, 33350, 0, 0, 0, 2, 1160, 1440, 30, 30, 77, 139, 80, 35, 159, 65, 10, 12, 2, 0, 87, 181, 250, 1152, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1486, 'G_TIRFING', 'Trifing', 71, 29900, 0, 0, 0, 1, 950, 1146, 30, 35, 58, 87, 55, 35, 132, 65, 10, 12, 1, 0, 67, 181, 100, 816, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1487, 'G_EXECUTIONER', 'Executioner', 65, 28980, 0, 0, 0, 2, 570, 950, 35, 35, 64, 85, 40, 25, 88, 60, 10, 12, 2, 0, 47, 181, 200, 768, 500, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1488, 'G_ANOLIAN', 'Anolian', 63, 18960, 0, 0, 0, 1, 640, 760, 15, 15, 1, 43, 58, 25, 97, 65, 10, 12, 1, 5, 41, 149, 200, 900, 500, 864, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1489, 'G_STING', 'Sting', 61, 9500, 0, 0, 0, 1, 850, 1032, 5, 30, 57, 45, 55, 5, 120, 85, 10, 12, 1, 0, 62, 149, 300, 528, 500, 240, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1490, 'G_WANDER_MAN', 'Wandering Man', 74, 8170, 0, 0, 0, 2, 750, 1000, 5, 5, 1, 192, 38, 45, 127, 85, 10, 12, 1, 6, 24, 149, 100, 672, 500, 192, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1491, 'G_DOKEBI', 'Dokebi', 33, 2697, 0, 0, 0, 1, 197, 249, 0, 10, 50, 50, 40, 35, 69, 40, 10, 12, 0, 6, 27, 145, 250, 1156, 456, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1492, 'INCANTATION_SAMURAI', 'Incantation Samurai', 75, 218652, 0, 33095, 18214, 1, 1219, 2169, 10, 51, 64, 85, 78, 85, 150, 60, 10, 12, 2, 7, 67, 181, 200, 1152, 1152, 480, 1164, 2, 1165, 2, 999, 500, 984, 1000, 985, 1000, 607, 500, 7151, 2000, 504, 500, 5000, 1000, 607, 500, 608, 500, 985, 500);
+INSERT INTO `mob_db` VALUES (1493, 'DRYAD', 'Dryad', 50, 8791, 0, 2763, 1493, 3, 499, 589, 15, 33, 1, 75, 55, 1, 78, 45, 10, 12, 1, 3, 64, 149, 200, 1152, 1152, 384, 7203, 1000, 7198, 1000, 7197, 1000, 1951, 10, 2269, 100, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1494, 'KIND_OF_BEETLE', 'Kind of Beetle', 34, 1874, 0, 679, 442, 3, 191, 243, 14, 12, 1, 34, 10, 0, 50, 0, 10, 12, 0, 4, 22, 149, 200, 1152, 1152, 384, 7190, 1000, 7202, 1000, 928, 100, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1495, 'STONE_SHOOTER', 'Stone Shooter', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1495, 'STONE_SHOOTER', 'Stone Shooter', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1497, 'WOODEN_GOLEM', 'Wooden Golem', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1498, '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, 133, 200, 1152, 1152, 384, 517, 5000, 513, 5000, 7195, 1000, 7200, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1499, 'WOOTAN_FIGHTER', 'Wootan Fighter', 41, 4457, 0, 1790, 833, 3, 395, 480, 30, 19, 1, 41, 31, 10, 67, 30, 10, 12, 1, 7, 43, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1500, 'PARASITE', 'Parasite', 37, 3090, 0, 1098, 478, 9, 175, 215, 5, 19, 1, 40, 20, 10, 90, 25, 10, 12, 1, 3, 44, 149, 200, 1152, 1152, 384, 7194, 1000, 7186, 1000, 7193, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1500, 'PARASITE', 'Parasite', 37, 3090, 0, 1098, 478, 9, 175, 215, 5, 19, 1, 40, 20, 10, 90, 25, 10, 12, 1, 3, 44, 149, 200, 1152, 1152, 384, 7194, 1000, 7186, 1000, 7193, 1000, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1502, 'FIRE_PORING', 'Fire 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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1503, 'GIBBET', 'Gibbet', 58, 6841, 0, 8011, 1824, 3, 238, 418, 28, 41, 1, 20, 60, 55, 182, 140, 10, 12, 2, 6, 27, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1504, 'DULLAHAN', 'Dullahan', 62, 12437, 0, 8517, 2963, 3, 418, 647, 47, 38, 1, 20, 60, 55, 282, 140, 10, 12, 1, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 2614, 5, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1505, 'LOLI_RURI', 'Loli Ruri', 71, 23470, 0, 16641, 4314, 3, 841, 1476, 39, 44, 1, 20, 60, 55, 132, 140, 10, 12, 2, 6, 82, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1506, 'DISGUISE', 'Disguise', 55, 7543, 0, 3615, 1919, 3, 267, 279, 18, 29, 1, 20, 60, 55, 102, 140, 10, 12, 1, 6, 82, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1507, 'BLOODY_MURDERER', 'Bloody Murderer', 72, 27521, 0, 18742, 3559, 3, 217, 864, 15, 15, 1, 20, 60, 55, 282, 140, 10, 12, 2, 7, 67, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 1305, 15, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1508, 'QUVE', 'Quve', 40, 4559, 0, 792, 247, 3, 170, 299, 12, 10, 1, 20, 60, 55, 102, 140, 10, 12, 0, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1509, 'LUDE', 'Lude', 36, 3214, 0, 814, 306, 3, 164, 287, 14, 12, 1, 20, 60, 55, 122, 140, 10, 12, 0, 1, 29, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1510, 'HYLOZOIST', 'Hylozoist', 40, 7186, 0, 4614, 1297, 3, 181, 317, 16, 51, 1, 20, 60, 55, 82, 140, 10, 12, 0, 1, 27, 149, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1511, 'AMON_RA', 'Amon Ra', 88, 1214138, 0, 87264, 35891, 5, 929, 1647, 26, 52, 1, 1, 90, 124, 74, 45, 10, 12, 2, 7, 62, 181, 200, 1872, 672, 480, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1512, 'HYEGUN', 'Hyegun', 56, 9981, 0, 2199, 1032, 3, 1, 1, 36, 28, 1, 1, 1, 1, 1, 1, 10, 12, 1, 1, 49, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 2614, 5, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1513, 'CIVIL_SERVANT', 'Civil Servant', 62, 14390, 0, 4023, 2750, 3, 1, 1, 20, 70, 1, 1, 1, 1, 1, 1, 10, 12, 1, 2, 44, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1514, 'DANCING_DRAGON', 'Dancing Dragon', 54, 5472, 0, 3030, 769, 3, 1, 1, 55, 52, 1, 1, 1, 1, 1, 1, 10, 12, 1, 9, 44, 131, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1515, 'GARM_BABY', 'Hatii Baby', 1, 1, 0, 1022, 2980, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 12, 1, 2, 41, 133, 300, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 617, 10, 1305, 15, 616, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1516, 'INCREASE_SOIL', 'Increase Soil', 51, 8230, 0, 2760, 2110, 3, 1, 1, 23, 23, 1, 1, 1, 1, 1, 1, 10, 12, 1, 0, 62, 145, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1517, 'LI_ME_MANG_RYANG', 'Li Me Mang Ryang', 48, 5920, 0, 1643, 1643, 3, 1, 1, 19, 17, 1, 1, 1, 1, 1, 1, 10, 12, 1, 6, 62, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1517, 'LI_ME_MANG_RYANG', 'Li Me Mang Ryang', 48, 5920, 0, 1643, 1643, 3, 1, 1, 19, 17, 1, 1, 1, 1, 1, 1, 10, 12, 1, 6, 62, 133, 200, 1152, 1152, 384, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1518, 'Bacsojin', 'Bacsojin', 75, 218652, 0, 33095, 18214, 1, 1219, 2169, 10, 51, 64, 85, 78, 85, 150, 60, 10, 12, 2, 1, 67, 181, 200, 1152, 1152, 480, 1164, 2, 1165, 2, 999, 500, 984, 1000, 985, 1000, 607, 500, 7151, 2000, 504, 500, 5000, 1000, 607, 500, 608, 500, 985, 500);
+INSERT INTO `mob_db` VALUES (1519, 'Chung_E', 'Chung E', 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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1520, 'Boiled_Rice', 'Boiled Rice', 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, 564, 5500, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1900, 'VALARIS', 'Valaris', 99, 668000, 0, 107250, 37895, 2, 3220, 4040, 35, 45, 1, 152, 96, 85, 120, 95, 10, 10, 2, 6, 67, 181, 100, 676, 1152, 768, 1466, 200, 2256, 200, 2607, 800, 714, 500, 617, 3000, 984, 4300, 985, 5600, 4147, 1, 13000, 0, 608, 1000, 750, 400, 923, 3800);
+INSERT INTO `mob_db` VALUES (1901, 'VALARIS_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, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1970, '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, 909, 7000, 1202, 100, 938, 400, 512, 1000, 713, 1500, 741, 5, 619, 20, 4001, 20, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1971, '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, 998, 50, 935, 6500, 909, 1500, 1205, 55, 601, 100, 742, 5, 1002, 150, 4009, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1972, 'SPORE_', 'Spore', 9, 327, 0, 22, 17, 1, 24, 29, 0, 5, 1, 9, 9, 0, 14, 5, 10, 12, 1, 3, 21, 129, 200, 1872, 672, 288, 921, 5000, 507, 800, 510, 50, 743, 5, 2220, 40, 921, 5, 512, 0, 4022, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1973, 'PECOPECO_', 'PecoPeco', 13, 531, 0, 85, 36, 1, 35, 46, 0, 0, 1, 13, 13, 25, 27, 9, 10, 12, 2, 2, 23, 145, 200, 1564, 864, 576, 925, 5500, 2402, 20, 508, 50, 507, 900, 1604, 100, 512, 0, 512, 0, 4031, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1974, 'ORK_WARRIOR_', 'Orc Warrior', 24, 1400, 0, 261, 160, 1, 104, 126, 10, 5, 1, 24, 48, 25, 34, 10, 10, 12, 1, 7, 22, 133, 200, 1864, 864, 288, 998, 210, 931, 5500, 756, 40, 2267, 3, 1352, 10, 1304, 5, 1301, 100, 4066, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1975, 'MUNAK_', 'Munak', 30, 2872, 0, 361, 218, 1, 180, 230, 0, 0, 1, 15, 20, 5, 46, 15, 10, 12, 1, 1, 29, 133, 200, 2468, 768, 288, 901, 5500, 2264, 1, 2404, 15, 609, 20, 2337, 1, 2305, 100, 1558, 5, 4090, 3, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1976, 'ISIS_', 'Isis', 43, 4828, 0, 2396, 993, 1, 423, 507, 10, 35, 38, 65, 43, 30, 72, 15, 10, 12, 2, 6, 27, 149, 200, 1384, 768, 336, 936, 5500, 2233, 5, 2603, 1, 733, 150, 732, 20, 954, 1000, 731, 5, 4116, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1977, '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, 938, 5500, 910, 1500, 511, 500, 514, 200, 729, 5, 512, 0, 512, 0, 4033, 5, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1978, '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, 133, 150, 676, 576, 480, 996, 30, 999, 100, 943, 5500, 912, 1300, 756, 129, 2259, 1, 1226, 2, 4115, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1979, '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, 992, 70, 999, 30, 910, 2400, 935, 3500, 943, 30, 998, 200, 1002, 500, 4042, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1980, '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, 916, 6500, 949, 700, 2302, 150, 507, 550, 519, 300, 715, 50, 512, 0, 4008, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1981, '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, 940, 5000, 909, 5500, 2298, 4, 1402, 80, 520, 10, 752, 5, 703, 3, 4021, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1982, '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, 945, 5500, 919, 5500, 516, 800, 2213, 2, 754, 2, 912, 6, 729, 3, 4044, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1983, '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, 942, 5500, 513, 1500, 508, 100, 919, 5000, 753, 5, 756, 24, 512, 0, 4051, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1984, '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, 990, 60, 940, 6500, 911, 400, 757, 49, 707, 20, 935, 3000, 512, 0, 4057, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1985, '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, 705, 6500, 949, 1000, 2262, 4, 1102, 100, 512, 600, 515, 1100, 622, 20, 4006, 15, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1986, '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, 133, 200, 1672, 672, 288, 7033, 5500, 2221, 20, 511, 550, 510, 50, 972, 30, 921, 1200, 912, 6, 4048, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1987, 'BAPHOMET__', 'Baphomet Jr.', 50, 8578, 0, 2706, 1480, 1, 487, 590, 15, 25, 1, 75, 55, 1, 93, 45, 10, 12, 0, 6, 27, 149, 100, 868, 480, 120, 923, 500, 984, 63, 1464, 2, 607, 50, 610, 100, 503, 300, 2405, 50, 4129, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1988, 'DESERT_WOLF_B_', 'Desert Wolf Puppy', 9, 164, 0, 20, 16, 1, 30, 36, 0, 0, 1, 9, 9, 5, 21, 40, 10, 12, 0, 2, 23, 145, 300, 1600, 900, 240, 1010, 85, 919, 5500, 2306, 60, 517, 600, 2301, 200, 512, 0, 512, 0, 4023, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1989, 'DEVIRUCHI_', 'Deviruchi', 46, 7360, 0, 2662, 1278, 1, 475, 560, 10, 25, 1, 69, 40, 55, 87, 30, 10, 12, 0, 6, 27, 149, 150, 980, 600, 384, 1038, 5500, 1039, 400, 2255, 2, 1458, 2, 1009, 5, 912, 1500, 756, 154, 4122, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1990, '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, 1021, 5500, 757, 112, 1517, 2, 1613, 1, 969, 1, 1501, 300, 1005, 5, 4098, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1991, '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, 909, 7500, 1602, 80, 938, 500, 512, 1100, 713, 1700, 741, 5, 620, 20, 4004, 10, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1992, 'PETIT__', 'Petit', 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, 1035, 5500, 1037, 300, 756, 140, 509, 1000, 1510, 150, 912, 1500, 606, 15, 4118, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1993, '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, 919, 5500, 1302, 100, 517, 500, 1750, 1000, 949, 850, 1010, 80, 627, 20, 4017, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1994, '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, 1020, 5500, 1049, 50, 2277, 1, 2504, 5, 1217, 5, 501, 1000, 512, 0, 4100, 1, 0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO `mob_db` VALUES (1995, 'BON_GUN_', 'Bon Gun', 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, 1094, 5500, 7014, 40, 618, 60, 2337, 2, 609, 15, 508, 1000, 502, 250, 5046, 1, 0, 0, 0, 0, 0, 0, 0, 0);
diff --git a/sql-files/db_tables.sql b/sql-files/db_tables.sql
index 1af1dfc5b..2d202f49a 100644
--- a/sql-files/db_tables.sql
+++ b/sql-files/db_tables.sql
@@ -1,581 +1,581 @@
-# phpMyAdmin SQL Dump
-# version 2.5.6
-# http://www.phpmyadmin.net
-#
-# Host: localhost
-# Generation Time: May 13, 2004 at 11:50 PM
-# Server version: 4.0.18
-# PHP Version: 4.3.6
-#
-# Database : `ragnarok_database`
-#
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `abra_db`
-#
-
-CREATE TABLE `abra_db` (
- `ID` smallint(6) NOT NULL default '0',
- `Dummy` text NOT NULL,
- `Req_Lvl` smallint(6) NOT NULL default '0',
- `Per` smallint(6) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `attr_fix`
-#
-
-CREATE TABLE `attr_fix` (
- `Level` tinyint(4) NOT NULL default '0',
- `None` tinyint(4) NOT NULL default '0',
- `Water` tinyint(4) NOT NULL default '0',
- `Earth` tinyint(4) NOT NULL default '0',
- `Fire` tinyint(4) NOT NULL default '0',
- `Wind` tinyint(4) NOT NULL default '0',
- `Poison` tinyint(4) NOT NULL default '0',
- `Saint` tinyint(4) NOT NULL default '0',
- `Darkness` tinyint(4) NOT NULL default '0',
- `Sense` tinyint(4) NOT NULL default '0',
- `Immortality` tinyint(4) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `cast_db`
-#
-
-CREATE TABLE `cast_db` (
- `ID` smallint(6) NOT NULL default '0',
- `Cast_List` mediumint(9) NOT NULL default '0',
- `Delay_List` text NOT NULL,
- `Upkeep_Time` text NOT NULL,
- `Upkeep_Time2` text NOT NULL,
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `castle_db`
-#
-
-CREATE TABLE `castle_db` (
- `CastleID` tinyint(4) NOT NULL default '0',
- `map_name` text NOT NULL,
- `castle_name` text NOT NULL,
- `switch_flag` tinyint(4) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `create_arrow_db`
-#
-
-CREATE TABLE `create_arrow_db` (
- `SourceID` mediumint(9) NOT NULL default '0',
- `MakeID1` mediumint(9) NOT NULL default '0',
- `MakeNum1` mediumint(9) NOT NULL default '0',
- `MakeID2` mediumint(9) NOT NULL default '0',
- `MakeNum2` mediumint(9) NOT NULL default '0',
- `MakeID3` mediumint(9) NOT NULL default '0',
- `MakeNum3` mediumint(9) NOT NULL default '0',
- `MakeID4` mediumint(9) NOT NULL default '0',
- `MakeNum4` mediumint(9) NOT NULL default '0',
- `MakeID5` mediumint(9) NOT NULL default '0',
- `MakeNum5` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `exp`
-#
-
-CREATE TABLE `exp` (
- `EXP1` bigint(9) NOT NULL default '0',
- `EXP2` bigint(9) NOT NULL default '0',
- `EXP3` bigint(9) NOT NULL default '0',
- `EXP4` bigint(9) NOT NULL default '0',
- `EXP5` bigint(9) NOT NULL default '0',
- `EXP6` bigint(9) NOT NULL default '0',
- `EXP7` bigint(9) NOT NULL default '0',
- `EXP8` bigint(9) NOT NULL default '0',
- `EXP9` bigint(9) NOT NULL default '0',
- `EXP10` bigint(9) NOT NULL default '0',
- `EXP11` bigint(9) NOT NULL default '0',
- `EXP12` bigint(9) NOT NULL default '0',
- `EXP13` bigint(9) NOT NULL default '0',
- `EXP14` bigint(9) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `exp_guild`
-#
-
-CREATE TABLE `exp_guild` (
- `Level` tinyint(4) NOT NULL default '0',
- `EXP` int(11) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_bluebox`
-#
-
-CREATE TABLE `item_bluebox` (
- `NameID` mediumint(9) NOT NULL default '0',
- `item_name` text NOT NULL,
- `rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_cardalbum`
-#
-
-CREATE TABLE `item_cardalbum` (
- `NameID` mediumint(9) NOT NULL default '0',
- `item_name` text NOT NULL,
- `rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_db2`
-#
-
-CREATE TABLE `item_db2` (
- `ID` int(11) NOT NULL auto_increment,
- `Name` text NOT NULL,
- `Name2` text NOT NULL,
- `Type` tinyint(4) NOT NULL default '0',
- `Price` mediumint(11) NOT NULL default '0',
- `Sell` mediumint(11) NOT NULL default '0',
- `Weight` mediumint(11) NOT NULL default '0',
- `ATK` mediumint(11) NOT NULL default '0',
- `DEF` mediumint(11) NOT NULL default '0',
- `Range` mediumint(11) NOT NULL default '0',
- `Slot` mediumint(11) NOT NULL default '0',
- `Job` int(20) NOT NULL default '0',
- `Gender` smallint(11) NOT NULL default '0',
- `Loc` smallint(11) NOT NULL default '0',
- `wLV` mediumint(11) NOT NULL default '0',
- `eLV` mediumint(11) NOT NULL default '0',
- `View` int(11) NOT NULL default '0',
- `UseScript` text NOT NULL,
- `EquipScript` text NOT NULL,
- `Comment` text,
- UNIQUE KEY `ID` (`ID`)
-) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=1 ;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_giftbox`
-#
-
-CREATE TABLE `item_giftbox` (
- `NameID` mediumint(9) NOT NULL default '0',
- `item_name` text NOT NULL,
- `rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_scroll`
-#
-
-CREATE TABLE `item_scroll` (
- `NameID` mediumint(9) NOT NULL default '0',
- `item_name` text NOT NULL,
- `rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `item_violetbox`
-#
-
-CREATE TABLE `item_violetbox` (
- `NameID` mediumint(9) NOT NULL default '0',
- `item_name` text NOT NULL,
- `rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `job_db1`
-#
-
-CREATE TABLE `job_db1` (
- `Class_ID` tinyint(4) NOT NULL default '0',
- `Weight` mediumint(9) NOT NULL default '0',
- `HP` smallint(6) NOT NULL default '0',
- `HP2` smallint(6) NOT NULL default '0',
- `SP` smallint(6) NOT NULL default '0',
- `Empty` smallint(6) NOT NULL default '0',
- `Dagger` smallint(6) NOT NULL default '0',
- `Sword` smallint(6) NOT NULL default '0',
- `Two_Handed_Sword` smallint(6) NOT NULL default '0',
- `Spear` smallint(6) NOT NULL default '0',
- `Two_Handed_Spear` smallint(6) NOT NULL default '0',
- `Axe` smallint(6) NOT NULL default '0',
- `Two_Handed_Axe` smallint(6) NOT NULL default '0',
- `Rod` smallint(6) NOT NULL default '0',
- `Club` smallint(6) NOT NULL default '0',
- `Stick` smallint(6) NOT NULL default '0',
- `Bow` smallint(6) NOT NULL default '0',
- `Fist` smallint(6) NOT NULL default '0',
- `Musical` smallint(6) NOT NULL default '0',
- `Whip` smallint(6) NOT NULL default '0',
- `Book` smallint(6) NOT NULL default '0',
- `Katar` smallint(6) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `mob_boss`
-#
-
-CREATE TABLE `mob_boss` (
- `MobID` mediumint(9) NOT NULL default '0',
- `MobName` text NOT NULL,
- `Rate` int(11) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `mob_branch`
-#
-
-CREATE TABLE `mob_branch` (
- `MobID` mediumint(9) NOT NULL default '0',
- `MobName` text NOT NULL,
- `Rate` int(11) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `mob_db2`
-#
-
-CREATE TABLE `mob_db2` (
- `ID` mediumint(9) NOT NULL default '0',
- `Name` text NOT NULL,
- `Name2` text NOT NULL,
- `LV` smallint(6) NOT NULL default '0',
- `HP` mediumint(9) NOT NULL default '0',
- `SP` mediumint(9) NOT NULL default '0',
- `EXP` mediumint(9) NOT NULL default '0',
- `JEXP` mediumint(9) NOT NULL default '0',
- `Range1` tinyint(4) NOT NULL default '0',
- `ATK1` smallint(6) NOT NULL default '0',
- `ATK2` smallint(6) NOT NULL default '0',
- `DEF` smallint(6) NOT NULL default '0',
- `MDEF` smallint(6) NOT NULL default '0',
- `STR` tinyint(4) NOT NULL default '0',
- `AGI` tinyint(4) NOT NULL default '0',
- `VIT` tinyint(4) NOT NULL default '0',
- `INT` tinyint(4) NOT NULL default '0',
- `DEX` tinyint(4) NOT NULL default '0',
- `LUK` tinyint(4) NOT NULL default '0',
- `Range2` tinyint(4) NOT NULL default '0',
- `Range3` tinyint(4) NOT NULL default '0',
- `Scale` tinyint(4) NOT NULL default '0',
- `Race` tinyint(4) NOT NULL default '0',
- `Element` tinyint(4) NOT NULL default '0',
- `Mode` smallint(6) NOT NULL default '0',
- `Speed` smallint(6) NOT NULL default '0',
- `ADelay` smallint(6) NOT NULL default '0',
- `aMotion` smallint(6) NOT NULL default '0',
- `dMotion` smallint(6) NOT NULL default '0',
- `Drop1id` mediumint(9) NOT NULL default '0',
- `Drop1per` mediumint(9) NOT NULL default '0',
- `Drop2id` mediumint(9) NOT NULL default '0',
- `Drop2per` mediumint(9) NOT NULL default '0',
- `Drop3id` mediumint(9) NOT NULL default '0',
- `Drop3per` mediumint(9) NOT NULL default '0',
- `Drop4id` mediumint(9) NOT NULL default '0',
- `Drop4per` mediumint(9) NOT NULL default '0',
- `Drop5id` mediumint(9) NOT NULL default '0',
- `Drop5per` mediumint(9) NOT NULL default '0',
- `Drop6id` mediumint(9) NOT NULL default '0',
- `Drop6per` mediumint(9) NOT NULL default '0',
- `Drop7d` mediumint(9) NOT NULL default '0',
- `Drop7per` mediumint(9) NOT NULL default '0',
- `Drop8id` mediumint(9) NOT NULL default '0',
- `Drop8per` mediumint(9) NOT NULL default '0',
- `Item1` tinyint(4) NOT NULL default '0',
- `Item2` tinyint(4) NOT NULL default '0',
- `MEXP` mediumint(9) NOT NULL default '0',
- `ExpPer` mediumint(9) NOT NULL default '0',
- `MVP1id` mediumint(9) NOT NULL default '0',
- `MVP1per` mediumint(9) NOT NULL default '0',
- `MVP2id` mediumint(9) NOT NULL default '0',
- `MVP2per` mediumint(9) NOT NULL default '0',
- `MVP3id` mediumint(9) NOT NULL default '0',
- `MVP3per` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `mob_poring`
-#
-
-CREATE TABLE `mob_poring` (
- `MobID` smallint(6) NOT NULL default '0',
- `MobName` text NOT NULL,
- `Rate` mediumint(9) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `mob_skill_db`
-#
-
-CREATE TABLE `mob_skill_db` (
- `Mob_ID` smallint(6) NOT NULL default '0',
- `Dummy` text NOT NULL,
- `State` text NOT NULL,
- `Skill_ID` smallint(6) NOT NULL default '0',
- `Skill_LV` tinyint(4) NOT NULL default '0',
- `Use_Rate` smallint(6) NOT NULL default '0',
- `Cast_Time` smallint(6) NOT NULL default '0',
- `Delay` smallint(6) NOT NULL default '0',
- `Disturbance` text NOT NULL,
- `Target` text NOT NULL,
- `Condition_Type` text NOT NULL,
- `Condition_Value` smallint(6) NOT NULL default '0',
- `Value1` mediumint(9) NOT NULL default '0',
- `Value2` mediumint(9) NOT NULL default '0',
- `Value3` mediumint(9) NOT NULL default '0',
- `Value4` mediumint(9) NOT NULL default '0',
- `Value5` mediumint(9) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `pet_db`
-#
-
-CREATE TABLE `pet_db` (
- `MobID` smallint(6) NOT NULL default '0',
- `Name` text NOT NULL,
- `JName` text NOT NULL,
- `ItemID` smallint(6) NOT NULL default '0',
- `EggID` smallint(6) NOT NULL default '0',
- `AcceID` smallint(6) NOT NULL default '0',
- `FoodID` smallint(6) NOT NULL default '0',
- `Fullness` smallint(6) NOT NULL default '0',
- `HungryDeray` smallint(6) NOT NULL default '0',
- `R_Hungry` smallint(6) NOT NULL default '0',
- `R_Full` smallint(6) NOT NULL default '0',
- `Intimate` smallint(6) NOT NULL default '0',
- `Die` smallint(6) NOT NULL default '0',
- `Capture` smallint(6) NOT NULL default '0',
- `Speed` smallint(6) NOT NULL default '0',
- `S_Performance` smallint(6) NOT NULL default '0',
- `Talk_Convert_Class` smallint(6) NOT NULL default '0',
- `Attack_Rate` smallint(6) NOT NULL default '0',
- `Defence_Attack_Rate` smallint(6) NOT NULL default '0',
- `Change_Target_Rate` smallint(6) NOT NULL default '0',
- `Pet_Script` text NOT NULL,
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `produce_db`
-#
-
-CREATE TABLE `produce_db` (
- `ID` smallint(6) NOT NULL default '0',
- `ItemLV` tinyint(4) NOT NULL default '0',
- `RequireSkill` smallint(6) NOT NULL default '0',
- `MaterialID1` smallint(6) NOT NULL default '0',
- `MaterialAmount1` smallint(6) NOT NULL default '0',
- `MaterialID2` smallint(6) NOT NULL default '0',
- `MaterialAmount2` smallint(6) NOT NULL default '0',
- `MaterialID3` smallint(6) NOT NULL default '0',
- `MaterialAmount3` smallint(6) NOT NULL default '0',
- `MaterialID4` smallint(6) NOT NULL default '0',
- `MaterialAmount4` smallint(6) NOT NULL default '0',
- `MaterialID5` smallint(6) NOT NULL default '0',
- `MaterialAmount5` smallint(6) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `refine_db`
-#
-
-CREATE TABLE `refine_db` (
- `Refine_Bonus` tinyint(4) NOT NULL default '0',
- `Danger_Bonus` tinyint(4) NOT NULL default '0',
- `Safe_Limit` tinyint(4) NOT NULL default '0',
- `RefineChance1` tinyint(4) NOT NULL default '0',
- `RefineChance2` tinyint(4) NOT NULL default '0',
- `RefineChance3` tinyint(4) NOT NULL default '0',
- `RefineChance4` tinyint(4) NOT NULL default '0',
- `RefineChance5` tinyint(4) NOT NULL default '0',
- `RefineChance6` tinyint(4) NOT NULL default '0',
- `RefineChance7` tinyint(4) NOT NULL default '0',
- `RefineChance8` tinyint(4) NOT NULL default '0',
- `RefineChance9` tinyint(4) NOT NULL default '0',
- `RefineChance10` tinyint(4) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `size_fix`
-#
-
-CREATE TABLE `size_fix` (
- `Element` tinyint(4) NOT NULL default '0',
- `Dagger` tinyint(4) NOT NULL default '0',
- `Sword` tinyint(4) NOT NULL default '0',
- `Two_Handed_Sword` tinyint(4) NOT NULL default '0',
- `Spear` tinyint(4) NOT NULL default '0',
- `Two_Handed_Spear` tinyint(4) NOT NULL default '0',
- `Axe` tinyint(4) NOT NULL default '0',
- `Two_Handed_Axe` tinyint(4) NOT NULL default '0',
- `Club` tinyint(4) NOT NULL default '0',
- `Whip` tinyint(4) NOT NULL default '0',
- `Stick` tinyint(4) NOT NULL default '0',
- `Bow` tinyint(4) NOT NULL default '0',
- `Fist` tinyint(4) NOT NULL default '0',
- `Musical` tinyint(4) NOT NULL default '0',
- `Rod` tinyint(4) NOT NULL default '0',
- `Book` tinyint(4) NOT NULL default '0',
- `Katar` tinyint(4) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `skill_db`
-#
-
-CREATE TABLE `skill_db` (
- `ID` smallint(6) NOT NULL default '0',
- `Range` smallint(6) NOT NULL default '0',
- `Hit` smallint(6) NOT NULL default '0',
- `inf` smallint(6) NOT NULL default '0',
- `nk` smallint(6) NOT NULL default '0',
- `max` smallint(6) NOT NULL default '0',
- `list_num` smallint(6) NOT NULL default '0',
- `castcancel` text NOT NULL,
- `cast_defence_rate` smallint(6) NOT NULL default '0',
- `inf2` smallint(6) NOT NULL default '0',
- `maxcount` smallint(6) NOT NULL default '0',
- `skill_type` text NOT NULL,
- `blow_count` smallint(6) NOT NULL default '0',
- `Comment` text
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `skill_require_db`
-#
-
-CREATE TABLE `skill_require_db` (
- `ID` smallint(6) NOT NULL default '0',
- `List_HP` text NOT NULL,
- `List_SP` text NOT NULL,
- `List_HP_Rate` text NOT NULL,
- `List_SP_Rate` text NOT NULL,
- `List_Zeny` text NOT NULL,
- `List_Weapon` text NOT NULL,
- `State` text NOT NULL,
- `Spiritball` tinyint(4) NOT NULL default '0',
- `ItemID1` mediumint(9) NOT NULL default '0',
- `Amount1` tinyint(4) NOT NULL default '0',
- `ItemID2` mediumint(9) NOT NULL default '0',
- `Amount2` tinyint(4) NOT NULL default '0',
- `ItemID3` mediumint(9) NOT NULL default '0',
- `Amount3` tinyint(4) NOT NULL default '0',
- `ItemID4` mediumint(9) NOT NULL default '0',
- `Amount4` tinyint(4) NOT NULL default '0',
- `ItemID5` mediumint(9) NOT NULL default '0',
- `Amount5` tinyint(4) NOT NULL default '0',
- `ItemID6` mediumint(9) NOT NULL default '0',
- `Amount6` tinyint(4) NOT NULL default '0',
- `ItemID7` mediumint(9) NOT NULL default '0',
- `Amount7` tinyint(4) NOT NULL default '0',
- `ItemID8` mediumint(9) NOT NULL default '0',
- `Amount8` tinyint(4) NOT NULL default '0',
- `ItemID9` mediumint(9) NOT NULL default '0',
- `Amount9` tinyint(4) NOT NULL default '0',
- `ItemID10` mediumint(9) NOT NULL default '0',
- `Amount10` tinyint(4) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
-
-# --------------------------------------------------------
-
-#
-# Table structure for table `skill_tree`
-#
-
-CREATE TABLE `skill_tree` (
- `Upper` tinyint(4) NOT NULL default '0',
- `JobNo` tinyint(4) NOT NULL default '0',
- `Skill_ID` smallint(6) NOT NULL default '0',
- `MaxLV` tinyint(4) NOT NULL default '0',
- `Skill_ID_Require1` smallint(6) NOT NULL default '0',
- `Skill_LV_Require1` tinyint(4) NOT NULL default '0',
- `Skill_ID_Require2` smallint(6) NOT NULL default '0',
- `Skill_LV_Require2` tinyint(4) NOT NULL default '0',
- `Skill_ID_Require3` smallint(6) NOT NULL default '0',
- `Skill_LV_Require3` tinyint(4) NOT NULL default '0',
- `Skill_ID_Require4` smallint(6) NOT NULL default '0',
- `Skill_LV_Require4` tinyint(4) NOT NULL default '0',
- `Skill_ID_Require5` smallint(6) NOT NULL default '0',
- `Skill_LV_Require5` tinyint(4) NOT NULL default '0',
- `Comment` text NOT NULL
-) TYPE=MyISAM;
+# phpMyAdmin SQL Dump
+# version 2.5.6
+# http://www.phpmyadmin.net
+#
+# Host: localhost
+# Generation Time: May 13, 2004 at 11:50 PM
+# Server version: 4.0.18
+# PHP Version: 4.3.6
+#
+# Database : `ragnarok_database`
+#
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `abra_db`
+#
+
+CREATE TABLE `abra_db` (
+ `ID` smallint(6) NOT NULL default '0',
+ `Dummy` text NOT NULL,
+ `Req_Lvl` smallint(6) NOT NULL default '0',
+ `Per` smallint(6) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `attr_fix`
+#
+
+CREATE TABLE `attr_fix` (
+ `Level` tinyint(4) NOT NULL default '0',
+ `None` tinyint(4) NOT NULL default '0',
+ `Water` tinyint(4) NOT NULL default '0',
+ `Earth` tinyint(4) NOT NULL default '0',
+ `Fire` tinyint(4) NOT NULL default '0',
+ `Wind` tinyint(4) NOT NULL default '0',
+ `Poison` tinyint(4) NOT NULL default '0',
+ `Saint` tinyint(4) NOT NULL default '0',
+ `Darkness` tinyint(4) NOT NULL default '0',
+ `Sense` tinyint(4) NOT NULL default '0',
+ `Immortality` tinyint(4) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `cast_db`
+#
+
+CREATE TABLE `cast_db` (
+ `ID` smallint(6) NOT NULL default '0',
+ `Cast_List` mediumint(9) NOT NULL default '0',
+ `Delay_List` text NOT NULL,
+ `Upkeep_Time` text NOT NULL,
+ `Upkeep_Time2` text NOT NULL,
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `castle_db`
+#
+
+CREATE TABLE `castle_db` (
+ `CastleID` tinyint(4) NOT NULL default '0',
+ `map_name` text NOT NULL,
+ `castle_name` text NOT NULL,
+ `switch_flag` tinyint(4) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `create_arrow_db`
+#
+
+CREATE TABLE `create_arrow_db` (
+ `SourceID` mediumint(9) NOT NULL default '0',
+ `MakeID1` mediumint(9) NOT NULL default '0',
+ `MakeNum1` mediumint(9) NOT NULL default '0',
+ `MakeID2` mediumint(9) NOT NULL default '0',
+ `MakeNum2` mediumint(9) NOT NULL default '0',
+ `MakeID3` mediumint(9) NOT NULL default '0',
+ `MakeNum3` mediumint(9) NOT NULL default '0',
+ `MakeID4` mediumint(9) NOT NULL default '0',
+ `MakeNum4` mediumint(9) NOT NULL default '0',
+ `MakeID5` mediumint(9) NOT NULL default '0',
+ `MakeNum5` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `exp`
+#
+
+CREATE TABLE `exp` (
+ `EXP1` bigint(9) NOT NULL default '0',
+ `EXP2` bigint(9) NOT NULL default '0',
+ `EXP3` bigint(9) NOT NULL default '0',
+ `EXP4` bigint(9) NOT NULL default '0',
+ `EXP5` bigint(9) NOT NULL default '0',
+ `EXP6` bigint(9) NOT NULL default '0',
+ `EXP7` bigint(9) NOT NULL default '0',
+ `EXP8` bigint(9) NOT NULL default '0',
+ `EXP9` bigint(9) NOT NULL default '0',
+ `EXP10` bigint(9) NOT NULL default '0',
+ `EXP11` bigint(9) NOT NULL default '0',
+ `EXP12` bigint(9) NOT NULL default '0',
+ `EXP13` bigint(9) NOT NULL default '0',
+ `EXP14` bigint(9) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `exp_guild`
+#
+
+CREATE TABLE `exp_guild` (
+ `Level` tinyint(4) NOT NULL default '0',
+ `EXP` int(11) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_bluebox`
+#
+
+CREATE TABLE `item_bluebox` (
+ `NameID` mediumint(9) NOT NULL default '0',
+ `item_name` text NOT NULL,
+ `rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_cardalbum`
+#
+
+CREATE TABLE `item_cardalbum` (
+ `NameID` mediumint(9) NOT NULL default '0',
+ `item_name` text NOT NULL,
+ `rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_db2`
+#
+
+CREATE TABLE `item_db2` (
+ `ID` int(11) NOT NULL auto_increment,
+ `Name` text NOT NULL,
+ `Name2` text NOT NULL,
+ `Type` tinyint(4) NOT NULL default '0',
+ `Price` mediumint(11) NOT NULL default '0',
+ `Sell` mediumint(11) NOT NULL default '0',
+ `Weight` mediumint(11) NOT NULL default '0',
+ `ATK` mediumint(11) NOT NULL default '0',
+ `DEF` mediumint(11) NOT NULL default '0',
+ `Range` mediumint(11) NOT NULL default '0',
+ `Slot` mediumint(11) NOT NULL default '0',
+ `Job` int(20) NOT NULL default '0',
+ `Gender` smallint(11) NOT NULL default '0',
+ `Loc` smallint(11) NOT NULL default '0',
+ `wLV` mediumint(11) NOT NULL default '0',
+ `eLV` mediumint(11) NOT NULL default '0',
+ `View` int(11) NOT NULL default '0',
+ `UseScript` text NOT NULL,
+ `EquipScript` text NOT NULL,
+ `Comment` text,
+ UNIQUE KEY `ID` (`ID`)
+) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=1 ;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_giftbox`
+#
+
+CREATE TABLE `item_giftbox` (
+ `NameID` mediumint(9) NOT NULL default '0',
+ `item_name` text NOT NULL,
+ `rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_scroll`
+#
+
+CREATE TABLE `item_scroll` (
+ `NameID` mediumint(9) NOT NULL default '0',
+ `item_name` text NOT NULL,
+ `rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `item_violetbox`
+#
+
+CREATE TABLE `item_violetbox` (
+ `NameID` mediumint(9) NOT NULL default '0',
+ `item_name` text NOT NULL,
+ `rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `job_db1`
+#
+
+CREATE TABLE `job_db1` (
+ `Class_ID` tinyint(4) NOT NULL default '0',
+ `Weight` mediumint(9) NOT NULL default '0',
+ `HP` smallint(6) NOT NULL default '0',
+ `HP2` smallint(6) NOT NULL default '0',
+ `SP` smallint(6) NOT NULL default '0',
+ `Empty` smallint(6) NOT NULL default '0',
+ `Dagger` smallint(6) NOT NULL default '0',
+ `Sword` smallint(6) NOT NULL default '0',
+ `Two_Handed_Sword` smallint(6) NOT NULL default '0',
+ `Spear` smallint(6) NOT NULL default '0',
+ `Two_Handed_Spear` smallint(6) NOT NULL default '0',
+ `Axe` smallint(6) NOT NULL default '0',
+ `Two_Handed_Axe` smallint(6) NOT NULL default '0',
+ `Rod` smallint(6) NOT NULL default '0',
+ `Club` smallint(6) NOT NULL default '0',
+ `Stick` smallint(6) NOT NULL default '0',
+ `Bow` smallint(6) NOT NULL default '0',
+ `Fist` smallint(6) NOT NULL default '0',
+ `Musical` smallint(6) NOT NULL default '0',
+ `Whip` smallint(6) NOT NULL default '0',
+ `Book` smallint(6) NOT NULL default '0',
+ `Katar` smallint(6) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `mob_boss`
+#
+
+CREATE TABLE `mob_boss` (
+ `MobID` mediumint(9) NOT NULL default '0',
+ `MobName` text NOT NULL,
+ `Rate` int(11) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `mob_branch`
+#
+
+CREATE TABLE `mob_branch` (
+ `MobID` mediumint(9) NOT NULL default '0',
+ `MobName` text NOT NULL,
+ `Rate` int(11) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `mob_db2`
+#
+
+CREATE TABLE `mob_db2` (
+ `ID` mediumint(9) NOT NULL default '0',
+ `Name` text NOT NULL,
+ `Name2` text NOT NULL,
+ `LV` smallint(6) NOT NULL default '0',
+ `HP` mediumint(9) NOT NULL default '0',
+ `SP` mediumint(9) NOT NULL default '0',
+ `EXP` mediumint(9) NOT NULL default '0',
+ `JEXP` mediumint(9) NOT NULL default '0',
+ `Range1` tinyint(4) NOT NULL default '0',
+ `ATK1` smallint(6) NOT NULL default '0',
+ `ATK2` smallint(6) NOT NULL default '0',
+ `DEF` smallint(6) NOT NULL default '0',
+ `MDEF` smallint(6) NOT NULL default '0',
+ `STR` tinyint(4) NOT NULL default '0',
+ `AGI` tinyint(4) NOT NULL default '0',
+ `VIT` tinyint(4) NOT NULL default '0',
+ `INT` tinyint(4) NOT NULL default '0',
+ `DEX` tinyint(4) NOT NULL default '0',
+ `LUK` tinyint(4) NOT NULL default '0',
+ `Range2` tinyint(4) NOT NULL default '0',
+ `Range3` tinyint(4) NOT NULL default '0',
+ `Scale` tinyint(4) NOT NULL default '0',
+ `Race` tinyint(4) NOT NULL default '0',
+ `Element` tinyint(4) NOT NULL default '0',
+ `Mode` smallint(6) NOT NULL default '0',
+ `Speed` smallint(6) NOT NULL default '0',
+ `ADelay` smallint(6) NOT NULL default '0',
+ `aMotion` smallint(6) NOT NULL default '0',
+ `dMotion` smallint(6) NOT NULL default '0',
+ `Drop1id` mediumint(9) NOT NULL default '0',
+ `Drop1per` mediumint(9) NOT NULL default '0',
+ `Drop2id` mediumint(9) NOT NULL default '0',
+ `Drop2per` mediumint(9) NOT NULL default '0',
+ `Drop3id` mediumint(9) NOT NULL default '0',
+ `Drop3per` mediumint(9) NOT NULL default '0',
+ `Drop4id` mediumint(9) NOT NULL default '0',
+ `Drop4per` mediumint(9) NOT NULL default '0',
+ `Drop5id` mediumint(9) NOT NULL default '0',
+ `Drop5per` mediumint(9) NOT NULL default '0',
+ `Drop6id` mediumint(9) NOT NULL default '0',
+ `Drop6per` mediumint(9) NOT NULL default '0',
+ `Drop7d` mediumint(9) NOT NULL default '0',
+ `Drop7per` mediumint(9) NOT NULL default '0',
+ `Drop8id` mediumint(9) NOT NULL default '0',
+ `Drop8per` mediumint(9) NOT NULL default '0',
+ `Item1` tinyint(4) NOT NULL default '0',
+ `Item2` tinyint(4) NOT NULL default '0',
+ `MEXP` mediumint(9) NOT NULL default '0',
+ `ExpPer` mediumint(9) NOT NULL default '0',
+ `MVP1id` mediumint(9) NOT NULL default '0',
+ `MVP1per` mediumint(9) NOT NULL default '0',
+ `MVP2id` mediumint(9) NOT NULL default '0',
+ `MVP2per` mediumint(9) NOT NULL default '0',
+ `MVP3id` mediumint(9) NOT NULL default '0',
+ `MVP3per` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `mob_poring`
+#
+
+CREATE TABLE `mob_poring` (
+ `MobID` smallint(6) NOT NULL default '0',
+ `MobName` text NOT NULL,
+ `Rate` mediumint(9) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `mob_skill_db`
+#
+
+CREATE TABLE `mob_skill_db` (
+ `Mob_ID` smallint(6) NOT NULL default '0',
+ `Dummy` text NOT NULL,
+ `State` text NOT NULL,
+ `Skill_ID` smallint(6) NOT NULL default '0',
+ `Skill_LV` tinyint(4) NOT NULL default '0',
+ `Use_Rate` smallint(6) NOT NULL default '0',
+ `Cast_Time` smallint(6) NOT NULL default '0',
+ `Delay` smallint(6) NOT NULL default '0',
+ `Disturbance` text NOT NULL,
+ `Target` text NOT NULL,
+ `Condition_Type` text NOT NULL,
+ `Condition_Value` smallint(6) NOT NULL default '0',
+ `Value1` mediumint(9) NOT NULL default '0',
+ `Value2` mediumint(9) NOT NULL default '0',
+ `Value3` mediumint(9) NOT NULL default '0',
+ `Value4` mediumint(9) NOT NULL default '0',
+ `Value5` mediumint(9) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `pet_db`
+#
+
+CREATE TABLE `pet_db` (
+ `MobID` smallint(6) NOT NULL default '0',
+ `Name` text NOT NULL,
+ `JName` text NOT NULL,
+ `ItemID` smallint(6) NOT NULL default '0',
+ `EggID` smallint(6) NOT NULL default '0',
+ `AcceID` smallint(6) NOT NULL default '0',
+ `FoodID` smallint(6) NOT NULL default '0',
+ `Fullness` smallint(6) NOT NULL default '0',
+ `HungryDeray` smallint(6) NOT NULL default '0',
+ `R_Hungry` smallint(6) NOT NULL default '0',
+ `R_Full` smallint(6) NOT NULL default '0',
+ `Intimate` smallint(6) NOT NULL default '0',
+ `Die` smallint(6) NOT NULL default '0',
+ `Capture` smallint(6) NOT NULL default '0',
+ `Speed` smallint(6) NOT NULL default '0',
+ `S_Performance` smallint(6) NOT NULL default '0',
+ `Talk_Convert_Class` smallint(6) NOT NULL default '0',
+ `Attack_Rate` smallint(6) NOT NULL default '0',
+ `Defence_Attack_Rate` smallint(6) NOT NULL default '0',
+ `Change_Target_Rate` smallint(6) NOT NULL default '0',
+ `Pet_Script` text NOT NULL,
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `produce_db`
+#
+
+CREATE TABLE `produce_db` (
+ `ID` smallint(6) NOT NULL default '0',
+ `ItemLV` tinyint(4) NOT NULL default '0',
+ `RequireSkill` smallint(6) NOT NULL default '0',
+ `MaterialID1` smallint(6) NOT NULL default '0',
+ `MaterialAmount1` smallint(6) NOT NULL default '0',
+ `MaterialID2` smallint(6) NOT NULL default '0',
+ `MaterialAmount2` smallint(6) NOT NULL default '0',
+ `MaterialID3` smallint(6) NOT NULL default '0',
+ `MaterialAmount3` smallint(6) NOT NULL default '0',
+ `MaterialID4` smallint(6) NOT NULL default '0',
+ `MaterialAmount4` smallint(6) NOT NULL default '0',
+ `MaterialID5` smallint(6) NOT NULL default '0',
+ `MaterialAmount5` smallint(6) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `refine_db`
+#
+
+CREATE TABLE `refine_db` (
+ `Refine_Bonus` tinyint(4) NOT NULL default '0',
+ `Danger_Bonus` tinyint(4) NOT NULL default '0',
+ `Safe_Limit` tinyint(4) NOT NULL default '0',
+ `RefineChance1` tinyint(4) NOT NULL default '0',
+ `RefineChance2` tinyint(4) NOT NULL default '0',
+ `RefineChance3` tinyint(4) NOT NULL default '0',
+ `RefineChance4` tinyint(4) NOT NULL default '0',
+ `RefineChance5` tinyint(4) NOT NULL default '0',
+ `RefineChance6` tinyint(4) NOT NULL default '0',
+ `RefineChance7` tinyint(4) NOT NULL default '0',
+ `RefineChance8` tinyint(4) NOT NULL default '0',
+ `RefineChance9` tinyint(4) NOT NULL default '0',
+ `RefineChance10` tinyint(4) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `size_fix`
+#
+
+CREATE TABLE `size_fix` (
+ `Element` tinyint(4) NOT NULL default '0',
+ `Dagger` tinyint(4) NOT NULL default '0',
+ `Sword` tinyint(4) NOT NULL default '0',
+ `Two_Handed_Sword` tinyint(4) NOT NULL default '0',
+ `Spear` tinyint(4) NOT NULL default '0',
+ `Two_Handed_Spear` tinyint(4) NOT NULL default '0',
+ `Axe` tinyint(4) NOT NULL default '0',
+ `Two_Handed_Axe` tinyint(4) NOT NULL default '0',
+ `Club` tinyint(4) NOT NULL default '0',
+ `Whip` tinyint(4) NOT NULL default '0',
+ `Stick` tinyint(4) NOT NULL default '0',
+ `Bow` tinyint(4) NOT NULL default '0',
+ `Fist` tinyint(4) NOT NULL default '0',
+ `Musical` tinyint(4) NOT NULL default '0',
+ `Rod` tinyint(4) NOT NULL default '0',
+ `Book` tinyint(4) NOT NULL default '0',
+ `Katar` tinyint(4) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `skill_db`
+#
+
+CREATE TABLE `skill_db` (
+ `ID` smallint(6) NOT NULL default '0',
+ `Range` smallint(6) NOT NULL default '0',
+ `Hit` smallint(6) NOT NULL default '0',
+ `inf` smallint(6) NOT NULL default '0',
+ `nk` smallint(6) NOT NULL default '0',
+ `max` smallint(6) NOT NULL default '0',
+ `list_num` smallint(6) NOT NULL default '0',
+ `castcancel` text NOT NULL,
+ `cast_defence_rate` smallint(6) NOT NULL default '0',
+ `inf2` smallint(6) NOT NULL default '0',
+ `maxcount` smallint(6) NOT NULL default '0',
+ `skill_type` text NOT NULL,
+ `blow_count` smallint(6) NOT NULL default '0',
+ `Comment` text
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `skill_require_db`
+#
+
+CREATE TABLE `skill_require_db` (
+ `ID` smallint(6) NOT NULL default '0',
+ `List_HP` text NOT NULL,
+ `List_SP` text NOT NULL,
+ `List_HP_Rate` text NOT NULL,
+ `List_SP_Rate` text NOT NULL,
+ `List_Zeny` text NOT NULL,
+ `List_Weapon` text NOT NULL,
+ `State` text NOT NULL,
+ `Spiritball` tinyint(4) NOT NULL default '0',
+ `ItemID1` mediumint(9) NOT NULL default '0',
+ `Amount1` tinyint(4) NOT NULL default '0',
+ `ItemID2` mediumint(9) NOT NULL default '0',
+ `Amount2` tinyint(4) NOT NULL default '0',
+ `ItemID3` mediumint(9) NOT NULL default '0',
+ `Amount3` tinyint(4) NOT NULL default '0',
+ `ItemID4` mediumint(9) NOT NULL default '0',
+ `Amount4` tinyint(4) NOT NULL default '0',
+ `ItemID5` mediumint(9) NOT NULL default '0',
+ `Amount5` tinyint(4) NOT NULL default '0',
+ `ItemID6` mediumint(9) NOT NULL default '0',
+ `Amount6` tinyint(4) NOT NULL default '0',
+ `ItemID7` mediumint(9) NOT NULL default '0',
+ `Amount7` tinyint(4) NOT NULL default '0',
+ `ItemID8` mediumint(9) NOT NULL default '0',
+ `Amount8` tinyint(4) NOT NULL default '0',
+ `ItemID9` mediumint(9) NOT NULL default '0',
+ `Amount9` tinyint(4) NOT NULL default '0',
+ `ItemID10` mediumint(9) NOT NULL default '0',
+ `Amount10` tinyint(4) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
+
+# --------------------------------------------------------
+
+#
+# Table structure for table `skill_tree`
+#
+
+CREATE TABLE `skill_tree` (
+ `Upper` tinyint(4) NOT NULL default '0',
+ `JobNo` tinyint(4) NOT NULL default '0',
+ `Skill_ID` smallint(6) NOT NULL default '0',
+ `MaxLV` tinyint(4) NOT NULL default '0',
+ `Skill_ID_Require1` smallint(6) NOT NULL default '0',
+ `Skill_LV_Require1` tinyint(4) NOT NULL default '0',
+ `Skill_ID_Require2` smallint(6) NOT NULL default '0',
+ `Skill_LV_Require2` tinyint(4) NOT NULL default '0',
+ `Skill_ID_Require3` smallint(6) NOT NULL default '0',
+ `Skill_LV_Require3` tinyint(4) NOT NULL default '0',
+ `Skill_ID_Require4` smallint(6) NOT NULL default '0',
+ `Skill_LV_Require4` tinyint(4) NOT NULL default '0',
+ `Skill_ID_Require5` smallint(6) NOT NULL default '0',
+ `Skill_LV_Require5` tinyint(4) NOT NULL default '0',
+ `Comment` text NOT NULL
+) TYPE=MyISAM;
\ No newline at end of file
diff --git a/sql-files/logs.sql b/sql-files/logs.sql
index 3cd854dd8..b52951aa6 100644
--- a/sql-files/logs.sql
+++ b/sql-files/logs.sql
@@ -1,141 +1,141 @@
-#Database: log
-#Table: branchlog
-CREATE TABLE `branchlog` (
- `branch_id` mediumint(9) unsigned NOT NULL auto_increment,
- `branch_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `char_name` varchar(30) NOT NULL default '',
- `map` varchar(20) NOT NULL default '',
- PRIMARY KEY (`branch_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: droplog
-CREATE TABLE `droplog` (
- `drop_id` mediumint(9) unsigned NOT NULL auto_increment,
- `drop_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `kill_char_id` int(11) NOT NULL default '0',
- `monster_id` smallint(6) NOT NULL default '0',
- `item1` int(11) NOT NULL default '0',
- `item2` int(11) NOT NULL default '0',
- `item3` int(11) NOT NULL default '0',
- `item4` int(11) NOT NULL default '0',
- `item5` int(11) NOT NULL default '0',
- `item6` int(11) NOT NULL default '0',
- `item7` int(11) NOT NULL default '0',
- `item8` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- PRIMARY KEY (`drop_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: mvplog
-CREATE TABLE `mvplog` (
- `mvp_id` mediumint(9) unsigned NOT NULL auto_increment,
- `mvp_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `kill_char_id` int(11) NOT NULL default '0',
- `monster_id` smallint(6) NOT NULL default '0',
- `prize` int(11) NOT NULL default '0',
- `mvpexp` mediumint(9) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- PRIMARY KEY (`mvp_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-
-#Database: log
-#Table: presentlog
-CREATE TABLE `presentlog` (
- `present_id` mediumint(9) unsigned NOT NULL auto_increment,
- `present_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `src_id` tinyint(1) NOT NULL default '0',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `char_name` varchar(30) NOT NULL default '',
- `nameid` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- PRIMARY KEY (`present_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: producelog
-CREATE TABLE `producelog` (
- `produce_id` mediumint(9) unsigned NOT NULL auto_increment,
- `produce_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `char_name` varchar(30) NOT NULL default '',
- `nameid` int(11) NOT NULL default '0',
- `slot1` int(11) NOT NULL default '0',
- `slot2` int(11) NOT NULL default '0',
- `slot3` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- `success` tinyint(1) NOT NULL default '0',
- PRIMARY KEY (`produce_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: refinelog
-CREATE TABLE `refinelog` (
- `refine_id` mediumint(9) unsigned NOT NULL auto_increment,
- `refine_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `char_name` varchar(30) NOT NULL default '',
- `nameid` int(11) NOT NULL default '0',
- `refine` tinyint(2) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- `success` tinyint(1) NOT NULL default '0',
- `item_level` tinyint(2) NOT NULL default '0',
- PRIMARY KEY (`refine_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: tradelog
-CREATE TABLE `tradelog` (
- `trade_id` mediumint(9) unsigned NOT NULL auto_increment,
- `trade_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `src_account_id` int(11) NOT NULL default '0',
- `src_char_id` int(11) NOT NULL default '0',
- `src_char_name` varchar(30) NOT NULL default '',
- `des_account_id` int(11) NOT NULL default '0',
- `des_char_id` int(11) NOT NULL default '0',
- `des_char_name` varchar(30) NOT NULL default '',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `refine` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- `zeny` int(11) NOT NULL default '0',
- PRIMARY KEY (`trade_id`)
-) TYPE=MyISAM AUTO_INCREMENT=1 ;
-
-#Database: log
-#Table: vendlog
-CREATE TABLE `vendlog` (
- `vend_id` mediumint(9) unsigned NOT NULL auto_increment,
- `vend_date` datetime NOT NULL default '0000-00-00 00:00:00',
- `vend_account_id` int(11) NOT NULL default '0',
- `vend_char_id` int(11) NOT NULL default '0',
- `vend_char_name` varchar(30) NOT NULL default '',
- `buy_account_id` int(11) NOT NULL default '0',
- `buy_char_id` int(11) NOT NULL default '0',
- `buy_char_name` varchar(30) NOT NULL default '',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `refine` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `map` varchar(20) NOT NULL default '',
- `zeny` int(11) NOT NULL default '0',
- KEY `vend_id` (`vend_id`)
+#Database: log
+#Table: branchlog
+CREATE TABLE `branchlog` (
+ `branch_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `branch_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `char_name` varchar(30) NOT NULL default '',
+ `map` varchar(20) NOT NULL default '',
+ PRIMARY KEY (`branch_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: droplog
+CREATE TABLE `droplog` (
+ `drop_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `drop_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `kill_char_id` int(11) NOT NULL default '0',
+ `monster_id` smallint(6) NOT NULL default '0',
+ `item1` int(11) NOT NULL default '0',
+ `item2` int(11) NOT NULL default '0',
+ `item3` int(11) NOT NULL default '0',
+ `item4` int(11) NOT NULL default '0',
+ `item5` int(11) NOT NULL default '0',
+ `item6` int(11) NOT NULL default '0',
+ `item7` int(11) NOT NULL default '0',
+ `item8` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ PRIMARY KEY (`drop_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: mvplog
+CREATE TABLE `mvplog` (
+ `mvp_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `mvp_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `kill_char_id` int(11) NOT NULL default '0',
+ `monster_id` smallint(6) NOT NULL default '0',
+ `prize` int(11) NOT NULL default '0',
+ `mvpexp` mediumint(9) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ PRIMARY KEY (`mvp_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+
+#Database: log
+#Table: presentlog
+CREATE TABLE `presentlog` (
+ `present_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `present_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `src_id` tinyint(1) NOT NULL default '0',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `char_name` varchar(30) NOT NULL default '',
+ `nameid` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ PRIMARY KEY (`present_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: producelog
+CREATE TABLE `producelog` (
+ `produce_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `produce_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `char_name` varchar(30) NOT NULL default '',
+ `nameid` int(11) NOT NULL default '0',
+ `slot1` int(11) NOT NULL default '0',
+ `slot2` int(11) NOT NULL default '0',
+ `slot3` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ `success` tinyint(1) NOT NULL default '0',
+ PRIMARY KEY (`produce_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: refinelog
+CREATE TABLE `refinelog` (
+ `refine_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `refine_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `char_name` varchar(30) NOT NULL default '',
+ `nameid` int(11) NOT NULL default '0',
+ `refine` tinyint(2) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ `success` tinyint(1) NOT NULL default '0',
+ `item_level` tinyint(2) NOT NULL default '0',
+ PRIMARY KEY (`refine_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: tradelog
+CREATE TABLE `tradelog` (
+ `trade_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `trade_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `src_account_id` int(11) NOT NULL default '0',
+ `src_char_id` int(11) NOT NULL default '0',
+ `src_char_name` varchar(30) NOT NULL default '',
+ `des_account_id` int(11) NOT NULL default '0',
+ `des_char_id` int(11) NOT NULL default '0',
+ `des_char_name` varchar(30) NOT NULL default '',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `refine` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ `zeny` int(11) NOT NULL default '0',
+ PRIMARY KEY (`trade_id`)
+) TYPE=MyISAM AUTO_INCREMENT=1 ;
+
+#Database: log
+#Table: vendlog
+CREATE TABLE `vendlog` (
+ `vend_id` mediumint(9) unsigned NOT NULL auto_increment,
+ `vend_date` datetime NOT NULL default '0000-00-00 00:00:00',
+ `vend_account_id` int(11) NOT NULL default '0',
+ `vend_char_id` int(11) NOT NULL default '0',
+ `vend_char_name` varchar(30) NOT NULL default '',
+ `buy_account_id` int(11) NOT NULL default '0',
+ `buy_char_id` int(11) NOT NULL default '0',
+ `buy_char_name` varchar(30) NOT NULL default '',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `refine` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `map` varchar(20) NOT NULL default '',
+ `zeny` int(11) NOT NULL default '0',
+ KEY `vend_id` (`vend_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ; \ No newline at end of file
diff --git a/sql-files/mail.sql b/sql-files/mail.sql
index 8e5beba3e..201142d59 100644
--- a/sql-files/mail.sql
+++ b/sql-files/mail.sql
@@ -1,14 +1,14 @@
-CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ragnarok`;
-USE `ragnarok`;
-CREATE TABLE `mail` (
- `message_id` int(11) NOT NULL auto_increment,
- `to_account_id` int(11) NOT NULL default '0',
- `to_char_name` varchar(24) NOT NULL default '',
- `from_account_id` int(11) NOT NULL default '0',
- `from_char_name` varchar(24) NOT NULL default '',
- `message` varchar(80) NOT NULL default '',
- `read_flag` tinyint(1) NOT NULL default '0',
- `priority` tinyint(1) NOT NULL default '0',
- `check_flag` tinyint(1) NOT NULL default '0',
- PRIMARY KEY (`message_id`)
-) TYPE=MyISAM;
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ragnarok`;
+USE `ragnarok`;
+CREATE TABLE `mail` (
+ `message_id` int(11) NOT NULL auto_increment,
+ `to_account_id` int(11) NOT NULL default '0',
+ `to_char_name` varchar(24) NOT NULL default '',
+ `from_account_id` int(11) NOT NULL default '0',
+ `from_char_name` varchar(24) NOT NULL default '',
+ `message` varchar(80) NOT NULL default '',
+ `read_flag` tinyint(1) NOT NULL default '0',
+ `priority` tinyint(1) NOT NULL default '0',
+ `check_flag` tinyint(1) NOT NULL default '0',
+ PRIMARY KEY (`message_id`)
+) TYPE=MyISAM;
diff --git a/sql-files/main.sql b/sql-files/main.sql
index ef3c1c343..8ebe8ffca 100644
--- a/sql-files/main.sql
+++ b/sql-files/main.sql
@@ -1,500 +1,500 @@
-# Database: Ragnarok
-# Table: 'cart_inventory'
-#
-CREATE TABLE `cart_inventory` (
- `id` int(11) NOT NULL auto_increment,
- `char_id` int(11) NOT NULL default '0',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `identify` smallint(6) NOT NULL default '0',
- `refine` tinyint(3) unsigned NOT NULL default '0',
- `attribute` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `broken` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- KEY `char_id` (`char_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'char'
-#
-CREATE TABLE `char` (
- `char_id` int(11) NOT NULL auto_increment,
- `account_id` int(11) NOT NULL default '0',
- `char_num` tinyint(4) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `class` int(11) NOT NULL default '0',
- `base_level` bigint(20) unsigned NOT NULL default '1',
- `job_level` bigint(20) unsigned NOT NULL default '1',
- `base_exp` bigint(20) NOT NULL default '0',
- `job_exp` bigint(20) NOT NULL default '0',
- `zeny` int(11) NOT NULL default '500',
- `str` int(11) unsigned NOT NULL default '0',
- `agi` int(11) unsigned NOT NULL default '0',
- `vit` int(11) unsigned NOT NULL default '0',
- `int` int(11) unsigned NOT NULL default '0',
- `dex` int(11) unsigned NOT NULL default '0',
- `luk` int(11) unsigned NOT NULL default '0',
- `max_hp` int(11) NOT NULL default '0',
- `hp` int(11) NOT NULL default '0',
- `max_sp` int(11) NOT NULL default '0',
- `sp` int(11) NOT NULL default '0',
- `status_point` int(11) NOT NULL default '0',
- `skill_point` int(11) NOT NULL default '0',
- `option` int(11) NOT NULL default '0',
- `karma` int(11) NOT NULL default '0',
- `manner` int(11) NOT NULL default '0',
- `party_id` int(11) NOT NULL default '0',
- `guild_id` int(11) NOT NULL default '0',
- `pet_id` int(11) NOT NULL default '0',
- `hair` tinyint(4) NOT NULL default '0',
- `hair_color` int(11) NOT NULL default '0',
- `clothes_color` tinyint(4) NOT NULL default '0',
- `weapon` int(11) NOT NULL default '1',
- `shield` int(11) NOT NULL default '0',
- `head_top` int(11) NOT NULL default '0',
- `head_mid` int(11) NOT NULL default '0',
- `head_bottom` int(11) NOT NULL default '0',
- `last_map` varchar(20) NOT NULL default 'new_5-1.gat',
- `last_x` int(4) NOT NULL default '53',
- `last_y` int(11) NOT NULL default '111',
- `save_map` varchar(20) NOT NULL default 'new_5-1.gat',
- `save_x` int(11) NOT NULL default '53',
- `save_y` int(11) NOT NULL default '111',
- `partner_id` int(11) NOT NULL default '0',
- `online` tinyint(4) NOT NULL default '0',
- PRIMARY KEY (`char_id`),
- KEY `party_id` (`party_id`),
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'charlog'
-#
-CREATE TABLE `charlog` (
- `time` datetime NOT NULL default '0000-00-00 00:00:00',
- `char_msg` varchar(255) NOT NULL default 'char select',
- `account_id` int(11) NOT NULL default '0',
- `char_num` tinyint(4) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `str` int(11) unsigned NOT NULL default '0',
- `agi` int(11) unsigned NOT NULL default '0',
- `vit` int(11) unsigned NOT NULL default '0',
- `int` int(11) unsigned NOT NULL default '0',
- `dex` int(11) unsigned NOT NULL default '0',
- `luk` int(11) unsigned NOT NULL default '0',
- `hair` tinyint(4) NOT NULL default '0',
- `hair_color` int(11) NOT NULL default '0'
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'global_reg_value'
-#
-CREATE TABLE `global_reg_value` (
- `char_id` int(11) NOT NULL default '0',
- `str` varchar(255) NOT NULL default '',
- `value` varchar(255) NOT NULL default '0',
- `type` int(11) NOT NULL default '3',
- `account_id` int(11) NOT NULL default '0',
- PRIMARY KEY (`char_id`,`str`,`account_id`),
- KEY `account_id` (`account_id`),
- KEY `char_id` (`char_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild'
-#
-CREATE TABLE `guild` (
- `guild_id` int(11) NOT NULL default '10000',
- `name` varchar(24) NOT NULL default '',
- `master` varchar(24) NOT NULL default '',
- `guild_lv` smallint(6) NOT NULL default '0',
- `connect_member` smallint(6) NOT NULL default '0',
- `max_member` smallint(6) NOT NULL default '0',
- `average_lv` smallint(6) NOT NULL default '0',
- `exp` int(11) NOT NULL default '0',
- `next_exp` int(11) NOT NULL default '0',
- `skill_point` int(11) NOT NULL default '0',
- `castle_id` int(11) NOT NULL default '-1',
- `mes1` varchar(60) NOT NULL default '',
- `mes2` varchar(120) NOT NULL default '',
- `emblem_len` int(11) NOT NULL default '0',
- `emblem_id` int(11) NOT NULL default '0',
- `emblem_data` blob NOT NULL,
- PRIMARY KEY (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_alliance'
-#
-CREATE TABLE `guild_alliance` (
- `guild_id` int(11) NOT NULL default '0',
- `opposition` int(11) NOT NULL default '0',
- `alliance_id` int(11) NOT NULL default '0',
- `name` varchar(24) NOT NULL default '',
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_castle'
-#
-CREATE TABLE `guild_castle` (
- `castle_id` int(11) NOT NULL default '0',
- `guild_id` int(11) NOT NULL default '0',
- `economy` int(11) NOT NULL default '0',
- `defense` int(11) NOT NULL default '0',
- `triggerE` int(11) NOT NULL default '0',
- `triggerD` int(11) NOT NULL default '0',
- `nextTime` int(11) NOT NULL default '0',
- `payTime` int(11) NOT NULL default '0',
- `createTime` int(11) NOT NULL default '0',
- `visibleC` int(11) NOT NULL default '0',
- `visibleG0` int(11) NOT NULL default '0',
- `visibleG1` int(11) NOT NULL default '0',
- `visibleG2` int(11) NOT NULL default '0',
- `visibleG3` int(11) NOT NULL default '0',
- `visibleG4` int(11) NOT NULL default '0',
- `visibleG5` int(11) NOT NULL default '0',
- `visibleG6` int(11) NOT NULL default '0',
- `visibleG7` int(11) NOT NULL default '0',
- `gHP0` int(11) NOT NULL default '0',
- `ghP1` int(11) NOT NULL default '0',
- `gHP2` int(11) NOT NULL default '0',
- `gHP3` int(11) NOT NULL default '0',
- `gHP4` int(11) NOT NULL default '0',
- `gHP5` int(11) NOT NULL default '0',
- `gHP6` int(11) NOT NULL default '0',
- `gHP7` int(11) NOT NULL default '0',
- PRIMARY KEY (`castle_id`),
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_expulsion'
-#
-CREATE TABLE `guild_expulsion` (
- `guild_id` int(11) NOT NULL default '0',
- `name` varchar(24) NOT NULL default '',
- `mes` varchar(40) NOT NULL default '',
- `acc` varchar(40) NOT NULL default '',
- `account_id` int(11) NOT NULL default '0',
- `rsv1` int(11) NOT NULL default '0',
- `rsv2` int(11) NOT NULL default '0',
- `rsv3` int(11) NOT NULL default '0',
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_member'
-#
-CREATE TABLE `guild_member` (
- `guild_id` int(11) NOT NULL default '0',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `hair` smallint(6) NOT NULL default '0',
- `hair_color` smallint(6) NOT NULL default '0',
- `gender` smallint(6) NOT NULL default '0',
- `class` smallint(6) NOT NULL default '0',
- `lv` smallint(6) NOT NULL default '0',
- `exp` bigint(20) NOT NULL default '0',
- `exp_payper` int(11) NOT NULL default '0',
- `online` tinyint(4) NOT NULL default '0',
- `position` smallint(6) NOT NULL default '0',
- `rsv1` int(11) NOT NULL default '0',
- `rsv2` int(11) NOT NULL default '0',
- `name` varchar(24) NOT NULL default '',
- KEY `guild_id` (`guild_id`),
- KEY `account_id` (`account_id`),
- KEY `char_id` (`char_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_position'
-#
-CREATE TABLE `guild_position` (
- `guild_id` int(11) NOT NULL default '0',
- `position` smallint(6) NOT NULL default '0',
- `name` varchar(24) NOT NULL default '',
- `mode` int(11) NOT NULL default '0',
- `exp_mode` int(11) NOT NULL default '0',
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_skill'
-#
-CREATE TABLE `guild_skill` (
- `guild_id` int(11) NOT NULL default '0',
- `id` int(11) NOT NULL default '0',
- `lv` int(11) NOT NULL default '0',
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'guild_storage'
-#
-CREATE TABLE `guild_storage` (
- `id` int(10) unsigned NOT NULL auto_increment,
- `guild_id` int(11) NOT NULL default '0',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `identify` smallint(6) NOT NULL default '0',
- `refine` tinyint(3) unsigned NOT NULL default '0',
- `attribute` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `broken` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'interlog'
-#
-CREATE TABLE `interlog` (
- `time` datetime NOT NULL default '0000-00-00 00:00:00',
- `log` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'inventory'
-#
-CREATE TABLE `inventory` (
- `id` int(11) NOT NULL auto_increment,
- `char_id` int(11) NOT NULL default '0',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `identify` smallint(6) NOT NULL default '0',
- `refine` tinyint(3) unsigned NOT NULL default '0',
- `attribute` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `broken` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- KEY `char_id` (`char_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'ipbanlist'
-#
-CREATE TABLE `ipbanlist` (
- `list` varchar(255) NOT NULL default '',
- `btime` datetime NOT NULL default '0000-00-00 00:00:00',
- `rtime` datetime NOT NULL default '0000-00-00 00:00:00',
- `reason` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'login'
-#
-CREATE TABLE `login` (
- `account_id` int(11) NOT NULL AUTO_INCREMENT,
- `userid` varchar(255) NOT NULL default '',
- `user_pass` varchar(32) NOT NULL default '',
- `lastlogin` datetime NOT NULL default '0000-00-00 00:00:00',
- `sex` char(1) NOT NULL default 'M',
- `logincount` mediumint(9) NOT NULL default '0',
- `email` varchar(60) NOT NULL default '',
- `level` smallint(3) NOT NULL default '0',
- `error_message` int(11) NOT NULL default '0',
- `connect_until` int(11) NOT NULL default '0',
- `last_ip` varchar(100) NOT NULL default '',
- `memo` int(11) NOT NULL default '0',
- `ban_until` int(11) NOT NULL default '0',
- `state` int(11) NOT NULL default '0',
- PRIMARY KEY (`account_id`),
- KEY `name` (`userid`)
-) TYPE=MyISAM AUTO_INCREMENT=2000000;
-
-# added standard accounts for servers, VERY INSECURE!!!
-# inserted into the table called login which is above
-
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('1', 's1', 'p1', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('2', 's2', 'p2', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('3', 's3', 'p3', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('4', 's4', 'p4', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('5', 's5', 'p5', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('6', 's6', 'p6', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('7', 's7', 'p7', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('8', 's8', 'p8', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('9', 's9', 'p9', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('10', 's10', 'p10', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('11', 's11', 'p11', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('12', 's12', 'p12', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('13', 's13', 'p13', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('14', 's14', 'p14', 'S','athena@athena.com');
-INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('15', 's15', 'p15', 'S','athena@athena.com');
-
-# Database: Ragnarok
-# Table: 'login_error'
-#
-CREATE TABLE `login_error` (
- `err_id` int(11) NOT NULL default '0',
- `reason` varchar(100) NOT NULL default 'Unknown',
- PRIMARY KEY (`err_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'loginlog'
-#
-CREATE TABLE `loginlog` (
- `time` datetime NOT NULL default '0000-00-00 00:00:00',
- `ip` varchar(64) NOT NULL default '',
- `user` varchar(32) NOT NULL default '',
- `rcode` tinyint(4) NOT NULL default '0',
- `log` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'memo'
-#
-CREATE TABLE `memo` (
- `memo_id` int(11) NOT NULL auto_increment,
- `char_id` int(11) NOT NULL default '0',
- `map` varchar(255) NOT NULL default '',
- `x` mediumint(9) NOT NULL default '0',
- `y` mediumint(9) NOT NULL default '0',
- PRIMARY KEY (`memo_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'party'
-#
-CREATE TABLE `party` (
- `party_id` int(11) NOT NULL default '100',
- `name` char(100) NOT NULL default '',
- `exp` int(11) NOT NULL default '0',
- `item` int(11) NOT NULL default '0',
- `leader_id` int(11) NOT NULL default '0',
- PRIMARY KEY (`party_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'pet'
-#
-CREATE TABLE `pet` (
- `pet_id` int(11) NOT NULL auto_increment,
- `class` mediumint(9) NOT NULL default '0',
- `name` varchar(24) NOT NULL default '',
- `account_id` int(11) NOT NULL default '0',
- `char_id` int(11) NOT NULL default '0',
- `level` tinyint(4) NOT NULL default '0',
- `egg_id` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `intimate` mediumint(9) NOT NULL default '0',
- `hungry` mediumint(9) NOT NULL default '0',
- `rename_flag` tinyint(4) NOT NULL default '0',
- `incuvate` int(11) NOT NULL default '0',
- PRIMARY KEY (`pet_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'ragsrvinfo'
-#
-CREATE TABLE `ragsrvinfo` (
- `index` int(11) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `exp` int(11) NOT NULL default '0',
- `jexp` int(11) NOT NULL default '0',
- `drop` int(11) NOT NULL default '0',
- `motd` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'skill'
-#
-CREATE TABLE `skill` (
- `char_id` int(11) NOT NULL default '0',
- `id` int(11) NOT NULL default '0',
- `lv` tinyint(4) NOT NULL default '0',
- PRIMARY KEY (`char_id`,`id`),
- KEY `char_id` (`char_id`)
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'sstatus'
-#
-CREATE TABLE `sstatus` (
- `index` tinyint(4) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `user` int(11) NOT NULL default '0'
-) TYPE=MyISAM;
-
-# Database: Ragnarok
-# Table: 'storage'
-#
-CREATE TABLE `storage` (
- `id` int(11) NOT NULL auto_increment,
- `account_id` int(11) NOT NULL default '0',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `identify` smallint(6) NOT NULL default '0',
- `refine` tinyint(3) unsigned NOT NULL default '0',
- `attribute` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- `broken` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- KEY `account_id` (`account_id`)
-) TYPE=MyISAM;
-
-USE `ragnarok`;
-CREATE TABLE `friends` (
- `id` int(11) NOT NULL auto_increment,
- `account_id` int(11) NOT NULL default '0',
- `friend_id1` int(11) NOT NULL default '0',
- `name1` varchar(255) NOT NULL default '',
- `friend_id2` int(11) NOT NULL default '0',
- `name2` varchar(255) NOT NULL default '',
- `friend_id3` int(11) NOT NULL default '0',
- `name3` varchar(255) NOT NULL default '',
- `friend_id4` int(11) NOT NULL default '0',
- `name4` varchar(255) NOT NULL default '',
- `friend_id5` int(11) NOT NULL default '0',
- `name5` varchar(255) NOT NULL default '',
- `friend_id6` int(11) NOT NULL default '0',
- `name6` varchar(255) NOT NULL default '',
- `friend_id7` int(11) NOT NULL default '0',
- `name7` varchar(255) NOT NULL default '',
- `friend_id8` int(11) NOT NULL default '0',
- `name8` varchar(255) NOT NULL default '',
- `friend_id9` int(11) NOT NULL default '0',
- `name9` varchar(255) NOT NULL default '',
- `friend_id10` int(11) NOT NULL default '0',
- `name10` varchar(255) NOT NULL default '',
- `friend_id11` int(11) NOT NULL default '0',
- `name11` varchar(255) NOT NULL default '',
- `friend_id12` int(11) NOT NULL default '0',
- `name12` varchar(255) NOT NULL default '',
- `friend_id13` int(11) NOT NULL default '0',
- `name13` varchar(255) NOT NULL default '',
- `friend_id14` int(11) NOT NULL default '0',
- `name14` varchar(255) NOT NULL default '',
- `friend_id15` int(11) NOT NULL default '0',
- `name15` varchar(255) NOT NULL default '',
- `friend_id16` int(11) NOT NULL default '0',
- `name16` varchar(255) NOT NULL default '',
- `friend_id17` int(11) NOT NULL default '0',
- `name17` varchar(255) NOT NULL default '',
- `friend_id18` int(11) NOT NULL default '0',
- `name18` varchar(255) NOT NULL default '',
- `friend_id19` int(11) NOT NULL default '0',
- `name19` varchar(255) NOT NULL default '',
- `friend_id20` int(11) NOT NULL default '0',
- `name20` varchar(255) NOT NULL default '',
- PRIMARY KEY (`id`),
- KEY `account_id` (`account_id`)
+# Database: Ragnarok
+# Table: 'cart_inventory'
+#
+CREATE TABLE `cart_inventory` (
+ `id` int(11) NOT NULL auto_increment,
+ `char_id` int(11) NOT NULL default '0',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `identify` smallint(6) NOT NULL default '0',
+ `refine` tinyint(3) unsigned NOT NULL default '0',
+ `attribute` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `broken` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `char_id` (`char_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'char'
+#
+CREATE TABLE `char` (
+ `char_id` int(11) NOT NULL auto_increment,
+ `account_id` int(11) NOT NULL default '0',
+ `char_num` tinyint(4) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `class` int(11) NOT NULL default '0',
+ `base_level` bigint(20) unsigned NOT NULL default '1',
+ `job_level` bigint(20) unsigned NOT NULL default '1',
+ `base_exp` bigint(20) NOT NULL default '0',
+ `job_exp` bigint(20) NOT NULL default '0',
+ `zeny` int(11) NOT NULL default '500',
+ `str` int(11) unsigned NOT NULL default '0',
+ `agi` int(11) unsigned NOT NULL default '0',
+ `vit` int(11) unsigned NOT NULL default '0',
+ `int` int(11) unsigned NOT NULL default '0',
+ `dex` int(11) unsigned NOT NULL default '0',
+ `luk` int(11) unsigned NOT NULL default '0',
+ `max_hp` int(11) NOT NULL default '0',
+ `hp` int(11) NOT NULL default '0',
+ `max_sp` int(11) NOT NULL default '0',
+ `sp` int(11) NOT NULL default '0',
+ `status_point` int(11) NOT NULL default '0',
+ `skill_point` int(11) NOT NULL default '0',
+ `option` int(11) NOT NULL default '0',
+ `karma` int(11) NOT NULL default '0',
+ `manner` int(11) NOT NULL default '0',
+ `party_id` int(11) NOT NULL default '0',
+ `guild_id` int(11) NOT NULL default '0',
+ `pet_id` int(11) NOT NULL default '0',
+ `hair` tinyint(4) NOT NULL default '0',
+ `hair_color` int(11) NOT NULL default '0',
+ `clothes_color` tinyint(4) NOT NULL default '0',
+ `weapon` int(11) NOT NULL default '1',
+ `shield` int(11) NOT NULL default '0',
+ `head_top` int(11) NOT NULL default '0',
+ `head_mid` int(11) NOT NULL default '0',
+ `head_bottom` int(11) NOT NULL default '0',
+ `last_map` varchar(20) NOT NULL default 'new_5-1.gat',
+ `last_x` int(4) NOT NULL default '53',
+ `last_y` int(11) NOT NULL default '111',
+ `save_map` varchar(20) NOT NULL default 'new_5-1.gat',
+ `save_x` int(11) NOT NULL default '53',
+ `save_y` int(11) NOT NULL default '111',
+ `partner_id` int(11) NOT NULL default '0',
+ `online` tinyint(4) NOT NULL default '0',
+ PRIMARY KEY (`char_id`),
+ KEY `party_id` (`party_id`),
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'charlog'
+#
+CREATE TABLE `charlog` (
+ `time` datetime NOT NULL default '0000-00-00 00:00:00',
+ `char_msg` varchar(255) NOT NULL default 'char select',
+ `account_id` int(11) NOT NULL default '0',
+ `char_num` tinyint(4) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `str` int(11) unsigned NOT NULL default '0',
+ `agi` int(11) unsigned NOT NULL default '0',
+ `vit` int(11) unsigned NOT NULL default '0',
+ `int` int(11) unsigned NOT NULL default '0',
+ `dex` int(11) unsigned NOT NULL default '0',
+ `luk` int(11) unsigned NOT NULL default '0',
+ `hair` tinyint(4) NOT NULL default '0',
+ `hair_color` int(11) NOT NULL default '0'
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'global_reg_value'
+#
+CREATE TABLE `global_reg_value` (
+ `char_id` int(11) NOT NULL default '0',
+ `str` varchar(255) NOT NULL default '',
+ `value` varchar(255) NOT NULL default '0',
+ `type` int(11) NOT NULL default '3',
+ `account_id` int(11) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`str`,`account_id`),
+ KEY `account_id` (`account_id`),
+ KEY `char_id` (`char_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild'
+#
+CREATE TABLE `guild` (
+ `guild_id` int(11) NOT NULL default '10000',
+ `name` varchar(24) NOT NULL default '',
+ `master` varchar(24) NOT NULL default '',
+ `guild_lv` smallint(6) NOT NULL default '0',
+ `connect_member` smallint(6) NOT NULL default '0',
+ `max_member` smallint(6) NOT NULL default '0',
+ `average_lv` smallint(6) NOT NULL default '0',
+ `exp` int(11) NOT NULL default '0',
+ `next_exp` int(11) NOT NULL default '0',
+ `skill_point` int(11) NOT NULL default '0',
+ `castle_id` int(11) NOT NULL default '-1',
+ `mes1` varchar(60) NOT NULL default '',
+ `mes2` varchar(120) NOT NULL default '',
+ `emblem_len` int(11) NOT NULL default '0',
+ `emblem_id` int(11) NOT NULL default '0',
+ `emblem_data` blob NOT NULL,
+ PRIMARY KEY (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_alliance'
+#
+CREATE TABLE `guild_alliance` (
+ `guild_id` int(11) NOT NULL default '0',
+ `opposition` int(11) NOT NULL default '0',
+ `alliance_id` int(11) NOT NULL default '0',
+ `name` varchar(24) NOT NULL default '',
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_castle'
+#
+CREATE TABLE `guild_castle` (
+ `castle_id` int(11) NOT NULL default '0',
+ `guild_id` int(11) NOT NULL default '0',
+ `economy` int(11) NOT NULL default '0',
+ `defense` int(11) NOT NULL default '0',
+ `triggerE` int(11) NOT NULL default '0',
+ `triggerD` int(11) NOT NULL default '0',
+ `nextTime` int(11) NOT NULL default '0',
+ `payTime` int(11) NOT NULL default '0',
+ `createTime` int(11) NOT NULL default '0',
+ `visibleC` int(11) NOT NULL default '0',
+ `visibleG0` int(11) NOT NULL default '0',
+ `visibleG1` int(11) NOT NULL default '0',
+ `visibleG2` int(11) NOT NULL default '0',
+ `visibleG3` int(11) NOT NULL default '0',
+ `visibleG4` int(11) NOT NULL default '0',
+ `visibleG5` int(11) NOT NULL default '0',
+ `visibleG6` int(11) NOT NULL default '0',
+ `visibleG7` int(11) NOT NULL default '0',
+ `gHP0` int(11) NOT NULL default '0',
+ `ghP1` int(11) NOT NULL default '0',
+ `gHP2` int(11) NOT NULL default '0',
+ `gHP3` int(11) NOT NULL default '0',
+ `gHP4` int(11) NOT NULL default '0',
+ `gHP5` int(11) NOT NULL default '0',
+ `gHP6` int(11) NOT NULL default '0',
+ `gHP7` int(11) NOT NULL default '0',
+ PRIMARY KEY (`castle_id`),
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_expulsion'
+#
+CREATE TABLE `guild_expulsion` (
+ `guild_id` int(11) NOT NULL default '0',
+ `name` varchar(24) NOT NULL default '',
+ `mes` varchar(40) NOT NULL default '',
+ `acc` varchar(40) NOT NULL default '',
+ `account_id` int(11) NOT NULL default '0',
+ `rsv1` int(11) NOT NULL default '0',
+ `rsv2` int(11) NOT NULL default '0',
+ `rsv3` int(11) NOT NULL default '0',
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_member'
+#
+CREATE TABLE `guild_member` (
+ `guild_id` int(11) NOT NULL default '0',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `hair` smallint(6) NOT NULL default '0',
+ `hair_color` smallint(6) NOT NULL default '0',
+ `gender` smallint(6) NOT NULL default '0',
+ `class` smallint(6) NOT NULL default '0',
+ `lv` smallint(6) NOT NULL default '0',
+ `exp` bigint(20) NOT NULL default '0',
+ `exp_payper` int(11) NOT NULL default '0',
+ `online` tinyint(4) NOT NULL default '0',
+ `position` smallint(6) NOT NULL default '0',
+ `rsv1` int(11) NOT NULL default '0',
+ `rsv2` int(11) NOT NULL default '0',
+ `name` varchar(24) NOT NULL default '',
+ KEY `guild_id` (`guild_id`),
+ KEY `account_id` (`account_id`),
+ KEY `char_id` (`char_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_position'
+#
+CREATE TABLE `guild_position` (
+ `guild_id` int(11) NOT NULL default '0',
+ `position` smallint(6) NOT NULL default '0',
+ `name` varchar(24) NOT NULL default '',
+ `mode` int(11) NOT NULL default '0',
+ `exp_mode` int(11) NOT NULL default '0',
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_skill'
+#
+CREATE TABLE `guild_skill` (
+ `guild_id` int(11) NOT NULL default '0',
+ `id` int(11) NOT NULL default '0',
+ `lv` int(11) NOT NULL default '0',
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'guild_storage'
+#
+CREATE TABLE `guild_storage` (
+ `id` int(10) unsigned NOT NULL auto_increment,
+ `guild_id` int(11) NOT NULL default '0',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `identify` smallint(6) NOT NULL default '0',
+ `refine` tinyint(3) unsigned NOT NULL default '0',
+ `attribute` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `broken` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'interlog'
+#
+CREATE TABLE `interlog` (
+ `time` datetime NOT NULL default '0000-00-00 00:00:00',
+ `log` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'inventory'
+#
+CREATE TABLE `inventory` (
+ `id` int(11) NOT NULL auto_increment,
+ `char_id` int(11) NOT NULL default '0',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `identify` smallint(6) NOT NULL default '0',
+ `refine` tinyint(3) unsigned NOT NULL default '0',
+ `attribute` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `broken` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `char_id` (`char_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'ipbanlist'
+#
+CREATE TABLE `ipbanlist` (
+ `list` varchar(255) NOT NULL default '',
+ `btime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `rtime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `reason` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'login'
+#
+CREATE TABLE `login` (
+ `account_id` int(11) NOT NULL AUTO_INCREMENT,
+ `userid` varchar(255) NOT NULL default '',
+ `user_pass` varchar(32) NOT NULL default '',
+ `lastlogin` datetime NOT NULL default '0000-00-00 00:00:00',
+ `sex` char(1) NOT NULL default 'M',
+ `logincount` mediumint(9) NOT NULL default '0',
+ `email` varchar(60) NOT NULL default '',
+ `level` smallint(3) NOT NULL default '0',
+ `error_message` int(11) NOT NULL default '0',
+ `connect_until` int(11) NOT NULL default '0',
+ `last_ip` varchar(100) NOT NULL default '',
+ `memo` int(11) NOT NULL default '0',
+ `ban_until` int(11) NOT NULL default '0',
+ `state` int(11) NOT NULL default '0',
+ PRIMARY KEY (`account_id`),
+ KEY `name` (`userid`)
+) TYPE=MyISAM AUTO_INCREMENT=2000000;
+
+# added standard accounts for servers, VERY INSECURE!!!
+# inserted into the table called login which is above
+
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('1', 's1', 'p1', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('2', 's2', 'p2', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('3', 's3', 'p3', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('4', 's4', 'p4', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('5', 's5', 'p5', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('6', 's6', 'p6', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('7', 's7', 'p7', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('8', 's8', 'p8', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('9', 's9', 'p9', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('10', 's10', 'p10', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('11', 's11', 'p11', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('12', 's12', 'p12', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('13', 's13', 'p13', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('14', 's14', 'p14', 'S','athena@athena.com');
+INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `sex`, `email`) VALUES ('15', 's15', 'p15', 'S','athena@athena.com');
+
+# Database: Ragnarok
+# Table: 'login_error'
+#
+CREATE TABLE `login_error` (
+ `err_id` int(11) NOT NULL default '0',
+ `reason` varchar(100) NOT NULL default 'Unknown',
+ PRIMARY KEY (`err_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'loginlog'
+#
+CREATE TABLE `loginlog` (
+ `time` datetime NOT NULL default '0000-00-00 00:00:00',
+ `ip` varchar(64) NOT NULL default '',
+ `user` varchar(32) NOT NULL default '',
+ `rcode` tinyint(4) NOT NULL default '0',
+ `log` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'memo'
+#
+CREATE TABLE `memo` (
+ `memo_id` int(11) NOT NULL auto_increment,
+ `char_id` int(11) NOT NULL default '0',
+ `map` varchar(255) NOT NULL default '',
+ `x` mediumint(9) NOT NULL default '0',
+ `y` mediumint(9) NOT NULL default '0',
+ PRIMARY KEY (`memo_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'party'
+#
+CREATE TABLE `party` (
+ `party_id` int(11) NOT NULL default '100',
+ `name` char(100) NOT NULL default '',
+ `exp` int(11) NOT NULL default '0',
+ `item` int(11) NOT NULL default '0',
+ `leader_id` int(11) NOT NULL default '0',
+ PRIMARY KEY (`party_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'pet'
+#
+CREATE TABLE `pet` (
+ `pet_id` int(11) NOT NULL auto_increment,
+ `class` mediumint(9) NOT NULL default '0',
+ `name` varchar(24) NOT NULL default '',
+ `account_id` int(11) NOT NULL default '0',
+ `char_id` int(11) NOT NULL default '0',
+ `level` tinyint(4) NOT NULL default '0',
+ `egg_id` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `intimate` mediumint(9) NOT NULL default '0',
+ `hungry` mediumint(9) NOT NULL default '0',
+ `rename_flag` tinyint(4) NOT NULL default '0',
+ `incuvate` int(11) NOT NULL default '0',
+ PRIMARY KEY (`pet_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'ragsrvinfo'
+#
+CREATE TABLE `ragsrvinfo` (
+ `index` int(11) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `exp` int(11) NOT NULL default '0',
+ `jexp` int(11) NOT NULL default '0',
+ `drop` int(11) NOT NULL default '0',
+ `motd` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'skill'
+#
+CREATE TABLE `skill` (
+ `char_id` int(11) NOT NULL default '0',
+ `id` int(11) NOT NULL default '0',
+ `lv` tinyint(4) NOT NULL default '0',
+ PRIMARY KEY (`char_id`,`id`),
+ KEY `char_id` (`char_id`)
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'sstatus'
+#
+CREATE TABLE `sstatus` (
+ `index` tinyint(4) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `user` int(11) NOT NULL default '0'
+) TYPE=MyISAM;
+
+# Database: Ragnarok
+# Table: 'storage'
+#
+CREATE TABLE `storage` (
+ `id` int(11) NOT NULL auto_increment,
+ `account_id` int(11) NOT NULL default '0',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `identify` smallint(6) NOT NULL default '0',
+ `refine` tinyint(3) unsigned NOT NULL default '0',
+ `attribute` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ `broken` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `account_id` (`account_id`)
+) TYPE=MyISAM;
+
+USE `ragnarok`;
+CREATE TABLE `friends` (
+ `id` int(11) NOT NULL auto_increment,
+ `account_id` int(11) NOT NULL default '0',
+ `friend_id1` int(11) NOT NULL default '0',
+ `name1` varchar(255) NOT NULL default '',
+ `friend_id2` int(11) NOT NULL default '0',
+ `name2` varchar(255) NOT NULL default '',
+ `friend_id3` int(11) NOT NULL default '0',
+ `name3` varchar(255) NOT NULL default '',
+ `friend_id4` int(11) NOT NULL default '0',
+ `name4` varchar(255) NOT NULL default '',
+ `friend_id5` int(11) NOT NULL default '0',
+ `name5` varchar(255) NOT NULL default '',
+ `friend_id6` int(11) NOT NULL default '0',
+ `name6` varchar(255) NOT NULL default '',
+ `friend_id7` int(11) NOT NULL default '0',
+ `name7` varchar(255) NOT NULL default '',
+ `friend_id8` int(11) NOT NULL default '0',
+ `name8` varchar(255) NOT NULL default '',
+ `friend_id9` int(11) NOT NULL default '0',
+ `name9` varchar(255) NOT NULL default '',
+ `friend_id10` int(11) NOT NULL default '0',
+ `name10` varchar(255) NOT NULL default '',
+ `friend_id11` int(11) NOT NULL default '0',
+ `name11` varchar(255) NOT NULL default '',
+ `friend_id12` int(11) NOT NULL default '0',
+ `name12` varchar(255) NOT NULL default '',
+ `friend_id13` int(11) NOT NULL default '0',
+ `name13` varchar(255) NOT NULL default '',
+ `friend_id14` int(11) NOT NULL default '0',
+ `name14` varchar(255) NOT NULL default '',
+ `friend_id15` int(11) NOT NULL default '0',
+ `name15` varchar(255) NOT NULL default '',
+ `friend_id16` int(11) NOT NULL default '0',
+ `name16` varchar(255) NOT NULL default '',
+ `friend_id17` int(11) NOT NULL default '0',
+ `name17` varchar(255) NOT NULL default '',
+ `friend_id18` int(11) NOT NULL default '0',
+ `name18` varchar(255) NOT NULL default '',
+ `friend_id19` int(11) NOT NULL default '0',
+ `name19` varchar(255) NOT NULL default '',
+ `friend_id20` int(11) NOT NULL default '0',
+ `name20` varchar(255) NOT NULL default '',
+ PRIMARY KEY (`id`),
+ KEY `account_id` (`account_id`)
) TYPE=MyISAM \ No newline at end of file
diff --git a/sql-files/oA2eA-rc5.sql b/sql-files/oA2eA-rc5.sql
index 2e30fa4b8..b501b232c 100644
--- a/sql-files/oA2eA-rc5.sql
+++ b/sql-files/oA2eA-rc5.sql
@@ -1,204 +1,204 @@
-//
-// When converting from oA to eA, my oA db was in ragnarok so I created
-// a new db called eragnarok and then ran the following commands...
-//
-// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/main.sql
-// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/db_tables.sql
-// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/mail.sql
-// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/oA2eA-rc5.sql
-//
-// This creates a eragnarok database and fills everything in from the oA
-// database.
-//
-// -- MouseJstr
-
-CREATE TABLE `item_db` (
- `id` smallint(5) unsigned NOT NULL default '0',
- `name_english` varchar(24) NOT NULL default '',
- `name_japanese` varchar(24) NOT NULL default '',
- `type` tinyint(2) unsigned NOT NULL default '0',
- `price_buy` int(10) unsigned default NULL,
- `price_sell` int(10) unsigned default NULL,
- `weight` int(10) unsigned NOT NULL default '0',
- `attack` mediumint(9) unsigned default NULL,
- `defence` mediumint(9) unsigned default NULL,
- `range` tinyint(2) unsigned default NULL,
- `slots` tinyint(1) unsigned default NULL,
- `equip_jobs` mediumint(8) unsigned default NULL,
- `equip_genders` tinyint(1) unsigned default NULL,
- `equip_locations` smallint(4) unsigned default NULL,
- `weapon_level` tinyint(1) unsigned default NULL,
- `equip_level` tinyint(3) unsigned default NULL,
- `view` tinyint(3) unsigned default NULL,
- `script_use` text,
- `script_equip` text,
- PRIMARY KEY (`id`)
-) TYPE=MyISAM;
-
-CREATE TABLE `mob_db` (
- `ID` mediumint(9) NOT NULL default '0',
- `Name` text NOT NULL,
- `Name2` text NOT NULL,
- `LV` smallint(6) NOT NULL default '0',
- `HP` mediumint(9) NOT NULL default '0',
- `SP` mediumint(9) NOT NULL default '0',
- `EXP` mediumint(9) NOT NULL default '0',
- `JEXP` mediumint(9) NOT NULL default '0',
- `Range1` tinyint(4) NOT NULL default '0',
- `ATK1` smallint(6) NOT NULL default '0',
- `ATK2` smallint(6) NOT NULL default '0',
- `DEF` smallint(6) NOT NULL default '0',
- `MDEF` smallint(6) NOT NULL default '0',
- `STR` tinyint(4) NOT NULL default '0',
- `AGI` tinyint(4) NOT NULL default '0',
- `VIT` tinyint(4) NOT NULL default '0',
- `INT` tinyint(4) NOT NULL default '0',
- `DEX` tinyint(4) NOT NULL default '0',
- `LUK` tinyint(4) NOT NULL default '0',
- `Range2` tinyint(4) NOT NULL default '0',
- `Range3` tinyint(4) NOT NULL default '0',
- `Scale` tinyint(4) NOT NULL default '0',
- `Race` tinyint(4) NOT NULL default '0',
- `Element` tinyint(4) NOT NULL default '0',
- `Mode` smallint(6) NOT NULL default '0',
- `Speed` smallint(6) NOT NULL default '0',
- `ADelay` smallint(6) NOT NULL default '0',
- `aMotion` smallint(6) NOT NULL default '0',
- `dMotion` smallint(6) NOT NULL default '0',
- `Drop1id` mediumint(9) NOT NULL default '0',
- `Drop1per` mediumint(9) NOT NULL default '0',
- `Drop2id` mediumint(9) NOT NULL default '0',
- `Drop2per` mediumint(9) NOT NULL default '0',
- `Drop3id` mediumint(9) NOT NULL default '0',
- `Drop3per` mediumint(9) NOT NULL default '0',
- `Drop4id` mediumint(9) NOT NULL default '0',
- `Drop4per` mediumint(9) NOT NULL default '0',
- `Drop5id` mediumint(9) NOT NULL default '0',
- `Drop5per` mediumint(9) NOT NULL default '0',
- `Drop6id` mediumint(9) NOT NULL default '0',
- `Drop6per` mediumint(9) NOT NULL default '0',
- `Drop7id` mediumint(9) NOT NULL default '0',
- `Drop7per` mediumint(9) NOT NULL default '0',
- `Drop8id` mediumint(9) NOT NULL default '0',
- `Drop8per` mediumint(9) NOT NULL default '0',
- `MEXP` mediumint(9) NOT NULL default '0',
- `ExpPer` mediumint(9) NOT NULL default '0',
- `MVP1id` mediumint(9) NOT NULL default '0',
- `MVP1per` mediumint(9) NOT NULL default '0',
- `MVP2id` mediumint(9) NOT NULL default '0',
- `MVP2per` mediumint(9) NOT NULL default '0',
- `MVP3id` mediumint(9) NOT NULL default '0',
- `MVP3per` mediumint(9) NOT NULL default '0'
-) TYPE=MyISAM;
-
-INSERT INTO eragnarok.storage(`id`, `account_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) SELECT `id`, `account_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.storage;
-
- INSERT INTO eragnarok.cart_inventory(`id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) SELECT `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` from ragnarok.cart_inventory;
-
-INSERT INTO eragnarok.char( `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`, `online`) 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`, `online` from ragnarok.char;
-
-INSERT INTO eragnarok.charlog( `time`, `char_msg`, `account_id`, `char_num`, `name`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hair`, `hair_color` ) SELECT `time`, `char_msg`, `account_id`, `char_num`, `name`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hair`, `hair_color` from ragnarok.charlog;
-
-INSERT INTO eragnarok.global_reg_value ( `char_id`, `str`, `value`, `type`, `account_id`) SELECT `char_id`, `str`, `value`, `type`, `account_id` from ragnarok.global_reg_value ;
-
-INSERT INTO eragnarok.guild( `guild_id`, `name`, `master`, `guild_lv`, `connect_member`, `max_member`, `average_lv`, `exp`, `next_exp`, `skill_point`, `castle_id`, `mes1`, `mes2`, `emblem_len`, `emblem_id`, `emblem_data` ) SELECT `guild_id`, `name`, `master`, `guild_lv`, `connect_member`, `max_member`, `average_lv`, `exp`, `next_exp`, `skill_point`, `castle_id`, `mes1`, `mes2`, `emblem_len`, `emblem_id`, `emblem_data` from ragnarok.guild;
-
-INSERT INTO eragnarok.guild_alliance ( `guild_id`, `opposition`, `alliance_id`, `name` ) SELECT `guild_id`, `opposition`, `alliance_id`, `name` from ragnarok.guild_alliance ;
-
-INSERT INTO eragnarok.guild_castle ( `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7` ) SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7` from ragnarok.guild_castle ;
-
-INSERT INTO eragnarok.guild_expulsion ( `guild_id`, `name`, `mes`, `acc`, `account_id`, `rsv1`, `rsv2`, `rsv3` ) SELECT `guild_id`, `name`, `mes`, `acc`, `account_id`, `rsv1`, `rsv2`, `rsv3` from ragnarok.guild_expulsion ;
-
-INSERT INTO eragnarok.guild_member ( `guild_id`, `account_id`, `char_id`, `hair`, `hair_color`, `gender`, `class`, `lv`, `exp`, `exp_payper`, `online`, `position`, `rsv1`, `rsv2`, `name` ) SELECT `guild_id`, `account_id`, `char_id`, `hair`, `hair_color`, `gender`, `class`, `lv`, `exp`, `exp_payper`, `online`, `position`, `rsv1`, `rsv2`, `name` from ragnarok.guild_member ;
-
-INSERT INTO eragnarok.guild_position ( `guild_id`, `position`, `name`, `mode`, `exp_mode` ) SELECT `guild_id`, `position`, `name`, `mode`, `exp_mode` from ragnarok.guild_position ;
-
-INSERT INTO eragnarok.guild_skill ( `guild_id`, `id`, `lv` ) SELECT `guild_id`, `id`, `lv` from ragnarok.guild_skill ;
-
-INSERT INTO eragnarok.guild_storage ( `id`, `guild_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` ) SELECT `id`, `guild_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.guild_storage ;
-
-INSERT INTO eragnarok.interlog ( `time`, `log` ) SELECT `time`, `log` from ragnarok.interlog ;
-
-INSERT INTO eragnarok.inventory ( `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` ) SELECT `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.inventory ;
-
-INSERT INTO eragnarok.ipbanlist ( `list`, `btime`, `rtime`, `reason` ) SELECT `list`, `btime`, `rtime`, `reason` from ragnarok.ipbanlist ;
-
-
-# INSERT INTO eragnarok.login_error ( `err_id`, `reason` ) SELECT `err_id`, `reason` from ragnarok.login_error ;
-
-INSERT INTO eragnarok.loginlog ( `time`, `ip`, `user`, `rcode`, `log` ) SELECT `time`, `ip`, `user`, `rcode`, `log` from ragnarok.loginlog ;
-
-INSERT INTO eragnarok.memo ( `memo_id`, `char_id`, `map`, `x`, `y` ) SELECT `memo_id`, `char_id`, `map`, `x`, `y` from ragnarok.memo ;
-
-INSERT INTO eragnarok.party ( `party_id`, `name`, `exp`, `item`, `leader_id` ) SELECT `party_id`, `name`, `exp`, `item`, `leader_id` from ragnarok.party ;
-
-INSERT INTO eragnarok.pet ( `pet_id`, `class`, `name`, `account_id`, `char_id`, `level`, `egg_id`, `equip`, `intimate`, `hungry`, `rename_flag`, `incuvate` ) SELECT `pet_id`, `class`, `name`, `account_id`, `char_id`, `level`, `egg_id`, `equip`, `intimate`, `hungry`, `rename_flag`, `incuvate` from ragnarok.pet ;
-
-INSERT INTO eragnarok.ragsrvinfo ( `index`, `name`, `exp`, `jexp`, `drop` ) SELECT `index`, `name`, `exp`, `jexp`, `drop` from ragnarok.ragsrvinfo ;
-
-INSERT INTO eragnarok.skill ( `char_id`, `id`, `lv` ) SELECT `char_id`, `id`, `lv` from ragnarok.skill ;
-
-INSERT INTO eragnarok.sstatus ( `index`, `name`, `user` ) SELECT `index`, `name`, `user` from ragnarok.sstatus ;
-
-
-# INSERT INTO eragnarok.abra_db ( `ID`, `Dummy`, `Req_Lvl`, `Per`, `Comment`) SELECT `ID`, `Dummy`, `Req_Lvl`, `Per`, `Comment` from ragnarok.abra_db;
-
-# INSERT INTO eragnarok.attr_fix ( `Level`, `None`, `Water`, `Earth`, `Fire`, `Wind`, `Poison`, `Saint`, `Darkness`, `Sense`, `Immortality`, `Comment`) SELECT `Level`, `None`, `Water`, `Earth`, `Fire`, `Wind`, `Poison`, `Saint`, `Darkness`, `Sense`, `Immortality`, `Comment` from ragnarok.attr_fix;
-
-# INSERT INTO eragnarok.cast_db ( `ID`, `Cast_List`, `Delay_List`, `Upkeep_Time`, `Upkeep_Time2`, `Comment` ) SELECT `ID`, `Cast_List`, `Delay_List`, `Upkeep_Time`, `Upkeep_Time2`, `Comment` from ragnarok.cast_db;
-
-#INSERT INTO eragnarok.castle_db ( `CastleID`, `map_name`, `castle_name`, `switch_flag`, `Comment` ) SELECT `CastleID`, `map_name`, `castle_name`, `switch_flag`, `Comment` from ragnarok.castle_db;
-
-#INSERT INTO eragnarok.create_arrow_db ( `SourceID`, `MakeID1`, `MakeNum1`, `MakeID2`, `MakeNum2`, `MakeID3`, `MakeNum3`, `MakeID4`, `MakeNum4`, `MakeID5`, `MakeNum5`, `Comment` ) SELECT `SourceID`, `MakeID1`, `MakeNum1`, `MakeID2`, `MakeNum2`, `MakeID3`, `MakeNum3`, `MakeID4`, `MakeNum4`, `MakeID5`, `MakeNum5`, `Comment` from ragnarok.create_arrow_db;
-
-#INSERT INTO eragnarok.exp ( `EXP1`, `EXP2`, `EXP3`, `EXP4`, `EXP5`, `EXP6`, `EXP7`, `EXP8`, `EXP9`, `EXP10`, `EXP11`, `EXP12`, `EXP13`, `EXP14` ) SELECT `EXP1`, `EXP2`, `EXP3`, `EXP4`, `EXP5`, `EXP6`, `EXP7`, `EXP8`, `EXP9`, `EXP10`, `EXP11`, `EXP12`, `EXP13`, `EXP14` from ragnarok.exp;
-
-#INSERT INTO eragnarok.exp_guild ( `Level`, `EXP`, `Comment` ) SELECT `Level`, `EXP`, `Comment` from ragnarok.exp_guild;
-
-#INSERT INTO eragnarok.item_bluebox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_bluebox;
-
-#INSERT INTO eragnarok.item_cardalbum ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_cardalbum;
-
-INSERT INTO eragnarok.item_db2 ( `ID`, `Name`, `Name2`, `Type`, `Price`, `Sell`, `Weight`, `ATK`, `DEF`, `Range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `View`, `UseScript`, `EquipScript`, `Comment` ) SELECT `ID`, `Name`, `Name2`, `Type`, `Price`, `Sell`, `Weight`, `ATK`, `DEF`, `Range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `View`, `UseScript`, `EquipScript`, `Comment` from ragnarok.item_db2;
-
-# INSERT INTO eragnarok.item_giftbox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_giftbox;
-
-#INSERT INTO eragnarok.item_scroll ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_scroll;
-
-#INSERT INTO eragnarok.item_violetbox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_violetbox;
-
-#INSERT INTO eragnarok.job_db1 ( `Class_ID`, `Weight`, `HP`, `HP2`, `SP`, `Empty`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Rod`, `Club`, `Stick`, `Bow`, `Fist`, `Musical`, `Whip`, `Book`, `Katar`, `Comment` ) SELECT `Class_ID`, `Weight`, `HP`, `HP2`, `SP`, `Empty`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Rod`, `Club`, `Stick`, `Bow`, `Fist`, `Musical`, `Whip`, `Book`, `Katar`, `Comment` from ragnarok.job_db1;
-
-INSERT INTO eragnarok.mob_boss ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_boss;
-
-INSERT INTO eragnarok.mob_branch ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_branch;
-
-INSERT INTO eragnarok.mob_db2 ( `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7d`, `Drop7per`, `Drop8id`, `Drop8per`, `Item1`, `Item2`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`, `Comment` ) SELECT `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7d`, `Drop7per`, `Drop8id`, `Drop8per`, `Item1`, `Item2`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`, `Comment` from ragnarok.mob_db2;
-
-INSERT INTO eragnarok.mob_poring ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_poring;
-
-INSERT INTO eragnarok.mob_skill_db ( `Mob_ID`, `Dummy`, `State`, `Skill_ID`, `Skill_LV`, `Use_Rate`, `Cast_Time`, `Delay`, `Disturbance`, `Target`, `Condition_Type`, `Condition_Value`, `Value1`, `Value2`, `Value3`, `Value4`, `Value5`, `Comment` ) SELECT `Mob_ID`, `Dummy`, `State`, `Skill_ID`, `Skill_LV`, `Use_Rate`, `Cast_Time`, `Delay`, `Disturbance`, `Target`, `Condition_Type`, `Condition_Value`, `Value1`, `Value2`, `Value3`, `Value4`, `Value5`, `Comment` from ragnarok.mob_skill_db;
-
-#INSERT INTO eragnarok.pet_db ( `MobID`, `Name`, `JName`, `ItemID`, `EggID`, `AcceID`, `FoodID`, `Fullness`, `HungryDeray`, `R_Hungry`, `R_Full`, `Intimate`, `Die`, `Capture`, `Speed`, `S_Performance`, `Talk_Convert_Class`, `Attack_Rate`, `Defence_Attack_Rate`, `Change_Target_Rate`, `Pet_Script`, `Comment` ) SELECT `MobID`, `Name`, `JName`, `ItemID`, `EggID`, `AcceID`, `FoodID`, `Fullness`, `HungryDeray`, `R_Hungry`, `R_Full`, `Intimate`, `Die`, `Capture`, `Speed`, `S_Performance`, `Talk_Convert_Class`, `Attack_Rate`, `Defence_Attack_Rate`, `Change_Target_Rate`, `Pet_Script`, `Comment` from ragnarok.pet_db;
-
-#INSERT INTO eragnarok.produce_db ( `ID`, `ItemLV`, `RequireSkill`, `MaterialID1`, `MaterialAmount1`, `MaterialID2`, `MaterialAmount2`, `MaterialID3`, `MaterialAmount3`, `MaterialID4`, `MaterialAmount4`, `MaterialID5`, `MaterialAmount5`, `Comment` ) SELECT `ID`, `ItemLV`, `RequireSkill`, `MaterialID1`, `MaterialAmount1`, `MaterialID2`, `MaterialAmount2`, `MaterialID3`, `MaterialAmount3`, `MaterialID4`, `MaterialAmount4`, `MaterialID5`, `MaterialAmount5`, `Comment` from ragnarok.produce_db;
-
-#INSERT INTO eragnarok.refine_db ( `Refine_Bonus`, `Danger_Bonus`, `Safe_Limit`, `RefineChance1`, `RefineChance2`, `RefineChance3`, `RefineChance4`, `RefineChance5`, `RefineChance6`, `RefineChance7`, `RefineChance8`, `RefineChance9`, `RefineChance10`, `Comment` ) SELECT `Refine_Bonus`, `Danger_Bonus`, `Safe_Limit`, `RefineChance1`, `RefineChance2`, `RefineChance3`, `RefineChance4`, `RefineChance5`, `RefineChance6`, `RefineChance7`, `RefineChance8`, `RefineChance9`, `RefineChance10`, `Comment` from ragnarok.refine_db;
-
-#INSERT INTO eragnarok.size_fix ( `Element`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Club`, `Whip`, `Stick`, `Bow`, `Fist`, `Musical`, `Rod`, `Book`, `Katar`, `Comment` ) SELECT `Element`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Club`, `Whip`, `Stick`, `Bow`, `Fist`, `Musical`, `Rod`, `Book`, `Katar`, `Comment` from ragnarok.size_fix;
-
-#INSERT INTO eragnarok.skill_db ( `ID`, `Range`, `Hit`, `inf`, `nk`, `max`, `list_num`, `castcancel`, `cast_defence_rate`, `inf2`, `maxcount`, `skill_type`, `blow_count`, `Comment` ) SELECT `ID`, `Range`, `Hit`, `inf`, `nk`, `max`, `list_num`, `castcancel`, `cast_defence_rate`, `inf2`, `maxcount`, `skill_type`, `blow_count`, `Comment` from ragnarok.skill_db;
-
-#INSERT INTO eragnarok.skill_require_db ( `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`, `Comment` ) SELECT `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`, `Comment` from ragnarok.skill_require_db;
-
-#INSERT INTO eragnarok.skill_tree ( `Upper`, `JobNo`, `Skill_ID`, `MaxLV`, `Skill_ID_Require1`, `Skill_LV_Require1`, `Skill_ID_Require2`, `Skill_LV_Require2`, `Skill_ID_Require3`, `Skill_LV_Require3`, `Skill_ID_Require4`, `Skill_LV_Require4`, `Skill_ID_Require5`, `Skill_LV_Require5`, `Comment` ) SELECT `Upper`, `JobNo`, `Skill_ID`, `MaxLV`, `Skill_ID_Require1`, `Skill_LV_Require1`, `Skill_ID_Require2`, `Skill_LV_Require2`, `Skill_ID_Require3`, `Skill_LV_Require3`, `Skill_ID_Require4`, `Skill_LV_Require4`, `Skill_ID_Require5`, `Skill_LV_Require5`, `Comment` from ragnarok.skill_tree;
-
-INSERT INTO eragnarok.item_db ( `id`, `name_english`, `name_japanese`, `type`, `price_buy`, `price_sell`, `weight`, `attack`, `defence`, `range`, `slots`, `equip_jobs`, `equip_genders`, `equip_locations`, `weapon_level`, `equip_level`, `view`, `script_use`, `script_equip` ) SELECT `id`, `Name`, `Name2`, `type`, `Price`, `Sell`, `Weight`, `Atk`, `Def`, `range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `view`, `UseScript`, `EquipScript` from ragnarok.item_db;
-
-UPDATE item_db SET price_sell = price_buy/2;
-
-INSERT INTO eragnarok.mob_db (`ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7id`, `Drop7per`, `Drop8id`, `Drop8per`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`) SELECT `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7id`, `Drop7per`, `Drop8id`, `Drop8per`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per` from ragnarok.mob_db;
-
-DELETE FROM eragnarok.login;
-
-INSERT INTO eragnarok.login ( `account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level` ) SELECT `account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level` from ragnarok.login ;
+//
+// When converting from oA to eA, my oA db was in ragnarok so I created
+// a new db called eragnarok and then ran the following commands...
+//
+// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/main.sql
+// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/db_tables.sql
+// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/mail.sql
+// /usr/local/mysql/bin/mysql -Deragnarok -u eragnarok -p< athena/sql-files/oA2eA-rc5.sql
+//
+// This creates a eragnarok database and fills everything in from the oA
+// database.
+//
+// -- MouseJstr
+
+CREATE TABLE `item_db` (
+ `id` smallint(5) unsigned NOT NULL default '0',
+ `name_english` varchar(24) NOT NULL default '',
+ `name_japanese` varchar(24) NOT NULL default '',
+ `type` tinyint(2) unsigned NOT NULL default '0',
+ `price_buy` int(10) unsigned default NULL,
+ `price_sell` int(10) unsigned default NULL,
+ `weight` int(10) unsigned NOT NULL default '0',
+ `attack` mediumint(9) unsigned default NULL,
+ `defence` mediumint(9) unsigned default NULL,
+ `range` tinyint(2) unsigned default NULL,
+ `slots` tinyint(1) unsigned default NULL,
+ `equip_jobs` mediumint(8) unsigned default NULL,
+ `equip_genders` tinyint(1) unsigned default NULL,
+ `equip_locations` smallint(4) unsigned default NULL,
+ `weapon_level` tinyint(1) unsigned default NULL,
+ `equip_level` tinyint(3) unsigned default NULL,
+ `view` tinyint(3) unsigned default NULL,
+ `script_use` text,
+ `script_equip` text,
+ PRIMARY KEY (`id`)
+) TYPE=MyISAM;
+
+CREATE TABLE `mob_db` (
+ `ID` mediumint(9) NOT NULL default '0',
+ `Name` text NOT NULL,
+ `Name2` text NOT NULL,
+ `LV` smallint(6) NOT NULL default '0',
+ `HP` mediumint(9) NOT NULL default '0',
+ `SP` mediumint(9) NOT NULL default '0',
+ `EXP` mediumint(9) NOT NULL default '0',
+ `JEXP` mediumint(9) NOT NULL default '0',
+ `Range1` tinyint(4) NOT NULL default '0',
+ `ATK1` smallint(6) NOT NULL default '0',
+ `ATK2` smallint(6) NOT NULL default '0',
+ `DEF` smallint(6) NOT NULL default '0',
+ `MDEF` smallint(6) NOT NULL default '0',
+ `STR` tinyint(4) NOT NULL default '0',
+ `AGI` tinyint(4) NOT NULL default '0',
+ `VIT` tinyint(4) NOT NULL default '0',
+ `INT` tinyint(4) NOT NULL default '0',
+ `DEX` tinyint(4) NOT NULL default '0',
+ `LUK` tinyint(4) NOT NULL default '0',
+ `Range2` tinyint(4) NOT NULL default '0',
+ `Range3` tinyint(4) NOT NULL default '0',
+ `Scale` tinyint(4) NOT NULL default '0',
+ `Race` tinyint(4) NOT NULL default '0',
+ `Element` tinyint(4) NOT NULL default '0',
+ `Mode` smallint(6) NOT NULL default '0',
+ `Speed` smallint(6) NOT NULL default '0',
+ `ADelay` smallint(6) NOT NULL default '0',
+ `aMotion` smallint(6) NOT NULL default '0',
+ `dMotion` smallint(6) NOT NULL default '0',
+ `Drop1id` mediumint(9) NOT NULL default '0',
+ `Drop1per` mediumint(9) NOT NULL default '0',
+ `Drop2id` mediumint(9) NOT NULL default '0',
+ `Drop2per` mediumint(9) NOT NULL default '0',
+ `Drop3id` mediumint(9) NOT NULL default '0',
+ `Drop3per` mediumint(9) NOT NULL default '0',
+ `Drop4id` mediumint(9) NOT NULL default '0',
+ `Drop4per` mediumint(9) NOT NULL default '0',
+ `Drop5id` mediumint(9) NOT NULL default '0',
+ `Drop5per` mediumint(9) NOT NULL default '0',
+ `Drop6id` mediumint(9) NOT NULL default '0',
+ `Drop6per` mediumint(9) NOT NULL default '0',
+ `Drop7id` mediumint(9) NOT NULL default '0',
+ `Drop7per` mediumint(9) NOT NULL default '0',
+ `Drop8id` mediumint(9) NOT NULL default '0',
+ `Drop8per` mediumint(9) NOT NULL default '0',
+ `MEXP` mediumint(9) NOT NULL default '0',
+ `ExpPer` mediumint(9) NOT NULL default '0',
+ `MVP1id` mediumint(9) NOT NULL default '0',
+ `MVP1per` mediumint(9) NOT NULL default '0',
+ `MVP2id` mediumint(9) NOT NULL default '0',
+ `MVP2per` mediumint(9) NOT NULL default '0',
+ `MVP3id` mediumint(9) NOT NULL default '0',
+ `MVP3per` mediumint(9) NOT NULL default '0'
+) TYPE=MyISAM;
+
+INSERT INTO eragnarok.storage(`id`, `account_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) SELECT `id`, `account_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.storage;
+
+ INSERT INTO eragnarok.cart_inventory(`id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) SELECT `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` from ragnarok.cart_inventory;
+
+INSERT INTO eragnarok.char( `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`, `online`) 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`, `online` from ragnarok.char;
+
+INSERT INTO eragnarok.charlog( `time`, `char_msg`, `account_id`, `char_num`, `name`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hair`, `hair_color` ) SELECT `time`, `char_msg`, `account_id`, `char_num`, `name`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hair`, `hair_color` from ragnarok.charlog;
+
+INSERT INTO eragnarok.global_reg_value ( `char_id`, `str`, `value`, `type`, `account_id`) SELECT `char_id`, `str`, `value`, `type`, `account_id` from ragnarok.global_reg_value ;
+
+INSERT INTO eragnarok.guild( `guild_id`, `name`, `master`, `guild_lv`, `connect_member`, `max_member`, `average_lv`, `exp`, `next_exp`, `skill_point`, `castle_id`, `mes1`, `mes2`, `emblem_len`, `emblem_id`, `emblem_data` ) SELECT `guild_id`, `name`, `master`, `guild_lv`, `connect_member`, `max_member`, `average_lv`, `exp`, `next_exp`, `skill_point`, `castle_id`, `mes1`, `mes2`, `emblem_len`, `emblem_id`, `emblem_data` from ragnarok.guild;
+
+INSERT INTO eragnarok.guild_alliance ( `guild_id`, `opposition`, `alliance_id`, `name` ) SELECT `guild_id`, `opposition`, `alliance_id`, `name` from ragnarok.guild_alliance ;
+
+INSERT INTO eragnarok.guild_castle ( `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7` ) SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7` from ragnarok.guild_castle ;
+
+INSERT INTO eragnarok.guild_expulsion ( `guild_id`, `name`, `mes`, `acc`, `account_id`, `rsv1`, `rsv2`, `rsv3` ) SELECT `guild_id`, `name`, `mes`, `acc`, `account_id`, `rsv1`, `rsv2`, `rsv3` from ragnarok.guild_expulsion ;
+
+INSERT INTO eragnarok.guild_member ( `guild_id`, `account_id`, `char_id`, `hair`, `hair_color`, `gender`, `class`, `lv`, `exp`, `exp_payper`, `online`, `position`, `rsv1`, `rsv2`, `name` ) SELECT `guild_id`, `account_id`, `char_id`, `hair`, `hair_color`, `gender`, `class`, `lv`, `exp`, `exp_payper`, `online`, `position`, `rsv1`, `rsv2`, `name` from ragnarok.guild_member ;
+
+INSERT INTO eragnarok.guild_position ( `guild_id`, `position`, `name`, `mode`, `exp_mode` ) SELECT `guild_id`, `position`, `name`, `mode`, `exp_mode` from ragnarok.guild_position ;
+
+INSERT INTO eragnarok.guild_skill ( `guild_id`, `id`, `lv` ) SELECT `guild_id`, `id`, `lv` from ragnarok.guild_skill ;
+
+INSERT INTO eragnarok.guild_storage ( `id`, `guild_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` ) SELECT `id`, `guild_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.guild_storage ;
+
+INSERT INTO eragnarok.interlog ( `time`, `log` ) SELECT `time`, `log` from ragnarok.interlog ;
+
+INSERT INTO eragnarok.inventory ( `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` ) SELECT `id`, `char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` from ragnarok.inventory ;
+
+INSERT INTO eragnarok.ipbanlist ( `list`, `btime`, `rtime`, `reason` ) SELECT `list`, `btime`, `rtime`, `reason` from ragnarok.ipbanlist ;
+
+
+# INSERT INTO eragnarok.login_error ( `err_id`, `reason` ) SELECT `err_id`, `reason` from ragnarok.login_error ;
+
+INSERT INTO eragnarok.loginlog ( `time`, `ip`, `user`, `rcode`, `log` ) SELECT `time`, `ip`, `user`, `rcode`, `log` from ragnarok.loginlog ;
+
+INSERT INTO eragnarok.memo ( `memo_id`, `char_id`, `map`, `x`, `y` ) SELECT `memo_id`, `char_id`, `map`, `x`, `y` from ragnarok.memo ;
+
+INSERT INTO eragnarok.party ( `party_id`, `name`, `exp`, `item`, `leader_id` ) SELECT `party_id`, `name`, `exp`, `item`, `leader_id` from ragnarok.party ;
+
+INSERT INTO eragnarok.pet ( `pet_id`, `class`, `name`, `account_id`, `char_id`, `level`, `egg_id`, `equip`, `intimate`, `hungry`, `rename_flag`, `incuvate` ) SELECT `pet_id`, `class`, `name`, `account_id`, `char_id`, `level`, `egg_id`, `equip`, `intimate`, `hungry`, `rename_flag`, `incuvate` from ragnarok.pet ;
+
+INSERT INTO eragnarok.ragsrvinfo ( `index`, `name`, `exp`, `jexp`, `drop` ) SELECT `index`, `name`, `exp`, `jexp`, `drop` from ragnarok.ragsrvinfo ;
+
+INSERT INTO eragnarok.skill ( `char_id`, `id`, `lv` ) SELECT `char_id`, `id`, `lv` from ragnarok.skill ;
+
+INSERT INTO eragnarok.sstatus ( `index`, `name`, `user` ) SELECT `index`, `name`, `user` from ragnarok.sstatus ;
+
+
+# INSERT INTO eragnarok.abra_db ( `ID`, `Dummy`, `Req_Lvl`, `Per`, `Comment`) SELECT `ID`, `Dummy`, `Req_Lvl`, `Per`, `Comment` from ragnarok.abra_db;
+
+# INSERT INTO eragnarok.attr_fix ( `Level`, `None`, `Water`, `Earth`, `Fire`, `Wind`, `Poison`, `Saint`, `Darkness`, `Sense`, `Immortality`, `Comment`) SELECT `Level`, `None`, `Water`, `Earth`, `Fire`, `Wind`, `Poison`, `Saint`, `Darkness`, `Sense`, `Immortality`, `Comment` from ragnarok.attr_fix;
+
+# INSERT INTO eragnarok.cast_db ( `ID`, `Cast_List`, `Delay_List`, `Upkeep_Time`, `Upkeep_Time2`, `Comment` ) SELECT `ID`, `Cast_List`, `Delay_List`, `Upkeep_Time`, `Upkeep_Time2`, `Comment` from ragnarok.cast_db;
+
+#INSERT INTO eragnarok.castle_db ( `CastleID`, `map_name`, `castle_name`, `switch_flag`, `Comment` ) SELECT `CastleID`, `map_name`, `castle_name`, `switch_flag`, `Comment` from ragnarok.castle_db;
+
+#INSERT INTO eragnarok.create_arrow_db ( `SourceID`, `MakeID1`, `MakeNum1`, `MakeID2`, `MakeNum2`, `MakeID3`, `MakeNum3`, `MakeID4`, `MakeNum4`, `MakeID5`, `MakeNum5`, `Comment` ) SELECT `SourceID`, `MakeID1`, `MakeNum1`, `MakeID2`, `MakeNum2`, `MakeID3`, `MakeNum3`, `MakeID4`, `MakeNum4`, `MakeID5`, `MakeNum5`, `Comment` from ragnarok.create_arrow_db;
+
+#INSERT INTO eragnarok.exp ( `EXP1`, `EXP2`, `EXP3`, `EXP4`, `EXP5`, `EXP6`, `EXP7`, `EXP8`, `EXP9`, `EXP10`, `EXP11`, `EXP12`, `EXP13`, `EXP14` ) SELECT `EXP1`, `EXP2`, `EXP3`, `EXP4`, `EXP5`, `EXP6`, `EXP7`, `EXP8`, `EXP9`, `EXP10`, `EXP11`, `EXP12`, `EXP13`, `EXP14` from ragnarok.exp;
+
+#INSERT INTO eragnarok.exp_guild ( `Level`, `EXP`, `Comment` ) SELECT `Level`, `EXP`, `Comment` from ragnarok.exp_guild;
+
+#INSERT INTO eragnarok.item_bluebox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_bluebox;
+
+#INSERT INTO eragnarok.item_cardalbum ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_cardalbum;
+
+INSERT INTO eragnarok.item_db2 ( `ID`, `Name`, `Name2`, `Type`, `Price`, `Sell`, `Weight`, `ATK`, `DEF`, `Range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `View`, `UseScript`, `EquipScript`, `Comment` ) SELECT `ID`, `Name`, `Name2`, `Type`, `Price`, `Sell`, `Weight`, `ATK`, `DEF`, `Range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `View`, `UseScript`, `EquipScript`, `Comment` from ragnarok.item_db2;
+
+# INSERT INTO eragnarok.item_giftbox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_giftbox;
+
+#INSERT INTO eragnarok.item_scroll ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_scroll;
+
+#INSERT INTO eragnarok.item_violetbox ( `NameID`, `item_name`, `rate`, `Comment` ) SELECT `NameID`, `item_name`, `rate`, `Comment` from ragnarok.item_violetbox;
+
+#INSERT INTO eragnarok.job_db1 ( `Class_ID`, `Weight`, `HP`, `HP2`, `SP`, `Empty`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Rod`, `Club`, `Stick`, `Bow`, `Fist`, `Musical`, `Whip`, `Book`, `Katar`, `Comment` ) SELECT `Class_ID`, `Weight`, `HP`, `HP2`, `SP`, `Empty`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Rod`, `Club`, `Stick`, `Bow`, `Fist`, `Musical`, `Whip`, `Book`, `Katar`, `Comment` from ragnarok.job_db1;
+
+INSERT INTO eragnarok.mob_boss ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_boss;
+
+INSERT INTO eragnarok.mob_branch ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_branch;
+
+INSERT INTO eragnarok.mob_db2 ( `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7d`, `Drop7per`, `Drop8id`, `Drop8per`, `Item1`, `Item2`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`, `Comment` ) SELECT `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7d`, `Drop7per`, `Drop8id`, `Drop8per`, `Item1`, `Item2`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`, `Comment` from ragnarok.mob_db2;
+
+INSERT INTO eragnarok.mob_poring ( `MobID`, `MobName`, `Rate`, `Comment` ) SELECT `MobID`, `MobName`, `Rate`, `Comment` from ragnarok.mob_poring;
+
+INSERT INTO eragnarok.mob_skill_db ( `Mob_ID`, `Dummy`, `State`, `Skill_ID`, `Skill_LV`, `Use_Rate`, `Cast_Time`, `Delay`, `Disturbance`, `Target`, `Condition_Type`, `Condition_Value`, `Value1`, `Value2`, `Value3`, `Value4`, `Value5`, `Comment` ) SELECT `Mob_ID`, `Dummy`, `State`, `Skill_ID`, `Skill_LV`, `Use_Rate`, `Cast_Time`, `Delay`, `Disturbance`, `Target`, `Condition_Type`, `Condition_Value`, `Value1`, `Value2`, `Value3`, `Value4`, `Value5`, `Comment` from ragnarok.mob_skill_db;
+
+#INSERT INTO eragnarok.pet_db ( `MobID`, `Name`, `JName`, `ItemID`, `EggID`, `AcceID`, `FoodID`, `Fullness`, `HungryDeray`, `R_Hungry`, `R_Full`, `Intimate`, `Die`, `Capture`, `Speed`, `S_Performance`, `Talk_Convert_Class`, `Attack_Rate`, `Defence_Attack_Rate`, `Change_Target_Rate`, `Pet_Script`, `Comment` ) SELECT `MobID`, `Name`, `JName`, `ItemID`, `EggID`, `AcceID`, `FoodID`, `Fullness`, `HungryDeray`, `R_Hungry`, `R_Full`, `Intimate`, `Die`, `Capture`, `Speed`, `S_Performance`, `Talk_Convert_Class`, `Attack_Rate`, `Defence_Attack_Rate`, `Change_Target_Rate`, `Pet_Script`, `Comment` from ragnarok.pet_db;
+
+#INSERT INTO eragnarok.produce_db ( `ID`, `ItemLV`, `RequireSkill`, `MaterialID1`, `MaterialAmount1`, `MaterialID2`, `MaterialAmount2`, `MaterialID3`, `MaterialAmount3`, `MaterialID4`, `MaterialAmount4`, `MaterialID5`, `MaterialAmount5`, `Comment` ) SELECT `ID`, `ItemLV`, `RequireSkill`, `MaterialID1`, `MaterialAmount1`, `MaterialID2`, `MaterialAmount2`, `MaterialID3`, `MaterialAmount3`, `MaterialID4`, `MaterialAmount4`, `MaterialID5`, `MaterialAmount5`, `Comment` from ragnarok.produce_db;
+
+#INSERT INTO eragnarok.refine_db ( `Refine_Bonus`, `Danger_Bonus`, `Safe_Limit`, `RefineChance1`, `RefineChance2`, `RefineChance3`, `RefineChance4`, `RefineChance5`, `RefineChance6`, `RefineChance7`, `RefineChance8`, `RefineChance9`, `RefineChance10`, `Comment` ) SELECT `Refine_Bonus`, `Danger_Bonus`, `Safe_Limit`, `RefineChance1`, `RefineChance2`, `RefineChance3`, `RefineChance4`, `RefineChance5`, `RefineChance6`, `RefineChance7`, `RefineChance8`, `RefineChance9`, `RefineChance10`, `Comment` from ragnarok.refine_db;
+
+#INSERT INTO eragnarok.size_fix ( `Element`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Club`, `Whip`, `Stick`, `Bow`, `Fist`, `Musical`, `Rod`, `Book`, `Katar`, `Comment` ) SELECT `Element`, `Dagger`, `Sword`, `Two_Handed_Sword`, `Spear`, `Two_Handed_Spear`, `Axe`, `Two_Handed_Axe`, `Club`, `Whip`, `Stick`, `Bow`, `Fist`, `Musical`, `Rod`, `Book`, `Katar`, `Comment` from ragnarok.size_fix;
+
+#INSERT INTO eragnarok.skill_db ( `ID`, `Range`, `Hit`, `inf`, `nk`, `max`, `list_num`, `castcancel`, `cast_defence_rate`, `inf2`, `maxcount`, `skill_type`, `blow_count`, `Comment` ) SELECT `ID`, `Range`, `Hit`, `inf`, `nk`, `max`, `list_num`, `castcancel`, `cast_defence_rate`, `inf2`, `maxcount`, `skill_type`, `blow_count`, `Comment` from ragnarok.skill_db;
+
+#INSERT INTO eragnarok.skill_require_db ( `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`, `Comment` ) SELECT `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`, `Comment` from ragnarok.skill_require_db;
+
+#INSERT INTO eragnarok.skill_tree ( `Upper`, `JobNo`, `Skill_ID`, `MaxLV`, `Skill_ID_Require1`, `Skill_LV_Require1`, `Skill_ID_Require2`, `Skill_LV_Require2`, `Skill_ID_Require3`, `Skill_LV_Require3`, `Skill_ID_Require4`, `Skill_LV_Require4`, `Skill_ID_Require5`, `Skill_LV_Require5`, `Comment` ) SELECT `Upper`, `JobNo`, `Skill_ID`, `MaxLV`, `Skill_ID_Require1`, `Skill_LV_Require1`, `Skill_ID_Require2`, `Skill_LV_Require2`, `Skill_ID_Require3`, `Skill_LV_Require3`, `Skill_ID_Require4`, `Skill_LV_Require4`, `Skill_ID_Require5`, `Skill_LV_Require5`, `Comment` from ragnarok.skill_tree;
+
+INSERT INTO eragnarok.item_db ( `id`, `name_english`, `name_japanese`, `type`, `price_buy`, `price_sell`, `weight`, `attack`, `defence`, `range`, `slots`, `equip_jobs`, `equip_genders`, `equip_locations`, `weapon_level`, `equip_level`, `view`, `script_use`, `script_equip` ) SELECT `id`, `Name`, `Name2`, `type`, `Price`, `Sell`, `Weight`, `Atk`, `Def`, `range`, `Slot`, `Job`, `Gender`, `Loc`, `wLV`, `eLV`, `view`, `UseScript`, `EquipScript` from ragnarok.item_db;
+
+UPDATE item_db SET price_sell = price_buy/2;
+
+INSERT INTO eragnarok.mob_db (`ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7id`, `Drop7per`, `Drop8id`, `Drop8per`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per`) SELECT `ID`, `Name`, `Name2`, `LV`, `HP`, `SP`, `EXP`, `JEXP`, `Range1`, `ATK1`, `ATK2`, `DEF`, `MDEF`, `STR`, `AGI`, `VIT`, `INT`, `DEX`, `LUK`, `Range2`, `Range3`, `Scale`, `Race`, `Element`, `Mode`, `Speed`, `ADelay`, `aMotion`, `dMotion`, `Drop1id`, `Drop1per`, `Drop2id`, `Drop2per`, `Drop3id`, `Drop3per`, `Drop4id`, `Drop4per`, `Drop5id`, `Drop5per`, `Drop6id`, `Drop6per`, `Drop7id`, `Drop7per`, `Drop8id`, `Drop8per`, `MEXP`, `ExpPer`, `MVP1id`, `MVP1per`, `MVP2id`, `MVP2per`, `MVP3id`, `MVP3per` from ragnarok.mob_db;
+
+DELETE FROM eragnarok.login;
+
+INSERT INTO eragnarok.login ( `account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level` ) SELECT `account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level` from ragnarok.login ;
diff --git a/sql-files/upgrade_0.5.2_database.sql b/sql-files/upgrade_0.5.2_database.sql
index 266207104..4d328acf6 100644
--- a/sql-files/upgrade_0.5.2_database.sql
+++ b/sql-files/upgrade_0.5.2_database.sql
@@ -1 +1 @@
-# Upgrade database tables for eAthena 0.5.2 to 1.0 RC 2
+# Upgrade database tables for eAthena 0.5.2 to 1.0 RC 2
diff --git a/sql-files/upgrade_0.5.2_main.sql b/sql-files/upgrade_0.5.2_main.sql
index 76e092c4f..e11d226ba 100644
--- a/sql-files/upgrade_0.5.2_main.sql
+++ b/sql-files/upgrade_0.5.2_main.sql
@@ -1,62 +1,62 @@
-# Upgrade login and character server tables for eAthena 0.5.2 to 1.0 RC 2
-
-ALTER TABLE `cart_inventory` ADD `broken` int(11) NOT NULL default '0';
-
-ALTER TABLE `char` MODIFY `base_level` bigint(20) unsigned NOT NULL default '1';
-ALTER TABLE `char` MODIFY `job_level` bigint(20) unsigned NOT NULL default '1';
-ALTER TABLE `char` MODIFY `base_exp` bigint(20) NOT NULL default '0';
-ALTER TABLE `char` MODIFY `job_exp` bigint(20) NOT NULL default '0';
-ALTER TABLE `char` ADD `partner_id` int(11) NOT NULL default '0';
-
-ALTER TABLE `charlog` MODIFY `str` int(11) unsigned NOT NULL default '0';
-ALTER TABLE `charlog` MODIFY `agi` int(11) unsigned NOT NULL default '0';
-ALTER TABLE `charlog` MODIFY `vit` int(11) unsigned NOT NULL default '0';
-ALTER TABLE `charlog` MODIFY `int` int(11) unsigned NOT NULL default '0';
-ALTER TABLE `charlog` MODIFY `dex` int(11) unsigned NOT NULL default '0';
-ALTER TABLE `charlog` MODIFY `luk` int(11) unsigned NOT NULL default '0';
-
-ALTER TABLE `global_reg_value` MODIFY `value` varchar(255) NOT NULL default '0';
-ALTER TABLE `global_reg_value` ADD PRIMARY KEY (`char_id`, `str`, `account_id`);
-ALTER TABLE `global_reg_value` DROP INDEX `account_id`;
-ALTER TABLE `global_reg_value` ADD INDEX `account_id` (`account_id`);
-
-ALTER TABLE `guild_castle` ADD `gHP0` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP1` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP2` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP3` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP4` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP5` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP6` int(11) NOT NULL default '0';
-ALTER TABLE `guild_castle` ADD `gHP7` int(11) NOT NULL default '0';
-
-ALTER TABLE `guild_member` MODIFY `exp` bigint(20) NOT NULL default '0';
-
-ALTER TABLE `guild_storage` ADD `broken` int(11) NOT NULL default '0';
-
-ALTER TABLE `inventory` ADD `broken` int(11) NOT NULL default '0';
-
-ALTER TABLE `login` MODIFY `account_id` int(11) NOT NULL default '0' AUTO_INCREMENT, AUTO_INCREMENT=1000057;
-ALTER TABLE `login` MODIFY `userid` varchar(255) NOT NULL default '';
-ALTER TABLE `login` MODIFY `user_pass` varchar(32) NOT NULL default '';
-ALTER TABLE `login` ADD `error_message` int(11) NOT NULL default '0';
-ALTER TABLE `login` ADD `connect_until` int(11) NOT NULL default '0';
-ALTER TABLE `login` ADD `last_ip` varchar(100) NOT NULL default '';
-ALTER TABLE `login` ADD `memo` int(11) NOT NULL default '0';
-ALTER TABLE `login` ADD `ban_until` int(11) NOT NULL default '0';
-ALTER TABLE `login` ADD `state` int(11) NOT NULL default '0';
-ALTER TABLE `login` DROP INDEX `account_id`;
-ALTER TABLE `login` DROP INDEX `userid`;
-ALTER TABLE `login` ADD PRIMARY KEY (`account_id`), ADD INDEX `name` (`userid`);
-
-CREATE TABLE `login_error` (
- `err_id` int(11) NOT NULL default '0',
- `reason` varchar(100) NOT NULL default 'Unknown',
- PRIMARY KEY (`err_id`)
-) TYPE=MyISAM;
-
-ALTER TABLE `ragsrvinfo` DROP `type`, DROP `text1`, DROP `text2`, DROP `text3`, DROP `text4`;
-ALTER TABLE `ragsrvinfo` ADD `motd` varchar(255) NOT NULL default '';
-
-ALTER TABLE `skill` ADD PRIMARY KEY (`char_id`,`id`);
-
-ALTER TABLE `storage` ADD `broken` int(11) NOT NULL default '0';
+# Upgrade login and character server tables for eAthena 0.5.2 to 1.0 RC 2
+
+ALTER TABLE `cart_inventory` ADD `broken` int(11) NOT NULL default '0';
+
+ALTER TABLE `char` MODIFY `base_level` bigint(20) unsigned NOT NULL default '1';
+ALTER TABLE `char` MODIFY `job_level` bigint(20) unsigned NOT NULL default '1';
+ALTER TABLE `char` MODIFY `base_exp` bigint(20) NOT NULL default '0';
+ALTER TABLE `char` MODIFY `job_exp` bigint(20) NOT NULL default '0';
+ALTER TABLE `char` ADD `partner_id` int(11) NOT NULL default '0';
+
+ALTER TABLE `charlog` MODIFY `str` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `charlog` MODIFY `agi` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `charlog` MODIFY `vit` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `charlog` MODIFY `int` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `charlog` MODIFY `dex` int(11) unsigned NOT NULL default '0';
+ALTER TABLE `charlog` MODIFY `luk` int(11) unsigned NOT NULL default '0';
+
+ALTER TABLE `global_reg_value` MODIFY `value` varchar(255) NOT NULL default '0';
+ALTER TABLE `global_reg_value` ADD PRIMARY KEY (`char_id`, `str`, `account_id`);
+ALTER TABLE `global_reg_value` DROP INDEX `account_id`;
+ALTER TABLE `global_reg_value` ADD INDEX `account_id` (`account_id`);
+
+ALTER TABLE `guild_castle` ADD `gHP0` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP1` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP2` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP3` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP4` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP5` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP6` int(11) NOT NULL default '0';
+ALTER TABLE `guild_castle` ADD `gHP7` int(11) NOT NULL default '0';
+
+ALTER TABLE `guild_member` MODIFY `exp` bigint(20) NOT NULL default '0';
+
+ALTER TABLE `guild_storage` ADD `broken` int(11) NOT NULL default '0';
+
+ALTER TABLE `inventory` ADD `broken` int(11) NOT NULL default '0';
+
+ALTER TABLE `login` MODIFY `account_id` int(11) NOT NULL default '0' AUTO_INCREMENT, AUTO_INCREMENT=1000057;
+ALTER TABLE `login` MODIFY `userid` varchar(255) NOT NULL default '';
+ALTER TABLE `login` MODIFY `user_pass` varchar(32) NOT NULL default '';
+ALTER TABLE `login` ADD `error_message` int(11) NOT NULL default '0';
+ALTER TABLE `login` ADD `connect_until` int(11) NOT NULL default '0';
+ALTER TABLE `login` ADD `last_ip` varchar(100) NOT NULL default '';
+ALTER TABLE `login` ADD `memo` int(11) NOT NULL default '0';
+ALTER TABLE `login` ADD `ban_until` int(11) NOT NULL default '0';
+ALTER TABLE `login` ADD `state` int(11) NOT NULL default '0';
+ALTER TABLE `login` DROP INDEX `account_id`;
+ALTER TABLE `login` DROP INDEX `userid`;
+ALTER TABLE `login` ADD PRIMARY KEY (`account_id`), ADD INDEX `name` (`userid`);
+
+CREATE TABLE `login_error` (
+ `err_id` int(11) NOT NULL default '0',
+ `reason` varchar(100) NOT NULL default 'Unknown',
+ PRIMARY KEY (`err_id`)
+) TYPE=MyISAM;
+
+ALTER TABLE `ragsrvinfo` DROP `type`, DROP `text1`, DROP `text2`, DROP `text3`, DROP `text4`;
+ALTER TABLE `ragsrvinfo` ADD `motd` varchar(255) NOT NULL default '';
+
+ALTER TABLE `skill` ADD PRIMARY KEY (`char_id`,`id`);
+
+ALTER TABLE `storage` ADD `broken` int(11) NOT NULL default '0';
diff --git a/sql-files/upgrade_1.0.0-rc1_main.sql b/sql-files/upgrade_1.0.0-rc1_main.sql
index 4af7f6f5a..0ae05933f 100644
--- a/sql-files/upgrade_1.0.0-rc1_main.sql
+++ b/sql-files/upgrade_1.0.0-rc1_main.sql
@@ -1,3 +1,3 @@
-# Upgrade login and character server tables for eAthena 1.0 RC 1 to 1.0 RC 2
-
-ALTER TABLE `login` MODIFY `account_id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2000000;
+# Upgrade login and character server tables for eAthena 1.0 RC 1 to 1.0 RC 2
+
+ALTER TABLE `login` MODIFY `account_id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2000000;
diff --git a/sql-files/upgrade_1.0.0-rc2_database.sql b/sql-files/upgrade_1.0.0-rc2_database.sql
index ad6019df7..e1b041c97 100644
--- a/sql-files/upgrade_1.0.0-rc2_database.sql
+++ b/sql-files/upgrade_1.0.0-rc2_database.sql
@@ -1,4 +1,4 @@
-# Upgrade database tables for eAthena 1.0 RC2
-
-ALTER TABLE `item_db` MODIFY `name_english` varchar(28);
-ALTER TABLE `item_db` MODIFY `name_japanese` varchar(28);
+# Upgrade database tables for eAthena 1.0 RC2
+
+ALTER TABLE `item_db` MODIFY `name_english` varchar(28);
+ALTER TABLE `item_db` MODIFY `name_japanese` varchar(28);
diff --git a/sql-files/upgrade_1.0.0-rc5_database.sql b/sql-files/upgrade_1.0.0-rc5_database.sql
index b6f8ee6d8..8b60b7216 100644
--- a/sql-files/upgrade_1.0.0-rc5_database.sql
+++ b/sql-files/upgrade_1.0.0-rc5_database.sql
@@ -1,4 +1,4 @@
-# Upgrade database tables for eAthena 1.0 RC2
-
-ALTER TABLE `item_db` MODIFY `name_english` varchar(24);
-ALTER TABLE `item_db` MODIFY `name_japanese` varchar(24);
+# Upgrade database tables for eAthena 1.0 RC2
+
+ALTER TABLE `item_db` MODIFY `name_english` varchar(24);
+ALTER TABLE `item_db` MODIFY `name_japanese` varchar(24);
diff --git a/sql-files/upgrade_817.sql b/sql-files/upgrade_817.sql
index a407d2669..305254388 100644
--- a/sql-files/upgrade_817.sql
+++ b/sql-files/upgrade_817.sql
@@ -1,103 +1,103 @@
-# Upgrade database for version 817 to 0.5.2
-
-#DROP TABLE `charlog`;
-#DROP TABLE `interlog`;
-#DROP TABLE `guild_storage`;
-
-ALTER TABLE `global_reg_value` DROP COLUMN `type`;
-ALTER TABLE `global_reg_value` DROP COLUMN `account_id`;
-
-# --------------------------------------------------------------
-# Fix the bug that some fields cannot exceed 127
-ALTER TABLE `char` MODIFY `str` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `agi` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `vit` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `int` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `dex` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `luk` int(11) unsigned NOT NULL;
-ALTER TABLE `char` MODIFY `base_level` int(11) unsigned NOT NULL default '1';
-ALTER TABLE `char` MODIFY `job_level` int(11) unsigned NOT NULL default '1';
-
-# --------------------------------------------------------------------
-# Bug fix : wrong index
-ALTER TABLE `storage` DROP INDEX `char_id`, ADD INDEX (`account_id`);
-
-# ----------------------------------------------------------------
-# Add log tables
-
-
-# Table: `charlog`
-#
-CREATE TABLE `charlog` (
- `time` datetime NOT NULL default '0000-00-00 00:00:00',
- `char_msg` varchar(255) NOT NULL default 'char select',
- `account_id` int(11) NOT NULL default '0',
- `char_num` tinyint(4) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `str` int(11) unsigned NOT NULL default '0',
- `agi` int(11) unsigned NOT NULL default '0',
- `vit` int(11) unsigned NOT NULL default '0',
- `int` int(11) unsigned NOT NULL default '0',
- `dex` int(11) unsigned NOT NULL default '0',
- `luk` int(11) unsigned NOT NULL default '0',
- `hair` tinyint(4) NOT NULL default '0',
- `hair_color` int(11) NOT NULL default '0'
-) TYPE=MyISAM;
-
-# Table: 'interlog'
-#
-CREATE TABLE `interlog` (
- `time` datetime NOT NULL default '0000-00-00 00:00:00',
- `log` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
-# ----------------------------------------------------------
-# Add new table guild_storage
-
-
-# Table: 'guild_storage'
-#
-CREATE TABLE `guild_storage` (
- `id` int(10) unsigned NOT NULL auto_increment,
- `guild_id` int(11) NOT NULL default '0',
- `nameid` int(11) NOT NULL default '0',
- `amount` int(11) NOT NULL default '0',
- `equip` mediumint(8) unsigned NOT NULL default '0',
- `identify` smallint(6) NOT NULL default '0',
- `refine` tinyint(3) unsigned NOT NULL default '0',
- `attribute` tinyint(4) NOT NULL default '0',
- `card0` int(11) NOT NULL default '0',
- `card1` int(11) NOT NULL default '0',
- `card2` int(11) NOT NULL default '0',
- `card3` int(11) NOT NULL default '0',
- PRIMARY KEY (`id`),
- KEY `guild_id` (`guild_id`)
-) TYPE=MyISAM;
-
-# -------------------------------------------------------------------
-# Change global_reg_value table
-# type = 1 account_reg for all connected map-server ( like Chaos Loki Sakary )
-# type = 2 account_reg for current map-server
-# type = 3 char_reg for current map-server
-
-ALTER TABLE `global_reg_value` ADD `type` int(11) NOT NULL default '3';
-ALTER TABLE `global_reg_value` ADD `account_id` int(11) NOT NULL default '0', ADD INDEX (`account_id`);
-
-ALTER TABLE `guild_member` CHANGE `exp` `exp` BIGINT DEFAULT '0' NOT NULL;
-
-ALTER TABLE `login` CHANGE `email` `email` varchar(100) NOT NULL default 'user@athena';
-ALTER TABLE `login` CHANGE `user_pass` `user_pass` varchar(32) NOT NULL default '0';
-
-ALTER TABLE `char` CHANGE `class` `class` int(11) NOT NULL default '0';
-
-DROP TABLE `ragsrvinfo`;
-
-CREATE TABLE `ragsrvinfo` (
- `index` int(11) NOT NULL default '0',
- `name` varchar(255) NOT NULL default '',
- `exp` int(11) NOT NULL default '0',
- `jexp` int(11) NOT NULL default '0',
- `drop` int(11) NOT NULL default '0',
- `motd` varchar(255) NOT NULL default ''
-) TYPE=MyISAM;
-
+# Upgrade database for version 817 to 0.5.2
+
+#DROP TABLE `charlog`;
+#DROP TABLE `interlog`;
+#DROP TABLE `guild_storage`;
+
+ALTER TABLE `global_reg_value` DROP COLUMN `type`;
+ALTER TABLE `global_reg_value` DROP COLUMN `account_id`;
+
+# --------------------------------------------------------------
+# Fix the bug that some fields cannot exceed 127
+ALTER TABLE `char` MODIFY `str` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `agi` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `vit` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `int` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `dex` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `luk` int(11) unsigned NOT NULL;
+ALTER TABLE `char` MODIFY `base_level` int(11) unsigned NOT NULL default '1';
+ALTER TABLE `char` MODIFY `job_level` int(11) unsigned NOT NULL default '1';
+
+# --------------------------------------------------------------------
+# Bug fix : wrong index
+ALTER TABLE `storage` DROP INDEX `char_id`, ADD INDEX (`account_id`);
+
+# ----------------------------------------------------------------
+# Add log tables
+
+
+# Table: `charlog`
+#
+CREATE TABLE `charlog` (
+ `time` datetime NOT NULL default '0000-00-00 00:00:00',
+ `char_msg` varchar(255) NOT NULL default 'char select',
+ `account_id` int(11) NOT NULL default '0',
+ `char_num` tinyint(4) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `str` int(11) unsigned NOT NULL default '0',
+ `agi` int(11) unsigned NOT NULL default '0',
+ `vit` int(11) unsigned NOT NULL default '0',
+ `int` int(11) unsigned NOT NULL default '0',
+ `dex` int(11) unsigned NOT NULL default '0',
+ `luk` int(11) unsigned NOT NULL default '0',
+ `hair` tinyint(4) NOT NULL default '0',
+ `hair_color` int(11) NOT NULL default '0'
+) TYPE=MyISAM;
+
+# Table: 'interlog'
+#
+CREATE TABLE `interlog` (
+ `time` datetime NOT NULL default '0000-00-00 00:00:00',
+ `log` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
+# ----------------------------------------------------------
+# Add new table guild_storage
+
+
+# Table: 'guild_storage'
+#
+CREATE TABLE `guild_storage` (
+ `id` int(10) unsigned NOT NULL auto_increment,
+ `guild_id` int(11) NOT NULL default '0',
+ `nameid` int(11) NOT NULL default '0',
+ `amount` int(11) NOT NULL default '0',
+ `equip` mediumint(8) unsigned NOT NULL default '0',
+ `identify` smallint(6) NOT NULL default '0',
+ `refine` tinyint(3) unsigned NOT NULL default '0',
+ `attribute` tinyint(4) NOT NULL default '0',
+ `card0` int(11) NOT NULL default '0',
+ `card1` int(11) NOT NULL default '0',
+ `card2` int(11) NOT NULL default '0',
+ `card3` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `guild_id` (`guild_id`)
+) TYPE=MyISAM;
+
+# -------------------------------------------------------------------
+# Change global_reg_value table
+# type = 1 account_reg for all connected map-server ( like Chaos Loki Sakary )
+# type = 2 account_reg for current map-server
+# type = 3 char_reg for current map-server
+
+ALTER TABLE `global_reg_value` ADD `type` int(11) NOT NULL default '3';
+ALTER TABLE `global_reg_value` ADD `account_id` int(11) NOT NULL default '0', ADD INDEX (`account_id`);
+
+ALTER TABLE `guild_member` CHANGE `exp` `exp` BIGINT DEFAULT '0' NOT NULL;
+
+ALTER TABLE `login` CHANGE `email` `email` varchar(100) NOT NULL default 'user@athena';
+ALTER TABLE `login` CHANGE `user_pass` `user_pass` varchar(32) NOT NULL default '0';
+
+ALTER TABLE `char` CHANGE `class` `class` int(11) NOT NULL default '0';
+
+DROP TABLE `ragsrvinfo`;
+
+CREATE TABLE `ragsrvinfo` (
+ `index` int(11) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `exp` int(11) NOT NULL default '0',
+ `jexp` int(11) NOT NULL default '0',
+ `drop` int(11) NOT NULL default '0',
+ `motd` varchar(255) NOT NULL default ''
+) TYPE=MyISAM;
+
diff --git a/src/char/Makefile b/src/char/Makefile
index 228dc1945..0a2009333 100644
--- a/src/char/Makefile
+++ b/src/char/Makefile
@@ -1,17 +1,17 @@
-all: char-server
-txt: char-server
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/showmsg.h
-char-server: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $>
-
-char.o: char.c char.h inter.h int_pet.h $(COMMON_H) ../common/version.h
-inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h char.h $(COMMON_H)
-int_party.o: int_party.c int_party.h inter.h char.h $(COMMON_H)
-int_guild.o: int_guild.c int_guild.h int_storage.h inter.h char.h $(COMMON_H)
-int_storage.o: int_storage.c int_storage.h int_guild.h inter.h char.h $(COMMON_H)
-int_pet.o: int_pet.c int_pet.h inter.h char.h $(COMMON_H)
-
-clean:
- rm -f *.o ../../char-server
+all: char-server
+txt: char-server
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/showmsg.h
+char-server: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ $>
+
+char.o: char.c char.h inter.h int_pet.h $(COMMON_H) ../common/version.h
+inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h char.h $(COMMON_H)
+int_party.o: int_party.c int_party.h inter.h char.h $(COMMON_H)
+int_guild.o: int_guild.c int_guild.h int_storage.h inter.h char.h $(COMMON_H)
+int_storage.o: int_storage.c int_storage.h int_guild.h inter.h char.h $(COMMON_H)
+int_pet.o: int_pet.c int_pet.h inter.h char.h $(COMMON_H)
+
+clean:
+ rm -f *.o ../../char-server
diff --git a/src/char/char.c b/src/char/char.c
index 152c9247b..65dc56de2 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1,3435 +1,3435 @@
-// $Id: char.c,v 1.3 2004/09/13 16:52:16 Yor Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdarg.h>
-
-#include "core.h"
-#include "socket.h"
-#include "timer.h"
-#include "mmo.h"
-#include "version.h"
-#include "lock.h"
-#include "char.h"
-#include "showmsg.h"
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
-int anti_freeze_enable = 0;
-int ANTI_FREEZE_INTERVAL = 6;
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[24] = "Server";
-int login_ip_set_ = 0;
-char login_ip_str[16];
-int login_ip;
-int login_port = 6900;
-int char_ip_set_ = 0;
-char char_ip_str[16];
-int char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-int email_creation = 0; // disabled by default
-char char_txt[1024]="save/athena.txt";
-char backup_txt[1024]="save/backup.txt"; //By zanetheinsane
-char friends_txt[1024]="save/friends.txt"; // davidsiaw
-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";
-//Added for lan support
-char lan_map_ip[128];
-int subneti[4];
-int subnetmaski[4];
-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 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)
-};
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-#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)
-
-int char_id_count = 150000;
-struct mmo_charstatus *char_dat;
-int char_num, char_max;
-int max_connect_user = 0;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int start_zeny = 500;
-int start_weapon = 1201;
-int start_armor = 2301;
-
-// Initial position (it's possible to set it in conf file)
-struct point start_point = {"new_1-1.gat", 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_players_max;
-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
-
-struct online_chars {
- int char_id;
- int server;
-} *online_chars;
-
-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;
- struct timeval tv;
- 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 {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", localtime(&(tv.tv_sec)));
- sprintf(tmpstr + 19, ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
- vfprintf(logfp, tmpstr, ap);
- }
- fclose(logfp);
- }
- va_end(ap);
- }
- return 0;
-}
-
-//-----------------------------------------------------
-// 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;
-}
-
-//----------------------------------------------------------------------
-// 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 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].name, character_name) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(char_dat[i].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].name;
-
- return unknown_char_name;
-}
-
-/*---------------------------------------------------
- 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<20;i++)
- {
- str_p += sprintf(str_p, ",%d,%s", p->friend_id[i],p->friend_name[i]);
- }
- return 0;
-}
-
-//-------------------------------------------------
-// Function to create the character line (for save)
-//-------------------------------------------------
-int mmo_char_tostr(char *str, struct mmo_charstatus *p) {
- int i;
- char *str_p = str;
-
- // 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[0] == '\0') {
- memcpy(p->last_point.map, "prontera.gat", 16);
- 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%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,%d\t",
- 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,
- p->partner_id);
- for(i = 0; i < 10; i++)
- if (p->memo_point[i].map[0]) {
- str_p += sprintf(str_p, "%s,%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,%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]);
- }
- *(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,%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]);
- }
- *(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 < p->global_reg_num; i++)
- if (p->global_reg[i].str[0])
- str_p += sprintf(str_p, "%s,%d ", p->global_reg[i].str, p->global_reg[i].value);
- *(str_p++) = '\t';
-
- *str_p = '\0';
- return 0;
-}
-
-//-------------------------------------------------------------------------
-// Function to set the character from the line (at read of characters file)
-//-------------------------------------------------------------------------
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
- int tmp_int[256];
- int set, next, len, i;
-
- // initilialise character
- memset(p, '\0', sizeof(struct mmo_charstatus));
-
- // If it's not char structure of version 1008 and after
- if ((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,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%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], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
- tmp_int[39] = 0; // partner id
- // If not char structure from version 384 to 1007
- if ((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,%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], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
- // It's char structure of a version before 384
- tmp_int[26] = 0; // pet id
- 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[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
- set += 2;
- //printf("char: old char data ver.1\n");
- // Char structure of version 1007 or older
- } else {
- set++;
- //printf("char: old char data ver.2\n");
- }
- // Char structure of version 1008+
- } else {
- //printf("char: new char data ver.3\n");
- }
- if (set != 43)
- return 0;
-
- 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 = 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];
-
- // Some checks
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == p->char_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
- printf(" character id #%d -> new character not readed.\n", p->char_id);
- printf(" Character saved in log file.\033[0m\n");
- return -1;
- } else if (strcmp(char_dat[i].name, p->name) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
- printf(" character name '%s' -> new character not readed.\n", p->name);
- printf(" Character saved in log file.\033[0m\n");
- return -2;
- }
- }
-
- if (strcmpi(wisp_server_name, p->name) == 0) {
- printf("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
- printf(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name);
- printf(" 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);
- }
-
- if (str[next] == '\n' || str[next] == '\r')
- return 1; // V‹Kƒf[ƒ^
-
- next++;
-
- for(i = 0; str[next] && str[next] != '\t'; i++) {
- if (sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len) != 3)
- return -3;
- 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++) {
- if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if (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) == 11) {
- } else // invalid structure
- return -4;
- 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++) {
- if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if (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) == 11) {
- } else // invalid structure
- return -5;
- 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++) {
- 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, "%[^,],%d%n", p->global_reg[i].str, &p->global_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, ",%d%n", &p->global_reg[i].value, &len) == 1)
- i--;
- else
- return -7;
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
- p->global_reg_num = i;
-
- return 1;
-}
-//---------------------------------
-// Function to read friend list
-//---------------------------------
-
-int parse_friend_txt(struct mmo_charstatus *p)
-{
- char line[1024];
- int i,cid=0,temp[20];
- FILE *fp;
-
- // Open the file and look for the ID
- fp = fopen(friends_txt, "r");
-
-
- while(fgets(line, sizeof(line)-1, fp)) {
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- sscanf(line, "%d,%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%s",&cid,
- &temp[0],p->friend_name[0],
- &temp[1],p->friend_name[1],
- &temp[2],p->friend_name[2],
- &temp[3],p->friend_name[3],
- &temp[4],p->friend_name[4],
- &temp[5],p->friend_name[5],
- &temp[6],p->friend_name[6],
- &temp[7],p->friend_name[7],
- &temp[8],p->friend_name[8],
- &temp[9],p->friend_name[9],
- &temp[10],p->friend_name[10],
- &temp[11],p->friend_name[11],
- &temp[12],p->friend_name[12],
- &temp[13],p->friend_name[13],
- &temp[14],p->friend_name[14],
- &temp[15],p->friend_name[15],
- &temp[16],p->friend_name[16],
- &temp[17],p->friend_name[17],
- &temp[18],p->friend_name[18],
- &temp[19],p->friend_name[19]);
- if (cid == p->char_id)
- break;
- }
-
- // No register of friends list
- if (cid == 0) {
- fclose(fp);
- return 0;
- }
-
- // Fill in the list
-
- for (i=0; i<20; i++)
- p->friend_id[i] = temp[i];
-
- fclose(fp);
- return 0;
-}
-
-//---------------------------------
-// Function to read characters file
-//---------------------------------
-int mmo_char_init(void) {
- char line[65536];
- int i;
- int ret, line_count;
- FILE *fp;
-
- char_max = 256;
- char_dat = calloc(sizeof(struct mmo_charstatus) * 256, 1);
- if (!char_dat) {
- printf("out of memory: mmo_char_init (calloc of char_dat).\n");
- exit(1);
- }
- online_chars = calloc(sizeof(struct online_chars) * 256, 1);
- if (!online_chars) {
- printf("out of memory: mmo_char_init (calloc of online_chars).\n");
- exit(1);
- }
- for(i = 0; i < char_max; i++)
- {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
-
- char_num = 0;
-
- fp = fopen(char_txt, "r");
-
- if (fp == NULL) {
- printf("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 = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
- if (!char_dat) {
- printf("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);
- }
- online_chars = realloc(online_chars, sizeof(int) * char_max);
- if (!online_chars) {
- printf("Out of memory: mmo_char_init (realloc of online_chars).\n");
- char_log("Out of memory: mmo_char_init (realloc of online_chars)." RETCODE);
- exit(1);
- }
- for(i = char_max - 256; i < char_max; i++)
- {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
- }
-
- ret = mmo_char_fromstr(line, &char_dat[char_num]);
-
- // Initialize friends list
- parse_friend_txt(&char_dat[char_num]); // Grab friends for the character
-
- if (ret > 0) { // negative value or zero for errors
- if (char_dat[char_num].char_id >= char_id_count)
- char_id_count = char_dat[char_num].char_id + 1;
- char_num++;
- } else {
- printf("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count);
- printf(" -> 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) {
- printf("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) {
- printf("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 {
- printf("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[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].account_id < char_dat[id[j]].account_id) ||
- // if same account id, we sort by slot.
- (char_dat[i].account_id == char_dat[id[j]].account_id &&
- char_dat[i].char_num < char_dat[id[j]].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) {
- printf("WARNING: 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]]); // 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) {
- printf("WARNING: Server can't not create backup of characters file.\n");
- char_log("WARNING: Server can't not create backup of characters file." RETCODE);
- 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]]); // 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]]);
- fprintf(f_fp, "%s" RETCODE, f_line);
- }
-
- lock_fclose(f_fp, friends_txt, &lock);
-
- 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) {
- mmo_char_sync();
- inter_save();
- return 0;
-}
-
-//-----------------------------------
-// Function to create a new character
-//-----------------------------------
-int make_new_char(int fd, unsigned char *dat) {
- int i, j;
- struct char_session_data *sd;
-
- sd = session[fd]->session_data;
-
- // remove control characters from the name
- dat[23] = '\0';
- if (remove_control_chars(dat)) {
- 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(dat) < 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; dat[i]; i++)
- if (strchr(char_name_letters, dat[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 if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; dat[i]; i++)
- if (strchr(char_name_letters, dat[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] >= 20 || // 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;
- }
- }
-
- for(i = 0; i < char_num; i++) {
- if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, dat) == 0) ||
- (name_ignoring_case == 0 && strcmpi(char_dat[i].name, dat) == 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].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].account_id == sd->account_id && char_dat[i].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].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, dat) == 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], dat, char_dat[i].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 = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
- if (!char_dat) {
- printf("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);
- }
- online_chars = realloc(online_chars, sizeof(struct online_chars) * char_max);
- if (!online_chars) {
- printf("Out of memory: make_new_char (realloc of online_chars).\n");
- char_log("Out of memory: make_new_char (realloc of online_chars)." RETCODE);
- exit(1);
- }
- for(j = char_max - 256; j < char_max; j++) {
- online_chars[j].char_id = -1;
- online_chars[j].server = -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], 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]);
-
- memset(&char_dat[i], 0, sizeof(struct mmo_charstatus));
-
- char_dat[i].char_id = char_id_count++;
- char_dat[i].account_id = sd->account_id;
- char_dat[i].char_num = dat[30];
- strcpy(char_dat[i].name, dat);
- char_dat[i].class = 0;
- char_dat[i].base_level = 1;
- char_dat[i].job_level = 1;
- char_dat[i].base_exp = 0;
- char_dat[i].job_exp = 0;
- char_dat[i].zeny = start_zeny;
- char_dat[i].str = dat[24];
- char_dat[i].agi = dat[25];
- char_dat[i].vit = dat[26];
- char_dat[i].int_ = dat[27];
- char_dat[i].dex = dat[28];
- char_dat[i].luk = dat[29];
- char_dat[i].max_hp = 40 * (100 + char_dat[i].vit) / 100;
- char_dat[i].max_sp = 11 * (100 + char_dat[i].int_) / 100;
- char_dat[i].hp = char_dat[i].max_hp;
- char_dat[i].sp = char_dat[i].max_sp;
- char_dat[i].status_point = 0;
- char_dat[i].skill_point = 0;
- char_dat[i].option = 0;
- char_dat[i].karma = 0;
- char_dat[i].manner = 0;
- char_dat[i].party_id = 0;
- char_dat[i].guild_id = 0;
- char_dat[i].hair = dat[33];
- char_dat[i].hair_color = dat[31];
- char_dat[i].clothes_color = 0;
- char_dat[i].inventory[0].nameid = start_weapon; // Knife
- char_dat[i].inventory[0].amount = 1;
- char_dat[i].inventory[0].equip = 0x02;
- char_dat[i].inventory[0].identify = 1;
- char_dat[i].inventory[1].nameid = start_armor; // Cotton Shirt
- char_dat[i].inventory[1].amount = 1;
- char_dat[i].inventory[1].equip = 0x10;
- char_dat[i].inventory[1].identify = 1;
- char_dat[i].weapon = 1;
- char_dat[i].shield = 0;
- char_dat[i].head_top = 0;
- char_dat[i].head_mid = 0;
- char_dat[i].head_bottom = 0;
- memcpy(&char_dat[i].last_point, &start_point, sizeof(start_point));
- memcpy(&char_dat[i].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 0: return "Novice";
- case 1: return "Swordsman";
- case 2: return "Mage";
- case 3: return "Archer";
- case 4: return "Acolyte";
- case 5: return "Merchant";
- case 6: return "Thief";
- case 7: return "Knight";
- case 8: return "Priest";
- case 9: return "Wizard";
- case 10: return "Blacksmith";
- case 11: return "Hunter";
- case 12: return "Assassin";
- case 13: return "Knight 2";
- case 14: return "Crusader";
- case 15: return "Monk";
- case 16: return "Sage";
- case 17: return "Rogue";
- case 18: return "Alchemist";
- case 19: return "Bard";
- case 20: return "Dancer";
- case 21: return "Crusader 2";
- case 22: return "Wedding";
- case 23: return "Super Novice";
- case 4001: return "Novice High";
- case 4002: return "Swordsman High";
- case 4003: return "Mage High";
- case 4004: return "Archer High";
- case 4005: return "Acolyte High";
- case 4006: return "Merchant High";
- case 4007: return "Thief High";
- case 4008: return "Lord Knight";
- case 4009: return "High Priest";
- case 4010: return "High Wizard";
- case 4011: return "Whitesmith";
- case 4012: return "Sniper";
- case 4013: return "Assassin Cross";
- case 4014: return "Peko Knight";
- case 4015: return "Paladin";
- case 4016: return "Champion";
- case 4017: return "Professor";
- case 4018: return "Stalker";
- case 4019: return "Creator";
- case 4020: return "Clown";
- case 4021: return "Gypsy";
- case 4022: return "Peko Paladin";
- case 4023: return "Baby Novice";
- case 4024: return "Baby Swordsman";
- case 4025: return "Baby Mage";
- case 4026: return "Baby Archer";
- case 4027: return "Baby Acolyte";
- case 4028: return "Baby Merchant";
- case 4029: return "Baby Thief";
- case 4030: return "Baby Knight";
- case 4031: return "Baby Priest";
- case 4032: return "Baby Wizard";
- case 4033: return "Baby Blacksmith";
- case 4034: return "Baby Hunter";
- case 4035: return "Baby Assassin";
- case 4036: return "Baby Peco Knight";
- case 4037: return "Baby Crusader";
- case 4038: return "Baby Monk";
- case 4039: return "Baby Sage";
- case 4040: return "Baby Rogue";
- case 4041: return "Baby Alchemist";
- case 4042: return "Baby Bard";
- case 4043: return "Baby Dancer";
- case 4044: return "Baby Peco Crusader";
- case 4045: return "Super Baby";
- }
- return "Unknown Job";
-}
-
-//-------------------------------------------------------------
-// Function to create the online files (txt and html). by [Yor]
-//-------------------------------------------------------------
-void create_online_files(void) {
- int i, j, k, 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[online_players_max];
-
- // don't return here if we display nothing, because server[j].users is updated in the first loop.
-
- // Get number of online players, id of each online players, and verify if a server is offline
- players = 0;
- for (i = 0; i < online_players_max; i++) {
- if (online_chars[i].char_id != -1) {
- // check if map-server is online
- j = online_chars[i].server;
- if (j == -1) {
- online_chars[i].char_id = -1;
- continue;
- } else if (server_fd[j] < 0) {
- server[j].users = 0;
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- continue;
- }
- // check if the character is twice or more in the list
- // (multiple map-servers and player have successfully connected twice!)
- for(j = i + 1; j < online_players_max; j++)
- if (online_chars[i].char_id == online_chars[j].char_id) {
- k = online_chars[j].server;
- if (k != -1 && server_fd[k] >= 0 && server[k].users > 0)
- server[k].users--;
- online_chars[j].char_id = -1;
- online_chars[j].server = -1;
- }
- // search position of character in char_dat and sort online characters.
- for(j = 0; j < char_num; j++) {
- if (char_dat[j].char_id == online_chars[i].char_id) {
- 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].name, char_dat[id[k]].name) < 0 ||
- // if same name, we sort with case sensitive.
- (stricmp(char_dat[j].name, char_dat[id[k]].name) == 0 &&
- strcmp(char_dat[j].name, char_dat[id[k]].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].zeny < char_dat[id[k]].zeny ||
- // if same number of zenys, we sort by name.
- (char_dat[j].zeny == char_dat[id[k]].zeny &&
- stricmp(char_dat[j].name, char_dat[id[k]].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].base_level < char_dat[id[k]].base_level ||
- // if same base level, we sort by base exp.
- (char_dat[j].base_level == char_dat[id[k]].base_level &&
- char_dat[j].base_exp < char_dat[id[k]].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].class < char_dat[id[k]].class ||
- // if same job, we sort by job level.
- (char_dat[j].class == char_dat[id[k]].class &&
- char_dat[j].job_level < char_dat[id[k]].job_level) ||
- // if same job and job level, we sort by job exp.
- (char_dat[j].class == char_dat[id[k]].class &&
- char_dat[j].job_level == char_dat[id[k]].job_level &&
- char_dat[j].job_exp < char_dat[id[k]].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
- for(k = 0; k < players; k++)
- if (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) < 0 ||
- // if same map name, we sort by name.
- (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) == 0 &&
- stricmp(char_dat[j].name, char_dat[id[k]].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;
- }
- }
- }
- }
-
- if (online_display_option == 0) // we display nothing, so return
- return;
-
- // 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].name);
- l = isGM(char_dat[j].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].class);
- if ((online_display_option & 6) == 6) {
- fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].base_level, char_dat[j].job_level);
- fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].base_level, char_dat[j].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].base_level, char_dat[j].job_level);
- fprintf(fp, "%3d/%3d ", char_dat[j].base_level, char_dat[j].job_level);
- }
- }
- // displaying of the map
- if (online_display_option & 24) { // 8 or 16
- // prepare map name
- memset(temp, 0, 17);
- strncpy(temp, char_dat[j].last_point.map, 16);
- 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 coordonates
- fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].last_point.x, char_dat[j].last_point.y);
- fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].last_point.x, char_dat[j].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].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].zeny);
- fprintf(fp, "%13d z ", char_dat[j].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");
- // no display if only 1 player
- } else if (players == 1) {
- } 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
-
- found_num = 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].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;
-
- 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]];
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = 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;
- WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : 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->weapon;
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = 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, 24);
-
- 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;
-}
-
-int set_account_reg2(int acc, int num, struct global_reg *reg) {
- int i, c;
-
- c = 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].account_id == acc) {
- memcpy(char_dat[i].account_reg2, reg, sizeof(char_dat[i].account_reg2));
- char_dat[i].account_reg2_num = num;
- c++;
- }
- }
- return c;
-}
-
-// —£¥(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].char_id == cs->partner_id && char_dat[i].partner_id == cs->char_id) {
- cs->partner_id = 0;
- char_dat[i].partner_id = 0;
- for(j = 0; j < MAX_INVENTORY; j++)
- if (char_dat[i].inventory[j].nameid == WEDDING_RING_M || char_dat[i].inventory[j].nameid == WEDDING_RING_F)
- memset(&char_dat[i].inventory[j], 0, sizeof(char_dat[i].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;
-}
-
-//------------------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
-//------------------------------------------------------------
-int e_mail_check(unsigned char *email) {
- char ch;
- unsigned 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 accound_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 = session[i]->session_data)) {
- if (sd->account_id == accound_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);
- for (j = 0; j < MAX_INVENTORY; j++)
- if (cs->inventory[j].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&cs->inventory[j].card[2])));
- for (j = 0; j < MAX_CART; j++)
- if (cs->cart[j].card[0] == (short)0xff00)
- inter_pet_delete(*((long *)(&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);
- // —£¥
- if (cs->partner_id){
- // —£¥î•ñ‚ðmap‚É’Ê’m
- 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);
- }
- return 0;
-}
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
-
- // 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) {
- printf("Char-server can't connect to login-server (connection #%d).\n", fd);
- login_fd = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2) {
-// 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));
- printf("Can not connect to login-server.\n");
- printf("The server communication passwords (default s1/p1) is probably invalid.\n");
- printf("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n");
- printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
- exit(1);
- } else {
- printf("Connected to login-server (connection #%d).\n", fd);
- // 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][0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- printf("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 = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- 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);
- 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 {
- // 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);
- }
- 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 = 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;
-
- 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 < char_num; i++) {
- if (char_dat[i].account_id == acc) {
- int jobclass = char_dat[i].class;
- char_dat[i].sex = sex;
- auth_fifo[i].sex = sex;
- if (jobclass == 19 || jobclass == 20 ||
- jobclass == 4020 || jobclass == 4021 ||
- jobclass == 4042 || jobclass == 4043) {
- // job modification
- if (jobclass == 19 || jobclass == 20) {
- char_dat[i].class = (sex) ? 19 : 20;
- } else if (jobclass == 4020 || jobclass == 4021) {
- char_dat[i].class = (sex) ? 4020 : 4021;
- } else if (jobclass == 4042 || jobclass == 4043) {
- char_dat[i].class = (sex) ? 4042 : 4043;
- }
- // remove specifical skills of classes 19, 4020 and 4042
- for(j = 315; j <= 322; j++) {
- if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
- char_dat[i].skill_point += char_dat[i].skill[j].lv;
- char_dat[i].skill[j].id = 0;
- char_dat[i].skill[j].lv = 0;
- }
- }
- // remove specifical skills of classes 20, 4021 and 4043
- for(j = 323; j <= 330; j++) {
- if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
- char_dat[i].skill_point += char_dat[i].skill[j].lv;
- char_dat[i].skill[j].id = 0;
- char_dat[i].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].inventory[j].nameid && char_dat[i].inventory[j].equip)
- char_dat[i].inventory[j].equip = 0;
- }
- char_dat[i].weapon = 0;
- char_dat[i].shield = 0;
- char_dat[i].head_top = 0;
- char_dat[i].head_mid = 0;
- char_dat[i].head_bottom = 0;
- }
- }
- // 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 {
- char buf[128];
- char message[RFIFOL(fd,4) + 1]; // +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(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;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- unsigned char buf[4096];
- int j, p, acc;
- acc = RFIFOL(fd,4);
- for (p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd,p+32);
- }
- set_account_reg2(acc, j, reg);
- // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
- memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b11;
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd,RFIFOW(fd,2));
-// printf("char: save_account_reg_reply\n");
- }
- 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].account_id == RFIFOL(fd,2)) {
- char_delete(&char_dat[i]);
- if (i < char_num - 1) {
- memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
- // if moved character owns to deleted account, check again it's character
- if (char_dat[i].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 = session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].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;
- {
- char buf[32000];
- if (gm_account != NULL)
- free(gm_account);
- gm_account = calloc(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++;
- }
- printf("From login-server: receiving of %d GM accounts information.\n", GM_num);
- char_log("From login-server: receiving of %d GM accounts information." 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;
-
- default:
- session[fd]->eof = 1;
- return 0;
- }
- }
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-//--------------------------------
-// Map-server anti-freeze system
-//--------------------------------
-int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
- int i;
-
- //printf("Entering in map_anti_freeze_system function to check freeze of servers.\n");
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] >= 0) {// if map-server is online
- //printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]);
- if (server_freezeflag[i]-- < 1) { // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- printf("Map-server anti-freeze system: char-server #%d is freezed -> disconnection.\n", i);
- char_log("Map-server anti-freeze system: char-server #%d is freezed -> disconnection." RETCODE,
- i);
- session[server_fd[i]]->eof = 1;
- }
- }
- }
-
- return 0;
-}
-
-int parse_frommap(int fd) {
- int i, j;
- int id;
-
- 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){
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] == fd) {
- printf("Map-server %d has disconnected.\n", i);
- server_fd[i] = -1;
- }
- close(fd);
- delete_session(fd);
- create_online_files();
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_frommap: 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 to reload GM accounts. Transmission to login-server (by Yor)
- case 0x2af7:
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2709;
- WFIFOSET(login_fd, 2);
-// printf("char : request from map-server to reload GM accounts -> login-server.\n");
- }
- 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 += 16) {
- memcpy(server[id].map[j], RFIFOP(fd,i), 16);
-// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
- j++;
- }
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- printf("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);
- printf("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);
- }
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
- WFIFOSET(fd,27);
- {
- unsigned char buf[16384];
- int x;
- if (j == 0) {
- printf("WARNING: 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 * 16 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
- 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][0])
- memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
- if (j > 0) {
- WFIFOW(fd,2) = j * 16 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // ”FØ—v‹
- // Send character data to map-server
- case 0x2afc:
- if (RFIFOREST(fd) < 22)
- return 0;
- //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
- auth_fifo[i].char_id == RFIFOL(fd,6) &&
- auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
- (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
- !auth_fifo[i].delflag) {
- auth_fifo[i].delflag = 1;
- WFIFOW(fd,0) = 0x2afd;
- WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
- WFIFOL(fd,4) = RFIFOL(fd,2);
- WFIFOL(fd,8) = auth_fifo[i].login_id2;
- WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
- char_dat[auth_fifo[i].char_pos].sex = auth_fifo[i].sex;
- memcpy(WFIFOP(fd,16), &char_dat[auth_fifo[i].char_pos], sizeof(struct mmo_charstatus));
- WFIFOSET(fd, WFIFOW(fd,2));
- //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- WFIFOW(fd,0) = 0x2afe;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOSET(fd,6);
- printf("auth_fifo search error! account %d not authentified.\n", RFIFOL(fd,2));
- }
- RFIFOSKIP(fd,22);
- break;
-
- // MAPƒT[ƒo[ã‚̃†[ƒU[”ŽóM
- // Recieve alive message from map-server
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- server[id].users = RFIFOW(fd,4);
- if(anti_freeze_enable)
- server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
- // remove all previously online players of the server
- for(i = 0; i < online_players_max; i++)
- if (online_chars[i].server == id) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
- // add online players in the list by [Yor]
- j = 0;
- for(i = 0; i < server[id].users; i++) {
- for(; j < online_players_max; j++)
- if (online_chars[j].char_id == -1) {
- online_chars[j].char_id = RFIFOL(fd,6+i*4);
- online_chars[j].server = id;
- //printf("%d\n", online_chars[j].char_id);
- break;
- }
- // no available slots...
- if (j == online_players_max) {
- // create 256 new slots
- online_players_max += 256;
- online_chars = realloc(online_chars, sizeof(struct online_chars) * online_players_max);
- if (!online_chars) {
- printf("out of memory: parse_frommap - online_chars (realloc).\n");
- exit(1);
- }
- for( ; j < online_players_max; j++) {
- online_chars[j].char_id = -1;
- online_chars[j].server = -1;
- }
- // save data
- j = online_players_max - 256;
- online_chars[j].char_id = RFIFOL(fd,6+i*4);
- online_chars[j].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.
- }
- RFIFOSKIP(fd,6+i*4);
- 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].account_id == RFIFOL(fd,4) &&
- char_dat[i].char_id == RFIFOL(fd,8))
- break;
- }
- if (i != char_num)
- memcpy(&char_dat[i], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
- 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;
- //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- 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;
-
- // ƒ}ƒbƒvƒT[ƒo[ŠÔˆÚ“®—v‹
- case 0x2b05:
- if (RFIFOREST(fd) < 49)
- return 0;
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
- WFIFOW(fd,0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
- //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
- auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14);
- 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 = 0;
- auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
- 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,45);
- for(i = 0; i < char_num; i++)
- if (char_dat[i].account_id == RFIFOL(fd,2) &&
- char_dat[i].char_id == RFIFOL(fd,14)) {
- auth_fifo[auth_fifo_pos].char_pos = i;
- auth_fifo_pos++;
- WFIFOL(fd,6) = 0;
- break;
- }
- if (i == char_num)
- WFIFOW(fd,6) = 1;
- WFIFOSET(fd,44);
- RFIFOSKIP(fd,49);
- break;
-
- // ƒLƒƒƒ‰–¼ŒŸõ
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].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].name, 24);
- else
- memcpy(WFIFOP(fd,6), unknown_char_name, 24);
- WFIFOSET(fd,30);
- 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
- WFIFOW(login_fd,0) = 0x2720;
- memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2);
- WFIFOSET(login_fd, RFIFOW(fd,2));
- } else {
- 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
- 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[24];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- memcpy(character_name, RFIFOP(fd,6), 24);
- character_name[sizeof(character_name) -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), 24); // 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(char_dat[i].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].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].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = char_dat[i].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].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = char_dat[i].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].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = char_dat[i].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].account_id)) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = char_dat[i].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, 24);
- 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);
- }
- RFIFOSKIP(fd, 44);
- break;
- }
-
-// case 0x2b0f: not more used (available for futur usage)
-
- // account_reg•Û‘¶—v‹
- case 0x2b10:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- int p, acc;
- acc = RFIFOL(fd,4);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd, p+32);
- }
- set_account_reg2(acc, j, reg);
- // loginƒT[ƒo[‚Ö‘—‚é
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2728;
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOSET(login_fd, WFIFOW(login_fd,2));
- }
- // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
- //memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
- //WBUFW(buf,0) = 0x2b11;
- //mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
-// printf("char: save_account_reg (from map)\n");
- break;
- }
- // Map server send information to change an email of an account -> login-server
- case 0x3000:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd,0) = 0x3000;
- WFIFOW(login_fd,2) = RFIFOW(fd,2);
- WFIFOL(login_fd,4) = RFIFOL(fd,4);
- WFIFOB(login_fd,8) = RFIFOB(fd,8);
- WFIFOSET(login_fd, RFIFOW(fd,2));
- printf("char : change sex -> login %d %d %d \n", RFIFOL(fd,4), RFIFOB(fd,8), RFIFOW(fd,2));
- }
- RFIFOSKIP(fd, RFIFOW(fd,2));
- 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
- printf("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n", RFIFOW(fd,0), RFIFOREST(fd));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(char *map) {
- int i, j;
- char temp_map[16];
- int temp_map_len;
-
-// printf("Searching the map-server for map '%s'... ", map);
- strncpy(temp_map, map, sizeof(temp_map));
- temp_map[sizeof(temp_map)-1] = '\0';
- if (strchr(temp_map, '.') != NULL)
- temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
-
- temp_map_len = strlen(temp_map);
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- for (j = 0; server[i].map[j][0]; j++)
- //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
- if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
-// printf("found -> server #%d.\n", i);
- return i;
- }
-
-// printf("not found.\n");
- 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. by [Yor]
-//-----------------------------------------------------
-int lan_ip_check(unsigned char *p){
- int i;
- int lancheck = 1;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
- printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-int parse_char(int fd) {
- int i, ch;
- char email[40];
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
-
- 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;
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = session[fd]->session_data;
-
- while (RFIFOREST(fd) >= 2) {
-// if (RFIFOW(fd,0) < 30000)
-// printf("parse_char: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- switch(RFIFOW(fd,0)) {
- 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;
- if ((GM_value = isGM(RFIFOL(fd,2))))
- printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
- else
- printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
- if (sd == NULL) {
- sd = session[fd]->session_data = calloc(sizeof(struct char_session_data), 1);
- memset(sd, 0, sizeof(struct char_session_data));
- memcpy(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 (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
- 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
- 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
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd,17);
- break;
-
- case 0x66: // ƒLƒƒƒ‰‘I‘ð
- if (RFIFOREST(fd) < 3)
- return 0;
-
- // 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
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
- WFIFOSET(fd, 3);
-
- // otherwise, load the character
- } else {
- for (ch = 0; ch < 9; ch++)
- if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].char_num == RFIFOB(fd,2))
- break;
- if (ch != 9) {
- char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
- sd->account_id, RFIFOB(fd,2), char_dat[sd->found_char[ch]].name);
- // searching map server
- i = search_mapserver(char_dat[sd->found_char[ch]].last_point.map);
- // if map is not found, we check major cities
- if (i < 0) {
- if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "prontera.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 273; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 354;
- } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "geffen.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 120; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 100;
- } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "morocc.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 160; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 94;
- } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "alberta.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 116; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 57;
- } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "payon.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 87; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 117;
- } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[sd->found_char[ch]].last_point.map, "izlude.gat", 16);
- char_dat[sd->found_char[ch]].last_point.x = 94; // savepoint coordonates
- char_dat[sd->found_char[ch]].last_point.y = 103;
- } else {
- int j;
- // get first online server (with a map)
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0][0]) { // change save point to one of map found on the server (the first)
- i = j;
- memcpy(char_dat[sd->found_char[ch]].last_point.map, server[j].map[0], 16);
- printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
- // coordonates are unknown
- break;
- }
- // if no map-server is connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,3);
- break;
- }
- }
- }
- WFIFOW(fd,0) = 0x71;
- WFIFOL(fd,2) = char_dat[sd->found_char[ch]].char_id;
- memcpy(WFIFOP(fd,6), char_dat[sd->found_char[ch]].last_point.map, 16);
- printf("Character selection '%s' (account: %d, slot: %d).\n", char_dat[sd->found_char[ch]].name, sd->account_id, ch);
- printf("--Send IP of map-server. ");
- if (lan_ip_check(p))
- WFIFOL(fd, 22) = inet_addr(lan_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;
- //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2);
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = char_dat[sd->found_char[ch]].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;
- auth_fifo_pos++;
- }
- }
- RFIFOSKIP(fd,3);
- break;
-
- case 0x67: // ì¬
- if (RFIFOREST(fd) < 37)
- return 0;
- i = make_new_char(fd, RFIFOP(fd,2));
- if (i < 0) {
- WFIFOW(fd,0) = 0x6e;
- WFIFOB(fd,2) = 0x00;
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,37);
- break;
- }
-
- WFIFOW(fd,0) = 0x6d;
- memset(WFIFOP(fd,2), 0, 106);
-
- WFIFOL(fd,2) = char_dat[i].char_id;
- WFIFOL(fd,2+4) = char_dat[i].base_exp;
- WFIFOL(fd,2+8) = char_dat[i].zeny;
- WFIFOL(fd,2+12) = char_dat[i].job_exp;
- WFIFOL(fd,2+16) = char_dat[i].job_level;
-
- WFIFOL(fd,2+28) = char_dat[i].karma;
- WFIFOL(fd,2+32) = char_dat[i].manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
- WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
- WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
- WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
- WFIFOW(fd,2+52) = char_dat[i].class;
- WFIFOW(fd,2+54) = char_dat[i].hair;
-
- WFIFOW(fd,2+58) = char_dat[i].base_level;
- WFIFOW(fd,2+60) = char_dat[i].skill_point;
-
- WFIFOW(fd,2+64) = char_dat[i].shield;
- WFIFOW(fd,2+66) = char_dat[i].head_top;
- WFIFOW(fd,2+68) = char_dat[i].head_mid;
- WFIFOW(fd,2+70) = char_dat[i].hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
-
- WFIFOB(fd,2+98) = (char_dat[i].str > 255) ? 255 : char_dat[i].str;
- WFIFOB(fd,2+99) = (char_dat[i].agi > 255) ? 255 : char_dat[i].agi;
- WFIFOB(fd,2+100) = (char_dat[i].vit > 255) ? 255 : char_dat[i].vit;
- WFIFOB(fd,2+101) = (char_dat[i].int_ > 255) ? 255 : char_dat[i].int_;
- WFIFOB(fd,2+102) = (char_dat[i].dex > 255) ? 255 : char_dat[i].dex;
- WFIFOB(fd,2+103) = (char_dat[i].luk > 255) ? 255 : char_dat[i].luk;
- WFIFOB(fd,2+104) = char_dat[i].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
- if (RFIFOREST(fd) < 46)
- return 0;
- 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]].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]].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]])->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 = session[j]->session_data) &&
- sd2->account_id == char_dat[char_num-1].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;
- WFIFOW(fd,0) = 0x2af9;
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] < 0)
- break;
- }
- if (i == MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), 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;
- if(anti_freeze_enable)
- server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
- 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î•ñŠ“¾
- 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‚É‚·‚邽‚ß)
- session[fd]->eof = 1;
- return 0;
-
- 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 *)malloc(64);
- command = (char *)malloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- free(buf);
- free(type);
- free(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) {
- 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) {
- 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]) {
- 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();
- char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- 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;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd <= 0 || session[login_fd] == NULL) {
- printf("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- WFIFOW(login_fd,0) = 0x2710;
- memset(WFIFOP(login_fd,2), 0, 24);
- memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
- memset(WFIFOP(login_fd,26), 0, 24);
- memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memset(WFIFOP(login_fd,60), 0, 20);
- memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
- WFIFOW(login_fd,84) = char_new;
- WFIFOSET(login_fd,86);
- }
- 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 by [Yor]
-//-------------------------------------------
-int lan_config_read(const char *lancfgName) {
- int j;
- struct hostent * h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- // set default configuration
- strncpy(lan_map_ip, "127.0.0.1", sizeof(lan_map_ip));
- subneti[0] = 127;
- subneti[1] = 0;
- subneti[2] = 0;
- subneti[3] = 1;
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
-
- fp = fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("LAN support configuration file not found: %s\n", lancfgName);
- return 1;
- }
-
- printf ("---start reading of Lan Support configuration...\n");
-
- 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(w1);
- remove_control_chars(w2);
- if (strcmpi(w1, "lan_map_ip") == 0) { // Read map-server Lan IP Address
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_map_ip, "%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 {
- strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
- lan_map_ip[sizeof(lan_map_ip)-1] = 0;
- }
- printf("LAN IP of map-server: %s.\n", lan_map_ip);
- } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
- for(j = 0; j < 4; j++)
- subneti[j] = 0;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subneti[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
- }
- printf("Sub-network of the map-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
- } else if (strcmpi(w1, "subnetmask") == 0){ // Read Subnetwork Mask
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subnetmaski[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
- }
- printf("Sub-network mask of the map-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- }
- }
- fclose(fp);
-
- // sub-network check of the map-server
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_map_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the map-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the map-server doesn't belong to the specified Sub-network.\033[0m\n");
- }
- }
-
- printf("---End reading of Lan Support configuration...\n");
-
- return 0;
-}
-
-int char_config_read(const char *cfgName) {
- struct hostent *h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp = fopen(cfgName, "r");
-
- if (fp == NULL) {
- printf("Configuration file not found: %s.\n", cfgName);
- exit(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;
-
- remove_control_chars(w1);
- remove_control_chars(w2);
- if (strcmpi(w1, "userid") == 0) {
- memcpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- memcpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- memcpy(server_name, w2, sizeof(server_name));
- server_name[sizeof(server_name) - 1] = '\0';
- printf("%s server has been intialized\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) {
- login_ip_set_ = 1;
- h = gethostbyname(w2);
- if (h != NULL) {
- 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(login_ip_str, "%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(login_ip_str, w2, 16);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port = atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname(w2);
- if (h != NULL) {
- printf("Character 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(char_ip_str, "%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(char_ip_str, w2, 16);
- } 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, "email_creation") == 0) {
- email_creation = config_switch(w2);
- } 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);
- } 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, "check_ip_flag") == 0) {
- check_ip_flag = 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, "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
- memcpy(start_point.map, map, 16);
- start_point.x = x;
- start_point.y = y;
- }
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } 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[24] = 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,"anti_freeze_enable")==0){
- anti_freeze_enable = config_switch(w2);
- } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
- ANTI_FREEZE_INTERVAL = atoi(w2);
- if (ANTI_FREEZE_INTERVAL < 5)
- ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-//-----------------------------------------------------
-//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 do_final(void) {
- int i;
-
- // write online players files with no player
- for(i = 0; i < online_players_max; i++) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
- create_online_files();
- free(online_chars);
-
- mmo_char_sync();
- inter_save();
-
- if (gm_account != NULL)
- free(gm_account);
-
- free(char_dat);
- delete_session(login_fd);
- delete_session(char_fd);
-
- char_log("----End of char-server (normal end with closing of all files)." RETCODE);
-}
-
-int do_init(int argc, char **argv) {
- int i;
-
- // a newline in the log...
- char_log("");
- char_log("The char-server starting..." RETCODE);
-
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- lan_config_read((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME);
-
- if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
- // 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)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (login_ip_set_ == 0)
- strcpy(login_ip_str, buf);
- if (char_ip_set_ == 0)
- strcpy(char_ip_str, buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("Firewall detected.. edit lan_support.conf and char_athena.conf");
- }
-
- login_ip = inet_addr(login_ip_str);
- char_ip = inet_addr(char_ip_str);
-
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- memset(&server[i], 0, sizeof(struct mmo_map_server));
- server_fd[i] = -1;
- }
-
- online_players_max = 256;
- online_chars = calloc(sizeof(struct online_chars) * 256, 1);
- if (!online_chars) {
- printf("out of memory: do_init (calloc).\n");
- exit(1);
- }
- for(i = 0; i < online_players_max; i++) {
- online_chars[i].char_id = -1;
- online_chars[i].server = -1;
- }
-
-
- mmo_char_init();
-
- update_online = time(NULL);
- create_online_files(); // update online players files at start of the server
-
- inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ‰Šú‰»
-
- set_termfunc(do_final);
- set_defaultparse(parse_char);
-
- char_fd = make_listen_port(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(mmo_char_sync_timer, "mmo_char_sync_timer");
-
- i = add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000);
- i = add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000);
- i = add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval);
-
- //Added for Mugendais I'm Alive mod
- if (imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if (flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
-
-
- if(anti_freeze_enable > 0) {
- add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
- i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies
- }
-
- 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);
-
- printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
-
- return 0;
-}
+// $Id: char.c,v 1.3 2004/09/13 16:52:16 Yor Exp $
+// original : char2.c 2003/03/14 11:58:35 Rev.1.5
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdarg.h>
+
+#include "core.h"
+#include "socket.h"
+#include "timer.h"
+#include "mmo.h"
+#include "version.h"
+#include "lock.h"
+#include "char.h"
+#include "showmsg.h"
+
+#include "inter.h"
+#include "int_pet.h"
+#include "int_guild.h"
+#include "int_party.h"
+#include "int_storage.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+struct mmo_map_server server[MAX_MAP_SERVERS];
+int server_fd[MAX_MAP_SERVERS];
+int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+int anti_freeze_enable = 0;
+int ANTI_FREEZE_INTERVAL = 6;
+
+int login_fd, char_fd;
+char userid[24];
+char passwd[24];
+char server_name[20];
+char wisp_server_name[24] = "Server";
+int login_ip_set_ = 0;
+char login_ip_str[16];
+int login_ip;
+int login_port = 6900;
+int char_ip_set_ = 0;
+char char_ip_str[16];
+int char_ip;
+int char_port = 6121;
+int char_maintenance;
+int char_new;
+int email_creation = 0; // disabled by default
+char char_txt[1024]="save/athena.txt";
+char backup_txt[1024]="save/backup.txt"; //By zanetheinsane
+char friends_txt[1024]="save/friends.txt"; // davidsiaw
+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";
+//Added for lan support
+char lan_map_ip[128];
+int subneti[4];
+int subnetmaski[4];
+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 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)
+};
+
+//Added for Mugendai's I'm Alive mod
+int imalive_on=0;
+int imalive_time=60;
+//Added by Mugendai for GUI
+int flush_on=1;
+int flush_time=100;
+
+#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)
+
+int char_id_count = 150000;
+struct mmo_charstatus *char_dat;
+int char_num, char_max;
+int max_connect_user = 0;
+int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int start_zeny = 500;
+int start_weapon = 1201;
+int start_armor = 2301;
+
+// Initial position (it's possible to set it in conf file)
+struct point start_point = {"new_1-1.gat", 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_players_max;
+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
+
+struct online_chars {
+ int char_id;
+ int server;
+} *online_chars;
+
+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;
+ struct timeval tv;
+ 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 {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", localtime(&(tv.tv_sec)));
+ sprintf(tmpstr + 19, ".%03d: %s", (int)tv.tv_usec / 1000, fmt);
+ vfprintf(logfp, tmpstr, ap);
+ }
+ fclose(logfp);
+ }
+ va_end(ap);
+ }
+ return 0;
+}
+
+//-----------------------------------------------------
+// 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;
+}
+
+//----------------------------------------------------------------------
+// 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 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].name, character_name) == 0) {
+ // Strict comparison (if found, we finish the function immediatly with correct value)
+ if (strcmp(char_dat[i].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].name;
+
+ return unknown_char_name;
+}
+
+/*---------------------------------------------------
+ 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<20;i++)
+ {
+ str_p += sprintf(str_p, ",%d,%s", p->friend_id[i],p->friend_name[i]);
+ }
+ return 0;
+}
+
+//-------------------------------------------------
+// Function to create the character line (for save)
+//-------------------------------------------------
+int mmo_char_tostr(char *str, struct mmo_charstatus *p) {
+ int i;
+ char *str_p = str;
+
+ // 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[0] == '\0') {
+ memcpy(p->last_point.map, "prontera.gat", 16);
+ 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%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,%d\t",
+ 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,
+ p->partner_id);
+ for(i = 0; i < 10; i++)
+ if (p->memo_point[i].map[0]) {
+ str_p += sprintf(str_p, "%s,%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,%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]);
+ }
+ *(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,%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]);
+ }
+ *(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 < p->global_reg_num; i++)
+ if (p->global_reg[i].str[0])
+ str_p += sprintf(str_p, "%s,%d ", p->global_reg[i].str, p->global_reg[i].value);
+ *(str_p++) = '\t';
+
+ *str_p = '\0';
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+// Function to set the character from the line (at read of characters file)
+//-------------------------------------------------------------------------
+int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
+ int tmp_int[256];
+ int set, next, len, i;
+
+ // initilialise character
+ memset(p, '\0', sizeof(struct mmo_charstatus));
+
+ // If it's not char structure of version 1008 and after
+ if ((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,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%[^,],%d,%d\t%[^,],%d,%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], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
+ tmp_int[39] = 0; // partner id
+ // If not char structure from version 384 to 1007
+ if ((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,%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], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
+ // It's char structure of a version before 384
+ tmp_int[26] = 0; // pet id
+ 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[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
+ set += 2;
+ //printf("char: old char data ver.1\n");
+ // Char structure of version 1007 or older
+ } else {
+ set++;
+ //printf("char: old char data ver.2\n");
+ }
+ // Char structure of version 1008+
+ } else {
+ //printf("char: new char data ver.3\n");
+ }
+ if (set != 43)
+ return 0;
+
+ 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 = 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];
+
+ // Some checks
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].char_id == p->char_id) {
+ printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
+ printf(" character id #%d -> new character not readed.\n", p->char_id);
+ printf(" Character saved in log file.\033[0m\n");
+ return -1;
+ } else if (strcmp(char_dat[i].name, p->name) == 0) {
+ printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
+ printf(" character name '%s' -> new character not readed.\n", p->name);
+ printf(" Character saved in log file.\033[0m\n");
+ return -2;
+ }
+ }
+
+ if (strcmpi(wisp_server_name, p->name) == 0) {
+ printf("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
+ printf(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name);
+ printf(" 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);
+ }
+
+ if (str[next] == '\n' || str[next] == '\r')
+ return 1; // V‹Kƒf[ƒ^
+
+ next++;
+
+ for(i = 0; str[next] && str[next] != '\t'; i++) {
+ if (sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len) != 3)
+ return -3;
+ 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++) {
+ if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ // do nothing, it's ok
+ } else if (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) == 11) {
+ } else // invalid structure
+ return -4;
+ 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++) {
+ if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ // do nothing, it's ok
+ } else if (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) == 11) {
+ } else // invalid structure
+ return -5;
+ 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++) {
+ 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, "%[^,],%d%n", p->global_reg[i].str, &p->global_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, ",%d%n", &p->global_reg[i].value, &len) == 1)
+ i--;
+ else
+ return -7;
+ }
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ p->global_reg_num = i;
+
+ return 1;
+}
+//---------------------------------
+// Function to read friend list
+//---------------------------------
+
+int parse_friend_txt(struct mmo_charstatus *p)
+{
+ char line[1024];
+ int i,cid=0,temp[20];
+ FILE *fp;
+
+ // Open the file and look for the ID
+ fp = fopen(friends_txt, "r");
+
+
+ while(fgets(line, sizeof(line)-1, fp)) {
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ sscanf(line, "%d,%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%[^,],%d,%s",&cid,
+ &temp[0],p->friend_name[0],
+ &temp[1],p->friend_name[1],
+ &temp[2],p->friend_name[2],
+ &temp[3],p->friend_name[3],
+ &temp[4],p->friend_name[4],
+ &temp[5],p->friend_name[5],
+ &temp[6],p->friend_name[6],
+ &temp[7],p->friend_name[7],
+ &temp[8],p->friend_name[8],
+ &temp[9],p->friend_name[9],
+ &temp[10],p->friend_name[10],
+ &temp[11],p->friend_name[11],
+ &temp[12],p->friend_name[12],
+ &temp[13],p->friend_name[13],
+ &temp[14],p->friend_name[14],
+ &temp[15],p->friend_name[15],
+ &temp[16],p->friend_name[16],
+ &temp[17],p->friend_name[17],
+ &temp[18],p->friend_name[18],
+ &temp[19],p->friend_name[19]);
+ if (cid == p->char_id)
+ break;
+ }
+
+ // No register of friends list
+ if (cid == 0) {
+ fclose(fp);
+ return 0;
+ }
+
+ // Fill in the list
+
+ for (i=0; i<20; i++)
+ p->friend_id[i] = temp[i];
+
+ fclose(fp);
+ return 0;
+}
+
+//---------------------------------
+// Function to read characters file
+//---------------------------------
+int mmo_char_init(void) {
+ char line[65536];
+ int i;
+ int ret, line_count;
+ FILE *fp;
+
+ char_max = 256;
+ char_dat = calloc(sizeof(struct mmo_charstatus) * 256, 1);
+ if (!char_dat) {
+ printf("out of memory: mmo_char_init (calloc of char_dat).\n");
+ exit(1);
+ }
+ online_chars = calloc(sizeof(struct online_chars) * 256, 1);
+ if (!online_chars) {
+ printf("out of memory: mmo_char_init (calloc of online_chars).\n");
+ exit(1);
+ }
+ for(i = 0; i < char_max; i++)
+ {
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ }
+
+ char_num = 0;
+
+ fp = fopen(char_txt, "r");
+
+ if (fp == NULL) {
+ printf("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 = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
+ if (!char_dat) {
+ printf("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);
+ }
+ online_chars = realloc(online_chars, sizeof(int) * char_max);
+ if (!online_chars) {
+ printf("Out of memory: mmo_char_init (realloc of online_chars).\n");
+ char_log("Out of memory: mmo_char_init (realloc of online_chars)." RETCODE);
+ exit(1);
+ }
+ for(i = char_max - 256; i < char_max; i++)
+ {
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ }
+ }
+
+ ret = mmo_char_fromstr(line, &char_dat[char_num]);
+
+ // Initialize friends list
+ parse_friend_txt(&char_dat[char_num]); // Grab friends for the character
+
+ if (ret > 0) { // negative value or zero for errors
+ if (char_dat[char_num].char_id >= char_id_count)
+ char_id_count = char_dat[char_num].char_id + 1;
+ char_num++;
+ } else {
+ printf("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count);
+ printf(" -> 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) {
+ printf("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) {
+ printf("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 {
+ printf("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[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].account_id < char_dat[id[j]].account_id) ||
+ // if same account id, we sort by slot.
+ (char_dat[i].account_id == char_dat[id[j]].account_id &&
+ char_dat[i].char_num < char_dat[id[j]].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) {
+ printf("WARNING: 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]]); // 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) {
+ printf("WARNING: Server can't not create backup of characters file.\n");
+ char_log("WARNING: Server can't not create backup of characters file." RETCODE);
+ 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]]); // 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]]);
+ fprintf(f_fp, "%s" RETCODE, f_line);
+ }
+
+ lock_fclose(f_fp, friends_txt, &lock);
+
+ 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) {
+ mmo_char_sync();
+ inter_save();
+ return 0;
+}
+
+//-----------------------------------
+// Function to create a new character
+//-----------------------------------
+int make_new_char(int fd, unsigned char *dat) {
+ int i, j;
+ struct char_session_data *sd;
+
+ sd = session[fd]->session_data;
+
+ // remove control characters from the name
+ dat[23] = '\0';
+ if (remove_control_chars(dat)) {
+ 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(dat) < 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; dat[i]; i++)
+ if (strchr(char_name_letters, dat[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 if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; dat[i]; i++)
+ if (strchr(char_name_letters, dat[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] >= 20 || // 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;
+ }
+ }
+
+ for(i = 0; i < char_num; i++) {
+ if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, dat) == 0) ||
+ (name_ignoring_case == 0 && strcmpi(char_dat[i].name, dat) == 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].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].account_id == sd->account_id && char_dat[i].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].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, dat) == 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], dat, char_dat[i].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 = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max);
+ if (!char_dat) {
+ printf("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);
+ }
+ online_chars = realloc(online_chars, sizeof(struct online_chars) * char_max);
+ if (!online_chars) {
+ printf("Out of memory: make_new_char (realloc of online_chars).\n");
+ char_log("Out of memory: make_new_char (realloc of online_chars)." RETCODE);
+ exit(1);
+ }
+ for(j = char_max - 256; j < char_max; j++) {
+ online_chars[j].char_id = -1;
+ online_chars[j].server = -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], 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]);
+
+ memset(&char_dat[i], 0, sizeof(struct mmo_charstatus));
+
+ char_dat[i].char_id = char_id_count++;
+ char_dat[i].account_id = sd->account_id;
+ char_dat[i].char_num = dat[30];
+ strcpy(char_dat[i].name, dat);
+ char_dat[i].class = 0;
+ char_dat[i].base_level = 1;
+ char_dat[i].job_level = 1;
+ char_dat[i].base_exp = 0;
+ char_dat[i].job_exp = 0;
+ char_dat[i].zeny = start_zeny;
+ char_dat[i].str = dat[24];
+ char_dat[i].agi = dat[25];
+ char_dat[i].vit = dat[26];
+ char_dat[i].int_ = dat[27];
+ char_dat[i].dex = dat[28];
+ char_dat[i].luk = dat[29];
+ char_dat[i].max_hp = 40 * (100 + char_dat[i].vit) / 100;
+ char_dat[i].max_sp = 11 * (100 + char_dat[i].int_) / 100;
+ char_dat[i].hp = char_dat[i].max_hp;
+ char_dat[i].sp = char_dat[i].max_sp;
+ char_dat[i].status_point = 0;
+ char_dat[i].skill_point = 0;
+ char_dat[i].option = 0;
+ char_dat[i].karma = 0;
+ char_dat[i].manner = 0;
+ char_dat[i].party_id = 0;
+ char_dat[i].guild_id = 0;
+ char_dat[i].hair = dat[33];
+ char_dat[i].hair_color = dat[31];
+ char_dat[i].clothes_color = 0;
+ char_dat[i].inventory[0].nameid = start_weapon; // Knife
+ char_dat[i].inventory[0].amount = 1;
+ char_dat[i].inventory[0].equip = 0x02;
+ char_dat[i].inventory[0].identify = 1;
+ char_dat[i].inventory[1].nameid = start_armor; // Cotton Shirt
+ char_dat[i].inventory[1].amount = 1;
+ char_dat[i].inventory[1].equip = 0x10;
+ char_dat[i].inventory[1].identify = 1;
+ char_dat[i].weapon = 1;
+ char_dat[i].shield = 0;
+ char_dat[i].head_top = 0;
+ char_dat[i].head_mid = 0;
+ char_dat[i].head_bottom = 0;
+ memcpy(&char_dat[i].last_point, &start_point, sizeof(start_point));
+ memcpy(&char_dat[i].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 0: return "Novice";
+ case 1: return "Swordsman";
+ case 2: return "Mage";
+ case 3: return "Archer";
+ case 4: return "Acolyte";
+ case 5: return "Merchant";
+ case 6: return "Thief";
+ case 7: return "Knight";
+ case 8: return "Priest";
+ case 9: return "Wizard";
+ case 10: return "Blacksmith";
+ case 11: return "Hunter";
+ case 12: return "Assassin";
+ case 13: return "Knight 2";
+ case 14: return "Crusader";
+ case 15: return "Monk";
+ case 16: return "Sage";
+ case 17: return "Rogue";
+ case 18: return "Alchemist";
+ case 19: return "Bard";
+ case 20: return "Dancer";
+ case 21: return "Crusader 2";
+ case 22: return "Wedding";
+ case 23: return "Super Novice";
+ case 4001: return "Novice High";
+ case 4002: return "Swordsman High";
+ case 4003: return "Mage High";
+ case 4004: return "Archer High";
+ case 4005: return "Acolyte High";
+ case 4006: return "Merchant High";
+ case 4007: return "Thief High";
+ case 4008: return "Lord Knight";
+ case 4009: return "High Priest";
+ case 4010: return "High Wizard";
+ case 4011: return "Whitesmith";
+ case 4012: return "Sniper";
+ case 4013: return "Assassin Cross";
+ case 4014: return "Peko Knight";
+ case 4015: return "Paladin";
+ case 4016: return "Champion";
+ case 4017: return "Professor";
+ case 4018: return "Stalker";
+ case 4019: return "Creator";
+ case 4020: return "Clown";
+ case 4021: return "Gypsy";
+ case 4022: return "Peko Paladin";
+ case 4023: return "Baby Novice";
+ case 4024: return "Baby Swordsman";
+ case 4025: return "Baby Mage";
+ case 4026: return "Baby Archer";
+ case 4027: return "Baby Acolyte";
+ case 4028: return "Baby Merchant";
+ case 4029: return "Baby Thief";
+ case 4030: return "Baby Knight";
+ case 4031: return "Baby Priest";
+ case 4032: return "Baby Wizard";
+ case 4033: return "Baby Blacksmith";
+ case 4034: return "Baby Hunter";
+ case 4035: return "Baby Assassin";
+ case 4036: return "Baby Peco Knight";
+ case 4037: return "Baby Crusader";
+ case 4038: return "Baby Monk";
+ case 4039: return "Baby Sage";
+ case 4040: return "Baby Rogue";
+ case 4041: return "Baby Alchemist";
+ case 4042: return "Baby Bard";
+ case 4043: return "Baby Dancer";
+ case 4044: return "Baby Peco Crusader";
+ case 4045: return "Super Baby";
+ }
+ return "Unknown Job";
+}
+
+//-------------------------------------------------------------
+// Function to create the online files (txt and html). by [Yor]
+//-------------------------------------------------------------
+void create_online_files(void) {
+ int i, j, k, 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[online_players_max];
+
+ // don't return here if we display nothing, because server[j].users is updated in the first loop.
+
+ // Get number of online players, id of each online players, and verify if a server is offline
+ players = 0;
+ for (i = 0; i < online_players_max; i++) {
+ if (online_chars[i].char_id != -1) {
+ // check if map-server is online
+ j = online_chars[i].server;
+ if (j == -1) {
+ online_chars[i].char_id = -1;
+ continue;
+ } else if (server_fd[j] < 0) {
+ server[j].users = 0;
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ continue;
+ }
+ // check if the character is twice or more in the list
+ // (multiple map-servers and player have successfully connected twice!)
+ for(j = i + 1; j < online_players_max; j++)
+ if (online_chars[i].char_id == online_chars[j].char_id) {
+ k = online_chars[j].server;
+ if (k != -1 && server_fd[k] >= 0 && server[k].users > 0)
+ server[k].users--;
+ online_chars[j].char_id = -1;
+ online_chars[j].server = -1;
+ }
+ // search position of character in char_dat and sort online characters.
+ for(j = 0; j < char_num; j++) {
+ if (char_dat[j].char_id == online_chars[i].char_id) {
+ 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].name, char_dat[id[k]].name) < 0 ||
+ // if same name, we sort with case sensitive.
+ (stricmp(char_dat[j].name, char_dat[id[k]].name) == 0 &&
+ strcmp(char_dat[j].name, char_dat[id[k]].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].zeny < char_dat[id[k]].zeny ||
+ // if same number of zenys, we sort by name.
+ (char_dat[j].zeny == char_dat[id[k]].zeny &&
+ stricmp(char_dat[j].name, char_dat[id[k]].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].base_level < char_dat[id[k]].base_level ||
+ // if same base level, we sort by base exp.
+ (char_dat[j].base_level == char_dat[id[k]].base_level &&
+ char_dat[j].base_exp < char_dat[id[k]].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].class < char_dat[id[k]].class ||
+ // if same job, we sort by job level.
+ (char_dat[j].class == char_dat[id[k]].class &&
+ char_dat[j].job_level < char_dat[id[k]].job_level) ||
+ // if same job and job level, we sort by job exp.
+ (char_dat[j].class == char_dat[id[k]].class &&
+ char_dat[j].job_level == char_dat[id[k]].job_level &&
+ char_dat[j].job_exp < char_dat[id[k]].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
+ for(k = 0; k < players; k++)
+ if (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) < 0 ||
+ // if same map name, we sort by name.
+ (stricmp(char_dat[j].last_point.map, char_dat[id[k]].last_point.map) == 0 &&
+ stricmp(char_dat[j].name, char_dat[id[k]].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;
+ }
+ }
+ }
+ }
+
+ if (online_display_option == 0) // we display nothing, so return
+ return;
+
+ // 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].name);
+ l = isGM(char_dat[j].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].class);
+ if ((online_display_option & 6) == 6) {
+ fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].base_level, char_dat[j].job_level);
+ fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].base_level, char_dat[j].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].base_level, char_dat[j].job_level);
+ fprintf(fp, "%3d/%3d ", char_dat[j].base_level, char_dat[j].job_level);
+ }
+ }
+ // displaying of the map
+ if (online_display_option & 24) { // 8 or 16
+ // prepare map name
+ memset(temp, 0, 17);
+ strncpy(temp, char_dat[j].last_point.map, 16);
+ 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 coordonates
+ fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].last_point.x, char_dat[j].last_point.y);
+ fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].last_point.x, char_dat[j].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].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].zeny);
+ fprintf(fp, "%13d z ", char_dat[j].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");
+ // no display if only 1 player
+ } else if (players == 1) {
+ } 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
+
+ found_num = 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].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;
+
+ 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]];
+ j = offset + (i * 106); // increase speed of code
+
+ WFIFOL(fd,j) = p->char_id;
+ WFIFOL(fd,j+4) = p->base_exp;
+ WFIFOL(fd,j+8) = p->zeny;
+ WFIFOL(fd,j+12) = 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;
+ WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
+ WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
+ WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
+ WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : 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->weapon;
+ WFIFOW(fd,j+58) = p->base_level;
+ WFIFOW(fd,j+60) = 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, 24);
+
+ 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;
+}
+
+int set_account_reg2(int acc, int num, struct global_reg *reg) {
+ int i, c;
+
+ c = 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].account_id == acc) {
+ memcpy(char_dat[i].account_reg2, reg, sizeof(char_dat[i].account_reg2));
+ char_dat[i].account_reg2_num = num;
+ c++;
+ }
+ }
+ return c;
+}
+
+// —£¥(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].char_id == cs->partner_id && char_dat[i].partner_id == cs->char_id) {
+ cs->partner_id = 0;
+ char_dat[i].partner_id = 0;
+ for(j = 0; j < MAX_INVENTORY; j++)
+ if (char_dat[i].inventory[j].nameid == WEDDING_RING_M || char_dat[i].inventory[j].nameid == WEDDING_RING_F)
+ memset(&char_dat[i].inventory[j], 0, sizeof(char_dat[i].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;
+}
+
+//------------------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
+//------------------------------------------------------------
+int e_mail_check(unsigned char *email) {
+ char ch;
+ unsigned 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 accound_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 = session[i]->session_data)) {
+ if (sd->account_id == accound_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);
+ for (j = 0; j < MAX_INVENTORY; j++)
+ if (cs->inventory[j].card[0] == (short)0xff00)
+ inter_pet_delete(*((long *)(&cs->inventory[j].card[2])));
+ for (j = 0; j < MAX_CART; j++)
+ if (cs->cart[j].card[0] == (short)0xff00)
+ inter_pet_delete(*((long *)(&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);
+ // —£¥
+ if (cs->partner_id){
+ // —£¥î•ñ‚ðmap‚É’Ê’m
+ 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);
+ }
+ return 0;
+}
+
+int parse_tologin(int fd) {
+ int i;
+ struct char_session_data *sd;
+
+ // 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) {
+ printf("Char-server can't connect to login-server (connection #%d).\n", fd);
+ login_fd = -1;
+ }
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ sd = session[fd]->session_data;
+
+ while(RFIFOREST(fd) >= 2) {
+// 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));
+ printf("Can not connect to login-server.\n");
+ printf("The server communication passwords (default s1/p1) is probably invalid.\n");
+ printf("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n");
+ printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
+ exit(1);
+ } else {
+ printf("Connected to login-server (connection #%d).\n", fd);
+ // 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][0]) // if map-server online and at least 1 map
+ break;
+ if (i == MAX_MAP_SERVERS)
+ printf("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 = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
+ 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);
+ 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 {
+ // 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);
+ }
+ 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 = 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;
+
+ 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 < char_num; i++) {
+ if (char_dat[i].account_id == acc) {
+ int jobclass = char_dat[i].class;
+ char_dat[i].sex = sex;
+ auth_fifo[i].sex = sex;
+ if (jobclass == 19 || jobclass == 20 ||
+ jobclass == 4020 || jobclass == 4021 ||
+ jobclass == 4042 || jobclass == 4043) {
+ // job modification
+ if (jobclass == 19 || jobclass == 20) {
+ char_dat[i].class = (sex) ? 19 : 20;
+ } else if (jobclass == 4020 || jobclass == 4021) {
+ char_dat[i].class = (sex) ? 4020 : 4021;
+ } else if (jobclass == 4042 || jobclass == 4043) {
+ char_dat[i].class = (sex) ? 4042 : 4043;
+ }
+ // remove specifical skills of classes 19, 4020 and 4042
+ for(j = 315; j <= 322; j++) {
+ if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
+ char_dat[i].skill_point += char_dat[i].skill[j].lv;
+ char_dat[i].skill[j].id = 0;
+ char_dat[i].skill[j].lv = 0;
+ }
+ }
+ // remove specifical skills of classes 20, 4021 and 4043
+ for(j = 323; j <= 330; j++) {
+ if (char_dat[i].skill[j].id > 0 && !char_dat[i].skill[j].flag) {
+ char_dat[i].skill_point += char_dat[i].skill[j].lv;
+ char_dat[i].skill[j].id = 0;
+ char_dat[i].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].inventory[j].nameid && char_dat[i].inventory[j].equip)
+ char_dat[i].inventory[j].equip = 0;
+ }
+ char_dat[i].weapon = 0;
+ char_dat[i].shield = 0;
+ char_dat[i].head_top = 0;
+ char_dat[i].head_mid = 0;
+ char_dat[i].head_bottom = 0;
+ }
+ }
+ // 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 {
+ char buf[128];
+ char message[RFIFOL(fd,4) + 1]; // +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(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;
+ {
+ struct global_reg reg[ACCOUNT_REG2_NUM];
+ unsigned char buf[4096];
+ int j, p, acc;
+ acc = RFIFOL(fd,4);
+ for (p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
+ memcpy(reg[j].str, RFIFOP(fd,p), 32);
+ reg[j].value = RFIFOL(fd,p+32);
+ }
+ set_account_reg2(acc, j, reg);
+ // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
+ memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf,0) = 0x2b11;
+ mapif_sendall(buf, WBUFW(buf,2));
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+// printf("char: save_account_reg_reply\n");
+ }
+ 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].account_id == RFIFOL(fd,2)) {
+ char_delete(&char_dat[i]);
+ if (i < char_num - 1) {
+ memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct mmo_charstatus));
+ // if moved character owns to deleted account, check again it's character
+ if (char_dat[i].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 = session[j]->session_data) &&
+ sd2->account_id == char_dat[char_num-1].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;
+ {
+ char buf[32000];
+ if (gm_account != NULL)
+ free(gm_account);
+ gm_account = calloc(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++;
+ }
+ printf("From login-server: receiving of %d GM accounts information.\n", GM_num);
+ char_log("From login-server: receiving of %d GM accounts information." 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;
+
+ default:
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ RFIFOFLUSH(fd);
+
+ return 0;
+}
+
+//--------------------------------
+// Map-server anti-freeze system
+//--------------------------------
+int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
+ int i;
+
+ //printf("Entering in map_anti_freeze_system function to check freeze of servers.\n");
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] >= 0) {// if map-server is online
+ //printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]);
+ if (server_freezeflag[i]-- < 1) { // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ printf("Map-server anti-freeze system: char-server #%d is freezed -> disconnection.\n", i);
+ char_log("Map-server anti-freeze system: char-server #%d is freezed -> disconnection." RETCODE,
+ i);
+ session[server_fd[i]]->eof = 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int parse_frommap(int fd) {
+ int i, j;
+ int id;
+
+ 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){
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] == fd) {
+ printf("Map-server %d has disconnected.\n", i);
+ server_fd[i] = -1;
+ }
+ close(fd);
+ delete_session(fd);
+ create_online_files();
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+// printf("parse_frommap: 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 to reload GM accounts. Transmission to login-server (by Yor)
+ case 0x2af7:
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd,0) = 0x2709;
+ WFIFOSET(login_fd, 2);
+// printf("char : request from map-server to reload GM accounts -> login-server.\n");
+ }
+ 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 += 16) {
+ memcpy(server[id].map[j], RFIFOP(fd,i), 16);
+// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
+ j++;
+ }
+ {
+ unsigned char *p = (unsigned char *)&server[id].ip;
+ printf("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);
+ printf("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);
+ }
+ WFIFOW(fd,0) = 0x2afb;
+ WFIFOB(fd,2) = 0;
+ memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
+ WFIFOSET(fd,27);
+ {
+ unsigned char buf[16384];
+ int x;
+ if (j == 0) {
+ printf("WARNING: 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 * 16 + 10;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
+ 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][0])
+ memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
+ if (j > 0) {
+ WFIFOW(fd,2) = j * 16 + 10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ }
+ }
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // ”FØ—v‹
+ // Send character data to map-server
+ case 0x2afc:
+ if (RFIFOREST(fd) < 22)
+ return 0;
+ //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
+ auth_fifo[i].char_id == RFIFOL(fd,6) &&
+ auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
+ (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
+#endif
+ (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
+ !auth_fifo[i].delflag) {
+ auth_fifo[i].delflag = 1;
+ WFIFOW(fd,0) = 0x2afd;
+ WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
+ WFIFOL(fd,4) = RFIFOL(fd,2);
+ WFIFOL(fd,8) = auth_fifo[i].login_id2;
+ WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
+ char_dat[auth_fifo[i].char_pos].sex = auth_fifo[i].sex;
+ memcpy(WFIFOP(fd,16), &char_dat[auth_fifo[i].char_pos], sizeof(struct mmo_charstatus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
+ break;
+ }
+ }
+ if (i == AUTH_FIFO_SIZE) {
+ WFIFOW(fd,0) = 0x2afe;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ WFIFOSET(fd,6);
+ printf("auth_fifo search error! account %d not authentified.\n", RFIFOL(fd,2));
+ }
+ RFIFOSKIP(fd,22);
+ break;
+
+ // MAPƒT[ƒo[ã‚̃†[ƒU[”ŽóM
+ // Recieve alive message from map-server
+ case 0x2aff:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ server[id].users = RFIFOW(fd,4);
+ if(anti_freeze_enable)
+ server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
+ // remove all previously online players of the server
+ for(i = 0; i < online_players_max; i++)
+ if (online_chars[i].server == id) {
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ }
+ // add online players in the list by [Yor]
+ j = 0;
+ for(i = 0; i < server[id].users; i++) {
+ for(; j < online_players_max; j++)
+ if (online_chars[j].char_id == -1) {
+ online_chars[j].char_id = RFIFOL(fd,6+i*4);
+ online_chars[j].server = id;
+ //printf("%d\n", online_chars[j].char_id);
+ break;
+ }
+ // no available slots...
+ if (j == online_players_max) {
+ // create 256 new slots
+ online_players_max += 256;
+ online_chars = realloc(online_chars, sizeof(struct online_chars) * online_players_max);
+ if (!online_chars) {
+ printf("out of memory: parse_frommap - online_chars (realloc).\n");
+ exit(1);
+ }
+ for( ; j < online_players_max; j++) {
+ online_chars[j].char_id = -1;
+ online_chars[j].server = -1;
+ }
+ // save data
+ j = online_players_max - 256;
+ online_chars[j].char_id = RFIFOL(fd,6+i*4);
+ online_chars[j].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.
+ }
+ RFIFOSKIP(fd,6+i*4);
+ 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].account_id == RFIFOL(fd,4) &&
+ char_dat[i].char_id == RFIFOL(fd,8))
+ break;
+ }
+ if (i != char_num)
+ memcpy(&char_dat[i], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
+ 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;
+ //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ 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;
+
+ // ƒ}ƒbƒvƒT[ƒo[ŠÔˆÚ“®—v‹
+ case 0x2b05:
+ if (RFIFOREST(fd) < 49)
+ return 0;
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ WFIFOW(fd,0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
+ //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2);
+ auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14);
+ 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 = 0;
+ auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
+ 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,45);
+ for(i = 0; i < char_num; i++)
+ if (char_dat[i].account_id == RFIFOL(fd,2) &&
+ char_dat[i].char_id == RFIFOL(fd,14)) {
+ auth_fifo[auth_fifo_pos].char_pos = i;
+ auth_fifo_pos++;
+ WFIFOL(fd,6) = 0;
+ break;
+ }
+ if (i == char_num)
+ WFIFOW(fd,6) = 1;
+ WFIFOSET(fd,44);
+ RFIFOSKIP(fd,49);
+ break;
+
+ // ƒLƒƒƒ‰–¼ŒŸõ
+ case 0x2b08:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].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].name, 24);
+ else
+ memcpy(WFIFOP(fd,6), unknown_char_name, 24);
+ WFIFOSET(fd,30);
+ 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
+ WFIFOW(login_fd,0) = 0x2720;
+ memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2);
+ WFIFOSET(login_fd, RFIFOW(fd,2));
+ } else {
+ 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
+ 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[24];
+ int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
+ memcpy(character_name, RFIFOP(fd,6), 24);
+ character_name[sizeof(character_name) -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), 24); // 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(char_dat[i].account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = char_dat[i].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].account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x2725;
+ WFIFOL(login_fd, 2) = char_dat[i].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].account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = char_dat[i].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].account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x272a;
+ WFIFOL(login_fd, 2) = char_dat[i].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].account_id)) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x2727;
+ WFIFOL(login_fd, 2) = char_dat[i].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, 24);
+ 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);
+ }
+ RFIFOSKIP(fd, 44);
+ break;
+ }
+
+// case 0x2b0f: not more used (available for futur usage)
+
+ // account_reg•Û‘¶—v‹
+ case 0x2b10:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ struct global_reg reg[ACCOUNT_REG2_NUM];
+ int p, acc;
+ acc = RFIFOL(fd,4);
+ for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
+ memcpy(reg[j].str, RFIFOP(fd,p), 32);
+ reg[j].value = RFIFOL(fd, p+32);
+ }
+ set_account_reg2(acc, j, reg);
+ // loginƒT[ƒo[‚Ö‘—‚é
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x2728;
+ memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WFIFOSET(login_fd, WFIFOW(login_fd,2));
+ }
+ // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
+ //memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2));
+ //WBUFW(buf,0) = 0x2b11;
+ //mapif_sendall(buf, WBUFW(buf,2));
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+// printf("char: save_account_reg (from map)\n");
+ break;
+ }
+ // Map server send information to change an email of an account -> login-server
+ case 0x3000:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd,0) = 0x3000;
+ WFIFOW(login_fd,2) = RFIFOW(fd,2);
+ WFIFOL(login_fd,4) = RFIFOL(fd,4);
+ WFIFOB(login_fd,8) = RFIFOB(fd,8);
+ WFIFOSET(login_fd, RFIFOW(fd,2));
+ printf("char : change sex -> login %d %d %d \n", RFIFOL(fd,4), RFIFOB(fd,8), RFIFOW(fd,2));
+ }
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+ 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
+ printf("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n", RFIFOW(fd,0), RFIFOREST(fd));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int search_mapserver(char *map) {
+ int i, j;
+ char temp_map[16];
+ int temp_map_len;
+
+// printf("Searching the map-server for map '%s'... ", map);
+ strncpy(temp_map, map, sizeof(temp_map));
+ temp_map[sizeof(temp_map)-1] = '\0';
+ if (strchr(temp_map, '.') != NULL)
+ temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
+
+ temp_map_len = strlen(temp_map);
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ for (j = 0; server[i].map[j][0]; j++)
+ //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
+ if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
+// printf("found -> server #%d.\n", i);
+ return i;
+ }
+
+// printf("not found.\n");
+ 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. by [Yor]
+//-----------------------------------------------------
+int lan_ip_check(unsigned char *p){
+ int i;
+ int lancheck = 1;
+
+// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
+// p[0], p[1], p[2], p[3],
+// subneti[0], subneti[1], subneti[2], subneti[3],
+// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+ for(i = 0; i < 4; i++) {
+ if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
+ lancheck = 0;
+ break;
+ }
+ }
+ printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
+ return lancheck;
+}
+
+int parse_char(int fd) {
+ int i, ch;
+ char email[40];
+ struct char_session_data *sd;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+
+ 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;
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ sd = session[fd]->session_data;
+
+ while (RFIFOREST(fd) >= 2) {
+// if (RFIFOW(fd,0) < 30000)
+// printf("parse_char: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+
+ switch(RFIFOW(fd,0)) {
+ 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;
+ if ((GM_value = isGM(RFIFOL(fd,2))))
+ printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value);
+ else
+ printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
+ if (sd == NULL) {
+ sd = session[fd]->session_data = calloc(sizeof(struct char_session_data), 1);
+ memset(sd, 0, sizeof(struct char_session_data));
+ memcpy(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 (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
+ 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
+ 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
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOW(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ }
+ }
+ RFIFOSKIP(fd,17);
+ break;
+
+ case 0x66: // ƒLƒƒƒ‰‘I‘ð
+ if (RFIFOREST(fd) < 3)
+ return 0;
+
+ // 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
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
+ WFIFOSET(fd, 3);
+
+ // otherwise, load the character
+ } else {
+ for (ch = 0; ch < 9; ch++)
+ if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].char_num == RFIFOB(fd,2))
+ break;
+ if (ch != 9) {
+ char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE,
+ sd->account_id, RFIFOB(fd,2), char_dat[sd->found_char[ch]].name);
+ // searching map server
+ i = search_mapserver(char_dat[sd->found_char[ch]].last_point.map);
+ // if map is not found, we check major cities
+ if (i < 0) {
+ if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "prontera.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 273; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 354;
+ } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "geffen.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 120; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 100;
+ } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "morocc.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 160; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 94;
+ } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "alberta.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 116; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 57;
+ } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "payon.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 87; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 117;
+ } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, "izlude.gat", 16);
+ char_dat[sd->found_char[ch]].last_point.x = 94; // savepoint coordonates
+ char_dat[sd->found_char[ch]].last_point.y = 103;
+ } else {
+ int j;
+ // get first online server (with a map)
+ i = 0;
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0][0]) { // change save point to one of map found on the server (the first)
+ i = j;
+ memcpy(char_dat[sd->found_char[ch]].last_point.map, server[j].map[0], 16);
+ printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
+ // coordonates are unknown
+ break;
+ }
+ // if no map-server is connected, we send: server closed
+ if (j == MAX_MAP_SERVERS) {
+ WFIFOW(fd,0) = 0x81;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd,3);
+ break;
+ }
+ }
+ }
+ WFIFOW(fd,0) = 0x71;
+ WFIFOL(fd,2) = char_dat[sd->found_char[ch]].char_id;
+ memcpy(WFIFOP(fd,6), char_dat[sd->found_char[ch]].last_point.map, 16);
+ printf("Character selection '%s' (account: %d, slot: %d).\n", char_dat[sd->found_char[ch]].name, sd->account_id, ch);
+ printf("--Send IP of map-server. ");
+ if (lan_ip_check(p))
+ WFIFOL(fd, 22) = inet_addr(lan_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;
+ //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2);
+ auth_fifo[auth_fifo_pos].account_id = sd->account_id;
+ auth_fifo[auth_fifo_pos].char_id = char_dat[sd->found_char[ch]].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;
+ auth_fifo_pos++;
+ }
+ }
+ RFIFOSKIP(fd,3);
+ break;
+
+ case 0x67: // ì¬
+ if (RFIFOREST(fd) < 37)
+ return 0;
+ i = make_new_char(fd, RFIFOP(fd,2));
+ if (i < 0) {
+ WFIFOW(fd,0) = 0x6e;
+ WFIFOB(fd,2) = 0x00;
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd,37);
+ break;
+ }
+
+ WFIFOW(fd,0) = 0x6d;
+ memset(WFIFOP(fd,2), 0, 106);
+
+ WFIFOL(fd,2) = char_dat[i].char_id;
+ WFIFOL(fd,2+4) = char_dat[i].base_exp;
+ WFIFOL(fd,2+8) = char_dat[i].zeny;
+ WFIFOL(fd,2+12) = char_dat[i].job_exp;
+ WFIFOL(fd,2+16) = char_dat[i].job_level;
+
+ WFIFOL(fd,2+28) = char_dat[i].karma;
+ WFIFOL(fd,2+32) = char_dat[i].manner;
+
+ WFIFOW(fd,2+40) = 0x30;
+ WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
+ WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
+ WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
+ WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
+ WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
+ WFIFOW(fd,2+52) = char_dat[i].class;
+ WFIFOW(fd,2+54) = char_dat[i].hair;
+
+ WFIFOW(fd,2+58) = char_dat[i].base_level;
+ WFIFOW(fd,2+60) = char_dat[i].skill_point;
+
+ WFIFOW(fd,2+64) = char_dat[i].shield;
+ WFIFOW(fd,2+66) = char_dat[i].head_top;
+ WFIFOW(fd,2+68) = char_dat[i].head_mid;
+ WFIFOW(fd,2+70) = char_dat[i].hair_color;
+
+ memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
+
+ WFIFOB(fd,2+98) = (char_dat[i].str > 255) ? 255 : char_dat[i].str;
+ WFIFOB(fd,2+99) = (char_dat[i].agi > 255) ? 255 : char_dat[i].agi;
+ WFIFOB(fd,2+100) = (char_dat[i].vit > 255) ? 255 : char_dat[i].vit;
+ WFIFOB(fd,2+101) = (char_dat[i].int_ > 255) ? 255 : char_dat[i].int_;
+ WFIFOB(fd,2+102) = (char_dat[i].dex > 255) ? 255 : char_dat[i].dex;
+ WFIFOB(fd,2+103) = (char_dat[i].luk > 255) ? 255 : char_dat[i].luk;
+ WFIFOB(fd,2+104) = char_dat[i].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
+ if (RFIFOREST(fd) < 46)
+ return 0;
+ 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]].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]].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]])->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 = session[j]->session_data) &&
+ sd2->account_id == char_dat[char_num-1].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;
+ WFIFOW(fd,0) = 0x2af9;
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] < 0)
+ break;
+ }
+ if (i == MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), 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;
+ if(anti_freeze_enable)
+ server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
+ 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î•ñŠ“¾
+ 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‚É‚·‚邽‚ß)
+ session[fd]->eof = 1;
+ return 0;
+
+ 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 *)malloc(64);
+ command = (char *)malloc(64);
+
+ memset(type,0,64);
+ memset(command,0,64);
+
+ printf("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ printf("Type of command: %s || Command: %s \n",type,command);
+
+ free(buf);
+ free(type);
+ free(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) {
+ 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) {
+ 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]) {
+ 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();
+ char buf[16];
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send number of user to login server
+ 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;
+}
+
+int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
+ if (login_fd <= 0 || session[login_fd] == NULL) {
+ printf("Attempt to connect to login-server...\n");
+ login_fd = make_connection(login_ip, login_port);
+ session[login_fd]->func_parse = parse_tologin;
+ realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ WFIFOW(login_fd,0) = 0x2710;
+ memset(WFIFOP(login_fd,2), 0, 24);
+ memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
+ memset(WFIFOP(login_fd,26), 0, 24);
+ memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
+ WFIFOL(login_fd,50) = 0;
+ WFIFOL(login_fd,54) = char_ip;
+ WFIFOL(login_fd,58) = char_port;
+ memset(WFIFOP(login_fd,60), 0, 20);
+ memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
+ WFIFOW(login_fd,80) = 0;
+ WFIFOW(login_fd,82) = char_maintenance;
+ WFIFOW(login_fd,84) = char_new;
+ WFIFOSET(login_fd,86);
+ }
+ 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 by [Yor]
+//-------------------------------------------
+int lan_config_read(const char *lancfgName) {
+ int j;
+ struct hostent * h = NULL;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ // set default configuration
+ strncpy(lan_map_ip, "127.0.0.1", sizeof(lan_map_ip));
+ subneti[0] = 127;
+ subneti[1] = 0;
+ subneti[2] = 0;
+ subneti[3] = 1;
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = 255;
+
+ fp = fopen(lancfgName, "r");
+
+ if (fp == NULL) {
+ printf("LAN support configuration file not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ printf ("---start reading of Lan Support configuration...\n");
+
+ 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(w1);
+ remove_control_chars(w2);
+ if (strcmpi(w1, "lan_map_ip") == 0) { // Read map-server Lan IP Address
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ sprintf(lan_map_ip, "%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 {
+ strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
+ lan_map_ip[sizeof(lan_map_ip)-1] = 0;
+ }
+ printf("LAN IP of map-server: %s.\n", lan_map_ip);
+ } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
+ for(j = 0; j < 4; j++)
+ subneti[j] = 0;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ for(j = 0; j < 4; j++)
+ subneti[j] = (unsigned char)h->h_addr[j];
+ } else {
+ sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
+ }
+ printf("Sub-network of the map-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
+ } else if (strcmpi(w1, "subnetmask") == 0){ // Read Subnetwork Mask
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = 255;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = (unsigned char)h->h_addr[j];
+ } else {
+ sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
+ }
+ printf("Sub-network mask of the map-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+ }
+ }
+ fclose(fp);
+
+ // sub-network check of the map-server
+ {
+ unsigned int a0, a1, a2, a3;
+ unsigned char p[4];
+ sscanf(lan_map_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
+ p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
+ printf("LAN test of LAN IP of the map-server: ");
+ if (lan_ip_check(p) == 0) {
+ printf("\033[1;31m***ERROR: LAN IP of the map-server doesn't belong to the specified Sub-network.\033[0m\n");
+ }
+ }
+
+ printf("---End reading of Lan Support configuration...\n");
+
+ return 0;
+}
+
+int char_config_read(const char *cfgName) {
+ struct hostent *h = NULL;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp = fopen(cfgName, "r");
+
+ if (fp == NULL) {
+ printf("Configuration file not found: %s.\n", cfgName);
+ exit(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;
+
+ remove_control_chars(w1);
+ remove_control_chars(w2);
+ if (strcmpi(w1, "userid") == 0) {
+ memcpy(userid, w2, 24);
+ } else if (strcmpi(w1, "passwd") == 0) {
+ memcpy(passwd, w2, 24);
+ } else if (strcmpi(w1, "server_name") == 0) {
+ memcpy(server_name, w2, sizeof(server_name));
+ server_name[sizeof(server_name) - 1] = '\0';
+ printf("%s server has been intialized\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) {
+ login_ip_set_ = 1;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ 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(login_ip_str, "%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(login_ip_str, w2, 16);
+ } else if (strcmpi(w1, "login_port") == 0) {
+ login_port = atoi(w2);
+ } else if (strcmpi(w1, "char_ip") == 0) {
+ char_ip_set_ = 1;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ printf("Character 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(char_ip_str, "%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(char_ip_str, w2, 16);
+ } 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, "email_creation") == 0) {
+ email_creation = config_switch(w2);
+ } 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);
+ } 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, "check_ip_flag") == 0) {
+ check_ip_flag = 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, "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
+ memcpy(start_point.map, map, 16);
+ start_point.x = x;
+ start_point.y = y;
+ }
+ } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
+ flush_on = atoi(w2); //Added by Mugendai for GUI
+ } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
+ flush_time = atoi(w2); //Added by Mugendai for GUI
+ } 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[24] = 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,"anti_freeze_enable")==0){
+ anti_freeze_enable = config_switch(w2);
+ } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
+ ANTI_FREEZE_INTERVAL = atoi(w2);
+ if (ANTI_FREEZE_INTERVAL < 5)
+ ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
+ } else if (strcmpi(w1, "import") == 0) {
+ char_config_read(w2);
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+//-----------------------------------------------------
+//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 do_final(void) {
+ int i;
+
+ // write online players files with no player
+ for(i = 0; i < online_players_max; i++) {
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ }
+ create_online_files();
+ free(online_chars);
+
+ mmo_char_sync();
+ inter_save();
+
+ if (gm_account != NULL)
+ free(gm_account);
+
+ free(char_dat);
+ delete_session(login_fd);
+ delete_session(char_fd);
+
+ char_log("----End of char-server (normal end with closing of all files)." RETCODE);
+}
+
+int do_init(int argc, char **argv) {
+ int i;
+
+ // a newline in the log...
+ char_log("");
+ char_log("The char-server starting..." RETCODE);
+
+ char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
+ lan_config_read((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME);
+
+ if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
+ // 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)
+ printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
+ else
+ printf("Defaulting to %s as our IP address\n", buf);
+ if (login_ip_set_ == 0)
+ strcpy(login_ip_str, buf);
+ if (char_ip_set_ == 0)
+ strcpy(char_ip_str, buf);
+
+ if (ptr[0] == 192 && ptr[1] == 168)
+ printf("Firewall detected.. edit lan_support.conf and char_athena.conf");
+ }
+
+ login_ip = inet_addr(login_ip_str);
+ char_ip = inet_addr(char_ip_str);
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ memset(&server[i], 0, sizeof(struct mmo_map_server));
+ server_fd[i] = -1;
+ }
+
+ online_players_max = 256;
+ online_chars = calloc(sizeof(struct online_chars) * 256, 1);
+ if (!online_chars) {
+ printf("out of memory: do_init (calloc).\n");
+ exit(1);
+ }
+ for(i = 0; i < online_players_max; i++) {
+ online_chars[i].char_id = -1;
+ online_chars[i].server = -1;
+ }
+
+
+ mmo_char_init();
+
+ update_online = time(NULL);
+ create_online_files(); // update online players files at start of the server
+
+ inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ‰Šú‰»
+
+ set_termfunc(do_final);
+ set_defaultparse(parse_char);
+
+ char_fd = make_listen_port(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(mmo_char_sync_timer, "mmo_char_sync_timer");
+
+ i = add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000);
+ i = add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000);
+ i = add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval);
+
+ //Added for Mugendais I'm Alive mod
+ if (imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+
+ //Added by Mugendai for GUI support
+ if (flush_on)
+ add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+
+
+
+ if(anti_freeze_enable > 0) {
+ add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
+ i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies
+ }
+
+ 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);
+
+ printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
+
+ return 0;
+}
diff --git a/src/char/char.h b/src/char/char.h
index 6c3b6a615..3ee2f9f6d 100644
--- a/src/char/char.h
+++ b/src/char/char.h
@@ -1,32 +1,32 @@
-// $Id: char.h,v 1.1.1.1 2004/09/10 17:26:50 MagicalTux Exp $
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-#define LOGIN_LAN_CONF_NAME "conf/lan_support.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-
-int search_character_index(char* character_name);
-char * search_character_name(int index);
-
-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_log(char *fmt, ...);
-
-extern int autosave_interval;
-extern char db_path[];
-
-#endif
+// $Id: char.h,v 1.1.1.1 2004/09/10 17:26:50 MagicalTux Exp $
+#ifndef _CHAR_H_
+#define _CHAR_H_
+
+#define MAX_MAP_SERVERS 30
+
+#define CHAR_CONF_NAME "conf/char_athena.conf"
+
+#define LOGIN_LAN_CONF_NAME "conf/lan_support.conf"
+
+#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+
+struct mmo_map_server{
+ long ip;
+ short port;
+ int users;
+ char map[MAX_MAP_PER_SERVER][16];
+};
+
+int search_character_index(char* character_name);
+char * search_character_name(int index);
+
+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_log(char *fmt, ...);
+
+extern int autosave_interval;
+extern char db_path[];
+
+#endif
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 025a6e6c7..586b42f55 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -1,1446 +1,1446 @@
-// $Id: int_guild.c,v 1.2 2004/09/25 19:36:53 Akitasha Exp $
-#include "inter.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-char guild_txt[1024] = "save/guild.txt";
-char castle_txt[1024] = "save/castle.txt";
-
-static struct dbt *guild_db;
-static struct dbt *castle_db;
-
-static int guild_newid = 10000;
-
-static 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(void *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,%d,%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,%d,%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_GUILDEXPLUSION; i++)
- if (g->explusion[i].account_id > 0)
- c++;
- len += sprintf(str + len, "%d\t", c);
- for(i = 0; i < MAX_GUILDEXPLUSION; i++) {
- struct guild_explusion *e = &g->explusion[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;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_guild_fromstr(char *str, struct guild *g) {
- int i, j, c;
- 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,%d,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0],
- tmp_str[0], tmp_str[1],
- &tmp_int[1], &tmp_int[2], &tmp_int[3], &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 = tmp_int[3];
- g->skill_point = tmp_int[4];
- g->castle_id = tmp_int[5];
- memcpy(g->name, tmp_str[0], 24);
- memcpy(g->master, tmp_str[1], 24);
- 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,%d,%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], &tmp_int[7], &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 = tmp_int[7];
- m->exp_payper = tmp_int[8];
- m->position = tmp_int[9];
- memcpy(m->name, tmp_str[0], 24);
-
- 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], 24);
-
- 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], 24);
-
- 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_explusion *e = &g->explusion[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], 24);
- 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;
-}
-
-// ƒ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->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4,
- gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2,
- gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
-
- return 0;
-}
-
-// ƒ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->visibleG0 = tmp_int[10];
- gc->visibleG1 = tmp_int[11];
- gc->visibleG2 = tmp_int[12];
- gc->visibleG3 = tmp_int[13];
- gc->visibleG4 = tmp_int[14];
- gc->visibleG5 = tmp_int[15];
- gc->visibleG6 = tmp_int[16];
- gc->visibleG7 = tmp_int[17];
- gc->Ghp0 = tmp_int[18];
- gc->Ghp1 = tmp_int[19];
- gc->Ghp2 = tmp_int[20];
- gc->Ghp3 = tmp_int[21];
- gc->Ghp4 = tmp_int[22];
- gc->Ghp5 = tmp_int[23];
- gc->Ghp6 = tmp_int[24];
- gc->Ghp7 = 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) {
- 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->visibleG0 = tmp_int[10];
- gc->visibleG1 = tmp_int[11];
- gc->visibleG2 = tmp_int[12];
- gc->visibleG3 = tmp_int[13];
- gc->visibleG4 = tmp_int[14];
- gc->visibleG5 = tmp_int[15];
- gc->visibleG6 = tmp_int[16];
- gc->visibleG7 = tmp_int[17];
- if (gc->visibleG0 == 1)
- gc->Ghp0 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp0 = 0;
- if (gc->visibleG1 == 1)
- gc->Ghp1 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp1 = 0;
- if (gc->visibleG2 == 1)
- gc->Ghp2 = 15670 + 2000 * gc->defense;
- else
- gc->Ghp2 = 0;
- if (gc->visibleG3 == 1)
- gc->Ghp3 = 30214 + 2000 * gc->defense;
- else
- gc->Ghp3 = 0;
- if (gc->visibleG4 == 1)
- gc->Ghp4 = 30214 + 2000 * gc->defense;
- else
- gc->Ghp4 = 0;
- if (gc->visibleG5 == 1)
- gc->Ghp5 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp5 = 0;
- if (gc->visibleG6 == 1)
- gc->Ghp6 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp6 = 0;
- if (gc->visibleG7 == 1)
- gc->Ghp7 = 28634 + 2000 * gc->defense;
- else
- gc->Ghp7 = 0;
- } else {
- return 1;
- }
-
- return 0;
-}
-
-// ƒMƒ‹ƒhŠÖ˜Aƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
-int inter_guild_readdb() {
- 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) {
- printf("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] = atoi(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 = numdb_init();
- castle_db = numdb_init();
-
- 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 = calloc(sizeof(struct guild), 1);
- if(g == NULL){
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(g, 0, sizeof(struct guild));
- if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) {
- if (g->guild_id >= guild_newid)
- guild_newid = g->guild_id + 1;
- numdb_insert(guild_db, g->guild_id, g);
- guild_check_empty(g);
- guild_calcinfo(g);
- } else {
- printf("int_guild: broken data [%s] line %d\n", guild_txt, c);
- free(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 = calloc(sizeof(struct guild_castle), 1);
- if(gc == NULL){
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(gc, 0, sizeof(struct guild_castle));
- if (inter_guildcastle_fromstr(line, gc) == 0) {
- numdb_insert(castle_db, gc->castle_id, gc);
- } else {
- printf("int_guild: broken data [%s] line %d\n", castle_txt, c);
- free(gc);
- }
- c++;
- }
-
- if (!c) {
- printf(" %s - making Default Data...\n", castle_txt);
- //ƒfƒtƒHƒ‹ƒgƒf[ƒ^‚ðì¬
- for(i = 0; i < MAX_GUILDCASTLE; i++) {
- gc = calloc(sizeof(struct guild_castle), 1);
- if (gc == NULL) {
- printf("int_guild: out of memory!\n");
- exit(0);
- }
- memset(gc, 0, sizeof(struct guild_castle));
- gc->castle_id = i;
- gc->guild_id = 0;
- gc->economy = 0;
- gc->defense = 0;
- gc->triggerE = 0;
- gc->triggerD = 0;
- gc->nextTime = 0;
- gc->payTime = 0;
- gc->createTime = 0;
- gc->visibleC = 0;
- gc->visibleG0 = 0;
- gc->visibleG1 = 0;
- gc->visibleG2 = 0;
- gc->visibleG3 = 0;
- gc->visibleG4 = 0;
- gc->visibleG5 = 0;
- gc->visibleG6 = 0;
- gc->visibleG7 = 0;
- gc->Ghp0 = 0; // guardian HP [Valaris]
- gc->Ghp1 = 0;
- gc->Ghp2 = 0;
- gc->Ghp3 = 0;
- gc->Ghp4 = 0;
- gc->Ghp5 = 0;
- gc->Ghp6 = 0;
- gc->Ghp7 = 0; // end additions [Valaris]
- numdb_insert(castle_db, gc->castle_id, gc);
- }
- printf(" %s - making done\n",castle_txt);
- return 0;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-struct guild *inter_guild_search(int guild_id) {
- struct guild *g;
-
- g=numdb_search(guild_db, guild_id);
-
- return g;
-}
-
-// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu—p
-int inter_guild_save_sub(void *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(void *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) {
- printf("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt);
- return 1;
- }
- numdb_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) {
- printf("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt);
- return 1;
- }
- numdb_foreach(castle_db, inter_castle_save_sub, fp);
- lock_fclose(fp, castle_txt, &lock);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–¼ŒŸõ—p
-int search_guildname_sub(void *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;
- numdb_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
- numdb_foreach(guild_db, guild_break_sub, g->guild_id);
- numdb_erase(guild_db, g->guild_id);
- inter_guild_storage_delete(g->guild_id);
- mapif_guild_broken(g->guild_id, 0);
- free(g);
-
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int guild_check_conflict_sub(void *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‘Þ
- printf("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) {
- numdb_foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id);
-
- return 0;
-}
-
-int guild_nextexp(int level) {
- if (level < 100)
- return guild_exp[level-1];
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g, int id){
- return g->skill[id-10000].lv;
-}
-
-// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
-int guild_calcinfo(struct guild *g) {
- int i, c, nextexp;
- struct guild before = *g;
-
- // ƒXƒLƒ‹ID‚ÌÝ’è
- for(i = 0; i < MAX_GUILDSKILL; i++)
- g->skill[i].id = i + 10000;
-
- // ƒ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) { // ƒŒƒxƒ‹ƒAƒbƒvˆ—
- 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, 10004) * 2;
-
- // •½‹ÏƒŒƒ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) {
- WFIFOW(fd,0) = 0x3830;
- WFIFOL(fd,2) = account_id;
- if (g != NULL) {
- WFIFOL(fd,6) = g->guild_id;
- printf("int_guild: created! %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) {
- WFIFOW(fd,0) = 0x3831;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = guild_id;
- WFIFOSET(fd,8);
- printf("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[4 + 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) {
- 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, 24);
- mapif_sendall(buf, 79);
- printf("int_guild: guild leaved %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) = 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);
- printf("int_guild: broken %d\n", guild_id);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh“à”­Œ¾
-int mapif_guild_message(int guild_id, int account_id, char *mes, int len) {
- unsigned char buf[len+12];
-
- 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_sendall(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[len + 18];
-
- 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, 24);
- memcpy(WBUFP(buf,43), name2, 24);
- mapif_sendall(buf, 67);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int mapif_guild_position(struct guild *g, int idx) {
- unsigned char buf[sizeof(struct guild_position) + 12];
-
- 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_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(void *key, void *data, va_list ap) {
- int fd = va_arg(ap, int);
- int *p = va_arg(ap, int*);
-
- 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;
-
- WFIFOW(fd,0) = 0x3842;
- numdb_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 < 24 && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- printf("int_guild: illeagal guild name [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
- }
-
- if ((g = search_guildname(name)) != NULL) {
- printf("int_guild: same name guild exists [%s]\n", name);
- mapif_guild_created(fd, account_id, NULL);
- return 0;
- }
- g = calloc(sizeof(struct guild), 1);
- if (g == NULL) {
- printf("int_guild: CreateGuild: out of memory !\n");
- mapif_guild_created(fd, account_id, NULL);
- exit(0);
- }
- memset(g, 0, sizeof(struct guild));
- g->guild_id = guild_newid++;
- memcpy(g->name, name, 24);
- memcpy(g->master, master->name, 24);
- 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 + 10000;
-
- numdb_insert(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 = numdb_search(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 = numdb_search(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 = numdb_search(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_GUILDEXPLUSION; j++) {
- if (g->explusion[j].account_id == 0)
- break;
- }
- if (j == MAX_GUILDEXPLUSION) { // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
- for(j = 0; j < MAX_GUILDEXPLUSION - 1; j++)
- g->explusion[j] = g->explusion[j+1];
- j = MAX_GUILDEXPLUSION - 1;
- }
- g->explusion[j].account_id = account_id;
- memcpy(g->explusion[j].acc, "dummy", 24);
- memcpy(g->explusion[j].name, g->member[i].name, 24);
- memcpy(g->explusion[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 = numdb_search(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++;
- }
- // •½‹ÏƒŒƒxƒ‹
- g->average_lv = alv / c;
-
- return 0;
-}
-
-// ƒMƒ‹ƒh‰ðŽUˆ——pi“¯–¿/“G‘΂ð‰ðœj
-int guild_break_sub(void *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 = numdb_search(guild_db, guild_id);
- if(g == NULL)
- return 0;
-
- numdb_foreach(guild_db, guild_break_sub, guild_id);
- numdb_erase(guild_db, 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);
- free(g);
-
- 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);
-}
-
-// ƒ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 = numdb_search(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:
- printf("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 = numdb_search(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) {
- printf("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
- {
- int exp, oldexp = g->member[i].exp;
- exp = g->member[i].exp = *((unsigned int *)data);
- g->exp += (exp - oldexp);
- guild_calcinfo(g); // LvƒAƒbƒv”»’f
- mapif_guild_basicinfochanged(guild_id, GBI_EXP, &g->exp, 4);
- }
- break;
- default:
- printf("int_guild: GuildMemberInfoChange: Unknown type %d\n", type);
- break;
- }
- mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len);
-
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
-int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) {
- struct guild *g = numdb_search(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);
- printf("int_guild: position changed %d\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 = numdb_search(guild_db, guild_id);
- int idx = skill_num - 10000;
-
- if (g == NULL || skill_num < 10000)
- 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);
- printf("int_guild: skill %d up\n", skill_num);
- }
-
- 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] = numdb_search(guild_db, guild_id1);
- g[1] = numdb_search(guild_db, guild_id2);
- 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, 24);
- 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 = numdb_search(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 = numdb_search(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 = numdb_search(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: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG0);
- case 11: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG1);
- case 12: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG2);
- case 13: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG3);
- case 14: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG4);
- case 15: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG5);
- case 16: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG6);
- case 17: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG7);
- case 18: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp0); // guardian HP [Valaris]
- case 19: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp1);
- case 20: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp2);
- case 21: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp3);
- case 22: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp4);
- case 23: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp5);
- case 24: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp6);
- case 25: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp7); // end additions [Valaris]
-
- default:
- printf("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=numdb_search(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 = numdb_search(guild_db, gid);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", index);
- }
- 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: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("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);
-}
-
-// 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) {
- switch(RFIFOW(fd,0)) {
- case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), 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 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), 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), 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), 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), 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), RFIFOP(fd,6), RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), 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, "**ƒT[ƒo[–½—ß**");
-}
+// $Id: int_guild.c,v 1.2 2004/09/25 19:36:53 Akitasha Exp $
+#include "inter.h"
+#include "int_guild.h"
+#include "int_storage.h"
+#include "mmo.h"
+#include "char.h"
+#include "socket.h"
+#include "db.h"
+#include "lock.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char guild_txt[1024] = "save/guild.txt";
+char castle_txt[1024] = "save/castle.txt";
+
+static struct dbt *guild_db;
+static struct dbt *castle_db;
+
+static int guild_newid = 10000;
+
+static 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(void *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,%d,%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,%d,%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_GUILDEXPLUSION; i++)
+ if (g->explusion[i].account_id > 0)
+ c++;
+ len += sprintf(str + len, "%d\t", c);
+ for(i = 0; i < MAX_GUILDEXPLUSION; i++) {
+ struct guild_explusion *e = &g->explusion[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;
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
+int inter_guild_fromstr(char *str, struct guild *g) {
+ int i, j, c;
+ 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,%d,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0],
+ tmp_str[0], tmp_str[1],
+ &tmp_int[1], &tmp_int[2], &tmp_int[3], &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 = tmp_int[3];
+ g->skill_point = tmp_int[4];
+ g->castle_id = tmp_int[5];
+ memcpy(g->name, tmp_str[0], 24);
+ memcpy(g->master, tmp_str[1], 24);
+ 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,%d,%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], &tmp_int[7], &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 = tmp_int[7];
+ m->exp_payper = tmp_int[8];
+ m->position = tmp_int[9];
+ memcpy(m->name, tmp_str[0], 24);
+
+ 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], 24);
+
+ 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], 24);
+
+ 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_explusion *e = &g->explusion[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], 24);
+ 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;
+}
+
+// ƒ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->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4,
+ gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2,
+ gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
+
+ return 0;
+}
+
+// ƒ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->visibleG0 = tmp_int[10];
+ gc->visibleG1 = tmp_int[11];
+ gc->visibleG2 = tmp_int[12];
+ gc->visibleG3 = tmp_int[13];
+ gc->visibleG4 = tmp_int[14];
+ gc->visibleG5 = tmp_int[15];
+ gc->visibleG6 = tmp_int[16];
+ gc->visibleG7 = tmp_int[17];
+ gc->Ghp0 = tmp_int[18];
+ gc->Ghp1 = tmp_int[19];
+ gc->Ghp2 = tmp_int[20];
+ gc->Ghp3 = tmp_int[21];
+ gc->Ghp4 = tmp_int[22];
+ gc->Ghp5 = tmp_int[23];
+ gc->Ghp6 = tmp_int[24];
+ gc->Ghp7 = 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) {
+ 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->visibleG0 = tmp_int[10];
+ gc->visibleG1 = tmp_int[11];
+ gc->visibleG2 = tmp_int[12];
+ gc->visibleG3 = tmp_int[13];
+ gc->visibleG4 = tmp_int[14];
+ gc->visibleG5 = tmp_int[15];
+ gc->visibleG6 = tmp_int[16];
+ gc->visibleG7 = tmp_int[17];
+ if (gc->visibleG0 == 1)
+ gc->Ghp0 = 15670 + 2000 * gc->defense;
+ else
+ gc->Ghp0 = 0;
+ if (gc->visibleG1 == 1)
+ gc->Ghp1 = 15670 + 2000 * gc->defense;
+ else
+ gc->Ghp1 = 0;
+ if (gc->visibleG2 == 1)
+ gc->Ghp2 = 15670 + 2000 * gc->defense;
+ else
+ gc->Ghp2 = 0;
+ if (gc->visibleG3 == 1)
+ gc->Ghp3 = 30214 + 2000 * gc->defense;
+ else
+ gc->Ghp3 = 0;
+ if (gc->visibleG4 == 1)
+ gc->Ghp4 = 30214 + 2000 * gc->defense;
+ else
+ gc->Ghp4 = 0;
+ if (gc->visibleG5 == 1)
+ gc->Ghp5 = 28634 + 2000 * gc->defense;
+ else
+ gc->Ghp5 = 0;
+ if (gc->visibleG6 == 1)
+ gc->Ghp6 = 28634 + 2000 * gc->defense;
+ else
+ gc->Ghp6 = 0;
+ if (gc->visibleG7 == 1)
+ gc->Ghp7 = 28634 + 2000 * gc->defense;
+ else
+ gc->Ghp7 = 0;
+ } else {
+ return 1;
+ }
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhŠÖ˜Aƒf[ƒ^ƒx[ƒX“Ç‚Ýž‚Ý
+int inter_guild_readdb() {
+ 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) {
+ printf("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] = atoi(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 = numdb_init();
+ castle_db = numdb_init();
+
+ 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 = calloc(sizeof(struct guild), 1);
+ if(g == NULL){
+ printf("int_guild: out of memory!\n");
+ exit(0);
+ }
+ memset(g, 0, sizeof(struct guild));
+ if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) {
+ if (g->guild_id >= guild_newid)
+ guild_newid = g->guild_id + 1;
+ numdb_insert(guild_db, g->guild_id, g);
+ guild_check_empty(g);
+ guild_calcinfo(g);
+ } else {
+ printf("int_guild: broken data [%s] line %d\n", guild_txt, c);
+ free(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 = calloc(sizeof(struct guild_castle), 1);
+ if(gc == NULL){
+ printf("int_guild: out of memory!\n");
+ exit(0);
+ }
+ memset(gc, 0, sizeof(struct guild_castle));
+ if (inter_guildcastle_fromstr(line, gc) == 0) {
+ numdb_insert(castle_db, gc->castle_id, gc);
+ } else {
+ printf("int_guild: broken data [%s] line %d\n", castle_txt, c);
+ free(gc);
+ }
+ c++;
+ }
+
+ if (!c) {
+ printf(" %s - making Default Data...\n", castle_txt);
+ //ƒfƒtƒHƒ‹ƒgƒf[ƒ^‚ðì¬
+ for(i = 0; i < MAX_GUILDCASTLE; i++) {
+ gc = calloc(sizeof(struct guild_castle), 1);
+ if (gc == NULL) {
+ printf("int_guild: out of memory!\n");
+ exit(0);
+ }
+ memset(gc, 0, sizeof(struct guild_castle));
+ gc->castle_id = i;
+ gc->guild_id = 0;
+ gc->economy = 0;
+ gc->defense = 0;
+ gc->triggerE = 0;
+ gc->triggerD = 0;
+ gc->nextTime = 0;
+ gc->payTime = 0;
+ gc->createTime = 0;
+ gc->visibleC = 0;
+ gc->visibleG0 = 0;
+ gc->visibleG1 = 0;
+ gc->visibleG2 = 0;
+ gc->visibleG3 = 0;
+ gc->visibleG4 = 0;
+ gc->visibleG5 = 0;
+ gc->visibleG6 = 0;
+ gc->visibleG7 = 0;
+ gc->Ghp0 = 0; // guardian HP [Valaris]
+ gc->Ghp1 = 0;
+ gc->Ghp2 = 0;
+ gc->Ghp3 = 0;
+ gc->Ghp4 = 0;
+ gc->Ghp5 = 0;
+ gc->Ghp6 = 0;
+ gc->Ghp7 = 0; // end additions [Valaris]
+ numdb_insert(castle_db, gc->castle_id, gc);
+ }
+ printf(" %s - making done\n",castle_txt);
+ return 0;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+struct guild *inter_guild_search(int guild_id) {
+ struct guild *g;
+
+ g=numdb_search(guild_db, guild_id);
+
+ return g;
+}
+
+// ƒMƒ‹ƒhƒf[ƒ^‚̃Z[ƒu—p
+int inter_guild_save_sub(void *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(void *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) {
+ printf("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt);
+ return 1;
+ }
+ numdb_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) {
+ printf("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt);
+ return 1;
+ }
+ numdb_foreach(castle_db, inter_castle_save_sub, fp);
+ lock_fclose(fp, castle_txt, &lock);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh–¼ŒŸõ—p
+int search_guildname_sub(void *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;
+ numdb_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
+ numdb_foreach(guild_db, guild_break_sub, g->guild_id);
+ numdb_erase(guild_db, g->guild_id);
+ inter_guild_storage_delete(g->guild_id);
+ mapif_guild_broken(g->guild_id, 0);
+ free(g);
+
+ return 1;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
+int guild_check_conflict_sub(void *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‘Þ
+ printf("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) {
+ numdb_foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id);
+
+ return 0;
+}
+
+int guild_nextexp(int level) {
+ if (level < 100)
+ return guild_exp[level-1];
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
+int guild_checkskill(struct guild *g, int id){
+ return g->skill[id-10000].lv;
+}
+
+// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
+int guild_calcinfo(struct guild *g) {
+ int i, c, nextexp;
+ struct guild before = *g;
+
+ // ƒXƒLƒ‹ID‚ÌÝ’è
+ for(i = 0; i < MAX_GUILDSKILL; i++)
+ g->skill[i].id = i + 10000;
+
+ // ƒ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) { // ƒŒƒxƒ‹ƒAƒbƒvˆ—
+ 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, 10004) * 2;
+
+ // •½‹ÏƒŒƒ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) {
+ WFIFOW(fd,0) = 0x3830;
+ WFIFOL(fd,2) = account_id;
+ if (g != NULL) {
+ WFIFOL(fd,6) = g->guild_id;
+ printf("int_guild: created! %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) {
+ WFIFOW(fd,0) = 0x3831;
+ WFIFOW(fd,2) = 8;
+ WFIFOL(fd,4) = guild_id;
+ WFIFOSET(fd,8);
+ printf("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[4 + 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) {
+ 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, 24);
+ mapif_sendall(buf, 79);
+ printf("int_guild: guild leaved %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) = 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);
+ printf("int_guild: broken %d\n", guild_id);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh“à”­Œ¾
+int mapif_guild_message(int guild_id, int account_id, char *mes, int len) {
+ unsigned char buf[len+12];
+
+ 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_sendall(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[len + 18];
+
+ 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, 24);
+ memcpy(WBUFP(buf,43), name2, 24);
+ mapif_sendall(buf, 67);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+int mapif_guild_position(struct guild *g, int idx) {
+ unsigned char buf[sizeof(struct guild_position) + 12];
+
+ 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_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(void *key, void *data, va_list ap) {
+ int fd = va_arg(ap, int);
+ int *p = va_arg(ap, int*);
+
+ 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;
+
+ WFIFOW(fd,0) = 0x3842;
+ numdb_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 < 24 && name[i]; i++) {
+ if (!(name[i] & 0xe0) || name[i] == 0x7f) {
+ printf("int_guild: illeagal guild name [%s]\n", name);
+ mapif_guild_created(fd, account_id, NULL);
+ return 0;
+ }
+ }
+
+ if ((g = search_guildname(name)) != NULL) {
+ printf("int_guild: same name guild exists [%s]\n", name);
+ mapif_guild_created(fd, account_id, NULL);
+ return 0;
+ }
+ g = calloc(sizeof(struct guild), 1);
+ if (g == NULL) {
+ printf("int_guild: CreateGuild: out of memory !\n");
+ mapif_guild_created(fd, account_id, NULL);
+ exit(0);
+ }
+ memset(g, 0, sizeof(struct guild));
+ g->guild_id = guild_newid++;
+ memcpy(g->name, name, 24);
+ memcpy(g->master, master->name, 24);
+ 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 + 10000;
+
+ numdb_insert(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 = numdb_search(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 = numdb_search(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 = numdb_search(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_GUILDEXPLUSION; j++) {
+ if (g->explusion[j].account_id == 0)
+ break;
+ }
+ if (j == MAX_GUILDEXPLUSION) { // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
+ for(j = 0; j < MAX_GUILDEXPLUSION - 1; j++)
+ g->explusion[j] = g->explusion[j+1];
+ j = MAX_GUILDEXPLUSION - 1;
+ }
+ g->explusion[j].account_id = account_id;
+ memcpy(g->explusion[j].acc, "dummy", 24);
+ memcpy(g->explusion[j].name, g->member[i].name, 24);
+ memcpy(g->explusion[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 = numdb_search(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++;
+ }
+ // •½‹ÏƒŒƒxƒ‹
+ g->average_lv = alv / c;
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh‰ðŽUˆ——pi“¯–¿/“G‘΂ð‰ðœj
+int guild_break_sub(void *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 = numdb_search(guild_db, guild_id);
+ if(g == NULL)
+ return 0;
+
+ numdb_foreach(guild_db, guild_break_sub, guild_id);
+ numdb_erase(guild_db, 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);
+ free(g);
+
+ 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);
+}
+
+// ƒ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 = numdb_search(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:
+ printf("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 = numdb_search(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) {
+ printf("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
+ {
+ int exp, oldexp = g->member[i].exp;
+ exp = g->member[i].exp = *((unsigned int *)data);
+ g->exp += (exp - oldexp);
+ guild_calcinfo(g); // LvƒAƒbƒv”»’f
+ mapif_guild_basicinfochanged(guild_id, GBI_EXP, &g->exp, 4);
+ }
+ break;
+ default:
+ printf("int_guild: GuildMemberInfoChange: Unknown type %d\n", type);
+ break;
+ }
+ mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len);
+
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
+int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) {
+ struct guild *g = numdb_search(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);
+ printf("int_guild: position changed %d\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 = numdb_search(guild_db, guild_id);
+ int idx = skill_num - 10000;
+
+ if (g == NULL || skill_num < 10000)
+ 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);
+ printf("int_guild: skill %d up\n", skill_num);
+ }
+
+ 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] = numdb_search(guild_db, guild_id1);
+ g[1] = numdb_search(guild_db, guild_id2);
+ 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, 24);
+ 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 = numdb_search(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 = numdb_search(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 = numdb_search(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: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG0);
+ case 11: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG1);
+ case 12: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG2);
+ case 13: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG3);
+ case 14: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG4);
+ case 15: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG5);
+ case 16: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG6);
+ case 17: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG7);
+ case 18: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp0); // guardian HP [Valaris]
+ case 19: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp1);
+ case 20: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp2);
+ case 21: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp3);
+ case 22: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp4);
+ case 23: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp5);
+ case 24: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp6);
+ case 25: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp7); // end additions [Valaris]
+
+ default:
+ printf("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=numdb_search(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 = numdb_search(guild_db, gid);
+ if(log_inter)
+ inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
+ (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", index);
+ }
+ 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: gc->visibleG0 = value; break;
+ case 11: gc->visibleG1 = value; break;
+ case 12: gc->visibleG2 = value; break;
+ case 13: gc->visibleG3 = value; break;
+ case 14: gc->visibleG4 = value; break;
+ case 15: gc->visibleG5 = value; break;
+ case 16: gc->visibleG6 = value; break;
+ case 17: gc->visibleG7 = value; break;
+ case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
+ case 19: gc->Ghp1 = value; break;
+ case 20: gc->Ghp2 = value; break;
+ case 21: gc->Ghp3 = value; break;
+ case 22: gc->Ghp4 = value; break;
+ case 23: gc->Ghp5 = value; break;
+ case 24: gc->Ghp6 = value; break;
+ case 25: gc->Ghp7 = value; break; // end additions [Valaris]
+ default:
+ printf("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);
+}
+
+// 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) {
+ switch(RFIFOW(fd,0)) {
+ case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), 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 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), 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), 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), 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), 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), RFIFOP(fd,6), RFIFOP(fd,66)); break;
+ case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), 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, "**ƒT[ƒo[–½—ß**");
+}
diff --git a/src/char/int_guild.h b/src/char/int_guild.h
index 8e9ce7681..555f5e123 100644
--- a/src/char/int_guild.h
+++ b/src/char/int_guild.h
@@ -1,16 +1,16 @@
-// $Id: int_guild.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_init();
-int inter_guild_save();
-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);
-
-extern char guild_txt[1024];
-extern char castle_txt[1024];
-
-#endif
+// $Id: int_guild.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#ifndef _INT_GUILD_H_
+#define _INT_GUILD_H_
+
+int inter_guild_init();
+int inter_guild_save();
+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);
+
+extern char guild_txt[1024];
+extern char castle_txt[1024];
+
+#endif
diff --git a/src/char/int_party.c b/src/char/int_party.c
index 499ac025b..0fd58fa14 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -1,595 +1,595 @@
-// $Id: int_party.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_party.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-char party_txt[1024] = "save/party.txt";
-
-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);
-
-// ƒ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\t%s\t", m->account_id, m->leader, ((m->account_id > 0) ? m->name : "NoMember"));
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒBƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
-int inter_party_fromstr(char *str, struct party *p) {
- int i, j;
- int tmp_int[16];
- char tmp_str[256];
-
- memset(p, 0, sizeof(struct party));
-
-// printf("sscanf party main info\n");
- if (sscanf(str, "%d\t%[^\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];
- strcpy(p->name, tmp_str);
- p->exp = tmp_int[1];
- 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\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str) != 3)
- return 1;
-
- m->account_id = tmp_int[0];
- m->leader = tmp_int[1];
- strncpy(m->name, tmp_str, sizeof(m->name));
-// printf(" %d %d [%s]\n", tmp_int[0], tmp_int[1], tmp_str);
-
- for(j = 0; j < 2 && str != NULL; j++)
- str = strchr(str + 1, '\t');
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒBƒf[ƒ^‚̃[ƒh
-int inter_party_init() {
- char line[8192];
- struct party *p;
- FILE *fp;
- int c = 0;
- int i, j;
-
- party_db = numdb_init();
-
- 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 = calloc(sizeof(struct party), 1);
- if (p == NULL){
- printf("int_party: out of memory!\n");
- exit(0);
- }
- memset(p, 0, sizeof(struct party));
- if (inter_party_fromstr(line, p) == 0 && p->party_id > 0) {
- if (p->party_id >= party_newid)
- party_newid = p->party_id + 1;
- numdb_insert(party_db, p->party_id, p);
- party_check_empty(p);
- } else {
- printf("int_party: broken data [%s] line %d\n", party_txt, c + 1);
- free(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_party: %s read done (%d parties)\n", party_txt, c);
-
- return 0;
-}
-
-// ƒp[ƒeƒB[ƒf[ƒ^‚̃Z[ƒu—p
-int inter_party_save_sub(void *key, void *data, va_list ap) {
- char line[8192];
- FILE *fp;
-
- inter_party_tostr(line, (struct party *)data);
- 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) {
- printf("int_party: cant write [%s] !!! data is lost !!!\n", party_txt);
- return 1;
- }
- numdb_foreach(party_db, inter_party_save_sub, fp);
-// fprintf(fp, "%d\t%%newid%%\n", party_newid);
- lock_fclose(fp,party_txt, &lock);
-// printf("int_party: %s saved.\n", party_txt);
-
- return 0;
-}
-
-// ƒp[ƒeƒB–¼ŒŸõ—p
-int search_partyname_sub(void *key,void *data,va_list ap) {
- struct party *p = (struct party *)data,**dst;
- char *str;
-
- str = va_arg(ap, char *);
- dst = va_arg(ap, struct party **);
- if (strcmpi(p->name, str) == 0)
- *dst = p;
-
- return 0;
-}
-
-// ƒp[ƒeƒB–¼ŒŸõ
-struct party* search_partyname(char *str) {
- struct party *p = NULL;
- numdb_foreach(party_db, search_partyname_sub, str, &p);
-
- return p;
-}
-
-// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
-int party_check_exp_share(struct party *p) {
- int i;
- int maxlv = 0, minlv = 0x7fffffff;
-
- for(i = 0; i < MAX_PARTY; i++) {
- int lv = p->member[i].lv;
- if (p->member[i].online) {
- if (lv < minlv)
- minlv = lv;
- if (maxlv < lv)
- maxlv = lv;
- }
- }
-
- return (maxlv == 0 || maxlv-minlv <= party_share_level);
-}
-
-// ƒp[ƒeƒB‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
-int party_check_empty(struct party *p) {
- int i;
-
-// printf("party check empty %08X\n", (int)p);
- for(i = 0; i < MAX_PARTY; i++) {
-// printf("%d acc=%d\n", i, p->member[i].account_id);
- if (p->member[i].account_id > 0) {
- return 0;
- }
- }
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- mapif_party_broken(p->party_id, 0);
- numdb_erase(party_db, p->party_id);
- free(p);
-
- return 1;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
-int party_check_conflict_sub(void *key, void *data, va_list ap) {
- struct party *p = (struct party *)data;
- int party_id, account_id, i;
- char *nick;
-
- party_id=va_arg(ap, int);
- account_id=va_arg(ap, int);
- nick=va_arg(ap, char *);
-
- if (p->party_id == party_id) // –{—ˆ‚ÌŠ‘®‚È‚Ì‚Å–â‘è‚È‚µ
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) {
- // •Ê‚̃p[ƒeƒB‚É‹U‚ÌŠ‘®ƒf[ƒ^‚ª‚ ‚é‚Ì‚Å’E‘Þ
- printf("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party_id);
- mapif_parse_PartyLeave(-1, p->party_id, account_id);
- }
- }
-
- return 0;
-}
-
-// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
-int party_check_conflict(int party_id, int account_id, char *nick) {
- numdb_foreach(party_db, party_check_conflict_sub, party_id, account_id, nick);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp[ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id, struct party *p) {
- WFIFOW(fd,0) = 0x3820;
- WFIFOL(fd,2) = account_id;
- if (p != NULL) {
- WFIFOB(fd,6) = 0;
- WFIFOL(fd,7) = p->party_id;
- memcpy(WFIFOP(fd,11), p->name, 24);
- printf("int_party: created! %d %s\n", p->party_id, p->name);
- } else {
- WFIFOB(fd,6) = 1;
- WFIFOL(fd,7) = 0;
- memcpy(WFIFOP(fd,11), "error", 24);
- }
- WFIFOSET(fd,35);
-
- return 0;
-}
-
-// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd, int party_id) {
- WFIFOW(fd,0) = 0x3821;
- WFIFOW(fd,2) = 8;
- WFIFOL(fd,4) = party_id;
- WFIFOSET(fd,8);
- printf("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[4 + sizeof(struct party)];
-
- 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));
-// printf("int_party: info %d %s\n", p->party_id, p->name);
-
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) {
- WFIFOW(fd,0) = 0x3822;
- WFIFOL(fd,2) = party_id;
- WFIFOL(fd,6) = account_id;
- WFIFOB(fd,10) = flag;
- WFIFOSET(fd,11);
-
- 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);
- printf("int_party: option changed %d %d %d %d %d\n", p->party_id, account_id, p->exp, p->item, flag);
-
- return 0;
-}
-
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id, char *name) {
- unsigned char buf[34];
-
- WBUFW(buf,0) = 0x3824;
- WBUFL(buf,2) = party_id;
- WBUFL(buf,6) = account_id;
- memcpy(WBUFP(buf,10), name, 24);
- mapif_sendall(buf, 34);
- printf("int_party: party leaved %d %d %s\n", party_id, account_id, name);
-
- return 0;
-}
-
-// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p, int idx) {
- unsigned char buf[29];
-
- WBUFW(buf,0) = 0x3825;
- WBUFL(buf,2) = p->party_id;
- WBUFL(buf,6) = p->member[idx].account_id;
- memcpy(WBUFP(buf,10), p->member[idx].map, 16);
- WBUFB(buf,26) = p->member[idx].online;
- WBUFW(buf,27) = p->member[idx].lv;
- mapif_sendall(buf, 29);
-
- 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);
- 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) {
- unsigned char buf[len+12];
-
- 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_sendall(buf,len + 12);
-
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// ƒp[ƒeƒB
-int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv) {
- struct party *p;
- int i;
-
- for(i = 0; i < 24 && name[i]; i++) {
- if (!(name[i] & 0xe0) || name[i] == 0x7f) {
- printf("int_party: illegal party name [%s]\n", name);
- mapif_party_created(fd, account_id, NULL);
- return 0;
- }
- }
-
- if ((p = search_partyname(name)) != NULL) {
- printf("int_party: same name party exists [%s]\n", name);
- mapif_party_created(fd, account_id, NULL);
- return 0;
- }
- p = calloc(sizeof(struct party), 1);
- if (p == NULL) {
- printf("int_party: out of memory !\n");
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- memset(p, 0, sizeof(struct party));
- p->party_id = party_newid++;
- memcpy(p->name, name, 24);
- p->exp = 0;
- p->item = 0;
- p->member[0].account_id = account_id;
- memcpy(p->member[0].name, nick, 24);
- memcpy(p->member[0].map, map, 16);
- p->member[0].leader = 1;
- p->member[0].online = 1;
- p->member[0].lv = lv;
-
- numdb_insert(party_db, p->party_id, p);
-
- mapif_party_created(fd, account_id, p);
- mapif_party_info(fd, p);
-
- return 0;
-}
-
-// ƒp[ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd, int party_id) {
- struct party *p;
-
- p = numdb_search(party_db, party_id);
- if (p != NULL)
- mapif_party_info(fd, p);
- else
- mapif_party_noinfo(fd, party_id);
-
- return 0;
-}
-
-// ƒp[ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) {
- struct party *p;
- int i;
-
- p = numdb_search(party_db, party_id);
- if (p == NULL) {
- mapif_party_memberadded(fd, party_id, account_id, 1);
- return 0;
- }
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == 0) {
- int flag = 0;
-
- p->member[i].account_id = account_id;
- memcpy(p->member[i].name, nick, 24);
- memcpy(p->member[i].map, map, 16);
- p->member[i].leader = 0;
- p->member[i].online = 1;
- p->member[i].lv = lv;
- mapif_party_memberadded(fd, party_id, account_id, 0);
- mapif_party_info(-1, p);
-
- if (p->exp > 0 && !party_check_exp_share(p)) {
- p->exp = 0;
- flag = 0x01;
- }
- if (flag)
- mapif_party_optionchanged(fd, p, 0, 0);
- return 0;
- }
- }
- mapif_party_memberadded(fd, party_id, account_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 *p;
- int flag = 0;
-
- p = numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- p->exp = exp;
- if (exp>0 && !party_check_exp_share(p)) {
- flag |= 0x01;
- p->exp = 0;
- }
-
- p->item = item;
-
- mapif_party_optionchanged(fd, p, account_id, flag);
- return 0;
-}
-
-// ƒp[ƒeƒB’E‘Þ—v‹
-int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
- struct party *p;
- int i;
-
- p = numdb_search(party_db, party_id);
- if (p != NULL) {
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id) {
- mapif_party_leaved(party_id, account_id, p->member[i].name);
-
- memset(&p->member[i], 0, sizeof(struct party_member));
- if (party_check_empty(p) == 0)
- mapif_party_info(-1, p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
- return 0;
- }
- }
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒBƒ}ƒbƒvXV—v‹
-int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) {
- struct party *p;
- int i;
-
- p = numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- for(i = 0; i < MAX_PARTY; i++) {
- if (p->member[i].account_id == account_id) {
- int flag = 0;
-
- memcpy(p->member[i].map, map, 16);
- p->member[i].online = online;
- p->member[i].lv = lv;
- mapif_party_membermoved(p, i);
-
- if (p->exp > 0 && !party_check_exp_share(p)) {
- p->exp = 0;
- flag = 1;
- }
- if (flag)
- mapif_party_optionchanged(fd, p, 0, 0);
- break;
- }
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd, int party_id) {
- struct party *p;
-
- p = numdb_search(party_db, party_id);
- if (p == NULL)
- return 0;
-
- numdb_erase(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);
-}
-// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) {
- return party_check_conflict(party_id, account_id, nick);
-}
-
-// 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) {
- switch(RFIFOW(fd,0)) {
- case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70)); break;
- case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); 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)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break;
- case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(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) {
- return mapif_parse_PartyLeave(-1, party_id, account_id);
-}
-
+// $Id: int_party.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#include "inter.h"
+#include "int_party.h"
+#include "mmo.h"
+#include "char.h"
+#include "socket.h"
+#include "db.h"
+#include "lock.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char party_txt[1024] = "save/party.txt";
+
+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);
+
+// ƒ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\t%s\t", m->account_id, m->leader, ((m->account_id > 0) ? m->name : "NoMember"));
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒBƒf[ƒ^‚Ì•¶Žš—ñ‚©‚ç‚Ì•ÏŠ·
+int inter_party_fromstr(char *str, struct party *p) {
+ int i, j;
+ int tmp_int[16];
+ char tmp_str[256];
+
+ memset(p, 0, sizeof(struct party));
+
+// printf("sscanf party main info\n");
+ if (sscanf(str, "%d\t%[^\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];
+ strcpy(p->name, tmp_str);
+ p->exp = tmp_int[1];
+ 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\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str) != 3)
+ return 1;
+
+ m->account_id = tmp_int[0];
+ m->leader = tmp_int[1];
+ strncpy(m->name, tmp_str, sizeof(m->name));
+// printf(" %d %d [%s]\n", tmp_int[0], tmp_int[1], tmp_str);
+
+ for(j = 0; j < 2 && str != NULL; j++)
+ str = strchr(str + 1, '\t');
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒBƒf[ƒ^‚̃[ƒh
+int inter_party_init() {
+ char line[8192];
+ struct party *p;
+ FILE *fp;
+ int c = 0;
+ int i, j;
+
+ party_db = numdb_init();
+
+ 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 = calloc(sizeof(struct party), 1);
+ if (p == NULL){
+ printf("int_party: out of memory!\n");
+ exit(0);
+ }
+ memset(p, 0, sizeof(struct party));
+ if (inter_party_fromstr(line, p) == 0 && p->party_id > 0) {
+ if (p->party_id >= party_newid)
+ party_newid = p->party_id + 1;
+ numdb_insert(party_db, p->party_id, p);
+ party_check_empty(p);
+ } else {
+ printf("int_party: broken data [%s] line %d\n", party_txt, c + 1);
+ free(p);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("int_party: %s read done (%d parties)\n", party_txt, c);
+
+ return 0;
+}
+
+// ƒp[ƒeƒB[ƒf[ƒ^‚̃Z[ƒu—p
+int inter_party_save_sub(void *key, void *data, va_list ap) {
+ char line[8192];
+ FILE *fp;
+
+ inter_party_tostr(line, (struct party *)data);
+ 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) {
+ printf("int_party: cant write [%s] !!! data is lost !!!\n", party_txt);
+ return 1;
+ }
+ numdb_foreach(party_db, inter_party_save_sub, fp);
+// fprintf(fp, "%d\t%%newid%%\n", party_newid);
+ lock_fclose(fp,party_txt, &lock);
+// printf("int_party: %s saved.\n", party_txt);
+
+ return 0;
+}
+
+// ƒp[ƒeƒB–¼ŒŸõ—p
+int search_partyname_sub(void *key,void *data,va_list ap) {
+ struct party *p = (struct party *)data,**dst;
+ char *str;
+
+ str = va_arg(ap, char *);
+ dst = va_arg(ap, struct party **);
+ if (strcmpi(p->name, str) == 0)
+ *dst = p;
+
+ return 0;
+}
+
+// ƒp[ƒeƒB–¼ŒŸõ
+struct party* search_partyname(char *str) {
+ struct party *p = NULL;
+ numdb_foreach(party_db, search_partyname_sub, str, &p);
+
+ return p;
+}
+
+// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
+int party_check_exp_share(struct party *p) {
+ int i;
+ int maxlv = 0, minlv = 0x7fffffff;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ int lv = p->member[i].lv;
+ if (p->member[i].online) {
+ if (lv < minlv)
+ minlv = lv;
+ if (maxlv < lv)
+ maxlv = lv;
+ }
+ }
+
+ return (maxlv == 0 || maxlv-minlv <= party_share_level);
+}
+
+// ƒp[ƒeƒB‚ª‹ó‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+int party_check_empty(struct party *p) {
+ int i;
+
+// printf("party check empty %08X\n", (int)p);
+ for(i = 0; i < MAX_PARTY; i++) {
+// printf("%d acc=%d\n", i, p->member[i].account_id);
+ if (p->member[i].account_id > 0) {
+ return 0;
+ }
+ }
+ // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
+ mapif_party_broken(p->party_id, 0);
+ numdb_erase(party_db, p->party_id);
+ free(p);
+
+ return 1;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN—p
+int party_check_conflict_sub(void *key, void *data, va_list ap) {
+ struct party *p = (struct party *)data;
+ int party_id, account_id, i;
+ char *nick;
+
+ party_id=va_arg(ap, int);
+ account_id=va_arg(ap, int);
+ nick=va_arg(ap, char *);
+
+ if (p->party_id == party_id) // –{—ˆ‚ÌŠ‘®‚È‚Ì‚Å–â‘è‚È‚µ
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) {
+ // •Ê‚̃p[ƒeƒB‚É‹U‚ÌŠ‘®ƒf[ƒ^‚ª‚ ‚é‚Ì‚Å’E‘Þ
+ printf("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party_id);
+ mapif_parse_PartyLeave(-1, p->party_id, account_id);
+ }
+ }
+
+ return 0;
+}
+
+// ƒLƒƒƒ‰‚Ì‹£‡‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
+int party_check_conflict(int party_id, int account_id, char *nick) {
+ numdb_foreach(party_db, party_check_conflict_sub, party_id, account_id, nick);
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ƒp[ƒeƒB쬉”Û
+int mapif_party_created(int fd,int account_id, struct party *p) {
+ WFIFOW(fd,0) = 0x3820;
+ WFIFOL(fd,2) = account_id;
+ if (p != NULL) {
+ WFIFOB(fd,6) = 0;
+ WFIFOL(fd,7) = p->party_id;
+ memcpy(WFIFOP(fd,11), p->name, 24);
+ printf("int_party: created! %d %s\n", p->party_id, p->name);
+ } else {
+ WFIFOB(fd,6) = 1;
+ WFIFOL(fd,7) = 0;
+ memcpy(WFIFOP(fd,11), "error", 24);
+ }
+ WFIFOSET(fd,35);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
+int mapif_party_noinfo(int fd, int party_id) {
+ WFIFOW(fd,0) = 0x3821;
+ WFIFOW(fd,2) = 8;
+ WFIFOL(fd,4) = party_id;
+ WFIFOSET(fd,8);
+ printf("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[4 + sizeof(struct party)];
+
+ 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));
+// printf("int_party: info %d %s\n", p->party_id, p->name);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
+int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) {
+ WFIFOW(fd,0) = 0x3822;
+ WFIFOL(fd,2) = party_id;
+ WFIFOL(fd,6) = account_id;
+ WFIFOB(fd,10) = flag;
+ WFIFOSET(fd,11);
+
+ 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);
+ printf("int_party: option changed %d %d %d %d %d\n", p->party_id, account_id, p->exp, p->item, flag);
+
+ return 0;
+}
+
+// ƒp[ƒeƒB’E‘Þ’Ê’m
+int mapif_party_leaved(int party_id,int account_id, char *name) {
+ unsigned char buf[34];
+
+ WBUFW(buf,0) = 0x3824;
+ WBUFL(buf,2) = party_id;
+ WBUFL(buf,6) = account_id;
+ memcpy(WBUFP(buf,10), name, 24);
+ mapif_sendall(buf, 34);
+ printf("int_party: party leaved %d %d %s\n", party_id, account_id, name);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
+int mapif_party_membermoved(struct party *p, int idx) {
+ unsigned char buf[29];
+
+ WBUFW(buf,0) = 0x3825;
+ WBUFL(buf,2) = p->party_id;
+ WBUFL(buf,6) = p->member[idx].account_id;
+ memcpy(WBUFP(buf,10), p->member[idx].map, 16);
+ WBUFB(buf,26) = p->member[idx].online;
+ WBUFW(buf,27) = p->member[idx].lv;
+ mapif_sendall(buf, 29);
+
+ 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);
+ 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) {
+ unsigned char buf[len+12];
+
+ 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_sendall(buf,len + 12);
+
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+
+// ƒp[ƒeƒB
+int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv) {
+ struct party *p;
+ int i;
+
+ for(i = 0; i < 24 && name[i]; i++) {
+ if (!(name[i] & 0xe0) || name[i] == 0x7f) {
+ printf("int_party: illegal party name [%s]\n", name);
+ mapif_party_created(fd, account_id, NULL);
+ return 0;
+ }
+ }
+
+ if ((p = search_partyname(name)) != NULL) {
+ printf("int_party: same name party exists [%s]\n", name);
+ mapif_party_created(fd, account_id, NULL);
+ return 0;
+ }
+ p = calloc(sizeof(struct party), 1);
+ if (p == NULL) {
+ printf("int_party: out of memory !\n");
+ mapif_party_created(fd,account_id,NULL);
+ return 0;
+ }
+ memset(p, 0, sizeof(struct party));
+ p->party_id = party_newid++;
+ memcpy(p->name, name, 24);
+ p->exp = 0;
+ p->item = 0;
+ p->member[0].account_id = account_id;
+ memcpy(p->member[0].name, nick, 24);
+ memcpy(p->member[0].map, map, 16);
+ p->member[0].leader = 1;
+ p->member[0].online = 1;
+ p->member[0].lv = lv;
+
+ numdb_insert(party_db, p->party_id, p);
+
+ mapif_party_created(fd, account_id, p);
+ mapif_party_info(fd, p);
+
+ return 0;
+}
+
+// ƒp[ƒeƒBî•ñ—v‹
+int mapif_parse_PartyInfo(int fd, int party_id) {
+ struct party *p;
+
+ p = numdb_search(party_db, party_id);
+ if (p != NULL)
+ mapif_party_info(fd, p);
+ else
+ mapif_party_noinfo(fd, party_id);
+
+ return 0;
+}
+
+// ƒp[ƒeƒB’ljÁ—v‹
+int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) {
+ struct party *p;
+ int i;
+
+ p = numdb_search(party_db, party_id);
+ if (p == NULL) {
+ mapif_party_memberadded(fd, party_id, account_id, 1);
+ return 0;
+ }
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->member[i].account_id == 0) {
+ int flag = 0;
+
+ p->member[i].account_id = account_id;
+ memcpy(p->member[i].name, nick, 24);
+ memcpy(p->member[i].map, map, 16);
+ p->member[i].leader = 0;
+ p->member[i].online = 1;
+ p->member[i].lv = lv;
+ mapif_party_memberadded(fd, party_id, account_id, 0);
+ mapif_party_info(-1, p);
+
+ if (p->exp > 0 && !party_check_exp_share(p)) {
+ p->exp = 0;
+ flag = 0x01;
+ }
+ if (flag)
+ mapif_party_optionchanged(fd, p, 0, 0);
+ return 0;
+ }
+ }
+ mapif_party_memberadded(fd, party_id, account_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 *p;
+ int flag = 0;
+
+ p = numdb_search(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ p->exp = exp;
+ if (exp>0 && !party_check_exp_share(p)) {
+ flag |= 0x01;
+ p->exp = 0;
+ }
+
+ p->item = item;
+
+ mapif_party_optionchanged(fd, p, account_id, flag);
+ return 0;
+}
+
+// ƒp[ƒeƒB’E‘Þ—v‹
+int mapif_parse_PartyLeave(int fd, int party_id, int account_id) {
+ struct party *p;
+ int i;
+
+ p = numdb_search(party_db, party_id);
+ if (p != NULL) {
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->member[i].account_id == account_id) {
+ mapif_party_leaved(party_id, account_id, p->member[i].name);
+
+ memset(&p->member[i], 0, sizeof(struct party_member));
+ if (party_check_empty(p) == 0)
+ mapif_party_info(-1, p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
+ return 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒBƒ}ƒbƒvXV—v‹
+int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) {
+ struct party *p;
+ int i;
+
+ p = numdb_search(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ for(i = 0; i < MAX_PARTY; i++) {
+ if (p->member[i].account_id == account_id) {
+ int flag = 0;
+
+ memcpy(p->member[i].map, map, 16);
+ p->member[i].online = online;
+ p->member[i].lv = lv;
+ mapif_party_membermoved(p, i);
+
+ if (p->exp > 0 && !party_check_exp_share(p)) {
+ p->exp = 0;
+ flag = 1;
+ }
+ if (flag)
+ mapif_party_optionchanged(fd, p, 0, 0);
+ break;
+ }
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒB‰ðŽU—v‹
+int mapif_parse_BreakParty(int fd, int party_id) {
+ struct party *p;
+
+ p = numdb_search(party_db, party_id);
+ if (p == NULL)
+ return 0;
+
+ numdb_erase(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);
+}
+// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
+int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) {
+ return party_check_conflict(party_id, account_id, nick);
+}
+
+// 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) {
+ switch(RFIFOW(fd,0)) {
+ case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70)); break;
+ case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break;
+ case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); 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)); break;
+ case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break;
+ case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break;
+ case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break;
+ case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(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) {
+ return mapif_parse_PartyLeave(-1, party_id, account_id);
+}
+
diff --git a/src/char/int_party.h b/src/char/int_party.h
index 34ed7e8f4..b265b4c2e 100644
--- a/src/char/int_party.h
+++ b/src/char/int_party.h
@@ -1,14 +1,14 @@
-// $Id: int_party.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_init();
-int inter_party_save();
-
-int inter_party_parse_frommap(int fd);
-
-int inter_party_leave(int party_id,int account_id);
-
-extern char party_txt[1024];
-
-#endif
+// $Id: int_party.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#ifndef _INT_PARTY_H_
+#define _INT_PARTY_H_
+
+int inter_party_init();
+int inter_party_save();
+
+int inter_party_parse_frommap(int fd);
+
+int inter_party_leave(int party_id,int account_id);
+
+extern char party_txt[1024];
+
+#endif
diff --git a/src/char/int_pet.c b/src/char/int_pet.c
index ab563693c..cff1e434f 100644
--- a/src/char/int_pet.c
+++ b/src/char/int_pet.c
@@ -1,364 +1,364 @@
-// $Id: int_pet.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_pet.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-char pet_txt[1024]="save/pet.txt";
-
-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;
-}
-
-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,24);
- 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;
-}
-
-int inter_pet_init()
-{
- char line[8192];
- struct s_pet *p;
- FILE *fp;
- int c=0;
-
- pet_db=numdb_init();
-
- if( (fp=fopen(pet_txt,"r"))==NULL )
- return 1;
- while(fgets(line,sizeof(line),fp)){
- p=calloc(sizeof(struct s_pet), 1);
- if(p==NULL){
- printf("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;
- numdb_insert(pet_db,p->pet_id,p);
- }else{
- printf("int_pet: broken data [%s] line %d\n",pet_txt,c);
- free(p);
- }
- c++;
- }
- fclose(fp);
-// printf("int_pet: %s read done (%d pets)\n",pet_txt,c);
- return 0;
-}
-
-int inter_pet_save_sub(void *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 ){
- printf("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);
- return 1;
- }
- numdb_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 = numdb_search(pet_db,pet_id);
- if( p == NULL)
- return 1;
- else {
- numdb_erase(pet_db,pet_id);
- printf("pet_id: %d deleted\n",pet_id);
- }
- return 0;
-}
-
-int mapif_pet_created(int fd,int account_id,struct s_pet *p)
-{
- WFIFOW(fd,0)=0x3880;
- WFIFOL(fd,2)=account_id;
- if(p!=NULL){
- WFIFOB(fd,6)=0;
- WFIFOL(fd,7)=p->pet_id;
- printf("int_pet: created! %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)
-{
- 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)
-{
- 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)
-{
- 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)
-{
- WFIFOW(fd,0)=0x3883;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,3);
-
- 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=malloc(sizeof(struct s_pet));
- if(p==NULL){
- printf("int_pet: out of memory !\n");
- mapif_pet_created(fd,account_id,NULL);
- return 0;
- }
- memset(p,0,sizeof(struct s_pet));
- p->pet_id = pet_newid++;
- memcpy(p->name,pet_name,24);
- 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;
-
- numdb_insert(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=numdb_search(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;
-}
-
-int mapif_save_pet(int fd,int account_id,struct s_pet *data)
-{
- struct s_pet *p;
- int pet_id;
- int len=RFIFOW(fd,2);
- if(sizeof(struct s_pet)!=len-8) {
- printf("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);
- }
- else{
- pet_id = data->pet_id;
- p=numdb_search(pet_db,pet_id);
- if(p == NULL) {
- p=malloc(sizeof(struct s_pet));
- if(p==NULL){
- printf("int_pet: out of memory !\n");
- mapif_save_pet_ack(fd,account_id,1);
- return 0;
- }
- memset(p,0,sizeof(struct s_pet));
- p->pet_id = data->pet_id;
- if(p->pet_id == 0)
- data->pet_id = p->pet_id = pet_newid++;
- numdb_insert(pet_db,p->pet_id,p);
- }
- 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_parse_CreatePet(int fd)
-{
- mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOL(fd,18),
- RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),RFIFOP(fd,24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd)
-{
- mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd)
-{
- mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd)
-{
- mapif_delete_pet(fd,RFIFOL(fd,2));
- 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)
-{
- 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;
- default:
- return 0;
- }
- return 1;
-}
-
+// $Id: int_pet.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#include "inter.h"
+#include "int_pet.h"
+#include "mmo.h"
+#include "char.h"
+#include "socket.h"
+#include "db.h"
+#include "lock.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+char pet_txt[1024]="save/pet.txt";
+
+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;
+}
+
+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,24);
+ 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;
+}
+
+int inter_pet_init()
+{
+ char line[8192];
+ struct s_pet *p;
+ FILE *fp;
+ int c=0;
+
+ pet_db=numdb_init();
+
+ if( (fp=fopen(pet_txt,"r"))==NULL )
+ return 1;
+ while(fgets(line,sizeof(line),fp)){
+ p=calloc(sizeof(struct s_pet), 1);
+ if(p==NULL){
+ printf("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;
+ numdb_insert(pet_db,p->pet_id,p);
+ }else{
+ printf("int_pet: broken data [%s] line %d\n",pet_txt,c);
+ free(p);
+ }
+ c++;
+ }
+ fclose(fp);
+// printf("int_pet: %s read done (%d pets)\n",pet_txt,c);
+ return 0;
+}
+
+int inter_pet_save_sub(void *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 ){
+ printf("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);
+ return 1;
+ }
+ numdb_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 = numdb_search(pet_db,pet_id);
+ if( p == NULL)
+ return 1;
+ else {
+ numdb_erase(pet_db,pet_id);
+ printf("pet_id: %d deleted\n",pet_id);
+ }
+ return 0;
+}
+
+int mapif_pet_created(int fd,int account_id,struct s_pet *p)
+{
+ WFIFOW(fd,0)=0x3880;
+ WFIFOL(fd,2)=account_id;
+ if(p!=NULL){
+ WFIFOB(fd,6)=0;
+ WFIFOL(fd,7)=p->pet_id;
+ printf("int_pet: created! %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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ WFIFOW(fd,0)=0x3883;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,3);
+
+ 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=malloc(sizeof(struct s_pet));
+ if(p==NULL){
+ printf("int_pet: out of memory !\n");
+ mapif_pet_created(fd,account_id,NULL);
+ return 0;
+ }
+ memset(p,0,sizeof(struct s_pet));
+ p->pet_id = pet_newid++;
+ memcpy(p->name,pet_name,24);
+ 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;
+
+ numdb_insert(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=numdb_search(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;
+}
+
+int mapif_save_pet(int fd,int account_id,struct s_pet *data)
+{
+ struct s_pet *p;
+ int pet_id;
+ int len=RFIFOW(fd,2);
+ if(sizeof(struct s_pet)!=len-8) {
+ printf("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);
+ }
+ else{
+ pet_id = data->pet_id;
+ p=numdb_search(pet_db,pet_id);
+ if(p == NULL) {
+ p=malloc(sizeof(struct s_pet));
+ if(p==NULL){
+ printf("int_pet: out of memory !\n");
+ mapif_save_pet_ack(fd,account_id,1);
+ return 0;
+ }
+ memset(p,0,sizeof(struct s_pet));
+ p->pet_id = data->pet_id;
+ if(p->pet_id == 0)
+ data->pet_id = p->pet_id = pet_newid++;
+ numdb_insert(pet_db,p->pet_id,p);
+ }
+ 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_parse_CreatePet(int fd)
+{
+ mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOL(fd,18),
+ RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),RFIFOP(fd,24));
+ return 0;
+}
+
+int mapif_parse_LoadPet(int fd)
+{
+ mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ return 0;
+}
+
+int mapif_parse_SavePet(int fd)
+{
+ mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));
+ return 0;
+}
+
+int mapif_parse_DeletePet(int fd)
+{
+ mapif_delete_pet(fd,RFIFOL(fd,2));
+ 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)
+{
+ 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;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
diff --git a/src/char/int_pet.h b/src/char/int_pet.h
index ea241024d..993f913ab 100644
--- a/src/char/int_pet.h
+++ b/src/char/int_pet.h
@@ -1,13 +1,13 @@
-// $Id: int_pet.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-
-extern char pet_txt[1024];
-
-#endif
+// $Id: int_pet.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#ifndef _INT_PET_H_
+#define _INT_PET_H_
+
+int inter_pet_init();
+int inter_pet_save();
+int inter_pet_delete(int pet_id);
+
+int inter_pet_parse_frommap(int fd);
+
+extern char pet_txt[1024];
+
+#endif
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index ee88d2b63..de0e7058f 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -1,500 +1,500 @@
-// $Id: int_storage.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "inter.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "db.h"
-#include "lock.h"
-
-#include <string.h>
-#include <stdlib.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";
-
-static struct dbt *storage_db;
-static struct dbt *guild_storage_db;
-
-// ‘qŒÉƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·
-int storage_tostr(char *str,struct storage *p)
-{
- int i,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,%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,
- p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-
-// •¶Žš—ñ‚ð‘qŒÉƒf[ƒ^‚É•ÏŠ·
-int storage_fromstr(char *str,struct storage *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- 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++){
- if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(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) == 11) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 1;
- }
- return 0;
-}
-
-int guild_storage_tostr(char *str,struct guild_storage *p)
-{
- int i,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,%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,
- p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
- f++;
- }
-
- *(str_p++)='\t';
-
- *str_p='\0';
- if(!f)
- str[0]=0;
- return 0;
-}
-
-int guild_storage_fromstr(char *str,struct guild_storage *p)
-{
- int tmp_int[256];
- int set,next,len,i;
-
- 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++){
- if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(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) == 11) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 1;
- }
- return 0;
-}
-
-// ƒ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=numdb_search(storage_db,account_id);
- if(s == NULL) {
- s = calloc(sizeof(struct storage), 1);
- if(s==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(s,0,sizeof(struct storage));
- s->account_id=account_id;
- numdb_insert(storage_db,s->account_id,s);
- }
- return s;
-}
-
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(inter_guild_search(guild_id) != NULL) {
- gs=numdb_search(guild_storage_db,guild_id);
- if(gs == NULL) {
- gs = calloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(gs,0,sizeof(struct guild_storage));
- gs->guild_id=guild_id;
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- }
- 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 = numdb_init();
-
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- s=calloc(sizeof(struct storage), 1);
- if(s==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(s,0,sizeof(struct storage));
- s->account_id=tmp_int;
- if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
- numdb_insert(storage_db,s->account_id,s);
- }
- else{
- printf("int_storage: broken data [%s] line %d\n",storage_txt,c);
- free(s);
- }
- c++;
- }
- fclose(fp);
-
- c = 0;
- guild_storage_db = numdb_init();
-
- fp=fopen(guild_storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",guild_storage_txt);
- return 1;
- }
- while(fgets(line,65535,fp)){
- sscanf(line,"%d",&tmp_int);
- gs=calloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("int_storage: out of memory!\n");
- exit(0);
- }
- memset(gs,0,sizeof(struct guild_storage));
- gs->guild_id=tmp_int;
- if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- else{
- printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
- free(gs);
- }
- c++;
- }
- fclose(fp);
-
- return 0;
-}
-
-int inter_storage_save_sub(void *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 ){
- printf("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
- return 1;
- }
- numdb_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(void *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 ){
- printf("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
- return 1;
- }
- numdb_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 = numdb_search(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(*((long *)(&s->storage[i].card[2])));
- }
- numdb_erase(storage_db,account_id);
- free(s);
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh‘qŒÉƒf[ƒ^íœ
-int inter_guild_storage_delete(int guild_id)
-{
- struct guild_storage *gs = numdb_search(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(*((long *)(&gs->storage[i].card[2])));
- }
- numdb_erase(guild_storage_db,guild_id);
- free(gs);
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ‘qŒÉƒf[ƒ^‚Ì‘—M
-int mapif_load_storage(int fd,int account_id)
-{
- struct storage *s=account2storage(account_id);
- 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)
-{
- 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);
- 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)
-{
- 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)
-{
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// ‘qŒÉƒf[ƒ^ŽóM••Û‘¶
-int mapif_parse_SaveStorage(int fd)
-{
- struct storage *s;
- int account_id=RFIFOL(fd,4);
- int len=RFIFOW(fd,2);
- if(sizeof(struct storage)!=len-8){
- printf("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)
-{
- 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=RFIFOL(fd,8);
- int len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- printf("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)
-{
- 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;
-}
+// $Id: int_storage.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#include "inter.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "int_guild.h"
+#include "mmo.h"
+#include "char.h"
+#include "socket.h"
+#include "db.h"
+#include "lock.h"
+
+#include <string.h>
+#include <stdlib.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";
+
+static struct dbt *storage_db;
+static struct dbt *guild_storage_db;
+
+// ‘qŒÉƒf[ƒ^‚𕶎š—ñ‚É•ÏŠ·
+int storage_tostr(char *str,struct storage *p)
+{
+ int i,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,%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,
+ p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
+ f++;
+ }
+
+ *(str_p++)='\t';
+
+ *str_p='\0';
+ if(!f)
+ str[0]=0;
+ return 0;
+}
+
+// •¶Žš—ñ‚ð‘qŒÉƒf[ƒ^‚É•ÏŠ·
+int storage_fromstr(char *str,struct storage *p)
+{
+ int tmp_int[256];
+ int set,next,len,i;
+
+ 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++){
+ if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else if(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) == 11) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else return 1;
+ }
+ return 0;
+}
+
+int guild_storage_tostr(char *str,struct guild_storage *p)
+{
+ int i,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,%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,
+ p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
+ f++;
+ }
+
+ *(str_p++)='\t';
+
+ *str_p='\0';
+ if(!f)
+ str[0]=0;
+ return 0;
+}
+
+int guild_storage_fromstr(char *str,struct guild_storage *p)
+{
+ int tmp_int[256];
+ int set,next,len,i;
+
+ 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++){
+ if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else if(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) == 11) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else return 1;
+ }
+ return 0;
+}
+
+// ƒ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=numdb_search(storage_db,account_id);
+ if(s == NULL) {
+ s = calloc(sizeof(struct storage), 1);
+ if(s==NULL){
+ printf("int_storage: out of memory!\n");
+ exit(0);
+ }
+ memset(s,0,sizeof(struct storage));
+ s->account_id=account_id;
+ numdb_insert(storage_db,s->account_id,s);
+ }
+ return s;
+}
+
+struct guild_storage *guild2storage(int guild_id)
+{
+ struct guild_storage *gs = NULL;
+ if(inter_guild_search(guild_id) != NULL) {
+ gs=numdb_search(guild_storage_db,guild_id);
+ if(gs == NULL) {
+ gs = calloc(sizeof(struct guild_storage), 1);
+ if(gs==NULL){
+ printf("int_storage: out of memory!\n");
+ exit(0);
+ }
+ memset(gs,0,sizeof(struct guild_storage));
+ gs->guild_id=guild_id;
+ numdb_insert(guild_storage_db,gs->guild_id,gs);
+ }
+ }
+ 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 = numdb_init();
+
+ fp=fopen(storage_txt,"r");
+ if(fp==NULL){
+ printf("cant't read : %s\n",storage_txt);
+ return 1;
+ }
+ while(fgets(line,65535,fp)){
+ sscanf(line,"%d",&tmp_int);
+ s=calloc(sizeof(struct storage), 1);
+ if(s==NULL){
+ printf("int_storage: out of memory!\n");
+ exit(0);
+ }
+ memset(s,0,sizeof(struct storage));
+ s->account_id=tmp_int;
+ if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
+ numdb_insert(storage_db,s->account_id,s);
+ }
+ else{
+ printf("int_storage: broken data [%s] line %d\n",storage_txt,c);
+ free(s);
+ }
+ c++;
+ }
+ fclose(fp);
+
+ c = 0;
+ guild_storage_db = numdb_init();
+
+ fp=fopen(guild_storage_txt,"r");
+ if(fp==NULL){
+ printf("cant't read : %s\n",guild_storage_txt);
+ return 1;
+ }
+ while(fgets(line,65535,fp)){
+ sscanf(line,"%d",&tmp_int);
+ gs=calloc(sizeof(struct guild_storage), 1);
+ if(gs==NULL){
+ printf("int_storage: out of memory!\n");
+ exit(0);
+ }
+ memset(gs,0,sizeof(struct guild_storage));
+ gs->guild_id=tmp_int;
+ if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
+ numdb_insert(guild_storage_db,gs->guild_id,gs);
+ }
+ else{
+ printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
+ free(gs);
+ }
+ c++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+int inter_storage_save_sub(void *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 ){
+ printf("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
+ return 1;
+ }
+ numdb_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(void *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 ){
+ printf("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
+ return 1;
+ }
+ numdb_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 = numdb_search(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(*((long *)(&s->storage[i].card[2])));
+ }
+ numdb_erase(storage_db,account_id);
+ free(s);
+ }
+ return 0;
+}
+
+// ƒMƒ‹ƒh‘qŒÉƒf[ƒ^íœ
+int inter_guild_storage_delete(int guild_id)
+{
+ struct guild_storage *gs = numdb_search(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(*((long *)(&gs->storage[i].card[2])));
+ }
+ numdb_erase(guild_storage_db,guild_id);
+ free(gs);
+ }
+ return 0;
+}
+
+//---------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ‘qŒÉƒf[ƒ^‚Ì‘—M
+int mapif_load_storage(int fd,int account_id)
+{
+ struct storage *s=account2storage(account_id);
+ 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)
+{
+ 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);
+ 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)
+{
+ 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)
+{
+ mapif_load_storage(fd,RFIFOL(fd,2));
+ return 0;
+}
+// ‘qŒÉƒf[ƒ^ŽóM••Û‘¶
+int mapif_parse_SaveStorage(int fd)
+{
+ struct storage *s;
+ int account_id=RFIFOL(fd,4);
+ int len=RFIFOW(fd,2);
+ if(sizeof(struct storage)!=len-8){
+ printf("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)
+{
+ 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=RFIFOL(fd,8);
+ int len=RFIFOW(fd,2);
+ if(sizeof(struct guild_storage)!=len-12){
+ printf("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)
+{
+ 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;
+}
diff --git a/src/char/int_storage.h b/src/char/int_storage.h
index 1b85831b4..d918f5fe3 100644
--- a/src/char/int_storage.h
+++ b/src/char/int_storage.h
@@ -1,16 +1,16 @@
-// $Id: int_storage.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_init();
-int inter_storage_save();
-int inter_guild_storage_save();
-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];
-
-#endif
+// $Id: int_storage.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#ifndef _INT_STORAGE_H_
+#define _INT_STORAGE_H_
+
+int inter_storage_init();
+int inter_storage_save();
+int inter_guild_storage_save();
+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];
+
+#endif
diff --git a/src/char/inter.c b/src/char/inter.c
index f85d37a49..bf7bdcccf 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -1,563 +1,563 @@
-// $Id: inter.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#include "mmo.h"
-#include "char.h"
-#include "socket.h"
-#include "timer.h"
-#include "db.h"
-#include <string.h>
-#include <stdlib.h>
-
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "lock.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 inter_log_filename[1024] = "log/inter.log";
-
-char accreg_txt[1024] = "save/accreg.txt";
-static struct dbt *accreg_db = NULL;
-
-struct accreg {
- int account_id, reg_num;
- struct global_reg reg[ACCOUNT_REG_NUM];
-};
-
-int party_share_level = 10;
-
-
-// ‘—MƒpƒPƒbƒg’·ƒŠƒXƒg
-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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// ŽóMƒpƒPƒbƒg’·ƒŠƒXƒg
-int inter_recv_packet_length[] = {
- -1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 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,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-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,%d ", reg->reg[j].str, reg->reg[j].value);
- }
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚©‚ç•ÏŠ·
-int inter_accreg_fromstr(const char *str, struct accreg *reg) {
- int j, v, n;
- char buf[128];
- 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, "%[^,],%d %n", buf, &v, &n) != 2)
- break;
- memcpy(reg->reg[j].str, buf, 32);
- reg->reg[j].value = v;
- }
- reg->reg_num = j;
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‚Ì“Ç‚Ýž‚Ý
-int inter_accreg_init() {
- char line[8192];
- FILE *fp;
- int c = 0;
- struct accreg *reg;
-
- accreg_db = numdb_init();
-
- if( (fp = fopen(accreg_txt, "r")) == NULL)
- return 1;
- while(fgets(line, sizeof(line)-1, fp)){
- line[sizeof(line)-1] = '\0';
-
- reg = calloc(sizeof(struct accreg), 1);
- if (reg == NULL) {
- printf("inter: accreg: out of memory!\n");
- exit(0);
- }
- if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) {
- numdb_insert(accreg_db, reg->account_id, reg);
- } else {
- printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, c);
- free(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(void *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() {
- FILE *fp;
- int lock;
-
- if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) {
- printf("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt);
- return 1;
- }
- numdb_foreach(accreg_db, inter_accreg_save_sub,fp);
- lock_fclose(fp, accreg_txt, &lock);
-// printf("inter: %s saved.\n", accreg_txt);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int inter_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp = fopen(cfgName, "r");
- if (fp == NULL) {
- printf("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, "guild_txt") == 0) {
- strncpy(guild_txt, w2, sizeof(guild_txt));
- } else if (strcmpi(w1, "pet_txt") == 0) {
- strncpy(pet_txt, w2, sizeof(pet_txt));
- } else if (strcmpi(w1, "castle_txt") == 0) {
- strncpy(castle_txt, w2, sizeof(castle_txt));
- } else if (strcmpi(w1, "accreg_txt") == 0) {
- strncpy(accreg_txt, w2, sizeof(accreg_txt));
- } else if (strcmpi(w1, "guild_storage_txt") == 0) {
- strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt));
- } else if (strcmpi(w1, "party_share_level") == 0) {
- party_share_level = atoi(w2);
- if (party_share_level < 0)
- party_share_level = 0;
- } else if (strcmpi(w1, "inter_log_filename") == 0) {
- strncpy(inter_log_filename, w2, sizeof(inter_log_filename));
- } else if (strcmpi(w1, "import") == 0) {
- inter_config_read(w2);
- } else if(strcmpi(w1,"log_inter")==0) {
- log_inter = atoi(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-// ƒƒ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() {
- inter_party_save();
- inter_guild_save();
- inter_storage_save();
- inter_guild_storage_save();
- inter_pet_save();
- inter_accreg_save();
-
- return 0;
-}
-
-// ‰Šú‰»
-int inter_init(const char *file) {
- inter_config_read(file);
-
- wis_db = numdb_init();
-
- inter_party_init();
- inter_guild_init();
- inter_storage_init();
- inter_pet_init();
- inter_accreg_init();
-
- return 0;
-}
-
-// ƒ}ƒbƒvƒT[ƒo[Ú‘±
-int inter_mapif_init(int fd) {
- inter_guild_mapif_init(fd);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// sended packets to map-server
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_GMmessage(unsigned char *mes, int len) {
- unsigned char buf[len];
-
- WBUFW(buf,0) = 0x3800;
- WBUFW(buf,2) = len;
- memcpy(WBUFP(buf,4), mes, len - 4);
- mapif_sendall(buf, len);
-// printf("inter server: GM:%d %s\n", len, mes);
-
- return 0;
-}
-
-// Wisp/page transmission to all map-server
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[56 + wd->len];
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 + wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, 24);
- memcpy(WBUFP(buf,32), wd->dst, 24);
- memcpy(WBUFP(buf,56), wd->msg, wd->len);
- wd->count = mapif_sendall(buf, WBUFW(buf,2));
-
- 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[WBUFW(src,2)];
-
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0) = 0x3804;
- mapif_sendallwos(fd, buf, WBUFW(buf,2));
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”—v‹•ÔM
-int mapif_account_reg_reply(int fd,int account_id) {
- struct accreg *reg = numdb_search(accreg_db,account_id);
-
- WFIFOW(fd,0) = 0x3804;
- WFIFOL(fd,4) = account_id;
- if (reg == NULL) {
- WFIFOW(fd,2) = 8;
- } else {
- int j, p;
- for(j = 0, p = 8; j < reg->reg_num; j++, p += 36) {
- memcpy(WFIFOP(fd,p), reg->reg[j].str, 32);
- WFIFOL(fd,p+32) = reg->reg[j].value;
- }
- WFIFOW(fd,2) = p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(void *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() {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = numdb_search(wis_db, wis_dellist[i]);
- printf("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
- numdb_erase(wis_db, wd->id);
- free(wd);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-// received packets from map-server
-
-// GMƒƒbƒZ[ƒW‘—M
-int mapif_parse_GMmessage(int fd) {
- mapif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2));
-
- return 0;
-}
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct WisData* wd;
- static int wisid = 0;
- int index;
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- printf("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- printf("inter: Wis message doesn't exist.\n");
- return 0;
- }
-
- // search if character exists before to ask all map-servers
- if ((index = search_character_index(RFIFOP(fd,28))) == -1) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- 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(RFIFOP(fd,28), 0, 24);
- strncpy(RFIFOP(fd,28), search_character_name(index), 24);
- // if source is destination, don't ask other servers.
- if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- 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 {
-
- wd = (struct WisData *)calloc(sizeof(struct WisData), 1);
- if (wd == NULL){
- printf("inter: WisRequest: out of memory !\n");
- return 0;
- }
-
- // 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), 24);
- memcpy(wd->dst, RFIFOP(fd,28), 24);
- memcpy(wd->msg, RFIFOP(fd,52), wd->len);
- wd->tick = gettick();
- numdb_insert(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- }
- }
-
- return 0;
-}
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
- struct WisData *wd = numdb_search(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
- numdb_erase(wis_db, id);
- free(wd);
- }
-
- 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[RFIFOW(fd,2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
-
- memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf, 0) = 0x3803;
- mapif_sendall(buf, RFIFOW(fd,2));
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
-int mapif_parse_AccReg(int fd) {
- int j, p;
- struct accreg *reg = numdb_search(accreg_db, RFIFOL(fd,4));
-
- if (reg == NULL) {
- if ((reg = calloc(sizeof(struct accreg), 1)) == NULL) {
- printf("inter: accreg: out of memory !\n");
- exit(0);
- }
- reg->account_id = RFIFOL(fd,4);
- numdb_insert(accreg_db, RFIFOL(fd,4), reg);
- }
-
- for(j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW(fd,2); j++, p += 36) {
- memcpy(reg->reg[j].str, RFIFOP(fd,p), 32);
- reg->reg[j].value = RFIFOL(fd, p + 32);
- }
- reg->reg_num = j;
-
- mapif_account_reg(fd, RFIFOP(fd,0)); // ‘¼‚ÌMAPƒT[ƒo[‚É‘—M
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M—v‹
-int mapif_parse_AccRegRequest(int fd) {
-// printf("mapif: accreg request\n");
- return mapif_account_reg_reply(fd, RFIFOL(fd,2));
-}
-
-//--------------------------------------------------------
-
-// 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 = RFIFOW(fd,0);
- int len = 0;
-
- // interŽIŠÇŠ‚©‚𒲂ׂé
- if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0])))
- 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_AccReg(fd); break;
- case 0x3005: mapif_parse_AccRegRequest(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;
- 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’·
- if (RFIFOREST(fd) < 4) // ƒpƒPƒbƒg’·‚ª–¢’…
- return 0;
- length = RFIFOW(fd,2);
- }
-
- if (RFIFOREST(fd) < length) // ƒpƒPƒbƒg‚ª–¢’…
- return 0;
-
- return length;
-}
-
+// $Id: inter.c,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#include "mmo.h"
+#include "char.h"
+#include "socket.h"
+#include "timer.h"
+#include "db.h"
+#include <string.h>
+#include <stdlib.h>
+
+#include "inter.h"
+#include "int_party.h"
+#include "int_guild.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "lock.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 inter_log_filename[1024] = "log/inter.log";
+
+char accreg_txt[1024] = "save/accreg.txt";
+static struct dbt *accreg_db = NULL;
+
+struct accreg {
+ int account_id, reg_num;
+ struct global_reg reg[ACCOUNT_REG_NUM];
+};
+
+int party_share_level = 10;
+
+
+// ‘—MƒpƒPƒbƒg’·ƒŠƒXƒg
+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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+// ŽóMƒpƒPƒbƒg’·ƒŠƒXƒg
+int inter_recv_packet_length[] = {
+ -1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 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,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+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,%d ", reg->reg[j].str, reg->reg[j].value);
+ }
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‚𕶎š—ñ‚©‚ç•ÏŠ·
+int inter_accreg_fromstr(const char *str, struct accreg *reg) {
+ int j, v, n;
+ char buf[128];
+ 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, "%[^,],%d %n", buf, &v, &n) != 2)
+ break;
+ memcpy(reg->reg[j].str, buf, 32);
+ reg->reg[j].value = v;
+ }
+ reg->reg_num = j;
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‚Ì“Ç‚Ýž‚Ý
+int inter_accreg_init() {
+ char line[8192];
+ FILE *fp;
+ int c = 0;
+ struct accreg *reg;
+
+ accreg_db = numdb_init();
+
+ if( (fp = fopen(accreg_txt, "r")) == NULL)
+ return 1;
+ while(fgets(line, sizeof(line)-1, fp)){
+ line[sizeof(line)-1] = '\0';
+
+ reg = calloc(sizeof(struct accreg), 1);
+ if (reg == NULL) {
+ printf("inter: accreg: out of memory!\n");
+ exit(0);
+ }
+ if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) {
+ numdb_insert(accreg_db, reg->account_id, reg);
+ } else {
+ printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, c);
+ free(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(void *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() {
+ FILE *fp;
+ int lock;
+
+ if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) {
+ printf("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt);
+ return 1;
+ }
+ numdb_foreach(accreg_db, inter_accreg_save_sub,fp);
+ lock_fclose(fp, accreg_txt, &lock);
+// printf("inter: %s saved.\n", accreg_txt);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+
+/*==========================================
+ * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+int inter_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp = fopen(cfgName, "r");
+ if (fp == NULL) {
+ printf("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, "guild_txt") == 0) {
+ strncpy(guild_txt, w2, sizeof(guild_txt));
+ } else if (strcmpi(w1, "pet_txt") == 0) {
+ strncpy(pet_txt, w2, sizeof(pet_txt));
+ } else if (strcmpi(w1, "castle_txt") == 0) {
+ strncpy(castle_txt, w2, sizeof(castle_txt));
+ } else if (strcmpi(w1, "accreg_txt") == 0) {
+ strncpy(accreg_txt, w2, sizeof(accreg_txt));
+ } else if (strcmpi(w1, "guild_storage_txt") == 0) {
+ strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt));
+ } else if (strcmpi(w1, "party_share_level") == 0) {
+ party_share_level = atoi(w2);
+ if (party_share_level < 0)
+ party_share_level = 0;
+ } else if (strcmpi(w1, "inter_log_filename") == 0) {
+ strncpy(inter_log_filename, w2, sizeof(inter_log_filename));
+ } else if (strcmpi(w1, "import") == 0) {
+ inter_config_read(w2);
+ } else if(strcmpi(w1,"log_inter")==0) {
+ log_inter = atoi(w2);
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+// ƒƒ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() {
+ inter_party_save();
+ inter_guild_save();
+ inter_storage_save();
+ inter_guild_storage_save();
+ inter_pet_save();
+ inter_accreg_save();
+
+ return 0;
+}
+
+// ‰Šú‰»
+int inter_init(const char *file) {
+ inter_config_read(file);
+
+ wis_db = numdb_init();
+
+ inter_party_init();
+ inter_guild_init();
+ inter_storage_init();
+ inter_pet_init();
+ inter_accreg_init();
+
+ return 0;
+}
+
+// ƒ}ƒbƒvƒT[ƒo[Ú‘±
+int inter_mapif_init(int fd) {
+ inter_guild_mapif_init(fd);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// sended packets to map-server
+
+// GMƒƒbƒZ[ƒW‘—M
+int mapif_GMmessage(unsigned char *mes, int len) {
+ unsigned char buf[len];
+
+ WBUFW(buf,0) = 0x3800;
+ WBUFW(buf,2) = len;
+ memcpy(WBUFP(buf,4), mes, len - 4);
+ mapif_sendall(buf, len);
+// printf("inter server: GM:%d %s\n", len, mes);
+
+ return 0;
+}
+
+// Wisp/page transmission to all map-server
+int mapif_wis_message(struct WisData *wd) {
+ unsigned char buf[56 + wd->len];
+
+ WBUFW(buf, 0) = 0x3801;
+ WBUFW(buf, 2) = 56 + wd->len;
+ WBUFL(buf, 4) = wd->id;
+ memcpy(WBUFP(buf, 8), wd->src, 24);
+ memcpy(WBUFP(buf,32), wd->dst, 24);
+ memcpy(WBUFP(buf,56), wd->msg, wd->len);
+ wd->count = mapif_sendall(buf, WBUFW(buf,2));
+
+ 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[WBUFW(src,2)];
+
+ memcpy(WBUFP(buf,0),src,WBUFW(src,2));
+ WBUFW(buf, 0) = 0x3804;
+ mapif_sendallwos(fd, buf, WBUFW(buf,2));
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”—v‹•ÔM
+int mapif_account_reg_reply(int fd,int account_id) {
+ struct accreg *reg = numdb_search(accreg_db,account_id);
+
+ WFIFOW(fd,0) = 0x3804;
+ WFIFOL(fd,4) = account_id;
+ if (reg == NULL) {
+ WFIFOW(fd,2) = 8;
+ } else {
+ int j, p;
+ for(j = 0, p = 8; j < reg->reg_num; j++, p += 36) {
+ memcpy(WFIFOP(fd,p), reg->reg[j].str, 32);
+ WFIFOL(fd,p+32) = reg->reg[j].value;
+ }
+ WFIFOW(fd,2) = p;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+//--------------------------------------------------------
+
+// Existence check of WISP data
+int check_ttl_wisdata_sub(void *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() {
+ unsigned long tick = gettick();
+ int i;
+
+ do {
+ wis_delnum = 0;
+ numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
+ for(i = 0; i < wis_delnum; i++) {
+ struct WisData *wd = numdb_search(wis_db, wis_dellist[i]);
+ printf("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
+ numdb_erase(wis_db, wd->id);
+ free(wd);
+ }
+ } while(wis_delnum >= WISDELLIST_MAX);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+// received packets from map-server
+
+// GMƒƒbƒZ[ƒW‘—M
+int mapif_parse_GMmessage(int fd) {
+ mapif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2));
+
+ return 0;
+}
+
+// Wisp/page request to send
+int mapif_parse_WisRequest(int fd) {
+ struct WisData* wd;
+ static int wisid = 0;
+ int index;
+
+ if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
+ printf("inter: Wis message size too long.\n");
+ return 0;
+ } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
+ printf("inter: Wis message doesn't exist.\n");
+ return 0;
+ }
+
+ // search if character exists before to ask all map-servers
+ if ((index = search_character_index(RFIFOP(fd,28))) == -1) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
+ 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(RFIFOP(fd,28), 0, 24);
+ strncpy(RFIFOP(fd,28), search_character_name(index), 24);
+ // if source is destination, don't ask other servers.
+ if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
+ 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 {
+
+ wd = (struct WisData *)calloc(sizeof(struct WisData), 1);
+ if (wd == NULL){
+ printf("inter: WisRequest: out of memory !\n");
+ return 0;
+ }
+
+ // 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), 24);
+ memcpy(wd->dst, RFIFOP(fd,28), 24);
+ memcpy(wd->msg, RFIFOP(fd,52), wd->len);
+ wd->tick = gettick();
+ numdb_insert(wis_db, wd->id, wd);
+ mapif_wis_message(wd);
+ }
+ }
+
+ return 0;
+}
+
+// Wisp/page transmission result
+int mapif_parse_WisReply(int fd) {
+ int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
+ struct WisData *wd = numdb_search(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
+ numdb_erase(wis_db, id);
+ free(wd);
+ }
+
+ 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[RFIFOW(fd,2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+
+ memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf, 0) = 0x3803;
+ mapif_sendall(buf, RFIFOW(fd,2));
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
+int mapif_parse_AccReg(int fd) {
+ int j, p;
+ struct accreg *reg = numdb_search(accreg_db, RFIFOL(fd,4));
+
+ if (reg == NULL) {
+ if ((reg = calloc(sizeof(struct accreg), 1)) == NULL) {
+ printf("inter: accreg: out of memory !\n");
+ exit(0);
+ }
+ reg->account_id = RFIFOL(fd,4);
+ numdb_insert(accreg_db, RFIFOL(fd,4), reg);
+ }
+
+ for(j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW(fd,2); j++, p += 36) {
+ memcpy(reg->reg[j].str, RFIFOP(fd,p), 32);
+ reg->reg[j].value = RFIFOL(fd, p + 32);
+ }
+ reg->reg_num = j;
+
+ mapif_account_reg(fd, RFIFOP(fd,0)); // ‘¼‚ÌMAPƒT[ƒo[‚É‘—M
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‘—M—v‹
+int mapif_parse_AccRegRequest(int fd) {
+// printf("mapif: accreg request\n");
+ return mapif_account_reg_reply(fd, RFIFOL(fd,2));
+}
+
+//--------------------------------------------------------
+
+// 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 = RFIFOW(fd,0);
+ int len = 0;
+
+ // interŽIŠÇŠ‚©‚𒲂ׂé
+ if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0])))
+ 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_AccReg(fd); break;
+ case 0x3005: mapif_parse_AccRegRequest(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;
+ 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’·
+ if (RFIFOREST(fd) < 4) // ƒpƒPƒbƒg’·‚ª–¢’…
+ return 0;
+ length = RFIFOW(fd,2);
+ }
+
+ if (RFIFOREST(fd) < length) // ƒpƒPƒbƒg‚ª–¢’…
+ return 0;
+
+ return length;
+}
+
diff --git a/src/char/inter.h b/src/char/inter.h
index 897188054..0b6f809d7 100644
--- a/src/char/inter.h
+++ b/src/char/inter.h
@@ -1,20 +1,20 @@
-// $Id: inter.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-int inter_save();
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern int party_share_level;
-extern char inter_log_filename[1024];
-extern int log_inter;
-
-#endif
+// $Id: inter.h,v 1.1.1.1 2004/09/10 17:26:51 MagicalTux Exp $
+#ifndef _INTER_H_
+#define _INTER_H_
+
+int inter_init(const char *file);
+int inter_save();
+int inter_parse_frommap(int fd);
+int inter_mapif_init(int fd);
+
+int inter_check_length(int fd,int length);
+
+int inter_log(char *fmt,...);
+
+#define inter_cfgName "conf/inter_athena.conf"
+
+extern int party_share_level;
+extern char inter_log_filename[1024];
+extern int log_inter;
+
+#endif
diff --git a/src/char_sql/Makefile b/src/char_sql/Makefile
index 23376a5bc..c2e8afe35 100644
--- a/src/char_sql/Makefile
+++ b/src/char_sql/Makefile
@@ -1,20 +1,20 @@
-all: char-server_sql
-sql: char-server_sql
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h ../common/malloc.h ../common/showmsg.h
-
-char-server_sql: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o strlib.o itemdb.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $^ $(LIB_S)
-
-char.o: char.c char.h strlib.h itemdb.h ../common/showmsg.h
-inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h ../common/mmo.h char.h ../common/socket.h ../common/showmsg.h
-int_party.o: int_party.c int_party.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/timer.h ../common/db.h ../common/showmsg.h
-int_guild.o: int_guild.c int_guild.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/db.h ../common/showmsg.h
-int_storage.o: int_storage.c int_storage.h char.h itemdb.h ../common/showmsg.h
-int_pet.o: int_pet.c int_pet.h inter.h char.h ../common/mmo.h ../common/socket.h ../common/db.h ../common/showmsg.h
-strlib.o: strlib.c strlib.h ../common/showmsg.h
-itemdb.o: itemdb.c itemdb.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-
-clean:
- rm -f *.o ../../char-server_sql
+all: char-server_sql
+sql: char-server_sql
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h ../common/malloc.h ../common/showmsg.h
+
+char-server_sql: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o strlib.o itemdb.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ $^ $(LIB_S)
+
+char.o: char.c char.h strlib.h itemdb.h ../common/showmsg.h
+inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h ../common/mmo.h char.h ../common/socket.h ../common/showmsg.h
+int_party.o: int_party.c int_party.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/timer.h ../common/db.h ../common/showmsg.h
+int_guild.o: int_guild.c int_guild.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/db.h ../common/showmsg.h
+int_storage.o: int_storage.c int_storage.h char.h itemdb.h ../common/showmsg.h
+int_pet.o: int_pet.c int_pet.h inter.h char.h ../common/mmo.h ../common/socket.h ../common/db.h ../common/showmsg.h
+strlib.o: strlib.c strlib.h ../common/showmsg.h
+itemdb.o: itemdb.c itemdb.h ../common/db.h ../common/mmo.h ../common/showmsg.h
+
+clean:
+ rm -f *.o ../../char-server_sql
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 61f7b643c..fbd7ddda4 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -1,3023 +1,3023 @@
-// $Id: char.c,v 1.16 2004/09/23 18:31:16 MouseJstr Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-// TXT 1.105
-#include <sys/types.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#pragma lib <libmysql.lib>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-
-#include "../common/utils.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdarg.h>
-
-#include "char.h"
-#include "strlib.h"
-#include "itemdb.h"
-#include "inter.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-char char_db[256] = "char";
-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 login_db[256] = "login";
-
-char login_db_account_id[32] = "account_id";
-char login_db_level[32] = "level";
-
-int lowest_gm_level = 1;
-
-unsigned char *SQL_CONF_NAME = "conf/inter_athena.conf";
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
-
-int anti_freeze_enable = 0;
-int ANTI_FREEZE_INTERVAL = 6;
-
-int login_fd, char_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char wisp_server_name[24] = "Server";
-int login_ip_set_ = 0;
-char login_ip_str[128];
-int login_ip;
-int login_port = 6900;
-int char_ip_set_ = 0;
-char char_ip_str[128];
-int char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-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]
-
-int log_char = 1; // loggin char or not [devil]
-int log_inter = 1; // loggin inter or not [devil]
-
-char lan_map_ip[128]; // Lan map ip added by kashy
-int subnetmaski[4]; // Subnetmask added by kashy
-char unknown_char_name[1024] = "Unknown";
-char db_path[1024]="db";
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-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)
-
-int char_id_count = 150000;
-struct mmo_charstatus *char_dat;
-int char_num,char_max;
-int max_connect_user = 0;
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int start_zeny = 500;
-int start_weapon = 1201;
-int start_armor = 2301;
-
-// 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 = {"new_1-1.gat", 53, 111};
-
-struct gm_account *gm_account = NULL;
-int GM_num = 0;
-
-int console = 0;
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
-
- for(i = 0; i < strlen(str); i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
-
- return change;
-}
-
-//----------------------------------------------------------------------
-// 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 (gm_account != NULL)
- free(gm_account);
- GM_num = 0;
-
- sprintf(tmp_lsql, "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_lsql)) {
- printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle));
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = calloc(sizeof(struct gm_account) * 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);
-}
-
-//=====================================================================================================
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i=0,party_exist,guild_exist;
- int eqcount=1;
- int noteqcount=1;
- char temp_str[32];
-
- struct itemtemp mapitem;
- if (char_id!=p->char_id) return 0;
-
- save_flag = p->char_id;
- printf("(\033[1;32m%d\033[0m) %s \trequest save char data - ",char_id,char_dat[0].name);
-
-
-
-//for(testcount=1;testcount<50;testcount++){//---------------------------test count--------------------
-// printf("test count : %d\n", testcount);
-// eqcount=1;
-// noteqcount=1;
-// dbeqcount=1;
-// dbnoteqcount=1;
-//-----------------------------------------------------------------------------------------------------
-
-//=========================================map inventory data > memory ===============================
- //map inventory data
- for(i=0;i<MAX_INVENTORY;i++){
- if(p->inventory[i].nameid>0){
- if(itemdb_isequip(p->inventory[i].nameid)==1){
- mapitem.equip[eqcount].flag=0;
- mapitem.equip[eqcount].id = p->inventory[i].id;
- mapitem.equip[eqcount].nameid=p->inventory[i].nameid;
- mapitem.equip[eqcount].amount = p->inventory[i].amount;
- mapitem.equip[eqcount].equip = p->inventory[i].equip;
- mapitem.equip[eqcount].identify = p->inventory[i].identify;
- mapitem.equip[eqcount].refine = p->inventory[i].refine;
- mapitem.equip[eqcount].attribute = p->inventory[i].attribute;
- mapitem.equip[eqcount].card[0] = p->inventory[i].card[0];
- mapitem.equip[eqcount].card[1] = p->inventory[i].card[1];
- mapitem.equip[eqcount].card[2] = p->inventory[i].card[2];
- mapitem.equip[eqcount].card[3] = p->inventory[i].card[3];
- eqcount++;
- }
- else if(itemdb_isequip(p->inventory[i].nameid)==0){
- mapitem.notequip[noteqcount].flag=0;
- mapitem.notequip[noteqcount].id = p->inventory[i].id;
- mapitem.notequip[noteqcount].nameid=p->inventory[i].nameid;
- mapitem.notequip[noteqcount].amount = p->inventory[i].amount;
- mapitem.notequip[noteqcount].equip = p->inventory[i].equip;
- mapitem.notequip[noteqcount].identify = p->inventory[i].identify;
- mapitem.notequip[noteqcount].refine = p->inventory[i].refine;
- mapitem.notequip[noteqcount].attribute = p->inventory[i].attribute;
- mapitem.notequip[noteqcount].card[0] = p->inventory[i].card[0];
- mapitem.notequip[noteqcount].card[1] = p->inventory[i].card[1];
- mapitem.notequip[noteqcount].card[2] = p->inventory[i].card[2];
- mapitem.notequip[noteqcount].card[3] = p->inventory[i].card[3];
- noteqcount++;
- }
- }
- }
- //printf("- Save item data to MySQL!\n");
- memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_INVENTORY);
-
-//=========================================map cart data > memory ====================================
- eqcount=1;
- noteqcount=1;
-
- //map cart data
- for(i=0;i<MAX_CART;i++){
- if(p->cart[i].nameid>0){
- if(itemdb_isequip(p->cart[i].nameid)==1){
- mapitem.equip[eqcount].flag=0;
- mapitem.equip[eqcount].id = p->cart[i].id;
- mapitem.equip[eqcount].nameid=p->cart[i].nameid;
- mapitem.equip[eqcount].amount = p->cart[i].amount;
- mapitem.equip[eqcount].equip = p->cart[i].equip;
- mapitem.equip[eqcount].identify = p->cart[i].identify;
- mapitem.equip[eqcount].refine = p->cart[i].refine;
- mapitem.equip[eqcount].attribute = p->cart[i].attribute;
- mapitem.equip[eqcount].card[0] = p->cart[i].card[0];
- mapitem.equip[eqcount].card[1] = p->cart[i].card[1];
- mapitem.equip[eqcount].card[2] = p->cart[i].card[2];
- mapitem.equip[eqcount].card[3] = p->cart[i].card[3];
- eqcount++;
- }
- else if(itemdb_isequip(p->cart[i].nameid)==0){
- mapitem.notequip[noteqcount].flag=0;
- mapitem.notequip[noteqcount].id = p->cart[i].id;
- mapitem.notequip[noteqcount].nameid=p->cart[i].nameid;
- mapitem.notequip[noteqcount].amount = p->cart[i].amount;
- mapitem.notequip[noteqcount].equip = p->cart[i].equip;
- mapitem.notequip[noteqcount].identify = p->cart[i].identify;
- mapitem.notequip[noteqcount].refine = p->cart[i].refine;
- mapitem.notequip[noteqcount].attribute = p->cart[i].attribute;
- mapitem.notequip[noteqcount].card[0] = p->cart[i].card[0];
- mapitem.notequip[noteqcount].card[1] = p->cart[i].card[1];
- mapitem.notequip[noteqcount].card[2] = p->cart[i].card[2];
- mapitem.notequip[noteqcount].card[3] = p->cart[i].card[3];
- noteqcount++;
- }
- }
- }
-
- //printf("- Save cart data to MySQL!\n");
- memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_CART);
-
-//=====================================================================================================
-
-//}//---------------------------test count------------------------------
- //check party_exist
- party_exist=0;
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id` = '%d'",party_db, p->party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row) party_exist = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- //check guild_exist
- guild_exist=0;
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id` = '%d'",guild_db, p->guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row) guild_exist = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- if (guild_exist==0) p->guild_id=0;
- if (party_exist==0) p->party_id=0;
-
- //sql query
- //`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`)
- //printf("- Save char data to MySQL!\n");
- sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d', `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%d', `job_exp`='%d', `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' WHERE `account_id`='%d' AND `char_id` = '%d'",
- char_db, p->class, 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->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, p->partner_id, p->account_id, p->char_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //printf("- Save memo data to MySQL!\n");
- //`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)) {
- printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //insert here.
- for(i=0;i<10;i++){
- if(p->memo_point[i].map[0]){
- sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
- memo_db, char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle));
- }
- }
-
- //printf("- Save skill data to MySQL!\n");
- //`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)) {
- printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- //printf("- Insert skill \n");
- //insert here.
- for(i=0;i<MAX_SKILL;i++){
- if(p->skill[i].id){
- if (p->skill[i].id && p->skill[i].flag!=1) {
- sprintf(tmp_sql,"INSERT delayed INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')",
- skill_db, char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- }
-
-
- //printf("- Save global_reg_value data to MySQL!\n");
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, p->char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //insert here.
- for(i=0;i<p->global_reg_num;i++){
- if (p->global_reg[i].str) {
- if(p->global_reg[i].value !=0){
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
- reg_db, char_id, jstrescapecpy(temp_str,(unsigned char*)p->global_reg[i].str), p->global_reg[i].value);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- }
- printf("saving char is done.\n");
- save_flag = 0;
-
- return 0;
-}
-
-int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int char_id, int tableswitch){
- //equ
- int i, j;
- int dbeqcount = 1;
- int dbnoteqcount = 1;
- struct itemtemp dbitem;
- char tablename[16];
- char selectoption[16];
-
- switch (tableswitch){
- case TABLE_INVENTORY:
- sprintf(tablename,"%s",inventory_db);
- sprintf(selectoption,"char_id");
- break;
- case TABLE_CART:
- sprintf(tablename,"%s",cart_db);
- sprintf(selectoption,"char_id");
- break;
- case TABLE_STORAGE:
- sprintf(tablename,"%s",storage_db);
- sprintf(selectoption,"account_id");
- break;
- case TABLE_GUILD_STORAGE:
- sprintf(tablename,"%s",guild_storage_db);
- sprintf(selectoption,"guild_id");
- break;
- }
- //printf("Working Table : %s \n",tablename);
-
- //=======================================mysql database data > memory===============================================
-
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` "
- "FROM `%s` WHERE `%s`='%d'",tablename ,selectoption ,char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `%s` to Memory)- %s\n",tablename ,mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- if (itemdb_isequip(atoi(sql_row[1]))==1){
- dbitem.equip[dbeqcount].flag=0;
- dbitem.equip[dbeqcount].id = atoi(sql_row[0]);
- dbitem.equip[dbeqcount].nameid = atoi(sql_row[1]);
- dbitem.equip[dbeqcount].amount = atoi(sql_row[2]);
- dbitem.equip[dbeqcount].equip = atoi(sql_row[3]);
- dbitem.equip[dbeqcount].identify = atoi(sql_row[4]);
- dbitem.equip[dbeqcount].refine = atoi(sql_row[5]);
- dbitem.equip[dbeqcount].attribute = atoi(sql_row[6]);
- dbitem.equip[dbeqcount].card[0] = atoi(sql_row[7]);
- dbitem.equip[dbeqcount].card[1] = atoi(sql_row[8]);
- dbitem.equip[dbeqcount].card[2] = atoi(sql_row[9]);
- dbitem.equip[dbeqcount].card[3] = atoi(sql_row[10]);
- dbeqcount++;
- }else {
- dbitem.notequip[dbnoteqcount].flag=0;
- dbitem.notequip[dbnoteqcount].id = atoi(sql_row[0]);
- dbitem.notequip[dbnoteqcount].nameid = atoi(sql_row[1]);
- dbitem.notequip[dbnoteqcount].amount = atoi(sql_row[2]);
- dbitem.notequip[dbnoteqcount].equip = atoi(sql_row[3]);
- dbitem.notequip[dbnoteqcount].identify = atoi(sql_row[4]);
- dbitem.notequip[dbnoteqcount].refine = atoi(sql_row[5]);
- dbitem.notequip[dbnoteqcount].attribute = atoi(sql_row[6]);
- dbitem.notequip[dbnoteqcount].card[0] = atoi(sql_row[7]);
- dbitem.notequip[dbnoteqcount].card[1] = atoi(sql_row[8]);
- dbitem.notequip[dbnoteqcount].card[2] = atoi(sql_row[9]);
- dbitem.notequip[dbnoteqcount].card[3] = atoi(sql_row[10]);
- dbnoteqcount++;
- }
- }
- mysql_free_result(sql_res);
- }
-
- //==============================================Memory data > SQL ===============================
- //======================================Equip ITEM=======================================
- if((eqcount==1) && (dbeqcount==1)){//printf("%s Equip Empty\n",tablename);
- //item empty
- } else {
-
- for(i=1;i<eqcount;i++){
- for(j=1;j<dbeqcount;j++){
- if(mapitem.equip[i].flag==1) break;
- if(!(dbitem.equip[j].flag==1)){
- if(mapitem.equip[i].nameid==dbitem.equip[j].nameid){
- if ((mapitem.equip[i].equip==dbitem.equip[j].equip) && (mapitem.equip[i].identify==dbitem.equip[j].identify) && (mapitem.equip[i].amount==dbitem.equip[j].amount) &&
-
- (mapitem.equip[i].refine==dbitem.equip[j].refine) && (mapitem.equip[i].attribute==dbitem.equip[j].attribute) && (mapitem.equip[i].card[0]==dbitem.equip[j].card[0]) &&
- (mapitem.equip[i].card[1]==dbitem.equip[j].card[1]) && (mapitem.equip[i].card[2]==dbitem.equip[j].card[2]) && (mapitem.equip[i].card[3]==dbitem.equip[j].card[3])) {
- mapitem.equip[i].flag = 1;
- dbitem.equip[j].flag = 1;
- //printf("the same item : %d , equip : %d , i : %d , flag : %d\n", mapitem.equip[i].nameid,mapitem.equip[i].equip , i, mapitem.equip[i].flag); //DEBUG-STRING
- } else {
- sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',"
- "`attribute`='%d', `card0`='%d', `card1`='%d', `card2`='%d', `card3`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
- tablename, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine,mapitem.equip[i].attribute, mapitem.equip[i].card[0],
- mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3], mapitem.equip[i].amount, dbitem.equip[j].id);
- //printf("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (UPdate `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
- mapitem.equip[i].flag=1;
- dbitem.equip[j].flag=1;
- //printf("not the same item : %d ; i : %d ; flag : %d\n", mapitem.equip[i].nameid, i, mapitem.equip[i].flag);
- }
- }
- }
- }
- }
-
- //printf("dbeqcount = %d\n",dbeqcount);
-
- for(i=1;i<dbeqcount;i++){
- //printf("dbitem.equip[i].flag = %d , dbitem.equip[i].id = %d\n",dbitem.equip[i].flag,dbitem.equip[i].id);
- if (!(dbitem.equip[i].flag == 1)) {
- sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'",tablename , dbitem.equip[i].id);
- //printf("%s", tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (DELETE `equ %s`)- %s\n", tablename ,mysql_error(&mysql_handle));
- }
- }
- for(i=1;i<eqcount;i++){
- if(!(mapitem.equip[i].flag==1)){
- sprintf(tmp_sql,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)"
- " VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- tablename, selectoption, char_id, mapitem.equip[i].nameid, mapitem.equip[i].amount, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine,
- mapitem.equip[i].attribute, mapitem.equip[i].card[0], mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3]);
- //printf("%s", tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (INSERT `equ %s`)- %s\n",tablename ,mysql_error(&mysql_handle));
- }
- }
-
- //======================================DEBUG=================================================
-
-// gettimeofday(&tv,NULL);
-// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
-// printf("\n\n");
-// printf("Working Table Name : EQU %s, Count : map %3d | db %3d \n",tablename ,eqcount ,dbeqcount);
-// printf("*********************************************************************************\n");
-// printf("======================================MAP===================Char ID %10d===\n",char_id);
-// printf("==flag ===name ===equip===ident===amoun===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<eqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.equip[j].flag,mapitem.equip[j].nameid, mapitem.equip[j].equip, mapitem.equip[j].identify, mapitem.equip[j].refine,mapitem.equip[j].attribute, mapitem.equip[j].card[0], mapitem.equip[j].card[1], mapitem.equip[j].card[2], mapitem.equip[j].card[3]);
-// printf("======================================DB=========================================\n");
-// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<dbeqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.equip[j].flag ,dbitem.equip[j].nameid, dbitem.equip[j].equip, dbitem.equip[j].identify, dbitem.equip[j].amount,dbitem.equip[j].attribute, dbitem.equip[j].card[0], dbitem.equip[j].card[1], dbitem.equip[j].card[2], dbitem.equip[j].card[3]);
-// printf("=================================================================================\n");
-// printf("=================================================Data Time %s===\n", tmpstr);
-// printf("=================================================================================\n");
-
- }
-
- //======================================DEBUG==================================================
-
- //=============================Not Equip ITEM==========================================
- if((noteqcount==1) && (dbnoteqcount==1)){
- //printf("%s Not Equip Empty\n",tablename);
- //item empty
- } else {
-
- for(i=1;i<noteqcount;i++){
- for(j=1;j<dbnoteqcount;j++){
- if(mapitem.notequip[i].flag==1) break;
- if(!(dbitem.notequip[j].flag==1)){
- if(mapitem.notequip[i].nameid==dbitem.notequip[j].nameid){
- if ((mapitem.notequip[i].amount==dbitem.notequip[j].amount) && (mapitem.notequip[i].equip==dbitem.notequip[j].equip) && (mapitem.notequip[i].identify==dbitem.notequip[j].identify)
- && (mapitem.notequip[i].attribute==dbitem.notequip[j].attribute))
- { mapitem.notequip[i].flag=1;
- dbitem.notequip[j].flag=1;
- //printf("the same item : %d ; i : %d ; flag : %d\n", mapitem.notequip[i].nameid, i, mapitem.notequip[i].flag); //DEBUG-STRING
- }
- else{
- sprintf(tmp_sql,"UPDATE `%s` SET `amount`='%d', `equip`='%d', `identify`='%d',"
- "`attribute`='%d' WHERE `%s`='%d' AND `nameid`='%d'",
- tablename, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].attribute,
- selectoption, char_id, mapitem.notequip[i].nameid);
- //printf("%s",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (UPdate `notequ %s`)- %s\n",tablename ,mysql_error(&mysql_handle));
-
- mapitem.notequip[i].flag=1;
- dbitem.notequip[j].flag=1;
- }
- }
- }
- }
- }
-
- //printf("dbnoteqcount = %d\n",dbnoteqcount);
-
- for(i=1;i<dbnoteqcount;i++){
- //printf("dbitem.notequip[i].flag = %d , dbitem.notequip[i].id = %d\n",dbitem.notequip[i].flag,dbitem.notequip[i].id);
- if(!(dbitem.notequip[i].flag==1)){
- sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, dbitem.notequip[i].id);
- //printf("%s", tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (DELETE `notequ %s`)- %s\n", tablename ,mysql_error(&mysql_handle));
- }
- }
- for(i=1;i<noteqcount;i++){
- if(!(mapitem.notequip[i].flag==1)){
- sprintf(tmp_sql,"INSERT INTO `%s`( `%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)"
- " VALUES ('%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- tablename ,selectoption , char_id, mapitem.notequip[i].nameid, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].refine,
- mapitem.notequip[i].attribute, mapitem.notequip[i].card[0], mapitem.notequip[i].card[1], mapitem.notequip[i].card[2], mapitem.notequip[i].card[3]);
- //printf("%s", tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (INSERT `notequ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
- }
- }
-
- //======================================DEBUG=================================================
-
-// gettimeofday(&tv,NULL);
-// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
-// printf("\n\n");
-// printf("Working Table Name : Not EQU %s, Count : map %3d | db %3d \n",tablename ,noteqcount ,dbnoteqcount);
-// printf("*********************************************************************************\n");
-// printf("======================================MAP===================Char ID %10d===\n",char_id);
-// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<noteqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.notequip[j].flag,mapitem.notequip[j].nameid, mapitem.notequip[j].equip, mapitem.notequip[j].identify, mapitem.notequip[j].refine,mapitem.notequip[j].attribute, mapitem.notequip[j].card[0], mapitem.notequip[j].card[1], mapitem.notequip[j].card[2], mapitem.notequip[j].card[3]);
-// printf("======================================DB=========================================\n");
-// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
-// for(j=1;j<dbnoteqcount;j++)
-// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.notequip[j].flag ,dbitem.notequip[j].nameid, dbitem.notequip[j].equip, dbitem.notequip[j].identify, dbitem.notequip[j].refine,dbitem.notequip[j].attribute, dbitem.notequip[j].card[0], dbitem.notequip[j].card[1], dbitem.notequip[j].card[2], dbitem.notequip[j].card[3]);
-// printf("=================================================================================\n");
-// printf("=================================================Data Time %s===\n", tmpstr);
-// printf("=================================================================================\n");
-//
- }
- return 0;
-}
-//=====================================================================================================
-int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){
- int i, n;
-
- memset(p, 0, sizeof(struct mmo_charstatus));
-
- p->char_id = char_id;
- printf("Loaded: ");
- //`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);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
-
- 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]);
- p->base_exp = atoi(sql_row[7]);
- p->job_exp = atoi(sql_row[8]);
- 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]);
- p->skill_point = atoi(sql_row[21]);
- //free mysql result.
- mysql_free_result(sql_res);
- } else
- printf("char1 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
- printf("(\033[1;32m%d\033[0m)\033[1;32m%s\033[0m\t[",p->char_id,p->name);
- printf("char1 ");
-
- 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` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char2`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
-
-
- 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]);
- strcpy(p->last_point.map,sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
- strcpy(p->save_point.map,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]);
-
- //free mysql result.
- mysql_free_result(sql_res);
- } else
- printf("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
-
- printf("char2 ");
-
- //read memo data
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d'",memo_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `memo`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- strcpy (p->memo_point[i].map,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);
- }
- printf("memo ");
-
- //read inventory
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
- "FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- 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]);
- p->inventory[i].card[0] = atoi(sql_row[7]);
- p->inventory[i].card[1] = atoi(sql_row[8]);
- p->inventory[i].card[2] = atoi(sql_row[9]);
- p->inventory[i].card[3] = atoi(sql_row[10]);
- }
- mysql_free_result(sql_res);
- }
- printf("inventory ");
-
-
- //read cart.
- //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
- "FROM `%s` WHERE `char_id`='%d'",cart_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `cart_inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- 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]);
- p->cart[i].card[0] = atoi(sql_row[7]);
- p->cart[i].card[1] = atoi(sql_row[8]);
- p->cart[i].card[2] = atoi(sql_row[9]);
- p->cart[i].card[3] = atoi(sql_row[10]);
- }
- mysql_free_result(sql_res);
- }
- printf("cart ");
-
- //read skill
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `skill`)- %s\n", mysql_error(&mysql_handle));
- }
- 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);
- }
- printf("skill ");
-
- //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);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
- }
- 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]);
- p->global_reg[i].value = atoi (sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- p->global_reg_num=i;
-
- if (online) {
- sprintf(tmp_sql, "UPDATE `%s` SET `online`='%d' WHERE `char_id`='%d'",char_db,online,char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle));
- }
- }
-
- printf("global_reg]\n"); //ok. all data load successfuly!
-
- //printf("char cloade");
-
- return 1;
-}
-//==========================================================================================================
-int mmo_char_sql_init(void) {
- int i;
-
- printf("init start.......\n");
- // memory initialize
- // no need to set twice size in this routine. but some cause segmentation error. :P
- printf("initializing char memory...(%d byte)\n",sizeof(struct mmo_charstatus)*2);
- CREATE(char_dat, struct mmo_charstatus, 2);
-
- memset(char_dat, 0, sizeof(struct mmo_charstatus)*2);
-/* Initialized in inter.c already [Wizputer]
- // DB connection initialized
- // for char-server session only
- mysql_init(&mysql_handle);
- printf("Connect DB server....(char 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)) {
- // SQL connection pointer check
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- } else {
- printf("connect success! (char server)\n");
- }
-*/
- sprintf(tmp_sql , "SELECT count(*) FROM `%s`", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total char data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i !=0) {
- sprintf(tmp_sql , "SELECT max(`char_id`) FROM `%s`", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- char_id_count = atoi (sql_row[0]);
-
- mysql_free_result(sql_res);
- } else
- printf("set char_id_count: %d.......\n",char_id_count);
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (reset_online `%s`)- %s\n", char_db, mysql_error(&mysql_handle));
- }
- printf("init end.......\n");
-
- return 0;
-}
-
-//==========================================================================================================
-
-int make_new_char_sql(int fd, unsigned char *dat) {
- struct char_session_data *sd;
- char t_name[100];
- int i;
- //aphostropy error check! - fixed!
- jstrescapecpy(t_name, dat);
- printf("making new char -");
-
- sd = session[fd]->session_data;
-
- // 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 < strlen(dat); i++)
- if (strchr(char_name_letters, dat[i]) == NULL)
- return -1;
- } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
- for (i = 0; i < strlen(dat); i++)
- if (strchr(char_name_letters, dat[i]) != NULL)
- return -1;
- } // 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]!=5*6 ) ||
- (dat[30] >= 9) ||
- (dat[33] <= 0) || (dat[33] >= 20) ||
- (dat[31] >= 9)) {
-
- // check individual stat value
- for(i = 24; i <= 29; i++) {
- if (dat[i] < 1 || dat[i] > 9) {
- return -1;
- }
- }
-
- // 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], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("make new char error %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]);
- return -1;
- }
-
- // 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], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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]);
-
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `name` = '%s'",char_db, t_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- return -1;
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
- printf("\033[1;32m name check result : %s -\033[0m ",sql_row[0]);
- if (atoi(sql_row[0]) > 0) {
- mysql_free_result(sql_res);
- return -1;
- } else
- mysql_free_result(sql_res);
-
- // check char slot.
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = mysql_fetch_row(sql_res);
-
- //printf("slot check result : %s\n",sql_row[0]);
- if (atoi(sql_row[0]) > 0) {
- mysql_free_result(sql_res);
- return -1;
- } else
- mysql_free_result(sql_res);
-
- char_id_count++;
-
- // make new char.
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`account_id`,`char_num`,`name`,`zeny`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,`hair`,`hair_color`)"
- " VALUES ('%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d')",
- char_db, char_id_count, 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]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
- inventory_db, char_id_count, 1201,1,0x02,1); //add Knife
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
- inventory_db, char_id_count, 2301,1,0x10,1); //add Cotton Shirt
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
- }
- // respawn map and start point set
- sprintf(tmp_sql,"UPDATE `%s` SET `last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d' WHERE `char_id` = '%d'",
- char_db, start_point.map,start_point.x,start_point.y, start_point.map,start_point.x,start_point.y, char_id_count);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
- }
- printf("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", char_id_count, t_name);
- return char_id_count;
-}
-
-//==========================================================================================================
-
-void mmo_char_sync(void){
- printf("mmo_char_sync() - nothing to do\n");
-}
-
-// to do
-///////////////////////////
-
-int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
- printf("mmo_char_sync_timer() tic - no works to do\n");
- 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;
-// hehe. commented other. anyway there's no need to use older version.
-// if use older packet version just uncomment that!
-//#ifdef NEW_006b
- const int offset = 24;
-//#else
-// int offset = 4;
-//#endif
-
- printf("mmo_char_send006b start.. (account:%d)\n",sd->account_id);
-// printf("offset -> %d...\n",offset);
-
- //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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- found_num = mysql_num_rows(sql_res);
- printf("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);
- }
-
-// printf("char fetching end (total: %d)....\n", found_num);
-
- 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;
-
- printf("(\033[1;13m%d\033[0m) Request Char Data:\n",sd->account_id);
-
- for(i = 0; i < found_num; i++) {
- mmo_char_fromsql(sd->found_char[i], char_dat, 0);
-
- p = &char_dat[0];
-
- j = offset + (i * 106); // increase speed of code
-
- WFIFOL(fd,j) = p->char_id;
- WFIFOL(fd,j+4) = p->base_exp;
- WFIFOL(fd,j+8) = p->zeny;
- WFIFOL(fd,j+12) = 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;
- WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
- WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
- WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
- WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : 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->weapon;
- WFIFOW(fd,j+58) = p->base_level;
- WFIFOW(fd,j+60) = 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, 24);
-
- 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));
-// printf("mmo_char_send006b end..\n");
- return 0;
-}
-
-int parse_tologin(int fd) {
- int i;
- struct char_session_data *sd;
-
- // 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) {
- printf("Char-server can't connect to login-server (connection #%d).\n", fd);
- login_fd = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = session[fd]->session_data;
-
- // hehe. no need to set user limite on SQL version. :P
- // but char limitation is good way to maintain server. :D
- while(RFIFOREST(fd) >= 2) {
-// 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));
- printf("Can not connect to login-server.\n");
- printf("The server communication passwords (default s1/p1) is probably invalid.\n");
- printf("Also, please make sure your login db has the username/password present and the sex of the account is S.\n");
- printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
- return 0;
- //exit(1); //fixed for server shutdown.
- }else {
- printf("Connected to login-server (connection #%d).\n", fd);
- // 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][0]) // if map-server online and at least 1 map
- break;
- if (i == MAX_MAP_SERVERS)
- printf("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 = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
- 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);
- // 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 = session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- sd->connect_until_time = (time_t)RFIFOL(fd,46);
- break;
- }
- }
- }
- RFIFOSKIP(fd,50);
- break;
-
-/* case 0x2721: // gm reply. I don't want to support this function.
- 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];
-
- acc = RFIFOL(fd,2);
- sex = RFIFOB(fd,6);
- RFIFOSKIP(fd, 7);
- if (acc > 0) {
- sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- int char_id, jobclass, skill_point, class;
- sql_row = mysql_fetch_row(sql_res);
- char_id = atoi(sql_row[0]);
- jobclass = atoi(sql_row[1]);
- skill_point = atoi(sql_row[2]);
- class = jobclass;
- if (jobclass == 19 || jobclass == 20 ||
- jobclass == 4020 || jobclass == 4021 ||
- jobclass == 4042 || jobclass == 4043) {
- // job modification
- if (jobclass == 19 || jobclass == 20) {
- class = (sex) ? 19 : 20;
- } else if (jobclass == 4020 || jobclass == 4021) {
- class = (sex) ? 4020 : 4021;
- } else if (jobclass == 4042 || jobclass == 4043) {
- class = (sex) ? 4042 : 4043;
- }
- // 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)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while(( sql_row = mysql_fetch_row(sql_res))) {
- skill_point += atoi(sql_row[0]);
- }
- }
- 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)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- // 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)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- 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)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- // disconnect player if online on char-server
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = 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;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- unsigned char buf[4096];
- int j, p, acc;
- acc = RFIFOL(fd,4);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(reg[j].str, RFIFOP(fd,p), 32);
- reg[j].value = RFIFOL(fd,p+32);
- }
- // set_account_reg2(acc,j,reg);
- // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
- memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
- WBUFW(buf,0) = 0x2b11;
- mapif_sendall(buf, WBUFW(buf,2));
- RFIFOSKIP(fd, RFIFOW(fd,2));
-// printf("char: save_account_reg_reply\n");
- }
- 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 = session[i]->session_data)) {
- if (sd->account_id == RFIFOL(fd,2)) {
- session[i]->eof = 1;
- break;
- }
- }
- }
- RFIFOSKIP(fd,11);
- break;
-
- default:
- printf("set eof.\n");
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- RFIFOFLUSH(fd);
-
- return 0;
-}
-
-//--------------------------------
-// Map-server anti-freeze system
-//--------------------------------
-int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
- int i;
-
- for(i = 0; i < MAX_MAP_SERVERS; i++) {
- if (server_fd[i] >= 0) {// if map-server is online
- printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]);
- if (server_freezeflag[i]-- < 1) {// Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- printf("Map-server anti-freeze system: char-server #%d is frozen -> disconnection.\n", i);
- session[server_fd[i]]->eof = 1;
- sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[i]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- }
-
- return 0;
-}
-
-int parse_frommap(int fd) {
- int i = 0, j = 0;
- int id;
-
- // Sometimes fd=0, and it will cause server crash. Don't know why. :(
- if (fd <= 0) {
- printf("parse_frommap error fd=0\n");
- 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) {
- memset(&server[id], 0, sizeof(struct mmo_map_server));
- printf("Map-server %d (session #%d) has disconnected.\n", id, fd);
- sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- server_fd[id] = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
-// printf("parse_frommap : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
-
- switch(RFIFOW(fd, 0)) {
- case 0x2af7:
- RFIFOSKIP(fd,2);
- read_gm_account();
- break;
-
- // mapserver -> map names recv.
- 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 += 16) {
- memcpy(server[id].map[j], RFIFOP(fd,i), 16);
-// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
- j++;
- }
- i = server[id].ip;
- {
- unsigned char *p = (unsigned char *)&server[id].ip;
- printf("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);
- printf("Map-server %d loading complete.\n", id);
- }
- WFIFOW(fd,0) = 0x2afb;
- WFIFOB(fd,2) = 0;
- memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
- WFIFOSET(fd,27);
- {
- unsigned char buf[16384];
- int x;
- if (j == 0) {
- printf("WARNING: Map-Server %d have NO maps.\n", id);
- // Transmitting maps information to the other map-servers
- } else {
- WBUFW(buf,0) = 0x2b04;
- WBUFW(buf,2) = j * 16 + 10;
- WBUFL(buf,4) = server[id].ip;
- WBUFW(buf,8) = server[id].port;
- memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
- 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][0])
- memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
- if (j > 0) {
- WFIFOW(fd,2) = j * 16 + 10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- }
- }
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // auth request
- case 0x2afc:
- if (RFIFOREST(fd) < 22)
- return 0;
-// printf("(AUTH request) auth_fifo search %d %d %d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- for(i = 0; i < AUTH_FIFO_SIZE; i++) {
- if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
- auth_fifo[i].char_id == RFIFOL(fd,6) &&
- auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
-#if CMP_AUTHFIFO_LOGIN2 != 0
- // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
- (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
-#endif
- (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
- !auth_fifo[i].delflag) {
- auth_fifo[i].delflag = 1;
- WFIFOW(fd,0) = 0x2afd;
- WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
- WFIFOL(fd,4) = RFIFOL(fd,2);
- WFIFOL(fd,8) = auth_fifo[i].login_id2;
- WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
- mmo_char_fromsql(auth_fifo[i].char_id, char_dat, 1);
- char_dat[0].sex = auth_fifo[i].sex;
- memcpy(WFIFOP(fd,16), &char_dat[0], sizeof(struct mmo_charstatus));
- WFIFOSET(fd, WFIFOW(fd,2));
- //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
- break;
- }
- }
- if (i == AUTH_FIFO_SIZE) {
- WFIFOW(fd,0) = 0x2afe;
- WFIFOL(fd,2) = RFIFOL(fd,2);
- WFIFOSET(fd,6);
-// printf("(AUTH request) auth_fifo search error!\n");
- }
- RFIFOSKIP(fd,22);
- break;
-
- // set MAP user
- case 0x2aff:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- if (RFIFOW(fd,4) != server[id].users)
- printf("map user: %d\n", RFIFOW(fd,4));
- server[id].users = RFIFOW(fd,4);
- if(anti_freeze_enable)
- server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // char saving
- case 0x2b01:
- i = 0;
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- //check account
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",char_db, RFIFOL(fd,4),RFIFOL(fd,8));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row)
- i = atoi(sql_row[0]);
- }
- mysql_free_result(sql_res);
-
- if (i == 1) {
- memcpy(&char_dat[0], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
- mmo_char_tosql(RFIFOL(fd,8), char_dat);
- //save to DB
- }
- RFIFOSKIP(fd,RFIFOW(fd,2));
- break;
-
- // req char selection
- case 0x2b02:
- if (RFIFOREST(fd) < 18)
- return 0;
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
-
-// printf("(charselect) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
- 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) < 49)
- return 0;
-
- if (auth_fifo_pos >= AUTH_FIFO_SIZE)
- auth_fifo_pos = 0;
-
- WFIFOW(fd, 0) = 0x2b06;
- memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
-// printf("(map change) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
- auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
- 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].char_id = RFIFOL(fd,14);
- auth_fifo[auth_fifo_pos].delflag = 0;
- auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
- auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45);
-
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", char_db, RFIFOL(fd,2), RFIFOL(fd,14));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (( sql_row = mysql_fetch_row(sql_res))) {
- i = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- auth_fifo[auth_fifo_pos].char_pos = auth_fifo[auth_fifo_pos].char_id;
- auth_fifo_pos++;
-
- WFIFOL(fd,6) = 0;
- break;
- }
- if (i == 0)
- WFIFOW(fd,6) = 1;
-
- WFIFOSET(fd,44);
- RFIFOSKIP(fd,49);
- break;
-
- // char name check
- case 0x2b08:
- if (RFIFOREST(fd) < 6)
- return 0;
-
- sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- sql_row = mysql_fetch_row(sql_res);
-
- WFIFOW(fd,0) = 0x2b09;
- WFIFOL(fd,2) = RFIFOL(fd,2);
-
- if (sql_row)
- memcpy(WFIFOP(fd,6), sql_row[0], 24);
- else
- memcpy(WFIFOP(fd,6), unknown_char_name, 24);
- mysql_free_result(sql_res);
-
- 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));
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- break;
- */
-
- // account_reg•Û‘¶—v‹
- case 0x2b10:
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- struct global_reg reg[ACCOUNT_REG2_NUM];
- int j,p,acc;
- acc=RFIFOL(fd,4);
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
- memcpy(reg[j].str,RFIFOP(fd,p),32);
- reg[j].value=RFIFOL(fd,p+32);
- }
- // set_account_reg2(acc,j,reg);
- // loginƒT[ƒo[‚Ö‘—‚é
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2728;
- memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOSET(login_fd, WFIFOW(login_fd,2));
- }
- // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
- //memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2));
- //WBUFW(buf,0)=0x2b11;
- //mapif_sendall(buf,WBUFW(buf,2));
- RFIFOSKIP(fd,RFIFOW(fd,2));
-// printf("char: save_account_reg (from map)\n");
- }
- 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
- 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[24];
- int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
- memcpy(character_name, RFIFOP(fd,6), 24);
- character_name[sizeof(character_name) -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
- sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, character_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- 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], 24); // 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
- 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);
-// 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(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- 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);
-// 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(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- 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);
-// 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(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x272a;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // 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(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOW(login_fd, 0) = 0x2727;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // 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, 24);
- 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);
- }
- }
- }
- RFIFOSKIP(fd, 44);
- break;
-
- // Recieve rates [Wizputer]
- case 0x2b16:
- if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
- return 0;
- 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), RFIFOP(fd,10));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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));
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql))
- printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mysql_handle));
- 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
- printf("parse_frommap: unknown packet %x! \n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
- return 0;
-}
-
-int search_mapserver(char *map) {
- int i, j;
- char temp_map[16];
- int temp_map_len;
-
-// printf("Searching the map-server for map '%s'... ", map);
- strncpy(temp_map, map, sizeof(temp_map));
- temp_map[sizeof(temp_map)-1] = '\0';
- if (strchr(temp_map, '.') != NULL)
- temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
-
- temp_map_len = strlen(temp_map);
- for(i = 0; i < MAX_MAP_SERVERS; i++)
- if (server_fd[i] >= 0)
- for (j = 0; server[i].map[j][0]; j++)
- //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
- if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
-// printf("found -> server #%d.\n", i);
- return i;
- }
-
-// printf("not found.\n");
- return -1;
-}
-
-int char_mapif_init(int fd) {
- return inter_mapif_init(fd);
-}
-
-//-----------------------------------------------------
-// Test to know if an IP come from LAN or WAN. by [Yor]
-//-----------------------------------------------------
-int lan_ip_check(unsigned char *p){
- int i;
- int lancheck = 1;
- int subneti[4];
- unsigned int k0, k1, k2, k3;
-
- sscanf(lan_map_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subneti[0] = k0; subneti[1] = k1; subneti[2] = k2; subneti[3] = k3;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
-// printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-int parse_char(int fd) {
- int i, ch = 0;
- char email[40];
- struct char_session_data *sd;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
-
- if(login_fd < 0)
- session[fd]->eof = 1;
- if(session[fd]->eof) {
- if (fd == login_fd)
- login_fd = -1;
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- sd = session[fd]->session_data;
-
- while(RFIFOREST(fd) >= 2) {
-// if (RFIFOW(fd, 0) < 30000)
-// printf("parse_char : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
-
- switch(RFIFOW(fd, 0)) {
- case 0x20b: //20040622 encryption ragexe correspondence
- if (RFIFOREST(fd) < 19)
- return 0;
- RFIFOSKIP(fd,19);
- break;
-
- case 0x65: // request to connect
- printf("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;
- {
-/*removed from isGM setup
- if (isGM(RFIFOL(fd,2)))
- printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), isGM(RFIFOL(fd,2)));
- else
- printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
-*/
- if (sd == NULL) {
- CREATE(session[fd]->session_data, struct char_session_data, 1);
- sd = 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 (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
- 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
- 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
- WFIFOW(fd,0) = 0x6c;
- WFIFOW(fd,2) = 0;
- WFIFOSET(fd,3);
- }
- }
- }
- RFIFOSKIP(fd, 17);
- break;
-
- case 0x66: // char select
-// printf("0x66> request connect - account_id:%d/char_num:%d\n",sd->account_id,RFIFOB(fd, 2));
- if (RFIFOREST(fd) < 3)
- return 0;
-
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- sql_row = mysql_fetch_row(sql_res);
-
- if (sql_row)
- mmo_char_fromsql(atoi(sql_row[0]), char_dat, 0);
- else {
- mysql_free_result(sql_res);
- RFIFOSKIP(fd, 3);
- break;
- }
-
- 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), char_dat[0].name);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("(\033[1;64m%d\033[0m) char selected (\033[1;32m%d\033[0m) \033[1;32m%s\033[0m" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat[0].name);
-
- i = search_mapserver(char_dat[0].last_point.map);
-
- // if map is not found, we check major cities
- if (i < 0) {
- if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "prontera.gat", 16);
- char_dat[0].last_point.x = 273; // savepoint coordonates
- char_dat[0].last_point.y = 354;
- } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "geffen.gat", 16);
- char_dat[0].last_point.x = 120; // savepoint coordonates
- char_dat[0].last_point.y = 100;
- } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "morocc.gat", 16);
- char_dat[0].last_point.x = 160; // savepoint coordonates
- char_dat[0].last_point.y = 94;
- } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "alberta.gat", 16);
- char_dat[0].last_point.x = 116; // savepoint coordonates
- char_dat[0].last_point.y = 57;
- } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "payon.gat", 16);
- char_dat[0].last_point.x = 87; // savepoint coordonates
- char_dat[0].last_point.y = 117;
- } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
- memcpy(char_dat[0].last_point.map, "izlude.gat", 16);
- char_dat[0].last_point.x = 94; // savepoint coordonates
- char_dat[0].last_point.y = 103;
- } else {
- int j;
- // get first online server
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0][0]) {
- i = j;
- printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
- break;
- }
- // if no map-servers are connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- RFIFOSKIP(fd,3);
- break;
- }
- }
- }
- WFIFOW(fd, 0) =0x71;
- WFIFOL(fd, 2) =char_dat[0].char_id;
- memcpy(WFIFOP(fd, 6), char_dat[0].last_point.map, 16);
- //Lan check added by Kashy
- if (lan_ip_check(p))
- WFIFOL(fd, 22) = inet_addr(lan_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;
- }
-// printf("auth_fifo set (auth_fifo_pos:%d) - account_id:%d char_id:%d login_id1:%d\n", auth_fifo_pos, sd->account_id, char_dat[0].char_id, sd->login_id1);
- auth_fifo[auth_fifo_pos].account_id = sd->account_id;
- auth_fifo[auth_fifo_pos].char_id = char_dat[0].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].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;
- auth_fifo_pos++;
-// printf("0x66> end\n");
- RFIFOSKIP(fd, 3);
- break;
-
- case 0x67: // make new
-// printf("0x67>request make new char\n");
- if (RFIFOREST(fd) < 37)
- return 0;
- i = make_new_char_sql(fd, RFIFOP(fd, 2));
- if (i < 0) {
- WFIFOW(fd, 0) = 0x6e;
- WFIFOB(fd, 2) = 0x00;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 37);
- break;
- }
-
- WFIFOW(fd, 0) = 0x6d;
- memset(WFIFOP(fd, 2), 0x00, 106);
-
- mmo_char_fromsql(i, char_dat, 0);
- i = 0;
- WFIFOL(fd, 2) = char_dat[i].char_id;
- WFIFOL(fd,2+4) = char_dat[i].base_exp;
- WFIFOL(fd,2+8) = char_dat[i].zeny;
- WFIFOL(fd,2+12) = char_dat[i].job_exp;
- WFIFOL(fd,2+16) = char_dat[i].job_level;
-
- WFIFOL(fd,2+28) = char_dat[i].karma;
- WFIFOL(fd,2+32) = char_dat[i].manner;
-
- WFIFOW(fd,2+40) = 0x30;
- WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
- WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
- WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
- WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
- WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
- WFIFOW(fd,2+52) = char_dat[i].class;
- WFIFOW(fd,2+54) = char_dat[i].hair;
-
- WFIFOW(fd,2+58) = char_dat[i].base_level;
- WFIFOW(fd,2+60) = char_dat[i].skill_point;
-
- WFIFOW(fd,2+64) = char_dat[i].shield;
- WFIFOW(fd,2+66) = char_dat[i].head_top;
- WFIFOW(fd,2+68) = char_dat[i].head_mid;
- WFIFOW(fd,2+70) = char_dat[i].hair_color;
-
- memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
-
- WFIFOB(fd,2+98) = char_dat[i].str;
- WFIFOB(fd,2+99) = char_dat[i].agi;
- WFIFOB(fd,2+100) = char_dat[i].vit;
- WFIFOB(fd,2+101) = char_dat[i].int_;
- WFIFOB(fd,2+102) = char_dat[i].dex;
- WFIFOB(fd,2+103) = char_dat[i].luk;
- WFIFOB(fd,2+104) = char_dat[i].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[i].char_id;
- break;
- }
- }
-
- case 0x68: // delete
- if (RFIFOREST(fd) < 46)
- return 0;
- printf("\033[1;31m Request Char Del:\033[0m \033[1;32m%d\033[0m(\033[1;32m%d\033[0m)\n", sd->account_id, RFIFOL(fd, 2));
- memcpy(email, RFIFOP(fd,6), 40);
- sprintf(tmp_sql, "SELECT `email` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, sd->account_id);
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- printf("\033[1;31m DB server Error Delete Char data - %s \033[0m \n", mysql_error(&lmysql_handle));
- }
- sql_res = mysql_store_result(&lmysql_handle);
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res);
- if (strcmp(email,sql_row[0]) == 0) {
- mysql_free_result(sql_res);
- } else {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- mysql_free_result(sql_res);
- break;
- }
- } else {
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- RFIFOSKIP(fd, 46);
- mysql_free_result(sql_res);
- break;
- }
- sprintf(tmp_sql, "SELECT `name`,`partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
-
- if (sql_res && sql_row[0]) {
- //delete char from SQL
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",pet_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd, 2));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- //Divorce [Wizputer]
- if (sql_row[1] != 0) {
- char buf[64];
- sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,atoi(sql_row[1]));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,atoi(sql_row[1]));
- if(mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = atoi(sql_row[0]);
- WBUFL(buf,6) = atoi(sql_row[1]);
- mapif_sendall(buf,10);
- }
- // Also delete info from guildtables.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, RFIFOL(fd,2));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, sql_row[0]);
-
- if (mysql_query(&mysql_handle, tmp_sql) == 0) {
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res != NULL) {
- if (mysql_num_rows(sql_res) != 0) {
- sql_row = mysql_fetch_row(sql_res);
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, atoi(sql_row[0]), atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, atoi(sql_row[0]));
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- mysql_free_result(sql_res);
- }
- } else {
- if (mysql_errno(&mysql_handle) != 0) {
- printf("Database server error: %s\n", mysql_error(&mysql_handle));
- }
- }
- } else {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
-
- for(i = 0; i < 9; i++) {
- printf("char comp: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id);
- if (sd->found_char[i] == RFIFOL(fd, 2)) {
- for(ch = i; ch < 9-1; ch++)
- sd->found_char[ch] = sd->found_char[ch+1];
- sd->found_char[8] = -1;
- break;
- }
- }
- if (i == 9) { // reject
- WFIFOW(fd, 0) = 0x70;
- WFIFOB(fd, 2) = 0;
- WFIFOSET(fd, 3);
- } else { // deleted!
- WFIFOW(fd, 0) = 0x6f;
- WFIFOSET(fd, 2);
- }
- RFIFOSKIP(fd, 46);
- break;
-
- case 0x2af8: // login as map-server
- if (RFIFOREST(fd) < 60)
- return 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(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), 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;
- if(anti_freeze_enable)
- server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
- 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
-/* removed by CLOWNISIUS due to isGM
- 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
- 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 *)malloc(64);
- command = (char *)malloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- free(buf);
- free(type);
- free(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) {
- 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) {
- 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]) {
- 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();
- char buf[16];
-
- if (login_fd > 0 && session[login_fd]) {
- // send number of user to login server
- 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;
-}
-
-int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
- if (login_fd <= 0 || session[login_fd] == NULL) {
- printf("Attempt to connect to login-server...\n");
- login_fd = make_connection(login_ip, login_port);
- session[login_fd]->func_parse = parse_tologin;
- realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
- WFIFOW(login_fd,0) = 0x2710;
- memset(WFIFOP(login_fd,2), 0, 24);
- memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
- memset(WFIFOP(login_fd,26), 0, 24);
- memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
- WFIFOL(login_fd,50) = 0;
- WFIFOL(login_fd,54) = char_ip;
- WFIFOL(login_fd,58) = char_port;
- memset(WFIFOP(login_fd,60), 0, 20);
- memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
- WFIFOW(login_fd,80) = 0;
- WFIFOW(login_fd,82) = char_maintenance;
- WFIFOW(login_fd,84) = char_new;
- WFIFOSET(login_fd,86);
- }
- 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);
-}
-
-// Lan Support conf reading added by Kashy
-int char_lan_config_read(const char *lancfgName){
- char subnetmask[128];
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent * h = NULL;
-
- if ((fp = fopen(lancfgName, "r")) == NULL) {
- printf("file not found: %s\n", lancfgName);
- return 1;
- }
-
- printf("Start reading of Lan Support configuration file\n");
-
- while(fgets(line, sizeof(line)-1, fp)){
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
- continue;
-
- else if (strcmpi(w1, "lan_map_ip") == 0) {
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_map_ip, "%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 {
- strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
- lan_map_ip[sizeof(lan_map_ip)-1] = 0;
- }
- printf("set Lan_map_IP : %s\n", lan_map_ip);
- }
-
- else if (strcmpi(w1, "subnetmask") == 0) {
- unsigned int k0, k1, k2, k3;
- strcpy(subnetmask, w2);
- sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
- printf("set subnetmask : %s\n", w2);
- }
- }
- fclose(fp);
-
- printf("End reading of Lan Support configuration file\n");
- return 0;
-}
-
-void do_final(void) {
- printf("Doing final stage...\n");
- //mmo_char_sync();
- //inter_save();
- do_final_itemdb();
- //check SQL save progress.
- //wait until save char complete
- printf("waiting until char saving complete...\n");
- do {
- sleep (0);
- }while (save_flag != 0);
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
- }
-
- if (gm_account != NULL)
- free(gm_account);
-
- free(char_dat);
- delete_session(login_fd);
- delete_session(char_fd);
-
- mysql_close(&mysql_handle);
- mysql_close(&lmysql_handle);
-
- printf("ok! all done...\n");
-}
-
-void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf("reading configure: %s\n", cfgName);
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("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, "login_db") == 0) {
- strcpy(login_db, w2);
- }else if(strcmpi(w1,"char_db")==0){
- strcpy(char_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,"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]
- if (strcmpi(w2, "yes")) {
- db_use_sqldbs = 1;
- } else if (strcmpi(w2, "no")) {
- db_use_sqldbs = 0;
- }
- printf("Using SQL dbs: %s\n",w2);
- //custom columns for login database
- }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);
- printf("set lowest_gm_level : %s\n",w2);
- }
- }
- fclose(fp);
- printf("reading configure done.....\n");
-}
-
-int char_config_read(const char *cfgName) {
- struct hostent *h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("Configuration file not found: %s.\n", cfgName);
- exit(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;
-
- remove_control_chars(w1);
- remove_control_chars(w2);
- if (strcmpi(w1, "userid") == 0) {
- memcpy(userid, w2, 24);
- } else if (strcmpi(w1, "passwd") == 0) {
- memcpy(passwd, w2, 24);
- } else if (strcmpi(w1, "server_name") == 0) {
- memcpy(server_name, w2, 16);
- printf("%s server has been intialized\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) {
- login_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- 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(login_ip_str, "%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(login_ip_str,w2,16);
- } else if (strcmpi(w1, "login_port") == 0) {
- login_port=atoi(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname (w2);
- if(h != NULL) {
- printf("Character 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(char_ip_str, "%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(char_ip_str, w2, 16);
- } 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, "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, "check_ip_flag") == 0) {
- check_ip_flag = 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, "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
- memcpy(start_point.map, map, 16);
- 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,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } 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[24] = 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);
- // anti-freeze options [Valaris]
- } else if(strcmpi(w1,"anti_freeze_enable")==0){
- anti_freeze_enable = config_switch(w2);
- } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
- ANTI_FREEZE_INTERVAL = atoi(w2);
- if (ANTI_FREEZE_INTERVAL < 5)
- ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
- } else if (strcmpi(w1, "import") == 0) {
- char_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- fclose(fp);
-
-//Read ItemDB
- do_init_itemdb();
-
- return 0;
-}
-
-//-----------------------------------------------------
-//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;
-}
-
-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;
- }
-
- char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
- char_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME);
- sql_config_read(SQL_CONF_NAME);
-
- printf("charserver configuration reading done.....\n");
-
- inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ÃʱâÈ­
- printf("interserver configuration reading done.....\n");
-
- printf("start char server initializing.....\n");
- mmo_char_sql_init();
- printf("char server initializing done.....\n");
-
- printf("set parser -> parse_char().....\n");
- set_defaultparse(parse_char);
-
- printf("set terminate function -> do_final().....\n");
- set_termfunc(do_final);
-
- printf("open port %d.....\n",char_port);
- char_fd = make_listen_port(char_port);
-
- if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
- // 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)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (login_ip_set_ == 0)
- strcpy(login_ip_str, buf);
- if (char_ip_set_ == 0)
- strcpy(char_ip_str, buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("Firewall detected.. edit lan_support.conf and char_athena.conf");
- }
-
- login_ip = inet_addr(login_ip_str);
- char_ip = inet_addr(char_ip_str);
-
- // send ALIVE PING to login server.
- printf("add interval tic (check_connect_login_server)....\n");
- i = add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000);
-
- // send USER COUNT PING to login server.
- printf("add interval tic (send_users_tologin)....\n");
- i = add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000);
-
- //no need to set sync timer on SQL version.
- //printf("add interval tic (mmo_char_sync_timer)....\n");
- //i = add_timer_interval(gettick() + 10, mmo_char_sync_timer, 0, 0, autosave_interval);
-
- add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- if(anti_freeze_enable > 0) {
- add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
- i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies
- }
-
- read_gm_account();
-
- if ( console ) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- printf("char server init func end (now unlimited loop start!)....\n");
- printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
- return 0;
-}
-
-
+// $Id: char.c,v 1.16 2004/09/23 18:31:16 MouseJstr Exp $
+// original : char2.c 2003/03/14 11:58:35 Rev.1.5
+//
+// original code from athena
+// SQL conversion by Jioh L. Jung
+// TXT 1.105
+#include <sys/types.h>
+
+#ifdef LCCWIN32
+#include <winsock.h>
+#pragma lib <libmysql.lib>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+
+#include "../common/utils.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdarg.h>
+
+#include "char.h"
+#include "strlib.h"
+#include "itemdb.h"
+#include "inter.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+char char_db[256] = "char";
+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 login_db[256] = "login";
+
+char login_db_account_id[32] = "account_id";
+char login_db_level[32] = "level";
+
+int lowest_gm_level = 1;
+
+unsigned char *SQL_CONF_NAME = "conf/inter_athena.conf";
+
+struct mmo_map_server server[MAX_MAP_SERVERS];
+int server_fd[MAX_MAP_SERVERS];
+int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+
+int anti_freeze_enable = 0;
+int ANTI_FREEZE_INTERVAL = 6;
+
+int login_fd, char_fd;
+char userid[24];
+char passwd[24];
+char server_name[20];
+char wisp_server_name[24] = "Server";
+int login_ip_set_ = 0;
+char login_ip_str[128];
+int login_ip;
+int login_port = 6900;
+int char_ip_set_ = 0;
+char char_ip_str[128];
+int char_ip;
+int char_port = 6121;
+int char_maintenance;
+int char_new;
+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]
+
+int log_char = 1; // loggin char or not [devil]
+int log_inter = 1; // loggin inter or not [devil]
+
+char lan_map_ip[128]; // Lan map ip added by kashy
+int subnetmaski[4]; // Subnetmask added by kashy
+char unknown_char_name[1024] = "Unknown";
+char db_path[1024]="db";
+
+//Added for Mugendai's I'm Alive mod
+int imalive_on=0;
+int imalive_time=60;
+//Added by Mugendai for GUI
+int flush_on=1;
+int flush_time=100;
+
+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)
+
+int char_id_count = 150000;
+struct mmo_charstatus *char_dat;
+int char_num,char_max;
+int max_connect_user = 0;
+int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int start_zeny = 500;
+int start_weapon = 1201;
+int start_armor = 2301;
+
+// 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 = {"new_1-1.gat", 53, 111};
+
+struct gm_account *gm_account = NULL;
+int GM_num = 0;
+
+int console = 0;
+
+//-----------------------------------------------------
+// Function to suppress control characters in a string.
+//-----------------------------------------------------
+int remove_control_chars(unsigned char *str) {
+ int i;
+ int change = 0;
+
+ for(i = 0; i < strlen(str); i++) {
+ if (str[i] < 32) {
+ str[i] = '_';
+ change = 1;
+ }
+ }
+
+ return change;
+}
+
+//----------------------------------------------------------------------
+// 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 (gm_account != NULL)
+ free(gm_account);
+ GM_num = 0;
+
+ sprintf(tmp_lsql, "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_lsql)) {
+ printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle));
+ }
+ lsql_res = mysql_store_result(&lmysql_handle);
+ if (lsql_res) {
+ gm_account = calloc(sizeof(struct gm_account) * 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);
+}
+
+//=====================================================================================================
+int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
+ int i=0,party_exist,guild_exist;
+ int eqcount=1;
+ int noteqcount=1;
+ char temp_str[32];
+
+ struct itemtemp mapitem;
+ if (char_id!=p->char_id) return 0;
+
+ save_flag = p->char_id;
+ printf("(\033[1;32m%d\033[0m) %s \trequest save char data - ",char_id,char_dat[0].name);
+
+
+
+//for(testcount=1;testcount<50;testcount++){//---------------------------test count--------------------
+// printf("test count : %d\n", testcount);
+// eqcount=1;
+// noteqcount=1;
+// dbeqcount=1;
+// dbnoteqcount=1;
+//-----------------------------------------------------------------------------------------------------
+
+//=========================================map inventory data > memory ===============================
+ //map inventory data
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(p->inventory[i].nameid>0){
+ if(itemdb_isequip(p->inventory[i].nameid)==1){
+ mapitem.equip[eqcount].flag=0;
+ mapitem.equip[eqcount].id = p->inventory[i].id;
+ mapitem.equip[eqcount].nameid=p->inventory[i].nameid;
+ mapitem.equip[eqcount].amount = p->inventory[i].amount;
+ mapitem.equip[eqcount].equip = p->inventory[i].equip;
+ mapitem.equip[eqcount].identify = p->inventory[i].identify;
+ mapitem.equip[eqcount].refine = p->inventory[i].refine;
+ mapitem.equip[eqcount].attribute = p->inventory[i].attribute;
+ mapitem.equip[eqcount].card[0] = p->inventory[i].card[0];
+ mapitem.equip[eqcount].card[1] = p->inventory[i].card[1];
+ mapitem.equip[eqcount].card[2] = p->inventory[i].card[2];
+ mapitem.equip[eqcount].card[3] = p->inventory[i].card[3];
+ eqcount++;
+ }
+ else if(itemdb_isequip(p->inventory[i].nameid)==0){
+ mapitem.notequip[noteqcount].flag=0;
+ mapitem.notequip[noteqcount].id = p->inventory[i].id;
+ mapitem.notequip[noteqcount].nameid=p->inventory[i].nameid;
+ mapitem.notequip[noteqcount].amount = p->inventory[i].amount;
+ mapitem.notequip[noteqcount].equip = p->inventory[i].equip;
+ mapitem.notequip[noteqcount].identify = p->inventory[i].identify;
+ mapitem.notequip[noteqcount].refine = p->inventory[i].refine;
+ mapitem.notequip[noteqcount].attribute = p->inventory[i].attribute;
+ mapitem.notequip[noteqcount].card[0] = p->inventory[i].card[0];
+ mapitem.notequip[noteqcount].card[1] = p->inventory[i].card[1];
+ mapitem.notequip[noteqcount].card[2] = p->inventory[i].card[2];
+ mapitem.notequip[noteqcount].card[3] = p->inventory[i].card[3];
+ noteqcount++;
+ }
+ }
+ }
+ //printf("- Save item data to MySQL!\n");
+ memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_INVENTORY);
+
+//=========================================map cart data > memory ====================================
+ eqcount=1;
+ noteqcount=1;
+
+ //map cart data
+ for(i=0;i<MAX_CART;i++){
+ if(p->cart[i].nameid>0){
+ if(itemdb_isequip(p->cart[i].nameid)==1){
+ mapitem.equip[eqcount].flag=0;
+ mapitem.equip[eqcount].id = p->cart[i].id;
+ mapitem.equip[eqcount].nameid=p->cart[i].nameid;
+ mapitem.equip[eqcount].amount = p->cart[i].amount;
+ mapitem.equip[eqcount].equip = p->cart[i].equip;
+ mapitem.equip[eqcount].identify = p->cart[i].identify;
+ mapitem.equip[eqcount].refine = p->cart[i].refine;
+ mapitem.equip[eqcount].attribute = p->cart[i].attribute;
+ mapitem.equip[eqcount].card[0] = p->cart[i].card[0];
+ mapitem.equip[eqcount].card[1] = p->cart[i].card[1];
+ mapitem.equip[eqcount].card[2] = p->cart[i].card[2];
+ mapitem.equip[eqcount].card[3] = p->cart[i].card[3];
+ eqcount++;
+ }
+ else if(itemdb_isequip(p->cart[i].nameid)==0){
+ mapitem.notequip[noteqcount].flag=0;
+ mapitem.notequip[noteqcount].id = p->cart[i].id;
+ mapitem.notequip[noteqcount].nameid=p->cart[i].nameid;
+ mapitem.notequip[noteqcount].amount = p->cart[i].amount;
+ mapitem.notequip[noteqcount].equip = p->cart[i].equip;
+ mapitem.notequip[noteqcount].identify = p->cart[i].identify;
+ mapitem.notequip[noteqcount].refine = p->cart[i].refine;
+ mapitem.notequip[noteqcount].attribute = p->cart[i].attribute;
+ mapitem.notequip[noteqcount].card[0] = p->cart[i].card[0];
+ mapitem.notequip[noteqcount].card[1] = p->cart[i].card[1];
+ mapitem.notequip[noteqcount].card[2] = p->cart[i].card[2];
+ mapitem.notequip[noteqcount].card[3] = p->cart[i].card[3];
+ noteqcount++;
+ }
+ }
+ }
+
+ //printf("- Save cart data to MySQL!\n");
+ memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_CART);
+
+//=====================================================================================================
+
+//}//---------------------------test count------------------------------
+ //check party_exist
+ party_exist=0;
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id` = '%d'",party_db, p->party_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row) party_exist = atoi(sql_row[0]);
+ mysql_free_result(sql_res);
+
+ //check guild_exist
+ guild_exist=0;
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id` = '%d'",guild_db, p->guild_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row) guild_exist = atoi(sql_row[0]);
+ mysql_free_result(sql_res);
+
+ if (guild_exist==0) p->guild_id=0;
+ if (party_exist==0) p->party_id=0;
+
+ //sql query
+ //`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`)
+ //printf("- Save char data to MySQL!\n");
+ sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d', `base_level`='%d', `job_level`='%d',"
+ "`base_exp`='%d', `job_exp`='%d', `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' WHERE `account_id`='%d' AND `char_id` = '%d'",
+ char_db, p->class, 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->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, p->partner_id, p->account_id, p->char_id
+ );
+
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ //printf("- Save memo data to MySQL!\n");
+ //`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)) {
+ printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ //insert here.
+ for(i=0;i<10;i++){
+ if(p->memo_point[i].map[0]){
+ sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
+ memo_db, char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+
+ //printf("- Save skill data to MySQL!\n");
+ //`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)) {
+ printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle));
+ }
+ //printf("- Insert skill \n");
+ //insert here.
+ for(i=0;i<MAX_SKILL;i++){
+ if(p->skill[i].id){
+ if (p->skill[i].id && p->skill[i].flag!=1) {
+ sprintf(tmp_sql,"INSERT delayed INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')",
+ skill_db, char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+ }
+
+
+ //printf("- Save global_reg_value data to MySQL!\n");
+ //`global_reg_value` (`char_id`, `str`, `value`)
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, p->char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ //insert here.
+ for(i=0;i<p->global_reg_num;i++){
+ if (p->global_reg[i].str) {
+ if(p->global_reg[i].value !=0){
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
+ reg_db, char_id, jstrescapecpy(temp_str,(unsigned char*)p->global_reg[i].str), p->global_reg[i].value);
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+ }
+ printf("saving char is done.\n");
+ save_flag = 0;
+
+ return 0;
+}
+
+int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int char_id, int tableswitch){
+ //equ
+ int i, j;
+ int dbeqcount = 1;
+ int dbnoteqcount = 1;
+ struct itemtemp dbitem;
+ char tablename[16];
+ char selectoption[16];
+
+ switch (tableswitch){
+ case TABLE_INVENTORY:
+ sprintf(tablename,"%s",inventory_db);
+ sprintf(selectoption,"char_id");
+ break;
+ case TABLE_CART:
+ sprintf(tablename,"%s",cart_db);
+ sprintf(selectoption,"char_id");
+ break;
+ case TABLE_STORAGE:
+ sprintf(tablename,"%s",storage_db);
+ sprintf(selectoption,"account_id");
+ break;
+ case TABLE_GUILD_STORAGE:
+ sprintf(tablename,"%s",guild_storage_db);
+ sprintf(selectoption,"guild_id");
+ break;
+ }
+ //printf("Working Table : %s \n",tablename);
+
+ //=======================================mysql database data > memory===============================================
+
+ sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` "
+ "FROM `%s` WHERE `%s`='%d'",tablename ,selectoption ,char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `%s` to Memory)- %s\n",tablename ,mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ if (itemdb_isequip(atoi(sql_row[1]))==1){
+ dbitem.equip[dbeqcount].flag=0;
+ dbitem.equip[dbeqcount].id = atoi(sql_row[0]);
+ dbitem.equip[dbeqcount].nameid = atoi(sql_row[1]);
+ dbitem.equip[dbeqcount].amount = atoi(sql_row[2]);
+ dbitem.equip[dbeqcount].equip = atoi(sql_row[3]);
+ dbitem.equip[dbeqcount].identify = atoi(sql_row[4]);
+ dbitem.equip[dbeqcount].refine = atoi(sql_row[5]);
+ dbitem.equip[dbeqcount].attribute = atoi(sql_row[6]);
+ dbitem.equip[dbeqcount].card[0] = atoi(sql_row[7]);
+ dbitem.equip[dbeqcount].card[1] = atoi(sql_row[8]);
+ dbitem.equip[dbeqcount].card[2] = atoi(sql_row[9]);
+ dbitem.equip[dbeqcount].card[3] = atoi(sql_row[10]);
+ dbeqcount++;
+ }else {
+ dbitem.notequip[dbnoteqcount].flag=0;
+ dbitem.notequip[dbnoteqcount].id = atoi(sql_row[0]);
+ dbitem.notequip[dbnoteqcount].nameid = atoi(sql_row[1]);
+ dbitem.notequip[dbnoteqcount].amount = atoi(sql_row[2]);
+ dbitem.notequip[dbnoteqcount].equip = atoi(sql_row[3]);
+ dbitem.notequip[dbnoteqcount].identify = atoi(sql_row[4]);
+ dbitem.notequip[dbnoteqcount].refine = atoi(sql_row[5]);
+ dbitem.notequip[dbnoteqcount].attribute = atoi(sql_row[6]);
+ dbitem.notequip[dbnoteqcount].card[0] = atoi(sql_row[7]);
+ dbitem.notequip[dbnoteqcount].card[1] = atoi(sql_row[8]);
+ dbitem.notequip[dbnoteqcount].card[2] = atoi(sql_row[9]);
+ dbitem.notequip[dbnoteqcount].card[3] = atoi(sql_row[10]);
+ dbnoteqcount++;
+ }
+ }
+ mysql_free_result(sql_res);
+ }
+
+ //==============================================Memory data > SQL ===============================
+ //======================================Equip ITEM=======================================
+ if((eqcount==1) && (dbeqcount==1)){//printf("%s Equip Empty\n",tablename);
+ //item empty
+ } else {
+
+ for(i=1;i<eqcount;i++){
+ for(j=1;j<dbeqcount;j++){
+ if(mapitem.equip[i].flag==1) break;
+ if(!(dbitem.equip[j].flag==1)){
+ if(mapitem.equip[i].nameid==dbitem.equip[j].nameid){
+ if ((mapitem.equip[i].equip==dbitem.equip[j].equip) && (mapitem.equip[i].identify==dbitem.equip[j].identify) && (mapitem.equip[i].amount==dbitem.equip[j].amount) &&
+
+ (mapitem.equip[i].refine==dbitem.equip[j].refine) && (mapitem.equip[i].attribute==dbitem.equip[j].attribute) && (mapitem.equip[i].card[0]==dbitem.equip[j].card[0]) &&
+ (mapitem.equip[i].card[1]==dbitem.equip[j].card[1]) && (mapitem.equip[i].card[2]==dbitem.equip[j].card[2]) && (mapitem.equip[i].card[3]==dbitem.equip[j].card[3])) {
+ mapitem.equip[i].flag = 1;
+ dbitem.equip[j].flag = 1;
+ //printf("the same item : %d , equip : %d , i : %d , flag : %d\n", mapitem.equip[i].nameid,mapitem.equip[i].equip , i, mapitem.equip[i].flag); //DEBUG-STRING
+ } else {
+ sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',"
+ "`attribute`='%d', `card0`='%d', `card1`='%d', `card2`='%d', `card3`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
+ tablename, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine,mapitem.equip[i].attribute, mapitem.equip[i].card[0],
+ mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3], mapitem.equip[i].amount, dbitem.equip[j].id);
+ //printf("%s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (UPdate `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
+ mapitem.equip[i].flag=1;
+ dbitem.equip[j].flag=1;
+ //printf("not the same item : %d ; i : %d ; flag : %d\n", mapitem.equip[i].nameid, i, mapitem.equip[i].flag);
+ }
+ }
+ }
+ }
+ }
+
+ //printf("dbeqcount = %d\n",dbeqcount);
+
+ for(i=1;i<dbeqcount;i++){
+ //printf("dbitem.equip[i].flag = %d , dbitem.equip[i].id = %d\n",dbitem.equip[i].flag,dbitem.equip[i].id);
+ if (!(dbitem.equip[i].flag == 1)) {
+ sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'",tablename , dbitem.equip[i].id);
+ //printf("%s", tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (DELETE `equ %s`)- %s\n", tablename ,mysql_error(&mysql_handle));
+ }
+ }
+ for(i=1;i<eqcount;i++){
+ if(!(mapitem.equip[i].flag==1)){
+ sprintf(tmp_sql,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)"
+ " VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ tablename, selectoption, char_id, mapitem.equip[i].nameid, mapitem.equip[i].amount, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine,
+ mapitem.equip[i].attribute, mapitem.equip[i].card[0], mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3]);
+ //printf("%s", tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (INSERT `equ %s`)- %s\n",tablename ,mysql_error(&mysql_handle));
+ }
+ }
+
+ //======================================DEBUG=================================================
+
+// gettimeofday(&tv,NULL);
+// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
+// printf("\n\n");
+// printf("Working Table Name : EQU %s, Count : map %3d | db %3d \n",tablename ,eqcount ,dbeqcount);
+// printf("*********************************************************************************\n");
+// printf("======================================MAP===================Char ID %10d===\n",char_id);
+// printf("==flag ===name ===equip===ident===amoun===attri===card0===card1===card2===card3==\n");
+// for(j=1;j<eqcount;j++)
+// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.equip[j].flag,mapitem.equip[j].nameid, mapitem.equip[j].equip, mapitem.equip[j].identify, mapitem.equip[j].refine,mapitem.equip[j].attribute, mapitem.equip[j].card[0], mapitem.equip[j].card[1], mapitem.equip[j].card[2], mapitem.equip[j].card[3]);
+// printf("======================================DB=========================================\n");
+// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
+// for(j=1;j<dbeqcount;j++)
+// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.equip[j].flag ,dbitem.equip[j].nameid, dbitem.equip[j].equip, dbitem.equip[j].identify, dbitem.equip[j].amount,dbitem.equip[j].attribute, dbitem.equip[j].card[0], dbitem.equip[j].card[1], dbitem.equip[j].card[2], dbitem.equip[j].card[3]);
+// printf("=================================================================================\n");
+// printf("=================================================Data Time %s===\n", tmpstr);
+// printf("=================================================================================\n");
+
+ }
+
+ //======================================DEBUG==================================================
+
+ //=============================Not Equip ITEM==========================================
+ if((noteqcount==1) && (dbnoteqcount==1)){
+ //printf("%s Not Equip Empty\n",tablename);
+ //item empty
+ } else {
+
+ for(i=1;i<noteqcount;i++){
+ for(j=1;j<dbnoteqcount;j++){
+ if(mapitem.notequip[i].flag==1) break;
+ if(!(dbitem.notequip[j].flag==1)){
+ if(mapitem.notequip[i].nameid==dbitem.notequip[j].nameid){
+ if ((mapitem.notequip[i].amount==dbitem.notequip[j].amount) && (mapitem.notequip[i].equip==dbitem.notequip[j].equip) && (mapitem.notequip[i].identify==dbitem.notequip[j].identify)
+ && (mapitem.notequip[i].attribute==dbitem.notequip[j].attribute))
+ { mapitem.notequip[i].flag=1;
+ dbitem.notequip[j].flag=1;
+ //printf("the same item : %d ; i : %d ; flag : %d\n", mapitem.notequip[i].nameid, i, mapitem.notequip[i].flag); //DEBUG-STRING
+ }
+ else{
+ sprintf(tmp_sql,"UPDATE `%s` SET `amount`='%d', `equip`='%d', `identify`='%d',"
+ "`attribute`='%d' WHERE `%s`='%d' AND `nameid`='%d'",
+ tablename, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].attribute,
+ selectoption, char_id, mapitem.notequip[i].nameid);
+ //printf("%s",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (UPdate `notequ %s`)- %s\n",tablename ,mysql_error(&mysql_handle));
+
+ mapitem.notequip[i].flag=1;
+ dbitem.notequip[j].flag=1;
+ }
+ }
+ }
+ }
+ }
+
+ //printf("dbnoteqcount = %d\n",dbnoteqcount);
+
+ for(i=1;i<dbnoteqcount;i++){
+ //printf("dbitem.notequip[i].flag = %d , dbitem.notequip[i].id = %d\n",dbitem.notequip[i].flag,dbitem.notequip[i].id);
+ if(!(dbitem.notequip[i].flag==1)){
+ sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, dbitem.notequip[i].id);
+ //printf("%s", tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (DELETE `notequ %s`)- %s\n", tablename ,mysql_error(&mysql_handle));
+ }
+ }
+ for(i=1;i<noteqcount;i++){
+ if(!(mapitem.notequip[i].flag==1)){
+ sprintf(tmp_sql,"INSERT INTO `%s`( `%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)"
+ " VALUES ('%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ tablename ,selectoption , char_id, mapitem.notequip[i].nameid, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].refine,
+ mapitem.notequip[i].attribute, mapitem.notequip[i].card[0], mapitem.notequip[i].card[1], mapitem.notequip[i].card[2], mapitem.notequip[i].card[3]);
+ //printf("%s", tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (INSERT `notequ %s`)- %s\n", tablename, mysql_error(&mysql_handle));
+ }
+ }
+
+ //======================================DEBUG=================================================
+
+// gettimeofday(&tv,NULL);
+// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
+// printf("\n\n");
+// printf("Working Table Name : Not EQU %s, Count : map %3d | db %3d \n",tablename ,noteqcount ,dbnoteqcount);
+// printf("*********************************************************************************\n");
+// printf("======================================MAP===================Char ID %10d===\n",char_id);
+// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
+// for(j=1;j<noteqcount;j++)
+// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.notequip[j].flag,mapitem.notequip[j].nameid, mapitem.notequip[j].equip, mapitem.notequip[j].identify, mapitem.notequip[j].refine,mapitem.notequip[j].attribute, mapitem.notequip[j].card[0], mapitem.notequip[j].card[1], mapitem.notequip[j].card[2], mapitem.notequip[j].card[3]);
+// printf("======================================DB=========================================\n");
+// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n");
+// for(j=1;j<dbnoteqcount;j++)
+// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.notequip[j].flag ,dbitem.notequip[j].nameid, dbitem.notequip[j].equip, dbitem.notequip[j].identify, dbitem.notequip[j].refine,dbitem.notequip[j].attribute, dbitem.notequip[j].card[0], dbitem.notequip[j].card[1], dbitem.notequip[j].card[2], dbitem.notequip[j].card[3]);
+// printf("=================================================================================\n");
+// printf("=================================================Data Time %s===\n", tmpstr);
+// printf("=================================================================================\n");
+//
+ }
+ return 0;
+}
+//=====================================================================================================
+int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){
+ int i, n;
+
+ memset(p, 0, sizeof(struct mmo_charstatus));
+
+ p->char_id = char_id;
+ printf("Loaded: ");
+ //`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);
+
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+
+ 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]);
+ p->base_exp = atoi(sql_row[7]);
+ p->job_exp = atoi(sql_row[8]);
+ 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]);
+ p->skill_point = atoi(sql_row[21]);
+ //free mysql result.
+ mysql_free_result(sql_res);
+ } else
+ printf("char1 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
+ printf("(\033[1;32m%d\033[0m)\033[1;32m%s\033[0m\t[",p->char_id,p->name);
+ printf("char1 ");
+
+ 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` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `char2`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+
+
+ 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]);
+ strcpy(p->last_point.map,sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]);
+ strcpy(p->save_point.map,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]);
+
+ //free mysql result.
+ mysql_free_result(sql_res);
+ } else
+ printf("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!?
+
+ printf("char2 ");
+
+ //read memo data
+ //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
+ sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d'",memo_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `memo`)- %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ strcpy (p->memo_point[i].map,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);
+ }
+ printf("memo ");
+
+ //read inventory
+ //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
+ "FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `inventory`)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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]);
+ p->inventory[i].card[0] = atoi(sql_row[7]);
+ p->inventory[i].card[1] = atoi(sql_row[8]);
+ p->inventory[i].card[2] = atoi(sql_row[9]);
+ p->inventory[i].card[3] = atoi(sql_row[10]);
+ }
+ mysql_free_result(sql_res);
+ }
+ printf("inventory ");
+
+
+ //read cart.
+ //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`"
+ "FROM `%s` WHERE `char_id`='%d'",cart_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `cart_inventory`)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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]);
+ p->cart[i].card[0] = atoi(sql_row[7]);
+ p->cart[i].card[1] = atoi(sql_row[8]);
+ p->cart[i].card[2] = atoi(sql_row[9]);
+ p->cart[i].card[3] = atoi(sql_row[10]);
+ }
+ mysql_free_result(sql_res);
+ }
+ printf("cart ");
+
+ //read skill
+ //`skill` (`char_id`, `id`, `lv`)
+ sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `skill`)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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);
+ }
+ printf("skill ");
+
+ //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);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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]);
+ p->global_reg[i].value = atoi (sql_row[1]);
+ }
+ mysql_free_result(sql_res);
+ }
+ p->global_reg_num=i;
+
+ if (online) {
+ sprintf(tmp_sql, "UPDATE `%s` SET `online`='%d' WHERE `char_id`='%d'",char_db,online,char_id);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+
+ printf("global_reg]\n"); //ok. all data load successfuly!
+
+ //printf("char cloade");
+
+ return 1;
+}
+//==========================================================================================================
+int mmo_char_sql_init(void) {
+ int i;
+
+ printf("init start.......\n");
+ // memory initialize
+ // no need to set twice size in this routine. but some cause segmentation error. :P
+ printf("initializing char memory...(%d byte)\n",sizeof(struct mmo_charstatus)*2);
+ CREATE(char_dat, struct mmo_charstatus, 2);
+
+ memset(char_dat, 0, sizeof(struct mmo_charstatus)*2);
+/* Initialized in inter.c already [Wizputer]
+ // DB connection initialized
+ // for char-server session only
+ mysql_init(&mysql_handle);
+ printf("Connect DB server....(char 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)) {
+ // SQL connection pointer check
+ printf("%s\n",mysql_error(&mysql_handle));
+ exit(1);
+ } else {
+ printf("connect success! (char server)\n");
+ }
+*/
+ sprintf(tmp_sql , "SELECT count(*) FROM `%s`", char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ printf("total char data -> '%s'.......\n",sql_row[0]);
+ i = atoi (sql_row[0]);
+ mysql_free_result(sql_res);
+
+ if (i !=0) {
+ sprintf(tmp_sql , "SELECT max(`char_id`) FROM `%s`", char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ char_id_count = atoi (sql_row[0]);
+
+ mysql_free_result(sql_res);
+ } else
+ printf("set char_id_count: %d.......\n",char_id_count);
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (reset_online `%s`)- %s\n", char_db, mysql_error(&mysql_handle));
+ }
+ printf("init end.......\n");
+
+ return 0;
+}
+
+//==========================================================================================================
+
+int make_new_char_sql(int fd, unsigned char *dat) {
+ struct char_session_data *sd;
+ char t_name[100];
+ int i;
+ //aphostropy error check! - fixed!
+ jstrescapecpy(t_name, dat);
+ printf("making new char -");
+
+ sd = session[fd]->session_data;
+
+ // 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 < strlen(dat); i++)
+ if (strchr(char_name_letters, dat[i]) == NULL)
+ return -1;
+ } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden
+ for (i = 0; i < strlen(dat); i++)
+ if (strchr(char_name_letters, dat[i]) != NULL)
+ return -1;
+ } // 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]!=5*6 ) ||
+ (dat[30] >= 9) ||
+ (dat[33] <= 0) || (dat[33] >= 20) ||
+ (dat[31] >= 9)) {
+
+ // check individual stat value
+ for(i = 24; i <= 29; i++) {
+ if (dat[i] < 1 || dat[i] > 9) {
+ return -1;
+ }
+ }
+
+ // 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], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ printf("make new char error %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]);
+ return -1;
+ }
+
+ // 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], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
+ //query
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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]);
+
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `name` = '%s'",char_db, t_name);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ return -1;
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = mysql_fetch_row(sql_res);
+ printf("\033[1;32m name check result : %s -\033[0m ",sql_row[0]);
+ if (atoi(sql_row[0]) > 0) {
+ mysql_free_result(sql_res);
+ return -1;
+ } else
+ mysql_free_result(sql_res);
+
+ // check char slot.
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ sql_row = mysql_fetch_row(sql_res);
+
+ //printf("slot check result : %s\n",sql_row[0]);
+ if (atoi(sql_row[0]) > 0) {
+ mysql_free_result(sql_res);
+ return -1;
+ } else
+ mysql_free_result(sql_res);
+
+ char_id_count++;
+
+ // make new char.
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`account_id`,`char_num`,`name`,`zeny`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,`hair`,`hair_color`)"
+ " VALUES ('%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d')",
+ char_db, char_id_count, 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]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
+ inventory_db, char_id_count, 1201,1,0x02,1); //add Knife
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')",
+ inventory_db, char_id_count, 2301,1,0x10,1); //add Cotton Shirt
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle));
+ }
+ // respawn map and start point set
+ sprintf(tmp_sql,"UPDATE `%s` SET `last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d' WHERE `char_id` = '%d'",
+ char_db, start_point.map,start_point.x,start_point.y, start_point.map,start_point.x,start_point.y, char_id_count);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ printf("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", char_id_count, t_name);
+ return char_id_count;
+}
+
+//==========================================================================================================
+
+void mmo_char_sync(void){
+ printf("mmo_char_sync() - nothing to do\n");
+}
+
+// to do
+///////////////////////////
+
+int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) {
+ printf("mmo_char_sync_timer() tic - no works to do\n");
+ 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;
+// hehe. commented other. anyway there's no need to use older version.
+// if use older packet version just uncomment that!
+//#ifdef NEW_006b
+ const int offset = 24;
+//#else
+// int offset = 4;
+//#endif
+
+ printf("mmo_char_send006b start.. (account:%d)\n",sd->account_id);
+// printf("offset -> %d...\n",offset);
+
+ //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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ found_num = mysql_num_rows(sql_res);
+ printf("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);
+ }
+
+// printf("char fetching end (total: %d)....\n", found_num);
+
+ 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;
+
+ printf("(\033[1;13m%d\033[0m) Request Char Data:\n",sd->account_id);
+
+ for(i = 0; i < found_num; i++) {
+ mmo_char_fromsql(sd->found_char[i], char_dat, 0);
+
+ p = &char_dat[0];
+
+ j = offset + (i * 106); // increase speed of code
+
+ WFIFOL(fd,j) = p->char_id;
+ WFIFOL(fd,j+4) = p->base_exp;
+ WFIFOL(fd,j+8) = p->zeny;
+ WFIFOL(fd,j+12) = 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;
+ WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp;
+ WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp;
+ WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp;
+ WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : 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->weapon;
+ WFIFOW(fd,j+58) = p->base_level;
+ WFIFOW(fd,j+60) = 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, 24);
+
+ 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));
+// printf("mmo_char_send006b end..\n");
+ return 0;
+}
+
+int parse_tologin(int fd) {
+ int i;
+ struct char_session_data *sd;
+
+ // 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) {
+ printf("Char-server can't connect to login-server (connection #%d).\n", fd);
+ login_fd = -1;
+ }
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ sd = session[fd]->session_data;
+
+ // hehe. no need to set user limite on SQL version. :P
+ // but char limitation is good way to maintain server. :D
+ while(RFIFOREST(fd) >= 2) {
+// 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));
+ printf("Can not connect to login-server.\n");
+ printf("The server communication passwords (default s1/p1) is probably invalid.\n");
+ printf("Also, please make sure your login db has the username/password present and the sex of the account is S.\n");
+ printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n");
+ return 0;
+ //exit(1); //fixed for server shutdown.
+ }else {
+ printf("Connected to login-server (connection #%d).\n", fd);
+ // 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][0]) // if map-server online and at least 1 map
+ break;
+ if (i == MAX_MAP_SERVERS)
+ printf("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 = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) {
+ 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);
+ // 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 = session[i]->session_data)) {
+ if (sd->account_id == RFIFOL(fd,2)) {
+ sd->connect_until_time = (time_t)RFIFOL(fd,46);
+ break;
+ }
+ }
+ }
+ RFIFOSKIP(fd,50);
+ break;
+
+/* case 0x2721: // gm reply. I don't want to support this function.
+ 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];
+
+ acc = RFIFOL(fd,2);
+ sex = RFIFOB(fd,6);
+ RFIFOSKIP(fd, 7);
+ if (acc > 0) {
+ sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ int char_id, jobclass, skill_point, class;
+ sql_row = mysql_fetch_row(sql_res);
+ char_id = atoi(sql_row[0]);
+ jobclass = atoi(sql_row[1]);
+ skill_point = atoi(sql_row[2]);
+ class = jobclass;
+ if (jobclass == 19 || jobclass == 20 ||
+ jobclass == 4020 || jobclass == 4021 ||
+ jobclass == 4042 || jobclass == 4043) {
+ // job modification
+ if (jobclass == 19 || jobclass == 20) {
+ class = (sex) ? 19 : 20;
+ } else if (jobclass == 4020 || jobclass == 4021) {
+ class = (sex) ? 4020 : 4021;
+ } else if (jobclass == 4042 || jobclass == 4043) {
+ class = (sex) ? 4042 : 4043;
+ }
+ // 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)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ while(( sql_row = mysql_fetch_row(sql_res))) {
+ skill_point += atoi(sql_row[0]);
+ }
+ }
+ 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)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ // 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)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+ // disconnect player if online on char-server
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = 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;
+ {
+ struct global_reg reg[ACCOUNT_REG2_NUM];
+ unsigned char buf[4096];
+ int j, p, acc;
+ acc = RFIFOL(fd,4);
+ for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
+ memcpy(reg[j].str, RFIFOP(fd,p), 32);
+ reg[j].value = RFIFOL(fd,p+32);
+ }
+ // set_account_reg2(acc,j,reg);
+ // “¯CƒƒOƒCƒ“‚ð‹ÖŽ~‚µ‚Ä‚¢‚ê‚Α—‚é•K—v‚Í–³‚¢
+ memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2));
+ WBUFW(buf,0) = 0x2b11;
+ mapif_sendall(buf, WBUFW(buf,2));
+ RFIFOSKIP(fd, RFIFOW(fd,2));
+// printf("char: save_account_reg_reply\n");
+ }
+ 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 = session[i]->session_data)) {
+ if (sd->account_id == RFIFOL(fd,2)) {
+ session[i]->eof = 1;
+ break;
+ }
+ }
+ }
+ RFIFOSKIP(fd,11);
+ break;
+
+ default:
+ printf("set eof.\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ RFIFOFLUSH(fd);
+
+ return 0;
+}
+
+//--------------------------------
+// Map-server anti-freeze system
+//--------------------------------
+int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
+ int i;
+
+ for(i = 0; i < MAX_MAP_SERVERS; i++) {
+ if (server_fd[i] >= 0) {// if map-server is online
+ printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]);
+ if (server_freezeflag[i]-- < 1) {// Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ printf("Map-server anti-freeze system: char-server #%d is frozen -> disconnection.\n", i);
+ session[server_fd[i]]->eof = 1;
+ sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[i]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int parse_frommap(int fd) {
+ int i = 0, j = 0;
+ int id;
+
+ // Sometimes fd=0, and it will cause server crash. Don't know why. :(
+ if (fd <= 0) {
+ printf("parse_frommap error fd=0\n");
+ 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) {
+ memset(&server[id], 0, sizeof(struct mmo_map_server));
+ printf("Map-server %d (session #%d) has disconnected.\n", id, fd);
+ sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ server_fd[id] = -1;
+ }
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+// printf("parse_frommap : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd,0));
+
+ switch(RFIFOW(fd, 0)) {
+ case 0x2af7:
+ RFIFOSKIP(fd,2);
+ read_gm_account();
+ break;
+
+ // mapserver -> map names recv.
+ 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 += 16) {
+ memcpy(server[id].map[j], RFIFOP(fd,i), 16);
+// printf("set map %d.%d : %s\n", id, j, server[id].map[j]);
+ j++;
+ }
+ i = server[id].ip;
+ {
+ unsigned char *p = (unsigned char *)&server[id].ip;
+ printf("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);
+ printf("Map-server %d loading complete.\n", id);
+ }
+ WFIFOW(fd,0) = 0x2afb;
+ WFIFOB(fd,2) = 0;
+ memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player
+ WFIFOSET(fd,27);
+ {
+ unsigned char buf[16384];
+ int x;
+ if (j == 0) {
+ printf("WARNING: Map-Server %d have NO maps.\n", id);
+ // Transmitting maps information to the other map-servers
+ } else {
+ WBUFW(buf,0) = 0x2b04;
+ WBUFW(buf,2) = j * 16 + 10;
+ WBUFL(buf,4) = server[id].ip;
+ WBUFW(buf,8) = server[id].port;
+ memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16);
+ 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][0])
+ memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16);
+ if (j > 0) {
+ WFIFOW(fd,2) = j * 16 + 10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ }
+ }
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // auth request
+ case 0x2afc:
+ if (RFIFOREST(fd) < 22)
+ return 0;
+// printf("(AUTH request) auth_fifo search %d %d %d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
+ for(i = 0; i < AUTH_FIFO_SIZE; i++) {
+ if (auth_fifo[i].account_id == RFIFOL(fd,2) &&
+ auth_fifo[i].char_id == RFIFOL(fd,6) &&
+ auth_fifo[i].login_id1 == RFIFOL(fd,10) &&
+#if CMP_AUTHFIFO_LOGIN2 != 0
+ // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value)
+ (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18
+#endif
+ (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) &&
+ !auth_fifo[i].delflag) {
+ auth_fifo[i].delflag = 1;
+ WFIFOW(fd,0) = 0x2afd;
+ WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus);
+ WFIFOL(fd,4) = RFIFOL(fd,2);
+ WFIFOL(fd,8) = auth_fifo[i].login_id2;
+ WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time;
+ mmo_char_fromsql(auth_fifo[i].char_id, char_dat, 1);
+ char_dat[0].sex = auth_fifo[i].sex;
+ memcpy(WFIFOP(fd,16), &char_dat[0], sizeof(struct mmo_charstatus));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6));
+ break;
+ }
+ }
+ if (i == AUTH_FIFO_SIZE) {
+ WFIFOW(fd,0) = 0x2afe;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+ WFIFOSET(fd,6);
+// printf("(AUTH request) auth_fifo search error!\n");
+ }
+ RFIFOSKIP(fd,22);
+ break;
+
+ // set MAP user
+ case 0x2aff:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ if (RFIFOW(fd,4) != server[id].users)
+ printf("map user: %d\n", RFIFOW(fd,4));
+ server[id].users = RFIFOW(fd,4);
+ if(anti_freeze_enable)
+ server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // char saving
+ case 0x2b01:
+ i = 0;
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ //check account
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",char_db, RFIFOL(fd,4),RFIFOL(fd,8));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ if (sql_row)
+ i = atoi(sql_row[0]);
+ }
+ mysql_free_result(sql_res);
+
+ if (i == 1) {
+ memcpy(&char_dat[0], RFIFOP(fd,12), sizeof(struct mmo_charstatus));
+ mmo_char_tosql(RFIFOL(fd,8), char_dat);
+ //save to DB
+ }
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+ break;
+
+ // req char selection
+ case 0x2b02:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+
+// printf("(charselect) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
+ 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) < 49)
+ return 0;
+
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+
+ WFIFOW(fd, 0) = 0x2b06;
+ memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42);
+// printf("(map change) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6));
+ auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2);
+ 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].char_id = RFIFOL(fd,14);
+ auth_fifo[auth_fifo_pos].delflag = 0;
+ auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44);
+ auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45);
+
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", char_db, RFIFOL(fd,2), RFIFOL(fd,14));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (( sql_row = mysql_fetch_row(sql_res))) {
+ i = atoi(sql_row[0]);
+ mysql_free_result(sql_res);
+
+ auth_fifo[auth_fifo_pos].char_pos = auth_fifo[auth_fifo_pos].char_id;
+ auth_fifo_pos++;
+
+ WFIFOL(fd,6) = 0;
+ break;
+ }
+ if (i == 0)
+ WFIFOW(fd,6) = 1;
+
+ WFIFOSET(fd,44);
+ RFIFOSKIP(fd,49);
+ break;
+
+ // char name check
+ case 0x2b08:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+
+ sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, RFIFOL(fd,2));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ sql_row = mysql_fetch_row(sql_res);
+
+ WFIFOW(fd,0) = 0x2b09;
+ WFIFOL(fd,2) = RFIFOL(fd,2);
+
+ if (sql_row)
+ memcpy(WFIFOP(fd,6), sql_row[0], 24);
+ else
+ memcpy(WFIFOP(fd,6), unknown_char_name, 24);
+ mysql_free_result(sql_res);
+
+ 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));
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ break;
+ */
+
+ // account_reg•Û‘¶—v‹
+ case 0x2b10:
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ struct global_reg reg[ACCOUNT_REG2_NUM];
+ int j,p,acc;
+ acc=RFIFOL(fd,4);
+ for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
+ memcpy(reg[j].str,RFIFOP(fd,p),32);
+ reg[j].value=RFIFOL(fd,p+32);
+ }
+ // set_account_reg2(acc,j,reg);
+ // loginƒT[ƒo[‚Ö‘—‚é
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x2728;
+ memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WFIFOSET(login_fd, WFIFOW(login_fd,2));
+ }
+ // ƒ[ƒ‹ƒh‚Ö‚Ì“¯CƒƒOƒCƒ“‚ª‚È‚¯‚ê‚ÎmapƒT[ƒo[‚É‘—‚é•K—v‚Í‚È‚¢
+ //memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2));
+ //WBUFW(buf,0)=0x2b11;
+ //mapif_sendall(buf,WBUFW(buf,2));
+ RFIFOSKIP(fd,RFIFOW(fd,2));
+// printf("char: save_account_reg (from map)\n");
+ }
+ 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
+ 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[24];
+ int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
+ memcpy(character_name, RFIFOP(fd,6), 24);
+ character_name[sizeof(character_name) -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
+ sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, character_name);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ 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], 24); // 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
+ 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);
+// 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(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ 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);
+// 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(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ 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);
+// 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(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x272a;
+ WFIFOL(login_fd, 2) = atoi(sql_row[0]); // 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(atoi(sql_row[0]))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOW(login_fd, 0) = 0x2727;
+ WFIFOL(login_fd, 2) = atoi(sql_row[0]); // 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, 24);
+ 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);
+ }
+ }
+ }
+ RFIFOSKIP(fd, 44);
+ break;
+
+ // Recieve rates [Wizputer]
+ case 0x2b16:
+ if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
+ return 0;
+ 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), RFIFOP(fd,10));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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));
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, RFIFOL(fd,2));
+ if (mysql_query(&mysql_handle, tmp_sql))
+ printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mysql_handle));
+ 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
+ printf("parse_frommap: unknown packet %x! \n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+int search_mapserver(char *map) {
+ int i, j;
+ char temp_map[16];
+ int temp_map_len;
+
+// printf("Searching the map-server for map '%s'... ", map);
+ strncpy(temp_map, map, sizeof(temp_map));
+ temp_map[sizeof(temp_map)-1] = '\0';
+ if (strchr(temp_map, '.') != NULL)
+ temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map
+
+ temp_map_len = strlen(temp_map);
+ for(i = 0; i < MAX_MAP_SERVERS; i++)
+ if (server_fd[i] >= 0)
+ for (j = 0; server[i].map[j][0]; j++)
+ //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len));
+ if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) {
+// printf("found -> server #%d.\n", i);
+ return i;
+ }
+
+// printf("not found.\n");
+ return -1;
+}
+
+int char_mapif_init(int fd) {
+ return inter_mapif_init(fd);
+}
+
+//-----------------------------------------------------
+// Test to know if an IP come from LAN or WAN. by [Yor]
+//-----------------------------------------------------
+int lan_ip_check(unsigned char *p){
+ int i;
+ int lancheck = 1;
+ int subneti[4];
+ unsigned int k0, k1, k2, k3;
+
+ sscanf(lan_map_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
+ subneti[0] = k0; subneti[1] = k1; subneti[2] = k2; subneti[3] = k3;
+
+// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
+// p[0], p[1], p[2], p[3],
+// subneti[0], subneti[1], subneti[2], subneti[3],
+// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+ for(i = 0; i < 4; i++) {
+ if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
+ lancheck = 0;
+ break;
+ }
+ }
+// printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
+ return lancheck;
+}
+
+int parse_char(int fd) {
+ int i, ch = 0;
+ char email[40];
+ struct char_session_data *sd;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+
+ if(login_fd < 0)
+ session[fd]->eof = 1;
+ if(session[fd]->eof) {
+ if (fd == login_fd)
+ login_fd = -1;
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ sd = session[fd]->session_data;
+
+ while(RFIFOREST(fd) >= 2) {
+// if (RFIFOW(fd, 0) < 30000)
+// printf("parse_char : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0));
+
+ switch(RFIFOW(fd, 0)) {
+ case 0x20b: //20040622 encryption ragexe correspondence
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ RFIFOSKIP(fd,19);
+ break;
+
+ case 0x65: // request to connect
+ printf("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;
+ {
+/*removed from isGM setup
+ if (isGM(RFIFOL(fd,2)))
+ printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), isGM(RFIFOL(fd,2)));
+ else
+ printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2));
+*/
+ if (sd == NULL) {
+ CREATE(session[fd]->session_data, struct char_session_data, 1);
+ sd = 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 (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
+ 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
+ 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
+ WFIFOW(fd,0) = 0x6c;
+ WFIFOW(fd,2) = 0;
+ WFIFOSET(fd,3);
+ }
+ }
+ }
+ RFIFOSKIP(fd, 17);
+ break;
+
+ case 0x66: // char select
+// printf("0x66> request connect - account_id:%d/char_num:%d\n",sd->account_id,RFIFOB(fd, 2));
+ if (RFIFOREST(fd) < 3)
+ return 0;
+
+ sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ sql_row = mysql_fetch_row(sql_res);
+
+ if (sql_row)
+ mmo_char_fromsql(atoi(sql_row[0]), char_dat, 0);
+ else {
+ mysql_free_result(sql_res);
+ RFIFOSKIP(fd, 3);
+ break;
+ }
+
+ 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), char_dat[0].name);
+ //query
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ printf("(\033[1;64m%d\033[0m) char selected (\033[1;32m%d\033[0m) \033[1;32m%s\033[0m" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat[0].name);
+
+ i = search_mapserver(char_dat[0].last_point.map);
+
+ // if map is not found, we check major cities
+ if (i < 0) {
+ if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "prontera.gat", 16);
+ char_dat[0].last_point.x = 273; // savepoint coordonates
+ char_dat[0].last_point.y = 354;
+ } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "geffen.gat", 16);
+ char_dat[0].last_point.x = 120; // savepoint coordonates
+ char_dat[0].last_point.y = 100;
+ } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "morocc.gat", 16);
+ char_dat[0].last_point.x = 160; // savepoint coordonates
+ char_dat[0].last_point.y = 94;
+ } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "alberta.gat", 16);
+ char_dat[0].last_point.x = 116; // savepoint coordonates
+ char_dat[0].last_point.y = 57;
+ } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "payon.gat", 16);
+ char_dat[0].last_point.x = 87; // savepoint coordonates
+ char_dat[0].last_point.y = 117;
+ } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'.
+ memcpy(char_dat[0].last_point.map, "izlude.gat", 16);
+ char_dat[0].last_point.x = 94; // savepoint coordonates
+ char_dat[0].last_point.y = 103;
+ } else {
+ int j;
+ // get first online server
+ i = 0;
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0][0]) {
+ i = j;
+ printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]);
+ break;
+ }
+ // if no map-servers are connected, we send: server closed
+ if (j == MAX_MAP_SERVERS) {
+ WFIFOW(fd,0) = 0x81;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ RFIFOSKIP(fd,3);
+ break;
+ }
+ }
+ }
+ WFIFOW(fd, 0) =0x71;
+ WFIFOL(fd, 2) =char_dat[0].char_id;
+ memcpy(WFIFOP(fd, 6), char_dat[0].last_point.map, 16);
+ //Lan check added by Kashy
+ if (lan_ip_check(p))
+ WFIFOL(fd, 22) = inet_addr(lan_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;
+ }
+// printf("auth_fifo set (auth_fifo_pos:%d) - account_id:%d char_id:%d login_id1:%d\n", auth_fifo_pos, sd->account_id, char_dat[0].char_id, sd->login_id1);
+ auth_fifo[auth_fifo_pos].account_id = sd->account_id;
+ auth_fifo[auth_fifo_pos].char_id = char_dat[0].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].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;
+ auth_fifo_pos++;
+// printf("0x66> end\n");
+ RFIFOSKIP(fd, 3);
+ break;
+
+ case 0x67: // make new
+// printf("0x67>request make new char\n");
+ if (RFIFOREST(fd) < 37)
+ return 0;
+ i = make_new_char_sql(fd, RFIFOP(fd, 2));
+ if (i < 0) {
+ WFIFOW(fd, 0) = 0x6e;
+ WFIFOB(fd, 2) = 0x00;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 37);
+ break;
+ }
+
+ WFIFOW(fd, 0) = 0x6d;
+ memset(WFIFOP(fd, 2), 0x00, 106);
+
+ mmo_char_fromsql(i, char_dat, 0);
+ i = 0;
+ WFIFOL(fd, 2) = char_dat[i].char_id;
+ WFIFOL(fd,2+4) = char_dat[i].base_exp;
+ WFIFOL(fd,2+8) = char_dat[i].zeny;
+ WFIFOL(fd,2+12) = char_dat[i].job_exp;
+ WFIFOL(fd,2+16) = char_dat[i].job_level;
+
+ WFIFOL(fd,2+28) = char_dat[i].karma;
+ WFIFOL(fd,2+32) = char_dat[i].manner;
+
+ WFIFOW(fd,2+40) = 0x30;
+ WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp;
+ WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp;
+ WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp;
+ WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp;
+ WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed;
+ WFIFOW(fd,2+52) = char_dat[i].class;
+ WFIFOW(fd,2+54) = char_dat[i].hair;
+
+ WFIFOW(fd,2+58) = char_dat[i].base_level;
+ WFIFOW(fd,2+60) = char_dat[i].skill_point;
+
+ WFIFOW(fd,2+64) = char_dat[i].shield;
+ WFIFOW(fd,2+66) = char_dat[i].head_top;
+ WFIFOW(fd,2+68) = char_dat[i].head_mid;
+ WFIFOW(fd,2+70) = char_dat[i].hair_color;
+
+ memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24);
+
+ WFIFOB(fd,2+98) = char_dat[i].str;
+ WFIFOB(fd,2+99) = char_dat[i].agi;
+ WFIFOB(fd,2+100) = char_dat[i].vit;
+ WFIFOB(fd,2+101) = char_dat[i].int_;
+ WFIFOB(fd,2+102) = char_dat[i].dex;
+ WFIFOB(fd,2+103) = char_dat[i].luk;
+ WFIFOB(fd,2+104) = char_dat[i].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[i].char_id;
+ break;
+ }
+ }
+
+ case 0x68: // delete
+ if (RFIFOREST(fd) < 46)
+ return 0;
+ printf("\033[1;31m Request Char Del:\033[0m \033[1;32m%d\033[0m(\033[1;32m%d\033[0m)\n", sd->account_id, RFIFOL(fd, 2));
+ memcpy(email, RFIFOP(fd,6), 40);
+ sprintf(tmp_sql, "SELECT `email` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, sd->account_id);
+ if (mysql_query(&lmysql_handle, tmp_sql)) {
+ printf("\033[1;31m DB server Error Delete Char data - %s \033[0m \n", mysql_error(&lmysql_handle));
+ }
+ sql_res = mysql_store_result(&lmysql_handle);
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res);
+ if (strcmp(email,sql_row[0]) == 0) {
+ mysql_free_result(sql_res);
+ } else {
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 46);
+ mysql_free_result(sql_res);
+ break;
+ }
+ } else {
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ RFIFOSKIP(fd, 46);
+ mysql_free_result(sql_res);
+ break;
+ }
+ sprintf(tmp_sql, "SELECT `name`,`partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd,2));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if(sql_res)
+ sql_row = mysql_fetch_row(sql_res);
+
+ if (sql_res && sql_row[0]) {
+ //delete char from SQL
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",pet_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd, 2));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ //Divorce [Wizputer]
+ if (sql_row[1] != 0) {
+ char buf[64];
+ sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,atoi(sql_row[1]));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,atoi(sql_row[1]));
+ if(mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ WBUFW(buf,0) = 0x2b12;
+ WBUFL(buf,2) = atoi(sql_row[0]);
+ WBUFL(buf,6) = atoi(sql_row[1]);
+ mapif_sendall(buf,10);
+ }
+ // Also delete info from guildtables.
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, RFIFOL(fd,2));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, sql_row[0]);
+
+ if (mysql_query(&mysql_handle, tmp_sql) == 0) {
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res != NULL) {
+ if (mysql_num_rows(sql_res) != 0) {
+ sql_row = mysql_fetch_row(sql_res);
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, atoi(sql_row[0]), atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, atoi(sql_row[0]));
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ mysql_free_result(sql_res);
+ }
+ } else {
+ if (mysql_errno(&mysql_handle) != 0) {
+ printf("Database server error: %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ } else {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+
+ for(i = 0; i < 9; i++) {
+ printf("char comp: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id);
+ if (sd->found_char[i] == RFIFOL(fd, 2)) {
+ for(ch = i; ch < 9-1; ch++)
+ sd->found_char[ch] = sd->found_char[ch+1];
+ sd->found_char[8] = -1;
+ break;
+ }
+ }
+ if (i == 9) { // reject
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ } else { // deleted!
+ WFIFOW(fd, 0) = 0x6f;
+ WFIFOSET(fd, 2);
+ }
+ RFIFOSKIP(fd, 46);
+ break;
+
+ case 0x2af8: // login as map-server
+ if (RFIFOREST(fd) < 60)
+ return 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(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), 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;
+ if(anti_freeze_enable)
+ server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
+ 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
+/* removed by CLOWNISIUS due to isGM
+ 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
+ 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 *)malloc(64);
+ command = (char *)malloc(64);
+
+ memset(type,0,64);
+ memset(command,0,64);
+
+ printf("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ printf("Type of command: %s || Command: %s \n",type,command);
+
+ free(buf);
+ free(type);
+ free(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) {
+ 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) {
+ 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]) {
+ 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();
+ char buf[16];
+
+ if (login_fd > 0 && session[login_fd]) {
+ // send number of user to login server
+ 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;
+}
+
+int check_connect_login_server(int tid, unsigned int tick, int id, int data) {
+ if (login_fd <= 0 || session[login_fd] == NULL) {
+ printf("Attempt to connect to login-server...\n");
+ login_fd = make_connection(login_ip, login_port);
+ session[login_fd]->func_parse = parse_tologin;
+ realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+ WFIFOW(login_fd,0) = 0x2710;
+ memset(WFIFOP(login_fd,2), 0, 24);
+ memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24);
+ memset(WFIFOP(login_fd,26), 0, 24);
+ memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24);
+ WFIFOL(login_fd,50) = 0;
+ WFIFOL(login_fd,54) = char_ip;
+ WFIFOL(login_fd,58) = char_port;
+ memset(WFIFOP(login_fd,60), 0, 20);
+ memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20);
+ WFIFOW(login_fd,80) = 0;
+ WFIFOW(login_fd,82) = char_maintenance;
+ WFIFOW(login_fd,84) = char_new;
+ WFIFOSET(login_fd,86);
+ }
+ 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);
+}
+
+// Lan Support conf reading added by Kashy
+int char_lan_config_read(const char *lancfgName){
+ char subnetmask[128];
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+ struct hostent * h = NULL;
+
+ if ((fp = fopen(lancfgName, "r")) == NULL) {
+ printf("file not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ printf("Start reading of Lan Support configuration file\n");
+
+ while(fgets(line, sizeof(line)-1, fp)){
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
+ continue;
+
+ else if (strcmpi(w1, "lan_map_ip") == 0) {
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ sprintf(lan_map_ip, "%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 {
+ strncpy(lan_map_ip, w2, sizeof(lan_map_ip));
+ lan_map_ip[sizeof(lan_map_ip)-1] = 0;
+ }
+ printf("set Lan_map_IP : %s\n", lan_map_ip);
+ }
+
+ else if (strcmpi(w1, "subnetmask") == 0) {
+ unsigned int k0, k1, k2, k3;
+ strcpy(subnetmask, w2);
+ sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
+ subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
+ printf("set subnetmask : %s\n", w2);
+ }
+ }
+ fclose(fp);
+
+ printf("End reading of Lan Support configuration file\n");
+ return 0;
+}
+
+void do_final(void) {
+ printf("Doing final stage...\n");
+ //mmo_char_sync();
+ //inter_save();
+ do_final_itemdb();
+ //check SQL save progress.
+ //wait until save char complete
+ printf("waiting until char saving complete...\n");
+ do {
+ sleep (0);
+ }while (save_flag != 0);
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
+ }
+
+ if (gm_account != NULL)
+ free(gm_account);
+
+ free(char_dat);
+ delete_session(login_fd);
+ delete_session(char_fd);
+
+ mysql_close(&mysql_handle);
+ mysql_close(&lmysql_handle);
+
+ printf("ok! all done...\n");
+}
+
+void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ printf("reading configure: %s\n", cfgName);
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ printf("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, "login_db") == 0) {
+ strcpy(login_db, w2);
+ }else if(strcmpi(w1,"char_db")==0){
+ strcpy(char_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,"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]
+ if (strcmpi(w2, "yes")) {
+ db_use_sqldbs = 1;
+ } else if (strcmpi(w2, "no")) {
+ db_use_sqldbs = 0;
+ }
+ printf("Using SQL dbs: %s\n",w2);
+ //custom columns for login database
+ }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);
+ printf("set lowest_gm_level : %s\n",w2);
+ }
+ }
+ fclose(fp);
+ printf("reading configure done.....\n");
+}
+
+int char_config_read(const char *cfgName) {
+ struct hostent *h = NULL;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ printf("Configuration file not found: %s.\n", cfgName);
+ exit(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;
+
+ remove_control_chars(w1);
+ remove_control_chars(w2);
+ if (strcmpi(w1, "userid") == 0) {
+ memcpy(userid, w2, 24);
+ } else if (strcmpi(w1, "passwd") == 0) {
+ memcpy(passwd, w2, 24);
+ } else if (strcmpi(w1, "server_name") == 0) {
+ memcpy(server_name, w2, 16);
+ printf("%s server has been intialized\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) {
+ login_ip_set_ = 1;
+ h = gethostbyname (w2);
+ if (h != NULL) {
+ 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(login_ip_str, "%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(login_ip_str,w2,16);
+ } else if (strcmpi(w1, "login_port") == 0) {
+ login_port=atoi(w2);
+ } else if (strcmpi(w1, "char_ip") == 0) {
+ char_ip_set_ = 1;
+ h = gethostbyname (w2);
+ if(h != NULL) {
+ printf("Character 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(char_ip_str, "%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(char_ip_str, w2, 16);
+ } 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, "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, "check_ip_flag") == 0) {
+ check_ip_flag = 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, "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
+ memcpy(start_point.map, map, 16);
+ 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,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
+ imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
+ imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
+ flush_on = atoi(w2); //Added by Mugendai for GUI
+ } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
+ flush_time = atoi(w2); //Added by Mugendai for GUI
+ } 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[24] = 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);
+ // anti-freeze options [Valaris]
+ } else if(strcmpi(w1,"anti_freeze_enable")==0){
+ anti_freeze_enable = config_switch(w2);
+ } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
+ ANTI_FREEZE_INTERVAL = atoi(w2);
+ if (ANTI_FREEZE_INTERVAL < 5)
+ ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
+ } else if (strcmpi(w1, "import") == 0) {
+ char_config_read(w2);
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ }
+ }
+ fclose(fp);
+
+//Read ItemDB
+ do_init_itemdb();
+
+ return 0;
+}
+
+//-----------------------------------------------------
+//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;
+}
+
+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;
+ }
+
+ char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]);
+ char_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME);
+ sql_config_read(SQL_CONF_NAME);
+
+ printf("charserver configuration reading done.....\n");
+
+ inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server ÃʱâÈ­
+ printf("interserver configuration reading done.....\n");
+
+ printf("start char server initializing.....\n");
+ mmo_char_sql_init();
+ printf("char server initializing done.....\n");
+
+ printf("set parser -> parse_char().....\n");
+ set_defaultparse(parse_char);
+
+ printf("set terminate function -> do_final().....\n");
+ set_termfunc(do_final);
+
+ printf("open port %d.....\n",char_port);
+ char_fd = make_listen_port(char_port);
+
+ if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
+ // 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)
+ printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
+ else
+ printf("Defaulting to %s as our IP address\n", buf);
+ if (login_ip_set_ == 0)
+ strcpy(login_ip_str, buf);
+ if (char_ip_set_ == 0)
+ strcpy(char_ip_str, buf);
+
+ if (ptr[0] == 192 && ptr[1] == 168)
+ printf("Firewall detected.. edit lan_support.conf and char_athena.conf");
+ }
+
+ login_ip = inet_addr(login_ip_str);
+ char_ip = inet_addr(char_ip_str);
+
+ // send ALIVE PING to login server.
+ printf("add interval tic (check_connect_login_server)....\n");
+ i = add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000);
+
+ // send USER COUNT PING to login server.
+ printf("add interval tic (send_users_tologin)....\n");
+ i = add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000);
+
+ //no need to set sync timer on SQL version.
+ //printf("add interval tic (mmo_char_sync_timer)....\n");
+ //i = add_timer_interval(gettick() + 10, mmo_char_sync_timer, 0, 0, autosave_interval);
+
+ add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
+ //Added for Mugendais I'm Alive mod
+ if(imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+
+ //Added by Mugendai for GUI support
+ if(flush_on)
+ add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+
+ if(anti_freeze_enable > 0) {
+ add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system");
+ i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies
+ }
+
+ read_gm_account();
+
+ if ( console ) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ printf("char server init func end (now unlimited loop start!)....\n");
+ printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
+ return 0;
+}
+
+
diff --git a/src/char_sql/char.h b/src/char_sql/char.h
index 85f779db2..4b4fdaf04 100644
--- a/src/char_sql/char.h
+++ b/src/char_sql/char.h
@@ -1,82 +1,82 @@
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-#define LAN_CONF_NAME "conf/lan_support.conf"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-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 itemtemp mapitem, int eqcount, int noteqcount, 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);
-
-extern int autosave_interval;
-extern char db_path[];
-extern char char_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];
-
-int db_use_sqldbs; // added for sql item_db read for char server [Valaris]
-extern char login_db_level[32];
-extern char login_db_account_id[32];
-
-extern int lowest_gm_level;
-
-#endif
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.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"
+
+#ifndef _CHAR_H_
+#define _CHAR_H_
+
+#define MAX_MAP_SERVERS 30
+
+#define LAN_CONF_NAME "conf/lan_support.conf"
+
+#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+
+struct mmo_map_server{
+ long ip;
+ short port;
+ int users;
+ char map[MAX_MAP_PER_SERVER][16];
+};
+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 itemtemp mapitem, int eqcount, int noteqcount, 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);
+
+extern int autosave_interval;
+extern char db_path[];
+extern char char_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];
+
+int db_use_sqldbs; // added for sql item_db read for char server [Valaris]
+extern char login_db_level[32];
+extern char login_db_account_id[32];
+
+extern int lowest_gm_level;
+
+#endif
+
+#include "inter.h"
+#include "int_pet.h"
+#include "int_guild.h"
+#include "int_party.h"
+#include "int_storage.h"
diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c
index cebdf1036..8c6a4cea6 100644
--- a/src/char_sql/int_guild.c
+++ b/src/char_sql/int_guild.c
@@ -1,1614 +1,1614 @@
-//
-// original code from athena
-// SQL conversion by hack
-//
-
-#include "char.h"
-#include "strlib.h"
-#include "int_storage.h"
-#include "inter.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "mmo.h"
-#include "socket.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static struct guild *guild_pt;
-static struct guild *guild_pt2;
-static struct guild_castle * guildcastle_pt;
-static int guild_newid=10000;
-
-static 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(void *key,void *data,va_list ap);
-
-
-// Save guild into sql
-int inter_guild_tosql(struct guild *g,int flag)
-{
- // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`)
- // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
- // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
- // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
- // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
- // 32 `guild_skill` (`guild_id`,`id`,`lv`)
-
- char t_name[100],t_master[24],t_mes1[60],t_mes2[120],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion;
- char t_ename[24],t_emes[40];
- char emblem_data[4096];
- int i=0;
- int guild_exist=0,guild_member=0,guild_online_member=0;
-
- if (g->guild_id<=0) return -1;
-
- printf("(\033[1;35m%d\033[0m) Request save guild - ",g->guild_id);
-
- jstrescapecpy(t_name, g->name);
-
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- 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
-
- if (guild_exist >0){
- // Check members in party
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return -1;
- }
- 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_member = atoi (sql_row[0]);
- // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- // Delete old guild from sql
- if (flag&1||guild_member==0){
- // printf("- Delete guild %d from guild\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&2||guild_member==0){
- // printf("- Delete guild %d from guild_member\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&32||guild_member==0){
- // printf("- Delete guild %d from guild_skill\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&4||guild_member==0){
- // printf("- Delete guild %d from guild_position\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&16||guild_member==0){
- // printf("- Delete guild %d from guild_expulsion\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&8||guild_member==0){
- // printf("- Delete guild %d from guild_alliance\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (flag&2||guild_member==0){
- // printf("- Delete guild %d from char\n",g->guild_id);
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- if (guild_member==0){
- // printf("- Delete guild %d from guild_castle\n",g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_castle`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
- guild_online_member = 0;
- i=0;
- while (i<g->max_member) {
- if (g->member[i].account_id>0) guild_online_member++;
- i++;
- }
-
- // No member in guild , no need to create it in sql
- if (guild_member <= 0 && guild_online_member <=0) {
- inter_guild_storage_delete(g->guild_id);
- printf("No member in guild %d , break it! \n",g->guild_id);
- return -2;
- }
-
- // Insert new guild to sqlserver
- if (flag&1||guild_member==0){
- int len=0;
- //printf("- Insert guild %d to guild\n",g->guild_id);
- for(i=0;i<g->emblem_len;i++){
- len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i]));
- //printf("%02x",(unsigned char)(g->emblem_data[i]));
- }
- emblem_data[len] = '\0';
- //printf("- emblem_len = %d \n",g->emblem_len);
- sprintf(tmp_sql,"INSERT INTO `%s` "
- "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) "
- "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')",
- guild_db, g->guild_id,t_name,jstrescapecpy(t_master,g->master),
- g->guild_lv,g->connect_member,g->max_member,g->average_lv,g->exp,g->next_exp,g->skill_point,g->castle_id,
- jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2),g->emblem_len,g->emblem_id,emblem_data);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
-
- if (flag&2||guild_member==0){
- //printf("- Insert guild %d to guild_member\n",g->guild_id);
- for(i=0;i<g->max_member;i++){
- if (g->member[i].account_id>0){
- struct guild_member *m = &g->member[i];
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, m->char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql,"INSERT INTO `%s` "
- "(`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) "
- "VALUES ('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%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,
- 0,0,
- jstrescapecpy(t_member,m->name));
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, g->guild_id,m->account_id,m->char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- if (flag&4||guild_member==0){
- //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];
- sprintf(tmp_sql,"INSERT 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) ) {
- printf("DB server Error (insert `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
- if (flag&8||guild_member==0){
- //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,"INSERT 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) ) {
- printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
- "VALUES ('%d','%d','%d','%s')",
- guild_alliance_db, a->guild_id,a->opposition,g->guild_id,t_name);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- if (flag&16||guild_member==0){
- //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
- for(i=0;i<MAX_GUILDEXPLUSION;i++){
- struct guild_explusion *e=&g->explusion[i];
- if(e->account_id>0){
- sprintf(tmp_sql,"INSERT 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) ) {
- printf("DB server Error (insert `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- if (flag&32||guild_member==0){
- //printf("- Insert guild %d to guild_skill\n",g->guild_id);
- for(i=0;i<MAX_GUILDSKILL;i++){
- if (g->skill[i].id>0){
- sprintf(tmp_sql,"INSERT 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) ) {
- printf("DB server Error (insert `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
-
- printf("Save guild done\n");
- return 0;
-}
-
-// Read guild from sql
-int inter_guild_fromsql(int guild_id,struct guild *g)
-{
- int i;
- char emblem_data[4096];
- char *pstr;
-
- if (g==NULL) return 0;
- memset(g,0,sizeof(struct guild));
- if (guild_id==0) return 0;
-
-// printf("Retrieve guild information from sql ......\n");
-// printf("- Read guild %d from sql \n",guild_id);
-
- sprintf(tmp_sql,"SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`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) ) {
- printf("DB server Error (select `guild`)- %s\n", mysql_error(&mysql_handle) );
- 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);
- if (sql_row==NULL) {
- mysql_free_result(sql_res);
- return 0;
- }
-
- g->guild_id=atoi(sql_row[0]);
- strncpy(g->name,sql_row[1],24);
- strncpy(g->master,sql_row[2],24);
- g->guild_lv=atoi(sql_row[3]);
- g->connect_member=atoi(sql_row[4]);
- g->max_member=atoi(sql_row[5]);
- g->average_lv=atoi(sql_row[6]);
- g->exp=atoi(sql_row[7]);
- g->next_exp=atoi(sql_row[8]);
- g->skill_point=atoi(sql_row[9]);
- g->castle_id=atoi(sql_row[10]);
- strncpy(g->mes1,sql_row[11],60);
- strncpy(g->mes2,sql_row[12],120);
- g->emblem_len=atoi(sql_row[13]);
- g->emblem_id=atoi(sql_row[14]);
- strncpy(emblem_data,sql_row[15],4096);
- for(i=0,pstr=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';
- 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;
- }
- }
- 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) ) {
- printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- 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=atoi(sql_row[8]);
- m->exp_payper=atoi(sql_row[9]);
- m->online=atoi(sql_row[10]);
- m->position=atoi(sql_row[11]);
- strncpy(m->name,sql_row[14],24);
- }
- }
- 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) ) {
- printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- 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],24);
- p->mode=atoi(sql_row[3]);
- p->exp_mode=atoi(sql_row[4]);
- }
- }
- 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) ) {
- printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- 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],24);
- }
- }
- 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) ) {
- printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPLUSION);i++){
- struct guild_explusion *e = &g->explusion[i];
-
- strncpy(e->name,sql_row[1],24);
- strncpy(e->mes,sql_row[2],40);
- strncpy(e->acc,sql_row[3],24);
- 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) ) {
- printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDSKILL);i++){
- g->skill[i].id=atoi(sql_row[1]);
- g->skill[i].lv=atoi(sql_row[2]);
- }
- }
- mysql_free_result(sql_res);
-
-// printf("Successfully retrieve guild information from sql!\n");
-
- return 0;
-
-}
-
-// Save guild_castle to sql
-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;
- //printf("Save to guild_castle\n");
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sprintf(tmp_sql,"INSERT 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->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5,
- gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'",guild_db, gc->castle_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",guild_db, gc->castle_id,gc->guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- return 0;
-}
-// Read guild_castle from sql
-int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
-{
-
- if (gc==NULL) return 0;
- //printf("Read from guild_castle\n");
- memset(gc,0,sizeof(struct guild_castle));
- gc->castle_id=castle_id;
- if (castle_id==-1) return 0;
- 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) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- 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);
- if (sql_row==NULL){
- mysql_free_result(sql_res);
- return 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->visibleG0 = atoi (sql_row[10]);
- gc->visibleG1 = atoi (sql_row[11]);
- gc->visibleG2 = atoi (sql_row[12]);
- gc->visibleG3 = atoi (sql_row[13]);
- gc->visibleG4 = atoi (sql_row[14]);
- gc->visibleG5 = atoi (sql_row[15]);
- gc->visibleG6 = atoi (sql_row[16]);
- gc->visibleG7 = atoi (sql_row[17]);
- gc->Ghp0 = atoi (sql_row[18]);
- gc->Ghp1 = atoi (sql_row[19]);
- gc->Ghp2 = atoi (sql_row[20]);
- gc->Ghp3 = atoi (sql_row[21]);
- gc->Ghp4 = atoi (sql_row[22]);
- gc->Ghp5 = atoi (sql_row[23]);
- gc->Ghp6 = atoi (sql_row[24]);
- gc->Ghp7 = atoi (sql_row[25]);
-
- //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id);
-
- }
- mysql_free_result(sql_res) ; //resource free
- return 0;
-}
-
-// Read exp_guild.txt
-int inter_guild_readdb()
-{
- int i;
- FILE *fp;
- char line[1024];
- for (i=0;i<100;i++) guild_exp[i]=0;
-
- fp=fopen("db/exp_guild.txt","r");
- if(fp==NULL){
- printf("can't read db/exp_guild.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line,256,fp) && i<100){
- if(line[0]=='/' && line[1]=='/')
- continue;
- guild_exp[i]=atoi(line);
- i++;
- }
- fclose(fp);
-
- return 0;
-}
-
-
-// Initialize guild sql
-int inter_guild_sql_init()
-{
- int i;
-
- printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild));
- guild_pt = calloc(sizeof(struct guild), 1);
- guild_pt2= calloc(sizeof(struct guild), 1);
- guildcastle_pt=calloc(sizeof(struct guild_castle), 1);
-
- inter_guild_readdb(); // Read exp
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'",guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total guild data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set party_newid
- sprintf (tmp_sql , "SELECT max(`guild_id`) FROM `%s`",guild_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- guild_newid = atoi(sql_row[0])+1;
- mysql_free_result(sql_res);
- }
-
- printf("set guild_newid: %d.......\n",guild_newid);
-
- return 0;
-}
-
-
-// Get guild by its name
-struct guild* search_guildname(char *str)
-{
- struct guild *g=guild_pt;
- char t_name[24];
- int guild_id=0;
- printf("search_guildname\n");
- sprintf (tmp_sql , "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",guild_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- 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_id = atoi (sql_row[0]);
- }
- mysql_free_result(sql_res);
- inter_guild_fromsql(guild_id,g);
- return g;
-}
-
-// 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;
- }
- }
-
- // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
- mapif_guild_broken(g->guild_id,0);
- inter_guild_storage_delete(g->guild_id);
- inter_guild_tosql(g,255);
- memset(g,0,sizeof(struct guild));
- return 1;
-}
-
-int guild_nextexp(int level)
-{
- if(level < 100 && level >0) // Change by hack
- return guild_exp[level-1];
-
- return 0;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }
-
-// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
-int guild_calcinfo(struct guild *g)
-{
- int i,c,nextexp;
- struct guild before=*g;
-
- // ƒXƒLƒ‹ID‚ÌÝ’è
- for(i=0;i<MAX_GUILDSKILL;i++)
- g->skill[i].id=i+10000;
-
- // ƒ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){ // Change by hack
- 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,10004)*2; // Updated max_members [PoW]
-
- // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
- g->average_lv=0;
- g->connect_member=0;
- for(i=c=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)
-{
- WFIFOW(fd,0)=0x3830;
- WFIFOL(fd,2)=account_id;
- if(g!=NULL){
- WFIFOL(fd,6)=g->guild_id;
- printf("int_guild: created! %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)
-{
- WFIFOW(fd,0)=0x3831;
- WFIFOW(fd,2)=8;
- WFIFOL(fd,4)=guild_id;
- WFIFOSET(fd,8);
- printf("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[16384];
- 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)
-{
- 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[128];
- 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,24);
- mapif_sendall(buf,79);
- printf("int_guild: guild leaved %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[32];
- 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)=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[16];
- WBUFW(buf,0)=0x3836;
- WBUFL(buf,2)=guild_id;
- WBUFB(buf,6)=flag;
- mapif_sendall(buf,7);
- printf("int_guild: broken %d\n",guild_id);
- return 0;
-}
-
-// ƒMƒ‹ƒh“à”­Œ¾
-int mapif_guild_message(int guild_id,int account_id,char *mes,int len)
-{
- unsigned char buf[512];
- 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_sendall(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[2048];
- 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[16];
- 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[128];
- 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,24);
- memcpy(WBUFP(buf,43),name2,24);
- mapif_sendall(buf,67);
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int mapif_guild_position(struct guild *g,int idx)
-{
- unsigned char buf[128];
- 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[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;
-}
-// ƒ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_castle_dataload(int castle_id,int index,int value) // <Agit>
-{
- unsigned char buf[16];
- 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[16];
- 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 = guildcastle_pt;
- int i, len = 4;
-
- WFIFOW(fd,0) = 0x3842;
- sprintf(tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res != NULL && mysql_num_rows(sql_res) > 0) {
- 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->visibleG0 = atoi(sql_row[10]);
- gc->visibleG1 = atoi(sql_row[11]);
- gc->visibleG2 = atoi(sql_row[12]);
- gc->visibleG3 = atoi(sql_row[13]);
- gc->visibleG4 = atoi(sql_row[14]);
- gc->visibleG5 = atoi(sql_row[15]);
- gc->visibleG6 = atoi(sql_row[16]);
- gc->visibleG7 = atoi(sql_row[17]);
- gc->Ghp0 = atoi(sql_row[18]);
- gc->Ghp1 = atoi(sql_row[19]);
- gc->Ghp2 = atoi(sql_row[20]);
- gc->Ghp3 = atoi(sql_row[21]);
- gc->Ghp4 = atoi(sql_row[22]);
- gc->Ghp5 = atoi(sql_row[23]);
- gc->Ghp6 = atoi(sql_row[24]);
- gc->Ghp7 = 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);
-
- 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;
-
- printf("CreateGuild\n");
- g=search_guildname(name);
- if(g!=NULL&&g->guild_id>0){
- printf("int_guild: same name guild exists [%s]\n",name);
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
- g=guild_pt;
- memset(g,0,sizeof(struct guild));
- g->guild_id=guild_newid++;
- memcpy(g->name,name,24);
- memcpy(g->master,master->name,24);
- 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);
-
- // Initialize guild property
- g->max_member=16;
- g->average_lv=master->lv;
- g->castle_id=-1;
- for(i=0;i<MAX_GUILDSKILL;i++)
- g->skill[i].id=i+10000;
-
- // Save to sql
- printf("Create initialize OK!\n");
- i=inter_guild_tosql(g,255);
-
- if (i<0) {
- mapif_guild_created(fd,account_id,NULL);
- return 0;
- }
-
- // 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;
- g=guild_pt;
- inter_guild_fromsql(guild_id,g);
- if(g!=NULL&&g->guild_id>0){
- guild_calcinfo(g);
- mapif_guild_info(fd,g);
- //inter_guild_tosql(g,1); // Change guild
- }else
- mapif_guild_noinfo(fd,guild_id);
- return 0;
-}
-// Add member to guild
-int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
-{
- struct guild *g=guild_pt;
- int i;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g==NULL||g->guild_id<=0){
- 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);
- inter_guild_tosql(g,3); // Change guild & guild_member
- return 0;
- }
- }
- mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
- //inter_guild_tosql(g,3); // Change guild & guild_member
- 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=guild_pt;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g!=NULL&&g->guild_id>0){
- int i;
- for(i=0;i<g->max_member;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‚É“ü‚ê‚é
- int j;
- for(j=0;j<MAX_GUILDEXPLUSION;j++){
- if(g->explusion[j].account_id==0)
- break;
- }
- if(j==MAX_GUILDEXPLUSION){ // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
- for(j=0;j<MAX_GUILDEXPLUSION-1;j++)
- g->explusion[j]=g->explusion[j+1];
- j=MAX_GUILDEXPLUSION-1;
- }
- g->explusion[j].account_id=account_id;
- memcpy(g->explusion[j].acc,"dummy",24);
- memcpy(g->explusion[j].name,g->member[i].name,24);
- memcpy(g->explusion[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
- /*
- else
- inter_guild_save(); // ‰ðŽU‚µ‚½‚̂ňꉞƒZ[ƒu
- return 0;*/
- }
- }
- guild_calcinfo(g);
- inter_guild_tosql(g,19); // Change guild & guild_member & guild_expulsion
- }else{
- 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) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- /* 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=guild_pt;
- int i,alv,c;
-
-
-
-
-
- if(g==NULL||g->guild_id<=0)
- return 0;
-
- inter_guild_fromsql(guild_id,g);
-
- g->connect_member=0;
-
- for(i=0,alv=0,c=0;i<g->max_member;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++;
- }
- // •½‹ÏƒŒƒxƒ‹
- g->average_lv=alv/c;
-
- inter_guild_tosql(g,3); // Change guild & guild_member
-
- return 0;
-}
-
-// BreakGuild
-int mapif_parse_BreakGuild(int fd,int guild_id)
-{
- struct guild *g=guild_pt;
- if(g==NULL)
- return 0;
- inter_guild_fromsql(guild_id,g);
-
-
-
-
- // 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) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_member\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_skill\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_position\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_expulsion\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
- }
- //printf("- Delete guild %d from guild_alliance\n",guild_id);
- 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) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf("- Delete guild %d from guild_castle\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //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) ) {
- printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- 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);
-
- 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);
-}
-// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
-int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,
- int type,const char *data,int len)
-{
- struct guild * g=guild_pt;
-// int dd=*((int *)data);
- short dw=*((short *)data);
-
-
-
-
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- inter_guild_fromsql(guild_id,g);
- switch(type){
- case GBI_GUILDLV: {
- printf("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);
- inter_guild_tosql(g,1);
- } return 0;
- default:
- printf("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
- break;
- }
- mapif_guild_basicinfochanged(guild_id,type,data,len);
- //inter_guild_tosql(g,1); // Change guild
- 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)
-{
- // Could make some improvement in speed, because only change guild_member
- int i;
- struct guild * g=guild_pt;
-
- inter_guild_fromsql(guild_id,g);
- //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER");
-
- 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){
- printf("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
- int exp,oldexp=g->member[i].exp;
- exp=g->member[i].exp=*((unsigned int *)data);
- g->exp+=(exp-oldexp);
- guild_calcinfo(g); // LvƒAƒbƒv”»’f
- mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
- }break;
- default:
- printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
- break;
- }
- mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
- inter_guild_tosql(g,3); // Change guild & guild_member
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
-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=guild_pt;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION){
- return 0;
- }
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- mapif_guild_position(g,idx);
- printf("int_guild: position changed %d\n",idx);
- inter_guild_tosql(g,4); // Change guild_position
- 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)
-{
- // Could make some improvement in speed, because only change guild_position
- struct guild *g=guild_pt;
- int idx=skill_num-10000;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g==NULL || skill_num<10000)
- return 0;
- //printf("GuildSkillUp\n");
-
- 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);
- printf("int_guild: skill %d up\n",skill_num);
- inter_guild_tosql(g,33); // Change guild & guild_skill
- }
-
- 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)
-{
- // Could speed up
- struct guild *g[2];
- int j,i;
- g[0]=guild_pt;
- g[1]=guild_pt2;
- inter_guild_fromsql(guild_id1,g[0]);
- inter_guild_fromsql(guild_id2,g[1]);
-
- if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0)
- 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,24);
- 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);
- inter_guild_tosql(g[0],8); // Change guild_alliance
- inter_guild_tosql(g[1],8); // Change guild_alliance
- 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=guild_pt;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- memcpy(g->mes1,mes1,60);
- memcpy(g->mes2,mes2,120);
- inter_guild_tosql(g,1); // Change mes of guild
- 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=guild_pt;
-
- inter_guild_fromsql(guild_id,g);
-
- if(g==NULL||g->guild_id<=0)
- return 0;
- memcpy(g->emblem_data,data,len);
- g->emblem_len=len;
- g->emblem_id++;
- inter_guild_tosql(g,1); // Change guild
- return mapif_guild_emblem(g);
-}
-
-int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
-{
- struct guild_castle *gc=guildcastle_pt;
- inter_guildcastle_fromsql(castle_id, gc);
- if(gc==NULL||gc->castle_id==-1){
- 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: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG0); break;
- case 11: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG1); break;
- case 12: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG2); break;
- case 13: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG3); break;
- case 14: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG4); break;
- case 15: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG5); break;
- case 16: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG6); break;
- case 17: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG7); break;
- case 18: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp0); break; // guardian HP [Valaris]
- case 19: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp1); break;
- case 20: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp2); break;
- case 21: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp3); break;
- case 22: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp4); break;
- case 23: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp5); break;
- case 24: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp6); break;
- case 25: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp7); break; // end additions [Valaris]
- default:
- printf("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=guildcastle_pt;
- inter_guildcastle_fromsql(castle_id, gc);
- if(gc==NULL||gc->castle_id==-1){
- 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=guild_pt;
- inter_guild_fromsql(gid, g);
- if(log_inter)
- inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
- (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", index);
- }
- 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: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- inter_guildcastle_tosql(gc);
- 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)
-{
- // 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)
-{
- switch(RFIFOW(fd,0)){
- case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),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 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),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),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),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),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),RFIFOP(fd,6),RFIFOP(fd,66)); break;
- case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),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,"**ƒT[ƒo[–½—ß**");
-}
+//
+// original code from athena
+// SQL conversion by hack
+//
+
+#include "char.h"
+#include "strlib.h"
+#include "int_storage.h"
+#include "inter.h"
+#include "int_guild.h"
+#include "int_storage.h"
+#include "mmo.h"
+#include "socket.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static struct guild *guild_pt;
+static struct guild *guild_pt2;
+static struct guild_castle * guildcastle_pt;
+static int guild_newid=10000;
+
+static 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(void *key,void *data,va_list ap);
+
+
+// Save guild into sql
+int inter_guild_tosql(struct guild *g,int flag)
+{
+ // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`)
+ // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
+ // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
+ // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
+ // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`)
+ // 32 `guild_skill` (`guild_id`,`id`,`lv`)
+
+ char t_name[100],t_master[24],t_mes1[60],t_mes2[120],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion;
+ char t_ename[24],t_emes[40];
+ char emblem_data[4096];
+ int i=0;
+ int guild_exist=0,guild_member=0,guild_online_member=0;
+
+ if (g->guild_id<=0) return -1;
+
+ printf("(\033[1;35m%d\033[0m) Request save guild - ",g->guild_id);
+
+ jstrescapecpy(t_name, g->name);
+
+ //printf("- Check if guild %d exists\n",g->guild_id);
+ sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db,g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ 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
+
+ if (guild_exist >0){
+ // Check members in party
+ sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ return -1;
+ }
+ 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_member = atoi (sql_row[0]);
+ // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member);
+
+ }
+ mysql_free_result(sql_res) ; //resource free
+
+ // Delete old guild from sql
+ if (flag&1||guild_member==0){
+ // printf("- Delete guild %d from guild\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&2||guild_member==0){
+ // printf("- Delete guild %d from guild_member\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&32||guild_member==0){
+ // printf("- Delete guild %d from guild_skill\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&4||guild_member==0){
+ // printf("- Delete guild %d from guild_position\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&16||guild_member==0){
+ // printf("- Delete guild %d from guild_expulsion\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&8||guild_member==0){
+ // printf("- Delete guild %d from guild_alliance\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (flag&2||guild_member==0){
+ // printf("- Delete guild %d from char\n",g->guild_id);
+ sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ if (guild_member==0){
+ // printf("- Delete guild %d from guild_castle\n",g->guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, g->guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_castle`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+
+ guild_online_member = 0;
+ i=0;
+ while (i<g->max_member) {
+ if (g->member[i].account_id>0) guild_online_member++;
+ i++;
+ }
+
+ // No member in guild , no need to create it in sql
+ if (guild_member <= 0 && guild_online_member <=0) {
+ inter_guild_storage_delete(g->guild_id);
+ printf("No member in guild %d , break it! \n",g->guild_id);
+ return -2;
+ }
+
+ // Insert new guild to sqlserver
+ if (flag&1||guild_member==0){
+ int len=0;
+ //printf("- Insert guild %d to guild\n",g->guild_id);
+ for(i=0;i<g->emblem_len;i++){
+ len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i]));
+ //printf("%02x",(unsigned char)(g->emblem_data[i]));
+ }
+ emblem_data[len] = '\0';
+ //printf("- emblem_len = %d \n",g->emblem_len);
+ sprintf(tmp_sql,"INSERT INTO `%s` "
+ "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) "
+ "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')",
+ guild_db, g->guild_id,t_name,jstrescapecpy(t_master,g->master),
+ g->guild_lv,g->connect_member,g->max_member,g->average_lv,g->exp,g->next_exp,g->skill_point,g->castle_id,
+ jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2),g->emblem_len,g->emblem_id,emblem_data);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+
+ if (flag&2||guild_member==0){
+ //printf("- Insert guild %d to guild_member\n",g->guild_id);
+ for(i=0;i<g->max_member;i++){
+ if (g->member[i].account_id>0){
+ struct guild_member *m = &g->member[i];
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, m->char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sprintf(tmp_sql,"INSERT INTO `%s` "
+ "(`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) "
+ "VALUES ('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%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,
+ 0,0,
+ jstrescapecpy(t_member,m->name));
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `guild_member`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, g->guild_id,m->account_id,m->char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ }
+
+ if (flag&4||guild_member==0){
+ //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];
+ sprintf(tmp_sql,"INSERT 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) ) {
+ printf("DB server Error (insert `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+
+ if (flag&8||guild_member==0){
+ //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,"INSERT 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) ) {
+ printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
+ "VALUES ('%d','%d','%d','%s')",
+ guild_alliance_db, a->guild_id,a->opposition,g->guild_id,t_name);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ }
+
+ if (flag&16||guild_member==0){
+ //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
+ for(i=0;i<MAX_GUILDEXPLUSION;i++){
+ struct guild_explusion *e=&g->explusion[i];
+ if(e->account_id>0){
+ sprintf(tmp_sql,"INSERT 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) ) {
+ printf("DB server Error (insert `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ }
+
+ if (flag&32||guild_member==0){
+ //printf("- Insert guild %d to guild_skill\n",g->guild_id);
+ for(i=0;i<MAX_GUILDSKILL;i++){
+ if (g->skill[i].id>0){
+ sprintf(tmp_sql,"INSERT 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) ) {
+ printf("DB server Error (insert `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ }
+
+ printf("Save guild done\n");
+ return 0;
+}
+
+// Read guild from sql
+int inter_guild_fromsql(int guild_id,struct guild *g)
+{
+ int i;
+ char emblem_data[4096];
+ char *pstr;
+
+ if (g==NULL) return 0;
+ memset(g,0,sizeof(struct guild));
+ if (guild_id==0) return 0;
+
+// printf("Retrieve guild information from sql ......\n");
+// printf("- Read guild %d from sql \n",guild_id);
+
+ sprintf(tmp_sql,"SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`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) ) {
+ printf("DB server Error (select `guild`)- %s\n", mysql_error(&mysql_handle) );
+ 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);
+ if (sql_row==NULL) {
+ mysql_free_result(sql_res);
+ return 0;
+ }
+
+ g->guild_id=atoi(sql_row[0]);
+ strncpy(g->name,sql_row[1],24);
+ strncpy(g->master,sql_row[2],24);
+ g->guild_lv=atoi(sql_row[3]);
+ g->connect_member=atoi(sql_row[4]);
+ g->max_member=atoi(sql_row[5]);
+ g->average_lv=atoi(sql_row[6]);
+ g->exp=atoi(sql_row[7]);
+ g->next_exp=atoi(sql_row[8]);
+ g->skill_point=atoi(sql_row[9]);
+ g->castle_id=atoi(sql_row[10]);
+ strncpy(g->mes1,sql_row[11],60);
+ strncpy(g->mes2,sql_row[12],120);
+ g->emblem_len=atoi(sql_row[13]);
+ g->emblem_id=atoi(sql_row[14]);
+ strncpy(emblem_data,sql_row[15],4096);
+ for(i=0,pstr=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';
+ 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;
+ }
+ }
+ 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) ) {
+ printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ 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=atoi(sql_row[8]);
+ m->exp_payper=atoi(sql_row[9]);
+ m->online=atoi(sql_row[10]);
+ m->position=atoi(sql_row[11]);
+ strncpy(m->name,sql_row[14],24);
+ }
+ }
+ 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) ) {
+ printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ 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],24);
+ p->mode=atoi(sql_row[3]);
+ p->exp_mode=atoi(sql_row[4]);
+ }
+ }
+ 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) ) {
+ printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ 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],24);
+ }
+ }
+ 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) ) {
+ printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPLUSION);i++){
+ struct guild_explusion *e = &g->explusion[i];
+
+ strncpy(e->name,sql_row[1],24);
+ strncpy(e->mes,sql_row[2],40);
+ strncpy(e->acc,sql_row[3],24);
+ 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) ) {
+ printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDSKILL);i++){
+ g->skill[i].id=atoi(sql_row[1]);
+ g->skill[i].lv=atoi(sql_row[2]);
+ }
+ }
+ mysql_free_result(sql_res);
+
+// printf("Successfully retrieve guild information from sql!\n");
+
+ return 0;
+
+}
+
+// Save guild_castle to sql
+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;
+ //printf("Save to guild_castle\n");
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+
+ sprintf(tmp_sql,"INSERT 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->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5,
+ gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'",guild_db, gc->castle_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",guild_db, gc->castle_id,gc->guild_id);
+ //printf(" %s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+
+ return 0;
+}
+// Read guild_castle from sql
+int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
+{
+
+ if (gc==NULL) return 0;
+ //printf("Read from guild_castle\n");
+ memset(gc,0,sizeof(struct guild_castle));
+ gc->castle_id=castle_id;
+ if (castle_id==-1) return 0;
+ 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) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ 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);
+ if (sql_row==NULL){
+ mysql_free_result(sql_res);
+ return 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->visibleG0 = atoi (sql_row[10]);
+ gc->visibleG1 = atoi (sql_row[11]);
+ gc->visibleG2 = atoi (sql_row[12]);
+ gc->visibleG3 = atoi (sql_row[13]);
+ gc->visibleG4 = atoi (sql_row[14]);
+ gc->visibleG5 = atoi (sql_row[15]);
+ gc->visibleG6 = atoi (sql_row[16]);
+ gc->visibleG7 = atoi (sql_row[17]);
+ gc->Ghp0 = atoi (sql_row[18]);
+ gc->Ghp1 = atoi (sql_row[19]);
+ gc->Ghp2 = atoi (sql_row[20]);
+ gc->Ghp3 = atoi (sql_row[21]);
+ gc->Ghp4 = atoi (sql_row[22]);
+ gc->Ghp5 = atoi (sql_row[23]);
+ gc->Ghp6 = atoi (sql_row[24]);
+ gc->Ghp7 = atoi (sql_row[25]);
+
+ //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id);
+
+ }
+ mysql_free_result(sql_res) ; //resource free
+ return 0;
+}
+
+// Read exp_guild.txt
+int inter_guild_readdb()
+{
+ int i;
+ FILE *fp;
+ char line[1024];
+ for (i=0;i<100;i++) guild_exp[i]=0;
+
+ fp=fopen("db/exp_guild.txt","r");
+ if(fp==NULL){
+ printf("can't read db/exp_guild.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line,256,fp) && i<100){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ guild_exp[i]=atoi(line);
+ i++;
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+
+// Initialize guild sql
+int inter_guild_sql_init()
+{
+ int i;
+
+ printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild));
+ guild_pt = calloc(sizeof(struct guild), 1);
+ guild_pt2= calloc(sizeof(struct guild), 1);
+ guildcastle_pt=calloc(sizeof(struct guild_castle), 1);
+
+ inter_guild_readdb(); // Read exp
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'",guild_member_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ exit(0);
+ }
+
+ sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ exit(0);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ printf("total guild data -> '%s'.......\n",sql_row[0]);
+ i = atoi (sql_row[0]);
+ mysql_free_result(sql_res);
+
+ if (i > 0) {
+ //set party_newid
+ sprintf (tmp_sql , "SELECT max(`guild_id`) FROM `%s`",guild_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ exit(0);
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ guild_newid = atoi(sql_row[0])+1;
+ mysql_free_result(sql_res);
+ }
+
+ printf("set guild_newid: %d.......\n",guild_newid);
+
+ return 0;
+}
+
+
+// Get guild by its name
+struct guild* search_guildname(char *str)
+{
+ struct guild *g=guild_pt;
+ char t_name[24];
+ int guild_id=0;
+ printf("search_guildname\n");
+ sprintf (tmp_sql , "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",guild_db, jstrescapecpy(t_name,str));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ 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_id = atoi (sql_row[0]);
+ }
+ mysql_free_result(sql_res);
+ inter_guild_fromsql(guild_id,g);
+ return g;
+}
+
+// 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;
+ }
+ }
+
+ // ’N‚à‚¢‚È‚¢‚̂ʼnðŽU
+ mapif_guild_broken(g->guild_id,0);
+ inter_guild_storage_delete(g->guild_id);
+ inter_guild_tosql(g,255);
+ memset(g,0,sizeof(struct guild));
+ return 1;
+}
+
+int guild_nextexp(int level)
+{
+ if(level < 100 && level >0) // Change by hack
+ return guild_exp[level-1];
+
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
+int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }
+
+// ƒMƒ‹ƒh‚Ìî•ñ‚ÌÄŒvŽZ
+int guild_calcinfo(struct guild *g)
+{
+ int i,c,nextexp;
+ struct guild before=*g;
+
+ // ƒXƒLƒ‹ID‚ÌÝ’è
+ for(i=0;i<MAX_GUILDSKILL;i++)
+ g->skill[i].id=i+10000;
+
+ // ƒ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){ // Change by hack
+ 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,10004)*2; // Updated max_members [PoW]
+
+ // •½‹ÏƒŒƒxƒ‹‚ƃIƒ“ƒ‰ƒCƒ“l”
+ g->average_lv=0;
+ g->connect_member=0;
+ for(i=c=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)
+{
+ WFIFOW(fd,0)=0x3830;
+ WFIFOL(fd,2)=account_id;
+ if(g!=NULL){
+ WFIFOL(fd,6)=g->guild_id;
+ printf("int_guild: created! %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)
+{
+ WFIFOW(fd,0)=0x3831;
+ WFIFOW(fd,2)=8;
+ WFIFOL(fd,4)=guild_id;
+ WFIFOSET(fd,8);
+ printf("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[16384];
+ 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)
+{
+ 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[128];
+ 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,24);
+ mapif_sendall(buf,79);
+ printf("int_guild: guild leaved %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[32];
+ 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)=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[16];
+ WBUFW(buf,0)=0x3836;
+ WBUFL(buf,2)=guild_id;
+ WBUFB(buf,6)=flag;
+ mapif_sendall(buf,7);
+ printf("int_guild: broken %d\n",guild_id);
+ return 0;
+}
+
+// ƒMƒ‹ƒh“à”­Œ¾
+int mapif_guild_message(int guild_id,int account_id,char *mes,int len)
+{
+ unsigned char buf[512];
+ 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_sendall(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[2048];
+ 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[16];
+ 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[128];
+ 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,24);
+ memcpy(WBUFP(buf,43),name2,24);
+ mapif_sendall(buf,67);
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+int mapif_guild_position(struct guild *g,int idx)
+{
+ unsigned char buf[128];
+ 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[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;
+}
+// ƒ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_castle_dataload(int castle_id,int index,int value) // <Agit>
+{
+ unsigned char buf[16];
+ 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[16];
+ 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 = guildcastle_pt;
+ int i, len = 4;
+
+ WFIFOW(fd,0) = 0x3842;
+ sprintf(tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+ if (sql_res != NULL && mysql_num_rows(sql_res) > 0) {
+ 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->visibleG0 = atoi(sql_row[10]);
+ gc->visibleG1 = atoi(sql_row[11]);
+ gc->visibleG2 = atoi(sql_row[12]);
+ gc->visibleG3 = atoi(sql_row[13]);
+ gc->visibleG4 = atoi(sql_row[14]);
+ gc->visibleG5 = atoi(sql_row[15]);
+ gc->visibleG6 = atoi(sql_row[16]);
+ gc->visibleG7 = atoi(sql_row[17]);
+ gc->Ghp0 = atoi(sql_row[18]);
+ gc->Ghp1 = atoi(sql_row[19]);
+ gc->Ghp2 = atoi(sql_row[20]);
+ gc->Ghp3 = atoi(sql_row[21]);
+ gc->Ghp4 = atoi(sql_row[22]);
+ gc->Ghp5 = atoi(sql_row[23]);
+ gc->Ghp6 = atoi(sql_row[24]);
+ gc->Ghp7 = 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);
+
+ 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;
+
+ printf("CreateGuild\n");
+ g=search_guildname(name);
+ if(g!=NULL&&g->guild_id>0){
+ printf("int_guild: same name guild exists [%s]\n",name);
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+ g=guild_pt;
+ memset(g,0,sizeof(struct guild));
+ g->guild_id=guild_newid++;
+ memcpy(g->name,name,24);
+ memcpy(g->master,master->name,24);
+ 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);
+
+ // Initialize guild property
+ g->max_member=16;
+ g->average_lv=master->lv;
+ g->castle_id=-1;
+ for(i=0;i<MAX_GUILDSKILL;i++)
+ g->skill[i].id=i+10000;
+
+ // Save to sql
+ printf("Create initialize OK!\n");
+ i=inter_guild_tosql(g,255);
+
+ if (i<0) {
+ mapif_guild_created(fd,account_id,NULL);
+ return 0;
+ }
+
+ // 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;
+ g=guild_pt;
+ inter_guild_fromsql(guild_id,g);
+ if(g!=NULL&&g->guild_id>0){
+ guild_calcinfo(g);
+ mapif_guild_info(fd,g);
+ //inter_guild_tosql(g,1); // Change guild
+ }else
+ mapif_guild_noinfo(fd,guild_id);
+ return 0;
+}
+// Add member to guild
+int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m)
+{
+ struct guild *g=guild_pt;
+ int i;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g==NULL||g->guild_id<=0){
+ 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);
+ inter_guild_tosql(g,3); // Change guild & guild_member
+ return 0;
+ }
+ }
+ mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
+ //inter_guild_tosql(g,3); // Change guild & guild_member
+ 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=guild_pt;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g!=NULL&&g->guild_id>0){
+ int i;
+ for(i=0;i<g->max_member;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‚É“ü‚ê‚é
+ int j;
+ for(j=0;j<MAX_GUILDEXPLUSION;j++){
+ if(g->explusion[j].account_id==0)
+ break;
+ }
+ if(j==MAX_GUILDEXPLUSION){ // ˆê”t‚Ȃ̂Ō¢‚Ì‚ðÁ‚·
+ for(j=0;j<MAX_GUILDEXPLUSION-1;j++)
+ g->explusion[j]=g->explusion[j+1];
+ j=MAX_GUILDEXPLUSION-1;
+ }
+ g->explusion[j].account_id=account_id;
+ memcpy(g->explusion[j].acc,"dummy",24);
+ memcpy(g->explusion[j].name,g->member[i].name,24);
+ memcpy(g->explusion[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
+ /*
+ else
+ inter_guild_save(); // ‰ðŽU‚µ‚½‚̂ňꉞƒZ[ƒu
+ return 0;*/
+ }
+ }
+ guild_calcinfo(g);
+ inter_guild_tosql(g,19); // Change guild & guild_member & guild_expulsion
+ }else{
+ 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) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ /* 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=guild_pt;
+ int i,alv,c;
+
+
+
+
+
+ if(g==NULL||g->guild_id<=0)
+ return 0;
+
+ inter_guild_fromsql(guild_id,g);
+
+ g->connect_member=0;
+
+ for(i=0,alv=0,c=0;i<g->max_member;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++;
+ }
+ // •½‹ÏƒŒƒxƒ‹
+ g->average_lv=alv/c;
+
+ inter_guild_tosql(g,3); // Change guild & guild_member
+
+ return 0;
+}
+
+// BreakGuild
+int mapif_parse_BreakGuild(int fd,int guild_id)
+{
+ struct guild *g=guild_pt;
+ if(g==NULL)
+ return 0;
+ inter_guild_fromsql(guild_id,g);
+
+
+
+
+ // 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) ) {
+ printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ //printf("- Delete guild %d from guild_member\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ //printf("- Delete guild %d from guild_skill\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ //printf("- Delete guild %d from guild_position\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ //printf("- Delete guild %d from guild_expulsion\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ //printf("- Delete guild %d from guild_alliance\n",guild_id);
+ 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) ) {
+ printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //printf("- Delete guild %d from guild_castle\n",guild_id);
+ sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //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) ) {
+ printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ 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);
+
+ 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);
+}
+// ƒMƒ‹ƒhŠî–{ƒf[ƒ^•ÏX—v‹
+int mapif_parse_GuildBasicInfoChange(int fd,int guild_id,
+ int type,const char *data,int len)
+{
+ struct guild * g=guild_pt;
+// int dd=*((int *)data);
+ short dw=*((short *)data);
+
+
+
+
+
+ if(g==NULL||g->guild_id<=0)
+ return 0;
+ inter_guild_fromsql(guild_id,g);
+ switch(type){
+ case GBI_GUILDLV: {
+ printf("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);
+ inter_guild_tosql(g,1);
+ } return 0;
+ default:
+ printf("int_guild: GuildBasicInfoChange: Unknown type %d\n",type);
+ break;
+ }
+ mapif_guild_basicinfochanged(guild_id,type,data,len);
+ //inter_guild_tosql(g,1); // Change guild
+ 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)
+{
+ // Could make some improvement in speed, because only change guild_member
+ int i;
+ struct guild * g=guild_pt;
+
+ inter_guild_fromsql(guild_id,g);
+ //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER");
+
+ 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){
+ printf("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
+ int exp,oldexp=g->member[i].exp;
+ exp=g->member[i].exp=*((unsigned int *)data);
+ g->exp+=(exp-oldexp);
+ guild_calcinfo(g); // LvƒAƒbƒv”»’f
+ mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
+ }break;
+ default:
+ printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
+ break;
+ }
+ mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+ inter_guild_tosql(g,3); // Change guild & guild_member
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE–¼•ÏX—v‹
+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=guild_pt;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION){
+ return 0;
+ }
+ memcpy(&g->position[idx],p,sizeof(struct guild_position));
+ mapif_guild_position(g,idx);
+ printf("int_guild: position changed %d\n",idx);
+ inter_guild_tosql(g,4); // Change guild_position
+ 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)
+{
+ // Could make some improvement in speed, because only change guild_position
+ struct guild *g=guild_pt;
+ int idx=skill_num-10000;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g==NULL || skill_num<10000)
+ return 0;
+ //printf("GuildSkillUp\n");
+
+ 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);
+ printf("int_guild: skill %d up\n",skill_num);
+ inter_guild_tosql(g,33); // Change guild & guild_skill
+ }
+
+ 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)
+{
+ // Could speed up
+ struct guild *g[2];
+ int j,i;
+ g[0]=guild_pt;
+ g[1]=guild_pt2;
+ inter_guild_fromsql(guild_id1,g[0]);
+ inter_guild_fromsql(guild_id2,g[1]);
+
+ if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0)
+ 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,24);
+ 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);
+ inter_guild_tosql(g[0],8); // Change guild_alliance
+ inter_guild_tosql(g[1],8); // Change guild_alliance
+ 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=guild_pt;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g==NULL||g->guild_id<=0)
+ return 0;
+ memcpy(g->mes1,mes1,60);
+ memcpy(g->mes2,mes2,120);
+ inter_guild_tosql(g,1); // Change mes of guild
+ 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=guild_pt;
+
+ inter_guild_fromsql(guild_id,g);
+
+ if(g==NULL||g->guild_id<=0)
+ return 0;
+ memcpy(g->emblem_data,data,len);
+ g->emblem_len=len;
+ g->emblem_id++;
+ inter_guild_tosql(g,1); // Change guild
+ return mapif_guild_emblem(g);
+}
+
+int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit>
+{
+ struct guild_castle *gc=guildcastle_pt;
+ inter_guildcastle_fromsql(castle_id, gc);
+ if(gc==NULL||gc->castle_id==-1){
+ 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: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG0); break;
+ case 11: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG1); break;
+ case 12: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG2); break;
+ case 13: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG3); break;
+ case 14: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG4); break;
+ case 15: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG5); break;
+ case 16: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG6); break;
+ case 17: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG7); break;
+ case 18: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp0); break; // guardian HP [Valaris]
+ case 19: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp1); break;
+ case 20: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp2); break;
+ case 21: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp3); break;
+ case 22: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp4); break;
+ case 23: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp5); break;
+ case 24: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp6); break;
+ case 25: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp7); break; // end additions [Valaris]
+ default:
+ printf("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=guildcastle_pt;
+ inter_guildcastle_fromsql(castle_id, gc);
+ if(gc==NULL||gc->castle_id==-1){
+ 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=guild_pt;
+ inter_guild_fromsql(gid, g);
+ if(log_inter)
+ inter_log("guild %s (id=%d) %s castle id=%d" RETCODE,
+ (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", index);
+ }
+ 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: gc->visibleG0 = value; break;
+ case 11: gc->visibleG1 = value; break;
+ case 12: gc->visibleG2 = value; break;
+ case 13: gc->visibleG3 = value; break;
+ case 14: gc->visibleG4 = value; break;
+ case 15: gc->visibleG5 = value; break;
+ case 16: gc->visibleG6 = value; break;
+ case 17: gc->visibleG7 = value; break;
+ case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
+ case 19: gc->Ghp1 = value; break;
+ case 20: gc->Ghp2 = value; break;
+ case 21: gc->Ghp3 = value; break;
+ case 22: gc->Ghp4 = value; break;
+ case 23: gc->Ghp5 = value; break;
+ case 24: gc->Ghp6 = value; break;
+ case 25: gc->Ghp7 = value; break; // end additions [Valaris]
+ default:
+ printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+ inter_guildcastle_tosql(gc);
+ 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)
+{
+ // 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)
+{
+ switch(RFIFOW(fd,0)){
+ case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),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 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),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),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),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),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),RFIFOP(fd,6),RFIFOP(fd,66)); break;
+ case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),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,"**ƒT[ƒo[–½—ß**");
+}
diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h
index 6a933d7d3..8f4203d7c 100644
--- a/src/char_sql/int_guild.h
+++ b/src/char_sql/int_guild.h
@@ -1,10 +1,10 @@
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_parse_frommap(int fd);
-int inter_guild_sql_init();
-int inter_guild_mapif_init(int fd);
-
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-
-#endif
+#ifndef _INT_GUILD_H_
+#define _INT_GUILD_H_
+
+int inter_guild_parse_frommap(int fd);
+int inter_guild_sql_init();
+int inter_guild_mapif_init(int fd);
+
+int inter_guild_leave(int guild_id,int account_id,int char_id);
+
+#endif
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
index 12e2385c9..84de078c9 100644
--- a/src/char_sql/int_party.c
+++ b/src/char_sql/int_party.c
@@ -1,755 +1,755 @@
-//
-// original code from athena
-// SQL conversion by hack
-//
-
-#include "char.h"
-#include "strlib.h"
-#include "socket.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static struct party *party_pt;
-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);
-
-// Save party to mysql
-int inter_party_tosql(int party_id,struct party *p)
-{
- // 'party' ('party_id','name','exp','item','leader')
-
- char t_name[100];
- char t_member[24];
- int party_member = 0, party_online_member = 0;
- int party_exist = 0;
- int leader_id = 0;
- int i = 0;
-
- printf("(\033[1;64m%d\033[0m) Request save party - ",party_id);
-
- jstrescapecpy(t_name, p->name);
-
- if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) {
- printf("- Party pointer or party_id error \n");
- return 0;
- }
-
- // Check if party exists
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- 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);
- party_exist = atoi (sql_row[0]);
- //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes");
- }
- mysql_free_result(sql_res) ; //resource free
-
- if (party_exist >0){
- // Check members in party
- sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- 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);
-
- party_member = atoi (sql_row[0]);
- // printf("- Check members in party %d : %d \n",party_id,party_member);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
- party_online_member = 0;
- i=0;
- while (i<MAX_PARTY){
- if (p->member[i].account_id>0) party_online_member++;
- i++;
- }
-
- //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member);
-
- if (party_member <= 0 && party_online_member == 0) {
-
- // Delete the party, if has no member.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- // printf("No member in party %d, break it \n",party_id);
- memset(p, 0, sizeof(struct party));
- return 0;
- } else {
- // Update party information, if exists
-
- int i=0;
-
- for (i=0;i<MAX_PARTY;i++){
-
- if (p->member[i].account_id>0){
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='%d' WHERE `account_id`='%d' AND `name`='%s'",
- char_db, party_id, p->member[i].online, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name));
- //printf("%s",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
-
- sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'",
- party_db, t_name,p->exp,p->item,party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- }
-
-
- // printf("- Update party %d information \n",party_id);
- }
- } else {
- // Add new party, if not exist
- int i = 0;
- while (i<MAX_PARTY&&((p->member[i].account_id>0&&p->member[i].leader==0)||(p->member[i].account_id<0))) i++;
- if (i<MAX_PARTY) leader_id = p->member[i].account_id;
- sprintf(tmp_sql,"INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')",
- party_db, party_id, t_name, p->exp, p->item,leader_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
-
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='1' WHERE `account_id`='%d' AND `name`='%s'",
- char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf("- Insert new party %d \n",party_id);
- }
-
- printf("Party save success\n");
- return 0;
-
-}
-
-// Read party from mysql
-int inter_party_fromsql(int party_id,struct party *p)
-{
- int leader_id=0;
- printf("(\033[1;64m%d\033[0m) Request load party - ",party_id);
-
- memset(p, 0, sizeof(struct party));
-
- sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- 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);
- // printf("- Read party %d from MySQL\n",party_id);
- p->party_id = party_id;
- strcpy(p->name, sql_row[1]);
- p->exp = atoi(sql_row[2]);
- p->item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- } else {
- mysql_free_result(sql_res);
- // printf("- Cannot find party %d \n",party_id);
- return 0;
- }
-
- mysql_free_result(sql_res);
-
- // Load members
- sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- struct party_member *m = &p->member[i];
- m->account_id = atoi(sql_row[0]);
- if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
- strncpy(m->name,sql_row[1],sizeof(m->name));
- m->lv = atoi(sql_row[2]);
- strncpy(m->map,sql_row[3],sizeof(m->map));
- m->online = atoi(sql_row[4]);
- }
- // printf("- %d members found in party %d \n",i,party_id);
- }
- mysql_free_result(sql_res);
-
-
- printf("Party load success\n");
- return 0;
-
-}
-
-int inter_party_sql_init(){
- int i;
-
- //memory alloc
- printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party));
- party_pt = calloc(sizeof(struct party), 1);
-
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total party data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set party_newid
- sprintf (tmp_sql , "SELECT max(`party_id`) FROM `%s`", party_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- sql_row = mysql_fetch_row(sql_res);
- party_newid = atoi (sql_row[0])+1;
- mysql_free_result(sql_res);
- }
-
- printf("set party_newid: %d.......\n",party_newid);
-
- return 0;
-}
-
-
-// Search for the party according to its name
-struct party* search_partyname(char *str)
-{
- struct party *p=NULL;
- int leader_id = 0;
- char t_name[24];
-
- sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<=0) { mysql_free_result(sql_res); return p; }
- sql_row = mysql_fetch_row(sql_res);
- p = party_pt;
- p->party_id = atoi(sql_row[0]);
- strcpy(p->name, sql_row[1]);
- p->exp = atoi(sql_row[2]);
- p->item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- mysql_free_result(sql_res);
-
- // Load members
- sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, p->party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
- return 0;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- int i;
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- struct party_member *m = &p->member[i];
- m->account_id = atoi(sql_row[0]);
- if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
- strncpy(m->name,sql_row[1],sizeof(m->name));
- m->lv = atoi(sql_row[2]);
- strncpy(m->map,sql_row[3],sizeof(m->map));
- m->online = atoi(sql_row[4]);
- }
- printf("- %d members found in party %d \n",i,p->party_id);
- }
- mysql_free_result(sql_res);
-
- return p;
-}
-
-// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
-int party_check_exp_share(struct party *p)
-{
- int i;
- int maxlv=0,minlv=0x7fffffff;
- for(i=0;i<MAX_PARTY;i++){
- int lv=p->member[i].lv;
- if( p->member[i].online ){
- if( lv < minlv ) minlv=lv;
- if( maxlv < lv ) maxlv=lv;
- }
- }
- return (maxlv==0 || maxlv-minlv<=party_share_level);
-}
-// Is there any member in the party?
-int party_check_empty(struct party *p)
-{
- int i;
- if (p==NULL||p->party_id==0) return 1;
-// printf("party check empty %08X\n",(int)p);
- for(i=0;i<MAX_PARTY;i++){
-// printf("%d acc=%d\n",i,p->member[i].account_id);
- if(p->member[i].account_id>0){
- return 0;
- }
- }
- // If there is no member, then break the party
- mapif_party_broken(p->party_id,0);
- inter_party_tosql(p->party_id,p);
- return 1;
-}
-
-
-// Check if a member is in two party, not necessary :)
-int party_check_conflict(int party_id,int account_id,char *nick)
-{
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚Ö‚Ì’ÊM
-
-// ƒp[ƒeƒB쬉”Û
-int mapif_party_created(int fd,int account_id,struct party *p)
-{
- WFIFOW(fd,0)=0x3820;
- WFIFOL(fd,2)=account_id;
- if(p!=NULL){
- WFIFOB(fd,6)=0;
- WFIFOL(fd,7)=p->party_id;
- memcpy(WFIFOP(fd,11),p->name,24);
- printf("int_party: created! %d %s\n",p->party_id,p->name);
- }else{
- WFIFOB(fd,6)=1;
- WFIFOL(fd,7)=0;
- memcpy(WFIFOP(fd,11),"error",24);
- }
- WFIFOSET(fd,35);
- return 0;
-}
-
-// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
-int mapif_party_noinfo(int fd,int party_id)
-{
- WFIFOW(fd,0)=0x3821;
- WFIFOW(fd,2)=8;
- WFIFOL(fd,4)=party_id;
- WFIFOSET(fd,8);
- printf("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[1024];
- 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));
-// printf("int_party: info %d %s\n",p->party_id,p->name);
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
-int mapif_party_memberadded(int fd,int party_id,int account_id,int flag)
-{
- WFIFOW(fd,0)=0x3822;
- WFIFOL(fd,2)=party_id;
- WFIFOL(fd,6)=account_id;
- WFIFOB(fd,10)=flag;
- WFIFOSET(fd,11);
- 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);
- //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int mapif_party_leaved(int party_id,int account_id,char *name)
-{
- unsigned char buf[64];
- WBUFW(buf,0)=0x3824;
- WBUFL(buf,2)=party_id;
- WBUFL(buf,6)=account_id;
- memcpy(WBUFP(buf,10),name,24);
- mapif_sendall(buf,34);
- //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name);
- return 0;
-}
-// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
-int mapif_party_membermoved(struct party *p,int idx)
-{
- unsigned char buf[32];
- WBUFW(buf,0)=0x3825;
- WBUFL(buf,2)=p->party_id;
- WBUFL(buf,6)=p->member[idx].account_id;
- memcpy(WBUFP(buf,10),p->member[idx].map,16);
- WBUFB(buf,26)=p->member[idx].online;
- WBUFW(buf,27)=p->member[idx].lv;
- mapif_sendall(buf,29);
- 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)
-{
- 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_sendall(buf,len+12);
- return 0;
-}
-
-//-------------------------------------------------------------------
-// map server‚©‚ç‚Ì’ÊM
-
-
-// Create Party
-int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *map,int lv)
-{
- struct party *p;
- if( (p=search_partyname(name))!=NULL){
-// printf("int_party: same name party exists [%s]\n",name);
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- p=party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- mapif_party_created(fd,account_id,NULL);
- return 0;
- }
- memset(p,0,sizeof(struct party));
- p->party_id=party_newid++;
- memcpy(p->name,name,24);
- p->exp=0;
- p->item=0;
- p->member[0].account_id=account_id;
- memcpy(p->member[0].name,nick,24);
- memcpy(p->member[0].map,map,16);
- p->member[0].leader=1;
- p->member[0].online=1;
- p->member[0].lv=lv;
-
- inter_party_tosql(p->party_id,p);
-
- mapif_party_created(fd,account_id,p);
- mapif_party_info(fd,p);
-
- return 0;
-}
-// ƒp[ƒeƒBî•ñ—v‹
-int mapif_parse_PartyInfo(int fd,int party_id)
-{
- struct party *p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id >= 0)
- mapif_party_info(fd,p);
- else
- mapif_party_noinfo(fd,party_id);
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ—v‹
-int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,char *map,int lv)
-{
- struct party *p;
- int i;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- mapif_party_memberadded(fd,party_id,account_id,1);
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id==0){
- int flag=0;
-
- p->member[i].account_id=account_id;
- memcpy(p->member[i].name,nick,24);
- memcpy(p->member[i].map,map,16);
- p->member[i].leader=0;
- p->member[i].online=1;
- p->member[i].lv=lv;
- mapif_party_memberadded(fd,party_id,account_id,0);
- mapif_party_info(-1,p);
-
- if( p->exp>0 && !party_check_exp_share(p) ){
- p->exp=0;
- flag=0x01;
- }
- if(flag)
- mapif_party_optionchanged(fd,p,0,0);
-
- inter_party_tosql(party_id, p);
- return 0;
- }
- }
- mapif_party_memberadded(fd,party_id,account_id,1);
- //inter_party_tosql(party_id, p);
- 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 *p;
- int flag=0;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
-
- p->exp=exp;
- if( exp>0 && !party_check_exp_share(p) ){
- flag|=0x01;
- p->exp=0;
- }
-
- p->item=item;
-
- mapif_party_optionchanged(fd,p,account_id,flag);
- inter_party_tosql(party_id, p);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ—v‹
-int mapif_parse_PartyLeave(int fd,int party_id,int account_id)
-{
- char t_member[24];
- struct party *p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id >= 0){
- int i,j;
- for(i=0;i<MAX_PARTY;i++){
-
- if(p->member[i].account_id==account_id){
- //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id);
- mapif_party_leaved(party_id,account_id,p->member[i].name);
-
-
-
- // Update char information, does the name need encoding?
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'",
- char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Delete member %s from MySQL \n", p->member[i].name);
-
- if (p->member[i].leader==1){
- for(j=0;j<MAX_PARTY;j++)
- {
- //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id);
- if(p->member[j].account_id>0&&j!=i){
- mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name);
- // Update char information, does the name need encoding?
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'",
- char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Delete member %s from MySQL \n", p->member[j].name);
- }
- }
- // Delete the party, if has no member.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-// printf("Leader breaks party %d \n",party_id);
- memset(p, 0, sizeof(struct party));
- }else memset(&p->member[i],0,sizeof(struct party_member));
-
- break;
-
- }
- }
- if( party_check_empty(p)==0 )
- mapif_party_info(-1,p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
- /*
- else
- inter_party_tosql(party_id,p); // Break the party if no member
- */
- }else{
- sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'",
- char_db, party_id, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- return 0;
-}
-// When member goes to other map
-int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int online,int lv)
-{
- struct party *p;
- int i;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id==account_id){
- int flag=0;
-
- memcpy(p->member[i].map,map,16);
- p->member[i].online=online;
- p->member[i].lv=lv;
- mapif_party_membermoved(p,i);
-
- if( p->exp>0 && !party_check_exp_share(p) ){
- p->exp=0;
- flag=1;
- }
- if(flag)
- mapif_party_optionchanged(fd,p,0,0);
- break;
- }
- }
- inter_party_tosql(party_id, p);
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU—v‹
-int mapif_parse_BreakParty(int fd,int party_id)
-{
- struct party *p;
-
- p = party_pt;
- if(p==NULL){
- printf("int_party: out of memory !\n");
- return 0;
- }
-
- inter_party_fromsql(party_id, p);
-
- if(p->party_id <= 0){
- return 0;
- }
- inter_party_tosql(party_id,p);
-
- 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);
-}
-// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
-int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick)
-{
- return party_check_conflict(party_id,account_id,nick);
-}
-
-// 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)
-{
- switch(RFIFOW(fd,0)){
- case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54),RFIFOW(fd,70)); break;
- case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break;
- case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOP(fd,34),RFIFOW(fd,50)); 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)); break;
- case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break;
- case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break;
- case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
- case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(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)
-{
- return mapif_parse_PartyLeave(-1,party_id,account_id);
-}
-
-
-
+//
+// original code from athena
+// SQL conversion by hack
+//
+
+#include "char.h"
+#include "strlib.h"
+#include "socket.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static struct party *party_pt;
+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);
+
+// Save party to mysql
+int inter_party_tosql(int party_id,struct party *p)
+{
+ // 'party' ('party_id','name','exp','item','leader')
+
+ char t_name[100];
+ char t_member[24];
+ int party_member = 0, party_online_member = 0;
+ int party_exist = 0;
+ int leader_id = 0;
+ int i = 0;
+
+ printf("(\033[1;64m%d\033[0m) Request save party - ",party_id);
+
+ jstrescapecpy(t_name, p->name);
+
+ if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) {
+ printf("- Party pointer or party_id error \n");
+ return 0;
+ }
+
+ // Check if party exists
+ sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ 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);
+ party_exist = atoi (sql_row[0]);
+ //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes");
+ }
+ mysql_free_result(sql_res) ; //resource free
+
+ if (party_exist >0){
+ // Check members in party
+ sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ 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);
+
+ party_member = atoi (sql_row[0]);
+ // printf("- Check members in party %d : %d \n",party_id,party_member);
+
+ }
+ mysql_free_result(sql_res) ; //resource free
+
+ party_online_member = 0;
+ i=0;
+ while (i<MAX_PARTY){
+ if (p->member[i].account_id>0) party_online_member++;
+ i++;
+ }
+
+ //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member);
+
+ if (party_member <= 0 && party_online_member == 0) {
+
+ // Delete the party, if has no member.
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ // printf("No member in party %d, break it \n",party_id);
+ memset(p, 0, sizeof(struct party));
+ return 0;
+ } else {
+ // Update party information, if exists
+
+ int i=0;
+
+ for (i=0;i<MAX_PARTY;i++){
+
+ if (p->member[i].account_id>0){
+ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='%d' WHERE `account_id`='%d' AND `name`='%s'",
+ char_db, party_id, p->member[i].online, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name));
+ //printf("%s",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'",
+ party_db, t_name,p->exp,p->item,party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+
+ // printf("- Update party %d information \n",party_id);
+ }
+ } else {
+ // Add new party, if not exist
+ int i = 0;
+ while (i<MAX_PARTY&&((p->member[i].account_id>0&&p->member[i].leader==0)||(p->member[i].account_id<0))) i++;
+ if (i<MAX_PARTY) leader_id = p->member[i].account_id;
+ sprintf(tmp_sql,"INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')",
+ party_db, party_id, t_name, p->exp, p->item,leader_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='1' WHERE `account_id`='%d' AND `name`='%s'",
+ char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //printf("- Insert new party %d \n",party_id);
+ }
+
+ printf("Party save success\n");
+ return 0;
+
+}
+
+// Read party from mysql
+int inter_party_fromsql(int party_id,struct party *p)
+{
+ int leader_id=0;
+ printf("(\033[1;64m%d\033[0m) Request load party - ",party_id);
+
+ memset(p, 0, sizeof(struct party));
+
+ sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
+ 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);
+ // printf("- Read party %d from MySQL\n",party_id);
+ p->party_id = party_id;
+ strcpy(p->name, sql_row[1]);
+ p->exp = atoi(sql_row[2]);
+ p->item = atoi(sql_row[3]);
+ leader_id = atoi(sql_row[4]);
+ } else {
+ mysql_free_result(sql_res);
+ // printf("- Cannot find party %d \n",party_id);
+ return 0;
+ }
+
+ mysql_free_result(sql_res);
+
+ // Load members
+ sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ struct party_member *m = &p->member[i];
+ m->account_id = atoi(sql_row[0]);
+ if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
+ strncpy(m->name,sql_row[1],sizeof(m->name));
+ m->lv = atoi(sql_row[2]);
+ strncpy(m->map,sql_row[3],sizeof(m->map));
+ m->online = atoi(sql_row[4]);
+ }
+ // printf("- %d members found in party %d \n",i,party_id);
+ }
+ mysql_free_result(sql_res);
+
+
+ printf("Party load success\n");
+ return 0;
+
+}
+
+int inter_party_sql_init(){
+ int i;
+
+ //memory alloc
+ printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party));
+ party_pt = calloc(sizeof(struct party), 1);
+
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'", char_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ printf("total party data -> '%s'.......\n",sql_row[0]);
+ i = atoi (sql_row[0]);
+ mysql_free_result(sql_res);
+
+ if (i > 0) {
+ //set party_newid
+ sprintf (tmp_sql , "SELECT max(`party_id`) FROM `%s`", party_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ sql_row = mysql_fetch_row(sql_res);
+ party_newid = atoi (sql_row[0])+1;
+ mysql_free_result(sql_res);
+ }
+
+ printf("set party_newid: %d.......\n",party_newid);
+
+ return 0;
+}
+
+
+// Search for the party according to its name
+struct party* search_partyname(char *str)
+{
+ struct party *p=NULL;
+ int leader_id = 0;
+ char t_name[24];
+
+ sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res==NULL || mysql_num_rows(sql_res)<=0) { mysql_free_result(sql_res); return p; }
+ sql_row = mysql_fetch_row(sql_res);
+ p = party_pt;
+ p->party_id = atoi(sql_row[0]);
+ strcpy(p->name, sql_row[1]);
+ p->exp = atoi(sql_row[2]);
+ p->item = atoi(sql_row[3]);
+ leader_id = atoi(sql_row[4]);
+ mysql_free_result(sql_res);
+
+ // Load members
+ sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, p->party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) );
+ return 0;
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
+ int i;
+ for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
+ struct party_member *m = &p->member[i];
+ m->account_id = atoi(sql_row[0]);
+ if (m->account_id == leader_id) m->leader = 1; else m->leader = 0;
+ strncpy(m->name,sql_row[1],sizeof(m->name));
+ m->lv = atoi(sql_row[2]);
+ strncpy(m->map,sql_row[3],sizeof(m->map));
+ m->online = atoi(sql_row[4]);
+ }
+ printf("- %d members found in party %d \n",i,p->party_id);
+ }
+ mysql_free_result(sql_res);
+
+ return p;
+}
+
+// EXPŒö•½•ª”z‚Å‚«‚é‚©ƒ`ƒFƒbƒN
+int party_check_exp_share(struct party *p)
+{
+ int i;
+ int maxlv=0,minlv=0x7fffffff;
+ for(i=0;i<MAX_PARTY;i++){
+ int lv=p->member[i].lv;
+ if( p->member[i].online ){
+ if( lv < minlv ) minlv=lv;
+ if( maxlv < lv ) maxlv=lv;
+ }
+ }
+ return (maxlv==0 || maxlv-minlv<=party_share_level);
+}
+// Is there any member in the party?
+int party_check_empty(struct party *p)
+{
+ int i;
+ if (p==NULL||p->party_id==0) return 1;
+// printf("party check empty %08X\n",(int)p);
+ for(i=0;i<MAX_PARTY;i++){
+// printf("%d acc=%d\n",i,p->member[i].account_id);
+ if(p->member[i].account_id>0){
+ return 0;
+ }
+ }
+ // If there is no member, then break the party
+ mapif_party_broken(p->party_id,0);
+ inter_party_tosql(p->party_id,p);
+ return 1;
+}
+
+
+// Check if a member is in two party, not necessary :)
+int party_check_conflict(int party_id,int account_id,char *nick)
+{
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚Ö‚Ì’ÊM
+
+// ƒp[ƒeƒB쬉”Û
+int mapif_party_created(int fd,int account_id,struct party *p)
+{
+ WFIFOW(fd,0)=0x3820;
+ WFIFOL(fd,2)=account_id;
+ if(p!=NULL){
+ WFIFOB(fd,6)=0;
+ WFIFOL(fd,7)=p->party_id;
+ memcpy(WFIFOP(fd,11),p->name,24);
+ printf("int_party: created! %d %s\n",p->party_id,p->name);
+ }else{
+ WFIFOB(fd,6)=1;
+ WFIFOL(fd,7)=0;
+ memcpy(WFIFOP(fd,11),"error",24);
+ }
+ WFIFOSET(fd,35);
+ return 0;
+}
+
+// ƒp[ƒeƒBî•ñŒ©‚‚©‚炸
+int mapif_party_noinfo(int fd,int party_id)
+{
+ WFIFOW(fd,0)=0x3821;
+ WFIFOW(fd,2)=8;
+ WFIFOL(fd,4)=party_id;
+ WFIFOSET(fd,8);
+ printf("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[1024];
+ 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));
+// printf("int_party: info %d %s\n",p->party_id,p->name);
+ return 0;
+}
+// ƒp[ƒeƒBƒƒ“ƒo’ljÁ‰Â”Û
+int mapif_party_memberadded(int fd,int party_id,int account_id,int flag)
+{
+ WFIFOW(fd,0)=0x3822;
+ WFIFOL(fd,2)=party_id;
+ WFIFOL(fd,6)=account_id;
+ WFIFOB(fd,10)=flag;
+ WFIFOSET(fd,11);
+ 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);
+ //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag);
+ return 0;
+}
+// ƒp[ƒeƒB’E‘Þ’Ê’m
+int mapif_party_leaved(int party_id,int account_id,char *name)
+{
+ unsigned char buf[64];
+ WBUFW(buf,0)=0x3824;
+ WBUFL(buf,2)=party_id;
+ WBUFL(buf,6)=account_id;
+ memcpy(WBUFP(buf,10),name,24);
+ mapif_sendall(buf,34);
+ //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name);
+ return 0;
+}
+// ƒp[ƒeƒBƒ}ƒbƒvXV’Ê’m
+int mapif_party_membermoved(struct party *p,int idx)
+{
+ unsigned char buf[32];
+ WBUFW(buf,0)=0x3825;
+ WBUFL(buf,2)=p->party_id;
+ WBUFL(buf,6)=p->member[idx].account_id;
+ memcpy(WBUFP(buf,10),p->member[idx].map,16);
+ WBUFB(buf,26)=p->member[idx].online;
+ WBUFW(buf,27)=p->member[idx].lv;
+ mapif_sendall(buf,29);
+ 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)
+{
+ 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_sendall(buf,len+12);
+ return 0;
+}
+
+//-------------------------------------------------------------------
+// map server‚©‚ç‚Ì’ÊM
+
+
+// Create Party
+int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *map,int lv)
+{
+ struct party *p;
+ if( (p=search_partyname(name))!=NULL){
+// printf("int_party: same name party exists [%s]\n",name);
+ mapif_party_created(fd,account_id,NULL);
+ return 0;
+ }
+ p=party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ mapif_party_created(fd,account_id,NULL);
+ return 0;
+ }
+ memset(p,0,sizeof(struct party));
+ p->party_id=party_newid++;
+ memcpy(p->name,name,24);
+ p->exp=0;
+ p->item=0;
+ p->member[0].account_id=account_id;
+ memcpy(p->member[0].name,nick,24);
+ memcpy(p->member[0].map,map,16);
+ p->member[0].leader=1;
+ p->member[0].online=1;
+ p->member[0].lv=lv;
+
+ inter_party_tosql(p->party_id,p);
+
+ mapif_party_created(fd,account_id,p);
+ mapif_party_info(fd,p);
+
+ return 0;
+}
+// ƒp[ƒeƒBî•ñ—v‹
+int mapif_parse_PartyInfo(int fd,int party_id)
+{
+ struct party *p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id >= 0)
+ mapif_party_info(fd,p);
+ else
+ mapif_party_noinfo(fd,party_id);
+ return 0;
+}
+// ƒp[ƒeƒB’ljÁ—v‹
+int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,char *map,int lv)
+{
+ struct party *p;
+ int i;
+
+ p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id <= 0){
+ mapif_party_memberadded(fd,party_id,account_id,1);
+ return 0;
+ }
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->member[i].account_id==0){
+ int flag=0;
+
+ p->member[i].account_id=account_id;
+ memcpy(p->member[i].name,nick,24);
+ memcpy(p->member[i].map,map,16);
+ p->member[i].leader=0;
+ p->member[i].online=1;
+ p->member[i].lv=lv;
+ mapif_party_memberadded(fd,party_id,account_id,0);
+ mapif_party_info(-1,p);
+
+ if( p->exp>0 && !party_check_exp_share(p) ){
+ p->exp=0;
+ flag=0x01;
+ }
+ if(flag)
+ mapif_party_optionchanged(fd,p,0,0);
+
+ inter_party_tosql(party_id, p);
+ return 0;
+ }
+ }
+ mapif_party_memberadded(fd,party_id,account_id,1);
+ //inter_party_tosql(party_id, p);
+ 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 *p;
+ int flag=0;
+
+ p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id <= 0){
+ return 0;
+ }
+
+ p->exp=exp;
+ if( exp>0 && !party_check_exp_share(p) ){
+ flag|=0x01;
+ p->exp=0;
+ }
+
+ p->item=item;
+
+ mapif_party_optionchanged(fd,p,account_id,flag);
+ inter_party_tosql(party_id, p);
+ return 0;
+}
+// ƒp[ƒeƒB’E‘Þ—v‹
+int mapif_parse_PartyLeave(int fd,int party_id,int account_id)
+{
+ char t_member[24];
+ struct party *p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id >= 0){
+ int i,j;
+ for(i=0;i<MAX_PARTY;i++){
+
+ if(p->member[i].account_id==account_id){
+ //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id);
+ mapif_party_leaved(party_id,account_id,p->member[i].name);
+
+
+
+ // Update char information, does the name need encoding?
+ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'",
+ char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+// printf("Delete member %s from MySQL \n", p->member[i].name);
+
+ if (p->member[i].leader==1){
+ for(j=0;j<MAX_PARTY;j++)
+ {
+ //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id);
+ if(p->member[j].account_id>0&&j!=i){
+ mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name);
+ // Update char information, does the name need encoding?
+ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'",
+ char_db, party_id, jstrescapecpy(t_member,p->member[i].name));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+// printf("Delete member %s from MySQL \n", p->member[j].name);
+ }
+ }
+ // Delete the party, if has no member.
+ sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+// printf("Leader breaks party %d \n",party_id);
+ memset(p, 0, sizeof(struct party));
+ }else memset(&p->member[i],0,sizeof(struct party_member));
+
+ break;
+
+ }
+ }
+ if( party_check_empty(p)==0 )
+ mapif_party_info(-1,p);// ‚Ü‚¾l‚ª‚¢‚é‚̂Ńf[ƒ^‘—M
+ /*
+ else
+ inter_party_tosql(party_id,p); // Break the party if no member
+ */
+ }else{
+ sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'",
+ char_db, party_id, account_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ return 0;
+}
+// When member goes to other map
+int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int online,int lv)
+{
+ struct party *p;
+ int i;
+
+ p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id <= 0){
+ return 0;
+ }
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->member[i].account_id==account_id){
+ int flag=0;
+
+ memcpy(p->member[i].map,map,16);
+ p->member[i].online=online;
+ p->member[i].lv=lv;
+ mapif_party_membermoved(p,i);
+
+ if( p->exp>0 && !party_check_exp_share(p) ){
+ p->exp=0;
+ flag=1;
+ }
+ if(flag)
+ mapif_party_optionchanged(fd,p,0,0);
+ break;
+ }
+ }
+ inter_party_tosql(party_id, p);
+ return 0;
+}
+// ƒp[ƒeƒB‰ðŽU—v‹
+int mapif_parse_BreakParty(int fd,int party_id)
+{
+ struct party *p;
+
+ p = party_pt;
+ if(p==NULL){
+ printf("int_party: out of memory !\n");
+ return 0;
+ }
+
+ inter_party_fromsql(party_id, p);
+
+ if(p->party_id <= 0){
+ return 0;
+ }
+ inter_party_tosql(party_id,p);
+
+ 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);
+}
+// ƒp[ƒeƒBƒ`ƒFƒbƒN—v‹
+int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick)
+{
+ return party_check_conflict(party_id,account_id,nick);
+}
+
+// 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)
+{
+ switch(RFIFOW(fd,0)){
+ case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54),RFIFOW(fd,70)); break;
+ case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break;
+ case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOP(fd,34),RFIFOW(fd,50)); 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)); break;
+ case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break;
+ case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break;
+ case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break;
+ case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(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)
+{
+ return mapif_parse_PartyLeave(-1,party_id,account_id);
+}
+
+
+
diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h
index 131b9bf98..04f71c881 100644
--- a/src/char_sql/int_party.h
+++ b/src/char_sql/int_party.h
@@ -1,8 +1,8 @@
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_parse_frommap(int fd);
-int inter_party_sql_init();
-int inter_party_leave(int party_id,int account_id);
-
-#endif
+#ifndef _INT_PARTY_H_
+#define _INT_PARTY_H_
+
+int inter_party_parse_frommap(int fd);
+int inter_party_sql_init();
+int inter_party_leave(int party_id,int account_id);
+
+#endif
diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c
index 1c94723f6..14d2144c7 100644
--- a/src/char_sql/int_pet.c
+++ b/src/char_sql/int_pet.c
@@ -1,324 +1,324 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-#include "char.h"
-#include "strlib.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-struct s_pet *pet_pt;
-static int pet_newid = 100;
-
-
-//---------------------------------------------------------
-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[100];
-
- printf("request save pet: %d.......\n",pet_id);
-
- 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;
- sprintf(tmp_sql,"SELECT * FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0)
- //row reside -> updating
- 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);
- else //no row -> insert
- sprintf(tmp_sql,"INSERT INTO `%s` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- pet_db, pet_id, 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);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (inset/update `pet`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- printf("pet save success.......\n");
- return 0;
-}
-
-int inter_pet_fromsql(int pet_id, struct s_pet *p){
-
- printf("request load pet: %d.......\n",pet_id);
-
- 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) ) {
- printf("DB server Error (select `pet`)- %s\n", mysql_error(&mysql_handle) );
- 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],24);
- 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);
-
- printf("pet load success.......\n");
- return 0;
-}
-//----------------------------------------------
-
-int inter_pet_sql_init(){
- int i;
-
- //memory alloc
- printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet));
- pet_pt = calloc(sizeof(struct s_pet), 1);
-
- sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- exit(0);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res);
- printf("total pet data -> '%s'.......\n",sql_row[0]);
- i = atoi (sql_row[0]);
- mysql_free_result(sql_res);
-
- if (i > 0) {
- //set pet_newid
- sprintf (tmp_sql , "SELECT max(`pet_id`) FROM `%s`",pet_db );
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
-
- sql_row = mysql_fetch_row(sql_res);
- pet_newid = atoi (sql_row[0])+1; //should SET MAX existing PET ID + 1 [Lupus]
- mysql_free_result(sql_res);
- }
-
- printf("set pet_newid: %d.......\n",pet_newid);
-
- return 0;
-}
-//----------------------------------
-int inter_pet_delete(int pet_id){
- printf("request delete pet: %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) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- return 0;
-}
-//------------------------------------------------------
-int mapif_pet_created(int fd, int account_id, struct s_pet *p)
-{
- WFIFOW(fd, 0) =0x3880;
- WFIFOL(fd, 2) =account_id;
- if(p!=NULL){
- WFIFOB(fd, 6)=0;
- WFIFOL(fd, 7) =p->pet_id;
- printf("int_pet: created! %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){
- 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){
- 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){
- 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){
- WFIFOW(fd, 0) =0x3883;
- WFIFOB(fd, 2) =flag;
- WFIFOSET(fd, 3);
-
- 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));
- pet_pt->pet_id = pet_newid++;
- memcpy(pet_pt->name, pet_name, 24);
- 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;
-
- inter_pet_tosql(pet_pt->pet_id,pet_pt);
-
- mapif_pet_created(fd, account_id, pet_pt);
-
- 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=RFIFOW(fd, 2);
- if(sizeof(struct s_pet)!=len-8) {
- printf("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_parse_CreatePet(int fd){
- mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOL(fd, 18),
- RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), RFIFOP(fd, 24));
- return 0;
-}
-
-int mapif_parse_LoadPet(int fd){
- mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
- return 0;
-}
-
-int mapif_parse_SavePet(int fd){
- mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8));
- return 0;
-}
-
-int mapif_parse_DeletePet(int fd){
- mapif_delete_pet(fd, RFIFOL(fd, 2));
- return 0;
-}
-
-int inter_pet_parse_frommap(int 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;
- default:
- return 0;
- }
- return 1;
-}
-
+//
+// original code from athena
+// SQL conversion by Jioh L. Jung
+//
+#include "char.h"
+#include "strlib.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct s_pet *pet_pt;
+static int pet_newid = 100;
+
+
+//---------------------------------------------------------
+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[100];
+
+ printf("request save pet: %d.......\n",pet_id);
+
+ 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;
+ sprintf(tmp_sql,"SELECT * FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res!=NULL && mysql_num_rows(sql_res)>0)
+ //row reside -> updating
+ 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);
+ else //no row -> insert
+ sprintf(tmp_sql,"INSERT INTO `%s` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ pet_db, pet_id, 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);
+ mysql_free_result(sql_res) ; //resource free
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (inset/update `pet`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ printf("pet save success.......\n");
+ return 0;
+}
+
+int inter_pet_fromsql(int pet_id, struct s_pet *p){
+
+ printf("request load pet: %d.......\n",pet_id);
+
+ 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) ) {
+ printf("DB server Error (select `pet`)- %s\n", mysql_error(&mysql_handle) );
+ 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],24);
+ 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);
+
+ printf("pet load success.......\n");
+ return 0;
+}
+//----------------------------------------------
+
+int inter_pet_sql_init(){
+ int i;
+
+ //memory alloc
+ printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet));
+ pet_pt = calloc(sizeof(struct s_pet), 1);
+
+ sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ exit(0);
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res);
+ printf("total pet data -> '%s'.......\n",sql_row[0]);
+ i = atoi (sql_row[0]);
+ mysql_free_result(sql_res);
+
+ if (i > 0) {
+ //set pet_newid
+ sprintf (tmp_sql , "SELECT max(`pet_id`) FROM `%s`",pet_db );
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ sql_row = mysql_fetch_row(sql_res);
+ pet_newid = atoi (sql_row[0])+1; //should SET MAX existing PET ID + 1 [Lupus]
+ mysql_free_result(sql_res);
+ }
+
+ printf("set pet_newid: %d.......\n",pet_newid);
+
+ return 0;
+}
+//----------------------------------
+int inter_pet_delete(int pet_id){
+ printf("request delete pet: %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) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ return 0;
+}
+//------------------------------------------------------
+int mapif_pet_created(int fd, int account_id, struct s_pet *p)
+{
+ WFIFOW(fd, 0) =0x3880;
+ WFIFOL(fd, 2) =account_id;
+ if(p!=NULL){
+ WFIFOB(fd, 6)=0;
+ WFIFOL(fd, 7) =p->pet_id;
+ printf("int_pet: created! %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){
+ 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){
+ 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){
+ 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){
+ WFIFOW(fd, 0) =0x3883;
+ WFIFOB(fd, 2) =flag;
+ WFIFOSET(fd, 3);
+
+ 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));
+ pet_pt->pet_id = pet_newid++;
+ memcpy(pet_pt->name, pet_name, 24);
+ 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;
+
+ inter_pet_tosql(pet_pt->pet_id,pet_pt);
+
+ mapif_pet_created(fd, account_id, pet_pt);
+
+ 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=RFIFOW(fd, 2);
+ if(sizeof(struct s_pet)!=len-8) {
+ printf("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_parse_CreatePet(int fd){
+ mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOL(fd, 18),
+ RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), RFIFOP(fd, 24));
+ return 0;
+}
+
+int mapif_parse_LoadPet(int fd){
+ mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10));
+ return 0;
+}
+
+int mapif_parse_SavePet(int fd){
+ mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8));
+ return 0;
+}
+
+int mapif_parse_DeletePet(int fd){
+ mapif_delete_pet(fd, RFIFOL(fd, 2));
+ return 0;
+}
+
+int inter_pet_parse_frommap(int 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;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h
index d90154143..b6e3f1bbf 100644
--- a/src/char_sql/int_pet.h
+++ b/src/char_sql/int_pet.h
@@ -1,12 +1,12 @@
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-int inter_pet_sql_init();
-//extern char pet_txt[256];
-
-#endif
+#ifndef _INT_PET_H_
+#define _INT_PET_H_
+
+int inter_pet_init();
+int inter_pet_save();
+int inter_pet_delete(int pet_id);
+
+int inter_pet_parse_frommap(int fd);
+int inter_pet_sql_init();
+//extern char pet_txt[256];
+
+#endif
diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c
index 7277466c1..7c8c8ce4a 100644
--- a/src/char_sql/int_storage.c
+++ b/src/char_sql/int_storage.c
@@ -1,360 +1,360 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-#include "char.h"
-#include "itemdb.h"
-#include <string.h>
-#include <stdlib.h>
-
-#define STORAGE_MEMINC 16
-
-// reset by inter_config_read()
-struct storage *storage_pt=NULL;
-struct guild_storage *guild_storage_pt=NULL;
-
-
-// storage data -> DB conversion
-int storage_tosql(int account_id,struct storage *p){
- int i;
- int eqcount=1;
- int noteqcount=1;
- struct itemtemp mapitem;
- for(i=0;i<MAX_STORAGE;i++){
- if(p->storage[i].nameid>0){
- if(itemdb_isequip(p->storage[i].nameid)==1){
- mapitem.equip[eqcount].flag=0;
- mapitem.equip[eqcount].id = p->storage[i].id;
- mapitem.equip[eqcount].nameid=p->storage[i].nameid;
- mapitem.equip[eqcount].amount = p->storage[i].amount;
- mapitem.equip[eqcount].equip = p->storage[i].equip;
- mapitem.equip[eqcount].identify = p->storage[i].identify;
- mapitem.equip[eqcount].refine = p->storage[i].refine;
- mapitem.equip[eqcount].attribute = p->storage[i].attribute;
- mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
- mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
- mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
- mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
- eqcount++;
- }
- else if(itemdb_isequip(p->storage[i].nameid)==0){
- mapitem.notequip[noteqcount].flag=0;
- mapitem.notequip[noteqcount].id = p->storage[i].id;
- mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
- mapitem.notequip[noteqcount].amount = p->storage[i].amount;
- mapitem.notequip[noteqcount].equip = p->storage[i].equip;
- mapitem.notequip[noteqcount].identify = p->storage[i].identify;
- mapitem.notequip[noteqcount].refine = p->storage[i].refine;
- mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
- mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
- mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
- mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
- mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
- noteqcount++;
- }
- }
- }
-
- memitemdata_to_sql(mapitem, eqcount, noteqcount, account_id,TABLE_STORAGE);
-
- //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
- return 0;
-}
-
-// DB -> storage data conversion
-int storage_fromsql(int account_id, struct storage *p){
- int i=0;
-
- 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`}
- sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) { //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]);
- p->storage[i].card[0]= atoi(sql_row[7]);
- p->storage[i].card[1]= atoi(sql_row[8]);
- p->storage[i].card[2]= atoi(sql_row[9]);
- p->storage[i].card[3]= atoi(sql_row[10]);
- p->storage_amount = ++i;
- }
- mysql_free_result(sql_res);
- }
-
- printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
- return 1;
-}
-
-// Save guild_storage data to sql
-int guild_storage_tosql(int guild_id, struct guild_storage *p){
- int i;
- int eqcount=1;
- int noteqcount=1;
- struct itemtemp mapitem;
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(p->storage[i].nameid>0){
- if(itemdb_isequip(p->storage[i].nameid)==1){
- mapitem.equip[eqcount].flag=0;
- mapitem.equip[eqcount].id = p->storage[i].id;
- mapitem.equip[eqcount].nameid=p->storage[i].nameid;
- mapitem.equip[eqcount].amount = p->storage[i].amount;
- mapitem.equip[eqcount].equip = p->storage[i].equip;
- mapitem.equip[eqcount].identify = p->storage[i].identify;
- mapitem.equip[eqcount].refine = p->storage[i].refine;
- mapitem.equip[eqcount].attribute = p->storage[i].attribute;
- mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
- mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
- mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
- mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
- eqcount++;
- }
- else if(itemdb_isequip(p->storage[i].nameid)==0){
- mapitem.notequip[noteqcount].flag=0;
- mapitem.notequip[noteqcount].id = p->storage[i].id;
- mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
- mapitem.notequip[noteqcount].amount = p->storage[i].amount;
- mapitem.notequip[noteqcount].equip = p->storage[i].equip;
- mapitem.notequip[noteqcount].identify = p->storage[i].identify;
- mapitem.notequip[noteqcount].refine = p->storage[i].refine;
- mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
- mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
- mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
- mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
- mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
- noteqcount++;
- }
- }
- }
-
- memitemdata_to_sql(mapitem, eqcount, noteqcount, guild_id,TABLE_GUILD_STORAGE);
-
- printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
- return 0;
-}
-
-// Load guild_storage data to mem
-int guild_storage_fromsql(int guild_id, struct guild_storage *p){
- int i=0;
- struct guild_storage *gs=guild_storage_pt;
- 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`}
- sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) { //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]);
- p->storage[i].card[0]= atoi(sql_row[7]);
- p->storage[i].card[1]= atoi(sql_row[8]);
- p->storage[i].card[2]= atoi(sql_row[9]);
- p->storage[i].card[3]= atoi(sql_row[10]);
- p->storage_amount = ++i;
- }
- mysql_free_result(sql_res);
- }
- printf ("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(){
-
- //memory alloc
- printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
- storage_pt=calloc(sizeof(struct storage), 1);
- guild_storage_pt=calloc(sizeof(struct guild_storage), 1);
- memset(storage_pt,0,sizeof(struct storage));
- memset(guild_storage_pt,0,sizeof(struct guild_storage));
-
- return 1;
-}
-// ‘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) ) {
- printf("DB server Error (delete `storage`)- %s\n", mysql_error(&mysql_handle) );
- }
- 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) ) {
- printf("DB server Error (delete `guild_storage`)- %s\n", mysql_error(&mysql_handle) );
- }
- return 0;
-}
-
-//---------------------------------------------------------
-// packet from map server
-
-// recive packet about storage data
-int mapif_load_storage(int fd,int account_id){
- //load from DB
- 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){
- 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=0;
- WFIFOW(fd,0)=0x3818;
-
- // 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) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- 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
-
- 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)
-{
- 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){
- mapif_load_storage(fd,RFIFOL(fd,2));
- return 0;
-}
-// storage data recive and save
-int mapif_parse_SaveStorage(int fd){
- int account_id=RFIFOL(fd,4);
- int len=RFIFOW(fd,2);
-
- if(sizeof(struct storage)!=len-8){
- printf("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)
-{
- mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-
-int mapif_parse_SaveGuildStorage(int fd)
-{
- int guild_exist=0;
- int guild_id=RFIFOL(fd,8);
- int len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
- }
- else {
- // 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) ) {
- printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
- }
- 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
-
- 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){
- 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;
-}
-
+//
+// original code from athena
+// SQL conversion by Jioh L. Jung
+//
+#include "char.h"
+#include "itemdb.h"
+#include <string.h>
+#include <stdlib.h>
+
+#define STORAGE_MEMINC 16
+
+// reset by inter_config_read()
+struct storage *storage_pt=NULL;
+struct guild_storage *guild_storage_pt=NULL;
+
+
+// storage data -> DB conversion
+int storage_tosql(int account_id,struct storage *p){
+ int i;
+ int eqcount=1;
+ int noteqcount=1;
+ struct itemtemp mapitem;
+ for(i=0;i<MAX_STORAGE;i++){
+ if(p->storage[i].nameid>0){
+ if(itemdb_isequip(p->storage[i].nameid)==1){
+ mapitem.equip[eqcount].flag=0;
+ mapitem.equip[eqcount].id = p->storage[i].id;
+ mapitem.equip[eqcount].nameid=p->storage[i].nameid;
+ mapitem.equip[eqcount].amount = p->storage[i].amount;
+ mapitem.equip[eqcount].equip = p->storage[i].equip;
+ mapitem.equip[eqcount].identify = p->storage[i].identify;
+ mapitem.equip[eqcount].refine = p->storage[i].refine;
+ mapitem.equip[eqcount].attribute = p->storage[i].attribute;
+ mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
+ mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
+ mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
+ mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
+ eqcount++;
+ }
+ else if(itemdb_isequip(p->storage[i].nameid)==0){
+ mapitem.notequip[noteqcount].flag=0;
+ mapitem.notequip[noteqcount].id = p->storage[i].id;
+ mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
+ mapitem.notequip[noteqcount].amount = p->storage[i].amount;
+ mapitem.notequip[noteqcount].equip = p->storage[i].equip;
+ mapitem.notequip[noteqcount].identify = p->storage[i].identify;
+ mapitem.notequip[noteqcount].refine = p->storage[i].refine;
+ mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
+ mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
+ mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
+ mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
+ mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
+ noteqcount++;
+ }
+ }
+ }
+
+ memitemdata_to_sql(mapitem, eqcount, noteqcount, account_id,TABLE_STORAGE);
+
+ //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
+ return 0;
+}
+
+// DB -> storage data conversion
+int storage_fromsql(int account_id, struct storage *p){
+ int i=0;
+
+ 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`}
+ sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res))) { //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]);
+ p->storage[i].card[0]= atoi(sql_row[7]);
+ p->storage[i].card[1]= atoi(sql_row[8]);
+ p->storage[i].card[2]= atoi(sql_row[9]);
+ p->storage[i].card[3]= atoi(sql_row[10]);
+ p->storage_amount = ++i;
+ }
+ mysql_free_result(sql_res);
+ }
+
+ printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
+ return 1;
+}
+
+// Save guild_storage data to sql
+int guild_storage_tosql(int guild_id, struct guild_storage *p){
+ int i;
+ int eqcount=1;
+ int noteqcount=1;
+ struct itemtemp mapitem;
+ for(i=0;i<MAX_GUILD_STORAGE;i++){
+ if(p->storage[i].nameid>0){
+ if(itemdb_isequip(p->storage[i].nameid)==1){
+ mapitem.equip[eqcount].flag=0;
+ mapitem.equip[eqcount].id = p->storage[i].id;
+ mapitem.equip[eqcount].nameid=p->storage[i].nameid;
+ mapitem.equip[eqcount].amount = p->storage[i].amount;
+ mapitem.equip[eqcount].equip = p->storage[i].equip;
+ mapitem.equip[eqcount].identify = p->storage[i].identify;
+ mapitem.equip[eqcount].refine = p->storage[i].refine;
+ mapitem.equip[eqcount].attribute = p->storage[i].attribute;
+ mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
+ mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
+ mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
+ mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
+ eqcount++;
+ }
+ else if(itemdb_isequip(p->storage[i].nameid)==0){
+ mapitem.notequip[noteqcount].flag=0;
+ mapitem.notequip[noteqcount].id = p->storage[i].id;
+ mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
+ mapitem.notequip[noteqcount].amount = p->storage[i].amount;
+ mapitem.notequip[noteqcount].equip = p->storage[i].equip;
+ mapitem.notequip[noteqcount].identify = p->storage[i].identify;
+ mapitem.notequip[noteqcount].refine = p->storage[i].refine;
+ mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
+ mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
+ mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
+ mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
+ mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
+ noteqcount++;
+ }
+ }
+ }
+
+ memitemdata_to_sql(mapitem, eqcount, noteqcount, guild_id,TABLE_GUILD_STORAGE);
+
+ printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
+ return 0;
+}
+
+// Load guild_storage data to mem
+int guild_storage_fromsql(int guild_id, struct guild_storage *p){
+ int i=0;
+ struct guild_storage *gs=guild_storage_pt;
+ 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`}
+ sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res))) { //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]);
+ p->storage[i].card[0]= atoi(sql_row[7]);
+ p->storage[i].card[1]= atoi(sql_row[8]);
+ p->storage[i].card[2]= atoi(sql_row[9]);
+ p->storage[i].card[3]= atoi(sql_row[10]);
+ p->storage_amount = ++i;
+ }
+ mysql_free_result(sql_res);
+ }
+ printf ("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(){
+
+ //memory alloc
+ printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
+ storage_pt=calloc(sizeof(struct storage), 1);
+ guild_storage_pt=calloc(sizeof(struct guild_storage), 1);
+ memset(storage_pt,0,sizeof(struct storage));
+ memset(guild_storage_pt,0,sizeof(struct guild_storage));
+
+ return 1;
+}
+// ‘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) ) {
+ printf("DB server Error (delete `storage`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ 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) ) {
+ printf("DB server Error (delete `guild_storage`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ return 0;
+}
+
+//---------------------------------------------------------
+// packet from map server
+
+// recive packet about storage data
+int mapif_load_storage(int fd,int account_id){
+ //load from DB
+ 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){
+ 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=0;
+ WFIFOW(fd,0)=0x3818;
+
+ // 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) ) {
+ printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ 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
+
+ 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)
+{
+ 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){
+ mapif_load_storage(fd,RFIFOL(fd,2));
+ return 0;
+}
+// storage data recive and save
+int mapif_parse_SaveStorage(int fd){
+ int account_id=RFIFOL(fd,4);
+ int len=RFIFOW(fd,2);
+
+ if(sizeof(struct storage)!=len-8){
+ printf("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)
+{
+ mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
+ return 0;
+}
+
+int mapif_parse_SaveGuildStorage(int fd)
+{
+ int guild_exist=0;
+ int guild_id=RFIFOL(fd,8);
+ int len=RFIFOW(fd,2);
+ if(sizeof(struct guild_storage)!=len-12){
+ printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
+ }
+ else {
+ // 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) ) {
+ printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ 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
+
+ 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){
+ 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;
+}
+
diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h
index 8aac5ccee..f9f37db3e 100644
--- a/src/char_sql/int_storage.h
+++ b/src/char_sql/int_storage.h
@@ -1,13 +1,13 @@
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_sql_init();
-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[256];
-
-#endif
+#ifndef _INT_STORAGE_H_
+#define _INT_STORAGE_H_
+
+int inter_storage_sql_init();
+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[256];
+
+#endif
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c
index 2922674ff..9c10cf6c5 100644
--- a/src/char_sql/inter.c
+++ b/src/char_sql/inter.c
@@ -1,577 +1,577 @@
-//
-// original code from athena
-// SQL conversion by Jioh L. Jung
-//
-
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
-#include "strlib.h"
-#include "inter.h"
-#include "int_party.h"
-#include "int_guild.h"
-#include "int_storage.h"
-#include "int_pet.h"
-#include "lock.h"
-
-#define WISDATA_TTL (60*1000) // Wisƒf[ƒ^‚̶‘¶ŽžŠÔ(60•b)
-#define WISDELLIST_MAX 256 // Wisƒf[ƒ^휃ŠƒXƒg‚Ì—v‘f”
-
-
-struct accreg {
- int account_id,reg_num;
- struct global_reg reg[ACCOUNT_REG_NUM];
-};
-
-static struct accreg *accreg_pt;
-
-
-int party_share_level = 10;
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-MYSQL lmysql_handle;
-char tmp_lsql[65535];
-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";
-
-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";
-
-// sending packet list
-int inter_send_packet_length[]={
- -1,-1,27, 0, -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-// recv. packet list
-int inter_recv_packet_length[]={
- -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 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,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-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;
-
-//--------------------------------------------------------
-// Save account_reg to sql (type=2)
-int inter_accreg_tosql(int account_id,struct accreg *reg){
-
- int j;
- char temp_str[32];
- if (account_id<=0) return 0;
- reg->account_id=account_id;
-
- //`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);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- 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`, `str`, `value`) VALUES (2,'%d', '%s','%d')",
- reg_db, reg->account_id, jstrescapecpy(temp_str,reg->reg[j].str), reg->reg[j].value);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- return 0;
-}
-
-// Load account_reg from sql (type=2)
-int inter_accreg_fromsql(int account_id,struct accreg *reg)
-{
- int j=0;
- if (reg==NULL) return 0;
- memset(reg, 0, sizeof(struct accreg));
- reg->account_id=account_id;
-
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
- memcpy(reg->reg[j].str, sql_row[0],32);
- reg->reg[j].value = atoi(sql_row[1]);
- }
- mysql_free_result(sql_res);
- }
- reg->reg_num=j;
- return 0;
-}
-
-// Initialize
-int inter_accreg_sql_init()
-{
- CREATE(accreg_pt, struct accreg, 1);
- return 0;
-
-}
-
-/*==========================================
- * read config file
- *------------------------------------------
- */
-int inter_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)){
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- if(strcmpi(w1,"char_server_ip")==0){
- strcpy(char_server_ip, w2);
- printf ("set char_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_port")==0){
- char_server_port=atoi(w2);
- printf ("set char_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_id")==0){
- strcpy(char_server_id, w2);
- printf ("set char_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_pw")==0){
- strcpy(char_server_pw, w2);
- printf ("set char_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"char_server_db")==0){
- strcpy(char_server_db, w2);
- printf ("set char_server_db : %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);
- printf ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- printf ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- printf ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- printf ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- }
- else if(strcmpi(w1,"party_share_level")==0){
- party_share_level=atoi(w2);
- if(party_share_level < 0) party_share_level = 0;
- }else if(strcmpi(w1,"import")==0){
- inter_config_read(w2);
- }
- else if(strcmpi(w1,"log_inter")==0){
- log_inter = atoi(w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- }
- }
- fclose(fp);
-
- printf ("success reading interserver configuration\n");
-
- return 0;
-}
-
-// Save interlog into sql
-int inter_log(char *fmt,...)
-{
- char str[255];
- char temp_str[255];
- 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) ) {
- printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- va_end(ap);
- return 0;
-}
-
-
-// initialize
-int inter_init(const char *file)
-{
- //int i;
-
- printf ("interserver initialize...\n");
- inter_config_read(file);
-
- //DB connection initialized
- mysql_init(&mysql_handle);
- printf("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
- printf("%s\n",mysql_error(&mysql_handle));
- exit(1);
- }
- else {
- printf ("Connect Success! (Character Server)\n");
- }
-
- mysql_init(&lmysql_handle);
- printf("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
- printf("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }else {
- printf ("Connect Success! (Login Server)");
- }
- wis_db = numdb_init();
- inter_guild_sql_init();
- inter_storage_sql_init();
- inter_party_sql_init();
-
- inter_pet_sql_init();
- inter_accreg_sql_init();
-
- //printf ("interserver timer initializing : %d sec...\n",autosave_interval);
- //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval);
-
- return 0;
-}
-
-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 char buf[len];
-
- WBUFW(buf, 0) = 0x3800;
- WBUFW(buf, 2) = len;
- memcpy(WBUFP(buf, 4), mes, len-4);
- mapif_sendall(buf, len);
- printf("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes);
- return 0;
-}
-
-// Wis sending
-int mapif_wis_message(struct WisData *wd) {
- unsigned char buf[56 + wd->len];
-
- WBUFW(buf, 0) = 0x3801;
- WBUFW(buf, 2) = 56 +wd->len;
- WBUFL(buf, 4) = wd->id;
- memcpy(WBUFP(buf, 8), wd->src, 24);
- memcpy(WBUFP(buf,32), wd->dst, 24);
- 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)];
- memcpy(WBUFP(buf,0),src,WBUFW(src,2));
- WBUFW(buf, 0)=0x3804;
- mapif_sendallwos(fd,buf,WBUFW(buf,2));
- return 0;
-}
-
-// Send the requested account_reg
-int mapif_account_reg_reply(int fd,int account_id)
-{
- struct accreg *reg=accreg_pt;
- inter_accreg_fromsql(account_id,reg);
-
- WFIFOW(fd,0)=0x3804;
- WFIFOL(fd,4)=account_id;
- if(reg->reg_num==0){
- WFIFOW(fd,2)=8;
- }else{
- int j,p;
- for(j=0,p=8;j<reg->reg_num;j++,p+=36){
- memcpy(WFIFOP(fd,p),reg->reg[j].str,32);
- WFIFOL(fd,p+32)=reg->reg[j].value;
- }
- WFIFOW(fd,2)=p;
- }
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-//--------------------------------------------------------
-
-// Existence check of WISP data
-int check_ttl_wisdata_sub(void *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() {
- unsigned long tick = gettick();
- int i;
-
- do {
- wis_delnum = 0;
- numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
- for(i = 0; i < wis_delnum; i++) {
- struct WisData *wd = numdb_search(wis_db, wis_dellist[i]);
- printf("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
- numdb_erase(wis_db, wd->id);
- free(wd);
- }
- } while(wis_delnum >= WISDELLIST_MAX);
-
- return 0;
-}
-
-//--------------------------------------------------------
-
-// GM message sending
-int mapif_parse_GMmessage(int fd)
-{
- mapif_GMmessage(RFIFOP(fd, 4), RFIFOW(fd, 2));
- return 0;
-}
-
-
-// Wisp/page request to send
-int mapif_parse_WisRequest(int fd) {
- struct WisData* wd;
- static int wisid = 0;
-
- if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
- printf("inter: Wis message size too long.\n");
- return 0;
- } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
- printf("inter: Wis message doesn't exist.\n");
- return 0;
- }
- sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'",char_db, (int) RFIFOP(fd,28));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- 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), 24);
- 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(RFIFOP(fd,28), 0, 24);
- strncpy(RFIFOP(fd,28), sql_row[0], 24);
- // if source is destination, don't ask other servers.
- if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) {
- unsigned char buf[27];
- WBUFW(buf, 0) = 0x3802;
- memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
- 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), 24);
- memcpy(wd->dst, RFIFOP(fd,28), 24);
- memcpy(wd->msg, RFIFOP(fd,52), wd->len);
- wd->tick = gettick();
- numdb_insert(wis_db, wd->id, wd);
- mapif_wis_message(wd);
- }
- }
-
- return 0;
-}
-
-
-// Wisp/page transmission result
-int mapif_parse_WisReply(int fd) {
- int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
- struct WisData *wd = numdb_search(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
- numdb_erase(wis_db, id);
- free(wd);
- }
-
- return 0;
-}
-
-
-// Save account_reg into sql (type=2)
-int mapif_parse_AccReg(int fd)
-{
- int j,p;
- struct accreg *reg=accreg_pt;
- int account_id = RFIFOL(fd,4);
- memset(accreg_pt,0,sizeof(struct accreg));
-
- for(j=0,p=8;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++,p+=36){
- memcpy(reg->reg[j].str,RFIFOP(fd,p),32);
- reg->reg[j].value=RFIFOL(fd,p+32);
- }
- reg->reg_num=j;
-
- inter_accreg_tosql(account_id,reg);
- mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map
- return 0;
-}
-
-// Request the value of account_reg
-int mapif_parse_AccRegRequest(int fd)
-{
-// printf("mapif: accreg request\n");
- return mapif_account_reg_reply(fd,RFIFOL(fd,2));
-}
-
-
-
-//--------------------------------------------------------
-int inter_parse_frommap(int fd)
-{
- int cmd=RFIFOW(fd,0);
- int len=0;
-
- // interŽIŠÇŠ‚©‚𒲂ׂé
- if(cmd<0x3000 || cmd>=0x3000+( sizeof(inter_recv_packet_length)/
- sizeof(inter_recv_packet_length[0]) ) )
- 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 0x3004: mapif_parse_AccReg(fd); break;
- case 0x3005: mapif_parse_AccRegRequest(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;
- return 0;
- }
- RFIFOSKIP(fd, len );
- return 1;
-}
-
-// RFIFO check
-int inter_check_length(int fd, int length)
-{
- if(length==-1){ // v-len packet
- if(RFIFOREST(fd)<4) // packet not yet
- return 0;
- length = RFIFOW(fd, 2);
- }
-
- if(RFIFOREST(fd)<length) // packet not yet
- return 0;
-
- return length;
-}
+//
+// original code from athena
+// SQL conversion by Jioh L. Jung
+//
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "char.h"
+#include "strlib.h"
+#include "inter.h"
+#include "int_party.h"
+#include "int_guild.h"
+#include "int_storage.h"
+#include "int_pet.h"
+#include "lock.h"
+
+#define WISDATA_TTL (60*1000) // Wisƒf[ƒ^‚̶‘¶ŽžŠÔ(60•b)
+#define WISDELLIST_MAX 256 // Wisƒf[ƒ^휃ŠƒXƒg‚Ì—v‘f”
+
+
+struct accreg {
+ int account_id,reg_num;
+ struct global_reg reg[ACCOUNT_REG_NUM];
+};
+
+static struct accreg *accreg_pt;
+
+
+int party_share_level = 10;
+MYSQL mysql_handle;
+MYSQL_RES* sql_res ;
+MYSQL_ROW sql_row ;
+int sql_fields, sql_cnt;
+char tmp_sql[65535];
+
+MYSQL lmysql_handle;
+char tmp_lsql[65535];
+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";
+
+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";
+
+// sending packet list
+int inter_send_packet_length[]={
+ -1,-1,27, 0, -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+// recv. packet list
+int inter_recv_packet_length[]={
+ -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 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,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+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;
+
+//--------------------------------------------------------
+// Save account_reg to sql (type=2)
+int inter_accreg_tosql(int account_id,struct accreg *reg){
+
+ int j;
+ char temp_str[32];
+ if (account_id<=0) return 0;
+ reg->account_id=account_id;
+
+ //`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);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ 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`, `str`, `value`) VALUES (2,'%d', '%s','%d')",
+ reg_db, reg->account_id, jstrescapecpy(temp_str,reg->reg[j].str), reg->reg[j].value);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ return 0;
+}
+
+// Load account_reg from sql (type=2)
+int inter_accreg_fromsql(int account_id,struct accreg *reg)
+{
+ int j=0;
+ if (reg==NULL) return 0;
+ memset(reg, 0, sizeof(struct accreg));
+ reg->account_id=account_id;
+
+ //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
+ sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle);
+
+ if (sql_res) {
+ for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
+ memcpy(reg->reg[j].str, sql_row[0],32);
+ reg->reg[j].value = atoi(sql_row[1]);
+ }
+ mysql_free_result(sql_res);
+ }
+ reg->reg_num=j;
+ return 0;
+}
+
+// Initialize
+int inter_accreg_sql_init()
+{
+ CREATE(accreg_pt, struct accreg, 1);
+ return 0;
+
+}
+
+/*==========================================
+ * read config file
+ *------------------------------------------
+ */
+int inter_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)){
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+
+ if(strcmpi(w1,"char_server_ip")==0){
+ strcpy(char_server_ip, w2);
+ printf ("set char_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_port")==0){
+ char_server_port=atoi(w2);
+ printf ("set char_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_id")==0){
+ strcpy(char_server_id, w2);
+ printf ("set char_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_pw")==0){
+ strcpy(char_server_pw, w2);
+ printf ("set char_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"char_server_db")==0){
+ strcpy(char_server_db, w2);
+ printf ("set char_server_db : %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);
+ printf ("set login_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_port")==0){
+ login_server_port=atoi(w2);
+ printf ("set login_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_id")==0){
+ strcpy(login_server_id, w2);
+ printf ("set login_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_pw")==0){
+ strcpy(login_server_pw, w2);
+ printf ("set login_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ printf ("set login_server_db : %s\n",w2);
+ }
+ else if(strcmpi(w1,"party_share_level")==0){
+ party_share_level=atoi(w2);
+ if(party_share_level < 0) party_share_level = 0;
+ }else if(strcmpi(w1,"import")==0){
+ inter_config_read(w2);
+ }
+ else if(strcmpi(w1,"log_inter")==0){
+ log_inter = atoi(w2);
+ }
+ else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ printf ("set login_server_db : %s\n",w2);
+ }
+ }
+ fclose(fp);
+
+ printf ("success reading interserver configuration\n");
+
+ return 0;
+}
+
+// Save interlog into sql
+int inter_log(char *fmt,...)
+{
+ char str[255];
+ char temp_str[255];
+ 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) ) {
+ printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ va_end(ap);
+ return 0;
+}
+
+
+// initialize
+int inter_init(const char *file)
+{
+ //int i;
+
+ printf ("interserver initialize...\n");
+ inter_config_read(file);
+
+ //DB connection initialized
+ mysql_init(&mysql_handle);
+ printf("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
+ printf("%s\n",mysql_error(&mysql_handle));
+ exit(1);
+ }
+ else {
+ printf ("Connect Success! (Character Server)\n");
+ }
+
+ mysql_init(&lmysql_handle);
+ printf("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
+ printf("%s\n",mysql_error(&lmysql_handle));
+ exit(1);
+ }else {
+ printf ("Connect Success! (Login Server)");
+ }
+ wis_db = numdb_init();
+ inter_guild_sql_init();
+ inter_storage_sql_init();
+ inter_party_sql_init();
+
+ inter_pet_sql_init();
+ inter_accreg_sql_init();
+
+ //printf ("interserver timer initializing : %d sec...\n",autosave_interval);
+ //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval);
+
+ return 0;
+}
+
+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 char buf[len];
+
+ WBUFW(buf, 0) = 0x3800;
+ WBUFW(buf, 2) = len;
+ memcpy(WBUFP(buf, 4), mes, len-4);
+ mapif_sendall(buf, len);
+ printf("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes);
+ return 0;
+}
+
+// Wis sending
+int mapif_wis_message(struct WisData *wd) {
+ unsigned char buf[56 + wd->len];
+
+ WBUFW(buf, 0) = 0x3801;
+ WBUFW(buf, 2) = 56 +wd->len;
+ WBUFL(buf, 4) = wd->id;
+ memcpy(WBUFP(buf, 8), wd->src, 24);
+ memcpy(WBUFP(buf,32), wd->dst, 24);
+ 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)];
+ memcpy(WBUFP(buf,0),src,WBUFW(src,2));
+ WBUFW(buf, 0)=0x3804;
+ mapif_sendallwos(fd,buf,WBUFW(buf,2));
+ return 0;
+}
+
+// Send the requested account_reg
+int mapif_account_reg_reply(int fd,int account_id)
+{
+ struct accreg *reg=accreg_pt;
+ inter_accreg_fromsql(account_id,reg);
+
+ WFIFOW(fd,0)=0x3804;
+ WFIFOL(fd,4)=account_id;
+ if(reg->reg_num==0){
+ WFIFOW(fd,2)=8;
+ }else{
+ int j,p;
+ for(j=0,p=8;j<reg->reg_num;j++,p+=36){
+ memcpy(WFIFOP(fd,p),reg->reg[j].str,32);
+ WFIFOL(fd,p+32)=reg->reg[j].value;
+ }
+ WFIFOW(fd,2)=p;
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+//--------------------------------------------------------
+
+// Existence check of WISP data
+int check_ttl_wisdata_sub(void *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() {
+ unsigned long tick = gettick();
+ int i;
+
+ do {
+ wis_delnum = 0;
+ numdb_foreach(wis_db, check_ttl_wisdata_sub, tick);
+ for(i = 0; i < wis_delnum; i++) {
+ struct WisData *wd = numdb_search(wis_db, wis_dellist[i]);
+ printf("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
+ numdb_erase(wis_db, wd->id);
+ free(wd);
+ }
+ } while(wis_delnum >= WISDELLIST_MAX);
+
+ return 0;
+}
+
+//--------------------------------------------------------
+
+// GM message sending
+int mapif_parse_GMmessage(int fd)
+{
+ mapif_GMmessage(RFIFOP(fd, 4), RFIFOW(fd, 2));
+ return 0;
+}
+
+
+// Wisp/page request to send
+int mapif_parse_WisRequest(int fd) {
+ struct WisData* wd;
+ static int wisid = 0;
+
+ if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) {
+ printf("inter: Wis message size too long.\n");
+ return 0;
+ } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows...
+ printf("inter: Wis message doesn't exist.\n");
+ return 0;
+ }
+ sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'",char_db, (int) RFIFOP(fd,28));
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ 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), 24);
+ 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(RFIFOP(fd,28), 0, 24);
+ strncpy(RFIFOP(fd,28), sql_row[0], 24);
+ // if source is destination, don't ask other servers.
+ if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) {
+ unsigned char buf[27];
+ WBUFW(buf, 0) = 0x3802;
+ memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24);
+ 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), 24);
+ memcpy(wd->dst, RFIFOP(fd,28), 24);
+ memcpy(wd->msg, RFIFOP(fd,52), wd->len);
+ wd->tick = gettick();
+ numdb_insert(wis_db, wd->id, wd);
+ mapif_wis_message(wd);
+ }
+ }
+
+ return 0;
+}
+
+
+// Wisp/page transmission result
+int mapif_parse_WisReply(int fd) {
+ int id = RFIFOL(fd,2), flag = RFIFOB(fd,6);
+ struct WisData *wd = numdb_search(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
+ numdb_erase(wis_db, id);
+ free(wd);
+ }
+
+ return 0;
+}
+
+
+// Save account_reg into sql (type=2)
+int mapif_parse_AccReg(int fd)
+{
+ int j,p;
+ struct accreg *reg=accreg_pt;
+ int account_id = RFIFOL(fd,4);
+ memset(accreg_pt,0,sizeof(struct accreg));
+
+ for(j=0,p=8;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++,p+=36){
+ memcpy(reg->reg[j].str,RFIFOP(fd,p),32);
+ reg->reg[j].value=RFIFOL(fd,p+32);
+ }
+ reg->reg_num=j;
+
+ inter_accreg_tosql(account_id,reg);
+ mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map
+ return 0;
+}
+
+// Request the value of account_reg
+int mapif_parse_AccRegRequest(int fd)
+{
+// printf("mapif: accreg request\n");
+ return mapif_account_reg_reply(fd,RFIFOL(fd,2));
+}
+
+
+
+//--------------------------------------------------------
+int inter_parse_frommap(int fd)
+{
+ int cmd=RFIFOW(fd,0);
+ int len=0;
+
+ // interŽIŠÇŠ‚©‚𒲂ׂé
+ if(cmd<0x3000 || cmd>=0x3000+( sizeof(inter_recv_packet_length)/
+ sizeof(inter_recv_packet_length[0]) ) )
+ 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 0x3004: mapif_parse_AccReg(fd); break;
+ case 0x3005: mapif_parse_AccRegRequest(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;
+ return 0;
+ }
+ RFIFOSKIP(fd, len );
+ return 1;
+}
+
+// RFIFO check
+int inter_check_length(int fd, int length)
+{
+ if(length==-1){ // v-len packet
+ if(RFIFOREST(fd)<4) // packet not yet
+ return 0;
+ length = RFIFOW(fd, 2);
+ }
+
+ if(RFIFOREST(fd)<length) // packet not yet
+ return 0;
+
+ return length;
+}
diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h
index 791797ff4..4b61b69c5 100644
--- a/src/char_sql/inter.h
+++ b/src/char_sql/inter.h
@@ -1,46 +1,46 @@
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-int inter_parse_frommap(int fd);
-int inter_mapif_init(int fd);
-
-
-int inter_check_length(int fd,int length);
-
-int inter_log(char *fmt,...);
-
-#define inter_cfgName "conf/inter_athena.conf"
-
-extern int party_share_level;
-extern char inter_log_filename[1024];
-
-//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 char tmp_lsql[65535];
-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 int log_inter;
-
-#endif
+#ifndef _INTER_H_
+#define _INTER_H_
+
+int inter_init(const char *file);
+int inter_parse_frommap(int fd);
+int inter_mapif_init(int fd);
+
+
+int inter_check_length(int fd,int length);
+
+int inter_log(char *fmt,...);
+
+#define inter_cfgName "conf/inter_athena.conf"
+
+extern int party_share_level;
+extern char inter_log_filename[1024];
+
+//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 char tmp_lsql[65535];
+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 int log_inter;
+
+#endif
diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c
index 96f567a57..0bed07c23 100644
--- a/src/char_sql/itemdb.c
+++ b/src/char_sql/itemdb.c
@@ -1,247 +1,247 @@
-// $Id: itemdb.c,v 1.1.1.1 2004/09/10 17:44:48 MagicalTux Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "itemdb.h"
-#include "db.h"
-#include "inter.h"
-#include "char.h"
-#include "utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#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]
-
-static struct dbt* item_db;
-
-/*==========================================
- * DB‚ÌŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- struct item_data *id;
-
- id=numdb_search(item_db,nameid);
- if(id) return id;
-
- CREATE(id, struct item_data, 1);
-
- numdb_insert(item_db,nameid,id);
-
-
- if(nameid>500 && nameid<600)
- id->type=0; //heal item
- else if(nameid>600 && nameid<700)
- id->type=2; //use item
- else if((nameid>700 && nameid<1100) ||
- (nameid>7000 && nameid<8000))
- id->type=3; //correction
- else if(nameid>=1750 && nameid<1771)
- id->type=10; //arrow
- else if(nameid>1100 && nameid<2000)
- id->type=4; //weapon
- else if((nameid>2100 && nameid<3000) ||
- (nameid>5000 && nameid<6000))
- id->type=5; //armor
- else if(nameid>4000 && nameid<5000)
- id->type=6; //card
- else if(nameid>9000 && nameid<10000)
- id->type=7; //egg
- else if(nameid>10000)
- id->type=8; //petequip
-
- return id;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- 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;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
-
- fp=fopen("db/item_db.txt","r");
- if(fp==NULL){
- printf("can't read db/item_db.txt\n");
- exit(1);
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,np=p=line;j<17 && 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 || nameid>=20000)
- continue;
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
- id=itemdb_search(nameid);
- memcpy(id->name,str[1],24);
- memcpy(id->jname,str[2],24);
- id->type=atoi(str[3]);
-
- }
- fclose(fp);
- printf("read db/item_db.txt done (count=%d)\n",ln);
- return 0;
-}
-
-static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
-{
- unsigned int nameid; // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert()
- struct item_data *id;
-
- // ----------
-
- // Output query to retrieve all rows from the item database table
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
-
- // Execute the query; if the query execution fails, output an error
- if (mysql_query(&mysql_handle, tmp_sql)) {
- printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- // Store the query result
- 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))) {
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0 || nameid >= 20000) { // Should ">= 20000" be "> 20000"?
- continue;
- }
-
- // ----------
-
- // Insert a new row into the item database
-/*
- id = calloc(sizeof(struct item_data), 1);
-
- if (id == NULL) {
- printf("out of memory : itemdb_read_sqldb\n");
- exit(1);
- }
-
- memset(id, 0, sizeof(struct item_data));
- numdb_insert(item_db, nameid, id);
-
- // ----------
-*/
- id=itemdb_search(nameid);
-
- memcpy(id->name, sql_row[1], 24);
- memcpy(id->jname, sql_row[2], 24);
-
- id->type = atoi(sql_row[3]);
- }
-
- // If the retrieval failed, output an error
- if (mysql_errno(&mysql_handle)) {
- printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res));
-
- // Free the query result
- mysql_free_result(sql_res);
- } else {
- printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
- }
-
- return 0;
-}
-
-static int itemdb_final(void *key,void *data,va_list ap)
-{
- struct item_data *id;
-
- id=data;
- if(id->use_script)
- free(id->use_script);
- if(id->equip_script)
- free(id->equip_script);
- free(id);
-
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-void do_final_itemdb(void)
-{
- if(item_db){
- numdb_final(item_db,itemdb_final);
- item_db=NULL;
- }
-}
-int do_init_itemdb(void)
-{
- item_db = numdb_init();
-
- 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;
-}
-
+// $Id: itemdb.c,v 1.1.1.1 2004/09/10 17:44:48 MagicalTux Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "itemdb.h"
+#include "db.h"
+#include "inter.h"
+#include "char.h"
+#include "utils.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#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]
+
+static struct dbt* item_db;
+
+/*==========================================
+ * DB‚ÌŒŸõ
+ *------------------------------------------
+ */
+struct item_data* itemdb_search(int nameid)
+{
+ struct item_data *id;
+
+ id=numdb_search(item_db,nameid);
+ if(id) return id;
+
+ CREATE(id, struct item_data, 1);
+
+ numdb_insert(item_db,nameid,id);
+
+
+ if(nameid>500 && nameid<600)
+ id->type=0; //heal item
+ else if(nameid>600 && nameid<700)
+ id->type=2; //use item
+ else if((nameid>700 && nameid<1100) ||
+ (nameid>7000 && nameid<8000))
+ id->type=3; //correction
+ else if(nameid>=1750 && nameid<1771)
+ id->type=10; //arrow
+ else if(nameid>1100 && nameid<2000)
+ id->type=4; //weapon
+ else if((nameid>2100 && nameid<3000) ||
+ (nameid>5000 && nameid<6000))
+ id->type=5; //armor
+ else if(nameid>4000 && nameid<5000)
+ id->type=6; //card
+ else if(nameid>9000 && nameid<10000)
+ id->type=7; //egg
+ else if(nameid>10000)
+ id->type=8; //petequip
+
+ return id;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip(int nameid)
+{
+ int type=itemdb_type(nameid);
+ if(type==0 || type==2 || type==3 || type==6 || type==10)
+ return 0;
+ return 1;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip2(struct item_data *data)
+{
+ if(data) {
+ int type=data->type;
+ if(type==0 || type==2 || type==3 || type==6 || type==10)
+ 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;
+ int nameid,j;
+ char *str[32],*p,*np;
+ struct item_data *id;
+
+ fp=fopen("db/item_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/item_db.txt\n");
+ exit(1);
+ }
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(str,0,sizeof(str));
+ for(j=0,np=p=line;j<17 && 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 || nameid>=20000)
+ continue;
+ ln++;
+
+ //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
+ id=itemdb_search(nameid);
+ memcpy(id->name,str[1],24);
+ memcpy(id->jname,str[2],24);
+ id->type=atoi(str[3]);
+
+ }
+ fclose(fp);
+ printf("read db/item_db.txt done (count=%d)\n",ln);
+ return 0;
+}
+
+static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
+{
+ unsigned int nameid; // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert()
+ struct item_data *id;
+
+ // ----------
+
+ // Output query to retrieve all rows from the item database table
+ sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
+
+ // Execute the query; if the query execution fails, output an error
+ if (mysql_query(&mysql_handle, tmp_sql)) {
+ printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
+ }
+
+ // Store the query result
+ 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))) {
+ nameid = atoi(sql_row[0]);
+
+ // If the identifier is not within the valid range, process the next row
+ if (nameid == 0 || nameid >= 20000) { // Should ">= 20000" be "> 20000"?
+ continue;
+ }
+
+ // ----------
+
+ // Insert a new row into the item database
+/*
+ id = calloc(sizeof(struct item_data), 1);
+
+ if (id == NULL) {
+ printf("out of memory : itemdb_read_sqldb\n");
+ exit(1);
+ }
+
+ memset(id, 0, sizeof(struct item_data));
+ numdb_insert(item_db, nameid, id);
+
+ // ----------
+*/
+ id=itemdb_search(nameid);
+
+ memcpy(id->name, sql_row[1], 24);
+ memcpy(id->jname, sql_row[2], 24);
+
+ id->type = atoi(sql_row[3]);
+ }
+
+ // If the retrieval failed, output an error
+ if (mysql_errno(&mysql_handle)) {
+ printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mysql_handle));
+ }
+
+ printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res));
+
+ // Free the query result
+ mysql_free_result(sql_res);
+ } else {
+ printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mysql_handle));
+ }
+
+ return 0;
+}
+
+static int itemdb_final(void *key,void *data,va_list ap)
+{
+ struct item_data *id;
+
+ id=data;
+ if(id->use_script)
+ free(id->use_script);
+ if(id->equip_script)
+ free(id->equip_script);
+ free(id);
+
+ return 0;
+}
+
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void do_final_itemdb(void)
+{
+ if(item_db){
+ numdb_final(item_db,itemdb_final);
+ item_db=NULL;
+ }
+}
+int do_init_itemdb(void)
+{
+ item_db = numdb_init();
+
+ 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 a7b534231..dea835e78 100644
--- a/src/char_sql/itemdb.h
+++ b/src/char_sql/itemdb.h
@@ -1,34 +1,34 @@
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-struct item_data {
- int nameid;
- char name[24],jname[24];
- int value_buy,value_sell,value_notdc,value_notoc;
- int type;
- int class;
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int slot;
- int look;
- int elv;
- int wlv;
- char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
- char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
- char available;
-};
-
-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
+#ifndef _ITEMDB_H_
+#define _ITEMDB_H_
+
+struct item_data {
+ int nameid;
+ char name[24],jname[24];
+ int value_buy,value_sell,value_notdc,value_notoc;
+ int type;
+ int class;
+ int sex;
+ int equip;
+ int weight;
+ int atk;
+ int def;
+ int range;
+ int slot;
+ int look;
+ int elv;
+ int wlv;
+ char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
+ char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
+ char available;
+};
+
+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/char_sql/make.sh b/src/char_sql/make.sh
index 128b5b909..a4ca8b5e4 100644
--- a/src/char_sql/make.sh
+++ b/src/char_sql/make.sh
@@ -1,11 +1,11 @@
-#!/bin/sh
- rsqlt=`rm -rf *.o`
- gcc -c char.c -I/usr/local/include/mysql/
- gcc -c int_guild.c -I/usr/local/include/mysql/
- gcc -c int_party.c -I/usr/local/include/mysql/
- gcc -c int_pet.c -I/usr/local/include/mysql/
- gcc -c int_storage.c -I/usr/local/include/mysql/
- gcc -c inter.c -I/usr/local/include/mysql/
- gcc -c strlib.c
- gcc -c itemdb.c -I../common/
- gcc -o ../char-server inter.o char.o int_pet.o int_storage.o int_guild.o int_party.o strlib.o itemdb.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql -lmysqlclient -lz
+#!/bin/sh
+ rsqlt=`rm -rf *.o`
+ gcc -c char.c -I/usr/local/include/mysql/
+ gcc -c int_guild.c -I/usr/local/include/mysql/
+ gcc -c int_party.c -I/usr/local/include/mysql/
+ gcc -c int_pet.c -I/usr/local/include/mysql/
+ gcc -c int_storage.c -I/usr/local/include/mysql/
+ gcc -c inter.c -I/usr/local/include/mysql/
+ gcc -c strlib.c
+ gcc -c itemdb.c -I../common/
+ gcc -o ../char-server inter.o char.o int_pet.o int_storage.o int_guild.o int_party.o strlib.o itemdb.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql -lmysqlclient -lz
diff --git a/src/char_sql/readme.txt b/src/char_sql/readme.txt
index 5f54418ac..41b114405 100644
--- a/src/char_sql/readme.txt
+++ b/src/char_sql/readme.txt
@@ -1,250 +1,250 @@
-//Encoded with UTF-8 (UNICODE)
-//---------------------------------------------
-// V.018 - Aarlex
-1. ADD Makefile & GNUmakefile
-2. fix guild_leave.
-3. fix char select windows HP & SP value error.
-
-// V.017 - Aarlex
-1. fix guild member view job update.(For mod-0728)
- inter.c
- int_guild.c
-
-// V.016 - by Aarlex
-1. Add e-mail check when you Delete char data.
-2. modify storage save func like 014.
-2. remove Lan_support func.
-
-// v.014 - by Aarlex
-I rewrite save function.
-besause myfriend find that Mysql will use more than 40% CPU.
-And log file is too big (4 days 22G ..= =+)
-(maybe he sets autosave_time less then 1 min.)
-but. i still rewrite save func.
-char server will delete all of user item(inventory & Cart) data then insert them again before.
-so i use two struct to save item data from map & database.
-then compare two struct to get different .
-AND add some debug message.but message maybe too much XD.
-
-
-1. ADDED itemdb.c itemdb.h
-2. modify mmo_char_tosql().
-3. ADDED memitemdata_to_sql().
-4. ADDED some debug message in memitemdata_to_sql().
-5. modify make.sh
-
-// v.013 - by Aarlex
-1. some SQL sentance fix in old version Mysql .
-
-2. in_guild.c mapif_guild_leaved()
- unsigned char buf[64] -> unsigned char buf[128]
-
-3. in_pet.c inter_pet_tosql()
- if (sql_res) - > if (mysql_num_rows(sql_res)!=0)
-
-4. in_char.c mmo_char_send006b()
-
- WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
- WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
- WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
- WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
-
- in_char.c parse_char()
-
- WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
- WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
- WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
- WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
-
-// v.012 - by Jazz
-1. 0627 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-2. no more binary files are supplied.
-
-//---------------------------------------------
-// v.011 - by Mark
-1. Fixed a couple bugs which would cause segfaults under linux :)
-
-//---------------------------------------------
-// v.010 - by Jazz
-1. added some debug info - for reporting.
-
-//---------------------------------------------
-// v.009 - by Jazz
-1. code added for debug.
-2. some SQL sentance fix.
-
-//---------------------------------------------
-// v.009 - by Jazz
-1. fix crash bug. - pet db.
-
-//---------------------------------------------
-// v.008 - by Jazz
-1. DB table fix. - char.fix-from.007.to.008.sql
-
-既存㮠table 構造ã«ã¯çŸ¢ãŒè£…ç€è§£é™¤ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™.
-
-item.equip㯠'unsigned short' å½¢å¼ã§ã™.
-ã“ã®ãŸã‚ã« SQL tableを修正ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
-
-修正コード㯠char.fix-from.007.to.008.sql ã§ã™.
-MySQLã§ä¸€åº¦è¡Œã£ã¦ãれれã°é©ç”¨ã•ã‚Œã¾ã™. 既存ã®ãƒ‡ãƒ¼ã‚¿ã¯å®‰å…¨ã§ã™.
-
-//---------------------------------------------
-// v.007 - by Jazz
-1. domain 解釈ã«å¯¾ã™ã‚‹å•é¡Œã‚’修正ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.006 - by Jazz
-1. crash bug fix. - when your pet DB is empty
-
-//---------------------------------------------
-// v.005 - by Jazz
-1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.004 - by Jazz
-1. 0586 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.003 - by Jazz
-1. officialã® guild.c 㨠party.c ファイルã§ã¾ãŸå†ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.002 - by Jazz
-1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
-2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// v.001 - by Jazz
-1. 一番目安定 versionã§ã™. alpha versionã«å•é¡Œç‚¹ã‚’多数修正ã—ã¾ã—ãŸ.
-
-//------------------------------------------------------------------------
-//For JAPANESE USER
-Athena Char-Server for MySQL. 005
-
-一応 guild㨠partyã¯ã‚ˆã呼ã³å‡ºã—ã•ã‚Œã‚‹éƒ¨åˆ†ãªã®ã§æ—¢å­˜ã® athena char-serverãŒä½¿ã£ã¦ã„ã‚‹ file 基盤ã®æ§‹é€ ã‚’æŒã£ã¦è¡Œãã¾ã™.
-ã“ã‚Œã¯, 一度ã«ãƒ¡ãƒ¢ãƒªãƒ¼ã§çš†èª­ã‚“ã§, ã‚‚ã†ä¸€åº¦ã«çš† fileã§ä½¿ã†æ–¹ãŒéƒ¨ä¸‹ãŒå°‘ãªãã‹ã‹ã‚‹ã¨æ€ã„ã¾ã™.
-ãã—㦠char データã«æ¯”ã¹ã¦, lostã«ãªã£ã¦ã‚‚å•é¡ŒãŒã‚‚ã£ã¨å°‘ãªã„ã¨åˆ¤æ–­ã—ã¦ãã†ã—ã¾ã—ãŸ.
-
-MySQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® compile㯠MySQL Clients LibraryãŒå¿…è¦ã§ã™. windows(cygwin) ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸ binaryを添付ã—ã¾ã—ãŸ.
-
-設置:
-ã¾ã  text->DBã® converterã¯ã¾ã¨ã‚‚ã«æ”¯æ´ã—ãªã„ã§ã™. 内部的ã«ã¡ã‚‡ã£ã¨ãƒã‚°ãŒç™ºè¦‹ã•ã‚Œã¦ãƒã‚°ã‚’修正中ã§ã™.
-ã§ãã‚‹ã ã‘æ—©ã uploadã‚’ã—ã¾ã™.
-
-1. char.sqlã‚’ MySQLã« dumpã—ã¾ã™.
-
-2. inter_athena.confã«æ¬¡ã‚’追加ã—ã¾ã™. ãã—ã¦è‡ªåˆ†ã® DBサーãƒãƒ¼ã®æƒ…å ±ã«åˆã‚ã›ã¦ãã‚Œã¾ã™.
-ã“ã“㧠windows(cygwin)ã®å ´åˆã«ã¯ localhostを使ã£ã¦ã¯ã„ã‘ãªã„ã§ã™. ipã§æ›¸ã„ã¦ãã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
-localhostã§ä½¿ã†å ´åˆ UNIX domain socketãŒä½œå‹•ã™ã‚‹ã‹ã‚‰é€£çµãŒä¸å¯èƒ½ã«ãªã‚Šã¾ã™.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ 2個㮠MySQL connect sessionã‚’æŒã¡ã¾ã™.
-一ã¤ã¯ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’読んã§æ›¸ãã®ã«ä½¿ã‚ã‚Œã¦, 二番目㯠inter serverã®ãŸã‚ã«é€£çµã—ã¾ã™.
-
-開発ã¨ãƒ†ã‚¹ãƒˆç’°å¢ƒã¯ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC ã§ã™.
-本人ãŒéŸ“国人ã ã‹ã‚‰éŸ“国語開発者ã®é€£çµ¡ã‚‚æ­“è¿Žã—ã¾ã™.
-韓国語ã¨æ—¥æœ¬èªžã®ä¸Šæ‰‹ãªæ–¹ã¯é€£çµ¡ã‚’ãã ã•ã„. 日本語ã®ä½¿ç”¨ã«é›£ã—ã•ã‚’æ„Ÿã˜ã¦ã„ã¾ã™.
-
-ç¾åœ¨ DarkWeiss㌠login serverã« MySQLを支æ´ã—始ã‚ã¾ã—ãŸ.
-ã—ã‹ã— athenaã®ãれ㯠DarkWeiss よりもã£ã¨ã‚ˆã作動ã™ã‚‹ã¨æ€ã„ã¾ã™.
-
-contact : jazz@creper.com
-
-//------------------------------------------------------------------------
-//For KOREAN USER
-Athena Char-Server for MySQL. 005
-
-ì¼ë‹¨ guild와 party는 ìžì£¼ 호출ë˜ëŠ” 부분ì´ë¼ì„œ ê¸°ì¡´ì˜ athena char-serverê°€ 사용하고 있는 file ê¸°ë°˜ì˜ êµ¬ì¡°ë¥¼ 가지고 갑니다.
-ì´ ê²ƒì€, í•œë²ˆì— ë©”ëª¨ë¦¬ë¡œ ëª¨ë‘ ì½ê³ , 다시 í•œë²ˆì— ëª¨ë‘ fileë¡œ 쓰는 ìª½ì´ ë¶€í•˜ê°€ ì ê²Œ 걸린다고 ìƒê°í•©ë‹ˆë‹¤.
-그리고 char ë°ì´í„°ì— 비해, lostê°€ ë˜ë”ë¼ë„ 문제가 ë” ì ë‹¤ê³  íŒë‹¨í•´ì„œ 그렇게 하였습니다.
-
-MySQLë²„ì „ì˜ compileì€ MySQL Clients Libraryê°€ 필요합니다. windows(cygwin) 버전으로 컴파ì¼ëœ binary를 첨부하였습니다.
-
-설치:
-ì•„ì§ text->DBì˜ converter는 제대로 지ì›í•˜ì§€ 않습니다. 내부ì ìœ¼ë¡œ 약간 버그가 발견ë˜ì–´ 버그를 수정중입니다.
-ë˜ë„ë¡ ë¹¨ë¦¬ upload를 하겠습니다.
-
-1. char.sqlì„ MySQLì— dump합니다.
-
-2. inter_athena.confì— ë‹¤ìŒì„ 추가 합니다. 그리고 ìžì‹ ì˜ DBì„œë²„ì˜ ì •ë³´ì— ë§žì¶”ì–´ ì¤ë‹ˆë‹¤.
-여기ì—ì„œ windows(cygwin)ì˜ ê²½ìš°ì—는 localhost를 ì“°ë©´ 안ë©ë‹ˆë‹¤. ipë¡œ ì ì–´ì£¼ì–´ì•¼ 합니다.
-localhostë¡œ 사용하는 경우 UNIX domain socketì´ ìž‘ë™ í•˜ê¸° ë•Œë¬¸ì— ì—°ê²°ì´ ë¶ˆê°€ëŠ¥í•´ 집니다.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL ë²„ì „ì€ 2ê°œì˜ MySQL connect sessionì„ ê°€ì§‘ë‹ˆë‹¤.
-하나는 ìºë¦­í„° ë°ì´í„°ë¥¼ ì½ê³  ì“°ëŠ”ë° ì‚¬ìš©ë˜ë©°, ë‘번째는 inter server를 위해서 연결합니다.
-
-개발과 테스트 í™˜ê²½ì€ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC 입니다.
-본ì¸ì´ 한국ì¸ì´ê¸° ë•Œë¬¸ì— í•œêµ­ì–´ 개발ìžì˜ ì—°ë½ë„ 환ì˜í•©ë‹ˆë‹¤.
-한국어와 ì¼ë³¸ì–´ê°€ 능숙한 ë¶„ì€ ì—°ë½ì„ 주세요. ì¼ë³¸ì–´ì˜ ì‚¬ìš©ì— ì–´ë ¤ì›€ì„ ëŠë¼ê³  있습니다.
-
-현재 DarkWeissê°€ login serverì— MySQLì„ ì§€ì›í•˜ê¸° 시작했습니다.
-하지만 athenaì˜ ê·¸ê²ƒì€ DarkWeiss 보다 ë” ìž˜ ìž‘ë™í•œë‹¤ê³  ìƒê°í•©ë‹ˆë‹¤.
-
-contact : jazz@creper.com
-
-//------------------------------------------------------------------------
-//For ENGLISH USER
-Athena Char-Server for MySQL. alpha 005
-
-= hehe. My English is poor. and I have no time to write. :)
-
-anyway this version use guild and party data on text file base system.
-It accesses many times, so memory dumping is useful for less cpu consume.
-
-MySQL version need MySQL Clients Library to compile. This include Win32-binary compiled by cygwin-gcc.
-
-Install:
-not yet text->DB converter. I found some bug on it, so It's under debug progress.
-
-1. dump char.sql to MySQL.
-
-2. add below on inter_athena.conf. and set your own information.
-do not use 'localhost' as domain on cygwin. you must set as ip.
-if you use localhost on cygwin, cygwin tries to connect MySQL as UNIX domain socket.
-but, MySQL does not support UNIX domain socket on windows.
-
-//3306 is default
-db_server_port: 3306
-//DB ip
-db_server_ip: 127.0.0.1
-//DB id
-db_server_id: ragnarok
-//DB pass
-db_server_pw: ragnarok
-//DB name
-db_server_logindb: ragnarok
-
-3. MySQL version has 2 MySQL connect session.
-one is for char-server and the other one is for inter-server.
-
-developement enviroment)
- P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC
-
-I'm korean, so contect if U're Korean developer.
-Please contact me, If U can use Korean & Japanese well.
-
-DarkWeiss starts to support MySQL version of login server, but Athena's one works better, I thnik.
-
-contact : jazz@creper.com
+//Encoded with UTF-8 (UNICODE)
+//---------------------------------------------
+// V.018 - Aarlex
+1. ADD Makefile & GNUmakefile
+2. fix guild_leave.
+3. fix char select windows HP & SP value error.
+
+// V.017 - Aarlex
+1. fix guild member view job update.(For mod-0728)
+ inter.c
+ int_guild.c
+
+// V.016 - by Aarlex
+1. Add e-mail check when you Delete char data.
+2. modify storage save func like 014.
+2. remove Lan_support func.
+
+// v.014 - by Aarlex
+I rewrite save function.
+besause myfriend find that Mysql will use more than 40% CPU.
+And log file is too big (4 days 22G ..= =+)
+(maybe he sets autosave_time less then 1 min.)
+but. i still rewrite save func.
+char server will delete all of user item(inventory & Cart) data then insert them again before.
+so i use two struct to save item data from map & database.
+then compare two struct to get different .
+AND add some debug message.but message maybe too much XD.
+
+
+1. ADDED itemdb.c itemdb.h
+2. modify mmo_char_tosql().
+3. ADDED memitemdata_to_sql().
+4. ADDED some debug message in memitemdata_to_sql().
+5. modify make.sh
+
+// v.013 - by Aarlex
+1. some SQL sentance fix in old version Mysql .
+
+2. in_guild.c mapif_guild_leaved()
+ unsigned char buf[64] -> unsigned char buf[128]
+
+3. in_pet.c inter_pet_tosql()
+ if (sql_res) - > if (mysql_num_rows(sql_res)!=0)
+
+4. in_char.c mmo_char_send006b()
+
+ WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
+ WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
+ WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
+ WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
+
+ in_char.c parse_char()
+
+ WFIFOW(fd, offset+(i*106)+42) = char_dat[0].hp -> WFIFOW(fd,offset+(i*106)+42) = (char_dat[j].hp > 0x7fff)? 0x7fff:char_dat[j].hp;
+ WFIFOW(fd, offset+(i*106)+44) = char_dat[0].max_hp -> WFIFOW(fd,offset+(i*106)+44) = (char_dat[j].max_hp > 0x7fff)? 0x7fff:char_dat[j].max_hp;
+ WFIFOW(fd, offset+(i*106)+46) = char_dat[0].sp -> WFIFOW(fd,offset+(i*106)+46) = (char_dat[j].sp > 0x7fff)? 0x7fff:char_dat[j].sp
+ WFIFOW(fd, offset+(i*106)+48) = char_dat[0].max_sp -> WFIFOW(fd,offset+(i*106)+48) = (char_dat[j].max_sp > 0x7fff)? 0x7fff:char_dat[j].max_sp;
+
+// v.012 - by Jazz
+1. 0627 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
+2. no more binary files are supplied.
+
+//---------------------------------------------
+// v.011 - by Mark
+1. Fixed a couple bugs which would cause segfaults under linux :)
+
+//---------------------------------------------
+// v.010 - by Jazz
+1. added some debug info - for reporting.
+
+//---------------------------------------------
+// v.009 - by Jazz
+1. code added for debug.
+2. some SQL sentance fix.
+
+//---------------------------------------------
+// v.009 - by Jazz
+1. fix crash bug. - pet db.
+
+//---------------------------------------------
+// v.008 - by Jazz
+1. DB table fix. - char.fix-from.007.to.008.sql
+
+既存㮠table 構造ã«ã¯çŸ¢ãŒè£…ç€è§£é™¤ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™.
+
+item.equip㯠'unsigned short' å½¢å¼ã§ã™.
+ã“ã®ãŸã‚ã« SQL tableを修正ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
+
+修正コード㯠char.fix-from.007.to.008.sql ã§ã™.
+MySQLã§ä¸€åº¦è¡Œã£ã¦ãれれã°é©ç”¨ã•ã‚Œã¾ã™. 既存ã®ãƒ‡ãƒ¼ã‚¿ã¯å®‰å…¨ã§ã™.
+
+//---------------------------------------------
+// v.007 - by Jazz
+1. domain 解釈ã«å¯¾ã™ã‚‹å•é¡Œã‚’修正ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// v.006 - by Jazz
+1. crash bug fix. - when your pet DB is empty
+
+//---------------------------------------------
+// v.005 - by Jazz
+1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// v.004 - by Jazz
+1. 0586 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// v.003 - by Jazz
+1. officialã® guild.c 㨠party.c ファイルã§ã¾ãŸå†ä¿®æ­£ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// v.002 - by Jazz
+1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
+2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// v.001 - by Jazz
+1. 一番目安定 versionã§ã™. alpha versionã«å•é¡Œç‚¹ã‚’多数修正ã—ã¾ã—ãŸ.
+
+//------------------------------------------------------------------------
+//For JAPANESE USER
+Athena Char-Server for MySQL. 005
+
+一応 guild㨠partyã¯ã‚ˆã呼ã³å‡ºã—ã•ã‚Œã‚‹éƒ¨åˆ†ãªã®ã§æ—¢å­˜ã® athena char-serverãŒä½¿ã£ã¦ã„ã‚‹ file 基盤ã®æ§‹é€ ã‚’æŒã£ã¦è¡Œãã¾ã™.
+ã“ã‚Œã¯, 一度ã«ãƒ¡ãƒ¢ãƒªãƒ¼ã§çš†èª­ã‚“ã§, ã‚‚ã†ä¸€åº¦ã«çš† fileã§ä½¿ã†æ–¹ãŒéƒ¨ä¸‹ãŒå°‘ãªãã‹ã‹ã‚‹ã¨æ€ã„ã¾ã™.
+ãã—㦠char データã«æ¯”ã¹ã¦, lostã«ãªã£ã¦ã‚‚å•é¡ŒãŒã‚‚ã£ã¨å°‘ãªã„ã¨åˆ¤æ–­ã—ã¦ãã†ã—ã¾ã—ãŸ.
+
+MySQLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® compile㯠MySQL Clients LibraryãŒå¿…è¦ã§ã™. windows(cygwin) ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸ binaryを添付ã—ã¾ã—ãŸ.
+
+設置:
+ã¾ã  text->DBã® converterã¯ã¾ã¨ã‚‚ã«æ”¯æ´ã—ãªã„ã§ã™. 内部的ã«ã¡ã‚‡ã£ã¨ãƒã‚°ãŒç™ºè¦‹ã•ã‚Œã¦ãƒã‚°ã‚’修正中ã§ã™.
+ã§ãã‚‹ã ã‘æ—©ã uploadã‚’ã—ã¾ã™.
+
+1. char.sqlã‚’ MySQLã« dumpã—ã¾ã™.
+
+2. inter_athena.confã«æ¬¡ã‚’追加ã—ã¾ã™. ãã—ã¦è‡ªåˆ†ã® DBサーãƒãƒ¼ã®æƒ…å ±ã«åˆã‚ã›ã¦ãã‚Œã¾ã™.
+ã“ã“㧠windows(cygwin)ã®å ´åˆã«ã¯ localhostを使ã£ã¦ã¯ã„ã‘ãªã„ã§ã™. ipã§æ›¸ã„ã¦ãã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“.
+localhostã§ä½¿ã†å ´åˆ UNIX domain socketãŒä½œå‹•ã™ã‚‹ã‹ã‚‰é€£çµãŒä¸å¯èƒ½ã«ãªã‚Šã¾ã™.
+
+//3306 is default
+db_server_port: 3306
+//DB ip
+db_server_ip: 127.0.0.1
+//DB id
+db_server_id: ragnarok
+//DB pass
+db_server_pw: ragnarok
+//DB name
+db_server_logindb: ragnarok
+
+3. MySQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ 2個㮠MySQL connect sessionã‚’æŒã¡ã¾ã™.
+一ã¤ã¯ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’読んã§æ›¸ãã®ã«ä½¿ã‚ã‚Œã¦, 二番目㯠inter serverã®ãŸã‚ã«é€£çµã—ã¾ã™.
+
+開発ã¨ãƒ†ã‚¹ãƒˆç’°å¢ƒã¯ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC ã§ã™.
+本人ãŒéŸ“国人ã ã‹ã‚‰éŸ“国語開発者ã®é€£çµ¡ã‚‚æ­“è¿Žã—ã¾ã™.
+韓国語ã¨æ—¥æœ¬èªžã®ä¸Šæ‰‹ãªæ–¹ã¯é€£çµ¡ã‚’ãã ã•ã„. 日本語ã®ä½¿ç”¨ã«é›£ã—ã•ã‚’æ„Ÿã˜ã¦ã„ã¾ã™.
+
+ç¾åœ¨ DarkWeiss㌠login serverã« MySQLを支æ´ã—始ã‚ã¾ã—ãŸ.
+ã—ã‹ã— athenaã®ãれ㯠DarkWeiss よりもã£ã¨ã‚ˆã作動ã™ã‚‹ã¨æ€ã„ã¾ã™.
+
+contact : jazz@creper.com
+
+//------------------------------------------------------------------------
+//For KOREAN USER
+Athena Char-Server for MySQL. 005
+
+ì¼ë‹¨ guild와 party는 ìžì£¼ 호출ë˜ëŠ” 부분ì´ë¼ì„œ ê¸°ì¡´ì˜ athena char-serverê°€ 사용하고 있는 file ê¸°ë°˜ì˜ êµ¬ì¡°ë¥¼ 가지고 갑니다.
+ì´ ê²ƒì€, í•œë²ˆì— ë©”ëª¨ë¦¬ë¡œ ëª¨ë‘ ì½ê³ , 다시 í•œë²ˆì— ëª¨ë‘ fileë¡œ 쓰는 ìª½ì´ ë¶€í•˜ê°€ ì ê²Œ 걸린다고 ìƒê°í•©ë‹ˆë‹¤.
+그리고 char ë°ì´í„°ì— 비해, lostê°€ ë˜ë”ë¼ë„ 문제가 ë” ì ë‹¤ê³  íŒë‹¨í•´ì„œ 그렇게 하였습니다.
+
+MySQLë²„ì „ì˜ compileì€ MySQL Clients Libraryê°€ 필요합니다. windows(cygwin) 버전으로 컴파ì¼ëœ binary를 첨부하였습니다.
+
+설치:
+ì•„ì§ text->DBì˜ converter는 제대로 지ì›í•˜ì§€ 않습니다. 내부ì ìœ¼ë¡œ 약간 버그가 발견ë˜ì–´ 버그를 수정중입니다.
+ë˜ë„ë¡ ë¹¨ë¦¬ upload를 하겠습니다.
+
+1. char.sqlì„ MySQLì— dump합니다.
+
+2. inter_athena.confì— ë‹¤ìŒì„ 추가 합니다. 그리고 ìžì‹ ì˜ DBì„œë²„ì˜ ì •ë³´ì— ë§žì¶”ì–´ ì¤ë‹ˆë‹¤.
+여기ì—ì„œ windows(cygwin)ì˜ ê²½ìš°ì—는 localhost를 ì“°ë©´ 안ë©ë‹ˆë‹¤. ipë¡œ ì ì–´ì£¼ì–´ì•¼ 합니다.
+localhostë¡œ 사용하는 경우 UNIX domain socketì´ ìž‘ë™ í•˜ê¸° ë•Œë¬¸ì— ì—°ê²°ì´ ë¶ˆê°€ëŠ¥í•´ 집니다.
+
+//3306 is default
+db_server_port: 3306
+//DB ip
+db_server_ip: 127.0.0.1
+//DB id
+db_server_id: ragnarok
+//DB pass
+db_server_pw: ragnarok
+//DB name
+db_server_logindb: ragnarok
+
+3. MySQL ë²„ì „ì€ 2ê°œì˜ MySQL connect sessionì„ ê°€ì§‘ë‹ˆë‹¤.
+하나는 ìºë¦­í„° ë°ì´í„°ë¥¼ ì½ê³  ì“°ëŠ”ë° ì‚¬ìš©ë˜ë©°, ë‘번째는 inter server를 위해서 연결합니다.
+
+개발과 테스트 í™˜ê²½ì€ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC 입니다.
+본ì¸ì´ 한국ì¸ì´ê¸° ë•Œë¬¸ì— í•œêµ­ì–´ 개발ìžì˜ ì—°ë½ë„ 환ì˜í•©ë‹ˆë‹¤.
+한국어와 ì¼ë³¸ì–´ê°€ 능숙한 ë¶„ì€ ì—°ë½ì„ 주세요. ì¼ë³¸ì–´ì˜ ì‚¬ìš©ì— ì–´ë ¤ì›€ì„ ëŠë¼ê³  있습니다.
+
+현재 DarkWeissê°€ login serverì— MySQLì„ ì§€ì›í•˜ê¸° 시작했습니다.
+하지만 athenaì˜ ê·¸ê²ƒì€ DarkWeiss 보다 ë” ìž˜ ìž‘ë™í•œë‹¤ê³  ìƒê°í•©ë‹ˆë‹¤.
+
+contact : jazz@creper.com
+
+//------------------------------------------------------------------------
+//For ENGLISH USER
+Athena Char-Server for MySQL. alpha 005
+
+= hehe. My English is poor. and I have no time to write. :)
+
+anyway this version use guild and party data on text file base system.
+It accesses many times, so memory dumping is useful for less cpu consume.
+
+MySQL version need MySQL Clients Library to compile. This include Win32-binary compiled by cygwin-gcc.
+
+Install:
+not yet text->DB converter. I found some bug on it, so It's under debug progress.
+
+1. dump char.sql to MySQL.
+
+2. add below on inter_athena.conf. and set your own information.
+do not use 'localhost' as domain on cygwin. you must set as ip.
+if you use localhost on cygwin, cygwin tries to connect MySQL as UNIX domain socket.
+but, MySQL does not support UNIX domain socket on windows.
+
+//3306 is default
+db_server_port: 3306
+//DB ip
+db_server_ip: 127.0.0.1
+//DB id
+db_server_id: ragnarok
+//DB pass
+db_server_pw: ragnarok
+//DB name
+db_server_logindb: ragnarok
+
+3. MySQL version has 2 MySQL connect session.
+one is for char-server and the other one is for inter-server.
+
+developement enviroment)
+ P4 2.4a/1024MB/WinXP pro(MediaCenter Edition 2K4 KR)/Cygwin GCC
+
+I'm korean, so contect if U're Korean developer.
+Please contact me, If U can use Korean & Japanese well.
+
+DarkWeiss starts to support MySQL version of login server, but Athena's one works better, I thnik.
+
+contact : jazz@creper.com
diff --git a/src/char_sql/strlib.c b/src/char_sql/strlib.c
index 61439d7de..b113d96f5 100644
--- a/src/char_sql/strlib.c
+++ b/src/char_sql/strlib.c
@@ -1,79 +1,79 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "strlib.h"
-#include "utils.h"
-
-//-----------------------------------------------
-// string lib.
-unsigned char* jstrescape (unsigned char* pt) {
- //copy from here
- unsigned char * ptr;
- int i =0, j=0;
-
- //copy string to temporary
- CREATE(ptr, char, J_MAX_MALLOC_SIZE);
- strcpy (ptr,pt);
-
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- free (ptr);
- return (unsigned char*) &pt[0];
-}
-
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
- //copy from here
- int i =0, j=0;
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return (unsigned char*) &pt[0];
-}
-int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) {
- //copy from here
- int i =0, j=0;
-
- while (i < size) {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- // copy size is 0 ~ (j-1)
- return j;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "strlib.h"
+#include "utils.h"
+
+//-----------------------------------------------
+// string lib.
+unsigned char* jstrescape (unsigned char* pt) {
+ //copy from here
+ unsigned char * ptr;
+ int i =0, j=0;
+
+ //copy string to temporary
+ CREATE(ptr, char, J_MAX_MALLOC_SIZE);
+ strcpy (ptr,pt);
+
+ while (ptr[i] != '\0') {
+ switch (ptr[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ default:
+ pt[j++] = ptr[i++];
+ }
+ }
+ pt[j++] = '\0';
+ free (ptr);
+ return (unsigned char*) &pt[0];
+}
+
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
+ //copy from here
+ int i =0, j=0;
+
+ while (spt[i] != '\0') {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ pt[j++] = '\0';
+ return (unsigned char*) &pt[0];
+}
+int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) {
+ //copy from here
+ int i =0, j=0;
+
+ while (i < size) {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ // copy size is 0 ~ (j-1)
+ return j;
+}
diff --git a/src/char_sql/strlib.h b/src/char_sql/strlib.h
index 3321996e1..6b6169083 100644
--- a/src/char_sql/strlib.h
+++ b/src/char_sql/strlib.h
@@ -1,10 +1,10 @@
-#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"
-unsigned char* jstrescape (unsigned char* pt);
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
-int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size);
-#endif
+#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"
+unsigned char* jstrescape (unsigned char* pt);
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
+int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size);
+#endif
diff --git a/src/common/Makefile b/src/common/Makefile
index 831f3b5db..d1a8ee0c6 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -1,14 +1,14 @@
-txt sql all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o malloc.o showmsg.o
-
-core.o: core.c core.h
-socket.o: socket.c socket.h mmo.h
-timer.o: timer.c timer.h
-grfio.o: grfio.c grfio.h
-db.o: db.c db.h
-lock.o: lock.h
-nullpo.o: nullpo.c nullpo.h
-malloc.o: malloc.c malloc.h
-showmsg.o: showmsg.c showmsg.h
-
-clean:
- rm -f *.o
+txt sql all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o malloc.o showmsg.o
+
+core.o: core.c core.h
+socket.o: socket.c socket.h mmo.h
+timer.o: timer.c timer.h
+grfio.o: grfio.c grfio.h
+db.o: db.c db.h
+lock.o: lock.h
+nullpo.o: nullpo.c nullpo.h
+malloc.o: malloc.c malloc.h
+showmsg.o: showmsg.c showmsg.h
+
+clean:
+ rm -f *.o
diff --git a/src/common/core.c b/src/common/core.c
index fe17db2d8..3d8597d20 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -1,152 +1,152 @@
-// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef _WIN32
-#include <unistd.h>
-#endif
-#include <signal.h>
-
-#include "core.h"
-#include "socket.h"
-#include "timer.h"
-#include "version.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static void (*term_func)(void)=NULL;
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_termfunc(void (*termfunc)(void))
-{
- term_func = termfunc;
-}
-
-/*======================================
- * CORE : Signal Sub Function
- *--------------------------------------
- */
-
-static void sig_proc(int sn)
-{
- int i;
- switch(sn){
- case SIGINT:
- case SIGTERM:
- if(term_func)
- term_func();
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- close(i);
- }
- exit(0);
- break;
- }
-}
-
-/*======================================
- * CORE : Display title
- *--------------------------------------
- */
-
-static void display_title(void)
-{
- // 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("\033[2J"); // clear screen and go up/left (0, 0 position in text)
- printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file
- printf("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
- printf("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color
-}
-
-// 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_.
-//
-#ifndef 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 : MAINROUTINE
- *--------------------------------------
- */
-
-int runflag = 1;
-
-int main(int argc,char **argv)
-{
- int next;
-
- Net_Init();
- do_socket();
-
- compat_signal(SIGPIPE,SIG_IGN);
- compat_signal(SIGTERM,sig_proc);
- compat_signal(SIGINT,sig_proc);
-
- // Signal to create coredumps by system when necessary (crash)
- compat_signal(SIGSEGV, SIG_DFL);
-#ifndef _WIN32
- compat_signal(SIGBUS, SIG_DFL);
- compat_signal(SIGTRAP, SIG_DFL);
-#endif
- compat_signal(SIGILL, SIG_DFL);
-
- display_title();
-
- do_init(argc,argv);
- while(runflag){
- next=do_timer(gettick_nocache());
- do_sendrecv(next);
- do_parsepacket();
- }
- return 0;
-}
+// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
+// original : core.c 2003/02/26 18:03:12 Rev 1.7
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <signal.h>
+
+#include "core.h"
+#include "socket.h"
+#include "timer.h"
+#include "version.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+static void (*term_func)(void)=NULL;
+
+/*======================================
+ * CORE : Set function
+ *--------------------------------------
+ */
+void set_termfunc(void (*termfunc)(void))
+{
+ term_func = termfunc;
+}
+
+/*======================================
+ * CORE : Signal Sub Function
+ *--------------------------------------
+ */
+
+static void sig_proc(int sn)
+{
+ int i;
+ switch(sn){
+ case SIGINT:
+ case SIGTERM:
+ if(term_func)
+ term_func();
+ for(i=0;i<fd_max;i++){
+ if(!session[i])
+ continue;
+ close(i);
+ }
+ exit(0);
+ break;
+ }
+}
+
+/*======================================
+ * CORE : Display title
+ *--------------------------------------
+ */
+
+static void display_title(void)
+{
+ // 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("\033[2J"); // clear screen and go up/left (0, 0 position in text)
+ printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file
+ printf("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
+ printf("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+ printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color
+}
+
+// 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_.
+//
+#ifndef 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 : MAINROUTINE
+ *--------------------------------------
+ */
+
+int runflag = 1;
+
+int main(int argc,char **argv)
+{
+ int next;
+
+ Net_Init();
+ do_socket();
+
+ compat_signal(SIGPIPE,SIG_IGN);
+ compat_signal(SIGTERM,sig_proc);
+ compat_signal(SIGINT,sig_proc);
+
+ // Signal to create coredumps by system when necessary (crash)
+ compat_signal(SIGSEGV, SIG_DFL);
+#ifndef _WIN32
+ compat_signal(SIGBUS, SIG_DFL);
+ compat_signal(SIGTRAP, SIG_DFL);
+#endif
+ compat_signal(SIGILL, SIG_DFL);
+
+ display_title();
+
+ do_init(argc,argv);
+ while(runflag){
+ next=do_timer(gettick_nocache());
+ do_sendrecv(next);
+ do_parsepacket();
+ }
+ return 0;
+}
diff --git a/src/common/core.h b/src/common/core.h
index ea9d9f375..bc2be02c2 100644
--- a/src/common/core.h
+++ b/src/common/core.h
@@ -1,12 +1,12 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _CORE_H_
-#define _CORE_H_
-
-extern int runflag;
-
-int do_init(int,char**);
-
-void set_termfunc(void (*termfunc)(void));
-
-#endif // _CORE_H_
+// original : core.h 2003/03/14 11:55:25 Rev 1.4
+
+#ifndef _CORE_H_
+#define _CORE_H_
+
+extern int runflag;
+
+int do_init(int,char**);
+
+void set_termfunc(void (*termfunc)(void));
+
+#endif // _CORE_H_
diff --git a/src/common/db.c b/src/common/db.c
index 1f00ffd6b..58f0ea4f7 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -1,501 +1,501 @@
-// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $
-// #define MALLOC_DBN
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "db.h"
-#include "mmo.h"
-#include "utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define ROOT_SIZE 4096
-#ifdef MALLOC_DBN
-static struct dbn *dbn_root[512], *dbn_free;
-static int dbn_root_rest=0,dbn_root_num=0;
-
-static void * malloc_dbn(void)
-{
- struct dbn* ret;
-
- if(dbn_free==NULL){
- if(dbn_root_rest<=0){
- CREATE(dbn_root[dbn_root_num], struct dbn, ROOT_SIZE);
-
- dbn_root_rest=ROOT_SIZE;
- dbn_root_num++;
- }
- return &(dbn_root[dbn_root_num-1][--dbn_root_rest]);
- }
- ret=dbn_free;
- dbn_free = dbn_free->parent;
- return ret;
-}
-
-static void free_dbn(struct dbn* add_dbn)
-{
- add_dbn->parent = dbn_free;
- dbn_free = add_dbn;
-}
-#endif
-
-static int strdb_cmp(struct dbt* table,void* a,void* b)
-{
- if(table->maxlen)
- return strncmp(a,b,table->maxlen);
- return strcmp(a,b);
-}
-
-static unsigned int strdb_hash(struct dbt* table,void* a)
-{
- int i;
- unsigned int h;
- unsigned char *p=a;
-
- i=table->maxlen;
- if(i==0) i=0x7fffffff;
- for(h=0;*p && --i>=0;){
- h=(h*33 + *p++) ^ (h>>24);
- }
- return h;
-}
-
-struct dbt* strdb_init(int maxlen)
-{
- int i;
- struct dbt* table;
-
- CREATE(table, struct dbt, 1);
-
- table->cmp=strdb_cmp;
- table->hash=strdb_hash;
- table->maxlen=maxlen;
- for(i=0;i<HASH_SIZE;i++)
- table->ht[i]=NULL;
- return table;
-}
-
-static int numdb_cmp(struct dbt* table,void* a,void* b)
-{
- int ia,ib;
-
- ia=(int)a;
- ib=(int)b;
-
- if((ia^ib) & 0x80000000)
- return ia<0 ? -1 : 1;
-
- return ia-ib;
-}
-
-static unsigned int numdb_hash(struct dbt* table,void* a)
-{
- return (unsigned int)a;
-}
-
-struct dbt* numdb_init(void)
-{
- int i;
- struct dbt* table;
-
- CREATE(table, struct dbt, 1);
-
- table->cmp=numdb_cmp;
- table->hash=numdb_hash;
- table->maxlen=sizeof(int);
- for(i=0;i<HASH_SIZE;i++)
- table->ht[i]=NULL;
- return table;
-}
-
-void* db_search(struct dbt *table,void* key)
-{
- struct dbn *p;
-
- for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){
- int c=table->cmp(table,key,p->key);
- if(c==0)
- return p->data;
- if(c<0)
- p=p->left;
- else
- p=p->right;
- }
- return NULL;
-}
-
-void * db_search2(struct dbt *table, const char *key)
-{
- int i,sp;
- struct dbn *p,*pn,*stack[64];
- int slen = strlen(key);
-
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- if (strnicmp(key, p->key, slen) == 0)
- return p->data;
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- p=pn;
- } else {
- if(p->right){
- p=p->right;
- } else {
- if(sp==0)
- break;
- p=stack[--sp];
- }
- }
- }
- }
- return 0;
-}
-
-static void db_rotate_left(struct dbn *p,struct dbn **root)
-{
- struct dbn * y = p->right;
- p->right = y->left;
- if (y->left !=0)
- y->left->parent = p;
- y->parent = p->parent;
-
- if (p == *root)
- *root = y;
- else if (p == p->parent->left)
- p->parent->left = y;
- else
- p->parent->right = y;
- y->left = p;
- p->parent = y;
-}
-
-static void db_rotate_right(struct dbn *p,struct dbn **root)
-{
- struct dbn * y = p->left;
- p->left = y->right;
- if (y->right != 0)
- y->right->parent = p;
- y->parent = p->parent;
-
- if (p == *root)
- *root = y;
- else if (p == p->parent->right)
- p->parent->right = y;
- else
- p->parent->left = y;
- y->right = p;
- p->parent = y;
-}
-
-static void db_rebalance(struct dbn *p,struct dbn **root)
-{
- p->color = RED;
- while(p!=*root && p->parent->color==RED){ // root‚Í•K‚¸•‚Åe‚ÍÔ‚¢‚Ì‚Åe‚Ìe‚Í•K‚¸‘¶Ý‚·‚é
- if (p->parent == p->parent->parent->left) {
- struct dbn *y = p->parent->parent->right;
- if (y && y->color == RED) {
- p->parent->color = BLACK;
- y->color = BLACK;
- p->parent->parent->color = RED;
- p = p->parent->parent;
- } else {
- if (p == p->parent->right) {
- p = p->parent;
- db_rotate_left(p, root);
- }
- p->parent->color = BLACK;
- p->parent->parent->color = RED;
- db_rotate_right(p->parent->parent, root);
- }
- } else {
- struct dbn* y = p->parent->parent->left;
- if (y && y->color == RED) {
- p->parent->color = BLACK;
- y->color = BLACK;
- p->parent->parent->color = RED;
- p = p->parent->parent;
- } else {
- if (p == p->parent->left) {
- p = p->parent;
- db_rotate_right(p, root);
- }
- p->parent->color = BLACK;
- p->parent->parent->color = RED;
- db_rotate_left(p->parent->parent, root);
- }
- }
- }
- (*root)->color=BLACK;
-}
-
-static void db_rebalance_erase(struct dbn *z,struct dbn **root)
-{
- struct dbn *y = z, *x = NULL, *x_parent = NULL;
-
- if (y->left == NULL)
- x = y->right;
- else if (y->right == NULL)
- x = y->left;
- else {
- y = y->right;
- while (y->left != NULL)
- y = y->left;
- x = y->right;
- }
- if (y != z) { // ¶‰E‚ª—¼•û–„‚Ü‚Á‚Ä‚¢‚½Žž y‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
- z->left->parent = y;
- y->left = z->left;
- if (y != z->right) {
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- y->parent->left = x;
- y->right = z->right;
- z->right->parent = y;
- } else
- x_parent = y;
- if (*root == z)
- *root = y;
- else if (z->parent->left == z)
- z->parent->left = y;
- else
- z->parent->right = y;
- y->parent = z->parent;
- { int tmp=y->color; y->color=z->color; z->color=tmp; }
- y = z;
- } else { // ‚Ç‚¿‚ç‚©‹ó‚¢‚Ä‚¢‚½ê‡ x‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
- x_parent = y->parent;
- if (x) x->parent = y->parent;
- if (*root == z)
- *root = x;
- else if (z->parent->left == z)
- z->parent->left = x;
- else
- z->parent->right = x;
- }
- // ‚±‚±‚Ü‚ÅF‚̈ړ®‚Ìœ‚¢‚Ä’Êí‚Ì2•ª–Ø‚Æ“¯‚¶
- if (y->color != RED) { // Ô‚ªÁ‚¦‚镪‚ɂ͉e‹¿–³‚µ
- while (x != *root && (x == NULL || x->color == BLACK))
- if (x == x_parent->left) {
- struct dbn* 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 { // same as above, with right <-> left.
- struct dbn* 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;
- }
-}
-
-struct dbn* db_insert(struct dbt *table,void* key,void* data)
-{
- struct dbn *p,*priv;
- int c,hash;
-
- hash = table->hash(table,key) % HASH_SIZE;
- for(c=0,priv=NULL ,p = table->ht[hash];p;){
- c=table->cmp(table,key,p->key);
- if(c==0){ // replace
- if (table->release)
- table->release(p, 3);
- p->data=data;
- p->key=key;
- return p;
- }
- priv=p;
- if(c<0){
- p=p->left;
- } else {
- p=p->right;
- }
- }
-#ifdef MALLOC_DBN
- p=malloc_dbn();
-#else
- CREATE(p, struct dbn, 1);
-#endif
- if(p==NULL){
- printf("out of memory : db_insert\n");
- return NULL;
- }
- p->parent= NULL;
- p->left = NULL;
- p->right = NULL;
- p->key = key;
- p->data = data;
- p->color = RED;
- if(c==0){ // hash entry is empty
- table->ht[hash] = p;
- p->color = BLACK;
- } else {
- if(c<0){ // left node
- priv->left = p;
- p->parent=priv;
- } else { // right node
- priv->right = p;
- p->parent=priv;
- }
- if(priv->color==RED){ // must rebalance
- db_rebalance(p,&table->ht[hash]);
- }
- }
- return p;
-}
-
-void* db_erase(struct dbt *table,void* key)
-{
- void *data;
- struct dbn *p;
- int c,hash;
-
- hash = table->hash(table,key) % HASH_SIZE;
- for(c=0,p = table->ht[hash];p;){
- c=table->cmp(table,key,p->key);
- if(c==0)
- break;
- if(c<0)
- p=p->left;
- else
- p=p->right;
- }
- if(!p)
- return NULL;
- data=p->data;
- db_rebalance_erase(p,&table->ht[hash]);
-#ifdef MALLOC_DBN
- free_dbn(p);
-#else
- free(p);
-#endif
- return data;
-}
-
-void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
-{
- int i,sp;
- // red-black tree‚È‚Ì‚Å64ŒÂstack‚ª‚ ‚ê‚Î2^32ŒÂƒm[ƒh‚Ü‚Å‘åä•v
- struct dbn *p,*pn,*stack[64];
- va_list ap;
-
- va_start(ap,func);
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- func(p->key,p->data,ap);
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- p=pn;
- } else {
- if(p->right){
- p=p->right;
- } else {
- if(sp==0)
- break;
- p=stack[--sp];
- }
- }
- }
- }
- va_end(ap);
-}
-
-void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
-{
- int i,sp;
- struct dbn *p,*pn,*stack[64];
- va_list ap;
-
- va_start(ap,func);
- for(i=0;i<HASH_SIZE;i++){
- if((p=table->ht[i])==NULL)
- continue;
- sp=0;
- while(1){
- if(func)
- func(p->key,p->data,ap);
- if((pn=p->left)!=NULL){
- if(p->right){
- stack[sp++]=p->right;
- }
- } else {
- if(p->right){
- pn=p->right;
- } else {
- if(sp==0)
- break;
- pn=stack[--sp];
- }
- }
-#ifdef MALLOC_DBN
- free_dbn(p);
-#else
- free(p);
-#endif
- p=pn;
- }
- }
- free(table);
- va_end(ap);
-}
+// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $
+// #define MALLOC_DBN
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "db.h"
+#include "mmo.h"
+#include "utils.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define ROOT_SIZE 4096
+#ifdef MALLOC_DBN
+static struct dbn *dbn_root[512], *dbn_free;
+static int dbn_root_rest=0,dbn_root_num=0;
+
+static void * malloc_dbn(void)
+{
+ struct dbn* ret;
+
+ if(dbn_free==NULL){
+ if(dbn_root_rest<=0){
+ CREATE(dbn_root[dbn_root_num], struct dbn, ROOT_SIZE);
+
+ dbn_root_rest=ROOT_SIZE;
+ dbn_root_num++;
+ }
+ return &(dbn_root[dbn_root_num-1][--dbn_root_rest]);
+ }
+ ret=dbn_free;
+ dbn_free = dbn_free->parent;
+ return ret;
+}
+
+static void free_dbn(struct dbn* add_dbn)
+{
+ add_dbn->parent = dbn_free;
+ dbn_free = add_dbn;
+}
+#endif
+
+static int strdb_cmp(struct dbt* table,void* a,void* b)
+{
+ if(table->maxlen)
+ return strncmp(a,b,table->maxlen);
+ return strcmp(a,b);
+}
+
+static unsigned int strdb_hash(struct dbt* table,void* a)
+{
+ int i;
+ unsigned int h;
+ unsigned char *p=a;
+
+ i=table->maxlen;
+ if(i==0) i=0x7fffffff;
+ for(h=0;*p && --i>=0;){
+ h=(h*33 + *p++) ^ (h>>24);
+ }
+ return h;
+}
+
+struct dbt* strdb_init(int maxlen)
+{
+ int i;
+ struct dbt* table;
+
+ CREATE(table, struct dbt, 1);
+
+ table->cmp=strdb_cmp;
+ table->hash=strdb_hash;
+ table->maxlen=maxlen;
+ for(i=0;i<HASH_SIZE;i++)
+ table->ht[i]=NULL;
+ return table;
+}
+
+static int numdb_cmp(struct dbt* table,void* a,void* b)
+{
+ int ia,ib;
+
+ ia=(int)a;
+ ib=(int)b;
+
+ if((ia^ib) & 0x80000000)
+ return ia<0 ? -1 : 1;
+
+ return ia-ib;
+}
+
+static unsigned int numdb_hash(struct dbt* table,void* a)
+{
+ return (unsigned int)a;
+}
+
+struct dbt* numdb_init(void)
+{
+ int i;
+ struct dbt* table;
+
+ CREATE(table, struct dbt, 1);
+
+ table->cmp=numdb_cmp;
+ table->hash=numdb_hash;
+ table->maxlen=sizeof(int);
+ for(i=0;i<HASH_SIZE;i++)
+ table->ht[i]=NULL;
+ return table;
+}
+
+void* db_search(struct dbt *table,void* key)
+{
+ struct dbn *p;
+
+ for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){
+ int c=table->cmp(table,key,p->key);
+ if(c==0)
+ return p->data;
+ if(c<0)
+ p=p->left;
+ else
+ p=p->right;
+ }
+ return NULL;
+}
+
+void * db_search2(struct dbt *table, const char *key)
+{
+ int i,sp;
+ struct dbn *p,*pn,*stack[64];
+ int slen = strlen(key);
+
+ for(i=0;i<HASH_SIZE;i++){
+ if((p=table->ht[i])==NULL)
+ continue;
+ sp=0;
+ while(1){
+ if (strnicmp(key, p->key, slen) == 0)
+ return p->data;
+ if((pn=p->left)!=NULL){
+ if(p->right){
+ stack[sp++]=p->right;
+ }
+ p=pn;
+ } else {
+ if(p->right){
+ p=p->right;
+ } else {
+ if(sp==0)
+ break;
+ p=stack[--sp];
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+static void db_rotate_left(struct dbn *p,struct dbn **root)
+{
+ struct dbn * y = p->right;
+ p->right = y->left;
+ if (y->left !=0)
+ y->left->parent = p;
+ y->parent = p->parent;
+
+ if (p == *root)
+ *root = y;
+ else if (p == p->parent->left)
+ p->parent->left = y;
+ else
+ p->parent->right = y;
+ y->left = p;
+ p->parent = y;
+}
+
+static void db_rotate_right(struct dbn *p,struct dbn **root)
+{
+ struct dbn * y = p->left;
+ p->left = y->right;
+ if (y->right != 0)
+ y->right->parent = p;
+ y->parent = p->parent;
+
+ if (p == *root)
+ *root = y;
+ else if (p == p->parent->right)
+ p->parent->right = y;
+ else
+ p->parent->left = y;
+ y->right = p;
+ p->parent = y;
+}
+
+static void db_rebalance(struct dbn *p,struct dbn **root)
+{
+ p->color = RED;
+ while(p!=*root && p->parent->color==RED){ // root‚Í•K‚¸•‚Åe‚ÍÔ‚¢‚Ì‚Åe‚Ìe‚Í•K‚¸‘¶Ý‚·‚é
+ if (p->parent == p->parent->parent->left) {
+ struct dbn *y = p->parent->parent->right;
+ if (y && y->color == RED) {
+ p->parent->color = BLACK;
+ y->color = BLACK;
+ p->parent->parent->color = RED;
+ p = p->parent->parent;
+ } else {
+ if (p == p->parent->right) {
+ p = p->parent;
+ db_rotate_left(p, root);
+ }
+ p->parent->color = BLACK;
+ p->parent->parent->color = RED;
+ db_rotate_right(p->parent->parent, root);
+ }
+ } else {
+ struct dbn* y = p->parent->parent->left;
+ if (y && y->color == RED) {
+ p->parent->color = BLACK;
+ y->color = BLACK;
+ p->parent->parent->color = RED;
+ p = p->parent->parent;
+ } else {
+ if (p == p->parent->left) {
+ p = p->parent;
+ db_rotate_right(p, root);
+ }
+ p->parent->color = BLACK;
+ p->parent->parent->color = RED;
+ db_rotate_left(p->parent->parent, root);
+ }
+ }
+ }
+ (*root)->color=BLACK;
+}
+
+static void db_rebalance_erase(struct dbn *z,struct dbn **root)
+{
+ struct dbn *y = z, *x = NULL, *x_parent = NULL;
+
+ if (y->left == NULL)
+ x = y->right;
+ else if (y->right == NULL)
+ x = y->left;
+ else {
+ y = y->right;
+ while (y->left != NULL)
+ y = y->left;
+ x = y->right;
+ }
+ if (y != z) { // ¶‰E‚ª—¼•û–„‚Ü‚Á‚Ä‚¢‚½Žž y‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
+ z->left->parent = y;
+ y->left = z->left;
+ if (y != z->right) {
+ x_parent = y->parent;
+ if (x) x->parent = y->parent;
+ y->parent->left = x;
+ y->right = z->right;
+ z->right->parent = y;
+ } else
+ x_parent = y;
+ if (*root == z)
+ *root = y;
+ else if (z->parent->left == z)
+ z->parent->left = y;
+ else
+ z->parent->right = y;
+ y->parent = z->parent;
+ { int tmp=y->color; y->color=z->color; z->color=tmp; }
+ y = z;
+ } else { // ‚Ç‚¿‚ç‚©‹ó‚¢‚Ä‚¢‚½ê‡ x‚ðz‚̈ʒu‚ÉŽ‚Á‚Ä‚«‚Äz‚ð•‚‚©‚¹‚é
+ x_parent = y->parent;
+ if (x) x->parent = y->parent;
+ if (*root == z)
+ *root = x;
+ else if (z->parent->left == z)
+ z->parent->left = x;
+ else
+ z->parent->right = x;
+ }
+ // ‚±‚±‚Ü‚ÅF‚̈ړ®‚Ìœ‚¢‚Ä’Êí‚Ì2•ª–Ø‚Æ“¯‚¶
+ if (y->color != RED) { // Ô‚ªÁ‚¦‚镪‚ɂ͉e‹¿–³‚µ
+ while (x != *root && (x == NULL || x->color == BLACK))
+ if (x == x_parent->left) {
+ struct dbn* 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 { // same as above, with right <-> left.
+ struct dbn* 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;
+ }
+}
+
+struct dbn* db_insert(struct dbt *table,void* key,void* data)
+{
+ struct dbn *p,*priv;
+ int c,hash;
+
+ hash = table->hash(table,key) % HASH_SIZE;
+ for(c=0,priv=NULL ,p = table->ht[hash];p;){
+ c=table->cmp(table,key,p->key);
+ if(c==0){ // replace
+ if (table->release)
+ table->release(p, 3);
+ p->data=data;
+ p->key=key;
+ return p;
+ }
+ priv=p;
+ if(c<0){
+ p=p->left;
+ } else {
+ p=p->right;
+ }
+ }
+#ifdef MALLOC_DBN
+ p=malloc_dbn();
+#else
+ CREATE(p, struct dbn, 1);
+#endif
+ if(p==NULL){
+ printf("out of memory : db_insert\n");
+ return NULL;
+ }
+ p->parent= NULL;
+ p->left = NULL;
+ p->right = NULL;
+ p->key = key;
+ p->data = data;
+ p->color = RED;
+ if(c==0){ // hash entry is empty
+ table->ht[hash] = p;
+ p->color = BLACK;
+ } else {
+ if(c<0){ // left node
+ priv->left = p;
+ p->parent=priv;
+ } else { // right node
+ priv->right = p;
+ p->parent=priv;
+ }
+ if(priv->color==RED){ // must rebalance
+ db_rebalance(p,&table->ht[hash]);
+ }
+ }
+ return p;
+}
+
+void* db_erase(struct dbt *table,void* key)
+{
+ void *data;
+ struct dbn *p;
+ int c,hash;
+
+ hash = table->hash(table,key) % HASH_SIZE;
+ for(c=0,p = table->ht[hash];p;){
+ c=table->cmp(table,key,p->key);
+ if(c==0)
+ break;
+ if(c<0)
+ p=p->left;
+ else
+ p=p->right;
+ }
+ if(!p)
+ return NULL;
+ data=p->data;
+ db_rebalance_erase(p,&table->ht[hash]);
+#ifdef MALLOC_DBN
+ free_dbn(p);
+#else
+ free(p);
+#endif
+ return data;
+}
+
+void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
+{
+ int i,sp;
+ // red-black tree‚È‚Ì‚Å64ŒÂstack‚ª‚ ‚ê‚Î2^32ŒÂƒm[ƒh‚Ü‚Å‘åä•v
+ struct dbn *p,*pn,*stack[64];
+ va_list ap;
+
+ va_start(ap,func);
+ for(i=0;i<HASH_SIZE;i++){
+ if((p=table->ht[i])==NULL)
+ continue;
+ sp=0;
+ while(1){
+ func(p->key,p->data,ap);
+ if((pn=p->left)!=NULL){
+ if(p->right){
+ stack[sp++]=p->right;
+ }
+ p=pn;
+ } else {
+ if(p->right){
+ p=p->right;
+ } else {
+ if(sp==0)
+ break;
+ p=stack[--sp];
+ }
+ }
+ }
+ }
+ va_end(ap);
+}
+
+void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
+{
+ int i,sp;
+ struct dbn *p,*pn,*stack[64];
+ va_list ap;
+
+ va_start(ap,func);
+ for(i=0;i<HASH_SIZE;i++){
+ if((p=table->ht[i])==NULL)
+ continue;
+ sp=0;
+ while(1){
+ if(func)
+ func(p->key,p->data,ap);
+ if((pn=p->left)!=NULL){
+ if(p->right){
+ stack[sp++]=p->right;
+ }
+ } else {
+ if(p->right){
+ pn=p->right;
+ } else {
+ if(sp==0)
+ break;
+ pn=stack[--sp];
+ }
+ }
+#ifdef MALLOC_DBN
+ free_dbn(p);
+#else
+ free(p);
+#endif
+ p=pn;
+ }
+ }
+ free(table);
+ va_end(ap);
+}
diff --git a/src/common/db.h b/src/common/db.h
index 523d36cf5..ea9aceab0 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -1,47 +1,47 @@
-#ifndef _DB_H_
-#define _DB_H_
-
-#include <stdarg.h>
-
-#define HASH_SIZE (256+27)
-
-#define RED 0
-#define BLACK 1
-
-struct dbn {
- struct dbn *parent,*left,*right;
- int color;
- void *key;
- void *data;
-};
-
-struct dbt {
- int (*cmp)(struct dbt*,void*,void*);
- unsigned int (*hash)(struct dbt*,void*);
- // which 1 - key, 2 - data, 3 - both
- void (*release)(struct dbn*,int which);
- int maxlen;
- struct dbn *ht[HASH_SIZE];
-};
-
-#define strdb_search(t,k) db_search((t),(void*)(k))
-#define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define strdb_erase(t,k) db_erase ((t),(void*)(k))
-#define strdb_foreach db_foreach
-#define strdb_final db_final
-#define numdb_search(t,k) db_search((t),(void*)(k))
-#define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define numdb_erase(t,k) db_erase ((t),(void*)(k))
-#define numdb_foreach db_foreach
-#define numdb_final db_final
-
-struct dbt* strdb_init(int maxlen);
-struct dbt* numdb_init(void);
-void* db_search(struct dbt *table,void* key);
-void* db_search2(struct dbt *table, const char *key); // [MouseJstr]
-struct dbn* db_insert(struct dbt *table,void* key,void* data);
-void* db_erase(struct dbt *table,void* key);
-void db_foreach(struct dbt*,int(*)(void*,void*,va_list),...);
-void db_final(struct dbt*,int(*)(void*,void*,va_list),...);
-
-#endif
+#ifndef _DB_H_
+#define _DB_H_
+
+#include <stdarg.h>
+
+#define HASH_SIZE (256+27)
+
+#define RED 0
+#define BLACK 1
+
+struct dbn {
+ struct dbn *parent,*left,*right;
+ int color;
+ void *key;
+ void *data;
+};
+
+struct dbt {
+ int (*cmp)(struct dbt*,void*,void*);
+ unsigned int (*hash)(struct dbt*,void*);
+ // which 1 - key, 2 - data, 3 - both
+ void (*release)(struct dbn*,int which);
+ int maxlen;
+ struct dbn *ht[HASH_SIZE];
+};
+
+#define strdb_search(t,k) db_search((t),(void*)(k))
+#define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
+#define strdb_erase(t,k) db_erase ((t),(void*)(k))
+#define strdb_foreach db_foreach
+#define strdb_final db_final
+#define numdb_search(t,k) db_search((t),(void*)(k))
+#define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
+#define numdb_erase(t,k) db_erase ((t),(void*)(k))
+#define numdb_foreach db_foreach
+#define numdb_final db_final
+
+struct dbt* strdb_init(int maxlen);
+struct dbt* numdb_init(void);
+void* db_search(struct dbt *table,void* key);
+void* db_search2(struct dbt *table, const char *key); // [MouseJstr]
+struct dbn* db_insert(struct dbt *table,void* key,void* data);
+void* db_erase(struct dbt *table,void* key);
+void db_foreach(struct dbt*,int(*)(void*,void*,va_list),...);
+void db_final(struct dbt*,int(*)(void*,void*,va_list),...);
+
+#endif
diff --git a/src/common/grfio.c b/src/common/grfio.c
index 08b475105..0c305773d 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -1,953 +1,953 @@
-/*********************************************************************
- *
- * 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
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-
-#include <zlib.h>
-
-#include "utils.h"
-#include "grfio.h"
-#include "mmo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#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] = ""; // "../";
-
-// accessor to data_file,adata_file,sdata_file
-char *grfio_setdatafile(const char *str){ strcpy(data_file,str); return data_file; }
-char *grfio_setadatafile(const char *str){ strcpy(adata_file,str); return adata_file; }
-char *grfio_setsdatafile(const char *str){ strcpy(sdata_file,str); return sdata_file; }
-
-//----------------------------
-// file entry table struct
-//----------------------------
-typedef struct {
- int srclen; // compressed size
- int srclen_aligned; //
- int declen; // original size
- int srcpos;
- short next;
- char cycle;
- char type;
- char fn[128-4*5]; // file name
- 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 127
-#define FILELIST_LIMIT 32768 // temporary maximum, and a theory top maximum are 2G.
-
-static FILELIST *filelist;
-static int filelist_entrys;
-static int filelist_maxentry;
-
-static char **gentry_table;
-static int gentry_entrys;
-static int gentry_maxentry;
-
-//----------------------------
-// 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;
-}
-
-/*==========================================
- * 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;
- 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);
-}
-
-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);
-}
-
-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
- *------------------------------------------
- */
-static int decode_zip(Bytef* dest, uLongf* destLen, const Bytef* source, uLong 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 = 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;
-}
-/***********************************************************
- *** File List Sobroutines ***
- ***********************************************************/
-
-/*==========================================
- * 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
- *------------------------------------------
- */
-FILELIST *filelist_find(char *fname)
-{
- int hash;
-
- for(hash=filelist_hash[filehash(fname)];hash>=0;hash=filelist[hash].next) {
- if(strcmpi(filelist[hash].fn,fname)==0)
- break;
- }
-
- return (hash>=0)? &filelist[hash] : NULL;
-}
-
-/*==========================================
- * 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) {
- printf("filelist limit : filelist_add\n");
- exit(1);
- }
-
- if (filelist_entrys>=filelist_maxentry) {
- FILELIST *new_filelist = (FILELIST*)realloc(
- (void*)filelist, (filelist_maxentry+FILELIST_ADDS)*sizeof(FILELIST) );
- if (new_filelist != NULL) {
- filelist = new_filelist;
- memset(filelist + filelist_maxentry, '\0',
- FILELIST_ADDS * sizeof(FILELIST));
- filelist_maxentry += FILELIST_ADDS;
- } else {
- printf("out of memory : filelist_add\n");
- exit(1);
- }
- }
-
- memcpy( &filelist[filelist_entrys], entry, sizeof(FILELIST) );
-
- hash = filehash(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 *new_filelist = (FILELIST*)realloc(
- (void*)filelist,filelist_entrys*sizeof(FILELIST) );
- if (new_filelist != NULL) {
- filelist = new_filelist;
- filelist_maxentry = filelist_entrys;
- } else {
- printf("out of memory : filelist\n");
- exit(1);
- }
- }
- }
-}
-
-/***********************************************************
- *** Grfio Sobroutines ***
- ***********************************************************/
-/*==========================================
- * Grfio : Resnametable replace
- *------------------------------------------
- */
-char* grfio_resnametable(char* fname, char *lfname)
-{
- FILE *fp;
- char *p;
- char w1[256],w2[256],restable[256],line[512];
-
- sprintf(restable,"%sdata\\resnametable.txt",data_dir);
-
- for(p=&restable[0];*p!=0;p++) if (*p=='\\') *p = '/';
-
- fp = fopen(restable,"rb");
- if(fp==NULL) {
- printf("%s not found (grfio_resnametable)\n",restable);
- exit(1); // 1:not found error
- }
-
- while(fgets(line,508,fp)){
- if((sscanf(line,"%[^#]#%[^#]#",w1,w2)==2) && (sscanf(fname,"%*5s%s",lfname)==1) && (!strcmpi(w1,lfname))){
- sprintf(lfname,"data\\%s",w2);
- fclose(fp);
- return lfname;
- }
- }
- fclose(fp);
- return fname;
-
-}
-
-/*==========================================
- * 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],rname[256],*p;
- FILELIST lentry;
- struct stat st;
-
- if(strcmp(data_dir, "") != 0) {
- //printf("%s\t",fname);
- sprintf(rname,"%s",grfio_resnametable(fname,lfname));
- //printf("%s\n",rname);
- sprintf(lfname,"%s%s",data_dir,rname);
- //printf("%s\n",lfname);
- }
-
- 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.declen = st.st_size;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else if (entry==NULL) {
- printf("%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 = NULL;
- unsigned char *buf=NULL,*buf2=NULL;
- char *gfname;
- FILELIST *entry;
-
- entry = filelist_find(fname);
-
- if (entry==NULL || entry->gentry<=0) { // LocalFileCheck
- char lfname[256],rname[256],*p;
- FILELIST lentry;
-
- strncpy(lfname,fname,255);
- sprintf(rname,"%s",grfio_resnametable(fname,lfname));
- sprintf(lfname,"%s%s",data_dir,rname);
- //printf("%s\n",lfname);
-
- 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 = calloc(lentry.declen+1024, 1);
- if (buf2==NULL) {
- printf("file read memory allocate error : declen\n");
- goto errret;
- }
- fread(buf2,1,lentry.declen,in);
- fclose(in); in = NULL;
- strncpy( lentry.fn, fname, sizeof(lentry.fn)-1 );
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify(&lentry);
- } else {
- if (entry!=NULL && entry->gentry<0) {
- entry->gentry = -entry->gentry; // local file checked
- } else {
- printf("%s not found (grfio_reads)\n", fname);
- //goto errret;
- free(buf2);
- return NULL;
- }
- }
- }
- if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read
- buf = calloc(entry->srclen_aligned+1024, 1);
- if (buf==NULL) {
- printf("file read memory allocate error : srclen_aligned\n");
- goto errret;
- }
- gfname = gentry_table[entry->gentry-1];
- in = fopen(gfname,"rb");
- if(in==NULL) {
- printf("%s not found (grfio_reads)\n",gfname);
- //goto errret;
- free(buf);
- return NULL;
- }
- fseek(in,entry->srcpos,0);
- fread(buf,1,entry->srclen_aligned,in);
- fclose(in);
- buf2=calloc(entry->declen+1024, 1);
- if (buf2==NULL) {
- printf("file decode memory allocate error\n");
- goto errret;
- }
- 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) {
- printf("decode_zip size miss match err: %d != %d\n",(int)len,entry->declen);
- goto errret;
- }
- } else {
- memcpy(buf2,buf,entry->declen);
- }
- free(buf);
- }
- if (size!=NULL && entry!=NULL)
- *size = entry->declen;
- return buf2;
-errret:
- if (buf!=NULL) free(buf);
- if (buf2!=NULL) free(buf2);
- if (in!=NULL) fclose(in);
- exit(1); //return NULL;
-}
-
-/*==========================================
- * Grfio : Resource file read
- *------------------------------------------
- */
-void* grfio_read(char *fname)
-{
- return grfio_reads(fname,NULL);
-}
-
-/*==========================================
- * Resource filename decode
- *------------------------------------------
- */
-static unsigned 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 buf;
-}
-
-/*==========================================
- * Grfio : Entry table read
- *------------------------------------------
- */
-static int grfio_entryread(char *gfname,int gentry)
-{
- FILE *fp;
- int grf_size,list_size;
- unsigned char grf_header[0x2e];
- int lop,entry,entrys,ofs,grf_version;
- unsigned char *fname;
- unsigned char *grf_filelist;
-
- fp = fopen(gfname,"rb");
- if(fp==NULL) {
- printf("%s not found (grfio_entryread)\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(grf_header,"Master of Magic") || fseek(fp,getlong(grf_header+0x1e),1)){ // SEEK_CUR
- fclose(fp);
- printf("%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 = calloc(list_size, 1);
- if(grf_filelist==NULL){
- fclose(fp);
- printf("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){
- printf("file name too long : %s\n",fname);
- free(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);
-#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;
- }
- free(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 (rSize > grf_size-ftell(fp)) {
- fclose(fp);
- printf("Illegal data format : grf compress entry size\n");
- return 4;
- }
-
- rBuf = calloc( rSize , 1); // Get a Read Size
- if (rBuf==NULL) {
- fclose(fp);
- printf("out of memory : grf compress entry table buffer\n");
- return 3;
- }
- grf_filelist = calloc( eSize , 1); // Get a Extend Size
- if (grf_filelist==NULL) {
- free(rBuf);
- fclose(fp);
- printf("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;
- free(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 = grf_filelist+ofs;
- if (strlen(fname)>sizeof(aentry.fn)-1) {
- printf("grf : file name too long : %s\n",fname);
- free(grf_filelist);
- exit(1);
- }
- ofs2 = ofs+strlen(grf_filelist+ofs)+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);
-#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;
- }
- free(grf_filelist);
-
- } else { //****** Grf Other version ******
- fclose(fp);
- printf("not support grf versions : %04x\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()
-{
- int size;
- unsigned char *buf,*ptr;
- char w1[256],w2[256],src[256],dst[256];
- FILELIST *entry;
-
- buf=grfio_reads("data\\resnametable.txt",&size);
- buf[size] = 0;
-
- for(ptr=buf;ptr-buf<size;) {
- if(sscanf(ptr,"%[^#]#%[^#]#",w1,w2)==2){
- if(strstr(w2,"bmp")){
- sprintf(src,"data\\texture\\%s",w1);
- sprintf(dst,"data\\texture\\%s",w2);
- } else {
- 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 );
- filelist_modify(&fentry);
- } else {
- //printf("file not found in data.grf : %s < %s\n",dst,src);
- }
- }
- ptr = strchr(ptr,'\n'); // Next line
- if (!ptr) break;
- ptr++;
- }
- free(buf);
- filelist_adjust(); // Unnecessary area release of filelist
-}
-
-/*==========================================
- * Grfio : Resource add
- *------------------------------------------
- */
-#define GENTRY_ADDS 16 // The number increment of gentry_table entries
-
-int grfio_add(char *fname)
-{
- int len,result;
- char *buf;
-
- if (gentry_entrys>=GENTRY_LIMIT) {
- printf("gentrys limit : grfio_add\n");
- exit(1);
- }
-
- printf("%s file reading...\n",fname);
-
- if (gentry_entrys>=gentry_maxentry) {
- char **new_gentry = (char**)realloc(
- (void*)gentry_table,(gentry_maxentry+GENTRY_ADDS)*sizeof(char*) );
- if (new_gentry!=NULL) {
- int lop;
- gentry_table = new_gentry;
- gentry_maxentry += GENTRY_ADDS;
- for(lop=gentry_entrys;lop<gentry_maxentry;lop++)
- gentry_table[lop] = NULL;
- } else {
- printf("out of memory : grfio_add\n");
- exit(1);
- }
- }
- len = strlen( fname );
- buf = calloc(len+1, 1);
- if (buf==NULL) {
- printf("out of memory : gentry\n");
- exit(1);
- }
- strcpy( buf, fname );
- gentry_table[gentry_entrys++] = buf;
-
- result = grfio_entryread(fname,gentry_entrys-1);
-
- if (result==0) {
- // Resource check
- grfio_resourcecheck();
- }
-
- return result;
-}
-
-/*==========================================
- * Grfio : Finalize
- *------------------------------------------
- */
-void grfio_final(void)
-{
- int lop;
-
- if (filelist!=NULL) free(filelist);
- filelist = NULL;
- filelist_entrys = filelist_maxentry = 0;
-
- if (gentry_table!=NULL) {
- for(lop=0;lop<gentry_entrys;lop++) {
- if (gentry_table[lop]!=NULL) {
- free(gentry_table[lop]);
- }
- }
- free(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, result2 = 0, result3 = 0, result4 = 0;
-
- data_conf = fopen(fname, "r");
-
- // It will read, if there is grf-files.txt.
- if (data_conf) {
- while(fgets(line, 1020, data_conf)) {
- if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
- if(strcmp(w1, "data") == 0)
- strcpy(data_file, w2);
- else if(strcmp(w1, "sdata") == 0)
- strcpy(sdata_file, w2);
- else if(strcmp(w1, "adata") == 0)
- strcpy(adata_file, w2);
- else if(strcmp(w1,"data_dir") == 0)
- strcpy(data_dir, w2);
- }
- }
-
- fclose(data_conf);
- printf("read %s done\n",fname);
- } // end of reading grf-files.txt
-
- hashinit(); // hash table initialization
-
- filelist = NULL; filelist_entrys = filelist_maxentry = 0;
- gentry_table = NULL; gentry_entrys = gentry_maxentry = 0;
- atexit(grfio_final); // End processing definition
-
- // Entry table reading
-
- if (strcmp(data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "")
- result = grfio_add(data_file); // Primary data file
-
- if (strcmp(sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "")
- result2 = grfio_add(sdata_file); // Sakray data file
-
- if (strcmp(adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "")
- result3 = grfio_add(adata_file); // Alpha version data file
-
- if (strcmp(data_dir, "") == 0) // Id data_dir doesn't exist
- result4 = 1; // Data directory
-
- if (result != 0 && result2 != 0 && result3 != 0 && result4 != 0) {
- printf("not grf file readed exit!!\n");
- exit(1); // It ends, if a resource cannot read one.
- }
-}
+/*********************************************************************
+ *
+ * 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
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include <zlib.h>
+
+#include "utils.h"
+#include "grfio.h"
+#include "mmo.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#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] = ""; // "../";
+
+// accessor to data_file,adata_file,sdata_file
+char *grfio_setdatafile(const char *str){ strcpy(data_file,str); return data_file; }
+char *grfio_setadatafile(const char *str){ strcpy(adata_file,str); return adata_file; }
+char *grfio_setsdatafile(const char *str){ strcpy(sdata_file,str); return sdata_file; }
+
+//----------------------------
+// file entry table struct
+//----------------------------
+typedef struct {
+ int srclen; // compressed size
+ int srclen_aligned; //
+ int declen; // original size
+ int srcpos;
+ short next;
+ char cycle;
+ char type;
+ char fn[128-4*5]; // file name
+ 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 127
+#define FILELIST_LIMIT 32768 // temporary maximum, and a theory top maximum are 2G.
+
+static FILELIST *filelist;
+static int filelist_entrys;
+static int filelist_maxentry;
+
+static char **gentry_table;
+static int gentry_entrys;
+static int gentry_maxentry;
+
+//----------------------------
+// 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;
+}
+
+/*==========================================
+ * 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;
+ 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);
+}
+
+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);
+}
+
+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
+ *------------------------------------------
+ */
+static int decode_zip(Bytef* dest, uLongf* destLen, const Bytef* source, uLong 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 = 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;
+}
+/***********************************************************
+ *** File List Sobroutines ***
+ ***********************************************************/
+
+/*==========================================
+ * 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
+ *------------------------------------------
+ */
+FILELIST *filelist_find(char *fname)
+{
+ int hash;
+
+ for(hash=filelist_hash[filehash(fname)];hash>=0;hash=filelist[hash].next) {
+ if(strcmpi(filelist[hash].fn,fname)==0)
+ break;
+ }
+
+ return (hash>=0)? &filelist[hash] : NULL;
+}
+
+/*==========================================
+ * 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) {
+ printf("filelist limit : filelist_add\n");
+ exit(1);
+ }
+
+ if (filelist_entrys>=filelist_maxentry) {
+ FILELIST *new_filelist = (FILELIST*)realloc(
+ (void*)filelist, (filelist_maxentry+FILELIST_ADDS)*sizeof(FILELIST) );
+ if (new_filelist != NULL) {
+ filelist = new_filelist;
+ memset(filelist + filelist_maxentry, '\0',
+ FILELIST_ADDS * sizeof(FILELIST));
+ filelist_maxentry += FILELIST_ADDS;
+ } else {
+ printf("out of memory : filelist_add\n");
+ exit(1);
+ }
+ }
+
+ memcpy( &filelist[filelist_entrys], entry, sizeof(FILELIST) );
+
+ hash = filehash(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 *new_filelist = (FILELIST*)realloc(
+ (void*)filelist,filelist_entrys*sizeof(FILELIST) );
+ if (new_filelist != NULL) {
+ filelist = new_filelist;
+ filelist_maxentry = filelist_entrys;
+ } else {
+ printf("out of memory : filelist\n");
+ exit(1);
+ }
+ }
+ }
+}
+
+/***********************************************************
+ *** Grfio Sobroutines ***
+ ***********************************************************/
+/*==========================================
+ * Grfio : Resnametable replace
+ *------------------------------------------
+ */
+char* grfio_resnametable(char* fname, char *lfname)
+{
+ FILE *fp;
+ char *p;
+ char w1[256],w2[256],restable[256],line[512];
+
+ sprintf(restable,"%sdata\\resnametable.txt",data_dir);
+
+ for(p=&restable[0];*p!=0;p++) if (*p=='\\') *p = '/';
+
+ fp = fopen(restable,"rb");
+ if(fp==NULL) {
+ printf("%s not found (grfio_resnametable)\n",restable);
+ exit(1); // 1:not found error
+ }
+
+ while(fgets(line,508,fp)){
+ if((sscanf(line,"%[^#]#%[^#]#",w1,w2)==2) && (sscanf(fname,"%*5s%s",lfname)==1) && (!strcmpi(w1,lfname))){
+ sprintf(lfname,"data\\%s",w2);
+ fclose(fp);
+ return lfname;
+ }
+ }
+ fclose(fp);
+ return fname;
+
+}
+
+/*==========================================
+ * 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],rname[256],*p;
+ FILELIST lentry;
+ struct stat st;
+
+ if(strcmp(data_dir, "") != 0) {
+ //printf("%s\t",fname);
+ sprintf(rname,"%s",grfio_resnametable(fname,lfname));
+ //printf("%s\n",rname);
+ sprintf(lfname,"%s%s",data_dir,rname);
+ //printf("%s\n",lfname);
+ }
+
+ 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.declen = st.st_size;
+ lentry.gentry = 0; // 0:LocalFile
+ entry = filelist_modify(&lentry);
+ } else if (entry==NULL) {
+ printf("%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 = NULL;
+ unsigned char *buf=NULL,*buf2=NULL;
+ char *gfname;
+ FILELIST *entry;
+
+ entry = filelist_find(fname);
+
+ if (entry==NULL || entry->gentry<=0) { // LocalFileCheck
+ char lfname[256],rname[256],*p;
+ FILELIST lentry;
+
+ strncpy(lfname,fname,255);
+ sprintf(rname,"%s",grfio_resnametable(fname,lfname));
+ sprintf(lfname,"%s%s",data_dir,rname);
+ //printf("%s\n",lfname);
+
+ 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 = calloc(lentry.declen+1024, 1);
+ if (buf2==NULL) {
+ printf("file read memory allocate error : declen\n");
+ goto errret;
+ }
+ fread(buf2,1,lentry.declen,in);
+ fclose(in); in = NULL;
+ strncpy( lentry.fn, fname, sizeof(lentry.fn)-1 );
+ lentry.gentry = 0; // 0:LocalFile
+ entry = filelist_modify(&lentry);
+ } else {
+ if (entry!=NULL && entry->gentry<0) {
+ entry->gentry = -entry->gentry; // local file checked
+ } else {
+ printf("%s not found (grfio_reads)\n", fname);
+ //goto errret;
+ free(buf2);
+ return NULL;
+ }
+ }
+ }
+ if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read
+ buf = calloc(entry->srclen_aligned+1024, 1);
+ if (buf==NULL) {
+ printf("file read memory allocate error : srclen_aligned\n");
+ goto errret;
+ }
+ gfname = gentry_table[entry->gentry-1];
+ in = fopen(gfname,"rb");
+ if(in==NULL) {
+ printf("%s not found (grfio_reads)\n",gfname);
+ //goto errret;
+ free(buf);
+ return NULL;
+ }
+ fseek(in,entry->srcpos,0);
+ fread(buf,1,entry->srclen_aligned,in);
+ fclose(in);
+ buf2=calloc(entry->declen+1024, 1);
+ if (buf2==NULL) {
+ printf("file decode memory allocate error\n");
+ goto errret;
+ }
+ 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) {
+ printf("decode_zip size miss match err: %d != %d\n",(int)len,entry->declen);
+ goto errret;
+ }
+ } else {
+ memcpy(buf2,buf,entry->declen);
+ }
+ free(buf);
+ }
+ if (size!=NULL && entry!=NULL)
+ *size = entry->declen;
+ return buf2;
+errret:
+ if (buf!=NULL) free(buf);
+ if (buf2!=NULL) free(buf2);
+ if (in!=NULL) fclose(in);
+ exit(1); //return NULL;
+}
+
+/*==========================================
+ * Grfio : Resource file read
+ *------------------------------------------
+ */
+void* grfio_read(char *fname)
+{
+ return grfio_reads(fname,NULL);
+}
+
+/*==========================================
+ * Resource filename decode
+ *------------------------------------------
+ */
+static unsigned 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 buf;
+}
+
+/*==========================================
+ * Grfio : Entry table read
+ *------------------------------------------
+ */
+static int grfio_entryread(char *gfname,int gentry)
+{
+ FILE *fp;
+ int grf_size,list_size;
+ unsigned char grf_header[0x2e];
+ int lop,entry,entrys,ofs,grf_version;
+ unsigned char *fname;
+ unsigned char *grf_filelist;
+
+ fp = fopen(gfname,"rb");
+ if(fp==NULL) {
+ printf("%s not found (grfio_entryread)\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(grf_header,"Master of Magic") || fseek(fp,getlong(grf_header+0x1e),1)){ // SEEK_CUR
+ fclose(fp);
+ printf("%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 = calloc(list_size, 1);
+ if(grf_filelist==NULL){
+ fclose(fp);
+ printf("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){
+ printf("file name too long : %s\n",fname);
+ free(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);
+#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;
+ }
+ free(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 (rSize > grf_size-ftell(fp)) {
+ fclose(fp);
+ printf("Illegal data format : grf compress entry size\n");
+ return 4;
+ }
+
+ rBuf = calloc( rSize , 1); // Get a Read Size
+ if (rBuf==NULL) {
+ fclose(fp);
+ printf("out of memory : grf compress entry table buffer\n");
+ return 3;
+ }
+ grf_filelist = calloc( eSize , 1); // Get a Extend Size
+ if (grf_filelist==NULL) {
+ free(rBuf);
+ fclose(fp);
+ printf("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;
+ free(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 = grf_filelist+ofs;
+ if (strlen(fname)>sizeof(aentry.fn)-1) {
+ printf("grf : file name too long : %s\n",fname);
+ free(grf_filelist);
+ exit(1);
+ }
+ ofs2 = ofs+strlen(grf_filelist+ofs)+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);
+#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;
+ }
+ free(grf_filelist);
+
+ } else { //****** Grf Other version ******
+ fclose(fp);
+ printf("not support grf versions : %04x\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()
+{
+ int size;
+ unsigned char *buf,*ptr;
+ char w1[256],w2[256],src[256],dst[256];
+ FILELIST *entry;
+
+ buf=grfio_reads("data\\resnametable.txt",&size);
+ buf[size] = 0;
+
+ for(ptr=buf;ptr-buf<size;) {
+ if(sscanf(ptr,"%[^#]#%[^#]#",w1,w2)==2){
+ if(strstr(w2,"bmp")){
+ sprintf(src,"data\\texture\\%s",w1);
+ sprintf(dst,"data\\texture\\%s",w2);
+ } else {
+ 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 );
+ filelist_modify(&fentry);
+ } else {
+ //printf("file not found in data.grf : %s < %s\n",dst,src);
+ }
+ }
+ ptr = strchr(ptr,'\n'); // Next line
+ if (!ptr) break;
+ ptr++;
+ }
+ free(buf);
+ filelist_adjust(); // Unnecessary area release of filelist
+}
+
+/*==========================================
+ * Grfio : Resource add
+ *------------------------------------------
+ */
+#define GENTRY_ADDS 16 // The number increment of gentry_table entries
+
+int grfio_add(char *fname)
+{
+ int len,result;
+ char *buf;
+
+ if (gentry_entrys>=GENTRY_LIMIT) {
+ printf("gentrys limit : grfio_add\n");
+ exit(1);
+ }
+
+ printf("%s file reading...\n",fname);
+
+ if (gentry_entrys>=gentry_maxentry) {
+ char **new_gentry = (char**)realloc(
+ (void*)gentry_table,(gentry_maxentry+GENTRY_ADDS)*sizeof(char*) );
+ if (new_gentry!=NULL) {
+ int lop;
+ gentry_table = new_gentry;
+ gentry_maxentry += GENTRY_ADDS;
+ for(lop=gentry_entrys;lop<gentry_maxentry;lop++)
+ gentry_table[lop] = NULL;
+ } else {
+ printf("out of memory : grfio_add\n");
+ exit(1);
+ }
+ }
+ len = strlen( fname );
+ buf = calloc(len+1, 1);
+ if (buf==NULL) {
+ printf("out of memory : gentry\n");
+ exit(1);
+ }
+ strcpy( buf, fname );
+ gentry_table[gentry_entrys++] = buf;
+
+ result = grfio_entryread(fname,gentry_entrys-1);
+
+ if (result==0) {
+ // Resource check
+ grfio_resourcecheck();
+ }
+
+ return result;
+}
+
+/*==========================================
+ * Grfio : Finalize
+ *------------------------------------------
+ */
+void grfio_final(void)
+{
+ int lop;
+
+ if (filelist!=NULL) free(filelist);
+ filelist = NULL;
+ filelist_entrys = filelist_maxentry = 0;
+
+ if (gentry_table!=NULL) {
+ for(lop=0;lop<gentry_entrys;lop++) {
+ if (gentry_table[lop]!=NULL) {
+ free(gentry_table[lop]);
+ }
+ }
+ free(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, result2 = 0, result3 = 0, result4 = 0;
+
+ data_conf = fopen(fname, "r");
+
+ // It will read, if there is grf-files.txt.
+ if (data_conf) {
+ while(fgets(line, 1020, data_conf)) {
+ if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) {
+ if(strcmp(w1, "data") == 0)
+ strcpy(data_file, w2);
+ else if(strcmp(w1, "sdata") == 0)
+ strcpy(sdata_file, w2);
+ else if(strcmp(w1, "adata") == 0)
+ strcpy(adata_file, w2);
+ else if(strcmp(w1,"data_dir") == 0)
+ strcpy(data_dir, w2);
+ }
+ }
+
+ fclose(data_conf);
+ printf("read %s done\n",fname);
+ } // end of reading grf-files.txt
+
+ hashinit(); // hash table initialization
+
+ filelist = NULL; filelist_entrys = filelist_maxentry = 0;
+ gentry_table = NULL; gentry_entrys = gentry_maxentry = 0;
+ atexit(grfio_final); // End processing definition
+
+ // Entry table reading
+
+ if (strcmp(data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "")
+ result = grfio_add(data_file); // Primary data file
+
+ if (strcmp(sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "")
+ result2 = grfio_add(sdata_file); // Sakray data file
+
+ if (strcmp(adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "")
+ result3 = grfio_add(adata_file); // Alpha version data file
+
+ if (strcmp(data_dir, "") == 0) // Id data_dir doesn't exist
+ result4 = 1; // Data directory
+
+ if (result != 0 && result2 != 0 && result3 != 0 && result4 != 0) {
+ printf("not grf file readed exit!!\n");
+ exit(1); // It ends, if a resource cannot read one.
+ }
+}
diff --git a/src/common/grfio.h b/src/common/grfio.h
index d9690f886..53b9da8d4 100644
--- a/src/common/grfio.h
+++ b/src/common/grfio.h
@@ -1,16 +1,16 @@
-// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-#ifndef _GRFIO_H_
-#define _GRFIO_H_
-
-void grfio_init(char*); // GRFIO Initialize
-int grfio_add(char*); // GRFIO Resource file add
-void* grfio_read(char*); // GRFIO data file read
-void* grfio_reads(char*,int*); // GRFIO data file read & size get
-int grfio_size(char*); // GRFIO data file size get
-
-// Accessor to GRF filenames
-char *grfio_setdatafile(const char *str);
-char *grfio_setadatafile(const char *str);
-char *grfio_setsdatafile(const char *str);
-
-#endif // _GRFIO_H_
+// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
+#ifndef _GRFIO_H_
+#define _GRFIO_H_
+
+void grfio_init(char*); // GRFIO Initialize
+int grfio_add(char*); // GRFIO Resource file add
+void* grfio_read(char*); // GRFIO data file read
+void* grfio_reads(char*,int*); // GRFIO data file read & size get
+int grfio_size(char*); // GRFIO data file size get
+
+// Accessor to GRF filenames
+char *grfio_setdatafile(const char *str);
+char *grfio_setadatafile(const char *str);
+char *grfio_setsdatafile(const char *str);
+
+#endif // _GRFIO_H_
diff --git a/src/common/lock.c b/src/common/lock.c
index 7b9e1ad9c..9a2205bf4 100644
--- a/src/common/lock.c
+++ b/src/common/lock.c
@@ -1,37 +1,37 @@
-
-#include <stdio.h>
-#include "lock.h"
-
-// ‘‚«ž‚݃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 = 0;
- char newfile[512];
- if(fp != NULL) {
- ret = fclose(fp);
- sprintf(newfile,"%s_%04d.tmp",filename,*info);
- remove(filename);
- // ‚±‚̃^ƒCƒ~ƒ“ƒO‚Å—Ž‚¿‚é‚Æň«B
- rename(newfile,filename);
- return ret;
- } else {
- return 1;
- }
-}
-
+
+#include <stdio.h>
+#include "lock.h"
+
+// ‘‚«ž‚݃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 = 0;
+ char newfile[512];
+ if(fp != NULL) {
+ ret = fclose(fp);
+ sprintf(newfile,"%s_%04d.tmp",filename,*info);
+ remove(filename);
+ // ‚±‚̃^ƒCƒ~ƒ“ƒO‚Å—Ž‚¿‚é‚Æň«B
+ rename(newfile,filename);
+ return ret;
+ } else {
+ return 1;
+ }
+}
+
diff --git a/src/common/lock.h b/src/common/lock.h
index 235e9eea3..795bf8860 100644
--- a/src/common/lock.h
+++ b/src/common/lock.h
@@ -1,8 +1,8 @@
-#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
-
+#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 bc40c6a3f..eda9bc218 100644
--- a/src/common/malloc.c
+++ b/src/common/malloc.c
@@ -1,44 +1,44 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include "malloc.h"
-
-void* aMalloc_( size_t size, const char *file, int line, const char *func )
-{
- void *ret;
-
-// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size);
- ret=malloc(size);
- if(ret==NULL){
- printf("%s:%d: in func %s: malloc 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;
-
-// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size);
- ret=calloc(num,size);
- if(ret==NULL){
- printf("%s:%d: in func %s: calloc 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;
-
-// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size);
- ret=realloc(p,size);
- if(ret==NULL){
- printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func);
- exit(1);
-
- }
- return ret;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include "malloc.h"
+
+void* aMalloc_( size_t size, const char *file, int line, const char *func )
+{
+ void *ret;
+
+// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size);
+ ret=malloc(size);
+ if(ret==NULL){
+ printf("%s:%d: in func %s: malloc 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;
+
+// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size);
+ ret=calloc(num,size);
+ if(ret==NULL){
+ printf("%s:%d: in func %s: calloc 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;
+
+// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size);
+ ret=realloc(p,size);
+ if(ret==NULL){
+ printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func);
+ exit(1);
+
+ }
+ return ret;
+}
diff --git a/src/common/malloc.h b/src/common/malloc.h
index 8caa59b6b..3733a5e55 100644
--- a/src/common/malloc.h
+++ b/src/common/malloc.h
@@ -1,25 +1,25 @@
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-
-#include <stdlib.h>
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-
-#define ALC_MARK __FILE__, __LINE__, __func__
-
-void* aMalloc_( 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* aRealloc_( void *p, size_t size, const char *file, int line, const char *func );
-
-#define aMalloc(n) aMalloc_(n,ALC_MARK)
-#define aCalloc(m,n) aCalloc_(m,n,ALC_MARK)
-#define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
-
-
-#endif
+#ifndef _MALLOC_H_
+#define _MALLOC_H_
+
+#include <stdlib.h>
+
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __func__ __FUNCTION__
+# else
+# define __func__ ""
+# endif
+#endif
+
+#define ALC_MARK __FILE__, __LINE__, __func__
+
+void* aMalloc_( 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* aRealloc_( void *p, size_t size, const char *file, int line, const char *func );
+
+#define aMalloc(n) aMalloc_(n,ALC_MARK)
+#define aCalloc(m,n) aCalloc_(m,n,ALC_MARK)
+#define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
+
+
+#endif
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 9ed965e3b..a21680191 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -1,311 +1,311 @@
-// $Id: mmo.h,v 1.3 2004/09/25 20:12:25 PoW Exp $
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
-
-#ifndef _MMO_H_
-#define _MMO_H_
-
-#include <time.h>
-#include "utils.h" // _WIN32
-
-#ifdef CYGWIN
-// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
-#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
-#else
-#define RETCODE "\n" // (LFFUnixŒnj
-#endif
-
-#define FIFOSIZE_SERVERLINK 128*1024
-
-// set to 0 to not check IP of player between each server.
-// set to another value if you want to check (1)
-#define CMP_AUTHFIFO_IP 1
-
-#define CMP_AUTHFIFO_LOGIN2 1
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000 // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 450
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 36 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
-#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan]
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE battle_config.min_hair_style
-#define MAX_HAIR_STYLE battle_config.max_hair_style
-#define MIN_HAIR_COLOR battle_config.min_hair_color
-#define MAX_HAIR_COLOR battle_config.max_hair_color
-#define MIN_CLOTH_COLOR battle_config.min_cloth_color
-#define MAX_CLOTH_COLOR battle_config.max_cloth_color
-
-// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
-
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
-
-#define MAX_STATUS_TYPE 5
-
-#define WEDDING_RING_M 2634
-#define WEDDING_RING_F 2635
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-struct item {
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
-
-struct point{
- char map[24];
- short x,y;
-};
-
-struct skill {
- unsigned short id,lv,flag;
-};
-
-struct global_reg {
- char str[32];
- int value;
-};
-
-struct s_pet {
- int account_id;
- int char_id;
- int pet_id;
- short class;
- short level;
- short egg_id;//pet egg id
- short equip;//pet equip name_id
- short intimate;//pet friendly
- short hungry;//pet hungry
- char name[24];
- char rename_flag;
- char incuvate;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int partner_id;
-
- int base_exp,job_exp,zeny;
-
- short class;
- short status_point,skill_point;
- int 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;
- short str,agi,vit,int_,dex,luk;
- unsigned char char_num,sex;
-
- unsigned long mapip;
- unsigned int mapport;
-
- struct point last_point,save_point,memo_point[10];
- 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 account_reg_num;
- struct global_reg account_reg[ACCOUNT_REG_NUM];
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-
- // Friends list vars
- int friend_id[20];
- char friend_name[20][24];
-};
-
-struct storage {
- int account_id;
- short storage_status;
- short storage_amount;
- struct item storage[MAX_STORAGE];
-};
-
-struct guild_storage {
- int guild_id;
- short storage_status;
- short storage_amount;
- struct item storage[MAX_GUILD_STORAGE];
-};
-
-struct map_session_data;
-
-struct gm_account {
- int account_id;
- int level;
-};
-
-struct party_member {
- int account_id;
- char name[24],map[24];
- int leader,online,lv;
- struct map_session_data *sd;
-};
-
-struct party {
- int party_id;
- char name[24];
- int exp;
- int item;
- struct party_member member[MAX_PARTY];
-};
-
-struct guild_member {
- int account_id, char_id;
- short hair,hair_color,gender,class,lv;
- int exp,exp_payper;
- short online,position;
- int rsv1,rsv2;
- char name[24];
- struct map_session_data *sd;
-};
-
-struct guild_position {
- char name[24];
- int mode;
- int exp_mode;
-};
-
-struct guild_alliance {
- int opposition;
- int guild_id;
- char name[24];
-};
-
-struct guild_explusion {
- char name[24];
- char mes[40];
- char acc[40];
- int account_id;
- int rsv1,rsv2,rsv3;
-};
-
-struct guild_skill {
- int id,lv;
-};
-
-struct guild {
- int guild_id;
- short guild_lv, connect_member, max_member, average_lv;
- int exp,next_exp,skill_point,castle_id;
- char name[24],master[24];
- struct guild_member member[MAX_GUILD];
- struct guild_position position[MAX_GUILDPOSITION];
- char mes1[60],mes2[120];
- int emblem_len,emblem_id;
- char emblem_data[2048];
- struct guild_alliance alliance[MAX_GUILDALLIANCE];
- struct guild_explusion explusion[MAX_GUILDEXPLUSION];
- struct guild_skill skill[MAX_GUILDSKILL];
-};
-
-struct guild_castle {
- int castle_id;
- char map_name[24];
- char castle_name[24];
- char castle_event[24];
- int guild_id;
- int economy;
- int defense;
- int triggerE;
- int triggerD;
- int nextTime;
- int payTime;
- int createTime;
- int visibleC;
- int visibleG0;
- int visibleG1;
- int visibleG2;
- int visibleG3;
- int visibleG4;
- int visibleG5;
- int visibleG6;
- int visibleG7;
- int Ghp0; // added Guardian HP [Valaris]
- int Ghp1;
- int Ghp2;
- int Ghp3;
- int Ghp4;
- int Ghp5;
- int Ghp6;
- int Ghp7;
- int GID0;
- int GID1;
- int GID2;
- int GID3;
- int GID4;
- int GID5;
- int GID6;
- int GID7; // end addition [Valaris]
-};
-struct square {
- int val1[5];
- int val2[5];
-};
-
-enum {
- GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
- GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
- GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
- GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
-
- GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
- GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
-
-};
-
-#ifndef _WIN32
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-#ifndef strrchr
-#define strrchr rindex
-#endif
-
-#endif
-
-#endif // _MMO_H_
+// $Id: mmo.h,v 1.3 2004/09/25 20:12:25 PoW Exp $
+// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
+
+#ifndef _MMO_H_
+#define _MMO_H_
+
+#include <time.h>
+#include "utils.h" // _WIN32
+
+#ifdef CYGWIN
+// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
+#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
+#else
+#define RETCODE "\n" // (LFFUnixŒnj
+#endif
+
+#define FIFOSIZE_SERVERLINK 128*1024
+
+// set to 0 to not check IP of player between each server.
+// set to another value if you want to check (1)
+#define CMP_AUTHFIFO_IP 1
+
+#define CMP_AUTHFIFO_LOGIN2 1
+
+#define MAX_MAP_PER_SERVER 512
+#define MAX_INVENTORY 100
+#define MAX_AMOUNT 30000
+#define MAX_ZENY 1000000000 // 1G zeny
+#define MAX_CART 100
+#define MAX_SKILL 450
+#define GLOBAL_REG_NUM 96
+#define ACCOUNT_REG_NUM 16
+#define ACCOUNT_REG2_NUM 16
+#define DEFAULT_WALK_SPEED 150
+#define MIN_WALK_SPEED 0
+#define MAX_WALK_SPEED 1000
+#define MAX_STORAGE 300
+#define MAX_GUILD_STORAGE 1000
+#define MAX_PARTY 12
+#define MAX_GUILD 36 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
+#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
+#define MAX_GUILDEXPLUSION 32
+#define MAX_GUILDALLIANCE 16
+#define MAX_GUILDSKILL 15 // increased max guild skills because of new skills [Sara-chan]
+#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
+#define MAX_GUILDLEVEL 50
+
+#define MIN_HAIR_STYLE battle_config.min_hair_style
+#define MAX_HAIR_STYLE battle_config.max_hair_style
+#define MIN_HAIR_COLOR battle_config.min_hair_color
+#define MAX_HAIR_COLOR battle_config.max_hair_color
+#define MIN_CLOTH_COLOR battle_config.min_cloth_color
+#define MAX_CLOTH_COLOR battle_config.max_cloth_color
+
+// for produce
+#define MIN_ATTRIBUTE 0
+#define MAX_ATTRIBUTE 4
+#define ATTRIBUTE_NORMAL 0
+#define MIN_STAR 0
+#define MAX_STAR 3
+
+#define MIN_PORTAL_MEMO 0
+#define MAX_PORTAL_MEMO 2
+
+#define MAX_STATUS_TYPE 5
+
+#define WEDDING_RING_M 2634
+#define WEDDING_RING_F 2635
+
+#define CHAR_CONF_NAME "conf/char_athena.conf"
+
+struct item {
+ int id;
+ short nameid;
+ short amount;
+ unsigned short equip;
+ char identify;
+ char refine;
+ char attribute;
+ short card[4];
+};
+
+struct point{
+ char map[24];
+ short x,y;
+};
+
+struct skill {
+ unsigned short id,lv,flag;
+};
+
+struct global_reg {
+ char str[32];
+ int value;
+};
+
+struct s_pet {
+ int account_id;
+ int char_id;
+ int pet_id;
+ short class;
+ short level;
+ short egg_id;//pet egg id
+ short equip;//pet equip name_id
+ short intimate;//pet friendly
+ short hungry;//pet hungry
+ char name[24];
+ char rename_flag;
+ char incuvate;
+};
+
+struct mmo_charstatus {
+ int char_id;
+ int account_id;
+ int partner_id;
+
+ int base_exp,job_exp,zeny;
+
+ short class;
+ short status_point,skill_point;
+ int 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;
+ short str,agi,vit,int_,dex,luk;
+ unsigned char char_num,sex;
+
+ unsigned long mapip;
+ unsigned int mapport;
+
+ struct point last_point,save_point,memo_point[10];
+ 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 account_reg_num;
+ struct global_reg account_reg[ACCOUNT_REG_NUM];
+ int account_reg2_num;
+ struct global_reg account_reg2[ACCOUNT_REG2_NUM];
+
+ // Friends list vars
+ int friend_id[20];
+ char friend_name[20][24];
+};
+
+struct storage {
+ int account_id;
+ short storage_status;
+ short storage_amount;
+ struct item storage[MAX_STORAGE];
+};
+
+struct guild_storage {
+ int guild_id;
+ short storage_status;
+ short storage_amount;
+ struct item storage[MAX_GUILD_STORAGE];
+};
+
+struct map_session_data;
+
+struct gm_account {
+ int account_id;
+ int level;
+};
+
+struct party_member {
+ int account_id;
+ char name[24],map[24];
+ int leader,online,lv;
+ struct map_session_data *sd;
+};
+
+struct party {
+ int party_id;
+ char name[24];
+ int exp;
+ int item;
+ struct party_member member[MAX_PARTY];
+};
+
+struct guild_member {
+ int account_id, char_id;
+ short hair,hair_color,gender,class,lv;
+ int exp,exp_payper;
+ short online,position;
+ int rsv1,rsv2;
+ char name[24];
+ struct map_session_data *sd;
+};
+
+struct guild_position {
+ char name[24];
+ int mode;
+ int exp_mode;
+};
+
+struct guild_alliance {
+ int opposition;
+ int guild_id;
+ char name[24];
+};
+
+struct guild_explusion {
+ char name[24];
+ char mes[40];
+ char acc[40];
+ int account_id;
+ int rsv1,rsv2,rsv3;
+};
+
+struct guild_skill {
+ int id,lv;
+};
+
+struct guild {
+ int guild_id;
+ short guild_lv, connect_member, max_member, average_lv;
+ int exp,next_exp,skill_point,castle_id;
+ char name[24],master[24];
+ struct guild_member member[MAX_GUILD];
+ struct guild_position position[MAX_GUILDPOSITION];
+ char mes1[60],mes2[120];
+ int emblem_len,emblem_id;
+ char emblem_data[2048];
+ struct guild_alliance alliance[MAX_GUILDALLIANCE];
+ struct guild_explusion explusion[MAX_GUILDEXPLUSION];
+ struct guild_skill skill[MAX_GUILDSKILL];
+};
+
+struct guild_castle {
+ int castle_id;
+ char map_name[24];
+ char castle_name[24];
+ char castle_event[24];
+ int guild_id;
+ int economy;
+ int defense;
+ int triggerE;
+ int triggerD;
+ int nextTime;
+ int payTime;
+ int createTime;
+ int visibleC;
+ int visibleG0;
+ int visibleG1;
+ int visibleG2;
+ int visibleG3;
+ int visibleG4;
+ int visibleG5;
+ int visibleG6;
+ int visibleG7;
+ int Ghp0; // added Guardian HP [Valaris]
+ int Ghp1;
+ int Ghp2;
+ int Ghp3;
+ int Ghp4;
+ int Ghp5;
+ int Ghp6;
+ int Ghp7;
+ int GID0;
+ int GID1;
+ int GID2;
+ int GID3;
+ int GID4;
+ int GID5;
+ int GID6;
+ int GID7; // end addition [Valaris]
+};
+struct square {
+ int val1[5];
+ int val2[5];
+};
+
+enum {
+ GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
+ GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
+ GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
+ GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
+
+ GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
+ GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
+
+};
+
+#ifndef _WIN32
+#ifndef strcmpi
+#define strcmpi strcasecmp
+#endif
+#ifndef stricmp
+#define stricmp strcasecmp
+#endif
+#ifndef strncmpi
+#define strncmpi strncasecmp
+#endif
+#ifndef strnicmp
+#define strnicmp strncasecmp
+#endif
+#ifndef strrchr
+#define strrchr rindex
+#endif
+
+#endif
+
+#endif // _MMO_H_
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
index 0e2f53664..5fbf5fc1d 100644
--- a/src/common/nullpo.c
+++ b/src/common/nullpo.c
@@ -1,90 +1,90 @@
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include "nullpo.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;
-
- printf("--- nullpo info --------------------------------------------\n");
- printf("%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')
- printf("\n");
- }
- }
- printf("--- end nullpo info ----------------------------------------\n");
-
- // ‚±‚±‚ç‚ÅnullpoƒƒO‚ðƒtƒ@ƒCƒ‹‚É‘‚«o‚¹‚½‚ç
- // ‚Ü‚Æ‚ß‚Ä’ño‚Å‚«‚é‚È‚ÆŽv‚Á‚Ä‚¢‚½‚èB
-}
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "nullpo.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;
+
+ printf("--- nullpo info --------------------------------------------\n");
+ printf("%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')
+ printf("\n");
+ }
+ }
+ printf("--- 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 6365cf02d..11283f941 100644
--- a/src/common/nullpo.h
+++ b/src/common/nullpo.h
@@ -1,222 +1,222 @@
-#ifndef _NULLPO_H_
-#define _NULLPO_H_
-
-
-#define NULLPO_CHECK 1
- // ‘S‘̂̃XƒCƒbƒ`‚ð錾‚µ‚Ä‚¢‚éƒwƒbƒ_‚ª‚ ‚ê‚Î
- // ‚»‚±‚Ɉړ®‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Æ
-
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# 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);}
-
-
-// ‰Â•Ïˆø”ƒ}ƒ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);}
-
-#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);}
-
-#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)){;}
-
-// ‰Â•Ïˆø”ƒ}ƒ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)){;}
-
-#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)){;}
-
-#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
+#ifndef _NULLPO_H_
+#define _NULLPO_H_
+
+
+#define NULLPO_CHECK 1
+ // ‘S‘̂̃XƒCƒbƒ`‚ð錾‚µ‚Ä‚¢‚éƒwƒbƒ_‚ª‚ ‚ê‚Î
+ // ‚»‚±‚Ɉړ®‚µ‚Ä‚¢‚½‚¾‚¯‚é‚Æ
+
+
+#if __STDC_VERSION__ < 199901L
+# if __GNUC__ >= 2
+# define __func__ __FUNCTION__
+# else
+# define __func__ ""
+# 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);}
+
+
+// ‰Â•Ïˆø”ƒ}ƒ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);}
+
+#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);}
+
+#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)){;}
+
+// ‰Â•Ïˆø”ƒ}ƒ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)){;}
+
+#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)){;}
+
+#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/showmsg.c b/src/common/showmsg.c
index 06daaa42e..28bf58edc 100644
--- a/src/common/showmsg.c
+++ b/src/common/showmsg.c
@@ -1,71 +1,71 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "showmsg.h"
-
-int _ShowMessage(const char *string, int flag){ // by MC Cameri
- /*
- _ShowMessage MUST be used instead of printf as of 10/24/2004.
- Return: 0 = Successful, 1 = Failed.
- */
-// int ret = 0;
- char prefix[40];
- char *output;
- if (strlen(string) <= 0) {
- ShowMessage("Empty string passed to ShowMessage().\n",MSG_ERROR);
- return 1;
- }
- switch (flag) {
- case MSG_STATUS: //Bright Green (To inform about good things)
- strcpy(prefix,"\033[1;32m[Status]\033[0;0m: ");
- break;
-/* //Do we really need this now? [MC Cameri]
- case MSG_SQL: //Bright Violet (For dumping out anything related with SQL)
- strcpy(prefix,"\033[1;35m[SQL]\033[0;0m: ");
- break;
-*/
- case MSG_INFORMATION: //Bright Blue (Variable information)
- strcpy(prefix,"\033[1;34m[Info]\033[0;0m: ");
- break;
- case MSG_NOTICE: //Bright White (Less than a warning)
- strcpy(prefix,"\033[1;29m[Notice]\033[0;0m: ");
- break;
- case MSG_WARNING: //Bright Yellow
- strcpy(prefix,"\033[1;33m[Warning]\033[0;0m: ");
- break;
- case MSG_ERROR: //Bright Red (Regular errors)
- strcpy(prefix,"\033[1;31m[Error]\033[0;0m: ");
- break;
- case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible)
- strcpy(prefix,"\033[1;31m[Fatal Error]\033[0;0m: ");
- break;
- default:
- ShowMessage("In function ShowMessage() -> Invalid flag passed.\n",MSG_ERROR);
- return 1;
- }
- output = (char*)malloc(sizeof(char)*(strlen(prefix)+strlen(string))+1);
- if (output == NULL) {
- return 1;
-// abort(); // Kill server?
- }
- strcpy(output,prefix);
- strcat(output,string);
- printf(output);
- fflush(stdout);
-/*
- if ((core_config.debug_output_level > -1) && (flag >= core_config.debug_output_level)) {
- FILE *fp;
- fp=fopen(OUTPUT_MESSAGES_LOG,"a");
- if (fp == NULL) {
- printf("\033[1;31m[Error]\033[0;0m: Could not open \033[1;29m%s\033[0;0m, file not found.\n",OUTPUT_MESSAGES_LOG);
- fflush(stdout);
- return;
- }
- StripColor(output);
- strcpy(output,"\r");
- fwrite(output,strlen(output),1,fp);
- fclose(fp);
- }
-*/
- return 0;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "showmsg.h"
+
+int _ShowMessage(const char *string, int flag){ // by MC Cameri
+ /*
+ _ShowMessage MUST be used instead of printf as of 10/24/2004.
+ Return: 0 = Successful, 1 = Failed.
+ */
+// int ret = 0;
+ char prefix[40];
+ char *output;
+ if (strlen(string) <= 0) {
+ ShowMessage("Empty string passed to ShowMessage().\n",MSG_ERROR);
+ return 1;
+ }
+ switch (flag) {
+ case MSG_STATUS: //Bright Green (To inform about good things)
+ strcpy(prefix,"\033[1;32m[Status]\033[0;0m: ");
+ break;
+/* //Do we really need this now? [MC Cameri]
+ case MSG_SQL: //Bright Violet (For dumping out anything related with SQL)
+ strcpy(prefix,"\033[1;35m[SQL]\033[0;0m: ");
+ break;
+*/
+ case MSG_INFORMATION: //Bright Blue (Variable information)
+ strcpy(prefix,"\033[1;34m[Info]\033[0;0m: ");
+ break;
+ case MSG_NOTICE: //Bright White (Less than a warning)
+ strcpy(prefix,"\033[1;29m[Notice]\033[0;0m: ");
+ break;
+ case MSG_WARNING: //Bright Yellow
+ strcpy(prefix,"\033[1;33m[Warning]\033[0;0m: ");
+ break;
+ case MSG_ERROR: //Bright Red (Regular errors)
+ strcpy(prefix,"\033[1;31m[Error]\033[0;0m: ");
+ break;
+ case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible)
+ strcpy(prefix,"\033[1;31m[Fatal Error]\033[0;0m: ");
+ break;
+ default:
+ ShowMessage("In function ShowMessage() -> Invalid flag passed.\n",MSG_ERROR);
+ return 1;
+ }
+ output = (char*)malloc(sizeof(char)*(strlen(prefix)+strlen(string))+1);
+ if (output == NULL) {
+ return 1;
+// abort(); // Kill server?
+ }
+ strcpy(output,prefix);
+ strcat(output,string);
+ printf(output);
+ fflush(stdout);
+/*
+ if ((core_config.debug_output_level > -1) && (flag >= core_config.debug_output_level)) {
+ FILE *fp;
+ fp=fopen(OUTPUT_MESSAGES_LOG,"a");
+ if (fp == NULL) {
+ printf("\033[1;31m[Error]\033[0;0m: Could not open \033[1;29m%s\033[0;0m, file not found.\n",OUTPUT_MESSAGES_LOG);
+ fflush(stdout);
+ return;
+ }
+ StripColor(output);
+ strcpy(output,"\r");
+ fwrite(output,strlen(output),1,fp);
+ fclose(fp);
+ }
+*/
+ return 0;
+}
diff --git a/src/common/showmsg.h b/src/common/showmsg.h
index 9ecd90ec3..2389410b3 100644
--- a/src/common/showmsg.h
+++ b/src/common/showmsg.h
@@ -1,48 +1,48 @@
-#ifndef _SHOWMSG_H_
-#define _SHOWMSG_H_
-
-/* MSG_XX */
- #define ShowMsg(string,flag) _ShowMessage(string,flag)
- #define DisplayMsg(string,flag) _ShowMessage(string,flag)
- #define ShowMessage(string,flag) _ShowMessage(string,flag)
-
-/* MSG_STATUS */
- #define ShowStatus(string) _ShowMessage(string,MSG_STATUS)
- #define DisplayStatus(string) _ShowMessage(string,MSG_STATUS)
-
-/* MSG_SQL*/
-// #define ShowSQL(string) _ShowMessage(string,MSG_SQL)
-// #define DisplaySQL(string) _ShowMessage(string,MSG_SQL)
-
-/* MSG_INFORMATION */
- #define ShowInfo(string) _ShowMessage(string,MSG_INFORMATION)
- #define DisplayInfo(string) _ShowMessage(string,MSG_INFORMATION)
-// #define ShowInformation(string) _ShowMessage(string,MSG_INFORMATION)
-// #define DisplayInformation(string) _ShowMessage(string,MSG_INFORMATION)
-
-/* MSG_NOTICE */
- #define ShowNotice(string) _ShowMessage(string,MSG_NOTICE)
- #define DisplayNotice(string) _ShowMessage(string,MSG_NOTICE)
-
-/* */
- #define ShowWarning(string) _ShowMessage(string,MSG_WARNING)
- #define DisplayWarning(string) _ShowMessage(string,MSG_WARNING)
-// #define Warn(string) _ShowMessage(string,MSG_WARNING)
-
-/* MSG_ERROR */
- #define ShowError(string) _ShowMessage(string,MSG_ERROR)
- #define DisplayError(string) _ShowMessage(string,MSG_ERROR)
-// #define OutputError(string) _ShowMessage(string,MSG_ERROR)
-
-/* MSG_FATALERROR */
- #define ShowFatalError(string) _ShowMessage(string,MSG_FATALERROR)
- #define DisplayFatalError(string) _ShowMessage(string,MSG_ERROR)
-// #define Terminate(string) _ShowMessage(string,MSG_FATALERROR)
-// #define Kill(string) _ShowMessage(string,MSG_FATALERROR)
-// #define AbortEx(string) _ShowMessage(string,MSG_FATALERROR)
-
-enum msg_type {MSG_STATUS,/* MSG_SQL, */MSG_INFORMATION,MSG_NOTICE,MSG_WARNING,MSG_ERROR,MSG_FATALERROR};
-
-extern int _ShowMessage(const char *string, int flag);
-
-#endif
+#ifndef _SHOWMSG_H_
+#define _SHOWMSG_H_
+
+/* MSG_XX */
+ #define ShowMsg(string,flag) _ShowMessage(string,flag)
+ #define DisplayMsg(string,flag) _ShowMessage(string,flag)
+ #define ShowMessage(string,flag) _ShowMessage(string,flag)
+
+/* MSG_STATUS */
+ #define ShowStatus(string) _ShowMessage(string,MSG_STATUS)
+ #define DisplayStatus(string) _ShowMessage(string,MSG_STATUS)
+
+/* MSG_SQL*/
+// #define ShowSQL(string) _ShowMessage(string,MSG_SQL)
+// #define DisplaySQL(string) _ShowMessage(string,MSG_SQL)
+
+/* MSG_INFORMATION */
+ #define ShowInfo(string) _ShowMessage(string,MSG_INFORMATION)
+ #define DisplayInfo(string) _ShowMessage(string,MSG_INFORMATION)
+// #define ShowInformation(string) _ShowMessage(string,MSG_INFORMATION)
+// #define DisplayInformation(string) _ShowMessage(string,MSG_INFORMATION)
+
+/* MSG_NOTICE */
+ #define ShowNotice(string) _ShowMessage(string,MSG_NOTICE)
+ #define DisplayNotice(string) _ShowMessage(string,MSG_NOTICE)
+
+/* */
+ #define ShowWarning(string) _ShowMessage(string,MSG_WARNING)
+ #define DisplayWarning(string) _ShowMessage(string,MSG_WARNING)
+// #define Warn(string) _ShowMessage(string,MSG_WARNING)
+
+/* MSG_ERROR */
+ #define ShowError(string) _ShowMessage(string,MSG_ERROR)
+ #define DisplayError(string) _ShowMessage(string,MSG_ERROR)
+// #define OutputError(string) _ShowMessage(string,MSG_ERROR)
+
+/* MSG_FATALERROR */
+ #define ShowFatalError(string) _ShowMessage(string,MSG_FATALERROR)
+ #define DisplayFatalError(string) _ShowMessage(string,MSG_ERROR)
+// #define Terminate(string) _ShowMessage(string,MSG_FATALERROR)
+// #define Kill(string) _ShowMessage(string,MSG_FATALERROR)
+// #define AbortEx(string) _ShowMessage(string,MSG_FATALERROR)
+
+enum msg_type {MSG_STATUS,/* MSG_SQL, */MSG_INFORMATION,MSG_NOTICE,MSG_WARNING,MSG_ERROR,MSG_FATALERROR};
+
+extern int _ShowMessage(const char *string, int flag);
+
+#endif
diff --git a/src/common/socket.c b/src/common/socket.c
index c0d85b5ff..cdf05e52a 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1,594 +1,594 @@
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-
-#ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <net/if.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#endif
-
-#include <fcntl.h>
-#include <string.h>
-
-#include "mmo.h" // [Valaris] thanks to fov
-#include "socket.h"
-#include "utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-fd_set readfds;
-int fd_max;
-
-int rfifo_size = 65536;
-int wfifo_size = 65536;
-
-#ifndef TCP_FRAME_LEN
-#define TCP_FRAME_LEN 1053
-#endif
-
-struct socket_data *session[FD_SETSIZE];
-
-static int null_parse(int fd);
-static int (*default_func_parse)(int) = null_parse;
-
-static int null_console_parse(char *buf);
-static int (*default_console_parse)(char*) = null_console_parse;
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_defaultparse(int (*defaultparse)(int))
-{
- default_func_parse = defaultparse;
-}
-
-#ifdef NSOCKET
-static void setsocketopts(int fd)
-{
- int yes = 1; // reuse fix
-
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
-#endif
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-
- setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
- setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
-}
-
-#endif /* NSOCKET */
-/*======================================
- * CORE : Socket Sub Function
- *--------------------------------------
- */
-
-static int recv_to_fifo(int fd)
-{
- int len;
-
- //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof);
- if(session[fd]->eof)
- return -1;
-
-
-#ifdef _WIN32
- len=recv(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0);
-#else
- len=read(fd,session[fd]->rdata+session[fd]->rdata_size,RFIFOSPACE(fd));
-#endif
-
-// printf (":::RECEIVE:::\n");
-// dump(session[fd]->rdata, len); printf ("\n");
-
- //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");}
- if(len>0){
- session[fd]->rdata_size+=len;
- } else if(len<=0){
- // value of connection is not necessary the same
-// if (fd == 4) // Removed [Yor]
-// printf("Char-Server Has Disconnected.\n");
-// else if (fd == 5) // Removed [Yor]
-// printf("Attempt To Log In Successful.\n");
-// else if (fd == 7) // Removed [Yor]
-// printf("Char-Server Has Disconnected.\n");
-// else if (fd == 8) // Removed [Valaris]
-// printf("%s has logged off your server.\n",RFIFOP(fd,6)); // Removed [Valaris]
-
-// else if (fd != 8) // [Valaris]
- printf("set eof : connection #%d\n", fd);
- session[fd]->eof=1;
- }
- return 0;
-}
-
-static int send_from_fifo(int fd)
-{
- int len;
-
- //printf("send_from_fifo : %d\n",fd);
- if(session[fd]->eof)
- return -1;
-
-#ifdef _WIN32
- len=send(fd, session[fd]->wdata,session[fd]->wdata_size, 0);
-#else
- len=write(fd,session[fd]->wdata,session[fd]->wdata_size);
-#endif
-
-// printf (":::SEND:::\n");
-// dump(session[fd]->wdata, len); printf ("\n");
-
- //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");}
- if(len>0){
- if(len<session[fd]->wdata_size){
- memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len);
- session[fd]->wdata_size-=len;
- } else {
- session[fd]->wdata_size=0;
- }
- } else {
- printf("set eof :%d\n",fd);
- session[fd]->eof=1;
- }
- return 0;
-}
-
-static int null_parse(int fd)
-{
- printf("null_parse : %d\n",fd);
- RFIFOSKIP(fd,RFIFOREST(fd));
- return 0;
-}
-
-/*======================================
- * CORE : Socket Function
- *--------------------------------------
- */
-
-static int connect_client(int listen_fd)
-{
- int fd;
- struct sockaddr_in client_address;
- int len;
- int result;
-#ifndef NSOCKET
- int yes = 1; // reuse fix
-#endif /* not NSOCKET */
-
- //printf("connect_client : %d\n",listen_fd);
-
- len=sizeof(client_address);
-
- fd=accept(listen_fd,(struct sockaddr*)&client_address,&len);
- if(fd_max<=fd) fd_max=fd+1;
-
-#ifndef NSOCKET
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
-#endif
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-#else /* NSOCKET */
- setsocketopts(fd);
-#endif /* NSOCKET */
-
- if(fd==-1)
- perror("accept");
- else
- FD_SET(fd,&readfds);
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE(session[fd]->rdata, char, rfifo_size);
- CREATE(session[fd]->wdata, char, wfifo_size);
-
- session[fd]->max_rdata = rfifo_size;
- session[fd]->max_wdata = wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- session[fd]->func_parse = default_func_parse;
- session[fd]->client_addr = client_address;
-
- //printf("new_session : %d %d\n",fd,session[fd]->eof);
- return fd;
-}
-
-int make_listen_port(int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-#ifndef NSOCKET
- int yes = 1; // reuse fix
-#endif /* not NSOCKET */
-
- fd = socket( AF_INET, SOCK_STREAM, 0 );
- if(fd_max<=fd) fd_max=fd+1;
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
-#ifndef NSOCKET
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
-#endif
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-#else /* NSOCKET */
- setsocketopts(fd);
-#endif /* NSOCKET */
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = htonl( INADDR_ANY );
- server_address.sin_port = htons(port);
-
- result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
- if( result == -1 ) {
- perror("bind");
- exit(1);
- }
- result = listen( fd, 5 );
- if( result == -1 ) { /* error */
- perror("listen");
- exit(1);
- }
-
- FD_SET(fd, &readfds );
-
- CREATE(session[fd], struct socket_data, 1);
-
- if(session[fd]==NULL){
- printf("out of memory : make_listen_port\n");
- exit(1);
- }
- memset(session[fd],0,sizeof(*session[fd]));
- session[fd]->func_recv = connect_client;
-
- return fd;
-}
-
-// Console Reciever [Wizputer]
-int console_recieve(int i) {
- int n;
- char *buf;
-
- CREATE(buf, char , 64);
-
- memset(buf,0,sizeof(64));
-
- n = read(0, buf , 64);
- if ( n < 0 )
- printf("Console input read error\n");
- else
- session[0]->func_console(buf);
- return 0;
-}
-
-void set_defaultconsoleparse(int (*defaultparse)(char*))
-{
- default_console_parse = defaultparse;
-}
-
-static int null_console_parse(char *buf)
-{
- printf("null_console_parse : %s\n",buf);
- return 0;
-}
-
-// Console Input [Wizputer]
-int start_console(void) {
- FD_SET(0,&readfds);
-
- CREATE(session[0], struct socket_data, 1);
- if(session[0]==NULL){
- printf("out of memory : start_console\n");
- exit(1);
- }
-
- memset(session[0],0,sizeof(*session[0]));
-
- session[0]->func_recv = console_recieve;
- session[0]->func_console = default_console_parse;
-
- return 0;
-}
-
-int make_connection(long ip,int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-#ifndef NSOCKET
- int yes = 1; // reuse fix
-#endif /* not NSOCKET */
-
- fd = socket( AF_INET, SOCK_STREAM, 0 );
-#ifndef NSOCKET
- if(fd_max<=fd) fd_max=fd+1;
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
-#endif
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-#else /* NSOCKET */
- if(fd_max<=fd)
- fd_max=fd+1;
-
- setsocketopts(fd);
-#endif /* NSOCKET */
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = ip;
- server_address.sin_port = htons(port);
-
-#ifdef _WIN32
- {
- unsigned long val = 1;
- ioctlsocket(fd, FIONBIO, &val);
- }
-#else
- result = fcntl(fd, F_SETFL, O_NONBLOCK);
-#endif
-
- result = connect(fd, (struct sockaddr *)(&server_address),sizeof(struct sockaddr_in));
-
- FD_SET(fd,&readfds);
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE(session[fd]->rdata, char, rfifo_size);
- CREATE(session[fd]->wdata, char, wfifo_size);
-
- session[fd]->max_rdata = rfifo_size;
- session[fd]->max_wdata = wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- session[fd]->func_parse = default_func_parse;
-
- return fd;
-}
-
-int delete_session(int fd)
-{
- if(fd<0 || fd>=FD_SETSIZE)
- return -1;
- FD_CLR(fd,&readfds);
- if(session[fd]){
- if(session[fd]->rdata)
- free(session[fd]->rdata);
- if(session[fd]->wdata)
- free(session[fd]->wdata);
- if(session[fd]->session_data)
- free(session[fd]->session_data);
- free(session[fd]);
- }
- session[fd]=NULL;
- //printf("delete_session:%d\n",fd);
- return 0;
-}
-
-int realloc_fifo(int fd,int rfifo_size,int wfifo_size)
-{
- struct socket_data *s=session[fd];
- if( s->max_rdata != rfifo_size && s->rdata_size < rfifo_size){
- RECREATE(s->rdata, char, rfifo_size);
- s->max_rdata = rfifo_size;
- }
- if( s->max_wdata != wfifo_size && s->wdata_size < wfifo_size){
- RECREATE(s->wdata, char, wfifo_size);
- s->max_wdata = wfifo_size;
- }
- return 0;
-}
-
-int WFIFOSET(int fd,int len)
-{
- struct socket_data *s=session[fd];
-#ifdef NSOCKET
- if (s == NULL || s->wdata == NULL)
- return 0;
-#endif /* NSOCKET */
- if( s->wdata_size+len+16384 > s->max_wdata ){
- realloc_fifo(fd,s->max_rdata, s->max_wdata <<1 );
- printf("socket: %d wdata expanded to %d bytes.\n",fd, s->max_wdata);
- }
- s->wdata_size=(s->wdata_size+(len)+2048 < s->max_wdata) ?
- s->wdata_size+len : (printf("socket: %d wdata lost !!\n",fd),s->wdata_size);
-#ifdef NSOCKET
- if (s->wdata_size > (TCP_FRAME_LEN))
- send_from_fifo(fd);
-#endif /* NSOCKET */
- return 0;
-}
-
-int do_sendrecv(int next)
-{
- fd_set rfd,wfd;
- struct timeval timeout;
- int ret,i;
-
- rfd=readfds;
- FD_ZERO(&wfd);
- for(i=0;i<fd_max;i++){
- if(!session[i] && FD_ISSET(i,&readfds)){
- printf("force clr fds %d\n",i);
- FD_CLR(i,&readfds);
- continue;
- }
- if(!session[i])
- continue;
- if(session[i]->wdata_size)
- FD_SET(i,&wfd);
- }
- timeout.tv_sec = next/1000;
- timeout.tv_usec = next%1000*1000;
- ret = select(fd_max,&rfd,&wfd,NULL,&timeout);
- if(ret<=0)
- return 0;
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- if(FD_ISSET(i,&wfd)){
- //printf("write:%d\n",i);
- if(session[i]->func_send)
- //send_from_fifo(i);
- session[i]->func_send(i);
- }
- if(FD_ISSET(i,&rfd)){
- //printf("read:%d\n",i);
- if(session[i]->func_recv)
- //recv_to_fifo(i);
- session[i]->func_recv(i);
- }
- }
- return 0;
-}
-
-int do_parsepacket(void)
-{
- int i;
- for(i=0;i<fd_max;i++){
- if(!session[i])
- continue;
- if(session[i]->rdata_size==0 && session[i]->eof==0)
- continue;
- if(session[i]->func_parse){
- session[i]->func_parse(i);
- if(!session[i])
- continue;
- }
- RFIFOFLUSH(i);
- }
- return 0;
-}
-
-void do_socket(void)
-{
- FD_ZERO(&readfds);
-}
-
-int RFIFOSKIP(int fd,int len)
-{
- struct socket_data *s=session[fd];
-
- if (s->rdata_size-s->rdata_pos-len<0) {
- fprintf(stderr,"too many skip\n");
- exit(1);
- }
-
- s->rdata_pos = s->rdata_pos+len;
-
- return 0;
-}
-
-
-unsigned int addr_[16]; // ip addresses of local host (host byte order)
-unsigned int naddr_ = 0; // # of ip addresses
-
-int Net_Init(void)
-{
-#ifdef _WIN32
- char** a;
- unsigned int i;
- char fullhost[255];
- struct hostent* hent;
-
- /* Start up the windows networking */
- WSADATA wsaData;
-
- if ( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ) {
- printf("SYSERR: WinSock not available!\n");
- exit(1);
- }
-
- if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) {
- printf("Ugg.. no hostname defined!\n");
- return 0;
- }
-
- // XXX This should look up the local IP addresses in the registry
- // instead of calling gethostbyname. However, the way IP addresses
- // are stored in the registry is annoyingly complex, so I'll leave
- // this as T.B.D.
- hent = gethostbyname(fullhost);
- if (hent == NULL) {
- printf("Cannot resolve our own hostname to a IP address");
- return 0;
- }
-
- a = hent->h_addr_list;
- for(i = 0; a[i] != 0 && i < 16; ++i) {
- unsigned long addr1 = ntohl(*(unsigned long*) a[i]);
- addr_[i] = addr1;
- }
- naddr_ = i;
-#else
- int pos;
- int fdes = socket(AF_INET, SOCK_STREAM, 0);
- char buf[16 * sizeof(struct ifreq)];
- struct ifconf ic;
-
- // The ioctl call will fail with Invalid Argument if there are more
- // interfaces than will fit in the buffer
- ic.ifc_len = sizeof(buf);
- ic.ifc_buf = buf;
- if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) {
- printf("SIOCGIFCONF failed!\n");
- return 0;
- }
-
- for(pos = 0; pos < ic.ifc_len;)
- {
- struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos);
-
- struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr);
-
- if(a->sin_family == AF_INET) {
- u_long ad = ntohl(a->sin_addr.s_addr);
- if(ad != INADDR_LOOPBACK) {
- addr_[naddr_ ++] = ad;
- if(naddr_ == 16)
- break;
- }
- }
-
-#if defined(_AIX) || defined(__APPLE__)
- pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :)
- pos += sizeof(ir->ifr_name);
-#else
- pos += sizeof(struct ifreq);
-#endif
- }
-
-#endif
-
- return(0);
-}
+// original : core.c 2003/02/26 18:03:12 Rev 1.7
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#ifdef _WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <net/if.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#endif
+
+#include <fcntl.h>
+#include <string.h>
+
+#include "mmo.h" // [Valaris] thanks to fov
+#include "socket.h"
+#include "utils.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+fd_set readfds;
+int fd_max;
+
+int rfifo_size = 65536;
+int wfifo_size = 65536;
+
+#ifndef TCP_FRAME_LEN
+#define TCP_FRAME_LEN 1053
+#endif
+
+struct socket_data *session[FD_SETSIZE];
+
+static int null_parse(int fd);
+static int (*default_func_parse)(int) = null_parse;
+
+static int null_console_parse(char *buf);
+static int (*default_console_parse)(char*) = null_console_parse;
+
+/*======================================
+ * CORE : Set function
+ *--------------------------------------
+ */
+void set_defaultparse(int (*defaultparse)(int))
+{
+ default_func_parse = defaultparse;
+}
+
+#ifdef NSOCKET
+static void setsocketopts(int fd)
+{
+ int yes = 1; // reuse fix
+
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
+#ifdef SO_REUSEPORT
+ setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
+#endif
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+
+ setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
+ setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
+}
+
+#endif /* NSOCKET */
+/*======================================
+ * CORE : Socket Sub Function
+ *--------------------------------------
+ */
+
+static int recv_to_fifo(int fd)
+{
+ int len;
+
+ //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof);
+ if(session[fd]->eof)
+ return -1;
+
+
+#ifdef _WIN32
+ len=recv(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0);
+#else
+ len=read(fd,session[fd]->rdata+session[fd]->rdata_size,RFIFOSPACE(fd));
+#endif
+
+// printf (":::RECEIVE:::\n");
+// dump(session[fd]->rdata, len); printf ("\n");
+
+ //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");}
+ if(len>0){
+ session[fd]->rdata_size+=len;
+ } else if(len<=0){
+ // value of connection is not necessary the same
+// if (fd == 4) // Removed [Yor]
+// printf("Char-Server Has Disconnected.\n");
+// else if (fd == 5) // Removed [Yor]
+// printf("Attempt To Log In Successful.\n");
+// else if (fd == 7) // Removed [Yor]
+// printf("Char-Server Has Disconnected.\n");
+// else if (fd == 8) // Removed [Valaris]
+// printf("%s has logged off your server.\n",RFIFOP(fd,6)); // Removed [Valaris]
+
+// else if (fd != 8) // [Valaris]
+ printf("set eof : connection #%d\n", fd);
+ session[fd]->eof=1;
+ }
+ return 0;
+}
+
+static int send_from_fifo(int fd)
+{
+ int len;
+
+ //printf("send_from_fifo : %d\n",fd);
+ if(session[fd]->eof)
+ return -1;
+
+#ifdef _WIN32
+ len=send(fd, session[fd]->wdata,session[fd]->wdata_size, 0);
+#else
+ len=write(fd,session[fd]->wdata,session[fd]->wdata_size);
+#endif
+
+// printf (":::SEND:::\n");
+// dump(session[fd]->wdata, len); printf ("\n");
+
+ //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");}
+ if(len>0){
+ if(len<session[fd]->wdata_size){
+ memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len);
+ session[fd]->wdata_size-=len;
+ } else {
+ session[fd]->wdata_size=0;
+ }
+ } else {
+ printf("set eof :%d\n",fd);
+ session[fd]->eof=1;
+ }
+ return 0;
+}
+
+static int null_parse(int fd)
+{
+ printf("null_parse : %d\n",fd);
+ RFIFOSKIP(fd,RFIFOREST(fd));
+ return 0;
+}
+
+/*======================================
+ * CORE : Socket Function
+ *--------------------------------------
+ */
+
+static int connect_client(int listen_fd)
+{
+ int fd;
+ struct sockaddr_in client_address;
+ int len;
+ int result;
+#ifndef NSOCKET
+ int yes = 1; // reuse fix
+#endif /* not NSOCKET */
+
+ //printf("connect_client : %d\n",listen_fd);
+
+ len=sizeof(client_address);
+
+ fd=accept(listen_fd,(struct sockaddr*)&client_address,&len);
+ if(fd_max<=fd) fd_max=fd+1;
+
+#ifndef NSOCKET
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
+#ifdef SO_REUSEPORT
+ setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
+#endif
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+#else /* NSOCKET */
+ setsocketopts(fd);
+#endif /* NSOCKET */
+
+ if(fd==-1)
+ perror("accept");
+ else
+ FD_SET(fd,&readfds);
+
+#ifdef _WIN32
+ {
+ unsigned long val = 1;
+ ioctlsocket(fd, FIONBIO, &val);
+ }
+#else
+ result = fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
+
+ CREATE(session[fd], struct socket_data, 1);
+ CREATE(session[fd]->rdata, char, rfifo_size);
+ CREATE(session[fd]->wdata, char, wfifo_size);
+
+ session[fd]->max_rdata = rfifo_size;
+ session[fd]->max_wdata = wfifo_size;
+ session[fd]->func_recv = recv_to_fifo;
+ session[fd]->func_send = send_from_fifo;
+ session[fd]->func_parse = default_func_parse;
+ session[fd]->client_addr = client_address;
+
+ //printf("new_session : %d %d\n",fd,session[fd]->eof);
+ return fd;
+}
+
+int make_listen_port(int port)
+{
+ struct sockaddr_in server_address;
+ int fd;
+ int result;
+#ifndef NSOCKET
+ int yes = 1; // reuse fix
+#endif /* not NSOCKET */
+
+ fd = socket( AF_INET, SOCK_STREAM, 0 );
+ if(fd_max<=fd) fd_max=fd+1;
+
+#ifdef _WIN32
+ {
+ unsigned long val = 1;
+ ioctlsocket(fd, FIONBIO, &val);
+ }
+#else
+ result = fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
+
+#ifndef NSOCKET
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
+#ifdef SO_REUSEPORT
+ setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
+#endif
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+#else /* NSOCKET */
+ setsocketopts(fd);
+#endif /* NSOCKET */
+
+ server_address.sin_family = AF_INET;
+ server_address.sin_addr.s_addr = htonl( INADDR_ANY );
+ server_address.sin_port = htons(port);
+
+ result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
+ if( result == -1 ) {
+ perror("bind");
+ exit(1);
+ }
+ result = listen( fd, 5 );
+ if( result == -1 ) { /* error */
+ perror("listen");
+ exit(1);
+ }
+
+ FD_SET(fd, &readfds );
+
+ CREATE(session[fd], struct socket_data, 1);
+
+ if(session[fd]==NULL){
+ printf("out of memory : make_listen_port\n");
+ exit(1);
+ }
+ memset(session[fd],0,sizeof(*session[fd]));
+ session[fd]->func_recv = connect_client;
+
+ return fd;
+}
+
+// Console Reciever [Wizputer]
+int console_recieve(int i) {
+ int n;
+ char *buf;
+
+ CREATE(buf, char , 64);
+
+ memset(buf,0,sizeof(64));
+
+ n = read(0, buf , 64);
+ if ( n < 0 )
+ printf("Console input read error\n");
+ else
+ session[0]->func_console(buf);
+ return 0;
+}
+
+void set_defaultconsoleparse(int (*defaultparse)(char*))
+{
+ default_console_parse = defaultparse;
+}
+
+static int null_console_parse(char *buf)
+{
+ printf("null_console_parse : %s\n",buf);
+ return 0;
+}
+
+// Console Input [Wizputer]
+int start_console(void) {
+ FD_SET(0,&readfds);
+
+ CREATE(session[0], struct socket_data, 1);
+ if(session[0]==NULL){
+ printf("out of memory : start_console\n");
+ exit(1);
+ }
+
+ memset(session[0],0,sizeof(*session[0]));
+
+ session[0]->func_recv = console_recieve;
+ session[0]->func_console = default_console_parse;
+
+ return 0;
+}
+
+int make_connection(long ip,int port)
+{
+ struct sockaddr_in server_address;
+ int fd;
+ int result;
+#ifndef NSOCKET
+ int yes = 1; // reuse fix
+#endif /* not NSOCKET */
+
+ fd = socket( AF_INET, SOCK_STREAM, 0 );
+#ifndef NSOCKET
+ if(fd_max<=fd) fd_max=fd+1;
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes);
+#ifdef SO_REUSEPORT
+ setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
+#endif
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+#else /* NSOCKET */
+ if(fd_max<=fd)
+ fd_max=fd+1;
+
+ setsocketopts(fd);
+#endif /* NSOCKET */
+
+ server_address.sin_family = AF_INET;
+ server_address.sin_addr.s_addr = ip;
+ server_address.sin_port = htons(port);
+
+#ifdef _WIN32
+ {
+ unsigned long val = 1;
+ ioctlsocket(fd, FIONBIO, &val);
+ }
+#else
+ result = fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
+
+ result = connect(fd, (struct sockaddr *)(&server_address),sizeof(struct sockaddr_in));
+
+ FD_SET(fd,&readfds);
+
+ CREATE(session[fd], struct socket_data, 1);
+ CREATE(session[fd]->rdata, char, rfifo_size);
+ CREATE(session[fd]->wdata, char, wfifo_size);
+
+ session[fd]->max_rdata = rfifo_size;
+ session[fd]->max_wdata = wfifo_size;
+ session[fd]->func_recv = recv_to_fifo;
+ session[fd]->func_send = send_from_fifo;
+ session[fd]->func_parse = default_func_parse;
+
+ return fd;
+}
+
+int delete_session(int fd)
+{
+ if(fd<0 || fd>=FD_SETSIZE)
+ return -1;
+ FD_CLR(fd,&readfds);
+ if(session[fd]){
+ if(session[fd]->rdata)
+ free(session[fd]->rdata);
+ if(session[fd]->wdata)
+ free(session[fd]->wdata);
+ if(session[fd]->session_data)
+ free(session[fd]->session_data);
+ free(session[fd]);
+ }
+ session[fd]=NULL;
+ //printf("delete_session:%d\n",fd);
+ return 0;
+}
+
+int realloc_fifo(int fd,int rfifo_size,int wfifo_size)
+{
+ struct socket_data *s=session[fd];
+ if( s->max_rdata != rfifo_size && s->rdata_size < rfifo_size){
+ RECREATE(s->rdata, char, rfifo_size);
+ s->max_rdata = rfifo_size;
+ }
+ if( s->max_wdata != wfifo_size && s->wdata_size < wfifo_size){
+ RECREATE(s->wdata, char, wfifo_size);
+ s->max_wdata = wfifo_size;
+ }
+ return 0;
+}
+
+int WFIFOSET(int fd,int len)
+{
+ struct socket_data *s=session[fd];
+#ifdef NSOCKET
+ if (s == NULL || s->wdata == NULL)
+ return 0;
+#endif /* NSOCKET */
+ if( s->wdata_size+len+16384 > s->max_wdata ){
+ realloc_fifo(fd,s->max_rdata, s->max_wdata <<1 );
+ printf("socket: %d wdata expanded to %d bytes.\n",fd, s->max_wdata);
+ }
+ s->wdata_size=(s->wdata_size+(len)+2048 < s->max_wdata) ?
+ s->wdata_size+len : (printf("socket: %d wdata lost !!\n",fd),s->wdata_size);
+#ifdef NSOCKET
+ if (s->wdata_size > (TCP_FRAME_LEN))
+ send_from_fifo(fd);
+#endif /* NSOCKET */
+ return 0;
+}
+
+int do_sendrecv(int next)
+{
+ fd_set rfd,wfd;
+ struct timeval timeout;
+ int ret,i;
+
+ rfd=readfds;
+ FD_ZERO(&wfd);
+ for(i=0;i<fd_max;i++){
+ if(!session[i] && FD_ISSET(i,&readfds)){
+ printf("force clr fds %d\n",i);
+ FD_CLR(i,&readfds);
+ continue;
+ }
+ if(!session[i])
+ continue;
+ if(session[i]->wdata_size)
+ FD_SET(i,&wfd);
+ }
+ timeout.tv_sec = next/1000;
+ timeout.tv_usec = next%1000*1000;
+ ret = select(fd_max,&rfd,&wfd,NULL,&timeout);
+ if(ret<=0)
+ return 0;
+ for(i=0;i<fd_max;i++){
+ if(!session[i])
+ continue;
+ if(FD_ISSET(i,&wfd)){
+ //printf("write:%d\n",i);
+ if(session[i]->func_send)
+ //send_from_fifo(i);
+ session[i]->func_send(i);
+ }
+ if(FD_ISSET(i,&rfd)){
+ //printf("read:%d\n",i);
+ if(session[i]->func_recv)
+ //recv_to_fifo(i);
+ session[i]->func_recv(i);
+ }
+ }
+ return 0;
+}
+
+int do_parsepacket(void)
+{
+ int i;
+ for(i=0;i<fd_max;i++){
+ if(!session[i])
+ continue;
+ if(session[i]->rdata_size==0 && session[i]->eof==0)
+ continue;
+ if(session[i]->func_parse){
+ session[i]->func_parse(i);
+ if(!session[i])
+ continue;
+ }
+ RFIFOFLUSH(i);
+ }
+ return 0;
+}
+
+void do_socket(void)
+{
+ FD_ZERO(&readfds);
+}
+
+int RFIFOSKIP(int fd,int len)
+{
+ struct socket_data *s=session[fd];
+
+ if (s->rdata_size-s->rdata_pos-len<0) {
+ fprintf(stderr,"too many skip\n");
+ exit(1);
+ }
+
+ s->rdata_pos = s->rdata_pos+len;
+
+ return 0;
+}
+
+
+unsigned int addr_[16]; // ip addresses of local host (host byte order)
+unsigned int naddr_ = 0; // # of ip addresses
+
+int Net_Init(void)
+{
+#ifdef _WIN32
+ char** a;
+ unsigned int i;
+ char fullhost[255];
+ struct hostent* hent;
+
+ /* Start up the windows networking */
+ WSADATA wsaData;
+
+ if ( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ) {
+ printf("SYSERR: WinSock not available!\n");
+ exit(1);
+ }
+
+ if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) {
+ printf("Ugg.. no hostname defined!\n");
+ return 0;
+ }
+
+ // XXX This should look up the local IP addresses in the registry
+ // instead of calling gethostbyname. However, the way IP addresses
+ // are stored in the registry is annoyingly complex, so I'll leave
+ // this as T.B.D.
+ hent = gethostbyname(fullhost);
+ if (hent == NULL) {
+ printf("Cannot resolve our own hostname to a IP address");
+ return 0;
+ }
+
+ a = hent->h_addr_list;
+ for(i = 0; a[i] != 0 && i < 16; ++i) {
+ unsigned long addr1 = ntohl(*(unsigned long*) a[i]);
+ addr_[i] = addr1;
+ }
+ naddr_ = i;
+#else
+ int pos;
+ int fdes = socket(AF_INET, SOCK_STREAM, 0);
+ char buf[16 * sizeof(struct ifreq)];
+ struct ifconf ic;
+
+ // The ioctl call will fail with Invalid Argument if there are more
+ // interfaces than will fit in the buffer
+ ic.ifc_len = sizeof(buf);
+ ic.ifc_buf = buf;
+ if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) {
+ printf("SIOCGIFCONF failed!\n");
+ return 0;
+ }
+
+ for(pos = 0; pos < ic.ifc_len;)
+ {
+ struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos);
+
+ struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr);
+
+ if(a->sin_family == AF_INET) {
+ u_long ad = ntohl(a->sin_addr.s_addr);
+ if(ad != INADDR_LOOPBACK) {
+ addr_[naddr_ ++] = ad;
+ if(naddr_ == 16)
+ break;
+ }
+ }
+
+#if defined(_AIX) || defined(__APPLE__)
+ pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :)
+ pos += sizeof(ir->ifr_name);
+#else
+ pos += sizeof(struct ifreq);
+#endif
+ }
+
+#endif
+
+ return(0);
+}
diff --git a/src/common/socket.h b/src/common/socket.h
index c9b3b1077..e3ad0826a 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -1,104 +1,104 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#include <stdio.h>
-
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-
-// define declaration
-
-#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
-#define RFIFOB(fd,pos) (*(unsigned char*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOW(fd,pos) (*(unsigned short*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOL(fd,pos) (*(unsigned int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
-#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
-#define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),session[fd]->rdata_size=RFIFOREST(fd),session[fd]->rdata_pos=0)
-#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
-#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
-#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
-#define RBUFL(p,pos) (*(unsigned int*)RBUFP((p),(pos)))
-
-#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
-#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
-#define WFIFOB(fd,pos) (*(unsigned char*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOW(fd,pos) (*(unsigned short*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOL(fd,pos) (*(unsigned int*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-// use function instead of macro.
-//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size+(len)+2048 < session[fd]->max_wdata) ? session[fd]->wdata_size+len : session[fd]->wdata_size)
-#define WBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define WBUFB(p,pos) (*(unsigned char*)WBUFP((p),(pos)))
-#define WBUFW(p,pos) (*(unsigned short*)WBUFP((p),(pos)))
-#define WBUFL(p,pos) (*(unsigned int*)WBUFP((p),(pos)))
-
-#ifdef __INTERIX
-#define FD_SETSIZE 4096
-#endif // __INTERIX
-
-
-/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
-
-// Struct declaration
-
-struct socket_data{
- int eof;
- unsigned char *rdata,*wdata;
- int max_rdata,max_wdata;
- int rdata_size,wdata_size;
- int rdata_pos;
- struct sockaddr_in client_addr;
- int (*func_recv)(int);
- int (*func_send)(int);
- int (*func_parse)(int);
- int (*func_console)(char*);
- void* session_data;
-};
-
-// Data prototype declaration
-
-#ifdef _WIN32
-
- #undef FD_SETSIZE
- #define FD_SETSIZE 4096
-
-#endif
-
-extern struct socket_data *session[FD_SETSIZE];
-
-extern int rfifo_size,wfifo_size;
-extern int fd_max;
-
-// Function prototype declaration
-
-int make_listen_port(int);
-int make_connection(long,int);
-int delete_session(int);
-int realloc_fifo(int fd,int rfifo_size,int wfifo_size);
-int WFIFOSET(int fd,int len);
-int RFIFOSKIP(int fd,int len);
-
-int do_sendrecv(int next);
-int do_parsepacket(void);
-void do_socket(void);
-
-int start_console(void);
-
-void set_defaultparse(int (*defaultparse)(int));
-void set_defaultconsoleparse(int (*defaultparse)(char*));
-
-int Net_Init(void);
-
-extern unsigned int addr_[16]; // ip addresses of local host (host byte order)
-extern unsigned int naddr_; // # of ip addresses
-
-
-#endif // _SOCKET_H_
+// original : core.h 2003/03/14 11:55:25 Rev 1.4
+
+#ifndef _SOCKET_H_
+#define _SOCKET_H_
+
+#include <stdio.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+
+// define declaration
+
+#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
+#define RFIFOB(fd,pos) (*(unsigned char*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
+#define RFIFOW(fd,pos) (*(unsigned short*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
+#define RFIFOL(fd,pos) (*(unsigned int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
+//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
+#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
+#define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),session[fd]->rdata_size=RFIFOREST(fd),session[fd]->rdata_pos=0)
+#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
+#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
+#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
+#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
+#define RBUFL(p,pos) (*(unsigned int*)RBUFP((p),(pos)))
+
+#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
+#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
+#define WFIFOB(fd,pos) (*(unsigned char*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
+#define WFIFOW(fd,pos) (*(unsigned short*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
+#define WFIFOL(fd,pos) (*(unsigned int*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
+// use function instead of macro.
+//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size+(len)+2048 < session[fd]->max_wdata) ? session[fd]->wdata_size+len : session[fd]->wdata_size)
+#define WBUFP(p,pos) (((unsigned char*)(p))+(pos))
+#define WBUFB(p,pos) (*(unsigned char*)WBUFP((p),(pos)))
+#define WBUFW(p,pos) (*(unsigned short*)WBUFP((p),(pos)))
+#define WBUFL(p,pos) (*(unsigned int*)WBUFP((p),(pos)))
+
+#ifdef __INTERIX
+#define FD_SETSIZE 4096
+#endif // __INTERIX
+
+
+/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
+
+// Struct declaration
+
+struct socket_data{
+ int eof;
+ unsigned char *rdata,*wdata;
+ int max_rdata,max_wdata;
+ int rdata_size,wdata_size;
+ int rdata_pos;
+ struct sockaddr_in client_addr;
+ int (*func_recv)(int);
+ int (*func_send)(int);
+ int (*func_parse)(int);
+ int (*func_console)(char*);
+ void* session_data;
+};
+
+// Data prototype declaration
+
+#ifdef _WIN32
+
+ #undef FD_SETSIZE
+ #define FD_SETSIZE 4096
+
+#endif
+
+extern struct socket_data *session[FD_SETSIZE];
+
+extern int rfifo_size,wfifo_size;
+extern int fd_max;
+
+// Function prototype declaration
+
+int make_listen_port(int);
+int make_connection(long,int);
+int delete_session(int);
+int realloc_fifo(int fd,int rfifo_size,int wfifo_size);
+int WFIFOSET(int fd,int len);
+int RFIFOSKIP(int fd,int len);
+
+int do_sendrecv(int next);
+int do_parsepacket(void);
+void do_socket(void);
+
+int start_console(void);
+
+void set_defaultparse(int (*defaultparse)(int));
+void set_defaultconsoleparse(int (*defaultparse)(char*));
+
+int Net_Init(void);
+
+extern unsigned int addr_[16]; // ip addresses of local host (host byte order)
+extern unsigned int naddr_; // # of ip addresses
+
+
+#endif // _SOCKET_H_
diff --git a/src/common/timer.c b/src/common/timer.c
index b2289e4f8..7d03d4e5e 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -1,312 +1,312 @@
-// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <sys/time.h>
-#endif
-
-#include "timer.h"
-#include "utils.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static struct TimerData* timer_data;
-static int timer_data_max,timer_data_num;
-static int* free_timer_list;
-static int free_timer_list_max, free_timer_list_pos;
-
-static int timer_heap_max;
-static int* timer_heap = NULL;
-
-// 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;
-
-#if defined(_WIN32)
-void gettimeofday(struct timeval *t, struct timezone *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;
-
- CREATE(tfl, struct timer_func_list, 1);
- CREATE(tfl->name, char, 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;
- for(tfl = tfl_root;tfl;tfl = tfl->next) {
- if (func == tfl->func)
- return tfl->name;
- }
- return "???";
-}
-
-/*----------------------------
- * 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, h;
-
- if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max) {
- int first = timer_heap == NULL;
-
- timer_heap_max += 256;
- RECREATE(timer_heap, int, timer_heap_max);
- memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
- if (first)
- timer_heap[0] = 0;
- }
-
- timer_heap[0]++;
-
- for (h = timer_heap[0]-1, i = (h - 1) / 2;
- h > 0 && DIFF_TICK(timer_data[index].tick,
- timer_data[timer_heap[i + 1]].tick) < 0;
- i = (h - 1) / 2) {
- timer_heap[h + 1] = timer_heap[i + 1];
- h = i;
- }
- timer_heap[h + 1] = index;
-}
-
-static int top_timer_heap()
-{
- if (timer_heap == NULL || timer_heap[0] <= 0)
- return -1;
-
- return timer_heap[1];
-}
-
-static int pop_timer_heap()
-{
- int i,h,k;
- int ret,last;
-
- if (timer_heap == NULL || timer_heap[0] <= 0)
- return -1;
- ret = timer_heap[1];
- last = timer_heap[timer_heap[0]];
- timer_heap[0]--;
-
- for(h = 0,k = 2;k<timer_heap[0];k = k * 2 + 2) {
- if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick , timer_data[timer_heap[k]].tick)>0)
- k--;
- timer_heap[h + 1] = timer_heap[k + 1], h = k;
- }
- if (k == timer_heap[0])
- timer_heap[h + 1] = timer_heap[k], h = k-1;
-
- for(i = (h-1)/2;
- h>0 && DIFF_TICK(timer_data[timer_heap[i + 1]].tick , timer_data[last].tick)>0;
- i = (h-1)/2) {
- timer_heap[h + 1] = timer_heap[i + 1],h = i;
- }
- timer_heap[h + 1] = last;
-
- return ret;
-}
-
-int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data)
-{
- struct TimerData* td;
- 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) {
- int j;
- if (timer_data_max == 0) {
- timer_data_max = 256;
- CREATE(timer_data, struct TimerData, timer_data_max);
- } else {
- timer_data_max += 256;
- RECREATE(timer_data, struct TimerData, timer_data_max);
- if (timer_data == NULL) {
- printf("out of memory : add_timer timer_data\n");
- exit(1);
- }
- memset(timer_data + (timer_data_max - 256), 0,
- sizeof(struct TimerData) * 256);
- }
- for(j = timer_data_max-256;j<timer_data_max; j++)
- timer_data[j].type = 0;
- }
- td = &timer_data[i];
- td->tick = tick;
- td->func = func;
- td->id = id;
- td->data = data;
- td->type = TIMER_ONCE_AUTODEL;
- td->interval = 1000;
- push_timer_heap(i);
- if (i >= timer_data_num)
- timer_data_num = i + 1;
- return i;
-}
-
-int add_timer_interval(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data,int interval)
-{
- int tid;
- tid = add_timer(tick,func,id,data);
- timer_data[tid].type = TIMER_INTERVAL;
- timer_data[tid].interval = interval;
- return tid;
-}
-
-int delete_timer(int id,int (*func)(int,unsigned int,int,int))
-{
- if (id <= 0 || id >= timer_data_num) {
- printf("delete_timer error : no such timer %d\n", id);
- return -1;
- }
- if (timer_data[id].func != func) {
- printf("delete_timer error : function dismatch %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;
- timer_data[id].tick -= 60 * 60 * 1000;
- return 0;
-}
-
-int addtick_timer(int tid,unsigned int tick)
-{
- return timer_data[tid].tick += tick;
-}
-struct TimerData* get_timer(int tid)
-{
- return &timer_data[tid];
-}
-
-
-int do_timer(unsigned int tick)
-{
- int i,nextmin = 1000;
-
-#if 0
- static int disp_tick = 0;
- if (DIFF_TICK(disp_tick,tick)<-5000 || DIFF_TICK(disp_tick,tick)>5000) {
- printf("timer %d(%d + %d)\n",timer_data_num,timer_heap[0],free_timer_list_pos);
- disp_tick = tick;
- }
-#endif
-
- while((i = top_timer_heap()) >= 0) {
- if (DIFF_TICK(timer_data[i].tick , tick)>0) {
- nextmin = DIFF_TICK(timer_data[i].tick , tick);
- break;
- }
- pop_timer_heap();
- timer_data[i].type |= TIMER_REMOVE_HEAP;
- if (timer_data[i].func) {
- if (DIFF_TICK(timer_data[i].tick , tick) < -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;
- RECREATE(free_timer_list, int, free_timer_list_max);
- memset(free_timer_list + (free_timer_list_max - 256), 0,
- 256 * sizeof(free_timer_list[0]));
- }
- 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<10)
- nextmin = 10;
- return nextmin;
-}
-
-void timer_final()
-{
- free(timer_data);
-}
+// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
+// original : core.c 2003/02/26 18:03:12 Rev 1.7
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#include <sys/time.h>
+#endif
+
+#include "timer.h"
+#include "utils.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+static struct TimerData* timer_data;
+static int timer_data_max,timer_data_num;
+static int* free_timer_list;
+static int free_timer_list_max, free_timer_list_pos;
+
+static int timer_heap_max;
+static int* timer_heap = NULL;
+
+// 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;
+
+#if defined(_WIN32)
+void gettimeofday(struct timeval *t, struct timezone *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;
+
+ CREATE(tfl, struct timer_func_list, 1);
+ CREATE(tfl->name, char, 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;
+ for(tfl = tfl_root;tfl;tfl = tfl->next) {
+ if (func == tfl->func)
+ return tfl->name;
+ }
+ return "???";
+}
+
+/*----------------------------
+ * 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, h;
+
+ if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max) {
+ int first = timer_heap == NULL;
+
+ timer_heap_max += 256;
+ RECREATE(timer_heap, int, timer_heap_max);
+ memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256);
+ if (first)
+ timer_heap[0] = 0;
+ }
+
+ timer_heap[0]++;
+
+ for (h = timer_heap[0]-1, i = (h - 1) / 2;
+ h > 0 && DIFF_TICK(timer_data[index].tick,
+ timer_data[timer_heap[i + 1]].tick) < 0;
+ i = (h - 1) / 2) {
+ timer_heap[h + 1] = timer_heap[i + 1];
+ h = i;
+ }
+ timer_heap[h + 1] = index;
+}
+
+static int top_timer_heap()
+{
+ if (timer_heap == NULL || timer_heap[0] <= 0)
+ return -1;
+
+ return timer_heap[1];
+}
+
+static int pop_timer_heap()
+{
+ int i,h,k;
+ int ret,last;
+
+ if (timer_heap == NULL || timer_heap[0] <= 0)
+ return -1;
+ ret = timer_heap[1];
+ last = timer_heap[timer_heap[0]];
+ timer_heap[0]--;
+
+ for(h = 0,k = 2;k<timer_heap[0];k = k * 2 + 2) {
+ if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick , timer_data[timer_heap[k]].tick)>0)
+ k--;
+ timer_heap[h + 1] = timer_heap[k + 1], h = k;
+ }
+ if (k == timer_heap[0])
+ timer_heap[h + 1] = timer_heap[k], h = k-1;
+
+ for(i = (h-1)/2;
+ h>0 && DIFF_TICK(timer_data[timer_heap[i + 1]].tick , timer_data[last].tick)>0;
+ i = (h-1)/2) {
+ timer_heap[h + 1] = timer_heap[i + 1],h = i;
+ }
+ timer_heap[h + 1] = last;
+
+ return ret;
+}
+
+int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data)
+{
+ struct TimerData* td;
+ 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) {
+ int j;
+ if (timer_data_max == 0) {
+ timer_data_max = 256;
+ CREATE(timer_data, struct TimerData, timer_data_max);
+ } else {
+ timer_data_max += 256;
+ RECREATE(timer_data, struct TimerData, timer_data_max);
+ if (timer_data == NULL) {
+ printf("out of memory : add_timer timer_data\n");
+ exit(1);
+ }
+ memset(timer_data + (timer_data_max - 256), 0,
+ sizeof(struct TimerData) * 256);
+ }
+ for(j = timer_data_max-256;j<timer_data_max; j++)
+ timer_data[j].type = 0;
+ }
+ td = &timer_data[i];
+ td->tick = tick;
+ td->func = func;
+ td->id = id;
+ td->data = data;
+ td->type = TIMER_ONCE_AUTODEL;
+ td->interval = 1000;
+ push_timer_heap(i);
+ if (i >= timer_data_num)
+ timer_data_num = i + 1;
+ return i;
+}
+
+int add_timer_interval(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data,int interval)
+{
+ int tid;
+ tid = add_timer(tick,func,id,data);
+ timer_data[tid].type = TIMER_INTERVAL;
+ timer_data[tid].interval = interval;
+ return tid;
+}
+
+int delete_timer(int id,int (*func)(int,unsigned int,int,int))
+{
+ if (id <= 0 || id >= timer_data_num) {
+ printf("delete_timer error : no such timer %d\n", id);
+ return -1;
+ }
+ if (timer_data[id].func != func) {
+ printf("delete_timer error : function dismatch %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;
+ timer_data[id].tick -= 60 * 60 * 1000;
+ return 0;
+}
+
+int addtick_timer(int tid,unsigned int tick)
+{
+ return timer_data[tid].tick += tick;
+}
+struct TimerData* get_timer(int tid)
+{
+ return &timer_data[tid];
+}
+
+
+int do_timer(unsigned int tick)
+{
+ int i,nextmin = 1000;
+
+#if 0
+ static int disp_tick = 0;
+ if (DIFF_TICK(disp_tick,tick)<-5000 || DIFF_TICK(disp_tick,tick)>5000) {
+ printf("timer %d(%d + %d)\n",timer_data_num,timer_heap[0],free_timer_list_pos);
+ disp_tick = tick;
+ }
+#endif
+
+ while((i = top_timer_heap()) >= 0) {
+ if (DIFF_TICK(timer_data[i].tick , tick)>0) {
+ nextmin = DIFF_TICK(timer_data[i].tick , tick);
+ break;
+ }
+ pop_timer_heap();
+ timer_data[i].type |= TIMER_REMOVE_HEAP;
+ if (timer_data[i].func) {
+ if (DIFF_TICK(timer_data[i].tick , tick) < -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;
+ RECREATE(free_timer_list, int, free_timer_list_max);
+ memset(free_timer_list + (free_timer_list_max - 256), 0,
+ 256 * sizeof(free_timer_list[0]));
+ }
+ 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<10)
+ nextmin = 10;
+ return nextmin;
+}
+
+void timer_final()
+{
+ free(timer_data);
+}
diff --git a/src/common/timer.h b/src/common/timer.h
index 1a9e68ca5..f6fc5c84d 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -1,45 +1,45 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _TIMER_H_
-#define _TIMER_H_
-
-#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
-
-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);
-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));
-
-extern void timer_final();
-
-#endif // _TIMER_H_
+// original : core.h 2003/03/14 11:55:25 Rev 1.4
+
+#ifndef _TIMER_H_
+#define _TIMER_H_
+
+#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
+
+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);
+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));
+
+extern void timer_final();
+
+#endif // _TIMER_H_
diff --git a/src/common/utils.c b/src/common/utils.c
index 00aed7ee4..941f2b0bd 100644
--- a/src/common/utils.c
+++ b/src/common/utils.c
@@ -1,108 +1,108 @@
-#include <string.h>
-#include "utils.h"
-#include <stdio.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");
-}
-
-
-#ifdef _WIN32
-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) {
- printf("SYSERR: str_cmp() passed 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, int n)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL) {
- printf("SYSERR: strn_cmp() passed 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 = strlen(name);
- while (len--) {
- if (*name >= 'a' && *name <= 'z')
- *name -= ('a' - 'A');
- name++;
- }
-}
-
-void str_lower(char *name)
-{
- int len = strlen(name);
-
- while (len--) {
- if (*name >= 'A' && *name <= 'Z')
- *name += ('a' - 'A');
- name++;
- }
-}
-
-#endif
-
+#include <string.h>
+#include "utils.h"
+#include <stdio.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");
+}
+
+
+#ifdef _WIN32
+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) {
+ printf("SYSERR: str_cmp() passed 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, int n)
+{
+ int chk, i;
+
+ if (arg1 == NULL || arg2 == NULL) {
+ printf("SYSERR: strn_cmp() passed 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 = strlen(name);
+ while (len--) {
+ if (*name >= 'a' && *name <= 'z')
+ *name -= ('a' - 'A');
+ name++;
+ }
+}
+
+void str_lower(char *name)
+{
+ int len = strlen(name);
+
+ while (len--) {
+ if (*name >= 'A' && *name <= 'Z')
+ *name += ('a' - 'A');
+ name++;
+ }
+}
+
+#endif
+
diff --git a/src/common/utils.h b/src/common/utils.h
index e350df5e8..c8efd525b 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -1,33 +1,33 @@
-
-#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 */
-
-
-#ifdef _WIN32
- int strcasecmp(const char *arg1, const char *arg2);
- int strncasecmp(const char *arg1, const char *arg2, int 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);
-
-
-#define CREATE(result, type, number) do {\
- if ((number) * sizeof(type) <= 0) \
- printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \
- if (!((result) = (type *) calloc ((number), sizeof(type)))) \
- { perror("SYSERR: malloc failure"); abort(); } } while(0)
-
-#define RECREATE(result,type,number) do {\
- if (!((result) = (type *) realloc ((result), sizeof(type) * (number))))\
- { printf("SYSERR: realloc failure"); abort(); } } while(0)
-
+
+#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 */
+
+
+#ifdef _WIN32
+ int strcasecmp(const char *arg1, const char *arg2);
+ int strncasecmp(const char *arg1, const char *arg2, int 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);
+
+
+#define CREATE(result, type, number) do {\
+ if ((number) * sizeof(type) <= 0) \
+ printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \
+ if (!((result) = (type *) calloc ((number), sizeof(type)))) \
+ { perror("SYSERR: malloc failure"); abort(); } } while(0)
+
+#define RECREATE(result,type,number) do {\
+ if (!((result) = (type *) realloc ((result), sizeof(type) * (number))))\
+ { printf("SYSERR: realloc failure"); abort(); } } while(0)
+
diff --git a/src/common/version.h b/src/common/version.h
index 25d2847b4..e33e2b305 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -1,27 +1,27 @@
-// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $
-#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_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 1052 // mod version (patch No.)
-
-#endif
+// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $
+#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_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 1052 // mod version (patch No.)
+
+#endif
diff --git a/src/ladmin/Makefile b/src/ladmin/Makefile
index 74f211f22..879edaeea 100644
--- a/src/ladmin/Makefile
+++ b/src/ladmin/Makefile
@@ -1,14 +1,14 @@
-all: ladmin
-txt: ladmin
-sql: ladmin
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h
-
-ladmin: ladmin.o md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../$@ ladmin.o md5calc.o $(COMMON_OBJ)
-ladmin.o: ladmin.c ladmin.h md5calc.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-
-clean:
- rm -f *.o ../../ladmin
+all: ladmin
+txt: ladmin
+sql: ladmin
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h
+
+ladmin: ladmin.o md5calc.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ ladmin.o md5calc.o $(COMMON_OBJ)
+ladmin.o: ladmin.c ladmin.h md5calc.h $(COMMON_H)
+md5calc.o: md5calc.c md5calc.h
+
+clean:
+ rm -f *.o ../../ladmin
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
index 8bc8f7599..497f3bdab 100644
--- a/src/ladmin/ladmin.c
+++ b/src/ladmin/ladmin.c
@@ -1,4385 +1,4385 @@
-// $Id: ladmin.c,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
-///////////////////////////////////////////////////////////////////////////
-// 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 <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h> // gettimeofday
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h> // close
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h> // str*
-#include <arpa/inet.h> // inet_addr
-#include <netdb.h> // gethostbyname
-#include <stdarg.h> // valist
-#include <ctype.h> // tolower
-
-#include "core.h"
-#include "socket.h"
-#include "ladmin.h"
-#include "version.h"
-#include "mmo.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.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(&(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 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;
-}
-
-//---------------------------------------------
-// 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(unsigned char *email) {
- char ch;
- unsigned 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;
-
- 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;
-
- 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;
-
- 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];
-
- 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;
-
- 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];
-
- 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() {
- 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;
-
- 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];
-
- 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) {
- 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) {
- if (strlen(message) == 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;
- }
-
- WFIFOW(login_fd,0) = 0x794e;
- WFIFOW(login_fd,2) = type;
- WFIFOL(login_fd,4) = strlen(message)+1;
- memcpy(WFIFOP(login_fd,8), message, strlen(message)+1);
- WFIFOSET(login_fd,8+strlen(message)+1);
- 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;
-
- 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];
-
- 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) {
- 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];
-
- 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() {
- 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];
-
- 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
-
- 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;
-
- 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;
-
- 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];
-
- 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() {
- 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() {
- 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;
-
- 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 = 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], md5key[RFIFOW(fd,2) - 4 + 1];
- memcpy(md5key, RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- md5key[sizeof(md5key)-1] = '0';
- if (passenc == 1) {
- strncpy(md5str, RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- strcat(md5str, loginserveradminpassword);
- } else if (passenc == 2) {
- strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword));
- strcat(md5str, 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;
- 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 ", 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 ", 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Compte [%s] créé avec succès [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- 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), 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), 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), RFIFOL(fd,2));
- ladmin_log("Modification du mot de passe du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Le mot de passe donné correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x793d: // answer of the change of an account sex
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Sexe du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Niveau de GM du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7941: // answer of the change of an account email
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Modification de l'e-mail du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7943: // answer of the change of an account memo
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Mémo du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7945: // answer of an account id search
- if (RFIFOREST(fd) < 30)
- return 0;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,30);
- break;
-
- case 0x7947: // answer of an account name search
- if (RFIFOREST(fd) < 30)
- return 0;
- if (strcmp(RFIFOP(fd,6), "") == 0) {
- if (defaultlanguage == 'F') {
- printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", RFIFOL(fd,2));
- ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, RFIFOL(fd,2));
- } else {
- printf("Unable to find the account [%d] name. Account doesn't exist.\n", RFIFOL(fd,2));
- ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, RFIFOL(fd,2));
- }
- } else {
- if (defaultlanguage == 'F') {
- printf("Le compte [id: %d] a pour nom: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
- ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6));
- } else {
- printf("The account [id: %d] have the name: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
- ladmin_log("The account [id: %d] have the name: %s." RETCODE, RFIFOL(fd,2), 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- }
- }
- }
- bytes_to_read = 0;
- RFIFOSKIP(fd,34);
- break;
-
- case 0x794b: // answer of an account ban set
- if (RFIFOREST(fd) < 34)
- return 0;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
- }
- } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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;
- if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
- 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), RFIFOL(fd,2));
- } else {
- printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), RFIFOL(fd,2));
- 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), RFIFOL(fd,2));
- }
- } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
- } else {
- printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
- ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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, RFIFOP(fd,150), RFIFOW(fd,148));
- if (RFIFOL(fd,2) == -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", RFIFOL(fd,2));
- } else {
- if (defaultlanguage == 'F') {
- printf(" Id: %d (GM niveau %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
- } else {
- printf(" Id: %d (GM level %d)\n", RFIFOL(fd,2), (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", 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", RFIFOL(fd,32));
- else
- printf(" Compteur: %d connexion.\n", 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", RFIFOL(fd,32));
- else
- printf(" Count: %d connection.\n", 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() {
- 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);
-
-#ifdef PASSWORDENC
- if (passenc == 0) {
-#endif
- 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 {
- 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(w1);
- remove_control_chars(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) {
- // 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_termfunc(do_final);
- 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();
-
- atexit(do_final);
-
- return 0;
-}
+// $Id: ladmin.c,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
+///////////////////////////////////////////////////////////////////////////
+// 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 <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h> // gettimeofday
+#include <time.h>
+#include <sys/ioctl.h>
+#include <unistd.h> // close
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h> // str*
+#include <arpa/inet.h> // inet_addr
+#include <netdb.h> // gethostbyname
+#include <stdarg.h> // valist
+#include <ctype.h> // tolower
+
+#include "core.h"
+#include "socket.h"
+#include "ladmin.h"
+#include "version.h"
+#include "mmo.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+#ifdef MEMWATCH
+#include "memwatch.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(&(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 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;
+}
+
+//---------------------------------------------
+// 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(unsigned char *email) {
+ char ch;
+ unsigned 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;
+
+ 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;
+
+ 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;
+
+ 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];
+
+ 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;
+
+ 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];
+
+ 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() {
+ 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;
+
+ 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];
+
+ 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) {
+ 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) {
+ if (strlen(message) == 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;
+ }
+
+ WFIFOW(login_fd,0) = 0x794e;
+ WFIFOW(login_fd,2) = type;
+ WFIFOL(login_fd,4) = strlen(message)+1;
+ memcpy(WFIFOP(login_fd,8), message, strlen(message)+1);
+ WFIFOSET(login_fd,8+strlen(message)+1);
+ 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;
+
+ 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];
+
+ 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) {
+ 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];
+
+ 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() {
+ 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];
+
+ 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
+
+ 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;
+
+ 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;
+
+ 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];
+
+ 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() {
+ 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() {
+ 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;
+
+ 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 = 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], md5key[RFIFOW(fd,2) - 4 + 1];
+ memcpy(md5key, RFIFOP(fd,4), RFIFOW(fd,2) - 4);
+ md5key[sizeof(md5key)-1] = '0';
+ if (passenc == 1) {
+ strncpy(md5str, RFIFOP(fd,4), RFIFOW(fd,2) - 4);
+ strcat(md5str, loginserveradminpassword);
+ } else if (passenc == 2) {
+ strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword));
+ strcat(md5str, 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;
+ 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 ", 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 ", 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Compte [%s] créé avec succès [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ 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), 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), 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), RFIFOL(fd,2));
+ ladmin_log("Modification du mot de passe du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Le mot de passe donné correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x793d: // answer of the change of an account sex
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Sexe du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Niveau de GM du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7941: // answer of the change of an account email
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Modification de l'e-mail du compte [%s][id: %d] réussie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7943: // answer of the change of an account memo
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Mémo du compte [%s][id: %d] changé avec succès." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7945: // answer of an account id search
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,30);
+ break;
+
+ case 0x7947: // answer of an account name search
+ if (RFIFOREST(fd) < 30)
+ return 0;
+ if (strcmp(RFIFOP(fd,6), "") == 0) {
+ if (defaultlanguage == 'F') {
+ printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", RFIFOL(fd,2));
+ ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, RFIFOL(fd,2));
+ } else {
+ printf("Unable to find the account [%d] name. Account doesn't exist.\n", RFIFOL(fd,2));
+ ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, RFIFOL(fd,2));
+ }
+ } else {
+ if (defaultlanguage == 'F') {
+ printf("Le compte [id: %d] a pour nom: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
+ ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6));
+ } else {
+ printf("The account [id: %d] have the name: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6));
+ ladmin_log("The account [id: %d] have the name: %s." RETCODE, RFIFOL(fd,2), 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Limite de validité du compte [%s][id: %d] changée avec succès en [illimité]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
+ } else {
+ printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
+ ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
+ }
+ }
+ }
+ bytes_to_read = 0;
+ RFIFOSKIP(fd,34);
+ break;
+
+ case 0x794b: // answer of an account ban set
+ if (RFIFOREST(fd) < 34)
+ return 0;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ ladmin_log("Date finale de banissement du compte [%s][id: %d] changée avec succès en [dé-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2));
+ }
+ } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
+ } else {
+ printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
+ ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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;
+ if (RFIFOL(fd,2) == -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), RFIFOL(fd,2));
+ 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), RFIFOL(fd,2));
+ } else {
+ printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), RFIFOL(fd,2));
+ 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), RFIFOL(fd,2));
+ }
+ } 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), RFIFOL(fd,2), 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), RFIFOL(fd,2), tmpstr);
+ } else {
+ printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr);
+ ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), 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, RFIFOP(fd,150), RFIFOW(fd,148));
+ if (RFIFOL(fd,2) == -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", RFIFOL(fd,2));
+ } else {
+ if (defaultlanguage == 'F') {
+ printf(" Id: %d (GM niveau %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ } else {
+ printf(" Id: %d (GM level %d)\n", RFIFOL(fd,2), (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", 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", RFIFOL(fd,32));
+ else
+ printf(" Compteur: %d connexion.\n", 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", RFIFOL(fd,32));
+ else
+ printf(" Count: %d connection.\n", 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() {
+ 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);
+
+#ifdef PASSWORDENC
+ if (passenc == 0) {
+#endif
+ 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 {
+ 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(w1);
+ remove_control_chars(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) {
+ // 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_termfunc(do_final);
+ 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();
+
+ atexit(do_final);
+
+ return 0;
+}
diff --git a/src/ladmin/ladmin.h b/src/ladmin/ladmin.h
index 314c4b22e..f76bfc266 100644
--- a/src/ladmin/ladmin.h
+++ b/src/ladmin/ladmin.h
@@ -1,11 +1,11 @@
-// $Id: ladmin.h,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
-#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
+// $Id: ladmin.h,v 1.1.1.1 2004/09/10 17:26:52 MagicalTux Exp $
+#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 d1632127e..7b9a9a2c6 100644
--- a/src/ladmin/md5calc.c
+++ b/src/ladmin/md5calc.c
@@ -1,237 +1,237 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-/***********************************************************
- * 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,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]);
-}
-
+// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
+/***********************************************************
+ * 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,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 da6b509bd..b4dd61495 100644
--- a/src/ladmin/md5calc.h
+++ b/src/ladmin/md5calc.h
@@ -1,8 +1,8 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
+// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
+#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/Makefile b/src/login/Makefile
index d48c0cc24..300737cbf 100644
--- a/src/login/Makefile
+++ b/src/login/Makefile
@@ -1,13 +1,13 @@
-all: login-server
-txt: login-server
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/showmsg.h
-
-login-server: login.o md5calc.o $(COMMON_OBJ)
- $(CC) -o ../../$@ login.o md5calc.o $(COMMON_OBJ)
-login.o: login.c login.h md5calc.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-
-clean:
- rm -f *.o ../../login-server
+all: login-server
+txt: login-server
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/showmsg.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/showmsg.h
+
+login-server: login.o md5calc.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ login.o md5calc.o $(COMMON_OBJ)
+login.o: login.c login.h md5calc.h $(COMMON_H)
+md5calc.o: md5calc.c md5calc.h
+
+clean:
+ rm -f *.o ../../login-server
diff --git a/src/login/login.c b/src/login/login.c
index 912b209ee..c5921902a 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -1,3911 +1,3911 @@
-// $Id: login.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-// new version of the login-server by [Yor]
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <stdarg.h>
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "login.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/lock.h"
-#include "../common/malloc.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-int login_port = 6900;
-char lan_char_ip[16];
-int subneti[4];
-int subnetmaski[4];
-
-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 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 server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
-int anti_freeze_enable = 0;
-int ANTI_FREEZE_INTERVAL = 15;
-
-int login_fd;
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-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)
-
-struct login_session_data {
- 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 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;
-
-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] = "";
-int GM_num;
-int GM_max=256;
-char gm_pass[64] = "";
-int level_new_gm = 60;
-
-struct gm_account *gm_account_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;
-
-//------------------------------
-// Writing function of logs file
-//------------------------------
-int login_log(char *fmt, ...) {
- va_list ap;
- struct timeval tv;
- char tmpstr[2048];
-
- if(!log_fp)
- log_fp = fopen(login_log_filename, "a");
-
- 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);
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, 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;
-}
-
-//----------------------------------------------------------------------
-// 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_db[i].account_id == account_id)
- return gm_account_db[i].level;
- return 0;
-}
-
-//-------------------------------------------------------
-// Reading function of GM accounts file (and their level)
-//-------------------------------------------------------
-int read_gm_account() {
- char line[512];
- FILE *fp;
- int account_id, level;
- int i, line_counter;
- struct stat file_stat;
-
- if(gm_account_db) free(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 = file_stat.st_mtime;
-
- if ((fp = fopen(GM_account_filename, "r")) == NULL) {
- printf("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename);
- printf(" 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;
- if (sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
- printf("read_gm_account: file [%s], invalid 'id_acount level' format (line #%d).\n", GM_account_filename, line_counter);
- else if (level <= 0)
- printf("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) {
- printf("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
- level = 99;
- }
- for(i = 0; i < GM_num; i++)
- if (gm_account_db[i].account_id == account_id) {
- if (gm_account_db[i].level == level)
- printf("read_gm_account: GM account %d defined twice (same level: %d).\n", account_id, level);
- else {
- printf("read_gm_account: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
- gm_account_db[i].level = level;
- }
- break;
- }
- // if new account
- if (i == GM_num) {
- if (GM_num >= GM_max) {
- GM_max += 256;
- gm_account_db = realloc(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) {
- printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
- login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
- }
- }
- }
- }
- fclose(fp);
-
- printf("read_gm_account: file '%s' readed (%d GM accounts found).\n", GM_account_filename, GM_num);
- login_log("read_gm_account: file '%s' readed (%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(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(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(str+i, "%d", &m) == 1 && m >= 0 && m <= 32) {
- for(i = 0; i < m && i < 32; i++)
- mask = (mask >> 1) | 0x80000000;
- } else {
- printf("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[16];
- 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, 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, 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[16];
- 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, access_ip)) {
- return 1;
- }
- }
-
- return 0;
-}
-
-//-----------------------------------------------------
-// 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;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(unsigned char *email) {
- char ch;
- unsigned 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) {
- int i, quantity, 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,
- p->connect_until_time, p->last_ip, p->memo, 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,%d ", 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, j, v;
- char line[2048], *p, 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 str[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)
- printf("\033[1;31mmmo_auth_init: Accounts file [%s] not found.\033[0m\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) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- printf(" account id #%d -> account not read (saved in log file).\033[0m\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(userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
- printf(" account id #%d -> new account not read (saved in log file).\033[0m\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) {
- printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
- printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
- printf(" Account saved in log file.\033[0m\n");
- 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 = realloc(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(pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars(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) {
- printf("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(email);
- strncpy(auth_dat[auth_num].email, email, 40);
- }
-
- error_message[19] = '\0';
- remove_control_chars(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 = ban_until_time;
- else
- auth_dat[auth_num].ban_until_time = 0;
-
- auth_dat[auth_num].connect_until_time = connect_until_time;
-
- last_ip[15] = '\0';
- remove_control_chars(last_ip);
- strncpy(auth_dat[auth_num].last_ip, last_ip, 16);
-
- memo[254] = '\0';
- remove_control_chars(memo);
- strncpy(auth_dat[auth_num].memo, memo, 255);
-
- for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
- p += n;
- if (sscanf(p, "%[^\t,],%d %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, ",%d %n", &v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars(str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- auth_dat[auth_num].account_reg2[j].value = v;
- }
- 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) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
- printf(" account id #%d -> account not read (saved in log file).\033[0m\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(userid);
- for(j = 0; j < auth_num; j++) {
- if (auth_dat[j].account_id == account_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
- printf(" account id #%d -> new account not read (saved in log file).\033[0m\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) {
- printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
- printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
- printf(" Account saved in log file.\033[0m\n");
- 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 = realloc(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(pass);
- strncpy(auth_dat[auth_num].pass, pass, 24);
-
- lastlogin[23] = '\0';
- remove_control_chars(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,],%d %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, ",%d %n", &v, &n) == 1) {
- j--;
- continue;
- } else
- break;
- }
- str[31] = '\0';
- remove_control_chars(str);
- strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
- auth_dat[auth_num].account_reg2[j].value = v;
- }
- 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) {
- printf("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) {
- printf("mmo_auth_init: 1 account read in %s,\n", account_filename);
- sprintf(line, "1 account read in %s,", account_filename);
- } else {
- printf("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) {
- printf(" of which is no GM account, and ");
- sprintf(str, "%s of which is no GM account and", line);
- } else if (GM_count == 1) {
- printf(" of which is 1 GM account, and ");
- sprintf(str, "%s of which is 1 GM account and", line);
- } else {
- printf(" 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;
- int i, j, k, lock;
- int account_id;
- int id[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)
- 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;
-
- 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) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd, len);
- c++;
- }
- }
- return c;
-}
-
-//-----------------------------------------------------
-// Send GM accounts to all char-server
-//-----------------------------------------------------
-void send_GM_accounts() {
- int i;
- 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;
- }
- 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 = 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 = realloc(auth_dat, sizeof(struct auth_dat) * auth_max);
- memset(auth_dat, 0, 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, 24);
- auth_dat[i].userid[23] = '\0';
-
- strncpy(auth_dat[i].pass, account->passwd, 32);
- auth_dat[i].pass[23] = '\0';
-
- memcpy(auth_dat[i].lastlogin, "-", 2);
-
- auth_dat[i].sex = (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) {
- int i;
- struct timeval tv;
- 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];
-
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
-
- 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') && new_account_flag == 1 &&
- account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
- if (new_account_flag == 1)
- newaccount = 1;
- account->userid[len] = '\0';
- }
-
- // 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 == 0 && i == auth_num) {
- i = search_account_index(account->userid);
- if (i == -1)
- i = auth_num;
- else
- memcpy(account->userid, auth_dat[i].userid, 24); // 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, 25);
- encpasswdok = 0;
-#ifdef PASSWORDENC
- ld = 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;
- 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
- case 100: // 99 = This ID has been totally erased
- return auth_dat[i].state - 1;
- default:
- return 99; // 99 = ID has been totally erased
- }
- }
-
- 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 == 0) {
- 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
- }
- }
-
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec)));
- sprintf(tmpstr + strlen(tmpstr), ".%03d", (int)tv.tv_usec / 1000);
-
- 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;
- 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
-}
-
-//-------------------------------
-// Char-server anti-freeze system
-//-------------------------------
-int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
- int i;
-
- //printf("Entering in char_anti_freeze_system function to check freeze of servers.\n");
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {// if char-server is online
- //printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]);
- if (server_freezeflag[i]-- < 1) { // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- printf("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection.\n", i, server[i].name);
- login_log("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection." RETCODE,
- i, server[i].name);
- session[server_fd[i]]->eof = 1;
- } else {
- // send alive packet to check connection
- WFIFOW(server_fd[i],0) = 0x2718;
- WFIFOSET(server_fd[i],2);
- }
- }
- }
-
- return 0;
-}
-
-//--------------------------------
-// Packet parsing for char-servers
-//--------------------------------
-int parse_fromchar(int fd) {
- int i, j, id;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
- int acc;
-
- 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) {
- printf("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));
- }
- close(fd);
- delete_session(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)
- printf("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) {
- int p, k;
- 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) {
- WFIFOW(fd,0) = 0x2729; // Sending of the account_reg2
- WFIFOL(fd,4) = acc;
- for(p = 8, j = 0; j < auth_dat[k].account_reg2_num; p += 36, j++) {
- memcpy(WFIFOP(fd,p), auth_dat[k].account_reg2[j].str, 32);
- WFIFOL(fd,p+32) = auth_dat[k].account_reg2[j].value;
- }
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,p);
-// printf("parse_fromchar: Sending of account_reg2: login->char (auth fifo)\n");
- WFIFOW(fd,0) = 0x2713;
- WFIFOL(fd,2) = acc;
- WFIFOB(fd,6) = 0;
- memcpy(WFIFOP(fd, 7), auth_dat[k].email, 40);
- WFIFOL(fd,47) = (unsigned long)auth_dat[k].connect_until_time;
- WFIFOSET(fd,51);
- break;
- }
- }
- 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);
- 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);
- if(anti_freeze_enable)
- server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed
- 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(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(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];
- struct timeval tv;
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
- 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();
- printf("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 {
- printf("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 {
- printf("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 {
- printf("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 {
- printf("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(actual_email);
- memcpy(new_email, RFIFOP(fd,46), 40);
- new_email[39] = '\0';
- remove_control_chars(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) = 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 char-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];
- login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE,
- server[id].name, acc, ip);
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(auth_dat[i].account_reg2[j].str, RFIFOP(fd,p), 32);
- auth_dat[i].account_reg2[j].str[31] = '\0';
- remove_control_chars(auth_dat[i].account_reg2[j].str);
- auth_dat[i].account_reg2[j].value = RFIFOL(fd,p+32);
- }
- 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);
- 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 0x3000: //change sex for chrif_changesex()
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int sex, i = 0;
- 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];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- 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);
- }
- }
- printf("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- printf("Char-server has been disconnected (unknown packet).\n");
- return 0;
- }
- }
- return 0;
-}
-
-//---------------------------------------
-// Packet parsing for administation login
-//---------------------------------------
-int parse_admin(int fd) {
- int i, j;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char* account_name;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- if (session[fd]->eof) {
- close(fd);
- delete_session(fd);
- printf("Remote administration has disconnected (session #%d).\n", fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_admin == 1)
- printf("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);
- 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];
- 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++) {
- 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);
- }
- break;
-
- case 0x7930: // Request for an account creation
- if (RFIFOREST(fd) < 91)
- return 0;
- {
- struct mmo_account ma;
- ma.userid = RFIFOP(fd, 2);
- memcpy(ma.passwd, RFIFOP(fd, 26), 24);
- ma.passwd[24] = '\0';
- memcpy(ma.lastlogin, "-", 2);
- ma.sex = RFIFOB(fd,50);
- WFIFOW(fd,0) = 0x7931;
- WFIFOL(fd,2) = -1;
- memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24);
- if (strlen(ma.userid) > 23 || strlen(ma.passwd) > 23) {
- login_log("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" RETCODE,
- ip);
- } else 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(ma.userid);
- remove_control_chars(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(account_name);
- statut = RFIFOL(fd,26);
- memcpy(error_message, RFIFOP(fd,30), 20);
- error_message[19] = '\0';
- remove_control_chars(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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];
- struct timeval tv;
- if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) {
- if ((fp = fopen(GM_account_filename, "r")) != NULL) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
- 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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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 (RFIFOREST(fd) < 28 || RFIFOREST(fd) < (28 + RFIFOW(fd,26)))
- return 0;
- WFIFOW(fd,0) = 0x7943;
- WFIFOL(fd,2) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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) = 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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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) = 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) = 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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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) = 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) = -1;
- 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 {
- 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(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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) = -1;
- account_name = RFIFOP(fd,2);
- account_name[23] = '\0';
- remove_control_chars(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(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];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- 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;
- printf("Remote administration has been disconnected (unknown packet).\n");
- return 0;
- }
- //WFIFOW(fd,0) = 0x791f;
- //WFIFOSET(fd,2);
- }
- return 0;
-}
-
-//--------------------------------------------
-// Test to know if an IP come from LAN or WAN.
-//--------------------------------------------
-int lan_ip_check(unsigned char *p) {
- int i;
- int lancheck = 1;
-
-// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
-// p[0], p[1], p[2], p[3],
-// subneti[0], subneti[1], subneti[2], subneti[3],
-// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- for(i = 0; i < 4; i++) {
- if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
- lancheck = 0;
- break;
- }
- }
- printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
- return lancheck;
-}
-
-//----------------------------------------------------------------------------------------
-// Default packet parsing (normal players or administation/char-server connexion requests)
-//----------------------------------------------------------------------------------------
-int parse_login(int fd) {
- struct mmo_account account;
- int result, i, j;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- if (session[fd]->eof) {
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd) >= 2) {
- if (display_parse_login == 1) {
- if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) {
- if (RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
- printf("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)
- printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60));
- } else
- printf("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 0x64: // Ask connection of a client
- case 0x01dd: // Ask connection of a client (encryption mode)
- if (RFIFOREST(fd) < ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
- return 0;
-
- account.userid = RFIFOP(fd,6);
- account.userid[23] = '\0';
- remove_control_chars(account.userid);
- if (RFIFOW(fd,0) == 0x64) {
- memcpy(account.passwd, RFIFOP(fd,30), 24);
- account.passwd[24] = '\0';
- } else {
- memcpy(account.passwd, RFIFOP(fd,30), 32);
- account.passwd[32] = '\0';
- }
- remove_control_chars(account.passwd);
-#ifdef PASSWORDENC
- account.passwdenc = (RFIFOW(fd,0) == 0x64) ? 0 : PASSWORDENC;
-#else
- account.passwdenc = 0;
-#endif
-
- if (RFIFOW(fd,0) == 0x64)
- login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
- else
- login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
-
- 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);
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = 3; // 3 = Rejected from Server
- WFIFOSET(fd,23);
- RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
- 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);
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
- if (gm_level)
- printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
- else
- printf("Connection of the account '%s' accepted.\n", account.userid);
- server_num = 0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- if (lan_ip_check(p))
- WFIFOL(fd,47+server_num*32) = inet_addr(lan_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;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- 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,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
- 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) {
- printf("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- ld = session[fd]->session_data = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
- if (!ld) {
- printf("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);
- 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;
- unsigned char* server_name;
- account.userid = RFIFOP(fd,2);
- account.userid[23] = '\0';
- remove_control_chars(account.userid);
- memcpy(account.passwd, RFIFOP(fd,26), 24);
- account.passwd[24] = '\0';
- remove_control_chars(account.passwd);
- account.passwdenc = 0;
- server_name = RFIFOP(fd,60);
- server_name[19] = '\0';
- remove_control_chars(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);
- printf("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;
- if(anti_freeze_enable)
- server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- 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) {
- printf("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);
- printf("You must probably wait that the freeze system detect the disconnection.\n");
- 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);
- login_log("You must probably wait that the freeze system detect the disconnection." RETCODE);
- } else {
- printf("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);
- }
- 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);
- 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 (RFIFOREST(fd) < 4 || 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 = session[fd]->session_data;
- if (RFIFOW(fd,2) == 0) { // non encrypted password
- unsigned char* password;
- memcpy(password, RFIFOP(fd,4), 24);
- password[24] = '\0';
- remove_control_chars(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);
- printf("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)
- printf("'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);
- printf("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];
- struct timeval tv;
- logfp = fopen(login_log_unknown_packets_filename, "a");
- if (logfp) {
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
- fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
- 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;
- }
- }
- 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)
- exit(0);
- else if(strcmpi("alive", command) == 0 ||
- strcmpi("status", command) == 0)
- printf("\033[0;36mConsole: \033[0m\033[1mI'm Alive.\033[0m\n");
- else if(strcmpi("help", command) == 0) {
- printf("\033[32mHelp of commands:\033[0m\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;
-}
-
-
-//-------------------------------------------------
-// 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
-//----------------------------------
-int login_lan_config_read(const char *lancfgName) {
- int j;
- struct hostent * h = NULL;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- // set default configuration
- strncpy(lan_char_ip, "127.0.0.1", sizeof(lan_char_ip));
- subneti[0] = 127;
- subneti[1] = 0;
- subneti[2] = 0;
- subneti[3] = 1;
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
-
- fp = fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("***WARNING: LAN Support configuration file is not found: %s\n", lancfgName);
- return 1;
- }
-
- printf("---Start reading Lan Support configuration file\n");
-
- 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)
- continue;
-
- remove_control_chars(w1);
- remove_control_chars(w2);
- if (strcmpi(w1, "lan_char_ip") == 0) { // Read Char-Server Lan IP Address
- memset(lan_char_ip, 0, sizeof(lan_char_ip));
- h = gethostbyname(w2);
- if (h != NULL) {
- sprintf(lan_char_ip, "%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 {
- strncpy(lan_char_ip, w2, sizeof(lan_char_ip));
- lan_char_ip[sizeof(lan_char_ip)-1] = '\0';
- }
- printf("LAN IP of char-server: %s.\n", lan_char_ip);
- } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
- for(j = 0; j < 4; j++)
- subneti[j] = 0;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subneti[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
- }
- printf("Sub-network of the char-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
- } else if (strcmpi(w1, "subnetmask") == 0) { // Read Subnetwork Mask
- for(j = 0; j < 4; j++)
- subnetmaski[j] = 255;
- h = gethostbyname(w2);
- if (h != NULL) {
- for(j = 0; j < 4; j++)
- subnetmaski[j] = (unsigned char)h->h_addr[j];
- } else {
- sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
- }
- printf("Sub-network mask of the char-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
- }
- }
- fclose(fp);
-
- // log the LAN configuration
- login_log("The LAN configuration of the server is set:" RETCODE);
- login_log("- with LAN IP of char-server: %s." RETCODE, lan_char_ip);
- login_log("- with the sub-network of the char-server: %d.%d.%d.%d/%d.%d.%d.%d." RETCODE,
- subneti[0], subneti[1], subneti[2], subneti[3], subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
-
- // sub-network check of the char-server
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the char-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
- login_log("***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network." RETCODE);
- }
- }
-
- printf("---End reading of Lan Support configuration file\n");
-
- 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) {
- printf("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
-
- printf("---Start reading of Login Server 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(w1);
- remove_control_chars(w2);
-
- 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)
- free(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)
- free(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 = realloc(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, "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, "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)
- free(access_allow);
- access_allow = NULL;
- access_allownum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_allow)
- free(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 = realloc(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)
- free(access_deny);
- access_deny = NULL;
- access_denynum = 0;
- } else {
- if (strcmpi(w2, "all") == 0) {
- // reset all previous values
- if (access_deny)
- free(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 = realloc(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);
- // Anti-Freeze
- } else if(strcmpi(w1,"anti_freeze_enable")==0){
- anti_freeze_enable = config_switch(w2);
- } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
- ANTI_FREEZE_INTERVAL = atoi(w2);
- if (ANTI_FREEZE_INTERVAL < 5)
- ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
- } else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- }
- }
- }
- fclose(fp);
-
- printf("---End reading of Login Server configuration file.\n");
-
- return 0;
-}
-
-//-------------------------------------
-// Displaying of configuration warnings
-//-------------------------------------
-void display_conf_warnings(void) {
- if (admin_state != 0 && admin_state != 1) {
- printf("***WARNING: Invalid value for admin_state parameter -> set to 0 (no remote admin).\n");
- admin_state = 0;
- }
-
- if (admin_state == 1) {
- if (admin_pass[0] == '\0') {
- printf("***WARNING: Administrator password is void (admin_pass).\n");
- } else if (strcmp(admin_pass, "admin") == 0) {
- printf("***WARNING: You are using the default administrator password (admin_pass).\n");
- printf(" We highly recommend that you change it.\n");
- }
- }
-
- if (gm_pass[0] == '\0') {
- printf("***WARNING: 'To GM become' password is void (gm_pass).\n");
- printf(" We highly recommend that you set one password.\n");
- } else if (strcmp(gm_pass, "gm") == 0) {
- printf("***WARNING: You are using the default GM password (gm_pass).\n");
- printf(" We highly recommend that you change it.\n");
- }
-
- if (level_new_gm < 0 || level_new_gm > 99) {
- printf("***WARNING: Invalid value for level_new_gm parameter -> set to 60 (default).\n");
- level_new_gm = 60;
- }
-
- if (new_account_flag != 0 && new_account_flag != 1) {
- printf("***WARNING: Invalid value for new_account parameter -> set to 0 (no new account).\n");
- new_account_flag = 0;
- }
-
- if (login_port < 1024 || login_port > 65535) {
- printf("***WARNING: Invalid value for login_port parameter -> set to 6900 (default).\n");
- login_port = 6900;
- }
-
- if (gm_account_filename_check_timer < 0) {
- printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
- printf(" -> set to 15 sec (default).\n");
- gm_account_filename_check_timer = 15;
- } else if (gm_account_filename_check_timer == 1) {
- printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
- printf(" -> set to 2 sec (minimum value).\n");
- gm_account_filename_check_timer = 2;
- }
-
- if (save_unknown_packets != 0 && save_unknown_packets != 1) {
- printf("WARNING: Invalid value for save_unknown_packets parameter -> set to 0-no save.\n");
- save_unknown_packets = 0;
- }
-
- if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for display_parse_login parameter\n");
- printf(" -> set to 0 (no display).\n");
- display_parse_login = 0;
- }
-
- if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for display_parse_admin parameter\n");
- printf(" -> set 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
- printf("***WARNING: Invalid value for display_parse_fromchar parameter\n");
- printf(" -> set 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
- printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
- printf(" -> set to 0 (any player).\n");
- min_level_to_connect = 0;
- } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x
- printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
- printf(" -> set to 99 (only GM level 99).\n");
- min_level_to_connect = 99;
- }
-
- if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes
- printf("***WARNING: Invalid value for add_to_unlimited_account parameter\n");
- printf(" -> set 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
- printf("***WARNING: Invalid value for start_limited_time parameter\n");
- printf(" -> set 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
- printf("***WARNING: Invalid value for check_ip_flag parameter\n");
- printf(" -> set 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') {
- printf("***WARNING: The IP security order is 'deny,allow' (allow if not deny).\n");
- printf(" And you refuse ALL IP.\n");
- }
- } else if (access_order == ACO_ALLOW_DENY) {
- if (access_allownum == 0) {
- printf("***WARNING: The IP security order is 'allow,deny' (deny if not allow).\n");
- printf(" But, NO IP IS AUTHORISED!\n");
- }
- } else { // ACO_MUTUAL_FAILTURE
- if (access_allownum == 0) {
- printf("***WARNING: The IP security order is 'mutual-failture'\n");
- printf(" (allow if in the allow list and not in the deny list).\n");
- printf(" But, NO IP IS AUTHORISED!\n");
- } else if (access_denynum == 1 && access_deny[0] == '\0') {
- printf("***WARNING: The IP security order is mutual-failture\n");
- printf(" (allow if in the allow list and not in the deny list).\n");
- printf(" But, you refuse ALL IP!\n");
- }
- }
-
- if (dynamic_pass_failure_ban != 0) {
- if (dynamic_pass_failure_ban_time < 1) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_time (%d) parameter\n", dynamic_pass_failure_ban_time);
- printf(" -> set 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) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_many (%d) parameter\n", dynamic_pass_failure_ban_how_many);
- printf(" -> set 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) {
- printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_long (%d) parameter\n", dynamic_pass_failure_ban_how_long);
- printf(" -> set 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 {
- printf("- with a dynamic password error ban:" RETCODE);
- printf(" After %d invalid password in %d minutes" RETCODE, dynamic_pass_failure_ban_how_many, dynamic_pass_failure_ban_time);
- printf(" IP is banned for %d minutes" RETCODE, dynamic_pass_failure_ban_how_long);
- }
- }
-}
-
-//-----------------------------------------------------
-//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;
-}
-
-//--------------------------------------
-// Function called at exit of the server
-//--------------------------------------
-void do_final(void) {
- int i, fd;
-
- mmo_auth_sync();
-
- if(auth_dat) free(auth_dat);
- if(gm_account_db) free(gm_account_db);
- 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));
- close(fd);
- delete_session(fd);
- }
- }
- close(login_fd);
- delete_session(login_fd);
-
- login_log("----End of login-server (normal end with closing of all files)." RETCODE);
-
- if(log_fp)
- fclose(log_fp);
-}
-
-//------------------------------
-// Main function of login-server
-//------------------------------
-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 > 1) ? argv[1] : LAN_CONF_NAME);
-
- srand(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 = numdb_init();
- gm_account_db = NULL;
- GM_num = 0;
- GM_max = 0;
- read_gm_account();
- mmo_auth_init();
-// set_termfunc(mmo_auth_sync);
- set_defaultparse(parse_login);
- login_fd = make_listen_port(login_port);
-
- if(anti_freeze_enable > 0) {
- add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system");
- i = add_timer_interval(gettick() + 1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000);
- }
- add_timer_func_list(check_auth_sync, "check_auth_sync");
- i = 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;
-
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
- add_timer_func_list(check_GM_file, "check_GM_file");
- i = add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
-
- 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);
- printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
-
- atexit(do_final);
-
- return 0;
-}
+// $Id: login.c,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
+// new version of the login-server by [Yor]
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdarg.h>
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "login.h"
+#include "../common/mmo.h"
+#include "../common/version.h"
+#include "../common/db.h"
+#include "../common/lock.h"
+#include "../common/malloc.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+int account_id_count = START_ACCOUNT_NUM;
+int server_num;
+int new_account_flag = 0;
+int login_port = 6900;
+char lan_char_ip[16];
+int subneti[4];
+int subnetmaski[4];
+
+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 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 server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+int anti_freeze_enable = 0;
+int ANTI_FREEZE_INTERVAL = 15;
+
+int login_fd;
+
+//Added for Mugendai's I'm Alive mod
+int imalive_on=0;
+int imalive_time=60;
+//Added by Mugendai for GUI
+int flush_on=1;
+int flush_time=100;
+
+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)
+
+struct login_session_data {
+ 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 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;
+
+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] = "";
+int GM_num;
+int GM_max=256;
+char gm_pass[64] = "";
+int level_new_gm = 60;
+
+struct gm_account *gm_account_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;
+
+//------------------------------
+// Writing function of logs file
+//------------------------------
+int login_log(char *fmt, ...) {
+ va_list ap;
+ struct timeval tv;
+ char tmpstr[2048];
+
+ if(!log_fp)
+ log_fp = fopen(login_log_filename, "a");
+
+ 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);
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec)));
+ sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, 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;
+}
+
+//----------------------------------------------------------------------
+// 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_db[i].account_id == account_id)
+ return gm_account_db[i].level;
+ return 0;
+}
+
+//-------------------------------------------------------
+// Reading function of GM accounts file (and their level)
+//-------------------------------------------------------
+int read_gm_account() {
+ char line[512];
+ FILE *fp;
+ int account_id, level;
+ int i, line_counter;
+ struct stat file_stat;
+
+ if(gm_account_db) free(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 = file_stat.st_mtime;
+
+ if ((fp = fopen(GM_account_filename, "r")) == NULL) {
+ printf("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename);
+ printf(" 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;
+ if (sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
+ printf("read_gm_account: file [%s], invalid 'id_acount level' format (line #%d).\n", GM_account_filename, line_counter);
+ else if (level <= 0)
+ printf("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) {
+ printf("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
+ level = 99;
+ }
+ for(i = 0; i < GM_num; i++)
+ if (gm_account_db[i].account_id == account_id) {
+ if (gm_account_db[i].level == level)
+ printf("read_gm_account: GM account %d defined twice (same level: %d).\n", account_id, level);
+ else {
+ printf("read_gm_account: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
+ gm_account_db[i].level = level;
+ }
+ break;
+ }
+ // if new account
+ if (i == GM_num) {
+ if (GM_num >= GM_max) {
+ GM_max += 256;
+ gm_account_db = realloc(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) {
+ printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
+ login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
+ }
+ }
+ }
+ }
+ fclose(fp);
+
+ printf("read_gm_account: file '%s' readed (%d GM accounts found).\n", GM_account_filename, GM_num);
+ login_log("read_gm_account: file '%s' readed (%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(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(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(str+i, "%d", &m) == 1 && m >= 0 && m <= 32) {
+ for(i = 0; i < m && i < 32; i++)
+ mask = (mask >> 1) | 0x80000000;
+ } else {
+ printf("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[16];
+ 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, 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, 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[16];
+ 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, access_ip)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+//-----------------------------------------------------
+// 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;
+}
+
+//---------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid).
+//---------------------------------------------------
+int e_mail_check(unsigned char *email) {
+ char ch;
+ unsigned 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) {
+ int i, quantity, 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,
+ p->connect_until_time, p->last_ip, p->memo, 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,%d ", 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, j, v;
+ char line[2048], *p, 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 str[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)
+ printf("\033[1;31mmmo_auth_init: Accounts file [%s] not found.\033[0m\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) {
+ printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
+ printf(" account id #%d -> account not read (saved in log file).\033[0m\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(userid);
+ for(j = 0; j < auth_num; j++) {
+ if (auth_dat[j].account_id == account_id) {
+ printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
+ printf(" account id #%d -> new account not read (saved in log file).\033[0m\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) {
+ printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
+ printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
+ printf(" Account saved in log file.\033[0m\n");
+ 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 = realloc(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(pass);
+ strncpy(auth_dat[auth_num].pass, pass, 24);
+
+ lastlogin[23] = '\0';
+ remove_control_chars(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) {
+ printf("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(email);
+ strncpy(auth_dat[auth_num].email, email, 40);
+ }
+
+ error_message[19] = '\0';
+ remove_control_chars(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 = ban_until_time;
+ else
+ auth_dat[auth_num].ban_until_time = 0;
+
+ auth_dat[auth_num].connect_until_time = connect_until_time;
+
+ last_ip[15] = '\0';
+ remove_control_chars(last_ip);
+ strncpy(auth_dat[auth_num].last_ip, last_ip, 16);
+
+ memo[254] = '\0';
+ remove_control_chars(memo);
+ strncpy(auth_dat[auth_num].memo, memo, 255);
+
+ for(j = 0; j < ACCOUNT_REG2_NUM; j++) {
+ p += n;
+ if (sscanf(p, "%[^\t,],%d %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, ",%d %n", &v, &n) == 1) {
+ j--;
+ continue;
+ } else
+ break;
+ }
+ str[31] = '\0';
+ remove_control_chars(str);
+ strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
+ auth_dat[auth_num].account_reg2[j].value = v;
+ }
+ 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) {
+ printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM);
+ printf(" account id #%d -> account not read (saved in log file).\033[0m\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(userid);
+ for(j = 0; j < auth_num; j++) {
+ if (auth_dat[j].account_id == account_id) {
+ printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n");
+ printf(" account id #%d -> new account not read (saved in log file).\033[0m\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) {
+ printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n");
+ printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long.
+ printf(" Account saved in log file.\033[0m\n");
+ 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 = realloc(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(pass);
+ strncpy(auth_dat[auth_num].pass, pass, 24);
+
+ lastlogin[23] = '\0';
+ remove_control_chars(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,],%d %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, ",%d %n", &v, &n) == 1) {
+ j--;
+ continue;
+ } else
+ break;
+ }
+ str[31] = '\0';
+ remove_control_chars(str);
+ strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32);
+ auth_dat[auth_num].account_reg2[j].value = v;
+ }
+ 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) {
+ printf("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) {
+ printf("mmo_auth_init: 1 account read in %s,\n", account_filename);
+ sprintf(line, "1 account read in %s,", account_filename);
+ } else {
+ printf("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) {
+ printf(" of which is no GM account, and ");
+ sprintf(str, "%s of which is no GM account and", line);
+ } else if (GM_count == 1) {
+ printf(" of which is 1 GM account, and ");
+ sprintf(str, "%s of which is 1 GM account and", line);
+ } else {
+ printf(" 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;
+ int i, j, k, lock;
+ int account_id;
+ int id[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)
+ 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;
+
+ 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) {
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd, len);
+ c++;
+ }
+ }
+ return c;
+}
+
+//-----------------------------------------------------
+// Send GM accounts to all char-server
+//-----------------------------------------------------
+void send_GM_accounts() {
+ int i;
+ 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;
+ }
+ 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 = 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 = realloc(auth_dat, sizeof(struct auth_dat) * auth_max);
+ memset(auth_dat, 0, 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, 24);
+ auth_dat[i].userid[23] = '\0';
+
+ strncpy(auth_dat[i].pass, account->passwd, 32);
+ auth_dat[i].pass[23] = '\0';
+
+ memcpy(auth_dat[i].lastlogin, "-", 2);
+
+ auth_dat[i].sex = (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) {
+ int i;
+ struct timeval tv;
+ 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];
+
+ sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
+
+ 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') && new_account_flag == 1 &&
+ account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) {
+ if (new_account_flag == 1)
+ newaccount = 1;
+ account->userid[len] = '\0';
+ }
+
+ // 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 == 0 && i == auth_num) {
+ i = search_account_index(account->userid);
+ if (i == -1)
+ i = auth_num;
+ else
+ memcpy(account->userid, auth_dat[i].userid, 24); // 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, 25);
+ encpasswdok = 0;
+#ifdef PASSWORDENC
+ ld = 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;
+ 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
+ case 100: // 99 = This ID has been totally erased
+ return auth_dat[i].state - 1;
+ default:
+ return 99; // 99 = ID has been totally erased
+ }
+ }
+
+ 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 == 0) {
+ 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
+ }
+ }
+
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec)));
+ sprintf(tmpstr + strlen(tmpstr), ".%03d", (int)tv.tv_usec / 1000);
+
+ 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;
+ 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
+}
+
+//-------------------------------
+// Char-server anti-freeze system
+//-------------------------------
+int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
+ int i;
+
+ //printf("Entering in char_anti_freeze_system function to check freeze of servers.\n");
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {// if char-server is online
+ //printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]);
+ if (server_freezeflag[i]-- < 1) { // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ printf("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection.\n", i, server[i].name);
+ login_log("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection." RETCODE,
+ i, server[i].name);
+ session[server_fd[i]]->eof = 1;
+ } else {
+ // send alive packet to check connection
+ WFIFOW(server_fd[i],0) = 0x2718;
+ WFIFOSET(server_fd[i],2);
+ }
+ }
+ }
+
+ return 0;
+}
+
+//--------------------------------
+// Packet parsing for char-servers
+//--------------------------------
+int parse_fromchar(int fd) {
+ int i, j, id;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char ip[16];
+ int acc;
+
+ 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) {
+ printf("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));
+ }
+ close(fd);
+ delete_session(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)
+ printf("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) {
+ int p, k;
+ 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) {
+ WFIFOW(fd,0) = 0x2729; // Sending of the account_reg2
+ WFIFOL(fd,4) = acc;
+ for(p = 8, j = 0; j < auth_dat[k].account_reg2_num; p += 36, j++) {
+ memcpy(WFIFOP(fd,p), auth_dat[k].account_reg2[j].str, 32);
+ WFIFOL(fd,p+32) = auth_dat[k].account_reg2[j].value;
+ }
+ WFIFOW(fd,2) = p;
+ WFIFOSET(fd,p);
+// printf("parse_fromchar: Sending of account_reg2: login->char (auth fifo)\n");
+ WFIFOW(fd,0) = 0x2713;
+ WFIFOL(fd,2) = acc;
+ WFIFOB(fd,6) = 0;
+ memcpy(WFIFOP(fd, 7), auth_dat[k].email, 40);
+ WFIFOL(fd,47) = (unsigned long)auth_dat[k].connect_until_time;
+ WFIFOSET(fd,51);
+ break;
+ }
+ }
+ 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);
+ 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);
+ if(anti_freeze_enable)
+ server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed
+ 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(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(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];
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
+ 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();
+ printf("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 {
+ printf("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 {
+ printf("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 {
+ printf("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 {
+ printf("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(actual_email);
+ memcpy(new_email, RFIFOP(fd,46), 40);
+ new_email[39] = '\0';
+ remove_control_chars(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) = 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 char-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];
+ login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE,
+ server[id].name, acc, ip);
+ for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
+ memcpy(auth_dat[i].account_reg2[j].str, RFIFOP(fd,p), 32);
+ auth_dat[i].account_reg2[j].str[31] = '\0';
+ remove_control_chars(auth_dat[i].account_reg2[j].str);
+ auth_dat[i].account_reg2[j].value = RFIFOL(fd,p+32);
+ }
+ 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);
+ 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 0x3000: //change sex for chrif_changesex()
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ int sex, i = 0;
+ 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];
+ struct timeval tv;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
+ fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
+ 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);
+ }
+ }
+ printf("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ printf("Char-server has been disconnected (unknown packet).\n");
+ return 0;
+ }
+ }
+ return 0;
+}
+
+//---------------------------------------
+// Packet parsing for administation login
+//---------------------------------------
+int parse_admin(int fd) {
+ int i, j;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char* account_name;
+ char ip[16];
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ if (session[fd]->eof) {
+ close(fd);
+ delete_session(fd);
+ printf("Remote administration has disconnected (session #%d).\n", fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+ if (display_parse_admin == 1)
+ printf("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);
+ 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];
+ 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++) {
+ 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);
+ }
+ break;
+
+ case 0x7930: // Request for an account creation
+ if (RFIFOREST(fd) < 91)
+ return 0;
+ {
+ struct mmo_account ma;
+ ma.userid = RFIFOP(fd, 2);
+ memcpy(ma.passwd, RFIFOP(fd, 26), 24);
+ ma.passwd[24] = '\0';
+ memcpy(ma.lastlogin, "-", 2);
+ ma.sex = RFIFOB(fd,50);
+ WFIFOW(fd,0) = 0x7931;
+ WFIFOL(fd,2) = -1;
+ memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24);
+ if (strlen(ma.userid) > 23 || strlen(ma.passwd) > 23) {
+ login_log("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" RETCODE,
+ ip);
+ } else 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(ma.userid);
+ remove_control_chars(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(account_name);
+ statut = RFIFOL(fd,26);
+ memcpy(error_message, RFIFOP(fd,30), 20);
+ error_message[19] = '\0';
+ remove_control_chars(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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];
+ struct timeval tv;
+ if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) {
+ if ((fp = fopen(GM_account_filename, "r")) != NULL) {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
+ 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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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 (RFIFOREST(fd) < 28 || RFIFOREST(fd) < (28 + RFIFOW(fd,26)))
+ return 0;
+ WFIFOW(fd,0) = 0x7943;
+ WFIFOL(fd,2) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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) = 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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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) = 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) = 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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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) = 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) = -1;
+ 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 {
+ 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(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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) = -1;
+ account_name = RFIFOP(fd,2);
+ account_name[23] = '\0';
+ remove_control_chars(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(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];
+ struct timeval tv;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
+ fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
+ 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;
+ printf("Remote administration has been disconnected (unknown packet).\n");
+ return 0;
+ }
+ //WFIFOW(fd,0) = 0x791f;
+ //WFIFOSET(fd,2);
+ }
+ return 0;
+}
+
+//--------------------------------------------
+// Test to know if an IP come from LAN or WAN.
+//--------------------------------------------
+int lan_ip_check(unsigned char *p) {
+ int i;
+ int lancheck = 1;
+
+// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n",
+// p[0], p[1], p[2], p[3],
+// subneti[0], subneti[1], subneti[2], subneti[3],
+// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+ for(i = 0; i < 4; i++) {
+ if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) {
+ lancheck = 0;
+ break;
+ }
+ }
+ printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN");
+ return lancheck;
+}
+
+//----------------------------------------------------------------------------------------
+// Default packet parsing (normal players or administation/char-server connexion requests)
+//----------------------------------------------------------------------------------------
+int parse_login(int fd) {
+ struct mmo_account account;
+ int result, i, j;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char ip[16];
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ if (session[fd]->eof) {
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd) >= 2) {
+ if (display_parse_login == 1) {
+ if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) {
+ if (RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
+ printf("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)
+ printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60));
+ } else
+ printf("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 0x64: // Ask connection of a client
+ case 0x01dd: // Ask connection of a client (encryption mode)
+ if (RFIFOREST(fd) < ((RFIFOW(fd,0) == 0x64) ? 55 : 47))
+ return 0;
+
+ account.userid = RFIFOP(fd,6);
+ account.userid[23] = '\0';
+ remove_control_chars(account.userid);
+ if (RFIFOW(fd,0) == 0x64) {
+ memcpy(account.passwd, RFIFOP(fd,30), 24);
+ account.passwd[24] = '\0';
+ } else {
+ memcpy(account.passwd, RFIFOP(fd,30), 32);
+ account.passwd[32] = '\0';
+ }
+ remove_control_chars(account.passwd);
+#ifdef PASSWORDENC
+ account.passwdenc = (RFIFOW(fd,0) == 0x64) ? 0 : PASSWORDENC;
+#else
+ account.passwdenc = 0;
+#endif
+
+ if (RFIFOW(fd,0) == 0x64)
+ login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
+ else
+ login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip);
+
+ 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);
+ WFIFOW(fd,0) = 0x6a;
+ WFIFOB(fd,2) = 3; // 3 = Rejected from Server
+ WFIFOSET(fd,23);
+ RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
+ 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);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ } else {
+ if (gm_level)
+ printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
+ else
+ printf("Connection of the account '%s' accepted.\n", account.userid);
+ server_num = 0;
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {
+ if (lan_ip_check(p))
+ WFIFOL(fd,47+server_num*32) = inet_addr(lan_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;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ }
+ }
+ } else {
+ 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,(RFIFOW(fd,0) == 0x64) ? 55 : 47);
+ 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) {
+ printf("login: abnormal request of MD5 key (already opened session).\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ ld = session[fd]->session_data = (struct login_session_data*)aCalloc(1, sizeof(struct login_session_data));
+ if (!ld) {
+ printf("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);
+ 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;
+ unsigned char* server_name;
+ account.userid = RFIFOP(fd,2);
+ account.userid[23] = '\0';
+ remove_control_chars(account.userid);
+ memcpy(account.passwd, RFIFOP(fd,26), 24);
+ account.passwd[24] = '\0';
+ remove_control_chars(account.passwd);
+ account.passwdenc = 0;
+ server_name = RFIFOP(fd,60);
+ server_name[19] = '\0';
+ remove_control_chars(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);
+ printf("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;
+ if(anti_freeze_enable)
+ server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ 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) {
+ printf("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);
+ printf("You must probably wait that the freeze system detect the disconnection.\n");
+ 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);
+ login_log("You must probably wait that the freeze system detect the disconnection." RETCODE);
+ } else {
+ printf("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);
+ }
+ 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);
+ 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 (RFIFOREST(fd) < 4 || 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 = session[fd]->session_data;
+ if (RFIFOW(fd,2) == 0) { // non encrypted password
+ unsigned char* password;
+ memcpy(password, RFIFOP(fd,4), 24);
+ password[24] = '\0';
+ remove_control_chars(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);
+ printf("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)
+ printf("'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);
+ printf("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];
+ struct timeval tv;
+ logfp = fopen(login_log_unknown_packets_filename, "a");
+ if (logfp) {
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 23, date_format, localtime(&(tv.tv_sec)));
+ fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000);
+ 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;
+ }
+ }
+ 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)
+ exit(0);
+ else if(strcmpi("alive", command) == 0 ||
+ strcmpi("status", command) == 0)
+ printf("\033[0;36mConsole: \033[0m\033[1mI'm Alive.\033[0m\n");
+ else if(strcmpi("help", command) == 0) {
+ printf("\033[32mHelp of commands:\033[0m\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;
+}
+
+
+//-------------------------------------------------
+// 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
+//----------------------------------
+int login_lan_config_read(const char *lancfgName) {
+ int j;
+ struct hostent * h = NULL;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ // set default configuration
+ strncpy(lan_char_ip, "127.0.0.1", sizeof(lan_char_ip));
+ subneti[0] = 127;
+ subneti[1] = 0;
+ subneti[2] = 0;
+ subneti[3] = 1;
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = 255;
+
+ fp = fopen(lancfgName, "r");
+
+ if (fp == NULL) {
+ printf("***WARNING: LAN Support configuration file is not found: %s\n", lancfgName);
+ return 1;
+ }
+
+ printf("---Start reading Lan Support configuration file\n");
+
+ 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)
+ continue;
+
+ remove_control_chars(w1);
+ remove_control_chars(w2);
+ if (strcmpi(w1, "lan_char_ip") == 0) { // Read Char-Server Lan IP Address
+ memset(lan_char_ip, 0, sizeof(lan_char_ip));
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ sprintf(lan_char_ip, "%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 {
+ strncpy(lan_char_ip, w2, sizeof(lan_char_ip));
+ lan_char_ip[sizeof(lan_char_ip)-1] = '\0';
+ }
+ printf("LAN IP of char-server: %s.\n", lan_char_ip);
+ } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork
+ for(j = 0; j < 4; j++)
+ subneti[j] = 0;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ for(j = 0; j < 4; j++)
+ subneti[j] = (unsigned char)h->h_addr[j];
+ } else {
+ sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]);
+ }
+ printf("Sub-network of the char-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]);
+ } else if (strcmpi(w1, "subnetmask") == 0) { // Read Subnetwork Mask
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = 255;
+ h = gethostbyname(w2);
+ if (h != NULL) {
+ for(j = 0; j < 4; j++)
+ subnetmaski[j] = (unsigned char)h->h_addr[j];
+ } else {
+ sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]);
+ }
+ printf("Sub-network mask of the char-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+ }
+ }
+ fclose(fp);
+
+ // log the LAN configuration
+ login_log("The LAN configuration of the server is set:" RETCODE);
+ login_log("- with LAN IP of char-server: %s." RETCODE, lan_char_ip);
+ login_log("- with the sub-network of the char-server: %d.%d.%d.%d/%d.%d.%d.%d." RETCODE,
+ subneti[0], subneti[1], subneti[2], subneti[3], subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]);
+
+ // sub-network check of the char-server
+ {
+ unsigned int a0, a1, a2, a3;
+ unsigned char p[4];
+ sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
+ p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
+ printf("LAN test of LAN IP of the char-server: ");
+ if (lan_ip_check(p) == 0) {
+ printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
+ login_log("***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network." RETCODE);
+ }
+ }
+
+ printf("---End reading of Lan Support configuration file\n");
+
+ 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) {
+ printf("Configuration file (%s) not found.\n", cfgName);
+ return 1;
+ }
+
+ printf("---Start reading of Login Server 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(w1);
+ remove_control_chars(w2);
+
+ 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)
+ free(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)
+ free(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 = realloc(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, "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, "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)
+ free(access_allow);
+ access_allow = NULL;
+ access_allownum = 0;
+ } else {
+ if (strcmpi(w2, "all") == 0) {
+ // reset all previous values
+ if (access_allow)
+ free(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 = realloc(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)
+ free(access_deny);
+ access_deny = NULL;
+ access_denynum = 0;
+ } else {
+ if (strcmpi(w2, "all") == 0) {
+ // reset all previous values
+ if (access_deny)
+ free(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 = realloc(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);
+ // Anti-Freeze
+ } else if(strcmpi(w1,"anti_freeze_enable")==0){
+ anti_freeze_enable = config_switch(w2);
+ } else if (strcmpi(w1, "anti_freeze_interval") == 0) {
+ ANTI_FREEZE_INTERVAL = atoi(w2);
+ if (ANTI_FREEZE_INTERVAL < 5)
+ ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
+ } else if (strcmpi(w1, "import") == 0) {
+ login_config_read(w2);
+ } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
+ flush_on = atoi(w2); //Added by Mugendai for GUI
+ } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
+ flush_time = atoi(w2); //Added by Mugendai for GUI
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ }
+ }
+ }
+ fclose(fp);
+
+ printf("---End reading of Login Server configuration file.\n");
+
+ return 0;
+}
+
+//-------------------------------------
+// Displaying of configuration warnings
+//-------------------------------------
+void display_conf_warnings(void) {
+ if (admin_state != 0 && admin_state != 1) {
+ printf("***WARNING: Invalid value for admin_state parameter -> set to 0 (no remote admin).\n");
+ admin_state = 0;
+ }
+
+ if (admin_state == 1) {
+ if (admin_pass[0] == '\0') {
+ printf("***WARNING: Administrator password is void (admin_pass).\n");
+ } else if (strcmp(admin_pass, "admin") == 0) {
+ printf("***WARNING: You are using the default administrator password (admin_pass).\n");
+ printf(" We highly recommend that you change it.\n");
+ }
+ }
+
+ if (gm_pass[0] == '\0') {
+ printf("***WARNING: 'To GM become' password is void (gm_pass).\n");
+ printf(" We highly recommend that you set one password.\n");
+ } else if (strcmp(gm_pass, "gm") == 0) {
+ printf("***WARNING: You are using the default GM password (gm_pass).\n");
+ printf(" We highly recommend that you change it.\n");
+ }
+
+ if (level_new_gm < 0 || level_new_gm > 99) {
+ printf("***WARNING: Invalid value for level_new_gm parameter -> set to 60 (default).\n");
+ level_new_gm = 60;
+ }
+
+ if (new_account_flag != 0 && new_account_flag != 1) {
+ printf("***WARNING: Invalid value for new_account parameter -> set to 0 (no new account).\n");
+ new_account_flag = 0;
+ }
+
+ if (login_port < 1024 || login_port > 65535) {
+ printf("***WARNING: Invalid value for login_port parameter -> set to 6900 (default).\n");
+ login_port = 6900;
+ }
+
+ if (gm_account_filename_check_timer < 0) {
+ printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
+ printf(" -> set to 15 sec (default).\n");
+ gm_account_filename_check_timer = 15;
+ } else if (gm_account_filename_check_timer == 1) {
+ printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n");
+ printf(" -> set to 2 sec (minimum value).\n");
+ gm_account_filename_check_timer = 2;
+ }
+
+ if (save_unknown_packets != 0 && save_unknown_packets != 1) {
+ printf("WARNING: Invalid value for save_unknown_packets parameter -> set to 0-no save.\n");
+ save_unknown_packets = 0;
+ }
+
+ if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes
+ printf("***WARNING: Invalid value for display_parse_login parameter\n");
+ printf(" -> set to 0 (no display).\n");
+ display_parse_login = 0;
+ }
+
+ if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes
+ printf("***WARNING: Invalid value for display_parse_admin parameter\n");
+ printf(" -> set 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
+ printf("***WARNING: Invalid value for display_parse_fromchar parameter\n");
+ printf(" -> set 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
+ printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
+ printf(" -> set to 0 (any player).\n");
+ min_level_to_connect = 0;
+ } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x
+ printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect);
+ printf(" -> set to 99 (only GM level 99).\n");
+ min_level_to_connect = 99;
+ }
+
+ if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes
+ printf("***WARNING: Invalid value for add_to_unlimited_account parameter\n");
+ printf(" -> set 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
+ printf("***WARNING: Invalid value for start_limited_time parameter\n");
+ printf(" -> set 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
+ printf("***WARNING: Invalid value for check_ip_flag parameter\n");
+ printf(" -> set 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') {
+ printf("***WARNING: The IP security order is 'deny,allow' (allow if not deny).\n");
+ printf(" And you refuse ALL IP.\n");
+ }
+ } else if (access_order == ACO_ALLOW_DENY) {
+ if (access_allownum == 0) {
+ printf("***WARNING: The IP security order is 'allow,deny' (deny if not allow).\n");
+ printf(" But, NO IP IS AUTHORISED!\n");
+ }
+ } else { // ACO_MUTUAL_FAILTURE
+ if (access_allownum == 0) {
+ printf("***WARNING: The IP security order is 'mutual-failture'\n");
+ printf(" (allow if in the allow list and not in the deny list).\n");
+ printf(" But, NO IP IS AUTHORISED!\n");
+ } else if (access_denynum == 1 && access_deny[0] == '\0') {
+ printf("***WARNING: The IP security order is mutual-failture\n");
+ printf(" (allow if in the allow list and not in the deny list).\n");
+ printf(" But, you refuse ALL IP!\n");
+ }
+ }
+
+ if (dynamic_pass_failure_ban != 0) {
+ if (dynamic_pass_failure_ban_time < 1) {
+ printf("***WARNING: Invalid value for dynamic_pass_failure_ban_time (%d) parameter\n", dynamic_pass_failure_ban_time);
+ printf(" -> set 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) {
+ printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_many (%d) parameter\n", dynamic_pass_failure_ban_how_many);
+ printf(" -> set 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) {
+ printf("***WARNING: Invalid value for dynamic_pass_failure_ban_how_long (%d) parameter\n", dynamic_pass_failure_ban_how_long);
+ printf(" -> set 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 {
+ printf("- with a dynamic password error ban:" RETCODE);
+ printf(" After %d invalid password in %d minutes" RETCODE, dynamic_pass_failure_ban_how_many, dynamic_pass_failure_ban_time);
+ printf(" IP is banned for %d minutes" RETCODE, dynamic_pass_failure_ban_how_long);
+ }
+ }
+}
+
+//-----------------------------------------------------
+//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;
+}
+
+//--------------------------------------
+// Function called at exit of the server
+//--------------------------------------
+void do_final(void) {
+ int i, fd;
+
+ mmo_auth_sync();
+
+ if(auth_dat) free(auth_dat);
+ if(gm_account_db) free(gm_account_db);
+ 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));
+ close(fd);
+ delete_session(fd);
+ }
+ }
+ close(login_fd);
+ delete_session(login_fd);
+
+ login_log("----End of login-server (normal end with closing of all files)." RETCODE);
+
+ if(log_fp)
+ fclose(log_fp);
+}
+
+//------------------------------
+// Main function of login-server
+//------------------------------
+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 > 1) ? argv[1] : LAN_CONF_NAME);
+
+ srand(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 = numdb_init();
+ gm_account_db = NULL;
+ GM_num = 0;
+ GM_max = 0;
+ read_gm_account();
+ mmo_auth_init();
+// set_termfunc(mmo_auth_sync);
+ set_defaultparse(parse_login);
+ login_fd = make_listen_port(login_port);
+
+ if(anti_freeze_enable > 0) {
+ add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system");
+ i = add_timer_interval(gettick() + 1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000);
+ }
+ add_timer_func_list(check_auth_sync, "check_auth_sync");
+ i = 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;
+
+ //Added for Mugendais I'm Alive mod
+ if(imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+
+ //Added by Mugendai for GUI support
+ if(flush_on)
+ add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+
+ add_timer_func_list(check_GM_file, "check_GM_file");
+ i = add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
+
+ 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);
+ printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
+
+ atexit(do_final);
+
+ return 0;
+}
diff --git a/src/login/login.h b/src/login/login.h
index 8589bf004..9ae4734fe 100644
--- a/src/login/login.h
+++ b/src/login/login.h
@@ -1,41 +1,41 @@
-// $Id: login.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
-#ifndef _LOGIN_H_
-#define _LOGIN_H_
-
-#define MAX_SERVERS 30
-
-#define LOGIN_CONF_NAME "conf/login_athena.conf"
-#define LAN_CONF_NAME "conf/lan_support.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.
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-int login_port;
-struct mmo_account {
- char* userid;
- char passwd[33];
- int passwdenc;
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
-};
-
-struct mmo_char_server {
- char name[21];
- long ip;
- short port;
- int users;
- int maintenance;
- int new;
-};
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-#endif
+// $Id: login.h,v 1.1.1.1 2004/09/10 17:26:53 MagicalTux Exp $
+#ifndef _LOGIN_H_
+#define _LOGIN_H_
+
+#define MAX_SERVERS 30
+
+#define LOGIN_CONF_NAME "conf/login_athena.conf"
+#define LAN_CONF_NAME "conf/lan_support.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.
+#define START_ACCOUNT_NUM 2000000
+#define END_ACCOUNT_NUM 100000000
+
+int login_port;
+struct mmo_account {
+ char* userid;
+ char passwd[33];
+ int passwdenc;
+
+ long account_id;
+ long login_id1;
+ long login_id2;
+ long char_id;
+ char lastlogin[24];
+ int sex;
+};
+
+struct mmo_char_server {
+ char name[21];
+ long ip;
+ short port;
+ int users;
+ int maintenance;
+ int new;
+};
+
+struct mmo_char_server server[MAX_SERVERS];
+int server_fd[MAX_SERVERS];
+#endif
diff --git a/src/login/md5calc.c b/src/login/md5calc.c
index abe868d1b..96bfc34d0 100644
--- a/src/login/md5calc.c
+++ b/src/login/md5calc.c
@@ -1,237 +1,237 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-/***********************************************************
- * 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,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]);
-}
-
+// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
+/***********************************************************
+ * 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,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 87fa79f76..9137b5b2c 100644
--- a/src/login/md5calc.h
+++ b/src/login/md5calc.h
@@ -1,8 +1,8 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
-
-void MD5_String(const char * string, char * output);
-void MD5_String2binary(const char * string, char * output);
-
-#endif
+// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
+#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/Makefile b/src/login_sql/Makefile
index f17a7a3c7..6fbb30865 100644
--- a/src/login_sql/Makefile
+++ b/src/login_sql/Makefile
@@ -1,17 +1,17 @@
-all: login-server_sql
-sql: login-server_sql
-
-shared_libs=all
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h
-
-login-server_sql: login.o md5calc.o strlib.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $^ $(LIB_S)
-
-login.o: login.c login.h md5calc.h strlib.h $(COMMON_H)
-md5calc.o: md5calc.c md5calc.h
-strlib.o: strlib.c strlib.h
-
-clean:
- rm -f *.o ../../login-server_sql
-
+all: login-server_sql
+sql: login-server_sql
+
+shared_libs=all
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/showmsg.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/showmsg.h
+
+login-server_sql: login.o md5calc.o strlib.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ $^ $(LIB_S)
+
+login.o: login.c login.h md5calc.h strlib.h $(COMMON_H)
+md5calc.o: md5calc.c md5calc.h
+strlib.o: strlib.c strlib.h
+
+clean:
+ rm -f *.o ../../login-server_sql
+
diff --git a/src/login_sql/login.c b/src/login_sql/login.c
index 4bf197cc2..f61f650cc 100644
--- a/src/login_sql/login.c
+++ b/src/login_sql/login.c
@@ -1,1764 +1,1764 @@
-// $Id: login.c,v 1.6 2004/09/19 21:12:07 Valaris Exp $
-// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
-// txt version 1.100
-
-#include <sys/types.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#pragma lib <libmysql.lib>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <arpa/inet.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h> // for stat/lstat/fstat
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-#include "strlib.h"
-#include "timer.h"
-/*
-#include "timer.h"
-#include "core.h"
-#include "socket.h"
-#include "login.h"
-#include "mmo.h"
-#include "version.h"
-#include "db.h"
-*/
-
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "login.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/timer.h"
-
-#ifdef PASSWORDENC
-#include "md5calc.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define J_MAX_MALLOC_SIZE 65535
-
-//-----------------------------------------------------
-// global variable
-//-----------------------------------------------------
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-int login_port = 6900;
-char lan_char_ip[128]; // Lan char ip added by kashy
-int subnetmaski[4]; // Subnetmask added by kashy
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
-int anti_freeze_enable = 0;
-int ANTI_FREEZE_INTERVAL = 15;
-
-int login_fd;
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-char date_format[32] = "%Y-%m-%d %H:%M:%S";
-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)
-
-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";
-int use_md5_passwds = 0;
-char login_db[256] = "login";
-char loginlog_db[256] = "loginlog";
-
-// 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 tmpsql[65535], tmp_sql[65535];
-
-int console = 0;
-
-//-----------------------------------------------------
-
-#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;
-
-
-//-----------------------------------------------------
-
-static char md5key[20], md5keylen = 16;
-
-//-----------------------------------------------------
-// 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)) {
- printf("DB server Error (select GM Level to Memory)- %s\n", mysql_error(&mysql_handle));
- }
- 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;
-}
-
-//-----------------------------------------------------
-// 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;
-}
-
-//---------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid).
-//---------------------------------------------------
-int e_mail_check(unsigned char *email) {
- char ch;
- unsigned 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;
-}
-
-//-----------------------------------------------------
-// Read Account database - mysql db
-//-----------------------------------------------------
-int mmo_auth_sqldb_init(void) {
-
- printf("Login server init....\n");
-
- // memory initialize
- printf("memory initialize....\n");
-
- mysql_init(&mysql_handle);
-
- // DB connection start
- printf("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
- printf("%s\n", mysql_error(&mysql_handle));
- exit(1);
- } else {
- printf("connect success!\n");
- }
-
- sprintf(tmpsql, "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver', '100','login server started')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- 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.
- sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver','100', 'login server shutdown')", loginlog_db);
-
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- //delete all server status
- sprintf(tmpsql,"DELETE FROM `sstatus`");
- //query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- mysql_close(&mysql_handle);
- printf("close DB connect....\n");
-
- for (i = 0; i < MAX_SERVERS; i++) {
- if ((fd = server_fd[i]) >= 0)
- delete_session(fd);
- }
- delete_session(login_fd);
-}
-
-//-----------------------------------------------------
-// Make new account
-//-----------------------------------------------------
-int mmo_auth_sqldb_new(struct mmo_account* account,const char *tmpstr, char sex) {
- //no need on DB version
-
- printf("Request new account.... - not support on this version\n");
-
- return 0;
-}
-
-//-----------------------------------------------------
-// Make new account
-//-----------------------------------------------------
-int mmo_auth_new(struct mmo_account* account, const char *tmpstr, char sex) {
-
- return 0;
-}
-
-#ifdef LCCWIN32
-extern void gettimeofday(struct timeval *t, struct timezone *dummy);
-#endif
-
-//-----------------------------------------------------
-// Auth
-//-----------------------------------------------------
-int mmo_auth( struct mmo_account* account , int fd){
- struct timeval tv;
- time_t ban_until_time;
- char tmpstr[256];
- char t_uid[256], t_pass[256];
- char user_password[256];
-
- 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;
-
- printf ("auth start...\n");
-
- sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
-
- // auth start : time seed
- gettimeofday(&tv, NULL);
- strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
- sprintf(tmpstr+19, ".%03d", (int)tv.tv_usec/1000);
-
- jstrescapecpy(t_uid,account->userid);
- 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 BINARY `%s`='%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, login_db_userid, 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}
-
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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.
- printf ("auth failed no account %s %s %s\n", tmpstr, account->userid, account->passwd);
- mysql_free_result(sql_res);
- return 0;
- }
- } else {
- printf("mmo_auth DB result error ! \n");
- return 0;
- }
- // 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);
- }
- printf("account id ok encval:%d\n",account->passwdenc);
-#ifdef PASSWORDENC
- if (account->passwdenc > 0) {
- int j = account->passwdenc;
- printf ("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;
- printf("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);
- printf("client [%s] accountpass [%s]\n", user_password, sql_row[2]);
- printf ("end md5calc..\n");
- }
-#endif
- if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) {
- if (account->passwdenc == 0) {
- printf ("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);
- printf("%s\n", p);
-#endif
- }
- return 1;
- }
- printf("auth ok %s %s" RETCODE, tmpstr, account->userid);
- }
-
- 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
- case 100: // 99 = This ID has been totally erased
- printf("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;
- }
- }
-
-/*
-// 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
- strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
- tmpstr[19] = '\0';
- if (ban_until_time > time(NULL)) { // always banned
- return 6; // 6 = Your are Prohibited to log in until %s
- } else { // ban is finished
- // reset the ban time
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE BINARY `%s`='%s'", login_db, login_db_userid, t_uid);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- }
-
- if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) {
- return 2; // 2 = This ID is expired
- }
-
- 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';
-
- sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE BINARY `%s` = '%s'",
- login_db, ip, login_db_userid, sql_row[1]);
- mysql_free_result(sql_res) ; //resource free
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- return -1;
-}
-
-// 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) {
- memcpy(WFIFOP(fd,0), buf, len);
- WFIFOSET(fd,len);
- c++;
- }
- }
-
- return c;
-}
-
-//--------------------------------
-// Char-server anti-freeze system
-//--------------------------------
-int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
- int i;
-
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {// if char-server is online
-// printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]);
- if (server_freezeflag[i]-- < 1) {// Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- session[server_fd[i]]->eof = 1;
- }
- }
- }
-
- 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;
- char ip[16];
-
- 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) {
- printf("Char-server '%s' has disconnected.\n", server[id].name);
- server_fd[id] = -1;
- memset(&server[id], 0, sizeof(struct mmo_char_server));
- // server delete
- sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- close(fd);
- delete_session(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 0x2712:
- if (RFIFOREST(fd) < 19)
- return 0;
- {
- int account_id;
- 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;
- printf("auth -> %d\n", i);
- break;
- }
- }
-
- if (i != AUTH_FIFO_SIZE) { // send account_reg
- int p;
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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);
- if (account_id > 0) {
- sprintf(tmpsql, "SELECT `str`,`value` FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d'",account_id);
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- WFIFOW(fd,0) = 0x2729;
- WFIFOL(fd,4) = account_id;
- for(p = 8; (sql_row = mysql_fetch_row(sql_res));p+=36){
- memcpy(WFIFOP(fd,p), sql_row[0], 32);
- WFIFOL(fd,p+32) = atoi(sql_row[1]);
- }
- WFIFOW(fd,2) = p;
- WFIFOSET(fd,p);
- //printf("account_reg2 send : login->char (auth fifo)\n");
- 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);
- }
- mysql_free_result(sql_res);
- }
- } 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))
- printf("set users %s : %d\n", server[id].name, RFIFOL(fd,2));
- server[id].users = RFIFOL(fd,2);
- if(anti_freeze_enable)
- server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed
-
- sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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] = "";
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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);
- printf("change GM isn't support in this login server version.\n");
- printf("change GM error 0 %s\n", RFIFOP(fd, 8));
-
- RFIFOSKIP(fd, RFIFOW(fd, 2));
- 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)
- printf("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)
- printf("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)
- printf("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))
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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;
- {
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- 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) = timestamp; // status or final date of a banishment
- charif_sendallwos(-1, buf, 11);
- }
- printf("Account: %d Banned until: %ld\n", acc, timestamp);
- sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc);
- // query
- if (mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- }
- RFIFOSKIP(fd,18);
- break;
- }
- return 0;
-
- case 0x2727:
- if (RFIFOREST(fd) < 6)
- return 0;
- {
- int acc,sex;
- unsigned char buf[16];
- acc=RFIFOL(fd,4);
- sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
-
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- 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 = 1;
- else
- sex = 0;
- sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex==0?'M':'F'), login_db_account_id, acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WBUFW(buf,0) = 0x2723;
- WBUFL(buf,2) = acc;
- WBUFB(buf,6) = sex;
- charif_sendallwos(-1, buf, 7);
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- case 0x2728: // save account_reg
- if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
- return 0;
- {
- int acc,p,j;
- char str[32];
- char temp_str[32];
- int value;
- acc=RFIFOL(fd,4);
-
- if (acc>0){
- unsigned char buf[RFIFOW(fd,2)+1];
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
- memcpy(str,RFIFOP(fd,p),32);
- value=RFIFOL(fd,p+32);
- sprintf(tmpsql,"DELETE FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d' AND `str`='%s';",acc,jstrescapecpy(temp_str,str));
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sprintf(tmpsql,"INSERT INTO `global_reg_value` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%d');", acc, jstrescapecpy(temp_str,str), value);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
-
- // Send to char
- memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2));
- WBUFW(buf,0)=0x2729;
- charif_sendallwos(fd,buf,WBUFW(buf,2));
- }
- }
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //row fetching
- }
- if (atol(sql_row[0]) != 0) {
- sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- break;
- }
- RFIFOSKIP(fd,6);
- }
- return 0;
-
- default:
- printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- return 0;
-}
-
-//Lan ip check added by Kashy
-int lan_ip_check(unsigned char *p) {
- int y;
- int lancheck = 1;
- int lancharip[4];
-
- unsigned int k0, k1, k2, k3;
- sscanf(lan_char_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- lancharip[0] = k0; lancharip[1] = k1; lancharip[2] = k2; lancharip[3] = k3;
-
- for(y = 0; y < 4; y++) {
- if ((lancharip[y] & subnetmaski[y])!= (p[y]))
- lancheck = 0;
- break; }
-
- printf("LAN check: %s.\n", (lancheck) ? "\033[1;32mLAN\033[0m" : "\033[1;31mWAN\033[0m");
- return lancheck;
-}
-
-//----------------------------------------------------------------------------------------
-// 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];
- //int sql_fields, sql_cnt;
- struct mmo_account account;
-
- int result, i;
- unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
- char ip[16];
-
- sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-
- if (ipban > 0) {
- //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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (atoi(sql_row[0]) >0) {
- // ip ban ok.
- printf ("packet from banned ip : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
- sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', 'unknown','-3', 'ip banned')", loginlog_db, p[0], p[1], p[2], p[3]);
-
- // query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf ("close session connection...\n");
-
- // close connection
- session[fd]->eof = 1;
-
- } else {
- printf ("packet from ip (ban check ok) : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
- }
- mysql_free_result(sql_res);
- }
-
- if (session[fd]->eof) {
- for(i = 0; i < MAX_SERVERS; i++)
- if (server_fd[i] == fd)
- server_fd[i] = -1;
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while(RFIFOREST(fd)>=2){
- printf("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 0x64: // request client login
- case 0x01dd: // request client login with encrypt
- if(RFIFOREST(fd)< ((RFIFOW(fd, 0) ==0x64)?55:47))
- return 0;
-
- printf("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]);
-
- account.userid = RFIFOP(fd, 6);
- account.passwd = RFIFOP(fd, 30);
-#ifdef PASSWORDENC
- account.passwdenc= (RFIFOW(fd,0)==0x64)?0:PASSWORDENC;
-#else
- account.passwdenc=0;
-#endif
- result=mmo_auth(&account, fd);
-
- jstrescapecpy(t_uid,RFIFOP(fd, 6));
- if(result==-1){
- int gm_level = isGM(account.account_id);
- if (min_level_to_connect > gm_level) {
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- } else {
- if (p[0] != 127) {
- sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s','100', 'login ok')", loginlog_db, p[0], p[1], p[2], p[3], t_uid);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- if (gm_level)
- printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
- else
- printf("Connection of the account '%s' accepted.\n", account.userid);
- server_num=0;
- for(i = 0; i < MAX_SERVERS; i++) {
- if (server_fd[i] >= 0) {
- //Lan check added by Kashy
- if (lan_ip_check(p))
- WFIFOL(fd,47+server_num*32) = inet_addr(lan_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;
- WFIFOL(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- }
- }
- } else {
- char tmp_sql[512];
- char error[64];
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s', '%d','login failed : %%s')", loginlog_db, p[0], p[1], p[2], p[3], 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
- sprintf(tmpsql,tmp_sql," ");
- sprintf(error," ");
- break;
- case 100: // 99 = This ID has been totally erased
- sprintf(tmpsql,tmp_sql,"Account gone.");
- sprintf(error,"Account gone.");
- break;
- default:
- sprintf(tmpsql,tmp_sql,"Uknown Error.");
- sprintf(error,"Uknown Error.");
- break;
- }
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- if ((result == 1) && (dynamic_pass_failure_ban != 0)){ // failed password
- sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%d.%d.%d.%d' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE",
- loginlog_db, p[0], p[1], p[2], p[3], dynamic_pass_failure_ban_time); //how many times filed account? in one ip.
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- //check query result
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
-
- if (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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- }
- 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)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- result = -3;
- }
-
- sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE BINARY `%s` = '%s'",login_db,login_db_userid, t_uid);
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- sql_row = mysql_fetch_row(sql_res); //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 (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,(RFIFOW(fd,0)==0x64)?55:47);
- break;
-
- case 0x01db: // request password key
- if (session[fd]->session_data) {
- printf("login: abnormal request of MD5 key (already opened session).\n");
- session[fd]->eof = 1;
- return 0;
- }
- printf("Request Password key -%s\n",md5key);
- RFIFOSKIP(fd,2);
- WFIFOW(fd,0)=0x01dc;
- WFIFOW(fd,2)=4+md5keylen;
- memcpy(WFIFOP(fd,4),md5key,md5keylen);
- WFIFOSET(fd,WFIFOW(fd,2));
- break;
-
- case 0x2710: // request Char-server connection
- if(RFIFOREST(fd)<86)
- return 0;
- {
- unsigned char* server_name;
- sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')", loginlog_db, p[0], p[1], p[2], p[3], RFIFOP(fd, 2),RFIFOP(fd, 60),RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58));
-
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- printf("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n",
- RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58),
- p[0], p[1], p[2], p[3]);
- account.userid = RFIFOP(fd, 2);
- account.passwd = RFIFOP(fd, 26);
- account.passwdenc = 0;
- server_name = RFIFOP(fd,60);
- 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){
- printf("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,RFIFOP(fd,60),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;
- if(anti_freeze_enable)
- server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
- sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- jstrescapecpy(t_uid,server[account.account_id].name);
- sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')",
- account.account_id, server[account.account_id].name,0);
- //query
- if(mysql_query(&mysql_handle, tmpsql)) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
- WFIFOW(fd,0)=0x2711;
- WFIFOB(fd,2)=0;
- WFIFOSET(fd,3);
- session[fd]->func_parse=parse_fromchar;
- realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);
- } else {
- WFIFOW(fd, 0) =0x2711;
- WFIFOB(fd, 2)=3;
- WFIFOSET(fd, 3);
- }
- }
- RFIFOSKIP(fd, 86);
- return 0;
-
- case 0x7530: // request Athena information
- 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);
- printf ("Athena version check...\n");
- break;
-
- case 0x7532:
- default:
- printf ("End of connection (ip: %s)" RETCODE, ip);
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- return 0;
-}
-
-// Console Command Parser [Wizputer]
-int parse_console(char *buf) {
- char *type,*command;
-
- type = (char *)malloc(64);
- command = (char *)malloc(64);
-
- memset(type,0,64);
- memset(command,0,64);
-
- printf("Console: %s\n",buf);
-
- if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
- sscanf(buf,"%[^\n]",type);
-
- printf("Type of command: %s || Command: %s \n",type,command);
-
- free(buf);
- free(type);
- free(command);
-
- 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);
-}
-
-
-//Lan Support conf reading added by Kashy
-int login_lan_config_read(const char *lancfgName){
- int i;
- char subnetmask[128];
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- fp=fopen(lancfgName, "r");
-
- if (fp == NULL) {
- printf("file not found: %s\n", lancfgName);
- return 1;
- }
- printf("Start reading of Lan Support configuration file\n");
- while(fgets(line, sizeof(line)-1, fp)){
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- i = sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- else if(strcmpi(w1,"lan_char_ip")==0){
- strcpy(lan_char_ip, w2);
- printf ("set Lan_Char_IP : %s\n",w2);
- }
-
- else if(strcmpi(w1,"subnetmask")==0){
- unsigned int k0, k1, k2, k3;
-
- strcpy(subnetmask, w2);
- sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
- subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
- printf ("set subnetmask : %s\n",w2);
- }
- }
- fclose(fp);
-
- {
- unsigned int a0, a1, a2, a3;
- unsigned char p[4];
- sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
- p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
- printf("LAN test of LAN IP of the char-server: ");
- if (lan_ip_check(p) == 0) {
- printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
- }
- }
-
- printf("End reading of Lan Support configuration file\n");
-
- 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()")) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle));
- }
-
- 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){
- printf("Configuration file (%s) not found.\n", cfgName);
- return 1;
- }
- printf ("start reading configuration...\n");
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
-
- else if(strcmpi(w1,"login_port")==0){
- login_port=atoi(w2);
- printf ("set login_port : %s\n",w2);
- }
- else if(strcmpi(w1,"ipban")==0){
- ipban=atoi(w2);
- printf ("set ipban : %d\n",ipban);
- }
- //account ban -> ip ban
- else if(strcmpi(w1,"dynamic_account_ban")==0){
- dynamic_account_ban=atoi(w2);
- printf ("set dynamic_account_ban : %d\n",dynamic_account_ban);
- }
- else if(strcmpi(w1,"dynamic_account_ban_class")==0){
- dynamic_account_ban_class=atoi(w2);
- printf ("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);
- printf ("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);
- printf ("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);
- printf ("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);
- printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
- }
- else if(strcmpi(w1,"anti_freeze_enable")==0){
- anti_freeze_enable = config_switch(w2);
- }
- else if (strcmpi(w1, "anti_freeze_interval") == 0) {
- ANTI_FREEZE_INTERVAL = atoi(w2);
- if (ANTI_FREEZE_INTERVAL < 5)
- ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
- }
- else if (strcmpi(w1, "import") == 0) {
- login_config_read(w2);
- } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- }
- 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;
- }
- printf ("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;
- }
- }
- fclose(fp);
- printf ("End reading configuration...\n");
- 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){
- printf("file not found: %s\n",cfgName);
- exit(1);
- }
- printf("reading configure: %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, "login_db") == 0) {
- strcpy(login_db, w2);
- }
- //add for DB connection
- else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- printf ("set login_server_ip : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_port")==0){
- login_server_port=atoi(w2);
- printf ("set login_server_port : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- printf ("set login_server_id : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- printf ("set login_server_pw : %s\n",w2);
- }
- else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %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);
- }
- //end of custom table config
- else if (strcmpi(w1, "loginlog_db") == 0) {
- strcpy(loginlog_db, w2);
- }
- }
- fclose(fp);
- printf("reading configure done.....\n");
-}
-
-
-//-----------------------------------------------------
-//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;
-}
-
-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 > 1) ? argv[1] : LAN_CONF_NAME);
- //Generate Passworded Key.
- printf ("memset md5key \n");
- memset(md5key, 0, sizeof(md5key));
- printf ("memset md5key complete\n");
- printf ("memset keyleng\n");
- md5keylen=rand()%4+12;
- for(i=0;i<md5keylen;i++)
- md5key[i]=rand()%255+1;
- printf ("memset keyleng complete\n");
-
- printf ("set FIFO Size\n");
- for(i=0;i<AUTH_FIFO_SIZE;i++)
- auth_fifo[i].delflag=1;
- printf ("set FIFO Size complete\n");
-
- printf ("set max servers\n");
- for(i=0;i<MAX_SERVERS;i++)
- server_fd[i]=-1;
- printf ("set max servers complete\n");
- //server port open & binding
-
- login_fd=make_listen_port(login_port);
-
- //Auth start
- printf ("Running mmo_auth_sqldb_init()\n");
- mmo_auth_sqldb_init();
- printf ("finished mmo_auth_sqldb_init()\n");
- //sync account when terminating.
- //but no need when you using DBMS (mysql)
- set_termfunc(mmo_db_close);
-
- //set default parser as parse_login function
- set_defaultparse(parse_login);
-
- //Added for Mugendais I'm Alive mod
- if(imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- //Added by Mugendai for GUI support
- if(flush_on)
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
-
-
- if(anti_freeze_enable > 0) {
- add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system");
- i = add_timer_interval(gettick()+1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000);
- }
-
- // ban deleter timer - 1 minute term
- printf("add interval tic (ip_ban_check)....\n");
- i=add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000);
-
- if (console) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
-
- return 0;
-}
-
-
+// $Id: login.c,v 1.6 2004/09/19 21:12:07 Valaris Exp $
+// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
+// txt version 1.100
+
+#include <sys/types.h>
+
+#ifdef LCCWIN32
+#include <winsock.h>
+#pragma lib <libmysql.lib>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <arpa/inet.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h> // for stat/lstat/fstat
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+
+//add include for DBMS(mysql)
+#include <mysql.h>
+
+#include "strlib.h"
+#include "timer.h"
+/*
+#include "timer.h"
+#include "core.h"
+#include "socket.h"
+#include "login.h"
+#include "mmo.h"
+#include "version.h"
+#include "db.h"
+*/
+
+#include "../common/core.h"
+#include "../common/socket.h"
+#include "login.h"
+#include "../common/mmo.h"
+#include "../common/version.h"
+#include "../common/db.h"
+#include "../common/timer.h"
+
+#ifdef PASSWORDENC
+#include "md5calc.h"
+#endif
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define J_MAX_MALLOC_SIZE 65535
+
+//-----------------------------------------------------
+// global variable
+//-----------------------------------------------------
+int account_id_count = START_ACCOUNT_NUM;
+int server_num;
+int new_account_flag = 0;
+int login_port = 6900;
+char lan_char_ip[128]; // Lan char ip added by kashy
+int subnetmaski[4]; // Subnetmask added by kashy
+
+struct mmo_char_server server[MAX_SERVERS];
+int server_fd[MAX_SERVERS];
+int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+int anti_freeze_enable = 0;
+int ANTI_FREEZE_INTERVAL = 15;
+
+int login_fd;
+
+//Added for Mugendai's I'm Alive mod
+int imalive_on=0;
+int imalive_time=60;
+//Added by Mugendai for GUI
+int flush_on=1;
+int flush_time=100;
+
+char date_format[32] = "%Y-%m-%d %H:%M:%S";
+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)
+
+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";
+int use_md5_passwds = 0;
+char login_db[256] = "login";
+char loginlog_db[256] = "loginlog";
+
+// 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 tmpsql[65535], tmp_sql[65535];
+
+int console = 0;
+
+//-----------------------------------------------------
+
+#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;
+
+
+//-----------------------------------------------------
+
+static char md5key[20], md5keylen = 16;
+
+//-----------------------------------------------------
+// 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)) {
+ printf("DB server Error (select GM Level to Memory)- %s\n", mysql_error(&mysql_handle));
+ }
+ 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;
+}
+
+//-----------------------------------------------------
+// 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;
+}
+
+//---------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid).
+//---------------------------------------------------
+int e_mail_check(unsigned char *email) {
+ char ch;
+ unsigned 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;
+}
+
+//-----------------------------------------------------
+// Read Account database - mysql db
+//-----------------------------------------------------
+int mmo_auth_sqldb_init(void) {
+
+ printf("Login server init....\n");
+
+ // memory initialize
+ printf("memory initialize....\n");
+
+ mysql_init(&mysql_handle);
+
+ // DB connection start
+ printf("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
+ printf("%s\n", mysql_error(&mysql_handle));
+ exit(1);
+ } else {
+ printf("connect success!\n");
+ }
+
+ sprintf(tmpsql, "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver', '100','login server started')", loginlog_db);
+
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ 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.
+ sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver','100', 'login server shutdown')", loginlog_db);
+
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ //delete all server status
+ sprintf(tmpsql,"DELETE FROM `sstatus`");
+ //query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ mysql_close(&mysql_handle);
+ printf("close DB connect....\n");
+
+ for (i = 0; i < MAX_SERVERS; i++) {
+ if ((fd = server_fd[i]) >= 0)
+ delete_session(fd);
+ }
+ delete_session(login_fd);
+}
+
+//-----------------------------------------------------
+// Make new account
+//-----------------------------------------------------
+int mmo_auth_sqldb_new(struct mmo_account* account,const char *tmpstr, char sex) {
+ //no need on DB version
+
+ printf("Request new account.... - not support on this version\n");
+
+ return 0;
+}
+
+//-----------------------------------------------------
+// Make new account
+//-----------------------------------------------------
+int mmo_auth_new(struct mmo_account* account, const char *tmpstr, char sex) {
+
+ return 0;
+}
+
+#ifdef LCCWIN32
+extern void gettimeofday(struct timeval *t, struct timezone *dummy);
+#endif
+
+//-----------------------------------------------------
+// Auth
+//-----------------------------------------------------
+int mmo_auth( struct mmo_account* account , int fd){
+ struct timeval tv;
+ time_t ban_until_time;
+ char tmpstr[256];
+ char t_uid[256], t_pass[256];
+ char user_password[256];
+
+ 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;
+
+ printf ("auth start...\n");
+
+ sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]);
+
+ // auth start : time seed
+ gettimeofday(&tv, NULL);
+ strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec)));
+ sprintf(tmpstr+19, ".%03d", (int)tv.tv_usec/1000);
+
+ jstrescapecpy(t_uid,account->userid);
+ 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 BINARY `%s`='%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, login_db_userid, 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}
+
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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.
+ printf ("auth failed no account %s %s %s\n", tmpstr, account->userid, account->passwd);
+ mysql_free_result(sql_res);
+ return 0;
+ }
+ } else {
+ printf("mmo_auth DB result error ! \n");
+ return 0;
+ }
+ // 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);
+ }
+ printf("account id ok encval:%d\n",account->passwdenc);
+#ifdef PASSWORDENC
+ if (account->passwdenc > 0) {
+ int j = account->passwdenc;
+ printf ("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;
+ printf("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);
+ printf("client [%s] accountpass [%s]\n", user_password, sql_row[2]);
+ printf ("end md5calc..\n");
+ }
+#endif
+ if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) {
+ if (account->passwdenc == 0) {
+ printf ("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);
+ printf("%s\n", p);
+#endif
+ }
+ return 1;
+ }
+ printf("auth ok %s %s" RETCODE, tmpstr, account->userid);
+ }
+
+ 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
+ case 100: // 99 = This ID has been totally erased
+ printf("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;
+ }
+ }
+
+/*
+// 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
+ strftime(tmpstr, 20, date_format, localtime(&ban_until_time));
+ tmpstr[19] = '\0';
+ if (ban_until_time > time(NULL)) { // always banned
+ return 6; // 6 = Your are Prohibited to log in until %s
+ } else { // ban is finished
+ // reset the ban time
+ sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE BINARY `%s`='%s'", login_db, login_db_userid, t_uid);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+
+ if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) {
+ return 2; // 2 = This ID is expired
+ }
+
+ 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';
+
+ sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE BINARY `%s` = '%s'",
+ login_db, ip, login_db_userid, sql_row[1]);
+ mysql_free_result(sql_res) ; //resource free
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ return -1;
+}
+
+// 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) {
+ memcpy(WFIFOP(fd,0), buf, len);
+ WFIFOSET(fd,len);
+ c++;
+ }
+ }
+
+ return c;
+}
+
+//--------------------------------
+// Char-server anti-freeze system
+//--------------------------------
+int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) {
+ int i;
+
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {// if char-server is online
+// printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]);
+ if (server_freezeflag[i]-- < 1) {// Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ session[server_fd[i]]->eof = 1;
+ }
+ }
+ }
+
+ 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;
+ char ip[16];
+
+ 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) {
+ printf("Char-server '%s' has disconnected.\n", server[id].name);
+ server_fd[id] = -1;
+ memset(&server[id], 0, sizeof(struct mmo_char_server));
+ // server delete
+ sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ close(fd);
+ delete_session(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 0x2712:
+ if (RFIFOREST(fd) < 19)
+ return 0;
+ {
+ int account_id;
+ 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;
+ printf("auth -> %d\n", i);
+ break;
+ }
+ }
+
+ if (i != AUTH_FIFO_SIZE) { // send account_reg
+ int p;
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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);
+ if (account_id > 0) {
+ sprintf(tmpsql, "SELECT `str`,`value` FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d'",account_id);
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ WFIFOW(fd,0) = 0x2729;
+ WFIFOL(fd,4) = account_id;
+ for(p = 8; (sql_row = mysql_fetch_row(sql_res));p+=36){
+ memcpy(WFIFOP(fd,p), sql_row[0], 32);
+ WFIFOL(fd,p+32) = atoi(sql_row[1]);
+ }
+ WFIFOW(fd,2) = p;
+ WFIFOSET(fd,p);
+ //printf("account_reg2 send : login->char (auth fifo)\n");
+ 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);
+ }
+ mysql_free_result(sql_res);
+ }
+ } 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))
+ printf("set users %s : %d\n", server[id].name, RFIFOL(fd,2));
+ server[id].users = RFIFOL(fd,2);
+ if(anti_freeze_enable)
+ server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed
+
+ sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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] = "";
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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);
+ printf("change GM isn't support in this login server version.\n");
+ printf("change GM error 0 %s\n", RFIFOP(fd, 8));
+
+ RFIFOSKIP(fd, RFIFOW(fd, 2));
+ 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)
+ printf("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)
+ printf("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)
+ printf("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))
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ printf("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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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;
+ {
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ 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) = timestamp; // status or final date of a banishment
+ charif_sendallwos(-1, buf, 11);
+ }
+ printf("Account: %d Banned until: %ld\n", acc, timestamp);
+ sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc);
+ // query
+ if (mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ }
+ RFIFOSKIP(fd,18);
+ break;
+ }
+ return 0;
+
+ case 0x2727:
+ if (RFIFOREST(fd) < 6)
+ return 0;
+ {
+ int acc,sex;
+ unsigned char buf[16];
+ acc=RFIFOL(fd,4);
+ sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
+
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ 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 = 1;
+ else
+ sex = 0;
+ sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex==0?'M':'F'), login_db_account_id, acc);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ WBUFW(buf,0) = 0x2723;
+ WBUFL(buf,2) = acc;
+ WBUFB(buf,6) = sex;
+ charif_sendallwos(-1, buf, 7);
+ RFIFOSKIP(fd,6);
+ }
+ return 0;
+
+ case 0x2728: // save account_reg
+ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
+ return 0;
+ {
+ int acc,p,j;
+ char str[32];
+ char temp_str[32];
+ int value;
+ acc=RFIFOL(fd,4);
+
+ if (acc>0){
+ unsigned char buf[RFIFOW(fd,2)+1];
+ for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){
+ memcpy(str,RFIFOP(fd,p),32);
+ value=RFIFOL(fd,p+32);
+ sprintf(tmpsql,"DELETE FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d' AND `str`='%s';",acc,jstrescapecpy(temp_str,str));
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sprintf(tmpsql,"INSERT INTO `global_reg_value` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%d');", acc, jstrescapecpy(temp_str,str), value);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+
+ // Send to char
+ memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2));
+ WBUFW(buf,0)=0x2729;
+ charif_sendallwos(fd,buf,WBUFW(buf,2));
+ }
+ }
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+ }
+ if (atol(sql_row[0]) != 0) {
+ sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ break;
+ }
+ RFIFOSKIP(fd,6);
+ }
+ return 0;
+
+ default:
+ printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+//Lan ip check added by Kashy
+int lan_ip_check(unsigned char *p) {
+ int y;
+ int lancheck = 1;
+ int lancharip[4];
+
+ unsigned int k0, k1, k2, k3;
+ sscanf(lan_char_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
+ lancharip[0] = k0; lancharip[1] = k1; lancharip[2] = k2; lancharip[3] = k3;
+
+ for(y = 0; y < 4; y++) {
+ if ((lancharip[y] & subnetmaski[y])!= (p[y]))
+ lancheck = 0;
+ break; }
+
+ printf("LAN check: %s.\n", (lancheck) ? "\033[1;32mLAN\033[0m" : "\033[1;31mWAN\033[0m");
+ return lancheck;
+}
+
+//----------------------------------------------------------------------------------------
+// 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];
+ //int sql_fields, sql_cnt;
+ struct mmo_account account;
+
+ int result, i;
+ unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
+ char ip[16];
+
+ sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+
+ if (ipban > 0) {
+ //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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+
+ if (atoi(sql_row[0]) >0) {
+ // ip ban ok.
+ printf ("packet from banned ip : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
+ sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', 'unknown','-3', 'ip banned')", loginlog_db, p[0], p[1], p[2], p[3]);
+
+ // query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ printf ("close session connection...\n");
+
+ // close connection
+ session[fd]->eof = 1;
+
+ } else {
+ printf ("packet from ip (ban check ok) : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]);
+ }
+ mysql_free_result(sql_res);
+ }
+
+ if (session[fd]->eof) {
+ for(i = 0; i < MAX_SERVERS; i++)
+ if (server_fd[i] == fd)
+ server_fd[i] = -1;
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ while(RFIFOREST(fd)>=2){
+ printf("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 0x64: // request client login
+ case 0x01dd: // request client login with encrypt
+ if(RFIFOREST(fd)< ((RFIFOW(fd, 0) ==0x64)?55:47))
+ return 0;
+
+ printf("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]);
+
+ account.userid = RFIFOP(fd, 6);
+ account.passwd = RFIFOP(fd, 30);
+#ifdef PASSWORDENC
+ account.passwdenc= (RFIFOW(fd,0)==0x64)?0:PASSWORDENC;
+#else
+ account.passwdenc=0;
+#endif
+ result=mmo_auth(&account, fd);
+
+ jstrescapecpy(t_uid,RFIFOP(fd, 6));
+ if(result==-1){
+ int gm_level = isGM(account.account_id);
+ if (min_level_to_connect > gm_level) {
+ WFIFOW(fd,0) = 0x81;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ } else {
+ if (p[0] != 127) {
+ sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s','100', 'login ok')", loginlog_db, p[0], p[1], p[2], p[3], t_uid);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ if (gm_level)
+ printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid);
+ else
+ printf("Connection of the account '%s' accepted.\n", account.userid);
+ server_num=0;
+ for(i = 0; i < MAX_SERVERS; i++) {
+ if (server_fd[i] >= 0) {
+ //Lan check added by Kashy
+ if (lan_ip_check(p))
+ WFIFOL(fd,47+server_num*32) = inet_addr(lan_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;
+ WFIFOL(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ }
+ }
+ } else {
+ char tmp_sql[512];
+ char error[64];
+ sprintf(tmp_sql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s', '%d','login failed : %%s')", loginlog_db, p[0], p[1], p[2], p[3], 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 MSG (actually, all states after 9 except 99 are No MSG, use only this)
+ sprintf(tmpsql,tmp_sql," ");
+ sprintf(error," ");
+ break;
+ case 100: // 99 = This ID has been totally erased
+ sprintf(tmpsql,tmp_sql,"Account gone.");
+ sprintf(error,"Account gone.");
+ break;
+ default:
+ sprintf(tmpsql,tmp_sql,"Uknown Error.");
+ sprintf(error,"Uknown Error.");
+ break;
+ }
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ if ((result == 1) && (dynamic_pass_failure_ban != 0)){ // failed password
+ sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%d.%d.%d.%d' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE",
+ loginlog_db, p[0], p[1], p[2], p[3], dynamic_pass_failure_ban_time); //how many times filed account? in one ip.
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ //check query result
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+
+ if (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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ }
+ 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)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ result = -3;
+ }
+
+ sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE BINARY `%s` = '%s'",login_db,login_db_userid, t_uid);
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ if (sql_res) {
+ sql_row = mysql_fetch_row(sql_res); //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 (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,(RFIFOW(fd,0)==0x64)?55:47);
+ break;
+
+ case 0x01db: // request password key
+ if (session[fd]->session_data) {
+ printf("login: abnormal request of MD5 key (already opened session).\n");
+ session[fd]->eof = 1;
+ return 0;
+ }
+ printf("Request Password key -%s\n",md5key);
+ RFIFOSKIP(fd,2);
+ WFIFOW(fd,0)=0x01dc;
+ WFIFOW(fd,2)=4+md5keylen;
+ memcpy(WFIFOP(fd,4),md5key,md5keylen);
+ WFIFOSET(fd,WFIFOW(fd,2));
+ break;
+
+ case 0x2710: // request Char-server connection
+ if(RFIFOREST(fd)<86)
+ return 0;
+ {
+ unsigned char* server_name;
+ sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')", loginlog_db, p[0], p[1], p[2], p[3], RFIFOP(fd, 2),RFIFOP(fd, 60),RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58));
+
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ printf("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n",
+ RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58),
+ p[0], p[1], p[2], p[3]);
+ account.userid = RFIFOP(fd, 2);
+ account.passwd = RFIFOP(fd, 26);
+ account.passwdenc = 0;
+ server_name = RFIFOP(fd,60);
+ 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){
+ printf("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,RFIFOP(fd,60),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;
+ if(anti_freeze_enable)
+ server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed
+ sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ jstrescapecpy(t_uid,server[account.account_id].name);
+ sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')",
+ account.account_id, server[account.account_id].name,0);
+ //query
+ if(mysql_query(&mysql_handle, tmpsql)) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+ WFIFOW(fd,0)=0x2711;
+ WFIFOB(fd,2)=0;
+ WFIFOSET(fd,3);
+ session[fd]->func_parse=parse_fromchar;
+ realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK);
+ } else {
+ WFIFOW(fd, 0) =0x2711;
+ WFIFOB(fd, 2)=3;
+ WFIFOSET(fd, 3);
+ }
+ }
+ RFIFOSKIP(fd, 86);
+ return 0;
+
+ case 0x7530: // request Athena information
+ 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);
+ printf ("Athena version check...\n");
+ break;
+
+ case 0x7532:
+ default:
+ printf ("End of connection (ip: %s)" RETCODE, ip);
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ return 0;
+}
+
+// Console Command Parser [Wizputer]
+int parse_console(char *buf) {
+ char *type,*command;
+
+ type = (char *)malloc(64);
+ command = (char *)malloc(64);
+
+ memset(type,0,64);
+ memset(command,0,64);
+
+ printf("Console: %s\n",buf);
+
+ if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
+ sscanf(buf,"%[^\n]",type);
+
+ printf("Type of command: %s || Command: %s \n",type,command);
+
+ free(buf);
+ free(type);
+ free(command);
+
+ 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);
+}
+
+
+//Lan Support conf reading added by Kashy
+int login_lan_config_read(const char *lancfgName){
+ int i;
+ char subnetmask[128];
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ fp=fopen(lancfgName, "r");
+
+ if (fp == NULL) {
+ printf("file not found: %s\n", lancfgName);
+ return 1;
+ }
+ printf("Start reading of Lan Support configuration file\n");
+ while(fgets(line, sizeof(line)-1, fp)){
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+
+ i = sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+
+ else if(strcmpi(w1,"lan_char_ip")==0){
+ strcpy(lan_char_ip, w2);
+ printf ("set Lan_Char_IP : %s\n",w2);
+ }
+
+ else if(strcmpi(w1,"subnetmask")==0){
+ unsigned int k0, k1, k2, k3;
+
+ strcpy(subnetmask, w2);
+ sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3);
+ subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3;
+ printf ("set subnetmask : %s\n",w2);
+ }
+ }
+ fclose(fp);
+
+ {
+ unsigned int a0, a1, a2, a3;
+ unsigned char p[4];
+ sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3);
+ p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3;
+ printf("LAN test of LAN IP of the char-server: ");
+ if (lan_ip_check(p) == 0) {
+ printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n");
+ }
+ }
+
+ printf("End reading of Lan Support configuration file\n");
+
+ 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()")) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle));
+ }
+
+ 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){
+ printf("Configuration file (%s) not found.\n", cfgName);
+ return 1;
+ }
+ printf ("start reading configuration...\n");
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+
+ else if(strcmpi(w1,"login_port")==0){
+ login_port=atoi(w2);
+ printf ("set login_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"ipban")==0){
+ ipban=atoi(w2);
+ printf ("set ipban : %d\n",ipban);
+ }
+ //account ban -> ip ban
+ else if(strcmpi(w1,"dynamic_account_ban")==0){
+ dynamic_account_ban=atoi(w2);
+ printf ("set dynamic_account_ban : %d\n",dynamic_account_ban);
+ }
+ else if(strcmpi(w1,"dynamic_account_ban_class")==0){
+ dynamic_account_ban_class=atoi(w2);
+ printf ("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);
+ printf ("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);
+ printf ("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);
+ printf ("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);
+ printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
+ }
+ else if(strcmpi(w1,"anti_freeze_enable")==0){
+ anti_freeze_enable = config_switch(w2);
+ }
+ else if (strcmpi(w1, "anti_freeze_interval") == 0) {
+ ANTI_FREEZE_INTERVAL = atoi(w2);
+ if (ANTI_FREEZE_INTERVAL < 5)
+ ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
+ }
+ else if (strcmpi(w1, "import") == 0) {
+ login_config_read(w2);
+ } else if(strcmpi(w1,"imalive_on")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"imalive_time")==0) { //Added by Mugendai for I'm Alive mod
+ imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"flush_on")==0) { //Added by Mugendai for GUI
+ flush_on = atoi(w2); //Added by Mugendai for GUI
+ } else if(strcmpi(w1,"flush_time")==0) { //Added by Mugendai for GUI
+ flush_time = atoi(w2); //Added by Mugendai for GUI
+ }
+ 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;
+ }
+ printf ("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;
+ }
+ }
+ fclose(fp);
+ printf ("End reading configuration...\n");
+ 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){
+ printf("file not found: %s\n",cfgName);
+ exit(1);
+ }
+ printf("reading configure: %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, "login_db") == 0) {
+ strcpy(login_db, w2);
+ }
+ //add for DB connection
+ else if(strcmpi(w1,"login_server_ip")==0){
+ strcpy(login_server_ip, w2);
+ printf ("set login_server_ip : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_port")==0){
+ login_server_port=atoi(w2);
+ printf ("set login_server_port : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_id")==0){
+ strcpy(login_server_id, w2);
+ printf ("set login_server_id : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_pw")==0){
+ strcpy(login_server_pw, w2);
+ printf ("set login_server_pw : %s\n",w2);
+ }
+ else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ printf ("set login_server_db : %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);
+ }
+ //end of custom table config
+ else if (strcmpi(w1, "loginlog_db") == 0) {
+ strcpy(loginlog_db, w2);
+ }
+ }
+ fclose(fp);
+ printf("reading configure done.....\n");
+}
+
+
+//-----------------------------------------------------
+//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;
+}
+
+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 > 1) ? argv[1] : LAN_CONF_NAME);
+ //Generate Passworded Key.
+ printf ("memset md5key \n");
+ memset(md5key, 0, sizeof(md5key));
+ printf ("memset md5key complete\n");
+ printf ("memset keyleng\n");
+ md5keylen=rand()%4+12;
+ for(i=0;i<md5keylen;i++)
+ md5key[i]=rand()%255+1;
+ printf ("memset keyleng complete\n");
+
+ printf ("set FIFO Size\n");
+ for(i=0;i<AUTH_FIFO_SIZE;i++)
+ auth_fifo[i].delflag=1;
+ printf ("set FIFO Size complete\n");
+
+ printf ("set max servers\n");
+ for(i=0;i<MAX_SERVERS;i++)
+ server_fd[i]=-1;
+ printf ("set max servers complete\n");
+ //server port open & binding
+
+ login_fd=make_listen_port(login_port);
+
+ //Auth start
+ printf ("Running mmo_auth_sqldb_init()\n");
+ mmo_auth_sqldb_init();
+ printf ("finished mmo_auth_sqldb_init()\n");
+ //sync account when terminating.
+ //but no need when you using DBMS (mysql)
+ set_termfunc(mmo_db_close);
+
+ //set default parser as parse_login function
+ set_defaultparse(parse_login);
+
+ //Added for Mugendais I'm Alive mod
+ if(imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+
+ //Added by Mugendai for GUI support
+ if(flush_on)
+ add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+
+
+ if(anti_freeze_enable > 0) {
+ add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system");
+ i = add_timer_interval(gettick()+1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000);
+ }
+
+ // ban deleter timer - 1 minute term
+ printf("add interval tic (ip_ban_check)....\n");
+ i=add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000);
+
+ if (console) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ printf("The login-server is \033[1;32mready\033[0m (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 3c7e06980..6335168d7 100644
--- a/src/login_sql/login.h
+++ b/src/login_sql/login.h
@@ -1,41 +1,41 @@
-#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/lan_support.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.
-
-#define START_ACCOUNT_NUM 2000000
-#define END_ACCOUNT_NUM 100000000
-
-struct mmo_account {
- char* userid;
- char* passwd;
- int passwdenc;
-
- long account_id;
- long login_id1;
- long login_id2;
- long char_id;
- char lastlogin[24];
- int sex;
-};
-
-struct mmo_char_server {
- char name[20];
- long ip;
- short port;
- int users;
- int maintenance;
- int new;
-};
-
-
-#endif
+#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/lan_support.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.
+
+#define START_ACCOUNT_NUM 2000000
+#define END_ACCOUNT_NUM 100000000
+
+struct mmo_account {
+ char* userid;
+ char* passwd;
+ int passwdenc;
+
+ long account_id;
+ long login_id1;
+ long login_id2;
+ long char_id;
+ char lastlogin[24];
+ int sex;
+};
+
+struct mmo_char_server {
+ char name[20];
+ long ip;
+ short port;
+ int users;
+ int maintenance;
+ int new;
+};
+
+
+#endif
diff --git a/src/login_sql/make.sh b/src/login_sql/make.sh
index 3e43cd11f..198d33baf 100644
--- a/src/login_sql/make.sh
+++ b/src/login_sql/make.sh
@@ -1,6 +1,6 @@
-#!/bin/sh
- rsqlt=`rm -rf *.o`
- gcc -c login.c -I/usr/local/include/mysql/
- gcc -c md5calc.c -I/usr/local/include/mysql/
- gcc -c strlib.c
- gcc -o login-server login.o strlib.o md5calc.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql/ -lmysqlclient -lz
+#!/bin/sh
+ rsqlt=`rm -rf *.o`
+ gcc -c login.c -I/usr/local/include/mysql/
+ gcc -c md5calc.c -I/usr/local/include/mysql/
+ gcc -c strlib.c
+ gcc -o login-server login.o strlib.o md5calc.o ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o -L/usr/local/lib/mysql/ -lmysqlclient -lz
diff --git a/src/login_sql/md5calc.c b/src/login_sql/md5calc.c
index d8272c413..58cea1246 100644
--- a/src/login_sql/md5calc.c
+++ b/src/login_sql/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;
-
-// 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,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;
+
+// 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,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 04fb2d8c5..9bc554f69 100644
--- a/src/login_sql/md5calc.h
+++ b/src/login_sql/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/readme.txt b/src/login_sql/readme.txt
index fa02912f7..b945af76c 100644
--- a/src/login_sql/readme.txt
+++ b/src/login_sql/readme.txt
@@ -1,120 +1,120 @@
-// Encoded UTF-8
-//---------------------------------------------
-// 007 - by Jazz
-1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
-
-//---------------------------------------------
-// 006 - by Jazz
-1. パスワード決ã¾ã£ãŸå›žæ•°é–“é•ã„時自動 IPé®æ–­å…·ç¾.
-2. login_athena.confを修正
-
-//---------------------------------------------
-// 005 - by Jazz
-1. 許容ã—ãªã„ IDãŒæŽ¥è¿‘ã®æ™‚自動㧠IPé®æ–­æ©Ÿèƒ½å…·ç¾.
-2. 自動ã§é®æ–­è§£é™¤æ©Ÿèƒ½å…·ç¾.
-
-//---------------------------------------------
-// 004 - by Jazz
-1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
-2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
-3. server 状態を SQLã§å‡ºåŠ›.
-
-//---------------------------------------------
-// 003 - by Jazz
-1. 接続記録を DBã§å‡ºåŠ›.
-2. IP基盤ã®æŽ¥ç¶šé®æ–­å…·ç¾.
-
-//---------------------------------------------
-// 002 - by Jazz
-1. ã„ãã¤ã‹ã®è©³ç´°å•é¡Œç‚¹ä¿®æ­£.
-
-//---------------------------------------------
-// 001 - by Jazz
-1. 一番目安定 versionã§ã™.
-
-
-// notice some..
-In this program, new parts are under BSD License.
-and imported parts are under GPL as athena did.
-
-this program is not public license. but modification and editing are
-unlimit permitted. but auther don't have any responsibility on that.
-
-this realase does not gurantee working perfectly. and, I would
-answer neither that question nor technical one.
-
-I use...
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena is under GPL license.
-Ragnarok is Gravity's trademark.
-login-db for athena is BSD license except code from original athena.
-cygwin is Redhat's trademark.
-
-// About compile.
-You need mysqlclient library to compile this. You can get this by
-compiling mysql source.
-
-"-lmysqlclient" option needed when you did compile.
-
-some patch need on mysql when you did compile under cygwin.
-
-// 몇가지 ì •ë³´ì— ëŒ€í•˜ì—¬
-
-ì´ í”„ë¡œê·¸ëž¨ì—ì„œ 새로 만들어진 ë¶€ë¶„ì€ BSD ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ë°°í¬ ë©ë‹ˆë‹¤.
-그리고 import ëœ ë¶€ë¶„ì€ ì›ëž˜ athenaì˜ GPL ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ìžˆìŠµë‹ˆë‹¤.
-
-ì´ í”„ë¡œê·¸ëž¨ì€ public licenseê°€ 아닙니다. 하지만 변경, 개조, 수정ì€
-무제한 허용ë˜ë©° ê·¸ì— ëŒ€í•œ ì±…ìž„ì€ ì €ìžê°€ 지지 않습니다.
-
-현재 ì´ ë¦´ë¦¬ì¦ˆëŠ” 완벽히 ë™ìž‘í•¨ì„ ë³´ìž¥í•˜ì§€ 않습니다. 그리고 ê·¸ì— ëŒ€í•œ
-ìƒë‹´ ë˜í•œ 절대 받지 않습니다.
-
-기술ì ì¸ ë¶€ë¶„ì˜ ìƒë‹´ì€ 받지 않습니다.
-
-개발 환경
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena는 GPL ë¼ì´ì„¼ìŠ¤ë¥¼ 준수 합니다.
-Ragnarok는 Gravityì˜ trademark입니다.
-login-db for athena는 athenaì—ì„œ 가져온 ë¶€ë¶„ì„ ì œì™¸í•˜ë©´ BSD ë¼ì´ì„¼ìŠ¤ë¥¼ 따릅니다.
-cygwinì€ Redhatì˜ trademark입니다.
-
-// 컴파ì¼ì— 대하여.
-
-ì´ í”„ë¡œê·¸ëž¨ì„ ì»´íŒŒì¼í•˜ê¸° 위하여 mysqlclientì— ëŒ€í•œ libraryê°€ 필요합니다.
-ì´ëŠ” mysqlì˜ ì†ŒìŠ¤ë¥¼ 컴파ì¼í•˜ë©´ ì–»ì„수 있습니다.
-
-컴파ì¼ì‹œì— -lmysqlclient ì˜µì…˜ì´ í•„ìš”í•©ë‹ˆë‹¤.
-
-cygwinì˜ ê²½ìš°ëŠ” 몇가지 패치가 필요합니다.
-
-// ã„ãã¤ã‹ã®æƒ…å ±ã«å¯¾ã—ã¦
-
-ã“ã®ãƒ—ログラムã§æ–°ãŸã«ä½œã‚‰ã‚ŒãŸéƒ¨åˆ†ã¯ BSD ライセンスã®ä¸‹ã«é…布ã«ãªã‚Šã¾ã™.
-ãã—㦠import ã«ãªã£ãŸéƒ¨åˆ†ã¯å…ƒã€… athenaã® GPL ライセンスã®ä¸‹ã«ã‚ã‚Šã¾ã™.
-
-ã“ã®ãƒ—ログラム㯠public licenseã§ã¯ãªã„ã§ã™. ã—ã‹ã—変更, 改造, 修正ã¯
-無制é™è¨±å®¹ã•ã‚Œã¦ãã‚Œã«å¯¾ã™ã‚‹è²¬ä»»ã¯è‘—者ãŒè² ã‘ãªã„ã§ã™.
-
-ç¾åœ¨ã“ã®ãƒªãƒªãƒ¼ã‚¹ã¯å®Œå£ã«å‹•ä½œã™ã‚‹ã“ã¨ã‚’ä¿éšœã—ãªã„ã§ã™. ãã—ã¦å½¼ã«å¤§éŸ“
-相談も絶対å—ã‘ãªã„ã§ã™.
-
-技術的ãªéƒ¨åˆ†ã®ç›¸è«‡ã¯å—ã‘ãªã„ã§ã™.
-
-開発環境
-P4 2.4Gh/512MB/WinXP/cygwin
-
-athena㯠GPL ライセンスを守りã¾ã™.
-Ragnarok㯠Gravityã® trademarkã§ã™.
-login-db for athena㯠athenaã‹ã‚‰æŒã£ã¦æ¥ãŸéƒ¨åˆ†ã‚’除ã‘ã° BSD ライセンスã«ä»˜ãã¾ã™.
-cygwin㯠Redhatã® trademarkã§ã™.
-
-// コンパイルã«å¯¾ã—ã¦.
-
-ã“ã®ãƒ—ログラムをコンパイルã™ã‚‹ãŸã‚ã« mysqlclientã«å¯¾ã™ã‚‹ libraryãŒå¿…è¦ã§ã™.
-ã“れ㯠mysqlã®ã‚½ãƒ¼ã‚¹ã‚’コンパイルã™ã‚Œã°å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™.
-
-コンパイルã®æ™‚ã« -lmysqlclient オプションãŒå¿…è¦ã§ã™.
-
+// Encoded UTF-8
+//---------------------------------------------
+// 007 - by Jazz
+1. 0590 official versionã«åˆã‚ã›ã¦ä¿®æ­£ã—ã¾ã—ãŸ.
+
+//---------------------------------------------
+// 006 - by Jazz
+1. パスワード決ã¾ã£ãŸå›žæ•°é–“é•ã„時自動 IPé®æ–­å…·ç¾.
+2. login_athena.confを修正
+
+//---------------------------------------------
+// 005 - by Jazz
+1. 許容ã—ãªã„ IDãŒæŽ¥è¿‘ã®æ™‚自動㧠IPé®æ–­æ©Ÿèƒ½å…·ç¾.
+2. 自動ã§é®æ–­è§£é™¤æ©Ÿèƒ½å…·ç¾.
+
+//---------------------------------------------
+// 004 - by Jazz
+1. aphostropy å•é¡Œã‚’解決ã—ã¾ã—ãŸ. ã“ã‚Œã¯ä¿å®‰ã¨é€£é–¢ãŒã‚ã‚‹å•é¡Œã§ã™.
+2. SQLã®æ§‹é€ ã‚’修正ã—ã¾ã—ãŸ.
+3. server 状態を SQLã§å‡ºåŠ›.
+
+//---------------------------------------------
+// 003 - by Jazz
+1. 接続記録を DBã§å‡ºåŠ›.
+2. IP基盤ã®æŽ¥ç¶šé®æ–­å…·ç¾.
+
+//---------------------------------------------
+// 002 - by Jazz
+1. ã„ãã¤ã‹ã®è©³ç´°å•é¡Œç‚¹ä¿®æ­£.
+
+//---------------------------------------------
+// 001 - by Jazz
+1. 一番目安定 versionã§ã™.
+
+
+// notice some..
+In this program, new parts are under BSD License.
+and imported parts are under GPL as athena did.
+
+this program is not public license. but modification and editing are
+unlimit permitted. but auther don't have any responsibility on that.
+
+this realase does not gurantee working perfectly. and, I would
+answer neither that question nor technical one.
+
+I use...
+P4 2.4Gh/512MB/WinXP/cygwin
+
+athena is under GPL license.
+Ragnarok is Gravity's trademark.
+login-db for athena is BSD license except code from original athena.
+cygwin is Redhat's trademark.
+
+// About compile.
+You need mysqlclient library to compile this. You can get this by
+compiling mysql source.
+
+"-lmysqlclient" option needed when you did compile.
+
+some patch need on mysql when you did compile under cygwin.
+
+// 몇가지 ì •ë³´ì— ëŒ€í•˜ì—¬
+
+ì´ í”„ë¡œê·¸ëž¨ì—ì„œ 새로 만들어진 ë¶€ë¶„ì€ BSD ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ë°°í¬ ë©ë‹ˆë‹¤.
+그리고 import ëœ ë¶€ë¶„ì€ ì›ëž˜ athenaì˜ GPL ë¼ì´ì„¼ìŠ¤ ì•„ëž˜ì— ìžˆìŠµë‹ˆë‹¤.
+
+ì´ í”„ë¡œê·¸ëž¨ì€ public licenseê°€ 아닙니다. 하지만 변경, 개조, 수정ì€
+무제한 허용ë˜ë©° ê·¸ì— ëŒ€í•œ ì±…ìž„ì€ ì €ìžê°€ 지지 않습니다.
+
+현재 ì´ ë¦´ë¦¬ì¦ˆëŠ” 완벽히 ë™ìž‘í•¨ì„ ë³´ìž¥í•˜ì§€ 않습니다. 그리고 ê·¸ì— ëŒ€í•œ
+ìƒë‹´ ë˜í•œ 절대 받지 않습니다.
+
+기술ì ì¸ ë¶€ë¶„ì˜ ìƒë‹´ì€ 받지 않습니다.
+
+개발 환경
+P4 2.4Gh/512MB/WinXP/cygwin
+
+athena는 GPL ë¼ì´ì„¼ìŠ¤ë¥¼ 준수 합니다.
+Ragnarok는 Gravityì˜ trademark입니다.
+login-db for athena는 athenaì—ì„œ 가져온 ë¶€ë¶„ì„ ì œì™¸í•˜ë©´ BSD ë¼ì´ì„¼ìŠ¤ë¥¼ 따릅니다.
+cygwinì€ Redhatì˜ trademark입니다.
+
+// 컴파ì¼ì— 대하여.
+
+ì´ í”„ë¡œê·¸ëž¨ì„ ì»´íŒŒì¼í•˜ê¸° 위하여 mysqlclientì— ëŒ€í•œ libraryê°€ 필요합니다.
+ì´ëŠ” mysqlì˜ ì†ŒìŠ¤ë¥¼ 컴파ì¼í•˜ë©´ ì–»ì„수 있습니다.
+
+컴파ì¼ì‹œì— -lmysqlclient ì˜µì…˜ì´ í•„ìš”í•©ë‹ˆë‹¤.
+
+cygwinì˜ ê²½ìš°ëŠ” 몇가지 패치가 필요합니다.
+
+// ã„ãã¤ã‹ã®æƒ…å ±ã«å¯¾ã—ã¦
+
+ã“ã®ãƒ—ログラムã§æ–°ãŸã«ä½œã‚‰ã‚ŒãŸéƒ¨åˆ†ã¯ BSD ライセンスã®ä¸‹ã«é…布ã«ãªã‚Šã¾ã™.
+ãã—㦠import ã«ãªã£ãŸéƒ¨åˆ†ã¯å…ƒã€… athenaã® GPL ライセンスã®ä¸‹ã«ã‚ã‚Šã¾ã™.
+
+ã“ã®ãƒ—ログラム㯠public licenseã§ã¯ãªã„ã§ã™. ã—ã‹ã—変更, 改造, 修正ã¯
+無制é™è¨±å®¹ã•ã‚Œã¦ãã‚Œã«å¯¾ã™ã‚‹è²¬ä»»ã¯è‘—者ãŒè² ã‘ãªã„ã§ã™.
+
+ç¾åœ¨ã“ã®ãƒªãƒªãƒ¼ã‚¹ã¯å®Œå£ã«å‹•ä½œã™ã‚‹ã“ã¨ã‚’ä¿éšœã—ãªã„ã§ã™. ãã—ã¦å½¼ã«å¤§éŸ“
+相談も絶対å—ã‘ãªã„ã§ã™.
+
+技術的ãªéƒ¨åˆ†ã®ç›¸è«‡ã¯å—ã‘ãªã„ã§ã™.
+
+開発環境
+P4 2.4Gh/512MB/WinXP/cygwin
+
+athena㯠GPL ライセンスを守りã¾ã™.
+Ragnarok㯠Gravityã® trademarkã§ã™.
+login-db for athena㯠athenaã‹ã‚‰æŒã£ã¦æ¥ãŸéƒ¨åˆ†ã‚’除ã‘ã° BSD ライセンスã«ä»˜ãã¾ã™.
+cygwin㯠Redhatã® trademarkã§ã™.
+
+// コンパイルã«å¯¾ã—ã¦.
+
+ã“ã®ãƒ—ログラムをコンパイルã™ã‚‹ãŸã‚ã« mysqlclientã«å¯¾ã™ã‚‹ libraryãŒå¿…è¦ã§ã™.
+ã“れ㯠mysqlã®ã‚½ãƒ¼ã‚¹ã‚’コンパイルã™ã‚Œã°å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™.
+
+コンパイルã®æ™‚ã« -lmysqlclient オプションãŒå¿…è¦ã§ã™.
+
cygwinã®å ´åˆã¯ã„ãã¤ã‹ã®ãƒ‘ッãƒãŒå¿…è¦ã§ã™. \ No newline at end of file
diff --git a/src/login_sql/strlib.c b/src/login_sql/strlib.c
index b1cb79b71..7f6e19785 100644
--- a/src/login_sql/strlib.c
+++ b/src/login_sql/strlib.c
@@ -1,58 +1,58 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "strlib.h"
-#include "utils.h"
-
-//-----------------------------------------------
-// string lib.
-unsigned char* jstrescape (unsigned char* pt) {
- //copy from here
- unsigned char * ptr;
- int i =0, j=0;
-
- //copy string to temporary
- CREATE(ptr, char, J_MAX_MALLOC_SIZE);
- strcpy (ptr,pt);
-
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- free (ptr);
- return (unsigned char*) &pt[0];
-}
-
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
- //copy from here
- int i =0, j=0;
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return (unsigned char*) &pt[0];
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "strlib.h"
+#include "utils.h"
+
+//-----------------------------------------------
+// string lib.
+unsigned char* jstrescape (unsigned char* pt) {
+ //copy from here
+ unsigned char * ptr;
+ int i =0, j=0;
+
+ //copy string to temporary
+ CREATE(ptr, char, J_MAX_MALLOC_SIZE);
+ strcpy (ptr,pt);
+
+ while (ptr[i] != '\0') {
+ switch (ptr[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ default:
+ pt[j++] = ptr[i++];
+ }
+ }
+ pt[j++] = '\0';
+ free (ptr);
+ return (unsigned char*) &pt[0];
+}
+
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
+ //copy from here
+ int i =0, j=0;
+
+ while (spt[i] != '\0') {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ pt[j++] = '\0';
+ return (unsigned char*) &pt[0];
+}
diff --git a/src/login_sql/strlib.h b/src/login_sql/strlib.h
index 5d58a3a0c..ddf29ab18 100644
--- a/src/login_sql/strlib.h
+++ b/src/login_sql/strlib.h
@@ -1,9 +1,9 @@
-#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"
-unsigned char* jstrescape (unsigned char* pt);
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
-#endif
+#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"
+unsigned char* jstrescape (unsigned char* pt);
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
+#endif
diff --git a/src/login_sql/timer.h b/src/login_sql/timer.h
index ed0ee2ca1..be9706a32 100644
--- a/src/login_sql/timer.h
+++ b/src/login_sql/timer.h
@@ -1,43 +1,43 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _TIMER_H_
-#define _TIMER_H_
-
-#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
-
-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);
-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));
-
-#endif // _TIMER_H_
+// original : core.h 2003/03/14 11:55:25 Rev 1.4
+
+#ifndef _TIMER_H_
+#define _TIMER_H_
+
+#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
+
+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);
+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));
+
+#endif // _TIMER_H_
diff --git a/src/map/Makefile b/src/map/Makefile
index cc5abc73c..3f1bab6c1 100644
--- a/src/map/Makefile
+++ b/src/map/Makefile
@@ -1,73 +1,73 @@
-all: txt sql
-
-txt: txtobj map-server
-
-sql: sqlobj map-server_sql
-
-txtobj:
- mkdir txtobj
-
-sqlobj:
- mkdir sqlobj
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o
-LIBS = -lz -lm
-
-map-server: txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/npc.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $> $(LIBS)
-
-map-server_sql: sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/npc.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/mail.o sqlobj/log.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $> $(LIB_S)
-
-txtobj/%.o: %.c
- $(COMPILE.c) -DTXT_ONLY $(OUTPUT_OPTION) $<
-
-sqlobj/%.o: %.c
- $(COMPILE.c) $(OUTPUT_OPTION) $<
-
-txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h
-txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h
-txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-
-sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mail.o: mail.c mail.h ../common/showmsg.h
-sqlobj/log.o: log.c log.h map.h ../common/nullpo.h
-
-clean:
- rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
+all: txt sql
+
+txt: txtobj map-server
+
+sql: sqlobj map-server_sql
+
+txtobj:
+ mkdir txtobj
+
+sqlobj:
+ mkdir sqlobj
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o
+LIBS = -lz -lm
+
+map-server: txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/npc.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ $> $(LIBS)
+
+map-server_sql: sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/npc.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/mail.o sqlobj/log.o $(COMMON_OBJ)
+ $(CC) -o ../../$@ $> $(LIB_S)
+
+txtobj/%.o: %.c
+ $(COMPILE.c) -DTXT_ONLY $(OUTPUT_OPTION) $<
+
+sqlobj/%.o: %.c
+ $(COMPILE.c) $(OUTPUT_OPTION) $<
+
+txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
+txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
+txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
+txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
+txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h
+txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h
+txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+
+sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
+sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
+sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
+sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
+sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h
+sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h
+sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/mail.o: mail.c mail.h ../common/showmsg.h
+sqlobj/log.o: log.c log.h map.h ../common/nullpo.h
+
+clean:
+ rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
diff --git a/src/map/Makefile.win32 b/src/map/Makefile.win32
index df6782c84..8614d8df0 100644
--- a/src/map/Makefile.win32
+++ b/src/map/Makefile.win32
@@ -1,93 +1,93 @@
-# grab a copy of http://www.winimage.com/zLibDll/zlib122.zip
-# and put safely into a subdirectory someplace
-# then point ZLIBDIR at whereever you put it
-#
-
-all: txt sql
-
-txt: txtobj map-server
-
-sql: sqlobj map-server_sql
-
-txtobj:
- mkdir txtobj
-
-sqlobj:
- mkdir sqlobj
-
-ZLIBDIR = C:/athena/zlib122
-PACKETDEF = -DPACKETVER=5 -DNEW_006b
-# OPT = /MDd /D_DEBUG
-OPT =
-LINKOPT = /debug /SUBSYSTEM:CONSOLE
-# OPT = /O2
-CFLAGS = $(OPT) /nologo /I../common /I$(ZLIBDIR) $(PACKETDEF) /D_WIN32
-
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o
-LIBS = "WSOCK32.LIB"
-
-# "WSOCK32.LIB" "USER32.LIB" "ADVAPI32.LIB" "MSVCRT.LIB" "OLDNAMES.LIB" "KERNEL32.LIB"
-
-TXTOBJS = txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/npc.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o $(COMMON_OBJ) $(ZLIBDIR)/inflate.o $(ZLIBDIR)/adler32.o $(ZLIBDIR)/crc32.o $(ZLIBDIR)/inftrees.o $(ZLIBDIR)/zutil.o $(ZLIBDIR)/inffast.o
-
-map-server: $(TXTOBJS)
- link $(LINKOPT) /out:../../$@.exe $(TXTOBJS) $(LIBS)
-
-map-server_sql: sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/npc.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/mail.o $(COMMON_OBJ)
- link $(LINKOPT) /out:../../$@.exe $> $(LIBS)
-
-txtobj/%.o: %.c
- Cl /c $(CFLAGS) -DTXT_ONLY /Fo$@ $<
-
-sqlobj/%.o: %.c
- Cl /c $(CFLAGS) /Fo$@ $<
-
-%.o: %.c
- Cl /c $(CFLAGS) /Fo$@ $<
-
-txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h
-txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h
-txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-
-sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
-sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
-sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
-sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
-sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
-sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
-sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h
-sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
-sqlobj/mail.o: mail.c mail.h ../common/showmsg.h
-sqlobj/log.o: log.c log.h map.h ../common/nullpo.h
-
-clean:
- rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
+# grab a copy of http://www.winimage.com/zLibDll/zlib122.zip
+# and put safely into a subdirectory someplace
+# then point ZLIBDIR at whereever you put it
+#
+
+all: txt sql
+
+txt: txtobj map-server
+
+sql: sqlobj map-server_sql
+
+txtobj:
+ mkdir txtobj
+
+sqlobj:
+ mkdir sqlobj
+
+ZLIBDIR = C:/athena/zlib122
+PACKETDEF = -DPACKETVER=5 -DNEW_006b
+# OPT = /MDd /D_DEBUG
+OPT =
+LINKOPT = /debug /SUBSYSTEM:CONSOLE
+# OPT = /O2
+CFLAGS = $(OPT) /nologo /I../common /I$(ZLIBDIR) $(PACKETDEF) /D_WIN32
+
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/showmsg.o
+LIBS = "WSOCK32.LIB"
+
+# "WSOCK32.LIB" "USER32.LIB" "ADVAPI32.LIB" "MSVCRT.LIB" "OLDNAMES.LIB" "KERNEL32.LIB"
+
+TXTOBJS = txtobj/map.o txtobj/chrif.o txtobj/clif.o txtobj/pc.o txtobj/npc.o txtobj/chat.o txtobj/path.o txtobj/itemdb.o txtobj/mob.o txtobj/script.o txtobj/storage.o txtobj/skill.o txtobj/atcommand.o txtobj/battle.o txtobj/intif.o txtobj/trade.o txtobj/party.o txtobj/vending.o txtobj/guild.o txtobj/pet.o $(COMMON_OBJ) $(ZLIBDIR)/inflate.o $(ZLIBDIR)/adler32.o $(ZLIBDIR)/crc32.o $(ZLIBDIR)/inftrees.o $(ZLIBDIR)/zutil.o $(ZLIBDIR)/inffast.o
+
+map-server: $(TXTOBJS)
+ link $(LINKOPT) /out:../../$@.exe $(TXTOBJS) $(LIBS)
+
+map-server_sql: sqlobj/map.o sqlobj/chrif.o sqlobj/clif.o sqlobj/pc.o sqlobj/npc.o sqlobj/chat.o sqlobj/path.o sqlobj/itemdb.o sqlobj/mob.o sqlobj/script.o sqlobj/storage.o sqlobj/skill.o sqlobj/atcommand.o sqlobj/battle.o sqlobj/intif.o sqlobj/trade.o sqlobj/party.o sqlobj/vending.o sqlobj/guild.o sqlobj/pet.o sqlobj/mail.o $(COMMON_OBJ)
+ link $(LINKOPT) /out:../../$@.exe $> $(LIBS)
+
+txtobj/%.o: %.c
+ Cl /c $(CFLAGS) -DTXT_ONLY /Fo$@ $<
+
+sqlobj/%.o: %.c
+ Cl /c $(CFLAGS) /Fo$@ $<
+
+%.o: %.c
+ Cl /c $(CFLAGS) /Fo$@ $<
+
+txtobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+txtobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
+txtobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+txtobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
+txtobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
+txtobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+txtobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+txtobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
+txtobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+txtobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+txtobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h ../common/mmo.h ../common/showmsg.h
+txtobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h ../common/mmo.h ../common/showmsg.h
+txtobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+txtobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+
+sqlobj/map.o: map.c map.h chrif.h clif.h npc.h pc.h mob.h chat.h skill.h itemdb.h storage.h party.h pet.h atcommand.h log.h ../common/core.h ../common/timer.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+sqlobj/chrif.o: chrif.c map.h battle.h chrif.h clif.h intif.h pc.h npc.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/clif.o: clif.c map.h chrif.h clif.h mob.h intif.h pc.h npc.h itemdb.h chat.h script.h storage.h party.h guild.h atcommand.h pet.h atcommand.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/showmsg.h
+sqlobj/pc.o: pc.c map.h clif.h intif.h pc.h npc.h mob.h itemdb.h battle.h skill.h script.h party.h guild.h pet.h trade.h storage.h chat.h vending.h log.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+sqlobj/npc.o: npc.c map.h npc.h clif.h pc.h script.h mob.h itemdb.h battle.h ../common/db.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/chat.o: chat.c map.h clif.h pc.h chat.h ../common/db.h ../common/mmo.h ../common/showmsg.h
+sqlobj/path.o: path.c map.h battle.h ../common/mmo.h ../common/showmsg.h
+sqlobj/itemdb.o: itemdb.c map.h battle.h itemdb.h ../common/db.h ../common/grfio.h ../common/mmo.h ../common/showmsg.h
+sqlobj/mob.o: mob.c map.h clif.h intif.h pc.h mob.h skill.h battle.h npc.h itemdb.h log.h ../common/timer.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+sqlobj/script.o: script.c itemdb.h map.h pc.h mob.h clif.h intif.h npc.h script.h storage.h skill.h pet.h battle.h log.h ../common/timer.h ../common/socket.h ../common/db.h ../common/mmo.h ../common/lock.h ../common/showmsg.h
+sqlobj/storage.o: storage.c itemdb.h pc.h clif.h intif.h storage.h guild.h ../common/mmo.h ../common/db.h ../common/showmsg.h
+sqlobj/skill.o: skill.c skill.h map.h clif.h pc.h mob.h battle.h itemdb.h script.h log.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/atcommand.o: atcommand.c atcommand.h itemdb.h pc.h map.h skill.h clif.h mob.h intif.h battle.h storage.h guild.h pet.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/battle.o: battle.c battle.h skill.h map.h mob.h pc.h pet.h guild.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/intif.o: intif.c intif.h chrif.h clif.h party.h guild.h storage.h map.h battle.h pet.h ../common/socket.h ../common/mmo.h ../common/showmsg.h
+sqlobj/trade.o: trade.c trade.h clif.h itemdb.h map.h pc.h npc.h log.h ../common/mmo.h ../common/showmsg.h
+sqlobj/party.o: party.c party.h clif.h intif.h pc.h map.h battle.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/vending.o: vending.c vending.h clif.h itemdb.h map.h pc.h log.h ../common/mmo.h ../common/showmsg.h
+sqlobj/guild.o: guild.c guild.h storage.h battle.h clif.h intif.h pc.h npc.h map.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/pet.o: pet.c pet.h map.h clif.h chrif.h intif.h pc.h itemdb.h battle.h mob.h npc.h script.h ../common/db.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/showmsg.h
+sqlobj/mail.o: mail.c mail.h ../common/showmsg.h
+sqlobj/log.o: log.c log.h map.h ../common/nullpo.h
+
+clean:
+ rm -rf *.o ../../map-server ../../map-server_sql sqlobj txtobj
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 1e43407c8..ecdec12d9 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -1,7703 +1,7703 @@
-// $Id: atcommand.c 148 2004-09-30 14:05:37Z MouseJstr $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "nullpo.h"
-
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "pc.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 "core.h"
-
-#ifndef TXT_ONLY
-#include "mail.h"
-#endif
-
-#define STATE_BLIND 0x10
-
-static char command_symbol = '@'; // first char of the commands (by [Yor])
-
-static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
-
-#define ATCOMMAND_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
-ATCOMMAND_FUNC(broadcast);
-ATCOMMAND_FUNC(localbroadcast);
-ATCOMMAND_FUNC(rurap);
-ATCOMMAND_FUNC(rura);
-ATCOMMAND_FUNC(where);
-ATCOMMAND_FUNC(jumpto);
-ATCOMMAND_FUNC(jump);
-ATCOMMAND_FUNC(who);
-ATCOMMAND_FUNC(who2);
-ATCOMMAND_FUNC(who3);
-ATCOMMAND_FUNC(whomap);
-ATCOMMAND_FUNC(whomap2);
-ATCOMMAND_FUNC(whomap3);
-ATCOMMAND_FUNC(whogm); // by Yor
-ATCOMMAND_FUNC(save);
-ATCOMMAND_FUNC(load);
-ATCOMMAND_FUNC(speed);
-ATCOMMAND_FUNC(storage);
-ATCOMMAND_FUNC(guildstorage);
-ATCOMMAND_FUNC(option);
-ATCOMMAND_FUNC(hide);
-ATCOMMAND_FUNC(jobchange);
-ATCOMMAND_FUNC(die);
-ATCOMMAND_FUNC(kill);
-ATCOMMAND_FUNC(alive);
-ATCOMMAND_FUNC(kami);
-ATCOMMAND_FUNC(heal);
-ATCOMMAND_FUNC(item);
-ATCOMMAND_FUNC(item2);
-ATCOMMAND_FUNC(itemreset);
-ATCOMMAND_FUNC(itemcheck);
-ATCOMMAND_FUNC(baselevelup);
-ATCOMMAND_FUNC(joblevelup);
-ATCOMMAND_FUNC(help);
-ATCOMMAND_FUNC(gm);
-ATCOMMAND_FUNC(pvpoff);
-ATCOMMAND_FUNC(pvpon);
-ATCOMMAND_FUNC(gvgoff);
-ATCOMMAND_FUNC(gvgon);
-ATCOMMAND_FUNC(model);
-ATCOMMAND_FUNC(go);
-ATCOMMAND_FUNC(monster);
-ATCOMMAND_FUNC(spawn);
-ATCOMMAND_FUNC(killmonster);
-ATCOMMAND_FUNC(killmonster2);
-ATCOMMAND_FUNC(refine);
-ATCOMMAND_FUNC(produce);
-ATCOMMAND_FUNC(memo);
-ATCOMMAND_FUNC(gat);
-ATCOMMAND_FUNC(packet);
-ATCOMMAND_FUNC(statuspoint);
-ATCOMMAND_FUNC(skillpoint);
-ATCOMMAND_FUNC(zeny);
-ATCOMMAND_FUNC(param);
-ATCOMMAND_FUNC(guildlevelup);
-ATCOMMAND_FUNC(makeegg);
-ATCOMMAND_FUNC(hatch);
-ATCOMMAND_FUNC(petfriendly);
-ATCOMMAND_FUNC(pethungry);
-ATCOMMAND_FUNC(petrename);
-ATCOMMAND_FUNC(charpetrename); // by Yor
-ATCOMMAND_FUNC(recall);
-ATCOMMAND_FUNC(recallall);
-ATCOMMAND_FUNC(character_job);
-ATCOMMAND_FUNC(revive);
-ATCOMMAND_FUNC(character_stats);
-ATCOMMAND_FUNC(character_stats_all);
-ATCOMMAND_FUNC(character_option);
-ATCOMMAND_FUNC(character_save);
-ATCOMMAND_FUNC(night);
-ATCOMMAND_FUNC(day);
-ATCOMMAND_FUNC(doom);
-ATCOMMAND_FUNC(doommap);
-ATCOMMAND_FUNC(raise);
-ATCOMMAND_FUNC(raisemap);
-ATCOMMAND_FUNC(character_baselevel);
-ATCOMMAND_FUNC(character_joblevel);
-ATCOMMAND_FUNC(kick);
-ATCOMMAND_FUNC(kickall);
-ATCOMMAND_FUNC(allskill);
-ATCOMMAND_FUNC(questskill);
-ATCOMMAND_FUNC(charquestskill);
-ATCOMMAND_FUNC(lostskill);
-ATCOMMAND_FUNC(charlostskill);
-ATCOMMAND_FUNC(spiritball);
-ATCOMMAND_FUNC(party);
-ATCOMMAND_FUNC(guild);
-ATCOMMAND_FUNC(charskreset);
-ATCOMMAND_FUNC(charstreset);
-ATCOMMAND_FUNC(charreset);
-ATCOMMAND_FUNC(charstpoint);
-ATCOMMAND_FUNC(charmodel);
-ATCOMMAND_FUNC(charskpoint);
-ATCOMMAND_FUNC(charzeny);
-ATCOMMAND_FUNC(agitstart);
-ATCOMMAND_FUNC(agitend);
-ATCOMMAND_FUNC(reloaditemdb);
-ATCOMMAND_FUNC(reloadmobdb);
-ATCOMMAND_FUNC(reloadskilldb);
-#ifndef TXT_ONLY
-ATCOMMAND_FUNC(rehash);// by Fr3DBr
-#else /* TXT_ONLY */
-ATCOMMAND_FUNC(reloadscript);
-#endif /* TXT_ONLY */
-ATCOMMAND_FUNC(reloadgmdb); // by Yor
-ATCOMMAND_FUNC(mapexit);
-ATCOMMAND_FUNC(idsearch);
-ATCOMMAND_FUNC(mapinfo);
-ATCOMMAND_FUNC(dye); //** by fritz
-ATCOMMAND_FUNC(hair_style); //** by fritz
-ATCOMMAND_FUNC(hair_color); //** by fritz
-ATCOMMAND_FUNC(stat_all); //** by fritz
-ATCOMMAND_FUNC(char_change_sex); // by Yor
-ATCOMMAND_FUNC(char_block); // by Yor
-ATCOMMAND_FUNC(char_ban); // by Yor
-ATCOMMAND_FUNC(char_unblock); // by Yor
-ATCOMMAND_FUNC(char_unban); // by Yor
-ATCOMMAND_FUNC(mount_peco); // by Valaris
-ATCOMMAND_FUNC(char_mount_peco); // by Yor
-ATCOMMAND_FUNC(guildspy); // [Syrus22]
-ATCOMMAND_FUNC(partyspy); // [Syrus22]
-ATCOMMAND_FUNC(repairall); // [Valaris]
-ATCOMMAND_FUNC(guildrecall); // by Yor
-ATCOMMAND_FUNC(partyrecall); // by Yor
-//ATCOMMAND_FUNC(nuke); // [Valaris]
-ATCOMMAND_FUNC(enablenpc);
-ATCOMMAND_FUNC(disablenpc);
-ATCOMMAND_FUNC(servertime); // by Yor
-ATCOMMAND_FUNC(chardelitem); // by Yor
-ATCOMMAND_FUNC(jail); // by Yor
-ATCOMMAND_FUNC(unjail); // by Yor
-ATCOMMAND_FUNC(disguise); // [Valaris]
-ATCOMMAND_FUNC(undisguise); // by Yor
-ATCOMMAND_FUNC(chardisguise); // Kalaspuff
-ATCOMMAND_FUNC(charundisguise); // Kalaspuff
-ATCOMMAND_FUNC(email); // by Yor
-ATCOMMAND_FUNC(effect);//by Apple
-ATCOMMAND_FUNC(character_item_list); // by Yor
-ATCOMMAND_FUNC(character_storage_list); // by Yor
-ATCOMMAND_FUNC(character_cart_list); // by Yor
-ATCOMMAND_FUNC(addwarp); // by MouseJstr
-ATCOMMAND_FUNC(follow); // by MouseJstr
-ATCOMMAND_FUNC(skillon); // by MouseJstr
-ATCOMMAND_FUNC(skilloff); // by MouseJstr
-ATCOMMAND_FUNC(killer); // by MouseJstr
-ATCOMMAND_FUNC(npcmove); // by MouseJstr
-ATCOMMAND_FUNC(killable); // by MouseJstr
-ATCOMMAND_FUNC(charkillable); // by MouseJstr
-ATCOMMAND_FUNC(chareffect); // by MouseJstr
-ATCOMMAND_FUNC(chardye); // by MouseJstr
-ATCOMMAND_FUNC(charhairstyle); // by MouseJstr
-ATCOMMAND_FUNC(charhaircolor); // by MouseJstr
-ATCOMMAND_FUNC(dropall); // by MouseJstr
-ATCOMMAND_FUNC(chardropall); // by MouseJstr
-ATCOMMAND_FUNC(storeall); // by MouseJstr
-ATCOMMAND_FUNC(charstoreall); // by MouseJstr
-ATCOMMAND_FUNC(skillid); // by MouseJstr
-ATCOMMAND_FUNC(useskill); // by MouseJstr
-ATCOMMAND_FUNC(summon);
-ATCOMMAND_FUNC(rain);
-ATCOMMAND_FUNC(snow);
-ATCOMMAND_FUNC(sakura);
-ATCOMMAND_FUNC(fog);
-ATCOMMAND_FUNC(leaves);
-ATCOMMAND_FUNC(adjgmlvl); // by MouseJstr
-ATCOMMAND_FUNC(adjcmdlvl); // by MouseJstr
-ATCOMMAND_FUNC(trade); // by MouseJstr
-ATCOMMAND_FUNC(send); // by davidsiaw
-ATCOMMAND_FUNC(setbattleflag); // by MouseJstr
-ATCOMMAND_FUNC(unmute); // [Valaris]
-ATCOMMAND_FUNC(uptime); // by MC Cameri
-ATCOMMAND_FUNC(changesex); // by MC Cameri
-
-#ifndef TXT_ONLY
-ATCOMMAND_FUNC(checkmail); // [Valaris]
-ATCOMMAND_FUNC(listmail); // [Valaris]
-ATCOMMAND_FUNC(listnewmail); // [Valaris]
-ATCOMMAND_FUNC(readmail); // [Valaris]
-ATCOMMAND_FUNC(sendmail); // [Valaris]
-ATCOMMAND_FUNC(sendprioritymail); // [Valaris]
-ATCOMMAND_FUNC(deletemail); // [Valaris]
-ATCOMMAND_FUNC(sound); // [Valaris]
-ATCOMMAND_FUNC(refreshonline); // [Valaris]
-#endif /* TXT_ONLY */
-
-/*==========================================
- *AtCommandInfo atcommand_info[]\‘¢‘Ì‚Ì’è‹`
- *------------------------------------------
- */
-
-// First char of commands is configured in atcommand_athena.conf. Leave @ in this list for default value.
-// to set default level, read atcommand_athena.conf first please.
-static AtCommandInfo atcommand_info[] = {
- { AtCommand_RuraP, "@rura+", 60, atcommand_rurap },
- { AtCommand_RuraP, "@charwarp", 60, atcommand_rurap },
- { AtCommand_Rura, "@rura", 40, atcommand_rura },
- { AtCommand_Warp, "@warp", 40, atcommand_rura },
- { AtCommand_Where, "@where", 1, atcommand_where },
- { AtCommand_JumpTo, "@jumpto", 20, atcommand_jumpto }, // + /shift
- { AtCommand_JumpTo, "@warpto", 20, atcommand_jumpto },
- { AtCommand_JumpTo, "@goto", 20, atcommand_jumpto },
- { AtCommand_Jump, "@jump", 40, atcommand_jump },
- { AtCommand_Who, "@who", 20, atcommand_who },
- { AtCommand_Who, "@whois", 20, atcommand_who },
- { AtCommand_Who2, "@who2", 20, atcommand_who2 },
- { AtCommand_Who3, "@who3", 20, atcommand_who3 },
- { AtCommand_WhoMap, "@whomap", 20, atcommand_whomap },
- { AtCommand_WhoMap2, "@whomap2", 20, atcommand_whomap2 },
- { AtCommand_WhoMap3, "@whomap3", 20, atcommand_whomap3 },
- { AtCommand_WhoGM, "@whogm", 20, atcommand_whogm }, // by Yor
- { AtCommand_Save, "@save", 40, atcommand_save },
- { AtCommand_Load, "@return", 40, atcommand_load },
- { AtCommand_Load, "@load", 40, atcommand_load },
- { AtCommand_Speed, "@speed", 40, atcommand_speed },
- { AtCommand_Storage, "@storage", 1, atcommand_storage },
- { AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage },
- { AtCommand_Option, "@option", 40, atcommand_option },
- { AtCommand_Hide, "@hide", 40, atcommand_hide }, // + /hide
- { AtCommand_JobChange, "@jobchange", 40, atcommand_jobchange },
- { AtCommand_JobChange, "@job", 40, atcommand_jobchange },
- { AtCommand_Die, "@die", 1, atcommand_die },
- { AtCommand_Kill, "@kill", 60, atcommand_kill },
- { AtCommand_Alive, "@alive", 60, atcommand_alive },
- { AtCommand_Kami, "@kami", 40, atcommand_kami },
- { AtCommand_KamiB, "@kamib", 40, atcommand_kami },
- { AtCommand_Heal, "@heal", 40, atcommand_heal },
- { AtCommand_Item, "@item", 60, atcommand_item },
- { AtCommand_Item2, "@item2", 60, atcommand_item2 },
- { AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset },
- { AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck },
- { AtCommand_BaseLevelUp, "@lvup", 60, atcommand_baselevelup },
- { AtCommand_BaseLevelUp, "@blevel", 60, atcommand_baselevelup },
- { AtCommand_BaseLevelUp, "@baselvlup", 60, atcommand_baselevelup },
- { AtCommand_JobLevelUp, "@jlevel", 60, atcommand_joblevelup },
- { AtCommand_JobLevelUp, "@joblvup", 60, atcommand_joblevelup },
- { AtCommand_JobLevelUp, "@joblvlup", 60, atcommand_joblevelup },
- { AtCommand_H, "@h", 20, atcommand_help },
- { AtCommand_Help, "@help", 20, atcommand_help },
- { AtCommand_GM, "@gm", 100, atcommand_gm },
- { AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff },
- { AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon },
- { AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff },
- { AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff },
- { AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon },
- { AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon },
- { AtCommand_Model, "@model", 20, atcommand_model },
- { AtCommand_Go, "@go", 10, atcommand_go },
- { AtCommand_Spawn, "@monster", 50, atcommand_spawn },
- { AtCommand_Spawn, "@spawn", 50, atcommand_spawn },
-// { AtCommand_Spawn, "@summon", 50, atcommand_spawn },
- { AtCommand_Monster, "@monster2", 50, atcommand_monster },
- { AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster },
- { AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 },
- { AtCommand_Refine, "@refine", 60, atcommand_refine },
- { AtCommand_Produce, "@produce", 60, atcommand_produce },
- { AtCommand_Memo, "@memo", 40, atcommand_memo },
- { AtCommand_GAT, "@gat", 99, atcommand_gat }, // debug function
- { AtCommand_Packet, "@packet", 99, atcommand_packet }, // debug function
- { AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint },
- { AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint },
- { AtCommand_Zeny, "@zeny", 60, atcommand_zeny },
- { AtCommand_Strength, "@str", 60, atcommand_param },
- { AtCommand_Agility, "@agi", 60, atcommand_param },
- { AtCommand_Vitality, "@vit", 60, atcommand_param },
- { AtCommand_Intelligence, "@int", 60, atcommand_param },
- { AtCommand_Dexterity, "@dex", 60, atcommand_param },
- { AtCommand_Luck, "@luk", 60, atcommand_param },
- { AtCommand_GuildLevelUp, "@guildlvup", 60, atcommand_guildlevelup },
- { AtCommand_GuildLevelUp, "@guildlvlup", 60, atcommand_guildlevelup },
- { AtCommand_MakeEgg, "@makeegg", 60, atcommand_makeegg },
- { AtCommand_Hatch, "@hatch", 60, atcommand_hatch },
- { AtCommand_PetFriendly, "@petfriendly", 40, atcommand_petfriendly },
- { AtCommand_PetHungry, "@pethungry", 40, atcommand_pethungry },
- { AtCommand_PetRename, "@petrename", 1, atcommand_petrename },
- { AtCommand_CharPetRename, "@charpetrename", 50, atcommand_charpetrename }, // by Yor
- { AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall
- { AtCommand_CharacterJob, "@charjob", 60, atcommand_character_job },
- { AtCommand_CharacterJob, "@charjobchange", 60, atcommand_character_job },
- { AtCommand_Revive, "@revive", 60, atcommand_revive },
- { AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats },
- { AtCommand_CharacterStatsAll, "@charstatsall", 40, atcommand_character_stats_all },
- { AtCommand_CharacterOption, "@charoption", 60, atcommand_character_option },
- { AtCommand_CharacterSave, "@charsave", 60, atcommand_character_save },
- { AtCommand_Night, "@night", 80, atcommand_night },
- { AtCommand_Day, "@day", 80, atcommand_day },
- { AtCommand_Doom, "@doom", 80, atcommand_doom },
- { AtCommand_DoomMap, "@doommap", 80, atcommand_doommap },
- { AtCommand_Raise, "@raise", 80, atcommand_raise },
- { AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap },
- { AtCommand_CharacterBaseLevel, "@charbaselvl", 60, atcommand_character_baselevel },
- { AtCommand_CharacterJobLevel, "@charjlvl", 60, atcommand_character_joblevel },
- { AtCommand_Kick, "@kick", 20, atcommand_kick }, // + right click menu for GM "(name) force to quit"
- { AtCommand_KickAll, "@kickall", 99, atcommand_kickall },
- { AtCommand_AllSkill, "@allskill", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@allskills", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@skillall", 60, atcommand_allskill },
- { AtCommand_AllSkill, "@skillsall", 60, atcommand_allskill },
- { AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill },
- { AtCommand_CharQuestSkill, "@charquestskill", 60, atcommand_charquestskill },
- { AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill },
- { AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill },
- { AtCommand_SpiritBall, "@spiritball", 40, atcommand_spiritball },
- { AtCommand_Party, "@party", 1, atcommand_party },
- { AtCommand_Guild, "@guild", 50, atcommand_guild },
- { AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart },
- { AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend },
- { AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit },
- { AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch },
- { AtCommand_MapMove, "@mapmove", 40, atcommand_rura }, // /mm command
- { AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast }, // /b and /nb command
- { AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast }, // /lb and /nlb command
- { AtCommand_RecallAll, "@recallall", 80, atcommand_recallall },
- { AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset },
- { AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset },
- { AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb }, // admin command
- { AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb }, // admin command
- { AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb }, // admin command
-#ifndef TXT_ONLY
- { AtCommand_Rehash, "@rehash", 99, atcommand_rehash }, // admin command
-#else /* TXT_ONLY */
- { AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript }, // admin command
-#endif /* TXT_ONLY */
- { AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb }, // admin command
- { AtCommand_CharReset, "@charreset", 60, atcommand_charreset },
- { AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel },
- { AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint },
- { AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint },
- { AtCommand_CharZeny, "@charzeny", 60, atcommand_charzeny },
- { AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo },
- { AtCommand_Dye, "@dye", 40, atcommand_dye }, // by fritz
- { AtCommand_Dye, "@ccolor", 40, atcommand_dye }, // by fritz
- { AtCommand_Hstyle, "@hairstyle", 40, atcommand_hair_style }, // by fritz
- { AtCommand_Hstyle, "@hstyle", 40, atcommand_hair_style }, // by fritz
- { AtCommand_Hcolor, "@haircolor", 40, atcommand_hair_color }, // by fritz
- { AtCommand_Hcolor, "@hcolor", 40, atcommand_hair_color }, // by fritz
- { AtCommand_StatAll, "@statall", 60, atcommand_stat_all }, // by fritz
- { AtCommand_StatAll, "@statsall", 60, atcommand_stat_all },
- { AtCommand_StatAll, "@allstats", 60, atcommand_stat_all }, // by fritz
- { AtCommand_StatAll, "@allstat", 60, atcommand_stat_all }, // by fritz
- { AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex }, // by Yor
- { AtCommand_CharBlock, "@block", 60, atcommand_char_block }, // by Yor
- { AtCommand_CharBlock, "@charblock", 60, atcommand_char_block }, // by Yor
- { AtCommand_CharBan, "@ban", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@banish", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@charban", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharBan, "@charbanish", 60, atcommand_char_ban }, // by Yor
- { AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock }, // by Yor
- { AtCommand_CharUnBlock, "@charunblock", 60, atcommand_char_unblock }, // by Yor
- { AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@unbanish", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@charunban", 60, atcommand_char_unban }, // by Yor
- { AtCommand_CharUnBan, "@charunbanish", 60, atcommand_char_unban }, // by Yor
- { AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco }, // by Valaris
- { AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco }, // by Yor
- { AtCommand_GuildSpy, "@guildspy", 60, atcommand_guildspy }, // [Syrus22]
- { AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy }, // [Syrus22]
- { AtCommand_RepairAll, "@repairall", 60, atcommand_repairall }, // [Valaris]
- { AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall }, // by Yor
- { AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall }, // by Yor
-// { AtCommand_Nuke, "@nuke", 60, atcommand_nuke }, // [Valaris]
- { AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc }, // []
- { AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc }, // []
- { AtCommand_ServerTime, "@time", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@date", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@server_date", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@serverdate", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@server_time", 0, atcommand_servertime }, // by Yor
- { AtCommand_ServerTime, "@servertime", 0, atcommand_servertime }, // by Yor
- { AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem }, // by Yor
- { AtCommand_Jail, "@jail", 60, atcommand_jail }, // by Yor
- { AtCommand_UnJail, "@unjail", 60, atcommand_unjail }, // by Yor
- { AtCommand_UnJail, "@discharge", 60, atcommand_unjail }, // by Yor
- { AtCommand_Disguise, "@disguise", 20, atcommand_disguise }, // [Valaris]
- { AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise }, // by Yor
- { AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise }, // Kalaspuff
- { AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise }, // Kalaspuff
- { AtCommand_EMail, "@email", 0, atcommand_email }, // by Yor
- { AtCommand_Effect, "@effect", 40, atcommand_effect }, // by Apple
- { AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list }, // by Yor
- { AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list }, // by Yor
- { AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list }, // by Yor
- { AtCommand_Follow, "@follow", 10, atcommand_follow }, // by MouseJstr
- { AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp }, // by MouseJstr
- { AtCommand_SkillOn, "@skillon", 20, atcommand_skillon }, // by MouseJstr
- { AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff }, // by MouseJstr
- { AtCommand_Killer, "@killer", 60, atcommand_killer }, // by MouseJstr
- { AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove }, // by MouseJstr
- { AtCommand_Killable, "@killable", 40, atcommand_killable }, // by MouseJstr
- { AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable }, // by MouseJstr
- { AtCommand_Chareffect, "@chareffect", 40, atcommand_chareffect }, // MouseJstr
-/*
- { AtCommand_Chardye, "@chardye", 40, atcommand_chardye }, // MouseJstr
- { AtCommand_Charhairstyle, "@charhairstyle", 40, atcommand_charhairstyle }, // MouseJstr
- { AtCommand_Charhaircolor, "@charhaircolor", 40, atcommand_charhaircolor }, // MouseJstr
-*/
- { AtCommand_Dropall, "@dropall", 40, atcommand_dropall }, // MouseJstr
- { AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall }, // MouseJstr
- { AtCommand_Storeall, "@storeall", 40, atcommand_storeall }, // MouseJstr
- { AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall }, // MouseJstr
- { AtCommand_Skillid, "@skillid", 40, atcommand_skillid }, // MouseJstr
- { AtCommand_Useskill, "@useskill", 40, atcommand_useskill }, // MouseJstr
- { AtCommand_Rain, "@rain", 99, atcommand_rain },
- { AtCommand_Snow, "@snow", 99, atcommand_snow },
- { AtCommand_Sakura, "@sakura", 99, atcommand_sakura },
- { AtCommand_Fog, "@fog", 99, atcommand_fog },
- { AtCommand_Leaves, "@leaves", 99, atcommand_leaves },
-/*
- { AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle },
- { AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance },
- { AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect },
-*/
- { AtCommand_Summon, "@summon", 60, atcommand_summon },
- { AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl },
- { AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl },
- { AtCommand_Trade, "@trade", 60, atcommand_trade },
- { AtCommand_Send, "@send", 60, atcommand_send },
- { AtCommand_SetBattleFlag, "@setbattleflag", 60, atcommand_setbattleflag },
- { AtCommand_UnMute, "@unmute", 60, atcommand_unmute }, // [Valaris]
- { AtCommand_UpTime, "@uptime", 0, atcommand_uptime }, // by MC Cameri
- { AtCommand_ChangeSex, "@changesex", 1, atcommand_changesex }, // by MC Cameri
-
-#ifndef TXT_ONLY // sql-only commands
- { AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ListMail, "@listmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ListNewMail, "@listnewmail", 1, atcommand_listmail }, // [Valaris]
- { AtCommand_ReadMail, "@readmail", 1, atcommand_readmail }, // [Valaris]
- { AtCommand_DeleteMail, "@deletemail", 1, atcommand_readmail }, // [Valaris]
- { AtCommand_SendMail, "@sendmail", 1, atcommand_sendmail }, // [Valaris]
- { AtCommand_SendPriorityMail, "@sendprioritymail",80, atcommand_sendmail }, // [Valaris]
- { AtCommand_RefreshOnline, "@refreshonline", 99, atcommand_refreshonline }, // [Valaris]
-#endif /* TXT_ONLY */
-
-// add new commands before this line
- { AtCommand_Unknown, NULL, 1, NULL }
-};
-
-/*====================================================
- * This function return the name of the job (by [Yor])
- *----------------------------------------------------
- */
-char * job_name(int class) {
- switch (class) {
- case 0: return "Novice";
- case 1: return "Swordsman";
- case 2: return "Mage";
- case 3: return "Archer";
- case 4: return "Acolyte";
- case 5: return "Merchant";
- case 6: return "Thief";
- case 7: return "Knight";
- case 8: return "Priest";
- case 9: return "Wizard";
- case 10: return "Blacksmith";
- case 11: return "Hunter";
- case 12: return "Assassin";
- case 13: return "Knight 2";
- case 14: return "Crusader";
- case 15: return "Monk";
- case 16: return "Sage";
- case 17: return "Rogue";
- case 18: return "Alchemist";
- case 19: return "Bard";
- case 20: return "Dancer";
- case 21: return "Crusader 2";
- case 22: return "Wedding";
- case 23: return "Super Novice";
- case 4001: return "Novice High";
- case 4002: return "Swordsman High";
- case 4003: return "Mage High";
- case 4004: return "Archer High";
- case 4005: return "Acolyte High";
- case 4006: return "Merchant High";
- case 4007: return "Thief High";
- case 4008: return "Lord Knight";
- case 4009: return "High Priest";
- case 4010: return "High Wizard";
- case 4011: return "Whitesmith";
- case 4012: return "Sniper";
- case 4013: return "Assassin Cross";
- case 4014: return "Peko Knight";
- case 4015: return "Paladin";
- case 4016: return "Champion";
- case 4017: return "Professor";
- case 4018: return "Stalker";
- case 4019: return "Creator";
- case 4020: return "Clown";
- case 4021: return "Gypsy";
- case 4022: return "Peko Paladin";
- case 4023: return "Baby Novice";
- case 4024: return "Baby Swordsman";
- case 4025: return "Baby Mage";
- case 4026: return "Baby Archer";
- case 4027: return "Baby Acolyte";
- case 4028: return "Baby Merchant";
- case 4029: return "Baby Thief";
- case 4030: return "Baby Knight";
- case 4031: return "Baby Priest";
- case 4032: return "Baby Wizard";
- case 4033: return "Baby Blacksmith";
- case 4034: return "Baby Hunter";
- case 4035: return "Baby Assassin";
- case 4036: return "Baby Peco Knight";
- case 4037: return "Baby Crusader";
- case 4038: return "Baby Monk";
- case 4039: return "Baby Sage";
- case 4040: return "Baby Rogue";
- case 4041: return "Baby Alchemist";
- case 4042: return "Baby Bard";
- case 4043: return "Baby Dancer";
- case 4044: return "Baby Peco Crusader";
- case 4045: return "Super Baby";
- }
- return "Unknown Job";
-}
-
-//-----------------------------------------------------------
-// Return the message string of the specified number by [Yor]
-//-----------------------------------------------------------
-char * msg_txt(int msg_number) {
- if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0])) &&
- msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
- return msg_table[msg_number];
-
- return "??";
-}
-
-//------------------------------------------------------------
-// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
-//------------------------------------------------------------
-int e_mail_check(unsigned char *email) {
- char ch;
- unsigned 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;
-}
-
-/*==========================================
- * get_atcommand_level @ƒRƒ}ƒ“ƒh‚Ì•K—vƒŒƒxƒ‹‚ðŽæ“¾
- *------------------------------------------
- */
-int get_atcommand_level(const AtCommandType type) {
- int i;
-
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (atcommand_info[i].type == type)
- return atcommand_info[i].level;
-
- return 100; // 100: command can not be used
-}
-
-/*==========================================
- *is_atcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
- *------------------------------------------
- */
-AtCommandType
-is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl) {
- const char* str = message;
- int s_flag = 0;
- AtCommandInfo info;
- AtCommandType type;
-
- nullpo_retr(AtCommand_None, sd);
-
- if (!message || !*message)
- return AtCommand_None;
-
- memset(&info, 0, sizeof(info));
- str += strlen(sd->status.name);
- while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
- if (*str == ':')
- s_flag = 1;
- str++;
- }
- if (!*str)
- return AtCommand_None;
-
- type = atcommand(gmlvl > 0 ? gmlvl : pc_isGM(sd), str, &info);
- if (type != AtCommand_None) {
- char command[100];
- char output[200];
- const char* p = str;
- memset(command, '\0', sizeof(command));
- memset(output, '\0', sizeof(output));
- while (*p && !isspace(*p))
- p++;
- if (p - str >= sizeof(command)) // too long
- return AtCommand_Unknown;
- strncpy(command, str, p - str);
- while (isspace(*p))
- p++;
-
- if (type == AtCommand_Unknown || info.proc == NULL) {
- sprintf(output, msg_table[153], command); // %s is Unknown Command.
- clif_displaymessage(fd, output);
- } else {
- if (info.proc(fd, sd, command, p) != 0) {
- // Command can not be executed
- sprintf(output, msg_table[154], command); // %s failed.
- clif_displaymessage(fd, output);
- }
- }
-
- return info.type;
- }
-
- return AtCommand_None;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-AtCommandType atcommand(const int level, const char* message, struct AtCommandInfo* info) {
- char* p = (char *)message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary
-
- if (!info)
- return AtCommand_None;
- if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
- return AtCommand_None;
- if (!p || !*p) {
- fprintf(stderr, "at command message is empty\n");
- return AtCommand_None;
- }
-
- if (*p == command_symbol) { // check first char.
- char command[101];
- int i = 0;
- memset(info, 0, sizeof(AtCommandInfo));
- sscanf(p, "%100s", command);
- command[sizeof(command)-1] = '\0';
-
- while (atcommand_info[i].type != AtCommand_Unknown) {
- if (strcmpi(command+1, atcommand_info[i].command+1) == 0 && level >= atcommand_info[i].level) {
- p[0] = atcommand_info[i].command[0]; // set correct first symbol for after.
- break;
- }
- i++;
- }
-
- if (atcommand_info[i].type == AtCommand_Unknown) {
- // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
- if (level == 0)
- return AtCommand_None;
- else
- return AtCommand_Unknown;
- }
- memcpy(info, &atcommand_info[i], sizeof atcommand_info[i]);
- } else {
- return AtCommand_None;
- }
-
- return info->type;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int atkillmonster_sub(struct block_list *bl, va_list ap) {
- int flag = va_arg(ap, int);
-
- nullpo_retr(0, bl);
-
- if (flag)
- mob_damage(NULL, (struct mob_data *)bl, ((struct mob_data *)bl)->hp, 2);
- else
- mob_delete((struct mob_data *)bl);
-
- return 0;
-}
-
-#ifndef TXT_ONLY
-static int atkillnpc_sub(struct block_list *bl, va_list ap)
-{
- int flag = va_arg(ap,int);
-
- nullpo_retr(0, bl);
-
- npc_delete((struct npc_data *)bl);
-
- flag = 0;
-
- return 0;
-}
-
-void rehash( const int fd, struct map_session_data* sd )
-{
- int map_id = 0;
-
- int LOADED_MAPS = map_num;
-
- for (map_id = 0; map_id < LOADED_MAPS;map_id++) {
-
- if (map_id > LOADED_MAPS)
- break;
-
- map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, 0);
- map_foreachinarea(atkillnpc_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_NPC, 0);
- }
-}
-
-#endif /* not TXT_ONLY */
-/*==========================================
- * Read Message Data
- *------------------------------------------
- */
-int msg_config_read(const char *cfgName) {
- int msg_number;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("Messages file not found: %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, "import") == 0) {
- msg_config_read(w2);
- } else {
- msg_number = atoi(w1);
- if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0])))
- strcpy(msg_table[msg_number], w2);
- // printf("message #%d: '%s'.\n", msg_number, msg_table[msg_number]);
- }
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static AtCommandInfo* get_atcommandinfo_byname(const char* name) {
- int i;
-
- for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
- if (strcmpi(atcommand_info[i].command + 1, name) == 0)
- return &atcommand_info[i];
-
- return NULL;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_config_read(const char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- AtCommandInfo* p;
- FILE* fp;
-
- if ((fp = fopen(cfgName, "r")) == NULL) {
- printf("At commands 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_atcommandinfo_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)
- atcommand_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
- command_symbol = w2[0];
- }
- fclose(fp);
-
- return 0;
-}
-
-
-
-/*==========================================
-// @ command processing functions
- *------------------------------------------
- */
-
-/*==========================================
- * @send (used for testing packet sends from the client)
- *------------------------------------------
- */
-int atcommand_send(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int a = atoi(message);
- if (a)
- {
- unsigned char buf[1024];
- switch(a)
- {
- case 1:
- WBUFW(buf,0)=0x18d;
- case 2:
- WBUFW(buf,0)=0x18e;
- case 3:
- WBUFW(buf,0)=0x18f;
- case 4:
- WBUFW(buf,0)=0x190;
- }
-
-
- }
- return 0;
-}
-
-/*==========================================
- * @rura+
- *------------------------------------------
- */
-int atcommand_rurap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- char character[100];
- int x = 0, y = 0;
- struct map_session_data *pl_sd;
- int m;
-
- memset(map_name, '\0', sizeof(map_name));
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4) {
- clif_displaymessage(fd, "Usage: @charwarp/@rura+ <mapname> <x> <y> <char name>");
- return -1;
- }
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- m = map_mapname2mapid(map_name);
- if (m >= 0 && 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_name, 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).
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- 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;
-}
-
-// @rura
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_rura(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- int x = 0, y = 0;
- int m;
-
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d", map_name, &x, &y) < 1) {
- clif_displaymessage(fd, "Please, enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).");
- return -1;
- }
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- m = map_mapname2mapid(map_name);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to this map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
- if (pc_setpos(sd, map_name, x, y, 3) == 0)
- clif_displaymessage(fd, msg_table[0]); // Warped.
- else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_where(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- memset(character, '\0', sizeof character);
- if (sscanf(message, "%99[^\n]", character) < 1)
- return -1;
- if(strncmp(sd->status.name,character,24)==0)
- return -1;
-
- intif_where(sd->status.account_id,character);
-
- if ((pl_sd = map_nick2sd(character)) == NULL) {
- snprintf(output, sizeof output, "%s %d %d",
- sd->mapname, sd->bl.x, sd->bl.y);
- clif_displaymessage(fd, output);
- return -1;
- }
- snprintf(output, sizeof output, "%s %s %d %d",
- character, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_jumpto(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>).");
- return -1;
- }
-
- memset(character, '\0', sizeof character);
- if (sscanf(message, "%99[^\n]", character) < 1)
- return -1;
- if(strncmp(sd->status.name,character,24)==0)
- return -1;
-
- intif_jumpto(sd->status.account_id,character);
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to the map of this player.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
- pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- sprintf(output, msg_table[4], character); // Jump to %s
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_jump(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- int x = 0, y = 0;
-
- memset(output, '\0', sizeof(output));
-
- sscanf(message, "%d %d", &x, &y);
-
- if (x <= 0)
- x = rand() % 399 + 1;
- if (y <= 0)
- y = rand() % 399 + 1;
- if (x > 0 && x < 400 && y > 0 && y < 400) {
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to your actual map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
- pc_setpos(sd, sd->mapname, x, y, 3);
- sprintf(output, msg_table[5], x, y); // Jump to %d %d
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
-
- memset(output, '\0', sizeof(output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- else
- sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, output);
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
-
- memset(output, '\0', sizeof(output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
- else
- sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
- clif_displaymessage(fd, output);
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_who3(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
- struct guild *g;
- struct party *p;
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(output, '\0', sizeof(output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
- else
- sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
- clif_displaymessage(fd, output);
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id;
- char map_name[100];
-
- memset(output, '\0', sizeof(output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- else
- sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id = 0;
- char map_name[100];
-
- memset(output, '\0', sizeof(output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
- else
- sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
- clif_displaymessage(fd, output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whomap3(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i, count;
- int pl_GM_level, GM_level;
- int map_id = 0;
- char map_name[100];
- struct guild *g;
- struct party *p;
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(output, '\0', sizeof(output));
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message)
- map_id = sd->bl.m;
- else {
- sscanf(message, "%99s", map_name);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- if (pl_sd->bl.m == map_id) {
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- if (pl_GM_level > 0)
- sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
- else
- sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
- clif_displaymessage(fd, output);
- count++;
- }
- }
- }
- }
-
- if (count == 0)
- sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
- else if (count == 1)
- sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
- else {
- sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
- }
- clif_displaymessage(fd, output);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_whogm(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char temp0[100];
- char temp1[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i, j, count;
- int pl_GM_level, GM_level;
- char match_text[100];
- char player_name[24];
- struct guild *g;
- struct party *p;
-
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
- memset(output, '\0', sizeof(output));
- memset(match_text, '\0', sizeof(match_text));
- memset(player_name, '\0', sizeof(player_name));
-
- if (sscanf(message, "%99[^\n]", match_text) < 1)
- strcpy(match_text, "");
- for (j = 0; match_text[j]; j++)
- match_text[j] = tolower(match_text[j]);
-
- count = 0;
- GM_level = pc_isGM(sd);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_GM_level = pc_isGM(pl_sd);
- if (pl_GM_level > 0) {
- if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, 24);
- for (j = 0; player_name[j]; j++)
- player_name[j] = tolower(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, output);
- sprintf(output, " BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
- clif_displaymessage(fd, output);
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->name);
- sprintf(output, " Party: '%s' | Guild: '%s'", temp0, temp1);
- clif_displaymessage(fd, output);
- count++;
- }
- }
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[150]); // No GM found.
- else if (count == 1)
- clif_displaymessage(fd, msg_table[151]); // 1 GM found.
- else {
- sprintf(output, msg_table[152], count); // %d GMs found.
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_save(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- pc_setsavepoint(sd, sd->mapname, sd->bl.x, sd->bl.y);
- if (sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id, &sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- clif_displaymessage(fd, msg_table[6]); // Character data respawn point saved.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_load(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int m;
-
- m = map_mapname2mapid(sd->status.save_point.map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to your save map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
-
- pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 0);
- clif_displaymessage(fd, msg_table[7]); // Warping to respawn point.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_speed(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- int speed;
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message) {
- sprintf(output, "Please, enter a speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- speed = atoi(message);
- if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) {
- sd->speed = speed;
- //sd->walktimer = x;
- //‚±‚Ì•¶‚ð’ljÁ by ‚ê‚
- clif_updatestatus(sd, SP_SPEED);
- clif_displaymessage(fd, msg_table[8]); // Speed changed.
- } else {
- sprintf(output, "Please, enter a valid speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_storage(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- storage_storageopen(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guildstorage(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->status.guild_id > 0)
- storage_guild_storageopen(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_option(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int param1 = 0, param2 = 0, param3 = 0;
-
- if (!message || !*message || sscanf(message, "%d %d %d", &param1, &param2, &param3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) {
- clif_displaymessage(fd, "Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>).");
- return -1;
- }
-
- sd->opt1 = param1;
- sd->opt2 = param2;
- if (!(sd->status.option & CART_MASK) && param3 & CART_MASK) {
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd, SP_CARTINFO);
- }
- sd->status.option = param3;
- // fix pecopeco display
- if (sd->status.class == 13 || sd->status.class == 21 || sd->status.class == 4014 || sd->status.class == 4022) {
- if (!pc_isriding(sd)) { // sd have the new value...
- if (sd->status.class == 13)
- sd->status.class = sd->view_class = 7;
- else if (sd->status.class == 21)
- sd->status.class = sd->view_class = 14;
- else if (sd->status.class == 4014)
- sd->status.class = sd->view_class = 4008;
- else if (sd->status.class == 4022)
- sd->status.class = sd->view_class = 4015;
- }
- } else {
- if (pc_isriding(sd)) { // sd have the new value...
- if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- sd->status.option &= ~0x0020;
- } else {
- if (sd->status.class == 7)
- sd->status.class = sd->view_class = 13;
- else if (sd->status.class == 14)
- sd->status.class = sd->view_class = 21;
- else if (sd->status.class == 4008)
- sd->status.class = sd->view_class = 4014;
- else if (sd->status.class == 4015)
- sd->status.class = sd->view_class = 4022;
- else
- sd->status.option &= ~0x0020;
- }
- }
- }
-
- clif_changeoption(&sd->bl);
- pc_calcstatus(sd, 0);
- clif_displaymessage(fd, msg_table[9]); // Options changed.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_hide(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->status.option & OPTION_HIDE) {
- sd->status.option &= ~OPTION_HIDE;
- clif_displaymessage(fd, msg_table[10]); // Invisible: Off
- } else {
- sd->status.option |= OPTION_HIDE;
- clif_displaymessage(fd, msg_table[11]); // Invisible: On
- }
- clif_changeoption(&sd->bl);
-
- return 0;
-}
-
-/*==========================================
- * “]E‚·‚é upper‚ðŽw’è‚·‚é‚Æ“]¶‚â—{Žq‚É‚à‚È‚ê‚é
- *------------------------------------------
- */
-int atcommand_jobchange(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int job = 0, upper = -1;
-
- if (!message || !*message || sscanf(message, "%d %d", &job, &upper) < 1) {
- clif_displaymessage(fd, "Please, enter job ID (usage: @job/@jobchange <job ID>).");
- return -1;
- }
-
- if (job == 37 ||job == 45)
- return 0;
-
- if ((job >= 0 && job < MAX_PC_CLASS)) {
-
- // fix pecopeco display
- if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
- if (pc_isriding(sd)) {
- if (sd->status.class == 13)
- sd->status.class = sd->view_class = 7;
- if (sd->status.class == 21)
- sd->status.class = sd->view_class = 14;
- if (sd->status.class == 4014)
- sd->status.class = sd->view_class = 4008;
- if (sd->status.class == 4022)
- sd->status.class = sd->view_class = 4015;
- sd->status.option &= ~0x0020;
- clif_changeoption(&sd->bl);
- pc_calcstatus(sd, 0);
- }
- } else {
- if (!pc_isriding(sd)) {
- if (job == 13)
- job = 7;
- if (job == 21)
- job = 14;
- if (job == 4014)
- job = 4008;
- if (job == 4022)
- job = 4015;
- }
- }
-
- if (pc_jobchange(sd, job, upper) == 0)
- clif_displaymessage(fd, msg_table[12]); // Your job has been changed.
- else {
- clif_displaymessage(fd, msg_table[155]); // Impossible to change your job.
- return -1;
- }
- } else {
- clif_displaymessage(fd, "Please, enter a valid job ID (usage: @job/@jobchange <job ID>).");
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_die(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- pc_damage(NULL, sd, sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[13]); // A pity! You've died.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @kill <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(fd, msg_table[14]); // Character killed.
- } 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 atcommand_alive(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- pc_setstand(sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_updatestatus(sd, SP_HP);
- clif_updatestatus(sd, SP_SP);
- clif_resurrection(&sd->bl, 1);
- clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kami(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @kami <message>).");
- return -1;
- }
-
- sscanf(message, "%199[^\n]", output);
- intif_GMmessage(output, strlen(output) + 1, (*(command + 5) == 'b') ? 0x10 : 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_heal(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hp = 0, sp = 0; // [Valaris] thanks to fov
-
- sscanf(message, "%d %d", &hp, &sp);
-
- if (hp == 0 && sp == 0) {
- hp = sd->status.max_hp - sd->status.hp;
- sp = sd->status.max_sp - sd->status.sp;
- } else {
- if (hp > 0 && (hp > sd->status.max_hp || hp > (sd->status.max_hp - sd->status.hp))) // fix positiv overflow
- hp = sd->status.max_hp - sd->status.hp;
- else if (hp < 0 && (hp < -sd->status.max_hp || hp < (1 - sd->status.hp))) // fix negativ overflow
- hp = 1 - sd->status.hp;
- if (sp > 0 && (sp > sd->status.max_sp || sp > (sd->status.max_sp - sd->status.sp))) // fix positiv overflow
- sp = sd->status.max_sp - sd->status.sp;
- else if (sp < 0 && (sp < -sd->status.max_sp || sp < (1 - sd->status.sp))) // fix negativ overflow
- sp = 1 - sd->status.sp;
- }
-
- if (hp > 0) // display like heal
- clif_heal(fd, SP_HP, hp);
- else if (hp < 0) // display like damage
- clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0);
- if (sp > 0) // no display when we lost SP
- clif_heal(fd, SP_SP, sp);
-
- if (hp != 0 || sp != 0) {
- pc_heal(sd, hp, sp);
- if (hp >= 0 && sp >= 0)
- clif_displaymessage(fd, msg_table[17]); // HP, SP recovered.
- else
- clif_displaymessage(fd, msg_table[156]); // HP or/and SP modified.
- } else {
- clif_displaymessage(fd, msg_table[157]); // HP and SP are already with the good value.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @item command (usage: @item <name/id_of_item> <quantity>) (modified by [Yor] for pet_egg)
- *------------------------------------------
- */
-int atcommand_item(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- int number = 0, item_id, flag;
- struct item item_tmp;
- struct item_data *item_data;
- int get_count, i, pet_id;
-
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d", item_name, &number) < 1) {
- clif_displaymessage(fd, "Please, enter an item name/id (usage: @item <item name or ID> [quantity]).");
- 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;
- }
- for (i = 0; i < number; i += get_count) {
- // if pet egg
- if (pet_id >= 0) {
- sd->catch_target_class = pet_db[pet_id].class;
- intif_create_pet(sd->status.account_id, sd->status.char_id,
- pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
- pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- // if not pet egg
- } else {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- 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);
- }
- }
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_item2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct item item_tmp;
- struct item_data *item_data;
- char item_name[100];
- int item_id, number = 0;
- int identify = 0, refine = 0, attr = 0;
- int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
- int flag;
- int loop, get_count, i;
-
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9) {
- clif_displaymessage(fd, "Please, enter all informations (usage: @item2 <item name or ID> <quantity>");
- clif_displaymessage(fd, " <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4>).");
- 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) {
- loop = 1;
- get_count = number;
- if (item_data->type == 4 || item_data->type == 5 ||
- item_data->type == 7 || item_data->type == 8) {
- loop = number;
- get_count = 1;
- if (item_data->type == 7) {
- identify = 1;
- refine = 0;
- }
- if (item_data->type == 8)
- refine = 0;
- if (refine > 10)
- refine = 10;
- } else {
- identify = 1;
- refine = attr = 0;
- }
- for (i = 0; i < loop; i++) {
- memset(&item_tmp, 0, sizeof(item_tmp));
- item_tmp.nameid = item_id;
- item_tmp.identify = identify;
- item_tmp.refine = refine;
- item_tmp.attribute = attr;
- item_tmp.card[0] = c1;
- item_tmp.card[1] = c2;
- item_tmp.card[2] = c3;
- item_tmp.card[3] = c4;
- if ((flag = pc_additem(sd, &item_tmp, get_count)))
- clif_additem(sd, 0, 0, flag);
- }
- clif_displaymessage(fd, msg_table[18]); // Item created.
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_itemreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
-
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount && sd->status.inventory[i].equip == 0)
- pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
- }
- clif_displaymessage(fd, msg_table[20]); // All of your items have been removed.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_itemcheck(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- pc_checkitem(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_baselevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int level, i;
-
- if (!message || !*message || (level = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement (usage: @lvup/@blevel/@baselvlup <number of levels>).");
- return -1;
- }
-
- if (level > 0) {
- if (sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris
- clif_displaymessage(fd, msg_table[47]); // Base level can't go any higher.
- return -1;
- } // End Addition
- if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow
- level = battle_config.maximum_level - sd->status.base_level;
- for (i = 1; i <= level; i++)
- sd->status.status_point += (sd->status.base_level + i + 14) / 5;
- sd->status.base_level += level;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- clif_updatestatus(sd, SP_STATUSPOINT);
- pc_calcstatus(sd, 0);
- pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- clif_misceffect(&sd->bl, 0);
- clif_displaymessage(fd, msg_table[21]); // Base level raised.
- } else {
- if (sd->status.base_level == 1) {
- clif_displaymessage(fd, msg_table[158]); // Base level can't go any lower.
- return -1;
- }
- if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow
- level = 1 - sd->status.base_level;
- if (sd->status.status_point > 0) {
- for (i = 0; i > level; i--)
- sd->status.status_point -= (sd->status.base_level + i + 14) / 5;
- if (sd->status.status_point < 0)
- sd->status.status_point = 0;
- clif_updatestatus(sd, SP_STATUSPOINT);
- } // to add: remove status points from stats
- sd->status.base_level += level;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- pc_calcstatus(sd, 0);
- clif_displaymessage(fd, msg_table[22]); // Base level lowered.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_joblevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int up_level = 50, level;
-
- if (!message || !*message || (level = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement (usage: @joblvup/@jlevel/@joblvlup <number of levels>).");
- return -1;
- }
-
- if (sd->status.class == 0 || sd->status.class == 4001)
- up_level -= 40;
- else if ((sd->status.class > 4007 && sd->status.class < 4024) || sd->status.class == 23)
- up_level += 20;
-
- if (level > 0) {
- if (sd->status.job_level == up_level) {
- clif_displaymessage(fd, msg_table[23]); // Job level can't go any higher.
- return -1;
- }
- if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow
- level = up_level - sd->status.job_level;
- sd->status.job_level += level;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- sd->status.skill_point += level;
- clif_updatestatus(sd, SP_SKILLPOINT);
- pc_calcstatus(sd, 0);
- clif_misceffect(&sd->bl, 1);
- clif_displaymessage(fd, msg_table[24]); // Job level raised.
- } else {
- if (sd->status.job_level == 1) {
- clif_displaymessage(fd, msg_table[159]); // Job level can't go any lower.
- return -1;
- }
- if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow
- level = 1 - sd->status.job_level;
- sd->status.job_level += level;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- if (sd->status.skill_point > 0) {
- sd->status.skill_point += level;
- if (sd->status.skill_point < 0)
- sd->status.skill_point = 0;
- clif_updatestatus(sd, SP_SKILLPOINT);
- } // to add: remove status points from skills
- pc_calcstatus(sd, 0);
- clif_displaymessage(fd, msg_table[25]); // Job level lowered.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_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;
-
- memset(buf, '\0', sizeof(buf));
-
- if ((fp = fopen(help_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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gm(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char password[100];
-
- memset(password, '\0', sizeof(password));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", password) < 1) {
- clif_displaymessage(fd, "Please, enter a password (usage: @gm <password>).");
- return -1;
- }
-
- if (pc_isGM(sd)) { // a GM can not use this function. only a normal player (become gm is not for gm!)
- clif_displaymessage(fd, msg_table[50]); // You already have some GM powers.
- return -1;
- } else
- chrif_changegm(sd->status.account_id, password, strlen(password) + 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pvpoff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
- clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
- return -1;
- }
-
- if (map[sd->bl.m].flag.pvp) {
- map[sd->bl.m].flag.pvp = 0;
- clif_send0199(sd->bl.m, 0);
- for (i = 0; i < fd_max; i++) { //l”•ªƒ‹[ƒv
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- if (sd->bl.m == pl_sd->bl.m) {
- clif_pvpset(pl_sd, 0, 0, 2);
- if (pl_sd->pvp_timer != -1) {
- delete_timer(pl_sd->pvp_timer, pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
- }
- }
- }
- clif_displaymessage(fd, msg_table[31]); // PvP: Off.
- } else {
- clif_displaymessage(fd, msg_table[160]); // PvP is already Off.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pvpon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
- clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
- return -1;
- }
-
- if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) {
- map[sd->bl.m].flag.pvp = 1;
- clif_send0199(sd->bl.m, 1);
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
- pl_sd->pvp_timer = add_timer(gettick() + 200,
- pc_calc_pvprank_timer, pl_sd->bl.id, 0);
- pl_sd->pvp_rank = 0;
- pl_sd->pvp_lastusers = 0;
- pl_sd->pvp_point = 5;
- }
- }
- }
- clif_displaymessage(fd, msg_table[32]); // PvP: On.
- } else {
- clif_displaymessage(fd, msg_table[161]); // PvP is already On.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgoff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (map[sd->bl.m].flag.gvg) {
- map[sd->bl.m].flag.gvg = 0;
- clif_send0199(sd->bl.m, 0);
- clif_displaymessage(fd, msg_table[33]); // GvG: Off.
- } else {
- clif_displaymessage(fd, msg_table[162]); // GvG is already Off.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gvgon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (!map[sd->bl.m].flag.gvg) {
- map[sd->bl.m].flag.gvg = 1;
- clif_send0199(sd->bl.m, 3);
- clif_displaymessage(fd, msg_table[34]); // GvG: On.
- } else {
- clif_displaymessage(fd, msg_table[163]); // GvG is already On.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_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;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d %d %d", &hair_style, &hair_color, &cloth_color) < 1) {
- sprintf(output, "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).",
- MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- 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) {
- //•ž‚ÌF•ÏX
- if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
- //•ž‚ÌF–¢ŽÀ‘•E‚Ì”»’è
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR, hair_style);
- pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
- pc_changelook(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;
- }
-
- return 0;
-}
-
-/*==========================================
- * @dye && @ccolor
- *------------------------------------------
- */
-int atcommand_dye(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int cloth_color = 0;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1) {
- sprintf(output, "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).", MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
- if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(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;
- }
-
- return 0;
-}
-
-/*==========================================
- * @chardye by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_chardye(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- return 0;
-}
-
-/*==========================================
- * @hairstyle && @hstyle
- *------------------------------------------
- */
-int atcommand_hair_style(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int hair_style = 0;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d", &hair_style) < 1) {
- sprintf(output, "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).", MIN_HAIR_STYLE, MAX_HAIR_STYLE);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) {
- if (hair_style != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR, hair_style);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charhairstyle by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_charhairstyle(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- return 0;
-}
-
-/*==========================================
- * @haircolor && @hcolor
- *------------------------------------------
- */
-int atcommand_hair_color(const int fd, struct map_session_data* sd, const char* command, const char* message)
-{
- int hair_color = 0;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d", &hair_color) < 1) {
- sprintf(output, "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).", MIN_HAIR_COLOR, MAX_HAIR_COLOR);
- clif_displaymessage(fd, output);
- return -1;
- }
-
- if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) {
- if (hair_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
- clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
- return -1;
- } else {
- pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
- clif_displaymessage(fd, msg_table[36]); // Appearence changed.
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @charhaircolor by [MouseJstr]
- *------------------------------------------
- */
-int
-atcommand_charhaircolor(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- return 0;
-}
-
-/*==========================================
- * @go [city_number/city_name]: improved by [yor] to add city names and help
- *------------------------------------------
- */
-int atcommand_go(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- int town;
- char map_name[100];
- char output[200];
- int m;
-
- struct { char map[16]; int x, y; } data[] = {
- { "prontera.gat", 156, 191 }, // 0=Prontera
- { "morocc.gat", 156, 93 }, // 1=Morroc
- { "geffen.gat", 119, 59 }, // 2=Geffen
- { "payon.gat", 162, 233 }, // 3=Payon
- { "alberta.gat", 192, 147 }, // 4=Alberta
- { "izlude.gat", 128, 114 }, // 5=Izlude
- { "aldebaran.gat",140, 131 }, // 6=Al de Baran
- { "xmas.gat", 147, 134 }, // 7=Lutie
- { "comodo.gat", 209, 143 }, // 8=Comodo
- { "yuno.gat", 157, 51 }, // 9=Yuno
- { "amatsu.gat", 198, 84 }, // 10=Amatsu
- { "gonryun.gat", 160, 120 }, // 11=Gon Ryun
- { "umbala.gat", 89, 157 }, // 12=Umbala
- { "niflheim.gat", 21, 153 }, // 13=Niflheim
- { "louyang.gat", 217, 40 }, // 14=Lou Yang
- { "new_1-1.gat", 53, 111 }, // 15=Start point
- { "sec_pri.gat", 23, 61 }, // 16=Prison
- };
-
- memset(map_name, '\0', sizeof(map_name));
- memset(output, '\0', sizeof(output));
-
- // get the number
- town = atoi(message);
-
- // if no value, display all value
- if (!message || !*message || sscanf(message, "%99s", map_name) < 1 || town < -3 || town >= (int)(sizeof(data) / sizeof(data[0]))) {
- clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
- clif_displaymessage(fd, msg_table[82]); // Please, use one of this number/name:
- clif_displaymessage(fd, "-3=(Memo point 2) 4=Alberta 11=Gon Ryun");
- clif_displaymessage(fd, "-2=(Memo point 1) 5=Izlude 12=Umbala");
- clif_displaymessage(fd, "-1=(Memo point 0) 6=Al de Baran 13=Niflheim");
- clif_displaymessage(fd, " 0=Prontera 7=Lutie 14=Lou Yang");
- clif_displaymessage(fd, " 1=Morroc 8=Comodo 15=Start point");
- clif_displaymessage(fd, " 2=Geffen 9=Yuno 16=Prison");
- clif_displaymessage(fd, " 3=Payon 10=Amatsu");
- return -1;
- } else {
- // get possible name of the city and add .gat if not in the name
- map_name[sizeof(map_name)-1] = '\0';
- for (i = 0; map_name[i]; i++)
- map_name[i] = tolower(map_name[i]);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too)
- if (strncmp(map_name, "prontera.gat", 3) == 0) { // 3 first characters
- town = 0;
- } else if (strncmp(map_name, "morocc.gat", 3) == 0) { // 3 first characters
- town = 1;
- } else if (strncmp(map_name, "geffen.gat", 3) == 0) { // 3 first characters
- town = 2;
- } else if (strncmp(map_name, "payon.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "paion.gat", 3) == 0) { // writing error (3 first characters)
- town = 3;
- } else if (strncmp(map_name, "alberta.gat", 3) == 0) { // 3 first characters
- town = 4;
- } else if (strncmp(map_name, "izlude.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "islude.gat", 3) == 0) { // writing error (3 first characters)
- town = 5;
- } else if (strncmp(map_name, "aldebaran.gat", 3) == 0 || // 3 first characters
- strcmp(map_name, "al.gat") == 0) { // al (de baran)
- town = 6;
- } else if (strncmp(map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters)
- strcmp(map_name, "christmas.gat") == 0 || // name of the symbol
- strncmp(map_name, "xmas.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "x-mas.gat", 3) == 0) { // writing error (3 first characters)
- town = 7;
- } else if (strncmp(map_name, "comodo.gat", 3) == 0) { // 3 first characters
- town = 8;
- } else if (strncmp(map_name, "yuno.gat", 3) == 0) { // 3 first characters
- town = 9;
- } else if (strncmp(map_name, "amatsu.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "ammatsu.gat", 3) == 0) { // writing error (3 first characters)
- town = 10;
- } else if (strncmp(map_name, "gonryun.gat", 3) == 0) { // 3 first characters
- town = 11;
- } else if (strncmp(map_name, "umbala.gat", 3) == 0) { // 3 first characters
- town = 12;
- } else if (strncmp(map_name, "niflheim.gat", 3) == 0) { // 3 first characters
- town = 13;
- } else if (strncmp(map_name, "louyang.gat", 3) == 0) { // 3 first characters
- town = 14;
- } else if (strncmp(map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies")
- strncmp(map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp(map_name, "begining.gat", 3) == 0) { // name of the position (3 first characters)
- town = 15;
- } else if (strncmp(map_name, "sec_pri.gat", 3) == 0 || // 3 first characters
- strncmp(map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters)
- strncmp(map_name, "jails.gat", 3) == 0) { // name of the position
- town = 16;
- }
-
- if (town >= -3 && town <= -1) {
- if (sd->status.memo_point[-town-1].map[0]) {
- m = map_mapname2mapid(sd->status.memo_point[-town-1].map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to this memo map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
- if (pc_setpos(sd, sd->status.memo_point[-town-1].map, sd->status.memo_point[-town-1].x, sd->status.memo_point[-town-1].y, 3) == 0) {
- clif_displaymessage(fd, msg_table[0]); // Warped.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else {
- sprintf(output, msg_table[164], -town-1); // Your memo point #%d doesn't exist.
- clif_displaymessage(fd, output);
- return -1;
- }
- } else if (town >= 0 && town < (int)(sizeof(data) / sizeof(data[0]))) {
- m = map_mapname2mapid(data[town].map);
- if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you to this destination map.");
- return -1;
- }
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
- return -1;
- }
- if (pc_setpos(sd, data[town].map, data[town].x, data[town].y, 3) == 0) {
- clif_displaymessage(fd, msg_table[0]); // Warped.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
- } else { // if you arrive here, you have an error in town variable when reading of names
- clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_monster(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[100];
- char monster[100];
- char output[200];
- int mob_id;
- int number = 0;
- int x = 0, y = 0;
- int count;
- int i, j, k;
- int mx, my, range;
-
- memset(name, '\0', sizeof(name));
- memset(monster, '\0', sizeof(monster));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message ||
- (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %99s %d %d %d", name, monster, &number, &x, &y) < 2)) {
- clif_displaymessage(fd, msg_table[80]); // Give a display name and monster name/id please.
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(monster));
-
- if (mob_id == 0) {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- if (battle_config.etc_log)
- printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
-
- count = 0;
- range = sqrt(number) / 2;
- range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
- for (i = 0; i < number; i++) {
- j = 0;
- k = 0;
- while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
- if (x <= 0)
- mx = sd->bl.x + (rand() % range - (range / 2));
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % range - (range / 2));
- else
- my = y;
- k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
- }
- count += (k != 0) ? 1 : 0;
- }
-
- if (count != 0)
- if (number == count)
- clif_displaymessage(fd, msg_table[39]); // All monster summoned!
- else {
- sprintf(output, msg_table[240], count); // %d monster(s) summoned!
- clif_displaymessage(fd, output);
- }
- else {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_spawn(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message) {
- char name[100];
- char monster[100];
- char output[200];
- int mob_id;
- int number = 0;
- int x = 0, y = 0;
- int count;
- int i, j, k;
- int mx, my, range;
-
- memset(name, '\0', sizeof(name));
- memset(monster, '\0', sizeof(monster));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message ||
- (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
- sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
- sscanf(message, "%99s %d %99s %d %d", monster, &number, name, &x, &y) < 1)) {
- clif_displaymessage(fd, msg_table[143]); // Give a monster name/id please.
- return -1;
- }
-
- // If monster identifier/name argument is a name
- if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = mobdb_checkid(atoi(monster));
-
- if (mob_id == 0) {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- if (mob_id == 1288) {
- clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
- return -1;
- }
-
- if (number <= 0)
- number = 1;
-
- if (strlen(name) < 1)
- strcpy(name, "--ja--");
-
- // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
- if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
- number = battle_config.atc_spawn_quantity_limit;
-
- if (battle_config.etc_log)
- printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
-
- count = 0;
- range = sqrt(number) / 2;
- range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
- for (i = 0; i < number; i++) {
- j = 0;
- k = 0;
- while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
- if (x <= 0)
- mx = sd->bl.x + (rand() % range - (range / 2));
- else
- mx = x;
- if (y <= 0)
- my = sd->bl.y + (rand() % range - (range / 2));
- else
- my = y;
- k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
- }
- count += (k != 0) ? 1 : 0;
- }
-
- if (count != 0)
- if (number == count)
- clif_displaymessage(fd, msg_table[39]); // All monster summoned!
- else {
- sprintf(output, msg_table[240], count); // %d monster(s) summoned!
- clif_displaymessage(fd, output);
- }
- else {
- clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void atcommand_killmonster_sub(
- const int fd, struct map_session_data* sd, const char* message,
- const int drop)
-{
- int map_id;
- char map_name[100];
-
- memset(map_name, '\0', sizeof(map_name));
-
- if (!message || !*message || sscanf(message, "%99s", map_name) < 1)
- map_id = sd->bl.m;
- else {
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
- if ((map_id = map_mapname2mapid(map_name)) < 0)
- map_id = sd->bl.m;
- }
-
- map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, drop);
-
- clif_displaymessage(fd, msg_table[165]); // All monsters killed!
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_killmonster(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- atcommand_killmonster_sub(fd, sd, message, 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_killmonster2(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- atcommand_killmonster_sub(fd, sd, message, 0);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_refine(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, position = 0, refine = 0, current_position, final_refine;
- int count;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d %d", &position, &refine) < 2) {
- clif_displaymessage(fd, "Please, enter a position and a amount (usage: @refine <equip position> <+/- amount>).");
- return -1;
- }
-
- if (refine < -10)
- refine = -10;
- else if (refine > 10)
- refine = 10;
- else if (refine == 0)
- refine = 1;
-
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && // ŠY“–ŒÂŠ‚Ì‘•”õ‚ð¸˜B‚·‚é
- (sd->status.inventory[i].equip & position ||
- (sd->status.inventory[i].equip && !position))) {
- final_refine = sd->status.inventory[i].refine + refine;
- if (final_refine > 10)
- final_refine = 10;
- else if (final_refine < 0)
- final_refine = 0;
- if (sd->status.inventory[i].refine != final_refine) {
- sd->status.inventory[i].refine = final_refine;
- current_position = sd->status.inventory[i].equip;
- pc_unequipitem(sd, i, 0);
- clif_refine(fd, sd, 0, i, sd->status.inventory[i].refine);
- clif_delitem(sd, i, 1);
- clif_additem(sd, i, 1, 0);
- pc_equipitem(sd, i, current_position);
- clif_misceffect((struct block_list*)&sd->bl, 3);
- count++;
- }
- }
- }
-
- if (count == 0)
- clif_displaymessage(fd, msg_table[166]); // No item has been refined!
- else if (count == 1)
- clif_displaymessage(fd, msg_table[167]); // 1 item has been refined!
- else {
- sprintf(output, msg_table[168], count); // %d items have been refined!
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_produce(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- int item_id, attribute = 0, star = 0;
- int flag = 0;
- struct item_data *item_data;
- struct item tmp_item;
- char output[200];
-
- memset(output, '\0', sizeof(output));
- memset(item_name, '\0', sizeof(item_name));
-
- if (!message || !*message || sscanf(message, "%99s %d %d", item_name, &attribute, &star) < 1) {
- clif_displaymessage(fd, "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>).");
- return -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 (itemdb_exists(item_id) &&
- (item_id <= 500 || item_id > 1099) &&
- (item_id < 4001 || item_id > 4148) &&
- (item_id < 7001 || item_id > 10019) &&
- itemdb_isequip(item_id)) {
- if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE)
- attribute = ATTRIBUTE_NORMAL;
- if (star < MIN_STAR || star > MAX_STAR)
- star = 0;
- memset(&tmp_item, 0, sizeof tmp_item);
- tmp_item.nameid = item_id;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0x00ff;
- tmp_item.card[1] = ((star * 5) << 8) + attribute;
- *((unsigned long *)(&tmp_item.card[2])) = sd->char_id;
- clif_produceeffect(sd, 0, item_id); // »‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg
- clif_misceffect(&sd->bl, 3); // ‘¼l‚ɂଌ÷‚ð’Ê’m
- if ((flag = pc_additem(sd, &tmp_item, 1)))
- clif_additem(sd, 0, 0, flag);
- } else {
- if (battle_config.error_log)
- printf("@produce NOT WEAPON [%d]\n", item_id);
- if (item_id != 0 && itemdb_exists(item_id))
- sprintf(output, msg_table[169], item_id, item_data->name); // This item (%d: '%s') is not an equipment.
- else
- sprintf(output, msg_table[170]); // This item is not an equipment.
- clif_displaymessage(fd, output);
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Sub-function to display actual memo points
- *------------------------------------------
- */
-void atcommand_memo_sub(struct map_session_data* sd) {
- int i;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- clif_displaymessage(sd->fd, "Your actual memo positions are (except respawn point):");
- for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++) {
- if (sd->status.memo_point[i].map[0])
- sprintf(output, "%d - %s (%d,%d)", i, sd->status.memo_point[i].map, sd->status.memo_point[i].x, sd->status.memo_point[i].y);
- else
- sprintf(output, msg_table[171], i); // %d - void
- clif_displaymessage(sd->fd, output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_memo(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int position = 0;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d", &position) < 1)
- atcommand_memo_sub(sd);
- else {
- if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) {
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to memo this map.");
- return -1;
- }
- if (sd->status.memo_point[position].map[0]) {
- sprintf(output, msg_table[172], position, sd->status.memo_point[position].map, sd->status.memo_point[position].x, sd->status.memo_point[position].y); // You replace previous memo position %d - %s (%d,%d).
- clif_displaymessage(fd, output);
- }
- memcpy(sd->status.memo_point[position].map, map[sd->bl.m].name, 24);
- sd->status.memo_point[position].x = sd->bl.x;
- sd->status.memo_point[position].y = sd->bl.y;
- clif_skill_memo(sd, 0);
- if (pc_checkskill(sd, AL_WARP) <= (position + 1))
- clif_displaymessage(fd, msg_table[173]); // Note: you don't have the 'Warp' skill level to use it.
- atcommand_memo_sub(sd);
- } else {
- sprintf(output, "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).", MIN_PORTAL_MEMO, MAX_PORTAL_MEMO);
- clif_displaymessage(fd, output);
- atcommand_memo_sub(sd);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_gat(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- int y;
-
- memset(output, '\0', sizeof(output));
-
- for (y = 2; y >= -2; y--) {
- sprintf(output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X",
- map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y,
- map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y),
- map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y),
- map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y),
- map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y),
- map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y));
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_packet(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int x = 0, y = 0;
-
- if (!message || !*message || sscanf(message, "%d %d", &x, &y) < 2) {
- clif_displaymessage(fd, "Please, enter a status type/flag (usage: @packet <status type> <flag>).");
- return -1;
- }
-
- clif_status_change(&sd->bl, x, y);
-
- return 0;
-}
-
-/*==========================================
- * @stpoint (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_statuspoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int point, new_status_point;
-
- if (!message || !*message || (point = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a number (usage: @stpoint <number of points>).");
- return -1;
- }
-
- new_status_point = (int)sd->status.status_point + point;
- if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
- new_status_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
- new_status_point = 0;
-
- if (new_status_point != (int)sd->status.status_point) {
- sd->status.status_point = (short)new_status_point;
- clif_updatestatus(sd, SP_STATUSPOINT);
- clif_displaymessage(fd, msg_table[174]); // 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;
- }
-
- return 0;
-}
-
-/*==========================================
- * @skpoint (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_skillpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int point, new_skill_point;
-
- if (!message || !*message || (point = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter a number (usage: @skpoint <number of points>).");
- return -1;
- }
-
- new_skill_point = (int)sd->status.skill_point + point;
- if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
- new_skill_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
- new_skill_point = 0;
-
- if (new_skill_point != (int)sd->status.skill_point) {
- sd->status.skill_point = (short)new_skill_point;
- clif_updatestatus(sd, SP_SKILLPOINT);
- clif_displaymessage(fd, msg_table[175]); // 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;
- }
-
- return 0;
-}
-
-/*==========================================
- * @zeny (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_zeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int zeny, new_zeny;
-
- if (!message || !*message || (zeny = atoi(message)) == 0) {
- clif_displaymessage(fd, "Please, enter an amount (usage: @zeny <amount>).");
- return -1;
- }
-
- new_zeny = 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 != sd->status.zeny) {
- sd->status.zeny = new_zeny;
- clif_updatestatus(sd, SP_ZENY);
- clif_displaymessage(fd, msg_table[176]); // 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;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_param(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, index, value = 0, new_value;
- const char* param[] = { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL };
- short* status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) {
- sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage(fd, output);
- return -1;
- }
-
- index = -1;
- for (i = 0; param[i] != NULL; i++) {
- if (strcmpi(command, param[i]) == 0) {
- index = i;
- break;
- }
- }
- if (index < 0 || index > MAX_STATUS_TYPE) { // normaly impossible...
- sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
- clif_displaymessage(fd, output);
- return -1;
- }
-
- new_value = (int)*status[index] + value;
- if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
- new_value = battle_config.max_parameter;
- else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
- new_value = 1;
-
- if (new_value != (int)*status[index]) {
- *status[index] = new_value;
- clif_updatestatus(sd, SP_STR + index);
- clif_updatestatus(sd, SP_USTR + index);
- pc_calcstatus(sd, 0);
- clif_displaymessage(fd, msg_table[42]); // Stat changed.
- } else {
- if (value < 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;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-//** Stat all by fritz (rewritten by [Yor])
-int atcommand_stat_all(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int index, count, value = 0, new_value;
- short* status[] = {
- &sd->status.str, &sd->status.agi, &sd->status.vit,
- &sd->status.int_, &sd->status.dex, &sd->status.luk
- };
-
- if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0)
- value = battle_config.max_parameter;
-
- count = 0;
- for (index = 0; index < (int)(sizeof(status) / sizeof(status[0])); index++) {
-
- new_value = (int)*status[index] + value;
- if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
- new_value = battle_config.max_parameter;
- else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
- new_value = 1;
-
- if (new_value != (int)*status[index]) {
- *status[index] = new_value;
- clif_updatestatus(sd, SP_STR + index);
- clif_updatestatus(sd, SP_USTR + index);
- pc_calcstatus(sd, 0);
- count++;
- }
- }
-
- if (count > 0) // if at least 1 stat modified
- clif_displaymessage(fd, msg_table[84]); // All stats changed!
- else {
- if (value < 0)
- clif_displaymessage(fd, msg_table[177]); // Impossible to decrease a stat.
- else
- clif_displaymessage(fd, msg_table[178]); // Impossible to increase a stat.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guildlevelup(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int level = 0;
- short added_level;
- struct guild *guild_info;
-
- if (!message || !*message || sscanf(message, "%d", &level) < 1 || level == 0) {
- clif_displaymessage(fd, "Please, enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).");
- return -1;
- }
-
- if (sd->status.guild_id <= 0 || (guild_info = guild_search(sd->status.guild_id)) == NULL) {
- clif_displaymessage(fd, msg_table[43]); // You're not in a guild.
- return -1;
- }
- if (strcmp(sd->status.name, guild_info->master) != 0) {
- clif_displaymessage(fd, msg_table[44]); // You're not the master of your guild.
- return -1;
- }
-
- added_level = (short)level;
- if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short)MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow
- added_level = (short)MAX_GUILDLEVEL - guild_info->guild_lv;
- else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow
- added_level = 1 - guild_info->guild_lv;
-
- if (added_level != 0) {
- intif_guild_change_basicinfo(guild_info->guild_id, GBI_GUILDLV, &added_level, 2);
- clif_displaymessage(fd, msg_table[179]); // Guild level changed.
- } else {
- clif_displaymessage(fd, msg_table[45]); // Guild level change failed.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_makeegg(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct item_data *item_data;
- int id, pet_id;
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a monter/egg name/id (usage: @makeegg <pet_id>).");
- return -1;
- }
-
- if ((item_data = itemdb_searchname(message)) != NULL) // for egg name
- id = item_data->nameid;
- else if ((id = mobdb_searchname(message)) == 0) // for monster name
- id = atoi(message);
-
- pet_id = search_petDB_index(id, PET_CLASS);
- if (pet_id < 0)
- pet_id = search_petDB_index(id, PET_EGG);
- if (pet_id >= 0) {
- sd->catch_target_class = pet_db[pet_id].class;
- intif_create_pet(
- sd->status.account_id, sd->status.char_id,
- pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
- pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- } else {
- clif_displaymessage(fd, msg_table[180]); // The monter/egg name/id doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_hatch(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->status.pet_id <= 0)
- clif_sendegg(sd);
- else {
- clif_displaymessage(fd, msg_table[181]); // You already have a pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_petfriendly(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int friendly;
- int t;
-
- if (!message || !*message || (friendly = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a valid value (usage: @petfriendly <0-1000>).");
- return -1;
- }
-
- if (sd->status.pet_id > 0 && sd->pd) {
- if (friendly >= 0 && friendly <= 1000) {
- if (friendly != sd->pet.intimate) {
- t = sd->pet.intimate;
- sd->pet.intimate = friendly;
- clif_send_petstatus(sd);
- if (battle_config.pet_status_support) {
- if ((sd->pet.intimate > 0 && t <= 0) ||
- (sd->pet.intimate <= 0 && t > 0)) {
- if (sd->bl.prev != NULL)
- pc_calcstatus(sd, 0);
- else
- pc_calcstatus(sd, 2);
- }
- }
- clif_displaymessage(fd, msg_table[182]); // Pet friendly value changed!
- } else {
- clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_pethungry(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int hungry;
-
- if (!message || !*message || (hungry = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a valid number (usage: @pethungry <0-100>).");
- return -1;
- }
-
- if (sd->status.pet_id > 0 && sd->pd) {
- if (hungry >= 0 && hungry <= 100) {
- if (hungry != sd->pet.hungry) {
- sd->pet.hungry = hungry;
- clif_send_petstatus(sd);
- clif_displaymessage(fd, msg_table[185]); // Pet hungry value changed!
- } else {
- clif_displaymessage(fd, msg_table[186]); // Pet hungry is already the good value.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_petrename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->status.pet_id > 0 && sd->pd) {
- if (sd->pet.rename_flag != 0) {
- sd->pet.rename_flag = 0;
- intif_save_petdata(sd->status.account_id, &sd->pet);
- clif_send_petstatus(sd);
- clif_displaymessage(fd, msg_table[187]); // You can now rename your pet.
- } else {
- clif_displaymessage(fd, msg_table[188]); // You can already rename your pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_charpetrename(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charpetrename <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
- if (pl_sd->pet.rename_flag != 0) {
- pl_sd->pet.rename_flag = 0;
- intif_save_petdata(pl_sd->status.account_id, &pl_sd->pet);
- clif_send_petstatus(pl_sd);
- clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
- } else {
- clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
- return -1;
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int
-atcommand_recall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd = NULL;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @recall <char name>).");
- return -1;
- }
-
- memset(character, '\0', sizeof character);
- if(sscanf(message, "%99[^\n]", character) < 1)
- return -1;
- if(strncmp(sd->status.name,character,24)==0)
- return -1;
-
- intif_charmovereq(sd,character,1);
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual 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;
- }
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- sprintf(output, msg_table[46], character); // %s recalled!
- 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;
-}
-
-/*==========================================
- * ‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ð“]E‚³‚¹‚é upperŽw’è‚Å“]¶‚â—{Žq‚à‰Â”\
- *------------------------------------------
- */
-int atcommand_character_job(
- 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;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a job and a player name (usage: @charjob/@charjobchange <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: @charjob/@charjobchange <job ID> <char name>).");
- return -1;
- }
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- 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)) {
-
- // fix pecopeco display
- if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
- if (pc_isriding(sd)) {
- if (pl_sd->status.class == 13)
- pl_sd->status.class = pl_sd->view_class = 7;
- if (pl_sd->status.class == 21)
- pl_sd->status.class = pl_sd->view_class = 14;
- if (pl_sd->status.class == 4014)
- pl_sd->status.class = pl_sd->view_class = 4008;
- if (pl_sd->status.class == 4022)
- pl_sd->status.class = pl_sd->view_class = 4015;
- pl_sd->status.option &= ~0x0020;
- clif_changeoption(&pl_sd->bl);
- pc_calcstatus(pl_sd, 0);
- }
- } else {
- if (!pc_isriding(sd)) {
- if (job == 13)
- job = 7;
- if (job == 21)
- job = 14;
- if (job == 4014)
- job = 4008;
- if (job == 4022)
- job = 4015;
- }
- }
-
- 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 atcommand_revive(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- pl_sd->status.hp = pl_sd->status.max_hp;
- pc_setstand(pl_sd);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_updatestatus(pl_sd, SP_HP);
- clif_updatestatus(pl_sd, SP_SP);
- clif_resurrection(&pl_sd->bl, 1);
- clif_displaymessage(fd, msg_table[51]); // Character revived.
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_character_stats(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char job_jobname[100];
- char output[200];
- struct map_session_data *pl_sd;
- int i;
-
- memset(character, '\0', sizeof(character));
- memset(job_jobname, '\0', sizeof(job_jobname));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charstats <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- struct {
- const char* format;
- int value;
- } output_table[] = {
- { "Base Level - %d", pl_sd->status.base_level },
- { job_jobname, pl_sd->status.job_level },
- { "Hp - %d", pl_sd->status.hp },
- { "MaxHp - %d", pl_sd->status.max_hp },
- { "Sp - %d", pl_sd->status.sp },
- { "MaxSp - %d", pl_sd->status.max_sp },
- { "Str - %3d", pl_sd->status.str },
- { "Agi - %3d", pl_sd->status.agi },
- { "Vit - %3d", pl_sd->status.vit },
- { "Int - %3d", pl_sd->status.int_ },
- { "Dex - %3d", pl_sd->status.dex },
- { "Luk - %3d", pl_sd->status.luk },
- { "Zeny - %d", pl_sd->status.zeny },
- { NULL, 0 }
- };
- 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 Stats All by fritz
-int atcommand_character_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;
- struct map_session_data *pl_sd;
-
- memset(output, '\0', sizeof(output));
- memset(gmlevel, '\0', sizeof(gmlevel));
-
- count = 0;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
-
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_character_option(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- int opt1 = 0, opt2 = 0, opt3 = 0;
- struct map_session_data* pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3, character) < 4 || opt1 < 0 || opt2 < 0 || opt3 < 0) {
- clif_displaymessage(fd, "Please, enter valid options and a player name (usage: @charoption <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->opt1 = opt1;
- pl_sd->opt2 = opt2;
- pl_sd->status.option = opt3;
- // fix pecopeco display
- if (pl_sd->status.class == 13 || pl_sd->status.class == 21 || pl_sd->status.class == 4014 || pl_sd->status.class == 4022) {
- if (!pc_isriding(pl_sd)) { // pl_sd have the new value...
- if (pl_sd->status.class == 13)
- pl_sd->status.class = pl_sd->view_class = 7;
- else if (pl_sd->status.class == 21)
- pl_sd->status.class = pl_sd->view_class = 14;
- else if (pl_sd->status.class == 4014)
- pl_sd->status.class = pl_sd->view_class = 4008;
- else if (pl_sd->status.class == 4022)
- pl_sd->status.class = pl_sd->view_class = 4015;
- }
- } else {
- if (pc_isriding(pl_sd)) { // pl_sd have the new value...
- if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
- pl_sd->status.option &= ~0x0020;
- } else {
- if (pl_sd->status.class == 7)
- pl_sd->status.class = pl_sd->view_class = 13;
- else if (pl_sd->status.class == 14)
- pl_sd->status.class = pl_sd->view_class = 21;
- else if (pl_sd->status.class == 4008)
- pl_sd->status.class = pl_sd->view_class = 4014;
- else if (pl_sd->status.class == 4015)
- pl_sd->status.class = pl_sd->view_class = 4022;
- else
- pl_sd->status.option &= ~0x0020;
- }
- }
- }
- clif_changeoption(&pl_sd->bl);
- pc_calcstatus(pl_sd, 0);
- 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;
-}
-
-/*==========================================
- * charchangesex command (usage: charchangesex <player_name>)
- *------------------------------------------
- */
-int atcommand_char_change_sex(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
- return -1;
- }
-
- // check player name
- if (strlen(character) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(character) > 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, character, 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;
-}
-
-/*==========================================
- * charblock command (usage: charblock <player_name>)
- * This command do a definitiv ban on a player
- *------------------------------------------
- */
-int atcommand_char_block(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charblock/@block <name>).");
- return -1;
- }
-
- // check player name
- if (strlen(character) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(character) > 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, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charban command (usage: charban <time> <player_name>)
- * This command do a limited ban on a player
- * Time 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> @ban +1m-2mn1s-6y test_player
- * this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
- *------------------------------------------
- */
-int atcommand_char_ban(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char modif[100], character[100];
- char * modif_p;
- int year, month, day, hour, minute, second, value;
-
- memset(modif, '\0', sizeof(modif));
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%s %99[^\n]", modif, character) < 2) {
- clif_displaymessage(fd, "Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>).");
- return -1;
- }
-
- modif[sizeof(modif)-1] = '\0';
- character[sizeof(character)-1] = '\0';
-
- modif_p = modif;
- year = month = day = hour = minute = second = 0;
- while (modif_p[0] != '\0') {
- value = atoi(modif_p);
- if (value == 0)
- modif_p++;
- else {
- if (modif_p[0] == '-' || modif_p[0] == '+')
- modif_p++;
- while (modif_p[0] >= '0' && modif_p[0] <= '9')
- modif_p++;
- if (modif_p[0] == 's') {
- second = value;
- modif_p++;
- } else if (modif_p[0] == 'm' && modif_p[1] == 'n') {
- minute = value;
- modif_p = modif_p + 2;
- } else if (modif_p[0] == 'h') {
- hour = value;
- modif_p++;
- } else if (modif_p[0] == 'd' || modif_p[0] == 'j') {
- day = value;
- modif_p++;
- } else if (modif_p[0] == 'm') {
- month = value;
- modif_p++;
- } else if (modif_p[0] == 'y' || modif_p[0] == 'a') {
- year = value;
- modif_p++;
- } else if (modif_p[0] != '\0') {
- modif_p++;
- }
- }
- }
- if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
- clif_displaymessage(fd, msg_table[85]); // Invalid time for ban command.
- return -1;
- }
-
- // check player name
- if (strlen(character) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(character) > 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, character, 2, year, month, day, hour, minute, second); // type: 2 - ban
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charunblock command (usage: charunblock <player_name>)
- *------------------------------------------
- */
-int atcommand_char_unblock(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charunblock <player_name>).");
- return -1;
- }
-
- // check player name
- if (strlen(character) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(character) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- // send answer to login server via char-server
- chrif_char_ask_name(sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- * charunban command (usage: charunban <player_name>)
- *------------------------------------------
- */
-int atcommand_char_unban(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charunban <player_name>).");
- return -1;
- }
-
- // check player name
- if (strlen(character) < 4) {
- clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
- return -1;
- } else if (strlen(character) > 23) {
- clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
- return -1;
- } else {
- // send answer to login server via char-server
- chrif_char_ask_name(sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban
- clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_character_save(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char map_name[100];
- char character[100];
- struct map_session_data* pl_sd;
- int x = 0, y = 0;
- int m;
-
- memset(map_name, '\0', sizeof(map_name));
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99s %d %d %99[^\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: @charsave <map> <x> <y> <charname>).");
- return -1;
- }
-
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 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) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- } else {
- if (m >= 0 && map[m].flag.nowarpto && 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;
- }
- pc_setsavepoint(pl_sd, 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_night(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (night_flag != 1) {
- night_flag = 1; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- clif_displaymessage(pl_sd->fd, msg_table[59]); // Night has fallen.
- }
- }
- } else {
- clif_displaymessage(fd, msg_table[89]); // Sorry, it's already the night. Impossible to execute the command.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_day(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- if (night_flag != 0) {
- night_flag = 0; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- clif_displaymessage(pl_sd->fd, msg_table[60]); // Day has arrived.
- }
- }
- } else {
- clif_displaymessage(fd, msg_table[90]); // Sorry, it's already the day. Impossible to execute the command.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_doom(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
- }
- }
- clif_displaymessage(fd, msg_table[62]); // Judgement was made.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_doommap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
- pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
- clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
- }
- }
- clif_displaymessage(fd, msg_table[62]); // Judgement was made.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static void atcommand_raise_sub(struct map_session_data* sd)
-{
- if (sd && sd->state.auth && pc_isdead(sd)) {
- sd->status.hp = sd->status.max_hp;
- sd->status.sp = sd->status.max_sp;
- pc_setstand(sd);
- clif_updatestatus(sd, SP_HP);
- clif_updatestatus(sd, SP_SP);
- clif_resurrection(&sd->bl, 1);
- if (battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
- clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown.
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_raise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
-
- for (i = 0; i < fd_max; i++) {
- if (session[i])
- atcommand_raise_sub(session[i]->session_data);
- }
- clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_raisemap(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->bl.m == pl_sd->bl.m)
- atcommand_raise_sub(pl_sd);
- }
- clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
-
- return 0;
-}
-
-/*==========================================
- * atcommand_character_baselevel @charbaselvl‚Å‘ÎÛƒLƒƒƒ‰‚̃Œƒxƒ‹‚ðã‚°‚é
- *------------------------------------------
-*/
-int atcommand_character_baselevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int level = 0, i;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charbaselvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != 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 == battle_config.maximum_level) { // 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 (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow
- level = battle_config.maximum_level - pl_sd->status.base_level;
- for (i = 1; i <= level; i++)
- pl_sd->status.status_point += (pl_sd->status.base_level + i + 14) / 5;
- pl_sd->status.base_level += level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- pc_calcstatus(pl_sd, 0);
- pc_heal(pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp);
- 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;
- }
- if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow
- level = 1 - pl_sd->status.base_level;
- if (pl_sd->status.status_point > 0) {
- for (i = 0; i > level; i--)
- pl_sd->status.status_point -= (pl_sd->status.base_level + i + 14) / 5;
- if (pl_sd->status.status_point < 0)
- pl_sd->status.status_point = 0;
- clif_updatestatus(pl_sd, SP_STATUSPOINT);
- } // to add: remove status points from stats
- pl_sd->status.base_level += level;
- clif_updatestatus(pl_sd, SP_BASELEVEL);
- clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
- pc_calcstatus(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—¹
-}
-
-/*==========================================
- * atcommand_character_joblevel @charjoblvl‚Å‘ÎÛƒLƒƒƒ‰‚ÌJobƒŒƒxƒ‹‚ðã‚°‚é
- *------------------------------------------
- */
-int atcommand_character_joblevel(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int max_level = 50, level = 0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job pl_s_class;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) {
- clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- pl_s_class = pc_calc_base_job(pl_sd->status.class);
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
- if (pl_s_class.job == 0)
- max_level -= 40;
- if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //ƒXƒpƒmƒr‚Æ“]¶E‚ÍJobƒŒƒxƒ‹‚ÌÅ‚‚ª70
- max_level += 20;
-
- if (level > 0) {
- if (pl_sd->status.job_level == max_level) {
- clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher.
- return -1;
- }
- if (pl_sd->status.job_level + level > max_level)
- level = max_level - pl_sd->status.job_level;
- pl_sd->status.job_level += level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
- pl_sd->status.skill_point += level;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- pc_calcstatus(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;
- }
- if (pl_sd->status.job_level + level < 1)
- level = 1 - pl_sd->status.job_level;
- pl_sd->status.job_level += level;
- clif_updatestatus(pl_sd, SP_JOBLEVEL);
- clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
- if (pl_sd->status.skill_point > 0) {
- pl_sd->status.skill_point += level;
- if (pl_sd->status.skill_point < 0)
- pl_sd->status.skill_point = 0;
- clif_updatestatus(pl_sd, SP_SKILLPOINT);
- } // to add: remove status points from skills
- pc_calcstatus(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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_kick(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @kick <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
- clif_GM_kick(sd, pl_sd, 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 atcommand_kickall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kick only lower or same gm level
- if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick(sd, pl_sd, 0);
- }
- }
-
- clif_displaymessage(fd, msg_table[195]); // All players have been kicked!
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_allskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- pc_allskillup(sd); // all skills
- sd->status.skill_point = 0; // 0 skill points
- clif_updatestatus(sd, SP_SKILLPOINT); // update
- clif_displaymessage(fd, msg_table[76]); // You have received all skills.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_questskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skill_id;
-
- if (!message || !*message || (skill_id = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number (usage: @questskill <#:0+>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if (pc_checkskill(sd, skill_id) == 0) {
- pc_skill(sd, skill_id, 1, 0);
- clif_displaymessage(fd, msg_table[70]); // You have learned the skill.
- } else {
- clif_displaymessage(fd, msg_table[196]); // You already have this quest skill.
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_charquestskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
- int skill_id = 0;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 2 || skill_id < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if ((pl_sd = map_nick2sd(character)) != 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_lostskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skill_id;
-
- if (!message || !*message || (skill_id = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a quest skill number (usage: @lostskill <#:0+>).");
- return -1;
- }
-
- if (skill_id >= 0 && skill_id < MAX_SKILL) {
- if (skill_get_inf2(skill_id) & 0x01) {
- if (pc_checkskill(sd, skill_id) > 0) {
- sd->status.skill[skill_id].lv = 0;
- sd->status.skill[skill_id].flag = 0;
- clif_skillinfoblock(sd);
- clif_displaymessage(fd, msg_table[71]); // You have forgotten the skill.
- } else {
- clif_displaymessage(fd, msg_table[201]); // You don't have this quest skill.
- 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_charlostskill(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
- int skill_id = 0;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 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) & 0x01) {
- if ((pl_sd = map_nick2sd(character)) != 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;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_spiritball(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int number;
-
- if (!message || !*message || (number = atoi(message)) < 0) {
- clif_displaymessage(fd, "Please, enter a spirit ball number (usage: @spiritball <number: 0-1000>).");
- return -1;
- }
-
- // set max number to avoid server/client crash (500 create big balls of several balls: no visial difference with more)
- if (number > 500)
- number = 500;
-
- if (number >= 0 && number <= 0x7FFF) {
- if (sd->spiritball != number || number > 499) {
- if (sd->spiritball > 0)
- pc_delspiritball(sd, sd->spiritball, 1);
- sd->spiritball = number;
- clif_spiritball(sd);
- // no message, player can look the difference
- if (number > 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;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_party(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char party[100];
-
- memset(party, '\0', sizeof(party));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party) < 1) {
- clif_displaymessage(fd, "Please, enter a party name (usage: @party <party_name>).");
- return -1;
- }
-
- party_create(sd, party);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_guild(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char guild[100];
- int prev;
-
- memset(guild, '\0', sizeof(guild));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name (usage: @guild <guild_name>).");
- return -1;
- }
-
- prev = battle_config.guild_emperium_check;
- battle_config.guild_emperium_check = 0;
- guild_create(sd, guild);
- battle_config.guild_emperium_check = prev;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitstart(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (agit_flag == 1) {
- clif_displaymessage(fd, msg_table[73]); // Already it has started siege warfare.
- return -1;
- }
-
- agit_flag = 1;
- guild_agit_start();
- clif_displaymessage(fd, msg_table[72]); // Guild siege warfare start!
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_agitend(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (agit_flag == 0) {
- clif_displaymessage(fd, msg_table[75]); // Siege warfare hasn't started yet.
- return -1;
- }
-
- agit_flag = 0;
- guild_agit_end();
- clif_displaymessage(fd, msg_table[74]); // Guild siege warfare end!
-
- return 0;
-}
-
-/*==========================================
- * @mapexit‚Ń}ƒbƒvƒT[ƒo[‚ðI—¹‚³‚¹‚é
- *------------------------------------------
- */
-int atcommand_mapexit(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- if (sd->status.account_id != pl_sd->status.account_id)
- clif_GM_kick(sd, pl_sd, 0);
- }
- }
- clif_GM_kick(sd, sd, 0);
-
- runflag = 0;
-
- return 0;
-}
-
-/*==========================================
- * idsearch <part_of_name>: revrited by [Yor]
- *------------------------------------------
- */
-int atcommand_idsearch(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char item_name[100];
- char output[200];
- int i, match;
- struct item_data *item;
-
- memset(item_name, '\0', sizeof(item_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99s", item_name) < 0) {
- clif_displaymessage(fd, "Please, enter a part of item name (usage: @idsearch <part_of_item_name>).");
- return -1;
- }
-
- sprintf(output, msg_table[77], item_name); // The reference result of '%s' (name: id):
- clif_displaymessage(fd, output);
- match = 0;
- for(i = 0; i < 20000; i++) {
- if ((item = itemdb_exists(i)) != NULL && strstr(item->jname, item_name) != NULL) {
- match++;
- sprintf(output, msg_table[78], item->jname, item->nameid); // %s: %d
- clif_displaymessage(fd, output);
- }
- }
- sprintf(output, msg_table[79], match); // It is %d affair above.
- clif_displaymessage(fd, output);
-
- return 0;
-}
-
-/*==========================================
- * Character Skill Reset
- *------------------------------------------
- */
-int atcommand_charskreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
- pc_resetskill(pl_sd);
- sprintf(output, msg_table[206], character); // '%s' skill 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;
-}
-
-/*==========================================
- * Character Stat Reset
- *------------------------------------------
- */
-int atcommand_charstreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != 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(output, msg_table[207], character); // '%s' 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;
-}
-
-/*==========================================
- * Character Reset
- *------------------------------------------
- */
-int atcommand_charreset(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- char output[200];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charreset <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);
- 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;
-}
-
-/*==========================================
- * Character Model by chbrules
- *------------------------------------------
- */
-int atcommand_charmodel(
- 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 character[100];
- char output[200];
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &hair_style, &hair_color, &cloth_color, character) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
- sprintf(output, "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, output);
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != 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) {
-
- if (cloth_color != 0 &&
- pl_sd->status.sex == 1 &&
- (pl_sd->status.class == 12 || pl_sd->status.class == 17)) {
- 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 atcommand_charskpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int new_skill_point;
- int point = 0;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 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(character)) != NULL) {
- new_skill_point = (int)pl_sd->status.skill_point + point;
- if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
- new_skill_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
- new_skill_point = 0;
- 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 atcommand_charstpoint(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int new_status_point;
- int point = 0;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 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(character)) != NULL) {
- new_status_point = (int)pl_sd->status.status_point + point;
- if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
- new_status_point = 0x7FFF;
- else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
- new_status_point = 0;
- 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;
-}
-
-/*==========================================
- * Character Zeny Point (Rewritten by [Yor])
- *------------------------------------------
- */
-int atcommand_charzeny(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- int zeny = 0, new_zeny;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0) {
- clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charzeny <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;
-}
-
-/*==========================================
- * Recall All Characters Online To Your Location
- *------------------------------------------
- */
-int atcommand_recallall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- int count;
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->status.account_id != pl_sd->status.account_id &&
- pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
-
- clif_displaymessage(fd, msg_table[92]); // All characters recalled!
- if (count) {
- sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, output);
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall online characters of a guild to your location
- *------------------------------------------
- */
-int atcommand_guildrecall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int i;
- char guild_name[100];
- char output[200];
- struct guild *g;
- int count;
-
- memset(guild_name, '\0', sizeof(guild_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>).");
- return -1;
- }
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search(atoi(message))) != NULL) {
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
- sd->status.account_id != pl_sd->status.account_id &&
- pl_sd->status.guild_id == g->guild_id) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
- sprintf(output, msg_table[93], g->name); // All online characters of the %s guild are near you.
- clif_displaymessage(fd, output);
- if (count) {
- sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * Recall online characters of a party to your location
- *------------------------------------------
- */
-int atcommand_partyrecall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd;
- char party_name[100];
- char output[200];
- struct party *p;
- int count;
-
- memset(party_name, '\0', sizeof(party_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
- clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyrecall <party_name/id>).");
- return -1;
- }
-
- if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
- clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
- return -1;
- }
-
- if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search(atoi(message))) != NULL) {
- count = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
- sd->status.account_id != pl_sd->status.account_id &&
- pl_sd->status.party_id == p->party_id) {
- if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
- count++;
- else
- pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
- }
- }
- sprintf(output, msg_table[95], p->name); // All online characters of the %s party are near you.
- clif_displaymessage(fd, output);
- if (count) {
- sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloaditemdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- itemdb_reload();
- clif_displaymessage(fd, msg_table[97]); // Item database reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadmobdb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- mob_reload();
- clif_displaymessage(fd, msg_table[98]); // Monster database reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadskilldb(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- skill_reload();
- clif_displaymessage(fd, msg_table[99]); // Skill database reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-#ifndef TXT_ONLY
-int atcommand_rehash(
-#else /* TXT_ONLY */
-int atcommand_reloadscript(
-#endif /* TXT_ONLY */
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
-#ifndef TXT_ONLY
- atcommand_broadcast( fd, sd, "@broadcast", "eAthena SQL Server is Rehashing..." );
- atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" );
-
- rehash( fd, sd );
-
- atcommand_broadcast( fd, sd, "@broadcast", "Reloading NPCs..." );
-#endif /* not TXT_ONLY */
- do_init_npc();
- do_init_script();
-
- npc_event_do_oninit();
-
- clif_displaymessage(fd, msg_table[100]); // Scripts reloaded.
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_reloadgmdb( // by [Yor]
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- chrif_reloadGMdb();
-
- clif_displaymessage(fd, msg_table[101]); // Login-server asked to reload GM accounts and their level.
-
- return 0;
-}
-
-/*==========================================
- * @mapinfo <map name> [0-3] by MC_Cameri
- * => Shows information about the map [map name]
- * 0 = no additional information
- * 1 = Show users in that map and their location
- * 2 = Shows NPCs in that map
- * 3 = Shows the shops/chats in that map (not implemented)
- *------------------------------------------
- */
-int atcommand_mapinfo(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- struct npc_data *nd = NULL;
- struct chat_data *cd = NULL;
- char output[200], map_name[100];
- char direction[12];
- int m_id, i, chat_num, list = 0;
-
- memset(output, '\0', sizeof(output));
- memset(map_name, '\0', sizeof(map_name));
- memset(direction, '\0', sizeof(direction));
-
- sscanf(message, "%d %99[^\n]", &list, map_name);
-
- if (list < 0 || list > 3) {
- clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
- return -1;
- }
-
- if (map_name[0] == '\0')
- strcpy(map_name, sd->mapname);
- if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
- strcat(map_name, ".gat");
-
- if ((m_id = map_mapname2mapid(map_name)) < 0) {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- return -1;
- }
-
- clif_displaymessage(fd, "------ Map Info ------");
- sprintf(output, "Map Name: %s", map_name);
- clif_displaymessage(fd, output);
- sprintf(output, "Players In Map: %d", map[m_id].users);
- clif_displaymessage(fd, output);
- sprintf(output, "NPCs In Map: %d", map[m_id].npc_num);
- clif_displaymessage(fd, output);
- chat_num = 0;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
- (cd = (struct chat_data*)map_id2bl(pl_sd->chatID))) {
- chat_num++;
- }
- }
- sprintf(output, "Chats In Map: %d", chat_num);
- clif_displaymessage(fd, output);
- clif_displaymessage(fd, "------ Map Flags ------");
- sprintf(output, "Player vs Player: %s | No Guild: %s | No Party: %s",
- (map[m_id].flag.pvp) ? "True" : "False",
- (map[m_id].flag.pvp_noguild) ? "True" : "False",
- (map[m_id].flag.pvp_noparty) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "Guild vs Guild: %s | No Party: %s", (map[m_id].flag.gvg) ? "True" : "False", (map[m_id].flag.gvg_noparty) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Dead Branch: %s", (map[m_id].flag.nobranch) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Memo: %s", (map[m_id].flag.nomemo) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Penalty: %s", (map[m_id].flag.nopenalty) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Return: %s", (map[m_id].flag.noreturn) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Save: %s", (map[m_id].flag.nosave) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Teleport: %s", (map[m_id].flag.noteleport) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Monster Teleport: %s", (map[m_id].flag.monster_noteleport) ? "True" : "False");
- clif_displaymessage(fd, output);
- sprintf(output, "No Zeny Penalty: %s", (map[m_id].flag.nozenypenalty) ? "True" : "False");
- clif_displaymessage(fd, output);
-
- switch (list) {
- case 0:
- // Do nothing. It's list 0, no additional display.
- break;
- case 1:
- clif_displaymessage(fd, "----- Players in Map -----");
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && strcmp(pl_sd->mapname, map_name) == 0) {
- sprintf(output, "Player '%s' (session #%d) | Location: %d,%d",
- pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, output);
- }
- }
- break;
- case 2:
- clif_displaymessage(fd, "----- NPCs in Map -----");
- for (i = 0; i < map[m_id].npc_num;) {
- nd = map[m_id].npc[i];
- switch(nd->dir) {
- case 0: strcpy(direction, "North"); break;
- case 1: strcpy(direction, "North West"); break;
- case 2: strcpy(direction, "West"); break;
- case 3: strcpy(direction, "South West"); break;
- case 4: strcpy(direction, "South"); break;
- case 5: strcpy(direction, "South East"); break;
- case 6: strcpy(direction, "East"); break;
- case 7: strcpy(direction, "North East"); break;
- case 9: strcpy(direction, "North"); break;
- default: strcpy(direction, "Unknown"); break;
- }
- sprintf(output, "NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d",
- ++i, nd->name, direction, nd->class, nd->bl.x, nd->bl.y);
- clif_displaymessage(fd, output);
- }
- break;
- case 3:
- clif_displaymessage(fd, "----- Chats in Map -----");
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
- (cd = (struct chat_data*)map_id2bl(pl_sd->chatID)) &&
- strcmp(pl_sd->mapname, map_name) == 0 &&
- cd->usersd[0] == pl_sd) {
- sprintf(output, "Chat %d: %s | Player: %s | Location: %d %d",
- i, cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y);
- clif_displaymessage(fd, output);
- sprintf(output, " Users: %d/%d | Password: %s | Public: %s",
- cd->users, cd->limit, cd->pass, (cd->pub) ? "Yes" : "No");
- clif_displaymessage(fd, output);
- }
- }
- break;
- default: // normally impossible to arrive here
- clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
- return -1;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_mount_peco(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[212]); // Cannot mount a Peco while in disguise.
- return -1;
- }
-
- if (!pc_isriding(sd)) { // if actually no peco
- if (sd->status.class == 7 || sd->status.class == 14 || sd->status.class == 4008 || sd->status.class == 4015) {
- if (sd->status.class == 7)
- sd->status.class = sd->view_class = 13;
- else if (sd->status.class == 14)
- sd->status.class = sd->view_class = 21;
- else if (sd->status.class == 4008)
- sd->status.class = sd->view_class = 4014;
- else if (sd->status.class == 4015)
- sd->status.class = sd->view_class = 4022;
- pc_setoption(sd, sd->status.option | 0x0020);
- clif_displaymessage(fd, msg_table[102]); // Mounted Peco.
- } else {
- clif_displaymessage(fd, msg_table[213]); // You can not mount a peco with your job.
- return -1;
- }
- } else {
- if (sd->status.class == 13)
- sd->status.class = sd->view_class = 7;
- else if (sd->status.class == 21)
- sd->status.class = sd->view_class = 14;
- else if (sd->status.class == 4014)
- sd->status.class = sd->view_class = 4008;
- else if (sd->status.class == 4022)
- sd->status.class = sd->view_class = 4015;
- pc_setoption(sd, sd->status.option & ~0x0020);
- clif_displaymessage(fd, msg_table[214]); // Unmounted Peco.
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_char_mount_peco(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charmountpeco <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[215]); // This player cannot mount a Peco while in disguise.
- return -1;
- }
-
- if (!pc_isriding(pl_sd)) { // if actually no peco
- if (pl_sd->status.class == 7 || pl_sd->status.class == 14 || pl_sd->status.class == 4008 || pl_sd->status.class == 4015) {
- if (pl_sd->status.class == 7)
- pl_sd->status.class = pl_sd->view_class = 13;
- else if (pl_sd->status.class == 14)
- pl_sd->status.class = pl_sd->view_class = 21;
- else if (pl_sd->status.class == 4008)
- pl_sd->status.class = pl_sd->view_class = 4014;
- else if (pl_sd->status.class == 4015)
- pl_sd->status.class = pl_sd->view_class = 4022;
- pc_setoption(pl_sd, pl_sd->status.option | 0x0020);
- clif_displaymessage(fd, msg_table[216]); // Now, this player mounts a peco.
- } else {
- clif_displaymessage(fd, msg_table[217]); // This player can not mount a peco with his/her job.
- return -1;
- }
- } else {
- if (pl_sd->status.class == 13)
- pl_sd->status.class = pl_sd->view_class = 7;
- else if (pl_sd->status.class == 21)
- pl_sd->status.class = pl_sd->view_class = 14;
- else if (pl_sd->status.class == 4014)
- pl_sd->status.class = pl_sd->view_class = 4008;
- else if (pl_sd->status.class == 4022)
- pl_sd->status.class = pl_sd->view_class = 4015;
- pc_setoption(pl_sd, pl_sd->status.option & ~0x0020);
- clif_displaymessage(fd, msg_table[218]); // Now, this player has not more peco.
- }
- } else {
- clif_displaymessage(fd, msg_table[3]); // Character not found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *Spy Commands by Syrus22
- *------------------------------------------
- */
-int atcommand_guildspy(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char guild_name[100];
- char output[200];
- struct guild *g;
-
- memset(guild_name, '\0', sizeof(guild_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
- clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildspy <guild_name/id>).");
- return -1;
- }
-
- if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
- (g = guild_search(atoi(message))) != NULL) {
- if (sd->guildspy == g->guild_id) {
- sd->guildspy = 0;
- sprintf(output, msg_table[103], g->name); // No longer spying on the %s guild.
- clif_displaymessage(fd, output);
- } else {
- sd->guildspy = g->guild_id;
- sprintf(output, msg_table[104], g->name); // Spying on the %s guild.
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_partyspy(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char party_name[100];
- char output[200];
- struct party *p;
-
- memset(party_name, '\0', sizeof(party_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
- clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyspy <party_name/id>).");
- return -1;
- }
-
- if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
- (p = party_search(atoi(message))) != NULL) {
- if (sd->partyspy == p->party_id) {
- sd->partyspy = 0;
- sprintf(output, msg_table[105], p->name); // No longer spying on the %s party.
- clif_displaymessage(fd, output);
- } else {
- sd->partyspy = p->party_id;
- sprintf(output, msg_table[106], p->name); // Spying on the %s party.
- clif_displaymessage(fd, output);
- }
- } else {
- clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @repairall [Valaris]
- *------------------------------------------
- */
-int atcommand_repairall(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int count, i;
-
- count = 0;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].nameid && sd->status.inventory[i].attribute == 1) {
- sd->status.inventory[i].attribute = 0;
- clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
- count++;
- }
- }
-
- if (count > 0) {
- clif_misceffect(&sd->bl, 3);
- clif_equiplist(sd);
- clif_displaymessage(fd, msg_table[107]); // All items have been repaired.
- } else {
- clif_displaymessage(fd, msg_table[108]); // No item need to be repaired.
- return -1;
- }
-
- return 0;
-}
-
-/* Removed @nuke for now in favor of alchemist marine sphere skill [Valaris]
-int atcommand_nuke(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @nuke <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same GM level
- skill_castend_damage_id(&pl_sd->bl, &pl_sd->bl, NPC_SELFDESTRUCTION, 99, gettick(), 0);
- clif_displaymessage(fd, msg_table[109]); // Player has been nuked!
- } 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 atcommand_enablenpc(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char NPCname[100];
-
- memset(NPCname, '\0', sizeof(NPCname));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
- clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcon <NPC_name>).");
- return -1;
- }
-
- if (npc_name2id(NPCname) != NULL) {
- npc_enable(NPCname, 1);
- clif_displaymessage(fd, msg_table[110]); // Npc Enabled.
- } else {
- clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int atcommand_disablenpc(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char NPCname[100];
-
- memset(NPCname, '\0', sizeof(NPCname));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
- clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcoff <NPC_name>).");
- return -1;
- }
-
- if (npc_name2id(NPCname) != NULL) {
- npc_enable(NPCname, 0);
- clif_displaymessage(fd, msg_table[112]); // Npc Disabled.
- } else {
- clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * time in txt for time command (by [Yor])
- *------------------------------------------
- */
-char * txt_time(unsigned int duration) {
- int days, hours, minutes, seconds;
- char temp[256];
- static char temp1[256];
-
- memset(temp, '\0', sizeof(temp));
- memset(temp1, '\0', sizeof(temp1));
-
- if (duration < 0)
- duration = 0;
-
- days = duration / (60 * 60 * 24);
- duration = duration - (60 * 60 * 24 * days);
- hours = duration / (60 * 60);
- duration = duration - (60 * 60 * hours);
- minutes = duration / 60;
- seconds = duration - (60 * minutes);
-
- if (days < 2)
- sprintf(temp, msg_table[219], days); // %d day
- else
- sprintf(temp, msg_table[220], days); // %d days
- if (hours < 2)
- sprintf(temp1, msg_table[221], temp, hours); // %s %d hour
- else
- sprintf(temp1, msg_table[222], temp, hours); // %s %d hours
- if (minutes < 2)
- sprintf(temp, msg_table[223], temp1, minutes); // %s %d minute
- else
- sprintf(temp, msg_table[224], temp1, minutes); // %s %d minutes
- if (seconds < 2)
- sprintf(temp1, msg_table[225], temp, seconds); // %s and %d second
- else
- sprintf(temp1, msg_table[226], temp, seconds); // %s and %d seconds
-
- return temp1;
-}
-
-/*==========================================
- * @time/@date/@server_date/@serverdate/@server_time/@servertime: Display the date/time of the server (by [Yor]
- * Calculation management of GM modification (@day/@night GM commands) is done
- *------------------------------------------
- */
-int atcommand_servertime(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct TimerData * timer_data;
- struct TimerData * timer_data2;
- time_t time_server; // variable for number of seconds (used with time() function)
- struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
- char temp[256];
-
- memset(temp, '\0', sizeof(temp));
-
- time(&time_server); // get time in seconds since 1/1/1970
- datetime = localtime(&time_server); // convert seconds in structure
- // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52)
- strftime(temp, sizeof(temp)-1, msg_table[230], datetime); // Server time (normal time): %A, %B %d %Y %X.
- clif_displaymessage(fd, temp);
-
- if (battle_config.night_duration == 0 && battle_config.day_duration == 0) {
- if (night_flag == 0)
- clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
- else
- clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
- } else if (battle_config.night_duration == 0)
- if (night_flag == 1) { // we start with night
- timer_data = get_timer(day_timer_tid);
- sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
- clif_displaymessage(fd, temp);
- clif_displaymessage(fd, msg_table[234]); // Game time: After, the game will be in permanent daylight.
- } else
- clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
- else if (battle_config.day_duration == 0)
- if (night_flag == 0) { // we start with day
- timer_data = get_timer(night_timer_tid);
- sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
- clif_displaymessage(fd, temp);
- clif_displaymessage(fd, msg_table[236]); // Game time: After, the game will be in permanent night.
- } else
- clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
- else {
- if (night_flag == 0) {
- timer_data = get_timer(night_timer_tid);
- timer_data2 = get_timer(day_timer_tid);
- sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
- clif_displaymessage(fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf(temp, msg_table[237], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in night for %s.
- else
- sprintf(temp, msg_table[237], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in night for %s.
- clif_displaymessage(fd, temp);
- sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
- clif_displaymessage(fd, temp);
- } else {
- timer_data = get_timer(day_timer_tid);
- timer_data2 = get_timer(night_timer_tid);
- sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
- clif_displaymessage(fd, temp);
- if (timer_data->tick > timer_data2->tick)
- sprintf(temp, msg_table[239], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in daylight for %s.
- else
- sprintf(temp, msg_table[239], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in daylight for %s.
- clif_displaymessage(fd, temp);
- sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
- clif_displaymessage(fd, temp);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * @chardelitem <item_name_or_ID> <quantity> <player> (by [Yor]
- * removes <quantity> item from a character
- * item can be equiped or not.
- * Inspired from a old command created by RoVeRT
- *------------------------------------------
- */
-int atcommand_chardelitem(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- char character[100];
- char item_name[100];
- int i, number = 0, item_id, item_position, count;
- char output[200];
- struct item_data *item_data;
-
- memset(character, '\0', sizeof(character));
- memset(item_name, '\0', sizeof(item_name));
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message || sscanf(message, "%s %d %99[^\n]", item_name, &number, character) < 3 || number < 1) {
- clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>).");
- return -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) {
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
- item_position = pc_search_inventory(pl_sd, item_id);
- if (item_position >= 0) {
- count = 0;
- for(i = 0; i < number && item_position >= 0; i++) {
- pc_delitem(pl_sd, item_position, 1, 0);
- count++;
- item_position = pc_search_inventory(pl_sd, item_id); // for next loop
- }
- sprintf(output, msg_table[113], count); // %d item(s) removed by a GM.
- clif_displaymessage(pl_sd->fd, output);
- if (number == count)
- sprintf(output, msg_table[114], count); // %d item(s) removed from the player.
- else
- sprintf(output, msg_table[115], count, count, number); // %d item(s) removed. Player had only %d on %d items.
- clif_displaymessage(fd, output);
- } else {
- clif_displaymessage(fd, msg_table[116]); // Character does not have the item.
- 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;
- }
- } else {
- clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @jail <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_jail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
- int x, y;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @jail <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
- switch(rand() % 2) {
- case 0:
- x = 24;
- y = 75;
- break;
- default:
- x = 49;
- y = 75;
- break;
- }
- if (pc_setpos(pl_sd, "sec_pri.gat", x, y, 3) == 0) {
- pc_setsavepoint(pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus]
- clif_displaymessage(pl_sd->fd, msg_table[117]); // GM has send you in jails.
- clif_displaymessage(fd, msg_table[118]); // Player warped in jails.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- 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;
-}
-
-/*==========================================
- * @unjail/@discharge <char_name> by [Yor]
- * Special warp! No check with nowarp and nowarpto flag
- *------------------------------------------
- */
-int atcommand_unjail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data *pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @unjail/@discharge <char_name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
- if (pl_sd->bl.m != map_mapname2mapid("sec_pri.gat")) {
- clif_displaymessage(fd, msg_table[119]); // This player is not in jails.
- return -1;
- } else if (pc_setpos(pl_sd, "prontera.gat", 156, 191, 3) == 0) {
- pc_setsavepoint(pl_sd, "prontera.gat", 156, 191); // Save char respawn point in Prontera
- clif_displaymessage(pl_sd->fd, msg_table[120]); // GM has discharge you.
- clif_displaymessage(fd, msg_table[121]); // Player warped to Prontera.
- } else {
- clif_displaymessage(fd, msg_table[1]); // Map not found.
- 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;
-}
-
-/*==========================================
- * @disguise <mob_id> by [Valaris] (simplified by [Yor])
- *------------------------------------------
- */
-int atcommand_disguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int mob_id;
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(message);
-
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521)) { // monsters
- if (pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[227]); // Cannot wear disguise while riding a Peco.
- return -1;
- }
- sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- sd->disguise = mob_id;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[122]); // Disguise applied.
- } else {
- clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @undisguise by [Yor]
- *------------------------------------------
- */
-int atcommand_undisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if (sd->disguise) {
- clif_clearchar(&sd->bl, 9);
- sd->disguise = 0;
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[124]); // Undisguise applied.
- } else {
- clif_displaymessage(fd, msg_table[125]); // You're not disguised.
- return -1;
- }
-
- return 0;
-}
-
-/*==========================================
- * @broadcast by [Valaris]
- *------------------------------------------
- */
-int atcommand_broadcast(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @broadcast <message>).");
- return -1;
- }
-
- sprintf(output, "%s : %s", sd->status.name, message);
- intif_GMmessage(output, strlen(output) + 1, 0);
-
- return 0;
-}
-
-/*==========================================
- * @localbroadcast by [Valaris]
- *------------------------------------------
- */
-int atcommand_localbroadcast(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
-
- memset(output, '\0', sizeof(output));
-
- if (!message || !*message) {
- clif_displaymessage(fd, "Please, enter a message (usage: @localbroadcast <message>).");
- return -1;
- }
-
- sprintf(output, "%s : %s", sd->status.name, message);
-
- clif_GMmessage(&sd->bl, output, strlen(output) + 1, 1); // 1: ALL_SAMEMAP
-
- return 0;
-}
-
-/*==========================================
- * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work)
- *------------------------------------------
- */
-int atcommand_chardisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int mob_id;
- char character[100];
- char mob_name[100];
- struct map_session_data* pl_sd;
-
- memset(character, '\0', sizeof(character));
- memset(mob_name, '\0', sizeof(mob_name));
-
- if (!message || !*message || sscanf(message, "%s %99[^\n]", mob_name, character) < 2) {
- clif_displaymessage(fd, "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>).");
- return -1;
- }
-
- if ((mob_id = mobdb_searchname(mob_name)) == 0) // check name first (to avoid possible name begining by a number)
- mob_id = atoi(mob_name);
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can disguise only lower or same level
- if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
- (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
- (mob_id >= 813 && mob_id <= 834) || // NPC
- (mob_id > 1000 && mob_id < 1521)) { // monsters
- if (pc_isriding(pl_sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(fd, msg_table[228]); // Character cannot wear disguise while riding a Peco.
- return -1;
- }
- pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
- pl_sd->disguise = mob_id;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[140]); // Character's disguise applied.
- } else {
- clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
- 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;
-}
-
-/*==========================================
- * @charundisguise <character> by Kalaspuff (based off Yor's work)
- *------------------------------------------
- */
-int atcommand_charundisguise(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- struct map_session_data* pl_sd;
-
- memset(character, '\0', sizeof(character));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charundisguise <char name>).");
- return -1;
- }
-
- if ((pl_sd = map_nick2sd(character)) != NULL) {
- if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can undisguise only lower or same level
- if (pl_sd->disguise) {
- clif_clearchar(&pl_sd->bl, 9);
- pl_sd->disguise = 0;
- pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
- clif_displaymessage(fd, msg_table[141]); // Character's undisguise applied.
- } else {
- clif_displaymessage(fd, msg_table[142]); // Character is not disguised.
- 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;
-}
-
-/*==========================================
- * @email <actual@email> <new@email> by [Yor]
- *------------------------------------------
- */
-int atcommand_email(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char actual_email[100];
- char new_email[100];
-
- memset(actual_email, '\0', sizeof(actual_email));
- memset(new_email, '\0', sizeof(new_email));
-
- if (!message || !*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) {
- clif_displaymessage(fd, "Please enter 2 emails (usage: @email <actual@email> <new@email>).");
- return -1;
- }
-
- if (e_mail_check(actual_email) == 0) {
- clif_displaymessage(fd, msg_table[144]); // Invalid actual email. If you have default e-mail, give a@a.com.
- return -1;
- } else if (e_mail_check(new_email) == 0) {
- clif_displaymessage(fd, msg_table[145]); // Invalid new email. Please enter a real e-mail.
- return -1;
- } else if (strcmpi(new_email, "a@a.com") == 0) {
- clif_displaymessage(fd, msg_table[146]); // New email must be a real e-mail.
- return -1;
- } else if (strcmpi(actual_email, new_email) == 0) {
- clif_displaymessage(fd, msg_table[147]); // New email must be different of the actual e-mail.
- return -1;
- } else {
- chrif_changeemail(sd->status.account_id, actual_email, new_email);
- clif_displaymessage(fd, msg_table[148]); // Information sended to login-server via char-server.
- }
-
- return 0;
-}
-
-/*==========================================
- *@effect
- *------------------------------------------
- */
-int atcommand_effect(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd;
- int type = 0, flag = 0, i;
-
- if (!message || !*message || sscanf(message, "%d %d", &type,&flag) < 2) {
- clif_displaymessage(fd, "Please, enter at least a option (usage: @effect <type+>).");
- return -1;
- }
- if(flag <=0){
- clif_specialeffect(&sd->bl, type, flag);
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
- }
- else{
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- clif_specialeffect(&pl_sd->bl, type, flag);
- clif_displaymessage(pl_sd->fd, msg_table[229]); // Your effect has changed.
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * @charitemlist <character>: Displays the list of a player's items.
- *------------------------------------------
- */
-int
-atcommand_character_item_list(
- 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[100], output[200], equipstr[100], outputtmp[200];
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
- memset(equipstr, '\0', sizeof(equipstr));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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++) {
- if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.inventory[i].nameid)) != NULL) {
- counter = counter + pl_sd->status.inventory[i].amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if ((equip = pl_sd->status.inventory[i].equip)) {
- strcpy(equipstr, "| equiped: ");
- if (equip & 4)
- strcat(equipstr, "robe/gargment, ");
- if (equip & 8)
- strcat(equipstr, "left accessory, ");
- if (equip & 16)
- strcat(equipstr, "body/armor, ");
- if ((equip & 34) == 2)
- strcat(equipstr, "right hand, ");
- if ((equip & 34) == 32)
- strcat(equipstr, "left hand, ");
- if ((equip & 34) == 34)
- strcat(equipstr, "both hands, ");
- if (equip & 64)
- strcat(equipstr, "feet, ");
- if (equip & 128)
- strcat(equipstr, "right accessory, ");
- if ((equip & 769) == 1)
- strcat(equipstr, "lower head, ");
- if ((equip & 769) == 256)
- strcat(equipstr, "top head, ");
- if ((equip & 769) == 257)
- strcat(equipstr, "lower/top head, ");
- if ((equip & 769) == 512)
- strcat(equipstr, "mid head, ");
- if ((equip & 769) == 512)
- strcat(equipstr, "lower/mid head, ");
- if ((equip & 769) == 769)
- strcat(equipstr, "lower/mid/top head, ");
- // remove final ', '
- equipstr[strlen(equipstr) - 2] = '\0';
- } else
- memset(equipstr, '\0', sizeof(equipstr));
- if (sd->status.inventory[i].refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, pl_sd->status.inventory[i].refine, item_data->jname, pl_sd->status.inventory[i].refine, pl_sd->status.inventory[i].nameid, equipstr);
- else
- sprintf(output, "%d %s (%s, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, item_data->jname, pl_sd->status.inventory[i].nameid, equipstr);
- clif_displaymessage(fd, output);
- memset(output, '\0', sizeof(output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (pl_sd->status.inventory[i].card[j]) {
- if ((item_temp = itemdb_search(pl_sd->status.inventory[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 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;
-}
-
-/*==========================================
- * @charstoragelist <character>: Displays the items list of a player's storage.
- *------------------------------------------
- */
-int
-atcommand_character_storage_list(
- 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[100], output[200], outputtmp[200];
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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);
- memset(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 -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;
-}
-
-/*==========================================
- * @charcartlist <character>: Displays the items list of a player's cart.
- *------------------------------------------
- */
-int
-atcommand_character_cart_list(
- 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, count, counter, counter2;
- char character[100], output[200], outputtmp[200];
-
- memset(character, '\0', sizeof(character));
- memset(output, '\0', sizeof(output));
- memset(outputtmp, '\0', sizeof(outputtmp));
-
- if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
- clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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_CART; i++) {
- if (pl_sd->status.cart[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.cart[i].nameid)) != NULL) {
- counter = counter + pl_sd->status.cart[i].amount;
- count++;
- if (count == 1) {
- sprintf(output, "------ Cart items list of '%s' ------", pl_sd->status.name);
- clif_displaymessage(fd, output);
- }
- if (pl_sd->status.cart[i].refine)
- sprintf(output, "%d %s %+d (%s %+d, id: %d)", pl_sd->status.cart[i].amount, item_data->name, pl_sd->status.cart[i].refine, item_data->jname, pl_sd->status.cart[i].refine, pl_sd->status.cart[i].nameid);
- else
- sprintf(output, "%d %s (%s, id: %d)", pl_sd->status.cart[i].amount, item_data->name, item_data->jname, pl_sd->status.cart[i].nameid);
- clif_displaymessage(fd, output);
- memset(output, '\0', sizeof(output));
- counter2 = 0;
- for (j = 0; j < item_data->slot; j++) {
- if (pl_sd->status.cart[i].card[j]) {
- if ((item_temp = itemdb_search(pl_sd->status.cart[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 cart 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, 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;
-}
-
-/*==========================================
- * @killer by MouseJstr
- * enable killing players even when not in pvp
- *------------------------------------------
- */
-int
-atcommand_killer(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- sd->special_state.killer = !sd->special_state.killer;
-
- if(sd->special_state.killer)
- clif_displaymessage(fd, msg_table[241]);
- else
- clif_displaymessage(fd, msg_table[242]);
-
- return 0;
-}
-
-/*==========================================
- * @killable by MouseJstr
- * enable other people killing you
- *------------------------------------------
- */
-int
-atcommand_killable(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- sd->special_state.killable = !sd->special_state.killable;
-
- if(sd->special_state.killable)
- clif_displaymessage(fd, msg_table[242]);
- else
- clif_displaymessage(fd, msg_table[241]);
-
- return 0;
-}
-
-/*==========================================
- * @charkillable by MouseJstr
- * enable another player to be killed
- *------------------------------------------
- */
-int
-atcommand_charkillable(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
-
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
-
- pl_sd->special_state.killable = !pl_sd->special_state.killable;
-
- if(pl_sd->special_state.killable)
- clif_displaymessage(fd, "The player is now killable");
- else
- clif_displaymessage(fd, "The player is no longer killable");
-
- return 0;
-}
-
-
-/*==========================================
- * @skillon by MouseJstr
- * turn skills on for the map
- *------------------------------------------
- */
-int
-atcommand_skillon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- map[sd->bl.m].flag.noskill = 0;
- clif_displaymessage(fd, msg_table[244]);
- return 0;
-}
-
-/*==========================================
- * @skilloff by MouseJstr
- * Turn skills off on the map
- *------------------------------------------
- */
-int
-atcommand_skilloff(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- map[sd->bl.m].flag.noskill = 1;
- clif_displaymessage(fd, msg_table[243]);
- return 0;
-}
-
-/*==========================================
- * @npcmove by MouseJstr
- *
- * move a npc
- *------------------------------------------
- */
-int
-atcommand_npcmove(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char character[100];
- int x = 0, y = 0;
- struct npc_data *nd = 0;
-
- if( sd == NULL )
- return -1;
-
- if (!message || !*message)
- return -1;
-
- memset(character, '\0', sizeof character);
-
- if (sscanf(message, "%d %d %99[^\n]", &x, &y, character) < 4)
- return -1;
-
- nd=npc_name2id(character);
- if (nd==NULL)
- return -1;
-
- npc_enable(character, 0);
- nd->bl.x = x;
- nd->bl.y = y;
- npc_enable(character, 1);
-
- return 0;
-}
-
-/*==========================================
- * @addwarp by MouseJstr
- *
- * Create a new static warp point.
- *------------------------------------------
- */
-int
-atcommand_addwarp(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char w1[64], w3[64], w4[64];
- char map[30], output[200];
- int x,y,ret;
-
- if (!message || !*message)
- return -1;
-
- if (sscanf(message, "%99s %d %d[^\n]", map, &x, &y ) < 3)
- return -1;
-
- sprintf(w1,"%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y);
- sprintf(w3,"%s%d%d%d%d", map,sd->bl.x, sd->bl.y, x, y);
- sprintf(w4,"1,1,%s.gat,%d,%d", map, x, y);
-
- ret = npc_parse_warp(w1, "warp", w3, w4);
-
- sprintf(output, "New warp NPC => %s",w3);
-
- clif_displaymessage(fd, output);
-
- return ret;
-}
-
-/*==========================================
- * @follow by [MouseJstr]
- *
- * Follow a player .. staying no more then 5 spaces away
- *------------------------------------------
- */
-int
-atcommand_follow(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) != NULL)
- pc_follow(sd, pl_sd->bl.id);
- else
- return 1;
- return 0;
-}
-
-
-/*==========================================
- * @chareffect by [MouseJstr]
- *
- * Create a effect localized on another character
- *------------------------------------------
- */
-int
-atcommand_chareffect(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;
-
- if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) {
- clif_displaymessage(fd, "usage: @chareffect <type+> <target>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) target)) == NULL)
- return -1;
-
- clif_specialeffect(&pl_sd->bl, type, 0);
- clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
-
- return 0;
-}
-/*==========================================
- * @dropall by [MouseJstr]
- *
- * Drop all your possession on the ground
- *------------------------------------------
- */
-int
-atcommand_dropall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount) {
- if(sd->status.inventory[i].equip != 0)
- pc_unequipitem(sd, i, 0);
- pc_dropitem(sd, i, sd->status.inventory[i].amount);
- }
- }
- return 0;
-}
-/*==========================================
- * @chardropall by [MouseJstr]
- *
- * Throw all the characters possessions on the ground. Normally
- * done in response to them being disrespectful of a GM
- *------------------------------------------
- */
-int
-atcommand_chardropall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (pl_sd->status.inventory[i].amount) {
- if(pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem(pl_sd, i, 0);
- pc_dropitem(pl_sd, i, pl_sd->status.inventory[i].amount);
- }
- }
-
- clif_displaymessage(pl_sd->fd, "Ever play 52 card pickup?");
- clif_displaymessage(fd, "It is done");
- //clif_displaymessage(fd, "It is offical.. your a jerk");
-
- return 0;
-}
-/*==========================================
- * @storeall by [MouseJstr]
- *
- * Put everything into storage to simplify your inventory to make
- * debugging easie
- *------------------------------------------
- */
-int
-atcommand_storeall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- if (storage_storageopen(sd) == 1) {
- clif_displaymessage(fd, "run this command again..");
- return 0;
- }
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount) {
- if(sd->status.inventory[i].equip != 0)
- pc_unequipitem(sd, i, 0);
- storage_storageadd(sd, i, sd->status.inventory[i].amount);
- }
- }
- storage_storageclose(sd);
-
- clif_displaymessage(fd, "It is done");
- return 0;
-}
-/*==========================================
- * @charstoreall by [MouseJstr]
- *
- * A way to screw with players who piss you off
- *------------------------------------------
- */
-int
-atcommand_charstoreall(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i;
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) == NULL)
- return -1;
-
- if (storage_storageopen(pl_sd) == 1) {
- clif_displaymessage(fd, "Had to open the characters storage window...");
- clif_displaymessage(fd, "run this command again..");
- return 0;
- }
- for (i = 0; i < MAX_INVENTORY; i++) {
- if (pl_sd->status.inventory[i].amount) {
- if(pl_sd->status.inventory[i].equip != 0)
- pc_unequipitem(pl_sd, i, 0);
- storage_storageadd(pl_sd, i, sd->status.inventory[i].amount);
- }
- }
- storage_storageclose(pl_sd);
-
- clif_displaymessage(pl_sd->fd, "Everything you own has been put away for safe keeping.");
- clif_displaymessage(pl_sd->fd, "go to the nearest kafka to retrieve it..");
- clif_displaymessage(pl_sd->fd, " -- the management");
-
- clif_displaymessage(fd, "It is done");
-
- return 0;
-}
-/*==========================================
- * @skillid by [MouseJstr]
- *
- * lookup a skill by name
- *------------------------------------------
- */
-int
-atcommand_skillid(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int skillen = 0, idx = 0;
- if (!message || !*message)
- return -1;
- skillen = strlen(message);
- while (skill_names[idx].id != 0) {
- if ((strnicmp(skill_names[idx].name, message, skillen) == 0) ||
- (strnicmp(skill_names[idx].desc, message, skillen) == 0)) {
- char output[255];
- sprintf(output, "skill %d: %s", skill_names[idx].id, skill_names[idx].desc);
- clif_displaymessage(fd, output);
- }
- idx++;
- }
- return 0;
-}
-/*==========================================
- * @useskill by [MouseJstr]
- *
- * A way of using skills without having to find them in the skills menu
- *------------------------------------------
- */
-int
-atcommand_useskill(const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- int skillnum;
- int skilllv;
- int inf;
- char target[255];
-
- if (!message || !*message)
- return -1;
- if(sscanf(message, "%d %d %s", &skillnum, &skilllv, target) != 3) {
- clif_displaymessage(fd, "Usage: @useskill <skillnum> <skillv> <target>");
- return -1;
- }
- if((pl_sd=map_nick2sd(target)) == NULL) {
- return -1;
- }
-
- inf = skill_get_inf(skillnum);
-
- if ((inf == 2) || (inf == 1))
- skill_use_pos(sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv);
- else
- skill_use_id(sd, pl_sd->bl.id, skillnum, skilllv);
-
- return 0;
-}
-/*==========================================
- * It is made to rain.
- *------------------------------------------
- */
-int
-atcommand_rain(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 161;
- nullpo_retr(-1, sd);
- if (effno < 0 || map[sd->bl.m].flag.rain)
- return -1;
-
- map[sd->bl.m].flag.rain=1;
- clif_specialeffect(&sd->bl,effno,2);
- return 0;
-}
-/*==========================================
- * It is made to snow.
- *------------------------------------------
- */
-int
-atcommand_snow(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 162;
- nullpo_retr(-1, sd);
- if (effno < 0 || map[sd->bl.m].flag.snow)
- return -1;
-
- map[sd->bl.m].flag.snow=1;
- clif_specialeffect(&sd->bl,effno,2);
- return 0;
-}
-
-/*==========================================
- * Cherry tree snowstorm is made to fall. (Sakura)
- *------------------------------------------
- */
-int
-atcommand_sakura(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 163;
- nullpo_retr(-1, sd);
- if (effno < 0 || map[sd->bl.m].flag.sakura)
- return -1;
-
- map[sd->bl.m].flag.sakura=1;
- clif_specialeffect(&sd->bl,effno,2);
- return 0;
-}
-
-/*==========================================
- * Fog hangs over.
- *------------------------------------------
- */
-int
-atcommand_fog(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 233;
- nullpo_retr(-1, sd);
- if (effno < 0 || map[sd->bl.m].flag.fog)
- return -1;
-
- map[sd->bl.m].flag.fog=1;
- clif_specialeffect(&sd->bl,effno,2);
-
- return 0;
-}
-
-/*==========================================
- * Fallen leaves fall.
- *------------------------------------------
- */
-int
-atcommand_leaves(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int effno = 0;
- effno = 333;
- nullpo_retr(-1, sd);
- if (effno < 0 || map[sd->bl.m].flag.leaves)
- return -1;
-
- map[sd->bl.m].flag.leaves=1;
- clif_specialeffect(&sd->bl,effno,2);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int
-atcommand_summon(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[100];
- int mob_id = 0;
- int x = 0;
- int y = 0;
- int id = 0;
- struct mob_data *md;
- unsigned int tick=gettick();
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message)
- return -1;
- if (sscanf(message, "%99s", name) < 1)
- return -1;
-
- if ((mob_id = atoi(name)) == 0)
- mob_id = mobdb_searchname(name);
- if(mob_id == 0)
- return -1;
-
- x = sd->bl.x + (rand() % 10 - 5);
- y = sd->bl.y + (rand() % 10 - 5);
-
- id = mob_once_spawn(sd,"this", x, y, "--ja--", mob_id, 1, "");
- if((md=(struct mob_data *)map_id2bl(id))){
- md->master_id=sd->bl.id;
- md->state.special_mob_ai=1;
- md->mode=mob_db[md->class].mode|0x04;
- md->deletetimer=add_timer(tick+60000,mob_timer_delete,id,0);
- clif_misceffect2(&md->bl,344);
- }
- clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,x,y,tick);
-
- return 0;
-}
-
-
-/*==========================================
- * @adjcmdlvl by [MouseJstr]
- *
- * Temp adjust the GM level required to use a GM command
- *
- * Used during beta testing to allow players to use GM commands
- * for short periods of time
- *------------------------------------------
- */
-int
-atcommand_adjcmdlvl(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int i, newlev;
- char cmd[100];
-
- if (!message || !*message || sscanf(message, "%d %s", &newlev, cmd) != 2) {
- clif_displaymessage(fd, "usage: @adjcmdlvl <lvl> <command>.");
- return -1;
- }
-
- for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (strcmpi(cmd, atcommand_info[i].command+1) == 0) {
- atcommand_info[i].level = newlev;
- clif_displaymessage(fd, "@command level changed.");
- return 0;
- }
-
- clif_displaymessage(fd, "@command not found.");
- return -1;
-}
-
-/*==========================================
- * @adjgmlvl by [MouseJstr]
- *
- * Create a temp GM
- *
- * Used during beta testing to allow players to use GM commands
- * for short periods of time
- *------------------------------------------
- */
-int
-atcommand_adjgmlvl(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- int newlev;
- char user[100];
- struct map_session_data *pl_sd;
-
- if (!message || !*message || sscanf(message, "%d %[^\r\n]", &newlev, user) != 2) {
- clif_displaymessage(fd, "usage: @adjgmlvl <lvl> <user>.");
- return -1;
- }
-
- if((pl_sd=map_nick2sd((char *) user)) == NULL)
- return -1;
-
- pc_set_gm_level(pl_sd->status.account_id, newlev);
-
- return 0;
-}
-
-
-/*==========================================
- * @trade by [MouseJstr]
- *
- * Open a trade window with a remote player
- *
- * If I have to jump to a remote player one more time, I am
- * gonna scream!
- *------------------------------------------
- */
-int
-atcommand_trade(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
-
- if (!message || !*message)
- return -1;
- if((pl_sd=map_nick2sd((char *) message)) != NULL) {
- trade_traderequest(sd, pl_sd->bl.id);
- return 0;
- }
- return -1;
-}
-
-/*==========================================
- * @setbattleflag by [MouseJstr]
- *
- * set a battle_config flag without having to reboot
- */
-int
-atcommand_setbattleflag(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char flag[128], value[128];
-
- if (!message || !*message || sscanf(message, "%s %s", flag, value) != 2) {
- clif_displaymessage(fd, "usage: @setbattleflag <flag> <value>.");
- return -1;
- }
-
- if (battle_set_value(flag, value) == 0)
- clif_displaymessage(fd, "unknown battle_config flag");
- else
- clif_displaymessage(fd, "battle_config set as requested");
-
- return 0;
-}
-
-
-/*===========================
- * @unmute [Valaris]
- *===========================
-*/
-int atcommand_unmute(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- struct map_session_data *pl_sd = NULL;
- if (!message || !*message)
- return -1;
-
- if((pl_sd=map_nick2sd((char *) message)) != NULL) {
- if(pl_sd->sc_data[SC_NOCHAT].timer!=-1) {
- skill_status_change_end(&pl_sd->bl,SC_NOCHAT,-1);
- clif_displaymessage(sd->fd,"Player unmuted");
- }
- else
- clif_displaymessage(sd->fd,"Player is not muted");
- }
-
- return 0;
-}
-
-/*==========================================
- * @uptime by MC Cameri
- *------------------------------------------
- */
-int
-atcommand_uptime(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char output[200];
- long seconds = 0, day = 24*60*60, hour = 60*60,
- minute = 60, days = 0, hours = 0, minutes = 0;
-
- seconds = (gettick()-ticks)/CLOCKS_PER_SEC;
- 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;
-
- snprintf(output, sizeof(output), msg_table[245], days, hours, minutes, seconds);
- clif_displaymessage(fd,output);
- return 0;
-}
-
-/*==========================================
- * @changesex <sex>
- * => Changes one's sex. Argument sex can be
- * 0 or 1, m or f, male or female.
- *------------------------------------------
- */
-int
-atcommand_changesex(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
-
-// char sex[200], output[200];
-// int isex = (sd->status.sex+1)%2;
-/*
- if (!message || !*message)
- return -1;
- memset(sex, '\0', sizeof(sex));
- if(sscanf(message, "%99[^\n]", sex) < 1)
- return -1;
- str_lower(sex);
- if (strcmp(sex,"0") == 0 || strcmp(sex,"f") == 0 || strcmp(sex,"female") == 0) {
- isex = 0;
- } else if (strcmp(sex,"1") == 0 || strcmp(sex,"m") == 0 || strcmp(sex,"male") == 0) {
- isex = 1;
- } else {
- clif_displaymessage(fd,msg_table[456]);
- return 0;
- }
-*/
-// if (isex != sd->sex) {
- chrif_changesex(sd->status.account_id, ((sd->status.sex+1)%2));
-// } else {
-// sprintf(output,msg_table[460],(isex == 0)?"female":"male");
-// clif_displaymessage(fd,output);
-// }
- return 0;
-}
-
-#ifndef TXT_ONLY /* Begin SQL-Only commands */
-
-/*==========================================
- * Mail System commands by [Valaris]
- *------------------------------------------
- */
-int atcommand_listmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if(strlen(command)==12)
- mail_check(sd,3);
- else if(strlen(command)==9)
- mail_check(sd,2);
- else
- mail_check(sd,1);
- return 0;
-}
-
-int atcommand_readmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(sd->fd,"You must specify a message number.");
- return 0;
- }
-
- if(strlen(command)==11)
- mail_delete(sd,atoi(message));
- else
- mail_read(sd,atoi(message));
-
- return 0;
-}
-
-int atcommand_sendmail(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- char name[24],text[80];
-
- if(!battle_config.mail_system)
- return 0;
-
- nullpo_retr(-1, sd);
-
- if (!message || !*message) {
- clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
- return 0;
- }
-
- if ((sscanf(message, "\"%[^\"]\" %79[^\n]", name, text) < 2) &&
- (sscanf(message, "%23s %79[^\n]", name, text) < 2)) {
- clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
- return 0;
- }
-
- if(strlen(command)==17)
- mail_send(sd,name,text,1);
- else
- mail_send(sd,name,text,0);
-
- return 0;
-}
-
-/*==========================================
- * Refresh online command for SQL [Valaris]
- * Will refresh and check online column of
- * players and set correctly.
- *------------------------------------------
- */
-int atcommand_refreshonline(
- const int fd, struct map_session_data* sd,
- const char* command, const char* message)
-{
- nullpo_retr(-1, sd);
-
- char_online_check();
-
- return 0;
-}
-
-#endif /* end sql only */
+// $Id: atcommand.c 148 2004-09-30 14:05:37Z MouseJstr $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "socket.h"
+#include "timer.h"
+#include "nullpo.h"
+
+#include "clif.h"
+#include "chrif.h"
+#include "intif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "pc.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 "core.h"
+
+#ifndef TXT_ONLY
+#include "mail.h"
+#endif
+
+#define STATE_BLIND 0x10
+
+static char command_symbol = '@'; // first char of the commands (by [Yor])
+
+static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
+
+#define ATCOMMAND_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
+ATCOMMAND_FUNC(broadcast);
+ATCOMMAND_FUNC(localbroadcast);
+ATCOMMAND_FUNC(rurap);
+ATCOMMAND_FUNC(rura);
+ATCOMMAND_FUNC(where);
+ATCOMMAND_FUNC(jumpto);
+ATCOMMAND_FUNC(jump);
+ATCOMMAND_FUNC(who);
+ATCOMMAND_FUNC(who2);
+ATCOMMAND_FUNC(who3);
+ATCOMMAND_FUNC(whomap);
+ATCOMMAND_FUNC(whomap2);
+ATCOMMAND_FUNC(whomap3);
+ATCOMMAND_FUNC(whogm); // by Yor
+ATCOMMAND_FUNC(save);
+ATCOMMAND_FUNC(load);
+ATCOMMAND_FUNC(speed);
+ATCOMMAND_FUNC(storage);
+ATCOMMAND_FUNC(guildstorage);
+ATCOMMAND_FUNC(option);
+ATCOMMAND_FUNC(hide);
+ATCOMMAND_FUNC(jobchange);
+ATCOMMAND_FUNC(die);
+ATCOMMAND_FUNC(kill);
+ATCOMMAND_FUNC(alive);
+ATCOMMAND_FUNC(kami);
+ATCOMMAND_FUNC(heal);
+ATCOMMAND_FUNC(item);
+ATCOMMAND_FUNC(item2);
+ATCOMMAND_FUNC(itemreset);
+ATCOMMAND_FUNC(itemcheck);
+ATCOMMAND_FUNC(baselevelup);
+ATCOMMAND_FUNC(joblevelup);
+ATCOMMAND_FUNC(help);
+ATCOMMAND_FUNC(gm);
+ATCOMMAND_FUNC(pvpoff);
+ATCOMMAND_FUNC(pvpon);
+ATCOMMAND_FUNC(gvgoff);
+ATCOMMAND_FUNC(gvgon);
+ATCOMMAND_FUNC(model);
+ATCOMMAND_FUNC(go);
+ATCOMMAND_FUNC(monster);
+ATCOMMAND_FUNC(spawn);
+ATCOMMAND_FUNC(killmonster);
+ATCOMMAND_FUNC(killmonster2);
+ATCOMMAND_FUNC(refine);
+ATCOMMAND_FUNC(produce);
+ATCOMMAND_FUNC(memo);
+ATCOMMAND_FUNC(gat);
+ATCOMMAND_FUNC(packet);
+ATCOMMAND_FUNC(statuspoint);
+ATCOMMAND_FUNC(skillpoint);
+ATCOMMAND_FUNC(zeny);
+ATCOMMAND_FUNC(param);
+ATCOMMAND_FUNC(guildlevelup);
+ATCOMMAND_FUNC(makeegg);
+ATCOMMAND_FUNC(hatch);
+ATCOMMAND_FUNC(petfriendly);
+ATCOMMAND_FUNC(pethungry);
+ATCOMMAND_FUNC(petrename);
+ATCOMMAND_FUNC(charpetrename); // by Yor
+ATCOMMAND_FUNC(recall);
+ATCOMMAND_FUNC(recallall);
+ATCOMMAND_FUNC(character_job);
+ATCOMMAND_FUNC(revive);
+ATCOMMAND_FUNC(character_stats);
+ATCOMMAND_FUNC(character_stats_all);
+ATCOMMAND_FUNC(character_option);
+ATCOMMAND_FUNC(character_save);
+ATCOMMAND_FUNC(night);
+ATCOMMAND_FUNC(day);
+ATCOMMAND_FUNC(doom);
+ATCOMMAND_FUNC(doommap);
+ATCOMMAND_FUNC(raise);
+ATCOMMAND_FUNC(raisemap);
+ATCOMMAND_FUNC(character_baselevel);
+ATCOMMAND_FUNC(character_joblevel);
+ATCOMMAND_FUNC(kick);
+ATCOMMAND_FUNC(kickall);
+ATCOMMAND_FUNC(allskill);
+ATCOMMAND_FUNC(questskill);
+ATCOMMAND_FUNC(charquestskill);
+ATCOMMAND_FUNC(lostskill);
+ATCOMMAND_FUNC(charlostskill);
+ATCOMMAND_FUNC(spiritball);
+ATCOMMAND_FUNC(party);
+ATCOMMAND_FUNC(guild);
+ATCOMMAND_FUNC(charskreset);
+ATCOMMAND_FUNC(charstreset);
+ATCOMMAND_FUNC(charreset);
+ATCOMMAND_FUNC(charstpoint);
+ATCOMMAND_FUNC(charmodel);
+ATCOMMAND_FUNC(charskpoint);
+ATCOMMAND_FUNC(charzeny);
+ATCOMMAND_FUNC(agitstart);
+ATCOMMAND_FUNC(agitend);
+ATCOMMAND_FUNC(reloaditemdb);
+ATCOMMAND_FUNC(reloadmobdb);
+ATCOMMAND_FUNC(reloadskilldb);
+#ifndef TXT_ONLY
+ATCOMMAND_FUNC(rehash);// by Fr3DBr
+#else /* TXT_ONLY */
+ATCOMMAND_FUNC(reloadscript);
+#endif /* TXT_ONLY */
+ATCOMMAND_FUNC(reloadgmdb); // by Yor
+ATCOMMAND_FUNC(mapexit);
+ATCOMMAND_FUNC(idsearch);
+ATCOMMAND_FUNC(mapinfo);
+ATCOMMAND_FUNC(dye); //** by fritz
+ATCOMMAND_FUNC(hair_style); //** by fritz
+ATCOMMAND_FUNC(hair_color); //** by fritz
+ATCOMMAND_FUNC(stat_all); //** by fritz
+ATCOMMAND_FUNC(char_change_sex); // by Yor
+ATCOMMAND_FUNC(char_block); // by Yor
+ATCOMMAND_FUNC(char_ban); // by Yor
+ATCOMMAND_FUNC(char_unblock); // by Yor
+ATCOMMAND_FUNC(char_unban); // by Yor
+ATCOMMAND_FUNC(mount_peco); // by Valaris
+ATCOMMAND_FUNC(char_mount_peco); // by Yor
+ATCOMMAND_FUNC(guildspy); // [Syrus22]
+ATCOMMAND_FUNC(partyspy); // [Syrus22]
+ATCOMMAND_FUNC(repairall); // [Valaris]
+ATCOMMAND_FUNC(guildrecall); // by Yor
+ATCOMMAND_FUNC(partyrecall); // by Yor
+//ATCOMMAND_FUNC(nuke); // [Valaris]
+ATCOMMAND_FUNC(enablenpc);
+ATCOMMAND_FUNC(disablenpc);
+ATCOMMAND_FUNC(servertime); // by Yor
+ATCOMMAND_FUNC(chardelitem); // by Yor
+ATCOMMAND_FUNC(jail); // by Yor
+ATCOMMAND_FUNC(unjail); // by Yor
+ATCOMMAND_FUNC(disguise); // [Valaris]
+ATCOMMAND_FUNC(undisguise); // by Yor
+ATCOMMAND_FUNC(chardisguise); // Kalaspuff
+ATCOMMAND_FUNC(charundisguise); // Kalaspuff
+ATCOMMAND_FUNC(email); // by Yor
+ATCOMMAND_FUNC(effect);//by Apple
+ATCOMMAND_FUNC(character_item_list); // by Yor
+ATCOMMAND_FUNC(character_storage_list); // by Yor
+ATCOMMAND_FUNC(character_cart_list); // by Yor
+ATCOMMAND_FUNC(addwarp); // by MouseJstr
+ATCOMMAND_FUNC(follow); // by MouseJstr
+ATCOMMAND_FUNC(skillon); // by MouseJstr
+ATCOMMAND_FUNC(skilloff); // by MouseJstr
+ATCOMMAND_FUNC(killer); // by MouseJstr
+ATCOMMAND_FUNC(npcmove); // by MouseJstr
+ATCOMMAND_FUNC(killable); // by MouseJstr
+ATCOMMAND_FUNC(charkillable); // by MouseJstr
+ATCOMMAND_FUNC(chareffect); // by MouseJstr
+ATCOMMAND_FUNC(chardye); // by MouseJstr
+ATCOMMAND_FUNC(charhairstyle); // by MouseJstr
+ATCOMMAND_FUNC(charhaircolor); // by MouseJstr
+ATCOMMAND_FUNC(dropall); // by MouseJstr
+ATCOMMAND_FUNC(chardropall); // by MouseJstr
+ATCOMMAND_FUNC(storeall); // by MouseJstr
+ATCOMMAND_FUNC(charstoreall); // by MouseJstr
+ATCOMMAND_FUNC(skillid); // by MouseJstr
+ATCOMMAND_FUNC(useskill); // by MouseJstr
+ATCOMMAND_FUNC(summon);
+ATCOMMAND_FUNC(rain);
+ATCOMMAND_FUNC(snow);
+ATCOMMAND_FUNC(sakura);
+ATCOMMAND_FUNC(fog);
+ATCOMMAND_FUNC(leaves);
+ATCOMMAND_FUNC(adjgmlvl); // by MouseJstr
+ATCOMMAND_FUNC(adjcmdlvl); // by MouseJstr
+ATCOMMAND_FUNC(trade); // by MouseJstr
+ATCOMMAND_FUNC(send); // by davidsiaw
+ATCOMMAND_FUNC(setbattleflag); // by MouseJstr
+ATCOMMAND_FUNC(unmute); // [Valaris]
+ATCOMMAND_FUNC(uptime); // by MC Cameri
+ATCOMMAND_FUNC(changesex); // by MC Cameri
+
+#ifndef TXT_ONLY
+ATCOMMAND_FUNC(checkmail); // [Valaris]
+ATCOMMAND_FUNC(listmail); // [Valaris]
+ATCOMMAND_FUNC(listnewmail); // [Valaris]
+ATCOMMAND_FUNC(readmail); // [Valaris]
+ATCOMMAND_FUNC(sendmail); // [Valaris]
+ATCOMMAND_FUNC(sendprioritymail); // [Valaris]
+ATCOMMAND_FUNC(deletemail); // [Valaris]
+ATCOMMAND_FUNC(sound); // [Valaris]
+ATCOMMAND_FUNC(refreshonline); // [Valaris]
+#endif /* TXT_ONLY */
+
+/*==========================================
+ *AtCommandInfo atcommand_info[]\‘¢‘Ì‚Ì’è‹`
+ *------------------------------------------
+ */
+
+// First char of commands is configured in atcommand_athena.conf. Leave @ in this list for default value.
+// to set default level, read atcommand_athena.conf first please.
+static AtCommandInfo atcommand_info[] = {
+ { AtCommand_RuraP, "@rura+", 60, atcommand_rurap },
+ { AtCommand_RuraP, "@charwarp", 60, atcommand_rurap },
+ { AtCommand_Rura, "@rura", 40, atcommand_rura },
+ { AtCommand_Warp, "@warp", 40, atcommand_rura },
+ { AtCommand_Where, "@where", 1, atcommand_where },
+ { AtCommand_JumpTo, "@jumpto", 20, atcommand_jumpto }, // + /shift
+ { AtCommand_JumpTo, "@warpto", 20, atcommand_jumpto },
+ { AtCommand_JumpTo, "@goto", 20, atcommand_jumpto },
+ { AtCommand_Jump, "@jump", 40, atcommand_jump },
+ { AtCommand_Who, "@who", 20, atcommand_who },
+ { AtCommand_Who, "@whois", 20, atcommand_who },
+ { AtCommand_Who2, "@who2", 20, atcommand_who2 },
+ { AtCommand_Who3, "@who3", 20, atcommand_who3 },
+ { AtCommand_WhoMap, "@whomap", 20, atcommand_whomap },
+ { AtCommand_WhoMap2, "@whomap2", 20, atcommand_whomap2 },
+ { AtCommand_WhoMap3, "@whomap3", 20, atcommand_whomap3 },
+ { AtCommand_WhoGM, "@whogm", 20, atcommand_whogm }, // by Yor
+ { AtCommand_Save, "@save", 40, atcommand_save },
+ { AtCommand_Load, "@return", 40, atcommand_load },
+ { AtCommand_Load, "@load", 40, atcommand_load },
+ { AtCommand_Speed, "@speed", 40, atcommand_speed },
+ { AtCommand_Storage, "@storage", 1, atcommand_storage },
+ { AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage },
+ { AtCommand_Option, "@option", 40, atcommand_option },
+ { AtCommand_Hide, "@hide", 40, atcommand_hide }, // + /hide
+ { AtCommand_JobChange, "@jobchange", 40, atcommand_jobchange },
+ { AtCommand_JobChange, "@job", 40, atcommand_jobchange },
+ { AtCommand_Die, "@die", 1, atcommand_die },
+ { AtCommand_Kill, "@kill", 60, atcommand_kill },
+ { AtCommand_Alive, "@alive", 60, atcommand_alive },
+ { AtCommand_Kami, "@kami", 40, atcommand_kami },
+ { AtCommand_KamiB, "@kamib", 40, atcommand_kami },
+ { AtCommand_Heal, "@heal", 40, atcommand_heal },
+ { AtCommand_Item, "@item", 60, atcommand_item },
+ { AtCommand_Item2, "@item2", 60, atcommand_item2 },
+ { AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset },
+ { AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck },
+ { AtCommand_BaseLevelUp, "@lvup", 60, atcommand_baselevelup },
+ { AtCommand_BaseLevelUp, "@blevel", 60, atcommand_baselevelup },
+ { AtCommand_BaseLevelUp, "@baselvlup", 60, atcommand_baselevelup },
+ { AtCommand_JobLevelUp, "@jlevel", 60, atcommand_joblevelup },
+ { AtCommand_JobLevelUp, "@joblvup", 60, atcommand_joblevelup },
+ { AtCommand_JobLevelUp, "@joblvlup", 60, atcommand_joblevelup },
+ { AtCommand_H, "@h", 20, atcommand_help },
+ { AtCommand_Help, "@help", 20, atcommand_help },
+ { AtCommand_GM, "@gm", 100, atcommand_gm },
+ { AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff },
+ { AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon },
+ { AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff },
+ { AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff },
+ { AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon },
+ { AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon },
+ { AtCommand_Model, "@model", 20, atcommand_model },
+ { AtCommand_Go, "@go", 10, atcommand_go },
+ { AtCommand_Spawn, "@monster", 50, atcommand_spawn },
+ { AtCommand_Spawn, "@spawn", 50, atcommand_spawn },
+// { AtCommand_Spawn, "@summon", 50, atcommand_spawn },
+ { AtCommand_Monster, "@monster2", 50, atcommand_monster },
+ { AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster },
+ { AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 },
+ { AtCommand_Refine, "@refine", 60, atcommand_refine },
+ { AtCommand_Produce, "@produce", 60, atcommand_produce },
+ { AtCommand_Memo, "@memo", 40, atcommand_memo },
+ { AtCommand_GAT, "@gat", 99, atcommand_gat }, // debug function
+ { AtCommand_Packet, "@packet", 99, atcommand_packet }, // debug function
+ { AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint },
+ { AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint },
+ { AtCommand_Zeny, "@zeny", 60, atcommand_zeny },
+ { AtCommand_Strength, "@str", 60, atcommand_param },
+ { AtCommand_Agility, "@agi", 60, atcommand_param },
+ { AtCommand_Vitality, "@vit", 60, atcommand_param },
+ { AtCommand_Intelligence, "@int", 60, atcommand_param },
+ { AtCommand_Dexterity, "@dex", 60, atcommand_param },
+ { AtCommand_Luck, "@luk", 60, atcommand_param },
+ { AtCommand_GuildLevelUp, "@guildlvup", 60, atcommand_guildlevelup },
+ { AtCommand_GuildLevelUp, "@guildlvlup", 60, atcommand_guildlevelup },
+ { AtCommand_MakeEgg, "@makeegg", 60, atcommand_makeegg },
+ { AtCommand_Hatch, "@hatch", 60, atcommand_hatch },
+ { AtCommand_PetFriendly, "@petfriendly", 40, atcommand_petfriendly },
+ { AtCommand_PetHungry, "@pethungry", 40, atcommand_pethungry },
+ { AtCommand_PetRename, "@petrename", 1, atcommand_petrename },
+ { AtCommand_CharPetRename, "@charpetrename", 50, atcommand_charpetrename }, // by Yor
+ { AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall
+ { AtCommand_CharacterJob, "@charjob", 60, atcommand_character_job },
+ { AtCommand_CharacterJob, "@charjobchange", 60, atcommand_character_job },
+ { AtCommand_Revive, "@revive", 60, atcommand_revive },
+ { AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats },
+ { AtCommand_CharacterStatsAll, "@charstatsall", 40, atcommand_character_stats_all },
+ { AtCommand_CharacterOption, "@charoption", 60, atcommand_character_option },
+ { AtCommand_CharacterSave, "@charsave", 60, atcommand_character_save },
+ { AtCommand_Night, "@night", 80, atcommand_night },
+ { AtCommand_Day, "@day", 80, atcommand_day },
+ { AtCommand_Doom, "@doom", 80, atcommand_doom },
+ { AtCommand_DoomMap, "@doommap", 80, atcommand_doommap },
+ { AtCommand_Raise, "@raise", 80, atcommand_raise },
+ { AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap },
+ { AtCommand_CharacterBaseLevel, "@charbaselvl", 60, atcommand_character_baselevel },
+ { AtCommand_CharacterJobLevel, "@charjlvl", 60, atcommand_character_joblevel },
+ { AtCommand_Kick, "@kick", 20, atcommand_kick }, // + right click menu for GM "(name) force to quit"
+ { AtCommand_KickAll, "@kickall", 99, atcommand_kickall },
+ { AtCommand_AllSkill, "@allskill", 60, atcommand_allskill },
+ { AtCommand_AllSkill, "@allskills", 60, atcommand_allskill },
+ { AtCommand_AllSkill, "@skillall", 60, atcommand_allskill },
+ { AtCommand_AllSkill, "@skillsall", 60, atcommand_allskill },
+ { AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill },
+ { AtCommand_CharQuestSkill, "@charquestskill", 60, atcommand_charquestskill },
+ { AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill },
+ { AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill },
+ { AtCommand_SpiritBall, "@spiritball", 40, atcommand_spiritball },
+ { AtCommand_Party, "@party", 1, atcommand_party },
+ { AtCommand_Guild, "@guild", 50, atcommand_guild },
+ { AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart },
+ { AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend },
+ { AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit },
+ { AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch },
+ { AtCommand_MapMove, "@mapmove", 40, atcommand_rura }, // /mm command
+ { AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast }, // /b and /nb command
+ { AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast }, // /lb and /nlb command
+ { AtCommand_RecallAll, "@recallall", 80, atcommand_recallall },
+ { AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset },
+ { AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset },
+ { AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb }, // admin command
+ { AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb }, // admin command
+ { AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb }, // admin command
+#ifndef TXT_ONLY
+ { AtCommand_Rehash, "@rehash", 99, atcommand_rehash }, // admin command
+#else /* TXT_ONLY */
+ { AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript }, // admin command
+#endif /* TXT_ONLY */
+ { AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb }, // admin command
+ { AtCommand_CharReset, "@charreset", 60, atcommand_charreset },
+ { AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel },
+ { AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint },
+ { AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint },
+ { AtCommand_CharZeny, "@charzeny", 60, atcommand_charzeny },
+ { AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo },
+ { AtCommand_Dye, "@dye", 40, atcommand_dye }, // by fritz
+ { AtCommand_Dye, "@ccolor", 40, atcommand_dye }, // by fritz
+ { AtCommand_Hstyle, "@hairstyle", 40, atcommand_hair_style }, // by fritz
+ { AtCommand_Hstyle, "@hstyle", 40, atcommand_hair_style }, // by fritz
+ { AtCommand_Hcolor, "@haircolor", 40, atcommand_hair_color }, // by fritz
+ { AtCommand_Hcolor, "@hcolor", 40, atcommand_hair_color }, // by fritz
+ { AtCommand_StatAll, "@statall", 60, atcommand_stat_all }, // by fritz
+ { AtCommand_StatAll, "@statsall", 60, atcommand_stat_all },
+ { AtCommand_StatAll, "@allstats", 60, atcommand_stat_all }, // by fritz
+ { AtCommand_StatAll, "@allstat", 60, atcommand_stat_all }, // by fritz
+ { AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex }, // by Yor
+ { AtCommand_CharBlock, "@block", 60, atcommand_char_block }, // by Yor
+ { AtCommand_CharBlock, "@charblock", 60, atcommand_char_block }, // by Yor
+ { AtCommand_CharBan, "@ban", 60, atcommand_char_ban }, // by Yor
+ { AtCommand_CharBan, "@banish", 60, atcommand_char_ban }, // by Yor
+ { AtCommand_CharBan, "@charban", 60, atcommand_char_ban }, // by Yor
+ { AtCommand_CharBan, "@charbanish", 60, atcommand_char_ban }, // by Yor
+ { AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock }, // by Yor
+ { AtCommand_CharUnBlock, "@charunblock", 60, atcommand_char_unblock }, // by Yor
+ { AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban }, // by Yor
+ { AtCommand_CharUnBan, "@unbanish", 60, atcommand_char_unban }, // by Yor
+ { AtCommand_CharUnBan, "@charunban", 60, atcommand_char_unban }, // by Yor
+ { AtCommand_CharUnBan, "@charunbanish", 60, atcommand_char_unban }, // by Yor
+ { AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco }, // by Valaris
+ { AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco }, // by Yor
+ { AtCommand_GuildSpy, "@guildspy", 60, atcommand_guildspy }, // [Syrus22]
+ { AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy }, // [Syrus22]
+ { AtCommand_RepairAll, "@repairall", 60, atcommand_repairall }, // [Valaris]
+ { AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall }, // by Yor
+ { AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall }, // by Yor
+// { AtCommand_Nuke, "@nuke", 60, atcommand_nuke }, // [Valaris]
+ { AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc }, // []
+ { AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc }, // []
+ { AtCommand_ServerTime, "@time", 0, atcommand_servertime }, // by Yor
+ { AtCommand_ServerTime, "@date", 0, atcommand_servertime }, // by Yor
+ { AtCommand_ServerTime, "@server_date", 0, atcommand_servertime }, // by Yor
+ { AtCommand_ServerTime, "@serverdate", 0, atcommand_servertime }, // by Yor
+ { AtCommand_ServerTime, "@server_time", 0, atcommand_servertime }, // by Yor
+ { AtCommand_ServerTime, "@servertime", 0, atcommand_servertime }, // by Yor
+ { AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem }, // by Yor
+ { AtCommand_Jail, "@jail", 60, atcommand_jail }, // by Yor
+ { AtCommand_UnJail, "@unjail", 60, atcommand_unjail }, // by Yor
+ { AtCommand_UnJail, "@discharge", 60, atcommand_unjail }, // by Yor
+ { AtCommand_Disguise, "@disguise", 20, atcommand_disguise }, // [Valaris]
+ { AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise }, // by Yor
+ { AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise }, // Kalaspuff
+ { AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise }, // Kalaspuff
+ { AtCommand_EMail, "@email", 0, atcommand_email }, // by Yor
+ { AtCommand_Effect, "@effect", 40, atcommand_effect }, // by Apple
+ { AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list }, // by Yor
+ { AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list }, // by Yor
+ { AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list }, // by Yor
+ { AtCommand_Follow, "@follow", 10, atcommand_follow }, // by MouseJstr
+ { AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp }, // by MouseJstr
+ { AtCommand_SkillOn, "@skillon", 20, atcommand_skillon }, // by MouseJstr
+ { AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff }, // by MouseJstr
+ { AtCommand_Killer, "@killer", 60, atcommand_killer }, // by MouseJstr
+ { AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove }, // by MouseJstr
+ { AtCommand_Killable, "@killable", 40, atcommand_killable }, // by MouseJstr
+ { AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable }, // by MouseJstr
+ { AtCommand_Chareffect, "@chareffect", 40, atcommand_chareffect }, // MouseJstr
+/*
+ { AtCommand_Chardye, "@chardye", 40, atcommand_chardye }, // MouseJstr
+ { AtCommand_Charhairstyle, "@charhairstyle", 40, atcommand_charhairstyle }, // MouseJstr
+ { AtCommand_Charhaircolor, "@charhaircolor", 40, atcommand_charhaircolor }, // MouseJstr
+*/
+ { AtCommand_Dropall, "@dropall", 40, atcommand_dropall }, // MouseJstr
+ { AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall }, // MouseJstr
+ { AtCommand_Storeall, "@storeall", 40, atcommand_storeall }, // MouseJstr
+ { AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall }, // MouseJstr
+ { AtCommand_Skillid, "@skillid", 40, atcommand_skillid }, // MouseJstr
+ { AtCommand_Useskill, "@useskill", 40, atcommand_useskill }, // MouseJstr
+ { AtCommand_Rain, "@rain", 99, atcommand_rain },
+ { AtCommand_Snow, "@snow", 99, atcommand_snow },
+ { AtCommand_Sakura, "@sakura", 99, atcommand_sakura },
+ { AtCommand_Fog, "@fog", 99, atcommand_fog },
+ { AtCommand_Leaves, "@leaves", 99, atcommand_leaves },
+/*
+ { AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle },
+ { AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance },
+ { AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect },
+*/
+ { AtCommand_Summon, "@summon", 60, atcommand_summon },
+ { AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl },
+ { AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl },
+ { AtCommand_Trade, "@trade", 60, atcommand_trade },
+ { AtCommand_Send, "@send", 60, atcommand_send },
+ { AtCommand_SetBattleFlag, "@setbattleflag", 60, atcommand_setbattleflag },
+ { AtCommand_UnMute, "@unmute", 60, atcommand_unmute }, // [Valaris]
+ { AtCommand_UpTime, "@uptime", 0, atcommand_uptime }, // by MC Cameri
+ { AtCommand_ChangeSex, "@changesex", 1, atcommand_changesex }, // by MC Cameri
+
+#ifndef TXT_ONLY // sql-only commands
+ { AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris]
+ { AtCommand_ListMail, "@listmail", 1, atcommand_listmail }, // [Valaris]
+ { AtCommand_ListNewMail, "@listnewmail", 1, atcommand_listmail }, // [Valaris]
+ { AtCommand_ReadMail, "@readmail", 1, atcommand_readmail }, // [Valaris]
+ { AtCommand_DeleteMail, "@deletemail", 1, atcommand_readmail }, // [Valaris]
+ { AtCommand_SendMail, "@sendmail", 1, atcommand_sendmail }, // [Valaris]
+ { AtCommand_SendPriorityMail, "@sendprioritymail",80, atcommand_sendmail }, // [Valaris]
+ { AtCommand_RefreshOnline, "@refreshonline", 99, atcommand_refreshonline }, // [Valaris]
+#endif /* TXT_ONLY */
+
+// add new commands before this line
+ { AtCommand_Unknown, NULL, 1, NULL }
+};
+
+/*====================================================
+ * This function return the name of the job (by [Yor])
+ *----------------------------------------------------
+ */
+char * job_name(int class) {
+ switch (class) {
+ case 0: return "Novice";
+ case 1: return "Swordsman";
+ case 2: return "Mage";
+ case 3: return "Archer";
+ case 4: return "Acolyte";
+ case 5: return "Merchant";
+ case 6: return "Thief";
+ case 7: return "Knight";
+ case 8: return "Priest";
+ case 9: return "Wizard";
+ case 10: return "Blacksmith";
+ case 11: return "Hunter";
+ case 12: return "Assassin";
+ case 13: return "Knight 2";
+ case 14: return "Crusader";
+ case 15: return "Monk";
+ case 16: return "Sage";
+ case 17: return "Rogue";
+ case 18: return "Alchemist";
+ case 19: return "Bard";
+ case 20: return "Dancer";
+ case 21: return "Crusader 2";
+ case 22: return "Wedding";
+ case 23: return "Super Novice";
+ case 4001: return "Novice High";
+ case 4002: return "Swordsman High";
+ case 4003: return "Mage High";
+ case 4004: return "Archer High";
+ case 4005: return "Acolyte High";
+ case 4006: return "Merchant High";
+ case 4007: return "Thief High";
+ case 4008: return "Lord Knight";
+ case 4009: return "High Priest";
+ case 4010: return "High Wizard";
+ case 4011: return "Whitesmith";
+ case 4012: return "Sniper";
+ case 4013: return "Assassin Cross";
+ case 4014: return "Peko Knight";
+ case 4015: return "Paladin";
+ case 4016: return "Champion";
+ case 4017: return "Professor";
+ case 4018: return "Stalker";
+ case 4019: return "Creator";
+ case 4020: return "Clown";
+ case 4021: return "Gypsy";
+ case 4022: return "Peko Paladin";
+ case 4023: return "Baby Novice";
+ case 4024: return "Baby Swordsman";
+ case 4025: return "Baby Mage";
+ case 4026: return "Baby Archer";
+ case 4027: return "Baby Acolyte";
+ case 4028: return "Baby Merchant";
+ case 4029: return "Baby Thief";
+ case 4030: return "Baby Knight";
+ case 4031: return "Baby Priest";
+ case 4032: return "Baby Wizard";
+ case 4033: return "Baby Blacksmith";
+ case 4034: return "Baby Hunter";
+ case 4035: return "Baby Assassin";
+ case 4036: return "Baby Peco Knight";
+ case 4037: return "Baby Crusader";
+ case 4038: return "Baby Monk";
+ case 4039: return "Baby Sage";
+ case 4040: return "Baby Rogue";
+ case 4041: return "Baby Alchemist";
+ case 4042: return "Baby Bard";
+ case 4043: return "Baby Dancer";
+ case 4044: return "Baby Peco Crusader";
+ case 4045: return "Super Baby";
+ }
+ return "Unknown Job";
+}
+
+//-----------------------------------------------------------
+// Return the message string of the specified number by [Yor]
+//-----------------------------------------------------------
+char * msg_txt(int msg_number) {
+ if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0])) &&
+ msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0')
+ return msg_table[msg_number];
+
+ return "??";
+}
+
+//------------------------------------------------------------
+// E-mail check: return 0 (not correct) or 1 (valid). by [Yor]
+//------------------------------------------------------------
+int e_mail_check(unsigned char *email) {
+ char ch;
+ unsigned 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;
+}
+
+/*==========================================
+ * get_atcommand_level @ƒRƒ}ƒ“ƒh‚Ì•K—vƒŒƒxƒ‹‚ðŽæ“¾
+ *------------------------------------------
+ */
+int get_atcommand_level(const AtCommandType type) {
+ int i;
+
+ for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
+ if (atcommand_info[i].type == type)
+ return atcommand_info[i].level;
+
+ return 100; // 100: command can not be used
+}
+
+/*==========================================
+ *is_atcommand @ƒRƒ}ƒ“ƒh‚É‘¶Ý‚·‚é‚©‚Ç‚¤‚©Šm”F‚·‚é
+ *------------------------------------------
+ */
+AtCommandType
+is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl) {
+ const char* str = message;
+ int s_flag = 0;
+ AtCommandInfo info;
+ AtCommandType type;
+
+ nullpo_retr(AtCommand_None, sd);
+
+ if (!message || !*message)
+ return AtCommand_None;
+
+ memset(&info, 0, sizeof(info));
+ str += strlen(sd->status.name);
+ while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) {
+ if (*str == ':')
+ s_flag = 1;
+ str++;
+ }
+ if (!*str)
+ return AtCommand_None;
+
+ type = atcommand(gmlvl > 0 ? gmlvl : pc_isGM(sd), str, &info);
+ if (type != AtCommand_None) {
+ char command[100];
+ char output[200];
+ const char* p = str;
+ memset(command, '\0', sizeof(command));
+ memset(output, '\0', sizeof(output));
+ while (*p && !isspace(*p))
+ p++;
+ if (p - str >= sizeof(command)) // too long
+ return AtCommand_Unknown;
+ strncpy(command, str, p - str);
+ while (isspace(*p))
+ p++;
+
+ if (type == AtCommand_Unknown || info.proc == NULL) {
+ sprintf(output, msg_table[153], command); // %s is Unknown Command.
+ clif_displaymessage(fd, output);
+ } else {
+ if (info.proc(fd, sd, command, p) != 0) {
+ // Command can not be executed
+ sprintf(output, msg_table[154], command); // %s failed.
+ clif_displaymessage(fd, output);
+ }
+ }
+
+ return info.type;
+ }
+
+ return AtCommand_None;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+AtCommandType atcommand(const int level, const char* message, struct AtCommandInfo* info) {
+ char* p = (char *)message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary
+
+ if (!info)
+ return AtCommand_None;
+ if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd)
+ return AtCommand_None;
+ if (!p || !*p) {
+ fprintf(stderr, "at command message is empty\n");
+ return AtCommand_None;
+ }
+
+ if (*p == command_symbol) { // check first char.
+ char command[101];
+ int i = 0;
+ memset(info, 0, sizeof(AtCommandInfo));
+ sscanf(p, "%100s", command);
+ command[sizeof(command)-1] = '\0';
+
+ while (atcommand_info[i].type != AtCommand_Unknown) {
+ if (strcmpi(command+1, atcommand_info[i].command+1) == 0 && level >= atcommand_info[i].level) {
+ p[0] = atcommand_info[i].command[0]; // set correct first symbol for after.
+ break;
+ }
+ i++;
+ }
+
+ if (atcommand_info[i].type == AtCommand_Unknown) {
+ // doesn't return Unknown if player is normal player (display the text, not display: unknown command)
+ if (level == 0)
+ return AtCommand_None;
+ else
+ return AtCommand_Unknown;
+ }
+ memcpy(info, &atcommand_info[i], sizeof atcommand_info[i]);
+ } else {
+ return AtCommand_None;
+ }
+
+ return info->type;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int atkillmonster_sub(struct block_list *bl, va_list ap) {
+ int flag = va_arg(ap, int);
+
+ nullpo_retr(0, bl);
+
+ if (flag)
+ mob_damage(NULL, (struct mob_data *)bl, ((struct mob_data *)bl)->hp, 2);
+ else
+ mob_delete((struct mob_data *)bl);
+
+ return 0;
+}
+
+#ifndef TXT_ONLY
+static int atkillnpc_sub(struct block_list *bl, va_list ap)
+{
+ int flag = va_arg(ap,int);
+
+ nullpo_retr(0, bl);
+
+ npc_delete((struct npc_data *)bl);
+
+ flag = 0;
+
+ return 0;
+}
+
+void rehash( const int fd, struct map_session_data* sd )
+{
+ int map_id = 0;
+
+ int LOADED_MAPS = map_num;
+
+ for (map_id = 0; map_id < LOADED_MAPS;map_id++) {
+
+ if (map_id > LOADED_MAPS)
+ break;
+
+ map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, 0);
+ map_foreachinarea(atkillnpc_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_NPC, 0);
+ }
+}
+
+#endif /* not TXT_ONLY */
+/*==========================================
+ * Read Message Data
+ *------------------------------------------
+ */
+int msg_config_read(const char *cfgName) {
+ int msg_number;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ printf("Messages file not found: %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, "import") == 0) {
+ msg_config_read(w2);
+ } else {
+ msg_number = atoi(w1);
+ if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0])))
+ strcpy(msg_table[msg_number], w2);
+ // printf("message #%d: '%s'.\n", msg_number, msg_table[msg_number]);
+ }
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static AtCommandInfo* get_atcommandinfo_byname(const char* name) {
+ int i;
+
+ for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
+ if (strcmpi(atcommand_info[i].command + 1, name) == 0)
+ return &atcommand_info[i];
+
+ return NULL;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_config_read(const char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ AtCommandInfo* p;
+ FILE* fp;
+
+ if ((fp = fopen(cfgName, "r")) == NULL) {
+ printf("At commands 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_atcommandinfo_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)
+ atcommand_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
+ command_symbol = w2[0];
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+
+
+/*==========================================
+// @ command processing functions
+ *------------------------------------------
+ */
+
+/*==========================================
+ * @send (used for testing packet sends from the client)
+ *------------------------------------------
+ */
+int atcommand_send(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int a = atoi(message);
+ if (a)
+ {
+ unsigned char buf[1024];
+ switch(a)
+ {
+ case 1:
+ WBUFW(buf,0)=0x18d;
+ case 2:
+ WBUFW(buf,0)=0x18e;
+ case 3:
+ WBUFW(buf,0)=0x18f;
+ case 4:
+ WBUFW(buf,0)=0x190;
+ }
+
+
+ }
+ return 0;
+}
+
+/*==========================================
+ * @rura+
+ *------------------------------------------
+ */
+int atcommand_rurap(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char map_name[100];
+ char character[100];
+ int x = 0, y = 0;
+ struct map_session_data *pl_sd;
+ int m;
+
+ memset(map_name, '\0', sizeof(map_name));
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4) {
+ clif_displaymessage(fd, "Usage: @charwarp/@rura+ <mapname> <x> <y> <char name>");
+ return -1;
+ }
+
+ if (x <= 0)
+ x = rand() % 399 + 1;
+ if (y <= 0)
+ y = rand() % 399 + 1;
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level
+ if (x > 0 && x < 400 && y > 0 && y < 400) {
+ m = map_mapname2mapid(map_name);
+ if (m >= 0 && 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_name, 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).
+ } else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
+ 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;
+}
+
+// @rura
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_rura(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char map_name[100];
+ int x = 0, y = 0;
+ int m;
+
+ memset(map_name, '\0', sizeof(map_name));
+
+ if (!message || !*message || sscanf(message, "%99s %d %d", map_name, &x, &y) < 1) {
+ clif_displaymessage(fd, "Please, enter a map (usage: @warp/@rura/@mapmove <mapname> <x> <y>).");
+ return -1;
+ }
+
+ if (x <= 0)
+ x = rand() % 399 + 1;
+ if (y <= 0)
+ y = rand() % 399 + 1;
+
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+
+ if (x > 0 && x < 400 && y > 0 && y < 400) {
+ m = map_mapname2mapid(map_name);
+ if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to this map.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+ if (pc_setpos(sd, map_name, x, y, 3) == 0)
+ clif_displaymessage(fd, msg_table[0]); // Warped.
+ else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_where(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd = NULL;
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message)
+ return -1;
+ memset(character, '\0', sizeof character);
+ if (sscanf(message, "%99[^\n]", character) < 1)
+ return -1;
+ if(strncmp(sd->status.name,character,24)==0)
+ return -1;
+
+ intif_where(sd->status.account_id,character);
+
+ if ((pl_sd = map_nick2sd(character)) == NULL) {
+ snprintf(output, sizeof output, "%s %d %d",
+ sd->mapname, sd->bl.x, sd->bl.y);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+ snprintf(output, sizeof output, "%s %s %d %d",
+ character, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_jumpto(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd = NULL;
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>).");
+ return -1;
+ }
+
+ memset(character, '\0', sizeof character);
+ if (sscanf(message, "%99[^\n]", character) < 1)
+ return -1;
+ if(strncmp(sd->status.name,character,24)==0)
+ return -1;
+
+ intif_jumpto(sd->status.account_id,character);
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to the map of this player.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+ pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
+ sprintf(output, msg_table[4], character); // Jump to %s
+ clif_displaymessage(fd, output);
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_jump(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ int x = 0, y = 0;
+
+ memset(output, '\0', sizeof(output));
+
+ sscanf(message, "%d %d", &x, &y);
+
+ if (x <= 0)
+ x = rand() % 399 + 1;
+ if (y <= 0)
+ y = rand() % 399 + 1;
+ if (x > 0 && x < 400 && y > 0 && y < 400) {
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to your actual map.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+ pc_setpos(sd, sd->mapname, x, y, 3);
+ sprintf(output, msg_table[5], x, y); // Jump to %d %d
+ clif_displaymessage(fd, output);
+ } else {
+ clif_displaymessage(fd, msg_table[2]); // Coordinates out of range.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_who(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, j, count;
+ int pl_GM_level, GM_level;
+ char match_text[100];
+ char player_name[24];
+
+ memset(output, '\0', sizeof(output));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
+
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
+ for (j = 0; match_text[j]; j++)
+ match_text[j] = tolower(match_text[j]);
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ memcpy(player_name, pl_sd->status.name, 24);
+ for (j = 0; player_name[j]; j++)
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ else
+ sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_who2(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, j, count;
+ int pl_GM_level, GM_level;
+ char match_text[100];
+ char player_name[24];
+
+ memset(output, '\0', sizeof(output));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
+
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
+ for (j = 0; match_text[j]; j++)
+ match_text[j] = tolower(match_text[j]);
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ memcpy(player_name, pl_sd->status.name, 24);
+ for (j = 0; player_name[j]; j++)
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
+ else
+ sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
+ clif_displaymessage(fd, output);
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_who3(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char temp0[100];
+ char temp1[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, j, count;
+ int pl_GM_level, GM_level;
+ char match_text[100];
+ char player_name[24];
+ struct guild *g;
+ struct party *p;
+
+ memset(temp0, '\0', sizeof(temp0));
+ memset(temp1, '\0', sizeof(temp1));
+ memset(output, '\0', sizeof(output));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
+
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
+ for (j = 0; match_text[j]; j++)
+ match_text[j] = tolower(match_text[j]);
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ memcpy(player_name, pl_sd->status.name, 24);
+ for (j = 0; player_name[j]; j++)
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
+ g = guild_search(pl_sd->status.guild_id);
+ if (g == NULL)
+ sprintf(temp1, "None");
+ else
+ sprintf(temp1, "%s", g->name);
+ p = party_search(pl_sd->status.party_id);
+ if (p == NULL)
+ sprintf(temp0, "None");
+ else
+ sprintf(temp0, "%s", p->name);
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
+ else
+ sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
+ clif_displaymessage(fd, output);
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_whomap(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, count;
+ int pl_GM_level, GM_level;
+ int map_id;
+ char map_name[100];
+
+ memset(output, '\0', sizeof(output));
+ memset(map_name, '\0', sizeof(map_name));
+
+ if (!message || !*message)
+ map_id = sd->bl.m;
+ else {
+ sscanf(message, "%99s", map_name);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
+ map_id = sd->bl.m;
+ }
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ if (pl_sd->bl.m == map_id) {
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ else
+ sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+ count++;
+ }
+ }
+ }
+ }
+
+ if (count == 0)
+ sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
+ else if (count == 1)
+ sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
+ else {
+ sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
+ }
+ clif_displaymessage(fd, output);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_whomap2(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, count;
+ int pl_GM_level, GM_level;
+ int map_id = 0;
+ char map_name[100];
+
+ memset(output, '\0', sizeof(output));
+ memset(map_name, '\0', sizeof(map_name));
+
+ if (!message || !*message)
+ map_id = sd->bl.m;
+ else {
+ sscanf(message, "%99s", map_name);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
+ map_id = sd->bl.m;
+ }
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ if (pl_sd->bl.m == map_id) {
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_GM_level, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
+ else
+ sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
+ clif_displaymessage(fd, output);
+ count++;
+ }
+ }
+ }
+ }
+
+ if (count == 0)
+ sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
+ else if (count == 1)
+ sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
+ else {
+ sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
+ }
+ clif_displaymessage(fd, output);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_whomap3(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char temp0[100];
+ char temp1[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, count;
+ int pl_GM_level, GM_level;
+ int map_id = 0;
+ char map_name[100];
+ struct guild *g;
+ struct party *p;
+
+ memset(temp0, '\0', sizeof(temp0));
+ memset(temp1, '\0', sizeof(temp1));
+ memset(output, '\0', sizeof(output));
+ memset(map_name, '\0', sizeof(map_name));
+
+ if (!message || !*message)
+ map_id = sd->bl.m;
+ else {
+ sscanf(message, "%99s", map_name);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
+ map_id = sd->bl.m;
+ }
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ if (pl_sd->bl.m == map_id) {
+ g = guild_search(pl_sd->status.guild_id);
+ if (g == NULL)
+ sprintf(temp1, "None");
+ else
+ sprintf(temp1, "%s", g->name);
+ p = party_search(pl_sd->status.party_id);
+ if (p == NULL)
+ sprintf(temp0, "None");
+ else
+ sprintf(temp0, "%s", p->name);
+ if (pl_GM_level > 0)
+ sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1);
+ else
+ sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1);
+ clif_displaymessage(fd, output);
+ count++;
+ }
+ }
+ }
+ }
+
+ if (count == 0)
+ sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'.
+ else if (count == 1)
+ sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'.
+ else {
+ sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'.
+ }
+ clif_displaymessage(fd, output);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_whogm(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char temp0[100];
+ char temp1[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i, j, count;
+ int pl_GM_level, GM_level;
+ char match_text[100];
+ char player_name[24];
+ struct guild *g;
+ struct party *p;
+
+ memset(temp0, '\0', sizeof(temp0));
+ memset(temp1, '\0', sizeof(temp1));
+ memset(output, '\0', sizeof(output));
+ memset(match_text, '\0', sizeof(match_text));
+ memset(player_name, '\0', sizeof(player_name));
+
+ if (sscanf(message, "%99[^\n]", match_text) < 1)
+ strcpy(match_text, "");
+ for (j = 0; match_text[j]; j++)
+ match_text[j] = tolower(match_text[j]);
+
+ count = 0;
+ GM_level = pc_isGM(sd);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_GM_level = pc_isGM(pl_sd);
+ if (pl_GM_level > 0) {
+ if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
+ memcpy(player_name, pl_sd->status.name, 24);
+ for (j = 0; player_name[j]; j++)
+ player_name[j] = tolower(player_name[j]);
+ if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
+ sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+ sprintf(output, " BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level);
+ clif_displaymessage(fd, output);
+ g = guild_search(pl_sd->status.guild_id);
+ if (g == NULL)
+ sprintf(temp1, "None");
+ else
+ sprintf(temp1, "%s", g->name);
+ p = party_search(pl_sd->status.party_id);
+ if (p == NULL)
+ sprintf(temp0, "None");
+ else
+ sprintf(temp0, "%s", p->name);
+ sprintf(output, " Party: '%s' | Guild: '%s'", temp0, temp1);
+ clif_displaymessage(fd, output);
+ count++;
+ }
+ }
+ }
+ }
+ }
+
+ if (count == 0)
+ clif_displaymessage(fd, msg_table[150]); // No GM found.
+ else if (count == 1)
+ clif_displaymessage(fd, msg_table[151]); // 1 GM found.
+ else {
+ sprintf(output, msg_table[152], count); // %d GMs found.
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_save(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ pc_setsavepoint(sd, sd->mapname, sd->bl.x, sd->bl.y);
+ if (sd->status.pet_id > 0 && sd->pd)
+ intif_save_petdata(sd->status.account_id, &sd->pet);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_save(sd);
+ clif_displaymessage(fd, msg_table[6]); // Character data respawn point saved.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_load(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int m;
+
+ m = map_mapname2mapid(sd->status.save_point.map);
+ if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to your save map.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+
+ pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 0);
+ clif_displaymessage(fd, msg_table[7]); // Warping to respawn point.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_speed(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ int speed;
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message) {
+ sprintf(output, "Please, enter a speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ speed = atoi(message);
+ if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) {
+ sd->speed = speed;
+ //sd->walktimer = x;
+ //‚±‚Ì•¶‚ð’ljÁ by ‚ê‚
+ clif_updatestatus(sd, SP_SPEED);
+ clif_displaymessage(fd, msg_table[8]); // Speed changed.
+ } else {
+ sprintf(output, "Please, enter a valid speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_storage(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ storage_storageopen(sd);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_guildstorage(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->status.guild_id > 0)
+ storage_guild_storageopen(sd);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_option(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int param1 = 0, param2 = 0, param3 = 0;
+
+ if (!message || !*message || sscanf(message, "%d %d %d", &param1, &param2, &param3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) {
+ clif_displaymessage(fd, "Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>).");
+ return -1;
+ }
+
+ sd->opt1 = param1;
+ sd->opt2 = param2;
+ if (!(sd->status.option & CART_MASK) && param3 & CART_MASK) {
+ clif_cart_itemlist(sd);
+ clif_cart_equiplist(sd);
+ clif_updatestatus(sd, SP_CARTINFO);
+ }
+ sd->status.option = param3;
+ // fix pecopeco display
+ if (sd->status.class == 13 || sd->status.class == 21 || sd->status.class == 4014 || sd->status.class == 4022) {
+ if (!pc_isriding(sd)) { // sd have the new value...
+ if (sd->status.class == 13)
+ sd->status.class = sd->view_class = 7;
+ else if (sd->status.class == 21)
+ sd->status.class = sd->view_class = 14;
+ else if (sd->status.class == 4014)
+ sd->status.class = sd->view_class = 4008;
+ else if (sd->status.class == 4022)
+ sd->status.class = sd->view_class = 4015;
+ }
+ } else {
+ if (pc_isriding(sd)) { // sd have the new value...
+ if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
+ sd->status.option &= ~0x0020;
+ } else {
+ if (sd->status.class == 7)
+ sd->status.class = sd->view_class = 13;
+ else if (sd->status.class == 14)
+ sd->status.class = sd->view_class = 21;
+ else if (sd->status.class == 4008)
+ sd->status.class = sd->view_class = 4014;
+ else if (sd->status.class == 4015)
+ sd->status.class = sd->view_class = 4022;
+ else
+ sd->status.option &= ~0x0020;
+ }
+ }
+ }
+
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, msg_table[9]); // Options changed.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_hide(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->status.option & OPTION_HIDE) {
+ sd->status.option &= ~OPTION_HIDE;
+ clif_displaymessage(fd, msg_table[10]); // Invisible: Off
+ } else {
+ sd->status.option |= OPTION_HIDE;
+ clif_displaymessage(fd, msg_table[11]); // Invisible: On
+ }
+ clif_changeoption(&sd->bl);
+
+ return 0;
+}
+
+/*==========================================
+ * “]E‚·‚é upper‚ðŽw’è‚·‚é‚Æ“]¶‚â—{Žq‚É‚à‚È‚ê‚é
+ *------------------------------------------
+ */
+int atcommand_jobchange(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int job = 0, upper = -1;
+
+ if (!message || !*message || sscanf(message, "%d %d", &job, &upper) < 1) {
+ clif_displaymessage(fd, "Please, enter job ID (usage: @job/@jobchange <job ID>).");
+ return -1;
+ }
+
+ if (job == 37 ||job == 45)
+ return 0;
+
+ if ((job >= 0 && job < MAX_PC_CLASS)) {
+
+ // fix pecopeco display
+ if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
+ if (pc_isriding(sd)) {
+ if (sd->status.class == 13)
+ sd->status.class = sd->view_class = 7;
+ if (sd->status.class == 21)
+ sd->status.class = sd->view_class = 14;
+ if (sd->status.class == 4014)
+ sd->status.class = sd->view_class = 4008;
+ if (sd->status.class == 4022)
+ sd->status.class = sd->view_class = 4015;
+ sd->status.option &= ~0x0020;
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd, 0);
+ }
+ } else {
+ if (!pc_isriding(sd)) {
+ if (job == 13)
+ job = 7;
+ if (job == 21)
+ job = 14;
+ if (job == 4014)
+ job = 4008;
+ if (job == 4022)
+ job = 4015;
+ }
+ }
+
+ if (pc_jobchange(sd, job, upper) == 0)
+ clif_displaymessage(fd, msg_table[12]); // Your job has been changed.
+ else {
+ clif_displaymessage(fd, msg_table[155]); // Impossible to change your job.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, "Please, enter a valid job ID (usage: @job/@jobchange <job ID>).");
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_die(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ pc_damage(NULL, sd, sd->status.hp + 1);
+ clif_displaymessage(fd, msg_table[13]); // A pity! You've died.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_kill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @kill <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(fd, msg_table[14]); // Character killed.
+ } 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 atcommand_alive(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ sd->status.hp = sd->status.max_hp;
+ sd->status.sp = sd->status.max_sp;
+ pc_setstand(sd);
+ if (battle_config.pc_invincible_time > 0)
+ pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
+ clif_updatestatus(sd, SP_HP);
+ clif_updatestatus(sd, SP_SP);
+ clif_resurrection(&sd->bl, 1);
+ clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_kami(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a message (usage: @kami <message>).");
+ return -1;
+ }
+
+ sscanf(message, "%199[^\n]", output);
+ intif_GMmessage(output, strlen(output) + 1, (*(command + 5) == 'b') ? 0x10 : 0);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_heal(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int hp = 0, sp = 0; // [Valaris] thanks to fov
+
+ sscanf(message, "%d %d", &hp, &sp);
+
+ if (hp == 0 && sp == 0) {
+ hp = sd->status.max_hp - sd->status.hp;
+ sp = sd->status.max_sp - sd->status.sp;
+ } else {
+ if (hp > 0 && (hp > sd->status.max_hp || hp > (sd->status.max_hp - sd->status.hp))) // fix positiv overflow
+ hp = sd->status.max_hp - sd->status.hp;
+ else if (hp < 0 && (hp < -sd->status.max_hp || hp < (1 - sd->status.hp))) // fix negativ overflow
+ hp = 1 - sd->status.hp;
+ if (sp > 0 && (sp > sd->status.max_sp || sp > (sd->status.max_sp - sd->status.sp))) // fix positiv overflow
+ sp = sd->status.max_sp - sd->status.sp;
+ else if (sp < 0 && (sp < -sd->status.max_sp || sp < (1 - sd->status.sp))) // fix negativ overflow
+ sp = 1 - sd->status.sp;
+ }
+
+ if (hp > 0) // display like heal
+ clif_heal(fd, SP_HP, hp);
+ else if (hp < 0) // display like damage
+ clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0);
+ if (sp > 0) // no display when we lost SP
+ clif_heal(fd, SP_SP, sp);
+
+ if (hp != 0 || sp != 0) {
+ pc_heal(sd, hp, sp);
+ if (hp >= 0 && sp >= 0)
+ clif_displaymessage(fd, msg_table[17]); // HP, SP recovered.
+ else
+ clif_displaymessage(fd, msg_table[156]); // HP or/and SP modified.
+ } else {
+ clif_displaymessage(fd, msg_table[157]); // HP and SP are already with the good value.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @item command (usage: @item <name/id_of_item> <quantity>) (modified by [Yor] for pet_egg)
+ *------------------------------------------
+ */
+int atcommand_item(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char item_name[100];
+ int number = 0, item_id, flag;
+ struct item item_tmp;
+ struct item_data *item_data;
+ int get_count, i, pet_id;
+
+ memset(item_name, '\0', sizeof(item_name));
+
+ if (!message || !*message || sscanf(message, "%99s %d", item_name, &number) < 1) {
+ clif_displaymessage(fd, "Please, enter an item name/id (usage: @item <item name or ID> [quantity]).");
+ 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;
+ }
+ for (i = 0; i < number; i += get_count) {
+ // if pet egg
+ if (pet_id >= 0) {
+ sd->catch_target_class = pet_db[pet_id].class;
+ intif_create_pet(sd->status.account_id, sd->status.char_id,
+ pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
+ pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
+ 100, 0, 1, pet_db[pet_id].jname);
+ // if not pet egg
+ } else {
+ memset(&item_tmp, 0, sizeof(item_tmp));
+ item_tmp.nameid = item_id;
+ 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);
+ }
+ }
+ clif_displaymessage(fd, msg_table[18]); // Item created.
+ } else {
+ clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_item2(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct item item_tmp;
+ struct item_data *item_data;
+ char item_name[100];
+ int item_id, number = 0;
+ int identify = 0, refine = 0, attr = 0;
+ int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
+ int flag;
+ int loop, get_count, i;
+
+ memset(item_name, '\0', sizeof(item_name));
+
+ if (!message || !*message || sscanf(message, "%99s %d %d %d %d %d %d %d %d", item_name, &number, &identify, &refine, &attr, &c1, &c2, &c3, &c4) < 9) {
+ clif_displaymessage(fd, "Please, enter all informations (usage: @item2 <item name or ID> <quantity>");
+ clif_displaymessage(fd, " <Identify_flag> <refine> <attribut> <Card1> <Card2> <Card3> <Card4>).");
+ 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) {
+ loop = 1;
+ get_count = number;
+ if (item_data->type == 4 || item_data->type == 5 ||
+ item_data->type == 7 || item_data->type == 8) {
+ loop = number;
+ get_count = 1;
+ if (item_data->type == 7) {
+ identify = 1;
+ refine = 0;
+ }
+ if (item_data->type == 8)
+ refine = 0;
+ if (refine > 10)
+ refine = 10;
+ } else {
+ identify = 1;
+ refine = attr = 0;
+ }
+ for (i = 0; i < loop; i++) {
+ memset(&item_tmp, 0, sizeof(item_tmp));
+ item_tmp.nameid = item_id;
+ item_tmp.identify = identify;
+ item_tmp.refine = refine;
+ item_tmp.attribute = attr;
+ item_tmp.card[0] = c1;
+ item_tmp.card[1] = c2;
+ item_tmp.card[2] = c3;
+ item_tmp.card[3] = c4;
+ if ((flag = pc_additem(sd, &item_tmp, get_count)))
+ clif_additem(sd, 0, 0, flag);
+ }
+ clif_displaymessage(fd, msg_table[18]); // Item created.
+ } else {
+ clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_itemreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].amount && sd->status.inventory[i].equip == 0)
+ pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
+ }
+ clif_displaymessage(fd, msg_table[20]); // All of your items have been removed.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_itemcheck(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ pc_checkitem(sd);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_baselevelup(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int level, i;
+
+ if (!message || !*message || (level = atoi(message)) == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement (usage: @lvup/@blevel/@baselvlup <number of levels>).");
+ return -1;
+ }
+
+ if (level > 0) {
+ if (sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris
+ clif_displaymessage(fd, msg_table[47]); // Base level can't go any higher.
+ return -1;
+ } // End Addition
+ if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow
+ level = battle_config.maximum_level - sd->status.base_level;
+ for (i = 1; i <= level; i++)
+ sd->status.status_point += (sd->status.base_level + i + 14) / 5;
+ sd->status.base_level += level;
+ clif_updatestatus(sd, SP_BASELEVEL);
+ clif_updatestatus(sd, SP_NEXTBASEEXP);
+ clif_updatestatus(sd, SP_STATUSPOINT);
+ pc_calcstatus(sd, 0);
+ pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
+ clif_misceffect(&sd->bl, 0);
+ clif_displaymessage(fd, msg_table[21]); // Base level raised.
+ } else {
+ if (sd->status.base_level == 1) {
+ clif_displaymessage(fd, msg_table[158]); // Base level can't go any lower.
+ return -1;
+ }
+ if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow
+ level = 1 - sd->status.base_level;
+ if (sd->status.status_point > 0) {
+ for (i = 0; i > level; i--)
+ sd->status.status_point -= (sd->status.base_level + i + 14) / 5;
+ if (sd->status.status_point < 0)
+ sd->status.status_point = 0;
+ clif_updatestatus(sd, SP_STATUSPOINT);
+ } // to add: remove status points from stats
+ sd->status.base_level += level;
+ clif_updatestatus(sd, SP_BASELEVEL);
+ clif_updatestatus(sd, SP_NEXTBASEEXP);
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, msg_table[22]); // Base level lowered.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_joblevelup(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int up_level = 50, level;
+
+ if (!message || !*message || (level = atoi(message)) == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement (usage: @joblvup/@jlevel/@joblvlup <number of levels>).");
+ return -1;
+ }
+
+ if (sd->status.class == 0 || sd->status.class == 4001)
+ up_level -= 40;
+ else if ((sd->status.class > 4007 && sd->status.class < 4024) || sd->status.class == 23)
+ up_level += 20;
+
+ if (level > 0) {
+ if (sd->status.job_level == up_level) {
+ clif_displaymessage(fd, msg_table[23]); // Job level can't go any higher.
+ return -1;
+ }
+ if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow
+ level = up_level - sd->status.job_level;
+ sd->status.job_level += level;
+ clif_updatestatus(sd, SP_JOBLEVEL);
+ clif_updatestatus(sd, SP_NEXTJOBEXP);
+ sd->status.skill_point += level;
+ clif_updatestatus(sd, SP_SKILLPOINT);
+ pc_calcstatus(sd, 0);
+ clif_misceffect(&sd->bl, 1);
+ clif_displaymessage(fd, msg_table[24]); // Job level raised.
+ } else {
+ if (sd->status.job_level == 1) {
+ clif_displaymessage(fd, msg_table[159]); // Job level can't go any lower.
+ return -1;
+ }
+ if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow
+ level = 1 - sd->status.job_level;
+ sd->status.job_level += level;
+ clif_updatestatus(sd, SP_JOBLEVEL);
+ clif_updatestatus(sd, SP_NEXTJOBEXP);
+ if (sd->status.skill_point > 0) {
+ sd->status.skill_point += level;
+ if (sd->status.skill_point < 0)
+ sd->status.skill_point = 0;
+ clif_updatestatus(sd, SP_SKILLPOINT);
+ } // to add: remove status points from skills
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, msg_table[25]); // Job level lowered.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_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;
+
+ memset(buf, '\0', sizeof(buf));
+
+ if ((fp = fopen(help_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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_gm(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char password[100];
+
+ memset(password, '\0', sizeof(password));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", password) < 1) {
+ clif_displaymessage(fd, "Please, enter a password (usage: @gm <password>).");
+ return -1;
+ }
+
+ if (pc_isGM(sd)) { // a GM can not use this function. only a normal player (become gm is not for gm!)
+ clif_displaymessage(fd, msg_table[50]); // You already have some GM powers.
+ return -1;
+ } else
+ chrif_changegm(sd->status.account_id, password, strlen(password) + 1);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_pvpoff(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
+ clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
+ return -1;
+ }
+
+ if (map[sd->bl.m].flag.pvp) {
+ map[sd->bl.m].flag.pvp = 0;
+ clif_send0199(sd->bl.m, 0);
+ for (i = 0; i < fd_max; i++) { //l”•ªƒ‹[ƒv
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ if (sd->bl.m == pl_sd->bl.m) {
+ clif_pvpset(pl_sd, 0, 0, 2);
+ if (pl_sd->pvp_timer != -1) {
+ delete_timer(pl_sd->pvp_timer, pc_calc_pvprank_timer);
+ pl_sd->pvp_timer = -1;
+ }
+ }
+ }
+ }
+ clif_displaymessage(fd, msg_table[31]); // PvP: Off.
+ } else {
+ clif_displaymessage(fd, msg_table[160]); // PvP is already Off.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_pvpon(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris]
+ clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode.
+ return -1;
+ }
+
+ if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) {
+ map[sd->bl.m].flag.pvp = 1;
+ clif_send0199(sd->bl.m, 1);
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
+ pl_sd->pvp_timer = add_timer(gettick() + 200,
+ pc_calc_pvprank_timer, pl_sd->bl.id, 0);
+ pl_sd->pvp_rank = 0;
+ pl_sd->pvp_lastusers = 0;
+ pl_sd->pvp_point = 5;
+ }
+ }
+ }
+ clif_displaymessage(fd, msg_table[32]); // PvP: On.
+ } else {
+ clif_displaymessage(fd, msg_table[161]); // PvP is already On.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_gvgoff(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (map[sd->bl.m].flag.gvg) {
+ map[sd->bl.m].flag.gvg = 0;
+ clif_send0199(sd->bl.m, 0);
+ clif_displaymessage(fd, msg_table[33]); // GvG: Off.
+ } else {
+ clif_displaymessage(fd, msg_table[162]); // GvG is already Off.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_gvgon(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (!map[sd->bl.m].flag.gvg) {
+ map[sd->bl.m].flag.gvg = 1;
+ clif_send0199(sd->bl.m, 3);
+ clif_displaymessage(fd, msg_table[34]); // GvG: On.
+ } else {
+ clif_displaymessage(fd, msg_table[163]); // GvG is already On.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_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;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d %d %d", &hair_style, &hair_color, &cloth_color) < 1) {
+ sprintf(output, "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).",
+ MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ 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) {
+ //•ž‚ÌF•ÏX
+ if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
+ //•ž‚ÌF–¢ŽÀ‘•E‚Ì”»’è
+ clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
+ return -1;
+ } else {
+ pc_changelook(sd, LOOK_HAIR, hair_style);
+ pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
+ pc_changelook(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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @dye && @ccolor
+ *------------------------------------------
+ */
+int atcommand_dye(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+ int cloth_color = 0;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1) {
+ sprintf(output, "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).", MIN_CLOTH_COLOR, MAX_CLOTH_COLOR);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) {
+ if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
+ clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
+ return -1;
+ } else {
+ pc_changelook(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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @chardye by [MouseJstr]
+ *------------------------------------------
+ */
+int
+atcommand_chardye(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ return 0;
+}
+
+/*==========================================
+ * @hairstyle && @hstyle
+ *------------------------------------------
+ */
+int atcommand_hair_style(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+ int hair_style = 0;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d", &hair_style) < 1) {
+ sprintf(output, "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).", MIN_HAIR_STYLE, MAX_HAIR_STYLE);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) {
+ if (hair_style != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
+ clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
+ return -1;
+ } else {
+ pc_changelook(sd, LOOK_HAIR, hair_style);
+ clif_displaymessage(fd, msg_table[36]); // Appearence changed.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @charhairstyle by [MouseJstr]
+ *------------------------------------------
+ */
+int
+atcommand_charhairstyle(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ return 0;
+}
+
+/*==========================================
+ * @haircolor && @hcolor
+ *------------------------------------------
+ */
+int atcommand_hair_color(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+ int hair_color = 0;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d", &hair_color) < 1) {
+ sprintf(output, "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).", MIN_HAIR_COLOR, MAX_HAIR_COLOR);
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) {
+ if (hair_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) {
+ clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class.
+ return -1;
+ } else {
+ pc_changelook(sd, LOOK_HAIR_COLOR, hair_color);
+ clif_displaymessage(fd, msg_table[36]); // Appearence changed.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @charhaircolor by [MouseJstr]
+ *------------------------------------------
+ */
+int
+atcommand_charhaircolor(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ return 0;
+}
+
+/*==========================================
+ * @go [city_number/city_name]: improved by [yor] to add city names and help
+ *------------------------------------------
+ */
+int atcommand_go(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ int town;
+ char map_name[100];
+ char output[200];
+ int m;
+
+ struct { char map[16]; int x, y; } data[] = {
+ { "prontera.gat", 156, 191 }, // 0=Prontera
+ { "morocc.gat", 156, 93 }, // 1=Morroc
+ { "geffen.gat", 119, 59 }, // 2=Geffen
+ { "payon.gat", 162, 233 }, // 3=Payon
+ { "alberta.gat", 192, 147 }, // 4=Alberta
+ { "izlude.gat", 128, 114 }, // 5=Izlude
+ { "aldebaran.gat",140, 131 }, // 6=Al de Baran
+ { "xmas.gat", 147, 134 }, // 7=Lutie
+ { "comodo.gat", 209, 143 }, // 8=Comodo
+ { "yuno.gat", 157, 51 }, // 9=Yuno
+ { "amatsu.gat", 198, 84 }, // 10=Amatsu
+ { "gonryun.gat", 160, 120 }, // 11=Gon Ryun
+ { "umbala.gat", 89, 157 }, // 12=Umbala
+ { "niflheim.gat", 21, 153 }, // 13=Niflheim
+ { "louyang.gat", 217, 40 }, // 14=Lou Yang
+ { "new_1-1.gat", 53, 111 }, // 15=Start point
+ { "sec_pri.gat", 23, 61 }, // 16=Prison
+ };
+
+ memset(map_name, '\0', sizeof(map_name));
+ memset(output, '\0', sizeof(output));
+
+ // get the number
+ town = atoi(message);
+
+ // if no value, display all value
+ if (!message || !*message || sscanf(message, "%99s", map_name) < 1 || town < -3 || town >= (int)(sizeof(data) / sizeof(data[0]))) {
+ clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
+ clif_displaymessage(fd, msg_table[82]); // Please, use one of this number/name:
+ clif_displaymessage(fd, "-3=(Memo point 2) 4=Alberta 11=Gon Ryun");
+ clif_displaymessage(fd, "-2=(Memo point 1) 5=Izlude 12=Umbala");
+ clif_displaymessage(fd, "-1=(Memo point 0) 6=Al de Baran 13=Niflheim");
+ clif_displaymessage(fd, " 0=Prontera 7=Lutie 14=Lou Yang");
+ clif_displaymessage(fd, " 1=Morroc 8=Comodo 15=Start point");
+ clif_displaymessage(fd, " 2=Geffen 9=Yuno 16=Prison");
+ clif_displaymessage(fd, " 3=Payon 10=Amatsu");
+ return -1;
+ } else {
+ // get possible name of the city and add .gat if not in the name
+ map_name[sizeof(map_name)-1] = '\0';
+ for (i = 0; map_name[i]; i++)
+ map_name[i] = tolower(map_name[i]);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too)
+ if (strncmp(map_name, "prontera.gat", 3) == 0) { // 3 first characters
+ town = 0;
+ } else if (strncmp(map_name, "morocc.gat", 3) == 0) { // 3 first characters
+ town = 1;
+ } else if (strncmp(map_name, "geffen.gat", 3) == 0) { // 3 first characters
+ town = 2;
+ } else if (strncmp(map_name, "payon.gat", 3) == 0 || // 3 first characters
+ strncmp(map_name, "paion.gat", 3) == 0) { // writing error (3 first characters)
+ town = 3;
+ } else if (strncmp(map_name, "alberta.gat", 3) == 0) { // 3 first characters
+ town = 4;
+ } else if (strncmp(map_name, "izlude.gat", 3) == 0 || // 3 first characters
+ strncmp(map_name, "islude.gat", 3) == 0) { // writing error (3 first characters)
+ town = 5;
+ } else if (strncmp(map_name, "aldebaran.gat", 3) == 0 || // 3 first characters
+ strcmp(map_name, "al.gat") == 0) { // al (de baran)
+ town = 6;
+ } else if (strncmp(map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters)
+ strcmp(map_name, "christmas.gat") == 0 || // name of the symbol
+ strncmp(map_name, "xmas.gat", 3) == 0 || // 3 first characters
+ strncmp(map_name, "x-mas.gat", 3) == 0) { // writing error (3 first characters)
+ town = 7;
+ } else if (strncmp(map_name, "comodo.gat", 3) == 0) { // 3 first characters
+ town = 8;
+ } else if (strncmp(map_name, "yuno.gat", 3) == 0) { // 3 first characters
+ town = 9;
+ } else if (strncmp(map_name, "amatsu.gat", 3) == 0 || // 3 first characters
+ strncmp(map_name, "ammatsu.gat", 3) == 0) { // writing error (3 first characters)
+ town = 10;
+ } else if (strncmp(map_name, "gonryun.gat", 3) == 0) { // 3 first characters
+ town = 11;
+ } else if (strncmp(map_name, "umbala.gat", 3) == 0) { // 3 first characters
+ town = 12;
+ } else if (strncmp(map_name, "niflheim.gat", 3) == 0) { // 3 first characters
+ town = 13;
+ } else if (strncmp(map_name, "louyang.gat", 3) == 0) { // 3 first characters
+ town = 14;
+ } else if (strncmp(map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies")
+ strncmp(map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters)
+ strncmp(map_name, "begining.gat", 3) == 0) { // name of the position (3 first characters)
+ town = 15;
+ } else if (strncmp(map_name, "sec_pri.gat", 3) == 0 || // 3 first characters
+ strncmp(map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters)
+ strncmp(map_name, "jails.gat", 3) == 0) { // name of the position
+ town = 16;
+ }
+
+ if (town >= -3 && town <= -1) {
+ if (sd->status.memo_point[-town-1].map[0]) {
+ m = map_mapname2mapid(sd->status.memo_point[-town-1].map);
+ if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to this memo map.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+ if (pc_setpos(sd, sd->status.memo_point[-town-1].map, sd->status.memo_point[-town-1].x, sd->status.memo_point[-town-1].y, 3) == 0) {
+ clif_displaymessage(fd, msg_table[0]); // Warped.
+ } else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+ } else {
+ sprintf(output, msg_table[164], -town-1); // Your memo point #%d doesn't exist.
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+ } else if (town >= 0 && town < (int)(sizeof(data) / sizeof(data[0]))) {
+ m = map_mapname2mapid(data[town].map);
+ if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you to this destination map.");
+ return -1;
+ }
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp you from your actual map.");
+ return -1;
+ }
+ if (pc_setpos(sd, data[town].map, data[town].x, data[town].y, 3) == 0) {
+ clif_displaymessage(fd, msg_table[0]); // Warped.
+ } else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+ } else { // if you arrive here, you have an error in town variable when reading of names
+ clif_displaymessage(fd, msg_table[38]); // Invalid location number or name.
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_monster(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char name[100];
+ char monster[100];
+ char output[200];
+ int mob_id;
+ int number = 0;
+ int x = 0, y = 0;
+ int count;
+ int i, j, k;
+ int mx, my, range;
+
+ memset(name, '\0', sizeof(name));
+ memset(monster, '\0', sizeof(monster));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message ||
+ (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
+ sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
+ sscanf(message, "%99s %99s %d %d %d", name, monster, &number, &x, &y) < 2)) {
+ clif_displaymessage(fd, msg_table[80]); // Give a display name and monster name/id please.
+ return -1;
+ }
+
+ if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = mobdb_checkid(atoi(monster));
+
+ if (mob_id == 0) {
+ clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
+ return -1;
+ }
+
+ if (mob_id == 1288) {
+ clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
+ return -1;
+ }
+
+ if (number <= 0)
+ number = 1;
+
+ if (strlen(name) < 1)
+ strcpy(name, "--ja--");
+
+ // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
+ if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
+ number = battle_config.atc_spawn_quantity_limit;
+
+ if (battle_config.etc_log)
+ printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
+
+ count = 0;
+ range = sqrt(number) / 2;
+ range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
+ for (i = 0; i < number; i++) {
+ j = 0;
+ k = 0;
+ while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
+ if (x <= 0)
+ mx = sd->bl.x + (rand() % range - (range / 2));
+ else
+ mx = x;
+ if (y <= 0)
+ my = sd->bl.y + (rand() % range - (range / 2));
+ else
+ my = y;
+ k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
+ }
+ count += (k != 0) ? 1 : 0;
+ }
+
+ if (count != 0)
+ if (number == count)
+ clif_displaymessage(fd, msg_table[39]); // All monster summoned!
+ else {
+ sprintf(output, msg_table[240], count); // %d monster(s) summoned!
+ clif_displaymessage(fd, output);
+ }
+ else {
+ clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_spawn(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message) {
+ char name[100];
+ char monster[100];
+ char output[200];
+ int mob_id;
+ int number = 0;
+ int x = 0, y = 0;
+ int count;
+ int i, j, k;
+ int mx, my, range;
+
+ memset(name, '\0', sizeof(name));
+ memset(monster, '\0', sizeof(monster));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message ||
+ (sscanf(message, "\"%[^\"]\" %99s %d %d %d", name, monster, &number, &x, &y) < 2 &&
+ sscanf(message, "%99s \"%[^\"]\" %d %d %d", monster, name, &number, &x, &y) < 2 &&
+ sscanf(message, "%99s %d %99s %d %d", monster, &number, name, &x, &y) < 1)) {
+ clif_displaymessage(fd, msg_table[143]); // Give a monster name/id please.
+ return -1;
+ }
+
+ // If monster identifier/name argument is a name
+ if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = mobdb_checkid(atoi(monster));
+
+ if (mob_id == 0) {
+ clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
+ return -1;
+ }
+
+ if (mob_id == 1288) {
+ clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium.
+ return -1;
+ }
+
+ if (number <= 0)
+ number = 1;
+
+ if (strlen(name) < 1)
+ strcpy(name, "--ja--");
+
+ // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive
+ if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit)
+ number = battle_config.atc_spawn_quantity_limit;
+
+ if (battle_config.etc_log)
+ printf("%s monster='%s' name='%s' id=%d count=%d (%d,%d)\n", command, monster, name, mob_id, number, x, y);
+
+ count = 0;
+ range = sqrt(number) / 2;
+ range = range * 2 + 5; // calculation of an odd number (+ 4 area around)
+ for (i = 0; i < number; i++) {
+ j = 0;
+ k = 0;
+ while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area)
+ if (x <= 0)
+ mx = sd->bl.x + (rand() % range - (range / 2));
+ else
+ mx = x;
+ if (y <= 0)
+ my = sd->bl.y + (rand() % range - (range / 2));
+ else
+ my = y;
+ k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, name, mob_id, 1, "");
+ }
+ count += (k != 0) ? 1 : 0;
+ }
+
+ if (count != 0)
+ if (number == count)
+ clif_displaymessage(fd, msg_table[39]); // All monster summoned!
+ else {
+ sprintf(output, msg_table[240], count); // %d monster(s) summoned!
+ clif_displaymessage(fd, output);
+ }
+ else {
+ clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void atcommand_killmonster_sub(
+ const int fd, struct map_session_data* sd, const char* message,
+ const int drop)
+{
+ int map_id;
+ char map_name[100];
+
+ memset(map_name, '\0', sizeof(map_name));
+
+ if (!message || !*message || sscanf(message, "%99s", map_name) < 1)
+ map_id = sd->bl.m;
+ else {
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+ if ((map_id = map_mapname2mapid(map_name)) < 0)
+ map_id = sd->bl.m;
+ }
+
+ map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, drop);
+
+ clif_displaymessage(fd, msg_table[165]); // All monsters killed!
+
+ return;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_killmonster(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ atcommand_killmonster_sub(fd, sd, message, 1);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_killmonster2(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ atcommand_killmonster_sub(fd, sd, message, 0);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_refine(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i, position = 0, refine = 0, current_position, final_refine;
+ int count;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d %d", &position, &refine) < 2) {
+ clif_displaymessage(fd, "Please, enter a position and a amount (usage: @refine <equip position> <+/- amount>).");
+ return -1;
+ }
+
+ if (refine < -10)
+ refine = -10;
+ else if (refine > 10)
+ refine = 10;
+ else if (refine == 0)
+ refine = 1;
+
+ count = 0;
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].nameid && // ŠY“–ŒÂŠ‚Ì‘•”õ‚ð¸˜B‚·‚é
+ (sd->status.inventory[i].equip & position ||
+ (sd->status.inventory[i].equip && !position))) {
+ final_refine = sd->status.inventory[i].refine + refine;
+ if (final_refine > 10)
+ final_refine = 10;
+ else if (final_refine < 0)
+ final_refine = 0;
+ if (sd->status.inventory[i].refine != final_refine) {
+ sd->status.inventory[i].refine = final_refine;
+ current_position = sd->status.inventory[i].equip;
+ pc_unequipitem(sd, i, 0);
+ clif_refine(fd, sd, 0, i, sd->status.inventory[i].refine);
+ clif_delitem(sd, i, 1);
+ clif_additem(sd, i, 1, 0);
+ pc_equipitem(sd, i, current_position);
+ clif_misceffect((struct block_list*)&sd->bl, 3);
+ count++;
+ }
+ }
+ }
+
+ if (count == 0)
+ clif_displaymessage(fd, msg_table[166]); // No item has been refined!
+ else if (count == 1)
+ clif_displaymessage(fd, msg_table[167]); // 1 item has been refined!
+ else {
+ sprintf(output, msg_table[168], count); // %d items have been refined!
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_produce(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char item_name[100];
+ int item_id, attribute = 0, star = 0;
+ int flag = 0;
+ struct item_data *item_data;
+ struct item tmp_item;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+ memset(item_name, '\0', sizeof(item_name));
+
+ if (!message || !*message || sscanf(message, "%99s %d %d", item_name, &attribute, &star) < 1) {
+ clif_displaymessage(fd, "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>).");
+ return -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 (itemdb_exists(item_id) &&
+ (item_id <= 500 || item_id > 1099) &&
+ (item_id < 4001 || item_id > 4148) &&
+ (item_id < 7001 || item_id > 10019) &&
+ itemdb_isequip(item_id)) {
+ if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE)
+ attribute = ATTRIBUTE_NORMAL;
+ if (star < MIN_STAR || star > MAX_STAR)
+ star = 0;
+ memset(&tmp_item, 0, sizeof tmp_item);
+ tmp_item.nameid = item_id;
+ tmp_item.amount = 1;
+ tmp_item.identify = 1;
+ tmp_item.card[0] = 0x00ff;
+ tmp_item.card[1] = ((star * 5) << 8) + attribute;
+ *((unsigned long *)(&tmp_item.card[2])) = sd->char_id;
+ clif_produceeffect(sd, 0, item_id); // »‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg
+ clif_misceffect(&sd->bl, 3); // ‘¼l‚ɂଌ÷‚ð’Ê’m
+ if ((flag = pc_additem(sd, &tmp_item, 1)))
+ clif_additem(sd, 0, 0, flag);
+ } else {
+ if (battle_config.error_log)
+ printf("@produce NOT WEAPON [%d]\n", item_id);
+ if (item_id != 0 && itemdb_exists(item_id))
+ sprintf(output, msg_table[169], item_id, item_data->name); // This item (%d: '%s') is not an equipment.
+ else
+ sprintf(output, msg_table[170]); // This item is not an equipment.
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Sub-function to display actual memo points
+ *------------------------------------------
+ */
+void atcommand_memo_sub(struct map_session_data* sd) {
+ int i;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ clif_displaymessage(sd->fd, "Your actual memo positions are (except respawn point):");
+ for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++) {
+ if (sd->status.memo_point[i].map[0])
+ sprintf(output, "%d - %s (%d,%d)", i, sd->status.memo_point[i].map, sd->status.memo_point[i].x, sd->status.memo_point[i].y);
+ else
+ sprintf(output, msg_table[171], i); // %d - void
+ clif_displaymessage(sd->fd, output);
+ }
+
+ return;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_memo(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int position = 0;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d", &position) < 1)
+ atcommand_memo_sub(sd);
+ else {
+ if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) {
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to memo this map.");
+ return -1;
+ }
+ if (sd->status.memo_point[position].map[0]) {
+ sprintf(output, msg_table[172], position, sd->status.memo_point[position].map, sd->status.memo_point[position].x, sd->status.memo_point[position].y); // You replace previous memo position %d - %s (%d,%d).
+ clif_displaymessage(fd, output);
+ }
+ memcpy(sd->status.memo_point[position].map, map[sd->bl.m].name, 24);
+ sd->status.memo_point[position].x = sd->bl.x;
+ sd->status.memo_point[position].y = sd->bl.y;
+ clif_skill_memo(sd, 0);
+ if (pc_checkskill(sd, AL_WARP) <= (position + 1))
+ clif_displaymessage(fd, msg_table[173]); // Note: you don't have the 'Warp' skill level to use it.
+ atcommand_memo_sub(sd);
+ } else {
+ sprintf(output, "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).", MIN_PORTAL_MEMO, MAX_PORTAL_MEMO);
+ clif_displaymessage(fd, output);
+ atcommand_memo_sub(sd);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_gat(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ int y;
+
+ memset(output, '\0', sizeof(output));
+
+ for (y = 2; y >= -2; y--) {
+ sprintf(output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X",
+ map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y,
+ map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y),
+ map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y));
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_packet(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int x = 0, y = 0;
+
+ if (!message || !*message || sscanf(message, "%d %d", &x, &y) < 2) {
+ clif_displaymessage(fd, "Please, enter a status type/flag (usage: @packet <status type> <flag>).");
+ return -1;
+ }
+
+ clif_status_change(&sd->bl, x, y);
+
+ return 0;
+}
+
+/*==========================================
+ * @stpoint (Rewritten by [Yor])
+ *------------------------------------------
+ */
+int atcommand_statuspoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int point, new_status_point;
+
+ if (!message || !*message || (point = atoi(message)) == 0) {
+ clif_displaymessage(fd, "Please, enter a number (usage: @stpoint <number of points>).");
+ return -1;
+ }
+
+ new_status_point = (int)sd->status.status_point + point;
+ if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
+ new_status_point = 0x7FFF;
+ else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
+ new_status_point = 0;
+
+ if (new_status_point != (int)sd->status.status_point) {
+ sd->status.status_point = (short)new_status_point;
+ clif_updatestatus(sd, SP_STATUSPOINT);
+ clif_displaymessage(fd, msg_table[174]); // 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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @skpoint (Rewritten by [Yor])
+ *------------------------------------------
+ */
+int atcommand_skillpoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int point, new_skill_point;
+
+ if (!message || !*message || (point = atoi(message)) == 0) {
+ clif_displaymessage(fd, "Please, enter a number (usage: @skpoint <number of points>).");
+ return -1;
+ }
+
+ new_skill_point = (int)sd->status.skill_point + point;
+ if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
+ new_skill_point = 0x7FFF;
+ else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
+ new_skill_point = 0;
+
+ if (new_skill_point != (int)sd->status.skill_point) {
+ sd->status.skill_point = (short)new_skill_point;
+ clif_updatestatus(sd, SP_SKILLPOINT);
+ clif_displaymessage(fd, msg_table[175]); // 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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @zeny (Rewritten by [Yor])
+ *------------------------------------------
+ */
+int atcommand_zeny(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int zeny, new_zeny;
+
+ if (!message || !*message || (zeny = atoi(message)) == 0) {
+ clif_displaymessage(fd, "Please, enter an amount (usage: @zeny <amount>).");
+ return -1;
+ }
+
+ new_zeny = 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 != sd->status.zeny) {
+ sd->status.zeny = new_zeny;
+ clif_updatestatus(sd, SP_ZENY);
+ clif_displaymessage(fd, msg_table[176]); // 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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_param(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i, index, value = 0, new_value;
+ const char* param[] = { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL };
+ short* status[] = {
+ &sd->status.str, &sd->status.agi, &sd->status.vit,
+ &sd->status.int_, &sd->status.dex, &sd->status.luk
+ };
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) {
+ sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ index = -1;
+ for (i = 0; param[i] != NULL; i++) {
+ if (strcmpi(command, param[i]) == 0) {
+ index = i;
+ break;
+ }
+ }
+ if (index < 0 || index > MAX_STATUS_TYPE) { // normaly impossible...
+ sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
+ clif_displaymessage(fd, output);
+ return -1;
+ }
+
+ new_value = (int)*status[index] + value;
+ if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
+ new_value = battle_config.max_parameter;
+ else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
+ new_value = 1;
+
+ if (new_value != (int)*status[index]) {
+ *status[index] = new_value;
+ clif_updatestatus(sd, SP_STR + index);
+ clif_updatestatus(sd, SP_USTR + index);
+ pc_calcstatus(sd, 0);
+ clif_displaymessage(fd, msg_table[42]); // Stat changed.
+ } else {
+ if (value < 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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+//** Stat all by fritz (rewritten by [Yor])
+int atcommand_stat_all(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int index, count, value = 0, new_value;
+ short* status[] = {
+ &sd->status.str, &sd->status.agi, &sd->status.vit,
+ &sd->status.int_, &sd->status.dex, &sd->status.luk
+ };
+
+ if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0)
+ value = battle_config.max_parameter;
+
+ count = 0;
+ for (index = 0; index < (int)(sizeof(status) / sizeof(status[0])); index++) {
+
+ new_value = (int)*status[index] + value;
+ if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow
+ new_value = battle_config.max_parameter;
+ else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow
+ new_value = 1;
+
+ if (new_value != (int)*status[index]) {
+ *status[index] = new_value;
+ clif_updatestatus(sd, SP_STR + index);
+ clif_updatestatus(sd, SP_USTR + index);
+ pc_calcstatus(sd, 0);
+ count++;
+ }
+ }
+
+ if (count > 0) // if at least 1 stat modified
+ clif_displaymessage(fd, msg_table[84]); // All stats changed!
+ else {
+ if (value < 0)
+ clif_displaymessage(fd, msg_table[177]); // Impossible to decrease a stat.
+ else
+ clif_displaymessage(fd, msg_table[178]); // Impossible to increase a stat.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_guildlevelup(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int level = 0;
+ short added_level;
+ struct guild *guild_info;
+
+ if (!message || !*message || sscanf(message, "%d", &level) < 1 || level == 0) {
+ clif_displaymessage(fd, "Please, enter a valid level (usage: @guildlvup/@guildlvlup <# of levels>).");
+ return -1;
+ }
+
+ if (sd->status.guild_id <= 0 || (guild_info = guild_search(sd->status.guild_id)) == NULL) {
+ clif_displaymessage(fd, msg_table[43]); // You're not in a guild.
+ return -1;
+ }
+ if (strcmp(sd->status.name, guild_info->master) != 0) {
+ clif_displaymessage(fd, msg_table[44]); // You're not the master of your guild.
+ return -1;
+ }
+
+ added_level = (short)level;
+ if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short)MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow
+ added_level = (short)MAX_GUILDLEVEL - guild_info->guild_lv;
+ else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow
+ added_level = 1 - guild_info->guild_lv;
+
+ if (added_level != 0) {
+ intif_guild_change_basicinfo(guild_info->guild_id, GBI_GUILDLV, &added_level, 2);
+ clif_displaymessage(fd, msg_table[179]); // Guild level changed.
+ } else {
+ clif_displaymessage(fd, msg_table[45]); // Guild level change failed.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_makeegg(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct item_data *item_data;
+ int id, pet_id;
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a monter/egg name/id (usage: @makeegg <pet_id>).");
+ return -1;
+ }
+
+ if ((item_data = itemdb_searchname(message)) != NULL) // for egg name
+ id = item_data->nameid;
+ else if ((id = mobdb_searchname(message)) == 0) // for monster name
+ id = atoi(message);
+
+ pet_id = search_petDB_index(id, PET_CLASS);
+ if (pet_id < 0)
+ pet_id = search_petDB_index(id, PET_EGG);
+ if (pet_id >= 0) {
+ sd->catch_target_class = pet_db[pet_id].class;
+ intif_create_pet(
+ sd->status.account_id, sd->status.char_id,
+ pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
+ pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
+ 100, 0, 1, pet_db[pet_id].jname);
+ } else {
+ clif_displaymessage(fd, msg_table[180]); // The monter/egg name/id doesn't exist.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_hatch(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->status.pet_id <= 0)
+ clif_sendegg(sd);
+ else {
+ clif_displaymessage(fd, msg_table[181]); // You already have a pet.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_petfriendly(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int friendly;
+ int t;
+
+ if (!message || !*message || (friendly = atoi(message)) < 0) {
+ clif_displaymessage(fd, "Please, enter a valid value (usage: @petfriendly <0-1000>).");
+ return -1;
+ }
+
+ if (sd->status.pet_id > 0 && sd->pd) {
+ if (friendly >= 0 && friendly <= 1000) {
+ if (friendly != sd->pet.intimate) {
+ t = sd->pet.intimate;
+ sd->pet.intimate = friendly;
+ clif_send_petstatus(sd);
+ if (battle_config.pet_status_support) {
+ if ((sd->pet.intimate > 0 && t <= 0) ||
+ (sd->pet.intimate <= 0 && t > 0)) {
+ if (sd->bl.prev != NULL)
+ pc_calcstatus(sd, 0);
+ else
+ pc_calcstatus(sd, 2);
+ }
+ }
+ clif_displaymessage(fd, msg_table[182]); // Pet friendly value changed!
+ } else {
+ clif_displaymessage(fd, msg_table[183]); // Pet friendly is already the good value.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_pethungry(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int hungry;
+
+ if (!message || !*message || (hungry = atoi(message)) < 0) {
+ clif_displaymessage(fd, "Please, enter a valid number (usage: @pethungry <0-100>).");
+ return -1;
+ }
+
+ if (sd->status.pet_id > 0 && sd->pd) {
+ if (hungry >= 0 && hungry <= 100) {
+ if (hungry != sd->pet.hungry) {
+ sd->pet.hungry = hungry;
+ clif_send_petstatus(sd);
+ clif_displaymessage(fd, msg_table[185]); // Pet hungry value changed!
+ } else {
+ clif_displaymessage(fd, msg_table[186]); // Pet hungry is already the good value.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[37]); // An invalid number was specified.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_petrename(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->status.pet_id > 0 && sd->pd) {
+ if (sd->pet.rename_flag != 0) {
+ sd->pet.rename_flag = 0;
+ intif_save_petdata(sd->status.account_id, &sd->pet);
+ clif_send_petstatus(sd);
+ clif_displaymessage(fd, msg_table[187]); // You can now rename your pet.
+ } else {
+ clif_displaymessage(fd, msg_table[188]); // You can already rename your pet.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[184]); // Sorry, but you have no pet.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_charpetrename(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charpetrename <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
+ if (pl_sd->pet.rename_flag != 0) {
+ pl_sd->pet.rename_flag = 0;
+ intif_save_petdata(pl_sd->status.account_id, &pl_sd->pet);
+ clif_send_petstatus(pl_sd);
+ clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
+ } else {
+ clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
+ return -1;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int
+atcommand_recall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd = NULL;
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @recall <char name>).");
+ return -1;
+ }
+
+ memset(character, '\0', sizeof character);
+ if(sscanf(message, "%99[^\n]", character) < 1)
+ return -1;
+ if(strncmp(sd->status.name,character,24)==0)
+ return -1;
+
+ intif_charmovereq(sd,character,1);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp somenone to your actual 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;
+ }
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ sprintf(output, msg_table[46], character); // %s recalled!
+ 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;
+}
+
+/*==========================================
+ * ‘ÎÛƒLƒƒƒ‰ƒNƒ^[‚ð“]E‚³‚¹‚é upperŽw’è‚Å“]¶‚â—{Žq‚à‰Â”\
+ *------------------------------------------
+ */
+int atcommand_character_job(
+ 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;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a job and a player name (usage: @charjob/@charjobchange <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: @charjob/@charjobchange <job ID> <char name>).");
+ return -1;
+ }
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ 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)) {
+
+ // fix pecopeco display
+ if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
+ if (pc_isriding(sd)) {
+ if (pl_sd->status.class == 13)
+ pl_sd->status.class = pl_sd->view_class = 7;
+ if (pl_sd->status.class == 21)
+ pl_sd->status.class = pl_sd->view_class = 14;
+ if (pl_sd->status.class == 4014)
+ pl_sd->status.class = pl_sd->view_class = 4008;
+ if (pl_sd->status.class == 4022)
+ pl_sd->status.class = pl_sd->view_class = 4015;
+ pl_sd->status.option &= ~0x0020;
+ clif_changeoption(&pl_sd->bl);
+ pc_calcstatus(pl_sd, 0);
+ }
+ } else {
+ if (!pc_isriding(sd)) {
+ if (job == 13)
+ job = 7;
+ if (job == 21)
+ job = 14;
+ if (job == 4014)
+ job = 4008;
+ if (job == 4022)
+ job = 4015;
+ }
+ }
+
+ 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 atcommand_revive(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ pl_sd->status.hp = pl_sd->status.max_hp;
+ pc_setstand(pl_sd);
+ if (battle_config.pc_invincible_time > 0)
+ pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
+ clif_updatestatus(pl_sd, SP_HP);
+ clif_updatestatus(pl_sd, SP_SP);
+ clif_resurrection(&pl_sd->bl, 1);
+ clif_displaymessage(fd, msg_table[51]); // Character revived.
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_character_stats(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char job_jobname[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+ int i;
+
+ memset(character, '\0', sizeof(character));
+ memset(job_jobname, '\0', sizeof(job_jobname));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charstats <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ struct {
+ const char* format;
+ int value;
+ } output_table[] = {
+ { "Base Level - %d", pl_sd->status.base_level },
+ { job_jobname, pl_sd->status.job_level },
+ { "Hp - %d", pl_sd->status.hp },
+ { "MaxHp - %d", pl_sd->status.max_hp },
+ { "Sp - %d", pl_sd->status.sp },
+ { "MaxSp - %d", pl_sd->status.max_sp },
+ { "Str - %3d", pl_sd->status.str },
+ { "Agi - %3d", pl_sd->status.agi },
+ { "Vit - %3d", pl_sd->status.vit },
+ { "Int - %3d", pl_sd->status.int_ },
+ { "Dex - %3d", pl_sd->status.dex },
+ { "Luk - %3d", pl_sd->status.luk },
+ { "Zeny - %d", pl_sd->status.zeny },
+ { NULL, 0 }
+ };
+ 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 Stats All by fritz
+int atcommand_character_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;
+ struct map_session_data *pl_sd;
+
+ memset(output, '\0', sizeof(output));
+ memset(gmlevel, '\0', sizeof(gmlevel));
+
+ count = 0;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_character_option(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ int opt1 = 0, opt2 = 0, opt3 = 0;
+ struct map_session_data* pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3, character) < 4 || opt1 < 0 || opt2 < 0 || opt3 < 0) {
+ clif_displaymessage(fd, "Please, enter valid options and a player name (usage: @charoption <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->opt1 = opt1;
+ pl_sd->opt2 = opt2;
+ pl_sd->status.option = opt3;
+ // fix pecopeco display
+ if (pl_sd->status.class == 13 || pl_sd->status.class == 21 || pl_sd->status.class == 4014 || pl_sd->status.class == 4022) {
+ if (!pc_isriding(pl_sd)) { // pl_sd have the new value...
+ if (pl_sd->status.class == 13)
+ pl_sd->status.class = pl_sd->view_class = 7;
+ else if (pl_sd->status.class == 21)
+ pl_sd->status.class = pl_sd->view_class = 14;
+ else if (pl_sd->status.class == 4014)
+ pl_sd->status.class = pl_sd->view_class = 4008;
+ else if (pl_sd->status.class == 4022)
+ pl_sd->status.class = pl_sd->view_class = 4015;
+ }
+ } else {
+ if (pc_isriding(pl_sd)) { // pl_sd have the new value...
+ if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor])
+ pl_sd->status.option &= ~0x0020;
+ } else {
+ if (pl_sd->status.class == 7)
+ pl_sd->status.class = pl_sd->view_class = 13;
+ else if (pl_sd->status.class == 14)
+ pl_sd->status.class = pl_sd->view_class = 21;
+ else if (pl_sd->status.class == 4008)
+ pl_sd->status.class = pl_sd->view_class = 4014;
+ else if (pl_sd->status.class == 4015)
+ pl_sd->status.class = pl_sd->view_class = 4022;
+ else
+ pl_sd->status.option &= ~0x0020;
+ }
+ }
+ }
+ clif_changeoption(&pl_sd->bl);
+ pc_calcstatus(pl_sd, 0);
+ 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;
+}
+
+/*==========================================
+ * charchangesex command (usage: charchangesex <player_name>)
+ *------------------------------------------
+ */
+int atcommand_char_change_sex(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>).");
+ return -1;
+ }
+
+ // check player name
+ if (strlen(character) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(character) > 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, character, 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;
+}
+
+/*==========================================
+ * charblock command (usage: charblock <player_name>)
+ * This command do a definitiv ban on a player
+ *------------------------------------------
+ */
+int atcommand_char_block(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charblock/@block <name>).");
+ return -1;
+ }
+
+ // check player name
+ if (strlen(character) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(character) > 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, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
+ clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * charban command (usage: charban <time> <player_name>)
+ * This command do a limited ban on a player
+ * Time 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> @ban +1m-2mn1s-6y test_player
+ * this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time.
+ *------------------------------------------
+ */
+int atcommand_char_ban(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char modif[100], character[100];
+ char * modif_p;
+ int year, month, day, hour, minute, second, value;
+
+ memset(modif, '\0', sizeof(modif));
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%s %99[^\n]", modif, character) < 2) {
+ clif_displaymessage(fd, "Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>).");
+ return -1;
+ }
+
+ modif[sizeof(modif)-1] = '\0';
+ character[sizeof(character)-1] = '\0';
+
+ modif_p = modif;
+ year = month = day = hour = minute = second = 0;
+ while (modif_p[0] != '\0') {
+ value = atoi(modif_p);
+ if (value == 0)
+ modif_p++;
+ else {
+ if (modif_p[0] == '-' || modif_p[0] == '+')
+ modif_p++;
+ while (modif_p[0] >= '0' && modif_p[0] <= '9')
+ modif_p++;
+ if (modif_p[0] == 's') {
+ second = value;
+ modif_p++;
+ } else if (modif_p[0] == 'm' && modif_p[1] == 'n') {
+ minute = value;
+ modif_p = modif_p + 2;
+ } else if (modif_p[0] == 'h') {
+ hour = value;
+ modif_p++;
+ } else if (modif_p[0] == 'd' || modif_p[0] == 'j') {
+ day = value;
+ modif_p++;
+ } else if (modif_p[0] == 'm') {
+ month = value;
+ modif_p++;
+ } else if (modif_p[0] == 'y' || modif_p[0] == 'a') {
+ year = value;
+ modif_p++;
+ } else if (modif_p[0] != '\0') {
+ modif_p++;
+ }
+ }
+ }
+ if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) {
+ clif_displaymessage(fd, msg_table[85]); // Invalid time for ban command.
+ return -1;
+ }
+
+ // check player name
+ if (strlen(character) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(character) > 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, character, 2, year, month, day, hour, minute, second); // type: 2 - ban
+ clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * charunblock command (usage: charunblock <player_name>)
+ *------------------------------------------
+ */
+int atcommand_char_unblock(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charunblock <player_name>).");
+ return -1;
+ }
+
+ // check player name
+ if (strlen(character) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(character) > 23) {
+ clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
+ return -1;
+ } else {
+ // send answer to login server via char-server
+ chrif_char_ask_name(sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
+ clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * charunban command (usage: charunban <player_name>)
+ *------------------------------------------
+ */
+int atcommand_char_unban(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charunban <player_name>).");
+ return -1;
+ }
+
+ // check player name
+ if (strlen(character) < 4) {
+ clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters.
+ return -1;
+ } else if (strlen(character) > 23) {
+ clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum.
+ return -1;
+ } else {
+ // send answer to login server via char-server
+ chrif_char_ask_name(sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban
+ clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_character_save(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char map_name[100];
+ char character[100];
+ struct map_session_data* pl_sd;
+ int x = 0, y = 0;
+ int m;
+
+ memset(map_name, '\0', sizeof(map_name));
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99s %d %d %99[^\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: @charsave <map> <x> <y> <charname>).");
+ return -1;
+ }
+
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 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) {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ } else {
+ if (m >= 0 && map[m].flag.nowarpto && 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;
+ }
+ pc_setsavepoint(pl_sd, 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_night(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ if (night_flag != 1) {
+ night_flag = 1; // 0=day, 1=night [Yor]
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_sd->opt2 |= STATE_BLIND;
+ clif_changeoption(&pl_sd->bl);
+ clif_displaymessage(pl_sd->fd, msg_table[59]); // Night has fallen.
+ }
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[89]); // Sorry, it's already the night. Impossible to execute the command.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_day(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ if (night_flag != 0) {
+ night_flag = 0; // 0=day, 1=night [Yor]
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_sd->opt2 &= ~STATE_BLIND;
+ clif_changeoption(&pl_sd->bl);
+ clif_displaymessage(pl_sd->fd, msg_table[60]); // Day has arrived.
+ }
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[90]); // Sorry, it's already the day. Impossible to execute the command.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_doom(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd &&
+ pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
+ }
+ }
+ clif_displaymessage(fd, msg_table[62]); // Judgement was made.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_doommap(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m &&
+ pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level
+ pc_damage(NULL, pl_sd, pl_sd->status.hp + 1);
+ clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement.
+ }
+ }
+ clif_displaymessage(fd, msg_table[62]); // Judgement was made.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static void atcommand_raise_sub(struct map_session_data* sd)
+{
+ if (sd && sd->state.auth && pc_isdead(sd)) {
+ sd->status.hp = sd->status.max_hp;
+ sd->status.sp = sd->status.max_sp;
+ pc_setstand(sd);
+ clif_updatestatus(sd, SP_HP);
+ clif_updatestatus(sd, SP_SP);
+ clif_resurrection(&sd->bl, 1);
+ if (battle_config.pc_invincible_time > 0)
+ pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
+ clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown.
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_raise(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i])
+ atcommand_raise_sub(session[i]->session_data);
+ }
+ clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_raisemap(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->bl.m == pl_sd->bl.m)
+ atcommand_raise_sub(pl_sd);
+ }
+ clif_displaymessage(fd, msg_table[64]); // Mercy has been granted.
+
+ return 0;
+}
+
+/*==========================================
+ * atcommand_character_baselevel @charbaselvl‚Å‘ÎÛƒLƒƒƒ‰‚̃Œƒxƒ‹‚ðã‚°‚é
+ *------------------------------------------
+*/
+int atcommand_character_baselevel(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ int level = 0, i;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charbaselvl <#> <nickname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != 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 == battle_config.maximum_level) { // 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 (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow
+ level = battle_config.maximum_level - pl_sd->status.base_level;
+ for (i = 1; i <= level; i++)
+ pl_sd->status.status_point += (pl_sd->status.base_level + i + 14) / 5;
+ pl_sd->status.base_level += level;
+ clif_updatestatus(pl_sd, SP_BASELEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
+ clif_updatestatus(pl_sd, SP_STATUSPOINT);
+ pc_calcstatus(pl_sd, 0);
+ pc_heal(pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp);
+ 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;
+ }
+ if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow
+ level = 1 - pl_sd->status.base_level;
+ if (pl_sd->status.status_point > 0) {
+ for (i = 0; i > level; i--)
+ pl_sd->status.status_point -= (pl_sd->status.base_level + i + 14) / 5;
+ if (pl_sd->status.status_point < 0)
+ pl_sd->status.status_point = 0;
+ clif_updatestatus(pl_sd, SP_STATUSPOINT);
+ } // to add: remove status points from stats
+ pl_sd->status.base_level += level;
+ clif_updatestatus(pl_sd, SP_BASELEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTBASEEXP);
+ pc_calcstatus(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—¹
+}
+
+/*==========================================
+ * atcommand_character_joblevel @charjoblvl‚Å‘ÎÛƒLƒƒƒ‰‚ÌJobƒŒƒxƒ‹‚ðã‚°‚é
+ *------------------------------------------
+ */
+int atcommand_character_joblevel(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ int max_level = 50, level = 0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job pl_s_class;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) {
+ clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ pl_s_class = pc_calc_base_job(pl_sd->status.class);
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level
+ if (pl_s_class.job == 0)
+ max_level -= 40;
+ if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //ƒXƒpƒmƒr‚Æ“]¶E‚ÍJobƒŒƒxƒ‹‚ÌÅ‚‚ª70
+ max_level += 20;
+
+ if (level > 0) {
+ if (pl_sd->status.job_level == max_level) {
+ clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher.
+ return -1;
+ }
+ if (pl_sd->status.job_level + level > max_level)
+ level = max_level - pl_sd->status.job_level;
+ pl_sd->status.job_level += level;
+ clif_updatestatus(pl_sd, SP_JOBLEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
+ pl_sd->status.skill_point += level;
+ clif_updatestatus(pl_sd, SP_SKILLPOINT);
+ pc_calcstatus(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;
+ }
+ if (pl_sd->status.job_level + level < 1)
+ level = 1 - pl_sd->status.job_level;
+ pl_sd->status.job_level += level;
+ clif_updatestatus(pl_sd, SP_JOBLEVEL);
+ clif_updatestatus(pl_sd, SP_NEXTJOBEXP);
+ if (pl_sd->status.skill_point > 0) {
+ pl_sd->status.skill_point += level;
+ if (pl_sd->status.skill_point < 0)
+ pl_sd->status.skill_point = 0;
+ clif_updatestatus(pl_sd, SP_SKILLPOINT);
+ } // to add: remove status points from skills
+ pc_calcstatus(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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_kick(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @kick <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level
+ clif_GM_kick(sd, pl_sd, 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 atcommand_kickall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
+ pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kick only lower or same gm level
+ if (sd->status.account_id != pl_sd->status.account_id)
+ clif_GM_kick(sd, pl_sd, 0);
+ }
+ }
+
+ clif_displaymessage(fd, msg_table[195]); // All players have been kicked!
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_allskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ pc_allskillup(sd); // all skills
+ sd->status.skill_point = 0; // 0 skill points
+ clif_updatestatus(sd, SP_SKILLPOINT); // update
+ clif_displaymessage(fd, msg_table[76]); // You have received all skills.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_questskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int skill_id;
+
+ if (!message || !*message || (skill_id = atoi(message)) < 0) {
+ clif_displaymessage(fd, "Please, enter a quest skill number (usage: @questskill <#:0+>).");
+ return -1;
+ }
+
+ if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
+ if (skill_get_inf2(skill_id) & 0x01) {
+ if (pc_checkskill(sd, skill_id) == 0) {
+ pc_skill(sd, skill_id, 1, 0);
+ clif_displaymessage(fd, msg_table[70]); // You have learned the skill.
+ } else {
+ clif_displaymessage(fd, msg_table[196]); // You already have this quest skill.
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_charquestskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+ int skill_id = 0;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 2 || skill_id < 0) {
+ clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>).");
+ return -1;
+ }
+
+ if (skill_id >= 0 && skill_id < MAX_SKILL_DB) {
+ if (skill_get_inf2(skill_id) & 0x01) {
+ if ((pl_sd = map_nick2sd(character)) != 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_lostskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int skill_id;
+
+ if (!message || !*message || (skill_id = atoi(message)) < 0) {
+ clif_displaymessage(fd, "Please, enter a quest skill number (usage: @lostskill <#:0+>).");
+ return -1;
+ }
+
+ if (skill_id >= 0 && skill_id < MAX_SKILL) {
+ if (skill_get_inf2(skill_id) & 0x01) {
+ if (pc_checkskill(sd, skill_id) > 0) {
+ sd->status.skill[skill_id].lv = 0;
+ sd->status.skill[skill_id].flag = 0;
+ clif_skillinfoblock(sd);
+ clif_displaymessage(fd, msg_table[71]); // You have forgotten the skill.
+ } else {
+ clif_displaymessage(fd, msg_table[201]); // You don't have this quest skill.
+ 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_charlostskill(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+ int skill_id = 0;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 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) & 0x01) {
+ if ((pl_sd = map_nick2sd(character)) != 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;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_spiritball(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int number;
+
+ if (!message || !*message || (number = atoi(message)) < 0) {
+ clif_displaymessage(fd, "Please, enter a spirit ball number (usage: @spiritball <number: 0-1000>).");
+ return -1;
+ }
+
+ // set max number to avoid server/client crash (500 create big balls of several balls: no visial difference with more)
+ if (number > 500)
+ number = 500;
+
+ if (number >= 0 && number <= 0x7FFF) {
+ if (sd->spiritball != number || number > 499) {
+ if (sd->spiritball > 0)
+ pc_delspiritball(sd, sd->spiritball, 1);
+ sd->spiritball = number;
+ clif_spiritball(sd);
+ // no message, player can look the difference
+ if (number > 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;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_party(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char party[100];
+
+ memset(party, '\0', sizeof(party));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", party) < 1) {
+ clif_displaymessage(fd, "Please, enter a party name (usage: @party <party_name>).");
+ return -1;
+ }
+
+ party_create(sd, party);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_guild(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char guild[100];
+ int prev;
+
+ memset(guild, '\0', sizeof(guild));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", guild) < 1) {
+ clif_displaymessage(fd, "Please, enter a guild name (usage: @guild <guild_name>).");
+ return -1;
+ }
+
+ prev = battle_config.guild_emperium_check;
+ battle_config.guild_emperium_check = 0;
+ guild_create(sd, guild);
+ battle_config.guild_emperium_check = prev;
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_agitstart(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (agit_flag == 1) {
+ clif_displaymessage(fd, msg_table[73]); // Already it has started siege warfare.
+ return -1;
+ }
+
+ agit_flag = 1;
+ guild_agit_start();
+ clif_displaymessage(fd, msg_table[72]); // Guild siege warfare start!
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_agitend(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (agit_flag == 0) {
+ clif_displaymessage(fd, msg_table[75]); // Siege warfare hasn't started yet.
+ return -1;
+ }
+
+ agit_flag = 0;
+ guild_agit_end();
+ clif_displaymessage(fd, msg_table[74]); // Guild siege warfare end!
+
+ return 0;
+}
+
+/*==========================================
+ * @mapexit‚Ń}ƒbƒvƒT[ƒo[‚ðI—¹‚³‚¹‚é
+ *------------------------------------------
+ */
+int atcommand_mapexit(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ if (sd->status.account_id != pl_sd->status.account_id)
+ clif_GM_kick(sd, pl_sd, 0);
+ }
+ }
+ clif_GM_kick(sd, sd, 0);
+
+ runflag = 0;
+
+ return 0;
+}
+
+/*==========================================
+ * idsearch <part_of_name>: revrited by [Yor]
+ *------------------------------------------
+ */
+int atcommand_idsearch(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char item_name[100];
+ char output[200];
+ int i, match;
+ struct item_data *item;
+
+ memset(item_name, '\0', sizeof(item_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99s", item_name) < 0) {
+ clif_displaymessage(fd, "Please, enter a part of item name (usage: @idsearch <part_of_item_name>).");
+ return -1;
+ }
+
+ sprintf(output, msg_table[77], item_name); // The reference result of '%s' (name: id):
+ clif_displaymessage(fd, output);
+ match = 0;
+ for(i = 0; i < 20000; i++) {
+ if ((item = itemdb_exists(i)) != NULL && strstr(item->jname, item_name) != NULL) {
+ match++;
+ sprintf(output, msg_table[78], item->jname, item->nameid); // %s: %d
+ clif_displaymessage(fd, output);
+ }
+ }
+ sprintf(output, msg_table[79], match); // It is %d affair above.
+ clif_displaymessage(fd, output);
+
+ return 0;
+}
+
+/*==========================================
+ * Character Skill Reset
+ *------------------------------------------
+ */
+int atcommand_charskreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level
+ pc_resetskill(pl_sd);
+ sprintf(output, msg_table[206], character); // '%s' skill 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;
+}
+
+/*==========================================
+ * Character Stat Reset
+ *------------------------------------------
+ */
+int atcommand_charstreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != 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(output, msg_table[207], character); // '%s' 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;
+}
+
+/*==========================================
+ * Character Reset
+ *------------------------------------------
+ */
+int atcommand_charreset(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ char output[200];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charreset <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);
+ 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;
+}
+
+/*==========================================
+ * Character Model by chbrules
+ *------------------------------------------
+ */
+int atcommand_charmodel(
+ 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 character[100];
+ char output[200];
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &hair_style, &hair_color, &cloth_color, character) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) {
+ sprintf(output, "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, output);
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != 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) {
+
+ if (cloth_color != 0 &&
+ pl_sd->status.sex == 1 &&
+ (pl_sd->status.class == 12 || pl_sd->status.class == 17)) {
+ 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 atcommand_charskpoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ int new_skill_point;
+ int point = 0;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 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(character)) != NULL) {
+ new_skill_point = (int)pl_sd->status.skill_point + point;
+ if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow
+ new_skill_point = 0x7FFF;
+ else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow
+ new_skill_point = 0;
+ 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 atcommand_charstpoint(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ int new_status_point;
+ int point = 0;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 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(character)) != NULL) {
+ new_status_point = (int)pl_sd->status.status_point + point;
+ if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow
+ new_status_point = 0x7FFF;
+ else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow
+ new_status_point = 0;
+ 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;
+}
+
+/*==========================================
+ * Character Zeny Point (Rewritten by [Yor])
+ *------------------------------------------
+ */
+int atcommand_charzeny(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ int zeny = 0, new_zeny;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0) {
+ clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charzeny <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;
+}
+
+/*==========================================
+ * Recall All Characters Online To Your Location
+ *------------------------------------------
+ */
+int atcommand_recallall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+ int count;
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
+ return -1;
+ }
+
+ count = 0;
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->status.account_id != pl_sd->status.account_id &&
+ pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level
+ if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
+ count++;
+ else
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ }
+ }
+
+ clif_displaymessage(fd, msg_table[92]); // All characters recalled!
+ if (count) {
+ sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
+ clif_displaymessage(fd, output);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Recall online characters of a guild to your location
+ *------------------------------------------
+ */
+int atcommand_guildrecall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int i;
+ char guild_name[100];
+ char output[200];
+ struct guild *g;
+ int count;
+
+ memset(guild_name, '\0', sizeof(guild_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
+ clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>).");
+ return -1;
+ }
+
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
+ return -1;
+ }
+
+ if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
+ (g = guild_search(atoi(message))) != NULL) {
+ count = 0;
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
+ sd->status.account_id != pl_sd->status.account_id &&
+ pl_sd->status.guild_id == g->guild_id) {
+ if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
+ count++;
+ else
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ }
+ }
+ sprintf(output, msg_table[93], g->name); // All online characters of the %s guild are near you.
+ clif_displaymessage(fd, output);
+ if (count) {
+ sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Recall online characters of a party to your location
+ *------------------------------------------
+ */
+int atcommand_partyrecall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ struct map_session_data *pl_sd;
+ char party_name[100];
+ char output[200];
+ struct party *p;
+ int count;
+
+ memset(party_name, '\0', sizeof(party_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
+ clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyrecall <party_name/id>).");
+ return -1;
+ }
+
+ if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) {
+ clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map.");
+ return -1;
+ }
+
+ if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
+ (p = party_search(atoi(message))) != NULL) {
+ count = 0;
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
+ sd->status.account_id != pl_sd->status.account_id &&
+ pl_sd->status.party_id == p->party_id) {
+ if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd))
+ count++;
+ else
+ pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2);
+ }
+ }
+ sprintf(output, msg_table[95], p->name); // All online characters of the %s party are near you.
+ clif_displaymessage(fd, output);
+ if (count) {
+ sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count);
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_reloaditemdb(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ itemdb_reload();
+ clif_displaymessage(fd, msg_table[97]); // Item database reloaded.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_reloadmobdb(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ mob_reload();
+ clif_displaymessage(fd, msg_table[98]); // Monster database reloaded.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_reloadskilldb(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ skill_reload();
+ clif_displaymessage(fd, msg_table[99]); // Skill database reloaded.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+#ifndef TXT_ONLY
+int atcommand_rehash(
+#else /* TXT_ONLY */
+int atcommand_reloadscript(
+#endif /* TXT_ONLY */
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+#ifndef TXT_ONLY
+ atcommand_broadcast( fd, sd, "@broadcast", "eAthena SQL Server is Rehashing..." );
+ atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" );
+
+ rehash( fd, sd );
+
+ atcommand_broadcast( fd, sd, "@broadcast", "Reloading NPCs..." );
+#endif /* not TXT_ONLY */
+ do_init_npc();
+ do_init_script();
+
+ npc_event_do_oninit();
+
+ clif_displaymessage(fd, msg_table[100]); // Scripts reloaded.
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_reloadgmdb( // by [Yor]
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ chrif_reloadGMdb();
+
+ clif_displaymessage(fd, msg_table[101]); // Login-server asked to reload GM accounts and their level.
+
+ return 0;
+}
+
+/*==========================================
+ * @mapinfo <map name> [0-3] by MC_Cameri
+ * => Shows information about the map [map name]
+ * 0 = no additional information
+ * 1 = Show users in that map and their location
+ * 2 = Shows NPCs in that map
+ * 3 = Shows the shops/chats in that map (not implemented)
+ *------------------------------------------
+ */
+int atcommand_mapinfo(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ struct npc_data *nd = NULL;
+ struct chat_data *cd = NULL;
+ char output[200], map_name[100];
+ char direction[12];
+ int m_id, i, chat_num, list = 0;
+
+ memset(output, '\0', sizeof(output));
+ memset(map_name, '\0', sizeof(map_name));
+ memset(direction, '\0', sizeof(direction));
+
+ sscanf(message, "%d %99[^\n]", &list, map_name);
+
+ if (list < 0 || list > 3) {
+ clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
+ return -1;
+ }
+
+ if (map_name[0] == '\0')
+ strcpy(map_name, sd->mapname);
+ if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat)
+ strcat(map_name, ".gat");
+
+ if ((m_id = map_mapname2mapid(map_name)) < 0) {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ return -1;
+ }
+
+ clif_displaymessage(fd, "------ Map Info ------");
+ sprintf(output, "Map Name: %s", map_name);
+ clif_displaymessage(fd, output);
+ sprintf(output, "Players In Map: %d", map[m_id].users);
+ clif_displaymessage(fd, output);
+ sprintf(output, "NPCs In Map: %d", map[m_id].npc_num);
+ clif_displaymessage(fd, output);
+ chat_num = 0;
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
+ (cd = (struct chat_data*)map_id2bl(pl_sd->chatID))) {
+ chat_num++;
+ }
+ }
+ sprintf(output, "Chats In Map: %d", chat_num);
+ clif_displaymessage(fd, output);
+ clif_displaymessage(fd, "------ Map Flags ------");
+ sprintf(output, "Player vs Player: %s | No Guild: %s | No Party: %s",
+ (map[m_id].flag.pvp) ? "True" : "False",
+ (map[m_id].flag.pvp_noguild) ? "True" : "False",
+ (map[m_id].flag.pvp_noparty) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "Guild vs Guild: %s | No Party: %s", (map[m_id].flag.gvg) ? "True" : "False", (map[m_id].flag.gvg_noparty) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Dead Branch: %s", (map[m_id].flag.nobranch) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Memo: %s", (map[m_id].flag.nomemo) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Penalty: %s", (map[m_id].flag.nopenalty) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Return: %s", (map[m_id].flag.noreturn) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Save: %s", (map[m_id].flag.nosave) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Teleport: %s", (map[m_id].flag.noteleport) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Monster Teleport: %s", (map[m_id].flag.monster_noteleport) ? "True" : "False");
+ clif_displaymessage(fd, output);
+ sprintf(output, "No Zeny Penalty: %s", (map[m_id].flag.nozenypenalty) ? "True" : "False");
+ clif_displaymessage(fd, output);
+
+ switch (list) {
+ case 0:
+ // Do nothing. It's list 0, no additional display.
+ break;
+ case 1:
+ clif_displaymessage(fd, "----- Players in Map -----");
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && strcmp(pl_sd->mapname, map_name) == 0) {
+ sprintf(output, "Player '%s' (session #%d) | Location: %d,%d",
+ pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, output);
+ }
+ }
+ break;
+ case 2:
+ clif_displaymessage(fd, "----- NPCs in Map -----");
+ for (i = 0; i < map[m_id].npc_num;) {
+ nd = map[m_id].npc[i];
+ switch(nd->dir) {
+ case 0: strcpy(direction, "North"); break;
+ case 1: strcpy(direction, "North West"); break;
+ case 2: strcpy(direction, "West"); break;
+ case 3: strcpy(direction, "South West"); break;
+ case 4: strcpy(direction, "South"); break;
+ case 5: strcpy(direction, "South East"); break;
+ case 6: strcpy(direction, "East"); break;
+ case 7: strcpy(direction, "North East"); break;
+ case 9: strcpy(direction, "North"); break;
+ default: strcpy(direction, "Unknown"); break;
+ }
+ sprintf(output, "NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d",
+ ++i, nd->name, direction, nd->class, nd->bl.x, nd->bl.y);
+ clif_displaymessage(fd, output);
+ }
+ break;
+ case 3:
+ clif_displaymessage(fd, "----- Chats in Map -----");
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth &&
+ (cd = (struct chat_data*)map_id2bl(pl_sd->chatID)) &&
+ strcmp(pl_sd->mapname, map_name) == 0 &&
+ cd->usersd[0] == pl_sd) {
+ sprintf(output, "Chat %d: %s | Player: %s | Location: %d %d",
+ i, cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y);
+ clif_displaymessage(fd, output);
+ sprintf(output, " Users: %d/%d | Password: %s | Public: %s",
+ cd->users, cd->limit, cd->pass, (cd->pub) ? "Yes" : "No");
+ clif_displaymessage(fd, output);
+ }
+ }
+ break;
+ default: // normally impossible to arrive here
+ clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map]).");
+ return -1;
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_mount_peco(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(fd, msg_table[212]); // Cannot mount a Peco while in disguise.
+ return -1;
+ }
+
+ if (!pc_isriding(sd)) { // if actually no peco
+ if (sd->status.class == 7 || sd->status.class == 14 || sd->status.class == 4008 || sd->status.class == 4015) {
+ if (sd->status.class == 7)
+ sd->status.class = sd->view_class = 13;
+ else if (sd->status.class == 14)
+ sd->status.class = sd->view_class = 21;
+ else if (sd->status.class == 4008)
+ sd->status.class = sd->view_class = 4014;
+ else if (sd->status.class == 4015)
+ sd->status.class = sd->view_class = 4022;
+ pc_setoption(sd, sd->status.option | 0x0020);
+ clif_displaymessage(fd, msg_table[102]); // Mounted Peco.
+ } else {
+ clif_displaymessage(fd, msg_table[213]); // You can not mount a peco with your job.
+ return -1;
+ }
+ } else {
+ if (sd->status.class == 13)
+ sd->status.class = sd->view_class = 7;
+ else if (sd->status.class == 21)
+ sd->status.class = sd->view_class = 14;
+ else if (sd->status.class == 4014)
+ sd->status.class = sd->view_class = 4008;
+ else if (sd->status.class == 4022)
+ sd->status.class = sd->view_class = 4015;
+ pc_setoption(sd, sd->status.option & ~0x0020);
+ clif_displaymessage(fd, msg_table[214]); // Unmounted Peco.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_char_mount_peco(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charmountpeco <char_name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(fd, msg_table[215]); // This player cannot mount a Peco while in disguise.
+ return -1;
+ }
+
+ if (!pc_isriding(pl_sd)) { // if actually no peco
+ if (pl_sd->status.class == 7 || pl_sd->status.class == 14 || pl_sd->status.class == 4008 || pl_sd->status.class == 4015) {
+ if (pl_sd->status.class == 7)
+ pl_sd->status.class = pl_sd->view_class = 13;
+ else if (pl_sd->status.class == 14)
+ pl_sd->status.class = pl_sd->view_class = 21;
+ else if (pl_sd->status.class == 4008)
+ pl_sd->status.class = pl_sd->view_class = 4014;
+ else if (pl_sd->status.class == 4015)
+ pl_sd->status.class = pl_sd->view_class = 4022;
+ pc_setoption(pl_sd, pl_sd->status.option | 0x0020);
+ clif_displaymessage(fd, msg_table[216]); // Now, this player mounts a peco.
+ } else {
+ clif_displaymessage(fd, msg_table[217]); // This player can not mount a peco with his/her job.
+ return -1;
+ }
+ } else {
+ if (pl_sd->status.class == 13)
+ pl_sd->status.class = pl_sd->view_class = 7;
+ else if (pl_sd->status.class == 21)
+ pl_sd->status.class = pl_sd->view_class = 14;
+ else if (pl_sd->status.class == 4014)
+ pl_sd->status.class = pl_sd->view_class = 4008;
+ else if (pl_sd->status.class == 4022)
+ pl_sd->status.class = pl_sd->view_class = 4015;
+ pc_setoption(pl_sd, pl_sd->status.option & ~0x0020);
+ clif_displaymessage(fd, msg_table[218]); // Now, this player has not more peco.
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[3]); // Character not found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *Spy Commands by Syrus22
+ *------------------------------------------
+ */
+int atcommand_guildspy(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char guild_name[100];
+ char output[200];
+ struct guild *g;
+
+ memset(guild_name, '\0', sizeof(guild_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
+ clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildspy <guild_name/id>).");
+ return -1;
+ }
+
+ if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
+ (g = guild_search(atoi(message))) != NULL) {
+ if (sd->guildspy == g->guild_id) {
+ sd->guildspy = 0;
+ sprintf(output, msg_table[103], g->name); // No longer spying on the %s guild.
+ clif_displaymessage(fd, output);
+ } else {
+ sd->guildspy = g->guild_id;
+ sprintf(output, msg_table[104], g->name); // Spying on the %s guild.
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_partyspy(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char party_name[100];
+ char output[200];
+ struct party *p;
+
+ memset(party_name, '\0', sizeof(party_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) {
+ clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyspy <party_name/id>).");
+ return -1;
+ }
+
+ if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number
+ (p = party_search(atoi(message))) != NULL) {
+ if (sd->partyspy == p->party_id) {
+ sd->partyspy = 0;
+ sprintf(output, msg_table[105], p->name); // No longer spying on the %s party.
+ clif_displaymessage(fd, output);
+ } else {
+ sd->partyspy = p->party_id;
+ sprintf(output, msg_table[106], p->name); // Spying on the %s party.
+ clif_displaymessage(fd, output);
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @repairall [Valaris]
+ *------------------------------------------
+ */
+int atcommand_repairall(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int count, i;
+
+ count = 0;
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].nameid && sd->status.inventory[i].attribute == 1) {
+ sd->status.inventory[i].attribute = 0;
+ clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
+ count++;
+ }
+ }
+
+ if (count > 0) {
+ clif_misceffect(&sd->bl, 3);
+ clif_equiplist(sd);
+ clif_displaymessage(fd, msg_table[107]); // All items have been repaired.
+ } else {
+ clif_displaymessage(fd, msg_table[108]); // No item need to be repaired.
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Removed @nuke for now in favor of alchemist marine sphere skill [Valaris]
+int atcommand_nuke(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @nuke <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same GM level
+ skill_castend_damage_id(&pl_sd->bl, &pl_sd->bl, NPC_SELFDESTRUCTION, 99, gettick(), 0);
+ clif_displaymessage(fd, msg_table[109]); // Player has been nuked!
+ } 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 atcommand_enablenpc(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char NPCname[100];
+
+ memset(NPCname, '\0', sizeof(NPCname));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
+ clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcon <NPC_name>).");
+ return -1;
+ }
+
+ if (npc_name2id(NPCname) != NULL) {
+ npc_enable(NPCname, 1);
+ clif_displaymessage(fd, msg_table[110]); // Npc Enabled.
+ } else {
+ clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int atcommand_disablenpc(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char NPCname[100];
+
+ memset(NPCname, '\0', sizeof(NPCname));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) {
+ clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcoff <NPC_name>).");
+ return -1;
+ }
+
+ if (npc_name2id(NPCname) != NULL) {
+ npc_enable(NPCname, 0);
+ clif_displaymessage(fd, msg_table[112]); // Npc Disabled.
+ } else {
+ clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * time in txt for time command (by [Yor])
+ *------------------------------------------
+ */
+char * txt_time(unsigned int duration) {
+ int days, hours, minutes, seconds;
+ char temp[256];
+ static char temp1[256];
+
+ memset(temp, '\0', sizeof(temp));
+ memset(temp1, '\0', sizeof(temp1));
+
+ if (duration < 0)
+ duration = 0;
+
+ days = duration / (60 * 60 * 24);
+ duration = duration - (60 * 60 * 24 * days);
+ hours = duration / (60 * 60);
+ duration = duration - (60 * 60 * hours);
+ minutes = duration / 60;
+ seconds = duration - (60 * minutes);
+
+ if (days < 2)
+ sprintf(temp, msg_table[219], days); // %d day
+ else
+ sprintf(temp, msg_table[220], days); // %d days
+ if (hours < 2)
+ sprintf(temp1, msg_table[221], temp, hours); // %s %d hour
+ else
+ sprintf(temp1, msg_table[222], temp, hours); // %s %d hours
+ if (minutes < 2)
+ sprintf(temp, msg_table[223], temp1, minutes); // %s %d minute
+ else
+ sprintf(temp, msg_table[224], temp1, minutes); // %s %d minutes
+ if (seconds < 2)
+ sprintf(temp1, msg_table[225], temp, seconds); // %s and %d second
+ else
+ sprintf(temp1, msg_table[226], temp, seconds); // %s and %d seconds
+
+ return temp1;
+}
+
+/*==========================================
+ * @time/@date/@server_date/@serverdate/@server_time/@servertime: Display the date/time of the server (by [Yor]
+ * Calculation management of GM modification (@day/@night GM commands) is done
+ *------------------------------------------
+ */
+int atcommand_servertime(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct TimerData * timer_data;
+ struct TimerData * timer_data2;
+ time_t time_server; // variable for number of seconds (used with time() function)
+ struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ...
+ char temp[256];
+
+ memset(temp, '\0', sizeof(temp));
+
+ time(&time_server); // get time in seconds since 1/1/1970
+ datetime = localtime(&time_server); // convert seconds in structure
+ // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52)
+ strftime(temp, sizeof(temp)-1, msg_table[230], datetime); // Server time (normal time): %A, %B %d %Y %X.
+ clif_displaymessage(fd, temp);
+
+ if (battle_config.night_duration == 0 && battle_config.day_duration == 0) {
+ if (night_flag == 0)
+ clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
+ else
+ clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
+ } else if (battle_config.night_duration == 0)
+ if (night_flag == 1) { // we start with night
+ timer_data = get_timer(day_timer_tid);
+ sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
+ clif_displaymessage(fd, temp);
+ clif_displaymessage(fd, msg_table[234]); // Game time: After, the game will be in permanent daylight.
+ } else
+ clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight.
+ else if (battle_config.day_duration == 0)
+ if (night_flag == 0) { // we start with day
+ timer_data = get_timer(night_timer_tid);
+ sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
+ clif_displaymessage(fd, temp);
+ clif_displaymessage(fd, msg_table[236]); // Game time: After, the game will be in permanent night.
+ } else
+ clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night.
+ else {
+ if (night_flag == 0) {
+ timer_data = get_timer(night_timer_tid);
+ timer_data2 = get_timer(day_timer_tid);
+ sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s.
+ clif_displaymessage(fd, temp);
+ if (timer_data->tick > timer_data2->tick)
+ sprintf(temp, msg_table[237], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in night for %s.
+ else
+ sprintf(temp, msg_table[237], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in night for %s.
+ clif_displaymessage(fd, temp);
+ sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
+ clif_displaymessage(fd, temp);
+ } else {
+ timer_data = get_timer(day_timer_tid);
+ timer_data2 = get_timer(night_timer_tid);
+ sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s.
+ clif_displaymessage(fd, temp);
+ if (timer_data->tick > timer_data2->tick)
+ sprintf(temp, msg_table[239], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in daylight for %s.
+ else
+ sprintf(temp, msg_table[239], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in daylight for %s.
+ clif_displaymessage(fd, temp);
+ sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s.
+ clif_displaymessage(fd, temp);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @chardelitem <item_name_or_ID> <quantity> <player> (by [Yor]
+ * removes <quantity> item from a character
+ * item can be equiped or not.
+ * Inspired from a old command created by RoVeRT
+ *------------------------------------------
+ */
+int atcommand_chardelitem(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ char character[100];
+ char item_name[100];
+ int i, number = 0, item_id, item_position, count;
+ char output[200];
+ struct item_data *item_data;
+
+ memset(character, '\0', sizeof(character));
+ memset(item_name, '\0', sizeof(item_name));
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message || sscanf(message, "%s %d %99[^\n]", item_name, &number, character) < 3 || number < 1) {
+ clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>).");
+ return -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) {
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level
+ item_position = pc_search_inventory(pl_sd, item_id);
+ if (item_position >= 0) {
+ count = 0;
+ for(i = 0; i < number && item_position >= 0; i++) {
+ pc_delitem(pl_sd, item_position, 1, 0);
+ count++;
+ item_position = pc_search_inventory(pl_sd, item_id); // for next loop
+ }
+ sprintf(output, msg_table[113], count); // %d item(s) removed by a GM.
+ clif_displaymessage(pl_sd->fd, output);
+ if (number == count)
+ sprintf(output, msg_table[114], count); // %d item(s) removed from the player.
+ else
+ sprintf(output, msg_table[115], count, count, number); // %d item(s) removed. Player had only %d on %d items.
+ clif_displaymessage(fd, output);
+ } else {
+ clif_displaymessage(fd, msg_table[116]); // Character does not have the item.
+ 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;
+ }
+ } else {
+ clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @jail <char_name> by [Yor]
+ * Special warp! No check with nowarp and nowarpto flag
+ *------------------------------------------
+ */
+int atcommand_jail(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+ int x, y;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @jail <char_name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
+ switch(rand() % 2) {
+ case 0:
+ x = 24;
+ y = 75;
+ break;
+ default:
+ x = 49;
+ y = 75;
+ break;
+ }
+ if (pc_setpos(pl_sd, "sec_pri.gat", x, y, 3) == 0) {
+ pc_setsavepoint(pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus]
+ clif_displaymessage(pl_sd->fd, msg_table[117]); // GM has send you in jails.
+ clif_displaymessage(fd, msg_table[118]); // Player warped in jails.
+ } else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ 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;
+}
+
+/*==========================================
+ * @unjail/@discharge <char_name> by [Yor]
+ * Special warp! No check with nowarp and nowarpto flag
+ *------------------------------------------
+ */
+int atcommand_unjail(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data *pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @unjail/@discharge <char_name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM
+ if (pl_sd->bl.m != map_mapname2mapid("sec_pri.gat")) {
+ clif_displaymessage(fd, msg_table[119]); // This player is not in jails.
+ return -1;
+ } else if (pc_setpos(pl_sd, "prontera.gat", 156, 191, 3) == 0) {
+ pc_setsavepoint(pl_sd, "prontera.gat", 156, 191); // Save char respawn point in Prontera
+ clif_displaymessage(pl_sd->fd, msg_table[120]); // GM has discharge you.
+ clif_displaymessage(fd, msg_table[121]); // Player warped to Prontera.
+ } else {
+ clif_displaymessage(fd, msg_table[1]); // Map not found.
+ 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;
+}
+
+/*==========================================
+ * @disguise <mob_id> by [Valaris] (simplified by [Yor])
+ *------------------------------------------
+ */
+int atcommand_disguise(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int mob_id;
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>).");
+ return -1;
+ }
+
+ if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = atoi(message);
+
+ if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
+ (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
+ (mob_id >= 813 && mob_id <= 834) || // NPC
+ (mob_id > 1000 && mob_id < 1521)) { // monsters
+ if (pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(fd, msg_table[227]); // Cannot wear disguise while riding a Peco.
+ return -1;
+ }
+ sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
+ sd->disguise = mob_id;
+ pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
+ clif_displaymessage(fd, msg_table[122]); // Disguise applied.
+ } else {
+ clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @undisguise by [Yor]
+ *------------------------------------------
+ */
+int atcommand_undisguise(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if (sd->disguise) {
+ clif_clearchar(&sd->bl, 9);
+ sd->disguise = 0;
+ pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
+ clif_displaymessage(fd, msg_table[124]); // Undisguise applied.
+ } else {
+ clif_displaymessage(fd, msg_table[125]); // You're not disguised.
+ return -1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @broadcast by [Valaris]
+ *------------------------------------------
+ */
+int atcommand_broadcast(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a message (usage: @broadcast <message>).");
+ return -1;
+ }
+
+ sprintf(output, "%s : %s", sd->status.name, message);
+ intif_GMmessage(output, strlen(output) + 1, 0);
+
+ return 0;
+}
+
+/*==========================================
+ * @localbroadcast by [Valaris]
+ *------------------------------------------
+ */
+int atcommand_localbroadcast(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+
+ memset(output, '\0', sizeof(output));
+
+ if (!message || !*message) {
+ clif_displaymessage(fd, "Please, enter a message (usage: @localbroadcast <message>).");
+ return -1;
+ }
+
+ sprintf(output, "%s : %s", sd->status.name, message);
+
+ clif_GMmessage(&sd->bl, output, strlen(output) + 1, 1); // 1: ALL_SAMEMAP
+
+ return 0;
+}
+
+/*==========================================
+ * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work)
+ *------------------------------------------
+ */
+int atcommand_chardisguise(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int mob_id;
+ char character[100];
+ char mob_name[100];
+ struct map_session_data* pl_sd;
+
+ memset(character, '\0', sizeof(character));
+ memset(mob_name, '\0', sizeof(mob_name));
+
+ if (!message || !*message || sscanf(message, "%s %99[^\n]", mob_name, character) < 2) {
+ clif_displaymessage(fd, "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>).");
+ return -1;
+ }
+
+ if ((mob_id = mobdb_searchname(mob_name)) == 0) // check name first (to avoid possible name begining by a number)
+ mob_id = atoi(mob_name);
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can disguise only lower or same level
+ if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC
+ (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC
+ (mob_id >= 813 && mob_id <= 834) || // NPC
+ (mob_id > 1000 && mob_id < 1521)) { // monsters
+ if (pc_isriding(pl_sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(fd, msg_table[228]); // Character cannot wear disguise while riding a Peco.
+ return -1;
+ }
+ pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris]
+ pl_sd->disguise = mob_id;
+ pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
+ clif_displaymessage(fd, msg_table[140]); // Character's disguise applied.
+ } else {
+ clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found.
+ 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;
+}
+
+/*==========================================
+ * @charundisguise <character> by Kalaspuff (based off Yor's work)
+ *------------------------------------------
+ */
+int atcommand_charundisguise(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ struct map_session_data* pl_sd;
+
+ memset(character, '\0', sizeof(character));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charundisguise <char name>).");
+ return -1;
+ }
+
+ if ((pl_sd = map_nick2sd(character)) != NULL) {
+ if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can undisguise only lower or same level
+ if (pl_sd->disguise) {
+ clif_clearchar(&pl_sd->bl, 9);
+ pl_sd->disguise = 0;
+ pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3);
+ clif_displaymessage(fd, msg_table[141]); // Character's undisguise applied.
+ } else {
+ clif_displaymessage(fd, msg_table[142]); // Character is not disguised.
+ 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;
+}
+
+/*==========================================
+ * @email <actual@email> <new@email> by [Yor]
+ *------------------------------------------
+ */
+int atcommand_email(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char actual_email[100];
+ char new_email[100];
+
+ memset(actual_email, '\0', sizeof(actual_email));
+ memset(new_email, '\0', sizeof(new_email));
+
+ if (!message || !*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) {
+ clif_displaymessage(fd, "Please enter 2 emails (usage: @email <actual@email> <new@email>).");
+ return -1;
+ }
+
+ if (e_mail_check(actual_email) == 0) {
+ clif_displaymessage(fd, msg_table[144]); // Invalid actual email. If you have default e-mail, give a@a.com.
+ return -1;
+ } else if (e_mail_check(new_email) == 0) {
+ clif_displaymessage(fd, msg_table[145]); // Invalid new email. Please enter a real e-mail.
+ return -1;
+ } else if (strcmpi(new_email, "a@a.com") == 0) {
+ clif_displaymessage(fd, msg_table[146]); // New email must be a real e-mail.
+ return -1;
+ } else if (strcmpi(actual_email, new_email) == 0) {
+ clif_displaymessage(fd, msg_table[147]); // New email must be different of the actual e-mail.
+ return -1;
+ } else {
+ chrif_changeemail(sd->status.account_id, actual_email, new_email);
+ clif_displaymessage(fd, msg_table[148]); // Information sended to login-server via char-server.
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *@effect
+ *------------------------------------------
+ */
+int atcommand_effect(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd;
+ int type = 0, flag = 0, i;
+
+ if (!message || !*message || sscanf(message, "%d %d", &type,&flag) < 2) {
+ clif_displaymessage(fd, "Please, enter at least a option (usage: @effect <type+>).");
+ return -1;
+ }
+ if(flag <=0){
+ clif_specialeffect(&sd->bl, type, flag);
+ clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
+ }
+ else{
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ clif_specialeffect(&pl_sd->bl, type, flag);
+ clif_displaymessage(pl_sd->fd, msg_table[229]); // Your effect has changed.
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @charitemlist <character>: Displays the list of a player's items.
+ *------------------------------------------
+ */
+int
+atcommand_character_item_list(
+ 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[100], output[200], equipstr[100], outputtmp[200];
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+ memset(equipstr, '\0', sizeof(equipstr));
+ memset(outputtmp, '\0', sizeof(outputtmp));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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++) {
+ if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.inventory[i].nameid)) != NULL) {
+ counter = counter + pl_sd->status.inventory[i].amount;
+ count++;
+ if (count == 1) {
+ sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name);
+ clif_displaymessage(fd, output);
+ }
+ if ((equip = pl_sd->status.inventory[i].equip)) {
+ strcpy(equipstr, "| equiped: ");
+ if (equip & 4)
+ strcat(equipstr, "robe/gargment, ");
+ if (equip & 8)
+ strcat(equipstr, "left accessory, ");
+ if (equip & 16)
+ strcat(equipstr, "body/armor, ");
+ if ((equip & 34) == 2)
+ strcat(equipstr, "right hand, ");
+ if ((equip & 34) == 32)
+ strcat(equipstr, "left hand, ");
+ if ((equip & 34) == 34)
+ strcat(equipstr, "both hands, ");
+ if (equip & 64)
+ strcat(equipstr, "feet, ");
+ if (equip & 128)
+ strcat(equipstr, "right accessory, ");
+ if ((equip & 769) == 1)
+ strcat(equipstr, "lower head, ");
+ if ((equip & 769) == 256)
+ strcat(equipstr, "top head, ");
+ if ((equip & 769) == 257)
+ strcat(equipstr, "lower/top head, ");
+ if ((equip & 769) == 512)
+ strcat(equipstr, "mid head, ");
+ if ((equip & 769) == 512)
+ strcat(equipstr, "lower/mid head, ");
+ if ((equip & 769) == 769)
+ strcat(equipstr, "lower/mid/top head, ");
+ // remove final ', '
+ equipstr[strlen(equipstr) - 2] = '\0';
+ } else
+ memset(equipstr, '\0', sizeof(equipstr));
+ if (sd->status.inventory[i].refine)
+ sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, pl_sd->status.inventory[i].refine, item_data->jname, pl_sd->status.inventory[i].refine, pl_sd->status.inventory[i].nameid, equipstr);
+ else
+ sprintf(output, "%d %s (%s, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, item_data->jname, pl_sd->status.inventory[i].nameid, equipstr);
+ clif_displaymessage(fd, output);
+ memset(output, '\0', sizeof(output));
+ counter2 = 0;
+ for (j = 0; j < item_data->slot; j++) {
+ if (pl_sd->status.inventory[i].card[j]) {
+ if ((item_temp = itemdb_search(pl_sd->status.inventory[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 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;
+}
+
+/*==========================================
+ * @charstoragelist <character>: Displays the items list of a player's storage.
+ *------------------------------------------
+ */
+int
+atcommand_character_storage_list(
+ 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[100], output[200], outputtmp[200];
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+ memset(outputtmp, '\0', sizeof(outputtmp));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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);
+ memset(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 -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;
+}
+
+/*==========================================
+ * @charcartlist <character>: Displays the items list of a player's cart.
+ *------------------------------------------
+ */
+int
+atcommand_character_cart_list(
+ 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, count, counter, counter2;
+ char character[100], output[200], outputtmp[200];
+
+ memset(character, '\0', sizeof(character));
+ memset(output, '\0', sizeof(output));
+ memset(outputtmp, '\0', sizeof(outputtmp));
+
+ if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
+ clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <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_CART; i++) {
+ if (pl_sd->status.cart[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.cart[i].nameid)) != NULL) {
+ counter = counter + pl_sd->status.cart[i].amount;
+ count++;
+ if (count == 1) {
+ sprintf(output, "------ Cart items list of '%s' ------", pl_sd->status.name);
+ clif_displaymessage(fd, output);
+ }
+ if (pl_sd->status.cart[i].refine)
+ sprintf(output, "%d %s %+d (%s %+d, id: %d)", pl_sd->status.cart[i].amount, item_data->name, pl_sd->status.cart[i].refine, item_data->jname, pl_sd->status.cart[i].refine, pl_sd->status.cart[i].nameid);
+ else
+ sprintf(output, "%d %s (%s, id: %d)", pl_sd->status.cart[i].amount, item_data->name, item_data->jname, pl_sd->status.cart[i].nameid);
+ clif_displaymessage(fd, output);
+ memset(output, '\0', sizeof(output));
+ counter2 = 0;
+ for (j = 0; j < item_data->slot; j++) {
+ if (pl_sd->status.cart[i].card[j]) {
+ if ((item_temp = itemdb_search(pl_sd->status.cart[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 cart 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, 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;
+}
+
+/*==========================================
+ * @killer by MouseJstr
+ * enable killing players even when not in pvp
+ *------------------------------------------
+ */
+int
+atcommand_killer(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ sd->special_state.killer = !sd->special_state.killer;
+
+ if(sd->special_state.killer)
+ clif_displaymessage(fd, msg_table[241]);
+ else
+ clif_displaymessage(fd, msg_table[242]);
+
+ return 0;
+}
+
+/*==========================================
+ * @killable by MouseJstr
+ * enable other people killing you
+ *------------------------------------------
+ */
+int
+atcommand_killable(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ sd->special_state.killable = !sd->special_state.killable;
+
+ if(sd->special_state.killable)
+ clif_displaymessage(fd, msg_table[242]);
+ else
+ clif_displaymessage(fd, msg_table[241]);
+
+ return 0;
+}
+
+/*==========================================
+ * @charkillable by MouseJstr
+ * enable another player to be killed
+ *------------------------------------------
+ */
+int
+atcommand_charkillable(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+
+ if (!message || !*message)
+ return -1;
+
+ if((pl_sd=map_nick2sd((char *) message)) == NULL)
+ return -1;
+
+ pl_sd->special_state.killable = !pl_sd->special_state.killable;
+
+ if(pl_sd->special_state.killable)
+ clif_displaymessage(fd, "The player is now killable");
+ else
+ clif_displaymessage(fd, "The player is no longer killable");
+
+ return 0;
+}
+
+
+/*==========================================
+ * @skillon by MouseJstr
+ * turn skills on for the map
+ *------------------------------------------
+ */
+int
+atcommand_skillon(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ map[sd->bl.m].flag.noskill = 0;
+ clif_displaymessage(fd, msg_table[244]);
+ return 0;
+}
+
+/*==========================================
+ * @skilloff by MouseJstr
+ * Turn skills off on the map
+ *------------------------------------------
+ */
+int
+atcommand_skilloff(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ map[sd->bl.m].flag.noskill = 1;
+ clif_displaymessage(fd, msg_table[243]);
+ return 0;
+}
+
+/*==========================================
+ * @npcmove by MouseJstr
+ *
+ * move a npc
+ *------------------------------------------
+ */
+int
+atcommand_npcmove(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char character[100];
+ int x = 0, y = 0;
+ struct npc_data *nd = 0;
+
+ if( sd == NULL )
+ return -1;
+
+ if (!message || !*message)
+ return -1;
+
+ memset(character, '\0', sizeof character);
+
+ if (sscanf(message, "%d %d %99[^\n]", &x, &y, character) < 4)
+ return -1;
+
+ nd=npc_name2id(character);
+ if (nd==NULL)
+ return -1;
+
+ npc_enable(character, 0);
+ nd->bl.x = x;
+ nd->bl.y = y;
+ npc_enable(character, 1);
+
+ return 0;
+}
+
+/*==========================================
+ * @addwarp by MouseJstr
+ *
+ * Create a new static warp point.
+ *------------------------------------------
+ */
+int
+atcommand_addwarp(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char w1[64], w3[64], w4[64];
+ char map[30], output[200];
+ int x,y,ret;
+
+ if (!message || !*message)
+ return -1;
+
+ if (sscanf(message, "%99s %d %d[^\n]", map, &x, &y ) < 3)
+ return -1;
+
+ sprintf(w1,"%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y);
+ sprintf(w3,"%s%d%d%d%d", map,sd->bl.x, sd->bl.y, x, y);
+ sprintf(w4,"1,1,%s.gat,%d,%d", map, x, y);
+
+ ret = npc_parse_warp(w1, "warp", w3, w4);
+
+ sprintf(output, "New warp NPC => %s",w3);
+
+ clif_displaymessage(fd, output);
+
+ return ret;
+}
+
+/*==========================================
+ * @follow by [MouseJstr]
+ *
+ * Follow a player .. staying no more then 5 spaces away
+ *------------------------------------------
+ */
+int
+atcommand_follow(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+
+ if (!message || !*message)
+ return -1;
+ if((pl_sd=map_nick2sd((char *) message)) != NULL)
+ pc_follow(sd, pl_sd->bl.id);
+ else
+ return 1;
+ return 0;
+}
+
+
+/*==========================================
+ * @chareffect by [MouseJstr]
+ *
+ * Create a effect localized on another character
+ *------------------------------------------
+ */
+int
+atcommand_chareffect(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;
+
+ if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) {
+ clif_displaymessage(fd, "usage: @chareffect <type+> <target>.");
+ return -1;
+ }
+
+ if((pl_sd=map_nick2sd((char *) target)) == NULL)
+ return -1;
+
+ clif_specialeffect(&pl_sd->bl, type, 0);
+ clif_displaymessage(fd, msg_table[229]); // Your effect has changed.
+
+ return 0;
+}
+/*==========================================
+ * @dropall by [MouseJstr]
+ *
+ * Drop all your possession on the ground
+ *------------------------------------------
+ */
+int
+atcommand_dropall(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].amount) {
+ if(sd->status.inventory[i].equip != 0)
+ pc_unequipitem(sd, i, 0);
+ pc_dropitem(sd, i, sd->status.inventory[i].amount);
+ }
+ }
+ return 0;
+}
+/*==========================================
+ * @chardropall by [MouseJstr]
+ *
+ * Throw all the characters possessions on the ground. Normally
+ * done in response to them being disrespectful of a GM
+ *------------------------------------------
+ */
+int
+atcommand_chardropall(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ struct map_session_data *pl_sd = NULL;
+
+ if (!message || !*message)
+ return -1;
+ if((pl_sd=map_nick2sd((char *) message)) == NULL)
+ return -1;
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (pl_sd->status.inventory[i].amount) {
+ if(pl_sd->status.inventory[i].equip != 0)
+ pc_unequipitem(pl_sd, i, 0);
+ pc_dropitem(pl_sd, i, pl_sd->status.inventory[i].amount);
+ }
+ }
+
+ clif_displaymessage(pl_sd->fd, "Ever play 52 card pickup?");
+ clif_displaymessage(fd, "It is done");
+ //clif_displaymessage(fd, "It is offical.. your a jerk");
+
+ return 0;
+}
+/*==========================================
+ * @storeall by [MouseJstr]
+ *
+ * Put everything into storage to simplify your inventory to make
+ * debugging easie
+ *------------------------------------------
+ */
+int
+atcommand_storeall(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ if (storage_storageopen(sd) == 1) {
+ clif_displaymessage(fd, "run this command again..");
+ return 0;
+ }
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].amount) {
+ if(sd->status.inventory[i].equip != 0)
+ pc_unequipitem(sd, i, 0);
+ storage_storageadd(sd, i, sd->status.inventory[i].amount);
+ }
+ }
+ storage_storageclose(sd);
+
+ clif_displaymessage(fd, "It is done");
+ return 0;
+}
+/*==========================================
+ * @charstoreall by [MouseJstr]
+ *
+ * A way to screw with players who piss you off
+ *------------------------------------------
+ */
+int
+atcommand_charstoreall(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i;
+ struct map_session_data *pl_sd = NULL;
+
+ if (!message || !*message)
+ return -1;
+ if((pl_sd=map_nick2sd((char *) message)) == NULL)
+ return -1;
+
+ if (storage_storageopen(pl_sd) == 1) {
+ clif_displaymessage(fd, "Had to open the characters storage window...");
+ clif_displaymessage(fd, "run this command again..");
+ return 0;
+ }
+ for (i = 0; i < MAX_INVENTORY; i++) {
+ if (pl_sd->status.inventory[i].amount) {
+ if(pl_sd->status.inventory[i].equip != 0)
+ pc_unequipitem(pl_sd, i, 0);
+ storage_storageadd(pl_sd, i, sd->status.inventory[i].amount);
+ }
+ }
+ storage_storageclose(pl_sd);
+
+ clif_displaymessage(pl_sd->fd, "Everything you own has been put away for safe keeping.");
+ clif_displaymessage(pl_sd->fd, "go to the nearest kafka to retrieve it..");
+ clif_displaymessage(pl_sd->fd, " -- the management");
+
+ clif_displaymessage(fd, "It is done");
+
+ return 0;
+}
+/*==========================================
+ * @skillid by [MouseJstr]
+ *
+ * lookup a skill by name
+ *------------------------------------------
+ */
+int
+atcommand_skillid(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int skillen = 0, idx = 0;
+ if (!message || !*message)
+ return -1;
+ skillen = strlen(message);
+ while (skill_names[idx].id != 0) {
+ if ((strnicmp(skill_names[idx].name, message, skillen) == 0) ||
+ (strnicmp(skill_names[idx].desc, message, skillen) == 0)) {
+ char output[255];
+ sprintf(output, "skill %d: %s", skill_names[idx].id, skill_names[idx].desc);
+ clif_displaymessage(fd, output);
+ }
+ idx++;
+ }
+ return 0;
+}
+/*==========================================
+ * @useskill by [MouseJstr]
+ *
+ * A way of using skills without having to find them in the skills menu
+ *------------------------------------------
+ */
+int
+atcommand_useskill(const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+ int skillnum;
+ int skilllv;
+ int inf;
+ char target[255];
+
+ if (!message || !*message)
+ return -1;
+ if(sscanf(message, "%d %d %s", &skillnum, &skilllv, target) != 3) {
+ clif_displaymessage(fd, "Usage: @useskill <skillnum> <skillv> <target>");
+ return -1;
+ }
+ if((pl_sd=map_nick2sd(target)) == NULL) {
+ return -1;
+ }
+
+ inf = skill_get_inf(skillnum);
+
+ if ((inf == 2) || (inf == 1))
+ skill_use_pos(sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv);
+ else
+ skill_use_id(sd, pl_sd->bl.id, skillnum, skilllv);
+
+ return 0;
+}
+/*==========================================
+ * It is made to rain.
+ *------------------------------------------
+ */
+int
+atcommand_rain(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int effno = 0;
+ effno = 161;
+ nullpo_retr(-1, sd);
+ if (effno < 0 || map[sd->bl.m].flag.rain)
+ return -1;
+
+ map[sd->bl.m].flag.rain=1;
+ clif_specialeffect(&sd->bl,effno,2);
+ return 0;
+}
+/*==========================================
+ * It is made to snow.
+ *------------------------------------------
+ */
+int
+atcommand_snow(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int effno = 0;
+ effno = 162;
+ nullpo_retr(-1, sd);
+ if (effno < 0 || map[sd->bl.m].flag.snow)
+ return -1;
+
+ map[sd->bl.m].flag.snow=1;
+ clif_specialeffect(&sd->bl,effno,2);
+ return 0;
+}
+
+/*==========================================
+ * Cherry tree snowstorm is made to fall. (Sakura)
+ *------------------------------------------
+ */
+int
+atcommand_sakura(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int effno = 0;
+ effno = 163;
+ nullpo_retr(-1, sd);
+ if (effno < 0 || map[sd->bl.m].flag.sakura)
+ return -1;
+
+ map[sd->bl.m].flag.sakura=1;
+ clif_specialeffect(&sd->bl,effno,2);
+ return 0;
+}
+
+/*==========================================
+ * Fog hangs over.
+ *------------------------------------------
+ */
+int
+atcommand_fog(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int effno = 0;
+ effno = 233;
+ nullpo_retr(-1, sd);
+ if (effno < 0 || map[sd->bl.m].flag.fog)
+ return -1;
+
+ map[sd->bl.m].flag.fog=1;
+ clif_specialeffect(&sd->bl,effno,2);
+
+ return 0;
+}
+
+/*==========================================
+ * Fallen leaves fall.
+ *------------------------------------------
+ */
+int
+atcommand_leaves(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int effno = 0;
+ effno = 333;
+ nullpo_retr(-1, sd);
+ if (effno < 0 || map[sd->bl.m].flag.leaves)
+ return -1;
+
+ map[sd->bl.m].flag.leaves=1;
+ clif_specialeffect(&sd->bl,effno,2);
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int
+atcommand_summon(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char name[100];
+ int mob_id = 0;
+ int x = 0;
+ int y = 0;
+ int id = 0;
+ struct mob_data *md;
+ unsigned int tick=gettick();
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message)
+ return -1;
+ if (sscanf(message, "%99s", name) < 1)
+ return -1;
+
+ if ((mob_id = atoi(name)) == 0)
+ mob_id = mobdb_searchname(name);
+ if(mob_id == 0)
+ return -1;
+
+ x = sd->bl.x + (rand() % 10 - 5);
+ y = sd->bl.y + (rand() % 10 - 5);
+
+ id = mob_once_spawn(sd,"this", x, y, "--ja--", mob_id, 1, "");
+ if((md=(struct mob_data *)map_id2bl(id))){
+ md->master_id=sd->bl.id;
+ md->state.special_mob_ai=1;
+ md->mode=mob_db[md->class].mode|0x04;
+ md->deletetimer=add_timer(tick+60000,mob_timer_delete,id,0);
+ clif_misceffect2(&md->bl,344);
+ }
+ clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,x,y,tick);
+
+ return 0;
+}
+
+
+/*==========================================
+ * @adjcmdlvl by [MouseJstr]
+ *
+ * Temp adjust the GM level required to use a GM command
+ *
+ * Used during beta testing to allow players to use GM commands
+ * for short periods of time
+ *------------------------------------------
+ */
+int
+atcommand_adjcmdlvl(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int i, newlev;
+ char cmd[100];
+
+ if (!message || !*message || sscanf(message, "%d %s", &newlev, cmd) != 2) {
+ clif_displaymessage(fd, "usage: @adjcmdlvl <lvl> <command>.");
+ return -1;
+ }
+
+ for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
+ if (strcmpi(cmd, atcommand_info[i].command+1) == 0) {
+ atcommand_info[i].level = newlev;
+ clif_displaymessage(fd, "@command level changed.");
+ return 0;
+ }
+
+ clif_displaymessage(fd, "@command not found.");
+ return -1;
+}
+
+/*==========================================
+ * @adjgmlvl by [MouseJstr]
+ *
+ * Create a temp GM
+ *
+ * Used during beta testing to allow players to use GM commands
+ * for short periods of time
+ *------------------------------------------
+ */
+int
+atcommand_adjgmlvl(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ int newlev;
+ char user[100];
+ struct map_session_data *pl_sd;
+
+ if (!message || !*message || sscanf(message, "%d %[^\r\n]", &newlev, user) != 2) {
+ clif_displaymessage(fd, "usage: @adjgmlvl <lvl> <user>.");
+ return -1;
+ }
+
+ if((pl_sd=map_nick2sd((char *) user)) == NULL)
+ return -1;
+
+ pc_set_gm_level(pl_sd->status.account_id, newlev);
+
+ return 0;
+}
+
+
+/*==========================================
+ * @trade by [MouseJstr]
+ *
+ * Open a trade window with a remote player
+ *
+ * If I have to jump to a remote player one more time, I am
+ * gonna scream!
+ *------------------------------------------
+ */
+int
+atcommand_trade(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+
+ if (!message || !*message)
+ return -1;
+ if((pl_sd=map_nick2sd((char *) message)) != NULL) {
+ trade_traderequest(sd, pl_sd->bl.id);
+ return 0;
+ }
+ return -1;
+}
+
+/*==========================================
+ * @setbattleflag by [MouseJstr]
+ *
+ * set a battle_config flag without having to reboot
+ */
+int
+atcommand_setbattleflag(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char flag[128], value[128];
+
+ if (!message || !*message || sscanf(message, "%s %s", flag, value) != 2) {
+ clif_displaymessage(fd, "usage: @setbattleflag <flag> <value>.");
+ return -1;
+ }
+
+ if (battle_set_value(flag, value) == 0)
+ clif_displaymessage(fd, "unknown battle_config flag");
+ else
+ clif_displaymessage(fd, "battle_config set as requested");
+
+ return 0;
+}
+
+
+/*===========================
+ * @unmute [Valaris]
+ *===========================
+*/
+int atcommand_unmute(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ struct map_session_data *pl_sd = NULL;
+ if (!message || !*message)
+ return -1;
+
+ if((pl_sd=map_nick2sd((char *) message)) != NULL) {
+ if(pl_sd->sc_data[SC_NOCHAT].timer!=-1) {
+ skill_status_change_end(&pl_sd->bl,SC_NOCHAT,-1);
+ clif_displaymessage(sd->fd,"Player unmuted");
+ }
+ else
+ clif_displaymessage(sd->fd,"Player is not muted");
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * @uptime by MC Cameri
+ *------------------------------------------
+ */
+int
+atcommand_uptime(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char output[200];
+ long seconds = 0, day = 24*60*60, hour = 60*60,
+ minute = 60, days = 0, hours = 0, minutes = 0;
+
+ seconds = (gettick()-ticks)/CLOCKS_PER_SEC;
+ 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;
+
+ snprintf(output, sizeof(output), msg_table[245], days, hours, minutes, seconds);
+ clif_displaymessage(fd,output);
+ return 0;
+}
+
+/*==========================================
+ * @changesex <sex>
+ * => Changes one's sex. Argument sex can be
+ * 0 or 1, m or f, male or female.
+ *------------------------------------------
+ */
+int
+atcommand_changesex(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+
+// char sex[200], output[200];
+// int isex = (sd->status.sex+1)%2;
+/*
+ if (!message || !*message)
+ return -1;
+ memset(sex, '\0', sizeof(sex));
+ if(sscanf(message, "%99[^\n]", sex) < 1)
+ return -1;
+ str_lower(sex);
+ if (strcmp(sex,"0") == 0 || strcmp(sex,"f") == 0 || strcmp(sex,"female") == 0) {
+ isex = 0;
+ } else if (strcmp(sex,"1") == 0 || strcmp(sex,"m") == 0 || strcmp(sex,"male") == 0) {
+ isex = 1;
+ } else {
+ clif_displaymessage(fd,msg_table[456]);
+ return 0;
+ }
+*/
+// if (isex != sd->sex) {
+ chrif_changesex(sd->status.account_id, ((sd->status.sex+1)%2));
+// } else {
+// sprintf(output,msg_table[460],(isex == 0)?"female":"male");
+// clif_displaymessage(fd,output);
+// }
+ return 0;
+}
+
+#ifndef TXT_ONLY /* Begin SQL-Only commands */
+
+/*==========================================
+ * Mail System commands by [Valaris]
+ *------------------------------------------
+ */
+int atcommand_listmail(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if(!battle_config.mail_system)
+ return 0;
+
+ nullpo_retr(-1, sd);
+
+ if(strlen(command)==12)
+ mail_check(sd,3);
+ else if(strlen(command)==9)
+ mail_check(sd,2);
+ else
+ mail_check(sd,1);
+ return 0;
+}
+
+int atcommand_readmail(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ if(!battle_config.mail_system)
+ return 0;
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message) {
+ clif_displaymessage(sd->fd,"You must specify a message number.");
+ return 0;
+ }
+
+ if(strlen(command)==11)
+ mail_delete(sd,atoi(message));
+ else
+ mail_read(sd,atoi(message));
+
+ return 0;
+}
+
+int atcommand_sendmail(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char name[24],text[80];
+
+ if(!battle_config.mail_system)
+ return 0;
+
+ nullpo_retr(-1, sd);
+
+ if (!message || !*message) {
+ clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
+ return 0;
+ }
+
+ if ((sscanf(message, "\"%[^\"]\" %79[^\n]", name, text) < 2) &&
+ (sscanf(message, "%23s %79[^\n]", name, text) < 2)) {
+ clif_displaymessage(sd->fd,"You must specify a recipient and a message.");
+ return 0;
+ }
+
+ if(strlen(command)==17)
+ mail_send(sd,name,text,1);
+ else
+ mail_send(sd,name,text,0);
+
+ return 0;
+}
+
+/*==========================================
+ * Refresh online command for SQL [Valaris]
+ * Will refresh and check online column of
+ * players and set correctly.
+ *------------------------------------------
+ */
+int atcommand_refreshonline(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ nullpo_retr(-1, sd);
+
+ char_online_check();
+
+ return 0;
+}
+
+#endif /* end sql only */
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
index c5ba3df58..6f199cf2b 100644
--- a/src/map/atcommand.h
+++ b/src/map/atcommand.h
@@ -1,244 +1,244 @@
-// $Id: atcommand.h 148 2004-09-30 14:05:37Z MouseJstr $
-#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_Storage,
- AtCommand_GuildStorage,
- AtCommand_Option,
- AtCommand_Hide,
- AtCommand_JobChange,
- AtCommand_JobChange2,
- AtCommand_JobChange3,
- AtCommand_Die,
- AtCommand_Kill,
- AtCommand_Alive,
- AtCommand_Kami,
- AtCommand_KamiB,
- AtCommand_Heal,
- AtCommand_Item,
- AtCommand_Item2,
- AtCommand_ItemReset,
- AtCommand_ItemCheck,
- AtCommand_BaseLevelUp,
- AtCommand_JobLevelUp,
- AtCommand_H,
- AtCommand_Help,
- AtCommand_GM,
- AtCommand_PvPOff,
- AtCommand_PvPOn,
- AtCommand_GvGOff,
- AtCommand_GvGOn,
- AtCommand_Model,
- AtCommand_Go,
- AtCommand_Spawn,
- AtCommand_Monster,
- AtCommand_KillMonster,
- AtCommand_KillMonster2,
- AtCommand_Refine,
- AtCommand_Produce,
- AtCommand_Memo,
- AtCommand_GAT,
- AtCommand_Packet,
- 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_CharPetRename, // by Yor
- AtCommand_Recall,
- AtCommand_CharacterJob,
- AtCommand_CharacterJob2,
- AtCommand_CharacterJob3,
- AtCommand_Revive,
- AtCommand_CharacterStats,
- AtCommand_CharacterStatsAll,
- AtCommand_CharacterOption,
- AtCommand_CharacterSave,
- AtCommand_CharacterLoad,
- AtCommand_Night,
- AtCommand_Day,
- AtCommand_Doom,
- AtCommand_DoomMap,
- AtCommand_Raise,
- AtCommand_RaiseMap,
- AtCommand_CharacterBaseLevel,
- AtCommand_CharacterJobLevel,
- AtCommand_Kick,
- AtCommand_KickAll,
- AtCommand_AllSkill,
- AtCommand_QuestSkill,
- AtCommand_CharQuestSkill,
- AtCommand_LostSkill,
- AtCommand_CharLostSkill,
- AtCommand_SpiritBall,
- AtCommand_Party,
- AtCommand_Guild,
- AtCommand_AgitStart,
- AtCommand_AgitEnd,
- AtCommand_MapExit,
- AtCommand_IDSearch,
- AtCommand_CharSkReset,
- AtCommand_CharStReset,
- AtCommand_CharReset,
- //by chbrules
- AtCommand_CharModel,
- AtCommand_CharSKPoint,
- AtCommand_CharSTPoint,
- AtCommand_CharZeny,
- AtCommand_RecallAll,
- AtCommand_ReloadItemDB,
- AtCommand_ReloadMobDB,
- AtCommand_ReloadSkillDB,
-#ifndef TXT_ONLY
- AtCommand_Rehash,
-#else /* TXT_ONLY */
- AtCommand_ReloadScript,
-#endif /* TXT_ONLY */
- AtCommand_ReloadGMDB,
- AtCommand_MapInfo,
- AtCommand_Dye,
- AtCommand_Hstyle,
- AtCommand_Hcolor,
- AtCommand_StatAll,
- AtCommand_CharChangeSex, // by Yor
- 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_Enablenpc,
- AtCommand_Disablenpc,
- AtCommand_ServerTime, // by Yor
- AtCommand_CharDelItem, // by Yor
- AtCommand_Jail, // by Yor
- AtCommand_UnJail, // by Yor
- 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_Item_List, // by Yor
- AtCommand_Char_Storage_List, // by Yor
- 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_Chareffect, // by MouseJstr
- AtCommand_Chardye, // by MouseJstr
- AtCommand_Charhairstyle, // by MouseJstr
- AtCommand_Charhaircolor, // 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_Fog,
- AtCommand_Leaves,
- AtCommand_AdjGmLvl, // MouseJstr
- AtCommand_AdjCmdLvl, // MouseJstr
- AtCommand_Trade, // MouseJstr
- AtCommand_Send,
- AtCommand_SetBattleFlag,
- AtCommand_UnMute,
- AtCommand_UpTime,
- AtCommand_ChangeSex,
- // 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_Sound, // [Valaris]
- AtCommand_RefreshOnline, // [Valaris]
- // SQL-only commands end
-#endif
-
- // end
- 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, int gmlvl);
-
-AtCommandType atcommand(
- const int level, const char* message, AtCommandInfo* info);
-int get_atcommand_level(const AtCommandType type);
-
-char * msg_txt(int msg_number); // [Yor]
-
-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_spawn(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Valaris]
-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_config_read(const char *cfgName);
-int msg_config_read(const char *cfgName);
-
-#endif
-
+// $Id: atcommand.h 148 2004-09-30 14:05:37Z MouseJstr $
+#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_Storage,
+ AtCommand_GuildStorage,
+ AtCommand_Option,
+ AtCommand_Hide,
+ AtCommand_JobChange,
+ AtCommand_JobChange2,
+ AtCommand_JobChange3,
+ AtCommand_Die,
+ AtCommand_Kill,
+ AtCommand_Alive,
+ AtCommand_Kami,
+ AtCommand_KamiB,
+ AtCommand_Heal,
+ AtCommand_Item,
+ AtCommand_Item2,
+ AtCommand_ItemReset,
+ AtCommand_ItemCheck,
+ AtCommand_BaseLevelUp,
+ AtCommand_JobLevelUp,
+ AtCommand_H,
+ AtCommand_Help,
+ AtCommand_GM,
+ AtCommand_PvPOff,
+ AtCommand_PvPOn,
+ AtCommand_GvGOff,
+ AtCommand_GvGOn,
+ AtCommand_Model,
+ AtCommand_Go,
+ AtCommand_Spawn,
+ AtCommand_Monster,
+ AtCommand_KillMonster,
+ AtCommand_KillMonster2,
+ AtCommand_Refine,
+ AtCommand_Produce,
+ AtCommand_Memo,
+ AtCommand_GAT,
+ AtCommand_Packet,
+ 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_CharPetRename, // by Yor
+ AtCommand_Recall,
+ AtCommand_CharacterJob,
+ AtCommand_CharacterJob2,
+ AtCommand_CharacterJob3,
+ AtCommand_Revive,
+ AtCommand_CharacterStats,
+ AtCommand_CharacterStatsAll,
+ AtCommand_CharacterOption,
+ AtCommand_CharacterSave,
+ AtCommand_CharacterLoad,
+ AtCommand_Night,
+ AtCommand_Day,
+ AtCommand_Doom,
+ AtCommand_DoomMap,
+ AtCommand_Raise,
+ AtCommand_RaiseMap,
+ AtCommand_CharacterBaseLevel,
+ AtCommand_CharacterJobLevel,
+ AtCommand_Kick,
+ AtCommand_KickAll,
+ AtCommand_AllSkill,
+ AtCommand_QuestSkill,
+ AtCommand_CharQuestSkill,
+ AtCommand_LostSkill,
+ AtCommand_CharLostSkill,
+ AtCommand_SpiritBall,
+ AtCommand_Party,
+ AtCommand_Guild,
+ AtCommand_AgitStart,
+ AtCommand_AgitEnd,
+ AtCommand_MapExit,
+ AtCommand_IDSearch,
+ AtCommand_CharSkReset,
+ AtCommand_CharStReset,
+ AtCommand_CharReset,
+ //by chbrules
+ AtCommand_CharModel,
+ AtCommand_CharSKPoint,
+ AtCommand_CharSTPoint,
+ AtCommand_CharZeny,
+ AtCommand_RecallAll,
+ AtCommand_ReloadItemDB,
+ AtCommand_ReloadMobDB,
+ AtCommand_ReloadSkillDB,
+#ifndef TXT_ONLY
+ AtCommand_Rehash,
+#else /* TXT_ONLY */
+ AtCommand_ReloadScript,
+#endif /* TXT_ONLY */
+ AtCommand_ReloadGMDB,
+ AtCommand_MapInfo,
+ AtCommand_Dye,
+ AtCommand_Hstyle,
+ AtCommand_Hcolor,
+ AtCommand_StatAll,
+ AtCommand_CharChangeSex, // by Yor
+ 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_Enablenpc,
+ AtCommand_Disablenpc,
+ AtCommand_ServerTime, // by Yor
+ AtCommand_CharDelItem, // by Yor
+ AtCommand_Jail, // by Yor
+ AtCommand_UnJail, // by Yor
+ 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_Item_List, // by Yor
+ AtCommand_Char_Storage_List, // by Yor
+ 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_Chareffect, // by MouseJstr
+ AtCommand_Chardye, // by MouseJstr
+ AtCommand_Charhairstyle, // by MouseJstr
+ AtCommand_Charhaircolor, // 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_Fog,
+ AtCommand_Leaves,
+ AtCommand_AdjGmLvl, // MouseJstr
+ AtCommand_AdjCmdLvl, // MouseJstr
+ AtCommand_Trade, // MouseJstr
+ AtCommand_Send,
+ AtCommand_SetBattleFlag,
+ AtCommand_UnMute,
+ AtCommand_UpTime,
+ AtCommand_ChangeSex,
+ // 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_Sound, // [Valaris]
+ AtCommand_RefreshOnline, // [Valaris]
+ // SQL-only commands end
+#endif
+
+ // end
+ 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, int gmlvl);
+
+AtCommandType atcommand(
+ const int level, const char* message, AtCommandInfo* info);
+int get_atcommand_level(const AtCommandType type);
+
+char * msg_txt(int msg_number); // [Yor]
+
+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_spawn(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Valaris]
+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_config_read(const char *cfgName);
+int msg_config_read(const char *cfgName);
+
+#endif
+
diff --git a/src/map/battle.c b/src/map/battle.c
index 1561b054d..812372c31 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -1,5462 +1,5462 @@
-// $Id: battle.c,v 1.10 2004/09/29 21:08:17 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
-#include "battle.h"
-
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-
-#include "map.h"
-#include "pc.h"
-#include "skill.h"
-#include "mob.h"
-#include "itemdb.h"
-#include "clif.h"
-#include "pet.h"
-#include "guild.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int attr_fix_table[4][10][10];
-
-struct Battle_Config battle_config;
-
-/*==========================================
- * “ñ“_ŠÔ‚Ì‹——£‚ð•Ô‚·
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚é‘ÎÛ‚Ì”‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv)
-{
- nullpo_retr(0, bl);
- if(bl->type == BL_PC)
- return pc_counttargeted((struct map_session_data *)bl,src,target_lv);
- else if(bl->type == BL_MOB)
- return mob_counttargeted((struct mob_data *)bl,src,target_lv);
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌClass‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_class(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->class;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.class;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->class;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚Ì•ûŒü‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_dir(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->dir;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->dir;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->dir;
- else
- return 0;
-}
-/*==========================================
- * ‘Îۂ̃Œƒxƒ‹‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_lv(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].lv;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.base_level;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return ((struct pet_data *)bl)->msd->pet.level;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌŽË’ö‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_range(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].range;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->attackrange;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class].range;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌHP‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_hp(struct block_list *bl)
-{
- nullpo_retr(1, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->hp;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.hp;
- else
- return 1;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMHP‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_max_hp(struct block_list *bl)
-{
- nullpo_retr(1, bl);
- if(bl->type==BL_PC && ((struct map_session_data *)bl))
- return ((struct map_session_data *)bl)->status.max_hp;
- else {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int max_hp=1;
- if(bl->type==BL_MOB && ((struct mob_data*)bl)) {
- max_hp = mob_db[((struct mob_data*)bl)->class].max_hp;
- if(mob_db[((struct mob_data*)bl)->class].mexp > 0) {
- if(battle_config.mvp_hp_rate != 100)
- max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
- }
- else {
- if(battle_config.monster_hp_rate != 100)
- max_hp = (max_hp * battle_config.monster_hp_rate)/100;
- }
- }
- else if(bl->type==BL_PET && ((struct pet_data*)bl)) {
- max_hp = mob_db[((struct pet_data*)bl)->class].max_hp;
- if(mob_db[((struct pet_data*)bl)->class].mexp > 0) {
- if(battle_config.mvp_hp_rate != 100)
- max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
- }
- else {
- if(battle_config.monster_hp_rate != 100)
- max_hp = (max_hp * battle_config.monster_hp_rate)/100;
- }
- }
- if(sc_data) {
- if(sc_data[SC_APPLEIDUN].timer!=-1)
- max_hp += ((5+sc_data[SC_APPLEIDUN].val1*2+((sc_data[SC_APPLEIDUN].val2+1)>>1)
- +sc_data[SC_APPLEIDUN].val3/10) * max_hp)/100;
- }
- if(max_hp < 1) max_hp = 1;
- return max_hp;
- }
- return 1;
-}
-/*==========================================
- * ‘ÎÛ‚ÌStr‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_str(struct block_list *bl)
-{
- int str=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && ((struct mob_data *)bl))
- str = mob_db[((struct mob_data *)bl)->class].str;
- else if(bl->type==BL_PC && ((struct map_session_data *)bl))
- return ((struct map_session_data *)bl)->paramc[0];
- else if(bl->type==BL_PET && ((struct pet_data *)bl))
- str = mob_db[((struct pet_data *)bl)->class].str;
-
- if(sc_data) {
- if(sc_data[SC_LOUD].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
- str += 4;
- if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
- int race=battle_get_race(bl);
- if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) str >>= 1; // ˆ« –‚/•sŽ€
- else str += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- str += 5;
- }
- if(str < 0) str = 0;
- return str;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAgi‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-
-int battle_get_agi(struct block_list *bl)
-{
- int agi=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- agi=mob_db[((struct mob_data *)bl)->class].agi;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- agi=((struct map_session_data *)bl)->paramc[1];
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- agi=mob_db[((struct pet_data *)bl)->class].agi;
-
- if(sc_data) {
- if( sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 &&
- bl->type != BL_PC) // ‘¬“x‘‰Á(PC‚Ípc.c‚Å)
- agi += 2+sc_data[SC_INCREASEAGI].val1;
-
- if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
- agi += agi*(2+sc_data[SC_CONCENTRATE].val1)/100;
-
- if(sc_data[SC_DECREASEAGI].timer!=-1) // ‘¬“xŒ¸­
- agi -= 2+sc_data[SC_DECREASEAGI].val1;
-
- if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // ƒNƒ@ƒOƒ}ƒCƒA
- //agi >>= 1;
- int agib = agi*(sc_data[SC_QUAGMIRE].val1*10)/100;
- agi -= agib > 50 ? 50 : agib;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- agi += 5;
- }
- if(agi < 0) agi = 0;
- return agi;
-}
-/*==========================================
- * ‘ÎÛ‚ÌVit‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_vit(struct block_list *bl)
-{
- int vit=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- vit=mob_db[((struct mob_data *)bl)->class].vit;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- vit=((struct map_session_data *)bl)->paramc[2];
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- vit=mob_db[((struct pet_data *)bl)->class].vit;
- if(sc_data) {
- if(sc_data[SC_STRIPARMOR].timer != -1 && bl->type!=BL_PC)
- vit = vit*60/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- vit += 5;
- }
-
- if(vit < 0) vit = 0;
- return vit;
-}
-/*==========================================
- * ‘ÎÛ‚ÌInt‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_int(struct block_list *bl)
-{
- int int_=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- int_=mob_db[((struct mob_data *)bl)->class].int_;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- int_=((struct map_session_data *)bl)->paramc[3];
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- int_=mob_db[((struct pet_data *)bl)->class].int_;
-
- if(sc_data) {
- if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
- int race=battle_get_race(bl);
- if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) int_ >>= 1; // ˆ« –‚/•sŽ€
- else int_ += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
- if( sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC)
- int_ = int_*60/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- int_ += 5;
- }
- if(int_ < 0) int_ = 0;
- return int_;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDex‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_dex(struct block_list *bl)
-{
- int dex=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- dex=mob_db[((struct mob_data *)bl)->class].dex;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- dex=((struct map_session_data *)bl)->paramc[4];
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- dex=mob_db[((struct pet_data *)bl)->class].dex;
-
- if(sc_data) {
- if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
- dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100;
-
- if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
- int race=battle_get_race(bl);
- if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) dex >>= 1; // ˆ« –‚/•sŽ€
- else dex += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
- }
-
- if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // ƒNƒ@ƒOƒ}ƒCƒA
- // dex >>= 1;
- int dexb = dex*(sc_data[SC_QUAGMIRE].val1*10)/100;
- dex -= dexb > 50 ? 50 : dexb;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- dex += 5;
- }
- if(dex < 0) dex = 0;
- return dex;
-}
-/*==========================================
- * ‘ÎÛ‚ÌLuk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_luk(struct block_list *bl)
-{
- int luk=0;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- luk=mob_db[((struct mob_data *)bl)->class].luk;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- luk=((struct map_session_data *)bl)->paramc[5];
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- luk=mob_db[((struct pet_data *)bl)->class].luk;
-
- if(sc_data) {
- if(sc_data[SC_GLORIA].timer!=-1 && bl->type != BL_PC) // ƒOƒƒŠƒA(PC‚Ípc.c‚Å)
- luk += 30;
- if(sc_data[SC_CURSE].timer!=-1 ) // Žô‚¢
- luk=0;
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- luk += 5;
- }
- if(luk < 0) luk = 0;
- return luk;
-}
-
-/*==========================================
- * ‘ÎÛ‚ÌFlee‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_flee(struct block_list *bl)
-{
- int flee=1;
- struct status_change *sc_data;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- flee=((struct map_session_data *)bl)->flee;
- else
- flee=battle_get_agi(bl) + battle_get_lv(bl);
-
- if(sc_data) {
- if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
- flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
- +(sc_data[SC_WHISTLE].val3>>16))/100;
- if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC)
- flee -= flee*25/100;
- if(sc_data[SC_WINDWALK].timer!=-1 && bl->type != BL_PC) // ƒEƒBƒ“ƒhƒEƒH[ƒN
- flee += flee*(sc_data[SC_WINDWALK].val2)/100;
- if(sc_data[SC_SPIDERWEB].timer!=-1 && bl->type != BL_PC) //ƒXƒpƒCƒ_[ƒEƒFƒu
- flee -= flee*50/100;
- }
- if(flee < 1) flee = 1;
- return flee;
-}
-/*==========================================
- * ‘ÎÛ‚ÌHit‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_hit(struct block_list *bl)
-{
- int hit=1;
- struct status_change *sc_data;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- hit=((struct map_session_data *)bl)->hit;
- else
- hit=battle_get_dex(bl) + battle_get_lv(bl);
-
- if(sc_data) {
- if(sc_data[SC_HUMMING].timer!=-1 && bl->type != BL_PC) //
- hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2
- +sc_data[SC_HUMMING].val3)/100;
- if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) // Žô‚¢
- hit -= hit*25/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
- hit += 3*(sc_data[SC_TRUESIGHT].val1);
- if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100;
- }
- if(hit < 1) hit = 1;
- return hit;
-}
-/*==========================================
- * ‘ÎÛ‚ÌŠ®‘S‰ñ”ð‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_flee2(struct block_list *bl)
-{
- int flee2=1;
- struct status_change *sc_data;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- flee2 = battle_get_luk(bl) + 10;
- flee2 += ((struct map_session_data *)bl)->flee2 - (((struct map_session_data *)bl)->paramc[5] + 10);
- }
- else
- flee2=battle_get_luk(bl)+1;
-
- if(sc_data) {
- if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
- flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
- +(sc_data[SC_WHISTLE].val3&0xffff))*10;
- }
- if(flee2 < 1) flee2 = 1;
- return flee2;
-}
-/*==========================================
- * ‘Îۂ̃NƒŠƒeƒBƒJƒ‹‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_critical(struct block_list *bl)
-{
- int critical=1;
- struct status_change *sc_data;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- critical = battle_get_luk(bl)*3 + 10;
- critical += ((struct map_session_data *)bl)->critical - ((((struct map_session_data *)bl)->paramc[5]*3) + 10);
- }
- else
- critical=battle_get_luk(bl)*3 + 1;
-
- if(sc_data) {
- if(sc_data[SC_FORTUNE].timer!=-1 && bl->type != BL_PC)
- critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2
- +sc_data[SC_FORTUNE].val3)*10;
- if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1 && bl->type != BL_PC)
- critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
- if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) //ƒgƒDƒ‹[ƒTƒCƒg
- critical += critical*sc_data[SC_TRUESIGHT].val1/100;
- }
- if(critical < 1) critical = 1;
- return critical;
-}
-/*==========================================
- * base_atk‚̎擾
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_baseatk(struct block_list *bl)
-{
- struct status_change *sc_data;
- int batk=1;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- batk = ((struct map_session_data *)bl)->base_atk; //ݒ肳‚ê‚Ä‚¢‚ébase_atk
- else { //‚»‚êˆÈŠO‚È‚ç
- int str,dstr;
- str = battle_get_str(bl); //STR
- dstr = str/10;
- batk = dstr*dstr + str; //base_atk‚ðŒvŽZ‚·‚é
- }
- if(sc_data) { //ó‘ÔˆÙí‚ ‚è
- if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) //PC‚Ńvƒƒ{ƒbƒN(SM_PROVOKE)ó‘Ô
- batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100; //base_atk‘‰Á
- if(sc_data[SC_CURSE].timer!=-1 ) //Žô‚í‚ê‚Ä‚¢‚½‚ç
- batk -= batk*25/100; //base_atk‚ª25%Œ¸­
- if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100;
- if(sc_data[SC_EDP].timer != -1) // [Celest]
- batk += batk*(50+50*sc_data[SC_EDP].val1)/100;
- }
- if(batk < 1) batk = 1; //base_atk‚ÍÅ’á‚Å‚à1
- return batk;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAtk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_atk(struct block_list *bl)
-{
- struct status_change *sc_data;
- int atk=0;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- atk = ((struct map_session_data*)bl)->watk;
- else if(bl->type==BL_MOB && (struct mob_data *)bl)
- atk = mob_db[((struct mob_data*)bl)->class].atk1;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- atk = mob_db[((struct pet_data*)bl)->class].atk1;
-
- if(sc_data) {
- if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
- atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100;
- if(sc_data[SC_CURSE].timer!=-1 )
- atk -= atk*25/100;
- if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100;
- }
- if(atk < 0) atk = 0;
- return atk;
-}
-/*==========================================
- * ‘Îۂ̶ŽèAtk‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_atk_(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- int atk=((struct map_session_data*)bl)->watk_;
-
- if(((struct map_session_data *)bl)->sc_data[SC_CURSE].timer!=-1 )
- atk -= atk*25/100;
- return atk;
- }
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_atk2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk2;
- else {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int atk2=0;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- atk2 = mob_db[((struct mob_data*)bl)->class].atk2;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- atk2 = mob_db[((struct pet_data*)bl)->class].atk2;
- if(sc_data) {
- if( sc_data[SC_IMPOSITIO].timer!=-1)
- atk2 += sc_data[SC_IMPOSITIO].val1*5;
- if( sc_data[SC_PROVOKE].timer!=-1 )
- atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100;
- if( sc_data[SC_CURSE].timer!=-1 )
- atk2 -= atk2*25/100;
- if(sc_data[SC_DRUMBATTLE].timer!=-1)
- atk2 += sc_data[SC_DRUMBATTLE].val2;
- if(sc_data[SC_NIBELUNGEN].timer!=-1 && (battle_get_element(bl)/10) >= 8 )
- atk2 += sc_data[SC_NIBELUNGEN].val2;
- if(sc_data[SC_STRIPWEAPON].timer!=-1)
- atk2 = atk2*90/100;
- if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
- }
- if(atk2 < 0) atk2 = 0;
- return atk2;
- }
- return 0;
-}
-/*==========================================
- * ‘Îۂ̶ŽèAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_atk_2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->watk_2;
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMAtk1‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_matk1(struct block_list *bl)
-{
- struct status_change *sc_data;
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_MOB){
- int matk,int_=battle_get_int(bl);
- matk = int_+(int_/5)*(int_/5);
-
- if(sc_data)
- if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- return matk;
- }
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->matk1;
- else if(bl->type==BL_PET){
- int matk,int_=battle_get_int(bl);
- matk = int_+(int_/5)*(int_/5);
-
- if(sc_data)
- if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- return matk;
- }
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMAtk2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_matk2(struct block_list *bl)
-{
- struct status_change *sc_data=battle_get_sc_data(bl);
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB){
- int matk,int_=battle_get_int(bl);
- matk = int_+(int_/7)*(int_/7);
-
- if(sc_data)
- if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- return matk;
- }
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->matk2;
- else if(bl->type==BL_PET){
- int matk,int_=battle_get_int(bl);
- matk = int_+(int_/7)*(int_/7);
- if(sc_data)
- if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
- return matk;
- }
- else
- return 0;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDef‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_def(struct block_list *bl)
-{
- struct status_change *sc_data;
- int def=0,skilltimer=-1,skillid=0;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl){
- def = ((struct map_session_data *)bl)->def;
- skilltimer = ((struct map_session_data *)bl)->skilltimer;
- skillid = ((struct map_session_data *)bl)->skillid;
- }
- else if(bl->type==BL_MOB && (struct mob_data *)bl) {
- def = mob_db[((struct mob_data *)bl)->class].def;
- skilltimer = ((struct mob_data *)bl)->skilltimer;
- skillid = ((struct mob_data *)bl)->skillid;
- }
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- def = mob_db[((struct pet_data *)bl)->class].def;
-
- if(def < 1000000) {
- if(sc_data) {
- //ƒL[ƒsƒ“ƒOŽž‚ÍDEF100
- if( sc_data[SC_KEEPING].timer!=-1)
- def = 100;
- //ƒvƒƒ{ƒbƒNŽž‚ÍŒ¸ŽZ
- if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
- def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
- //푾ŒÛ‚Ì‹¿‚«Žž‚͉ÁŽZ
- if( sc_data[SC_DRUMBATTLE].timer!=-1 && bl->type != BL_PC)
- def += sc_data[SC_DRUMBATTLE].val3;
- //“Å‚É‚©‚©‚Á‚Ä‚¢‚鎞‚ÍŒ¸ŽZ
- if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
- def = def*75/100;
- //ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒhŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_STRIPSHIELD].timer!=-1 && bl->type != BL_PC)
- def = def*85/100;
- //ƒVƒOƒiƒ€ƒNƒ‹ƒVƒXŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_SIGNUMCRUCIS].timer!=-1 && bl->type != BL_PC)
- def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100;
- //‰i‰“‚̬“׎ž‚ÍDEF0‚É‚È‚é
- if(sc_data[SC_ETERNALCHAOS].timer!=-1 && bl->type != BL_PC)
- def = 0;
- //“€Œ‹AΉ»Žž‚͉EƒVƒtƒg
- if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
- def >>= 1;
- //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
- if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC)
- def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100;
- }
- //‰r¥’†‚͉r¥ŽžŒ¸ŽZ—¦‚ÉŠî‚¢‚ÄŒ¸ŽZ
- if(skilltimer != -1) {
- int def_rate = skill_get_castdef(skillid);
- if(def_rate != 0)
- def = (def * (100 - def_rate))/100;
- }
- }
- if(def < 0) def = 0;
- return def;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMDef‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_mdef(struct block_list *bl)
-{
- struct status_change *sc_data;
- int mdef=0;
-
- nullpo_retr(0, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- mdef = ((struct map_session_data *)bl)->mdef;
- else if(bl->type==BL_MOB && (struct mob_data *)bl)
- mdef = mob_db[((struct mob_data *)bl)->class].mdef;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- mdef = mob_db[((struct pet_data *)bl)->class].mdef;
-
- if(mdef < 1000000) {
- if(sc_data) {
- //ƒoƒŠƒA[ó‘ÔŽž‚ÍMDEF100
- if(sc_data[SC_BARRIER].timer != -1)
- mdef = 100;
- //“€Œ‹AΉ»Žž‚Í1.25”{
- if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
- mdef = mdef*125/100;
- if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- mdef -= (mdef*6*sc_data[SC_MINDBREAKER].val1)/100;
- }
- }
- if(mdef < 0) mdef = 0;
- return mdef;
-}
-/*==========================================
- * ‘ÎÛ‚ÌDef2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- *------------------------------------------
- */
-int battle_get_def2(struct block_list *bl)
-{
- struct status_change *sc_data;
- int def2=1;
-
- nullpo_retr(1, bl);
- sc_data=battle_get_sc_data(bl);
- if(bl->type==BL_PC)
- def2 = ((struct map_session_data *)bl)->def2;
- else if(bl->type==BL_MOB)
- def2 = mob_db[((struct mob_data *)bl)->class].vit;
- else if(bl->type==BL_PET)
- def2 = mob_db[((struct pet_data *)bl)->class].vit;
-
- if(sc_data) {
- if( sc_data[SC_ANGELUS].timer!=-1 && bl->type != BL_PC)
- def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100;
- if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
- def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
- if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
- def2 = def2*75/100;
- //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
- if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC)
- def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100;
- }
- if(def2 < 1) def2 = 1;
- return def2;
-}
-/*==========================================
- * ‘ÎÛ‚ÌMDef2‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å0ˆÈã
- *------------------------------------------
- */
-int battle_get_mdef2(struct block_list *bl)
-{
- int mdef2=0;
- struct status_change *sc_data=battle_get_sc_data(bl);
-
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB)
- mdef2 = mob_db[((struct mob_data *)bl)->class].int_ + (mob_db[((struct mob_data *)bl)->class].vit>>1);
- else if(bl->type==BL_PC)
- mdef2 = ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1);
- else if(bl->type==BL_PET)
- mdef2 = mob_db[((struct pet_data *)bl)->class].int_ + (mob_db[((struct pet_data *)bl)->class].vit>>1);
- if(sc_data) {
- if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
- mdef2 -= (mdef2*6*sc_data[SC_MINDBREAKER].val1)/100;
- }
- if(mdef2 < 0) mdef2 = 0;
- return mdef2;
-}
-/*==========================================
- * ‘ÎÛ‚ÌSpeed(ˆÚ“®‘¬“x)‚ð•Ô‚·(”Ä—p)
- * –ß‚è‚Í®”‚Å1ˆÈã
- * Speed‚ͬ‚³‚¢‚Ù‚¤‚ªˆÚ“®‘¬“x‚ª‘¬‚¢
- *------------------------------------------
- */
-int battle_get_speed(struct block_list *bl)
-{
- nullpo_retr(1000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->speed;
- else {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int speed = 1000;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
-// speed = mob_db[((struct mob_data *)bl)->class].speed;
- speed = ((struct mob_data *)bl)->speed;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- speed = ((struct pet_data *)bl)->msd->petDB->speed;
-
- if(sc_data) {
- //‘¬“x‘‰ÁŽž‚Í25%Œ¸ŽZ
- if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1)
- speed -= speed*25/100;
- //‘¬“xŒ¸­Žž‚Í25%‰ÁŽZ
- if(sc_data[SC_DECREASEAGI].timer!=-1)
- speed = speed*125/100;
- //ƒNƒ@ƒOƒ}ƒCƒAŽž‚Í50%‰ÁŽZ
- if(sc_data[SC_QUAGMIRE].timer!=-1)
- speed = speed*3/2;
- //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
- if(sc_data[SC_DONTFORGETME].timer!=-1)
- speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100;
- //‹à„Žž‚Í25%‰ÁŽZ
- if(sc_data[SC_STEELBODY].timer!=-1)
- speed = speed*125/100;
- //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
- if(sc_data[SC_DEFENDER].timer!=-1)
- speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;
- //—x‚èó‘Ô‚Í4”{’x‚¢
- if(sc_data[SC_DANCING].timer!=-1 )
- speed*=4;
- //Žô‚¢Žž‚Í450‰ÁŽZ
- if(sc_data[SC_CURSE].timer!=-1)
- speed = speed + 450;
- //ƒEƒBƒ“ƒhƒEƒH[ƒNŽž‚ÍLv*2%Œ¸ŽZ
- if(sc_data[SC_WINDWALK].timer!=-1)
- speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
- }
- if(speed < 1) speed = 1;
- return speed;
- }
-
- return 1000;
-}
-/*==========================================
- * ‘ÎÛ‚ÌaDelay(UŒ‚ŽžƒfƒBƒŒƒC)‚ð•Ô‚·(”Ä—p)
- * aDelay‚ͬ‚³‚¢‚Ù‚¤‚ªUŒ‚‘¬“x‚ª‘¬‚¢
- *------------------------------------------
- */
-int battle_get_adelay(struct block_list *bl)
-{
- nullpo_retr(4000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return (((struct map_session_data *)bl)->aspd<<1);
- else {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int adelay=4000,aspd_rate = 100,i;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- adelay = mob_db[((struct mob_data *)bl)->class].adelay;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- adelay = mob_db[((struct pet_data *)bl)->class].adelay;
-
- if(sc_data) {
- //ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“Žg—pŽž‚ŃNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í3Š„Œ¸ŽZ
- if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- //ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Žg—pŽž‚Ńc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“‚Å‚àƒNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í
- if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- //Žg—pŽÒ‚ƃp[ƒeƒBƒƒ“ƒo[‚ÅŠi·‚ªo‚éÝ’è‚Å‚È‚¯‚ê‚Î3Š„Œ¸ŽZ
- if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- //‚»‚¤‚Å‚È‚¯‚ê‚Î2.5Š„Œ¸ŽZ
- else
- aspd_rate -= 25;
- }
- //ƒXƒsƒAƒNƒBƒbƒPƒ“Žž‚ÍŒ¸ŽZ
- if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
- sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- //—[“ú‚̃AƒTƒVƒ“ƒNƒƒXŽž‚ÍŒ¸ŽZ
- if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
- //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
- if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
- //‹à„Žž25%‰ÁŽZ
- if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
- aspd_rate += 25;
- //‘‘¬ƒ|[ƒVƒ‡ƒ“Žg—pŽž‚ÍŒ¸ŽZ
- if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
- aspd_rate -= sc_data[i].val2;
- //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
- if(sc_data[SC_DEFENDER].timer != -1)
- adelay += (1100 - sc_data[SC_DEFENDER].val1*100);
- }
- if(aspd_rate != 100)
- adelay = adelay*aspd_rate/100;
- if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1;
- return adelay;
- }
- return 4000;
-}
-int battle_get_amotion(struct block_list *bl)
-{
- nullpo_retr(2000, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->amotion;
- else {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int amotion=2000,aspd_rate = 100,i;
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- amotion = mob_db[((struct mob_data *)bl)->class].amotion;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- amotion = mob_db[((struct pet_data *)bl)->class].amotion;
-
- if(sc_data) {
- if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
- sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
- if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
- if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
- if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
- aspd_rate += 25;
- if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
- aspd_rate -= sc_data[i].val2;
- if(sc_data[SC_DEFENDER].timer != -1)
- amotion += (550 - sc_data[SC_DEFENDER].val1*50);
- }
- if(aspd_rate != 100)
- amotion = amotion*aspd_rate/100;
- if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd;
- return amotion;
- }
- return 2000;
-}
-int battle_get_dmotion(struct block_list *bl)
-{
- int ret;
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- sc_data = battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl){
- ret=mob_db[((struct mob_data *)bl)->class].dmotion;
- if(battle_config.monster_damage_delay_rate != 100)
- ret = ret*battle_config.monster_damage_delay_rate/400;
- }
- else if(bl->type==BL_PC && (struct map_session_data *)bl){
- ret=((struct map_session_data *)bl)->dmotion;
- if(battle_config.pc_damage_delay_rate != 100)
- ret = ret*battle_config.pc_damage_delay_rate/400;
- }
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret=mob_db[((struct pet_data *)bl)->class].dmotion;
- else
- return 2000;
-
- if((sc_data && sc_data[SC_ENDURE].timer!=-1) ||
- (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
- ret=0;
-
- return ret;
-}
-int battle_get_element(struct block_list *bl)
-{
- int ret = 20;
- struct status_change *sc_data;
-
- nullpo_retr(ret, bl);
- sc_data = battle_get_sc_data(bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl) // 10‚̈ÊLv*2A‚P‚̈ʑ®«
- ret=((struct mob_data *)bl)->def_ele;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- ret=20+((struct map_session_data *)bl)->def_ele; // –hŒä‘®«Lv1
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret = mob_db[((struct pet_data *)bl)->class].element;
-
- if(sc_data) {
- if( sc_data[SC_BENEDICTIO].timer!=-1 ) // ¹‘Ì~•Ÿ
- ret=26;
- if( sc_data[SC_FREEZE].timer!=-1 ) // “€Œ‹
- ret=21;
- if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- ret=22;
- }
-
- return ret;
-}
-int battle_get_attack_element(struct block_list *bl)
-{
- int ret = 0;
- struct status_change *sc_data=battle_get_sc_data(bl);
-
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- ret=0;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- ret=((struct map_session_data *)bl)->atk_ele;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- ret=0;
-
- if(sc_data) {
- if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
- ret=1;
- if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
- ret=2;
- if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
- ret=3;
- if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
- ret=4;
- if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
- ret=5;
- if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
- ret=6;
- }
-
- return ret;
-}
-int battle_get_attack_element2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl) {
- int ret = ((struct map_session_data *)bl)->atk_ele_;
- struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data;
-
- if(sc_data) {
- if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
- ret=1;
- if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
- ret=2;
- if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
- ret=3;
- if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
- ret=4;
- if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
- ret=5;
- if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
- ret=6;
- }
- return ret;
- }
- return 0;
-}
-int battle_get_party_id(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.party_id;
- else if(bl->type==BL_MOB && (struct mob_data *)bl){
- struct mob_data *md=(struct mob_data *)bl;
- if( md->master_id>0 )
- return -md->master_id;
- return -md->bl.id;
- }
- else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
- return ((struct skill_unit *)bl)->group->party_id;
- else
- return 0;
-}
-int battle_get_guild_id(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data *)bl)->status.guild_id;
- else if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data *)bl)->class;
- else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
- return ((struct skill_unit *)bl)->group->guild_id;
- else
- return 0;
-}
-int battle_get_race(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].race;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return 7;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class].race;
- else
- return 0;
-}
-int battle_get_size(struct block_list *bl)
-{
- nullpo_retr(1, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].size;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return 1;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class].size;
- else
- return 1;
-}
-int battle_get_mode(struct block_list *bl)
-{
- nullpo_retr(0x01, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].mode;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class].mode;
- else
- return 0x01; // ‚Æ‚è‚ ‚¦‚¸“®‚­‚Æ‚¢‚¤‚±‚Æ‚Å1
-}
-
-int battle_get_mexp(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return mob_db[((struct mob_data *)bl)->class].mexp;
- else if(bl->type==BL_PET && (struct pet_data *)bl)
- return mob_db[((struct pet_data *)bl)->class].mexp;
- else
- return 0;
-}
-
-// StatusChangeŒn‚ÌŠ“¾
-struct status_change *battle_get_sc_data(struct block_list *bl)
-{
- nullpo_retr(NULL, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return ((struct mob_data*)bl)->sc_data;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return ((struct map_session_data*)bl)->sc_data;
- return NULL;
-}
-short *battle_get_sc_count(struct block_list *bl)
-{
- nullpo_retr(NULL, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->sc_count;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->sc_count;
- return NULL;
-}
-short *battle_get_opt1(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt1;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt1;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt1;
- return 0;
-}
-short *battle_get_opt2(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt2;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt2;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt2;
- return 0;
-}
-short *battle_get_opt3(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->opt3;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->opt3;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->opt3;
- return 0;
-}
-short *battle_get_option(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB && (struct mob_data *)bl)
- return &((struct mob_data*)bl)->option;
- else if(bl->type==BL_PC && (struct map_session_data *)bl)
- return &((struct map_session_data*)bl)->status.option;
- else if(bl->type==BL_NPC && (struct npc_data *)bl)
- return &((struct npc_data*)bl)->option;
- return 0;
-}
-
-//-------------------------------------------------------------------
-
-// ƒ_ƒ[ƒW‚Ì’x‰„
-struct battle_delay_damage_ {
- struct block_list *src,*target;
- int damage;
- int flag;
-};
-int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data)
-{
- struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data;
- if( dat && map_id2bl(id)==dat->src && dat->target->prev!=NULL)
- battle_damage(dat->src,dat->target,dat->damage,dat->flag);
- free(dat);
- return 0;
-}
-int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag)
-{
- struct battle_delay_damage_ *dat = (struct battle_delay_damage_*)aCalloc(1,sizeof(struct battle_delay_damage_));
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
-
- dat->src=src;
- dat->target=target;
- dat->damage=damage;
- dat->flag=flag;
- add_timer(tick,battle_delay_damage_sub,src->id,(int)dat);
- return 0;
-}
-
-// ŽÀÛ‚ÉHP‚ð‘€ì
-int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag)
-{
- struct map_session_data *sd=NULL;
- struct status_change *sc_data=battle_get_sc_data(target);
- short *sc_count;
- int i;
-
- nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
-
- if(damage==0 || target->type == BL_PET)
- return 0;
-
- if(target->prev == NULL)
- return 0;
-
- if(bl) {
- if(bl->prev==NULL)
- return 0;
-
- if(bl->type==BL_PC)
- sd=(struct map_session_data *)bl;
- }
-
- if(damage<0)
- return battle_heal(bl,target,-damage,0,flag);
-
- if(!flag && (sc_count=battle_get_sc_count(target))!=NULL && *sc_count>0){
- // “€Œ‹AΉ»A‡–°‚ðÁ‹Ž
- if(sc_data[SC_FREEZE].timer!=-1)
- skill_status_change_end(target,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- skill_status_change_end(target,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- skill_status_change_end(target,SC_SLEEP,-1);
- }
-
- if(target->type==BL_MOB){ // MOB
- struct mob_data *md=(struct mob_data *)target;
- if(md && md->skilltimer!=-1 && md->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(target,0);
- return mob_damage(bl,md,damage,0);
- }
- else if(target->type==BL_PC){ // PC
-
- struct map_session_data *tsd=(struct map_session_data *)target;
-
- if(tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1){ // ƒfƒBƒ{[ƒVƒ‡ƒ“‚ð‚©‚¯‚ç‚ê‚Ä‚¢‚é
- struct map_session_data *md = map_id2sd(tsd->sc_data[SC_DEVOTION].val1);
- if(md && skill_devotion3(&md->bl,target->id)){
- skill_devotion(md,target->id);
- }
- else if(md && bl)
- for(i=0;i<5;i++)
- if(md->dev.val1[i] == target->id){
- clif_damage(bl,&md->bl, gettick(), 0, 0,
- damage, 0 , 0, 0);
- pc_damage(&md->bl,md,damage);
-
- return 0;
- }
- }
-
- if(tsd && tsd->skilltimer!=-1){ // ‰r¥–WŠQ
- // ƒtƒFƒ“ƒJ[ƒh‚â–WŠQ‚³‚ê‚È‚¢ƒXƒLƒ‹‚©‚ÌŒŸ¸
- if( (!tsd->special_state.no_castcancel || map[bl->m].flag.gvg) && tsd->state.skillcastcancel &&
- !tsd->special_state.no_castcancel2)
- skill_castcancel(target,0);
- }
-
- return pc_damage(bl,tsd,damage);
-
- }
- else if(target->type==BL_SKILL)
- return skill_unit_ondamaged((struct skill_unit *)target,bl,damage,gettick());
- return 0;
-}
-int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag)
-{
- nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
-
- if(target->type == BL_PET)
- return 0;
- if( target->type ==BL_PC && pc_isdead((struct map_session_data *)target) )
- return 0;
- if(hp==0 && sp==0)
- return 0;
-
- if(hp<0)
- return battle_damage(bl,target,-hp,flag);
-
- if(target->type==BL_MOB)
- return mob_heal((struct mob_data *)target,hp);
- else if(target->type==BL_PC)
- return pc_heal((struct map_session_data *)target,hp,sp);
- return 0;
-}
-
-// UŒ‚’âŽ~
-int battle_stopattack(struct block_list *bl)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB)
- return mob_stopattack((struct mob_data*)bl);
- else if(bl->type==BL_PC)
- return pc_stopattack((struct map_session_data*)bl);
- else if(bl->type==BL_PET)
- return pet_stopattack((struct pet_data*)bl);
- return 0;
-}
-// ˆÚ“®’âŽ~
-int battle_stopwalking(struct block_list *bl,int type)
-{
- nullpo_retr(0, bl);
- if(bl->type==BL_MOB)
- return mob_stop_walking((struct mob_data*)bl,type);
- else if(bl->type==BL_PC)
- return pc_stop_walking((struct map_session_data*)bl,type);
- else if(bl->type==BL_PET)
- return pet_stop_walking((struct pet_data*)bl,type);
- return 0;
-}
-
-
-/*==========================================
- * ƒ_ƒ[ƒW‚Ì‘®«C³
- *------------------------------------------
- */
-int battle_attr_fix(int damage,int atk_elem,int def_elem)
-{
- int def_type= def_elem%10, def_lv=def_elem/10/2;
-
- if( atk_elem<0 || atk_elem>9 || def_type<0 || def_type>9 ||
- def_lv<1 || def_lv>4){ // ‘® «’l‚ª‚¨‚©‚µ‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸‚»‚Ì‚Ü‚Ü•Ô‚·
- if(battle_config.error_log)
- printf("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
- return damage;
- }
-
- return damage*attr_fix_table[def_lv-1][atk_elem][def_type]/100;
-}
-
-
-/*==========================================
- * ƒ_ƒ[ƒ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)
-{
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
- struct status_change *sc_data,*sc;
- short *sc_count;
- int class;
-
- nullpo_retr(0, bl);
-
- class = battle_get_class(bl);
- if(bl->type==BL_MOB) md=(struct mob_data *)bl;
- else sd=(struct map_session_data *)bl;
-
- sc_data=battle_get_sc_data(bl);
- sc_count=battle_get_sc_count(bl);
-
- if(sc_count!=NULL && *sc_count>0){
-
- if(sc_data[SC_SAFETYWALL].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_SHORT && skill_num != NPC_GUIDEDATTACK){
- // ƒZ[ƒtƒeƒBƒEƒH[ƒ‹
- struct skill_unit *unit=(struct skill_unit*)sc_data[SC_SAFETYWALL].val2;
- if( unit && unit->alive && (--unit->group->val2)<=0 )
- skill_delunit(unit);
- skill_unit_move(bl,gettick(),1); // d‚ËŠ|‚¯ƒ`ƒFƒbƒN
- damage=0;
- }
- if(sc_data[SC_PNEUMA].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_LONG && skill_num != NPC_GUIDEDATTACK){
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_ROKISWEIL].timer!=-1 && damage>0 &&
- flag&BF_MAGIC ){
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_AETERNA].timer!=-1 && damage>0){ // ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi
- damage<<=1;
- skill_status_change_end( bl,SC_AETERNA,-1 );
- }
-
- //‘®«ê‚̃_ƒ[ƒW‘‰Á
- if(sc_data[SC_VOLCANO].timer!=-1){ // ƒ{ƒ‹ƒP[ƒm
- if(flag&BF_SKILL && skill_get_pl(skill_num)==3)
- damage += damage*sc_data[SC_VOLCANO].val4/100;
- else if(!flag&BF_SKILL && battle_get_attack_element(bl)==3)
- damage += damage*sc_data[SC_VOLCANO].val4/100;
- }
-
- if(sc_data[SC_VIOLENTGALE].timer!=-1){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- if(flag&BF_SKILL && skill_get_pl(skill_num)==4)
- damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
- else if(!flag&BF_SKILL && battle_get_attack_element(bl)==4)
- damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
- }
-
- if(sc_data[SC_DELUGE].timer!=-1){ // ƒfƒŠƒ…[ƒW
- if(flag&BF_SKILL && skill_get_pl(skill_num)==1)
- damage += damage*sc_data[SC_DELUGE].val4/100;
- else if(!flag&BF_SKILL && battle_get_attack_element(bl)==1)
- damage += damage*sc_data[SC_DELUGE].val4/100;
- }
-
- if(sc_data[SC_ENERGYCOAT].timer!=-1 && damage>0 && flag&BF_WEAPON){ // ƒGƒiƒW[ƒR[ƒg
- if(sd){
- if(sd->status.sp>0){
- int per = sd->status.sp * 5 / (sd->status.max_sp + 1);
- sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000;
- if( sd->status.sp < 0 ) sd->status.sp = 0;
- damage -= damage * ((per+1) * 6) / 100;
- clif_updatestatus(sd,SP_SP);
- }
- if(sd->status.sp<=0)
- skill_status_change_end( bl,SC_ENERGYCOAT,-1 );
- }
- else
- damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100;
- }
-
- if(sc_data[SC_KYRIE].timer!=-1 && damage > 0){ // ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“
- sc=&sc_data[SC_KYRIE];
- sc->val2-=damage;
- if(flag&BF_WEAPON){
- if(sc->val2>=0) damage=0;
- else damage=-sc->val2;
- }
- if((--sc->val3)<=0 || (sc->val2<=0) || skill_num == AL_HOLYLIGHT)
- skill_status_change_end(bl, SC_KYRIE, -1);
- }
-
- if(sc_data[SC_BASILICA].timer!=-1 && damage > 0){
- // ƒjƒ…[ƒ}
- damage=0;
- }
- if(sc_data[SC_LANDPROTECTOR].timer!=-1 && damage>0 && flag&BF_MAGIC){
- // ƒjƒ…[ƒ}
- damage=0;
- }
-
- if(sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 && flag&BF_WEAPON) {
- if(rand()%100 < sc_data[SC_AUTOGUARD].val2) {
- damage = 0;
- clif_skill_nodamage(bl,bl,CR_AUTOGUARD,sc_data[SC_AUTOGUARD].val1,1);
- if(sd)
- sd->canmove_tick = gettick() + 300;
- else if(md)
- md->canmove_tick = gettick() + 300;
- }
- }
-// -- moonsoul (chance to block attacks with new Lord Knight skill parrying)
-//
- if(sc_data[SC_PARRYING].timer != -1 && damage > 0 && flag&BF_WEAPON) {
- if(rand()%100 < sc_data[SC_PARRYING].val2) {
- damage = 0;
- clif_skill_nodamage(bl,bl,LK_PARRYING,sc_data[SC_PARRYING].val1,1);
- }
- }
- // ƒŠƒWƒFƒNƒgƒ\[ƒh
- if(sc_data[SC_REJECTSWORD].timer!=-1 && damage > 0 && flag&BF_WEAPON &&
- ((src->type==BL_PC && ((struct map_session_data *)src)->status.weapon == (1 || 2 || 3)) || src->type==BL_MOB )){
- if(rand()%100 < (15*sc_data[SC_REJECTSWORD].val1)){ //”½ŽËŠm—¦‚Í15*Lv
- damage = damage*50/100;
- battle_damage(bl,src,damage,0);
- //ƒ_ƒ[ƒW‚ð—^‚¦‚½‚Ì‚Í—Ç‚¢‚ñ‚¾‚ªA‚±‚±‚©‚ç‚Ç‚¤‚µ‚Ä•\Ž¦‚·‚é‚ñ‚¾‚©‚í‚©‚ñ‚Ë‚¥
- //ƒGƒtƒFƒNƒg‚à‚±‚ê‚Å‚¢‚¢‚Ì‚©‚í‚©‚ñ‚Ë‚¥
- clif_skill_nodamage(bl,bl,ST_REJECTSWORD,sc_data[SC_REJECTSWORD].val1,1);
- if((--sc_data[SC_REJECTSWORD].val2)<=0)
- skill_status_change_end(bl, SC_REJECTSWORD, -1);
- }
- }
- if(sc_data[SC_SPIDERWEB].timer!=-1 && damage > 0) // [Celest]
- if ((flag&BF_SKILL && skill_get_pl(skill_num)==3) ||
- (!flag&BF_SKILL && battle_get_attack_element(src)==3)) {
- damage<<=1;
- skill_status_change_end(bl, SC_SPIDERWEB, -1);
- }
-
- if(sc_data[SC_FOGWALL].timer != -1 && flag&BF_MAGIC)
- if(rand()%100 < sc_data[SC_FOGWALL].val2)
- damage = 0;
- }
-
- if(class == 1288 || class == 1287 || class == 1286 || class == 1285) {
-// if(class == 1288) {
- if(class == 1288 && flag&BF_SKILL)
- damage=0;
- if(src->type == BL_PC) {
- struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id);
- struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
- if(!((struct map_session_data *)src)->status.guild_id)
- damage=0;
- if(gc && agit_flag==0 && class != 1288) // guardians cannot be damaged during non-woe [Valaris]
- damage=0; // end woe check [Valaris]
- if(g == NULL)
- damage=0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
- else if((gc != NULL) && guild_isallied(g, gc))
- damage=0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(g && guild_checkskill(g,GD_APPROVAL) <= 0)
- damage=0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
- else if (battle_config.guild_max_castles != 0 && guild_checkcastles(g)>=battle_config.guild_max_castles)
- damage = 0; // [MouseJstr]
- }
- else damage = 0;
- }
-
- if(map[bl->m].flag.gvg && damage > 0) { //GvG
- if(flag&BF_WEAPON) {
- if(flag&BF_SHORT)
- damage=damage*battle_config.gvg_short_damage_rate/100;
- if(flag&BF_LONG)
- damage=damage*battle_config.gvg_long_damage_rate/100;
- }
- if(flag&BF_MAGIC)
- damage = damage*battle_config.gvg_magic_damage_rate/100;
- if(flag&BF_MISC)
- damage=damage*battle_config.gvg_misc_damage_rate/100;
- if(damage < 1) damage = 1;
- }
-
- if(battle_config.skill_min_damage || flag&BF_MISC) {
- if(div_ < 255) {
- if(damage > 0 && damage < div_)
- damage = div_;
- }
- else if(damage > 0 && damage < 3)
- damage = 3;
- }
-
- if( md!=NULL && md->hp>0 && damage > 0 ) // ”½Œ‚‚È‚Ç‚ÌMOBƒXƒLƒ‹”»’è
- mobskill_event(md,flag);
-
- return damage;
-}
-
-/*==========================================
- * C—ûƒ_ƒ[ƒW
- *------------------------------------------
- */
-int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type)
-{
- int damage,skill;
- int race=battle_get_race(target);
- int weapon;
- damage = 0;
-
- nullpo_retr(0, sd);
-
- // ƒf[ƒ‚ƒ“ƒxƒCƒ“(+3 ` +30) vs •sŽ€ or ˆ«–‚ (Ž€l‚ÍŠÜ‚ß‚È‚¢H)
- if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && (battle_check_undead(race,battle_get_elem_type(target)) || race==6) )
- damage += (skill*(int)(3+(sd->status.base_level+1)*0.05)); // submitted by orn
- //damage += (skill * 3);
-
- // ƒr[ƒXƒgƒxƒCƒ“(+4 ` +40) vs “®•¨ or ©’Ž
- if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (race==2 || race==4) )
- damage += (skill * 4);
-
- if(type == 0)
- weapon = sd->weapontype1;
- else
- weapon = sd->weapontype2;
- switch(weapon)
- {
- case 0x01: // ’ZŒ• (Updated By AppleGirl)
- case 0x02: // 1HS
- {
- // Œ•C—û(+4 ` +40) •ÐŽèŒ• ’ZŒ•ŠÜ‚Þ
- if((skill = pc_checkskill(sd,SM_SWORD)) > 0) {
- damage += (skill * 4);
- }
- break;
- }
- case 0x03: // 2HS
- {
- // —¼ŽèŒ•C—û(+4 ` +40) —¼ŽèŒ•
- if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) {
- damage += (skill * 4);
- }
- break;
- }
- case 0x04: // 1HL
- {
- // ‘„C—û(+4 ` +40,+5 ` +50) ‘„
- if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
- if(!pc_isriding(sd))
- damage += (skill * 4); // ƒyƒR‚Éæ‚Á‚Ä‚È‚¢
- else
- damage += (skill * 5); // ƒyƒR‚Éæ‚Á‚Ä‚é
- }
- break;
- }
- case 0x05: // 2HL
- {
- // ‘„C—û(+4 ` +40,+5 ` +50) ‘„
- if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
- if(!pc_isriding(sd))
- damage += (skill * 4); // ƒyƒR‚Éæ‚Á‚Ä‚È‚¢
- else
- damage += (skill * 5); // ƒyƒR‚Éæ‚Á‚Ä‚é
- }
- break;
- }
- case 0x06: // •ÐŽè•€
- {
- if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x07: // Axe by Tato
- {
- if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x08: // ƒƒCƒX
- {
- // ƒƒCƒXC—û(+3 ` +30) ƒƒCƒX
- if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x09: // ‚È‚µ?
- break;
- case 0x0a: // ñ
- break;
- case 0x0b: // ‹|
- break;
- case 0x00: // ‘fŽè
- case 0x0c: // Knuckles
- {
- // “SŒ(+3 ` +30) ‘fŽè,ƒiƒbƒNƒ‹
- if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0d: // Musical Instrument
- {
- // ŠyŠí‚Ì—ûK(+3 ` +30) ŠyŠí
- if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0e: // Dance Mastery
- {
- // Dance Lesson Skill Effect(+3 damage for every lvl = +30) •Ú
- if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x0f: // Book
- {
- // Advance Book Skill Effect(+3 damage for every lvl = +30) {
- if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) {
- damage += (skill * 3);
- }
- break;
- }
- case 0x10: // Katars
- {
- // ƒJƒ^[ƒ‹C—û(+3 ` +30) ƒJƒ^[ƒ‹
- if((skill = pc_checkskill(sd,AS_KATAR)) > 0) {
- //ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
- damage += (skill * 3);
- }
- break;
- }
- }
- damage = dmg + damage;
- return (damage);
-}
-
-static struct Damage battle_calc_pet_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct pet_data *pd = (struct pet_data *)src;
- struct mob_data *tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int luk,target_count = 1;
- int def1 = battle_get_def(target);
- int def2 = battle_get_def2(target);
- int t_vit = battle_get_vit(target);
- struct Damage wd;
- int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,dmg_lv=0;
- int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
- struct status_change *t_sc_data;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( target == NULL || pd == NULL ){ //src‚Í“à—e‚É’¼ÚG‚ê‚Ä‚¢‚È‚¢‚̂ŃXƒ‹[‚µ‚Ä‚Ý‚é
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- s_race=battle_get_race(src);
- s_ele=battle_get_attack_element(src);
-
- // ƒ^[ƒQƒbƒg
- if(target->type == BL_MOB)
- tmd=(struct mob_data *)target;
- else {
- memset(&wd,0,sizeof(wd));
- return wd;
- }
- t_race=battle_get_race( target );
- t_size=battle_get_size( target );
- t_mode=battle_get_mode( target );
- t_sc_data=battle_get_sc_data( target );
-
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = battle_get_flee(target);
- if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0)
- target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv);
- if(battle_config.agi_penaly_type > 0) {
- if(target_count >= battle_config.agi_penaly_count) {
- if(battle_config.agi_penaly_type == 1)
- flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
- else if(battle_config.agi_penaly_type == 2)
- flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
- if(flee < 1) flee = 1;
- }
- }
- hitrate=battle_get_hit(src) - flee + 80;
-
- type=0; // normal
- div_ = 1; // single attack
-
- luk=battle_get_luk(src);
-
- if(battle_config.pet_str)
- damage = battle_get_baseatk(src);
- else
- damage = 0;
-
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- atkmin = battle_get_matk1(src);
- atkmax = battle_get_matk2(src);
- }else{
- atkmin = battle_get_atk(src);
- atkmax = battle_get_atk2(src);
- }
- if(mob_db[pd->class].range>3 )
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
-
- if(atkmin > atkmax) atkmin = atkmax;
-
- cri = battle_get_critical(src);
- cri -= battle_get_luk(target) * 2; // luk/5*10 => target_luk*2 not target_luk*3
- if(battle_config.enemy_critical_rate != 100) {
- cri = cri*battle_config.enemy_critical_rate/100;
- if(cri < 1)
- cri = 1;
- }
- if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 )
- cri <<=1;
-
- if(skill_num == 0 && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri)
- {
- damage += atkmax;
- type = 0x0a;
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- damage = damage*(180+ 20*skill_lv)/100;
- div_=2;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- damage = damage*(75 + 5*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- damage = damage*150/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- hitrate = hitrate*(100+5*skill_lv)/100;
- div_=t_size+1;
- damage*=div_;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage2+=damage/2;
- if(skill_lv>6 && wflag==1) damage2+=damage/4;
- if(skill_lv>9 && wflag==1) damage2+=damage/8;
- if(skill_lv>6 && wflag==2) damage2+=damage/2;
- if(skill_lv>9 && wflag==2) damage2+=damage/4;
- if(skill_lv>9 && wflag==3) damage2+=damage/2;
- damage +=damage2;
- blewcount=0;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- damage = damage*(300+ 50*skill_lv)/100;
- div_=8;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- damage = (damage*150)/100;
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_=skill_get_num(skill_num,skill_lv);
- damage *= div_;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- div_= pd->skillduration; // [Valaris]
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- damage = damage*(300+ 40*skill_lv)/100;
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- div_=2;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- damage = damage * (100 + 50 * skill_lv) / 100;
- div_ = 1;
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000)
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * 8 + 250 + (skill_lv * 150);
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- div_=4;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- break;
- case DC_THROWARROW: // –‚¿
- damage = damage*(100+ 50 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- damage = damage*(100+ 50 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(100+ 60*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(100+ 60*skill_lv)/100;
- div_=skill_get_num(skill_num,skill_lv);
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(50+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- div_=5;
- if(target->type == BL_PC)
- ((struct map_session_data *)target)->canmove_tick = gettick() + 1000;
- else if(target->type == BL_MOB)
- ((struct mob_data *)target)->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- div_=9;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv)/100;
- break;
- }
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000 ) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
- if(battle_config.vit_penaly_type > 0) {
- if(target_count >= battle_config.vit_penaly_count) {
- if(battle_config.vit_penaly_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- }
- else if(battle_config.vit_penaly_type == 2) {
- def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if(battle_config.pet_defense_type) {
- damage = damage - (def1 * battle_config.pet_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 50;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- if(hitrate < 1000000)
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
-
- if(t_sc_data) {
- int cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
- if(cardfix != 100)
- damage=damage*cardfix/100;
- }
- if(damage < 0) damage = 0;
-
- // ‘® «‚Ì“K—p
- if(skill_num != 0 || s_ele != 0 || !battle_config.pet_attack_attr_none)
- damage=battle_attr_fix(damage, s_ele, battle_get_element(target) );
-
- if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, battle_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && rand()%1000 < battle_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
-// if(def1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if(skill_num != CR_GRANDCROSS)
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
-
- wd.damage=damage;
- wd.damage2=0;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=battle_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=battle_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
-
- return wd;
-}
-
-static struct Damage battle_calc_mob_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct map_session_data *tsd=NULL;
- struct mob_data* md=(struct mob_data *)src,*tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int luk,target_count = 1;
- int def1 = battle_get_def(target);
- int def2 = battle_get_def2(target);
- int t_vit = battle_get_vit(target);
- struct Damage wd;
- int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,skill,ac_flag = 0,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
- struct status_change *sc_data,*t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( src == NULL || target == NULL || md == NULL ){
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- s_race=battle_get_race(src);
- s_ele=battle_get_attack_element(src);
- sc_data=battle_get_sc_data(src);
- sc_count=battle_get_sc_count(src);
- option=battle_get_option(src);
- opt1=battle_get_opt1(src);
- opt2=battle_get_opt2(src);
-
- // ƒ^[ƒQƒbƒg
- if(target->type==BL_PC)
- tsd=(struct map_session_data *)target;
- else if(target->type==BL_MOB)
- tmd=(struct mob_data *)target;
- t_race=battle_get_race( target );
- t_size=battle_get_size( target );
- t_mode=battle_get_mode( target );
- t_sc_data=battle_get_sc_data( target );
-
- if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
- (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) {
- if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) {
- int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target);
- int dist = distance(src->x,src->y,target->x,target->y);
- if(dist <= 0 || map_check_dir(dir,t_dir) ) {
- memset(&wd,0,sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) {
- int range = battle_get_range(target);
- if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) ||
- (target->type == BL_MOB && range <= 3 && dist <= range+1) )
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd;
- }
- else ac_flag = 1;
- } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
- //memset(&wd,0,sizeof(wd));
- t_sc_data[SC_POISONREACT].val3 = 0;
- t_sc_data[SC_POISONREACT].val4 = 1;
- t_sc_data[SC_POISONREACT].val3 = src->id;
- return wd;
- }
- }
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = battle_get_flee(target);
- if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0)
- target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv);
- if(battle_config.agi_penaly_type > 0) {
- if(target_count >= battle_config.agi_penaly_count) {
- if(battle_config.agi_penaly_type == 1)
- flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
- else if(battle_config.agi_penaly_type == 2)
- flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
- if(flee < 1) flee = 1;
- }
- }
- hitrate=battle_get_hit(src) - flee + 80;
-
- type=0; // normal
- div_ = 1; // single attack
-
- luk=battle_get_luk(src);
-
- if(battle_config.enemy_str)
- damage = battle_get_baseatk(src);
- else
- damage = 0;
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- atkmin = battle_get_matk1(src);
- atkmax = battle_get_matk2(src);
- }else{
- atkmin = battle_get_atk(src);
- atkmax = battle_get_atk2(src);
- }
- if(mob_db[md->class].range>3 )
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
-
- if(atkmin > atkmax) atkmin = atkmax;
-
- if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
- atkmin=atkmax;
- }
-
- cri = battle_get_critical(src);
- cri -= battle_get_luk(target) * 3;
- if(battle_config.enemy_critical_rate != 100) {
- cri = cri*battle_config.enemy_critical_rate/100;
- if(cri < 1)
- cri = 1;
- }
- if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
- cri <<=1;
-
- if(ac_flag) cri = 1000;
-
- if(skill_num == KN_AUTOCOUNTER) {
- if(!(battle_config.monster_auto_counter_type&1))
- cri = 1000;
- else
- cri <<= 1;
- }
-
- if(tsd && tsd->critical_def)
- cri = cri * (100 - tsd->critical_def) / 100;
-
- if((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
- // “G‚Ì”»’è
- {
- damage += atkmax;
- type = 0x0a;
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
- if(sc_data[SC_OVERTHRUST].timer!=-1) // ƒI[ƒo[ƒgƒ‰ƒXƒg
- damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
- if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
- damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
- if(sc_data[SC_BERSERK].timer!=-1) // ƒo[ƒT[ƒN
- damage += damage*50/100;
- }
-
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- damage = damage*(180+ 20*skill_lv)/100;
- div_=2;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- damage = damage*(75 + 5*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- damage = damage*150/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- hitrate=hitrate*(100+5*skill_lv)/100;
- div_=t_size+1;
- damage*=div_;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage2+=damage/2;
- if(skill_lv>6 && wflag==1) damage2+=damage/4;
- if(skill_lv>9 && wflag==1) damage2+=damage/8;
- if(skill_lv>6 && wflag==2) damage2+=damage/2;
- if(skill_lv>9 && wflag==2) damage2+=damage/4;
- if(skill_lv>9 && wflag==3) damage2+=damage/2;
- damage +=damage2;
- blewcount=0;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case KN_AUTOCOUNTER:
- if(battle_config.monster_auto_counter_type&1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- damage = damage*(300+ 50*skill_lv)/100;
- div_=8;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- damage = (damage*150)/100;
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_=skill_get_num(skill_num,skill_lv);
- damage *= div_;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage*(100+25*(skill_lv-1))/100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- damage = damage*(300+ 40*skill_lv)/100;
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- div_=2;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- damage = damage * (100 + 50 * skill_lv) / 100;
- div_ = 1;
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000)
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * 8 + 250 + (skill_lv * 150);
- hitrate = 1000000;
- s_ele = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- div_=4;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- damage = damage*(100+ 50 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case DC_THROWARROW: // –‚¿
- damage = damage*(100+ 50 * skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(100+ 20*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(100+ 60*skill_lv)/100;
- div_=skill_get_num(skill_num,skill_lv);
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(50+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- div_=5;
- if(tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if(tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- div_=9;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv)/100;
- break;
- }
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
- if(battle_config.vit_penaly_type > 0) {
- if(target_count >= battle_config.vit_penaly_count) {
- if(battle_config.vit_penaly_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- }
- else if(battle_config.vit_penaly_type == 2) {
- def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- if(battle_check_undead(s_race,battle_get_elem_type(src)) || s_race==6)
- if(tsd && (skill=pc_checkskill(tsd,AL_DP)) > 0 )
- t_def += skill* (int) (3 + (tsd->status.base_level+1)*0.04); // submitted by orn
- //t_def += skill*3;
-
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if(battle_config.monster_defense_type) {
- damage = damage - (def1 * battle_config.monster_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 50;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- if(hitrate < 1000000)
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
- if(tsd){
- int cardfix=100,i;
- cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- if(mob_db[md->class].mode & 0x20)
- cardfix=cardfix*(100-tsd->subrace[10])/100;
- else
- cardfix=cardfix*(100-tsd->subrace[11])/100;
- for(i=0;i<tsd->add_def_class_count;i++) {
- if(tsd->add_def_classid[i] == md->class) {
- cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
- break;
- }
- }
- if(flag&BF_LONG)
- cardfix=cardfix*(100-tsd->long_attack_def_rate)/100;
- if(flag&BF_SHORT)
- cardfix=cardfix*(100-tsd->near_attack_def_rate)/100;
- damage=damage*cardfix/100;
- }
- if(t_sc_data) {
- int cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
- if(cardfix != 100)
- damage=damage*cardfix/100;
- }
- if(t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒVƒƒƒ“ƒvƒeƒBƒI
- if(!map[target->m].flag.pvp)
- damage=damage/3;
- else
- damage=damage/2;
- }
-
- if(damage < 0) damage = 0;
-
- // ‘® «‚Ì“K—p
- if (!((battle_config.mob_ghostring_fix == 1) &&
- (battle_get_element(target) == 8) &&
- (target->type==BL_PC))) // [MouseJstr]
- if(skill_num != 0 || s_ele != 0 || !battle_config.mob_attack_attr_none)
- damage=battle_attr_fix(damage, s_ele, battle_get_element(target) );
-
- if(sc_data && sc_data[SC_AURABLADE].timer!=-1) /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
- damage += sc_data[SC_AURABLADE].val1 * 10;
- if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, battle_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && rand()%1000 < battle_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
-
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && rand()%1000 < battle_get_flee2(target) ){
- damage=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
-// if(def1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if( tsd && tsd->special_state.no_weapon_damage)
- damage = 0;
-
- if(skill_num != CR_GRANDCROSS)
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
-
- wd.damage=damage;
- wd.damage2=0;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=battle_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=battle_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
- return wd;
-}
-/*
- * =========================================================================
- * PC‚Ì•Ší‚É‚æ‚éUŒ‚
- *-------------------------------------------------------------------------
- */
-static struct Damage battle_calc_pc_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct map_session_data *sd=(struct map_session_data *)src,*tsd=NULL;
- struct mob_data *tmd=NULL;
- int hitrate,flee,cri = 0,atkmin,atkmax;
- int dex,luk,target_count = 1;
- int def1 = battle_get_def(target);
- int def2 = battle_get_def2(target);
- int t_vit = battle_get_vit(target);
- struct Damage wd;
- int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
- int flag,skill,dmg_lv = 0;
- int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0;
- struct status_change *sc_data,*t_sc_data;
- short *sc_count;
- short *option, *opt1, *opt2;
- int atkmax_=0, atkmin_=0, s_ele_; //“ñ“—¬—p
- int watk,watk_,cardfix,t_ele;
- int da=0,i,t_class,ac_flag = 0;
- int idef_flag=0,idef_flag_=0;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( src == NULL || target == NULL || sd == NULL ){
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
-
- // ƒAƒ^ƒbƒJ[
- s_race=battle_get_race(src); //Ží‘°
- s_ele=battle_get_attack_element(src); //‘®«
- s_ele_=battle_get_attack_element2(src); //¶Žè‘®«
- sc_data=battle_get_sc_data(src); //ƒXƒe[ƒ^ƒXˆÙí
- sc_count=battle_get_sc_count(src); //ƒXƒe[ƒ^ƒXˆÙí‚Ì”
- option=battle_get_option(src); //‘é‚Æ‚©ƒyƒR‚Æ‚©ƒJ[ƒg‚Æ‚©
- opt1=battle_get_opt1(src); //Ή»A“€Œ‹AƒXƒ^ƒ“A‡–°AˆÃˆÅ
- opt2=battle_get_opt2(src); //“ÅAŽô‚¢A’¾–ÙAˆÃˆÅH
-
- if(skill_num != CR_GRANDCROSS) //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚¢‚È‚ç
- sd->state.attack_type = BF_WEAPON; //UŒ‚ƒ^ƒCƒv‚Í•ŠíUŒ‚
-
- // ƒ^[ƒQƒbƒg
- if(target->type==BL_PC) //‘ÎÛ‚ªPC‚È‚ç
- tsd=(struct map_session_data *)target; //tsd‚É‘ã“ü(tmd‚ÍNULL)
- else if(target->type==BL_MOB) //‘ÎÛ‚ªMob‚È‚ç
- tmd=(struct mob_data *)target; //tmd‚É‘ã“ü(tsd‚ÍNULL)
- t_race=battle_get_race( target ); //‘ÎÛ‚ÌŽí‘°
- t_ele=battle_get_elem_type(target); //‘ÎÛ‚Ì‘®«
- t_size=battle_get_size( target ); //‘Îۂ̃TƒCƒY
- t_mode=battle_get_mode( target ); //‘ÎÛ‚ÌMode
- t_sc_data=battle_get_sc_data( target ); //‘Îۂ̃Xƒe[ƒ^ƒXˆÙí
-
-//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚©‚ç
- if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
- (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) {
- if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) { //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚­A‘ÎÛ‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô‚Ìê‡
- int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target);
- int dist = distance(src->x,src->y,target->x,target->y);
- if(dist <= 0 || map_check_dir(dir,t_dir) ) { //‘ÎÛ‚Æ‚Ì‹——£‚ª0ˆÈ‰ºA‚Ü‚½‚Í‘Îۂ̳–ÊH
- memset(&wd,0,sizeof(wd));
- t_sc_data[SC_AUTOCOUNTER].val3 = 0;
- t_sc_data[SC_AUTOCOUNTER].val4 = 1;
- if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) { //Ž©•ª‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô
- int range = battle_get_range(target);
- if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) || //‘ÎÛ‚ªPC‚Å•Ší‚ª‹|–î‚Å‚È‚­ŽË’ö“à
- (target->type == BL_MOB && range <= 3 && dist <= range+1) ) //‚Ü‚½‚Í‘ÎÛ‚ªMob‚ÅŽË’ö‚ª3ˆÈ‰º‚ÅŽË’ö“à
- t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
- }
- return wd; //ƒ_ƒ[ƒW\‘¢‘Ì‚ð•Ô‚µ‚ÄI—¹
- }
- else ac_flag = 1;
- } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
- //memset(&wd,0,sizeof(wd));
- t_sc_data[SC_POISONREACT].val3 = 0;
- t_sc_data[SC_POISONREACT].val4 = 1;
- t_sc_data[SC_POISONREACT].val3 = src->id;
- return wd;
- }
- }
-//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚Ü‚Å
-
- flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
-
- // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
- flee = battle_get_flee(target);
- if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGIAVITƒyƒiƒ‹ƒeƒBݒ肪—LŒø
- target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); //‘ÎÛ‚Ì”‚ðŽZo
- if(battle_config.agi_penaly_type > 0) {
- if(target_count >= battle_config.agi_penaly_count) { //ƒyƒiƒ‹ƒeƒBÝ’è‚æ‚è‘ÎÛ‚ª‘½‚¢
- if(battle_config.agi_penaly_type == 1) //‰ñ”𗦂ªagi_penaly_num%‚¸‚ÂŒ¸­
- flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
- else if(battle_config.agi_penaly_type == 2) //‰ñ”𗦂ªagi_penaly_num•ªŒ¸­
- flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
- if(flee < 1) flee = 1; //‰ñ”𗦂ÍÅ’á‚Å‚à1
- }
- }
- hitrate=battle_get_hit(src) - flee + 80; //–½’†—¦ŒvŽZ
-
- type=0; // normal
- div_ = 1; // single attack
-
- dex=battle_get_dex(src); //DEX
- luk=battle_get_luk(src); //LUK
- watk = battle_get_atk(src); //ATK
- watk_ = battle_get_atk_(src); //ATK¶Žè
-
- if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
- damage = damage2 = battle_get_matk1(src); //damega,damega2‰“oêAbase_atk‚̎擾
- }else{
- damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2‰“oêAbase_atk‚̎擾
- }
- atkmin = atkmin_ = dex; //Å’áATK‚ÍDEX‚ʼnŠú‰»H
- sd->state.arrow_atk = 0; //arrow_atk‰Šú‰»
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]])
- atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[9]]->wlv*20)/100;
- if(sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]])
- atkmin_ = atkmin_*(80 + sd->inventory_data[sd->equip_index[8]]->wlv*20)/100;
- if(sd->status.weapon == 11) { //•Ší‚ª‹|–î‚Ìê‡
- atkmin = watk * ((atkmin<watk)? atkmin:watk)/100; //‹|—pÅ’áATKŒvŽZ
- flag=(flag&~BF_RANGEMASK)|BF_LONG; //‰“‹——£UŒ‚ƒtƒ‰ƒO‚ð—LŒø
- if(sd->arrow_ele > 0) //‘®«–î‚È‚ç‘®«‚ð–î‚Ì‘®«‚É•ÏX
- s_ele = sd->arrow_ele;
- sd->state.arrow_atk = 1; //arrow_atk—LŒø‰»
- }
-
- // ƒTƒCƒYC³
- // ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚ÅUŒ‚‚µ‚½ê‡‚Í’†Œ^‚̃TƒCƒYC³‚ð100‚É‚·‚é
- // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“,ƒhƒŒƒCƒNC
- if(((sd->special_state.no_sizefix) || (pc_isriding(sd) && (sd->status.weapon==4 || sd->status.weapon==5) && t_size==1) || skill_num == MO_EXTREMITYFIST)){ //ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚Å’†Œ^‚ðUŒ‚
- atkmax = watk;
- atkmax_ = watk_;
- } else {
- atkmax = (watk * sd->atkmods[ t_size ]) / 100;
- atkmin = (atkmin * sd->atkmods[ t_size ]) / 100;
- atkmax_ = (watk_ * sd->atkmods_[ t_size ]) / 100;
- atkmin_ = (atkmin_ * sd->atkmods[ t_size ]) / 100;
- }
- if( (sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer!=-1) || (sd->special_state.no_sizefix)) { // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ || ƒhƒŒƒCƒNƒJ[ƒh
- atkmax = watk;
- atkmax_ = watk_;
- }
-
- if(atkmin > atkmax && !(sd->state.arrow_atk)) atkmin = atkmax; //‹|‚ÍŒႪã‰ñ‚éꇂ ‚è
- if(atkmin_ > atkmax_) atkmin_ = atkmax_;
-
- if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
- atkmin=atkmax;
- atkmin_=atkmax_;
- }
-
- //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN”»’è
- if(sd->weapontype1 == 0x01) {
- if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,TF_DOUBLE)) > 0)
- da = (rand()%100 < (skill*5)) ? 1:0;
- }
-
- //ŽO’i¶
- if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) {
- da = (rand()%100 < (30 - skill)) ? 2:0;
- }
-
- if(sd->double_rate > 0 && da == 0 && skill_num == 0 && skill_lv >= 0)
- da = (rand()%100 < sd->double_rate) ? 1:0;
-
- // ‰ß踘Bƒ{[ƒiƒX
- if(sd->overrefine>0 )
- damage+=(rand()%sd->overrefine)+1;
- if(sd->overrefine_>0 )
- damage2+=(rand()%sd->overrefine_)+1;
-
- if(da == 0){ //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
- // ƒNƒŠƒeƒBƒJƒ‹ŒvŽZ
- cri = battle_get_critical(src);
-
- if(sd->state.arrow_atk)
- cri += sd->arrow_cri;
- if(sd->status.weapon == 16)
- // ƒJƒ^[ƒ‹‚Ìê‡AƒNƒŠƒeƒBƒJƒ‹‚ð”{‚É
- cri <<=1;
- cri -= battle_get_luk(target) * 3;
- if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
- cri <<=1;
- if(ac_flag) cri = 1000;
-
- if(skill_num == KN_AUTOCOUNTER) {
- if(!(battle_config.pc_auto_counter_type&1))
- cri = 1000;
- else
- cri <<= 1;
- }
-
- if(skill_num == SN_SHARPSHOOTING)
- cri += 200;
- }
-
- if(tsd && tsd->critical_def)
- cri = cri * (100-tsd->critical_def) / 100;
-
- if(da == 0 && (skill_num==0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
- (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
- {
- damage += atkmax;
- damage2 += atkmax_;
- if(sd->atk_rate != 100) {
- damage = (damage * sd->atk_rate)/100;
- damage2 = (damage2 * sd->atk_rate)/100;
- }
- if(sd->state.arrow_atk)
- damage += sd->arrow_atk;
- type = 0x0a;
-
-/* if(def1 < 1000000) {
- if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if(t_mode & 0x20) {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }*/
- }
- else {
- int vitbonusmax;
-
- if(atkmax > atkmin)
- damage += atkmin + rand() % (atkmax-atkmin + 1);
- else
- damage += atkmin ;
- if(atkmax_ > atkmin_)
- damage2 += atkmin_ + rand() % (atkmax_-atkmin_ + 1);
- else
- damage2 += atkmin_ ;
- if(sd->atk_rate != 100) {
- damage = (damage * sd->atk_rate)/100;
- damage2 = (damage2 * sd->atk_rate)/100;
- }
-
- if(sd->state.arrow_atk) {
- if(sd->arrow_atk > 0)
- damage += rand()%(sd->arrow_atk+1);
- hitrate += sd->arrow_hit;
- }
-
- if(skill_num != MO_INVESTIGATE && def1 < 1000000) {
- if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- if(t_mode & 0x20) {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- else {
- if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
- damage = (damage * (def1 + def2))/100;
- idef_flag = 1;
- }
- if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
- damage2 = (damage2 * (def1 + def2))/100;
- idef_flag_ = 1;
- }
- }
- }
-
- // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
- // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
- // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
- // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
- // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
- // ƒ\ƒjƒbƒNƒuƒ[
- if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
- if(sc_data[SC_OVERTHRUST].timer!=-1){ // ƒI[ƒo[ƒgƒ‰ƒXƒg
- damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
- damage2 += damage2*(5*sc_data[SC_OVERTHRUST].val1)/100;
- }
- if(sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹[ƒTƒCƒg
- damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
- damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100;
- }
- if(sc_data[SC_BERSERK].timer!=-1){ // ƒo[ƒT[ƒN
- damage += damage*50/100;
- damage2 += damage2*50/100;
- }
- }
-
- if(skill_num>0){
- int i;
- if( (i=skill_get_pl(skill_num))>0 )
- s_ele=s_ele_=i;
-
- flag=(flag&~BF_SKILLMASK)|BF_SKILL;
- switch( skill_num ){
- case SM_BASH: // ƒoƒbƒVƒ…
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- hitrate = (hitrate*(100+5*skill_lv))/100;
- break;
- case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
- damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
- damage2 = damage2*(5*skill_lv +(wflag)?65:115 )/100;
- break;
- case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- break;
- case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(180+ 20*skill_lv)/100;
- damage2 = damage2*(180+ 20*skill_lv)/100;
- div_=2;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(75 + 5*skill_lv)/100;
- damage2 = damage2*(75 + 5*skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*150/100;
- damage2 = damage2*150/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case KN_PIERCE: // ƒsƒA[ƒX
- damage = damage*(100+ 10*skill_lv)/100;
- damage2 = damage2*(100+ 10*skill_lv)/100;
- hitrate=hitrate*(100+5*skill_lv)/100;
- div_=t_size+1;
- damage*=div_;
- damage2*=div_;
- break;
- case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
- damage = damage*(100+ 15*skill_lv)/100;
- damage2 = damage2*(100+ 15*skill_lv)/100;
- break;
- case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- if(skill_lv>3 && wflag==1) damage3+=damage/2;
- if(skill_lv>6 && wflag==1) damage3+=damage/4;
- if(skill_lv>9 && wflag==1) damage3+=damage/8;
- if(skill_lv>6 && wflag==2) damage3+=damage/2;
- if(skill_lv>9 && wflag==2) damage3+=damage/4;
- if(skill_lv>9 && wflag==3) damage3+=damage/2;
- damage +=damage3;
- if(skill_lv>3 && wflag==1) damage4+=damage2/2;
- if(skill_lv>6 && wflag==1) damage4+=damage2/4;
- if(skill_lv>9 && wflag==1) damage4+=damage2/8;
- if(skill_lv>6 && wflag==2) damage4+=damage2/2;
- if(skill_lv>9 && wflag==2) damage4+=damage2/4;
- if(skill_lv>9 && wflag==3) damage4+=damage2/2;
- damage2 +=damage4;
- blewcount=0;
- break;
- case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
- damage = damage*(100+ 50*skill_lv)/100;
- damage2 = damage2*(100+ 50*skill_lv)/100;
- blewcount=0;
- break;
- case KN_AUTOCOUNTER:
- if(battle_config.pc_auto_counter_type&1)
- hitrate += 20;
- else
- hitrate = 1000000;
- flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
- break;
- case AS_GRIMTOOTH:
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
- hitrate+=30; // hitrate +30, thanks to midas
- damage = damage*(300+ 50*skill_lv)/100;
- damage2 = damage2*(300+ 50*skill_lv)/100;
- div_=8;
- break;
- case TF_SPRINKLESAND: // »‚Ü‚«
- damage = damage*125/100;
- damage2 = damage2*125/100;
- break;
- case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
- if(sd->cart_max_weight > 0 && sd->cart_weight > 0) {
- damage = (damage*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
- damage2 = (damage2*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
- }
- else {
- damage = (damage*150)/100;
- damage2 = (damage2*150)/100;
- }
- break;
- // ˆÈ‰ºMOB
- case NPC_COMBOATTACK: // ‘½’iUŒ‚
- div_=skill_get_num(skill_num,skill_lv);
- damage *= div_;
- damage2 *= div_;
- break;
- case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
- damage = damage*(50+rand()%150)/100;
- damage2 = damage2*(50+rand()%150)/100;
- break;
- // ‘®«UŒ‚i“K“–j
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- damage = damage*(100+25*skill_lv)/100;
- damage2 = damage2*(100+25*skill_lv)/100;
- break;
- case NPC_GUIDEDATTACK:
- hitrate = 1000000;
- break;
- case NPC_RANGEATTACK:
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- break;
- case NPC_PIERCINGATT:
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- break;
- case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
- if(battle_config.backstab_bow_penalty == 1 && sd->status.weapon == 11){
- damage = (damage*(300+ 40*skill_lv)/100)/2;
- damage2 = (damage2*(300+ 40*skill_lv)/100)/2;
- }else{
- damage = damage*(300+ 40*skill_lv)/100;
- damage2 = damage2*(300+ 40*skill_lv)/100;
- }
- hitrate = 1000000;
- break;
- case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- break;
- case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_SHORT;
- s_ele = 0;
- break;
- case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
- damage = damage*(100+ 30*skill_lv)/100;
- damage2 = damage2*(100+ 30*skill_lv)/100;
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- s_ele = 0;
- break;
- case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
- damage = damage*(100+ 35*skill_lv)/100;
- damage2 = damage2*(100+ 35*skill_lv)/100;
- div_=2;
- break;
- case CR_GRANDCROSS:
- hitrate= 1000000;
- break;
- case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case MO_FINGEROFFENSIVE: //Žw’e
- if(battle_config.finger_offensive_type == 0) {
- damage = damage * (100 + 50 * skill_lv) / 100 * sd->spiritball_old;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100 * sd->spiritball_old;
- div_ = sd->spiritball_old;
- }
- else {
- damage = damage * (100 + 50 * skill_lv) / 100;
- damage2 = damage2 * (100 + 50 * skill_lv) / 100;
- div_ = 1;
- }
- break;
- case MO_INVESTIGATE: // ”­ ™¤
- if(def1 < 1000000) {
- damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
- damage2 = damage2*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
- }
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- damage = damage * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
- damage2 = damage2 * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
- sd->status.sp = 0;
- clif_updatestatus(sd,SP_SP);
- hitrate = 1000000;
- s_ele = 0;
- s_ele_ = 0;
- break;
- case MO_CHAINCOMBO: // ˜A‘Ŷ
- damage = damage*(150+ 50*skill_lv)/100;
- damage2 = damage2*(150+ 50*skill_lv)/100;
- div_=4;
- break;
- case MO_COMBOFINISH: // –Ò—´Œ
- damage = damage*(240+ 60*skill_lv)/100;
- damage2 = damage2*(240+ 60*skill_lv)/100;
- break;
- case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(100+ 50 * skill_lv)/100;
- damage2 = damage2*(100+ 50 * skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case DC_THROWARROW: // –‚¿
- if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
- int arr = rand()%(sd->arrow_atk+1);
- damage += arr;
- damage2 += arr;
- }
- damage = damage*(100+ 50 * skill_lv)/100;
- damage2 = damage2*(100+ 50 * skill_lv)/100;
- if(sd->arrow_ele > 0) {
- s_ele = sd->arrow_ele;
- s_ele_ = sd->arrow_ele;
- }
- flag=(flag&~BF_RANGEMASK)|BF_LONG;
- sd->state.arrow_atk = 1;
- break;
- case CH_TIGERFIST: // •šŒÕŒ
- damage = damage*(100+ 20*skill_lv)/100;
- damage2 = damage2*(100+ 20*skill_lv)/100;
- break;
- case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
- damage = damage*(100+ 60*skill_lv)/100;
- damage2 = damage2*(100+ 60*skill_lv)/100;
- div_=skill_get_num(skill_num,skill_lv);
- break;
- case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
- damage = damage*(50+ 100*skill_lv)/100;
- damage2 = damage2*(50+ 100*skill_lv)/100;
- break;
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- damage2 = damage2*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
- div_=5;
- if(tsd)
- tsd->canmove_tick = gettick() + 1000;
- else if(tmd)
- tmd->canmove_tick = gettick() + 1000;
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- damage = damage*(100+ 40*skill_lv)/100;
- damage2 = damage2*(100+ 40*skill_lv)/100;
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
- damage = damage*(50+ 10*skill_lv)/100;
- damage2 = damage2*(50+ 10*skill_lv)/100;
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- damage = damage*(40+ 40*skill_lv)/100;
- damage2 = damage2*(40+ 40*skill_lv)/100;
- break;
- case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
- damage += damage*(30*skill_lv)/100;
- damage2 += damage2*(30*skill_lv)/100;
- break;
- case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
- damage = damage*(200+100*skill_lv)/100;
- damage2 = damage2*(200+100*skill_lv)/100;
- div_=9;
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
- damage2 = damage2*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
- break;
- case PA_SACRIFICE:
- if(sd){
- int hp, mhp, damage3;
- hp = battle_get_hp(src);
- mhp = battle_get_max_hp(src);
- damage3 = mhp*9/100;
- damage = damage*damage3*(90+10*skill_lv)/10000;
- damage2 = damage2*damage3*(90+10*skill_lv)/10000;
- }
- break;
- case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
- if(sd){
- int damage3;
- int mdef1=battle_get_mdef(target);
- int mdef2=battle_get_mdef2(target);
- int imdef_flag=0;
-
- damage = ((damage * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2;
- damage2 = ((damage2 * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2;
- damage3 = damage;
- hitrate = 1000000;
-
- if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
- imdef_flag = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_mdef_race & (1<<10))
- imdef_flag = 1;
- }
- else {
- if(sd->ignore_mdef_race & (1<<11))
- imdef_flag = 1;
- }
- if(!imdef_flag){
- if(battle_config.magic_defense_type) {
- damage3 = damage3 - (mdef1 * battle_config.magic_defense_type) - mdef2;
- }
- else{
- damage3 = (damage3*(100-mdef1))/100 - mdef2;
- }
- }
-
- if(damage3<1)
- damage3=1;
-
- damage3=battle_attr_fix(damage2,s_ele_, battle_get_element(target) );
- }
- break;
- }
- }
- if(da == 2) { //ŽO’i¶‚ª”­“®‚µ‚Ä‚¢‚é‚©
- type = 0x08;
- div_ = 255; //ŽO’i¶—p‚Éc
- damage = damage * (100 + 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100;
- }
-
- if( skill_num!=NPC_CRITICALSLASH ){
- // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
- // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
- if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT–³Ž‹
- int t_def;
- target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
- if(battle_config.vit_penaly_type > 0) {
- if(target_count >= battle_config.vit_penaly_count) {
- if(battle_config.vit_penaly_type == 1) {
- def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
- }
- else if(battle_config.vit_penaly_type == 2) {
- def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
- }
- if(def1 < 0) def1 = 0;
- if(def2 < 1) def2 = 1;
- if(t_vit < 1) t_vit = 1;
- }
- }
- t_def = def2*8/10;
- vitbonusmax = (t_vit/20)*(t_vit/20)-1;
- if(sd->ignore_def_ele & (1<<t_ele) || sd->ignore_def_race & (1<<t_race))
- idef_flag = 1;
- if(sd->ignore_def_ele_ & (1<<t_ele) || sd->ignore_def_race_ & (1<<t_race))
- idef_flag_ = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_def_race & (1<<10))
- idef_flag = 1;
- if(sd->ignore_def_race_ & (1<<10))
- idef_flag_ = 1;
- }
- else {
- if(sd->ignore_def_race & (1<<11))
- idef_flag = 1;
- if(sd->ignore_def_race_ & (1<<11))
- idef_flag_ = 1;
- }
-
- if(!idef_flag){
- if(battle_config.player_defense_type) {
- damage = damage - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- if(!idef_flag_){
- if(battle_config.player_defense_type) {
- damage2 = damage2 - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- else{
- damage2 = damage2 * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
- }
- }
- }
- }
- }
- // ¸˜Bƒ_ƒ[ƒW‚̒ljÁ
- if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT–³Ž‹
- damage += battle_get_atk2(src);
- damage2 += battle_get_atk_2(src);
- }
- if(skill_num == CR_SHIELDBOOMERANG) {
- if(sd->equip_index[8] >= 0) {
- int index = sd->equip_index[8];
- if(sd->inventory_data[index] && sd->inventory_data[index]->type == 5) {
- damage += sd->inventory_data[index]->weight/10;
- damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1);
- }
- }
- }
- if(skill_num == LK_SPIRALPIERCE) { /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
- if(sd->equip_index[9] >= 0) { //d—ʂŒljÁƒ_ƒ[ƒW‚炵‚¢‚̂ŃV[ƒ‹ƒhƒu[ƒƒ‰ƒ“‚ðŽQl‚ɒljÁ
- int index = sd->equip_index[9];
- if(sd->inventory_data[index] && sd->inventory_data[index]->type == 4) {
- damage += (int)(double)(sd->inventory_data[index]->weight*(0.8*skill_lv*4/10));
- damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1);
- }
- }
- }
-
- // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
- if(damage<1) damage=1;
- if(damage2<1) damage2=1;
-
- // ƒXƒLƒ‹C³‚QiC—ûŒnj
- // C—ûƒ_ƒ[ƒW(‰EŽè‚Ì‚Ý) ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
- if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != CR_GRANDCROSS) { //C—ûƒ_ƒ[ƒW–³Ž‹
- damage = battle_addmastery(sd,target,damage,0);
- damage2 = battle_addmastery(sd,target,damage2,1);
- }
-
- if(sd->perfect_hit > 0) {
- if(rand()%100 < sd->perfect_hit)
- hitrate = 1000000;
- }
-
- // ‰ñ”ðC³
- if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- hitrate -= 50;
- if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
- t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
- t_sc_data[SC_FREEZE].timer!=-1 ||
- (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
- hitrate = 1000000;
- }
- hitrate = (hitrate<5)?5:hitrate;
- if(type == 0 && rand()%100 >= hitrate) {
- damage = damage2 = 0;
- dmg_lv = ATK_FLEE;
- } else {
- dmg_lv = ATK_DEF;
- }
-
- // ƒXƒLƒ‹C³‚Ri•ŠíŒ¤‹†j
- if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) {
- damage+= skill*2;
- damage2+= skill*2;
- }
- //Advanced Katar Research by zanetheinsane
- if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){
- if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
- damage += (damage*((skill*2)+10)) / 100 ;
- }
- }
-
-//ƒXƒLƒ‹‚É‚æ‚éƒ_ƒ[ƒW•â³‚±‚±‚Ü‚Å
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—‚±‚±‚©‚ç
- cardfix=100;
- if(!sd->state.arrow_atk) { //‹|–îˆÈŠO
- if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³
- cardfix=cardfix*(100+sd->addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³
- cardfix=cardfix*(100+sd->addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³
- }
- else {
- cardfix=cardfix*(100+sd->addrace[t_race]+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addele[t_ele]+sd->addele_[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addsize[t_size]+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- }
- }
- else { //‹|–î
- cardfix=cardfix*(100+sd->addrace[t_race]+sd->arrow_addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addele[t_ele]+sd->arrow_addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- cardfix=cardfix*(100+sd->addsize[t_size]+sd->arrow_addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- }
- if(t_mode & 0x20) { //ƒ{ƒX
- if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO‚È‚ç
- if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
- else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
- cardfix=cardfix*(100+sd->addrace[10]+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else //‹|–îUŒ‚
- cardfix=cardfix*(100+sd->addrace[10]+sd->arrow_addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else { //ƒ{ƒX‚¶‚á‚È‚¢
- if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO
- if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
- else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
- cardfix=cardfix*(100+sd->addrace[11]+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
- }
- else
- cardfix=cardfix*(100+sd->addrace[11]+sd->arrow_addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
- }
- //“Á’èClass—p•â³ˆ—(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- t_class = battle_get_class(target);
- for(i=0;i<sd->add_damage_class_count;i++) {
- if(sd->add_damage_classid[i] == t_class) {
- cardfix=cardfix*(100+sd->add_damage_classrate[i])/100;
- break;
- }
- }
- if(skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix)
- damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒW‘‰Á
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—‚±‚±‚Ü‚Å
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—(¶Žè)‚±‚±‚©‚ç
- cardfix=100;
- if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
- cardfix=cardfix*(100+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- cardfix=cardfix*(100+sd->addele_[t_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- cardfix=cardfix*(100+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
- if(t_mode & 0x20) //ƒ{ƒX
- cardfix=cardfix*(100+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
- else
- cardfix=cardfix*(100+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
- }
- //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- for(i=0;i<sd->add_damage_class_count_;i++) {
- if(sd->add_damage_classid_[i] == t_class) {
- cardfix=cardfix*(100+sd->add_damage_classrate_[i])/100;
- break;
- }
- }
- if(skill_num != CR_GRANDCROSS) damage2=damage2*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒW‘‰Á
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—(¶Žè)‚±‚±‚Ü‚Å
-
-// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
- if(skill_num == ASC_BREAKER)
- damage3 = damage3 * cardfix / 100;
-
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚©‚ç
- if(tsd){ //‘ÎÛ‚ªPC‚Ìê‡
- cardfix=100;
- cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- if(battle_get_mode(src) & 0x20)
- cardfix=cardfix*(100-tsd->subrace[10])/100; //ƒ{ƒX‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
- else
- cardfix=cardfix*(100-tsd->subrace[11])/100; //ƒ{ƒXˆÈŠO‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
- //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
- for(i=0;i<tsd->add_def_class_count;i++) {
- if(tsd->add_def_classid[i] == sd->status.class) {
- cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
- break;
- }
- }
- if(flag&BF_LONG)
- cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; //‰“‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ƒzƒ‹ƒ“C‚Æ‚©)
- if(flag&BF_SHORT)
- cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; //‹ß‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ŠY“––³‚µH)
- damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
- damage2=damage2*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
- }
-//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚Ü‚Å
-
-//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚©‚ç
- if(t_sc_data) {
- cardfix=100;
- if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) //ƒfƒBƒtƒFƒ“ƒ_[ó‘Ԃʼn“‹——£UŒ‚
- cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; //ƒfƒBƒtƒFƒ“ƒ_[‚É‚æ‚錸Š
- if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
- cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
- if(cardfix != 100) {
- damage=damage*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
- damage2=damage2*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
- }
- if(t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒXƒ€ƒvƒeƒBƒI
- if(!map[target->m].flag.pvp){
- damage=damage/3;
- damage2=damage2/3;
- }else{
- damage=damage/2;
- damage2=damage2/2;
- }
- }
- }
-//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚Ü‚Å
-
- if(damage < 0) damage = 0;
- if(damage2 < 0) damage2 = 0;
-
- // ‘® «‚Ì“K—p
- damage=battle_attr_fix(damage,s_ele, battle_get_element(target) );
- damage2=battle_attr_fix(damage2,s_ele_, battle_get_element(target) );
-
- // ¯‚Ì‚©‚¯‚çA‹C‹…‚Ì“K—p
- damage += sd->star;
- damage2 += sd->star_;
- damage += sd->spiritball*3;
- damage2 += sd->spiritball*3;
-
- if(sc_data && sc_data[SC_AURABLADE].timer!=-1){ /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
- damage += sc_data[SC_AURABLADE].val1 * 10;
- damage2 += sc_data[SC_AURABLADE].val1 * 10;
- }
- if(skill_num==PA_PRESSURE){ /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
- damage = 500+300*skill_lv;
- damage2 = 500+300*skill_lv;
- }
-
- // >“ñ“—¬‚̶‰Eƒ_ƒ[ƒWŒvŽZ’N‚©‚â‚Á‚Ä‚­‚ê‚¥‚¥‚¥‚¥‚¦‚¦‚¦I
- // >map_session_data ‚ɶŽèƒ_ƒ[ƒW(atk,atk2)’ljÁ‚µ‚Ä
- // >pc_calcstatus()‚Å‚â‚é‚ׂ«‚©‚ÈH
- // map_session_data ‚ɶŽè•Ší(atk,atk2,ele,star,atkmods)’ljÁ‚µ‚Ä
- // pc_calcstatus()‚Ńf[ƒ^‚ð“ü—Í‚µ‚Ä‚¢‚Ü‚·
-
- //¶Žè‚Ì‚Ý•Ší‘•”õ
- if(sd->weapontype1 == 0 && sd->weapontype2 > 0) {
- damage = damage2;
- damage2 = 0;
- }
- // ‰EŽèA¶ŽèC—û‚Ì“K—p
- if(sd->status.weapon > 16) {// “ñ“—¬‚©?
- int dmg = damage, dmg2 = damage2;
- // ‰EŽèC—û(60% ` 100%) ‰EŽè‘S”Ê
- skill = pc_checkskill(sd,AS_RIGHT);
- damage = damage * (50 + (skill * 10))/100;
- if(dmg > 0 && damage < 1) damage = 1;
- // ¶ŽèC—û(40% ` 80%) ¶Žè‘S”Ê
- skill = pc_checkskill(sd,AS_LEFT);
- damage2 = damage2 * (30 + (skill * 10))/100;
- if(dmg2 > 0 && damage2 < 1) damage2 = 1;
- }
- else //“ñ“—¬‚Å‚È‚¯‚ê‚ζŽèƒ_ƒ[ƒW‚Í0
- damage2 = 0;
-
- // ‰EŽè,’ZŒ•‚Ì‚Ý
- if(da == 1) { //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚é‚©
- div_ = 2;
- damage += damage;
- type = 0x08;
- }
-
- if(sd->status.weapon == 16) {
- // ƒJƒ^[ƒ‹’ÇŒ‚ƒ_ƒ[ƒW
- skill = pc_checkskill(sd,TF_DOUBLE);
- damage2 = damage * (1 + (skill * 2))/100;
- if(damage > 0 && damage2 < 1) damage2 = 1;
- }
-
- // ƒCƒ“ƒxƒiƒ€C³
- if(skill_num==TF_POISON){
- damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
- }
- if(skill_num==MC_CARTREVOLUTION){
- damage = battle_attr_fix(damage, 0, battle_get_element(target) );
- }
-
- // Š®‘S‰ñ”ð‚Ì”»’è
- if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && div_ < 255 && rand()%1000 < battle_get_flee2(target) ){
- damage=damage2=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
-
- // ‘ÎÛ‚ªŠ®‘S‰ñ”ð‚ð‚·‚éݒ肪ON‚È‚ç
- if(battle_config.enemy_perfect_flee) {
- if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && div_ < 255 && rand()%1000 < battle_get_flee2(target) ) {
- damage=damage2=0;
- type=0x0b;
- dmg_lv = ATK_LUCKY;
- }
- }
-
- //Mob‚ÌMode‚ÉŠæ‹­ƒtƒ‰ƒO‚ª—§‚Á‚Ä‚¢‚é‚Æ‚«‚̈—
- if(t_mode&0x40){
- if(damage > 0)
- damage = 1;
- if(damage2 > 0)
- damage2 = 1;
- }
-
- //bNoWeaponDamage(Ý’èƒAƒCƒeƒ€–³‚µH)‚ŃOƒ‰ƒ“ƒhƒNƒƒX‚¶‚á‚È‚¢ê‡‚̓_ƒ[ƒW‚ª0
- if( tsd && tsd->special_state.no_weapon_damage && skill_num != CR_GRANDCROSS)
- damage = damage2 = 0;
-
- if(skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0) ) {
- if(damage2<1) // ƒ_ƒ[ƒWÅIC³
- damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
- else if(damage<1) // ‰EŽè‚ªƒ~ƒXH
- damage2=battle_calc_damage(src,target,damage2,div_,skill_num,skill_lv,flag);
- else { // —¼ Žè/ƒJƒ^[ƒ‹‚Ìꇂ͂¿‚å‚Á‚ÆŒvŽZ‚â‚₱‚µ‚¢
- int d1=damage+damage2,d2=damage2;
- damage=battle_calc_damage(src,target,damage+damage2,div_,skill_num,skill_lv,flag);
- damage2=(d2*100/d1)*damage/100;
- if(damage > 1 && damage2 < 1) damage2=1;
- damage-=damage2;
- }
- }
-
- /* For executioner card [Valaris] */
- if(src->type == BL_PC && sd->random_attack_increase_add > 0 && sd->random_attack_increase_per > 0 && skill_num == 0 ){
- if(rand()%100 < sd->random_attack_increase_per){
- if(damage >0) damage*=sd->random_attack_increase_add/100;
- if(damage2 >0) damage2*=sd->random_attack_increase_add/100;
- }
- }
- /* End addition */
-
-// -- moonsoul (final combination of phys, mag damage for ASC_BREAKER)
- if(skill_num == ASC_BREAKER) {
- damage += damage3;
- damage2 += damage3;
- }
-
- wd.damage=damage;
- wd.damage2=damage2;
- wd.type=type;
- wd.div_=div_;
- wd.amotion=battle_get_amotion(src);
- if(skill_num == KN_AUTOCOUNTER)
- wd.amotion >>= 1;
- wd.dmotion=battle_get_dmotion(target);
- wd.blewcount=blewcount;
- wd.flag=flag;
- wd.dmg_lv=dmg_lv;
-
- return wd;
-}
-
-/*==========================================
- * •Šíƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_weapon_attack(
- struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
-{
- struct Damage wd;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if (src == NULL || target == NULL) {
- nullpo_info(NLP_MARK);
- memset(&wd,0,sizeof(wd));
- return wd;
- }
-
- if(target->type == BL_PET)
- memset(&wd,0,sizeof(wd));
-
- else if(src->type == BL_PC)
- wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else if(src->type == BL_MOB)
- wd = battle_calc_mob_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else if(src->type == BL_PET)
- wd = battle_calc_pet_weapon_attack(src,target,skill_num,skill_lv,wflag);
- else
- memset(&wd,0,sizeof(wd));
-
- if(battle_config.equipment_breaking && src->type==BL_PC && (wd.damage > 0 || wd.damage2 > 0)) {
- struct map_session_data *sd=(struct map_session_data *)src;
- int breakrate=1;
- if(sd->status.weapon && sd->status.weapon!=11) {
- if(target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer!=-1){
- breakrate+=100*sd->sc_data[SC_MELTDOWN].val1;
- if(rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000)
- pc_breakweapon((struct map_session_data *)target);
- }
- if(sd->sc_data[SC_OVERTHRUST].timer!=-1)
- breakrate+=20*sd->sc_data[SC_OVERTHRUST].val1;
- if(wd.type==0x0a)
- breakrate*=2;
- if(rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) {
- if(pc_breakweapon(sd)==1)
- wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
- }
- }
- }
-
- if (battle_config.equipment_breaking && target->type == BL_PC && (wd.damage > 0 || wd.damage2 > 0)) {
- int breakrate=1;
- if(src->type==BL_PC && ((struct map_session_data *)src)->sc_data[SC_MELTDOWN].timer!=-1) breakrate+=70*((struct map_session_data *)src)->sc_data[SC_MELTDOWN].val1;
- if (wd.type==0x0a)
- breakrate*=2;
- if (rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) {
- pc_breakarmor((struct map_session_data *)target);
- }
- }
-
- return wd;
-}
-
-/*==========================================
- * –‚–@ƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_magic_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
- {
- int mdef1=battle_get_mdef(target);
- int mdef2=battle_get_mdef2(target);
- int matk1,matk2,damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv),rdamage = 0;
- struct Damage md;
- int aflag;
- int normalmagic_flag=1;
- int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
- struct map_session_data *sd=NULL,*tsd=NULL;
- struct mob_data *tmd = NULL;
-
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( bl == NULL || target == NULL ){
- nullpo_info(NLP_MARK);
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if(target->type == BL_PET) {
- memset(&md,0,sizeof(md));
- return md;
- }
-
- matk1=battle_get_matk1(bl);
- matk2=battle_get_matk2(bl);
- ele = skill_get_pl(skill_num);
- race = battle_get_race(bl);
- t_ele = battle_get_elem_type(target);
- t_race = battle_get_race(target);
- t_mode = battle_get_mode(target);
-
-#define MATK_FIX( a,b ) { matk1=matk1*(a)/(b); matk2=matk2*(a)/(b); }
-
- if( bl->type==BL_PC && (sd=(struct map_session_data *)bl) ){
- sd->state.attack_type = BF_MAGIC;
- if(sd->matk_rate != 100)
- MATK_FIX(sd->matk_rate,100);
- sd->state.arrow_atk = 0;
- }
- if( target->type==BL_PC )
- tsd=(struct map_session_data *)target;
- else if( target->type==BL_MOB )
- tmd=(struct mob_data *)target;
-
- aflag=BF_MAGIC|BF_LONG|BF_SKILL;
-
- if(skill_num > 0){
- switch(skill_num){ // Šî–{ƒ_ƒ[ƒWŒvŽZ(ƒXƒLƒ‹‚²‚ƂɈ—)
- // ƒq[ƒ‹or¹‘Ì
- case AL_HEAL:
- case PR_BENEDICTIO:
- damage = skill_calc_heal(bl,skill_lv)/2;
- normalmagic_flag=0;
- break;
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- damage = 40; //ŒÅ’èƒ_ƒ[ƒW
- normalmagic_flag=0;
- break;
- case PR_SANCTUARY: // ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ
- damage = (skill_lv>6)?388:skill_lv*50;
- normalmagic_flag=0;
- blewcount|=0x10000;
- break;
- case ALL_RESURRECTION:
- case PR_TURNUNDEAD: // UŒ‚ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ƃ^[ƒ“ƒAƒ“ƒfƒbƒh
- if(target->type != BL_PC && battle_check_undead(t_race,t_ele)){
- int hp, mhp, thres;
- hp = battle_get_hp(target);
- mhp = battle_get_max_hp(target);
- thres = (skill_lv * 20) + battle_get_luk(bl)+
- battle_get_int(bl) + battle_get_lv(bl)+
- ((200 - hp * 200 / mhp));
- if(thres > 700) thres = 700;
-// if(battle_config.battle_log)
-// printf("ƒ^[ƒ“ƒAƒ“ƒfƒbƒhI Šm—¦%d ñ(番—¦)\n", thres);
- if(rand()%1000 < thres && !(t_mode&0x20)) // ¬Œ÷
- damage = hp;
- else // Ž¸”s
- damage = battle_get_lv(bl) + battle_get_int(bl) + skill_lv * 10;
- }
- normalmagic_flag=0;
- break;
-
- case MG_NAPALMBEAT: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
- MATK_FIX(70+ skill_lv*10,100);
- if(flag>0){
- MATK_FIX(1,flag);
- }else {
- if(battle_config.error_log)
- printf("battle_calc_magic_attack(): napam enemy count=0 !\n");
- }
- break;
- case MG_FIREBALL: // ƒtƒ@ƒCƒ„[ƒ{[ƒ‹
- {
- const int drate[]={100,90,70};
- if(flag>2)
- matk1=matk2=0;
- else
- MATK_FIX( (95+skill_lv*5)*drate[flag] ,10000 );
- }
- break;
- case MG_FIREWALL: // ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹
-/*
- if( (t_ele!=3 && !battle_check_undead(t_race,t_ele)) || target->type==BL_PC ) //PC‚͉Α®«‚Å‚à”ò‚ÔH‚»‚à‚»‚àƒ_ƒ[ƒWŽó‚¯‚éH
- blewcount |= 0x10000;
- else
- blewcount = 0;
-*/
- if((t_ele==3 || battle_check_undead(t_race,t_ele)) && target->type!=BL_PC)
- blewcount = 0;
- else
- blewcount |= 0x10000;
- MATK_FIX( 1,2 );
- break;
- case MG_THUNDERSTORM: // ƒTƒ“ƒ_[ƒXƒg[ƒ€
- MATK_FIX( 80,100 );
- break;
- case MG_FROSTDIVER: // ƒtƒƒXƒgƒ_ƒCƒo
- MATK_FIX( 100+skill_lv*10, 100);
- break;
- case WZ_FROSTNOVA: // ƒtƒƒXƒgƒ_ƒCƒo
- MATK_FIX((100+skill_lv*10)*2/3, 100);
- break;
- case WZ_FIREPILLAR: // ƒtƒ@ƒCƒ„[ƒsƒ‰[
- if(mdef1 < 1000000)
- mdef1=mdef2=0; // MDEF–³Ž‹
- MATK_FIX( 1,5 );
- matk1+=50;
- matk2+=50;
- break;
- case WZ_SIGHTRASHER:
- MATK_FIX( 100+skill_lv*20, 100);
- break;
- case WZ_METEOR:
- case WZ_JUPITEL: // ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[
- break;
- case WZ_VERMILION: // ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“
- MATK_FIX( skill_lv*20+80, 100 );
- break;
- case WZ_WATERBALL: // ƒEƒH[ƒ^[ƒ{[ƒ‹
- //matk1+= skill_lv*30;
- //matk2+= skill_lv*30;
- MATK_FIX( 100+skill_lv*30, 100 );
- break;
- case WZ_STORMGUST: // ƒXƒg[ƒ€ƒKƒXƒg
- MATK_FIX( skill_lv*40+100 ,100 );
- blewcount|=0x10000;
- break;
- case AL_HOLYLIGHT: // ƒz[ƒŠ[ƒ‰ƒCƒg
- MATK_FIX( 125,100 );
- break;
- case AL_RUWACH:
- MATK_FIX( 145,100 );
- break;
- case HW_NAPALMVULCAN: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
- MATK_FIX(70+ skill_lv*10,100);
- if(flag>0){
- MATK_FIX(1,flag);
- }else {
- if(battle_config.error_log)
- printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
- }
- break;
- }
- }
-
- if(normalmagic_flag){ // ˆê”Ê–‚–@ƒ_ƒ[ƒWŒvŽZ
- int imdef_flag=0;
- if(matk1>matk2)
- damage= matk2+rand()%(matk1-matk2+1);
- else
- damage= matk2;
- if(sd) {
- if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
- imdef_flag = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_mdef_race & (1<<10))
- imdef_flag = 1;
- }
- else {
- if(sd->ignore_mdef_race & (1<<11))
- imdef_flag = 1;
- }
- }
- if(!imdef_flag){
- if(battle_config.magic_defense_type) {
- damage = damage - (mdef1 * battle_config.magic_defense_type) - mdef2;
- }
- else{
- damage = (damage*(100-mdef1))/100 - mdef2;
- }
- }
-
- if(damage<1)
- damage=1;
- }
-
- if(sd) {
- cardfix=100;
- cardfix=cardfix*(100+sd->magic_addrace[t_race])/100;
- cardfix=cardfix*(100+sd->magic_addele[t_ele])/100;
- if(t_mode & 0x20)
- cardfix=cardfix*(100+sd->magic_addrace[10])/100;
- else
- cardfix=cardfix*(100+sd->magic_addrace[11])/100;
- t_class = battle_get_class(target);
- for(i=0;i<sd->add_magic_damage_class_count;i++) {
- if(sd->add_magic_damage_classid[i] == t_class) {
- cardfix=cardfix*(100+sd->add_magic_damage_classrate[i])/100;
- break;
- }
- }
- damage=damage*cardfix/100;
- }
-
- if( tsd ){
- int s_class = battle_get_class(bl);
- cardfix=100;
- cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->magic_subrace[race])/100;
- if(battle_get_mode(bl) & 0x20)
- cardfix=cardfix*(100-tsd->magic_subrace[10])/100;
- else
- cardfix=cardfix*(100-tsd->magic_subrace[11])/100;
- for(i=0;i<tsd->add_mdef_class_count;i++) {
- if(tsd->add_mdef_classid[i] == s_class) {
- cardfix=cardfix*(100-tsd->add_mdef_classrate[i])/100;
- break;
- }
- }
- cardfix=cardfix*(100-tsd->magic_def_rate)/100;
- damage=damage*cardfix/100;
- }
- if(damage < 0) damage = 0;
-
- damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // ‘® «C³
-
- if(skill_num == CR_GRANDCROSS) { // ƒOƒ‰ƒ“ƒhƒNƒƒX
- struct Damage wd;
- wd=battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
- damage = (damage + wd.damage) * (100 + 40*skill_lv)/100;
- if(battle_config.gx_dupele) damage=battle_attr_fix(damage, ele, battle_get_element(target) ); //‘®«2‰ñ‚©‚©‚é
- if(bl==target) damage=damage/2; //”½“®‚Í”¼•ª
- }
-
- div_=skill_get_num( skill_num,skill_lv );
-
- if(div_>1 && skill_num != WZ_VERMILION)
- damage*=div_;
-
-// if(mdef1 >= 1000000 && damage > 0)
- if(t_mode&0x40 && damage > 0)
- damage = 1;
-
- if( tsd && tsd->special_state.no_magic_damage) {
- if (battle_config.gtb_pvp_only != 0) { // [MouseJstr]
- if ((map[target->m].flag.pvp || map[target->m].flag.gvg) && target->type==BL_PC)
- damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100;
- } else
- damage=0; // ‰© ‹à峃J[ƒhi–‚–@ƒ_ƒ[ƒW‚Oj
- }
-
- damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
-
- /* magic_damage_return by [AppleGirl] and [Valaris] */
- if( target->type==BL_PC && tsd && tsd->magic_damage_return > 0 ){
- rdamage += damage * tsd->magic_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- clif_damage(target,bl,gettick(),0,0,rdamage,0,0,0);
- battle_damage(target,bl,rdamage,0);
- }
- /* end magic_damage_return */
-
- md.damage=damage;
- md.div_=div_;
- md.amotion=battle_get_amotion(bl);
- md.dmotion=battle_get_dmotion(target);
- md.damage2=0;
- md.type=0;
- md.blewcount=blewcount;
- md.flag=aflag;
-
- return md;
-}
-
-/*==========================================
- * ‚»‚Ì‘¼ƒ_ƒ[ƒWŒvŽZ
- *------------------------------------------
- */
-struct Damage battle_calc_misc_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
-{
- int int_=battle_get_int(bl);
-// int luk=battle_get_luk(bl);
- int dex=battle_get_dex(bl);
- int skill,ele,race,cardfix;
- struct map_session_data *sd=NULL,*tsd=NULL;
- int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv);
- struct Damage md;
- int damagefix=1;
-
- int aflag=BF_MISC|BF_LONG|BF_SKILL;
-
- //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
- if( bl == NULL || target == NULL ){
- nullpo_info(NLP_MARK);
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if(target->type == BL_PET) {
- memset(&md,0,sizeof(md));
- return md;
- }
-
- if( bl->type == BL_PC && (sd=(struct map_session_data *)bl) ) {
- sd->state.attack_type = BF_MISC;
- sd->state.arrow_atk = 0;
- }
-
- if( target->type==BL_PC )
- tsd=(struct map_session_data *)target;
-
- switch(skill_num){
-
- case HT_LANDMINE: // ƒ‰ƒ“ƒhƒ}ƒCƒ“
- damage=skill_lv*(dex+75)*(100+int_)/100;
- break;
-
- case HT_BLASTMINE: // ƒuƒ‰ƒXƒgƒ}ƒCƒ“
- damage=skill_lv*(dex/2+50)*(100+int_)/100;
- break;
-
- case HT_CLAYMORETRAP: // ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv
- damage=skill_lv*(dex/2+75)*(100+int_)/100;
- break;
-
- case HT_BLITZBEAT: // ƒuƒŠƒbƒcƒr[ƒg
- if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0)
- skill=0;
- damage=(dex/10+int_/2+skill*3+40)*2;
- if(flag > 1)
- damage /= flag;
- break;
-
- case TF_THROWSTONE: // ΓŠ‚°
- damage=50;
- damagefix=0;
- break;
-
- case BA_DISSONANCE: // •s‹¦˜a‰¹
- damage=(skill_lv)*20+pc_checkskill(sd,BA_MUSICALLESSON)*3;
- break;
-
- case NPC_SELFDESTRUCTION: // Ž©”š
- damage=battle_get_hp(bl)-(bl==target?1:0);
- damagefix=0;
- break;
-
- case NPC_SMOKING: // ƒ^ƒoƒR‚ð‹z‚¤
- damage=3;
- damagefix=0;
- break;
-
- case NPC_DARKBREATH:
- {
- struct status_change *sc_data = battle_get_sc_data(target);
- int hitrate=battle_get_hit(bl) - battle_get_flee(target) + 80;
- hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
- if(sc_data && (sc_data[SC_SLEEP].timer!=-1 || sc_data[SC_STAN].timer!=-1 ||
- sc_data[SC_FREEZE].timer!=-1 || (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) ) )
- hitrate = 1000000;
- if(rand()%100 < hitrate) {
- damage = 500 + (skill_lv-1)*1000 + rand()%1000;
- if(damage > 9999) damage = 9999;
- }
- }
- break;
- case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
- skill = pc_checkskill(sd,HT_STEELCROW); // Celest
- damage=((150+50*skill_lv)*(dex/10+int_/2+skill*3+40)*2)/100;
- break;
- }
-
- ele = skill_get_pl(skill_num);
- race = battle_get_race(bl);
-
- if(damagefix){
- if(damage<1 && skill_num != NPC_DARKBREATH)
- damage=1;
-
- if( tsd ){
- cardfix=100;
- cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
- cardfix=cardfix*(100-tsd->misc_def_rate)/100;
- damage=damage*cardfix/100;
- }
- if(damage < 0) damage = 0;
- damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // ‘®«C³
- }
-
- div_=skill_get_num( skill_num,skill_lv );
- if(div_>1)
- damage*=div_;
-
- if(damage > 0 && (damage < div_ || (battle_get_def(target) >= 1000000 && battle_get_mdef(target) >= 1000000) ) ) {
- damage = div_;
- }
-
- damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
-
- md.damage=damage;
- md.div_=div_;
- md.amotion=battle_get_amotion(bl);
- md.dmotion=battle_get_dmotion(target);
- md.damage2=0;
- md.type=0;
- md.blewcount=blewcount;
- md.flag=aflag;
- return md;
-
-}
-/*==========================================
- * ƒ_ƒ[ƒWŒvŽZˆêŠ‡ˆ——p
- *------------------------------------------
- */
-struct Damage battle_calc_attack( int attack_type,
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
-{
- struct Damage d;
- switch(attack_type){
- case BF_WEAPON:
- return battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
- case BF_MAGIC:
- return battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag);
- case BF_MISC:
- return battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag);
- default:
- if(battle_config.error_log)
- printf("battle_calc_attack: unknwon attack type ! %d\n",attack_type);
- break;
- }
- return d;
-}
-/*==========================================
- * ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
- *------------------------------------------
- */
-int battle_weapon_attack( struct block_list *src,struct block_list *target,
- unsigned int tick,int flag)
-{
- struct map_session_data *sd=NULL;
- struct status_change *sc_data = battle_get_sc_data(src),*t_sc_data=battle_get_sc_data(target);
- short *opt1;
- int race = 7, ele = 0;
- int damage,rdamage = 0;
- struct Damage wd;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if(src->type == BL_PC)
- sd = (struct map_session_data *)src;
-
- if(src->prev == NULL || target->prev == NULL)
- return 0;
- if(src->type == BL_PC && pc_isdead(sd))
- return 0;
- if(target->type == BL_PC && pc_isdead((struct map_session_data *)target))
- return 0;
-
- opt1=battle_get_opt1(src);
- if(opt1 && *opt1 > 0) {
- battle_stopattack(src);
- return 0;
- }
- if(sc_data && sc_data[SC_BLADESTOP].timer!=-1){
- battle_stopattack(src);
- return 0;
- }
-
- race = battle_get_race(target);
- ele = battle_get_elem_type(target);
- if(battle_check_target(src,target,BCT_ENEMY) > 0 &&
- battle_check_range(src,target,0)){
- // UŒ‚‘ÎۂƂȂ肤‚é‚Ì‚ÅUŒ‚
- if(sd && sd->status.weapon == 11) {
- if(sd->equip_index[10] >= 0) {
- if(battle_config.arrow_decrement)
- pc_delitem(sd,sd->equip_index[10],1,0);
- }
- else {
- clif_arrow_fail(sd,0);
- return 0;
- }
- }
- if(flag&0x8000) {
- if(sd && battle_config.pc_attack_direction_change)
- sd->dir = sd->head_dir = map_calc_dir(src, target->x,target->y );
- else if(src->type == BL_MOB && battle_config.monster_attack_direction_change)
- ((struct mob_data *)src)->dir = map_calc_dir(src, target->x,target->y );
- wd=battle_calc_weapon_attack(src,target,KN_AUTOCOUNTER,flag&0xff,0);
- }
- else
- wd=battle_calc_weapon_attack(src,target,0,0,0);
- if((damage = wd.damage + wd.damage2) > 0 && src != target) {
- if(wd.flag&BF_SHORT) {
- if(target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd && tsd->short_weapon_damage_return > 0) {
- rdamage += damage * tsd->short_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- if(t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) {
- rdamage += damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- else if(wd.flag&BF_LONG) {
- if(target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if(tsd && tsd->long_weapon_damage_return > 0) {
- rdamage += damage * tsd->long_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- if(rdamage > 0)
- clif_damage(src,src,tick, wd.amotion,0,rdamage,1,4,0);
- }
-
- if (wd.div_ == 255 && sd) { //ŽO’i¶
- int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- int skilllv;
- if(wd.damage+wd.damage2 < battle_get_hp(target)) {
- if((skilllv = pc_checkskill(sd, MO_CHAINCOMBO)) > 0)
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- skill_status_change_start(src,SC_COMBO,MO_TRIPLEATTACK,skilllv,0,0,delay,0);
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay);
- clif_skill_damage(src , target , tick , wd.amotion , wd.dmotion ,
- wd.damage , 3 , MO_TRIPLEATTACK, pc_checkskill(sd,MO_TRIPLEATTACK) , -1 );
- }
- else {
- clif_damage(src,target,tick, wd.amotion, wd.dmotion,
- wd.damage, wd.div_ , wd.type, wd.damage2);
- //“ñ“—¬¶Žè‚ƃJƒ^[ƒ‹’ÇŒ‚‚̃~ƒX•\Ž¦(–³—‚â‚è`)
- if(sd && sd->status.weapon >= 16 && wd.damage2 == 0)
- clif_damage(src,target,tick+10, wd.amotion, wd.dmotion,0, 1, 0, 0);
- }
- if(sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0) )
- skill_castend_damage_id(src,target,0,-1,tick,0);
- map_freeblock_lock();
- battle_damage(src,target,(wd.damage+wd.damage2),0);
- if(target->prev != NULL &&
- (target->type != BL_PC || (target->type == BL_PC && !pc_isdead((struct map_session_data *)target) ) ) ) {
- if(wd.damage > 0 || wd.damage2 > 0) {
- skill_additional_effect(src,target,0,0,BF_WEAPON,tick);
- if(sd) {
- if(sd->weapon_coma_ele[ele] > 0 && rand()%10000 < sd->weapon_coma_ele[ele])
- battle_damage(src,target,battle_get_max_hp(target),1);
- if(sd->weapon_coma_race[race] > 0 && rand()%10000 < sd->weapon_coma_race[race])
- battle_damage(src,target,battle_get_max_hp(target),1);
- if(battle_get_mode(target) & 0x20) {
- if(sd->weapon_coma_race[10] > 0 && rand()%10000 < sd->weapon_coma_race[10])
- battle_damage(src,target,battle_get_max_hp(target),1);
- }
- else {
- if(sd->weapon_coma_race[11] > 0 && rand()%10000 < sd->weapon_coma_race[11])
- battle_damage(src,target,battle_get_max_hp(target),1);
- }
- }
- }
- }
- if(sc_data && sc_data[SC_AUTOSPELL].timer != -1 && rand()%100 < sc_data[SC_AUTOSPELL].val4) {
- int skilllv=sc_data[SC_AUTOSPELL].val3,i,f=0;
- i = rand()%100;
- if(i >= 50) skilllv -= 2;
- else if(i >= 15) skilllv--;
- if(skilllv < 1) skilllv = 1;
- if(sd) {
- int sp = skill_get_sp(sc_data[SC_AUTOSPELL].val2,skilllv)*2/3;
- if(sd->status.sp >= sp) {
- if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
- f = skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
- case 0: case 2:
- f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else
- f = skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- }
- }
- if(!f) pc_heal(sd,0,-sp);
- }
- }
- else {
- if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
- skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
- case 0: case 2:
- skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- else
- skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
- break;
- }
- }
- }
- }
- if(sd) {
- if(sd->autospell_id > 0 && sd->autospell_lv > 0 && rand()%100 < sd->autospell_rate) {
- int skilllv=sd->autospell_lv,i,f=0,sp;
- i = rand()%100;
- if(i >= 50) skilllv -= 2;
- else if(i >= 15) skilllv--;
- if(skilllv < 1) skilllv = 1;
- sp = skill_get_sp(sd->autospell_id,skilllv)*2/3;
- if(sd->status.sp >= sp) {
- if((i=skill_get_inf(sd->autospell_id) == 2) || i == 32)
- f = skill_castend_pos2(src,target->x,target->y,sd->autospell_id,skilllv,tick,flag);
- else {
- switch( skill_get_nk(sd->autospell_id) ) {
- case 0: case 2:
- f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- break;
- case 1:/* Žx‰‡Œn */
- if((sd->autospell_id==AL_HEAL || (sd->autospell_id==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
- f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- else
- f = skill_castend_nodamage_id(src,target,sd->autospell_id,skilllv,tick,flag);
- break;
- }
- }
- if(!f) pc_heal(sd,0,-sp);
- }
- }
- if(wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) {
- int hp = 0,sp = 0;
- if(sd->hp_drain_rate && sd->hp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->hp_drain_rate) {
- hp += (wd.damage * sd->hp_drain_per)/100;
- if(sd->hp_drain_rate > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1;
- }
- if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) {
- hp += (wd.damage2 * sd->hp_drain_per_)/100;
- if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1;
- }
- if(sd->sp_drain_rate && sd->sp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->sp_drain_rate) {
- sp += (wd.damage * sd->sp_drain_per)/100;
- if(sd->sp_drain_rate > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1;
- }
- if(sd->sp_drain_rate_ && sd->sp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
- sp += (wd.damage2 * sd->sp_drain_per_)/100;
- if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
- }
- if(hp || sp) pc_heal(sd,hp,sp);
- }
- }
-
- if(rdamage > 0)
- battle_damage(target,src,rdamage,0);
- if(t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 && t_sc_data[SC_AUTOCOUNTER].val4 > 0) {
- if(t_sc_data[SC_AUTOCOUNTER].val3 == src->id)
- battle_weapon_attack(target,src,tick,0x8000|t_sc_data[SC_AUTOCOUNTER].val1);
- skill_status_change_end(target,SC_AUTOCOUNTER,-1);
- }
- if(t_sc_data && t_sc_data[SC_POISONREACT].timer != -1 && t_sc_data[SC_POISONREACT].val4 > 0) { // poison react [Celest]
- if(t_sc_data[SC_POISONREACT].val3 == src->id) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if ((src->type == BL_MOB && battle_get_elem_type(src)==5) || (src->type == BL_PC && battle_get_attack_element(src)==5)) {
- t_sc_data[SC_POISONREACT].val2 = 0;
- battle_weapon_attack(target,src,tick,flag|t_sc_data[SC_POISONREACT].val1);
- } else {
- skill_use_id(tsd,src->id,TF_POISON,5);
- --t_sc_data[SC_POISONREACT].val2;
- }
- if (t_sc_data[SC_POISONREACT].val2<=0)
- skill_status_change_end(target,SC_POISONREACT,-1);
- }
- }
- if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){
- int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
- skill_status_change_end(target,SC_BLADESTOP_WAIT,-1);
- skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0);
- skill_status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0);
- }
- if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //‰£‚Á‚½‚Ì‚Å‘Îۂ̃xƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ó‘Ô‚ð‰ðœ
- skill_status_change_end(target,SC_SPLASHER,-1);
-
- map_freeblock_unlock();
- }
- return wd.dmg_lv;
-}
-
-int battle_check_undead(int race,int element)
-{
- if(battle_config.undead_detect_type == 0) {
- if(element == 9)
- return 1;
- }
- else if(battle_config.undead_detect_type == 1) {
- if(race == 1)
- return 1;
- }
- else {
- if(element == 9 || race == 1)
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * “G–¡•û”»’è(1=m’è,0=”Û’è,-1=ƒGƒ‰[)
- * flag&0xf0000 = 0x00000:“G‚¶‚á‚È‚¢‚©”»’èiret:1“G‚Å‚Í‚È‚¢j
- * = 0x10000:ƒp[ƒeƒB[”»’èiret:1=ƒp[ƒeƒB[ƒƒ“ƒo)
- * = 0x20000:‘S‚Ä(ret:1=“G–¡•û—¼•û)
- * = 0x40000:“G‚©”»’è(ret:1=“G)
- * = 0x50000:ƒp[ƒeƒB[‚¶‚á‚È‚¢‚©”»’è(ret:1=ƒp[ƒeƒB‚Å‚È‚¢)
- *------------------------------------------
- */
-int battle_check_target( struct block_list *src, struct block_list *target,int flag)
-{
- int s_p,s_g,t_p,t_g;
- struct block_list *ss=src;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if( flag&0x40000 ){ // ”½“]ƒtƒ‰ƒO
- int ret=battle_check_target(src,target,flag&0x30000);
- if(ret!=-1)
- return !ret;
- return -1;
- }
-
- if( flag&0x20000 ){
- if( target->type==BL_MOB || target->type==BL_PC )
- return 1;
- else
- return -1;
- }
-
- if(src->type == BL_SKILL && target->type == BL_SKILL) // ‘ÎÛ‚ªƒXƒLƒ‹ƒ†ƒjƒbƒg‚È‚ç–³ðŒm’è
- return -1;
-
- if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1)
- return -1;
-
- if(target->type == BL_SKILL) {
- switch(((struct skill_unit *)target)->group->unit_id){
- case 0x8d:
- case 0x8f:
- case 0x98:
- return 0;
- break;
- }
- }
-
- if(target->type == BL_PET)
- return -1;
-
- // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ìê‡Ae‚ð‹‚ß‚é
- if( src->type==BL_SKILL) {
- int inf2 = skill_get_inf2(((struct skill_unit *)src)->group->skill_id);
- if( (ss=map_id2bl( ((struct skill_unit *)src)->group->src_id))==NULL )
- return -1;
- if(ss->prev == NULL)
- return -1;
- if(inf2&0x80 &&
- (map[src->m].flag.pvp || pc_iskiller((struct map_session_data *)src, (struct map_session_data *)target)) && // [MouseJstr]
- !(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target)))
- return 0;
- if(ss == target) {
- if(inf2&0x100)
- return 0;
- if(inf2&0x200)
- return -1;
- }
- }
- // Mob‚Åmaster_id‚ª‚ ‚Á‚Äspecial_mob_ai‚È‚çA¢Š«Žå‚ð‹‚ß‚é
- if( src->type==BL_MOB ){
- struct mob_data *md=(struct mob_data *)src;
- if(md && md->master_id>0){
- if(md->master_id==target->id) // Žå‚È‚çm’è
- return 1;
- if(md->state.special_mob_ai){
- if(target->type==BL_MOB){ //special_mob_ai‚Å‘ÎÛ‚ªMob
- struct mob_data *tmd=(struct mob_data *)target;
- if(tmd){
- if(tmd->master_id != md->master_id) //¢Š«Žå‚ªˆê‚Å‚È‚¯‚ê‚Δےè
- return 0;
- else{ //¢Š«Žå‚ªˆê‚È‚Ì‚Åm’肵‚½‚¢‚¯‚ÇŽ©”š‚͔ےè
- if(md->state.special_mob_ai>2)
- return 0;
- else
- return 1;
- }
- }
- }
- }
- if((ss=map_id2bl(md->master_id))==NULL)
- return -1;
- }
- }
-
- if( src==target || ss==target ) // “¯‚¶‚È‚çm’è
- return 1;
-
- if(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target))
- return -1;
-
- if( src->prev==NULL || // Ž€‚ñ‚Å‚é‚È‚çƒGƒ‰[
- (src->type==BL_PC && pc_isdead((struct map_session_data *)src) ) )
- return -1;
-
- if( (ss->type == BL_PC && target->type==BL_MOB) ||
- (ss->type == BL_MOB && target->type==BL_PC) )
- return 0; // PCvsMOB‚È‚ç”Û’è
-
- if(ss->type == BL_PET && target->type==BL_MOB)
- return 0;
-
- s_p=battle_get_party_id(ss);
- s_g=battle_get_guild_id(ss);
-
- t_p=battle_get_party_id(target);
- t_g=battle_get_guild_id(target);
-
- if(flag&0x10000) {
- if(s_p && t_p && s_p == t_p) // “¯‚¶ƒp[ƒeƒB‚È‚çm’èi–¡•ûj
- return 1;
- else // ƒp[ƒeƒBŒŸõ‚Ȃ瓯‚¶ƒp[ƒeƒB‚¶‚á‚È‚¢Žž“_‚Ŕےè
- return 0;
- }
-
- if(ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g ) // “¯‚¶ƒMƒ‹ƒh/mobƒNƒ‰ƒX‚È‚çm’èi–¡•ûj
- return 1;
-
-//printf("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type);
-//printf("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g);
-
- if( ss->type==BL_PC && target->type==BL_PC) { // —¼•ûPVPƒ‚[ƒh‚È‚ç”Û’èi“Gj
- struct skill_unit *su=NULL;
- if(src->type==BL_SKILL)
- su=(struct skill_unit *)src;
- if(map[ss->m].flag.pvp || pc_iskiller((struct map_session_data *)ss, (struct map_session_data*)target)) { // [MouseJstr]
- if(su && su->group->target_flag==BCT_NOENEMY)
- return 1;
- else if(battle_config.pk_mode && (((struct map_session_data*)ss)->status.class==0 || ((struct map_session_data*)target)->status.class==0))
- return 1; // prevent novice engagement in pk_mode [Valaris]
- else if(map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
- return 1;
- else if(map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0 && s_g == t_g)
- return 1;
- return 0;
- }
- if(map[src->m].flag.gvg) {
- struct guild *g=NULL;
- if(su && su->group->target_flag==BCT_NOENEMY)
- return 1;
- if( s_g > 0 && s_g == t_g)
- return 1;
- if(map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
- return 1;
- if((g = guild_search(s_g))) {
- int i;
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if(g->alliance[i].guild_id > 0 && g->alliance[i].guild_id == t_g) {
- if(g->alliance[i].opposition)
- return 0;//“G‘΃Mƒ‹ƒh‚È‚ç–³ðŒ‚É“G
- else
- return 1;//“¯–¿ƒMƒ‹ƒh‚È‚ç–³ðŒ‚É–¡•û
- }
- }
- }
- return 0;
- }
- }
-
- return 1; // ŠY“–‚µ‚È‚¢‚Ì‚Å–³ŠÖŒWl•¨i‚Ü‚ “G‚¶‚á‚È‚¢‚Ì‚Å–¡•ûj
-}
-/*==========================================
- * ŽË’ö”»’è
- *------------------------------------------
- */
-int battle_check_range(struct block_list *src,struct block_list *bl,int range)
-{
-
- int dx,dy;
- struct walkpath_data wpd;
- int arange;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- dx=abs(bl->x-src->x);
- dy=abs(bl->y-src->y);
- arange=((dx>dy)?dx:dy);
-
- if(src->m != bl->m) // ˆá‚¤ƒ}ƒbƒv
- return 0;
-
- if( range>0 && range < arange ) // ‰“‚·‚¬‚é
- return 0;
-
- if( arange<2 ) // “¯‚¶ƒ}ƒX‚©—×Ú
- return 1;
-
-// if(bl->type == BL_SKILL && ((struct skill_unit *)bl)->group->unit_id == 0x8d)
-// return 1;
-
- // áŠQ•¨”»’è
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- if(path_search(&wpd,src->m,src->x,src->y,bl->x,bl->y,0x10001)!=-1)
- return 1;
-
- dx=(dx>0)?1:((dx<0)?-1:0);
- dy=(dy>0)?1:((dy<0)?-1:0);
- return (path_search(&wpd,src->m,src->x+dx,src->y+dy,
- bl->x-dx,bl->y-dy,0x10001)!=-1)?1:0;
-}
-
-/*==========================================
- * Return numerical value of a switch configuration (modified by [Yor])
- * on/off, english, français, deutsch, español
- *------------------------------------------
- */
-int battle_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);
-}
-
-static const struct {
- char str[128];
- int *val;
-} battle_data[] = {
- { "warp_point_debug", &battle_config.warp_point_debug },
- { "enemy_critical", &battle_config.enemy_critical },
- { "enemy_critical_rate", &battle_config.enemy_critical_rate },
- { "enemy_str", &battle_config.enemy_str },
- { "enemy_perfect_flee", &battle_config.enemy_perfect_flee },
- { "casting_rate", &battle_config.cast_rate },
- { "delay_rate", &battle_config.delay_rate },
- { "delay_dependon_dex", &battle_config.delay_dependon_dex },
- { "skill_delay_attack_enable", &battle_config.sdelay_attack_enable },
- { "left_cardfix_to_right", &battle_config.left_cardfix_to_right },
- { "player_skill_add_range", &battle_config.pc_skill_add_range },
- { "skill_out_range_consume", &battle_config.skill_out_range_consume },
- { "monster_skill_add_range", &battle_config.mob_skill_add_range },
- { "player_damage_delay", &battle_config.pc_damage_delay },
- { "player_damage_delay_rate", &battle_config.pc_damage_delay_rate },
- { "defunit_not_enemy", &battle_config.defnotenemy },
- { "random_monster_checklv", &battle_config.random_monster_checklv },
- { "attribute_recover", &battle_config.attr_recover },
- { "flooritem_lifetime", &battle_config.flooritem_lifetime },
- { "item_auto_get", &battle_config.item_auto_get },
- { "item_first_get_time", &battle_config.item_first_get_time },
- { "item_second_get_time", &battle_config.item_second_get_time },
- { "item_third_get_time", &battle_config.item_third_get_time },
- { "mvp_item_first_get_time", &battle_config.mvp_item_first_get_time },
- { "mvp_item_second_get_time", &battle_config.mvp_item_second_get_time },
- { "mvp_item_third_get_time", &battle_config.mvp_item_third_get_time },
- { "item_rate", &battle_config.item_rate },
- { "drop_rate0item", &battle_config.drop_rate0item },
- { "base_exp_rate", &battle_config.base_exp_rate },
- { "job_exp_rate", &battle_config.job_exp_rate },
- { "pvp_exp", &battle_config.pvp_exp },
- { "gtb_pvp_only", &battle_config.gtb_pvp_only },
- { "guild_max_castles", &battle_config.guild_max_castles },
- { "death_penalty_type", &battle_config.death_penalty_type },
- { "death_penalty_base", &battle_config.death_penalty_base },
- { "death_penalty_job", &battle_config.death_penalty_job },
- { "zeny_penalty", &battle_config.zeny_penalty },
- { "restart_hp_rate", &battle_config.restart_hp_rate },
- { "restart_sp_rate", &battle_config.restart_sp_rate },
- { "mvp_hp_rate", &battle_config.mvp_hp_rate },
- { "mvp_item_rate", &battle_config.mvp_item_rate },
- { "mvp_exp_rate", &battle_config.mvp_exp_rate },
- { "monster_hp_rate", &battle_config.monster_hp_rate },
- { "monster_max_aspd", &battle_config.monster_max_aspd },
- { "atcommand_gm_only", &battle_config.atc_gmonly },
- { "atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit },
- { "gm_all_skill", &battle_config.gm_allskill },
- { "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra },
- { "gm_all_equipment", &battle_config.gm_allequip },
- { "gm_skill_unconditional", &battle_config.gm_skilluncond },
- { "player_skillfree", &battle_config.skillfree },
- { "player_skillup_limit", &battle_config.skillup_limit },
- { "weapon_produce_rate", &battle_config.wp_rate },
- { "potion_produce_rate", &battle_config.pp_rate },
- { "monster_active_enable", &battle_config.monster_active_enable },
- { "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate},
- { "monster_loot_type", &battle_config.monster_loot_type },
- { "mob_skill_use", &battle_config.mob_skill_use },
- { "mob_count_rate", &battle_config.mob_count_rate },
- { "quest_skill_learn", &battle_config.quest_skill_learn },
- { "quest_skill_reset", &battle_config.quest_skill_reset },
- { "basic_skill_check", &battle_config.basic_skill_check },
- { "guild_emperium_check", &battle_config.guild_emperium_check },
- { "guild_exp_limit", &battle_config.guild_exp_limit },
- { "player_invincible_time", &battle_config.pc_invincible_time },
- { "pet_catch_rate", &battle_config.pet_catch_rate },
- { "pet_rename", &battle_config.pet_rename },
- { "pet_friendly_rate", &battle_config.pet_friendly_rate },
- { "pet_hungry_delay_rate", &battle_config.pet_hungry_delay_rate },
- { "pet_hungry_friendly_decrease", &battle_config.pet_hungry_friendly_decrease},
- { "pet_str", &battle_config.pet_str },
- { "pet_status_support", &battle_config.pet_status_support },
- { "pet_attack_support", &battle_config.pet_attack_support },
- { "pet_damage_support", &battle_config.pet_damage_support },
- { "pet_support_rate", &battle_config.pet_support_rate },
- { "pet_attack_exp_to_master", &battle_config.pet_attack_exp_to_master },
- { "pet_attack_exp_rate", &battle_config.pet_attack_exp_rate },
- { "skill_min_damage", &battle_config.skill_min_damage },
- { "finger_offensive_type", &battle_config.finger_offensive_type },
- { "heal_exp", &battle_config.heal_exp },
- { "resurrection_exp", &battle_config.resurrection_exp },
- { "shop_exp", &battle_config.shop_exp },
- { "combo_delay_rate", &battle_config.combo_delay_rate },
- { "item_check", &battle_config.item_check },
- { "wedding_modifydisplay", &battle_config.wedding_modifydisplay },
- { "natural_healhp_interval", &battle_config.natural_healhp_interval },
- { "natural_healsp_interval", &battle_config.natural_healsp_interval },
- { "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval},
- { "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate },
- { "item_name_override_grffile", &battle_config.item_name_override_grffile},
- { "arrow_decrement", &battle_config.arrow_decrement },
- { "max_aspd", &battle_config.max_aspd },
- { "max_hp", &battle_config.max_hp },
- { "max_sp", &battle_config.max_sp },
- { "max_lv", &battle_config.max_lv },
- { "max_parameter", &battle_config.max_parameter },
- { "max_cart_weight", &battle_config.max_cart_weight },
- { "player_skill_log", &battle_config.pc_skill_log },
- { "monster_skill_log", &battle_config.mob_skill_log },
- { "battle_log", &battle_config.battle_log },
- { "save_log", &battle_config.save_log },
- { "error_log", &battle_config.error_log },
- { "etc_log", &battle_config.etc_log },
- { "save_clothcolor", &battle_config.save_clothcolor },
- { "undead_detect_type", &battle_config.undead_detect_type },
- { "player_auto_counter_type", &battle_config.pc_auto_counter_type },
- { "monster_auto_counter_type", &battle_config.monster_auto_counter_type},
- { "agi_penaly_type", &battle_config.agi_penaly_type },
- { "agi_penaly_count", &battle_config.agi_penaly_count },
- { "agi_penaly_num", &battle_config.agi_penaly_num },
- { "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv },
- { "vit_penaly_type", &battle_config.vit_penaly_type },
- { "vit_penaly_count", &battle_config.vit_penaly_count },
- { "vit_penaly_num", &battle_config.vit_penaly_num },
- { "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv },
- { "player_defense_type", &battle_config.player_defense_type },
- { "monster_defense_type", &battle_config.monster_defense_type },
- { "pet_defense_type", &battle_config.pet_defense_type },
- { "magic_defense_type", &battle_config.magic_defense_type },
- { "player_skill_reiteration", &battle_config.pc_skill_reiteration },
- { "monster_skill_reiteration", &battle_config.monster_skill_reiteration},
- { "player_skill_nofootset", &battle_config.pc_skill_nofootset },
- { "monster_skill_nofootset", &battle_config.monster_skill_nofootset },
- { "player_cloak_check_type", &battle_config.pc_cloak_check_type },
- { "monster_cloak_check_type", &battle_config.monster_cloak_check_type },
- { "gvg_short_attack_damage_rate", &battle_config.gvg_short_damage_rate },
- { "gvg_long_attack_damage_rate", &battle_config.gvg_long_damage_rate },
- { "gvg_magic_attack_damage_rate", &battle_config.gvg_magic_damage_rate },
- { "gvg_misc_attack_damage_rate", &battle_config.gvg_misc_damage_rate },
- { "gvg_eliminate_time", &battle_config.gvg_eliminate_time },
- { "mob_changetarget_byskill", &battle_config.mob_changetarget_byskill},
- { "player_attack_direction_change", &battle_config.pc_attack_direction_change },
- { "monster_attack_direction_change", &battle_config.monster_attack_direction_change },
- { "player_land_skill_limit", &battle_config.pc_land_skill_limit },
- { "monster_land_skill_limit", &battle_config.monster_land_skill_limit},
- { "party_skill_penaly", &battle_config.party_skill_penaly },
- { "monster_class_change_full_recover", &battle_config.monster_class_change_full_recover },
- { "produce_item_name_input", &battle_config.produce_item_name_input },
- { "produce_potion_name_input", &battle_config.produce_potion_name_input},
- { "making_arrow_name_input", &battle_config.making_arrow_name_input },
- { "holywater_name_input", &battle_config.holywater_name_input },
- { "display_delay_skill_fail", &battle_config.display_delay_skill_fail },
- { "chat_warpportal", &battle_config.chat_warpportal },
- { "mob_warpportal", &battle_config.mob_warpportal },
- { "dead_branch_active", &battle_config.dead_branch_active },
- { "vending_max_value", &battle_config.vending_max_value },
- { "show_steal_in_same_party", &battle_config.show_steal_in_same_party },
- { "enable_upper_class", &battle_config.enable_upper_class },
- { "pet_attack_attr_none", &battle_config.pet_attack_attr_none },
- { "mob_attack_attr_none", &battle_config.mob_attack_attr_none },
- { "mob_ghostring_fix", &battle_config.mob_ghostring_fix },
- { "pc_attack_attr_none", &battle_config.pc_attack_attr_none },
- { "gx_allhit", &battle_config.gx_allhit },
- { "gx_cardfix", &battle_config.gx_cardfix },
- { "gx_dupele", &battle_config.gx_dupele },
- { "gx_disptype", &battle_config.gx_disptype },
- { "player_skill_partner_check", &battle_config.player_skill_partner_check},
- { "hide_GM_session", &battle_config.hide_GM_session },
- { "unit_movement_type", &battle_config.unit_movement_type },
- { "invite_request_check", &battle_config.invite_request_check },
- { "skill_removetrap_type", &battle_config.skill_removetrap_type },
- { "disp_experience", &battle_config.disp_experience },
- { "castle_defense_rate", &battle_config.castle_defense_rate },
- { "riding_weight", &battle_config.riding_weight },
- { "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT
- { "item_rate_equip", &battle_config.item_rate_equip },
- { "item_rate_card", &battle_config.item_rate_card }, // End Addition
- { "item_rate_heal", &battle_config.item_rate_heal }, // Added by Valaris
- { "item_rate_use", &battle_config.item_rate_use }, // End
- { "item_drop_common_min", &battle_config.item_drop_common_min }, // Added by TyrNemesis^
- { "item_drop_common_max", &battle_config.item_drop_common_max },
- { "item_drop_equip_min", &battle_config.item_drop_equip_min },
- { "item_drop_equip_max", &battle_config.item_drop_equip_max },
- { "item_drop_card_min", &battle_config.item_drop_card_min },
- { "item_drop_card_max", &battle_config.item_drop_card_max },
- { "item_drop_mvp_min", &battle_config.item_drop_mvp_min },
- { "item_drop_mvp_max", &battle_config.item_drop_mvp_max }, // End Addition
- { "prevent_logout", &battle_config.prevent_logout }, // Added by RoVeRT
- { "alchemist_summon_reward", &battle_config.alchemist_summon_reward }, // [Valaris]
- { "maximum_level", &battle_config.maximum_level }, // [Valaris]
- { "drops_by_luk", &battle_config.drops_by_luk }, // [Valaris]
- { "monsters_ignore_gm", &battle_config.monsters_ignore_gm }, // [Valaris]
- { "equipment_breaking", &battle_config.equipment_breaking }, // [Valaris]
- { "equipment_break_rate", &battle_config.equipment_break_rate }, // [Valaris]
- { "pk_mode", &battle_config.pk_mode }, // [Valaris]
- { "pet_equip_required", &battle_config.pet_equip_required }, // [Valaris]
- { "multi_level_up", &battle_config.multi_level_up }, // [Valaris]
- { "backstab_bow_penalty", &battle_config.backstab_bow_penalty },
- { "night_at_start", &battle_config.night_at_start }, // added by [Yor]
- { "day_duration", &battle_config.day_duration }, // added by [Yor]
- { "night_duration", &battle_config.night_duration }, // added by [Yor]
- { "show_mob_hp", &battle_config.show_mob_hp }, // [Valaris]
- { "ban_spoof_namer", &battle_config.ban_spoof_namer }, // added by [Yor]
- { "hack_info_GM_level", &battle_config.hack_info_GM_level }, // added by [Yor]
- { "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level }, // added by [Yor]
- { "packet_ver_flag", &battle_config.packet_ver_flag }, // added by [Yor]
- { "min_hair_style", &battle_config.min_hair_style }, // added by [MouseJstr]
- { "max_hair_style", &battle_config.max_hair_style }, // added by [MouseJstr]
- { "min_hair_color", &battle_config.min_hair_color }, // added by [MouseJstr]
- { "max_hair_color", &battle_config.max_hair_color }, // added by [MouseJstr]
- { "min_cloth_color", &battle_config.min_cloth_color }, // added by [MouseJstr]
- { "max_cloth_color", &battle_config.max_cloth_color }, // added by [MouseJstr]
- { "castrate_dex_scale", &battle_config.castrate_dex_scale }, // added by [MouseJstr]
- { "area_size", &battle_config.area_size }, // added by [MouseJstr]
- { "muting_players", &battle_config.muting_players}, // added by [Apple]
-//SQL-only options start
-#ifndef TXT_ONLY
- { "mail_system", &battle_config.mail_system }, // added by [Valaris]
-//SQL-only options end
-#endif
-};
-
-int battle_set_value(char *w1, char *w2) {
- int i;
- for(i = 0; i < sizeof(battle_data) / (sizeof(battle_data[0])); i++)
- if (strcmpi(w1, battle_data[i].str) == 0) {
- *battle_data[i].val = battle_config_switch(w2);
- return 1;
- }
- return 0;
-}
-
-void battle_set_defaults() {
- battle_config.warp_point_debug=0;
- battle_config.enemy_critical=0;
- battle_config.enemy_critical_rate=100;
- battle_config.enemy_str=1;
- battle_config.enemy_perfect_flee=0;
- battle_config.cast_rate=100;
- battle_config.delay_rate=100;
- battle_config.delay_dependon_dex=0;
- battle_config.sdelay_attack_enable=0;
- battle_config.left_cardfix_to_right=0;
- battle_config.pc_skill_add_range=0;
- battle_config.skill_out_range_consume=1;
- battle_config.mob_skill_add_range=0;
- battle_config.pc_damage_delay=1;
- battle_config.pc_damage_delay_rate=100;
- battle_config.defnotenemy=1;
- battle_config.random_monster_checklv=1;
- battle_config.attr_recover=1;
- battle_config.flooritem_lifetime=LIFETIME_FLOORITEM*1000;
- battle_config.item_auto_get=0;
- battle_config.item_first_get_time=3000;
- battle_config.item_second_get_time=1000;
- battle_config.item_third_get_time=1000;
- battle_config.mvp_item_first_get_time=10000;
- battle_config.mvp_item_second_get_time=10000;
- battle_config.mvp_item_third_get_time=2000;
-
- battle_config.drop_rate0item=0;
- battle_config.base_exp_rate=100;
- battle_config.job_exp_rate=100;
- battle_config.pvp_exp=1;
- battle_config.gtb_pvp_only=0;
- battle_config.death_penalty_type=0;
- battle_config.death_penalty_base=0;
- battle_config.death_penalty_job=0;
- battle_config.zeny_penalty=0;
- battle_config.restart_hp_rate=0;
- battle_config.restart_sp_rate=0;
- battle_config.mvp_item_rate=100;
- battle_config.mvp_exp_rate=100;
- battle_config.mvp_hp_rate=100;
- battle_config.monster_hp_rate=100;
- battle_config.monster_max_aspd=199;
- battle_config.atc_gmonly=0;
- battle_config.gm_allskill=0;
- battle_config.gm_allequip=0;
- battle_config.gm_skilluncond=0;
- battle_config.guild_max_castles=0;
- battle_config.skillfree = 0;
- battle_config.skillup_limit = 0;
- battle_config.wp_rate=100;
- battle_config.pp_rate=100;
- battle_config.monster_active_enable=1;
- battle_config.monster_damage_delay_rate=100;
- battle_config.monster_loot_type=0;
- battle_config.mob_skill_use=1;
- battle_config.mob_count_rate=100;
- battle_config.quest_skill_learn=0;
- battle_config.quest_skill_reset=1;
- battle_config.basic_skill_check=1;
- battle_config.guild_emperium_check=1;
- battle_config.guild_exp_limit=50;
- battle_config.pc_invincible_time = 5000;
- battle_config.pet_catch_rate=100;
- battle_config.pet_rename=0;
- battle_config.pet_friendly_rate=100;
- battle_config.pet_hungry_delay_rate=100;
- battle_config.pet_hungry_friendly_decrease=5;
- battle_config.pet_str=1;
- battle_config.pet_status_support=0;
- battle_config.pet_attack_support=0;
- battle_config.pet_damage_support=0;
- battle_config.pet_support_rate=100;
- battle_config.pet_attack_exp_to_master=0;
- battle_config.pet_attack_exp_rate=100;
- battle_config.skill_min_damage=0;
- battle_config.finger_offensive_type=0;
- battle_config.heal_exp=0;
- battle_config.resurrection_exp=0;
- battle_config.shop_exp=0;
- battle_config.combo_delay_rate=100;
- battle_config.item_check=1;
- battle_config.wedding_modifydisplay=0;
- battle_config.natural_healhp_interval=6000;
- battle_config.natural_healsp_interval=8000;
- battle_config.natural_heal_skill_interval=10000;
- battle_config.natural_heal_weight_rate=50;
- battle_config.item_name_override_grffile=1;
- battle_config.arrow_decrement=1;
- battle_config.max_aspd = 199;
- battle_config.max_hp = 32500;
- battle_config.max_sp = 32500;
- battle_config.max_lv = 99; // [MouseJstr]
- battle_config.max_parameter = 99;
- battle_config.max_cart_weight = 8000;
- battle_config.pc_skill_log = 0;
- battle_config.mob_skill_log = 0;
- battle_config.battle_log = 0;
- battle_config.save_log = 0;
- battle_config.error_log = 1;
- battle_config.etc_log = 1;
- battle_config.save_clothcolor = 0;
- battle_config.undead_detect_type = 0;
- battle_config.pc_auto_counter_type = 1;
- battle_config.monster_auto_counter_type = 1;
- battle_config.agi_penaly_type = 0;
- battle_config.agi_penaly_count = 3;
- battle_config.agi_penaly_num = 0;
- battle_config.agi_penaly_count_lv = ATK_FLEE;
- battle_config.vit_penaly_type = 0;
- battle_config.vit_penaly_count = 3;
- battle_config.vit_penaly_num = 0;
- battle_config.vit_penaly_count_lv = ATK_DEF;
- battle_config.player_defense_type = 0;
- battle_config.monster_defense_type = 0;
- battle_config.pet_defense_type = 0;
- battle_config.magic_defense_type = 0;
- battle_config.pc_skill_reiteration = 0;
- battle_config.monster_skill_reiteration = 0;
- battle_config.pc_skill_nofootset = 0;
- battle_config.monster_skill_nofootset = 0;
- battle_config.pc_cloak_check_type = 0;
- battle_config.monster_cloak_check_type = 0;
- battle_config.gvg_short_damage_rate = 100;
- battle_config.gvg_long_damage_rate = 100;
- battle_config.gvg_magic_damage_rate = 100;
- battle_config.gvg_misc_damage_rate = 100;
- battle_config.gvg_eliminate_time = 7000;
- battle_config.mob_changetarget_byskill = 0;
- battle_config.pc_attack_direction_change = 1;
- battle_config.monster_attack_direction_change = 1;
- battle_config.pc_undead_nofreeze = 0;
- battle_config.pc_land_skill_limit = 1;
- battle_config.monster_land_skill_limit = 1;
- battle_config.party_skill_penaly = 1;
- battle_config.monster_class_change_full_recover = 0;
- battle_config.produce_item_name_input = 1;
- battle_config.produce_potion_name_input = 1;
- battle_config.making_arrow_name_input = 1;
- battle_config.holywater_name_input = 1;
- battle_config.display_delay_skill_fail = 1;
- battle_config.chat_warpportal = 0;
- battle_config.mob_warpportal = 0;
- battle_config.dead_branch_active = 0;
- battle_config.vending_max_value = 10000000;
- battle_config.show_steal_in_same_party = 0;
- battle_config.enable_upper_class = 0;
- battle_config.pet_attack_attr_none = 0;
- battle_config.pc_attack_attr_none = 0;
- battle_config.mob_attack_attr_none = 1;
- battle_config.mob_ghostring_fix = 0;
- battle_config.gx_allhit = 0;
- battle_config.gx_cardfix = 0;
- battle_config.gx_dupele = 1;
- battle_config.gx_disptype = 1;
- battle_config.player_skill_partner_check = 1;
- battle_config.hide_GM_session = 0;
- battle_config.unit_movement_type = 0;
- battle_config.invite_request_check = 1;
- battle_config.skill_removetrap_type = 0;
- battle_config.disp_experience = 0;
- battle_config.item_rate_common = 100;
- battle_config.item_rate_equip = 100;
- battle_config.item_rate_card = 100;
- battle_config.item_rate_heal = 100; // Added by Valaris
- battle_config.item_rate_use = 100; // End
- battle_config.item_drop_common_min=1; // Added by TyrNemesis^
- battle_config.item_drop_common_max=10000;
- battle_config.item_drop_equip_min=1;
- battle_config.item_drop_equip_max=10000;
- battle_config.item_drop_card_min=1;
- battle_config.item_drop_card_max=10000;
- battle_config.item_drop_mvp_min=1;
- battle_config.item_drop_mvp_max=10000; // End Addition
- battle_config.item_drop_heal_min=1; // Added by Valaris
- battle_config.item_drop_heal_max=10000;
- battle_config.item_drop_use_min=1;
- battle_config.item_drop_use_max=10000; // End
- battle_config.prevent_logout = 1; // Added by RoVeRT
- battle_config.maximum_level = 255; // Added by Valaris
- battle_config.drops_by_luk = 0; // [Valaris]
- battle_config.equipment_breaking = 0; // [Valaris]
- battle_config.equipment_break_rate = 100; // [Valaris]
- battle_config.pk_mode = 0; // [Valaris]
- battle_config.pet_equip_required = 0; // [Valaris]
- battle_config.multi_level_up = 0; // [Valaris]
- battle_config.backstab_bow_penalty = 0; // Akaru
- battle_config.night_at_start = 0; // added by [Yor]
- battle_config.day_duration = 2*60*60*1000; // added by [Yor] (2 hours)
- battle_config.night_duration = 30*60*1000; // added by [Yor] (30 minutes)
- battle_config.show_mob_hp = 0; // [Valaris]
- battle_config.ban_spoof_namer = 5; // added by [Yor] (default: 5 minutes)
- battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level)
- battle_config.any_warp_GM_min_level = 20; // added by [Yor]
- battle_config.packet_ver_flag = 63; // added by [Yor]
- battle_config.min_hair_style = 0;
- battle_config.max_hair_style = 20;
- battle_config.min_hair_color = 0;
- battle_config.max_hair_color = 9;
- battle_config.min_cloth_color = 0;
- battle_config.max_cloth_color = 4;
-
- battle_config.castrate_dex_scale = 150;
-
- battle_config.area_size = 14;
-
-//SQL-only options start
-#ifndef TXT_ONLY
- battle_config.mail_system = 0;
-//SQL-only options end
-#endif
-}
-
-void battle_validate_conf() {
- if(battle_config.flooritem_lifetime < 1000)
- battle_config.flooritem_lifetime = LIFETIME_FLOORITEM*1000;
- if(battle_config.restart_hp_rate < 0)
- battle_config.restart_hp_rate = 0;
- else if(battle_config.restart_hp_rate > 100)
- battle_config.restart_hp_rate = 100;
- if(battle_config.restart_sp_rate < 0)
- battle_config.restart_sp_rate = 0;
- else if(battle_config.restart_sp_rate > 100)
- battle_config.restart_sp_rate = 100;
- if(battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healhp_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_healsp_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL)
- battle_config.natural_heal_skill_interval=NATURAL_HEAL_INTERVAL;
- if(battle_config.natural_heal_weight_rate < 50)
- battle_config.natural_heal_weight_rate = 50;
- if(battle_config.natural_heal_weight_rate > 101)
- battle_config.natural_heal_weight_rate = 101;
- battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10;
- if(battle_config.monster_max_aspd < 10)
- battle_config.monster_max_aspd = 10;
- if(battle_config.monster_max_aspd > 1000)
- battle_config.monster_max_aspd = 1000;
- battle_config.max_aspd = 2000 - battle_config.max_aspd*10;
- if(battle_config.max_aspd < 10)
- battle_config.max_aspd = 10;
- if(battle_config.max_aspd > 1000)
- battle_config.max_aspd = 1000;
- if(battle_config.max_hp > 1000000)
- battle_config.max_hp = 1000000;
- if(battle_config.max_hp < 100)
- battle_config.max_hp = 100;
- if(battle_config.max_sp > 1000000)
- battle_config.max_sp = 1000000;
- if(battle_config.max_sp < 100)
- battle_config.max_sp = 100;
- if(battle_config.max_parameter < 10)
- battle_config.max_parameter = 10;
- if(battle_config.max_parameter > 10000)
- battle_config.max_parameter = 10000;
- if(battle_config.max_cart_weight > 1000000)
- battle_config.max_cart_weight = 1000000;
- if(battle_config.max_cart_weight < 100)
- battle_config.max_cart_weight = 100;
- battle_config.max_cart_weight *= 10;
-
- if(battle_config.agi_penaly_count < 2)
- battle_config.agi_penaly_count = 2;
- if(battle_config.vit_penaly_count < 2)
- battle_config.vit_penaly_count = 2;
-
- if(battle_config.guild_exp_limit > 99)
- battle_config.guild_exp_limit = 99;
- if(battle_config.guild_exp_limit < 0)
- battle_config.guild_exp_limit = 0;
-
- if(battle_config.castle_defense_rate < 0)
- battle_config.castle_defense_rate = 0;
- if(battle_config.castle_defense_rate > 100)
- battle_config.castle_defense_rate = 100;
- if(battle_config.item_drop_common_min < 1) // Added by TyrNemesis^
- battle_config.item_drop_common_min = 1;
- if(battle_config.item_drop_common_max > 10000)
- battle_config.item_drop_common_max = 10000;
- if(battle_config.item_drop_equip_min < 1)
- battle_config.item_drop_equip_min = 1;
- if(battle_config.item_drop_equip_max > 10000)
- battle_config.item_drop_equip_max = 10000;
- if(battle_config.item_drop_card_min < 1)
- battle_config.item_drop_card_min = 1;
- if(battle_config.item_drop_card_max > 10000)
- battle_config.item_drop_card_max = 10000;
- if(battle_config.item_drop_mvp_min < 1)
- battle_config.item_drop_mvp_min = 1;
- if(battle_config.item_drop_mvp_max > 10000)
- battle_config.item_drop_mvp_max = 10000; // End Addition
-
- if (battle_config.night_at_start < 0) // added by [Yor]
- battle_config.night_at_start = 0;
- else if (battle_config.night_at_start > 1) // added by [Yor]
- battle_config.night_at_start = 1;
- if (battle_config.day_duration < 0) // added by [Yor]
- battle_config.day_duration = 0;
- if (battle_config.night_duration < 0) // added by [Yor]
- battle_config.night_duration = 0;
-
- if (battle_config.ban_spoof_namer < 0) // added by [Yor]
- battle_config.ban_spoof_namer = 0;
- else if (battle_config.ban_spoof_namer > 32767)
- battle_config.ban_spoof_namer = 32767;
-
- if (battle_config.hack_info_GM_level < 0) // added by [Yor]
- battle_config.hack_info_GM_level = 0;
- else if (battle_config.hack_info_GM_level > 100)
- battle_config.hack_info_GM_level = 100;
-
- if (battle_config.any_warp_GM_min_level < 0) // added by [Yor]
- battle_config.any_warp_GM_min_level = 0;
- else if (battle_config.any_warp_GM_min_level > 100)
- battle_config.any_warp_GM_min_level = 100;
-
- // at least 1 client must be accepted
- if ((battle_config.packet_ver_flag & 63) == 0) // added by [Yor]
- battle_config.packet_ver_flag = 63; // accept all clients
-}
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int battle_config_read(const char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- static int count = 0;
-
- if ((count++) == 0)
- battle_set_defaults();
-
- 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;
- if (sscanf(line, "%[^:]:%s", w1, w2) != 2)
- continue;
- battle_set_value(w1, w2);
- if (strcmpi(w1, "import") == 0)
- battle_config_read(w2);
- }
- fclose(fp);
-
- if (--count == 0) {
- battle_validate_conf();
- add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub");
- }
-
- return 0;
-}
+// $Id: battle.c,v 1.10 2004/09/29 21:08:17 Akitasha Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "battle.h"
+
+#include "timer.h"
+#include "nullpo.h"
+#include "malloc.h"
+
+#include "map.h"
+#include "pc.h"
+#include "skill.h"
+#include "mob.h"
+#include "itemdb.h"
+#include "clif.h"
+#include "pet.h"
+#include "guild.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+int attr_fix_table[4][10][10];
+
+struct Battle_Config battle_config;
+
+/*==========================================
+ * “ñ“_ŠÔ‚Ì‹——£‚ð•Ô‚·
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+static int distance(int x0,int y0,int x1,int y1)
+{
+ int dx,dy;
+
+ dx=abs(x0-x1);
+ dy=abs(y0-y1);
+ return dx>dy ? dx : dy;
+}
+
+/*==========================================
+ * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚é‘ÎÛ‚Ì”‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv)
+{
+ nullpo_retr(0, bl);
+ if(bl->type == BL_PC)
+ return pc_counttargeted((struct map_session_data *)bl,src,target_lv);
+ else if(bl->type == BL_MOB)
+ return mob_counttargeted((struct mob_data *)bl,src,target_lv);
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌClass‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_class(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return ((struct mob_data *)bl)->class;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->status.class;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return ((struct pet_data *)bl)->class;
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚Ì•ûŒü‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_dir(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return ((struct mob_data *)bl)->dir;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->dir;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return ((struct pet_data *)bl)->dir;
+ else
+ return 0;
+}
+/*==========================================
+ * ‘Îۂ̃Œƒxƒ‹‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_lv(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].lv;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->status.base_level;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return ((struct pet_data *)bl)->msd->pet.level;
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌŽË’ö‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_range(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].range;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->attackrange;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return mob_db[((struct pet_data *)bl)->class].range;
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌHP‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_hp(struct block_list *bl)
+{
+ nullpo_retr(1, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return ((struct mob_data *)bl)->hp;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->status.hp;
+ else
+ return 1;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌMHP‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_max_hp(struct block_list *bl)
+{
+ nullpo_retr(1, bl);
+ if(bl->type==BL_PC && ((struct map_session_data *)bl))
+ return ((struct map_session_data *)bl)->status.max_hp;
+ else {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int max_hp=1;
+ if(bl->type==BL_MOB && ((struct mob_data*)bl)) {
+ max_hp = mob_db[((struct mob_data*)bl)->class].max_hp;
+ if(mob_db[((struct mob_data*)bl)->class].mexp > 0) {
+ if(battle_config.mvp_hp_rate != 100)
+ max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
+ }
+ else {
+ if(battle_config.monster_hp_rate != 100)
+ max_hp = (max_hp * battle_config.monster_hp_rate)/100;
+ }
+ }
+ else if(bl->type==BL_PET && ((struct pet_data*)bl)) {
+ max_hp = mob_db[((struct pet_data*)bl)->class].max_hp;
+ if(mob_db[((struct pet_data*)bl)->class].mexp > 0) {
+ if(battle_config.mvp_hp_rate != 100)
+ max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
+ }
+ else {
+ if(battle_config.monster_hp_rate != 100)
+ max_hp = (max_hp * battle_config.monster_hp_rate)/100;
+ }
+ }
+ if(sc_data) {
+ if(sc_data[SC_APPLEIDUN].timer!=-1)
+ max_hp += ((5+sc_data[SC_APPLEIDUN].val1*2+((sc_data[SC_APPLEIDUN].val2+1)>>1)
+ +sc_data[SC_APPLEIDUN].val3/10) * max_hp)/100;
+ }
+ if(max_hp < 1) max_hp = 1;
+ return max_hp;
+ }
+ return 1;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌStr‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_str(struct block_list *bl)
+{
+ int str=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && ((struct mob_data *)bl))
+ str = mob_db[((struct mob_data *)bl)->class].str;
+ else if(bl->type==BL_PC && ((struct map_session_data *)bl))
+ return ((struct map_session_data *)bl)->paramc[0];
+ else if(bl->type==BL_PET && ((struct pet_data *)bl))
+ str = mob_db[((struct pet_data *)bl)->class].str;
+
+ if(sc_data) {
+ if(sc_data[SC_LOUD].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
+ str += 4;
+ if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
+ int race=battle_get_race(bl);
+ if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) str >>= 1; // ˆ« –‚/•sŽ€
+ else str += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
+ }
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ str += 5;
+ }
+ if(str < 0) str = 0;
+ return str;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌAgi‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+
+int battle_get_agi(struct block_list *bl)
+{
+ int agi=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ agi=mob_db[((struct mob_data *)bl)->class].agi;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ agi=((struct map_session_data *)bl)->paramc[1];
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ agi=mob_db[((struct pet_data *)bl)->class].agi;
+
+ if(sc_data) {
+ if( sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 &&
+ bl->type != BL_PC) // ‘¬“x‘‰Á(PC‚Ípc.c‚Å)
+ agi += 2+sc_data[SC_INCREASEAGI].val1;
+
+ if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
+ agi += agi*(2+sc_data[SC_CONCENTRATE].val1)/100;
+
+ if(sc_data[SC_DECREASEAGI].timer!=-1) // ‘¬“xŒ¸­
+ agi -= 2+sc_data[SC_DECREASEAGI].val1;
+
+ if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // ƒNƒ@ƒOƒ}ƒCƒA
+ //agi >>= 1;
+ int agib = agi*(sc_data[SC_QUAGMIRE].val1*10)/100;
+ agi -= agib > 50 ? 50 : agib;
+ }
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ agi += 5;
+ }
+ if(agi < 0) agi = 0;
+ return agi;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌVit‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_vit(struct block_list *bl)
+{
+ int vit=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ vit=mob_db[((struct mob_data *)bl)->class].vit;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ vit=((struct map_session_data *)bl)->paramc[2];
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ vit=mob_db[((struct pet_data *)bl)->class].vit;
+ if(sc_data) {
+ if(sc_data[SC_STRIPARMOR].timer != -1 && bl->type!=BL_PC)
+ vit = vit*60/100;
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ vit += 5;
+ }
+
+ if(vit < 0) vit = 0;
+ return vit;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌInt‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_int(struct block_list *bl)
+{
+ int int_=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ int_=mob_db[((struct mob_data *)bl)->class].int_;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ int_=((struct map_session_data *)bl)->paramc[3];
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ int_=mob_db[((struct pet_data *)bl)->class].int_;
+
+ if(sc_data) {
+ if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
+ int race=battle_get_race(bl);
+ if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) int_ >>= 1; // ˆ« –‚/•sŽ€
+ else int_ += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
+ }
+ if( sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC)
+ int_ = int_*60/100;
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ int_ += 5;
+ }
+ if(int_ < 0) int_ = 0;
+ return int_;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌDex‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_dex(struct block_list *bl)
+{
+ int dex=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ dex=mob_db[((struct mob_data *)bl)->class].dex;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ dex=((struct map_session_data *)bl)->paramc[4];
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ dex=mob_db[((struct pet_data *)bl)->class].dex;
+
+ if(sc_data) {
+ if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC)
+ dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100;
+
+ if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ƒuƒŒƒbƒVƒ“ƒO
+ int race=battle_get_race(bl);
+ if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) dex >>= 1; // ˆ« –‚/•sŽ€
+ else dex += sc_data[SC_BLESSING].val1; // ‚»‚Ì‘¼
+ }
+
+ if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // ƒNƒ@ƒOƒ}ƒCƒA
+ // dex >>= 1;
+ int dexb = dex*(sc_data[SC_QUAGMIRE].val1*10)/100;
+ dex -= dexb > 50 ? 50 : dexb;
+ }
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ dex += 5;
+ }
+ if(dex < 0) dex = 0;
+ return dex;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌLuk‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_luk(struct block_list *bl)
+{
+ int luk=0;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ luk=mob_db[((struct mob_data *)bl)->class].luk;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ luk=((struct map_session_data *)bl)->paramc[5];
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ luk=mob_db[((struct pet_data *)bl)->class].luk;
+
+ if(sc_data) {
+ if(sc_data[SC_GLORIA].timer!=-1 && bl->type != BL_PC) // ƒOƒƒŠƒA(PC‚Ípc.c‚Å)
+ luk += 30;
+ if(sc_data[SC_CURSE].timer!=-1 ) // Žô‚¢
+ luk=0;
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ luk += 5;
+ }
+ if(luk < 0) luk = 0;
+ return luk;
+}
+
+/*==========================================
+ * ‘ÎÛ‚ÌFlee‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_flee(struct block_list *bl)
+{
+ int flee=1;
+ struct status_change *sc_data;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ flee=((struct map_session_data *)bl)->flee;
+ else
+ flee=battle_get_agi(bl) + battle_get_lv(bl);
+
+ if(sc_data) {
+ if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
+ flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
+ +(sc_data[SC_WHISTLE].val3>>16))/100;
+ if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC)
+ flee -= flee*25/100;
+ if(sc_data[SC_WINDWALK].timer!=-1 && bl->type != BL_PC) // ƒEƒBƒ“ƒhƒEƒH[ƒN
+ flee += flee*(sc_data[SC_WINDWALK].val2)/100;
+ if(sc_data[SC_SPIDERWEB].timer!=-1 && bl->type != BL_PC) //ƒXƒpƒCƒ_[ƒEƒFƒu
+ flee -= flee*50/100;
+ }
+ if(flee < 1) flee = 1;
+ return flee;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌHit‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_hit(struct block_list *bl)
+{
+ int hit=1;
+ struct status_change *sc_data;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ hit=((struct map_session_data *)bl)->hit;
+ else
+ hit=battle_get_dex(bl) + battle_get_lv(bl);
+
+ if(sc_data) {
+ if(sc_data[SC_HUMMING].timer!=-1 && bl->type != BL_PC) //
+ hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2
+ +sc_data[SC_HUMMING].val3)/100;
+ if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) // Žô‚¢
+ hit -= hit*25/100;
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // ƒgƒDƒ‹[ƒTƒCƒg
+ hit += 3*(sc_data[SC_TRUESIGHT].val1);
+ if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100;
+ }
+ if(hit < 1) hit = 1;
+ return hit;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌŠ®‘S‰ñ”ð‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_flee2(struct block_list *bl)
+{
+ int flee2=1;
+ struct status_change *sc_data;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl){
+ flee2 = battle_get_luk(bl) + 10;
+ flee2 += ((struct map_session_data *)bl)->flee2 - (((struct map_session_data *)bl)->paramc[5] + 10);
+ }
+ else
+ flee2=battle_get_luk(bl)+1;
+
+ if(sc_data) {
+ if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC)
+ flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
+ +(sc_data[SC_WHISTLE].val3&0xffff))*10;
+ }
+ if(flee2 < 1) flee2 = 1;
+ return flee2;
+}
+/*==========================================
+ * ‘Îۂ̃NƒŠƒeƒBƒJƒ‹‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_critical(struct block_list *bl)
+{
+ int critical=1;
+ struct status_change *sc_data;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl){
+ critical = battle_get_luk(bl)*3 + 10;
+ critical += ((struct map_session_data *)bl)->critical - ((((struct map_session_data *)bl)->paramc[5]*3) + 10);
+ }
+ else
+ critical=battle_get_luk(bl)*3 + 1;
+
+ if(sc_data) {
+ if(sc_data[SC_FORTUNE].timer!=-1 && bl->type != BL_PC)
+ critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2
+ +sc_data[SC_FORTUNE].val3)*10;
+ if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1 && bl->type != BL_PC)
+ critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
+ if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) //ƒgƒDƒ‹[ƒTƒCƒg
+ critical += critical*sc_data[SC_TRUESIGHT].val1/100;
+ }
+ if(critical < 1) critical = 1;
+ return critical;
+}
+/*==========================================
+ * base_atk‚̎擾
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_baseatk(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ int batk=1;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ batk = ((struct map_session_data *)bl)->base_atk; //ݒ肳‚ê‚Ä‚¢‚ébase_atk
+ else { //‚»‚êˆÈŠO‚È‚ç
+ int str,dstr;
+ str = battle_get_str(bl); //STR
+ dstr = str/10;
+ batk = dstr*dstr + str; //base_atk‚ðŒvŽZ‚·‚é
+ }
+ if(sc_data) { //ó‘ÔˆÙí‚ ‚è
+ if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) //PC‚Ńvƒƒ{ƒbƒN(SM_PROVOKE)ó‘Ô
+ batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100; //base_atk‘‰Á
+ if(sc_data[SC_CURSE].timer!=-1 ) //Žô‚í‚ê‚Ä‚¢‚½‚ç
+ batk -= batk*25/100; //base_atk‚ª25%Œ¸­
+ if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100;
+ if(sc_data[SC_EDP].timer != -1) // [Celest]
+ batk += batk*(50+50*sc_data[SC_EDP].val1)/100;
+ }
+ if(batk < 1) batk = 1; //base_atk‚ÍÅ’á‚Å‚à1
+ return batk;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌAtk‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_atk(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ int atk=0;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ atk = ((struct map_session_data*)bl)->watk;
+ else if(bl->type==BL_MOB && (struct mob_data *)bl)
+ atk = mob_db[((struct mob_data*)bl)->class].atk1;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ atk = mob_db[((struct pet_data*)bl)->class].atk1;
+
+ if(sc_data) {
+ if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
+ atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100;
+ if(sc_data[SC_CURSE].timer!=-1 )
+ atk -= atk*25/100;
+ if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100;
+ }
+ if(atk < 0) atk = 0;
+ return atk;
+}
+/*==========================================
+ * ‘Îۂ̶ŽèAtk‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_atk_(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl){
+ int atk=((struct map_session_data*)bl)->watk_;
+
+ if(((struct map_session_data *)bl)->sc_data[SC_CURSE].timer!=-1 )
+ atk -= atk*25/100;
+ return atk;
+ }
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌAtk2‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_atk2(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data*)bl)->watk2;
+ else {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int atk2=0;
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ atk2 = mob_db[((struct mob_data*)bl)->class].atk2;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ atk2 = mob_db[((struct pet_data*)bl)->class].atk2;
+ if(sc_data) {
+ if( sc_data[SC_IMPOSITIO].timer!=-1)
+ atk2 += sc_data[SC_IMPOSITIO].val1*5;
+ if( sc_data[SC_PROVOKE].timer!=-1 )
+ atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100;
+ if( sc_data[SC_CURSE].timer!=-1 )
+ atk2 -= atk2*25/100;
+ if(sc_data[SC_DRUMBATTLE].timer!=-1)
+ atk2 += sc_data[SC_DRUMBATTLE].val2;
+ if(sc_data[SC_NIBELUNGEN].timer!=-1 && (battle_get_element(bl)/10) >= 8 )
+ atk2 += sc_data[SC_NIBELUNGEN].val2;
+ if(sc_data[SC_STRIPWEAPON].timer!=-1)
+ atk2 = atk2*90/100;
+ if(sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
+ }
+ if(atk2 < 0) atk2 = 0;
+ return atk2;
+ }
+ return 0;
+}
+/*==========================================
+ * ‘Îۂ̶ŽèAtk2‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_atk_2(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data*)bl)->watk_2;
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌMAtk1‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_matk1(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_MOB){
+ int matk,int_=battle_get_int(bl);
+ matk = int_+(int_/5)*(int_/5);
+
+ if(sc_data)
+ if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
+ return matk;
+ }
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->matk1;
+ else if(bl->type==BL_PET){
+ int matk,int_=battle_get_int(bl);
+ matk = int_+(int_/5)*(int_/5);
+
+ if(sc_data)
+ if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
+ return matk;
+ }
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌMAtk2‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_matk2(struct block_list *bl)
+{
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB){
+ int matk,int_=battle_get_int(bl);
+ matk = int_+(int_/7)*(int_/7);
+
+ if(sc_data)
+ if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
+ return matk;
+ }
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->matk2;
+ else if(bl->type==BL_PET){
+ int matk,int_=battle_get_int(bl);
+ matk = int_+(int_/7)*(int_/7);
+ if(sc_data)
+ if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
+ return matk;
+ }
+ else
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌDef‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_def(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ int def=0,skilltimer=-1,skillid=0;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl){
+ def = ((struct map_session_data *)bl)->def;
+ skilltimer = ((struct map_session_data *)bl)->skilltimer;
+ skillid = ((struct map_session_data *)bl)->skillid;
+ }
+ else if(bl->type==BL_MOB && (struct mob_data *)bl) {
+ def = mob_db[((struct mob_data *)bl)->class].def;
+ skilltimer = ((struct mob_data *)bl)->skilltimer;
+ skillid = ((struct mob_data *)bl)->skillid;
+ }
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ def = mob_db[((struct pet_data *)bl)->class].def;
+
+ if(def < 1000000) {
+ if(sc_data) {
+ //ƒL[ƒsƒ“ƒOŽž‚ÍDEF100
+ if( sc_data[SC_KEEPING].timer!=-1)
+ def = 100;
+ //ƒvƒƒ{ƒbƒNŽž‚ÍŒ¸ŽZ
+ if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
+ def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
+ //푾ŒÛ‚Ì‹¿‚«Žž‚͉ÁŽZ
+ if( sc_data[SC_DRUMBATTLE].timer!=-1 && bl->type != BL_PC)
+ def += sc_data[SC_DRUMBATTLE].val3;
+ //“Å‚É‚©‚©‚Á‚Ä‚¢‚鎞‚ÍŒ¸ŽZ
+ if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
+ def = def*75/100;
+ //ƒXƒgƒŠƒbƒvƒV[ƒ‹ƒhŽž‚ÍŒ¸ŽZ
+ if(sc_data[SC_STRIPSHIELD].timer!=-1 && bl->type != BL_PC)
+ def = def*85/100;
+ //ƒVƒOƒiƒ€ƒNƒ‹ƒVƒXŽž‚ÍŒ¸ŽZ
+ if(sc_data[SC_SIGNUMCRUCIS].timer!=-1 && bl->type != BL_PC)
+ def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100;
+ //‰i‰“‚̬“׎ž‚ÍDEF0‚É‚È‚é
+ if(sc_data[SC_ETERNALCHAOS].timer!=-1 && bl->type != BL_PC)
+ def = 0;
+ //“€Œ‹AΉ»Žž‚͉EƒVƒtƒg
+ if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
+ def >>= 1;
+ //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
+ if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC)
+ def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100;
+ }
+ //‰r¥’†‚͉r¥ŽžŒ¸ŽZ—¦‚ÉŠî‚¢‚ÄŒ¸ŽZ
+ if(skilltimer != -1) {
+ int def_rate = skill_get_castdef(skillid);
+ if(def_rate != 0)
+ def = (def * (100 - def_rate))/100;
+ }
+ }
+ if(def < 0) def = 0;
+ return def;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌMDef‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_mdef(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ int mdef=0;
+
+ nullpo_retr(0, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ mdef = ((struct map_session_data *)bl)->mdef;
+ else if(bl->type==BL_MOB && (struct mob_data *)bl)
+ mdef = mob_db[((struct mob_data *)bl)->class].mdef;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ mdef = mob_db[((struct pet_data *)bl)->class].mdef;
+
+ if(mdef < 1000000) {
+ if(sc_data) {
+ //ƒoƒŠƒA[ó‘ÔŽž‚ÍMDEF100
+ if(sc_data[SC_BARRIER].timer != -1)
+ mdef = 100;
+ //“€Œ‹AΉ»Žž‚Í1.25”{
+ if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
+ mdef = mdef*125/100;
+ if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ mdef -= (mdef*6*sc_data[SC_MINDBREAKER].val1)/100;
+ }
+ }
+ if(mdef < 0) mdef = 0;
+ return mdef;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌDef2‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ *------------------------------------------
+ */
+int battle_get_def2(struct block_list *bl)
+{
+ struct status_change *sc_data;
+ int def2=1;
+
+ nullpo_retr(1, bl);
+ sc_data=battle_get_sc_data(bl);
+ if(bl->type==BL_PC)
+ def2 = ((struct map_session_data *)bl)->def2;
+ else if(bl->type==BL_MOB)
+ def2 = mob_db[((struct mob_data *)bl)->class].vit;
+ else if(bl->type==BL_PET)
+ def2 = mob_db[((struct pet_data *)bl)->class].vit;
+
+ if(sc_data) {
+ if( sc_data[SC_ANGELUS].timer!=-1 && bl->type != BL_PC)
+ def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100;
+ if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC)
+ def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
+ if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC)
+ def2 = def2*75/100;
+ //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“Žž‚ÍŒ¸ŽZ
+ if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC)
+ def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100;
+ }
+ if(def2 < 1) def2 = 1;
+ return def2;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌMDef2‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å0ˆÈã
+ *------------------------------------------
+ */
+int battle_get_mdef2(struct block_list *bl)
+{
+ int mdef2=0;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB)
+ mdef2 = mob_db[((struct mob_data *)bl)->class].int_ + (mob_db[((struct mob_data *)bl)->class].vit>>1);
+ else if(bl->type==BL_PC)
+ mdef2 = ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1);
+ else if(bl->type==BL_PET)
+ mdef2 = mob_db[((struct pet_data *)bl)->class].int_ + (mob_db[((struct pet_data *)bl)->class].vit>>1);
+ if(sc_data) {
+ if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
+ mdef2 -= (mdef2*6*sc_data[SC_MINDBREAKER].val1)/100;
+ }
+ if(mdef2 < 0) mdef2 = 0;
+ return mdef2;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌSpeed(ˆÚ“®‘¬“x)‚ð•Ô‚·(”Ä—p)
+ * –ß‚è‚Í®”‚Å1ˆÈã
+ * Speed‚ͬ‚³‚¢‚Ù‚¤‚ªˆÚ“®‘¬“x‚ª‘¬‚¢
+ *------------------------------------------
+ */
+int battle_get_speed(struct block_list *bl)
+{
+ nullpo_retr(1000, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->speed;
+ else {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int speed = 1000;
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+// speed = mob_db[((struct mob_data *)bl)->class].speed;
+ speed = ((struct mob_data *)bl)->speed;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ speed = ((struct pet_data *)bl)->msd->petDB->speed;
+
+ if(sc_data) {
+ //‘¬“x‘‰ÁŽž‚Í25%Œ¸ŽZ
+ if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1)
+ speed -= speed*25/100;
+ //‘¬“xŒ¸­Žž‚Í25%‰ÁŽZ
+ if(sc_data[SC_DECREASEAGI].timer!=-1)
+ speed = speed*125/100;
+ //ƒNƒ@ƒOƒ}ƒCƒAŽž‚Í50%‰ÁŽZ
+ if(sc_data[SC_QUAGMIRE].timer!=-1)
+ speed = speed*3/2;
+ //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
+ if(sc_data[SC_DONTFORGETME].timer!=-1)
+ speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100;
+ //‹à„Žž‚Í25%‰ÁŽZ
+ if(sc_data[SC_STEELBODY].timer!=-1)
+ speed = speed*125/100;
+ //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
+ if(sc_data[SC_DEFENDER].timer!=-1)
+ speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;
+ //—x‚èó‘Ô‚Í4”{’x‚¢
+ if(sc_data[SC_DANCING].timer!=-1 )
+ speed*=4;
+ //Žô‚¢Žž‚Í450‰ÁŽZ
+ if(sc_data[SC_CURSE].timer!=-1)
+ speed = speed + 450;
+ //ƒEƒBƒ“ƒhƒEƒH[ƒNŽž‚ÍLv*2%Œ¸ŽZ
+ if(sc_data[SC_WINDWALK].timer!=-1)
+ speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
+ }
+ if(speed < 1) speed = 1;
+ return speed;
+ }
+
+ return 1000;
+}
+/*==========================================
+ * ‘ÎÛ‚ÌaDelay(UŒ‚ŽžƒfƒBƒŒƒC)‚ð•Ô‚·(”Ä—p)
+ * aDelay‚ͬ‚³‚¢‚Ù‚¤‚ªUŒ‚‘¬“x‚ª‘¬‚¢
+ *------------------------------------------
+ */
+int battle_get_adelay(struct block_list *bl)
+{
+ nullpo_retr(4000, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return (((struct map_session_data *)bl)->aspd<<1);
+ else {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int adelay=4000,aspd_rate = 100,i;
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ adelay = mob_db[((struct mob_data *)bl)->class].adelay;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ adelay = mob_db[((struct pet_data *)bl)->class].adelay;
+
+ if(sc_data) {
+ //ƒc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“Žg—pŽž‚ŃNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í3Š„Œ¸ŽZ
+ if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
+ aspd_rate -= 30;
+ //ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…Žg—pŽž‚Ńc[ƒnƒ“ƒhƒNƒCƒbƒPƒ“‚Å‚àƒNƒ@ƒOƒ}ƒCƒA‚Å‚àŽ„‚ð–Y‚ê‚È‚¢‚Åc‚Å‚à‚È‚¢Žž‚Í
+ if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
+ sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
+ //Žg—pŽÒ‚ƃp[ƒeƒBƒƒ“ƒo[‚ÅŠi·‚ªo‚éÝ’è‚Å‚È‚¯‚ê‚Î3Š„Œ¸ŽZ
+ if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
+ aspd_rate -= 30;
+ //‚»‚¤‚Å‚È‚¯‚ê‚Î2.5Š„Œ¸ŽZ
+ else
+ aspd_rate -= 25;
+ }
+ //ƒXƒsƒAƒNƒBƒbƒPƒ“Žž‚ÍŒ¸ŽZ
+ if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
+ sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
+ aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
+ //—[“ú‚̃AƒTƒVƒ“ƒNƒƒXŽž‚ÍŒ¸ŽZ
+ if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
+ sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
+ sc_data[SC_DONTFORGETME].timer == -1)
+ aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
+ //Ž„‚ð–Y‚ê‚È‚¢‚ÅcŽž‚͉ÁŽZ
+ if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
+ aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
+ //‹à„Žž25%‰ÁŽZ
+ if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
+ aspd_rate += 25;
+ //‘‘¬ƒ|[ƒVƒ‡ƒ“Žg—pŽž‚ÍŒ¸ŽZ
+ if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
+ aspd_rate -= sc_data[i].val2;
+ //ƒfƒBƒtƒFƒ“ƒ_[Žž‚͉ÁŽZ
+ if(sc_data[SC_DEFENDER].timer != -1)
+ adelay += (1100 - sc_data[SC_DEFENDER].val1*100);
+ }
+ if(aspd_rate != 100)
+ adelay = adelay*aspd_rate/100;
+ if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1;
+ return adelay;
+ }
+ return 4000;
+}
+int battle_get_amotion(struct block_list *bl)
+{
+ nullpo_retr(2000, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->amotion;
+ else {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int amotion=2000,aspd_rate = 100,i;
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ amotion = mob_db[((struct mob_data *)bl)->class].amotion;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ amotion = mob_db[((struct pet_data *)bl)->class].amotion;
+
+ if(sc_data) {
+ if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
+ aspd_rate -= 30;
+ if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
+ sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
+ if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
+ aspd_rate -= 30;
+ else
+ aspd_rate -= 25;
+ }
+ if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
+ sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
+ aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
+ if(sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
+ sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
+ sc_data[SC_DONTFORGETME].timer == -1)
+ aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
+ if(sc_data[SC_DONTFORGETME].timer!=-1) // Ž„‚ð–Y‚ê‚È‚¢‚Å
+ aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
+ if(sc_data[SC_STEELBODY].timer!=-1) // ‹à„
+ aspd_rate += 25;
+ if( sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
+ aspd_rate -= sc_data[i].val2;
+ if(sc_data[SC_DEFENDER].timer != -1)
+ amotion += (550 - sc_data[SC_DEFENDER].val1*50);
+ }
+ if(aspd_rate != 100)
+ amotion = amotion*aspd_rate/100;
+ if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd;
+ return amotion;
+ }
+ return 2000;
+}
+int battle_get_dmotion(struct block_list *bl)
+{
+ int ret;
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ sc_data = battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl){
+ ret=mob_db[((struct mob_data *)bl)->class].dmotion;
+ if(battle_config.monster_damage_delay_rate != 100)
+ ret = ret*battle_config.monster_damage_delay_rate/400;
+ }
+ else if(bl->type==BL_PC && (struct map_session_data *)bl){
+ ret=((struct map_session_data *)bl)->dmotion;
+ if(battle_config.pc_damage_delay_rate != 100)
+ ret = ret*battle_config.pc_damage_delay_rate/400;
+ }
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ ret=mob_db[((struct pet_data *)bl)->class].dmotion;
+ else
+ return 2000;
+
+ if((sc_data && sc_data[SC_ENDURE].timer!=-1) ||
+ (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
+ ret=0;
+
+ return ret;
+}
+int battle_get_element(struct block_list *bl)
+{
+ int ret = 20;
+ struct status_change *sc_data;
+
+ nullpo_retr(ret, bl);
+ sc_data = battle_get_sc_data(bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl) // 10‚̈ÊLv*2A‚P‚̈ʑ®«
+ ret=((struct mob_data *)bl)->def_ele;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ ret=20+((struct map_session_data *)bl)->def_ele; // –hŒä‘®«Lv1
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ ret = mob_db[((struct pet_data *)bl)->class].element;
+
+ if(sc_data) {
+ if( sc_data[SC_BENEDICTIO].timer!=-1 ) // ¹‘Ì~•Ÿ
+ ret=26;
+ if( sc_data[SC_FREEZE].timer!=-1 ) // “€Œ‹
+ ret=21;
+ if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
+ ret=22;
+ }
+
+ return ret;
+}
+int battle_get_attack_element(struct block_list *bl)
+{
+ int ret = 0;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ ret=0;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ ret=((struct map_session_data *)bl)->atk_ele;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ ret=0;
+
+ if(sc_data) {
+ if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
+ ret=1;
+ if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
+ ret=2;
+ if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
+ ret=3;
+ if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
+ ret=4;
+ if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
+ ret=5;
+ if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
+ ret=6;
+ }
+
+ return ret;
+}
+int battle_get_attack_element2(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl) {
+ int ret = ((struct map_session_data *)bl)->atk_ele_;
+ struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data;
+
+ if(sc_data) {
+ if( sc_data[SC_FROSTWEAPON].timer!=-1) // ƒtƒƒXƒgƒEƒFƒ|ƒ“
+ ret=1;
+ if( sc_data[SC_SEISMICWEAPON].timer!=-1) // ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“
+ ret=2;
+ if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // ƒtƒŒ[ƒ€ƒ‰ƒ“ƒ`ƒƒ[
+ ret=3;
+ if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ƒ‰ƒCƒgƒjƒ“ƒOƒ[ƒ_[
+ ret=4;
+ if( sc_data[SC_ENCPOISON].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“
+ ret=5;
+ if( sc_data[SC_ASPERSIO].timer!=-1) // ƒAƒXƒyƒ‹ƒVƒI
+ ret=6;
+ }
+ return ret;
+ }
+ return 0;
+}
+int battle_get_party_id(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->status.party_id;
+ else if(bl->type==BL_MOB && (struct mob_data *)bl){
+ struct mob_data *md=(struct mob_data *)bl;
+ if( md->master_id>0 )
+ return -md->master_id;
+ return -md->bl.id;
+ }
+ else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
+ return ((struct skill_unit *)bl)->group->party_id;
+ else
+ return 0;
+}
+int battle_get_guild_id(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data *)bl)->status.guild_id;
+ else if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return ((struct mob_data *)bl)->class;
+ else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
+ return ((struct skill_unit *)bl)->group->guild_id;
+ else
+ return 0;
+}
+int battle_get_race(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].race;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return 7;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return mob_db[((struct pet_data *)bl)->class].race;
+ else
+ return 0;
+}
+int battle_get_size(struct block_list *bl)
+{
+ nullpo_retr(1, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].size;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return 1;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return mob_db[((struct pet_data *)bl)->class].size;
+ else
+ return 1;
+}
+int battle_get_mode(struct block_list *bl)
+{
+ nullpo_retr(0x01, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].mode;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return mob_db[((struct pet_data *)bl)->class].mode;
+ else
+ return 0x01; // ‚Æ‚è‚ ‚¦‚¸“®‚­‚Æ‚¢‚¤‚±‚Æ‚Å1
+}
+
+int battle_get_mexp(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return mob_db[((struct mob_data *)bl)->class].mexp;
+ else if(bl->type==BL_PET && (struct pet_data *)bl)
+ return mob_db[((struct pet_data *)bl)->class].mexp;
+ else
+ return 0;
+}
+
+// StatusChangeŒn‚ÌŠ“¾
+struct status_change *battle_get_sc_data(struct block_list *bl)
+{
+ nullpo_retr(NULL, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return ((struct mob_data*)bl)->sc_data;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return ((struct map_session_data*)bl)->sc_data;
+ return NULL;
+}
+short *battle_get_sc_count(struct block_list *bl)
+{
+ nullpo_retr(NULL, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return &((struct mob_data*)bl)->sc_count;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return &((struct map_session_data*)bl)->sc_count;
+ return NULL;
+}
+short *battle_get_opt1(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return &((struct mob_data*)bl)->opt1;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return &((struct map_session_data*)bl)->opt1;
+ else if(bl->type==BL_NPC && (struct npc_data *)bl)
+ return &((struct npc_data*)bl)->opt1;
+ return 0;
+}
+short *battle_get_opt2(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return &((struct mob_data*)bl)->opt2;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return &((struct map_session_data*)bl)->opt2;
+ else if(bl->type==BL_NPC && (struct npc_data *)bl)
+ return &((struct npc_data*)bl)->opt2;
+ return 0;
+}
+short *battle_get_opt3(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return &((struct mob_data*)bl)->opt3;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return &((struct map_session_data*)bl)->opt3;
+ else if(bl->type==BL_NPC && (struct npc_data *)bl)
+ return &((struct npc_data*)bl)->opt3;
+ return 0;
+}
+short *battle_get_option(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB && (struct mob_data *)bl)
+ return &((struct mob_data*)bl)->option;
+ else if(bl->type==BL_PC && (struct map_session_data *)bl)
+ return &((struct map_session_data*)bl)->status.option;
+ else if(bl->type==BL_NPC && (struct npc_data *)bl)
+ return &((struct npc_data*)bl)->option;
+ return 0;
+}
+
+//-------------------------------------------------------------------
+
+// ƒ_ƒ[ƒW‚Ì’x‰„
+struct battle_delay_damage_ {
+ struct block_list *src,*target;
+ int damage;
+ int flag;
+};
+int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data)
+{
+ struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data;
+ if( dat && map_id2bl(id)==dat->src && dat->target->prev!=NULL)
+ battle_damage(dat->src,dat->target,dat->damage,dat->flag);
+ free(dat);
+ return 0;
+}
+int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag)
+{
+ struct battle_delay_damage_ *dat = (struct battle_delay_damage_*)aCalloc(1,sizeof(struct battle_delay_damage_));
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, target);
+
+
+ dat->src=src;
+ dat->target=target;
+ dat->damage=damage;
+ dat->flag=flag;
+ add_timer(tick,battle_delay_damage_sub,src->id,(int)dat);
+ return 0;
+}
+
+// ŽÀÛ‚ÉHP‚ð‘€ì
+int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag)
+{
+ struct map_session_data *sd=NULL;
+ struct status_change *sc_data=battle_get_sc_data(target);
+ short *sc_count;
+ int i;
+
+ nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
+
+ if(damage==0 || target->type == BL_PET)
+ return 0;
+
+ if(target->prev == NULL)
+ return 0;
+
+ if(bl) {
+ if(bl->prev==NULL)
+ return 0;
+
+ if(bl->type==BL_PC)
+ sd=(struct map_session_data *)bl;
+ }
+
+ if(damage<0)
+ return battle_heal(bl,target,-damage,0,flag);
+
+ if(!flag && (sc_count=battle_get_sc_count(target))!=NULL && *sc_count>0){
+ // “€Œ‹AΉ»A‡–°‚ðÁ‹Ž
+ if(sc_data[SC_FREEZE].timer!=-1)
+ skill_status_change_end(target,SC_FREEZE,-1);
+ if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
+ skill_status_change_end(target,SC_STONE,-1);
+ if(sc_data[SC_SLEEP].timer!=-1)
+ skill_status_change_end(target,SC_SLEEP,-1);
+ }
+
+ if(target->type==BL_MOB){ // MOB
+ struct mob_data *md=(struct mob_data *)target;
+ if(md && md->skilltimer!=-1 && md->state.skillcastcancel) // ‰r¥–WŠQ
+ skill_castcancel(target,0);
+ return mob_damage(bl,md,damage,0);
+ }
+ else if(target->type==BL_PC){ // PC
+
+ struct map_session_data *tsd=(struct map_session_data *)target;
+
+ if(tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1){ // ƒfƒBƒ{[ƒVƒ‡ƒ“‚ð‚©‚¯‚ç‚ê‚Ä‚¢‚é
+ struct map_session_data *md = map_id2sd(tsd->sc_data[SC_DEVOTION].val1);
+ if(md && skill_devotion3(&md->bl,target->id)){
+ skill_devotion(md,target->id);
+ }
+ else if(md && bl)
+ for(i=0;i<5;i++)
+ if(md->dev.val1[i] == target->id){
+ clif_damage(bl,&md->bl, gettick(), 0, 0,
+ damage, 0 , 0, 0);
+ pc_damage(&md->bl,md,damage);
+
+ return 0;
+ }
+ }
+
+ if(tsd && tsd->skilltimer!=-1){ // ‰r¥–WŠQ
+ // ƒtƒFƒ“ƒJ[ƒh‚â–WŠQ‚³‚ê‚È‚¢ƒXƒLƒ‹‚©‚ÌŒŸ¸
+ if( (!tsd->special_state.no_castcancel || map[bl->m].flag.gvg) && tsd->state.skillcastcancel &&
+ !tsd->special_state.no_castcancel2)
+ skill_castcancel(target,0);
+ }
+
+ return pc_damage(bl,tsd,damage);
+
+ }
+ else if(target->type==BL_SKILL)
+ return skill_unit_ondamaged((struct skill_unit *)target,bl,damage,gettick());
+ return 0;
+}
+int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag)
+{
+ nullpo_retr(0, target); //bl‚ÍNULL‚ŌĂ΂ê‚邱‚Æ‚ª‚ ‚é‚Ì‚Å‘¼‚Ń`ƒFƒbƒN
+
+ if(target->type == BL_PET)
+ return 0;
+ if( target->type ==BL_PC && pc_isdead((struct map_session_data *)target) )
+ return 0;
+ if(hp==0 && sp==0)
+ return 0;
+
+ if(hp<0)
+ return battle_damage(bl,target,-hp,flag);
+
+ if(target->type==BL_MOB)
+ return mob_heal((struct mob_data *)target,hp);
+ else if(target->type==BL_PC)
+ return pc_heal((struct map_session_data *)target,hp,sp);
+ return 0;
+}
+
+// UŒ‚’âŽ~
+int battle_stopattack(struct block_list *bl)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB)
+ return mob_stopattack((struct mob_data*)bl);
+ else if(bl->type==BL_PC)
+ return pc_stopattack((struct map_session_data*)bl);
+ else if(bl->type==BL_PET)
+ return pet_stopattack((struct pet_data*)bl);
+ return 0;
+}
+// ˆÚ“®’âŽ~
+int battle_stopwalking(struct block_list *bl,int type)
+{
+ nullpo_retr(0, bl);
+ if(bl->type==BL_MOB)
+ return mob_stop_walking((struct mob_data*)bl,type);
+ else if(bl->type==BL_PC)
+ return pc_stop_walking((struct map_session_data*)bl,type);
+ else if(bl->type==BL_PET)
+ return pet_stop_walking((struct pet_data*)bl,type);
+ return 0;
+}
+
+
+/*==========================================
+ * ƒ_ƒ[ƒW‚Ì‘®«C³
+ *------------------------------------------
+ */
+int battle_attr_fix(int damage,int atk_elem,int def_elem)
+{
+ int def_type= def_elem%10, def_lv=def_elem/10/2;
+
+ if( atk_elem<0 || atk_elem>9 || def_type<0 || def_type>9 ||
+ def_lv<1 || def_lv>4){ // ‘® «’l‚ª‚¨‚©‚µ‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸‚»‚Ì‚Ü‚Ü•Ô‚·
+ if(battle_config.error_log)
+ printf("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
+ return damage;
+ }
+
+ return damage*attr_fix_table[def_lv-1][atk_elem][def_type]/100;
+}
+
+
+/*==========================================
+ * ƒ_ƒ[ƒ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)
+{
+ struct map_session_data *sd=NULL;
+ struct mob_data *md=NULL;
+ struct status_change *sc_data,*sc;
+ short *sc_count;
+ int class;
+
+ nullpo_retr(0, bl);
+
+ class = battle_get_class(bl);
+ if(bl->type==BL_MOB) md=(struct mob_data *)bl;
+ else sd=(struct map_session_data *)bl;
+
+ sc_data=battle_get_sc_data(bl);
+ sc_count=battle_get_sc_count(bl);
+
+ if(sc_count!=NULL && *sc_count>0){
+
+ if(sc_data[SC_SAFETYWALL].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_SHORT && skill_num != NPC_GUIDEDATTACK){
+ // ƒZ[ƒtƒeƒBƒEƒH[ƒ‹
+ struct skill_unit *unit=(struct skill_unit*)sc_data[SC_SAFETYWALL].val2;
+ if( unit && unit->alive && (--unit->group->val2)<=0 )
+ skill_delunit(unit);
+ skill_unit_move(bl,gettick(),1); // d‚ËŠ|‚¯ƒ`ƒFƒbƒN
+ damage=0;
+ }
+ if(sc_data[SC_PNEUMA].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_LONG && skill_num != NPC_GUIDEDATTACK){
+ // ƒjƒ…[ƒ}
+ damage=0;
+ }
+
+ if(sc_data[SC_ROKISWEIL].timer!=-1 && damage>0 &&
+ flag&BF_MAGIC ){
+ // ƒjƒ…[ƒ}
+ damage=0;
+ }
+
+ if(sc_data[SC_AETERNA].timer!=-1 && damage>0){ // ƒŒƒbƒNƒXƒG[ƒeƒ‹ƒi
+ damage<<=1;
+ skill_status_change_end( bl,SC_AETERNA,-1 );
+ }
+
+ //‘®«ê‚̃_ƒ[ƒW‘‰Á
+ if(sc_data[SC_VOLCANO].timer!=-1){ // ƒ{ƒ‹ƒP[ƒm
+ if(flag&BF_SKILL && skill_get_pl(skill_num)==3)
+ damage += damage*sc_data[SC_VOLCANO].val4/100;
+ else if(!flag&BF_SKILL && battle_get_attack_element(bl)==3)
+ damage += damage*sc_data[SC_VOLCANO].val4/100;
+ }
+
+ if(sc_data[SC_VIOLENTGALE].timer!=-1){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
+ if(flag&BF_SKILL && skill_get_pl(skill_num)==4)
+ damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
+ else if(!flag&BF_SKILL && battle_get_attack_element(bl)==4)
+ damage += damage*sc_data[SC_VIOLENTGALE].val4/100;
+ }
+
+ if(sc_data[SC_DELUGE].timer!=-1){ // ƒfƒŠƒ…[ƒW
+ if(flag&BF_SKILL && skill_get_pl(skill_num)==1)
+ damage += damage*sc_data[SC_DELUGE].val4/100;
+ else if(!flag&BF_SKILL && battle_get_attack_element(bl)==1)
+ damage += damage*sc_data[SC_DELUGE].val4/100;
+ }
+
+ if(sc_data[SC_ENERGYCOAT].timer!=-1 && damage>0 && flag&BF_WEAPON){ // ƒGƒiƒW[ƒR[ƒg
+ if(sd){
+ if(sd->status.sp>0){
+ int per = sd->status.sp * 5 / (sd->status.max_sp + 1);
+ sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000;
+ if( sd->status.sp < 0 ) sd->status.sp = 0;
+ damage -= damage * ((per+1) * 6) / 100;
+ clif_updatestatus(sd,SP_SP);
+ }
+ if(sd->status.sp<=0)
+ skill_status_change_end( bl,SC_ENERGYCOAT,-1 );
+ }
+ else
+ damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100;
+ }
+
+ if(sc_data[SC_KYRIE].timer!=-1 && damage > 0){ // ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“
+ sc=&sc_data[SC_KYRIE];
+ sc->val2-=damage;
+ if(flag&BF_WEAPON){
+ if(sc->val2>=0) damage=0;
+ else damage=-sc->val2;
+ }
+ if((--sc->val3)<=0 || (sc->val2<=0) || skill_num == AL_HOLYLIGHT)
+ skill_status_change_end(bl, SC_KYRIE, -1);
+ }
+
+ if(sc_data[SC_BASILICA].timer!=-1 && damage > 0){
+ // ƒjƒ…[ƒ}
+ damage=0;
+ }
+ if(sc_data[SC_LANDPROTECTOR].timer!=-1 && damage>0 && flag&BF_MAGIC){
+ // ƒjƒ…[ƒ}
+ damage=0;
+ }
+
+ if(sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 && flag&BF_WEAPON) {
+ if(rand()%100 < sc_data[SC_AUTOGUARD].val2) {
+ damage = 0;
+ clif_skill_nodamage(bl,bl,CR_AUTOGUARD,sc_data[SC_AUTOGUARD].val1,1);
+ if(sd)
+ sd->canmove_tick = gettick() + 300;
+ else if(md)
+ md->canmove_tick = gettick() + 300;
+ }
+ }
+// -- moonsoul (chance to block attacks with new Lord Knight skill parrying)
+//
+ if(sc_data[SC_PARRYING].timer != -1 && damage > 0 && flag&BF_WEAPON) {
+ if(rand()%100 < sc_data[SC_PARRYING].val2) {
+ damage = 0;
+ clif_skill_nodamage(bl,bl,LK_PARRYING,sc_data[SC_PARRYING].val1,1);
+ }
+ }
+ // ƒŠƒWƒFƒNƒgƒ\[ƒh
+ if(sc_data[SC_REJECTSWORD].timer!=-1 && damage > 0 && flag&BF_WEAPON &&
+ ((src->type==BL_PC && ((struct map_session_data *)src)->status.weapon == (1 || 2 || 3)) || src->type==BL_MOB )){
+ if(rand()%100 < (15*sc_data[SC_REJECTSWORD].val1)){ //”½ŽËŠm—¦‚Í15*Lv
+ damage = damage*50/100;
+ battle_damage(bl,src,damage,0);
+ //ƒ_ƒ[ƒW‚ð—^‚¦‚½‚Ì‚Í—Ç‚¢‚ñ‚¾‚ªA‚±‚±‚©‚ç‚Ç‚¤‚µ‚Ä•\Ž¦‚·‚é‚ñ‚¾‚©‚í‚©‚ñ‚Ë‚¥
+ //ƒGƒtƒFƒNƒg‚à‚±‚ê‚Å‚¢‚¢‚Ì‚©‚í‚©‚ñ‚Ë‚¥
+ clif_skill_nodamage(bl,bl,ST_REJECTSWORD,sc_data[SC_REJECTSWORD].val1,1);
+ if((--sc_data[SC_REJECTSWORD].val2)<=0)
+ skill_status_change_end(bl, SC_REJECTSWORD, -1);
+ }
+ }
+ if(sc_data[SC_SPIDERWEB].timer!=-1 && damage > 0) // [Celest]
+ if ((flag&BF_SKILL && skill_get_pl(skill_num)==3) ||
+ (!flag&BF_SKILL && battle_get_attack_element(src)==3)) {
+ damage<<=1;
+ skill_status_change_end(bl, SC_SPIDERWEB, -1);
+ }
+
+ if(sc_data[SC_FOGWALL].timer != -1 && flag&BF_MAGIC)
+ if(rand()%100 < sc_data[SC_FOGWALL].val2)
+ damage = 0;
+ }
+
+ if(class == 1288 || class == 1287 || class == 1286 || class == 1285) {
+// if(class == 1288) {
+ if(class == 1288 && flag&BF_SKILL)
+ damage=0;
+ if(src->type == BL_PC) {
+ struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id);
+ struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
+ if(!((struct map_session_data *)src)->status.guild_id)
+ damage=0;
+ if(gc && agit_flag==0 && class != 1288) // guardians cannot be damaged during non-woe [Valaris]
+ damage=0; // end woe check [Valaris]
+ if(g == NULL)
+ damage=0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
+ else if((gc != NULL) && guild_isallied(g, gc))
+ damage=0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
+ else if(g && guild_checkskill(g,GD_APPROVAL) <= 0)
+ damage=0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
+ else if (battle_config.guild_max_castles != 0 && guild_checkcastles(g)>=battle_config.guild_max_castles)
+ damage = 0; // [MouseJstr]
+ }
+ else damage = 0;
+ }
+
+ if(map[bl->m].flag.gvg && damage > 0) { //GvG
+ if(flag&BF_WEAPON) {
+ if(flag&BF_SHORT)
+ damage=damage*battle_config.gvg_short_damage_rate/100;
+ if(flag&BF_LONG)
+ damage=damage*battle_config.gvg_long_damage_rate/100;
+ }
+ if(flag&BF_MAGIC)
+ damage = damage*battle_config.gvg_magic_damage_rate/100;
+ if(flag&BF_MISC)
+ damage=damage*battle_config.gvg_misc_damage_rate/100;
+ if(damage < 1) damage = 1;
+ }
+
+ if(battle_config.skill_min_damage || flag&BF_MISC) {
+ if(div_ < 255) {
+ if(damage > 0 && damage < div_)
+ damage = div_;
+ }
+ else if(damage > 0 && damage < 3)
+ damage = 3;
+ }
+
+ if( md!=NULL && md->hp>0 && damage > 0 ) // ”½Œ‚‚È‚Ç‚ÌMOBƒXƒLƒ‹”»’è
+ mobskill_event(md,flag);
+
+ return damage;
+}
+
+/*==========================================
+ * C—ûƒ_ƒ[ƒW
+ *------------------------------------------
+ */
+int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type)
+{
+ int damage,skill;
+ int race=battle_get_race(target);
+ int weapon;
+ damage = 0;
+
+ nullpo_retr(0, sd);
+
+ // ƒf[ƒ‚ƒ“ƒxƒCƒ“(+3 ` +30) vs •sŽ€ or ˆ«–‚ (Ž€l‚ÍŠÜ‚ß‚È‚¢H)
+ if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && (battle_check_undead(race,battle_get_elem_type(target)) || race==6) )
+ damage += (skill*(int)(3+(sd->status.base_level+1)*0.05)); // submitted by orn
+ //damage += (skill * 3);
+
+ // ƒr[ƒXƒgƒxƒCƒ“(+4 ` +40) vs “®•¨ or ©’Ž
+ if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (race==2 || race==4) )
+ damage += (skill * 4);
+
+ if(type == 0)
+ weapon = sd->weapontype1;
+ else
+ weapon = sd->weapontype2;
+ switch(weapon)
+ {
+ case 0x01: // ’ZŒ• (Updated By AppleGirl)
+ case 0x02: // 1HS
+ {
+ // Œ•C—û(+4 ` +40) •ÐŽèŒ• ’ZŒ•ŠÜ‚Þ
+ if((skill = pc_checkskill(sd,SM_SWORD)) > 0) {
+ damage += (skill * 4);
+ }
+ break;
+ }
+ case 0x03: // 2HS
+ {
+ // —¼ŽèŒ•C—û(+4 ` +40) —¼ŽèŒ•
+ if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) {
+ damage += (skill * 4);
+ }
+ break;
+ }
+ case 0x04: // 1HL
+ {
+ // ‘„C—û(+4 ` +40,+5 ` +50) ‘„
+ if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
+ if(!pc_isriding(sd))
+ damage += (skill * 4); // ƒyƒR‚Éæ‚Á‚Ä‚È‚¢
+ else
+ damage += (skill * 5); // ƒyƒR‚Éæ‚Á‚Ä‚é
+ }
+ break;
+ }
+ case 0x05: // 2HL
+ {
+ // ‘„C—û(+4 ` +40,+5 ` +50) ‘„
+ if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) {
+ if(!pc_isriding(sd))
+ damage += (skill * 4); // ƒyƒR‚Éæ‚Á‚Ä‚È‚¢
+ else
+ damage += (skill * 5); // ƒyƒR‚Éæ‚Á‚Ä‚é
+ }
+ break;
+ }
+ case 0x06: // •ÐŽè•€
+ {
+ if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x07: // Axe by Tato
+ {
+ if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x08: // ƒƒCƒX
+ {
+ // ƒƒCƒXC—û(+3 ` +30) ƒƒCƒX
+ if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x09: // ‚È‚µ?
+ break;
+ case 0x0a: // ñ
+ break;
+ case 0x0b: // ‹|
+ break;
+ case 0x00: // ‘fŽè
+ case 0x0c: // Knuckles
+ {
+ // “SŒ(+3 ` +30) ‘fŽè,ƒiƒbƒNƒ‹
+ if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x0d: // Musical Instrument
+ {
+ // ŠyŠí‚Ì—ûK(+3 ` +30) ŠyŠí
+ if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x0e: // Dance Mastery
+ {
+ // Dance Lesson Skill Effect(+3 damage for every lvl = +30) •Ú
+ if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x0f: // Book
+ {
+ // Advance Book Skill Effect(+3 damage for every lvl = +30) {
+ if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) {
+ damage += (skill * 3);
+ }
+ break;
+ }
+ case 0x10: // Katars
+ {
+ // ƒJƒ^[ƒ‹C—û(+3 ` +30) ƒJƒ^[ƒ‹
+ if((skill = pc_checkskill(sd,AS_KATAR)) > 0) {
+ //ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
+ damage += (skill * 3);
+ }
+ break;
+ }
+ }
+ damage = dmg + damage;
+ return (damage);
+}
+
+static struct Damage battle_calc_pet_weapon_attack(
+ struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
+{
+ struct pet_data *pd = (struct pet_data *)src;
+ struct mob_data *tmd=NULL;
+ int hitrate,flee,cri = 0,atkmin,atkmax;
+ int luk,target_count = 1;
+ int def1 = battle_get_def(target);
+ int def2 = battle_get_def2(target);
+ int t_vit = battle_get_vit(target);
+ struct Damage wd;
+ int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
+ int flag,dmg_lv=0;
+ int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
+ struct status_change *t_sc_data;
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if( target == NULL || pd == NULL ){ //src‚Í“à—e‚É’¼ÚG‚ê‚Ä‚¢‚È‚¢‚̂ŃXƒ‹[‚µ‚Ä‚Ý‚é
+ nullpo_info(NLP_MARK);
+ memset(&wd,0,sizeof(wd));
+ return wd;
+ }
+
+ s_race=battle_get_race(src);
+ s_ele=battle_get_attack_element(src);
+
+ // ƒ^[ƒQƒbƒg
+ if(target->type == BL_MOB)
+ tmd=(struct mob_data *)target;
+ else {
+ memset(&wd,0,sizeof(wd));
+ return wd;
+ }
+ t_race=battle_get_race( target );
+ t_size=battle_get_size( target );
+ t_mode=battle_get_mode( target );
+ t_sc_data=battle_get_sc_data( target );
+
+ flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
+
+ // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
+ flee = battle_get_flee(target);
+ if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0)
+ target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv);
+ if(battle_config.agi_penaly_type > 0) {
+ if(target_count >= battle_config.agi_penaly_count) {
+ if(battle_config.agi_penaly_type == 1)
+ flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
+ else if(battle_config.agi_penaly_type == 2)
+ flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
+ if(flee < 1) flee = 1;
+ }
+ }
+ hitrate=battle_get_hit(src) - flee + 80;
+
+ type=0; // normal
+ div_ = 1; // single attack
+
+ luk=battle_get_luk(src);
+
+ if(battle_config.pet_str)
+ damage = battle_get_baseatk(src);
+ else
+ damage = 0;
+
+ if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
+ atkmin = battle_get_matk1(src);
+ atkmax = battle_get_matk2(src);
+ }else{
+ atkmin = battle_get_atk(src);
+ atkmax = battle_get_atk2(src);
+ }
+ if(mob_db[pd->class].range>3 )
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+
+ if(atkmin > atkmax) atkmin = atkmax;
+
+ cri = battle_get_critical(src);
+ cri -= battle_get_luk(target) * 2; // luk/5*10 => target_luk*2 not target_luk*3
+ if(battle_config.enemy_critical_rate != 100) {
+ cri = cri*battle_config.enemy_critical_rate/100;
+ if(cri < 1)
+ cri = 1;
+ }
+ if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 )
+ cri <<=1;
+
+ if(skill_num == 0 && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri)
+ {
+ damage += atkmax;
+ type = 0x0a;
+ }
+ else {
+ int vitbonusmax;
+
+ if(atkmax > atkmin)
+ damage += atkmin + rand() % (atkmax-atkmin + 1);
+ else
+ damage += atkmin ;
+ // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
+ // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
+ // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
+ // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
+ // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
+ // ƒ\ƒjƒbƒNƒuƒ[
+ if(skill_num>0){
+ int i;
+ if( (i=skill_get_pl(skill_num))>0 )
+ s_ele=i;
+
+ flag=(flag&~BF_SKILLMASK)|BF_SKILL;
+ switch( skill_num ){
+ case SM_BASH: // ƒoƒbƒVƒ…
+ damage = damage*(100+ 30*skill_lv)/100;
+ hitrate = (hitrate*(100+5*skill_lv))/100;
+ break;
+ case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
+ damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
+ break;
+ case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
+ damage = damage*(100+ 50*skill_lv)/100;
+ break;
+ case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
+ damage = damage*(180+ 20*skill_lv)/100;
+ div_=2;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
+ damage = damage*(75 + 5*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
+ damage = damage*150/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case KN_PIERCE: // ƒsƒA[ƒX
+ damage = damage*(100+ 10*skill_lv)/100;
+ hitrate = hitrate*(100+5*skill_lv)/100;
+ div_=t_size+1;
+ damage*=div_;
+ break;
+ case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
+ damage = damage*(100+ 15*skill_lv)/100;
+ break;
+ case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 50*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
+ damage = damage*(100+ 20*skill_lv)/100;
+ if(skill_lv>3 && wflag==1) damage2+=damage/2;
+ if(skill_lv>6 && wflag==1) damage2+=damage/4;
+ if(skill_lv>9 && wflag==1) damage2+=damage/8;
+ if(skill_lv>6 && wflag==2) damage2+=damage/2;
+ if(skill_lv>9 && wflag==2) damage2+=damage/4;
+ if(skill_lv>9 && wflag==3) damage2+=damage/2;
+ damage +=damage2;
+ blewcount=0;
+ break;
+ case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
+ damage = damage*(100+ 50*skill_lv)/100;
+ blewcount=0;
+ break;
+ case AS_GRIMTOOTH:
+ damage = damage*(100+ 20*skill_lv)/100;
+ break;
+ case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
+ damage = damage*(300+ 50*skill_lv)/100;
+ div_=8;
+ break;
+ case TF_SPRINKLESAND: // »‚Ü‚«
+ damage = damage*125/100;
+ break;
+ case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ damage = (damage*150)/100;
+ break;
+ // ˆÈ‰ºMOB
+ case NPC_COMBOATTACK: // ‘½’iUŒ‚
+ div_=skill_get_num(skill_num,skill_lv);
+ damage *= div_;
+ break;
+ case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
+ damage = damage*(50+rand()%150)/100;
+ break;
+ // ‘®«UŒ‚i“K“–j
+ case NPC_WATERATTACK:
+ case NPC_GROUNDATTACK:
+ case NPC_FIREATTACK:
+ case NPC_WINDATTACK:
+ case NPC_POISONATTACK:
+ case NPC_HOLYATTACK:
+ case NPC_DARKNESSATTACK:
+ case NPC_TELEKINESISATTACK:
+ div_= pd->skillduration; // [Valaris]
+ break;
+ case NPC_GUIDEDATTACK:
+ hitrate = 1000000;
+ break;
+ case NPC_RANGEATTACK:
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case NPC_PIERCINGATT:
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ break;
+ case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
+ damage = damage*(300+ 40*skill_lv)/100;
+ hitrate = 1000000;
+ break;
+ case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
+ damage = damage*(100+ 40*skill_lv)/100;
+ break;
+ case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
+ damage = damage*(100+ 30*skill_lv)/100;
+ break;
+ case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
+ damage = damage*(100+ 20*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ s_ele = 0;
+ break;
+ case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 30*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ s_ele = 0;
+ break;
+ case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
+ damage = damage*(100+ 35*skill_lv)/100;
+ div_=2;
+ break;
+ case CR_GRANDCROSS:
+ hitrate= 1000000;
+ break;
+ case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ break;
+ case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
+ damage = damage*(100+ 40*skill_lv)/100;
+ damage2 = damage2*(100+ 40*skill_lv)/100;
+ break;
+ case MO_FINGEROFFENSIVE: //Žw’e
+ damage = damage * (100 + 50 * skill_lv) / 100;
+ div_ = 1;
+ break;
+ case MO_INVESTIGATE: // ”­ ™¤
+ if(def1 < 1000000)
+ damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
+ hitrate = 1000000;
+ s_ele = 0;
+ break;
+ case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
+ damage = damage * 8 + 250 + (skill_lv * 150);
+ hitrate = 1000000;
+ s_ele = 0;
+ break;
+ case MO_CHAINCOMBO: // ˜A‘Ŷ
+ damage = damage*(150+ 50*skill_lv)/100;
+ div_=4;
+ break;
+ case MO_COMBOFINISH: // –Ò—´Œ
+ damage = damage*(240+ 60*skill_lv)/100;
+ break;
+ case DC_THROWARROW: // –‚¿
+ damage = damage*(100+ 50 * skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
+ damage = damage*(100+ 50 * skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case CH_TIGERFIST: // •šŒÕŒ
+ damage = damage*(100+ 60*skill_lv)/100;
+ break;
+ case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
+ damage = damage*(100+ 60*skill_lv)/100;
+ div_=skill_get_num(skill_num,skill_lv);
+ break;
+ case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
+ damage = damage*(50+ 100*skill_lv)/100;
+ break;
+ case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
+ damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
+ div_=5;
+ if(target->type == BL_PC)
+ ((struct map_session_data *)target)->canmove_tick = gettick() + 1000;
+ else if(target->type == BL_MOB)
+ ((struct mob_data *)target)->canmove_tick = gettick() + 1000;
+ break;
+ case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ damage = damage*(100+ 40*skill_lv)/100;
+ break;
+ case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
+ damage = damage*(50+ 10*skill_lv)/100;
+ break;
+ case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
+ damage = damage*(40+ 40*skill_lv)/100;
+ break;
+ case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
+ damage += damage*(30*skill_lv)/100;
+ break;
+ case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
+ damage = damage*(200+100*skill_lv)/100;
+ div_=9;
+ break;
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
+ damage = damage*(200+20*skill_lv)/100;
+ break;
+ }
+ }
+
+ if( skill_num!=NPC_CRITICALSLASH ){
+ // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
+ // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
+ if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000 ) { //DEF, VIT–³Ž‹
+ int t_def;
+ target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
+ if(battle_config.vit_penaly_type > 0) {
+ if(target_count >= battle_config.vit_penaly_count) {
+ if(battle_config.vit_penaly_type == 1) {
+ def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ }
+ else if(battle_config.vit_penaly_type == 2) {
+ def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ }
+ if(def1 < 0) def1 = 0;
+ if(def2 < 1) def2 = 1;
+ if(t_vit < 1) t_vit = 1;
+ }
+ }
+ t_def = def2*8/10;
+ vitbonusmax = (t_vit/20)*(t_vit/20)-1;
+ if(battle_config.pet_defense_type) {
+ damage = damage - (def1 * battle_config.pet_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ else{
+ damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ }
+ }
+ }
+
+ // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
+ if(damage<1) damage=1;
+
+ // ‰ñ”ðC³
+ if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ hitrate -= 50;
+ if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
+ t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
+ t_sc_data[SC_FREEZE].timer!=-1 ||
+ (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
+ hitrate = 1000000;
+ }
+ if(hitrate < 1000000)
+ hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
+ if(type == 0 && rand()%100 >= hitrate) {
+ damage = damage2 = 0;
+ dmg_lv = ATK_FLEE;
+ } else {
+ dmg_lv = ATK_DEF;
+ }
+
+
+ if(t_sc_data) {
+ int cardfix=100;
+ if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
+ cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+ if(cardfix != 100)
+ damage=damage*cardfix/100;
+ }
+ if(damage < 0) damage = 0;
+
+ // ‘® «‚Ì“K—p
+ if(skill_num != 0 || s_ele != 0 || !battle_config.pet_attack_attr_none)
+ damage=battle_attr_fix(damage, s_ele, battle_get_element(target) );
+
+ if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
+ damage = 500+300*skill_lv;
+
+ // ƒCƒ“ƒxƒiƒ€C³
+ if(skill_num==TF_POISON){
+ damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
+ }
+ if(skill_num==MC_CARTREVOLUTION){
+ damage = battle_attr_fix(damage, 0, battle_get_element(target) );
+ }
+
+ // Š®‘S‰ñ”ð‚Ì”»’è
+ if(battle_config.enemy_perfect_flee) {
+ if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && rand()%1000 < battle_get_flee2(target) ){
+ damage=0;
+ type=0x0b;
+ dmg_lv = ATK_LUCKY;
+ }
+ }
+
+// if(def1 >= 1000000 && damage > 0)
+ if(t_mode&0x40 && damage > 0)
+ damage = 1;
+
+ if(skill_num != CR_GRANDCROSS)
+ damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
+
+ wd.damage=damage;
+ wd.damage2=0;
+ wd.type=type;
+ wd.div_=div_;
+ wd.amotion=battle_get_amotion(src);
+ if(skill_num == KN_AUTOCOUNTER)
+ wd.amotion >>= 1;
+ wd.dmotion=battle_get_dmotion(target);
+ wd.blewcount=blewcount;
+ wd.flag=flag;
+ wd.dmg_lv=dmg_lv;
+
+ return wd;
+}
+
+static struct Damage battle_calc_mob_weapon_attack(
+ struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
+{
+ struct map_session_data *tsd=NULL;
+ struct mob_data* md=(struct mob_data *)src,*tmd=NULL;
+ int hitrate,flee,cri = 0,atkmin,atkmax;
+ int luk,target_count = 1;
+ int def1 = battle_get_def(target);
+ int def2 = battle_get_def2(target);
+ int t_vit = battle_get_vit(target);
+ struct Damage wd;
+ int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
+ int flag,skill,ac_flag = 0,dmg_lv = 0;
+ int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0;
+ struct status_change *sc_data,*t_sc_data;
+ short *sc_count;
+ short *option, *opt1, *opt2;
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if( src == NULL || target == NULL || md == NULL ){
+ nullpo_info(NLP_MARK);
+ memset(&wd,0,sizeof(wd));
+ return wd;
+ }
+
+ s_race=battle_get_race(src);
+ s_ele=battle_get_attack_element(src);
+ sc_data=battle_get_sc_data(src);
+ sc_count=battle_get_sc_count(src);
+ option=battle_get_option(src);
+ opt1=battle_get_opt1(src);
+ opt2=battle_get_opt2(src);
+
+ // ƒ^[ƒQƒbƒg
+ if(target->type==BL_PC)
+ tsd=(struct map_session_data *)target;
+ else if(target->type==BL_MOB)
+ tmd=(struct mob_data *)target;
+ t_race=battle_get_race( target );
+ t_size=battle_get_size( target );
+ t_mode=battle_get_mode( target );
+ t_sc_data=battle_get_sc_data( target );
+
+ if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
+ (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) {
+ if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) {
+ int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target);
+ int dist = distance(src->x,src->y,target->x,target->y);
+ if(dist <= 0 || map_check_dir(dir,t_dir) ) {
+ memset(&wd,0,sizeof(wd));
+ t_sc_data[SC_AUTOCOUNTER].val3 = 0;
+ t_sc_data[SC_AUTOCOUNTER].val4 = 1;
+ if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) {
+ int range = battle_get_range(target);
+ if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) ||
+ (target->type == BL_MOB && range <= 3 && dist <= range+1) )
+ t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
+ }
+ return wd;
+ }
+ else ac_flag = 1;
+ } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
+ //memset(&wd,0,sizeof(wd));
+ t_sc_data[SC_POISONREACT].val3 = 0;
+ t_sc_data[SC_POISONREACT].val4 = 1;
+ t_sc_data[SC_POISONREACT].val3 = src->id;
+ return wd;
+ }
+ }
+ flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
+
+ // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
+ flee = battle_get_flee(target);
+ if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0)
+ target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv);
+ if(battle_config.agi_penaly_type > 0) {
+ if(target_count >= battle_config.agi_penaly_count) {
+ if(battle_config.agi_penaly_type == 1)
+ flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
+ else if(battle_config.agi_penaly_type == 2)
+ flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
+ if(flee < 1) flee = 1;
+ }
+ }
+ hitrate=battle_get_hit(src) - flee + 80;
+
+ type=0; // normal
+ div_ = 1; // single attack
+
+ luk=battle_get_luk(src);
+
+ if(battle_config.enemy_str)
+ damage = battle_get_baseatk(src);
+ else
+ damage = 0;
+ if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
+ atkmin = battle_get_matk1(src);
+ atkmax = battle_get_matk2(src);
+ }else{
+ atkmin = battle_get_atk(src);
+ atkmax = battle_get_atk2(src);
+ }
+ if(mob_db[md->class].range>3 )
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+
+ if(atkmin > atkmax) atkmin = atkmax;
+
+ if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
+ atkmin=atkmax;
+ }
+
+ cri = battle_get_critical(src);
+ cri -= battle_get_luk(target) * 3;
+ if(battle_config.enemy_critical_rate != 100) {
+ cri = cri*battle_config.enemy_critical_rate/100;
+ if(cri < 1)
+ cri = 1;
+ }
+ if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
+ cri <<=1;
+
+ if(ac_flag) cri = 1000;
+
+ if(skill_num == KN_AUTOCOUNTER) {
+ if(!(battle_config.monster_auto_counter_type&1))
+ cri = 1000;
+ else
+ cri <<= 1;
+ }
+
+ if(tsd && tsd->critical_def)
+ cri = cri * (100 - tsd->critical_def) / 100;
+
+ if((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
+ // “G‚Ì”»’è
+ {
+ damage += atkmax;
+ type = 0x0a;
+ }
+ else {
+ int vitbonusmax;
+
+ if(atkmax > atkmin)
+ damage += atkmin + rand() % (atkmax-atkmin + 1);
+ else
+ damage += atkmin ;
+ // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
+ // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
+ // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
+ // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
+ // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
+ // ƒ\ƒjƒbƒNƒuƒ[
+ if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
+ if(sc_data[SC_OVERTHRUST].timer!=-1) // ƒI[ƒo[ƒgƒ‰ƒXƒg
+ damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
+ if(sc_data[SC_TRUESIGHT].timer!=-1) // ƒgƒDƒ‹[ƒTƒCƒg
+ damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
+ if(sc_data[SC_BERSERK].timer!=-1) // ƒo[ƒT[ƒN
+ damage += damage*50/100;
+ }
+
+ if(skill_num>0){
+ int i;
+ if( (i=skill_get_pl(skill_num))>0 )
+ s_ele=i;
+
+ flag=(flag&~BF_SKILLMASK)|BF_SKILL;
+ switch( skill_num ){
+ case SM_BASH: // ƒoƒbƒVƒ…
+ damage = damage*(100+ 30*skill_lv)/100;
+ hitrate = (hitrate*(100+5*skill_lv))/100;
+ break;
+ case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
+ damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
+ break;
+ case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
+ damage = damage*(100+ 50*skill_lv)/100;
+ break;
+ case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
+ damage = damage*(180+ 20*skill_lv)/100;
+ div_=2;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
+ damage = damage*(75 + 5*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
+ damage = damage*150/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case KN_PIERCE: // ƒsƒA[ƒX
+ damage = damage*(100+ 10*skill_lv)/100;
+ hitrate=hitrate*(100+5*skill_lv)/100;
+ div_=t_size+1;
+ damage*=div_;
+ break;
+ case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
+ damage = damage*(100+ 15*skill_lv)/100;
+ break;
+ case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 50*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
+ damage = damage*(100+ 20*skill_lv)/100;
+ if(skill_lv>3 && wflag==1) damage2+=damage/2;
+ if(skill_lv>6 && wflag==1) damage2+=damage/4;
+ if(skill_lv>9 && wflag==1) damage2+=damage/8;
+ if(skill_lv>6 && wflag==2) damage2+=damage/2;
+ if(skill_lv>9 && wflag==2) damage2+=damage/4;
+ if(skill_lv>9 && wflag==3) damage2+=damage/2;
+ damage +=damage2;
+ blewcount=0;
+ break;
+ case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
+ damage = damage*(100+ 50*skill_lv)/100;
+ blewcount=0;
+ break;
+ case KN_AUTOCOUNTER:
+ if(battle_config.monster_auto_counter_type&1)
+ hitrate += 20;
+ else
+ hitrate = 1000000;
+ flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
+ break;
+ case AS_GRIMTOOTH:
+ damage = damage*(100+ 20*skill_lv)/100;
+ break;
+ case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
+ damage = damage*(300+ 50*skill_lv)/100;
+ div_=8;
+ break;
+ case TF_SPRINKLESAND: // »‚Ü‚«
+ damage = damage*125/100;
+ break;
+ case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ damage = (damage*150)/100;
+ break;
+ // ˆÈ‰ºMOB
+ case NPC_COMBOATTACK: // ‘½’iUŒ‚
+ div_=skill_get_num(skill_num,skill_lv);
+ damage *= div_;
+ break;
+ case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
+ damage = damage*(50+rand()%150)/100;
+ break;
+ // ‘®«UŒ‚i“K“–j
+ case NPC_WATERATTACK:
+ case NPC_GROUNDATTACK:
+ case NPC_FIREATTACK:
+ case NPC_WINDATTACK:
+ case NPC_POISONATTACK:
+ case NPC_HOLYATTACK:
+ case NPC_DARKNESSATTACK:
+ case NPC_TELEKINESISATTACK:
+ damage = damage*(100+25*(skill_lv-1))/100;
+ break;
+ case NPC_GUIDEDATTACK:
+ hitrate = 1000000;
+ break;
+ case NPC_RANGEATTACK:
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case NPC_PIERCINGATT:
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ break;
+ case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
+ damage = damage*(300+ 40*skill_lv)/100;
+ hitrate = 1000000;
+ break;
+ case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
+ damage = damage*(100+ 40*skill_lv)/100;
+ break;
+ case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
+ damage = damage*(100+ 30*skill_lv)/100;
+ break;
+ case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
+ damage = damage*(100+ 20*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ s_ele = 0;
+ break;
+ case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 30*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ s_ele = 0;
+ break;
+ case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
+ damage = damage*(100+ 35*skill_lv)/100;
+ div_=2;
+ break;
+ case CR_GRANDCROSS:
+ hitrate= 1000000;
+ break;
+ case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ break;
+ case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
+ damage = damage*(100+ 40*skill_lv)/100;
+ damage2 = damage2*(100+ 40*skill_lv)/100;
+ break;
+ case MO_FINGEROFFENSIVE: //Žw’e
+ damage = damage * (100 + 50 * skill_lv) / 100;
+ div_ = 1;
+ break;
+ case MO_INVESTIGATE: // ”­ ™¤
+ if(def1 < 1000000)
+ damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
+ hitrate = 1000000;
+ s_ele = 0;
+ break;
+ case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
+ damage = damage * 8 + 250 + (skill_lv * 150);
+ hitrate = 1000000;
+ s_ele = 0;
+ break;
+ case MO_CHAINCOMBO: // ˜A‘Ŷ
+ damage = damage*(150+ 50*skill_lv)/100;
+ div_=4;
+ break;
+ case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
+ damage = damage*(100+ 50 * skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case DC_THROWARROW: // –‚¿
+ damage = damage*(100+ 50 * skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case MO_COMBOFINISH: // –Ò—´Œ
+ damage = damage*(240+ 60*skill_lv)/100;
+ break;
+ case CH_TIGERFIST: // •šŒÕŒ
+ damage = damage*(100+ 20*skill_lv)/100;
+ break;
+ case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
+ damage = damage*(100+ 60*skill_lv)/100;
+ div_=skill_get_num(skill_num,skill_lv);
+ break;
+ case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
+ damage = damage*(50+ 100*skill_lv)/100;
+ break;
+ case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
+ damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
+ div_=5;
+ if(tsd)
+ tsd->canmove_tick = gettick() + 1000;
+ else if(tmd)
+ tmd->canmove_tick = gettick() + 1000;
+ break;
+ case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ damage = damage*(100+ 40*skill_lv)/100;
+ break;
+ case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
+ damage = damage*(50+ 10*skill_lv)/100;
+ break;
+ case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
+ damage = damage*(40+ 40*skill_lv)/100;
+ break;
+ case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
+ damage += damage*(30*skill_lv)/100;
+ break;
+ case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
+ damage = damage*(200+100*skill_lv)/100;
+ div_=9;
+ break;
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
+ damage = damage*(200+20*skill_lv)/100;
+ break;
+ }
+ }
+
+ if( skill_num!=NPC_CRITICALSLASH ){
+ // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
+ // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
+ if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT–³Ž‹
+ int t_def;
+ target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
+ if(battle_config.vit_penaly_type > 0) {
+ if(target_count >= battle_config.vit_penaly_count) {
+ if(battle_config.vit_penaly_type == 1) {
+ def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ }
+ else if(battle_config.vit_penaly_type == 2) {
+ def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ }
+ if(def1 < 0) def1 = 0;
+ if(def2 < 1) def2 = 1;
+ if(t_vit < 1) t_vit = 1;
+ }
+ }
+ t_def = def2*8/10;
+ if(battle_check_undead(s_race,battle_get_elem_type(src)) || s_race==6)
+ if(tsd && (skill=pc_checkskill(tsd,AL_DP)) > 0 )
+ t_def += skill* (int) (3 + (tsd->status.base_level+1)*0.04); // submitted by orn
+ //t_def += skill*3;
+
+ vitbonusmax = (t_vit/20)*(t_vit/20)-1;
+ if(battle_config.monster_defense_type) {
+ damage = damage - (def1 * battle_config.monster_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ else{
+ damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ }
+ }
+ }
+
+ // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
+ if(damage<1) damage=1;
+
+ // ‰ñ”ðC³
+ if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ hitrate -= 50;
+ if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
+ t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
+ t_sc_data[SC_FREEZE].timer!=-1 ||
+ (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
+ hitrate = 1000000;
+ }
+ if(hitrate < 1000000)
+ hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
+ if(type == 0 && rand()%100 >= hitrate) {
+ damage = damage2 = 0;
+ dmg_lv = ATK_FLEE;
+ } else {
+ dmg_lv = ATK_DEF;
+ }
+
+ if(tsd){
+ int cardfix=100,i;
+ cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ if(mob_db[md->class].mode & 0x20)
+ cardfix=cardfix*(100-tsd->subrace[10])/100;
+ else
+ cardfix=cardfix*(100-tsd->subrace[11])/100;
+ for(i=0;i<tsd->add_def_class_count;i++) {
+ if(tsd->add_def_classid[i] == md->class) {
+ cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
+ break;
+ }
+ }
+ if(flag&BF_LONG)
+ cardfix=cardfix*(100-tsd->long_attack_def_rate)/100;
+ if(flag&BF_SHORT)
+ cardfix=cardfix*(100-tsd->near_attack_def_rate)/100;
+ damage=damage*cardfix/100;
+ }
+ if(t_sc_data) {
+ int cardfix=100;
+ if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG)
+ cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100;
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+ if(cardfix != 100)
+ damage=damage*cardfix/100;
+ }
+ if(t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒVƒƒƒ“ƒvƒeƒBƒI
+ if(!map[target->m].flag.pvp)
+ damage=damage/3;
+ else
+ damage=damage/2;
+ }
+
+ if(damage < 0) damage = 0;
+
+ // ‘® «‚Ì“K—p
+ if (!((battle_config.mob_ghostring_fix == 1) &&
+ (battle_get_element(target) == 8) &&
+ (target->type==BL_PC))) // [MouseJstr]
+ if(skill_num != 0 || s_ele != 0 || !battle_config.mob_attack_attr_none)
+ damage=battle_attr_fix(damage, s_ele, battle_get_element(target) );
+
+ if(sc_data && sc_data[SC_AURABLADE].timer!=-1) /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
+ damage += sc_data[SC_AURABLADE].val1 * 10;
+ if(skill_num==PA_PRESSURE) /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
+ damage = 500+300*skill_lv;
+
+ // ƒCƒ“ƒxƒiƒ€C³
+ if(skill_num==TF_POISON){
+ damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
+ }
+ if(skill_num==MC_CARTREVOLUTION){
+ damage = battle_attr_fix(damage, 0, battle_get_element(target) );
+ }
+
+ // Š®‘S‰ñ”ð‚Ì”»’è
+ if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && rand()%1000 < battle_get_flee2(target) ){
+ damage=0;
+ type=0x0b;
+ dmg_lv = ATK_LUCKY;
+ }
+
+ if(battle_config.enemy_perfect_flee) {
+ if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && rand()%1000 < battle_get_flee2(target) ){
+ damage=0;
+ type=0x0b;
+ dmg_lv = ATK_LUCKY;
+ }
+ }
+
+// if(def1 >= 1000000 && damage > 0)
+ if(t_mode&0x40 && damage > 0)
+ damage = 1;
+
+ if( tsd && tsd->special_state.no_weapon_damage)
+ damage = 0;
+
+ if(skill_num != CR_GRANDCROSS)
+ damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
+
+ wd.damage=damage;
+ wd.damage2=0;
+ wd.type=type;
+ wd.div_=div_;
+ wd.amotion=battle_get_amotion(src);
+ if(skill_num == KN_AUTOCOUNTER)
+ wd.amotion >>= 1;
+ wd.dmotion=battle_get_dmotion(target);
+ wd.blewcount=blewcount;
+ wd.flag=flag;
+ wd.dmg_lv=dmg_lv;
+ return wd;
+}
+/*
+ * =========================================================================
+ * PC‚Ì•Ší‚É‚æ‚éUŒ‚
+ *-------------------------------------------------------------------------
+ */
+static struct Damage battle_calc_pc_weapon_attack(
+ struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
+{
+ struct map_session_data *sd=(struct map_session_data *)src,*tsd=NULL;
+ struct mob_data *tmd=NULL;
+ int hitrate,flee,cri = 0,atkmin,atkmax;
+ int dex,luk,target_count = 1;
+ int def1 = battle_get_def(target);
+ int def2 = battle_get_def2(target);
+ int t_vit = battle_get_vit(target);
+ struct Damage wd;
+ int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
+ int flag,skill,dmg_lv = 0;
+ int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0;
+ struct status_change *sc_data,*t_sc_data;
+ short *sc_count;
+ short *option, *opt1, *opt2;
+ int atkmax_=0, atkmin_=0, s_ele_; //“ñ“—¬—p
+ int watk,watk_,cardfix,t_ele;
+ int da=0,i,t_class,ac_flag = 0;
+ int idef_flag=0,idef_flag_=0;
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if( src == NULL || target == NULL || sd == NULL ){
+ nullpo_info(NLP_MARK);
+ memset(&wd,0,sizeof(wd));
+ return wd;
+ }
+
+
+ // ƒAƒ^ƒbƒJ[
+ s_race=battle_get_race(src); //Ží‘°
+ s_ele=battle_get_attack_element(src); //‘®«
+ s_ele_=battle_get_attack_element2(src); //¶Žè‘®«
+ sc_data=battle_get_sc_data(src); //ƒXƒe[ƒ^ƒXˆÙí
+ sc_count=battle_get_sc_count(src); //ƒXƒe[ƒ^ƒXˆÙí‚Ì”
+ option=battle_get_option(src); //‘é‚Æ‚©ƒyƒR‚Æ‚©ƒJ[ƒg‚Æ‚©
+ opt1=battle_get_opt1(src); //Ή»A“€Œ‹AƒXƒ^ƒ“A‡–°AˆÃˆÅ
+ opt2=battle_get_opt2(src); //“ÅAŽô‚¢A’¾–ÙAˆÃˆÅH
+
+ if(skill_num != CR_GRANDCROSS) //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚¢‚È‚ç
+ sd->state.attack_type = BF_WEAPON; //UŒ‚ƒ^ƒCƒv‚Í•ŠíUŒ‚
+
+ // ƒ^[ƒQƒbƒg
+ if(target->type==BL_PC) //‘ÎÛ‚ªPC‚È‚ç
+ tsd=(struct map_session_data *)target; //tsd‚É‘ã“ü(tmd‚ÍNULL)
+ else if(target->type==BL_MOB) //‘ÎÛ‚ªMob‚È‚ç
+ tmd=(struct mob_data *)target; //tmd‚É‘ã“ü(tsd‚ÍNULL)
+ t_race=battle_get_race( target ); //‘ÎÛ‚ÌŽí‘°
+ t_ele=battle_get_elem_type(target); //‘ÎÛ‚Ì‘®«
+ t_size=battle_get_size( target ); //‘Îۂ̃TƒCƒY
+ t_mode=battle_get_mode( target ); //‘ÎÛ‚ÌMode
+ t_sc_data=battle_get_sc_data( target ); //‘Îۂ̃Xƒe[ƒ^ƒXˆÙí
+
+//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚©‚ç
+ if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) ||
+ (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) {
+ if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) { //ƒOƒ‰ƒ“ƒhƒNƒƒX‚Å‚È‚­A‘ÎÛ‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô‚Ìê‡
+ int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target);
+ int dist = distance(src->x,src->y,target->x,target->y);
+ if(dist <= 0 || map_check_dir(dir,t_dir) ) { //‘ÎÛ‚Æ‚Ì‹——£‚ª0ˆÈ‰ºA‚Ü‚½‚Í‘Îۂ̳–ÊH
+ memset(&wd,0,sizeof(wd));
+ t_sc_data[SC_AUTOCOUNTER].val3 = 0;
+ t_sc_data[SC_AUTOCOUNTER].val4 = 1;
+ if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) { //Ž©•ª‚ªƒI[ƒgƒJƒEƒ“ƒ^[ó‘Ô
+ int range = battle_get_range(target);
+ if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) || //‘ÎÛ‚ªPC‚Å•Ší‚ª‹|–î‚Å‚È‚­ŽË’ö“à
+ (target->type == BL_MOB && range <= 3 && dist <= range+1) ) //‚Ü‚½‚Í‘ÎÛ‚ªMob‚ÅŽË’ö‚ª3ˆÈ‰º‚ÅŽË’ö“à
+ t_sc_data[SC_AUTOCOUNTER].val3 = src->id;
+ }
+ return wd; //ƒ_ƒ[ƒW\‘¢‘Ì‚ð•Ô‚µ‚ÄI—¹
+ }
+ else ac_flag = 1;
+ } else if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_POISONREACT].timer != -1) { // poison react [Celest]
+ //memset(&wd,0,sizeof(wd));
+ t_sc_data[SC_POISONREACT].val3 = 0;
+ t_sc_data[SC_POISONREACT].val4 = 1;
+ t_sc_data[SC_POISONREACT].val3 = src->id;
+ return wd;
+ }
+ }
+//ƒI[ƒgƒJƒEƒ“ƒ^[ˆ—‚±‚±‚Ü‚Å
+
+ flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // UŒ‚‚ÌŽí—Þ‚ÌÝ’è
+
+ // ‰ñ”𗦌vŽZA‰ñ”ð”»’è‚ÍŒã‚Å
+ flee = battle_get_flee(target);
+ if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGIAVITƒyƒiƒ‹ƒeƒBݒ肪—LŒø
+ target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); //‘ÎÛ‚Ì”‚ðŽZo
+ if(battle_config.agi_penaly_type > 0) {
+ if(target_count >= battle_config.agi_penaly_count) { //ƒyƒiƒ‹ƒeƒBÝ’è‚æ‚è‘ÎÛ‚ª‘½‚¢
+ if(battle_config.agi_penaly_type == 1) //‰ñ”𗦂ªagi_penaly_num%‚¸‚ÂŒ¸­
+ flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100;
+ else if(battle_config.agi_penaly_type == 2) //‰ñ”𗦂ªagi_penaly_num•ªŒ¸­
+ flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num;
+ if(flee < 1) flee = 1; //‰ñ”𗦂ÍÅ’á‚Å‚à1
+ }
+ }
+ hitrate=battle_get_hit(src) - flee + 80; //–½’†—¦ŒvŽZ
+
+ type=0; // normal
+ div_ = 1; // single attack
+
+ dex=battle_get_dex(src); //DEX
+ luk=battle_get_luk(src); //LUK
+ watk = battle_get_atk(src); //ATK
+ watk_ = battle_get_atk_(src); //ATK¶Žè
+
+ if(skill_num==HW_MAGICCRASHER){ /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ[‚ÍMATK‚ʼn£‚é */
+ damage = damage2 = battle_get_matk1(src); //damega,damega2‰“oêAbase_atk‚̎擾
+ }else{
+ damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2‰“oêAbase_atk‚̎擾
+ }
+ atkmin = atkmin_ = dex; //Å’áATK‚ÍDEX‚ʼnŠú‰»H
+ sd->state.arrow_atk = 0; //arrow_atk‰Šú‰»
+ if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]])
+ atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[9]]->wlv*20)/100;
+ if(sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]])
+ atkmin_ = atkmin_*(80 + sd->inventory_data[sd->equip_index[8]]->wlv*20)/100;
+ if(sd->status.weapon == 11) { //•Ší‚ª‹|–î‚Ìê‡
+ atkmin = watk * ((atkmin<watk)? atkmin:watk)/100; //‹|—pÅ’áATKŒvŽZ
+ flag=(flag&~BF_RANGEMASK)|BF_LONG; //‰“‹——£UŒ‚ƒtƒ‰ƒO‚ð—LŒø
+ if(sd->arrow_ele > 0) //‘®«–î‚È‚ç‘®«‚ð–î‚Ì‘®«‚É•ÏX
+ s_ele = sd->arrow_ele;
+ sd->state.arrow_atk = 1; //arrow_atk—LŒø‰»
+ }
+
+ // ƒTƒCƒYC³
+ // ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚ÅUŒ‚‚µ‚½ê‡‚Í’†Œ^‚̃TƒCƒYC³‚ð100‚É‚·‚é
+ // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“,ƒhƒŒƒCƒNC
+ if(((sd->special_state.no_sizefix) || (pc_isriding(sd) && (sd->status.weapon==4 || sd->status.weapon==5) && t_size==1) || skill_num == MO_EXTREMITYFIST)){ //ƒyƒR‹R悵‚Ä‚¢‚ÄA‘„‚Å’†Œ^‚ðUŒ‚
+ atkmax = watk;
+ atkmax_ = watk_;
+ } else {
+ atkmax = (watk * sd->atkmods[ t_size ]) / 100;
+ atkmin = (atkmin * sd->atkmods[ t_size ]) / 100;
+ atkmax_ = (watk_ * sd->atkmods_[ t_size ]) / 100;
+ atkmin_ = (atkmin_ * sd->atkmods[ t_size ]) / 100;
+ }
+ if( (sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer!=-1) || (sd->special_state.no_sizefix)) { // ƒEƒFƒ|ƒ“ƒp[ƒtƒFƒNƒVƒ‡ƒ“ || ƒhƒŒƒCƒNƒJ[ƒh
+ atkmax = watk;
+ atkmax_ = watk_;
+ }
+
+ if(atkmin > atkmax && !(sd->state.arrow_atk)) atkmin = atkmax; //‹|‚ÍŒႪã‰ñ‚éꇂ ‚è
+ if(atkmin_ > atkmax_) atkmin_ = atkmax_;
+
+ if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // ƒ}ƒLƒVƒ}ƒCƒYƒpƒ[
+ atkmin=atkmax;
+ atkmin_=atkmax_;
+ }
+
+ //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN”»’è
+ if(sd->weapontype1 == 0x01) {
+ if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,TF_DOUBLE)) > 0)
+ da = (rand()%100 < (skill*5)) ? 1:0;
+ }
+
+ //ŽO’i¶
+ if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) {
+ da = (rand()%100 < (30 - skill)) ? 2:0;
+ }
+
+ if(sd->double_rate > 0 && da == 0 && skill_num == 0 && skill_lv >= 0)
+ da = (rand()%100 < sd->double_rate) ? 1:0;
+
+ // ‰ß踘Bƒ{[ƒiƒX
+ if(sd->overrefine>0 )
+ damage+=(rand()%sd->overrefine)+1;
+ if(sd->overrefine_>0 )
+ damage2+=(rand()%sd->overrefine_)+1;
+
+ if(da == 0){ //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
+ // ƒNƒŠƒeƒBƒJƒ‹ŒvŽZ
+ cri = battle_get_critical(src);
+
+ if(sd->state.arrow_atk)
+ cri += sd->arrow_cri;
+ if(sd->status.weapon == 16)
+ // ƒJƒ^[ƒ‹‚Ìê‡AƒNƒŠƒeƒBƒJƒ‹‚ð”{‚É
+ cri <<=1;
+ cri -= battle_get_luk(target) * 3;
+ if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // ‡–°’†‚̓NƒŠƒeƒBƒJƒ‹‚ª”{‚É
+ cri <<=1;
+ if(ac_flag) cri = 1000;
+
+ if(skill_num == KN_AUTOCOUNTER) {
+ if(!(battle_config.pc_auto_counter_type&1))
+ cri = 1000;
+ else
+ cri <<= 1;
+ }
+
+ if(skill_num == SN_SHARPSHOOTING)
+ cri += 200;
+ }
+
+ if(tsd && tsd->critical_def)
+ cri = cri * (100-tsd->critical_def) / 100;
+
+ if(da == 0 && (skill_num==0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚È‚¢
+ (rand() % 1000) < cri) // ”»’èiƒXƒLƒ‹‚Ìꇂ͖³Ž‹j
+ {
+ damage += atkmax;
+ damage2 += atkmax_;
+ if(sd->atk_rate != 100) {
+ damage = (damage * sd->atk_rate)/100;
+ damage2 = (damage2 * sd->atk_rate)/100;
+ }
+ if(sd->state.arrow_atk)
+ damage += sd->arrow_atk;
+ type = 0x0a;
+
+/* if(def1 < 1000000) {
+ if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ if(t_mode & 0x20) {
+ if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ }
+ else {
+ if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ }
+ }*/
+ }
+ else {
+ int vitbonusmax;
+
+ if(atkmax > atkmin)
+ damage += atkmin + rand() % (atkmax-atkmin + 1);
+ else
+ damage += atkmin ;
+ if(atkmax_ > atkmin_)
+ damage2 += atkmin_ + rand() % (atkmax_-atkmin_ + 1);
+ else
+ damage2 += atkmin_ ;
+ if(sd->atk_rate != 100) {
+ damage = (damage * sd->atk_rate)/100;
+ damage2 = (damage2 * sd->atk_rate)/100;
+ }
+
+ if(sd->state.arrow_atk) {
+ if(sd->arrow_atk > 0)
+ damage += rand()%(sd->arrow_atk+1);
+ hitrate += sd->arrow_hit;
+ }
+
+ if(skill_num != MO_INVESTIGATE && def1 < 1000000) {
+ if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ if(t_mode & 0x20) {
+ if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ }
+ else {
+ if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) {
+ damage = (damage * (def1 + def2))/100;
+ idef_flag = 1;
+ }
+ if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) {
+ damage2 = (damage2 * (def1 + def2))/100;
+ idef_flag_ = 1;
+ }
+ }
+ }
+
+ // ƒXƒLƒ‹C³‚PiUŒ‚—Í”{‰»Œnj
+ // ƒI[ƒo[ƒgƒ‰ƒXƒg(+5% ` +25%),‘¼UŒ‚ŒnƒXƒLƒ‹‚Ìꇂ±‚±‚Å•â³
+ // ƒoƒbƒVƒ…,ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN,
+ // ƒ{[ƒŠƒ“ƒOƒoƒbƒVƒ…,ƒXƒsƒAƒu[ƒƒ‰ƒ“,ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA,ƒXƒsƒAƒXƒ^ƒbƒu,
+ // ƒƒ}[ƒiƒCƒg,ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO,ƒAƒ[ƒVƒƒƒ[,ƒ`ƒƒ[ƒWƒAƒ[,
+ // ƒ\ƒjƒbƒNƒuƒ[
+ if(sc_data){ //ó‘ÔˆÙí’†‚̃_ƒ[ƒW’ljÁ
+ if(sc_data[SC_OVERTHRUST].timer!=-1){ // ƒI[ƒo[ƒgƒ‰ƒXƒg
+ damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100;
+ damage2 += damage2*(5*sc_data[SC_OVERTHRUST].val1)/100;
+ }
+ if(sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹[ƒTƒCƒg
+ damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100;
+ damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100;
+ }
+ if(sc_data[SC_BERSERK].timer!=-1){ // ƒo[ƒT[ƒN
+ damage += damage*50/100;
+ damage2 += damage2*50/100;
+ }
+ }
+
+ if(skill_num>0){
+ int i;
+ if( (i=skill_get_pl(skill_num))>0 )
+ s_ele=s_ele_=i;
+
+ flag=(flag&~BF_SKILLMASK)|BF_SKILL;
+ switch( skill_num ){
+ case SM_BASH: // ƒoƒbƒVƒ…
+ damage = damage*(100+ 30*skill_lv)/100;
+ damage2 = damage2*(100+ 30*skill_lv)/100;
+ hitrate = (hitrate*(100+5*skill_lv))/100;
+ break;
+ case SM_MAGNUM: // ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN
+ damage = damage*(5*skill_lv +(wflag)?65:115 )/100;
+ damage2 = damage2*(5*skill_lv +(wflag)?65:115 )/100;
+ break;
+ case MC_MAMMONITE: // ƒƒ}[ƒiƒCƒg
+ damage = damage*(100+ 50*skill_lv)/100;
+ damage2 = damage2*(100+ 50*skill_lv)/100;
+ break;
+ case AC_DOUBLE: // ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO
+ if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
+ int arr = rand()%(sd->arrow_atk+1);
+ damage += arr;
+ damage2 += arr;
+ }
+ damage = damage*(180+ 20*skill_lv)/100;
+ damage2 = damage2*(180+ 20*skill_lv)/100;
+ div_=2;
+ if(sd->arrow_ele > 0) {
+ s_ele = sd->arrow_ele;
+ s_ele_ = sd->arrow_ele;
+ }
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ sd->state.arrow_atk = 1;
+ break;
+ case AC_SHOWER: // ƒAƒ[ƒVƒƒƒ[
+ if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
+ int arr = rand()%(sd->arrow_atk+1);
+ damage += arr;
+ damage2 += arr;
+ }
+ damage = damage*(75 + 5*skill_lv)/100;
+ damage2 = damage2*(75 + 5*skill_lv)/100;
+ if(sd->arrow_ele > 0) {
+ s_ele = sd->arrow_ele;
+ s_ele_ = sd->arrow_ele;
+ }
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ sd->state.arrow_atk = 1;
+ break;
+ case AC_CHARGEARROW: // ƒ`ƒƒ[ƒWƒAƒ[
+ if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
+ int arr = rand()%(sd->arrow_atk+1);
+ damage += arr;
+ damage2 += arr;
+ }
+ damage = damage*150/100;
+ damage2 = damage2*150/100;
+ if(sd->arrow_ele > 0) {
+ s_ele = sd->arrow_ele;
+ s_ele_ = sd->arrow_ele;
+ }
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ sd->state.arrow_atk = 1;
+ break;
+ case KN_PIERCE: // ƒsƒA[ƒX
+ damage = damage*(100+ 10*skill_lv)/100;
+ damage2 = damage2*(100+ 10*skill_lv)/100;
+ hitrate=hitrate*(100+5*skill_lv)/100;
+ div_=t_size+1;
+ damage*=div_;
+ damage2*=div_;
+ break;
+ case KN_SPEARSTAB: // ƒXƒsƒAƒXƒ^ƒu
+ damage = damage*(100+ 15*skill_lv)/100;
+ damage2 = damage2*(100+ 15*skill_lv)/100;
+ break;
+ case KN_SPEARBOOMERANG: // ƒXƒsƒAƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 50*skill_lv)/100;
+ damage2 = damage2*(100+ 50*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case KN_BRANDISHSPEAR: // ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ if(skill_lv>3 && wflag==1) damage3+=damage/2;
+ if(skill_lv>6 && wflag==1) damage3+=damage/4;
+ if(skill_lv>9 && wflag==1) damage3+=damage/8;
+ if(skill_lv>6 && wflag==2) damage3+=damage/2;
+ if(skill_lv>9 && wflag==2) damage3+=damage/4;
+ if(skill_lv>9 && wflag==3) damage3+=damage/2;
+ damage +=damage3;
+ if(skill_lv>3 && wflag==1) damage4+=damage2/2;
+ if(skill_lv>6 && wflag==1) damage4+=damage2/4;
+ if(skill_lv>9 && wflag==1) damage4+=damage2/8;
+ if(skill_lv>6 && wflag==2) damage4+=damage2/2;
+ if(skill_lv>9 && wflag==2) damage4+=damage2/4;
+ if(skill_lv>9 && wflag==3) damage4+=damage2/2;
+ damage2 +=damage4;
+ blewcount=0;
+ break;
+ case KN_BOWLINGBASH: // ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ…
+ damage = damage*(100+ 50*skill_lv)/100;
+ damage2 = damage2*(100+ 50*skill_lv)/100;
+ blewcount=0;
+ break;
+ case KN_AUTOCOUNTER:
+ if(battle_config.pc_auto_counter_type&1)
+ hitrate += 20;
+ else
+ hitrate = 1000000;
+ flag=(flag&~BF_SKILLMASK)|BF_NORMAL;
+ break;
+ case AS_GRIMTOOTH:
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ break;
+ case AS_SONICBLOW: // ƒ\ƒjƒbƒNƒuƒƒE
+ hitrate+=30; // hitrate +30, thanks to midas
+ damage = damage*(300+ 50*skill_lv)/100;
+ damage2 = damage2*(300+ 50*skill_lv)/100;
+ div_=8;
+ break;
+ case TF_SPRINKLESAND: // »‚Ü‚«
+ damage = damage*125/100;
+ damage2 = damage2*125/100;
+ break;
+ case MC_CARTREVOLUTION: // ƒJ[ƒgƒŒƒ{ƒŠƒ…[ƒVƒ‡ƒ“
+ if(sd->cart_max_weight > 0 && sd->cart_weight > 0) {
+ damage = (damage*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
+ damage2 = (damage2*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100;
+ }
+ else {
+ damage = (damage*150)/100;
+ damage2 = (damage2*150)/100;
+ }
+ break;
+ // ˆÈ‰ºMOB
+ case NPC_COMBOATTACK: // ‘½’iUŒ‚
+ div_=skill_get_num(skill_num,skill_lv);
+ damage *= div_;
+ damage2 *= div_;
+ break;
+ case NPC_RANDOMATTACK: // ƒ‰ƒ“ƒ_ƒ€ATKUŒ‚
+ damage = damage*(50+rand()%150)/100;
+ damage2 = damage2*(50+rand()%150)/100;
+ break;
+ // ‘®«UŒ‚i“K“–j
+ case NPC_WATERATTACK:
+ case NPC_GROUNDATTACK:
+ case NPC_FIREATTACK:
+ case NPC_WINDATTACK:
+ case NPC_POISONATTACK:
+ case NPC_HOLYATTACK:
+ case NPC_DARKNESSATTACK:
+ case NPC_TELEKINESISATTACK:
+ damage = damage*(100+25*skill_lv)/100;
+ damage2 = damage2*(100+25*skill_lv)/100;
+ break;
+ case NPC_GUIDEDATTACK:
+ hitrate = 1000000;
+ break;
+ case NPC_RANGEATTACK:
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ break;
+ case NPC_PIERCINGATT:
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ break;
+ case RG_BACKSTAP: // ƒoƒbƒNƒXƒ^ƒu
+ if(battle_config.backstab_bow_penalty == 1 && sd->status.weapon == 11){
+ damage = (damage*(300+ 40*skill_lv)/100)/2;
+ damage2 = (damage2*(300+ 40*skill_lv)/100)/2;
+ }else{
+ damage = damage*(300+ 40*skill_lv)/100;
+ damage2 = damage2*(300+ 40*skill_lv)/100;
+ }
+ hitrate = 1000000;
+ break;
+ case RG_RAID: // ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN
+ damage = damage*(100+ 40*skill_lv)/100;
+ damage2 = damage2*(100+ 40*skill_lv)/100;
+ break;
+ case RG_INTIMIDATE: // ƒCƒ“ƒeƒBƒ~ƒfƒCƒg
+ damage = damage*(100+ 30*skill_lv)/100;
+ damage2 = damage2*(100+ 30*skill_lv)/100;
+ break;
+ case CR_SHIELDCHARGE: // ƒV[ƒ‹ƒhƒ`ƒƒ[ƒW
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_SHORT;
+ s_ele = 0;
+ break;
+ case CR_SHIELDBOOMERANG: // ƒV[ƒ‹ƒhƒu[ƒƒ‰ƒ“
+ damage = damage*(100+ 30*skill_lv)/100;
+ damage2 = damage2*(100+ 30*skill_lv)/100;
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ s_ele = 0;
+ break;
+ case CR_HOLYCROSS: // ƒz[ƒŠ[ƒNƒƒX
+ damage = damage*(100+ 35*skill_lv)/100;
+ damage2 = damage2*(100+ 35*skill_lv)/100;
+ div_=2;
+ break;
+ case CR_GRANDCROSS:
+ hitrate= 1000000;
+ break;
+ case AM_DEMONSTRATION: // ƒfƒ‚ƒ“ƒXƒgƒŒ[ƒVƒ‡ƒ“
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ break;
+ case AM_ACIDTERROR: // ƒAƒVƒbƒhƒeƒ‰[
+ damage = damage*(100+ 40*skill_lv)/100;
+ damage2 = damage2*(100+ 40*skill_lv)/100;
+ break;
+ case MO_FINGEROFFENSIVE: //Žw’e
+ if(battle_config.finger_offensive_type == 0) {
+ damage = damage * (100 + 50 * skill_lv) / 100 * sd->spiritball_old;
+ damage2 = damage2 * (100 + 50 * skill_lv) / 100 * sd->spiritball_old;
+ div_ = sd->spiritball_old;
+ }
+ else {
+ damage = damage * (100 + 50 * skill_lv) / 100;
+ damage2 = damage2 * (100 + 50 * skill_lv) / 100;
+ div_ = 1;
+ }
+ break;
+ case MO_INVESTIGATE: // ”­ ™¤
+ if(def1 < 1000000) {
+ damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
+ damage2 = damage2*(100+ 75*skill_lv)/100 * (def1 + def2)/100;
+ }
+ hitrate = 1000000;
+ s_ele = 0;
+ s_ele_ = 0;
+ break;
+ case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
+ damage = damage * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
+ damage2 = damage2 * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150);
+ sd->status.sp = 0;
+ clif_updatestatus(sd,SP_SP);
+ hitrate = 1000000;
+ s_ele = 0;
+ s_ele_ = 0;
+ break;
+ case MO_CHAINCOMBO: // ˜A‘Ŷ
+ damage = damage*(150+ 50*skill_lv)/100;
+ damage2 = damage2*(150+ 50*skill_lv)/100;
+ div_=4;
+ break;
+ case MO_COMBOFINISH: // –Ò—´Œ
+ damage = damage*(240+ 60*skill_lv)/100;
+ damage2 = damage2*(240+ 60*skill_lv)/100;
+ break;
+ case BA_MUSICALSTRIKE: // ƒ~ƒ…[ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN
+ if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
+ int arr = rand()%(sd->arrow_atk+1);
+ damage += arr;
+ damage2 += arr;
+ }
+ damage = damage*(100+ 50 * skill_lv)/100;
+ damage2 = damage2*(100+ 50 * skill_lv)/100;
+ if(sd->arrow_ele > 0) {
+ s_ele = sd->arrow_ele;
+ s_ele_ = sd->arrow_ele;
+ }
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ sd->state.arrow_atk = 1;
+ break;
+ case DC_THROWARROW: // –‚¿
+ if(!sd->state.arrow_atk && sd->arrow_atk > 0) {
+ int arr = rand()%(sd->arrow_atk+1);
+ damage += arr;
+ damage2 += arr;
+ }
+ damage = damage*(100+ 50 * skill_lv)/100;
+ damage2 = damage2*(100+ 50 * skill_lv)/100;
+ if(sd->arrow_ele > 0) {
+ s_ele = sd->arrow_ele;
+ s_ele_ = sd->arrow_ele;
+ }
+ flag=(flag&~BF_RANGEMASK)|BF_LONG;
+ sd->state.arrow_atk = 1;
+ break;
+ case CH_TIGERFIST: // •šŒÕŒ
+ damage = damage*(100+ 20*skill_lv)/100;
+ damage2 = damage2*(100+ 20*skill_lv)/100;
+ break;
+ case CH_CHAINCRUSH: // ˜A’Œ•öŒ‚
+ damage = damage*(100+ 60*skill_lv)/100;
+ damage2 = damage2*(100+ 60*skill_lv)/100;
+ div_=skill_get_num(skill_num,skill_lv);
+ break;
+ case CH_PALMSTRIKE: // –ÒŒÕd”hŽR
+ damage = damage*(50+ 100*skill_lv)/100;
+ damage2 = damage2*(50+ 100*skill_lv)/100;
+ break;
+ case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
+ damage = damage*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
+ damage2 = damage2*(100+ 50*skill_lv)/100; //‘‰Á—Ê‚ª•ª‚©‚ç‚È‚¢‚Ì‚Å“K“–‚É
+ div_=5;
+ if(tsd)
+ tsd->canmove_tick = gettick() + 1000;
+ else if(tmd)
+ tmd->canmove_tick = gettick() + 1000;
+ break;
+ case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ damage = damage*(100+ 40*skill_lv)/100;
+ damage2 = damage2*(100+ 40*skill_lv)/100;
+ break;
+ case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
+ damage = damage*(50+ 10*skill_lv)/100;
+ damage2 = damage2*(50+ 10*skill_lv)/100;
+ break;
+ case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
+ damage = damage*(40+ 40*skill_lv)/100;
+ damage2 = damage2*(40+ 40*skill_lv)/100;
+ break;
+ case SN_SHARPSHOOTING: /* ƒVƒƒ[ƒvƒVƒ…[ƒeƒBƒ“ƒO */
+ damage += damage*(30*skill_lv)/100;
+ damage2 += damage2*(30*skill_lv)/100;
+ break;
+ case CG_ARROWVULCAN: /* ƒAƒ[ƒoƒ‹ƒJƒ“ */
+ damage = damage*(200+100*skill_lv)/100;
+ damage2 = damage2*(200+100*skill_lv)/100;
+ div_=9;
+ break;
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
+ damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
+ damage2 = damage2*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
+ break;
+ case PA_SACRIFICE:
+ if(sd){
+ int hp, mhp, damage3;
+ hp = battle_get_hp(src);
+ mhp = battle_get_max_hp(src);
+ damage3 = mhp*9/100;
+ damage = damage*damage3*(90+10*skill_lv)/10000;
+ damage2 = damage2*damage3*(90+10*skill_lv)/10000;
+ }
+ break;
+ case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
+ if(sd){
+ int damage3;
+ int mdef1=battle_get_mdef(target);
+ int mdef2=battle_get_mdef2(target);
+ int imdef_flag=0;
+
+ damage = ((damage * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2;
+ damage2 = ((damage2 * 5) + (skill_lv * battle_get_int(src) * 5) + rand()%500 + 500) /2;
+ damage3 = damage;
+ hitrate = 1000000;
+
+ if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
+ imdef_flag = 1;
+ if(t_mode & 0x20) {
+ if(sd->ignore_mdef_race & (1<<10))
+ imdef_flag = 1;
+ }
+ else {
+ if(sd->ignore_mdef_race & (1<<11))
+ imdef_flag = 1;
+ }
+ if(!imdef_flag){
+ if(battle_config.magic_defense_type) {
+ damage3 = damage3 - (mdef1 * battle_config.magic_defense_type) - mdef2;
+ }
+ else{
+ damage3 = (damage3*(100-mdef1))/100 - mdef2;
+ }
+ }
+
+ if(damage3<1)
+ damage3=1;
+
+ damage3=battle_attr_fix(damage2,s_ele_, battle_get_element(target) );
+ }
+ break;
+ }
+ }
+ if(da == 2) { //ŽO’i¶‚ª”­“®‚µ‚Ä‚¢‚é‚©
+ type = 0x08;
+ div_ = 255; //ŽO’i¶—p‚Éc
+ damage = damage * (100 + 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100;
+ }
+
+ if( skill_num!=NPC_CRITICALSLASH ){
+ // ‘Î Û‚Ì–hŒä—Í‚É‚æ‚éƒ_ƒ[ƒW‚ÌŒ¸­
+ // ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“i‚±‚±‚Å‚¢‚¢‚Ì‚©‚ÈHj
+ if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT–³Ž‹
+ int t_def;
+ target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv);
+ if(battle_config.vit_penaly_type > 0) {
+ if(target_count >= battle_config.vit_penaly_count) {
+ if(battle_config.vit_penaly_type == 1) {
+ def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100;
+ }
+ else if(battle_config.vit_penaly_type == 2) {
+ def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num;
+ }
+ if(def1 < 0) def1 = 0;
+ if(def2 < 1) def2 = 1;
+ if(t_vit < 1) t_vit = 1;
+ }
+ }
+ t_def = def2*8/10;
+ vitbonusmax = (t_vit/20)*(t_vit/20)-1;
+ if(sd->ignore_def_ele & (1<<t_ele) || sd->ignore_def_race & (1<<t_race))
+ idef_flag = 1;
+ if(sd->ignore_def_ele_ & (1<<t_ele) || sd->ignore_def_race_ & (1<<t_race))
+ idef_flag_ = 1;
+ if(t_mode & 0x20) {
+ if(sd->ignore_def_race & (1<<10))
+ idef_flag = 1;
+ if(sd->ignore_def_race_ & (1<<10))
+ idef_flag_ = 1;
+ }
+ else {
+ if(sd->ignore_def_race & (1<<11))
+ idef_flag = 1;
+ if(sd->ignore_def_race_ & (1<<11))
+ idef_flag_ = 1;
+ }
+
+ if(!idef_flag){
+ if(battle_config.player_defense_type) {
+ damage = damage - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ else{
+ damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ }
+ if(!idef_flag_){
+ if(battle_config.player_defense_type) {
+ damage2 = damage2 - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ else{
+ damage2 = damage2 * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: rand()%(vitbonusmax+1) );
+ }
+ }
+ }
+ }
+ }
+ // ¸˜Bƒ_ƒ[ƒW‚̒ljÁ
+ if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT–³Ž‹
+ damage += battle_get_atk2(src);
+ damage2 += battle_get_atk_2(src);
+ }
+ if(skill_num == CR_SHIELDBOOMERANG) {
+ if(sd->equip_index[8] >= 0) {
+ int index = sd->equip_index[8];
+ if(sd->inventory_data[index] && sd->inventory_data[index]->type == 5) {
+ damage += sd->inventory_data[index]->weight/10;
+ damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1);
+ }
+ }
+ }
+ if(skill_num == LK_SPIRALPIERCE) { /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA[ƒX */
+ if(sd->equip_index[9] >= 0) { //d—ʂŒljÁƒ_ƒ[ƒW‚炵‚¢‚̂ŃV[ƒ‹ƒhƒu[ƒƒ‰ƒ“‚ðŽQl‚ɒljÁ
+ int index = sd->equip_index[9];
+ if(sd->inventory_data[index] && sd->inventory_data[index]->type == 4) {
+ damage += (int)(double)(sd->inventory_data[index]->weight*(0.8*skill_lv*4/10));
+ damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1);
+ }
+ }
+ }
+
+ // 0–¢–ž‚¾‚Á‚½ê‡1‚É•â³
+ if(damage<1) damage=1;
+ if(damage2<1) damage2=1;
+
+ // ƒXƒLƒ‹C³‚QiC—ûŒnj
+ // C—ûƒ_ƒ[ƒW(‰EŽè‚Ì‚Ý) ƒ\ƒjƒbƒNƒuƒ[Žž‚͕ʈ—i1Œ‚‚É•t‚«1/8“K‰ž)
+ if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != CR_GRANDCROSS) { //C—ûƒ_ƒ[ƒW–³Ž‹
+ damage = battle_addmastery(sd,target,damage,0);
+ damage2 = battle_addmastery(sd,target,damage2,1);
+ }
+
+ if(sd->perfect_hit > 0) {
+ if(rand()%100 < sd->perfect_hit)
+ hitrate = 1000000;
+ }
+
+ // ‰ñ”ðC³
+ if( hitrate < 1000000 && t_sc_data ) { // •K’†UŒ‚
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ hitrate -= 50;
+ if (t_sc_data[SC_SLEEP].timer!=-1 || // ‡–°‚Í•K’†
+ t_sc_data[SC_STAN].timer!=-1 || // ƒXƒ^ƒ“‚Í•K’†
+ t_sc_data[SC_FREEZE].timer!=-1 ||
+ (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0)) // “€Œ‹‚Í•K’†
+ hitrate = 1000000;
+ }
+ hitrate = (hitrate<5)?5:hitrate;
+ if(type == 0 && rand()%100 >= hitrate) {
+ damage = damage2 = 0;
+ dmg_lv = ATK_FLEE;
+ } else {
+ dmg_lv = ATK_DEF;
+ }
+
+ // ƒXƒLƒ‹C³‚Ri•ŠíŒ¤‹†j
+ if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) {
+ damage+= skill*2;
+ damage2+= skill*2;
+ }
+ //Advanced Katar Research by zanetheinsane
+ if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){
+ if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) {
+ damage += (damage*((skill*2)+10)) / 100 ;
+ }
+ }
+
+//ƒXƒLƒ‹‚É‚æ‚éƒ_ƒ[ƒW•â³‚±‚±‚Ü‚Å
+
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—‚±‚±‚©‚ç
+ cardfix=100;
+ if(!sd->state.arrow_atk) { //‹|–îˆÈŠO
+ if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
+ cardfix=cardfix*(100+sd->addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³
+ cardfix=cardfix*(100+sd->addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³
+ cardfix=cardfix*(100+sd->addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³
+ }
+ else {
+ cardfix=cardfix*(100+sd->addrace[t_race]+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
+ cardfix=cardfix*(100+sd->addele[t_ele]+sd->addele_[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
+ cardfix=cardfix*(100+sd->addsize[t_size]+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ }
+ else { //‹|–î
+ cardfix=cardfix*(100+sd->addrace[t_race]+sd->arrow_addrace[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
+ cardfix=cardfix*(100+sd->addele[t_ele]+sd->arrow_addele[t_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
+ cardfix=cardfix*(100+sd->addsize[t_size]+sd->arrow_addsize[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ if(t_mode & 0x20) { //ƒ{ƒX
+ if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO‚È‚ç
+ if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
+ cardfix=cardfix*(100+sd->addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
+ else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
+ cardfix=cardfix*(100+sd->addrace[10]+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ else //‹|–îUŒ‚
+ cardfix=cardfix*(100+sd->addrace[10]+sd->arrow_addrace[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ else { //ƒ{ƒX‚¶‚á‚È‚¢
+ if(!sd->state.arrow_atk) { //‹|–îUŒ‚ˆÈŠO
+ if(!battle_config.left_cardfix_to_right) //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
+ cardfix=cardfix*(100+sd->addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW
+ else //¶ŽèƒJ[ƒh•â³Ý’è‚ ‚è
+ cardfix=cardfix*(100+sd->addrace[11]+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(¶Žè‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ else
+ cardfix=cardfix*(100+sd->addrace[11]+sd->arrow_addrace[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW(‹|–î‚É‚æ‚é’ljÁ‚ ‚è)
+ }
+ //“Á’èClass—p•â³ˆ—(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
+ t_class = battle_get_class(target);
+ for(i=0;i<sd->add_damage_class_count;i++) {
+ if(sd->add_damage_classid[i] == t_class) {
+ cardfix=cardfix*(100+sd->add_damage_classrate[i])/100;
+ break;
+ }
+ }
+ if(skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix)
+ damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒW‘‰Á
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—‚±‚±‚Ü‚Å
+
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW’ljÁˆ—(¶Žè)‚±‚±‚©‚ç
+ cardfix=100;
+ if(!battle_config.left_cardfix_to_right) { //¶ŽèƒJ[ƒh•â³Ý’è–³‚µ
+ cardfix=cardfix*(100+sd->addrace_[t_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
+ cardfix=cardfix*(100+sd->addele_[t_ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
+ cardfix=cardfix*(100+sd->addsize_[t_size])/100; // ƒTƒCƒY‚É‚æ‚éƒ_ƒ[ƒWC³¶Žè
+ if(t_mode & 0x20) //ƒ{ƒX
+ cardfix=cardfix*(100+sd->addrace_[10])/100; //ƒ{ƒXƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
+ else
+ cardfix=cardfix*(100+sd->addrace_[11])/100; //ƒ{ƒXˆÈŠOƒ‚ƒ“ƒXƒ^[‚ɒljÁƒ_ƒ[ƒW¶Žè
+ }
+ //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
+ for(i=0;i<sd->add_damage_class_count_;i++) {
+ if(sd->add_damage_classid_[i] == t_class) {
+ cardfix=cardfix*(100+sd->add_damage_classrate_[i])/100;
+ break;
+ }
+ }
+ if(skill_num != CR_GRANDCROSS) damage2=damage2*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒW‘‰Á
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒW‘‰Áˆ—(¶Žè)‚±‚±‚Ü‚Å
+
+// -- moonsoul (cardfix for magic damage portion of ASC_BREAKER)
+ if(skill_num == ASC_BREAKER)
+ damage3 = damage3 * cardfix / 100;
+
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚©‚ç
+ if(tsd){ //‘ÎÛ‚ªPC‚Ìê‡
+ cardfix=100;
+ cardfix=cardfix*(100-tsd->subrace[s_race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subele[s_ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ if(battle_get_mode(src) & 0x20)
+ cardfix=cardfix*(100-tsd->subrace[10])/100; //ƒ{ƒX‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
+ else
+ cardfix=cardfix*(100-tsd->subrace[11])/100; //ƒ{ƒXˆÈŠO‚©‚ç‚ÌUŒ‚‚̓_ƒ[ƒWŒ¸­
+ //“Á’èClass—p•â³ˆ—¶Žè(­—‚Ì“ú‹L¨ƒ{ƒ“ƒSƒ“—pH)
+ for(i=0;i<tsd->add_def_class_count;i++) {
+ if(tsd->add_def_classid[i] == sd->status.class) {
+ cardfix=cardfix*(100-tsd->add_def_classrate[i])/100;
+ break;
+ }
+ }
+ if(flag&BF_LONG)
+ cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; //‰“‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ƒzƒ‹ƒ“C‚Æ‚©)
+ if(flag&BF_SHORT)
+ cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; //‹ß‹——£UŒ‚‚̓_ƒ[ƒWŒ¸­(ŠY“––³‚µH)
+ damage=damage*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
+ damage2=damage2*cardfix/100; //ƒJ[ƒh•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
+ }
+//ƒJ[ƒh‚É‚æ‚éƒ_ƒ[ƒWŒ¸Šˆ—‚±‚±‚Ü‚Å
+
+//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚©‚ç
+ if(t_sc_data) {
+ cardfix=100;
+ if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) //ƒfƒBƒtƒFƒ“ƒ_[ó‘Ԃʼn“‹——£UŒ‚
+ cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; //ƒfƒBƒtƒFƒ“ƒ_[‚É‚æ‚錸Š
+ if(t_sc_data[SC_FOGWALL].timer != -1 && flag&BF_LONG)
+ cardfix=cardfix*(100-t_sc_data[SC_FOGWALL].val2)/100;
+ if(cardfix != 100) {
+ damage=damage*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚éƒ_ƒ[ƒWŒ¸­
+ damage2=damage2*cardfix/100; //ƒfƒBƒtƒFƒ“ƒ_[•â³‚É‚æ‚鶎èƒ_ƒ[ƒWŒ¸­
+ }
+ if(t_sc_data[SC_ASSUMPTIO].timer != -1){ //ƒAƒXƒ€ƒvƒeƒBƒI
+ if(!map[target->m].flag.pvp){
+ damage=damage/3;
+ damage2=damage2/3;
+ }else{
+ damage=damage/2;
+ damage2=damage2/2;
+ }
+ }
+ }
+//‘ÎۂɃXƒe[ƒ^ƒXˆÙ킪‚ ‚éꇂ̃_ƒ[ƒWŒ¸ŽZˆ—‚±‚±‚Ü‚Å
+
+ if(damage < 0) damage = 0;
+ if(damage2 < 0) damage2 = 0;
+
+ // ‘® «‚Ì“K—p
+ damage=battle_attr_fix(damage,s_ele, battle_get_element(target) );
+ damage2=battle_attr_fix(damage2,s_ele_, battle_get_element(target) );
+
+ // ¯‚Ì‚©‚¯‚çA‹C‹…‚Ì“K—p
+ damage += sd->star;
+ damage2 += sd->star_;
+ damage += sd->spiritball*3;
+ damage2 += sd->spiritball*3;
+
+ if(sc_data && sc_data[SC_AURABLADE].timer!=-1){ /* ƒI[ƒ‰ƒuƒŒ[ƒh •K’† */
+ damage += sc_data[SC_AURABLADE].val1 * 10;
+ damage2 += sc_data[SC_AURABLADE].val1 * 10;
+ }
+ if(skill_num==PA_PRESSURE){ /* ƒvƒŒƒbƒVƒƒ[ •K’†? */
+ damage = 500+300*skill_lv;
+ damage2 = 500+300*skill_lv;
+ }
+
+ // >“ñ“—¬‚̶‰Eƒ_ƒ[ƒWŒvŽZ’N‚©‚â‚Á‚Ä‚­‚ê‚¥‚¥‚¥‚¥‚¦‚¦‚¦I
+ // >map_session_data ‚ɶŽèƒ_ƒ[ƒW(atk,atk2)’ljÁ‚µ‚Ä
+ // >pc_calcstatus()‚Å‚â‚é‚ׂ«‚©‚ÈH
+ // map_session_data ‚ɶŽè•Ší(atk,atk2,ele,star,atkmods)’ljÁ‚µ‚Ä
+ // pc_calcstatus()‚Ńf[ƒ^‚ð“ü—Í‚µ‚Ä‚¢‚Ü‚·
+
+ //¶Žè‚Ì‚Ý•Ší‘•”õ
+ if(sd->weapontype1 == 0 && sd->weapontype2 > 0) {
+ damage = damage2;
+ damage2 = 0;
+ }
+ // ‰EŽèA¶ŽèC—û‚Ì“K—p
+ if(sd->status.weapon > 16) {// “ñ“—¬‚©?
+ int dmg = damage, dmg2 = damage2;
+ // ‰EŽèC—û(60% ` 100%) ‰EŽè‘S”Ê
+ skill = pc_checkskill(sd,AS_RIGHT);
+ damage = damage * (50 + (skill * 10))/100;
+ if(dmg > 0 && damage < 1) damage = 1;
+ // ¶ŽèC—û(40% ` 80%) ¶Žè‘S”Ê
+ skill = pc_checkskill(sd,AS_LEFT);
+ damage2 = damage2 * (30 + (skill * 10))/100;
+ if(dmg2 > 0 && damage2 < 1) damage2 = 1;
+ }
+ else //“ñ“—¬‚Å‚È‚¯‚ê‚ζŽèƒ_ƒ[ƒW‚Í0
+ damage2 = 0;
+
+ // ‰EŽè,’ZŒ•‚Ì‚Ý
+ if(da == 1) { //ƒ_ƒuƒ‹ƒAƒ^ƒbƒN‚ª”­“®‚µ‚Ä‚¢‚é‚©
+ div_ = 2;
+ damage += damage;
+ type = 0x08;
+ }
+
+ if(sd->status.weapon == 16) {
+ // ƒJƒ^[ƒ‹’ÇŒ‚ƒ_ƒ[ƒW
+ skill = pc_checkskill(sd,TF_DOUBLE);
+ damage2 = damage * (1 + (skill * 2))/100;
+ if(damage > 0 && damage2 < 1) damage2 = 1;
+ }
+
+ // ƒCƒ“ƒxƒiƒ€C³
+ if(skill_num==TF_POISON){
+ damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) );
+ }
+ if(skill_num==MC_CARTREVOLUTION){
+ damage = battle_attr_fix(damage, 0, battle_get_element(target) );
+ }
+
+ // Š®‘S‰ñ”ð‚Ì”»’è
+ if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && div_ < 255 && rand()%1000 < battle_get_flee2(target) ){
+ damage=damage2=0;
+ type=0x0b;
+ dmg_lv = ATK_LUCKY;
+ }
+
+ // ‘ÎÛ‚ªŠ®‘S‰ñ”ð‚ð‚·‚éݒ肪ON‚È‚ç
+ if(battle_config.enemy_perfect_flee) {
+ if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && div_ < 255 && rand()%1000 < battle_get_flee2(target) ) {
+ damage=damage2=0;
+ type=0x0b;
+ dmg_lv = ATK_LUCKY;
+ }
+ }
+
+ //Mob‚ÌMode‚ÉŠæ‹­ƒtƒ‰ƒO‚ª—§‚Á‚Ä‚¢‚é‚Æ‚«‚̈—
+ if(t_mode&0x40){
+ if(damage > 0)
+ damage = 1;
+ if(damage2 > 0)
+ damage2 = 1;
+ }
+
+ //bNoWeaponDamage(Ý’èƒAƒCƒeƒ€–³‚µH)‚ŃOƒ‰ƒ“ƒhƒNƒƒX‚¶‚á‚È‚¢ê‡‚̓_ƒ[ƒW‚ª0
+ if( tsd && tsd->special_state.no_weapon_damage && skill_num != CR_GRANDCROSS)
+ damage = damage2 = 0;
+
+ if(skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0) ) {
+ if(damage2<1) // ƒ_ƒ[ƒWÅIC³
+ damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag);
+ else if(damage<1) // ‰EŽè‚ªƒ~ƒXH
+ damage2=battle_calc_damage(src,target,damage2,div_,skill_num,skill_lv,flag);
+ else { // —¼ Žè/ƒJƒ^[ƒ‹‚Ìꇂ͂¿‚å‚Á‚ÆŒvŽZ‚â‚₱‚µ‚¢
+ int d1=damage+damage2,d2=damage2;
+ damage=battle_calc_damage(src,target,damage+damage2,div_,skill_num,skill_lv,flag);
+ damage2=(d2*100/d1)*damage/100;
+ if(damage > 1 && damage2 < 1) damage2=1;
+ damage-=damage2;
+ }
+ }
+
+ /* For executioner card [Valaris] */
+ if(src->type == BL_PC && sd->random_attack_increase_add > 0 && sd->random_attack_increase_per > 0 && skill_num == 0 ){
+ if(rand()%100 < sd->random_attack_increase_per){
+ if(damage >0) damage*=sd->random_attack_increase_add/100;
+ if(damage2 >0) damage2*=sd->random_attack_increase_add/100;
+ }
+ }
+ /* End addition */
+
+// -- moonsoul (final combination of phys, mag damage for ASC_BREAKER)
+ if(skill_num == ASC_BREAKER) {
+ damage += damage3;
+ damage2 += damage3;
+ }
+
+ wd.damage=damage;
+ wd.damage2=damage2;
+ wd.type=type;
+ wd.div_=div_;
+ wd.amotion=battle_get_amotion(src);
+ if(skill_num == KN_AUTOCOUNTER)
+ wd.amotion >>= 1;
+ wd.dmotion=battle_get_dmotion(target);
+ wd.blewcount=blewcount;
+ wd.flag=flag;
+ wd.dmg_lv=dmg_lv;
+
+ return wd;
+}
+
+/*==========================================
+ * •Šíƒ_ƒ[ƒWŒvŽZ
+ *------------------------------------------
+ */
+struct Damage battle_calc_weapon_attack(
+ struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag)
+{
+ struct Damage wd;
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if (src == NULL || target == NULL) {
+ nullpo_info(NLP_MARK);
+ memset(&wd,0,sizeof(wd));
+ return wd;
+ }
+
+ if(target->type == BL_PET)
+ memset(&wd,0,sizeof(wd));
+
+ else if(src->type == BL_PC)
+ wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
+ else if(src->type == BL_MOB)
+ wd = battle_calc_mob_weapon_attack(src,target,skill_num,skill_lv,wflag);
+ else if(src->type == BL_PET)
+ wd = battle_calc_pet_weapon_attack(src,target,skill_num,skill_lv,wflag);
+ else
+ memset(&wd,0,sizeof(wd));
+
+ if(battle_config.equipment_breaking && src->type==BL_PC && (wd.damage > 0 || wd.damage2 > 0)) {
+ struct map_session_data *sd=(struct map_session_data *)src;
+ int breakrate=1;
+ if(sd->status.weapon && sd->status.weapon!=11) {
+ if(target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer!=-1){
+ breakrate+=100*sd->sc_data[SC_MELTDOWN].val1;
+ if(rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000)
+ pc_breakweapon((struct map_session_data *)target);
+ }
+ if(sd->sc_data[SC_OVERTHRUST].timer!=-1)
+ breakrate+=20*sd->sc_data[SC_OVERTHRUST].val1;
+ if(wd.type==0x0a)
+ breakrate*=2;
+ if(rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) {
+ if(pc_breakweapon(sd)==1)
+ wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag);
+ }
+ }
+ }
+
+ if (battle_config.equipment_breaking && target->type == BL_PC && (wd.damage > 0 || wd.damage2 > 0)) {
+ int breakrate=1;
+ if(src->type==BL_PC && ((struct map_session_data *)src)->sc_data[SC_MELTDOWN].timer!=-1) breakrate+=70*((struct map_session_data *)src)->sc_data[SC_MELTDOWN].val1;
+ if (wd.type==0x0a)
+ breakrate*=2;
+ if (rand()%10000 < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) {
+ pc_breakarmor((struct map_session_data *)target);
+ }
+ }
+
+ return wd;
+}
+
+/*==========================================
+ * –‚–@ƒ_ƒ[ƒWŒvŽZ
+ *------------------------------------------
+ */
+struct Damage battle_calc_magic_attack(
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
+ {
+ int mdef1=battle_get_mdef(target);
+ int mdef2=battle_get_mdef2(target);
+ int matk1,matk2,damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv),rdamage = 0;
+ struct Damage md;
+ int aflag;
+ int normalmagic_flag=1;
+ int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i;
+ struct map_session_data *sd=NULL,*tsd=NULL;
+ struct mob_data *tmd = NULL;
+
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if( bl == NULL || target == NULL ){
+ nullpo_info(NLP_MARK);
+ memset(&md,0,sizeof(md));
+ return md;
+ }
+
+ if(target->type == BL_PET) {
+ memset(&md,0,sizeof(md));
+ return md;
+ }
+
+ matk1=battle_get_matk1(bl);
+ matk2=battle_get_matk2(bl);
+ ele = skill_get_pl(skill_num);
+ race = battle_get_race(bl);
+ t_ele = battle_get_elem_type(target);
+ t_race = battle_get_race(target);
+ t_mode = battle_get_mode(target);
+
+#define MATK_FIX( a,b ) { matk1=matk1*(a)/(b); matk2=matk2*(a)/(b); }
+
+ if( bl->type==BL_PC && (sd=(struct map_session_data *)bl) ){
+ sd->state.attack_type = BF_MAGIC;
+ if(sd->matk_rate != 100)
+ MATK_FIX(sd->matk_rate,100);
+ sd->state.arrow_atk = 0;
+ }
+ if( target->type==BL_PC )
+ tsd=(struct map_session_data *)target;
+ else if( target->type==BL_MOB )
+ tmd=(struct mob_data *)target;
+
+ aflag=BF_MAGIC|BF_LONG|BF_SKILL;
+
+ if(skill_num > 0){
+ switch(skill_num){ // Šî–{ƒ_ƒ[ƒWŒvŽZ(ƒXƒLƒ‹‚²‚ƂɈ—)
+ // ƒq[ƒ‹or¹‘Ì
+ case AL_HEAL:
+ case PR_BENEDICTIO:
+ damage = skill_calc_heal(bl,skill_lv)/2;
+ normalmagic_flag=0;
+ break;
+ case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
+ damage = 40; //ŒÅ’èƒ_ƒ[ƒW
+ normalmagic_flag=0;
+ break;
+ case PR_SANCTUARY: // ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ
+ damage = (skill_lv>6)?388:skill_lv*50;
+ normalmagic_flag=0;
+ blewcount|=0x10000;
+ break;
+ case ALL_RESURRECTION:
+ case PR_TURNUNDEAD: // UŒ‚ƒŠƒUƒŒƒNƒVƒ‡ƒ“‚ƃ^[ƒ“ƒAƒ“ƒfƒbƒh
+ if(target->type != BL_PC && battle_check_undead(t_race,t_ele)){
+ int hp, mhp, thres;
+ hp = battle_get_hp(target);
+ mhp = battle_get_max_hp(target);
+ thres = (skill_lv * 20) + battle_get_luk(bl)+
+ battle_get_int(bl) + battle_get_lv(bl)+
+ ((200 - hp * 200 / mhp));
+ if(thres > 700) thres = 700;
+// if(battle_config.battle_log)
+// printf("ƒ^[ƒ“ƒAƒ“ƒfƒbƒhI Šm—¦%d ñ(番—¦)\n", thres);
+ if(rand()%1000 < thres && !(t_mode&0x20)) // ¬Œ÷
+ damage = hp;
+ else // Ž¸”s
+ damage = battle_get_lv(bl) + battle_get_int(bl) + skill_lv * 10;
+ }
+ normalmagic_flag=0;
+ break;
+
+ case MG_NAPALMBEAT: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
+ MATK_FIX(70+ skill_lv*10,100);
+ if(flag>0){
+ MATK_FIX(1,flag);
+ }else {
+ if(battle_config.error_log)
+ printf("battle_calc_magic_attack(): napam enemy count=0 !\n");
+ }
+ break;
+ case MG_FIREBALL: // ƒtƒ@ƒCƒ„[ƒ{[ƒ‹
+ {
+ const int drate[]={100,90,70};
+ if(flag>2)
+ matk1=matk2=0;
+ else
+ MATK_FIX( (95+skill_lv*5)*drate[flag] ,10000 );
+ }
+ break;
+ case MG_FIREWALL: // ƒtƒ@ƒCƒ„[ƒEƒH[ƒ‹
+/*
+ if( (t_ele!=3 && !battle_check_undead(t_race,t_ele)) || target->type==BL_PC ) //PC‚͉Α®«‚Å‚à”ò‚ÔH‚»‚à‚»‚àƒ_ƒ[ƒWŽó‚¯‚éH
+ blewcount |= 0x10000;
+ else
+ blewcount = 0;
+*/
+ if((t_ele==3 || battle_check_undead(t_race,t_ele)) && target->type!=BL_PC)
+ blewcount = 0;
+ else
+ blewcount |= 0x10000;
+ MATK_FIX( 1,2 );
+ break;
+ case MG_THUNDERSTORM: // ƒTƒ“ƒ_[ƒXƒg[ƒ€
+ MATK_FIX( 80,100 );
+ break;
+ case MG_FROSTDIVER: // ƒtƒƒXƒgƒ_ƒCƒo
+ MATK_FIX( 100+skill_lv*10, 100);
+ break;
+ case WZ_FROSTNOVA: // ƒtƒƒXƒgƒ_ƒCƒo
+ MATK_FIX((100+skill_lv*10)*2/3, 100);
+ break;
+ case WZ_FIREPILLAR: // ƒtƒ@ƒCƒ„[ƒsƒ‰[
+ if(mdef1 < 1000000)
+ mdef1=mdef2=0; // MDEF–³Ž‹
+ MATK_FIX( 1,5 );
+ matk1+=50;
+ matk2+=50;
+ break;
+ case WZ_SIGHTRASHER:
+ MATK_FIX( 100+skill_lv*20, 100);
+ break;
+ case WZ_METEOR:
+ case WZ_JUPITEL: // ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_[
+ break;
+ case WZ_VERMILION: // ƒ[ƒhƒIƒuƒo[ƒ~ƒŠƒIƒ“
+ MATK_FIX( skill_lv*20+80, 100 );
+ break;
+ case WZ_WATERBALL: // ƒEƒH[ƒ^[ƒ{[ƒ‹
+ //matk1+= skill_lv*30;
+ //matk2+= skill_lv*30;
+ MATK_FIX( 100+skill_lv*30, 100 );
+ break;
+ case WZ_STORMGUST: // ƒXƒg[ƒ€ƒKƒXƒg
+ MATK_FIX( skill_lv*40+100 ,100 );
+ blewcount|=0x10000;
+ break;
+ case AL_HOLYLIGHT: // ƒz[ƒŠ[ƒ‰ƒCƒg
+ MATK_FIX( 125,100 );
+ break;
+ case AL_RUWACH:
+ MATK_FIX( 145,100 );
+ break;
+ case HW_NAPALMVULCAN: // ƒiƒp[ƒ€ƒr[ƒgi•ªŽUŒvŽZž‚Ýj
+ MATK_FIX(70+ skill_lv*10,100);
+ if(flag>0){
+ MATK_FIX(1,flag);
+ }else {
+ if(battle_config.error_log)
+ printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n");
+ }
+ break;
+ }
+ }
+
+ if(normalmagic_flag){ // ˆê”Ê–‚–@ƒ_ƒ[ƒWŒvŽZ
+ int imdef_flag=0;
+ if(matk1>matk2)
+ damage= matk2+rand()%(matk1-matk2+1);
+ else
+ damage= matk2;
+ if(sd) {
+ if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
+ imdef_flag = 1;
+ if(t_mode & 0x20) {
+ if(sd->ignore_mdef_race & (1<<10))
+ imdef_flag = 1;
+ }
+ else {
+ if(sd->ignore_mdef_race & (1<<11))
+ imdef_flag = 1;
+ }
+ }
+ if(!imdef_flag){
+ if(battle_config.magic_defense_type) {
+ damage = damage - (mdef1 * battle_config.magic_defense_type) - mdef2;
+ }
+ else{
+ damage = (damage*(100-mdef1))/100 - mdef2;
+ }
+ }
+
+ if(damage<1)
+ damage=1;
+ }
+
+ if(sd) {
+ cardfix=100;
+ cardfix=cardfix*(100+sd->magic_addrace[t_race])/100;
+ cardfix=cardfix*(100+sd->magic_addele[t_ele])/100;
+ if(t_mode & 0x20)
+ cardfix=cardfix*(100+sd->magic_addrace[10])/100;
+ else
+ cardfix=cardfix*(100+sd->magic_addrace[11])/100;
+ t_class = battle_get_class(target);
+ for(i=0;i<sd->add_magic_damage_class_count;i++) {
+ if(sd->add_magic_damage_classid[i] == t_class) {
+ cardfix=cardfix*(100+sd->add_magic_damage_classrate[i])/100;
+ break;
+ }
+ }
+ damage=damage*cardfix/100;
+ }
+
+ if( tsd ){
+ int s_class = battle_get_class(bl);
+ cardfix=100;
+ cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘® «‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->magic_subrace[race])/100;
+ if(battle_get_mode(bl) & 0x20)
+ cardfix=cardfix*(100-tsd->magic_subrace[10])/100;
+ else
+ cardfix=cardfix*(100-tsd->magic_subrace[11])/100;
+ for(i=0;i<tsd->add_mdef_class_count;i++) {
+ if(tsd->add_mdef_classid[i] == s_class) {
+ cardfix=cardfix*(100-tsd->add_mdef_classrate[i])/100;
+ break;
+ }
+ }
+ cardfix=cardfix*(100-tsd->magic_def_rate)/100;
+ damage=damage*cardfix/100;
+ }
+ if(damage < 0) damage = 0;
+
+ damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // ‘® «C³
+
+ if(skill_num == CR_GRANDCROSS) { // ƒOƒ‰ƒ“ƒhƒNƒƒX
+ struct Damage wd;
+ wd=battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
+ damage = (damage + wd.damage) * (100 + 40*skill_lv)/100;
+ if(battle_config.gx_dupele) damage=battle_attr_fix(damage, ele, battle_get_element(target) ); //‘®«2‰ñ‚©‚©‚é
+ if(bl==target) damage=damage/2; //”½“®‚Í”¼•ª
+ }
+
+ div_=skill_get_num( skill_num,skill_lv );
+
+ if(div_>1 && skill_num != WZ_VERMILION)
+ damage*=div_;
+
+// if(mdef1 >= 1000000 && damage > 0)
+ if(t_mode&0x40 && damage > 0)
+ damage = 1;
+
+ if( tsd && tsd->special_state.no_magic_damage) {
+ if (battle_config.gtb_pvp_only != 0) { // [MouseJstr]
+ if ((map[target->m].flag.pvp || map[target->m].flag.gvg) && target->type==BL_PC)
+ damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100;
+ } else
+ damage=0; // ‰© ‹à峃J[ƒhi–‚–@ƒ_ƒ[ƒW‚Oj
+ }
+
+ damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
+
+ /* magic_damage_return by [AppleGirl] and [Valaris] */
+ if( target->type==BL_PC && tsd && tsd->magic_damage_return > 0 ){
+ rdamage += damage * tsd->magic_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ clif_damage(target,bl,gettick(),0,0,rdamage,0,0,0);
+ battle_damage(target,bl,rdamage,0);
+ }
+ /* end magic_damage_return */
+
+ md.damage=damage;
+ md.div_=div_;
+ md.amotion=battle_get_amotion(bl);
+ md.dmotion=battle_get_dmotion(target);
+ md.damage2=0;
+ md.type=0;
+ md.blewcount=blewcount;
+ md.flag=aflag;
+
+ return md;
+}
+
+/*==========================================
+ * ‚»‚Ì‘¼ƒ_ƒ[ƒWŒvŽZ
+ *------------------------------------------
+ */
+struct Damage battle_calc_misc_attack(
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
+{
+ int int_=battle_get_int(bl);
+// int luk=battle_get_luk(bl);
+ int dex=battle_get_dex(bl);
+ int skill,ele,race,cardfix;
+ struct map_session_data *sd=NULL,*tsd=NULL;
+ int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv);
+ struct Damage md;
+ int damagefix=1;
+
+ int aflag=BF_MISC|BF_LONG|BF_SKILL;
+
+ //return‘O‚̈—‚ª‚ ‚é‚Ì‚Åî•ño—Í•”‚Ì‚Ý•ÏX
+ if( bl == NULL || target == NULL ){
+ nullpo_info(NLP_MARK);
+ memset(&md,0,sizeof(md));
+ return md;
+ }
+
+ if(target->type == BL_PET) {
+ memset(&md,0,sizeof(md));
+ return md;
+ }
+
+ if( bl->type == BL_PC && (sd=(struct map_session_data *)bl) ) {
+ sd->state.attack_type = BF_MISC;
+ sd->state.arrow_atk = 0;
+ }
+
+ if( target->type==BL_PC )
+ tsd=(struct map_session_data *)target;
+
+ switch(skill_num){
+
+ case HT_LANDMINE: // ƒ‰ƒ“ƒhƒ}ƒCƒ“
+ damage=skill_lv*(dex+75)*(100+int_)/100;
+ break;
+
+ case HT_BLASTMINE: // ƒuƒ‰ƒXƒgƒ}ƒCƒ“
+ damage=skill_lv*(dex/2+50)*(100+int_)/100;
+ break;
+
+ case HT_CLAYMORETRAP: // ƒNƒŒƒCƒ‚ƒA[ƒgƒ‰ƒbƒv
+ damage=skill_lv*(dex/2+75)*(100+int_)/100;
+ break;
+
+ case HT_BLITZBEAT: // ƒuƒŠƒbƒcƒr[ƒg
+ if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0)
+ skill=0;
+ damage=(dex/10+int_/2+skill*3+40)*2;
+ if(flag > 1)
+ damage /= flag;
+ break;
+
+ case TF_THROWSTONE: // ΓŠ‚°
+ damage=50;
+ damagefix=0;
+ break;
+
+ case BA_DISSONANCE: // •s‹¦˜a‰¹
+ damage=(skill_lv)*20+pc_checkskill(sd,BA_MUSICALLESSON)*3;
+ break;
+
+ case NPC_SELFDESTRUCTION: // Ž©”š
+ damage=battle_get_hp(bl)-(bl==target?1:0);
+ damagefix=0;
+ break;
+
+ case NPC_SMOKING: // ƒ^ƒoƒR‚ð‹z‚¤
+ damage=3;
+ damagefix=0;
+ break;
+
+ case NPC_DARKBREATH:
+ {
+ struct status_change *sc_data = battle_get_sc_data(target);
+ int hitrate=battle_get_hit(bl) - battle_get_flee(target) + 80;
+ hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) );
+ if(sc_data && (sc_data[SC_SLEEP].timer!=-1 || sc_data[SC_STAN].timer!=-1 ||
+ sc_data[SC_FREEZE].timer!=-1 || (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) ) )
+ hitrate = 1000000;
+ if(rand()%100 < hitrate) {
+ damage = 500 + (skill_lv-1)*1000 + rand()%1000;
+ if(damage > 9999) damage = 9999;
+ }
+ }
+ break;
+ case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
+ skill = pc_checkskill(sd,HT_STEELCROW); // Celest
+ damage=((150+50*skill_lv)*(dex/10+int_/2+skill*3+40)*2)/100;
+ break;
+ }
+
+ ele = skill_get_pl(skill_num);
+ race = battle_get_race(bl);
+
+ if(damagefix){
+ if(damage<1 && skill_num != NPC_DARKBREATH)
+ damage=1;
+
+ if( tsd ){
+ cardfix=100;
+ cardfix=cardfix*(100-tsd->subele[ele])/100; // ‘®«‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->subrace[race])/100; // Ží‘°‚É‚æ‚éƒ_ƒ[ƒW‘Ï«
+ cardfix=cardfix*(100-tsd->misc_def_rate)/100;
+ damage=damage*cardfix/100;
+ }
+ if(damage < 0) damage = 0;
+ damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // ‘®«C³
+ }
+
+ div_=skill_get_num( skill_num,skill_lv );
+ if(div_>1)
+ damage*=div_;
+
+ if(damage > 0 && (damage < div_ || (battle_get_def(target) >= 1000000 && battle_get_mdef(target) >= 1000000) ) ) {
+ damage = div_;
+ }
+
+ damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // ÅIC³
+
+ md.damage=damage;
+ md.div_=div_;
+ md.amotion=battle_get_amotion(bl);
+ md.dmotion=battle_get_dmotion(target);
+ md.damage2=0;
+ md.type=0;
+ md.blewcount=blewcount;
+ md.flag=aflag;
+ return md;
+
+}
+/*==========================================
+ * ƒ_ƒ[ƒWŒvŽZˆêŠ‡ˆ——p
+ *------------------------------------------
+ */
+struct Damage battle_calc_attack( int attack_type,
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
+{
+ struct Damage d;
+ switch(attack_type){
+ case BF_WEAPON:
+ return battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
+ case BF_MAGIC:
+ return battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag);
+ case BF_MISC:
+ return battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag);
+ default:
+ if(battle_config.error_log)
+ printf("battle_calc_attack: unknwon attack type ! %d\n",attack_type);
+ break;
+ }
+ return d;
+}
+/*==========================================
+ * ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
+ *------------------------------------------
+ */
+int battle_weapon_attack( struct block_list *src,struct block_list *target,
+ unsigned int tick,int flag)
+{
+ struct map_session_data *sd=NULL;
+ struct status_change *sc_data = battle_get_sc_data(src),*t_sc_data=battle_get_sc_data(target);
+ short *opt1;
+ int race = 7, ele = 0;
+ int damage,rdamage = 0;
+ struct Damage wd;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, target);
+
+ if(src->type == BL_PC)
+ sd = (struct map_session_data *)src;
+
+ if(src->prev == NULL || target->prev == NULL)
+ return 0;
+ if(src->type == BL_PC && pc_isdead(sd))
+ return 0;
+ if(target->type == BL_PC && pc_isdead((struct map_session_data *)target))
+ return 0;
+
+ opt1=battle_get_opt1(src);
+ if(opt1 && *opt1 > 0) {
+ battle_stopattack(src);
+ return 0;
+ }
+ if(sc_data && sc_data[SC_BLADESTOP].timer!=-1){
+ battle_stopattack(src);
+ return 0;
+ }
+
+ race = battle_get_race(target);
+ ele = battle_get_elem_type(target);
+ if(battle_check_target(src,target,BCT_ENEMY) > 0 &&
+ battle_check_range(src,target,0)){
+ // UŒ‚‘ÎۂƂȂ肤‚é‚Ì‚ÅUŒ‚
+ if(sd && sd->status.weapon == 11) {
+ if(sd->equip_index[10] >= 0) {
+ if(battle_config.arrow_decrement)
+ pc_delitem(sd,sd->equip_index[10],1,0);
+ }
+ else {
+ clif_arrow_fail(sd,0);
+ return 0;
+ }
+ }
+ if(flag&0x8000) {
+ if(sd && battle_config.pc_attack_direction_change)
+ sd->dir = sd->head_dir = map_calc_dir(src, target->x,target->y );
+ else if(src->type == BL_MOB && battle_config.monster_attack_direction_change)
+ ((struct mob_data *)src)->dir = map_calc_dir(src, target->x,target->y );
+ wd=battle_calc_weapon_attack(src,target,KN_AUTOCOUNTER,flag&0xff,0);
+ }
+ else
+ wd=battle_calc_weapon_attack(src,target,0,0,0);
+ if((damage = wd.damage + wd.damage2) > 0 && src != target) {
+ if(wd.flag&BF_SHORT) {
+ if(target->type == BL_PC) {
+ struct map_session_data *tsd = (struct map_session_data *)target;
+ if(tsd && tsd->short_weapon_damage_return > 0) {
+ rdamage += damage * tsd->short_weapon_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ if(t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) {
+ rdamage += damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ else if(wd.flag&BF_LONG) {
+ if(target->type == BL_PC) {
+ struct map_session_data *tsd = (struct map_session_data *)target;
+ if(tsd && tsd->long_weapon_damage_return > 0) {
+ rdamage += damage * tsd->long_weapon_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ }
+ if(rdamage > 0)
+ clif_damage(src,src,tick, wd.amotion,0,rdamage,1,4,0);
+ }
+
+ if (wd.div_ == 255 && sd) { //ŽO’i¶
+ int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
+ int skilllv;
+ if(wd.damage+wd.damage2 < battle_get_hp(target)) {
+ if((skilllv = pc_checkskill(sd, MO_CHAINCOMBO)) > 0)
+ delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
+
+ skill_status_change_start(src,SC_COMBO,MO_TRIPLEATTACK,skilllv,0,0,delay,0);
+ }
+ sd->attackabletime = sd->canmove_tick = tick + delay;
+ clif_combo_delay(src,delay);
+ clif_skill_damage(src , target , tick , wd.amotion , wd.dmotion ,
+ wd.damage , 3 , MO_TRIPLEATTACK, pc_checkskill(sd,MO_TRIPLEATTACK) , -1 );
+ }
+ else {
+ clif_damage(src,target,tick, wd.amotion, wd.dmotion,
+ wd.damage, wd.div_ , wd.type, wd.damage2);
+ //“ñ“—¬¶Žè‚ƃJƒ^[ƒ‹’ÇŒ‚‚̃~ƒX•\Ž¦(–³—‚â‚è`)
+ if(sd && sd->status.weapon >= 16 && wd.damage2 == 0)
+ clif_damage(src,target,tick+10, wd.amotion, wd.dmotion,0, 1, 0, 0);
+ }
+ if(sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0) )
+ skill_castend_damage_id(src,target,0,-1,tick,0);
+ map_freeblock_lock();
+ battle_damage(src,target,(wd.damage+wd.damage2),0);
+ if(target->prev != NULL &&
+ (target->type != BL_PC || (target->type == BL_PC && !pc_isdead((struct map_session_data *)target) ) ) ) {
+ if(wd.damage > 0 || wd.damage2 > 0) {
+ skill_additional_effect(src,target,0,0,BF_WEAPON,tick);
+ if(sd) {
+ if(sd->weapon_coma_ele[ele] > 0 && rand()%10000 < sd->weapon_coma_ele[ele])
+ battle_damage(src,target,battle_get_max_hp(target),1);
+ if(sd->weapon_coma_race[race] > 0 && rand()%10000 < sd->weapon_coma_race[race])
+ battle_damage(src,target,battle_get_max_hp(target),1);
+ if(battle_get_mode(target) & 0x20) {
+ if(sd->weapon_coma_race[10] > 0 && rand()%10000 < sd->weapon_coma_race[10])
+ battle_damage(src,target,battle_get_max_hp(target),1);
+ }
+ else {
+ if(sd->weapon_coma_race[11] > 0 && rand()%10000 < sd->weapon_coma_race[11])
+ battle_damage(src,target,battle_get_max_hp(target),1);
+ }
+ }
+ }
+ }
+ if(sc_data && sc_data[SC_AUTOSPELL].timer != -1 && rand()%100 < sc_data[SC_AUTOSPELL].val4) {
+ int skilllv=sc_data[SC_AUTOSPELL].val3,i,f=0;
+ i = rand()%100;
+ if(i >= 50) skilllv -= 2;
+ else if(i >= 15) skilllv--;
+ if(skilllv < 1) skilllv = 1;
+ if(sd) {
+ int sp = skill_get_sp(sc_data[SC_AUTOSPELL].val2,skilllv)*2/3;
+ if(sd->status.sp >= sp) {
+ if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
+ f = skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ else {
+ switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
+ case 0: case 2:
+ f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ break;
+ case 1:/* Žx‰‡Œn */
+ if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
+ f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ else
+ f = skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ break;
+ }
+ }
+ if(!f) pc_heal(sd,0,-sp);
+ }
+ }
+ else {
+ if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32)
+ skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ else {
+ switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) {
+ case 0: case 2:
+ skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ break;
+ case 1:/* Žx‰‡Œn */
+ if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
+ skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ else
+ skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag);
+ break;
+ }
+ }
+ }
+ }
+ if(sd) {
+ if(sd->autospell_id > 0 && sd->autospell_lv > 0 && rand()%100 < sd->autospell_rate) {
+ int skilllv=sd->autospell_lv,i,f=0,sp;
+ i = rand()%100;
+ if(i >= 50) skilllv -= 2;
+ else if(i >= 15) skilllv--;
+ if(skilllv < 1) skilllv = 1;
+ sp = skill_get_sp(sd->autospell_id,skilllv)*2/3;
+ if(sd->status.sp >= sp) {
+ if((i=skill_get_inf(sd->autospell_id) == 2) || i == 32)
+ f = skill_castend_pos2(src,target->x,target->y,sd->autospell_id,skilllv,tick,flag);
+ else {
+ switch( skill_get_nk(sd->autospell_id) ) {
+ case 0: case 2:
+ f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
+ break;
+ case 1:/* Žx‰‡Œn */
+ if((sd->autospell_id==AL_HEAL || (sd->autospell_id==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele))
+ f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag);
+ else
+ f = skill_castend_nodamage_id(src,target,sd->autospell_id,skilllv,tick,flag);
+ break;
+ }
+ }
+ if(!f) pc_heal(sd,0,-sp);
+ }
+ }
+ if(wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) {
+ int hp = 0,sp = 0;
+ if(sd->hp_drain_rate && sd->hp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->hp_drain_rate) {
+ hp += (wd.damage * sd->hp_drain_per)/100;
+ if(sd->hp_drain_rate > 0 && hp < 1) hp = 1;
+ else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1;
+ }
+ if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) {
+ hp += (wd.damage2 * sd->hp_drain_per_)/100;
+ if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1;
+ else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1;
+ }
+ if(sd->sp_drain_rate && sd->sp_drain_per > 0 && wd.damage > 0 && rand()%100 < sd->sp_drain_rate) {
+ sp += (wd.damage * sd->sp_drain_per)/100;
+ if(sd->sp_drain_rate > 0 && sp < 1) sp = 1;
+ else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1;
+ }
+ if(sd->sp_drain_rate_ && sd->sp_drain_per_ > 0 && wd.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
+ sp += (wd.damage2 * sd->sp_drain_per_)/100;
+ if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
+ else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
+ }
+ if(hp || sp) pc_heal(sd,hp,sp);
+ }
+ }
+
+ if(rdamage > 0)
+ battle_damage(target,src,rdamage,0);
+ if(t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 && t_sc_data[SC_AUTOCOUNTER].val4 > 0) {
+ if(t_sc_data[SC_AUTOCOUNTER].val3 == src->id)
+ battle_weapon_attack(target,src,tick,0x8000|t_sc_data[SC_AUTOCOUNTER].val1);
+ skill_status_change_end(target,SC_AUTOCOUNTER,-1);
+ }
+ if(t_sc_data && t_sc_data[SC_POISONREACT].timer != -1 && t_sc_data[SC_POISONREACT].val4 > 0) { // poison react [Celest]
+ if(t_sc_data[SC_POISONREACT].val3 == src->id) {
+ struct map_session_data *tsd = (struct map_session_data *)target;
+ if ((src->type == BL_MOB && battle_get_elem_type(src)==5) || (src->type == BL_PC && battle_get_attack_element(src)==5)) {
+ t_sc_data[SC_POISONREACT].val2 = 0;
+ battle_weapon_attack(target,src,tick,flag|t_sc_data[SC_POISONREACT].val1);
+ } else {
+ skill_use_id(tsd,src->id,TF_POISON,5);
+ --t_sc_data[SC_POISONREACT].val2;
+ }
+ if (t_sc_data[SC_POISONREACT].val2<=0)
+ skill_status_change_end(target,SC_POISONREACT,-1);
+ }
+ }
+ if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){
+ int lv = t_sc_data[SC_BLADESTOP_WAIT].val1;
+ skill_status_change_end(target,SC_BLADESTOP_WAIT,-1);
+ skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0);
+ skill_status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0);
+ }
+ if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //‰£‚Á‚½‚Ì‚Å‘Îۂ̃xƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ó‘Ô‚ð‰ðœ
+ skill_status_change_end(target,SC_SPLASHER,-1);
+
+ map_freeblock_unlock();
+ }
+ return wd.dmg_lv;
+}
+
+int battle_check_undead(int race,int element)
+{
+ if(battle_config.undead_detect_type == 0) {
+ if(element == 9)
+ return 1;
+ }
+ else if(battle_config.undead_detect_type == 1) {
+ if(race == 1)
+ return 1;
+ }
+ else {
+ if(element == 9 || race == 1)
+ return 1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * “G–¡•û”»’è(1=m’è,0=”Û’è,-1=ƒGƒ‰[)
+ * flag&0xf0000 = 0x00000:“G‚¶‚á‚È‚¢‚©”»’èiret:1“G‚Å‚Í‚È‚¢j
+ * = 0x10000:ƒp[ƒeƒB[”»’èiret:1=ƒp[ƒeƒB[ƒƒ“ƒo)
+ * = 0x20000:‘S‚Ä(ret:1=“G–¡•û—¼•û)
+ * = 0x40000:“G‚©”»’è(ret:1=“G)
+ * = 0x50000:ƒp[ƒeƒB[‚¶‚á‚È‚¢‚©”»’è(ret:1=ƒp[ƒeƒB‚Å‚È‚¢)
+ *------------------------------------------
+ */
+int battle_check_target( struct block_list *src, struct block_list *target,int flag)
+{
+ int s_p,s_g,t_p,t_g;
+ struct block_list *ss=src;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, target);
+
+ if( flag&0x40000 ){ // ”½“]ƒtƒ‰ƒO
+ int ret=battle_check_target(src,target,flag&0x30000);
+ if(ret!=-1)
+ return !ret;
+ return -1;
+ }
+
+ if( flag&0x20000 ){
+ if( target->type==BL_MOB || target->type==BL_PC )
+ return 1;
+ else
+ return -1;
+ }
+
+ if(src->type == BL_SKILL && target->type == BL_SKILL) // ‘ÎÛ‚ªƒXƒLƒ‹ƒ†ƒjƒbƒg‚È‚ç–³ðŒm’è
+ return -1;
+
+ if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1)
+ return -1;
+
+ if(target->type == BL_SKILL) {
+ switch(((struct skill_unit *)target)->group->unit_id){
+ case 0x8d:
+ case 0x8f:
+ case 0x98:
+ return 0;
+ break;
+ }
+ }
+
+ if(target->type == BL_PET)
+ return -1;
+
+ // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ìê‡Ae‚ð‹‚ß‚é
+ if( src->type==BL_SKILL) {
+ int inf2 = skill_get_inf2(((struct skill_unit *)src)->group->skill_id);
+ if( (ss=map_id2bl( ((struct skill_unit *)src)->group->src_id))==NULL )
+ return -1;
+ if(ss->prev == NULL)
+ return -1;
+ if(inf2&0x80 &&
+ (map[src->m].flag.pvp || pc_iskiller((struct map_session_data *)src, (struct map_session_data *)target)) && // [MouseJstr]
+ !(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target)))
+ return 0;
+ if(ss == target) {
+ if(inf2&0x100)
+ return 0;
+ if(inf2&0x200)
+ return -1;
+ }
+ }
+ // Mob‚Åmaster_id‚ª‚ ‚Á‚Äspecial_mob_ai‚È‚çA¢Š«Žå‚ð‹‚ß‚é
+ if( src->type==BL_MOB ){
+ struct mob_data *md=(struct mob_data *)src;
+ if(md && md->master_id>0){
+ if(md->master_id==target->id) // Žå‚È‚çm’è
+ return 1;
+ if(md->state.special_mob_ai){
+ if(target->type==BL_MOB){ //special_mob_ai‚Å‘ÎÛ‚ªMob
+ struct mob_data *tmd=(struct mob_data *)target;
+ if(tmd){
+ if(tmd->master_id != md->master_id) //¢Š«Žå‚ªˆê‚Å‚È‚¯‚ê‚Δےè
+ return 0;
+ else{ //¢Š«Žå‚ªˆê‚È‚Ì‚Åm’肵‚½‚¢‚¯‚ÇŽ©”š‚͔ےè
+ if(md->state.special_mob_ai>2)
+ return 0;
+ else
+ return 1;
+ }
+ }
+ }
+ }
+ if((ss=map_id2bl(md->master_id))==NULL)
+ return -1;
+ }
+ }
+
+ if( src==target || ss==target ) // “¯‚¶‚È‚çm’è
+ return 1;
+
+ if(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target))
+ return -1;
+
+ if( src->prev==NULL || // Ž€‚ñ‚Å‚é‚È‚çƒGƒ‰[
+ (src->type==BL_PC && pc_isdead((struct map_session_data *)src) ) )
+ return -1;
+
+ if( (ss->type == BL_PC && target->type==BL_MOB) ||
+ (ss->type == BL_MOB && target->type==BL_PC) )
+ return 0; // PCvsMOB‚È‚ç”Û’è
+
+ if(ss->type == BL_PET && target->type==BL_MOB)
+ return 0;
+
+ s_p=battle_get_party_id(ss);
+ s_g=battle_get_guild_id(ss);
+
+ t_p=battle_get_party_id(target);
+ t_g=battle_get_guild_id(target);
+
+ if(flag&0x10000) {
+ if(s_p && t_p && s_p == t_p) // “¯‚¶ƒp[ƒeƒB‚È‚çm’èi–¡•ûj
+ return 1;
+ else // ƒp[ƒeƒBŒŸõ‚Ȃ瓯‚¶ƒp[ƒeƒB‚¶‚á‚È‚¢Žž“_‚Ŕےè
+ return 0;
+ }
+
+ if(ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g ) // “¯‚¶ƒMƒ‹ƒh/mobƒNƒ‰ƒX‚È‚çm’èi–¡•ûj
+ return 1;
+
+//printf("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type);
+//printf("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g);
+
+ if( ss->type==BL_PC && target->type==BL_PC) { // —¼•ûPVPƒ‚[ƒh‚È‚ç”Û’èi“Gj
+ struct skill_unit *su=NULL;
+ if(src->type==BL_SKILL)
+ su=(struct skill_unit *)src;
+ if(map[ss->m].flag.pvp || pc_iskiller((struct map_session_data *)ss, (struct map_session_data*)target)) { // [MouseJstr]
+ if(su && su->group->target_flag==BCT_NOENEMY)
+ return 1;
+ else if(battle_config.pk_mode && (((struct map_session_data*)ss)->status.class==0 || ((struct map_session_data*)target)->status.class==0))
+ return 1; // prevent novice engagement in pk_mode [Valaris]
+ else if(map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
+ return 1;
+ else if(map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0 && s_g == t_g)
+ return 1;
+ return 0;
+ }
+ if(map[src->m].flag.gvg) {
+ struct guild *g=NULL;
+ if(su && su->group->target_flag==BCT_NOENEMY)
+ return 1;
+ if( s_g > 0 && s_g == t_g)
+ return 1;
+ if(map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0 && s_p == t_p)
+ return 1;
+ if((g = guild_search(s_g))) {
+ int i;
+ for(i=0;i<MAX_GUILDALLIANCE;i++){
+ if(g->alliance[i].guild_id > 0 && g->alliance[i].guild_id == t_g) {
+ if(g->alliance[i].opposition)
+ return 0;//“G‘΃Mƒ‹ƒh‚È‚ç–³ðŒ‚É“G
+ else
+ return 1;//“¯–¿ƒMƒ‹ƒh‚È‚ç–³ðŒ‚É–¡•û
+ }
+ }
+ }
+ return 0;
+ }
+ }
+
+ return 1; // ŠY“–‚µ‚È‚¢‚Ì‚Å–³ŠÖŒWl•¨i‚Ü‚ “G‚¶‚á‚È‚¢‚Ì‚Å–¡•ûj
+}
+/*==========================================
+ * ŽË’ö”»’è
+ *------------------------------------------
+ */
+int battle_check_range(struct block_list *src,struct block_list *bl,int range)
+{
+
+ int dx,dy;
+ struct walkpath_data wpd;
+ int arange;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, bl);
+
+ dx=abs(bl->x-src->x);
+ dy=abs(bl->y-src->y);
+ arange=((dx>dy)?dx:dy);
+
+ if(src->m != bl->m) // ˆá‚¤ƒ}ƒbƒv
+ return 0;
+
+ if( range>0 && range < arange ) // ‰“‚·‚¬‚é
+ return 0;
+
+ if( arange<2 ) // “¯‚¶ƒ}ƒX‚©—×Ú
+ return 1;
+
+// if(bl->type == BL_SKILL && ((struct skill_unit *)bl)->group->unit_id == 0x8d)
+// return 1;
+
+ // áŠQ•¨”»’è
+ wpd.path_len=0;
+ wpd.path_pos=0;
+ wpd.path_half=0;
+ if(path_search(&wpd,src->m,src->x,src->y,bl->x,bl->y,0x10001)!=-1)
+ return 1;
+
+ dx=(dx>0)?1:((dx<0)?-1:0);
+ dy=(dy>0)?1:((dy<0)?-1:0);
+ return (path_search(&wpd,src->m,src->x+dx,src->y+dy,
+ bl->x-dx,bl->y-dy,0x10001)!=-1)?1:0;
+}
+
+/*==========================================
+ * Return numerical value of a switch configuration (modified by [Yor])
+ * on/off, english, français, deutsch, español
+ *------------------------------------------
+ */
+int battle_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);
+}
+
+static const struct {
+ char str[128];
+ int *val;
+} battle_data[] = {
+ { "warp_point_debug", &battle_config.warp_point_debug },
+ { "enemy_critical", &battle_config.enemy_critical },
+ { "enemy_critical_rate", &battle_config.enemy_critical_rate },
+ { "enemy_str", &battle_config.enemy_str },
+ { "enemy_perfect_flee", &battle_config.enemy_perfect_flee },
+ { "casting_rate", &battle_config.cast_rate },
+ { "delay_rate", &battle_config.delay_rate },
+ { "delay_dependon_dex", &battle_config.delay_dependon_dex },
+ { "skill_delay_attack_enable", &battle_config.sdelay_attack_enable },
+ { "left_cardfix_to_right", &battle_config.left_cardfix_to_right },
+ { "player_skill_add_range", &battle_config.pc_skill_add_range },
+ { "skill_out_range_consume", &battle_config.skill_out_range_consume },
+ { "monster_skill_add_range", &battle_config.mob_skill_add_range },
+ { "player_damage_delay", &battle_config.pc_damage_delay },
+ { "player_damage_delay_rate", &battle_config.pc_damage_delay_rate },
+ { "defunit_not_enemy", &battle_config.defnotenemy },
+ { "random_monster_checklv", &battle_config.random_monster_checklv },
+ { "attribute_recover", &battle_config.attr_recover },
+ { "flooritem_lifetime", &battle_config.flooritem_lifetime },
+ { "item_auto_get", &battle_config.item_auto_get },
+ { "item_first_get_time", &battle_config.item_first_get_time },
+ { "item_second_get_time", &battle_config.item_second_get_time },
+ { "item_third_get_time", &battle_config.item_third_get_time },
+ { "mvp_item_first_get_time", &battle_config.mvp_item_first_get_time },
+ { "mvp_item_second_get_time", &battle_config.mvp_item_second_get_time },
+ { "mvp_item_third_get_time", &battle_config.mvp_item_third_get_time },
+ { "item_rate", &battle_config.item_rate },
+ { "drop_rate0item", &battle_config.drop_rate0item },
+ { "base_exp_rate", &battle_config.base_exp_rate },
+ { "job_exp_rate", &battle_config.job_exp_rate },
+ { "pvp_exp", &battle_config.pvp_exp },
+ { "gtb_pvp_only", &battle_config.gtb_pvp_only },
+ { "guild_max_castles", &battle_config.guild_max_castles },
+ { "death_penalty_type", &battle_config.death_penalty_type },
+ { "death_penalty_base", &battle_config.death_penalty_base },
+ { "death_penalty_job", &battle_config.death_penalty_job },
+ { "zeny_penalty", &battle_config.zeny_penalty },
+ { "restart_hp_rate", &battle_config.restart_hp_rate },
+ { "restart_sp_rate", &battle_config.restart_sp_rate },
+ { "mvp_hp_rate", &battle_config.mvp_hp_rate },
+ { "mvp_item_rate", &battle_config.mvp_item_rate },
+ { "mvp_exp_rate", &battle_config.mvp_exp_rate },
+ { "monster_hp_rate", &battle_config.monster_hp_rate },
+ { "monster_max_aspd", &battle_config.monster_max_aspd },
+ { "atcommand_gm_only", &battle_config.atc_gmonly },
+ { "atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit },
+ { "gm_all_skill", &battle_config.gm_allskill },
+ { "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra },
+ { "gm_all_equipment", &battle_config.gm_allequip },
+ { "gm_skill_unconditional", &battle_config.gm_skilluncond },
+ { "player_skillfree", &battle_config.skillfree },
+ { "player_skillup_limit", &battle_config.skillup_limit },
+ { "weapon_produce_rate", &battle_config.wp_rate },
+ { "potion_produce_rate", &battle_config.pp_rate },
+ { "monster_active_enable", &battle_config.monster_active_enable },
+ { "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate},
+ { "monster_loot_type", &battle_config.monster_loot_type },
+ { "mob_skill_use", &battle_config.mob_skill_use },
+ { "mob_count_rate", &battle_config.mob_count_rate },
+ { "quest_skill_learn", &battle_config.quest_skill_learn },
+ { "quest_skill_reset", &battle_config.quest_skill_reset },
+ { "basic_skill_check", &battle_config.basic_skill_check },
+ { "guild_emperium_check", &battle_config.guild_emperium_check },
+ { "guild_exp_limit", &battle_config.guild_exp_limit },
+ { "player_invincible_time", &battle_config.pc_invincible_time },
+ { "pet_catch_rate", &battle_config.pet_catch_rate },
+ { "pet_rename", &battle_config.pet_rename },
+ { "pet_friendly_rate", &battle_config.pet_friendly_rate },
+ { "pet_hungry_delay_rate", &battle_config.pet_hungry_delay_rate },
+ { "pet_hungry_friendly_decrease", &battle_config.pet_hungry_friendly_decrease},
+ { "pet_str", &battle_config.pet_str },
+ { "pet_status_support", &battle_config.pet_status_support },
+ { "pet_attack_support", &battle_config.pet_attack_support },
+ { "pet_damage_support", &battle_config.pet_damage_support },
+ { "pet_support_rate", &battle_config.pet_support_rate },
+ { "pet_attack_exp_to_master", &battle_config.pet_attack_exp_to_master },
+ { "pet_attack_exp_rate", &battle_config.pet_attack_exp_rate },
+ { "skill_min_damage", &battle_config.skill_min_damage },
+ { "finger_offensive_type", &battle_config.finger_offensive_type },
+ { "heal_exp", &battle_config.heal_exp },
+ { "resurrection_exp", &battle_config.resurrection_exp },
+ { "shop_exp", &battle_config.shop_exp },
+ { "combo_delay_rate", &battle_config.combo_delay_rate },
+ { "item_check", &battle_config.item_check },
+ { "wedding_modifydisplay", &battle_config.wedding_modifydisplay },
+ { "natural_healhp_interval", &battle_config.natural_healhp_interval },
+ { "natural_healsp_interval", &battle_config.natural_healsp_interval },
+ { "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval},
+ { "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate },
+ { "item_name_override_grffile", &battle_config.item_name_override_grffile},
+ { "arrow_decrement", &battle_config.arrow_decrement },
+ { "max_aspd", &battle_config.max_aspd },
+ { "max_hp", &battle_config.max_hp },
+ { "max_sp", &battle_config.max_sp },
+ { "max_lv", &battle_config.max_lv },
+ { "max_parameter", &battle_config.max_parameter },
+ { "max_cart_weight", &battle_config.max_cart_weight },
+ { "player_skill_log", &battle_config.pc_skill_log },
+ { "monster_skill_log", &battle_config.mob_skill_log },
+ { "battle_log", &battle_config.battle_log },
+ { "save_log", &battle_config.save_log },
+ { "error_log", &battle_config.error_log },
+ { "etc_log", &battle_config.etc_log },
+ { "save_clothcolor", &battle_config.save_clothcolor },
+ { "undead_detect_type", &battle_config.undead_detect_type },
+ { "player_auto_counter_type", &battle_config.pc_auto_counter_type },
+ { "monster_auto_counter_type", &battle_config.monster_auto_counter_type},
+ { "agi_penaly_type", &battle_config.agi_penaly_type },
+ { "agi_penaly_count", &battle_config.agi_penaly_count },
+ { "agi_penaly_num", &battle_config.agi_penaly_num },
+ { "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv },
+ { "vit_penaly_type", &battle_config.vit_penaly_type },
+ { "vit_penaly_count", &battle_config.vit_penaly_count },
+ { "vit_penaly_num", &battle_config.vit_penaly_num },
+ { "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv },
+ { "player_defense_type", &battle_config.player_defense_type },
+ { "monster_defense_type", &battle_config.monster_defense_type },
+ { "pet_defense_type", &battle_config.pet_defense_type },
+ { "magic_defense_type", &battle_config.magic_defense_type },
+ { "player_skill_reiteration", &battle_config.pc_skill_reiteration },
+ { "monster_skill_reiteration", &battle_config.monster_skill_reiteration},
+ { "player_skill_nofootset", &battle_config.pc_skill_nofootset },
+ { "monster_skill_nofootset", &battle_config.monster_skill_nofootset },
+ { "player_cloak_check_type", &battle_config.pc_cloak_check_type },
+ { "monster_cloak_check_type", &battle_config.monster_cloak_check_type },
+ { "gvg_short_attack_damage_rate", &battle_config.gvg_short_damage_rate },
+ { "gvg_long_attack_damage_rate", &battle_config.gvg_long_damage_rate },
+ { "gvg_magic_attack_damage_rate", &battle_config.gvg_magic_damage_rate },
+ { "gvg_misc_attack_damage_rate", &battle_config.gvg_misc_damage_rate },
+ { "gvg_eliminate_time", &battle_config.gvg_eliminate_time },
+ { "mob_changetarget_byskill", &battle_config.mob_changetarget_byskill},
+ { "player_attack_direction_change", &battle_config.pc_attack_direction_change },
+ { "monster_attack_direction_change", &battle_config.monster_attack_direction_change },
+ { "player_land_skill_limit", &battle_config.pc_land_skill_limit },
+ { "monster_land_skill_limit", &battle_config.monster_land_skill_limit},
+ { "party_skill_penaly", &battle_config.party_skill_penaly },
+ { "monster_class_change_full_recover", &battle_config.monster_class_change_full_recover },
+ { "produce_item_name_input", &battle_config.produce_item_name_input },
+ { "produce_potion_name_input", &battle_config.produce_potion_name_input},
+ { "making_arrow_name_input", &battle_config.making_arrow_name_input },
+ { "holywater_name_input", &battle_config.holywater_name_input },
+ { "display_delay_skill_fail", &battle_config.display_delay_skill_fail },
+ { "chat_warpportal", &battle_config.chat_warpportal },
+ { "mob_warpportal", &battle_config.mob_warpportal },
+ { "dead_branch_active", &battle_config.dead_branch_active },
+ { "vending_max_value", &battle_config.vending_max_value },
+ { "show_steal_in_same_party", &battle_config.show_steal_in_same_party },
+ { "enable_upper_class", &battle_config.enable_upper_class },
+ { "pet_attack_attr_none", &battle_config.pet_attack_attr_none },
+ { "mob_attack_attr_none", &battle_config.mob_attack_attr_none },
+ { "mob_ghostring_fix", &battle_config.mob_ghostring_fix },
+ { "pc_attack_attr_none", &battle_config.pc_attack_attr_none },
+ { "gx_allhit", &battle_config.gx_allhit },
+ { "gx_cardfix", &battle_config.gx_cardfix },
+ { "gx_dupele", &battle_config.gx_dupele },
+ { "gx_disptype", &battle_config.gx_disptype },
+ { "player_skill_partner_check", &battle_config.player_skill_partner_check},
+ { "hide_GM_session", &battle_config.hide_GM_session },
+ { "unit_movement_type", &battle_config.unit_movement_type },
+ { "invite_request_check", &battle_config.invite_request_check },
+ { "skill_removetrap_type", &battle_config.skill_removetrap_type },
+ { "disp_experience", &battle_config.disp_experience },
+ { "castle_defense_rate", &battle_config.castle_defense_rate },
+ { "riding_weight", &battle_config.riding_weight },
+ { "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT
+ { "item_rate_equip", &battle_config.item_rate_equip },
+ { "item_rate_card", &battle_config.item_rate_card }, // End Addition
+ { "item_rate_heal", &battle_config.item_rate_heal }, // Added by Valaris
+ { "item_rate_use", &battle_config.item_rate_use }, // End
+ { "item_drop_common_min", &battle_config.item_drop_common_min }, // Added by TyrNemesis^
+ { "item_drop_common_max", &battle_config.item_drop_common_max },
+ { "item_drop_equip_min", &battle_config.item_drop_equip_min },
+ { "item_drop_equip_max", &battle_config.item_drop_equip_max },
+ { "item_drop_card_min", &battle_config.item_drop_card_min },
+ { "item_drop_card_max", &battle_config.item_drop_card_max },
+ { "item_drop_mvp_min", &battle_config.item_drop_mvp_min },
+ { "item_drop_mvp_max", &battle_config.item_drop_mvp_max }, // End Addition
+ { "prevent_logout", &battle_config.prevent_logout }, // Added by RoVeRT
+ { "alchemist_summon_reward", &battle_config.alchemist_summon_reward }, // [Valaris]
+ { "maximum_level", &battle_config.maximum_level }, // [Valaris]
+ { "drops_by_luk", &battle_config.drops_by_luk }, // [Valaris]
+ { "monsters_ignore_gm", &battle_config.monsters_ignore_gm }, // [Valaris]
+ { "equipment_breaking", &battle_config.equipment_breaking }, // [Valaris]
+ { "equipment_break_rate", &battle_config.equipment_break_rate }, // [Valaris]
+ { "pk_mode", &battle_config.pk_mode }, // [Valaris]
+ { "pet_equip_required", &battle_config.pet_equip_required }, // [Valaris]
+ { "multi_level_up", &battle_config.multi_level_up }, // [Valaris]
+ { "backstab_bow_penalty", &battle_config.backstab_bow_penalty },
+ { "night_at_start", &battle_config.night_at_start }, // added by [Yor]
+ { "day_duration", &battle_config.day_duration }, // added by [Yor]
+ { "night_duration", &battle_config.night_duration }, // added by [Yor]
+ { "show_mob_hp", &battle_config.show_mob_hp }, // [Valaris]
+ { "ban_spoof_namer", &battle_config.ban_spoof_namer }, // added by [Yor]
+ { "hack_info_GM_level", &battle_config.hack_info_GM_level }, // added by [Yor]
+ { "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level }, // added by [Yor]
+ { "packet_ver_flag", &battle_config.packet_ver_flag }, // added by [Yor]
+ { "min_hair_style", &battle_config.min_hair_style }, // added by [MouseJstr]
+ { "max_hair_style", &battle_config.max_hair_style }, // added by [MouseJstr]
+ { "min_hair_color", &battle_config.min_hair_color }, // added by [MouseJstr]
+ { "max_hair_color", &battle_config.max_hair_color }, // added by [MouseJstr]
+ { "min_cloth_color", &battle_config.min_cloth_color }, // added by [MouseJstr]
+ { "max_cloth_color", &battle_config.max_cloth_color }, // added by [MouseJstr]
+ { "castrate_dex_scale", &battle_config.castrate_dex_scale }, // added by [MouseJstr]
+ { "area_size", &battle_config.area_size }, // added by [MouseJstr]
+ { "muting_players", &battle_config.muting_players}, // added by [Apple]
+//SQL-only options start
+#ifndef TXT_ONLY
+ { "mail_system", &battle_config.mail_system }, // added by [Valaris]
+//SQL-only options end
+#endif
+};
+
+int battle_set_value(char *w1, char *w2) {
+ int i;
+ for(i = 0; i < sizeof(battle_data) / (sizeof(battle_data[0])); i++)
+ if (strcmpi(w1, battle_data[i].str) == 0) {
+ *battle_data[i].val = battle_config_switch(w2);
+ return 1;
+ }
+ return 0;
+}
+
+void battle_set_defaults() {
+ battle_config.warp_point_debug=0;
+ battle_config.enemy_critical=0;
+ battle_config.enemy_critical_rate=100;
+ battle_config.enemy_str=1;
+ battle_config.enemy_perfect_flee=0;
+ battle_config.cast_rate=100;
+ battle_config.delay_rate=100;
+ battle_config.delay_dependon_dex=0;
+ battle_config.sdelay_attack_enable=0;
+ battle_config.left_cardfix_to_right=0;
+ battle_config.pc_skill_add_range=0;
+ battle_config.skill_out_range_consume=1;
+ battle_config.mob_skill_add_range=0;
+ battle_config.pc_damage_delay=1;
+ battle_config.pc_damage_delay_rate=100;
+ battle_config.defnotenemy=1;
+ battle_config.random_monster_checklv=1;
+ battle_config.attr_recover=1;
+ battle_config.flooritem_lifetime=LIFETIME_FLOORITEM*1000;
+ battle_config.item_auto_get=0;
+ battle_config.item_first_get_time=3000;
+ battle_config.item_second_get_time=1000;
+ battle_config.item_third_get_time=1000;
+ battle_config.mvp_item_first_get_time=10000;
+ battle_config.mvp_item_second_get_time=10000;
+ battle_config.mvp_item_third_get_time=2000;
+
+ battle_config.drop_rate0item=0;
+ battle_config.base_exp_rate=100;
+ battle_config.job_exp_rate=100;
+ battle_config.pvp_exp=1;
+ battle_config.gtb_pvp_only=0;
+ battle_config.death_penalty_type=0;
+ battle_config.death_penalty_base=0;
+ battle_config.death_penalty_job=0;
+ battle_config.zeny_penalty=0;
+ battle_config.restart_hp_rate=0;
+ battle_config.restart_sp_rate=0;
+ battle_config.mvp_item_rate=100;
+ battle_config.mvp_exp_rate=100;
+ battle_config.mvp_hp_rate=100;
+ battle_config.monster_hp_rate=100;
+ battle_config.monster_max_aspd=199;
+ battle_config.atc_gmonly=0;
+ battle_config.gm_allskill=0;
+ battle_config.gm_allequip=0;
+ battle_config.gm_skilluncond=0;
+ battle_config.guild_max_castles=0;
+ battle_config.skillfree = 0;
+ battle_config.skillup_limit = 0;
+ battle_config.wp_rate=100;
+ battle_config.pp_rate=100;
+ battle_config.monster_active_enable=1;
+ battle_config.monster_damage_delay_rate=100;
+ battle_config.monster_loot_type=0;
+ battle_config.mob_skill_use=1;
+ battle_config.mob_count_rate=100;
+ battle_config.quest_skill_learn=0;
+ battle_config.quest_skill_reset=1;
+ battle_config.basic_skill_check=1;
+ battle_config.guild_emperium_check=1;
+ battle_config.guild_exp_limit=50;
+ battle_config.pc_invincible_time = 5000;
+ battle_config.pet_catch_rate=100;
+ battle_config.pet_rename=0;
+ battle_config.pet_friendly_rate=100;
+ battle_config.pet_hungry_delay_rate=100;
+ battle_config.pet_hungry_friendly_decrease=5;
+ battle_config.pet_str=1;
+ battle_config.pet_status_support=0;
+ battle_config.pet_attack_support=0;
+ battle_config.pet_damage_support=0;
+ battle_config.pet_support_rate=100;
+ battle_config.pet_attack_exp_to_master=0;
+ battle_config.pet_attack_exp_rate=100;
+ battle_config.skill_min_damage=0;
+ battle_config.finger_offensive_type=0;
+ battle_config.heal_exp=0;
+ battle_config.resurrection_exp=0;
+ battle_config.shop_exp=0;
+ battle_config.combo_delay_rate=100;
+ battle_config.item_check=1;
+ battle_config.wedding_modifydisplay=0;
+ battle_config.natural_healhp_interval=6000;
+ battle_config.natural_healsp_interval=8000;
+ battle_config.natural_heal_skill_interval=10000;
+ battle_config.natural_heal_weight_rate=50;
+ battle_config.item_name_override_grffile=1;
+ battle_config.arrow_decrement=1;
+ battle_config.max_aspd = 199;
+ battle_config.max_hp = 32500;
+ battle_config.max_sp = 32500;
+ battle_config.max_lv = 99; // [MouseJstr]
+ battle_config.max_parameter = 99;
+ battle_config.max_cart_weight = 8000;
+ battle_config.pc_skill_log = 0;
+ battle_config.mob_skill_log = 0;
+ battle_config.battle_log = 0;
+ battle_config.save_log = 0;
+ battle_config.error_log = 1;
+ battle_config.etc_log = 1;
+ battle_config.save_clothcolor = 0;
+ battle_config.undead_detect_type = 0;
+ battle_config.pc_auto_counter_type = 1;
+ battle_config.monster_auto_counter_type = 1;
+ battle_config.agi_penaly_type = 0;
+ battle_config.agi_penaly_count = 3;
+ battle_config.agi_penaly_num = 0;
+ battle_config.agi_penaly_count_lv = ATK_FLEE;
+ battle_config.vit_penaly_type = 0;
+ battle_config.vit_penaly_count = 3;
+ battle_config.vit_penaly_num = 0;
+ battle_config.vit_penaly_count_lv = ATK_DEF;
+ battle_config.player_defense_type = 0;
+ battle_config.monster_defense_type = 0;
+ battle_config.pet_defense_type = 0;
+ battle_config.magic_defense_type = 0;
+ battle_config.pc_skill_reiteration = 0;
+ battle_config.monster_skill_reiteration = 0;
+ battle_config.pc_skill_nofootset = 0;
+ battle_config.monster_skill_nofootset = 0;
+ battle_config.pc_cloak_check_type = 0;
+ battle_config.monster_cloak_check_type = 0;
+ battle_config.gvg_short_damage_rate = 100;
+ battle_config.gvg_long_damage_rate = 100;
+ battle_config.gvg_magic_damage_rate = 100;
+ battle_config.gvg_misc_damage_rate = 100;
+ battle_config.gvg_eliminate_time = 7000;
+ battle_config.mob_changetarget_byskill = 0;
+ battle_config.pc_attack_direction_change = 1;
+ battle_config.monster_attack_direction_change = 1;
+ battle_config.pc_undead_nofreeze = 0;
+ battle_config.pc_land_skill_limit = 1;
+ battle_config.monster_land_skill_limit = 1;
+ battle_config.party_skill_penaly = 1;
+ battle_config.monster_class_change_full_recover = 0;
+ battle_config.produce_item_name_input = 1;
+ battle_config.produce_potion_name_input = 1;
+ battle_config.making_arrow_name_input = 1;
+ battle_config.holywater_name_input = 1;
+ battle_config.display_delay_skill_fail = 1;
+ battle_config.chat_warpportal = 0;
+ battle_config.mob_warpportal = 0;
+ battle_config.dead_branch_active = 0;
+ battle_config.vending_max_value = 10000000;
+ battle_config.show_steal_in_same_party = 0;
+ battle_config.enable_upper_class = 0;
+ battle_config.pet_attack_attr_none = 0;
+ battle_config.pc_attack_attr_none = 0;
+ battle_config.mob_attack_attr_none = 1;
+ battle_config.mob_ghostring_fix = 0;
+ battle_config.gx_allhit = 0;
+ battle_config.gx_cardfix = 0;
+ battle_config.gx_dupele = 1;
+ battle_config.gx_disptype = 1;
+ battle_config.player_skill_partner_check = 1;
+ battle_config.hide_GM_session = 0;
+ battle_config.unit_movement_type = 0;
+ battle_config.invite_request_check = 1;
+ battle_config.skill_removetrap_type = 0;
+ battle_config.disp_experience = 0;
+ battle_config.item_rate_common = 100;
+ battle_config.item_rate_equip = 100;
+ battle_config.item_rate_card = 100;
+ battle_config.item_rate_heal = 100; // Added by Valaris
+ battle_config.item_rate_use = 100; // End
+ battle_config.item_drop_common_min=1; // Added by TyrNemesis^
+ battle_config.item_drop_common_max=10000;
+ battle_config.item_drop_equip_min=1;
+ battle_config.item_drop_equip_max=10000;
+ battle_config.item_drop_card_min=1;
+ battle_config.item_drop_card_max=10000;
+ battle_config.item_drop_mvp_min=1;
+ battle_config.item_drop_mvp_max=10000; // End Addition
+ battle_config.item_drop_heal_min=1; // Added by Valaris
+ battle_config.item_drop_heal_max=10000;
+ battle_config.item_drop_use_min=1;
+ battle_config.item_drop_use_max=10000; // End
+ battle_config.prevent_logout = 1; // Added by RoVeRT
+ battle_config.maximum_level = 255; // Added by Valaris
+ battle_config.drops_by_luk = 0; // [Valaris]
+ battle_config.equipment_breaking = 0; // [Valaris]
+ battle_config.equipment_break_rate = 100; // [Valaris]
+ battle_config.pk_mode = 0; // [Valaris]
+ battle_config.pet_equip_required = 0; // [Valaris]
+ battle_config.multi_level_up = 0; // [Valaris]
+ battle_config.backstab_bow_penalty = 0; // Akaru
+ battle_config.night_at_start = 0; // added by [Yor]
+ battle_config.day_duration = 2*60*60*1000; // added by [Yor] (2 hours)
+ battle_config.night_duration = 30*60*1000; // added by [Yor] (30 minutes)
+ battle_config.show_mob_hp = 0; // [Valaris]
+ battle_config.ban_spoof_namer = 5; // added by [Yor] (default: 5 minutes)
+ battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level)
+ battle_config.any_warp_GM_min_level = 20; // added by [Yor]
+ battle_config.packet_ver_flag = 63; // added by [Yor]
+ battle_config.min_hair_style = 0;
+ battle_config.max_hair_style = 20;
+ battle_config.min_hair_color = 0;
+ battle_config.max_hair_color = 9;
+ battle_config.min_cloth_color = 0;
+ battle_config.max_cloth_color = 4;
+
+ battle_config.castrate_dex_scale = 150;
+
+ battle_config.area_size = 14;
+
+//SQL-only options start
+#ifndef TXT_ONLY
+ battle_config.mail_system = 0;
+//SQL-only options end
+#endif
+}
+
+void battle_validate_conf() {
+ if(battle_config.flooritem_lifetime < 1000)
+ battle_config.flooritem_lifetime = LIFETIME_FLOORITEM*1000;
+ if(battle_config.restart_hp_rate < 0)
+ battle_config.restart_hp_rate = 0;
+ else if(battle_config.restart_hp_rate > 100)
+ battle_config.restart_hp_rate = 100;
+ if(battle_config.restart_sp_rate < 0)
+ battle_config.restart_sp_rate = 0;
+ else if(battle_config.restart_sp_rate > 100)
+ battle_config.restart_sp_rate = 100;
+ if(battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL)
+ battle_config.natural_healhp_interval=NATURAL_HEAL_INTERVAL;
+ if(battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL)
+ battle_config.natural_healsp_interval=NATURAL_HEAL_INTERVAL;
+ if(battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL)
+ battle_config.natural_heal_skill_interval=NATURAL_HEAL_INTERVAL;
+ if(battle_config.natural_heal_weight_rate < 50)
+ battle_config.natural_heal_weight_rate = 50;
+ if(battle_config.natural_heal_weight_rate > 101)
+ battle_config.natural_heal_weight_rate = 101;
+ battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10;
+ if(battle_config.monster_max_aspd < 10)
+ battle_config.monster_max_aspd = 10;
+ if(battle_config.monster_max_aspd > 1000)
+ battle_config.monster_max_aspd = 1000;
+ battle_config.max_aspd = 2000 - battle_config.max_aspd*10;
+ if(battle_config.max_aspd < 10)
+ battle_config.max_aspd = 10;
+ if(battle_config.max_aspd > 1000)
+ battle_config.max_aspd = 1000;
+ if(battle_config.max_hp > 1000000)
+ battle_config.max_hp = 1000000;
+ if(battle_config.max_hp < 100)
+ battle_config.max_hp = 100;
+ if(battle_config.max_sp > 1000000)
+ battle_config.max_sp = 1000000;
+ if(battle_config.max_sp < 100)
+ battle_config.max_sp = 100;
+ if(battle_config.max_parameter < 10)
+ battle_config.max_parameter = 10;
+ if(battle_config.max_parameter > 10000)
+ battle_config.max_parameter = 10000;
+ if(battle_config.max_cart_weight > 1000000)
+ battle_config.max_cart_weight = 1000000;
+ if(battle_config.max_cart_weight < 100)
+ battle_config.max_cart_weight = 100;
+ battle_config.max_cart_weight *= 10;
+
+ if(battle_config.agi_penaly_count < 2)
+ battle_config.agi_penaly_count = 2;
+ if(battle_config.vit_penaly_count < 2)
+ battle_config.vit_penaly_count = 2;
+
+ if(battle_config.guild_exp_limit > 99)
+ battle_config.guild_exp_limit = 99;
+ if(battle_config.guild_exp_limit < 0)
+ battle_config.guild_exp_limit = 0;
+
+ if(battle_config.castle_defense_rate < 0)
+ battle_config.castle_defense_rate = 0;
+ if(battle_config.castle_defense_rate > 100)
+ battle_config.castle_defense_rate = 100;
+ if(battle_config.item_drop_common_min < 1) // Added by TyrNemesis^
+ battle_config.item_drop_common_min = 1;
+ if(battle_config.item_drop_common_max > 10000)
+ battle_config.item_drop_common_max = 10000;
+ if(battle_config.item_drop_equip_min < 1)
+ battle_config.item_drop_equip_min = 1;
+ if(battle_config.item_drop_equip_max > 10000)
+ battle_config.item_drop_equip_max = 10000;
+ if(battle_config.item_drop_card_min < 1)
+ battle_config.item_drop_card_min = 1;
+ if(battle_config.item_drop_card_max > 10000)
+ battle_config.item_drop_card_max = 10000;
+ if(battle_config.item_drop_mvp_min < 1)
+ battle_config.item_drop_mvp_min = 1;
+ if(battle_config.item_drop_mvp_max > 10000)
+ battle_config.item_drop_mvp_max = 10000; // End Addition
+
+ if (battle_config.night_at_start < 0) // added by [Yor]
+ battle_config.night_at_start = 0;
+ else if (battle_config.night_at_start > 1) // added by [Yor]
+ battle_config.night_at_start = 1;
+ if (battle_config.day_duration < 0) // added by [Yor]
+ battle_config.day_duration = 0;
+ if (battle_config.night_duration < 0) // added by [Yor]
+ battle_config.night_duration = 0;
+
+ if (battle_config.ban_spoof_namer < 0) // added by [Yor]
+ battle_config.ban_spoof_namer = 0;
+ else if (battle_config.ban_spoof_namer > 32767)
+ battle_config.ban_spoof_namer = 32767;
+
+ if (battle_config.hack_info_GM_level < 0) // added by [Yor]
+ battle_config.hack_info_GM_level = 0;
+ else if (battle_config.hack_info_GM_level > 100)
+ battle_config.hack_info_GM_level = 100;
+
+ if (battle_config.any_warp_GM_min_level < 0) // added by [Yor]
+ battle_config.any_warp_GM_min_level = 0;
+ else if (battle_config.any_warp_GM_min_level > 100)
+ battle_config.any_warp_GM_min_level = 100;
+
+ // at least 1 client must be accepted
+ if ((battle_config.packet_ver_flag & 63) == 0) // added by [Yor]
+ battle_config.packet_ver_flag = 63; // accept all clients
+}
+
+/*==========================================
+ * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+int battle_config_read(const char *cfgName)
+{
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+ static int count = 0;
+
+ if ((count++) == 0)
+ battle_set_defaults();
+
+ 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;
+ if (sscanf(line, "%[^:]:%s", w1, w2) != 2)
+ continue;
+ battle_set_value(w1, w2);
+ if (strcmpi(w1, "import") == 0)
+ battle_config_read(w2);
+ }
+ fclose(fp);
+
+ if (--count == 0) {
+ battle_validate_conf();
+ add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub");
+ }
+
+ return 0;
+}
diff --git a/src/map/battle.h b/src/map/battle.h
index d4f680509..1ff90bdd7 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -1,345 +1,345 @@
-// $Id: battle.h,v 1.6 2004/09/29 21:08:17 Akitasha Exp $
-#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; //ˆÍ‚܂ꌸŽZŒvŽZ—p@0:ƒXƒLƒ‹UŒ‚ 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);
-struct Damage battle_calc_weapon_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-struct Damage battle_calc_magic_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-struct Damage battle_calc_misc_attack(
- struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
-
-// ‘®«C³ŒvŽZ
-int battle_attr_fix(int damage,int atk_elem,int def_elem);
-
-// ƒ_ƒ[ƒ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);
-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,
-};
-
-// ŽÀÛ‚ÉHP‚𑌸
-int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag);
-int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag);
-int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag);
-
-// UŒ‚‚âˆÚ“®‚ðŽ~‚ß‚é
-int battle_stopattack(struct block_list *bl);
-int battle_stopwalking(struct block_list *bl,int type);
-
-// ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
-int battle_weapon_attack( struct block_list *bl,struct block_list *target,
- unsigned int tick,int flag);
-
-// ŠeŽíƒpƒ‰ƒ[ƒ^‚𓾂é
-int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv);
-int battle_get_class(struct block_list *bl);
-int battle_get_dir(struct block_list *bl);
-int battle_get_lv(struct block_list *bl);
-int battle_get_range(struct block_list *bl);
-int battle_get_hp(struct block_list *bl);
-int battle_get_max_hp(struct block_list *bl);
-int battle_get_str(struct block_list *bl);
-int battle_get_agi(struct block_list *bl);
-int battle_get_vit(struct block_list *bl);
-int battle_get_int(struct block_list *bl);
-int battle_get_dex(struct block_list *bl);
-int battle_get_luk(struct block_list *bl);
-int battle_get_hit(struct block_list *bl);
-int battle_get_flee(struct block_list *bl);
-int battle_get_def(struct block_list *bl);
-int battle_get_mdef(struct block_list *bl);
-int battle_get_flee2(struct block_list *bl);
-int battle_get_def2(struct block_list *bl);
-int battle_get_mdef2(struct block_list *bl);
-int battle_get_baseatk(struct block_list *bl);
-int battle_get_atk(struct block_list *bl);
-int battle_get_atk2(struct block_list *bl);
-int battle_get_speed(struct block_list *bl);
-int battle_get_adelay(struct block_list *bl);
-int battle_get_amotion(struct block_list *bl);
-int battle_get_dmotion(struct block_list *bl);
-int battle_get_element(struct block_list *bl);
-int battle_get_attack_element(struct block_list *bl);
-int battle_get_attack_element2(struct block_list *bl); //¶Žè•Ší‘®«Žæ“¾
-#define battle_get_elem_type(bl) (battle_get_element(bl)%10)
-#define battle_get_elem_level(bl) (battle_get_element(bl)/10/2)
-int battle_get_party_id(struct block_list *bl);
-int battle_get_guild_id(struct block_list *bl);
-int battle_get_race(struct block_list *bl);
-int battle_get_size(struct block_list *bl);
-int battle_get_mode(struct block_list *bl);
-int battle_get_mexp(struct block_list *bl);
-
-struct status_change *battle_get_sc_data(struct block_list *bl);
-short *battle_get_sc_count(struct block_list *bl);
-short *battle_get_opt1(struct block_list *bl);
-short *battle_get_opt2(struct block_list *bl);
-short *battle_get_opt3(struct block_list *bl);
-short *battle_get_option(struct block_list *bl);
-
-enum {
- BCT_NOENEMY =0x00000,
- BCT_PARTY =0x10000,
- BCT_ENEMY =0x40000,
- BCT_NOPARTY =0x50000,
- BCT_ALL =0x20000,
- BCT_NOONE =0x60000,
-};
-
-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);
-
-
-// Ý’è
-
-int battle_config_switch(const char *str); // [Valaris]
-
-extern struct Battle_Config {
- int warp_point_debug;
- int enemy_critical;
- int enemy_critical_rate;
- int enemy_str;
- int enemy_perfect_flee;
- int cast_rate,delay_rate,delay_dependon_dex;
- int sdelay_attack_enable;
- int left_cardfix_to_right;
- int pc_skill_add_range;
- int skill_out_range_consume;
- int mob_skill_add_range;
- int pc_damage_delay;
- int pc_damage_delay_rate;
- int defnotenemy;
- int random_monster_checklv;
- int attr_recover;
- int flooritem_lifetime;
- int 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 item_rate,base_exp_rate,job_exp_rate; // removed item rate, depreciated
- int drop_rate0item;
- int death_penalty_type;
- int death_penalty_base,death_penalty_job;
- int pvp_exp; // [MouseJstr]
- int gtb_pvp_only; // [MouseJstr]
- int zeny_penalty;
- int restart_hp_rate;
- int restart_sp_rate;
- int mvp_item_rate,mvp_exp_rate;
- int mvp_hp_rate;
- int monster_hp_rate;
- int monster_max_aspd;
- int atc_gmonly;
- int atc_spawn_quantity_limit;
- int gm_allskill;
- int gm_allskill_addabra;
- int gm_allequip;
- int gm_skilluncond;
- int skillfree;
- int skillup_limit;
- int wp_rate;
- int pp_rate;
- int monster_active_enable;
- int monster_damage_delay_rate;
- int monster_loot_type;
- int mob_skill_use;
- int mob_count_rate;
- int quest_skill_learn;
- int quest_skill_reset;
- int basic_skill_check;
- int guild_emperium_check;
- int guild_exp_limit;
- int guild_max_castles;
- int pc_invincible_time;
- int pet_catch_rate;
- int pet_rename;
- int pet_friendly_rate;
- int pet_hungry_delay_rate;
- int pet_hungry_friendly_decrease;
- int pet_str;
- int pet_status_support;
- int pet_attack_support;
- int pet_damage_support;
- int pet_support_rate;
- int pet_attack_exp_to_master;
- int pet_attack_exp_rate;
- int skill_min_damage;
- int finger_offensive_type;
- int heal_exp;
- int resurrection_exp;
- int shop_exp;
- int combo_delay_rate;
- int item_check;
- int wedding_modifydisplay;
- int natural_healhp_interval;
- int natural_healsp_interval;
- int natural_heal_skill_interval;
- int natural_heal_weight_rate;
- int item_name_override_grffile;
- int arrow_decrement;
- int max_aspd;
- int max_hp;
- int max_sp;
- int max_lv;
- int max_parameter;
- int max_cart_weight;
- int pc_skill_log;
- int mob_skill_log;
- int battle_log;
- int save_log;
- int error_log;
- int etc_log;
- int save_clothcolor;
- int undead_detect_type;
- int pc_auto_counter_type;
- int monster_auto_counter_type;
- int agi_penaly_type;
- int agi_penaly_count;
- int agi_penaly_num;
- int vit_penaly_type;
- int vit_penaly_count;
- int vit_penaly_num;
- int player_defense_type;
- int monster_defense_type;
- int pet_defense_type;
- int magic_defense_type;
- int pc_skill_reiteration;
- int monster_skill_reiteration;
- int pc_skill_nofootset;
- int monster_skill_nofootset;
- int pc_cloak_check_type;
- int monster_cloak_check_type;
- int gvg_short_damage_rate;
- int gvg_long_damage_rate;
- int gvg_magic_damage_rate;
- int gvg_misc_damage_rate;
- int gvg_eliminate_time;
- int mob_changetarget_byskill;
- int pc_attack_direction_change;
- int monster_attack_direction_change;
- int pc_undead_nofreeze;
- int pc_land_skill_limit;
- int monster_land_skill_limit;
- int party_skill_penaly;
- int monster_class_change_full_recover;
- int produce_item_name_input;
- int produce_potion_name_input;
- int making_arrow_name_input;
- int holywater_name_input;
- int display_delay_skill_fail;
- int chat_warpportal;
- int mob_warpportal;
- int dead_branch_active;
- int vending_max_value;
-// int pet_lootitem; // removed [Valaris]
-// int pet_weight; // removed [Valaris]
- int show_steal_in_same_party;
- int enable_upper_class;
- int pet_attack_attr_none;
- int mob_attack_attr_none;
- int mob_ghostring_fix;
- int pc_attack_attr_none;
- int item_rate_common,item_rate_card,item_rate_equip,item_rate_heal,item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val
- int item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
- int item_drop_card_min,item_drop_card_max;
- int item_drop_equip_min,item_drop_equip_max;
- int item_drop_mvp_min,item_drop_mvp_max; // End Addition
- int item_drop_heal_min,item_drop_heal_max; // Added by Valatris
- int item_drop_use_min,item_drop_use_max; //End
-
- int prevent_logout; // Added by RoVeRT
-
- int alchemist_summon_reward; // [Valaris]
- int maximum_level;
- int drops_by_luk;
- int monsters_ignore_gm;
- int equipment_breaking;
- int equipment_break_rate;
- int pet_equip_required;
- int multi_level_up;
- int pk_mode;
- int show_mob_hp; // end additions [Valaris]
-
- int agi_penaly_count_lv;
- int vit_penaly_count_lv;
-
- int gx_allhit;
- int gx_cardfix;
- int gx_dupele;
- int gx_disptype;
- int player_skill_partner_check;
- int hide_GM_session;
- int unit_movement_type;
- int invite_request_check;
- int skill_removetrap_type;
- int disp_experience;
- int castle_defense_rate;
- int riding_weight;
- int backstab_bow_penalty;
-
- int night_at_start; // added by [Yor]
- int day_duration; // added by [Yor]
- int night_duration; // added by [Yor]
- int ban_spoof_namer; // added by [Yor]
- int hack_info_GM_level; // added by [Yor]
- int any_warp_GM_min_level; // added by [Yor]
- int packet_ver_flag; // added by [Yor]
- int muting_players; // added by [Apple]
-
- int min_hair_style; // added by [MouseJstr]
- int max_hair_style; // added by [MouseJstr]
- int min_hair_color; // added by [MouseJstr]
- int max_hair_color; // added by [MouseJstr]
- int min_cloth_color; // added by [MouseJstr]
- int max_cloth_color; // added by [MouseJstr]
-
- int castrate_dex_scale; // added by [MouseJstr]
- int area_size; // added by [MouseJstr]
-
-#ifndef TXT_ONLY /* SQL-only options */
- int mail_system; // [Valaris]
-#endif
-
-} battle_config;
-
-extern int battle_config_read(const char *cfgName);
-extern void battle_validate_conf();
-extern void battle_set_defaults();
-extern int battle_set_value(char *, char *);
-
-#endif
+// $Id: battle.h,v 1.6 2004/09/29 21:08:17 Akitasha Exp $
+#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; //ˆÍ‚܂ꌸŽZŒvŽZ—p@0:ƒXƒLƒ‹UŒ‚ 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);
+struct Damage battle_calc_weapon_attack(
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
+struct Damage battle_calc_magic_attack(
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
+struct Damage battle_calc_misc_attack(
+ struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag);
+
+// ‘®«C³ŒvŽZ
+int battle_attr_fix(int damage,int atk_elem,int def_elem);
+
+// ƒ_ƒ[ƒ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);
+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,
+};
+
+// ŽÀÛ‚ÉHP‚𑌸
+int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag);
+int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag);
+int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag);
+
+// UŒ‚‚âˆÚ“®‚ðŽ~‚ß‚é
+int battle_stopattack(struct block_list *bl);
+int battle_stopwalking(struct block_list *bl,int type);
+
+// ’ÊíUŒ‚ˆ—‚Ü‚Æ‚ß
+int battle_weapon_attack( struct block_list *bl,struct block_list *target,
+ unsigned int tick,int flag);
+
+// ŠeŽíƒpƒ‰ƒ[ƒ^‚𓾂é
+int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv);
+int battle_get_class(struct block_list *bl);
+int battle_get_dir(struct block_list *bl);
+int battle_get_lv(struct block_list *bl);
+int battle_get_range(struct block_list *bl);
+int battle_get_hp(struct block_list *bl);
+int battle_get_max_hp(struct block_list *bl);
+int battle_get_str(struct block_list *bl);
+int battle_get_agi(struct block_list *bl);
+int battle_get_vit(struct block_list *bl);
+int battle_get_int(struct block_list *bl);
+int battle_get_dex(struct block_list *bl);
+int battle_get_luk(struct block_list *bl);
+int battle_get_hit(struct block_list *bl);
+int battle_get_flee(struct block_list *bl);
+int battle_get_def(struct block_list *bl);
+int battle_get_mdef(struct block_list *bl);
+int battle_get_flee2(struct block_list *bl);
+int battle_get_def2(struct block_list *bl);
+int battle_get_mdef2(struct block_list *bl);
+int battle_get_baseatk(struct block_list *bl);
+int battle_get_atk(struct block_list *bl);
+int battle_get_atk2(struct block_list *bl);
+int battle_get_speed(struct block_list *bl);
+int battle_get_adelay(struct block_list *bl);
+int battle_get_amotion(struct block_list *bl);
+int battle_get_dmotion(struct block_list *bl);
+int battle_get_element(struct block_list *bl);
+int battle_get_attack_element(struct block_list *bl);
+int battle_get_attack_element2(struct block_list *bl); //¶Žè•Ší‘®«Žæ“¾
+#define battle_get_elem_type(bl) (battle_get_element(bl)%10)
+#define battle_get_elem_level(bl) (battle_get_element(bl)/10/2)
+int battle_get_party_id(struct block_list *bl);
+int battle_get_guild_id(struct block_list *bl);
+int battle_get_race(struct block_list *bl);
+int battle_get_size(struct block_list *bl);
+int battle_get_mode(struct block_list *bl);
+int battle_get_mexp(struct block_list *bl);
+
+struct status_change *battle_get_sc_data(struct block_list *bl);
+short *battle_get_sc_count(struct block_list *bl);
+short *battle_get_opt1(struct block_list *bl);
+short *battle_get_opt2(struct block_list *bl);
+short *battle_get_opt3(struct block_list *bl);
+short *battle_get_option(struct block_list *bl);
+
+enum {
+ BCT_NOENEMY =0x00000,
+ BCT_PARTY =0x10000,
+ BCT_ENEMY =0x40000,
+ BCT_NOPARTY =0x50000,
+ BCT_ALL =0x20000,
+ BCT_NOONE =0x60000,
+};
+
+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);
+
+
+// Ý’è
+
+int battle_config_switch(const char *str); // [Valaris]
+
+extern struct Battle_Config {
+ int warp_point_debug;
+ int enemy_critical;
+ int enemy_critical_rate;
+ int enemy_str;
+ int enemy_perfect_flee;
+ int cast_rate,delay_rate,delay_dependon_dex;
+ int sdelay_attack_enable;
+ int left_cardfix_to_right;
+ int pc_skill_add_range;
+ int skill_out_range_consume;
+ int mob_skill_add_range;
+ int pc_damage_delay;
+ int pc_damage_delay_rate;
+ int defnotenemy;
+ int random_monster_checklv;
+ int attr_recover;
+ int flooritem_lifetime;
+ int 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 item_rate,base_exp_rate,job_exp_rate; // removed item rate, depreciated
+ int drop_rate0item;
+ int death_penalty_type;
+ int death_penalty_base,death_penalty_job;
+ int pvp_exp; // [MouseJstr]
+ int gtb_pvp_only; // [MouseJstr]
+ int zeny_penalty;
+ int restart_hp_rate;
+ int restart_sp_rate;
+ int mvp_item_rate,mvp_exp_rate;
+ int mvp_hp_rate;
+ int monster_hp_rate;
+ int monster_max_aspd;
+ int atc_gmonly;
+ int atc_spawn_quantity_limit;
+ int gm_allskill;
+ int gm_allskill_addabra;
+ int gm_allequip;
+ int gm_skilluncond;
+ int skillfree;
+ int skillup_limit;
+ int wp_rate;
+ int pp_rate;
+ int monster_active_enable;
+ int monster_damage_delay_rate;
+ int monster_loot_type;
+ int mob_skill_use;
+ int mob_count_rate;
+ int quest_skill_learn;
+ int quest_skill_reset;
+ int basic_skill_check;
+ int guild_emperium_check;
+ int guild_exp_limit;
+ int guild_max_castles;
+ int pc_invincible_time;
+ int pet_catch_rate;
+ int pet_rename;
+ int pet_friendly_rate;
+ int pet_hungry_delay_rate;
+ int pet_hungry_friendly_decrease;
+ int pet_str;
+ int pet_status_support;
+ int pet_attack_support;
+ int pet_damage_support;
+ int pet_support_rate;
+ int pet_attack_exp_to_master;
+ int pet_attack_exp_rate;
+ int skill_min_damage;
+ int finger_offensive_type;
+ int heal_exp;
+ int resurrection_exp;
+ int shop_exp;
+ int combo_delay_rate;
+ int item_check;
+ int wedding_modifydisplay;
+ int natural_healhp_interval;
+ int natural_healsp_interval;
+ int natural_heal_skill_interval;
+ int natural_heal_weight_rate;
+ int item_name_override_grffile;
+ int arrow_decrement;
+ int max_aspd;
+ int max_hp;
+ int max_sp;
+ int max_lv;
+ int max_parameter;
+ int max_cart_weight;
+ int pc_skill_log;
+ int mob_skill_log;
+ int battle_log;
+ int save_log;
+ int error_log;
+ int etc_log;
+ int save_clothcolor;
+ int undead_detect_type;
+ int pc_auto_counter_type;
+ int monster_auto_counter_type;
+ int agi_penaly_type;
+ int agi_penaly_count;
+ int agi_penaly_num;
+ int vit_penaly_type;
+ int vit_penaly_count;
+ int vit_penaly_num;
+ int player_defense_type;
+ int monster_defense_type;
+ int pet_defense_type;
+ int magic_defense_type;
+ int pc_skill_reiteration;
+ int monster_skill_reiteration;
+ int pc_skill_nofootset;
+ int monster_skill_nofootset;
+ int pc_cloak_check_type;
+ int monster_cloak_check_type;
+ int gvg_short_damage_rate;
+ int gvg_long_damage_rate;
+ int gvg_magic_damage_rate;
+ int gvg_misc_damage_rate;
+ int gvg_eliminate_time;
+ int mob_changetarget_byskill;
+ int pc_attack_direction_change;
+ int monster_attack_direction_change;
+ int pc_undead_nofreeze;
+ int pc_land_skill_limit;
+ int monster_land_skill_limit;
+ int party_skill_penaly;
+ int monster_class_change_full_recover;
+ int produce_item_name_input;
+ int produce_potion_name_input;
+ int making_arrow_name_input;
+ int holywater_name_input;
+ int display_delay_skill_fail;
+ int chat_warpportal;
+ int mob_warpportal;
+ int dead_branch_active;
+ int vending_max_value;
+// int pet_lootitem; // removed [Valaris]
+// int pet_weight; // removed [Valaris]
+ int show_steal_in_same_party;
+ int enable_upper_class;
+ int pet_attack_attr_none;
+ int mob_attack_attr_none;
+ int mob_ghostring_fix;
+ int pc_attack_attr_none;
+ int item_rate_common,item_rate_card,item_rate_equip,item_rate_heal,item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val
+ int item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^
+ int item_drop_card_min,item_drop_card_max;
+ int item_drop_equip_min,item_drop_equip_max;
+ int item_drop_mvp_min,item_drop_mvp_max; // End Addition
+ int item_drop_heal_min,item_drop_heal_max; // Added by Valatris
+ int item_drop_use_min,item_drop_use_max; //End
+
+ int prevent_logout; // Added by RoVeRT
+
+ int alchemist_summon_reward; // [Valaris]
+ int maximum_level;
+ int drops_by_luk;
+ int monsters_ignore_gm;
+ int equipment_breaking;
+ int equipment_break_rate;
+ int pet_equip_required;
+ int multi_level_up;
+ int pk_mode;
+ int show_mob_hp; // end additions [Valaris]
+
+ int agi_penaly_count_lv;
+ int vit_penaly_count_lv;
+
+ int gx_allhit;
+ int gx_cardfix;
+ int gx_dupele;
+ int gx_disptype;
+ int player_skill_partner_check;
+ int hide_GM_session;
+ int unit_movement_type;
+ int invite_request_check;
+ int skill_removetrap_type;
+ int disp_experience;
+ int castle_defense_rate;
+ int riding_weight;
+ int backstab_bow_penalty;
+
+ int night_at_start; // added by [Yor]
+ int day_duration; // added by [Yor]
+ int night_duration; // added by [Yor]
+ int ban_spoof_namer; // added by [Yor]
+ int hack_info_GM_level; // added by [Yor]
+ int any_warp_GM_min_level; // added by [Yor]
+ int packet_ver_flag; // added by [Yor]
+ int muting_players; // added by [Apple]
+
+ int min_hair_style; // added by [MouseJstr]
+ int max_hair_style; // added by [MouseJstr]
+ int min_hair_color; // added by [MouseJstr]
+ int max_hair_color; // added by [MouseJstr]
+ int min_cloth_color; // added by [MouseJstr]
+ int max_cloth_color; // added by [MouseJstr]
+
+ int castrate_dex_scale; // added by [MouseJstr]
+ int area_size; // added by [MouseJstr]
+
+#ifndef TXT_ONLY /* SQL-only options */
+ int mail_system; // [Valaris]
+#endif
+
+} battle_config;
+
+extern int battle_config_read(const char *cfgName);
+extern void battle_validate_conf();
+extern void battle_set_defaults();
+extern int battle_set_value(char *, char *);
+
+#endif
diff --git a/src/map/chat.c b/src/map/chat.c
index 051d9609a..75788f03b 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -1,378 +1,378 @@
-// $Id: chat.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "clif.h"
-#include "pc.h"
-#include "chat.h"
-#include "npc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-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);
-
- cd = aCalloc(1,sizeof(struct chat_data));
-
- cd->limit = limit;
- cd->pub = pub;
- cd->users = 1;
- memcpy(cd->pass,pass,8);
- 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.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- clif_createchat(sd,1);
- free(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);
- if(cd==NULL)
- return 1;
-
- if(cd->bl.m != sd->bl.m || cd->limit <= cd->users){
- clif_joinchatfail(sd,0);
- return 0;
- }
- if(cd->pub==0 && strncmp(pass,cd->pass,8)){
- clif_joinchatfail(sd,1);
- return 0;
- }
- if(chatid == sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe
- {
- clif_joinchatfail(sd,1);
- return 0;
- }
-
- 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)
- return 1;
-
- for(i = 0,leavechar=-1;i < cd->users;i++){
- if(cd->usersd[i] == sd){
- leavechar=i;
- break;
- }
- }
- if(leavechar<0) // ‚»‚Ìchat‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚炵‚¢ (ƒoƒOŽž‚Ì‚Ý)
- 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){
- // ‘Sˆõ‹‚È‚­‚È‚Á‚½&PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅÁ‚·
- clif_clearchat(cd,0);
- map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
- } else {
- for(i=leavechar;i < cd->users;i++)
- cd->usersd[i] = cd->usersd[i+1];
- if(leavechar==0 && (*cd->owner)->type==BL_PC){
- // PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅŠ—LŽÒ‚ª”²‚¯‚½‚̂ňʒu•ÏX
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
- }
- 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 )
- return 1; //‚ ‚肦‚é‚Ì‚©‚ÈH
- cd->usersd[0] = cd->usersd[nextowner];
- cd->usersd[nextowner] = tmp_sd;
-
- // V‚µ‚¢Š—LŽÒ‚̈ʒu‚Ö•ÏX
- cd->bl.x=cd->usersd[0]->bl.x;
- cd->bl.y=cd->usersd[0]->bl.y;
-
- // Ä“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);
- 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,kickuser;
-
- 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 = 0,kickuser=-1;i < cd->users;i++){
- if(strcmp(cd->usersd[i]->status.name,kickusername)==0){
- kickuser=i;
- break;
- }
- }
- if(kickuser<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
- return -1;
-
- chat_leavechat(cd->usersd[kickuser]);
-
- return 0;
-}
-
-/*==========================================
- * 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 = aCalloc(1,sizeof(struct chat_data));
-
- cd->limit = cd->trigger = limit;
- if(trigger>0)
- cd->trigger = trigger;
- cd->pub = pub;
- cd->users = 0;
- memcpy(cd->pass,"",8);
- 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->owner_ = (struct block_list *)nd;
- cd->owner = &cd->owner_;
- memcpy(cd->npc_event,ev,sizeof(cd->npc_event));
-
- cd->bl.id = map_addobject(&cd->bl);
- if(cd->bl.id==0){
- free(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;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_chat(void)
-{
- return 0;
-}
+// $Id: chat.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "db.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "map.h"
+#include "clif.h"
+#include "pc.h"
+#include "chat.h"
+#include "npc.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+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);
+
+ cd = aCalloc(1,sizeof(struct chat_data));
+
+ cd->limit = limit;
+ cd->pub = pub;
+ cd->users = 1;
+ memcpy(cd->pass,pass,8);
+ 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.id = map_addobject(&cd->bl);
+ if(cd->bl.id==0){
+ clif_createchat(sd,1);
+ free(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);
+ if(cd==NULL)
+ return 1;
+
+ if(cd->bl.m != sd->bl.m || cd->limit <= cd->users){
+ clif_joinchatfail(sd,0);
+ return 0;
+ }
+ if(cd->pub==0 && strncmp(pass,cd->pass,8)){
+ clif_joinchatfail(sd,1);
+ return 0;
+ }
+ if(chatid == sd->chatID) //Double Chat fix by Alex14, thx CHaNGeTe
+ {
+ clif_joinchatfail(sd,1);
+ return 0;
+ }
+
+ 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)
+ return 1;
+
+ for(i = 0,leavechar=-1;i < cd->users;i++){
+ if(cd->usersd[i] == sd){
+ leavechar=i;
+ break;
+ }
+ }
+ if(leavechar<0) // ‚»‚Ìchat‚ÉŠ‘®‚µ‚Ä‚¢‚È‚¢‚炵‚¢ (ƒoƒOŽž‚Ì‚Ý)
+ 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){
+ // ‘Sˆõ‹‚È‚­‚È‚Á‚½&PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅÁ‚·
+ clif_clearchat(cd,0);
+ map_delobject(cd->bl.id); // free‚Ü‚Å‚µ‚Ä‚­‚ê‚é
+ } else {
+ for(i=leavechar;i < cd->users;i++)
+ cd->usersd[i] = cd->usersd[i+1];
+ if(leavechar==0 && (*cd->owner)->type==BL_PC){
+ // PC‚̃`ƒƒƒbƒg‚È‚Ì‚ÅŠ—LŽÒ‚ª”²‚¯‚½‚̂ňʒu•ÏX
+ cd->bl.x=cd->usersd[0]->bl.x;
+ cd->bl.y=cd->usersd[0]->bl.y;
+ }
+ 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 )
+ return 1; //‚ ‚肦‚é‚Ì‚©‚ÈH
+ cd->usersd[0] = cd->usersd[nextowner];
+ cd->usersd[nextowner] = tmp_sd;
+
+ // V‚µ‚¢Š—LŽÒ‚̈ʒu‚Ö•ÏX
+ cd->bl.x=cd->usersd[0]->bl.x;
+ cd->bl.y=cd->usersd[0]->bl.y;
+
+ // Ä“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);
+ 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,kickuser;
+
+ 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 = 0,kickuser=-1;i < cd->users;i++){
+ if(strcmp(cd->usersd[i]->status.name,kickusername)==0){
+ kickuser=i;
+ break;
+ }
+ }
+ if(kickuser<0) // ‚»‚ñ‚Èl‚Í‹‚È‚¢
+ return -1;
+
+ chat_leavechat(cd->usersd[kickuser]);
+
+ return 0;
+}
+
+/*==========================================
+ * 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 = aCalloc(1,sizeof(struct chat_data));
+
+ cd->limit = cd->trigger = limit;
+ if(trigger>0)
+ cd->trigger = trigger;
+ cd->pub = pub;
+ cd->users = 0;
+ memcpy(cd->pass,"",8);
+ 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->owner_ = (struct block_list *)nd;
+ cd->owner = &cd->owner_;
+ memcpy(cd->npc_event,ev,sizeof(cd->npc_event));
+
+ cd->bl.id = map_addobject(&cd->bl);
+ if(cd->bl.id==0){
+ free(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;
+}
+
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+int do_final_chat(void)
+{
+ return 0;
+}
diff --git a/src/map/chat.h b/src/map/chat.h
index 15559f188..276160251 100644
--- a/src/map/chat.h
+++ b/src/map/chat.h
@@ -1,22 +1,22 @@
-// $Id: chat.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#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);
-
-int do_final_chat(void);
-
-#endif
+// $Id: chat.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
+#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);
+
+int do_final_chat(void);
+
+#endif
diff --git a/src/map/chrif.c b/src/map/chrif.c
index 876c71758..6e53bd6d2 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1,1050 +1,1050 @@
-// $Id: chrif.c,v 1.6 2004/09/25 11:39:17 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <unistd.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <sys/types.h>
-#include <time.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "npc.h"
-#include "pc.h"
-#include "nullpo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static const int packet_len_table[0x20] = {
- 60, 3,-1,27,22,-1, 6,-1, // 2af8-2aff
- 6,-1,18, 7,-1,49,44, 0, // 2b00-2b07
- 6,30,-1,10,86, 7,44,34, // 2b08-2b0f
- -1,-1,10, 6,11,-1, 0, 0, // 2b10-2b17
-};
-
-int char_fd;
-int srvinfo;
-static char char_ip_str[16];
-static int char_ip;
-static int char_port = 6121;
-static char userid[24], passwd[24];
-static int chrif_state;
-
-// Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚ÝŠÖŒW
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setuserid(char *id)
-{
- strncpy(userid, id, 24);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setpasswd(char *pwd)
-{
- strncpy(passwd, pwd, 24);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setip(char *ip)
-{
- strncpy(char_ip_str, ip, 16);
- char_ip = inet_addr(char_ip_str);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void chrif_setport(int port)
-{
- char_port = port;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_isconnect(void)
-{
- return chrif_state == 2;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_save(struct map_session_data *sd)
-{
- nullpo_retr(-1, sd);
-
- if (char_fd < 0)
- return -1;
-
- pc_makesavestatus(sd);
-
- WFIFOW(char_fd,0) = 0x2b01;
- WFIFOW(char_fd,2) = sizeof(sd->status) + 12;
- WFIFOL(char_fd,4) = sd->bl.id;
- WFIFOL(char_fd,8) = sd->char_id;
- memcpy(WFIFOP(char_fd,12), &sd->status, sizeof(sd->status));
- WFIFOSET(char_fd, WFIFOW(char_fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connect(int fd)
-{
- WFIFOW(fd,0) = 0x2af8;
- memcpy(WFIFOP(fd,2), userid, 24);
- memcpy(WFIFOP(fd,26), passwd, 24);
- WFIFOL(fd,50) = 0;
- WFIFOL(fd,54) = clif_getip();
- WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov
- WFIFOSET(fd,60);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒv‘—M
- *------------------------------------------
- */
-int chrif_sendmap(int fd)
-{
- int i;
-
- WFIFOW(fd,0) = 0x2afa;
- for(i = 0; i < map_num; i++)
- if (map[i].alias[0] != '\0') // [MouseJstr] map aliasing
- memcpy(WFIFOP(fd,4+i*16), map[i].alias, 16);
- else
- memcpy(WFIFOP(fd,4+i*16), map[i].name, 16);
- WFIFOW(fd,2) = 4 + i * 16;
- 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;
-
- if (chrif_state < 2) // ‚Ü‚¾€”õ’†
- return -1;
-
- ip = RFIFOL(fd,4);
- port = RFIFOW(fd,8);
- for(i = 10, j = 0; i < RFIFOW(fd,2); i += 16, j++) {
- map_setipport(RFIFOP(fd,i), ip, port);
-// if (battle_config.etc_log)
-// printf("recv map %d %s\n", j, RFIFOP(fd,i));
- }
- if (battle_config.etc_log)
- printf("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®‚Ì‚½‚߂̃f[ƒ^€”õ—v‹
- *------------------------------------------
- */
-int chrif_changemapserver(struct map_session_data *sd, char *name, int x, int y, int ip, short port)
-{
- int i, s_ip;
-
- nullpo_retr(-1, sd);
-
- s_ip = 0;
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- s_ip = session[i]->client_addr.sin_addr.s_addr;
- break;
- }
-
- 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;
- memcpy(WFIFOP(char_fd,18), name, 16);
- WFIFOW(char_fd,34) = x;
- WFIFOW(char_fd,36) = y;
- WFIFOL(char_fd,38) = ip;
- WFIFOL(char_fd,42) = port;
- WFIFOB(char_fd,44) = sd->status.sex;
- WFIFOL(char_fd,45) = s_ip;
- WFIFOSET(char_fd,49);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvŽIŠÔˆÚ“®ack
- *------------------------------------------
- */
-int chrif_changemapserverack(int fd)
-{
- struct map_session_data *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)
- printf("map server change failed.\n");
- pc_authfail(sd->fd);
- return 0;
- }
- clif_changemapserver(sd, RFIFOP(fd,18), RFIFOW(fd,34), RFIFOW(fd,36), RFIFOL(fd,38), RFIFOW(fd,42));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_connectack(int fd)
-{
- if (RFIFOB(fd,2)) {
- printf("Connected to char-server failed %d.\n", RFIFOB(fd,2));
- exit(1);
- }
- printf("Connected to char-server (connection #%d).\n", fd);
- chrif_state = 1;
-
- chrif_sendmap(fd);
-
- printf("chrif: OnCharIfInit event done. (%d events)\n", npc_event_doall("OnCharIfInit"));
- printf("chrif: OnInterIfInit event done. (%d events)\n", npc_event_doall("OnInterIfInit"));
-
- // <Agit> Run Event [AgitInit]
-// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit"));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_sendmapack(int fd)
-{
- if (RFIFOB(fd,2)) {
- printf("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
- exit(1);
- }
-
- memcpy(wisp_server_name, RFIFOP(fd,3), 24);
-
- chrif_state = 2;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_authreq(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- if (!sd || !char_fd || !sd->bl.id || !sd->login_id1)
- return -1;
-
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- WFIFOW(char_fd, 0) = 0x2afc;
- WFIFOL(char_fd, 2) = sd->bl.id;
- WFIFOL(char_fd, 6) = sd->char_id;
- WFIFOL(char_fd,10) = sd->login_id1;
- WFIFOL(char_fd,14) = sd->login_id2;
- WFIFOL(char_fd,18) = session[i]->client_addr.sin_addr.s_addr;
- WFIFOSET(char_fd,22);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int chrif_charselectreq(struct map_session_data *sd)
-{
- int i, s_ip;
-
- nullpo_retr(-1, sd);
-
- if(!sd || !char_fd || !sd->bl.id || !sd->login_id1)
- return -1;
-
- s_ip = 0;
- for(i = 0; i < fd_max; i++)
- if (session[i] && session[i]->session_data == sd) {
- s_ip = session[i]->client_addr.sin_addr.s_addr;
- break;
- }
-
- 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;
-
- 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)
- printf("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
-
- 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)
- printf("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email);
-
- 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)
-{
- 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, 24);
- 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;
- }
- printf("chrif : sended 0x2b0e\n");
- WFIFOSET(char_fd,44);
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•Ï‰»—v‹
- *------------------------------------------
- */
-int chrif_changesex(int id, int sex) {
- WFIFOW(char_fd,0) = 0x3000;
- WFIFOW(char_fd,2) = 9;
- WFIFOL(char_fd,4) = id;
- WFIFOB(char_fd,8) = sex;
- printf("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[24];
-
- acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
- memcpy(player_name, RFIFOP(fd,6), sizeof(player_name));
- player_name[sizeof(player_name)-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
- printf("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;
-
- acc = RFIFOL(fd,2);
- level = RFIFOL(fd,6);
-
- sd = map_id2sd(acc);
-
- if (battle_config.etc_log)
- printf("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;
- struct pc_base_job s_class;
-
- acc = RFIFOL(fd,2);
- sex = RFIFOL(fd,6);
- if (battle_config.etc_log)
- printf("chrif_changedsex %d.\n", acc);
- sd = map_id2sd(acc);
- if (acc > 0) {
- if (sd != NULL && sd->status.sex != sex) {
- s_class = pc_calc_base_job(sd->status.class);
- if (sd->status.sex == 0) {
- sd->status.sex = 1;
- sd->sex = 1;
- } else if (sd->status.sex == 1) {
- sd->status.sex = 0;
- sd->sex = 0;
- }
- // 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, 0);
- }
- // reset skill of some job
- if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042 ||
- s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043) {
- // remove specifical skills of classes 19, 4020 and 4042
- for(i = 315; i <= 322; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- 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 classes 20, 4021 and 4043
- for(i = 323; i <= 330; i++) {
- if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
- 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 (s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043)
- sd->status.class -= 1;
- else if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042)
- sd->status.class += 1;
- }
- // save character
- chrif_save(sd);
- 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 disconexion by the server)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL) {
- printf("chrif_changedsex failed.\n");
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
- *------------------------------------------
- */
-int chrif_saveaccountreg2(struct map_session_data *sd)
-{
- int p, j;
- nullpo_retr(-1, sd);
-
- p = 8;
- for(j = 0; j < sd->status.account_reg2_num; j++) {
- struct global_reg *reg = &sd->status.account_reg2[j];
- if (reg->str[0] && reg->value != 0) {
- memcpy(WFIFOP(char_fd,p), reg->str, 32);
- WFIFOL(char_fd,p+32) = reg->value;
- p += 36;
- }
- }
- WFIFOW(char_fd,0) = 0x2b10;
- WFIFOW(char_fd,2) = p;
- WFIFOL(char_fd,4) = sd->bl.id;
- WFIFOSET(char_fd,p);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
- *------------------------------------------
- */
-int chrif_accountreg2(int fd)
-{
- int j, p;
- struct map_session_data *sd;
-
- if ((sd = map_id2sd(RFIFOL(fd,4))) == NULL)
- return 1;
-
- for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
- memcpy(sd->status.account_reg2[j].str, RFIFOP(fd,p), 32);
- sd->status.account_reg2[j].value = RFIFOL(fd, p + 32);
- }
- sd->status.account_reg2_num = j;
-// printf("chrif: accountreg2\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;
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- printf("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 (disconnexion)...");
- clif_setwaitclose(sd->fd); // forced to disconnect for the change
- }
- } else {
- if (sd != NULL)
- printf("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;
-
- acc = RFIFOL(fd,2);
- if (battle_config.etc_log)
- printf("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)
- printf("chrif_accountban failed - player not online.\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ƒNƒ^[Ø’f’Ê’m
- *------------------------------------------
- */
-int chrif_chardisconnect(struct map_session_data *sd)
-{
- nullpo_retr(-1, sd);
-
- if(char_fd<=0)
- return -1;
-
- WFIFOW(char_fd,0)=0x2b18;
- WFIFOL(char_fd,2)=sd->status.account_id;
- WFIFOL(char_fd,6)=sd->status.char_id;
- WFIFOSET(char_fd,10);
- //printf("chrif: char disconnect: %d %s\n",sd->bl.id,sd->status.name);
- return 0;
-
-}
-
-/*==========================================
- * Receiving GM accounts and their levels from char-server by [Yor]
- *------------------------------------------
- */
-int chrif_recvgmaccounts(int fd)
-{
- printf("From login-server: receiving of %d GM accounts information.\n", pc_read_gm_account(fd));
-
- return 0;
-}
-
-/*==========================================
- * Request to reload GM accounts and their levels: send to char-server by [Yor]
- *------------------------------------------
- */
-int chrif_reloadGMdb(void)
-{
-
- WFIFOW(char_fd,0) = 0x2af7;
- WFIFOSET(char_fd, 2);
-
- 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;
-
- 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 {
- 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)
-{
- if (char_fd < 0)
- return -1;
-
- WFIFOW(char_fd,0) = 0x2b17;
- WFIFOL(char_fd,2) = sd->status.char_id;
- WFIFOSET(char_fd,6);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-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) {
- printf("Map-server can't connect to char-server (connection #%d).\n", fd);
- char_fd = -1;
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- while (RFIFOREST(fd) >= 2) {
- 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;
- 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 (RFIFOREST(fd) < packet_len)
- return 0;
-
- switch(cmd) {
- case 0x2af9: chrif_connectack(fd); break;
- case 0x2afb: chrif_sendmapack(fd); break;
- case 0x2afd: pc_authok(RFIFOL(fd,4), RFIFOL(fd,8), (time_t)RFIFOL(fd,12), (struct mmo_charstatus*)RFIFOP(fd,16)); break;
- case 0x2afe: pc_authfail(RFIFOL(fd,2)); break;
- case 0x2b00: map_setusers(RFIFOL(fd,2)); break;
- case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
- case 0x2b04: chrif_recvmap(fd); break;
- case 0x2b06: chrif_changemapserverack(fd); break;
- case 0x2b09: map_addchariddb(RFIFOL(fd,2), 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 0x2b11: chrif_accountreg2(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;
-
- default:
- if (battle_config.error_log)
- printf("chrif_parse : unknown packet %d %d\n", fd, RFIFOW(fd,0));
- session[fd]->eof = 1;
- return 0;
- }
- RFIFOSKIP(fd, packet_len);
- }
-
- 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 users = 0, i;
- struct map_session_data *sd;
-
- if (char_fd <= 0 || session[char_fd] == NULL)
- return 0;
-
- WFIFOW(char_fd,0) = 0x2aff;
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) && sd->state.auth &&
- !((battle_config.hide_GM_session || (sd->status.option & OPTION_HIDE)) && pc_isGM(sd))) {
- WFIFOL(char_fd,6+4*users) = sd->status.char_id;
- users++;
- }
- }
- WFIFOW(char_fd,2) = 6 + 4 * users;
- WFIFOW(char_fd,4) = users;
- WFIFOSET(char_fd,6+4*users);
-
- return 0;
-}
-
-/*==========================================
- * timerŠÖ”
- * charŽI‚Æ‚ÌÚ‘±‚ðŠm”F‚µA‚à‚µØ‚ê‚Ä‚¢‚½‚çÄ“xÚ‘±‚·‚é
- *------------------------------------------
- */
-int check_connect_char_server(int tid, unsigned int tick, int id, int data) {
- if (char_fd <= 0 || session[char_fd] == NULL) {
- printf("Attempt to connect to char-server...\n");
- chrif_state = 0;
- char_fd = make_connection(char_ip, char_port);
- session[char_fd]->func_parse = chrif_parse;
- realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
-
- chrif_connect(char_fd);
-#ifndef TXT_ONLY
- srvinfo = 0;
- } else {
- 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 */
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_chrif(void) {
- add_timer_func_list(check_connect_char_server, "check_connect_char_server");
- add_timer_func_list(send_users_tochar, "send_users_tochar");
- add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
- add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, 5 * 1000);
-
- return 0;
-}
+// $Id: chrif.c,v 1.6 2004/09/25 11:39:17 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+#include <sys/types.h>
+#include <time.h>
+
+#include "socket.h"
+#include "timer.h"
+#include "map.h"
+#include "battle.h"
+#include "chrif.h"
+#include "clif.h"
+#include "intif.h"
+#include "npc.h"
+#include "pc.h"
+#include "nullpo.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+static const int packet_len_table[0x20] = {
+ 60, 3,-1,27,22,-1, 6,-1, // 2af8-2aff
+ 6,-1,18, 7,-1,49,44, 0, // 2b00-2b07
+ 6,30,-1,10,86, 7,44,34, // 2b08-2b0f
+ -1,-1,10, 6,11,-1, 0, 0, // 2b10-2b17
+};
+
+int char_fd;
+int srvinfo;
+static char char_ip_str[16];
+static int char_ip;
+static int char_port = 6121;
+static char userid[24], passwd[24];
+static int chrif_state;
+
+// Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚ÝŠÖŒW
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setuserid(char *id)
+{
+ strncpy(userid, id, 24);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setpasswd(char *pwd)
+{
+ strncpy(passwd, pwd, 24);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setip(char *ip)
+{
+ strncpy(char_ip_str, ip, 16);
+ char_ip = inet_addr(char_ip_str);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void chrif_setport(int port)
+{
+ char_port = port;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_isconnect(void)
+{
+ return chrif_state == 2;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_save(struct map_session_data *sd)
+{
+ nullpo_retr(-1, sd);
+
+ if (char_fd < 0)
+ return -1;
+
+ pc_makesavestatus(sd);
+
+ WFIFOW(char_fd,0) = 0x2b01;
+ WFIFOW(char_fd,2) = sizeof(sd->status) + 12;
+ WFIFOL(char_fd,4) = sd->bl.id;
+ WFIFOL(char_fd,8) = sd->char_id;
+ memcpy(WFIFOP(char_fd,12), &sd->status, sizeof(sd->status));
+ WFIFOSET(char_fd, WFIFOW(char_fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_connect(int fd)
+{
+ WFIFOW(fd,0) = 0x2af8;
+ memcpy(WFIFOP(fd,2), userid, 24);
+ memcpy(WFIFOP(fd,26), passwd, 24);
+ WFIFOL(fd,50) = 0;
+ WFIFOL(fd,54) = clif_getip();
+ WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov
+ WFIFOSET(fd,60);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒv‘—M
+ *------------------------------------------
+ */
+int chrif_sendmap(int fd)
+{
+ int i;
+
+ WFIFOW(fd,0) = 0x2afa;
+ for(i = 0; i < map_num; i++)
+ if (map[i].alias[0] != '\0') // [MouseJstr] map aliasing
+ memcpy(WFIFOP(fd,4+i*16), map[i].alias, 16);
+ else
+ memcpy(WFIFOP(fd,4+i*16), map[i].name, 16);
+ WFIFOW(fd,2) = 4 + i * 16;
+ 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;
+
+ if (chrif_state < 2) // ‚Ü‚¾€”õ’†
+ return -1;
+
+ ip = RFIFOL(fd,4);
+ port = RFIFOW(fd,8);
+ for(i = 10, j = 0; i < RFIFOW(fd,2); i += 16, j++) {
+ map_setipport(RFIFOP(fd,i), ip, port);
+// if (battle_config.etc_log)
+// printf("recv map %d %s\n", j, RFIFOP(fd,i));
+ }
+ if (battle_config.etc_log)
+ printf("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvŽIŠÔˆÚ“®‚Ì‚½‚߂̃f[ƒ^€”õ—v‹
+ *------------------------------------------
+ */
+int chrif_changemapserver(struct map_session_data *sd, char *name, int x, int y, int ip, short port)
+{
+ int i, s_ip;
+
+ nullpo_retr(-1, sd);
+
+ s_ip = 0;
+ for(i = 0; i < fd_max; i++)
+ if (session[i] && session[i]->session_data == sd) {
+ s_ip = session[i]->client_addr.sin_addr.s_addr;
+ break;
+ }
+
+ 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;
+ memcpy(WFIFOP(char_fd,18), name, 16);
+ WFIFOW(char_fd,34) = x;
+ WFIFOW(char_fd,36) = y;
+ WFIFOL(char_fd,38) = ip;
+ WFIFOL(char_fd,42) = port;
+ WFIFOB(char_fd,44) = sd->status.sex;
+ WFIFOL(char_fd,45) = s_ip;
+ WFIFOSET(char_fd,49);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvŽIŠÔˆÚ“®ack
+ *------------------------------------------
+ */
+int chrif_changemapserverack(int fd)
+{
+ struct map_session_data *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)
+ printf("map server change failed.\n");
+ pc_authfail(sd->fd);
+ return 0;
+ }
+ clif_changemapserver(sd, RFIFOP(fd,18), RFIFOW(fd,34), RFIFOW(fd,36), RFIFOL(fd,38), RFIFOW(fd,42));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_connectack(int fd)
+{
+ if (RFIFOB(fd,2)) {
+ printf("Connected to char-server failed %d.\n", RFIFOB(fd,2));
+ exit(1);
+ }
+ printf("Connected to char-server (connection #%d).\n", fd);
+ chrif_state = 1;
+
+ chrif_sendmap(fd);
+
+ printf("chrif: OnCharIfInit event done. (%d events)\n", npc_event_doall("OnCharIfInit"));
+ printf("chrif: OnInterIfInit event done. (%d events)\n", npc_event_doall("OnInterIfInit"));
+
+ // <Agit> Run Event [AgitInit]
+// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit"));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_sendmapack(int fd)
+{
+ if (RFIFOB(fd,2)) {
+ printf("chrif : send map list to char server failed %d\n", RFIFOB(fd,2));
+ exit(1);
+ }
+
+ memcpy(wisp_server_name, RFIFOP(fd,3), 24);
+
+ chrif_state = 2;
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_authreq(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(-1, sd);
+
+ if (!sd || !char_fd || !sd->bl.id || !sd->login_id1)
+ return -1;
+
+ for(i = 0; i < fd_max; i++)
+ if (session[i] && session[i]->session_data == sd) {
+ WFIFOW(char_fd, 0) = 0x2afc;
+ WFIFOL(char_fd, 2) = sd->bl.id;
+ WFIFOL(char_fd, 6) = sd->char_id;
+ WFIFOL(char_fd,10) = sd->login_id1;
+ WFIFOL(char_fd,14) = sd->login_id2;
+ WFIFOL(char_fd,18) = session[i]->client_addr.sin_addr.s_addr;
+ WFIFOSET(char_fd,22);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int chrif_charselectreq(struct map_session_data *sd)
+{
+ int i, s_ip;
+
+ nullpo_retr(-1, sd);
+
+ if(!sd || !char_fd || !sd->bl.id || !sd->login_id1)
+ return -1;
+
+ s_ip = 0;
+ for(i = 0; i < fd_max; i++)
+ if (session[i] && session[i]->session_data == sd) {
+ s_ip = session[i]->client_addr.sin_addr.s_addr;
+ break;
+ }
+
+ 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;
+
+ 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)
+ printf("chrif_changegm: account: %d, password: '%s'.\n", id, pass);
+
+ 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)
+ printf("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email);
+
+ 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)
+{
+ 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, 24);
+ 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;
+ }
+ printf("chrif : sended 0x2b0e\n");
+ WFIFOSET(char_fd,44);
+
+ return 0;
+}
+
+/*==========================================
+ * «•Ê•Ï‰»—v‹
+ *------------------------------------------
+ */
+int chrif_changesex(int id, int sex) {
+ WFIFOW(char_fd,0) = 0x3000;
+ WFIFOW(char_fd,2) = 9;
+ WFIFOL(char_fd,4) = id;
+ WFIFOB(char_fd,8) = sex;
+ printf("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[24];
+
+ acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody)
+ memcpy(player_name, RFIFOP(fd,6), sizeof(player_name));
+ player_name[sizeof(player_name)-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
+ printf("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;
+
+ acc = RFIFOL(fd,2);
+ level = RFIFOL(fd,6);
+
+ sd = map_id2sd(acc);
+
+ if (battle_config.etc_log)
+ printf("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;
+ struct pc_base_job s_class;
+
+ acc = RFIFOL(fd,2);
+ sex = RFIFOL(fd,6);
+ if (battle_config.etc_log)
+ printf("chrif_changedsex %d.\n", acc);
+ sd = map_id2sd(acc);
+ if (acc > 0) {
+ if (sd != NULL && sd->status.sex != sex) {
+ s_class = pc_calc_base_job(sd->status.class);
+ if (sd->status.sex == 0) {
+ sd->status.sex = 1;
+ sd->sex = 1;
+ } else if (sd->status.sex == 1) {
+ sd->status.sex = 0;
+ sd->sex = 0;
+ }
+ // 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, 0);
+ }
+ // reset skill of some job
+ if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042 ||
+ s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043) {
+ // remove specifical skills of classes 19, 4020 and 4042
+ for(i = 315; i <= 322; i++) {
+ if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
+ 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 classes 20, 4021 and 4043
+ for(i = 323; i <= 330; i++) {
+ if (sd->status.skill[i].id > 0 && !sd->status.skill[i].flag) {
+ 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 (s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043)
+ sd->status.class -= 1;
+ else if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042)
+ sd->status.class += 1;
+ }
+ // save character
+ chrif_save(sd);
+ 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 disconexion by the server)...");
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
+ }
+ } else {
+ if (sd != NULL) {
+ printf("chrif_changedsex failed.\n");
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒJƒEƒ“ƒg•Ï”•Û‘¶—v‹
+ *------------------------------------------
+ */
+int chrif_saveaccountreg2(struct map_session_data *sd)
+{
+ int p, j;
+ nullpo_retr(-1, sd);
+
+ p = 8;
+ for(j = 0; j < sd->status.account_reg2_num; j++) {
+ struct global_reg *reg = &sd->status.account_reg2[j];
+ if (reg->str[0] && reg->value != 0) {
+ memcpy(WFIFOP(char_fd,p), reg->str, 32);
+ WFIFOL(char_fd,p+32) = reg->value;
+ p += 36;
+ }
+ }
+ WFIFOW(char_fd,0) = 0x2b10;
+ WFIFOW(char_fd,2) = p;
+ WFIFOL(char_fd,4) = sd->bl.id;
+ WFIFOSET(char_fd,p);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
+ *------------------------------------------
+ */
+int chrif_accountreg2(int fd)
+{
+ int j, p;
+ struct map_session_data *sd;
+
+ if ((sd = map_id2sd(RFIFOL(fd,4))) == NULL)
+ return 1;
+
+ for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) {
+ memcpy(sd->status.account_reg2[j].str, RFIFOP(fd,p), 32);
+ sd->status.account_reg2[j].value = RFIFOL(fd, p + 32);
+ }
+ sd->status.account_reg2_num = j;
+// printf("chrif: accountreg2\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;
+
+ acc = RFIFOL(fd,2);
+ if (battle_config.etc_log)
+ printf("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 (disconnexion)...");
+ clif_setwaitclose(sd->fd); // forced to disconnect for the change
+ }
+ } else {
+ if (sd != NULL)
+ printf("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;
+
+ acc = RFIFOL(fd,2);
+ if (battle_config.etc_log)
+ printf("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)
+ printf("chrif_accountban failed - player not online.\n");
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒLƒƒƒ‰ƒNƒ^[Ø’f’Ê’m
+ *------------------------------------------
+ */
+int chrif_chardisconnect(struct map_session_data *sd)
+{
+ nullpo_retr(-1, sd);
+
+ if(char_fd<=0)
+ return -1;
+
+ WFIFOW(char_fd,0)=0x2b18;
+ WFIFOL(char_fd,2)=sd->status.account_id;
+ WFIFOL(char_fd,6)=sd->status.char_id;
+ WFIFOSET(char_fd,10);
+ //printf("chrif: char disconnect: %d %s\n",sd->bl.id,sd->status.name);
+ return 0;
+
+}
+
+/*==========================================
+ * Receiving GM accounts and their levels from char-server by [Yor]
+ *------------------------------------------
+ */
+int chrif_recvgmaccounts(int fd)
+{
+ printf("From login-server: receiving of %d GM accounts information.\n", pc_read_gm_account(fd));
+
+ return 0;
+}
+
+/*==========================================
+ * Request to reload GM accounts and their levels: send to char-server by [Yor]
+ *------------------------------------------
+ */
+int chrif_reloadGMdb(void)
+{
+
+ WFIFOW(char_fd,0) = 0x2af7;
+ WFIFOSET(char_fd, 2);
+
+ 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;
+
+ 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 {
+ 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)
+{
+ if (char_fd < 0)
+ return -1;
+
+ WFIFOW(char_fd,0) = 0x2b17;
+ WFIFOL(char_fd,2) = sd->status.char_id;
+ WFIFOSET(char_fd,6);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+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) {
+ printf("Map-server can't connect to char-server (connection #%d).\n", fd);
+ char_fd = -1;
+ }
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ while (RFIFOREST(fd) >= 2) {
+ 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;
+ 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 (RFIFOREST(fd) < packet_len)
+ return 0;
+
+ switch(cmd) {
+ case 0x2af9: chrif_connectack(fd); break;
+ case 0x2afb: chrif_sendmapack(fd); break;
+ case 0x2afd: pc_authok(RFIFOL(fd,4), RFIFOL(fd,8), (time_t)RFIFOL(fd,12), (struct mmo_charstatus*)RFIFOP(fd,16)); break;
+ case 0x2afe: pc_authfail(RFIFOL(fd,2)); break;
+ case 0x2b00: map_setusers(RFIFOL(fd,2)); break;
+ case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
+ case 0x2b04: chrif_recvmap(fd); break;
+ case 0x2b06: chrif_changemapserverack(fd); break;
+ case 0x2b09: map_addchariddb(RFIFOL(fd,2), 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 0x2b11: chrif_accountreg2(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;
+
+ default:
+ if (battle_config.error_log)
+ printf("chrif_parse : unknown packet %d %d\n", fd, RFIFOW(fd,0));
+ session[fd]->eof = 1;
+ return 0;
+ }
+ RFIFOSKIP(fd, packet_len);
+ }
+
+ 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 users = 0, i;
+ struct map_session_data *sd;
+
+ if (char_fd <= 0 || session[char_fd] == NULL)
+ return 0;
+
+ WFIFOW(char_fd,0) = 0x2aff;
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) && sd->state.auth &&
+ !((battle_config.hide_GM_session || (sd->status.option & OPTION_HIDE)) && pc_isGM(sd))) {
+ WFIFOL(char_fd,6+4*users) = sd->status.char_id;
+ users++;
+ }
+ }
+ WFIFOW(char_fd,2) = 6 + 4 * users;
+ WFIFOW(char_fd,4) = users;
+ WFIFOSET(char_fd,6+4*users);
+
+ return 0;
+}
+
+/*==========================================
+ * timerŠÖ”
+ * charŽI‚Æ‚ÌÚ‘±‚ðŠm”F‚µA‚à‚µØ‚ê‚Ä‚¢‚½‚çÄ“xÚ‘±‚·‚é
+ *------------------------------------------
+ */
+int check_connect_char_server(int tid, unsigned int tick, int id, int data) {
+ if (char_fd <= 0 || session[char_fd] == NULL) {
+ printf("Attempt to connect to char-server...\n");
+ chrif_state = 0;
+ char_fd = make_connection(char_ip, char_port);
+ session[char_fd]->func_parse = chrif_parse;
+ realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
+
+ chrif_connect(char_fd);
+#ifndef TXT_ONLY
+ srvinfo = 0;
+ } else {
+ 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 */
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int do_init_chrif(void) {
+ add_timer_func_list(check_connect_char_server, "check_connect_char_server");
+ add_timer_func_list(send_users_tochar, "send_users_tochar");
+ add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000);
+ add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, 5 * 1000);
+
+ return 0;
+}
diff --git a/src/map/chrif.h b/src/map/chrif.h
index 858fdeaa7..de20c3086 100644
--- a/src/map/chrif.h
+++ b/src/map/chrif.h
@@ -1,31 +1,31 @@
-// $Id: chrif.h,v 1.3 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _CHRIF_H_
-#define _CHRIF_H_
-
-void chrif_setuserid(char*);
-void chrif_setpasswd(char*);
-void chrif_setip(char*);
-void chrif_setport(int);
-
-int chrif_isconnect(void);
-
-int chrif_authreq(struct map_session_data *);
-int chrif_save(struct map_session_data*);
-int chrif_charselectreq(struct map_session_data *);
-
-int chrif_changemapserver(struct map_session_data *sd,char *name,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_saveaccountreg2(struct map_session_data *sd);
-int chrif_reloadGMdb(void);
-int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate);
-int chrif_char_offline(struct map_session_data *sd);
-int chrif_changesex(int id, int sex);
-int chrif_chardisconnect(struct map_session_data *sd);
-
-int do_init_chrif(void);
-
-#endif
+// $Id: chrif.h,v 1.3 2004/09/25 11:39:17 MouseJstr Exp $
+#ifndef _CHRIF_H_
+#define _CHRIF_H_
+
+void chrif_setuserid(char*);
+void chrif_setpasswd(char*);
+void chrif_setip(char*);
+void chrif_setport(int);
+
+int chrif_isconnect(void);
+
+int chrif_authreq(struct map_session_data *);
+int chrif_save(struct map_session_data*);
+int chrif_charselectreq(struct map_session_data *);
+
+int chrif_changemapserver(struct map_session_data *sd,char *name,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_saveaccountreg2(struct map_session_data *sd);
+int chrif_reloadGMdb(void);
+int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate);
+int chrif_char_offline(struct map_session_data *sd);
+int chrif_changesex(int id, int sex);
+int chrif_chardisconnect(struct map_session_data *sd);
+
+int do_init_chrif(void);
+
+#endif
diff --git a/src/map/clif.c b/src/map/clif.c
index 6a4094286..544a8fdfc 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -1,10377 +1,10377 @@
-// $Id: clif.c 2200 2004-11-07 11:49:58Z Yor $
-
-#define DUMP_UNKNOWN_PACKET 1
-
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdarg.h>
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-#include <time.h>
-
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/version.h"
-#include "../common/nullpo.h"
-
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "pc.h"
-#include "npc.h"
-#include "itemdb.h"
-#include "chat.h"
-#include "trade.h"
-#include "storage.h"
-#include "script.h"
-#include "skill.h"
-#include "atcommand.h"
-#include "intif.h"
-#include "battle.h"
-#include "mob.h"
-#include "party.h"
-#include "guild.h"
-#include "vending.h"
-#include "pet.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define STATE_BLIND 0x10
-
-static const int packet_len_table[0x220] = {
- 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,
-#if PACKETVER < 2
- 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6,
-#else // 78-7b ‹T“‡ˆÈ~ lv99ƒGƒtƒFƒNƒg—p
- 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
-#endif
-//#0x0080
- 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0, // 0x8b unknown... size 2 or 23?
- 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,
-#if PACKETVER < 1
- 90, 86, 24, 6, 30,102, 8, 4, 8, 4, 14, 10, -1, 6, 2, 6,
-#else // 196 comodoˆÈ~ ó‘Ô•\Ž¦ƒAƒCƒRƒ“—p
- 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6,
-#endif
- 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, Set 0x1d5=-1
- 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28,
- 8, 14, 10, 35, 6, -1, 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, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 19, 0, -1, 24, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-// size list for each packet version after packet version 4.
-static int packet_size_table[9][0x220];
-
-// local define
-enum {
- ALL_CLIENT,
- ALL_SAMEMAP,
- AREA,
- AREA_WOS,
- AREA_WOC,
- AREA_WOSC,
- AREA_CHAT_WOC,
- CHAT,
- CHAT_WOS,
- 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
-};
-
-#define WBUFPOS(p,pos,x,y) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x)>>2; __p[1] = ((x)<<6) | (((y)>>4)&0x3f); __p[2] = (y)<<4; }
-#define WBUFPOS2(p,pos,x0,y0,x1,y1) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x0)>>2; __p[1] = ((x0)<<6) | (((y0)>>4)&0x3f); __p[2] = ((y0)<<4) | (((x1)>>6)&0x0f); __p[3]=((x1)<<2) | (((y1)>>8)&0x03); __p[4]=(y1); }
-
-#define WFIFOPOS(fd,pos,x,y) { WBUFPOS (WFIFOP(fd,pos),0,x,y); }
-#define WFIFOPOS2(fd,pos,x0,y0,x1,y1) { WBUFPOS2(WFIFOP(fd,pos),0,x0,y0,x1,y1); }
-
-static char map_ip_str[16];
-static in_addr_t map_ip;
-static int map_port = 5121;
-int map_fd;
-char talkie_mes[80];
-
-/*==========================================
- * mapŽI‚ÌipÝ’è
- *------------------------------------------
- */
-void clif_setip(char *ip)
-{
- memcpy(map_ip_str, ip, 16);
- map_ip = inet_addr(map_ip_str);
-}
-
-/*==========================================
- * mapŽI‚ÌportÝ’è
- *------------------------------------------
- */
-void clif_setport(int port)
-{
- map_port = port;
-}
-
-/*==========================================
- * mapŽI‚Ìip“Ç‚Ýo‚µ
- *------------------------------------------
- */
-in_addr_t clif_getip(void)
-{
- return map_ip;
-}
-
-/*==========================================
- * mapŽI‚Ìport“Ç‚Ýo‚µ
- *------------------------------------------
- */
-int clif_getport(void)
-{
- return map_port;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_countusers(void)
-{
- int users = 0, i;
- struct map_session_data *sd;
-
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth &&
- !(battle_config.hide_GM_session && pc_isGM(sd)))
- users++;
- }
- return users;
-}
-
-/*==========================================
- * ‘S‚Ä‚Ìclient‚ɑ΂µ‚Äfunc()ŽÀs
- *------------------------------------------
- */
-int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...)
-{
- int i;
- va_list ap;
- struct map_session_data *sd;
-
- va_start(ap,func);
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth)
- func(sd, ap);
- }
- va_end(ap);
- return 0;
-}
-
-/*==========================================
- * clif_send‚ÅAREA*Žw’莞—p
- *------------------------------------------
- */
-int clif_send_sub(struct block_list *bl, va_list ap)
-{
- unsigned char *buf;
- int len;
- struct block_list *src_bl;
- int type;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd = (struct map_session_data *)bl);
-
- buf = va_arg(ap,unsigned char*);
- len = va_arg(ap,int);
- nullpo_retr(0, src_bl = va_arg(ap,struct block_list*));
- type = va_arg(ap,int);
-
- switch(type) {
- case AREA_WOS:
- if (bl && bl == src_bl)
- return 0;
- break;
- case AREA_WOC:
- if ((sd && sd->chatID) || (bl && bl == src_bl))
- return 0;
- break;
- case AREA_WOSC:
- if ((sd) && sd->chatID && sd->chatID == ((struct map_session_data*)src_bl)->chatID)
- return 0;
- break;
- }
-
- if (sd) {
- if (WFIFOP(sd->fd,0) == buf) {
- printf("WARNING: Invalid use of clif_send function\n");
- printf(" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n", WBUFW(buf,0));
- printf(" Please correct your code.\n");
- // don't send to not move the pointer of the packet for next sessions in the loop
- } else {
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) {
- int i;
- struct map_session_data *sd;
- struct chat_data *cd;
- struct party *p = NULL;
- struct guild *g = NULL;
- int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
-
- if (type != ALL_CLIENT) {
- nullpo_retr(0, bl);
- }
-
- switch(type) {
- case ALL_CLIENT: // ‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(i,0), buf, len);
- WFIFOSET(i,len);
- }
- }
- }
- break;
- case ALL_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) {
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(i,0), buf, len);
- WFIFOSET(i,len);
- }
- }
- }
- break;
- case AREA:
- case AREA_WOS:
- case AREA_WOC:
- case AREA_WOSC:
- map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, BL_PC, buf, len, bl, type);
- break;
- case AREA_CHAT_WOC:
- map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5), bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_WOC);
- break;
- case CHAT:
- case CHAT_WOS:
- cd = (struct chat_data*)bl;
- if (bl->type == BL_PC) {
- sd = (struct map_session_data*)bl;
- cd = (struct chat_data*)map_id2bl(sd->chatID);
- } else if (bl->type != BL_CHAT)
- break;
- if (cd == NULL)
- break;
- for(i = 0; i < cd->users; i++) {
- if (type == CHAT_WOS && cd->usersd[i] == (struct map_session_data*)bl)
- continue;
- if (packet_size_table[cd->usersd[i]->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- if (cd->usersd[i]->fd >=0 && session[cd->usersd[i]->fd]) // Added check to see if session exists [PoW]
- memcpy(WFIFOP(cd->usersd[i]->fd,0), buf, len);
- WFIFOSET(cd->usersd[i]->fd,len);
- }
- }
- break;
-
- case PARTY_AREA: // “¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_AREA_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- x0 = bl->x - AREA_SIZE;
- y0 = bl->y - AREA_SIZE;
- x1 = bl->x + AREA_SIZE;
- y1 = bl->y + AREA_SIZE;
- case PARTY: // ‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_WOS: // Ž©•ªˆÈŠO‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- case PARTY_SAMEMAP_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
- if (bl->type == BL_PC) {
- sd = (struct map_session_data *)bl;
- if (sd->partyspy > 0) {
- p = party_search(sd->partyspy);
- } else {
- if (sd->status.party_id > 0)
- p = party_search(sd->status.party_id);
- }
- }
- if (p) {
- for(i=0;i<MAX_PARTY;i++){
- if ((sd = p->member[i].sd) != NULL) {
- if (sd->bl.id == bl->id && (type == PARTY_WOS ||
- type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS))
- continue;
- if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
- continue;
- if ((type == PARTY_AREA || type == PARTY_AREA_WOS) &&
- (sd->bl.x < x0 || sd->bl.y < y0 ||
- sd->bl.x > x1 || sd->bl.y > y1))
- continue;
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
-// if(battle_config.etc_log)
-// printf("send party %d %d %d\n",p->party_id,i,flag)
-
- }
- }
- for (i = 0; i < fd_max; i++){
- if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
- if (sd->partyspy == p->party_id) {
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- }
- break;
- case SELF:
- sd = (struct map_session_data *)bl;
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- break;
-
-/* New definitions for guilds [Valaris] */
-
- case GUILD_AREA:
- case GUILD_AREA_WOS:
- x0 = bl->x - AREA_SIZE;
- y0 = bl->y - AREA_SIZE;
- x1 = bl->x + AREA_SIZE;
- y1 = bl->y + AREA_SIZE;
- case GUILD:
- case GUILD_WOS:
- if (bl && bl->type == BL_PC) { // guildspy [Syrus22]
- sd = (struct map_session_data *)bl;
- if (sd->guildspy > 0) {
- g = guild_search(sd->guildspy);
- } else {
- if (sd->status.guild_id > 0)
- g = guild_search(sd->status.guild_id);
- }
- }
- if (g) {
- for(i = 0; i < g->max_member; i++) {
- if ((sd = g->member[i].sd) != NULL) {
- if (type == GUILD_WOS && sd->bl.id == bl->id)
- continue;
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- for (i = 0; i < fd_max; i++){
- if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
- if (sd->guildspy == g->guild_id) {
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- }
- break;
- case GUILD_SAMEMAP:
- case GUILD_SAMEMAP_WOS:
- if (bl->type == BL_PC) {
- sd = (struct map_session_data *)bl;
- if (sd->status.guild_id > 0)
- g = guild_search(sd->status.guild_id);
- }
- if (g) {
- for(i = 0; i < g->max_member; i++) {
- if ((sd = g->member[i].sd) != NULL) {
- if (sd->bl.id == bl->id && (type == GUILD_WOS ||
- type == GUILD_SAMEMAP_WOS || type == GUILD_AREA_WOS))
- continue;
- if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
- continue;
- if ((type == GUILD_AREA || type == GUILD_AREA_WOS) &&
- (sd->bl.x < x0 || sd->bl.y < y0 ||
- sd->bl.x > x1 || sd->bl.y > y1))
- continue;
- if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
- memcpy(WFIFOP(sd->fd,0), buf, len);
- WFIFOSET(sd->fd,len);
- }
- }
- }
- }
- break;
-/* End [Valaris] */
-
- default:
- if (battle_config.error_log)
- printf("clif_send ‚Ü‚¾ì‚Á‚Ä‚È‚¢‚æ[\n");
- return -1;
- }
-
- return 0;
-}
-
-//
-// ƒpƒPƒbƒgì‚Á‚Ä‘—M
-//
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_authok(struct map_session_data *sd) {
- int fd;
-
- nullpo_retr(0, sd);
-
- if (!sd)
- return 0;
-
- if (!sd->fd)
- return 0;
-
- fd = sd->fd;
-
- WFIFOW(fd, 0) = 0x73;
- WFIFOL(fd, 2) = gettick();
- WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y);
- WFIFOB(fd, 9) = 5;
- WFIFOB(fd,10) = 5;
- WFIFOSET(fd,packet_len_table[0x73]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_authfail_fd(int fd, int type) {
- if (!fd || !session[fd])
- return 0;
-
- WFIFOW(fd,0) = 0x81;
- WFIFOL(fd,2) = type;
- WFIFOSET(fd,packet_len_table[0x81]);
-
- clif_setwaitclose(fd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_charselectok(int id) {
- struct map_session_data *sd;
- int fd;
-
- if ((sd = map_id2sd(id)) == NULL)
- return 1;
-
- if (!sd->fd)
- return 1;
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0xb3;
- WFIFOB(fd,2) = 1;
- WFIFOSET(fd,packet_len_table[0xb3]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf) {
- int view;
-
- nullpo_retr(0, fitem);
-
- //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
- WBUFW(buf, 0) = 0x9e;
- WBUFL(buf, 2) = fitem->bl.id;
- if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
- WBUFW(buf, 6) = view;
- else
- WBUFW(buf, 6) = fitem->item_data.nameid;
- WBUFB(buf, 8) = fitem->item_data.identify;
- WBUFW(buf, 9) = fitem->bl.x;
- WBUFW(buf,11) = fitem->bl.y;
- WBUFB(buf,13) = fitem->subx;
- WBUFB(buf,14) = fitem->suby;
- WBUFW(buf,15) = fitem->item_data.amount;
-
- return packet_len_table[0x9e];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_dropflooritem(struct flooritem_data *fitem) {
- char buf[64];
-
- nullpo_retr(0, fitem);
-
- if (fitem->item_data.nameid <= 0)
- return 0;
- clif_set009e(fitem, buf);
- clif_send(buf, packet_len_table[0x9e], &fitem->bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearflooritem(struct flooritem_data *fitem, int fd) {
- unsigned char buf[16];
-
- nullpo_retr(0, fitem);
-
- WBUFW(buf,0) = 0xa1;
- WBUFL(buf,2) = fitem->bl.id;
-
- if (fd == 0) {
- clif_send(buf, packet_len_table[0xa1], &fitem->bl, AREA);
- } else {
- memcpy(WFIFOP(fd,0), buf, 6);
- WFIFOSET(fd,packet_len_table[0xa1]);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchar(struct block_list *bl, int type) {
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x80;
- WBUFL(buf,2) = bl->id;
- if (type == 9) {
- WBUFB(buf,6) = 0;
- clif_send(buf, packet_len_table[0x80], bl, AREA);
- } else {
- WBUFB(buf,6) = type;
- clif_send(buf, packet_len_table[0x80], bl, type == 1 ? AREA : AREA_WOS);
- }
-
- return 0;
-}
-
-static int clif_clearchar_delay_sub(int tid, unsigned int tick, int id, int data) {
- struct block_list *bl = (struct block_list *)id;
-
- clif_clearchar(bl,data);
- map_freeblock(bl);
-
- return 0;
-}
-
-int clif_clearchar_delay(unsigned int tick, struct block_list *bl, int type) {
- struct block_list *tmpbl;
-
- tmpbl = (struct block_list*)aCalloc(1, sizeof(struct block_list));
-
- memcpy(tmpbl, bl, sizeof(struct block_list));
- add_timer(tick, clif_clearchar_delay_sub, (int)tmpbl, type);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchar_id(int id, int type, int fd) {
- unsigned char buf[16];
-
- WBUFW(buf,0) = 0x80;
- WBUFL(buf,2) = id;
- WBUFB(buf,6) = type;
- memcpy(WFIFOP(fd,0), buf, 7);
- WFIFOSET(fd, packet_len_table[0x80]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set0078(struct map_session_data *sd, unsigned char *buf) {
- int level;
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
-
- WBUFW(buf,0) = 0x78;
- WBUFL(buf,2) = sd->bl.id;
- WBUFW(buf,6) = battle_get_speed(&sd->bl);
- WBUFW(buf,8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,14) = sd->disguise;
- WBUFW(buf,42) = 0;
- WBUFB(buf,44) = 0;
- WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
- WBUFB(buf,48) |= sd->dir & 0x0f;
- WBUFB(buf,49) = 5;
- WBUFB(buf,50) = 5;
- WBUFB(buf,51) = 0;
- WBUFW(buf,52) = ((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x78];
- }
-
-#if PACKETVER < 4
- WBUFW(buf,0)= 0x78;
- WBUFL(buf,2)= sd->bl.id;
- WBUFW(buf,6)= sd->speed;
- WBUFW(buf,8)= sd->opt1;
- WBUFW(buf,10)= sd->opt2;
- WBUFW(buf,12)= sd->status.option;
- WBUFW(buf,14)= sd->view_class;
- WBUFW(buf,16)= sd->status.hair;
- if (sd->view_class != 22)
- WBUFW(buf,18) = sd->status.weapon;
- else
- WBUFW(buf,18)=0;
- WBUFW(buf,20)=sd->status.head_bottom;
- WBUFW(buf,22)=sd->status.shield;
- WBUFW(buf,24)=sd->status.head_top;
- WBUFW(buf,26)=sd->status.head_mid;
- WBUFW(buf,28)=sd->status.hair_color;
- WBUFW(buf,30)=sd->status.clothes_color;
- WBUFW(buf,32)=sd->head_dir;
- WBUFL(buf,34)=sd->status.guild_id;
- WBUFL(buf,38)=sd->guild_emblem_id;
- WBUFW(buf,42)=sd->status.manner;
- WBUFB(buf,44)=sd->status.karma;
- WBUFB(buf,45)=sd->sex;
- WBUFPOS(buf,46,sd->bl.x,sd->bl.y);
- WBUFB(buf,48)|=sd->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
- WBUFB(buf,51)=sd->state.dead_sit;
- WBUFW(buf,52)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x78];
-#else
- WBUFW(buf,0) = 0x1d8;
- WBUFL(buf,2) = sd->bl.id;
- WBUFW(buf,6) = sd->speed;
- WBUFW(buf,8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,14) = sd->view_class;
- WBUFW(buf,16) = sd->status.hair;
- if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,18) = sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,18) = sd->status.inventory[sd->equip_index[9]].nameid;
- } else
- WBUFW(buf,18) = 0;
- if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
- if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,20) = sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,20) = sd->status.inventory[sd->equip_index[8]].nameid;
- } else
- WBUFW(buf,20) = 0;
- WBUFW(buf,22) = sd->status.head_bottom;
- WBUFW(buf,24) = sd->status.head_top;
- WBUFW(buf,26) = sd->status.head_mid;
- WBUFW(buf,28) = sd->status.hair_color;
- WBUFW(buf,30) = sd->status.clothes_color;
- WBUFW(buf,32) = sd->head_dir;
- WBUFL(buf,34) = sd->status.guild_id;
- WBUFW(buf,38) = sd->guild_emblem_id;
- WBUFW(buf,40) = sd->status.manner;
- WBUFW(buf,42)=sd->opt3;
- WBUFB(buf,44) = sd->status.karma;
- WBUFB(buf,45) = sd->sex;
- WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
- WBUFB(buf,48) |= sd->dir & 0x0f;
- WBUFB(buf,49) = 5;
- WBUFB(buf,50) = 5;
- WBUFB(buf,51) = sd->state.dead_sit;
- WBUFW(buf,52) = ((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
-
- return packet_len_table[0x1d8];
-#endif
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set007b(struct map_session_data *sd,unsigned char *buf) {
- int level;
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=battle_get_speed(&sd->bl);
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->disguise;
- WBUFL(buf,22)=gettick();
- WBUFW(buf,46)=0;
- WBUFB(buf,48)=0;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=((level = battle_get_lv(&sd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
- }
-
-#if PACKETVER < 4
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->speed;
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->view_class;
- WBUFW(buf,16)=sd->status.hair;
- if(sd->view_class != 22)
- WBUFW(buf,18)=sd->status.weapon;
- else
- WBUFW(buf,18)=0;
- WBUFW(buf,20)=sd->status.head_bottom;
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=sd->status.shield;
- WBUFW(buf,28)=sd->status.head_top;
- WBUFW(buf,30)=sd->status.head_mid;
- WBUFW(buf,32)=sd->status.hair_color;
- WBUFW(buf,34)=sd->status.clothes_color;
- WBUFW(buf,36)=sd->head_dir;
- WBUFL(buf,38)=sd->status.guild_id;
- WBUFL(buf,42)=sd->guild_emblem_id;
- WBUFW(buf,46)=sd->status.manner;
- WBUFB(buf,48)=sd->status.karma;
- WBUFB(buf,49)=sd->sex;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x7b];
-#else
- WBUFW(buf,0)=0x1da;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->speed;
- WBUFW(buf,8)=sd->opt1;
- WBUFW(buf,10)=sd->opt2;
- WBUFW(buf,12)=sd->status.option;
- WBUFW(buf,14)=sd->view_class;
- WBUFW(buf,16)=sd->status.hair;
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,18)=sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,18)=sd->status.inventory[sd->equip_index[9]].nameid;
- }
- else
- WBUFW(buf,18)=0;
- if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,20)=sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,20)=sd->status.inventory[sd->equip_index[8]].nameid;
- }
- else
- WBUFW(buf,20)=0;
- WBUFW(buf,22)=sd->status.head_bottom;
- WBUFL(buf,24)=gettick();
- WBUFW(buf,28)=sd->status.head_top;
- WBUFW(buf,30)=sd->status.head_mid;
- WBUFW(buf,32)=sd->status.hair_color;
- WBUFW(buf,34)=sd->status.clothes_color;
- WBUFW(buf,36)=sd->head_dir;
- WBUFL(buf,38)=sd->status.guild_id;
- WBUFW(buf,42)=sd->guild_emblem_id;
- WBUFW(buf,44)=sd->status.manner;
- WBUFW(buf,46)=sd->opt3;
- WBUFB(buf,48)=sd->status.karma;
- WBUFB(buf,49)=sd->sex;
- WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WBUFB(buf,55)=0;
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
-
- return packet_len_table[0x1da];
-#endif
-}
-
-/*==========================================
- * ƒNƒ‰ƒXƒ`ƒFƒ“ƒW type‚ÍMob‚ÌꇂÍ1‚Å‘¼‚Í0H
- *------------------------------------------
- */
-int clif_class_change(struct block_list *bl,int class,int type)
-{
- char buf[16];
-
- nullpo_retr(0, bl);
-
- if(class >= MAX_PC_CLASS) {
- WBUFW(buf,0)=0x1b0;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFL(buf,7)=class;
-
- clif_send(buf,packet_len_table[0x1b0],bl,AREA);
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_mob_class_change(struct mob_data *md, int class) {
- char buf[16];
- int view = mob_get_viewclass(class);
-
- nullpo_retr(0, md);
-
- if(view >= MAX_PC_CLASS) {
- WBUFW(buf,0)=0x1b0;
- WBUFL(buf,2)=md->bl.id;
- WBUFB(buf,6)=1;
- WBUFL(buf,7)=view;
-
- clif_send(buf,packet_len_table[0x1b0],&md->bl,AREA);
- }
- return 0;
-}
-// mob equipment [Valaris]
-
-int clif_mob_equip(struct mob_data *md, int nameid) {
- unsigned char buf[16];
-
- nullpo_retr(0, md);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=3;
- WBUFL(buf,3)=md->bl.id;
- WBUFL(buf,7)=nameid;
-
- clif_send(buf,packet_len_table[0x1a4],&md->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- * MOB•\Ž¦1
- *------------------------------------------
- */
-static int clif_mob0078(struct mob_data *md, unsigned char *buf)
-{
- int level;
-
- memset(buf,0,packet_len_table[0x78]);
-
- nullpo_retr(0, md);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=battle_get_speed(&md->bl);
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,14)=mob_get_viewclass(md->class);
- if((mob_get_viewclass(md->class) <= 23) || (mob_get_viewclass(md->class) == 812) || (mob_get_viewclass(md->class) >= 4001)) {
- WBUFW(buf,12)|=mob_db[md->class].option;
- WBUFW(buf,16)=mob_get_hair(md->class);
- WBUFW(buf,18)=mob_get_weapon(md->class);
- WBUFW(buf,20)=mob_get_head_buttom(md->class);
- WBUFW(buf,22)=mob_get_shield(md->class);
- WBUFW(buf,24)=mob_get_head_top(md->class);
- WBUFW(buf,26)=mob_get_head_mid(md->class);
- WBUFW(buf,28)=mob_get_hair_color(md->class);
- WBUFW(buf,30)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris
- WBUFB(buf,45)=mob_get_sex(md->class);
- }
-
- if (md->class >= 1285 && md->class <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if (gc && gc->guild_id > 0) {
- g=guild_search(gc->guild_id);
- if (g) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=gc->guild_id;
- }
- }
- } // End addition
-
- WBUFPOS(buf,46,md->bl.x,md->bl.y);
- WBUFB(buf,48)|=md->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
- WBUFW(buf,52)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x78];
-}
-
-/*==========================================
- * MOB•\Ž¦2
- *------------------------------------------
- */
-static int clif_mob007b(struct mob_data *md, unsigned char *buf) {
- int level;
-
- memset(buf,0,packet_len_table[0x7b]);
-
- nullpo_retr(0, md);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=battle_get_speed(&md->bl);
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,14)=mob_get_viewclass(md->class);
- if ((mob_get_viewclass(md->class) < 24) || (mob_get_viewclass(md->class) > 4000)) {
- WBUFW(buf,12)|=mob_db[md->class].option;
- WBUFW(buf,16)=mob_get_hair(md->class);
- WBUFW(buf,18)=mob_get_weapon(md->class);
- WBUFW(buf,20)=mob_get_head_buttom(md->class);
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=mob_get_shield(md->class);
- WBUFW(buf,28)=mob_get_head_top(md->class);
- WBUFW(buf,30)=mob_get_head_mid(md->class);
- WBUFW(buf,32)=mob_get_hair_color(md->class);
- WBUFW(buf,34)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris
- WBUFB(buf,49)=mob_get_sex(md->class);
- } else
- WBUFL(buf,22)=gettick();
-
- if(md->class >= 1285 && md->class <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
- struct guild *g;
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc && gc->guild_id > 0){
- g=guild_search(gc->guild_id);
- if(g) {
- WBUFL(buf,28)=gc->guild_id;
- WBUFL(buf,24)=g->emblem_id;
- }
- }
- } // End addition
-
- WBUFPOS2(buf,50,md->bl.x,md->bl.y,md->to_x,md->to_y);
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
- WBUFW(buf,58)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_npc0078(struct npc_data *nd, unsigned char *buf) {
- struct guild *g;
-
- nullpo_retr(0, nd);
-
- memset(buf,0,packet_len_table[0x78]);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,14)=nd->class;
- if ((nd->class == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=g->guild_id;
- }
- WBUFPOS(buf,46,nd->bl.x,nd->bl.y);
- WBUFB(buf,48)|=nd->dir&0x0f;
- WBUFB(buf,49)=5;
- WBUFB(buf,50)=5;
-
- return packet_len_table[0x78];
-}
-
-// NPC Walking [Valaris]
-static int clif_npc007b(struct npc_data *nd, unsigned char *buf) {
- struct guild *g;
-
- nullpo_retr(0, nd);
-
- memset(buf,0,packet_len_table[0x7b]);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,14)=nd->class;
- if ((nd->class == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
- WBUFL(buf,22)=g->emblem_id;
- WBUFL(buf,26)=g->guild_id;
- }
-
- WBUFL(buf,22)=gettick();
- WBUFPOS2(buf,50,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y);
- WBUFB(buf,56)=5;
- WBUFB(buf,57)=5;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_pet0078(struct pet_data *pd, unsigned char *buf) {
- int view,level;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x78]);
-
- WBUFW(buf,0)=0x78;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,14)=mob_get_viewclass(pd->class);
- if((mob_get_viewclass(pd->class) < 24) || (mob_get_viewclass(pd->class) > 4000)) {
- WBUFW(buf,12)=mob_db[pd->class].option;
- WBUFW(buf,16)=mob_get_hair(pd->class);
- WBUFW(buf,18)=mob_get_weapon(pd->class);
- WBUFW(buf,20)=mob_get_head_buttom(pd->class);
- WBUFW(buf,22)=mob_get_shield(pd->class);
- WBUFW(buf,24)=mob_get_head_top(pd->class);
- WBUFW(buf,26)=mob_get_head_mid(pd->class);
- WBUFW(buf,28)=mob_get_hair_color(pd->class);
- WBUFW(buf,30)=mob_get_clothes_color(pd->class); //Add for player pet dye - Valaris
- WBUFB(buf,45)=mob_get_sex(pd->class);
- } else {
- WBUFW(buf,16)=0x14;
- if((view = itemdb_viewid(pd->equip)) > 0)
- WBUFW(buf,20)=view;
- else
- WBUFW(buf,20)=pd->equip;
- }
- WBUFPOS(buf,46,pd->bl.x,pd->bl.y);
- WBUFB(buf,48)|=pd->dir&0x0f;
- WBUFB(buf,49)=0;
- WBUFB(buf,50)=0;
- WBUFW(buf,52)=((level = battle_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x78];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_pet007b(struct pet_data *pd, unsigned char *buf) {
- int view,level;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x7b]);
-
- WBUFW(buf,0)=0x7b;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,14)=mob_get_viewclass(pd->class);
- if((mob_get_viewclass(pd->class) < 24) || (mob_get_viewclass(pd->class) > 4000)) {
- WBUFW(buf,12)=mob_db[pd->class].option;
- WBUFW(buf,16)=mob_get_hair(pd->class);
- WBUFW(buf,18)=mob_get_weapon(pd->class);
- WBUFW(buf,20)=mob_get_head_buttom(pd->class);
- WBUFL(buf,22)=gettick();
- WBUFW(buf,26)=mob_get_shield(pd->class);
- WBUFW(buf,28)=mob_get_head_top(pd->class);
- WBUFW(buf,30)=mob_get_head_mid(pd->class);
- WBUFW(buf,32)=mob_get_hair_color(pd->class);
- WBUFW(buf,34)=mob_get_clothes_color(pd->class); //Add for player pet dye - Valaris
- WBUFB(buf,49)=mob_get_sex(pd->class);
- } else {
- WBUFW(buf,16)=0x14;
- if ((view = itemdb_viewid(pd->equip)) > 0)
- WBUFW(buf,20)=view;
- else
- WBUFW(buf,20)=pd->equip;
- WBUFL(buf,22)=gettick();
- }
- WBUFPOS2(buf,50,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y);
- WBUFB(buf,56)=0;
- WBUFB(buf,57)=0;
- WBUFW(buf,58)=((level = battle_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
-
- return packet_len_table[0x7b];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set01e1(struct map_session_data *sd, unsigned char *buf) {
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1e1;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->spiritball;
-
- return packet_len_table[0x1e1];
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_set0192(int fd, int m, int x, int y, int type) {
- WFIFOW(fd,0) = 0x192;
- WFIFOW(fd,2) = x;
- WFIFOW(fd,4) = y;
- WFIFOW(fd,6) = type;
- memcpy(WFIFOP(fd,8),map[m].name,16);
- WFIFOSET(fd,packet_len_table[0x192]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnpc(struct map_session_data *sd) {
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
- clif_clearchar(&sd->bl, 9);
-
- memset(buf, 0, packet_len_table[0x119]);
-
- WBUFW(buf, 0) = 0x119;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFW(buf, 6) = 0;
- WBUFW(buf, 8) = 0;
- WBUFW(buf,10) = 0x40;
- WBUFB(buf,12) = 0;
-
- clif_send(buf, packet_len_table[0x119], &sd->bl, SELF);
-
- memset(buf, 0, packet_len_table[0x7c]);
-
- WBUFW(buf, 0) = 0x7c;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFW(buf, 6) = sd->speed;
- WBUFW(buf, 8) = sd->opt1;
- WBUFW(buf,10) = sd->opt2;
- WBUFW(buf,12) = sd->status.option;
- WBUFW(buf,20) = sd->disguise;
- WBUFPOS(buf, 36, sd->bl.x, sd->bl.y);
- clif_send(buf, packet_len_table[0x7c], &sd->bl, AREA);
- }
-
- clif_set0078(sd, buf);
-
-#if PACKETVER < 4
- WBUFW(buf, 0) = 0x79;
- WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
- clif_send(buf, packet_len_table[0x79], &sd->bl, AREA_WOS);
-#else
- WBUFW(buf, 0) = 0x1d9;
- WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
- clif_send(buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS);
-#endif
-
-
- if (sd->spiritball > 0)
- clif_spiritball(sd);
-
- if (sd->status.guild_id > 0) { // force display of guild emblem [Valaris]
- struct guild *g = guild_search(sd->status.guild_id);
- if (g)
- clif_guild_emblem(sd,g);
- } // end addition [Valaris]
-
- if (sd->status.class==13 || sd->status.class==21 || sd->status.class==4014 || sd->status.class==4022)
- pc_setoption(sd,sd->status.option|0x0020); // [Valaris]
-
- if ((pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0) && (sd->status.class==7 ||
- sd->status.class==14 || sd->status.class==4008 || sd->status.class==4015))
- pc_setriding(sd); // update peco riders for people upgrading athena [Valaris]
-
-
- if (map[sd->bl.m].flag.snow)
- clif_specialeffect(&sd->bl, 162, 1);
- if (map[sd->bl.m].flag.fog)
- clif_specialeffect(&sd->bl, 233, 1);
- if (map[sd->bl.m].flag.sakura)
- clif_specialeffect(&sd->bl, 163, 1);
- if (map[sd->bl.m].flag.leaves)
- clif_specialeffect(&sd->bl, 333, 1);
- if (map[sd->bl.m].flag.rain)
- clif_specialeffect(&sd->bl, 161, 1);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnnpc(struct npc_data *nd)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, nd);
-
- if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS)
- return 0;
-
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=nd->bl.id;
- WBUFW(buf,6)=nd->speed;
- WBUFW(buf,20)=nd->class;
- WBUFPOS(buf,36,nd->bl.x,nd->bl.y);
-
- clif_send(buf,packet_len_table[0x7c],&nd->bl,AREA);
-
- len = clif_npc0078(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnmob(struct mob_data *md)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, md);
-
- if (mob_get_viewclass(md->class) > 23 ) {
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=md->bl.id;
- WBUFW(buf,6)=md->speed;
- WBUFW(buf,8)=md->opt1;
- WBUFW(buf,10)=md->opt2;
- WBUFW(buf,12)=md->option;
- WBUFW(buf,20)=mob_get_viewclass(md->class);
- WBUFPOS(buf,36,md->bl.x,md->bl.y);
- clif_send(buf,packet_len_table[0x7c],&md->bl,AREA);
- }
-
- len = clif_mob0078(md,buf);
- clif_send(buf,len,&md->bl,AREA);
-
- if (mob_get_equip(md->class) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class));
-
- return 0;
-}
-
-// pet
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_spawnpet(struct pet_data *pd)
-{
- unsigned char buf[64];
- int len;
-
- nullpo_retr(0, pd);
-
- if (mob_get_viewclass(pd->class) >= MAX_PC_CLASS) {
- memset(buf,0,packet_len_table[0x7c]);
-
- WBUFW(buf,0)=0x7c;
- WBUFL(buf,2)=pd->bl.id;
- WBUFW(buf,6)=pd->speed;
- WBUFW(buf,20)=mob_get_viewclass(pd->class);
- WBUFPOS(buf,36,pd->bl.x,pd->bl.y);
-
- clif_send(buf,packet_len_table[0x7c],&pd->bl,AREA);
- }
-
- len = clif_pet0078(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_movepet(struct pet_data *pd) {
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, pd);
-
- len = clif_pet007b(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- * npc walking [Valaris]
- *------------------------------------------
- */
-int clif_movenpc(struct npc_data *nd) {
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, nd);
-
- len = clif_npc007b(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_servertick(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x7f;
- WFIFOL(fd,2)=sd->server_tick;
- WFIFOSET(fd,packet_len_table[0x7f]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_walkok(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x87;
- WFIFOL(fd,2)=gettick();;
- WFIFOPOS2(fd,6,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
- WFIFOB(fd,11)=0;
- WFIFOSET(fd,packet_len_table[0x87]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_movechar(struct map_session_data *sd) {
- int fd;
- int len;
- unsigned char buf[256];
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
-
- len = clif_set007b(sd, buf);
-
- if (sd->disguise > 23 && sd->disguise < 4001) {
- clif_send(buf, len, &sd->bl, AREA);
- return 0;
- } else
- clif_send(buf, len, &sd->bl, AREA_WOS);
-
- if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0)
- clif_changelook(&sd->bl, LOOK_CLOTHES_COLOR, sd->status.clothes_color);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_quitsave(int fd,struct map_session_data *sd)
-{
- map_quit(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int clif_waitclose(int tid, unsigned int tick, int id, int data) {
- if (session[id])
- session[id]->eof = 1;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_setwaitclose(int fd) {
- struct map_session_data *sd;
-
- // if player is not already in the game (double connection probably)
- if ((sd = session[fd]->session_data) == NULL) {
- // limited timer, just to send information.
- add_timer(gettick() + 1000, clif_waitclose, fd, 0);
- } else
- add_timer(gettick() + 5000, clif_waitclose, fd, 0);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemap(struct map_session_data *sd, char *mapname, int x, int y) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
-
- WFIFOW(fd,0) = 0x91;
- memcpy(WFIFOP(fd,2), mapname, 16);
- WFIFOW(fd,18) = x;
- WFIFOW(fd,20) = y;
- WFIFOSET(fd, packet_len_table[0x91]);
-
- if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_spawnpc(sd);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemapserver(struct map_session_data *sd, char *mapname, int x, int y, int ip, int port) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0x92;
- memcpy(WFIFOP(fd,2), mapname, 16);
- WFIFOW(fd,18) = x;
- WFIFOW(fd,20) = y;
- WFIFOL(fd,22) = ip;
- WFIFOW(fd,26) = port;
- WFIFOSET(fd, packet_len_table[0x92]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_fixpos(struct block_list *bl) {
- char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x88;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=bl->x;
- WBUFW(buf,8)=bl->y;
-
- clif_send(buf, packet_len_table[0x88], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_npcbuysell(struct map_session_data* sd, int id) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc4;
- WFIFOL(fd,2)=id;
- WFIFOSET(fd,packet_len_table[0xc4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_buylist(struct map_session_data *sd, struct npc_data *nd) {
- struct item_data *id;
- int fd,i,val;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, nd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc6;
- for(i=0;nd->u.shop_item[i].nameid > 0;i++){
- id = itemdb_search(nd->u.shop_item[i].nameid);
- val=nd->u.shop_item[i].value;
- WFIFOL(fd,4+i*11)=val;
- if (!id->flag.value_notdc)
- val=pc_modifybuyvalue(sd,val);
- WFIFOL(fd,8+i*11)=val;
- WFIFOB(fd,12+i*11)=id->type;
- if (id->view_id > 0)
- WFIFOW(fd,13+i*11)=id->view_id;
- else
- WFIFOW(fd,13+i*11)=nd->u.shop_item[i].nameid;
- }
- WFIFOW(fd,2)=i*11+4;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_selllist(struct map_session_data *sd) {
- int fd,i,c=0,val;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xc7;
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) {
- val=sd->inventory_data[i]->value_sell;
- if (val < 0)
- continue;
- WFIFOW(fd,4+c*10)=i+2;
- WFIFOL(fd,6+c*10)=val;
- if (!sd->inventory_data[i]->flag.value_notoc)
- val=pc_modifysellvalue(sd,val);
- WFIFOL(fd,10+c*10)=val;
- c++;
- }
- }
- WFIFOW(fd,2)=c*10+4;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptmes(struct map_session_data *sd, int npcid, char *mes) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb4;
- WFIFOW(fd,2)=strlen(mes)+9;
- WFIFOL(fd,4)=npcid;
- strcpy(WFIFOP(fd,8),mes);
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptnext(struct map_session_data *sd,int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb5;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0xb5]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptclose(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb6;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0xb6]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xb7;
- WFIFOW(fd,2)=strlen(mes)+8;
- WFIFOL(fd,4)=npcid;
- strcpy(WFIFOP(fd,8),mes);
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptinput(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x142;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0x142]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_scriptinputstr(struct map_session_data *sd, int npcid) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1d4;
- WFIFOL(fd,2)=npcid;
- WFIFOSET(fd,packet_len_table[0x1d4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x144;
- WFIFOL(fd,2)=npc_id;
- WFIFOL(fd,6)=type;
- WFIFOL(fd,10)=x;
- WFIFOL(fd,14)=y;
- WFIFOB(fd,18)=id;
- WFIFOL(fd,19)=color;
- WFIFOSET(fd,packet_len_table[0x144]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_cutin(struct map_session_data *sd, char *image, int type) {
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1b3;
- memcpy(WFIFOP(fd,2),image,64);
- WFIFOB(fd,66)=type;
- WFIFOSET(fd,packet_len_table[0x1b3]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_additem(struct map_session_data *sd, int n, int amount, int fail) {
- int fd,j;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
- if(fail) {
- WBUFW(buf,0)=0xa0;
- WBUFW(buf,2)=n+2;
- WBUFW(buf,4)=amount;
- WBUFW(buf,6)=0;
- WBUFB(buf,8)=0;
- WBUFB(buf,9)=0;
- WBUFB(buf,10)=0;
- WBUFW(buf,11)=0;
- WBUFW(buf,13)=0;
- WBUFW(buf,15)=0;
- WBUFW(buf,17)=0;
- WBUFW(buf,19)=0;
- WBUFB(buf,21)=0;
- WBUFB(buf,22)=fail;
- } else {
- if (n<0 || n>=MAX_INVENTORY || sd->status.inventory[n].nameid <=0 || sd->inventory_data[n] == NULL)
- return 1;
-
- WBUFW(buf,0)=0xa0;
- WBUFW(buf,2)=n+2;
- WBUFW(buf,4)=amount;
- if (sd->inventory_data[n]->view_id > 0)
- WBUFW(buf,6)=sd->inventory_data[n]->view_id;
- else
- WBUFW(buf,6)=sd->status.inventory[n].nameid;
- WBUFB(buf,8)=sd->status.inventory[n].identify;
- WBUFB(buf,9)=sd->status.inventory[n].attribute;
- WBUFB(buf,10)=sd->status.inventory[n].refine;
- if(sd->status.inventory[n].card[0]==0x00ff || sd->status.inventory[n].card[0]==0x00fe || sd->status.inventory[n].card[0]==(short)0xff00) {
- WBUFW(buf,11)=sd->status.inventory[n].card[0];
- WBUFW(buf,13)=sd->status.inventory[n].card[1];
- WBUFW(buf,15)=sd->status.inventory[n].card[2];
- WBUFW(buf,17)=sd->status.inventory[n].card[3];
- } else {
- if (sd->status.inventory[n].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[0])) > 0)
- WBUFW(buf,11)=j;
- else
- WBUFW(buf,11)=sd->status.inventory[n].card[0];
- if (sd->status.inventory[n].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[1])) > 0)
- WBUFW(buf,13)=j;
- else
- WBUFW(buf,13)=sd->status.inventory[n].card[1];
- if (sd->status.inventory[n].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[2])) > 0)
- WBUFW(buf,15)=j;
- else
- WBUFW(buf,15)=sd->status.inventory[n].card[2];
- if (sd->status.inventory[n].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[3])) > 0)
- WBUFW(buf,17)=j;
- else
- WBUFW(buf,17)=sd->status.inventory[n].card[3];
- }
- WBUFW(buf,19)=pc_equippoint(sd,n);
- WBUFB(buf,21)=(sd->inventory_data[n]->type == 7)? 4:sd->inventory_data[n]->type;
- WBUFB(buf,22)=fail;
- }
-
- WFIFOSET(fd,packet_len_table[0xa0]);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_delitem(struct map_session_data *sd,int n,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xaf;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=amount;
-
- WFIFOSET(fd,packet_len_table[0xaf]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_itemlist(struct map_session_data *sd)
-{
- int i,n,fd,arrow=-1;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa3;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if (sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*10+4)=i+2;
- if (sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*10+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*10+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*10+8)=sd->inventory_data[i]->type;
- WBUFB(buf,n*10+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*10+10)=sd->status.inventory[i].amount;
- if (sd->inventory_data[i]->equip == 0x8000) {
- WBUFW(buf,n*10+12)=0x8000;
- if (sd->status.inventory[i].equip)
- arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
- } else
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if (n) {
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1ee;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*18+4)=i+2;
- if(sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*18+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*18+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*18+8)=sd->inventory_data[i]->type;
- WBUFB(buf,n*18+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*18+10)=sd->status.inventory[i].amount;
- if (sd->inventory_data[i]->equip == 0x8000) {
- WBUFW(buf,n*18+12)=0x8000;
- if(sd->status.inventory[i].equip)
- arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
- } else
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=sd->status.inventory[i].card[0];
- WBUFW(buf,n*18+16)=sd->status.inventory[i].card[1];
- WBUFW(buf,n*18+18)=sd->status.inventory[i].card[2];
- WBUFW(buf,n*18+20)=sd->status.inventory[i].card[3];
- n++;
- }
- if (n) {
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- if(arrow >= 0)
- clif_arrowequip(sd,arrow);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_equiplist(struct map_session_data *sd)
-{
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0xa4;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || !itemdb_isequip2(sd->inventory_data[i]))
- continue;
- WBUFW(buf,n*20+4)=i+2;
- if(sd->inventory_data[i]->view_id > 0)
- WBUFW(buf,n*20+6)=sd->inventory_data[i]->view_id;
- else
- WBUFW(buf,n*20+6)=sd->status.inventory[i].nameid;
- WBUFB(buf,n*20+8)=(sd->inventory_data[i]->type == 7)? 4:sd->inventory_data[i]->type;
- WBUFB(buf,n*20+9)=sd->status.inventory[i].identify;
- WBUFW(buf,n*20+10)=pc_equippoint(sd,i);
- WBUFW(buf,n*20+12)=sd->status.inventory[i].equip;
- WBUFB(buf,n*20+14)=sd->status.inventory[i].attribute;
- WBUFB(buf,n*20+15)=sd->status.inventory[i].refine;
- if(sd->status.inventory[i].card[0]==0x00ff || sd->status.inventory[i].card[0]==0x00fe || sd->status.inventory[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
- WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
- WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
- WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
- } else {
- if(sd->status.inventory[i].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
- if(sd->status.inventory[i].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
- if(sd->status.inventory[i].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
- if(sd->status.inventory[i].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
- *------------------------------------------
- */
-int clif_storageitemlist(struct map_session_data *sd,struct storage *stor)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa5;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*10+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=stor->storage[i].nameid;
- WBUFB(buf,n*10+8)=id->type;;
- WBUFB(buf,n*10+9)=stor->storage[i].identify;
- WBUFW(buf,n*10+10)=stor->storage[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1f0;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*18+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=stor->storage[i].nameid;
- WBUFB(buf,n*18+8)=id->type;;
- WBUFB(buf,n*18+9)=stor->storage[i].identify;
- WBUFW(buf,n*18+10)=stor->storage[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=stor->storage[i].card[0];
- WBUFW(buf,n*18+16)=stor->storage[i].card[1];
- WBUFW(buf,n*18+18)=stor->storage[i].card[2];
- WBUFW(buf,n*18+20)=stor->storage[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
- *------------------------------------------
- */
-int clif_storageequiplist(struct map_session_data *sd,struct storage *stor)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0xa6;
- for(i=0,n=0;i<MAX_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=stor->storage[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=stor->storage[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=stor->storage[i].equip;
- WBUFB(buf,n*20+14)=stor->storage[i].attribute;
- WBUFB(buf,n*20+15)=stor->storage[i].refine;
- if(stor->storage[i].card[0]==0x00ff || stor->storage[i].card[0]==0x00fe || stor->storage[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=stor->storage[i].card[0];
- WBUFW(buf,n*20+18)=stor->storage[i].card[1];
- WBUFW(buf,n*20+20)=stor->storage[i].card[2];
- WBUFW(buf,n*20+22)=stor->storage[i].card[3];
- } else {
- if(stor->storage[i].card[0] > 0 && (j=itemdb_viewid(stor->storage[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=stor->storage[i].card[0];
- if(stor->storage[i].card[1] > 0 && (j=itemdb_viewid(stor->storage[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=stor->storage[i].card[1];
- if(stor->storage[i].card[2] > 0 && (j=itemdb_viewid(stor->storage[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=stor->storage[i].card[2];
- if(stor->storage[i].card[3] > 0 && (j=itemdb_viewid(stor->storage[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=stor->storage[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
-#if PACKETVER < 5
- WBUFW(buf,0)=0xa5;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*10+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=stor->storage[i].nameid;
- WBUFB(buf,n*10+8)=id->type;;
- WBUFB(buf,n*10+9)=stor->storage[i].identify;
- WBUFW(buf,n*10+10)=stor->storage[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1f0;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(itemdb_isequip2(id))
- continue;
-
- WBUFW(buf,n*18+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=stor->storage[i].nameid;
- WBUFB(buf,n*18+8)=id->type;;
- WBUFB(buf,n*18+9)=stor->storage[i].identify;
- WBUFW(buf,n*18+10)=stor->storage[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=stor->storage[i].card[0];
- WBUFW(buf,n*18+16)=stor->storage[i].card[1];
- WBUFW(buf,n*18+18)=stor->storage[i].card[2];
- WBUFW(buf,n*18+20)=stor->storage[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
- WBUFW(buf,0)=0xa6;
- for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage[i].nameid<=0)
- continue;
- nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+1;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=stor->storage[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=stor->storage[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=stor->storage[i].equip;
- WBUFB(buf,n*20+14)=stor->storage[i].attribute;
- WBUFB(buf,n*20+15)=stor->storage[i].refine;
- if(stor->storage[i].card[0]==0x00ff || stor->storage[i].card[0]==0x00fe || stor->storage[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=stor->storage[i].card[0];
- WBUFW(buf,n*20+18)=stor->storage[i].card[1];
- WBUFW(buf,n*20+20)=stor->storage[i].card[2];
- WBUFW(buf,n*20+22)=stor->storage[i].card[3];
- } else {
- if(stor->storage[i].card[0] > 0 && (j=itemdb_viewid(stor->storage[i].card[0])) > 0)
- WBUFW(buf,n*20+16)=j;
- else
- WBUFW(buf,n*20+16)=stor->storage[i].card[0];
- if(stor->storage[i].card[1] > 0 && (j=itemdb_viewid(stor->storage[i].card[1])) > 0)
- WBUFW(buf,n*20+18)=j;
- else
- WBUFW(buf,n*20+18)=stor->storage[i].card[1];
- if(stor->storage[i].card[2] > 0 && (j=itemdb_viewid(stor->storage[i].card[2])) > 0)
- WBUFW(buf,n*20+20)=j;
- else
- WBUFW(buf,n*20+20)=stor->storage[i].card[2];
- if(stor->storage[i].card[3] > 0 && (j=itemdb_viewid(stor->storage[i].card[3])) > 0)
- WBUFW(buf,n*20+22)=j;
- else
- WBUFW(buf,n*20+22)=stor->storage[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒX‚ð‘—‚è‚‚¯‚é
- * •\Ž¦ê—p”Žš‚Í‚±‚Ì’†‚ÅŒvŽZ‚µ‚Ä‘—‚é
- *------------------------------------------
- */
-int clif_updatestatus(struct map_session_data *sd,int type)
-{
- int fd,len=8;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0xb0;
- WFIFOW(fd,2)=type;
- switch(type){
- // 00b0
- case SP_WEIGHT:
- pc_checkweighticon(sd);
- WFIFOW(fd,0)=0xb0;
- WFIFOW(fd,2)=type;
- WFIFOL(fd,4)=sd->weight;
- break;
- case SP_MAXWEIGHT:
- WFIFOL(fd,4)=sd->max_weight;
- break;
- case SP_SPEED:
- WFIFOL(fd,4)=sd->speed;
- break;
- case SP_BASELEVEL:
- WFIFOL(fd,4)=sd->status.base_level;
- break;
- case SP_JOBLEVEL:
- WFIFOL(fd,4)=sd->status.job_level;
- break;
- case SP_MANNER:
- WFIFOL(fd,4)=sd->status.manner;
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
- break;
- case SP_STATUSPOINT:
- WFIFOL(fd,4)=sd->status.status_point;
- break;
- case SP_SKILLPOINT:
- WFIFOL(fd,4)=sd->status.skill_point;
- break;
- case SP_HIT:
- WFIFOL(fd,4)=sd->hit;
- break;
- case SP_FLEE1:
- WFIFOL(fd,4)=sd->flee;
- break;
- case SP_FLEE2:
- WFIFOL(fd,4)=sd->flee2/10;
- break;
- case SP_MAXHP:
- WFIFOL(fd,4)=sd->status.max_hp;
- break;
- case SP_MAXSP:
- WFIFOL(fd,4)=sd->status.max_sp;
- break;
- case SP_HP:
- WFIFOL(fd,4)=sd->status.hp;
- break;
- case SP_SP:
- WFIFOL(fd,4)=sd->status.sp;
- break;
- case SP_ASPD:
- WFIFOL(fd,4)=sd->aspd;
- break;
- case SP_ATK1:
- WFIFOL(fd,4)=sd->base_atk+sd->watk;
- break;
- case SP_DEF1:
- WFIFOL(fd,4)=sd->def;
- break;
- case SP_MDEF1:
- WFIFOL(fd,4)=sd->mdef;
- break;
- case SP_ATK2:
- WFIFOL(fd,4)=sd->watk2;
- break;
- case SP_DEF2:
- WFIFOL(fd,4)=sd->def2;
- break;
- case SP_MDEF2:
- WFIFOL(fd,4)=sd->mdef2;
- break;
- case SP_CRITICAL:
- WFIFOL(fd,4)=sd->critical/10;
- break;
- case SP_MATK1:
- WFIFOL(fd,4)=sd->matk1;
- break;
- case SP_MATK2:
- WFIFOL(fd,4)=sd->matk2;
- break;
-
-
- case SP_ZENY:
- WFIFOW(fd,0)=0xb1;
- if(sd->status.zeny < 0)
- sd->status.zeny = 0;
- WFIFOL(fd,4)=sd->status.zeny;
- break;
- case SP_BASEEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=sd->status.base_exp;
- break;
- case SP_JOBEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=sd->status.job_exp;
- break;
- case SP_NEXTBASEEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=pc_nextbaseexp(sd);
- break;
- case SP_NEXTJOBEXP:
- WFIFOW(fd,0)=0xb1;
- WFIFOL(fd,4)=pc_nextjobexp(sd);
- break;
-
- // 00be I—¹
- case SP_USTR:
- case SP_UAGI:
- case SP_UVIT:
- case SP_UINT:
- case SP_UDEX:
- case SP_ULUK:
- WFIFOW(fd,0)=0xbe;
- WFIFOB(fd,4)=pc_need_status_point(sd,type-SP_USTR+SP_STR);
- len=5;
- break;
-
- // 013a I—¹
- case SP_ATTACKRANGE:
- WFIFOW(fd,0)=0x13a;
- WFIFOW(fd,2)=sd->attackrange;
- len=4;
- break;
-
- // 0141 I—¹
- case SP_STR:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.str;
- WFIFOL(fd,10)=sd->paramb[0] + sd->parame[0];
- len=14;
- break;
- case SP_AGI:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.agi;
- WFIFOL(fd,10)=sd->paramb[1] + sd->parame[1];
- len=14;
- break;
- case SP_VIT:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.vit;
- WFIFOL(fd,10)=sd->paramb[2] + sd->parame[2];
- len=14;
- break;
- case SP_INT:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.int_;
- WFIFOL(fd,10)=sd->paramb[3] + sd->parame[3];
- len=14;
- break;
- case SP_DEX:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.dex;
- WFIFOL(fd,10)=sd->paramb[4] + sd->parame[4];
- len=14;
- break;
- case SP_LUK:
- WFIFOW(fd,0)=0x141;
- WFIFOL(fd,2)=type;
- WFIFOL(fd,6)=sd->status.luk;
- WFIFOL(fd,10)=sd->paramb[5] + sd->parame[5];
- len=14;
- break;
-
- case SP_CARTINFO:
- WFIFOW(fd,0)=0x121;
- WFIFOW(fd,2)=sd->cart_num;
- WFIFOW(fd,4)=sd->cart_max_num;
- WFIFOL(fd,6)=sd->cart_weight;
- WFIFOL(fd,10)=sd->cart_max_weight;
- len=14;
- break;
-
- default:
- if(battle_config.error_log)
- printf("clif_updatestatus : make %d routine\n",type);
- return 1;
- }
- WFIFOSET(fd,len);
-
- return 0;
-}
-int clif_changestatus(struct block_list *bl,int type,int val)
-{
- unsigned char buf[12];
- struct map_session_data *sd = NULL;
-
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC)
- sd = (struct map_session_data *)bl;
-
-//printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val);
- if(sd){
- WBUFW(buf,0)=0x1ab;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=type;
- switch(type){
- case SP_MANNER:
- WBUFL(buf,8)=val;
- break;
- default:
- if(battle_config.error_log)
- printf("clif_changestatus : make %d routine\n",type);
- return 1;
- }
- clif_send(buf,packet_len_table[0x1ab],bl,AREA_WOS);
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changelook(struct block_list *bl,int type,int val)
-{
-
- unsigned char buf[32];
- struct map_session_data *sd = NULL;
-
- nullpo_retr(0, bl);
-
- if(bl->type == BL_PC)
- sd = (struct map_session_data *)bl;
-
- if(sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- return 0;
-
-#if PACKETVER < 4
- if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD) && sd->view_class == 22)
- val =0;
- WBUFW(buf,0)=0xc3;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFB(buf,7)=val;
- clif_send(buf,packet_len_table[0xc3],bl,AREA);
-#else
- if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD || type == LOOK_SHOES)) {
- WBUFW(buf,0)=0x1d7;
- WBUFL(buf,2)=bl->id;
- if(type == LOOK_SHOES) {
- WBUFB(buf,6)=9;
- if(sd->equip_index[2] >= 0 && sd->inventory_data[sd->equip_index[2]]) {
- if(sd->inventory_data[sd->equip_index[2]]->view_id > 0)
- WBUFW(buf,7)=sd->inventory_data[sd->equip_index[2]]->view_id;
- else
- WBUFW(buf,7)=sd->status.inventory[sd->equip_index[2]].nameid;
- } else
- WBUFW(buf,7)=0;
- WBUFW(buf,9)=0;
- }
- else {
- WBUFB(buf,6)=2;
- if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
- WBUFW(buf,7)=sd->inventory_data[sd->equip_index[9]]->view_id;
- else
- WBUFW(buf,7)=sd->status.inventory[sd->equip_index[9]].nameid;
- } else
- WBUFW(buf,7)=0;
- if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] &&
- sd->view_class != 22) {
- if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
- WBUFW(buf,9)=sd->inventory_data[sd->equip_index[8]]->view_id;
- else
- WBUFW(buf,9)=sd->status.inventory[sd->equip_index[8]].nameid;
- } else
- WBUFW(buf,9)=0;
- }
- clif_send(buf,packet_len_table[0x1d7],bl,AREA);
- }
- else if(sd && (type == LOOK_BASE) && (val > 255))
- {
- WBUFW(buf,0)=0x1d7;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFW(buf,7)=val;
- WBUFW(buf,9)=0;
- clif_send(buf,packet_len_table[0x1d7],bl,AREA);
- } else {
- WBUFW(buf,0)=0xc3;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- WBUFB(buf,7)=val;
- clif_send(buf,packet_len_table[0xc3],bl,AREA);
- }
-#endif
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_initialstatus(struct map_session_data *sd)
-{
- int fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
-
- WBUFW(buf,0)=0xbd;
- WBUFW(buf,2)=sd->status.status_point;
- WBUFB(buf,4)=(sd->status.str > 255)? 255:sd->status.str;
- WBUFB(buf,5)=pc_need_status_point(sd,SP_STR);
- WBUFB(buf,6)=(sd->status.agi > 255)? 255:sd->status.agi;
- WBUFB(buf,7)=pc_need_status_point(sd,SP_AGI);
- WBUFB(buf,8)=(sd->status.vit > 255)? 255:sd->status.vit;
- WBUFB(buf,9)=pc_need_status_point(sd,SP_VIT);
- WBUFB(buf,10)=(sd->status.int_ > 255)? 255:sd->status.int_;
- WBUFB(buf,11)=pc_need_status_point(sd,SP_INT);
- WBUFB(buf,12)=(sd->status.dex > 255)? 255:sd->status.dex;
- WBUFB(buf,13)=pc_need_status_point(sd,SP_DEX);
- WBUFB(buf,14)=(sd->status.luk > 255)? 255:sd->status.luk;
- WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK);
-
- WBUFW(buf,16) = sd->base_atk + sd->watk;
- WBUFW(buf,18) = sd->watk2; //atk bonus
- WBUFW(buf,20) = sd->matk1;
- WBUFW(buf,22) = sd->matk2;
- WBUFW(buf,24) = sd->def; // def
- WBUFW(buf,26) = sd->def2;
- WBUFW(buf,28) = sd->mdef; // mdef
- WBUFW(buf,30) = sd->mdef2;
- WBUFW(buf,32) = sd->hit;
- WBUFW(buf,34) = sd->flee;
- WBUFW(buf,36) = sd->flee2/10;
- WBUFW(buf,38) = sd->critical/10;
- WBUFW(buf,40) = sd->status.karma;
- WBUFW(buf,42) = sd->status.manner;
-
- WFIFOSET(fd,packet_len_table[0xbd]);
-
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
-
- clif_updatestatus(sd,SP_ATTACKRANGE);
- clif_updatestatus(sd,SP_ASPD);
-
- return 0;
-}
-
-/*==========================================
- *–î‘•”õ
- *------------------------------------------
- */
-int clif_arrowequip(struct map_session_data *sd,int val)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- if(sd->attacktarget && sd->attacktarget > 0) // [Valaris]
- sd->attacktarget = 0;
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x013c;
- WFIFOW(fd,2)=val+2;//–î‚̃AƒCƒeƒ€ID
-
- WFIFOSET(fd,packet_len_table[0x013c]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_arrow_fail(struct map_session_data *sd,int type)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x013b;
- WFIFOW(fd,2)=type;
-
- WFIFOSET(fd,packet_len_table[0x013b]);
-
- return 0;
-}
-
-/*==========================================
- * 쬉”\ –ƒXƒg‘—M
- *------------------------------------------
- */
-int clif_arrow_create_list(struct map_session_data *sd)
-{
- int i,c,view;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1ad;
-
- for(i=0,c=0;i<MAX_SKILL_ARROW_DB;i++){
- if(skill_arrow_db[i].nameid > 0 && pc_search_inventory(sd,skill_arrow_db[i].nameid)>=0){
- if((view = itemdb_viewid(skill_arrow_db[i].nameid)) > 0)
- WFIFOW(fd,c*2+4) = view;
- else
- WFIFOW(fd,c*2+4) = skill_arrow_db[i].nameid;
- c++;
- }
- }
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- if(c > 0) sd->state.make_arrow_flag = 1;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_statusupack(struct map_session_data *sd,int type,int ok,int val)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xbc;
- WFIFOW(fd,2)=type;
- WFIFOB(fd,4)=ok;
- WFIFOB(fd,5)=val;
- WFIFOSET(fd,packet_len_table[0xbc]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_equipitemack(struct map_session_data *sd,int n,int pos,int ok)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xaa;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=pos;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xaa]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xac;
- WFIFOW(fd,2)=n+2;
- WFIFOW(fd,4)=pos;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xac]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_misceffect(struct block_list* bl,int type)
-{
- char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x19b;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- clif_send(buf,packet_len_table[0x19b],bl,AREA);
-
- return 0;
-}
-int clif_misceffect2(struct block_list *bl, int type) {
- unsigned char buf[24];
-
- nullpo_retr(0, bl);
-
- memset(buf, 0, packet_len_table[0x1f3]);
-
- WBUFW(buf,0) = 0x1f3;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- clif_send(buf, packet_len_table[0x1f3], bl, AREA);
-
- return 0;
-
-}
-/*==========================================
- * •\Ž¦ƒIƒvƒVƒ‡ƒ“•ÏX
- *------------------------------------------
- */
-int clif_changeoption(struct block_list* bl)
-{
- char buf[32];
- short option;
- struct status_change *sc_data;
- static const int omask[]={ 0x10,0x20 };
- static const int scnum[]={ SC_FALCON, SC_RIDING };
- int i;
-
- nullpo_retr(0, bl);
-
- option = *battle_get_option(bl);
- sc_data = battle_get_sc_data(bl);
-
- WBUFW(buf,0) = 0x119;
- WBUFL(buf,2) = bl->id;
- WBUFW(buf,6) = *battle_get_opt1(bl);
- WBUFW(buf,8) = *battle_get_opt2(bl);
- WBUFW(buf,10) = option;
- WBUFB(buf,12) = 0; // ??
-
- if(bl->type==BL_PC) { // disguises [Valaris]
- struct map_session_data *sd=((struct map_session_data *)bl);
- if(sd && sd->disguise > 23 && sd->disguise < 4001) {
- clif_send(buf,packet_len_table[0x119],bl,AREA_WOS);
- clif_spawnpc(sd);
- } else
- clif_send(buf,packet_len_table[0x119],bl,AREA);
- } else
- clif_send(buf,packet_len_table[0x119],bl,AREA);
-
- // ƒAƒCƒRƒ“‚Ì•\Ž¦
- for(i=0;i<sizeof(omask)/sizeof(omask[0]);i++){
- if( option&omask[i] ){
- if( sc_data[scnum[i]].timer==-1)
- skill_status_change_start(bl,scnum[i],0,0,0,0,0,0);
- } else {
- skill_status_change_end(bl,scnum[i],-1);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_useitemack(struct map_session_data *sd,int index,int amount,int ok)
-{
- nullpo_retr(0, sd);
-
- if(!ok) {
- int fd=sd->fd;
- WFIFOW(fd,0)=0xa8;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xa8]);
- }
- else {
-#if PACKETVER < 3
- int fd=sd->fd;
- WFIFOW(fd,0)=0xa8;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=ok;
- WFIFOSET(fd,packet_len_table[0xa8]);
-#else
- char buf[32];
-
- WBUFW(buf,0)=0x1c8;
- WBUFW(buf,2)=index+2;
- if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
- WBUFW(buf,4)=sd->inventory_data[index]->view_id;
- else
- WBUFW(buf,4)=sd->status.inventory[index].nameid;
- WBUFL(buf,6)=sd->bl.id;
- WBUFW(buf,10)=amount;
- WBUFB(buf,12)=ok;
- clif_send(buf,packet_len_table[0x1c8],&sd->bl,AREA);
-#endif
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_createchat(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd6;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xd6]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_dispchat(struct chat_data *cd,int fd)
-{
- char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
-
- if(cd==NULL || *cd->owner==NULL)
- return 1;
-
- WBUFW(buf,0)=0xd7;
- WBUFW(buf,2)=strlen(cd->title)+17;
- WBUFL(buf,4)=(*cd->owner)->id;
- WBUFL(buf,8)=cd->bl.id;
- WBUFW(buf,12)=cd->limit;
- WBUFW(buf,14)=cd->users;
- WBUFB(buf,16)=cd->pub;
- strcpy(WBUFP(buf,17),cd->title);
- if(fd){
- memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
- WFIFOSET(fd,WBUFW(buf,2));
- } else {
- clif_send(buf,WBUFW(buf,2),*cd->owner,AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- * chat‚Ìó‘Ô•ÏX¬Œ÷
- * ŠO•”‚Ìl—p‚Æ–½—߃R[ƒh(d7->df)‚ªˆá‚¤‚¾‚¯
- *------------------------------------------
- */
-int clif_changechatstatus(struct chat_data *cd)
-{
- char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
-
- if(cd==NULL || cd->usersd[0]==NULL)
- return 1;
-
- WBUFW(buf,0)=0xdf;
- WBUFW(buf,2)=strlen(cd->title)+17;
- WBUFL(buf,4)=cd->usersd[0]->bl.id;
- WBUFL(buf,8)=cd->bl.id;
- WBUFW(buf,12)=cd->limit;
- WBUFW(buf,14)=cd->users;
- WBUFB(buf,16)=cd->pub;
- strcpy(WBUFP(buf,17),cd->title);
- clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_clearchat(struct chat_data *cd,int fd)
-{
- char buf[32];
-
- nullpo_retr(0, cd);
-
- WBUFW(buf,0)=0xd8;
- WBUFL(buf,2)=cd->bl.id;
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0xd8]);
- WFIFOSET(fd,packet_len_table[0xd8]);
- } else {
- clif_send(buf,packet_len_table[0xd8],*cd->owner,AREA_WOSC);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatfail(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0xda;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xda]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_joinchatok(struct map_session_data *sd,struct chat_data* cd)
-{
- int fd;
- int i;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xdb;
- WFIFOW(fd,2)=8+(28*cd->users);
- WFIFOL(fd,4)=cd->bl.id;
- for(i = 0;i < cd->users;i++){
- WFIFOL(fd,8+i*28) = (i!=0)||((*cd->owner)->type==BL_NPC);
- memcpy(WFIFOP(fd,8+i*28+4),cd->usersd[i]->status.name,24);
- }
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_addchat(struct chat_data* cd,struct map_session_data *sd)
-{
- char buf[32];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0x0dc;
- WBUFW(buf, 2) = cd->users;
- memcpy(WBUFP(buf, 4),sd->status.name,24);
- clif_send(buf,packet_len_table[0xdc],&sd->bl,CHAT_WOS);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd)
-{
- char buf[64];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0xe1;
- WBUFL(buf, 2) = 1;
- memcpy(WBUFP(buf,6),cd->usersd[0]->status.name,24);
- WBUFW(buf,30) = 0xe1;
- WBUFL(buf,32) = 0;
- memcpy(WBUFP(buf,36),sd->status.name,24);
-
- clif_send(buf,packet_len_table[0xe1]*2,&sd->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_leavechat(struct chat_data* cd,struct map_session_data *sd)
-{
- char buf[32];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, cd);
-
- WBUFW(buf, 0) = 0xdd;
- WBUFW(buf, 2) = cd->users-1;
- memcpy(WBUFP(buf,4),sd->status.name,24);
- WBUFB(buf,28) = 0;
-
- clif_send(buf,packet_len_table[0xdd],&sd->bl,CHAT);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«—v¿Žó‚¯
- *------------------------------------------
- */
-int clif_traderequest(struct map_session_data *sd,char *name)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xe5;
- strcpy(WFIFOP(fd,2),name);
- WFIFOSET(fd,packet_len_table[0xe5]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«—v‹‰ž“š
- *------------------------------------------
- */
-int clif_tradestart(struct map_session_data *sd,int type)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xe7;
- WFIFOB(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0xe7]);
-
- return 0;
-}
-
-/*==========================================
- * ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount)
-{
- int fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd);
-
- fd=tsd->fd;
- WFIFOW(fd,0)=0xe9;
- WFIFOL(fd,2)=amount;
- if(index==0){
- WFIFOW(fd,6) = 0; // type id
- WFIFOB(fd,8) = 0; //identify flag
- WFIFOB(fd,9) = 0; // attribute
- WFIFOB(fd,10)= 0; //refine
- WFIFOW(fd,11)= 0; //card (4w)
- WFIFOW(fd,13)= 0; //card (4w)
- WFIFOW(fd,15)= 0; //card (4w)
- WFIFOW(fd,17)= 0; //card (4w)
- }
- else{
- index -= 2;
- if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
- WFIFOW(fd,6) = sd->inventory_data[index]->view_id;
- else
- WFIFOW(fd,6) = sd->status.inventory[index].nameid; // type id
- WFIFOB(fd,8) = sd->status.inventory[index].identify; //identify flag
- WFIFOB(fd,9) = sd->status.inventory[index].attribute; // attribute
- WFIFOB(fd,10)= sd->status.inventory[index].refine; //refine
- if(sd->status.inventory[index].card[0]==0x00ff || sd->status.inventory[index].card[0]==0x00fe || sd->status.inventory[index].card[0]==(short)0xff00) {
- WFIFOW(fd,11)= sd->status.inventory[index].card[0]; //card (4w)
- WFIFOW(fd,13)= sd->status.inventory[index].card[1]; //card (4w)
- WFIFOW(fd,15)= sd->status.inventory[index].card[2]; //card (4w)
- WFIFOW(fd,17)= sd->status.inventory[index].card[3]; //card (4w)
- } else {
- if(sd->status.inventory[index].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[0])) > 0)
- WFIFOW(fd,11)= j;
- else
- WFIFOW(fd,11)= sd->status.inventory[index].card[0];
- if(sd->status.inventory[index].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[1])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= sd->status.inventory[index].card[1];
- if(sd->status.inventory[index].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[2])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= sd->status.inventory[index].card[2];
- if(sd->status.inventory[index].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[3])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= sd->status.inventory[index].card[3];
- }
- }
- WFIFOSET(fd,packet_len_table[0xe9]);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ¬Œ÷/Ž¸”s
- *------------------------------------------
- */
-int clif_tradeitemok(struct map_session_data *sd,int index,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xea;
- WFIFOW(fd,2)=index;
- WFIFOB(fd,4)=fail;
- WFIFOSET(fd,packet_len_table[0xea]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«ok‰Ÿ‚µ
- *------------------------------------------
- */
-int clif_tradedeal_lock(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xec;
- WFIFOB(fd,2)=fail; // 0=you 1=the other person
- WFIFOSET(fd,packet_len_table[0xec]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
- *------------------------------------------
- */
-int clif_tradecancelled(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xee;
- WFIFOSET(fd,packet_len_table[0xee]);
-
- return 0;
-}
-
-/*==========================================
- * Žæ‚èˆø‚«Š®—¹
- *------------------------------------------
- */
-int clif_tradecompleted(struct map_session_data *sd,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf0;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xf0]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚̃AƒCƒeƒ€”‚ðXV
- *------------------------------------------
- */
-int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0xf2; // update storage amount
- WFIFOW(fd,2) = stor->storage_amount; //items
- WFIFOW(fd,4) = MAX_STORAGE; //items max
- WFIFOSET(fd,packet_len_table[0xf2]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ɃAƒCƒeƒ€‚ð’ljÁ‚·‚é
- *------------------------------------------
- */
-int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount)
-{
- int view,fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) =0xf4; // Storage item added
- WFIFOW(fd,2) =index+1; // index
- WFIFOL(fd,4) =amount; // amount
- if((view = itemdb_viewid(stor->storage[index].nameid)) > 0)
- WFIFOW(fd,8) =view;
- else
- WFIFOW(fd,8) =stor->storage[index].nameid; // id
- WFIFOB(fd,10)=stor->storage[index].identify; //identify flag
- WFIFOB(fd,11)=stor->storage[index].attribute; // attribute
- WFIFOB(fd,12)=stor->storage[index].refine; //refine
- if(stor->storage[index].card[0]==0x00ff || stor->storage[index].card[0]==0x00fe || stor->storage[index].card[0]==(short)0xff00) {
- WFIFOW(fd,13)=stor->storage[index].card[0]; //card (4w)
- WFIFOW(fd,15)=stor->storage[index].card[1]; //card (4w)
- WFIFOW(fd,17)=stor->storage[index].card[2]; //card (4w)
- WFIFOW(fd,19)=stor->storage[index].card[3]; //card (4w)
- } else {
- if(stor->storage[index].card[0] > 0 && (j=itemdb_viewid(stor->storage[index].card[0])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= stor->storage[index].card[0];
- if(stor->storage[index].card[1] > 0 && (j=itemdb_viewid(stor->storage[index].card[1])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= stor->storage[index].card[1];
- if(stor->storage[index].card[2] > 0 && (j=itemdb_viewid(stor->storage[index].card[2])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= stor->storage[index].card[2];
- if(stor->storage[index].card[3] > 0 && (j=itemdb_viewid(stor->storage[index].card[3])) > 0)
- WFIFOW(fd,19)= j;
- else
- WFIFOW(fd,19)= stor->storage[index].card[3];
- }
- WFIFOSET(fd,packet_len_table[0xf4]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0xf2; // update storage amount
- WFIFOW(fd,2) = stor->storage_amount; //items
- WFIFOW(fd,4) = MAX_GUILD_STORAGE; //items max
- WFIFOSET(fd,packet_len_table[0xf2]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount)
-{
- int view,fd,j;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor);
-
- fd=sd->fd;
- WFIFOW(fd,0) =0xf4; // Storage item added
- WFIFOW(fd,2) =index+1; // index
- WFIFOL(fd,4) =amount; // amount
- if((view = itemdb_viewid(stor->storage[index].nameid)) > 0)
- WFIFOW(fd,8) =view;
- else
- WFIFOW(fd,8) =stor->storage[index].nameid; // id
- WFIFOB(fd,10)=stor->storage[index].identify; //identify flag
- WFIFOB(fd,11)=stor->storage[index].attribute; // attribute
- WFIFOB(fd,12)=stor->storage[index].refine; //refine
- if(stor->storage[index].card[0]==0x00ff || stor->storage[index].card[0]==0x00fe || stor->storage[index].card[0]==(short)0xff00) {
- WFIFOW(fd,13)=stor->storage[index].card[0]; //card (4w)
- WFIFOW(fd,15)=stor->storage[index].card[1]; //card (4w)
- WFIFOW(fd,17)=stor->storage[index].card[2]; //card (4w)
- WFIFOW(fd,19)=stor->storage[index].card[3]; //card (4w)
- } else {
- if(stor->storage[index].card[0] > 0 && (j=itemdb_viewid(stor->storage[index].card[0])) > 0)
- WFIFOW(fd,13)= j;
- else
- WFIFOW(fd,13)= stor->storage[index].card[0];
- if(stor->storage[index].card[1] > 0 && (j=itemdb_viewid(stor->storage[index].card[1])) > 0)
- WFIFOW(fd,15)= j;
- else
- WFIFOW(fd,15)= stor->storage[index].card[1];
- if(stor->storage[index].card[2] > 0 && (j=itemdb_viewid(stor->storage[index].card[2])) > 0)
- WFIFOW(fd,17)= j;
- else
- WFIFOW(fd,17)= stor->storage[index].card[2];
- if(stor->storage[index].card[3] > 0 && (j=itemdb_viewid(stor->storage[index].card[3])) > 0)
- WFIFOW(fd,19)= j;
- else
- WFIFOW(fd,19)= stor->storage[index].card[3];
- }
- WFIFOSET(fd,packet_len_table[0xf4]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚çƒAƒCƒeƒ€‚ðŽæ‚è‹Ž‚é
- *------------------------------------------
- */
-int clif_storageitemremoved(struct map_session_data *sd,int index,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf6; // Storage item removed
- WFIFOW(fd,2)=index+1;
- WFIFOL(fd,4)=amount;
- WFIFOSET(fd,packet_len_table[0xf6]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-int clif_storageclose(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xf8; // Storage Closed
- WFIFOSET(fd,packet_len_table[0xf8]);
-
- return 0;
-}
-
-//
-// callbackŒn ?
-//
-/*==========================================
- * PC•\Ž¦
- *------------------------------------------
- */
-void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* dstsd)
-{
- int len;
-
- nullpo_retv(sd);
- nullpo_retv(dstsd);
-
- if(dstsd->walktimer != -1){
- len = clif_set007b(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_set0078(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-
- if(dstsd->chatID){
- struct chat_data *cd;
- cd=(struct chat_data*)map_id2bl(dstsd->chatID);
- if(cd->usersd[0]==dstsd)
- clif_dispchat(cd,sd->fd);
- }
- if(dstsd->vender_id){
- clif_showvendingboard(&dstsd->bl,dstsd->message,sd->fd);
- }
- if(dstsd->spiritball > 0) {
- clif_set01e1(dstsd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,packet_len_table[0x1e1]);
- }
- if(battle_config.save_clothcolor==1 && dstsd->status.clothes_color > 0)
- clif_changelook(&dstsd->bl,LOOK_CLOTHES_COLOR,dstsd->status.clothes_color);
- if(sd->status.manner < 0)
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
-
-}
-
-/*==========================================
- * NPC•\Ž¦
- *------------------------------------------
- */
-void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd)
-{
- int len;
-
- nullpo_retv(sd);
- nullpo_retv(nd);
-
- if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS)
- return;
-
- len = clif_npc0078(nd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
-
- if(nd->chat_id){
- clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd);
- }
-
-}
-
-/*==========================================
- * ˆÚ“®’âŽ~
- *------------------------------------------
- */
-int clif_movemob(struct mob_data *md)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, md);
-
- len = clif_mob007b(md,buf);
- clif_send(buf,len,&md->bl,AREA);
-
- if(mob_get_equip(md->class) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class));
-
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[‚̈ʒuC³
- *------------------------------------------
- */
-int clif_fixmobpos(struct mob_data *md)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, md);
-
- if(md->state.state == MS_WALK){
- len = clif_mob007b(md,buf);
- clif_send(buf,len,&md->bl,AREA);
- } else {
- len = clif_mob0078(md,buf);
- clif_send(buf,len,&md->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- * PC‚̈ʒuC³
- *------------------------------------------
- */
-int clif_fixpcpos(struct map_session_data *sd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, sd);
-
- if(sd->walktimer != -1){
- len = clif_set007b(sd,buf);
- clif_send(buf,len,&sd->bl,AREA);
- } else {
- len = clif_set0078(sd,buf);
- clif_send(buf,len,&sd->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_fixpetpos(struct pet_data *pd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, pd);
-
- if(pd->state.state == MS_WALK){
- len = clif_pet007b(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
- } else {
- len = clif_pet0078(pd,buf);
- clif_send(buf,len,&pd->bl,AREA);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_fixnpcpos(struct npc_data *nd)
-{
- unsigned char buf[256];
- int len;
-
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK){
- len = clif_npc007b(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
- } else {
- len = clif_npc0078(nd,buf);
- clif_send(buf,len,&nd->bl,AREA);
- }
-
- return 0;
-}
-
-/*==========================================
- * ’ÊíUŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2)
-{
- unsigned char buf[256];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = battle_get_sc_data(dst);
-
- if(type != 4 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 4 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1) {
- if(damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- if(damage2 > 0)
- damage2 = damage2*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
- }
-
- WBUFW(buf,0)=0x8a;
- WBUFL(buf,2)=src->id;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=tick;
- WBUFL(buf,14)=sdelay;
- WBUFL(buf,18)=ddelay;
- WBUFW(buf,22)=(damage > 0x7fff)? 0x7fff:damage;
- WBUFW(buf,24)=div;
- WBUFB(buf,26)=type;
- WBUFW(buf,27)=damage2;
- clif_send(buf,packet_len_table[0x8a],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md)
-{
- int len;
- nullpo_retv(sd);
- nullpo_retv(md);
-
- if(md->state.state == MS_WALK){
- len = clif_mob007b(md,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_mob0078(md,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-
- if(mob_get_equip(md->class) > 0) // mob equipment [Valaris]
- clif_mob_equip(md,mob_get_equip(md->class));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_pet(struct map_session_data* sd,struct pet_data* pd)
-{
- int len;
-
- nullpo_retv(sd);
- nullpo_retv(pd);
-
- if(pd->state.state == MS_WALK){
- len = clif_pet007b(pd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- } else {
- len = clif_pet0078(pd,WFIFOP(sd->fd,0));
- WFIFOSET(sd->fd,len);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fitem)
-{
- int view,fd;
-
- nullpo_retv(sd);
- nullpo_retv(fitem);
-
- fd=sd->fd;
- //009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
- WFIFOW(fd,0)=0x9d;
- WFIFOL(fd,2)=fitem->bl.id;
- if((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
- WFIFOW(fd,6)=view;
- else
- WFIFOW(fd,6)=fitem->item_data.nameid;
- WFIFOB(fd,8)=fitem->item_data.identify;
- WFIFOW(fd,9)=fitem->bl.x;
- WFIFOW(fd,11)=fitem->bl.y;
- WFIFOW(fd,13)=fitem->item_data.amount;
- WFIFOB(fd,15)=fitem->subx;
- WFIFOB(fd,16)=fitem->suby;
-
- WFIFOSET(fd,packet_len_table[0x9d]);
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚É“ü‚é
- *------------------------------------------
- */
-int clif_getareachar_skillunit(struct map_session_data *sd,struct skill_unit *unit)
-{
- int fd;
- struct block_list *bl;
-
- nullpo_retr(0, unit);
-
- fd=sd->fd;
- bl=map_id2bl(unit->group->src_id);
-#if PACKETVER < 3
- memset(WFIFOP(fd,0),0,packet_len_table[0x11f]);
- WFIFOW(fd, 0)=0x11f;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOL(fd, 6)=unit->group->src_id;
- WFIFOW(fd,10)=unit->bl.x;
- WFIFOW(fd,12)=unit->bl.y;
- WFIFOB(fd,14)=unit->group->unit_id;
- WFIFOB(fd,15)=0;
- WFIFOSET(fd,packet_len_table[0x11f]);
-#else
- memset(WFIFOP(fd,0),0,packet_len_table[0x1c9]);
- WFIFOW(fd, 0)=0x1c9;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOL(fd, 6)=unit->group->src_id;
- WFIFOW(fd,10)=unit->bl.x;
- WFIFOW(fd,12)=unit->bl.y;
- WFIFOB(fd,14)=unit->group->unit_id;
- WFIFOB(fd,15)=1;
- WFIFOL(fd,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
- //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
- WFIFOL(fd,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
- WFIFOL(fd,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
- //37-39
- WFIFOB(fd,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WFIFOL(fd,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
- WFIFOL(fd,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
- //65-68
- //69-72
- if(bl) WFIFOL(fd,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
- WFIFOL(fd,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
- WFIFOB(fd,15+81)=0xaa; //81I’[•¶Žš0xaa
-
- /* Graffiti [Valaris] */
- if(unit->group->unit_id==0xb0) {
- WFIFOL(fd,15)=1;
- WFIFOL(fd,16)=1;
- memcpy(WFIFOP(fd,17),unit->group->valstr,80);
- }
-
- WFIFOSET(fd,packet_len_table[0x1c9]);
-#endif
- if(unit->group->skill_id == WZ_ICEWALL)
- clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,5);
-
- return 0;
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚©‚çÁ‚¦‚é
- *------------------------------------------
- */
-int clif_clearchar_skillunit(struct skill_unit *unit,int fd)
-{
- nullpo_retr(0, unit);
-
- WFIFOW(fd, 0)=0x120;
- WFIFOL(fd, 2)=unit->bl.id;
- WFIFOSET(fd,packet_len_table[0x120]);
- if(unit->group->skill_id == WZ_ICEWALL)
- clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,unit->val2);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_01ac(struct block_list *bl)
-{
- char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf, 0) = 0x1ac;
- WBUFL(buf, 2) = bl->id;
-
- clif_send(buf,packet_len_table[0x1ac],bl,AREA);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
- int clif_getareachar(struct block_list* bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=va_arg(ap,struct map_session_data*);
-
- switch(bl->type){
- case BL_PC:
- if(sd==(struct map_session_data*)bl)
- break;
- clif_getareachar_pc(sd,(struct map_session_data*) bl);
- break;
- case BL_NPC:
- clif_getareachar_npc(sd,(struct npc_data*) bl);
- break;
- case BL_MOB:
- clif_getareachar_mob(sd,(struct mob_data*) bl);
- break;
- case BL_PET:
- clif_getareachar_pet(sd,(struct pet_data*) bl);
- break;
- case BL_ITEM:
- clif_getareachar_item(sd,(struct flooritem_data*) bl);
- break;
- case BL_SKILL:
- clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
- break;
- default:
- if(battle_config.error_log)
- printf("get area char ??? %d\n",bl->type);
- break;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pcoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd,*dstsd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
-
- switch(bl->type){
- case BL_PC:
- dstsd = (struct map_session_data*) bl;
- if(sd != dstsd) {
- clif_clearchar_id(dstsd->bl.id,0,sd->fd);
- clif_clearchar_id(sd->bl.id,0,dstsd->fd);
- if(dstsd->chatID){
- struct chat_data *cd;
- cd=(struct chat_data*)map_id2bl(dstsd->chatID);
- if(cd->usersd[0]==dstsd)
- clif_dispchat(cd,sd->fd);
- }
- if(dstsd->vender_id){
- clif_closevendingboard(&dstsd->bl,sd->fd);
- }
- }
- break;
- case BL_NPC:
- if( ((struct npc_data *)bl)->class != INVISIBLE_CLASS )
- clif_clearchar_id(bl->id,0,sd->fd);
- break;
- case BL_MOB:
- case BL_PET:
- clif_clearchar_id(bl->id,0,sd->fd);
- break;
- case BL_ITEM:
- clif_clearflooritem((struct flooritem_data*)bl,sd->fd);
- break;
- case BL_SKILL:
- clif_clearchar_skillunit((struct skill_unit *)bl,sd->fd);
- break;
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pcinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd,*dstsd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
-
- switch(bl->type){
- case BL_PC:
- dstsd = (struct map_session_data *)bl;
- if(sd != dstsd) {
- clif_getareachar_pc(sd,dstsd);
- clif_getareachar_pc(dstsd,sd);
- }
- break;
- case BL_NPC:
- clif_getareachar_npc(sd,(struct npc_data*)bl);
- break;
- case BL_MOB:
- clif_getareachar_mob(sd,(struct mob_data*)bl);
- break;
- case BL_PET:
- clif_getareachar_pet(sd,(struct pet_data*)bl);
- break;
- case BL_ITEM:
- clif_getareachar_item(sd,(struct flooritem_data*)bl);
- break;
- case BL_SKILL:
- clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_moboutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=va_arg(ap,struct mob_data*));
-
- if(bl->type==BL_PC && (sd = (struct map_session_data*) bl)){
- clif_clearchar_id(md->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_mobinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- md=va_arg(ap,struct mob_data*);
- if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
- clif_getareachar_mob(sd,md);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_petoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct pet_data *pd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, pd=va_arg(ap,struct pet_data*));
-
- if(bl->type==BL_PC && (sd = (struct map_session_data*) bl)){
- clif_clearchar_id(pd->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_npcoutsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct npc_data *nd;
-
- 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)){
- clif_clearchar_id(nd->bl.id,0,sd->fd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_petinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct pet_data *pd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- pd=va_arg(ap,struct pet_data*);
- if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
- clif_getareachar_pet(sd,pd);
- }
-
- return 0;
-}
-
-// npc walking [Valaris]
-int clif_npcinsight(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- struct npc_data *nd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- nd=va_arg(ap,struct npc_data*);
- if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
- clif_getareachar_npc(sd,nd);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
-{
- int fd,id;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- if( (id=sd->status.skill[skillid].id) <= 0 )
- return 0;
- WFIFOW(fd,0)=0x147;
- WFIFOW(fd,2) = id;
- if(type < 0)
- WFIFOW(fd,4) = skill_get_inf(id);
- else
- WFIFOW(fd,4) = type;
- WFIFOW(fd,6) = 0;
- WFIFOW(fd,8) = sd->status.skill[skillid].lv;
- WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[skillid].lv);
- if(range < 0) {
- range = skill_get_range(id,sd->status.skill[skillid].lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,12)= range;
- } else
- WFIFOW(fd,12)= range;
- memset(WFIFOP(fd,14),0,24);
- if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
- WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
- else
- WFIFOB(fd,38) = 0;
- WFIFOSET(fd,packet_len_table[0x147]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŠƒXƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_skillinfoblock(struct map_session_data *sd)
-{
- int fd;
- int i,c,len=4,id,range;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10f;
- for ( i = c = 0; i < MAX_SKILL; i++){
- if( (id=sd->status.skill[i].id)!=0 ){
- WFIFOW(fd,len ) = id;
- WFIFOW(fd,len+2) = skill_get_inf(id);
- WFIFOW(fd,len+4) = 0;
- WFIFOW(fd,len+6) = sd->status.skill[i].lv;
- WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
- range = skill_get_range(id,sd->status.skill[i].lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,len+10)= range;
- memset(WFIFOP(fd,len+12),0,24);
- if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
- WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max(id) && sd->status.skill[i].flag ==0 )? 1:0;
- else
- WFIFOB(fd,len+36) = 0;
- len+=37;
- c++;
- }
- }
- WFIFOW(fd,2)=len;
- WFIFOSET(fd,len);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Š„‚èU‚è’Ê’m
- *------------------------------------------
- */
-int clif_skillup(struct map_session_data *sd,int skill_num)
-{
- int range,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0x10e;
- WFIFOW(fd,2) = skill_num;
- WFIFOW(fd,4) = sd->status.skill[skill_num].lv;
- WFIFOW(fd,6) = skill_get_sp(skill_num,sd->status.skill[skill_num].lv);
- range = skill_get_range(skill_num,sd->status.skill[skill_num].lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,8) = range;
- WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
- WFIFOSET(fd,packet_len_table[0x10e]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥ƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_skillcasting(struct block_list* bl,
- int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime)
-{
- unsigned char buf[32];
- WBUFW(buf,0) = 0x13e;
- WBUFL(buf,2) = src_id;
- WBUFL(buf,6) = dst_id;
- WBUFW(buf,10) = dst_x;
- WBUFW(buf,12) = dst_y;
- WBUFW(buf,14) = skill_num;//–‚–@‰r¥ƒXƒLƒ‹
- WBUFL(buf,16) = skill_get_pl(skill_num);//‘®«
- WBUFL(buf,20) = casttime;//skill‰r¥ŽžŠÔ
- clif_send(buf,packet_len_table[0x13e], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_skillcastcancel(struct block_list* bl)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0) = 0x1b9;
- WBUFL(buf,2) = bl->id;
- clif_send(buf,packet_len_table[0x1b9], bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥Ž¸”s
- *------------------------------------------
- */
-int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- if(type==0x4 && battle_config.display_delay_skill_fail==0){
- return 0;
- }
-
- WFIFOW(fd,0) = 0x110;
- WFIFOW(fd,2) = skill_id;
- WFIFOW(fd,4) = btype;
- WFIFOW(fd,6) = 0;
- WFIFOB(fd,8) = 0;
- WFIFOB(fd,9) = type;
- WFIFOSET(fd,packet_len_table[0x110]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-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)
-{
- unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = battle_get_sc_data(dst);
-
- if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
-
-#if PACKETVER < 3
- WBUFW(buf,0)=0x114;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFW(buf,24)=damage;
- WBUFW(buf,26)=skill_lv;
- WBUFW(buf,28)=div;
- WBUFB(buf,30)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x114],src,AREA);
-#else
- WBUFW(buf,0)=0x1de;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFL(buf,24)=damage;
- WBUFW(buf,28)=skill_lv;
- WBUFW(buf,30)=div;
- WBUFB(buf,32)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x1de],src,AREA);
-#endif
-
- return 0;
-}
-
-/*==========================================
- * ‚«”ò‚΂µƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
- *------------------------------------------
- */
-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)
-{
- unsigned char buf[64];
- struct status_change *sc_data;
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- sc_data = battle_get_sc_data(dst);
-
- if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
- type = 9;
- if(sc_data) {
- if(type != 5 && sc_data[SC_ENDURE].timer != -1)
- type = 9;
- if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
- damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
- }
-
- WBUFW(buf,0)=0x115;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFL(buf,8)=dst->id;
- WBUFL(buf,12)=tick;
- WBUFL(buf,16)=sdelay;
- WBUFL(buf,20)=ddelay;
- WBUFW(buf,24)=dst->x;
- WBUFW(buf,26)=dst->y;
- WBUFW(buf,28)=damage;
- WBUFW(buf,30)=skill_lv;
- WBUFW(buf,32)=div;
- WBUFB(buf,34)=(type>0)?type:skill_get_hit(skill_id);
- clif_send(buf,packet_len_table[0x115],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * Žx‰‡/‰ñ•œƒXƒLƒ‹ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
- int skill_id,int heal,int fail)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- WBUFW(buf,0)=0x11a;
- WBUFW(buf,2)=skill_id;
- WBUFW(buf,4)=(heal > 0x7fff)? 0x7fff:heal;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=src->id;
- WBUFB(buf,14)=fail;
- clif_send(buf,packet_len_table[0x11a],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_skill_poseffect(struct block_list *src,int skill_id,int val,int x,int y,int tick)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
-
- WBUFW(buf,0)=0x117;
- WBUFW(buf,2)=skill_id;
- WBUFL(buf,4)=src->id;
- WBUFW(buf,8)=val;
- WBUFW(buf,10)=x;
- WBUFW(buf,12)=y;
- WBUFL(buf,14)=tick;
- clif_send(buf,packet_len_table[0x117],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦
- *------------------------------------------
- */
-int clif_skill_setunit(struct skill_unit *unit)
-{
- unsigned char buf[128];
- struct block_list *bl;
-
- nullpo_retr(0, unit);
-
- bl=map_id2bl(unit->group->src_id);
-
-#if PACKETVER < 3
- memset(WBUFP(buf, 0),0,packet_len_table[0x11f]);
- WBUFW(buf, 0)=0x11f;
- WBUFL(buf, 2)=unit->bl.id;
- WBUFL(buf, 6)=unit->group->src_id;
- WBUFW(buf,10)=unit->bl.x;
- WBUFW(buf,12)=unit->bl.y;
- WBUFB(buf,14)=unit->group->unit_id;
- WBUFB(buf,15)=0;
- clif_send(buf,packet_len_table[0x11f],&unit->bl,AREA);
-#else
- memset(WBUFP(buf, 0),0,packet_len_table[0x1c9]);
- WBUFW(buf, 0)=0x1c9;
- WBUFL(buf, 2)=unit->bl.id;
- WBUFL(buf, 6)=unit->group->src_id;
- WBUFW(buf,10)=unit->bl.x;
- WBUFW(buf,12)=unit->bl.y;
- WBUFB(buf,14)=unit->group->unit_id;
- WBUFB(buf,15)=1;
- WBUFL(buf,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
- //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
- WBUFL(buf,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
- WBUFL(buf,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è(0x1b2‚Å0x004fdbdd‚¾‚Á‚½)
- WBUFL(buf,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
- //37-39
- WBUFB(buf,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
- WBUFL(buf,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è(0x01b2‚Å0x00495119‚¾‚Á‚½)
- WBUFL(buf,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
- WBUFL(buf,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
- //65-68
- //69-72
- if(bl) WBUFL(buf,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
- WBUFL(buf,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
- WBUFB(buf,15+81)=0xaa; //81I’[•¶Žš0xaa
-
- /* Graffiti [Valaris] */
- if(unit->group->unit_id==0xb0) {
- WBUFL(buf,15)=1;
- WBUFL(buf,16)=1;
- memcpy(WBUFP(buf,17),unit->group->valstr,80);
- }
-
- clif_send(buf,packet_len_table[0x1c9],&unit->bl,AREA);
-#endif
- return 0;
-}
-/*==========================================
- * ꊃXƒLƒ‹ƒGƒtƒFƒNƒgíœ
- *------------------------------------------
- */
-int clif_skill_delunit(struct skill_unit *unit)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, unit);
-
- WBUFW(buf, 0)=0x120;
- WBUFL(buf, 2)=unit->bl.id;
- clif_send(buf,packet_len_table[0x120],&unit->bl,AREA);
- return 0;
-}
-/*==========================================
- * ƒ[ƒvꊑI‘ð
- *------------------------------------------
- */
-int clif_skill_warppoint(struct map_session_data *sd,int skill_num,
- const char *map1,const char *map2,const char *map3,const char *map4)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x11c;
- WFIFOW(fd,2)=skill_num;
- memcpy(WFIFOP(fd, 4),map1,16);
- memcpy(WFIFOP(fd,20),map2,16);
- memcpy(WFIFOP(fd,36),map3,16);
- memcpy(WFIFOP(fd,52),map4,16);
- WFIFOSET(fd,packet_len_table[0x11c]);
- return 0;
-}
-/*==========================================
- * ƒƒ‚‰ž“š
- *------------------------------------------
- */
-int clif_skill_memo(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x11e;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x11e]);
- return 0;
-}
-int clif_skill_teleportmessage(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x189;
- WFIFOW(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x189]);
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[î•ñ
- *------------------------------------------
- */
-int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst)
-{
- struct mob_data *md;
- unsigned char buf[64];
- int i;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, dst);
-
- if(dst->type!=BL_MOB )
- return 0;
- if((md=(struct mob_data *)dst) == NULL)
- return 0;
-
- WBUFW(buf, 0)=0x18c;
- WBUFW(buf, 2)=mob_get_viewclass(md->class);
- WBUFW(buf, 4)=mob_db[md->class].lv;
- WBUFW(buf, 6)=mob_db[md->class].size;
- WBUFL(buf, 8)=md->hp;
- WBUFW(buf,12)=battle_get_def2(&md->bl);
- WBUFW(buf,14)=mob_db[md->class].race;
- WBUFW(buf,16)=battle_get_mdef2(&md->bl) - (mob_db[md->class].vit>>1);
- WBUFW(buf,18)=battle_get_elem_type(&md->bl);
- for(i=0;i<9;i++)
- WBUFB(buf,20+i)= battle_attr_fix(100,i+1,md->def_ele);
-
- if(sd->status.party_id>0)
- clif_send(buf,packet_len_table[0x18c],&sd->bl,PARTY_AREA);
- else{
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x18c]);
- WFIFOSET(sd->fd,packet_len_table[0x18c]);
- }
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_skill_produce_mix_list(struct map_session_data *sd,int trigger)
-{
- int i,c,view,fd;
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x18d;
-
- for(i=0,c=0;i<MAX_SKILL_PRODUCE_DB;i++){
- if( skill_can_produce_mix(sd,skill_produce_db[i].nameid,trigger) ){
- if((view = itemdb_viewid(skill_produce_db[i].nameid)) > 0)
- WFIFOW(fd,c*8+ 4)= view;
- else
- WFIFOW(fd,c*8+ 4)= skill_produce_db[i].nameid;
- WFIFOW(fd,c*8+ 6)= 0x0012;
- WFIFOL(fd,c*8+ 8)= sd->status.char_id;
- c++;
- }
- }
- WFIFOW(fd, 2)=c*8+8;
- WFIFOSET(fd,WFIFOW(fd,2));
- if(c > 0) sd->state.produce_flag = 1;
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙíƒAƒCƒRƒ“/ƒƒbƒZ[ƒW•\Ž¦
- *------------------------------------------
- */
-int clif_status_change(struct block_list *bl,int type,int flag)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x0196;
- WBUFW(buf,2)=type;
- WBUFL(buf,4)=bl->id;
- WBUFB(buf,8)=flag;
- clif_send(buf,packet_len_table[0x196],bl,AREA);
- return 0;
-}
-
-/*==========================================
- * Send message (modified by [Yor])
- *------------------------------------------
- */
-int clif_displaymessage(const int fd, char* mes)
-{
- //Console [Wizputer]
- if (fd == 0)
- printf("\033[0;36mConsole: \033[0m\033[1m%s\033[0m\n", mes);
- else {
- int len_mes = strlen(mes);
-
- if (len_mes > 0) { // don't send a void message (it's not displaying on the client chat). @help can send void line.
- WFIFOW(fd,0) = 0x8e;
- WFIFOW(fd,2) = 5 + len_mes; // 4 + len + NULL teminate
- memcpy(WFIFOP(fd,4), mes, len_mes + 1);
- WFIFOSET(fd, 5 + len_mes);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * “V‚̺‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag)
-{
- unsigned char *buf;
- int lp;
-
- lp = (flag & 0x10) ? 8 : 4;
- buf = (unsigned char*)aCalloc(len + lp, sizeof(unsigned char));
-
- WBUFW(buf,0) = 0x9a;
- WBUFW(buf,2) = len + lp;
- WBUFL(buf,4) = 0x65756c62;
- memcpy(WBUFP(buf,lp), mes, len);
- flag &= 0x07;
- clif_send(buf, WBUFW(buf,2), bl,
- (flag == 1) ? ALL_SAMEMAP :
- (flag == 2) ? AREA :
- (flag == 3) ? SELF :
- ALL_CLIENT);
-
- if(buf) free(buf);
-
- return 0;
-}
-
-/*==========================================
- * HPSP‰ñ•œƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_heal(int fd,int type,int val)
-{
- WFIFOW(fd,0)=0x13d;
- WFIFOW(fd,2)=type;
- WFIFOW(fd,4)=val;
- WFIFOSET(fd,packet_len_table[0x13d]);
-
- return 0;
-}
-
-/*==========================================
- * •œŠˆ‚·‚é
- *------------------------------------------
- */
-int clif_resurrection(struct block_list *bl,int type)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC) { // disguises [Valaris]
- struct map_session_data *sd=((struct map_session_data *)bl);
- if(sd && sd->disguise > 23 && sd->disguise < 4001)
- clif_spawnpc(sd);
- }
-
- WBUFW(buf,0)=0x148;
- WBUFL(buf,2)=bl->id;
- WBUFW(buf,6)=type;
-
- clif_send(buf,packet_len_table[0x148],bl,type==1 ? AREA : AREA_WOS);
-
- return 0;
-}
-
-/*==========================================
- * PVPŽÀ‘•Hi‰¼j
- *------------------------------------------
- */
-int clif_set0199(int fd,int type)
-{
- WFIFOW(fd,0)=0x199;
- WFIFOW(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0x199]);
-
- return 0;
-}
-
-/*==========================================
- * PVPŽÀ‘•H(‰¼)
- *------------------------------------------
- */
-int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
-{
- nullpo_retr(0, sd);
-
- if(map[sd->bl.m].flag.nopvp)
- return 0;
-
- if(type == 2) {
- WFIFOW(sd->fd,0) = 0x19a;
- WFIFOL(sd->fd,2) = sd->bl.id;
- if(pvprank<=0)
- pc_calc_pvprank(sd);
- WFIFOL(sd->fd,6) = pvprank;
- WFIFOL(sd->fd,10) = pvpnum;
- WFIFOSET(sd->fd,packet_len_table[0x19a]);
- } else {
- char buf[32];
-
- WBUFW(buf,0) = 0x19a;
- WBUFL(buf,2) = sd->bl.id;
- if(sd->status.option&0x46)
- WBUFL(buf,6) = -1;
- else
- if(pvprank<=0)
- pc_calc_pvprank(sd);
- WBUFL(buf,6) = pvprank;
- WBUFL(buf,10) = pvpnum;
- if(!type)
- clif_send(buf,packet_len_table[0x19a],&sd->bl,AREA);
- else
- clif_send(buf,packet_len_table[0x19a],&sd->bl,ALL_SAMEMAP);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_send0199(int map,int type)
-{
- struct block_list bl;
- char buf[16];
-
- bl.m = map;
- WBUFW(buf,0)=0x199;
- WBUFW(buf,2)=type;
- clif_send(buf,packet_len_table[0x199],&bl,ALL_SAMEMAP);
-
- return 0;
-}
-
-/*==========================================
- * ¸˜BƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val)
-{
- WFIFOW(fd,0)=0x188;
- WFIFOW(fd,2)=fail;
- WFIFOW(fd,4)=index+2;
- WFIFOW(fd,6)=val;
- WFIFOSET(fd,packet_len_table[0x188]);
-
- return 0;
-}
-
-/*==========================================
- * Wisp/page is transmitted to the destination player
- *------------------------------------------
- */
-int clif_wis_message(int fd, char *nick, char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B
-{
- WFIFOW(fd,0) = 0x97;
- WFIFOW(fd,2) = mes_len + 24 + 4;
- memcpy(WFIFOP(fd,4), nick, 24);
- memcpy(WFIFOP(fd,28), mes, mes_len);
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * The transmission result of Wisp/page is transmitted to the source player
- *------------------------------------------
- */
-int clif_wis_end(int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
-{
- WFIFOW(fd,0) = 0x98;
- WFIFOW(fd,2) = flag;
- WFIFOSET(fd,packet_len_table[0x98]);
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ID–¼‘Oˆø‚«Œ‹‰Ê‚ð‘—M‚·‚é
- *------------------------------------------
- */
-int clif_solved_charname(struct map_session_data *sd,int char_id)
-{
- char *p= map_charid2nick(char_id);
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- if(p!=NULL){
- WFIFOW(fd,0)=0x194;
- WFIFOL(fd,2)=char_id;
- memcpy(WFIFOP(fd,6), p,24 );
- WFIFOSET(fd,packet_len_table[0x194]);
- }else{
- map_reqchariddb(sd,char_id);
- chrif_searchcharid(char_id);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒh‚Ì‘}“ü‰Â”\ƒŠƒXƒg‚ð•Ô‚·
- *------------------------------------------
- */
-int clif_use_card(struct map_session_data *sd,int idx)
-{
- nullpo_retr(0, sd);
-
- if(sd->inventory_data[idx]) {
- int i,c;
- int ep=sd->inventory_data[idx]->equip;
- int fd=sd->fd;
- WFIFOW(fd,0)=0x017b;
-
- for(i=c=0;i<MAX_INVENTORY;i++){
- int j;
-
- if(sd->inventory_data[i] == NULL)
- continue;
- if(sd->inventory_data[i]->type!=4 && sd->inventory_data[i]->type!=5) // •Ší–h‹ï‚¶‚á‚È‚¢
- continue;
- if(sd->status.inventory[i].card[0]==0x00ff) // »‘¢•Ší
- continue;
- if(sd->status.inventory[i].card[0]==(short)0xff00 || sd->status.inventory[i].card[0]==0x00fe)
- continue;
- if(sd->status.inventory[i].identify==0 ) // –¢ŠÓ’è
- continue;
-
- if((sd->inventory_data[i]->equip&ep)==0) // ‘•”õŒÂŠ‚ªˆá‚¤
- continue;
- if(sd->inventory_data[i]->type==4 && ep==32) // ‚ƒJ[ƒh‚Æ—¼Žè•Ší
- continue;
-
- for(j=0;j<sd->inventory_data[i]->slot;j++){
- if( sd->status.inventory[i].card[j]==0 )
- break;
- }
- if(j==sd->inventory_data[i]->slot) // ‚·‚łɃJ[ƒh‚ªˆê”t
- continue;
-
- WFIFOW(fd,4+c*2)=i+2;
- c++;
- }
- WFIFOW(fd,2)=4+c*2;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return 0;
-}
-/*==========================================
- * ƒJ[ƒh‚Ì‘}“üI—¹
- *------------------------------------------
- */
-int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x17d;
- WFIFOW(fd,2)=idx_equip+2;
- WFIFOW(fd,4)=idx_card+2;
- WFIFOB(fd,6)=flag;
- WFIFOSET(fd,packet_len_table[0x17d]);
- return 0;
-}
-
-/*==========================================
- * ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
- *------------------------------------------
- */
-int clif_item_identify_list(struct map_session_data *sd)
-{
- int i,c;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x177;
- for(i=c=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){
- WFIFOW(fd,c*2+4)=i+2;
- c++;
- }
- }
- if(c > 0) {
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ŠÓ’茋‰Ê
- *------------------------------------------
- */
-int clif_item_identified(struct map_session_data *sd,int idx,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x179;
- WFIFOW(fd, 2)=idx+2;
- WFIFOB(fd, 4)=flag;
- WFIFOSET(fd,packet_len_table[0x179]);
- return 0;
-}
-
-/*==========================================
- * C—‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
- * ¦ŽÀۂ̃pƒPƒbƒg‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å“®ì‚µ‚Ü‚¹‚ñ
- *------------------------------------------
- */
-int clif_item_repair_list(struct map_session_data *sd)
-{
- int i,c;
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x0;
- for(i=c=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].attribute==1){
- WFIFOW(fd,c*2+4)=i+2;
- c++;
- }
- }
- if(c > 0) {
- WFIFOW(fd,2)=c*2+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚É‚æ‚éˆêŽž“I‚ȃXƒLƒ‹Œø‰Ê
- *------------------------------------------
- */
-int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name)
-{
- int range,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x147;
- WFIFOW(fd, 2)=skillid;
- WFIFOW(fd, 4)=skill_get_inf(skillid);
- WFIFOW(fd, 6)=0;
- WFIFOW(fd, 8)=skilllv;
- WFIFOW(fd,10)=skill_get_sp(skillid,skilllv);
- range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- WFIFOW(fd,12)=range;
- memcpy(WFIFOP(fd,14),name,24);
- WFIFOB(fd,38)=0;
- WFIFOSET(fd,packet_len_table[0x147]);
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail)
-{
- int view,j,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf=WFIFOP(fd,0);
- if(n<0 || n>=MAX_CART || sd->status.cart[n].nameid<=0)
- return 1;
-
- WBUFW(buf,0)=0x124;
- WBUFW(buf,2)=n+2;
- WBUFL(buf,4)=amount;
- if((view = itemdb_viewid(sd->status.cart[n].nameid)) > 0)
- WBUFW(buf,8)=view;
- else
- WBUFW(buf,8)=sd->status.cart[n].nameid;
- WBUFB(buf,10)=sd->status.cart[n].identify;
- WBUFB(buf,11)=sd->status.cart[n].attribute;
- WBUFB(buf,12)=sd->status.cart[n].refine;
- if(sd->status.cart[n].card[0]==0x00ff || sd->status.cart[n].card[0]==0x00fe || sd->status.cart[n].card[0]==(short)0xff00) {
- WBUFW(buf,13)=sd->status.cart[n].card[0];
- WBUFW(buf,15)=sd->status.cart[n].card[1];
- WBUFW(buf,17)=sd->status.cart[n].card[2];
- WBUFW(buf,19)=sd->status.cart[n].card[3];
- } else {
- if(sd->status.cart[n].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[0])) > 0)
- WBUFW(buf,13)= j;
- else
- WBUFW(buf,13)= sd->status.cart[n].card[0];
- if(sd->status.cart[n].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[1])) > 0)
- WBUFW(buf,15)= j;
- else
- WBUFW(buf,15)= sd->status.cart[n].card[1];
- if(sd->status.cart[n].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[2])) > 0)
- WBUFW(buf,17)= j;
- else
- WBUFW(buf,17)= sd->status.cart[n].card[2];
- if(sd->status.cart[n].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[3])) > 0)
- WBUFW(buf,19)= j;
- else
- WBUFW(buf,19)= sd->status.cart[n].card[3];
- }
- WFIFOSET(fd,packet_len_table[0x124]);
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
- *------------------------------------------
- */
-int clif_cart_delitem(struct map_session_data *sd,int n,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
-
- WFIFOW(fd,0)=0x125;
- WFIFOW(fd,2)=n+2;
- WFIFOL(fd,4)=amount;
-
- WFIFOSET(fd,packet_len_table[0x125]);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚̃AƒCƒeƒ€ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_cart_itemlist(struct map_session_data *sd)
-{
- struct item_data *id;
- int i,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-#if PACKETVER < 5
- WBUFW(buf,0)=0x123;
- for(i=0,n=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*10+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*10+6)=id->view_id;
- else
- WBUFW(buf,n*10+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*10+8)=id->type;
- WBUFB(buf,n*10+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*10+10)=sd->status.cart[i].amount;
- WBUFW(buf,n*10+12)=0;
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*10;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#else
- WBUFW(buf,0)=0x1ef;
- for(i=0,n=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*18+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*18+6)=id->view_id;
- else
- WBUFW(buf,n*18+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*18+8)=id->type;
- WBUFB(buf,n*18+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*18+10)=sd->status.cart[i].amount;
- WBUFW(buf,n*18+12)=0;
- WBUFW(buf,n*18+14)=sd->status.cart[i].card[0];
- WBUFW(buf,n*18+16)=sd->status.cart[i].card[1];
- WBUFW(buf,n*18+18)=sd->status.cart[i].card[2];
- WBUFW(buf,n*18+20)=sd->status.cart[i].card[3];
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*18;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-#endif
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚Ì‘•”õ•iƒŠƒXƒg
- *------------------------------------------
- */
-int clif_cart_equiplist(struct map_session_data *sd)
-{
- struct item_data *id;
- int i,j,n,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-
- WBUFW(buf,0)=0x122;
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.cart[i].nameid<=0)
- continue;
- id = itemdb_search(sd->status.cart[i].nameid);
- if(!itemdb_isequip2(id))
- continue;
- WBUFW(buf,n*20+4)=i+2;
- if(id->view_id > 0)
- WBUFW(buf,n*20+6)=id->view_id;
- else
- WBUFW(buf,n*20+6)=sd->status.cart[i].nameid;
- WBUFB(buf,n*20+8)=id->type;
- WBUFB(buf,n*20+9)=sd->status.cart[i].identify;
- WBUFW(buf,n*20+10)=id->equip;
- WBUFW(buf,n*20+12)=sd->status.cart[i].equip;
- WBUFB(buf,n*20+14)=sd->status.cart[i].attribute;
- WBUFB(buf,n*20+15)=sd->status.cart[i].refine;
- if(sd->status.cart[i].card[0]==0x00ff || sd->status.cart[i].card[0]==0x00fe || sd->status.cart[i].card[0]==(short)0xff00) {
- WBUFW(buf,n*20+16)=sd->status.cart[i].card[0];
- WBUFW(buf,n*20+18)=sd->status.cart[i].card[1];
- WBUFW(buf,n*20+20)=sd->status.cart[i].card[2];
- WBUFW(buf,n*20+22)=sd->status.cart[i].card[3];
- } else {
- if(sd->status.cart[i].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[0])) > 0)
- WBUFW(buf,n*20+16)= j;
- else
- WBUFW(buf,n*20+16)= sd->status.cart[i].card[0];
- if(sd->status.cart[i].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[1])) > 0)
- WBUFW(buf,n*20+18)= j;
- else
- WBUFW(buf,n*20+18)= sd->status.cart[i].card[1];
- if(sd->status.cart[i].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[2])) > 0)
- WBUFW(buf,n*20+20)= j;
- else
- WBUFW(buf,n*20+20)= sd->status.cart[i].card[2];
- if(sd->status.cart[i].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[3])) > 0)
- WBUFW(buf,n*20+22)= j;
- else
- WBUFW(buf,n*20+22)= sd->status.cart[i].card[3];
- }
- n++;
- }
- if(n){
- WBUFW(buf,2)=4+n*20;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-int clif_openvendingreq(struct map_session_data *sd,int num)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x12d;
- WFIFOW(fd,2)=num;
- WFIFOSET(fd,packet_len_table[0x12d]);
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠÅ”•\Ž¦
- *------------------------------------------
- */
-int clif_showvendingboard(struct block_list* bl,char *message,int fd)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x131;
- WBUFL(buf,2)=bl->id;
- strncpy(WBUFP(buf,6),message,80);
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0x131]);
- WFIFOSET(fd,packet_len_table[0x131]);
- }else{
- clif_send(buf,packet_len_table[0x131],bl,AREA_WOS);
- }
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠÅ”ÂÁ‹Ž
- *------------------------------------------
- */
-int clif_closevendingboard(struct block_list* bl,int fd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x132;
- WBUFL(buf,2)=bl->id;
- if(fd){
- memcpy(WFIFOP(fd,0),buf,packet_len_table[0x132]);
- WFIFOSET(fd,packet_len_table[0x132]);
- }else{
- clif_send(buf,packet_len_table[0x132],bl,AREA_WOS);
- }
-
- return 0;
-}
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending)
-{
- struct item_data *data;
- int i,j,n,index,fd;
- struct map_session_data *vsd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, vending);
- nullpo_retr(0, vsd=map_id2sd(id));
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
- WBUFW(buf,0)=0x133;
- WBUFL(buf,4)=id;
- for(i=0,n=0;i<vsd->vend_num;i++){
- if(vending[i].amount<=0)
- continue;
- WBUFL(buf,8+n*22)=vending[i].value;
- WBUFW(buf,12+n*22)=vending[i].amount;
- WBUFW(buf,14+n*22)=(index=vending[i].index)+2;
- if(vsd->status.cart[index].nameid <= 0 || vsd->status.cart[index].amount <= 0)
- continue;
- data = itemdb_search(vsd->status.cart[index].nameid);
- WBUFB(buf,16+n*22)=data->type;
- if(data->view_id > 0)
- WBUFW(buf,17+n*22)=data->view_id;
- else
- WBUFW(buf,17+n*22)=vsd->status.cart[index].nameid;
- WBUFB(buf,19+n*22)=vsd->status.cart[index].identify;
- WBUFB(buf,20+n*22)=vsd->status.cart[index].attribute;
- WBUFB(buf,21+n*22)=vsd->status.cart[index].refine;
- if(vsd->status.cart[index].card[0]==0x00ff || vsd->status.cart[index].card[0]==0x00fe || vsd->status.cart[index].card[0]==(short)0xff00) {
- WBUFW(buf,22+n*22)=vsd->status.cart[index].card[0];
- WBUFW(buf,24+n*22)=vsd->status.cart[index].card[1];
- WBUFW(buf,26+n*22)=vsd->status.cart[index].card[2];
- WBUFW(buf,28+n*22)=vsd->status.cart[index].card[3];
- } else {
- if(vsd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[0])) > 0)
- WBUFW(buf,22+n*22)= j;
- else
- WBUFW(buf,22+n*22)= vsd->status.cart[index].card[0];
- if(vsd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[1])) > 0)
- WBUFW(buf,24+n*22)= j;
- else
- WBUFW(buf,24+n*22)= vsd->status.cart[index].card[1];
- if(vsd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[2])) > 0)
- WBUFW(buf,26+n*22)= j;
- else
- WBUFW(buf,26+n*22)= vsd->status.cart[index].card[2];
- if(vsd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[3])) > 0)
- WBUFW(buf,28+n*22)= j;
- else
- WBUFW(buf,28+n*22)= vsd->status.cart[index].card[3];
- }
- n++;
- }
- if(n > 0){
- WBUFW(buf,2)=8+n*22;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“üŽ¸”s
- *------------------------------------------
-*/
-int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x135;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOB(fd,6)=fail;
- WFIFOSET(fd,packet_len_table[0x135]);
-
- return 0;
-}
-
-/*==========================================
- * ˜I“XŠJݬŒ÷
- *------------------------------------------
-*/
-int clif_openvending(struct map_session_data *sd,int id,struct vending *vending)
-{
- struct item_data *data;
- int i,j,n,index,fd;
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- buf = WFIFOP(fd,0);
-
- WBUFW(buf,0)=0x136;
- WBUFL(buf,4)=id;
- for(i=0,n=0;i<sd->vend_num;i++){
- if (sd->vend_num > 2+pc_checkskill(sd,MC_VENDING)) return 0;
- WBUFL(buf,8+n*22)=vending[i].value;
- WBUFW(buf,12+n*22)=(index=vending[i].index)+2;
- WBUFW(buf,14+n*22)=vending[i].amount;
- if(sd->status.cart[index].nameid <= 0 || sd->status.cart[index].amount <= 0 || sd->status.cart[index].identify==0 ||
- sd->status.cart[index].attribute==1) // Prevent unidentified and broken items from being sold [Valaris]
- continue;
- data = itemdb_search(sd->status.cart[index].nameid);
- WBUFB(buf,16+n*22)=data->type;
- if(data->view_id > 0)
- WBUFW(buf,17+n*22)=data->view_id;
- else
- WBUFW(buf,17+n*22)=sd->status.cart[index].nameid;
- WBUFB(buf,19+n*22)=sd->status.cart[index].identify;
- WBUFB(buf,20+n*22)=sd->status.cart[index].attribute;
- WBUFB(buf,21+n*22)=sd->status.cart[index].refine;
- if(sd->status.cart[index].card[0]==0x00ff || sd->status.cart[index].card[0]==0x00fe || sd->status.cart[index].card[0]==(short)0xff00) {
- WBUFW(buf,22+n*22)=sd->status.cart[index].card[0];
- WBUFW(buf,24+n*22)=sd->status.cart[index].card[1];
- WBUFW(buf,26+n*22)=sd->status.cart[index].card[2];
- WBUFW(buf,28+n*22)=sd->status.cart[index].card[3];
- } else {
- if(sd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[0])) > 0)
- WBUFW(buf,22+n*22)= j;
- else
- WBUFW(buf,22+n*22)= sd->status.cart[index].card[0];
- if(sd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[1])) > 0)
- WBUFW(buf,24+n*22)= j;
- else
- WBUFW(buf,24+n*22)= sd->status.cart[index].card[1];
- if(sd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[2])) > 0)
- WBUFW(buf,26+n*22)= j;
- else
- WBUFW(buf,26+n*22)= sd->status.cart[index].card[2];
- if(sd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[3])) > 0)
- WBUFW(buf,28+n*22)= j;
- else
- WBUFW(buf,28+n*22)= sd->status.cart[index].card[3];
- }
- n++;
- }
- if(n > 0){
- WBUFW(buf,2)=8+n*22;
- WFIFOSET(fd,WFIFOW(fd,2));
- }
-
- return n;
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
- *------------------------------------------
-*/
-int clif_vendingreport(struct map_session_data *sd,int index,int amount)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x137;
- WFIFOW(fd,2)=index+2;
- WFIFOW(fd,4)=amount;
- WFIFOSET(fd,packet_len_table[0x137]);
-
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒB쬊®—¹
- *------------------------------------------
- */
-int clif_party_created(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xfa;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0xfa]);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBî•ñ‘—M
- *------------------------------------------
- */
-int clif_party_info(struct party *p,int fd)
-{
- unsigned char buf[1024];
- int i,c;
- struct map_session_data *sd=NULL;
-
- nullpo_retr(0, p);
-
- WBUFW(buf,0)=0xfb;
- memcpy(WBUFP(buf,4),p->name,24);
- for(i=c=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if(m->account_id>0){
- if(sd==NULL) sd=m->sd;
- WBUFL(buf,28+c*46)=m->account_id;
- memcpy(WBUFP(buf,28+c*46+ 4),m->name,24);
- memcpy(WBUFP(buf,28+c*46+28),m->map,16);
- WBUFB(buf,28+c*46+44)=(m->leader)?0:1;
- WBUFB(buf,28+c*46+45)=(m->online)?0:1;
- c++;
- }
- }
- WBUFW(buf,2)=28+c*46;
- if(fd>=0){ // fd‚ªÝ’肳‚ê‚Ä‚é‚È‚ç‚»‚ê‚É‘—‚é
- memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
- WFIFOSET(fd,WFIFOW(fd,2));
- return 9;
- }
- if(sd!=NULL)
- clif_send(buf,WBUFW(buf,2),&sd->bl,PARTY);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBŠ©—U
- *------------------------------------------
- */
-int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd)
-{
- int fd;
- struct party *p;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, tsd);
-
- fd=tsd->fd;
-
- if( (p=party_search(sd->status.party_id))==NULL )
- return 0;
-
- WFIFOW(fd,0)=0xfe;
- WFIFOL(fd,2)=sd->status.account_id;
- memcpy(WFIFOP(fd,6),p->name,24);
- WFIFOSET(fd,packet_len_table[0xfe]);
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒBŠ©—UŒ‹‰Ê
- *------------------------------------------
- */
-int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xfd;
- memcpy(WFIFOP(fd,2),nick,24);
- WFIFOB(fd,26)=flag;
- WFIFOSET(fd,packet_len_table[0xfd]);
- return 0;
-}
-
-/*==========================================
- * ƒp[ƒeƒBÝ’è‘—M
- * flag & 0x001=exp•ÏXƒ~ƒX
- * 0x010=item•ÏXƒ~ƒX
- * 0x100=ˆêl‚É‚Ì‚Ý‘—M
- *------------------------------------------
- */
-int clif_party_option(struct party *p,struct map_session_data *sd,int flag)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, p);
-
-// if(battle_config.etc_log)
-// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
- if(sd==NULL && flag==0){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if((sd=map_id2sd(p->member[i].account_id))!=NULL)
- break;
- }
- if(sd==NULL)
- return 0;
- WBUFW(buf,0)=0x101;
- WBUFW(buf,2)=((flag&0x01)?2:p->exp);
- WBUFW(buf,4)=((flag&0x10)?2:p->item);
- if(flag==0)
- clif_send(buf,packet_len_table[0x101],&sd->bl,PARTY);
- else {
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x101]);
- WFIFOSET(sd->fd,packet_len_table[0x101]);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒB’E‘Þi’E‘Þ‘O‚ɌĂԂ±‚Æj
- *------------------------------------------
- */
-int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag)
-{
- unsigned char buf[64];
- int i;
-
- nullpo_retr(0, p);
-
- WBUFW(buf,0)=0x105;
- WBUFL(buf,2)=account_id;
- memcpy(WBUFP(buf,6),name,24);
- WBUFB(buf,30)=flag&0x0f;
-
- if((flag&0xf0)==0){
- if(sd==NULL)
- for(i=0;i<MAX_PARTY;i++)
- if((sd=p->member[i].sd)!=NULL)
- break;
- if (sd!=NULL)
- clif_send(buf,packet_len_table[0x105],&sd->bl,PARTY);
- } else if (sd!=NULL) {
- memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x105]);
- WFIFOSET(sd->fd,packet_len_table[0x105]);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
- *------------------------------------------
- */
-int clif_party_message(struct party *p,int account_id,char *mes,int len)
-{
- struct map_session_data *sd;
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- if((sd=p->member[i].sd)!=NULL)
- break;
- }
- if(sd!=NULL){
- unsigned char buf[1024];
- WBUFW(buf,0)=0x109;
- WBUFW(buf,2)=len+8;
- WBUFL(buf,4)=account_id;
- memcpy(WBUFP(buf,8),mes,len);
- clif_send(buf,len+8,&sd->bl,PARTY);
- }
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBÀ•W’Ê’m
- *------------------------------------------
- */
-int clif_party_xy(struct party *p,struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x107;
- WBUFL(buf,2)=sd->status.account_id;
- WBUFW(buf,6)=sd->bl.x;
- WBUFW(buf,8)=sd->bl.y;
- clif_send(buf,packet_len_table[0x107],&sd->bl,PARTY_SAMEMAP_WOS);
-// if(battle_config.etc_log)
-// printf("clif_party_xy %d\n",sd->status.account_id);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBHP’Ê’m
- *------------------------------------------
- */
-int clif_party_hp(struct party *p,struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x106;
- WBUFL(buf,2)=sd->status.account_id;
- WBUFW(buf,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp;
- WBUFW(buf,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp;
- clif_send(buf,packet_len_table[0x106],&sd->bl,PARTY_AREA_WOS);
-// if(battle_config.etc_log)
-// printf("clif_party_hp %d\n",sd->status.account_id);
- return 0;
-}
-/*==========================================
- * ƒp[ƒeƒBꊈړ®i–¢Žg—pj
- *------------------------------------------
- */
-int clif_party_move(struct party *p,struct map_session_data *sd,int online)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
- nullpo_retr(0, p);
-
- WBUFW(buf, 0)=0x104;
- WBUFL(buf, 2)=sd->status.account_id;
- WBUFL(buf, 6)=0;
- WBUFW(buf,10)=sd->bl.x;
- WBUFW(buf,12)=sd->bl.y;
- WBUFB(buf,14)=!online;
- memcpy(WBUFP(buf,15),p->name,24);
- memcpy(WBUFP(buf,39),sd->status.name,24);
- memcpy(WBUFP(buf,63),map[sd->bl.m].name,16);
- clif_send(buf,packet_len_table[0x104],&sd->bl,PARTY);
- return 0;
-}
-/*==========================================
- * UŒ‚‚·‚邽‚߂Ɉړ®‚ª•K—v
- *------------------------------------------
- */
-int clif_movetoattack(struct map_session_data *sd,struct block_list *bl)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, bl);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x139;
- WFIFOL(fd, 2)=bl->id;
- WFIFOW(fd, 6)=bl->x;
- WFIFOW(fd, 8)=bl->y;
- WFIFOW(fd,10)=sd->bl.x;
- WFIFOW(fd,12)=sd->bl.y;
- WFIFOW(fd,14)=sd->attackrange;
- WFIFOSET(fd,packet_len_table[0x139]);
- return 0;
-}
-/*==========================================
- * »‘¢ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_produceeffect(struct map_session_data *sd,int flag,int nameid)
-{
- int view,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- // –¼‘O‚Ì“o˜^‚Æ‘—M‚ðæ‚É‚µ‚Ä‚¨‚­
- if( map_charid2nick(sd->status.char_id)==NULL )
- map_addchariddb(sd->status.char_id,sd->status.name);
- clif_solved_charname(sd,sd->status.char_id);
-
- WFIFOW(fd, 0)=0x18f;
- WFIFOW(fd, 2)=flag;
- if((view = itemdb_viewid(nameid)) > 0)
- WFIFOW(fd, 4)=view;
- else
- WFIFOW(fd, 4)=nameid;
- WFIFOSET(fd,packet_len_table[0x18f]);
- return 0;
-}
-
-// pet
-int clif_catch_process(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x19e;
- WFIFOSET(fd,packet_len_table[0x19e]);
-
- return 0;
-}
-
-int clif_pet_rulet(struct map_session_data *sd,int data)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a0;
- WFIFOB(fd,2)=data;
- WFIFOSET(fd,packet_len_table[0x1a0]);
-
- return 0;
-}
-
-/*==========================================
- * pet—‘ƒŠƒXƒgì¬
- *------------------------------------------
- */
-int clif_sendegg(struct map_session_data *sd)
-{
- //R 01a6 <len>.w <index>.w*
- int i,n=0,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a6;
- if(sd->status.pet_id <= 0) {
- for(i=0,n=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
- sd->inventory_data[i]->type!=7 ||
- sd->status.inventory[i].amount<=0)
- continue;
- WFIFOW(fd,n*2+4)=i+2;
- n++;
- }
- }
- WFIFOW(fd,2)=4+n*2;
- WFIFOSET(fd,WFIFOW(fd,2));
-
- return 0;
-}
-
-int clif_send_petdata(struct map_session_data *sd,int type,int param)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a4;
- WFIFOB(fd,2)=type;
- WFIFOL(fd,3)=sd->pd->bl.id;
- WFIFOL(fd,7)=param;
- WFIFOSET(fd,packet_len_table[0x1a4]);
-
- return 0;
-}
-
-int clif_send_petstatus(struct map_session_data *sd)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a2;
- memcpy(WFIFOP(fd,2),sd->pet.name,24);
- WFIFOB(fd,26)=(battle_config.pet_rename == 1)? 0:sd->pet.rename_flag;
- WFIFOW(fd,27)=sd->pet.level;
- WFIFOW(fd,29)=sd->pet.hungry;
- WFIFOW(fd,31)=sd->pet.intimate;
- WFIFOW(fd,33)=sd->pet.equip;
- WFIFOSET(fd,packet_len_table[0x1a2]);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_pet_emotion(struct pet_data *pd,int param)
-{
- unsigned char buf[16];
- struct map_session_data *sd;
-
- nullpo_retr(0, pd);
- nullpo_retr(0, sd = pd->msd);
-
- memset(buf,0,packet_len_table[0x1aa]);
-
- WBUFW(buf,0)=0x1aa;
- WBUFL(buf,2)=pd->bl.id;
- if(param >= 100 && sd->petDB->talk_convert_class) {
- if(sd->petDB->talk_convert_class < 0)
- return 0;
- else if(sd->petDB->talk_convert_class > 0) {
- param -= (pd->class - 100)*100;
- param += (sd->petDB->talk_convert_class - 100)*100;
- }
- }
- WBUFL(buf,6)=param;
-
- clif_send(buf,packet_len_table[0x1aa],&pd->bl,AREA);
-
- return 0;
-}
-
-int clif_pet_performance(struct block_list *bl,int param)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, bl);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=4;
- WBUFL(buf,3)=bl->id;
- WBUFL(buf,7)=param;
-
- clif_send(buf,packet_len_table[0x1a4],bl,AREA);
-
- return 0;
-}
-
-int clif_pet_equip(struct pet_data *pd,int nameid)
-{
- unsigned char buf[16];
- int view;
-
- nullpo_retr(0, pd);
-
- memset(buf,0,packet_len_table[0x1a4]);
-
- WBUFW(buf,0)=0x1a4;
- WBUFB(buf,2)=3;
- WBUFL(buf,3)=pd->bl.id;
- if((view = itemdb_viewid(nameid)) > 0)
- WBUFL(buf,7)=view;
- else
- WBUFL(buf,7)=nameid;
-
- clif_send(buf,packet_len_table[0x1a4],&pd->bl,AREA);
-
- return 0;
-}
-
-int clif_pet_food(struct map_session_data *sd,int foodid,int fail)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1a3;
- WFIFOB(fd,2)=fail;
- WFIFOW(fd,3)=foodid;
- WFIFOSET(fd,packet_len_table[0x1a3]);
-
- return 0;
-}
-
-/*==========================================
- * ƒI[ƒgƒXƒyƒ‹ ƒŠƒXƒg‘—M
- *------------------------------------------
- */
-int clif_autospell(struct map_session_data *sd,int skilllv)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd, 0)=0x1cd;
-
- if(skilllv>0 && pc_checkskill(sd,MG_NAPALMBEAT)>0)
- WFIFOL(fd,2)= MG_NAPALMBEAT;
- else
- WFIFOL(fd,2)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_COLDBOLT)>0)
- WFIFOL(fd,6)= MG_COLDBOLT;
- else
- WFIFOL(fd,6)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_FIREBOLT)>0)
- WFIFOL(fd,10)= MG_FIREBOLT;
- else
- WFIFOL(fd,10)= 0x00000000;
- if(skilllv>1 && pc_checkskill(sd,MG_LIGHTNINGBOLT)>0)
- WFIFOL(fd,14)= MG_LIGHTNINGBOLT;
- else
- WFIFOL(fd,14)= 0x00000000;
- if(skilllv>4 && pc_checkskill(sd,MG_SOULSTRIKE)>0)
- WFIFOL(fd,18)= MG_SOULSTRIKE;
- else
- WFIFOL(fd,18)= 0x00000000;
- if(skilllv>7 && pc_checkskill(sd,MG_FIREBALL)>0)
- WFIFOL(fd,22)= MG_FIREBALL;
- else
- WFIFOL(fd,22)= 0x00000000;
- if(skilllv>9 && pc_checkskill(sd,MG_FROSTDIVER)>0)
- WFIFOL(fd,26)= MG_FROSTDIVER;
- else
- WFIFOL(fd,26)= 0x00000000;
-
- WFIFOSET(fd,packet_len_table[0x1cd]);
- return 0;
-}
-
-/*==========================================
- * ƒfƒBƒ{[ƒVƒ‡ƒ“‚Ì‚¢Ž…
- *------------------------------------------
- */
-int clif_devotion(struct map_session_data *sd,int target)
-{
- unsigned char buf[56];
- int n;
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1cf;
- WBUFL(buf,2)=sd->bl.id;
-// WBUFL(buf,6)=target;
- for(n=0;n<5;n++)
- WBUFL(buf,6+4*n)=sd->dev.val2[n];
-// WBUFL(buf,10+4*n)=0;
- WBUFB(buf,26)=8;
- WBUFB(buf,27)=0;
-
- clif_send(buf,packet_len_table[0x1cf],&sd->bl,AREA);
- return 0;
-}
-
-/*==========================================
- * Ÿ†‹…
- *------------------------------------------
- */
-int clif_spiritball(struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x1d0;
- WBUFL(buf,2)=sd->bl.id;
- WBUFW(buf,6)=sd->spiritball;
- clif_send(buf,packet_len_table[0x1d0],&sd->bl,AREA);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_combo_delay(struct block_list *bl,int wait)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf,0)=0x1d2;
- WBUFL(buf,2)=bl->id;
- WBUFL(buf,6)=wait;
- clif_send(buf,packet_len_table[0x1d2],bl,AREA);
-
- return 0;
-}
-/*==========================================
- *”’nŽæ‚è
- *------------------------------------------
- */
-int clif_bladestop(struct block_list *src,struct block_list *dst,
- int bool)
-{
- unsigned char buf[32];
-
- nullpo_retr(0, src);
- nullpo_retr(0, dst);
-
- WBUFW(buf,0)=0x1d1;
- WBUFL(buf,2)=src->id;
- WBUFL(buf,6)=dst->id;
- WBUFL(buf,10)=bool;
-
- clif_send(buf,packet_len_table[0x1d1],src,AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_changemapcell(int m,int x,int y,int cell_type,int type)
-{
- struct block_list bl;
- char buf[32];
-
- bl.m = m;
- bl.x = x;
- bl.y = y;
- WBUFW(buf,0) = 0x192;
- WBUFW(buf,2) = x;
- WBUFW(buf,4) = y;
- WBUFW(buf,6) = cell_type;
- memcpy(WBUFP(buf,8),map[m].name,16);
- if(!type)
- clif_send(buf,packet_len_table[0x192],&bl,AREA);
- else
- clif_send(buf,packet_len_table[0x192],&bl,ALL_SAMEMAP);
-
- return 0;
-}
-
-/*==========================================
- * MVPƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int clif_mvp_effect(struct map_session_data *sd)
-{
- unsigned char buf[16];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf,0)=0x10c;
- WBUFL(buf,2)=sd->bl.id;
- clif_send(buf,packet_len_table[0x10c],&sd->bl,AREA);
- return 0;
-}
-/*==========================================
- * MVPƒAƒCƒeƒ€Š“¾
- *------------------------------------------
- */
-int clif_mvp_item(struct map_session_data *sd,int nameid)
-{
- int view,fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10a;
- if((view = itemdb_viewid(nameid)) > 0)
- WFIFOW(fd,2)=view;
- else
- WFIFOW(fd,2)=nameid;
- WFIFOSET(fd,packet_len_table[0x10a]);
- return 0;
-}
-/*==========================================
- * MVPŒoŒ±’lŠ“¾
- *------------------------------------------
- */
-int clif_mvp_exp(struct map_session_data *sd,int exp)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x10b;
- WFIFOL(fd,2)=exp;
- WFIFOSET(fd,packet_len_table[0x10b]);
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh쬉”ےʒm
- *------------------------------------------
- */
-int clif_guild_created(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x167;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x167]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠ‘®’Ê’m
- *------------------------------------------
- */
-int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g)
-{
- int ps,fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- ps=guild_getposition(sd,g);
-
- memset(WFIFOP(fd,0),0,packet_len_table[0x16c]);
- WFIFOW(fd,0)=0x16c;
- WFIFOL(fd,2)=g->guild_id;
- WFIFOL(fd,6)=g->emblem_id;
- WFIFOL(fd,10)=g->position[ps].mode;
- memcpy(WFIFOP(fd,19),g->name,24);
- WFIFOSET(fd,packet_len_table[0x16c]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoƒƒOƒCƒ“’Ê’m
- *------------------------------------------
- */
-int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag)
-{
- unsigned char buf[64];
-
- nullpo_retr(0, g);
-
- WBUFW(buf, 0)=0x16d;
- WBUFL(buf, 2)=g->member[idx].account_id;
- WBUFL(buf, 6)=g->member[idx].char_id;
- WBUFL(buf,10)=flag;
- if(g->member[idx].sd==NULL){
- struct map_session_data *sd=guild_getavailablesd(g);
- if(sd!=NULL)
- clif_send(buf,packet_len_table[0x16d],&sd->bl,GUILD);
- }else
- clif_send(buf,packet_len_table[0x16d],&g->member[idx].sd->bl,GUILD_WOS);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒ}ƒXƒ^[’Ê’m(14d‚ւ̉ž“š)
- *------------------------------------------
- */
-int clif_guild_masterormember(struct map_session_data *sd)
-{
- int type=0x57,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g!=NULL && strcmp(g->master,sd->status.name)==0)
- type=0xd7;
- WFIFOW(fd,0)=0x14e;
- WFIFOL(fd,2)=type;
- WFIFOSET(fd,packet_len_table[0x14e]);
- return 0;
-}
-/*==========================================
- * Basic Info (Territories [Valaris])
- *------------------------------------------
- */
-int clif_guild_basicinfo(struct map_session_data *sd)
-{
- int fd,i,t=0;
- struct guild *g;
- struct guild_castle *gc=NULL;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
-
- WFIFOW(fd, 0)=0x1b6;//0x150;
- WFIFOL(fd, 2)=g->guild_id;
- WFIFOL(fd, 6)=g->guild_lv;
- WFIFOL(fd,10)=g->connect_member;
- WFIFOL(fd,14)=g->max_member;
- WFIFOL(fd,18)=g->average_lv;
- WFIFOL(fd,22)=g->exp;
- WFIFOL(fd,26)=g->next_exp;
- WFIFOL(fd,30)=0; // ã”[
- WFIFOL(fd,34)=0; // VWi«Ši‚̈«‚³HF«ŒüƒOƒ‰ƒt¶‰Ej
- WFIFOL(fd,38)=0; // RFi³‹`‚Ì“x‡‚¢HF«ŒüƒOƒ‰ƒt㉺j
- WFIFOL(fd,42)=0; // l”H
- memcpy(WFIFOP(fd,46),g->name,24);
- memcpy(WFIFOP(fd,70),g->master,24);
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(g->guild_id == gc->guild_id) t++;
- }
-
- if (t==1) memcpy(WFIFOP(fd,94),"One Castle",20);
- else if (t==2) memcpy(WFIFOP(fd,94),"Two Castles",20);
- else if (t==3) memcpy(WFIFOP(fd,94),"Three Castles",20);
- else if (t==4) memcpy(WFIFOP(fd,94),"Four Castles",20);
- else if (t==5) memcpy(WFIFOP(fd,94),"Five Castles",20);
- else if (t==6) memcpy(WFIFOP(fd,94),"Six Castles",20);
- else if (t==7) memcpy(WFIFOP(fd,94),"Seven Castles",20);
- else if (t==8) memcpy(WFIFOP(fd,94),"Eight Castles",20);
- else if (t==9) memcpy(WFIFOP(fd,94),"Nine Castles",20);
- else if (t==10) memcpy(WFIFOP(fd,94),"Ten Castles",20);
- else if (t==11) memcpy(WFIFOP(fd,94),"Eleven Castles",20);
- else if (t==12) memcpy(WFIFOP(fd,94),"Twelve Castles",20);
- else if (t==13) memcpy(WFIFOP(fd,94),"Thirteen Castles",20);
- else if (t==14) memcpy(WFIFOP(fd,94),"Fourteen Castles",20);
- else if (t==15) memcpy(WFIFOP(fd,94),"Fifteen Castles",20);
- else if (t==16) memcpy(WFIFOP(fd,94),"Sixteen Castles",20);
- else if (t==17) memcpy(WFIFOP(fd,94),"Seventeen Castles",20);
- else if (t==18) memcpy(WFIFOP(fd,94),"Eighteen Castles",20);
- else if (t==19) memcpy(WFIFOP(fd,94),"Nineteen Castles",20);
- else if (t==20) memcpy(WFIFOP(fd,94),"Twenty Castles",20);
- else if (t==21) memcpy(WFIFOP(fd,94),"Twenty One Castles",20);
- else if (t==22) memcpy(WFIFOP(fd,94),"Twenty Two Castles",20);
- else if (t==23) memcpy(WFIFOP(fd,94),"Twenty Three Castles",20);
- else if (t==24) memcpy(WFIFOP(fd,94),"Twenty Four Castles",20);
- else if (t==MAX_GUILDCASTLE) memcpy(WFIFOP(fd,94),"Total Domination",20);
- else memcpy(WFIFOP(fd,94),"None Taken",20);
-
- WFIFOSET(fd,packet_len_table[WFIFOW(fd,0)]);
- clif_guild_emblem(sd,g); // Guild emblem vanish fix [Valaris]
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿/“G‘Îî•ñ
- *------------------------------------------
- */
-int clif_guild_allianceinfo(struct map_session_data *sd)
-{
- int fd,i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x14c;
- for(i=c=0;i<MAX_GUILDALLIANCE;i++){
- struct guild_alliance *a=&g->alliance[i];
- if(a->guild_id>0){
- WFIFOL(fd,c*32+4)=a->opposition;
- WFIFOL(fd,c*32+8)=a->guild_id;
- memcpy(WFIFOP(fd,c*32+12),a->name,24);
- c++;
- }
- }
- WFIFOW(fd, 2)=c*32+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo[ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_memberlist(struct map_session_data *sd)
-{
- int fd;
- int i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
-
- WFIFOW(fd, 0)=0x154;
- for(i=0,c=0;i<g->max_member;i++){
- struct guild_member *m=&g->member[i];
- if(m->account_id==0)
- continue;
- WFIFOL(fd,c*104+ 4)=m->account_id;
- WFIFOL(fd,c*104+ 8)=m->char_id;
- WFIFOW(fd,c*104+12)=m->hair;
- WFIFOW(fd,c*104+14)=m->hair_color;
- WFIFOW(fd,c*104+16)=m->gender;
- WFIFOW(fd,c*104+18)=m->class;
- WFIFOW(fd,c*104+20)=m->lv;
- WFIFOL(fd,c*104+22)=m->exp;
- WFIFOL(fd,c*104+26)=m->online;
- WFIFOL(fd,c*104+30)=m->position;
- memset(WFIFOP(fd,c*104+34),0,50); // ƒƒ‚H
- memcpy(WFIFOP(fd,c*104+84),m->name,24);
- c++;
- }
- WFIFOW(fd, 2)=c*104+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðE–¼ƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_positionnamelist(struct map_session_data *sd)
-{
- int i,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x166;
- for(i=0;i<MAX_GUILDPOSITION;i++){
- WFIFOL(fd,i*28+4)=i;
- memcpy(WFIFOP(fd,i*28+8),g->position[i].name,24);
- }
- WFIFOW(fd,2)=i*28+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðEî•ñƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_positioninfolist(struct map_session_data *sd)
-{
- int i,fd;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd, 0)=0x160;
- for(i=0;i<MAX_GUILDPOSITION;i++){
- struct guild_position *p=&g->position[i];
- WFIFOL(fd,i*16+ 4)=i;
- WFIFOL(fd,i*16+ 8)=p->mode;
- WFIFOL(fd,i*16+12)=i;
- WFIFOL(fd,i*16+16)=p->exp_mode;
- }
- WFIFOW(fd, 2)=i*16+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh–ðE•ÏX’Ê’m
- *------------------------------------------
- */
-int clif_guild_positionchanged(struct guild *g,int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[128];
-
- nullpo_retr(0, g);
-
- WBUFW(buf, 0)=0x174;
- WBUFW(buf, 2)=44;
- WBUFL(buf, 4)=idx;
- WBUFL(buf, 8)=g->position[idx].mode;
- WBUFL(buf,12)=idx;
- WBUFL(buf,16)=g->position[idx].exp_mode;
- memcpy(WBUFP(buf,20),g->position[idx].name,24);
- if( (sd=guild_getavailablesd(g))!=NULL )
- clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo•ÏX’Ê’m
- *------------------------------------------
- */
-int clif_guild_memberpositionchanged(struct guild *g,int idx)
-{
- struct map_session_data *sd;
- unsigned char buf[64];
-
- nullpo_retr(0, g);
-
- WBUFW(buf, 0)=0x156;
- WBUFW(buf, 2)=16;
- WBUFL(buf, 4)=g->member[idx].account_id;
- WBUFL(buf, 8)=g->member[idx].char_id;
- WBUFL(buf,12)=g->member[idx].position;
- if( (sd=guild_getavailablesd(g))!=NULL )
- clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‘—M
- *------------------------------------------
- */
-int clif_guild_emblem(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
-
- if(g->emblem_len<=0)
- return 0;
- WFIFOW(fd,0)=0x152;
- WFIFOW(fd,2)=g->emblem_len+12;
- WFIFOL(fd,4)=g->guild_id;
- WFIFOL(fd,8)=g->emblem_id;
- memcpy(WFIFOP(fd,12),g->emblem_data,g->emblem_len);
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹‘—M
- *------------------------------------------
- */
-int clif_guild_skillinfo(struct map_session_data *sd)
-{
- int fd;
- int i,id,c,up=1;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd,0)=0x0162;
- WFIFOW(fd,4)=g->skill_point;
- for(i=c=0;i<MAX_GUILDSKILL;i++){
- if(g->skill[i].id>0){
- WFIFOW(fd,c*37+ 6) = id = g->skill[i].id;
- WFIFOW(fd,c*37+ 8) = guild_skill_get_inf(id);
- WFIFOW(fd,c*37+10) = 0;
- WFIFOW(fd,c*37+12) = g->skill[i].lv;
- WFIFOW(fd,c*37+14) = guild_skill_get_sp(id,g->skill[i].lv);
- WFIFOW(fd,c*37+16) = guild_skill_get_range(id);
- memset(WFIFOP(fd,c*37+18),0,24);
- if(g->skill[i].lv < guild_skill_get_max(id)) {
- //Kafra and Guardian changed to require Approval [Sara]
- if (g->skill[i].id == GD_KAFRACONTACT && guild_checkskill(g,GD_APPROVAL) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_GUARDIANRESEARCH && guild_checkskill(g,GD_APPROVAL) <= 0)
- up = 0;
- //Glory skill requirements -- Pretty sure correct [Sara]
- else if (g->skill[i].id == GD_LEADERSHIP && guild_checkskill(g,GD_GLORYGUILD) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_GLORYWOUNDS && guild_checkskill(g,GD_GLORYGUILD) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_SOULCOLD && guild_checkskill(g,GD_GLORYWOUNDS) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_HAWKEYES && guild_checkskill(g,GD_LEADERSHIP) <= 0)
- up = 0;
- //Activated skill requirements -- Just guesses [Sara]
- else if (g->skill[i].id == GD_BATTLEORDER && guild_checkskill(g,GD_APPROVAL) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_REGENERATION && guild_checkskill(g,GD_APPROVAL) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_RESTORE && guild_checkskill(g,GD_REGENERATION) <= 0)
- up = 0;
- else if (g->skill[i].id == GD_EMERGENCYCALL && guild_checkskill(g,GD_APPROVAL) <= 0)
- up = 0;
- if (g->skill[i].id == GD_GUARDUP && guild_checkskill(g,GD_GUARDIANRESEARCH) <= 0)
- up = 0;
- //Unadded yet? Has extension description in kRO tables
- else if (g->skill[i].id == GD_DEVELOPMENT)
- up = 0;
- else
- up = 1;
- }
- else {
- up = 0;
- }
- WFIFOB(fd,c*37+42)= up;
- c++;
- }
- }
- WFIFOW(fd,2)=c*37+6;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh’m‘—M
- *------------------------------------------
- */
-int clif_guild_notice(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- if(*g->mes1==0 && *g->mes2==0)
- return 0;
- WFIFOW(fd,0)=0x16f;
- memcpy(WFIFOP(fd,2),g->mes1,60);
- memcpy(WFIFOP(fd,62),g->mes2,120);
- WFIFOSET(fd,packet_len_table[0x16f]);
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoŠ©—U
- *------------------------------------------
- */
-int clif_guild_invite(struct map_session_data *sd,struct guild *g)
-{
- int fd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, g);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x16a;
- WFIFOL(fd,2)=g->guild_id;
- memcpy(WFIFOP(fd,6),g->name,24);
- WFIFOSET(fd,packet_len_table[0x16a]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒoŠ©—UŒ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_inviteack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x169;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x169]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ’Ê’m
- *------------------------------------------
- */
-int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf, 0)=0x15a;
- memcpy(WBUFP(buf, 2),name,24);
- memcpy(WBUFP(buf,26),mes,40);
- clif_send(buf,packet_len_table[0x15a],&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo’Ç•ú’Ê’m
- *------------------------------------------
- */
-int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes,
- int account_id)
-{
- unsigned char buf[128];
-
- nullpo_retr(0, sd);
-
- WBUFW(buf, 0)=0x15c;
- memcpy(WBUFP(buf, 2),name,24);
- memcpy(WBUFP(buf,26),mes,40);
- memcpy(WBUFP(buf,66),"dummy",24);
- clif_send(buf,packet_len_table[0x15c],&sd->bl,GUILD);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh’Ç•úƒƒ“ƒoƒŠƒXƒg
- *------------------------------------------
- */
-int clif_guild_explusionlist(struct map_session_data *sd)
-{
- int fd;
- int i,c;
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- return 0;
- WFIFOW(fd,0)=0x163;
- for(i=c=0;i<MAX_GUILDEXPLUSION;i++){
- struct guild_explusion *e=&g->explusion[i];
- if(e->account_id>0){
- memcpy(WFIFOP(fd,c*88+ 4),e->name,24);
- memcpy(WFIFOP(fd,c*88+28),e->acc,24);
- memcpy(WFIFOP(fd,c*88+52),e->mes,44);
- c++;
- }
- }
- WFIFOW(fd,2)=c*88+4;
- WFIFOSET(fd,WFIFOW(fd,2));
- return 0;
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ï˜b
- *------------------------------------------
- */
-int clif_guild_message(struct guild *g,int account_id,const char *mes,int len)
-{
- struct map_session_data *sd;
- unsigned char *buf;
-
- buf = (unsigned char*)aCalloc(len + 4, sizeof(unsigned char));
-
- WBUFW(buf, 0) = 0x17f;
- WBUFW(buf, 2) = len + 4;
- memcpy(WBUFP(buf,4), mes, len);
-
- if ((sd = guild_getavailablesd(g)) != NULL)
- clif_send(buf, WBUFW(buf,2), &sd->bl, GUILD);
-
- if(buf) free(buf);
-
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
- *------------------------------------------
- */
-int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0) = 0x10e;
- WFIFOW(fd,2) = skill_num;
- WFIFOW(fd,4) = lv;
- WFIFOW(fd,6) = guild_skill_get_sp(skill_num,lv);
- WFIFOW(fd,8) = guild_skill_get_range(skill_num);
- WFIFOB(fd,10) = 1;
- WFIFOSET(fd,11);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v¿
- *------------------------------------------
- */
-int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x171;
- WFIFOL(fd,2)=account_id;
- memcpy(WFIFOP(fd,6),name,24);
- WFIFOSET(fd,packet_len_table[0x171]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿Œ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_allianceack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x173;
- WFIFOL(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x173]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW‰ðÁ’Ê’m
- *------------------------------------------
- */
-int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x184;
- WFIFOL(fd,2)=guild_id;
- WFIFOL(fd,6)=flag;
- WFIFOSET(fd,packet_len_table[0x184]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒh“G‘ÎŒ‹‰Ê
- *------------------------------------------
- */
-int clif_guild_oppositionack(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x181;
- WFIFOB(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x181]);
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW’ljÁ
- *------------------------------------------
- */
-/*int clif_guild_allianceadded(struct guild *g,int idx)
-{
- unsigned char buf[64];
- WBUFW(fd,0)=0x185;
- WBUFL(fd,2)=g->alliance[idx].opposition;
- WBUFL(fd,6)=g->alliance[idx].guild_id;
- memcpy(WBUFP(fd,10),g->alliance[idx].name,24);
- clif_send(buf,packet_len_table[0x185],guild_getavailablesd(g),GUILD);
- return 0;
-}*/
-
-/*==========================================
- * ƒMƒ‹ƒh‰ðŽU’Ê’m
- *------------------------------------------
- */
-int clif_guild_broken(struct map_session_data *sd,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x15e;
- WFIFOL(fd,2)=flag;
- WFIFOSET(fd,packet_len_table[0x15e]);
- return 0;
-}
-
-/*==========================================
- * ƒGƒ‚[ƒVƒ‡ƒ“
- *------------------------------------------
- */
-void clif_emotion(struct block_list *bl,int type)
-{
- unsigned char buf[8];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0)=0xc0;
- WBUFL(buf,2)=bl->id;
- WBUFB(buf,6)=type;
- clif_send(buf,packet_len_table[0xc0],bl,AREA);
-}
-
-/*==========================================
- * ƒg[ƒL[ƒ{ƒbƒNƒX
- *------------------------------------------
- */
-void clif_talkiebox(struct block_list *bl,char* talkie)
-{
- unsigned char buf[86];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0)=0x191;
- WBUFL(buf,2)=bl->id;
- memcpy(WBUFP(buf,6),talkie,80);
- clif_send(buf,packet_len_table[0x191],bl,AREA);
-}
-
-/*==========================================
- * Œ‹¥ƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-void clif_wedding_effect(struct block_list *bl) {
- unsigned char buf[6];
-
- nullpo_retv(bl);
-
- WBUFW(buf,0) = 0x1ea;
- WBUFL(buf,2) = bl->id;
- clif_send(buf, packet_len_table[0x1ea], bl, AREA);
-}
-/*==========================================
- * ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž–¼‘O‹©‚Ñ
- *------------------------------------------
-
-void clif_callpartner(struct map_session_data *sd)
-{
- unsigned char buf[26];
- char *p;
-
- nullpo_retv(sd);
-
- if(sd->status.partner_id){
- WBUFW(buf,0)=0x1e6;
- p = map_charid2nick(sd->status.partner_id);
- if(p){
- memcpy(WBUFP(buf,2),p,24);
- }else{
- map_reqchariddb(sd,sd->status.partner_id);
- chrif_searchcharid(sd->status.partner_id);
- WBUFB(buf,2) = 0;
- }
- clif_send(buf,packet_len_table[0x1e6]&sd->bl,AREA);
- }
- return;
-}
-*/
-/*==========================================
- * À‚é
- *------------------------------------------
- */
-void clif_sitting(struct map_session_data *sd)
-{
- unsigned char buf[64];
-
- nullpo_retv(sd);
-
- WBUFW(buf, 0) = 0x8a;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFB(buf,26) = 2;
- clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len)
-{
- unsigned char *buf;
-
- nullpo_retr(0, sd);
-
- buf = (unsigned char*)aCalloc(len + 8, sizeof(unsigned char));
-
- WBUFW(buf, 0) = 0x17f;
- WBUFW(buf, 2) = len + 8;
- memcpy(WBUFP(buf,4), mes, len + 4);
-
- clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
-
- if(buf) free(buf);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-
-int clif_GM_kickack(struct map_session_data *sd, int id)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd = sd->fd;
- WFIFOW(fd,0) = 0xcd;
- WFIFOL(fd,2) = id;
- WFIFOSET(fd, packet_len_table[0xcd]);
- return 0;
-}
-
-void clif_parse_QuitGame(int fd,struct map_session_data *sd);
-
-int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type)
-{
- nullpo_retr(0, tsd);
-
- if(type)
- clif_GM_kickack(sd,tsd->status.account_id);
- tsd->opt1 = tsd->opt2 = 0;
- WFIFOW(tsd->fd,0) = 0x18b;
- WFIFOW(tsd->fd,2) = 0;
- WFIFOSET(tsd->fd,packet_len_table[0x18b]);
- clif_setwaitclose(tsd->fd);
-
- return 0;
-}
-/*==========================================
- * Wis‹‘”Û‹–‰Â‰ž“š
- *------------------------------------------
- */
-int clif_wisexin(struct map_session_data *sd,int type,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd1;
- WFIFOB(fd,2)=type;
- WFIFOB(fd,3)=flag;
- WFIFOSET(fd,packet_len_table[0xd1]);
-
- return 0;
-}
-/*==========================================
- * Wis‘S‹‘”Û‹–‰Â‰ž“š
- *------------------------------------------
- */
-int clif_wisall(struct map_session_data *sd,int type,int flag)
-{
- int fd;
-
- nullpo_retr(0, sd);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0xd2;
- WFIFOB(fd,2)=type;
- WFIFOB(fd,3)=flag;
- WFIFOSET(fd,packet_len_table[0xd2]);
-
- return 0;
-}
-/*==========================================
- * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type)
-{
- int fd;
-
- nullpo_retv(sd);
- nullpo_retv(bl);
-
- fd=sd->fd;
- WFIFOW(fd,0)=0x1d3;
- memcpy(WFIFOP(fd,2),name,24);
- WFIFOB(fd,26)=type;
- WFIFOL(fd,27)=0;
- WFIFOL(fd,31)=bl->id;
- WFIFOSET(fd,packet_len_table[0x1d3]);
-
- return;
-}
-// displaying special effects (npcs, weather, etc) [Valaris]
-int clif_specialeffect(struct block_list *bl, int type, int flag) {
- unsigned char buf[24];
-
- nullpo_retr(0, bl);
-
- memset(buf, 0, packet_len_table[0x1f3]);
-
- WBUFW(buf,0) = 0x1f3;
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,6) = type;
-
- if (flag == 2) {
- struct map_session_data *sd;
- int i;
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m)
- clif_specialeffect(&sd->bl, type, 1);
- }
- }
-
- else if (flag == 1)
- clif_send(buf, packet_len_table[0x1f3], bl, SELF);
- else if (!flag)
- clif_send(buf, packet_len_table[0x1f3], bl, AREA);
-
- return 0;
-
-}
-// ------------
-// clif_parse_*
-// ------------
-// ƒpƒPƒbƒg“Ç‚ÝŽæ‚Á‚ÄFX‘€ì
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_WantToConnection(int fd, struct map_session_data *sd)
-{
- struct map_session_data *old_sd;
- int account_id; // account_id in the packet 0x72 or 0x7E
-
- if (sd) {
- if (battle_config.error_log)
- printf("clif_parse_WantToConnection : invalid request?\n");
- return;
- }
-
- // 0x72
- if (RFIFOW(fd,0) == 0x72) {
- //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,12);
- else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,5);
- else // old packet version
- account_id = RFIFOL(fd,2);
- // 0x7E
- } else if (RFIFOW(fd,0) == 0x7E) {
- //printf("Received bytes %d with packet 0x7E.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,9);
- else
- account_id = RFIFOL(fd,12);
- // 0xF5
- } else {
- //printf("Received bytes %d with packet 0xF5.\n", RFIFOREST(fd));
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,7);
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,12);
- else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
- account_id = RFIFOL(fd,10);
- else // 29 28 28
- account_id = RFIFOL(fd,5);
- }
-
- // if same account already connected, we disconnect the 2 sessions
- if ((old_sd = map_id2sd(account_id)) != NULL) {
- clif_authfail_fd(fd, 2); // same id
- clif_authfail_fd(old_sd->fd, 2); // same id
- } else {
- sd = session[fd]->session_data = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data));
- sd->fd = fd;
-
- // 0x72
- if (RFIFOW(fd,0) == 0x72) {
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,22), RFIFOL(fd,30), RFIFOL(fd,34), RFIFOB(fd,38), fd);
- } else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 6; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,9), RFIFOL(fd,13), RFIFOL(fd,17), RFIFOB(fd,21), fd);
- } else { // old packet version
- sd->packet_ver = 5; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18), fd);
- }
- // 0x7E
- } else if (RFIFOW(fd,0) == 0x7E) {
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,21), RFIFOL(fd,28), RFIFOL(fd,32), RFIFOB(fd,36), fd);
- } else {
- sd->packet_ver = 8; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
- }
- // 0xF5
- } else {
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,15), RFIFOL(fd,25), RFIFOL(fd,29), RFIFOB(fd,33), fd);
- } else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 12; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
- } else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) { // 00 = Female, 01 = Male
- sd->packet_ver = 11; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,17), RFIFOL(fd,23), RFIFOL(fd,27), RFIFOB(fd,31), fd);
- } else { // 29
- sd->packet_ver = 13; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- pc_setnewpc(sd, account_id, RFIFOL(fd,14), RFIFOL(fd,20), RFIFOL(fd,24), RFIFOB(fd,28), fd);
- }
- }
-
- WFIFOL(fd,0) = sd->bl.id;
- WFIFOSET(fd,4);
-
- map_addiddb(&sd->bl);
-
- chrif_authreq(sd);
- }
-
- return;
-}
-
-/*==========================================
- * 007d ƒNƒ‰ƒCƒAƒ“ƒg‘¤ƒ}ƒbƒv“Ç‚Ýž‚ÝŠ®—¹
- * mapN“üŽž‚É•K—v‚ȃf[ƒ^‚ð‘S‚Ä‘—‚è‚‚¯‚é
- *------------------------------------------
- */
-void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
-{
-// struct item_data* item;
- int i;
- nullpo_retv(sd);
-
- if(sd->bl.prev != NULL)
- return;
-
- // Ú‘±okŽž
- //clif_authok();
- if(sd->npc_id) npc_event_dequeue(sd);
- clif_skillinfoblock(sd);
- pc_checkitem(sd);
- //guild_info();
-
- // loadendackŽž
- // next exp
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- // skill point
- clif_updatestatus(sd,SP_SKILLPOINT);
- // item
- clif_itemlist(sd);
- clif_equiplist(sd);
- // cart
- if(pc_iscarton(sd)){
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd,SP_CARTINFO);
- }
- // param all
- clif_initialstatus(sd);
- // party
- party_send_movemap(sd);
- // guild
- guild_send_memberinfoshort(sd,1);
- // 119
- // 78
-
- if(battle_config.pc_invincible_time > 0) {
- if(map[sd->bl.m].flag.gvg)
- pc_setinvincibletimer(sd,battle_config.pc_invincible_time<<1);
- else
- pc_setinvincibletimer(sd,battle_config.pc_invincible_time);
- }
-
- map_addblock(&sd->bl); // ƒuƒƒbƒN“o˜^
- clif_spawnpc(sd); // spawn
-
- // weight max , now
- clif_updatestatus(sd,SP_MAXWEIGHT);
- clif_updatestatus(sd,SP_WEIGHT);
-
- // pvp
- if(sd->pvp_timer!=-1 && !battle_config.pk_mode)
- delete_timer(sd->pvp_timer,pc_calc_pvprank_timer);
- if(map[sd->bl.m].flag.pvp){
- if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
- sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,sd->bl.id,0);
- sd->pvp_rank=0;
- sd->pvp_lastusers=0;
- sd->pvp_point=5;
- }
- clif_set0199(sd->fd,1);
- } else {
- sd->pvp_timer=-1;
- }
- if(map[sd->bl.m].flag.gvg) {
- clif_set0199(sd->fd,3);
- }
-
- // pet
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- clif_send_petstatus(sd);
- }
-
- if(sd->state.connect_new) {
- sd->state.connect_new = 0;
- if(sd->status.class != sd->view_class)
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 900)
- clif_pet_emotion(sd->pd,(sd->pd->class - 100)*100 + 50 + pet_hungry_val(sd));
-
-/* Stop players from spawning inside castles [Valaris] */
-
- {
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
- if (gc)
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,2);
- }
-
-/* End Addition [Valaris] */
-
- }
-
- // view equipment item
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
-#endif
- if(battle_config.save_clothcolor==1 && sd->status.clothes_color > 0)
- clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
-
- if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
- // ƒI[ƒgƒo[ƒT[ƒN”­“®
- skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
-// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600))
-// skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0);
-
- if(battle_config.muting_players && sd->status.manner < 0)
- skill_status_change_start(&sd->bl,SC_NOCHAT,0,0,0,0,0,0);
-
- // option
- clif_changeoption(&sd->bl);
- if(sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end(&sd->bl,SC_TRICKDEAD,-1);
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1)
- skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && sd->status.inventory[i].attribute==1)
- skill_status_change_start(&sd->bl,SC_BROKNWEAPON,0,0,0,0,0,0);
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && sd->status.inventory[i].attribute==1)
- skill_status_change_start(&sd->bl,SC_BROKNARMOR,0,0,0,0,0,0);
- }
-
- map_foreachinarea(clif_getareachar,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_TickSend(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- sd->client_tick = RFIFOL(fd,6);
- break;
- case 9:
- sd->client_tick = RFIFOL(fd,9);
- break;
- case 10:
- sd->client_tick = RFIFOL(fd,7);
- break;
- case 11:
- sd->client_tick = RFIFOL(fd,10);
- break;
- case 12:
- sd->client_tick = RFIFOL(fd,6);
- break;
- case 13:
- sd->client_tick = RFIFOL(fd,5);
- break;
- default: // old version by default (and version 6 + 7)
- sd->client_tick = RFIFOL(fd,2);
- break;
- }
- sd->server_tick = gettick();
- clif_servertick(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_WalkToXY(int fd, struct map_session_data *sd) {
- int x, y;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0) // ƒtƒŠ[ƒLƒƒƒXƒg
- return;
-
- if (sd->chatID)
- return;
-
- if (sd->canmove_tick > gettick())
- return;
-
- // ƒXƒe[ƒ^ƒXˆÙí‚âƒnƒCƒfƒBƒ“ƒO’†(ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu–³)‚Å“®‚¯‚È‚¢
- if ((sd->opt1 > 0 && sd->opt1 != 6) ||
- sd->sc_data[SC_ANKLE].timer !=-1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
- sd->sc_data[SC_AUTOCOUNTER].timer !=-1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_TRICKDEAD].timer !=-1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer !=-1 || //”’nŽæ‚è
- sd->sc_data[SC_SPIDERWEB].timer !=-1 || //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
- (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4)) //‡‘tƒXƒLƒ‹‰‰‘t’†‚Í“®‚¯‚È‚¢
- return;
- if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0)
- return;
-
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- pc_stopattack(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- x = RFIFOB(fd,5) * 4 + (RFIFOB(fd,6) >> 6);
- y = ((RFIFOB(fd,6) & 0x3f) << 4) + (RFIFOB(fd,7) >> 4);
- break;
- case 7:
- x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
- y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
- break;
- case 8:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- case 9:
- x = RFIFOB(fd,12) * 4 + (RFIFOB(fd,13) >> 6);
- y = ((RFIFOB(fd,13) & 0x3f) << 4) + (RFIFOB(fd,14) >> 4);
- break;
- case 10:
- x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
- y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
- break;
- case 11:
- x = RFIFOB(fd,11) * 4 + (RFIFOB(fd,12) >> 6);
- y = ((RFIFOB(fd,12) & 0x3f) << 4) + (RFIFOB(fd,13) >> 4);
- break;
- case 12:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- case 13:
- x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
- y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
- break;
- default: // old version by default
- x = RFIFOB(fd,2) * 4 + (RFIFOB(fd,3) >> 6);
- y = ((RFIFOB(fd,3) & 0x3f) << 4) + (RFIFOB(fd,4) >> 4);
- break;
- }
- pc_walktoxy(sd, x, y);
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_QuitGame(int fd, struct map_session_data *sd) {
- unsigned int tick=gettick();
- struct skill_unit_group* sg;
-
- nullpo_retv(sd);
-
- WFIFOW(fd,0) = 0x18b;
- if ((!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) ||
- sd->skilltimer != -1 ||
- (DIFF_TICK(tick, sd->canact_tick) < 0) ||
- (sd->sc_data && sd->sc_data[SC_DANCING].timer!=-1 && sd->sc_data[SC_DANCING].val4 && (sg=(struct skill_unit_group *)sd->sc_data[SC_DANCING].val2) && sg->src_id == sd->bl.id)) {
- WFIFOW(fd,2)=1;
- WFIFOSET(fd,packet_len_table[0x18b]);
- return;
- }
-
- /* Rovert's prevent logout option fixed [Valaris] */
- if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
- clif_setwaitclose(fd);
- WFIFOW(fd,2)=0;
- } else {
- WFIFOW(fd,2)=1;
- }
- WFIFOSET(fd,packet_len_table[0x18b]);
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) {
- struct block_list *bl;
- int account_id;
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- account_id = RFIFOL(fd,11);
- break;
- case 9:
- account_id = RFIFOL(fd,8);
- break;
- case 10:
- account_id = RFIFOL(fd,10);
- break;
- case 11:
- account_id = RFIFOL(fd,6);
- break;
- case 12:
- account_id = RFIFOL(fd,11);
- break;
- case 13:
- account_id = RFIFOL(fd,6);
- break;
- default: // old version by default (+ packet version 6 and 7)
- account_id = RFIFOL(fd,2);
- break;
- }
- bl = map_id2bl(account_id);
- if (bl == NULL)
- return;
-
- WFIFOW(fd,0) = 0x95;
- WFIFOL(fd,2) = account_id;
-
- switch(bl->type) {
- case BL_PC:
- {
- struct map_session_data *ssd = (struct map_session_data *)bl;
- struct party *p = NULL;
- struct guild *g = NULL;
-
- nullpo_retv(ssd);
-
- memcpy(WFIFOP(fd,6), ssd->status.name, 24);
- if (ssd->status.guild_id > 0 && (g = guild_search(ssd->status.guild_id)) != NULL &&
- (ssd->status.party_id == 0 || (p = party_search(ssd->status.party_id)) != NULL)) {
- // ƒMƒ‹ƒhŠ‘®‚È‚çƒpƒPƒbƒg0195‚ð•Ô‚·
- int i, ps = -1;
- for(i = 0; i < g->max_member; i++) {
- if (g->member[i].account_id == ssd->status.account_id &&
- g->member[i].char_id == ssd->status.char_id )
- ps = g->member[i].position;
- }
- if (ps >= 0 && ps < MAX_GUILDPOSITION) {
- WFIFOW(fd, 0) = 0x195;
- if (p)
- memcpy(WFIFOP(fd,30), p->name, 24);
- else
- WFIFOB(fd,30) = 0;
- memcpy(WFIFOP(fd,54), g->name,24);
- memcpy(WFIFOP(fd,78), g->position[ps].name, 24);
- WFIFOSET(fd,packet_len_table[0x195]);
- break;
- }
- }
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- break;
- case BL_PET:
- memcpy(WFIFOP(fd,6), ((struct pet_data*)bl)->name, 24);
- WFIFOSET(fd,packet_len_table[0x95]);
- break;
- case BL_NPC:
- memcpy(WFIFOP(fd,6), ((struct npc_data*)bl)->name, 24);
- WFIFOSET(fd,packet_len_table[0x95]);
- break;
- case BL_MOB:
- {
- struct mob_data *md = (struct mob_data *)bl;
-
- nullpo_retv(md);
-
- memcpy(WFIFOP(fd,6), md->name, 24);
- if (md->class >= 1285 && md->class <= 1288 && md->guild_id) {
- struct guild *g;
- struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name);
- if (gc && gc->guild_id > 0 && (g = guild_search(gc->guild_id)) != NULL) {
- WFIFOW(fd, 0) = 0x195;
- WFIFOB(fd,30) = 0;
- memcpy(WFIFOP(fd,54), g->name, 24);
- memcpy(WFIFOP(fd,78), gc->castle_name, 24);
- WFIFOSET(fd,packet_len_table[0x195]);
- } else {
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- } else if (battle_config.show_mob_hp == 1) {
- char mobhp[50];
- sprintf(mobhp, "hp: %d/%d", md->hp, mob_db[md->class].max_hp);
- WFIFOW(fd, 0) = 0x195;
- memcpy(WFIFOP(fd,30), mobhp, 24);
- WFIFOB(fd,54) = 0;
- WFIFOB(fd,78) = 0;
- WFIFOSET(fd,packet_len_table[0x195]);
- } else {
- WFIFOSET(fd,packet_len_table[0x95]);
- }
- }
- break;
- default:
- if (battle_config.error_log)
- printf("clif_parse_GetCharNameRequest : bad type %d(%d)\n", bl->type, account_id);
- break;
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <len>.w <str>.?B
- char *message;
- char *buf;
-
- nullpo_retv(sd);
-
- if ((is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) ||
- (sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer != -1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer != -1 ))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- message = (char*)aCalloc(RFIFOW(fd,2) + 128, sizeof(char));
- buf = (char*)aCalloc(RFIFOW(fd,2) + 4, sizeof(char));
-
- //printf("clif_parse_GlobalMessage: message: '%s'.\n", RFIFOP(fd,4));
- if (strncmp(RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) {
- printf("Hack on global message: character '%s' (account: %d), use an other name to send a (normal) message.\n", sd->status.name, sd->status.account_id);
-
- // information is sended to all online GM
- sprintf(message, "Hack on global message (normal message): character '%s' (account: %d) uses an other name.", sd->status.name, sd->status.account_id);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message, strlen(message) + 1);
- if (strlen(RFIFOP(fd,4)) == 0)
- strcpy(message, " This player sends a void name and a void message.");
- else
- sprintf(message, " This player sends (name:message): '%s'.", RFIFOP(fd,4));
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message, strlen(message) + 1);
- // message about the ban
- if (battle_config.ban_spoof_namer > 0)
- sprintf(message, " This player has been banned for %d minute(s).", battle_config.ban_spoof_namer);
- else
- sprintf(message, " 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, strlen(message) + 1);
-
- // if we ban people
- if (battle_config.ban_spoof_namer > 0) {
- chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_spoof_namer, 0); // type: 2 - ban (year, month, day, hour, minute, second)
- clif_setwaitclose(fd); // forced to disconnect because of the hack
- }
- // but for the hacker, we display on his screen (he see/look no difference).
- } else {
- // send message to others
- WBUFW(buf,0) = 0x8d;
- WBUFW(buf,2) = RFIFOW(fd,2) + 4; // len of message - 4 + 8
- WBUFL(buf,4) = sd->bl.id;
- memcpy(WBUFP(buf,8), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- clif_send(buf, WBUFW(buf,2), &sd->bl, sd->chatID ? CHAT_WOS : AREA_CHAT_WOC);
- }
-
- // send back message to the speaker
- memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
- WFIFOW(fd,0) = 0x8e;
- WFIFOSET(fd, WFIFOW(fd,2));
-
- if(message) free(message);
- if(buf) free(buf);
-
- return;
-}
-
-int clif_message(struct block_list *bl, char* msg)
-{
- unsigned short msg_len = strlen(msg) + 1;
- unsigned char buf[256];
-
- nullpo_retr(0, bl);
-
- WBUFW(buf, 0) = 0x8d;
- WBUFW(buf, 2) = msg_len + 8;
- WBUFL(buf, 4) = bl->id;
- memcpy(WBUFP(buf, 8), msg, msg_len);
-
- clif_send(buf, WBUFW(buf,2), bl, AREA);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_MapMove(int fd, struct map_session_data *sd) {
-// /m /mapmove (as @rura GM command)
- char output[100];
- char map_name[17];
-
- nullpo_retv(sd);
-
- memset(output, '\0', sizeof(output));
- memset(map_name, '\0', sizeof(map_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) {
- memcpy(map_name, RFIFOP(fd,2), 16);
- sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20));
- atcommand_rura(fd, sd, "@rura", output);
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChangeDir(int fd, struct map_session_data *sd) {
- unsigned char buf[64];
- short headdir, dir;
-
- nullpo_retv(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 7:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 8:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 9:
- headdir = RFIFOW(fd,7);
- dir = RFIFOB(fd,11);
- break;
- case 10:
- headdir = RFIFOW(fd,4);
- dir = RFIFOB(fd,9);
- break;
- case 11:
- headdir = RFIFOW(fd,8);
- dir = RFIFOB(fd,17);
- break;
- case 12:
- headdir = RFIFOW(fd,5);
- dir = RFIFOB(fd,12);
- break;
- case 13:
- headdir = RFIFOW(fd,6);
- dir = RFIFOB(fd,14);
- break;
- default: // old version by default (and packet version 6)
- headdir = RFIFOW(fd,2);
- dir = RFIFOB(fd,4);
- break;
- }
-
- pc_setdir(sd, dir, headdir);
-
- WBUFW(buf,0) = 0x9c;
- WBUFL(buf,2) = sd->bl.id;
- WBUFW(buf,6) = headdir;
- WBUFB(buf,8) = dir;
- if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
- clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA);
- else
- clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA_WOS);
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_Emotion(int fd, struct map_session_data *sd) {
- unsigned char buf[64];
-
- nullpo_retv(sd);
-
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 2) {
- WBUFW(buf,0) = 0xc0;
- WBUFL(buf,2) = sd->bl.id;
- WBUFB(buf,6) = RFIFOB(fd,2);
- clif_send(buf, packet_len_table[0xc0], &sd->bl, AREA);
- } else
- clif_skill_fail(sd, 1, 0, 1);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) {
- WFIFOW(fd,0) = 0xc2;
- WFIFOL(fd,2) = map_getusers();
- WFIFOSET(fd,packet_len_table[0xc2]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ActionRequest(int fd, struct map_session_data *sd) {
- unsigned int tick;
- unsigned char buf[64];
- int action_type, target_id;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 ||
- (sd->sc_data &&
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_DANCING].timer != -1))) //ƒ_ƒ“ƒX’†
- return;
-
- tick = gettick();
-
- pc_stop_walking(sd, 0);
- pc_stopattack(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 9:
- target_id = RFIFOL(fd,7);
- action_type = RFIFOB(fd,17);
- break;
- case 10:
- target_id = RFIFOL(fd,9);
- action_type = RFIFOB(fd,22);
- break;
- case 11:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 12:
- target_id = RFIFOL(fd,3);
- action_type = RFIFOB(fd,8);
- break;
- case 13:
- target_id = RFIFOL(fd,4);
- action_type = RFIFOB(fd,14);
- break;
- default: // old version by default (and packet version 6 and 7)
- target_id = RFIFOL(fd,2);
- action_type = RFIFOB(fd,6);
- break;
- }
-
- switch(action_type) {
- case 0x00: // once attack
- case 0x07: // continuous attack
- if(sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class==22)
- return;
- if (sd->vender_id != 0)
- return;
- if (!battle_config.sdelay_attack_enable && pc_checkskill(sd, SA_FREECAST) <= 0) {
- if (DIFF_TICK(tick, sd->canact_tick) < 0) {
- clif_skill_fail(sd, 1, 4, 0);
- return;
- }
- }
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->attacktarget > 0) // [Valaris]
- sd->attacktarget = 0;
- pc_attack(sd, target_id, action_type != 0);
- break;
- case 0x02: // sitdown
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 3) {
- pc_stop_walking(sd, 1);
- skill_gangsterparadise(sd, 1); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒXÝ’è
- pc_setsit(sd);
- clif_sitting(sd);
- } else
- clif_skill_fail(sd, 1, 0, 2);
- break;
- case 0x03: // standup
- skill_gangsterparadise(sd, 0); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX‰ðœ
- pc_setstand(sd);
- WBUFW(buf, 0) = 0x8a;
- WBUFL(buf, 2) = sd->bl.id;
- WBUFB(buf,26) = 3;
- clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
- break;
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_Restart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- switch(RFIFOB(fd,2)) {
- case 0x00:
- if (pc_isdead(sd)) {
- pc_setstand(sd);
- pc_setrestartvalue(sd, 3);
- pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 2);
- }
- break;
- case 0x01:
- if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND))))
- return;
-
- /* Rovert's Prevent logout option - Fixed [Valaris] */
- if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
- chrif_charselectreq(sd);
- } else {
- WFIFOW(fd,0)=0x18b;
- WFIFOW(fd,2)=1;
-
- WFIFOSET(fd,packet_len_table[0x018b]);
- }
- break;
- }
-}
-
-/*==========================================
- * Transmission of a wisp (S 0096 <len>.w <nick>.24B <message>.?B)
- *------------------------------------------
- */
-void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <nick>.24B <message>.?B // rewritten by [Yor]
- char *gm_command;
- struct map_session_data *dstsd;
- int i;
-
- //printf("clif_parse_Wis: message: '%s'.\n", RFIFOP(fd,28));
-
- gm_command = (char*)aCalloc(strlen(RFIFOP(fd,28)) + 28, sizeof(char)); // 24+3+(RFIFOW(fd,2)-28)+1 or 24+3+(strlen(RFIFOP(fd,28))+1 (size can be wrong with hacker)
-
- sprintf(gm_command, "%s : %s", sd->status.name, RFIFOP(fd,28));
- if ((is_atcommand(fd, sd, gm_command, 0) != AtCommand_None) ||
- (sd && sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer != -1))) //ƒ`ƒƒƒbƒg‹ÖŽ~
- {
- if(gm_command) free(gm_command);
- return;
- }
-
- if(gm_command) free(gm_command);
-
- // searching destination character
- dstsd = map_nick2sd(RFIFOP(fd,4));
- // player is not on this map-server
- if (dstsd == NULL ||
- // At this point, don't send wisp/page if it's not exactly the same name, because (example)
- // if there are 'Test' player on an other map-server and 'test' player on this map-server,
- // and if we ask for 'Test', we must not contact 'test' player
- // so, we send information to inter-server, which is the only one which decide (and copy correct name).
- strcmp(dstsd->status.name, RFIFOP(fd,4)) != 0) // not exactly same name
- // send message to inter-server
- intif_wis_message(sd, RFIFOP(fd,4), RFIFOP(fd,28), RFIFOW(fd,2)-28);
- // player is on this map-server
- else {
- // if you send to your self, don't send anything to others
- if (dstsd->fd == fd) // but, normaly, it's impossible!
- clif_wis_message(fd, wisp_server_name, "You can not page yourself. Sorry.", strlen("You can not page yourself. Sorry.") + 1);
- // otherwise, send message and answer immediatly
- else {
- if (dstsd->ignoreAll == 1)
- clif_wis_end(fd, 2); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- else {
- // if player ignore the source character
- for(i = 0; i < MAX_IGNORE_LIST; i++)
- if (strcmp(dstsd->ignore[i].name, sd->status.name) == 0) {
- clif_wis_end(fd, 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- break;
- }
- // if source player not found in ignore list
- if (i == MAX_IGNORE_LIST) {
- clif_wis_message(dstsd->fd, sd->status.name, RFIFOP(fd,28), RFIFOW(fd,2) - 28);
- clif_wis_end(fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- }
- }
- }
- }
-
- return;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_GMmessage(int fd, struct map_session_data *sd) {
-// /b
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Broadcast)))
- intif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2)-4, 0);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_TakeItem(int fd, struct map_session_data *sd) {
- struct flooritem_data *fitem;
- int map_object_id;
-
- nullpo_retv(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 7:
- map_object_id = RFIFOL(fd,6);
- break;
- case 8:
- map_object_id = RFIFOL(fd,6);
- break;
- case 9:
- map_object_id = RFIFOL(fd,9);
- break;
- case 10:
- map_object_id = RFIFOL(fd,7);
- break;
- case 11:
- map_object_id = RFIFOL(fd,10);
- break;
- case 12:
- map_object_id = RFIFOL(fd,6);
- break;
- case 13:
- map_object_id = RFIFOL(fd,5);
- break;
- default: // old version by default (and packet version 6)
- map_object_id = RFIFOL(fd,2);
- break;
- }
- fitem = (struct flooritem_data*)map_id2bl(map_object_id);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
-
- if( sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
- sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
- return;
-
- if (fitem == NULL || fitem->bl.m != sd->bl.m)
- return;
-
- pc_takeitem(sd, fitem);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_DropItem(int fd, struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id != 0 || sd->vender_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer != -1)) ) //ƒo[ƒT[ƒN
- return;
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOW(fd,12);
- break;
- case 9:
- item_index = RFIFOW(fd,8) - 2;
- item_amount = RFIFOW(fd,15);
- break;
- case 10:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOW(fd,15);
- break;
- case 11:
- item_index = RFIFOW(fd,12) - 2;
- item_amount = RFIFOW(fd,17);
- break;
- case 12:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOW(fd,12);
- break;
- case 13:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOW(fd,10);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 2;
- item_amount = RFIFOW(fd,4);
- break;
- }
-
- pc_dropitem(sd, item_index, item_amount);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_UseItem(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl, 1);
- return;
- }
- if (sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 ||
- (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
- sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
- sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
- return;
-
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- pc_useitem(sd,RFIFOW(fd,5)-2);
- break;
- case 7:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 8:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 9:
- pc_useitem(sd,RFIFOW(fd,9)-2);
- break;
- case 10:
- pc_useitem(sd,RFIFOW(fd,7)-2);
- break;
- case 11:
- pc_useitem(sd,RFIFOW(fd,10)-2);
- break;
- case 12:
- pc_useitem(sd,RFIFOW(fd,6)-2);
- break;
- case 13:
- pc_useitem(sd,RFIFOW(fd,5)-2);
- break;
- default: // old version by default
- pc_useitem(sd,RFIFOW(fd,2)-2);
- break;
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_EquipItem(int fd,struct map_session_data *sd)
-{
- int index;
-
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- index = RFIFOW(fd,2)-2;
- if(sd->npc_id!=0 || sd->vender_id != 0) return;
- if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 )) return;
-
- if(sd->status.inventory[index].identify != 1) { // –¢ŠÓ’è
- clif_equipitemack(sd,index,0,0); // fail
- return;
- }
- //ƒyƒbƒg—p‘•”õ‚Å‚ ‚é‚©‚È‚¢‚©
- if(sd->inventory_data[index]) {
- if(sd->inventory_data[index]->type != 8){
- if(sd->inventory_data[index]->type == 10)
- RFIFOW(fd,4)=0x8000; // –î‚ð–³—‚â‚è‘•”õ‚Å‚«‚é‚悤‚Éi||G
- pc_equipitem(sd,index,RFIFOW(fd,4));
- } else
- pet_equipitem(sd,index);
- }
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_UnequipItem(int fd,struct map_session_data *sd)
-{
- int index;
-
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- index = RFIFOW(fd,2)-2;
- if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNWEAPON].timer!=-1)
- skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
- if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNARMOR].timer!=-1)
- skill_status_change_end(&sd->bl,SC_BROKNARMOR,-1);
- if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 ))
- return;
-
- if(sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0)
- return;
- pc_unequipitem(sd,index,0);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcClicked(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(pc_isdead(sd)) {
- clif_clearchar_area(&sd->bl,1);
- return;
- }
- if(sd->npc_id!=0 || sd->vender_id != 0)
- return;
- npc_click(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd)
-{
- npc_buysellsel(sd,RFIFOL(fd,2),RFIFOB(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd)
-{
- int fail=0,n;
- unsigned short *item_list;
-
- n = (RFIFOW(fd,2)-4) /4;
- item_list = (unsigned short*)RFIFOP(fd,4);
-
- fail = npc_buylist(sd,n,item_list);
-
- WFIFOW(fd,0)=0xca;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xca]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd)
-{
- int fail=0,n;
- unsigned short *item_list;
-
- n = (RFIFOW(fd,2)-4) /4;
- item_list = (unsigned short*)RFIFOP(fd,4);
-
- fail = npc_selllist(sd,n,item_list);
-
- WFIFOW(fd,0)=0xcb;
- WFIFOB(fd,2)=fail;
- WFIFOSET(fd,packet_len_table[0xcb]);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd)
-{
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 4){
- chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15);
- } else
- clif_skill_fail(sd,1,0,3);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatAddMember(int fd,struct map_session_data *sd)
-{
- chat_joinchat(sd,RFIFOL(fd,2),RFIFOP(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd)
-{
- chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd)
-{
- chat_changechatowner(sd,RFIFOP(fd,6));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_KickFromChat(int fd,struct map_session_data *sd)
-{
- chat_kickchat(sd,RFIFOP(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_ChatLeave(int fd,struct map_session_data *sd)
-{
- chat_leavechat(sd);
-}
-
-/*==========================================
- * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
- *------------------------------------------
- */
-void clif_parse_TradeRequest(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 1){
- trade_traderequest(sd,RFIFOL(sd->fd,2));
- } else
- clif_skill_fail(sd,1,0,0);
-}
-
-/*==========================================
- * Žæˆø—v¿
- *------------------------------------------
- */
-void clif_parse_TradeAck(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- trade_tradeack(sd,RFIFOB(sd->fd,2));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-void clif_parse_TradeAddItem(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- trade_tradeadditem(sd,RFIFOW(sd->fd,2),RFIFOL(sd->fd,4));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- *------------------------------------------
- */
-void clif_parse_TradeOk(int fd,struct map_session_data *sd)
-{
- trade_tradeok(sd);
-}
-
-/*==========================================
- * ŽæˆøƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-void clif_parse_TradeCansel(int fd,struct map_session_data *sd)
-{
- trade_tradecancel(sd);
-}
-
-/*==========================================
- * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- *------------------------------------------
- */
-void clif_parse_TradeCommit(int fd,struct map_session_data *sd)
-{
- trade_tradecommit(sd);
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_StopAttack(int fd,struct map_session_data *sd)
-{
- pc_stopattack(sd);
-}
-
-/*==========================================
- * ƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
- *------------------------------------------
- */
-void clif_parse_PutItemToCart(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->npc_id!=0 || sd->vender_id != 0)
- return;
- pc_putitemtocart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
-}
-/*==========================================
- * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðo‚·
- *------------------------------------------
- */
-void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->npc_id!=0 || sd->vender_id != 0) return;
- pc_getitemfromcart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
-}
-
-/*==========================================
- * •t‘®•i(‘é,ƒyƒR,ƒJ[ƒg)‚ð‚Í‚¸‚·
- *------------------------------------------
- */
-void clif_parse_RemoveOption(int fd,struct map_session_data *sd)
-{
- if(pc_isriding(sd)) { // jobchange when removing peco [Valaris]
- if(sd->status.class==13)
- sd->status.class=sd->view_class=7;
-
- if(sd->status.class==21)
- sd->status.class=sd->view_class=14;
-
- if(sd->status.class==4014)
- sd->status.class=sd->view_class=4008;
-
- if(sd->status.class==4022)
- sd->status.class=sd->view_class=4015;
- }
-
- pc_setoption(sd,0);
-}
-
-/*==========================================
- * ƒ`ƒFƒ“ƒWƒJ[ƒg
- *------------------------------------------
- */
-void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
-{
- pc_setcart(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒe[ƒ^ƒXƒAƒbƒv
- *------------------------------------------
- */
-void clif_parse_StatusUp(int fd,struct map_session_data *sd)
-{
- pc_statusup(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŒƒxƒ‹ƒAƒbƒv
- *------------------------------------------
- */
-void clif_parse_SkillUp(int fd,struct map_session_data *sd)
-{
- pc_skillup(sd,RFIFOW(fd,2));
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piIDŽw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
- int skillnum, skilllv, lv, target_id;
- unsigned int tick = gettick();
-
- nullpo_retv(sd);
-
- if (sd->chatID || sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,9);
- target_id = RFIFOL(fd,11);
- break;
- case 7:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,9);
- target_id = RFIFOL(fd,15);
- break;
- case 8:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,12);
- target_id = RFIFOL(fd,16);
- break;
- case 9:
- skilllv = RFIFOW(fd,11);
- skillnum = RFIFOW(fd,18);
- target_id = RFIFOL(fd,22);
- break;
- case 10:
- skilllv = RFIFOW(fd,9);
- skillnum = RFIFOW(fd,15);
- target_id = RFIFOL(fd,18);
- break;
- case 11:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,7);
- target_id = RFIFOL(fd,10);
- break;
- case 12:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,12);
- target_id = RFIFOL(fd,16);
- break;
- case 13:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,10);
- target_id = RFIFOL(fd,22);
- break;
- default: // old version by default
- skilllv = RFIFOW(fd,2);
- skillnum = RFIFOW(fd,4);
- target_id = RFIFOL(fd,6);
- break;
- }
-
- if (skillnotok(skillnum, sd))
- return;
-
- if (sd->skilltimer != -1) {
- if (skillnum != SA_CASTCANCEL)
- return;
- } else if (DIFF_TICK(tick, sd->canact_tick) < 0) {
- clif_skill_fail(sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
- sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_id(sd, target_id, skillnum, skilllv);
- } else {
- sd->skillitem = sd->skillitemlv = -1;
- if (skillnum == MO_EXTREMITYFIST) {
- if ((sd->sc_data[SC_COMBO].timer == -1 || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_CHAINCRUSH))) {
- if (!sd->state.skill_flag ) {
- sd->state.skill_flag = 1;
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- } else if (sd->bl.id == target_id) {
- clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
- return;
- }
- }
- }
- if ((lv = pc_checkskill(sd, skillnum)) > 0) {
- if (skilllv > lv)
- skilllv = lv;
- skill_use_id(sd, target_id, skillnum, skilllv);
- if (sd->state.skill_flag)
- sd->state.skill_flag = 0;
- }
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) {
- int skillnum, skilllv, lv, x, y;
- unsigned int tick = gettick();
- int skillmoreinfo;
-
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0) return;
- if(sd->chatID) return;
-
- skillmoreinfo = -1;
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 6:
- skilllv = RFIFOW(fd,4);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,11);
- y = RFIFOW(fd,13);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 15;
- break;
- case 7:
- skilllv = RFIFOW(fd,7);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,15);
- y = RFIFOW(fd,17);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 19;
- break;
- case 8:
- skilllv = RFIFOW(fd,3);
- skillnum = RFIFOW(fd,6);
- x = RFIFOW(fd,17);
- y = RFIFOW(fd,21);
- if (RFIFOW(fd,0) == 0x0a2)
- skillmoreinfo = 23;
- break;
- case 9:
- skilllv = RFIFOW(fd,5);
- skillnum = RFIFOW(fd,15);
- x = RFIFOW(fd,29);
- y = RFIFOW(fd,38);
- if (RFIFOW(fd,0) == 0x0a2)
- skillmoreinfo = 40;
- break;
- case 10:
- skilllv = RFIFOW(fd,10);
- skillnum = RFIFOW(fd,14);
- x = RFIFOW(fd,18);
- y = RFIFOW(fd,23);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 25;
- break;
- case 11:
- skilllv = RFIFOW(fd,6); // 16? to check.
- skillnum = RFIFOW(fd,20);
- x = RFIFOW(fd,23);
- y = RFIFOW(fd,27);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 29;
- break;
- case 12:
- skilllv = RFIFOW(fd,3); // 2? to check.
- skillnum = RFIFOW(fd,6);
- x = RFIFOW(fd,17);
- y = RFIFOW(fd,21);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 23;
- break;
- case 13:
- skilllv = RFIFOW(fd,6);
- skillnum = RFIFOW(fd,9);
- x = RFIFOW(fd,23);
- y = RFIFOW(fd,26);
- if (RFIFOW(fd,0) == 0x08c)
- skillmoreinfo = 28;
- break;
- default: // old version by default
- skilllv = RFIFOW(fd,2);
- skillnum = RFIFOW(fd,4);
- x = RFIFOW(fd,6);
- y = RFIFOW(fd,8);
- if (RFIFOW(fd,0) == 0x190)
- skillmoreinfo = 10;
- break;
- }
-
- if (skillnotok(skillnum, sd))
- return;
-
- if (skillmoreinfo != -1) {
- if (pc_issit(sd)) {
- clif_skill_fail(sd, skillnum, 0, 0);
- return;
- }
- memcpy(talkie_mes, RFIFOP(fd,skillmoreinfo), 80);
- }
-
- if (sd->skilltimer != -1)
- return;
- else if (DIFF_TICK(tick, sd->canact_tick) < 0) {
- clif_skill_fail(sd, skillnum, 4, 0);
- return;
- }
-
- if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
- sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
- sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
- return;
- if (sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
- if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
- if (skilllv != sd->skillitemlv)
- skilllv = sd->skillitemlv;
- skill_use_pos(sd, x, y, skillnum, skilllv);
- } else {
- sd->skillitem = sd->skillitemlv = -1;
- if ((lv = pc_checkskill(sd, skillnum)) > 0) {
- if (skilllv > lv)
- skilllv = lv;
- skill_use_pos(sd, x, y, skillnum,skilllv);
- }
- }
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pimapŽw’èj
- *------------------------------------------
- */
-void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(sd->chatID) return;
-
- if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->sc_data &&
- (sd->sc_data[SC_TRICKDEAD].timer != -1 ||
- sd->sc_data[SC_BERSERK].timer!=-1 ||
- sd->sc_data[SC_NOCHAT].timer!=-1 ||
- sd->sc_data[SC_WEDDING].timer!=-1 ||
- sd->view_class==22)))
- return;
-
- if(sd->invincible_timer != -1)
- pc_delinvincibletimer(sd);
-
- skill_castend_map(sd,RFIFOW(fd,2),RFIFOP(fd,4));
-}
-/*==========================================
- * ƒƒ‚—v‹
- *------------------------------------------
- */
-void clif_parse_RequestMemo(int fd,struct map_session_data *sd)
-{
- pc_memo(sd,-1);
-}
-/*==========================================
- * ƒAƒCƒeƒ€‡¬
- *------------------------------------------
- */
-void clif_parse_ProduceMix(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->state.produce_flag = 0;
- skill_produce_mix(sd,RFIFOW(fd,2),RFIFOW(fd,4),RFIFOW(fd,6),RFIFOW(fd,8));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->npc_menu=RFIFOB(fd,6);
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd)
-{
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
-#define RFIFOL_(fd,pos) (*(int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
- //Input Value overflow Exploit FIX
- sd->npc_amount=RFIFOL_(fd,6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int)
-
-#undef RFIFOL_
-
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcStringInput(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- if(RFIFOW(fd,2)-7 >= sizeof(sd->npc_str)){
- printf("clif: input string too long !\n");
- memcpy(sd->npc_str,RFIFOP(fd,8),sizeof(sd->npc_str));
- sd->npc_str[sizeof(sd->npc_str)-1]=0;
- } else
- strcpy(sd->npc_str,RFIFOP(fd,8));
- npc_scriptcont(sd,RFIFOL(fd,4));
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd)
-{
- npc_scriptcont(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ŠÓ’è
- *------------------------------------------
- */
-void clif_parse_ItemIdentify(int fd,struct map_session_data *sd)
-{
- pc_item_identify(sd,RFIFOW(fd,2)-2);
-}
-/*==========================================
- * –îì¬
- *------------------------------------------
- */
-void clif_parse_SelectArrow(int fd,struct map_session_data *sd)
-{
- nullpo_retv(sd);
-
- sd->state.make_arrow_flag = 0;
- skill_arrow_create(sd,RFIFOW(fd,2));
-}
-/*==========================================
- * ƒI[ƒgƒXƒyƒ‹ŽóM
- *------------------------------------------
- */
-void clif_parse_AutoSpell(int fd,struct map_session_data *sd)
-{
- skill_autospell(sd,RFIFOW(fd,2));
-}
-/*==========================================
- * ƒJ[ƒhŽg—p
- *------------------------------------------
- */
-void clif_parse_UseCard(int fd,struct map_session_data *sd)
-{
- clif_use_card(sd,RFIFOW(fd,2)-2);
-}
-/*==========================================
- * ƒJ[ƒh‘}“ü‘•”õ‘I‘ð
- *------------------------------------------
- */
-void clif_parse_InsertCard(int fd,struct map_session_data *sd)
-{
- pc_insert_card(sd,RFIFOW(fd,2)-2,RFIFOW(fd,4)-2);
-}
-
-/*==========================================
- * 0193 ƒLƒƒƒ‰ID–¼‘Oˆø‚«
- *------------------------------------------
- */
-void clif_parse_SolveCharName(int fd, struct map_session_data *sd) {
- int char_id;
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- char_id = RFIFOL(fd,8);
- break;
- case 9:
- char_id = RFIFOL(fd,7);
- break;
- case 10:
- char_id = RFIFOL(fd,10);
- break;
- case 11:
- char_id = RFIFOL(fd,6);
- break;
- case 12:
- char_id = RFIFOL(fd,8);
- break;
- case 13:
- char_id = RFIFOL(fd,12);
- break;
- default: // old version by default (+ packet version 6 and 7)
- char_id = RFIFOL(fd,2);
- break;
- }
- clif_solved_charname(sd, char_id);
-}
-
-/*==========================================
- * 0197 /resetskill /resetstate
- *------------------------------------------
- */
-void clif_parse_ResetChar(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
- switch(RFIFOW(fd,2)){
- case 0:
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState))
- pc_resetstate(sd);
- break;
- case 1:
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState))
- pc_resetskill(sd);
- break;
- }
- }
-}
-
-/*==========================================
- * 019c /lb“™
- *------------------------------------------
- */
-void clif_parse_LGMmessage(int fd, struct map_session_data *sd) {
- unsigned char buf[64];
-
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_LocalBroadcast))) {
- WBUFW(buf,0) = 0x9a;
- WBUFW(buf,2) = RFIFOW(fd,2);
- memcpy(WBUFP(buf,4), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
- clif_send(buf, RFIFOW(fd,2), &sd->bl, ALL_SAMEMAP);
- }
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
- *------------------------------------------
- */
-void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,12);
- break;
- case 9:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,19);
- break;
- case 10:
- item_index = RFIFOW(fd,3) - 2;
- item_amount = RFIFOL(fd,15);
- break;
- case 11:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOL(fd,21);
- break;
- case 12:
- item_index = RFIFOW(fd,5) - 2;
- item_amount = RFIFOL(fd,12);
- break;
- case 13:
- item_index = RFIFOW(fd,6) - 2;
- item_amount = RFIFOL(fd,9);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 2;
- item_amount = RFIFOL(fd,4);
- break;
- }
-
- if (item_index < 0 || item_index >= MAX_INVENTORY)
- return;
-
- if (sd->state.storage_flag)
- storage_guild_storageadd(sd, item_index, item_amount);
- else
- storage_storageadd(sd, item_index, item_amount);
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) {
- int item_index, item_amount;
-
- nullpo_retv(sd);
-
- switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- case 8:
- item_index = RFIFOW(fd,10) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 9:
- item_index = RFIFOW(fd,11) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 10:
- item_index = RFIFOW(fd,3) - 1;
- item_amount = RFIFOL(fd,13);
- break;
- case 11:
- item_index = RFIFOW(fd,4) - 1;
- item_amount = RFIFOL(fd,8);
- break;
- case 12:
- item_index = RFIFOW(fd,10) - 1;
- item_amount = RFIFOL(fd,22);
- break;
- case 13:
- item_index = RFIFOW(fd,12) - 1;
- item_amount = RFIFOL(fd,18);
- break;
- default: // old version by default (+ packet version 6 and 7)
- item_index = RFIFOW(fd,2) - 1;
- item_amount = RFIFOL(fd,4);
- break;
- }
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
-
- if (sd->state.storage_flag)
- storage_guild_storageget(sd, item_index, item_amount);
- else
- storage_storageget(sd, item_index, item_amount);
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
- *------------------------------------------
- */
-void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0 || sd->trade_partner != 0)
- return;
- if (sd->state.storage_flag)
- storage_guild_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
- else
- storage_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->npc_id != 0 || sd->vender_id != 0)
- return;
- if (sd->state.storage_flag)
- storage_guild_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
- else
- storage_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-void clif_parse_CloseKafra(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (sd->state.storage_flag)
- storage_guild_storageclose(sd);
- else
- storage_storageclose(sd);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateParty(int fd, struct map_session_data *sd) {
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) {
- party_create(sd,RFIFOP(fd,2));
- } else
- clif_skill_fail(sd,1,0,4);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateParty2(int fd, struct map_session_data *sd) {
- if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){
- party_create(sd, RFIFOP(fd,2));
- } else
- clif_skill_fail(sd, 1, 0, 4);
-}
-
-/*==========================================
- * ƒp[ƒeƒB‚ÉŠ©—U
- *------------------------------------------
- */
-void clif_parse_PartyInvite(int fd, struct map_session_data *sd) {
- party_invite(sd, RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒp[ƒeƒBŠ©—U•Ô“š
- *------------------------------------------
- */
-void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) {
- if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 5){
- party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6));
- } else {
- party_reply_invite(sd,RFIFOL(fd,2),-1);
- clif_skill_fail(sd,1,0,4);
- }
-}
-
-/*==========================================
- * ƒp[ƒeƒB’E‘Þ—v‹
- *------------------------------------------
- */
-void clif_parse_LeaveParty(int fd, struct map_session_data *sd) {
- party_leave(sd);
-}
-
-/*==========================================
- * ƒp[ƒeƒBœ–¼—v‹
- *------------------------------------------
- */
-void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) {
- party_removemember(sd,RFIFOL(fd,2),RFIFOP(fd,6));
-}
-
-/*==========================================
- * ƒp[ƒeƒBÝ’è•ÏX—v‹
- *------------------------------------------
- */
-void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) {
- party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4));
-}
-
-/*==========================================
- * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M—v‹
- *------------------------------------------
- */
-void clif_parse_PartyMessage(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None)
- return;
- if(sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer!=-1)) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- party_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4);
-}
-
-/*==========================================
- * ˜I“X•Â½
- *------------------------------------------
- */
-void clif_parse_CloseVending(int fd, struct map_session_data *sd) {
- vending_closevending(sd);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
- *------------------------------------------
- */
-void clif_parse_VendingListReq(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- vending_vendinglistreq(sd,RFIFOL(fd,2));
- if(sd->npc_id)
- npc_event_dequeue(sd);
-}
-
-/*==========================================
- * ˜I“XƒAƒCƒeƒ€w“ü
- *------------------------------------------
- */
-void clif_parse_PurchaseReq(int fd, struct map_session_data *sd) {
- vending_purchasereq(sd, RFIFOW(fd,2), RFIFOL(fd,4), RFIFOP(fd,8));
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-void clif_parse_OpenVending(int fd,struct map_session_data *sd) {
- vending_openvending(sd, RFIFOW(fd,2), RFIFOP(fd,4), RFIFOB(fd,84), RFIFOP(fd,85));
-}
-
-/*==========================================
- * /monster /item rewriten by [Yor]
- *------------------------------------------
- */
-void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
- char monster_item_name[25];
-
- nullpo_retv(sd);
-
- memset(monster_item_name, '\0', sizeof(monster_item_name));
-
- if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
- memcpy(monster_item_name, RFIFOP(fd,2), 24);
-
- if (mobdb_searchname(monster_item_name) != 0) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster))
- atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn
- } else if (itemdb_searchname(monster_item_name) != NULL) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item))
- atcommand_item(fd, sd, "@item", monster_item_name); // as @item
- }
-
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‚ðì‚é
- *------------------------------------------
- */
-void clif_parse_CreateGuild(int fd,struct map_session_data *sd) {
- guild_create(sd, RFIFOP(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒ}ƒXƒ^[‚©‚Ç‚¤‚©Šm”F
- *------------------------------------------
- */
-void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) {
- clif_guild_masterormember(sd);
-}
-
-/*==========================================
- * ƒMƒ‹ƒhî•ñ—v‹
- *------------------------------------------
- */
-void clif_parse_GuildReqeustInfo(int fd, struct map_session_data *sd) {
- switch(RFIFOL(fd,2)){
- case 0: // ƒMƒ‹ƒhŠî–{î•ñA“¯–¿“G‘Îî•ñ
- clif_guild_basicinfo(sd);
- clif_guild_allianceinfo(sd);
- break;
- case 1: // ƒƒ“ƒo[ƒŠƒXƒgA–ðE–¼ƒŠƒXƒg
- clif_guild_positionnamelist(sd);
- clif_guild_memberlist(sd);
- break;
- case 2: // –ðE–¼ƒŠƒXƒgA–ðEî•ñƒŠƒXƒg
- clif_guild_positionnamelist(sd);
- clif_guild_positioninfolist(sd);
- break;
- case 3: // ƒXƒLƒ‹ƒŠƒXƒg
- clif_guild_skillinfo(sd);
- break;
- case 4: // ’Ç•úƒŠƒXƒg
- clif_guild_explusionlist(sd);
- break;
- default:
- if (battle_config.error_log)
- printf("clif: guild request info: unknown type %d\n", RFIFOL(fd,2));
- break;
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒh–ðE•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) {
- int i;
-
- for(i = 4; i < RFIFOW(fd,2); i += 40 ){
- guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), RFIFOP(fd,i+16));
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒƒ“ƒo–ðE•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) {
- int i;
-
- nullpo_retv(sd);
-
- for(i=4;i<RFIFOW(fd,2);i+=12){
- guild_change_memberposition(sd->status.guild_id,
- RFIFOL(fd,i),RFIFOL(fd,i+4),RFIFOL(fd,i+8));
- }
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€—v‹
- *------------------------------------------
- */
-void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) {
- struct guild *g=guild_search(RFIFOL(fd,2));
- if(g!=NULL)
- clif_guild_emblem(sd,g);
-}
-
-/*==========================================
- * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) {
- guild_change_emblem(sd,RFIFOW(fd,2)-4,RFIFOP(fd,4));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’m•ÏX
- *------------------------------------------
- */
-void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd) {
- guild_change_notice(sd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠ©—U
- *------------------------------------------
- */
-void clif_parse_GuildInvite(int fd,struct map_session_data *sd) {
- guild_invite(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠ©—U•ÔM
- *------------------------------------------
- */
-void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) {
- guild_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’E‘Þ
- *------------------------------------------
- */
-void clif_parse_GuildLeave(int fd,struct map_session_data *sd) {
- guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh’Ç•ú
- *------------------------------------------
- */
-void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) {
- guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ï˜b
- *------------------------------------------
- */
-void clif_parse_GuildMessage(int fd,struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if (is_atcommand(fd, sd, RFIFOP(fd, 4), 0) != AtCommand_None)
- return;
- if(sd->sc_data &&
- (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
- sd->sc_data[SC_NOCHAT].timer!=-1)) //ƒ`ƒƒƒbƒg‹ÖŽ~
- return;
-
- guild_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4);
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v‹
- *------------------------------------------
- */
-void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) {
- guild_reqalliance(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“¯–¿—v‹•ÔM
- *------------------------------------------
- */
-void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) {
- guild_reply_reqalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒhŠÖŒW‰ðÁ
- *------------------------------------------
- */
-void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) {
- guild_delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh“G‘Î
- *------------------------------------------
- */
-void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) {
- guild_opposition(sd,RFIFOL(fd,2));
-}
-
-/*==========================================
- * ƒMƒ‹ƒh‰ðŽU
- *------------------------------------------
- */
-void clif_parse_GuildBreak(int fd, struct map_session_data *sd) {
- guild_break(sd,RFIFOP(fd,2));
-}
-
-// pet
-void clif_parse_PetMenu(int fd, struct map_session_data *sd) {
- pet_menu(sd,RFIFOB(fd,2));
-}
-
-void clif_parse_CatchPet(int fd, struct map_session_data *sd) {
- pet_catch_process2(sd,RFIFOL(fd,2));
-}
-
-void clif_parse_SelectEgg(int fd, struct map_session_data *sd) {
- pet_select_egg(sd,RFIFOW(fd,2)-2);
-}
-
-void clif_parse_SendEmotion(int fd, struct map_session_data *sd) {
- nullpo_retv(sd);
-
- if(sd->pd)
- clif_pet_emotion(sd->pd,RFIFOL(fd,2));
-}
-
-void clif_parse_ChangePetName(int fd, struct map_session_data *sd) {
- pet_change_name(sd,RFIFOP(fd,2));
-}
-
-// Kick (right click menu for GM "(name) force to quit")
-void clif_parse_GMKick(int fd, struct map_session_data *sd) {
- struct block_list *target;
- int tid = RFIFOL(fd,2);
-
- nullpo_retv(sd);
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Kick))) {
- target = map_id2bl(tid);
- if (target) {
- if (target->type == BL_PC) {
- struct map_session_data *tsd = (struct map_session_data *)target;
- if (pc_isGM(sd) > pc_isGM(tsd))
- clif_GM_kick(sd, tsd, 1);
- else
- clif_GM_kickack(sd, 0);
- } else if (target->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)target;
- sd->state.attack_type = 0;
- mob_damage(&sd->bl, md, md->hp, 2);
- } else
- clif_GM_kickack(sd, 0);
- } else
- clif_GM_kickack(sd, 0);
- }
-}
-
-/*==========================================
- * /shift
- *------------------------------------------
- */
-void clif_parse_Shift(int fd, struct map_session_data *sd) { // Rewriten by [Yor]
- char player_name[25];
-
- nullpo_retv(sd);
-
- memset(player_name, '\0', sizeof(player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_JumpTo))) {
- memcpy(player_name, RFIFOP(fd,2), 24);
- atcommand_jumpto(fd, sd, "@jumpto", player_name); // as @jumpto
- }
-
- return;
-}
-
-/*==========================================
- * /recall
- *------------------------------------------
- */
-void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT
- char player_name[25];
-
- nullpo_retv(sd);
-
- memset(player_name, '\0', sizeof(player_name));
-
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Recall))) {
- memcpy(player_name, RFIFOP(fd,2), 24);
- atcommand_recall(fd, sd, "@recall", player_name); // as @recall
- }
-
- return;
-}
-
-void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
- nullpo_retv(sd);
-
- //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) {
- if (sd->status.option & OPTION_HIDE) { // OPTION_HIDE = 0x40
- sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage(fd, "Invisible: Off.");
- } else {
- sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40
- clif_displaymessage(fd, "Invisible: On.");
- }
- clif_changeoption(&sd->bl);
- }
-}
-
-/*==========================================
- * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ•t—^
- *------------------------------------------
- */
-void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
-{
- int tid = RFIFOL(fd,2);
- int type = RFIFOB(fd,6);
- int limit = RFIFOW(fd,7);
- struct block_list *bl = map_id2bl(tid);
- struct map_session_data *dstsd;
- int dstfd;
-
- nullpo_retv(sd);
-
- if(!battle_config.muting_players) {
- clif_displaymessage(fd, "Muting is disabled.");
- return;
- }
-
- if(type == 0)
- limit = 0 - limit;
- if(bl->type == BL_PC && (dstsd =(struct map_session_data *)bl)){
- if((tid == bl->id && type == 2 && !pc_isGM(sd)) || (pc_isGM(sd) > pc_isGM(dstsd)) ){
- dstfd = dstsd->fd;
- WFIFOW(dstfd,0)=0x14b;
- WFIFOB(dstfd,2)=(type==2)?1:type;
- memcpy(WFIFOP(dstfd,3),sd->status.name,24);
- WFIFOSET(dstfd,packet_len_table[0x14b]);
- dstsd->status.manner -= limit;
- if(dstsd->status.manner < 0)
- skill_status_change_start(bl,SC_NOCHAT,0,0,0,0,0,0);
- else{
- dstsd->status.manner = 0;
- skill_status_change_end(bl,SC_NOCHAT,-1);
- }
- printf("name:%s type:%d limit:%d manner:%d\n",dstsd->status.name,type,limit,dstsd->status.manner);
- }
- }
-
- return;
-}
-/*==========================================
- * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔŽQÆiHj
- *------------------------------------------
- */
-void clif_parse_GMReqNoChatCount(int fd, struct map_session_data *sd)
-{
- int tid = RFIFOL(fd,2);
-
- WFIFOW(fd,0) = 0x1e0;
- WFIFOL(fd,2) = tid;
- sprintf(WFIFOP(fd,6),"%d",tid);
-// memcpy(WFIFOP(fd,6), "TESTNAME", 24);
- WFIFOSET(fd, packet_len_table[0x1e0]);
-
- return;
-}
-
-void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
- char output[512];
- char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick
- int i, pos;
-
- memset(output, '\0', sizeof(output));
-
- nick = RFIFOP(fd,2); // speed up
- RFIFOB(fd,25) = '\0'; // to be sure that the player name have at maximum 23 characters
- //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26));
-
- WFIFOW(fd,0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = RFIFOB(fd,26);
- // do nothing only if nick can not exist
- if (strlen(nick) < 4) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- if (RFIFOB(fd,26) == 0) // type
- clif_wis_message(fd, wisp_server_name, "It's impossible to block this player.", strlen("It's impossible to block this player.") + 1);
- else
- clif_wis_message(fd, wisp_server_name, "It's impossible to unblock this player.", strlen("It's impossible to unblock this player.") + 1);
- return;
- // name can exist
- } else {
- // deny action (we add nick only if it's not already exist
- if (RFIFOB(fd,26) == 0) { // type
- pos = -1;
- for(i = 0; i < MAX_IGNORE_LIST; i++) {
- if (strcmp(sd->ignore[i].name, nick) == 0) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "This player is already blocked.", strlen("This player is already blocked.") + 1);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
- }
- return;
- } else if (pos == -1 && sd->ignore[i].name[0] == '\0')
- pos = i;
- }
- // if a position is found and name not found, we add it in the list
- if (pos != -1) {
- memcpy(sd->ignore[pos].name, nick, 24);
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d1]);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
- // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :)
- clif_wis_message(fd, wisp_server_name, "Add me in your ignore list, doesn't block my wisps.", strlen("Add me in your ignore list, doesn't block my wisps.") + 1);
- }
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "You can not block more people.", strlen("You can not block more people.") + 1);
- if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
- sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
- intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
- }
- }
- // allow action (we remove all same nicks if they exist)
- } else {
- pos = -1;
- for(i = 0; i < MAX_IGNORE_LIST; i++)
- if (strcmp(sd->ignore[i].name, nick) == 0) {
- memset(sd->ignore[i].name, 0, sizeof(sd->ignore[i].name));
- if (pos != -1) {
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d1]);
- pos = i; // don't break, to remove ALL same nick
- }
- }
- if (pos == -1) {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d1]);
- clif_wis_message(fd, wisp_server_name, "This player is not blocked by you.", strlen("This player is not blocked by you.") + 1);
- }
- }
- }
-
-// for(i = 0; i < MAX_IGNORE_LIST; i++) // for debug only
-// if (sd->ignore[i].name[0] != '\0')
-// printf("Ignored player: '%s'\n", sd->ignore[i].name);
-
- return;
-}
-
-void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
- //printf("Ignore all: state: %d\n", RFIFOB(fd,2));
- if (RFIFOB(fd,2) == 0) {// S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech
- WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = 0;
- if (sd->ignoreAll == 0) {
- sd->ignoreAll = 1;
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d2]);
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d2]);
- clif_wis_message(fd, wisp_server_name, "You already block everyone.", strlen("You already block everyone.") + 1);
- }
- } else {
- WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
- WFIFOB(fd,2) = 1;
- if (sd->ignoreAll == 1) {
- sd->ignoreAll = 0;
- WFIFOB(fd,3) = 0; // success
- WFIFOSET(fd, packet_len_table[0x0d2]);
- } else {
- WFIFOB(fd,3) = 1; // fail
- WFIFOSET(fd, packet_len_table[0x0d2]);
- clif_wis_message(fd, wisp_server_name, "You already allow everyone.", strlen("You already allow everyone.") + 1);
- }
- }
-
- return;
-}
-
-void clif_parse_skillMessage(int fd, struct map_session_data *sd) { // Added by RoVeRT
- int skillid,skilllv, x, y;
- char *mes;
-
- skilllv = RFIFOW(fd,2);
- skillid = RFIFOW(fd,4);
-
- y = RFIFOB(fd,6);
- x = RFIFOB(fd,8);
-
- mes = RFIFOP(fd,10);
-
- // skill 220 = graffiti
-// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes);
-}
-
-int monk(struct map_session_data *sd, struct block_list *target, int type) {
-//R 01d1 <Monk id>L <Target monster id>L <Bool>L
- int fd=sd->fd;
- WFIFOW(fd,0)=0x1d1;
- WFIFOL(fd,2)=sd->bl.id;
- WFIFOL(fd,6)=target->id;
- WFIFOL(fd,10)=type;
- WFIFOSET(fd,packet_len_table[0x1d1]);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒpƒmƒr‚Ì/doridori‚É‚æ‚éSPR2”{
- *------------------------------------------
- */
-void clif_parse_sn_doridori(int fd, struct map_session_data *sd) {
- if (sd)
- sd->doridori_counter = 1;
-
- return;
-}
-/*==========================================
- * ƒXƒpƒmƒr‚Ì”š—ô”g“®
- *------------------------------------------
- */
-void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd)
-{
- if(sd){
- int nextbaseexp=pc_nextbaseexp(sd);
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
- if (battle_config.etc_log){
- if(nextbaseexp != 0)
- printf("SuperNovice explosionspirits!! %d %d %d %d\n",sd->bl.id,s_class.job,sd->status.base_exp,(int)((double)1000*sd->status.base_exp/nextbaseexp));
- else
- printf("SuperNovice explosionspirits!! %d %d %d 000\n",sd->bl.id,s_class.job,sd->status.base_exp);
- }
- if(s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
- clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,1);
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0 );
- }
- }
- return;
-}
-
-/*==========================================
- * Friends List
- *------------------------------------------
- */
-void clif_friends_list_send(struct map_session_data *sd) {
- int i, n;
-
- // Send friends list
- n = 0;
- WFIFOW(sd->fd, 0) = 0x201;
- for(i = 0; i < 20; i++)
- if (sd->status.friend_id[i]) {
- WFIFOL(sd->fd,4 + 32 * n + 1) = sd->status.friend_id[i];
- //WFIFOB(sd->fd,4 + 32 * n + 5) = (online[n]) ? 0 : 1; // <- We don't know this yet. I'd reckon its 5 but... i could be wrong.
- memcpy(WFIFOP(sd->fd,4 + 32 * n + 8), &sd->status.friend_name[i], 23);
- n++;
- }
- WFIFOW(sd->fd,2) = 4 + 32 * n;
- WFIFOSET(sd->fd, WFIFOW(sd->fd,2));
-}
-
-void clif_parse_friends_list_add(int fd, struct map_session_data *sd) {
- struct map_session_data *f_sd;
- int i;
-
- f_sd = map_nick2sd(RFIFOP(fd,2));
-
- // Friend doesn't exist (no player with this name)
- if (f_sd == NULL) {
- clif_displaymessage(fd, "This name (for a friend) doesn't exist.");
- return;
- }
-
- // Friend already exists
- for (i = 0; i < 20; i++)
- if (sd->status.friend_id[i] == f_sd->status.char_id) {
- clif_displaymessage(fd, "Friend already exists.");
- return;
- }
-
- // Find an empty slot
- for (i = 0; i < 20; i++)
- if (sd->status.friend_id[i] == 0)
- break;
- if (i == 20) {
- clif_displaymessage(fd, "Friends list is full.");
- return;
- }
-
- sd->status.friend_id[i] = f_sd->status.char_id;
- memset(sd->status.friend_name[i], 0, sizeof(sd->status.friend_name[i]));
- memcpy(sd->status.friend_name[i], f_sd->status.name, 23);
- clif_displaymessage(fd, "Friend added.");
-
- clif_friends_list_send(sd);
-
- //printf("clif_parse_friends_list_add");
-
- return;
-}
-
-void clif_parse_friends_list_remove(int fd, struct map_session_data *sd) {
- // 0x203 </o> <ID to be removed W 4B>
- int id = RFIFOL(fd,3);
- int i, j;
-
- // Search friend
- for (i = 0; i < 20; i ++)
- if (sd->status.friend_id[i] == id) {
- // move all chars down
- for(j = i + 1; j < 20; j++) {
- sd->status.friend_id[j-1] = sd->status.friend_id[j];
- memcpy(sd->status.friend_name[j-1], sd->status.friend_name[j], sizeof(sd->status.friend_name[j]));
- }
- sd->status.friend_id[19] = 0;
- memset(sd->status.friend_name[19], 0, sizeof(sd->status.friend_name[19]));
- clif_displaymessage(fd, "Friend removed");
- clif_friends_list_send(sd);
- break;
- }
-
- if (i == 20)
- clif_displaymessage(fd, "Name not found in list.");
-
- return;
-}
-
-/*==========================================
- * /killall
- *------------------------------------------
- */
-void clif_parse_GMkillall(int fd,struct map_session_data *sd)
-{
- char message[50];
-
- nullpo_retv(sd);
-
- strncpy(message,sd->status.name, 24);
- is_atcommand(fd, sd, strcat(message," : @kickall"),0);
-
- return;
-}
-
-// functions list
-static void (*clif_parse_func_table[7][0x220])() = {
- {
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 40
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 70
- NULL, NULL, clif_parse_WantToConnection, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, clif_parse_LoadEndAck, clif_parse_TickSend, NULL,
-
- // 80
- NULL, NULL, NULL, NULL, NULL, clif_parse_WalkToXY, NULL, NULL,
- NULL, clif_parse_ActionRequest, NULL, NULL, clif_parse_GlobalMessage, NULL, NULL, NULL,
- // 90
- clif_parse_NpcClicked, NULL, NULL, NULL, clif_parse_GetCharNameRequest, NULL, clif_parse_Wis, NULL,
- NULL, clif_parse_GMmessage, NULL, clif_parse_ChangeDir, NULL, NULL, NULL, clif_parse_TakeItem,
- // a0
- NULL, NULL, clif_parse_DropItem, NULL, NULL, NULL, NULL, clif_parse_UseItem,
- NULL, clif_parse_EquipItem, NULL, clif_parse_UnequipItem, NULL, NULL, NULL, NULL,
- // b0
- NULL, NULL, clif_parse_Restart, NULL, NULL, NULL, NULL, NULL,
- clif_parse_NpcSelectMenu, clif_parse_NpcNextClicked, NULL, clif_parse_StatusUp, NULL, NULL, NULL, clif_parse_Emotion,
-
- // c0
- NULL, clif_parse_HowManyConnections, NULL, NULL, NULL, clif_parse_NpcBuySellSelected, NULL, NULL,
- clif_parse_NpcBuyListSend, clif_parse_NpcSellListSend, NULL, NULL, clif_parse_GMKick, NULL, clif_parse_GMkillall, clif_parse_PMIgnore,
- // d0
- clif_parse_PMIgnoreAll, NULL, NULL, NULL, NULL, clif_parse_CreateChatRoom, NULL, NULL,
- NULL, clif_parse_ChatAddMember, NULL, NULL, NULL, NULL, clif_parse_ChatRoomStatusChange, NULL,
- // e0
- clif_parse_ChangeChatOwner, NULL, clif_parse_KickFromChat, clif_parse_ChatLeave, clif_parse_TradeRequest, NULL, clif_parse_TradeAck, NULL,
- clif_parse_TradeAddItem, NULL, NULL, clif_parse_TradeOk, NULL, clif_parse_TradeCansel, NULL, clif_parse_TradeCommit,
- // f0
- NULL, NULL, NULL, clif_parse_MoveToKafra, NULL, clif_parse_MoveFromKafra, NULL, clif_parse_CloseKafra,
- NULL, clif_parse_CreateParty, NULL, NULL, clif_parse_PartyInvite, NULL, NULL, clif_parse_ReplyPartyInvite,
-
- // 100
- clif_parse_LeaveParty, NULL, clif_parse_PartyChangeOption, clif_parse_RemovePartyMember, NULL, NULL, NULL, NULL,
- clif_parse_PartyMessage, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- // 110
- NULL, NULL, clif_parse_SkillUp, clif_parse_UseSkillToId, NULL, NULL, clif_parse_UseSkillToPos, NULL,
- clif_parse_StopAttack, NULL, NULL, clif_parse_UseSkillMap, NULL, clif_parse_RequestMemo, NULL, NULL,
- // 120
- NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_PutItemToCart, clif_parse_GetItemFromCart,
- clif_parse_MoveFromKafraToCart, clif_parse_MoveToKafraFromCart, clif_parse_RemoveOption, NULL, NULL, NULL, clif_parse_CloseVending, NULL,
- // 130
- clif_parse_VendingListReq, NULL, NULL, NULL, clif_parse_PurchaseReq, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GM_Monster_Item,
-
- // 140
- clif_parse_MapMove, NULL, NULL, clif_parse_NpcAmountInput, NULL, NULL, clif_parse_NpcCloseClicked, NULL,
- NULL, clif_parse_GMReqNoChat, NULL, NULL, NULL, clif_parse_GuildCheckMaster, NULL, clif_parse_GuildReqeustInfo,
- // 150
- NULL, clif_parse_GuildRequestEmblem, NULL, clif_parse_GuildChangeEmblem, NULL, clif_parse_GuildChangeMemberPosition, NULL, NULL,
- NULL, clif_parse_GuildLeave, NULL, clif_parse_GuildExplusion, NULL, clif_parse_GuildBreak, NULL, NULL,
- // 160
- NULL, clif_parse_GuildChangePositionInfo, NULL, NULL, NULL, clif_parse_CreateGuild, NULL, NULL,
- clif_parse_GuildInvite, NULL, NULL, clif_parse_GuildReplyInvite, NULL, NULL, clif_parse_GuildChangeNotice, NULL,
- // 170
- clif_parse_GuildRequestAlliance, NULL, clif_parse_GuildReplyAlliance, NULL, NULL, NULL, NULL, NULL,
- clif_parse_ItemIdentify, NULL, clif_parse_UseCard, NULL, clif_parse_InsertCard, NULL, clif_parse_GuildMessage, NULL,
-
- // 180
- clif_parse_GuildOpposition, NULL, NULL, clif_parse_GuildDelAlliance, NULL, NULL, NULL, NULL,
- NULL, NULL, clif_parse_QuitGame, NULL, NULL, NULL, clif_parse_ProduceMix, NULL,
- // 190
- clif_parse_UseSkillToPos, NULL, NULL, clif_parse_SolveCharName, NULL, NULL, NULL, clif_parse_ResetChar,
- NULL, NULL, NULL, NULL, clif_parse_LGMmessage, clif_parse_GMHide, NULL, clif_parse_CatchPet,
- // 1a0
- NULL, clif_parse_PetMenu, NULL, NULL, NULL, clif_parse_ChangePetName, NULL, clif_parse_SelectEgg,
- NULL, clif_parse_SendEmotion, NULL, NULL, NULL, NULL, clif_parse_SelectArrow, clif_parse_ChangeCart,
- // 1b0
- NULL, NULL, clif_parse_OpenVending, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, clif_parse_Shift, clif_parse_Shift, clif_parse_Recall, clif_parse_Recall, NULL, NULL,
-
- // 1c0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_AutoSpell,
- NULL,
- // 1d0
- NULL, NULL, NULL, NULL, NULL, clif_parse_NpcStringInput, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GMReqNoChatCount,
- // 1e0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_sn_doridori,
- clif_parse_CreateParty2, NULL, NULL, NULL, NULL, clif_parse_sn_explosionspirits, NULL, NULL,
- // 1f0
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
- // 200
- NULL, NULL, clif_parse_friends_list_add, clif_parse_friends_list_remove, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- // 210
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-#if 0
- case 0xd3: clif_parse_IgnoreList
-#endif
- },
- {NULL},
- {NULL},
- {NULL},
- {NULL},
- {NULL},
- {NULL}
-};
-
-/*==========================================
- * ƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‚̃pƒPƒbƒg‰ðÍ
- * socket.c‚Ìdo_parsepacket‚©‚çŒÄ‚Ño‚³‚ê‚é
- *------------------------------------------
- */
-static int clif_parse(int fd) {
- int packet_len = 0, cmd, packet_ver;
- struct map_session_data *sd;
-
- sd = session[fd]->session_data;
-
- // Ú‘±‚ªØ‚ê‚Ä‚é‚Ì‚ÅŒãŽn––
- if (!chrif_isconnect() || session[fd]->eof) { // charŽI‚ÉŒq‚ª‚Á‚Ä‚È‚¢ŠÔ‚ÍÚ‘±‹ÖŽ~ (!chrif_isconnect())
- if (sd && sd->state.auth) {
- if (chrif_isconnect())
- clif_quitsave(fd, sd);
- if (sd->status.name != NULL)
- printf("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris]
- else
- printf("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor]
- } else if (sd) { // not authentified! (refused by char-server or disconnect before to be authentified)
- printf("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor]
- map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer
- }
- close(fd);
- delete_session(fd);
- return 0;
- }
-
- if (RFIFOREST(fd) < 2)
- return 0;
-
- //printf("clif_parse: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
- cmd = RFIFOW(fd,0);
-
- // ŠÇ——pƒpƒPƒbƒgˆ—
- if (cmd >= 30000) {
- switch(cmd) {
- case 0x7530: // Athenaî•ñŠ“¾
- 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_MAP;
- WFIFOW(fd,8) = ATHENA_MOD_VERSION;
- WFIFOSET(fd,10);
- RFIFOSKIP(fd,2);
- break;
- case 0x7532: // Ú‘±‚ÌØ’f
- session[fd]->eof = 1;
- break;
- }
- return 0;
- }
-
- // get packet version before to parse
- packet_ver = 0;
- if (sd)
- packet_ver = sd->packet_ver;
- // check authentification packet to know packet version
- else {
- // 0x72
- if (cmd == 0x72) {
- if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
- packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
- packet_ver = 6; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 19 && (RFIFOB(fd,18) == 0 || RFIFOB(fd,18) == 1)) // 00 = Female, 01 = Male
- packet_ver = 5; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 19)
- return 0;
- // 0x7E
- } else if (cmd == 0x7E) {
- if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
- packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- packet_ver = 8; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 33)
- return 0;
- // 0xF5
- } else {
- if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
- packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
- packet_ver = 12; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
- packet_ver = 11; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- else if (RFIFOREST(fd) >= 29 && (RFIFOB(fd,28) == 0 || RFIFOB(fd,28) == 1)) // 00 = Female, 01 = Male
- packet_ver = 13; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
- // else probably incomplete packet
- else if (RFIFOREST(fd) < 29)
- return 0;
- }
- // check if version is accepted
- if ((packet_ver == 5 && (battle_config.packet_ver_flag & 1) == 0) ||
- (packet_ver == 6 && (battle_config.packet_ver_flag & 2) == 0) ||
- (packet_ver == 7 && (battle_config.packet_ver_flag & 4) == 0) ||
- (packet_ver == 8 && (battle_config.packet_ver_flag & 8) == 0) ||
- (packet_ver == 9 && (battle_config.packet_ver_flag & 16) == 0) ||
- (packet_ver == 10 && (battle_config.packet_ver_flag & 32) == 0) ||
- (packet_ver == 11 && (battle_config.packet_ver_flag & 64) == 0) ||
- (packet_ver == 12 && (battle_config.packet_ver_flag & 128) == 0) ||
- (packet_ver == 13 && (battle_config.packet_ver_flag & 256) == 0)) {
- WFIFOW(fd,0) = 0x6a;
- WFIFOB(fd,2) = 5; // 05 = Game's EXE is not the latest version
- WFIFOSET(fd,23);
- session[fd]->eof = 1;
- return 0;
- }
- }
-
- // ƒQ[ƒ€—pˆÈŠOƒpƒPƒbƒg‚©A”FØ‚ðI‚¦‚é‘O‚É0072ˆÈŠO‚ª—ˆ‚½‚çAØ’f‚·‚é
- if (packet_ver < 5 || packet_ver > 13 || // if packet is not inside these values: session is incorrect?? or auth packet is unknown
- cmd >= 0x220 || packet_size_table[packet_ver-5][cmd] == 0) {
- if (!fd)
- return 0;
- session[fd]->eof = 1;
- printf("clif_parse: session #%d, packet 0x%x (%d bytes received) -> disconnected.\n", fd, cmd, RFIFOREST(fd));
- return 0;
- }
-
- // ƒpƒPƒbƒg’·‚ðŒvŽZ
- packet_len = packet_size_table[packet_ver-5][cmd];
- if (packet_len == -1) {
- if (RFIFOREST(fd) < 4)
- return 0; // ‰Â•Ï’·ƒpƒPƒbƒg‚Å’·‚³‚ÌŠ‚܂Ńf[ƒ^‚ª—ˆ‚Ä‚È‚¢
- packet_len = RFIFOW(fd,2);
- if (packet_len < 4 || packet_len > 32768) {
- session[fd]->eof = 1;
- return 0;
- }
- }
- if (RFIFOREST(fd) < packet_len)
- return 0; // ‚Ü‚¾1ƒpƒPƒbƒg•ªƒf[ƒ^‚ª‘µ‚Á‚Ä‚È‚¢
-
- if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // Ø’f‘Ò‚¿‚ÌꇃpƒPƒbƒg‚ðˆ—‚µ‚È‚¢
-
- } else if (packet_ver < 8 && clif_parse_func_table[0][cmd]) { // packet version 5-6-7 use same functions, but size are different
- // ƒpƒPƒbƒgˆ—
- clif_parse_func_table[0][cmd](fd, sd);
- } else if (packet_ver >= 8 && clif_parse_func_table[packet_ver - 7][cmd]) {
- // ƒpƒPƒbƒgˆ—
- clif_parse_func_table[packet_ver - 7][cmd](fd, sd);
- } else {
- // •s–¾‚ȃpƒPƒbƒg
- if (battle_config.error_log) {
- if (fd)
- printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len);
-#ifdef DUMP_UNKNOWN_PACKET
- {
- int i;
- FILE *fp;
- char packet_txt[256] = "save/packet.txt";
- time_t now;
- printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
- for(i = 0; i < packet_len; i++) {
- if ((i & 15) == 0)
- printf("\n%04X ",i);
- printf("%02X ", RFIFOB(fd,i));
- }
- if (sd && sd->state.auth) {
- if (sd->status.name != NULL)
- printf("\nAccount ID %d, character ID %d, player name %s.\n",
- sd->status.account_id, sd->status.char_id, sd->status.name);
- else
- printf("\nAccount ID %d.\n", sd->bl.id);
- } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- printf("\nAccount ID %d.\n", sd->bl.id);
-
- if ((fp = fopen(packet_txt, "a")) == NULL) {
- printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt);
- return 1;
- } else {
- time(&now);
- if (sd && sd->state.auth) {
- if (sd->status.name != NULL)
- fprintf(fp, "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n",
- asctime(localtime(&now)), sd->status.account_id, sd->status.char_id, sd->status.name);
- else
- fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
- } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
- fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
-
- fprintf(fp, "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
- for(i = 0; i < packet_len; i++) {
- if ((i & 15) == 0)
- fprintf(fp, "\n\t%04X ", i);
- fprintf(fp, "%02X ", RFIFOB(fd,i));
- }
- fprintf(fp, "\n\n");
- fclose(fp);
- }
- }
-#endif
- }
- }
- RFIFOSKIP(fd, packet_len);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_clif(void) {
-#ifndef __WIN32
- int i;
-#endif
-
- // functions of packet version 5-6-7 are same, but size are different
- // init packet function calls for packet ver 8
- memcpy(clif_parse_func_table[1], clif_parse_func_table[0], sizeof(clif_parse_func_table[0]));
- clif_parse_func_table[1][0x072] = clif_parse_DropItem;
- clif_parse_func_table[1][0x07e] = clif_parse_WantToConnection;
- clif_parse_func_table[1][0x085] = clif_parse_UseSkillToId;
- clif_parse_func_table[1][0x089] = clif_parse_GetCharNameRequest;
- clif_parse_func_table[1][0x08c] = clif_parse_UseSkillToPos;
- clif_parse_func_table[1][0x094] = clif_parse_TakeItem;
- clif_parse_func_table[1][0x09b] = clif_parse_WalkToXY;
- clif_parse_func_table[1][0x09f] = clif_parse_ChangeDir;
- clif_parse_func_table[1][0x0a2] = clif_parse_UseSkillToPos;
- clif_parse_func_table[1][0x0a7] = clif_parse_SolveCharName;
- clif_parse_func_table[1][0x0f3] = clif_parse_GlobalMessage;
- clif_parse_func_table[1][0x0f5] = clif_parse_UseItem;
- clif_parse_func_table[1][0x0f7] = clif_parse_TickSend;
- clif_parse_func_table[1][0x113] = clif_parse_MoveToKafra;
- clif_parse_func_table[1][0x116] = clif_parse_CloseKafra;
- clif_parse_func_table[1][0x190] = clif_parse_MoveFromKafra;
- clif_parse_func_table[1][0x193] = clif_parse_ActionRequest;
- // init packet function calls for packet ver 9 (same function of packet version 8, but size are different)
- memcpy(clif_parse_func_table[2], clif_parse_func_table[1], sizeof(clif_parse_func_table[0]));
- // init packet function calls for packet ver 10
- memcpy(clif_parse_func_table[3], clif_parse_func_table[2], sizeof(clif_parse_func_table[0]));
- clif_parse_func_table[3][0x072] = clif_parse_UseItem;
- clif_parse_func_table[3][0x07e] = clif_parse_MoveToKafra;
- clif_parse_func_table[3][0x085] = clif_parse_ActionRequest;
- clif_parse_func_table[3][0x089] = clif_parse_WalkToXY;
- clif_parse_func_table[3][0x08c] = clif_parse_UseSkillToPos;
- clif_parse_func_table[3][0x094] = clif_parse_DropItem;
- clif_parse_func_table[3][0x09b] = clif_parse_GetCharNameRequest;
- clif_parse_func_table[3][0x09f] = clif_parse_GlobalMessage;
- clif_parse_func_table[3][0x0a2] = clif_parse_SolveCharName;
- clif_parse_func_table[3][0x0a7] = clif_parse_UseSkillToPos;
- clif_parse_func_table[3][0x0f3] = clif_parse_ChangeDir;
- clif_parse_func_table[3][0x0f5] = clif_parse_WantToConnection;
- clif_parse_func_table[3][0x0f7] = clif_parse_CloseKafra;
- clif_parse_func_table[3][0x113] = clif_parse_TakeItem;
- clif_parse_func_table[3][0x116] = clif_parse_TickSend;
- clif_parse_func_table[3][0x190] = clif_parse_UseSkillToId;
- clif_parse_func_table[3][0x193] = clif_parse_MoveFromKafra;
- // init packet function calls for packet ver 11 (same function of packet version 10, but size are different)
- memcpy(clif_parse_func_table[4], clif_parse_func_table[3], sizeof(clif_parse_func_table[0]));
- // init packet function calls for packet ver 12 (same function of packet version 11, but size are different)
- memcpy(clif_parse_func_table[5], clif_parse_func_table[4], sizeof(clif_parse_func_table[0]));
- // init packet function calls for packet ver 13 (same function of packet version 12, but size are different)
- memcpy(clif_parse_func_table[6], clif_parse_func_table[5], sizeof(clif_parse_func_table[0]));
-
- // size of packet version 5
- memcpy(&packet_size_table[0], &packet_len_table, sizeof(packet_len_table));
- // size of packet version 6
- memcpy(&packet_size_table[1], &packet_size_table[0], sizeof(packet_len_table));
- packet_size_table[1][0x072] = 22;
- packet_size_table[1][0x085] = 8;
- packet_size_table[1][0x0a7] = 13;
- packet_size_table[1][0x113] = 15;
- packet_size_table[1][0x116] = 15;
- packet_size_table[1][0x190] = 95;
- // size of packet version 7
- memcpy(&packet_size_table[2], &packet_size_table[1], sizeof(packet_len_table));
- packet_size_table[2][0x072] = 39;
- packet_size_table[2][0x085] = 9;
- packet_size_table[2][0x09b] = 13;
- packet_size_table[2][0x09f] = 10;
- packet_size_table[2][0x0a7] = 17;
- packet_size_table[2][0x113] = 19;
- packet_size_table[2][0x116] = 19;
- packet_size_table[2][0x190] = 99;
- // size of packet version 8
- memcpy(&packet_size_table[3], &packet_size_table[2], sizeof(packet_len_table));
- packet_size_table[3][0x072] = 14;
- packet_size_table[3][0x07e] = 33;
- packet_size_table[3][0x085] = 20;
- packet_size_table[3][0x089] = 15;
- packet_size_table[3][0x08c] = 23;
- packet_size_table[3][0x094] = 10;
- packet_size_table[3][0x09b] = 6;
- packet_size_table[3][0x09f] = 13;
- packet_size_table[3][0x0a2] = 103;
- packet_size_table[3][0x0a7] = 12;
- packet_size_table[3][0x0f3] = -1;
- packet_size_table[3][0x0f5] = 17;
- packet_size_table[3][0x0f7] = 10;
- packet_size_table[3][0x113] = 16;
- packet_size_table[3][0x116] = 2;
- packet_size_table[3][0x190] = 26;
- packet_size_table[3][0x193] = 9;
- // size of packet version 9
- memcpy(&packet_size_table[4], &packet_size_table[3], sizeof(packet_len_table));
- packet_size_table[4][0x072] = 17;
- packet_size_table[4][0x07e] = 37;
- packet_size_table[4][0x085] = 26;
- packet_size_table[4][0x089] = 12;
- packet_size_table[4][0x08c] = 40;
- packet_size_table[4][0x094] = 13;
- packet_size_table[4][0x09b] = 15;
- packet_size_table[4][0x09f] = 12;
- packet_size_table[4][0x0a2] = 120;
- packet_size_table[4][0x0a7] = 11;
-// packet_size_table[4][0x0f3] = -1;
- packet_size_table[4][0x0f5] = 24;
- packet_size_table[4][0x0f7] = 13;
- packet_size_table[4][0x113] = 23;
-// packet_size_table[4][0x116] = 2;
- packet_size_table[4][0x190] = 26;
- packet_size_table[4][0x193] = 18;
- // new packet
- packet_size_table[4][0x20f] = 10;
- packet_size_table[4][0x210] = 22;
- packet_size_table[4][0x212] = 26;
- packet_size_table[4][0x213] = 26;
- packet_size_table[4][0x214] = 42;
- // size of packet version 10
- memcpy(&packet_size_table[5], &packet_size_table[4], sizeof(packet_len_table));
- packet_size_table[5][0x072] = 20;
- packet_size_table[5][0x07e] = 19;
- packet_size_table[5][0x085] = 23;
- packet_size_table[5][0x089] = 9;
- packet_size_table[5][0x08c] = 105;
- packet_size_table[5][0x094] = 17;
- packet_size_table[5][0x09b] = 14;
- packet_size_table[5][0x09f] = -1;
- packet_size_table[5][0x0a2] = 14;
- packet_size_table[5][0x0a7] = 25;
- packet_size_table[5][0x0f3] = 10;
- packet_size_table[5][0x0f5] = 34;
- packet_size_table[5][0x0f7] = 2;
- packet_size_table[5][0x113] = 11;
- packet_size_table[5][0x116] = 11;
- packet_size_table[5][0x190] = 22;
- packet_size_table[5][0x193] = 17;
- // size of packet version 11
- memcpy(&packet_size_table[6], &packet_size_table[5], sizeof(packet_len_table));
- packet_size_table[6][0x072] = 18;
- packet_size_table[6][0x07e] = 25;
- packet_size_table[6][0x085] = 9;
- packet_size_table[6][0x089] = 14;
- packet_size_table[6][0x08c] = 109;
- packet_size_table[6][0x094] = 19;
- packet_size_table[6][0x09b] = 10;
-// packet_size_table[6][0x09f] = -1;
- packet_size_table[6][0x0a2] = 10;
- packet_size_table[6][0x0a7] = 29;
- packet_size_table[6][0x0f3] = 18;
- packet_size_table[6][0x0f5] = 32;
-// packet_size_table[6][0x0f7] = 2;
- packet_size_table[6][0x113] = 14;
- packet_size_table[6][0x116] = 14;
- packet_size_table[6][0x190] = 14;
- packet_size_table[6][0x193] = 12;
- // size of packet version 12
- memcpy(&packet_size_table[7], &packet_size_table[6], sizeof(packet_len_table));
- packet_size_table[7][0x072] = 17;
- packet_size_table[7][0x07e] = 16;
-// packet_size_table[7][0x085] = 9;
- packet_size_table[7][0x089] = 6;
- packet_size_table[7][0x08c] = 103;
- packet_size_table[7][0x094] = 14;
- packet_size_table[7][0x09b] = 15;
-// packet_size_table[7][0x09f] = -1;
- packet_size_table[7][0x0a2] = 12;
- packet_size_table[7][0x0a7] = 23;
- packet_size_table[7][0x0f3] = 13;
- packet_size_table[7][0x0f5] = 33;
-// packet_size_table[7][0x0f7] = 2;
- packet_size_table[7][0x113] = 10;
- packet_size_table[7][0x116] = 10;
- packet_size_table[7][0x190] = 20;
- packet_size_table[7][0x193] = 26;
- // size of packet version 13
- memcpy(&packet_size_table[8], &packet_size_table[7], sizeof(packet_len_table));
- packet_size_table[8][0x072] = 13;
- packet_size_table[8][0x07e] = 13;
- packet_size_table[8][0x085] = 15;
-// packet_size_table[8][0x089] = 6;
- packet_size_table[8][0x08c] = 108;
- packet_size_table[8][0x094] = 12;
- packet_size_table[8][0x09b] = 10;
-// packet_size_table[8][0x09f] = -1;
- packet_size_table[8][0x0a2] = 16;
- packet_size_table[8][0x0a7] = 28;
- packet_size_table[8][0x0f3] = 15;
- packet_size_table[8][0x0f5] = 29;
-// packet_size_table[8][0x0f7] = 2;
- packet_size_table[8][0x113] = 9;
- packet_size_table[8][0x116] = 9;
- packet_size_table[8][0x190] = 26;
- packet_size_table[8][0x193] = 22;
-
- set_defaultparse(clif_parse);
-#ifdef __WIN32
- if (!make_listen_port(map_port)) {
- printf("cant bind game port\n");
- exit(1);
- }
-#else
- for(i = 0; i < 10; i++) {
- if (make_listen_port(map_port))
- break;
- sleep(20);
- }
- if (i == 10) {
- printf("cant bind game port\n");
- exit(1);
- }
-#endif
-
- add_timer_func_list(clif_waitclose, "clif_waitclose");
- add_timer_func_list(clif_clearchar_delay_sub, "clif_clearchar_delay_sub");
-
- return 0;
-}
-
+// $Id: clif.c 2200 2004-11-07 11:49:58Z Yor $
+
+#define DUMP_UNKNOWN_PACKET 1
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#ifdef __WIN32
+#define __USE_W32_SOCKETS
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+#include <time.h>
+
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/malloc.h"
+#include "../common/version.h"
+#include "../common/nullpo.h"
+
+#include "map.h"
+#include "chrif.h"
+#include "clif.h"
+#include "pc.h"
+#include "npc.h"
+#include "itemdb.h"
+#include "chat.h"
+#include "trade.h"
+#include "storage.h"
+#include "script.h"
+#include "skill.h"
+#include "atcommand.h"
+#include "intif.h"
+#include "battle.h"
+#include "mob.h"
+#include "party.h"
+#include "guild.h"
+#include "vending.h"
+#include "pet.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define STATE_BLIND 0x10
+
+static const int packet_len_table[0x220] = {
+ 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,
+#if PACKETVER < 2
+ 3, 28, 19, 11, 3, -1, 9, 5, 52, 51, 56, 58, 41, 2, 6, 6,
+#else // 78-7b ‹T“‡ˆÈ~ lv99ƒGƒtƒFƒNƒg—p
+ 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6,
+#endif
+//#0x0080
+ 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0, // 0x8b unknown... size 2 or 23?
+ 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,
+#if PACKETVER < 1
+ 90, 86, 24, 6, 30,102, 8, 4, 8, 4, 14, 10, -1, 6, 2, 6,
+#else // 196 comodoˆÈ~ ó‘Ô•\Ž¦ƒAƒCƒRƒ“—p
+ 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6,
+#endif
+ 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, Set 0x1d5=-1
+ 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28,
+ 8, 14, 10, 35, 6, -1, 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, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 19, 0, -1, 24, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+// size list for each packet version after packet version 4.
+static int packet_size_table[9][0x220];
+
+// local define
+enum {
+ ALL_CLIENT,
+ ALL_SAMEMAP,
+ AREA,
+ AREA_WOS,
+ AREA_WOC,
+ AREA_WOSC,
+ AREA_CHAT_WOC,
+ CHAT,
+ CHAT_WOS,
+ 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
+};
+
+#define WBUFPOS(p,pos,x,y) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x)>>2; __p[1] = ((x)<<6) | (((y)>>4)&0x3f); __p[2] = (y)<<4; }
+#define WBUFPOS2(p,pos,x0,y0,x1,y1) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x0)>>2; __p[1] = ((x0)<<6) | (((y0)>>4)&0x3f); __p[2] = ((y0)<<4) | (((x1)>>6)&0x0f); __p[3]=((x1)<<2) | (((y1)>>8)&0x03); __p[4]=(y1); }
+
+#define WFIFOPOS(fd,pos,x,y) { WBUFPOS (WFIFOP(fd,pos),0,x,y); }
+#define WFIFOPOS2(fd,pos,x0,y0,x1,y1) { WBUFPOS2(WFIFOP(fd,pos),0,x0,y0,x1,y1); }
+
+static char map_ip_str[16];
+static in_addr_t map_ip;
+static int map_port = 5121;
+int map_fd;
+char talkie_mes[80];
+
+/*==========================================
+ * mapŽI‚ÌipÝ’è
+ *------------------------------------------
+ */
+void clif_setip(char *ip)
+{
+ memcpy(map_ip_str, ip, 16);
+ map_ip = inet_addr(map_ip_str);
+}
+
+/*==========================================
+ * mapŽI‚ÌportÝ’è
+ *------------------------------------------
+ */
+void clif_setport(int port)
+{
+ map_port = port;
+}
+
+/*==========================================
+ * mapŽI‚Ìip“Ç‚Ýo‚µ
+ *------------------------------------------
+ */
+in_addr_t clif_getip(void)
+{
+ return map_ip;
+}
+
+/*==========================================
+ * mapŽI‚Ìport“Ç‚Ýo‚µ
+ *------------------------------------------
+ */
+int clif_getport(void)
+{
+ return map_port;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_countusers(void)
+{
+ int users = 0, i;
+ struct map_session_data *sd;
+
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth &&
+ !(battle_config.hide_GM_session && pc_isGM(sd)))
+ users++;
+ }
+ return users;
+}
+
+/*==========================================
+ * ‘S‚Ä‚Ìclient‚ɑ΂µ‚Äfunc()ŽÀs
+ *------------------------------------------
+ */
+int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...)
+{
+ int i;
+ va_list ap;
+ struct map_session_data *sd;
+
+ va_start(ap,func);
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth)
+ func(sd, ap);
+ }
+ va_end(ap);
+ return 0;
+}
+
+/*==========================================
+ * clif_send‚ÅAREA*Žw’莞—p
+ *------------------------------------------
+ */
+int clif_send_sub(struct block_list *bl, va_list ap)
+{
+ unsigned char *buf;
+ int len;
+ struct block_list *src_bl;
+ int type;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd = (struct map_session_data *)bl);
+
+ buf = va_arg(ap,unsigned char*);
+ len = va_arg(ap,int);
+ nullpo_retr(0, src_bl = va_arg(ap,struct block_list*));
+ type = va_arg(ap,int);
+
+ switch(type) {
+ case AREA_WOS:
+ if (bl && bl == src_bl)
+ return 0;
+ break;
+ case AREA_WOC:
+ if ((sd && sd->chatID) || (bl && bl == src_bl))
+ return 0;
+ break;
+ case AREA_WOSC:
+ if ((sd) && sd->chatID && sd->chatID == ((struct map_session_data*)src_bl)->chatID)
+ return 0;
+ break;
+ }
+
+ if (sd) {
+ if (WFIFOP(sd->fd,0) == buf) {
+ printf("WARNING: Invalid use of clif_send function\n");
+ printf(" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n", WBUFW(buf,0));
+ printf(" Please correct your code.\n");
+ // don't send to not move the pointer of the packet for next sessions in the loop
+ } else {
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) {
+ int i;
+ struct map_session_data *sd;
+ struct chat_data *cd;
+ struct party *p = NULL;
+ struct guild *g = NULL;
+ int x0 = 0, x1 = 0, y0 = 0, y1 = 0;
+
+ if (type != ALL_CLIENT) {
+ nullpo_retr(0, bl);
+ }
+
+ switch(type) {
+ case ALL_CLIENT: // ‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(i,0), buf, len);
+ WFIFOSET(i,len);
+ }
+ }
+ }
+ break;
+ case ALL_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘SƒNƒ‰ƒCƒAƒ“ƒg‚É‘—M
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) {
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(i,0), buf, len);
+ WFIFOSET(i,len);
+ }
+ }
+ }
+ break;
+ case AREA:
+ case AREA_WOS:
+ case AREA_WOC:
+ case AREA_WOSC:
+ map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, BL_PC, buf, len, bl, type);
+ break;
+ case AREA_CHAT_WOC:
+ map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5), bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_WOC);
+ break;
+ case CHAT:
+ case CHAT_WOS:
+ cd = (struct chat_data*)bl;
+ if (bl->type == BL_PC) {
+ sd = (struct map_session_data*)bl;
+ cd = (struct chat_data*)map_id2bl(sd->chatID);
+ } else if (bl->type != BL_CHAT)
+ break;
+ if (cd == NULL)
+ break;
+ for(i = 0; i < cd->users; i++) {
+ if (type == CHAT_WOS && cd->usersd[i] == (struct map_session_data*)bl)
+ continue;
+ if (packet_size_table[cd->usersd[i]->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ if (cd->usersd[i]->fd >=0 && session[cd->usersd[i]->fd]) // Added check to see if session exists [PoW]
+ memcpy(WFIFOP(cd->usersd[i]->fd,0), buf, len);
+ WFIFOSET(cd->usersd[i]->fd,len);
+ }
+ }
+ break;
+
+ case PARTY_AREA: // “¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ case PARTY_AREA_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶‰æ–Ê“à‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ x0 = bl->x - AREA_SIZE;
+ y0 = bl->y - AREA_SIZE;
+ x1 = bl->x + AREA_SIZE;
+ y1 = bl->y + AREA_SIZE;
+ case PARTY: // ‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ case PARTY_WOS: // Ž©•ªˆÈŠO‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ case PARTY_SAMEMAP: // “¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ case PARTY_SAMEMAP_WOS: // Ž©•ªˆÈŠO‚Ì“¯‚¶ƒ}ƒbƒv‚Ì‘Sƒp[ƒeƒB[ƒƒ“ƒo‚É‘—M
+ if (bl->type == BL_PC) {
+ sd = (struct map_session_data *)bl;
+ if (sd->partyspy > 0) {
+ p = party_search(sd->partyspy);
+ } else {
+ if (sd->status.party_id > 0)
+ p = party_search(sd->status.party_id);
+ }
+ }
+ if (p) {
+ for(i=0;i<MAX_PARTY;i++){
+ if ((sd = p->member[i].sd) != NULL) {
+ if (sd->bl.id == bl->id && (type == PARTY_WOS ||
+ type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS))
+ continue;
+ if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
+ continue;
+ if ((type == PARTY_AREA || type == PARTY_AREA_WOS) &&
+ (sd->bl.x < x0 || sd->bl.y < y0 ||
+ sd->bl.x > x1 || sd->bl.y > y1))
+ continue;
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+// if(battle_config.etc_log)
+// printf("send party %d %d %d\n",p->party_id,i,flag)
+
+ }
+ }
+ for (i = 0; i < fd_max; i++){
+ if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
+ if (sd->partyspy == p->party_id) {
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case SELF:
+ sd = (struct map_session_data *)bl;
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ break;
+
+/* New definitions for guilds [Valaris] */
+
+ case GUILD_AREA:
+ case GUILD_AREA_WOS:
+ x0 = bl->x - AREA_SIZE;
+ y0 = bl->y - AREA_SIZE;
+ x1 = bl->x + AREA_SIZE;
+ y1 = bl->y + AREA_SIZE;
+ case GUILD:
+ case GUILD_WOS:
+ if (bl && bl->type == BL_PC) { // guildspy [Syrus22]
+ sd = (struct map_session_data *)bl;
+ if (sd->guildspy > 0) {
+ g = guild_search(sd->guildspy);
+ } else {
+ if (sd->status.guild_id > 0)
+ g = guild_search(sd->status.guild_id);
+ }
+ }
+ if (g) {
+ for(i = 0; i < g->max_member; i++) {
+ if ((sd = g->member[i].sd) != NULL) {
+ if (type == GUILD_WOS && sd->bl.id == bl->id)
+ continue;
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ }
+ }
+ for (i = 0; i < fd_max; i++){
+ if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) {
+ if (sd->guildspy == g->guild_id) {
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case GUILD_SAMEMAP:
+ case GUILD_SAMEMAP_WOS:
+ if (bl->type == BL_PC) {
+ sd = (struct map_session_data *)bl;
+ if (sd->status.guild_id > 0)
+ g = guild_search(sd->status.guild_id);
+ }
+ if (g) {
+ for(i = 0; i < g->max_member; i++) {
+ if ((sd = g->member[i].sd) != NULL) {
+ if (sd->bl.id == bl->id && (type == GUILD_WOS ||
+ type == GUILD_SAMEMAP_WOS || type == GUILD_AREA_WOS))
+ continue;
+ if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // ƒ}ƒbƒvƒ`ƒFƒbƒN
+ continue;
+ if ((type == GUILD_AREA || type == GUILD_AREA_WOS) &&
+ (sd->bl.x < x0 || sd->bl.y < y0 ||
+ sd->bl.x > x1 || sd->bl.y > y1))
+ continue;
+ if (packet_size_table[sd->packet_ver-5][RBUFW(buf,0)]) { // packet must exist for the client version
+ memcpy(WFIFOP(sd->fd,0), buf, len);
+ WFIFOSET(sd->fd,len);
+ }
+ }
+ }
+ }
+ break;
+/* End [Valaris] */
+
+ default:
+ if (battle_config.error_log)
+ printf("clif_send ‚Ü‚¾ì‚Á‚Ä‚È‚¢‚æ[\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+//
+// ƒpƒPƒbƒgì‚Á‚Ä‘—M
+//
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_authok(struct map_session_data *sd) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ if (!sd)
+ return 0;
+
+ if (!sd->fd)
+ return 0;
+
+ fd = sd->fd;
+
+ WFIFOW(fd, 0) = 0x73;
+ WFIFOL(fd, 2) = gettick();
+ WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y);
+ WFIFOB(fd, 9) = 5;
+ WFIFOB(fd,10) = 5;
+ WFIFOSET(fd,packet_len_table[0x73]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_authfail_fd(int fd, int type) {
+ if (!fd || !session[fd])
+ return 0;
+
+ WFIFOW(fd,0) = 0x81;
+ WFIFOL(fd,2) = type;
+ WFIFOSET(fd,packet_len_table[0x81]);
+
+ clif_setwaitclose(fd);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_charselectok(int id) {
+ struct map_session_data *sd;
+ int fd;
+
+ if ((sd = map_id2sd(id)) == NULL)
+ return 1;
+
+ if (!sd->fd)
+ return 1;
+
+ fd = sd->fd;
+ WFIFOW(fd,0) = 0xb3;
+ WFIFOB(fd,2) = 1;
+ WFIFOSET(fd,packet_len_table[0xb3]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf) {
+ int view;
+
+ nullpo_retr(0, fitem);
+
+ //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
+ WBUFW(buf, 0) = 0x9e;
+ WBUFL(buf, 2) = fitem->bl.id;
+ if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
+ WBUFW(buf, 6) = view;
+ else
+ WBUFW(buf, 6) = fitem->item_data.nameid;
+ WBUFB(buf, 8) = fitem->item_data.identify;
+ WBUFW(buf, 9) = fitem->bl.x;
+ WBUFW(buf,11) = fitem->bl.y;
+ WBUFB(buf,13) = fitem->subx;
+ WBUFB(buf,14) = fitem->suby;
+ WBUFW(buf,15) = fitem->item_data.amount;
+
+ return packet_len_table[0x9e];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_dropflooritem(struct flooritem_data *fitem) {
+ char buf[64];
+
+ nullpo_retr(0, fitem);
+
+ if (fitem->item_data.nameid <= 0)
+ return 0;
+ clif_set009e(fitem, buf);
+ clif_send(buf, packet_len_table[0x9e], &fitem->bl, AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_clearflooritem(struct flooritem_data *fitem, int fd) {
+ unsigned char buf[16];
+
+ nullpo_retr(0, fitem);
+
+ WBUFW(buf,0) = 0xa1;
+ WBUFL(buf,2) = fitem->bl.id;
+
+ if (fd == 0) {
+ clif_send(buf, packet_len_table[0xa1], &fitem->bl, AREA);
+ } else {
+ memcpy(WFIFOP(fd,0), buf, 6);
+ WFIFOSET(fd,packet_len_table[0xa1]);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_clearchar(struct block_list *bl, int type) {
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0) = 0x80;
+ WBUFL(buf,2) = bl->id;
+ if (type == 9) {
+ WBUFB(buf,6) = 0;
+ clif_send(buf, packet_len_table[0x80], bl, AREA);
+ } else {
+ WBUFB(buf,6) = type;
+ clif_send(buf, packet_len_table[0x80], bl, type == 1 ? AREA : AREA_WOS);
+ }
+
+ return 0;
+}
+
+static int clif_clearchar_delay_sub(int tid, unsigned int tick, int id, int data) {
+ struct block_list *bl = (struct block_list *)id;
+
+ clif_clearchar(bl,data);
+ map_freeblock(bl);
+
+ return 0;
+}
+
+int clif_clearchar_delay(unsigned int tick, struct block_list *bl, int type) {
+ struct block_list *tmpbl;
+
+ tmpbl = (struct block_list*)aCalloc(1, sizeof(struct block_list));
+
+ memcpy(tmpbl, bl, sizeof(struct block_list));
+ add_timer(tick, clif_clearchar_delay_sub, (int)tmpbl, type);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_clearchar_id(int id, int type, int fd) {
+ unsigned char buf[16];
+
+ WBUFW(buf,0) = 0x80;
+ WBUFL(buf,2) = id;
+ WBUFB(buf,6) = type;
+ memcpy(WFIFOP(fd,0), buf, 7);
+ WFIFOSET(fd, packet_len_table[0x80]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_set0078(struct map_session_data *sd, unsigned char *buf) {
+ int level;
+
+ nullpo_retr(0, sd);
+
+ if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
+
+ WBUFW(buf,0) = 0x78;
+ WBUFL(buf,2) = sd->bl.id;
+ WBUFW(buf,6) = battle_get_speed(&sd->bl);
+ WBUFW(buf,8) = sd->opt1;
+ WBUFW(buf,10) = sd->opt2;
+ WBUFW(buf,12) = sd->status.option;
+ WBUFW(buf,14) = sd->disguise;
+ WBUFW(buf,42) = 0;
+ WBUFB(buf,44) = 0;
+ WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
+ WBUFB(buf,48) |= sd->dir & 0x0f;
+ WBUFB(buf,49) = 5;
+ WBUFB(buf,50) = 5;
+ WBUFB(buf,51) = 0;
+ WBUFW(buf,52) = ((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
+
+ return packet_len_table[0x78];
+ }
+
+#if PACKETVER < 4
+ WBUFW(buf,0)= 0x78;
+ WBUFL(buf,2)= sd->bl.id;
+ WBUFW(buf,6)= sd->speed;
+ WBUFW(buf,8)= sd->opt1;
+ WBUFW(buf,10)= sd->opt2;
+ WBUFW(buf,12)= sd->status.option;
+ WBUFW(buf,14)= sd->view_class;
+ WBUFW(buf,16)= sd->status.hair;
+ if (sd->view_class != 22)
+ WBUFW(buf,18) = sd->status.weapon;
+ else
+ WBUFW(buf,18)=0;
+ WBUFW(buf,20)=sd->status.head_bottom;
+ WBUFW(buf,22)=sd->status.shield;
+ WBUFW(buf,24)=sd->status.head_top;
+ WBUFW(buf,26)=sd->status.head_mid;
+ WBUFW(buf,28)=sd->status.hair_color;
+ WBUFW(buf,30)=sd->status.clothes_color;
+ WBUFW(buf,32)=sd->head_dir;
+ WBUFL(buf,34)=sd->status.guild_id;
+ WBUFL(buf,38)=sd->guild_emblem_id;
+ WBUFW(buf,42)=sd->status.manner;
+ WBUFB(buf,44)=sd->status.karma;
+ WBUFB(buf,45)=sd->sex;
+ WBUFPOS(buf,46,sd->bl.x,sd->bl.y);
+ WBUFB(buf,48)|=sd->dir&0x0f;
+ WBUFB(buf,49)=5;
+ WBUFB(buf,50)=5;
+ WBUFB(buf,51)=sd->state.dead_sit;
+ WBUFW(buf,52)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
+
+ return packet_len_table[0x78];
+#else
+ WBUFW(buf,0) = 0x1d8;
+ WBUFL(buf,2) = sd->bl.id;
+ WBUFW(buf,6) = sd->speed;
+ WBUFW(buf,8) = sd->opt1;
+ WBUFW(buf,10) = sd->opt2;
+ WBUFW(buf,12) = sd->status.option;
+ WBUFW(buf,14) = sd->view_class;
+ WBUFW(buf,16) = sd->status.hair;
+ if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
+ if (sd->inventory_data[sd->equip_index[9]]->view_id > 0)
+ WBUFW(buf,18) = sd->inventory_data[sd->equip_index[9]]->view_id;
+ else
+ WBUFW(buf,18) = sd->status.inventory[sd->equip_index[9]].nameid;
+ } else
+ WBUFW(buf,18) = 0;
+ if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
+ if (sd->inventory_data[sd->equip_index[8]]->view_id > 0)
+ WBUFW(buf,20) = sd->inventory_data[sd->equip_index[8]]->view_id;
+ else
+ WBUFW(buf,20) = sd->status.inventory[sd->equip_index[8]].nameid;
+ } else
+ WBUFW(buf,20) = 0;
+ WBUFW(buf,22) = sd->status.head_bottom;
+ WBUFW(buf,24) = sd->status.head_top;
+ WBUFW(buf,26) = sd->status.head_mid;
+ WBUFW(buf,28) = sd->status.hair_color;
+ WBUFW(buf,30) = sd->status.clothes_color;
+ WBUFW(buf,32) = sd->head_dir;
+ WBUFL(buf,34) = sd->status.guild_id;
+ WBUFW(buf,38) = sd->guild_emblem_id;
+ WBUFW(buf,40) = sd->status.manner;
+ WBUFW(buf,42)=sd->opt3;
+ WBUFB(buf,44) = sd->status.karma;
+ WBUFB(buf,45) = sd->sex;
+ WBUFPOS(buf, 46, sd->bl.x, sd->bl.y);
+ WBUFB(buf,48) |= sd->dir & 0x0f;
+ WBUFB(buf,49) = 5;
+ WBUFB(buf,50) = 5;
+ WBUFB(buf,51) = sd->state.dead_sit;
+ WBUFW(buf,52) = ((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level;
+
+ return packet_len_table[0x1d8];
+#endif
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_set007b(struct map_session_data *sd,unsigned char *buf) {
+ int level;
+
+ nullpo_retr(0, sd);
+
+ if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
+
+ WBUFW(buf,0)=0x7b;
+ WBUFL(buf,2)=sd->bl.id;
+ WBUFW(buf,6)=battle_get_speed(&sd->bl);
+ WBUFW(buf,8)=sd->opt1;
+ WBUFW(buf,10)=sd->opt2;
+ WBUFW(buf,12)=sd->status.option;
+ WBUFW(buf,14)=sd->disguise;
+ WBUFL(buf,22)=gettick();
+ WBUFW(buf,46)=0;
+ WBUFB(buf,48)=0;
+ WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
+ WBUFB(buf,55)=0;
+ WBUFB(buf,56)=5;
+ WBUFB(buf,57)=5;
+ WBUFW(buf,58)=((level = battle_get_lv(&sd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
+
+ return packet_len_table[0x7b];
+ }
+
+#if PACKETVER < 4
+ WBUFW(buf,0)=0x7b;
+ WBUFL(buf,2)=sd->bl.id;
+ WBUFW(buf,6)=sd->speed;
+ WBUFW(buf,8)=sd->opt1;
+ WBUFW(buf,10)=sd->opt2;
+ WBUFW(buf,12)=sd->status.option;
+ WBUFW(buf,14)=sd->view_class;
+ WBUFW(buf,16)=sd->status.hair;
+ if(sd->view_class != 22)
+ WBUFW(buf,18)=sd->status.weapon;
+ else
+ WBUFW(buf,18)=0;
+ WBUFW(buf,20)=sd->status.head_bottom;
+ WBUFL(buf,22)=gettick();
+ WBUFW(buf,26)=sd->status.shield;
+ WBUFW(buf,28)=sd->status.head_top;
+ WBUFW(buf,30)=sd->status.head_mid;
+ WBUFW(buf,32)=sd->status.hair_color;
+ WBUFW(buf,34)=sd->status.clothes_color;
+ WBUFW(buf,36)=sd->head_dir;
+ WBUFL(buf,38)=sd->status.guild_id;
+ WBUFL(buf,42)=sd->guild_emblem_id;
+ WBUFW(buf,46)=sd->status.manner;
+ WBUFB(buf,48)=sd->status.karma;
+ WBUFB(buf,49)=sd->sex;
+ WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
+ WBUFB(buf,55)=0;
+ WBUFB(buf,56)=5;
+ WBUFB(buf,57)=5;
+ WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
+
+ return packet_len_table[0x7b];
+#else
+ WBUFW(buf,0)=0x1da;
+ WBUFL(buf,2)=sd->bl.id;
+ WBUFW(buf,6)=sd->speed;
+ WBUFW(buf,8)=sd->opt1;
+ WBUFW(buf,10)=sd->opt2;
+ WBUFW(buf,12)=sd->status.option;
+ WBUFW(buf,14)=sd->view_class;
+ WBUFW(buf,16)=sd->status.hair;
+ if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
+ if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
+ WBUFW(buf,18)=sd->inventory_data[sd->equip_index[9]]->view_id;
+ else
+ WBUFW(buf,18)=sd->status.inventory[sd->equip_index[9]].nameid;
+ }
+ else
+ WBUFW(buf,18)=0;
+ if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) {
+ if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
+ WBUFW(buf,20)=sd->inventory_data[sd->equip_index[8]]->view_id;
+ else
+ WBUFW(buf,20)=sd->status.inventory[sd->equip_index[8]].nameid;
+ }
+ else
+ WBUFW(buf,20)=0;
+ WBUFW(buf,22)=sd->status.head_bottom;
+ WBUFL(buf,24)=gettick();
+ WBUFW(buf,28)=sd->status.head_top;
+ WBUFW(buf,30)=sd->status.head_mid;
+ WBUFW(buf,32)=sd->status.hair_color;
+ WBUFW(buf,34)=sd->status.clothes_color;
+ WBUFW(buf,36)=sd->head_dir;
+ WBUFL(buf,38)=sd->status.guild_id;
+ WBUFW(buf,42)=sd->guild_emblem_id;
+ WBUFW(buf,44)=sd->status.manner;
+ WBUFW(buf,46)=sd->opt3;
+ WBUFB(buf,48)=sd->status.karma;
+ WBUFB(buf,49)=sd->sex;
+ WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
+ WBUFB(buf,55)=0;
+ WBUFB(buf,56)=5;
+ WBUFB(buf,57)=5;
+ WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level;
+
+ return packet_len_table[0x1da];
+#endif
+}
+
+/*==========================================
+ * ƒNƒ‰ƒXƒ`ƒFƒ“ƒW type‚ÍMob‚ÌꇂÍ1‚Å‘¼‚Í0H
+ *------------------------------------------
+ */
+int clif_class_change(struct block_list *bl,int class,int type)
+{
+ char buf[16];
+
+ nullpo_retr(0, bl);
+
+ if(class >= MAX_PC_CLASS) {
+ WBUFW(buf,0)=0x1b0;
+ WBUFL(buf,2)=bl->id;
+ WBUFB(buf,6)=type;
+ WBUFL(buf,7)=class;
+
+ clif_send(buf,packet_len_table[0x1b0],bl,AREA);
+ }
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_mob_class_change(struct mob_data *md, int class) {
+ char buf[16];
+ int view = mob_get_viewclass(class);
+
+ nullpo_retr(0, md);
+
+ if(view >= MAX_PC_CLASS) {
+ WBUFW(buf,0)=0x1b0;
+ WBUFL(buf,2)=md->bl.id;
+ WBUFB(buf,6)=1;
+ WBUFL(buf,7)=view;
+
+ clif_send(buf,packet_len_table[0x1b0],&md->bl,AREA);
+ }
+ return 0;
+}
+// mob equipment [Valaris]
+
+int clif_mob_equip(struct mob_data *md, int nameid) {
+ unsigned char buf[16];
+
+ nullpo_retr(0, md);
+
+ memset(buf,0,packet_len_table[0x1a4]);
+
+ WBUFW(buf,0)=0x1a4;
+ WBUFB(buf,2)=3;
+ WBUFL(buf,3)=md->bl.id;
+ WBUFL(buf,7)=nameid;
+
+ clif_send(buf,packet_len_table[0x1a4],&md->bl,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * MOB•\Ž¦1
+ *------------------------------------------
+ */
+static int clif_mob0078(struct mob_data *md, unsigned char *buf)
+{
+ int level;
+
+ memset(buf,0,packet_len_table[0x78]);
+
+ nullpo_retr(0, md);
+
+ WBUFW(buf,0)=0x78;
+ WBUFL(buf,2)=md->bl.id;
+ WBUFW(buf,6)=battle_get_speed(&md->bl);
+ WBUFW(buf,8)=md->opt1;
+ WBUFW(buf,10)=md->opt2;
+ WBUFW(buf,12)=md->option;
+ WBUFW(buf,14)=mob_get_viewclass(md->class);
+ if((mob_get_viewclass(md->class) <= 23) || (mob_get_viewclass(md->class) == 812) || (mob_get_viewclass(md->class) >= 4001)) {
+ WBUFW(buf,12)|=mob_db[md->class].option;
+ WBUFW(buf,16)=mob_get_hair(md->class);
+ WBUFW(buf,18)=mob_get_weapon(md->class);
+ WBUFW(buf,20)=mob_get_head_buttom(md->class);
+ WBUFW(buf,22)=mob_get_shield(md->class);
+ WBUFW(buf,24)=mob_get_head_top(md->class);
+ WBUFW(buf,26)=mob_get_head_mid(md->class);
+ WBUFW(buf,28)=mob_get_hair_color(md->class);
+ WBUFW(buf,30)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris
+ WBUFB(buf,45)=mob_get_sex(md->class);
+ }
+
+ if (md->class >= 1285 && md->class <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
+ struct guild *g;
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if (gc && gc->guild_id > 0) {
+ g=guild_search(gc->guild_id);
+ if (g) {
+ WBUFL(buf,22)=g->emblem_id;
+ WBUFL(buf,26)=gc->guild_id;
+ }
+ }
+ } // End addition
+
+ WBUFPOS(buf,46,md->bl.x,md->bl.y);
+ WBUFB(buf,48)|=md->dir&0x0f;
+ WBUFB(buf,49)=5;
+ WBUFB(buf,50)=5;
+ WBUFW(buf,52)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
+
+ return packet_len_table[0x78];
+}
+
+/*==========================================
+ * MOB•\Ž¦2
+ *------------------------------------------
+ */
+static int clif_mob007b(struct mob_data *md, unsigned char *buf) {
+ int level;
+
+ memset(buf,0,packet_len_table[0x7b]);
+
+ nullpo_retr(0, md);
+
+ WBUFW(buf,0)=0x7b;
+ WBUFL(buf,2)=md->bl.id;
+ WBUFW(buf,6)=battle_get_speed(&md->bl);
+ WBUFW(buf,8)=md->opt1;
+ WBUFW(buf,10)=md->opt2;
+ WBUFW(buf,12)=md->option;
+ WBUFW(buf,14)=mob_get_viewclass(md->class);
+ if ((mob_get_viewclass(md->class) < 24) || (mob_get_viewclass(md->class) > 4000)) {
+ WBUFW(buf,12)|=mob_db[md->class].option;
+ WBUFW(buf,16)=mob_get_hair(md->class);
+ WBUFW(buf,18)=mob_get_weapon(md->class);
+ WBUFW(buf,20)=mob_get_head_buttom(md->class);
+ WBUFL(buf,22)=gettick();
+ WBUFW(buf,26)=mob_get_shield(md->class);
+ WBUFW(buf,28)=mob_get_head_top(md->class);
+ WBUFW(buf,30)=mob_get_head_mid(md->class);
+ WBUFW(buf,32)=mob_get_hair_color(md->class);
+ WBUFW(buf,34)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris
+ WBUFB(buf,49)=mob_get_sex(md->class);
+ } else
+ WBUFL(buf,22)=gettick();
+
+ if(md->class >= 1285 && md->class <= 1287 && md->guild_id) { // Added guardian emblems [Valaris]
+ struct guild *g;
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc && gc->guild_id > 0){
+ g=guild_search(gc->guild_id);
+ if(g) {
+ WBUFL(buf,28)=gc->guild_id;
+ WBUFL(buf,24)=g->emblem_id;
+ }
+ }
+ } // End addition
+
+ WBUFPOS2(buf,50,md->bl.x,md->bl.y,md->to_x,md->to_y);
+ WBUFB(buf,56)=5;
+ WBUFB(buf,57)=5;
+ WBUFW(buf,58)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level;
+
+ return packet_len_table[0x7b];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_npc0078(struct npc_data *nd, unsigned char *buf) {
+ struct guild *g;
+
+ nullpo_retr(0, nd);
+
+ memset(buf,0,packet_len_table[0x78]);
+
+ WBUFW(buf,0)=0x78;
+ WBUFL(buf,2)=nd->bl.id;
+ WBUFW(buf,6)=nd->speed;
+ WBUFW(buf,14)=nd->class;
+ if ((nd->class == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
+ WBUFL(buf,22)=g->emblem_id;
+ WBUFL(buf,26)=g->guild_id;
+ }
+ WBUFPOS(buf,46,nd->bl.x,nd->bl.y);
+ WBUFB(buf,48)|=nd->dir&0x0f;
+ WBUFB(buf,49)=5;
+ WBUFB(buf,50)=5;
+
+ return packet_len_table[0x78];
+}
+
+// NPC Walking [Valaris]
+static int clif_npc007b(struct npc_data *nd, unsigned char *buf) {
+ struct guild *g;
+
+ nullpo_retr(0, nd);
+
+ memset(buf,0,packet_len_table[0x7b]);
+
+ WBUFW(buf,0)=0x7b;
+ WBUFL(buf,2)=nd->bl.id;
+ WBUFW(buf,6)=nd->speed;
+ WBUFW(buf,14)=nd->class;
+ if ((nd->class == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) {
+ WBUFL(buf,22)=g->emblem_id;
+ WBUFL(buf,26)=g->guild_id;
+ }
+
+ WBUFL(buf,22)=gettick();
+ WBUFPOS2(buf,50,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y);
+ WBUFB(buf,56)=5;
+ WBUFB(buf,57)=5;
+
+ return packet_len_table[0x7b];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_pet0078(struct pet_data *pd, unsigned char *buf) {
+ int view,level;
+
+ nullpo_retr(0, pd);
+
+ memset(buf,0,packet_len_table[0x78]);
+
+ WBUFW(buf,0)=0x78;
+ WBUFL(buf,2)=pd->bl.id;
+ WBUFW(buf,6)=pd->speed;
+ WBUFW(buf,14)=mob_get_viewclass(pd->class);
+ if((mob_get_viewclass(pd->class) < 24) || (mob_get_viewclass(pd->class) > 4000)) {
+ WBUFW(buf,12)=mob_db[pd->class].option;
+ WBUFW(buf,16)=mob_get_hair(pd->class);
+ WBUFW(buf,18)=mob_get_weapon(pd->class);
+ WBUFW(buf,20)=mob_get_head_buttom(pd->class);
+ WBUFW(buf,22)=mob_get_shield(pd->class);
+ WBUFW(buf,24)=mob_get_head_top(pd->class);
+ WBUFW(buf,26)=mob_get_head_mid(pd->class);
+ WBUFW(buf,28)=mob_get_hair_color(pd->class);
+ WBUFW(buf,30)=mob_get_clothes_color(pd->class); //Add for player pet dye - Valaris
+ WBUFB(buf,45)=mob_get_sex(pd->class);
+ } else {
+ WBUFW(buf,16)=0x14;
+ if((view = itemdb_viewid(pd->equip)) > 0)
+ WBUFW(buf,20)=view;
+ else
+ WBUFW(buf,20)=pd->equip;
+ }
+ WBUFPOS(buf,46,pd->bl.x,pd->bl.y);
+ WBUFB(buf,48)|=pd->dir&0x0f;
+ WBUFB(buf,49)=0;
+ WBUFB(buf,50)=0;
+ WBUFW(buf,52)=((level = battle_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
+
+ return packet_len_table[0x78];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_pet007b(struct pet_data *pd, unsigned char *buf) {
+ int view,level;
+
+ nullpo_retr(0, pd);
+
+ memset(buf,0,packet_len_table[0x7b]);
+
+ WBUFW(buf,0)=0x7b;
+ WBUFL(buf,2)=pd->bl.id;
+ WBUFW(buf,6)=pd->speed;
+ WBUFW(buf,14)=mob_get_viewclass(pd->class);
+ if((mob_get_viewclass(pd->class) < 24) || (mob_get_viewclass(pd->class) > 4000)) {
+ WBUFW(buf,12)=mob_db[pd->class].option;
+ WBUFW(buf,16)=mob_get_hair(pd->class);
+ WBUFW(buf,18)=mob_get_weapon(pd->class);
+ WBUFW(buf,20)=mob_get_head_buttom(pd->class);
+ WBUFL(buf,22)=gettick();
+ WBUFW(buf,26)=mob_get_shield(pd->class);
+ WBUFW(buf,28)=mob_get_head_top(pd->class);
+ WBUFW(buf,30)=mob_get_head_mid(pd->class);
+ WBUFW(buf,32)=mob_get_hair_color(pd->class);
+ WBUFW(buf,34)=mob_get_clothes_color(pd->class); //Add for player pet dye - Valaris
+ WBUFB(buf,49)=mob_get_sex(pd->class);
+ } else {
+ WBUFW(buf,16)=0x14;
+ if ((view = itemdb_viewid(pd->equip)) > 0)
+ WBUFW(buf,20)=view;
+ else
+ WBUFW(buf,20)=pd->equip;
+ WBUFL(buf,22)=gettick();
+ }
+ WBUFPOS2(buf,50,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y);
+ WBUFB(buf,56)=0;
+ WBUFB(buf,57)=0;
+ WBUFW(buf,58)=((level = battle_get_lv(&pd->bl))>battle_config.max_lv)? battle_config.max_lv:level;
+
+ return packet_len_table[0x7b];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_set01e1(struct map_session_data *sd, unsigned char *buf) {
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x1e1;
+ WBUFL(buf,2)=sd->bl.id;
+ WBUFW(buf,6)=sd->spiritball;
+
+ return packet_len_table[0x1e1];
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_set0192(int fd, int m, int x, int y, int type) {
+ WFIFOW(fd,0) = 0x192;
+ WFIFOW(fd,2) = x;
+ WFIFOW(fd,4) = y;
+ WFIFOW(fd,6) = type;
+ memcpy(WFIFOP(fd,8),map[m].name,16);
+ WFIFOSET(fd,packet_len_table[0x192]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_spawnpc(struct map_session_data *sd) {
+ unsigned char buf[128];
+
+ nullpo_retr(0, sd);
+
+ if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris]
+ clif_clearchar(&sd->bl, 9);
+
+ memset(buf, 0, packet_len_table[0x119]);
+
+ WBUFW(buf, 0) = 0x119;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFW(buf, 6) = 0;
+ WBUFW(buf, 8) = 0;
+ WBUFW(buf,10) = 0x40;
+ WBUFB(buf,12) = 0;
+
+ clif_send(buf, packet_len_table[0x119], &sd->bl, SELF);
+
+ memset(buf, 0, packet_len_table[0x7c]);
+
+ WBUFW(buf, 0) = 0x7c;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFW(buf, 6) = sd->speed;
+ WBUFW(buf, 8) = sd->opt1;
+ WBUFW(buf,10) = sd->opt2;
+ WBUFW(buf,12) = sd->status.option;
+ WBUFW(buf,20) = sd->disguise;
+ WBUFPOS(buf, 36, sd->bl.x, sd->bl.y);
+ clif_send(buf, packet_len_table[0x7c], &sd->bl, AREA);
+ }
+
+ clif_set0078(sd, buf);
+
+#if PACKETVER < 4
+ WBUFW(buf, 0) = 0x79;
+ WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
+ clif_send(buf, packet_len_table[0x79], &sd->bl, AREA_WOS);
+#else
+ WBUFW(buf, 0) = 0x1d9;
+ WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level;
+ clif_send(buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS);
+#endif
+
+
+ if (sd->spiritball > 0)
+ clif_spiritball(sd);
+
+ if (sd->status.guild_id > 0) { // force display of guild emblem [Valaris]
+ struct guild *g = guild_search(sd->status.guild_id);
+ if (g)
+ clif_guild_emblem(sd,g);
+ } // end addition [Valaris]
+
+ if (sd->status.class==13 || sd->status.class==21 || sd->status.class==4014 || sd->status.class==4022)
+ pc_setoption(sd,sd->status.option|0x0020); // [Valaris]
+
+ if ((pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0) && (sd->status.class==7 ||
+ sd->status.class==14 || sd->status.class==4008 || sd->status.class==4015))
+ pc_setriding(sd); // update peco riders for people upgrading athena [Valaris]
+
+
+ if (map[sd->bl.m].flag.snow)
+ clif_specialeffect(&sd->bl, 162, 1);
+ if (map[sd->bl.m].flag.fog)
+ clif_specialeffect(&sd->bl, 233, 1);
+ if (map[sd->bl.m].flag.sakura)
+ clif_specialeffect(&sd->bl, 163, 1);
+ if (map[sd->bl.m].flag.leaves)
+ clif_specialeffect(&sd->bl, 333, 1);
+ if (map[sd->bl.m].flag.rain)
+ clif_specialeffect(&sd->bl, 161, 1);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_spawnnpc(struct npc_data *nd)
+{
+ unsigned char buf[64];
+ int len;
+
+ nullpo_retr(0, nd);
+
+ if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS)
+ return 0;
+
+ memset(buf,0,packet_len_table[0x7c]);
+
+ WBUFW(buf,0)=0x7c;
+ WBUFL(buf,2)=nd->bl.id;
+ WBUFW(buf,6)=nd->speed;
+ WBUFW(buf,20)=nd->class;
+ WBUFPOS(buf,36,nd->bl.x,nd->bl.y);
+
+ clif_send(buf,packet_len_table[0x7c],&nd->bl,AREA);
+
+ len = clif_npc0078(nd,buf);
+ clif_send(buf,len,&nd->bl,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_spawnmob(struct mob_data *md)
+{
+ unsigned char buf[64];
+ int len;
+
+ nullpo_retr(0, md);
+
+ if (mob_get_viewclass(md->class) > 23 ) {
+ memset(buf,0,packet_len_table[0x7c]);
+
+ WBUFW(buf,0)=0x7c;
+ WBUFL(buf,2)=md->bl.id;
+ WBUFW(buf,6)=md->speed;
+ WBUFW(buf,8)=md->opt1;
+ WBUFW(buf,10)=md->opt2;
+ WBUFW(buf,12)=md->option;
+ WBUFW(buf,20)=mob_get_viewclass(md->class);
+ WBUFPOS(buf,36,md->bl.x,md->bl.y);
+ clif_send(buf,packet_len_table[0x7c],&md->bl,AREA);
+ }
+
+ len = clif_mob0078(md,buf);
+ clif_send(buf,len,&md->bl,AREA);
+
+ if (mob_get_equip(md->class) > 0) // mob equipment [Valaris]
+ clif_mob_equip(md,mob_get_equip(md->class));
+
+ return 0;
+}
+
+// pet
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_spawnpet(struct pet_data *pd)
+{
+ unsigned char buf[64];
+ int len;
+
+ nullpo_retr(0, pd);
+
+ if (mob_get_viewclass(pd->class) >= MAX_PC_CLASS) {
+ memset(buf,0,packet_len_table[0x7c]);
+
+ WBUFW(buf,0)=0x7c;
+ WBUFL(buf,2)=pd->bl.id;
+ WBUFW(buf,6)=pd->speed;
+ WBUFW(buf,20)=mob_get_viewclass(pd->class);
+ WBUFPOS(buf,36,pd->bl.x,pd->bl.y);
+
+ clif_send(buf,packet_len_table[0x7c],&pd->bl,AREA);
+ }
+
+ len = clif_pet0078(pd,buf);
+ clif_send(buf,len,&pd->bl,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_movepet(struct pet_data *pd) {
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, pd);
+
+ len = clif_pet007b(pd,buf);
+ clif_send(buf,len,&pd->bl,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * npc walking [Valaris]
+ *------------------------------------------
+ */
+int clif_movenpc(struct npc_data *nd) {
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, nd);
+
+ len = clif_npc007b(nd,buf);
+ clif_send(buf,len,&nd->bl,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_servertick(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x7f;
+ WFIFOL(fd,2)=sd->server_tick;
+ WFIFOSET(fd,packet_len_table[0x7f]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_walkok(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x87;
+ WFIFOL(fd,2)=gettick();;
+ WFIFOPOS2(fd,6,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y);
+ WFIFOB(fd,11)=0;
+ WFIFOSET(fd,packet_len_table[0x87]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_movechar(struct map_session_data *sd) {
+ int fd;
+ int len;
+ unsigned char buf[256];
+
+ nullpo_retr(0, sd);
+
+ fd = sd->fd;
+
+ len = clif_set007b(sd, buf);
+
+ if (sd->disguise > 23 && sd->disguise < 4001) {
+ clif_send(buf, len, &sd->bl, AREA);
+ return 0;
+ } else
+ clif_send(buf, len, &sd->bl, AREA_WOS);
+
+ if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0)
+ clif_changelook(&sd->bl, LOOK_CLOTHES_COLOR, sd->status.clothes_color);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_quitsave(int fd,struct map_session_data *sd)
+{
+ map_quit(sd);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int clif_waitclose(int tid, unsigned int tick, int id, int data) {
+ if (session[id])
+ session[id]->eof = 1;
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_setwaitclose(int fd) {
+ struct map_session_data *sd;
+
+ // if player is not already in the game (double connection probably)
+ if ((sd = session[fd]->session_data) == NULL) {
+ // limited timer, just to send information.
+ add_timer(gettick() + 1000, clif_waitclose, fd, 0);
+ } else
+ add_timer(gettick() + 5000, clif_waitclose, fd, 0);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_changemap(struct map_session_data *sd, char *mapname, int x, int y) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd = sd->fd;
+
+ WFIFOW(fd,0) = 0x91;
+ memcpy(WFIFOP(fd,2), mapname, 16);
+ WFIFOW(fd,18) = x;
+ WFIFOW(fd,20) = y;
+ WFIFOSET(fd, packet_len_table[0x91]);
+
+ if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
+ clif_spawnpc(sd);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_changemapserver(struct map_session_data *sd, char *mapname, int x, int y, int ip, int port) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd = sd->fd;
+ WFIFOW(fd,0) = 0x92;
+ memcpy(WFIFOP(fd,2), mapname, 16);
+ WFIFOW(fd,18) = x;
+ WFIFOW(fd,20) = y;
+ WFIFOL(fd,22) = ip;
+ WFIFOW(fd,26) = port;
+ WFIFOSET(fd, packet_len_table[0x92]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_fixpos(struct block_list *bl) {
+ char buf[16];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0)=0x88;
+ WBUFL(buf,2)=bl->id;
+ WBUFW(buf,6)=bl->x;
+ WBUFW(buf,8)=bl->y;
+
+ clif_send(buf, packet_len_table[0x88], bl, AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_npcbuysell(struct map_session_data* sd, int id) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xc4;
+ WFIFOL(fd,2)=id;
+ WFIFOSET(fd,packet_len_table[0xc4]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_buylist(struct map_session_data *sd, struct npc_data *nd) {
+ struct item_data *id;
+ int fd,i,val;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, nd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xc6;
+ for(i=0;nd->u.shop_item[i].nameid > 0;i++){
+ id = itemdb_search(nd->u.shop_item[i].nameid);
+ val=nd->u.shop_item[i].value;
+ WFIFOL(fd,4+i*11)=val;
+ if (!id->flag.value_notdc)
+ val=pc_modifybuyvalue(sd,val);
+ WFIFOL(fd,8+i*11)=val;
+ WFIFOB(fd,12+i*11)=id->type;
+ if (id->view_id > 0)
+ WFIFOW(fd,13+i*11)=id->view_id;
+ else
+ WFIFOW(fd,13+i*11)=nd->u.shop_item[i].nameid;
+ }
+ WFIFOW(fd,2)=i*11+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_selllist(struct map_session_data *sd) {
+ int fd,i,c=0,val;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xc7;
+ for(i=0;i<MAX_INVENTORY;i++) {
+ if(sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) {
+ val=sd->inventory_data[i]->value_sell;
+ if (val < 0)
+ continue;
+ WFIFOW(fd,4+c*10)=i+2;
+ WFIFOL(fd,6+c*10)=val;
+ if (!sd->inventory_data[i]->flag.value_notoc)
+ val=pc_modifysellvalue(sd,val);
+ WFIFOL(fd,10+c*10)=val;
+ c++;
+ }
+ }
+ WFIFOW(fd,2)=c*10+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptmes(struct map_session_data *sd, int npcid, char *mes) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xb4;
+ WFIFOW(fd,2)=strlen(mes)+9;
+ WFIFOL(fd,4)=npcid;
+ strcpy(WFIFOP(fd,8),mes);
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptnext(struct map_session_data *sd,int npcid) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xb5;
+ WFIFOL(fd,2)=npcid;
+ WFIFOSET(fd,packet_len_table[0xb5]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptclose(struct map_session_data *sd, int npcid) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xb6;
+ WFIFOL(fd,2)=npcid;
+ WFIFOSET(fd,packet_len_table[0xb6]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xb7;
+ WFIFOW(fd,2)=strlen(mes)+8;
+ WFIFOL(fd,4)=npcid;
+ strcpy(WFIFOP(fd,8),mes);
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptinput(struct map_session_data *sd, int npcid) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x142;
+ WFIFOL(fd,2)=npcid;
+ WFIFOSET(fd,packet_len_table[0x142]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_scriptinputstr(struct map_session_data *sd, int npcid) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1d4;
+ WFIFOL(fd,2)=npcid;
+ WFIFOSET(fd,packet_len_table[0x1d4]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x144;
+ WFIFOL(fd,2)=npc_id;
+ WFIFOL(fd,6)=type;
+ WFIFOL(fd,10)=x;
+ WFIFOL(fd,14)=y;
+ WFIFOB(fd,18)=id;
+ WFIFOL(fd,19)=color;
+ WFIFOSET(fd,packet_len_table[0x144]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_cutin(struct map_session_data *sd, char *image, int type) {
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1b3;
+ memcpy(WFIFOP(fd,2),image,64);
+ WFIFOB(fd,66)=type;
+ WFIFOSET(fd,packet_len_table[0x1b3]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_additem(struct map_session_data *sd, int n, int amount, int fail) {
+ int fd,j;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf=WFIFOP(fd,0);
+ if(fail) {
+ WBUFW(buf,0)=0xa0;
+ WBUFW(buf,2)=n+2;
+ WBUFW(buf,4)=amount;
+ WBUFW(buf,6)=0;
+ WBUFB(buf,8)=0;
+ WBUFB(buf,9)=0;
+ WBUFB(buf,10)=0;
+ WBUFW(buf,11)=0;
+ WBUFW(buf,13)=0;
+ WBUFW(buf,15)=0;
+ WBUFW(buf,17)=0;
+ WBUFW(buf,19)=0;
+ WBUFB(buf,21)=0;
+ WBUFB(buf,22)=fail;
+ } else {
+ if (n<0 || n>=MAX_INVENTORY || sd->status.inventory[n].nameid <=0 || sd->inventory_data[n] == NULL)
+ return 1;
+
+ WBUFW(buf,0)=0xa0;
+ WBUFW(buf,2)=n+2;
+ WBUFW(buf,4)=amount;
+ if (sd->inventory_data[n]->view_id > 0)
+ WBUFW(buf,6)=sd->inventory_data[n]->view_id;
+ else
+ WBUFW(buf,6)=sd->status.inventory[n].nameid;
+ WBUFB(buf,8)=sd->status.inventory[n].identify;
+ WBUFB(buf,9)=sd->status.inventory[n].attribute;
+ WBUFB(buf,10)=sd->status.inventory[n].refine;
+ if(sd->status.inventory[n].card[0]==0x00ff || sd->status.inventory[n].card[0]==0x00fe || sd->status.inventory[n].card[0]==(short)0xff00) {
+ WBUFW(buf,11)=sd->status.inventory[n].card[0];
+ WBUFW(buf,13)=sd->status.inventory[n].card[1];
+ WBUFW(buf,15)=sd->status.inventory[n].card[2];
+ WBUFW(buf,17)=sd->status.inventory[n].card[3];
+ } else {
+ if (sd->status.inventory[n].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[0])) > 0)
+ WBUFW(buf,11)=j;
+ else
+ WBUFW(buf,11)=sd->status.inventory[n].card[0];
+ if (sd->status.inventory[n].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[1])) > 0)
+ WBUFW(buf,13)=j;
+ else
+ WBUFW(buf,13)=sd->status.inventory[n].card[1];
+ if (sd->status.inventory[n].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[2])) > 0)
+ WBUFW(buf,15)=j;
+ else
+ WBUFW(buf,15)=sd->status.inventory[n].card[2];
+ if (sd->status.inventory[n].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[3])) > 0)
+ WBUFW(buf,17)=j;
+ else
+ WBUFW(buf,17)=sd->status.inventory[n].card[3];
+ }
+ WBUFW(buf,19)=pc_equippoint(sd,n);
+ WBUFB(buf,21)=(sd->inventory_data[n]->type == 7)? 4:sd->inventory_data[n]->type;
+ WBUFB(buf,22)=fail;
+ }
+
+ WFIFOSET(fd,packet_len_table[0xa0]);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_delitem(struct map_session_data *sd,int n,int amount)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xaf;
+ WFIFOW(fd,2)=n+2;
+ WFIFOW(fd,4)=amount;
+
+ WFIFOSET(fd,packet_len_table[0xaf]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_itemlist(struct map_session_data *sd)
+{
+ int i,n,fd,arrow=-1;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+#if PACKETVER < 5
+ WBUFW(buf,0)=0xa3;
+ for(i=0,n=0;i<MAX_INVENTORY;i++){
+ if (sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
+ continue;
+ WBUFW(buf,n*10+4)=i+2;
+ if (sd->inventory_data[i]->view_id > 0)
+ WBUFW(buf,n*10+6)=sd->inventory_data[i]->view_id;
+ else
+ WBUFW(buf,n*10+6)=sd->status.inventory[i].nameid;
+ WBUFB(buf,n*10+8)=sd->inventory_data[i]->type;
+ WBUFB(buf,n*10+9)=sd->status.inventory[i].identify;
+ WBUFW(buf,n*10+10)=sd->status.inventory[i].amount;
+ if (sd->inventory_data[i]->equip == 0x8000) {
+ WBUFW(buf,n*10+12)=0x8000;
+ if (sd->status.inventory[i].equip)
+ arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
+ } else
+ WBUFW(buf,n*10+12)=0;
+ n++;
+ }
+ if (n) {
+ WBUFW(buf,2)=4+n*10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#else
+ WBUFW(buf,0)=0x1ee;
+ for(i=0,n=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i]))
+ continue;
+ WBUFW(buf,n*18+4)=i+2;
+ if(sd->inventory_data[i]->view_id > 0)
+ WBUFW(buf,n*18+6)=sd->inventory_data[i]->view_id;
+ else
+ WBUFW(buf,n*18+6)=sd->status.inventory[i].nameid;
+ WBUFB(buf,n*18+8)=sd->inventory_data[i]->type;
+ WBUFB(buf,n*18+9)=sd->status.inventory[i].identify;
+ WBUFW(buf,n*18+10)=sd->status.inventory[i].amount;
+ if (sd->inventory_data[i]->equip == 0x8000) {
+ WBUFW(buf,n*18+12)=0x8000;
+ if(sd->status.inventory[i].equip)
+ arrow=i; // ‚‚¢‚Å‚É–î‘•”õƒ`ƒFƒbƒN
+ } else
+ WBUFW(buf,n*18+12)=0;
+ WBUFW(buf,n*18+14)=sd->status.inventory[i].card[0];
+ WBUFW(buf,n*18+16)=sd->status.inventory[i].card[1];
+ WBUFW(buf,n*18+18)=sd->status.inventory[i].card[2];
+ WBUFW(buf,n*18+20)=sd->status.inventory[i].card[3];
+ n++;
+ }
+ if (n) {
+ WBUFW(buf,2)=4+n*18;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#endif
+ if(arrow >= 0)
+ clif_arrowequip(sd,arrow);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_equiplist(struct map_session_data *sd)
+{
+ int i,j,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+ WBUFW(buf,0)=0xa4;
+ for(i=0,n=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || !itemdb_isequip2(sd->inventory_data[i]))
+ continue;
+ WBUFW(buf,n*20+4)=i+2;
+ if(sd->inventory_data[i]->view_id > 0)
+ WBUFW(buf,n*20+6)=sd->inventory_data[i]->view_id;
+ else
+ WBUFW(buf,n*20+6)=sd->status.inventory[i].nameid;
+ WBUFB(buf,n*20+8)=(sd->inventory_data[i]->type == 7)? 4:sd->inventory_data[i]->type;
+ WBUFB(buf,n*20+9)=sd->status.inventory[i].identify;
+ WBUFW(buf,n*20+10)=pc_equippoint(sd,i);
+ WBUFW(buf,n*20+12)=sd->status.inventory[i].equip;
+ WBUFB(buf,n*20+14)=sd->status.inventory[i].attribute;
+ WBUFB(buf,n*20+15)=sd->status.inventory[i].refine;
+ if(sd->status.inventory[i].card[0]==0x00ff || sd->status.inventory[i].card[0]==0x00fe || sd->status.inventory[i].card[0]==(short)0xff00) {
+ WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
+ WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
+ WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
+ WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
+ } else {
+ if(sd->status.inventory[i].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[0])) > 0)
+ WBUFW(buf,n*20+16)=j;
+ else
+ WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0];
+ if(sd->status.inventory[i].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[1])) > 0)
+ WBUFW(buf,n*20+18)=j;
+ else
+ WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1];
+ if(sd->status.inventory[i].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[2])) > 0)
+ WBUFW(buf,n*20+20)=j;
+ else
+ WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2];
+ if(sd->status.inventory[i].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[3])) > 0)
+ WBUFW(buf,n*20+22)=j;
+ else
+ WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3];
+ }
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*20;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚éÁ–Õ•i&ŽûW•iƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_storageitemlist(struct map_session_data *sd,struct storage *stor)
+{
+ struct item_data *id;
+ int i,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+#if PACKETVER < 5
+ WBUFW(buf,0)=0xa5;
+ for(i=0,n=0;i<MAX_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(itemdb_isequip2(id))
+ continue;
+
+ WBUFW(buf,n*10+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*10+6)=id->view_id;
+ else
+ WBUFW(buf,n*10+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*10+8)=id->type;;
+ WBUFB(buf,n*10+9)=stor->storage[i].identify;
+ WBUFW(buf,n*10+10)=stor->storage[i].amount;
+ WBUFW(buf,n*10+12)=0;
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#else
+ WBUFW(buf,0)=0x1f0;
+ for(i=0,n=0;i<MAX_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(itemdb_isequip2(id))
+ continue;
+
+ WBUFW(buf,n*18+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*18+6)=id->view_id;
+ else
+ WBUFW(buf,n*18+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*18+8)=id->type;;
+ WBUFB(buf,n*18+9)=stor->storage[i].identify;
+ WBUFW(buf,n*18+10)=stor->storage[i].amount;
+ WBUFW(buf,n*18+12)=0;
+ WBUFW(buf,n*18+14)=stor->storage[i].card[0];
+ WBUFW(buf,n*18+16)=stor->storage[i].card[1];
+ WBUFW(buf,n*18+18)=stor->storage[i].card[2];
+ WBUFW(buf,n*18+20)=stor->storage[i].card[3];
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*18;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#endif
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‚³‚ñ‚É—a‚¯‚Ä‚ ‚é‘•”õƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_storageequiplist(struct map_session_data *sd,struct storage *stor)
+{
+ struct item_data *id;
+ int i,j,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+ WBUFW(buf,0)=0xa6;
+ for(i=0,n=0;i<MAX_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(!itemdb_isequip2(id))
+ continue;
+ WBUFW(buf,n*20+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*20+6)=id->view_id;
+ else
+ WBUFW(buf,n*20+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*20+8)=id->type;
+ WBUFB(buf,n*20+9)=stor->storage[i].identify;
+ WBUFW(buf,n*20+10)=id->equip;
+ WBUFW(buf,n*20+12)=stor->storage[i].equip;
+ WBUFB(buf,n*20+14)=stor->storage[i].attribute;
+ WBUFB(buf,n*20+15)=stor->storage[i].refine;
+ if(stor->storage[i].card[0]==0x00ff || stor->storage[i].card[0]==0x00fe || stor->storage[i].card[0]==(short)0xff00) {
+ WBUFW(buf,n*20+16)=stor->storage[i].card[0];
+ WBUFW(buf,n*20+18)=stor->storage[i].card[1];
+ WBUFW(buf,n*20+20)=stor->storage[i].card[2];
+ WBUFW(buf,n*20+22)=stor->storage[i].card[3];
+ } else {
+ if(stor->storage[i].card[0] > 0 && (j=itemdb_viewid(stor->storage[i].card[0])) > 0)
+ WBUFW(buf,n*20+16)=j;
+ else
+ WBUFW(buf,n*20+16)=stor->storage[i].card[0];
+ if(stor->storage[i].card[1] > 0 && (j=itemdb_viewid(stor->storage[i].card[1])) > 0)
+ WBUFW(buf,n*20+18)=j;
+ else
+ WBUFW(buf,n*20+18)=stor->storage[i].card[1];
+ if(stor->storage[i].card[2] > 0 && (j=itemdb_viewid(stor->storage[i].card[2])) > 0)
+ WBUFW(buf,n*20+20)=j;
+ else
+ WBUFW(buf,n*20+20)=stor->storage[i].card[2];
+ if(stor->storage[i].card[3] > 0 && (j=itemdb_viewid(stor->storage[i].card[3])) > 0)
+ WBUFW(buf,n*20+22)=j;
+ else
+ WBUFW(buf,n*20+22)=stor->storage[i].card[3];
+ }
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*20;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor)
+{
+ struct item_data *id;
+ int i,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ buf=WFIFOP(fd,0);
+
+#if PACKETVER < 5
+ WBUFW(buf,0)=0xa5;
+ for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(itemdb_isequip2(id))
+ continue;
+
+ WBUFW(buf,n*10+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*10+6)=id->view_id;
+ else
+ WBUFW(buf,n*10+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*10+8)=id->type;;
+ WBUFB(buf,n*10+9)=stor->storage[i].identify;
+ WBUFW(buf,n*10+10)=stor->storage[i].amount;
+ WBUFW(buf,n*10+12)=0;
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#else
+ WBUFW(buf,0)=0x1f0;
+ for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(itemdb_isequip2(id))
+ continue;
+
+ WBUFW(buf,n*18+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*18+6)=id->view_id;
+ else
+ WBUFW(buf,n*18+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*18+8)=id->type;;
+ WBUFB(buf,n*18+9)=stor->storage[i].identify;
+ WBUFW(buf,n*18+10)=stor->storage[i].amount;
+ WBUFW(buf,n*18+12)=0;
+ WBUFW(buf,n*18+14)=stor->storage[i].card[0];
+ WBUFW(buf,n*18+16)=stor->storage[i].card[1];
+ WBUFW(buf,n*18+18)=stor->storage[i].card[2];
+ WBUFW(buf,n*18+20)=stor->storage[i].card[3];
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*18;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#endif
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor)
+{
+ struct item_data *id;
+ int i,j,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf=WFIFOP(fd,0);
+
+ WBUFW(buf,0)=0xa6;
+ for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){
+ if(stor->storage[i].nameid<=0)
+ continue;
+ nullpo_retr(0, id = itemdb_search(stor->storage[i].nameid));
+ if(!itemdb_isequip2(id))
+ continue;
+ WBUFW(buf,n*20+4)=i+1;
+ if(id->view_id > 0)
+ WBUFW(buf,n*20+6)=id->view_id;
+ else
+ WBUFW(buf,n*20+6)=stor->storage[i].nameid;
+ WBUFB(buf,n*20+8)=id->type;
+ WBUFB(buf,n*20+9)=stor->storage[i].identify;
+ WBUFW(buf,n*20+10)=id->equip;
+ WBUFW(buf,n*20+12)=stor->storage[i].equip;
+ WBUFB(buf,n*20+14)=stor->storage[i].attribute;
+ WBUFB(buf,n*20+15)=stor->storage[i].refine;
+ if(stor->storage[i].card[0]==0x00ff || stor->storage[i].card[0]==0x00fe || stor->storage[i].card[0]==(short)0xff00) {
+ WBUFW(buf,n*20+16)=stor->storage[i].card[0];
+ WBUFW(buf,n*20+18)=stor->storage[i].card[1];
+ WBUFW(buf,n*20+20)=stor->storage[i].card[2];
+ WBUFW(buf,n*20+22)=stor->storage[i].card[3];
+ } else {
+ if(stor->storage[i].card[0] > 0 && (j=itemdb_viewid(stor->storage[i].card[0])) > 0)
+ WBUFW(buf,n*20+16)=j;
+ else
+ WBUFW(buf,n*20+16)=stor->storage[i].card[0];
+ if(stor->storage[i].card[1] > 0 && (j=itemdb_viewid(stor->storage[i].card[1])) > 0)
+ WBUFW(buf,n*20+18)=j;
+ else
+ WBUFW(buf,n*20+18)=stor->storage[i].card[1];
+ if(stor->storage[i].card[2] > 0 && (j=itemdb_viewid(stor->storage[i].card[2])) > 0)
+ WBUFW(buf,n*20+20)=j;
+ else
+ WBUFW(buf,n*20+20)=stor->storage[i].card[2];
+ if(stor->storage[i].card[3] > 0 && (j=itemdb_viewid(stor->storage[i].card[3])) > 0)
+ WBUFW(buf,n*20+22)=j;
+ else
+ WBUFW(buf,n*20+22)=stor->storage[i].card[3];
+ }
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*20;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒe[ƒ^ƒX‚ð‘—‚è‚‚¯‚é
+ * •\Ž¦ê—p”Žš‚Í‚±‚Ì’†‚ÅŒvŽZ‚µ‚Ä‘—‚é
+ *------------------------------------------
+ */
+int clif_updatestatus(struct map_session_data *sd,int type)
+{
+ int fd,len=8;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0xb0;
+ WFIFOW(fd,2)=type;
+ switch(type){
+ // 00b0
+ case SP_WEIGHT:
+ pc_checkweighticon(sd);
+ WFIFOW(fd,0)=0xb0;
+ WFIFOW(fd,2)=type;
+ WFIFOL(fd,4)=sd->weight;
+ break;
+ case SP_MAXWEIGHT:
+ WFIFOL(fd,4)=sd->max_weight;
+ break;
+ case SP_SPEED:
+ WFIFOL(fd,4)=sd->speed;
+ break;
+ case SP_BASELEVEL:
+ WFIFOL(fd,4)=sd->status.base_level;
+ break;
+ case SP_JOBLEVEL:
+ WFIFOL(fd,4)=sd->status.job_level;
+ break;
+ case SP_MANNER:
+ WFIFOL(fd,4)=sd->status.manner;
+ clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
+ break;
+ case SP_STATUSPOINT:
+ WFIFOL(fd,4)=sd->status.status_point;
+ break;
+ case SP_SKILLPOINT:
+ WFIFOL(fd,4)=sd->status.skill_point;
+ break;
+ case SP_HIT:
+ WFIFOL(fd,4)=sd->hit;
+ break;
+ case SP_FLEE1:
+ WFIFOL(fd,4)=sd->flee;
+ break;
+ case SP_FLEE2:
+ WFIFOL(fd,4)=sd->flee2/10;
+ break;
+ case SP_MAXHP:
+ WFIFOL(fd,4)=sd->status.max_hp;
+ break;
+ case SP_MAXSP:
+ WFIFOL(fd,4)=sd->status.max_sp;
+ break;
+ case SP_HP:
+ WFIFOL(fd,4)=sd->status.hp;
+ break;
+ case SP_SP:
+ WFIFOL(fd,4)=sd->status.sp;
+ break;
+ case SP_ASPD:
+ WFIFOL(fd,4)=sd->aspd;
+ break;
+ case SP_ATK1:
+ WFIFOL(fd,4)=sd->base_atk+sd->watk;
+ break;
+ case SP_DEF1:
+ WFIFOL(fd,4)=sd->def;
+ break;
+ case SP_MDEF1:
+ WFIFOL(fd,4)=sd->mdef;
+ break;
+ case SP_ATK2:
+ WFIFOL(fd,4)=sd->watk2;
+ break;
+ case SP_DEF2:
+ WFIFOL(fd,4)=sd->def2;
+ break;
+ case SP_MDEF2:
+ WFIFOL(fd,4)=sd->mdef2;
+ break;
+ case SP_CRITICAL:
+ WFIFOL(fd,4)=sd->critical/10;
+ break;
+ case SP_MATK1:
+ WFIFOL(fd,4)=sd->matk1;
+ break;
+ case SP_MATK2:
+ WFIFOL(fd,4)=sd->matk2;
+ break;
+
+
+ case SP_ZENY:
+ WFIFOW(fd,0)=0xb1;
+ if(sd->status.zeny < 0)
+ sd->status.zeny = 0;
+ WFIFOL(fd,4)=sd->status.zeny;
+ break;
+ case SP_BASEEXP:
+ WFIFOW(fd,0)=0xb1;
+ WFIFOL(fd,4)=sd->status.base_exp;
+ break;
+ case SP_JOBEXP:
+ WFIFOW(fd,0)=0xb1;
+ WFIFOL(fd,4)=sd->status.job_exp;
+ break;
+ case SP_NEXTBASEEXP:
+ WFIFOW(fd,0)=0xb1;
+ WFIFOL(fd,4)=pc_nextbaseexp(sd);
+ break;
+ case SP_NEXTJOBEXP:
+ WFIFOW(fd,0)=0xb1;
+ WFIFOL(fd,4)=pc_nextjobexp(sd);
+ break;
+
+ // 00be I—¹
+ case SP_USTR:
+ case SP_UAGI:
+ case SP_UVIT:
+ case SP_UINT:
+ case SP_UDEX:
+ case SP_ULUK:
+ WFIFOW(fd,0)=0xbe;
+ WFIFOB(fd,4)=pc_need_status_point(sd,type-SP_USTR+SP_STR);
+ len=5;
+ break;
+
+ // 013a I—¹
+ case SP_ATTACKRANGE:
+ WFIFOW(fd,0)=0x13a;
+ WFIFOW(fd,2)=sd->attackrange;
+ len=4;
+ break;
+
+ // 0141 I—¹
+ case SP_STR:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.str;
+ WFIFOL(fd,10)=sd->paramb[0] + sd->parame[0];
+ len=14;
+ break;
+ case SP_AGI:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.agi;
+ WFIFOL(fd,10)=sd->paramb[1] + sd->parame[1];
+ len=14;
+ break;
+ case SP_VIT:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.vit;
+ WFIFOL(fd,10)=sd->paramb[2] + sd->parame[2];
+ len=14;
+ break;
+ case SP_INT:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.int_;
+ WFIFOL(fd,10)=sd->paramb[3] + sd->parame[3];
+ len=14;
+ break;
+ case SP_DEX:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.dex;
+ WFIFOL(fd,10)=sd->paramb[4] + sd->parame[4];
+ len=14;
+ break;
+ case SP_LUK:
+ WFIFOW(fd,0)=0x141;
+ WFIFOL(fd,2)=type;
+ WFIFOL(fd,6)=sd->status.luk;
+ WFIFOL(fd,10)=sd->paramb[5] + sd->parame[5];
+ len=14;
+ break;
+
+ case SP_CARTINFO:
+ WFIFOW(fd,0)=0x121;
+ WFIFOW(fd,2)=sd->cart_num;
+ WFIFOW(fd,4)=sd->cart_max_num;
+ WFIFOL(fd,6)=sd->cart_weight;
+ WFIFOL(fd,10)=sd->cart_max_weight;
+ len=14;
+ break;
+
+ default:
+ if(battle_config.error_log)
+ printf("clif_updatestatus : make %d routine\n",type);
+ return 1;
+ }
+ WFIFOSET(fd,len);
+
+ return 0;
+}
+int clif_changestatus(struct block_list *bl,int type,int val)
+{
+ unsigned char buf[12];
+ struct map_session_data *sd = NULL;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type == BL_PC)
+ sd = (struct map_session_data *)bl;
+
+//printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val);
+ if(sd){
+ WBUFW(buf,0)=0x1ab;
+ WBUFL(buf,2)=bl->id;
+ WBUFW(buf,6)=type;
+ switch(type){
+ case SP_MANNER:
+ WBUFL(buf,8)=val;
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("clif_changestatus : make %d routine\n",type);
+ return 1;
+ }
+ clif_send(buf,packet_len_table[0x1ab],bl,AREA_WOS);
+ }
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_changelook(struct block_list *bl,int type,int val)
+{
+
+ unsigned char buf[32];
+ struct map_session_data *sd = NULL;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type == BL_PC)
+ sd = (struct map_session_data *)bl;
+
+ if(sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
+ return 0;
+
+#if PACKETVER < 4
+ if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD) && sd->view_class == 22)
+ val =0;
+ WBUFW(buf,0)=0xc3;
+ WBUFL(buf,2)=bl->id;
+ WBUFB(buf,6)=type;
+ WBUFB(buf,7)=val;
+ clif_send(buf,packet_len_table[0xc3],bl,AREA);
+#else
+ if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD || type == LOOK_SHOES)) {
+ WBUFW(buf,0)=0x1d7;
+ WBUFL(buf,2)=bl->id;
+ if(type == LOOK_SHOES) {
+ WBUFB(buf,6)=9;
+ if(sd->equip_index[2] >= 0 && sd->inventory_data[sd->equip_index[2]]) {
+ if(sd->inventory_data[sd->equip_index[2]]->view_id > 0)
+ WBUFW(buf,7)=sd->inventory_data[sd->equip_index[2]]->view_id;
+ else
+ WBUFW(buf,7)=sd->status.inventory[sd->equip_index[2]].nameid;
+ } else
+ WBUFW(buf,7)=0;
+ WBUFW(buf,9)=0;
+ }
+ else {
+ WBUFB(buf,6)=2;
+ if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) {
+ if(sd->inventory_data[sd->equip_index[9]]->view_id > 0)
+ WBUFW(buf,7)=sd->inventory_data[sd->equip_index[9]]->view_id;
+ else
+ WBUFW(buf,7)=sd->status.inventory[sd->equip_index[9]].nameid;
+ } else
+ WBUFW(buf,7)=0;
+ if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] &&
+ sd->view_class != 22) {
+ if(sd->inventory_data[sd->equip_index[8]]->view_id > 0)
+ WBUFW(buf,9)=sd->inventory_data[sd->equip_index[8]]->view_id;
+ else
+ WBUFW(buf,9)=sd->status.inventory[sd->equip_index[8]].nameid;
+ } else
+ WBUFW(buf,9)=0;
+ }
+ clif_send(buf,packet_len_table[0x1d7],bl,AREA);
+ }
+ else if(sd && (type == LOOK_BASE) && (val > 255))
+ {
+ WBUFW(buf,0)=0x1d7;
+ WBUFL(buf,2)=bl->id;
+ WBUFB(buf,6)=type;
+ WBUFW(buf,7)=val;
+ WBUFW(buf,9)=0;
+ clif_send(buf,packet_len_table[0x1d7],bl,AREA);
+ } else {
+ WBUFW(buf,0)=0xc3;
+ WBUFL(buf,2)=bl->id;
+ WBUFB(buf,6)=type;
+ WBUFB(buf,7)=val;
+ clif_send(buf,packet_len_table[0xc3],bl,AREA);
+ }
+#endif
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_initialstatus(struct map_session_data *sd)
+{
+ int fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf=WFIFOP(fd,0);
+
+ WBUFW(buf,0)=0xbd;
+ WBUFW(buf,2)=sd->status.status_point;
+ WBUFB(buf,4)=(sd->status.str > 255)? 255:sd->status.str;
+ WBUFB(buf,5)=pc_need_status_point(sd,SP_STR);
+ WBUFB(buf,6)=(sd->status.agi > 255)? 255:sd->status.agi;
+ WBUFB(buf,7)=pc_need_status_point(sd,SP_AGI);
+ WBUFB(buf,8)=(sd->status.vit > 255)? 255:sd->status.vit;
+ WBUFB(buf,9)=pc_need_status_point(sd,SP_VIT);
+ WBUFB(buf,10)=(sd->status.int_ > 255)? 255:sd->status.int_;
+ WBUFB(buf,11)=pc_need_status_point(sd,SP_INT);
+ WBUFB(buf,12)=(sd->status.dex > 255)? 255:sd->status.dex;
+ WBUFB(buf,13)=pc_need_status_point(sd,SP_DEX);
+ WBUFB(buf,14)=(sd->status.luk > 255)? 255:sd->status.luk;
+ WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK);
+
+ WBUFW(buf,16) = sd->base_atk + sd->watk;
+ WBUFW(buf,18) = sd->watk2; //atk bonus
+ WBUFW(buf,20) = sd->matk1;
+ WBUFW(buf,22) = sd->matk2;
+ WBUFW(buf,24) = sd->def; // def
+ WBUFW(buf,26) = sd->def2;
+ WBUFW(buf,28) = sd->mdef; // mdef
+ WBUFW(buf,30) = sd->mdef2;
+ WBUFW(buf,32) = sd->hit;
+ WBUFW(buf,34) = sd->flee;
+ WBUFW(buf,36) = sd->flee2/10;
+ WBUFW(buf,38) = sd->critical/10;
+ WBUFW(buf,40) = sd->status.karma;
+ WBUFW(buf,42) = sd->status.manner;
+
+ WFIFOSET(fd,packet_len_table[0xbd]);
+
+ clif_updatestatus(sd,SP_STR);
+ clif_updatestatus(sd,SP_AGI);
+ clif_updatestatus(sd,SP_VIT);
+ clif_updatestatus(sd,SP_INT);
+ clif_updatestatus(sd,SP_DEX);
+ clif_updatestatus(sd,SP_LUK);
+
+ clif_updatestatus(sd,SP_ATTACKRANGE);
+ clif_updatestatus(sd,SP_ASPD);
+
+ return 0;
+}
+
+/*==========================================
+ *–î‘•”õ
+ *------------------------------------------
+ */
+int clif_arrowequip(struct map_session_data *sd,int val)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ if(sd->attacktarget && sd->attacktarget > 0) // [Valaris]
+ sd->attacktarget = 0;
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x013c;
+ WFIFOW(fd,2)=val+2;//–î‚̃AƒCƒeƒ€ID
+
+ WFIFOSET(fd,packet_len_table[0x013c]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_arrow_fail(struct map_session_data *sd,int type)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x013b;
+ WFIFOW(fd,2)=type;
+
+ WFIFOSET(fd,packet_len_table[0x013b]);
+
+ return 0;
+}
+
+/*==========================================
+ * 쬉”\ –ƒXƒg‘—M
+ *------------------------------------------
+ */
+int clif_arrow_create_list(struct map_session_data *sd)
+{
+ int i,c,view;
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1ad;
+
+ for(i=0,c=0;i<MAX_SKILL_ARROW_DB;i++){
+ if(skill_arrow_db[i].nameid > 0 && pc_search_inventory(sd,skill_arrow_db[i].nameid)>=0){
+ if((view = itemdb_viewid(skill_arrow_db[i].nameid)) > 0)
+ WFIFOW(fd,c*2+4) = view;
+ else
+ WFIFOW(fd,c*2+4) = skill_arrow_db[i].nameid;
+ c++;
+ }
+ }
+ WFIFOW(fd,2)=c*2+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ if(c > 0) sd->state.make_arrow_flag = 1;
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_statusupack(struct map_session_data *sd,int type,int ok,int val)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xbc;
+ WFIFOW(fd,2)=type;
+ WFIFOB(fd,4)=ok;
+ WFIFOB(fd,5)=val;
+ WFIFOSET(fd,packet_len_table[0xbc]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_equipitemack(struct map_session_data *sd,int n,int pos,int ok)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xaa;
+ WFIFOW(fd,2)=n+2;
+ WFIFOW(fd,4)=pos;
+ WFIFOB(fd,6)=ok;
+ WFIFOSET(fd,packet_len_table[0xaa]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xac;
+ WFIFOW(fd,2)=n+2;
+ WFIFOW(fd,4)=pos;
+ WFIFOB(fd,6)=ok;
+ WFIFOSET(fd,packet_len_table[0xac]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_misceffect(struct block_list* bl,int type)
+{
+ char buf[32];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0) = 0x19b;
+ WBUFL(buf,2) = bl->id;
+ WBUFL(buf,6) = type;
+
+ clif_send(buf,packet_len_table[0x19b],bl,AREA);
+
+ return 0;
+}
+int clif_misceffect2(struct block_list *bl, int type) {
+ unsigned char buf[24];
+
+ nullpo_retr(0, bl);
+
+ memset(buf, 0, packet_len_table[0x1f3]);
+
+ WBUFW(buf,0) = 0x1f3;
+ WBUFL(buf,2) = bl->id;
+ WBUFL(buf,6) = type;
+
+ clif_send(buf, packet_len_table[0x1f3], bl, AREA);
+
+ return 0;
+
+}
+/*==========================================
+ * •\Ž¦ƒIƒvƒVƒ‡ƒ“•ÏX
+ *------------------------------------------
+ */
+int clif_changeoption(struct block_list* bl)
+{
+ char buf[32];
+ short option;
+ struct status_change *sc_data;
+ static const int omask[]={ 0x10,0x20 };
+ static const int scnum[]={ SC_FALCON, SC_RIDING };
+ int i;
+
+ nullpo_retr(0, bl);
+
+ option = *battle_get_option(bl);
+ sc_data = battle_get_sc_data(bl);
+
+ WBUFW(buf,0) = 0x119;
+ WBUFL(buf,2) = bl->id;
+ WBUFW(buf,6) = *battle_get_opt1(bl);
+ WBUFW(buf,8) = *battle_get_opt2(bl);
+ WBUFW(buf,10) = option;
+ WBUFB(buf,12) = 0; // ??
+
+ if(bl->type==BL_PC) { // disguises [Valaris]
+ struct map_session_data *sd=((struct map_session_data *)bl);
+ if(sd && sd->disguise > 23 && sd->disguise < 4001) {
+ clif_send(buf,packet_len_table[0x119],bl,AREA_WOS);
+ clif_spawnpc(sd);
+ } else
+ clif_send(buf,packet_len_table[0x119],bl,AREA);
+ } else
+ clif_send(buf,packet_len_table[0x119],bl,AREA);
+
+ // ƒAƒCƒRƒ“‚Ì•\Ž¦
+ for(i=0;i<sizeof(omask)/sizeof(omask[0]);i++){
+ if( option&omask[i] ){
+ if( sc_data[scnum[i]].timer==-1)
+ skill_status_change_start(bl,scnum[i],0,0,0,0,0,0);
+ } else {
+ skill_status_change_end(bl,scnum[i],-1);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_useitemack(struct map_session_data *sd,int index,int amount,int ok)
+{
+ nullpo_retr(0, sd);
+
+ if(!ok) {
+ int fd=sd->fd;
+ WFIFOW(fd,0)=0xa8;
+ WFIFOW(fd,2)=index+2;
+ WFIFOW(fd,4)=amount;
+ WFIFOB(fd,6)=ok;
+ WFIFOSET(fd,packet_len_table[0xa8]);
+ }
+ else {
+#if PACKETVER < 3
+ int fd=sd->fd;
+ WFIFOW(fd,0)=0xa8;
+ WFIFOW(fd,2)=index+2;
+ WFIFOW(fd,4)=amount;
+ WFIFOB(fd,6)=ok;
+ WFIFOSET(fd,packet_len_table[0xa8]);
+#else
+ char buf[32];
+
+ WBUFW(buf,0)=0x1c8;
+ WBUFW(buf,2)=index+2;
+ if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
+ WBUFW(buf,4)=sd->inventory_data[index]->view_id;
+ else
+ WBUFW(buf,4)=sd->status.inventory[index].nameid;
+ WBUFL(buf,6)=sd->bl.id;
+ WBUFW(buf,10)=amount;
+ WBUFB(buf,12)=ok;
+ clif_send(buf,packet_len_table[0x1c8],&sd->bl,AREA);
+#endif
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_createchat(struct map_session_data *sd,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xd6;
+ WFIFOB(fd,2)=fail;
+ WFIFOSET(fd,packet_len_table[0xd6]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_dispchat(struct chat_data *cd,int fd)
+{
+ char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
+
+ if(cd==NULL || *cd->owner==NULL)
+ return 1;
+
+ WBUFW(buf,0)=0xd7;
+ WBUFW(buf,2)=strlen(cd->title)+17;
+ WBUFL(buf,4)=(*cd->owner)->id;
+ WBUFL(buf,8)=cd->bl.id;
+ WBUFW(buf,12)=cd->limit;
+ WBUFW(buf,14)=cd->users;
+ WBUFB(buf,16)=cd->pub;
+ strcpy(WBUFP(buf,17),cd->title);
+ if(fd){
+ memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
+ WFIFOSET(fd,WBUFW(buf,2));
+ } else {
+ clif_send(buf,WBUFW(buf,2),*cd->owner,AREA_WOSC);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * chat‚Ìó‘Ô•ÏX¬Œ÷
+ * ŠO•”‚Ìl—p‚Æ–½—߃R[ƒh(d7->df)‚ªˆá‚¤‚¾‚¯
+ *------------------------------------------
+ */
+int clif_changechatstatus(struct chat_data *cd)
+{
+ char buf[128]; // Å‘åtitle(60ƒoƒCƒg)+17
+
+ if(cd==NULL || cd->usersd[0]==NULL)
+ return 1;
+
+ WBUFW(buf,0)=0xdf;
+ WBUFW(buf,2)=strlen(cd->title)+17;
+ WBUFL(buf,4)=cd->usersd[0]->bl.id;
+ WBUFL(buf,8)=cd->bl.id;
+ WBUFW(buf,12)=cd->limit;
+ WBUFW(buf,14)=cd->users;
+ WBUFB(buf,16)=cd->pub;
+ strcpy(WBUFP(buf,17),cd->title);
+ clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_clearchat(struct chat_data *cd,int fd)
+{
+ char buf[32];
+
+ nullpo_retr(0, cd);
+
+ WBUFW(buf,0)=0xd8;
+ WBUFL(buf,2)=cd->bl.id;
+ if(fd){
+ memcpy(WFIFOP(fd,0),buf,packet_len_table[0xd8]);
+ WFIFOSET(fd,packet_len_table[0xd8]);
+ } else {
+ clif_send(buf,packet_len_table[0xd8],*cd->owner,AREA_WOSC);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_joinchatfail(struct map_session_data *sd,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0xda;
+ WFIFOB(fd,2)=fail;
+ WFIFOSET(fd,packet_len_table[0xda]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_joinchatok(struct map_session_data *sd,struct chat_data* cd)
+{
+ int fd;
+ int i;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, cd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xdb;
+ WFIFOW(fd,2)=8+(28*cd->users);
+ WFIFOL(fd,4)=cd->bl.id;
+ for(i = 0;i < cd->users;i++){
+ WFIFOL(fd,8+i*28) = (i!=0)||((*cd->owner)->type==BL_NPC);
+ memcpy(WFIFOP(fd,8+i*28+4),cd->usersd[i]->status.name,24);
+ }
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_addchat(struct chat_data* cd,struct map_session_data *sd)
+{
+ char buf[32];
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, cd);
+
+ WBUFW(buf, 0) = 0x0dc;
+ WBUFW(buf, 2) = cd->users;
+ memcpy(WBUFP(buf, 4),sd->status.name,24);
+ clif_send(buf,packet_len_table[0xdc],&sd->bl,CHAT_WOS);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd)
+{
+ char buf[64];
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, cd);
+
+ WBUFW(buf, 0) = 0xe1;
+ WBUFL(buf, 2) = 1;
+ memcpy(WBUFP(buf,6),cd->usersd[0]->status.name,24);
+ WBUFW(buf,30) = 0xe1;
+ WBUFL(buf,32) = 0;
+ memcpy(WBUFP(buf,36),sd->status.name,24);
+
+ clif_send(buf,packet_len_table[0xe1]*2,&sd->bl,CHAT);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_leavechat(struct chat_data* cd,struct map_session_data *sd)
+{
+ char buf[32];
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, cd);
+
+ WBUFW(buf, 0) = 0xdd;
+ WBUFW(buf, 2) = cd->users-1;
+ memcpy(WBUFP(buf,4),sd->status.name,24);
+ WBUFB(buf,28) = 0;
+
+ clif_send(buf,packet_len_table[0xdd],&sd->bl,CHAT);
+
+ return 0;
+}
+
+/*==========================================
+ * Žæ‚èˆø‚«—v¿Žó‚¯
+ *------------------------------------------
+ */
+int clif_traderequest(struct map_session_data *sd,char *name)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xe5;
+ strcpy(WFIFOP(fd,2),name);
+ WFIFOSET(fd,packet_len_table[0xe5]);
+
+ return 0;
+}
+
+/*==========================================
+ * Žæ‚èˆø‚«—v‹‰ž“š
+ *------------------------------------------
+ */
+int clif_tradestart(struct map_session_data *sd,int type)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xe7;
+ WFIFOB(fd,2)=type;
+ WFIFOSET(fd,packet_len_table[0xe7]);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘ŠŽè•û‚©‚ç‚̃AƒCƒeƒ€’ljÁ
+ *------------------------------------------
+ */
+int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount)
+{
+ int fd,j;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, tsd);
+
+ fd=tsd->fd;
+ WFIFOW(fd,0)=0xe9;
+ WFIFOL(fd,2)=amount;
+ if(index==0){
+ WFIFOW(fd,6) = 0; // type id
+ WFIFOB(fd,8) = 0; //identify flag
+ WFIFOB(fd,9) = 0; // attribute
+ WFIFOB(fd,10)= 0; //refine
+ WFIFOW(fd,11)= 0; //card (4w)
+ WFIFOW(fd,13)= 0; //card (4w)
+ WFIFOW(fd,15)= 0; //card (4w)
+ WFIFOW(fd,17)= 0; //card (4w)
+ }
+ else{
+ index -= 2;
+ if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0)
+ WFIFOW(fd,6) = sd->inventory_data[index]->view_id;
+ else
+ WFIFOW(fd,6) = sd->status.inventory[index].nameid; // type id
+ WFIFOB(fd,8) = sd->status.inventory[index].identify; //identify flag
+ WFIFOB(fd,9) = sd->status.inventory[index].attribute; // attribute
+ WFIFOB(fd,10)= sd->status.inventory[index].refine; //refine
+ if(sd->status.inventory[index].card[0]==0x00ff || sd->status.inventory[index].card[0]==0x00fe || sd->status.inventory[index].card[0]==(short)0xff00) {
+ WFIFOW(fd,11)= sd->status.inventory[index].card[0]; //card (4w)
+ WFIFOW(fd,13)= sd->status.inventory[index].card[1]; //card (4w)
+ WFIFOW(fd,15)= sd->status.inventory[index].card[2]; //card (4w)
+ WFIFOW(fd,17)= sd->status.inventory[index].card[3]; //card (4w)
+ } else {
+ if(sd->status.inventory[index].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[0])) > 0)
+ WFIFOW(fd,11)= j;
+ else
+ WFIFOW(fd,11)= sd->status.inventory[index].card[0];
+ if(sd->status.inventory[index].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[1])) > 0)
+ WFIFOW(fd,13)= j;
+ else
+ WFIFOW(fd,13)= sd->status.inventory[index].card[1];
+ if(sd->status.inventory[index].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[2])) > 0)
+ WFIFOW(fd,15)= j;
+ else
+ WFIFOW(fd,15)= sd->status.inventory[index].card[2];
+ if(sd->status.inventory[index].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[3])) > 0)
+ WFIFOW(fd,17)= j;
+ else
+ WFIFOW(fd,17)= sd->status.inventory[index].card[3];
+ }
+ }
+ WFIFOSET(fd,packet_len_table[0xe9]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁ¬Œ÷/Ž¸”s
+ *------------------------------------------
+ */
+int clif_tradeitemok(struct map_session_data *sd,int index,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xea;
+ WFIFOW(fd,2)=index;
+ WFIFOB(fd,4)=fail;
+ WFIFOSET(fd,packet_len_table[0xea]);
+
+ return 0;
+}
+
+/*==========================================
+ * Žæ‚èˆø‚«ok‰Ÿ‚µ
+ *------------------------------------------
+ */
+int clif_tradedeal_lock(struct map_session_data *sd,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xec;
+ WFIFOB(fd,2)=fail; // 0=you 1=the other person
+ WFIFOSET(fd,packet_len_table[0xec]);
+
+ return 0;
+}
+
+/*==========================================
+ * Žæ‚èˆø‚«‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½
+ *------------------------------------------
+ */
+int clif_tradecancelled(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xee;
+ WFIFOSET(fd,packet_len_table[0xee]);
+
+ return 0;
+}
+
+/*==========================================
+ * Žæ‚èˆø‚«Š®—¹
+ *------------------------------------------
+ */
+int clif_tradecompleted(struct map_session_data *sd,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xf0;
+ WFIFOB(fd,2)=fail;
+ WFIFOSET(fd,packet_len_table[0xf0]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚̃AƒCƒeƒ€”‚ðXV
+ *------------------------------------------
+ */
+int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) = 0xf2; // update storage amount
+ WFIFOW(fd,2) = stor->storage_amount; //items
+ WFIFOW(fd,4) = MAX_STORAGE; //items max
+ WFIFOSET(fd,packet_len_table[0xf2]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ɃAƒCƒeƒ€‚ð’ljÁ‚·‚é
+ *------------------------------------------
+ */
+int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount)
+{
+ int view,fd,j;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) =0xf4; // Storage item added
+ WFIFOW(fd,2) =index+1; // index
+ WFIFOL(fd,4) =amount; // amount
+ if((view = itemdb_viewid(stor->storage[index].nameid)) > 0)
+ WFIFOW(fd,8) =view;
+ else
+ WFIFOW(fd,8) =stor->storage[index].nameid; // id
+ WFIFOB(fd,10)=stor->storage[index].identify; //identify flag
+ WFIFOB(fd,11)=stor->storage[index].attribute; // attribute
+ WFIFOB(fd,12)=stor->storage[index].refine; //refine
+ if(stor->storage[index].card[0]==0x00ff || stor->storage[index].card[0]==0x00fe || stor->storage[index].card[0]==(short)0xff00) {
+ WFIFOW(fd,13)=stor->storage[index].card[0]; //card (4w)
+ WFIFOW(fd,15)=stor->storage[index].card[1]; //card (4w)
+ WFIFOW(fd,17)=stor->storage[index].card[2]; //card (4w)
+ WFIFOW(fd,19)=stor->storage[index].card[3]; //card (4w)
+ } else {
+ if(stor->storage[index].card[0] > 0 && (j=itemdb_viewid(stor->storage[index].card[0])) > 0)
+ WFIFOW(fd,13)= j;
+ else
+ WFIFOW(fd,13)= stor->storage[index].card[0];
+ if(stor->storage[index].card[1] > 0 && (j=itemdb_viewid(stor->storage[index].card[1])) > 0)
+ WFIFOW(fd,15)= j;
+ else
+ WFIFOW(fd,15)= stor->storage[index].card[1];
+ if(stor->storage[index].card[2] > 0 && (j=itemdb_viewid(stor->storage[index].card[2])) > 0)
+ WFIFOW(fd,17)= j;
+ else
+ WFIFOW(fd,17)= stor->storage[index].card[2];
+ if(stor->storage[index].card[3] > 0 && (j=itemdb_viewid(stor->storage[index].card[3])) > 0)
+ WFIFOW(fd,19)= j;
+ else
+ WFIFOW(fd,19)= stor->storage[index].card[3];
+ }
+ WFIFOSET(fd,packet_len_table[0xf4]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) = 0xf2; // update storage amount
+ WFIFOW(fd,2) = stor->storage_amount; //items
+ WFIFOW(fd,4) = MAX_GUILD_STORAGE; //items max
+ WFIFOSET(fd,packet_len_table[0xf2]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount)
+{
+ int view,fd,j;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) =0xf4; // Storage item added
+ WFIFOW(fd,2) =index+1; // index
+ WFIFOL(fd,4) =amount; // amount
+ if((view = itemdb_viewid(stor->storage[index].nameid)) > 0)
+ WFIFOW(fd,8) =view;
+ else
+ WFIFOW(fd,8) =stor->storage[index].nameid; // id
+ WFIFOB(fd,10)=stor->storage[index].identify; //identify flag
+ WFIFOB(fd,11)=stor->storage[index].attribute; // attribute
+ WFIFOB(fd,12)=stor->storage[index].refine; //refine
+ if(stor->storage[index].card[0]==0x00ff || stor->storage[index].card[0]==0x00fe || stor->storage[index].card[0]==(short)0xff00) {
+ WFIFOW(fd,13)=stor->storage[index].card[0]; //card (4w)
+ WFIFOW(fd,15)=stor->storage[index].card[1]; //card (4w)
+ WFIFOW(fd,17)=stor->storage[index].card[2]; //card (4w)
+ WFIFOW(fd,19)=stor->storage[index].card[3]; //card (4w)
+ } else {
+ if(stor->storage[index].card[0] > 0 && (j=itemdb_viewid(stor->storage[index].card[0])) > 0)
+ WFIFOW(fd,13)= j;
+ else
+ WFIFOW(fd,13)= stor->storage[index].card[0];
+ if(stor->storage[index].card[1] > 0 && (j=itemdb_viewid(stor->storage[index].card[1])) > 0)
+ WFIFOW(fd,15)= j;
+ else
+ WFIFOW(fd,15)= stor->storage[index].card[1];
+ if(stor->storage[index].card[2] > 0 && (j=itemdb_viewid(stor->storage[index].card[2])) > 0)
+ WFIFOW(fd,17)= j;
+ else
+ WFIFOW(fd,17)= stor->storage[index].card[2];
+ if(stor->storage[index].card[3] > 0 && (j=itemdb_viewid(stor->storage[index].card[3])) > 0)
+ WFIFOW(fd,19)= j;
+ else
+ WFIFOW(fd,19)= stor->storage[index].card[3];
+ }
+ WFIFOSET(fd,packet_len_table[0xf4]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚©‚çƒAƒCƒeƒ€‚ðŽæ‚è‹Ž‚é
+ *------------------------------------------
+ */
+int clif_storageitemremoved(struct map_session_data *sd,int index,int amount)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xf6; // Storage item removed
+ WFIFOW(fd,2)=index+1;
+ WFIFOL(fd,4)=amount;
+ WFIFOSET(fd,packet_len_table[0xf6]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
+ *------------------------------------------
+ */
+int clif_storageclose(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xf8; // Storage Closed
+ WFIFOSET(fd,packet_len_table[0xf8]);
+
+ return 0;
+}
+
+//
+// callbackŒn ?
+//
+/*==========================================
+ * PC•\Ž¦
+ *------------------------------------------
+ */
+void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* dstsd)
+{
+ int len;
+
+ nullpo_retv(sd);
+ nullpo_retv(dstsd);
+
+ if(dstsd->walktimer != -1){
+ len = clif_set007b(dstsd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ } else {
+ len = clif_set0078(dstsd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ }
+
+ if(dstsd->chatID){
+ struct chat_data *cd;
+ cd=(struct chat_data*)map_id2bl(dstsd->chatID);
+ if(cd->usersd[0]==dstsd)
+ clif_dispchat(cd,sd->fd);
+ }
+ if(dstsd->vender_id){
+ clif_showvendingboard(&dstsd->bl,dstsd->message,sd->fd);
+ }
+ if(dstsd->spiritball > 0) {
+ clif_set01e1(dstsd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,packet_len_table[0x1e1]);
+ }
+ if(battle_config.save_clothcolor==1 && dstsd->status.clothes_color > 0)
+ clif_changelook(&dstsd->bl,LOOK_CLOTHES_COLOR,dstsd->status.clothes_color);
+ if(sd->status.manner < 0)
+ clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
+
+}
+
+/*==========================================
+ * NPC•\Ž¦
+ *------------------------------------------
+ */
+void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd)
+{
+ int len;
+
+ nullpo_retv(sd);
+ nullpo_retv(nd);
+
+ if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS)
+ return;
+
+ len = clif_npc0078(nd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+
+ if(nd->chat_id){
+ clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd);
+ }
+
+}
+
+/*==========================================
+ * ˆÚ“®’âŽ~
+ *------------------------------------------
+ */
+int clif_movemob(struct mob_data *md)
+{
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, md);
+
+ len = clif_mob007b(md,buf);
+ clif_send(buf,len,&md->bl,AREA);
+
+ if(mob_get_equip(md->class) > 0) // mob equipment [Valaris]
+ clif_mob_equip(md,mob_get_equip(md->class));
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ‚ƒ“ƒXƒ^[‚̈ʒuC³
+ *------------------------------------------
+ */
+int clif_fixmobpos(struct mob_data *md)
+{
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, md);
+
+ if(md->state.state == MS_WALK){
+ len = clif_mob007b(md,buf);
+ clif_send(buf,len,&md->bl,AREA);
+ } else {
+ len = clif_mob0078(md,buf);
+ clif_send(buf,len,&md->bl,AREA);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * PC‚̈ʒuC³
+ *------------------------------------------
+ */
+int clif_fixpcpos(struct map_session_data *sd)
+{
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, sd);
+
+ if(sd->walktimer != -1){
+ len = clif_set007b(sd,buf);
+ clif_send(buf,len,&sd->bl,AREA);
+ } else {
+ len = clif_set0078(sd,buf);
+ clif_send(buf,len,&sd->bl,AREA);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_fixpetpos(struct pet_data *pd)
+{
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, pd);
+
+ if(pd->state.state == MS_WALK){
+ len = clif_pet007b(pd,buf);
+ clif_send(buf,len,&pd->bl,AREA);
+ } else {
+ len = clif_pet0078(pd,buf);
+ clif_send(buf,len,&pd->bl,AREA);
+ }
+
+ return 0;
+}
+
+// npc walking [Valaris]
+int clif_fixnpcpos(struct npc_data *nd)
+{
+ unsigned char buf[256];
+ int len;
+
+ nullpo_retr(0, nd);
+
+ if(nd->state.state == MS_WALK){
+ len = clif_npc007b(nd,buf);
+ clif_send(buf,len,&nd->bl,AREA);
+ } else {
+ len = clif_npc0078(nd,buf);
+ clif_send(buf,len,&nd->bl,AREA);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ’ÊíUŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
+ *------------------------------------------
+ */
+int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2)
+{
+ unsigned char buf[256];
+ struct status_change *sc_data;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, dst);
+
+ sc_data = battle_get_sc_data(dst);
+
+ if(type != 4 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
+ type = 9;
+ if(sc_data) {
+ if(type != 4 && sc_data[SC_ENDURE].timer != -1)
+ type = 9;
+ if(sc_data[SC_HALLUCINATION].timer != -1) {
+ if(damage > 0)
+ damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
+ if(damage2 > 0)
+ damage2 = damage2*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
+ }
+ }
+
+ WBUFW(buf,0)=0x8a;
+ WBUFL(buf,2)=src->id;
+ WBUFL(buf,6)=dst->id;
+ WBUFL(buf,10)=tick;
+ WBUFL(buf,14)=sdelay;
+ WBUFL(buf,18)=ddelay;
+ WBUFW(buf,22)=(damage > 0x7fff)? 0x7fff:damage;
+ WBUFW(buf,24)=div;
+ WBUFB(buf,26)=type;
+ WBUFW(buf,27)=damage2;
+ clif_send(buf,packet_len_table[0x8a],src,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md)
+{
+ int len;
+ nullpo_retv(sd);
+ nullpo_retv(md);
+
+ if(md->state.state == MS_WALK){
+ len = clif_mob007b(md,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ } else {
+ len = clif_mob0078(md,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ }
+
+ if(mob_get_equip(md->class) > 0) // mob equipment [Valaris]
+ clif_mob_equip(md,mob_get_equip(md->class));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_getareachar_pet(struct map_session_data* sd,struct pet_data* pd)
+{
+ int len;
+
+ nullpo_retv(sd);
+ nullpo_retv(pd);
+
+ if(pd->state.state == MS_WALK){
+ len = clif_pet007b(pd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ } else {
+ len = clif_pet0078(pd,WFIFOP(sd->fd,0));
+ WFIFOSET(sd->fd,len);
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fitem)
+{
+ int view,fd;
+
+ nullpo_retv(sd);
+ nullpo_retv(fitem);
+
+ fd=sd->fd;
+ //009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B
+ WFIFOW(fd,0)=0x9d;
+ WFIFOL(fd,2)=fitem->bl.id;
+ if((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
+ WFIFOW(fd,6)=view;
+ else
+ WFIFOW(fd,6)=fitem->item_data.nameid;
+ WFIFOB(fd,8)=fitem->item_data.identify;
+ WFIFOW(fd,9)=fitem->bl.x;
+ WFIFOW(fd,11)=fitem->bl.y;
+ WFIFOW(fd,13)=fitem->item_data.amount;
+ WFIFOB(fd,15)=fitem->subx;
+ WFIFOB(fd,16)=fitem->suby;
+
+ WFIFOSET(fd,packet_len_table[0x9d]);
+}
+/*==========================================
+ * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚É“ü‚é
+ *------------------------------------------
+ */
+int clif_getareachar_skillunit(struct map_session_data *sd,struct skill_unit *unit)
+{
+ int fd;
+ struct block_list *bl;
+
+ nullpo_retr(0, unit);
+
+ fd=sd->fd;
+ bl=map_id2bl(unit->group->src_id);
+#if PACKETVER < 3
+ memset(WFIFOP(fd,0),0,packet_len_table[0x11f]);
+ WFIFOW(fd, 0)=0x11f;
+ WFIFOL(fd, 2)=unit->bl.id;
+ WFIFOL(fd, 6)=unit->group->src_id;
+ WFIFOW(fd,10)=unit->bl.x;
+ WFIFOW(fd,12)=unit->bl.y;
+ WFIFOB(fd,14)=unit->group->unit_id;
+ WFIFOB(fd,15)=0;
+ WFIFOSET(fd,packet_len_table[0x11f]);
+#else
+ memset(WFIFOP(fd,0),0,packet_len_table[0x1c9]);
+ WFIFOW(fd, 0)=0x1c9;
+ WFIFOL(fd, 2)=unit->bl.id;
+ WFIFOL(fd, 6)=unit->group->src_id;
+ WFIFOW(fd,10)=unit->bl.x;
+ WFIFOW(fd,12)=unit->bl.y;
+ WFIFOB(fd,14)=unit->group->unit_id;
+ WFIFOB(fd,15)=1;
+ WFIFOL(fd,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
+ //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
+ WFIFOL(fd,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
+ WFIFOL(fd,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
+ //37-39
+ WFIFOB(fd,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WFIFOL(fd,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WFIFOL(fd,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WFIFOL(fd,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
+ WFIFOL(fd,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
+ //65-68
+ //69-72
+ if(bl) WFIFOL(fd,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
+ WFIFOL(fd,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
+ WFIFOB(fd,15+81)=0xaa; //81I’[•¶Žš0xaa
+
+ /* Graffiti [Valaris] */
+ if(unit->group->unit_id==0xb0) {
+ WFIFOL(fd,15)=1;
+ WFIFOL(fd,16)=1;
+ memcpy(WFIFOP(fd,17),unit->group->valstr,80);
+ }
+
+ WFIFOSET(fd,packet_len_table[0x1c9]);
+#endif
+ if(unit->group->skill_id == WZ_ICEWALL)
+ clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,5);
+
+ return 0;
+}
+/*==========================================
+ * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg‚ªŽ‹ŠE‚©‚çÁ‚¦‚é
+ *------------------------------------------
+ */
+int clif_clearchar_skillunit(struct skill_unit *unit,int fd)
+{
+ nullpo_retr(0, unit);
+
+ WFIFOW(fd, 0)=0x120;
+ WFIFOL(fd, 2)=unit->bl.id;
+ WFIFOSET(fd,packet_len_table[0x120]);
+ if(unit->group->skill_id == WZ_ICEWALL)
+ clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,unit->val2);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_01ac(struct block_list *bl)
+{
+ char buf[32];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf, 0) = 0x1ac;
+ WBUFL(buf, 2) = bl->id;
+
+ clif_send(buf,packet_len_table[0x1ac],bl,AREA);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+ int clif_getareachar(struct block_list* bl,va_list ap)
+{
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ sd=va_arg(ap,struct map_session_data*);
+
+ switch(bl->type){
+ case BL_PC:
+ if(sd==(struct map_session_data*)bl)
+ break;
+ clif_getareachar_pc(sd,(struct map_session_data*) bl);
+ break;
+ case BL_NPC:
+ clif_getareachar_npc(sd,(struct npc_data*) bl);
+ break;
+ case BL_MOB:
+ clif_getareachar_mob(sd,(struct mob_data*) bl);
+ break;
+ case BL_PET:
+ clif_getareachar_pet(sd,(struct pet_data*) bl);
+ break;
+ case BL_ITEM:
+ clif_getareachar_item(sd,(struct flooritem_data*) bl);
+ break;
+ case BL_SKILL:
+ clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("get area char ??? %d\n",bl->type);
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_pcoutsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd,*dstsd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
+
+ switch(bl->type){
+ case BL_PC:
+ dstsd = (struct map_session_data*) bl;
+ if(sd != dstsd) {
+ clif_clearchar_id(dstsd->bl.id,0,sd->fd);
+ clif_clearchar_id(sd->bl.id,0,dstsd->fd);
+ if(dstsd->chatID){
+ struct chat_data *cd;
+ cd=(struct chat_data*)map_id2bl(dstsd->chatID);
+ if(cd->usersd[0]==dstsd)
+ clif_dispchat(cd,sd->fd);
+ }
+ if(dstsd->vender_id){
+ clif_closevendingboard(&dstsd->bl,sd->fd);
+ }
+ }
+ break;
+ case BL_NPC:
+ if( ((struct npc_data *)bl)->class != INVISIBLE_CLASS )
+ clif_clearchar_id(bl->id,0,sd->fd);
+ break;
+ case BL_MOB:
+ case BL_PET:
+ clif_clearchar_id(bl->id,0,sd->fd);
+ break;
+ case BL_ITEM:
+ clif_clearflooritem((struct flooritem_data*)bl,sd->fd);
+ break;
+ case BL_SKILL:
+ clif_clearchar_skillunit((struct skill_unit *)bl,sd->fd);
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_pcinsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd,*dstsd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=va_arg(ap,struct map_session_data*));
+
+ switch(bl->type){
+ case BL_PC:
+ dstsd = (struct map_session_data *)bl;
+ if(sd != dstsd) {
+ clif_getareachar_pc(sd,dstsd);
+ clif_getareachar_pc(dstsd,sd);
+ }
+ break;
+ case BL_NPC:
+ clif_getareachar_npc(sd,(struct npc_data*)bl);
+ break;
+ case BL_MOB:
+ clif_getareachar_mob(sd,(struct mob_data*)bl);
+ break;
+ case BL_PET:
+ clif_getareachar_pet(sd,(struct pet_data*)bl);
+ break;
+ case BL_ITEM:
+ clif_getareachar_item(sd,(struct flooritem_data*)bl);
+ break;
+ case BL_SKILL:
+ clif_getareachar_skillunit(sd,(struct skill_unit *)bl);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_moboutsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct mob_data *md;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md=va_arg(ap,struct mob_data*));
+
+ if(bl->type==BL_PC && (sd = (struct map_session_data*) bl)){
+ clif_clearchar_id(md->bl.id,0,sd->fd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_mobinsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct mob_data *md;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ md=va_arg(ap,struct mob_data*);
+ if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
+ clif_getareachar_mob(sd,md);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_petoutsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct pet_data *pd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, pd=va_arg(ap,struct pet_data*));
+
+ if(bl->type==BL_PC && (sd = (struct map_session_data*) bl)){
+ clif_clearchar_id(pd->bl.id,0,sd->fd);
+ }
+
+ return 0;
+}
+
+// npc walking [Valaris]
+int clif_npcoutsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct npc_data *nd;
+
+ 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)){
+ clif_clearchar_id(nd->bl.id,0,sd->fd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_petinsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct pet_data *pd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ pd=va_arg(ap,struct pet_data*);
+ if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
+ clif_getareachar_pet(sd,pd);
+ }
+
+ return 0;
+}
+
+// npc walking [Valaris]
+int clif_npcinsight(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ struct npc_data *nd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ nd=va_arg(ap,struct npc_data*);
+ if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){
+ clif_getareachar_npc(sd,nd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
+{
+ int fd,id;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ if( (id=sd->status.skill[skillid].id) <= 0 )
+ return 0;
+ WFIFOW(fd,0)=0x147;
+ WFIFOW(fd,2) = id;
+ if(type < 0)
+ WFIFOW(fd,4) = skill_get_inf(id);
+ else
+ WFIFOW(fd,4) = type;
+ WFIFOW(fd,6) = 0;
+ WFIFOW(fd,8) = sd->status.skill[skillid].lv;
+ WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[skillid].lv);
+ if(range < 0) {
+ range = skill_get_range(id,sd->status.skill[skillid].lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd,12)= range;
+ } else
+ WFIFOW(fd,12)= range;
+ memset(WFIFOP(fd,14),0,24);
+ if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
+ WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
+ else
+ WFIFOB(fd,38) = 0;
+ WFIFOSET(fd,packet_len_table[0x147]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒŠƒXƒg‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_skillinfoblock(struct map_session_data *sd)
+{
+ int fd;
+ int i,c,len=4,id,range;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x10f;
+ for ( i = c = 0; i < MAX_SKILL; i++){
+ if( (id=sd->status.skill[i].id)!=0 ){
+ WFIFOW(fd,len ) = id;
+ WFIFOW(fd,len+2) = skill_get_inf(id);
+ WFIFOW(fd,len+4) = 0;
+ WFIFOW(fd,len+6) = sd->status.skill[i].lv;
+ WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
+ range = skill_get_range(id,sd->status.skill[i].lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd,len+10)= range;
+ memset(WFIFOP(fd,len+12),0,24);
+ if(!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn == 1 || (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
+ WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max(id) && sd->status.skill[i].flag ==0 )? 1:0;
+ else
+ WFIFOB(fd,len+36) = 0;
+ len+=37;
+ c++;
+ }
+ }
+ WFIFOW(fd,2)=len;
+ WFIFOSET(fd,len);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Š„‚èU‚è’Ê’m
+ *------------------------------------------
+ */
+int clif_skillup(struct map_session_data *sd,int skill_num)
+{
+ int range,fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) = 0x10e;
+ WFIFOW(fd,2) = skill_num;
+ WFIFOW(fd,4) = sd->status.skill[skill_num].lv;
+ WFIFOW(fd,6) = skill_get_sp(skill_num,sd->status.skill[skill_num].lv);
+ range = skill_get_range(skill_num,sd->status.skill[skill_num].lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd,8) = range;
+ WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
+ WFIFOSET(fd,packet_len_table[0x10e]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹‰r¥ƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_skillcasting(struct block_list* bl,
+ int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime)
+{
+ unsigned char buf[32];
+ WBUFW(buf,0) = 0x13e;
+ WBUFL(buf,2) = src_id;
+ WBUFL(buf,6) = dst_id;
+ WBUFW(buf,10) = dst_x;
+ WBUFW(buf,12) = dst_y;
+ WBUFW(buf,14) = skill_num;//–‚–@‰r¥ƒXƒLƒ‹
+ WBUFL(buf,16) = skill_get_pl(skill_num);//‘®«
+ WBUFL(buf,20) = casttime;//skill‰r¥ŽžŠÔ
+ clif_send(buf,packet_len_table[0x13e], bl, AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_skillcastcancel(struct block_list* bl)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0) = 0x1b9;
+ WBUFL(buf,2) = bl->id;
+ clif_send(buf,packet_len_table[0x1b9], bl, AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹‰r¥Ž¸”s
+ *------------------------------------------
+ */
+int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ if(type==0x4 && battle_config.display_delay_skill_fail==0){
+ return 0;
+ }
+
+ WFIFOW(fd,0) = 0x110;
+ WFIFOW(fd,2) = skill_id;
+ WFIFOW(fd,4) = btype;
+ WFIFOW(fd,6) = 0;
+ WFIFOB(fd,8) = 0;
+ WFIFOB(fd,9) = type;
+ WFIFOSET(fd,packet_len_table[0x110]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
+ *------------------------------------------
+ */
+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)
+{
+ unsigned char buf[64];
+ struct status_change *sc_data;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, dst);
+
+ sc_data = battle_get_sc_data(dst);
+
+ if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
+ type = 9;
+ if(sc_data) {
+ if(type != 5 && sc_data[SC_ENDURE].timer != -1)
+ type = 9;
+ if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
+ damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
+ }
+
+#if PACKETVER < 3
+ WBUFW(buf,0)=0x114;
+ WBUFW(buf,2)=skill_id;
+ WBUFL(buf,4)=src->id;
+ WBUFL(buf,8)=dst->id;
+ WBUFL(buf,12)=tick;
+ WBUFL(buf,16)=sdelay;
+ WBUFL(buf,20)=ddelay;
+ WBUFW(buf,24)=damage;
+ WBUFW(buf,26)=skill_lv;
+ WBUFW(buf,28)=div;
+ WBUFB(buf,30)=(type>0)?type:skill_get_hit(skill_id);
+ clif_send(buf,packet_len_table[0x114],src,AREA);
+#else
+ WBUFW(buf,0)=0x1de;
+ WBUFW(buf,2)=skill_id;
+ WBUFL(buf,4)=src->id;
+ WBUFL(buf,8)=dst->id;
+ WBUFL(buf,12)=tick;
+ WBUFL(buf,16)=sdelay;
+ WBUFL(buf,20)=ddelay;
+ WBUFL(buf,24)=damage;
+ WBUFW(buf,28)=skill_lv;
+ WBUFW(buf,30)=div;
+ WBUFB(buf,32)=(type>0)?type:skill_get_hit(skill_id);
+ clif_send(buf,packet_len_table[0x1de],src,AREA);
+#endif
+
+ return 0;
+}
+
+/*==========================================
+ * ‚«”ò‚΂µƒXƒLƒ‹UŒ‚ƒGƒtƒFƒNƒg•ƒ_ƒ[ƒW
+ *------------------------------------------
+ */
+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)
+{
+ unsigned char buf[64];
+ struct status_change *sc_data;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, dst);
+
+ sc_data = battle_get_sc_data(dst);
+
+ if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
+ type = 9;
+ if(sc_data) {
+ if(type != 5 && sc_data[SC_ENDURE].timer != -1)
+ type = 9;
+ if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0)
+ damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + rand()%100;
+ }
+
+ WBUFW(buf,0)=0x115;
+ WBUFW(buf,2)=skill_id;
+ WBUFL(buf,4)=src->id;
+ WBUFL(buf,8)=dst->id;
+ WBUFL(buf,12)=tick;
+ WBUFL(buf,16)=sdelay;
+ WBUFL(buf,20)=ddelay;
+ WBUFW(buf,24)=dst->x;
+ WBUFW(buf,26)=dst->y;
+ WBUFW(buf,28)=damage;
+ WBUFW(buf,30)=skill_lv;
+ WBUFW(buf,32)=div;
+ WBUFB(buf,34)=(type>0)?type:skill_get_hit(skill_id);
+ clif_send(buf,packet_len_table[0x115],src,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * Žx‰‡/‰ñ•œƒXƒLƒ‹ƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
+ int skill_id,int heal,int fail)
+{
+ unsigned char buf[32];
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, dst);
+
+ WBUFW(buf,0)=0x11a;
+ WBUFW(buf,2)=skill_id;
+ WBUFW(buf,4)=(heal > 0x7fff)? 0x7fff:heal;
+ WBUFL(buf,6)=dst->id;
+ WBUFL(buf,10)=src->id;
+ WBUFB(buf,14)=fail;
+ clif_send(buf,packet_len_table[0x11a],src,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int clif_skill_poseffect(struct block_list *src,int skill_id,int val,int x,int y,int tick)
+{
+ unsigned char buf[32];
+
+ nullpo_retr(0, src);
+
+ WBUFW(buf,0)=0x117;
+ WBUFW(buf,2)=skill_id;
+ WBUFL(buf,4)=src->id;
+ WBUFW(buf,8)=val;
+ WBUFW(buf,10)=x;
+ WBUFW(buf,12)=y;
+ WBUFL(buf,14)=tick;
+ clif_send(buf,packet_len_table[0x117],src,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ * ꊃXƒLƒ‹ƒGƒtƒFƒNƒg•\Ž¦
+ *------------------------------------------
+ */
+int clif_skill_setunit(struct skill_unit *unit)
+{
+ unsigned char buf[128];
+ struct block_list *bl;
+
+ nullpo_retr(0, unit);
+
+ bl=map_id2bl(unit->group->src_id);
+
+#if PACKETVER < 3
+ memset(WBUFP(buf, 0),0,packet_len_table[0x11f]);
+ WBUFW(buf, 0)=0x11f;
+ WBUFL(buf, 2)=unit->bl.id;
+ WBUFL(buf, 6)=unit->group->src_id;
+ WBUFW(buf,10)=unit->bl.x;
+ WBUFW(buf,12)=unit->bl.y;
+ WBUFB(buf,14)=unit->group->unit_id;
+ WBUFB(buf,15)=0;
+ clif_send(buf,packet_len_table[0x11f],&unit->bl,AREA);
+#else
+ memset(WBUFP(buf, 0),0,packet_len_table[0x1c9]);
+ WBUFW(buf, 0)=0x1c9;
+ WBUFL(buf, 2)=unit->bl.id;
+ WBUFL(buf, 6)=unit->group->src_id;
+ WBUFW(buf,10)=unit->bl.x;
+ WBUFW(buf,12)=unit->bl.y;
+ WBUFB(buf,14)=unit->group->unit_id;
+ WBUFB(buf,15)=1;
+ WBUFL(buf,15+1)=0; //1-4’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+5)=0; //5-8’²‚ׂ½ŒÀ‚èŒÅ’è
+ //9-12ƒ}ƒbƒv‚²‚Ƃňê’è‚Ì77-80‚Æ‚Í‚Ü‚½ˆá‚¤4ƒoƒCƒg‚Ì‚©‚È‚è‘å‚«‚È”Žš
+ WBUFL(buf,15+13)=unit->bl.y - 0x12; //13-16ƒ†ƒjƒbƒg‚ÌYÀ•W-18‚Á‚Û‚¢(Y:17‚ÅFF FF FF FF)
+ WBUFL(buf,15+17)=0x004f37dd; //17-20’²‚ׂ½ŒÀ‚èŒÅ’è(0x1b2‚Å0x004fdbdd‚¾‚Á‚½)
+ WBUFL(buf,15+21)=0x0012f674; //21-24’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+25)=0x0012f664; //25-28’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+29)=0x0012f654; //29-32’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+33)=0x77527bbc; //33-36’²‚ׂ½ŒÀ‚èŒÅ’è
+ //37-39
+ WBUFB(buf,15+40)=0x2d; //40’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+41)=0; //41-44’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WBUFL(buf,15+45)=0; //45-48’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WBUFL(buf,15+49)=0; //49-52’²‚ׂ½ŒÀ‚è0ŒÅ’è
+ WBUFL(buf,15+53)=0x0048d919; //53-56’²‚ׂ½ŒÀ‚èŒÅ’è(0x01b2‚Å0x00495119‚¾‚Á‚½)
+ WBUFL(buf,15+57)=0x0000003e; //57-60’²‚ׂ½ŒÀ‚èŒÅ’è
+ WBUFL(buf,15+61)=0x0012f66c; //61-64’²‚ׂ½ŒÀ‚èŒÅ’è
+ //65-68
+ //69-72
+ if(bl) WBUFL(buf,15+73)=bl->y; //73-76pŽÒ‚ÌYÀ•W
+ WBUFL(buf,15+77)=unit->bl.m; //77-80ƒ}ƒbƒvID‚©‚È‚ŸH‚©‚È‚è2ƒoƒCƒg‚Å‘«‚è‚»‚¤‚È”Žš
+ WBUFB(buf,15+81)=0xaa; //81I’[•¶Žš0xaa
+
+ /* Graffiti [Valaris] */
+ if(unit->group->unit_id==0xb0) {
+ WBUFL(buf,15)=1;
+ WBUFL(buf,16)=1;
+ memcpy(WBUFP(buf,17),unit->group->valstr,80);
+ }
+
+ clif_send(buf,packet_len_table[0x1c9],&unit->bl,AREA);
+#endif
+ return 0;
+}
+/*==========================================
+ * ꊃXƒLƒ‹ƒGƒtƒFƒNƒgíœ
+ *------------------------------------------
+ */
+int clif_skill_delunit(struct skill_unit *unit)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, unit);
+
+ WBUFW(buf, 0)=0x120;
+ WBUFL(buf, 2)=unit->bl.id;
+ clif_send(buf,packet_len_table[0x120],&unit->bl,AREA);
+ return 0;
+}
+/*==========================================
+ * ƒ[ƒvꊑI‘ð
+ *------------------------------------------
+ */
+int clif_skill_warppoint(struct map_session_data *sd,int skill_num,
+ const char *map1,const char *map2,const char *map3,const char *map4)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x11c;
+ WFIFOW(fd,2)=skill_num;
+ memcpy(WFIFOP(fd, 4),map1,16);
+ memcpy(WFIFOP(fd,20),map2,16);
+ memcpy(WFIFOP(fd,36),map3,16);
+ memcpy(WFIFOP(fd,52),map4,16);
+ WFIFOSET(fd,packet_len_table[0x11c]);
+ return 0;
+}
+/*==========================================
+ * ƒƒ‚‰ž“š
+ *------------------------------------------
+ */
+int clif_skill_memo(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0x11e;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x11e]);
+ return 0;
+}
+int clif_skill_teleportmessage(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x189;
+ WFIFOW(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x189]);
+ return 0;
+}
+
+/*==========================================
+ * ƒ‚ƒ“ƒXƒ^[î•ñ
+ *------------------------------------------
+ */
+int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst)
+{
+ struct mob_data *md;
+ unsigned char buf[64];
+ int i;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, dst);
+
+ if(dst->type!=BL_MOB )
+ return 0;
+ if((md=(struct mob_data *)dst) == NULL)
+ return 0;
+
+ WBUFW(buf, 0)=0x18c;
+ WBUFW(buf, 2)=mob_get_viewclass(md->class);
+ WBUFW(buf, 4)=mob_db[md->class].lv;
+ WBUFW(buf, 6)=mob_db[md->class].size;
+ WBUFL(buf, 8)=md->hp;
+ WBUFW(buf,12)=battle_get_def2(&md->bl);
+ WBUFW(buf,14)=mob_db[md->class].race;
+ WBUFW(buf,16)=battle_get_mdef2(&md->bl) - (mob_db[md->class].vit>>1);
+ WBUFW(buf,18)=battle_get_elem_type(&md->bl);
+ for(i=0;i<9;i++)
+ WBUFB(buf,20+i)= battle_attr_fix(100,i+1,md->def_ele);
+
+ if(sd->status.party_id>0)
+ clif_send(buf,packet_len_table[0x18c],&sd->bl,PARTY_AREA);
+ else{
+ memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x18c]);
+ WFIFOSET(sd->fd,packet_len_table[0x18c]);
+ }
+ return 0;
+}
+/*==========================================
+ * ƒAƒCƒeƒ€‡¬‰Â”\ƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_skill_produce_mix_list(struct map_session_data *sd,int trigger)
+{
+ int i,c,view,fd;
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd, 0)=0x18d;
+
+ for(i=0,c=0;i<MAX_SKILL_PRODUCE_DB;i++){
+ if( skill_can_produce_mix(sd,skill_produce_db[i].nameid,trigger) ){
+ if((view = itemdb_viewid(skill_produce_db[i].nameid)) > 0)
+ WFIFOW(fd,c*8+ 4)= view;
+ else
+ WFIFOW(fd,c*8+ 4)= skill_produce_db[i].nameid;
+ WFIFOW(fd,c*8+ 6)= 0x0012;
+ WFIFOL(fd,c*8+ 8)= sd->status.char_id;
+ c++;
+ }
+ }
+ WFIFOW(fd, 2)=c*8+8;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ if(c > 0) sd->state.produce_flag = 1;
+ return 0;
+}
+
+/*==========================================
+ * ó‘ÔˆÙíƒAƒCƒRƒ“/ƒƒbƒZ[ƒW•\Ž¦
+ *------------------------------------------
+ */
+int clif_status_change(struct block_list *bl,int type,int flag)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0)=0x0196;
+ WBUFW(buf,2)=type;
+ WBUFL(buf,4)=bl->id;
+ WBUFB(buf,8)=flag;
+ clif_send(buf,packet_len_table[0x196],bl,AREA);
+ return 0;
+}
+
+/*==========================================
+ * Send message (modified by [Yor])
+ *------------------------------------------
+ */
+int clif_displaymessage(const int fd, char* mes)
+{
+ //Console [Wizputer]
+ if (fd == 0)
+ printf("\033[0;36mConsole: \033[0m\033[1m%s\033[0m\n", mes);
+ else {
+ int len_mes = strlen(mes);
+
+ if (len_mes > 0) { // don't send a void message (it's not displaying on the client chat). @help can send void line.
+ WFIFOW(fd,0) = 0x8e;
+ WFIFOW(fd,2) = 5 + len_mes; // 4 + len + NULL teminate
+ memcpy(WFIFOP(fd,4), mes, len_mes + 1);
+ WFIFOSET(fd, 5 + len_mes);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * “V‚̺‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag)
+{
+ unsigned char *buf;
+ int lp;
+
+ lp = (flag & 0x10) ? 8 : 4;
+ buf = (unsigned char*)aCalloc(len + lp, sizeof(unsigned char));
+
+ WBUFW(buf,0) = 0x9a;
+ WBUFW(buf,2) = len + lp;
+ WBUFL(buf,4) = 0x65756c62;
+ memcpy(WBUFP(buf,lp), mes, len);
+ flag &= 0x07;
+ clif_send(buf, WBUFW(buf,2), bl,
+ (flag == 1) ? ALL_SAMEMAP :
+ (flag == 2) ? AREA :
+ (flag == 3) ? SELF :
+ ALL_CLIENT);
+
+ if(buf) free(buf);
+
+ return 0;
+}
+
+/*==========================================
+ * HPSP‰ñ•œƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_heal(int fd,int type,int val)
+{
+ WFIFOW(fd,0)=0x13d;
+ WFIFOW(fd,2)=type;
+ WFIFOW(fd,4)=val;
+ WFIFOSET(fd,packet_len_table[0x13d]);
+
+ return 0;
+}
+
+/*==========================================
+ * •œŠˆ‚·‚é
+ *------------------------------------------
+ */
+int clif_resurrection(struct block_list *bl,int type)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_PC) { // disguises [Valaris]
+ struct map_session_data *sd=((struct map_session_data *)bl);
+ if(sd && sd->disguise > 23 && sd->disguise < 4001)
+ clif_spawnpc(sd);
+ }
+
+ WBUFW(buf,0)=0x148;
+ WBUFL(buf,2)=bl->id;
+ WBUFW(buf,6)=type;
+
+ clif_send(buf,packet_len_table[0x148],bl,type==1 ? AREA : AREA_WOS);
+
+ return 0;
+}
+
+/*==========================================
+ * PVPŽÀ‘•Hi‰¼j
+ *------------------------------------------
+ */
+int clif_set0199(int fd,int type)
+{
+ WFIFOW(fd,0)=0x199;
+ WFIFOW(fd,2)=type;
+ WFIFOSET(fd,packet_len_table[0x199]);
+
+ return 0;
+}
+
+/*==========================================
+ * PVPŽÀ‘•H(‰¼)
+ *------------------------------------------
+ */
+int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
+{
+ nullpo_retr(0, sd);
+
+ if(map[sd->bl.m].flag.nopvp)
+ return 0;
+
+ if(type == 2) {
+ WFIFOW(sd->fd,0) = 0x19a;
+ WFIFOL(sd->fd,2) = sd->bl.id;
+ if(pvprank<=0)
+ pc_calc_pvprank(sd);
+ WFIFOL(sd->fd,6) = pvprank;
+ WFIFOL(sd->fd,10) = pvpnum;
+ WFIFOSET(sd->fd,packet_len_table[0x19a]);
+ } else {
+ char buf[32];
+
+ WBUFW(buf,0) = 0x19a;
+ WBUFL(buf,2) = sd->bl.id;
+ if(sd->status.option&0x46)
+ WBUFL(buf,6) = -1;
+ else
+ if(pvprank<=0)
+ pc_calc_pvprank(sd);
+ WBUFL(buf,6) = pvprank;
+ WBUFL(buf,10) = pvpnum;
+ if(!type)
+ clif_send(buf,packet_len_table[0x19a],&sd->bl,AREA);
+ else
+ clif_send(buf,packet_len_table[0x19a],&sd->bl,ALL_SAMEMAP);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_send0199(int map,int type)
+{
+ struct block_list bl;
+ char buf[16];
+
+ bl.m = map;
+ WBUFW(buf,0)=0x199;
+ WBUFW(buf,2)=type;
+ clif_send(buf,packet_len_table[0x199],&bl,ALL_SAMEMAP);
+
+ return 0;
+}
+
+/*==========================================
+ * ¸˜BƒGƒtƒFƒNƒg‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val)
+{
+ WFIFOW(fd,0)=0x188;
+ WFIFOW(fd,2)=fail;
+ WFIFOW(fd,4)=index+2;
+ WFIFOW(fd,6)=val;
+ WFIFOSET(fd,packet_len_table[0x188]);
+
+ return 0;
+}
+
+/*==========================================
+ * Wisp/page is transmitted to the destination player
+ *------------------------------------------
+ */
+int clif_wis_message(int fd, char *nick, char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B
+{
+ WFIFOW(fd,0) = 0x97;
+ WFIFOW(fd,2) = mes_len + 24 + 4;
+ memcpy(WFIFOP(fd,4), nick, 24);
+ memcpy(WFIFOP(fd,28), mes, mes_len);
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+/*==========================================
+ * The transmission result of Wisp/page is transmitted to the source player
+ *------------------------------------------
+ */
+int clif_wis_end(int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+{
+ WFIFOW(fd,0) = 0x98;
+ WFIFOW(fd,2) = flag;
+ WFIFOSET(fd,packet_len_table[0x98]);
+ return 0;
+}
+
+/*==========================================
+ * ƒLƒƒƒ‰ID–¼‘Oˆø‚«Œ‹‰Ê‚ð‘—M‚·‚é
+ *------------------------------------------
+ */
+int clif_solved_charname(struct map_session_data *sd,int char_id)
+{
+ char *p= map_charid2nick(char_id);
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ if(p!=NULL){
+ WFIFOW(fd,0)=0x194;
+ WFIFOL(fd,2)=char_id;
+ memcpy(WFIFOP(fd,6), p,24 );
+ WFIFOSET(fd,packet_len_table[0x194]);
+ }else{
+ map_reqchariddb(sd,char_id);
+ chrif_searchcharid(char_id);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒh‚Ì‘}“ü‰Â”\ƒŠƒXƒg‚ð•Ô‚·
+ *------------------------------------------
+ */
+int clif_use_card(struct map_session_data *sd,int idx)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->inventory_data[idx]) {
+ int i,c;
+ int ep=sd->inventory_data[idx]->equip;
+ int fd=sd->fd;
+ WFIFOW(fd,0)=0x017b;
+
+ for(i=c=0;i<MAX_INVENTORY;i++){
+ int j;
+
+ if(sd->inventory_data[i] == NULL)
+ continue;
+ if(sd->inventory_data[i]->type!=4 && sd->inventory_data[i]->type!=5) // •Ší–h‹ï‚¶‚á‚È‚¢
+ continue;
+ if(sd->status.inventory[i].card[0]==0x00ff) // »‘¢•Ší
+ continue;
+ if(sd->status.inventory[i].card[0]==(short)0xff00 || sd->status.inventory[i].card[0]==0x00fe)
+ continue;
+ if(sd->status.inventory[i].identify==0 ) // –¢ŠÓ’è
+ continue;
+
+ if((sd->inventory_data[i]->equip&ep)==0) // ‘•”õŒÂŠ‚ªˆá‚¤
+ continue;
+ if(sd->inventory_data[i]->type==4 && ep==32) // ‚ƒJ[ƒh‚Æ—¼Žè•Ší
+ continue;
+
+ for(j=0;j<sd->inventory_data[i]->slot;j++){
+ if( sd->status.inventory[i].card[j]==0 )
+ break;
+ }
+ if(j==sd->inventory_data[i]->slot) // ‚·‚łɃJ[ƒh‚ªˆê”t
+ continue;
+
+ WFIFOW(fd,4+c*2)=i+2;
+ c++;
+ }
+ WFIFOW(fd,2)=4+c*2;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+
+ return 0;
+}
+/*==========================================
+ * ƒJ[ƒh‚Ì‘}“üI—¹
+ *------------------------------------------
+ */
+int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x17d;
+ WFIFOW(fd,2)=idx_equip+2;
+ WFIFOW(fd,4)=idx_card+2;
+ WFIFOB(fd,6)=flag;
+ WFIFOSET(fd,packet_len_table[0x17d]);
+ return 0;
+}
+
+/*==========================================
+ * ŠÓ’è‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
+ *------------------------------------------
+ */
+int clif_item_identify_list(struct map_session_data *sd)
+{
+ int i,c;
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0x177;
+ for(i=c=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){
+ WFIFOW(fd,c*2+4)=i+2;
+ c++;
+ }
+ }
+ if(c > 0) {
+ WFIFOW(fd,2)=c*2+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ * ŠÓ’茋‰Ê
+ *------------------------------------------
+ */
+int clif_item_identified(struct map_session_data *sd,int idx,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd, 0)=0x179;
+ WFIFOW(fd, 2)=idx+2;
+ WFIFOB(fd, 4)=flag;
+ WFIFOSET(fd,packet_len_table[0x179]);
+ return 0;
+}
+
+/*==========================================
+ * C—‰Â”\ƒAƒCƒeƒ€ƒŠƒXƒg‘—M
+ * ¦ŽÀۂ̃pƒPƒbƒg‚ª‚í‚©‚ç‚È‚¢‚Ì‚Å“®ì‚µ‚Ü‚¹‚ñ
+ *------------------------------------------
+ */
+int clif_item_repair_list(struct map_session_data *sd)
+{
+ int i,c;
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0x0;
+ for(i=c=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].attribute==1){
+ WFIFOW(fd,c*2+4)=i+2;
+ c++;
+ }
+ }
+ if(c > 0) {
+ WFIFOW(fd,2)=c*2+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚É‚æ‚éˆêŽž“I‚ȃXƒLƒ‹Œø‰Ê
+ *------------------------------------------
+ */
+int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name)
+{
+ int range,fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd, 0)=0x147;
+ WFIFOW(fd, 2)=skillid;
+ WFIFOW(fd, 4)=skill_get_inf(skillid);
+ WFIFOW(fd, 6)=0;
+ WFIFOW(fd, 8)=skilllv;
+ WFIFOW(fd,10)=skill_get_sp(skillid,skilllv);
+ range = skill_get_range(skillid,skilllv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ WFIFOW(fd,12)=range;
+ memcpy(WFIFOP(fd,14),name,24);
+ WFIFOB(fd,38)=0;
+ WFIFOSET(fd,packet_len_table[0x147]);
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚ɃAƒCƒeƒ€’ljÁ
+ *------------------------------------------
+ */
+int clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail)
+{
+ int view,j,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf=WFIFOP(fd,0);
+ if(n<0 || n>=MAX_CART || sd->status.cart[n].nameid<=0)
+ return 1;
+
+ WBUFW(buf,0)=0x124;
+ WBUFW(buf,2)=n+2;
+ WBUFL(buf,4)=amount;
+ if((view = itemdb_viewid(sd->status.cart[n].nameid)) > 0)
+ WBUFW(buf,8)=view;
+ else
+ WBUFW(buf,8)=sd->status.cart[n].nameid;
+ WBUFB(buf,10)=sd->status.cart[n].identify;
+ WBUFB(buf,11)=sd->status.cart[n].attribute;
+ WBUFB(buf,12)=sd->status.cart[n].refine;
+ if(sd->status.cart[n].card[0]==0x00ff || sd->status.cart[n].card[0]==0x00fe || sd->status.cart[n].card[0]==(short)0xff00) {
+ WBUFW(buf,13)=sd->status.cart[n].card[0];
+ WBUFW(buf,15)=sd->status.cart[n].card[1];
+ WBUFW(buf,17)=sd->status.cart[n].card[2];
+ WBUFW(buf,19)=sd->status.cart[n].card[3];
+ } else {
+ if(sd->status.cart[n].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[0])) > 0)
+ WBUFW(buf,13)= j;
+ else
+ WBUFW(buf,13)= sd->status.cart[n].card[0];
+ if(sd->status.cart[n].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[1])) > 0)
+ WBUFW(buf,15)= j;
+ else
+ WBUFW(buf,15)= sd->status.cart[n].card[1];
+ if(sd->status.cart[n].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[2])) > 0)
+ WBUFW(buf,17)= j;
+ else
+ WBUFW(buf,17)= sd->status.cart[n].card[2];
+ if(sd->status.cart[n].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[3])) > 0)
+ WBUFW(buf,19)= j;
+ else
+ WBUFW(buf,19)= sd->status.cart[n].card[3];
+ }
+ WFIFOSET(fd,packet_len_table[0x124]);
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€íœ
+ *------------------------------------------
+ */
+int clif_cart_delitem(struct map_session_data *sd,int n,int amount)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+
+ WFIFOW(fd,0)=0x125;
+ WFIFOW(fd,2)=n+2;
+ WFIFOL(fd,4)=amount;
+
+ WFIFOSET(fd,packet_len_table[0x125]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚̃AƒCƒeƒ€ƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_cart_itemlist(struct map_session_data *sd)
+{
+ struct item_data *id;
+ int i,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+#if PACKETVER < 5
+ WBUFW(buf,0)=0x123;
+ for(i=0,n=0;i<MAX_CART;i++){
+ if(sd->status.cart[i].nameid<=0)
+ continue;
+ id = itemdb_search(sd->status.cart[i].nameid);
+ if(itemdb_isequip2(id))
+ continue;
+ WBUFW(buf,n*10+4)=i+2;
+ if(id->view_id > 0)
+ WBUFW(buf,n*10+6)=id->view_id;
+ else
+ WBUFW(buf,n*10+6)=sd->status.cart[i].nameid;
+ WBUFB(buf,n*10+8)=id->type;
+ WBUFB(buf,n*10+9)=sd->status.cart[i].identify;
+ WBUFW(buf,n*10+10)=sd->status.cart[i].amount;
+ WBUFW(buf,n*10+12)=0;
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*10;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#else
+ WBUFW(buf,0)=0x1ef;
+ for(i=0,n=0;i<MAX_CART;i++){
+ if(sd->status.cart[i].nameid<=0)
+ continue;
+ id = itemdb_search(sd->status.cart[i].nameid);
+ if(itemdb_isequip2(id))
+ continue;
+ WBUFW(buf,n*18+4)=i+2;
+ if(id->view_id > 0)
+ WBUFW(buf,n*18+6)=id->view_id;
+ else
+ WBUFW(buf,n*18+6)=sd->status.cart[i].nameid;
+ WBUFB(buf,n*18+8)=id->type;
+ WBUFB(buf,n*18+9)=sd->status.cart[i].identify;
+ WBUFW(buf,n*18+10)=sd->status.cart[i].amount;
+ WBUFW(buf,n*18+12)=0;
+ WBUFW(buf,n*18+14)=sd->status.cart[i].card[0];
+ WBUFW(buf,n*18+16)=sd->status.cart[i].card[1];
+ WBUFW(buf,n*18+18)=sd->status.cart[i].card[2];
+ WBUFW(buf,n*18+20)=sd->status.cart[i].card[3];
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*18;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+#endif
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚Ì‘•”õ•iƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_cart_equiplist(struct map_session_data *sd)
+{
+ struct item_data *id;
+ int i,j,n,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+
+ WBUFW(buf,0)=0x122;
+ for(i=0,n=0;i<MAX_INVENTORY;i++){
+ if(sd->status.cart[i].nameid<=0)
+ continue;
+ id = itemdb_search(sd->status.cart[i].nameid);
+ if(!itemdb_isequip2(id))
+ continue;
+ WBUFW(buf,n*20+4)=i+2;
+ if(id->view_id > 0)
+ WBUFW(buf,n*20+6)=id->view_id;
+ else
+ WBUFW(buf,n*20+6)=sd->status.cart[i].nameid;
+ WBUFB(buf,n*20+8)=id->type;
+ WBUFB(buf,n*20+9)=sd->status.cart[i].identify;
+ WBUFW(buf,n*20+10)=id->equip;
+ WBUFW(buf,n*20+12)=sd->status.cart[i].equip;
+ WBUFB(buf,n*20+14)=sd->status.cart[i].attribute;
+ WBUFB(buf,n*20+15)=sd->status.cart[i].refine;
+ if(sd->status.cart[i].card[0]==0x00ff || sd->status.cart[i].card[0]==0x00fe || sd->status.cart[i].card[0]==(short)0xff00) {
+ WBUFW(buf,n*20+16)=sd->status.cart[i].card[0];
+ WBUFW(buf,n*20+18)=sd->status.cart[i].card[1];
+ WBUFW(buf,n*20+20)=sd->status.cart[i].card[2];
+ WBUFW(buf,n*20+22)=sd->status.cart[i].card[3];
+ } else {
+ if(sd->status.cart[i].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[0])) > 0)
+ WBUFW(buf,n*20+16)= j;
+ else
+ WBUFW(buf,n*20+16)= sd->status.cart[i].card[0];
+ if(sd->status.cart[i].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[1])) > 0)
+ WBUFW(buf,n*20+18)= j;
+ else
+ WBUFW(buf,n*20+18)= sd->status.cart[i].card[1];
+ if(sd->status.cart[i].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[2])) > 0)
+ WBUFW(buf,n*20+20)= j;
+ else
+ WBUFW(buf,n*20+20)= sd->status.cart[i].card[2];
+ if(sd->status.cart[i].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[3])) > 0)
+ WBUFW(buf,n*20+22)= j;
+ else
+ WBUFW(buf,n*20+22)= sd->status.cart[i].card[3];
+ }
+ n++;
+ }
+ if(n){
+ WBUFW(buf,2)=4+n*20;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+ return 0;
+}
+
+/*==========================================
+ * ˜I“XŠJÝ
+ *------------------------------------------
+ */
+int clif_openvendingreq(struct map_session_data *sd,int num)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x12d;
+ WFIFOW(fd,2)=num;
+ WFIFOSET(fd,packet_len_table[0x12d]);
+
+ return 0;
+}
+
+/*==========================================
+ * ˜I“XŠÅ”•\Ž¦
+ *------------------------------------------
+ */
+int clif_showvendingboard(struct block_list* bl,char *message,int fd)
+{
+ unsigned char buf[128];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0)=0x131;
+ WBUFL(buf,2)=bl->id;
+ strncpy(WBUFP(buf,6),message,80);
+ if(fd){
+ memcpy(WFIFOP(fd,0),buf,packet_len_table[0x131]);
+ WFIFOSET(fd,packet_len_table[0x131]);
+ }else{
+ clif_send(buf,packet_len_table[0x131],bl,AREA_WOS);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ˜I“XŠÅ”ÂÁ‹Ž
+ *------------------------------------------
+ */
+int clif_closevendingboard(struct block_list* bl,int fd)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0)=0x132;
+ WBUFL(buf,2)=bl->id;
+ if(fd){
+ memcpy(WFIFOP(fd,0),buf,packet_len_table[0x132]);
+ WFIFOSET(fd,packet_len_table[0x132]);
+ }else{
+ clif_send(buf,packet_len_table[0x132],bl,AREA_WOS);
+ }
+
+ return 0;
+}
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_vendinglist(struct map_session_data *sd,int id,struct vending *vending)
+{
+ struct item_data *data;
+ int i,j,n,index,fd;
+ struct map_session_data *vsd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, vending);
+ nullpo_retr(0, vsd=map_id2sd(id));
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+ WBUFW(buf,0)=0x133;
+ WBUFL(buf,4)=id;
+ for(i=0,n=0;i<vsd->vend_num;i++){
+ if(vending[i].amount<=0)
+ continue;
+ WBUFL(buf,8+n*22)=vending[i].value;
+ WBUFW(buf,12+n*22)=vending[i].amount;
+ WBUFW(buf,14+n*22)=(index=vending[i].index)+2;
+ if(vsd->status.cart[index].nameid <= 0 || vsd->status.cart[index].amount <= 0)
+ continue;
+ data = itemdb_search(vsd->status.cart[index].nameid);
+ WBUFB(buf,16+n*22)=data->type;
+ if(data->view_id > 0)
+ WBUFW(buf,17+n*22)=data->view_id;
+ else
+ WBUFW(buf,17+n*22)=vsd->status.cart[index].nameid;
+ WBUFB(buf,19+n*22)=vsd->status.cart[index].identify;
+ WBUFB(buf,20+n*22)=vsd->status.cart[index].attribute;
+ WBUFB(buf,21+n*22)=vsd->status.cart[index].refine;
+ if(vsd->status.cart[index].card[0]==0x00ff || vsd->status.cart[index].card[0]==0x00fe || vsd->status.cart[index].card[0]==(short)0xff00) {
+ WBUFW(buf,22+n*22)=vsd->status.cart[index].card[0];
+ WBUFW(buf,24+n*22)=vsd->status.cart[index].card[1];
+ WBUFW(buf,26+n*22)=vsd->status.cart[index].card[2];
+ WBUFW(buf,28+n*22)=vsd->status.cart[index].card[3];
+ } else {
+ if(vsd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[0])) > 0)
+ WBUFW(buf,22+n*22)= j;
+ else
+ WBUFW(buf,22+n*22)= vsd->status.cart[index].card[0];
+ if(vsd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[1])) > 0)
+ WBUFW(buf,24+n*22)= j;
+ else
+ WBUFW(buf,24+n*22)= vsd->status.cart[index].card[1];
+ if(vsd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[2])) > 0)
+ WBUFW(buf,26+n*22)= j;
+ else
+ WBUFW(buf,26+n*22)= vsd->status.cart[index].card[2];
+ if(vsd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(vsd->status.cart[index].card[3])) > 0)
+ WBUFW(buf,28+n*22)= j;
+ else
+ WBUFW(buf,28+n*22)= vsd->status.cart[index].card[3];
+ }
+ n++;
+ }
+ if(n > 0){
+ WBUFW(buf,2)=8+n*22;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€w“üŽ¸”s
+ *------------------------------------------
+*/
+int clif_buyvending(struct map_session_data *sd,int index,int amount,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x135;
+ WFIFOW(fd,2)=index+2;
+ WFIFOW(fd,4)=amount;
+ WFIFOB(fd,6)=fail;
+ WFIFOSET(fd,packet_len_table[0x135]);
+
+ return 0;
+}
+
+/*==========================================
+ * ˜I“XŠJݬŒ÷
+ *------------------------------------------
+*/
+int clif_openvending(struct map_session_data *sd,int id,struct vending *vending)
+{
+ struct item_data *data;
+ int i,j,n,index,fd;
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ buf = WFIFOP(fd,0);
+
+ WBUFW(buf,0)=0x136;
+ WBUFL(buf,4)=id;
+ for(i=0,n=0;i<sd->vend_num;i++){
+ if (sd->vend_num > 2+pc_checkskill(sd,MC_VENDING)) return 0;
+ WBUFL(buf,8+n*22)=vending[i].value;
+ WBUFW(buf,12+n*22)=(index=vending[i].index)+2;
+ WBUFW(buf,14+n*22)=vending[i].amount;
+ if(sd->status.cart[index].nameid <= 0 || sd->status.cart[index].amount <= 0 || sd->status.cart[index].identify==0 ||
+ sd->status.cart[index].attribute==1) // Prevent unidentified and broken items from being sold [Valaris]
+ continue;
+ data = itemdb_search(sd->status.cart[index].nameid);
+ WBUFB(buf,16+n*22)=data->type;
+ if(data->view_id > 0)
+ WBUFW(buf,17+n*22)=data->view_id;
+ else
+ WBUFW(buf,17+n*22)=sd->status.cart[index].nameid;
+ WBUFB(buf,19+n*22)=sd->status.cart[index].identify;
+ WBUFB(buf,20+n*22)=sd->status.cart[index].attribute;
+ WBUFB(buf,21+n*22)=sd->status.cart[index].refine;
+ if(sd->status.cart[index].card[0]==0x00ff || sd->status.cart[index].card[0]==0x00fe || sd->status.cart[index].card[0]==(short)0xff00) {
+ WBUFW(buf,22+n*22)=sd->status.cart[index].card[0];
+ WBUFW(buf,24+n*22)=sd->status.cart[index].card[1];
+ WBUFW(buf,26+n*22)=sd->status.cart[index].card[2];
+ WBUFW(buf,28+n*22)=sd->status.cart[index].card[3];
+ } else {
+ if(sd->status.cart[index].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[0])) > 0)
+ WBUFW(buf,22+n*22)= j;
+ else
+ WBUFW(buf,22+n*22)= sd->status.cart[index].card[0];
+ if(sd->status.cart[index].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[1])) > 0)
+ WBUFW(buf,24+n*22)= j;
+ else
+ WBUFW(buf,24+n*22)= sd->status.cart[index].card[1];
+ if(sd->status.cart[index].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[2])) > 0)
+ WBUFW(buf,26+n*22)= j;
+ else
+ WBUFW(buf,26+n*22)= sd->status.cart[index].card[2];
+ if(sd->status.cart[index].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[index].card[3])) > 0)
+ WBUFW(buf,28+n*22)= j;
+ else
+ WBUFW(buf,28+n*22)= sd->status.cart[index].card[3];
+ }
+ n++;
+ }
+ if(n > 0){
+ WBUFW(buf,2)=8+n*22;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ }
+
+ return n;
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€”Ì”„•ñ
+ *------------------------------------------
+*/
+int clif_vendingreport(struct map_session_data *sd,int index,int amount)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x137;
+ WFIFOW(fd,2)=index+2;
+ WFIFOW(fd,4)=amount;
+ WFIFOSET(fd,packet_len_table[0x137]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒp[ƒeƒB쬊®—¹
+ *------------------------------------------
+ */
+int clif_party_created(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xfa;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0xfa]);
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBî•ñ‘—M
+ *------------------------------------------
+ */
+int clif_party_info(struct party *p,int fd)
+{
+ unsigned char buf[1024];
+ int i,c;
+ struct map_session_data *sd=NULL;
+
+ nullpo_retr(0, p);
+
+ WBUFW(buf,0)=0xfb;
+ memcpy(WBUFP(buf,4),p->name,24);
+ for(i=c=0;i<MAX_PARTY;i++){
+ struct party_member *m=&p->member[i];
+ if(m->account_id>0){
+ if(sd==NULL) sd=m->sd;
+ WBUFL(buf,28+c*46)=m->account_id;
+ memcpy(WBUFP(buf,28+c*46+ 4),m->name,24);
+ memcpy(WBUFP(buf,28+c*46+28),m->map,16);
+ WBUFB(buf,28+c*46+44)=(m->leader)?0:1;
+ WBUFB(buf,28+c*46+45)=(m->online)?0:1;
+ c++;
+ }
+ }
+ WBUFW(buf,2)=28+c*46;
+ if(fd>=0){ // fd‚ªÝ’肳‚ê‚Ä‚é‚È‚ç‚»‚ê‚É‘—‚é
+ memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 9;
+ }
+ if(sd!=NULL)
+ clif_send(buf,WBUFW(buf,2),&sd->bl,PARTY);
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBŠ©—U
+ *------------------------------------------
+ */
+int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd)
+{
+ int fd;
+ struct party *p;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, tsd);
+
+ fd=tsd->fd;
+
+ if( (p=party_search(sd->status.party_id))==NULL )
+ return 0;
+
+ WFIFOW(fd,0)=0xfe;
+ WFIFOL(fd,2)=sd->status.account_id;
+ memcpy(WFIFOP(fd,6),p->name,24);
+ WFIFOSET(fd,packet_len_table[0xfe]);
+ return 0;
+}
+
+/*==========================================
+ * ƒp[ƒeƒBŠ©—UŒ‹‰Ê
+ *------------------------------------------
+ */
+int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xfd;
+ memcpy(WFIFOP(fd,2),nick,24);
+ WFIFOB(fd,26)=flag;
+ WFIFOSET(fd,packet_len_table[0xfd]);
+ return 0;
+}
+
+/*==========================================
+ * ƒp[ƒeƒBÝ’è‘—M
+ * flag & 0x001=exp•ÏXƒ~ƒX
+ * 0x010=item•ÏXƒ~ƒX
+ * 0x100=ˆêl‚É‚Ì‚Ý‘—M
+ *------------------------------------------
+ */
+int clif_party_option(struct party *p,struct map_session_data *sd,int flag)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, p);
+
+// if(battle_config.etc_log)
+// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag);
+ if(sd==NULL && flag==0){
+ int i;
+ for(i=0;i<MAX_PARTY;i++)
+ if((sd=map_id2sd(p->member[i].account_id))!=NULL)
+ break;
+ }
+ if(sd==NULL)
+ return 0;
+ WBUFW(buf,0)=0x101;
+ WBUFW(buf,2)=((flag&0x01)?2:p->exp);
+ WBUFW(buf,4)=((flag&0x10)?2:p->item);
+ if(flag==0)
+ clif_send(buf,packet_len_table[0x101],&sd->bl,PARTY);
+ else {
+ memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x101]);
+ WFIFOSET(sd->fd,packet_len_table[0x101]);
+ }
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒB’E‘Þi’E‘Þ‘O‚ɌĂԂ±‚Æj
+ *------------------------------------------
+ */
+int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag)
+{
+ unsigned char buf[64];
+ int i;
+
+ nullpo_retr(0, p);
+
+ WBUFW(buf,0)=0x105;
+ WBUFL(buf,2)=account_id;
+ memcpy(WBUFP(buf,6),name,24);
+ WBUFB(buf,30)=flag&0x0f;
+
+ if((flag&0xf0)==0){
+ if(sd==NULL)
+ for(i=0;i<MAX_PARTY;i++)
+ if((sd=p->member[i].sd)!=NULL)
+ break;
+ if (sd!=NULL)
+ clif_send(buf,packet_len_table[0x105],&sd->bl,PARTY);
+ } else if (sd!=NULL) {
+ memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x105]);
+ WFIFOSET(sd->fd,packet_len_table[0x105]);
+ }
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
+ *------------------------------------------
+ */
+int clif_party_message(struct party *p,int account_id,char *mes,int len)
+{
+ struct map_session_data *sd;
+ int i;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<MAX_PARTY;i++){
+ if((sd=p->member[i].sd)!=NULL)
+ break;
+ }
+ if(sd!=NULL){
+ unsigned char buf[1024];
+ WBUFW(buf,0)=0x109;
+ WBUFW(buf,2)=len+8;
+ WBUFL(buf,4)=account_id;
+ memcpy(WBUFP(buf,8),mes,len);
+ clif_send(buf,len+8,&sd->bl,PARTY);
+ }
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBÀ•W’Ê’m
+ *------------------------------------------
+ */
+int clif_party_xy(struct party *p,struct map_session_data *sd)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x107;
+ WBUFL(buf,2)=sd->status.account_id;
+ WBUFW(buf,6)=sd->bl.x;
+ WBUFW(buf,8)=sd->bl.y;
+ clif_send(buf,packet_len_table[0x107],&sd->bl,PARTY_SAMEMAP_WOS);
+// if(battle_config.etc_log)
+// printf("clif_party_xy %d\n",sd->status.account_id);
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBHP’Ê’m
+ *------------------------------------------
+ */
+int clif_party_hp(struct party *p,struct map_session_data *sd)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x106;
+ WBUFL(buf,2)=sd->status.account_id;
+ WBUFW(buf,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp;
+ WBUFW(buf,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp;
+ clif_send(buf,packet_len_table[0x106],&sd->bl,PARTY_AREA_WOS);
+// if(battle_config.etc_log)
+// printf("clif_party_hp %d\n",sd->status.account_id);
+ return 0;
+}
+/*==========================================
+ * ƒp[ƒeƒBꊈړ®i–¢Žg—pj
+ *------------------------------------------
+ */
+int clif_party_move(struct party *p,struct map_session_data *sd,int online)
+{
+ unsigned char buf[128];
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, p);
+
+ WBUFW(buf, 0)=0x104;
+ WBUFL(buf, 2)=sd->status.account_id;
+ WBUFL(buf, 6)=0;
+ WBUFW(buf,10)=sd->bl.x;
+ WBUFW(buf,12)=sd->bl.y;
+ WBUFB(buf,14)=!online;
+ memcpy(WBUFP(buf,15),p->name,24);
+ memcpy(WBUFP(buf,39),sd->status.name,24);
+ memcpy(WBUFP(buf,63),map[sd->bl.m].name,16);
+ clif_send(buf,packet_len_table[0x104],&sd->bl,PARTY);
+ return 0;
+}
+/*==========================================
+ * UŒ‚‚·‚邽‚߂Ɉړ®‚ª•K—v
+ *------------------------------------------
+ */
+int clif_movetoattack(struct map_session_data *sd,struct block_list *bl)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, bl);
+
+ fd=sd->fd;
+ WFIFOW(fd, 0)=0x139;
+ WFIFOL(fd, 2)=bl->id;
+ WFIFOW(fd, 6)=bl->x;
+ WFIFOW(fd, 8)=bl->y;
+ WFIFOW(fd,10)=sd->bl.x;
+ WFIFOW(fd,12)=sd->bl.y;
+ WFIFOW(fd,14)=sd->attackrange;
+ WFIFOSET(fd,packet_len_table[0x139]);
+ return 0;
+}
+/*==========================================
+ * »‘¢ƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int clif_produceeffect(struct map_session_data *sd,int flag,int nameid)
+{
+ int view,fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ // –¼‘O‚Ì“o˜^‚Æ‘—M‚ðæ‚É‚µ‚Ä‚¨‚­
+ if( map_charid2nick(sd->status.char_id)==NULL )
+ map_addchariddb(sd->status.char_id,sd->status.name);
+ clif_solved_charname(sd,sd->status.char_id);
+
+ WFIFOW(fd, 0)=0x18f;
+ WFIFOW(fd, 2)=flag;
+ if((view = itemdb_viewid(nameid)) > 0)
+ WFIFOW(fd, 4)=view;
+ else
+ WFIFOW(fd, 4)=nameid;
+ WFIFOSET(fd,packet_len_table[0x18f]);
+ return 0;
+}
+
+// pet
+int clif_catch_process(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x19e;
+ WFIFOSET(fd,packet_len_table[0x19e]);
+
+ return 0;
+}
+
+int clif_pet_rulet(struct map_session_data *sd,int data)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1a0;
+ WFIFOB(fd,2)=data;
+ WFIFOSET(fd,packet_len_table[0x1a0]);
+
+ return 0;
+}
+
+/*==========================================
+ * pet—‘ƒŠƒXƒgì¬
+ *------------------------------------------
+ */
+int clif_sendegg(struct map_session_data *sd)
+{
+ //R 01a6 <len>.w <index>.w*
+ int i,n=0,fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1a6;
+ if(sd->status.pet_id <= 0) {
+ for(i=0,n=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
+ sd->inventory_data[i]->type!=7 ||
+ sd->status.inventory[i].amount<=0)
+ continue;
+ WFIFOW(fd,n*2+4)=i+2;
+ n++;
+ }
+ }
+ WFIFOW(fd,2)=4+n*2;
+ WFIFOSET(fd,WFIFOW(fd,2));
+
+ return 0;
+}
+
+int clif_send_petdata(struct map_session_data *sd,int type,int param)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1a4;
+ WFIFOB(fd,2)=type;
+ WFIFOL(fd,3)=sd->pd->bl.id;
+ WFIFOL(fd,7)=param;
+ WFIFOSET(fd,packet_len_table[0x1a4]);
+
+ return 0;
+}
+
+int clif_send_petstatus(struct map_session_data *sd)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1a2;
+ memcpy(WFIFOP(fd,2),sd->pet.name,24);
+ WFIFOB(fd,26)=(battle_config.pet_rename == 1)? 0:sd->pet.rename_flag;
+ WFIFOW(fd,27)=sd->pet.level;
+ WFIFOW(fd,29)=sd->pet.hungry;
+ WFIFOW(fd,31)=sd->pet.intimate;
+ WFIFOW(fd,33)=sd->pet.equip;
+ WFIFOSET(fd,packet_len_table[0x1a2]);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_pet_emotion(struct pet_data *pd,int param)
+{
+ unsigned char buf[16];
+ struct map_session_data *sd;
+
+ nullpo_retr(0, pd);
+ nullpo_retr(0, sd = pd->msd);
+
+ memset(buf,0,packet_len_table[0x1aa]);
+
+ WBUFW(buf,0)=0x1aa;
+ WBUFL(buf,2)=pd->bl.id;
+ if(param >= 100 && sd->petDB->talk_convert_class) {
+ if(sd->petDB->talk_convert_class < 0)
+ return 0;
+ else if(sd->petDB->talk_convert_class > 0) {
+ param -= (pd->class - 100)*100;
+ param += (sd->petDB->talk_convert_class - 100)*100;
+ }
+ }
+ WBUFL(buf,6)=param;
+
+ clif_send(buf,packet_len_table[0x1aa],&pd->bl,AREA);
+
+ return 0;
+}
+
+int clif_pet_performance(struct block_list *bl,int param)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, bl);
+
+ memset(buf,0,packet_len_table[0x1a4]);
+
+ WBUFW(buf,0)=0x1a4;
+ WBUFB(buf,2)=4;
+ WBUFL(buf,3)=bl->id;
+ WBUFL(buf,7)=param;
+
+ clif_send(buf,packet_len_table[0x1a4],bl,AREA);
+
+ return 0;
+}
+
+int clif_pet_equip(struct pet_data *pd,int nameid)
+{
+ unsigned char buf[16];
+ int view;
+
+ nullpo_retr(0, pd);
+
+ memset(buf,0,packet_len_table[0x1a4]);
+
+ WBUFW(buf,0)=0x1a4;
+ WBUFB(buf,2)=3;
+ WBUFL(buf,3)=pd->bl.id;
+ if((view = itemdb_viewid(nameid)) > 0)
+ WBUFL(buf,7)=view;
+ else
+ WBUFL(buf,7)=nameid;
+
+ clif_send(buf,packet_len_table[0x1a4],&pd->bl,AREA);
+
+ return 0;
+}
+
+int clif_pet_food(struct map_session_data *sd,int foodid,int fail)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1a3;
+ WFIFOB(fd,2)=fail;
+ WFIFOW(fd,3)=foodid;
+ WFIFOSET(fd,packet_len_table[0x1a3]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒI[ƒgƒXƒyƒ‹ ƒŠƒXƒg‘—M
+ *------------------------------------------
+ */
+int clif_autospell(struct map_session_data *sd,int skilllv)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd, 0)=0x1cd;
+
+ if(skilllv>0 && pc_checkskill(sd,MG_NAPALMBEAT)>0)
+ WFIFOL(fd,2)= MG_NAPALMBEAT;
+ else
+ WFIFOL(fd,2)= 0x00000000;
+ if(skilllv>1 && pc_checkskill(sd,MG_COLDBOLT)>0)
+ WFIFOL(fd,6)= MG_COLDBOLT;
+ else
+ WFIFOL(fd,6)= 0x00000000;
+ if(skilllv>1 && pc_checkskill(sd,MG_FIREBOLT)>0)
+ WFIFOL(fd,10)= MG_FIREBOLT;
+ else
+ WFIFOL(fd,10)= 0x00000000;
+ if(skilllv>1 && pc_checkskill(sd,MG_LIGHTNINGBOLT)>0)
+ WFIFOL(fd,14)= MG_LIGHTNINGBOLT;
+ else
+ WFIFOL(fd,14)= 0x00000000;
+ if(skilllv>4 && pc_checkskill(sd,MG_SOULSTRIKE)>0)
+ WFIFOL(fd,18)= MG_SOULSTRIKE;
+ else
+ WFIFOL(fd,18)= 0x00000000;
+ if(skilllv>7 && pc_checkskill(sd,MG_FIREBALL)>0)
+ WFIFOL(fd,22)= MG_FIREBALL;
+ else
+ WFIFOL(fd,22)= 0x00000000;
+ if(skilllv>9 && pc_checkskill(sd,MG_FROSTDIVER)>0)
+ WFIFOL(fd,26)= MG_FROSTDIVER;
+ else
+ WFIFOL(fd,26)= 0x00000000;
+
+ WFIFOSET(fd,packet_len_table[0x1cd]);
+ return 0;
+}
+
+/*==========================================
+ * ƒfƒBƒ{[ƒVƒ‡ƒ“‚Ì‚¢Ž…
+ *------------------------------------------
+ */
+int clif_devotion(struct map_session_data *sd,int target)
+{
+ unsigned char buf[56];
+ int n;
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x1cf;
+ WBUFL(buf,2)=sd->bl.id;
+// WBUFL(buf,6)=target;
+ for(n=0;n<5;n++)
+ WBUFL(buf,6+4*n)=sd->dev.val2[n];
+// WBUFL(buf,10+4*n)=0;
+ WBUFB(buf,26)=8;
+ WBUFB(buf,27)=0;
+
+ clif_send(buf,packet_len_table[0x1cf],&sd->bl,AREA);
+ return 0;
+}
+
+/*==========================================
+ * Ÿ†‹…
+ *------------------------------------------
+ */
+int clif_spiritball(struct map_session_data *sd)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x1d0;
+ WBUFL(buf,2)=sd->bl.id;
+ WBUFW(buf,6)=sd->spiritball;
+ clif_send(buf,packet_len_table[0x1d0],&sd->bl,AREA);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_combo_delay(struct block_list *bl,int wait)
+{
+ unsigned char buf[32];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf,0)=0x1d2;
+ WBUFL(buf,2)=bl->id;
+ WBUFL(buf,6)=wait;
+ clif_send(buf,packet_len_table[0x1d2],bl,AREA);
+
+ return 0;
+}
+/*==========================================
+ *”’nŽæ‚è
+ *------------------------------------------
+ */
+int clif_bladestop(struct block_list *src,struct block_list *dst,
+ int bool)
+{
+ unsigned char buf[32];
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, dst);
+
+ WBUFW(buf,0)=0x1d1;
+ WBUFL(buf,2)=src->id;
+ WBUFL(buf,6)=dst->id;
+ WBUFL(buf,10)=bool;
+
+ clif_send(buf,packet_len_table[0x1d1],src,AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_changemapcell(int m,int x,int y,int cell_type,int type)
+{
+ struct block_list bl;
+ char buf[32];
+
+ bl.m = m;
+ bl.x = x;
+ bl.y = y;
+ WBUFW(buf,0) = 0x192;
+ WBUFW(buf,2) = x;
+ WBUFW(buf,4) = y;
+ WBUFW(buf,6) = cell_type;
+ memcpy(WBUFP(buf,8),map[m].name,16);
+ if(!type)
+ clif_send(buf,packet_len_table[0x192],&bl,AREA);
+ else
+ clif_send(buf,packet_len_table[0x192],&bl,ALL_SAMEMAP);
+
+ return 0;
+}
+
+/*==========================================
+ * MVPƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int clif_mvp_effect(struct map_session_data *sd)
+{
+ unsigned char buf[16];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf,0)=0x10c;
+ WBUFL(buf,2)=sd->bl.id;
+ clif_send(buf,packet_len_table[0x10c],&sd->bl,AREA);
+ return 0;
+}
+/*==========================================
+ * MVPƒAƒCƒeƒ€Š“¾
+ *------------------------------------------
+ */
+int clif_mvp_item(struct map_session_data *sd,int nameid)
+{
+ int view,fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x10a;
+ if((view = itemdb_viewid(nameid)) > 0)
+ WFIFOW(fd,2)=view;
+ else
+ WFIFOW(fd,2)=nameid;
+ WFIFOSET(fd,packet_len_table[0x10a]);
+ return 0;
+}
+/*==========================================
+ * MVPŒoŒ±’lŠ“¾
+ *------------------------------------------
+ */
+int clif_mvp_exp(struct map_session_data *sd,int exp)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x10b;
+ WFIFOL(fd,2)=exp;
+ WFIFOSET(fd,packet_len_table[0x10b]);
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh쬉”ےʒm
+ *------------------------------------------
+ */
+int clif_guild_created(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x167;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x167]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhŠ‘®’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g)
+{
+ int ps,fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, g);
+
+ fd=sd->fd;
+ ps=guild_getposition(sd,g);
+
+ memset(WFIFOP(fd,0),0,packet_len_table[0x16c]);
+ WFIFOW(fd,0)=0x16c;
+ WFIFOL(fd,2)=g->guild_id;
+ WFIFOL(fd,6)=g->emblem_id;
+ WFIFOL(fd,10)=g->position[ps].mode;
+ memcpy(WFIFOP(fd,19),g->name,24);
+ WFIFOSET(fd,packet_len_table[0x16c]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒoƒƒOƒCƒ“’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag)
+{
+ unsigned char buf[64];
+
+ nullpo_retr(0, g);
+
+ WBUFW(buf, 0)=0x16d;
+ WBUFL(buf, 2)=g->member[idx].account_id;
+ WBUFL(buf, 6)=g->member[idx].char_id;
+ WBUFL(buf,10)=flag;
+ if(g->member[idx].sd==NULL){
+ struct map_session_data *sd=guild_getavailablesd(g);
+ if(sd!=NULL)
+ clif_send(buf,packet_len_table[0x16d],&sd->bl,GUILD);
+ }else
+ clif_send(buf,packet_len_table[0x16d],&g->member[idx].sd->bl,GUILD_WOS);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒ}ƒXƒ^[’Ê’m(14d‚ւ̉ž“š)
+ *------------------------------------------
+ */
+int clif_guild_masterormember(struct map_session_data *sd)
+{
+ int type=0x57,fd;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g!=NULL && strcmp(g->master,sd->status.name)==0)
+ type=0xd7;
+ WFIFOW(fd,0)=0x14e;
+ WFIFOL(fd,2)=type;
+ WFIFOSET(fd,packet_len_table[0x14e]);
+ return 0;
+}
+/*==========================================
+ * Basic Info (Territories [Valaris])
+ *------------------------------------------
+ */
+int clif_guild_basicinfo(struct map_session_data *sd)
+{
+ int fd,i,t=0;
+ struct guild *g;
+ struct guild_castle *gc=NULL;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+
+ WFIFOW(fd, 0)=0x1b6;//0x150;
+ WFIFOL(fd, 2)=g->guild_id;
+ WFIFOL(fd, 6)=g->guild_lv;
+ WFIFOL(fd,10)=g->connect_member;
+ WFIFOL(fd,14)=g->max_member;
+ WFIFOL(fd,18)=g->average_lv;
+ WFIFOL(fd,22)=g->exp;
+ WFIFOL(fd,26)=g->next_exp;
+ WFIFOL(fd,30)=0; // ã”[
+ WFIFOL(fd,34)=0; // VWi«Ši‚̈«‚³HF«ŒüƒOƒ‰ƒt¶‰Ej
+ WFIFOL(fd,38)=0; // RFi³‹`‚Ì“x‡‚¢HF«ŒüƒOƒ‰ƒt㉺j
+ WFIFOL(fd,42)=0; // l”H
+ memcpy(WFIFOP(fd,46),g->name,24);
+ memcpy(WFIFOP(fd,70),g->master,24);
+
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
+ if(!gc) continue;
+ if(g->guild_id == gc->guild_id) t++;
+ }
+
+ if (t==1) memcpy(WFIFOP(fd,94),"One Castle",20);
+ else if (t==2) memcpy(WFIFOP(fd,94),"Two Castles",20);
+ else if (t==3) memcpy(WFIFOP(fd,94),"Three Castles",20);
+ else if (t==4) memcpy(WFIFOP(fd,94),"Four Castles",20);
+ else if (t==5) memcpy(WFIFOP(fd,94),"Five Castles",20);
+ else if (t==6) memcpy(WFIFOP(fd,94),"Six Castles",20);
+ else if (t==7) memcpy(WFIFOP(fd,94),"Seven Castles",20);
+ else if (t==8) memcpy(WFIFOP(fd,94),"Eight Castles",20);
+ else if (t==9) memcpy(WFIFOP(fd,94),"Nine Castles",20);
+ else if (t==10) memcpy(WFIFOP(fd,94),"Ten Castles",20);
+ else if (t==11) memcpy(WFIFOP(fd,94),"Eleven Castles",20);
+ else if (t==12) memcpy(WFIFOP(fd,94),"Twelve Castles",20);
+ else if (t==13) memcpy(WFIFOP(fd,94),"Thirteen Castles",20);
+ else if (t==14) memcpy(WFIFOP(fd,94),"Fourteen Castles",20);
+ else if (t==15) memcpy(WFIFOP(fd,94),"Fifteen Castles",20);
+ else if (t==16) memcpy(WFIFOP(fd,94),"Sixteen Castles",20);
+ else if (t==17) memcpy(WFIFOP(fd,94),"Seventeen Castles",20);
+ else if (t==18) memcpy(WFIFOP(fd,94),"Eighteen Castles",20);
+ else if (t==19) memcpy(WFIFOP(fd,94),"Nineteen Castles",20);
+ else if (t==20) memcpy(WFIFOP(fd,94),"Twenty Castles",20);
+ else if (t==21) memcpy(WFIFOP(fd,94),"Twenty One Castles",20);
+ else if (t==22) memcpy(WFIFOP(fd,94),"Twenty Two Castles",20);
+ else if (t==23) memcpy(WFIFOP(fd,94),"Twenty Three Castles",20);
+ else if (t==24) memcpy(WFIFOP(fd,94),"Twenty Four Castles",20);
+ else if (t==MAX_GUILDCASTLE) memcpy(WFIFOP(fd,94),"Total Domination",20);
+ else memcpy(WFIFOP(fd,94),"None Taken",20);
+
+ WFIFOSET(fd,packet_len_table[WFIFOW(fd,0)]);
+ clif_guild_emblem(sd,g); // Guild emblem vanish fix [Valaris]
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh“¯–¿/“G‘Îî•ñ
+ *------------------------------------------
+ */
+int clif_guild_allianceinfo(struct map_session_data *sd)
+{
+ int fd,i,c;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+ WFIFOW(fd, 0)=0x14c;
+ for(i=c=0;i<MAX_GUILDALLIANCE;i++){
+ struct guild_alliance *a=&g->alliance[i];
+ if(a->guild_id>0){
+ WFIFOL(fd,c*32+4)=a->opposition;
+ WFIFOL(fd,c*32+8)=a->guild_id;
+ memcpy(WFIFOP(fd,c*32+12),a->name,24);
+ c++;
+ }
+ }
+ WFIFOW(fd, 2)=c*32+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒo[ƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_guild_memberlist(struct map_session_data *sd)
+{
+ int fd;
+ int i,c;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+
+ WFIFOW(fd, 0)=0x154;
+ for(i=0,c=0;i<g->max_member;i++){
+ struct guild_member *m=&g->member[i];
+ if(m->account_id==0)
+ continue;
+ WFIFOL(fd,c*104+ 4)=m->account_id;
+ WFIFOL(fd,c*104+ 8)=m->char_id;
+ WFIFOW(fd,c*104+12)=m->hair;
+ WFIFOW(fd,c*104+14)=m->hair_color;
+ WFIFOW(fd,c*104+16)=m->gender;
+ WFIFOW(fd,c*104+18)=m->class;
+ WFIFOW(fd,c*104+20)=m->lv;
+ WFIFOL(fd,c*104+22)=m->exp;
+ WFIFOL(fd,c*104+26)=m->online;
+ WFIFOL(fd,c*104+30)=m->position;
+ memset(WFIFOP(fd,c*104+34),0,50); // ƒƒ‚H
+ memcpy(WFIFOP(fd,c*104+84),m->name,24);
+ c++;
+ }
+ WFIFOW(fd, 2)=c*104+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh–ðE–¼ƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_guild_positionnamelist(struct map_session_data *sd)
+{
+ int i,fd;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+ WFIFOW(fd, 0)=0x166;
+ for(i=0;i<MAX_GUILDPOSITION;i++){
+ WFIFOL(fd,i*28+4)=i;
+ memcpy(WFIFOP(fd,i*28+8),g->position[i].name,24);
+ }
+ WFIFOW(fd,2)=i*28+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh–ðEî•ñƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_guild_positioninfolist(struct map_session_data *sd)
+{
+ int i,fd;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+ WFIFOW(fd, 0)=0x160;
+ for(i=0;i<MAX_GUILDPOSITION;i++){
+ struct guild_position *p=&g->position[i];
+ WFIFOL(fd,i*16+ 4)=i;
+ WFIFOL(fd,i*16+ 8)=p->mode;
+ WFIFOL(fd,i*16+12)=i;
+ WFIFOL(fd,i*16+16)=p->exp_mode;
+ }
+ WFIFOW(fd, 2)=i*16+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_positionchanged(struct guild *g,int idx)
+{
+ struct map_session_data *sd;
+ unsigned char buf[128];
+
+ nullpo_retr(0, g);
+
+ WBUFW(buf, 0)=0x174;
+ WBUFW(buf, 2)=44;
+ WBUFL(buf, 4)=idx;
+ WBUFL(buf, 8)=g->position[idx].mode;
+ WBUFL(buf,12)=idx;
+ WBUFL(buf,16)=g->position[idx].exp_mode;
+ memcpy(WBUFP(buf,20),g->position[idx].name,24);
+ if( (sd=guild_getavailablesd(g))!=NULL )
+ clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒo•ÏX’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_memberpositionchanged(struct guild *g,int idx)
+{
+ struct map_session_data *sd;
+ unsigned char buf[64];
+
+ nullpo_retr(0, g);
+
+ WBUFW(buf, 0)=0x156;
+ WBUFW(buf, 2)=16;
+ WBUFL(buf, 4)=g->member[idx].account_id;
+ WBUFL(buf, 8)=g->member[idx].char_id;
+ WBUFL(buf,12)=g->member[idx].position;
+ if( (sd=guild_getavailablesd(g))!=NULL )
+ clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€‘—M
+ *------------------------------------------
+ */
+int clif_guild_emblem(struct map_session_data *sd,struct guild *g)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, g);
+
+ fd=sd->fd;
+
+ if(g->emblem_len<=0)
+ return 0;
+ WFIFOW(fd,0)=0x152;
+ WFIFOW(fd,2)=g->emblem_len+12;
+ WFIFOL(fd,4)=g->guild_id;
+ WFIFOL(fd,8)=g->emblem_id;
+ memcpy(WFIFOP(fd,12),g->emblem_data,g->emblem_len);
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒXƒLƒ‹‘—M
+ *------------------------------------------
+ */
+int clif_guild_skillinfo(struct map_session_data *sd)
+{
+ int fd;
+ int i,id,c,up=1;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+ WFIFOW(fd,0)=0x0162;
+ WFIFOW(fd,4)=g->skill_point;
+ for(i=c=0;i<MAX_GUILDSKILL;i++){
+ if(g->skill[i].id>0){
+ WFIFOW(fd,c*37+ 6) = id = g->skill[i].id;
+ WFIFOW(fd,c*37+ 8) = guild_skill_get_inf(id);
+ WFIFOW(fd,c*37+10) = 0;
+ WFIFOW(fd,c*37+12) = g->skill[i].lv;
+ WFIFOW(fd,c*37+14) = guild_skill_get_sp(id,g->skill[i].lv);
+ WFIFOW(fd,c*37+16) = guild_skill_get_range(id);
+ memset(WFIFOP(fd,c*37+18),0,24);
+ if(g->skill[i].lv < guild_skill_get_max(id)) {
+ //Kafra and Guardian changed to require Approval [Sara]
+ if (g->skill[i].id == GD_KAFRACONTACT && guild_checkskill(g,GD_APPROVAL) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_GUARDIANRESEARCH && guild_checkskill(g,GD_APPROVAL) <= 0)
+ up = 0;
+ //Glory skill requirements -- Pretty sure correct [Sara]
+ else if (g->skill[i].id == GD_LEADERSHIP && guild_checkskill(g,GD_GLORYGUILD) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_GLORYWOUNDS && guild_checkskill(g,GD_GLORYGUILD) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_SOULCOLD && guild_checkskill(g,GD_GLORYWOUNDS) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_HAWKEYES && guild_checkskill(g,GD_LEADERSHIP) <= 0)
+ up = 0;
+ //Activated skill requirements -- Just guesses [Sara]
+ else if (g->skill[i].id == GD_BATTLEORDER && guild_checkskill(g,GD_APPROVAL) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_REGENERATION && guild_checkskill(g,GD_APPROVAL) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_RESTORE && guild_checkskill(g,GD_REGENERATION) <= 0)
+ up = 0;
+ else if (g->skill[i].id == GD_EMERGENCYCALL && guild_checkskill(g,GD_APPROVAL) <= 0)
+ up = 0;
+ if (g->skill[i].id == GD_GUARDUP && guild_checkskill(g,GD_GUARDIANRESEARCH) <= 0)
+ up = 0;
+ //Unadded yet? Has extension description in kRO tables
+ else if (g->skill[i].id == GD_DEVELOPMENT)
+ up = 0;
+ else
+ up = 1;
+ }
+ else {
+ up = 0;
+ }
+ WFIFOB(fd,c*37+42)= up;
+ c++;
+ }
+ }
+ WFIFOW(fd,2)=c*37+6;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh’m‘—M
+ *------------------------------------------
+ */
+int clif_guild_notice(struct map_session_data *sd,struct guild *g)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, g);
+
+ fd=sd->fd;
+ if(*g->mes1==0 && *g->mes2==0)
+ return 0;
+ WFIFOW(fd,0)=0x16f;
+ memcpy(WFIFOP(fd,2),g->mes1,60);
+ memcpy(WFIFOP(fd,62),g->mes2,120);
+ WFIFOSET(fd,packet_len_table[0x16f]);
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒoŠ©—U
+ *------------------------------------------
+ */
+int clif_guild_invite(struct map_session_data *sd,struct guild *g)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, g);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x16a;
+ WFIFOL(fd,2)=g->guild_id;
+ memcpy(WFIFOP(fd,6),g->name,24);
+ WFIFOSET(fd,packet_len_table[0x16a]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒoŠ©—UŒ‹‰Ê
+ *------------------------------------------
+ */
+int clif_guild_inviteack(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x169;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x169]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes)
+{
+ unsigned char buf[128];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf, 0)=0x15a;
+ memcpy(WBUFP(buf, 2),name,24);
+ memcpy(WBUFP(buf,26),mes,40);
+ clif_send(buf,packet_len_table[0x15a],&sd->bl,GUILD);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒo’Ç•ú’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes,
+ int account_id)
+{
+ unsigned char buf[128];
+
+ nullpo_retr(0, sd);
+
+ WBUFW(buf, 0)=0x15c;
+ memcpy(WBUFP(buf, 2),name,24);
+ memcpy(WBUFP(buf,26),mes,40);
+ memcpy(WBUFP(buf,66),"dummy",24);
+ clif_send(buf,packet_len_table[0x15c],&sd->bl,GUILD);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh’Ç•úƒƒ“ƒoƒŠƒXƒg
+ *------------------------------------------
+ */
+int clif_guild_explusionlist(struct map_session_data *sd)
+{
+ int fd;
+ int i,c;
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ return 0;
+ WFIFOW(fd,0)=0x163;
+ for(i=c=0;i<MAX_GUILDEXPLUSION;i++){
+ struct guild_explusion *e=&g->explusion[i];
+ if(e->account_id>0){
+ memcpy(WFIFOP(fd,c*88+ 4),e->name,24);
+ memcpy(WFIFOP(fd,c*88+28),e->acc,24);
+ memcpy(WFIFOP(fd,c*88+52),e->mes,44);
+ c++;
+ }
+ }
+ WFIFOW(fd,2)=c*88+4;
+ WFIFOSET(fd,WFIFOW(fd,2));
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh‰ï˜b
+ *------------------------------------------
+ */
+int clif_guild_message(struct guild *g,int account_id,const char *mes,int len)
+{
+ struct map_session_data *sd;
+ unsigned char *buf;
+
+ buf = (unsigned char*)aCalloc(len + 4, sizeof(unsigned char));
+
+ WBUFW(buf, 0) = 0x17f;
+ WBUFW(buf, 2) = len + 4;
+ memcpy(WBUFP(buf,4), mes, len);
+
+ if ((sd = guild_getavailablesd(g)) != NULL)
+ clif_send(buf, WBUFW(buf,2), &sd->bl, GUILD);
+
+ if(buf) free(buf);
+
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0) = 0x10e;
+ WFIFOW(fd,2) = skill_num;
+ WFIFOW(fd,4) = lv;
+ WFIFOW(fd,6) = guild_skill_get_sp(skill_num,lv);
+ WFIFOW(fd,8) = guild_skill_get_range(skill_num);
+ WFIFOB(fd,10) = 1;
+ WFIFOSET(fd,11);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh“¯–¿—v¿
+ *------------------------------------------
+ */
+int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x171;
+ WFIFOL(fd,2)=account_id;
+ memcpy(WFIFOP(fd,6),name,24);
+ WFIFOSET(fd,packet_len_table[0x171]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh“¯–¿Œ‹‰Ê
+ *------------------------------------------
+ */
+int clif_guild_allianceack(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x173;
+ WFIFOL(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x173]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhŠÖŒW‰ðÁ’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x184;
+ WFIFOL(fd,2)=guild_id;
+ WFIFOL(fd,6)=flag;
+ WFIFOSET(fd,packet_len_table[0x184]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒh“G‘ÎŒ‹‰Ê
+ *------------------------------------------
+ */
+int clif_guild_oppositionack(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x181;
+ WFIFOB(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x181]);
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhŠÖŒW’ljÁ
+ *------------------------------------------
+ */
+/*int clif_guild_allianceadded(struct guild *g,int idx)
+{
+ unsigned char buf[64];
+ WBUFW(fd,0)=0x185;
+ WBUFL(fd,2)=g->alliance[idx].opposition;
+ WBUFL(fd,6)=g->alliance[idx].guild_id;
+ memcpy(WBUFP(fd,10),g->alliance[idx].name,24);
+ clif_send(buf,packet_len_table[0x185],guild_getavailablesd(g),GUILD);
+ return 0;
+}*/
+
+/*==========================================
+ * ƒMƒ‹ƒh‰ðŽU’Ê’m
+ *------------------------------------------
+ */
+int clif_guild_broken(struct map_session_data *sd,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x15e;
+ WFIFOL(fd,2)=flag;
+ WFIFOSET(fd,packet_len_table[0x15e]);
+ return 0;
+}
+
+/*==========================================
+ * ƒGƒ‚[ƒVƒ‡ƒ“
+ *------------------------------------------
+ */
+void clif_emotion(struct block_list *bl,int type)
+{
+ unsigned char buf[8];
+
+ nullpo_retv(bl);
+
+ WBUFW(buf,0)=0xc0;
+ WBUFL(buf,2)=bl->id;
+ WBUFB(buf,6)=type;
+ clif_send(buf,packet_len_table[0xc0],bl,AREA);
+}
+
+/*==========================================
+ * ƒg[ƒL[ƒ{ƒbƒNƒX
+ *------------------------------------------
+ */
+void clif_talkiebox(struct block_list *bl,char* talkie)
+{
+ unsigned char buf[86];
+
+ nullpo_retv(bl);
+
+ WBUFW(buf,0)=0x191;
+ WBUFL(buf,2)=bl->id;
+ memcpy(WBUFP(buf,6),talkie,80);
+ clif_send(buf,packet_len_table[0x191],bl,AREA);
+}
+
+/*==========================================
+ * Œ‹¥ƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+void clif_wedding_effect(struct block_list *bl) {
+ unsigned char buf[6];
+
+ nullpo_retv(bl);
+
+ WBUFW(buf,0) = 0x1ea;
+ WBUFL(buf,2) = bl->id;
+ clif_send(buf, packet_len_table[0x1ea], bl, AREA);
+}
+/*==========================================
+ * ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢Žg—pŽž–¼‘O‹©‚Ñ
+ *------------------------------------------
+
+void clif_callpartner(struct map_session_data *sd)
+{
+ unsigned char buf[26];
+ char *p;
+
+ nullpo_retv(sd);
+
+ if(sd->status.partner_id){
+ WBUFW(buf,0)=0x1e6;
+ p = map_charid2nick(sd->status.partner_id);
+ if(p){
+ memcpy(WBUFP(buf,2),p,24);
+ }else{
+ map_reqchariddb(sd,sd->status.partner_id);
+ chrif_searchcharid(sd->status.partner_id);
+ WBUFB(buf,2) = 0;
+ }
+ clif_send(buf,packet_len_table[0x1e6]&sd->bl,AREA);
+ }
+ return;
+}
+*/
+/*==========================================
+ * À‚é
+ *------------------------------------------
+ */
+void clif_sitting(struct map_session_data *sd)
+{
+ unsigned char buf[64];
+
+ nullpo_retv(sd);
+
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFB(buf,26) = 2;
+ clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len)
+{
+ unsigned char *buf;
+
+ nullpo_retr(0, sd);
+
+ buf = (unsigned char*)aCalloc(len + 8, sizeof(unsigned char));
+
+ WBUFW(buf, 0) = 0x17f;
+ WBUFW(buf, 2) = len + 8;
+ memcpy(WBUFP(buf,4), mes, len + 4);
+
+ clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
+
+ if(buf) free(buf);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+
+int clif_GM_kickack(struct map_session_data *sd, int id)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd = sd->fd;
+ WFIFOW(fd,0) = 0xcd;
+ WFIFOL(fd,2) = id;
+ WFIFOSET(fd, packet_len_table[0xcd]);
+ return 0;
+}
+
+void clif_parse_QuitGame(int fd,struct map_session_data *sd);
+
+int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type)
+{
+ nullpo_retr(0, tsd);
+
+ if(type)
+ clif_GM_kickack(sd,tsd->status.account_id);
+ tsd->opt1 = tsd->opt2 = 0;
+ WFIFOW(tsd->fd,0) = 0x18b;
+ WFIFOW(tsd->fd,2) = 0;
+ WFIFOSET(tsd->fd,packet_len_table[0x18b]);
+ clif_setwaitclose(tsd->fd);
+
+ return 0;
+}
+/*==========================================
+ * Wis‹‘”Û‹–‰Â‰ž“š
+ *------------------------------------------
+ */
+int clif_wisexin(struct map_session_data *sd,int type,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xd1;
+ WFIFOB(fd,2)=type;
+ WFIFOB(fd,3)=flag;
+ WFIFOSET(fd,packet_len_table[0xd1]);
+
+ return 0;
+}
+/*==========================================
+ * Wis‘S‹‘”Û‹–‰Â‰ž“š
+ *------------------------------------------
+ */
+int clif_wisall(struct map_session_data *sd,int type,int flag)
+{
+ int fd;
+
+ nullpo_retr(0, sd);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0xd2;
+ WFIFOB(fd,2)=type;
+ WFIFOB(fd,3)=flag;
+ WFIFOSET(fd,packet_len_table[0xd2]);
+
+ return 0;
+}
+/*==========================================
+ * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type)
+{
+ int fd;
+
+ nullpo_retv(sd);
+ nullpo_retv(bl);
+
+ fd=sd->fd;
+ WFIFOW(fd,0)=0x1d3;
+ memcpy(WFIFOP(fd,2),name,24);
+ WFIFOB(fd,26)=type;
+ WFIFOL(fd,27)=0;
+ WFIFOL(fd,31)=bl->id;
+ WFIFOSET(fd,packet_len_table[0x1d3]);
+
+ return;
+}
+// displaying special effects (npcs, weather, etc) [Valaris]
+int clif_specialeffect(struct block_list *bl, int type, int flag) {
+ unsigned char buf[24];
+
+ nullpo_retr(0, bl);
+
+ memset(buf, 0, packet_len_table[0x1f3]);
+
+ WBUFW(buf,0) = 0x1f3;
+ WBUFL(buf,2) = bl->id;
+ WBUFL(buf,6) = type;
+
+ if (flag == 2) {
+ struct map_session_data *sd;
+ int i;
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m)
+ clif_specialeffect(&sd->bl, type, 1);
+ }
+ }
+
+ else if (flag == 1)
+ clif_send(buf, packet_len_table[0x1f3], bl, SELF);
+ else if (!flag)
+ clif_send(buf, packet_len_table[0x1f3], bl, AREA);
+
+ return 0;
+
+}
+// ------------
+// clif_parse_*
+// ------------
+// ƒpƒPƒbƒg“Ç‚ÝŽæ‚Á‚ÄFX‘€ì
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_WantToConnection(int fd, struct map_session_data *sd)
+{
+ struct map_session_data *old_sd;
+ int account_id; // account_id in the packet 0x72 or 0x7E
+
+ if (sd) {
+ if (battle_config.error_log)
+ printf("clif_parse_WantToConnection : invalid request?\n");
+ return;
+ }
+
+ // 0x72
+ if (RFIFOW(fd,0) == 0x72) {
+ //printf("Received bytes %d with packet 0x72.\n", RFIFOREST(fd));
+ if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,12);
+ else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,5);
+ else // old packet version
+ account_id = RFIFOL(fd,2);
+ // 0x7E
+ } else if (RFIFOW(fd,0) == 0x7E) {
+ //printf("Received bytes %d with packet 0x7E.\n", RFIFOREST(fd));
+ if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,9);
+ else
+ account_id = RFIFOL(fd,12);
+ // 0xF5
+ } else {
+ //printf("Received bytes %d with packet 0xF5.\n", RFIFOREST(fd));
+ if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,7);
+ else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,12);
+ else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
+ account_id = RFIFOL(fd,10);
+ else // 29 28 28
+ account_id = RFIFOL(fd,5);
+ }
+
+ // if same account already connected, we disconnect the 2 sessions
+ if ((old_sd = map_id2sd(account_id)) != NULL) {
+ clif_authfail_fd(fd, 2); // same id
+ clif_authfail_fd(old_sd->fd, 2); // same id
+ } else {
+ sd = session[fd]->session_data = (struct map_session_data*)aCalloc(1, sizeof(struct map_session_data));
+ sd->fd = fd;
+
+ // 0x72
+ if (RFIFOW(fd,0) == 0x72) {
+ if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,22), RFIFOL(fd,30), RFIFOL(fd,34), RFIFOB(fd,38), fd);
+ } else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 6; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,9), RFIFOL(fd,13), RFIFOL(fd,17), RFIFOB(fd,21), fd);
+ } else { // old packet version
+ sd->packet_ver = 5; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18), fd);
+ }
+ // 0x7E
+ } else if (RFIFOW(fd,0) == 0x7E) {
+ if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,21), RFIFOL(fd,28), RFIFOL(fd,32), RFIFOB(fd,36), fd);
+ } else {
+ sd->packet_ver = 8; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
+ }
+ // 0xF5
+ } else {
+ if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,15), RFIFOL(fd,25), RFIFOL(fd,29), RFIFOB(fd,33), fd);
+ } else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 12; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,18), RFIFOL(fd,24), RFIFOL(fd,28), RFIFOB(fd,32), fd);
+ } else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) { // 00 = Female, 01 = Male
+ sd->packet_ver = 11; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,17), RFIFOL(fd,23), RFIFOL(fd,27), RFIFOB(fd,31), fd);
+ } else { // 29
+ sd->packet_ver = 13; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ pc_setnewpc(sd, account_id, RFIFOL(fd,14), RFIFOL(fd,20), RFIFOL(fd,24), RFIFOB(fd,28), fd);
+ }
+ }
+
+ WFIFOL(fd,0) = sd->bl.id;
+ WFIFOSET(fd,4);
+
+ map_addiddb(&sd->bl);
+
+ chrif_authreq(sd);
+ }
+
+ return;
+}
+
+/*==========================================
+ * 007d ƒNƒ‰ƒCƒAƒ“ƒg‘¤ƒ}ƒbƒv“Ç‚Ýž‚ÝŠ®—¹
+ * mapN“üŽž‚É•K—v‚ȃf[ƒ^‚ð‘S‚Ä‘—‚è‚‚¯‚é
+ *------------------------------------------
+ */
+void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
+{
+// struct item_data* item;
+ int i;
+ nullpo_retv(sd);
+
+ if(sd->bl.prev != NULL)
+ return;
+
+ // Ú‘±okŽž
+ //clif_authok();
+ if(sd->npc_id) npc_event_dequeue(sd);
+ clif_skillinfoblock(sd);
+ pc_checkitem(sd);
+ //guild_info();
+
+ // loadendackŽž
+ // next exp
+ clif_updatestatus(sd,SP_NEXTBASEEXP);
+ clif_updatestatus(sd,SP_NEXTJOBEXP);
+ // skill point
+ clif_updatestatus(sd,SP_SKILLPOINT);
+ // item
+ clif_itemlist(sd);
+ clif_equiplist(sd);
+ // cart
+ if(pc_iscarton(sd)){
+ clif_cart_itemlist(sd);
+ clif_cart_equiplist(sd);
+ clif_updatestatus(sd,SP_CARTINFO);
+ }
+ // param all
+ clif_initialstatus(sd);
+ // party
+ party_send_movemap(sd);
+ // guild
+ guild_send_memberinfoshort(sd,1);
+ // 119
+ // 78
+
+ if(battle_config.pc_invincible_time > 0) {
+ if(map[sd->bl.m].flag.gvg)
+ pc_setinvincibletimer(sd,battle_config.pc_invincible_time<<1);
+ else
+ pc_setinvincibletimer(sd,battle_config.pc_invincible_time);
+ }
+
+ map_addblock(&sd->bl); // ƒuƒƒbƒN“o˜^
+ clif_spawnpc(sd); // spawn
+
+ // weight max , now
+ clif_updatestatus(sd,SP_MAXWEIGHT);
+ clif_updatestatus(sd,SP_WEIGHT);
+
+ // pvp
+ if(sd->pvp_timer!=-1 && !battle_config.pk_mode)
+ delete_timer(sd->pvp_timer,pc_calc_pvprank_timer);
+ if(map[sd->bl.m].flag.pvp){
+ if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris]
+ sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,sd->bl.id,0);
+ sd->pvp_rank=0;
+ sd->pvp_lastusers=0;
+ sd->pvp_point=5;
+ }
+ clif_set0199(sd->fd,1);
+ } else {
+ sd->pvp_timer=-1;
+ }
+ if(map[sd->bl.m].flag.gvg) {
+ clif_set0199(sd->fd,3);
+ }
+
+ // pet
+ if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
+ map_addblock(&sd->pd->bl);
+ clif_spawnpet(sd->pd);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,0x14);
+ clif_send_petstatus(sd);
+ }
+
+ if(sd->state.connect_new) {
+ sd->state.connect_new = 0;
+ if(sd->status.class != sd->view_class)
+ clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
+ if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 900)
+ clif_pet_emotion(sd->pd,(sd->pd->class - 100)*100 + 50 + pet_hungry_val(sd));
+
+/* Stop players from spawning inside castles [Valaris] */
+
+ {
+ struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
+ if (gc)
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,2);
+ }
+
+/* End Addition [Valaris] */
+
+ }
+
+ // view equipment item
+#if PACKETVER < 4
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+#else
+ clif_changelook(&sd->bl,LOOK_WEAPON,0);
+#endif
+ if(battle_config.save_clothcolor==1 && sd->status.clothes_color > 0)
+ clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
+
+ if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
+ (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
+ // ƒI[ƒgƒo[ƒT[ƒN”­“®
+ skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
+
+// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600))
+// skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0);
+
+ if(battle_config.muting_players && sd->status.manner < 0)
+ skill_status_change_start(&sd->bl,SC_NOCHAT,0,0,0,0,0,0);
+
+ // option
+ clif_changeoption(&sd->bl);
+ if(sd->sc_data[SC_TRICKDEAD].timer != -1)
+ skill_status_change_end(&sd->bl,SC_TRICKDEAD,-1);
+ if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
+ skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
+ if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1)
+ skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && sd->status.inventory[i].attribute==1)
+ skill_status_change_start(&sd->bl,SC_BROKNWEAPON,0,0,0,0,0,0);
+ if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && sd->status.inventory[i].attribute==1)
+ skill_status_change_start(&sd->bl,SC_BROKNARMOR,0,0,0,0,0,0);
+ }
+
+ map_foreachinarea(clif_getareachar,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_TickSend(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ sd->client_tick = RFIFOL(fd,6);
+ break;
+ case 9:
+ sd->client_tick = RFIFOL(fd,9);
+ break;
+ case 10:
+ sd->client_tick = RFIFOL(fd,7);
+ break;
+ case 11:
+ sd->client_tick = RFIFOL(fd,10);
+ break;
+ case 12:
+ sd->client_tick = RFIFOL(fd,6);
+ break;
+ case 13:
+ sd->client_tick = RFIFOL(fd,5);
+ break;
+ default: // old version by default (and version 6 + 7)
+ sd->client_tick = RFIFOL(fd,2);
+ break;
+ }
+ sd->server_tick = gettick();
+ clif_servertick(sd);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_WalkToXY(int fd, struct map_session_data *sd) {
+ int x, y;
+
+ nullpo_retv(sd);
+
+ if (pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl, 1);
+ return;
+ }
+
+ if (sd->npc_id != 0 || sd->vender_id != 0)
+ return;
+
+ if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0) // ƒtƒŠ[ƒLƒƒƒXƒg
+ return;
+
+ if (sd->chatID)
+ return;
+
+ if (sd->canmove_tick > gettick())
+ return;
+
+ // ƒXƒe[ƒ^ƒXˆÙí‚âƒnƒCƒfƒBƒ“ƒO’†(ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu–³)‚Å“®‚¯‚È‚¢
+ if ((sd->opt1 > 0 && sd->opt1 != 6) ||
+ sd->sc_data[SC_ANKLE].timer !=-1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
+ sd->sc_data[SC_AUTOCOUNTER].timer !=-1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
+ sd->sc_data[SC_TRICKDEAD].timer !=-1 || //Ž€‚ñ‚¾‚Ó‚è
+ sd->sc_data[SC_BLADESTOP].timer !=-1 || //”’nŽæ‚è
+ sd->sc_data[SC_SPIDERWEB].timer !=-1 || //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
+ (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4)) //‡‘tƒXƒLƒ‹‰‰‘t’†‚Í“®‚¯‚È‚¢
+ return;
+ if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0)
+ return;
+
+ if (sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+
+ pc_stopattack(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 6:
+ x = RFIFOB(fd,5) * 4 + (RFIFOB(fd,6) >> 6);
+ y = ((RFIFOB(fd,6) & 0x3f) << 4) + (RFIFOB(fd,7) >> 4);
+ break;
+ case 7:
+ x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
+ y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
+ break;
+ case 8:
+ x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
+ y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
+ break;
+ case 9:
+ x = RFIFOB(fd,12) * 4 + (RFIFOB(fd,13) >> 6);
+ y = ((RFIFOB(fd,13) & 0x3f) << 4) + (RFIFOB(fd,14) >> 4);
+ break;
+ case 10:
+ x = RFIFOB(fd,6) * 4 + (RFIFOB(fd,7) >> 6);
+ y = ((RFIFOB(fd,7) & 0x3f) << 4) + (RFIFOB(fd,8) >> 4);
+ break;
+ case 11:
+ x = RFIFOB(fd,11) * 4 + (RFIFOB(fd,12) >> 6);
+ y = ((RFIFOB(fd,12) & 0x3f) << 4) + (RFIFOB(fd,13) >> 4);
+ break;
+ case 12:
+ x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
+ y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
+ break;
+ case 13:
+ x = RFIFOB(fd,3) * 4 + (RFIFOB(fd,4) >> 6);
+ y = ((RFIFOB(fd,4) & 0x3f) << 4) + (RFIFOB(fd,5) >> 4);
+ break;
+ default: // old version by default
+ x = RFIFOB(fd,2) * 4 + (RFIFOB(fd,3) >> 6);
+ y = ((RFIFOB(fd,3) & 0x3f) << 4) + (RFIFOB(fd,4) >> 4);
+ break;
+ }
+ pc_walktoxy(sd, x, y);
+
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_QuitGame(int fd, struct map_session_data *sd) {
+ unsigned int tick=gettick();
+ struct skill_unit_group* sg;
+
+ nullpo_retv(sd);
+
+ WFIFOW(fd,0) = 0x18b;
+ if ((!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) ||
+ sd->skilltimer != -1 ||
+ (DIFF_TICK(tick, sd->canact_tick) < 0) ||
+ (sd->sc_data && sd->sc_data[SC_DANCING].timer!=-1 && sd->sc_data[SC_DANCING].val4 && (sg=(struct skill_unit_group *)sd->sc_data[SC_DANCING].val2) && sg->src_id == sd->bl.id)) {
+ WFIFOW(fd,2)=1;
+ WFIFOSET(fd,packet_len_table[0x18b]);
+ return;
+ }
+
+ /* Rovert's prevent logout option fixed [Valaris] */
+ if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
+ clif_setwaitclose(fd);
+ WFIFOW(fd,2)=0;
+ } else {
+ WFIFOW(fd,2)=1;
+ }
+ WFIFOSET(fd,packet_len_table[0x18b]);
+
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) {
+ struct block_list *bl;
+ int account_id;
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ account_id = RFIFOL(fd,11);
+ break;
+ case 9:
+ account_id = RFIFOL(fd,8);
+ break;
+ case 10:
+ account_id = RFIFOL(fd,10);
+ break;
+ case 11:
+ account_id = RFIFOL(fd,6);
+ break;
+ case 12:
+ account_id = RFIFOL(fd,11);
+ break;
+ case 13:
+ account_id = RFIFOL(fd,6);
+ break;
+ default: // old version by default (+ packet version 6 and 7)
+ account_id = RFIFOL(fd,2);
+ break;
+ }
+ bl = map_id2bl(account_id);
+ if (bl == NULL)
+ return;
+
+ WFIFOW(fd,0) = 0x95;
+ WFIFOL(fd,2) = account_id;
+
+ switch(bl->type) {
+ case BL_PC:
+ {
+ struct map_session_data *ssd = (struct map_session_data *)bl;
+ struct party *p = NULL;
+ struct guild *g = NULL;
+
+ nullpo_retv(ssd);
+
+ memcpy(WFIFOP(fd,6), ssd->status.name, 24);
+ if (ssd->status.guild_id > 0 && (g = guild_search(ssd->status.guild_id)) != NULL &&
+ (ssd->status.party_id == 0 || (p = party_search(ssd->status.party_id)) != NULL)) {
+ // ƒMƒ‹ƒhŠ‘®‚È‚çƒpƒPƒbƒg0195‚ð•Ô‚·
+ int i, ps = -1;
+ for(i = 0; i < g->max_member; i++) {
+ if (g->member[i].account_id == ssd->status.account_id &&
+ g->member[i].char_id == ssd->status.char_id )
+ ps = g->member[i].position;
+ }
+ if (ps >= 0 && ps < MAX_GUILDPOSITION) {
+ WFIFOW(fd, 0) = 0x195;
+ if (p)
+ memcpy(WFIFOP(fd,30), p->name, 24);
+ else
+ WFIFOB(fd,30) = 0;
+ memcpy(WFIFOP(fd,54), g->name,24);
+ memcpy(WFIFOP(fd,78), g->position[ps].name, 24);
+ WFIFOSET(fd,packet_len_table[0x195]);
+ break;
+ }
+ }
+ WFIFOSET(fd,packet_len_table[0x95]);
+ }
+ break;
+ case BL_PET:
+ memcpy(WFIFOP(fd,6), ((struct pet_data*)bl)->name, 24);
+ WFIFOSET(fd,packet_len_table[0x95]);
+ break;
+ case BL_NPC:
+ memcpy(WFIFOP(fd,6), ((struct npc_data*)bl)->name, 24);
+ WFIFOSET(fd,packet_len_table[0x95]);
+ break;
+ case BL_MOB:
+ {
+ struct mob_data *md = (struct mob_data *)bl;
+
+ nullpo_retv(md);
+
+ memcpy(WFIFOP(fd,6), md->name, 24);
+ if (md->class >= 1285 && md->class <= 1288 && md->guild_id) {
+ struct guild *g;
+ struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name);
+ if (gc && gc->guild_id > 0 && (g = guild_search(gc->guild_id)) != NULL) {
+ WFIFOW(fd, 0) = 0x195;
+ WFIFOB(fd,30) = 0;
+ memcpy(WFIFOP(fd,54), g->name, 24);
+ memcpy(WFIFOP(fd,78), gc->castle_name, 24);
+ WFIFOSET(fd,packet_len_table[0x195]);
+ } else {
+ WFIFOSET(fd,packet_len_table[0x95]);
+ }
+ } else if (battle_config.show_mob_hp == 1) {
+ char mobhp[50];
+ sprintf(mobhp, "hp: %d/%d", md->hp, mob_db[md->class].max_hp);
+ WFIFOW(fd, 0) = 0x195;
+ memcpy(WFIFOP(fd,30), mobhp, 24);
+ WFIFOB(fd,54) = 0;
+ WFIFOB(fd,78) = 0;
+ WFIFOSET(fd,packet_len_table[0x195]);
+ } else {
+ WFIFOSET(fd,packet_len_table[0x95]);
+ }
+ }
+ break;
+ default:
+ if (battle_config.error_log)
+ printf("clif_parse_GetCharNameRequest : bad type %d(%d)\n", bl->type, account_id);
+ break;
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <len>.w <str>.?B
+ char *message;
+ char *buf;
+
+ nullpo_retv(sd);
+
+ if ((is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) ||
+ (sd->sc_data &&
+ (sd->sc_data[SC_BERSERK].timer != -1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
+ sd->sc_data[SC_NOCHAT].timer != -1 ))) //ƒ`ƒƒƒbƒg‹ÖŽ~
+ return;
+
+ message = (char*)aCalloc(RFIFOW(fd,2) + 128, sizeof(char));
+ buf = (char*)aCalloc(RFIFOW(fd,2) + 4, sizeof(char));
+
+ //printf("clif_parse_GlobalMessage: message: '%s'.\n", RFIFOP(fd,4));
+ if (strncmp(RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) {
+ printf("Hack on global message: character '%s' (account: %d), use an other name to send a (normal) message.\n", sd->status.name, sd->status.account_id);
+
+ // information is sended to all online GM
+ sprintf(message, "Hack on global message (normal message): character '%s' (account: %d) uses an other name.", sd->status.name, sd->status.account_id);
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message, strlen(message) + 1);
+ if (strlen(RFIFOP(fd,4)) == 0)
+ strcpy(message, " This player sends a void name and a void message.");
+ else
+ sprintf(message, " This player sends (name:message): '%s'.", RFIFOP(fd,4));
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, message, strlen(message) + 1);
+ // message about the ban
+ if (battle_config.ban_spoof_namer > 0)
+ sprintf(message, " This player has been banned for %d minute(s).", battle_config.ban_spoof_namer);
+ else
+ sprintf(message, " 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, strlen(message) + 1);
+
+ // if we ban people
+ if (battle_config.ban_spoof_namer > 0) {
+ chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_spoof_namer, 0); // type: 2 - ban (year, month, day, hour, minute, second)
+ clif_setwaitclose(fd); // forced to disconnect because of the hack
+ }
+ // but for the hacker, we display on his screen (he see/look no difference).
+ } else {
+ // send message to others
+ WBUFW(buf,0) = 0x8d;
+ WBUFW(buf,2) = RFIFOW(fd,2) + 4; // len of message - 4 + 8
+ WBUFL(buf,4) = sd->bl.id;
+ memcpy(WBUFP(buf,8), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
+ clif_send(buf, WBUFW(buf,2), &sd->bl, sd->chatID ? CHAT_WOS : AREA_CHAT_WOC);
+ }
+
+ // send back message to the speaker
+ memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,2));
+ WFIFOW(fd,0) = 0x8e;
+ WFIFOSET(fd, WFIFOW(fd,2));
+
+ if(message) free(message);
+ if(buf) free(buf);
+
+ return;
+}
+
+int clif_message(struct block_list *bl, char* msg)
+{
+ unsigned short msg_len = strlen(msg) + 1;
+ unsigned char buf[256];
+
+ nullpo_retr(0, bl);
+
+ WBUFW(buf, 0) = 0x8d;
+ WBUFW(buf, 2) = msg_len + 8;
+ WBUFL(buf, 4) = bl->id;
+ memcpy(WBUFP(buf, 8), msg, msg_len);
+
+ clif_send(buf, WBUFW(buf,2), bl, AREA);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_MapMove(int fd, struct map_session_data *sd) {
+// /m /mapmove (as @rura GM command)
+ char output[100];
+ char map_name[17];
+
+ nullpo_retv(sd);
+
+ memset(output, '\0', sizeof(output));
+ memset(map_name, '\0', sizeof(map_name));
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) {
+ memcpy(map_name, RFIFOP(fd,2), 16);
+ sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20));
+ atcommand_rura(fd, sd, "@rura", output);
+ }
+
+ return;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ChangeDir(int fd, struct map_session_data *sd) {
+ unsigned char buf[64];
+ short headdir, dir;
+
+ nullpo_retv(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 7:
+ headdir = RFIFOW(fd,5);
+ dir = RFIFOB(fd,12);
+ break;
+ case 8:
+ headdir = RFIFOW(fd,5);
+ dir = RFIFOB(fd,12);
+ break;
+ case 9:
+ headdir = RFIFOW(fd,7);
+ dir = RFIFOB(fd,11);
+ break;
+ case 10:
+ headdir = RFIFOW(fd,4);
+ dir = RFIFOB(fd,9);
+ break;
+ case 11:
+ headdir = RFIFOW(fd,8);
+ dir = RFIFOB(fd,17);
+ break;
+ case 12:
+ headdir = RFIFOW(fd,5);
+ dir = RFIFOB(fd,12);
+ break;
+ case 13:
+ headdir = RFIFOW(fd,6);
+ dir = RFIFOB(fd,14);
+ break;
+ default: // old version by default (and packet version 6)
+ headdir = RFIFOW(fd,2);
+ dir = RFIFOB(fd,4);
+ break;
+ }
+
+ pc_setdir(sd, dir, headdir);
+
+ WBUFW(buf,0) = 0x9c;
+ WBUFL(buf,2) = sd->bl.id;
+ WBUFW(buf,6) = headdir;
+ WBUFB(buf,8) = dir;
+ if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris]
+ clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA);
+ else
+ clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA_WOS);
+
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_Emotion(int fd, struct map_session_data *sd) {
+ unsigned char buf[64];
+
+ nullpo_retv(sd);
+
+ if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 2) {
+ WBUFW(buf,0) = 0xc0;
+ WBUFL(buf,2) = sd->bl.id;
+ WBUFB(buf,6) = RFIFOB(fd,2);
+ clif_send(buf, packet_len_table[0xc0], &sd->bl, AREA);
+ } else
+ clif_skill_fail(sd, 1, 0, 1);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) {
+ WFIFOW(fd,0) = 0xc2;
+ WFIFOL(fd,2) = map_getusers();
+ WFIFOSET(fd,packet_len_table[0xc2]);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ActionRequest(int fd, struct map_session_data *sd) {
+ unsigned int tick;
+ unsigned char buf[64];
+ int action_type, target_id;
+
+ nullpo_retv(sd);
+
+ if (pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl, 1);
+ return;
+ }
+ if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 ||
+ (sd->sc_data &&
+ (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
+ sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
+ sd->sc_data[SC_DANCING].timer != -1))) //ƒ_ƒ“ƒX’†
+ return;
+
+ tick = gettick();
+
+ pc_stop_walking(sd, 0);
+ pc_stopattack(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ target_id = RFIFOL(fd,3);
+ action_type = RFIFOB(fd,8);
+ break;
+ case 9:
+ target_id = RFIFOL(fd,7);
+ action_type = RFIFOB(fd,17);
+ break;
+ case 10:
+ target_id = RFIFOL(fd,9);
+ action_type = RFIFOB(fd,22);
+ break;
+ case 11:
+ target_id = RFIFOL(fd,3);
+ action_type = RFIFOB(fd,8);
+ break;
+ case 12:
+ target_id = RFIFOL(fd,3);
+ action_type = RFIFOB(fd,8);
+ break;
+ case 13:
+ target_id = RFIFOL(fd,4);
+ action_type = RFIFOB(fd,14);
+ break;
+ default: // old version by default (and packet version 6 and 7)
+ target_id = RFIFOL(fd,2);
+ action_type = RFIFOB(fd,6);
+ break;
+ }
+
+ switch(action_type) {
+ case 0x00: // once attack
+ case 0x07: // continuous attack
+ if(sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class==22)
+ return;
+ if (sd->vender_id != 0)
+ return;
+ if (!battle_config.sdelay_attack_enable && pc_checkskill(sd, SA_FREECAST) <= 0) {
+ if (DIFF_TICK(tick, sd->canact_tick) < 0) {
+ clif_skill_fail(sd, 1, 4, 0);
+ return;
+ }
+ }
+ if (sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+ if (sd->attacktarget > 0) // [Valaris]
+ sd->attacktarget = 0;
+ pc_attack(sd, target_id, action_type != 0);
+ break;
+ case 0x02: // sitdown
+ if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_BASIC) >= 3) {
+ pc_stop_walking(sd, 1);
+ skill_gangsterparadise(sd, 1); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒXÝ’è
+ pc_setsit(sd);
+ clif_sitting(sd);
+ } else
+ clif_skill_fail(sd, 1, 0, 2);
+ break;
+ case 0x03: // standup
+ skill_gangsterparadise(sd, 0); // ƒMƒƒƒ“ƒOƒXƒ^[ƒpƒ‰ƒ_ƒCƒX‰ðœ
+ pc_setstand(sd);
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = sd->bl.id;
+ WBUFB(buf,26) = 3;
+ clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA);
+ break;
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_Restart(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ switch(RFIFOB(fd,2)) {
+ case 0x00:
+ if (pc_isdead(sd)) {
+ pc_setstand(sd);
+ pc_setrestartvalue(sd, 3);
+ pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 2);
+ }
+ break;
+ case 0x01:
+ if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND))))
+ return;
+
+ /* Rovert's Prevent logout option - Fixed [Valaris] */
+ if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) {
+ chrif_charselectreq(sd);
+ } else {
+ WFIFOW(fd,0)=0x18b;
+ WFIFOW(fd,2)=1;
+
+ WFIFOSET(fd,packet_len_table[0x018b]);
+ }
+ break;
+ }
+}
+
+/*==========================================
+ * Transmission of a wisp (S 0096 <len>.w <nick>.24B <message>.?B)
+ *------------------------------------------
+ */
+void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <nick>.24B <message>.?B // rewritten by [Yor]
+ char *gm_command;
+ struct map_session_data *dstsd;
+ int i;
+
+ //printf("clif_parse_Wis: message: '%s'.\n", RFIFOP(fd,28));
+
+ gm_command = (char*)aCalloc(strlen(RFIFOP(fd,28)) + 28, sizeof(char)); // 24+3+(RFIFOW(fd,2)-28)+1 or 24+3+(strlen(RFIFOP(fd,28))+1 (size can be wrong with hacker)
+
+ sprintf(gm_command, "%s : %s", sd->status.name, RFIFOP(fd,28));
+ if ((is_atcommand(fd, sd, gm_command, 0) != AtCommand_None) ||
+ (sd && sd->sc_data &&
+ (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
+ sd->sc_data[SC_NOCHAT].timer != -1))) //ƒ`ƒƒƒbƒg‹ÖŽ~
+ {
+ if(gm_command) free(gm_command);
+ return;
+ }
+
+ if(gm_command) free(gm_command);
+
+ // searching destination character
+ dstsd = map_nick2sd(RFIFOP(fd,4));
+ // player is not on this map-server
+ if (dstsd == NULL ||
+ // At this point, don't send wisp/page if it's not exactly the same name, because (example)
+ // if there are 'Test' player on an other map-server and 'test' player on this map-server,
+ // and if we ask for 'Test', we must not contact 'test' player
+ // so, we send information to inter-server, which is the only one which decide (and copy correct name).
+ strcmp(dstsd->status.name, RFIFOP(fd,4)) != 0) // not exactly same name
+ // send message to inter-server
+ intif_wis_message(sd, RFIFOP(fd,4), RFIFOP(fd,28), RFIFOW(fd,2)-28);
+ // player is on this map-server
+ else {
+ // if you send to your self, don't send anything to others
+ if (dstsd->fd == fd) // but, normaly, it's impossible!
+ clif_wis_message(fd, wisp_server_name, "You can not page yourself. Sorry.", strlen("You can not page yourself. Sorry.") + 1);
+ // otherwise, send message and answer immediatly
+ else {
+ if (dstsd->ignoreAll == 1)
+ clif_wis_end(fd, 2); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ else {
+ // if player ignore the source character
+ for(i = 0; i < MAX_IGNORE_LIST; i++)
+ if (strcmp(dstsd->ignore[i].name, sd->status.name) == 0) {
+ clif_wis_end(fd, 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ break;
+ }
+ // if source player not found in ignore list
+ if (i == MAX_IGNORE_LIST) {
+ clif_wis_message(dstsd->fd, sd->status.name, RFIFOP(fd,28), RFIFOW(fd,2) - 28);
+ clif_wis_end(fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ }
+ }
+ }
+ }
+
+ return;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_GMmessage(int fd, struct map_session_data *sd) {
+// /b
+ nullpo_retv(sd);
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_Broadcast)))
+ intif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2)-4, 0);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_TakeItem(int fd, struct map_session_data *sd) {
+ struct flooritem_data *fitem;
+ int map_object_id;
+
+ nullpo_retv(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 7:
+ map_object_id = RFIFOL(fd,6);
+ break;
+ case 8:
+ map_object_id = RFIFOL(fd,6);
+ break;
+ case 9:
+ map_object_id = RFIFOL(fd,9);
+ break;
+ case 10:
+ map_object_id = RFIFOL(fd,7);
+ break;
+ case 11:
+ map_object_id = RFIFOL(fd,10);
+ break;
+ case 12:
+ map_object_id = RFIFOL(fd,6);
+ break;
+ case 13:
+ map_object_id = RFIFOL(fd,5);
+ break;
+ default: // old version by default (and packet version 6)
+ map_object_id = RFIFOL(fd,2);
+ break;
+ }
+ fitem = (struct flooritem_data*)map_id2bl(map_object_id);
+
+ if (pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl, 1);
+ return;
+ }
+
+ if( sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 ||
+ (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
+ sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
+ sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
+ sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
+ return;
+
+ if (fitem == NULL || fitem->bl.m != sd->bl.m)
+ return;
+
+ pc_takeitem(sd, fitem);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_DropItem(int fd, struct map_session_data *sd) {
+ int item_index, item_amount;
+
+ nullpo_retv(sd);
+
+ if (pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl, 1);
+ return;
+ }
+ if (sd->npc_id != 0 || sd->vender_id != 0 || sd->opt1 > 0 ||
+ (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
+ sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
+ sd->sc_data[SC_BERSERK].timer != -1)) ) //ƒo[ƒT[ƒN
+ return;
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ item_index = RFIFOW(fd,5) - 2;
+ item_amount = RFIFOW(fd,12);
+ break;
+ case 9:
+ item_index = RFIFOW(fd,8) - 2;
+ item_amount = RFIFOW(fd,15);
+ break;
+ case 10:
+ item_index = RFIFOW(fd,6) - 2;
+ item_amount = RFIFOW(fd,15);
+ break;
+ case 11:
+ item_index = RFIFOW(fd,12) - 2;
+ item_amount = RFIFOW(fd,17);
+ break;
+ case 12:
+ item_index = RFIFOW(fd,5) - 2;
+ item_amount = RFIFOW(fd,12);
+ break;
+ case 13:
+ item_index = RFIFOW(fd,6) - 2;
+ item_amount = RFIFOW(fd,10);
+ break;
+ default: // old version by default (+ packet version 6 and 7)
+ item_index = RFIFOW(fd,2) - 2;
+ item_amount = RFIFOW(fd,4);
+ break;
+ }
+
+ pc_dropitem(sd, item_index, item_amount);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_UseItem(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl, 1);
+ return;
+ }
+ if (sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0 ||
+ (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //Ž€‚ñ‚¾‚Ó‚è
+ sd->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
+ sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒN
+ sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //‰ï˜b‹ÖŽ~
+ return;
+
+ if (sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 6:
+ pc_useitem(sd,RFIFOW(fd,5)-2);
+ break;
+ case 7:
+ pc_useitem(sd,RFIFOW(fd,6)-2);
+ break;
+ case 8:
+ pc_useitem(sd,RFIFOW(fd,6)-2);
+ break;
+ case 9:
+ pc_useitem(sd,RFIFOW(fd,9)-2);
+ break;
+ case 10:
+ pc_useitem(sd,RFIFOW(fd,7)-2);
+ break;
+ case 11:
+ pc_useitem(sd,RFIFOW(fd,10)-2);
+ break;
+ case 12:
+ pc_useitem(sd,RFIFOW(fd,6)-2);
+ break;
+ case 13:
+ pc_useitem(sd,RFIFOW(fd,5)-2);
+ break;
+ default: // old version by default
+ pc_useitem(sd,RFIFOW(fd,2)-2);
+ break;
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_EquipItem(int fd,struct map_session_data *sd)
+{
+ int index;
+
+ nullpo_retv(sd);
+
+ if(pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl,1);
+ return;
+ }
+ index = RFIFOW(fd,2)-2;
+ if(sd->npc_id!=0 || sd->vender_id != 0) return;
+ if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 )) return;
+
+ if(sd->status.inventory[index].identify != 1) { // –¢ŠÓ’è
+ clif_equipitemack(sd,index,0,0); // fail
+ return;
+ }
+ //ƒyƒbƒg—p‘•”õ‚Å‚ ‚é‚©‚È‚¢‚©
+ if(sd->inventory_data[index]) {
+ if(sd->inventory_data[index]->type != 8){
+ if(sd->inventory_data[index]->type == 10)
+ RFIFOW(fd,4)=0x8000; // –î‚ð–³—‚â‚è‘•”õ‚Å‚«‚é‚悤‚Éi||G
+ pc_equipitem(sd,index,RFIFOW(fd,4));
+ } else
+ pet_equipitem(sd,index);
+ }
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_UnequipItem(int fd,struct map_session_data *sd)
+{
+ int index;
+
+ nullpo_retv(sd);
+
+ if(pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl,1);
+ return;
+ }
+ index = RFIFOW(fd,2)-2;
+ if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNWEAPON].timer!=-1)
+ skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
+ if(sd->status.inventory[index].attribute == 1 && sd->sc_data && sd->sc_data[SC_BROKNARMOR].timer!=-1)
+ skill_status_change_end(&sd->bl,SC_BROKNARMOR,-1);
+ if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 ))
+ return;
+
+ if(sd->npc_id!=0 || sd->vender_id != 0 || sd->opt1 > 0)
+ return;
+ pc_unequipitem(sd,index,0);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcClicked(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(pc_isdead(sd)) {
+ clif_clearchar_area(&sd->bl,1);
+ return;
+ }
+ if(sd->npc_id!=0 || sd->vender_id != 0)
+ return;
+ npc_click(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd)
+{
+ npc_buysellsel(sd,RFIFOL(fd,2),RFIFOB(fd,6));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd)
+{
+ int fail=0,n;
+ unsigned short *item_list;
+
+ n = (RFIFOW(fd,2)-4) /4;
+ item_list = (unsigned short*)RFIFOP(fd,4);
+
+ fail = npc_buylist(sd,n,item_list);
+
+ WFIFOW(fd,0)=0xca;
+ WFIFOB(fd,2)=fail;
+ WFIFOSET(fd,packet_len_table[0xca]);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd)
+{
+ int fail=0,n;
+ unsigned short *item_list;
+
+ n = (RFIFOW(fd,2)-4) /4;
+ item_list = (unsigned short*)RFIFOP(fd,4);
+
+ fail = npc_selllist(sd,n,item_list);
+
+ WFIFOW(fd,0)=0xcb;
+ WFIFOB(fd,2)=fail;
+ WFIFOSET(fd,packet_len_table[0xcb]);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd)
+{
+ if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 4){
+ chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15);
+ } else
+ clif_skill_fail(sd,1,0,3);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ChatAddMember(int fd,struct map_session_data *sd)
+{
+ chat_joinchat(sd,RFIFOL(fd,2),RFIFOP(fd,6));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd)
+{
+ chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd)
+{
+ chat_changechatowner(sd,RFIFOP(fd,6));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_KickFromChat(int fd,struct map_session_data *sd)
+{
+ chat_kickchat(sd,RFIFOP(fd,2));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_ChatLeave(int fd,struct map_session_data *sd)
+{
+ chat_leavechat(sd);
+}
+
+/*==========================================
+ * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
+ *------------------------------------------
+ */
+void clif_parse_TradeRequest(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 1){
+ trade_traderequest(sd,RFIFOL(sd->fd,2));
+ } else
+ clif_skill_fail(sd,1,0,0);
+}
+
+/*==========================================
+ * Žæˆø—v¿
+ *------------------------------------------
+ */
+void clif_parse_TradeAck(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ trade_tradeack(sd,RFIFOB(sd->fd,2));
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁ
+ *------------------------------------------
+ */
+void clif_parse_TradeAddItem(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ trade_tradeadditem(sd,RFIFOW(sd->fd,2),RFIFOL(sd->fd,4));
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
+ *------------------------------------------
+ */
+void clif_parse_TradeOk(int fd,struct map_session_data *sd)
+{
+ trade_tradeok(sd);
+}
+
+/*==========================================
+ * ŽæˆøƒLƒƒƒ“ƒZƒ‹
+ *------------------------------------------
+ */
+void clif_parse_TradeCansel(int fd,struct map_session_data *sd)
+{
+ trade_tradecancel(sd);
+}
+
+/*==========================================
+ * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
+ *------------------------------------------
+ */
+void clif_parse_TradeCommit(int fd,struct map_session_data *sd)
+{
+ trade_tradecommit(sd);
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_StopAttack(int fd,struct map_session_data *sd)
+{
+ pc_stopattack(sd);
+}
+
+/*==========================================
+ * ƒJ[ƒg‚ÖƒAƒCƒeƒ€‚ðˆÚ‚·
+ *------------------------------------------
+ */
+void clif_parse_PutItemToCart(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(sd->npc_id!=0 || sd->vender_id != 0)
+ return;
+ pc_putitemtocart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
+}
+/*==========================================
+ * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€‚ðo‚·
+ *------------------------------------------
+ */
+void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(sd->npc_id!=0 || sd->vender_id != 0) return;
+ pc_getitemfromcart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4));
+}
+
+/*==========================================
+ * •t‘®•i(‘é,ƒyƒR,ƒJ[ƒg)‚ð‚Í‚¸‚·
+ *------------------------------------------
+ */
+void clif_parse_RemoveOption(int fd,struct map_session_data *sd)
+{
+ if(pc_isriding(sd)) { // jobchange when removing peco [Valaris]
+ if(sd->status.class==13)
+ sd->status.class=sd->view_class=7;
+
+ if(sd->status.class==21)
+ sd->status.class=sd->view_class=14;
+
+ if(sd->status.class==4014)
+ sd->status.class=sd->view_class=4008;
+
+ if(sd->status.class==4022)
+ sd->status.class=sd->view_class=4015;
+ }
+
+ pc_setoption(sd,0);
+}
+
+/*==========================================
+ * ƒ`ƒFƒ“ƒWƒJ[ƒg
+ *------------------------------------------
+ */
+void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
+{
+ pc_setcart(sd,RFIFOW(fd,2));
+}
+
+/*==========================================
+ * ƒXƒe[ƒ^ƒXƒAƒbƒv
+ *------------------------------------------
+ */
+void clif_parse_StatusUp(int fd,struct map_session_data *sd)
+{
+ pc_statusup(sd,RFIFOW(fd,2));
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒŒƒxƒ‹ƒAƒbƒv
+ *------------------------------------------
+ */
+void clif_parse_SkillUp(int fd,struct map_session_data *sd)
+{
+ pc_skillup(sd,RFIFOW(fd,2));
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—piIDŽw’èj
+ *------------------------------------------
+ */
+void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
+ int skillnum, skilllv, lv, target_id;
+ unsigned int tick = gettick();
+
+ nullpo_retv(sd);
+
+ if (sd->chatID || sd->npc_id != 0 || sd->vender_id != 0)
+ return;
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 6:
+ skilllv = RFIFOW(fd,4);
+ skillnum = RFIFOW(fd,9);
+ target_id = RFIFOL(fd,11);
+ break;
+ case 7:
+ skilllv = RFIFOW(fd,7);
+ skillnum = RFIFOW(fd,9);
+ target_id = RFIFOL(fd,15);
+ break;
+ case 8:
+ skilllv = RFIFOW(fd,7);
+ skillnum = RFIFOW(fd,12);
+ target_id = RFIFOL(fd,16);
+ break;
+ case 9:
+ skilllv = RFIFOW(fd,11);
+ skillnum = RFIFOW(fd,18);
+ target_id = RFIFOL(fd,22);
+ break;
+ case 10:
+ skilllv = RFIFOW(fd,9);
+ skillnum = RFIFOW(fd,15);
+ target_id = RFIFOL(fd,18);
+ break;
+ case 11:
+ skilllv = RFIFOW(fd,4);
+ skillnum = RFIFOW(fd,7);
+ target_id = RFIFOL(fd,10);
+ break;
+ case 12:
+ skilllv = RFIFOW(fd,7);
+ skillnum = RFIFOW(fd,12);
+ target_id = RFIFOL(fd,16);
+ break;
+ case 13:
+ skilllv = RFIFOW(fd,4);
+ skillnum = RFIFOW(fd,10);
+ target_id = RFIFOL(fd,22);
+ break;
+ default: // old version by default
+ skilllv = RFIFOW(fd,2);
+ skillnum = RFIFOW(fd,4);
+ target_id = RFIFOL(fd,6);
+ break;
+ }
+
+ if (skillnotok(skillnum, sd))
+ return;
+
+ if (sd->skilltimer != -1) {
+ if (skillnum != SA_CASTCANCEL)
+ return;
+ } else if (DIFF_TICK(tick, sd->canact_tick) < 0) {
+ clif_skill_fail(sd, skillnum, 4, 0);
+ return;
+ }
+
+ if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
+ sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
+ sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
+ return;
+ if (sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+ if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
+ if (skilllv != sd->skillitemlv)
+ skilllv = sd->skillitemlv;
+ skill_use_id(sd, target_id, skillnum, skilllv);
+ } else {
+ sd->skillitem = sd->skillitemlv = -1;
+ if (skillnum == MO_EXTREMITYFIST) {
+ if ((sd->sc_data[SC_COMBO].timer == -1 || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_CHAINCRUSH))) {
+ if (!sd->state.skill_flag ) {
+ sd->state.skill_flag = 1;
+ clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
+ return;
+ } else if (sd->bl.id == target_id) {
+ clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1);
+ return;
+ }
+ }
+ }
+ if ((lv = pc_checkskill(sd, skillnum)) > 0) {
+ if (skilllv > lv)
+ skilllv = lv;
+ skill_use_id(sd, target_id, skillnum, skilllv);
+ if (sd->state.skill_flag)
+ sd->state.skill_flag = 0;
+ }
+ }
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—piꊎw’èj
+ *------------------------------------------
+ */
+void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) {
+ int skillnum, skilllv, lv, x, y;
+ unsigned int tick = gettick();
+ int skillmoreinfo;
+
+ nullpo_retv(sd);
+
+ if (sd->npc_id != 0 || sd->vender_id != 0) return;
+ if(sd->chatID) return;
+
+ skillmoreinfo = -1;
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 6:
+ skilllv = RFIFOW(fd,4);
+ skillnum = RFIFOW(fd,9);
+ x = RFIFOW(fd,11);
+ y = RFIFOW(fd,13);
+ if (RFIFOW(fd,0) == 0x190)
+ skillmoreinfo = 15;
+ break;
+ case 7:
+ skilllv = RFIFOW(fd,7);
+ skillnum = RFIFOW(fd,9);
+ x = RFIFOW(fd,15);
+ y = RFIFOW(fd,17);
+ if (RFIFOW(fd,0) == 0x190)
+ skillmoreinfo = 19;
+ break;
+ case 8:
+ skilllv = RFIFOW(fd,3);
+ skillnum = RFIFOW(fd,6);
+ x = RFIFOW(fd,17);
+ y = RFIFOW(fd,21);
+ if (RFIFOW(fd,0) == 0x0a2)
+ skillmoreinfo = 23;
+ break;
+ case 9:
+ skilllv = RFIFOW(fd,5);
+ skillnum = RFIFOW(fd,15);
+ x = RFIFOW(fd,29);
+ y = RFIFOW(fd,38);
+ if (RFIFOW(fd,0) == 0x0a2)
+ skillmoreinfo = 40;
+ break;
+ case 10:
+ skilllv = RFIFOW(fd,10);
+ skillnum = RFIFOW(fd,14);
+ x = RFIFOW(fd,18);
+ y = RFIFOW(fd,23);
+ if (RFIFOW(fd,0) == 0x08c)
+ skillmoreinfo = 25;
+ break;
+ case 11:
+ skilllv = RFIFOW(fd,6); // 16? to check.
+ skillnum = RFIFOW(fd,20);
+ x = RFIFOW(fd,23);
+ y = RFIFOW(fd,27);
+ if (RFIFOW(fd,0) == 0x08c)
+ skillmoreinfo = 29;
+ break;
+ case 12:
+ skilllv = RFIFOW(fd,3); // 2? to check.
+ skillnum = RFIFOW(fd,6);
+ x = RFIFOW(fd,17);
+ y = RFIFOW(fd,21);
+ if (RFIFOW(fd,0) == 0x08c)
+ skillmoreinfo = 23;
+ break;
+ case 13:
+ skilllv = RFIFOW(fd,6);
+ skillnum = RFIFOW(fd,9);
+ x = RFIFOW(fd,23);
+ y = RFIFOW(fd,26);
+ if (RFIFOW(fd,0) == 0x08c)
+ skillmoreinfo = 28;
+ break;
+ default: // old version by default
+ skilllv = RFIFOW(fd,2);
+ skillnum = RFIFOW(fd,4);
+ x = RFIFOW(fd,6);
+ y = RFIFOW(fd,8);
+ if (RFIFOW(fd,0) == 0x190)
+ skillmoreinfo = 10;
+ break;
+ }
+
+ if (skillnotok(skillnum, sd))
+ return;
+
+ if (skillmoreinfo != -1) {
+ if (pc_issit(sd)) {
+ clif_skill_fail(sd, skillnum, 0, 0);
+ return;
+ }
+ memcpy(talkie_mes, RFIFOP(fd,skillmoreinfo), 80);
+ }
+
+ if (sd->skilltimer != -1)
+ return;
+ else if (DIFF_TICK(tick, sd->canact_tick) < 0) {
+ clif_skill_fail(sd, skillnum, 4, 0);
+ return;
+ }
+
+ if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) ||
+ sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer != -1 ||
+ sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22)
+ return;
+ if (sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+ if (sd->skillitem >= 0 && sd->skillitem == skillnum) {
+ if (skilllv != sd->skillitemlv)
+ skilllv = sd->skillitemlv;
+ skill_use_pos(sd, x, y, skillnum, skilllv);
+ } else {
+ sd->skillitem = sd->skillitemlv = -1;
+ if ((lv = pc_checkskill(sd, skillnum)) > 0) {
+ if (skilllv > lv)
+ skilllv = lv;
+ skill_use_pos(sd, x, y, skillnum,skilllv);
+ }
+ }
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pimapŽw’èj
+ *------------------------------------------
+ */
+void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(sd->chatID) return;
+
+ if (sd->npc_id!=0 || sd->vender_id != 0 || (sd->sc_data &&
+ (sd->sc_data[SC_TRICKDEAD].timer != -1 ||
+ sd->sc_data[SC_BERSERK].timer!=-1 ||
+ sd->sc_data[SC_NOCHAT].timer!=-1 ||
+ sd->sc_data[SC_WEDDING].timer!=-1 ||
+ sd->view_class==22)))
+ return;
+
+ if(sd->invincible_timer != -1)
+ pc_delinvincibletimer(sd);
+
+ skill_castend_map(sd,RFIFOW(fd,2),RFIFOP(fd,4));
+}
+/*==========================================
+ * ƒƒ‚—v‹
+ *------------------------------------------
+ */
+void clif_parse_RequestMemo(int fd,struct map_session_data *sd)
+{
+ pc_memo(sd,-1);
+}
+/*==========================================
+ * ƒAƒCƒeƒ€‡¬
+ *------------------------------------------
+ */
+void clif_parse_ProduceMix(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ sd->state.produce_flag = 0;
+ skill_produce_mix(sd,RFIFOW(fd,2),RFIFOW(fd,4),RFIFOW(fd,6),RFIFOW(fd,8));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ sd->npc_menu=RFIFOB(fd,6);
+ npc_scriptcont(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd)
+{
+ npc_scriptcont(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+#define RFIFOL_(fd,pos) (*(int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
+ //Input Value overflow Exploit FIX
+ sd->npc_amount=RFIFOL_(fd,6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int)
+
+#undef RFIFOL_
+
+ npc_scriptcont(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcStringInput(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ if(RFIFOW(fd,2)-7 >= sizeof(sd->npc_str)){
+ printf("clif: input string too long !\n");
+ memcpy(sd->npc_str,RFIFOP(fd,8),sizeof(sd->npc_str));
+ sd->npc_str[sizeof(sd->npc_str)-1]=0;
+ } else
+ strcpy(sd->npc_str,RFIFOP(fd,8));
+ npc_scriptcont(sd,RFIFOL(fd,4));
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd)
+{
+ npc_scriptcont(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€ŠÓ’è
+ *------------------------------------------
+ */
+void clif_parse_ItemIdentify(int fd,struct map_session_data *sd)
+{
+ pc_item_identify(sd,RFIFOW(fd,2)-2);
+}
+/*==========================================
+ * –îì¬
+ *------------------------------------------
+ */
+void clif_parse_SelectArrow(int fd,struct map_session_data *sd)
+{
+ nullpo_retv(sd);
+
+ sd->state.make_arrow_flag = 0;
+ skill_arrow_create(sd,RFIFOW(fd,2));
+}
+/*==========================================
+ * ƒI[ƒgƒXƒyƒ‹ŽóM
+ *------------------------------------------
+ */
+void clif_parse_AutoSpell(int fd,struct map_session_data *sd)
+{
+ skill_autospell(sd,RFIFOW(fd,2));
+}
+/*==========================================
+ * ƒJ[ƒhŽg—p
+ *------------------------------------------
+ */
+void clif_parse_UseCard(int fd,struct map_session_data *sd)
+{
+ clif_use_card(sd,RFIFOW(fd,2)-2);
+}
+/*==========================================
+ * ƒJ[ƒh‘}“ü‘•”õ‘I‘ð
+ *------------------------------------------
+ */
+void clif_parse_InsertCard(int fd,struct map_session_data *sd)
+{
+ pc_insert_card(sd,RFIFOW(fd,2)-2,RFIFOW(fd,4)-2);
+}
+
+/*==========================================
+ * 0193 ƒLƒƒƒ‰ID–¼‘Oˆø‚«
+ *------------------------------------------
+ */
+void clif_parse_SolveCharName(int fd, struct map_session_data *sd) {
+ int char_id;
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ char_id = RFIFOL(fd,8);
+ break;
+ case 9:
+ char_id = RFIFOL(fd,7);
+ break;
+ case 10:
+ char_id = RFIFOL(fd,10);
+ break;
+ case 11:
+ char_id = RFIFOL(fd,6);
+ break;
+ case 12:
+ char_id = RFIFOL(fd,8);
+ break;
+ case 13:
+ char_id = RFIFOL(fd,12);
+ break;
+ default: // old version by default (+ packet version 6 and 7)
+ char_id = RFIFOL(fd,2);
+ break;
+ }
+ clif_solved_charname(sd, char_id);
+}
+
+/*==========================================
+ * 0197 /resetskill /resetstate
+ *------------------------------------------
+ */
+void clif_parse_ResetChar(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
+ switch(RFIFOW(fd,2)){
+ case 0:
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState))
+ pc_resetstate(sd);
+ break;
+ case 1:
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState))
+ pc_resetskill(sd);
+ break;
+ }
+ }
+}
+
+/*==========================================
+ * 019c /lb“™
+ *------------------------------------------
+ */
+void clif_parse_LGMmessage(int fd, struct map_session_data *sd) {
+ unsigned char buf[64];
+
+ nullpo_retv(sd);
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_LocalBroadcast))) {
+ WBUFW(buf,0) = 0x9a;
+ WBUFW(buf,2) = RFIFOW(fd,2);
+ memcpy(WBUFP(buf,4), RFIFOP(fd,4), RFIFOW(fd,2) - 4);
+ clif_send(buf, RFIFOW(fd,2), &sd->bl, ALL_SAMEMAP);
+ }
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
+ *------------------------------------------
+ */
+void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) {
+ int item_index, item_amount;
+
+ nullpo_retv(sd);
+
+ if (sd->npc_id != 0 || sd->vender_id != 0)
+ return;
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ item_index = RFIFOW(fd,5) - 2;
+ item_amount = RFIFOL(fd,12);
+ break;
+ case 9:
+ item_index = RFIFOW(fd,5) - 2;
+ item_amount = RFIFOL(fd,19);
+ break;
+ case 10:
+ item_index = RFIFOW(fd,3) - 2;
+ item_amount = RFIFOL(fd,15);
+ break;
+ case 11:
+ item_index = RFIFOW(fd,6) - 2;
+ item_amount = RFIFOL(fd,21);
+ break;
+ case 12:
+ item_index = RFIFOW(fd,5) - 2;
+ item_amount = RFIFOL(fd,12);
+ break;
+ case 13:
+ item_index = RFIFOW(fd,6) - 2;
+ item_amount = RFIFOL(fd,9);
+ break;
+ default: // old version by default (+ packet version 6 and 7)
+ item_index = RFIFOW(fd,2) - 2;
+ item_amount = RFIFOL(fd,4);
+ break;
+ }
+
+ if (item_index < 0 || item_index >= MAX_INVENTORY)
+ return;
+
+ if (sd->state.storage_flag)
+ storage_guild_storageadd(sd, item_index, item_amount);
+ else
+ storage_storageadd(sd, item_index, item_amount);
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
+ *------------------------------------------
+ */
+void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) {
+ int item_index, item_amount;
+
+ nullpo_retv(sd);
+
+ switch (sd->packet_ver) { // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ case 8:
+ item_index = RFIFOW(fd,10) - 1;
+ item_amount = RFIFOL(fd,22);
+ break;
+ case 9:
+ item_index = RFIFOW(fd,11) - 1;
+ item_amount = RFIFOL(fd,22);
+ break;
+ case 10:
+ item_index = RFIFOW(fd,3) - 1;
+ item_amount = RFIFOL(fd,13);
+ break;
+ case 11:
+ item_index = RFIFOW(fd,4) - 1;
+ item_amount = RFIFOL(fd,8);
+ break;
+ case 12:
+ item_index = RFIFOW(fd,10) - 1;
+ item_amount = RFIFOL(fd,22);
+ break;
+ case 13:
+ item_index = RFIFOW(fd,12) - 1;
+ item_amount = RFIFOL(fd,18);
+ break;
+ default: // old version by default (+ packet version 6 and 7)
+ item_index = RFIFOW(fd,2) - 1;
+ item_amount = RFIFOL(fd,4);
+ break;
+ }
+
+ if (sd->npc_id != 0 || sd->vender_id != 0)
+ return;
+
+ if (sd->state.storage_flag)
+ storage_guild_storageget(sd, item_index, item_amount);
+ else
+ storage_storageget(sd, item_index, item_amount);
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
+ *------------------------------------------
+ */
+void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (sd->npc_id != 0 || sd->vender_id != 0 || sd->trade_partner != 0)
+ return;
+ if (sd->state.storage_flag)
+ storage_guild_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
+ else
+ storage_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
+ *------------------------------------------
+ */
+void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (sd->npc_id != 0 || sd->vender_id != 0)
+ return;
+ if (sd->state.storage_flag)
+ storage_guild_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
+ else
+ storage_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
+ *------------------------------------------
+ */
+void clif_parse_CloseKafra(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (sd->state.storage_flag)
+ storage_guild_storageclose(sd);
+ else
+ storage_storageclose(sd);
+}
+
+/*==========================================
+ * ƒp[ƒeƒB‚ðì‚é
+ *------------------------------------------
+ */
+void clif_parse_CreateParty(int fd, struct map_session_data *sd) {
+ if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7) {
+ party_create(sd,RFIFOP(fd,2));
+ } else
+ clif_skill_fail(sd,1,0,4);
+}
+
+/*==========================================
+ * ƒp[ƒeƒB‚ðì‚é
+ *------------------------------------------
+ */
+void clif_parse_CreateParty2(int fd, struct map_session_data *sd) {
+ if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 7){
+ party_create(sd, RFIFOP(fd,2));
+ } else
+ clif_skill_fail(sd, 1, 0, 4);
+}
+
+/*==========================================
+ * ƒp[ƒeƒB‚ÉŠ©—U
+ *------------------------------------------
+ */
+void clif_parse_PartyInvite(int fd, struct map_session_data *sd) {
+ party_invite(sd, RFIFOL(fd,2));
+}
+
+/*==========================================
+ * ƒp[ƒeƒBŠ©—U•Ô“š
+ *------------------------------------------
+ */
+void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) {
+ if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 5){
+ party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6));
+ } else {
+ party_reply_invite(sd,RFIFOL(fd,2),-1);
+ clif_skill_fail(sd,1,0,4);
+ }
+}
+
+/*==========================================
+ * ƒp[ƒeƒB’E‘Þ—v‹
+ *------------------------------------------
+ */
+void clif_parse_LeaveParty(int fd, struct map_session_data *sd) {
+ party_leave(sd);
+}
+
+/*==========================================
+ * ƒp[ƒeƒBœ–¼—v‹
+ *------------------------------------------
+ */
+void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) {
+ party_removemember(sd,RFIFOL(fd,2),RFIFOP(fd,6));
+}
+
+/*==========================================
+ * ƒp[ƒeƒBÝ’è•ÏX—v‹
+ *------------------------------------------
+ */
+void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) {
+ party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4));
+}
+
+/*==========================================
+ * ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M—v‹
+ *------------------------------------------
+ */
+void clif_parse_PartyMessage(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None)
+ return;
+ if(sd->sc_data &&
+ (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
+ sd->sc_data[SC_NOCHAT].timer!=-1)) //ƒ`ƒƒƒbƒg‹ÖŽ~
+ return;
+
+ party_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4);
+}
+
+/*==========================================
+ * ˜I“X•Â½
+ *------------------------------------------
+ */
+void clif_parse_CloseVending(int fd, struct map_session_data *sd) {
+ vending_closevending(sd);
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€ƒŠƒXƒg—v‹
+ *------------------------------------------
+ */
+void clif_parse_VendingListReq(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ vending_vendinglistreq(sd,RFIFOL(fd,2));
+ if(sd->npc_id)
+ npc_event_dequeue(sd);
+}
+
+/*==========================================
+ * ˜I“XƒAƒCƒeƒ€w“ü
+ *------------------------------------------
+ */
+void clif_parse_PurchaseReq(int fd, struct map_session_data *sd) {
+ vending_purchasereq(sd, RFIFOW(fd,2), RFIFOL(fd,4), RFIFOP(fd,8));
+}
+
+/*==========================================
+ * ˜I“XŠJÝ
+ *------------------------------------------
+ */
+void clif_parse_OpenVending(int fd,struct map_session_data *sd) {
+ vending_openvending(sd, RFIFOW(fd,2), RFIFOP(fd,4), RFIFOB(fd,84), RFIFOP(fd,85));
+}
+
+/*==========================================
+ * /monster /item rewriten by [Yor]
+ *------------------------------------------
+ */
+void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
+ char monster_item_name[25];
+
+ nullpo_retv(sd);
+
+ memset(monster_item_name, '\0', sizeof(monster_item_name));
+
+ if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
+ memcpy(monster_item_name, RFIFOP(fd,2), 24);
+
+ if (mobdb_searchname(monster_item_name) != 0) {
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster))
+ atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn
+ } else if (itemdb_searchname(monster_item_name) != NULL) {
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item))
+ atcommand_item(fd, sd, "@item", monster_item_name); // as @item
+ }
+
+ }
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh‚ðì‚é
+ *------------------------------------------
+ */
+void clif_parse_CreateGuild(int fd,struct map_session_data *sd) {
+ guild_create(sd, RFIFOP(fd,6));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒ}ƒXƒ^[‚©‚Ç‚¤‚©Šm”F
+ *------------------------------------------
+ */
+void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) {
+ clif_guild_masterormember(sd);
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhî•ñ—v‹
+ *------------------------------------------
+ */
+void clif_parse_GuildReqeustInfo(int fd, struct map_session_data *sd) {
+ switch(RFIFOL(fd,2)){
+ case 0: // ƒMƒ‹ƒhŠî–{î•ñA“¯–¿“G‘Îî•ñ
+ clif_guild_basicinfo(sd);
+ clif_guild_allianceinfo(sd);
+ break;
+ case 1: // ƒƒ“ƒo[ƒŠƒXƒgA–ðE–¼ƒŠƒXƒg
+ clif_guild_positionnamelist(sd);
+ clif_guild_memberlist(sd);
+ break;
+ case 2: // –ðE–¼ƒŠƒXƒgA–ðEî•ñƒŠƒXƒg
+ clif_guild_positionnamelist(sd);
+ clif_guild_positioninfolist(sd);
+ break;
+ case 3: // ƒXƒLƒ‹ƒŠƒXƒg
+ clif_guild_skillinfo(sd);
+ break;
+ case 4: // ’Ç•úƒŠƒXƒg
+ clif_guild_explusionlist(sd);
+ break;
+ default:
+ if (battle_config.error_log)
+ printf("clif: guild request info: unknown type %d\n", RFIFOL(fd,2));
+ break;
+ }
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh–ðE•ÏX
+ *------------------------------------------
+ */
+void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) {
+ int i;
+
+ for(i = 4; i < RFIFOW(fd,2); i += 40 ){
+ guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), RFIFOP(fd,i+16));
+ }
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒƒ“ƒo–ðE•ÏX
+ *------------------------------------------
+ */
+void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) {
+ int i;
+
+ nullpo_retv(sd);
+
+ for(i=4;i<RFIFOW(fd,2);i+=12){
+ guild_change_memberposition(sd->status.guild_id,
+ RFIFOL(fd,i),RFIFOL(fd,i+4),RFIFOL(fd,i+8));
+ }
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€—v‹
+ *------------------------------------------
+ */
+void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) {
+ struct guild *g=guild_search(RFIFOL(fd,2));
+ if(g!=NULL)
+ clif_guild_emblem(sd,g);
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX
+ *------------------------------------------
+ */
+void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) {
+ guild_change_emblem(sd,RFIFOW(fd,2)-4,RFIFOP(fd,4));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh’m•ÏX
+ *------------------------------------------
+ */
+void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd) {
+ guild_change_notice(sd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhŠ©—U
+ *------------------------------------------
+ */
+void clif_parse_GuildInvite(int fd,struct map_session_data *sd) {
+ guild_invite(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhŠ©—U•ÔM
+ *------------------------------------------
+ */
+void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) {
+ guild_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh’E‘Þ
+ *------------------------------------------
+ */
+void clif_parse_GuildLeave(int fd,struct map_session_data *sd) {
+ guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh’Ç•ú
+ *------------------------------------------
+ */
+void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) {
+ guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh‰ï˜b
+ *------------------------------------------
+ */
+void clif_parse_GuildMessage(int fd,struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if (is_atcommand(fd, sd, RFIFOP(fd, 4), 0) != AtCommand_None)
+ return;
+ if(sd->sc_data &&
+ (sd->sc_data[SC_BERSERK].timer!=-1 || //ƒo[ƒT[ƒNŽž‚͉ï˜b‚à•s‰Â
+ sd->sc_data[SC_NOCHAT].timer!=-1)) //ƒ`ƒƒƒbƒg‹ÖŽ~
+ return;
+
+ guild_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4);
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh“¯–¿—v‹
+ *------------------------------------------
+ */
+void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) {
+ guild_reqalliance(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh“¯–¿—v‹•ÔM
+ *------------------------------------------
+ */
+void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) {
+ guild_reply_reqalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒhŠÖŒW‰ðÁ
+ *------------------------------------------
+ */
+void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) {
+ guild_delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh“G‘Î
+ *------------------------------------------
+ */
+void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) {
+ guild_opposition(sd,RFIFOL(fd,2));
+}
+
+/*==========================================
+ * ƒMƒ‹ƒh‰ðŽU
+ *------------------------------------------
+ */
+void clif_parse_GuildBreak(int fd, struct map_session_data *sd) {
+ guild_break(sd,RFIFOP(fd,2));
+}
+
+// pet
+void clif_parse_PetMenu(int fd, struct map_session_data *sd) {
+ pet_menu(sd,RFIFOB(fd,2));
+}
+
+void clif_parse_CatchPet(int fd, struct map_session_data *sd) {
+ pet_catch_process2(sd,RFIFOL(fd,2));
+}
+
+void clif_parse_SelectEgg(int fd, struct map_session_data *sd) {
+ pet_select_egg(sd,RFIFOW(fd,2)-2);
+}
+
+void clif_parse_SendEmotion(int fd, struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ if(sd->pd)
+ clif_pet_emotion(sd->pd,RFIFOL(fd,2));
+}
+
+void clif_parse_ChangePetName(int fd, struct map_session_data *sd) {
+ pet_change_name(sd,RFIFOP(fd,2));
+}
+
+// Kick (right click menu for GM "(name) force to quit")
+void clif_parse_GMKick(int fd, struct map_session_data *sd) {
+ struct block_list *target;
+ int tid = RFIFOL(fd,2);
+
+ nullpo_retv(sd);
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_Kick))) {
+ target = map_id2bl(tid);
+ if (target) {
+ if (target->type == BL_PC) {
+ struct map_session_data *tsd = (struct map_session_data *)target;
+ if (pc_isGM(sd) > pc_isGM(tsd))
+ clif_GM_kick(sd, tsd, 1);
+ else
+ clif_GM_kickack(sd, 0);
+ } else if (target->type == BL_MOB) {
+ struct mob_data *md = (struct mob_data *)target;
+ sd->state.attack_type = 0;
+ mob_damage(&sd->bl, md, md->hp, 2);
+ } else
+ clif_GM_kickack(sd, 0);
+ } else
+ clif_GM_kickack(sd, 0);
+ }
+}
+
+/*==========================================
+ * /shift
+ *------------------------------------------
+ */
+void clif_parse_Shift(int fd, struct map_session_data *sd) { // Rewriten by [Yor]
+ char player_name[25];
+
+ nullpo_retv(sd);
+
+ memset(player_name, '\0', sizeof(player_name));
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_JumpTo))) {
+ memcpy(player_name, RFIFOP(fd,2), 24);
+ atcommand_jumpto(fd, sd, "@jumpto", player_name); // as @jumpto
+ }
+
+ return;
+}
+
+/*==========================================
+ * /recall
+ *------------------------------------------
+ */
+void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT
+ char player_name[25];
+
+ nullpo_retv(sd);
+
+ memset(player_name, '\0', sizeof(player_name));
+
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_Recall))) {
+ memcpy(player_name, RFIFOP(fd,2), 24);
+ atcommand_recall(fd, sd, "@recall", player_name); // as @recall
+ }
+
+ return;
+}
+
+void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
+ nullpo_retv(sd);
+
+ //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) {
+ if (sd->status.option & OPTION_HIDE) { // OPTION_HIDE = 0x40
+ sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40
+ clif_displaymessage(fd, "Invisible: Off.");
+ } else {
+ sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40
+ clif_displaymessage(fd, "Invisible: On.");
+ }
+ clif_changeoption(&sd->bl);
+ }
+}
+
+/*==========================================
+ * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔ•t—^
+ *------------------------------------------
+ */
+void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd)
+{
+ int tid = RFIFOL(fd,2);
+ int type = RFIFOB(fd,6);
+ int limit = RFIFOW(fd,7);
+ struct block_list *bl = map_id2bl(tid);
+ struct map_session_data *dstsd;
+ int dstfd;
+
+ nullpo_retv(sd);
+
+ if(!battle_config.muting_players) {
+ clif_displaymessage(fd, "Muting is disabled.");
+ return;
+ }
+
+ if(type == 0)
+ limit = 0 - limit;
+ if(bl->type == BL_PC && (dstsd =(struct map_session_data *)bl)){
+ if((tid == bl->id && type == 2 && !pc_isGM(sd)) || (pc_isGM(sd) > pc_isGM(dstsd)) ){
+ dstfd = dstsd->fd;
+ WFIFOW(dstfd,0)=0x14b;
+ WFIFOB(dstfd,2)=(type==2)?1:type;
+ memcpy(WFIFOP(dstfd,3),sd->status.name,24);
+ WFIFOSET(dstfd,packet_len_table[0x14b]);
+ dstsd->status.manner -= limit;
+ if(dstsd->status.manner < 0)
+ skill_status_change_start(bl,SC_NOCHAT,0,0,0,0,0,0);
+ else{
+ dstsd->status.manner = 0;
+ skill_status_change_end(bl,SC_NOCHAT,-1);
+ }
+ printf("name:%s type:%d limit:%d manner:%d\n",dstsd->status.name,type,limit,dstsd->status.manner);
+ }
+ }
+
+ return;
+}
+/*==========================================
+ * GM‚É‚æ‚éƒ`ƒƒƒbƒg‹ÖŽ~ŽžŠÔŽQÆiHj
+ *------------------------------------------
+ */
+void clif_parse_GMReqNoChatCount(int fd, struct map_session_data *sd)
+{
+ int tid = RFIFOL(fd,2);
+
+ WFIFOW(fd,0) = 0x1e0;
+ WFIFOL(fd,2) = tid;
+ sprintf(WFIFOP(fd,6),"%d",tid);
+// memcpy(WFIFOP(fd,6), "TESTNAME", 24);
+ WFIFOSET(fd, packet_len_table[0x1e0]);
+
+ return;
+}
+
+void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
+ char output[512];
+ char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick
+ int i, pos;
+
+ memset(output, '\0', sizeof(output));
+
+ nick = RFIFOP(fd,2); // speed up
+ RFIFOB(fd,25) = '\0'; // to be sure that the player name have at maximum 23 characters
+ //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26));
+
+ WFIFOW(fd,0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(fd,2) = RFIFOB(fd,26);
+ // do nothing only if nick can not exist
+ if (strlen(nick) < 4) {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ if (RFIFOB(fd,26) == 0) // type
+ clif_wis_message(fd, wisp_server_name, "It's impossible to block this player.", strlen("It's impossible to block this player.") + 1);
+ else
+ clif_wis_message(fd, wisp_server_name, "It's impossible to unblock this player.", strlen("It's impossible to unblock this player.") + 1);
+ return;
+ // name can exist
+ } else {
+ // deny action (we add nick only if it's not already exist
+ if (RFIFOB(fd,26) == 0) { // type
+ pos = -1;
+ for(i = 0; i < MAX_IGNORE_LIST; i++) {
+ if (strcmp(sd->ignore[i].name, nick) == 0) {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ clif_wis_message(fd, wisp_server_name, "This player is already blocked.", strlen("This player is already blocked.") + 1);
+ if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
+ sprintf(output, "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
+ }
+ return;
+ } else if (pos == -1 && sd->ignore[i].name[0] == '\0')
+ pos = i;
+ }
+ // if a position is found and name not found, we add it in the list
+ if (pos != -1) {
+ memcpy(sd->ignore[pos].name, nick, 24);
+ WFIFOB(fd,3) = 0; // success
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
+ sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
+ // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :)
+ clif_wis_message(fd, wisp_server_name, "Add me in your ignore list, doesn't block my wisps.", strlen("Add me in your ignore list, doesn't block my wisps.") + 1);
+ }
+ } else {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ clif_wis_message(fd, wisp_server_name, "You can not block more people.", strlen("You can not block more people.") + 1);
+ if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users who automaticaly ignore people.
+ sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name);
+ intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1);
+ }
+ }
+ // allow action (we remove all same nicks if they exist)
+ } else {
+ pos = -1;
+ for(i = 0; i < MAX_IGNORE_LIST; i++)
+ if (strcmp(sd->ignore[i].name, nick) == 0) {
+ memset(sd->ignore[i].name, 0, sizeof(sd->ignore[i].name));
+ if (pos != -1) {
+ WFIFOB(fd,3) = 0; // success
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ pos = i; // don't break, to remove ALL same nick
+ }
+ }
+ if (pos == -1) {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d1]);
+ clif_wis_message(fd, wisp_server_name, "This player is not blocked by you.", strlen("This player is not blocked by you.") + 1);
+ }
+ }
+ }
+
+// for(i = 0; i < MAX_IGNORE_LIST; i++) // for debug only
+// if (sd->ignore[i].name[0] != '\0')
+// printf("Ignored player: '%s'\n", sd->ignore[i].name);
+
+ return;
+}
+
+void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) { // Rewritten by [Yor]
+ //printf("Ignore all: state: %d\n", RFIFOB(fd,2));
+ if (RFIFOB(fd,2) == 0) {// S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech
+ WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(fd,2) = 0;
+ if (sd->ignoreAll == 0) {
+ sd->ignoreAll = 1;
+ WFIFOB(fd,3) = 0; // success
+ WFIFOSET(fd, packet_len_table[0x0d2]);
+ } else {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d2]);
+ clif_wis_message(fd, wisp_server_name, "You already block everyone.", strlen("You already block everyone.") + 1);
+ }
+ } else {
+ WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail
+ WFIFOB(fd,2) = 1;
+ if (sd->ignoreAll == 1) {
+ sd->ignoreAll = 0;
+ WFIFOB(fd,3) = 0; // success
+ WFIFOSET(fd, packet_len_table[0x0d2]);
+ } else {
+ WFIFOB(fd,3) = 1; // fail
+ WFIFOSET(fd, packet_len_table[0x0d2]);
+ clif_wis_message(fd, wisp_server_name, "You already allow everyone.", strlen("You already allow everyone.") + 1);
+ }
+ }
+
+ return;
+}
+
+void clif_parse_skillMessage(int fd, struct map_session_data *sd) { // Added by RoVeRT
+ int skillid,skilllv, x, y;
+ char *mes;
+
+ skilllv = RFIFOW(fd,2);
+ skillid = RFIFOW(fd,4);
+
+ y = RFIFOB(fd,6);
+ x = RFIFOB(fd,8);
+
+ mes = RFIFOP(fd,10);
+
+ // skill 220 = graffiti
+// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes);
+}
+
+int monk(struct map_session_data *sd, struct block_list *target, int type) {
+//R 01d1 <Monk id>L <Target monster id>L <Bool>L
+ int fd=sd->fd;
+ WFIFOW(fd,0)=0x1d1;
+ WFIFOL(fd,2)=sd->bl.id;
+ WFIFOL(fd,6)=target->id;
+ WFIFOL(fd,10)=type;
+ WFIFOSET(fd,packet_len_table[0x1d1]);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒpƒmƒr‚Ì/doridori‚É‚æ‚éSPR2”{
+ *------------------------------------------
+ */
+void clif_parse_sn_doridori(int fd, struct map_session_data *sd) {
+ if (sd)
+ sd->doridori_counter = 1;
+
+ return;
+}
+/*==========================================
+ * ƒXƒpƒmƒr‚Ì”š—ô”g“®
+ *------------------------------------------
+ */
+void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd)
+{
+ if(sd){
+ int nextbaseexp=pc_nextbaseexp(sd);
+ struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
+ if (battle_config.etc_log){
+ if(nextbaseexp != 0)
+ printf("SuperNovice explosionspirits!! %d %d %d %d\n",sd->bl.id,s_class.job,sd->status.base_exp,(int)((double)1000*sd->status.base_exp/nextbaseexp));
+ else
+ printf("SuperNovice explosionspirits!! %d %d %d 000\n",sd->bl.id,s_class.job,sd->status.base_exp);
+ }
+ if(s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){
+ clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,1);
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0 );
+ }
+ }
+ return;
+}
+
+/*==========================================
+ * Friends List
+ *------------------------------------------
+ */
+void clif_friends_list_send(struct map_session_data *sd) {
+ int i, n;
+
+ // Send friends list
+ n = 0;
+ WFIFOW(sd->fd, 0) = 0x201;
+ for(i = 0; i < 20; i++)
+ if (sd->status.friend_id[i]) {
+ WFIFOL(sd->fd,4 + 32 * n + 1) = sd->status.friend_id[i];
+ //WFIFOB(sd->fd,4 + 32 * n + 5) = (online[n]) ? 0 : 1; // <- We don't know this yet. I'd reckon its 5 but... i could be wrong.
+ memcpy(WFIFOP(sd->fd,4 + 32 * n + 8), &sd->status.friend_name[i], 23);
+ n++;
+ }
+ WFIFOW(sd->fd,2) = 4 + 32 * n;
+ WFIFOSET(sd->fd, WFIFOW(sd->fd,2));
+}
+
+void clif_parse_friends_list_add(int fd, struct map_session_data *sd) {
+ struct map_session_data *f_sd;
+ int i;
+
+ f_sd = map_nick2sd(RFIFOP(fd,2));
+
+ // Friend doesn't exist (no player with this name)
+ if (f_sd == NULL) {
+ clif_displaymessage(fd, "This name (for a friend) doesn't exist.");
+ return;
+ }
+
+ // Friend already exists
+ for (i = 0; i < 20; i++)
+ if (sd->status.friend_id[i] == f_sd->status.char_id) {
+ clif_displaymessage(fd, "Friend already exists.");
+ return;
+ }
+
+ // Find an empty slot
+ for (i = 0; i < 20; i++)
+ if (sd->status.friend_id[i] == 0)
+ break;
+ if (i == 20) {
+ clif_displaymessage(fd, "Friends list is full.");
+ return;
+ }
+
+ sd->status.friend_id[i] = f_sd->status.char_id;
+ memset(sd->status.friend_name[i], 0, sizeof(sd->status.friend_name[i]));
+ memcpy(sd->status.friend_name[i], f_sd->status.name, 23);
+ clif_displaymessage(fd, "Friend added.");
+
+ clif_friends_list_send(sd);
+
+ //printf("clif_parse_friends_list_add");
+
+ return;
+}
+
+void clif_parse_friends_list_remove(int fd, struct map_session_data *sd) {
+ // 0x203 </o> <ID to be removed W 4B>
+ int id = RFIFOL(fd,3);
+ int i, j;
+
+ // Search friend
+ for (i = 0; i < 20; i ++)
+ if (sd->status.friend_id[i] == id) {
+ // move all chars down
+ for(j = i + 1; j < 20; j++) {
+ sd->status.friend_id[j-1] = sd->status.friend_id[j];
+ memcpy(sd->status.friend_name[j-1], sd->status.friend_name[j], sizeof(sd->status.friend_name[j]));
+ }
+ sd->status.friend_id[19] = 0;
+ memset(sd->status.friend_name[19], 0, sizeof(sd->status.friend_name[19]));
+ clif_displaymessage(fd, "Friend removed");
+ clif_friends_list_send(sd);
+ break;
+ }
+
+ if (i == 20)
+ clif_displaymessage(fd, "Name not found in list.");
+
+ return;
+}
+
+/*==========================================
+ * /killall
+ *------------------------------------------
+ */
+void clif_parse_GMkillall(int fd,struct map_session_data *sd)
+{
+ char message[50];
+
+ nullpo_retv(sd);
+
+ strncpy(message,sd->status.name, 24);
+ is_atcommand(fd, sd, strcat(message," : @kickall"),0);
+
+ return;
+}
+
+// functions list
+static void (*clif_parse_func_table[7][0x220])() = {
+ {
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ // 40
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ // 70
+ NULL, NULL, clif_parse_WantToConnection, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, clif_parse_LoadEndAck, clif_parse_TickSend, NULL,
+
+ // 80
+ NULL, NULL, NULL, NULL, NULL, clif_parse_WalkToXY, NULL, NULL,
+ NULL, clif_parse_ActionRequest, NULL, NULL, clif_parse_GlobalMessage, NULL, NULL, NULL,
+ // 90
+ clif_parse_NpcClicked, NULL, NULL, NULL, clif_parse_GetCharNameRequest, NULL, clif_parse_Wis, NULL,
+ NULL, clif_parse_GMmessage, NULL, clif_parse_ChangeDir, NULL, NULL, NULL, clif_parse_TakeItem,
+ // a0
+ NULL, NULL, clif_parse_DropItem, NULL, NULL, NULL, NULL, clif_parse_UseItem,
+ NULL, clif_parse_EquipItem, NULL, clif_parse_UnequipItem, NULL, NULL, NULL, NULL,
+ // b0
+ NULL, NULL, clif_parse_Restart, NULL, NULL, NULL, NULL, NULL,
+ clif_parse_NpcSelectMenu, clif_parse_NpcNextClicked, NULL, clif_parse_StatusUp, NULL, NULL, NULL, clif_parse_Emotion,
+
+ // c0
+ NULL, clif_parse_HowManyConnections, NULL, NULL, NULL, clif_parse_NpcBuySellSelected, NULL, NULL,
+ clif_parse_NpcBuyListSend, clif_parse_NpcSellListSend, NULL, NULL, clif_parse_GMKick, NULL, clif_parse_GMkillall, clif_parse_PMIgnore,
+ // d0
+ clif_parse_PMIgnoreAll, NULL, NULL, NULL, NULL, clif_parse_CreateChatRoom, NULL, NULL,
+ NULL, clif_parse_ChatAddMember, NULL, NULL, NULL, NULL, clif_parse_ChatRoomStatusChange, NULL,
+ // e0
+ clif_parse_ChangeChatOwner, NULL, clif_parse_KickFromChat, clif_parse_ChatLeave, clif_parse_TradeRequest, NULL, clif_parse_TradeAck, NULL,
+ clif_parse_TradeAddItem, NULL, NULL, clif_parse_TradeOk, NULL, clif_parse_TradeCansel, NULL, clif_parse_TradeCommit,
+ // f0
+ NULL, NULL, NULL, clif_parse_MoveToKafra, NULL, clif_parse_MoveFromKafra, NULL, clif_parse_CloseKafra,
+ NULL, clif_parse_CreateParty, NULL, NULL, clif_parse_PartyInvite, NULL, NULL, clif_parse_ReplyPartyInvite,
+
+ // 100
+ clif_parse_LeaveParty, NULL, clif_parse_PartyChangeOption, clif_parse_RemovePartyMember, NULL, NULL, NULL, NULL,
+ clif_parse_PartyMessage, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ // 110
+ NULL, NULL, clif_parse_SkillUp, clif_parse_UseSkillToId, NULL, NULL, clif_parse_UseSkillToPos, NULL,
+ clif_parse_StopAttack, NULL, NULL, clif_parse_UseSkillMap, NULL, clif_parse_RequestMemo, NULL, NULL,
+ // 120
+ NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_PutItemToCart, clif_parse_GetItemFromCart,
+ clif_parse_MoveFromKafraToCart, clif_parse_MoveToKafraFromCart, clif_parse_RemoveOption, NULL, NULL, NULL, clif_parse_CloseVending, NULL,
+ // 130
+ clif_parse_VendingListReq, NULL, NULL, NULL, clif_parse_PurchaseReq, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GM_Monster_Item,
+
+ // 140
+ clif_parse_MapMove, NULL, NULL, clif_parse_NpcAmountInput, NULL, NULL, clif_parse_NpcCloseClicked, NULL,
+ NULL, clif_parse_GMReqNoChat, NULL, NULL, NULL, clif_parse_GuildCheckMaster, NULL, clif_parse_GuildReqeustInfo,
+ // 150
+ NULL, clif_parse_GuildRequestEmblem, NULL, clif_parse_GuildChangeEmblem, NULL, clif_parse_GuildChangeMemberPosition, NULL, NULL,
+ NULL, clif_parse_GuildLeave, NULL, clif_parse_GuildExplusion, NULL, clif_parse_GuildBreak, NULL, NULL,
+ // 160
+ NULL, clif_parse_GuildChangePositionInfo, NULL, NULL, NULL, clif_parse_CreateGuild, NULL, NULL,
+ clif_parse_GuildInvite, NULL, NULL, clif_parse_GuildReplyInvite, NULL, NULL, clif_parse_GuildChangeNotice, NULL,
+ // 170
+ clif_parse_GuildRequestAlliance, NULL, clif_parse_GuildReplyAlliance, NULL, NULL, NULL, NULL, NULL,
+ clif_parse_ItemIdentify, NULL, clif_parse_UseCard, NULL, clif_parse_InsertCard, NULL, clif_parse_GuildMessage, NULL,
+
+ // 180
+ clif_parse_GuildOpposition, NULL, NULL, clif_parse_GuildDelAlliance, NULL, NULL, NULL, NULL,
+ NULL, NULL, clif_parse_QuitGame, NULL, NULL, NULL, clif_parse_ProduceMix, NULL,
+ // 190
+ clif_parse_UseSkillToPos, NULL, NULL, clif_parse_SolveCharName, NULL, NULL, NULL, clif_parse_ResetChar,
+ NULL, NULL, NULL, NULL, clif_parse_LGMmessage, clif_parse_GMHide, NULL, clif_parse_CatchPet,
+ // 1a0
+ NULL, clif_parse_PetMenu, NULL, NULL, NULL, clif_parse_ChangePetName, NULL, clif_parse_SelectEgg,
+ NULL, clif_parse_SendEmotion, NULL, NULL, NULL, NULL, clif_parse_SelectArrow, clif_parse_ChangeCart,
+ // 1b0
+ NULL, NULL, clif_parse_OpenVending, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, clif_parse_Shift, clif_parse_Shift, clif_parse_Recall, clif_parse_Recall, NULL, NULL,
+
+ // 1c0
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_AutoSpell,
+ NULL,
+ // 1d0
+ NULL, NULL, NULL, NULL, NULL, clif_parse_NpcStringInput, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GMReqNoChatCount,
+ // 1e0
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_sn_doridori,
+ clif_parse_CreateParty2, NULL, NULL, NULL, NULL, clif_parse_sn_explosionspirits, NULL, NULL,
+ // 1f0
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ // 200
+ NULL, NULL, clif_parse_friends_list_add, clif_parse_friends_list_remove, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ // 210
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+#if 0
+ case 0xd3: clif_parse_IgnoreList
+#endif
+ },
+ {NULL},
+ {NULL},
+ {NULL},
+ {NULL},
+ {NULL},
+ {NULL}
+};
+
+/*==========================================
+ * ƒNƒ‰ƒCƒAƒ“ƒg‚©‚ç‚̃pƒPƒbƒg‰ðÍ
+ * socket.c‚Ìdo_parsepacket‚©‚çŒÄ‚Ño‚³‚ê‚é
+ *------------------------------------------
+ */
+static int clif_parse(int fd) {
+ int packet_len = 0, cmd, packet_ver;
+ struct map_session_data *sd;
+
+ sd = session[fd]->session_data;
+
+ // Ú‘±‚ªØ‚ê‚Ä‚é‚Ì‚ÅŒãŽn––
+ if (!chrif_isconnect() || session[fd]->eof) { // charŽI‚ÉŒq‚ª‚Á‚Ä‚È‚¢ŠÔ‚ÍÚ‘±‹ÖŽ~ (!chrif_isconnect())
+ if (sd && sd->state.auth) {
+ if (chrif_isconnect())
+ clif_quitsave(fd, sd);
+ if (sd->status.name != NULL)
+ printf("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris]
+ else
+ printf("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor]
+ } else if (sd) { // not authentified! (refused by char-server or disconnect before to be authentified)
+ printf("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor]
+ map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer
+ }
+ close(fd);
+ delete_session(fd);
+ return 0;
+ }
+
+ if (RFIFOREST(fd) < 2)
+ return 0;
+
+ //printf("clif_parse: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+
+ cmd = RFIFOW(fd,0);
+
+ // ŠÇ——pƒpƒPƒbƒgˆ—
+ if (cmd >= 30000) {
+ switch(cmd) {
+ case 0x7530: // Athenaî•ñŠ“¾
+ 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_MAP;
+ WFIFOW(fd,8) = ATHENA_MOD_VERSION;
+ WFIFOSET(fd,10);
+ RFIFOSKIP(fd,2);
+ break;
+ case 0x7532: // Ú‘±‚ÌØ’f
+ session[fd]->eof = 1;
+ break;
+ }
+ return 0;
+ }
+
+ // get packet version before to parse
+ packet_ver = 0;
+ if (sd)
+ packet_ver = sd->packet_ver;
+ // check authentification packet to know packet version
+ else {
+ // 0x72
+ if (cmd == 0x72) {
+ if (RFIFOREST(fd) >= 39 && (RFIFOB(fd,38) == 0 || RFIFOB(fd,38) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 7; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 22 && (RFIFOB(fd,21) == 0 || RFIFOB(fd,21) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 6; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 19 && (RFIFOB(fd,18) == 0 || RFIFOB(fd,18) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 5; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ // else probably incomplete packet
+ else if (RFIFOREST(fd) < 19)
+ return 0;
+ // 0x7E
+ } else if (cmd == 0x7E) {
+ if (RFIFOREST(fd) >= 37 && (RFIFOB(fd,36) == 0 || RFIFOB(fd,36) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 9; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 8; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ // else probably incomplete packet
+ else if (RFIFOREST(fd) < 33)
+ return 0;
+ // 0xF5
+ } else {
+ if (RFIFOREST(fd) >= 34 && (RFIFOB(fd,33) == 0 || RFIFOB(fd,33) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 10; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 33 && (RFIFOB(fd,32) == 0 || RFIFOB(fd,32) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 12; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 32 && (RFIFOB(fd,31) == 0 || RFIFOB(fd,31) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 11; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ else if (RFIFOREST(fd) >= 29 && (RFIFOB(fd,28) == 0 || RFIFOB(fd,28) == 1)) // 00 = Female, 01 = Male
+ packet_ver = 13; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor])
+ // else probably incomplete packet
+ else if (RFIFOREST(fd) < 29)
+ return 0;
+ }
+ // check if version is accepted
+ if ((packet_ver == 5 && (battle_config.packet_ver_flag & 1) == 0) ||
+ (packet_ver == 6 && (battle_config.packet_ver_flag & 2) == 0) ||
+ (packet_ver == 7 && (battle_config.packet_ver_flag & 4) == 0) ||
+ (packet_ver == 8 && (battle_config.packet_ver_flag & 8) == 0) ||
+ (packet_ver == 9 && (battle_config.packet_ver_flag & 16) == 0) ||
+ (packet_ver == 10 && (battle_config.packet_ver_flag & 32) == 0) ||
+ (packet_ver == 11 && (battle_config.packet_ver_flag & 64) == 0) ||
+ (packet_ver == 12 && (battle_config.packet_ver_flag & 128) == 0) ||
+ (packet_ver == 13 && (battle_config.packet_ver_flag & 256) == 0)) {
+ WFIFOW(fd,0) = 0x6a;
+ WFIFOB(fd,2) = 5; // 05 = Game's EXE is not the latest version
+ WFIFOSET(fd,23);
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+
+ // ƒQ[ƒ€—pˆÈŠOƒpƒPƒbƒg‚©A”FØ‚ðI‚¦‚é‘O‚É0072ˆÈŠO‚ª—ˆ‚½‚çAØ’f‚·‚é
+ if (packet_ver < 5 || packet_ver > 13 || // if packet is not inside these values: session is incorrect?? or auth packet is unknown
+ cmd >= 0x220 || packet_size_table[packet_ver-5][cmd] == 0) {
+ if (!fd)
+ return 0;
+ session[fd]->eof = 1;
+ printf("clif_parse: session #%d, packet 0x%x (%d bytes received) -> disconnected.\n", fd, cmd, RFIFOREST(fd));
+ return 0;
+ }
+
+ // ƒpƒPƒbƒg’·‚ðŒvŽZ
+ packet_len = packet_size_table[packet_ver-5][cmd];
+ if (packet_len == -1) {
+ if (RFIFOREST(fd) < 4)
+ return 0; // ‰Â•Ï’·ƒpƒPƒbƒg‚Å’·‚³‚ÌŠ‚܂Ńf[ƒ^‚ª—ˆ‚Ä‚È‚¢
+ packet_len = RFIFOW(fd,2);
+ if (packet_len < 4 || packet_len > 32768) {
+ session[fd]->eof = 1;
+ return 0;
+ }
+ }
+ if (RFIFOREST(fd) < packet_len)
+ return 0; // ‚Ü‚¾1ƒpƒPƒbƒg•ªƒf[ƒ^‚ª‘µ‚Á‚Ä‚È‚¢
+
+ if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // Ø’f‘Ò‚¿‚ÌꇃpƒPƒbƒg‚ðˆ—‚µ‚È‚¢
+
+ } else if (packet_ver < 8 && clif_parse_func_table[0][cmd]) { // packet version 5-6-7 use same functions, but size are different
+ // ƒpƒPƒbƒgˆ—
+ clif_parse_func_table[0][cmd](fd, sd);
+ } else if (packet_ver >= 8 && clif_parse_func_table[packet_ver - 7][cmd]) {
+ // ƒpƒPƒbƒgˆ—
+ clif_parse_func_table[packet_ver - 7][cmd](fd, sd);
+ } else {
+ // •s–¾‚ȃpƒPƒbƒg
+ if (battle_config.error_log) {
+ if (fd)
+ printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len);
+#ifdef DUMP_UNKNOWN_PACKET
+ {
+ int i;
+ FILE *fp;
+ char packet_txt[256] = "save/packet.txt";
+ time_t now;
+ printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
+ for(i = 0; i < packet_len; i++) {
+ if ((i & 15) == 0)
+ printf("\n%04X ",i);
+ printf("%02X ", RFIFOB(fd,i));
+ }
+ if (sd && sd->state.auth) {
+ if (sd->status.name != NULL)
+ printf("\nAccount ID %d, character ID %d, player name %s.\n",
+ sd->status.account_id, sd->status.char_id, sd->status.name);
+ else
+ printf("\nAccount ID %d.\n", sd->bl.id);
+ } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
+ printf("\nAccount ID %d.\n", sd->bl.id);
+
+ if ((fp = fopen(packet_txt, "a")) == NULL) {
+ printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt);
+ return 1;
+ } else {
+ time(&now);
+ if (sd && sd->state.auth) {
+ if (sd->status.name != NULL)
+ fprintf(fp, "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n",
+ asctime(localtime(&now)), sd->status.account_id, sd->status.char_id, sd->status.name);
+ else
+ fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
+ } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
+ fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
+
+ fprintf(fp, "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
+ for(i = 0; i < packet_len; i++) {
+ if ((i & 15) == 0)
+ fprintf(fp, "\n\t%04X ", i);
+ fprintf(fp, "%02X ", RFIFOB(fd,i));
+ }
+ fprintf(fp, "\n\n");
+ fclose(fp);
+ }
+ }
+#endif
+ }
+ }
+ RFIFOSKIP(fd, packet_len);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int do_init_clif(void) {
+#ifndef __WIN32
+ int i;
+#endif
+
+ // functions of packet version 5-6-7 are same, but size are different
+ // init packet function calls for packet ver 8
+ memcpy(clif_parse_func_table[1], clif_parse_func_table[0], sizeof(clif_parse_func_table[0]));
+ clif_parse_func_table[1][0x072] = clif_parse_DropItem;
+ clif_parse_func_table[1][0x07e] = clif_parse_WantToConnection;
+ clif_parse_func_table[1][0x085] = clif_parse_UseSkillToId;
+ clif_parse_func_table[1][0x089] = clif_parse_GetCharNameRequest;
+ clif_parse_func_table[1][0x08c] = clif_parse_UseSkillToPos;
+ clif_parse_func_table[1][0x094] = clif_parse_TakeItem;
+ clif_parse_func_table[1][0x09b] = clif_parse_WalkToXY;
+ clif_parse_func_table[1][0x09f] = clif_parse_ChangeDir;
+ clif_parse_func_table[1][0x0a2] = clif_parse_UseSkillToPos;
+ clif_parse_func_table[1][0x0a7] = clif_parse_SolveCharName;
+ clif_parse_func_table[1][0x0f3] = clif_parse_GlobalMessage;
+ clif_parse_func_table[1][0x0f5] = clif_parse_UseItem;
+ clif_parse_func_table[1][0x0f7] = clif_parse_TickSend;
+ clif_parse_func_table[1][0x113] = clif_parse_MoveToKafra;
+ clif_parse_func_table[1][0x116] = clif_parse_CloseKafra;
+ clif_parse_func_table[1][0x190] = clif_parse_MoveFromKafra;
+ clif_parse_func_table[1][0x193] = clif_parse_ActionRequest;
+ // init packet function calls for packet ver 9 (same function of packet version 8, but size are different)
+ memcpy(clif_parse_func_table[2], clif_parse_func_table[1], sizeof(clif_parse_func_table[0]));
+ // init packet function calls for packet ver 10
+ memcpy(clif_parse_func_table[3], clif_parse_func_table[2], sizeof(clif_parse_func_table[0]));
+ clif_parse_func_table[3][0x072] = clif_parse_UseItem;
+ clif_parse_func_table[3][0x07e] = clif_parse_MoveToKafra;
+ clif_parse_func_table[3][0x085] = clif_parse_ActionRequest;
+ clif_parse_func_table[3][0x089] = clif_parse_WalkToXY;
+ clif_parse_func_table[3][0x08c] = clif_parse_UseSkillToPos;
+ clif_parse_func_table[3][0x094] = clif_parse_DropItem;
+ clif_parse_func_table[3][0x09b] = clif_parse_GetCharNameRequest;
+ clif_parse_func_table[3][0x09f] = clif_parse_GlobalMessage;
+ clif_parse_func_table[3][0x0a2] = clif_parse_SolveCharName;
+ clif_parse_func_table[3][0x0a7] = clif_parse_UseSkillToPos;
+ clif_parse_func_table[3][0x0f3] = clif_parse_ChangeDir;
+ clif_parse_func_table[3][0x0f5] = clif_parse_WantToConnection;
+ clif_parse_func_table[3][0x0f7] = clif_parse_CloseKafra;
+ clif_parse_func_table[3][0x113] = clif_parse_TakeItem;
+ clif_parse_func_table[3][0x116] = clif_parse_TickSend;
+ clif_parse_func_table[3][0x190] = clif_parse_UseSkillToId;
+ clif_parse_func_table[3][0x193] = clif_parse_MoveFromKafra;
+ // init packet function calls for packet ver 11 (same function of packet version 10, but size are different)
+ memcpy(clif_parse_func_table[4], clif_parse_func_table[3], sizeof(clif_parse_func_table[0]));
+ // init packet function calls for packet ver 12 (same function of packet version 11, but size are different)
+ memcpy(clif_parse_func_table[5], clif_parse_func_table[4], sizeof(clif_parse_func_table[0]));
+ // init packet function calls for packet ver 13 (same function of packet version 12, but size are different)
+ memcpy(clif_parse_func_table[6], clif_parse_func_table[5], sizeof(clif_parse_func_table[0]));
+
+ // size of packet version 5
+ memcpy(&packet_size_table[0], &packet_len_table, sizeof(packet_len_table));
+ // size of packet version 6
+ memcpy(&packet_size_table[1], &packet_size_table[0], sizeof(packet_len_table));
+ packet_size_table[1][0x072] = 22;
+ packet_size_table[1][0x085] = 8;
+ packet_size_table[1][0x0a7] = 13;
+ packet_size_table[1][0x113] = 15;
+ packet_size_table[1][0x116] = 15;
+ packet_size_table[1][0x190] = 95;
+ // size of packet version 7
+ memcpy(&packet_size_table[2], &packet_size_table[1], sizeof(packet_len_table));
+ packet_size_table[2][0x072] = 39;
+ packet_size_table[2][0x085] = 9;
+ packet_size_table[2][0x09b] = 13;
+ packet_size_table[2][0x09f] = 10;
+ packet_size_table[2][0x0a7] = 17;
+ packet_size_table[2][0x113] = 19;
+ packet_size_table[2][0x116] = 19;
+ packet_size_table[2][0x190] = 99;
+ // size of packet version 8
+ memcpy(&packet_size_table[3], &packet_size_table[2], sizeof(packet_len_table));
+ packet_size_table[3][0x072] = 14;
+ packet_size_table[3][0x07e] = 33;
+ packet_size_table[3][0x085] = 20;
+ packet_size_table[3][0x089] = 15;
+ packet_size_table[3][0x08c] = 23;
+ packet_size_table[3][0x094] = 10;
+ packet_size_table[3][0x09b] = 6;
+ packet_size_table[3][0x09f] = 13;
+ packet_size_table[3][0x0a2] = 103;
+ packet_size_table[3][0x0a7] = 12;
+ packet_size_table[3][0x0f3] = -1;
+ packet_size_table[3][0x0f5] = 17;
+ packet_size_table[3][0x0f7] = 10;
+ packet_size_table[3][0x113] = 16;
+ packet_size_table[3][0x116] = 2;
+ packet_size_table[3][0x190] = 26;
+ packet_size_table[3][0x193] = 9;
+ // size of packet version 9
+ memcpy(&packet_size_table[4], &packet_size_table[3], sizeof(packet_len_table));
+ packet_size_table[4][0x072] = 17;
+ packet_size_table[4][0x07e] = 37;
+ packet_size_table[4][0x085] = 26;
+ packet_size_table[4][0x089] = 12;
+ packet_size_table[4][0x08c] = 40;
+ packet_size_table[4][0x094] = 13;
+ packet_size_table[4][0x09b] = 15;
+ packet_size_table[4][0x09f] = 12;
+ packet_size_table[4][0x0a2] = 120;
+ packet_size_table[4][0x0a7] = 11;
+// packet_size_table[4][0x0f3] = -1;
+ packet_size_table[4][0x0f5] = 24;
+ packet_size_table[4][0x0f7] = 13;
+ packet_size_table[4][0x113] = 23;
+// packet_size_table[4][0x116] = 2;
+ packet_size_table[4][0x190] = 26;
+ packet_size_table[4][0x193] = 18;
+ // new packet
+ packet_size_table[4][0x20f] = 10;
+ packet_size_table[4][0x210] = 22;
+ packet_size_table[4][0x212] = 26;
+ packet_size_table[4][0x213] = 26;
+ packet_size_table[4][0x214] = 42;
+ // size of packet version 10
+ memcpy(&packet_size_table[5], &packet_size_table[4], sizeof(packet_len_table));
+ packet_size_table[5][0x072] = 20;
+ packet_size_table[5][0x07e] = 19;
+ packet_size_table[5][0x085] = 23;
+ packet_size_table[5][0x089] = 9;
+ packet_size_table[5][0x08c] = 105;
+ packet_size_table[5][0x094] = 17;
+ packet_size_table[5][0x09b] = 14;
+ packet_size_table[5][0x09f] = -1;
+ packet_size_table[5][0x0a2] = 14;
+ packet_size_table[5][0x0a7] = 25;
+ packet_size_table[5][0x0f3] = 10;
+ packet_size_table[5][0x0f5] = 34;
+ packet_size_table[5][0x0f7] = 2;
+ packet_size_table[5][0x113] = 11;
+ packet_size_table[5][0x116] = 11;
+ packet_size_table[5][0x190] = 22;
+ packet_size_table[5][0x193] = 17;
+ // size of packet version 11
+ memcpy(&packet_size_table[6], &packet_size_table[5], sizeof(packet_len_table));
+ packet_size_table[6][0x072] = 18;
+ packet_size_table[6][0x07e] = 25;
+ packet_size_table[6][0x085] = 9;
+ packet_size_table[6][0x089] = 14;
+ packet_size_table[6][0x08c] = 109;
+ packet_size_table[6][0x094] = 19;
+ packet_size_table[6][0x09b] = 10;
+// packet_size_table[6][0x09f] = -1;
+ packet_size_table[6][0x0a2] = 10;
+ packet_size_table[6][0x0a7] = 29;
+ packet_size_table[6][0x0f3] = 18;
+ packet_size_table[6][0x0f5] = 32;
+// packet_size_table[6][0x0f7] = 2;
+ packet_size_table[6][0x113] = 14;
+ packet_size_table[6][0x116] = 14;
+ packet_size_table[6][0x190] = 14;
+ packet_size_table[6][0x193] = 12;
+ // size of packet version 12
+ memcpy(&packet_size_table[7], &packet_size_table[6], sizeof(packet_len_table));
+ packet_size_table[7][0x072] = 17;
+ packet_size_table[7][0x07e] = 16;
+// packet_size_table[7][0x085] = 9;
+ packet_size_table[7][0x089] = 6;
+ packet_size_table[7][0x08c] = 103;
+ packet_size_table[7][0x094] = 14;
+ packet_size_table[7][0x09b] = 15;
+// packet_size_table[7][0x09f] = -1;
+ packet_size_table[7][0x0a2] = 12;
+ packet_size_table[7][0x0a7] = 23;
+ packet_size_table[7][0x0f3] = 13;
+ packet_size_table[7][0x0f5] = 33;
+// packet_size_table[7][0x0f7] = 2;
+ packet_size_table[7][0x113] = 10;
+ packet_size_table[7][0x116] = 10;
+ packet_size_table[7][0x190] = 20;
+ packet_size_table[7][0x193] = 26;
+ // size of packet version 13
+ memcpy(&packet_size_table[8], &packet_size_table[7], sizeof(packet_len_table));
+ packet_size_table[8][0x072] = 13;
+ packet_size_table[8][0x07e] = 13;
+ packet_size_table[8][0x085] = 15;
+// packet_size_table[8][0x089] = 6;
+ packet_size_table[8][0x08c] = 108;
+ packet_size_table[8][0x094] = 12;
+ packet_size_table[8][0x09b] = 10;
+// packet_size_table[8][0x09f] = -1;
+ packet_size_table[8][0x0a2] = 16;
+ packet_size_table[8][0x0a7] = 28;
+ packet_size_table[8][0x0f3] = 15;
+ packet_size_table[8][0x0f5] = 29;
+// packet_size_table[8][0x0f7] = 2;
+ packet_size_table[8][0x113] = 9;
+ packet_size_table[8][0x116] = 9;
+ packet_size_table[8][0x190] = 26;
+ packet_size_table[8][0x193] = 22;
+
+ set_defaultparse(clif_parse);
+#ifdef __WIN32
+ if (!make_listen_port(map_port)) {
+ printf("cant bind game port\n");
+ exit(1);
+ }
+#else
+ for(i = 0; i < 10; i++) {
+ if (make_listen_port(map_port))
+ break;
+ sleep(20);
+ }
+ if (i == 10) {
+ printf("cant bind game port\n");
+ exit(1);
+ }
+#endif
+
+ add_timer_func_list(clif_waitclose, "clif_waitclose");
+ add_timer_func_list(clif_clearchar_delay_sub, "clif_clearchar_delay_sub");
+
+ return 0;
+}
+
diff --git a/src/map/clif.h b/src/map/clif.h
index 95c982d72..595c7f7be 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -1,287 +1,287 @@
-// $Id: clif.h 1952 2004-10-23 14:05:01Z Yor $
-#ifndef _CLIF_H_
-#define _CLIF_H_
-
-#ifdef __WIN32
-typedef unsigned int in_addr_t;
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#include "map.h"
-
-void clif_setip(char*);
-void clif_setport(int);
-
-in_addr_t clif_getip(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);
-int clif_charselectok(int);
-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_spawnpc(struct map_session_data*); //area
-int clif_spawnnpc(struct npc_data*); // area
-int clif_spawnmob(struct mob_data*); // area
-int clif_spawnpet(struct pet_data*); // area
-int clif_walkok(struct map_session_data*); // self
-int clif_movechar(struct map_session_data*); // area
-int clif_movemob(struct mob_data*); //area
-int clif_movepet(struct pet_data *pd); //area
-int clif_movenpc(struct npc_data *nd); // [Valaris]
-int clif_changemap(struct map_session_data*,char*,int,int); //self
-int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self
-int clif_fixpos(struct block_list *); // area
-int clif_fixmobpos(struct mob_data *md);
-int clif_fixpcpos(struct map_session_data *sd);
-int clif_fixpetpos(struct pet_data *pd);
-int clif_fixnpcpos(struct npc_data *nd); // [Valaris]
-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
-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
-
-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
-
-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_sitting(int fd, struct map_session_data *sd);
-//void clif_callpartner(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);
-
-// 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"
-int clif_storageitemlist(struct map_session_data *sd,struct storage *stor);
-int clif_storageequiplist(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);
-int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor);
-int clif_guildstorageequiplist(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_pcinsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_pcoutsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_mobinsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_moboutsight(struct block_list *,va_list); // map_forallinmovearea callback
-int clif_petoutsight(struct block_list *bl,va_list ap);
-int clif_petinsight(struct block_list *bl,va_list ap);
-int clif_npcoutsight(struct block_list *bl,va_list ap);
-int clif_npcinsight(struct block_list *bl,va_list ap);
-
-int clif_class_change(struct block_list *bl,int class,int type);
-int clif_mob_class_change(struct mob_data *md,int class);
-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,
- 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 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_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_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);
-
-int clif_itemlist(struct map_session_data *sd);
-int 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);
-int clif_cart_itemlist(struct map_session_data *sd);
-int clif_cart_equiplist(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);
-
-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,int exp);
-
-// 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_info(struct party *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 *p,struct map_session_data *sd,int flag);
-int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag);
-int clif_party_message(struct party *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 party *p,struct map_session_data *sd);
-int clif_party_hp(struct party *p,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_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_explusion(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);
-
-
-// atcommand
-int clif_displaymessage(const int fd,char* mes);
-int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len);
-int clif_GMmessage(struct block_list *bl,char* mes,int len,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 nameid);
-int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
-
-//friends list
-void clif_friends_list_send(struct map_session_data *sd);
-void clif_parse_friends_list_add(int fd,struct map_session_data *sd);
-void clif_parse_friends_list_remove(int fd,struct map_session_data *sd);
-
-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_foreachclient(int (*)(struct map_session_data*,va_list),...);
-
-int do_final_clif(void);
-int do_init_clif(void);
-
-#endif
-
-
+// $Id: clif.h 1952 2004-10-23 14:05:01Z Yor $
+#ifndef _CLIF_H_
+#define _CLIF_H_
+
+#ifdef __WIN32
+typedef unsigned int in_addr_t;
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include "map.h"
+
+void clif_setip(char*);
+void clif_setport(int);
+
+in_addr_t clif_getip(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);
+int clif_charselectok(int);
+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_spawnpc(struct map_session_data*); //area
+int clif_spawnnpc(struct npc_data*); // area
+int clif_spawnmob(struct mob_data*); // area
+int clif_spawnpet(struct pet_data*); // area
+int clif_walkok(struct map_session_data*); // self
+int clif_movechar(struct map_session_data*); // area
+int clif_movemob(struct mob_data*); //area
+int clif_movepet(struct pet_data *pd); //area
+int clif_movenpc(struct npc_data *nd); // [Valaris]
+int clif_changemap(struct map_session_data*,char*,int,int); //self
+int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self
+int clif_fixpos(struct block_list *); // area
+int clif_fixmobpos(struct mob_data *md);
+int clif_fixpcpos(struct map_session_data *sd);
+int clif_fixpetpos(struct pet_data *pd);
+int clif_fixnpcpos(struct npc_data *nd); // [Valaris]
+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
+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
+
+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
+
+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_sitting(int fd, struct map_session_data *sd);
+//void clif_callpartner(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);
+
+// 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"
+int clif_storageitemlist(struct map_session_data *sd,struct storage *stor);
+int clif_storageequiplist(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);
+int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor);
+int clif_guildstorageequiplist(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_pcinsight(struct block_list *,va_list); // map_forallinmovearea callback
+int clif_pcoutsight(struct block_list *,va_list); // map_forallinmovearea callback
+int clif_mobinsight(struct block_list *,va_list); // map_forallinmovearea callback
+int clif_moboutsight(struct block_list *,va_list); // map_forallinmovearea callback
+int clif_petoutsight(struct block_list *bl,va_list ap);
+int clif_petinsight(struct block_list *bl,va_list ap);
+int clif_npcoutsight(struct block_list *bl,va_list ap);
+int clif_npcinsight(struct block_list *bl,va_list ap);
+
+int clif_class_change(struct block_list *bl,int class,int type);
+int clif_mob_class_change(struct mob_data *md,int class);
+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,
+ 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 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_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_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);
+
+int clif_itemlist(struct map_session_data *sd);
+int 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);
+int clif_cart_itemlist(struct map_session_data *sd);
+int clif_cart_equiplist(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);
+
+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,int exp);
+
+// 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_info(struct party *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 *p,struct map_session_data *sd,int flag);
+int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag);
+int clif_party_message(struct party *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 party *p,struct map_session_data *sd);
+int clif_party_hp(struct party *p,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_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_explusion(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);
+
+
+// atcommand
+int clif_displaymessage(const int fd,char* mes);
+int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len);
+int clif_GMmessage(struct block_list *bl,char* mes,int len,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 nameid);
+int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
+
+//friends list
+void clif_friends_list_send(struct map_session_data *sd);
+void clif_parse_friends_list_add(int fd,struct map_session_data *sd);
+void clif_parse_friends_list_remove(int fd,struct map_session_data *sd);
+
+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_foreachclient(int (*)(struct map_session_data*,va_list),...);
+
+int do_final_clif(void);
+int do_init_clif(void);
+
+#endif
+
+
diff --git a/src/map/guild.c b/src/map/guild.c
index 164cf9827..fc13adcf0 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -1,1554 +1,1554 @@
-// $Id: guild.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "guild.h"
-#include "storage.h"
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "battle.h"
-#include "npc.h"
-#include "pc.h"
-#include "map.h"
-#include "mob.h"
-#include "intif.h"
-#include "clif.h"
-#include "skill.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-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_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, exp;
-};
-
-// ƒMƒ‹ƒhƒXƒLƒ‹db‚̃AƒNƒZƒTi¡‚Í’¼‘Å‚¿‚Å‘ã—pj
-int guild_skill_get_inf(int id) { // Modified for new skills [Sara]
- if (id==GD_BATTLEORDER) return 4;
- else if (id==GD_REGENERATION) return 4;
- else if (id==GD_RESTORE) return 4;
- else if (id==GD_EMERGENCYCALL) return 4;
- else return 0;
-}
-int guild_skill_get_sp(int id,int lv){ return 0; }
-int guild_skill_get_range(int id){ return 0; }
-int guild_skill_get_max(int id) { // Modified for new skills [Sara]
- if (id==GD_EXTENSION) return 10;
- else if (id==GD_REGENERATION) return 3;
- else return 1;
-}
-
-// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
-int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }
-
-
-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);
-
-
-static int guild_read_castledb(void)
-{
- FILE *fp;
- char line[1024];
- int j,ln=0;
- char *str[32],*p;
- struct guild_castle *gc;
-
- if( (fp=fopen("db/castle_db.txt","r"))==NULL){
- printf("can't read db/castle_db.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
- for(j=0,p=line;j<6 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- gc->guild_id=0; // <Agit> Clear Data for Initialize
- gc->economy=0; gc->defense=0; gc->triggerE=0; gc->triggerD=0; gc->nextTime=0; gc->payTime=0;
- gc->createTime=0; gc->visibleC=0; gc->visibleG0=0; gc->visibleG1=0; gc->visibleG2=0;
- gc->visibleG3=0; gc->visibleG4=0; gc->visibleG5=0; gc->visibleG6=0; gc->visibleG7=0;
- gc->Ghp0=0; gc->Ghp1=0; gc->Ghp2=0; gc->Ghp3=0; gc->Ghp4=0; gc->Ghp5=0; gc->Ghp6=0; gc->Ghp7=0; // guardian HP [Valaris]
-
- gc->castle_id=atoi(str[0]);
- memcpy(gc->map_name,str[1],24);
- memcpy(gc->castle_name,str[2],24);
- memcpy(gc->castle_event,str[3],24);
-
- numdb_insert(castle_db,gc->castle_id,gc);
-
- //intif_guild_castle_info(gc->castle_id);
-
- ln++;
- }
- fclose(fp);
- printf("read db/castle_db.txt done (count=%d)\n",ln);
- return 0;
-}
-
-// ‰Šú‰»
-void do_init_guild(void)
-{
- guild_db=numdb_init();
- castle_db=numdb_init();
- guild_expcache_db=numdb_init();
- guild_infoevent_db=numdb_init();
- guild_castleinfoevent_db=numdb_init();
-
- guild_read_castledb();
-
- add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer");
- add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
- add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
-}
-
-
-// ŒŸõ
-struct guild *guild_search(int guild_id)
-{
- return numdb_search(guild_db,guild_id);
-}
-int guild_searchname_sub(void *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;
- numdb_foreach(guild_db,guild_searchname_sub,str,&g);
- return g;
-}
-struct guild_castle *guild_castle_search(int gcid)
-{
- return numdb_search(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;
-}
-
-// ƒƒ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);
-
- memset(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->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,24);
- 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(void *key,void *data,va_list ap)
-{
- int i, *dellist,*delp, dataid=(int)key;
- struct guild_expcache *c;
- struct guild *g;
-
- nullpo_retr(0, ap);
- nullpo_retr(0, c=(struct guild_expcache *)data);
- nullpo_retr(0, dellist=va_arg(ap,int *));
- nullpo_retr(0, delp=va_arg(ap,int *));
-
- if( *delp>=GUILD_PAYEXP_LIST || (g=guild_search(c->guild_id))==NULL )
- return 0;
- if( ( i=guild_getindex(g,c->account_id,c->char_id) )<0 )
- return 0;
-
- 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;
-
- dellist[(*delp)++]=dataid;
- free(c);
- return 0;
-}
-int guild_payexp_timer(int tid,unsigned int tick,int id,int data)
-{
- int dellist[GUILD_PAYEXP_LIST],delp=0,i;
- numdb_foreach(guild_expcache_db,guild_payexp_timer_sub,
- dellist,&delp);
- for(i=0;i<delp;i++)
- numdb_erase(guild_expcache_db,dellist[i]);
-// if(battle_config.etc_log)
-// printf("guild exp %d charactor's exp flushed !\n",delp);
- return 0;
-}
-
-//------------------------------------------------------------------------
-
-// 쬗v‹
-int guild_create(struct map_session_data *sd,char *name)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==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);
- } else
- clif_guild_created(sd,3); // ƒGƒ“ƒyƒŠƒEƒ€‚ª‚¢‚È‚¢
- }else
- clif_guild_created(sd,1); // ‚·‚Å‚ÉŠ‘®‚µ‚Ä‚¢‚é
-
- 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>0) {
- struct guild *g;
- sd->status.guild_id=guild_id;
- sd->guild_sended=0;
- if((g=numdb_search(guild_db,guild_id))!=NULL){
- printf("guild: id already exists!\n");
- exit(1);
- }
- clif_guild_created(sd,0);
- if(battle_config.guild_emperium_check)
- pc_delitem(sd,pc_search_inventory(sd,714),1,0); // ƒGƒ“ƒyƒŠƒEƒ€Á–Õ
- } else {
- clif_guild_created(sd,2); // 쬎¸”si“¯–¼ƒMƒ‹ƒh‘¶Ýj
- }
- 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(1,sizeof(struct eventlist));
- memcpy(ev->name,event,sizeof(ev->name));
- ev->next=(struct eventlist *)numdb_search(guild_infoevent_db,guild_id);
- numdb_insert(guild_infoevent_db,guild_id,ev);
- return guild_request_info(guild_id);
-}
-
-// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
-int guild_check_member(const struct guild *g)
-{
- int i;
- struct map_session_data *sd;
-
- nullpo_retr(0, g);
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
- if(sd->status.guild_id==g->guild_id){
- int j,f=1;
- for(j=0;j<MAX_GUILD;j++){ // ƒf[ƒ^‚ª‚ ‚é‚©
- if( g->member[j].account_id==sd->status.account_id &&
- g->member[j].char_id==sd->status.char_id)
- f=0;
- }
- if(f){
- sd->status.guild_id=0;
- sd->guild_sended=0;
- sd->guild_emblem_id=0;
- if(battle_config.error_log)
- printf("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;
- struct map_session_data *sd;
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
- 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=numdb_search(guild_db,sg->guild_id))==NULL){
- g=(struct guild *)aCalloc(1,sizeof(struct guild));
- numdb_insert(guild_db,sg->guild_id,g);
- before=*sg;
-
- // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
- guild_check_member(sg);
- }else
- before=*g;
- memcpy(g,sg,sizeof(struct 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);
- g->member[i].sd=(sd!=NULL &&
- sd->status.char_id==g->member[i].char_id &&
- sd->status.guild_id==g->guild_id)? 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->guild_sended==0){ // –¢‘—M‚Ȃ犑®î•ñ‚à‘—‚é
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
- sd->guild_emblem_id=g->emblem_id;
- sd->guild_sended=1;
- }
- }
-
- // ƒCƒxƒ“ƒg‚Ì”­¶
- if( (ev=numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){
- numdb_erase(guild_infoevent_db,sg->guild_id);
- for(;ev;ev2=ev->next,free(ev),ev=ev2){
- npc_event_do(ev->name);
- }
- }
-
- return 0;
-}
-
-
-// ƒMƒ‹ƒh‚Ö‚ÌŠ©—U
-int guild_invite(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd;
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- tsd= map_id2sd(account_id);
- 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 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
- 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 ));
-
- 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;
- if(tsd==NULL)
- return 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) && flag==0){
- // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
- if(battle_config.error_log)
- printf("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;
- }
- sd->guild_invite=0;
- sd->guild_invite_account=0;
-
- sd2=map_id2sd(sd->guild_invite_account);
-
- if(flag==1){ // Ž¸”s
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,3);
- return 0;
- }
-
- // ¬Œ÷
- sd->guild_sended=0;
- sd->status.guild_id=guild_id;
-
- if( sd2!=NULL )
- clif_guild_inviteack(sd2,2);
-
- // ‚¢‚¿‚¨‚¤‹£‡Šm”F
- guild_check_conflict(sd);
-
- 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)
- 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_explusion(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)
- 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);
- return 0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚ª’E‘Þ‚µ‚½
-int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
- const char *name,const char *mes)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct guild *g=guild_search(guild_id);
- int i;
-
- if(g!=NULL){
- int i;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id ){
- struct map_session_data *sd2=sd;
- if(sd2==NULL)
- sd2=guild_getavailablesd(g);
- else
- {
- if(flag==0)
- clif_guild_leave(sd2,name,mes);
- else
- clif_guild_explusion(sd2,name,mes,account_id);
- }
- g->member[i].account_id=0;
- g->member[i].sd=NULL;
- }
- }
- if(sd!=NULL && sd->status.guild_id==guild_id){
- sd->status.guild_id=0;
- sd->guild_emblem_id=0;
- sd->guild_sended=0;
- }
-
- // ƒƒ“ƒo[ƒŠƒXƒg‚ð‘Sˆõ‚ÉÄ’Ê’m
- for(i=0;i<g->max_member;i++){
- if( g->member[i].sd!=NULL )
- clif_guild_memberlist(g->member[i].sd);
- }
-
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV‘—M
-int guild_send_memberinfoshort(struct map_session_data *sd,int online)
-{
- struct guild *g;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id<=0)
- return 0;
- g=guild_search(sd->status.guild_id);
- if(g==NULL)
- 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 ){ // ƒƒOƒAƒEƒg‚·‚é‚È‚çsd‚ðƒNƒŠƒA‚µ‚ÄI—¹
- 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->guild_sended!=0 ) // ƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‚Í‘—MÏ‚Ý
- return 0;
-
- // ‹£‡Šm”F
- guild_check_conflict(sd);
-
- // ‚ ‚é‚È‚çƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‘—M
- if( (g=guild_search(sd->status.guild_id))!=NULL ){
- guild_check_member(g); // Š‘®‚ðŠm”F‚·‚é
- if(sd->status.guild_id==g->guild_id){
- clif_guild_belonginfo(sd,g);
- clif_guild_notice(sd,g);
- sd->guild_sended=1;
- sd->guild_emblem_id=g->emblem_id;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV’Ê’m
-int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class)
-{
- int i,alv,c,idx=0,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==g->max_member){
- if(battle_config.error_log)
- printf("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;
-
- if(oldonline!=online) // ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ª•Ï‚í‚Á‚½‚Ì‚Å’Ê’m
- clif_guild_memberlogin_notice(g,idx,online);
-
- for(i=0;i<g->max_member;i++){ // sdÄÝ’è
- struct map_session_data *sd= map_id2sd(g->member[i].account_id);
- g->member[i].sd=(sd!=NULL &&
- sd->status.char_id==g->member[i].char_id &&
- sd->status.guild_id==guild_id)?sd:NULL;
- }
-
- // ‚±‚±‚ɃNƒ‰ƒCƒAƒ“ƒg‚É‘—Mˆ—‚ª•K—v
-
- 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);
- 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);
- 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,24);
- 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);
- if(g==NULL)
- return 0;
- memcpy(&g->position[idx],p,sizeof(struct guild_position));
- clif_guild_positionchanged(g,idx);
- 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)
-{
- nullpo_retr(0, sd);
-
- 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;
-}
-
-// ƒMƒ‹ƒh‚ÌEXPã”[
-int guild_payexp(struct map_session_data *sd,int exp)
-{
- struct guild *g;
- struct guild_expcache *c;
- int per,exp2;
-
- nullpo_retr(0, sd);
-
- if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL )
- return 0;
- if( (per=g->position[guild_getposition(sd,g)].exp_mode)<=0 )
- return 0;
- if( per>100 )per=100;
-
- if( (exp2=exp*per/100)<=0 )
- return 0;
-
- if( (c=numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){
- c=(struct guild_expcache *)aCalloc(1,sizeof(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=exp2;
- numdb_insert(guild_expcache_db,c->char_id,c);
- }else{
- c->exp+=exp2;
- }
- return exp2;
-}
-
-// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
-int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
-{
- struct guild *g;
- int idx;
-
- nullpo_retr(0, sd);
-
- 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=skill_num-10000)].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-10000].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;
-}
-// ƒMƒ‹ƒh“¯–¿—v‹
-int guild_reqalliance(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
- 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;
-
- if( guild_get_alliance_count(g[0],0)>3 ) // “¯–¿”Šm”F
- clif_guild_allianceack(sd,4);
- if( guild_get_alliance_count(g[1],0)>3 )
- clif_guild_allianceack(sd,3);
-
- if( tsd->guild_alliance>0 ){ // ‘ŠŽè‚ª“¯–¿—v¿ó‘Ô‚©‚Ç‚¤‚©Šm”F
- 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);
- nullpo_retr(0, tsd= map_id2sd( account_id ));
-
- if(sd->guild_alliance!=tsd->status.guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
- return 0;
-
- if(flag==1){ // ³‘ø
- int i;
-
- struct guild *g; // “¯–¿”ÄŠm”F
- if( (g=guild_search(sd->status.guild_id))==NULL ||
- guild_get_alliance_count(g,0)>3 ){
- clif_guild_allianceack(sd,4);
- clif_guild_allianceack(tsd,3);
- return 0;
- }
- if( (g=guild_search(tsd->status.guild_id))==NULL ||
- guild_get_alliance_count(g,0)>3 ){
- clif_guild_allianceack(sd,3);
- clif_guild_allianceack(tsd,4);
- return 0;
- }
-
- // “G‘Ί֌W‚È‚ç“G‘΂ðŽ~‚ß‚é
- if((g=guild_search(sd->status.guild_id)) == NULL)
- 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 );
- }
- if((g=guild_search(tsd->status.guild_id)) == NULL)
- return 0;
- for(i=0;i<MAX_GUILDALLIANCE;i++){
- if( g->alliance[i].guild_id==sd->status.guild_id &&
- g->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)
-{
- 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]
-
- nullpo_retr(0, sd);
-
- 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,int char_id)
-{
- struct map_session_data *tsd=map_id2sd(char_id);
- struct guild *g;
- int i;
-
- nullpo_retr(0, sd);
-
- g=guild_search(sd->status.guild_id);
- if(g==NULL || tsd==NULL)
- return 0;
-
- if( guild_get_alliance_count(g,1)>3 ) // “G‘ΔŠm”F
- clif_guild_oppositionack(sd,1);
-
- 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;
- }else // “¯–¿”jŠü
- 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]={guild_id1,guild_id2};
- const char *guild_name[2]={name1,name2};
- struct map_session_data *sd[2]={map_id2sd(account_id1),map_id2sd(account_id2)};
- int j,i;
-
- 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],24);
- 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(void *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);
- g->alliance[i].guild_id=0;
- }
- }
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int guild_broken(int guild_id,int flag)
-{
- struct guild *g=guild_search(guild_id);
- struct map_session_data *sd;
- int i;
- if(flag!=0 || g==NULL)
- return 0;
-
- for(i=0;i<g->max_member;i++){ // ƒMƒ‹ƒh‰ðŽU‚ð’Ê’m
- if((sd=g->member[i].sd)!=NULL){
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,1);
- sd->status.guild_id=0;
- sd->guild_sended=0;
- clif_guild_broken(g->member[i].sd,0);
- }
- }
-
- numdb_foreach(guild_db,guild_broken_sub,guild_id);
- numdb_erase(guild_db,guild_id);
- guild_storage_delete(guild_id);
- free(g);
- return 0;
-}
-
-// ƒ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 *)aCalloc(1,sizeof(struct eventlist));
- memcpy(ev->name,name,sizeof(ev->name));
- ev->next=numdb_search(guild_castleinfoevent_db,code);
- numdb_insert(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; 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: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("guild_castledataloadack ERROR!! (Not found index=%d)\n", index);
- return 0;
- }
- if( (ev=numdb_search(guild_castleinfoevent_db,code))!=NULL ){
- numdb_erase(guild_castleinfoevent_db,code);
- for(;ev;ev2=ev->next,free(ev),ev=ev2){
- npc_event_do(ev->name);
- }
- }
- return 1;
-}
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX—v‹
-int guild_castledatasave(int castle_id,int index,int value)
-{
- 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: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break; // end additions [Valaris]
- default:
- printf("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);
-
- // ƒCƒxƒ“ƒg•t‚«‚Å—v‹‚·‚éƒf[ƒ^ˆÊ’u‚ð’T‚·(ÅŒã‚Ìè‹’ƒf[ƒ^)
- 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) {
- printf("guild_castlealldataload ??\n");
- 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)
- npc_event_doall("OnAgitInit");
- return 0;
-}
-
-int guild_agit_start(void)
-{ // Run All NPC_Event[OnAgitStart]
- int c = npc_event_doall("OnAgitStart");
- printf("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c);
- return 0;
-}
-
-int guild_agit_end(void)
-{ // Run All NPC_Event[OnAgitEnd]
- int c = npc_event_doall("OnAgitEnd");
- printf("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c);
- return 0;
-}
-
-int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
-{ // Run One NPC_Event[OnAgitEliminate]
- size_t len = strlen((const char*)data);
- char *evname=(char*)aCalloc(len + 4,sizeof(char));
- int c=0;
-
- if(!agit_flag) return 0; // Agit already End
- memcpy(evname,(const char *)data,len - 5);
- strcpy(evname + len - 5,"Eliminate");
- c = npc_event_do(evname);
- printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
- return 0;
-}
-
-int guild_agit_break(struct mob_data *md)
-{ // Run One NPC_Event[OnAgitBreak]
- char *evname;
-
- nullpo_retr(0, md);
-
- evname=(char *)aCalloc(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;
-}
-
-static int guild_db_final(void *key,void *data,va_list ap)
-{
- struct guild *g=data;
-
- free(g);
-
- return 0;
-}
-static int castle_db_final(void *key,void *data,va_list ap)
-{
- struct guild_castle *gc=data;
-
- free(gc);
-
- return 0;
-}
-static int guild_expcache_db_final(void *key,void *data,va_list ap)
-{
- struct guild_expcache *c=data;
-
- free(c);
-
- return 0;
-}
-static int guild_infoevent_db_final(void *key,void *data,va_list ap)
-{
- struct eventlist *ev=data;
-
- free(ev);
-
- return 0;
-}
-void do_final_guild(void)
-{
- if(guild_db)
- numdb_final(guild_db,guild_db_final);
- if(castle_db)
- numdb_final(castle_db,castle_db_final);
- if(guild_expcache_db)
- numdb_final(guild_expcache_db,guild_expcache_db_final);
- if(guild_infoevent_db)
- numdb_final(guild_infoevent_db,guild_infoevent_db_final);
- if(guild_castleinfoevent_db)
- numdb_final(guild_castleinfoevent_db,guild_infoevent_db_final);
-}
+// $Id: guild.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "guild.h"
+#include "storage.h"
+#include "db.h"
+#include "timer.h"
+#include "socket.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "battle.h"
+#include "npc.h"
+#include "pc.h"
+#include "map.h"
+#include "mob.h"
+#include "intif.h"
+#include "clif.h"
+#include "skill.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+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_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, exp;
+};
+
+// ƒMƒ‹ƒhƒXƒLƒ‹db‚̃AƒNƒZƒTi¡‚Í’¼‘Å‚¿‚Å‘ã—pj
+int guild_skill_get_inf(int id) { // Modified for new skills [Sara]
+ if (id==GD_BATTLEORDER) return 4;
+ else if (id==GD_REGENERATION) return 4;
+ else if (id==GD_RESTORE) return 4;
+ else if (id==GD_EMERGENCYCALL) return 4;
+ else return 0;
+}
+int guild_skill_get_sp(int id,int lv){ return 0; }
+int guild_skill_get_range(int id){ return 0; }
+int guild_skill_get_max(int id) { // Modified for new skills [Sara]
+ if (id==GD_EXTENSION) return 10;
+ else if (id==GD_REGENERATION) return 3;
+ else return 1;
+}
+
+// ƒMƒ‹ƒhƒXƒLƒ‹‚ª‚ ‚é‚©Šm”F
+int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; }
+
+
+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);
+
+
+static int guild_read_castledb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int j,ln=0;
+ char *str[32],*p;
+ struct guild_castle *gc;
+
+ if( (fp=fopen("db/castle_db.txt","r"))==NULL){
+ printf("can't read db/castle_db.txt\n");
+ return -1;
+ }
+
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(str,0,sizeof(str));
+ gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
+ for(j=0,p=line;j<6 && p;j++){
+ str[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+
+ gc->guild_id=0; // <Agit> Clear Data for Initialize
+ gc->economy=0; gc->defense=0; gc->triggerE=0; gc->triggerD=0; gc->nextTime=0; gc->payTime=0;
+ gc->createTime=0; gc->visibleC=0; gc->visibleG0=0; gc->visibleG1=0; gc->visibleG2=0;
+ gc->visibleG3=0; gc->visibleG4=0; gc->visibleG5=0; gc->visibleG6=0; gc->visibleG7=0;
+ gc->Ghp0=0; gc->Ghp1=0; gc->Ghp2=0; gc->Ghp3=0; gc->Ghp4=0; gc->Ghp5=0; gc->Ghp6=0; gc->Ghp7=0; // guardian HP [Valaris]
+
+ gc->castle_id=atoi(str[0]);
+ memcpy(gc->map_name,str[1],24);
+ memcpy(gc->castle_name,str[2],24);
+ memcpy(gc->castle_event,str[3],24);
+
+ numdb_insert(castle_db,gc->castle_id,gc);
+
+ //intif_guild_castle_info(gc->castle_id);
+
+ ln++;
+ }
+ fclose(fp);
+ printf("read db/castle_db.txt done (count=%d)\n",ln);
+ return 0;
+}
+
+// ‰Šú‰»
+void do_init_guild(void)
+{
+ guild_db=numdb_init();
+ castle_db=numdb_init();
+ guild_expcache_db=numdb_init();
+ guild_infoevent_db=numdb_init();
+ guild_castleinfoevent_db=numdb_init();
+
+ guild_read_castledb();
+
+ add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer");
+ add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
+ add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
+}
+
+
+// ŒŸõ
+struct guild *guild_search(int guild_id)
+{
+ return numdb_search(guild_db,guild_id);
+}
+int guild_searchname_sub(void *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;
+ numdb_foreach(guild_db,guild_searchname_sub,str,&g);
+ return g;
+}
+struct guild_castle *guild_castle_search(int gcid)
+{
+ return numdb_search(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;
+}
+
+// ƒƒ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);
+
+ memset(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->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,24);
+ 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(void *key,void *data,va_list ap)
+{
+ int i, *dellist,*delp, dataid=(int)key;
+ struct guild_expcache *c;
+ struct guild *g;
+
+ nullpo_retr(0, ap);
+ nullpo_retr(0, c=(struct guild_expcache *)data);
+ nullpo_retr(0, dellist=va_arg(ap,int *));
+ nullpo_retr(0, delp=va_arg(ap,int *));
+
+ if( *delp>=GUILD_PAYEXP_LIST || (g=guild_search(c->guild_id))==NULL )
+ return 0;
+ if( ( i=guild_getindex(g,c->account_id,c->char_id) )<0 )
+ return 0;
+
+ 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;
+
+ dellist[(*delp)++]=dataid;
+ free(c);
+ return 0;
+}
+int guild_payexp_timer(int tid,unsigned int tick,int id,int data)
+{
+ int dellist[GUILD_PAYEXP_LIST],delp=0,i;
+ numdb_foreach(guild_expcache_db,guild_payexp_timer_sub,
+ dellist,&delp);
+ for(i=0;i<delp;i++)
+ numdb_erase(guild_expcache_db,dellist[i]);
+// if(battle_config.etc_log)
+// printf("guild exp %d charactor's exp flushed !\n",delp);
+ return 0;
+}
+
+//------------------------------------------------------------------------
+
+// 쬗v‹
+int guild_create(struct map_session_data *sd,char *name)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id==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);
+ } else
+ clif_guild_created(sd,3); // ƒGƒ“ƒyƒŠƒEƒ€‚ª‚¢‚È‚¢
+ }else
+ clif_guild_created(sd,1); // ‚·‚Å‚ÉŠ‘®‚µ‚Ä‚¢‚é
+
+ 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>0) {
+ struct guild *g;
+ sd->status.guild_id=guild_id;
+ sd->guild_sended=0;
+ if((g=numdb_search(guild_db,guild_id))!=NULL){
+ printf("guild: id already exists!\n");
+ exit(1);
+ }
+ clif_guild_created(sd,0);
+ if(battle_config.guild_emperium_check)
+ pc_delitem(sd,pc_search_inventory(sd,714),1,0); // ƒGƒ“ƒyƒŠƒEƒ€Á–Õ
+ } else {
+ clif_guild_created(sd,2); // 쬎¸”si“¯–¼ƒMƒ‹ƒh‘¶Ýj
+ }
+ 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(1,sizeof(struct eventlist));
+ memcpy(ev->name,event,sizeof(ev->name));
+ ev->next=(struct eventlist *)numdb_search(guild_infoevent_db,guild_id);
+ numdb_insert(guild_infoevent_db,guild_id,ev);
+ return guild_request_info(guild_id);
+}
+
+// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
+int guild_check_member(const struct guild *g)
+{
+ int i;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, g);
+
+ for(i=0;i<fd_max;i++){
+ if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
+ if(sd->status.guild_id==g->guild_id){
+ int j,f=1;
+ for(j=0;j<MAX_GUILD;j++){ // ƒf[ƒ^‚ª‚ ‚é‚©
+ if( g->member[j].account_id==sd->status.account_id &&
+ g->member[j].char_id==sd->status.char_id)
+ f=0;
+ }
+ if(f){
+ sd->status.guild_id=0;
+ sd->guild_sended=0;
+ sd->guild_emblem_id=0;
+ if(battle_config.error_log)
+ printf("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;
+ struct map_session_data *sd;
+ for(i=0;i<fd_max;i++){
+ if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
+ 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=numdb_search(guild_db,sg->guild_id))==NULL){
+ g=(struct guild *)aCalloc(1,sizeof(struct guild));
+ numdb_insert(guild_db,sg->guild_id,g);
+ before=*sg;
+
+ // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
+ guild_check_member(sg);
+ }else
+ before=*g;
+ memcpy(g,sg,sizeof(struct 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);
+ g->member[i].sd=(sd!=NULL &&
+ sd->status.char_id==g->member[i].char_id &&
+ sd->status.guild_id==g->guild_id)? 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->guild_sended==0){ // –¢‘—M‚Ȃ犑®î•ñ‚à‘—‚é
+ clif_guild_belonginfo(sd,g);
+ clif_guild_notice(sd,g);
+ sd->guild_emblem_id=g->emblem_id;
+ sd->guild_sended=1;
+ }
+ }
+
+ // ƒCƒxƒ“ƒg‚Ì”­¶
+ if( (ev=numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){
+ numdb_erase(guild_infoevent_db,sg->guild_id);
+ for(;ev;ev2=ev->next,free(ev),ev=ev2){
+ npc_event_do(ev->name);
+ }
+ }
+
+ return 0;
+}
+
+
+// ƒMƒ‹ƒh‚Ö‚ÌŠ©—U
+int guild_invite(struct map_session_data *sd,int account_id)
+{
+ struct map_session_data *tsd;
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ tsd= map_id2sd(account_id);
+ 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 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
+ 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 ));
+
+ 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;
+ if(tsd==NULL)
+ return 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) && flag==0){
+ // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
+ if(battle_config.error_log)
+ printf("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;
+ }
+ sd->guild_invite=0;
+ sd->guild_invite_account=0;
+
+ sd2=map_id2sd(sd->guild_invite_account);
+
+ if(flag==1){ // Ž¸”s
+ if( sd2!=NULL )
+ clif_guild_inviteack(sd2,3);
+ return 0;
+ }
+
+ // ¬Œ÷
+ sd->guild_sended=0;
+ sd->status.guild_id=guild_id;
+
+ if( sd2!=NULL )
+ clif_guild_inviteack(sd2,2);
+
+ // ‚¢‚¿‚¨‚¤‹£‡Šm”F
+ guild_check_conflict(sd);
+
+ 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)
+ 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_explusion(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)
+ 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);
+ return 0;
+ }
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚ª’E‘Þ‚µ‚½
+int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
+ const char *name,const char *mes)
+{
+ struct map_session_data *sd=map_id2sd(account_id);
+ struct guild *g=guild_search(guild_id);
+ int i;
+
+ if(g!=NULL){
+ int i;
+ for(i=0;i<g->max_member;i++)
+ if( g->member[i].account_id==account_id &&
+ g->member[i].char_id==char_id ){
+ struct map_session_data *sd2=sd;
+ if(sd2==NULL)
+ sd2=guild_getavailablesd(g);
+ else
+ {
+ if(flag==0)
+ clif_guild_leave(sd2,name,mes);
+ else
+ clif_guild_explusion(sd2,name,mes,account_id);
+ }
+ g->member[i].account_id=0;
+ g->member[i].sd=NULL;
+ }
+ }
+ if(sd!=NULL && sd->status.guild_id==guild_id){
+ sd->status.guild_id=0;
+ sd->guild_emblem_id=0;
+ sd->guild_sended=0;
+ }
+
+ // ƒƒ“ƒo[ƒŠƒXƒg‚ð‘Sˆõ‚ÉÄ’Ê’m
+ for(i=0;i<g->max_member;i++){
+ if( g->member[i].sd!=NULL )
+ clif_guild_memberlist(g->member[i].sd);
+ }
+
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV‘—M
+int guild_send_memberinfoshort(struct map_session_data *sd,int online)
+{
+ struct guild *g;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id<=0)
+ return 0;
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL)
+ 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 ){ // ƒƒOƒAƒEƒg‚·‚é‚È‚çsd‚ðƒNƒŠƒA‚µ‚ÄI—¹
+ 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->guild_sended!=0 ) // ƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‚Í‘—MÏ‚Ý
+ return 0;
+
+ // ‹£‡Šm”F
+ guild_check_conflict(sd);
+
+ // ‚ ‚é‚È‚çƒMƒ‹ƒh‰Šú‘—Mƒf[ƒ^‘—M
+ if( (g=guild_search(sd->status.guild_id))!=NULL ){
+ guild_check_member(g); // Š‘®‚ðŠm”F‚·‚é
+ if(sd->status.guild_id==g->guild_id){
+ clif_guild_belonginfo(sd,g);
+ clif_guild_notice(sd,g);
+ sd->guild_sended=1;
+ sd->guild_emblem_id=g->emblem_id;
+ }
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‘Ô/LvXV’Ê’m
+int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class)
+{
+ int i,alv,c,idx=0,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==g->max_member){
+ if(battle_config.error_log)
+ printf("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;
+
+ if(oldonline!=online) // ƒIƒ“ƒ‰ƒCƒ“ó‘Ô‚ª•Ï‚í‚Á‚½‚Ì‚Å’Ê’m
+ clif_guild_memberlogin_notice(g,idx,online);
+
+ for(i=0;i<g->max_member;i++){ // sdÄÝ’è
+ struct map_session_data *sd= map_id2sd(g->member[i].account_id);
+ g->member[i].sd=(sd!=NULL &&
+ sd->status.char_id==g->member[i].char_id &&
+ sd->status.guild_id==guild_id)?sd:NULL;
+ }
+
+ // ‚±‚±‚ɃNƒ‰ƒCƒAƒ“ƒg‚É‘—Mˆ—‚ª•K—v
+
+ 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);
+ 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);
+ 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,24);
+ 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);
+ if(g==NULL)
+ return 0;
+ memcpy(&g->position[idx],p,sizeof(struct guild_position));
+ clif_guild_positionchanged(g,idx);
+ 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)
+{
+ nullpo_retr(0, sd);
+
+ 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;
+}
+
+// ƒMƒ‹ƒh‚ÌEXPã”[
+int guild_payexp(struct map_session_data *sd,int exp)
+{
+ struct guild *g;
+ struct guild_expcache *c;
+ int per,exp2;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL )
+ return 0;
+ if( (per=g->position[guild_getposition(sd,g)].exp_mode)<=0 )
+ return 0;
+ if( per>100 )per=100;
+
+ if( (exp2=exp*per/100)<=0 )
+ return 0;
+
+ if( (c=numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){
+ c=(struct guild_expcache *)aCalloc(1,sizeof(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=exp2;
+ numdb_insert(guild_expcache_db,c->char_id,c);
+ }else{
+ c->exp+=exp2;
+ }
+ return exp2;
+}
+
+// ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
+int guild_skillup(struct map_session_data *sd,int skill_num,int flag)
+{
+ struct guild *g;
+ int idx;
+
+ nullpo_retr(0, sd);
+
+ 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=skill_num-10000)].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-10000].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;
+}
+// ƒMƒ‹ƒh“¯–¿—v‹
+int guild_reqalliance(struct map_session_data *sd,int account_id)
+{
+ struct map_session_data *tsd= map_id2sd(account_id);
+ 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;
+
+ if( guild_get_alliance_count(g[0],0)>3 ) // “¯–¿”Šm”F
+ clif_guild_allianceack(sd,4);
+ if( guild_get_alliance_count(g[1],0)>3 )
+ clif_guild_allianceack(sd,3);
+
+ if( tsd->guild_alliance>0 ){ // ‘ŠŽè‚ª“¯–¿—v¿ó‘Ô‚©‚Ç‚¤‚©Šm”F
+ 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);
+ nullpo_retr(0, tsd= map_id2sd( account_id ));
+
+ if(sd->guild_alliance!=tsd->status.guild_id) // Š©—U‚ƃMƒ‹ƒhID‚ªˆá‚¤
+ return 0;
+
+ if(flag==1){ // ³‘ø
+ int i;
+
+ struct guild *g; // “¯–¿”ÄŠm”F
+ if( (g=guild_search(sd->status.guild_id))==NULL ||
+ guild_get_alliance_count(g,0)>3 ){
+ clif_guild_allianceack(sd,4);
+ clif_guild_allianceack(tsd,3);
+ return 0;
+ }
+ if( (g=guild_search(tsd->status.guild_id))==NULL ||
+ guild_get_alliance_count(g,0)>3 ){
+ clif_guild_allianceack(sd,3);
+ clif_guild_allianceack(tsd,4);
+ return 0;
+ }
+
+ // “G‘Ί֌W‚È‚ç“G‘΂ðŽ~‚ß‚é
+ if((g=guild_search(sd->status.guild_id)) == NULL)
+ 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 );
+ }
+ if((g=guild_search(tsd->status.guild_id)) == NULL)
+ return 0;
+ for(i=0;i<MAX_GUILDALLIANCE;i++){
+ if( g->alliance[i].guild_id==sd->status.guild_id &&
+ g->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)
+{
+ 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]
+
+ nullpo_retr(0, sd);
+
+ 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,int char_id)
+{
+ struct map_session_data *tsd=map_id2sd(char_id);
+ struct guild *g;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ g=guild_search(sd->status.guild_id);
+ if(g==NULL || tsd==NULL)
+ return 0;
+
+ if( guild_get_alliance_count(g,1)>3 ) // “G‘ΔŠm”F
+ clif_guild_oppositionack(sd,1);
+
+ 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;
+ }else // “¯–¿”jŠü
+ 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]={guild_id1,guild_id2};
+ const char *guild_name[2]={name1,name2};
+ struct map_session_data *sd[2]={map_id2sd(account_id1),map_id2sd(account_id2)};
+ int j,i;
+
+ 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],24);
+ 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(void *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);
+ g->alliance[i].guild_id=0;
+ }
+ }
+ return 0;
+}
+// ƒMƒ‹ƒh‰ðŽU’Ê’m
+int guild_broken(int guild_id,int flag)
+{
+ struct guild *g=guild_search(guild_id);
+ struct map_session_data *sd;
+ int i;
+ if(flag!=0 || g==NULL)
+ return 0;
+
+ for(i=0;i<g->max_member;i++){ // ƒMƒ‹ƒh‰ðŽU‚ð’Ê’m
+ if((sd=g->member[i].sd)!=NULL){
+ if(sd->state.storage_flag)
+ storage_guild_storage_quit(sd,1);
+ sd->status.guild_id=0;
+ sd->guild_sended=0;
+ clif_guild_broken(g->member[i].sd,0);
+ }
+ }
+
+ numdb_foreach(guild_db,guild_broken_sub,guild_id);
+ numdb_erase(guild_db,guild_id);
+ guild_storage_delete(guild_id);
+ free(g);
+ return 0;
+}
+
+// ƒ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 *)aCalloc(1,sizeof(struct eventlist));
+ memcpy(ev->name,name,sizeof(ev->name));
+ ev->next=numdb_search(guild_castleinfoevent_db,code);
+ numdb_insert(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; 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: gc->visibleG0 = value; break;
+ case 11: gc->visibleG1 = value; break;
+ case 12: gc->visibleG2 = value; break;
+ case 13: gc->visibleG3 = value; break;
+ case 14: gc->visibleG4 = value; break;
+ case 15: gc->visibleG5 = value; break;
+ case 16: gc->visibleG6 = value; break;
+ case 17: gc->visibleG7 = value; break;
+ case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
+ case 19: gc->Ghp1 = value; break;
+ case 20: gc->Ghp2 = value; break;
+ case 21: gc->Ghp3 = value; break;
+ case 22: gc->Ghp4 = value; break;
+ case 23: gc->Ghp5 = value; break;
+ case 24: gc->Ghp6 = value; break;
+ case 25: gc->Ghp7 = value; break; // end additions [Valaris]
+ default:
+ printf("guild_castledataloadack ERROR!! (Not found index=%d)\n", index);
+ return 0;
+ }
+ if( (ev=numdb_search(guild_castleinfoevent_db,code))!=NULL ){
+ numdb_erase(guild_castleinfoevent_db,code);
+ for(;ev;ev2=ev->next,free(ev),ev=ev2){
+ npc_event_do(ev->name);
+ }
+ }
+ return 1;
+}
+// ƒMƒ‹ƒhéƒf[ƒ^•ÏX—v‹
+int guild_castledatasave(int castle_id,int index,int value)
+{
+ 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: gc->visibleG0 = value; break;
+ case 11: gc->visibleG1 = value; break;
+ case 12: gc->visibleG2 = value; break;
+ case 13: gc->visibleG3 = value; break;
+ case 14: gc->visibleG4 = value; break;
+ case 15: gc->visibleG5 = value; break;
+ case 16: gc->visibleG6 = value; break;
+ case 17: gc->visibleG7 = value; break;
+ case 18: gc->Ghp0 = value; break; // guardian HP [Valaris]
+ case 19: gc->Ghp1 = value; break;
+ case 20: gc->Ghp2 = value; break;
+ case 21: gc->Ghp3 = value; break;
+ case 22: gc->Ghp4 = value; break;
+ case 23: gc->Ghp5 = value; break;
+ case 24: gc->Ghp6 = value; break;
+ case 25: gc->Ghp7 = value; break; // end additions [Valaris]
+ default:
+ printf("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);
+
+ // ƒCƒxƒ“ƒg•t‚«‚Å—v‹‚·‚éƒf[ƒ^ˆÊ’u‚ð’T‚·(ÅŒã‚Ìè‹’ƒf[ƒ^)
+ 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) {
+ printf("guild_castlealldataload ??\n");
+ 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)
+ npc_event_doall("OnAgitInit");
+ return 0;
+}
+
+int guild_agit_start(void)
+{ // Run All NPC_Event[OnAgitStart]
+ int c = npc_event_doall("OnAgitStart");
+ printf("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c);
+ return 0;
+}
+
+int guild_agit_end(void)
+{ // Run All NPC_Event[OnAgitEnd]
+ int c = npc_event_doall("OnAgitEnd");
+ printf("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c);
+ return 0;
+}
+
+int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
+{ // Run One NPC_Event[OnAgitEliminate]
+ size_t len = strlen((const char*)data);
+ char *evname=(char*)aCalloc(len + 4,sizeof(char));
+ int c=0;
+
+ if(!agit_flag) return 0; // Agit already End
+ memcpy(evname,(const char *)data,len - 5);
+ strcpy(evname + len - 5,"Eliminate");
+ c = npc_event_do(evname);
+ printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
+ return 0;
+}
+
+int guild_agit_break(struct mob_data *md)
+{ // Run One NPC_Event[OnAgitBreak]
+ char *evname;
+
+ nullpo_retr(0, md);
+
+ evname=(char *)aCalloc(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;
+}
+
+static int guild_db_final(void *key,void *data,va_list ap)
+{
+ struct guild *g=data;
+
+ free(g);
+
+ return 0;
+}
+static int castle_db_final(void *key,void *data,va_list ap)
+{
+ struct guild_castle *gc=data;
+
+ free(gc);
+
+ return 0;
+}
+static int guild_expcache_db_final(void *key,void *data,va_list ap)
+{
+ struct guild_expcache *c=data;
+
+ free(c);
+
+ return 0;
+}
+static int guild_infoevent_db_final(void *key,void *data,va_list ap)
+{
+ struct eventlist *ev=data;
+
+ free(ev);
+
+ return 0;
+}
+void do_final_guild(void)
+{
+ if(guild_db)
+ numdb_final(guild_db,guild_db_final);
+ if(castle_db)
+ numdb_final(castle_db,castle_db_final);
+ if(guild_expcache_db)
+ numdb_final(guild_expcache_db,guild_expcache_db_final);
+ if(guild_infoevent_db)
+ numdb_final(guild_infoevent_db,guild_infoevent_db_final);
+ if(guild_castleinfoevent_db)
+ numdb_final(guild_castleinfoevent_db,guild_infoevent_db_final);
+}
diff --git a/src/map/guild.h b/src/map/guild.h
index 46842464f..528605f7f 100644
--- a/src/map/guild.h
+++ b/src/map/guild.h
@@ -1,87 +1,87 @@
-// $Id: guild.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#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_inf(int id);
-int guild_skill_get_sp(int id,int lv);
-int guild_skill_get_range(int id);
-int guild_skill_get_max(int id);
-
-int guild_checkskill(struct guild *g,int id);
-int guild_checkcastles(struct guild *g); // [MouseJstr]
-int guild_isallied(struct guild *g, struct guild_castle *gc);
-
-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 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);
-int guild_payexp(struct map_session_data *sd,int exp);
-
-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,int account_id);
-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_explusion(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);
-int guild_reqalliance(struct map_session_data *sd,int account_id);
-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,int char_id);
-
-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_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_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
+// $Id: guild.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
+#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_inf(int id);
+int guild_skill_get_sp(int id,int lv);
+int guild_skill_get_range(int id);
+int guild_skill_get_max(int id);
+
+int guild_checkskill(struct guild *g,int id);
+int guild_checkcastles(struct guild *g); // [MouseJstr]
+int guild_isallied(struct guild *g, struct guild_castle *gc);
+
+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 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);
+int guild_payexp(struct map_session_data *sd,int exp);
+
+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,int account_id);
+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_explusion(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);
+int guild_reqalliance(struct map_session_data *sd,int account_id);
+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,int char_id);
+
+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_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_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.c b/src/map/intif.c
index 3c130623c..62a2bd761 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -1,1125 +1,1125 @@
-// $Id: intif.c,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#include <sys/types.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef _WIN32
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#endif
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "pc.h"
-#include "intif.h"
-#include "storage.h"
-#include "party.h"
-#include "guild.h"
-#include "pet.h"
-#include "nullpo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static const int packet_len_table[]={
- -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-extern int char_fd; // inter server‚Ìfd‚Íchar_fd‚ðŽg‚¤
-#define inter_fd (char_fd) // ƒGƒCƒŠƒAƒX
-
-//-----------------------------------------------------------------
-// inter server‚Ö‚Ì‘—M
-
-// pet
-int intif_create_pet(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)
-{
- WFIFOW(inter_fd,0) = 0x3080;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOW(inter_fd,10) = pet_class;
- WFIFOW(inter_fd,12) = pet_lv;
- WFIFOW(inter_fd,14) = pet_egg_id;
- WFIFOW(inter_fd,16) = pet_equip;
- WFIFOW(inter_fd,18) = intimate;
- WFIFOW(inter_fd,20) = hungry;
- WFIFOB(inter_fd,22) = rename_flag;
- WFIFOB(inter_fd,23) = incuvate;
- memcpy(WFIFOP(inter_fd,24),pet_name,24);
- WFIFOSET(inter_fd,48);
-
- return 0;
-}
-
-int intif_request_petdata(int account_id,int char_id,int pet_id)
-{
- WFIFOW(inter_fd,0) = 0x3081;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOL(inter_fd,10) = pet_id;
- WFIFOSET(inter_fd,14);
-
- return 0;
-}
-
-int intif_save_petdata(int account_id,struct s_pet *p)
-{
- WFIFOW(inter_fd,0) = 0x3082;
- WFIFOW(inter_fd,2) = sizeof(struct s_pet) + 8;
- WFIFOL(inter_fd,4) = account_id;
- memcpy(WFIFOP(inter_fd,8),p,sizeof(struct s_pet));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
-
- return 0;
-}
-
-int intif_delete_petdata(int pet_id)
-{
- WFIFOW(inter_fd,0) = 0x3083;
- WFIFOL(inter_fd,2) = pet_id;
- WFIFOSET(inter_fd,6);
-
- return 0;
-}
-
-// GMƒƒbƒZ[ƒW‚ð‘—M
-int intif_GMmessage(char* mes,int len,int flag)
-{
- int lp = (flag&0x10) ? 8 : 4;
- WFIFOW(inter_fd,0) = 0x3000;
- WFIFOW(inter_fd,2) = lp + len;
- WFIFOL(inter_fd,4) = 0x65756c62;
- memcpy(WFIFOP(inter_fd,lp), mes, len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- return 0;
-}
-
-// The transmission of Wisp/Page to inter-server (player not found on this server)
-int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) {
- nullpo_retr(0, sd);
-
- WFIFOW(inter_fd,0) = 0x3001;
- WFIFOW(inter_fd,2) = mes_len + 52;
- memcpy(WFIFOP(inter_fd,4), sd->status.name, 24);
- memcpy(WFIFOP(inter_fd,28), nick, 24);
- memcpy(WFIFOP(inter_fd,52), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- printf("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes);
-
- return 0;
-}
-
-// The reply of Wisp/page
-int intif_wis_replay(int id, int flag) {
- WFIFOW(inter_fd,0) = 0x3002;
- WFIFOL(inter_fd,2) = id;
- WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- WFIFOSET(inter_fd,7);
-
- if (battle_config.etc_log)
- printf("intif_wis_replay: id: %d, flag:%d\n", id, flag);
-
- return 0;
-}
-
-// The transmission of GM only Wisp/Page from server to inter-server
-int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes, int mes_len) {
- WFIFOW(inter_fd,0) = 0x3003;
- WFIFOW(inter_fd,2) = mes_len + 30;
- memcpy(WFIFOP(inter_fd,4), Wisp_name, 24);
- WFIFOW(inter_fd,28) = (short)min_gm_level;
- memcpy(WFIFOP(inter_fd,30), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- printf("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”‘—M
-int intif_saveaccountreg(struct map_session_data *sd) {
- int j,p;
-
- nullpo_retr(0, sd);
-
- WFIFOW(inter_fd,0) = 0x3004;
- WFIFOL(inter_fd,4) = sd->bl.id;
- for(j=0,p=8;j<sd->status.account_reg_num;j++,p+=36){
- memcpy(WFIFOP(inter_fd,p),sd->status.account_reg[j].str,32);
- WFIFOL(inter_fd,p+32)=sd->status.account_reg[j].value;
- }
- WFIFOW(inter_fd,2)=p;
- WFIFOSET(inter_fd,p);
- return 0;
-}
-// ƒAƒJƒEƒ“ƒg•Ï”—v‹
-int intif_request_accountreg(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- WFIFOW(inter_fd,0) = 0x3005;
- WFIFOL(inter_fd,2) = sd->bl.id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^—v‹
-int intif_request_storage(int account_id)
-{
- WFIFOW(inter_fd,0) = 0x3010;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ‘qŒÉƒf[ƒ^‘—M
-int intif_send_storage(struct storage *stor)
-{
- nullpo_retr(0, stor);
- WFIFOW(inter_fd,0) = 0x3011;
- WFIFOW(inter_fd,2) = sizeof(struct storage)+8;
- WFIFOL(inter_fd,4) = stor->account_id;
- memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_request_guild_storage(int account_id,int guild_id)
-{
- WFIFOW(inter_fd,0) = 0x3018;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = guild_id;
- WFIFOSET(inter_fd,10);
- return 0;
-}
-int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
-{
- WFIFOW(inter_fd,0) = 0x3019;
- WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
- WFIFOL(inter_fd,4) = account_id;
- WFIFOL(inter_fd,8) = gstor->guild_id;
- memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-// ƒp[ƒeƒB쬗v‹
-int intif_create_party(struct map_session_data *sd,char *name)
-{
- nullpo_retr(0, sd);
-
- WFIFOW(inter_fd,0) = 0x3020;
- WFIFOL(inter_fd,2) = sd->status.account_id;
- memcpy(WFIFOP(inter_fd, 6),name,24);
- memcpy(WFIFOP(inter_fd,30),sd->status.name,24);
- memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16);
- WFIFOW(inter_fd,70)= sd->status.base_level;
- WFIFOSET(inter_fd,72);
-// if(battle_config.etc_log)
-// printf("intif: create party\n");
- return 0;
-}
-// ƒp[ƒeƒBî•ñ—v‹
-int intif_request_partyinfo(int party_id)
-{
- WFIFOW(inter_fd,0) = 0x3021;
- WFIFOL(inter_fd,2) = party_id;
- WFIFOSET(inter_fd,6);
-// if(battle_config.etc_log)
-// printf("intif: request party info\n");
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ—v‹
-int intif_party_addmember(int party_id,int account_id)
-{
- struct map_session_data *sd;
- sd=map_id2sd(account_id);
-// if(battle_config.etc_log)
-// printf("intif: party add member %d %d\n",party_id,account_id);
- if(sd!=NULL){
- WFIFOW(inter_fd,0)=0x3022;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- memcpy(WFIFOP(inter_fd,10),sd->status.name,24);
- memcpy(WFIFOP(inter_fd,34),map[sd->bl.m].name,16);
- WFIFOW(inter_fd,50)=sd->status.base_level;
- WFIFOSET(inter_fd,52);
- }
- return 0;
-}
-// ƒp[ƒeƒBÝ’è•ÏX
-int intif_party_changeoption(int party_id,int account_id,int exp,int item)
-{
- WFIFOW(inter_fd,0)=0x3023;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOW(inter_fd,10)=exp;
- WFIFOW(inter_fd,12)=item;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ—v‹
-int intif_party_leave(int party_id,int account_id)
-{
-// if(battle_config.etc_log)
-// printf("intif: party leave %d %d\n",party_id,account_id);
- WFIFOW(inter_fd,0)=0x3024;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOSET(inter_fd,10);
- return 0;
-}
-// ƒp[ƒeƒBˆÚ“®—v‹
-int intif_party_changemap(struct map_session_data *sd,int online)
-{
- if(sd!=NULL){
- WFIFOW(inter_fd,0)=0x3025;
- WFIFOL(inter_fd,2)=sd->status.party_id;
- WFIFOL(inter_fd,6)=sd->status.account_id;
- memcpy(WFIFOP(inter_fd,10),map[sd->bl.m].name,16);
- WFIFOB(inter_fd,26)=online;
- WFIFOW(inter_fd,27)=sd->status.base_level;
- WFIFOSET(inter_fd,29);
- }
-// if(battle_config.etc_log)
-// printf("party: change map\n");
- return 0;
-}
-// ƒp[ƒeƒB[‰ðŽU—v‹
-int intif_break_party(int party_id)
-{
- WFIFOW(inter_fd,0)=0x3026;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒp[ƒeƒB‰ï˜b‘—M
-int intif_party_message(int party_id,int account_id,char *mes,int len)
-{
-// if(battle_config.etc_log)
-// printf("intif_party_message: %s\n",mes);
- WFIFOW(inter_fd,0)=0x3027;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=party_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-// ƒp[ƒeƒB‹£‡ƒ`ƒFƒbƒN—v‹
-int intif_party_checkconflict(int party_id,int account_id,char *nick)
-{
- WFIFOW(inter_fd,0)=0x3028;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- memcpy(WFIFOP(inter_fd,10),nick,24);
- WFIFOSET(inter_fd,34);
- return 0;
-}
-
-// ƒMƒ‹ƒh쬗v‹
-int intif_guild_create(const char *name,const struct guild_member *master)
-{
- nullpo_retr(0, master);
-
- WFIFOW(inter_fd,0)=0x3030;
- WFIFOW(inter_fd,2)=sizeof(struct guild_member)+32;
- WFIFOL(inter_fd,4)=master->account_id;
- memcpy(WFIFOP(inter_fd,8),name,24);
- memcpy(WFIFOP(inter_fd,32),master,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhî•ñ—v‹
-int intif_guild_request_info(int guild_id)
-{
- WFIFOW(inter_fd,0) = 0x3031;
- WFIFOL(inter_fd,2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
-int intif_guild_addmember(int guild_id,struct guild_member *m)
-{
- WFIFOW(inter_fd,0) = 0x3032;
- WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8;
- WFIFOL(inter_fd,4) = guild_id;
- memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú—v‹
-int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes)
-{
- WFIFOW(inter_fd, 0) = 0x3034;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = flag;
- memcpy(WFIFOP(inter_fd,15),mes,40);
- WFIFOSET(inter_fd,55);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‹µ/LvXV—v‹
-int intif_guild_memberinfoshort(int guild_id,
- int account_id,int char_id,int online,int lv,int class)
-{
- WFIFOW(inter_fd, 0) = 0x3035;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = online;
- WFIFOW(inter_fd,15) = lv;
- WFIFOW(inter_fd,17) = class;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int intif_guild_break(int guild_id)
-{
- WFIFOW(inter_fd, 0) = 0x3036;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜b‘—M
-int intif_guild_message(int guild_id,int account_id,char *mes,int len)
-{
- WFIFOW(inter_fd,0)=0x3037;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-// ƒMƒ‹ƒh‹£‡ƒ`ƒFƒbƒN—v‹
-int intif_guild_checkconflict(int guild_id,int account_id,int char_id)
-{
- WFIFOW(inter_fd, 0)=0x3038;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX—v‹
-int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len)
-{
- WFIFOW(inter_fd,0)=0x3039;
- WFIFOW(inter_fd,2)=len+10;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOW(inter_fd,8)=type;
- memcpy(WFIFOP(inter_fd,10),data,len);
- WFIFOSET(inter_fd,len+10);
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX—v‹
-int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id,
- int type,const void *data,int len)
-{
- WFIFOW(inter_fd, 0)=0x303a;
- WFIFOW(inter_fd, 2)=len+18;
- WFIFOL(inter_fd, 4)=guild_id;
- WFIFOL(inter_fd, 8)=account_id;
- WFIFOL(inter_fd,12)=char_id;
- WFIFOW(inter_fd,16)=type;
- memcpy(WFIFOP(inter_fd,18),data,len);
- WFIFOSET(inter_fd,len+18);
- return 0;
-}
-// ƒMƒ‹ƒh–ðE•ÏX—v‹
-int intif_guild_position(int guild_id,int idx,struct guild_position *p)
-{
- WFIFOW(inter_fd,0)=0x303b;
- WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=idx;
- memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
-int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag)
-{
- WFIFOW(inter_fd, 0)=0x303c;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=skill_num;
- WFIFOL(inter_fd,10)=account_id;
- //WFIFOL(inter_fd,14)=flag;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Ηv‹
-int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag)
-{
- WFIFOW(inter_fd, 0)=0x303d;
- WFIFOL(inter_fd, 2)=guild_id1;
- WFIFOL(inter_fd, 6)=guild_id2;
- WFIFOL(inter_fd,10)=account_id1;
- WFIFOL(inter_fd,14)=account_id2;
- WFIFOB(inter_fd,18)=flag;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX—v‹
-int intif_guild_notice(int guild_id,const char *mes1,const char *mes2)
-{
- WFIFOW(inter_fd,0)=0x303e;
- WFIFOL(inter_fd,2)=guild_id;
- memcpy(WFIFOP(inter_fd,6),mes1,60);
- memcpy(WFIFOP(inter_fd,66),mes2,120);
- WFIFOSET(inter_fd,186);
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
-int intif_guild_emblem(int guild_id,int len,const char *data)
-{
- if(guild_id<=0 || len<0 || len>2000)
- return 0;
- WFIFOW(inter_fd,0)=0x303f;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=0;
- memcpy(WFIFOP(inter_fd,12),data,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-//Œ»Ý‚̃Mƒ‹ƒhéè—̃Mƒ‹ƒh‚𒲂ׂé
-int intif_guild_castle_dataload(int castle_id,int index)
-{
- WFIFOW(inter_fd,0)=0x3040;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOSET(inter_fd,5);
- return 0;
-}
-
-//ƒMƒ‹ƒhéè—̃Mƒ‹ƒh•ÏX—v‹
-int intif_guild_castle_datasave(int castle_id,int index, int value)
-{
- WFIFOW(inter_fd,0)=0x3041;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOL(inter_fd,5)=value;
- WFIFOSET(inter_fd,9);
- return 0;
-}
-
-/*==========================================
- * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚Ìꊗv‹
- *------------------------------------------
- */
-int intif_charposreq(int account_id,char *name,int flag)
-{
- WFIFOW(inter_fd,0)=0x3090;
- WFIFOL(inter_fd,2)=account_id;
- memcpy(WFIFOP(inter_fd,6),name,24);
- WFIFOB(inter_fd,30)=flag;
- WFIFOSET(inter_fd,31);
- return 0;
-}
-
-/*==========================================
- * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚ÌꊂɈړ®‚·‚é
- * @jumpto
- *------------------------------------------
- */
-int intif_jumpto(int account_id,char *name)
-{
- intif_charposreq(account_id,name,1);
- //printf("intif_jumpto: %d %s\n",account_id,name);
- return 0;
-}
-
-/*==========================================
- * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚Ìꊕ\Ž¦‚·‚é
- * @where
- *------------------------------------------
- */
-int intif_where(int account_id,char *name)
-{
- intif_charposreq(account_id,name,0);
- //printf("intif_where: %d %s\n",account_id,name);
- return 0;
-}
-
-/*==========================================
- * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚ðŒÄ‚ÑŠñ‚¹‚é
- * flag=0 ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢
- * flag=1 @recall
- *------------------------------------------
- */
-int intif_charmovereq(struct map_session_data *sd,char *name,int flag)
-{
- nullpo_retr(0,sd);
-
- //printf("intif_charmovereq: %d %s\n",sd->status.account_id,name);
- if(name==NULL)
- return -1;
-
- WFIFOW(inter_fd,0)=0x3092;
- WFIFOL(inter_fd,2)=sd->status.account_id;
- memcpy(WFIFOP(inter_fd,6),name,24);
- WFIFOB(inter_fd,30)=flag;
- memcpy(WFIFOP(inter_fd,31),sd->mapname,16);
- WFIFOW(inter_fd,47)=sd->bl.x;
- WFIFOW(inter_fd,49)=sd->bl.y;
- WFIFOSET(inter_fd,51);
- return 0;
-}
-/*==========================================
- * ‘ÎÛID‚ɃƒbƒZ[ƒW‚ð‘—M
- *------------------------------------------
- */
-int intif_displaymessage(int account_id, char* mes)
-{
- int len = 6+strlen(mes)+1;
- WFIFOW(inter_fd,0) = 0x3093;
- WFIFOW(inter_fd,2) = len;
- WFIFOL(inter_fd,4) = account_id;
- strncpy(WFIFOP(inter_fd,8), mes, len-6);
- WFIFOSET(inter_fd, len );
-
- return 0;
-}
-//-----------------------------------------------------------------
-// Packets receive from inter server
-
-// Wisp/Page reception
-int intif_parse_WisMessage(int fd) { // rewritten by [Yor]
- struct map_session_data* sd;
- int id=RFIFOL(fd,4);
- int i=0; //,j=0;
-
-// if(battle_config.etc_log)
-// printf("intif_parse_wismessage: %d %s %s %s\n",id,RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54) );
-
- sd=map_nick2sd(RFIFOP(fd,32)); // ‘—Mæ‚ð’T‚·
- if(sd!=NULL && strcmp(sd->status.name, RFIFOP(fd,32)) == 0){
-/*
- for(i=0;i<MAX_WIS_REFUSAL;i++){ //‹‘”ÛƒŠƒXƒg‚É–¼‘O‚ª‚ ‚é‚©‚Ç‚¤‚©”»’肵‚Ä‚ ‚ê‚΋‘”Û
- if(strcmp(sd->wis_refusal[i],RFIFOP(fd,8))==0){
- j++;
- break;
- }
- }
-*/
- if(sd->ignoreAll == 1)
- intif_wis_replay(RFIFOL(fd,4), 2); // ŽóM‹‘”Û
-/*
- else if(j>0)
- intif_wis_replay(id,2); // ŽóM‹‘”Û
-
- else{
-*/
- if(i == MAX_IGNORE_LIST) {
- clif_wis_message(sd->fd,RFIFOP(fd,8),RFIFOP(fd,56),RFIFOW(fd,2)-56);
- intif_wis_replay(RFIFOL(fd,4),0); // ‘—M¬Œ÷
- }
- }else
- intif_wis_replay(id,1); // ‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ
- return 0;
-}
-
-// Wisp/page transmission result reception
-int intif_parse_WisEnd(int fd) {
- struct map_session_data* sd;
-
- if (battle_config.etc_log)
- printf("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- sd = map_nick2sd(RFIFOP(fd,2));
- if (sd != NULL)
- clif_wis_end(sd->fd, RFIFOB(fd,26));
-
- return 0;
-}
-
-// Received wisp message from map-server via char-server for ALL gm
-int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- int i, min_gm_level;
- struct map_session_data *pl_sd;
- char Wisp_name[24];
- char mbuf[255];
- char *message = ((RFIFOW(fd,2) - 30) >= sizeof(mbuf)) ? (char *) malloc((RFIFOW(fd,2) - 30)) : mbuf;
-
- min_gm_level = (int)RFIFOW(fd,28);
- memcpy(Wisp_name, RFIFOP(fd,4), 24);
- Wisp_name[23] = '\0';
- memcpy(message, RFIFOP(fd,30), RFIFOW(fd,2) - 30);
- message[sizeof(message) - 1] = '\0';
- // information is sended to all online GM
- for (i = 0; i < fd_max; i++)
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth)
- if (pc_isGM(pl_sd) >= min_gm_level)
- clif_wis_message(i, Wisp_name, message, strlen(message) + 1);
-
- if (message != mbuf)
- free(message);
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
-int intif_parse_AccountReg(int fd) {
- int j,p;
- struct map_session_data *sd;
-
- if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL )
- return 1;
- for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG_NUM;p+=36,j++){
- memcpy(sd->status.account_reg[j].str,RFIFOP(fd,p),32);
- sd->status.account_reg[j].value=RFIFOL(fd,p+32);
- }
- sd->status.account_reg_num = j;
-// printf("intif: accountreg\n");
-
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^ŽóM
-int intif_parse_LoadStorage(int fd) {
- struct storage *stor;
- struct map_session_data *sd;
-
- stor = account2storage( RFIFOL(fd,4));
- if (RFIFOW(fd,2)-8 != sizeof(struct storage)) {
- if (battle_config.error_log)
- printf("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage));
- return 1;
- }
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- printf("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
- if(battle_config.save_log)
- printf("intif_openstorage: %d\n",RFIFOL(fd,4) );
- memcpy(stor,RFIFOP(fd,8),sizeof(struct storage));
- stor->storage_status=1;
- sd->state.storage_flag = 0;
- clif_storageitemlist(sd,stor);
- clif_storageequiplist(sd,stor);
- clif_updatestorageamount(sd,stor);
-
- return 0;
-}
-
-// ‘qŒÉƒf[ƒ^‘—M¬Œ÷
-int intif_parse_SaveStorage(int fd)
-{
- if(battle_config.save_log)
- printf("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) );
- return 0;
-}
-
-int intif_parse_LoadGuildStorage(int fd)
-{
- struct guild_storage *gstor;
- struct map_session_data *sd;
- int guild_id = RFIFOL(fd,8);
- if(guild_id > 0) {
- gstor=guild2storage(guild_id);
- if(!gstor) {
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id);
- return 1;
- }
- if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){
- gstor->storage_status = 0;
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage));
- return 1;
- }
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- printf("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
- if(battle_config.save_log)
- printf("intif_open_guild_storage: %d\n",RFIFOL(fd,4) );
- memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage));
- gstor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_guildstorageitemlist(sd,gstor);
- clif_guildstorageequiplist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- }
- return 0;
-}
-int intif_parse_SaveGuildStorage(int fd)
-{
- if(battle_config.save_log) {
- printf("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) );
- }
- return 0;
-}
-
-// ƒp[ƒeƒB쬉”Û
-int intif_parse_PartyCreated(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party created\n");
- party_created(RFIFOL(fd,2),RFIFOB(fd,6),RFIFOL(fd,7),RFIFOP(fd,11));
- return 0;
-}
-// ƒp[ƒeƒBî•ñ
-int intif_parse_PartyInfo(int fd)
-{
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- printf("intif: party noinfo %d\n",RFIFOL(fd,4));
- party_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// printf("intif: party info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){
- if(battle_config.error_log)
- printf("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4);
- }
- party_recv_info((struct party *)RFIFOP(fd,4));
- return 0;
-}
-// ƒp[ƒeƒB’ljÁ’Ê’m
-int intif_parse_PartyMemberAdded(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party member added %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
- party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
- return 0;
-}
-// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
-int intif_parse_PartyOptionChanged(int fd)
-{
- party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14));
- return 0;
-}
-// ƒp[ƒeƒB’E‘Þ’Ê’m
-int intif_parse_PartyMemberLeaved(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: party member leaved %d %d %s\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10));
- party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10));
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int intif_parse_PartyBroken(int fd)
-{
- party_broken(RFIFOL(fd,2));
- return 0;
-}
-// ƒp[ƒeƒBˆÚ“®’Ê’m
-int intif_parse_PartyMove(int fd)
-{
-// if(battle_config.etc_log)
-// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
- party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW
-int intif_parse_PartyMessage(int fd)
-{
-// if(battle_config.etc_log)
-// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
- party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-
-// ƒMƒ‹ƒh쬉”Û
-int intif_parse_GuildCreated(int fd)
-{
- guild_created(RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-// ƒMƒ‹ƒhî•ñ
-int intif_parse_GuildInfo(int fd)
-{
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- printf("intif: guild noinfo %d\n",RFIFOL(fd,4));
- guild_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// if(battle_config.etc_log)
-// printf("intif: guild info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){
- if(battle_config.error_log)
- printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4);
- }
- guild_recv_info((struct guild *)RFIFOP(fd,4));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ’Ê’m
-int intif_parse_GuildMemberAdded(int fd)
-{
- if(battle_config.etc_log)
- printf("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú’Ê’m
-int intif_parse_GuildMemberLeaved(int fd)
-{
- guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),
- RFIFOP(fd,55),RFIFOP(fd,15));
- return 0;
-}
-
-// ƒMƒ‹ƒhƒƒ“ƒoƒIƒ“ƒ‰ƒCƒ“ó‘Ô/Lv•ÏX’Ê’m
-int intif_parse_GuildMemberInfoShort(int fd)
-{
- guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17));
- return 0;
-}
-// ƒMƒ‹ƒh‰ðŽU’Ê’m
-int intif_parse_GuildBroken(int fd)
-{
- guild_broken(RFIFOL(fd,2),RFIFOB(fd,6));
- return 0;
-}
-
-// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
-int intif_parse_GuildBasicInfoChanged(int fd)
-{
- int type=RFIFOW(fd,8),guild_id=RFIFOL(fd,4);
- void *data=RFIFOP(fd,10);
- struct guild *g=guild_search(guild_id);
- short dw=*((short *)data);
- int dd=*((int *)data);
- if( g==NULL )
- return 0;
- switch(type){
- case GBI_EXP: g->exp=dd; break;
- case GBI_GUILDLV: g->guild_lv=dw; break;
- case GBI_SKILLPOINT: g->skill_point=dd; break;
- }
- return 0;
-}
-// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
-int intif_parse_GuildMemberInfoChanged(int fd)
-{
- int type=RFIFOW(fd,16),guild_id=RFIFOL(fd,4);
- int account_id=RFIFOL(fd,8),char_id=RFIFOL(fd,12);
- void *data=RFIFOP(fd,18);
- struct guild *g=guild_search(guild_id);
- int idx,dd=*((int *)data);
- if( g==NULL )
- return 0;
- idx=guild_getindex(g,account_id,char_id);
- switch(type){
- case GMI_POSITION:
- g->member[idx].position=dd;
- guild_memberposition_changed(g,idx,dd);
- break;
- case GMI_EXP:
- g->member[idx].exp=dd;
- break;
- }
- return 0;
-}
-
-// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
-int intif_parse_GuildPosition(int fd)
-{
- if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){
- if(battle_config.error_log)
- printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12);
- }
- guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12));
- return 0;
-}
-// ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
-int intif_parse_GuildSkillUp(int fd)
-{
- guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
-int intif_parse_GuildAlliance(int fd)
-{
- guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),
- RFIFOB(fd,18),RFIFOP(fd,19),RFIFOP(fd,43));
- return 0;
-}
-// ƒMƒ‹ƒh’m•ÏX’Ê’m
-int intif_parse_GuildNotice(int fd)
-{
- guild_notice_changed(RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66));
- return 0;
-}
-// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
-int intif_parse_GuildEmblem(int fd)
-{
- guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12));
- return 0;
-}
-// ƒMƒ‹ƒh‰ï˜bŽóM
-int intif_parse_GuildMessage(int fd)
-{
- guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
-int intif_parse_GuildCastleDataLoad(int fd)
-{
- return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
-int intif_parse_GuildCastleDataSave(int fd)
-{
- return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-
-// ƒMƒ‹ƒhéƒf[ƒ^ˆêŠ‡ŽóM(‰Šú‰»Žž)
-int intif_parse_GuildCastleAllDataLoad(int fd)
-{
- return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4));
-}
-
-// pet
-int intif_parse_CreatePet(int fd)
-{
- pet_get_egg(RFIFOL(fd,2),RFIFOL(fd,7),RFIFOB(fd,6));
-
- return 0;
-}
-
-int intif_parse_RecvPetData(int fd)
-{
- struct s_pet p;
- int len=RFIFOW(fd,2);
- if(sizeof(struct s_pet)!=len-9) {
- if(battle_config.etc_log)
- printf("intif: pet data: data size error %d %d\n",sizeof(struct s_pet),len-9);
- }
- else{
- memcpy(&p,RFIFOP(fd,9),sizeof(struct s_pet));
- pet_recv_petdata(RFIFOL(fd,4),&p,RFIFOB(fd,8));
- }
-
- return 0;
-}
-int intif_parse_SavePetOk(int fd)
-{
- if(RFIFOB(fd,6) == 1) {
- if(battle_config.error_log)
- printf("pet data save failure\n");
- }
-
- return 0;
-}
-
-int intif_parse_DeletePetOk(int fd)
-{
- if(RFIFOB(fd,2) == 1) {
- if(battle_config.error_log)
- printf("pet data delete failure\n");
- }
-
- return 0;
-}
-//-----------------------------------------------------------------
-// inter server‚©‚ç‚Ì’ÊM
-// ƒGƒ‰[‚ª‚ ‚ê‚Î0(false)‚ð•Ô‚·‚±‚Æ
-// ƒpƒPƒbƒg‚ªˆ—‚Å‚«‚ê‚Î1,ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð•Ô‚·‚±‚Æ
-int intif_parse(int fd)
-{
- int packet_len;
- int cmd = RFIFOW(fd,0);
- // ƒpƒPƒbƒg‚ÌIDŠm”F
- if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) ||
- packet_len_table[cmd-0x3800]==0){
- return 0;
- }
- // ƒpƒPƒbƒg‚Ì’·‚³Šm”F
- packet_len = packet_len_table[cmd-0x3800];
- if(packet_len==-1){
- if(RFIFOREST(fd)<4)
- return 2;
- packet_len = RFIFOW(fd,2);
- }
-// if(battle_config.etc_log)
-// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
- if(RFIFOREST(fd)<packet_len){
- return 2;
- }
- // ˆ—•ªŠò
- switch(cmd){
- case 0x3800: clif_GMmessage(NULL,RFIFOP(fd,4),packet_len-4,0); break;
- case 0x3801: intif_parse_WisMessage(fd); break;
- case 0x3802: intif_parse_WisEnd(fd); break;
- case 0x3803: mapif_parse_WisToGM(fd); break;
- case 0x3804: intif_parse_AccountReg(fd); break;
- case 0x3810: intif_parse_LoadStorage(fd); break;
- case 0x3811: intif_parse_SaveStorage(fd); break;
- case 0x3818: intif_parse_LoadGuildStorage(fd); break;
- case 0x3819: intif_parse_SaveGuildStorage(fd); break;
- case 0x3820: intif_parse_PartyCreated(fd); break;
- case 0x3821: intif_parse_PartyInfo(fd); break;
- case 0x3822: intif_parse_PartyMemberAdded(fd); break;
- case 0x3823: intif_parse_PartyOptionChanged(fd); break;
- case 0x3824: intif_parse_PartyMemberLeaved(fd); break;
- case 0x3825: intif_parse_PartyMove(fd); break;
- case 0x3826: intif_parse_PartyBroken(fd); break;
- case 0x3827: intif_parse_PartyMessage(fd); break;
- case 0x3830: intif_parse_GuildCreated(fd); break;
- case 0x3831: intif_parse_GuildInfo(fd); break;
- case 0x3832: intif_parse_GuildMemberAdded(fd); break;
- case 0x3834: intif_parse_GuildMemberLeaved(fd); break;
- case 0x3835: intif_parse_GuildMemberInfoShort(fd); break;
- case 0x3836: intif_parse_GuildBroken(fd); break;
- case 0x3837: intif_parse_GuildMessage(fd); break;
- case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break;
- case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break;
- case 0x383b: intif_parse_GuildPosition(fd); break;
- case 0x383c: intif_parse_GuildSkillUp(fd); break;
- case 0x383d: intif_parse_GuildAlliance(fd); break;
- case 0x383e: intif_parse_GuildNotice(fd); break;
- case 0x383f: intif_parse_GuildEmblem(fd); break;
- case 0x3840: intif_parse_GuildCastleDataLoad(fd); break;
- case 0x3841: intif_parse_GuildCastleDataSave(fd); break;
- case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break;
- case 0x3880: intif_parse_CreatePet(fd); break;
- case 0x3881: intif_parse_RecvPetData(fd); break;
- case 0x3882: intif_parse_SavePetOk(fd); break;
- case 0x3883: intif_parse_DeletePetOk(fd); break;
- default:
- if(battle_config.error_log)
- printf("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0));
- return 0;
- }
- // ƒpƒPƒbƒg“Ç‚Ý”ò‚΂µ
- RFIFOSKIP(fd,packet_len);
- return 1;
-}
+// $Id: intif.c,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
+#include <sys/types.h>
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#endif
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "socket.h"
+#include "timer.h"
+#include "map.h"
+#include "battle.h"
+#include "chrif.h"
+#include "clif.h"
+#include "pc.h"
+#include "intif.h"
+#include "storage.h"
+#include "party.h"
+#include "guild.h"
+#include "pet.h"
+#include "nullpo.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+static const int packet_len_table[]={
+ -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+extern int char_fd; // inter server‚Ìfd‚Íchar_fd‚ðŽg‚¤
+#define inter_fd (char_fd) // ƒGƒCƒŠƒAƒX
+
+//-----------------------------------------------------------------
+// inter server‚Ö‚Ì‘—M
+
+// pet
+int intif_create_pet(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)
+{
+ WFIFOW(inter_fd,0) = 0x3080;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = char_id;
+ WFIFOW(inter_fd,10) = pet_class;
+ WFIFOW(inter_fd,12) = pet_lv;
+ WFIFOW(inter_fd,14) = pet_egg_id;
+ WFIFOW(inter_fd,16) = pet_equip;
+ WFIFOW(inter_fd,18) = intimate;
+ WFIFOW(inter_fd,20) = hungry;
+ WFIFOB(inter_fd,22) = rename_flag;
+ WFIFOB(inter_fd,23) = incuvate;
+ memcpy(WFIFOP(inter_fd,24),pet_name,24);
+ WFIFOSET(inter_fd,48);
+
+ return 0;
+}
+
+int intif_request_petdata(int account_id,int char_id,int pet_id)
+{
+ WFIFOW(inter_fd,0) = 0x3081;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = char_id;
+ WFIFOL(inter_fd,10) = pet_id;
+ WFIFOSET(inter_fd,14);
+
+ return 0;
+}
+
+int intif_save_petdata(int account_id,struct s_pet *p)
+{
+ WFIFOW(inter_fd,0) = 0x3082;
+ WFIFOW(inter_fd,2) = sizeof(struct s_pet) + 8;
+ WFIFOL(inter_fd,4) = account_id;
+ memcpy(WFIFOP(inter_fd,8),p,sizeof(struct s_pet));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+
+ return 0;
+}
+
+int intif_delete_petdata(int pet_id)
+{
+ WFIFOW(inter_fd,0) = 0x3083;
+ WFIFOL(inter_fd,2) = pet_id;
+ WFIFOSET(inter_fd,6);
+
+ return 0;
+}
+
+// GMƒƒbƒZ[ƒW‚ð‘—M
+int intif_GMmessage(char* mes,int len,int flag)
+{
+ int lp = (flag&0x10) ? 8 : 4;
+ WFIFOW(inter_fd,0) = 0x3000;
+ WFIFOW(inter_fd,2) = lp + len;
+ WFIFOL(inter_fd,4) = 0x65756c62;
+ memcpy(WFIFOP(inter_fd,lp), mes, len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+
+ return 0;
+}
+
+// The transmission of Wisp/Page to inter-server (player not found on this server)
+int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) {
+ nullpo_retr(0, sd);
+
+ WFIFOW(inter_fd,0) = 0x3001;
+ WFIFOW(inter_fd,2) = mes_len + 52;
+ memcpy(WFIFOP(inter_fd,4), sd->status.name, 24);
+ memcpy(WFIFOP(inter_fd,28), nick, 24);
+ memcpy(WFIFOP(inter_fd,52), mes, mes_len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+
+ if (battle_config.etc_log)
+ printf("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes);
+
+ return 0;
+}
+
+// The reply of Wisp/page
+int intif_wis_replay(int id, int flag) {
+ WFIFOW(inter_fd,0) = 0x3002;
+ WFIFOL(inter_fd,2) = id;
+ WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ WFIFOSET(inter_fd,7);
+
+ if (battle_config.etc_log)
+ printf("intif_wis_replay: id: %d, flag:%d\n", id, flag);
+
+ return 0;
+}
+
+// The transmission of GM only Wisp/Page from server to inter-server
+int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes, int mes_len) {
+ WFIFOW(inter_fd,0) = 0x3003;
+ WFIFOW(inter_fd,2) = mes_len + 30;
+ memcpy(WFIFOP(inter_fd,4), Wisp_name, 24);
+ WFIFOW(inter_fd,28) = (short)min_gm_level;
+ memcpy(WFIFOP(inter_fd,30), mes, mes_len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+
+ if (battle_config.etc_log)
+ printf("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes);
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”‘—M
+int intif_saveaccountreg(struct map_session_data *sd) {
+ int j,p;
+
+ nullpo_retr(0, sd);
+
+ WFIFOW(inter_fd,0) = 0x3004;
+ WFIFOL(inter_fd,4) = sd->bl.id;
+ for(j=0,p=8;j<sd->status.account_reg_num;j++,p+=36){
+ memcpy(WFIFOP(inter_fd,p),sd->status.account_reg[j].str,32);
+ WFIFOL(inter_fd,p+32)=sd->status.account_reg[j].value;
+ }
+ WFIFOW(inter_fd,2)=p;
+ WFIFOSET(inter_fd,p);
+ return 0;
+}
+// ƒAƒJƒEƒ“ƒg•Ï”—v‹
+int intif_request_accountreg(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ WFIFOW(inter_fd,0) = 0x3005;
+ WFIFOL(inter_fd,2) = sd->bl.id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+
+// ‘qŒÉƒf[ƒ^—v‹
+int intif_request_storage(int account_id)
+{
+ WFIFOW(inter_fd,0) = 0x3010;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ‘qŒÉƒf[ƒ^‘—M
+int intif_send_storage(struct storage *stor)
+{
+ nullpo_retr(0, stor);
+ WFIFOW(inter_fd,0) = 0x3011;
+ WFIFOW(inter_fd,2) = sizeof(struct storage)+8;
+ WFIFOL(inter_fd,4) = stor->account_id;
+ memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) );
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+int intif_request_guild_storage(int account_id,int guild_id)
+{
+ WFIFOW(inter_fd,0) = 0x3018;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = guild_id;
+ WFIFOSET(inter_fd,10);
+ return 0;
+}
+int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
+{
+ WFIFOW(inter_fd,0) = 0x3019;
+ WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
+ WFIFOL(inter_fd,4) = account_id;
+ WFIFOL(inter_fd,8) = gstor->guild_id;
+ memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+// ƒp[ƒeƒB쬗v‹
+int intif_create_party(struct map_session_data *sd,char *name)
+{
+ nullpo_retr(0, sd);
+
+ WFIFOW(inter_fd,0) = 0x3020;
+ WFIFOL(inter_fd,2) = sd->status.account_id;
+ memcpy(WFIFOP(inter_fd, 6),name,24);
+ memcpy(WFIFOP(inter_fd,30),sd->status.name,24);
+ memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16);
+ WFIFOW(inter_fd,70)= sd->status.base_level;
+ WFIFOSET(inter_fd,72);
+// if(battle_config.etc_log)
+// printf("intif: create party\n");
+ return 0;
+}
+// ƒp[ƒeƒBî•ñ—v‹
+int intif_request_partyinfo(int party_id)
+{
+ WFIFOW(inter_fd,0) = 0x3021;
+ WFIFOL(inter_fd,2) = party_id;
+ WFIFOSET(inter_fd,6);
+// if(battle_config.etc_log)
+// printf("intif: request party info\n");
+ return 0;
+}
+// ƒp[ƒeƒB’ljÁ—v‹
+int intif_party_addmember(int party_id,int account_id)
+{
+ struct map_session_data *sd;
+ sd=map_id2sd(account_id);
+// if(battle_config.etc_log)
+// printf("intif: party add member %d %d\n",party_id,account_id);
+ if(sd!=NULL){
+ WFIFOW(inter_fd,0)=0x3022;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ memcpy(WFIFOP(inter_fd,10),sd->status.name,24);
+ memcpy(WFIFOP(inter_fd,34),map[sd->bl.m].name,16);
+ WFIFOW(inter_fd,50)=sd->status.base_level;
+ WFIFOSET(inter_fd,52);
+ }
+ return 0;
+}
+// ƒp[ƒeƒBÝ’è•ÏX
+int intif_party_changeoption(int party_id,int account_id,int exp,int item)
+{
+ WFIFOW(inter_fd,0)=0x3023;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOW(inter_fd,10)=exp;
+ WFIFOW(inter_fd,12)=item;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// ƒp[ƒeƒB’E‘Þ—v‹
+int intif_party_leave(int party_id,int account_id)
+{
+// if(battle_config.etc_log)
+// printf("intif: party leave %d %d\n",party_id,account_id);
+ WFIFOW(inter_fd,0)=0x3024;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOSET(inter_fd,10);
+ return 0;
+}
+// ƒp[ƒeƒBˆÚ“®—v‹
+int intif_party_changemap(struct map_session_data *sd,int online)
+{
+ if(sd!=NULL){
+ WFIFOW(inter_fd,0)=0x3025;
+ WFIFOL(inter_fd,2)=sd->status.party_id;
+ WFIFOL(inter_fd,6)=sd->status.account_id;
+ memcpy(WFIFOP(inter_fd,10),map[sd->bl.m].name,16);
+ WFIFOB(inter_fd,26)=online;
+ WFIFOW(inter_fd,27)=sd->status.base_level;
+ WFIFOSET(inter_fd,29);
+ }
+// if(battle_config.etc_log)
+// printf("party: change map\n");
+ return 0;
+}
+// ƒp[ƒeƒB[‰ðŽU—v‹
+int intif_break_party(int party_id)
+{
+ WFIFOW(inter_fd,0)=0x3026;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ƒp[ƒeƒB‰ï˜b‘—M
+int intif_party_message(int party_id,int account_id,char *mes,int len)
+{
+// if(battle_config.etc_log)
+// printf("intif_party_message: %s\n",mes);
+ WFIFOW(inter_fd,0)=0x3027;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=party_id;
+ WFIFOL(inter_fd,8)=account_id;
+ memcpy(WFIFOP(inter_fd,12),mes,len);
+ WFIFOSET(inter_fd,len+12);
+ return 0;
+}
+// ƒp[ƒeƒB‹£‡ƒ`ƒFƒbƒN—v‹
+int intif_party_checkconflict(int party_id,int account_id,char *nick)
+{
+ WFIFOW(inter_fd,0)=0x3028;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ memcpy(WFIFOP(inter_fd,10),nick,24);
+ WFIFOSET(inter_fd,34);
+ return 0;
+}
+
+// ƒMƒ‹ƒh쬗v‹
+int intif_guild_create(const char *name,const struct guild_member *master)
+{
+ nullpo_retr(0, master);
+
+ WFIFOW(inter_fd,0)=0x3030;
+ WFIFOW(inter_fd,2)=sizeof(struct guild_member)+32;
+ WFIFOL(inter_fd,4)=master->account_id;
+ memcpy(WFIFOP(inter_fd,8),name,24);
+ memcpy(WFIFOP(inter_fd,32),master,sizeof(struct guild_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+// ƒMƒ‹ƒhî•ñ—v‹
+int intif_guild_request_info(int guild_id)
+{
+ WFIFOW(inter_fd,0) = 0x3031;
+ WFIFOL(inter_fd,2) = guild_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ—v‹
+int intif_guild_addmember(int guild_id,struct guild_member *m)
+{
+ WFIFOW(inter_fd,0) = 0x3032;
+ WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8;
+ WFIFOL(inter_fd,4) = guild_id;
+ memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú—v‹
+int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes)
+{
+ WFIFOW(inter_fd, 0) = 0x3034;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOL(inter_fd, 6) = account_id;
+ WFIFOL(inter_fd,10) = char_id;
+ WFIFOB(inter_fd,14) = flag;
+ memcpy(WFIFOP(inter_fd,15),mes,40);
+ WFIFOSET(inter_fd,55);
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo‚̃Iƒ“ƒ‰ƒCƒ“ó‹µ/LvXV—v‹
+int intif_guild_memberinfoshort(int guild_id,
+ int account_id,int char_id,int online,int lv,int class)
+{
+ WFIFOW(inter_fd, 0) = 0x3035;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOL(inter_fd, 6) = account_id;
+ WFIFOL(inter_fd,10) = char_id;
+ WFIFOB(inter_fd,14) = online;
+ WFIFOW(inter_fd,15) = lv;
+ WFIFOW(inter_fd,17) = class;
+ WFIFOSET(inter_fd,19);
+ return 0;
+}
+// ƒMƒ‹ƒh‰ðŽU’Ê’m
+int intif_guild_break(int guild_id)
+{
+ WFIFOW(inter_fd, 0) = 0x3036;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ƒMƒ‹ƒh‰ï˜b‘—M
+int intif_guild_message(int guild_id,int account_id,char *mes,int len)
+{
+ WFIFOW(inter_fd,0)=0x3037;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=account_id;
+ memcpy(WFIFOP(inter_fd,12),mes,len);
+ WFIFOSET(inter_fd,len+12);
+ return 0;
+}
+// ƒMƒ‹ƒh‹£‡ƒ`ƒFƒbƒN—v‹
+int intif_guild_checkconflict(int guild_id,int account_id,int char_id)
+{
+ WFIFOW(inter_fd, 0)=0x3038;
+ WFIFOL(inter_fd, 2)=guild_id;
+ WFIFOL(inter_fd, 6)=account_id;
+ WFIFOL(inter_fd,10)=char_id;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// ƒMƒ‹ƒhŠî–{î•ñ•ÏX—v‹
+int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len)
+{
+ WFIFOW(inter_fd,0)=0x3039;
+ WFIFOW(inter_fd,2)=len+10;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOW(inter_fd,8)=type;
+ memcpy(WFIFOP(inter_fd,10),data,len);
+ WFIFOSET(inter_fd,len+10);
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX—v‹
+int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id,
+ int type,const void *data,int len)
+{
+ WFIFOW(inter_fd, 0)=0x303a;
+ WFIFOW(inter_fd, 2)=len+18;
+ WFIFOL(inter_fd, 4)=guild_id;
+ WFIFOL(inter_fd, 8)=account_id;
+ WFIFOL(inter_fd,12)=char_id;
+ WFIFOW(inter_fd,16)=type;
+ memcpy(WFIFOP(inter_fd,18),data,len);
+ WFIFOSET(inter_fd,len+18);
+ return 0;
+}
+// ƒMƒ‹ƒh–ðE•ÏX—v‹
+int intif_guild_position(int guild_id,int idx,struct guild_position *p)
+{
+ WFIFOW(inter_fd,0)=0x303b;
+ WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=idx;
+ memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+// ƒMƒ‹ƒhƒXƒLƒ‹ƒAƒbƒv—v‹
+int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag)
+{
+ WFIFOW(inter_fd, 0)=0x303c;
+ WFIFOL(inter_fd, 2)=guild_id;
+ WFIFOL(inter_fd, 6)=skill_num;
+ WFIFOL(inter_fd,10)=account_id;
+ //WFIFOL(inter_fd,14)=flag;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// ƒMƒ‹ƒh“¯–¿/“G‘Ηv‹
+int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag)
+{
+ WFIFOW(inter_fd, 0)=0x303d;
+ WFIFOL(inter_fd, 2)=guild_id1;
+ WFIFOL(inter_fd, 6)=guild_id2;
+ WFIFOL(inter_fd,10)=account_id1;
+ WFIFOL(inter_fd,14)=account_id2;
+ WFIFOB(inter_fd,18)=flag;
+ WFIFOSET(inter_fd,19);
+ return 0;
+}
+// ƒMƒ‹ƒh’m•ÏX—v‹
+int intif_guild_notice(int guild_id,const char *mes1,const char *mes2)
+{
+ WFIFOW(inter_fd,0)=0x303e;
+ WFIFOL(inter_fd,2)=guild_id;
+ memcpy(WFIFOP(inter_fd,6),mes1,60);
+ memcpy(WFIFOP(inter_fd,66),mes2,120);
+ WFIFOSET(inter_fd,186);
+ return 0;
+}
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX—v‹
+int intif_guild_emblem(int guild_id,int len,const char *data)
+{
+ if(guild_id<=0 || len<0 || len>2000)
+ return 0;
+ WFIFOW(inter_fd,0)=0x303f;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=0;
+ memcpy(WFIFOP(inter_fd,12),data,len);
+ WFIFOSET(inter_fd,len+12);
+ return 0;
+}
+//Œ»Ý‚̃Mƒ‹ƒhéè—̃Mƒ‹ƒh‚𒲂ׂé
+int intif_guild_castle_dataload(int castle_id,int index)
+{
+ WFIFOW(inter_fd,0)=0x3040;
+ WFIFOW(inter_fd,2)=castle_id;
+ WFIFOB(inter_fd,4)=index;
+ WFIFOSET(inter_fd,5);
+ return 0;
+}
+
+//ƒMƒ‹ƒhéè—̃Mƒ‹ƒh•ÏX—v‹
+int intif_guild_castle_datasave(int castle_id,int index, int value)
+{
+ WFIFOW(inter_fd,0)=0x3041;
+ WFIFOW(inter_fd,2)=castle_id;
+ WFIFOB(inter_fd,4)=index;
+ WFIFOL(inter_fd,5)=value;
+ WFIFOSET(inter_fd,9);
+ return 0;
+}
+
+/*==========================================
+ * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚Ìꊗv‹
+ *------------------------------------------
+ */
+int intif_charposreq(int account_id,char *name,int flag)
+{
+ WFIFOW(inter_fd,0)=0x3090;
+ WFIFOL(inter_fd,2)=account_id;
+ memcpy(WFIFOP(inter_fd,6),name,24);
+ WFIFOB(inter_fd,30)=flag;
+ WFIFOSET(inter_fd,31);
+ return 0;
+}
+
+/*==========================================
+ * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚ÌꊂɈړ®‚·‚é
+ * @jumpto
+ *------------------------------------------
+ */
+int intif_jumpto(int account_id,char *name)
+{
+ intif_charposreq(account_id,name,1);
+ //printf("intif_jumpto: %d %s\n",account_id,name);
+ return 0;
+}
+
+/*==========================================
+ * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚Ìꊕ\Ž¦‚·‚é
+ * @where
+ *------------------------------------------
+ */
+int intif_where(int account_id,char *name)
+{
+ intif_charposreq(account_id,name,0);
+ //printf("intif_where: %d %s\n",account_id,name);
+ return 0;
+}
+
+/*==========================================
+ * Žw’肵‚½–¼‘O‚̃Lƒƒƒ‰‚ðŒÄ‚ÑŠñ‚¹‚é
+ * flag=0 ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢
+ * flag=1 @recall
+ *------------------------------------------
+ */
+int intif_charmovereq(struct map_session_data *sd,char *name,int flag)
+{
+ nullpo_retr(0,sd);
+
+ //printf("intif_charmovereq: %d %s\n",sd->status.account_id,name);
+ if(name==NULL)
+ return -1;
+
+ WFIFOW(inter_fd,0)=0x3092;
+ WFIFOL(inter_fd,2)=sd->status.account_id;
+ memcpy(WFIFOP(inter_fd,6),name,24);
+ WFIFOB(inter_fd,30)=flag;
+ memcpy(WFIFOP(inter_fd,31),sd->mapname,16);
+ WFIFOW(inter_fd,47)=sd->bl.x;
+ WFIFOW(inter_fd,49)=sd->bl.y;
+ WFIFOSET(inter_fd,51);
+ return 0;
+}
+/*==========================================
+ * ‘ÎÛID‚ɃƒbƒZ[ƒW‚ð‘—M
+ *------------------------------------------
+ */
+int intif_displaymessage(int account_id, char* mes)
+{
+ int len = 6+strlen(mes)+1;
+ WFIFOW(inter_fd,0) = 0x3093;
+ WFIFOW(inter_fd,2) = len;
+ WFIFOL(inter_fd,4) = account_id;
+ strncpy(WFIFOP(inter_fd,8), mes, len-6);
+ WFIFOSET(inter_fd, len );
+
+ return 0;
+}
+//-----------------------------------------------------------------
+// Packets receive from inter server
+
+// Wisp/Page reception
+int intif_parse_WisMessage(int fd) { // rewritten by [Yor]
+ struct map_session_data* sd;
+ int id=RFIFOL(fd,4);
+ int i=0; //,j=0;
+
+// if(battle_config.etc_log)
+// printf("intif_parse_wismessage: %d %s %s %s\n",id,RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54) );
+
+ sd=map_nick2sd(RFIFOP(fd,32)); // ‘—Mæ‚ð’T‚·
+ if(sd!=NULL && strcmp(sd->status.name, RFIFOP(fd,32)) == 0){
+/*
+ for(i=0;i<MAX_WIS_REFUSAL;i++){ //‹‘”ÛƒŠƒXƒg‚É–¼‘O‚ª‚ ‚é‚©‚Ç‚¤‚©”»’肵‚Ä‚ ‚ê‚΋‘”Û
+ if(strcmp(sd->wis_refusal[i],RFIFOP(fd,8))==0){
+ j++;
+ break;
+ }
+ }
+*/
+ if(sd->ignoreAll == 1)
+ intif_wis_replay(RFIFOL(fd,4), 2); // ŽóM‹‘”Û
+/*
+ else if(j>0)
+ intif_wis_replay(id,2); // ŽóM‹‘”Û
+
+ else{
+*/
+ if(i == MAX_IGNORE_LIST) {
+ clif_wis_message(sd->fd,RFIFOP(fd,8),RFIFOP(fd,56),RFIFOW(fd,2)-56);
+ intif_wis_replay(RFIFOL(fd,4),0); // ‘—M¬Œ÷
+ }
+ }else
+ intif_wis_replay(id,1); // ‚»‚ñ‚Èl‚¢‚Ü‚¹‚ñ
+ return 0;
+}
+
+// Wisp/page transmission result reception
+int intif_parse_WisEnd(int fd) {
+ struct map_session_data* sd;
+
+ if (battle_config.etc_log)
+ printf("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ sd = map_nick2sd(RFIFOP(fd,2));
+ if (sd != NULL)
+ clif_wis_end(sd->fd, RFIFOB(fd,26));
+
+ return 0;
+}
+
+// Received wisp message from map-server via char-server for ALL gm
+int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+ int i, min_gm_level;
+ struct map_session_data *pl_sd;
+ char Wisp_name[24];
+ char mbuf[255];
+ char *message = ((RFIFOW(fd,2) - 30) >= sizeof(mbuf)) ? (char *) malloc((RFIFOW(fd,2) - 30)) : mbuf;
+
+ min_gm_level = (int)RFIFOW(fd,28);
+ memcpy(Wisp_name, RFIFOP(fd,4), 24);
+ Wisp_name[23] = '\0';
+ memcpy(message, RFIFOP(fd,30), RFIFOW(fd,2) - 30);
+ message[sizeof(message) - 1] = '\0';
+ // information is sended to all online GM
+ for (i = 0; i < fd_max; i++)
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth)
+ if (pc_isGM(pl_sd) >= min_gm_level)
+ clif_wis_message(i, Wisp_name, message, strlen(message) + 1);
+
+ if (message != mbuf)
+ free(message);
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒg•Ï”’Ê’m
+int intif_parse_AccountReg(int fd) {
+ int j,p;
+ struct map_session_data *sd;
+
+ if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL )
+ return 1;
+ for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG_NUM;p+=36,j++){
+ memcpy(sd->status.account_reg[j].str,RFIFOP(fd,p),32);
+ sd->status.account_reg[j].value=RFIFOL(fd,p+32);
+ }
+ sd->status.account_reg_num = j;
+// printf("intif: accountreg\n");
+
+ return 0;
+}
+
+// ‘qŒÉƒf[ƒ^ŽóM
+int intif_parse_LoadStorage(int fd) {
+ struct storage *stor;
+ struct map_session_data *sd;
+
+ stor = account2storage( RFIFOL(fd,4));
+ if (RFIFOW(fd,2)-8 != sizeof(struct storage)) {
+ if (battle_config.error_log)
+ printf("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage));
+ return 1;
+ }
+ sd=map_id2sd( RFIFOL(fd,4) );
+ if(sd==NULL){
+ if(battle_config.error_log)
+ printf("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4));
+ return 1;
+ }
+ if(battle_config.save_log)
+ printf("intif_openstorage: %d\n",RFIFOL(fd,4) );
+ memcpy(stor,RFIFOP(fd,8),sizeof(struct storage));
+ stor->storage_status=1;
+ sd->state.storage_flag = 0;
+ clif_storageitemlist(sd,stor);
+ clif_storageequiplist(sd,stor);
+ clif_updatestorageamount(sd,stor);
+
+ return 0;
+}
+
+// ‘qŒÉƒf[ƒ^‘—M¬Œ÷
+int intif_parse_SaveStorage(int fd)
+{
+ if(battle_config.save_log)
+ printf("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) );
+ return 0;
+}
+
+int intif_parse_LoadGuildStorage(int fd)
+{
+ struct guild_storage *gstor;
+ struct map_session_data *sd;
+ int guild_id = RFIFOL(fd,8);
+ if(guild_id > 0) {
+ gstor=guild2storage(guild_id);
+ if(!gstor) {
+ if(battle_config.error_log)
+ printf("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id);
+ return 1;
+ }
+ if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){
+ gstor->storage_status = 0;
+ if(battle_config.error_log)
+ printf("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage));
+ return 1;
+ }
+ sd=map_id2sd( RFIFOL(fd,4) );
+ if(sd==NULL){
+ if(battle_config.error_log)
+ printf("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4));
+ return 1;
+ }
+ if(battle_config.save_log)
+ printf("intif_open_guild_storage: %d\n",RFIFOL(fd,4) );
+ memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage));
+ gstor->storage_status = 1;
+ sd->state.storage_flag = 1;
+ clif_guildstorageitemlist(sd,gstor);
+ clif_guildstorageequiplist(sd,gstor);
+ clif_updateguildstorageamount(sd,gstor);
+ }
+ return 0;
+}
+int intif_parse_SaveGuildStorage(int fd)
+{
+ if(battle_config.save_log) {
+ printf("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) );
+ }
+ return 0;
+}
+
+// ƒp[ƒeƒB쬉”Û
+int intif_parse_PartyCreated(int fd)
+{
+ if(battle_config.etc_log)
+ printf("intif: party created\n");
+ party_created(RFIFOL(fd,2),RFIFOB(fd,6),RFIFOL(fd,7),RFIFOP(fd,11));
+ return 0;
+}
+// ƒp[ƒeƒBî•ñ
+int intif_parse_PartyInfo(int fd)
+{
+ if( RFIFOW(fd,2)==8){
+ if(battle_config.error_log)
+ printf("intif: party noinfo %d\n",RFIFOL(fd,4));
+ party_recv_noinfo(RFIFOL(fd,4));
+ return 0;
+ }
+
+// printf("intif: party info %d\n",RFIFOL(fd,4));
+ if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){
+ if(battle_config.error_log)
+ printf("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4);
+ }
+ party_recv_info((struct party *)RFIFOP(fd,4));
+ return 0;
+}
+// ƒp[ƒeƒB’ljÁ’Ê’m
+int intif_parse_PartyMemberAdded(int fd)
+{
+ if(battle_config.etc_log)
+ printf("intif: party member added %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
+ party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10));
+ return 0;
+}
+// ƒp[ƒeƒBÝ’è•ÏX’Ê’m
+int intif_parse_PartyOptionChanged(int fd)
+{
+ party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14));
+ return 0;
+}
+// ƒp[ƒeƒB’E‘Þ’Ê’m
+int intif_parse_PartyMemberLeaved(int fd)
+{
+ if(battle_config.etc_log)
+ printf("intif: party member leaved %d %d %s\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10));
+ party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10));
+ return 0;
+}
+// ƒp[ƒeƒB‰ðŽU’Ê’m
+int intif_parse_PartyBroken(int fd)
+{
+ party_broken(RFIFOL(fd,2));
+ return 0;
+}
+// ƒp[ƒeƒBˆÚ“®’Ê’m
+int intif_parse_PartyMove(int fd)
+{
+// if(battle_config.etc_log)
+// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
+ party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27));
+ return 0;
+}
+// ƒp[ƒeƒBƒƒbƒZ[ƒW
+int intif_parse_PartyMessage(int fd)
+{
+// if(battle_config.etc_log)
+// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
+ party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12);
+ return 0;
+}
+
+// ƒMƒ‹ƒh쬉”Û
+int intif_parse_GuildCreated(int fd)
+{
+ guild_created(RFIFOL(fd,2),RFIFOL(fd,6));
+ return 0;
+}
+// ƒMƒ‹ƒhî•ñ
+int intif_parse_GuildInfo(int fd)
+{
+ if( RFIFOW(fd,2)==8){
+ if(battle_config.error_log)
+ printf("intif: guild noinfo %d\n",RFIFOL(fd,4));
+ guild_recv_noinfo(RFIFOL(fd,4));
+ return 0;
+ }
+
+// if(battle_config.etc_log)
+// printf("intif: guild info %d\n",RFIFOL(fd,4));
+ if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){
+ if(battle_config.error_log)
+ printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4);
+ }
+ guild_recv_info((struct guild *)RFIFOP(fd,4));
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo’ljÁ’Ê’m
+int intif_parse_GuildMemberAdded(int fd)
+{
+ if(battle_config.etc_log)
+ printf("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
+ guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒo’E‘Þ/’Ç•ú’Ê’m
+int intif_parse_GuildMemberLeaved(int fd)
+{
+ guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),
+ RFIFOP(fd,55),RFIFOP(fd,15));
+ return 0;
+}
+
+// ƒMƒ‹ƒhƒƒ“ƒoƒIƒ“ƒ‰ƒCƒ“ó‘Ô/Lv•ÏX’Ê’m
+int intif_parse_GuildMemberInfoShort(int fd)
+{
+ guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17));
+ return 0;
+}
+// ƒMƒ‹ƒh‰ðŽU’Ê’m
+int intif_parse_GuildBroken(int fd)
+{
+ guild_broken(RFIFOL(fd,2),RFIFOB(fd,6));
+ return 0;
+}
+
+// ƒMƒ‹ƒhŠî–{î•ñ•ÏX’Ê’m
+int intif_parse_GuildBasicInfoChanged(int fd)
+{
+ int type=RFIFOW(fd,8),guild_id=RFIFOL(fd,4);
+ void *data=RFIFOP(fd,10);
+ struct guild *g=guild_search(guild_id);
+ short dw=*((short *)data);
+ int dd=*((int *)data);
+ if( g==NULL )
+ return 0;
+ switch(type){
+ case GBI_EXP: g->exp=dd; break;
+ case GBI_GUILDLV: g->guild_lv=dw; break;
+ case GBI_SKILLPOINT: g->skill_point=dd; break;
+ }
+ return 0;
+}
+// ƒMƒ‹ƒhƒƒ“ƒoî•ñ•ÏX’Ê’m
+int intif_parse_GuildMemberInfoChanged(int fd)
+{
+ int type=RFIFOW(fd,16),guild_id=RFIFOL(fd,4);
+ int account_id=RFIFOL(fd,8),char_id=RFIFOL(fd,12);
+ void *data=RFIFOP(fd,18);
+ struct guild *g=guild_search(guild_id);
+ int idx,dd=*((int *)data);
+ if( g==NULL )
+ return 0;
+ idx=guild_getindex(g,account_id,char_id);
+ switch(type){
+ case GMI_POSITION:
+ g->member[idx].position=dd;
+ guild_memberposition_changed(g,idx,dd);
+ break;
+ case GMI_EXP:
+ g->member[idx].exp=dd;
+ break;
+ }
+ return 0;
+}
+
+// ƒMƒ‹ƒh–ðE•ÏX’Ê’m
+int intif_parse_GuildPosition(int fd)
+{
+ if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){
+ if(battle_config.error_log)
+ printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12);
+ }
+ guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12));
+ return 0;
+}
+// ƒMƒ‹ƒhƒXƒLƒ‹Š„‚èU‚è’Ê’m
+int intif_parse_GuildSkillUp(int fd)
+{
+ guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ return 0;
+}
+// ƒMƒ‹ƒh“¯–¿/“G‘Î’Ê’m
+int intif_parse_GuildAlliance(int fd)
+{
+ guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),
+ RFIFOB(fd,18),RFIFOP(fd,19),RFIFOP(fd,43));
+ return 0;
+}
+// ƒMƒ‹ƒh’m•ÏX’Ê’m
+int intif_parse_GuildNotice(int fd)
+{
+ guild_notice_changed(RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66));
+ return 0;
+}
+// ƒMƒ‹ƒhƒGƒ“ƒuƒŒƒ€•ÏX’Ê’m
+int intif_parse_GuildEmblem(int fd)
+{
+ guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12));
+ return 0;
+}
+// ƒMƒ‹ƒh‰ï˜bŽóM
+int intif_parse_GuildMessage(int fd)
+{
+ guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12);
+ return 0;
+}
+// ƒMƒ‹ƒhéƒf[ƒ^—v‹•ÔM
+int intif_parse_GuildCastleDataLoad(int fd)
+{
+ return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
+}
+// ƒMƒ‹ƒhéƒf[ƒ^•ÏX’Ê’m
+int intif_parse_GuildCastleDataSave(int fd)
+{
+ return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
+}
+
+// ƒMƒ‹ƒhéƒf[ƒ^ˆêŠ‡ŽóM(‰Šú‰»Žž)
+int intif_parse_GuildCastleAllDataLoad(int fd)
+{
+ return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4));
+}
+
+// pet
+int intif_parse_CreatePet(int fd)
+{
+ pet_get_egg(RFIFOL(fd,2),RFIFOL(fd,7),RFIFOB(fd,6));
+
+ return 0;
+}
+
+int intif_parse_RecvPetData(int fd)
+{
+ struct s_pet p;
+ int len=RFIFOW(fd,2);
+ if(sizeof(struct s_pet)!=len-9) {
+ if(battle_config.etc_log)
+ printf("intif: pet data: data size error %d %d\n",sizeof(struct s_pet),len-9);
+ }
+ else{
+ memcpy(&p,RFIFOP(fd,9),sizeof(struct s_pet));
+ pet_recv_petdata(RFIFOL(fd,4),&p,RFIFOB(fd,8));
+ }
+
+ return 0;
+}
+int intif_parse_SavePetOk(int fd)
+{
+ if(RFIFOB(fd,6) == 1) {
+ if(battle_config.error_log)
+ printf("pet data save failure\n");
+ }
+
+ return 0;
+}
+
+int intif_parse_DeletePetOk(int fd)
+{
+ if(RFIFOB(fd,2) == 1) {
+ if(battle_config.error_log)
+ printf("pet data delete failure\n");
+ }
+
+ return 0;
+}
+//-----------------------------------------------------------------
+// inter server‚©‚ç‚Ì’ÊM
+// ƒGƒ‰[‚ª‚ ‚ê‚Î0(false)‚ð•Ô‚·‚±‚Æ
+// ƒpƒPƒbƒg‚ªˆ—‚Å‚«‚ê‚Î1,ƒpƒPƒbƒg’·‚ª‘«‚è‚È‚¯‚ê‚Î2‚ð•Ô‚·‚±‚Æ
+int intif_parse(int fd)
+{
+ int packet_len;
+ int cmd = RFIFOW(fd,0);
+ // ƒpƒPƒbƒg‚ÌIDŠm”F
+ if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) ||
+ packet_len_table[cmd-0x3800]==0){
+ return 0;
+ }
+ // ƒpƒPƒbƒg‚Ì’·‚³Šm”F
+ packet_len = packet_len_table[cmd-0x3800];
+ if(packet_len==-1){
+ if(RFIFOREST(fd)<4)
+ return 2;
+ packet_len = RFIFOW(fd,2);
+ }
+// if(battle_config.etc_log)
+// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
+ if(RFIFOREST(fd)<packet_len){
+ return 2;
+ }
+ // ˆ—•ªŠò
+ switch(cmd){
+ case 0x3800: clif_GMmessage(NULL,RFIFOP(fd,4),packet_len-4,0); break;
+ case 0x3801: intif_parse_WisMessage(fd); break;
+ case 0x3802: intif_parse_WisEnd(fd); break;
+ case 0x3803: mapif_parse_WisToGM(fd); break;
+ case 0x3804: intif_parse_AccountReg(fd); break;
+ case 0x3810: intif_parse_LoadStorage(fd); break;
+ case 0x3811: intif_parse_SaveStorage(fd); break;
+ case 0x3818: intif_parse_LoadGuildStorage(fd); break;
+ case 0x3819: intif_parse_SaveGuildStorage(fd); break;
+ case 0x3820: intif_parse_PartyCreated(fd); break;
+ case 0x3821: intif_parse_PartyInfo(fd); break;
+ case 0x3822: intif_parse_PartyMemberAdded(fd); break;
+ case 0x3823: intif_parse_PartyOptionChanged(fd); break;
+ case 0x3824: intif_parse_PartyMemberLeaved(fd); break;
+ case 0x3825: intif_parse_PartyMove(fd); break;
+ case 0x3826: intif_parse_PartyBroken(fd); break;
+ case 0x3827: intif_parse_PartyMessage(fd); break;
+ case 0x3830: intif_parse_GuildCreated(fd); break;
+ case 0x3831: intif_parse_GuildInfo(fd); break;
+ case 0x3832: intif_parse_GuildMemberAdded(fd); break;
+ case 0x3834: intif_parse_GuildMemberLeaved(fd); break;
+ case 0x3835: intif_parse_GuildMemberInfoShort(fd); break;
+ case 0x3836: intif_parse_GuildBroken(fd); break;
+ case 0x3837: intif_parse_GuildMessage(fd); break;
+ case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break;
+ case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break;
+ case 0x383b: intif_parse_GuildPosition(fd); break;
+ case 0x383c: intif_parse_GuildSkillUp(fd); break;
+ case 0x383d: intif_parse_GuildAlliance(fd); break;
+ case 0x383e: intif_parse_GuildNotice(fd); break;
+ case 0x383f: intif_parse_GuildEmblem(fd); break;
+ case 0x3840: intif_parse_GuildCastleDataLoad(fd); break;
+ case 0x3841: intif_parse_GuildCastleDataSave(fd); break;
+ case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break;
+ case 0x3880: intif_parse_CreatePet(fd); break;
+ case 0x3881: intif_parse_RecvPetData(fd); break;
+ case 0x3882: intif_parse_SavePetOk(fd); break;
+ case 0x3883: intif_parse_DeletePetOk(fd); break;
+ default:
+ if(battle_config.error_log)
+ printf("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0));
+ return 0;
+ }
+ // ƒpƒPƒbƒg“Ç‚Ý”ò‚΂µ
+ RFIFOSKIP(fd,packet_len);
+ return 1;
+}
diff --git a/src/map/intif.h b/src/map/intif.h
index bb5fcd379..3fe14f2e4 100644
--- a/src/map/intif.h
+++ b/src/map/intif.h
@@ -1,60 +1,60 @@
-// $Id: intif.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _INTIF_H_
-#define _INFIF_H_
-
-int intif_parse(int fd);
-
-int intif_GMmessage(char* mes,int len,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 mes_len);
-
-int intif_saveaccountreg(struct map_session_data *sd);
-int intif_request_accountreg(struct map_session_data *sd);
-
-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 map_session_data *sd,char *name);
-int intif_request_partyinfo(int party_id);
-int intif_party_addmember(int party_id, int account_id);
-int intif_party_changeoption(int party_id, int account_id, int exp, int item);
-int intif_party_leave(int party_id, int accound_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, char *nick);
-
-
-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_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_jumpto(int account_id,char *name);
-int intif_where(int account_id,char *name);
-int intif_charmovereq(struct map_session_data *sd,char *name,int flag);
-
-#endif
+// $Id: intif.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
+#ifndef _INTIF_H_
+#define _INFIF_H_
+
+int intif_parse(int fd);
+
+int intif_GMmessage(char* mes,int len,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 mes_len);
+
+int intif_saveaccountreg(struct map_session_data *sd);
+int intif_request_accountreg(struct map_session_data *sd);
+
+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 map_session_data *sd,char *name);
+int intif_request_partyinfo(int party_id);
+int intif_party_addmember(int party_id, int account_id);
+int intif_party_changeoption(int party_id, int account_id, int exp, int item);
+int intif_party_leave(int party_id, int accound_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, char *nick);
+
+
+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_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_jumpto(int account_id,char *name);
+int intif_where(int account_id,char *name);
+int intif_charmovereq(struct map_session_data *sd,char *name,int flag);
+
+#endif
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index 095e053c2..a225cff83 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -1,882 +1,882 @@
-// $Id: itemdb.c,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "grfio.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "battle.h"
-#include "itemdb.h"
-#include "script.h"
-#include "pc.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MAX_RANDITEM 2000
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-static struct dbt* item_db;
-
-static struct random_item_data blue_box[MAX_RANDITEM],violet_box[MAX_RANDITEM],card_album[MAX_RANDITEM],gift_box[MAX_RANDITEM],scroll[MAX_RANDITEM];
-static int blue_box_count=0,violet_box_count=0,card_album_count=0,gift_box_count=0,scroll_count=0;
-static int blue_box_default=0,violet_box_default=0,card_album_default=0,gift_box_default=0,scroll_default=0;
-
-// Function declarations
-
-static void itemdb_read(void);
-static int itemdb_readdb(void);
-#ifndef TXT_ONLY
-static int itemdb_read_sqldb(void);
-#endif /* not TXT_ONLY */
-static int itemdb_read_randomitem();
-static int itemdb_read_itemavail(void);
-static int itemdb_read_itemnametable(void);
-static int itemdb_read_noequip(void);
-void itemdb_reload(void);
-
-/*==========================================
- * –¼‘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(void *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( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 ||
-// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
- if( strcmpi(item->name,str)==0 ) //by lupus
- *dst=item;
- return 0;
-}
-
-/*==========================================
- * –¼‘O‚ÅŒŸõ—p
- *------------------------------------------
- */
-int itemdb_searchjname_sub(void *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( strcmpi(item->jname,str)==0 )
- *dst=item;
- return 0;
-}
-/*==========================================
- * –¼‘O‚ÅŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_searchname(const char *str)
-{
- struct item_data *item=NULL;
- numdb_foreach(item_db,itemdb_searchname_sub,str,&item);
- return item;
-}
-
-/*==========================================
- * ” ŒnƒAƒCƒeƒ€ŒŸõ
- *------------------------------------------
- */
-int itemdb_searchrandomid(int flags)
-{
- int nameid=0,i,index,count;
- struct random_item_data *list=NULL;
-
- struct {
- int nameid,count;
- struct random_item_data *list;
- } data[] ={
- { 0,0,NULL },
- { blue_box_default ,blue_box_count ,blue_box },
- { violet_box_default,violet_box_count ,violet_box },
- { card_album_default,card_album_count ,card_album },
- { gift_box_default ,gift_box_count ,gift_box },
- { scroll_default ,scroll_count ,scroll },
- };
-
- if(flags>=1 && flags<=5){
- nameid=data[flags].nameid;
- count=data[flags].count;
- list=data[flags].list;
-
- if(count > 0) {
- for(i=0;i<1000;i++) {
- index = rand()%count;
- if( rand()%1000000 < list[index].per) {
- nameid = list[index].nameid;
- break;
- }
- }
- }
- }
- return nameid;
-}
-
-/*==========================================
- * DB‚Ì‘¶ÝŠm”F
- *------------------------------------------
- */
-struct item_data* itemdb_exists(int nameid)
-{
- return numdb_search(item_db,nameid);
-}
-/*==========================================
- * DB‚ÌŒŸõ
- *------------------------------------------
- */
-struct item_data* itemdb_search(int nameid)
-{
- struct item_data *id;
-
- id=numdb_search(item_db,nameid);
- if(id) return id;
-
- id=(struct item_data *)aCalloc(1,sizeof(struct item_data));
- numdb_insert(item_db,nameid,id);
-
- id->nameid=nameid;
- id->value_buy=10;
- id->value_sell=id->value_buy/2;
- id->weight=10;
- id->sex=2;
- id->elv=0;
- id->class=0xffffffff;
- id->flag.available=0;
- id->flag.value_notdc=0; //ˆê‰žEEE
- id->flag.value_notoc=0;
- id->flag.no_equip=0;
- id->view_id=0;
-
- if(nameid>500 && nameid<600)
- id->type=0; //heal item
- else if(nameid>600 && nameid<700)
- id->type=2; //use item
- else if((nameid>700 && nameid<1100) ||
- (nameid>7000 && nameid<8000))
- id->type=3; //correction
- else if(nameid>=1750 && nameid<1771)
- id->type=10; //arrow
- else if(nameid>1100 && nameid<2000)
- id->type=4; //weapon
- else if((nameid>2100 && nameid<3000) ||
- (nameid>5000 && nameid<6000))
- id->type=5; //armor
- else if(nameid>4000 && nameid<5000)
- id->type=6; //card
- else if(nameid>9000 && nameid<10000)
- id->type=7; //egg
- else if(nameid>10000)
- id->type=8; //petequip
-
- return id;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==0 || type==2 || type==3 || type==6 || type==10)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int itemdb_isequip3(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==4 || type==5 || type == 8)
- return 1;
- return 0;
-}
-
-/*==========================================
- * ŽÌ‚Ä‚ç‚ê‚éƒAƒCƒeƒ€‚Í1A‚»‚¤‚Å‚È‚¢ƒAƒCƒeƒ€‚Í0
- *------------------------------------------
- */
-int itemdb_isdropable(int nameid)
-{
- //Œ‹¥Žw—Ö‚ÍŽÌ‚Ä‚ç‚ê‚È‚¢
- switch(nameid){
- case 2634: //Œ‹¥Žw—Ö
- case 2635: //Œ‹¥Žw—Ö
- return 0;
- }
-
- return 1;
-}
-
-//
-// ‰Šú‰»
-//
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_read_itemslottable(void)
-{
- char *buf,*p;
- int s;
-
- buf=grfio_read("data\\itemslottable.txt");
- if(buf==NULL)
- return -1;
- s=grfio_size("data\\itemslottable.txt");
- buf[s]=0;
- for(p=buf;p-buf<s;){
- int nameid,equip;
- sscanf(p,"%d#%d#",&nameid,&equip);
- itemdb_search(nameid)->equip=equip;
- p=strchr(p,10);
- if(!p) break;
- p++;
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- free(buf);
-
- return 0;
-}
-
-#ifndef TXT_ONLY
-/*====================================
- * Removed item_value_db, don't re-add
- *------------------------------------
- */
-static void itemdb_read(void)
-{
- itemdb_read_itemslottable();
-
- if (db_use_sqldbs)
- {
- itemdb_read_sqldb();
- }
- else
- {
- itemdb_readdb();
- }
-
- itemdb_read_randomitem();
- itemdb_read_itemavail();
- itemdb_read_noequip();
-
- if (!battle_config.item_name_override_grffile)
- itemdb_read_itemnametable();
-}
-
-#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[]={ "db/item_db.txt","db/item_db2.txt" };
-
- for(i=0;i<2;i++){
-
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- printf("can't read %s\n",filename[i]);
- exit(1);
- }
-
- lines=0;
- while(fgets(line,1020,fp)){
- lines++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,np=p=line;j<17 && 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 || nameid>=20000)
- continue;
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
- id=itemdb_search(nameid);
- memcpy(id->name,str[1],24);
- memcpy(id->jname,str[2],24);
- id->type=atoi(str[3]);
- // buy‚sell*2 ‚Í item_value_db.txt ‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
- if (atoi(str[5])) { // sell’l‚ð—Dæ‚Æ‚·‚é
- id->value_buy=atoi(str[5])*2;
- id->value_sell=atoi(str[5]);
- } else {
- id->value_buy=atoi(str[4]);
- id->value_sell=atoi(str[4])/2;
- }
- 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]);
- id->class=atoi(str[11]);
- id->sex=atoi(str[12]);
- if(id->equip != atoi(str[13])){
- id->equip=atoi(str[13]);
- }
- id->wlv=atoi(str[14]);
- id->elv=atoi(str[15]);
- id->look=atoi(str[16]);
- id->flag.available=1;
- id->flag.value_notdc=0;
- id->flag.value_notoc=0;
- id->view_id=0;
-
- id->use_script=NULL;
- id->equip_script=NULL;
-
- if((p=strchr(np,'{'))==NULL)
- continue;
- id->use_script = parse_script(p,lines);
- if((p=strchr(p+1,'{'))==NULL)
- continue;
- id->equip_script = parse_script(p,lines);
- }
- fclose(fp);
- printf("read %s done (count=%d)\n",filename[i],ln);
- }
- return 0;
-}
-
-// Removed item_value_db, don't re-add!
-
-/*==========================================
- * ƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€oŒ»ƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int itemdb_read_randomitem()
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,i,j;
- char *str[10],*p;
-
- const struct {
- char filename[64];
- struct random_item_data *pdata;
- int *pcount,*pdefault;
- } data[] = {
- {"db/item_bluebox.txt", blue_box, &blue_box_count, &blue_box_default },
- {"db/item_violetbox.txt", violet_box, &violet_box_count, &violet_box_default },
- {"db/item_cardalbum.txt", card_album, &card_album_count, &card_album_default },
- {"db/item_giftbox.txt", gift_box, &gift_box_count, &gift_box_default },
- {"db/item_scroll.txt", scroll, &scroll_count, &scroll_default },
- };
-
- for(i=0;i<sizeof(data)/sizeof(data[0]);i++){
- struct random_item_data *pd=data[i].pdata;
- int *pc=data[i].pcount;
- int *pdefault=data[i].pdefault;
- char *fn=data[i].filename;
-
- *pdefault = 0;
- if( (fp=fopen(fn,"r"))==NULL ){
- printf("can't read %s\n",fn);
- continue;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(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;
-
- nameid=atoi(str[0]);
- if(nameid<0 || nameid>=20000)
- continue;
- if(nameid == 0) {
- if(str[2])
- *pdefault = atoi(str[2]);
- continue;
- }
-
- if(str[2]){
- pd[ *pc ].nameid = nameid;
- pd[(*pc)++].per = atoi(str[2]);
- }
-
- if(ln >= MAX_RANDITEM)
- break;
- ln++;
- }
- fclose(fp);
- printf("read %s done (count=%d)\n",fn,*pc);
- }
-
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€Žg—p‰Â”\ƒtƒ‰ƒO‚̃I[ƒo[ƒ‰ƒCƒh
- *------------------------------------------
- */
-static int itemdb_read_itemavail(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int nameid,j,k;
- char *str[10],*p;
-
- if( (fp=fopen("db/item_avail.txt","r"))==NULL ){
- printf("can't read db/item_avail.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- struct item_data *id;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(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 || nameid>=20000 || !(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);
- printf("read db/item_avail.txt done (count=%d)\n",ln);
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚Ì–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_itemnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=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];
-
- if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
-
-#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
- if( itemdb_exists(nameid) &&
- strncmp(itemdb_search(nameid)->jname,buf2,24)!=0 ){
- printf("[override] %d %s => %s\n",nameid
- ,itemdb_search(nameid)->jname,buf2);
- }
-#endif
-
- memcpy(itemdb_search(nameid)->jname,buf2,24);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- free(buf);
- printf("read data\\idnum2itemdisplaynametable.txt done.\n");
-
- return 0;
-}
-#ifdef TXT_ONLY
-/*==========================================
- * ƒJ[ƒhƒCƒ‰ƒXƒg‚̃Šƒ\[ƒX–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-static int itemdb_read_cardillustnametable(void)
-{
- char *buf,*p;
- int s;
-
- buf=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);
-// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname);
- }
-
- p=strchr(p,10);
- if(!p) break;
- p++;
- }
- free(buf);
- printf("read data\\num2cardillustnametable.txt done.\n");
-
- return 0;
-}
-#endif /* TXT_ONLY */
-/*==========================================
- * ‘•”õ§ŒÀƒ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;
-
- if( (fp=fopen("db/item_noequip.txt","r"))==NULL ){
- printf("can't read db/item_noequip.txt\n");
- return -1;
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(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 || nameid>=20000 || !(id=itemdb_exists(nameid)))
- continue;
-
- id->flag.no_equip=atoi(str[1]);
-
- ln++;
-
- }
- fclose(fp);
- printf("read db/item_noequip.txt done (count=%d)\n",ln);
- return 0;
-}
-#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
-
- // ----------
-
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
-
- // 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)))
- {
- /* +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
- +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
- | id | name_english | name_japanese | type | price_buy | price_sell | weight | attack | defence | range | slots | equip_jobs | equip_genders | equip_locations | weapon_level | equip_level | view | script_use | script_equip |
- +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+ */
-
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0 || nameid >= 20000)
- {
- continue;
- }
-
- // Insert a new row into the item database
-
- /*id = calloc(sizeof(struct item_data), 1);
-
- if (id == NULL)
- {
- printf("out of memory : itemdb_read_sqldb\n");
- exit(1);
- }
-
- memset(id, 0, sizeof(struct item_data));
- numdb_insert(item_db, (int) nameid, id);*/
-
- // ----------
- id=itemdb_search(nameid);
-
- memcpy(id->name, sql_row[1], 25);
- memcpy(id->jname, sql_row[2], 25);
-
- id->type = atoi(sql_row[3]);
-
- // 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;
- id->class = (sql_row[11] != NULL) ? atoi(sql_row[11]) : 0;
- id->sex = (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0;
- id->equip = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0;
- id->wlv = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0;
- id->elv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0;
- id->look = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0;
-
- id->view_id = 0;
-
- // ----------
-
- if (sql_row[17] != NULL)
- {
- if (sql_row[17][0] == '{')
- id->use_script = parse_script(sql_row[17], 0);
- else {
- sprintf(script, "{%s}", sql_row[17]);
- id->use_script = parse_script(script, 0);
- }
- }
- else
- {
- id->use_script = NULL;
- }
-
- if (sql_row[18] != NULL)
- {
- if (sql_row[18][0] == '{')
- id->equip_script = parse_script(sql_row[18], 0);
- else {
- sprintf(script, "{%s}", sql_row[18]);
- id->equip_script = parse_script(script, 0);
- }
- }
- else
- {
- id->equip_script = NULL;
- }
-
- // ----------
-
- id->flag.available = 1;
- id->flag.value_notdc = 0;
- id->flag.value_notoc = 0;
- }
-
- // If the retrieval failed, output an error
- if (mysql_errno(&mmysql_handle))
- {
- printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
-
- printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res));
- }
- else
- {
- printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
-
- // Free the query result
- mysql_free_result(sql_res);
- }
- else
- {
- printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
- }
-
- return 0;
-}
-
-#endif /* not TXT_ONLY */
-/*==========================================
- *
- *------------------------------------------
- */
-static int itemdb_final(void *key,void *data,va_list ap)
-{
- struct item_data *id;
-
- nullpo_retr(0, id=data);
-
- if(id->use_script)
- free(id->use_script);
- if(id->equip_script)
- free(id->equip_script);
- free(id);
-
- return 0;
-}
-
-void itemdb_reload(void)
-{
- /*
-
- <empty item databases>
- itemdb_read();
-
- */
-
- do_init_itemdb();
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-void do_final_itemdb(void)
-{
- if(item_db){
- numdb_final(item_db,itemdb_final);
- item_db=NULL;
- }
-}
-
-/*
-static FILE *dfp;
-static int itemdebug(void *key,void *data,va_list ap){
-// struct item_data *id=(struct item_data *)data;
- fprintf(dfp,"%6d",(int)key);
- return 0;
-}
-void itemdebugtxt()
-{
- dfp=fopen("itemdebug.txt","wt");
- numdb_foreach(item_db,itemdebug);
- fclose(dfp);
-}
-*/
-#ifdef TXT_ONLY
-/*====================================
- * Removed item_value_db, don't re-add
- *------------------------------------
- */
-static void itemdb_read(void)
-{
- itemdb_read_itemslottable();
- itemdb_readdb();
- itemdb_read_randomitem();
- itemdb_read_itemavail();
- itemdb_read_noequip();
- itemdb_read_cardillustnametable();
- if (!battle_config.item_name_override_grffile)
- itemdb_read_itemnametable();
-}
-#endif /* TXT_ONLY */
-/*==========================================
- *
- *------------------------------------------
- */
-int do_init_itemdb(void)
-{
- item_db = numdb_init();
-
- itemdb_read();
-
- return 0;
-}
+// $Id: itemdb.c,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "db.h"
+#include "grfio.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "map.h"
+#include "battle.h"
+#include "itemdb.h"
+#include "script.h"
+#include "pc.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define MAX_RANDITEM 2000
+
+// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
+// ’è‹`‚·‚é‚ÆAitemdb.txt‚Ægrf‚Å–¼‘O‚ªˆÙ‚È‚éê‡A•\Ž¦‚µ‚Ü‚·.
+//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
+
+static struct dbt* item_db;
+
+static struct random_item_data blue_box[MAX_RANDITEM],violet_box[MAX_RANDITEM],card_album[MAX_RANDITEM],gift_box[MAX_RANDITEM],scroll[MAX_RANDITEM];
+static int blue_box_count=0,violet_box_count=0,card_album_count=0,gift_box_count=0,scroll_count=0;
+static int blue_box_default=0,violet_box_default=0,card_album_default=0,gift_box_default=0,scroll_default=0;
+
+// Function declarations
+
+static void itemdb_read(void);
+static int itemdb_readdb(void);
+#ifndef TXT_ONLY
+static int itemdb_read_sqldb(void);
+#endif /* not TXT_ONLY */
+static int itemdb_read_randomitem();
+static int itemdb_read_itemavail(void);
+static int itemdb_read_itemnametable(void);
+static int itemdb_read_noequip(void);
+void itemdb_reload(void);
+
+/*==========================================
+ * –¼‘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(void *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( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 ||
+// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
+ if( strcmpi(item->name,str)==0 ) //by lupus
+ *dst=item;
+ return 0;
+}
+
+/*==========================================
+ * –¼‘O‚ÅŒŸõ—p
+ *------------------------------------------
+ */
+int itemdb_searchjname_sub(void *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( strcmpi(item->jname,str)==0 )
+ *dst=item;
+ return 0;
+}
+/*==========================================
+ * –¼‘O‚ÅŒŸõ
+ *------------------------------------------
+ */
+struct item_data* itemdb_searchname(const char *str)
+{
+ struct item_data *item=NULL;
+ numdb_foreach(item_db,itemdb_searchname_sub,str,&item);
+ return item;
+}
+
+/*==========================================
+ * ” ŒnƒAƒCƒeƒ€ŒŸõ
+ *------------------------------------------
+ */
+int itemdb_searchrandomid(int flags)
+{
+ int nameid=0,i,index,count;
+ struct random_item_data *list=NULL;
+
+ struct {
+ int nameid,count;
+ struct random_item_data *list;
+ } data[] ={
+ { 0,0,NULL },
+ { blue_box_default ,blue_box_count ,blue_box },
+ { violet_box_default,violet_box_count ,violet_box },
+ { card_album_default,card_album_count ,card_album },
+ { gift_box_default ,gift_box_count ,gift_box },
+ { scroll_default ,scroll_count ,scroll },
+ };
+
+ if(flags>=1 && flags<=5){
+ nameid=data[flags].nameid;
+ count=data[flags].count;
+ list=data[flags].list;
+
+ if(count > 0) {
+ for(i=0;i<1000;i++) {
+ index = rand()%count;
+ if( rand()%1000000 < list[index].per) {
+ nameid = list[index].nameid;
+ break;
+ }
+ }
+ }
+ }
+ return nameid;
+}
+
+/*==========================================
+ * DB‚Ì‘¶ÝŠm”F
+ *------------------------------------------
+ */
+struct item_data* itemdb_exists(int nameid)
+{
+ return numdb_search(item_db,nameid);
+}
+/*==========================================
+ * DB‚ÌŒŸõ
+ *------------------------------------------
+ */
+struct item_data* itemdb_search(int nameid)
+{
+ struct item_data *id;
+
+ id=numdb_search(item_db,nameid);
+ if(id) return id;
+
+ id=(struct item_data *)aCalloc(1,sizeof(struct item_data));
+ numdb_insert(item_db,nameid,id);
+
+ id->nameid=nameid;
+ id->value_buy=10;
+ id->value_sell=id->value_buy/2;
+ id->weight=10;
+ id->sex=2;
+ id->elv=0;
+ id->class=0xffffffff;
+ id->flag.available=0;
+ id->flag.value_notdc=0; //ˆê‰žEEE
+ id->flag.value_notoc=0;
+ id->flag.no_equip=0;
+ id->view_id=0;
+
+ if(nameid>500 && nameid<600)
+ id->type=0; //heal item
+ else if(nameid>600 && nameid<700)
+ id->type=2; //use item
+ else if((nameid>700 && nameid<1100) ||
+ (nameid>7000 && nameid<8000))
+ id->type=3; //correction
+ else if(nameid>=1750 && nameid<1771)
+ id->type=10; //arrow
+ else if(nameid>1100 && nameid<2000)
+ id->type=4; //weapon
+ else if((nameid>2100 && nameid<3000) ||
+ (nameid>5000 && nameid<6000))
+ id->type=5; //armor
+ else if(nameid>4000 && nameid<5000)
+ id->type=6; //card
+ else if(nameid>9000 && nameid<10000)
+ id->type=7; //egg
+ else if(nameid>10000)
+ id->type=8; //petequip
+
+ return id;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip(int nameid)
+{
+ int type=itemdb_type(nameid);
+ if(type==0 || type==2 || type==3 || type==6 || type==10)
+ return 0;
+ return 1;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip2(struct item_data *data)
+{
+ if(data) {
+ int type=data->type;
+ if(type==0 || type==2 || type==3 || type==6 || type==10)
+ return 0;
+ else
+ return 1;
+ }
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int itemdb_isequip3(int nameid)
+{
+ int type=itemdb_type(nameid);
+ if(type==4 || type==5 || type == 8)
+ return 1;
+ return 0;
+}
+
+/*==========================================
+ * ŽÌ‚Ä‚ç‚ê‚éƒAƒCƒeƒ€‚Í1A‚»‚¤‚Å‚È‚¢ƒAƒCƒeƒ€‚Í0
+ *------------------------------------------
+ */
+int itemdb_isdropable(int nameid)
+{
+ //Œ‹¥Žw—Ö‚ÍŽÌ‚Ä‚ç‚ê‚È‚¢
+ switch(nameid){
+ case 2634: //Œ‹¥Žw—Ö
+ case 2635: //Œ‹¥Žw—Ö
+ return 0;
+ }
+
+ return 1;
+}
+
+//
+// ‰Šú‰»
+//
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int itemdb_read_itemslottable(void)
+{
+ char *buf,*p;
+ int s;
+
+ buf=grfio_read("data\\itemslottable.txt");
+ if(buf==NULL)
+ return -1;
+ s=grfio_size("data\\itemslottable.txt");
+ buf[s]=0;
+ for(p=buf;p-buf<s;){
+ int nameid,equip;
+ sscanf(p,"%d#%d#",&nameid,&equip);
+ itemdb_search(nameid)->equip=equip;
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ free(buf);
+
+ return 0;
+}
+
+#ifndef TXT_ONLY
+/*====================================
+ * Removed item_value_db, don't re-add
+ *------------------------------------
+ */
+static void itemdb_read(void)
+{
+ itemdb_read_itemslottable();
+
+ if (db_use_sqldbs)
+ {
+ itemdb_read_sqldb();
+ }
+ else
+ {
+ itemdb_readdb();
+ }
+
+ itemdb_read_randomitem();
+ itemdb_read_itemavail();
+ itemdb_read_noequip();
+
+ if (!battle_config.item_name_override_grffile)
+ itemdb_read_itemnametable();
+}
+
+#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[]={ "db/item_db.txt","db/item_db2.txt" };
+
+ for(i=0;i<2;i++){
+
+ fp=fopen(filename[i],"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ printf("can't read %s\n",filename[i]);
+ exit(1);
+ }
+
+ lines=0;
+ while(fgets(line,1020,fp)){
+ lines++;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(str,0,sizeof(str));
+ for(j=0,np=p=line;j<17 && 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 || nameid>=20000)
+ continue;
+ ln++;
+
+ //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View
+ id=itemdb_search(nameid);
+ memcpy(id->name,str[1],24);
+ memcpy(id->jname,str[2],24);
+ id->type=atoi(str[3]);
+ // buy‚sell*2 ‚Í item_value_db.txt ‚ÅŽw’肵‚Ä‚­‚¾‚³‚¢B
+ if (atoi(str[5])) { // sell’l‚ð—Dæ‚Æ‚·‚é
+ id->value_buy=atoi(str[5])*2;
+ id->value_sell=atoi(str[5]);
+ } else {
+ id->value_buy=atoi(str[4]);
+ id->value_sell=atoi(str[4])/2;
+ }
+ 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]);
+ id->class=atoi(str[11]);
+ id->sex=atoi(str[12]);
+ if(id->equip != atoi(str[13])){
+ id->equip=atoi(str[13]);
+ }
+ id->wlv=atoi(str[14]);
+ id->elv=atoi(str[15]);
+ id->look=atoi(str[16]);
+ id->flag.available=1;
+ id->flag.value_notdc=0;
+ id->flag.value_notoc=0;
+ id->view_id=0;
+
+ id->use_script=NULL;
+ id->equip_script=NULL;
+
+ if((p=strchr(np,'{'))==NULL)
+ continue;
+ id->use_script = parse_script(p,lines);
+ if((p=strchr(p+1,'{'))==NULL)
+ continue;
+ id->equip_script = parse_script(p,lines);
+ }
+ fclose(fp);
+ printf("read %s done (count=%d)\n",filename[i],ln);
+ }
+ return 0;
+}
+
+// Removed item_value_db, don't re-add!
+
+/*==========================================
+ * ƒ‰ƒ“ƒ_ƒ€ƒAƒCƒeƒ€oŒ»ƒf[ƒ^‚Ì“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static int itemdb_read_randomitem()
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0;
+ int nameid,i,j;
+ char *str[10],*p;
+
+ const struct {
+ char filename[64];
+ struct random_item_data *pdata;
+ int *pcount,*pdefault;
+ } data[] = {
+ {"db/item_bluebox.txt", blue_box, &blue_box_count, &blue_box_default },
+ {"db/item_violetbox.txt", violet_box, &violet_box_count, &violet_box_default },
+ {"db/item_cardalbum.txt", card_album, &card_album_count, &card_album_default },
+ {"db/item_giftbox.txt", gift_box, &gift_box_count, &gift_box_default },
+ {"db/item_scroll.txt", scroll, &scroll_count, &scroll_default },
+ };
+
+ for(i=0;i<sizeof(data)/sizeof(data[0]);i++){
+ struct random_item_data *pd=data[i].pdata;
+ int *pc=data[i].pcount;
+ int *pdefault=data[i].pdefault;
+ char *fn=data[i].filename;
+
+ *pdefault = 0;
+ if( (fp=fopen(fn,"r"))==NULL ){
+ printf("can't read %s\n",fn);
+ continue;
+ }
+
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(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;
+
+ nameid=atoi(str[0]);
+ if(nameid<0 || nameid>=20000)
+ continue;
+ if(nameid == 0) {
+ if(str[2])
+ *pdefault = atoi(str[2]);
+ continue;
+ }
+
+ if(str[2]){
+ pd[ *pc ].nameid = nameid;
+ pd[(*pc)++].per = atoi(str[2]);
+ }
+
+ if(ln >= MAX_RANDITEM)
+ break;
+ ln++;
+ }
+ fclose(fp);
+ printf("read %s done (count=%d)\n",fn,*pc);
+ }
+
+ return 0;
+}
+/*==========================================
+ * ƒAƒCƒeƒ€Žg—p‰Â”\ƒtƒ‰ƒO‚̃I[ƒo[ƒ‰ƒCƒh
+ *------------------------------------------
+ */
+static int itemdb_read_itemavail(void)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0;
+ int nameid,j,k;
+ char *str[10],*p;
+
+ if( (fp=fopen("db/item_avail.txt","r"))==NULL ){
+ printf("can't read db/item_avail.txt\n");
+ return -1;
+ }
+
+ while(fgets(line,1020,fp)){
+ struct item_data *id;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(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 || nameid>=20000 || !(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);
+ printf("read db/item_avail.txt done (count=%d)\n",ln);
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚Ì–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+static int itemdb_read_itemnametable(void)
+{
+ char *buf,*p;
+ int s;
+
+ buf=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];
+
+ if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){
+
+#ifdef ITEMDB_OVERRIDE_NAME_VERBOSE
+ if( itemdb_exists(nameid) &&
+ strncmp(itemdb_search(nameid)->jname,buf2,24)!=0 ){
+ printf("[override] %d %s => %s\n",nameid
+ ,itemdb_search(nameid)->jname,buf2);
+ }
+#endif
+
+ memcpy(itemdb_search(nameid)->jname,buf2,24);
+ }
+
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ free(buf);
+ printf("read data\\idnum2itemdisplaynametable.txt done.\n");
+
+ return 0;
+}
+#ifdef TXT_ONLY
+/*==========================================
+ * ƒJ[ƒhƒCƒ‰ƒXƒg‚̃Šƒ\[ƒX–¼‘Oƒe[ƒuƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+static int itemdb_read_cardillustnametable(void)
+{
+ char *buf,*p;
+ int s;
+
+ buf=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);
+// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname);
+ }
+
+ p=strchr(p,10);
+ if(!p) break;
+ p++;
+ }
+ free(buf);
+ printf("read data\\num2cardillustnametable.txt done.\n");
+
+ return 0;
+}
+#endif /* TXT_ONLY */
+/*==========================================
+ * ‘•”õ§ŒÀƒ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;
+
+ if( (fp=fopen("db/item_noequip.txt","r"))==NULL ){
+ printf("can't read db/item_noequip.txt\n");
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(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 || nameid>=20000 || !(id=itemdb_exists(nameid)))
+ continue;
+
+ id->flag.no_equip=atoi(str[1]);
+
+ ln++;
+
+ }
+ fclose(fp);
+ printf("read db/item_noequip.txt done (count=%d)\n",ln);
+ return 0;
+}
+#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
+
+ // ----------
+
+ sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db);
+
+ // 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)))
+ {
+ /* +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
+ +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+
+ | id | name_english | name_japanese | type | price_buy | price_sell | weight | attack | defence | range | slots | equip_jobs | equip_genders | equip_locations | weapon_level | equip_level | view | script_use | script_equip |
+ +----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+---------------+-----------------+--------------+-------------+------+------------+--------------+ */
+
+ nameid = atoi(sql_row[0]);
+
+ // If the identifier is not within the valid range, process the next row
+ if (nameid == 0 || nameid >= 20000)
+ {
+ continue;
+ }
+
+ // Insert a new row into the item database
+
+ /*id = calloc(sizeof(struct item_data), 1);
+
+ if (id == NULL)
+ {
+ printf("out of memory : itemdb_read_sqldb\n");
+ exit(1);
+ }
+
+ memset(id, 0, sizeof(struct item_data));
+ numdb_insert(item_db, (int) nameid, id);*/
+
+ // ----------
+ id=itemdb_search(nameid);
+
+ memcpy(id->name, sql_row[1], 25);
+ memcpy(id->jname, sql_row[2], 25);
+
+ id->type = atoi(sql_row[3]);
+
+ // 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;
+ id->class = (sql_row[11] != NULL) ? atoi(sql_row[11]) : 0;
+ id->sex = (sql_row[12] != NULL) ? atoi(sql_row[12]) : 0;
+ id->equip = (sql_row[13] != NULL) ? atoi(sql_row[13]) : 0;
+ id->wlv = (sql_row[14] != NULL) ? atoi(sql_row[14]) : 0;
+ id->elv = (sql_row[15] != NULL) ? atoi(sql_row[15]) : 0;
+ id->look = (sql_row[16] != NULL) ? atoi(sql_row[16]) : 0;
+
+ id->view_id = 0;
+
+ // ----------
+
+ if (sql_row[17] != NULL)
+ {
+ if (sql_row[17][0] == '{')
+ id->use_script = parse_script(sql_row[17], 0);
+ else {
+ sprintf(script, "{%s}", sql_row[17]);
+ id->use_script = parse_script(script, 0);
+ }
+ }
+ else
+ {
+ id->use_script = NULL;
+ }
+
+ if (sql_row[18] != NULL)
+ {
+ if (sql_row[18][0] == '{')
+ id->equip_script = parse_script(sql_row[18], 0);
+ else {
+ sprintf(script, "{%s}", sql_row[18]);
+ id->equip_script = parse_script(script, 0);
+ }
+ }
+ else
+ {
+ id->equip_script = NULL;
+ }
+
+ // ----------
+
+ id->flag.available = 1;
+ id->flag.value_notdc = 0;
+ id->flag.value_notoc = 0;
+ }
+
+ // If the retrieval failed, output an error
+ if (mysql_errno(&mmysql_handle))
+ {
+ printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
+ }
+
+ printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res));
+ }
+ else
+ {
+ printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
+ }
+
+ // Free the query result
+ mysql_free_result(sql_res);
+ }
+ else
+ {
+ printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mmysql_handle));
+ }
+
+ return 0;
+}
+
+#endif /* not TXT_ONLY */
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int itemdb_final(void *key,void *data,va_list ap)
+{
+ struct item_data *id;
+
+ nullpo_retr(0, id=data);
+
+ if(id->use_script)
+ free(id->use_script);
+ if(id->equip_script)
+ free(id->equip_script);
+ free(id);
+
+ return 0;
+}
+
+void itemdb_reload(void)
+{
+ /*
+
+ <empty item databases>
+ itemdb_read();
+
+ */
+
+ do_init_itemdb();
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+void do_final_itemdb(void)
+{
+ if(item_db){
+ numdb_final(item_db,itemdb_final);
+ item_db=NULL;
+ }
+}
+
+/*
+static FILE *dfp;
+static int itemdebug(void *key,void *data,va_list ap){
+// struct item_data *id=(struct item_data *)data;
+ fprintf(dfp,"%6d",(int)key);
+ return 0;
+}
+void itemdebugtxt()
+{
+ dfp=fopen("itemdebug.txt","wt");
+ numdb_foreach(item_db,itemdebug);
+ fclose(dfp);
+}
+*/
+#ifdef TXT_ONLY
+/*====================================
+ * Removed item_value_db, don't re-add
+ *------------------------------------
+ */
+static void itemdb_read(void)
+{
+ itemdb_read_itemslottable();
+ itemdb_readdb();
+ itemdb_read_randomitem();
+ itemdb_read_itemavail();
+ itemdb_read_noequip();
+ itemdb_read_cardillustnametable();
+ if (!battle_config.item_name_override_grffile)
+ itemdb_read_itemnametable();
+}
+#endif /* TXT_ONLY */
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int do_init_itemdb(void)
+{
+ item_db = numdb_init();
+
+ itemdb_read();
+
+ return 0;
+}
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index 05ecc572f..0edfad243 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -1,84 +1,84 @@
-// $Id: itemdb.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-#include "map.h"
-
-struct item_data {
- int nameid;
- char name[24],jname[24];
- char prefix[24],suffix[24];
- char cardillustname[64];
- int value_buy;
- int value_sell;
- int type;
- int class;
- int sex;
- int equip;
- int weight;
- int atk;
- int def;
- int range;
- int slot;
- int look;
- int elv;
- int wlv;
- int refine;
- char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
- char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
- struct {
- unsigned available : 1;
- unsigned value_notdc : 1;
- unsigned value_notoc : 1;
- unsigned no_equip : 3;
- unsigned no_drop : 1;
- unsigned no_use : 1;
- } flag;
- int view_id;
-};
-
-struct random_item_data {
- int nameid;
- int per;
-};
-
-struct item_data* itemdb_searchname(const char *name);
-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)->use_script
-#define itemdb_equipscript(n) itemdb_search(n)->equip_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)
-
-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
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-int itemdb_isequip3(int);
-int itemdb_isdropable(int nameid);
-
-// 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
+// $Id: itemdb.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
+#ifndef _ITEMDB_H_
+#define _ITEMDB_H_
+
+#include "map.h"
+
+struct item_data {
+ int nameid;
+ char name[24],jname[24];
+ char prefix[24],suffix[24];
+ char cardillustname[64];
+ int value_buy;
+ int value_sell;
+ int type;
+ int class;
+ int sex;
+ int equip;
+ int weight;
+ int atk;
+ int def;
+ int range;
+ int slot;
+ int look;
+ int elv;
+ int wlv;
+ int refine;
+ char *use_script; // ‰ñ•œ‚Æ‚©‚à‘S•”‚±‚Ì’†‚Å‚â‚낤‚©‚È‚Æ
+ char *equip_script; // UŒ‚,–hŒä‚Ì‘®«Ý’è‚à‚±‚Ì’†‚ʼn”\‚©‚È?
+ struct {
+ unsigned available : 1;
+ unsigned value_notdc : 1;
+ unsigned value_notoc : 1;
+ unsigned no_equip : 3;
+ unsigned no_drop : 1;
+ unsigned no_use : 1;
+ } flag;
+ int view_id;
+};
+
+struct random_item_data {
+ int nameid;
+ int per;
+};
+
+struct item_data* itemdb_searchname(const char *name);
+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)->use_script
+#define itemdb_equipscript(n) itemdb_search(n)->equip_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)
+
+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
+
+int itemdb_isequip(int);
+int itemdb_isequip2(struct item_data *);
+int itemdb_isequip3(int);
+int itemdb_isdropable(int nameid);
+
+// 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 b8997a7df..6c0b01905 100644
--- a/src/map/log.c
+++ b/src/map/log.c
@@ -1,243 +1,243 @@
-// Logging functions by Azndragon & Codemaster
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "map.h"
-#include "nullpo.h"
-#include "log.h"
-
-struct Log_Config log_config;
-
-int log_branch(struct map_session_data *sd)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
- sprintf(tmp_sql, "INSERT 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, sd->status.name, sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_drop(struct map_session_data *sd, int monster_id, int *log_drop)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
- sprintf(tmp_sql, "INSERT INTO `%s` (`drop_date`, `kill_char_id`, `monster_id`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s') ", log_config.log_drop_db, sd->status.char_id, monster_id, log_drop[0], log_drop[1], log_drop[2], log_drop[3], log_drop[4], log_drop[5], log_drop[6], log_drop[7], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
- sprintf(tmp_sql, "INSERT 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], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_present(struct map_session_data *sd, int source_type, int nameid)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
- sprintf(tmp_sql, "INSERT INTO `%s` (`present_date`, `src_id`, `account_id`, `char_id`, `char_name`, `nameid`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%s', '%d', '%s') ", log_config.log_present_db, source_type, sd->status.account_id, sd->status.char_id, sd->status.name, nameid, sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
- sprintf(tmp_sql, "INSERT INTO `%s` (`produce_date`, `account_id`, `char_id`, `char_name`, `nameid`, `slot1`, `slot2`, `slot3`, `map`, `success`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%s', '%d') ", log_config.log_produce_db, sd->status.account_id, sd->status.char_id, sd->status.name, nameid, slot1, slot2, slot3, sd->mapname, success);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_refine(struct map_session_data *sd, int n, int success)
-{
- #ifndef TXT_ONLY
- int log_card[4];
- int item_level;
- int i;
-
- nullpo_retr(0, sd);
-
- if(success == 0)
- item_level = 0;
- else
- item_level = sd->status.inventory[n].refine + 1;
-
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
- sprintf(tmp_sql, "INSERT INTO `%s` (`refine_date`, `account_id`, `char_id`, `char_name`, `nameid`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `success`, `item_level`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d')", log_config.log_refine_db, sd->status.account_id, sd->status.char_id, sd->status.name, sd->status.inventory[n].nameid, sd->status.inventory[n].refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, success, item_level);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_trade(struct map_session_data *sd, struct map_session_data *target_sd, int n,int amount)
-{
- #ifndef TXT_ONLY
- int log_nameid, log_amount, log_refine, log_card[4];
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
-
- if(sd->status.inventory[n].amount>=0)
- {
- log_nameid = sd->status.inventory[n].nameid;
- log_amount = sd->status.inventory[n].amount;
- log_refine = sd->status.inventory[n].refine;
-
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
- sprintf(tmp_sql, "INSERT INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", log_config.log_trade_db, sd->status.account_id, sd->status.char_id, sd->status.name, target_sd->status.account_id, target_sd->status.char_id, target_sd->status.name, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- }
- #endif
- return 0;
-}
-
-int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount, int zeny)
-{
- #ifndef TXT_ONLY
- int log_nameid, log_amount, log_refine, log_card[4];
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
-
- if(sd->status.inventory[n].amount>=0)
- {
- log_nameid = sd->status.inventory[n].nameid;
- log_amount = sd->status.inventory[n].amount;
- log_refine = sd->status.inventory[n].refine;
-
- for(i=0;i<4;i++)
- log_card[i] = sd->status.inventory[n].card[i];
-
- sprintf(tmp_sql, "INSERT INTO `%s` (`vend_date`, `vend_account_id`, `vend_char_id`, `vend_char_name`, `buy_account_id`, `buy_char_id`, `buy_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d')", log_config.log_vend_db, sd->status.account_id, sd->status.char_id, sd->status.name, vsd->status.account_id, vsd->status.char_id, vsd->status.name, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, zeny);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- }
- #endif
- return 0;
-}
-
-int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount)
-{
- #ifndef TXT_ONLY
- nullpo_retr(0, sd);
-
- sprintf(tmp_sql,"INSERT INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%s', '%d')", log_config.log_trade_db, sd->status.account_id, sd->status.char_id, sd->status.name, target_sd->status.account_id, target_sd->status.char_id, target_sd->status.name, sd->mapname, sd->deal_zeny);
- if(mysql_query(&mmysql_handle, tmp_sql))
- printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
- #endif
- return 0;
-}
-
-int log_config_read(char *cfgName)
-{
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- if((fp = fopen(cfgName, "r")) == NULL)
- {
- printf("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,"log_branch") == 0) {
- log_config.branch = (atoi(w2));
- } else if(strcmpi(w1,"log_drop") == 0) {
- log_config.drop = (atoi(w2));
- } else if(strcmpi(w1,"log_mvpdrop") == 0) {
- log_config.mvpdrop = (atoi(w2));
- } else if(strcmpi(w1,"log_present") == 0) {
- log_config.present = (atoi(w2));
- } else if(strcmpi(w1,"log_produce") == 0) {
- log_config.produce = (atoi(w2));
- } else if(strcmpi(w1,"log_refine") == 0) {
- log_config.refine = (atoi(w2));
- } else if(strcmpi(w1,"log_trade") == 0) {
- log_config.trade = (atoi(w2));
- } else if(strcmpi(w1,"log_vend") == 0) {
- log_config.vend = (atoi(w2));
- } else if(strcmpi(w1,"log_zeny") == 0) {
- if(log_config.trade != 1)
- log_config.zeny = 0;
- else
- log_config.zeny = (atoi(w2));
- }
-
- else if(strcmpi(w1, "log_branch_db") == 0) {
- strcpy(log_config.log_branch_db, w2);
- if(log_config.branch == 1)
- printf("Logging Dead Branch Usage to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_drop_db") == 0) {
- strcpy(log_config.log_drop_db, w2);
- if(log_config.drop == 1)
- printf("Logging Item Drops 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)
- printf("Logging MVP Drops to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_present_db") == 0) {
- strcpy(log_config.log_present_db, w2);
- if(log_config.present == 1)
- printf("Logging Present Usage & Results to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_produce_db") == 0) {
- strcpy(log_config.log_produce_db, w2);
- if(log_config.produce == 1)
- printf("Logging Producing to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_refine_db") == 0) {
- strcpy(log_config.log_refine_db, w2);
- if(log_config.refine == 1)
- printf("Logging Refining to table `%s`\n", w2);
- } else if(strcmpi(w1, "log_trade_db") == 0) {
- strcpy(log_config.log_trade_db, w2);
- if(log_config.trade == 1)
- {
- printf("Logging Item Trades");
- if(log_config.zeny == 1)
- printf("and Zeny Trades");
- printf(" to table `%s`\n", w2);
- }
- } else if(strcmpi(w1, "log_vend_db") == 0) {
- strcpy(log_config.log_vend_db, w2);
- if(log_config.vend == 1)
- printf("Logging Vending to table `%s`\n", w2);
- }
- }
- }
-
- fclose(fp);
- return 0;
-}
+// Logging functions by Azndragon & Codemaster
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "map.h"
+#include "nullpo.h"
+#include "log.h"
+
+struct Log_Config log_config;
+
+int log_branch(struct map_session_data *sd)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+ sprintf(tmp_sql, "INSERT 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, sd->status.name, sd->mapname);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_drop(struct map_session_data *sd, int monster_id, int *log_drop)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+ sprintf(tmp_sql, "INSERT INTO `%s` (`drop_date`, `kill_char_id`, `monster_id`, `item1`, `item2`, `item3`, `item4`, `item5`, `item6`, `item7`, `item8`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s') ", log_config.log_drop_db, sd->status.char_id, monster_id, log_drop[0], log_drop[1], log_drop[2], log_drop[3], log_drop[4], log_drop[5], log_drop[6], log_drop[7], sd->mapname);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+ sprintf(tmp_sql, "INSERT 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], sd->mapname);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_present(struct map_session_data *sd, int source_type, int nameid)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+ sprintf(tmp_sql, "INSERT INTO `%s` (`present_date`, `src_id`, `account_id`, `char_id`, `char_name`, `nameid`, `map`) VALUES (NOW(), '%d', '%d', '%d', '%s', '%d', '%s') ", log_config.log_present_db, source_type, sd->status.account_id, sd->status.char_id, sd->status.name, nameid, sd->mapname);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+ sprintf(tmp_sql, "INSERT INTO `%s` (`produce_date`, `account_id`, `char_id`, `char_name`, `nameid`, `slot1`, `slot2`, `slot3`, `map`, `success`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%s', '%d') ", log_config.log_produce_db, sd->status.account_id, sd->status.char_id, sd->status.name, nameid, slot1, slot2, slot3, sd->mapname, success);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_refine(struct map_session_data *sd, int n, int success)
+{
+ #ifndef TXT_ONLY
+ int log_card[4];
+ int item_level;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(success == 0)
+ item_level = 0;
+ else
+ item_level = sd->status.inventory[n].refine + 1;
+
+ for(i=0;i<4;i++)
+ log_card[i] = sd->status.inventory[n].card[i];
+
+ sprintf(tmp_sql, "INSERT INTO `%s` (`refine_date`, `account_id`, `char_id`, `char_name`, `nameid`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `success`, `item_level`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d')", log_config.log_refine_db, sd->status.account_id, sd->status.char_id, sd->status.name, sd->status.inventory[n].nameid, sd->status.inventory[n].refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, success, item_level);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_trade(struct map_session_data *sd, struct map_session_data *target_sd, int n,int amount)
+{
+ #ifndef TXT_ONLY
+ int log_nameid, log_amount, log_refine, log_card[4];
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
+ return 1;
+
+ if(sd->status.inventory[n].amount>=0)
+ {
+ log_nameid = sd->status.inventory[n].nameid;
+ log_amount = sd->status.inventory[n].amount;
+ log_refine = sd->status.inventory[n].refine;
+
+ for(i=0;i<4;i++)
+ log_card[i] = sd->status.inventory[n].card[i];
+
+ sprintf(tmp_sql, "INSERT INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s')", log_config.log_trade_db, sd->status.account_id, sd->status.char_id, sd->status.name, target_sd->status.account_id, target_sd->status.char_id, target_sd->status.name, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ }
+ #endif
+ return 0;
+}
+
+int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount, int zeny)
+{
+ #ifndef TXT_ONLY
+ int log_nameid, log_amount, log_refine, log_card[4];
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
+ return 1;
+
+ if(sd->status.inventory[n].amount>=0)
+ {
+ log_nameid = sd->status.inventory[n].nameid;
+ log_amount = sd->status.inventory[n].amount;
+ log_refine = sd->status.inventory[n].refine;
+
+ for(i=0;i<4;i++)
+ log_card[i] = sd->status.inventory[n].card[i];
+
+ sprintf(tmp_sql, "INSERT INTO `%s` (`vend_date`, `vend_account_id`, `vend_char_id`, `vend_char_name`, `buy_account_id`, `buy_char_id`, `buy_char_name`, `nameid`, `amount`, `refine`, `card0`, `card1`, `card2`, `card3`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d')", log_config.log_vend_db, sd->status.account_id, sd->status.char_id, sd->status.name, vsd->status.account_id, vsd->status.char_id, vsd->status.name, log_nameid, log_amount, log_refine, log_card[0], log_card[1], log_card[2], log_card[3], sd->mapname, zeny);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ }
+ #endif
+ return 0;
+}
+
+int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount)
+{
+ #ifndef TXT_ONLY
+ nullpo_retr(0, sd);
+
+ sprintf(tmp_sql,"INSERT INTO `%s` (`trade_date`, `src_account_id`, `src_char_id`, `src_char_name`, `des_account_id`, `des_char_id`, `des_char_name`, `map`, `zeny`) VALUES (NOW(), '%d', '%d', '%s', '%d', '%d', '%s', '%s', '%d')", log_config.log_trade_db, sd->status.account_id, sd->status.char_id, sd->status.name, target_sd->status.account_id, target_sd->status.char_id, target_sd->status.name, sd->mapname, sd->deal_zeny);
+ if(mysql_query(&mmysql_handle, tmp_sql))
+ printf("DB server Error - %s\n",mysql_error(&mmysql_handle));
+ #endif
+ return 0;
+}
+
+int log_config_read(char *cfgName)
+{
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ if((fp = fopen(cfgName, "r")) == NULL)
+ {
+ printf("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,"log_branch") == 0) {
+ log_config.branch = (atoi(w2));
+ } else if(strcmpi(w1,"log_drop") == 0) {
+ log_config.drop = (atoi(w2));
+ } else if(strcmpi(w1,"log_mvpdrop") == 0) {
+ log_config.mvpdrop = (atoi(w2));
+ } else if(strcmpi(w1,"log_present") == 0) {
+ log_config.present = (atoi(w2));
+ } else if(strcmpi(w1,"log_produce") == 0) {
+ log_config.produce = (atoi(w2));
+ } else if(strcmpi(w1,"log_refine") == 0) {
+ log_config.refine = (atoi(w2));
+ } else if(strcmpi(w1,"log_trade") == 0) {
+ log_config.trade = (atoi(w2));
+ } else if(strcmpi(w1,"log_vend") == 0) {
+ log_config.vend = (atoi(w2));
+ } else if(strcmpi(w1,"log_zeny") == 0) {
+ if(log_config.trade != 1)
+ log_config.zeny = 0;
+ else
+ log_config.zeny = (atoi(w2));
+ }
+
+ else if(strcmpi(w1, "log_branch_db") == 0) {
+ strcpy(log_config.log_branch_db, w2);
+ if(log_config.branch == 1)
+ printf("Logging Dead Branch Usage to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_drop_db") == 0) {
+ strcpy(log_config.log_drop_db, w2);
+ if(log_config.drop == 1)
+ printf("Logging Item Drops 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)
+ printf("Logging MVP Drops to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_present_db") == 0) {
+ strcpy(log_config.log_present_db, w2);
+ if(log_config.present == 1)
+ printf("Logging Present Usage & Results to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_produce_db") == 0) {
+ strcpy(log_config.log_produce_db, w2);
+ if(log_config.produce == 1)
+ printf("Logging Producing to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_refine_db") == 0) {
+ strcpy(log_config.log_refine_db, w2);
+ if(log_config.refine == 1)
+ printf("Logging Refining to table `%s`\n", w2);
+ } else if(strcmpi(w1, "log_trade_db") == 0) {
+ strcpy(log_config.log_trade_db, w2);
+ if(log_config.trade == 1)
+ {
+ printf("Logging Item Trades");
+ if(log_config.zeny == 1)
+ printf("and Zeny Trades");
+ printf(" to table `%s`\n", w2);
+ }
+ } else if(strcmpi(w1, "log_vend_db") == 0) {
+ strcpy(log_config.log_vend_db, w2);
+ if(log_config.vend == 1)
+ printf("Logging Vending to table `%s`\n", w2);
+ }
+ }
+ }
+
+ fclose(fp);
+ return 0;
+}
diff --git a/src/map/log.h b/src/map/log.h
index 7047d980c..4e34ef0cc 100644
--- a/src/map/log.h
+++ b/src/map/log.h
@@ -1,27 +1,27 @@
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#ifndef TXT_ONLY
-
-extern char db_server_logdb[32];
-
-#endif //NOT TXT_ONLY
-
-int log_branch(struct map_session_data *sd);
-int log_drop(struct map_session_data *sd, int monster_id, int *log_drop);
-int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp);
-int log_present(struct map_session_data *sd, int source_type, int nameid);
-int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success);
-int log_refine(struct map_session_data *sd, int n, int success);
-int log_trade(struct map_session_data *sd,struct map_session_data *target_sd,int n,int amount);
-int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount,int zeny);
-int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount);
-
-int log_config_read(char *cfgName);
-
-extern struct Log_Config {
- int branch, drop, mvpdrop, present, produce, refine, trade, vend, zeny;
- char log_branch_db[32], log_drop_db[32], log_mvpdrop_db[32], log_present_db[32], log_produce_db[32], log_refine_db[32], log_trade_db[32], log_vend_db[32];
-} log_config;
-
-#endif
+#ifndef _LOG_H_
+#define _LOG_H_
+
+#ifndef TXT_ONLY
+
+extern char db_server_logdb[32];
+
+#endif //NOT TXT_ONLY
+
+int log_branch(struct map_session_data *sd);
+int log_drop(struct map_session_data *sd, int monster_id, int *log_drop);
+int log_mvpdrop(struct map_session_data *sd, int monster_id, int *log_mvp);
+int log_present(struct map_session_data *sd, int source_type, int nameid);
+int log_produce(struct map_session_data *sd, int nameid, int slot1, int slot2, int slot3, int success);
+int log_refine(struct map_session_data *sd, int n, int success);
+int log_trade(struct map_session_data *sd,struct map_session_data *target_sd,int n,int amount);
+int log_vend(struct map_session_data *sd,struct map_session_data *vsd,int n,int amount,int zeny);
+int log_zeny(struct map_session_data *sd, struct map_session_data *target_sd,int amount);
+
+int log_config_read(char *cfgName);
+
+extern struct Log_Config {
+ int branch, drop, mvpdrop, present, produce, refine, trade, vend, zeny;
+ char log_branch_db[32], log_drop_db[32], log_mvpdrop_db[32], log_present_db[32], log_produce_db[32], log_refine_db[32], log_trade_db[32], log_vend_db[32];
+} log_config;
+
+#endif
diff --git a/src/map/mail.c b/src/map/mail.c
index c6155a04d..019f6303d 100644
--- a/src/map/mail.c
+++ b/src/map/mail.c
@@ -1,324 +1,324 @@
-// Mail System for eAthena SQL
-// Created by Valaris
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "nullpo.h"
-
-#include "map.h"
-#include "clif.h"
-#include "chrif.h"
-#include "intif.h"
-#include "pc.h"
-#include "mail.h"
-
-char mail_db[32] = "mail";
-
-int MAIL_CHECK_TIME = 120000;
-int mail_timer;
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-int mail_check(struct map_session_data *sd,int type)
-{
- int i=0,new=0,priority=0;
- char message[50];
-
- if(sd==NULL)
- return 0;
-
- sprintf(tmp_msql,"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_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- 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.");
- mysql_free_result(mail_res);
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- i++;
-
- if(!atoi(mail_row[5])) {
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- if(!atoi(mail_row[3])) {
- new++;
- if(atoi(mail_row[4]))
- priority++;
- if(type==2 || type==3) {
- if(atoi(mail_row[4])) {
- sprintf(message, "%d - From : %s (New - Priority)", i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- }
-
- else {
- sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- }
- }
- }
-
- else if(type==2){
- sprintf(message, "%d - From : %s", i, mail_row[2]);
- clif_displaymessage(sd->fd, message);
- }
-
- }
-
- mysql_free_result(mail_res);
-
- } else {
- printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- if(i>0 && new>0 && type==1) {
- sprintf(message, "You have %d new messages.", new);
- clif_displaymessage(sd->fd, message);
- }
- if(i>0 && new>0 && priority>0 && type==1) {
- sprintf(message, "You have %d unread priority messages.", priority);
- clif_displaymessage(sd->fd, message);
- }
- if(!new) {
- clif_displaymessage(sd->fd, "You have no new messages.");
- }
-
- return 0;
-}
-
-int mail_read(struct map_session_data *sd, int message_id)
-{
-
- char message[80];
-
- if(sd==NULL)
- return 0;
-
- sprintf(tmp_msql,"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_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- 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.");
- return 0;
- }
-
- if ((mail_row = mysql_fetch_row(mail_res))) {
-
- if(!atoi(mail_row[6])) {
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- sprintf(message, "Reading message from %s", mail_row[2]);
- clif_displaymessage(sd->fd, message);
-
- sprintf(message, "%s", mail_row[3]);
- clif_displaymessage(sd->fd, message);
-
- sprintf(tmp_msql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
- }
-
- mysql_free_result(mail_res);
-
- } else {
- printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- return 0;
-}
-
-int mail_delete(struct map_session_data *sd, int message_id)
-{
- if(sd==NULL)
- return 0;
-
- sprintf(tmp_msql,"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_msql)) {
- printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
- 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.");
- 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.");
- 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.");
- return 0;
- }
- sprintf(tmp_msql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
- if(mysql_query(&mail_handle, tmp_msql) ) {
- mysql_free_result(mail_res);
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- return 0;
- }
- else clif_displaymessage(sd->fd,"Message deleted.");
- }
-
- mysql_free_result(mail_res);
-
- } else {
- printf("MySQL error (delete query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
- return 0;
- }
-
- return 0;
-}
-
-int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
-{
- if(sd==NULL)
- return 0;
-
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
- clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
- return 0;
- }
-
- if(strcmp(name,"*")==0) {
- if(pc_isGM(sd) < 80) {
- clif_displaymessage(sd->fd, "Access Denied.");
- return 0;
- }
- else
- sprintf(tmp_msql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id);
- }
- else
- sprintf(tmp_msql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, name);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
- 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.");
- return 0;
- }
-
- while ((mail_row = mysql_fetch_row(mail_res))) {
- if(strcmp(name,"*")==0) {
- sprintf(tmp_msql, "INSERT 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, message, flag);
- }
- else {
- sprintf(tmp_msql, "INSERT 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, message, flag);
- if(pc_isGM(sd) < 80)
- sd->mail_counter=5;
- }
-
- if(mysql_query(&mail_handle, tmp_msql) ) {
- mysql_free_result(mail_res);
- printf("DB server Error (insert `mail_db`)- %s\n", mysql_error(&mail_handle) );
- return 0;
- }
-
- }
- }
-
- clif_displaymessage(sd->fd,"Mail has been sent.");
-
- return 0;
-}
-
-int mail_check_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd = NULL;
- int i;
-
- if(mail_timer != tid)
- return 0;
-
- sprintf(tmp_msql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db);
-
- if (mysql_query(&mail_handle, tmp_msql)) {
- printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
- 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))) {
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (sd = session[i]->session_data) && sd->state.auth){
- if(pc_isGM(sd) < 80 && sd->mail_counter > 0)
- sd->mail_counter--;
- if(sd->status.account_id==atoi(mail_row[0]))
- clif_displaymessage(sd->fd, "You have new mail.");
- }
- }
- }
- }
-
- sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db);
- if(mysql_query(&mail_handle, tmp_msql) ) {
- printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
- }
-
- 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;
-}
-
+// Mail System for eAthena SQL
+// Created by Valaris
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "socket.h"
+#include "timer.h"
+#include "nullpo.h"
+
+#include "map.h"
+#include "clif.h"
+#include "chrif.h"
+#include "intif.h"
+#include "pc.h"
+#include "mail.h"
+
+char mail_db[32] = "mail";
+
+int MAIL_CHECK_TIME = 120000;
+int mail_timer;
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+int mail_check(struct map_session_data *sd,int type)
+{
+ int i=0,new=0,priority=0;
+ char message[50];
+
+ if(sd==NULL)
+ return 0;
+
+ sprintf(tmp_msql,"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_msql)) {
+ printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ 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.");
+ mysql_free_result(mail_res);
+ return 0;
+ }
+
+ while ((mail_row = mysql_fetch_row(mail_res))) {
+ i++;
+
+ if(!atoi(mail_row[5])) {
+ sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
+ }
+ }
+
+ if(!atoi(mail_row[3])) {
+ new++;
+ if(atoi(mail_row[4]))
+ priority++;
+ if(type==2 || type==3) {
+ if(atoi(mail_row[4])) {
+ sprintf(message, "%d - From : %s (New - Priority)", i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ }
+
+ else {
+ sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ }
+ }
+ }
+
+ else if(type==2){
+ sprintf(message, "%d - From : %s", i, mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+ }
+
+ }
+
+ mysql_free_result(mail_res);
+
+ } else {
+ printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ return 0;
+ }
+
+ if(i>0 && new>0 && type==1) {
+ sprintf(message, "You have %d new messages.", new);
+ clif_displaymessage(sd->fd, message);
+ }
+ if(i>0 && new>0 && priority>0 && type==1) {
+ sprintf(message, "You have %d unread priority messages.", priority);
+ clif_displaymessage(sd->fd, message);
+ }
+ if(!new) {
+ clif_displaymessage(sd->fd, "You have no new messages.");
+ }
+
+ return 0;
+}
+
+int mail_read(struct map_session_data *sd, int message_id)
+{
+
+ char message[80];
+
+ if(sd==NULL)
+ return 0;
+
+ sprintf(tmp_msql,"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_msql)) {
+ printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ 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.");
+ return 0;
+ }
+
+ if ((mail_row = mysql_fetch_row(mail_res))) {
+
+ if(!atoi(mail_row[6])) {
+ sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
+ }
+ }
+
+ sprintf(message, "Reading message from %s", mail_row[2]);
+ clif_displaymessage(sd->fd, message);
+
+ sprintf(message, "%s", mail_row[3]);
+ clif_displaymessage(sd->fd, message);
+
+ sprintf(tmp_msql,"UPDATE `%s` SET `read_flag`='1' WHERE `message_id`= \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
+ }
+ }
+
+ mysql_free_result(mail_res);
+
+ } else {
+ printf("MySQL error (storing query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ return 0;
+ }
+
+ return 0;
+}
+
+int mail_delete(struct map_session_data *sd, int message_id)
+{
+ if(sd==NULL)
+ return 0;
+
+ sprintf(tmp_msql,"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_msql)) {
+ printf("Database server error (executing query for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ 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.");
+ 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.");
+ 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.");
+ return 0;
+ }
+ sprintf(tmp_msql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ mysql_free_result(mail_res);
+ printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
+ return 0;
+ }
+ else clif_displaymessage(sd->fd,"Message deleted.");
+ }
+
+ mysql_free_result(mail_res);
+
+ } else {
+ printf("MySQL error (delete query result for %s): %s\n", mail_db, mysql_error(&mail_handle));
+ return 0;
+ }
+
+ return 0;
+}
+
+int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
+{
+ if(sd==NULL)
+ return 0;
+
+ if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
+ clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
+ return 0;
+ }
+
+ if(strcmp(name,"*")==0) {
+ if(pc_isGM(sd) < 80) {
+ clif_displaymessage(sd->fd, "Access Denied.");
+ return 0;
+ }
+ else
+ sprintf(tmp_msql,"SELECT DISTINCT `account_id` FROM `%s` WHERE `account_id` <> '%d' ORDER BY `account_id`", char_db, sd->status.account_id);
+ }
+ else
+ sprintf(tmp_msql,"SELECT `account_id`,`name` FROM `%s` WHERE `name` = \"%s\"", char_db, name);
+
+ if (mysql_query(&mail_handle, tmp_msql)) {
+ printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
+ 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.");
+ return 0;
+ }
+
+ while ((mail_row = mysql_fetch_row(mail_res))) {
+ if(strcmp(name,"*")==0) {
+ sprintf(tmp_msql, "INSERT 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, message, flag);
+ }
+ else {
+ sprintf(tmp_msql, "INSERT 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, message, flag);
+ if(pc_isGM(sd) < 80)
+ sd->mail_counter=5;
+ }
+
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ mysql_free_result(mail_res);
+ printf("DB server Error (insert `mail_db`)- %s\n", mysql_error(&mail_handle) );
+ return 0;
+ }
+
+ }
+ }
+
+ clif_displaymessage(sd->fd,"Mail has been sent.");
+
+ return 0;
+}
+
+int mail_check_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd = NULL;
+ int i;
+
+ if(mail_timer != tid)
+ return 0;
+
+ sprintf(tmp_msql,"SELECT DISTINCT `to_account_id` FROM `%s` WHERE `read_flag` = '0' AND `check_flag` = '0'", mail_db);
+
+ if (mysql_query(&mail_handle, tmp_msql)) {
+ printf("Database server error (executing query for %s): %s\n", char_db, mysql_error(&mail_handle));
+ 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))) {
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (sd = session[i]->session_data) && sd->state.auth){
+ if(pc_isGM(sd) < 80 && sd->mail_counter > 0)
+ sd->mail_counter--;
+ if(sd->status.account_id==atoi(mail_row[0]))
+ clif_displaymessage(sd->fd, "You have new mail.");
+ }
+ }
+ }
+ }
+
+ sprintf(tmp_msql,"UPDATE `%s` SET `check_flag`='1' WHERE `check_flag`= '0' ", mail_db);
+ if(mysql_query(&mail_handle, tmp_msql) ) {
+ printf("DB server Error (update Read `%s`)- %s\n", mail_db, mysql_error(&mail_handle) );
+ }
+
+ 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;
+}
+
diff --git a/src/map/mail.h b/src/map/mail.h
index cfa86c6bb..6bd8e510c 100644
--- a/src/map/mail.h
+++ b/src/map/mail.h
@@ -1,9 +1,9 @@
-// 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);
+// 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.c b/src/map/map.c
index 217f36c88..21ee089ea 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1,2208 +1,2208 @@
-// $Id: map.c,v 1.6 2004/09/25 17:37:01 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef _WIN32
-#include <winsock.h>
-#else
-#include <netdb.h>
-#endif
-
-#include "core.h"
-#include "timer.h"
-#include "db.h"
-#include "grfio.h"
-#include "malloc.h"
-
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "npc.h"
-#include "pc.h"
-#include "mob.h"
-#include "chat.h"
-#include "itemdb.h"
-#include "storage.h"
-#include "skill.h"
-#include "trade.h"
-#include "party.h"
-#include "battle.h"
-#include "script.h"
-#include "guild.h"
-#include "pet.h"
-#include "atcommand.h"
-#include "nullpo.h"
-#include "socket.h"
-#include "log.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-unsigned long ticks = 0; // by MC Cameri
-
-#ifndef TXT_ONLY
-
-#include "mail.h" // mail system [Valaris]
-
-MYSQL mmysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-char tmp_sql[65535]="";
-
-MYSQL lmysql_handle;
-MYSQL_RES* lsql_res ;
-MYSQL_ROW lsql_row ;
-char tmp_lsql[65535]="";
-
-MYSQL mail_handle; // mail system [Valaris]
-MYSQL_RES* mail_res ;
-MYSQL_ROW mail_row ;
-char tmp_msql[65535]="";
-
-int map_server_port = 3306;
-char map_server_ip[16] = "127.0.0.1";
-char map_server_id[32] = "ragnarok";
-char map_server_pw[32] = "ragnarok";
-char map_server_db[32] = "ragnarok";
-int db_use_sqldbs = 0;
-
-int login_server_port = 3306;
-char login_server_ip[16] = "127.0.0.1";
-char login_server_id[32] = "ragnarok";
-char login_server_pw[32] = "ragnarok";
-char login_server_db[32] = "ragnarok";
-
-char item_db_db[32] = "item_db";
-char mob_db_db[32] = "mob_db";
-char login_db[32] = "login";
-char login_db_level[32] = "level";
-char login_db_account_id[32] = "account_id";
-
-char log_db[32] = "log";
-char log_db_ip[16] = "127.0.0.1";
-char log_db_id[32] = "ragnarok";
-char log_db_pw[32] = "ragnarok";
-int log_db_port = 3306;
-
-char gm_db[32] = "login";
-char gm_db_level[32] = "level";
-char gm_db_account_id[32] = "account_id";
-
-int lowest_gm_level = 1;
-int read_gm_interval = 600000;
-
-char char_db[32] = "char";
-
-static int online_timer(int,unsigned int,int,int);
-
-int CHECK_INTERVAL = 3600000; // [Valaris]
-int check_online_timer=0; // [Valaris]
-
-#endif /* not TXT_ONLY */
-// ‹É—Í static‚Ń[ƒJƒ‹‚ÉŽû‚ß‚é
-static struct dbt * id_db=NULL;
-static struct dbt * map_db=NULL;
-static struct dbt * nick_db=NULL;
-static struct dbt * charid_db=NULL;
-
-static int users=0;
-static struct block_list *object[MAX_FLOORITEM];
-static int first_free_object_id=0,last_object_id=0;
-
-#define block_free_max 1048576
-static void *block_free[block_free_max];
-static int block_free_count = 0, block_free_lock = 0;
-
-#define BL_LIST_MAX 1048576
-static struct block_list *bl_list[BL_LIST_MAX];
-static int bl_list_count = 0;
-
-struct map_data map[MAX_MAP_PER_SERVER];
-int map_num = 0;
-
-int map_port=0;
-
-int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
-int agit_flag = 0;
-int night_flag = 0; // 0=day, 1=night [Yor]
-
-//Added for Mugendai's I'm Alive mod
-int imalive_on=0;
-int imalive_time=60;
-//Added by Mugendai for GUI
-int flush_on=1;
-int flush_time=100;
-
-struct charid2nick {
- char nick[24];
- int req_id;
-};
-
-char motd_txt[256] = "conf/motd.txt";
-char help_txt[256] = "conf/help.txt";
-
-char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file
-
-int console = 0;
-/*==========================================
- * ‘SmapŽI‘Œv‚Å‚ÌÚ‘±”Ý’è
- * (charŽI‚©‚ç‘—‚ç‚ê‚Ä‚­‚é)
- *------------------------------------------
- */
-void map_setusers(int n) {
- users = n;
-}
-
-/*==========================================
- * ‘SmapŽI‘Œv‚Å‚ÌÚ‘±”Žæ“¾ (/w‚ւ̉ž“š—p)
- *------------------------------------------
- */
-int map_getusers(void) {
- return users;
-}
-
-//
-// block휂̈À‘S«Šm•Ûˆ—
-//
-
-/*==========================================
- * block‚ðfree‚·‚é‚Æ‚«free‚Ì•Ï‚í‚è‚ɌĂÔ
- * ƒƒbƒN‚³‚ê‚Ä‚¢‚é‚Æ‚«‚̓oƒbƒtƒ@‚É‚½‚ß‚é
- *------------------------------------------
- */
-int map_freeblock( void *bl )
-{
- if(block_free_lock==0){
- free(bl);
- bl = NULL;
- }
- else{
- if( block_free_count>=block_free_max ) {
- if(battle_config.error_log)
- printf("map_freeblock: *WARNING* too many free block! %d %d\n",
- block_free_count,block_free_lock);
- }
- else
- block_free[block_free_count++]=bl;
- }
- return block_free_lock;
-}
-/*==========================================
- * block‚Ìfree‚ðˆêŽž“I‚É‹ÖŽ~‚·‚é
- *------------------------------------------
- */
-int map_freeblock_lock(void) {
- return ++block_free_lock;
-}
-
-/*==========================================
- * block‚Ìfree‚̃ƒbƒN‚ð‰ðœ‚·‚é
- * ‚±‚Ì‚Æ‚«AƒƒbƒN‚ªŠ®‘S‚É‚È‚­‚È‚é‚Æ
- * ƒoƒbƒtƒ@‚É‚½‚Ü‚Á‚Ä‚¢‚½block‚ð‘S•”íœ
- *------------------------------------------
- */
-int map_freeblock_unlock(void) {
- if ((--block_free_lock) == 0) {
- int i;
-// if(block_free_count>0) {
-// if(battle_config.error_log)
-// printf("map_freeblock_unlock: free %d object\n",block_free_count);
-// }
- for(i=0;i<block_free_count;i++){
- free(block_free[i]);
- block_free[i] = NULL;
- }
- block_free_count=0;
- }else if(block_free_lock<0){
- if(battle_config.error_log)
- printf("map_freeblock_unlock: lock count < 0 !\n");
- }
- return block_free_lock;
-}
-
-
-//
-// block‰»ˆ—
-//
-/*==========================================
- * map[]‚Ìblock_list‚©‚çŒq‚ª‚Á‚Ä‚¢‚éꇂÉ
- * bl->prev‚Ébl_head‚̃AƒhƒŒƒX‚ð“ü‚ê‚Ä‚¨‚­
- *------------------------------------------
- */
-static struct block_list bl_head;
-
-/*==========================================
- * map[]‚Ìblock_list‚ɒljÁ
- * mob‚Í”‚ª‘½‚¢‚̂ŕʃŠƒXƒg
- *
- * Šù‚ÉlinkÏ‚Ý‚©‚ÌŠm”F‚ª–³‚¢BŠëŒ¯‚©‚à
- *------------------------------------------
- */
-int map_addblock(struct block_list *bl)
-{
- int m,x,y;
-
- nullpo_retr(0, bl);
-
- if(bl->prev != NULL){
- if(battle_config.error_log)
- printf("map_addblock error : bl->prev!=NULL\n");
- return 0;
- }
-
- m=bl->m;
- x=bl->x;
- y=bl->y;
- if(m<0 || m>=map_num ||
- x<0 || x>=map[m].xs ||
- y<0 || y>=map[m].ys)
- return 1;
-
- if(bl->type==BL_MOB){
- bl->next = map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
- bl->prev = &bl_head;
- if(bl->next) bl->next->prev = bl;
- map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
- map[m].block_mob_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
- } else {
- bl->next = map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
- bl->prev = &bl_head;
- if(bl->next) bl->next->prev = bl;
- map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
- map[m].block_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
- if(bl->type==BL_PC)
- map[m].users++;
- }
-
- return 0;
-}
-
-/*==========================================
- * map[]‚Ìblock_list‚©‚çŠO‚·
- * prev‚ªNULL‚Ìê‡list‚ÉŒq‚ª‚Á‚Ä‚È‚¢
- *------------------------------------------
- */
-int map_delblock(struct block_list *bl)
-{
- int b;
- nullpo_retr(0, bl);
-
- // Šù‚Éblocklist‚©‚甲‚¯‚Ä‚¢‚é
- if(bl->prev==NULL){
- if(bl->next!=NULL){
- // prev‚ªNULL‚Ånext‚ªNULL‚Å‚È‚¢‚Ì‚Í—L‚Á‚Ä‚Í‚È‚ç‚È‚¢
- if(battle_config.error_log)
- printf("map_delblock error : bl->next!=NULL\n");
- }
- return 0;
- }
-
- b = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*map[bl->m].bxs;
-
- if(bl->type==BL_PC)
- map[bl->m].users--;
- if(bl->next) bl->next->prev = bl->prev;
- if(bl->prev==&bl_head){
- // ƒŠƒXƒg‚Ì“ª‚È‚Ì‚ÅAmap[]‚Ìblock_list‚ðXV‚·‚é
- if(bl->type==BL_MOB){
- map[bl->m].block_mob[b] = bl->next;
- if((map[bl->m].block_mob_count[b]--) < 0)
- map[bl->m].block_mob_count[b] = 0;
- } else {
- map[bl->m].block[b] = bl->next;
- if((map[bl->m].block_count[b]--) < 0)
- map[bl->m].block_count[b] = 0;
- }
- } else {
- bl->prev->next = bl->next;
- }
- bl->next = NULL;
- bl->prev = NULL;
-
- return 0;
-}
-
-/*==========================================
- * ŽüˆÍ‚ÌPCl”‚𔂦‚é (Œ»Ý–¢Žg—p)
- *------------------------------------------
- */
-int map_countnearpc(int m, int x, int y) {
- int bx,by,c=0;
- struct block_list *bl=NULL;
-
- if(map[m].users==0)
- return 0;
- for(by=y/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;by<=y/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;by++){
- if(by<0 || by>=map[m].bys)
- continue;
- for(bx=x/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;bx<=x/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;bx++){
- if(bx<0 || bx>=map[m].bxs)
- continue;
- bl = map[m].block[bx+by*map[m].bxs];
- for(;bl;bl=bl->next){
- if(bl->type==BL_PC)
- c++;
- }
- }
- }
- return c;
-}
-
-/*==========================================
- * ƒZƒ‹ã‚ÌPC‚ÆMOB‚Ì”‚𔂦‚é (ƒOƒ‰ƒ“ƒhƒNƒƒX—p)
- *------------------------------------------
- */
-int map_count_oncell(int m, int x, int y) {
- int bx,by;
- struct block_list *bl=NULL;
- int i,c;
- int count = 0;
-
- if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys))
- return 1;
- bx = x/BLOCK_SIZE;
- by = y/BLOCK_SIZE;
-
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl->x == x && bl->y == y && bl->type == BL_PC) count++;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl->x == x && bl->y == y) count++;
- }
- if(!count) count = 1;
- return count;
-}
-
-
-/*==========================================
- * map m (x0,y0)-(x1,y1)“à‚Ì‘Sobj‚ɑ΂µ‚Ä
- * func‚ðŒÄ‚Ô
- * type!=0 ‚È‚ç‚»‚ÌŽí—Þ‚Ì‚Ý
- *------------------------------------------
- */
-void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int type,...) {
- int bx,by;
- struct block_list *bl=NULL;
- va_list ap=NULL;
- int blockcount=bl_list_count,i,c;
-
- if(m < 0)
- return;
- va_start(ap,type);
- if (x0 < 0) x0 = 0;
- if (y0 < 0) y0 = 0;
- if (x1 >= map[m].xs) x1 = map[m].xs-1;
- if (y1 >= map[m].ys) y1 = map[m].ys-1;
- if (type == 0 || type != BL_MOB)
- for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) {
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- if(type==0 || type==BL_MOB)
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * ‹éŒ`(x0,y0)-(x1,y1)‚ª(dx,dy)ˆÚ“®‚µ‚½Žž‚Ì
- * —̈æŠO‚É‚È‚é—̈æ(‹éŒ`‚©LŽšŒ`)“à‚Ìobj‚É
- * ‘΂µ‚Äfunc‚ðŒÄ‚Ô
- *
- * dx,dy‚Í-1,0,1‚Ì‚Ý‚Æ‚·‚éi‚Ç‚ñ‚È’l‚Å‚à‚¢‚¢‚Á‚Û‚¢Hj
- *------------------------------------------
- */
-void map_foreachinmovearea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int dx,int dy,int type,...) {
- int bx,by;
- struct block_list *bl=NULL;
- va_list ap=NULL;
- int blockcount=bl_list_count,i,c;
-
- va_start(ap,type);
- if(dx==0 || dy==0){
- // ‹éŒ`—̈æ‚Ìê‡
- if(dx==0){
- if(dy<0){
- y0=y1+dy+1;
- } else {
- y1=y0+dy-1;
- }
- } else if(dy==0){
- if(dx<0){
- x0=x1+dx+1;
- } else {
- x1=x0+dx-1;
- }
- }
- if(x0<0) x0=0;
- if(y0<0) y0=0;
- if(x1>=map[m].xs) x1=map[m].xs-1;
- if(y1>=map[m].ys) y1=map[m].ys-1;
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
- }else{
- // LŽš—̈æ‚Ìê‡
-
- if(x0<0) x0=0;
- if(y0<0) y0=0;
- if(x1>=map[m].xs) x1=map[m].xs-1;
- if(y1>=map[m].ys) y1=map[m].ys-1;
- for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
- for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
- continue;
- if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
- (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
- bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next){
- if(bl && type && bl->type!=type)
- continue;
- if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
- continue;
- if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
- (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
- bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
- }
-
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachinarea: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-// -- moonsoul (added map_foreachincell which is a rework of map_foreachinarea but
-// which only checks the exact single x/y passed to it rather than an
-// area radius - may be more useful in some instances)
-//
-void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y,int type,...) {
- int bx,by;
- struct block_list *bl=NULL;
- va_list ap=NULL;
- int blockcount=bl_list_count,i,c;
-
- va_start(ap,type);
-
- by=y/BLOCK_SIZE;
- bx=x/BLOCK_SIZE;
-
- if(type==0 || type!=BL_MOB)
- {
- bl = map[m].block[bx+by*map[m].bxs];
- c = map[m].block_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next)
- {
- if(type && bl && bl->type!=type)
- continue;
- if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
-
- if(type==0 || type==BL_MOB)
- {
- bl = map[m].block_mob[bx+by*map[m].bxs];
- c = map[m].block_mob_count[bx+by*map[m].bxs];
- for(i=0;i<c && bl;i++,bl=bl->next)
- {
- if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
- bl_list[bl_list_count++]=bl;
- }
- }
-
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachincell: *WARNING* block count too many!\n");
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=blockcount;i<bl_list_count;i++)
- if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(bl_list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * °ƒAƒCƒeƒ€‚âƒGƒtƒFƒNƒg—p‚̈ꎞobjŠ„‚è“–‚Ä
- * object[]‚Ö‚Ì•Û‘¶‚Æid_db“o˜^‚Ü‚Å
- *
- * bl->id‚à‚±‚Ì’†‚Åݒ肵‚Ä–â‘è–³‚¢?
- *------------------------------------------
- */
-int map_addobject(struct block_list *bl) {
- int i;
- if( bl == NULL ){
- printf("map_addobject nullpo?\n");
- return 0;
- }
- if(first_free_object_id<2 || first_free_object_id>=MAX_FLOORITEM)
- first_free_object_id=2;
- for(i=first_free_object_id;i<MAX_FLOORITEM;i++)
- if(object[i]==NULL)
- break;
- if(i>=MAX_FLOORITEM){
- if(battle_config.error_log)
- printf("no free object id\n");
- return 0;
- }
- first_free_object_id=i;
- if(last_object_id<i)
- last_object_id=i;
- object[i]=bl;
- numdb_insert(id_db,i,bl);
- return i;
-}
-
-/*==========================================
- * ˆêŽžobject‚̉ð•ú
- * map_delobject‚Ìfree‚µ‚È‚¢ƒo[ƒWƒ‡ƒ“
- *------------------------------------------
- */
-int map_delobjectnofree(int id) {
- if(object[id]==NULL)
- return 0;
-
- map_delblock(object[id]);
- numdb_erase(id_db,id);
-// map_freeblock(object[id]);
- object[id]=NULL;
-
- if(first_free_object_id>id)
- first_free_object_id=id;
-
- while(last_object_id>2 && object[last_object_id]==NULL)
- last_object_id--;
-
- return 0;
-}
-
-/*==========================================
- * ˆêŽžobject‚̉ð•ú
- * block_list‚©‚ç‚ÌíœAid_db‚©‚ç‚Ìíœ
- * object data‚ÌfreeAobject[]‚Ö‚ÌNULL‘ã“ü
- *
- * add‚Æ‚Ì‘ÎÌ«‚ª–³‚¢‚Ì‚ª‹C‚É‚È‚é
- *------------------------------------------
- */
-int map_delobject(int id) {
- struct block_list *obj = object[id];
-
- if(obj==NULL)
- return 0;
-
- map_delobjectnofree(id);
- map_freeblock(obj);
-
- return 0;
-}
-
-/*==========================================
- * ‘SˆêŽžobj‘ŠŽè‚Éfunc‚ðŒÄ‚Ô
- *
- *------------------------------------------
- */
-void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...) {
- int i;
- int blockcount=bl_list_count;
- va_list ap=NULL;
-
- va_start(ap,type);
-
- for(i=2;i<=last_object_id;i++){
- if(object[i]){
- if(type && object[i]->type!=type)
- continue;
- if(bl_list_count>=BL_LIST_MAX) {
- if(battle_config.error_log)
- printf("map_foreachobject: too many block !\n");
- }
- else
- bl_list[bl_list_count++]=object[i];
- }
- }
-
- map_freeblock_lock();
-
- for(i=blockcount;i<bl_list_count;i++)
- if( bl_list[i]->prev || bl_list[i]->next )
- func(bl_list[i],ap);
-
- map_freeblock_unlock();
-
- va_end(ap);
- bl_list_count = blockcount;
-}
-
-/*==========================================
- * °ƒAƒCƒeƒ€‚ðÁ‚·
- *
- * data==0‚ÌŽž‚Ítimer‚ÅÁ‚¦‚½Žž
- * data!=0‚ÌŽž‚ÍE‚¤“™‚ÅÁ‚¦‚½Žž‚Æ‚µ‚Ä“®ì
- *
- * ŒãŽÒ‚ÍAmap_clearflooritem(id)‚Ö
- * map.h“à‚Å#define‚µ‚Ä‚ ‚é
- *------------------------------------------
- */
-int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) {
- struct flooritem_data *fitem=NULL;
-
- fitem = (struct flooritem_data *)object[id];
- if(fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid)){
- if(battle_config.error_log)
- printf("map_clearflooritem_timer : error\n");
- return 1;
- }
- if(data)
- delete_timer(fitem->cleartimer,map_clearflooritem_timer);
- else if(fitem->item_data.card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&fitem->item_data.card[1])));
- clif_clearflooritem(fitem,0);
- map_delobject(fitem->bl.id);
-
- return 0;
-}
-
-/*==========================================
- * (m,x,y)‚ÌŽüˆÍrangeƒ}ƒX“à‚Ì‹ó‚«(=N“ü‰Â”\)cell‚Ì
- * “à‚©‚ç“K“–‚ȃ}ƒX–Ú‚ÌÀ•W‚ðx+(y<<16)‚Å•Ô‚·
- *
- * Œ»órange=1‚ŃAƒCƒeƒ€ƒhƒƒbƒv—p“r‚Ì‚Ý
- *------------------------------------------
- */
-int map_searchrandfreecell(int m,int x,int y,int range) {
- int free_cell,i,j,c;
-
- for(free_cell=0,i=-range;i<=range;i++){
- if(i+y<0 || i+y>=map[m].ys)
- continue;
- for(j=-range;j<=range;j++){
- if(j+x<0 || j+x>=map[m].xs)
- continue;
- if((c=read_gat(m,j+x,i+y))==1 || c==5)
- continue;
- free_cell++;
- }
- }
- if(free_cell==0)
- return -1;
- free_cell=rand()%free_cell;
- for(i=-range;i<=range;i++){
- if(i+y<0 || i+y>=map[m].ys)
- continue;
- for(j=-range;j<=range;j++){
- if(j+x<0 || j+x>=map[m].xs)
- continue;
- if((c=read_gat(m,j+x,i+y))==1 || c==5)
- continue;
- if(free_cell==0){
- x+=j;
- y+=i;
- i=range+1;
- break;
- }
- free_cell--;
- }
- }
-
- return x+(y<<16);
-}
-
-/*==========================================
- * (m,x,y)‚ð’†S‚É3x3ˆÈ“à‚É°ƒAƒCƒeƒ€Ý’u
- *
- * item_data‚ÍamountˆÈŠO‚ðcopy‚·‚é
- *------------------------------------------
- */
-int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,struct map_session_data *first_sd,
- struct map_session_data *second_sd,struct map_session_data *third_sd,int type) {
- int xy,r;
- unsigned int tick;
- struct flooritem_data *fitem=NULL;
-
- nullpo_retr(0, item_data);
-
- if((xy=map_searchrandfreecell(m,x,y,1))<0)
- return 0;
- r=rand();
-
- fitem = (struct flooritem_data *)aCalloc(1,sizeof(*fitem));
- fitem->bl.type=BL_ITEM;
- fitem->bl.prev = fitem->bl.next = NULL;
- fitem->bl.m=m;
- fitem->bl.x=xy&0xffff;
- fitem->bl.y=(xy>>16)&0xffff;
- fitem->first_get_id = 0;
- fitem->first_get_tick = 0;
- fitem->second_get_id = 0;
- fitem->second_get_tick = 0;
- fitem->third_get_id = 0;
- fitem->third_get_tick = 0;
-
- fitem->bl.id = map_addobject(&fitem->bl);
- if(fitem->bl.id==0){
- free(fitem);
- return 0;
- }
-
- tick = gettick();
- if(first_sd) {
- fitem->first_get_id = first_sd->bl.id;
- if(type)
- fitem->first_get_tick = tick + battle_config.mvp_item_first_get_time;
- else
- fitem->first_get_tick = tick + battle_config.item_first_get_time;
- }
- if(second_sd) {
- fitem->second_get_id = second_sd->bl.id;
- if(type)
- fitem->second_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time;
- else
- fitem->second_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time;
- }
- if(third_sd) {
- fitem->third_get_id = third_sd->bl.id;
- if(type)
- fitem->third_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time + battle_config.mvp_item_third_get_time;
- else
- fitem->third_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time + battle_config.item_third_get_time;
- }
-
- memcpy(&fitem->item_data,item_data,sizeof(*item_data));
- fitem->item_data.amount=amount;
- fitem->subx=(r&3)*3+3;
- fitem->suby=((r>>2)&3)*3+3;
- fitem->cleartimer=add_timer(gettick()+battle_config.flooritem_lifetime,map_clearflooritem_timer,fitem->bl.id,0);
-
- map_addblock(&fitem->bl);
- clif_dropflooritem(fitem);
-
- return fitem->bl.id;
-}
-
-/*==========================================
- * charid_db‚֒ljÁ(•ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM)
- *------------------------------------------
- */
-void map_addchariddb(int charid, char *name) {
- struct charid2nick *p=NULL;
- int req=0;
-
- p=numdb_search(charid_db,charid);
- if(p==NULL){ // ƒf[ƒ^ƒx[ƒX‚É‚È‚¢
- p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick));
- p->req_id=0;
- }else
- numdb_erase(charid_db,charid);
-
- req=p->req_id;
- memcpy(p->nick,name,24);
- p->req_id=0;
- numdb_insert(charid_db,charid,p);
- if(req){ // •ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM
- struct map_session_data *sd = map_id2sd(req);
- if(sd!=NULL)
- clif_solved_charname(sd,charid);
- }
-}
-
-/*==========================================
- * charid_db‚֒ljÁi•ÔM—v‹‚Ì‚Ýj
- *------------------------------------------
- */
-int map_reqchariddb(struct map_session_data * sd,int charid) {
- struct charid2nick *p=NULL;
-
- nullpo_retr(0, sd);
-
- p=numdb_search(charid_db,charid);
- if(p!=NULL) // ƒf[ƒ^ƒx[ƒX‚É‚·‚Å‚É‚ ‚é
- return 0;
- p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick));
- p->req_id=sd->bl.id;
- numdb_insert(charid_db,charid,p);
- return 0;
-}
-
-/*==========================================
- * id_db‚Öbl‚ð’ljÁ
- *------------------------------------------
- */
-void map_addiddb(struct block_list *bl) {
- nullpo_retv(bl);
-
- numdb_insert(id_db,bl->id,bl);
-}
-
-/*==========================================
- * id_db‚©‚çbl‚ðíœ
- *------------------------------------------
- */
-void map_deliddb(struct block_list *bl) {
- nullpo_retv(bl);
-
- numdb_erase(id_db,bl->id);
-}
-
-/*==========================================
- * nick_db‚Ösd‚ð’ljÁ
- *------------------------------------------
- */
-void map_addnickdb(struct map_session_data *sd) {
- nullpo_retv(sd);
-
- strdb_insert(nick_db,sd->status.name,sd);
-}
-
-/*==========================================
- * PC‚Ìquitˆ— map.c“à•ª
- *
- * quitˆ—‚ÌŽå‘Ì‚ªˆá‚¤‚悤‚È‹C‚à‚µ‚Ä‚«‚½
- *------------------------------------------
- */
-int map_quit(struct map_session_data *sd) {
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
- chat_leavechat(sd);
-
- if(sd->trade_partner) // Žæˆø‚ð’†’f‚·‚é
- trade_tradecancel(sd);
-
- if(sd->party_invite>0) // ƒp[ƒeƒBŠ©—U‚ð‹‘”Û‚·‚é
- party_reply_invite(sd,sd->party_invite_account,0);
-
- if(sd->guild_invite>0) // ƒMƒ‹ƒhŠ©—U‚ð‹‘”Û‚·‚é
- guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿Š©—U‚ð‹‘”Û‚·‚é
- guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
-
- party_send_logout(sd); // ƒp[ƒeƒB‚̃ƒOƒAƒEƒgƒƒbƒZ[ƒW‘—M
-
- guild_send_memberinfoshort(sd,0); // ƒMƒ‹ƒh‚̃ƒOƒAƒEƒgƒƒbƒZ[ƒW‘—M
-
- pc_cleareventtimer(sd); // ƒCƒxƒ“ƒgƒ^ƒCƒ}‚ð”jŠü‚·‚é
-
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,0);
- else
- storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
-
- skill_castcancel(&sd->bl,0); // ‰r¥‚ð’†’f‚·‚é
- skill_stop_dancing(&sd->bl,1);// ƒ_ƒ“ƒX/‰‰‘t’†’f
-
- if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚ÌI—¹‚ÍHP‚ð100‚É
- sd->status.hp = 100;
-
- skill_status_change_clear(&sd->bl,1); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- skill_clear_unitgroup(&sd->bl); // ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìíœ
- skill_cleartimerskill(&sd->bl);
- pc_stop_walking(sd,0);
- pc_stopattack(sd);
- pc_delinvincibletimer(sd);
- pc_delspiritball(sd,sd->spiritball,1);
- skill_gangsterparadise(sd,0);
-
- pc_calcstatus(sd,4);
-
- clif_clearchar_area(&sd->bl,2);
-
- if(sd->status.pet_id && sd->pd) {
- pet_lootitem_drop(sd->pd,sd);
- pet_remove_map(sd);
- if(sd->pet.intimate <= 0) {
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- }
- else
- intif_save_petdata(sd->status.account_id,&sd->pet);
- }
-
- if(pc_isdead(sd))
- pc_setrestartvalue(sd,2);
- pc_makesavestatus(sd);
- //ƒNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ÍÁ‚·
- for(i=0;i<MAX_SKILL;i++){
- if(sd->status.skill[i].flag == 13){
- sd->status.skill[i].id=0;
- sd->status.skill[i].lv=0;
- sd->status.skill[i].flag=0;
- }
- }
- chrif_save(sd);
- storage_storage_save(sd);
-
- if( sd->npc_stackbuf && sd->npc_stackbuf != NULL)
- free( sd->npc_stackbuf );
-
- map_delblock(&sd->bl);
-
-#ifndef TXT_ONLY
- chrif_char_offline(sd);
-#endif
-
- numdb_erase(id_db,sd->bl.id);
- strdb_erase(nick_db,sd->status.name);
- numdb_erase(charid_db,sd->status.char_id);
-
- return 0;
-}
-
-/*==========================================
- * id”Ô†‚ÌPC‚ð’T‚·B‹‚È‚¯‚ê‚ÎNULL
- *------------------------------------------
- */
-struct map_session_data * map_id2sd(int id) {
-// remove search from db, because:
-// 1 - all players, npc, items and mob are in this db (to search, it's not speed, and search in session is more sure)
-// 2 - DB seems not always correct. Sometimes, when a player disconnects, its id (account value) is not removed and structure
-// point to a memory area that is not more a session_data and value are incorrect (or out of available memory) -> crash
-// replaced by searching in all session.
-// by searching in session, we are sure that fd, session, and account exist.
-/*
- struct block_list *bl;
-
- bl=numdb_search(id_db,id);
- if(bl && bl->type==BL_PC)
- return (struct map_session_data*)bl;
- return NULL;
-*/
- int i;
- struct map_session_data *sd=NULL;
-
- for(i = 0; i < fd_max; i++)
- if (session[i] && (sd = session[i]->session_data) && sd->bl.id == id)
- return sd;
-
- return NULL;
-}
-
-/*==========================================
- * char_id”Ô†‚Ì–¼‘O‚ð’T‚·
- *------------------------------------------
- */
-char * map_charid2nick(int id) {
- struct charid2nick *p=numdb_search(charid_db,id);
-
- if(p==NULL)
- return NULL;
- if(p->req_id!=0)
- return NULL;
- return p->nick;
-}
-
-
-/*==========================================
- * Search session data from a nick name
- * (without sensitive case if necessary)
- * return map_session_data pointer or NULL
- *------------------------------------------
- */
-struct map_session_data * map_nick2sd(char *nick) {
- int i, quantity=0, nicklen;
- struct map_session_data *sd = NULL;
- struct map_session_data *pl_sd = NULL;
-
- if (nick == NULL)
- return NULL;
-
- nicklen = strlen(nick);
-
- for (i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth)
- // Without case sensitive check (increase the number of similar character names found)
- if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(pl_sd->status.name, nick) == 0)
- return pl_sd;
- quantity++;
- sd = pl_sd;
- }
- }
- // 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 sd;
-
- // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
- return NULL;
-}
-
-/*==========================================
- * id”Ô†‚Ì•¨‚ð’T‚·
- * ˆêŽžobject‚Ìꇂ͔z—ñ‚ðˆø‚­‚Ì‚Ý
- *------------------------------------------
- */
-struct block_list * map_id2bl(int id)
-{
- struct block_list *bl=NULL;
- if(id<sizeof(object)/sizeof(object[0]))
- bl = object[id];
- else
- bl = numdb_search(id_db,id);
-
- return bl;
-}
-
-/*==========================================
- * id_db“à‚Ì‘S‚Ä‚Éfunc‚ðŽÀs
- *------------------------------------------
- */
-int map_foreachiddb(int (*func)(void*,void*,va_list),...) {
- va_list ap=NULL;
-
- va_start(ap,func);
- numdb_foreach(id_db,func,ap);
- va_end(ap);
- return 0;
-}
-
-/*==========================================
- * map.npc‚֒ljÁ (warp“™‚̗̈掂¿‚Ì‚Ý)
- *------------------------------------------
- */
-int map_addnpc(int m,struct npc_data *nd) {
- int i;
- if(m<0 || m>=map_num)
- return -1;
- for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++)
- if(map[m].npc[i]==NULL)
- break;
- if(i==MAX_NPC_PER_MAP){
- if(battle_config.error_log)
- printf("too many NPCs in one map %s\n",map[m].name);
- return -1;
- }
- if(i==map[m].npc_num){
- map[m].npc_num++;
- }
-
- nullpo_retr(0, nd);
-
- map[m].npc[i]=nd;
- nd->n = i;
- numdb_insert(id_db,nd->bl.id,nd);
-
- return i;
-}
-
-void map_removenpc(void) {
- int i,m,n=0;
-
- for(m=0;m<map_num;m++) {
- for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) {
- if(map[m].npc[i]!=NULL) {
- clif_clearchar_area(&map[m].npc[i]->bl,2);
- map_delblock(&map[m].npc[i]->bl);
- numdb_erase(id_db,map[m].npc[i]->bl.id);
- if(map[m].npc[i]->bl.subtype==SCRIPT) {
-// free(map[m].npc[i]->u.scr.script);
-// free(map[m].npc[i]->u.scr.label_list);
- }
- free(map[m].npc[i]);
- map[m].npc[i] = NULL;
- n++;
- }
- }
- }
- printf("%d NPCs removed.\n",n);
-}
-
-/*==========================================
- * map–¼‚©‚çmap”Ô†‚Ö•ÏŠ·
- *------------------------------------------
- */
-int map_mapname2mapid(char *name) {
- struct map_data *md=NULL;
-
- md=strdb_search(map_db,name);
- if(md==NULL || md->gat==NULL)
- return -1;
- return md->m;
-}
-
-/*==========================================
- * ‘¼ŽImap–¼‚©‚çip,port•ÏŠ·
- *------------------------------------------
- */
-int map_mapname2ipport(char *name,int *ip,int *port) {
- struct map_data_other_server *mdos=NULL;
-
- mdos=strdb_search(map_db,name);
- if(mdos==NULL || mdos->gat)
- return -1;
- *ip=mdos->ip;
- *port=mdos->port;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int map_check_dir(int s_dir,int t_dir) {
- if(s_dir == t_dir)
- return 0;
- switch(s_dir) {
- case 0:
- if(t_dir == 7 || t_dir == 1 || t_dir == 0)
- return 0;
- break;
- case 1:
- if(t_dir == 0 || t_dir == 2 || t_dir == 1)
- return 0;
- break;
- case 2:
- if(t_dir == 1 || t_dir == 3 || t_dir == 2)
- return 0;
- break;
- case 3:
- if(t_dir == 2 || t_dir == 4 || t_dir == 3)
- return 0;
- break;
- case 4:
- if(t_dir == 3 || t_dir == 5 || t_dir == 4)
- return 0;
- break;
- case 5:
- if(t_dir == 4 || t_dir == 6 || t_dir == 5)
- return 0;
- break;
- case 6:
- if(t_dir == 5 || t_dir == 7 || t_dir == 6)
- return 0;
- break;
- case 7:
- if(t_dir == 6 || t_dir == 0 || t_dir == 7)
- return 0;
- break;
- }
- return 1;
-}
-
-/*==========================================
- * ”Þ‰ä‚Ì•ûŒü‚ðŒvŽZ
- *------------------------------------------
- */
-int map_calc_dir( struct block_list *src,int x,int y) {
- int dir=0;
- int dx,dy;
-
- nullpo_retr(0, src);
-
- dx=x-src->x;
- dy=y-src->y;
- if( dx==0 && dy==0 ){ // ”Þ‰ä‚Ìꊈê’v
- dir=0; // ã
- }else if( dx>=0 && dy>=0 ){ // •ûŒü“I‚ɉEã
- dir=7; // ‰Eã
- if( dx*3-1<dy ) dir=0; // ã
- if( dx>dy*3 ) dir=6; // ‰E
- }else if( dx>=0 && dy<=0 ){ // •ûŒü“I‚ɉE‰º
- dir=5; // ‰E‰º
- if( dx*3-1<-dy ) dir=4; // ‰º
- if( dx>-dy*3 ) dir=6; // ‰E
- }else if( dx<=0 && dy<=0 ){ // •ûŒü“I‚ɶ‰º
- dir=3; // ¶‰º
- if( dx*3+1>dy ) dir=4; // ‰º
- if( dx<dy*3 ) dir=2; // ¶
- }else{ // •ûŒü“I‚ɶã
- dir=1; // ¶ã
- if( -dx*3-1<dy ) dir=0; // ã
- if( -dx>dy*3 ) dir=2; // ¶
- }
- return dir;
-}
-
-// gatŒn
-/*==========================================
- * (m,x,y)‚Ìó‘Ԃ𒲂ׂé
- *------------------------------------------
- */
-int map_getcell(int m,int x,int y) {
- if(x<0 || x>=map[m].xs-1 || y<0 || y>=map[m].ys-1)
- return 1;
- return map[m].gat[x+y*map[m].xs];
-}
-
-/*==========================================
- * (m,x,y)‚Ìó‘Ô‚ðt‚É‚·‚é
- *------------------------------------------
- */
-int map_setcell(int m,int x,int y,int t) {
- if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys)
- return t;
- return map[m].gat[x+y*map[m].xs]=t;
-}
-
-/*==========================================
- * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ðdb‚ɒljÁ
- *------------------------------------------
- */
-int map_setipport(char *name,unsigned long ip,int port) {
- struct map_data *md=NULL;
- struct map_data_other_server *mdos=NULL;
-
- md=strdb_search(map_db,name);
- if(md==NULL){ // not exist -> add new data
- mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server));
- memcpy(mdos->name,name,24);
- mdos->gat = NULL;
- mdos->ip = ip;
- mdos->port = port;
- strdb_insert(map_db,mdos->name,mdos);
- } else {
- if(md->gat){ // local -> check data
- if(ip!=clif_getip() || port!=clif_getport()){
- printf("from char server : %s -> %08lx:%d\n",name,ip,port);
- return 1;
- }
- } else { // update
- mdos=(struct map_data_other_server *)md;
- mdos->ip = ip;
- mdos->port = port;
- }
- }
- return 0;
-}
-
-// ‰Šú‰»Žü‚è
-/*==========================================
- * …ê‚‚³Ý’è
- *------------------------------------------
- */
-static struct {
- char mapname[24];
- int waterheight;
-} *waterlist=NULL;
-
-#define NO_WATER 1000000
-
-static int map_waterheight(char *mapname) {
- if(waterlist){
- int i;
- for(i=0;waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER;i++)
- if(strcmp(waterlist[i].mapname,mapname)==0)
- return waterlist[i].waterheight;
- }
- return NO_WATER;
-}
-
-static void map_readwater(char *watertxt) {
- char line[1024],w1[1024];
- FILE *fp=NULL;
- int n=0;
-
- fp=fopen(watertxt,"r");
- if(fp==NULL){
- printf("file not found: %s\n",watertxt);
- return;
- }
- if(waterlist==NULL)
- waterlist=aCalloc(MAX_MAP_PER_SERVER,sizeof(*waterlist));
- while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){
- int wh,count;
- if(line[0] == '/' && line[1] == '/')
- continue;
- if((count=sscanf(line,"%s%d",w1,&wh)) < 1){
- continue;
- }
- strcpy(waterlist[n].mapname,w1);
- if(count >= 2)
- waterlist[n].waterheight = wh;
- else
- waterlist[n].waterheight = 3;
- n++;
- }
- fclose(fp);
-}
-
-/*==========================================
- * ƒ}ƒbƒv1–‡“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int map_readmap(int m,char *fn, char *alias) {
- unsigned char *gat="";
- int s;
- int x,y,xs,ys;
- struct gat_1cell {float high[4]; int type;} *p=NULL;
- int wh;
- size_t size;
-
- // read & convert fn
- gat=grfio_read(fn);
- if(gat==NULL)
- return -1;
-
- printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn);
- fflush(stdout);
-
- map[m].m=m;
- xs=map[m].xs=*(int*)(gat+6);
- ys=map[m].ys=*(int*)(gat+10);
- map[m].gat = (unsigned char *)aCalloc(s = map[m].xs * map[m].ys,sizeof(unsigned char));
- map[m].npc_num=0;
- map[m].users=0;
- memset(&map[m].flag,0,sizeof(map[m].flag));
- if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
- wh=map_waterheight(map[m].name);
- for(y=0;y<ys;y++){
- p=(struct gat_1cell*)(gat+y*xs*20+14);
- for(x=0;x<xs;x++){
- if(wh!=NO_WATER && p->type==0){
- // …ê”»’è
- map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
- } else {
- map[m].gat[x+y*xs]=p->type;
- }
- p++;
- }
- }
- free(gat);
-
- map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
- map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
- size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
- map[m].block = (struct block_list **)aCalloc(1,size);
- map[m].block_mob = (struct block_list **)aCalloc(1,size);
- size = map[m].bxs*map[m].bys*sizeof(int);
- map[m].block_count = (int *)aCalloc(1,size);
- map[m].block_mob_count=(int *)aCalloc(1,size);
- strdb_insert(map_db,map[m].name,&map[m]);
-
-// printf("%s read done\n",fn);
-
- return 0;
-}
-
-/*==========================================
- * ‘S‚Ä‚Ìmapƒf[ƒ^‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int map_readallmap(void) {
- int i,maps_removed=0;
- char fn[256]="";
-
- // æ‚É‘S•”‚̃ƒbƒv‚Ì‘¶Ý‚ðŠm”F
- for(i=0;i<map_num;i++){
- if(strstr(map[i].name,".gat")==NULL)
- continue;
- sprintf(fn,"data\\%s",map[i].name);
- if(grfio_size(fn) == -1) {
- map_delmap(map[i].name);
- maps_removed++;
- }
- }
- for(i=0;i<map_num;i++){
- if(strstr(map[i].name,".gat")!=NULL) {
- char *p = strstr(map[i].name, ">"); // [MouseJstr]
- if (p != NULL) {
- char alias[64];
- *p = '\0';
- strcpy(alias, map[i].name);
- strcpy(map[i].name, p + 1);
- sprintf(fn,"data\\%s",map[i].name);
- if(map_readmap(i,fn, alias) == -1) {
- map_delmap(map[i].name);
- maps_removed++;
- }
- } else {
- sprintf(fn,"data\\%s",map[i].name);
- if(map_readmap(i,fn, NULL) == -1) {
- map_delmap(map[i].name);
- maps_removed++;
- }
- }
- }
- }
-
- free(waterlist);
- printf("\rMaps Loaded: %d %60s\n",map_num,"");
- printf("\rMaps Removed: %d \n",maps_removed);
- return 0;
-}
-
-/*==========================================
- * “Ç‚Ýž‚Þmap‚ð’ljÁ‚·‚é
- *------------------------------------------
- */
-int map_addmap(char *mapname) {
- if (strcmpi(mapname,"clear")==0) {
- map_num=0;
- return 0;
- }
-
- if (map_num >= MAX_MAP_PER_SERVER - 1) {
- printf("too many map\n");
- return 1;
- }
- memcpy(map[map_num].name, mapname, 24);
- map_num++;
- return 0;
-}
-
-/*==========================================
- * “Ç‚Ýž‚Þmap‚ð휂·‚é
- *------------------------------------------
- */
-int map_delmap(char *mapname) {
- int i;
-
- if (strcmpi(mapname, "all") == 0) {
- map_num = 0;
- return 0;
- }
-
- for(i = 0; i < map_num; i++) {
- if (strcmp(map[i].name, mapname) == 0) {
- printf("Removing map [ %s ] from maplist\n",map[i].name);
- memmove(map+i, map+i+1, sizeof(map[0])*(map_num-i-1));
- map_num--;
- }
- }
- return 0;
-}
-
-static int map_ip_set_ = 0;
-static int char_ip_set_ = 0;
-
-/*==========================================
- * Console Command Parser [Wizputer]
- *------------------------------------------
- */
-int parse_console(char *buf) {
- char *type,*command,*map, *buf2;
- int x = 0, y = 0;
- int m, n;
- struct map_session_data *sd;
-
- sd = calloc(sizeof(*sd), 1);
-
- sd->fd = 0;
- strcpy( sd->status.name , "console");
-
- type = (char *)malloc(64);
- command = (char *)malloc(64);
- map = (char *)malloc(64);
- buf2 = (char *)malloc(72);
-
- memset(type,0,64);
- memset(command,0,64);
- memset(map,0,64);
- memset(buf2,0,72);
-
- if ( ( n = sscanf(buf, "%[^:]:%[^:]:%99s %d %d[^\n]", type , command , map , &x , &y )) < 5 )
- if ( ( n = sscanf(buf, "%[^:]:%[^\n]", type , command )) < 2 )
- n = sscanf(buf,"%[^\n]",type);
-
- if ( n == 5 ) {
- if (x <= 0) {
- x = rand() % 399 + 1;
- sd->bl.x = x;
- } else {
- sd->bl.x = x;
- }
-
- if (y <= 0) {
- y = rand() % 399 + 1;
- sd->bl.y = y;
- } else {
- sd->bl.y = y;
- }
-
- m = map_mapname2mapid(map);
- if ( m >= 0 )
- sd->bl.m = m;
- else {
- printf("Console: Unknown map\n");
- goto end;
- }
- }
-
- printf("Type of command: %s || Command: %s || Map: %s Coords: %d %d\n",type,command,map,x,y);
-
- if ( strcmpi("admin",type) == 0 && n == 5 ) {
- sprintf(buf2,"console: %s",command);
- if( is_atcommand(sd->fd,sd,buf2,99) == AtCommand_None )
- printf("Console: not atcommand\n");
- } else if ( strcmpi("server",type) == 0 && n == 2 ) {
- if ( strcmpi("shutdown", command) == 0 || strcmpi("exit",command) == 0 || strcmpi("quit",command) == 0 ) {
- exit(0);
- }
- } else if ( strcmpi("help",type) == 0 ) {
- printf("To use GM commands:\n");
- printf("admin:<gm command>:<map of \"gm\"> <x> <y>\n");
- printf("You can use any GM command that doesn't require the GM.\n");
- printf("No using @item or @warp however you can use @charwarp\n");
- printf("The <map of \"gm\"> <x> <y> is for commands that need coords of the GM\n");
- printf("IE: @spawn\n");
- printf("To shutdown the server:\n");
- printf("server:shutdown\n");
- }
-
- end:
- free(buf);
- free(type);
- free(command);
- free(map);
- free(buf2);
- free(sd);
-
- return 0;
-}
-
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
- *------------------------------------------
- */
-int map_config_read(char *cfgName) {
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
- struct hostent *h = NULL;
-
- fp = fopen(cfgName,"r");
- if (fp == NULL) {
- printf("Map configuration file not found at: %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) {
- if (strcmpi(w1, "userid")==0){
- chrif_setuserid(w2);
- } else if (strcmpi(w1, "passwd") == 0) {
- chrif_setpasswd(w2);
- } else if (strcmpi(w1, "char_ip") == 0) {
- char_ip_set_ = 1;
- h = gethostbyname (w2);
- if(h != NULL) {
- printf("Character 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(w2,"%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]);
- }
- chrif_setip(w2);
- } else if (strcmpi(w1, "char_port") == 0) {
- chrif_setport(atoi(w2));
- } else if (strcmpi(w1, "map_ip") == 0) {
- map_ip_set_ = 1;
- h = gethostbyname (w2);
- if (h != NULL) {
- printf("Map 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(w2, "%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]);
- }
- clif_setip(w2);
- } else if (strcmpi(w1, "map_port") == 0) {
- clif_setport(atoi(w2));
- map_port = (atoi(w2));
- } else if (strcmpi(w1, "water_height") == 0) {
- map_readwater(w2);
- } else if (strcmpi(w1, "map") == 0) {
- map_addmap(w2);
- } else if (strcmpi(w1, "delmap") == 0) {
- map_delmap(w2);
- } else if (strcmpi(w1, "npc") == 0) {
- npc_addsrcfile(w2);
- } else if (strcmpi(w1, "delnpc") == 0) {
- npc_delsrcfile(w2);
- } else if (strcmpi(w1, "data_grf") == 0) {
- grfio_setdatafile(w2);
- } else if (strcmpi(w1, "sdata_grf") == 0) {
- grfio_setsdatafile(w2);
- } else if (strcmpi(w1, "adata_grf") == 0) {
- grfio_setadatafile(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, "motd_txt") == 0) {
- strcpy(motd_txt, w2);
- } else if (strcmpi(w1, "help_txt") == 0) {
- strcpy(help_txt, w2);
- } else if (strcmpi(w1, "mapreg_txt") == 0) {
- strcpy(mapreg_txt, w2);
- } else if (strcmpi(w1, "import") == 0) {
- map_config_read(w2);
- } else if (strcmpi(w1, "console") == 0) {
- if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
- console = 1;
- } else if(strcmpi(w1,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
- imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
- imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
- } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
- flush_on = atoi(w2); //Added by Mugendai for GUI
- } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
- flush_time = atoi(w2); //Added by Mugendai for GUI
- }
-
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-#ifndef TXT_ONLY
-/*=======================================
- * MySQL Init
- *---------------------------------------
- */
-
-int map_sql_init(void){
-
- mysql_init(&mmysql_handle);
-
- //DB connection start
- printf("Connect Map DB Server....\n");
- if(!mysql_real_connect(&mmysql_handle, map_server_ip, map_server_id, map_server_pw,
- map_server_db ,map_server_port, (char *)NULL, 0)) {
- //pointer check
- printf("%s\n",mysql_error(&mmysql_handle));
- exit(1);
- }
- else {
- printf ("connect success! (Map Server Connection)\n");
- }
-
- mysql_init(&lmysql_handle);
-
- //DB connection start
- printf("Connect Login DB 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
- printf("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }
- else {
- printf ("connect success! (Login Server Connection)\n");
- }
-
- if(battle_config.mail_system) { // mail system [Valaris]
- mysql_init(&mail_handle);
- if(!mysql_real_connect(&mail_handle, map_server_ip, map_server_id, map_server_pw,
- map_server_db ,map_server_port, (char *)NULL, 0)) {
- printf("%s\n",mysql_error(&mail_handle));
- exit(1);
- }
- }
-
- return 0;
-}
-
-int map_sql_close(void){
- mysql_close(&mmysql_handle);
- printf("Close Map DB Connection....\n");
-
- mysql_close(&lmysql_handle);
- printf("Close Login DB Connection....\n");
- return 0;
-}
-
-int log_sql_init(void){
-
- mysql_init(&mmysql_handle);
-
- //DB connection start
- printf("\033[1;29m[SQL]\033[0;0m: Connecting to Log Database \033[1;29m%s\033[0;0m At \033[1;29m%s\033[0;0m...\n",log_db,log_db_ip);
- if(!mysql_real_connect(&mmysql_handle, log_db_ip, log_db_id, log_db_pw,
- log_db ,log_db_port, (char *)NULL, 0)) {
- //pointer check
- printf("\033[1;29m[SQL Error]\033[0;0m: %s\n",mysql_error(&mmysql_handle));
- exit(1);
- } else {
- printf("\033[1;29m[SQL]\033[0;0m: Successfully \033[1;32mconnected\033[0;0m to Database \033[1;29m%s\033[0;0m.\n", log_db);
- }
-
- return 0;
-}
-
-int sql_config_read(char *cfgName)
-{
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- 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,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"item_db_db")==0){
- strcpy(item_db_db,w2);
- } else if(strcmpi(w1,"mob_db_db")==0){
- strcpy(mob_db_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,"login_db")==0){
- strcpy(login_db,w2);
- } else if (strcmpi(w1, "char_db") == 0) {
- strcpy(char_db, w2);
- } else if(strcmpi(w1,"gm_db_level")==0){
- strcpy(gm_db_level,w2);
- } else if(strcmpi(w1,"gm_db_account_id")==0){
- strcpy(gm_db_account_id,w2);
- } else if(strcmpi(w1,"gm_db")==0){
- strcpy(gm_db,w2);
- //Map Server SQL DB
- } else if(strcmpi(w1,"map_server_ip")==0){
- strcpy(map_server_ip, w2);
- printf ("set map_server_ip : %s\n",w2);
- } else if(strcmpi(w1,"map_server_port")==0){
- map_server_port=atoi(w2);
- printf ("set map_server_port : %s\n",w2);
- } else if(strcmpi(w1,"map_server_id")==0){
- strcpy(map_server_id, w2);
- printf ("set map_server_id : %s\n",w2);
- } else if(strcmpi(w1,"map_server_pw")==0){
- strcpy(map_server_pw, w2);
- printf ("set map_server_pw : %s\n",w2);
- } else if(strcmpi(w1,"map_server_db")==0){
- strcpy(map_server_db, w2);
- printf ("set map_server_db : %s\n",w2);
- //Map server option to use SQL db or not
- } else if(strcmpi(w1,"use_sql_db")==0){
- if (strcmpi(w2,"yes")){db_use_sqldbs=0;} else if (strcmpi(w2,"no")){db_use_sqldbs=1;}
- printf ("Using SQL dbs: %s\n",w2);
- //Login Server SQL DB
- } else if(strcmpi(w1,"login_server_ip")==0){
- strcpy(login_server_ip, w2);
- printf ("set login_server_ip : %s\n",w2);
- } else if(strcmpi(w1,"login_server_port")==0){
- login_server_port = atoi(w2);
- printf ("set login_server_port : %s\n",w2);
- } else if(strcmpi(w1,"login_server_id")==0){
- strcpy(login_server_id, w2);
- printf ("set login_server_id : %s\n",w2);
- } else if(strcmpi(w1,"login_server_pw")==0){
- strcpy(login_server_pw, w2);
- printf ("set login_server_pw : %s\n",w2);
- } else if(strcmpi(w1,"login_server_db")==0){
- strcpy(login_server_db, w2);
- printf ("set login_server_db : %s\n",w2);
- } else if(strcmpi(w1,"lowest_gm_level")==0){
- lowest_gm_level = atoi(w2);
- printf ("set lowest_gm_level : %s\n",w2);
- } else if(strcmpi(w1,"read_gm_interval")==0){
- read_gm_interval = ( atoi(w2) * 60 * 1000 ); // Minutes multiplied by 60 secs per min by 1000 milliseconds per second
- printf ("set read_gm_interval : %s\n",w2);
- } else if(strcmpi(w1,"log_db")==0) {
- strcpy(log_db, w2);
- } else if(strcmpi(w1,"log_db_ip")==0) {
- strcpy(log_db_ip, w2);
- } else if(strcmpi(w1,"log_db")==0) {
- strcpy(log_db, w2);
- } else if(strcmpi(w1,"log_db_id")==0) {
- strcpy(log_db_id, w2);
- } else if(strcmpi(w1,"log_db_pw")==0) {
- strcpy(log_db_pw, w2);
- } else if(strcmpi(w1,"log_db_port")==0) {
- log_db_port = atoi(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-// sql online status checking [Valaris]
-void char_offline(struct map_session_data *sd)
-{
- if(sd && sd->status.char_id) {
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, sd->status.char_id);
- if(mysql_query(&mmysql_handle, tmp_sql) ) {
- printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
- }
- }
-}
-
-void do_reset_online(void)
-{
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
- if(mysql_query(&mmysql_handle, tmp_sql) ) {
- printf("DB server Error (reset_online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
- }
-}
-
-int online_timer(int tid,unsigned int tick,int id,int data)
-{
- if(check_online_timer != tid)
- return 0;
-
- char_online_check();
-
- check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
-
- return 0;
-}
-
-void char_online_check(void)
-{
- int i;
- struct map_session_data *sd=NULL;
-
- do_reset_online();
-
- for(i=0;i<fd_max;i++){
- if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth &&
- !(battle_config.hide_GM_session && pc_isGM(sd)))
- if(sd->status.char_id) {
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'", char_db, sd->status.char_id);
- if(mysql_query(&mmysql_handle, tmp_sql) ) {
- printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
- }
- }
- }
-
-
- if(check_online_timer && check_online_timer != -1) {
- delete_timer(check_online_timer,online_timer);
- add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
- }
-
-}
-
-#endif /* not TXT_ONLY */
-
-//-----------------------------------------------------
-//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;
-}
-
-int id_db_final(void *k,void *d,va_list ap){ return 0; }
-int map_db_final(void *k,void *d,va_list ap){ return 0; }
-int nick_db_final(void *k,void *d,va_list ap){ return 0; }
-int charid_db_final(void *k,void *d,va_list ap){ return 0; }
-
-static int cleanup_sub(struct block_list *bl, va_list ap) {
- nullpo_retr(0, bl);
-
- switch(bl->type) {
- case BL_PC:
- map_delblock(bl); // There is something better...
- break;
- case BL_NPC:
- npc_delete((struct npc_data *)bl);
- break;
- case BL_MOB:
- mob_delete((struct mob_data *)bl);
- break;
- case BL_PET:
- pet_remove_map((struct map_session_data *)bl);
- break;
- case BL_ITEM:
- map_clearflooritem(bl->id);
- break;
- case BL_SKILL:
- skill_delunit((struct skill_unit *) bl);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * mapŽII—¹Žžˆ—
- *------------------------------------------
- */
-void do_final(void) {
- int map_id, i;
-
- for (map_id = 0; map_id < map_num;map_id++) {
- if(map[map_id].m)
- map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0);
- }
-
- for (i = 0; i < fd_max; i++)
- delete_session(i);
-
- map_removenpc();
- timer_final();
-
- numdb_final(id_db, id_db_final);
- strdb_final(map_db, map_db_final);
- strdb_final(nick_db, nick_db_final);
- numdb_final(charid_db, charid_db_final);
-
- for(i=0;i<=map_num;i++){
- if(map[i].gat) free(map[i].gat);
- if(map[i].block) free(map[i].block);
- if(map[i].block_mob) free(map[i].block_mob);
- if(map[i].block_count) free(map[i].block_count);
- if(map[i].block_mob_count) free(map[i].block_mob_count);
- }
- do_final_script();
- do_final_itemdb();
- do_final_storage();
- do_final_guild();
-#ifndef TXT_ONLY
- do_reset_online();
- map_sql_close();
-#endif /* not TXT_ONLY */
-}
-
-void map_helpscreen() {
- exit(1);
-}
-
-/*======================================================
- * Map-Server Init and Command-line Arguments [Valaris]
- *------------------------------------------------------
- */
-int do_init(int argc, char *argv[]) {
- int i;
-
-#ifndef TXT_ONLY
- unsigned char *SQL_CONF_NAME="conf/inter_athena.conf";
- unsigned char *LOG_CONF_NAME="conf/log_athena.conf";
-#endif
- unsigned char *MAP_CONF_NAME = "conf/map_athena.conf";
- unsigned char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
- unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
- unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
- unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf";
- unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt";
-
- srand(gettick());
-
- for (i = 1; i < argc ; i++) {
-
- if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0)
- map_helpscreen();
- else if (strcmp(argv[i], "--map_config") == 0)
- MAP_CONF_NAME=argv[i+1];
- else if (strcmp(argv[i],"--battle_config") == 0)
- BATTLE_CONF_FILENAME = argv[i+1];
- else if (strcmp(argv[i],"--atcommand_config") == 0)
- ATCOMMAND_CONF_FILENAME = argv[i+1];
- else if (strcmp(argv[i],"--script_config") == 0)
- SCRIPT_CONF_NAME = argv[i+1];
- else if (strcmp(argv[i],"--msg_config") == 0)
- MSG_CONF_NAME = argv[i+1];
- else if (strcmp(argv[i],"--grf_path_file") == 0)
- GRF_PATH_FILENAME = argv[i+1];
-#ifndef TXT_ONLY
- else if (strcmp(argv[i],"--sql_config") == 0)
- SQL_CONF_NAME = argv[i+1];
-#endif /* not TXT_ONLY */
- }
-
- map_config_read(MAP_CONF_NAME);
-
- if ((naddr_ == 0) && (map_ip_set_ == 0 || char_ip_set_ == 0)) {
- printf("\nUnable to determine your IP address... please edit\n");
- printf("the map_athena.conf file and set it.\n");
- printf("(127.0.0.1 is valid if you have no network interface)\n");
- }
-
- if (map_ip_set_ == 0 || char_ip_set_ == 0) {
- // The map 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)
- printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
- else
- printf("Defaulting to %s as our IP address\n", buf);
- if (map_ip_set_ == 0)
- clif_setip(buf);
- if (char_ip_set_ == 0)
- chrif_setip(buf);
-
- if (ptr[0] == 192 && ptr[1] == 168)
- printf("\nFirewall detected.. \n edit lan_support.conf and map_athena.conf\n\n");
- }
-
- battle_config_read(BATTLE_CONF_FILENAME);
- atcommand_config_read(ATCOMMAND_CONF_FILENAME);
- script_config_read(SCRIPT_CONF_NAME);
- msg_config_read(MSG_CONF_NAME);
-#ifndef TXT_ONLY
- sql_config_read(SQL_CONF_NAME);
- log_config_read(LOG_CONF_NAME);
-#endif /* not TXT_ONLY */
-
- atexit(do_final);
-
- id_db = numdb_init();
- map_db = strdb_init(16);
- nick_db = strdb_init(24);
- charid_db = numdb_init();
-#ifndef TXT_ONLY
- map_sql_init();
-#endif /* not TXT_ONLY */
-
- grfio_init(GRF_PATH_FILENAME);
-
- map_readallmap();
-
- add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer");
-
- //Added by Mugendai for GUI support
- if (flush_on)
- {
- add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
- }
-
-#ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
- add_timer_func_list(online_timer, "online_timer");
- check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
-#endif /* not TXT_ONLY */
-
- do_init_chrif();
- do_init_clif();
- do_init_itemdb();
- do_init_mob(); // npc‚̉Šú‰»Žž“à‚Åmob_spawn‚µ‚ÄAmob_db‚ðŽQÆ‚·‚é‚Ì‚Åinit_npc‚æ‚èæ
- do_init_script();
- do_init_npc();
- do_init_pc();
- do_init_party();
- do_init_guild();
- do_init_storage();
- do_init_skill();
- do_init_pet();
-
-#ifndef TXT_ONLY /* mail system [Valaris] */
- if(battle_config.mail_system)
- do_init_mail();
-
- if (log_config.branch || log_config.drop || log_config.mvpdrop ||
- log_config.present || log_config.produce || log_config.refine ||
- log_config.trade)
- {
- log_sql_init();
- }
-#endif /* not TXT_ONLY */
-
- npc_event_do_oninit(); // npc‚ÌOnInitƒCƒxƒ“ƒgŽÀs
-
- if ( console ) {
- set_defaultconsoleparse(parse_console);
- start_console();
- }
-
- if (battle_config.pk_mode == 1)
- printf("The server is running in \033[1;31mPK Mode\033[0m.\n");
-
- //Added for Mugendais I'm Alive mod
- if (imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
- printf("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", map_port);
- ticks = gettick();
-
-
- return 0;
-}
+// $Id: map.c,v 1.6 2004/09/25 17:37:01 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <netdb.h>
+#endif
+
+#include "core.h"
+#include "timer.h"
+#include "db.h"
+#include "grfio.h"
+#include "malloc.h"
+
+#include "map.h"
+#include "chrif.h"
+#include "clif.h"
+#include "intif.h"
+#include "npc.h"
+#include "pc.h"
+#include "mob.h"
+#include "chat.h"
+#include "itemdb.h"
+#include "storage.h"
+#include "skill.h"
+#include "trade.h"
+#include "party.h"
+#include "battle.h"
+#include "script.h"
+#include "guild.h"
+#include "pet.h"
+#include "atcommand.h"
+#include "nullpo.h"
+#include "socket.h"
+#include "log.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+unsigned long ticks = 0; // by MC Cameri
+
+#ifndef TXT_ONLY
+
+#include "mail.h" // mail system [Valaris]
+
+MYSQL mmysql_handle;
+MYSQL_RES* sql_res ;
+MYSQL_ROW sql_row ;
+char tmp_sql[65535]="";
+
+MYSQL lmysql_handle;
+MYSQL_RES* lsql_res ;
+MYSQL_ROW lsql_row ;
+char tmp_lsql[65535]="";
+
+MYSQL mail_handle; // mail system [Valaris]
+MYSQL_RES* mail_res ;
+MYSQL_ROW mail_row ;
+char tmp_msql[65535]="";
+
+int map_server_port = 3306;
+char map_server_ip[16] = "127.0.0.1";
+char map_server_id[32] = "ragnarok";
+char map_server_pw[32] = "ragnarok";
+char map_server_db[32] = "ragnarok";
+int db_use_sqldbs = 0;
+
+int login_server_port = 3306;
+char login_server_ip[16] = "127.0.0.1";
+char login_server_id[32] = "ragnarok";
+char login_server_pw[32] = "ragnarok";
+char login_server_db[32] = "ragnarok";
+
+char item_db_db[32] = "item_db";
+char mob_db_db[32] = "mob_db";
+char login_db[32] = "login";
+char login_db_level[32] = "level";
+char login_db_account_id[32] = "account_id";
+
+char log_db[32] = "log";
+char log_db_ip[16] = "127.0.0.1";
+char log_db_id[32] = "ragnarok";
+char log_db_pw[32] = "ragnarok";
+int log_db_port = 3306;
+
+char gm_db[32] = "login";
+char gm_db_level[32] = "level";
+char gm_db_account_id[32] = "account_id";
+
+int lowest_gm_level = 1;
+int read_gm_interval = 600000;
+
+char char_db[32] = "char";
+
+static int online_timer(int,unsigned int,int,int);
+
+int CHECK_INTERVAL = 3600000; // [Valaris]
+int check_online_timer=0; // [Valaris]
+
+#endif /* not TXT_ONLY */
+// ‹É—Í static‚Ń[ƒJƒ‹‚ÉŽû‚ß‚é
+static struct dbt * id_db=NULL;
+static struct dbt * map_db=NULL;
+static struct dbt * nick_db=NULL;
+static struct dbt * charid_db=NULL;
+
+static int users=0;
+static struct block_list *object[MAX_FLOORITEM];
+static int first_free_object_id=0,last_object_id=0;
+
+#define block_free_max 1048576
+static void *block_free[block_free_max];
+static int block_free_count = 0, block_free_lock = 0;
+
+#define BL_LIST_MAX 1048576
+static struct block_list *bl_list[BL_LIST_MAX];
+static int bl_list_count = 0;
+
+struct map_data map[MAX_MAP_PER_SERVER];
+int map_num = 0;
+
+int map_port=0;
+
+int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
+int agit_flag = 0;
+int night_flag = 0; // 0=day, 1=night [Yor]
+
+//Added for Mugendai's I'm Alive mod
+int imalive_on=0;
+int imalive_time=60;
+//Added by Mugendai for GUI
+int flush_on=1;
+int flush_time=100;
+
+struct charid2nick {
+ char nick[24];
+ int req_id;
+};
+
+char motd_txt[256] = "conf/motd.txt";
+char help_txt[256] = "conf/help.txt";
+
+char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file
+
+int console = 0;
+/*==========================================
+ * ‘SmapŽI‘Œv‚Å‚ÌÚ‘±”Ý’è
+ * (charŽI‚©‚ç‘—‚ç‚ê‚Ä‚­‚é)
+ *------------------------------------------
+ */
+void map_setusers(int n) {
+ users = n;
+}
+
+/*==========================================
+ * ‘SmapŽI‘Œv‚Å‚ÌÚ‘±”Žæ“¾ (/w‚ւ̉ž“š—p)
+ *------------------------------------------
+ */
+int map_getusers(void) {
+ return users;
+}
+
+//
+// block휂̈À‘S«Šm•Ûˆ—
+//
+
+/*==========================================
+ * block‚ðfree‚·‚é‚Æ‚«free‚Ì•Ï‚í‚è‚ɌĂÔ
+ * ƒƒbƒN‚³‚ê‚Ä‚¢‚é‚Æ‚«‚̓oƒbƒtƒ@‚É‚½‚ß‚é
+ *------------------------------------------
+ */
+int map_freeblock( void *bl )
+{
+ if(block_free_lock==0){
+ free(bl);
+ bl = NULL;
+ }
+ else{
+ if( block_free_count>=block_free_max ) {
+ if(battle_config.error_log)
+ printf("map_freeblock: *WARNING* too many free block! %d %d\n",
+ block_free_count,block_free_lock);
+ }
+ else
+ block_free[block_free_count++]=bl;
+ }
+ return block_free_lock;
+}
+/*==========================================
+ * block‚Ìfree‚ðˆêŽž“I‚É‹ÖŽ~‚·‚é
+ *------------------------------------------
+ */
+int map_freeblock_lock(void) {
+ return ++block_free_lock;
+}
+
+/*==========================================
+ * block‚Ìfree‚̃ƒbƒN‚ð‰ðœ‚·‚é
+ * ‚±‚Ì‚Æ‚«AƒƒbƒN‚ªŠ®‘S‚É‚È‚­‚È‚é‚Æ
+ * ƒoƒbƒtƒ@‚É‚½‚Ü‚Á‚Ä‚¢‚½block‚ð‘S•”íœ
+ *------------------------------------------
+ */
+int map_freeblock_unlock(void) {
+ if ((--block_free_lock) == 0) {
+ int i;
+// if(block_free_count>0) {
+// if(battle_config.error_log)
+// printf("map_freeblock_unlock: free %d object\n",block_free_count);
+// }
+ for(i=0;i<block_free_count;i++){
+ free(block_free[i]);
+ block_free[i] = NULL;
+ }
+ block_free_count=0;
+ }else if(block_free_lock<0){
+ if(battle_config.error_log)
+ printf("map_freeblock_unlock: lock count < 0 !\n");
+ }
+ return block_free_lock;
+}
+
+
+//
+// block‰»ˆ—
+//
+/*==========================================
+ * map[]‚Ìblock_list‚©‚çŒq‚ª‚Á‚Ä‚¢‚éꇂÉ
+ * bl->prev‚Ébl_head‚̃AƒhƒŒƒX‚ð“ü‚ê‚Ä‚¨‚­
+ *------------------------------------------
+ */
+static struct block_list bl_head;
+
+/*==========================================
+ * map[]‚Ìblock_list‚ɒljÁ
+ * mob‚Í”‚ª‘½‚¢‚̂ŕʃŠƒXƒg
+ *
+ * Šù‚ÉlinkÏ‚Ý‚©‚ÌŠm”F‚ª–³‚¢BŠëŒ¯‚©‚à
+ *------------------------------------------
+ */
+int map_addblock(struct block_list *bl)
+{
+ int m,x,y;
+
+ nullpo_retr(0, bl);
+
+ if(bl->prev != NULL){
+ if(battle_config.error_log)
+ printf("map_addblock error : bl->prev!=NULL\n");
+ return 0;
+ }
+
+ m=bl->m;
+ x=bl->x;
+ y=bl->y;
+ if(m<0 || m>=map_num ||
+ x<0 || x>=map[m].xs ||
+ y<0 || y>=map[m].ys)
+ return 1;
+
+ if(bl->type==BL_MOB){
+ bl->next = map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
+ bl->prev = &bl_head;
+ if(bl->next) bl->next->prev = bl;
+ map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
+ map[m].block_mob_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
+ } else {
+ bl->next = map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs];
+ bl->prev = &bl_head;
+ if(bl->next) bl->next->prev = bl;
+ map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl;
+ map[m].block_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++;
+ if(bl->type==BL_PC)
+ map[m].users++;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * map[]‚Ìblock_list‚©‚çŠO‚·
+ * prev‚ªNULL‚Ìê‡list‚ÉŒq‚ª‚Á‚Ä‚È‚¢
+ *------------------------------------------
+ */
+int map_delblock(struct block_list *bl)
+{
+ int b;
+ nullpo_retr(0, bl);
+
+ // Šù‚Éblocklist‚©‚甲‚¯‚Ä‚¢‚é
+ if(bl->prev==NULL){
+ if(bl->next!=NULL){
+ // prev‚ªNULL‚Ånext‚ªNULL‚Å‚È‚¢‚Ì‚Í—L‚Á‚Ä‚Í‚È‚ç‚È‚¢
+ if(battle_config.error_log)
+ printf("map_delblock error : bl->next!=NULL\n");
+ }
+ return 0;
+ }
+
+ b = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*map[bl->m].bxs;
+
+ if(bl->type==BL_PC)
+ map[bl->m].users--;
+ if(bl->next) bl->next->prev = bl->prev;
+ if(bl->prev==&bl_head){
+ // ƒŠƒXƒg‚Ì“ª‚È‚Ì‚ÅAmap[]‚Ìblock_list‚ðXV‚·‚é
+ if(bl->type==BL_MOB){
+ map[bl->m].block_mob[b] = bl->next;
+ if((map[bl->m].block_mob_count[b]--) < 0)
+ map[bl->m].block_mob_count[b] = 0;
+ } else {
+ map[bl->m].block[b] = bl->next;
+ if((map[bl->m].block_count[b]--) < 0)
+ map[bl->m].block_count[b] = 0;
+ }
+ } else {
+ bl->prev->next = bl->next;
+ }
+ bl->next = NULL;
+ bl->prev = NULL;
+
+ return 0;
+}
+
+/*==========================================
+ * ŽüˆÍ‚ÌPCl”‚𔂦‚é (Œ»Ý–¢Žg—p)
+ *------------------------------------------
+ */
+int map_countnearpc(int m, int x, int y) {
+ int bx,by,c=0;
+ struct block_list *bl=NULL;
+
+ if(map[m].users==0)
+ return 0;
+ for(by=y/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;by<=y/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;by++){
+ if(by<0 || by>=map[m].bys)
+ continue;
+ for(bx=x/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;bx<=x/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;bx++){
+ if(bx<0 || bx>=map[m].bxs)
+ continue;
+ bl = map[m].block[bx+by*map[m].bxs];
+ for(;bl;bl=bl->next){
+ if(bl->type==BL_PC)
+ c++;
+ }
+ }
+ }
+ return c;
+}
+
+/*==========================================
+ * ƒZƒ‹ã‚ÌPC‚ÆMOB‚Ì”‚𔂦‚é (ƒOƒ‰ƒ“ƒhƒNƒƒX—p)
+ *------------------------------------------
+ */
+int map_count_oncell(int m, int x, int y) {
+ int bx,by;
+ struct block_list *bl=NULL;
+ int i,c;
+ int count = 0;
+
+ if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys))
+ return 1;
+ bx = x/BLOCK_SIZE;
+ by = y/BLOCK_SIZE;
+
+ bl = map[m].block[bx+by*map[m].bxs];
+ c = map[m].block_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl->x == x && bl->y == y && bl->type == BL_PC) count++;
+ }
+ bl = map[m].block_mob[bx+by*map[m].bxs];
+ c = map[m].block_mob_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl->x == x && bl->y == y) count++;
+ }
+ if(!count) count = 1;
+ return count;
+}
+
+
+/*==========================================
+ * map m (x0,y0)-(x1,y1)“à‚Ì‘Sobj‚ɑ΂µ‚Ä
+ * func‚ðŒÄ‚Ô
+ * type!=0 ‚È‚ç‚»‚ÌŽí—Þ‚Ì‚Ý
+ *------------------------------------------
+ */
+void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int type,...) {
+ int bx,by;
+ struct block_list *bl=NULL;
+ va_list ap=NULL;
+ int blockcount=bl_list_count,i,c;
+
+ if(m < 0)
+ return;
+ va_start(ap,type);
+ if (x0 < 0) x0 = 0;
+ if (y0 < 0) y0 = 0;
+ if (x1 >= map[m].xs) x1 = map[m].xs-1;
+ if (y1 >= map[m].ys) y1 = map[m].ys-1;
+ if (type == 0 || type != BL_MOB)
+ for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) {
+ for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
+ bl = map[m].block[bx+by*map[m].bxs];
+ c = map[m].block_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && type && bl->type!=type)
+ continue;
+ if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+ }
+ if(type==0 || type==BL_MOB)
+ for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
+ for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
+ bl = map[m].block_mob[bx+by*map[m].bxs];
+ c = map[m].block_mob_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+ }
+
+ if(bl_list_count>=BL_LIST_MAX) {
+ if(battle_config.error_log)
+ printf("map_foreachinarea: *WARNING* block count too many!\n");
+ }
+
+ map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
+
+ for(i=blockcount;i<bl_list_count;i++)
+ if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+ func(bl_list[i],ap);
+
+ map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
+
+ va_end(ap);
+ bl_list_count = blockcount;
+}
+
+/*==========================================
+ * ‹éŒ`(x0,y0)-(x1,y1)‚ª(dx,dy)ˆÚ“®‚µ‚½Žž‚Ì
+ * —̈æŠO‚É‚È‚é—̈æ(‹éŒ`‚©LŽšŒ`)“à‚Ìobj‚É
+ * ‘΂µ‚Äfunc‚ðŒÄ‚Ô
+ *
+ * dx,dy‚Í-1,0,1‚Ì‚Ý‚Æ‚·‚éi‚Ç‚ñ‚È’l‚Å‚à‚¢‚¢‚Á‚Û‚¢Hj
+ *------------------------------------------
+ */
+void map_foreachinmovearea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int dx,int dy,int type,...) {
+ int bx,by;
+ struct block_list *bl=NULL;
+ va_list ap=NULL;
+ int blockcount=bl_list_count,i,c;
+
+ va_start(ap,type);
+ if(dx==0 || dy==0){
+ // ‹éŒ`—̈æ‚Ìê‡
+ if(dx==0){
+ if(dy<0){
+ y0=y1+dy+1;
+ } else {
+ y1=y0+dy-1;
+ }
+ } else if(dy==0){
+ if(dx<0){
+ x0=x1+dx+1;
+ } else {
+ x1=x0+dx-1;
+ }
+ }
+ if(x0<0) x0=0;
+ if(y0<0) y0=0;
+ if(x1>=map[m].xs) x1=map[m].xs-1;
+ if(y1>=map[m].ys) y1=map[m].ys-1;
+ for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
+ for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
+ bl = map[m].block[bx+by*map[m].bxs];
+ c = map[m].block_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && type && bl->type!=type)
+ continue;
+ if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ bl = map[m].block_mob[bx+by*map[m].bxs];
+ c = map[m].block_mob_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && type && bl->type!=type)
+ continue;
+ if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+ }
+ }else{
+ // LŽš—̈æ‚Ìê‡
+
+ if(x0<0) x0=0;
+ if(y0<0) y0=0;
+ if(x1>=map[m].xs) x1=map[m].xs-1;
+ if(y1>=map[m].ys) y1=map[m].ys-1;
+ for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){
+ for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){
+ bl = map[m].block[bx+by*map[m].bxs];
+ c = map[m].block_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && type && bl->type!=type)
+ continue;
+ if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
+ continue;
+ if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
+ (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
+ bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ bl = map[m].block_mob[bx+by*map[m].bxs];
+ c = map[m].block_mob_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next){
+ if(bl && type && bl->type!=type)
+ continue;
+ if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1))
+ continue;
+ if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) ||
+ (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) &&
+ bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+ }
+
+ }
+
+ if(bl_list_count>=BL_LIST_MAX) {
+ if(battle_config.error_log)
+ printf("map_foreachinarea: *WARNING* block count too many!\n");
+ }
+
+ map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
+
+ for(i=blockcount;i<bl_list_count;i++)
+ if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+ func(bl_list[i],ap);
+
+ map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
+
+ va_end(ap);
+ bl_list_count = blockcount;
+}
+
+// -- moonsoul (added map_foreachincell which is a rework of map_foreachinarea but
+// which only checks the exact single x/y passed to it rather than an
+// area radius - may be more useful in some instances)
+//
+void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y,int type,...) {
+ int bx,by;
+ struct block_list *bl=NULL;
+ va_list ap=NULL;
+ int blockcount=bl_list_count,i,c;
+
+ va_start(ap,type);
+
+ by=y/BLOCK_SIZE;
+ bx=x/BLOCK_SIZE;
+
+ if(type==0 || type!=BL_MOB)
+ {
+ bl = map[m].block[bx+by*map[m].bxs];
+ c = map[m].block_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next)
+ {
+ if(type && bl && bl->type!=type)
+ continue;
+ if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+
+ if(type==0 || type==BL_MOB)
+ {
+ bl = map[m].block_mob[bx+by*map[m].bxs];
+ c = map[m].block_mob_count[bx+by*map[m].bxs];
+ for(i=0;i<c && bl;i++,bl=bl->next)
+ {
+ if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
+ bl_list[bl_list_count++]=bl;
+ }
+ }
+
+ if(bl_list_count>=BL_LIST_MAX) {
+ if(battle_config.error_log)
+ printf("map_foreachincell: *WARNING* block count too many!\n");
+ }
+
+ map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
+
+ for(i=blockcount;i<bl_list_count;i++)
+ if(bl_list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+ func(bl_list[i],ap);
+
+ map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
+
+ va_end(ap);
+ bl_list_count = blockcount;
+}
+
+/*==========================================
+ * °ƒAƒCƒeƒ€‚âƒGƒtƒFƒNƒg—p‚̈ꎞobjŠ„‚è“–‚Ä
+ * object[]‚Ö‚Ì•Û‘¶‚Æid_db“o˜^‚Ü‚Å
+ *
+ * bl->id‚à‚±‚Ì’†‚Åݒ肵‚Ä–â‘è–³‚¢?
+ *------------------------------------------
+ */
+int map_addobject(struct block_list *bl) {
+ int i;
+ if( bl == NULL ){
+ printf("map_addobject nullpo?\n");
+ return 0;
+ }
+ if(first_free_object_id<2 || first_free_object_id>=MAX_FLOORITEM)
+ first_free_object_id=2;
+ for(i=first_free_object_id;i<MAX_FLOORITEM;i++)
+ if(object[i]==NULL)
+ break;
+ if(i>=MAX_FLOORITEM){
+ if(battle_config.error_log)
+ printf("no free object id\n");
+ return 0;
+ }
+ first_free_object_id=i;
+ if(last_object_id<i)
+ last_object_id=i;
+ object[i]=bl;
+ numdb_insert(id_db,i,bl);
+ return i;
+}
+
+/*==========================================
+ * ˆêŽžobject‚̉ð•ú
+ * map_delobject‚Ìfree‚µ‚È‚¢ƒo[ƒWƒ‡ƒ“
+ *------------------------------------------
+ */
+int map_delobjectnofree(int id) {
+ if(object[id]==NULL)
+ return 0;
+
+ map_delblock(object[id]);
+ numdb_erase(id_db,id);
+// map_freeblock(object[id]);
+ object[id]=NULL;
+
+ if(first_free_object_id>id)
+ first_free_object_id=id;
+
+ while(last_object_id>2 && object[last_object_id]==NULL)
+ last_object_id--;
+
+ return 0;
+}
+
+/*==========================================
+ * ˆêŽžobject‚̉ð•ú
+ * block_list‚©‚ç‚ÌíœAid_db‚©‚ç‚Ìíœ
+ * object data‚ÌfreeAobject[]‚Ö‚ÌNULL‘ã“ü
+ *
+ * add‚Æ‚Ì‘ÎÌ«‚ª–³‚¢‚Ì‚ª‹C‚É‚È‚é
+ *------------------------------------------
+ */
+int map_delobject(int id) {
+ struct block_list *obj = object[id];
+
+ if(obj==NULL)
+ return 0;
+
+ map_delobjectnofree(id);
+ map_freeblock(obj);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘SˆêŽžobj‘ŠŽè‚Éfunc‚ðŒÄ‚Ô
+ *
+ *------------------------------------------
+ */
+void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...) {
+ int i;
+ int blockcount=bl_list_count;
+ va_list ap=NULL;
+
+ va_start(ap,type);
+
+ for(i=2;i<=last_object_id;i++){
+ if(object[i]){
+ if(type && object[i]->type!=type)
+ continue;
+ if(bl_list_count>=BL_LIST_MAX) {
+ if(battle_config.error_log)
+ printf("map_foreachobject: too many block !\n");
+ }
+ else
+ bl_list[bl_list_count++]=object[i];
+ }
+ }
+
+ map_freeblock_lock();
+
+ for(i=blockcount;i<bl_list_count;i++)
+ if( bl_list[i]->prev || bl_list[i]->next )
+ func(bl_list[i],ap);
+
+ map_freeblock_unlock();
+
+ va_end(ap);
+ bl_list_count = blockcount;
+}
+
+/*==========================================
+ * °ƒAƒCƒeƒ€‚ðÁ‚·
+ *
+ * data==0‚ÌŽž‚Ítimer‚ÅÁ‚¦‚½Žž
+ * data!=0‚ÌŽž‚ÍE‚¤“™‚ÅÁ‚¦‚½Žž‚Æ‚µ‚Ä“®ì
+ *
+ * ŒãŽÒ‚ÍAmap_clearflooritem(id)‚Ö
+ * map.h“à‚Å#define‚µ‚Ä‚ ‚é
+ *------------------------------------------
+ */
+int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) {
+ struct flooritem_data *fitem=NULL;
+
+ fitem = (struct flooritem_data *)object[id];
+ if(fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid)){
+ if(battle_config.error_log)
+ printf("map_clearflooritem_timer : error\n");
+ return 1;
+ }
+ if(data)
+ delete_timer(fitem->cleartimer,map_clearflooritem_timer);
+ else if(fitem->item_data.card[0] == (short)0xff00)
+ intif_delete_petdata(*((long *)(&fitem->item_data.card[1])));
+ clif_clearflooritem(fitem,0);
+ map_delobject(fitem->bl.id);
+
+ return 0;
+}
+
+/*==========================================
+ * (m,x,y)‚ÌŽüˆÍrangeƒ}ƒX“à‚Ì‹ó‚«(=N“ü‰Â”\)cell‚Ì
+ * “à‚©‚ç“K“–‚ȃ}ƒX–Ú‚ÌÀ•W‚ðx+(y<<16)‚Å•Ô‚·
+ *
+ * Œ»órange=1‚ŃAƒCƒeƒ€ƒhƒƒbƒv—p“r‚Ì‚Ý
+ *------------------------------------------
+ */
+int map_searchrandfreecell(int m,int x,int y,int range) {
+ int free_cell,i,j,c;
+
+ for(free_cell=0,i=-range;i<=range;i++){
+ if(i+y<0 || i+y>=map[m].ys)
+ continue;
+ for(j=-range;j<=range;j++){
+ if(j+x<0 || j+x>=map[m].xs)
+ continue;
+ if((c=read_gat(m,j+x,i+y))==1 || c==5)
+ continue;
+ free_cell++;
+ }
+ }
+ if(free_cell==0)
+ return -1;
+ free_cell=rand()%free_cell;
+ for(i=-range;i<=range;i++){
+ if(i+y<0 || i+y>=map[m].ys)
+ continue;
+ for(j=-range;j<=range;j++){
+ if(j+x<0 || j+x>=map[m].xs)
+ continue;
+ if((c=read_gat(m,j+x,i+y))==1 || c==5)
+ continue;
+ if(free_cell==0){
+ x+=j;
+ y+=i;
+ i=range+1;
+ break;
+ }
+ free_cell--;
+ }
+ }
+
+ return x+(y<<16);
+}
+
+/*==========================================
+ * (m,x,y)‚ð’†S‚É3x3ˆÈ“à‚É°ƒAƒCƒeƒ€Ý’u
+ *
+ * item_data‚ÍamountˆÈŠO‚ðcopy‚·‚é
+ *------------------------------------------
+ */
+int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,struct map_session_data *first_sd,
+ struct map_session_data *second_sd,struct map_session_data *third_sd,int type) {
+ int xy,r;
+ unsigned int tick;
+ struct flooritem_data *fitem=NULL;
+
+ nullpo_retr(0, item_data);
+
+ if((xy=map_searchrandfreecell(m,x,y,1))<0)
+ return 0;
+ r=rand();
+
+ fitem = (struct flooritem_data *)aCalloc(1,sizeof(*fitem));
+ fitem->bl.type=BL_ITEM;
+ fitem->bl.prev = fitem->bl.next = NULL;
+ fitem->bl.m=m;
+ fitem->bl.x=xy&0xffff;
+ fitem->bl.y=(xy>>16)&0xffff;
+ fitem->first_get_id = 0;
+ fitem->first_get_tick = 0;
+ fitem->second_get_id = 0;
+ fitem->second_get_tick = 0;
+ fitem->third_get_id = 0;
+ fitem->third_get_tick = 0;
+
+ fitem->bl.id = map_addobject(&fitem->bl);
+ if(fitem->bl.id==0){
+ free(fitem);
+ return 0;
+ }
+
+ tick = gettick();
+ if(first_sd) {
+ fitem->first_get_id = first_sd->bl.id;
+ if(type)
+ fitem->first_get_tick = tick + battle_config.mvp_item_first_get_time;
+ else
+ fitem->first_get_tick = tick + battle_config.item_first_get_time;
+ }
+ if(second_sd) {
+ fitem->second_get_id = second_sd->bl.id;
+ if(type)
+ fitem->second_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time;
+ else
+ fitem->second_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time;
+ }
+ if(third_sd) {
+ fitem->third_get_id = third_sd->bl.id;
+ if(type)
+ fitem->third_get_tick = tick + battle_config.mvp_item_first_get_time + battle_config.mvp_item_second_get_time + battle_config.mvp_item_third_get_time;
+ else
+ fitem->third_get_tick = tick + battle_config.item_first_get_time + battle_config.item_second_get_time + battle_config.item_third_get_time;
+ }
+
+ memcpy(&fitem->item_data,item_data,sizeof(*item_data));
+ fitem->item_data.amount=amount;
+ fitem->subx=(r&3)*3+3;
+ fitem->suby=((r>>2)&3)*3+3;
+ fitem->cleartimer=add_timer(gettick()+battle_config.flooritem_lifetime,map_clearflooritem_timer,fitem->bl.id,0);
+
+ map_addblock(&fitem->bl);
+ clif_dropflooritem(fitem);
+
+ return fitem->bl.id;
+}
+
+/*==========================================
+ * charid_db‚֒ljÁ(•ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM)
+ *------------------------------------------
+ */
+void map_addchariddb(int charid, char *name) {
+ struct charid2nick *p=NULL;
+ int req=0;
+
+ p=numdb_search(charid_db,charid);
+ if(p==NULL){ // ƒf[ƒ^ƒx[ƒX‚É‚È‚¢
+ p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick));
+ p->req_id=0;
+ }else
+ numdb_erase(charid_db,charid);
+
+ req=p->req_id;
+ memcpy(p->nick,name,24);
+ p->req_id=0;
+ numdb_insert(charid_db,charid,p);
+ if(req){ // •ÔM‘Ò‚¿‚ª‚ ‚ê‚ΕÔM
+ struct map_session_data *sd = map_id2sd(req);
+ if(sd!=NULL)
+ clif_solved_charname(sd,charid);
+ }
+}
+
+/*==========================================
+ * charid_db‚֒ljÁi•ÔM—v‹‚Ì‚Ýj
+ *------------------------------------------
+ */
+int map_reqchariddb(struct map_session_data * sd,int charid) {
+ struct charid2nick *p=NULL;
+
+ nullpo_retr(0, sd);
+
+ p=numdb_search(charid_db,charid);
+ if(p!=NULL) // ƒf[ƒ^ƒx[ƒX‚É‚·‚Å‚É‚ ‚é
+ return 0;
+ p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick));
+ p->req_id=sd->bl.id;
+ numdb_insert(charid_db,charid,p);
+ return 0;
+}
+
+/*==========================================
+ * id_db‚Öbl‚ð’ljÁ
+ *------------------------------------------
+ */
+void map_addiddb(struct block_list *bl) {
+ nullpo_retv(bl);
+
+ numdb_insert(id_db,bl->id,bl);
+}
+
+/*==========================================
+ * id_db‚©‚çbl‚ðíœ
+ *------------------------------------------
+ */
+void map_deliddb(struct block_list *bl) {
+ nullpo_retv(bl);
+
+ numdb_erase(id_db,bl->id);
+}
+
+/*==========================================
+ * nick_db‚Ösd‚ð’ljÁ
+ *------------------------------------------
+ */
+void map_addnickdb(struct map_session_data *sd) {
+ nullpo_retv(sd);
+
+ strdb_insert(nick_db,sd->status.name,sd);
+}
+
+/*==========================================
+ * PC‚Ìquitˆ— map.c“à•ª
+ *
+ * quitˆ—‚ÌŽå‘Ì‚ªˆá‚¤‚悤‚È‹C‚à‚µ‚Ä‚«‚½
+ *------------------------------------------
+ */
+int map_quit(struct map_session_data *sd) {
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
+ chat_leavechat(sd);
+
+ if(sd->trade_partner) // Žæˆø‚ð’†’f‚·‚é
+ trade_tradecancel(sd);
+
+ if(sd->party_invite>0) // ƒp[ƒeƒBŠ©—U‚ð‹‘”Û‚·‚é
+ party_reply_invite(sd,sd->party_invite_account,0);
+
+ if(sd->guild_invite>0) // ƒMƒ‹ƒhŠ©—U‚ð‹‘”Û‚·‚é
+ guild_reply_invite(sd,sd->guild_invite,0);
+ if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿Š©—U‚ð‹‘”Û‚·‚é
+ guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
+
+ party_send_logout(sd); // ƒp[ƒeƒB‚̃ƒOƒAƒEƒgƒƒbƒZ[ƒW‘—M
+
+ guild_send_memberinfoshort(sd,0); // ƒMƒ‹ƒh‚̃ƒOƒAƒEƒgƒƒbƒZ[ƒW‘—M
+
+ pc_cleareventtimer(sd); // ƒCƒxƒ“ƒgƒ^ƒCƒ}‚ð”jŠü‚·‚é
+
+ if(sd->state.storage_flag)
+ storage_guild_storage_quit(sd,0);
+ else
+ storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
+
+ skill_castcancel(&sd->bl,0); // ‰r¥‚ð’†’f‚·‚é
+ skill_stop_dancing(&sd->bl,1);// ƒ_ƒ“ƒX/‰‰‘t’†’f
+
+ if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚ÌI—¹‚ÍHP‚ð100‚É
+ sd->status.hp = 100;
+
+ skill_status_change_clear(&sd->bl,1); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
+ skill_clear_unitgroup(&sd->bl); // ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚Ìíœ
+ skill_cleartimerskill(&sd->bl);
+ pc_stop_walking(sd,0);
+ pc_stopattack(sd);
+ pc_delinvincibletimer(sd);
+ pc_delspiritball(sd,sd->spiritball,1);
+ skill_gangsterparadise(sd,0);
+
+ pc_calcstatus(sd,4);
+
+ clif_clearchar_area(&sd->bl,2);
+
+ if(sd->status.pet_id && sd->pd) {
+ pet_lootitem_drop(sd->pd,sd);
+ pet_remove_map(sd);
+ if(sd->pet.intimate <= 0) {
+ intif_delete_petdata(sd->status.pet_id);
+ sd->status.pet_id = 0;
+ sd->pd = NULL;
+ sd->petDB = NULL;
+ }
+ else
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+ }
+
+ if(pc_isdead(sd))
+ pc_setrestartvalue(sd,2);
+ pc_makesavestatus(sd);
+ //ƒNƒ[ƒ“ƒXƒLƒ‹‚ÅŠo‚¦‚½ƒXƒLƒ‹‚ÍÁ‚·
+ for(i=0;i<MAX_SKILL;i++){
+ if(sd->status.skill[i].flag == 13){
+ sd->status.skill[i].id=0;
+ sd->status.skill[i].lv=0;
+ sd->status.skill[i].flag=0;
+ }
+ }
+ chrif_save(sd);
+ storage_storage_save(sd);
+
+ if( sd->npc_stackbuf && sd->npc_stackbuf != NULL)
+ free( sd->npc_stackbuf );
+
+ map_delblock(&sd->bl);
+
+#ifndef TXT_ONLY
+ chrif_char_offline(sd);
+#endif
+
+ numdb_erase(id_db,sd->bl.id);
+ strdb_erase(nick_db,sd->status.name);
+ numdb_erase(charid_db,sd->status.char_id);
+
+ return 0;
+}
+
+/*==========================================
+ * id”Ô†‚ÌPC‚ð’T‚·B‹‚È‚¯‚ê‚ÎNULL
+ *------------------------------------------
+ */
+struct map_session_data * map_id2sd(int id) {
+// remove search from db, because:
+// 1 - all players, npc, items and mob are in this db (to search, it's not speed, and search in session is more sure)
+// 2 - DB seems not always correct. Sometimes, when a player disconnects, its id (account value) is not removed and structure
+// point to a memory area that is not more a session_data and value are incorrect (or out of available memory) -> crash
+// replaced by searching in all session.
+// by searching in session, we are sure that fd, session, and account exist.
+/*
+ struct block_list *bl;
+
+ bl=numdb_search(id_db,id);
+ if(bl && bl->type==BL_PC)
+ return (struct map_session_data*)bl;
+ return NULL;
+*/
+ int i;
+ struct map_session_data *sd=NULL;
+
+ for(i = 0; i < fd_max; i++)
+ if (session[i] && (sd = session[i]->session_data) && sd->bl.id == id)
+ return sd;
+
+ return NULL;
+}
+
+/*==========================================
+ * char_id”Ô†‚Ì–¼‘O‚ð’T‚·
+ *------------------------------------------
+ */
+char * map_charid2nick(int id) {
+ struct charid2nick *p=numdb_search(charid_db,id);
+
+ if(p==NULL)
+ return NULL;
+ if(p->req_id!=0)
+ return NULL;
+ return p->nick;
+}
+
+
+/*==========================================
+ * Search session data from a nick name
+ * (without sensitive case if necessary)
+ * return map_session_data pointer or NULL
+ *------------------------------------------
+ */
+struct map_session_data * map_nick2sd(char *nick) {
+ int i, quantity=0, nicklen;
+ struct map_session_data *sd = NULL;
+ struct map_session_data *pl_sd = NULL;
+
+ if (nick == NULL)
+ return NULL;
+
+ nicklen = strlen(nick);
+
+ for (i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth)
+ // Without case sensitive check (increase the number of similar character names found)
+ if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) {
+ // Strict comparison (if found, we finish the function immediatly with correct value)
+ if (strcmp(pl_sd->status.name, nick) == 0)
+ return pl_sd;
+ quantity++;
+ sd = pl_sd;
+ }
+ }
+ // 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 sd;
+
+ // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found
+ return NULL;
+}
+
+/*==========================================
+ * id”Ô†‚Ì•¨‚ð’T‚·
+ * ˆêŽžobject‚Ìꇂ͔z—ñ‚ðˆø‚­‚Ì‚Ý
+ *------------------------------------------
+ */
+struct block_list * map_id2bl(int id)
+{
+ struct block_list *bl=NULL;
+ if(id<sizeof(object)/sizeof(object[0]))
+ bl = object[id];
+ else
+ bl = numdb_search(id_db,id);
+
+ return bl;
+}
+
+/*==========================================
+ * id_db“à‚Ì‘S‚Ä‚Éfunc‚ðŽÀs
+ *------------------------------------------
+ */
+int map_foreachiddb(int (*func)(void*,void*,va_list),...) {
+ va_list ap=NULL;
+
+ va_start(ap,func);
+ numdb_foreach(id_db,func,ap);
+ va_end(ap);
+ return 0;
+}
+
+/*==========================================
+ * map.npc‚֒ljÁ (warp“™‚̗̈掂¿‚Ì‚Ý)
+ *------------------------------------------
+ */
+int map_addnpc(int m,struct npc_data *nd) {
+ int i;
+ if(m<0 || m>=map_num)
+ return -1;
+ for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++)
+ if(map[m].npc[i]==NULL)
+ break;
+ if(i==MAX_NPC_PER_MAP){
+ if(battle_config.error_log)
+ printf("too many NPCs in one map %s\n",map[m].name);
+ return -1;
+ }
+ if(i==map[m].npc_num){
+ map[m].npc_num++;
+ }
+
+ nullpo_retr(0, nd);
+
+ map[m].npc[i]=nd;
+ nd->n = i;
+ numdb_insert(id_db,nd->bl.id,nd);
+
+ return i;
+}
+
+void map_removenpc(void) {
+ int i,m,n=0;
+
+ for(m=0;m<map_num;m++) {
+ for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) {
+ if(map[m].npc[i]!=NULL) {
+ clif_clearchar_area(&map[m].npc[i]->bl,2);
+ map_delblock(&map[m].npc[i]->bl);
+ numdb_erase(id_db,map[m].npc[i]->bl.id);
+ if(map[m].npc[i]->bl.subtype==SCRIPT) {
+// free(map[m].npc[i]->u.scr.script);
+// free(map[m].npc[i]->u.scr.label_list);
+ }
+ free(map[m].npc[i]);
+ map[m].npc[i] = NULL;
+ n++;
+ }
+ }
+ }
+ printf("%d NPCs removed.\n",n);
+}
+
+/*==========================================
+ * map–¼‚©‚çmap”Ô†‚Ö•ÏŠ·
+ *------------------------------------------
+ */
+int map_mapname2mapid(char *name) {
+ struct map_data *md=NULL;
+
+ md=strdb_search(map_db,name);
+ if(md==NULL || md->gat==NULL)
+ return -1;
+ return md->m;
+}
+
+/*==========================================
+ * ‘¼ŽImap–¼‚©‚çip,port•ÏŠ·
+ *------------------------------------------
+ */
+int map_mapname2ipport(char *name,int *ip,int *port) {
+ struct map_data_other_server *mdos=NULL;
+
+ mdos=strdb_search(map_db,name);
+ if(mdos==NULL || mdos->gat)
+ return -1;
+ *ip=mdos->ip;
+ *port=mdos->port;
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int map_check_dir(int s_dir,int t_dir) {
+ if(s_dir == t_dir)
+ return 0;
+ switch(s_dir) {
+ case 0:
+ if(t_dir == 7 || t_dir == 1 || t_dir == 0)
+ return 0;
+ break;
+ case 1:
+ if(t_dir == 0 || t_dir == 2 || t_dir == 1)
+ return 0;
+ break;
+ case 2:
+ if(t_dir == 1 || t_dir == 3 || t_dir == 2)
+ return 0;
+ break;
+ case 3:
+ if(t_dir == 2 || t_dir == 4 || t_dir == 3)
+ return 0;
+ break;
+ case 4:
+ if(t_dir == 3 || t_dir == 5 || t_dir == 4)
+ return 0;
+ break;
+ case 5:
+ if(t_dir == 4 || t_dir == 6 || t_dir == 5)
+ return 0;
+ break;
+ case 6:
+ if(t_dir == 5 || t_dir == 7 || t_dir == 6)
+ return 0;
+ break;
+ case 7:
+ if(t_dir == 6 || t_dir == 0 || t_dir == 7)
+ return 0;
+ break;
+ }
+ return 1;
+}
+
+/*==========================================
+ * ”Þ‰ä‚Ì•ûŒü‚ðŒvŽZ
+ *------------------------------------------
+ */
+int map_calc_dir( struct block_list *src,int x,int y) {
+ int dir=0;
+ int dx,dy;
+
+ nullpo_retr(0, src);
+
+ dx=x-src->x;
+ dy=y-src->y;
+ if( dx==0 && dy==0 ){ // ”Þ‰ä‚Ìꊈê’v
+ dir=0; // ã
+ }else if( dx>=0 && dy>=0 ){ // •ûŒü“I‚ɉEã
+ dir=7; // ‰Eã
+ if( dx*3-1<dy ) dir=0; // ã
+ if( dx>dy*3 ) dir=6; // ‰E
+ }else if( dx>=0 && dy<=0 ){ // •ûŒü“I‚ɉE‰º
+ dir=5; // ‰E‰º
+ if( dx*3-1<-dy ) dir=4; // ‰º
+ if( dx>-dy*3 ) dir=6; // ‰E
+ }else if( dx<=0 && dy<=0 ){ // •ûŒü“I‚ɶ‰º
+ dir=3; // ¶‰º
+ if( dx*3+1>dy ) dir=4; // ‰º
+ if( dx<dy*3 ) dir=2; // ¶
+ }else{ // •ûŒü“I‚ɶã
+ dir=1; // ¶ã
+ if( -dx*3-1<dy ) dir=0; // ã
+ if( -dx>dy*3 ) dir=2; // ¶
+ }
+ return dir;
+}
+
+// gatŒn
+/*==========================================
+ * (m,x,y)‚Ìó‘Ԃ𒲂ׂé
+ *------------------------------------------
+ */
+int map_getcell(int m,int x,int y) {
+ if(x<0 || x>=map[m].xs-1 || y<0 || y>=map[m].ys-1)
+ return 1;
+ return map[m].gat[x+y*map[m].xs];
+}
+
+/*==========================================
+ * (m,x,y)‚Ìó‘Ô‚ðt‚É‚·‚é
+ *------------------------------------------
+ */
+int map_setcell(int m,int x,int y,int t) {
+ if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys)
+ return t;
+ return map[m].gat[x+y*map[m].xs]=t;
+}
+
+/*==========================================
+ * ‘¼ŽIŠÇ—‚̃}ƒbƒv‚ðdb‚ɒljÁ
+ *------------------------------------------
+ */
+int map_setipport(char *name,unsigned long ip,int port) {
+ struct map_data *md=NULL;
+ struct map_data_other_server *mdos=NULL;
+
+ md=strdb_search(map_db,name);
+ if(md==NULL){ // not exist -> add new data
+ mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server));
+ memcpy(mdos->name,name,24);
+ mdos->gat = NULL;
+ mdos->ip = ip;
+ mdos->port = port;
+ strdb_insert(map_db,mdos->name,mdos);
+ } else {
+ if(md->gat){ // local -> check data
+ if(ip!=clif_getip() || port!=clif_getport()){
+ printf("from char server : %s -> %08lx:%d\n",name,ip,port);
+ return 1;
+ }
+ } else { // update
+ mdos=(struct map_data_other_server *)md;
+ mdos->ip = ip;
+ mdos->port = port;
+ }
+ }
+ return 0;
+}
+
+// ‰Šú‰»Žü‚è
+/*==========================================
+ * …ê‚‚³Ý’è
+ *------------------------------------------
+ */
+static struct {
+ char mapname[24];
+ int waterheight;
+} *waterlist=NULL;
+
+#define NO_WATER 1000000
+
+static int map_waterheight(char *mapname) {
+ if(waterlist){
+ int i;
+ for(i=0;waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER;i++)
+ if(strcmp(waterlist[i].mapname,mapname)==0)
+ return waterlist[i].waterheight;
+ }
+ return NO_WATER;
+}
+
+static void map_readwater(char *watertxt) {
+ char line[1024],w1[1024];
+ FILE *fp=NULL;
+ int n=0;
+
+ fp=fopen(watertxt,"r");
+ if(fp==NULL){
+ printf("file not found: %s\n",watertxt);
+ return;
+ }
+ if(waterlist==NULL)
+ waterlist=aCalloc(MAX_MAP_PER_SERVER,sizeof(*waterlist));
+ while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){
+ int wh,count;
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ if((count=sscanf(line,"%s%d",w1,&wh)) < 1){
+ continue;
+ }
+ strcpy(waterlist[n].mapname,w1);
+ if(count >= 2)
+ waterlist[n].waterheight = wh;
+ else
+ waterlist[n].waterheight = 3;
+ n++;
+ }
+ fclose(fp);
+}
+
+/*==========================================
+ * ƒ}ƒbƒv1–‡“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static int map_readmap(int m,char *fn, char *alias) {
+ unsigned char *gat="";
+ int s;
+ int x,y,xs,ys;
+ struct gat_1cell {float high[4]; int type;} *p=NULL;
+ int wh;
+ size_t size;
+
+ // read & convert fn
+ gat=grfio_read(fn);
+ if(gat==NULL)
+ return -1;
+
+ printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn);
+ fflush(stdout);
+
+ map[m].m=m;
+ xs=map[m].xs=*(int*)(gat+6);
+ ys=map[m].ys=*(int*)(gat+10);
+ map[m].gat = (unsigned char *)aCalloc(s = map[m].xs * map[m].ys,sizeof(unsigned char));
+ map[m].npc_num=0;
+ map[m].users=0;
+ memset(&map[m].flag,0,sizeof(map[m].flag));
+ if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
+ wh=map_waterheight(map[m].name);
+ for(y=0;y<ys;y++){
+ p=(struct gat_1cell*)(gat+y*xs*20+14);
+ for(x=0;x<xs;x++){
+ if(wh!=NO_WATER && p->type==0){
+ // …ê”»’è
+ map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
+ } else {
+ map[m].gat[x+y*xs]=p->type;
+ }
+ p++;
+ }
+ }
+ free(gat);
+
+ map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
+ map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
+ size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
+ map[m].block = (struct block_list **)aCalloc(1,size);
+ map[m].block_mob = (struct block_list **)aCalloc(1,size);
+ size = map[m].bxs*map[m].bys*sizeof(int);
+ map[m].block_count = (int *)aCalloc(1,size);
+ map[m].block_mob_count=(int *)aCalloc(1,size);
+ strdb_insert(map_db,map[m].name,&map[m]);
+
+// printf("%s read done\n",fn);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘S‚Ä‚Ìmapƒf[ƒ^‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+int map_readallmap(void) {
+ int i,maps_removed=0;
+ char fn[256]="";
+
+ // æ‚É‘S•”‚̃ƒbƒv‚Ì‘¶Ý‚ðŠm”F
+ for(i=0;i<map_num;i++){
+ if(strstr(map[i].name,".gat")==NULL)
+ continue;
+ sprintf(fn,"data\\%s",map[i].name);
+ if(grfio_size(fn) == -1) {
+ map_delmap(map[i].name);
+ maps_removed++;
+ }
+ }
+ for(i=0;i<map_num;i++){
+ if(strstr(map[i].name,".gat")!=NULL) {
+ char *p = strstr(map[i].name, ">"); // [MouseJstr]
+ if (p != NULL) {
+ char alias[64];
+ *p = '\0';
+ strcpy(alias, map[i].name);
+ strcpy(map[i].name, p + 1);
+ sprintf(fn,"data\\%s",map[i].name);
+ if(map_readmap(i,fn, alias) == -1) {
+ map_delmap(map[i].name);
+ maps_removed++;
+ }
+ } else {
+ sprintf(fn,"data\\%s",map[i].name);
+ if(map_readmap(i,fn, NULL) == -1) {
+ map_delmap(map[i].name);
+ maps_removed++;
+ }
+ }
+ }
+ }
+
+ free(waterlist);
+ printf("\rMaps Loaded: %d %60s\n",map_num,"");
+ printf("\rMaps Removed: %d \n",maps_removed);
+ return 0;
+}
+
+/*==========================================
+ * “Ç‚Ýž‚Þmap‚ð’ljÁ‚·‚é
+ *------------------------------------------
+ */
+int map_addmap(char *mapname) {
+ if (strcmpi(mapname,"clear")==0) {
+ map_num=0;
+ return 0;
+ }
+
+ if (map_num >= MAX_MAP_PER_SERVER - 1) {
+ printf("too many map\n");
+ return 1;
+ }
+ memcpy(map[map_num].name, mapname, 24);
+ map_num++;
+ return 0;
+}
+
+/*==========================================
+ * “Ç‚Ýž‚Þmap‚ð휂·‚é
+ *------------------------------------------
+ */
+int map_delmap(char *mapname) {
+ int i;
+
+ if (strcmpi(mapname, "all") == 0) {
+ map_num = 0;
+ return 0;
+ }
+
+ for(i = 0; i < map_num; i++) {
+ if (strcmp(map[i].name, mapname) == 0) {
+ printf("Removing map [ %s ] from maplist\n",map[i].name);
+ memmove(map+i, map+i+1, sizeof(map[0])*(map_num-i-1));
+ map_num--;
+ }
+ }
+ return 0;
+}
+
+static int map_ip_set_ = 0;
+static int char_ip_set_ = 0;
+
+/*==========================================
+ * Console Command Parser [Wizputer]
+ *------------------------------------------
+ */
+int parse_console(char *buf) {
+ char *type,*command,*map, *buf2;
+ int x = 0, y = 0;
+ int m, n;
+ struct map_session_data *sd;
+
+ sd = calloc(sizeof(*sd), 1);
+
+ sd->fd = 0;
+ strcpy( sd->status.name , "console");
+
+ type = (char *)malloc(64);
+ command = (char *)malloc(64);
+ map = (char *)malloc(64);
+ buf2 = (char *)malloc(72);
+
+ memset(type,0,64);
+ memset(command,0,64);
+ memset(map,0,64);
+ memset(buf2,0,72);
+
+ if ( ( n = sscanf(buf, "%[^:]:%[^:]:%99s %d %d[^\n]", type , command , map , &x , &y )) < 5 )
+ if ( ( n = sscanf(buf, "%[^:]:%[^\n]", type , command )) < 2 )
+ n = sscanf(buf,"%[^\n]",type);
+
+ if ( n == 5 ) {
+ if (x <= 0) {
+ x = rand() % 399 + 1;
+ sd->bl.x = x;
+ } else {
+ sd->bl.x = x;
+ }
+
+ if (y <= 0) {
+ y = rand() % 399 + 1;
+ sd->bl.y = y;
+ } else {
+ sd->bl.y = y;
+ }
+
+ m = map_mapname2mapid(map);
+ if ( m >= 0 )
+ sd->bl.m = m;
+ else {
+ printf("Console: Unknown map\n");
+ goto end;
+ }
+ }
+
+ printf("Type of command: %s || Command: %s || Map: %s Coords: %d %d\n",type,command,map,x,y);
+
+ if ( strcmpi("admin",type) == 0 && n == 5 ) {
+ sprintf(buf2,"console: %s",command);
+ if( is_atcommand(sd->fd,sd,buf2,99) == AtCommand_None )
+ printf("Console: not atcommand\n");
+ } else if ( strcmpi("server",type) == 0 && n == 2 ) {
+ if ( strcmpi("shutdown", command) == 0 || strcmpi("exit",command) == 0 || strcmpi("quit",command) == 0 ) {
+ exit(0);
+ }
+ } else if ( strcmpi("help",type) == 0 ) {
+ printf("To use GM commands:\n");
+ printf("admin:<gm command>:<map of \"gm\"> <x> <y>\n");
+ printf("You can use any GM command that doesn't require the GM.\n");
+ printf("No using @item or @warp however you can use @charwarp\n");
+ printf("The <map of \"gm\"> <x> <y> is for commands that need coords of the GM\n");
+ printf("IE: @spawn\n");
+ printf("To shutdown the server:\n");
+ printf("server:shutdown\n");
+ }
+
+ end:
+ free(buf);
+ free(type);
+ free(command);
+ free(map);
+ free(buf2);
+ free(sd);
+
+ return 0;
+}
+
+/*==========================================
+ * Ý’èƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ
+ *------------------------------------------
+ */
+int map_config_read(char *cfgName) {
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+ struct hostent *h = NULL;
+
+ fp = fopen(cfgName,"r");
+ if (fp == NULL) {
+ printf("Map configuration file not found at: %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) {
+ if (strcmpi(w1, "userid")==0){
+ chrif_setuserid(w2);
+ } else if (strcmpi(w1, "passwd") == 0) {
+ chrif_setpasswd(w2);
+ } else if (strcmpi(w1, "char_ip") == 0) {
+ char_ip_set_ = 1;
+ h = gethostbyname (w2);
+ if(h != NULL) {
+ printf("Character 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(w2,"%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]);
+ }
+ chrif_setip(w2);
+ } else if (strcmpi(w1, "char_port") == 0) {
+ chrif_setport(atoi(w2));
+ } else if (strcmpi(w1, "map_ip") == 0) {
+ map_ip_set_ = 1;
+ h = gethostbyname (w2);
+ if (h != NULL) {
+ printf("Map 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(w2, "%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]);
+ }
+ clif_setip(w2);
+ } else if (strcmpi(w1, "map_port") == 0) {
+ clif_setport(atoi(w2));
+ map_port = (atoi(w2));
+ } else if (strcmpi(w1, "water_height") == 0) {
+ map_readwater(w2);
+ } else if (strcmpi(w1, "map") == 0) {
+ map_addmap(w2);
+ } else if (strcmpi(w1, "delmap") == 0) {
+ map_delmap(w2);
+ } else if (strcmpi(w1, "npc") == 0) {
+ npc_addsrcfile(w2);
+ } else if (strcmpi(w1, "delnpc") == 0) {
+ npc_delsrcfile(w2);
+ } else if (strcmpi(w1, "data_grf") == 0) {
+ grfio_setdatafile(w2);
+ } else if (strcmpi(w1, "sdata_grf") == 0) {
+ grfio_setsdatafile(w2);
+ } else if (strcmpi(w1, "adata_grf") == 0) {
+ grfio_setadatafile(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, "motd_txt") == 0) {
+ strcpy(motd_txt, w2);
+ } else if (strcmpi(w1, "help_txt") == 0) {
+ strcpy(help_txt, w2);
+ } else if (strcmpi(w1, "mapreg_txt") == 0) {
+ strcpy(mapreg_txt, w2);
+ } else if (strcmpi(w1, "import") == 0) {
+ map_config_read(w2);
+ } else if (strcmpi(w1, "console") == 0) {
+ if(strcmpi(w2,"on") == 0 || strcmpi(w2,"yes") == 0 )
+ console = 1;
+ } else if(strcmpi(w1,"imalive_on")==0){ //Added by Mugendai for I'm Alive mod
+ imalive_on = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"imalive_time")==0){ //Added by Mugendai for I'm Alive mod
+ imalive_time = atoi(w2); //Added by Mugendai for I'm Alive mod
+ } else if(strcmpi(w1,"flush_on")==0){ //Added by Mugendai for GUI
+ flush_on = atoi(w2); //Added by Mugendai for GUI
+ } else if(strcmpi(w1,"flush_time")==0){ //Added by Mugendai for GUI
+ flush_time = atoi(w2); //Added by Mugendai for GUI
+ }
+
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+#ifndef TXT_ONLY
+/*=======================================
+ * MySQL Init
+ *---------------------------------------
+ */
+
+int map_sql_init(void){
+
+ mysql_init(&mmysql_handle);
+
+ //DB connection start
+ printf("Connect Map DB Server....\n");
+ if(!mysql_real_connect(&mmysql_handle, map_server_ip, map_server_id, map_server_pw,
+ map_server_db ,map_server_port, (char *)NULL, 0)) {
+ //pointer check
+ printf("%s\n",mysql_error(&mmysql_handle));
+ exit(1);
+ }
+ else {
+ printf ("connect success! (Map Server Connection)\n");
+ }
+
+ mysql_init(&lmysql_handle);
+
+ //DB connection start
+ printf("Connect Login DB 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
+ printf("%s\n",mysql_error(&lmysql_handle));
+ exit(1);
+ }
+ else {
+ printf ("connect success! (Login Server Connection)\n");
+ }
+
+ if(battle_config.mail_system) { // mail system [Valaris]
+ mysql_init(&mail_handle);
+ if(!mysql_real_connect(&mail_handle, map_server_ip, map_server_id, map_server_pw,
+ map_server_db ,map_server_port, (char *)NULL, 0)) {
+ printf("%s\n",mysql_error(&mail_handle));
+ exit(1);
+ }
+ }
+
+ return 0;
+}
+
+int map_sql_close(void){
+ mysql_close(&mmysql_handle);
+ printf("Close Map DB Connection....\n");
+
+ mysql_close(&lmysql_handle);
+ printf("Close Login DB Connection....\n");
+ return 0;
+}
+
+int log_sql_init(void){
+
+ mysql_init(&mmysql_handle);
+
+ //DB connection start
+ printf("\033[1;29m[SQL]\033[0;0m: Connecting to Log Database \033[1;29m%s\033[0;0m At \033[1;29m%s\033[0;0m...\n",log_db,log_db_ip);
+ if(!mysql_real_connect(&mmysql_handle, log_db_ip, log_db_id, log_db_pw,
+ log_db ,log_db_port, (char *)NULL, 0)) {
+ //pointer check
+ printf("\033[1;29m[SQL Error]\033[0;0m: %s\n",mysql_error(&mmysql_handle));
+ exit(1);
+ } else {
+ printf("\033[1;29m[SQL]\033[0;0m: Successfully \033[1;32mconnected\033[0;0m to Database \033[1;29m%s\033[0;0m.\n", log_db);
+ }
+
+ return 0;
+}
+
+int sql_config_read(char *cfgName)
+{
+ int i;
+ char line[1024],w1[1024],w2[1024];
+ FILE *fp;
+
+ 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,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+ if(strcmpi(w1,"item_db_db")==0){
+ strcpy(item_db_db,w2);
+ } else if(strcmpi(w1,"mob_db_db")==0){
+ strcpy(mob_db_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,"login_db")==0){
+ strcpy(login_db,w2);
+ } else if (strcmpi(w1, "char_db") == 0) {
+ strcpy(char_db, w2);
+ } else if(strcmpi(w1,"gm_db_level")==0){
+ strcpy(gm_db_level,w2);
+ } else if(strcmpi(w1,"gm_db_account_id")==0){
+ strcpy(gm_db_account_id,w2);
+ } else if(strcmpi(w1,"gm_db")==0){
+ strcpy(gm_db,w2);
+ //Map Server SQL DB
+ } else if(strcmpi(w1,"map_server_ip")==0){
+ strcpy(map_server_ip, w2);
+ printf ("set map_server_ip : %s\n",w2);
+ } else if(strcmpi(w1,"map_server_port")==0){
+ map_server_port=atoi(w2);
+ printf ("set map_server_port : %s\n",w2);
+ } else if(strcmpi(w1,"map_server_id")==0){
+ strcpy(map_server_id, w2);
+ printf ("set map_server_id : %s\n",w2);
+ } else if(strcmpi(w1,"map_server_pw")==0){
+ strcpy(map_server_pw, w2);
+ printf ("set map_server_pw : %s\n",w2);
+ } else if(strcmpi(w1,"map_server_db")==0){
+ strcpy(map_server_db, w2);
+ printf ("set map_server_db : %s\n",w2);
+ //Map server option to use SQL db or not
+ } else if(strcmpi(w1,"use_sql_db")==0){
+ if (strcmpi(w2,"yes")){db_use_sqldbs=0;} else if (strcmpi(w2,"no")){db_use_sqldbs=1;}
+ printf ("Using SQL dbs: %s\n",w2);
+ //Login Server SQL DB
+ } else if(strcmpi(w1,"login_server_ip")==0){
+ strcpy(login_server_ip, w2);
+ printf ("set login_server_ip : %s\n",w2);
+ } else if(strcmpi(w1,"login_server_port")==0){
+ login_server_port = atoi(w2);
+ printf ("set login_server_port : %s\n",w2);
+ } else if(strcmpi(w1,"login_server_id")==0){
+ strcpy(login_server_id, w2);
+ printf ("set login_server_id : %s\n",w2);
+ } else if(strcmpi(w1,"login_server_pw")==0){
+ strcpy(login_server_pw, w2);
+ printf ("set login_server_pw : %s\n",w2);
+ } else if(strcmpi(w1,"login_server_db")==0){
+ strcpy(login_server_db, w2);
+ printf ("set login_server_db : %s\n",w2);
+ } else if(strcmpi(w1,"lowest_gm_level")==0){
+ lowest_gm_level = atoi(w2);
+ printf ("set lowest_gm_level : %s\n",w2);
+ } else if(strcmpi(w1,"read_gm_interval")==0){
+ read_gm_interval = ( atoi(w2) * 60 * 1000 ); // Minutes multiplied by 60 secs per min by 1000 milliseconds per second
+ printf ("set read_gm_interval : %s\n",w2);
+ } else if(strcmpi(w1,"log_db")==0) {
+ strcpy(log_db, w2);
+ } else if(strcmpi(w1,"log_db_ip")==0) {
+ strcpy(log_db_ip, w2);
+ } else if(strcmpi(w1,"log_db")==0) {
+ strcpy(log_db, w2);
+ } else if(strcmpi(w1,"log_db_id")==0) {
+ strcpy(log_db_id, w2);
+ } else if(strcmpi(w1,"log_db_pw")==0) {
+ strcpy(log_db_pw, w2);
+ } else if(strcmpi(w1,"log_db_port")==0) {
+ log_db_port = atoi(w2);
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+// sql online status checking [Valaris]
+void char_offline(struct map_session_data *sd)
+{
+ if(sd && sd->status.char_id) {
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, sd->status.char_id);
+ if(mysql_query(&mmysql_handle, tmp_sql) ) {
+ printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
+ }
+ }
+}
+
+void do_reset_online(void)
+{
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
+ if(mysql_query(&mmysql_handle, tmp_sql) ) {
+ printf("DB server Error (reset_online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
+ }
+}
+
+int online_timer(int tid,unsigned int tick,int id,int data)
+{
+ if(check_online_timer != tid)
+ return 0;
+
+ char_online_check();
+
+ check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
+
+ return 0;
+}
+
+void char_online_check(void)
+{
+ int i;
+ struct map_session_data *sd=NULL;
+
+ do_reset_online();
+
+ for(i=0;i<fd_max;i++){
+ if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth &&
+ !(battle_config.hide_GM_session && pc_isGM(sd)))
+ if(sd->status.char_id) {
+ sprintf(tmp_sql,"UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'", char_db, sd->status.char_id);
+ if(mysql_query(&mmysql_handle, tmp_sql) ) {
+ printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mmysql_handle) );
+ }
+ }
+ }
+
+
+ if(check_online_timer && check_online_timer != -1) {
+ delete_timer(check_online_timer,online_timer);
+ add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
+ }
+
+}
+
+#endif /* not TXT_ONLY */
+
+//-----------------------------------------------------
+//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;
+}
+
+int id_db_final(void *k,void *d,va_list ap){ return 0; }
+int map_db_final(void *k,void *d,va_list ap){ return 0; }
+int nick_db_final(void *k,void *d,va_list ap){ return 0; }
+int charid_db_final(void *k,void *d,va_list ap){ return 0; }
+
+static int cleanup_sub(struct block_list *bl, va_list ap) {
+ nullpo_retr(0, bl);
+
+ switch(bl->type) {
+ case BL_PC:
+ map_delblock(bl); // There is something better...
+ break;
+ case BL_NPC:
+ npc_delete((struct npc_data *)bl);
+ break;
+ case BL_MOB:
+ mob_delete((struct mob_data *)bl);
+ break;
+ case BL_PET:
+ pet_remove_map((struct map_session_data *)bl);
+ break;
+ case BL_ITEM:
+ map_clearflooritem(bl->id);
+ break;
+ case BL_SKILL:
+ skill_delunit((struct skill_unit *) bl);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * mapŽII—¹Žžˆ—
+ *------------------------------------------
+ */
+void do_final(void) {
+ int map_id, i;
+
+ for (map_id = 0; map_id < map_num;map_id++) {
+ if(map[map_id].m)
+ map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0);
+ }
+
+ for (i = 0; i < fd_max; i++)
+ delete_session(i);
+
+ map_removenpc();
+ timer_final();
+
+ numdb_final(id_db, id_db_final);
+ strdb_final(map_db, map_db_final);
+ strdb_final(nick_db, nick_db_final);
+ numdb_final(charid_db, charid_db_final);
+
+ for(i=0;i<=map_num;i++){
+ if(map[i].gat) free(map[i].gat);
+ if(map[i].block) free(map[i].block);
+ if(map[i].block_mob) free(map[i].block_mob);
+ if(map[i].block_count) free(map[i].block_count);
+ if(map[i].block_mob_count) free(map[i].block_mob_count);
+ }
+ do_final_script();
+ do_final_itemdb();
+ do_final_storage();
+ do_final_guild();
+#ifndef TXT_ONLY
+ do_reset_online();
+ map_sql_close();
+#endif /* not TXT_ONLY */
+}
+
+void map_helpscreen() {
+ exit(1);
+}
+
+/*======================================================
+ * Map-Server Init and Command-line Arguments [Valaris]
+ *------------------------------------------------------
+ */
+int do_init(int argc, char *argv[]) {
+ int i;
+
+#ifndef TXT_ONLY
+ unsigned char *SQL_CONF_NAME="conf/inter_athena.conf";
+ unsigned char *LOG_CONF_NAME="conf/log_athena.conf";
+#endif
+ unsigned char *MAP_CONF_NAME = "conf/map_athena.conf";
+ unsigned char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
+ unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
+ unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
+ unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf";
+ unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt";
+
+ srand(gettick());
+
+ for (i = 1; i < argc ; i++) {
+
+ if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0)
+ map_helpscreen();
+ else if (strcmp(argv[i], "--map_config") == 0)
+ MAP_CONF_NAME=argv[i+1];
+ else if (strcmp(argv[i],"--battle_config") == 0)
+ BATTLE_CONF_FILENAME = argv[i+1];
+ else if (strcmp(argv[i],"--atcommand_config") == 0)
+ ATCOMMAND_CONF_FILENAME = argv[i+1];
+ else if (strcmp(argv[i],"--script_config") == 0)
+ SCRIPT_CONF_NAME = argv[i+1];
+ else if (strcmp(argv[i],"--msg_config") == 0)
+ MSG_CONF_NAME = argv[i+1];
+ else if (strcmp(argv[i],"--grf_path_file") == 0)
+ GRF_PATH_FILENAME = argv[i+1];
+#ifndef TXT_ONLY
+ else if (strcmp(argv[i],"--sql_config") == 0)
+ SQL_CONF_NAME = argv[i+1];
+#endif /* not TXT_ONLY */
+ }
+
+ map_config_read(MAP_CONF_NAME);
+
+ if ((naddr_ == 0) && (map_ip_set_ == 0 || char_ip_set_ == 0)) {
+ printf("\nUnable to determine your IP address... please edit\n");
+ printf("the map_athena.conf file and set it.\n");
+ printf("(127.0.0.1 is valid if you have no network interface)\n");
+ }
+
+ if (map_ip_set_ == 0 || char_ip_set_ == 0) {
+ // The map 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)
+ printf("Multiple interfaces detected.. using %s as our IP address\n", buf);
+ else
+ printf("Defaulting to %s as our IP address\n", buf);
+ if (map_ip_set_ == 0)
+ clif_setip(buf);
+ if (char_ip_set_ == 0)
+ chrif_setip(buf);
+
+ if (ptr[0] == 192 && ptr[1] == 168)
+ printf("\nFirewall detected.. \n edit lan_support.conf and map_athena.conf\n\n");
+ }
+
+ battle_config_read(BATTLE_CONF_FILENAME);
+ atcommand_config_read(ATCOMMAND_CONF_FILENAME);
+ script_config_read(SCRIPT_CONF_NAME);
+ msg_config_read(MSG_CONF_NAME);
+#ifndef TXT_ONLY
+ sql_config_read(SQL_CONF_NAME);
+ log_config_read(LOG_CONF_NAME);
+#endif /* not TXT_ONLY */
+
+ atexit(do_final);
+
+ id_db = numdb_init();
+ map_db = strdb_init(16);
+ nick_db = strdb_init(24);
+ charid_db = numdb_init();
+#ifndef TXT_ONLY
+ map_sql_init();
+#endif /* not TXT_ONLY */
+
+ grfio_init(GRF_PATH_FILENAME);
+
+ map_readallmap();
+
+ add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer");
+
+ //Added by Mugendai for GUI support
+ if (flush_on)
+ {
+ add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+ }
+
+#ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
+ add_timer_func_list(online_timer, "online_timer");
+ check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
+#endif /* not TXT_ONLY */
+
+ do_init_chrif();
+ do_init_clif();
+ do_init_itemdb();
+ do_init_mob(); // npc‚̉Šú‰»Žž“à‚Åmob_spawn‚µ‚ÄAmob_db‚ðŽQÆ‚·‚é‚Ì‚Åinit_npc‚æ‚èæ
+ do_init_script();
+ do_init_npc();
+ do_init_pc();
+ do_init_party();
+ do_init_guild();
+ do_init_storage();
+ do_init_skill();
+ do_init_pet();
+
+#ifndef TXT_ONLY /* mail system [Valaris] */
+ if(battle_config.mail_system)
+ do_init_mail();
+
+ if (log_config.branch || log_config.drop || log_config.mvpdrop ||
+ log_config.present || log_config.produce || log_config.refine ||
+ log_config.trade)
+ {
+ log_sql_init();
+ }
+#endif /* not TXT_ONLY */
+
+ npc_event_do_oninit(); // npc‚ÌOnInitƒCƒxƒ“ƒgŽÀs
+
+ if ( console ) {
+ set_defaultconsoleparse(parse_console);
+ start_console();
+ }
+
+ if (battle_config.pk_mode == 1)
+ printf("The server is running in \033[1;31mPK Mode\033[0m.\n");
+
+ //Added for Mugendais I'm Alive mod
+ if (imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
+
+ printf("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", map_port);
+ ticks = gettick();
+
+
+ return 0;
+}
diff --git a/src/map/map.h b/src/map/map.h
index d622ecd35..8596f781b 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -1,726 +1,726 @@
-// $Id: map.h,v 1.8 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _MAP_H_
-#define _MAP_H_
-
-#include <stdarg.h>
-#include "mmo.h"
-
-#define MAX_PC_CLASS (1+6+6+1+6+1+1+1+1+4023)
-#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 LOCAL_REG_NUM 16
-#define LIFETIME_FLOORITEM 60
-#define DAMAGELOG_SIZE 30
-#define LOOTITEM_SIZE 10
-#define MAX_SKILL_LEVEL 100
-#define MAX_STATUSCHANGE 200
-#define MAX_SKILLUNITGROUP 32
-#define MAX_MOBSKILLUNITGROUP 8
-#define MAX_SKILLUNITGROUPTICKSET 128
-#define MAX_SKILLTIMERSKILL 32
-#define MAX_MOBSKILLTIMERSKILL 10
-#define MAX_MOBSKILL 32
-#define MAX_EVENTQUEUE 2
-#define MAX_EVENTTIMER 32
-#define NATURAL_HEAL_INTERVAL 500
-#define MAX_FLOORITEM 500000
-#define MAX_LEVEL 255
-#define MAX_WALKPATH 48
-#define MAX_DROP_PER_MAP 48
-#define MAX_IGNORE_LIST 80
-
-#define DEFAULT_AUTOSAVE_INTERVAL 60*1000
-
-#define OPTION_HIDE 0x40
-
-enum { BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL , BL_PET };
-enum { WARP, SHOP, SCRIPT, MONS };
-
-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 script_reg {
- int index;
- int data;
-};
-struct script_regstr {
- int index;
- char data[256];
-};
-struct status_change {
- int timer;
- int val1,val2,val3,val4;
-};
-struct vending {
- short index;
- unsigned short amount;
- unsigned int value;
-};
-
-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,range;
- int target_flag;
- unsigned int tick;
- int limit,interval;
-
- int skill_id,skill_lv;
- int val1,val2;
- char *valstr;
- int unit_id;
- int group_id;
- int unit_count,alive_count;
- struct skill_unit *unit;
-};
-struct skill_unit_group_tickset {
- unsigned int tick;
- int group_id;
-};
-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 npc_data;
-struct pet_db;
-struct item_data;
-struct square;
-
-struct map_session_data {
- struct block_list bl;
- struct {
- unsigned auth : 1;
- unsigned change_walk_target : 1;
- unsigned attack_continue : 1;
- unsigned menu_or_input : 1;
- unsigned dead_sit : 2;
- unsigned skillcastcancel : 1;
- unsigned waitingdisconnect : 1;
- unsigned lr_flag : 2;
- unsigned connect_new : 1;
- unsigned arrow_atk : 1;
- unsigned attack_type : 3;
- unsigned skill_flag : 1;
- unsigned gangsterparadise : 1;
- unsigned produce_flag : 1;
- unsigned make_arrow_flag : 1;
- unsigned potionpitcher_flag : 1;
- unsigned storage_flag : 1;
- } state;
- struct {
- unsigned killer : 1;
- unsigned killable : 1;
- unsigned restart_full_recover : 1;
- unsigned no_castcancel : 1;
- unsigned no_castcancel2 : 1;
- unsigned no_sizefix : 1;
- unsigned no_magic_damage : 1;
- unsigned no_weapon_damage : 1;
- unsigned no_gemstone : 1;
- unsigned infinite_endure : 1;
- unsigned unbreakable_weapon : 1;
- unsigned unbreakable_armor : 1;
- unsigned infinite_autospell : 1;
- } special_state;
- int char_id, login_id1, login_id2, sex;
- int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04 (by [Yor])
- struct mmo_charstatus status;
- struct item_data *inventory_data[MAX_INVENTORY];
- short equip_index[11];
- int weight,max_weight;
- int cart_weight,cart_max_weight,cart_num,cart_max_num;
- char mapname[24];
- int fd,new_fd;
- short to_x,to_y;
- short speed,prev_speed;
- short opt1,opt2,opt3;
- char dir,head_dir;
- unsigned int client_tick,server_tick;
- struct walkpath_data walkpath;
- int walktimer;
- int npc_id,areanpc_id,npc_shopid;
- int npc_pos;
- int npc_menu;
- int npc_amount;
- int npc_stack,npc_stackmax;
- char *npc_script,*npc_scriptroot;
- char *npc_stackbuf;
- char npc_str[256];
- unsigned int chatID;
-
- struct{
- char name[24];
- } ignore[MAX_IGNORE_LIST];
- int ignoreAll;
-
- int attacktimer;
- int attacktarget;
- short attacktarget_lv;
- unsigned int attackabletime;
-
- int followtimer; // [MouseJstr]
- int followtarget;
-
- short attackrange,attackrange_;
- int skilltimer;
- int skilltarget;
- short skillx,skilly;
- short skillid,skilllv;
- short skillitem,skillitemlv;
- short skillid_old,skilllv_old;
- short skillid_dance,skilllv_dance;
- struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
- int cloneskill_id,cloneskill_lv;
- int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
-
- int invincible_timer;
- unsigned int canact_tick;
- unsigned int canmove_tick;
- unsigned int canlog_tick;
- int hp_sub,sp_sub;
- int inchealhptick,inchealsptick,inchealspirithptick,inchealspiritsptick;
-// -- moonsoul (new tick for berserk self-damage)
- int berserkdamagetick;
- int fame;
-
- short view_class;
- short weapontype1,weapontype2;
- short disguiseflag,disguise; // [Valaris]
- int paramb[6],paramc[6],parame[6],paramcard[6];
- int hit,flee,flee2,aspd,amotion,dmotion;
- int watk,watk2,atkmods[3];
- int def,def2,mdef,mdef2,critical,matk1,matk2;
- int atk_ele,def_ele,star,overrefine;
- int castrate,hprate,sprate,dsprate;
- int addele[10],addrace[12],addsize[3],subele[10],subrace[12];
- int addeff[10],addeff2[10],reseff[10];
- int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
- int atk_ele_,star_,overrefine_; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
- int base_atk,atk_rate;
- int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range;
- int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10];
- int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp;
- int aspd_rate,speed_rate,hprecov_rate,sprecov_rate,critical_def,double_rate;
- int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
- int matk_rate,ignore_def_ele,ignore_def_race,ignore_def_ele_,ignore_def_race_;
- int ignore_mdef_ele,ignore_mdef_race;
- int magic_addele[10],magic_addrace[12],magic_subrace[12];
- int perfect_hit,get_zeny_num;
- int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
- int def_ratio_atk_ele,def_ratio_atk_ele_,def_ratio_atk_race,def_ratio_atk_race_;
- int add_damage_class_count,add_damage_class_count_,add_magic_damage_class_count;
- short add_damage_classid[10],add_damage_classid_[10],add_magic_damage_classid[10];
- int add_damage_classrate[10],add_damage_classrate_[10],add_magic_damage_classrate[10];
- short add_def_class_count,add_mdef_class_count;
- short add_def_classid[10],add_mdef_classid[10];
- int add_def_classrate[10],add_mdef_classrate[10];
- short monster_drop_item_count;
- short monster_drop_itemid[10];
- int monster_drop_race[10],monster_drop_itemrate[10];
- int double_add_rate,speed_add_rate,aspd_add_rate,perfect_hit_add, get_zeny_add_num;
- short splash_range,splash_add_range;
- short autospell_id,autospell_lv,autospell_rate;
- short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per;
- short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_;
- int short_weapon_damage_return,long_weapon_damage_return;
- int weapon_coma_ele[10],weapon_coma_race[12];
- short break_weapon_rate,break_armor_rate;
- short add_steal_rate;
-
- short spiritball, spiritball_old;
- int spirit_timer[MAX_SKILL_LEVEL];
- int magic_damage_return; // AppleGirl Was Here
- int random_attack_increase_add,random_attack_increase_per; // [Valaris]
- int perfect_hiding; // [Valaris]
- int unbreakable;
-
- int die_counter;
- short doridori_counter;
-
- int reg_num;
- struct script_reg *reg;
- int regstr_num;
- struct script_regstr *regstr;
-
- struct status_change sc_data[MAX_STATUSCHANGE];
- short sc_count;
- struct square dev;
-
- int trade_partner;
- int deal_item_index[10];
- int deal_item_amount[10];
- int deal_zeny;
- short deal_locked;
-
- int party_sended,party_invite,party_invite_account;
- int party_hp,party_x,party_y;
-
- int guild_sended,guild_invite,guild_invite_account;
- int guild_emblem_id,guild_alliance,guild_alliance_account;
- int guildspy; // [Syrus22]
- int partyspy; // [Syrus22]
-
- int vender_id;
- int vend_num;
- char message[80];
- struct vending vending[12];
-
- int catch_target_class;
- struct s_pet pet;
- struct pet_db *petDB;
- struct pet_data *pd;
- int pet_hungry_timer;
-
- int pvp_point,pvp_rank,pvp_timer,pvp_lastusers;
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
-
- int last_skillid,last_skilllv; // Added by RoVeRT
- short sg_count;
-
-#ifndef TXT_ONLY
- int mail_counter; // mail counter for mail system [Valaris]
-#endif
-
-};
-
-struct npc_timerevent_list {
- int timer,pos;
-};
-struct npc_label_list {
- char name[24];
- int pos;
-};
-struct npc_item_list {
- int nameid,value;
-};
-struct npc_data {
- struct block_list bl;
- short n;
- short class,dir;
- short speed;
- char name[24];
- char exname[24];
- int chat_id;
- short opt1,opt2,opt3,option;
- short flag;
- int walktimer; // [Valaris]
- short to_x,to_y; // [Valaris]
- struct walkpath_data walkpath;
- unsigned int next_walktime;
- unsigned int canmove_tick;
-
- struct { // [Valaris]
- unsigned state : 8;
- unsigned change_walk_target : 1;
- unsigned walk_easy : 1;
- } state;
-
- union {
- struct {
- char *script;
- short xs,ys;
- int guild_id;
- int timer,timerid,timeramount,nexttimer;
- 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;
- char name[16];
- } warp;
- } u;
- // ‚±‚±‚Ƀƒ“ƒo‚ð’ljÁ‚µ‚Ä‚Í‚È‚ç‚È‚¢(shop_item‚ª‰Â•Ï’·‚̈×)
-
- char eventqueue[MAX_EVENTQUEUE][50];
- int eventtimer[MAX_EVENTTIMER];
- short arenaflag;
-};
-struct mob_data {
- struct block_list bl;
- short n;
- short base_class,class,dir,mode;
- short m,x0,y0,xs,ys;
- char name[24];
- int spawndelay1,spawndelay2;
- struct {
- unsigned state : 8;
- unsigned skillstate : 8;
- unsigned targettype : 1;
- unsigned steal_flag : 1;
- unsigned steal_coin_flag : 1;
- unsigned skillcastcancel : 1;
- unsigned master_check : 1;
- unsigned change_walk_target : 1;
- unsigned walk_easy : 1;
- unsigned special_mob_ai : 3;
- } state;
- int timer;
- short to_x,to_y;
- short speed;
- int hp;
- int target_id,attacked_id;
- short target_lv;
- struct walkpath_data walkpath;
- unsigned int next_walktime;
- unsigned int attackabletime;
- unsigned int last_deadtime,last_spawntime,last_thinktime;
- unsigned int canmove_tick;
- short move_fail_count;
- struct {
- int id;
- int dmg;
- } dmglog[DAMAGELOG_SIZE];
- struct item *lootitem;
- short lootitem_count;
-
- struct status_change sc_data[MAX_STATUSCHANGE];
- short sc_count;
- short opt1,opt2,opt3,option;
- short min_chase;
- short sg_count;
- int guild_id;
- int deletetimer;
-
- int skilltimer;
- int skilltarget;
- short skillx,skilly;
- short skillid,skilllv,skillidx;
- unsigned int skilldelay[MAX_MOBSKILL];
- int def_ele;
- int master_id,master_dist;
- int exclusion_src,exclusion_party,exclusion_guild;
- struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL];
- struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP];
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
- char npc_event[50];
- short size;
-};
-struct pet_data {
- struct block_list bl;
- short n;
- short class,dir;
- short speed;
- char name[24];
- struct {
- unsigned state : 8 ;
- unsigned skillstate : 8 ;
- unsigned change_walk_target : 1 ;
- } state;
- int timer;
- short to_x,to_y;
- short equip;
- struct walkpath_data walkpath;
- int target_id;
- short target_lv;
- int move_fail_count;
- unsigned int attackabletime,next_walktime,last_thinktime;
- int skilltype,skillval,skilltimer,skillduration; // [Valaris]
- int skillbonustype,skillbonusval,skillbonustimer,skillbonusduration; // [Valaris]
- struct item *lootitem;
- short loot; // [Valaris]
- short lootmax; // [Valaris]
- short lootitem_count;
- short lootitem_weight;
- int lootitem_timer;
- struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL]; // [Valaris]
- struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP]; // [Valaris]
- struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; // [Valaris]
- struct map_session_data *msd;
-};
-
-enum { MS_IDLE,MS_WALK,MS_ATTACK,MS_DEAD,MS_DELAY };
-
-enum { NONE_ATTACKABLE,ATTACKABLE };
-
-enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // ˆÍ‚Ü‚êƒyƒiƒ‹ƒeƒBŒvŽZ—p
-
-struct map_data {
- char name[24];
- char alias[24]; // [MouseJstr]
- unsigned char *gat; // NULL‚Ȃ牺‚Ìmap_data_other_server‚Æ‚µ‚Ĉµ‚¤
- struct block_list **block;
- struct block_list **block_mob;
- int *block_count,*block_mob_count;
- int m;
- short xs,ys;
- short bxs,bys;
- 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 nopenalty : 1;
- unsigned pvp : 1;
- unsigned pvp_noparty : 1;
- unsigned pvp_noguild : 1;
- unsigned pvp_nightmaredrop :1;
- unsigned pvp_nocalcrank : 1;
- unsigned gvg : 1;
- unsigned gvg_noparty : 1;
- unsigned nozenypenalty : 1;
- unsigned notrade : 1;
- unsigned noskill : 1;
- unsigned nowarp : 1;
- unsigned nowarpto : 1;
- unsigned nopvp : 1; // [Valaris]
- unsigned noicewall : 1; // [Valaris]
- unsigned snow : 1; // [Valaris]
- unsigned fog : 1; // [Valaris]
- unsigned sakura : 1; // [Valaris]
- unsigned leaves : 1; // [Valaris]
- unsigned rain : 1; // [Valaris]
- } 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 map_data_other_server {
- char name[24];
- unsigned char *gat; // NULLŒÅ’è‚É‚µ‚Ä”»’f
- unsigned long ip;
- unsigned int port;
-};
-#define read_gat(m,x,y) (map[m].gat[(x)+(y)*map[m].xs])
-#define read_gatp(m,x,y) (m->gat[(x)+(y)*m->xs])
-
-struct flooritem_data {
- struct block_list bl;
- short 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-58
- SP_CARTINFO=99, // 99
-
- // 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_SUBRACE, // 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-1077
- SP_DISGUISE, // 1077
-
- SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
- SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR // 2006-2009
-};
-
-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
-};
-
-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 agit_flag;
-extern int night_flag; // 0=day, 1=night [Yor]
-
-extern char motd_txt[];
-extern char help_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( void *bl );
-int map_freeblock_lock(void);
-int map_freeblock_unlock(void);
-// blockŠÖ˜A
-int map_addblock(struct block_list *);
-int map_delblock(struct block_list *);
-void map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...);
-// -- moonsoul (added map_foreachincell)
-void map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...);
-void map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...);
-int map_countnearpc(int,int,int);
-//blockŠÖ˜A‚ɒljÁ
-int map_count_oncell(int m,int x,int y);
-// ˆêŽž“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_quit(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);
-#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);
-int map_searchrandfreecell(int,int,int,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_id2sd(int);
-struct block_list * map_id2bl(int);
-int map_mapname2mapid(char*);
-int map_mapname2ipport(char*,int*,int*);
-int map_setipport(char *name,unsigned long ip,int port);
-int map_eraseipport(char *name,unsigned long ip,int port);
-void map_addiddb(struct block_list *);
-void map_deliddb(struct block_list *bl);
-int map_foreachiddb(int (*)(void*,void*,va_list),...);
-void map_addnickdb(struct map_session_data *);
-struct map_session_data * map_nick2sd(char*);
-
-// gatŠÖ˜A
-int map_getcell(int,int,int);
-int map_setcell(int,int,int,int);
-
-// ‚»‚Ì‘¼
-int map_check_dir(int s_dir,int t_dir);
-int map_calc_dir( struct block_list *src,int x,int y);
-
-// path.c‚æ‚è
-int path_search(struct walkpath_data*,int,int,int,int,int,int);
-int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
-
-int map_who(int fd);
-
-void map_helpscreen(); // [Valaris]
-int map_delmap(char *mapname);
-
-extern unsigned long ticks;
-
-#ifndef TXT_ONLY
-
-// MySQL
-#include <mysql.h>
-
-void char_online_check(void); // [Valaris]
-void char_offline(struct map_session_data *sd);
-
-extern MYSQL mmysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-
-extern MYSQL lmysql_handle;
-extern char tmp_lsql[65535];
-extern MYSQL_RES* lsql_res ;
-extern MYSQL_ROW lsql_row ;
-
-extern MYSQL mail_handle;
-extern MYSQL_RES* mail_res ;
-extern MYSQL_ROW mail_row ;
-extern char tmp_msql[65535];
-
-extern int db_use_sqldbs;
-
-extern char item_db_db[32];
-extern char mob_db_db[32];
-extern char login_db[32];
-
-extern char login_db_level[32];
-extern char login_db_account_id[32];
-
-extern char gm_db[32];
-extern char gm_db_level[32];
-extern char gm_db_account_id[32];
-
-extern int lowest_gm_level;
-extern int read_gm_interval;
-
-extern char char_db[32];
-#endif /* not TXT_ONLY */
-
-#endif
+// $Id: map.h,v 1.8 2004/09/25 11:39:17 MouseJstr Exp $
+#ifndef _MAP_H_
+#define _MAP_H_
+
+#include <stdarg.h>
+#include "mmo.h"
+
+#define MAX_PC_CLASS (1+6+6+1+6+1+1+1+1+4023)
+#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 LOCAL_REG_NUM 16
+#define LIFETIME_FLOORITEM 60
+#define DAMAGELOG_SIZE 30
+#define LOOTITEM_SIZE 10
+#define MAX_SKILL_LEVEL 100
+#define MAX_STATUSCHANGE 200
+#define MAX_SKILLUNITGROUP 32
+#define MAX_MOBSKILLUNITGROUP 8
+#define MAX_SKILLUNITGROUPTICKSET 128
+#define MAX_SKILLTIMERSKILL 32
+#define MAX_MOBSKILLTIMERSKILL 10
+#define MAX_MOBSKILL 32
+#define MAX_EVENTQUEUE 2
+#define MAX_EVENTTIMER 32
+#define NATURAL_HEAL_INTERVAL 500
+#define MAX_FLOORITEM 500000
+#define MAX_LEVEL 255
+#define MAX_WALKPATH 48
+#define MAX_DROP_PER_MAP 48
+#define MAX_IGNORE_LIST 80
+
+#define DEFAULT_AUTOSAVE_INTERVAL 60*1000
+
+#define OPTION_HIDE 0x40
+
+enum { BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL , BL_PET };
+enum { WARP, SHOP, SCRIPT, MONS };
+
+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 script_reg {
+ int index;
+ int data;
+};
+struct script_regstr {
+ int index;
+ char data[256];
+};
+struct status_change {
+ int timer;
+ int val1,val2,val3,val4;
+};
+struct vending {
+ short index;
+ unsigned short amount;
+ unsigned int value;
+};
+
+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,range;
+ int target_flag;
+ unsigned int tick;
+ int limit,interval;
+
+ int skill_id,skill_lv;
+ int val1,val2;
+ char *valstr;
+ int unit_id;
+ int group_id;
+ int unit_count,alive_count;
+ struct skill_unit *unit;
+};
+struct skill_unit_group_tickset {
+ unsigned int tick;
+ int group_id;
+};
+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 npc_data;
+struct pet_db;
+struct item_data;
+struct square;
+
+struct map_session_data {
+ struct block_list bl;
+ struct {
+ unsigned auth : 1;
+ unsigned change_walk_target : 1;
+ unsigned attack_continue : 1;
+ unsigned menu_or_input : 1;
+ unsigned dead_sit : 2;
+ unsigned skillcastcancel : 1;
+ unsigned waitingdisconnect : 1;
+ unsigned lr_flag : 2;
+ unsigned connect_new : 1;
+ unsigned arrow_atk : 1;
+ unsigned attack_type : 3;
+ unsigned skill_flag : 1;
+ unsigned gangsterparadise : 1;
+ unsigned produce_flag : 1;
+ unsigned make_arrow_flag : 1;
+ unsigned potionpitcher_flag : 1;
+ unsigned storage_flag : 1;
+ } state;
+ struct {
+ unsigned killer : 1;
+ unsigned killable : 1;
+ unsigned restart_full_recover : 1;
+ unsigned no_castcancel : 1;
+ unsigned no_castcancel2 : 1;
+ unsigned no_sizefix : 1;
+ unsigned no_magic_damage : 1;
+ unsigned no_weapon_damage : 1;
+ unsigned no_gemstone : 1;
+ unsigned infinite_endure : 1;
+ unsigned unbreakable_weapon : 1;
+ unsigned unbreakable_armor : 1;
+ unsigned infinite_autospell : 1;
+ } special_state;
+ int char_id, login_id1, login_id2, sex;
+ int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04 (by [Yor])
+ struct mmo_charstatus status;
+ struct item_data *inventory_data[MAX_INVENTORY];
+ short equip_index[11];
+ int weight,max_weight;
+ int cart_weight,cart_max_weight,cart_num,cart_max_num;
+ char mapname[24];
+ int fd,new_fd;
+ short to_x,to_y;
+ short speed,prev_speed;
+ short opt1,opt2,opt3;
+ char dir,head_dir;
+ unsigned int client_tick,server_tick;
+ struct walkpath_data walkpath;
+ int walktimer;
+ int npc_id,areanpc_id,npc_shopid;
+ int npc_pos;
+ int npc_menu;
+ int npc_amount;
+ int npc_stack,npc_stackmax;
+ char *npc_script,*npc_scriptroot;
+ char *npc_stackbuf;
+ char npc_str[256];
+ unsigned int chatID;
+
+ struct{
+ char name[24];
+ } ignore[MAX_IGNORE_LIST];
+ int ignoreAll;
+
+ int attacktimer;
+ int attacktarget;
+ short attacktarget_lv;
+ unsigned int attackabletime;
+
+ int followtimer; // [MouseJstr]
+ int followtarget;
+
+ short attackrange,attackrange_;
+ int skilltimer;
+ int skilltarget;
+ short skillx,skilly;
+ short skillid,skilllv;
+ short skillitem,skillitemlv;
+ short skillid_old,skilllv_old;
+ short skillid_dance,skilllv_dance;
+ struct skill_unit_group skillunit[MAX_SKILLUNITGROUP];
+ struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
+ struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
+ int cloneskill_id,cloneskill_lv;
+ int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
+
+ int invincible_timer;
+ unsigned int canact_tick;
+ unsigned int canmove_tick;
+ unsigned int canlog_tick;
+ int hp_sub,sp_sub;
+ int inchealhptick,inchealsptick,inchealspirithptick,inchealspiritsptick;
+// -- moonsoul (new tick for berserk self-damage)
+ int berserkdamagetick;
+ int fame;
+
+ short view_class;
+ short weapontype1,weapontype2;
+ short disguiseflag,disguise; // [Valaris]
+ int paramb[6],paramc[6],parame[6],paramcard[6];
+ int hit,flee,flee2,aspd,amotion,dmotion;
+ int watk,watk2,atkmods[3];
+ int def,def2,mdef,mdef2,critical,matk1,matk2;
+ int atk_ele,def_ele,star,overrefine;
+ int castrate,hprate,sprate,dsprate;
+ int addele[10],addrace[12],addsize[3],subele[10],subrace[12];
+ int addeff[10],addeff2[10],reseff[10];
+ int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
+ int atk_ele_,star_,overrefine_; //“ñ“—¬‚Ì‚½‚߂ɒljÁ
+ int base_atk,atk_rate;
+ int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range;
+ int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10];
+ int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp;
+ int aspd_rate,speed_rate,hprecov_rate,sprecov_rate,critical_def,double_rate;
+ int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
+ int matk_rate,ignore_def_ele,ignore_def_race,ignore_def_ele_,ignore_def_race_;
+ int ignore_mdef_ele,ignore_mdef_race;
+ int magic_addele[10],magic_addrace[12],magic_subrace[12];
+ int perfect_hit,get_zeny_num;
+ int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
+ int def_ratio_atk_ele,def_ratio_atk_ele_,def_ratio_atk_race,def_ratio_atk_race_;
+ int add_damage_class_count,add_damage_class_count_,add_magic_damage_class_count;
+ short add_damage_classid[10],add_damage_classid_[10],add_magic_damage_classid[10];
+ int add_damage_classrate[10],add_damage_classrate_[10],add_magic_damage_classrate[10];
+ short add_def_class_count,add_mdef_class_count;
+ short add_def_classid[10],add_mdef_classid[10];
+ int add_def_classrate[10],add_mdef_classrate[10];
+ short monster_drop_item_count;
+ short monster_drop_itemid[10];
+ int monster_drop_race[10],monster_drop_itemrate[10];
+ int double_add_rate,speed_add_rate,aspd_add_rate,perfect_hit_add, get_zeny_add_num;
+ short splash_range,splash_add_range;
+ short autospell_id,autospell_lv,autospell_rate;
+ short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per;
+ short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_;
+ int short_weapon_damage_return,long_weapon_damage_return;
+ int weapon_coma_ele[10],weapon_coma_race[12];
+ short break_weapon_rate,break_armor_rate;
+ short add_steal_rate;
+
+ short spiritball, spiritball_old;
+ int spirit_timer[MAX_SKILL_LEVEL];
+ int magic_damage_return; // AppleGirl Was Here
+ int random_attack_increase_add,random_attack_increase_per; // [Valaris]
+ int perfect_hiding; // [Valaris]
+ int unbreakable;
+
+ int die_counter;
+ short doridori_counter;
+
+ int reg_num;
+ struct script_reg *reg;
+ int regstr_num;
+ struct script_regstr *regstr;
+
+ struct status_change sc_data[MAX_STATUSCHANGE];
+ short sc_count;
+ struct square dev;
+
+ int trade_partner;
+ int deal_item_index[10];
+ int deal_item_amount[10];
+ int deal_zeny;
+ short deal_locked;
+
+ int party_sended,party_invite,party_invite_account;
+ int party_hp,party_x,party_y;
+
+ int guild_sended,guild_invite,guild_invite_account;
+ int guild_emblem_id,guild_alliance,guild_alliance_account;
+ int guildspy; // [Syrus22]
+ int partyspy; // [Syrus22]
+
+ int vender_id;
+ int vend_num;
+ char message[80];
+ struct vending vending[12];
+
+ int catch_target_class;
+ struct s_pet pet;
+ struct pet_db *petDB;
+ struct pet_data *pd;
+ int pet_hungry_timer;
+
+ int pvp_point,pvp_rank,pvp_timer,pvp_lastusers;
+
+ char eventqueue[MAX_EVENTQUEUE][50];
+ int eventtimer[MAX_EVENTTIMER];
+
+ int last_skillid,last_skilllv; // Added by RoVeRT
+ short sg_count;
+
+#ifndef TXT_ONLY
+ int mail_counter; // mail counter for mail system [Valaris]
+#endif
+
+};
+
+struct npc_timerevent_list {
+ int timer,pos;
+};
+struct npc_label_list {
+ char name[24];
+ int pos;
+};
+struct npc_item_list {
+ int nameid,value;
+};
+struct npc_data {
+ struct block_list bl;
+ short n;
+ short class,dir;
+ short speed;
+ char name[24];
+ char exname[24];
+ int chat_id;
+ short opt1,opt2,opt3,option;
+ short flag;
+ int walktimer; // [Valaris]
+ short to_x,to_y; // [Valaris]
+ struct walkpath_data walkpath;
+ unsigned int next_walktime;
+ unsigned int canmove_tick;
+
+ struct { // [Valaris]
+ unsigned state : 8;
+ unsigned change_walk_target : 1;
+ unsigned walk_easy : 1;
+ } state;
+
+ union {
+ struct {
+ char *script;
+ short xs,ys;
+ int guild_id;
+ int timer,timerid,timeramount,nexttimer;
+ 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;
+ char name[16];
+ } warp;
+ } u;
+ // ‚±‚±‚Ƀƒ“ƒo‚ð’ljÁ‚µ‚Ä‚Í‚È‚ç‚È‚¢(shop_item‚ª‰Â•Ï’·‚̈×)
+
+ char eventqueue[MAX_EVENTQUEUE][50];
+ int eventtimer[MAX_EVENTTIMER];
+ short arenaflag;
+};
+struct mob_data {
+ struct block_list bl;
+ short n;
+ short base_class,class,dir,mode;
+ short m,x0,y0,xs,ys;
+ char name[24];
+ int spawndelay1,spawndelay2;
+ struct {
+ unsigned state : 8;
+ unsigned skillstate : 8;
+ unsigned targettype : 1;
+ unsigned steal_flag : 1;
+ unsigned steal_coin_flag : 1;
+ unsigned skillcastcancel : 1;
+ unsigned master_check : 1;
+ unsigned change_walk_target : 1;
+ unsigned walk_easy : 1;
+ unsigned special_mob_ai : 3;
+ } state;
+ int timer;
+ short to_x,to_y;
+ short speed;
+ int hp;
+ int target_id,attacked_id;
+ short target_lv;
+ struct walkpath_data walkpath;
+ unsigned int next_walktime;
+ unsigned int attackabletime;
+ unsigned int last_deadtime,last_spawntime,last_thinktime;
+ unsigned int canmove_tick;
+ short move_fail_count;
+ struct {
+ int id;
+ int dmg;
+ } dmglog[DAMAGELOG_SIZE];
+ struct item *lootitem;
+ short lootitem_count;
+
+ struct status_change sc_data[MAX_STATUSCHANGE];
+ short sc_count;
+ short opt1,opt2,opt3,option;
+ short min_chase;
+ short sg_count;
+ int guild_id;
+ int deletetimer;
+
+ int skilltimer;
+ int skilltarget;
+ short skillx,skilly;
+ short skillid,skilllv,skillidx;
+ unsigned int skilldelay[MAX_MOBSKILL];
+ int def_ele;
+ int master_id,master_dist;
+ int exclusion_src,exclusion_party,exclusion_guild;
+ struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL];
+ struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP];
+ struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
+ char npc_event[50];
+ short size;
+};
+struct pet_data {
+ struct block_list bl;
+ short n;
+ short class,dir;
+ short speed;
+ char name[24];
+ struct {
+ unsigned state : 8 ;
+ unsigned skillstate : 8 ;
+ unsigned change_walk_target : 1 ;
+ } state;
+ int timer;
+ short to_x,to_y;
+ short equip;
+ struct walkpath_data walkpath;
+ int target_id;
+ short target_lv;
+ int move_fail_count;
+ unsigned int attackabletime,next_walktime,last_thinktime;
+ int skilltype,skillval,skilltimer,skillduration; // [Valaris]
+ int skillbonustype,skillbonusval,skillbonustimer,skillbonusduration; // [Valaris]
+ struct item *lootitem;
+ short loot; // [Valaris]
+ short lootmax; // [Valaris]
+ short lootitem_count;
+ short lootitem_weight;
+ int lootitem_timer;
+ struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL]; // [Valaris]
+ struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP]; // [Valaris]
+ struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; // [Valaris]
+ struct map_session_data *msd;
+};
+
+enum { MS_IDLE,MS_WALK,MS_ATTACK,MS_DEAD,MS_DELAY };
+
+enum { NONE_ATTACKABLE,ATTACKABLE };
+
+enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // ˆÍ‚Ü‚êƒyƒiƒ‹ƒeƒBŒvŽZ—p
+
+struct map_data {
+ char name[24];
+ char alias[24]; // [MouseJstr]
+ unsigned char *gat; // NULL‚Ȃ牺‚Ìmap_data_other_server‚Æ‚µ‚Ĉµ‚¤
+ struct block_list **block;
+ struct block_list **block_mob;
+ int *block_count,*block_mob_count;
+ int m;
+ short xs,ys;
+ short bxs,bys;
+ 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 nopenalty : 1;
+ unsigned pvp : 1;
+ unsigned pvp_noparty : 1;
+ unsigned pvp_noguild : 1;
+ unsigned pvp_nightmaredrop :1;
+ unsigned pvp_nocalcrank : 1;
+ unsigned gvg : 1;
+ unsigned gvg_noparty : 1;
+ unsigned nozenypenalty : 1;
+ unsigned notrade : 1;
+ unsigned noskill : 1;
+ unsigned nowarp : 1;
+ unsigned nowarpto : 1;
+ unsigned nopvp : 1; // [Valaris]
+ unsigned noicewall : 1; // [Valaris]
+ unsigned snow : 1; // [Valaris]
+ unsigned fog : 1; // [Valaris]
+ unsigned sakura : 1; // [Valaris]
+ unsigned leaves : 1; // [Valaris]
+ unsigned rain : 1; // [Valaris]
+ } 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 map_data_other_server {
+ char name[24];
+ unsigned char *gat; // NULLŒÅ’è‚É‚µ‚Ä”»’f
+ unsigned long ip;
+ unsigned int port;
+};
+#define read_gat(m,x,y) (map[m].gat[(x)+(y)*map[m].xs])
+#define read_gatp(m,x,y) (m->gat[(x)+(y)*m->xs])
+
+struct flooritem_data {
+ struct block_list bl;
+ short 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-58
+ SP_CARTINFO=99, // 99
+
+ // 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_SUBRACE, // 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-1077
+ SP_DISGUISE, // 1077
+
+ SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
+ SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR // 2006-2009
+};
+
+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
+};
+
+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 agit_flag;
+extern int night_flag; // 0=day, 1=night [Yor]
+
+extern char motd_txt[];
+extern char help_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( void *bl );
+int map_freeblock_lock(void);
+int map_freeblock_unlock(void);
+// blockŠÖ˜A
+int map_addblock(struct block_list *);
+int map_delblock(struct block_list *);
+void map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...);
+// -- moonsoul (added map_foreachincell)
+void map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...);
+void map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...);
+int map_countnearpc(int,int,int);
+//blockŠÖ˜A‚ɒljÁ
+int map_count_oncell(int m,int x,int y);
+// ˆêŽž“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_quit(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);
+#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);
+int map_searchrandfreecell(int,int,int,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_id2sd(int);
+struct block_list * map_id2bl(int);
+int map_mapname2mapid(char*);
+int map_mapname2ipport(char*,int*,int*);
+int map_setipport(char *name,unsigned long ip,int port);
+int map_eraseipport(char *name,unsigned long ip,int port);
+void map_addiddb(struct block_list *);
+void map_deliddb(struct block_list *bl);
+int map_foreachiddb(int (*)(void*,void*,va_list),...);
+void map_addnickdb(struct map_session_data *);
+struct map_session_data * map_nick2sd(char*);
+
+// gatŠÖ˜A
+int map_getcell(int,int,int);
+int map_setcell(int,int,int,int);
+
+// ‚»‚Ì‘¼
+int map_check_dir(int s_dir,int t_dir);
+int map_calc_dir( struct block_list *src,int x,int y);
+
+// path.c‚æ‚è
+int path_search(struct walkpath_data*,int,int,int,int,int,int);
+int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
+
+int map_who(int fd);
+
+void map_helpscreen(); // [Valaris]
+int map_delmap(char *mapname);
+
+extern unsigned long ticks;
+
+#ifndef TXT_ONLY
+
+// MySQL
+#include <mysql.h>
+
+void char_online_check(void); // [Valaris]
+void char_offline(struct map_session_data *sd);
+
+extern MYSQL mmysql_handle;
+extern char tmp_sql[65535];
+extern MYSQL_RES* sql_res ;
+extern MYSQL_ROW sql_row ;
+
+extern MYSQL lmysql_handle;
+extern char tmp_lsql[65535];
+extern MYSQL_RES* lsql_res ;
+extern MYSQL_ROW lsql_row ;
+
+extern MYSQL mail_handle;
+extern MYSQL_RES* mail_res ;
+extern MYSQL_ROW mail_row ;
+extern char tmp_msql[65535];
+
+extern int db_use_sqldbs;
+
+extern char item_db_db[32];
+extern char mob_db_db[32];
+extern char login_db[32];
+
+extern char login_db_level[32];
+extern char login_db_account_id[32];
+
+extern char gm_db[32];
+extern char gm_db_level[32];
+extern char gm_db_account_id[32];
+
+extern int lowest_gm_level;
+extern int read_gm_interval;
+
+extern char char_db[32];
+#endif /* not TXT_ONLY */
+
+#endif
diff --git a/src/map/mob.c b/src/map/mob.c
index a340d171e..f4032662f 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -1,4273 +1,4273 @@
-// $Id: mob.c,v 1.7 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include "timer.h"
-#include "socket.h"
-#include "db.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "mob.h"
-#include "guild.h"
-#include "itemdb.h"
-#include "skill.h"
-#include "battle.h"
-#include "party.h"
-#include "npc.h"
-#include "log.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MIN_MOBTHINKTIME 100
-
-#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute)
-#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute)
-
-struct mob_db mob_db[2001];
-
-/*==========================================
- * Local prototype declaration (only required thing)
- *------------------------------------------
- */
-static int distance(int,int,int,int);
-static int mob_makedummymobdb(int);
-static int mob_timer(int,unsigned int,int,int);
-int mobskill_use(struct mob_data *md,unsigned int tick,int event);
-int mobskill_deltimer(struct mob_data *md );
-int mob_skillid2skillidx(int class,int skillid);
-int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx);
-static int mob_unlocktarget(struct mob_data *md,int tick);
-
-/*==========================================
- * Mob is searched with a name.
- *------------------------------------------
- */
-int mobdb_searchname(const char *str)
-{
- int i;
-
- for(i=0;i<sizeof(mob_db)/sizeof(mob_db[0]);i++){
- if( strcmpi(mob_db[i].name,str)==0 || strcmp(mob_db[i].jname,str)==0 ||
- memcmp(mob_db[i].name,str,24)==0 || memcmp(mob_db[i].jname,str,24)==0)
- return i;
- }
-
- return 0;
-}
-
-/*==========================================
- * Id Mob is checked.
- *------------------------------------------
- */
-int mobdb_checkid(const int id)
-{
- if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0')
- return 0;
-
- return id;
-}
-
-/*==========================================
- * The minimum data set for MOB spawning
- *------------------------------------------
- */
-int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class)
-{
- nullpo_retr(0, md);
-
- md->bl.prev=NULL;
- md->bl.next=NULL;
- if(strcmp(mobname,"--en--")==0)
- memcpy(md->name,mob_db[class].name,24);
- else if(strcmp(mobname,"--ja--")==0)
- memcpy(md->name,mob_db[class].jname,24);
- else
- memcpy(md->name,mobname,24);
-
- md->n = 0;
- md->base_class = md->class = class;
- md->bl.id= npc_get_new_npc_id();
-
- memset(&md->state,0,sizeof(md->state));
- md->timer = -1;
- md->target_id=0;
- md->attacked_id=0;
- md->speed=mob_db[class].speed;
-
- return 0;
-}
-
-
-/*==========================================
- * The MOB appearance for one time (for scripts)
- *------------------------------------------
- */
-int mob_once_spawn(struct map_session_data *sd,char *mapname,
- int x,int y,const char *mobname,int class,int amount,const char *event)
-{
- struct mob_data *md=NULL;
- int m,count,lv=255,r=class;
-
- if( sd )
- lv=sd->status.base_level;
-
- if( sd && strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
-
- if(class<0){ // ƒ‰ƒ“ƒ_ƒ€‚É¢Š«
- int i=0;
- int j=-class-1;
- int k;
- if(j>=0 && j<MAX_RANDOMMONSTER){
- do{
- class=rand()%1000+1001;
- k=rand()%1000000;
- }while((mob_db[class].max_hp <= 0 || mob_db[class].summonper[j] <= k ||
- (lv<mob_db[class].lv && battle_config.random_monster_checklv)) && (i++) < 2000);
- if(i>=2000){
- class=mob_db[0].summonper[j];
- }
- }else{
- return 0;
- }
-// if(battle_config.etc_log)
-// printf("mobclass=%d try=%d\n",class,i);
- }
- if(sd){
- if(x<=0) x=sd->bl.x;
- if(y<=0) y=sd->bl.y;
- }else if(x<=0 || y<=0){
- printf("mob_once_spawn: ??\n");
- }
-
- for(count=0;count<amount;count++){
- md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
- memset(md, '\0', sizeof *md);
- if(mob_db[class].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem=NULL;
-
- mob_spawn_dataset(md,mobname,class);
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
- if(r<0&&battle_config.dead_branch_active) md->mode=0x1+0x4+0x80; //ˆÚ“®‚µ‚ăAƒNƒeƒBƒu‚Å”½Œ‚‚·‚é
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=0;
- md->ys=0;
- md->spawndelay1=-1; // ˆê“x‚̂݃tƒ‰ƒO
- md->spawndelay2=-1; // ˆê“x‚̂݃tƒ‰ƒO
-
- memcpy(md->npc_event,event,sizeof(md->npc_event));
-
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
-
- if(class==1288) { // emperium hp based on defense level [Valaris]
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- mob_db[class].max_hp+=2000*gc->defense;
- md->hp=mob_db[class].max_hp;
- }
- } // end addition [Valaris]
-
-
- }
- return (amount>0)?md->bl.id:0;
-}
-/*==========================================
- * The MOB appearance for one time (& area specification for scripts)
- *------------------------------------------
- */
-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 x,y,i,c,max,lx=-1,ly=-1,id=0;
- int m;
-
- if(strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- max=(y1-y0+1)*(x1-x0+1)*3;
- if(max>1000)max=1000;
-
- if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
-
- for(i=0;i<amount;i++){
- int j=0;
- do{
- x=rand()%(x1-x0+1)+x0;
- y=rand()%(y1-y0+1)+y0;
- }while( ( (c=map_getcell(m,x,y))==1 || c==5)&& (++j)<max );
- if(j>=max){
- if(lx>=0){ // ŒŸõ‚ÉŽ¸”s‚µ‚½‚̂ňȑO‚É•¦‚¢‚½êŠ‚ðŽg‚¤
- x=lx;
- y=ly;
- }else
- return 0; // ʼn‚É•¦‚­êŠ‚ÌŒŸõ‚ðŽ¸”s‚µ‚½‚Ì‚Å‚â‚ß‚é
- }
- id=mob_once_spawn(sd,mapname,x,y,mobname,class,1,event);
- lx=x;
- ly=y;
- }
- return id;
-}
-
-/*==========================================
- * Summoning Guardians [Valaris]
- *------------------------------------------
- */
-int mob_spawn_guardian(struct map_session_data *sd,char *mapname,
- int x,int y,const char *mobname,int class,int amount,const char *event,int guardian)
-{
- struct mob_data *md=NULL;
- int m,count=1,lv=255;
-
- if( sd )
- lv=sd->status.base_level;
-
- if( sd && strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
-
- if(class<0)
- return 0;
-
- if(sd){
- if(x<=0) x=sd->bl.x;
- if(y<=0) y=sd->bl.y;
- }
-
- else if(x<=0 || y<=0)
- printf("mob_spawn_guardian: ??\n");
-
-
- for(count=0;count<amount;count++){
- struct guild_castle *gc;
- md=calloc(sizeof(struct mob_data), 1);
- if(md==NULL){
- printf("mob_spawn_guardian: out of memory !\n");
- exit(1);
- }
- memset(md, '\0', sizeof *md);
-
-
-
- mob_spawn_dataset(md,mobname,class);
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=0;
- md->ys=0;
- md->spawndelay1=-1; // Only once is a flag.
- md->spawndelay2=-1; // Only once is a flag.
-
- memcpy(md->npc_event,event,sizeof(md->npc_event));
-
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
-
- gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- mob_db[class].max_hp+=2000*gc->defense;
- if(guardian==0) { md->hp=gc->Ghp0; gc->GID0=md->bl.id; }
- if(guardian==1) { md->hp=gc->Ghp1; gc->GID1=md->bl.id; }
- if(guardian==2) { md->hp=gc->Ghp2; gc->GID2=md->bl.id; }
- if(guardian==3) { md->hp=gc->Ghp3; gc->GID3=md->bl.id; }
- if(guardian==4) { md->hp=gc->Ghp4; gc->GID4=md->bl.id; }
- if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; }
- if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; }
- if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; }
-
- }
- }
-
- return (amount>0)?md->bl.id:0;
-}
-
-/*==========================================
- * The disregard ID is added to mob.
- *------------------------------------------
- */
-int mob_exclusion_add(struct mob_data *md,int type,int id)
-{
- nullpo_retr(0, md);
-
- if(type==1)
- md->exclusion_src=id;
- if(type==2)
- md->exclusion_party=id;
- if(type==3)
- md->exclusion_guild=id;
-
- return 0;
-}
-
-/*==========================================
- * The disregard ID of mob is checked. (TAGE?)
- *------------------------------------------
- */
-int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
- nullpo_retr(0, md);
-
- if(sd->bl.type==BL_PC){
- if(md->exclusion_src && md->exclusion_src==sd->bl.id)
- return 1;
- if(md->exclusion_party && md->exclusion_party==sd->status.party_id)
- return 2;
- if(md->exclusion_guild && md->exclusion_guild==sd->status.guild_id)
- return 3;
- }
- return 0;
-}
-
-/*==========================================
- * Appearance income of mob
- *------------------------------------------
- */
-int mob_get_viewclass(int class)
-{
- return mob_db[class].view_class;
-}
-int mob_get_sex(int class)
-{
- return mob_db[class].sex;
-}
-short mob_get_hair(int class)
-{
- return mob_db[class].hair;
-}
-short mob_get_hair_color(int class)
-{
- return mob_db[class].hair_color;
-}
-short mob_get_weapon(int class)
-{
- return mob_db[class].weapon;
-}
-short mob_get_shield(int class)
-{
- return mob_db[class].shield;
-}
-short mob_get_head_top(int class)
-{
- return mob_db[class].head_top;
-}
-short mob_get_head_mid(int class)
-{
- return mob_db[class].head_mid;
-}
-short mob_get_head_buttom(int class)
-{
- return mob_db[class].head_buttom;
-}
-short mob_get_clothes_color(int class) // Add for player monster dye - Valaris
-{
- return mob_db[class].clothes_color; // End
-}
-int mob_get_equip(int class) // mob equip [Valaris]
-{
- return mob_db[class].equip;
-}
-/*==========================================
- * Is MOB in the state in which the present movement is possible or not?
- *------------------------------------------
- */
-int mob_can_move(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- if(md->canmove_tick > gettick() || (md->opt1 > 0 && md->opt1 != 6) || md->option&2)
- return 0;
- // ƒAƒ“ƒNƒ‹’†‚Å“®‚¯‚È‚¢‚Æ‚©
- if( md->sc_data[SC_ANKLE].timer != -1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
- md->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
- md->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
- md->sc_data[SC_SPIDERWEB].timer != -1 //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
- )
- return 0;
-
- return 1;
-}
-
-/*==========================================
- * Time calculation concerning one step next to mob
- *------------------------------------------
- */
-static int calc_next_walk_step(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- if(md->walkpath.path_pos>=md->walkpath.path_len)
- return -1;
- if(md->walkpath.path[md->walkpath.path_pos]&1)
- return battle_get_speed(&md->bl)*14/10;
- return battle_get_speed(&md->bl);
-}
-
-static int mob_walktoxy_sub(struct mob_data *md);
-
-/*==========================================
- * Mob Walk processing
- *------------------------------------------
- */
-static int mob_walk(struct mob_data *md,unsigned int tick,int data)
-{
- int moveblock;
- int i,ctype;
- static int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static int diry[8]={1,1,0,-1,-1,-1,0,1};
- int x,y,dx,dy;
-
- nullpo_retr(0, md);
-
- md->state.state=MS_IDLE;
- if(md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_pos!=data)
- return 0;
-
- md->walkpath.path_half ^= 1;
- if(md->walkpath.path_half==0){
- md->walkpath.path_pos++;
- if(md->state.change_walk_target){
- mob_walktoxy_sub(md);
- return 0;
- }
- }
- else {
- if(md->walkpath.path[md->walkpath.path_pos]>=8)
- return 1;
-
- x = md->bl.x;
- y = md->bl.y;
- ctype = map_getcell(md->bl.m,x,y);
- if(ctype == 1 || ctype == 5) {
- mob_stop_walking(md,1);
- return 0;
- }
- md->dir=md->walkpath.path[md->walkpath.path_pos];
- dx = dirx[md->dir];
- dy = diry[md->dir];
-
- ctype = map_getcell(md->bl.m,x+dx,y+dy);
- if(ctype == 1 || ctype == 5) {
- mob_walktoxy_sub(md);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- md->state.state=MS_WALK;
- map_foreachinmovearea(clif_moboutsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
-
- x += dx;
- y += dy;
- if(md->min_chase>13)
- md->min_chase--;
-
- if(moveblock) map_delblock(&md->bl);
- md->bl.x = x;
- md->bl.y = y;
- if(moveblock) map_addblock(&md->bl);
-
- map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md);
- md->state.state=MS_IDLE;
-
- if(md->option&4)
- skill_check_cloaking(&md->bl);
-
- skill_unit_move(&md->bl,tick,1); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
- }
- if((i=calc_next_walk_step(md))>0){
- i = i>>1;
- if(i < 1 && md->walkpath.path_half == 0)
- i = 1;
- md->timer=add_timer(tick+i,mob_timer,md->bl.id,md->walkpath.path_pos);
- md->state.state=MS_WALK;
-
- if(md->walkpath.path_pos>=md->walkpath.path_len)
- clif_fixmobpos(md); // ‚Æ‚Ü‚Á‚½‚Æ‚«‚Ɉʒu‚ÌÄ‘—M
- }
- return 0;
-}
-
-/*==========================================
- * Attack processing of mob
- *------------------------------------------
- */
-static int mob_attack(struct mob_data *md,unsigned int tick,int data)
-{
- struct block_list *tbl=NULL;
- struct map_session_data *tsd=NULL;
- struct mob_data *tmd=NULL;
-
- int mode,race,range;
-
- nullpo_retr(0, md);
-
- md->min_chase=13;
- md->state.state=MS_IDLE;
- md->state.skillstate=MSS_IDLE;
-
- if( md->skilltimer!=-1 ) // ƒXƒLƒ‹Žg—p’†
- return 0;
-
- if(md->opt1>0 || md->option&2)
- return 0;
-
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
-
- if(md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
- if((tbl=map_id2bl(md->target_id))==NULL){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
-
- if(tbl->type==BL_PC)
- tsd=(struct map_session_data *)tbl;
- else if(tbl->type==BL_MOB)
- tmd=(struct mob_data *)tbl;
- else
- return 0;
-
- if(tsd){
- if( pc_isdead(tsd) || tsd->invincible_timer != -1 || pc_isinvisible(tsd) || md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13 ){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- }
- if(tmd){
- if(md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- }
-
-
- if(!md->mode)
- mode=mob_db[md->class].mode;
- else
- mode=md->mode;
-
- race=mob_db[md->class].race;
- if(!(mode&0x80)){
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
- if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 ||
- ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6) ) ) {
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- return 0;
- }
-
- range = mob_db[md->class].range;
- if(mode&1)
- range++;
- if(distance(md->bl.x,md->bl.y,tbl->x,tbl->y) > range)
- return 0;
- if(battle_config.monster_attack_direction_change)
- md->dir=map_calc_dir(&md->bl, tbl->x,tbl->y ); // Œü‚«Ý’è
-
- //clif_fixmobpos(md);
-
- md->state.skillstate=MSS_ATTACK;
- if( mobskill_use(md,tick,-2) ) // ƒXƒLƒ‹Žg—p
- return 0;
-
- md->target_lv = battle_weapon_attack(&md->bl,tbl,tick,0);
-
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end(&md->bl,SC_CLOAKING,-1);
-
- md->attackabletime = tick + battle_get_adelay(&md->bl);
-
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- md->state.state=MS_ATTACK;
-
- return 0;
-}
-
-
-/*==========================================
- * The attack of PC which is attacking id is stopped.
- * The callback function of clif_foreachclient
- *------------------------------------------
- */
-int mob_stopattacked(struct map_session_data *sd,va_list ap)
-{
- int id;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- id=va_arg(ap,int);
- if(sd->attacktarget==id)
- pc_stopattack(sd);
- return 0;
-}
-/*==========================================
- * The timer in which the mob's states changes
- *------------------------------------------
- */
-int mob_changestate(struct mob_data *md,int state,int type)
-{
- unsigned int tick;
- int i;
-
- nullpo_retr(0, md);
-
- if(md->timer != -1)
- delete_timer(md->timer,mob_timer);
- md->timer=-1;
- md->state.state=state;
-
- switch(state){
- case MS_WALK:
- if((i=calc_next_walk_step(md))>0){
- i = i>>2;
- md->timer=add_timer(gettick()+i,mob_timer,md->bl.id,0);
- }
- else
- md->state.state=MS_IDLE;
- break;
- case MS_ATTACK:
- tick = gettick();
- i=DIFF_TICK(md->attackabletime,tick);
- if(i>0 && i<2000)
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- else if(type) {
- md->attackabletime = tick + battle_get_amotion(&md->bl);
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- }
- else {
- md->attackabletime = tick + 1;
- md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
- }
- break;
- case MS_DELAY:
- md->timer=add_timer(gettick()+type,mob_timer,md->bl.id,0);
- break;
- case MS_DEAD:
- skill_castcancel(&md->bl,0);
-// mobskill_deltimer(md);
- md->state.skillstate=MSS_DEAD;
- md->last_deadtime=gettick();
- // Since it died, all aggressors' attack to this mob is stopped.
- clif_foreachclient(mob_stopattacked,md->bl.id);
- skill_unit_out_all(&md->bl,gettick(),1);
- skill_status_change_clear(&md->bl,2); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- skill_clear_unitgroup(&md->bl); // ‘S‚ẴXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚ð휂·‚é
- skill_cleartimerskill(&md->bl);
- if(md->deletetimer!=-1)
- delete_timer(md->deletetimer,mob_timer_delete);
- md->deletetimer=-1;
- md->hp=md->target_id=md->attacked_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * timer processing of mob (timer function)
- * It branches to a walk and an attack.
- *------------------------------------------
- */
-static int mob_timer(int tid,unsigned int tick,int id,int data)
-{
- struct mob_data *md;
- struct block_list *bl;
-
- if( (bl=map_id2bl(id)) == NULL ){ //UŒ‚‚µ‚Ä‚«‚½“G‚ª‚à‚¤‚¢‚È‚¢‚̂ͳí‚̂悤‚¾
- return 1;
- }
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return 1;
-
- nullpo_retr(1, md=(struct mob_data*)bl);
-
- if(md->bl.type!=BL_MOB)
- return 1;
-
- if(md->timer != tid){
- if(battle_config.error_log)
- printf("mob_timer %d != %d\n",md->timer,tid);
- return 0;
- }
- md->timer=-1;
- if(md->bl.prev == NULL || md->state.state == MS_DEAD)
- return 1;
-
- map_freeblock_lock();
- switch(md->state.state){
- case MS_WALK:
- mob_walk(md,tick,data);
- break;
- case MS_ATTACK:
- mob_attack(md,tick,data);
- break;
- case MS_DELAY:
- mob_changestate(md,MS_IDLE,0);
- break;
- default:
- if(battle_config.error_log)
- printf("mob_timer : %d ?\n",md->state.state);
- break;
- }
- map_freeblock_unlock();
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int mob_walktoxy_sub(struct mob_data *md)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, md);
-
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,md->to_x,md->to_y,md->state.walk_easy))
- return 1;
- memcpy(&md->walkpath,&wpd,sizeof(wpd));
-
- md->state.change_walk_target=0;
- mob_changestate(md,MS_WALK,0);
- clif_movemob(md);
-
- return 0;
-}
-
-/*==========================================
- * mob move start
- *------------------------------------------
- */
-int mob_walktoxy(struct mob_data *md,int x,int y,int easy)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, md);
-
- if(md->state.state == MS_WALK && path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,x,y,easy) )
- return 1;
-
- md->state.walk_easy = easy;
- md->to_x=x;
- md->to_y=y;
- if(md->state.state == MS_WALK)
- md->state.change_walk_target=1;
- else
- return mob_walktoxy_sub(md);
-
- return 0;
-}
-
-/*==========================================
- * mob spawn with delay (timer function)
- *------------------------------------------
- */
-static int mob_delayspawn(int tid,unsigned int tick,int m,int n)
-{
- mob_spawn(m);
- return 0;
-}
-
-/*==========================================
- * spawn timing calculation
- *------------------------------------------
- */
-int mob_setdelayspawn(int id)
-{
- unsigned int spawntime,spawntime1,spawntime2,spawntime3;
- struct mob_data *md;
- struct block_list *bl;
-
- if((bl=map_id2bl(id)) == NULL)
- return -1;
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return -1;
-
- nullpo_retr(-1, md=(struct mob_data*)bl);
-
- if(!md || md->bl.type!=BL_MOB)
- return -1;
-
- // Processing of MOB which is not revitalized
- if(md->spawndelay1==-1 && md->spawndelay2==-1 && md->n==0){
- map_deliddb(&md->bl);
- if(md->lootitem) {
- map_freeblock(md->lootitem);
- md->lootitem=NULL;
- }
- map_freeblock(md); // Instead of [ of free ]
- return 0;
- }
-
- spawntime1=md->last_spawntime+md->spawndelay1;
- spawntime2=md->last_deadtime+md->spawndelay2;
- spawntime3=gettick()+5000;
- // spawntime = max(spawntime1,spawntime2,spawntime3);
- if(DIFF_TICK(spawntime1,spawntime2)>0)
- spawntime=spawntime1;
- else
- spawntime=spawntime2;
-
- if(DIFF_TICK(spawntime3,spawntime)>0)
- spawntime=spawntime3;
-
- add_timer(spawntime,mob_delayspawn,id,0);
- return 0;
-}
-
-/*==========================================
- * Mob spawning. Initialization is also variously here.
- *------------------------------------------
- */
-int mob_spawn(int id)
-{
- int x=0,y=0,i=0,c;
- unsigned int tick = gettick();
- struct mob_data *md;
- struct block_list *bl;
-
- nullpo_retr(-1, bl=map_id2bl(id));
-
- if(!bl || !bl->type || bl->type!=BL_MOB)
- return -1;
-
- nullpo_retr(-1, md=(struct mob_data*)bl);
-
- if(!md || !md->bl.type || md->bl.type!=BL_MOB)
- return -1;
-
- md->last_spawntime=tick;
- if( md->bl.prev!=NULL ){
-// clif_clearchar_area(&md->bl,3);
- skill_unit_out_all(&md->bl,gettick(),1);
- map_delblock(&md->bl);
- }
- else
- md->class = md->base_class;
-
- md->bl.m =md->m;
- do {
- if(md->x0==0 && md->y0==0){
- x=rand()%(map[md->bl.m].xs-2)+1;
- y=rand()%(map[md->bl.m].ys-2)+1;
- } else {
- x=md->x0+rand()%(md->xs+1)-md->xs/2;
- y=md->y0+rand()%(md->ys+1)-md->ys/2;
- }
- i++;
- } while(((c=map_getcell(md->bl.m,x,y))==1 || c==5) && i<50);
-
- if(i>=50){
-// if(battle_config.error_log==1)
-// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name);
- add_timer(tick+5000,mob_delayspawn,id,0);
- return 1;
- }
-
- md->to_x=md->bl.x=x;
- md->to_y=md->bl.y=y;
- md->dir=0;
-
- map_addblock(&md->bl);
-
- memset(&md->state,0,sizeof(md->state));
- md->attacked_id = 0;
- md->target_id = 0;
- md->move_fail_count = 0;
-
- if(!md->speed)
- md->speed = mob_db[md->class].speed;
- md->def_ele = mob_db[md->class].element;
- md->master_id=0;
- md->master_dist=0;
-
- md->state.state = MS_IDLE;
- md->state.skillstate = MSS_IDLE;
- md->timer = -1;
- md->last_thinktime = tick;
- md->next_walktime = tick+rand()%50+5000;
- md->attackabletime = tick;
- md->canmove_tick = tick;
-
- md->guild_id = 0;
- if (md->class >= 1285 && md->class <= 1288) {
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc)
- md->guild_id = gc->guild_id;
- }
-
- md->sg_count=0;
- md->deletetimer=-1;
-
- md->skilltimer=-1;
- for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
- md->skilldelay[i] = c;
- md->skillid=0;
- md->skilllv=0;
-
- memset(md->dmglog,0,sizeof(md->dmglog));
- if(md->lootitem)
- memset(md->lootitem,0,sizeof(md->lootitem));
- md->lootitem_count = 0;
-
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++)
- md->skilltimerskill[i].timer = -1;
-
- for(i=0;i<MAX_STATUSCHANGE;i++) {
- md->sc_data[i].timer=-1;
- md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 = md->sc_data[i].val4 =0;
- }
- md->sc_count=0;
- md->opt1=md->opt2=md->opt3=md->option=0;
-
- memset(md->skillunit,0,sizeof(md->skillunit));
- memset(md->skillunittick,0,sizeof(md->skillunittick));
-
- md->hp = battle_get_max_hp(&md->bl);
- if(md->hp<=0){
- mob_makedummymobdb(md->class);
- md->hp = battle_get_max_hp(&md->bl);
- }
-
- clif_spawnmob(md);
-
- return 0;
-}
-
-/*==========================================
- * Distance calculation between two points
- *------------------------------------------
- */
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-/*==========================================
- * The stop of MOB's attack
- *------------------------------------------
- */
-int mob_stopattack(struct mob_data *md)
-{
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- md->attacked_id=0;
- return 0;
-}
-/*==========================================
- * The stop of MOB's walking
- *------------------------------------------
- */
-int mob_stop_walking(struct mob_data *md,int type)
-{
- nullpo_retr(0, md);
-
-
- if(md->state.state == MS_WALK || md->state.state == MS_IDLE) {
- int dx=0,dy=0;
-
- md->walkpath.path_len=0;
- if(type&4){
- dx=md->to_x-md->bl.x;
- if(dx<0)
- dx=-1;
- else if(dx>0)
- dx=1;
- dy=md->to_y-md->bl.y;
- if(dy<0)
- dy=-1;
- else if(dy>0)
- dy=1;
- }
- md->to_x=md->bl.x+dx;
- md->to_y=md->bl.y+dy;
- if(dx!=0 || dy!=0){
- mob_walktoxy_sub(md);
- return 0;
- }
- mob_changestate(md,MS_IDLE,0);
- }
- if(type&0x01)
- clif_fixmobpos(md);
- if(type&0x02) {
- int delay=battle_get_dmotion(&md->bl);
- unsigned int tick = gettick();
- if(md->canmove_tick < tick)
- md->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-/*==========================================
- * Reachability to a Specification ID existence place
- *------------------------------------------
- */
-int mob_can_reach(struct mob_data *md,struct block_list *bl,int range)
-{
- int dx,dy;
- struct walkpath_data wpd;
- int i;
-
- nullpo_retr(0, md);
- nullpo_retr(0, bl);
-
- dx=abs(bl->x - md->bl.x);
- dy=abs(bl->y - md->bl.y);
-
- //=========== guildcastle guardian no search start===========
- //when players are the guild castle member not attack them !
- if(md->class >= 1285 && md->class <= 1287){
- struct map_session_data *sd;
- struct guild *g=NULL;
- struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
-
- if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris]
- return 0; // end addition [Valaris]
-
- if(bl && bl->type == BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)bl);
- if(!gc)
- return 0;
- if(gc && sd && sd->status.guild_id) {
- g=guild_search(sd->status.guild_id); // don't attack guild members [Valaris]
- if(g && g->guild_id == gc->guild_id)
- return 0;
- if(g && gc && guild_isallied(g,gc))
- return 0;
-
- }
- }
- }
- //========== guildcastle guardian no search eof==============
-
- if(bl && bl->type == BL_PC && battle_config.monsters_ignore_gm==1) { // option to have monsters ignore GMs [Valaris]
- struct map_session_data *sd;
- if((sd=(struct map_session_data *)bl) != NULL && pc_isGM(sd))
- return 0;
- }
-
- if( md->bl.m != bl->m) // ˆá‚¤ƒƒbƒv
- return 0;
-
- if( range>0 && range < ((dx>dy)?dx:dy) ) // ‰“‚·‚¬‚é
- return 0;
-
- if( md->bl.x==bl->x && md->bl.y==bl->y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- // Obstacle judging
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x,bl->y,0)!=-1)
- return 1;
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- // It judges whether it can adjoin or not.
- dx=(dx>0)?1:((dx<0)?-1:0);
- dy=(dy>0)?1:((dy<0)?-1:0);
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-dx,bl->y-dy,0)!=-1)
- return 1;
- for(i=0;i<9;i++){
- if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-1+i/3,bl->y-1+i%3,0)!=-1)
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * Determination for an attack of a monster
- *------------------------------------------
- */
-int mob_target(struct mob_data *md,struct block_list *bl,int dist)
-{
- struct map_session_data *sd;
- struct status_change *sc_data;
- short *option;
- int mode,race;
-
- nullpo_retr(0, md);
- nullpo_retr(0, bl);
-
- sc_data = battle_get_sc_data(bl);
- option = battle_get_option(bl);
- race=mob_db[md->class].race;
-
- if(!md->mode)
- mode=mob_db[md->class].mode;
- else
- mode=md->mode;
-
- if(!(mode&0x80)) {
- md->target_id = 0;
- return 0;
- }
- // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending.
- if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && ( !(mode&0x04) || rand()%100>25) )
- return 0;
-
- if(mode&0x20 || // Coercion is exerted if it is MVPMOB.
- (sc_data && sc_data[SC_TRICKDEAD].timer == -1 &&
- ( (option && !(*option&0x06) ) || race==4 || race==6) ) ){
- if(bl->type == BL_PC) {
- nullpo_retr(0, sd = (struct map_session_data *)bl);
- if(sd->invincible_timer != -1 || pc_isinvisible(sd))
- return 0;
- if(!(mode&0x20) && race!=4 && race!=6 && sd->state.gangsterparadise)
- return 0;
- }
-
- md->target_id=bl->id; // Since there was no disturbance, it locks on to target.
- if(bl->type == BL_PC || bl->type == BL_MOB)
- md->state.targettype = ATTACKABLE;
- else
- md->state.targettype = NONE_ATTACKABLE;
- md->min_chase=dist+13;
- if(md->min_chase>26)
- md->min_chase=26;
- }
- return 0;
-}
-
-/*==========================================
- * The ?? routine of an active monster
- *------------------------------------------
- */
-static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
-{
- struct map_session_data *tsd=NULL;
- struct mob_data *smd,*tmd=NULL;
- int mode,race,dist,*pcc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, smd=va_arg(ap,struct mob_data *));
- nullpo_retr(0, pcc=va_arg(ap,int *));
-
- if(bl->type==BL_PC)
- tsd=(struct map_session_data *)bl;
- else if(bl->type==BL_MOB)
- tmd=(struct mob_data *)bl;
- else
- return 0;
-
- //“G–¡•û”»’è
- if(battle_check_target(&smd->bl,bl,BCT_ENEMY)==0)
- return 0;
-
- if(!smd->mode)
- mode=mob_db[smd->class].mode;
- else
- mode=smd->mode;
-
- // ƒAƒNƒeƒBƒu‚Ń^[ƒQƒbƒgŽË’ö“à‚É‚¢‚é‚È‚çAƒƒbƒN‚·‚é
- if( mode&0x04 ){
- race=mob_db[smd->class].race;
- //‘ÎÛ‚ªPC‚Ìê‡
- if(tsd &&
- !pc_isdead(tsd) &&
- tsd->bl.m == smd->bl.m &&
- tsd->invincible_timer == -1 &&
- !pc_isinvisible(tsd) &&
- (dist=distance(smd->bl.x,smd->bl.y,tsd->bl.x,tsd->bl.y))<9
- )
- {
- if(mode&0x20 ||
- (tsd->sc_data[SC_TRICKDEAD].timer == -1 &&
- ((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || race==4 || race==6))){ // –WŠQ‚ª‚È‚¢‚©”»’è
- if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
- rand()%1000<1000/(++(*pcc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
- smd->target_id=tsd->bl.id;
- smd->state.targettype = ATTACKABLE;
- smd->min_chase=13;
- }
- }
- }
- //‘ÎÛ‚ªMob‚Ìê‡
- else if(tmd &&
- tmd->bl.m == smd->bl.m &&
- (dist=distance(smd->bl.x,smd->bl.y,tmd->bl.x,tmd->bl.y))<9
- )
- {
- if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
- rand()%1000<1000/(++(*pcc)) ){ // ”͈͓à‚Å“™Šm—¦‚É‚·‚é
- smd->target_id=bl->id;
- smd->state.targettype = ATTACKABLE;
- smd->min_chase=13;
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- * loot monster item search
- *------------------------------------------
- */
-static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
-{
- struct mob_data* md;
- int mode,dist,*itc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=va_arg(ap,struct mob_data *));
- nullpo_retr(0, itc=va_arg(ap,int *));
-
- if(!md->mode)
- mode=mob_db[md->class].mode;
- else
- mode=md->mode;
-
-
- if( !md->target_id && mode&0x02){
- if(!md->lootitem || (battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) )
- return 0;
- if(bl->m == md->bl.m && (dist=distance(md->bl.x,md->bl.y,bl->x,bl->y))<9){
- if( mob_can_reach(md,bl,12) && // Reachability judging
- rand()%1000<1000/(++(*itc)) ){ // It is made a probability, such as within the limits PC.
- md->target_id=bl->id;
- md->state.targettype = NONE_ATTACKABLE;
- md->min_chase=13;
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- * The ?? routine of a link monster
- *------------------------------------------
- */
-static int mob_ai_sub_hard_linksearch(struct block_list *bl,va_list ap)
-{
- struct mob_data *tmd;
- struct mob_data* md;
- struct block_list *target;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, tmd=(struct mob_data *)bl);
- nullpo_retr(0, md=va_arg(ap,struct mob_data *));
- nullpo_retr(0, target=va_arg(ap,struct block_list *));
-
- // same family free in a range at a link monster -- it will be made to lock if MOB is
-/* if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->class].mode&0x08){
- if( tmd->class==md->class && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE) && tmd->bl.m == md->bl.m){
- if( mob_can_reach(tmd,target,12) ){ // Reachability judging
- tmd->target_id=md->target_id;
- tmd->state.targettype = ATTACKABLE;
- tmd->min_chase=13;
- }
- }
- }*/
- if( md->attacked_id > 0 && mob_db[md->class].mode&0x08){
- if( tmd->class==md->class && tmd->bl.m == md->bl.m && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE)){
- if( mob_can_reach(tmd,target,12) ){ // Reachability judging
- tmd->target_id=md->attacked_id;
- tmd->state.targettype = ATTACKABLE;
- tmd->min_chase=13;
- }
- }
- }
-
- return 0;
-}
-/*==========================================
- * Processing of slave monsters
- *------------------------------------------
- */
-static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
-{
- struct mob_data *mmd=NULL;
- struct block_list *bl;
- int mode,race,old_dist;
-
- nullpo_retr(0, md);
-
- if((bl=map_id2bl(md->master_id)) != NULL )
- mmd=(struct mob_data *)bl;
-
- mode=mob_db[md->class].mode;
-
- // It is not main monster/leader.
- if(!mmd || mmd->bl.type!=BL_MOB || mmd->bl.id!=md->master_id)
- return 0;
-
- // Since it is in the map on which the master is not, teleport is carried out and it pursues.
- if( mmd->bl.m != md->bl.m ){
- mob_warp(md,mmd->bl.m,mmd->bl.x,mmd->bl.y,3);
- md->state.master_check = 1;
- return 0;
- }
-
- // Distance with between slave and master is measured.
- old_dist=md->master_dist;
- md->master_dist=distance(md->bl.x,md->bl.y,mmd->bl.x,mmd->bl.y);
-
- // Since the master was in near immediately before, teleport is carried out and it pursues.
- if( old_dist<10 && md->master_dist>18){
- mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3);
- md->state.master_check = 1;
- return 0;
- }
-
- // Although there is the master, since it is somewhat far, it approaches.
- if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) &&
- (md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_len==0) && md->master_dist<15){
- int i=0,dx,dy,ret;
- if(md->master_dist>4) {
- do {
- if(i<=5){
- dx=mmd->bl.x - md->bl.x;
- dy=mmd->bl.y - md->bl.y;
- if(dx<0) dx+=(rand()%( (dx<-3)?3:-dx )+1);
- else if(dx>0) dx-=(rand()%( (dx>3)?3:dx )+1);
- if(dy<0) dy+=(rand()%( (dy<-3)?3:-dy )+1);
- else if(dy>0) dy-=(rand()%( (dy>3)?3:dy )+1);
- }else{
- dx=mmd->bl.x - md->bl.x + rand()%7 - 3;
- dy=mmd->bl.y - md->bl.y + rand()%7 - 3;
- }
-
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- i++;
- } while(ret && i<10);
- }
- else {
- do {
- dx = rand()%9 - 5;
- dy = rand()%9 - 5;
- if( dx == 0 && dy == 0) {
- dx = (rand()%1)? 1:-1;
- dy = (rand()%1)? 1:-1;
- }
- dx += mmd->bl.x;
- dy += mmd->bl.y;
-
- ret=mob_walktoxy(md,mmd->bl.x+dx,mmd->bl.y+dy,0);
- i++;
- } while(ret && i<10);
- }
-
- md->next_walktime=tick+500;
- md->state.master_check = 1;
- }
-
- // There is the master, the master locks a target and he does not lock.
- if( (mmd->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!md->target_id || md->state.targettype == NONE_ATTACKABLE) ){
- struct map_session_data *sd=map_id2sd(mmd->target_id);
- if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
-
- race=mob_db[md->class].race;
- if(mode&0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
- ( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || race==4 || race==6) ) ){ // –WŠQ‚ª‚È‚¢‚©”»’è
-
- md->target_id=sd->bl.id;
- md->state.targettype = ATTACKABLE;
- md->min_chase=5+distance(md->bl.x,md->bl.y,sd->bl.x,sd->bl.y);
- md->state.master_check = 1;
- }
- }
- }
-
- // There is the master, the master locks a target and he does not lock.
-/* if( (md->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!mmd->target_id || mmd->state.targettype == NONE_ATTACKABLE) ){
- struct map_session_data *sd=map_id2sd(md->target_id);
- if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
-
- race=mob_db[mmd->class].race;
- if(mode&0x20 ||
- (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
- (!(sd->status.option&0x06) || race==4 || race==6)
- ) ){ // It judges whether there is any disturbance.
-
- mmd->target_id=sd->bl.id;
- mmd->state.targettype = ATTACKABLE;
- mmd->min_chase=5+distance(mmd->bl.x,mmd->bl.y,sd->bl.x,sd->bl.y);
- }
- }
- }*/
-
- return 0;
-}
-
-/*==========================================
- * A lock of target is stopped and mob moves to a standby state.
- *------------------------------------------
- */
-static int mob_unlocktarget(struct mob_data *md,int tick)
-{
- nullpo_retr(0, md);
-
- md->target_id=0;
- md->state.targettype = NONE_ATTACKABLE;
- md->state.skillstate=MSS_IDLE;
- md->next_walktime=tick+rand()%3000+3000;
- return 0;
-}
-/*==========================================
- * Random walk
- *------------------------------------------
- */
-static int mob_randomwalk(struct mob_data *md,int tick)
-{
- const int retrycount=20;
- int speed;
-
- nullpo_retr(0, md);
-
- speed=battle_get_speed(&md->bl);
- if(DIFF_TICK(md->next_walktime,tick)<0){
- int i,x,y,c,d=12-md->move_fail_count;
- if(d<5) d=5;
- for(i=0;i<retrycount;i++){ // Search of a movable place
- int r=rand();
- x=md->bl.x+r%(d*2+1)-d;
- y=md->bl.y+r/(d*2+1)%(d*2+1)-d;
- if((c=map_getcell(md->bl.m,x,y))!=1 && c!=5 && mob_walktoxy(md,x,y,1)==0){
- md->move_fail_count=0;
- break;
- }
- if(i+1>=retrycount){
- md->move_fail_count++;
- if(md->move_fail_count>1000){
- if(battle_config.error_log)
- printf("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class);
- md->move_fail_count=0;
- mob_spawn(md->bl.id);
- }
- }
- }
- for(i=c=0;i<md->walkpath.path_len;i++){ // The next walk start time is calculated.
- if(md->walkpath.path[i]&1)
- c+=speed*14/10;
- else
- c+=speed;
- }
- md->next_walktime = tick+rand()%3000+3000+c;
- md->state.skillstate=MSS_WALK;
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * AI of MOB whose is near a Player
- *------------------------------------------
- */
-static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
-{
- struct mob_data *md,*tmd=NULL;
- struct map_session_data *tsd=NULL;
- struct block_list *tbl=NULL;
- struct flooritem_data *fitem;
- unsigned int tick;
- int i,dx,dy,ret,dist;
- int attack_type=0;
- int mode,race;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data*)bl);
-
- tick=va_arg(ap,unsigned int);
-
-
- if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME)
- return 0;
- md->last_thinktime=tick;
-
- if( md->skilltimer!=-1 || md->bl.prev==NULL ){ // Under a skill aria and death
- if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME)
- md->next_walktime=tick;
- return 0;
- }
-
- if(!md->mode)
- mode=mob_db[md->class].mode;
- else
- mode=md->mode;
-
- race=mob_db[md->class].race;
-
- // Abnormalities
- if((md->opt1 > 0 && md->opt1 != 6) || md->state.state==MS_DELAY || md->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
- if(!(mode&0x80) && md->target_id > 0)
- md->target_id = 0;
-
- if(md->attacked_id > 0 && mode&0x08){ // Link monster
- struct map_session_data *asd=map_id2sd(md->attacked_id);
- if(asd){
- if(asd->invincible_timer == -1 && !pc_isinvisible(asd)){
- map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
- md->bl.x-13,md->bl.y-13,
- md->bl.x+13,md->bl.y+13,
- BL_MOB,md,&asd->bl);
- }
- }
- }
-
- // It checks to see it was attacked first (if active, it is target change at 25% of probability).
- if( mode>0 && md->attacked_id>0 && (!md->target_id || md->state.targettype == NONE_ATTACKABLE
- || (mode&0x04 && rand()%100<25 ) ) ){
- struct block_list *abl=map_id2bl(md->attacked_id);
- struct map_session_data *asd=NULL;
- if(abl){
- if(abl->type==BL_PC)
- asd=(struct map_session_data *)abl;
- if(asd==NULL || md->bl.m != abl->m || abl->prev == NULL || asd->invincible_timer != -1 || pc_isinvisible(asd) ||
- (dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0)
- md->attacked_id=0;
- else {
- md->target_id=md->attacked_id; // set target
- md->state.targettype = ATTACKABLE;
- attack_type = 1;
- md->attacked_id=0;
- md->min_chase=dist+13;
- if(md->min_chase>26)
- md->min_chase=26;
- }
- }
- }
-
- md->state.master_check = 0;
- // Processing of slave monster
- if( md->master_id > 0 && md->state.special_mob_ai==0)
- mob_ai_sub_hard_slavemob(md,tick);
-
- // ƒAƒNƒeƒBƒ”ƒ‚ƒ“ƒXƒ^[‚Ìô“G (?? of a bitter taste TIVU monster)
- if( (!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mode&0x04 && !md->state.master_check &&
- battle_config.monster_active_enable){
- i=0;
- if(md->state.special_mob_ai){
- map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
- md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
- md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
- 0,md,&i);
- }else{
- map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
- md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
- md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
- BL_PC,md,&i);
- }
- }
-
- // The item search of a route monster
- if( !md->target_id && mode&0x02 && !md->state.master_check){
- i=0;
- map_foreachinarea(mob_ai_sub_hard_lootsearch,md->bl.m,
- md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
- md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
- BL_ITEM,md,&i);
- }
-
- // It will attack, if the candidate for an attack is.
- if(md->target_id > 0){
- if((tbl=map_id2bl(md->target_id))){
- if(tbl->type==BL_PC)
- tsd=(struct map_session_data *)tbl;
- else if(tbl->type==BL_MOB)
- tmd=(struct mob_data *)tbl;
- if(tsd || tmd) {
- if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase)
- mob_unlocktarget(md,tick); // •Êƒ}ƒbƒv‚©AŽ‹ŠEŠO
- else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6)) )
- mob_unlocktarget(md,tick); // ƒXƒLƒ‹‚È‚Ç‚É‚æ‚éô“G–WŠQ
- else if(!battle_check_range(&md->bl,tbl,mob_db[md->class].range)){
- // UŒ‚”͈͊O‚Ȃ̂ňړ®
- if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
- mob_unlocktarget(md,tick);
- return 0;
- }
- if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
- return 0;
- md->state.skillstate=MSS_CHASE; // “ËŒ‚ŽžƒXƒLƒ‹
- mobskill_use(md,tick,-1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) )
- if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
- return 0; // Šù‚Ɉړ®’†
- if( !mob_can_reach(md,tbl,(md->min_chase>13)?md->min_chase:13) )
- mob_unlocktarget(md,tick); // ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
- else{
- // ’ÇÕ
- md->next_walktime=tick+500;
- i=0;
- do {
- if(i==0){ // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
- if(dx<0) dx++;
- else if(dx>0) dx--;
- if(dy<0) dy++;
- else if(dy>0) dy--;
- }else{ // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
- dx=tbl->x - md->bl.x + rand()%3 - 1;
- dy=tbl->y - md->bl.y + rand()%3 - 1;
- }
- /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- dx=tsd->bl.x - md->bl.x;
- dy=tsd->bl.y - md->bl.y;
- if(dx<0) dx--;
- else if(dx>0) dx++;
- if(dy<0) dy--;
- else if(dy>0) dy++;
- }*/
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- i++;
- } while(ret && i<5);
-
- if(ret){ // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
- if(dx<0) dx=2;
- else if(dx>0) dx=-2;
- if(dy<0) dy=2;
- else if(dy>0) dy=-2;
- mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- }
- }
- } else { // UŒ‚ŽË’ö”͈͓à
- md->state.skillstate=MSS_ATTACK;
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- if(md->state.state==MS_ATTACK)
- return 0; // Šù‚ÉUŒ‚’†
- mob_changestate(md,MS_ATTACK,attack_type);
-
-/* if(mode&0x08){ // ƒŠƒ“ƒNƒ‚ƒ“ƒXƒ^[
- map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
- md->bl.x-13,md->bl.y-13,
- md->bl.x+13,md->bl.y+13,
- BL_MOB,md,&tsd->bl);
- }*/
- }
- return 0;
- }else{ // ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[ˆ—
- if(tbl == NULL || tbl->type != BL_ITEM ||tbl->m != md->bl.m ||
- (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase || !md->lootitem){
- // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
- mob_unlocktarget(md,tick);
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- }else if(dist){
- if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
- mob_unlocktarget(md,tick);
- return 0;
- }
- if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
- return 0;
- md->state.skillstate=MSS_LOOT; // ƒ‹[ƒgŽžƒXƒLƒ‹Žg—p
- mobskill_use(md,tick,-1);
-// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
- if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y) <= 0))
- return 0; // Šù‚Ɉړ®’†
- md->next_walktime=tick+500;
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
-/* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
- dx=tbl->x - md->bl.x;
- dy=tbl->y - md->bl.y;
- }*/
- ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
- if(ret)
- mob_unlocktarget(md,tick);// ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
- }else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
- if(md->state.state==MS_ATTACK)
- return 0; // UŒ‚’†
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
- fitem = (struct flooritem_data *)tbl;
- if(md->lootitem_count < LOOTITEM_SIZE)
- memcpy(&md->lootitem[md->lootitem_count++],&fitem->item_data,sizeof(md->lootitem[0]));
- else if(battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) {
- mob_unlocktarget(md,tick);
- return 0;
- }
- else {
- if(md->lootitem[0].card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&md->lootitem[0].card[1])));
- for(i=0;i<LOOTITEM_SIZE-1;i++)
- memcpy(&md->lootitem[i],&md->lootitem[i+1],sizeof(md->lootitem[0]));
- memcpy(&md->lootitem[LOOTITEM_SIZE-1],&fitem->item_data,sizeof(md->lootitem[0]));
- }
- map_clearflooritem(tbl->id);
- mob_unlocktarget(md,tick);
- }
- return 0;
- }
- }else{
- mob_unlocktarget(md,tick);
- if(md->state.state==MS_WALK)
- mob_stop_walking(md,4); // •às’†‚È‚ç’âŽ~
- return 0;
- }
- }
-
- // It is skill use at the time of /standby at the time of a walk.
- if( mobskill_use(md,tick,-1) )
- return 0;
-
- // •àsˆ—
- if( mode&1 && mob_can_move(md) && // ˆÚ“®‰Â”\MOB&“®‚¯‚éó‘Ô‚É‚ ‚é
- (md->master_id==0 || md->state.special_mob_ai || md->master_dist>10) ){ //Žæ‚芪‚«MOB‚¶‚á‚È‚¢
-
- if( DIFF_TICK(md->next_walktime,tick) > + 7000 &&
- (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) ){
- md->next_walktime = tick + 3000*rand()%2000;
- }
-
- // Random movement
- if( mob_randomwalk(md,tick) )
- return 0;
- }
-
- // Since he has finished walking, it stands by.
- if( md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len )
- md->state.skillstate=MSS_IDLE;
- return 0;
-}
-
-/*==========================================
- * Serious processing for mob in PC field of view (foreachclient)
- *------------------------------------------
- */
-static int mob_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
-{
- unsigned int tick;
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- tick=va_arg(ap,unsigned int);
- map_foreachinarea(mob_ai_sub_hard,sd->bl.m,
- sd->bl.x-AREA_SIZE*2,sd->bl.y-AREA_SIZE*2,
- sd->bl.x+AREA_SIZE*2,sd->bl.y+AREA_SIZE*2,
- BL_MOB,tick);
-
- return 0;
-}
-
-/*==========================================
- * Serious processing for mob in PC field of view (interval timer function)
- *------------------------------------------
- */
-static int mob_ai_hard(int tid,unsigned int tick,int id,int data)
-{
- clif_foreachclient(mob_ai_sub_foreachclient,tick);
-
- return 0;
-}
-
-/*==========================================
- * Negligent mode MOB AI (PC is not in near)
- *------------------------------------------
- */
-static int mob_ai_sub_lazy(void * key,void * data,va_list app)
-{
- struct mob_data *md=data;
- unsigned int tick;
- va_list ap;
-
- nullpo_retr(0, md);
- nullpo_retr(0, app);
- nullpo_retr(0, ap=va_arg(app,va_list));
-
- if(md->bl.type!=BL_MOB)
- return 0;
-
- if(!md->bl.type || md->bl.type!=BL_MOB)
- return 0;
-
- tick=va_arg(ap,unsigned int);
-
- if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME*10)
- return 0;
- md->last_thinktime=tick;
-
- if(md->bl.prev==NULL || md->skilltimer!=-1){
- if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME*10)
- md->next_walktime=tick;
- return 0;
- }
-
- if(DIFF_TICK(md->next_walktime,tick)<0 &&
- (mob_db[md->class].mode&1) && mob_can_move(md) ){
-
- if( map[md->bl.m].users>0 ){
- // Since PC is in the same map, somewhat better negligent processing is carried out.
-
- // It sometimes moves.
- if(rand()%1000<MOB_LAZYMOVEPERC)
- mob_randomwalk(md,tick);
-
- // MOB which is not not the summons MOB but BOSS, either sometimes reboils.
- else if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
- mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20))
- mob_spawn(md->bl.id);
-
- }else{
- // Since PC is not even in the same map, suitable processing is carried out even if it takes.
-
- // MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping
- if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
- mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20))
- mob_warp(md,-1,-1,-1,-1);
- }
-
- md->next_walktime = tick+rand()%10000+5000;
- }
- return 0;
-}
-
-/*==========================================
- * Negligent processing for mob outside PC field of view (interval timer function)
- *------------------------------------------
- */
-static int mob_ai_lazy(int tid,unsigned int tick,int id,int data)
-{
- map_foreachiddb(mob_ai_sub_lazy,tick);
-
- return 0;
-}
-
-
-/*==========================================
- * 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 delay_item_drop {
- int m,x,y;
- int nameid,amount;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-struct delay_item_drop2 {
- int m,x,y;
- struct item item_data;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-/*==========================================
- * item drop with delay (timer function)
- *------------------------------------------
- */
-static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop *ditem;
- struct item temp_item;
- int flag;
-
- nullpo_retr(0, ditem=(struct delay_item_drop *)id);
-
- memset(&temp_item,0,sizeof(temp_item));
- temp_item.nameid = ditem->nameid;
- temp_item.amount = ditem->amount;
- temp_item.identify = !itemdb_isequip3(temp_item.nameid);
-
- if(battle_config.item_auto_get){
- if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){
- clif_additem(ditem->first_sd,0,0,flag);
- map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
- free(ditem);
- return 0;
- }
-
- map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
-
- free(ditem);
- return 0;
-}
-
-/*==========================================
- * item drop (timer function)-lootitem with delay
- *------------------------------------------
- */
-static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop2 *ditem;
- int flag;
-
- nullpo_retr(0, ditem=(struct delay_item_drop2 *)id);
-
- if(battle_config.item_auto_get){
- if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
- clif_additem(ditem->first_sd,0,0,flag);
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
- free(ditem);
- return 0;
- }
-
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
-
- free(ditem);
- return 0;
-}
-
-/*==========================================
- * mob data is erased.
- *------------------------------------------
- */
-int mob_delete(struct mob_data *md)
-{
- nullpo_retr(1, md);
-
- if(md->bl.prev == NULL)
- return 1;
- mob_changestate(md,MS_DEAD,0);
- clif_clearchar_area(&md->bl,1);
- map_delblock(&md->bl);
- if(mob_get_viewclass(md->class) <= 1000)
- clif_clearchar_delay(gettick()+3000,&md->bl,0);
- mob_deleteslave(md);
- mob_setdelayspawn(md->bl.id);
- return 0;
-}
-
-int mob_catch_delete(struct mob_data *md,int type)
-{
- nullpo_retr(1, md);
-
- if(md->bl.prev == NULL)
- return 1;
- mob_changestate(md,MS_DEAD,0);
- clif_clearchar_area(&md->bl,type);
- map_delblock(&md->bl);
- mob_setdelayspawn(md->bl.id);
- return 0;
-}
-
-int mob_timer_delete(int tid, unsigned int tick, int id, int data)
-{
- struct block_list *bl=map_id2bl(id);
- struct mob_data *md;
-
- nullpo_retr(0, bl);
-
- md = (struct mob_data *)bl;
- mob_catch_delete(md,3);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_deleteslave_sub(struct block_list *bl,va_list ap)
-{
- struct mob_data *md;
- int id;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md = (struct mob_data *)bl);
-
- id=va_arg(ap,int);
- if(md->master_id > 0 && md->master_id == id )
- mob_damage(NULL,md,md->hp,1);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_deleteslave(struct mob_data *md)
-{
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_deleteslave_sub, md->bl.m,
- 0,0,map[md->bl.m].xs,map[md->bl.m].ys,
- BL_MOB,md->bl.id);
- return 0;
-}
-
-/*==========================================
- * It is the damage of sd to damage to md.
- *------------------------------------------
- */
-int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
-{
- int i,count,minpos,mindmg;
- struct map_session_data *sd = NULL,*tmpsd[DAMAGELOG_SIZE];
- struct {
- struct party *p;
- int id,base_exp,job_exp;
- } pt[DAMAGELOG_SIZE];
- int pnum=0;
- int mvp_damage,max_hp;
- unsigned int tick = gettick();
- struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL;
- double dmg_rate,tdmg,temp;
- struct item item;
- int ret;
- int drop_rate;
- int skill,sp;
-
- nullpo_retr(0, md); //src‚ÍNULL‚ŌĂ΂ê‚éê‡‚à‚ ‚é‚Ì‚ÅA‘¼‚Ń`ƒFƒbƒN
-
- max_hp = battle_get_max_hp(&md->bl);
-
- if(src && src->type == BL_PC) {
- sd = (struct map_session_data *)src;
- mvp_sd = sd;
- }
-
-// if(battle_config.battle_log)
-// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage);
- if(md->bl.prev==NULL){
- if(battle_config.error_log)
- printf("mob_damage : BlockError!!\n");
- return 0;
- }
-
- if(md->state.state==MS_DEAD || md->hp<=0) {
- if(md->bl.prev != NULL) {
- mob_changestate(md,MS_DEAD,0);
- mobskill_use(md,tick,-1); // It is skill at the time of death.
- clif_clearchar_area(&md->bl,1);
- map_delblock(&md->bl);
- mob_setdelayspawn(md->bl.id);
- }
- return 0;
- }
-
- if(md->sc_data[SC_ENDURE].timer == -1)
- mob_stop_walking(md,3);
- if(damage > max_hp>>2)
- skill_stop_dancing(&md->bl,0);
-
- if(md->hp > max_hp)
- md->hp = max_hp;
-
- // The amount of overkill rounds to hp.
- if(damage>md->hp)
- damage=md->hp;
-
- if(!(type&2)) {
- if(sd!=NULL){
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==sd->bl.id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=damage;
- else {
- md->dmglog[minpos].id=sd->bl.id;
- md->dmglog[minpos].dmg=damage;
- }
-
- if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
- md->attacked_id = sd->bl.id;
- }
- if(src && src->type == BL_PET && battle_config.pet_attack_exp_to_master) {
- struct pet_data *pd = (struct pet_data *)src;
- nullpo_retr(0, pd);
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==pd->msd->bl.id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=(damage*battle_config.pet_attack_exp_rate)/100;
- else {
- md->dmglog[minpos].id=pd->msd->bl.id;
- md->dmglog[minpos].dmg=(damage*battle_config.pet_attack_exp_rate)/100;
- }
- }
- if(src && src->type == BL_MOB && ((struct mob_data*)src)->state.special_mob_ai){
- struct mob_data *md2 = (struct mob_data *)src;
- nullpo_retr(0, md2);
- for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==md2->master_id)
- break;
- if(md->dmglog[i].id==0){
- minpos=i;
- mindmg=0;
- }
- else if(md->dmglog[i].dmg<mindmg){
- minpos=i;
- mindmg=md->dmglog[i].dmg;
- }
- }
- if(i<DAMAGELOG_SIZE)
- md->dmglog[i].dmg+=damage;
- else {
- md->dmglog[minpos].id=md2->master_id;
- md->dmglog[minpos].dmg=damage;
-
- if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
- md->attacked_id = md2->master_id;
- }
- }
-
- }
-
- md->hp-=damage;
-
- if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris]
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
-
- if(md->bl.id==gc->GID0) {
- gc->Ghp0=md->hp;
- if(gc->Ghp0<=0) {
- guild_castledatasave(gc->castle_id,10,0);
- guild_castledatasave(gc->castle_id,18,0);
- }
- }
- if(md->bl.id==gc->GID1) {
- gc->Ghp1=md->hp;
- if(gc->Ghp1<=0) {
- guild_castledatasave(gc->castle_id,11,0);
- guild_castledatasave(gc->castle_id,19,0);
- }
- }
- if(md->bl.id==gc->GID2) {
- gc->Ghp2=md->hp;
- if(gc->Ghp2<=0) {
- guild_castledatasave(gc->castle_id,12,0);
- guild_castledatasave(gc->castle_id,20,0);
- }
- }
- if(md->bl.id==gc->GID3) {
- gc->Ghp3=md->hp;
- if(gc->Ghp3<=0) {
- guild_castledatasave(gc->castle_id,13,0);
- guild_castledatasave(gc->castle_id,21,0);
- }
- }
- if(md->bl.id==gc->GID4) {
- gc->Ghp4=md->hp;
- if(gc->Ghp4<=0) {
- guild_castledatasave(gc->castle_id,14,0);
- guild_castledatasave(gc->castle_id,22,0);
- }
- }
- if(md->bl.id==gc->GID5) {
- gc->Ghp5=md->hp;
- if(gc->Ghp5<=0) {
- guild_castledatasave(gc->castle_id,15,0);
- guild_castledatasave(gc->castle_id,23,0);
- }
- }
- if(md->bl.id==gc->GID6) {
- gc->Ghp6=md->hp;
- if(gc->Ghp6<=0) {
- guild_castledatasave(gc->castle_id,16,0);
- guild_castledatasave(gc->castle_id,24,0);
- }
- }
- if(md->bl.id==gc->GID7) {
- gc->Ghp7=md->hp;
- if(gc->Ghp7<=0) {
- guild_castledatasave(gc->castle_id,17,0);
- guild_castledatasave(gc->castle_id,25,0);
-
- }
- }
- }
- } // end addition [Valaris]
-
- if(md->option&2 )
- skill_status_change_end(&md->bl, SC_HIDING, -1);
- if(md->option&4 )
- skill_status_change_end(&md->bl, SC_CLOAKING, -1);
-
- if(md->state.special_mob_ai == 2){//ƒXƒtƒBƒA[ƒ}ƒCƒ“
- int skillidx=0;
-
- if((skillidx=mob_skillid2skillidx(md->class,NPC_SELFDESTRUCTION2))>=0){
- md->mode |= 0x1;
- md->next_walktime=tick;
- mobskill_use_id(md,&md->bl,skillidx);//Ž©”š‰r¥ŠJŽn
- md->state.special_mob_ai++;
- }
- }
-
- if(md->hp>0){
- return 0;
- }
-
- // ----- ‚±‚±‚©‚玀–Sˆ— -----
-
- map_freeblock_lock();
- mob_changestate(md,MS_DEAD,0);
- mobskill_use(md,tick,-1); // Ž€–SŽžƒXƒLƒ‹
-
- memset(tmpsd,0,sizeof(tmpsd));
- memset(pt,0,sizeof(pt));
-
- max_hp = battle_get_max_hp(&md->bl);
-
- if(src && src->type == BL_MOB)
- mob_unlocktarget((struct mob_data *)src,tick);
-
- /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
- if(sd && (skill=pc_checkskill(sd,HW_SOULDRAIN))>0){
- clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,skill,1);
- sp = (battle_get_lv(&md->bl))*(65+15*skill)/100;
- if(sd->status.sp + sp > sd->status.max_sp)
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp += sp;
- clif_heal(sd->fd,SP_SP,sp);
- }
-
- // mapŠO‚ÉÁ‚¦‚½l‚ÍŒvŽZ‚©‚眂­‚Ì‚Å
- // overkill•ª‚Í–³‚¢‚¯‚Çsum‚Ímax_hp‚Ƃ͈Ⴄ
-
- tdmg = 0;
- for(i=0,count=0,mvp_damage=0;i<DAMAGELOG_SIZE;i++){
- if(md->dmglog[i].id==0)
- continue;
- tmpsd[i] = map_id2sd(md->dmglog[i].id);
- if(tmpsd[i] == NULL)
- continue;
- count++;
- if(tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i]))
- continue;
-
- tdmg += (double)md->dmglog[i].dmg;
- if(mvp_damage<md->dmglog[i].dmg){
- third_sd = second_sd;
- second_sd = mvp_sd;
- mvp_sd=tmpsd[i];
- mvp_damage=md->dmglog[i].dmg;
- }
- }
-
- // [MouseJstr]
- if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) {
-
- if((double)max_hp < tdmg)
- dmg_rate = ((double)max_hp) / tdmg;
- else dmg_rate = 1;
-
- // ŒoŒ±’l‚Ì•ª”z
- for(i=0;i<DAMAGELOG_SIZE;i++){
- int pid,base_exp,job_exp,flag=1;
- double per;
- struct party *p;
- if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m)
- continue;
-/* jAthena's exp formula
- per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
- temp = ((double)mob_db[md->class].base_exp * (double)battle_config.base_exp_rate / 100. * per);
- base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->class].base_exp > 0 && base_exp < 1) base_exp = 1;
- if(base_exp < 0) base_exp = 0;
- temp = ((double)mob_db[md->class].job_exp * (double)battle_config.job_exp_rate / 100. * per);
- job_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mob_db[md->class].job_exp > 0 && job_exp < 1) job_exp = 1;
- if(job_exp < 0) job_exp = 0;
-*/
-//eAthena's exp formula rather than jAthena's
- per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp;
- if(per>512) per=512;
- if(per<1) per=1;
- base_exp=mob_db[md->class].base_exp*per/256;
- if(base_exp < 1) base_exp = 1;
- if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) {
- base_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris]
- }
- if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) base_exp = 0; // Added [Valaris]
- job_exp=mob_db[md->class].job_exp*per/256;
- if(job_exp < 1) job_exp = 1;
- if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) {
- job_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris]
- }
- if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) job_exp = 0; // Added [Valaris]
-
- if((pid=tmpsd[i]->status.party_id)>0){ // ƒp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚é
- int j=0;
- for(j=0;j<pnum;j++) // Œö•½ƒp[ƒeƒBƒŠƒXƒg‚É‚¢‚é‚©‚Ç‚¤‚©
- if(pt[j].id==pid)
- break;
- if(j==pnum){ // ‚¢‚È‚¢‚Æ‚«‚ÍŒö•½‚©‚Ç‚¤‚©Šm”F
- if((p=party_search(pid))!=NULL && p->exp!=0){
- pt[pnum].id=pid;
- pt[pnum].p=p;
- pt[pnum].base_exp=base_exp;
- pt[pnum].job_exp=job_exp;
- pnum++;
- flag=0;
- }
- }else{ // ‚¢‚é‚Æ‚«‚ÍŒö•½
- pt[j].base_exp+=base_exp;
- pt[j].job_exp+=job_exp;
- flag=0;
- }
- }
- if(flag) // ŠeŽ©Š“¾
- pc_gainexp(tmpsd[i],base_exp,job_exp);
- }
- // Œö•½•ª”z
- for(i=0;i<pnum;i++)
- party_exp_share(pt[i].p,md->bl.m,pt[i].base_exp,pt[i].job_exp);
-
- // item drop
- if(!(type&1)) {
- int log_item[8] = {0};
- for(i=0;i<8;i++){
- struct delay_item_drop *ditem;
- int drop_rate;
-
- if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) // Added [Valaris]
- break; // End
-
- if(mob_db[md->class].dropitem[i].nameid <= 0)
- continue;
- drop_rate = mob_db[md->class].dropitem[i].p;
- if(drop_rate <= 0 && battle_config.drop_rate0item)
- drop_rate = 1;
- if(battle_config.drops_by_luk>0 && sd && md) drop_rate+=(sd->status.luk*battle_config.drops_by_luk)/100; // drops affected by luk [Valaris]
- if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) drop_rate*=1.25; // pk_mode increase drops if 20 level difference [Valaris]
- if(drop_rate <= rand()%10000)
- continue;
-
- ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
- ditem->nameid = mob_db[md->class].dropitem[i].nameid;
- log_item[i] = ditem->nameid;
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+500+i,mob_delay_item_drop,(int)ditem,0);
- }
-
- #ifndef TXT_ONLY
- if(log_config.drop > 0)
- log_drop(mvp_sd, md->class, log_item);
- #endif
-
- if(sd && sd->state.attack_type == BF_WEAPON) {
- for(i=0;i<sd->monster_drop_item_count;i++) {
- struct delay_item_drop *ditem;
- int race = battle_get_race(&md->bl);
- if(sd->monster_drop_itemid[i] <= 0)
- continue;
- if(sd->monster_drop_race[i] & (1<<race) ||
- (mob_db[md->class].mode & 0x20 && sd->monster_drop_race[i] & 1<<10) ||
- (!(mob_db[md->class].mode & 0x20) && sd->monster_drop_race[i] & 1<<11) ) {
- if(sd->monster_drop_itemrate[i] <= rand()%10000)
- continue;
-
- ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
- ditem->nameid = sd->monster_drop_itemid[i];
- ditem->amount = 1;
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+520+i,mob_delay_item_drop,(int)ditem,0);
- }
- }
- if(sd->get_zeny_num > 0)
- pc_getzeny(sd,mob_db[md->class].lv*10 + rand()%(sd->get_zeny_num+1));
- }
- if(md->lootitem) {
- for(i=0;i<md->lootitem_count;i++) {
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
- memcpy(&ditem->item_data,&md->lootitem[i],sizeof(md->lootitem[0]));
- ditem->m = md->bl.m;
- ditem->x = md->bl.x;
- ditem->y = md->bl.y;
- ditem->first_sd = mvp_sd;
- ditem->second_sd = second_sd;
- ditem->third_sd = third_sd;
- add_timer(tick+540+i,mob_delay_item_drop2,(int)ditem,0);
- }
- }
- }
-
- // mvpˆ—
- if(mvp_sd && mob_db[md->class].mexp > 0 ){
- int log_mvp[2] = {0};
- int j;
- int mexp;
- temp = ((double)mob_db[md->class].mexp * (double)battle_config.mvp_exp_rate * (9.+(double)count)/1000.);
- mexp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
- if(mexp < 1) mexp = 1;
- clif_mvp_effect(mvp_sd); // ƒGƒtƒFƒNƒg
- clif_mvp_exp(mvp_sd,mexp);
- pc_gainexp(mvp_sd,mexp,0);
- log_mvp[1] = mexp;
- for(j=0;j<3;j++){
- i = rand() % 3;
- if(mob_db[md->class].mvpitem[i].nameid <= 0)
- continue;
- drop_rate = mob_db[md->class].mvpitem[i].p;
- if(drop_rate <= 0 && battle_config.drop_rate0item)
- drop_rate = 1;
- if(drop_rate < battle_config.item_drop_mvp_min)
- drop_rate = battle_config.item_drop_mvp_min;
- if(drop_rate > battle_config.item_drop_mvp_max)
- drop_rate = battle_config.item_drop_mvp_max;
- if(drop_rate <= rand()%10000)
- continue;
- memset(&item,0,sizeof(item));
- item.nameid=mob_db[md->class].mvpitem[i].nameid;
- item.identify=!itemdb_isequip3(item.nameid);
- clif_mvp_item(mvp_sd,item.nameid);
- log_mvp[0] = item.nameid;
- if(mvp_sd->weight*2 > mvp_sd->max_weight)
- map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
- else if((ret = pc_additem(mvp_sd,&item,1))) {
- clif_additem(sd,0,0,ret);
- map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
- }
- break;
- }
- #ifndef TXT_ONLY
- if(log_config.mvpdrop > 0)
- log_mvpdrop(mvp_sd, md->class, log_mvp);
- #endif
- }
-
- } // [MouseJstr]
-
- // <Agit> NPC Event [OnAgitBreak]
- if(md->npc_event[0] && strcmp(((md->npc_event)+strlen(md->npc_event)-13),"::OnAgitBreak") == 0) {
- printf("MOB.C: Run NPC_Event[OnAgitBreak].\n");
- if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak]
- guild_agit_break(md);
- }
-
- // SCRIPTŽÀs
- if(md->npc_event[0]){
-// if(battle_config.battle_log)
-// printf("mob_damage : run event : %s\n",md->npc_event);
- if(src && src->type == BL_PET)
- sd = ((struct pet_data *)src)->msd;
- if(sd == NULL) {
- if(mvp_sd != NULL)
- sd = mvp_sd;
- else {
- struct map_session_data *tmpsd;
- int i;
- for(i=0;i<fd_max;i++){
- if(session[i] && (tmpsd=session[i]->session_data) && tmpsd->state.auth) {
- if(md->bl.m == tmpsd->bl.m) {
- sd = tmpsd;
- break;
- }
- }
- }
- }
- }
- if(sd)
- npc_event(sd,md->npc_event,0);
- }
-
- clif_clearchar_area(&md->bl,1);
- map_delblock(&md->bl);
- if(mob_get_viewclass(md->class) <= 1000)
- clif_clearchar_delay(tick+3000,&md->bl,0);
- mob_deleteslave(md);
- mob_setdelayspawn(md->bl.id);
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int mob_class_change(struct mob_data *md,int *value)
-{
- unsigned int tick = gettick();
- int i,c,hp_rate,max_hp,class,count = 0;
-
- nullpo_retr(0, md);
- nullpo_retr(0, value);
-
- if(value[0]<=1000 || value[0]>2000)
- return 0;
- if(md->bl.prev == NULL) return 0;
-
- while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++;
- if(count < 1) return 0;
-
- class = value[rand()%count];
- if(class<=1000 || class>2000) return 0;
-
- max_hp = battle_get_max_hp(&md->bl);
- hp_rate = md->hp*100/max_hp;
- clif_mob_class_change(md,class);
- md->class = class;
- max_hp = battle_get_max_hp(&md->bl);
- if(battle_config.monster_class_change_full_recover==1) {
- md->hp = max_hp;
- memset(md->dmglog,0,sizeof(md->dmglog));
- }
- else
- md->hp = max_hp*hp_rate/100;
- if(md->hp > max_hp) md->hp = max_hp;
- else if(md->hp < 1) md->hp = 1;
-
- memcpy(md->name,mob_db[class].jname,24);
- memset(&md->state,0,sizeof(md->state));
- md->attacked_id = 0;
- md->target_id = 0;
- md->move_fail_count = 0;
-
- md->speed = mob_db[md->class].speed;
- md->def_ele = mob_db[md->class].element;
-
- mob_changestate(md,MS_IDLE,0);
- skill_castcancel(&md->bl,0);
- md->state.skillstate = MSS_IDLE;
- md->last_thinktime = tick;
- md->next_walktime = tick+rand()%50+5000;
- md->attackabletime = tick;
- md->canmove_tick = tick;
- md->sg_count=0;
-
- for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
- md->skilldelay[i] = c;
- md->skillid=0;
- md->skilllv=0;
-
- if(md->lootitem == NULL && mob_db[class].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
-
- skill_clear_unitgroup(&md->bl);
- skill_cleartimerskill(&md->bl);
-
- clif_clearchar_area(&md->bl,0);
- clif_spawnmob(md);
-
- return 0;
-}
-
-/*==========================================
- * mob‰ñ•œ
- *------------------------------------------
- */
-int mob_heal(struct mob_data *md,int heal)
-{
- int max_hp = battle_get_max_hp(&md->bl);
-
- nullpo_retr(0, md);
-
- md->hp += heal;
- if( max_hp < md->hp )
- md->hp = max_hp;
-
- if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris]
- struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
- if(gc) {
- if(md->bl.id==gc->GID0) gc->Ghp0=md->hp;
- if(md->bl.id==gc->GID1) gc->Ghp1=md->hp;
- if(md->bl.id==gc->GID2) gc->Ghp2=md->hp;
- if(md->bl.id==gc->GID3) gc->Ghp3=md->hp;
- if(md->bl.id==gc->GID4) gc->Ghp4=md->hp;
- if(md->bl.id==gc->GID5) gc->Ghp5=md->hp;
- if(md->bl.id==gc->GID6) gc->Ghp6=md->hp;
- if(md->bl.id==gc->GID7) gc->Ghp7=md->hp;
- }
- } // end addition [Valaris]
-
- return 0;
-}
-
-
-/*==========================================
- * Added by RoVeRT
- *------------------------------------------
- */
-int mob_warpslave_sub(struct block_list *bl,va_list ap)
-{
- struct mob_data *md=(struct mob_data *)bl;
- int id,x,y;
- id=va_arg(ap,int);
- x=va_arg(ap,int);
- y=va_arg(ap,int);
- if( md->master_id==id ) {
- mob_warp(md,-1,x,y,2);
- }
- return 0;
-}
-
-/*==========================================
- * Added by RoVeRT
- *------------------------------------------
- */
-int mob_warpslave(struct mob_data *md,int x, int y)
-{
-//printf("warp slave\n");
- map_foreachinarea(mob_warpslave_sub, md->bl.m,
- x-AREA_SIZE,y-AREA_SIZE,
- x+AREA_SIZE,y+AREA_SIZE,BL_MOB,
- md->bl.id, md->bl.x, md->bl.y );
- return 0;
-}
-
-/*==========================================
- * mobƒ[ƒv
- *------------------------------------------
- */
-int mob_warp(struct mob_data *md,int m,int x,int y,int type)
-{
- int i=0,c,xs=0,ys=0,bx=x,by=y;
-
- nullpo_retr(0, md);
-
- if( md->bl.prev==NULL )
- return 0;
-
- if( m<0 ) m=md->bl.m;
-
- if(type >= 0) {
- if(map[md->bl.m].flag.monster_noteleport)
- return 0;
- clif_clearchar_area(&md->bl,type);
- }
- skill_unit_out_all(&md->bl,gettick(),1);
- map_delblock(&md->bl);
-
- if(bx>0 && by>0){ // ˆÊ’uŽw’è‚ÌꇎüˆÍ‚XƒZƒ‹‚ð’Tõ
- xs=ys=9;
- }
-
- while( ( x<0 || y<0 || ((c=read_gat(m,x,y))==1 || c==5) ) && (i++)<1000 ){
- if( xs>0 && ys>0 && i<250 ){ // Žw’èˆÊ’u•t‹ß‚Ì’Tõ
- x=bx+rand()%xs-xs/2;
- y=by+rand()%ys-ys/2;
- }else{ // Š®‘Sƒ‰ƒ“ƒ_ƒ€’Tõ
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- }
- }
- md->dir=0;
- if(i<1000){
- md->bl.x=md->to_x=x;
- md->bl.y=md->to_y=y;
- md->bl.m=m;
- }else {
- m=md->bl.m;
- if(battle_config.error_log==1)
- printf("MOB %d warp failed, class = %d\n",md->bl.id,md->class);
- }
-
- md->target_id=0; // ƒ^ƒQ‚ð‰ðœ‚·‚é
- md->state.targettype=NONE_ATTACKABLE;
- md->attacked_id=0;
- md->state.skillstate=MSS_IDLE;
- mob_changestate(md,MS_IDLE,0);
-
- if(type>0 && i==1000) {
- if(battle_config.battle_log)
- printf("MOB %d warp to (%d,%d), class = %d\n",md->bl.id,x,y,md->class);
- }
-
- map_addblock(&md->bl);
- if(type>0)
- {
- clif_spawnmob(md);
- mob_warpslave(md,md->bl.x,md->bl.y);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ—p(foreachinarea)
- *------------------------------------------
- */
-int mob_countslave_sub(struct block_list *bl,va_list ap)
-{
- int id,*c;
- struct mob_data *md;
-
- id=va_arg(ap,int);
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, md = (struct mob_data *)bl);
-
-
- if( md->master_id==id )
- (*c)++;
- return 0;
-}
-/*==========================================
- * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ
- *------------------------------------------
- */
-int mob_countslave(struct mob_data *md)
-{
- int c=0;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_countslave_sub, md->bl.m,
- 0,0,map[md->bl.m].xs-1,map[md->bl.m].ys-1,
- BL_MOB,md->bl.id,&c);
- return c;
-}
-/*==========================================
- * Žè‰ºMOB¢Š«
- *------------------------------------------
- */
-int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag)
-{
- struct mob_data *md;
- int bx,by,m,count = 0,class,k,a = amount;
-
- nullpo_retr(0, md2);
- nullpo_retr(0, value);
-
- bx=md2->bl.x;
- by=md2->bl.y;
- m=md2->bl.m;
-
- if(value[0]<=1000 || value[0]>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
- return 0;
- while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++;
- if(count < 1) return 0;
-
- for(k=0;k<count;k++) {
- amount = a;
- class = value[k];
- if(class<=1000 || class>2000) continue;
- for(;amount>0;amount--){
- int x=0,y=0,c=0,i=0;
- md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
- if(mob_db[class].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem=NULL;
-
- while((x<=0 || y<=0 || (c=map_getcell(m,x,y))==1 || c==5 ) && (i++)<100){
- x=rand()%9-4+bx;
- y=rand()%9-4+by;
- }
- if(i>=100){
- x=bx;
- y=by;
- }
-
- mob_spawn_dataset(md,"--ja--",class);
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
-
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=0;
- md->ys=0;
- md->speed=md2->speed;
- md->spawndelay1=-1; // ˆê“x‚̂݃tƒ‰ƒO
- md->spawndelay2=-1; // ˆê“x‚̂݃tƒ‰ƒO
-
- memset(md->npc_event,0,sizeof(md->npc_event));
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
- clif_skill_nodamage(&md->bl,&md->bl,(flag)? NPC_SUMMONSLAVE:NPC_SUMMONMONSTER,a,1);
-
- if(flag)
- md->master_id=md2->bl.id;
- }
- }
- return 0;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é(foreachclient)
- *------------------------------------------
- */
-static int mob_counttargeted_sub(struct block_list *bl,va_list ap)
-{
- int id,*c,target_lv;
- struct block_list *src;
-
- id=va_arg(ap,int);
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c=va_arg(ap,int *));
-
- src=va_arg(ap,struct block_list *);
- target_lv=va_arg(ap,int);
- if(id == bl->id || (src && id == src->id)) return 0;
- if(bl->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)bl;
- if(sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_PET) {
- struct pet_data *pd = (struct pet_data *)bl;
- if(pd->target_id == id && pd->timer != -1 && pd->state.state == MS_ATTACK && pd->target_lv >= target_lv)
- (*c)++;
- }
- return 0;
-}
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é
- *------------------------------------------
- */
-int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv)
-{
- int c=0;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_counttargeted_sub, md->bl.m,
- md->bl.x-AREA_SIZE,md->bl.y-AREA_SIZE,
- md->bl.x+AREA_SIZE,md->bl.y+AREA_SIZE,0,md->bl.id,&c,src,target_lv);
- return c;
-}
-
-/*==========================================
- *MOBskill‚©‚çŠY“–skillid‚Ìskillidx‚ð•Ô‚·
- *------------------------------------------
- */
-int mob_skillid2skillidx(int class,int skillid)
-{
- int i;
- struct mob_skill *ms=mob_db[class].skill;
-
- if(ms==NULL)
- return -1;
-
- for(i=0;i<mob_db[class].maxskill;i++){
- if(ms[i].skill_id == skillid)
- return i;
- }
- return -1;
-
-}
-
-//
-// MOBƒXƒLƒ‹
-//
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
- *------------------------------------------
- */
-int mobskill_castend_id( int tid, unsigned int tick, int id,int data )
-{
- struct mob_data* md=NULL;
- struct block_list *bl;
- struct block_list *mbl;
- int range;
-
- if((mbl = map_id2bl(id)) == NULL ) //‰r¥‚µ‚½Mob‚ª‚à‚¤‚¢‚È‚¢‚Æ‚¢‚¤‚Ì‚Í—Ç‚­‚ ‚é³íˆ—
- return 0;
- if((md=(struct mob_data *)mbl) == NULL ){
- printf("mobskill_castend_id nullpo mbl->id:%d\n",mbl->id);
- return 0;
- }
-
- if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
- return 0;
-
- if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
- return 0;
-
- md->skilltimer=-1;
- //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
- if(md->skillid != NPC_EMOTION)
- md->last_thinktime=tick + battle_get_adelay(&md->bl);
-
- if((bl = map_id2bl(md->skilltarget)) == NULL || bl->prev==NULL){ //ƒXƒLƒ‹ƒ^[ƒQƒbƒg‚ª‘¶Ý‚µ‚È‚¢
- //printf("mobskill_castend_id nullpo\n");//ƒ^[ƒQƒbƒg‚ª‚¢‚È‚¢‚Æ‚«‚Ínullpo‚¶‚á‚È‚­‚Ä•’Ê‚ÉI—¹
- return 0;
- }
- if(md->bl.m != bl->m)
- return 0;
-
- if(md->skillid == PR_LEXAETERNA) {
- struct status_change *sc_data = battle_get_sc_data(bl);
- if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)))
- return 0;
- }
- else if(md->skillid == RG_BACKSTAP) {
- int dir = map_calc_dir(&md->bl,bl->x,bl->y),t_dir = battle_get_dir(bl);
- int dist = distance(md->bl.x,md->bl.y,bl->x,bl->y);
- if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir)))
- return 0;
- }
- if( ( (skill_get_inf(md->skillid)&1) || (skill_get_inf2(md->skillid)&4) ) && // ”Þ‰ä“G‘Ί֌Wƒ`ƒFƒbƒN
- battle_check_target(&md->bl,bl, BCT_ENEMY)<=0 )
- return 0;
- range = skill_get_range(md->skillid,md->skilllv);
- if(range < 0)
- range = battle_get_range(&md->bl) - (range + 1);
- if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,bl->x,bl->y))
- return 0;
-
- md->skilldelay[md->skillidx]=tick;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
- mob_stop_walking(md,0);
-
- switch( skill_get_nk(md->skillid) )
- {
- // UŒ‚Œn/‚«”ò‚΂µŒn
- case 0: case 2:
- skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- break;
- case 1:// Žx‰‡Œn
- if(!mob_db[md->class].skill[md->skillidx].val[0] &&
- (md->skillid==AL_HEAL || (md->skillid==ALL_RESURRECTION && bl->type != BL_PC)) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) )
- skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- else
- skill_castend_nodamage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
- break;
- }
-
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
- *------------------------------------------
- */
-int mobskill_castend_pos( int tid, unsigned int tick, int id,int data )
-{
- struct mob_data* md=NULL;
- struct block_list *bl;
- int range,maxcount;
-
- //mobskill_castend_id“¯—l‰r¥‚µ‚½Mob‚ª‰r¥Š®—¹Žž‚É‚à‚¤‚¢‚È‚¢‚Æ‚¢‚¤‚Ì‚Í‚ ‚è‚»‚¤‚È‚Ì‚Ånullpo‚©‚眊O
- if((bl=map_id2bl(id))==NULL)
- return 0;
-
- nullpo_retr(0, md=(struct mob_data *)bl);
-
- if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
- return 0;
-
- if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
- return 0;
-
- md->skilltimer=-1;
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if(battle_config.monster_skill_reiteration == 0) {
- range = -1;
- switch(md->skillid) {
- case MG_SAFETYWALL:
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
- range = 0;
- break;
- case AL_PNEUMA:
- case AL_WARP:
- range = 1;
- break;
- }
- if(range >= 0) {
- if(skill_check_unit_range(md->bl.m,md->skillx,md->skilly,range,md->skillid) > 0)
- return 0;
- }
- }
- if(battle_config.monster_skill_nofootset) {
- range = -1;
- switch(md->skillid) {
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case AM_DEMONSTRATION:
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
- range = 1;
- break;
- case AL_WARP:
- range = 0;
- break;
- }
- if(range >= 0) {
- if(skill_check_unit_range2(md->bl.m,md->skillx,md->skilly,range) > 0)
- return 0;
- }
- }
-
- if(battle_config.monster_land_skill_limit) {
- maxcount = skill_get_maxcount(md->skillid);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_MOBSKILLUNITGROUP;i++) {
- if(md->skillunit[i].alive_count > 0 && md->skillunit[i].skill_id == md->skillid)
- c++;
- }
- if(c >= maxcount)
- return 0;
- }
- }
-
- range = skill_get_range(md->skillid,md->skilllv);
- if(range < 0)
- range = battle_get_range(&md->bl) - (range + 1);
- if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,md->skillx,md->skilly))
- return 0;
- md->skilldelay[md->skillidx]=tick;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
- mob_stop_walking(md,0);
-
- skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0);
-
- return 0;
-}
-
-
-/*==========================================
- * Skill use (an aria start, ID specification)
- *------------------------------------------
- */
-int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx)
-{
- int casttime,range;
- struct mob_skill *ms;
- int skill_id, skill_lv, forcecast = 0;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]);
-
- if( target==NULL && (target=map_id2bl(md->target_id))==NULL )
- return 0;
-
- if( target->prev==NULL || md->bl.prev==NULL )
- return 0;
-
- skill_id=ms->skill_id;
- skill_lv=ms->skill_lv;
-
- // ’¾–Ù‚âˆÙí
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if(md->option&4 && skill_id==TF_HIDING)
- return 0;
- if(md->option&2 && skill_id!=TF_HIDING && skill_id!=AS_GRIMTOOTH && skill_id!=RG_BACKSTAP && skill_id!=RG_RAID)
- return 0;
-
- if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP ||
- skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING))
- return 0;
-
- if(skill_get_inf2(skill_id)&0x200 && md->bl.id == target->id)
- return 0;
-
- // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
- range = skill_get_range(skill_id,skill_lv);
- if(range < 0)
- range = battle_get_range(&md->bl) - (range + 1);
- if(!battle_check_range(&md->bl,target,range))
- return 0;
-
-// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) );
-
- casttime=skill_castfix(&md->bl,ms->casttime);
- md->state.skillcastcancel=ms->cancel;
- md->skilldelay[skill_idx]=gettick();
-
- switch(skill_id){ /* ‰½‚©“ÁŽê‚Ȉ—‚ª•K—v */
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if(target->type != BL_PC && battle_check_undead(battle_get_race(target),battle_get_elem_type(target))){ /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
- forcecast=1; /* ƒ^[ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
- casttime=skill_castfix(&md->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) );
- }
- break;
- case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast=1;
- break;
- }
-
- if(battle_config.mob_skill_log)
- printf("MOB skill use target_id=%d skill=%d lv=%d cast=%d, class = %d\n",target->id,skill_id,skill_lv,casttime,md->class);
-
- if(casttime>0 || forcecast){ // ‰r¥‚ª•K—v
-// struct mob_data *md2;
- clif_skillcasting( &md->bl,
- md->bl.id, target->id, 0,0, skill_id,casttime);
-
- // ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[
-/* if( target->type==BL_MOB && mob_db[(md2=(struct mob_data *)target)->class].mode&0x10 &&
- md2->state.state!=MS_ATTACK){
- md2->target_id=md->bl.id;
- md->state.targettype = ATTACKABLE;
- md2->min_chase=13;
- }*/
- }
-
- if( casttime<=0 ) // ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢
- md->state.skillcastcancel=0;
-
- md->skilltarget = target->id;
- md->skillx = 0;
- md->skilly = 0;
- md->skillid = skill_id;
- md->skilllv = skill_lv;
- md->skillidx = skill_idx;
-
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING)
- skill_status_change_end(&md->bl,SC_CLOAKING,-1);
-
- if( casttime>0 ){
- md->skilltimer =
- add_timer( gettick()+casttime, mobskill_castend_id, md->bl.id, 0 );
- }else{
- md->skilltimer = -1;
- mobskill_castend_id(md->skilltimer,gettick(),md->bl.id, 0);
- }
-
- return 1;
-}
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-int mobskill_use_pos( struct mob_data *md,
- int skill_x, int skill_y, int skill_idx)
-{
- int casttime=0,range;
- struct mob_skill *ms;
- struct block_list bl;
- int skill_id, skill_lv;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]);
-
- if( md->bl.prev==NULL )
- return 0;
-
- skill_id=ms->skill_id;
- skill_lv=ms->skill_lv;
-
- //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
- if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
- if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
- return 0;
- if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
- return 0;
- if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
- return 0;
- }
-
- if(md->option&2)
- return 0;
-
- if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP ||
- skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING))
- return 0;
-
- // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
- bl.type = BL_NUL;
- bl.m = md->bl.m;
- bl.x = skill_x;
- bl.y = skill_y;
- range = skill_get_range(skill_id,skill_lv);
- if(range < 0)
- range = battle_get_range(&md->bl) - (range + 1);
- if(!battle_check_range(&md->bl,&bl,range))
- return 0;
-
-// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) );
- casttime=skill_castfix(&md->bl,ms->casttime);
- md->skilldelay[skill_idx]=gettick();
- md->state.skillcastcancel=ms->cancel;
-
- if(battle_config.mob_skill_log)
- printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n",
- skill_x,skill_y,skill_id,skill_lv,casttime,md->class);
-
- if( casttime>0 ) // A cast time is required.
- clif_skillcasting( &md->bl,
- md->bl.id, 0, skill_x,skill_y, skill_id,casttime);
-
- if( casttime<=0 ) // A skill without a cast time wont be cancelled.
- md->state.skillcastcancel=0;
-
-
- md->skillx = skill_x;
- md->skilly = skill_y;
- md->skilltarget = 0;
- md->skillid = skill_id;
- md->skilllv = skill_lv;
- md->skillidx = skill_idx;
- if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end(&md->bl,SC_CLOAKING,-1);
- if( casttime>0 ){
- md->skilltimer =
- add_timer( gettick()+casttime, mobskill_castend_pos, md->bl.id, 0 );
- }else{
- md->skilltimer = -1;
- mobskill_castend_pos(md->skilltimer,gettick(),md->bl.id, 0);
- }
-
- return 1;
-}
-
-
-/*==========================================
- * Friendly Mob whose HP is decreasing by a nearby MOB is looked for.
- *------------------------------------------
- */
-int mob_getfriendhpltmaxrate_sub(struct block_list *bl,va_list ap)
-{
- int rate;
- struct mob_data **fr, *md, *mmd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
-
- md=(struct mob_data *)bl;
-
- if( mmd->bl.id == bl->id )
- return 0;
- rate=va_arg(ap,int);
- fr=va_arg(ap,struct mob_data **);
- if( md->hp < mob_db[md->class].max_hp*rate/100 )
- (*fr)=md;
- return 0;
-}
-struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md,int rate)
-{
- struct mob_data *fr=NULL;
- const int r=8;
-
- nullpo_retr(NULL, md);
-
- map_foreachinarea(mob_getfriendhpltmaxrate_sub, md->bl.m,
- md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
- BL_MOB,md,rate,&fr);
- return fr;
-}
-/*==========================================
- * What a status state suits by nearby MOB is looked for.
- *------------------------------------------
- */
-int mob_getfriendstatus_sub(struct block_list *bl,va_list ap)
-{
- int cond1,cond2;
- struct mob_data **fr, *md, *mmd;
- int flag=0;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data *)bl);
- nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
-
- if( mmd->bl.id == bl->id )
- return 0;
- cond1=va_arg(ap,int);
- cond2=va_arg(ap,int);
- fr=va_arg(ap,struct mob_data **);
- if( cond2==-1 ){
- int j;
- for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
- flag=(md->sc_data[j].timer!=-1 );
- }
- }else
- flag=( md->sc_data[cond2].timer!=-1 );
- if( flag^( cond1==MSC_FRIENDSTATUSOFF ) )
- (*fr)=md;
-
- return 0;
-}
-struct mob_data *mob_getfriendstatus(struct mob_data *md,int cond1,int cond2)
-{
- struct mob_data *fr=NULL;
- const int r=8;
-
- nullpo_retr(0, md);
-
- map_foreachinarea(mob_getfriendstatus_sub, md->bl.m,
- md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
- BL_MOB,md,cond1,cond2,&fr);
- return fr;
-}
-
-/*==========================================
- * Skill use judging
- *------------------------------------------
- */
-int mobskill_use(struct mob_data *md,unsigned int tick,int event)
-{
- struct mob_skill *ms;
-// struct block_list *target=NULL;
- int i,max_hp;
-
- nullpo_retr(0, md);
- nullpo_retr(0, ms = mob_db[md->class].skill);
-
- max_hp = battle_get_max_hp(&md->bl);
-
- if(battle_config.mob_skill_use == 0 || md->skilltimer != -1)
- return 0;
-
- if(md->state.special_mob_ai)
- return 0;
-
- if(md->sc_data[SC_SELFDESTRUCTION].timer!=-1) //Ž©”š’†‚̓XƒLƒ‹‚ðŽg‚í‚È‚¢
- return 0;
-
- for(i=0;i<mob_db[md->class].maxskill;i++){
- int c2=ms[i].cond2,flag=0;
- struct mob_data *fmd=NULL;
-
- // ƒfƒBƒŒƒC’†
- if( DIFF_TICK(tick,md->skilldelay[i])<ms[i].delay )
- continue;
-
- // ó‘Ô”»’è
- if( ms[i].state>=0 && ms[i].state!=md->state.skillstate )
- continue;
-
- // ðŒ”»’è
- flag=(event==ms[i].cond1);
- if(!flag){
- switch( ms[i].cond1 ){
- case MSC_ALWAYS:
- flag=1; break;
- case MSC_MYHPLTMAXRATE: // HP< maxhp%
- flag=( md->hp < max_hp*c2/100 ); break;
- case MSC_MYSTATUSON: // status[num] on
- case MSC_MYSTATUSOFF: // status[num] off
- if( ms[i].cond2==-1 ){
- int j;
- for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
- flag=(md->sc_data[j].timer!=-1 );
- }
- }else
- flag=( md->sc_data[ms[i].cond2].timer!=-1 );
- flag^=( ms[i].cond1==MSC_MYSTATUSOFF ); break;
- case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp%
- flag=(( fmd=mob_getfriendhpltmaxrate(md,ms[i].cond2) )!=NULL ); break;
- case MSC_FRIENDSTATUSON: // friend status[num] on
- case MSC_FRIENDSTATUSOFF: // friend status[num] off
- flag=(( fmd=mob_getfriendstatus(md,ms[i].cond1,ms[i].cond2) )!=NULL ); break;
- case MSC_SLAVELT: // slave < num
- flag=( mob_countslave(md) < c2 ); break;
- case MSC_ATTACKPCGT: // attack pc > num
- flag=( mob_counttargeted(md,NULL,0) > c2 ); break;
- case MSC_SLAVELE: // slave <= num
- flag=( mob_countslave(md) <= c2 ); break;
- case MSC_ATTACKPCGE: // attack pc >= num
- flag=( mob_counttargeted(md,NULL,0) >= c2 ); break;
- case MSC_SKILLUSED: // specificated skill used
- flag=( (event&0xffff)==MSC_SKILLUSED && ((event>>16)==c2 || c2==0)); break;
- }
- }
-
- // Šm—¦”»’è
- if( flag && rand()%10000 < ms[i].permillage ){
-
- if( skill_get_inf(ms[i].skill_id)&2 ){
- // ꊎw’è
- struct block_list *bl = NULL;
- int x=0,y=0;
- if( ms[i].target<=MST_AROUND ){
- bl= ((ms[i].target==MST_TARGET || ms[i].target==MST_AROUND5)? map_id2bl(md->target_id):
- (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
- if(bl!=NULL){
- x=bl->x; y=bl->y;
- }
- }
- if( x<=0 || y<=0 )
- continue;
- // Ž©•ª‚ÌŽüˆÍ
- if( ms[i].target>=MST_AROUND1 ){
- int bx=x, by=y, i=0, c, m=bl->m, r=ms[i].target-MST_AROUND1;
- do{
- bx=x + rand()%(r*2+3) - r;
- by=y + rand()%(r*2+3) - r;
- }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
- ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000);
- if(i<1000){
- x=bx; y=by;
- }
- }
- // ‘ŠŽè‚ÌŽüˆÍ
- if( ms[i].target>=MST_AROUND5 ){
- int bx=x, by=y, i=0, c, m=bl->m, r=(ms[i].target-MST_AROUND5)+1;
- do{
- bx=x + rand()%(r*2+1) - r;
- by=y + rand()%(r*2+1) - r;
- }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
- ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000);
- if(i<1000){
- x=bx; y=by;
- }
- }
- if(!mobskill_use_pos(md,x,y,i))
- return 0;
-
- }else{
- // IDŽw’è
- if( ms[i].target<=MST_FRIEND ){
- struct block_list *bl = NULL;
- bl= ((ms[i].target==MST_TARGET)? map_id2bl(md->target_id):
- (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
- if(bl && !mobskill_use_id(md,bl,i))
- return 0;
- }
- }
- if(ms[i].emotion >= 0)
- clif_emotion(&md->bl,ms[i].emotion);
- return 1;
- }
- }
-
- return 0;
-}
-/*==========================================
- * Skill use event processing
- *------------------------------------------
- */
-int mobskill_event(struct mob_data *md,int flag)
-{
- nullpo_retr(0, md);
-
- if(flag==-1 && mobskill_use(md,gettick(),MSC_CASTTARGETED))
- return 1;
- if( (flag&BF_SHORT) && mobskill_use(md,gettick(),MSC_CLOSEDATTACKED))
- return 1;
- if( (flag&BF_LONG) && mobskill_use(md,gettick(),MSC_LONGRANGEATTACKED))
- return 1;
- return 0;
-}
-/*==========================================
- * Mob‚ªƒGƒ“ƒyƒŠƒEƒ€‚È‚Ç‚Ìꇂ̔»’è
- *------------------------------------------
- */
-int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl)
-{
- struct mob_data *md=NULL;
-
- nullpo_retr(0,sd);
- nullpo_retr(0,bl);
-
- if(bl->type==BL_MOB && (md=(struct mob_data *)bl) &&
- (md->class == 1288 || md->class == 1287 || md->class == 1286 || md->class == 1285))
- {
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
- struct guild *g=guild_search(sd->status.guild_id);
-
- if(g == NULL && md->class == 1288)
- return 0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(gc != NULL && !map[sd->bl.m].flag.gvg)
- return 0;//Ô“à‚ÅGv‚¶‚á‚È‚¢‚Æ‚«‚̓_ƒ[ƒW‚È‚µ
- else if(g && gc != NULL && g->guild_id == gc->guild_id)
- return 0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
- else if(g && guild_checkskill(g,GD_APPROVAL) <= 0 && md->class == 1288)
- return 0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
-
- }
-
- return 1;
-}
-/*==========================================
- * ƒXƒLƒ‹—pƒ^ƒCƒ}[íœ
- *------------------------------------------
- */
-int mobskill_deltimer(struct mob_data *md )
-{
- nullpo_retr(0, md);
-
- if( md->skilltimer!=-1 ){
- if( skill_get_inf( md->skillid )&2 )
- delete_timer( md->skilltimer, mobskill_castend_pos );
- else
- delete_timer( md->skilltimer, mobskill_castend_id );
- md->skilltimer=-1;
- }
- return 0;
-}
-//
-// ‰Šú‰»
-//
-/*==========================================
- * Since un-setting [ mob ] up was used, it is an initial provisional value setup.
- *------------------------------------------
- */
-static int mob_makedummymobdb(int class)
-{
- int i;
-
- sprintf(mob_db[class].name,"mob%d",class);
- sprintf(mob_db[class].jname,"mob%d",class);
- mob_db[class].lv=1;
- mob_db[class].max_hp=1000;
- mob_db[class].max_sp=1;
- mob_db[class].base_exp=2;
- mob_db[class].job_exp=1;
- mob_db[class].range=1;
- mob_db[class].atk1=7;
- mob_db[class].atk2=10;
- mob_db[class].def=0;
- mob_db[class].mdef=0;
- mob_db[class].str=1;
- mob_db[class].agi=1;
- mob_db[class].vit=1;
- mob_db[class].int_=1;
- mob_db[class].dex=6;
- mob_db[class].luk=2;
- mob_db[class].range2=10;
- mob_db[class].range3=10;
- mob_db[class].size=0;
- mob_db[class].race=0;
- mob_db[class].element=0;
- mob_db[class].mode=0;
- mob_db[class].speed=300;
- mob_db[class].adelay=1000;
- mob_db[class].amotion=500;
- mob_db[class].dmotion=500;
- mob_db[class].dropitem[0].nameid=909; // Jellopy
- mob_db[class].dropitem[0].p=1000;
- for(i=1;i<8;i++){
- mob_db[class].dropitem[i].nameid=0;
- mob_db[class].dropitem[i].p=0;
- }
- // Item1,Item2
- mob_db[class].mexp=0;
- mob_db[class].mexpper=0;
- for(i=0;i<3;i++){
- mob_db[class].mvpitem[i].nameid=0;
- mob_db[class].mvpitem[i].p=0;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class].summonper[i]=0;
- return 0;
-}
-
-/*==========================================
- * db/mob_db.txt reading
- *------------------------------------------
- */
-static int mob_readdb(void)
-{
- FILE *fp;
- char line[1024];
- char *filename[]={ "db/mob_db.txt","db/mob_db2.txt" };
- int i;
-
- memset(mob_db,0,sizeof(mob_db));
-
- for(i=0;i<2;i++){
-
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- return -1;
- }
- while(fgets(line,1020,fp)){
- int class,i;
- char *str[55],*p,*np;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- for(i=0,p=line;i<55;i++){
- if((np=strchr(p,','))!=NULL){
- str[i]=p;
- *np=0;
- p=np+1;
- } else
- str[i]=p;
- }
-
- class=atoi(str[0]);
- if(class<=1000 || class>2000)
- continue;
-
- mob_db[class].view_class=class;
- memcpy(mob_db[class].name,str[1],24);
- memcpy(mob_db[class].jname,str[2],24);
- mob_db[class].lv=atoi(str[3]);
- mob_db[class].max_hp=atoi(str[4]);
- mob_db[class].max_sp=atoi(str[5]);
-
- mob_db[class].base_exp=atoi(str[6]);
- if(mob_db[class].base_exp < 0)
- mob_db[class].base_exp = 0;
- else if(mob_db[class].base_exp > 0 && (mob_db[class].base_exp*battle_config.base_exp_rate/100 > 1000000000 ||
- mob_db[class].base_exp*battle_config.base_exp_rate/100 < 0))
- mob_db[class].base_exp=1000000000;
- else
- mob_db[class].base_exp*= battle_config.base_exp_rate/100;
-
- mob_db[class].job_exp=atoi(str[7]);
- if(mob_db[class].job_exp < 0)
- mob_db[class].job_exp = 0;
- else if(mob_db[class].job_exp > 0 && (mob_db[class].job_exp*battle_config.job_exp_rate/100 > 1000000000 ||
- mob_db[class].job_exp*battle_config.job_exp_rate/100 < 0))
- mob_db[class].job_exp=1000000000;
- else
- mob_db[class].job_exp*=battle_config.job_exp_rate/100;
-
- mob_db[class].range=atoi(str[8]);
- mob_db[class].atk1=atoi(str[9]);
- mob_db[class].atk2=atoi(str[10]);
- mob_db[class].def=atoi(str[11]);
- mob_db[class].mdef=atoi(str[12]);
- mob_db[class].str=atoi(str[13]);
- mob_db[class].agi=atoi(str[14]);
- mob_db[class].vit=atoi(str[15]);
- mob_db[class].int_=atoi(str[16]);
- mob_db[class].dex=atoi(str[17]);
- mob_db[class].luk=atoi(str[18]);
- mob_db[class].range2=atoi(str[19]);
- mob_db[class].range3=atoi(str[20]);
- mob_db[class].size=atoi(str[21]);
- mob_db[class].race=atoi(str[22]);
- mob_db[class].element=atoi(str[23]);
- mob_db[class].mode=atoi(str[24]);
- mob_db[class].speed=atoi(str[25]);
- mob_db[class].adelay=atoi(str[26]);
- mob_db[class].amotion=atoi(str[27]);
- mob_db[class].dmotion=atoi(str[28]);
-
- for(i=0;i<8;i++){
- int rate = 0,type,ratemin,ratemax;
- mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]);
- type = itemdb_type(mob_db[class].dropitem[i].nameid);
- if (type == 0) { // Added [Valaris]
- rate = battle_config.item_rate_heal;
- ratemin = battle_config.item_drop_heal_min;
- ratemax = battle_config.item_drop_heal_max;
- }
- else if (type == 2) {
- rate = battle_config.item_rate_use;
- ratemin = battle_config.item_drop_use_min;
- ratemax = battle_config.item_drop_use_max; // End
- }
- else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
- rate = battle_config.item_rate_equip;
- ratemin = battle_config.item_drop_equip_min;
- ratemax = battle_config.item_drop_equip_max;
- }
- else if (type == 6) {
- rate = battle_config.item_rate_card;
- ratemin = battle_config.item_drop_card_min;
- ratemax = battle_config.item_drop_card_max;
- }
- else {
- rate = battle_config.item_rate_common;
- ratemin = battle_config.item_drop_common_min;
- ratemax = battle_config.item_drop_common_max;
- }
- rate = (rate / 100) * atoi(str[30+i*2]);
- rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate;
- mob_db[class].dropitem[i].p = rate;
- }
- // Item1,Item2
- mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100;
- mob_db[class].mexpper=atoi(str[46]);
- for(i=0;i<3;i++){
- mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]);
- mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class].summonper[i]=0;
- mob_db[class].maxskill=0;
-
- mob_db[class].sex=0;
- mob_db[class].hair=0;
- mob_db[class].hair_color=0;
- mob_db[class].weapon=0;
- mob_db[class].shield=0;
- mob_db[class].head_top=0;
- mob_db[class].head_mid=0;
- mob_db[class].head_buttom=0;
- mob_db[class].clothes_color=0; //Add for player monster dye - Valaris
- }
- fclose(fp);
- printf("read %s done\n",filename[i]);
- }
- return 0;
-}
-
-/*==========================================
- * MOB display graphic change data reading
- *------------------------------------------
- */
-static int mob_readdb_mobavail(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0;
- int class,j,k;
- char *str[20],*p,*np;
-
- if( (fp=fopen("db/mob_avail.txt","r"))==NULL ){
- printf("can't read db/mob_avail.txt\n");
- return -1;
- }
-
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
-
- for(j=0,p=line;j<12;j++){
- if((np=strchr(p,','))!=NULL){
- str[j]=p;
- *np=0;
- p=np+1;
- } else
- str[j]=p;
- }
-
- if(str[0]==NULL)
- continue;
-
- class=atoi(str[0]);
-
- if(class<=1000 || class>2000) // ’l‚ªˆÙí‚Ȃ爗‚µ‚È‚¢B
- continue;
- k=atoi(str[1]);
- if(k >= 0)
- mob_db[class].view_class=k;
-
- if((mob_db[class].view_class < 24) || (mob_db[class].view_class > 4000)) {
- mob_db[class].sex=atoi(str[2]);
- mob_db[class].hair=atoi(str[3]);
- mob_db[class].hair_color=atoi(str[4]);
- mob_db[class].weapon=atoi(str[5]);
- mob_db[class].shield=atoi(str[6]);
- mob_db[class].head_top=atoi(str[7]);
- mob_db[class].head_mid=atoi(str[8]);
- mob_db[class].head_buttom=atoi(str[9]);
- mob_db[class].option=atoi(str[10])&~0x46;
- mob_db[class].clothes_color=atoi(str[11]); // Monster player dye option - Valaris
- }
-
- else if(atoi(str[2]) > 0) mob_db[class].equip=atoi(str[2]); // mob equipment [Valaris]
-
- ln++;
- }
- fclose(fp);
- printf("read db/mob_avail.txt done (count=%d)\n",ln);
- return 0;
-}
-
-/*==========================================
- * Reading of random monster data
- *------------------------------------------
- */
-static int mob_read_randommonster(void)
-{
- FILE *fp;
- char line[1024];
- char *str[10],*p;
- int i,j;
-
- const char* mobfile[] = {
- "db/mob_branch.txt",
- "db/mob_poring.txt",
- "db/mob_boss.txt" };
-
- for(i=0;i<MAX_RANDOMMONSTER;i++){
- mob_db[0].summonper[i] = 1002; // ݒ肵–Y‚ꂽꇂ̓|ƒŠƒ“‚ªo‚é‚悤‚É‚µ‚Ä‚¨‚­
- fp=fopen(mobfile[i],"r");
- if(fp==NULL){
- printf("can't read %s\n",mobfile[i]);
- return -1;
- }
- while(fgets(line,1020,fp)){
- int class,per;
- if(line[0] == '/' && line[1] == '/')
- continue;
- memset(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 || str[2]==NULL)
- continue;
-
- class = atoi(str[0]);
- per=atoi(str[2]);
- if((class>1000 && class<=2000) || class==0)
- mob_db[class].summonper[i]=per;
- }
- fclose(fp);
- printf("read %s done\n",mobfile[i]);
- }
- return 0;
-}
-/*==========================================
- * db/mob_skill_db.txt reading
- *------------------------------------------
- */
-static int mob_readskilldb(void)
-{
- FILE *fp;
- char line[1024];
- int i;
-
- const struct {
- char str[32];
- int id;
- } cond1[] = {
- { "always", MSC_ALWAYS },
- { "myhpltmaxrate", MSC_MYHPLTMAXRATE },
- { "friendhpltmaxrate",MSC_FRIENDHPLTMAXRATE },
- { "mystatuson", MSC_MYSTATUSON },
- { "mystatusoff", MSC_MYSTATUSOFF },
- { "friendstatuson", MSC_FRIENDSTATUSON },
- { "friendstatusoff", MSC_FRIENDSTATUSOFF },
- { "attackpcgt", MSC_ATTACKPCGT },
- { "attackpcge", MSC_ATTACKPCGE },
- { "slavelt", MSC_SLAVELT },
- { "slavele", MSC_SLAVELE },
- { "closedattacked", MSC_CLOSEDATTACKED },
- { "longrangeattacked",MSC_LONGRANGEATTACKED },
- { "skillused", MSC_SKILLUSED },
- { "casttargeted", MSC_CASTTARGETED },
- }, cond2[] ={
- { "anybad", -1 },
- { "stone", SC_STONE },
- { "freeze", SC_FREEZE },
- { "stan", SC_STAN },
- { "sleep", SC_SLEEP },
- { "poison", SC_POISON },
- { "curse", SC_CURSE },
- { "silence", SC_SILENCE },
- { "confusion", SC_CONFUSION },
- { "blind", SC_BLIND },
- { "hiding", SC_HIDING },
- { "sight", SC_SIGHT },
- }, state[] = {
- { "any", -1 },
- { "idle", MSS_IDLE },
- { "walk", MSS_WALK },
- { "attack", MSS_ATTACK },
- { "dead", MSS_DEAD },
- { "loot", MSS_LOOT },
- { "chase", MSS_CHASE },
- }, target[] = {
- { "target", MST_TARGET },
- { "self", MST_SELF },
- { "friend", MST_FRIEND },
- { "around5", MST_AROUND5 },
- { "around6", MST_AROUND6 },
- { "around7", MST_AROUND7 },
- { "around8", MST_AROUND8 },
- { "around1", MST_AROUND1 },
- { "around2", MST_AROUND2 },
- { "around3", MST_AROUND3 },
- { "around4", MST_AROUND4 },
- { "around", MST_AROUND },
- };
-
- int x;
- char *filename[]={ "db/mob_skill_db.txt","db/mob_skill_db2.txt" };
-
- for(x=0;x<2;x++){
-
- fp=fopen(filename[x],"r");
- if(fp==NULL){
- if(x==0)
- printf("can't read %s\n",filename[x]);
- continue;
- }
- while(fgets(line,1020,fp)){
- char *sp[20],*p;
- int mob_id;
- struct mob_skill *ms;
- int j=0;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- memset(sp,0,sizeof(sp));
- for(i=0,p=line;i<18 && p;i++){
- sp[i]=p;
- if((p=strchr(p,','))!=NULL)
- *p++=0;
- }
- if( (mob_id=atoi(sp[0]))<=0 )
- continue;
-
- if( strcmp(sp[1],"clear")==0 ){
- memset(mob_db[mob_id].skill,0,sizeof(mob_db[mob_id].skill));
- mob_db[mob_id].maxskill=0;
- continue;
- }
-
- for(i=0;i<MAX_MOBSKILL;i++)
- if( (ms=&mob_db[mob_id].skill[i])->skill_id == 0)
- break;
- if(i==MAX_MOBSKILL){
- printf("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n",
- sp[1],mob_id,mob_db[mob_id].jname);
- continue;
- }
-
- ms->state=atoi(sp[2]);
- for(j=0;j<sizeof(state)/sizeof(state[0]);j++){
- if( strcmp(sp[2],state[j].str)==0)
- ms->state=state[j].id;
- }
- ms->skill_id=atoi(sp[3]);
- ms->skill_lv=atoi(sp[4]);
- ms->permillage=atoi(sp[5]);
- ms->casttime=atoi(sp[6]);
- ms->delay=atoi(sp[7]);
- ms->cancel=atoi(sp[8]);
- if( strcmp(sp[8],"yes")==0 ) ms->cancel=1;
- ms->target=atoi(sp[9]);
- for(j=0;j<sizeof(target)/sizeof(target[0]);j++){
- if( strcmp(sp[9],target[j].str)==0)
- ms->target=target[j].id;
- }
- ms->cond1=-1;
- for(j=0;j<sizeof(cond1)/sizeof(cond1[0]);j++){
- if( strcmp(sp[10],cond1[j].str)==0)
- ms->cond1=cond1[j].id;
- }
- ms->cond2=atoi(sp[11]);
- for(j=0;j<sizeof(cond2)/sizeof(cond2[0]);j++){
- if( strcmp(sp[11],cond2[j].str)==0)
- ms->cond2=cond2[j].id;
- }
- ms->val[0]=atoi(sp[12]);
- ms->val[1]=atoi(sp[13]);
- ms->val[2]=atoi(sp[14]);
- ms->val[3]=atoi(sp[15]);
- ms->val[4]=atoi(sp[16]);
- if(sp[17] != NULL && strlen(sp[17])>2)
- ms->emotion=atoi(sp[17]);
- else
- ms->emotion=-1;
- mob_db[mob_id].maxskill=i+1;
- }
- fclose(fp);
- printf("read %s done\n",filename[x]);
- }
- return 0;
-}
-
-void mob_reload(void)
-{
- /*
-
- <empty monster database>
- mob_read();
-
- */
-
- do_init_mob();
-}
-
-#ifndef TXT_ONLY
-/*==========================================
- * SQL reading
- *------------------------------------------
- */
-static int mob_read_sqldb(void)
-{
- char line[1024];
- int i,class,ln=0;
- char *str[55],*p,*np;
-
- memset(mob_db,0,sizeof(mob_db));
-
- sprintf (tmp_sql, "SELECT * FROM `%s`",mob_db_db);
- if(mysql_query(&mmysql_handle, tmp_sql) ) {
- printf("DB server Error (select %s to Memory)- %s\n",mob_db_db,mysql_error(&mmysql_handle) );
- }
- sql_res = mysql_store_result(&mmysql_handle);
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))){
- sprintf(line,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
- sql_row[0],sql_row[1],sql_row[2],sql_row[3],sql_row[4],
- sql_row[5],sql_row[6],sql_row[7],sql_row[8],sql_row[9],
- sql_row[10],sql_row[11],sql_row[12],sql_row[13],sql_row[14],
- sql_row[15],sql_row[16],sql_row[17],sql_row[18],sql_row[19],
- sql_row[20],sql_row[21],sql_row[22],sql_row[23],sql_row[24],
- sql_row[25],sql_row[26],sql_row[27],sql_row[28],sql_row[29],
- sql_row[30],sql_row[31],sql_row[32],sql_row[33],sql_row[34],
- sql_row[35],sql_row[36],sql_row[37],sql_row[38],sql_row[39],
- sql_row[40],sql_row[41],sql_row[42],sql_row[43],sql_row[44],
- sql_row[45],sql_row[46],sql_row[47],sql_row[48],sql_row[49],
- sql_row[50],sql_row[51],sql_row[52]);
-
- for(i=0,p=line;i<55;i++){
- if((np=strchr(p,','))!=NULL){
- str[i]=p;
- *np=0;
- p=np+1;
- } else
- str[i]=p;
- }
-
- class=atoi(str[0]);
- if(class<=1000 || class>2000)
- continue;
-
- ln++;
-
- mob_db[class].view_class=class;
- memcpy(mob_db[class].name,str[1],24);
- memcpy(mob_db[class].jname,str[2],24);
- mob_db[class].lv=atoi(str[3]);
- mob_db[class].max_hp=atoi(str[4]);
- mob_db[class].max_sp=atoi(str[5]);
- mob_db[class].base_exp=atoi(str[6])*
- battle_config.base_exp_rate/100;
- if(mob_db[class].base_exp <= 0)
- mob_db[class].base_exp = 1;
- mob_db[class].job_exp=atoi(str[7])*
- battle_config.job_exp_rate/100;
- if(mob_db[class].job_exp <= 0)
- mob_db[class].job_exp = 1;
- mob_db[class].range=atoi(str[8]);
- mob_db[class].atk1=atoi(str[9]);
- mob_db[class].atk2=atoi(str[10]);
- mob_db[class].def=atoi(str[11]);
- mob_db[class].mdef=atoi(str[12]);
- mob_db[class].str=atoi(str[13]);
- mob_db[class].agi=atoi(str[14]);
- mob_db[class].vit=atoi(str[15]);
- mob_db[class].int_=atoi(str[16]);
- mob_db[class].dex=atoi(str[17]);
- mob_db[class].luk=atoi(str[18]);
- mob_db[class].range2=atoi(str[19]);
- mob_db[class].range3=atoi(str[20]);
- mob_db[class].size=atoi(str[21]);
- mob_db[class].race=atoi(str[22]);
- mob_db[class].element=atoi(str[23]);
- mob_db[class].mode=atoi(str[24]);
- mob_db[class].speed=atoi(str[25]);
- mob_db[class].adelay=atoi(str[26]);
- mob_db[class].amotion=atoi(str[27]);
- mob_db[class].dmotion=atoi(str[28]);
-
- for(i=0;i<8;i++){
- int rate = 0,type,ratemin,ratemax;
- mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]);
- type = itemdb_type(mob_db[class].dropitem[i].nameid);
- if (type == 0) { // Added by Valaris
- rate = battle_config.item_rate_heal;
- ratemin = battle_config.item_drop_heal_min;
- ratemax = battle_config.item_drop_heal_max;
- }
- else if (type == 2) {
- rate = battle_config.item_rate_use;
- ratemin = battle_config.item_drop_use_min;
- ratemax = battle_config.item_drop_use_max; // End
- }
- else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
- rate = battle_config.item_rate_equip;
- ratemin = battle_config.item_drop_equip_min;
- ratemax = battle_config.item_drop_equip_max;
- }
- else if (type == 6) {
- rate = battle_config.item_rate_card;
- ratemin = battle_config.item_drop_card_min;
- ratemax = battle_config.item_drop_card_max;
- }
- else {
- rate = battle_config.item_rate_common;
- ratemin = battle_config.item_drop_common_min;
- ratemax = battle_config.item_drop_common_max;
- }
- rate = (rate / 100) * atoi(str[30+i*2]);
- rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate;
- mob_db[class].dropitem[i].p = rate;
- }
-
- mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100;
- mob_db[class].mexpper=atoi(str[46]);
- for(i=0;i<3;i++){
- mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]);
- mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100;
- }
- for(i=0;i<MAX_RANDOMMONSTER;i++)
- mob_db[class].summonper[i]=0;
- mob_db[class].maxskill=0;
-
- mob_db[class].sex=0;
- mob_db[class].hair=0;
- mob_db[class].hair_color=0;
- mob_db[class].weapon=0;
- mob_db[class].shield=0;
- mob_db[class].head_top=0;
- mob_db[class].head_mid=0;
- mob_db[class].head_buttom=0;
- }
- mysql_free_result(sql_res);
- printf("read %s done (count=%d)\n",mob_db_db,ln);
- }
- return 0;
-}
-
-#endif /* not TXT_ONLY */
-/*==========================================
- * Circumference initialization of mob
- *------------------------------------------
- */
-int do_init_mob(void)
-{
-#ifndef TXT_ONLY
- if(db_use_sqldbs)
- mob_read_sqldb();
- else
-#endif /* TXT_ONLY */
- mob_readdb();
-
- mob_readdb_mobavail();
- mob_read_randommonster();
- mob_readskilldb();
-
- add_timer_func_list(mob_timer,"mob_timer");
- add_timer_func_list(mob_delayspawn,"mob_delayspawn");
- add_timer_func_list(mob_delay_item_drop,"mob_delay_item_drop");
- add_timer_func_list(mob_delay_item_drop2,"mob_delay_item_drop2");
- add_timer_func_list(mob_ai_hard,"mob_ai_hard");
- add_timer_func_list(mob_ai_lazy,"mob_ai_lazy");
- add_timer_func_list(mobskill_castend_id,"mobskill_castend_id");
- add_timer_func_list(mobskill_castend_pos,"mobskill_castend_pos");
- add_timer_func_list(mob_timer_delete,"mob_timer_delete");
- add_timer_interval(gettick()+MIN_MOBTHINKTIME,mob_ai_hard,0,0,MIN_MOBTHINKTIME);
- add_timer_interval(gettick()+MIN_MOBTHINKTIME*10,mob_ai_lazy,0,0,MIN_MOBTHINKTIME*10);
-
- return 0;
-}
+// $Id: mob.c,v 1.7 2004/09/25 05:32:18 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "timer.h"
+#include "socket.h"
+#include "db.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "map.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "mob.h"
+#include "guild.h"
+#include "itemdb.h"
+#include "skill.h"
+#include "battle.h"
+#include "party.h"
+#include "npc.h"
+#include "log.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define MIN_MOBTHINKTIME 100
+
+#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute)
+#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute)
+
+struct mob_db mob_db[2001];
+
+/*==========================================
+ * Local prototype declaration (only required thing)
+ *------------------------------------------
+ */
+static int distance(int,int,int,int);
+static int mob_makedummymobdb(int);
+static int mob_timer(int,unsigned int,int,int);
+int mobskill_use(struct mob_data *md,unsigned int tick,int event);
+int mobskill_deltimer(struct mob_data *md );
+int mob_skillid2skillidx(int class,int skillid);
+int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx);
+static int mob_unlocktarget(struct mob_data *md,int tick);
+
+/*==========================================
+ * Mob is searched with a name.
+ *------------------------------------------
+ */
+int mobdb_searchname(const char *str)
+{
+ int i;
+
+ for(i=0;i<sizeof(mob_db)/sizeof(mob_db[0]);i++){
+ if( strcmpi(mob_db[i].name,str)==0 || strcmp(mob_db[i].jname,str)==0 ||
+ memcmp(mob_db[i].name,str,24)==0 || memcmp(mob_db[i].jname,str,24)==0)
+ return i;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Id Mob is checked.
+ *------------------------------------------
+ */
+int mobdb_checkid(const int id)
+{
+ if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0')
+ return 0;
+
+ return id;
+}
+
+/*==========================================
+ * The minimum data set for MOB spawning
+ *------------------------------------------
+ */
+int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class)
+{
+ nullpo_retr(0, md);
+
+ md->bl.prev=NULL;
+ md->bl.next=NULL;
+ if(strcmp(mobname,"--en--")==0)
+ memcpy(md->name,mob_db[class].name,24);
+ else if(strcmp(mobname,"--ja--")==0)
+ memcpy(md->name,mob_db[class].jname,24);
+ else
+ memcpy(md->name,mobname,24);
+
+ md->n = 0;
+ md->base_class = md->class = class;
+ md->bl.id= npc_get_new_npc_id();
+
+ memset(&md->state,0,sizeof(md->state));
+ md->timer = -1;
+ md->target_id=0;
+ md->attacked_id=0;
+ md->speed=mob_db[class].speed;
+
+ return 0;
+}
+
+
+/*==========================================
+ * The MOB appearance for one time (for scripts)
+ *------------------------------------------
+ */
+int mob_once_spawn(struct map_session_data *sd,char *mapname,
+ int x,int y,const char *mobname,int class,int amount,const char *event)
+{
+ struct mob_data *md=NULL;
+ int m,count,lv=255,r=class;
+
+ if( sd )
+ lv=sd->status.base_level;
+
+ if( sd && strcmp(mapname,"this")==0)
+ m=sd->bl.m;
+ else
+ m=map_mapname2mapid(mapname);
+
+ if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
+ return 0;
+
+ if(class<0){ // ƒ‰ƒ“ƒ_ƒ€‚É¢Š«
+ int i=0;
+ int j=-class-1;
+ int k;
+ if(j>=0 && j<MAX_RANDOMMONSTER){
+ do{
+ class=rand()%1000+1001;
+ k=rand()%1000000;
+ }while((mob_db[class].max_hp <= 0 || mob_db[class].summonper[j] <= k ||
+ (lv<mob_db[class].lv && battle_config.random_monster_checklv)) && (i++) < 2000);
+ if(i>=2000){
+ class=mob_db[0].summonper[j];
+ }
+ }else{
+ return 0;
+ }
+// if(battle_config.etc_log)
+// printf("mobclass=%d try=%d\n",class,i);
+ }
+ if(sd){
+ if(x<=0) x=sd->bl.x;
+ if(y<=0) y=sd->bl.y;
+ }else if(x<=0 || y<=0){
+ printf("mob_once_spawn: ??\n");
+ }
+
+ for(count=0;count<amount;count++){
+ md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
+ memset(md, '\0', sizeof *md);
+ if(mob_db[class].mode&0x02)
+ md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
+ else
+ md->lootitem=NULL;
+
+ mob_spawn_dataset(md,mobname,class);
+ md->bl.m=m;
+ md->bl.x=x;
+ md->bl.y=y;
+ if(r<0&&battle_config.dead_branch_active) md->mode=0x1+0x4+0x80; //ˆÚ“®‚µ‚ăAƒNƒeƒBƒu‚Å”½Œ‚‚·‚é
+ md->m =m;
+ md->x0=x;
+ md->y0=y;
+ md->xs=0;
+ md->ys=0;
+ md->spawndelay1=-1; // ˆê“x‚̂݃tƒ‰ƒO
+ md->spawndelay2=-1; // ˆê“x‚̂݃tƒ‰ƒO
+
+ memcpy(md->npc_event,event,sizeof(md->npc_event));
+
+ md->bl.type=BL_MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
+
+ if(class==1288) { // emperium hp based on defense level [Valaris]
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc) {
+ mob_db[class].max_hp+=2000*gc->defense;
+ md->hp=mob_db[class].max_hp;
+ }
+ } // end addition [Valaris]
+
+
+ }
+ return (amount>0)?md->bl.id:0;
+}
+/*==========================================
+ * The MOB appearance for one time (& area specification for scripts)
+ *------------------------------------------
+ */
+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 x,y,i,c,max,lx=-1,ly=-1,id=0;
+ int m;
+
+ if(strcmp(mapname,"this")==0)
+ m=sd->bl.m;
+ else
+ m=map_mapname2mapid(mapname);
+
+ max=(y1-y0+1)*(x1-x0+1)*3;
+ if(max>1000)max=1000;
+
+ if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
+ return 0;
+
+ for(i=0;i<amount;i++){
+ int j=0;
+ do{
+ x=rand()%(x1-x0+1)+x0;
+ y=rand()%(y1-y0+1)+y0;
+ }while( ( (c=map_getcell(m,x,y))==1 || c==5)&& (++j)<max );
+ if(j>=max){
+ if(lx>=0){ // ŒŸõ‚ÉŽ¸”s‚µ‚½‚̂ňȑO‚É•¦‚¢‚½êŠ‚ðŽg‚¤
+ x=lx;
+ y=ly;
+ }else
+ return 0; // ʼn‚É•¦‚­êŠ‚ÌŒŸõ‚ðŽ¸”s‚µ‚½‚Ì‚Å‚â‚ß‚é
+ }
+ id=mob_once_spawn(sd,mapname,x,y,mobname,class,1,event);
+ lx=x;
+ ly=y;
+ }
+ return id;
+}
+
+/*==========================================
+ * Summoning Guardians [Valaris]
+ *------------------------------------------
+ */
+int mob_spawn_guardian(struct map_session_data *sd,char *mapname,
+ int x,int y,const char *mobname,int class,int amount,const char *event,int guardian)
+{
+ struct mob_data *md=NULL;
+ int m,count=1,lv=255;
+
+ if( sd )
+ lv=sd->status.base_level;
+
+ if( sd && strcmp(mapname,"this")==0)
+ m=sd->bl.m;
+ else
+ m=map_mapname2mapid(mapname);
+
+ if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
+ return 0;
+
+ if(class<0)
+ return 0;
+
+ if(sd){
+ if(x<=0) x=sd->bl.x;
+ if(y<=0) y=sd->bl.y;
+ }
+
+ else if(x<=0 || y<=0)
+ printf("mob_spawn_guardian: ??\n");
+
+
+ for(count=0;count<amount;count++){
+ struct guild_castle *gc;
+ md=calloc(sizeof(struct mob_data), 1);
+ if(md==NULL){
+ printf("mob_spawn_guardian: out of memory !\n");
+ exit(1);
+ }
+ memset(md, '\0', sizeof *md);
+
+
+
+ mob_spawn_dataset(md,mobname,class);
+ md->bl.m=m;
+ md->bl.x=x;
+ md->bl.y=y;
+ md->m =m;
+ md->x0=x;
+ md->y0=y;
+ md->xs=0;
+ md->ys=0;
+ md->spawndelay1=-1; // Only once is a flag.
+ md->spawndelay2=-1; // Only once is a flag.
+
+ memcpy(md->npc_event,event,sizeof(md->npc_event));
+
+ md->bl.type=BL_MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
+
+ gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc) {
+ mob_db[class].max_hp+=2000*gc->defense;
+ if(guardian==0) { md->hp=gc->Ghp0; gc->GID0=md->bl.id; }
+ if(guardian==1) { md->hp=gc->Ghp1; gc->GID1=md->bl.id; }
+ if(guardian==2) { md->hp=gc->Ghp2; gc->GID2=md->bl.id; }
+ if(guardian==3) { md->hp=gc->Ghp3; gc->GID3=md->bl.id; }
+ if(guardian==4) { md->hp=gc->Ghp4; gc->GID4=md->bl.id; }
+ if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; }
+ if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; }
+ if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; }
+
+ }
+ }
+
+ return (amount>0)?md->bl.id:0;
+}
+
+/*==========================================
+ * The disregard ID is added to mob.
+ *------------------------------------------
+ */
+int mob_exclusion_add(struct mob_data *md,int type,int id)
+{
+ nullpo_retr(0, md);
+
+ if(type==1)
+ md->exclusion_src=id;
+ if(type==2)
+ md->exclusion_party=id;
+ if(type==3)
+ md->exclusion_guild=id;
+
+ return 0;
+}
+
+/*==========================================
+ * The disregard ID of mob is checked. (TAGE?)
+ *------------------------------------------
+ */
+int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+ nullpo_retr(0, md);
+
+ if(sd->bl.type==BL_PC){
+ if(md->exclusion_src && md->exclusion_src==sd->bl.id)
+ return 1;
+ if(md->exclusion_party && md->exclusion_party==sd->status.party_id)
+ return 2;
+ if(md->exclusion_guild && md->exclusion_guild==sd->status.guild_id)
+ return 3;
+ }
+ return 0;
+}
+
+/*==========================================
+ * Appearance income of mob
+ *------------------------------------------
+ */
+int mob_get_viewclass(int class)
+{
+ return mob_db[class].view_class;
+}
+int mob_get_sex(int class)
+{
+ return mob_db[class].sex;
+}
+short mob_get_hair(int class)
+{
+ return mob_db[class].hair;
+}
+short mob_get_hair_color(int class)
+{
+ return mob_db[class].hair_color;
+}
+short mob_get_weapon(int class)
+{
+ return mob_db[class].weapon;
+}
+short mob_get_shield(int class)
+{
+ return mob_db[class].shield;
+}
+short mob_get_head_top(int class)
+{
+ return mob_db[class].head_top;
+}
+short mob_get_head_mid(int class)
+{
+ return mob_db[class].head_mid;
+}
+short mob_get_head_buttom(int class)
+{
+ return mob_db[class].head_buttom;
+}
+short mob_get_clothes_color(int class) // Add for player monster dye - Valaris
+{
+ return mob_db[class].clothes_color; // End
+}
+int mob_get_equip(int class) // mob equip [Valaris]
+{
+ return mob_db[class].equip;
+}
+/*==========================================
+ * Is MOB in the state in which the present movement is possible or not?
+ *------------------------------------------
+ */
+int mob_can_move(struct mob_data *md)
+{
+ nullpo_retr(0, md);
+
+ if(md->canmove_tick > gettick() || (md->opt1 > 0 && md->opt1 != 6) || md->option&2)
+ return 0;
+ // ƒAƒ“ƒNƒ‹’†‚Å“®‚¯‚È‚¢‚Æ‚©
+ if( md->sc_data[SC_ANKLE].timer != -1 || //ƒAƒ“ƒNƒ‹ƒXƒlƒA
+ md->sc_data[SC_AUTOCOUNTER].timer != -1 || //ƒI[ƒgƒJƒEƒ“ƒ^[
+ md->sc_data[SC_BLADESTOP].timer != -1 || //”’nŽæ‚è
+ md->sc_data[SC_SPIDERWEB].timer != -1 //ƒXƒpƒCƒ_[ƒEƒFƒbƒu
+ )
+ return 0;
+
+ return 1;
+}
+
+/*==========================================
+ * Time calculation concerning one step next to mob
+ *------------------------------------------
+ */
+static int calc_next_walk_step(struct mob_data *md)
+{
+ nullpo_retr(0, md);
+
+ if(md->walkpath.path_pos>=md->walkpath.path_len)
+ return -1;
+ if(md->walkpath.path[md->walkpath.path_pos]&1)
+ return battle_get_speed(&md->bl)*14/10;
+ return battle_get_speed(&md->bl);
+}
+
+static int mob_walktoxy_sub(struct mob_data *md);
+
+/*==========================================
+ * Mob Walk processing
+ *------------------------------------------
+ */
+static int mob_walk(struct mob_data *md,unsigned int tick,int data)
+{
+ int moveblock;
+ int i,ctype;
+ static int dirx[8]={0,-1,-1,-1,0,1,1,1};
+ static int diry[8]={1,1,0,-1,-1,-1,0,1};
+ int x,y,dx,dy;
+
+ nullpo_retr(0, md);
+
+ md->state.state=MS_IDLE;
+ if(md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_pos!=data)
+ return 0;
+
+ md->walkpath.path_half ^= 1;
+ if(md->walkpath.path_half==0){
+ md->walkpath.path_pos++;
+ if(md->state.change_walk_target){
+ mob_walktoxy_sub(md);
+ return 0;
+ }
+ }
+ else {
+ if(md->walkpath.path[md->walkpath.path_pos]>=8)
+ return 1;
+
+ x = md->bl.x;
+ y = md->bl.y;
+ ctype = map_getcell(md->bl.m,x,y);
+ if(ctype == 1 || ctype == 5) {
+ mob_stop_walking(md,1);
+ return 0;
+ }
+ md->dir=md->walkpath.path[md->walkpath.path_pos];
+ dx = dirx[md->dir];
+ dy = diry[md->dir];
+
+ ctype = map_getcell(md->bl.m,x+dx,y+dy);
+ if(ctype == 1 || ctype == 5) {
+ mob_walktoxy_sub(md);
+ return 0;
+ }
+
+ moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
+
+ md->state.state=MS_WALK;
+ map_foreachinmovearea(clif_moboutsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
+
+ x += dx;
+ y += dy;
+ if(md->min_chase>13)
+ md->min_chase--;
+
+ if(moveblock) map_delblock(&md->bl);
+ md->bl.x = x;
+ md->bl.y = y;
+ if(moveblock) map_addblock(&md->bl);
+
+ map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md);
+ md->state.state=MS_IDLE;
+
+ if(md->option&4)
+ skill_check_cloaking(&md->bl);
+
+ skill_unit_move(&md->bl,tick,1); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
+ }
+ if((i=calc_next_walk_step(md))>0){
+ i = i>>1;
+ if(i < 1 && md->walkpath.path_half == 0)
+ i = 1;
+ md->timer=add_timer(tick+i,mob_timer,md->bl.id,md->walkpath.path_pos);
+ md->state.state=MS_WALK;
+
+ if(md->walkpath.path_pos>=md->walkpath.path_len)
+ clif_fixmobpos(md); // ‚Æ‚Ü‚Á‚½‚Æ‚«‚Ɉʒu‚ÌÄ‘—M
+ }
+ return 0;
+}
+
+/*==========================================
+ * Attack processing of mob
+ *------------------------------------------
+ */
+static int mob_attack(struct mob_data *md,unsigned int tick,int data)
+{
+ struct block_list *tbl=NULL;
+ struct map_session_data *tsd=NULL;
+ struct mob_data *tmd=NULL;
+
+ int mode,race,range;
+
+ nullpo_retr(0, md);
+
+ md->min_chase=13;
+ md->state.state=MS_IDLE;
+ md->state.skillstate=MSS_IDLE;
+
+ if( md->skilltimer!=-1 ) // ƒXƒLƒ‹Žg—p’†
+ return 0;
+
+ if(md->opt1>0 || md->option&2)
+ return 0;
+
+ if(md->sc_data[SC_AUTOCOUNTER].timer != -1)
+ return 0;
+
+ if(md->sc_data[SC_BLADESTOP].timer != -1)
+ return 0;
+
+ if((tbl=map_id2bl(md->target_id))==NULL){
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ return 0;
+ }
+
+ if(tbl->type==BL_PC)
+ tsd=(struct map_session_data *)tbl;
+ else if(tbl->type==BL_MOB)
+ tmd=(struct mob_data *)tbl;
+ else
+ return 0;
+
+ if(tsd){
+ if( pc_isdead(tsd) || tsd->invincible_timer != -1 || pc_isinvisible(tsd) || md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13 ){
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ return 0;
+ }
+ }
+ if(tmd){
+ if(md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13){
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ return 0;
+ }
+ }
+
+
+ if(!md->mode)
+ mode=mob_db[md->class].mode;
+ else
+ mode=md->mode;
+
+ race=mob_db[md->class].race;
+ if(!(mode&0x80)){
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ return 0;
+ }
+ if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 ||
+ ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6) ) ) {
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ return 0;
+ }
+
+ range = mob_db[md->class].range;
+ if(mode&1)
+ range++;
+ if(distance(md->bl.x,md->bl.y,tbl->x,tbl->y) > range)
+ return 0;
+ if(battle_config.monster_attack_direction_change)
+ md->dir=map_calc_dir(&md->bl, tbl->x,tbl->y ); // Œü‚«Ý’è
+
+ //clif_fixmobpos(md);
+
+ md->state.skillstate=MSS_ATTACK;
+ if( mobskill_use(md,tick,-2) ) // ƒXƒLƒ‹Žg—p
+ return 0;
+
+ md->target_lv = battle_weapon_attack(&md->bl,tbl,tick,0);
+
+ if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
+ skill_status_change_end(&md->bl,SC_CLOAKING,-1);
+
+ md->attackabletime = tick + battle_get_adelay(&md->bl);
+
+ md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
+ md->state.state=MS_ATTACK;
+
+ return 0;
+}
+
+
+/*==========================================
+ * The attack of PC which is attacking id is stopped.
+ * The callback function of clif_foreachclient
+ *------------------------------------------
+ */
+int mob_stopattacked(struct map_session_data *sd,va_list ap)
+{
+ int id;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, ap);
+
+ id=va_arg(ap,int);
+ if(sd->attacktarget==id)
+ pc_stopattack(sd);
+ return 0;
+}
+/*==========================================
+ * The timer in which the mob's states changes
+ *------------------------------------------
+ */
+int mob_changestate(struct mob_data *md,int state,int type)
+{
+ unsigned int tick;
+ int i;
+
+ nullpo_retr(0, md);
+
+ if(md->timer != -1)
+ delete_timer(md->timer,mob_timer);
+ md->timer=-1;
+ md->state.state=state;
+
+ switch(state){
+ case MS_WALK:
+ if((i=calc_next_walk_step(md))>0){
+ i = i>>2;
+ md->timer=add_timer(gettick()+i,mob_timer,md->bl.id,0);
+ }
+ else
+ md->state.state=MS_IDLE;
+ break;
+ case MS_ATTACK:
+ tick = gettick();
+ i=DIFF_TICK(md->attackabletime,tick);
+ if(i>0 && i<2000)
+ md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
+ else if(type) {
+ md->attackabletime = tick + battle_get_amotion(&md->bl);
+ md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
+ }
+ else {
+ md->attackabletime = tick + 1;
+ md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0);
+ }
+ break;
+ case MS_DELAY:
+ md->timer=add_timer(gettick()+type,mob_timer,md->bl.id,0);
+ break;
+ case MS_DEAD:
+ skill_castcancel(&md->bl,0);
+// mobskill_deltimer(md);
+ md->state.skillstate=MSS_DEAD;
+ md->last_deadtime=gettick();
+ // Since it died, all aggressors' attack to this mob is stopped.
+ clif_foreachclient(mob_stopattacked,md->bl.id);
+ skill_unit_out_all(&md->bl,gettick(),1);
+ skill_status_change_clear(&md->bl,2); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
+ skill_clear_unitgroup(&md->bl); // ‘S‚ẴXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹[ƒv‚ð휂·‚é
+ skill_cleartimerskill(&md->bl);
+ if(md->deletetimer!=-1)
+ delete_timer(md->deletetimer,mob_timer_delete);
+ md->deletetimer=-1;
+ md->hp=md->target_id=md->attacked_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * timer processing of mob (timer function)
+ * It branches to a walk and an attack.
+ *------------------------------------------
+ */
+static int mob_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct mob_data *md;
+ struct block_list *bl;
+
+ if( (bl=map_id2bl(id)) == NULL ){ //UŒ‚‚µ‚Ä‚«‚½“G‚ª‚à‚¤‚¢‚È‚¢‚̂ͳí‚̂悤‚¾
+ return 1;
+ }
+
+ if(!bl || !bl->type || bl->type!=BL_MOB)
+ return 1;
+
+ nullpo_retr(1, md=(struct mob_data*)bl);
+
+ if(md->bl.type!=BL_MOB)
+ return 1;
+
+ if(md->timer != tid){
+ if(battle_config.error_log)
+ printf("mob_timer %d != %d\n",md->timer,tid);
+ return 0;
+ }
+ md->timer=-1;
+ if(md->bl.prev == NULL || md->state.state == MS_DEAD)
+ return 1;
+
+ map_freeblock_lock();
+ switch(md->state.state){
+ case MS_WALK:
+ mob_walk(md,tick,data);
+ break;
+ case MS_ATTACK:
+ mob_attack(md,tick,data);
+ break;
+ case MS_DELAY:
+ mob_changestate(md,MS_IDLE,0);
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("mob_timer : %d ?\n",md->state.state);
+ break;
+ }
+ map_freeblock_unlock();
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int mob_walktoxy_sub(struct mob_data *md)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, md);
+
+ if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,md->to_x,md->to_y,md->state.walk_easy))
+ return 1;
+ memcpy(&md->walkpath,&wpd,sizeof(wpd));
+
+ md->state.change_walk_target=0;
+ mob_changestate(md,MS_WALK,0);
+ clif_movemob(md);
+
+ return 0;
+}
+
+/*==========================================
+ * mob move start
+ *------------------------------------------
+ */
+int mob_walktoxy(struct mob_data *md,int x,int y,int easy)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, md);
+
+ if(md->state.state == MS_WALK && path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,x,y,easy) )
+ return 1;
+
+ md->state.walk_easy = easy;
+ md->to_x=x;
+ md->to_y=y;
+ if(md->state.state == MS_WALK)
+ md->state.change_walk_target=1;
+ else
+ return mob_walktoxy_sub(md);
+
+ return 0;
+}
+
+/*==========================================
+ * mob spawn with delay (timer function)
+ *------------------------------------------
+ */
+static int mob_delayspawn(int tid,unsigned int tick,int m,int n)
+{
+ mob_spawn(m);
+ return 0;
+}
+
+/*==========================================
+ * spawn timing calculation
+ *------------------------------------------
+ */
+int mob_setdelayspawn(int id)
+{
+ unsigned int spawntime,spawntime1,spawntime2,spawntime3;
+ struct mob_data *md;
+ struct block_list *bl;
+
+ if((bl=map_id2bl(id)) == NULL)
+ return -1;
+
+ if(!bl || !bl->type || bl->type!=BL_MOB)
+ return -1;
+
+ nullpo_retr(-1, md=(struct mob_data*)bl);
+
+ if(!md || md->bl.type!=BL_MOB)
+ return -1;
+
+ // Processing of MOB which is not revitalized
+ if(md->spawndelay1==-1 && md->spawndelay2==-1 && md->n==0){
+ map_deliddb(&md->bl);
+ if(md->lootitem) {
+ map_freeblock(md->lootitem);
+ md->lootitem=NULL;
+ }
+ map_freeblock(md); // Instead of [ of free ]
+ return 0;
+ }
+
+ spawntime1=md->last_spawntime+md->spawndelay1;
+ spawntime2=md->last_deadtime+md->spawndelay2;
+ spawntime3=gettick()+5000;
+ // spawntime = max(spawntime1,spawntime2,spawntime3);
+ if(DIFF_TICK(spawntime1,spawntime2)>0)
+ spawntime=spawntime1;
+ else
+ spawntime=spawntime2;
+
+ if(DIFF_TICK(spawntime3,spawntime)>0)
+ spawntime=spawntime3;
+
+ add_timer(spawntime,mob_delayspawn,id,0);
+ return 0;
+}
+
+/*==========================================
+ * Mob spawning. Initialization is also variously here.
+ *------------------------------------------
+ */
+int mob_spawn(int id)
+{
+ int x=0,y=0,i=0,c;
+ unsigned int tick = gettick();
+ struct mob_data *md;
+ struct block_list *bl;
+
+ nullpo_retr(-1, bl=map_id2bl(id));
+
+ if(!bl || !bl->type || bl->type!=BL_MOB)
+ return -1;
+
+ nullpo_retr(-1, md=(struct mob_data*)bl);
+
+ if(!md || !md->bl.type || md->bl.type!=BL_MOB)
+ return -1;
+
+ md->last_spawntime=tick;
+ if( md->bl.prev!=NULL ){
+// clif_clearchar_area(&md->bl,3);
+ skill_unit_out_all(&md->bl,gettick(),1);
+ map_delblock(&md->bl);
+ }
+ else
+ md->class = md->base_class;
+
+ md->bl.m =md->m;
+ do {
+ if(md->x0==0 && md->y0==0){
+ x=rand()%(map[md->bl.m].xs-2)+1;
+ y=rand()%(map[md->bl.m].ys-2)+1;
+ } else {
+ x=md->x0+rand()%(md->xs+1)-md->xs/2;
+ y=md->y0+rand()%(md->ys+1)-md->ys/2;
+ }
+ i++;
+ } while(((c=map_getcell(md->bl.m,x,y))==1 || c==5) && i<50);
+
+ if(i>=50){
+// if(battle_config.error_log==1)
+// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name);
+ add_timer(tick+5000,mob_delayspawn,id,0);
+ return 1;
+ }
+
+ md->to_x=md->bl.x=x;
+ md->to_y=md->bl.y=y;
+ md->dir=0;
+
+ map_addblock(&md->bl);
+
+ memset(&md->state,0,sizeof(md->state));
+ md->attacked_id = 0;
+ md->target_id = 0;
+ md->move_fail_count = 0;
+
+ if(!md->speed)
+ md->speed = mob_db[md->class].speed;
+ md->def_ele = mob_db[md->class].element;
+ md->master_id=0;
+ md->master_dist=0;
+
+ md->state.state = MS_IDLE;
+ md->state.skillstate = MSS_IDLE;
+ md->timer = -1;
+ md->last_thinktime = tick;
+ md->next_walktime = tick+rand()%50+5000;
+ md->attackabletime = tick;
+ md->canmove_tick = tick;
+
+ md->guild_id = 0;
+ if (md->class >= 1285 && md->class <= 1288) {
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc)
+ md->guild_id = gc->guild_id;
+ }
+
+ md->sg_count=0;
+ md->deletetimer=-1;
+
+ md->skilltimer=-1;
+ for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
+ md->skilldelay[i] = c;
+ md->skillid=0;
+ md->skilllv=0;
+
+ memset(md->dmglog,0,sizeof(md->dmglog));
+ if(md->lootitem)
+ memset(md->lootitem,0,sizeof(md->lootitem));
+ md->lootitem_count = 0;
+
+ for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++)
+ md->skilltimerskill[i].timer = -1;
+
+ for(i=0;i<MAX_STATUSCHANGE;i++) {
+ md->sc_data[i].timer=-1;
+ md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 = md->sc_data[i].val4 =0;
+ }
+ md->sc_count=0;
+ md->opt1=md->opt2=md->opt3=md->option=0;
+
+ memset(md->skillunit,0,sizeof(md->skillunit));
+ memset(md->skillunittick,0,sizeof(md->skillunittick));
+
+ md->hp = battle_get_max_hp(&md->bl);
+ if(md->hp<=0){
+ mob_makedummymobdb(md->class);
+ md->hp = battle_get_max_hp(&md->bl);
+ }
+
+ clif_spawnmob(md);
+
+ return 0;
+}
+
+/*==========================================
+ * Distance calculation between two points
+ *------------------------------------------
+ */
+static int distance(int x0,int y0,int x1,int y1)
+{
+ int dx,dy;
+
+ dx=abs(x0-x1);
+ dy=abs(y0-y1);
+ return dx>dy ? dx : dy;
+}
+
+/*==========================================
+ * The stop of MOB's attack
+ *------------------------------------------
+ */
+int mob_stopattack(struct mob_data *md)
+{
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ md->attacked_id=0;
+ return 0;
+}
+/*==========================================
+ * The stop of MOB's walking
+ *------------------------------------------
+ */
+int mob_stop_walking(struct mob_data *md,int type)
+{
+ nullpo_retr(0, md);
+
+
+ if(md->state.state == MS_WALK || md->state.state == MS_IDLE) {
+ int dx=0,dy=0;
+
+ md->walkpath.path_len=0;
+ if(type&4){
+ dx=md->to_x-md->bl.x;
+ if(dx<0)
+ dx=-1;
+ else if(dx>0)
+ dx=1;
+ dy=md->to_y-md->bl.y;
+ if(dy<0)
+ dy=-1;
+ else if(dy>0)
+ dy=1;
+ }
+ md->to_x=md->bl.x+dx;
+ md->to_y=md->bl.y+dy;
+ if(dx!=0 || dy!=0){
+ mob_walktoxy_sub(md);
+ return 0;
+ }
+ mob_changestate(md,MS_IDLE,0);
+ }
+ if(type&0x01)
+ clif_fixmobpos(md);
+ if(type&0x02) {
+ int delay=battle_get_dmotion(&md->bl);
+ unsigned int tick = gettick();
+ if(md->canmove_tick < tick)
+ md->canmove_tick = tick + delay;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Reachability to a Specification ID existence place
+ *------------------------------------------
+ */
+int mob_can_reach(struct mob_data *md,struct block_list *bl,int range)
+{
+ int dx,dy;
+ struct walkpath_data wpd;
+ int i;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, bl);
+
+ dx=abs(bl->x - md->bl.x);
+ dy=abs(bl->y - md->bl.y);
+
+ //=========== guildcastle guardian no search start===========
+ //when players are the guild castle member not attack them !
+ if(md->class >= 1285 && md->class <= 1287){
+ struct map_session_data *sd;
+ struct guild *g=NULL;
+ struct guild_castle *gc=guild_mapname2gc(map[bl->m].name);
+
+ if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris]
+ return 0; // end addition [Valaris]
+
+ if(bl && bl->type == BL_PC){
+ nullpo_retr(0, sd=(struct map_session_data *)bl);
+ if(!gc)
+ return 0;
+ if(gc && sd && sd->status.guild_id) {
+ g=guild_search(sd->status.guild_id); // don't attack guild members [Valaris]
+ if(g && g->guild_id == gc->guild_id)
+ return 0;
+ if(g && gc && guild_isallied(g,gc))
+ return 0;
+
+ }
+ }
+ }
+ //========== guildcastle guardian no search eof==============
+
+ if(bl && bl->type == BL_PC && battle_config.monsters_ignore_gm==1) { // option to have monsters ignore GMs [Valaris]
+ struct map_session_data *sd;
+ if((sd=(struct map_session_data *)bl) != NULL && pc_isGM(sd))
+ return 0;
+ }
+
+ if( md->bl.m != bl->m) // ˆá‚¤ƒƒbƒv
+ return 0;
+
+ if( range>0 && range < ((dx>dy)?dx:dy) ) // ‰“‚·‚¬‚é
+ return 0;
+
+ if( md->bl.x==bl->x && md->bl.y==bl->y ) // “¯‚¶ƒ}ƒX
+ return 1;
+
+ // Obstacle judging
+ wpd.path_len=0;
+ wpd.path_pos=0;
+ wpd.path_half=0;
+ if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x,bl->y,0)!=-1)
+ return 1;
+
+ if(bl->type!=BL_PC && bl->type!=BL_MOB)
+ return 0;
+
+ // It judges whether it can adjoin or not.
+ dx=(dx>0)?1:((dx<0)?-1:0);
+ dy=(dy>0)?1:((dy<0)?-1:0);
+ if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-dx,bl->y-dy,0)!=-1)
+ return 1;
+ for(i=0;i<9;i++){
+ if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-1+i/3,bl->y-1+i%3,0)!=-1)
+ return 1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * Determination for an attack of a monster
+ *------------------------------------------
+ */
+int mob_target(struct mob_data *md,struct block_list *bl,int dist)
+{
+ struct map_session_data *sd;
+ struct status_change *sc_data;
+ short *option;
+ int mode,race;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, bl);
+
+ sc_data = battle_get_sc_data(bl);
+ option = battle_get_option(bl);
+ race=mob_db[md->class].race;
+
+ if(!md->mode)
+ mode=mob_db[md->class].mode;
+ else
+ mode=md->mode;
+
+ if(!(mode&0x80)) {
+ md->target_id = 0;
+ return 0;
+ }
+ // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending.
+ if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && ( !(mode&0x04) || rand()%100>25) )
+ return 0;
+
+ if(mode&0x20 || // Coercion is exerted if it is MVPMOB.
+ (sc_data && sc_data[SC_TRICKDEAD].timer == -1 &&
+ ( (option && !(*option&0x06) ) || race==4 || race==6) ) ){
+ if(bl->type == BL_PC) {
+ nullpo_retr(0, sd = (struct map_session_data *)bl);
+ if(sd->invincible_timer != -1 || pc_isinvisible(sd))
+ return 0;
+ if(!(mode&0x20) && race!=4 && race!=6 && sd->state.gangsterparadise)
+ return 0;
+ }
+
+ md->target_id=bl->id; // Since there was no disturbance, it locks on to target.
+ if(bl->type == BL_PC || bl->type == BL_MOB)
+ md->state.targettype = ATTACKABLE;
+ else
+ md->state.targettype = NONE_ATTACKABLE;
+ md->min_chase=dist+13;
+ if(md->min_chase>26)
+ md->min_chase=26;
+ }
+ return 0;
+}
+
+/*==========================================
+ * The ?? routine of an active monster
+ *------------------------------------------
+ */
+static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *tsd=NULL;
+ struct mob_data *smd,*tmd=NULL;
+ int mode,race,dist,*pcc;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, smd=va_arg(ap,struct mob_data *));
+ nullpo_retr(0, pcc=va_arg(ap,int *));
+
+ if(bl->type==BL_PC)
+ tsd=(struct map_session_data *)bl;
+ else if(bl->type==BL_MOB)
+ tmd=(struct mob_data *)bl;
+ else
+ return 0;
+
+ //“G–¡•û”»’è
+ if(battle_check_target(&smd->bl,bl,BCT_ENEMY)==0)
+ return 0;
+
+ if(!smd->mode)
+ mode=mob_db[smd->class].mode;
+ else
+ mode=smd->mode;
+
+ // ƒAƒNƒeƒBƒu‚Ń^[ƒQƒbƒgŽË’ö“à‚É‚¢‚é‚È‚çAƒƒbƒN‚·‚é
+ if( mode&0x04 ){
+ race=mob_db[smd->class].race;
+ //‘ÎÛ‚ªPC‚Ìê‡
+ if(tsd &&
+ !pc_isdead(tsd) &&
+ tsd->bl.m == smd->bl.m &&
+ tsd->invincible_timer == -1 &&
+ !pc_isinvisible(tsd) &&
+ (dist=distance(smd->bl.x,smd->bl.y,tsd->bl.x,tsd->bl.y))<9
+ )
+ {
+ if(mode&0x20 ||
+ (tsd->sc_data[SC_TRICKDEAD].timer == -1 &&
+ ((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || race==4 || race==6))){ // –WŠQ‚ª‚È‚¢‚©”»’è
+ if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
+ rand()%1000<1000/(++(*pcc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
+ smd->target_id=tsd->bl.id;
+ smd->state.targettype = ATTACKABLE;
+ smd->min_chase=13;
+ }
+ }
+ }
+ //‘ÎÛ‚ªMob‚Ìê‡
+ else if(tmd &&
+ tmd->bl.m == smd->bl.m &&
+ (dist=distance(smd->bl.x,smd->bl.y,tmd->bl.x,tmd->bl.y))<9
+ )
+ {
+ if( mob_can_reach(smd,bl,12) && // “ž’B‰Â”\«”»’è
+ rand()%1000<1000/(++(*pcc)) ){ // ”͈͓à‚Å“™Šm—¦‚É‚·‚é
+ smd->target_id=bl->id;
+ smd->state.targettype = ATTACKABLE;
+ smd->min_chase=13;
+ }
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ * loot monster item search
+ *------------------------------------------
+ */
+static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
+{
+ struct mob_data* md;
+ int mode,dist,*itc;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md=va_arg(ap,struct mob_data *));
+ nullpo_retr(0, itc=va_arg(ap,int *));
+
+ if(!md->mode)
+ mode=mob_db[md->class].mode;
+ else
+ mode=md->mode;
+
+
+ if( !md->target_id && mode&0x02){
+ if(!md->lootitem || (battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) )
+ return 0;
+ if(bl->m == md->bl.m && (dist=distance(md->bl.x,md->bl.y,bl->x,bl->y))<9){
+ if( mob_can_reach(md,bl,12) && // Reachability judging
+ rand()%1000<1000/(++(*itc)) ){ // It is made a probability, such as within the limits PC.
+ md->target_id=bl->id;
+ md->state.targettype = NONE_ATTACKABLE;
+ md->min_chase=13;
+ }
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ * The ?? routine of a link monster
+ *------------------------------------------
+ */
+static int mob_ai_sub_hard_linksearch(struct block_list *bl,va_list ap)
+{
+ struct mob_data *tmd;
+ struct mob_data* md;
+ struct block_list *target;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, tmd=(struct mob_data *)bl);
+ nullpo_retr(0, md=va_arg(ap,struct mob_data *));
+ nullpo_retr(0, target=va_arg(ap,struct block_list *));
+
+ // same family free in a range at a link monster -- it will be made to lock if MOB is
+/* if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->class].mode&0x08){
+ if( tmd->class==md->class && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE) && tmd->bl.m == md->bl.m){
+ if( mob_can_reach(tmd,target,12) ){ // Reachability judging
+ tmd->target_id=md->target_id;
+ tmd->state.targettype = ATTACKABLE;
+ tmd->min_chase=13;
+ }
+ }
+ }*/
+ if( md->attacked_id > 0 && mob_db[md->class].mode&0x08){
+ if( tmd->class==md->class && tmd->bl.m == md->bl.m && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE)){
+ if( mob_can_reach(tmd,target,12) ){ // Reachability judging
+ tmd->target_id=md->attacked_id;
+ tmd->state.targettype = ATTACKABLE;
+ tmd->min_chase=13;
+ }
+ }
+ }
+
+ return 0;
+}
+/*==========================================
+ * Processing of slave monsters
+ *------------------------------------------
+ */
+static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
+{
+ struct mob_data *mmd=NULL;
+ struct block_list *bl;
+ int mode,race,old_dist;
+
+ nullpo_retr(0, md);
+
+ if((bl=map_id2bl(md->master_id)) != NULL )
+ mmd=(struct mob_data *)bl;
+
+ mode=mob_db[md->class].mode;
+
+ // It is not main monster/leader.
+ if(!mmd || mmd->bl.type!=BL_MOB || mmd->bl.id!=md->master_id)
+ return 0;
+
+ // Since it is in the map on which the master is not, teleport is carried out and it pursues.
+ if( mmd->bl.m != md->bl.m ){
+ mob_warp(md,mmd->bl.m,mmd->bl.x,mmd->bl.y,3);
+ md->state.master_check = 1;
+ return 0;
+ }
+
+ // Distance with between slave and master is measured.
+ old_dist=md->master_dist;
+ md->master_dist=distance(md->bl.x,md->bl.y,mmd->bl.x,mmd->bl.y);
+
+ // Since the master was in near immediately before, teleport is carried out and it pursues.
+ if( old_dist<10 && md->master_dist>18){
+ mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3);
+ md->state.master_check = 1;
+ return 0;
+ }
+
+ // Although there is the master, since it is somewhat far, it approaches.
+ if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) &&
+ (md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_len==0) && md->master_dist<15){
+ int i=0,dx,dy,ret;
+ if(md->master_dist>4) {
+ do {
+ if(i<=5){
+ dx=mmd->bl.x - md->bl.x;
+ dy=mmd->bl.y - md->bl.y;
+ if(dx<0) dx+=(rand()%( (dx<-3)?3:-dx )+1);
+ else if(dx>0) dx-=(rand()%( (dx>3)?3:dx )+1);
+ if(dy<0) dy+=(rand()%( (dy<-3)?3:-dy )+1);
+ else if(dy>0) dy-=(rand()%( (dy>3)?3:dy )+1);
+ }else{
+ dx=mmd->bl.x - md->bl.x + rand()%7 - 3;
+ dy=mmd->bl.y - md->bl.y + rand()%7 - 3;
+ }
+
+ ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
+ i++;
+ } while(ret && i<10);
+ }
+ else {
+ do {
+ dx = rand()%9 - 5;
+ dy = rand()%9 - 5;
+ if( dx == 0 && dy == 0) {
+ dx = (rand()%1)? 1:-1;
+ dy = (rand()%1)? 1:-1;
+ }
+ dx += mmd->bl.x;
+ dy += mmd->bl.y;
+
+ ret=mob_walktoxy(md,mmd->bl.x+dx,mmd->bl.y+dy,0);
+ i++;
+ } while(ret && i<10);
+ }
+
+ md->next_walktime=tick+500;
+ md->state.master_check = 1;
+ }
+
+ // There is the master, the master locks a target and he does not lock.
+ if( (mmd->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!md->target_id || md->state.targettype == NONE_ATTACKABLE) ){
+ struct map_session_data *sd=map_id2sd(mmd->target_id);
+ if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
+
+ race=mob_db[md->class].race;
+ if(mode&0x20 ||
+ (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
+ ( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || race==4 || race==6) ) ){ // –WŠQ‚ª‚È‚¢‚©”»’è
+
+ md->target_id=sd->bl.id;
+ md->state.targettype = ATTACKABLE;
+ md->min_chase=5+distance(md->bl.x,md->bl.y,sd->bl.x,sd->bl.y);
+ md->state.master_check = 1;
+ }
+ }
+ }
+
+ // There is the master, the master locks a target and he does not lock.
+/* if( (md->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!mmd->target_id || mmd->state.targettype == NONE_ATTACKABLE) ){
+ struct map_session_data *sd=map_id2sd(md->target_id);
+ if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){
+
+ race=mob_db[mmd->class].race;
+ if(mode&0x20 ||
+ (sd->sc_data[SC_TRICKDEAD].timer == -1 &&
+ (!(sd->status.option&0x06) || race==4 || race==6)
+ ) ){ // It judges whether there is any disturbance.
+
+ mmd->target_id=sd->bl.id;
+ mmd->state.targettype = ATTACKABLE;
+ mmd->min_chase=5+distance(mmd->bl.x,mmd->bl.y,sd->bl.x,sd->bl.y);
+ }
+ }
+ }*/
+
+ return 0;
+}
+
+/*==========================================
+ * A lock of target is stopped and mob moves to a standby state.
+ *------------------------------------------
+ */
+static int mob_unlocktarget(struct mob_data *md,int tick)
+{
+ nullpo_retr(0, md);
+
+ md->target_id=0;
+ md->state.targettype = NONE_ATTACKABLE;
+ md->state.skillstate=MSS_IDLE;
+ md->next_walktime=tick+rand()%3000+3000;
+ return 0;
+}
+/*==========================================
+ * Random walk
+ *------------------------------------------
+ */
+static int mob_randomwalk(struct mob_data *md,int tick)
+{
+ const int retrycount=20;
+ int speed;
+
+ nullpo_retr(0, md);
+
+ speed=battle_get_speed(&md->bl);
+ if(DIFF_TICK(md->next_walktime,tick)<0){
+ int i,x,y,c,d=12-md->move_fail_count;
+ if(d<5) d=5;
+ for(i=0;i<retrycount;i++){ // Search of a movable place
+ int r=rand();
+ x=md->bl.x+r%(d*2+1)-d;
+ y=md->bl.y+r/(d*2+1)%(d*2+1)-d;
+ if((c=map_getcell(md->bl.m,x,y))!=1 && c!=5 && mob_walktoxy(md,x,y,1)==0){
+ md->move_fail_count=0;
+ break;
+ }
+ if(i+1>=retrycount){
+ md->move_fail_count++;
+ if(md->move_fail_count>1000){
+ if(battle_config.error_log)
+ printf("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class);
+ md->move_fail_count=0;
+ mob_spawn(md->bl.id);
+ }
+ }
+ }
+ for(i=c=0;i<md->walkpath.path_len;i++){ // The next walk start time is calculated.
+ if(md->walkpath.path[i]&1)
+ c+=speed*14/10;
+ else
+ c+=speed;
+ }
+ md->next_walktime = tick+rand()%3000+3000+c;
+ md->state.skillstate=MSS_WALK;
+ return 1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * AI of MOB whose is near a Player
+ *------------------------------------------
+ */
+static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
+{
+ struct mob_data *md,*tmd=NULL;
+ struct map_session_data *tsd=NULL;
+ struct block_list *tbl=NULL;
+ struct flooritem_data *fitem;
+ unsigned int tick;
+ int i,dx,dy,ret,dist;
+ int attack_type=0;
+ int mode,race;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md=(struct mob_data*)bl);
+
+ tick=va_arg(ap,unsigned int);
+
+
+ if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME)
+ return 0;
+ md->last_thinktime=tick;
+
+ if( md->skilltimer!=-1 || md->bl.prev==NULL ){ // Under a skill aria and death
+ if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME)
+ md->next_walktime=tick;
+ return 0;
+ }
+
+ if(!md->mode)
+ mode=mob_db[md->class].mode;
+ else
+ mode=md->mode;
+
+ race=mob_db[md->class].race;
+
+ // Abnormalities
+ if((md->opt1 > 0 && md->opt1 != 6) || md->state.state==MS_DELAY || md->sc_data[SC_BLADESTOP].timer != -1)
+ return 0;
+
+ if(!(mode&0x80) && md->target_id > 0)
+ md->target_id = 0;
+
+ if(md->attacked_id > 0 && mode&0x08){ // Link monster
+ struct map_session_data *asd=map_id2sd(md->attacked_id);
+ if(asd){
+ if(asd->invincible_timer == -1 && !pc_isinvisible(asd)){
+ map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
+ md->bl.x-13,md->bl.y-13,
+ md->bl.x+13,md->bl.y+13,
+ BL_MOB,md,&asd->bl);
+ }
+ }
+ }
+
+ // It checks to see it was attacked first (if active, it is target change at 25% of probability).
+ if( mode>0 && md->attacked_id>0 && (!md->target_id || md->state.targettype == NONE_ATTACKABLE
+ || (mode&0x04 && rand()%100<25 ) ) ){
+ struct block_list *abl=map_id2bl(md->attacked_id);
+ struct map_session_data *asd=NULL;
+ if(abl){
+ if(abl->type==BL_PC)
+ asd=(struct map_session_data *)abl;
+ if(asd==NULL || md->bl.m != abl->m || abl->prev == NULL || asd->invincible_timer != -1 || pc_isinvisible(asd) ||
+ (dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0)
+ md->attacked_id=0;
+ else {
+ md->target_id=md->attacked_id; // set target
+ md->state.targettype = ATTACKABLE;
+ attack_type = 1;
+ md->attacked_id=0;
+ md->min_chase=dist+13;
+ if(md->min_chase>26)
+ md->min_chase=26;
+ }
+ }
+ }
+
+ md->state.master_check = 0;
+ // Processing of slave monster
+ if( md->master_id > 0 && md->state.special_mob_ai==0)
+ mob_ai_sub_hard_slavemob(md,tick);
+
+ // ƒAƒNƒeƒBƒ”ƒ‚ƒ“ƒXƒ^[‚Ìô“G (?? of a bitter taste TIVU monster)
+ if( (!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mode&0x04 && !md->state.master_check &&
+ battle_config.monster_active_enable){
+ i=0;
+ if(md->state.special_mob_ai){
+ map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
+ md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
+ md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
+ 0,md,&i);
+ }else{
+ map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m,
+ md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
+ md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
+ BL_PC,md,&i);
+ }
+ }
+
+ // The item search of a route monster
+ if( !md->target_id && mode&0x02 && !md->state.master_check){
+ i=0;
+ map_foreachinarea(mob_ai_sub_hard_lootsearch,md->bl.m,
+ md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2,
+ md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2,
+ BL_ITEM,md,&i);
+ }
+
+ // It will attack, if the candidate for an attack is.
+ if(md->target_id > 0){
+ if((tbl=map_id2bl(md->target_id))){
+ if(tbl->type==BL_PC)
+ tsd=(struct map_session_data *)tbl;
+ else if(tbl->type==BL_MOB)
+ tmd=(struct mob_data *)tbl;
+ if(tsd || tmd) {
+ if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase)
+ mob_unlocktarget(md,tick); // •Êƒ}ƒbƒv‚©AŽ‹ŠEŠO
+ else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6)) )
+ mob_unlocktarget(md,tick); // ƒXƒLƒ‹‚È‚Ç‚É‚æ‚éô“G–WŠQ
+ else if(!battle_check_range(&md->bl,tbl,mob_db[md->class].range)){
+ // UŒ‚”͈͊O‚Ȃ̂ňړ®
+ if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
+ mob_unlocktarget(md,tick);
+ return 0;
+ }
+ if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
+ return 0;
+ md->state.skillstate=MSS_CHASE; // “ËŒ‚ŽžƒXƒLƒ‹
+ mobskill_use(md,tick,-1);
+// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) )
+ if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
+ return 0; // Šù‚Ɉړ®’†
+ if( !mob_can_reach(md,tbl,(md->min_chase>13)?md->min_chase:13) )
+ mob_unlocktarget(md,tick); // ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
+ else{
+ // ’ÇÕ
+ md->next_walktime=tick+500;
+ i=0;
+ do {
+ if(i==0){ // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
+ dx=tbl->x - md->bl.x;
+ dy=tbl->y - md->bl.y;
+ if(dx<0) dx++;
+ else if(dx>0) dx--;
+ if(dy<0) dy++;
+ else if(dy>0) dy--;
+ }else{ // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
+ dx=tbl->x - md->bl.x + rand()%3 - 1;
+ dy=tbl->y - md->bl.y + rand()%3 - 1;
+ }
+ /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
+ dx=tsd->bl.x - md->bl.x;
+ dy=tsd->bl.y - md->bl.y;
+ if(dx<0) dx--;
+ else if(dx>0) dx++;
+ if(dy<0) dy--;
+ else if(dy>0) dy++;
+ }*/
+ ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
+ i++;
+ } while(ret && i<5);
+
+ if(ret){ // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
+ if(dx<0) dx=2;
+ else if(dx>0) dx=-2;
+ if(dy<0) dy=2;
+ else if(dy>0) dy=-2;
+ mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
+ }
+ }
+ } else { // UŒ‚ŽË’ö”͈͓à
+ md->state.skillstate=MSS_ATTACK;
+ if(md->state.state==MS_WALK)
+ mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
+ if(md->state.state==MS_ATTACK)
+ return 0; // Šù‚ÉUŒ‚’†
+ mob_changestate(md,MS_ATTACK,attack_type);
+
+/* if(mode&0x08){ // ƒŠƒ“ƒNƒ‚ƒ“ƒXƒ^[
+ map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m,
+ md->bl.x-13,md->bl.y-13,
+ md->bl.x+13,md->bl.y+13,
+ BL_MOB,md,&tsd->bl);
+ }*/
+ }
+ return 0;
+ }else{ // ƒ‹[ƒgƒ‚ƒ“ƒXƒ^[ˆ—
+ if(tbl == NULL || tbl->type != BL_ITEM ||tbl->m != md->bl.m ||
+ (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase || !md->lootitem){
+ // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
+ mob_unlocktarget(md,tick);
+ if(md->state.state==MS_WALK)
+ mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
+ }else if(dist){
+ if(!(mode&1)){ // ˆÚ“®‚µ‚È‚¢ƒ‚[ƒh
+ mob_unlocktarget(md,tick);
+ return 0;
+ }
+ if( !mob_can_move(md) ) // “®‚¯‚È‚¢ó‘Ô‚É‚ ‚é
+ return 0;
+ md->state.skillstate=MSS_LOOT; // ƒ‹[ƒgŽžƒXƒLƒ‹Žg—p
+ mobskill_use(md,tick,-1);
+// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) )
+ if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y) <= 0))
+ return 0; // Šù‚Ɉړ®’†
+ md->next_walktime=tick+500;
+ dx=tbl->x - md->bl.x;
+ dy=tbl->y - md->bl.y;
+/* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){
+ dx=tbl->x - md->bl.x;
+ dy=tbl->y - md->bl.y;
+ }*/
+ ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0);
+ if(ret)
+ mob_unlocktarget(md,tick);// ˆÚ“®‚Å‚«‚È‚¢‚̂Ń^ƒQ‰ðœiIW‚Æ‚©Hj
+ }else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
+ if(md->state.state==MS_ATTACK)
+ return 0; // UŒ‚’†
+ if(md->state.state==MS_WALK)
+ mob_stop_walking(md,1); // •às’†‚È‚ç’âŽ~
+ fitem = (struct flooritem_data *)tbl;
+ if(md->lootitem_count < LOOTITEM_SIZE)
+ memcpy(&md->lootitem[md->lootitem_count++],&fitem->item_data,sizeof(md->lootitem[0]));
+ else if(battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) {
+ mob_unlocktarget(md,tick);
+ return 0;
+ }
+ else {
+ if(md->lootitem[0].card[0] == (short)0xff00)
+ intif_delete_petdata(*((long *)(&md->lootitem[0].card[1])));
+ for(i=0;i<LOOTITEM_SIZE-1;i++)
+ memcpy(&md->lootitem[i],&md->lootitem[i+1],sizeof(md->lootitem[0]));
+ memcpy(&md->lootitem[LOOTITEM_SIZE-1],&fitem->item_data,sizeof(md->lootitem[0]));
+ }
+ map_clearflooritem(tbl->id);
+ mob_unlocktarget(md,tick);
+ }
+ return 0;
+ }
+ }else{
+ mob_unlocktarget(md,tick);
+ if(md->state.state==MS_WALK)
+ mob_stop_walking(md,4); // •às’†‚È‚ç’âŽ~
+ return 0;
+ }
+ }
+
+ // It is skill use at the time of /standby at the time of a walk.
+ if( mobskill_use(md,tick,-1) )
+ return 0;
+
+ // •àsˆ—
+ if( mode&1 && mob_can_move(md) && // ˆÚ“®‰Â”\MOB&“®‚¯‚éó‘Ô‚É‚ ‚é
+ (md->master_id==0 || md->state.special_mob_ai || md->master_dist>10) ){ //Žæ‚芪‚«MOB‚¶‚á‚È‚¢
+
+ if( DIFF_TICK(md->next_walktime,tick) > + 7000 &&
+ (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) ){
+ md->next_walktime = tick + 3000*rand()%2000;
+ }
+
+ // Random movement
+ if( mob_randomwalk(md,tick) )
+ return 0;
+ }
+
+ // Since he has finished walking, it stands by.
+ if( md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len )
+ md->state.skillstate=MSS_IDLE;
+ return 0;
+}
+
+/*==========================================
+ * Serious processing for mob in PC field of view (foreachclient)
+ *------------------------------------------
+ */
+static int mob_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
+{
+ unsigned int tick;
+ nullpo_retr(0, sd);
+ nullpo_retr(0, ap);
+
+ tick=va_arg(ap,unsigned int);
+ map_foreachinarea(mob_ai_sub_hard,sd->bl.m,
+ sd->bl.x-AREA_SIZE*2,sd->bl.y-AREA_SIZE*2,
+ sd->bl.x+AREA_SIZE*2,sd->bl.y+AREA_SIZE*2,
+ BL_MOB,tick);
+
+ return 0;
+}
+
+/*==========================================
+ * Serious processing for mob in PC field of view (interval timer function)
+ *------------------------------------------
+ */
+static int mob_ai_hard(int tid,unsigned int tick,int id,int data)
+{
+ clif_foreachclient(mob_ai_sub_foreachclient,tick);
+
+ return 0;
+}
+
+/*==========================================
+ * Negligent mode MOB AI (PC is not in near)
+ *------------------------------------------
+ */
+static int mob_ai_sub_lazy(void * key,void * data,va_list app)
+{
+ struct mob_data *md=data;
+ unsigned int tick;
+ va_list ap;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, app);
+ nullpo_retr(0, ap=va_arg(app,va_list));
+
+ if(md->bl.type!=BL_MOB)
+ return 0;
+
+ if(!md->bl.type || md->bl.type!=BL_MOB)
+ return 0;
+
+ tick=va_arg(ap,unsigned int);
+
+ if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME*10)
+ return 0;
+ md->last_thinktime=tick;
+
+ if(md->bl.prev==NULL || md->skilltimer!=-1){
+ if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME*10)
+ md->next_walktime=tick;
+ return 0;
+ }
+
+ if(DIFF_TICK(md->next_walktime,tick)<0 &&
+ (mob_db[md->class].mode&1) && mob_can_move(md) ){
+
+ if( map[md->bl.m].users>0 ){
+ // Since PC is in the same map, somewhat better negligent processing is carried out.
+
+ // It sometimes moves.
+ if(rand()%1000<MOB_LAZYMOVEPERC)
+ mob_randomwalk(md,tick);
+
+ // MOB which is not not the summons MOB but BOSS, either sometimes reboils.
+ else if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
+ mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20))
+ mob_spawn(md->bl.id);
+
+ }else{
+ // Since PC is not even in the same map, suitable processing is carried out even if it takes.
+
+ // MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping
+ if( rand()%1000<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 &&
+ mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20))
+ mob_warp(md,-1,-1,-1,-1);
+ }
+
+ md->next_walktime = tick+rand()%10000+5000;
+ }
+ return 0;
+}
+
+/*==========================================
+ * Negligent processing for mob outside PC field of view (interval timer function)
+ *------------------------------------------
+ */
+static int mob_ai_lazy(int tid,unsigned int tick,int id,int data)
+{
+ map_foreachiddb(mob_ai_sub_lazy,tick);
+
+ return 0;
+}
+
+
+/*==========================================
+ * 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 delay_item_drop {
+ int m,x,y;
+ int nameid,amount;
+ struct map_session_data *first_sd,*second_sd,*third_sd;
+};
+
+struct delay_item_drop2 {
+ int m,x,y;
+ struct item item_data;
+ struct map_session_data *first_sd,*second_sd,*third_sd;
+};
+
+/*==========================================
+ * item drop with delay (timer function)
+ *------------------------------------------
+ */
+static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data)
+{
+ struct delay_item_drop *ditem;
+ struct item temp_item;
+ int flag;
+
+ nullpo_retr(0, ditem=(struct delay_item_drop *)id);
+
+ memset(&temp_item,0,sizeof(temp_item));
+ temp_item.nameid = ditem->nameid;
+ temp_item.amount = ditem->amount;
+ temp_item.identify = !itemdb_isequip3(temp_item.nameid);
+
+ if(battle_config.item_auto_get){
+ if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){
+ clif_additem(ditem->first_sd,0,0,flag);
+ map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+ }
+ free(ditem);
+ return 0;
+ }
+
+ map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+
+ free(ditem);
+ return 0;
+}
+
+/*==========================================
+ * item drop (timer function)-lootitem with delay
+ *------------------------------------------
+ */
+static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data)
+{
+ struct delay_item_drop2 *ditem;
+ int flag;
+
+ nullpo_retr(0, ditem=(struct delay_item_drop2 *)id);
+
+ if(battle_config.item_auto_get){
+ if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){
+ clif_additem(ditem->first_sd,0,0,flag);
+ map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+ }
+ free(ditem);
+ return 0;
+ }
+
+ map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+
+ free(ditem);
+ return 0;
+}
+
+/*==========================================
+ * mob data is erased.
+ *------------------------------------------
+ */
+int mob_delete(struct mob_data *md)
+{
+ nullpo_retr(1, md);
+
+ if(md->bl.prev == NULL)
+ return 1;
+ mob_changestate(md,MS_DEAD,0);
+ clif_clearchar_area(&md->bl,1);
+ map_delblock(&md->bl);
+ if(mob_get_viewclass(md->class) <= 1000)
+ clif_clearchar_delay(gettick()+3000,&md->bl,0);
+ mob_deleteslave(md);
+ mob_setdelayspawn(md->bl.id);
+ return 0;
+}
+
+int mob_catch_delete(struct mob_data *md,int type)
+{
+ nullpo_retr(1, md);
+
+ if(md->bl.prev == NULL)
+ return 1;
+ mob_changestate(md,MS_DEAD,0);
+ clif_clearchar_area(&md->bl,type);
+ map_delblock(&md->bl);
+ mob_setdelayspawn(md->bl.id);
+ return 0;
+}
+
+int mob_timer_delete(int tid, unsigned int tick, int id, int data)
+{
+ struct block_list *bl=map_id2bl(id);
+ struct mob_data *md;
+
+ nullpo_retr(0, bl);
+
+ md = (struct mob_data *)bl;
+ mob_catch_delete(md,3);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int mob_deleteslave_sub(struct block_list *bl,va_list ap)
+{
+ struct mob_data *md;
+ int id;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md = (struct mob_data *)bl);
+
+ id=va_arg(ap,int);
+ if(md->master_id > 0 && md->master_id == id )
+ mob_damage(NULL,md,md->hp,1);
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int mob_deleteslave(struct mob_data *md)
+{
+ nullpo_retr(0, md);
+
+ map_foreachinarea(mob_deleteslave_sub, md->bl.m,
+ 0,0,map[md->bl.m].xs,map[md->bl.m].ys,
+ BL_MOB,md->bl.id);
+ return 0;
+}
+
+/*==========================================
+ * It is the damage of sd to damage to md.
+ *------------------------------------------
+ */
+int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
+{
+ int i,count,minpos,mindmg;
+ struct map_session_data *sd = NULL,*tmpsd[DAMAGELOG_SIZE];
+ struct {
+ struct party *p;
+ int id,base_exp,job_exp;
+ } pt[DAMAGELOG_SIZE];
+ int pnum=0;
+ int mvp_damage,max_hp;
+ unsigned int tick = gettick();
+ struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL;
+ double dmg_rate,tdmg,temp;
+ struct item item;
+ int ret;
+ int drop_rate;
+ int skill,sp;
+
+ nullpo_retr(0, md); //src‚ÍNULL‚ŌĂ΂ê‚éê‡‚à‚ ‚é‚Ì‚ÅA‘¼‚Ń`ƒFƒbƒN
+
+ max_hp = battle_get_max_hp(&md->bl);
+
+ if(src && src->type == BL_PC) {
+ sd = (struct map_session_data *)src;
+ mvp_sd = sd;
+ }
+
+// if(battle_config.battle_log)
+// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage);
+ if(md->bl.prev==NULL){
+ if(battle_config.error_log)
+ printf("mob_damage : BlockError!!\n");
+ return 0;
+ }
+
+ if(md->state.state==MS_DEAD || md->hp<=0) {
+ if(md->bl.prev != NULL) {
+ mob_changestate(md,MS_DEAD,0);
+ mobskill_use(md,tick,-1); // It is skill at the time of death.
+ clif_clearchar_area(&md->bl,1);
+ map_delblock(&md->bl);
+ mob_setdelayspawn(md->bl.id);
+ }
+ return 0;
+ }
+
+ if(md->sc_data[SC_ENDURE].timer == -1)
+ mob_stop_walking(md,3);
+ if(damage > max_hp>>2)
+ skill_stop_dancing(&md->bl,0);
+
+ if(md->hp > max_hp)
+ md->hp = max_hp;
+
+ // The amount of overkill rounds to hp.
+ if(damage>md->hp)
+ damage=md->hp;
+
+ if(!(type&2)) {
+ if(sd!=NULL){
+ for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
+ if(md->dmglog[i].id==sd->bl.id)
+ break;
+ if(md->dmglog[i].id==0){
+ minpos=i;
+ mindmg=0;
+ }
+ else if(md->dmglog[i].dmg<mindmg){
+ minpos=i;
+ mindmg=md->dmglog[i].dmg;
+ }
+ }
+ if(i<DAMAGELOG_SIZE)
+ md->dmglog[i].dmg+=damage;
+ else {
+ md->dmglog[minpos].id=sd->bl.id;
+ md->dmglog[minpos].dmg=damage;
+ }
+
+ if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
+ md->attacked_id = sd->bl.id;
+ }
+ if(src && src->type == BL_PET && battle_config.pet_attack_exp_to_master) {
+ struct pet_data *pd = (struct pet_data *)src;
+ nullpo_retr(0, pd);
+ for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
+ if(md->dmglog[i].id==pd->msd->bl.id)
+ break;
+ if(md->dmglog[i].id==0){
+ minpos=i;
+ mindmg=0;
+ }
+ else if(md->dmglog[i].dmg<mindmg){
+ minpos=i;
+ mindmg=md->dmglog[i].dmg;
+ }
+ }
+ if(i<DAMAGELOG_SIZE)
+ md->dmglog[i].dmg+=(damage*battle_config.pet_attack_exp_rate)/100;
+ else {
+ md->dmglog[minpos].id=pd->msd->bl.id;
+ md->dmglog[minpos].dmg=(damage*battle_config.pet_attack_exp_rate)/100;
+ }
+ }
+ if(src && src->type == BL_MOB && ((struct mob_data*)src)->state.special_mob_ai){
+ struct mob_data *md2 = (struct mob_data *)src;
+ nullpo_retr(0, md2);
+ for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){
+ if(md->dmglog[i].id==md2->master_id)
+ break;
+ if(md->dmglog[i].id==0){
+ minpos=i;
+ mindmg=0;
+ }
+ else if(md->dmglog[i].dmg<mindmg){
+ minpos=i;
+ mindmg=md->dmglog[i].dmg;
+ }
+ }
+ if(i<DAMAGELOG_SIZE)
+ md->dmglog[i].dmg+=damage;
+ else {
+ md->dmglog[minpos].id=md2->master_id;
+ md->dmglog[minpos].dmg=damage;
+
+ if(md->attacked_id <= 0 && md->state.special_mob_ai==0)
+ md->attacked_id = md2->master_id;
+ }
+ }
+
+ }
+
+ md->hp-=damage;
+
+ if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris]
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc) {
+
+ if(md->bl.id==gc->GID0) {
+ gc->Ghp0=md->hp;
+ if(gc->Ghp0<=0) {
+ guild_castledatasave(gc->castle_id,10,0);
+ guild_castledatasave(gc->castle_id,18,0);
+ }
+ }
+ if(md->bl.id==gc->GID1) {
+ gc->Ghp1=md->hp;
+ if(gc->Ghp1<=0) {
+ guild_castledatasave(gc->castle_id,11,0);
+ guild_castledatasave(gc->castle_id,19,0);
+ }
+ }
+ if(md->bl.id==gc->GID2) {
+ gc->Ghp2=md->hp;
+ if(gc->Ghp2<=0) {
+ guild_castledatasave(gc->castle_id,12,0);
+ guild_castledatasave(gc->castle_id,20,0);
+ }
+ }
+ if(md->bl.id==gc->GID3) {
+ gc->Ghp3=md->hp;
+ if(gc->Ghp3<=0) {
+ guild_castledatasave(gc->castle_id,13,0);
+ guild_castledatasave(gc->castle_id,21,0);
+ }
+ }
+ if(md->bl.id==gc->GID4) {
+ gc->Ghp4=md->hp;
+ if(gc->Ghp4<=0) {
+ guild_castledatasave(gc->castle_id,14,0);
+ guild_castledatasave(gc->castle_id,22,0);
+ }
+ }
+ if(md->bl.id==gc->GID5) {
+ gc->Ghp5=md->hp;
+ if(gc->Ghp5<=0) {
+ guild_castledatasave(gc->castle_id,15,0);
+ guild_castledatasave(gc->castle_id,23,0);
+ }
+ }
+ if(md->bl.id==gc->GID6) {
+ gc->Ghp6=md->hp;
+ if(gc->Ghp6<=0) {
+ guild_castledatasave(gc->castle_id,16,0);
+ guild_castledatasave(gc->castle_id,24,0);
+ }
+ }
+ if(md->bl.id==gc->GID7) {
+ gc->Ghp7=md->hp;
+ if(gc->Ghp7<=0) {
+ guild_castledatasave(gc->castle_id,17,0);
+ guild_castledatasave(gc->castle_id,25,0);
+
+ }
+ }
+ }
+ } // end addition [Valaris]
+
+ if(md->option&2 )
+ skill_status_change_end(&md->bl, SC_HIDING, -1);
+ if(md->option&4 )
+ skill_status_change_end(&md->bl, SC_CLOAKING, -1);
+
+ if(md->state.special_mob_ai == 2){//ƒXƒtƒBƒA[ƒ}ƒCƒ“
+ int skillidx=0;
+
+ if((skillidx=mob_skillid2skillidx(md->class,NPC_SELFDESTRUCTION2))>=0){
+ md->mode |= 0x1;
+ md->next_walktime=tick;
+ mobskill_use_id(md,&md->bl,skillidx);//Ž©”š‰r¥ŠJŽn
+ md->state.special_mob_ai++;
+ }
+ }
+
+ if(md->hp>0){
+ return 0;
+ }
+
+ // ----- ‚±‚±‚©‚玀–Sˆ— -----
+
+ map_freeblock_lock();
+ mob_changestate(md,MS_DEAD,0);
+ mobskill_use(md,tick,-1); // Ž€–SŽžƒXƒLƒ‹
+
+ memset(tmpsd,0,sizeof(tmpsd));
+ memset(pt,0,sizeof(pt));
+
+ max_hp = battle_get_max_hp(&md->bl);
+
+ if(src && src->type == BL_MOB)
+ mob_unlocktarget((struct mob_data *)src,tick);
+
+ /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
+ if(sd && (skill=pc_checkskill(sd,HW_SOULDRAIN))>0){
+ clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,skill,1);
+ sp = (battle_get_lv(&md->bl))*(65+15*skill)/100;
+ if(sd->status.sp + sp > sd->status.max_sp)
+ sp = sd->status.max_sp - sd->status.sp;
+ sd->status.sp += sp;
+ clif_heal(sd->fd,SP_SP,sp);
+ }
+
+ // mapŠO‚ÉÁ‚¦‚½l‚ÍŒvŽZ‚©‚眂­‚Ì‚Å
+ // overkill•ª‚Í–³‚¢‚¯‚Çsum‚Ímax_hp‚Ƃ͈Ⴄ
+
+ tdmg = 0;
+ for(i=0,count=0,mvp_damage=0;i<DAMAGELOG_SIZE;i++){
+ if(md->dmglog[i].id==0)
+ continue;
+ tmpsd[i] = map_id2sd(md->dmglog[i].id);
+ if(tmpsd[i] == NULL)
+ continue;
+ count++;
+ if(tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i]))
+ continue;
+
+ tdmg += (double)md->dmglog[i].dmg;
+ if(mvp_damage<md->dmglog[i].dmg){
+ third_sd = second_sd;
+ second_sd = mvp_sd;
+ mvp_sd=tmpsd[i];
+ mvp_damage=md->dmglog[i].dmg;
+ }
+ }
+
+ // [MouseJstr]
+ if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) {
+
+ if((double)max_hp < tdmg)
+ dmg_rate = ((double)max_hp) / tdmg;
+ else dmg_rate = 1;
+
+ // ŒoŒ±’l‚Ì•ª”z
+ for(i=0;i<DAMAGELOG_SIZE;i++){
+ int pid,base_exp,job_exp,flag=1;
+ double per;
+ struct party *p;
+ if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m)
+ continue;
+/* jAthena's exp formula
+ per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
+ temp = ((double)mob_db[md->class].base_exp * (double)battle_config.base_exp_rate / 100. * per);
+ base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
+ if(mob_db[md->class].base_exp > 0 && base_exp < 1) base_exp = 1;
+ if(base_exp < 0) base_exp = 0;
+ temp = ((double)mob_db[md->class].job_exp * (double)battle_config.job_exp_rate / 100. * per);
+ job_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
+ if(mob_db[md->class].job_exp > 0 && job_exp < 1) job_exp = 1;
+ if(job_exp < 0) job_exp = 0;
+*/
+//eAthena's exp formula rather than jAthena's
+ per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp;
+ if(per>512) per=512;
+ if(per<1) per=1;
+ base_exp=mob_db[md->class].base_exp*per/256;
+ if(base_exp < 1) base_exp = 1;
+ if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) {
+ base_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris]
+ }
+ if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) base_exp = 0; // Added [Valaris]
+ job_exp=mob_db[md->class].job_exp*per/256;
+ if(job_exp < 1) job_exp = 1;
+ if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) {
+ job_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris]
+ }
+ if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) job_exp = 0; // Added [Valaris]
+
+ if((pid=tmpsd[i]->status.party_id)>0){ // ƒp[ƒeƒB‚É“ü‚Á‚Ä‚¢‚é
+ int j=0;
+ for(j=0;j<pnum;j++) // Œö•½ƒp[ƒeƒBƒŠƒXƒg‚É‚¢‚é‚©‚Ç‚¤‚©
+ if(pt[j].id==pid)
+ break;
+ if(j==pnum){ // ‚¢‚È‚¢‚Æ‚«‚ÍŒö•½‚©‚Ç‚¤‚©Šm”F
+ if((p=party_search(pid))!=NULL && p->exp!=0){
+ pt[pnum].id=pid;
+ pt[pnum].p=p;
+ pt[pnum].base_exp=base_exp;
+ pt[pnum].job_exp=job_exp;
+ pnum++;
+ flag=0;
+ }
+ }else{ // ‚¢‚é‚Æ‚«‚ÍŒö•½
+ pt[j].base_exp+=base_exp;
+ pt[j].job_exp+=job_exp;
+ flag=0;
+ }
+ }
+ if(flag) // ŠeŽ©Š“¾
+ pc_gainexp(tmpsd[i],base_exp,job_exp);
+ }
+ // Œö•½•ª”z
+ for(i=0;i<pnum;i++)
+ party_exp_share(pt[i].p,md->bl.m,pt[i].base_exp,pt[i].job_exp);
+
+ // item drop
+ if(!(type&1)) {
+ int log_item[8] = {0};
+ for(i=0;i<8;i++){
+ struct delay_item_drop *ditem;
+ int drop_rate;
+
+ if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) // Added [Valaris]
+ break; // End
+
+ if(mob_db[md->class].dropitem[i].nameid <= 0)
+ continue;
+ drop_rate = mob_db[md->class].dropitem[i].p;
+ if(drop_rate <= 0 && battle_config.drop_rate0item)
+ drop_rate = 1;
+ if(battle_config.drops_by_luk>0 && sd && md) drop_rate+=(sd->status.luk*battle_config.drops_by_luk)/100; // drops affected by luk [Valaris]
+ if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) drop_rate*=1.25; // pk_mode increase drops if 20 level difference [Valaris]
+ if(drop_rate <= rand()%10000)
+ continue;
+
+ ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
+ ditem->nameid = mob_db[md->class].dropitem[i].nameid;
+ log_item[i] = ditem->nameid;
+ ditem->amount = 1;
+ ditem->m = md->bl.m;
+ ditem->x = md->bl.x;
+ ditem->y = md->bl.y;
+ ditem->first_sd = mvp_sd;
+ ditem->second_sd = second_sd;
+ ditem->third_sd = third_sd;
+ add_timer(tick+500+i,mob_delay_item_drop,(int)ditem,0);
+ }
+
+ #ifndef TXT_ONLY
+ if(log_config.drop > 0)
+ log_drop(mvp_sd, md->class, log_item);
+ #endif
+
+ if(sd && sd->state.attack_type == BF_WEAPON) {
+ for(i=0;i<sd->monster_drop_item_count;i++) {
+ struct delay_item_drop *ditem;
+ int race = battle_get_race(&md->bl);
+ if(sd->monster_drop_itemid[i] <= 0)
+ continue;
+ if(sd->monster_drop_race[i] & (1<<race) ||
+ (mob_db[md->class].mode & 0x20 && sd->monster_drop_race[i] & 1<<10) ||
+ (!(mob_db[md->class].mode & 0x20) && sd->monster_drop_race[i] & 1<<11) ) {
+ if(sd->monster_drop_itemrate[i] <= rand()%10000)
+ continue;
+
+ ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop));
+ ditem->nameid = sd->monster_drop_itemid[i];
+ ditem->amount = 1;
+ ditem->m = md->bl.m;
+ ditem->x = md->bl.x;
+ ditem->y = md->bl.y;
+ ditem->first_sd = mvp_sd;
+ ditem->second_sd = second_sd;
+ ditem->third_sd = third_sd;
+ add_timer(tick+520+i,mob_delay_item_drop,(int)ditem,0);
+ }
+ }
+ if(sd->get_zeny_num > 0)
+ pc_getzeny(sd,mob_db[md->class].lv*10 + rand()%(sd->get_zeny_num+1));
+ }
+ if(md->lootitem) {
+ for(i=0;i<md->lootitem_count;i++) {
+ struct delay_item_drop2 *ditem;
+
+ ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
+ memcpy(&ditem->item_data,&md->lootitem[i],sizeof(md->lootitem[0]));
+ ditem->m = md->bl.m;
+ ditem->x = md->bl.x;
+ ditem->y = md->bl.y;
+ ditem->first_sd = mvp_sd;
+ ditem->second_sd = second_sd;
+ ditem->third_sd = third_sd;
+ add_timer(tick+540+i,mob_delay_item_drop2,(int)ditem,0);
+ }
+ }
+ }
+
+ // mvpˆ—
+ if(mvp_sd && mob_db[md->class].mexp > 0 ){
+ int log_mvp[2] = {0};
+ int j;
+ int mexp;
+ temp = ((double)mob_db[md->class].mexp * (double)battle_config.mvp_exp_rate * (9.+(double)count)/1000.);
+ mexp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
+ if(mexp < 1) mexp = 1;
+ clif_mvp_effect(mvp_sd); // ƒGƒtƒFƒNƒg
+ clif_mvp_exp(mvp_sd,mexp);
+ pc_gainexp(mvp_sd,mexp,0);
+ log_mvp[1] = mexp;
+ for(j=0;j<3;j++){
+ i = rand() % 3;
+ if(mob_db[md->class].mvpitem[i].nameid <= 0)
+ continue;
+ drop_rate = mob_db[md->class].mvpitem[i].p;
+ if(drop_rate <= 0 && battle_config.drop_rate0item)
+ drop_rate = 1;
+ if(drop_rate < battle_config.item_drop_mvp_min)
+ drop_rate = battle_config.item_drop_mvp_min;
+ if(drop_rate > battle_config.item_drop_mvp_max)
+ drop_rate = battle_config.item_drop_mvp_max;
+ if(drop_rate <= rand()%10000)
+ continue;
+ memset(&item,0,sizeof(item));
+ item.nameid=mob_db[md->class].mvpitem[i].nameid;
+ item.identify=!itemdb_isequip3(item.nameid);
+ clif_mvp_item(mvp_sd,item.nameid);
+ log_mvp[0] = item.nameid;
+ if(mvp_sd->weight*2 > mvp_sd->max_weight)
+ map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
+ else if((ret = pc_additem(mvp_sd,&item,1))) {
+ clif_additem(sd,0,0,ret);
+ map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1);
+ }
+ break;
+ }
+ #ifndef TXT_ONLY
+ if(log_config.mvpdrop > 0)
+ log_mvpdrop(mvp_sd, md->class, log_mvp);
+ #endif
+ }
+
+ } // [MouseJstr]
+
+ // <Agit> NPC Event [OnAgitBreak]
+ if(md->npc_event[0] && strcmp(((md->npc_event)+strlen(md->npc_event)-13),"::OnAgitBreak") == 0) {
+ printf("MOB.C: Run NPC_Event[OnAgitBreak].\n");
+ if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak]
+ guild_agit_break(md);
+ }
+
+ // SCRIPTŽÀs
+ if(md->npc_event[0]){
+// if(battle_config.battle_log)
+// printf("mob_damage : run event : %s\n",md->npc_event);
+ if(src && src->type == BL_PET)
+ sd = ((struct pet_data *)src)->msd;
+ if(sd == NULL) {
+ if(mvp_sd != NULL)
+ sd = mvp_sd;
+ else {
+ struct map_session_data *tmpsd;
+ int i;
+ for(i=0;i<fd_max;i++){
+ if(session[i] && (tmpsd=session[i]->session_data) && tmpsd->state.auth) {
+ if(md->bl.m == tmpsd->bl.m) {
+ sd = tmpsd;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if(sd)
+ npc_event(sd,md->npc_event,0);
+ }
+
+ clif_clearchar_area(&md->bl,1);
+ map_delblock(&md->bl);
+ if(mob_get_viewclass(md->class) <= 1000)
+ clif_clearchar_delay(tick+3000,&md->bl,0);
+ mob_deleteslave(md);
+ mob_setdelayspawn(md->bl.id);
+ map_freeblock_unlock();
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int mob_class_change(struct mob_data *md,int *value)
+{
+ unsigned int tick = gettick();
+ int i,c,hp_rate,max_hp,class,count = 0;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, value);
+
+ if(value[0]<=1000 || value[0]>2000)
+ return 0;
+ if(md->bl.prev == NULL) return 0;
+
+ while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++;
+ if(count < 1) return 0;
+
+ class = value[rand()%count];
+ if(class<=1000 || class>2000) return 0;
+
+ max_hp = battle_get_max_hp(&md->bl);
+ hp_rate = md->hp*100/max_hp;
+ clif_mob_class_change(md,class);
+ md->class = class;
+ max_hp = battle_get_max_hp(&md->bl);
+ if(battle_config.monster_class_change_full_recover==1) {
+ md->hp = max_hp;
+ memset(md->dmglog,0,sizeof(md->dmglog));
+ }
+ else
+ md->hp = max_hp*hp_rate/100;
+ if(md->hp > max_hp) md->hp = max_hp;
+ else if(md->hp < 1) md->hp = 1;
+
+ memcpy(md->name,mob_db[class].jname,24);
+ memset(&md->state,0,sizeof(md->state));
+ md->attacked_id = 0;
+ md->target_id = 0;
+ md->move_fail_count = 0;
+
+ md->speed = mob_db[md->class].speed;
+ md->def_ele = mob_db[md->class].element;
+
+ mob_changestate(md,MS_IDLE,0);
+ skill_castcancel(&md->bl,0);
+ md->state.skillstate = MSS_IDLE;
+ md->last_thinktime = tick;
+ md->next_walktime = tick+rand()%50+5000;
+ md->attackabletime = tick;
+ md->canmove_tick = tick;
+ md->sg_count=0;
+
+ for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++)
+ md->skilldelay[i] = c;
+ md->skillid=0;
+ md->skilllv=0;
+
+ if(md->lootitem == NULL && mob_db[class].mode&0x02)
+ md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
+
+ skill_clear_unitgroup(&md->bl);
+ skill_cleartimerskill(&md->bl);
+
+ clif_clearchar_area(&md->bl,0);
+ clif_spawnmob(md);
+
+ return 0;
+}
+
+/*==========================================
+ * mob‰ñ•œ
+ *------------------------------------------
+ */
+int mob_heal(struct mob_data *md,int heal)
+{
+ int max_hp = battle_get_max_hp(&md->bl);
+
+ nullpo_retr(0, md);
+
+ md->hp += heal;
+ if( max_hp < md->hp )
+ md->hp = max_hp;
+
+ if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris]
+ struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name);
+ if(gc) {
+ if(md->bl.id==gc->GID0) gc->Ghp0=md->hp;
+ if(md->bl.id==gc->GID1) gc->Ghp1=md->hp;
+ if(md->bl.id==gc->GID2) gc->Ghp2=md->hp;
+ if(md->bl.id==gc->GID3) gc->Ghp3=md->hp;
+ if(md->bl.id==gc->GID4) gc->Ghp4=md->hp;
+ if(md->bl.id==gc->GID5) gc->Ghp5=md->hp;
+ if(md->bl.id==gc->GID6) gc->Ghp6=md->hp;
+ if(md->bl.id==gc->GID7) gc->Ghp7=md->hp;
+ }
+ } // end addition [Valaris]
+
+ return 0;
+}
+
+
+/*==========================================
+ * Added by RoVeRT
+ *------------------------------------------
+ */
+int mob_warpslave_sub(struct block_list *bl,va_list ap)
+{
+ struct mob_data *md=(struct mob_data *)bl;
+ int id,x,y;
+ id=va_arg(ap,int);
+ x=va_arg(ap,int);
+ y=va_arg(ap,int);
+ if( md->master_id==id ) {
+ mob_warp(md,-1,x,y,2);
+ }
+ return 0;
+}
+
+/*==========================================
+ * Added by RoVeRT
+ *------------------------------------------
+ */
+int mob_warpslave(struct mob_data *md,int x, int y)
+{
+//printf("warp slave\n");
+ map_foreachinarea(mob_warpslave_sub, md->bl.m,
+ x-AREA_SIZE,y-AREA_SIZE,
+ x+AREA_SIZE,y+AREA_SIZE,BL_MOB,
+ md->bl.id, md->bl.x, md->bl.y );
+ return 0;
+}
+
+/*==========================================
+ * mobƒ[ƒv
+ *------------------------------------------
+ */
+int mob_warp(struct mob_data *md,int m,int x,int y,int type)
+{
+ int i=0,c,xs=0,ys=0,bx=x,by=y;
+
+ nullpo_retr(0, md);
+
+ if( md->bl.prev==NULL )
+ return 0;
+
+ if( m<0 ) m=md->bl.m;
+
+ if(type >= 0) {
+ if(map[md->bl.m].flag.monster_noteleport)
+ return 0;
+ clif_clearchar_area(&md->bl,type);
+ }
+ skill_unit_out_all(&md->bl,gettick(),1);
+ map_delblock(&md->bl);
+
+ if(bx>0 && by>0){ // ˆÊ’uŽw’è‚ÌꇎüˆÍ‚XƒZƒ‹‚ð’Tõ
+ xs=ys=9;
+ }
+
+ while( ( x<0 || y<0 || ((c=read_gat(m,x,y))==1 || c==5) ) && (i++)<1000 ){
+ if( xs>0 && ys>0 && i<250 ){ // Žw’èˆÊ’u•t‹ß‚Ì’Tõ
+ x=bx+rand()%xs-xs/2;
+ y=by+rand()%ys-ys/2;
+ }else{ // Š®‘Sƒ‰ƒ“ƒ_ƒ€’Tõ
+ x=rand()%(map[m].xs-2)+1;
+ y=rand()%(map[m].ys-2)+1;
+ }
+ }
+ md->dir=0;
+ if(i<1000){
+ md->bl.x=md->to_x=x;
+ md->bl.y=md->to_y=y;
+ md->bl.m=m;
+ }else {
+ m=md->bl.m;
+ if(battle_config.error_log==1)
+ printf("MOB %d warp failed, class = %d\n",md->bl.id,md->class);
+ }
+
+ md->target_id=0; // ƒ^ƒQ‚ð‰ðœ‚·‚é
+ md->state.targettype=NONE_ATTACKABLE;
+ md->attacked_id=0;
+ md->state.skillstate=MSS_IDLE;
+ mob_changestate(md,MS_IDLE,0);
+
+ if(type>0 && i==1000) {
+ if(battle_config.battle_log)
+ printf("MOB %d warp to (%d,%d), class = %d\n",md->bl.id,x,y,md->class);
+ }
+
+ map_addblock(&md->bl);
+ if(type>0)
+ {
+ clif_spawnmob(md);
+ mob_warpslave(md,md->bl.x,md->bl.y);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ—p(foreachinarea)
+ *------------------------------------------
+ */
+int mob_countslave_sub(struct block_list *bl,va_list ap)
+{
+ int id,*c;
+ struct mob_data *md;
+
+ id=va_arg(ap,int);
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, c=va_arg(ap,int *));
+ nullpo_retr(0, md = (struct mob_data *)bl);
+
+
+ if( md->master_id==id )
+ (*c)++;
+ return 0;
+}
+/*==========================================
+ * ‰æ–Ê“à‚ÌŽæ‚芪‚«‚Ì”ŒvŽZ
+ *------------------------------------------
+ */
+int mob_countslave(struct mob_data *md)
+{
+ int c=0;
+
+ nullpo_retr(0, md);
+
+ map_foreachinarea(mob_countslave_sub, md->bl.m,
+ 0,0,map[md->bl.m].xs-1,map[md->bl.m].ys-1,
+ BL_MOB,md->bl.id,&c);
+ return c;
+}
+/*==========================================
+ * Žè‰ºMOB¢Š«
+ *------------------------------------------
+ */
+int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag)
+{
+ struct mob_data *md;
+ int bx,by,m,count = 0,class,k,a = amount;
+
+ nullpo_retr(0, md2);
+ nullpo_retr(0, value);
+
+ bx=md2->bl.x;
+ by=md2->bl.y;
+ m=md2->bl.m;
+
+ if(value[0]<=1000 || value[0]>2000) // ’l‚ªˆÙí‚Ȃ碊«‚ðŽ~‚ß‚é
+ return 0;
+ while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++;
+ if(count < 1) return 0;
+
+ for(k=0;k<count;k++) {
+ amount = a;
+ class = value[k];
+ if(class<=1000 || class>2000) continue;
+ for(;amount>0;amount--){
+ int x=0,y=0,c=0,i=0;
+ md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
+ if(mob_db[class].mode&0x02)
+ md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
+ else
+ md->lootitem=NULL;
+
+ while((x<=0 || y<=0 || (c=map_getcell(m,x,y))==1 || c==5 ) && (i++)<100){
+ x=rand()%9-4+bx;
+ y=rand()%9-4+by;
+ }
+ if(i>=100){
+ x=bx;
+ y=by;
+ }
+
+ mob_spawn_dataset(md,"--ja--",class);
+ md->bl.m=m;
+ md->bl.x=x;
+ md->bl.y=y;
+
+ md->m =m;
+ md->x0=x;
+ md->y0=y;
+ md->xs=0;
+ md->ys=0;
+ md->speed=md2->speed;
+ md->spawndelay1=-1; // ˆê“x‚̂݃tƒ‰ƒO
+ md->spawndelay2=-1; // ˆê“x‚̂݃tƒ‰ƒO
+
+ memset(md->npc_event,0,sizeof(md->npc_event));
+ md->bl.type=BL_MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
+ clif_skill_nodamage(&md->bl,&md->bl,(flag)? NPC_SUMMONSLAVE:NPC_SUMMONMONSTER,a,1);
+
+ if(flag)
+ md->master_id=md2->bl.id;
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é(foreachclient)
+ *------------------------------------------
+ */
+static int mob_counttargeted_sub(struct block_list *bl,va_list ap)
+{
+ int id,*c,target_lv;
+ struct block_list *src;
+
+ id=va_arg(ap,int);
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, c=va_arg(ap,int *));
+
+ src=va_arg(ap,struct block_list *);
+ target_lv=va_arg(ap,int);
+ if(id == bl->id || (src && id == src->id)) return 0;
+ if(bl->type == BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *)bl;
+ if(sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
+ (*c)++;
+ }
+ else if(bl->type == BL_MOB) {
+ struct mob_data *md = (struct mob_data *)bl;
+ if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
+ (*c)++;
+ }
+ else if(bl->type == BL_PET) {
+ struct pet_data *pd = (struct pet_data *)bl;
+ if(pd->target_id == id && pd->timer != -1 && pd->state.state == MS_ATTACK && pd->target_lv >= target_lv)
+ (*c)++;
+ }
+ return 0;
+}
+/*==========================================
+ * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éPC‚Ì”‚𔂦‚é
+ *------------------------------------------
+ */
+int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv)
+{
+ int c=0;
+
+ nullpo_retr(0, md);
+
+ map_foreachinarea(mob_counttargeted_sub, md->bl.m,
+ md->bl.x-AREA_SIZE,md->bl.y-AREA_SIZE,
+ md->bl.x+AREA_SIZE,md->bl.y+AREA_SIZE,0,md->bl.id,&c,src,target_lv);
+ return c;
+}
+
+/*==========================================
+ *MOBskill‚©‚çŠY“–skillid‚Ìskillidx‚ð•Ô‚·
+ *------------------------------------------
+ */
+int mob_skillid2skillidx(int class,int skillid)
+{
+ int i;
+ struct mob_skill *ms=mob_db[class].skill;
+
+ if(ms==NULL)
+ return -1;
+
+ for(i=0;i<mob_db[class].maxskill;i++){
+ if(ms[i].skill_id == skillid)
+ return i;
+ }
+ return -1;
+
+}
+
+//
+// MOBƒXƒLƒ‹
+//
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
+ *------------------------------------------
+ */
+int mobskill_castend_id( int tid, unsigned int tick, int id,int data )
+{
+ struct mob_data* md=NULL;
+ struct block_list *bl;
+ struct block_list *mbl;
+ int range;
+
+ if((mbl = map_id2bl(id)) == NULL ) //‰r¥‚µ‚½Mob‚ª‚à‚¤‚¢‚È‚¢‚Æ‚¢‚¤‚Ì‚Í—Ç‚­‚ ‚é³íˆ—
+ return 0;
+ if((md=(struct mob_data *)mbl) == NULL ){
+ printf("mobskill_castend_id nullpo mbl->id:%d\n",mbl->id);
+ return 0;
+ }
+
+ if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
+ return 0;
+
+ if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
+ return 0;
+
+ md->skilltimer=-1;
+ //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
+ if(md->sc_data){
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ return 0;
+ if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
+ return 0;
+ if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
+ return 0;
+ if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
+ return 0;
+ }
+ if(md->skillid != NPC_EMOTION)
+ md->last_thinktime=tick + battle_get_adelay(&md->bl);
+
+ if((bl = map_id2bl(md->skilltarget)) == NULL || bl->prev==NULL){ //ƒXƒLƒ‹ƒ^[ƒQƒbƒg‚ª‘¶Ý‚µ‚È‚¢
+ //printf("mobskill_castend_id nullpo\n");//ƒ^[ƒQƒbƒg‚ª‚¢‚È‚¢‚Æ‚«‚Ínullpo‚¶‚á‚È‚­‚Ä•’Ê‚ÉI—¹
+ return 0;
+ }
+ if(md->bl.m != bl->m)
+ return 0;
+
+ if(md->skillid == PR_LEXAETERNA) {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)))
+ return 0;
+ }
+ else if(md->skillid == RG_BACKSTAP) {
+ int dir = map_calc_dir(&md->bl,bl->x,bl->y),t_dir = battle_get_dir(bl);
+ int dist = distance(md->bl.x,md->bl.y,bl->x,bl->y);
+ if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir)))
+ return 0;
+ }
+ if( ( (skill_get_inf(md->skillid)&1) || (skill_get_inf2(md->skillid)&4) ) && // ”Þ‰ä“G‘Ί֌Wƒ`ƒFƒbƒN
+ battle_check_target(&md->bl,bl, BCT_ENEMY)<=0 )
+ return 0;
+ range = skill_get_range(md->skillid,md->skilllv);
+ if(range < 0)
+ range = battle_get_range(&md->bl) - (range + 1);
+ if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,bl->x,bl->y))
+ return 0;
+
+ md->skilldelay[md->skillidx]=tick;
+
+ if(battle_config.mob_skill_log)
+ printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
+ mob_stop_walking(md,0);
+
+ switch( skill_get_nk(md->skillid) )
+ {
+ // UŒ‚Œn/‚«”ò‚΂µŒn
+ case 0: case 2:
+ skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
+ break;
+ case 1:// Žx‰‡Œn
+ if(!mob_db[md->class].skill[md->skillidx].val[0] &&
+ (md->skillid==AL_HEAL || (md->skillid==ALL_RESURRECTION && bl->type != BL_PC)) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) )
+ skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
+ else
+ skill_castend_nodamage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0);
+ break;
+ }
+
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
+ *------------------------------------------
+ */
+int mobskill_castend_pos( int tid, unsigned int tick, int id,int data )
+{
+ struct mob_data* md=NULL;
+ struct block_list *bl;
+ int range,maxcount;
+
+ //mobskill_castend_id“¯—l‰r¥‚µ‚½Mob‚ª‰r¥Š®—¹Žž‚É‚à‚¤‚¢‚È‚¢‚Æ‚¢‚¤‚Ì‚Í‚ ‚è‚»‚¤‚È‚Ì‚Ånullpo‚©‚眊O
+ if((bl=map_id2bl(id))==NULL)
+ return 0;
+
+ nullpo_retr(0, md=(struct mob_data *)bl);
+
+ if( md->bl.type!=BL_MOB || md->bl.prev==NULL )
+ return 0;
+
+ if( md->skilltimer != tid ) // ƒ^ƒCƒ}ID‚ÌŠm”F
+ return 0;
+
+ md->skilltimer=-1;
+ if(md->sc_data){
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ return 0;
+ if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
+ return 0;
+ if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
+ return 0;
+ if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
+ return 0;
+ }
+
+ if(battle_config.monster_skill_reiteration == 0) {
+ range = -1;
+ switch(md->skillid) {
+ case MG_SAFETYWALL:
+ case WZ_FIREPILLAR:
+ case HT_SKIDTRAP:
+ case HT_LANDMINE:
+ case HT_ANKLESNARE:
+ case HT_SHOCKWAVE:
+ case HT_SANDMAN:
+ case HT_FLASHER:
+ case HT_FREEZINGTRAP:
+ case HT_BLASTMINE:
+ case HT_CLAYMORETRAP:
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
+ range = 0;
+ break;
+ case AL_PNEUMA:
+ case AL_WARP:
+ range = 1;
+ break;
+ }
+ if(range >= 0) {
+ if(skill_check_unit_range(md->bl.m,md->skillx,md->skilly,range,md->skillid) > 0)
+ return 0;
+ }
+ }
+ if(battle_config.monster_skill_nofootset) {
+ range = -1;
+ switch(md->skillid) {
+ case WZ_FIREPILLAR:
+ case HT_SKIDTRAP:
+ case HT_LANDMINE:
+ case HT_ANKLESNARE:
+ case HT_SHOCKWAVE:
+ case HT_SANDMAN:
+ case HT_FLASHER:
+ case HT_FREEZINGTRAP:
+ case HT_BLASTMINE:
+ case HT_CLAYMORETRAP:
+ case AM_DEMONSTRATION:
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
+ range = 1;
+ break;
+ case AL_WARP:
+ range = 0;
+ break;
+ }
+ if(range >= 0) {
+ if(skill_check_unit_range2(md->bl.m,md->skillx,md->skilly,range) > 0)
+ return 0;
+ }
+ }
+
+ if(battle_config.monster_land_skill_limit) {
+ maxcount = skill_get_maxcount(md->skillid);
+ if(maxcount > 0) {
+ int i,c;
+ for(i=c=0;i<MAX_MOBSKILLUNITGROUP;i++) {
+ if(md->skillunit[i].alive_count > 0 && md->skillunit[i].skill_id == md->skillid)
+ c++;
+ }
+ if(c >= maxcount)
+ return 0;
+ }
+ }
+
+ range = skill_get_range(md->skillid,md->skilllv);
+ if(range < 0)
+ range = battle_get_range(&md->bl) - (range + 1);
+ if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,md->skillx,md->skilly))
+ return 0;
+ md->skilldelay[md->skillidx]=tick;
+
+ if(battle_config.mob_skill_log)
+ printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class);
+ mob_stop_walking(md,0);
+
+ skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0);
+
+ return 0;
+}
+
+
+/*==========================================
+ * Skill use (an aria start, ID specification)
+ *------------------------------------------
+ */
+int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx)
+{
+ int casttime,range;
+ struct mob_skill *ms;
+ int skill_id, skill_lv, forcecast = 0;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]);
+
+ if( target==NULL && (target=map_id2bl(md->target_id))==NULL )
+ return 0;
+
+ if( target->prev==NULL || md->bl.prev==NULL )
+ return 0;
+
+ skill_id=ms->skill_id;
+ skill_lv=ms->skill_lv;
+
+ // ’¾–Ù‚âˆÙí
+ if(md->sc_data){
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ return 0;
+ if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
+ return 0;
+ if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
+ return 0;
+ if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
+ return 0;
+ }
+
+ if(md->option&4 && skill_id==TF_HIDING)
+ return 0;
+ if(md->option&2 && skill_id!=TF_HIDING && skill_id!=AS_GRIMTOOTH && skill_id!=RG_BACKSTAP && skill_id!=RG_RAID)
+ return 0;
+
+ if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP ||
+ skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING))
+ return 0;
+
+ if(skill_get_inf2(skill_id)&0x200 && md->bl.id == target->id)
+ return 0;
+
+ // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
+ range = skill_get_range(skill_id,skill_lv);
+ if(range < 0)
+ range = battle_get_range(&md->bl) - (range + 1);
+ if(!battle_check_range(&md->bl,target,range))
+ return 0;
+
+// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) );
+
+ casttime=skill_castfix(&md->bl,ms->casttime);
+ md->state.skillcastcancel=ms->cancel;
+ md->skilldelay[skill_idx]=gettick();
+
+ switch(skill_id){ /* ‰½‚©“ÁŽê‚Ȉ—‚ª•K—v */
+ case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
+ if(target->type != BL_PC && battle_check_undead(battle_get_race(target),battle_get_elem_type(target))){ /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
+ forcecast=1; /* ƒ^[ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
+ casttime=skill_castfix(&md->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) );
+ }
+ break;
+ case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
+ case SA_MAGICROD:
+ case SA_SPELLBREAKER:
+ forcecast=1;
+ break;
+ }
+
+ if(battle_config.mob_skill_log)
+ printf("MOB skill use target_id=%d skill=%d lv=%d cast=%d, class = %d\n",target->id,skill_id,skill_lv,casttime,md->class);
+
+ if(casttime>0 || forcecast){ // ‰r¥‚ª•K—v
+// struct mob_data *md2;
+ clif_skillcasting( &md->bl,
+ md->bl.id, target->id, 0,0, skill_id,casttime);
+
+ // ‰r¥”½‰žƒ‚ƒ“ƒXƒ^[
+/* if( target->type==BL_MOB && mob_db[(md2=(struct mob_data *)target)->class].mode&0x10 &&
+ md2->state.state!=MS_ATTACK){
+ md2->target_id=md->bl.id;
+ md->state.targettype = ATTACKABLE;
+ md2->min_chase=13;
+ }*/
+ }
+
+ if( casttime<=0 ) // ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢
+ md->state.skillcastcancel=0;
+
+ md->skilltarget = target->id;
+ md->skillx = 0;
+ md->skilly = 0;
+ md->skillid = skill_id;
+ md->skilllv = skill_lv;
+ md->skillidx = skill_idx;
+
+ if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING)
+ skill_status_change_end(&md->bl,SC_CLOAKING,-1);
+
+ if( casttime>0 ){
+ md->skilltimer =
+ add_timer( gettick()+casttime, mobskill_castend_id, md->bl.id, 0 );
+ }else{
+ md->skilltimer = -1;
+ mobskill_castend_id(md->skilltimer,gettick(),md->bl.id, 0);
+ }
+
+ return 1;
+}
+/*==========================================
+ * ƒXƒLƒ‹Žg—piꊎw’èj
+ *------------------------------------------
+ */
+int mobskill_use_pos( struct mob_data *md,
+ int skill_x, int skill_y, int skill_idx)
+{
+ int casttime=0,range;
+ struct mob_skill *ms;
+ struct block_list bl;
+ int skill_id, skill_lv;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]);
+
+ if( md->bl.prev==NULL )
+ return 0;
+
+ skill_id=ms->skill_id;
+ skill_lv=ms->skill_lv;
+
+ //’¾–Ù‚âó‘ÔˆÙí‚È‚Ç
+ if(md->sc_data){
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ return 0;
+ if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //ƒI[ƒgƒJƒEƒ“ƒ^[
+ return 0;
+ if(md->sc_data[SC_BLADESTOP].timer != -1) //”’nŽæ‚è
+ return 0;
+ if(md->sc_data[SC_BERSERK].timer != -1) //ƒo[ƒT[ƒN
+ return 0;
+ }
+
+ if(md->option&2)
+ return 0;
+
+ if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP ||
+ skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING))
+ return 0;
+
+ // ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN
+ bl.type = BL_NUL;
+ bl.m = md->bl.m;
+ bl.x = skill_x;
+ bl.y = skill_y;
+ range = skill_get_range(skill_id,skill_lv);
+ if(range < 0)
+ range = battle_get_range(&md->bl) - (range + 1);
+ if(!battle_check_range(&md->bl,&bl,range))
+ return 0;
+
+// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) );
+ casttime=skill_castfix(&md->bl,ms->casttime);
+ md->skilldelay[skill_idx]=gettick();
+ md->state.skillcastcancel=ms->cancel;
+
+ if(battle_config.mob_skill_log)
+ printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n",
+ skill_x,skill_y,skill_id,skill_lv,casttime,md->class);
+
+ if( casttime>0 ) // A cast time is required.
+ clif_skillcasting( &md->bl,
+ md->bl.id, 0, skill_x,skill_y, skill_id,casttime);
+
+ if( casttime<=0 ) // A skill without a cast time wont be cancelled.
+ md->state.skillcastcancel=0;
+
+
+ md->skillx = skill_x;
+ md->skilly = skill_y;
+ md->skilltarget = 0;
+ md->skillid = skill_id;
+ md->skilllv = skill_lv;
+ md->skillidx = skill_idx;
+ if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1)
+ skill_status_change_end(&md->bl,SC_CLOAKING,-1);
+ if( casttime>0 ){
+ md->skilltimer =
+ add_timer( gettick()+casttime, mobskill_castend_pos, md->bl.id, 0 );
+ }else{
+ md->skilltimer = -1;
+ mobskill_castend_pos(md->skilltimer,gettick(),md->bl.id, 0);
+ }
+
+ return 1;
+}
+
+
+/*==========================================
+ * Friendly Mob whose HP is decreasing by a nearby MOB is looked for.
+ *------------------------------------------
+ */
+int mob_getfriendhpltmaxrate_sub(struct block_list *bl,va_list ap)
+{
+ int rate;
+ struct mob_data **fr, *md, *mmd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
+
+ md=(struct mob_data *)bl;
+
+ if( mmd->bl.id == bl->id )
+ return 0;
+ rate=va_arg(ap,int);
+ fr=va_arg(ap,struct mob_data **);
+ if( md->hp < mob_db[md->class].max_hp*rate/100 )
+ (*fr)=md;
+ return 0;
+}
+struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md,int rate)
+{
+ struct mob_data *fr=NULL;
+ const int r=8;
+
+ nullpo_retr(NULL, md);
+
+ map_foreachinarea(mob_getfriendhpltmaxrate_sub, md->bl.m,
+ md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
+ BL_MOB,md,rate,&fr);
+ return fr;
+}
+/*==========================================
+ * What a status state suits by nearby MOB is looked for.
+ *------------------------------------------
+ */
+int mob_getfriendstatus_sub(struct block_list *bl,va_list ap)
+{
+ int cond1,cond2;
+ struct mob_data **fr, *md, *mmd;
+ int flag=0;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md=(struct mob_data *)bl);
+ nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
+
+ if( mmd->bl.id == bl->id )
+ return 0;
+ cond1=va_arg(ap,int);
+ cond2=va_arg(ap,int);
+ fr=va_arg(ap,struct mob_data **);
+ if( cond2==-1 ){
+ int j;
+ for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
+ flag=(md->sc_data[j].timer!=-1 );
+ }
+ }else
+ flag=( md->sc_data[cond2].timer!=-1 );
+ if( flag^( cond1==MSC_FRIENDSTATUSOFF ) )
+ (*fr)=md;
+
+ return 0;
+}
+struct mob_data *mob_getfriendstatus(struct mob_data *md,int cond1,int cond2)
+{
+ struct mob_data *fr=NULL;
+ const int r=8;
+
+ nullpo_retr(0, md);
+
+ map_foreachinarea(mob_getfriendstatus_sub, md->bl.m,
+ md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r,
+ BL_MOB,md,cond1,cond2,&fr);
+ return fr;
+}
+
+/*==========================================
+ * Skill use judging
+ *------------------------------------------
+ */
+int mobskill_use(struct mob_data *md,unsigned int tick,int event)
+{
+ struct mob_skill *ms;
+// struct block_list *target=NULL;
+ int i,max_hp;
+
+ nullpo_retr(0, md);
+ nullpo_retr(0, ms = mob_db[md->class].skill);
+
+ max_hp = battle_get_max_hp(&md->bl);
+
+ if(battle_config.mob_skill_use == 0 || md->skilltimer != -1)
+ return 0;
+
+ if(md->state.special_mob_ai)
+ return 0;
+
+ if(md->sc_data[SC_SELFDESTRUCTION].timer!=-1) //Ž©”š’†‚̓XƒLƒ‹‚ðŽg‚í‚È‚¢
+ return 0;
+
+ for(i=0;i<mob_db[md->class].maxskill;i++){
+ int c2=ms[i].cond2,flag=0;
+ struct mob_data *fmd=NULL;
+
+ // ƒfƒBƒŒƒC’†
+ if( DIFF_TICK(tick,md->skilldelay[i])<ms[i].delay )
+ continue;
+
+ // ó‘Ô”»’è
+ if( ms[i].state>=0 && ms[i].state!=md->state.skillstate )
+ continue;
+
+ // ðŒ”»’è
+ flag=(event==ms[i].cond1);
+ if(!flag){
+ switch( ms[i].cond1 ){
+ case MSC_ALWAYS:
+ flag=1; break;
+ case MSC_MYHPLTMAXRATE: // HP< maxhp%
+ flag=( md->hp < max_hp*c2/100 ); break;
+ case MSC_MYSTATUSON: // status[num] on
+ case MSC_MYSTATUSOFF: // status[num] off
+ if( ms[i].cond2==-1 ){
+ int j;
+ for(j=SC_STONE;j<=SC_BLIND && !flag;j++){
+ flag=(md->sc_data[j].timer!=-1 );
+ }
+ }else
+ flag=( md->sc_data[ms[i].cond2].timer!=-1 );
+ flag^=( ms[i].cond1==MSC_MYSTATUSOFF ); break;
+ case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp%
+ flag=(( fmd=mob_getfriendhpltmaxrate(md,ms[i].cond2) )!=NULL ); break;
+ case MSC_FRIENDSTATUSON: // friend status[num] on
+ case MSC_FRIENDSTATUSOFF: // friend status[num] off
+ flag=(( fmd=mob_getfriendstatus(md,ms[i].cond1,ms[i].cond2) )!=NULL ); break;
+ case MSC_SLAVELT: // slave < num
+ flag=( mob_countslave(md) < c2 ); break;
+ case MSC_ATTACKPCGT: // attack pc > num
+ flag=( mob_counttargeted(md,NULL,0) > c2 ); break;
+ case MSC_SLAVELE: // slave <= num
+ flag=( mob_countslave(md) <= c2 ); break;
+ case MSC_ATTACKPCGE: // attack pc >= num
+ flag=( mob_counttargeted(md,NULL,0) >= c2 ); break;
+ case MSC_SKILLUSED: // specificated skill used
+ flag=( (event&0xffff)==MSC_SKILLUSED && ((event>>16)==c2 || c2==0)); break;
+ }
+ }
+
+ // Šm—¦”»’è
+ if( flag && rand()%10000 < ms[i].permillage ){
+
+ if( skill_get_inf(ms[i].skill_id)&2 ){
+ // ꊎw’è
+ struct block_list *bl = NULL;
+ int x=0,y=0;
+ if( ms[i].target<=MST_AROUND ){
+ bl= ((ms[i].target==MST_TARGET || ms[i].target==MST_AROUND5)? map_id2bl(md->target_id):
+ (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
+ if(bl!=NULL){
+ x=bl->x; y=bl->y;
+ }
+ }
+ if( x<=0 || y<=0 )
+ continue;
+ // Ž©•ª‚ÌŽüˆÍ
+ if( ms[i].target>=MST_AROUND1 ){
+ int bx=x, by=y, i=0, c, m=bl->m, r=ms[i].target-MST_AROUND1;
+ do{
+ bx=x + rand()%(r*2+3) - r;
+ by=y + rand()%(r*2+3) - r;
+ }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
+ ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000);
+ if(i<1000){
+ x=bx; y=by;
+ }
+ }
+ // ‘ŠŽè‚ÌŽüˆÍ
+ if( ms[i].target>=MST_AROUND5 ){
+ int bx=x, by=y, i=0, c, m=bl->m, r=(ms[i].target-MST_AROUND5)+1;
+ do{
+ bx=x + rand()%(r*2+1) - r;
+ by=y + rand()%(r*2+1) - r;
+ }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys ||
+ ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000);
+ if(i<1000){
+ x=bx; y=by;
+ }
+ }
+ if(!mobskill_use_pos(md,x,y,i))
+ return 0;
+
+ }else{
+ // IDŽw’è
+ if( ms[i].target<=MST_FRIEND ){
+ struct block_list *bl = NULL;
+ bl= ((ms[i].target==MST_TARGET)? map_id2bl(md->target_id):
+ (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl);
+ if(bl && !mobskill_use_id(md,bl,i))
+ return 0;
+ }
+ }
+ if(ms[i].emotion >= 0)
+ clif_emotion(&md->bl,ms[i].emotion);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+/*==========================================
+ * Skill use event processing
+ *------------------------------------------
+ */
+int mobskill_event(struct mob_data *md,int flag)
+{
+ nullpo_retr(0, md);
+
+ if(flag==-1 && mobskill_use(md,gettick(),MSC_CASTTARGETED))
+ return 1;
+ if( (flag&BF_SHORT) && mobskill_use(md,gettick(),MSC_CLOSEDATTACKED))
+ return 1;
+ if( (flag&BF_LONG) && mobskill_use(md,gettick(),MSC_LONGRANGEATTACKED))
+ return 1;
+ return 0;
+}
+/*==========================================
+ * Mob‚ªƒGƒ“ƒyƒŠƒEƒ€‚È‚Ç‚Ìꇂ̔»’è
+ *------------------------------------------
+ */
+int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl)
+{
+ struct mob_data *md=NULL;
+
+ nullpo_retr(0,sd);
+ nullpo_retr(0,bl);
+
+ if(bl->type==BL_MOB && (md=(struct mob_data *)bl) &&
+ (md->class == 1288 || md->class == 1287 || md->class == 1286 || md->class == 1285))
+ {
+ struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
+ struct guild *g=guild_search(sd->status.guild_id);
+
+ if(g == NULL && md->class == 1288)
+ return 0;//ƒMƒ‹ƒh–¢‰Á“ü‚È‚çƒ_ƒ[ƒW–³‚µ
+ else if(gc != NULL && !map[sd->bl.m].flag.gvg)
+ return 0;//Ô“à‚ÅGv‚¶‚á‚È‚¢‚Æ‚«‚̓_ƒ[ƒW‚È‚µ
+ else if(g && gc != NULL && g->guild_id == gc->guild_id)
+ return 0;//Ž©è—̃Mƒ‹ƒh‚̃Gƒ“ƒy‚È‚çƒ_ƒ[ƒW–³‚µ
+ else if(g && guild_checkskill(g,GD_APPROVAL) <= 0 && md->class == 1288)
+ return 0;//³‹KƒMƒ‹ƒh³”F‚ª‚È‚¢‚ƃ_ƒ[ƒW–³‚µ
+
+ }
+
+ return 1;
+}
+/*==========================================
+ * ƒXƒLƒ‹—pƒ^ƒCƒ}[íœ
+ *------------------------------------------
+ */
+int mobskill_deltimer(struct mob_data *md )
+{
+ nullpo_retr(0, md);
+
+ if( md->skilltimer!=-1 ){
+ if( skill_get_inf( md->skillid )&2 )
+ delete_timer( md->skilltimer, mobskill_castend_pos );
+ else
+ delete_timer( md->skilltimer, mobskill_castend_id );
+ md->skilltimer=-1;
+ }
+ return 0;
+}
+//
+// ‰Šú‰»
+//
+/*==========================================
+ * Since un-setting [ mob ] up was used, it is an initial provisional value setup.
+ *------------------------------------------
+ */
+static int mob_makedummymobdb(int class)
+{
+ int i;
+
+ sprintf(mob_db[class].name,"mob%d",class);
+ sprintf(mob_db[class].jname,"mob%d",class);
+ mob_db[class].lv=1;
+ mob_db[class].max_hp=1000;
+ mob_db[class].max_sp=1;
+ mob_db[class].base_exp=2;
+ mob_db[class].job_exp=1;
+ mob_db[class].range=1;
+ mob_db[class].atk1=7;
+ mob_db[class].atk2=10;
+ mob_db[class].def=0;
+ mob_db[class].mdef=0;
+ mob_db[class].str=1;
+ mob_db[class].agi=1;
+ mob_db[class].vit=1;
+ mob_db[class].int_=1;
+ mob_db[class].dex=6;
+ mob_db[class].luk=2;
+ mob_db[class].range2=10;
+ mob_db[class].range3=10;
+ mob_db[class].size=0;
+ mob_db[class].race=0;
+ mob_db[class].element=0;
+ mob_db[class].mode=0;
+ mob_db[class].speed=300;
+ mob_db[class].adelay=1000;
+ mob_db[class].amotion=500;
+ mob_db[class].dmotion=500;
+ mob_db[class].dropitem[0].nameid=909; // Jellopy
+ mob_db[class].dropitem[0].p=1000;
+ for(i=1;i<8;i++){
+ mob_db[class].dropitem[i].nameid=0;
+ mob_db[class].dropitem[i].p=0;
+ }
+ // Item1,Item2
+ mob_db[class].mexp=0;
+ mob_db[class].mexpper=0;
+ for(i=0;i<3;i++){
+ mob_db[class].mvpitem[i].nameid=0;
+ mob_db[class].mvpitem[i].p=0;
+ }
+ for(i=0;i<MAX_RANDOMMONSTER;i++)
+ mob_db[class].summonper[i]=0;
+ return 0;
+}
+
+/*==========================================
+ * db/mob_db.txt reading
+ *------------------------------------------
+ */
+static int mob_readdb(void)
+{
+ FILE *fp;
+ char line[1024];
+ char *filename[]={ "db/mob_db.txt","db/mob_db2.txt" };
+ int i;
+
+ memset(mob_db,0,sizeof(mob_db));
+
+ for(i=0;i<2;i++){
+
+ fp=fopen(filename[i],"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ int class,i;
+ char *str[55],*p,*np;
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ for(i=0,p=line;i<55;i++){
+ if((np=strchr(p,','))!=NULL){
+ str[i]=p;
+ *np=0;
+ p=np+1;
+ } else
+ str[i]=p;
+ }
+
+ class=atoi(str[0]);
+ if(class<=1000 || class>2000)
+ continue;
+
+ mob_db[class].view_class=class;
+ memcpy(mob_db[class].name,str[1],24);
+ memcpy(mob_db[class].jname,str[2],24);
+ mob_db[class].lv=atoi(str[3]);
+ mob_db[class].max_hp=atoi(str[4]);
+ mob_db[class].max_sp=atoi(str[5]);
+
+ mob_db[class].base_exp=atoi(str[6]);
+ if(mob_db[class].base_exp < 0)
+ mob_db[class].base_exp = 0;
+ else if(mob_db[class].base_exp > 0 && (mob_db[class].base_exp*battle_config.base_exp_rate/100 > 1000000000 ||
+ mob_db[class].base_exp*battle_config.base_exp_rate/100 < 0))
+ mob_db[class].base_exp=1000000000;
+ else
+ mob_db[class].base_exp*= battle_config.base_exp_rate/100;
+
+ mob_db[class].job_exp=atoi(str[7]);
+ if(mob_db[class].job_exp < 0)
+ mob_db[class].job_exp = 0;
+ else if(mob_db[class].job_exp > 0 && (mob_db[class].job_exp*battle_config.job_exp_rate/100 > 1000000000 ||
+ mob_db[class].job_exp*battle_config.job_exp_rate/100 < 0))
+ mob_db[class].job_exp=1000000000;
+ else
+ mob_db[class].job_exp*=battle_config.job_exp_rate/100;
+
+ mob_db[class].range=atoi(str[8]);
+ mob_db[class].atk1=atoi(str[9]);
+ mob_db[class].atk2=atoi(str[10]);
+ mob_db[class].def=atoi(str[11]);
+ mob_db[class].mdef=atoi(str[12]);
+ mob_db[class].str=atoi(str[13]);
+ mob_db[class].agi=atoi(str[14]);
+ mob_db[class].vit=atoi(str[15]);
+ mob_db[class].int_=atoi(str[16]);
+ mob_db[class].dex=atoi(str[17]);
+ mob_db[class].luk=atoi(str[18]);
+ mob_db[class].range2=atoi(str[19]);
+ mob_db[class].range3=atoi(str[20]);
+ mob_db[class].size=atoi(str[21]);
+ mob_db[class].race=atoi(str[22]);
+ mob_db[class].element=atoi(str[23]);
+ mob_db[class].mode=atoi(str[24]);
+ mob_db[class].speed=atoi(str[25]);
+ mob_db[class].adelay=atoi(str[26]);
+ mob_db[class].amotion=atoi(str[27]);
+ mob_db[class].dmotion=atoi(str[28]);
+
+ for(i=0;i<8;i++){
+ int rate = 0,type,ratemin,ratemax;
+ mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]);
+ type = itemdb_type(mob_db[class].dropitem[i].nameid);
+ if (type == 0) { // Added [Valaris]
+ rate = battle_config.item_rate_heal;
+ ratemin = battle_config.item_drop_heal_min;
+ ratemax = battle_config.item_drop_heal_max;
+ }
+ else if (type == 2) {
+ rate = battle_config.item_rate_use;
+ ratemin = battle_config.item_drop_use_min;
+ ratemax = battle_config.item_drop_use_max; // End
+ }
+ else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
+ rate = battle_config.item_rate_equip;
+ ratemin = battle_config.item_drop_equip_min;
+ ratemax = battle_config.item_drop_equip_max;
+ }
+ else if (type == 6) {
+ rate = battle_config.item_rate_card;
+ ratemin = battle_config.item_drop_card_min;
+ ratemax = battle_config.item_drop_card_max;
+ }
+ else {
+ rate = battle_config.item_rate_common;
+ ratemin = battle_config.item_drop_common_min;
+ ratemax = battle_config.item_drop_common_max;
+ }
+ rate = (rate / 100) * atoi(str[30+i*2]);
+ rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate;
+ mob_db[class].dropitem[i].p = rate;
+ }
+ // Item1,Item2
+ mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100;
+ mob_db[class].mexpper=atoi(str[46]);
+ for(i=0;i<3;i++){
+ mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]);
+ mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100;
+ }
+ for(i=0;i<MAX_RANDOMMONSTER;i++)
+ mob_db[class].summonper[i]=0;
+ mob_db[class].maxskill=0;
+
+ mob_db[class].sex=0;
+ mob_db[class].hair=0;
+ mob_db[class].hair_color=0;
+ mob_db[class].weapon=0;
+ mob_db[class].shield=0;
+ mob_db[class].head_top=0;
+ mob_db[class].head_mid=0;
+ mob_db[class].head_buttom=0;
+ mob_db[class].clothes_color=0; //Add for player monster dye - Valaris
+ }
+ fclose(fp);
+ printf("read %s done\n",filename[i]);
+ }
+ return 0;
+}
+
+/*==========================================
+ * MOB display graphic change data reading
+ *------------------------------------------
+ */
+static int mob_readdb_mobavail(void)
+{
+ FILE *fp;
+ char line[1024];
+ int ln=0;
+ int class,j,k;
+ char *str[20],*p,*np;
+
+ if( (fp=fopen("db/mob_avail.txt","r"))==NULL ){
+ printf("can't read db/mob_avail.txt\n");
+ return -1;
+ }
+
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(str,0,sizeof(str));
+
+ for(j=0,p=line;j<12;j++){
+ if((np=strchr(p,','))!=NULL){
+ str[j]=p;
+ *np=0;
+ p=np+1;
+ } else
+ str[j]=p;
+ }
+
+ if(str[0]==NULL)
+ continue;
+
+ class=atoi(str[0]);
+
+ if(class<=1000 || class>2000) // ’l‚ªˆÙí‚Ȃ爗‚µ‚È‚¢B
+ continue;
+ k=atoi(str[1]);
+ if(k >= 0)
+ mob_db[class].view_class=k;
+
+ if((mob_db[class].view_class < 24) || (mob_db[class].view_class > 4000)) {
+ mob_db[class].sex=atoi(str[2]);
+ mob_db[class].hair=atoi(str[3]);
+ mob_db[class].hair_color=atoi(str[4]);
+ mob_db[class].weapon=atoi(str[5]);
+ mob_db[class].shield=atoi(str[6]);
+ mob_db[class].head_top=atoi(str[7]);
+ mob_db[class].head_mid=atoi(str[8]);
+ mob_db[class].head_buttom=atoi(str[9]);
+ mob_db[class].option=atoi(str[10])&~0x46;
+ mob_db[class].clothes_color=atoi(str[11]); // Monster player dye option - Valaris
+ }
+
+ else if(atoi(str[2]) > 0) mob_db[class].equip=atoi(str[2]); // mob equipment [Valaris]
+
+ ln++;
+ }
+ fclose(fp);
+ printf("read db/mob_avail.txt done (count=%d)\n",ln);
+ return 0;
+}
+
+/*==========================================
+ * Reading of random monster data
+ *------------------------------------------
+ */
+static int mob_read_randommonster(void)
+{
+ FILE *fp;
+ char line[1024];
+ char *str[10],*p;
+ int i,j;
+
+ const char* mobfile[] = {
+ "db/mob_branch.txt",
+ "db/mob_poring.txt",
+ "db/mob_boss.txt" };
+
+ for(i=0;i<MAX_RANDOMMONSTER;i++){
+ mob_db[0].summonper[i] = 1002; // ݒ肵–Y‚ꂽꇂ̓|ƒŠƒ“‚ªo‚é‚悤‚É‚µ‚Ä‚¨‚­
+ fp=fopen(mobfile[i],"r");
+ if(fp==NULL){
+ printf("can't read %s\n",mobfile[i]);
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ int class,per;
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ memset(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 || str[2]==NULL)
+ continue;
+
+ class = atoi(str[0]);
+ per=atoi(str[2]);
+ if((class>1000 && class<=2000) || class==0)
+ mob_db[class].summonper[i]=per;
+ }
+ fclose(fp);
+ printf("read %s done\n",mobfile[i]);
+ }
+ return 0;
+}
+/*==========================================
+ * db/mob_skill_db.txt reading
+ *------------------------------------------
+ */
+static int mob_readskilldb(void)
+{
+ FILE *fp;
+ char line[1024];
+ int i;
+
+ const struct {
+ char str[32];
+ int id;
+ } cond1[] = {
+ { "always", MSC_ALWAYS },
+ { "myhpltmaxrate", MSC_MYHPLTMAXRATE },
+ { "friendhpltmaxrate",MSC_FRIENDHPLTMAXRATE },
+ { "mystatuson", MSC_MYSTATUSON },
+ { "mystatusoff", MSC_MYSTATUSOFF },
+ { "friendstatuson", MSC_FRIENDSTATUSON },
+ { "friendstatusoff", MSC_FRIENDSTATUSOFF },
+ { "attackpcgt", MSC_ATTACKPCGT },
+ { "attackpcge", MSC_ATTACKPCGE },
+ { "slavelt", MSC_SLAVELT },
+ { "slavele", MSC_SLAVELE },
+ { "closedattacked", MSC_CLOSEDATTACKED },
+ { "longrangeattacked",MSC_LONGRANGEATTACKED },
+ { "skillused", MSC_SKILLUSED },
+ { "casttargeted", MSC_CASTTARGETED },
+ }, cond2[] ={
+ { "anybad", -1 },
+ { "stone", SC_STONE },
+ { "freeze", SC_FREEZE },
+ { "stan", SC_STAN },
+ { "sleep", SC_SLEEP },
+ { "poison", SC_POISON },
+ { "curse", SC_CURSE },
+ { "silence", SC_SILENCE },
+ { "confusion", SC_CONFUSION },
+ { "blind", SC_BLIND },
+ { "hiding", SC_HIDING },
+ { "sight", SC_SIGHT },
+ }, state[] = {
+ { "any", -1 },
+ { "idle", MSS_IDLE },
+ { "walk", MSS_WALK },
+ { "attack", MSS_ATTACK },
+ { "dead", MSS_DEAD },
+ { "loot", MSS_LOOT },
+ { "chase", MSS_CHASE },
+ }, target[] = {
+ { "target", MST_TARGET },
+ { "self", MST_SELF },
+ { "friend", MST_FRIEND },
+ { "around5", MST_AROUND5 },
+ { "around6", MST_AROUND6 },
+ { "around7", MST_AROUND7 },
+ { "around8", MST_AROUND8 },
+ { "around1", MST_AROUND1 },
+ { "around2", MST_AROUND2 },
+ { "around3", MST_AROUND3 },
+ { "around4", MST_AROUND4 },
+ { "around", MST_AROUND },
+ };
+
+ int x;
+ char *filename[]={ "db/mob_skill_db.txt","db/mob_skill_db2.txt" };
+
+ for(x=0;x<2;x++){
+
+ fp=fopen(filename[x],"r");
+ if(fp==NULL){
+ if(x==0)
+ printf("can't read %s\n",filename[x]);
+ continue;
+ }
+ while(fgets(line,1020,fp)){
+ char *sp[20],*p;
+ int mob_id;
+ struct mob_skill *ms;
+ int j=0;
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ memset(sp,0,sizeof(sp));
+ for(i=0,p=line;i<18 && p;i++){
+ sp[i]=p;
+ if((p=strchr(p,','))!=NULL)
+ *p++=0;
+ }
+ if( (mob_id=atoi(sp[0]))<=0 )
+ continue;
+
+ if( strcmp(sp[1],"clear")==0 ){
+ memset(mob_db[mob_id].skill,0,sizeof(mob_db[mob_id].skill));
+ mob_db[mob_id].maxskill=0;
+ continue;
+ }
+
+ for(i=0;i<MAX_MOBSKILL;i++)
+ if( (ms=&mob_db[mob_id].skill[i])->skill_id == 0)
+ break;
+ if(i==MAX_MOBSKILL){
+ printf("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n",
+ sp[1],mob_id,mob_db[mob_id].jname);
+ continue;
+ }
+
+ ms->state=atoi(sp[2]);
+ for(j=0;j<sizeof(state)/sizeof(state[0]);j++){
+ if( strcmp(sp[2],state[j].str)==0)
+ ms->state=state[j].id;
+ }
+ ms->skill_id=atoi(sp[3]);
+ ms->skill_lv=atoi(sp[4]);
+ ms->permillage=atoi(sp[5]);
+ ms->casttime=atoi(sp[6]);
+ ms->delay=atoi(sp[7]);
+ ms->cancel=atoi(sp[8]);
+ if( strcmp(sp[8],"yes")==0 ) ms->cancel=1;
+ ms->target=atoi(sp[9]);
+ for(j=0;j<sizeof(target)/sizeof(target[0]);j++){
+ if( strcmp(sp[9],target[j].str)==0)
+ ms->target=target[j].id;
+ }
+ ms->cond1=-1;
+ for(j=0;j<sizeof(cond1)/sizeof(cond1[0]);j++){
+ if( strcmp(sp[10],cond1[j].str)==0)
+ ms->cond1=cond1[j].id;
+ }
+ ms->cond2=atoi(sp[11]);
+ for(j=0;j<sizeof(cond2)/sizeof(cond2[0]);j++){
+ if( strcmp(sp[11],cond2[j].str)==0)
+ ms->cond2=cond2[j].id;
+ }
+ ms->val[0]=atoi(sp[12]);
+ ms->val[1]=atoi(sp[13]);
+ ms->val[2]=atoi(sp[14]);
+ ms->val[3]=atoi(sp[15]);
+ ms->val[4]=atoi(sp[16]);
+ if(sp[17] != NULL && strlen(sp[17])>2)
+ ms->emotion=atoi(sp[17]);
+ else
+ ms->emotion=-1;
+ mob_db[mob_id].maxskill=i+1;
+ }
+ fclose(fp);
+ printf("read %s done\n",filename[x]);
+ }
+ return 0;
+}
+
+void mob_reload(void)
+{
+ /*
+
+ <empty monster database>
+ mob_read();
+
+ */
+
+ do_init_mob();
+}
+
+#ifndef TXT_ONLY
+/*==========================================
+ * SQL reading
+ *------------------------------------------
+ */
+static int mob_read_sqldb(void)
+{
+ char line[1024];
+ int i,class,ln=0;
+ char *str[55],*p,*np;
+
+ memset(mob_db,0,sizeof(mob_db));
+
+ sprintf (tmp_sql, "SELECT * FROM `%s`",mob_db_db);
+ if(mysql_query(&mmysql_handle, tmp_sql) ) {
+ printf("DB server Error (select %s to Memory)- %s\n",mob_db_db,mysql_error(&mmysql_handle) );
+ }
+ sql_res = mysql_store_result(&mmysql_handle);
+ if (sql_res) {
+ while((sql_row = mysql_fetch_row(sql_res))){
+ sprintf(line,"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s",
+ sql_row[0],sql_row[1],sql_row[2],sql_row[3],sql_row[4],
+ sql_row[5],sql_row[6],sql_row[7],sql_row[8],sql_row[9],
+ sql_row[10],sql_row[11],sql_row[12],sql_row[13],sql_row[14],
+ sql_row[15],sql_row[16],sql_row[17],sql_row[18],sql_row[19],
+ sql_row[20],sql_row[21],sql_row[22],sql_row[23],sql_row[24],
+ sql_row[25],sql_row[26],sql_row[27],sql_row[28],sql_row[29],
+ sql_row[30],sql_row[31],sql_row[32],sql_row[33],sql_row[34],
+ sql_row[35],sql_row[36],sql_row[37],sql_row[38],sql_row[39],
+ sql_row[40],sql_row[41],sql_row[42],sql_row[43],sql_row[44],
+ sql_row[45],sql_row[46],sql_row[47],sql_row[48],sql_row[49],
+ sql_row[50],sql_row[51],sql_row[52]);
+
+ for(i=0,p=line;i<55;i++){
+ if((np=strchr(p,','))!=NULL){
+ str[i]=p;
+ *np=0;
+ p=np+1;
+ } else
+ str[i]=p;
+ }
+
+ class=atoi(str[0]);
+ if(class<=1000 || class>2000)
+ continue;
+
+ ln++;
+
+ mob_db[class].view_class=class;
+ memcpy(mob_db[class].name,str[1],24);
+ memcpy(mob_db[class].jname,str[2],24);
+ mob_db[class].lv=atoi(str[3]);
+ mob_db[class].max_hp=atoi(str[4]);
+ mob_db[class].max_sp=atoi(str[5]);
+ mob_db[class].base_exp=atoi(str[6])*
+ battle_config.base_exp_rate/100;
+ if(mob_db[class].base_exp <= 0)
+ mob_db[class].base_exp = 1;
+ mob_db[class].job_exp=atoi(str[7])*
+ battle_config.job_exp_rate/100;
+ if(mob_db[class].job_exp <= 0)
+ mob_db[class].job_exp = 1;
+ mob_db[class].range=atoi(str[8]);
+ mob_db[class].atk1=atoi(str[9]);
+ mob_db[class].atk2=atoi(str[10]);
+ mob_db[class].def=atoi(str[11]);
+ mob_db[class].mdef=atoi(str[12]);
+ mob_db[class].str=atoi(str[13]);
+ mob_db[class].agi=atoi(str[14]);
+ mob_db[class].vit=atoi(str[15]);
+ mob_db[class].int_=atoi(str[16]);
+ mob_db[class].dex=atoi(str[17]);
+ mob_db[class].luk=atoi(str[18]);
+ mob_db[class].range2=atoi(str[19]);
+ mob_db[class].range3=atoi(str[20]);
+ mob_db[class].size=atoi(str[21]);
+ mob_db[class].race=atoi(str[22]);
+ mob_db[class].element=atoi(str[23]);
+ mob_db[class].mode=atoi(str[24]);
+ mob_db[class].speed=atoi(str[25]);
+ mob_db[class].adelay=atoi(str[26]);
+ mob_db[class].amotion=atoi(str[27]);
+ mob_db[class].dmotion=atoi(str[28]);
+
+ for(i=0;i<8;i++){
+ int rate = 0,type,ratemin,ratemax;
+ mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]);
+ type = itemdb_type(mob_db[class].dropitem[i].nameid);
+ if (type == 0) { // Added by Valaris
+ rate = battle_config.item_rate_heal;
+ ratemin = battle_config.item_drop_heal_min;
+ ratemax = battle_config.item_drop_heal_max;
+ }
+ else if (type == 2) {
+ rate = battle_config.item_rate_use;
+ ratemin = battle_config.item_drop_use_min;
+ ratemax = battle_config.item_drop_use_max; // End
+ }
+ else if (type == 4 || type == 5 || type == 8) { // Changed to include Pet Equip
+ rate = battle_config.item_rate_equip;
+ ratemin = battle_config.item_drop_equip_min;
+ ratemax = battle_config.item_drop_equip_max;
+ }
+ else if (type == 6) {
+ rate = battle_config.item_rate_card;
+ ratemin = battle_config.item_drop_card_min;
+ ratemax = battle_config.item_drop_card_max;
+ }
+ else {
+ rate = battle_config.item_rate_common;
+ ratemin = battle_config.item_drop_common_min;
+ ratemax = battle_config.item_drop_common_max;
+ }
+ rate = (rate / 100) * atoi(str[30+i*2]);
+ rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate;
+ mob_db[class].dropitem[i].p = rate;
+ }
+
+ mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100;
+ mob_db[class].mexpper=atoi(str[46]);
+ for(i=0;i<3;i++){
+ mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]);
+ mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100;
+ }
+ for(i=0;i<MAX_RANDOMMONSTER;i++)
+ mob_db[class].summonper[i]=0;
+ mob_db[class].maxskill=0;
+
+ mob_db[class].sex=0;
+ mob_db[class].hair=0;
+ mob_db[class].hair_color=0;
+ mob_db[class].weapon=0;
+ mob_db[class].shield=0;
+ mob_db[class].head_top=0;
+ mob_db[class].head_mid=0;
+ mob_db[class].head_buttom=0;
+ }
+ mysql_free_result(sql_res);
+ printf("read %s done (count=%d)\n",mob_db_db,ln);
+ }
+ return 0;
+}
+
+#endif /* not TXT_ONLY */
+/*==========================================
+ * Circumference initialization of mob
+ *------------------------------------------
+ */
+int do_init_mob(void)
+{
+#ifndef TXT_ONLY
+ if(db_use_sqldbs)
+ mob_read_sqldb();
+ else
+#endif /* TXT_ONLY */
+ mob_readdb();
+
+ mob_readdb_mobavail();
+ mob_read_randommonster();
+ mob_readskilldb();
+
+ add_timer_func_list(mob_timer,"mob_timer");
+ add_timer_func_list(mob_delayspawn,"mob_delayspawn");
+ add_timer_func_list(mob_delay_item_drop,"mob_delay_item_drop");
+ add_timer_func_list(mob_delay_item_drop2,"mob_delay_item_drop2");
+ add_timer_func_list(mob_ai_hard,"mob_ai_hard");
+ add_timer_func_list(mob_ai_lazy,"mob_ai_lazy");
+ add_timer_func_list(mobskill_castend_id,"mobskill_castend_id");
+ add_timer_func_list(mobskill_castend_pos,"mobskill_castend_pos");
+ add_timer_func_list(mob_timer_delete,"mob_timer_delete");
+ add_timer_interval(gettick()+MIN_MOBTHINKTIME,mob_ai_hard,0,0,MIN_MOBTHINKTIME);
+ add_timer_interval(gettick()+MIN_MOBTHINKTIME*10,mob_ai_lazy,0,0,MIN_MOBTHINKTIME*10);
+
+ return 0;
+}
diff --git a/src/map/mob.h b/src/map/mob.h
index 2ec71d90c..e5a83be0f 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -1,139 +1,139 @@
-// $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _MOB_H_
-#define _MOB_H_
-
-#define MAX_RANDOMMONSTER 3
-
-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 name[24],jname[24];
- int lv;
- int max_hp,max_sp;
- int base_exp,job_exp;
- int atk1,atk2;
- int def,mdef;
- int str,agi,vit,int_,dex,luk;
- int range,range2,range3;
- int size,race,element,mode;
- int speed,adelay,amotion,dmotion;
- int mexp,mexpper;
- struct { int nameid,p; } dropitem[8];
- struct { int nameid,p; } mvpitem[3];
- int view_class,sex;
- short hair,hair_color,weapon,shield,head_top,head_mid,head_buttom,option,clothes_color; // [Valaris]
- int equip; // [Valaris]
- int summonper[MAX_RANDOMMONSTER];
- int maxskill;
- struct mob_skill skill[MAX_MOBSKILL];
-};
-extern struct mob_db mob_db[];
-
-enum {
- MST_TARGET = 0,
- MST_SELF = 1,
- MST_FRIEND = 2,
- MST_AROUND5 = 3,
- MST_AROUND6 = 4,
- MST_AROUND7 = 5,
- MST_AROUND8 = 6,
- MST_AROUND1 = 7,
- MST_AROUND2 = 8,
- MST_AROUND3 = 9,
- MST_AROUND4 = 10,
- MST_AROUND = MST_AROUND4,
-
- MSC_ALWAYS = 0x0000,
- MSC_MYHPLTMAXRATE = 0x0001,
- MSC_FRIENDHPLTMAXRATE= 0x0010,
- MSC_MYSTATUSON = 0x0020,
- MSC_MYSTATUSOFF = 0x0021,
- MSC_FRIENDSTATUSON = 0x0030,
- MSC_FRIENDSTATUSOFF = 0x0031,
-
- MSC_ATTACKPCGT = 0x0100,
- MSC_ATTACKPCGE = 0x0101,
- MSC_SLAVELT = 0x0110,
- MSC_SLAVELE = 0x0111,
- MSC_CLOSEDATTACKED = 0x1000,
- MSC_LONGRANGEATTACKED= 0x1001,
- MSC_SKILLUSED = 0x1010,
- MSC_CASTTARGETED = 0x1011,
-};
-
-enum {
- MSS_IDLE, // ‘Ò‹@
- MSS_WALK, // ˆÚ“®
- MSS_ATTACK, // UŒ‚
- MSS_DEAD, // Ž€–S
- MSS_LOOT, // ƒ‹[ƒg
- MSS_CHASE, // “ËŒ‚
-};
-
-int mobdb_searchname(const char *str);
-int mobdb_checkid(const int id);
-int mob_once_spawn(struct map_session_data *sd,char *mapname,
- int x,int 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_walktoxy(struct mob_data *md,int x,int y,int easy);
-
-int mob_target(struct mob_data *md,struct block_list *bl,int dist);
-int mob_stop_walking(struct mob_data *md,int type);
-int mob_stopattack(struct mob_data *);
-int mob_spawn(int);
-int mob_damage(struct block_list *,struct mob_data*,int,int);
-int mob_changestate(struct mob_data *md,int state,int type);
-int mob_heal(struct mob_data*,int);
-int mob_exclusion_add(struct mob_data *md,int type,int id);
-int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd);
-int mob_get_viewclass(int);
-int mob_get_sex(int);
-short mob_get_hair(int);
-short mob_get_hair_color(int);
-short mob_get_weapon(int);
-short mob_get_shield(int);
-short mob_get_head_top(int);
-short mob_get_head_mid(int);
-short mob_get_head_buttom(int);
-short mob_get_clothes_color(int); //player mob dye [Valaris]
-int mob_get_equip(int); // mob equip [Valaris]
-int do_init_mob(void);
-
-int mob_delete(struct mob_data *md);
-int mob_catch_delete(struct mob_data *md,int type);
-int mob_timer_delete(int tid, unsigned int tick, int id, int data);
-
-int mob_deleteslave(struct mob_data *md);
-
-int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv);
-
-int mob_class_change(struct mob_data *md,int *value);
-int mob_warp(struct mob_data *md,int m,int x,int y,int type);
-
-int mobskill_use(struct mob_data *md,unsigned int tick,int event);
-int mobskill_event(struct mob_data *md,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 flag);
-
-int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl);
-void mob_reload(void);
-
-#endif
+// $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
+#ifndef _MOB_H_
+#define _MOB_H_
+
+#define MAX_RANDOMMONSTER 3
+
+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 name[24],jname[24];
+ int lv;
+ int max_hp,max_sp;
+ int base_exp,job_exp;
+ int atk1,atk2;
+ int def,mdef;
+ int str,agi,vit,int_,dex,luk;
+ int range,range2,range3;
+ int size,race,element,mode;
+ int speed,adelay,amotion,dmotion;
+ int mexp,mexpper;
+ struct { int nameid,p; } dropitem[8];
+ struct { int nameid,p; } mvpitem[3];
+ int view_class,sex;
+ short hair,hair_color,weapon,shield,head_top,head_mid,head_buttom,option,clothes_color; // [Valaris]
+ int equip; // [Valaris]
+ int summonper[MAX_RANDOMMONSTER];
+ int maxskill;
+ struct mob_skill skill[MAX_MOBSKILL];
+};
+extern struct mob_db mob_db[];
+
+enum {
+ MST_TARGET = 0,
+ MST_SELF = 1,
+ MST_FRIEND = 2,
+ MST_AROUND5 = 3,
+ MST_AROUND6 = 4,
+ MST_AROUND7 = 5,
+ MST_AROUND8 = 6,
+ MST_AROUND1 = 7,
+ MST_AROUND2 = 8,
+ MST_AROUND3 = 9,
+ MST_AROUND4 = 10,
+ MST_AROUND = MST_AROUND4,
+
+ MSC_ALWAYS = 0x0000,
+ MSC_MYHPLTMAXRATE = 0x0001,
+ MSC_FRIENDHPLTMAXRATE= 0x0010,
+ MSC_MYSTATUSON = 0x0020,
+ MSC_MYSTATUSOFF = 0x0021,
+ MSC_FRIENDSTATUSON = 0x0030,
+ MSC_FRIENDSTATUSOFF = 0x0031,
+
+ MSC_ATTACKPCGT = 0x0100,
+ MSC_ATTACKPCGE = 0x0101,
+ MSC_SLAVELT = 0x0110,
+ MSC_SLAVELE = 0x0111,
+ MSC_CLOSEDATTACKED = 0x1000,
+ MSC_LONGRANGEATTACKED= 0x1001,
+ MSC_SKILLUSED = 0x1010,
+ MSC_CASTTARGETED = 0x1011,
+};
+
+enum {
+ MSS_IDLE, // ‘Ò‹@
+ MSS_WALK, // ˆÚ“®
+ MSS_ATTACK, // UŒ‚
+ MSS_DEAD, // Ž€–S
+ MSS_LOOT, // ƒ‹[ƒg
+ MSS_CHASE, // “ËŒ‚
+};
+
+int mobdb_searchname(const char *str);
+int mobdb_checkid(const int id);
+int mob_once_spawn(struct map_session_data *sd,char *mapname,
+ int x,int 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_walktoxy(struct mob_data *md,int x,int y,int easy);
+
+int mob_target(struct mob_data *md,struct block_list *bl,int dist);
+int mob_stop_walking(struct mob_data *md,int type);
+int mob_stopattack(struct mob_data *);
+int mob_spawn(int);
+int mob_damage(struct block_list *,struct mob_data*,int,int);
+int mob_changestate(struct mob_data *md,int state,int type);
+int mob_heal(struct mob_data*,int);
+int mob_exclusion_add(struct mob_data *md,int type,int id);
+int mob_exclusion_check(struct mob_data *md,struct map_session_data *sd);
+int mob_get_viewclass(int);
+int mob_get_sex(int);
+short mob_get_hair(int);
+short mob_get_hair_color(int);
+short mob_get_weapon(int);
+short mob_get_shield(int);
+short mob_get_head_top(int);
+short mob_get_head_mid(int);
+short mob_get_head_buttom(int);
+short mob_get_clothes_color(int); //player mob dye [Valaris]
+int mob_get_equip(int); // mob equip [Valaris]
+int do_init_mob(void);
+
+int mob_delete(struct mob_data *md);
+int mob_catch_delete(struct mob_data *md,int type);
+int mob_timer_delete(int tid, unsigned int tick, int id, int data);
+
+int mob_deleteslave(struct mob_data *md);
+
+int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv);
+
+int mob_class_change(struct mob_data *md,int *value);
+int mob_warp(struct mob_data *md,int m,int x,int y,int type);
+
+int mobskill_use(struct mob_data *md,unsigned int tick,int event);
+int mobskill_event(struct mob_data *md,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 flag);
+
+int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl);
+void mob_reload(void);
+
+#endif
diff --git a/src/map/npc.c b/src/map/npc.c
index 1c089a2c9..65974aee8 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1,2274 +1,2274 @@
-// $Id: npc.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <math.h>
-#include <time.h>
-
-#include "db.h"
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "map.h"
-#include "npc.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "itemdb.h"
-#include "script.h"
-#include "mob.h"
-#include "pet.h"
-#include "battle.h"
-#include "skill.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-
-
-struct npc_src_list {
- struct npc_src_list * next;
- struct npc_src_list * prev;
- char name[4];
-} ;
-
-static struct npc_src_list *npc_src_first,*npc_src_last;
-static int npc_id=START_NPC_NUM;
-static int npc_warp,npc_shop,npc_script,npc_mob;
-
-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 int npc_walktimer(int,unsigned int,int,int); // [Valaris]
-static int npc_walktoxy_sub(struct npc_data *nd); // [Valaris]
-
-/*==========================================
- * 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 *)aCalloc(50,sizeof(char));
-
- 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)){
-
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- memcpy(name,nd->name,50);
- if(sd->areanpc_id==nd->bl.id)
- return 1;
- sd->areanpc_id=nd->bl.id;
- npc_event(sd,strcat(name,"::OnTouch"),0);
- }
- free(name);
- return 0;
-}
-int npc_enable(const char *name,int flag)
-{
- struct npc_data *nd=strdb_search(npcname_db,name);
- if (nd==NULL)
- return 0;
-
- if (flag&1) { // —LŒø‰»
- nd->flag&=~1;
- clif_spawnnpc(nd);
- }else if (flag&2){
- nd->flag&=~1;
- nd->option = 0x0000;
- clif_changeoption(&nd->bl);
- }else if (flag&4){
- nd->flag|=1;
- nd->option = 0x0002;
- clif_changeoption(&nd->bl);
- }else{ // –³Œø‰»
- nd->flag|=1;
- clif_clearchar(&nd->bl,0);
- }
- 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 strdb_search(npcname_db,name);
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
- *------------------------------------------
- */
-int npc_event_dequeue(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- sd->npc_id=0;
- if (sd->eventqueue[0][0]) { // ƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
- char *name=(char *)aCalloc(50,sizeof(char));
- int i;
-
- memcpy(name,sd->eventqueue[0],50);
- for(i=MAX_EVENTQUEUE-2;i>=0;i--)
- memcpy(sd->eventqueue[i],sd->eventqueue[i+1],50);
- add_timer(gettick()+100,npc_event_timer,sd->bl.id,(int)name);
- }
- return 0;
-}
-
-int npc_delete(struct npc_data *nd)
-{
- nullpo_retr(1, nd);
-
- if(nd->bl.prev == NULL)
- return 1;
-
- clif_clearchar_area(&nd->bl,1);
- map_delblock(&nd->bl);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒg‚Ì’x‰„ŽÀs
- *------------------------------------------
- */
-int npc_event_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- if (sd==NULL)
- return 0;
-
- npc_event(sd,(const char *)data,0);
- free((void*)data);
- return 0;
-}
-
-int npc_timer_event(const char *eventname) // Added by RoVeRT
-{
- struct event_data *ev=strdb_search(ev_db,eventname);
- struct npc_data *nd;
-// int xs,ys;
-
- if((ev==NULL || (nd=ev->nd)==NULL)){
- printf("npc_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(void *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(void *key,void *data,va_list ap) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data*)data;
-
- if(nd->timer == -1)
- return 0;
-
- strdb_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
-{
- strdb_foreach(npcname_db,npc_timer_sub);
-
- free((void*)data);
- return 0;
-}*/
-/*==========================================
- * ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚̃GƒNƒXƒ|[ƒg
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_event_export(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- 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;
- char *buf;
- char *p=strchr(lname,':');
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
- ev=calloc(sizeof(struct event_data), 1);
- buf=calloc(50, 1);
- if (ev==NULL || buf==NULL) {
- printf("npc_event_export: out of memory !\n");
- exit(1);
- }else if (p==NULL || (p-lname)>24) {
- printf("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_insert(ev_db,buf,ev);
-// if (battle_config.etc_log)
-// printf("npc_event_export: export [%s]\n",buf);
- }
- }
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*==========================================
- * ‘S‚Ä‚ÌNPC‚ÌOn*ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_event_doall_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev;
- int *c;
- const 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 char *);
-
- if( (p=strchr(p,':')) && 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_doall(const char *name)
-{
- int c=0;
- char buf[64]="::";
-
- strncpy(buf+2,name,62);
- strdb_foreach(ev_db,npc_event_doall_sub,&c,buf);
- return c;
-}
-
-int npc_event_do_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev;
- int *c;
- const 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 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 char *name)
-{
- int c=0;
-
- if (*name==':' && name[1]==':') {
- return npc_event_doall(name+2);
- }
-
- strdb_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];
- int c=0;
-
- time(&timer);
- t=localtime(&timer);
-
- 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);
- }
- 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");
- printf("npc: OnInit Event done. (%d npc)\n",c);
-
- 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;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]==-1 )
- break;
- if(i<MAX_EVENTTIMER){
- char *evname=malloc(24);
- if(evname==NULL){
- printf("npc_addeventtimer: out of memory !\n");exit(1);
- }
- memcpy(evname,name,24);
- nd->eventtimer[i]=add_timer(gettick()+tick,
- npc_event_timer,nd->bl.id,(int)evname);
- }else
- printf("npc_addtimer: event timer is full !\n");
-
- return 0;
-}
-
-int npc_deleventtimer(struct npc_data *nd,const char *name)
-{
- int i;
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( nd->eventtimer[i]!=-1 && strcmp(
- (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(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- 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,':')) && 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, struct map_session_data *sd, int option)
-{
- strdb_foreach(ev_db,npc_do_ontimer_sub,&npc_id,sd,option);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚ÌŽæ‚èž‚Ý
- * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
- *------------------------------------------
- */
-int npc_timerevent_import(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- 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=malloc(sizeof(struct npc_timerevent_list));
- else te=realloc( te, sizeof(struct npc_timerevent_list) * (i+1) );
- if(te==NULL){
- printf("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=i+1;
- }
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int npc_timerevent(int tid,unsigned int tick,int id,int data)
-{
- int next,t;
- struct npc_data* nd=(struct npc_data *)map_id2bl(id);
- struct npc_timerevent_list *te;
- if( nd==NULL || nd->u.scr.nexttimer<0 ){
- printf("npc_timerevent: ??\n");
- return 0;
- }
- nd->u.scr.timertick=tick;
- te=nd->u.scr.timer_event+ nd->u.scr.nexttimer;
- nd->u.scr.timerid = -1;
-
- t = nd->u.scr.timer+=data;
- nd->u.scr.nexttimer++;
- if( nd->u.scr.timeramount>nd->u.scr.nexttimer ){
- next= nd->u.scr.timer_event[ nd->u.scr.nexttimer ].timer - t;
- nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,next);
- }
-
- run_script(nd->u.scr.script,te->pos,0,nd->bl.id);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŠJŽn
- *------------------------------------------
- */
-int npc_timerevent_start(struct npc_data *nd)
-{
- int j,n, next;
-
- nullpo_retr(0, nd);
-
- n=nd->u.scr.timeramount;
- if( nd->u.scr.nexttimer>=0 || n==0 )
- return 0;
-
- for(j=0;j<n;j++){
- if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer )
- break;
- }
- nd->u.scr.nexttimer=j;
- nd->u.scr.timertick=gettick();
-
- if(j>=n)
- return 0;
-
- next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
- nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,next);
- return 0;
-}
-/*==========================================
- * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgI—¹
- *------------------------------------------
- */
-int npc_timerevent_stop(struct npc_data *nd)
-{
- nullpo_retr(0, nd);
-
- if( nd->u.scr.nexttimer>=0 ){
- nd->u.scr.nexttimer = -1;
- nd->u.scr.timer += (int)(gettick() - nd->u.scr.timertick);
- if(nd->u.scr.timerid!=-1)
- delete_timer(nd->u.scr.timerid,npc_timerevent);
- nd->u.scr.timerid = -1;
- }
- return 0;
-}
-/*==========================================
- * ƒ^ƒ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.nexttimer>=0 )
- tick += (int)(gettick() - nd->u.scr.timertick);
- return tick;
-}
-/*==========================================
- * ƒ^ƒCƒ}[’l‚ÌÝ’è
- *------------------------------------------
- */
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer)
-{
- int flag;
-
- nullpo_retr(0, nd);
-
- flag= nd->u.scr.nexttimer;
-
- npc_timerevent_stop(nd);
- nd->u.scr.timer=newtimer;
- if(flag>=0)
- npc_timerevent_start(nd);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgŒ^‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_event(struct map_session_data *sd,const char *eventname,int mob_kill)
-{
- struct event_data *ev=strdb_search(ev_db,eventname);
- struct npc_data *nd;
- int xs,ys;
- char mobevent[100];
-
- if( sd == NULL ){
- printf("npc_event nullpo?\n");
- }
-
- if(ev==NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0)
- return 1;
-
- if(ev==NULL || (nd=ev->nd)==NULL){
- if(mob_kill && (ev==NULL || (nd=ev->nd)==NULL)){
- strcpy( mobevent, eventname);
- strcat( mobevent, "::OnMyMobDead");
- ev=strdb_search(ev_db,mobevent);
- if (ev==NULL || (nd=ev->nd)==NULL) {
- if (strnicmp(eventname,"GM_MONSTER",10)!=0)
- printf("npc_event: event not found [%s]\n",mobevent);
- return 0;
- }
- }
- else {
- if(battle_config.error_log)
- printf("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 ) {
- 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;
- }
-
- if ( sd->npc_id!=0) {
-// if (battle_config.error_log)
-// printf("npc_event: npc_id != 0\n");
- int i;
- for(i=0;i<MAX_EVENTQUEUE;i++)
- if (!sd->eventqueue[i][0])
- break;
- if (i==MAX_EVENTQUEUE) {
- if (battle_config.error_log)
- printf("npc_event: event queue is full !\n");
- }else{
-// if (battle_config.etc_log)
-// printf("npc_event: enqueue\n");
- memcpy(sd->eventqueue[i],eventname,50);
- }
- return 1;
- }
- if (nd->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- npc_event_dequeue(sd);
- return 0;
- }
-
- sd->npc_id=nd->bl.id;
- sd->npc_pos=run_script(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id);
- return 0;
-}
-
-
-int npc_command_sub(void *key,void *data,va_list ap)
-{
- char *p=(char *)key;
- struct event_data *ev=(struct event_data *)data;
- char *npcname=va_arg(ap,char *);
- char *command=va_arg(ap,char *);
- 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,char *npcname,char *command)
-{
- strdb_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]->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- 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)
- printf("npc_touch_areanpc : some bug \n");
- }
- return 1;
- }
- switch(map[m].npc[i]->bl.subtype) {
- case WARP:
- skill_stop_dancing(&sd->bl,0);
- pc_setpos(sd,map[m].npc[i]->u.warp.name,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0);
- break;
- case SCRIPT:
- {
- char *name=(char *)aCalloc(50,sizeof(char));
-
- memcpy(name,map[m].npc[i]->name,50);
- if(sd->areanpc_id==map[m].npc[i]->bl.id)
- return 1;
- sd->areanpc_id=map[m].npc[i]->bl.id;
- if(npc_event(sd,strcat(name,"::OnTouch"),0)>0)
- npc_click(sd,map[m].npc[i]->bl.id);
- free(name);
- break;
- }
- }
- return 0;
-}
-
-/*==========================================
- * ‹ß‚­‚©‚Ç‚¤‚©‚Ì”»’è
- *------------------------------------------
- */
-int npc_checknear(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(0, sd);
-
- nd=(struct npc_data *)map_id2bl(id);
- if (nd==NULL || nd->bl.type!=BL_NPC) {
- if (battle_config.error_log)
- printf("no such npc : %d\n",id);
- return 1;
- }
-
- if (nd->class<0) // ƒCƒxƒ“ƒgŒn‚Íí‚ÉOK
- return 0;
-
- // ƒGƒŠƒA”»’è
- if (nd->bl.m!=sd->bl.m ||
- nd->bl.x<sd->bl.x-AREA_SIZE-1 || nd->bl.x>sd->bl.x+AREA_SIZE+1 ||
- nd->bl.y<sd->bl.y-AREA_SIZE-1 || nd->bl.y>sd->bl.y+AREA_SIZE+1)
- return 1;
-
- return 0;
-}
-
-/*==========================================
- * ƒNƒŠƒbƒNŽž‚ÌNPCˆ—
- *------------------------------------------
- */
-int npc_click(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (sd->npc_id != 0) {
- if (battle_config.error_log)
- printf("npc_click: npc_id != 0\n");
- return 1;
- }
-
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
-
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- sd->npc_id=id;
- switch(nd->bl.subtype) {
- case SHOP:
- clif_npcbuysell(sd,id);
- npc_event_dequeue(sd);
- break;
- case SCRIPT:
- sd->npc_pos=run_script(nd->u.scr.script,0,sd->bl.id,id);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_scriptcont(struct map_session_data *sd,int id)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (id!=sd->npc_id)
- return 1;
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
-
- sd->npc_pos=run_script(nd->u.scr.script,sd->npc_pos,sd->bl.id,id);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int npc_buysellsel(struct map_session_data *sd,int id,int type)
-{
- struct npc_data *nd;
-
- nullpo_retr(1, sd);
-
- if (npc_checknear(sd,id))
- return 1;
-
- nd=(struct npc_data *)map_id2bl(id);
- if (nd->bl.subtype!=SHOP) {
- if (battle_config.error_log)
- printf("no such shop npc : %d\n",id);
- sd->npc_id=0;
- return 1;
- }
- if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
- return 1;
-
- sd->npc_shopid=id;
- if (type==0) {
- clif_buylist(sd,nd);
- } else {
- clif_selllist(sd);
- }
- 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 (npc_checknear(sd,sd->npc_shopid))
- return 3;
-
- nd=(struct npc_data*)map_id2bl(sd->npc_shopid);
- 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])
- break;
- }
- if (nd->u.shop_item[j].nameid==0)
- return 3;
-
- 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; // Ží—Þ”’´‰ß
-
- pc_payzeny(sd,(int)z);
- for(i=0;i<n;i++) {
- struct item item_tmp;
-
- memset(&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]);
- }
-
- //¤lŒoŒ±’l
-/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
- z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp;
- pc_gainexp(sd,0,z);
- }*/
- 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 = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
- if (z < 1)
- z = 1;
- pc_gainexp(sd,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;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_list);
-
- if (npc_checknear(sd,sd->npc_shopid))
- return 1;
- for(i=0,z=0;i<n;i++) {
- int nameid;
- if (item_list[i*2]-2 <0 || item_list[i*2]-2 >=MAX_INVENTORY)
- return 1;
- nameid=sd->status.inventory[item_list[i*2]-2].nameid;
- if (nameid == 0 ||
- sd->status.inventory[item_list[i*2]-2].amount < item_list[i*2+1])
- return 1;
- if (itemdb_value_notoc(nameid))
- z+=(double)itemdb_value_sell(nameid) * item_list[i*2+1];
- else
- z+=(double)pc_modifysellvalue(sd,itemdb_value_sell(nameid)) * item_list[i*2+1];
- itemamount+=item_list[i*2+1];
- }
-
- if (z > MAX_ZENY) z = MAX_ZENY;
- pc_getzeny(sd,(int)z);
- for(i=0;i<n;i++) {
- int item_id=item_list[i*2]-2;
- if( sd->status.inventory[item_id].nameid>0 && sd->inventory_data[item_id] != NULL &&
- sd->inventory_data[item_id]->type==7 && sd->status.inventory[item_id].amount>0 &&
- sd->status.inventory[item_id].card[0] == (short)0xff00)
- if(search_petDB_index(sd->status.inventory[item_id].nameid, PET_EGG) >= 0)
- intif_delete_petdata((*(long *)(&sd->status.inventory[item_id].card[1])));
- pc_delitem(sd,item_id,item_list[i*2+1],0);
- }
-
- //¤lŒoŒ±’l
-/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
- z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ;
- pc_gainexp(sd,0,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 = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
- if (z < 1)
- z = 1;
- pc_gainexp(sd,0,(int)z);
- }
- }
-
- return 0;
-
-}
-
-// [Valaris] NPC Walking
-
-/*==========================================
- * Time calculation concerning one step next to npc
- *------------------------------------------
- */
-static int calc_next_walk_step(struct npc_data *nd)
-{
- nullpo_retr(0, nd);
-
- if(nd->walkpath.path_pos>=nd->walkpath.path_len)
- return -1;
- if(nd->walkpath.path[nd->walkpath.path_pos]&1)
- return battle_get_speed(&nd->bl)*14/10;
- return battle_get_speed(&nd->bl);
-}
-
-
-/*==========================================
- * npc Walk processing
- *------------------------------------------
- */
-static int npc_walk(struct npc_data *nd,unsigned int tick,int data)
-{
- int moveblock;
- int i,ctype;
- static int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static int diry[8]={1,1,0,-1,-1,-1,0,1};
- int x,y,dx,dy;
-
- nullpo_retr(0, nd);
-
- nd->state.state=MS_IDLE;
- if(nd->walkpath.path_pos>=nd->walkpath.path_len || nd->walkpath.path_pos!=data)
- return 0;
-
- nd->walkpath.path_half ^= 1;
- if(nd->walkpath.path_half==0){
- nd->walkpath.path_pos++;
- if(nd->state.change_walk_target){
- npc_walktoxy_sub(nd);
- return 0;
- }
- }
- else {
- if(nd->walkpath.path[nd->walkpath.path_pos]>=8)
- return 1;
-
- x = nd->bl.x;
- y = nd->bl.y;
- ctype = map_getcell(nd->bl.m,x,y);
- if(ctype == 1 || ctype == 5) {
- npc_stop_walking(nd,1);
- return 0;
- }
- nd->dir=nd->walkpath.path[nd->walkpath.path_pos];
- dx = dirx[nd->dir];
- dy = diry[nd->dir];
-
- ctype = map_getcell(nd->bl.m,x+dx,y+dy);
- if(ctype == 1 || ctype == 5) {
- npc_walktoxy_sub(nd);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- nd->state.state=MS_WALK;
- map_foreachinmovearea(clif_npcoutsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,nd);
-
- x += dx;
- y += dy;
-
- if(moveblock) map_delblock(&nd->bl);
- nd->bl.x = x;
- nd->bl.y = y;
- if(moveblock) map_addblock(&nd->bl);
-
- map_foreachinmovearea(clif_npcinsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,nd);
- nd->state.state=MS_IDLE;
- }
- if((i=calc_next_walk_step(nd))>0){
- i = i>>1;
- if(i < 1 && nd->walkpath.path_half == 0)
- i = 1;
- nd->walktimer=add_timer(tick+i,npc_walktimer,nd->bl.id,nd->walkpath.path_pos);
- nd->state.state=MS_WALK;
-
- if(nd->walkpath.path_pos>=nd->walkpath.path_len)
- clif_fixnpcpos(nd); // When npc stops, retransmission current of a position.
-
- }
- return 0;
-}
-
-int npc_changestate(struct npc_data *nd,int state,int type)
-{
- int i;
-
- nullpo_retr(0, nd);
-
- if(nd->walktimer != -1)
- delete_timer(nd->walktimer,npc_walktimer);
- nd->walktimer=-1;
- nd->state.state=state;
-
- switch(state){
- case MS_WALK:
- if((i=calc_next_walk_step(nd))>0){
- i = i>>2;
- nd->walktimer=add_timer(gettick()+i,npc_walktimer,nd->bl.id,0);
- }
- else
- nd->state.state=MS_IDLE;
- break;
- case MS_DELAY:
- nd->walktimer=add_timer(gettick()+type,npc_walktimer,nd->bl.id,0);
- break;
-
- }
-
- return 0;
-}
-
-static int npc_walktimer(int tid,unsigned int tick,int id,int data)
-{
- struct npc_data *nd;
-
- nd=(struct npc_data*)map_id2bl(id);
- if(nd == NULL || nd->bl.type != BL_NPC)
- return 1;
-
- if(nd->walktimer != tid){
- return 0;
- }
-
- nd->walktimer=-1;
-
- if(nd->bl.prev == NULL)
- return 1;
-
- switch(nd->state.state){
- case MS_WALK:
- npc_walk(nd,tick,data);
- break;
- case MS_DELAY:
- npc_changestate(nd,MS_IDLE,0);
- break;
- default:
- break;
- }
- return 0;
-}
-
-
-static int npc_walktoxy_sub(struct npc_data *nd)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, nd);
-
- if(path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y,nd->state.walk_easy))
- return 1;
- memcpy(&nd->walkpath,&wpd,sizeof(wpd));
-
- nd->state.change_walk_target=0;
- npc_changestate(nd,MS_WALK,0);
-
- clif_movenpc(nd);
-
- return 0;
-}
-
-int npc_walktoxy(struct npc_data *nd,int x,int y,int easy)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK && path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,x,y,0) )
- return 1;
-
- nd->state.walk_easy = easy;
- nd->to_x=x;
- nd->to_y=y;
- if(nd->state.state == MS_WALK) {
- nd->state.change_walk_target=1;
- } else {
- return npc_walktoxy_sub(nd);
- }
-
- return 0;
-}
-
-int npc_stop_walking(struct npc_data *nd,int type)
-{
- nullpo_retr(0, nd);
-
- if(nd->state.state == MS_WALK || nd->state.state == MS_IDLE) {
- int dx=0,dy=0;
-
- nd->walkpath.path_len=0;
- if(type&4){
- dx=nd->to_x-nd->bl.x;
- if(dx<0)
- dx=-1;
- else if(dx>0)
- dx=1;
- dy=nd->to_y-nd->bl.y;
- if(dy<0)
- dy=-1;
- else if(dy>0)
- dy=1;
- }
- nd->to_x=nd->bl.x+dx;
- nd->to_y=nd->bl.y+dy;
- if(dx!=0 || dy!=0){
- npc_walktoxy_sub(nd);
- return 0;
- }
- npc_changestate(nd,MS_IDLE,0);
- }
- if(type&0x01)
- clif_fixnpcpos(nd);
- if(type&0x02) {
- int delay=battle_get_dmotion(&nd->bl);
- unsigned int tick = gettick();
- if(nd->canmove_tick < tick)
- nd->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-
-//
-// ‰Šú‰»ŠÖŒW
-//
-
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̃NƒŠƒA
- *------------------------------------------
- */
-void npc_clearsrcfile()
-{
- struct npc_src_list *p=npc_src_first;
-
- while( p ) {
- struct npc_src_list *p2=p;
- p=p->next;
- free(p2);
- }
- npc_src_first=NULL;
- npc_src_last=NULL;
-}
-/*==========================================
- * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̒ljÁ
- *------------------------------------------
- */
-void npc_addsrcfile(char *name)
-{
- struct npc_src_list *new;
- size_t len;
-
- if ( strcmpi(name,"clear")==0 ) {
- npc_clearsrcfile();
- return;
- }
-
- len = sizeof(*new) + strlen(name);
- new=(struct npc_src_list *)aCalloc(1,len);
- new->next = NULL;
- strncpy(new->name,name,strlen(name)+1);
- if (npc_src_first==NULL)
- npc_src_first = new;
- if (npc_src_last)
- npc_src_last->next = new;
-
- npc_src_last=new;
-}
-/*==========================================
- * “Ç‚Ýž‚Þ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;
- }
-
- for( ; p; lp=&p->next,pp=p,p=p->next ) {
- if ( strcmp(p->name,name)==0 ) {
- *lp=p->next;
- if ( npc_src_last==p )
- npc_src_last=pp;
- free(p);
- break;
- }
- }
-}
-
-/*==========================================
- * 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[24],to_mapname[24];
- struct npc_data *nd;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1,"%[^,],%d,%d",mapname,&x,&y) != 3 ||
- sscanf(w4,"%d,%d,%[^,],%d,%d",&xs,&ys,to_mapname,&to_x,&to_y) != 5) {
- printf("bad warp line : %s\n",w3);
- return 1;
- }
-
- m=map_mapname2mapid(mapname);
-
- 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;
- nd->dir=0;
- nd->flag=0;
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,w3,24);
-
- nd->chat_id=0;
- if (!battle_config.warp_point_debug)
- nd->class=WARP_CLASS;
- else
- nd->class=WARP_DEBUG_CLASS;
- nd->speed=200;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
- memcpy(nd->u.warp.name,to_mapname,16);
- 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++) {
- int t;
- t=map_getcell(m,x-xs/2+j,y-ys/2+i);
- if (t==1 || t==5)
- continue;
- map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80);
- }
- }
-
-// printf("warp npc %s %d read done\n",mapname,nd->bl.id);
- npc_warp++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=WARP;
- map_addblock(&nd->bl);
- clif_spawnnpc(nd);
- strdb_insert(npcname_db,nd->name,nd);
-
- return 0;
-}
-
-/*==========================================
- * shops‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4)
-{
- char *p;
- int x, y, dir, m;
- int max = 100, pos = 0;
- char mapname[24];
- struct npc_data *nd;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
- strchr(w4, ',') == NULL) {
- printf("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 + 1));
- p = strchr(w4, ',');
-
- while (p && pos < max) {
- int nameid,value;
- p++;
- if (sscanf(p, "%d:%d", &nameid, &value) != 2)
- break;
- nd->u.shop_item[pos].nameid = nameid;
- if (value < 0) {
- struct item_data *id = itemdb_search(nameid);
- value = id->value_buy;
- }
- nd->u.shop_item[pos].value = value;
- pos++;
- p=strchr(p,',');
- }
- if (pos == 0) {
- free(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();
- nd->dir = dir;
- nd->flag = 0;
- memcpy(nd->name, w3, 24);
- nd->class = atoi(w4);
- nd->speed = 200;
- nd->chat_id = 0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
-
- nd = (struct npc_data *)aRealloc(nd,
- sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
-
- //printf("shop npc %s %d read done\n",mapname,nd->bl.id);
- npc_shop++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=SHOP;
- nd->n=map_addnpc(m,nd);
- map_addblock(&nd->bl);
- clif_spawnnpc(nd);
- strdb_insert(npcname_db,nd->name,nd);
-
- return 0;
-}
-/*==========================================
- * NPC‚̃‰ƒxƒ‹ƒf[ƒ^ƒRƒ“ƒo[ƒg
- *------------------------------------------
- */
-int npc_convertlabel_db(void *key,void *data,va_list ap)
-{
- char *lname=(char *)key;
- int pos=(int)data;
- struct npc_data *nd;
- struct npc_label_list *lst;
- int num;
- char *p=strchr(lname,':');
-
- 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 *)aCalloc(1,sizeof(struct npc_label_list));
- num=0;
- }else
- lst=(struct npc_label_list *)aRealloc(lst,sizeof(struct npc_label_list)*(num+1));
-
- *p='\0';
- strncpy(lst[num].name,lname,24);
- *p=':';
- lst[num].pos=pos;
- nd->u.scr.label_list=lst;
- nd->u.scr.label_list_num=num+1;
- return 0;
-}
-/*==========================================
- * scripts‰ðÍ
- *------------------------------------------
- */
-static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
-{
- int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov
- char mapname[24];
- unsigned char *srcbuf=NULL,*script;
- int srcsize=65536;
- int startline=0;
- unsigned char line[1024];
- int i;
- struct npc_data *nd;
- int evflag=0;
- 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,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ||
- ( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) {
- printf("bad script line : %s\n",w3);
- return 1;
- }
- m = map_mapname2mapid(mapname);
- }
-
- if(strcmp(w2,"script")==0){
- // ƒXƒNƒŠƒvƒg‚̉ðÍ
- srcbuf=(char *)aCalloc(srcsize,sizeof(char));
- if (strchr(first_line,'{')) {
- strcpy(srcbuf,strchr(first_line,'{'));
- startline=*lines;
- } else
- srcbuf[0]=0;
- while(1) {
- for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
- if (i>=0 && srcbuf[i]=='}')
- break;
- fgets(line,1020,fp);
- (*lines)++;
- if (feof(fp))
- break;
- if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
- srcsize += 65536;
- srcbuf = (char *)aRealloc(srcbuf, srcsize);
- memset(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0]!='{') {
- if (strchr(line,'{')) {
- strcpy(srcbuf,strchr(line,'{'));
- startline=*lines;
- }
- } else
- strcat(srcbuf,line);
- }
- script=parse_script(srcbuf,startline);
- if (script==NULL) {
- // script parse error?
- free(srcbuf);
- return 1;
- }
-
- }else{
- // duplicate‚·‚é
-
- char srcname[128];
- struct npc_data *nd2;
- if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){
- printf("bad duplicate name! : %s",w2);
- return 0;
- }
- if( (nd2=npc_name2id(srcname))==NULL ){
- printf("bad duplicate name! (not exist) : %s\n",srcname);
- return 0;
- }
- script=nd2->u.scr.script;
- label_dup=nd2->u.scr.label_list;
- label_dupnum=nd2->u.scr.label_list_num;
- src_id=nd2->bl.id;
-
- }// end of ƒXƒNƒŠƒvƒg‰ðÍ
-
- nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data));
-
- if(m==-1){
- // ƒXƒNƒŠƒvƒgƒRƒs[—p‚̃_ƒ~[NPC
-
- }else 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 (class>=0) {
-
- for(i=0;i<ys;i++) {
- for(j=0;j<xs;j++) {
- int t;
- t=map_getcell(m,x-xs/2+j,y-ys/2+i);
- if (t==1 || t==5)
- continue;
- map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80);
- }
- }
- }
-
- 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;
- }
-
- if (class<0 && m>=0) { // ƒCƒxƒ“ƒgŒ^NPC
- evflag=1;
- }
-
- while((p=strchr(w3,':'))) {
- if (p[1]==':') break;
- }
- if (p) {
- *p=0;
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,p+2,24);
- }else{
- memcpy(nd->name,w3,24);
- memcpy(nd->exname,w3,24);
- }
-
- 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->dir = dir;
- nd->flag=0;
- nd->class=class;
- nd->speed=200;
- nd->u.scr.script=script;
- nd->u.scr.src_id=src_id;
- nd->chat_id=0;
- nd->option = 0;
- nd->opt1 = 0;
- nd->opt2 = 0;
- nd->opt3 = 0;
- nd->walktimer=-1;
-
- //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class);
- npc_script++;
- nd->bl.type=BL_NPC;
- nd->bl.subtype=SCRIPT;
- if(m>=0){
- nd->n=map_addnpc(m,nd);
- map_addblock(&nd->bl);
-
- 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_insert(ev_db,nd->exname,ev);
- }else
- clif_spawnnpc(nd);
- }
- strdb_insert(npcname_db,nd->exname,nd);
-
-
- //-----------------------------------------
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚Ì€”õ
- if(srcbuf){
- // script–{‘Ì‚ª‚ ‚éꇂ̈—
-
- // ƒ‰ƒxƒ‹ƒf[ƒ^‚̃Rƒ“ƒo[ƒg
- label_db=script_get_label_db();
- strdb_foreach(label_db,npc_convertlabel_db,nd);
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- free(srcbuf);
-
- }else{
- // duplicate
-
-// nd->u.scr.label_list=malloc(sizeof(struct npc_label_list)*label_dupnum);
-// memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum);
-
- 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')) {
- struct event_data *ev;
- char *buf;
- // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
- ev=(struct event_data *)aCalloc(1,sizeof(struct event_data));
- buf=(char *)aCalloc(50,sizeof(char));
- if (strlen(lname)>24) {
- printf("npc_parse_script: label name error !\n");
- exit(1);
- }else{
- ev->nd=nd;
- ev->pos=pos;
- sprintf(buf,"%s::%s",nd->exname,lname);
- strdb_insert(ev_db,buf,ev);
- }
- }
- }
-
- //-----------------------------------------
- // ƒ‰ƒ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 *)aCalloc(1,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=k+1;
- }
- }
- nd->u.scr.nexttimer=-1;
- 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)
-{
- char *srcbuf=NULL,*script;
- int srcsize=65536;
- int startline=0;
- char line[1024];
- int i;
-// struct dbt *label_db;
- char *p;
-
- // ƒXƒNƒŠƒvƒg‚̉ðÍ
- srcbuf=(char *)aCalloc(srcsize,sizeof(char));
- if (strchr(first_line,'{')) {
- strcpy(srcbuf,strchr(first_line,'{'));
- startline=*lines;
- } else
- srcbuf[0]=0;
- while(1) {
- for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
- if (i>=0 && srcbuf[i]=='}')
- break;
- fgets(line,1020,fp);
- (*lines)++;
- if (feof(fp))
- break;
- if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
- srcsize += 65536;
- srcbuf = (char *)aRealloc(srcbuf, srcsize);
- memset(srcbuf + srcsize - 65536, '\0', 65536);
- }
- if (srcbuf[0]!='{') {
- if (strchr(line,'{')) {
- strcpy(srcbuf,strchr(line,'{'));
- startline=*lines;
- }
- } else
- strcat(srcbuf,line);
- }
- script=parse_script(srcbuf,startline);
- if (script==NULL) {
- // script parse error?
- free(srcbuf);
- return 1;
- }
-
- p=(char *)aCalloc(50,sizeof(char));
-
- strncpy(p,w3,50);
- strdb_insert(script_get_userfunc_db(),p,script);
-
-// label_db=script_get_label_db();
-
- // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
- free(srcbuf);
-
-// printf("function %s => %p\n",p,script);
-
- return 0;
-}
-
-
-/*==========================================
- * mobs‰ðÍ
- *------------------------------------------
- */
-int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
-{
- int m,x,y,xs,ys,class,num,delay1,delay2;
- int i;
- char mapname[24];
- char eventname[24]="";
- struct mob_data *md;
-
- xs=ys=0;
- delay1=delay2=0;
- // ˆø”‚̌”ƒ`ƒFƒbƒN
- if (sscanf(w1,"%[^,],%d,%d,%d,%d",mapname,&x,&y,&xs,&ys) < 3 ||
- sscanf(w4,"%d,%d,%d,%d,%s",&class,&num,&delay1,&delay2,eventname) < 2 ) {
- printf("bad monster line : %s\n",w3);
- return 1;
- }
-
- m=map_mapname2mapid(mapname);
-
- if ( num>1 && battle_config.mob_count_rate!=100) {
- if ( (num=num*battle_config.mob_count_rate/100)<1 )
- num=1;
- }
-
- for(i=0;i<num;i++) {
- md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
-
- md->bl.prev=NULL;
- md->bl.next=NULL;
- md->bl.m=m;
- md->bl.x=x;
- md->bl.y=y;
- if(strcmp(w3,"--en--")==0)
- memcpy(md->name,mob_db[class].name,24);
- else if(strcmp(w3,"--ja--")==0)
- memcpy(md->name,mob_db[class].jname,24);
- else
- memcpy(md->name,w3,24);
-
- md->n = i;
- md->base_class = md->class = class;
- md->bl.id=npc_get_new_npc_id();
- md->m =m;
- md->x0=x;
- md->y0=y;
- md->xs=xs;
- md->ys=ys;
- md->spawndelay1=delay1;
- md->spawndelay2=delay2;
-
- memset(&md->state,0,sizeof(md->state));
- md->timer = -1;
- md->target_id=0;
- md->attacked_id=0;
- md->speed=mob_db[class].speed;
-
- if (mob_db[class].mode&0x02)
- md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
- else
- md->lootitem=NULL;
-
- if (strlen(eventname)>=4) {
- memcpy(md->npc_event,eventname,24);
- }else
- memset(md->npc_event,0,24);
-
- md->bl.type=BL_MOB;
- map_addiddb(&md->bl);
- mob_spawn(md->bl.id);
-
- npc_mob++;
- }
- //printf("warp npc %s %d read done\n",mapname,nd->bl.id);
-
- return 0;
-}
-
-/*==========================================
- * ƒ}ƒbƒvƒtƒ‰ƒOs‚̉ðÍ
- *------------------------------------------
- */
-static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4)
-{
- int m;
- char mapname[24],savemap[16];
- int savex,savey;
- char drop_arg1[16],drop_arg2[16];
- int drop_id=0,drop_type=0,drop_per=0;
-
- // ˆø”‚̌”ƒ`ƒFƒbƒN
-// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 )
- if ( sscanf(w1,"%[^,]",mapname) != 1 )
- return 1;
-
- m=map_mapname2mapid(mapname);
- if (m<0)
- return 1;
-
-//ƒ}ƒbƒvƒtƒ‰ƒO
- if ( strcmpi(w3,"nosave")==0) {
- if (strcmp(w4,"SavePoint")==0) {
- memcpy(map[m].save.map,"SavePoint",16);
- map[m].save.x=-1;
- map[m].save.y=-1;
- }else if (sscanf(w4,"%[^,],%d,%d",savemap,&savex,&savey)==3) {
- memcpy(map[m].save.map,savemap,16);
- map[m].save.x=savex;
- map[m].save.y=savey;
- }
- map[m].flag.nosave=1;
- }
- else if (strcmpi(w3,"nomemo")==0) {
- map[m].flag.nomemo=1;
- }
- else if (strcmpi(w3,"noteleport")==0) {
- map[m].flag.noteleport=1;
- }
- else if (strcmpi(w3,"nowarp")==0) {
- map[m].flag.nowarp=1;
- }
- else if (strcmpi(w3,"nowarpto")==0) {
- map[m].flag.nowarpto=1;
- }
- else if (strcmpi(w3,"noreturn")==0) {
- map[m].flag.noreturn=1;
- }
- else if (strcmpi(w3,"monster_noteleport")==0) {
- map[m].flag.monster_noteleport=1;
- }
- else if (strcmpi(w3,"nobranch")==0) {
- map[m].flag.nobranch=1;
- }
- else if (strcmpi(w3,"nopenalty")==0) {
- map[m].flag.nopenalty=1;
- }
- else if (strcmpi(w3,"pvp")==0) {
- map[m].flag.pvp=1;
- }
- else if (strcmpi(w3,"pvp_noparty")==0) {
- map[m].flag.pvp_noparty=1;
- }
- else if (strcmpi(w3,"pvp_noguild")==0) {
- map[m].flag.pvp_noguild=1;
- }
- else if (strcmpi(w3,"pvp_nightmaredrop")==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 (strcmpi(w3,"pvp_nocalcrank")==0) {
- map[m].flag.pvp_nocalcrank=1;
- }
- else if (strcmpi(w3,"gvg")==0) {
- map[m].flag.gvg=1;
- }
- else if (strcmpi(w3,"gvg_noparty")==0) {
- map[m].flag.gvg_noparty=1;
- }
- else if (strcmpi(w3,"nozenypenalty")==0) {
- map[m].flag.nozenypenalty=1;
- }
- else if (strcmpi(w3,"notrade")==0) {
- map[m].flag.notrade=1;
- }
- else if (strcmpi(w3,"noskill")==0) {
- map[m].flag.noskill=1;
- }
- else if (battle_config.pk_mode && strcmpi(w3,"nopvp")==0) { // nopvp for pk mode [Valaris]
- map[m].flag.nopvp=1;
- map[m].flag.pvp=0;
- }
- else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
- map[m].flag.noicewall=1;
- }
- else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
- map[m].flag.snow=1;
- }
- else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
- map[m].flag.fog=1;
- }
- else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
- map[m].flag.sakura=1;
- }
- else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
- map[m].flag.leaves=1;
- }
- else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
- map[m].flag.rain=1;
- }
-
- return 0;
-}
-
-static int ev_db_final(void *key,void *data,va_list ap)
-{
- free(data);
- if(strstr(key,"::")!=NULL)
- free(key);
- return 0;
-}
-static int npcname_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-int do_final_npc(void)
-{
- int i;
- struct block_list *bl;
- struct npc_data *nd;
- struct mob_data *md;
- struct chat_data *cd;
- struct pet_data *pd;
-
- if(ev_db)
- strdb_final(ev_db,ev_db_final);
- if(npcname_db)
- strdb_final(npcname_db,npcname_db_final);
-
- for(i=START_NPC_NUM;i<npc_id;i++){
- if((bl=map_id2bl(i))){
- if(bl->type == BL_NPC && (nd = (struct npc_data *)bl)){
- if(nd->chat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))){
- free(cd);
- cd = NULL;
- }
- if(nd->bl.subtype == SCRIPT){
- if(nd->u.scr.timer_event)
- free(nd->u.scr.timer_event);
- if(nd->u.scr.src_id==0){
- if(nd->u.scr.script){
- free(nd->u.scr.script);
- nd->u.scr.script=NULL;
- }
- if(nd->u.scr.label_list){
- free(nd->u.scr.label_list);
- nd->u.scr.label_list = NULL;
- }
- }
- }
- free(nd);
- nd = NULL;
- }else if(bl->type == BL_MOB && (md = (struct mob_data *)bl)){
- if(md->lootitem){
- free(md->lootitem);
- md->lootitem = NULL;
- }
- free(md);
- md = NULL;
- }else if(bl->type == BL_PET && (pd = (struct pet_data *)bl)){
- free(pd);
- pd = NULL;
- }
- }
- }
-
- return 0;
-}
-
-
-void ev_release(struct dbn *db, int which)
-{
- if (which & 0x1)
- free(db->key);
- if (which & 0x2)
- free(db->data);
-}
-
-/*==========================================
- * npc‰Šú‰»
- *------------------------------------------
- */
-int do_init_npc(void)
-{
- struct npc_src_list *nsl;
- FILE *fp;
- char line[1024];
- int m,lines;
-
- ev_db=strdb_init(24);
- npcname_db=strdb_init(24);
-
- ev_db->release = ev_release;
-
- memset(&ev_tm_b,-1,sizeof(ev_tm_b));
-
- for(nsl=npc_src_first;nsl;nsl=nsl->next) {
- if(nsl->prev){
- free(nsl->prev);
- nsl->prev = NULL;
- }
- fp=fopen(nsl->name,"r");
- if (fp==NULL) {
- printf("file not found : %s\n",nsl->name);
- exit(1);
- }
- lines=0;
- while(fgets(line,1020,fp)) {
- char w1[1024],w2[1024],w3[1024],w4[1024],mapname[1024];
- int i,j,w4pos,count;
- lines++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
- // •s—v‚ȃXƒy[ƒX‚âƒ^ƒu‚̘A‘±‚Í‹l‚ß‚é
- for(i=j=0;line[i];i++) {
- if (line[i]==' ') {
- if (!((line[i+1] && (isspace(line[i+1]) || line[i+1]==',')) ||
- (j && line[j-1]==',')))
- line[j++]=' ';
- } else if (line[i]=='\t') {
- if (!(j && line[j-1]=='\t'))
- line[j++]='\t';
- } else
- line[j++]=line[i];
- }
- // ʼn‚̓^ƒu‹æØ‚è‚Ń`ƒFƒbƒN‚µ‚Ä‚Ý‚ÄAƒ_ƒ‚È‚çƒXƒy[ƒX‹æØ‚è‚ÅŠm”F
- if ((count=sscanf(line,"%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]",w1,w2,w3,&w4pos,w4)) < 3 &&
- (count=sscanf(line,"%s%s%s%n%s",w1,w2,w3,&w4pos,w4)) < 3) {
- continue;
- }
- // ƒ}ƒbƒv‚Ì‘¶ÝŠm”F
- if( strcmp(w1,"-")!=0 && strcmpi(w1,"function")!=0 ){
- sscanf(w1,"%[^,]",mapname);
- m = map_mapname2mapid(mapname);
- if (strlen(mapname)>16 || m<0) {
- // "mapname" is not assigned to this server
- 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);
- }else{
- npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
- }
- } 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);
- } 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);
- }
- }
- fclose(fp);
- printf("\rLoading NPCs [%d]: %-54s",npc_id-START_NPC_NUM,nsl->name);
- fflush(stdout);
- }
- printf("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
- npc_id-START_NPC_NUM,npc_warp,npc_shop,npc_script,npc_mob);
-
- add_timer_func_list(npc_walktimer,"npc_walktimer"); // [Valaris]
- 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");
-
- //exit(1);
-
- return 0;
-}
+// $Id: npc.c,v 1.5 2004/09/25 05:32:18 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+
+#include "db.h"
+#include "timer.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "map.h"
+#include "npc.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "itemdb.h"
+#include "script.h"
+#include "mob.h"
+#include "pet.h"
+#include "battle.h"
+#include "skill.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+
+
+struct npc_src_list {
+ struct npc_src_list * next;
+ struct npc_src_list * prev;
+ char name[4];
+} ;
+
+static struct npc_src_list *npc_src_first,*npc_src_last;
+static int npc_id=START_NPC_NUM;
+static int npc_warp,npc_shop,npc_script,npc_mob;
+
+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 int npc_walktimer(int,unsigned int,int,int); // [Valaris]
+static int npc_walktoxy_sub(struct npc_data *nd); // [Valaris]
+
+/*==========================================
+ * 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 *)aCalloc(50,sizeof(char));
+
+ 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)){
+
+ if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ return 1;
+
+ memcpy(name,nd->name,50);
+ if(sd->areanpc_id==nd->bl.id)
+ return 1;
+ sd->areanpc_id=nd->bl.id;
+ npc_event(sd,strcat(name,"::OnTouch"),0);
+ }
+ free(name);
+ return 0;
+}
+int npc_enable(const char *name,int flag)
+{
+ struct npc_data *nd=strdb_search(npcname_db,name);
+ if (nd==NULL)
+ return 0;
+
+ if (flag&1) { // —LŒø‰»
+ nd->flag&=~1;
+ clif_spawnnpc(nd);
+ }else if (flag&2){
+ nd->flag&=~1;
+ nd->option = 0x0000;
+ clif_changeoption(&nd->bl);
+ }else if (flag&4){
+ nd->flag|=1;
+ nd->option = 0x0002;
+ clif_changeoption(&nd->bl);
+ }else{ // –³Œø‰»
+ nd->flag|=1;
+ clif_clearchar(&nd->bl,0);
+ }
+ 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 strdb_search(npcname_db,name);
+}
+/*==========================================
+ * ƒCƒxƒ“ƒgƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
+ *------------------------------------------
+ */
+int npc_event_dequeue(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ sd->npc_id=0;
+ if (sd->eventqueue[0][0]) { // ƒLƒ…[‚̃Cƒxƒ“ƒgˆ—
+ char *name=(char *)aCalloc(50,sizeof(char));
+ int i;
+
+ memcpy(name,sd->eventqueue[0],50);
+ for(i=MAX_EVENTQUEUE-2;i>=0;i--)
+ memcpy(sd->eventqueue[i],sd->eventqueue[i+1],50);
+ add_timer(gettick()+100,npc_event_timer,sd->bl.id,(int)name);
+ }
+ return 0;
+}
+
+int npc_delete(struct npc_data *nd)
+{
+ nullpo_retr(1, nd);
+
+ if(nd->bl.prev == NULL)
+ return 1;
+
+ clif_clearchar_area(&nd->bl,1);
+ map_delblock(&nd->bl);
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒg‚Ì’x‰„ŽÀs
+ *------------------------------------------
+ */
+int npc_event_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ if (sd==NULL)
+ return 0;
+
+ npc_event(sd,(const char *)data,0);
+ free((void*)data);
+ return 0;
+}
+
+int npc_timer_event(const char *eventname) // Added by RoVeRT
+{
+ struct event_data *ev=strdb_search(ev_db,eventname);
+ struct npc_data *nd;
+// int xs,ys;
+
+ if((ev==NULL || (nd=ev->nd)==NULL)){
+ printf("npc_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(void *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(void *key,void *data,va_list ap) // Added by RoVeRT
+{
+ struct npc_data *nd=(struct npc_data*)data;
+
+ if(nd->timer == -1)
+ return 0;
+
+ strdb_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
+{
+ strdb_foreach(npcname_db,npc_timer_sub);
+
+ free((void*)data);
+ return 0;
+}*/
+/*==========================================
+ * ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚̃GƒNƒXƒ|[ƒg
+ * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
+ *------------------------------------------
+ */
+int npc_event_export(void *key,void *data,va_list ap)
+{
+ char *lname=(char *)key;
+ 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;
+ char *buf;
+ char *p=strchr(lname,':');
+ // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
+ ev=calloc(sizeof(struct event_data), 1);
+ buf=calloc(50, 1);
+ if (ev==NULL || buf==NULL) {
+ printf("npc_event_export: out of memory !\n");
+ exit(1);
+ }else if (p==NULL || (p-lname)>24) {
+ printf("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_insert(ev_db,buf,ev);
+// if (battle_config.etc_log)
+// printf("npc_event_export: export [%s]\n",buf);
+ }
+ }
+ return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*==========================================
+ * ‘S‚Ä‚ÌNPC‚ÌOn*ƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int npc_event_doall_sub(void *key,void *data,va_list ap)
+{
+ char *p=(char *)key;
+ struct event_data *ev;
+ int *c;
+ const 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 char *);
+
+ if( (p=strchr(p,':')) && 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_doall(const char *name)
+{
+ int c=0;
+ char buf[64]="::";
+
+ strncpy(buf+2,name,62);
+ strdb_foreach(ev_db,npc_event_doall_sub,&c,buf);
+ return c;
+}
+
+int npc_event_do_sub(void *key,void *data,va_list ap)
+{
+ char *p=(char *)key;
+ struct event_data *ev;
+ int *c;
+ const 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 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 char *name)
+{
+ int c=0;
+
+ if (*name==':' && name[1]==':') {
+ return npc_event_doall(name+2);
+ }
+
+ strdb_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];
+ int c=0;
+
+ time(&timer);
+ t=localtime(&timer);
+
+ 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);
+ }
+ 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");
+ printf("npc: OnInit Event done. (%d npc)\n",c);
+
+ 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;
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( nd->eventtimer[i]==-1 )
+ break;
+ if(i<MAX_EVENTTIMER){
+ char *evname=malloc(24);
+ if(evname==NULL){
+ printf("npc_addeventtimer: out of memory !\n");exit(1);
+ }
+ memcpy(evname,name,24);
+ nd->eventtimer[i]=add_timer(gettick()+tick,
+ npc_event_timer,nd->bl.id,(int)evname);
+ }else
+ printf("npc_addtimer: event timer is full !\n");
+
+ return 0;
+}
+
+int npc_deleventtimer(struct npc_data *nd,const char *name)
+{
+ int i;
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( nd->eventtimer[i]!=-1 && strcmp(
+ (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(void *key,void *data,va_list ap)
+{
+ char *p=(char *)key;
+ 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,':')) && 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, struct map_session_data *sd, int option)
+{
+ strdb_foreach(ev_db,npc_do_ontimer_sub,&npc_id,sd,option);
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒg—pƒ‰ƒxƒ‹‚ÌŽæ‚èž‚Ý
+ * npc_parse_script->strdb_foreach‚©‚çŒÄ‚΂ê‚é
+ *------------------------------------------
+ */
+int npc_timerevent_import(void *key,void *data,va_list ap)
+{
+ char *lname=(char *)key;
+ 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=malloc(sizeof(struct npc_timerevent_list));
+ else te=realloc( te, sizeof(struct npc_timerevent_list) * (i+1) );
+ if(te==NULL){
+ printf("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=i+1;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int npc_timerevent(int tid,unsigned int tick,int id,int data)
+{
+ int next,t;
+ struct npc_data* nd=(struct npc_data *)map_id2bl(id);
+ struct npc_timerevent_list *te;
+ if( nd==NULL || nd->u.scr.nexttimer<0 ){
+ printf("npc_timerevent: ??\n");
+ return 0;
+ }
+ nd->u.scr.timertick=tick;
+ te=nd->u.scr.timer_event+ nd->u.scr.nexttimer;
+ nd->u.scr.timerid = -1;
+
+ t = nd->u.scr.timer+=data;
+ nd->u.scr.nexttimer++;
+ if( nd->u.scr.timeramount>nd->u.scr.nexttimer ){
+ next= nd->u.scr.timer_event[ nd->u.scr.nexttimer ].timer - t;
+ nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,next);
+ }
+
+ run_script(nd->u.scr.script,te->pos,0,nd->bl.id);
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgŠJŽn
+ *------------------------------------------
+ */
+int npc_timerevent_start(struct npc_data *nd)
+{
+ int j,n, next;
+
+ nullpo_retr(0, nd);
+
+ n=nd->u.scr.timeramount;
+ if( nd->u.scr.nexttimer>=0 || n==0 )
+ return 0;
+
+ for(j=0;j<n;j++){
+ if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer )
+ break;
+ }
+ nd->u.scr.nexttimer=j;
+ nd->u.scr.timertick=gettick();
+
+ if(j>=n)
+ return 0;
+
+ next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer;
+ nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,next);
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[ƒCƒxƒ“ƒgI—¹
+ *------------------------------------------
+ */
+int npc_timerevent_stop(struct npc_data *nd)
+{
+ nullpo_retr(0, nd);
+
+ if( nd->u.scr.nexttimer>=0 ){
+ nd->u.scr.nexttimer = -1;
+ nd->u.scr.timer += (int)(gettick() - nd->u.scr.timertick);
+ if(nd->u.scr.timerid!=-1)
+ delete_timer(nd->u.scr.timerid,npc_timerevent);
+ nd->u.scr.timerid = -1;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒ^ƒ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.nexttimer>=0 )
+ tick += (int)(gettick() - nd->u.scr.timertick);
+ return tick;
+}
+/*==========================================
+ * ƒ^ƒCƒ}[’l‚ÌÝ’è
+ *------------------------------------------
+ */
+int npc_settimerevent_tick(struct npc_data *nd,int newtimer)
+{
+ int flag;
+
+ nullpo_retr(0, nd);
+
+ flag= nd->u.scr.nexttimer;
+
+ npc_timerevent_stop(nd);
+ nd->u.scr.timer=newtimer;
+ if(flag>=0)
+ npc_timerevent_start(nd);
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgŒ^‚ÌNPCˆ—
+ *------------------------------------------
+ */
+int npc_event(struct map_session_data *sd,const char *eventname,int mob_kill)
+{
+ struct event_data *ev=strdb_search(ev_db,eventname);
+ struct npc_data *nd;
+ int xs,ys;
+ char mobevent[100];
+
+ if( sd == NULL ){
+ printf("npc_event nullpo?\n");
+ }
+
+ if(ev==NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0)
+ return 1;
+
+ if(ev==NULL || (nd=ev->nd)==NULL){
+ if(mob_kill && (ev==NULL || (nd=ev->nd)==NULL)){
+ strcpy( mobevent, eventname);
+ strcat( mobevent, "::OnMyMobDead");
+ ev=strdb_search(ev_db,mobevent);
+ if (ev==NULL || (nd=ev->nd)==NULL) {
+ if (strnicmp(eventname,"GM_MONSTER",10)!=0)
+ printf("npc_event: event not found [%s]\n",mobevent);
+ return 0;
+ }
+ }
+ else {
+ if(battle_config.error_log)
+ printf("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 ) {
+ 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;
+ }
+
+ if ( sd->npc_id!=0) {
+// if (battle_config.error_log)
+// printf("npc_event: npc_id != 0\n");
+ int i;
+ for(i=0;i<MAX_EVENTQUEUE;i++)
+ if (!sd->eventqueue[i][0])
+ break;
+ if (i==MAX_EVENTQUEUE) {
+ if (battle_config.error_log)
+ printf("npc_event: event queue is full !\n");
+ }else{
+// if (battle_config.etc_log)
+// printf("npc_event: enqueue\n");
+ memcpy(sd->eventqueue[i],eventname,50);
+ }
+ return 1;
+ }
+ if (nd->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ npc_event_dequeue(sd);
+ return 0;
+ }
+
+ sd->npc_id=nd->bl.id;
+ sd->npc_pos=run_script(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id);
+ return 0;
+}
+
+
+int npc_command_sub(void *key,void *data,va_list ap)
+{
+ char *p=(char *)key;
+ struct event_data *ev=(struct event_data *)data;
+ char *npcname=va_arg(ap,char *);
+ char *command=va_arg(ap,char *);
+ 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,char *npcname,char *command)
+{
+ strdb_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]->flag&1) { // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ 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)
+ printf("npc_touch_areanpc : some bug \n");
+ }
+ return 1;
+ }
+ switch(map[m].npc[i]->bl.subtype) {
+ case WARP:
+ skill_stop_dancing(&sd->bl,0);
+ pc_setpos(sd,map[m].npc[i]->u.warp.name,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0);
+ break;
+ case SCRIPT:
+ {
+ char *name=(char *)aCalloc(50,sizeof(char));
+
+ memcpy(name,map[m].npc[i]->name,50);
+ if(sd->areanpc_id==map[m].npc[i]->bl.id)
+ return 1;
+ sd->areanpc_id=map[m].npc[i]->bl.id;
+ if(npc_event(sd,strcat(name,"::OnTouch"),0)>0)
+ npc_click(sd,map[m].npc[i]->bl.id);
+ free(name);
+ break;
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ * ‹ß‚­‚©‚Ç‚¤‚©‚Ì”»’è
+ *------------------------------------------
+ */
+int npc_checknear(struct map_session_data *sd,int id)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(0, sd);
+
+ nd=(struct npc_data *)map_id2bl(id);
+ if (nd==NULL || nd->bl.type!=BL_NPC) {
+ if (battle_config.error_log)
+ printf("no such npc : %d\n",id);
+ return 1;
+ }
+
+ if (nd->class<0) // ƒCƒxƒ“ƒgŒn‚Íí‚ÉOK
+ return 0;
+
+ // ƒGƒŠƒA”»’è
+ if (nd->bl.m!=sd->bl.m ||
+ nd->bl.x<sd->bl.x-AREA_SIZE-1 || nd->bl.x>sd->bl.x+AREA_SIZE+1 ||
+ nd->bl.y<sd->bl.y-AREA_SIZE-1 || nd->bl.y>sd->bl.y+AREA_SIZE+1)
+ return 1;
+
+ return 0;
+}
+
+/*==========================================
+ * ƒNƒŠƒbƒNŽž‚ÌNPCˆ—
+ *------------------------------------------
+ */
+int npc_click(struct map_session_data *sd,int id)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(1, sd);
+
+ if (sd->npc_id != 0) {
+ if (battle_config.error_log)
+ printf("npc_click: npc_id != 0\n");
+ return 1;
+ }
+
+ if (npc_checknear(sd,id))
+ return 1;
+
+ nd=(struct npc_data *)map_id2bl(id);
+
+ if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ return 1;
+
+ sd->npc_id=id;
+ switch(nd->bl.subtype) {
+ case SHOP:
+ clif_npcbuysell(sd,id);
+ npc_event_dequeue(sd);
+ break;
+ case SCRIPT:
+ sd->npc_pos=run_script(nd->u.scr.script,0,sd->bl.id,id);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_scriptcont(struct map_session_data *sd,int id)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(1, sd);
+
+ if (id!=sd->npc_id)
+ return 1;
+ if (npc_checknear(sd,id))
+ return 1;
+
+ nd=(struct npc_data *)map_id2bl(id);
+
+ sd->npc_pos=run_script(nd->u.scr.script,sd->npc_pos,sd->bl.id,id);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int npc_buysellsel(struct map_session_data *sd,int id,int type)
+{
+ struct npc_data *nd;
+
+ nullpo_retr(1, sd);
+
+ if (npc_checknear(sd,id))
+ return 1;
+
+ nd=(struct npc_data *)map_id2bl(id);
+ if (nd->bl.subtype!=SHOP) {
+ if (battle_config.error_log)
+ printf("no such shop npc : %d\n",id);
+ sd->npc_id=0;
+ return 1;
+ }
+ if (nd->flag&1) // –³Œø‰»‚³‚ê‚Ä‚¢‚é
+ return 1;
+
+ sd->npc_shopid=id;
+ if (type==0) {
+ clif_buylist(sd,nd);
+ } else {
+ clif_selllist(sd);
+ }
+ 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 (npc_checknear(sd,sd->npc_shopid))
+ return 3;
+
+ nd=(struct npc_data*)map_id2bl(sd->npc_shopid);
+ 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])
+ break;
+ }
+ if (nd->u.shop_item[j].nameid==0)
+ return 3;
+
+ 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; // Ží—Þ”’´‰ß
+
+ pc_payzeny(sd,(int)z);
+ for(i=0;i<n;i++) {
+ struct item item_tmp;
+
+ memset(&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]);
+ }
+
+ //¤lŒoŒ±’l
+/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
+ z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp;
+ pc_gainexp(sd,0,z);
+ }*/
+ 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 = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
+ if (z < 1)
+ z = 1;
+ pc_gainexp(sd,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;
+
+ nullpo_retr(1, sd);
+ nullpo_retr(1, item_list);
+
+ if (npc_checknear(sd,sd->npc_shopid))
+ return 1;
+ for(i=0,z=0;i<n;i++) {
+ int nameid;
+ if (item_list[i*2]-2 <0 || item_list[i*2]-2 >=MAX_INVENTORY)
+ return 1;
+ nameid=sd->status.inventory[item_list[i*2]-2].nameid;
+ if (nameid == 0 ||
+ sd->status.inventory[item_list[i*2]-2].amount < item_list[i*2+1])
+ return 1;
+ if (itemdb_value_notoc(nameid))
+ z+=(double)itemdb_value_sell(nameid) * item_list[i*2+1];
+ else
+ z+=(double)pc_modifysellvalue(sd,itemdb_value_sell(nameid)) * item_list[i*2+1];
+ itemamount+=item_list[i*2+1];
+ }
+
+ if (z > MAX_ZENY) z = MAX_ZENY;
+ pc_getzeny(sd,(int)z);
+ for(i=0;i<n;i++) {
+ int item_id=item_list[i*2]-2;
+ if( sd->status.inventory[item_id].nameid>0 && sd->inventory_data[item_id] != NULL &&
+ sd->inventory_data[item_id]->type==7 && sd->status.inventory[item_id].amount>0 &&
+ sd->status.inventory[item_id].card[0] == (short)0xff00)
+ if(search_petDB_index(sd->status.inventory[item_id].nameid, PET_EGG) >= 0)
+ intif_delete_petdata((*(long *)(&sd->status.inventory[item_id].card[1])));
+ pc_delitem(sd,item_id,item_list[i*2+1],0);
+ }
+
+ //¤lŒoŒ±’l
+/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
+ z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ;
+ pc_gainexp(sd,0,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 = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
+ if (z < 1)
+ z = 1;
+ pc_gainexp(sd,0,(int)z);
+ }
+ }
+
+ return 0;
+
+}
+
+// [Valaris] NPC Walking
+
+/*==========================================
+ * Time calculation concerning one step next to npc
+ *------------------------------------------
+ */
+static int calc_next_walk_step(struct npc_data *nd)
+{
+ nullpo_retr(0, nd);
+
+ if(nd->walkpath.path_pos>=nd->walkpath.path_len)
+ return -1;
+ if(nd->walkpath.path[nd->walkpath.path_pos]&1)
+ return battle_get_speed(&nd->bl)*14/10;
+ return battle_get_speed(&nd->bl);
+}
+
+
+/*==========================================
+ * npc Walk processing
+ *------------------------------------------
+ */
+static int npc_walk(struct npc_data *nd,unsigned int tick,int data)
+{
+ int moveblock;
+ int i,ctype;
+ static int dirx[8]={0,-1,-1,-1,0,1,1,1};
+ static int diry[8]={1,1,0,-1,-1,-1,0,1};
+ int x,y,dx,dy;
+
+ nullpo_retr(0, nd);
+
+ nd->state.state=MS_IDLE;
+ if(nd->walkpath.path_pos>=nd->walkpath.path_len || nd->walkpath.path_pos!=data)
+ return 0;
+
+ nd->walkpath.path_half ^= 1;
+ if(nd->walkpath.path_half==0){
+ nd->walkpath.path_pos++;
+ if(nd->state.change_walk_target){
+ npc_walktoxy_sub(nd);
+ return 0;
+ }
+ }
+ else {
+ if(nd->walkpath.path[nd->walkpath.path_pos]>=8)
+ return 1;
+
+ x = nd->bl.x;
+ y = nd->bl.y;
+ ctype = map_getcell(nd->bl.m,x,y);
+ if(ctype == 1 || ctype == 5) {
+ npc_stop_walking(nd,1);
+ return 0;
+ }
+ nd->dir=nd->walkpath.path[nd->walkpath.path_pos];
+ dx = dirx[nd->dir];
+ dy = diry[nd->dir];
+
+ ctype = map_getcell(nd->bl.m,x+dx,y+dy);
+ if(ctype == 1 || ctype == 5) {
+ npc_walktoxy_sub(nd);
+ return 0;
+ }
+
+ moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
+
+ nd->state.state=MS_WALK;
+ map_foreachinmovearea(clif_npcoutsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,nd);
+
+ x += dx;
+ y += dy;
+
+ if(moveblock) map_delblock(&nd->bl);
+ nd->bl.x = x;
+ nd->bl.y = y;
+ if(moveblock) map_addblock(&nd->bl);
+
+ map_foreachinmovearea(clif_npcinsight,nd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,nd);
+ nd->state.state=MS_IDLE;
+ }
+ if((i=calc_next_walk_step(nd))>0){
+ i = i>>1;
+ if(i < 1 && nd->walkpath.path_half == 0)
+ i = 1;
+ nd->walktimer=add_timer(tick+i,npc_walktimer,nd->bl.id,nd->walkpath.path_pos);
+ nd->state.state=MS_WALK;
+
+ if(nd->walkpath.path_pos>=nd->walkpath.path_len)
+ clif_fixnpcpos(nd); // When npc stops, retransmission current of a position.
+
+ }
+ return 0;
+}
+
+int npc_changestate(struct npc_data *nd,int state,int type)
+{
+ int i;
+
+ nullpo_retr(0, nd);
+
+ if(nd->walktimer != -1)
+ delete_timer(nd->walktimer,npc_walktimer);
+ nd->walktimer=-1;
+ nd->state.state=state;
+
+ switch(state){
+ case MS_WALK:
+ if((i=calc_next_walk_step(nd))>0){
+ i = i>>2;
+ nd->walktimer=add_timer(gettick()+i,npc_walktimer,nd->bl.id,0);
+ }
+ else
+ nd->state.state=MS_IDLE;
+ break;
+ case MS_DELAY:
+ nd->walktimer=add_timer(gettick()+type,npc_walktimer,nd->bl.id,0);
+ break;
+
+ }
+
+ return 0;
+}
+
+static int npc_walktimer(int tid,unsigned int tick,int id,int data)
+{
+ struct npc_data *nd;
+
+ nd=(struct npc_data*)map_id2bl(id);
+ if(nd == NULL || nd->bl.type != BL_NPC)
+ return 1;
+
+ if(nd->walktimer != tid){
+ return 0;
+ }
+
+ nd->walktimer=-1;
+
+ if(nd->bl.prev == NULL)
+ return 1;
+
+ switch(nd->state.state){
+ case MS_WALK:
+ npc_walk(nd,tick,data);
+ break;
+ case MS_DELAY:
+ npc_changestate(nd,MS_IDLE,0);
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+
+static int npc_walktoxy_sub(struct npc_data *nd)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, nd);
+
+ if(path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,nd->to_x,nd->to_y,nd->state.walk_easy))
+ return 1;
+ memcpy(&nd->walkpath,&wpd,sizeof(wpd));
+
+ nd->state.change_walk_target=0;
+ npc_changestate(nd,MS_WALK,0);
+
+ clif_movenpc(nd);
+
+ return 0;
+}
+
+int npc_walktoxy(struct npc_data *nd,int x,int y,int easy)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, nd);
+
+ if(nd->state.state == MS_WALK && path_search(&wpd,nd->bl.m,nd->bl.x,nd->bl.y,x,y,0) )
+ return 1;
+
+ nd->state.walk_easy = easy;
+ nd->to_x=x;
+ nd->to_y=y;
+ if(nd->state.state == MS_WALK) {
+ nd->state.change_walk_target=1;
+ } else {
+ return npc_walktoxy_sub(nd);
+ }
+
+ return 0;
+}
+
+int npc_stop_walking(struct npc_data *nd,int type)
+{
+ nullpo_retr(0, nd);
+
+ if(nd->state.state == MS_WALK || nd->state.state == MS_IDLE) {
+ int dx=0,dy=0;
+
+ nd->walkpath.path_len=0;
+ if(type&4){
+ dx=nd->to_x-nd->bl.x;
+ if(dx<0)
+ dx=-1;
+ else if(dx>0)
+ dx=1;
+ dy=nd->to_y-nd->bl.y;
+ if(dy<0)
+ dy=-1;
+ else if(dy>0)
+ dy=1;
+ }
+ nd->to_x=nd->bl.x+dx;
+ nd->to_y=nd->bl.y+dy;
+ if(dx!=0 || dy!=0){
+ npc_walktoxy_sub(nd);
+ return 0;
+ }
+ npc_changestate(nd,MS_IDLE,0);
+ }
+ if(type&0x01)
+ clif_fixnpcpos(nd);
+ if(type&0x02) {
+ int delay=battle_get_dmotion(&nd->bl);
+ unsigned int tick = gettick();
+ if(nd->canmove_tick < tick)
+ nd->canmove_tick = tick + delay;
+ }
+
+ return 0;
+}
+
+
+//
+// ‰Šú‰»ŠÖŒW
+//
+
+/*==========================================
+ * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̃NƒŠƒA
+ *------------------------------------------
+ */
+void npc_clearsrcfile()
+{
+ struct npc_src_list *p=npc_src_first;
+
+ while( p ) {
+ struct npc_src_list *p2=p;
+ p=p->next;
+ free(p2);
+ }
+ npc_src_first=NULL;
+ npc_src_last=NULL;
+}
+/*==========================================
+ * “Ç‚Ýž‚Þnpcƒtƒ@ƒCƒ‹‚̒ljÁ
+ *------------------------------------------
+ */
+void npc_addsrcfile(char *name)
+{
+ struct npc_src_list *new;
+ size_t len;
+
+ if ( strcmpi(name,"clear")==0 ) {
+ npc_clearsrcfile();
+ return;
+ }
+
+ len = sizeof(*new) + strlen(name);
+ new=(struct npc_src_list *)aCalloc(1,len);
+ new->next = NULL;
+ strncpy(new->name,name,strlen(name)+1);
+ if (npc_src_first==NULL)
+ npc_src_first = new;
+ if (npc_src_last)
+ npc_src_last->next = new;
+
+ npc_src_last=new;
+}
+/*==========================================
+ * “Ç‚Ýž‚Þ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;
+ }
+
+ for( ; p; lp=&p->next,pp=p,p=p->next ) {
+ if ( strcmp(p->name,name)==0 ) {
+ *lp=p->next;
+ if ( npc_src_last==p )
+ npc_src_last=pp;
+ free(p);
+ break;
+ }
+ }
+}
+
+/*==========================================
+ * 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[24],to_mapname[24];
+ struct npc_data *nd;
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1,"%[^,],%d,%d",mapname,&x,&y) != 3 ||
+ sscanf(w4,"%d,%d,%[^,],%d,%d",&xs,&ys,to_mapname,&to_x,&to_y) != 5) {
+ printf("bad warp line : %s\n",w3);
+ return 1;
+ }
+
+ m=map_mapname2mapid(mapname);
+
+ 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;
+ nd->dir=0;
+ nd->flag=0;
+ memcpy(nd->name,w3,24);
+ memcpy(nd->exname,w3,24);
+
+ nd->chat_id=0;
+ if (!battle_config.warp_point_debug)
+ nd->class=WARP_CLASS;
+ else
+ nd->class=WARP_DEBUG_CLASS;
+ nd->speed=200;
+ nd->option = 0;
+ nd->opt1 = 0;
+ nd->opt2 = 0;
+ nd->opt3 = 0;
+ memcpy(nd->u.warp.name,to_mapname,16);
+ 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++) {
+ int t;
+ t=map_getcell(m,x-xs/2+j,y-ys/2+i);
+ if (t==1 || t==5)
+ continue;
+ map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80);
+ }
+ }
+
+// printf("warp npc %s %d read done\n",mapname,nd->bl.id);
+ npc_warp++;
+ nd->bl.type=BL_NPC;
+ nd->bl.subtype=WARP;
+ map_addblock(&nd->bl);
+ clif_spawnnpc(nd);
+ strdb_insert(npcname_db,nd->name,nd);
+
+ return 0;
+}
+
+/*==========================================
+ * shops‰ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4)
+{
+ char *p;
+ int x, y, dir, m;
+ int max = 100, pos = 0;
+ char mapname[24];
+ struct npc_data *nd;
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
+ strchr(w4, ',') == NULL) {
+ printf("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 + 1));
+ p = strchr(w4, ',');
+
+ while (p && pos < max) {
+ int nameid,value;
+ p++;
+ if (sscanf(p, "%d:%d", &nameid, &value) != 2)
+ break;
+ nd->u.shop_item[pos].nameid = nameid;
+ if (value < 0) {
+ struct item_data *id = itemdb_search(nameid);
+ value = id->value_buy;
+ }
+ nd->u.shop_item[pos].value = value;
+ pos++;
+ p=strchr(p,',');
+ }
+ if (pos == 0) {
+ free(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();
+ nd->dir = dir;
+ nd->flag = 0;
+ memcpy(nd->name, w3, 24);
+ nd->class = atoi(w4);
+ nd->speed = 200;
+ nd->chat_id = 0;
+ nd->option = 0;
+ nd->opt1 = 0;
+ nd->opt2 = 0;
+ nd->opt3 = 0;
+
+ nd = (struct npc_data *)aRealloc(nd,
+ sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
+
+ //printf("shop npc %s %d read done\n",mapname,nd->bl.id);
+ npc_shop++;
+ nd->bl.type=BL_NPC;
+ nd->bl.subtype=SHOP;
+ nd->n=map_addnpc(m,nd);
+ map_addblock(&nd->bl);
+ clif_spawnnpc(nd);
+ strdb_insert(npcname_db,nd->name,nd);
+
+ return 0;
+}
+/*==========================================
+ * NPC‚̃‰ƒxƒ‹ƒf[ƒ^ƒRƒ“ƒo[ƒg
+ *------------------------------------------
+ */
+int npc_convertlabel_db(void *key,void *data,va_list ap)
+{
+ char *lname=(char *)key;
+ int pos=(int)data;
+ struct npc_data *nd;
+ struct npc_label_list *lst;
+ int num;
+ char *p=strchr(lname,':');
+
+ 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 *)aCalloc(1,sizeof(struct npc_label_list));
+ num=0;
+ }else
+ lst=(struct npc_label_list *)aRealloc(lst,sizeof(struct npc_label_list)*(num+1));
+
+ *p='\0';
+ strncpy(lst[num].name,lname,24);
+ *p=':';
+ lst[num].pos=pos;
+ nd->u.scr.label_list=lst;
+ nd->u.scr.label_list_num=num+1;
+ return 0;
+}
+/*==========================================
+ * scripts‰ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
+{
+ int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov
+ char mapname[24];
+ unsigned char *srcbuf=NULL,*script;
+ int srcsize=65536;
+ int startline=0;
+ unsigned char line[1024];
+ int i;
+ struct npc_data *nd;
+ int evflag=0;
+ 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,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ||
+ ( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) {
+ printf("bad script line : %s\n",w3);
+ return 1;
+ }
+ m = map_mapname2mapid(mapname);
+ }
+
+ if(strcmp(w2,"script")==0){
+ // ƒXƒNƒŠƒvƒg‚̉ðÍ
+ srcbuf=(char *)aCalloc(srcsize,sizeof(char));
+ if (strchr(first_line,'{')) {
+ strcpy(srcbuf,strchr(first_line,'{'));
+ startline=*lines;
+ } else
+ srcbuf[0]=0;
+ while(1) {
+ for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
+ if (i>=0 && srcbuf[i]=='}')
+ break;
+ fgets(line,1020,fp);
+ (*lines)++;
+ if (feof(fp))
+ break;
+ if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
+ srcsize += 65536;
+ srcbuf = (char *)aRealloc(srcbuf, srcsize);
+ memset(srcbuf + srcsize - 65536, '\0', 65536);
+ }
+ if (srcbuf[0]!='{') {
+ if (strchr(line,'{')) {
+ strcpy(srcbuf,strchr(line,'{'));
+ startline=*lines;
+ }
+ } else
+ strcat(srcbuf,line);
+ }
+ script=parse_script(srcbuf,startline);
+ if (script==NULL) {
+ // script parse error?
+ free(srcbuf);
+ return 1;
+ }
+
+ }else{
+ // duplicate‚·‚é
+
+ char srcname[128];
+ struct npc_data *nd2;
+ if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){
+ printf("bad duplicate name! : %s",w2);
+ return 0;
+ }
+ if( (nd2=npc_name2id(srcname))==NULL ){
+ printf("bad duplicate name! (not exist) : %s\n",srcname);
+ return 0;
+ }
+ script=nd2->u.scr.script;
+ label_dup=nd2->u.scr.label_list;
+ label_dupnum=nd2->u.scr.label_list_num;
+ src_id=nd2->bl.id;
+
+ }// end of ƒXƒNƒŠƒvƒg‰ðÍ
+
+ nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data));
+
+ if(m==-1){
+ // ƒXƒNƒŠƒvƒgƒRƒs[—p‚̃_ƒ~[NPC
+
+ }else 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 (class>=0) {
+
+ for(i=0;i<ys;i++) {
+ for(j=0;j<xs;j++) {
+ int t;
+ t=map_getcell(m,x-xs/2+j,y-ys/2+i);
+ if (t==1 || t==5)
+ continue;
+ map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80);
+ }
+ }
+ }
+
+ 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;
+ }
+
+ if (class<0 && m>=0) { // ƒCƒxƒ“ƒgŒ^NPC
+ evflag=1;
+ }
+
+ while((p=strchr(w3,':'))) {
+ if (p[1]==':') break;
+ }
+ if (p) {
+ *p=0;
+ memcpy(nd->name,w3,24);
+ memcpy(nd->exname,p+2,24);
+ }else{
+ memcpy(nd->name,w3,24);
+ memcpy(nd->exname,w3,24);
+ }
+
+ 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->dir = dir;
+ nd->flag=0;
+ nd->class=class;
+ nd->speed=200;
+ nd->u.scr.script=script;
+ nd->u.scr.src_id=src_id;
+ nd->chat_id=0;
+ nd->option = 0;
+ nd->opt1 = 0;
+ nd->opt2 = 0;
+ nd->opt3 = 0;
+ nd->walktimer=-1;
+
+ //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class);
+ npc_script++;
+ nd->bl.type=BL_NPC;
+ nd->bl.subtype=SCRIPT;
+ if(m>=0){
+ nd->n=map_addnpc(m,nd);
+ map_addblock(&nd->bl);
+
+ 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_insert(ev_db,nd->exname,ev);
+ }else
+ clif_spawnnpc(nd);
+ }
+ strdb_insert(npcname_db,nd->exname,nd);
+
+
+ //-----------------------------------------
+ // ƒ‰ƒxƒ‹ƒf[ƒ^‚Ì€”õ
+ if(srcbuf){
+ // script–{‘Ì‚ª‚ ‚éꇂ̈—
+
+ // ƒ‰ƒxƒ‹ƒf[ƒ^‚̃Rƒ“ƒo[ƒg
+ label_db=script_get_label_db();
+ strdb_foreach(label_db,npc_convertlabel_db,nd);
+
+ // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
+ free(srcbuf);
+
+ }else{
+ // duplicate
+
+// nd->u.scr.label_list=malloc(sizeof(struct npc_label_list)*label_dupnum);
+// memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum);
+
+ 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')) {
+ struct event_data *ev;
+ char *buf;
+ // ƒGƒNƒXƒ|[ƒg‚³‚ê‚é
+ ev=(struct event_data *)aCalloc(1,sizeof(struct event_data));
+ buf=(char *)aCalloc(50,sizeof(char));
+ if (strlen(lname)>24) {
+ printf("npc_parse_script: label name error !\n");
+ exit(1);
+ }else{
+ ev->nd=nd;
+ ev->pos=pos;
+ sprintf(buf,"%s::%s",nd->exname,lname);
+ strdb_insert(ev_db,buf,ev);
+ }
+ }
+ }
+
+ //-----------------------------------------
+ // ƒ‰ƒ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 *)aCalloc(1,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=k+1;
+ }
+ }
+ nd->u.scr.nexttimer=-1;
+ 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)
+{
+ char *srcbuf=NULL,*script;
+ int srcsize=65536;
+ int startline=0;
+ char line[1024];
+ int i;
+// struct dbt *label_db;
+ char *p;
+
+ // ƒXƒNƒŠƒvƒg‚̉ðÍ
+ srcbuf=(char *)aCalloc(srcsize,sizeof(char));
+ if (strchr(first_line,'{')) {
+ strcpy(srcbuf,strchr(first_line,'{'));
+ startline=*lines;
+ } else
+ srcbuf[0]=0;
+ while(1) {
+ for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--);
+ if (i>=0 && srcbuf[i]=='}')
+ break;
+ fgets(line,1020,fp);
+ (*lines)++;
+ if (feof(fp))
+ break;
+ if (strlen(srcbuf)+strlen(line)+1>=srcsize) {
+ srcsize += 65536;
+ srcbuf = (char *)aRealloc(srcbuf, srcsize);
+ memset(srcbuf + srcsize - 65536, '\0', 65536);
+ }
+ if (srcbuf[0]!='{') {
+ if (strchr(line,'{')) {
+ strcpy(srcbuf,strchr(line,'{'));
+ startline=*lines;
+ }
+ } else
+ strcat(srcbuf,line);
+ }
+ script=parse_script(srcbuf,startline);
+ if (script==NULL) {
+ // script parse error?
+ free(srcbuf);
+ return 1;
+ }
+
+ p=(char *)aCalloc(50,sizeof(char));
+
+ strncpy(p,w3,50);
+ strdb_insert(script_get_userfunc_db(),p,script);
+
+// label_db=script_get_label_db();
+
+ // ‚à‚¤Žg‚í‚È‚¢‚̂Ńoƒbƒtƒ@‰ð•ú
+ free(srcbuf);
+
+// printf("function %s => %p\n",p,script);
+
+ return 0;
+}
+
+
+/*==========================================
+ * mobs‰ðÍ
+ *------------------------------------------
+ */
+int npc_parse_mob(char *w1,char *w2,char *w3,char *w4)
+{
+ int m,x,y,xs,ys,class,num,delay1,delay2;
+ int i;
+ char mapname[24];
+ char eventname[24]="";
+ struct mob_data *md;
+
+ xs=ys=0;
+ delay1=delay2=0;
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+ if (sscanf(w1,"%[^,],%d,%d,%d,%d",mapname,&x,&y,&xs,&ys) < 3 ||
+ sscanf(w4,"%d,%d,%d,%d,%s",&class,&num,&delay1,&delay2,eventname) < 2 ) {
+ printf("bad monster line : %s\n",w3);
+ return 1;
+ }
+
+ m=map_mapname2mapid(mapname);
+
+ if ( num>1 && battle_config.mob_count_rate!=100) {
+ if ( (num=num*battle_config.mob_count_rate/100)<1 )
+ num=1;
+ }
+
+ for(i=0;i<num;i++) {
+ md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data));
+
+ md->bl.prev=NULL;
+ md->bl.next=NULL;
+ md->bl.m=m;
+ md->bl.x=x;
+ md->bl.y=y;
+ if(strcmp(w3,"--en--")==0)
+ memcpy(md->name,mob_db[class].name,24);
+ else if(strcmp(w3,"--ja--")==0)
+ memcpy(md->name,mob_db[class].jname,24);
+ else
+ memcpy(md->name,w3,24);
+
+ md->n = i;
+ md->base_class = md->class = class;
+ md->bl.id=npc_get_new_npc_id();
+ md->m =m;
+ md->x0=x;
+ md->y0=y;
+ md->xs=xs;
+ md->ys=ys;
+ md->spawndelay1=delay1;
+ md->spawndelay2=delay2;
+
+ memset(&md->state,0,sizeof(md->state));
+ md->timer = -1;
+ md->target_id=0;
+ md->attacked_id=0;
+ md->speed=mob_db[class].speed;
+
+ if (mob_db[class].mode&0x02)
+ md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item));
+ else
+ md->lootitem=NULL;
+
+ if (strlen(eventname)>=4) {
+ memcpy(md->npc_event,eventname,24);
+ }else
+ memset(md->npc_event,0,24);
+
+ md->bl.type=BL_MOB;
+ map_addiddb(&md->bl);
+ mob_spawn(md->bl.id);
+
+ npc_mob++;
+ }
+ //printf("warp npc %s %d read done\n",mapname,nd->bl.id);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ}ƒbƒvƒtƒ‰ƒOs‚̉ðÍ
+ *------------------------------------------
+ */
+static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4)
+{
+ int m;
+ char mapname[24],savemap[16];
+ int savex,savey;
+ char drop_arg1[16],drop_arg2[16];
+ int drop_id=0,drop_type=0,drop_per=0;
+
+ // ˆø”‚̌”ƒ`ƒFƒbƒN
+// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 )
+ if ( sscanf(w1,"%[^,]",mapname) != 1 )
+ return 1;
+
+ m=map_mapname2mapid(mapname);
+ if (m<0)
+ return 1;
+
+//ƒ}ƒbƒvƒtƒ‰ƒO
+ if ( strcmpi(w3,"nosave")==0) {
+ if (strcmp(w4,"SavePoint")==0) {
+ memcpy(map[m].save.map,"SavePoint",16);
+ map[m].save.x=-1;
+ map[m].save.y=-1;
+ }else if (sscanf(w4,"%[^,],%d,%d",savemap,&savex,&savey)==3) {
+ memcpy(map[m].save.map,savemap,16);
+ map[m].save.x=savex;
+ map[m].save.y=savey;
+ }
+ map[m].flag.nosave=1;
+ }
+ else if (strcmpi(w3,"nomemo")==0) {
+ map[m].flag.nomemo=1;
+ }
+ else if (strcmpi(w3,"noteleport")==0) {
+ map[m].flag.noteleport=1;
+ }
+ else if (strcmpi(w3,"nowarp")==0) {
+ map[m].flag.nowarp=1;
+ }
+ else if (strcmpi(w3,"nowarpto")==0) {
+ map[m].flag.nowarpto=1;
+ }
+ else if (strcmpi(w3,"noreturn")==0) {
+ map[m].flag.noreturn=1;
+ }
+ else if (strcmpi(w3,"monster_noteleport")==0) {
+ map[m].flag.monster_noteleport=1;
+ }
+ else if (strcmpi(w3,"nobranch")==0) {
+ map[m].flag.nobranch=1;
+ }
+ else if (strcmpi(w3,"nopenalty")==0) {
+ map[m].flag.nopenalty=1;
+ }
+ else if (strcmpi(w3,"pvp")==0) {
+ map[m].flag.pvp=1;
+ }
+ else if (strcmpi(w3,"pvp_noparty")==0) {
+ map[m].flag.pvp_noparty=1;
+ }
+ else if (strcmpi(w3,"pvp_noguild")==0) {
+ map[m].flag.pvp_noguild=1;
+ }
+ else if (strcmpi(w3,"pvp_nightmaredrop")==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 (strcmpi(w3,"pvp_nocalcrank")==0) {
+ map[m].flag.pvp_nocalcrank=1;
+ }
+ else if (strcmpi(w3,"gvg")==0) {
+ map[m].flag.gvg=1;
+ }
+ else if (strcmpi(w3,"gvg_noparty")==0) {
+ map[m].flag.gvg_noparty=1;
+ }
+ else if (strcmpi(w3,"nozenypenalty")==0) {
+ map[m].flag.nozenypenalty=1;
+ }
+ else if (strcmpi(w3,"notrade")==0) {
+ map[m].flag.notrade=1;
+ }
+ else if (strcmpi(w3,"noskill")==0) {
+ map[m].flag.noskill=1;
+ }
+ else if (battle_config.pk_mode && strcmpi(w3,"nopvp")==0) { // nopvp for pk mode [Valaris]
+ map[m].flag.nopvp=1;
+ map[m].flag.pvp=0;
+ }
+ else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris]
+ map[m].flag.noicewall=1;
+ }
+ else if (strcmpi(w3,"snow")==0) { // snow [Valaris]
+ map[m].flag.snow=1;
+ }
+ else if (strcmpi(w3,"fog")==0) { // fog [Valaris]
+ map[m].flag.fog=1;
+ }
+ else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris]
+ map[m].flag.sakura=1;
+ }
+ else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris]
+ map[m].flag.leaves=1;
+ }
+ else if (strcmpi(w3,"rain")==0) { // rain [Valaris]
+ map[m].flag.rain=1;
+ }
+
+ return 0;
+}
+
+static int ev_db_final(void *key,void *data,va_list ap)
+{
+ free(data);
+ if(strstr(key,"::")!=NULL)
+ free(key);
+ return 0;
+}
+static int npcname_db_final(void *key,void *data,va_list ap)
+{
+ return 0;
+}
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+int do_final_npc(void)
+{
+ int i;
+ struct block_list *bl;
+ struct npc_data *nd;
+ struct mob_data *md;
+ struct chat_data *cd;
+ struct pet_data *pd;
+
+ if(ev_db)
+ strdb_final(ev_db,ev_db_final);
+ if(npcname_db)
+ strdb_final(npcname_db,npcname_db_final);
+
+ for(i=START_NPC_NUM;i<npc_id;i++){
+ if((bl=map_id2bl(i))){
+ if(bl->type == BL_NPC && (nd = (struct npc_data *)bl)){
+ if(nd->chat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))){
+ free(cd);
+ cd = NULL;
+ }
+ if(nd->bl.subtype == SCRIPT){
+ if(nd->u.scr.timer_event)
+ free(nd->u.scr.timer_event);
+ if(nd->u.scr.src_id==0){
+ if(nd->u.scr.script){
+ free(nd->u.scr.script);
+ nd->u.scr.script=NULL;
+ }
+ if(nd->u.scr.label_list){
+ free(nd->u.scr.label_list);
+ nd->u.scr.label_list = NULL;
+ }
+ }
+ }
+ free(nd);
+ nd = NULL;
+ }else if(bl->type == BL_MOB && (md = (struct mob_data *)bl)){
+ if(md->lootitem){
+ free(md->lootitem);
+ md->lootitem = NULL;
+ }
+ free(md);
+ md = NULL;
+ }else if(bl->type == BL_PET && (pd = (struct pet_data *)bl)){
+ free(pd);
+ pd = NULL;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+void ev_release(struct dbn *db, int which)
+{
+ if (which & 0x1)
+ free(db->key);
+ if (which & 0x2)
+ free(db->data);
+}
+
+/*==========================================
+ * npc‰Šú‰»
+ *------------------------------------------
+ */
+int do_init_npc(void)
+{
+ struct npc_src_list *nsl;
+ FILE *fp;
+ char line[1024];
+ int m,lines;
+
+ ev_db=strdb_init(24);
+ npcname_db=strdb_init(24);
+
+ ev_db->release = ev_release;
+
+ memset(&ev_tm_b,-1,sizeof(ev_tm_b));
+
+ for(nsl=npc_src_first;nsl;nsl=nsl->next) {
+ if(nsl->prev){
+ free(nsl->prev);
+ nsl->prev = NULL;
+ }
+ fp=fopen(nsl->name,"r");
+ if (fp==NULL) {
+ printf("file not found : %s\n",nsl->name);
+ exit(1);
+ }
+ lines=0;
+ while(fgets(line,1020,fp)) {
+ char w1[1024],w2[1024],w3[1024],w4[1024],mapname[1024];
+ int i,j,w4pos,count;
+ lines++;
+
+ if (line[0] == '/' && line[1] == '/')
+ continue;
+ // •s—v‚ȃXƒy[ƒX‚âƒ^ƒu‚̘A‘±‚Í‹l‚ß‚é
+ for(i=j=0;line[i];i++) {
+ if (line[i]==' ') {
+ if (!((line[i+1] && (isspace(line[i+1]) || line[i+1]==',')) ||
+ (j && line[j-1]==',')))
+ line[j++]=' ';
+ } else if (line[i]=='\t') {
+ if (!(j && line[j-1]=='\t'))
+ line[j++]='\t';
+ } else
+ line[j++]=line[i];
+ }
+ // ʼn‚̓^ƒu‹æØ‚è‚Ń`ƒFƒbƒN‚µ‚Ä‚Ý‚ÄAƒ_ƒ‚È‚çƒXƒy[ƒX‹æØ‚è‚ÅŠm”F
+ if ((count=sscanf(line,"%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]",w1,w2,w3,&w4pos,w4)) < 3 &&
+ (count=sscanf(line,"%s%s%s%n%s",w1,w2,w3,&w4pos,w4)) < 3) {
+ continue;
+ }
+ // ƒ}ƒbƒv‚Ì‘¶ÝŠm”F
+ if( strcmp(w1,"-")!=0 && strcmpi(w1,"function")!=0 ){
+ sscanf(w1,"%[^,]",mapname);
+ m = map_mapname2mapid(mapname);
+ if (strlen(mapname)>16 || m<0) {
+ // "mapname" is not assigned to this server
+ 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);
+ }else{
+ npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines);
+ }
+ } 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);
+ } 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);
+ }
+ }
+ fclose(fp);
+ printf("\rLoading NPCs [%d]: %-54s",npc_id-START_NPC_NUM,nsl->name);
+ fflush(stdout);
+ }
+ printf("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
+ npc_id-START_NPC_NUM,npc_warp,npc_shop,npc_script,npc_mob);
+
+ add_timer_func_list(npc_walktimer,"npc_walktimer"); // [Valaris]
+ 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");
+
+ //exit(1);
+
+ return 0;
+}
diff --git a/src/map/npc.h b/src/map/npc.h
index 9bc7a6c96..4f0c43cba 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -1,52 +1,52 @@
-// $Id: npc.h,v 1.5 2004/09/25 11:39:17 MouseJstr Exp $
-#ifndef _NPC_H_
-#define _NPC_H_
-
-#define START_NPC_NUM 110000000
-
-#define WARP_CLASS 45
-#define WARP_DEBUG_CLASS 722
-#define INVISIBLE_CLASS 32767
-
-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 char *npcname,int);
-int npc_timer_event(const char *eventname); // Added by RoVeRT
-int npc_command(struct map_session_data *sd,char *npcname,char *command);
-int npc_touch_areanpc(struct map_session_data *,int,int,int);
-int npc_click(struct map_session_data *,int);
-int npc_scriptcont(struct map_session_data *,int);
-int npc_checknear(struct map_session_data *,int);
-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_warp(char *w1,char *w2,char *w3,char *w4);
-
-int npc_enable(const char *name,int flag);
-struct npc_data* npc_name2id(const char *name);
-
-int npc_walktoxy(struct npc_data *nd,int x,int y,int easy); // npc walking [Valaris]
-int npc_stop_walking(struct npc_data *nd,int type);
-int npc_changestate(struct npc_data *nd,int state,int type);
-
-int npc_get_new_npc_id(void);
-
-void npc_addsrcfile(char *);
-void npc_delsrcfile(char *);
-int do_final_npc(void);
-int do_init_npc(void);
-int npc_event_do_oninit(void);
-int npc_do_ontimer(int,struct map_session_data *,int);
-
-int npc_event_doall(const char *name);
-int npc_event_do(const char *name);
-
-int npc_timerevent_start(struct npc_data *nd);
-int npc_timerevent_stop(struct npc_data *nd);
-int npc_gettimerevent_tick(struct npc_data *nd);
-int npc_settimerevent_tick(struct npc_data *nd,int newtimer);
-int npc_delete(struct npc_data *nd);
-
-#endif
-
+// $Id: npc.h,v 1.5 2004/09/25 11:39:17 MouseJstr Exp $
+#ifndef _NPC_H_
+#define _NPC_H_
+
+#define START_NPC_NUM 110000000
+
+#define WARP_CLASS 45
+#define WARP_DEBUG_CLASS 722
+#define INVISIBLE_CLASS 32767
+
+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 char *npcname,int);
+int npc_timer_event(const char *eventname); // Added by RoVeRT
+int npc_command(struct map_session_data *sd,char *npcname,char *command);
+int npc_touch_areanpc(struct map_session_data *,int,int,int);
+int npc_click(struct map_session_data *,int);
+int npc_scriptcont(struct map_session_data *,int);
+int npc_checknear(struct map_session_data *,int);
+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_warp(char *w1,char *w2,char *w3,char *w4);
+
+int npc_enable(const char *name,int flag);
+struct npc_data* npc_name2id(const char *name);
+
+int npc_walktoxy(struct npc_data *nd,int x,int y,int easy); // npc walking [Valaris]
+int npc_stop_walking(struct npc_data *nd,int type);
+int npc_changestate(struct npc_data *nd,int state,int type);
+
+int npc_get_new_npc_id(void);
+
+void npc_addsrcfile(char *);
+void npc_delsrcfile(char *);
+int do_final_npc(void);
+int do_init_npc(void);
+int npc_event_do_oninit(void);
+int npc_do_ontimer(int,struct map_session_data *,int);
+
+int npc_event_doall(const char *name);
+int npc_event_do(const char *name);
+
+int npc_timerevent_start(struct npc_data *nd);
+int npc_timerevent_stop(struct npc_data *nd);
+int npc_gettimerevent_tick(struct npc_data *nd);
+int npc_settimerevent_tick(struct npc_data *nd,int newtimer);
+int npc_delete(struct npc_data *nd);
+
+#endif
+
diff --git a/src/map/party.c b/src/map/party.c
index d433fa3b8..7d8cdafe2 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -1,644 +1,644 @@
-// $Id: party.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "party.h"
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "pc.h"
-#include "map.h"
-#include "battle.h"
-#include "intif.h"
-#include "clif.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define PARTY_SEND_XYHP_INVERVAL 1000 // À•W‚â‚g‚o‘—M‚ÌŠÔŠu
-
-static struct dbt* party_db;
-
-int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data);
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-static int party_db_final(void *key,void *data,va_list ap)
-{
- free(data);
- return 0;
-}
-void do_final_party(void)
-{
- if(party_db)
- numdb_final(party_db,party_db_final);
-}
-// ‰Šú‰»
-void do_init_party(void)
-{
- party_db=numdb_init();
- add_timer_func_list(party_send_xyhp_timer,"party_send_xyhp_timer");
- add_timer_interval(gettick()+PARTY_SEND_XYHP_INVERVAL,party_send_xyhp_timer,0,0,PARTY_SEND_XYHP_INVERVAL);
-}
-
-// ŒŸõ
-struct party *party_search(int party_id)
-{
- return numdb_search(party_db,party_id);
-}
-int party_searchname_sub(void *key,void *data,va_list ap)
-{
- struct party *p=(struct party *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct party **);
- if(strcmpi(p->name,str)==0)
- *dst=p;
- return 0;
-}
-// ƒp[ƒeƒB–¼ŒŸõ
-struct party* party_searchname(char *str)
-{
- struct party *p=NULL;
- numdb_foreach(party_db,party_searchname_sub,str,&p);
- return p;
-}
-// 쬗v‹
-int party_create(struct map_session_data *sd,char *name)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.party_id==0)
- intif_create_party(sd,name);
- else
- clif_party_created(sd,2);
- return 0;
-}
-
-// 쬉”Û
-int party_created(int account_id,int fail,int party_id,char *name)
-{
- struct map_session_data *sd;
- sd=map_id2sd(account_id);
-
- nullpo_retr(0, sd);
-
- if(fail==0){
- struct party *p;
- sd->status.party_id=party_id;
- if((p=numdb_search(party_db,party_id))!=NULL){
- printf("party: id already exists!\n");
- exit(1);
- }
- p=(struct party *)aCalloc(1,sizeof(struct party));
- p->party_id=party_id;
- memcpy(p->name,name,24);
- numdb_insert(party_db,party_id,p);
- clif_party_created(sd,0);
- }else{
- clif_party_created(sd,1);
- }
- return 0;
-}
-
-// î•ñ—v‹
-int party_request_info(int party_id)
-{
- return intif_request_partyinfo(party_id);
-}
-
-// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
-int party_check_member(struct party *p)
-{
- int i;
- struct map_session_data *sd;
-
- nullpo_retr(0, p);
-
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
- if(sd->status.party_id==p->party_id){
- int j,f=1;
- for(j=0;j<MAX_PARTY;j++){ // ƒp[ƒeƒB‚Ƀf[ƒ^‚ª‚ ‚é‚©Šm”F
- if( p->member[j].account_id==sd->status.account_id){
- if( strcmp(p->member[j].name,sd->status.name)==0 )
- f=0; // ƒf[ƒ^‚ª‚ ‚é
- else
- p->member[j].sd=NULL; // “¯C•ÊƒLƒƒƒ‰‚¾‚Á‚½
- }
- }
- if(f){
- sd->status.party_id=0;
- if(battle_config.error_log)
- printf("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
- }
- }
- }
- }
- return 0;
-}
-
-// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
-int party_recv_noinfo(int party_id)
-{
- int i;
- struct map_session_data *sd;
- for(i=0;i<fd_max;i++){
- if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
- if(sd->status.party_id==party_id)
- sd->status.party_id=0;
- }
- }
- return 0;
-}
-// î•ñŠ“¾
-int party_recv_info(struct party *sp)
-{
- struct party *p;
- int i;
-
- nullpo_retr(0, sp);
-
- if((p=numdb_search(party_db,sp->party_id))==NULL){
- p=(struct party *)aCalloc(1,sizeof(struct party));
- numdb_insert(party_db,sp->party_id,p);
-
- // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
- party_check_member(sp);
- }
- memcpy(p,sp,sizeof(struct party));
-
- for(i=0;i<MAX_PARTY;i++){ // sd‚ÌÝ’è
- struct map_session_data *sd = map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
- }
-
- clif_party_info(p,-1);
-
- for(i=0;i<MAX_PARTY;i++){ // Ý’èî•ñ‚Ì‘—M
-// struct map_session_data *sd = map_id2sd(p->member[i].account_id);
- struct map_session_data *sd = p->member[i].sd;
- if(sd!=NULL && sd->party_sended==0){
- clif_party_option(p,sd,0x100);
- sd->party_sended=1;
- }
- }
-
- return 0;
-}
-
-// ƒp[ƒeƒB‚Ö‚ÌŠ©—U
-int party_invite(struct map_session_data *sd,int account_id)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
- struct party *p=party_search(sd->status.party_id);
- int i;
-
- 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 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- for(i=0;i<MAX_PARTY;i++){ // “¯ƒAƒJƒEƒ“ƒgŠm”F
- if(p->member[i].account_id==account_id){
- clif_party_inviteack(sd,tsd->status.name,0);
- return 0;
- }
- }
-
- tsd->party_invite=sd->status.party_id;
- tsd->party_invite_account=sd->status.account_id;
-
- clif_party_invite(sd,tsd);
- return 0;
-}
-// ƒp[ƒeƒBŠ©—U‚Ö‚Ì•Ô“š
-int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
-{
- struct map_session_data *tsd= map_id2sd(account_id);
-
- nullpo_retr(0, sd);
-
- if(flag==1){ // ³‘ø
- //interŽI‚֒ljÁ—v‹
- intif_party_addmember( sd->party_invite, sd->status.account_id );
- return 0;
- }
- else { // ‹‘”Û
- sd->party_invite=0;
- sd->party_invite_account=0;
- if(tsd==NULL)
- return 0;
- clif_party_inviteack(tsd,sd->status.name,1);
- }
- return 0;
-}
-// ƒp[ƒeƒB‚ª’ljÁ‚³‚ꂽ
-int party_member_added(int party_id,int account_id,int flag)
-{
- struct map_session_data *sd= map_id2sd(account_id),*sd2;
- if(sd==NULL && flag==0){
- if(battle_config.error_log)
- printf("party: member added error %d is not online\n",account_id);
- intif_party_leave(party_id,account_id); // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
- return 0;
- }
- sd2=map_id2sd(sd->party_invite_account);
- sd->party_invite=0;
- sd->party_invite_account=0;
-
- if(flag==1){ // Ž¸”s
- if( sd2!=NULL )
- clif_party_inviteack(sd2,sd->status.name,0);
- return 0;
- }
-
- // ¬Œ÷
- sd->party_sended=0;
- sd->status.party_id=party_id;
-
- if( sd2!=NULL)
- clif_party_inviteack(sd2,sd->status.name,2);
-
- // ‚¢‚¿‚¨‚¤‹£‡Šm”F
- party_check_conflict(sd);
-
- return 0;
-}
-// ƒp[ƒeƒBœ–¼—v‹
-int party_removemember(struct map_session_data *sd,int account_id,char *name)
-{
- struct party *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++){ // ƒŠ[ƒ_[‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- if(p->member[i].account_id==sd->status.account_id)
- if(p->member[i].leader==0)
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©’²‚ׂé
- if(p->member[i].account_id==account_id){
- intif_party_leave(p->party_id,account_id);
- return 0;
- }
- }
- return 0;
-}
-
-// ƒp[ƒeƒB’E‘Þ—v‹
-int party_leave(struct map_session_data *sd)
-{
- struct party *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->member[i].account_id==sd->status.account_id){
- intif_party_leave(p->party_id,sd->status.account_id);
- return 0;
- }
- }
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo‚ª’E‘Þ‚µ‚½
-int party_member_leaved(int party_id,int account_id,char *name)
-{
- struct map_session_data *sd=map_id2sd(account_id);
- struct party *p=party_search(party_id);
- if(p!=NULL){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if(p->member[i].account_id==account_id){
- clif_party_leaved(p,sd,account_id,name,0x00);
- p->member[i].account_id=0;
- p->member[i].sd=NULL;
- }
- }
- if(sd!=NULL && sd->status.party_id==party_id){
- sd->status.party_id=0;
- sd->party_sended=0;
- }
- return 0;
-}
-// ƒp[ƒeƒB‰ðŽU’Ê’m
-int party_broken(int party_id)
-{
- struct party *p;
- int i;
- if( (p=party_search(party_id))==NULL )
- return 0;
-
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].sd!=NULL){
- clif_party_leaved(p,p->member[i].sd,
- p->member[i].account_id,p->member[i].name,0x10);
- p->member[i].sd->status.party_id=0;
- p->member[i].sd->party_sended=0;
- }
- }
- numdb_erase(party_db,party_id);
- return 0;
-}
-// ƒp[ƒeƒB‚ÌÝ’è•ÏX—v‹
-int party_changeoption(struct map_session_data *sd,int exp,int item)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0 || (p=party_search(sd->status.party_id))==NULL )
- return 0;
- intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
- return 0;
-}
-// ƒp[ƒeƒB‚ÌÝ’è•ÏX’Ê’m
-int party_optionchanged(int party_id,int account_id,int exp,int item,int flag)
-{
- struct party *p;
- struct map_session_data *sd=map_id2sd(account_id);
- if( (p=party_search(party_id))==NULL)
- return 0;
-
- if(!(flag&0x01)) p->exp=exp;
- if(!(flag&0x10)) p->item=item;
- clif_party_option(p,sd,flag);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®’Ê’m
-int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv)
-{
- struct party *p;
- int i;
- if( (p=party_search(party_id))==NULL)
- return 0;
- for(i=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if( m == NULL ){
- printf("party_recv_movemap nullpo?\n");
- return 0;
- }
- if(m->account_id==account_id){
- memcpy(m->map,map,16);
- m->online=online;
- m->lv=lv;
- break;
- }
- }
- if(i==MAX_PARTY){
- if(battle_config.error_log)
- printf("party: not found member %d on %d[%s]",account_id,party_id,p->name);
- return 0;
- }
-
- for(i=0;i<MAX_PARTY;i++){ // sdÄÝ’è
- struct map_session_data *sd= map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
- }
-
- party_send_xy_clear(p); // À•WÄ’Ê’m—v¿
-
- clif_party_info(p,-1);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®
-int party_send_movemap(struct map_session_data *sd)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id==0 )
- return 0;
- intif_party_changemap(sd,1);
-
- if( sd->party_sended!=0 ) // ‚à‚¤ƒp[ƒeƒBƒf[ƒ^‚Í‘—MÏ‚Ý
- return 0;
-
- // ‹£‡Šm”F
- party_check_conflict(sd);
-
- // ‚ ‚é‚È‚çƒp[ƒeƒBî•ñ‘—M
- if( (p=party_search(sd->status.party_id))!=NULL ){
- party_check_member(p); // Š‘®‚ðŠm”F‚·‚é
- if(sd->status.party_id==p->party_id){
- clif_party_info(p,sd->fd);
- clif_party_option(p,sd,0x100);
- sd->party_sended=1;
- }
- }
-
- return 0;
-}
-// ƒp[ƒeƒBƒƒ“ƒo‚̃ƒOƒAƒEƒg
-int party_send_logout(struct map_session_data *sd)
-{
- struct party *p;
-
- nullpo_retr(0, sd);
-
- if( sd->status.party_id>0 )
- intif_party_changemap(sd,0);
-
- // sd‚ª–³Œø‚É‚È‚é‚̂Ńp[ƒeƒBî•ñ‚©‚çíœ
- if( (p=party_search(sd->status.party_id))!=NULL ){
- int i;
- for(i=0;i<MAX_PARTY;i++)
- if(p->member[i].sd==sd)
- p->member[i].sd=NULL;
- }
-
- return 0;
-}
-// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
-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);
- return 0;
-}
-
-// ƒp[ƒeƒBƒƒbƒZ[ƒWŽóM
-int party_recv_message(int party_id,int account_id,char *mes,int len)
-{
- struct party *p;
- if( (p=party_search(party_id))==NULL)
- return 0;
- clif_party_message(p,account_id,mes,len);
- return 0;
-}
-// ƒp[ƒeƒB‹£‡Šm”F
-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.name);
- return 0;
-}
-
-
-// ˆÊ’u‚â‚g‚o’Ê’m—p
-int party_send_xyhp_timer_sub(void *key,void *data,va_list ap)
-{
- struct party *p=(struct party *)data;
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *sd;
- if((sd=p->member[i].sd)!=NULL){
- // À•W’Ê’m
- if(sd->party_x!=sd->bl.x || sd->party_y!=sd->bl.y){
- clif_party_xy(p,sd);
- sd->party_x=sd->bl.x;
- sd->party_y=sd->bl.y;
- }
- // ‚g‚o’Ê’m
- if(sd->party_hp!=sd->status.hp){
- clif_party_hp(p,sd);
- sd->party_hp=sd->status.hp;
- }
-
- }
- }
- return 0;
-}
-// ˆÊ’u‚â‚g‚o’Ê’m
-int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data)
-{
- numdb_foreach(party_db,party_send_xyhp_timer_sub,tick);
- return 0;
-}
-
-// ˆÊ’u’Ê’mƒNƒŠƒA
-int party_send_xy_clear(struct party *p)
-{
- int i;
-
- nullpo_retr(0, p);
-
- for(i=0;i<MAX_PARTY;i++){
- struct map_session_data *sd;
- if((sd=p->member[i].sd)!=NULL){
- sd->party_x=-1;
- sd->party_y=-1;
- sd->party_hp=-1;
- }
- }
- return 0;
-}
-// HP’Ê’m‚Ì•K—v«ŒŸ¸—pimap_foreachinmovearea‚©‚çŒÄ‚΂ê‚éj
-int party_send_hp_check(struct block_list *bl,va_list ap)
-{
- int party_id;
- int *flag;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data *)bl);
-
- party_id=va_arg(ap,int);
- flag=va_arg(ap,int *);
-
- if(sd->status.party_id==party_id){
- *flag=1;
- sd->party_hp=-1;
- }
- return 0;
-}
-
-// ŒoŒ±’lŒö•½•ª”z
-int party_exp_share(struct party *p,int map,int base_exp,int job_exp)
-{
- struct map_session_data *sd;
- int i,c;
-
- nullpo_retr(0, p);
-
- for(i=c=0;i<MAX_PARTY;i++)
- if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)
- c++;
- if(c==0)
- return 0;
- for(i=0;i<MAX_PARTY;i++)
- if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)
- pc_gainexp(sd,base_exp/c+1,job_exp/c+1);
- return 0;
-}
-
-// “¯‚¶ƒ}ƒbƒv‚̃p[ƒeƒBƒƒ“ƒo[‘S‘̂Ɉ—‚ð‚©‚¯‚é
-// type==0 “¯‚¶ƒ}ƒbƒv
-// !=0 ‰æ–Ê“à
-void party_foreachsamemap(int (*func)(struct block_list*,va_list),
- struct map_session_data *sd,int type,...)
-{
- struct party *p;
- va_list ap;
- int i;
- int x0,y0,x1,y1;
- struct block_list *list[MAX_PARTY];
- int blockcount=0;
-
- nullpo_retv(sd);
-
- if((p=party_search(sd->status.party_id))==NULL)
- return;
-
- x0=sd->bl.x-AREA_SIZE;
- y0=sd->bl.y-AREA_SIZE;
- x1=sd->bl.x+AREA_SIZE;
- y1=sd->bl.y+AREA_SIZE;
-
- va_start(ap,type);
-
- for(i=0;i<MAX_PARTY;i++){
- struct party_member *m=&p->member[i];
- if(m->sd!=NULL){
- if(sd->bl.m!=m->sd->bl.m)
- continue;
- if(type!=0 &&
- (m->sd->bl.x<x0 || m->sd->bl.y<y0 ||
- m->sd->bl.x>x1 || m->sd->bl.y>y1 ) )
- continue;
- list[blockcount++]=&m->sd->bl;
- }
- }
-
- map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
-
- for(i=0;i<blockcount;i++)
- if(list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
- func(list[i],ap);
-
- map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
-
- va_end(ap);
-}
+// $Id: party.c,v 1.2 2004/09/22 02:59:47 Akitasha Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "party.h"
+#include "db.h"
+#include "timer.h"
+#include "socket.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "pc.h"
+#include "map.h"
+#include "battle.h"
+#include "intif.h"
+#include "clif.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define PARTY_SEND_XYHP_INVERVAL 1000 // À•W‚â‚g‚o‘—M‚ÌŠÔŠu
+
+static struct dbt* party_db;
+
+int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data);
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+static int party_db_final(void *key,void *data,va_list ap)
+{
+ free(data);
+ return 0;
+}
+void do_final_party(void)
+{
+ if(party_db)
+ numdb_final(party_db,party_db_final);
+}
+// ‰Šú‰»
+void do_init_party(void)
+{
+ party_db=numdb_init();
+ add_timer_func_list(party_send_xyhp_timer,"party_send_xyhp_timer");
+ add_timer_interval(gettick()+PARTY_SEND_XYHP_INVERVAL,party_send_xyhp_timer,0,0,PARTY_SEND_XYHP_INVERVAL);
+}
+
+// ŒŸõ
+struct party *party_search(int party_id)
+{
+ return numdb_search(party_db,party_id);
+}
+int party_searchname_sub(void *key,void *data,va_list ap)
+{
+ struct party *p=(struct party *)data,**dst;
+ char *str;
+ str=va_arg(ap,char *);
+ dst=va_arg(ap,struct party **);
+ if(strcmpi(p->name,str)==0)
+ *dst=p;
+ return 0;
+}
+// ƒp[ƒeƒB–¼ŒŸõ
+struct party* party_searchname(char *str)
+{
+ struct party *p=NULL;
+ numdb_foreach(party_db,party_searchname_sub,str,&p);
+ return p;
+}
+// 쬗v‹
+int party_create(struct map_session_data *sd,char *name)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.party_id==0)
+ intif_create_party(sd,name);
+ else
+ clif_party_created(sd,2);
+ return 0;
+}
+
+// 쬉”Û
+int party_created(int account_id,int fail,int party_id,char *name)
+{
+ struct map_session_data *sd;
+ sd=map_id2sd(account_id);
+
+ nullpo_retr(0, sd);
+
+ if(fail==0){
+ struct party *p;
+ sd->status.party_id=party_id;
+ if((p=numdb_search(party_db,party_id))!=NULL){
+ printf("party: id already exists!\n");
+ exit(1);
+ }
+ p=(struct party *)aCalloc(1,sizeof(struct party));
+ p->party_id=party_id;
+ memcpy(p->name,name,24);
+ numdb_insert(party_db,party_id,p);
+ clif_party_created(sd,0);
+ }else{
+ clif_party_created(sd,1);
+ }
+ return 0;
+}
+
+// î•ñ—v‹
+int party_request_info(int party_id)
+{
+ return intif_request_partyinfo(party_id);
+}
+
+// Š‘®ƒLƒƒƒ‰‚ÌŠm”F
+int party_check_member(struct party *p)
+{
+ int i;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<fd_max;i++){
+ if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
+ if(sd->status.party_id==p->party_id){
+ int j,f=1;
+ for(j=0;j<MAX_PARTY;j++){ // ƒp[ƒeƒB‚Ƀf[ƒ^‚ª‚ ‚é‚©Šm”F
+ if( p->member[j].account_id==sd->status.account_id){
+ if( strcmp(p->member[j].name,sd->status.name)==0 )
+ f=0; // ƒf[ƒ^‚ª‚ ‚é
+ else
+ p->member[j].sd=NULL; // “¯C•ÊƒLƒƒƒ‰‚¾‚Á‚½
+ }
+ }
+ if(f){
+ sd->status.party_id=0;
+ if(battle_config.error_log)
+ printf("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+// î•ñŠ“¾Ž¸”si‚»‚ÌID‚̃Lƒƒƒ‰‚ð‘S•”–¢Š‘®‚É‚·‚éj
+int party_recv_noinfo(int party_id)
+{
+ int i;
+ struct map_session_data *sd;
+ for(i=0;i<fd_max;i++){
+ if(session[i] && (sd=session[i]->session_data) && sd->state.auth){
+ if(sd->status.party_id==party_id)
+ sd->status.party_id=0;
+ }
+ }
+ return 0;
+}
+// î•ñŠ“¾
+int party_recv_info(struct party *sp)
+{
+ struct party *p;
+ int i;
+
+ nullpo_retr(0, sp);
+
+ if((p=numdb_search(party_db,sp->party_id))==NULL){
+ p=(struct party *)aCalloc(1,sizeof(struct party));
+ numdb_insert(party_db,sp->party_id,p);
+
+ // ʼn‚̃[ƒh‚Ȃ̂ц[ƒU[‚̃`ƒFƒbƒN‚ðs‚¤
+ party_check_member(sp);
+ }
+ memcpy(p,sp,sizeof(struct party));
+
+ for(i=0;i<MAX_PARTY;i++){ // sd‚ÌÝ’è
+ struct map_session_data *sd = map_id2sd(p->member[i].account_id);
+ p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
+ }
+
+ clif_party_info(p,-1);
+
+ for(i=0;i<MAX_PARTY;i++){ // Ý’èî•ñ‚Ì‘—M
+// struct map_session_data *sd = map_id2sd(p->member[i].account_id);
+ struct map_session_data *sd = p->member[i].sd;
+ if(sd!=NULL && sd->party_sended==0){
+ clif_party_option(p,sd,0x100);
+ sd->party_sended=1;
+ }
+ }
+
+ return 0;
+}
+
+// ƒp[ƒeƒB‚Ö‚ÌŠ©—U
+int party_invite(struct map_session_data *sd,int account_id)
+{
+ struct map_session_data *tsd= map_id2sd(account_id);
+ struct party *p=party_search(sd->status.party_id);
+ int i;
+
+ 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 ){ // ‘ŠŽè‚ÌŠ‘®Šm”F
+ clif_party_inviteack(sd,tsd->status.name,0);
+ return 0;
+ }
+ for(i=0;i<MAX_PARTY;i++){ // “¯ƒAƒJƒEƒ“ƒgŠm”F
+ if(p->member[i].account_id==account_id){
+ clif_party_inviteack(sd,tsd->status.name,0);
+ return 0;
+ }
+ }
+
+ tsd->party_invite=sd->status.party_id;
+ tsd->party_invite_account=sd->status.account_id;
+
+ clif_party_invite(sd,tsd);
+ return 0;
+}
+// ƒp[ƒeƒBŠ©—U‚Ö‚Ì•Ô“š
+int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
+{
+ struct map_session_data *tsd= map_id2sd(account_id);
+
+ nullpo_retr(0, sd);
+
+ if(flag==1){ // ³‘ø
+ //interŽI‚֒ljÁ—v‹
+ intif_party_addmember( sd->party_invite, sd->status.account_id );
+ return 0;
+ }
+ else { // ‹‘”Û
+ sd->party_invite=0;
+ sd->party_invite_account=0;
+ if(tsd==NULL)
+ return 0;
+ clif_party_inviteack(tsd,sd->status.name,1);
+ }
+ return 0;
+}
+// ƒp[ƒeƒB‚ª’ljÁ‚³‚ꂽ
+int party_member_added(int party_id,int account_id,int flag)
+{
+ struct map_session_data *sd= map_id2sd(account_id),*sd2;
+ if(sd==NULL && flag==0){
+ if(battle_config.error_log)
+ printf("party: member added error %d is not online\n",account_id);
+ intif_party_leave(party_id,account_id); // ƒLƒƒƒ‰‘¤‚É“o˜^‚Å‚«‚È‚©‚Á‚½‚½‚ß’E‘Þ—v‹‚ðo‚·
+ return 0;
+ }
+ sd2=map_id2sd(sd->party_invite_account);
+ sd->party_invite=0;
+ sd->party_invite_account=0;
+
+ if(flag==1){ // Ž¸”s
+ if( sd2!=NULL )
+ clif_party_inviteack(sd2,sd->status.name,0);
+ return 0;
+ }
+
+ // ¬Œ÷
+ sd->party_sended=0;
+ sd->status.party_id=party_id;
+
+ if( sd2!=NULL)
+ clif_party_inviteack(sd2,sd->status.name,2);
+
+ // ‚¢‚¿‚¨‚¤‹£‡Šm”F
+ party_check_conflict(sd);
+
+ return 0;
+}
+// ƒp[ƒeƒBœ–¼—v‹
+int party_removemember(struct map_session_data *sd,int account_id,char *name)
+{
+ struct party *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++){ // ƒŠ[ƒ_[‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+ if(p->member[i].account_id==sd->status.account_id)
+ if(p->member[i].leader==0)
+ return 0;
+ }
+
+ for(i=0;i<MAX_PARTY;i++){ // Š‘®‚µ‚Ä‚¢‚é‚©’²‚ׂé
+ if(p->member[i].account_id==account_id){
+ intif_party_leave(p->party_id,account_id);
+ return 0;
+ }
+ }
+ return 0;
+}
+
+// ƒp[ƒeƒB’E‘Þ—v‹
+int party_leave(struct map_session_data *sd)
+{
+ struct party *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->member[i].account_id==sd->status.account_id){
+ intif_party_leave(p->party_id,sd->status.account_id);
+ return 0;
+ }
+ }
+ return 0;
+}
+// ƒp[ƒeƒBƒƒ“ƒo‚ª’E‘Þ‚µ‚½
+int party_member_leaved(int party_id,int account_id,char *name)
+{
+ struct map_session_data *sd=map_id2sd(account_id);
+ struct party *p=party_search(party_id);
+ if(p!=NULL){
+ int i;
+ for(i=0;i<MAX_PARTY;i++)
+ if(p->member[i].account_id==account_id){
+ clif_party_leaved(p,sd,account_id,name,0x00);
+ p->member[i].account_id=0;
+ p->member[i].sd=NULL;
+ }
+ }
+ if(sd!=NULL && sd->status.party_id==party_id){
+ sd->status.party_id=0;
+ sd->party_sended=0;
+ }
+ return 0;
+}
+// ƒp[ƒeƒB‰ðŽU’Ê’m
+int party_broken(int party_id)
+{
+ struct party *p;
+ int i;
+ if( (p=party_search(party_id))==NULL )
+ return 0;
+
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->member[i].sd!=NULL){
+ clif_party_leaved(p,p->member[i].sd,
+ p->member[i].account_id,p->member[i].name,0x10);
+ p->member[i].sd->status.party_id=0;
+ p->member[i].sd->party_sended=0;
+ }
+ }
+ numdb_erase(party_db,party_id);
+ return 0;
+}
+// ƒp[ƒeƒB‚ÌÝ’è•ÏX—v‹
+int party_changeoption(struct map_session_data *sd,int exp,int item)
+{
+ struct party *p;
+
+ nullpo_retr(0, sd);
+
+ if( sd->status.party_id==0 || (p=party_search(sd->status.party_id))==NULL )
+ return 0;
+ intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item);
+ return 0;
+}
+// ƒp[ƒeƒB‚ÌÝ’è•ÏX’Ê’m
+int party_optionchanged(int party_id,int account_id,int exp,int item,int flag)
+{
+ struct party *p;
+ struct map_session_data *sd=map_id2sd(account_id);
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+
+ if(!(flag&0x01)) p->exp=exp;
+ if(!(flag&0x10)) p->item=item;
+ clif_party_option(p,sd,flag);
+ return 0;
+}
+
+// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®’Ê’m
+int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv)
+{
+ struct party *p;
+ int i;
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+ for(i=0;i<MAX_PARTY;i++){
+ struct party_member *m=&p->member[i];
+ if( m == NULL ){
+ printf("party_recv_movemap nullpo?\n");
+ return 0;
+ }
+ if(m->account_id==account_id){
+ memcpy(m->map,map,16);
+ m->online=online;
+ m->lv=lv;
+ break;
+ }
+ }
+ if(i==MAX_PARTY){
+ if(battle_config.error_log)
+ printf("party: not found member %d on %d[%s]",account_id,party_id,p->name);
+ return 0;
+ }
+
+ for(i=0;i<MAX_PARTY;i++){ // sdÄÝ’è
+ struct map_session_data *sd= map_id2sd(p->member[i].account_id);
+ p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
+ }
+
+ party_send_xy_clear(p); // À•WÄ’Ê’m—v¿
+
+ clif_party_info(p,-1);
+ return 0;
+}
+
+// ƒp[ƒeƒBƒƒ“ƒo‚̈ړ®
+int party_send_movemap(struct map_session_data *sd)
+{
+ struct party *p;
+
+ nullpo_retr(0, sd);
+
+ if( sd->status.party_id==0 )
+ return 0;
+ intif_party_changemap(sd,1);
+
+ if( sd->party_sended!=0 ) // ‚à‚¤ƒp[ƒeƒBƒf[ƒ^‚Í‘—MÏ‚Ý
+ return 0;
+
+ // ‹£‡Šm”F
+ party_check_conflict(sd);
+
+ // ‚ ‚é‚È‚çƒp[ƒeƒBî•ñ‘—M
+ if( (p=party_search(sd->status.party_id))!=NULL ){
+ party_check_member(p); // Š‘®‚ðŠm”F‚·‚é
+ if(sd->status.party_id==p->party_id){
+ clif_party_info(p,sd->fd);
+ clif_party_option(p,sd,0x100);
+ sd->party_sended=1;
+ }
+ }
+
+ return 0;
+}
+// ƒp[ƒeƒBƒƒ“ƒo‚̃ƒOƒAƒEƒg
+int party_send_logout(struct map_session_data *sd)
+{
+ struct party *p;
+
+ nullpo_retr(0, sd);
+
+ if( sd->status.party_id>0 )
+ intif_party_changemap(sd,0);
+
+ // sd‚ª–³Œø‚É‚È‚é‚̂Ńp[ƒeƒBî•ñ‚©‚çíœ
+ if( (p=party_search(sd->status.party_id))!=NULL ){
+ int i;
+ for(i=0;i<MAX_PARTY;i++)
+ if(p->member[i].sd==sd)
+ p->member[i].sd=NULL;
+ }
+
+ return 0;
+}
+// ƒp[ƒeƒBƒƒbƒZ[ƒW‘—M
+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);
+ return 0;
+}
+
+// ƒp[ƒeƒBƒƒbƒZ[ƒWŽóM
+int party_recv_message(int party_id,int account_id,char *mes,int len)
+{
+ struct party *p;
+ if( (p=party_search(party_id))==NULL)
+ return 0;
+ clif_party_message(p,account_id,mes,len);
+ return 0;
+}
+// ƒp[ƒeƒB‹£‡Šm”F
+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.name);
+ return 0;
+}
+
+
+// ˆÊ’u‚â‚g‚o’Ê’m—p
+int party_send_xyhp_timer_sub(void *key,void *data,va_list ap)
+{
+ struct party *p=(struct party *)data;
+ int i;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<MAX_PARTY;i++){
+ struct map_session_data *sd;
+ if((sd=p->member[i].sd)!=NULL){
+ // À•W’Ê’m
+ if(sd->party_x!=sd->bl.x || sd->party_y!=sd->bl.y){
+ clif_party_xy(p,sd);
+ sd->party_x=sd->bl.x;
+ sd->party_y=sd->bl.y;
+ }
+ // ‚g‚o’Ê’m
+ if(sd->party_hp!=sd->status.hp){
+ clif_party_hp(p,sd);
+ sd->party_hp=sd->status.hp;
+ }
+
+ }
+ }
+ return 0;
+}
+// ˆÊ’u‚â‚g‚o’Ê’m
+int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data)
+{
+ numdb_foreach(party_db,party_send_xyhp_timer_sub,tick);
+ return 0;
+}
+
+// ˆÊ’u’Ê’mƒNƒŠƒA
+int party_send_xy_clear(struct party *p)
+{
+ int i;
+
+ nullpo_retr(0, p);
+
+ for(i=0;i<MAX_PARTY;i++){
+ struct map_session_data *sd;
+ if((sd=p->member[i].sd)!=NULL){
+ sd->party_x=-1;
+ sd->party_y=-1;
+ sd->party_hp=-1;
+ }
+ }
+ return 0;
+}
+// HP’Ê’m‚Ì•K—v«ŒŸ¸—pimap_foreachinmovearea‚©‚çŒÄ‚΂ê‚éj
+int party_send_hp_check(struct block_list *bl,va_list ap)
+{
+ int party_id;
+ int *flag;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=(struct map_session_data *)bl);
+
+ party_id=va_arg(ap,int);
+ flag=va_arg(ap,int *);
+
+ if(sd->status.party_id==party_id){
+ *flag=1;
+ sd->party_hp=-1;
+ }
+ return 0;
+}
+
+// ŒoŒ±’lŒö•½•ª”z
+int party_exp_share(struct party *p,int map,int base_exp,int job_exp)
+{
+ struct map_session_data *sd;
+ int i,c;
+
+ nullpo_retr(0, p);
+
+ for(i=c=0;i<MAX_PARTY;i++)
+ if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)
+ c++;
+ if(c==0)
+ return 0;
+ for(i=0;i<MAX_PARTY;i++)
+ if((sd=p->member[i].sd)!=NULL && sd->bl.m==map)
+ pc_gainexp(sd,base_exp/c+1,job_exp/c+1);
+ return 0;
+}
+
+// “¯‚¶ƒ}ƒbƒv‚̃p[ƒeƒBƒƒ“ƒo[‘S‘̂Ɉ—‚ð‚©‚¯‚é
+// type==0 “¯‚¶ƒ}ƒbƒv
+// !=0 ‰æ–Ê“à
+void party_foreachsamemap(int (*func)(struct block_list*,va_list),
+ struct map_session_data *sd,int type,...)
+{
+ struct party *p;
+ va_list ap;
+ int i;
+ int x0,y0,x1,y1;
+ struct block_list *list[MAX_PARTY];
+ int blockcount=0;
+
+ nullpo_retv(sd);
+
+ if((p=party_search(sd->status.party_id))==NULL)
+ return;
+
+ x0=sd->bl.x-AREA_SIZE;
+ y0=sd->bl.y-AREA_SIZE;
+ x1=sd->bl.x+AREA_SIZE;
+ y1=sd->bl.y+AREA_SIZE;
+
+ va_start(ap,type);
+
+ for(i=0;i<MAX_PARTY;i++){
+ struct party_member *m=&p->member[i];
+ if(m->sd!=NULL){
+ if(sd->bl.m!=m->sd->bl.m)
+ continue;
+ if(type!=0 &&
+ (m->sd->bl.x<x0 || m->sd->bl.y<y0 ||
+ m->sd->bl.x>x1 || m->sd->bl.y>y1 ) )
+ continue;
+ list[blockcount++]=&m->sd->bl;
+ }
+ }
+
+ map_freeblock_lock(); // ƒƒ‚ƒŠ‚©‚ç‚̉ð•ú‚ð‹ÖŽ~‚·‚é
+
+ for(i=0;i<blockcount;i++)
+ if(list[i]->prev) // —LŒø‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN
+ func(list[i],ap);
+
+ map_freeblock_unlock(); // ‰ð•ú‚ð‹–‰Â‚·‚é
+
+ va_end(ap);
+}
diff --git a/src/map/party.h b/src/map/party.h
index e1a03fcd1..28d8096f7 100644
--- a/src/map/party.h
+++ b/src/map/party.h
@@ -1,47 +1,47 @@
-// $Id: party.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _PARTY_H_
-#define _PARTY_H_
-
-#include <stdarg.h>
-
-struct party;
-struct map_session_data;
-struct block_list;
-
-void do_init_party(void);
-void do_final_party(void);
-struct party *party_search(int party_id);
-struct party* party_searchname(char *str);
-
-int party_create(struct map_session_data *sd,char *name);
-int party_created(int account_id,int fail,int party_id,char *name);
-int party_request_info(int party_id);
-int party_invite(struct map_session_data *sd,int account_id);
-int party_member_added(int party_id,int account_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,char *name);
-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,char *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_send_xy_clear(struct party *p);
-int party_send_hp_check(struct block_list *bl,va_list ap);
-
-int party_exp_share(struct party *p,int map,int base_exp,int job_exp);
-
-void party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...);
-
-#endif
+// $Id: party.h,v 1.3 2004/09/25 05:32:18 MouseJstr Exp $
+#ifndef _PARTY_H_
+#define _PARTY_H_
+
+#include <stdarg.h>
+
+struct party;
+struct map_session_data;
+struct block_list;
+
+void do_init_party(void);
+void do_final_party(void);
+struct party *party_search(int party_id);
+struct party* party_searchname(char *str);
+
+int party_create(struct map_session_data *sd,char *name);
+int party_created(int account_id,int fail,int party_id,char *name);
+int party_request_info(int party_id);
+int party_invite(struct map_session_data *sd,int account_id);
+int party_member_added(int party_id,int account_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,char *name);
+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,char *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_send_xy_clear(struct party *p);
+int party_send_hp_check(struct block_list *bl,va_list ap);
+
+int party_exp_share(struct party *p,int map,int base_exp,int job_exp);
+
+void party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...);
+
+#endif
diff --git a/src/map/path.c b/src/map/path.c
index 51143c943..b2e0a78a8 100644
--- a/src/map/path.c
+++ b/src/map/path.c
@@ -1,404 +1,404 @@
-// $Id: path.c,v 1.1.1.1 2004/09/10 17:27:00 MagicalTux Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "map.h"
-#include "battle.h"
-#include "nullpo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-//#define PATH_STANDALONETEST
-
-#define MAX_HEAP 150
-struct tmp_path { short x,y,dist,before,cost; char dir,flag;};
-#define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
-
-/*==========================================
- * Œo˜H’Tõ•â•heap push
- *------------------------------------------
- */
-static void push_heap_path(int *heap,struct tmp_path *tp,int index)
-{
- int i,h;
-
- if( heap == NULL || tp == NULL ){
- printf("push_heap_path nullpo\n");
- return;
- }
-
- heap[0]++;
-
- for(h=heap[0]-1,i=(h-1)/2;
- h>0 && tp[index].cost<tp[heap[i+1]].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=index;
-}
-
-/*==========================================
- * Œo˜H’Tõ•â•heap update
- * cost‚ªŒ¸‚Á‚½‚̂Ū‚Ì•û‚ÖˆÚ“®
- *------------------------------------------
- */
-static void update_heap_path(int *heap,struct tmp_path *tp,int index)
-{
- int i,h;
-
- nullpo_retv(heap);
- nullpo_retv(tp);
-
- for(h=0;h<heap[0];h++)
- if(heap[h+1]==index)
- break;
- if(h==heap[0]){
- fprintf(stderr,"update_heap_path bug\n");
- exit(1);
- }
- for(i=(h-1)/2;
- h>0 && tp[index].cost<tp[heap[i+1]].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=index;
-}
-
-/*==========================================
- * Œo˜H’Tõ•â•heap pop
- *------------------------------------------
- */
-static int pop_heap_path(int *heap,struct tmp_path *tp)
-{
- int i,h,k;
- int ret,last;
-
- nullpo_retr(-1, heap);
- nullpo_retr(-1, tp);
-
- if(heap[0]<=0)
- return -1;
- ret=heap[1];
- last=heap[heap[0]];
- heap[0]--;
-
- for(h=0,k=2;k<heap[0];k=k*2+2){
- if(tp[heap[k+1]].cost>tp[heap[k]].cost)
- k--;
- heap[h+1]=heap[k+1], h=k;
- }
- if(k==heap[0])
- heap[h+1]=heap[k], h=k-1;
-
- for(i=(h-1)/2;
- h>0 && tp[heap[i+1]].cost>tp[last].cost;
- i=(h-1)/2)
- heap[h+1]=heap[i+1],h=i;
- heap[h+1]=last;
-
- return ret;
-}
-
-/*==========================================
- * Œ»Ý‚Ì“_‚ÌcostŒvŽZ
- *------------------------------------------
- */
-static int calc_cost(struct tmp_path *p,int x1,int y1)
-{
- int xd,yd;
-
- nullpo_retr(0, p);
-
- xd=x1-p->x;
- if(xd<0) xd=-xd;
- yd=y1-p->y;
- if(yd<0) yd=-yd;
- return (xd+yd)*10+p->dist;
-}
-
-/*==========================================
- * •K—v‚È‚çpath‚ð’ljÁ/C³‚·‚é
- *------------------------------------------
- */
-static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,int before,int x1,int y1)
-{
- int i;
-
- nullpo_retr(0, heap);
- nullpo_retr(0, tp);
-
- i=calc_index(x,y);
-
- if(tp[i].x==x && tp[i].y==y){
- if(tp[i].dist>dist){
- tp[i].dist=dist;
- tp[i].dir=dir;
- tp[i].before=before;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- if(tp[i].flag)
- push_heap_path(heap,tp,i);
- else
- update_heap_path(heap,tp,i);
- tp[i].flag=0;
- }
- return 0;
- }
-
- if(tp[i].x || tp[i].y)
- return 1;
-
- tp[i].x=x;
- tp[i].y=y;
- tp[i].dist=dist;
- tp[i].dir=dir;
- tp[i].before=before;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- tp[i].flag=0;
- push_heap_path(heap,tp,i);
-
- return 0;
-}
-
-
-/*==========================================
- * (x,y)‚ªˆÚ“®•s‰Â”\’n‘Ñ‚©‚Ç‚¤‚©
- * flag 0x10000 ‰“‹——£UŒ‚”»’è
- *------------------------------------------
- */
-static int can_place(struct map_data *m,int x,int y,int flag)
-{
- int c;
-
- nullpo_retr(0, m);
-
- c=read_gatp(m,x,y);
-
- if(c==1)
- return 0;
- if(!(flag&0x10000) && c==5)
- return 0;
- return 1;
-}
-
-/*==========================================
- * (x0,y0)‚©‚ç(x1,y1)‚Ö1•à‚ňړ®‰Â”\‚©ŒvŽZ
- *------------------------------------------
- */
-static int can_move(struct map_data *m,int x0,int y0,int x1,int y1,int flag)
-{
- nullpo_retr(0, m);
-
- if(x0-x1<-1 || x0-x1>1 || y0-y1<-1 || y0-y1>1)
- return 0;
- if(x1<0 || y1<0 || x1>=m->xs || y1>=m->ys)
- return 0;
- if(!can_place(m,x0,y0,flag))
- return 0;
- if(!can_place(m,x1,y1,flag))
- return 0;
- if(x0==x1 || y0==y1)
- return 1;
- if(!can_place(m,x0,y1,flag) || !can_place(m,x1,y0,flag))
- return 0;
- return 1;
-}
-/*==========================================
- * (x0,y0)‚©‚ç(dx,dy)•ûŒü‚ÖcountƒZƒ‹•ª
- * ‚«”ò‚΂µ‚½‚ ‚Æ‚ÌÀ•W‚ðŠ“¾
- *------------------------------------------
- */
-int path_blownpos(int m,int x0,int y0,int dx,int dy,int count)
-{
- struct map_data *md;
-
- if(!map[m].gat)
- return -1;
- md=&map[m];
-
- if(count>15){ // Å‘å10ƒ}ƒX‚ɧŒÀ
- if(battle_config.error_log)
- printf("path_blownpos: count too many %d !\n",count);
- count=15;
- }
- if(dx>1 || dx<-1 || dy>1 || dy<-1){
- if(battle_config.error_log)
- printf("path_blownpos: illeagal dx=%d or dy=%d !\n",dx,dy);
- dx=(dx>=0)?1:((dx<0)?-1:0);
- dy=(dy>=0)?1:((dy<0)?-1:0);
- }
-
- while( (count--)>0 && (dx!=0 || dy!=0) ){
- if( !can_move(md,x0,y0,x0+dx,y0+dy,0) ){
- int fx=(dx!=0 && can_move(md,x0,y0,x0+dx,y0,0));
- int fy=(dy!=0 && can_move(md,x0,y0,x0,y0+dy,0));
- if( fx && fy ){
- if(rand()&1) dx=0;
- else dy=0;
- }
- if( !fx ) dx=0;
- if( !fy ) dy=0;
- }
- x0+=dx;
- y0+=dy;
- }
- return (x0<<16)|y0;
-}
-
-/*==========================================
- * path’Tõ (x0,y0)->(x1,y1)
- *------------------------------------------
- */
-int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag)
-{
- int heap[MAX_HEAP+1];
- struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH];
- int i,rp,x,y;
- struct map_data *md;
- int dx,dy;
-
- nullpo_retr(0, wpd);
-
- if(!map[m].gat)
- return -1;
- md=&map[m];
- if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || (i=read_gatp(md,x1,y1))==1 || i==5)
- return -1;
-
- // easy
- dx = (x1-x0<0) ? -1 : 1;
- dy = (y1-y0<0) ? -1 : 1;
- for(x=x0,y=y0,i=0;x!=x1 || y!=y1;){
- if(i>=sizeof(wpd->path))
- return -1;
- if(x!=x1 && y!=y1){
- if(!can_move(md,x,y,x+dx,y+dy,flag))
- break;
- x+=dx;
- y+=dy;
- wpd->path[i++]=(dx<0) ? ((dy>0)? 1 : 3) : ((dy<0)? 5 : 7);
- } else if(x!=x1){
- if(!can_move(md,x,y,x+dx,y ,flag))
- break;
- x+=dx;
- wpd->path[i++]=(dx<0) ? 2 : 6;
- } else { // y!=y1
- if(!can_move(md,x,y,x ,y+dy,flag))
- break;
- y+=dy;
- wpd->path[i++]=(dy>0) ? 0 : 4;
- }
- if(x==x1 && y==y1){
- wpd->path_len=i;
- wpd->path_pos=0;
- wpd->path_half=0;
- return 0;
- }
- }
- if(flag&1)
- return -1;
-
- memset(tp,0,sizeof(tp));
-
- i=calc_index(x0,y0);
- tp[i].x=x0;
- tp[i].y=y0;
- tp[i].dist=0;
- tp[i].dir=0;
- tp[i].before=0;
- tp[i].cost=calc_cost(&tp[i],x1,y1);
- tp[i].flag=0;
- heap[0]=0;
- push_heap_path(heap,tp,calc_index(x0,y0));
- while(1){
- int e=0,fromdir;
-
- if(heap[0]==0)
- return -1;
- rp=pop_heap_path(heap,tp);
- x=tp[rp].x;
- y=tp[rp].y;
- if(x==x1 && y==y1){
- int len,j;
-
- for(len=0,i=rp;len<100 && i!=calc_index(x0,y0);i=tp[i].before,len++);
- if(len==100 || len>=sizeof(wpd->path))
- return -1;
- wpd->path_len=len;
- wpd->path_pos=0;
- wpd->path_half=0;
- for(i=rp,j=len-1;j>=0;i=tp[i].before,j--)
- wpd->path[j]=tp[i].dir;
-
- return 0;
- }
- fromdir=tp[rp].dir;
- if(can_move(md,x,y,x+1,y-1,flag))
- e+=add_path(heap,tp,x+1,y-1,tp[rp].dist+14,5,rp,x1,y1);
- if(can_move(md,x,y,x+1,y ,flag))
- e+=add_path(heap,tp,x+1,y ,tp[rp].dist+10,6,rp,x1,y1);
- if(can_move(md,x,y,x+1,y+1,flag))
- e+=add_path(heap,tp,x+1,y+1,tp[rp].dist+14,7,rp,x1,y1);
- if(can_move(md,x,y,x ,y+1,flag))
- e+=add_path(heap,tp,x ,y+1,tp[rp].dist+10,0,rp,x1,y1);
- if(can_move(md,x,y,x-1,y+1,flag))
- e+=add_path(heap,tp,x-1,y+1,tp[rp].dist+14,1,rp,x1,y1);
- if(can_move(md,x,y,x-1,y ,flag))
- e+=add_path(heap,tp,x-1,y ,tp[rp].dist+10,2,rp,x1,y1);
- if(can_move(md,x,y,x-1,y-1,flag))
- e+=add_path(heap,tp,x-1,y-1,tp[rp].dist+14,3,rp,x1,y1);
- if(can_move(md,x,y,x ,y-1,flag))
- e+=add_path(heap,tp,x ,y-1,tp[rp].dist+10,4,rp,x1,y1);
- tp[rp].flag=1;
- if(e || heap[0]>=MAX_HEAP-5)
- return -1;
- }
- return -1;
-}
-
-#ifdef PATH_STANDALONETEST
-char gat[64][64]={
- {0,0,0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0,0,0},
- {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},
-};
-struct map_data map[1];
-
-/*==========================================
- * Œo˜H’Tõƒ‹[ƒ`ƒ“’P‘̃eƒXƒg—pmainŠÖ”
- *------------------------------------------
- */
-void main(int argc,char *argv[])
-{
- struct walkpath_data wpd;
-
- map[0].gat=gat;
- map[0].xs=64;
- map[0].ys=64;
-
- path_search(&wpd,0,3,4,5,4);
- path_search(&wpd,0,5,4,3,4);
- path_search(&wpd,0,6,4,3,4);
- path_search(&wpd,0,7,4,3,4);
- path_search(&wpd,0,4,3,4,5);
- path_search(&wpd,0,4,2,4,5);
- path_search(&wpd,0,4,1,4,5);
- path_search(&wpd,0,4,5,4,3);
- path_search(&wpd,0,4,6,4,3);
- path_search(&wpd,0,4,7,4,3);
- path_search(&wpd,0,7,4,3,4);
- path_search(&wpd,0,8,4,3,4);
- path_search(&wpd,0,9,4,3,4);
- path_search(&wpd,0,10,4,3,4);
- path_search(&wpd,0,11,4,3,4);
- path_search(&wpd,0,12,4,3,4);
- path_search(&wpd,0,13,4,3,4);
- path_search(&wpd,0,14,4,3,4);
- path_search(&wpd,0,15,4,3,4);
- path_search(&wpd,0,16,4,3,4);
- path_search(&wpd,0,17,4,3,4);
- path_search(&wpd,0,18,4,3,4);
-}
-#endif
+// $Id: path.c,v 1.1.1.1 2004/09/10 17:27:00 MagicalTux Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "map.h"
+#include "battle.h"
+#include "nullpo.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+//#define PATH_STANDALONETEST
+
+#define MAX_HEAP 150
+struct tmp_path { short x,y,dist,before,cost; char dir,flag;};
+#define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
+
+/*==========================================
+ * Œo˜H’Tõ•â•heap push
+ *------------------------------------------
+ */
+static void push_heap_path(int *heap,struct tmp_path *tp,int index)
+{
+ int i,h;
+
+ if( heap == NULL || tp == NULL ){
+ printf("push_heap_path nullpo\n");
+ return;
+ }
+
+ heap[0]++;
+
+ for(h=heap[0]-1,i=(h-1)/2;
+ h>0 && tp[index].cost<tp[heap[i+1]].cost;
+ i=(h-1)/2)
+ heap[h+1]=heap[i+1],h=i;
+ heap[h+1]=index;
+}
+
+/*==========================================
+ * Œo˜H’Tõ•â•heap update
+ * cost‚ªŒ¸‚Á‚½‚̂Ū‚Ì•û‚ÖˆÚ“®
+ *------------------------------------------
+ */
+static void update_heap_path(int *heap,struct tmp_path *tp,int index)
+{
+ int i,h;
+
+ nullpo_retv(heap);
+ nullpo_retv(tp);
+
+ for(h=0;h<heap[0];h++)
+ if(heap[h+1]==index)
+ break;
+ if(h==heap[0]){
+ fprintf(stderr,"update_heap_path bug\n");
+ exit(1);
+ }
+ for(i=(h-1)/2;
+ h>0 && tp[index].cost<tp[heap[i+1]].cost;
+ i=(h-1)/2)
+ heap[h+1]=heap[i+1],h=i;
+ heap[h+1]=index;
+}
+
+/*==========================================
+ * Œo˜H’Tõ•â•heap pop
+ *------------------------------------------
+ */
+static int pop_heap_path(int *heap,struct tmp_path *tp)
+{
+ int i,h,k;
+ int ret,last;
+
+ nullpo_retr(-1, heap);
+ nullpo_retr(-1, tp);
+
+ if(heap[0]<=0)
+ return -1;
+ ret=heap[1];
+ last=heap[heap[0]];
+ heap[0]--;
+
+ for(h=0,k=2;k<heap[0];k=k*2+2){
+ if(tp[heap[k+1]].cost>tp[heap[k]].cost)
+ k--;
+ heap[h+1]=heap[k+1], h=k;
+ }
+ if(k==heap[0])
+ heap[h+1]=heap[k], h=k-1;
+
+ for(i=(h-1)/2;
+ h>0 && tp[heap[i+1]].cost>tp[last].cost;
+ i=(h-1)/2)
+ heap[h+1]=heap[i+1],h=i;
+ heap[h+1]=last;
+
+ return ret;
+}
+
+/*==========================================
+ * Œ»Ý‚Ì“_‚ÌcostŒvŽZ
+ *------------------------------------------
+ */
+static int calc_cost(struct tmp_path *p,int x1,int y1)
+{
+ int xd,yd;
+
+ nullpo_retr(0, p);
+
+ xd=x1-p->x;
+ if(xd<0) xd=-xd;
+ yd=y1-p->y;
+ if(yd<0) yd=-yd;
+ return (xd+yd)*10+p->dist;
+}
+
+/*==========================================
+ * •K—v‚È‚çpath‚ð’ljÁ/C³‚·‚é
+ *------------------------------------------
+ */
+static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,int before,int x1,int y1)
+{
+ int i;
+
+ nullpo_retr(0, heap);
+ nullpo_retr(0, tp);
+
+ i=calc_index(x,y);
+
+ if(tp[i].x==x && tp[i].y==y){
+ if(tp[i].dist>dist){
+ tp[i].dist=dist;
+ tp[i].dir=dir;
+ tp[i].before=before;
+ tp[i].cost=calc_cost(&tp[i],x1,y1);
+ if(tp[i].flag)
+ push_heap_path(heap,tp,i);
+ else
+ update_heap_path(heap,tp,i);
+ tp[i].flag=0;
+ }
+ return 0;
+ }
+
+ if(tp[i].x || tp[i].y)
+ return 1;
+
+ tp[i].x=x;
+ tp[i].y=y;
+ tp[i].dist=dist;
+ tp[i].dir=dir;
+ tp[i].before=before;
+ tp[i].cost=calc_cost(&tp[i],x1,y1);
+ tp[i].flag=0;
+ push_heap_path(heap,tp,i);
+
+ return 0;
+}
+
+
+/*==========================================
+ * (x,y)‚ªˆÚ“®•s‰Â”\’n‘Ñ‚©‚Ç‚¤‚©
+ * flag 0x10000 ‰“‹——£UŒ‚”»’è
+ *------------------------------------------
+ */
+static int can_place(struct map_data *m,int x,int y,int flag)
+{
+ int c;
+
+ nullpo_retr(0, m);
+
+ c=read_gatp(m,x,y);
+
+ if(c==1)
+ return 0;
+ if(!(flag&0x10000) && c==5)
+ return 0;
+ return 1;
+}
+
+/*==========================================
+ * (x0,y0)‚©‚ç(x1,y1)‚Ö1•à‚ňړ®‰Â”\‚©ŒvŽZ
+ *------------------------------------------
+ */
+static int can_move(struct map_data *m,int x0,int y0,int x1,int y1,int flag)
+{
+ nullpo_retr(0, m);
+
+ if(x0-x1<-1 || x0-x1>1 || y0-y1<-1 || y0-y1>1)
+ return 0;
+ if(x1<0 || y1<0 || x1>=m->xs || y1>=m->ys)
+ return 0;
+ if(!can_place(m,x0,y0,flag))
+ return 0;
+ if(!can_place(m,x1,y1,flag))
+ return 0;
+ if(x0==x1 || y0==y1)
+ return 1;
+ if(!can_place(m,x0,y1,flag) || !can_place(m,x1,y0,flag))
+ return 0;
+ return 1;
+}
+/*==========================================
+ * (x0,y0)‚©‚ç(dx,dy)•ûŒü‚ÖcountƒZƒ‹•ª
+ * ‚«”ò‚΂µ‚½‚ ‚Æ‚ÌÀ•W‚ðŠ“¾
+ *------------------------------------------
+ */
+int path_blownpos(int m,int x0,int y0,int dx,int dy,int count)
+{
+ struct map_data *md;
+
+ if(!map[m].gat)
+ return -1;
+ md=&map[m];
+
+ if(count>15){ // Å‘å10ƒ}ƒX‚ɧŒÀ
+ if(battle_config.error_log)
+ printf("path_blownpos: count too many %d !\n",count);
+ count=15;
+ }
+ if(dx>1 || dx<-1 || dy>1 || dy<-1){
+ if(battle_config.error_log)
+ printf("path_blownpos: illeagal dx=%d or dy=%d !\n",dx,dy);
+ dx=(dx>=0)?1:((dx<0)?-1:0);
+ dy=(dy>=0)?1:((dy<0)?-1:0);
+ }
+
+ while( (count--)>0 && (dx!=0 || dy!=0) ){
+ if( !can_move(md,x0,y0,x0+dx,y0+dy,0) ){
+ int fx=(dx!=0 && can_move(md,x0,y0,x0+dx,y0,0));
+ int fy=(dy!=0 && can_move(md,x0,y0,x0,y0+dy,0));
+ if( fx && fy ){
+ if(rand()&1) dx=0;
+ else dy=0;
+ }
+ if( !fx ) dx=0;
+ if( !fy ) dy=0;
+ }
+ x0+=dx;
+ y0+=dy;
+ }
+ return (x0<<16)|y0;
+}
+
+/*==========================================
+ * path’Tõ (x0,y0)->(x1,y1)
+ *------------------------------------------
+ */
+int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag)
+{
+ int heap[MAX_HEAP+1];
+ struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH];
+ int i,rp,x,y;
+ struct map_data *md;
+ int dx,dy;
+
+ nullpo_retr(0, wpd);
+
+ if(!map[m].gat)
+ return -1;
+ md=&map[m];
+ if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || (i=read_gatp(md,x1,y1))==1 || i==5)
+ return -1;
+
+ // easy
+ dx = (x1-x0<0) ? -1 : 1;
+ dy = (y1-y0<0) ? -1 : 1;
+ for(x=x0,y=y0,i=0;x!=x1 || y!=y1;){
+ if(i>=sizeof(wpd->path))
+ return -1;
+ if(x!=x1 && y!=y1){
+ if(!can_move(md,x,y,x+dx,y+dy,flag))
+ break;
+ x+=dx;
+ y+=dy;
+ wpd->path[i++]=(dx<0) ? ((dy>0)? 1 : 3) : ((dy<0)? 5 : 7);
+ } else if(x!=x1){
+ if(!can_move(md,x,y,x+dx,y ,flag))
+ break;
+ x+=dx;
+ wpd->path[i++]=(dx<0) ? 2 : 6;
+ } else { // y!=y1
+ if(!can_move(md,x,y,x ,y+dy,flag))
+ break;
+ y+=dy;
+ wpd->path[i++]=(dy>0) ? 0 : 4;
+ }
+ if(x==x1 && y==y1){
+ wpd->path_len=i;
+ wpd->path_pos=0;
+ wpd->path_half=0;
+ return 0;
+ }
+ }
+ if(flag&1)
+ return -1;
+
+ memset(tp,0,sizeof(tp));
+
+ i=calc_index(x0,y0);
+ tp[i].x=x0;
+ tp[i].y=y0;
+ tp[i].dist=0;
+ tp[i].dir=0;
+ tp[i].before=0;
+ tp[i].cost=calc_cost(&tp[i],x1,y1);
+ tp[i].flag=0;
+ heap[0]=0;
+ push_heap_path(heap,tp,calc_index(x0,y0));
+ while(1){
+ int e=0,fromdir;
+
+ if(heap[0]==0)
+ return -1;
+ rp=pop_heap_path(heap,tp);
+ x=tp[rp].x;
+ y=tp[rp].y;
+ if(x==x1 && y==y1){
+ int len,j;
+
+ for(len=0,i=rp;len<100 && i!=calc_index(x0,y0);i=tp[i].before,len++);
+ if(len==100 || len>=sizeof(wpd->path))
+ return -1;
+ wpd->path_len=len;
+ wpd->path_pos=0;
+ wpd->path_half=0;
+ for(i=rp,j=len-1;j>=0;i=tp[i].before,j--)
+ wpd->path[j]=tp[i].dir;
+
+ return 0;
+ }
+ fromdir=tp[rp].dir;
+ if(can_move(md,x,y,x+1,y-1,flag))
+ e+=add_path(heap,tp,x+1,y-1,tp[rp].dist+14,5,rp,x1,y1);
+ if(can_move(md,x,y,x+1,y ,flag))
+ e+=add_path(heap,tp,x+1,y ,tp[rp].dist+10,6,rp,x1,y1);
+ if(can_move(md,x,y,x+1,y+1,flag))
+ e+=add_path(heap,tp,x+1,y+1,tp[rp].dist+14,7,rp,x1,y1);
+ if(can_move(md,x,y,x ,y+1,flag))
+ e+=add_path(heap,tp,x ,y+1,tp[rp].dist+10,0,rp,x1,y1);
+ if(can_move(md,x,y,x-1,y+1,flag))
+ e+=add_path(heap,tp,x-1,y+1,tp[rp].dist+14,1,rp,x1,y1);
+ if(can_move(md,x,y,x-1,y ,flag))
+ e+=add_path(heap,tp,x-1,y ,tp[rp].dist+10,2,rp,x1,y1);
+ if(can_move(md,x,y,x-1,y-1,flag))
+ e+=add_path(heap,tp,x-1,y-1,tp[rp].dist+14,3,rp,x1,y1);
+ if(can_move(md,x,y,x ,y-1,flag))
+ e+=add_path(heap,tp,x ,y-1,tp[rp].dist+10,4,rp,x1,y1);
+ tp[rp].flag=1;
+ if(e || heap[0]>=MAX_HEAP-5)
+ return -1;
+ }
+ return -1;
+}
+
+#ifdef PATH_STANDALONETEST
+char gat[64][64]={
+ {0,0,0,0,0,0,0,0,0,0},
+ {0,0,0,0,0,0,0,0,0,0},
+ {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},
+};
+struct map_data map[1];
+
+/*==========================================
+ * Œo˜H’Tõƒ‹[ƒ`ƒ“’P‘̃eƒXƒg—pmainŠÖ”
+ *------------------------------------------
+ */
+void main(int argc,char *argv[])
+{
+ struct walkpath_data wpd;
+
+ map[0].gat=gat;
+ map[0].xs=64;
+ map[0].ys=64;
+
+ path_search(&wpd,0,3,4,5,4);
+ path_search(&wpd,0,5,4,3,4);
+ path_search(&wpd,0,6,4,3,4);
+ path_search(&wpd,0,7,4,3,4);
+ path_search(&wpd,0,4,3,4,5);
+ path_search(&wpd,0,4,2,4,5);
+ path_search(&wpd,0,4,1,4,5);
+ path_search(&wpd,0,4,5,4,3);
+ path_search(&wpd,0,4,6,4,3);
+ path_search(&wpd,0,4,7,4,3);
+ path_search(&wpd,0,7,4,3,4);
+ path_search(&wpd,0,8,4,3,4);
+ path_search(&wpd,0,9,4,3,4);
+ path_search(&wpd,0,10,4,3,4);
+ path_search(&wpd,0,11,4,3,4);
+ path_search(&wpd,0,12,4,3,4);
+ path_search(&wpd,0,13,4,3,4);
+ path_search(&wpd,0,14,4,3,4);
+ path_search(&wpd,0,15,4,3,4);
+ path_search(&wpd,0,16,4,3,4);
+ path_search(&wpd,0,17,4,3,4);
+ path_search(&wpd,0,18,4,3,4);
+}
+#endif
diff --git a/src/map/pc.c b/src/map/pc.c
index a05672b13..83116add7 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -1,7524 +1,7524 @@
-// $Id: pc.c 101 2004-09-25 17:57:22Z Valaris $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#include "socket.h" // [Valaris]
-#include "timer.h"
-#include "db.h"
-
-#include "malloc.h"
-#include "map.h"
-#include "chrif.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "npc.h"
-#include "mob.h"
-#include "pet.h"
-#include "itemdb.h"
-#include "script.h"
-#include "battle.h"
-#include "skill.h"
-#include "party.h"
-#include "guild.h"
-#include "chat.h"
-#include "trade.h"
-#include "storage.h"
-#include "vending.h"
-#include "nullpo.h"
-#include "atcommand.h"
-#include "log.h"
-
-#ifndef TXT_ONLY // mail system [Valaris]
-#include "mail.h"
-#endif
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define PVP_CALCRANK_INTERVAL 1000 // PVP‡ˆÊŒvŽZ‚ÌŠÔŠu
-
-#define STATE_BLIND 0x10
-
-static int max_weight_base[MAX_PC_CLASS];
-static int hp_coefficient[MAX_PC_CLASS];
-static int hp_coefficient2[MAX_PC_CLASS];
-static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
-static int sp_coefficient[MAX_PC_CLASS];
-static int aspd_base[MAX_PC_CLASS][20];
-static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
-static int exp_table[14][MAX_LEVEL];
-static char statp[255][7];
-static struct {
- int id;
- int max;
- struct {
- short id,lv;
- } need[6];
-} skill_tree[3][MAX_PC_CLASS][100];
-
-static int atkmods[3][20]; // •ŠíATKƒTƒCƒYC³(size_fix.txt)
-static int refinebonus[5][3]; // ¸˜Bƒ{[ƒiƒXƒe[ƒuƒ‹(refine_db.txt)
-static int percentrefinery[5][10]; // ¸˜B¬Œ÷—¦(refine_db.txt)
-
-static int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static unsigned int equip_pos[11]={0x0080,0x0008,0x0040,0x0004,0x0001,0x0200,0x0100,0x0010,0x0020,0x0002,0x8000};
-
-//static struct dbt *gm_account_db;
-static struct gm_account *gm_account = NULL;
-static int GM_num = 0;
-
-int pc_isGM(struct map_session_data *sd) {
-// struct gm_account *p;
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->bl.type!=BL_PC )
- return 0;
-
-/* p = numdb_search(gm_account_db, sd->status.account_id);
- if (p == NULL)
- return 0;
- return p->level;*/
-
- //For console [Wizputer]
- if ( sd->fd == 0 )
- return 99;
-
- for(i = 0; i < GM_num; i++)
- if (gm_account[i].account_id == sd->status.account_id)
- return gm_account[i].level;
- return 0;
-
-}
-
-int pc_iskiller(struct map_session_data *src, struct map_session_data *target) {
- nullpo_retr(0, src);
-
- if(src->bl.type!=BL_PC )
- return 0;
- if (src->special_state.killer)
- return 1;
-
- if(target->bl.type!=BL_PC )
- return 0;
- if (target->special_state.killable)
- return 1;
-
- return 0;
-}
-
-
-int pc_set_gm_level(int account_id, int level) {
- int i;
- for (i = 0; i < GM_num; i++) {
- if (account_id == gm_account[i].account_id) {
- gm_account[i].level = level;
- return 0;
- }
- }
-
- GM_num++;
- gm_account = realloc(gm_account, sizeof(struct gm_account) * GM_num);
- gm_account[GM_num - 1].account_id = account_id;
- gm_account[GM_num - 1].level = level;
- return 0;
-}
-
-int pc_getrefinebonus(int lv, int type) {
- if (lv >= 0 && lv < 5 && type >= 0 && type < 3)
- return refinebonus[lv][type];
- return 0;
-}
-
-static int distance(int x0, int y0, int x1, int y1) {
- int dx, dy;
-
- dx = abs(x0-x1);
- dy = abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-static int pc_invincible_timer(int tid,unsigned int tick,int id,int data) {
- struct map_session_data *sd;
-
- if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
- return 1;
-
- if(sd->invincible_timer != tid){
- if(battle_config.error_log)
- printf("invincible_timer %d != %d\n",sd->invincible_timer,tid);
- return 0;
- }
- sd->invincible_timer=-1;
-
- return 0;
-}
-
-int pc_setinvincibletimer(struct map_session_data *sd,int val) {
- nullpo_retr(0, sd);
-
- if(sd->invincible_timer != -1)
- delete_timer(sd->invincible_timer,pc_invincible_timer);
- sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0);
- return 0;
-}
-
-int pc_delinvincibletimer(struct map_session_data *sd) {
- nullpo_retr(0, sd);
-
- if(sd->invincible_timer != -1) {
- delete_timer(sd->invincible_timer,pc_invincible_timer);
- sd->invincible_timer = -1;
- }
- return 0;
-}
-
-static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
- struct map_session_data *sd;
- int i;
-
- if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
- return 1;
-
- if(sd->spirit_timer[0] != tid){
- if(battle_config.error_log)
- printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
- return 0;
- }
- sd->spirit_timer[0]=-1;
- for(i=1;i<sd->spiritball;i++) {
- sd->spirit_timer[i-1] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
- sd->spiritball--;
- if(sd->spiritball < 0)
- sd->spiritball = 0;
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
- int i;
-
- nullpo_retr(0, sd);
-
- if(max > MAX_SKILL_LEVEL)
- max = MAX_SKILL_LEVEL;
- if(sd->spiritball < 0)
- sd->spiritball = 0;
-
- if(sd->spiritball >= max) {
- if(sd->spirit_timer[0] != -1) {
- delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
- sd->spirit_timer[0] = -1;
- }
- for(i=1;i<max;i++) {
- sd->spirit_timer[i-1] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
- }
- else
- sd->spiritball++;
-
- sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_delspiritball(struct map_session_data *sd,int count,int type) {
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->spiritball <= 0) {
- sd->spiritball = 0;
- return 0;
- }
-
- if(count > sd->spiritball)
- count = sd->spiritball;
- sd->spiritball -= count;
- if(count > MAX_SKILL_LEVEL)
- count = MAX_SKILL_LEVEL;
-
- for(i=0;i<count;i++) {
- if(sd->spirit_timer[i] != -1) {
- delete_timer(sd->spirit_timer[i],pc_spiritball_timer);
- sd->spirit_timer[i] = -1;
- }
- }
- for(i=count;i<MAX_SKILL_LEVEL;i++) {
- sd->spirit_timer[i-count] = sd->spirit_timer[i];
- sd->spirit_timer[i] = -1;
- }
-
- if(!type)
- clif_spiritball(sd);
-
- return 0;
-}
-
-int pc_setrestartvalue(struct map_session_data *sd,int type) {
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class);
-
- //-----------------------
- // Ž€–S‚µ‚½
- if(sd->special_state.restart_full_recover) { // ƒIƒVƒŠƒXƒJ[ƒh
- sd->status.hp=sd->status.max_hp;
- sd->status.sp=sd->status.max_sp;
- }
- else {
- if(s_class.job == 0 && battle_config.restart_hp_rate < 50) { //ƒmƒr‚Í”¼•ª‰ñ•œ
- sd->status.hp=(sd->status.max_hp)/2;
- }
- else {
- if(battle_config.restart_hp_rate <= 0)
- sd->status.hp = 1;
- else {
- sd->status.hp = sd->status.max_hp * battle_config.restart_hp_rate /100;
- if(sd->status.hp <= 0)
- sd->status.hp = 1;
- }
- }
- if(battle_config.restart_sp_rate > 0) {
- int sp = sd->status.max_sp * battle_config.restart_sp_rate /100;
- if(sd->status.sp < sp)
- sd->status.sp = sp;
- }
- }
- if(type&1)
- clif_updatestatus(sd,SP_HP);
- if(type&1)
- clif_updatestatus(sd,SP_SP);
-
- /* removed exp penalty on spawn [Valaris] */
-
- if(type&2 && sd->status.class != 0 && battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) {
- int zeny = (int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
- if(zeny < 1) zeny = 1;
- sd->status.zeny -= zeny;
- if(sd->status.zeny < 0) sd->status.zeny = 0;
- clif_updatestatus(sd,SP_ZENY);
- }
-
- return 0;
-}
-
-/*==========================================
- * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éMOB‚Ì”‚𔂦‚é(foreachclient)
- *------------------------------------------
- */
-static int pc_counttargeted_sub(struct block_list *bl,va_list ap)
-{
- int id,*c,target_lv;
- struct block_list *src;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- id=va_arg(ap,int);
-
- nullpo_retr(0, c=va_arg(ap,int *));
-
- src=va_arg(ap,struct block_list *);
- target_lv=va_arg(ap,int);
- if(id == bl->id || (src && id == src->id)) return 0;
- if(bl->type == BL_PC) {
- struct map_session_data *sd=(struct map_session_data *)bl;
- if( sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
- (*c)++;
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)bl;
- if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
-
- (*c)++;
- //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv);
- }
- return 0;
-}
-
-int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv)
-{
- int c=0;
- map_foreachinarea(pc_counttargeted_sub, sd->bl.m,
- sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,
- sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd->bl.id,&c,src,target_lv);
- return c;
-}
-
-/*==========================================
- * ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
- *------------------------------------------
- */
-static int pc_walktoxy_sub(struct map_session_data *);
-
-/*==========================================
- * save‚É•K—v‚ȃXƒe[ƒ^ƒXC³‚ðs‚È‚¤
- *------------------------------------------
- */
-int pc_makesavestatus(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- // •ž‚ÌF‚ÍFX•¾ŠQ‚ª‘½‚¢‚Ì‚Å•Û‘¶‘ÎÛ‚É‚Í‚µ‚È‚¢
- if(!battle_config.save_clothcolor)
- sd->status.clothes_color=0;
-
- // Ž€–Só‘Ô‚¾‚Á‚½‚Ì‚Åhp‚ð1AˆÊ’u‚ðƒZ[ƒuꊂɕÏX
- if(pc_isdead(sd)){
- pc_setrestartvalue(sd,0);
- memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- } else {
- memcpy(sd->status.last_point.map,sd->mapname,24);
- sd->status.last_point.x = sd->bl.x;
- sd->status.last_point.y = sd->bl.y;
- }
-
- // ƒZ[ƒu‹ÖŽ~ƒ}ƒbƒv‚¾‚Á‚½‚Ì‚ÅŽw’èˆÊ’u‚Ɉړ®
- if(map[sd->bl.m].flag.nosave){
- struct map_data *m=&map[sd->bl.m];
- if(strcmp(m->save.map,"SavePoint")==0)
- memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- else
- memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
- }
-
- //ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ªƒvƒ‰ƒX‚¾‚Á‚½ê‡0‚É
- if(battle_config.muting_players && sd->status.manner > 0)
- sd->status.manner = 0;
- return 0;
-}
-
-/*==========================================
- * Ú‘±Žž‚̉Šú‰»
- *------------------------------------------
- */
-int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id, int login_id1, int client_tick, int sex, int fd) {
- nullpo_retr(0, sd);
-
- sd->bl.id = account_id;
- sd->char_id = char_id;
- sd->login_id1 = login_id1;
- sd->login_id2 = 0; // at this point, we can not know the value :(
- sd->client_tick = client_tick;
- sd->sex = sex;
- sd->state.auth = 0;
- sd->bl.type = BL_PC;
- sd->canact_tick = sd->canmove_tick = gettick();
- sd->canlog_tick = gettick();
- sd->state.waitingdisconnect = 0;
-
- return 0;
-}
-
-int pc_equippoint(struct map_session_data *sd,int n)
-{
- int ep = 0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class);
-
- if(sd->inventory_data[n]) {
- ep = sd->inventory_data[n]->equip;
- if(sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 || sd->inventory_data[n]->look == 6) {
- if(ep == 2 && (pc_checkskill(sd,AS_LEFT) > 0 || s_class.job == 12))
- return 34;
- }
- }
- return ep;
-}
-
-int pc_setinventorydata(struct map_session_data *sd)
-{
- int i,id;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_INVENTORY;i++) {
- id = sd->status.inventory[i].nameid;
- sd->inventory_data[i] = itemdb_search(id);
- }
- return 0;
-}
-
-int pc_calcweapontype(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->weapontype1 != 0 && sd->weapontype2 == 0)
- sd->status.weapon = sd->weapontype1;
- if(sd->weapontype1 == 0 && sd->weapontype2 != 0)// ¶Žè•Ší Only
- sd->status.weapon = sd->weapontype2;
- else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// ‘o’ZŒ•
- sd->status.weapon = 0x11;
- else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// ‘o’PŽèŒ•
- sd->status.weapon = 0x12;
- else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// ‘o’PŽè•€
- sd->status.weapon = 0x13;
- else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) ||
- (sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // ’ZŒ• - ’PŽèŒ•
- sd->status.weapon = 0x14;
- else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) ||
- (sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // ’ZŒ• - •€
- sd->status.weapon = 0x15;
- else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) ||
- (sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // ’PŽèŒ• - •€
- sd->status.weapon = 0x16;
- else
- sd->status.weapon = sd->weapontype1;
-
- return 0;
-}
-
-int pc_setequipindex(struct map_session_data *sd)
-{
- int i,j;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<11;i++)
- sd->equip_index[i] = -1;
-
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid <= 0)
- continue;
- if(sd->status.inventory[i].equip) {
- for(j=0;j<11;j++)
- if(sd->status.inventory[i].equip & equip_pos[j])
- sd->equip_index[j] = i;
- if(sd->status.inventory[i].equip & 0x0002) {
- if(sd->inventory_data[i])
- sd->weapontype1 = sd->inventory_data[i]->look;
- else
- sd->weapontype1 = 0;
- }
- if(sd->status.inventory[i].equip & 0x0020) {
- if(sd->inventory_data[i]) {
- if(sd->inventory_data[i]->type == 4) {
- if(sd->status.inventory[i].equip == 0x0020)
- sd->weapontype2 = sd->inventory_data[i]->look;
- else
- sd->weapontype2 = 0;
- }
- else
- sd->weapontype2 = 0;
- }
- else
- sd->weapontype2 = 0;
- }
- }
- }
- pc_calcweapontype(sd);
-
- return 0;
-}
-
-int pc_isequip(struct map_session_data *sd,int n)
-{
- struct item_data *item;
- struct status_change *sc_data;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
-
- nullpo_retr(0, sd);
-
- item = sd->inventory_data[n];
- sc_data = battle_get_sc_data(&sd->bl);
- //s_class = pc_calc_base_job(sd->status.class);
-
- if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip )
- return 1;
-
- if(item == NULL)
- return 0;
- if(item->sex != 2 && sd->status.sex != item->sex)
- return 0;
- if(item->elv > 0 && sd->status.base_level < item->elv)
- return 0;
-// -- moonsoul (below statement substituted for commented out version further below
-// as it allows all advanced classes to equip items their normal versions
-// could equip)
-//
- if(((sd->status.class==13 || sd->status.class==4014) && ((1<<7)&item->class) == 0) || // have mounted classes use unmounted equipment [Valaris]
- ((sd->status.class==21 || sd->status.class==4022) && ((1<<14)&item->class) == 0))
- return 0;
- if(sd->status.class!=13 && sd->status.class!=4014 && sd->status.class!=21 && sd->status.class!=4022)
- if((sd->status.class<=4000 && ((1<<sd->status.class)&item->class) == 0) || (sd->status.class>4000 && sd->status.class<4023 && ((1<<(sd->status.class-4001))&item->class) == 0) ||
- (sd->status.class>=4023 && ((1<<(sd->status.class-4023))&item->class) == 0))
- return 0;
-// if(((1<<sd->status.class)&item->class) == 0)
-// return 0;
- if(map[sd->bl.m].flag.pvp && (item->flag.no_equip==1 || item->flag.no_equip==3))
- return 0;
- if(map[sd->bl.m].flag.gvg && (item->flag.no_equip==2 || item->flag.no_equip==3))
- return 0;
- if(item->equip & 0x0002 && sc_data && sc_data[SC_STRIPWEAPON].timer != -1)
- return 0;
- if(item->equip & 0x0020 && sc_data && sc_data[SC_STRIPSHIELD].timer != -1)
- return 0;
- if(item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1)
- return 0;
- if(item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1)
- return 0;
- return 1;
-}
-
-/*==========================================
- * Weapon Breaking [Valaris]
- *------------------------------------------
- */
-int pc_breakweapon(struct map_session_data *sd)
-{
- struct item_data* item;
- char output[255];
- int i;
-
- if(sd==NULL)
- return -1;
- if(sd->unbreakable>=rand()%100)
- return 0;
- if(sd->sc_data && sd->sc_data[SC_CP_WEAPON].timer != -1)
- return 0;
-
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && !sd->status.inventory[i].attribute==1){
- item=sd->inventory_data[i];
- sd->status.inventory[i].attribute=1;
- pc_unequipitem(sd,i,0);
- sprintf(output, "%s has broken.",item->jname);
- clif_emotion(&sd->bl,23);
- clif_displaymessage(sd->fd, output);
- clif_equiplist(sd);
- return 1;
- }
- }
-
- return 0;
-}
-/*==========================================
- * Armor Breaking [Valaris]
- *------------------------------------------
- */
-int pc_breakarmor(struct map_session_data *sd)
-{
- struct item_data* item;
- char output[255];
- int i;
-
- if(sd==NULL)
- return -1;
- if(sd->unbreakable>=rand()%100)
- return 0;
- if(sd->sc_data && sd->sc_data[SC_CP_ARMOR].timer != -1)
- return 0;
-
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && !sd->status.inventory[i].attribute==1){
- item=sd->inventory_data[i];
- sd->status.inventory[i].attribute=1;
- pc_unequipitem(sd,i,0);
- sprintf(output, "%s has broken.",item->jname);
- clif_emotion(&sd->bl,23);
- clif_displaymessage(sd->fd, output);
- clif_equiplist(sd);
- }
- }
-
- return 0;
-}
-/*==========================================
- * session id‚É–â‘è–³‚µ
- * charŽI‚©‚ç‘—‚ç‚ê‚Ä‚«‚½ƒXƒe[ƒ^ƒX‚ðÝ’è
- *------------------------------------------
- */
-int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_charstatus *st)
-{
- struct map_session_data *sd = NULL;
-
- struct party *p;
- struct guild *g;
- int i;
- unsigned long tick = gettick();
-
- sd = map_id2sd(id);
- nullpo_retr(1, sd);
-
- sd->login_id2 = login_id2;
-
- memcpy(&sd->status, st, sizeof(*st));
-
- if (sd->status.sex != sd->sex) {
- clif_authfail_fd(sd->fd, 0);
- return 1;
- }
-
- memset(&sd->state, 0, sizeof(sd->state));
- // Šî–{“I‚ȉŠú‰»
- sd->state.connect_new = 1;
- sd->bl.prev = sd->bl.next = NULL;
-
- sd->weapontype1 = sd->weapontype2 = 0;
- sd->view_class = sd->status.class;
- sd->speed = DEFAULT_WALK_SPEED;
- sd->state.dead_sit = 0;
- sd->dir = 0;
- sd->head_dir = 0;
- sd->state.auth = 1;
- sd->walktimer = -1;
- sd->attacktimer = -1;
- sd->followtimer = -1; // [MouseJstr]
- sd->skilltimer = -1;
- sd->skillitem = -1;
- sd->skillitemlv = -1;
- sd->invincible_timer = -1;
- sd->sg_count = 0;
-
- sd->deal_locked = 0;
- sd->trade_partner = 0;
-
- sd->inchealhptick = 0;
- sd->inchealsptick = 0;
- sd->hp_sub = 0;
- sd->sp_sub = 0;
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->attackabletime = tick;
-
- sd->doridori_counter = 0;
-
-#ifndef TXT_ONLY // mail system [Valaris]
- if(battle_config.mail_system)
- sd->mail_counter = 0;
-#endif
- sd->spiritball = 0;
- for(i = 0; i < MAX_SKILL_LEVEL; i++)
- sd->spirit_timer[i] = -1;
- for(i = 0; i < MAX_SKILLTIMERSKILL; i++)
- sd->skilltimerskill[i].timer = -1;
-
- memset(&sd->dev,0,sizeof(struct square));
- for(i = 0; i < 5; i++) {
- sd->dev.val1[i] = 0;
- sd->dev.val2[i] = 0;
- }
-
- // ƒAƒJƒEƒ“ƒg•Ï”‚Ì‘—M—v‹
- intif_request_accountreg(sd);
-
- // ƒAƒCƒeƒ€ƒ`ƒFƒbƒN
- pc_setinventorydata(sd);
- pc_checkitem(sd);
-
- // pet
- sd->petDB = NULL;
- sd->pd = NULL;
- sd->pet_hungry_timer = -1;
- memset(&sd->pet, 0, sizeof(struct s_pet));
-
- // ƒXƒe[ƒ^ƒXˆÙí‚̉Šú‰»
- for(i = 0; i < MAX_STATUSCHANGE; i++) {
- sd->sc_data[i].timer=-1;
- sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = sd->sc_data[i].val4 = 0;
- }
- sd->sc_count=0;
- if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
- (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide)))
- sd->status.option &= (OPTION_MASK | OPTION_HIDE);
- else
- sd->status.option &= OPTION_MASK;
-
- // ƒXƒLƒ‹ƒ†ƒjƒbƒgŠÖŒW‚̉Šú‰»
- memset(sd->skillunit, 0, sizeof(sd->skillunit));
- memset(sd->skillunittick, 0, sizeof(sd->skillunittick));
-
- // ƒp[ƒeƒB[ŠÖŒW‚̉Šú‰»
- sd->party_sended = 0;
- sd->party_invite = 0;
- sd->party_x = -1;
- sd->party_y = -1;
- sd->party_hp = -1;
-
- // ƒMƒ‹ƒhŠÖŒW‚̉Šú‰»
- sd->guild_sended = 0;
- sd->guild_invite = 0;
- sd->guild_alliance = 0;
-
- // ƒCƒxƒ“ƒgŠÖŒW‚̉Šú‰»
- memset(sd->eventqueue, 0, sizeof(sd->eventqueue));
- for(i = 0; i < MAX_EVENTTIMER; i++)
- sd->eventtimer[i] = -1;
-
- // ˆÊ’u‚ÌÝ’è
- pc_setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, 0);
-
- // pet
- if (sd->status.pet_id > 0)
- intif_request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
-
- // ƒp[ƒeƒBAƒMƒ‹ƒhƒf[ƒ^‚Ì—v‹
- if (sd->status.party_id > 0 && (p = party_search(sd->status.party_id)) == NULL)
- party_request_info(sd->status.party_id);
- if (sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) == NULL)
- guild_request_info(sd->status.guild_id);
-
- // pvp‚ÌÝ’è
- sd->pvp_rank = 0;
- sd->pvp_point = 0;
- sd->pvp_timer = -1;
-
- // ’Ê’m
-
- clif_authok(sd);
- map_addnickdb(sd);
- if (map_charid2nick(sd->status.char_id) == NULL)
- map_addchariddb(sd->status.char_id, sd->status.name);
-
- //ƒXƒpƒmƒr—pŽ€‚ɃJƒEƒ“ƒ^[‚̃XƒNƒŠƒvƒg•Ï”‚©‚ç‚Ì“Ç‚Ýo‚µ‚Æsd‚ւ̃Zƒbƒg
- sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
-
- if (night_flag == 1) {
- char tmpstr[1024];
- strcpy(tmpstr, msg_txt(500)); // Actually, it's the night...
- clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- sd->opt2 |= STATE_BLIND;
- }
-
- // ƒXƒe[ƒ^ƒX‰ŠúŒvŽZ‚È‚Ç
- pc_calcstatus(sd,1);
-
- if (pc_isGM(sd))
- printf("Connection accepted: character '%s' (account: %d; GM level %d).\n", sd->status.name, sd->status.account_id, pc_isGM(sd));
- else
- printf("Connection accepted: Character '%s' (account: %d).\n", sd->status.name, sd->status.account_id);
-
- //printf("pc: OnPCLogin event done. (%d events)\n", npc_event_doall("OnPCLogin") );
- if (npc_name2id("PCLoginEvent"))
- run_script(npc_name2id("PCLoginEvent")->u.scr.script,0,sd->bl.id,npc_name2id("PCLoginEvent")->bl.id); // PCLoginNPC
- // Send friends list
- clif_friends_list_send(sd);
-
- // Message of the Day‚Ì‘—M
- {
- char buf[256];
- FILE *fp;
- if ((fp = fopen(motd_txt, "r")) != NULL) {
- while (fgets(buf, sizeof(buf)-1, fp) != NULL) {
- int i;
- for(i=0; buf[i]; i++) {
- if (buf[i] == '\r' || buf[i]== '\n') {
- buf[i] = 0;
- break;
- }
- }
- clif_displaymessage(sd->fd, buf);
- }
- fclose(fp);
- }
- }
-
-#ifndef TXT_ONLY
- if(battle_config.mail_system)
- mail_check(sd,1); // check mail at login [Valaris]
-#endif
-
- // message of the limited time of the account
- if (connect_until_time != 0) { // don't display if it's unlimited or unknow value
- char tmpstr[1024];
- strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), localtime(&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S."
- clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
-
- return 0;
-}
-
-/*==========================================
- * session id‚É–â‘è‚ ‚è‚È‚Ì‚ÅŒãŽn––
- *------------------------------------------
- */
-int pc_authfail(int id) {
- struct map_session_data *sd;
-
- sd = map_id2sd(id);
- if (sd == NULL)
- return 1;
-
- clif_authfail_fd(sd->fd, 0);
-
- return 0;
-}
-
-static int pc_calc_skillpoint(struct map_session_data* sd)
-{
- int i,skill,skill_point=0;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- if( (skill = pc_checkskill(sd,i)) > 0) {
- if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
- if(!sd->status.skill[i].flag)
- skill_point += skill;
- else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
- skill_point += (sd->status.skill[i].flag - 2);
- }
- }
- }
- }
-
- return skill_point;
-}
-
-/*==========================================
- * Šo‚¦‚ç‚ê‚éƒXƒLƒ‹‚ÌŒvŽZ
- *------------------------------------------
- */
-int pc_calc_skilltree(struct map_session_data *sd)
-{
- int i,id=0,flag;
- int c=0, s=0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class);
- c = s_class.job;
- s = (s_class.upper==1) ? 1 : 0 ; //“]¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
-
- if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
- int skill_point = pc_calc_skillpoint(sd);
- if(skill_point < 9)
- c = 0;
- else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) {
- switch(c) {
- case 7:
- case 14:
- c = 1;
- break;
- case 8:
- case 15:
- c = 4;
- break;
- case 9:
- case 16:
- c = 2;
- break;
- case 10:
- case 18:
- c = 5;
- break;
- case 11:
- case 19:
- case 20:
- c = 3;
- break;
- case 12:
- case 17:
- c = 6;
- break;
- case 4008:
- case 4015:
- c = 4002;
- break;
- case 4009:
- case 4016:
- c = 4005;
- break;
- case 4010:
- case 4017:
- c = 4003;
- break;
- case 4011:
- case 4019:
- c = 4006;
- break;
- case 4012:
- case 4020:
- case 4021:
- c = 4004;
- break;
- case 4013:
- case 4018:
- c = 4007;
- break;
- case 4030:
- case 4037:
- c = 4024;
- break;
- case 4031:
- case 4038:
- c = 4027;
- break;
- case 4032:
- case 4039:
- c = 4025;
- break;
- case 4033:
- case 4040:
- c = 4028;
- break;
- case 4034:
- case 4041:
- case 4042:
- c = 4026;
- break;
- case 4035:
- case 4043:
- c = 4029;
- break;
-
- }
- }
- }
-
- for(i=0;i<MAX_SKILL;i++){
- if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
- if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
- sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{“–‚Ìlv‚É
- sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
- }
- }
-
- if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
- // ‘S‚ẴXƒLƒ‹
- for(i=1;i<158;i++)
- sd->status.skill[i].id=i;
- for(i=210;i<291;i++)
- sd->status.skill[i].id=i;
- for(i=304;i<337;i++){
- if(i==331) continue;
- sd->status.skill[i].id=i;
- }
- if(battle_config.enable_upper_class){ //conf‚Å–³Œø‚Å‚È‚¯‚ê‚Γǂݞ‚Þ
- for(i=355;i<MAX_SKILL;i++)
- sd->status.skill[i].id=i;
- }
- }else{
- // ’Êí‚ÌŒvŽZ
- do{
- flag=0;
- for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
- int j,f=1;
- if(!battle_config.skillfree) {
- for(j=0;j<5;j++) {
- if( skill_tree[s][c][i].need[j].id &&
- pc_checkskill(sd,skill_tree[s][c][i].need[j].id) < skill_tree[s][c][i].need[j].lv)
- f=0;
- }
- }
- if(f && sd->status.skill[id].id==0 ){
- sd->status.skill[id].id=id;
- flag=1;
- }
- }
- }while(flag);
- }
-// if(battle_config.etc_log)
-// printf("calc skill_tree\n");
- return 0;
-}
-
-/*==========================================
- * d—ʃAƒCƒRƒ“‚ÌŠm”F
- *------------------------------------------
- */
-int pc_checkweighticon(struct map_session_data *sd)
-{
- int flag=0;
-
- nullpo_retr(0, sd);
-
- if(sd->weight*2 >= sd->max_weight)
- flag=1;
- if(sd->weight*10 >= sd->max_weight*9)
- flag=2;
-
- if(flag==1){
- if(sd->sc_data[SC_WEIGHT50].timer==-1)
- skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0);
- }else{
- skill_status_change_end(&sd->bl,SC_WEIGHT50,-1);
- }
- if(flag==2){
- if(sd->sc_data[SC_WEIGHT90].timer==-1)
- skill_status_change_start(&sd->bl,SC_WEIGHT90,0,0,0,0,0,0);
- }else{
- skill_status_change_end(&sd->bl,SC_WEIGHT90,-1);
- }
- return 0;
-}
-
-/*==========================================
- * ƒpƒ‰ƒ[ƒ^ŒvŽZ
- * first==0‚ÌŽžAŒvŽZ‘Îۂ̃pƒ‰ƒ[ƒ^‚ªŒÄ‚Ño‚µ‘O‚©‚ç
- * •Ï ‰»‚µ‚½ê‡Ž©“®‚Åsend‚·‚邪A
- * ”\“®“I‚ɕω»‚³‚¹‚½ƒpƒ‰ƒ[ƒ^‚ÍŽ©‘O‚Åsend‚·‚é‚悤‚É
- *------------------------------------------
- */
-int pc_calcstatus(struct map_session_data* sd,int first)
-{
- int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee;
- int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class;
- int b_base_atk;
- struct skill b_skill[MAX_SKILL];
- int i,bl,index;
- int skill,aspd_rate,wele,wele_,def_ele,refinedef=0;
- int pele=0,pdef_ele=0;
- int str,dstr,dex;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- s_class = pc_calc_base_job(sd->status.class);
-
- b_speed = sd->speed;
- b_max_hp = sd->status.max_hp;
- b_max_sp = sd->status.max_sp;
- b_hp = sd->status.hp;
- b_sp = sd->status.sp;
- b_weight = sd->weight;
- b_max_weight = sd->max_weight;
- memcpy(b_paramb,&sd->paramb,sizeof(b_paramb));
- memcpy(b_parame,&sd->paramc,sizeof(b_parame));
- memcpy(b_skill,&sd->status.skill,sizeof(b_skill));
- b_hit = sd->hit;
- b_flee = sd->flee;
- b_aspd = sd->aspd;
- b_watk = sd->watk;
- b_def = sd->def;
- b_watk2 = sd->watk2;
- b_def2 = sd->def2;
- b_flee2 = sd->flee2;
- b_critical = sd->critical;
- b_attackrange = sd->attackrange;
- b_matk1 = sd->matk1;
- b_matk2 = sd->matk2;
- b_mdef = sd->mdef;
- b_mdef2 = sd->mdef2;
- b_class = sd->view_class;
- sd->view_class = sd->status.class;
- b_base_atk = sd->base_atk;
-
- pc_calc_skilltree(sd); // ƒXƒLƒ‹ƒcƒŠ[‚ÌŒvŽZ
-
- sd->max_weight = max_weight_base[s_class.job]+sd->status.str*300;
-
- if(first&1) {
- sd->weight=0;
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL)
- continue;
- sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount;
- }
- sd->cart_max_weight=battle_config.max_cart_weight;
- sd->cart_weight=0;
- sd->cart_max_num=MAX_CART;
- sd->cart_num=0;
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==0)
- continue;
- sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount;
- sd->cart_num++;
- }
- }
-
- memset(sd->paramb,0,sizeof(sd->paramb));
- memset(sd->parame,0,sizeof(sd->parame));
- sd->hit = 0;
- sd->flee = 0;
- sd->flee2 = 0;
- sd->critical = 0;
- sd->aspd = 0;
- sd->watk = 0;
- sd->def = 0;
- sd->mdef = 0;
- sd->watk2 = 0;
- sd->def2 = 0;
- sd->mdef2 = 0;
- sd->status.max_hp = 0;
- sd->status.max_sp = 0;
- sd->attackrange = 0;
- sd->attackrange_ = 0;
- sd->atk_ele = 0;
- sd->def_ele = 0;
- sd->star =0;
- sd->overrefine =0;
- sd->matk1 =0;
- sd->matk2 =0;
- sd->speed = DEFAULT_WALK_SPEED ;
- sd->hprate=100;
- sd->sprate=100;
- sd->castrate=100;
- sd->dsprate=100;
- sd->base_atk=0;
- sd->arrow_atk=0;
- sd->arrow_ele=0;
- sd->arrow_hit=0;
- sd->arrow_range=0;
- sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0;
- memset(sd->addele,0,sizeof(sd->addele));
- memset(sd->addrace,0,sizeof(sd->addrace));
- memset(sd->addsize,0,sizeof(sd->addsize));
- memset(sd->addele_,0,sizeof(sd->addele_));
- memset(sd->addrace_,0,sizeof(sd->addrace_));
- memset(sd->addsize_,0,sizeof(sd->addsize_));
- memset(sd->subele,0,sizeof(sd->subele));
- memset(sd->subrace,0,sizeof(sd->subrace));
- memset(sd->addeff,0,sizeof(sd->addeff));
- memset(sd->addeff2,0,sizeof(sd->addeff2));
- memset(sd->reseff,0,sizeof(sd->reseff));
- memset(&sd->special_state,0,sizeof(sd->special_state));
- memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
- memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
-
- sd->watk_ = 0; //“ñ“—¬—p(‰¼)
- sd->watk_2 = 0;
- sd->atk_ele_ = 0;
- sd->star_ = 0;
- sd->overrefine_ = 0;
-
- sd->aspd_rate = 100;
- sd->speed_rate = 100;
- sd->hprecov_rate = 100;
- sd->sprecov_rate = 100;
- sd->critical_def = 0;
- sd->double_rate = 0;
- sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
- sd->atk_rate = sd->matk_rate = 100;
- sd->ignore_def_ele = sd->ignore_def_race = 0;
- sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
- sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
- sd->arrow_cri = 0;
- sd->magic_def_rate = sd->misc_def_rate = 0;
- memset(sd->arrow_addele,0,sizeof(sd->arrow_addele));
- memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace));
- memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize));
- memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff));
- memset(sd->arrow_addeff2,0,sizeof(sd->arrow_addeff2));
- memset(sd->magic_addele,0,sizeof(sd->magic_addele));
- memset(sd->magic_addrace,0,sizeof(sd->magic_addrace));
- memset(sd->magic_subrace,0,sizeof(sd->magic_subrace));
- sd->perfect_hit = 0;
- sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
- sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
- sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
- sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
- sd->get_zeny_num = 0;
- sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
- sd->add_def_class_count = sd->add_mdef_class_count = 0;
- sd->monster_drop_item_count = 0;
- memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
- memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
- memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
- memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
- memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
- memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race));
- memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate));
- sd->speed_add_rate = sd->aspd_add_rate = 100;
- sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
- sd->splash_range = sd->splash_add_range = 0;
- sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
- sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0;
- sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0;
- sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
- sd->magic_damage_return = 0; //AppleGirl Was Here
- sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
-
- if(!sd->disguiseflag && sd->disguise) {
- sd->disguise=0;
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- clif_clearchar(&sd->bl, 9);
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- }
-
- for(i=0;i<10;i++) {
- index = sd->equip_index[i];
- if(index < 0)
- continue;
- if(i == 9 && sd->equip_index[8] == index)
- continue;
- if(i == 5 && sd->equip_index[4] == index)
- continue;
- if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
- continue;
-
- if(sd->inventory_data[index]) {
- if(sd->inventory_data[index]->type == 4) {
- if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
- int j;
- for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ[ƒh
- int c=sd->status.inventory[index].card[j];
- if(c>0){
- if(i == 8 && sd->status.inventory[index].equip == 0x20)
- sd->state.lr_flag = 1;
- run_script(itemdb_equipscript(c),0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- }
- }
- }
- }
- else if(sd->inventory_data[index]->type==5){ // –h‹ï
- if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
- int j;
- for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ[ƒh
- int c=sd->status.inventory[index].card[j];
- if(c>0)
- run_script(itemdb_equipscript(c),0,sd->bl.id,0);
- }
- }
- }
- }
- }
- wele = sd->atk_ele;
- wele_ = sd->atk_ele_;
- def_ele = sd->def_ele;
- if(sd->status.pet_id > 0) {
- struct pet_data *pd=sd->pd;
- if((pd && battle_config.pet_status_support==1) && (battle_config.pet_equip_required==0 || (battle_config.pet_equip_required && pd->equip > 0))) {
- if(sd->status.pet_id > 0 && sd->petDB && sd->pet.intimate > 0)
- run_script(sd->petDB->script,0,sd->bl.id,0);
- pele = sd->atk_ele;
- pdef_ele = sd->def_ele;
- sd->atk_ele = sd->def_ele = 0;
- }
- }
- memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard));
-
- // ‘•”õ•i‚É‚æ‚éƒXƒe[ƒ^ƒX•Ï‰»‚Í‚±‚±‚ÅŽÀs
- for(i=0;i<10;i++) {
- index = sd->equip_index[i];
- if(index < 0)
- continue;
- if(i == 9 && sd->equip_index[8] == index)
- continue;
- if(i == 5 && sd->equip_index[4] == index)
- continue;
- if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
- continue;
- if(sd->inventory_data[index]) {
- sd->def += sd->inventory_data[index]->def;
- if(sd->inventory_data[index]->type == 4) {
- int r,wlv = sd->inventory_data[index]->wlv;
- if(i == 8 && sd->status.inventory[index].equip == 0x20) {
- //“ñ“—¬—pƒf[ƒ^“ü—Í
- sd->watk_ += sd->inventory_data[index]->atk;
- sd->watk_2 = (r=sd->status.inventory[index].refine)* // ¸˜BUŒ‚—Í
- refinebonus[wlv][0];
- if( (r-=refinebonus[wlv][2])>0 ) // ‰ß踘Bƒ{[ƒiƒX
- sd->overrefine_ = r*refinebonus[wlv][1];
-
- if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
- sd->star_ = (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
- wele_= (sd->status.inventory[index].card[1]&0x0f); // ‘® «
- }
- sd->attackrange_ += sd->inventory_data[index]->range;
- sd->state.lr_flag = 1;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- }
- else { //“ñ“—¬•ŠíˆÈŠO
- sd->watk += sd->inventory_data[index]->atk;
- sd->watk2 += (r=sd->status.inventory[index].refine)* // ¸˜BUŒ‚—Í
- refinebonus[wlv][0];
- if( (r-=refinebonus[wlv][2])>0 ) // ‰ß踘Bƒ{[ƒiƒX
- sd->overrefine += r*refinebonus[wlv][1];
-
- if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
- sd->star += (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
- wele = (sd->status.inventory[index].card[1]&0x0f); // ‘® «
- }
- sd->attackrange += sd->inventory_data[index]->range;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- }
- }
- else if(sd->inventory_data[index]->type == 5) {
- sd->watk += sd->inventory_data[index]->atk;
- refinedef += sd->status.inventory[index].refine*refinebonus[0][0];
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- }
- }
- }
-
- if(sd->equip_index[10] >= 0){ // –î
- index = sd->equip_index[10];
- if(sd->inventory_data[index]){ //‚Ü‚¾‘®«‚ª“ü‚Á‚Ä‚¢‚È‚¢
- sd->state.lr_flag = 2;
- run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
- sd->state.lr_flag = 0;
- sd->arrow_atk += sd->inventory_data[index]->atk;
- }
- }
- sd->def += (refinedef+50)/100;
-
- if(sd->attackrange < 1) sd->attackrange = 1;
- if(sd->attackrange_ < 1) sd->attackrange_ = 1;
- if(sd->attackrange < sd->attackrange_)
- sd->attackrange = sd->attackrange_;
- if(sd->status.weapon == 11)
- sd->attackrange += sd->arrow_range;
- if(wele > 0)
- sd->atk_ele = wele;
- if(wele_ > 0)
- sd->atk_ele_ = wele_;
- if(def_ele > 0)
- sd->def_ele = def_ele;
- if(battle_config.pet_status_support) {
- if(pele > 0 && !sd->atk_ele)
- sd->atk_ele = pele;
- if(pdef_ele > 0 && !sd->def_ele)
- sd->def_ele = pdef_ele;
- }
- sd->double_rate += sd->double_add_rate;
- sd->perfect_hit += sd->perfect_hit_add;
- sd->get_zeny_num += sd->get_zeny_add_num;
- sd->splash_range += sd->splash_add_range;
- if(sd->speed_add_rate != 100)
- sd->speed_rate += sd->speed_add_rate - 100;
- if(sd->aspd_add_rate != 100)
- sd->aspd_rate += sd->aspd_add_rate - 100;
-
- // •ŠíATKƒTƒCƒY•â³ (‰EŽè)
- sd->atkmods[0] = atkmods[0][sd->weapontype1];
- sd->atkmods[1] = atkmods[1][sd->weapontype1];
- sd->atkmods[2] = atkmods[2][sd->weapontype1];
- //•ŠíATKƒTƒCƒY•â³ (¶Žè)
- sd->atkmods_[0] = atkmods[0][sd->weapontype2];
- sd->atkmods_[1] = atkmods[1][sd->weapontype2];
- sd->atkmods_[2] = atkmods[2][sd->weapontype2];
-
- // jobƒ{[ƒiƒX•ª
- for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
- if(job_bonus[s_class.upper][s_class.job][i])
- sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
- }
-
- if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris]
- sd->max_weight += skill*1000;
-
- if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // ‚Ó‚­‚낤‚Ì–Ú
- sd->paramb[4] += skill;
-
- if((skill=pc_checkskill(sd,BS_HILTBINDING))>0) { // Hilt binding gives +1 str +4 atk
- sd->paramb[4] ++;
- sd->base_atk += 4;
- }
-
- // ƒXƒe[ƒ^ƒX•Ï‰»‚É‚æ‚éŠî–{ƒpƒ‰ƒ[ƒ^•â³
- if(sd->sc_count){
- if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // W’†—ÍŒüã
- sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
- sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
- }
- if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // ‘¬“x‘‰Á
- sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
- sd->speed -= sd->speed *25/100;
- }
- if(sd->sc_data[SC_DECREASEAGI].timer!=-1) // ‘¬“xŒ¸­(agi‚Íbattle.c‚Å)
- sd->speed = sd->speed *125/100;
- if(sd->sc_data[SC_CLOAKING].timer!=-1)
- sd->speed = (sd->speed*(76+(sd->sc_data[SC_INCREASEAGI].val1*3)))/100;
- if(sd->sc_data[SC_CHASEWALK].timer!=-1)
- sd->speed = sd->speed*(135-sd->sc_data[SC_CHASEWALK].val1*5)/100; // slow down by chasewalk
- if(sd->sc_data[SC_BLESSING].timer!=-1){ // ƒuƒŒƒbƒVƒ“ƒO
- sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
- sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
- sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1;
- }
- if(sd->sc_data[SC_GLORIA].timer!=-1) // ƒOƒƒŠƒA
- sd->paramb[5]+= 30;
- if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ƒ‰ƒEƒhƒ{ƒCƒX
- sd->paramb[0]+= 4;
- if(sd->sc_data[SC_QUAGMIRE].timer!=-1){ // ƒNƒ@ƒOƒ}ƒCƒA
- sd->speed = sd->speed*3/2;
- int agib = (sd->status.agi+sd->paramb[1]+sd->parame[1])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
- int dexb = (sd->status.dex+sd->paramb[4]+sd->parame[4])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
- sd->paramb[1]-= agib > 50 ? 50 : agib;
- sd->paramb[4]-= dexb > 50 ? 50 : dexb;
- }
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹[ƒTƒCƒg
- sd->paramb[0]+= 5;
- sd->paramb[1]+= 5;
- sd->paramb[2]+= 5;
- sd->paramb[3]+= 5;
- sd->paramb[4]+= 5;
- sd->paramb[5]+= 5;
- }
- if(sd->sc_data[SC_MARIONETTE].timer!=-1){
- sd->paramb[0]-= (sd->status.str+sd->paramb[0]+sd->parame[0])/2;
- sd->paramb[1]-= (sd->status.agi+sd->paramb[1]+sd->parame[1])/2;
- sd->paramb[2]-= (sd->status.vit+sd->paramb[2]+sd->parame[2])/2;
- sd->paramb[3]-= (sd->status.int_+sd->paramb[3]+sd->parame[3])/2;
- sd->paramb[4]-= (sd->status.dex+sd->paramb[4]+sd->parame[4])/2;
- sd->paramb[5]-= (sd->status.luk+sd->paramb[5]+sd->parame[5])/2;
- }
- }
-
- //1“x‚àŽ€‚ñ‚Å‚È‚¢Job70ƒXƒpƒmƒr‚É+10
- if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){
- sd->paramb[0]+= 15;
- sd->paramb[1]+= 15;
- sd->paramb[2]+= 15;
- sd->paramb[3]+= 15;
- sd->paramb[4]+= 15;
- sd->paramb[5]+= 15;
- }
- sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0];
- sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1];
- sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2];
- sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3];
- sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4];
- sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5];
- for(i=0;i<6;i++)
- if(sd->paramc[i] < 0) sd->paramc[i] = 0;
-
- if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) {
- str = sd->paramc[4];
- dex = sd->paramc[0];
- }
- else {
- str = sd->paramc[0];
- dex = sd->paramc[4];
- }
- dstr = str/10;
- sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5;
- sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5);
- sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7);
- if(sd->matk1 < sd->matk2) {
- int temp = sd->matk2;
- sd->matk2 = sd->matk1;
- sd->matk1 = temp;
- }
- sd->hit += sd->paramc[4] + sd->status.base_level;
- sd->flee += sd->paramc[1] + sd->status.base_level;
- sd->def2 += sd->paramc[2];
- sd->mdef2 += sd->paramc[3];
- sd->flee2 += sd->paramc[5]+10;
- sd->critical += (sd->paramc[5]*3)+10;
-
- if(sd->base_atk < 1)
- sd->base_atk = 1;
- if(sd->critical_rate != 100)
- sd->critical = (sd->critical*sd->critical_rate)/100;
- if(sd->critical < 10) sd->critical = 10;
- if(sd->hit_rate != 100)
- sd->hit = (sd->hit*sd->hit_rate)/100;
- if(sd->hit < 1) sd->hit = 1;
- if(sd->flee_rate != 100)
- sd->flee = (sd->flee*sd->flee_rate)/100;
- if(sd->flee < 1) sd->flee = 1;
- if(sd->flee2_rate != 100)
- sd->flee2 = (sd->flee2*sd->flee2_rate)/100;
- if(sd->flee2 < 10) sd->flee2 = 10;
- if(sd->def_rate != 100)
- sd->def = (sd->def*sd->def_rate)/100;
- if(sd->def < 0) sd->def = 0;
- if(sd->def2_rate != 100)
- sd->def2 = (sd->def2*sd->def2_rate)/100;
- if(sd->def2 < 1) sd->def2 = 1;
- if(sd->mdef_rate != 100)
- sd->mdef = (sd->mdef*sd->mdef_rate)/100;
- if(sd->mdef < 0) sd->mdef = 0;
- if(sd->mdef2_rate != 100)
- sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100;
- if(sd->mdef2 < 1) sd->mdef2 = 1;
-
- // “ñ“—¬ ASPD C³
- if (sd->status.weapon <= 16)
- sd->aspd += aspd_base[s_class.job][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->status.weapon]/1000;
- else
- sd->aspd += (
- (aspd_base[s_class.job][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype1]/1000) +
- (aspd_base[s_class.job][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype2]/1000)
- ) * 140 / 200;
-
- aspd_rate = sd->aspd_rate;
-
- //UŒ‚‘¬“x‘‰Á
-
- if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // ƒƒV‚Ì–Ú
- sd->hit += skill;
- if(sd->status.weapon == 11)
- sd->attackrange += skill;
- }
-
- if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // •ŠíŒ¤‹†‚Ì–½’†—¦‘‰Á
- sd->hit += skill*2;
- if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu
- sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
- if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // ƒJ[ƒg‚É‚æ‚鑬“x’ቺ
- sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1);
- else if (pc_isriding(sd)) { // ƒyƒRƒyƒRæ‚è‚É‚æ‚鑬“x‘‰Á
- sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
- sd->max_weight += 10000;
- }
- if(sd->sc_count){
- if(sd->sc_data[SC_WINDWALK].timer!=-1) //ƒEƒBƒ“ƒhƒEƒH[ƒNŽž‚ÍLv*2%Œ¸ŽZ
- sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
- if(sd->sc_data[SC_CARTBOOST].timer!=-1) // ƒJ[ƒgƒu[ƒXƒg
- sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
- if(sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚ÍIA‚Æ“¯‚¶‚®‚ç‚¢‘¬‚¢H
- sd->speed -= sd->speed *25/100;
- if(sd->sc_data[SC_WEDDING].timer!=-1) //Œ‹¥’†‚Í•à‚­‚Ì‚ª’x‚¢
- sd->speed = 2*DEFAULT_WALK_SPEED;
- }
-
- if((skill=pc_checkskill(sd,CR_TRUST))>0) { // ƒtƒFƒCƒX
- sd->status.max_hp += skill*200;
- sd->subele[6] += skill*5;
- }
- if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0)
- {
- sd->subele[0] += skill;
- sd->subele[3] += skill*5;
- }
-
- bl=sd->status.base_level;
-
- sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
- if (s_class.upper==1) // [MouseJstr]
- sd->status.max_hp = sd->status.max_hp * 130/100;
- if(sd->hprate!=100)
- sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
-
- if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1){ // ƒo[ƒT[ƒN
- sd->status.max_hp = sd->status.max_hp * 3;
- sd->status.hp = sd->status.hp * 3;
- if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.max_hp = battle_config.max_hp;
- if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.hp = battle_config.max_hp;
- }
- if(s_class.job == 23 && sd->status.base_level >= 99){
- sd->status.max_hp = sd->status.max_hp + 2000;
- }
-
- if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
- sd->status.max_hp = battle_config.max_hp;
- if(sd->status.max_hp <= 0) sd->status.max_hp = 1; // end
-
- // Å‘åSPŒvŽZ
- sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
- if (s_class.upper==1) // [MouseJstr]
- sd->status.max_sp = sd->status.max_sp * 130/100;
- if(sd->sprate!=100)
- sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
-
- if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ƒƒfƒBƒeƒCƒeƒBƒI
- sd->status.max_sp += sd->status.max_sp*skill/100;
- if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
- sd->status.max_sp += sd->status.max_sp*2*skill/100;
-
- if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
-
- //Ž©‘R‰ñ•œHP
- sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200);
- if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) { /* HP‰ñ•œ—ÍŒüã */
- sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500);
- if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff;
- }
- //Ž©‘R‰ñ•œSP
- sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100);
- if(sd->paramc[3] >= 120)
- sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4;
- if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) { /* SP‰ñ•œ—ÍŒüã */
- sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500);
- if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff;
- }
-
- if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) {
- sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500);
- sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500);
- if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff;
- if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff;
- }
- if(sd->hprecov_rate != 100) {
- sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100;
- if(sd->nhealhp < 1) sd->nhealhp = 1;
- }
- if(sd->sprecov_rate != 100) {
- sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
- if(sd->nhealsp < 1) sd->nhealsp = 1;
- }
- if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // ƒƒfƒBƒeƒCƒeƒBƒI‚ÍSPR‚Å‚Í‚È‚­Ž©‘R‰ñ•œ‚É‚©‚©‚é
- sd->nhealsp += 3*skill*(sd->status.max_sp)/100;
- if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff;
- }
-
- // Ží‘°‘Ï«i‚±‚ê‚Å‚¢‚¢‚ÌH ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“‚Æ“¯‚¶ˆ—‚ª‚¢‚é‚©‚àj
- if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ƒhƒ‰ƒSƒmƒƒW[
- skill = skill*4;
- sd->addrace[9]+=skill;
- sd->addrace_[9]+=skill;
- sd->subrace[9]+=skill;
- sd->magic_addrace[9]+=skill;
- sd->magic_subrace[9]-=skill;
- }
-
- //Fleeã¸
- if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // ‰ñ”𗦑‰Á
- if(sd->status.class==6||sd->status.class==4007 || sd->status.class==23){
- sd->flee += skill*3;
- }
- if(sd->status.class==12||sd->status.class==17||sd->status.class==4013||sd->status.class==4018)
- sd->flee += skill*4;
- if(sd->status.class==12||sd->status.class==4013)
- sd->speed -= sd->speed *(skill*1.5)/100;
- }
- if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // Œ©Ø‚è
- sd->flee += (skill*3)>>1;
-
- // ƒXƒLƒ‹‚âƒXƒe[ƒ^ƒXˆÙí‚É‚æ‚éŽc‚è‚̃pƒ‰ƒ[ƒ^•â³
- if(sd->sc_count){
- // ATK/DEF•Ï‰»Œ`
- if(sd->sc_data[SC_ANGELUS].timer!=-1) // ƒGƒ“ƒWƒFƒ‰ƒX
- sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100;
- if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX
- sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5;
- }
- if(sd->sc_data[SC_PROVOKE].timer!=-1){ // ƒvƒƒ{ƒbƒN
- sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100;
- sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
- }
- if(sd->sc_data[SC_ENDURE].timer!=-1)
- sd->mdef2 += sd->sc_data[SC_ENDURE].val1;
- if(sd->sc_data[SC_MINDBREAKER].timer!=-1){ // ƒvƒƒ{ƒbƒN
- sd->mdef2 = sd->mdef2*(100-6*sd->sc_data[SC_MINDBREAKER].val1)/100;
- sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
- sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
- }
- if(sd->sc_data[SC_POISON].timer!=-1) // “Åó‘Ô
- sd->def2 = sd->def2*75/100;
- if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // 푾ŒÛ‚Ì‹¿‚«
- sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
- sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
- }
- if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö
- index = sd->equip_index[9];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
- sd->watk += sd->sc_data[SC_NIBELUNGEN].val3;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
- sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3;
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
- sd->watk += sd->sc_data[SC_NIBELUNGEN].val2;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
- sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2;
- }
-
- if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ƒ{ƒ‹ƒP[ƒm
- sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
- }
-
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
- sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100;
- if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // ƒGƒ^[ƒiƒ‹ƒJƒIƒX
- sd->def=0;
-
- if(sd->sc_data[SC_CONCENTRATION].timer!=-1){ //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- sd->watk = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- index = sd->equip_index[8];
- if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
- sd->watk_ = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- sd->def = sd->def * (100 - 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
- }
-
- if(sd->sc_data[SC_MAGICPOWER].timer!=-1){ //–‚–@—Í‘•
- sd->matk1 = sd->matk1*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
- sd->matk2 = sd->matk2*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
- }
- if(sd->sc_data[SC_ATKPOT].timer!=-1)
- sd->watk += sd->sc_data[SC_ATKPOT].val1;
- if(sd->sc_data[SC_MATKPOT].timer!=-1){
- sd->matk1 += sd->sc_data[SC_MATKPOT].val1;
- sd->matk2 += sd->sc_data[SC_MATKPOT].val1;
- }
-
- // ASPD/ˆÚ“®‘¬“x•Ï‰»Œn
- if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
- aspd_rate -= 30;
- if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
- sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
- aspd_rate -= 30;
- else
- aspd_rate -= 25;
- }
- if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 &&
- sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
- aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
- if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
- sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 &&
- sd->sc_data[SC_DONTFORGETME].timer == -1)
- aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3;
- if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // Ž„‚ð–Y‚ê‚È‚¢‚Å
- aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16);
- sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
- }
- if( sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 ||
- sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 ||
- sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ‘ ‘¬ƒ|[ƒVƒ‡ƒ“
- aspd_rate -= sd->sc_data[i].val2;
-
- // HIT/FLEE•Ï‰»Œn
- if(sd->sc_data[SC_WHISTLE].timer!=-1){ // Œû“J
- sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
- +sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100;
- sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10;
- }
- if(sd->sc_data[SC_HUMMING].timer!=-1) // ƒnƒ~ƒ“ƒO
- sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2
- +sd->sc_data[SC_HUMMING].val3) * sd->hit/100;
- if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
- sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100;
- }
- if(sd->sc_data[SC_BLIND].timer!=-1){ // ˆÃ•
- sd->hit -= sd->hit*25/100;
- sd->flee -= sd->flee*25/100;
- }
- if(sd->sc_data[SC_WINDWALK].timer!=-1) // ƒEƒBƒ“ƒhƒEƒH[ƒN
- sd->flee += sd->flee*(sd->sc_data[SC_WINDWALK].val2)/100;
- if(sd->sc_data[SC_SPIDERWEB].timer!=-1) //ƒXƒpƒCƒ_[ƒEƒFƒu
- sd->flee -= sd->flee*50/100;
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹[ƒTƒCƒg
- sd->hit += 3*(sd->sc_data[SC_TRUESIGHT].val1);
- if(sd->sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
- sd->hit += (10*(sd->sc_data[SC_CONCENTRATION].val1));
-
- // ‘Ï«
- if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // •sŽ€g‚̃W[ƒNƒtƒŠ[ƒh
- sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // ‰Î
- sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // …
- sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // …
- }
- if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // ƒvƒƒ”ƒBƒfƒ“ƒX
- sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ‘Î ¹‘®«
- sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ‘Î ˆ«–‚
- }
-
- // ‚»‚Ì‘¼
- if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // ƒCƒhƒDƒ“‚Ì—ÑŒç
- sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1)
- +sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100;
- if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // ƒfƒŠƒ…[ƒW
- sd->status.max_hp += sd->status.max_hp*sd->sc_data[SC_DELUGE].val3/100;
- if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
- sd->status.max_hp = battle_config.max_hp;
- }
- if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // ƒT[ƒrƒXƒtƒH[ƒ†[
- sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2
- +sd->sc_data[SC_SERVICE4U].val3)/100;
- if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
- sd->status.max_sp = battle_config.max_sp;
- sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2
- +sd->sc_data[SC_SERVICE4U].val3);
- if(sd->dsprate<0)sd->dsprate=0;
- }
-
- if(sd->sc_data[SC_FORTUNE].timer!=-1) // K‰^‚̃LƒX
- sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2
- +sd->sc_data[SC_FORTUNE].val3)*10;
-
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1){ // ”š—ô”g“®
- if(s_class.job==23)
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1*100;
- else
- sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
- }
-
- if(sd->sc_data[SC_STEELBODY].timer!=-1){ // ‹à„
- sd->def = 90;
- sd->mdef = 90;
- aspd_rate += 25;
- sd->speed = (sd->speed * 125) / 100;
- }
- if(sd->sc_data[SC_DEFENDER].timer != -1) {
- sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50);
- sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
- }
- if(sd->sc_data[SC_ENCPOISON].timer != -1)
- sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
-
- if( sd->sc_data[SC_DANCING].timer!=-1 ){ // ‰‰‘t/ƒ_ƒ“ƒXŽg—p’†
- sd->speed*=4;
- sd->nhealsp = 0;
- sd->nshealsp = 0;
- sd->nsshealsp = 0;
- }
- if(sd->sc_data[SC_CURSE].timer!=-1)
- sd->speed += 450;
-
- if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹[ƒTƒCƒg
- sd->critical += sd->critical*(sd->sc_data[SC_TRUESIGHT].val1)/100;
-
-/* if(sd->sc_data[SC_VOLCANO].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(‘®«‚Íbattle.c‚Å)
- sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
- if(sd->sc_data[SC_DELUGE].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(‘®«‚Íbattle.c‚Å)
- sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
- */
- if(sd->sc_data[SC_KEEPING].timer!=-1)
- sd->def = 100;
- if(sd->sc_data[SC_BARRIER].timer!=-1)
- sd->mdef = 100;
- }
-
- if(sd->speed_rate != 100)
- sd->speed = sd->speed*sd->speed_rate/100;
- if(sd->speed < 1) sd->speed = 1;
- if(aspd_rate != 100)
- sd->aspd = sd->aspd*aspd_rate/100;
- if(pc_isriding(sd)) // ‹R•ºC—û
- sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100;
- if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd;
- sd->amotion = sd->aspd;
- sd->dmotion = 800-sd->paramc[1]*4;
- if(sd->dmotion<400)
- sd->dmotion = 400;
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed*(175 - skill*5)/100;
- }
-
- if(sd->status.hp>sd->status.max_hp)
- sd->status.hp=sd->status.max_hp;
- if(sd->status.sp>sd->status.max_sp)
- sd->status.sp=sd->status.max_sp;
-
- if(first&4)
- return 0;
- if(first&3) {
- clif_updatestatus(sd,SP_SPEED);
- clif_updatestatus(sd,SP_MAXHP);
- clif_updatestatus(sd,SP_MAXSP);
- if(first&1) {
- clif_updatestatus(sd,SP_HP);
- clif_updatestatus(sd,SP_SP);
- }
- return 0;
- }
-
- if(b_class != sd->view_class) {
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
-#endif
- }
-
- if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange)
- clif_skillinfoblock(sd); // ƒXƒLƒ‹‘—M
-
- if(b_speed != sd->speed)
- clif_updatestatus(sd,SP_SPEED);
- if(b_weight != sd->weight)
- clif_updatestatus(sd,SP_WEIGHT);
- if(b_max_weight != sd->max_weight) {
- clif_updatestatus(sd,SP_MAXWEIGHT);
- pc_checkweighticon(sd);
- }
- for(i=0;i<6;i++)
- if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
- clif_updatestatus(sd,SP_STR+i);
- if(b_hit != sd->hit)
- clif_updatestatus(sd,SP_HIT);
- if(b_flee != sd->flee)
- clif_updatestatus(sd,SP_FLEE1);
- if(b_aspd != sd->aspd)
- clif_updatestatus(sd,SP_ASPD);
- if(b_watk != sd->watk || b_base_atk != sd->base_atk)
- clif_updatestatus(sd,SP_ATK1);
- if(b_def != sd->def)
- clif_updatestatus(sd,SP_DEF1);
- if(b_watk2 != sd->watk2)
- clif_updatestatus(sd,SP_ATK2);
- if(b_def2 != sd->def2)
- clif_updatestatus(sd,SP_DEF2);
- if(b_flee2 != sd->flee2)
- clif_updatestatus(sd,SP_FLEE2);
- if(b_critical != sd->critical)
- clif_updatestatus(sd,SP_CRITICAL);
- if(b_matk1 != sd->matk1)
- clif_updatestatus(sd,SP_MATK1);
- if(b_matk2 != sd->matk2)
- clif_updatestatus(sd,SP_MATK2);
- if(b_mdef != sd->mdef)
- clif_updatestatus(sd,SP_MDEF1);
- if(b_mdef2 != sd->mdef2)
- clif_updatestatus(sd,SP_MDEF2);
- if(b_attackrange != sd->attackrange)
- clif_updatestatus(sd,SP_ATTACKRANGE);
- if(b_max_hp != sd->status.max_hp)
- clif_updatestatus(sd,SP_MAXHP);
- if(b_max_sp != sd->status.max_sp)
- clif_updatestatus(sd,SP_MAXSP);
- if(b_hp != sd->status.hp)
- clif_updatestatus(sd,SP_HP);
- if(b_sp != sd->status.sp)
- clif_updatestatus(sd,SP_SP);
-
-/* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
- before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
- clif_updatestatus(sd,SP_CARTINFO);*/
-
- if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd))
- // ƒI[ƒgƒo[ƒT[ƒN”­“®
- skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘• ”õ•i‚É‚æ‚é”\—Í“™‚̃{[ƒiƒXÝ’è
- *------------------------------------------
- */
-int pc_bonus(struct map_session_data *sd,int type,int val)
-{
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_STR:
- case SP_AGI:
- case SP_VIT:
- case SP_INT:
- case SP_DEX:
- case SP_LUK:
- if(sd->state.lr_flag != 2)
- sd->parame[type-SP_STR]+=val;
- break;
- case SP_ATK1:
- if(!sd->state.lr_flag)
- sd->watk+=val;
- else if(sd->state.lr_flag == 1)
- sd->watk_+=val;
- break;
- case SP_ATK2:
- if(!sd->state.lr_flag)
- sd->watk2+=val;
- else if(sd->state.lr_flag == 1)
- sd->watk_2+=val;
- break;
- case SP_BASE_ATK:
- if(sd->state.lr_flag != 2)
- sd->base_atk+=val;
- break;
- case SP_MATK1:
- if(sd->state.lr_flag != 2)
- sd->matk1 += val;
- break;
- case SP_MATK2:
- if(sd->state.lr_flag != 2)
- sd->matk2 += val;
- break;
- case SP_MATK:
- if(sd->state.lr_flag != 2) {
- sd->matk1 += val;
- sd->matk2 += val;
- }
- break;
- case SP_DEF1:
- if(sd->state.lr_flag != 2)
- sd->def+=val;
- break;
- case SP_MDEF1:
- if(sd->state.lr_flag != 2)
- sd->mdef+=val;
- break;
- case SP_MDEF2:
- if(sd->state.lr_flag != 2)
- sd->mdef+=val;
- break;
- case SP_HIT:
- if(sd->state.lr_flag != 2)
- sd->hit+=val;
- else
- sd->arrow_hit+=val;
- break;
- case SP_FLEE1:
- if(sd->state.lr_flag != 2)
- sd->flee+=val;
- break;
- case SP_FLEE2:
- if(sd->state.lr_flag != 2)
- sd->flee2+=val*10;
- break;
- case SP_CRITICAL:
- if(sd->state.lr_flag != 2)
- sd->critical+=val*10;
- else
- sd->arrow_cri += val*10;
- break;
- case SP_ATKELE:
- if(!sd->state.lr_flag)
- sd->atk_ele=val;
- else if(sd->state.lr_flag == 1)
- sd->atk_ele_=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_ele=val;
- break;
- case SP_DEFELE:
- if(sd->state.lr_flag != 2)
- sd->def_ele=val;
- break;
- case SP_MAXHP:
- if(sd->state.lr_flag != 2)
- sd->status.max_hp+=val;
- break;
- case SP_MAXSP:
- if(sd->state.lr_flag != 2)
- sd->status.max_sp+=val;
- break;
- case SP_CASTRATE:
- if(sd->state.lr_flag != 2)
- sd->castrate+=val;
- break;
- case SP_MAXHPRATE:
- if(sd->state.lr_flag != 2)
- sd->hprate+=val;
- break;
- case SP_MAXSPRATE:
- if(sd->state.lr_flag != 2)
- sd->sprate+=val;
- break;
- case SP_SPRATE:
- if(sd->state.lr_flag != 2)
- sd->dsprate+=val;
- break;
- case SP_ATTACKRANGE:
- if(!sd->state.lr_flag)
- sd->attackrange += val;
- else if(sd->state.lr_flag == 1)
- sd->attackrange_ += val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_range += val;
- break;
- case SP_ADD_SPEED:
- if(sd->state.lr_flag != 2)
- sd->speed -= val;
- break;
- case SP_SPEED_RATE:
- if(sd->state.lr_flag != 2) {
- if(sd->speed_rate > 100-val)
- sd->speed_rate = 100-val;
- }
- break;
- case SP_SPEED_ADDRATE:
- if(sd->state.lr_flag != 2)
- sd->speed_add_rate = sd->speed_add_rate * (100-val)/100;
- break;
- case SP_ASPD:
- if(sd->state.lr_flag != 2)
- sd->aspd -= val*10;
- break;
- case SP_ASPD_RATE:
- if(sd->state.lr_flag != 2) {
- if(sd->aspd_rate > 100-val)
- sd->aspd_rate = 100-val;
- }
- break;
- case SP_ASPD_ADDRATE:
- if(sd->state.lr_flag != 2)
- sd->aspd_add_rate = sd->aspd_add_rate * (100-val)/100;
- break;
- case SP_HP_RECOV_RATE:
- if(sd->state.lr_flag != 2)
- sd->hprecov_rate += val;
- break;
- case SP_SP_RECOV_RATE:
- if(sd->state.lr_flag != 2)
- sd->sprecov_rate += val;
- break;
- case SP_CRITICAL_DEF:
- if(sd->state.lr_flag != 2)
- sd->critical_def += val;
- break;
- case SP_NEAR_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->near_attack_def_rate += val;
- break;
- case SP_LONG_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->long_attack_def_rate += val;
- break;
- case SP_DOUBLE_RATE:
- if(sd->state.lr_flag == 0 && sd->double_rate < val)
- sd->double_rate = val;
- break;
- case SP_DOUBLE_ADD_RATE:
- if(sd->state.lr_flag == 0)
- sd->double_add_rate += val;
- break;
- case SP_MATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->matk_rate += val;
- break;
- case SP_IGNORE_DEF_ELE:
- if(!sd->state.lr_flag)
- sd->ignore_def_ele |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->ignore_def_ele_ |= 1<<val;
- break;
- case SP_IGNORE_DEF_RACE:
- if(!sd->state.lr_flag)
- sd->ignore_def_race |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->ignore_def_race_ |= 1<<val;
- break;
- case SP_ATK_RATE:
- if(sd->state.lr_flag != 2)
- sd->atk_rate += val;
- break;
- case SP_MAGIC_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->magic_def_rate += val;
- break;
- case SP_MISC_ATK_DEF:
- if(sd->state.lr_flag != 2)
- sd->misc_def_rate += val;
- break;
- case SP_IGNORE_MDEF_ELE:
- if(sd->state.lr_flag != 2)
- sd->ignore_mdef_ele |= 1<<val;
- break;
- case SP_IGNORE_MDEF_RACE:
- if(sd->state.lr_flag != 2)
- sd->ignore_mdef_race |= 1<<val;
- break;
- case SP_PERFECT_HIT_RATE:
- if(sd->state.lr_flag != 2 && sd->perfect_hit < val)
- sd->perfect_hit = val;
- break;
- case SP_PERFECT_HIT_ADD_RATE:
- if(sd->state.lr_flag != 2)
- sd->perfect_hit_add += val;
- break;
- case SP_CRITICAL_RATE:
- if(sd->state.lr_flag != 2)
- sd->critical_rate+=val;
- break;
- case SP_GET_ZENY_NUM:
- if(sd->state.lr_flag != 2 && sd->get_zeny_num < val)
- sd->get_zeny_num = val;
- break;
- case SP_ADD_GET_ZENY_NUM:
- if(sd->state.lr_flag != 2)
- sd->get_zeny_add_num += val;
- break;
- case SP_DEF_RATIO_ATK_ELE:
- if(!sd->state.lr_flag)
- sd->def_ratio_atk_ele |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->def_ratio_atk_ele_ |= 1<<val;
- break;
- case SP_DEF_RATIO_ATK_RACE:
- if(!sd->state.lr_flag)
- sd->def_ratio_atk_race |= 1<<val;
- else if(sd->state.lr_flag == 1)
- sd->def_ratio_atk_race_ |= 1<<val;
- break;
- case SP_HIT_RATE:
- if(sd->state.lr_flag != 2)
- sd->hit_rate += val;
- break;
- case SP_FLEE_RATE:
- if(sd->state.lr_flag != 2)
- sd->flee_rate += val;
- break;
- case SP_FLEE2_RATE:
- if(sd->state.lr_flag != 2)
- sd->flee2_rate += val;
- break;
- case SP_DEF_RATE:
- if(sd->state.lr_flag != 2)
- sd->def_rate += val;
- break;
- case SP_DEF2_RATE:
- if(sd->state.lr_flag != 2)
- sd->def2_rate += val;
- break;
- case SP_MDEF_RATE:
- if(sd->state.lr_flag != 2)
- sd->mdef_rate += val;
- break;
- case SP_MDEF2_RATE:
- if(sd->state.lr_flag != 2)
- sd->mdef2_rate += val;
- break;
- case SP_RESTART_FULL_RECORVER:
- if(sd->state.lr_flag != 2)
- sd->special_state.restart_full_recover = 1;
- break;
- case SP_NO_CASTCANCEL:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_castcancel = 1;
- break;
- case SP_NO_CASTCANCEL2:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_castcancel2 = 1;
- break;
- case SP_NO_SIZEFIX:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_sizefix = 1;
- break;
- case SP_NO_MAGIC_DAMAGE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_magic_damage = 1;
- break;
- case SP_NO_WEAPON_DAMAGE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_weapon_damage = 1;
- break;
- case SP_NO_GEMSTONE:
- if(sd->state.lr_flag != 2)
- sd->special_state.no_gemstone = 1;
- break;
- case SP_INFINITE_ENDURE:
- if(sd->state.lr_flag != 2)
- sd->special_state.infinite_endure = 1;
- break;
- case SP_SPLASH_RANGE:
- if(sd->state.lr_flag != 2 && sd->splash_range < val)
- sd->splash_range = val;
- break;
- case SP_SPLASH_ADD_RANGE:
- if(sd->state.lr_flag != 2)
- sd->splash_add_range += val;
- break;
- case SP_SHORT_WEAPON_DAMAGE_RETURN:
- if(sd->state.lr_flag != 2)
- sd->short_weapon_damage_return += val;
- break;
- case SP_LONG_WEAPON_DAMAGE_RETURN:
- if(sd->state.lr_flag != 2)
- sd->long_weapon_damage_return += val;
- break;
- case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here
- if(sd->state.lr_flag != 2)
- sd->magic_damage_return += val;
- break;
- case SP_ALL_STATS: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_STR-SP_STR]+=val;
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_VIT-SP_STR]+=val;
- sd->parame[SP_INT-SP_STR]+=val;
- sd->parame[SP_DEX-SP_STR]+=val;
- sd->parame[SP_LUK-SP_STR]+=val;
- clif_updatestatus(sd,13);
- clif_updatestatus(sd,14);
- clif_updatestatus(sd,15);
- clif_updatestatus(sd,16);
- clif_updatestatus(sd,17);
- clif_updatestatus(sd,18);
- }
- break;
- case SP_AGI_VIT: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_VIT-SP_STR]+=val;
- clif_updatestatus(sd,14);
- clif_updatestatus(sd,15);
- }
- break;
- case SP_AGI_DEX_STR: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->parame[SP_AGI-SP_STR]+=val;
- sd->parame[SP_DEX-SP_STR]+=val;
- sd->parame[SP_STR-SP_STR]+=val;
- clif_updatestatus(sd,14);
- clif_updatestatus(sd,17);
- clif_updatestatus(sd,13);
- }
- break;
- case SP_PERFECT_HIDE: // [Valaris]
- if(sd->state.lr_flag!=2) {
- sd->perfect_hiding=1;
- }
- break;
- case SP_DISGUISE: // Disguise script for items [Valaris]
- if(sd->state.lr_flag!=2 && sd->disguiseflag==0) {
- if(pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd, "Cannot wear disguise when riding a Peco.");
- break;
- }
- sd->disguise=val;
- clif_clearchar(&sd->bl, 9);
- pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
- }
- break;
- case SP_UNBREAKABLE:
- if(sd->state.lr_flag!=2) {
- sd->unbreakable += val;
- }
- break;
- default:
- if(battle_config.error_log)
- printf("pc_bonus: unknown type %d %d !\n",type,val);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * ‘• ”õ•i‚É‚æ‚é”\—Í“™‚̃{[ƒiƒXÝ’è
- *------------------------------------------
- */
-int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_ADDELE:
- if(!sd->state.lr_flag)
- sd->addele[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addele_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addele[type2]+=val;
- break;
- case SP_ADDRACE:
- if(!sd->state.lr_flag)
- sd->addrace[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addrace_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addrace[type2]+=val;
- break;
- case SP_ADDSIZE:
- if(!sd->state.lr_flag)
- sd->addsize[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->addsize_[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addsize[type2]+=val;
- break;
- case SP_SUBELE:
- if(sd->state.lr_flag != 2)
- sd->subele[type2]+=val;
- break;
- case SP_SUBRACE:
- if(sd->state.lr_flag != 2)
- sd->subrace[type2]+=val;
- break;
- case SP_ADDEFF:
- if(sd->state.lr_flag != 2)
- sd->addeff[type2]+=val;
- else
- sd->arrow_addeff[type2]+=val;
- break;
- case SP_ADDEFF2:
- if(sd->state.lr_flag != 2)
- sd->addeff2[type2]+=val;
- else
- sd->arrow_addeff2[type2]+=val;
- break;
- case SP_RESEFF:
- if(sd->state.lr_flag != 2)
- sd->reseff[type2]+=val;
- break;
- case SP_MAGIC_ADDELE:
- if(sd->state.lr_flag != 2)
- sd->magic_addele[type2]+=val;
- break;
- case SP_MAGIC_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->magic_addrace[type2]+=val;
- break;
- case SP_MAGIC_SUBRACE:
- if(sd->state.lr_flag != 2)
- sd->magic_subrace[type2]+=val;
- break;
- case SP_ADD_DAMAGE_CLASS:
- if(!sd->state.lr_flag) {
- for(i=0;i<sd->add_damage_class_count;i++) {
- if(sd->add_damage_classid[i] == type2) {
- sd->add_damage_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_damage_class_count && sd->add_damage_class_count < 10) {
- sd->add_damage_classid[sd->add_damage_class_count] = type2;
- sd->add_damage_classrate[sd->add_damage_class_count] += val;
- sd->add_damage_class_count++;
- }
- }
- else if(sd->state.lr_flag == 1) {
- for(i=0;i<sd->add_damage_class_count_;i++) {
- if(sd->add_damage_classid_[i] == type2) {
- sd->add_damage_classrate_[i] += val;
- break;
- }
- }
- if(i >= sd->add_damage_class_count_ && sd->add_damage_class_count_ < 10) {
- sd->add_damage_classid_[sd->add_damage_class_count_] = type2;
- sd->add_damage_classrate_[sd->add_damage_class_count_] += val;
- sd->add_damage_class_count_++;
- }
- }
- break;
- case SP_ADD_MAGIC_DAMAGE_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_magic_damage_class_count;i++) {
- if(sd->add_magic_damage_classid[i] == type2) {
- sd->add_magic_damage_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_magic_damage_class_count && sd->add_magic_damage_class_count < 10) {
- sd->add_magic_damage_classid[sd->add_magic_damage_class_count] = type2;
- sd->add_magic_damage_classrate[sd->add_magic_damage_class_count] += val;
- sd->add_magic_damage_class_count++;
- }
- }
- break;
- case SP_ADD_DEF_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_def_class_count;i++) {
- if(sd->add_def_classid[i] == type2) {
- sd->add_def_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_def_class_count && sd->add_def_class_count < 10) {
- sd->add_def_classid[sd->add_def_class_count] = type2;
- sd->add_def_classrate[sd->add_def_class_count] += val;
- sd->add_def_class_count++;
- }
- }
- break;
- case SP_ADD_MDEF_CLASS:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->add_mdef_class_count;i++) {
- if(sd->add_mdef_classid[i] == type2) {
- sd->add_mdef_classrate[i] += val;
- break;
- }
- }
- if(i >= sd->add_mdef_class_count && sd->add_mdef_class_count < 10) {
- sd->add_mdef_classid[sd->add_mdef_class_count] = type2;
- sd->add_mdef_classrate[sd->add_mdef_class_count] += val;
- sd->add_mdef_class_count++;
- }
- }
- break;
- case SP_HP_DRAIN_RATE:
- if(!sd->state.lr_flag) {
- sd->hp_drain_rate += type2;
- sd->hp_drain_per += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->hp_drain_rate_ += type2;
- sd->hp_drain_per_ += val;
- }
- break;
- case SP_SP_DRAIN_RATE:
- if(!sd->state.lr_flag) {
- sd->sp_drain_rate += type2;
- sd->sp_drain_per += val;
- }
- else if(sd->state.lr_flag == 1) {
- sd->sp_drain_rate_ += type2;
- sd->sp_drain_per_ += val;
- }
- break;
- case SP_WEAPON_COMA_ELE:
- if(sd->state.lr_flag != 2)
- sd->weapon_coma_ele[type2] += val;
- break;
- case SP_WEAPON_COMA_RACE:
- if(sd->state.lr_flag != 2)
- sd->weapon_coma_race[type2] += val;
- break;
- case SP_RANDOM_ATTACK_INCREASE: // [Valaris]
- if(sd->state.lr_flag !=2){
- sd->random_attack_increase_add = type2;
- sd->random_attack_increase_per += val;
- break;
- } // end addition
- default:
- if(battle_config.error_log)
- printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val);
- break;
- }
- return 0;
-}
-
-int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
-{
- int i;
- switch(type){
- case SP_ADD_MONSTER_DROP_ITEM:
- if(sd->state.lr_flag != 2) {
- for(i=0;i<sd->monster_drop_item_count;i++) {
- if(sd->monster_drop_itemid[i] == type2) {
- sd->monster_drop_race[i] |= 1<<type3;
- if(sd->monster_drop_itemrate[i] < val)
- sd->monster_drop_itemrate[i] = val;
- break;
- }
- }
- if(i >= sd->monster_drop_item_count && sd->monster_drop_item_count < 10) {
- sd->monster_drop_itemid[sd->monster_drop_item_count] = type2;
- sd->monster_drop_race[sd->monster_drop_item_count] |= 1<<type3;
- sd->monster_drop_itemrate[sd->monster_drop_item_count] = val;
- sd->monster_drop_item_count++;
- }
- }
- break;
- case SP_AUTOSPELL:
- if(sd->state.lr_flag != 2){
- sd->autospell_id = type2;
- sd->autospell_lv = type3;
- sd->autospell_rate = val;
- }
- break;
- default:
- if(battle_config.error_log)
- printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚É‚æ‚éƒXƒLƒ‹Š“¾
- *------------------------------------------
- */
-int pc_skill(struct map_session_data *sd,int id,int level,int flag)
-{
- nullpo_retr(0, sd);
-
- if(level>MAX_SKILL_LEVEL){
- if(battle_config.error_log)
- printf("support card skill only!\n");
- return 0;
- }
- if(!flag && (sd->status.skill[id].id == id || level == 0)){ // ƒNƒGƒXƒgŠ“¾‚Ȃ炱‚±‚ÅðŒ‚ðŠm”F‚µ‚Ä‘—M‚·‚é
- sd->status.skill[id].lv=level;
- pc_calcstatus(sd,0);
- clif_skillinfoblock(sd);
- }
- else if(sd->status.skill[id].lv < level){ // Šo‚¦‚ç‚ê‚邪lv‚ª¬‚³‚¢‚È‚ç
- if(sd->status.skill[id].id==id)
- sd->status.skill[id].flag=sd->status.skill[id].lv+2; // lv‚ð‹L‰¯
- else {
- sd->status.skill[id].id=id;
- sd->status.skill[id].flag=1; // cardƒXƒLƒ‹‚Æ‚·‚é
- }
- sd->status.skill[id].lv=level;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒh‘}“ü
- *------------------------------------------
- */
-int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip)
-{
- nullpo_retr(0, sd);
-
- if(idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0 && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card]) {
- int i;
- int nameid=sd->status.inventory[idx_equip].nameid;
- int cardid=sd->status.inventory[idx_card].nameid;
- int ep=sd->inventory_data[idx_card]->equip;
-
- if( nameid <= 0 || sd->inventory_data[idx_equip] == NULL ||
- (sd->inventory_data[idx_equip]->type!=4 && sd->inventory_data[idx_equip]->type!=5)|| // ‘• ”õ‚¶‚á‚È‚¢
- ( sd->status.inventory[idx_equip].identify==0 ) || // –¢ŠÓ’è
- ( sd->status.inventory[idx_equip].card[0]==0x00ff) || // »‘¢•Ší
- ( sd->status.inventory[idx_equip].card[0]==0x00fe) ||
- ( (sd->inventory_data[idx_equip]->equip&ep)==0 ) || // ‘• ”õŒÂŠˆá‚¢
- ( sd->inventory_data[idx_equip]->type==4 && ep==32) || // —¼ Žè•Ší‚Æ‚ƒJ[ƒh
- ( sd->status.inventory[idx_equip].card[0]==(short)0xff00) || sd->status.inventory[idx_equip].equip){
-
- clif_insert_card(sd,idx_equip,idx_card,1);
- return 0;
- }
- for(i=0;i<sd->inventory_data[idx_equip]->slot;i++){
- if( sd->status.inventory[idx_equip].card[i] == 0){
- // ‹ó‚«ƒXƒƒbƒg‚ª‚ ‚Á‚½‚Ì‚Å·‚µž‚Þ
- sd->status.inventory[idx_equip].card[i]=cardid;
-
- // ƒJ[ƒh‚ÍŒ¸‚ç‚·
- clif_insert_card(sd,idx_equip,idx_card,0);
- pc_delitem(sd,idx_card,1,1);
- return 0;
- }
- }
- }
- else
- clif_insert_card(sd,idx_equip,idx_card,1);
-
- return 0;
-}
-
-//
-// ƒAƒCƒeƒ€•¨
-//
-
-/*==========================================
- * ƒXƒLƒ‹‚É‚æ‚锃‚¢’lC³
- *------------------------------------------
- */
-int pc_modifybuyvalue(struct map_session_data *sd,int orig_value)
-{
- int skill,val = orig_value,rate1 = 0,rate2 = 0;
- if((skill=pc_checkskill(sd,MC_DISCOUNT))>0) // ƒfƒBƒXƒJƒEƒ“ƒg
- rate1 = 5+skill*2-((skill==10)? 1:0);
- if((skill=pc_checkskill(sd,RG_COMPULSION))>0) // ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg
- rate2 = 5+skill*4;
- if(rate1 < rate2) rate1 = rate2;
- if(rate1)
- val = (int)((double)orig_value*(double)(100-rate1)/100.);
- if(val < 0) val = 0;
- if(orig_value > 0 && val < 1) val = 1;
-
- return val;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‚É‚æ‚锄‚è’lC³
- *------------------------------------------
- */
-int pc_modifysellvalue(struct map_session_data *sd,int orig_value)
-{
- int skill,val = orig_value,rate = 0;
- if((skill=pc_checkskill(sd,MC_OVERCHARGE))>0) // ƒI[ƒo[ƒ`ƒƒ[ƒW
- rate = 5+skill*2-((skill==10)? 1:0);
- if(rate)
- val = (int)((double)orig_value*(double)(100+rate)/100.);
- if(val < 0) val = 0;
- if(orig_value > 0 && val < 1) val = 1;
-
- return val;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚𔃂Á‚½Žž‚ÉAV‚µ‚¢ƒAƒCƒeƒ€—“‚ðŽg‚¤‚©A
- * 3–œŒÂ§ŒÀ‚É‚©‚©‚é‚©Šm”F
- *------------------------------------------
- */
-int pc_checkadditem(struct map_session_data *sd,int nameid,int amount)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(itemdb_isequip(nameid))
- return ADDITEM_NEW;
-
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==nameid){
- if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_EXIST;
- }
- }
-
- if(amount > MAX_AMOUNT)
- return ADDITEM_OVERAMOUNT;
- return ADDITEM_NEW;
-}
-
-/*==========================================
- * ‹ó‚«ƒAƒCƒeƒ€—“‚̌”
- *------------------------------------------
- */
-int pc_inventoryblank(struct map_session_data *sd)
-{
- int i,b;
-
- nullpo_retr(0, sd);
-
- for(i=0,b=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==0)
- b++;
- }
-
- return b;
-}
-
-/*==========================================
- * ‚¨‹à‚𕥂¤
- *------------------------------------------
- */
-int pc_payzeny(struct map_session_data *sd,int zeny)
-{
- double z;
-
- nullpo_retr(0, sd);
-
- z = (double)sd->status.zeny;
- if(sd->status.zeny<zeny || z - (double)zeny > MAX_ZENY)
- return 1;
- sd->status.zeny-=zeny;
- clif_updatestatus(sd,SP_ZENY);
-
- return 0;
-}
-
-/*==========================================
- * ‚¨‹à‚𓾂é
- *------------------------------------------
- */
-int pc_getzeny(struct map_session_data *sd,int zeny)
-{
- double z;
-
- nullpo_retr(0, sd);
-
- z = (double)sd->status.zeny;
- if(z + (double)zeny > MAX_ZENY) {
- zeny = 0;
- sd->status.zeny = MAX_ZENY;
- }
- sd->status.zeny+=zeny;
- clif_updatestatus(sd,SP_ZENY);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ð’T‚µ‚ÄAƒCƒ“ƒfƒbƒNƒX‚ð•Ô‚·
- *------------------------------------------
- */
-int pc_search_inventory(struct map_session_data *sd,int item_id)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- for(i=0;i<MAX_INVENTORY;i++) {
- if(sd->status.inventory[i].nameid == item_id &&
- (sd->status.inventory[i].amount > 0 || item_id == 0))
- return i;
- }
-
- return -1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁBŒÂ”‚Ì‚Ýitem\‘¢‘Ì‚Ì”Žš‚𖳎‹
- *------------------------------------------
- */
-int pc_additem(struct map_session_data *sd,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i,w;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_data);
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search(item_data->nameid);
- if((w = data->weight*amount) + sd->weight > sd->max_weight)
- return 2;
-
- i = MAX_INVENTORY;
-
- if(!itemdb_isequip2(data)){
- // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_INVENTORY;i++)
- if(sd->status.inventory[i].nameid == item_data->nameid &&
- sd->status.inventory[i].card[0] == item_data->card[0] && sd->status.inventory[i].card[1] == item_data->card[1] &&
- sd->status.inventory[i].card[2] == item_data->card[2] && sd->status.inventory[i].card[3] == item_data->card[3]) {
- if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
- return 5;
- sd->status.inventory[i].amount+=amount;
- clif_additem(sd,i,amount,0);
- break;
- }
- }
- if(i >= MAX_INVENTORY){
- // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- i = pc_search_inventory(sd,0);
- if(i >= 0) {
- memcpy(&sd->status.inventory[i],item_data,sizeof(sd->status.inventory[0]));
- sd->status.inventory[i].amount=amount;
- sd->inventory_data[i]=data;
- clif_additem(sd,i,amount,0);
- }
- else return 4;
- }
- sd->weight += w;
- clif_updatestatus(sd,SP_WEIGHT);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int pc_delitem(struct map_session_data *sd,int n,int amount,int type)
-{
- nullpo_retr(1, sd);
-
- if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
- return 1;
-
- sd->status.inventory[n].amount -= amount;
- sd->weight -= sd->inventory_data[n]->weight*amount ;
- if(sd->status.inventory[n].amount<=0){
- if(sd->status.inventory[n].equip)
- pc_unequipitem(sd,n,0);
- memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0]));
- sd->inventory_data[n] = NULL;
- }
- if(!(type&1))
- clif_delitem(sd,n,amount);
- if(!(type&2))
- clif_updatestatus(sd,SP_WEIGHT);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ð—Ž‚·
- *------------------------------------------
- */
-int pc_dropitem(struct map_session_data *sd,int n,int amount)
-{
- nullpo_retr(1, sd);
-
- if (sd->status.inventory[n].nameid <= 0 ||
- sd->status.inventory[n].amount < amount ||
- sd->trade_partner != 0 || sd->vender_id != 0 ||
- sd->status.inventory[n].amount <= 0)
- return 1;
- map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0);
- pc_delitem(sd, n, amount, 0);
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðE‚¤
- *------------------------------------------
- */
-int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
-{
- int flag;
- unsigned int tick = gettick();
- struct map_session_data *first_sd = NULL,*second_sd = NULL,*third_sd = NULL;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, fitem);
-
- if(fitem->first_get_id > 0) {
- first_sd = map_id2sd(fitem->first_get_id);
- if(tick < fitem->first_get_tick) {
- if(fitem->first_get_id != sd->bl.id && !(first_sd && first_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- else if(fitem->second_get_id > 0) {
- second_sd = map_id2sd(fitem->second_get_id);
- if(tick < fitem->second_get_tick) {
- if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id &&
- !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- else if(fitem->third_get_id > 0) {
- third_sd = map_id2sd(fitem->third_get_id);
- if(tick < fitem->third_get_tick) {
- if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id && fitem->third_get_id != sd->bl.id &&
- !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id) &&
- !(third_sd && third_sd->status.party_id == sd->status.party_id)) {
- clif_additem(sd,0,0,6);
- return 0;
- }
- }
- }
- }
- }
- if((flag = pc_additem(sd,&fitem->item_data,fitem->item_data.amount)))
- // d—Êover‚Ŏ擾Ž¸”s
- clif_additem(sd,0,0,flag);
- else {
- /* Žæ“¾¬Œ÷ */
- if(sd->attacktimer != -1)
- pc_stopattack(sd);
- clif_takeitem(&sd->bl,&fitem->bl);
- map_clearflooritem(fitem->bl.id);
- }
- return 0;
-}
-
-int pc_isUseitem(struct map_session_data *sd,int n)
-{
- struct item_data *item;
- int nameid;
-
- nullpo_retr(0, sd);
-
- item = sd->inventory_data[n];
- nameid = sd->status.inventory[n].nameid;
-
- if(item == NULL)
- return 0;
- if((nameid == 605) && map[sd->bl.m].flag.gvg)
- return 0;
- if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) {
- clif_skill_teleportmessage(sd,0);
- return 0;
- }
- if(nameid == 602 && map[sd->bl.m].flag.noreturn)
- return 0;
- if(nameid == 604 && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg))
- return 0;
- if(item->sex != 2 && sd->status.sex != item->sex)
- return 0;
- if(item->elv > 0 && sd->status.base_level < item->elv)
- return 0;
- if(((sd->status.class==13 || sd->status.class==4014) && ((1<<7)&item->class) == 0) || // have mounted classes use unmounted items [Valaris]
- ((sd->status.class==21 || sd->status.class==4022) && ((1<<14)&item->class) == 0))
- return 0;
- if(sd->status.class!=13 && sd->status.class!=4014 && sd->status.class!=21 && sd->status.class!=4022)
- if((sd->status.class<=4000 && ((1<<sd->status.class)&item->class) == 0) || (sd->status.class>4000 && sd->status.class<4023 && ((1<<(sd->status.class-4001))&item->class) == 0) ||
- (sd->status.class>=4023 && ((1<<(sd->status.class-4023))&item->class) == 0))
- return 0;
-
-#ifndef TXT_ONLY
- if((log_config.branch > 0) && (nameid == 604))
- log_branch(sd);
-#endif
-
- return 1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚ðŽg‚¤
- *------------------------------------------
- */
-int pc_useitem(struct map_session_data *sd,int n)
-{
- int nameid,amount;
-
- nullpo_retr(1, sd);
-
- if(n >=0 && n < MAX_INVENTORY) {
- nameid = sd->status.inventory[n].nameid;
- amount = sd->status.inventory[n].amount;
- if(sd->status.inventory[n].nameid <= 0 ||
- sd->status.inventory[n].amount <= 0 ||
- sd->sc_data[SC_BERSERK].timer!=-1 ||
- !pc_isUseitem(sd,n) ) {
- clif_useitemack(sd,n,0,0);
- return 1;
- }
- if(sd->inventory_data[n])
- run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
-
- clif_useitemack(sd,n,amount-1,1);
- pc_delitem(sd,n,1,1);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒgƒAƒCƒeƒ€’ljÁBŒÂ”‚Ì‚Ýitem\‘¢‘Ì‚Ì”Žš‚𖳎‹
- *------------------------------------------
- */
-int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount)
-{
- struct item_data *data;
- int i,w;
-
- nullpo_retr(1, sd);
- nullpo_retr(1, item_data);
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- data = itemdb_search(item_data->nameid);
-
- if((w=data->weight*amount) + sd->cart_weight > sd->cart_max_weight)
- return 1;
-
- i=MAX_CART;
- if(!itemdb_isequip2(data)){
- // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==item_data->nameid &&
- sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] &&
- sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3]){
- if(sd->status.cart[i].amount+amount > MAX_AMOUNT)
- return 1;
- sd->status.cart[i].amount+=amount;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
- }
- if(i >= MAX_CART){
- // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==0){
- memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0]));
- sd->status.cart[i].amount=amount;
- sd->cart_num++;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
- if(i >= MAX_CART)
- return 1;
- }
- sd->cart_weight += w;
- clif_updatestatus(sd,SP_CARTINFO);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒgƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type)
-{
- nullpo_retr(1, sd);
-
- if(sd->status.cart[n].nameid==0 ||
- sd->status.cart[n].amount<amount)
- return 1;
-
- sd->status.cart[n].amount -= amount;
- sd->cart_weight -= itemdb_weight(sd->status.cart[n].nameid)*amount ;
- if(sd->status.cart[n].amount <= 0){
- memset(&sd->status.cart[n],0,sizeof(sd->status.cart[0]));
- sd->cart_num--;
- }
- if(!type) {
- clif_cart_delitem(sd,n,amount);
- clif_updatestatus(sd,SP_CARTINFO);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚ÖƒAƒCƒeƒ€ˆÚ“®
- *------------------------------------------
- */
-int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) {
- struct item *item_data;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, item_data = &sd->status.inventory[idx]);
-
- if (item_data->nameid==0 || item_data->amount<amount || sd->vender_id)
- return 1;
- if (pc_cart_additem(sd,item_data,amount) == 0)
- return pc_delitem(sd,idx,amount,0);
-
- return 1;
-}
-
-/*==========================================
- * ƒJ[ƒg“à‚̃AƒCƒeƒ€”Šm”F(ŒÂ”‚Ì·•ª‚ð•Ô‚·)
- *------------------------------------------
- */
-int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount)
-{
- struct item *item_data;
-
- nullpo_retr(-1, sd);
- nullpo_retr(-1, item_data=&sd->status.cart[idx]);
-
- if( item_data->nameid==0 || !item_data->amount)
- return -1;
- return item_data->amount-amount;
-}
-/*==========================================
- * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€ˆÚ“®
- *------------------------------------------
- */
-
-int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount)
-{
- struct item *item_data;
- int flag;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, item_data=&sd->status.cart[idx]);
-
- if( item_data->nameid==0 || item_data->amount<amount || sd->vender_id )
- return 1;
- if((flag = pc_additem(sd,item_data,amount)) == 0)
- return pc_cart_delitem(sd,idx,amount,0);
-
- clif_additem(sd,0,0,flag);
- return 1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€ŠÓ’è
- *------------------------------------------
- */
-int pc_item_identify(struct map_session_data *sd,int idx)
-{
- int flag=1;
-
- nullpo_retr(0, sd);
-
- if(idx >= 0 && idx < MAX_INVENTORY) {
- if(sd->status.inventory[idx].nameid > 0 && sd->status.inventory[idx].identify == 0 ){
- flag=0;
- sd->status.inventory[idx].identify=1;
- }
- clif_item_identified(sd,idx,flag);
- }
- else
- clif_item_identified(sd,idx,flag);
-
- return !flag;
-}
-
-/*==========================================
- * ƒXƒeƒBƒ‹•iŒöŠJ
- *------------------------------------------
- */
-int pc_show_steal(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
- int itemid;
- int type;
-
- struct item_data *item=NULL;
- char output[100];
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=va_arg(ap,struct map_session_data *));
-
- itemid=va_arg(ap,int);
- type=va_arg(ap,int);
-
- if(!type){
- if((item=itemdb_exists(itemid))==NULL)
- sprintf(output,"%s stole an Unknown_Item.",sd->status.name);
- else
- sprintf(output,"%s stole %s.",sd->status.name,item->jname);
- clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
- }else{
- sprintf(output,"%s has not stolen the item because of being overweight.",sd->status.name);
- clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-//** pc.c: Small Steal Item fix by fritz
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
-{
- if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
- int i,skill,rate,itemid,flag, count;
- struct mob_data *md;
- md=(struct mob_data *)bl;
- if(!md->state.steal_flag && mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode&0x20) && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1 &&
- (!(md->class>1324 && md->class<1364))) // prevent stealing from treasure boxes [Valaris]
- {
- skill = sd->paramc[4] - mob_db[md->class].dex + pc_checkskill(sd,TF_STEAL) + 10;
-
- if(0 < skill)
- {
- for(count = 8; count <= 8 && count != 0; count--)
- {
- i = rand()%8;
- itemid = mob_db[md->class].dropitem[i].nameid;
-
- if(itemid > 0 && itemdb_type(itemid) != 6)
- {
- rate = (mob_db[md->class].dropitem[i].p / battle_config.item_rate_common * 100 * skill)/100;
-
- if(rand()%10000 < rate)
- {
- struct item tmp_item;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = itemid;
- tmp_item.amount = 1;
- tmp_item.identify = 1;
- flag = pc_additem(sd,&tmp_item,1);
- if(battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,0);
- }
-
- if(flag)
- {
- if(battle_config.show_steal_in_same_party)
- {
- party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,1);
- }
-
- clif_additem(sd,0,0,flag);
- }
- md->state.steal_flag = 1;
- return 1;
- }
- }
- }
- }
- }
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_steal_coin(struct map_session_data *sd,struct block_list *bl)
-{
- if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
- int rate,skill;
- struct mob_data *md=(struct mob_data *)bl;
- if(md && !md->state.steal_coin_flag && md->sc_data && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1) {
- skill = pc_checkskill(sd,RG_STEALCOIN)*10;
- rate = skill + (sd->status.base_level - mob_db[md->class].lv)*3 + sd->paramc[4]*2 + sd->paramc[5]*2;
- if(rand()%1000 < rate) {
- pc_getzeny(sd,mob_db[md->class].lv*10 + rand()%100);
- md->state.steal_coin_flag = 1;
- return 1;
- }
- }
- }
-
- return 0;
-}
-//
-//
-//
-/*==========================================
- * PC‚̈ʒuÝ’è
- *------------------------------------------
- */
-int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
-{
- char mapname[24];
- int m=0,c=0,disguise=0;
-
- nullpo_retr(0, sd);
-
- if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
- chat_leavechat(sd);
- if(sd->trade_partner) // Žæˆø‚ð’†’f‚·‚é
- trade_tradecancel(sd);
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,0);
- else
- storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
-
- if(sd->party_invite>0) // ƒp[ƒeƒBŠ©—U‚ð‹‘”Û‚·‚é
- party_reply_invite(sd,sd->party_invite_account,0);
- if(sd->guild_invite>0) // ƒMƒ‹ƒhŠ©—U‚ð‹‘”Û‚·‚é
- guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿Š©—U‚ð‹‘”Û‚·‚é
- guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
-
- skill_castcancel(&sd->bl,0); // ‰r¥’†’f
- pc_stop_walking(sd,0); // •às’†’f
- pc_stopattack(sd); // UŒ‚’†’f
-
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
-
- if(sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1);
- if(sd->status.option&2)
- skill_status_change_end(&sd->bl, SC_HIDING, -1);
- if(sd->status.option&4)
- skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
- if(sd->status.option&16386)
- skill_status_change_end(&sd->bl, SC_CHASEWALK, -1);
- if(sd->sc_data[SC_BLADESTOP].timer!=-1)
- skill_status_change_end(&sd->bl,SC_BLADESTOP,-1);
- if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris]
- skill_stop_dancing(&sd->bl,0);
-
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- }
-
- if(sd->disguise) { // clear disguises when warping [Valaris]
- clif_clearchar(&sd->bl, 9);
- disguise=sd->disguise;
- sd->disguise=0;
- }
-
- memcpy(mapname,mapname_org,24);
- mapname[16]=0;
- if(strstr(mapname,".gat")==NULL && strlen(mapname)<16){
- strcat(mapname,".gat");
- }
-
- m=map_mapname2mapid(mapname);
- if(m<0){
- if(sd->mapname[0]){
- int ip,port;
- if(map_mapname2ipport(mapname,&ip,&port)==0){
- skill_stop_dancing(&sd->bl,1);
- skill_unit_out_all(&sd->bl,gettick(),1);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
- pet_remove_map(sd);
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- if(battle_config.pet_status_support)
- pc_calcstatus(sd,2);
- }
- else if(sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
- map_delblock(&sd->pd->bl);
- }
- }
- memcpy(sd->mapname,mapname,24);
- sd->bl.x=x;
- sd->bl.y=y;
- sd->state.waitingdisconnect=1;
- pc_makesavestatus(sd);
- if(sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id,&sd->pet);
- chrif_save(sd);
- storage_storage_save(sd);
- chrif_changemapserver(sd, mapname, x, y, ip, port);
- return 0;
- }
- }
-#if 0
- clif_authfail_fd(sd->fd,0); // cancel
- clif_setwaitclose(sd->fd);
-#endif
- return 1;
- }
-
- if(x <0 || x >= map[m].xs || y <0 || y >= map[m].ys)
- x=y=0;
- if((x==0 && y==0) || (c=read_gat(m,x,y))==1 || c==5){
- if(x||y) {
- if(battle_config.error_log)
- printf("stacked (%d,%d)\n",x,y);
- }
- do {
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- } while((c=read_gat(m,x,y))==1 || c==5);
- }
-
- if(sd->mapname[0] && sd->bl.prev != NULL){
- skill_unit_out_all(&sd->bl,gettick(),1);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- // pet
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
- pet_remove_map(sd);
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
- if(battle_config.pet_status_support)
- pc_calcstatus(sd,2);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- }
- else if(sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
- map_delblock(&sd->pd->bl);
- }
- }
- clif_changemap(sd,map[m].name,x,y); // [MouseJstr]
- }
-
- if(disguise) // disguise teleport fix [Valaris]
- sd->disguise=disguise;
-
- memcpy(sd->mapname,mapname,24);
- sd->bl.m = m;
- sd->to_x = x;
- sd->to_y = y;
-
- // moved and changed dance effect stopping
-
- sd->bl.x = x;
- sd->bl.y = y;
-
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- sd->pd->bl.m = m;
- sd->pd->bl.x = sd->pd->to_x = x;
- sd->pd->bl.y = sd->pd->to_y = y;
- sd->pd->dir = sd->dir;
- }
-
-// map_addblock(&sd->bl); /// ƒuƒƒbƒN“o˜^‚Æspawn‚Í
-// clif_spawnpc(sd);
-
- return 0;
-}
-
-/*==========================================
- * PC‚̃‰ƒ“ƒ_ƒ€ƒ[ƒv
- *------------------------------------------
- */
-int pc_randomwarp(struct map_session_data *sd, int type) {
- int x,y,c,i=0;
- int m;
-
- nullpo_retr(0, sd);
-
- m=sd->bl.m;
-
- if (map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|[ƒg‹ÖŽ~
- return 0;
-
- do{
- x=rand()%(map[m].xs-2)+1;
- y=rand()%(map[m].ys-2)+1;
- } while (((c=read_gat(m,x,y)) == 1 || c == 5) && (i++) < 1000);
-
- if (i < 1000)
- pc_setpos(sd,map[m].name,x,y,type);
-
- return 0;
-}
-
-/*==========================================
- * Œ»ÝˆÊ’u‚̃ƒ‚
- *------------------------------------------
- */
-int pc_memo(struct map_session_data *sd, int i) {
- int skill;
- int j;
-
- nullpo_retr(0, sd);
-
- skill = pc_checkskill(sd, AL_WARP);
-
- if (i >= MIN_PORTAL_MEMO)
- i -= MIN_PORTAL_MEMO;
- else if (map[sd->bl.m].flag.nomemo || (map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd))) {
- clif_skill_teleportmessage(sd, 1);
- return 0;
- }
-
- if (skill < 1) {
- clif_skill_memo(sd,2);
- }
-
- if (skill < 2 || i < -1 || i > 2) {
- clif_skill_memo(sd, 1);
- return 0;
- }
-
- for(j = 0 ; j < 3; j++) {
- if (strcmp(sd->status.memo_point[j].map, map[sd->bl.m].name) == 0) {
- i = j;
- break;
- }
- }
-
- if (i == -1) {
- for(i = skill - 3; i >= 0; i--) {
- memcpy(&sd->status.memo_point[i+1],&sd->status.memo_point[i],
- sizeof(struct point));
- }
- i = 0;
- }
- memcpy(sd->status.memo_point[i].map, map[sd->bl.m].name, 24);
- sd->status.memo_point[i].x = sd->bl.x;
- sd->status.memo_point[i].y = sd->bl.y;
-
- clif_skill_memo(sd, 0);
-
- return 1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_can_reach(struct map_session_data *sd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.x==x && sd->bl.y==y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- // áŠQ•¨”»’è
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- return (path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,x,y,0)!=-1)?1:0;
-}
-
-//
-// •à s•¨
-//
-/*==========================================
- * ŽŸ‚Ì1•à‚É‚©‚©‚鎞ŠÔ‚ðŒvŽZ
- *------------------------------------------
- */
-static int calc_next_walk_step(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->walkpath.path_pos>=sd->walkpath.path_len)
- return -1;
- if(sd->walkpath.path[sd->walkpath.path_pos]&1)
- return sd->speed*14/10;
-
- return sd->speed;
-}
-
-/*==========================================
- * ”¼•ài‚Þ(timerŠÖ”)
- *------------------------------------------
- */
-static int pc_walk(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- int i,ctype;
- int moveblock;
- int x,y,dx,dy;
-
- sd=map_id2sd(id);
- if(sd==NULL)
- return 0;
-
- if(sd->walktimer != tid){
- if(battle_config.error_log)
- printf("pc_walk %d != %d\n",sd->walktimer,tid);
- return 0;
- }
- sd->walktimer=-1;
- if(sd->walkpath.path_pos>=sd->walkpath.path_len || sd->walkpath.path_pos!=data)
- return 0;
-
- //•à‚¢‚½‚Ì‚Å‘§‚̃^ƒCƒ}[‚ð‰Šú‰»
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
-
- sd->walkpath.path_half ^= 1;
- if(sd->walkpath.path_half==0){ // ƒ}ƒX–Ú’†S‚Ö“ž’…
- sd->walkpath.path_pos++;
- if(sd->state.change_walk_target){
- pc_walktoxy_sub(sd);
- return 0;
- }
- } else { // ƒ}ƒX–Ú‹«ŠE‚Ö“ž’…
- if(sd->walkpath.path[sd->walkpath.path_pos]>=8)
- return 1;
-
- x = sd->bl.x;
- y = sd->bl.y;
- ctype = map_getcell(sd->bl.m,x,y);
- if(ctype == 1 || ctype == 5) {
- pc_stop_walking(sd,1);
- return 0;
- }
- sd->dir=sd->head_dir=sd->walkpath.path[sd->walkpath.path_pos];
- dx = dirx[(int)sd->dir];
- dy = diry[(int)sd->dir];
- ctype = map_getcell(sd->bl.m,x+dx,y+dy);
- if(ctype == 1 || ctype == 5) {
- pc_walktoxy_sub(sd);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- sd->walktimer = 1;
- map_foreachinmovearea(clif_pcoutsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
-
- x += dx;
- y += dy;
-
- if(moveblock) map_delblock(&sd->bl);
- sd->bl.x = x;
- sd->bl.y = y;
- if(moveblock) map_addblock(&sd->bl);
-
- if(sd->sc_data[SC_DANCING].timer!=-1)
- skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy);
-
- map_foreachinmovearea(clif_pcinsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,0,sd);
- sd->walktimer = -1;
-
- if(sd->status.party_id>0){ // ƒp[ƒeƒB‚Ì‚g‚oî•ñ’Ê’mŒŸ¸
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL){
- int p_flag=0;
- map_foreachinmovearea(party_send_hp_check,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&p_flag);
- if(p_flag)
- sd->party_hp=-1;
- }
- }
- if(sd->status.option&4) // ƒNƒ[ƒLƒ“ƒO‚ÌÁ–ÅŒŸ¸
- skill_check_cloaking(&sd->bl);
- /* ƒfƒBƒ{[ƒVƒ‡ƒ“ŒŸ¸ */
- for(i=0;i<5;i++)
- if(sd->dev.val1[i]){
- skill_devotion3(&sd->bl,sd->dev.val1[i]);
- break;
- }
- /* ”íƒfƒBƒ{[ƒVƒ‡ƒ“ŒŸ¸ */
- if( sd->sc_data && sd->sc_data[SC_DEVOTION].val1){
- skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1);
- }
-
- skill_unit_move(&sd->bl,tick,1); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
-
- if(map_getcell(sd->bl.m,x,y)&0x80)
- npc_touch_areanpc(sd,sd->bl.m,x,y);
- else
- sd->areanpc_id=0;
- }
- if((i=calc_next_walk_step(sd))>0) {
- i = i>>1;
- if(i < 1 && sd->walkpath.path_half == 0)
- i = 1;
- sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
- }
-
- return 0;
-}
-
-/*==========================================
- * ˆÚ“®‰Â”\‚©Šm”F‚µ‚ÄA‰Â”\‚È‚ç•àsŠJŽn
- *------------------------------------------
- */
-static int pc_walktoxy_sub(struct map_session_data *sd)
-{
- struct walkpath_data wpd;
- int i;
-
- nullpo_retr(1, sd);
-
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y,0))
- return 1;
- memcpy(&sd->walkpath,&wpd,sizeof(wpd));
-
- clif_walkok(sd);
- sd->state.change_walk_target=0;
-
- if((i=calc_next_walk_step(sd))>0){
- i = i>>2;
- sd->walktimer=add_timer(gettick()+i,pc_walk,sd->bl.id,0);
- }
- clif_movechar(sd);
-
- return 0;
-}
-
-/*==========================================
- * pc•à s—v‹
- *------------------------------------------
- */
-int pc_walktoxy(struct map_session_data *sd,int x,int y)
-{
-
- nullpo_retr(0, sd);
-
- sd->to_x=x;
- sd->to_y=y;
-
- if(sd->walktimer != -1 && sd->state.change_walk_target==0){
- // Œ»Ý•à‚¢‚Ä‚¢‚éÅ’†‚Ì–Ú“I’n•ÏX‚Ȃ̂Ń}ƒX–Ú‚Ì’†S‚É—ˆ‚½Žž‚É
- // timerŠÖ”‚©‚çpc_walktoxy_sub‚ðŒÄ‚Ԃ悤‚É‚·‚é
- sd->state.change_walk_target=1;
- } else {
- pc_walktoxy_sub(sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * •à s’âŽ~
- *------------------------------------------
- */
-int pc_stop_walking(struct map_session_data *sd,int type)
-{
- nullpo_retr(0, sd);
-
- if(sd->walktimer != -1) {
- delete_timer(sd->walktimer,pc_walk);
- sd->walktimer=-1;
- }
- sd->walkpath.path_len=0;
- sd->to_x = sd->bl.x;
- sd->to_y = sd->bl.y;
- if(type&0x01)
- clif_fixpos(&sd->bl);
- if(type&0x02 && battle_config.pc_damage_delay) {
- unsigned int tick = gettick();
- int delay = battle_get_dmotion(&sd->bl);
- if(sd->canmove_tick < tick)
- sd->canmove_tick = tick + delay;
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y)
-{
- int moveblock;
- int dx,dy,dist;
-
- struct walkpath_data wpd;
-
- nullpo_retr(0, sd);
-
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,dst_x,dst_y,0))
- return 1;
-
- sd->dir = sd->head_dir = map_calc_dir(&sd->bl, dst_x,dst_y);
-
- dx = dst_x - sd->bl.x;
- dy = dst_y - sd->bl.y;
- dist = distance(sd->bl.x,sd->bl.y,dst_x,dst_y);
-
- moveblock = ( sd->bl.x/BLOCK_SIZE != dst_x/BLOCK_SIZE || sd->bl.y/BLOCK_SIZE != dst_y/BLOCK_SIZE);
-
- map_foreachinmovearea(clif_pcoutsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,dx,dy,0,sd);
-
- if(moveblock) map_delblock(&sd->bl);
- sd->bl.x = dst_x;
- sd->bl.y = dst_y;
- if(moveblock) map_addblock(&sd->bl);
-
- map_foreachinmovearea(clif_pcinsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,0,sd);
-
- if(sd->status.party_id>0){ // ƒp[ƒeƒB‚Ì‚g‚oî•ñ’Ê’mŒŸ¸
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL){
- int flag=0;
- map_foreachinmovearea(party_send_hp_check,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&flag);
- if(flag)
- sd->party_hp=-1;
- }
- }
-
- if(sd->status.option&4) // ƒNƒ[ƒLƒ“ƒO‚ÌÁ–ÅŒŸ¸
- skill_check_cloaking(&sd->bl);
-
- skill_unit_move(&sd->bl,gettick(),dist+7); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
-
- if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)&0x80)
- npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y);
- else
- sd->areanpc_id=0;
- return 0;
-}
-
-//
-// •Ší퓬
-//
-/*==========================================
- * ƒXƒLƒ‹‚ÌŒŸõ Š—L‚µ‚Ä‚¢‚½ê‡Lv‚ª•Ô‚é
- *------------------------------------------
- */
-int pc_checkskill(struct map_session_data *sd,int skill_id)
-{
- if(sd == NULL) return 0;
- if( skill_id>=10000 ){
- struct guild *g;
- if( sd->status.guild_id>0 && (g=guild_search(sd->status.guild_id))!=NULL)
- return guild_checkskill(g,skill_id);
- return 0;
- }
-
- if(sd->status.skill[skill_id].id == skill_id)
- return (sd->status.skill[skill_id].lv);
-
- return 0;
-}
-
-/*==========================================
- * •Ší•ÏX‚É‚æ‚éƒXƒLƒ‹‚ÌŒp‘±ƒ`ƒFƒbƒN
- * ˆø”F
- * struct map_session_data *sd ƒZƒbƒVƒ‡ƒ“ƒf[ƒ^
- * int nameid ‘•”õ•iID
- * •Ô‚è’lF
- * 0 •ÏX‚È‚µ
- * -1 ƒXƒLƒ‹‚ð‰ðœ
- *------------------------------------------
- */
-int pc_checkallowskill(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if( sd->sc_data == NULL )
- return 0;
-
- if(!(skill_get_weapontype(KN_TWOHANDQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_TWOHANDQUICKEN].timer!=-1) { // 2HQ
- skill_status_change_end(&sd->bl,SC_TWOHANDQUICKEN,-1); // 2HQ‚ð‰ðœ
- return -1;
- }
- if(!(skill_get_weapontype(LK_AURABLADE)&(1<<sd->status.weapon)) && sd->sc_data[SC_AURABLADE].timer!=-1) { /* ƒI[ƒ‰ƒuƒŒ[ƒh */
- skill_status_change_end(&sd->bl,SC_AURABLADE,-1); /* ƒI[ƒ‰ƒuƒŒ[ƒh‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(LK_PARRYING)&(1<<sd->status.weapon)) && sd->sc_data[SC_PARRYING].timer!=-1) { /* ƒpƒŠƒCƒ“ƒO */
- skill_status_change_end(&sd->bl,SC_PARRYING,-1); /* ƒpƒŠƒCƒ“ƒO‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(LK_CONCENTRATION)&(1<<sd->status.weapon)) && sd->sc_data[SC_CONCENTRATION].timer!=-1) { /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
- skill_status_change_end(&sd->bl,SC_CONCENTRATION,-1); /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ð‰ðœ */
- return -1;
- }
- if(!(skill_get_weapontype(CR_SPEARQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_SPEARSQUICKEN].timer!=-1){ // ƒXƒsƒAƒNƒBƒbƒPƒ“
- skill_status_change_end(&sd->bl,SC_SPEARSQUICKEN,-1); // ƒXƒsƒAƒNƒCƒbƒPƒ“‚ð‰ðœ
- return -1;
- }
- if(!(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)) && sd->sc_data[SC_ADRENALINE].timer!=-1){ // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
- skill_status_change_end(&sd->bl,SC_ADRENALINE,-1); // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ð‰ðœ
- return -1;
- }
-
- if(sd->status.shield <= 0) {
- if(sd->sc_data[SC_AUTOGUARD].timer!=-1){ // ƒI[ƒgƒK[ƒh
- skill_status_change_end(&sd->bl,SC_AUTOGUARD,-1);
- return -1;
- }
- if(sd->sc_data[SC_DEFENDER].timer!=-1){ // ƒfƒBƒtƒFƒ“ƒ_[
- skill_status_change_end(&sd->bl,SC_DEFENDER,-1);
- return -1;
- }
- if(sd->sc_data[SC_REFLECTSHIELD].timer!=-1){ //ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh
- skill_status_change_end(&sd->bl,SC_REFLECTSHIELD,-1);
- return -1;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘• ”õ•i‚̃`ƒFƒbƒN
- *------------------------------------------
- */
-int pc_checkequip(struct map_session_data *sd,int pos)
-{
- int i;
-
- nullpo_retr(-1, sd);
-
- for(i=0;i<11;i++){
- if(pos & equip_pos[i])
- return sd->equip_index[i];
- }
-
- return -1;
-}
-
-/*==========================================
- * “]¶E‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
- *------------------------------------------
- */
-struct pc_base_job pc_calc_base_job(int b_class)
-{
- struct pc_base_job bj;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- if(b_class < MAX_PC_CLASS){ //’Êí
- bj.job = b_class;
- bj.upper = 0;
- }else if(b_class >= 4001 && b_class < 4023){ //“]¶E
- bj.job = b_class - 4001;
- bj.upper = 1;
- }else if(b_class == 23 + 4023 -1){ //—{ŽqƒXƒpƒmƒr
- bj.job = b_class - (4023 - 1);
- bj.upper = 2;
- }else{ //—{ŽqƒXƒpƒmƒrˆÈŠO‚Ì—{Žq
- bj.job = b_class - 4023;
- bj.upper = 2;
- }
-
- if(battle_config.enable_upper_class==0){ //conf‚Å–³Œø‚É‚È‚Á‚Ä‚¢‚½‚çupper=0
- bj.upper = 0;
- }
-
- if(bj.job == 0){
- bj.type = 0;
- }else if(bj.job < 7){
- bj.type = 1;
- }else{
- bj.type = 2;
- }
-
- return bj;
-}
-
-/*==========================================
- * PC‚ÌUŒ‚ (timerŠÖ”)
- *------------------------------------------
- */
-int pc_attack_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- struct block_list *bl;
- struct status_change *sc_data;
- short *opt;
- int dist,skill,range;
-
- sd=map_id2sd(id);
- if(sd == NULL)
- return 0;
- if(sd->attacktimer != tid){
- if(battle_config.error_log)
- printf("pc_attack_timer %d != %d\n",sd->attacktimer,tid);
- return 0;
- }
- sd->attacktimer=-1;
-
- if(sd->bl.prev == NULL)
- return 0;
-
- bl=map_id2bl(sd->attacktarget);
- if(bl==NULL || bl->prev == NULL)
- return 0;
-
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 0;
-
- // “¯‚¶map‚Å‚È‚¢‚È‚çUŒ‚‚µ‚È‚¢
- // PC‚ªŽ€‚ñ‚Å‚Ä‚àUŒ‚‚µ‚È‚¢
- if(sd->bl.m != bl->m || pc_isdead(sd))
- return 0;
-
- if( sd->opt1>0 || sd->status.option&2 || sd->status.option&16388) // ˆÙí‚È‚Ç‚ÅUŒ‚‚Å‚«‚È‚¢
- return 0;
-
- if(sd->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
- if(sd->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
-
- if((opt = battle_get_option(bl)) != NULL && *opt&0x46)
- return 0;
- if(((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_TRICKDEAD].timer != -1) ||
- ((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_BASILICA].timer != -1 ))
- return 0;
-
- if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) <= 0)
- return 0;
-
- if(!battle_config.sdelay_attack_enable && pc_checkskill(sd,SA_FREECAST) <= 0) {
- if(DIFF_TICK(tick , sd->canact_tick) < 0) {
- clif_skill_fail(sd,1,4,0);
- return 0;
- }
- }
-
- dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
- range = sd->attackrange;
- if(sd->status.weapon != 11) range++;
- if( dist > range ){ // “Í ‚©‚È‚¢‚̂ňړ®
- if(pc_can_reach(sd,bl->x,bl->y))
- clif_movetoattack(sd,bl);
- return 0;
- }
-
- if(dist <= range && !battle_check_range(&sd->bl,bl,range) ) {
- if(pc_can_reach(sd,bl->x,bl->y) && sd->canmove_tick < tick && (sd->sc_data[SC_ANKLE].timer == -1 || sd->sc_data[SC_SPIDERWEB].timer == -1))
- pc_walktoxy(sd,bl->x,bl->y);
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- else {
- if(battle_config.pc_attack_direction_change)
- sd->dir=sd->head_dir=map_calc_dir(&sd->bl, bl->x,bl->y ); // Œü‚«Ý’è
-
- if(sd->walktimer != -1)
- pc_stop_walking(sd,1);
-
- if(sd->sc_data[SC_COMBO].timer == -1) {
- map_freeblock_lock();
- pc_stop_walking(sd,0);
- sd->attacktarget_lv = battle_weapon_attack(&sd->bl,bl,tick,0);
- if(!(battle_config.pc_cloak_check_type&2) && sd->sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
- if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_attack_support)
- pet_target_check(sd,bl,0);
- map_freeblock_unlock();
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ[ƒLƒƒƒXƒg
- sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
- else
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- else if(sd->attackabletime <= tick) {
- if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ[ƒLƒƒƒXƒg
- sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
- else
- sd->attackabletime = tick + (sd->aspd<<1);
- }
- if(sd->attackabletime <= tick) sd->attackabletime = tick + (battle_config.max_aspd<<1);
- }
-
- if(sd->state.attack_continue) {
- sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * UŒ‚—v‹
- * type‚ª1‚È‚çŒp‘±UŒ‚
- *------------------------------------------
- */
-int pc_attack(struct map_session_data *sd,int target_id,int type)
-{
- struct block_list *bl;
- int d;
-
- nullpo_retr(0, sd);
-
- bl=map_id2bl(target_id);
- if(bl==NULL)
- return 1;
-
- if(bl->type==BL_NPC) { // monster npcs [Valaris]
- npc_click(sd,RFIFOL(sd->fd,2));
- return 0;
- }
-
- if(!battle_check_target(&sd->bl,bl,BCT_ENEMY))
- return 1;
- if(sd->attacktimer != -1)
- pc_stopattack(sd);
- sd->attacktarget=target_id;
- sd->state.attack_continue=type;
-
- d=DIFF_TICK(sd->attackabletime,gettick());
- if(d>0 && d<2000){ // UŒ‚delay’†
- sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
- } else {
- // –{—ˆtimerŠÖ”‚Ȃ̂ňø”‚ð‡‚킹‚é
- pc_attack_timer(-1,gettick(),sd->bl.id,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * Œp‘±UŒ‚’âŽ~
- *------------------------------------------
- */
-int pc_stopattack(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->attacktimer != -1) {
- delete_timer(sd->attacktimer,pc_attack_timer);
- sd->attacktimer=-1;
- }
- sd->attacktarget=0;
- sd->state.attack_continue=0;
-
- return 0;
-}
-
-int pc_follow_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd, *bl;
-
- sd=map_id2sd(id);
- if(sd == NULL || sd->followtimer != tid)
- return 0;
-
- sd->followtimer=-1;
-
- do {
- if(sd->bl.prev == NULL)
- break;
-
- bl=(struct map_session_data *) map_id2bl(sd->followtarget);
-
- if(bl==NULL)
- return 0;
-
- if(bl->bl.prev == NULL)
- break;
-
- if(bl->bl.type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 0;
-
- if (sd->skilltimer == -1 && sd->attacktimer == -1 && sd->walktimer == -1) {
- if((sd->bl.m == bl->bl.m) && pc_can_reach(sd,bl->bl.x,bl->bl.y)) {
- if (distance(sd->bl.x,sd->bl.y,bl->bl.x,bl->bl.y) > 5)
- pc_walktoxy(sd,bl->bl.x,bl->bl.y);
- } else
- pc_setpos((struct map_session_data*)sd, bl->mapname, bl->bl.x, bl->bl.y, 3);
- }
- } while (0);
-
- sd->followtimer=add_timer(tick + sd->aspd,pc_follow_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pc_follow(struct map_session_data *sd,int target_id)
-{
- struct block_list *bl;
-
- bl=map_id2bl(target_id);
- if(bl==NULL)
- return 1;
- sd->followtarget=target_id;
- if(sd->followtimer != -1) {
- delete_timer(sd->followtimer,pc_follow_timer);
- sd->followtimer = -1;
- }
-
- pc_follow_timer(-1,gettick(),sd->bl.id,0);
-
- return 0;
-}
-
-int pc_checkbaselevelup(struct map_session_data *sd)
-{
- int next = pc_nextbaseexp(sd);
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_exp >= next && next > 0){
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
-
- // base‘¤ƒŒƒxƒ‹ƒAƒbƒvˆ—
- sd->status.base_exp -= next;
-
- sd->status.base_level ++;
- sd->status.status_point += (sd->status.base_level+14) / 5 ;
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_BASELEVEL);
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- pc_calcstatus(sd,0);
- pc_heal(sd,sd->status.max_hp,sd->status.max_sp);
-
- //ƒXƒpƒmƒr‚̓LƒŠƒGAƒCƒ€ƒ|Aƒ}ƒjƒsAƒOƒAƒTƒtƒ‰Lv1‚ª‚©‚©‚é
- if(s_class.job == 23){
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],1,0,0,0,skill_get_time(PR_KYRIE,1),0 );
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 );
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 );
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],1,0,0,0,skill_get_time(PR_GLORIA,1),0 );
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 );
- }
-
- clif_misceffect(&sd->bl,0);
- //ƒŒƒxƒ‹ƒAƒbƒv‚µ‚½‚̂Ńp[ƒeƒB[î•ñ‚ðXV‚·‚é
- //(Œö•½”͈̓`ƒFƒbƒN)
- party_send_movemap(sd);
- return 1;
- }
-
- return 0;
-}
-
-int pc_checkjoblevelup(struct map_session_data *sd)
-{
- int next = pc_nextjobexp(sd);
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_exp >= next && next > 0){
- // job‘¤ƒŒƒxƒ‹ƒAƒbƒvˆ—
- sd->status.job_exp -= next;
- sd->status.job_level ++;
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- sd->status.skill_point ++;
- clif_updatestatus(sd,SP_SKILLPOINT);
- pc_calcstatus(sd,0);
-
- clif_misceffect(&sd->bl,1);
- return 1;
- }
-
- return 0;
-}
-
-/*==========================================
- * ŒoŒ±’lŽæ“¾
- *------------------------------------------
- */
-int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp)
-{
- char output[256];
- nullpo_retr(0, sd);
-
- if(sd->bl.prev == NULL || pc_isdead(sd))
- return 0;
-
- if((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr]
- return 0; // no exp on pvp maps
-
- if(sd->sc_data[SC_RICHMANKIM].timer != -1) { // added bounds checking [Vaalris]
- base_exp += base_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
- job_exp += job_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
- }
-
- if(sd->status.guild_id>0){ // ƒMƒ‹ƒh‚Éã”[
- base_exp-=guild_payexp(sd,base_exp);
- if(base_exp < 0)
- base_exp = 0;
- }
-
- if(!battle_config.multi_level_up && pc_nextbaseafter(sd) && sd->status.base_exp+base_exp >= pc_nextbaseafter(sd)) {
- base_exp = pc_nextbaseafter(sd) - sd->status.base_exp;
- if (base_exp < 0)
- base_exp = 0;
- }
-
- sd->status.base_exp += base_exp;
- if(sd->status.base_exp < 0)
- sd->status.base_exp = 0;
-
- while(pc_checkbaselevelup(sd)) ;
-
- clif_updatestatus(sd,SP_BASEEXP);
- if(!battle_config.multi_level_up && pc_nextjobafter(sd) && sd->status.job_exp+job_exp >= pc_nextjobafter(sd)) {
- job_exp = pc_nextjobafter(sd) - sd->status.job_exp;
- if (job_exp < 0)
- job_exp = 0;
- }
-
- sd->status.job_exp += job_exp;
- if(sd->status.job_exp < 0)
- sd->status.job_exp = 0;
-
- while(pc_checkjoblevelup(sd)) ;
-
- clif_updatestatus(sd,SP_JOBEXP);
-
- if(battle_config.disp_experience){
- sprintf(output,
- "Experienced Gained Base:%d Job:%d",base_exp,job_exp);
- clif_disp_onlyself(sd,output,strlen(output));
- }
-
- return 0;
-}
-
-/*==========================================
- * base level‘¤•K—vŒoŒ±’lŒvŽZ
- *------------------------------------------
- */
-int pc_nextbaseexp(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
- return 0;
-
- if(sd->status.class==0) i=0;
- else if(sd->status.class<=6) i=1;
- else if(sd->status.class<=22) i=2;
- else if(sd->status.class==23) i=3;
- else if(sd->status.class==4001) i=4;
- else if(sd->status.class<=4007) i=5;
- else i=6;
-
- return exp_table[i][sd->status.base_level-1];
-}
-
-/*==========================================
- * job level‘¤•K—vŒoŒ±’lŒvŽZ
- *------------------------------------------
- */
-int pc_nextjobexp(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
- return 0;
-
- if(sd->status.class==0) i=7;
- else if(sd->status.class<=6) i=8;
- else if(sd->status.class<=22) i=9;
- else if(sd->status.class==23) i=10;
- else if(sd->status.class==4001) i=11;
- else if(sd->status.class<=4007) i=12;
- else i=13;
-
- return exp_table[i][sd->status.job_level-1];
-}
-
-/*==========================================
- * base level after next [Valaris]
- *------------------------------------------
- */
-int pc_nextbaseafter(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
- return 0;
-
- if(sd->status.class==0) i=0;
- else if(sd->status.class<=6) i=1;
- else if(sd->status.class<=22) i=2;
- else if(sd->status.class==23) i=3;
- else if(sd->status.class==4001) i=4;
- else if(sd->status.class<=4007) i=5;
- else i=6;
-
- return exp_table[i][sd->status.base_level];
-}
-
-/*==========================================
- * job level after next [Valaris]
- *------------------------------------------
- */
-int pc_nextjobafter(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
- return 0;
-
- if(sd->status.class==0) i=7;
- else if(sd->status.class<=6) i=8;
- else if(sd->status.class<=22) i=9;
- else if(sd->status.class==23) i=10;
- else if(sd->status.class==4001) i=11;
- else if(sd->status.class<=4007) i=12;
- else i=13;
-
- return exp_table[i][sd->status.job_level];
-}
-/*==========================================
-
- * •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgŒvŽZ
- *------------------------------------------
- */
-int pc_need_status_point(struct map_session_data *sd,int type)
-{
- int val;
-
- nullpo_retr(-1, sd);
-
- if(type<SP_STR || type>SP_LUK)
- return -1;
- val =
- type==SP_STR ? sd->status.str :
- type==SP_AGI ? sd->status.agi :
- type==SP_VIT ? sd->status.vit :
- type==SP_INT ? sd->status.int_:
- type==SP_DEX ? sd->status.dex : sd->status.luk;
-
- return (val+9)/10+1;
-}
-
-/*==========================================
- * ”\—Í’l¬’·
- *------------------------------------------
- */
-int pc_statusup(struct map_session_data *sd,int type)
-{
- int need,val = 0;
-
- nullpo_retr(0, sd);
-
- need=pc_need_status_point(sd,type);
- if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- switch(type){
- case SP_STR:
- if(sd->status.str >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.str;
- break;
- case SP_AGI:
- if(sd->status.agi >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.agi;
- break;
- case SP_VIT:
- if(sd->status.vit >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.vit;
- break;
- case SP_INT:
- if(sd->status.int_ >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.int_;
- break;
- case SP_DEX:
- if(sd->status.dex >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.dex;
- break;
- case SP_LUK:
- if(sd->status.luk >= battle_config.max_parameter) {
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- val= ++sd->status.luk;
- break;
- }
- sd->status.status_point-=need;
- if(need!=pc_need_status_point(sd,type)){
- clif_updatestatus(sd,type-SP_STR+SP_USTR);
- }
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,type);
- pc_calcstatus(sd,0);
- clif_statusupack(sd,type,1,val);
-
- return 0;
-}
-
-/*==========================================
- * ”\—Í’l¬’·
- *------------------------------------------
- */
-int pc_statusup2(struct map_session_data *sd,int type,int val)
-{
- nullpo_retr(0, sd);
-
- if(type<SP_STR || type>SP_LUK){
- clif_statusupack(sd,type,0,0);
- return 1;
- }
- switch(type){
- case SP_STR:
- if(sd->status.str + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.str + val < 1)
- val = 1;
- else
- val += sd->status.str;
- sd->status.str = val;
- break;
- case SP_AGI:
- if(sd->status.agi + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.agi + val < 1)
- val = 1;
- else
- val += sd->status.agi;
- sd->status.agi = val;
- break;
- case SP_VIT:
- if(sd->status.vit + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.vit + val < 1)
- val = 1;
- else
- val += sd->status.vit;
- sd->status.vit = val;
- break;
- case SP_INT:
- if(sd->status.int_ + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.int_ + val < 1)
- val = 1;
- else
- val += sd->status.int_;
- sd->status.int_ = val;
- break;
- case SP_DEX:
- if(sd->status.dex + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.dex + val < 1)
- val = 1;
- else
- val += sd->status.dex;
- sd->status.dex = val;
- break;
- case SP_LUK:
- if(sd->status.luk + val >= battle_config.max_parameter)
- val = battle_config.max_parameter;
- else if(sd->status.luk + val < 1)
- val = 1;
- else
- val = sd->status.luk + val;
- sd->status.luk = val;
- break;
- }
- clif_updatestatus(sd,type-SP_STR+SP_USTR);
- clif_updatestatus(sd,type);
- pc_calcstatus(sd,0);
- clif_statusupack(sd,type,1,val);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
- *------------------------------------------
- */
-int pc_skillup(struct map_session_data *sd,int skill_num)
-{
- nullpo_retr(0, sd);
-
- if( skill_num>=10000 ){
- guild_skillup(sd,skill_num,0);
- return 0;
- }
-
- if( sd->status.skill_point>0 &&
- sd->status.skill[skill_num].id!=0 &&
- sd->status.skill[skill_num].lv < skill_get_max(skill_num) )
- {
- sd->status.skill[skill_num].lv++;
- sd->status.skill_point--;
- pc_calcstatus(sd,0);
- clif_skillup(sd,skill_num);
- clif_updatestatus(sd,SP_SKILLPOINT);
- clif_skillinfoblock(sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * /allskill
- *------------------------------------------
- */
-int pc_allskillup(struct map_session_data *sd)
-{
- int i,id;
- int c=0, s=0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class);
- c = s_class.job;
- s = (s_class.upper==1) ? 1 : 0 ; //“]¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
-
- for(i=0;i<MAX_SKILL;i++){
- sd->status.skill[i].id=0;
- if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
- sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{“–‚Ìlv‚É
- sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
- }
- }
-
- if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
- // ‘S‚ẴXƒLƒ‹
- for(i=1;i<158;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- for(i=210;i<291;i++)
- sd->status.skill[i].lv=skill_get_max(i);
- for(i=304;i<MAX_SKILL;i++){
- if(i==331) continue;
- sd->status.skill[i].lv=skill_get_max(i);
- }
- }
- else {
- for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
- if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) )
- sd->status.skill[id].lv=skill_get_max(id);
- }
- }
- pc_calcstatus(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * /resetlvl
- *------------------------------------------
- */
-int pc_resetlvl(struct map_session_data* sd,int type)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- sd->status.skill[i].lv = 0;
- }
-
- if(type == 1){
- sd->status.skill_point=0;
- sd->status.base_level=1;
- sd->status.job_level=1;
- sd->status.base_exp=sd->status.base_exp=0;
- sd->status.job_exp=sd->status.job_exp=0;
- if(sd->status.option !=0)
- sd->status.option = 0;
-
- sd->status.str=1;
- sd->status.agi=1;
- sd->status.vit=1;
- sd->status.int_=1;
- sd->status.dex=1;
- sd->status.luk=1;
- if(sd->status.class == 4001)
- sd->status.status_point=88;
- }
-
- if(type == 2){
- sd->status.skill_point=0;
- sd->status.base_level=1;
- sd->status.job_level=1;
- sd->status.base_exp=0;
- sd->status.job_exp=0;
- }
- if(type == 3){
- sd->status.base_level=1;
- sd->status.base_exp=0;
- }
- if(type == 4){
- sd->status.job_level=1;
- sd->status.job_exp=0;
- }
-
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
- clif_updatestatus(sd,SP_BASELEVEL);
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_STATUSPOINT);
- clif_updatestatus(sd,SP_NEXTBASEEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
- clif_updatestatus(sd,SP_SKILLPOINT);
-
- clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus(sd,SP_UAGI);
- clif_updatestatus(sd,SP_UVIT);
- clif_updatestatus(sd,SP_UINT);
- clif_updatestatus(sd,SP_UDEX);
- clif_updatestatus(sd,SP_ULUK); // End Addition
-
- for(i=0;i<11;i++) { // unequip items that can't be equipped by base 1 [Valaris]
- if(sd->equip_index[i] >= 0)
- if(!pc_isequip(sd,sd->equip_index[i]))
- pc_unequipitem(sd,sd->equip_index[i],1);
- }
-
- clif_skillinfoblock(sd);
- pc_calcstatus(sd,0);
-
- return 0;
-}
-/*==========================================
- * /resetstate
- *------------------------------------------
- */
-int pc_resetstate(struct map_session_data* sd)
-{
- #define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2)
-// int add=0; // Removed by Dexity
-
- nullpo_retr(0, sd);
-
-// New statpoint table used here - Dexity
- sd->status.status_point = atoi (statp[sd->status.base_level - 1]);
- if(sd->status.class >= 4001 && sd->status.class <= 4024)
- sd->status.status_point+=40;
-// End addition
-
-// Removed by Dexity - old count
-// add += sumsp(sd->status.str);
-// add += sumsp(sd->status.agi);
-// add += sumsp(sd->status.vit);
-// add += sumsp(sd->status.int_);
-// add += sumsp(sd->status.dex);
-// add += sumsp(sd->status.luk);
-// sd->status.status_point+=add;
-
- clif_updatestatus(sd,SP_STATUSPOINT);
-
- sd->status.str=1;
- sd->status.agi=1;
- sd->status.vit=1;
- sd->status.int_=1;
- sd->status.dex=1;
- sd->status.luk=1;
-
- clif_updatestatus(sd,SP_STR);
- clif_updatestatus(sd,SP_AGI);
- clif_updatestatus(sd,SP_VIT);
- clif_updatestatus(sd,SP_INT);
- clif_updatestatus(sd,SP_DEX);
- clif_updatestatus(sd,SP_LUK);
-
- clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
- clif_updatestatus(sd,SP_UAGI);
- clif_updatestatus(sd,SP_UVIT);
- clif_updatestatus(sd,SP_UINT);
- clif_updatestatus(sd,SP_UDEX);
- clif_updatestatus(sd,SP_ULUK); // End Addition
-
- pc_calcstatus(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * /resetskill
- *------------------------------------------
- */
-int pc_resetskill(struct map_session_data* sd)
-{
- int i,skill;
-
- nullpo_retr(0, sd);
-
- for(i=1;i<MAX_SKILL;i++){
- if( (skill = pc_checkskill(sd,i)) > 0) {
- if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
- if(!sd->status.skill[i].flag)
- sd->status.skill_point += skill;
- else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
- sd->status.skill_point += (sd->status.skill[i].flag - 2);
- }
- sd->status.skill[i].lv = 0;
- }
- else if(battle_config.quest_skill_reset)
- sd->status.skill[i].lv = 0;
- sd->status.skill[i].flag = 0;
- }
- else
- sd->status.skill[i].lv = 0;
- }
- clif_updatestatus(sd,SP_SKILLPOINT);
- clif_skillinfoblock(sd);
- pc_calcstatus(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * pc‚Ƀ_ƒ[ƒW‚ð—^‚¦‚é
- *------------------------------------------
- */
-int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
-{
- int i=0,j=0;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- s_class = pc_calc_base_job(sd->status.class);
- // Šù‚ÉŽ€‚ñ‚Å‚¢‚½‚ç–³Œø
- if(pc_isdead(sd))
- return 0;
- // À‚Á‚Ä‚½‚ç—§‚¿ã‚ª‚é
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
-
- // •à ‚¢‚Ä‚¢‚½‚ç‘«‚ðŽ~‚ß‚é
- if(sd->sc_data[SC_ENDURE].timer == -1 && !sd->special_state.infinite_endure)
- pc_stop_walking(sd,3);
- else if(sd->sc_data[SC_ENDURE].timer != -1 && src->type==BL_MOB) // [Celest]
- if((--sd->sc_data[SC_ENDURE].val2) <= 0)
- skill_status_change_end(&sd->bl, SC_ENDURE, -1);
- // ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†’f
- if(damage > sd->status.max_hp>>2)
- skill_stop_dancing(&sd->bl,0);
-
- sd->status.hp-=damage;
- if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_damage_support)
- pet_target_check(sd,src,1);
-
- if (sd->sc_data[SC_TRICKDEAD].timer != -1)
- skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1);
- if(sd->status.option&2)
- skill_status_change_end(&sd->bl, SC_HIDING, -1);
- if(sd->status.option&4)
- skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
- if(sd->status.option&16386)
- skill_status_change_end(&sd->bl, SC_CHASEWALK, -1);
-
- if(sd->status.hp>0){
- // ‚Ü‚¾¶‚«‚Ä‚¢‚é‚È‚çHPXV
- clif_updatestatus(sd,SP_HP);
-
- if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
- (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
- // ƒI[ƒgƒo[ƒT[ƒN”­“®
- skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
-
- sd->canlog_tick = gettick();
-
- if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL) clif_party_hp(p,sd);
- } // end addition [Valaris]
-
- return 0;
- }
- sd->status.hp = 0;
- pc_setdead(sd);
- if(sd->vender_id)
- vending_closevending(sd);
-
- if(sd->status.pet_id > 0 && sd->pd) {
- if(sd->petDB) {
- sd->pet.intimate -= sd->petDB->die;
- if(sd->pet.intimate < 0)
- sd->pet.intimate = 0;
- clif_send_petdata(sd,1,sd->pet.intimate);
- }
- }
-
- pc_stop_walking(sd,0);
- skill_castcancel(&sd->bl,0); // ‰r¥‚Ì’†Ž~
- clif_clearchar_area(&sd->bl,1);
- skill_unit_out_all(&sd->bl,gettick(),1);
- if(sd->sc_data[SC_BLADESTOP].timer!=-1)//”’n‚ÍŽ–‘O‚ɉðœ
- skill_status_change_end(&sd->bl,SC_BLADESTOP,-1);
- pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter); //Ž€‚ɃJƒEƒ“ƒ^[‘‚«ž‚Ý
- skill_status_change_clear(&sd->bl,0); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
- clif_updatestatus(sd,SP_HP);
- pc_calcstatus(sd,0);
-
- for(i=0;i<5;i++)
- if(sd->dev.val1[i]){
- skill_status_change_end(&map_id2sd(sd->dev.val1[i])->bl,SC_DEVOTION,-1);
- sd->dev.val1[i] = sd->dev.val2[i]=0;
- }
-
- if(battle_config.death_penalty_type>0) { // changed penalty options, added death by player if pk_mode [Valaris]
- if(sd->status.class != 0 && !map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg){ // only novices will recieve no penalty
- if(battle_config.death_penalty_type==1 && battle_config.death_penalty_base > 0)
- sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000;
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000;
- else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_base > 0) {
- if(pc_nextbaseexp(sd) > 0)
- sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000;
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000;
- }
- if(sd->status.base_exp < 0)
- sd->status.base_exp = 0;
- clif_updatestatus(sd,SP_BASEEXP);
-
- if(battle_config.death_penalty_type==1 && battle_config.death_penalty_job > 0)
- sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000;
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000;
- else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_job > 0) {
- if(pc_nextjobexp(sd) > 0)
- sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000;
- if(battle_config.pk_mode && src && src->type==BL_PC)
- sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000;
- }
- if(sd->status.job_exp < 0)
- sd->status.job_exp = 0;
- clif_updatestatus(sd,SP_JOBEXP);
- }
- }
- //ƒiƒCƒgƒƒAƒ‚[ƒhƒAƒCƒeƒ€ƒhƒƒbƒv
- if(map[sd->bl.m].flag.pvp_nightmaredrop){ // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker]
- for(j=0;j<MAX_DROP_PER_MAP;j++){
- int id = map[sd->bl.m].drop_list[j].drop_id;
- int type = map[sd->bl.m].drop_list[j].drop_type;
- int per = map[sd->bl.m].drop_list[j].drop_per;
- if(id == 0)
- continue;
- if(id == -1){//ƒ‰ƒ“ƒ_ƒ€ƒhƒƒbƒv
- int eq_num=0,eq_n[MAX_INVENTORY];
- memset(eq_n,0,sizeof(eq_n));
- //悸‘•”õ‚µ‚Ä‚¢‚éƒAƒCƒeƒ€”‚ðƒJƒEƒ“ƒg
- for(i=0;i<MAX_INVENTORY;i++){
- int k;
- if( (type == 1 && !sd->status.inventory[i].equip)
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3){
- //InventoryIndex‚ðŠi”[
- for(k=0;k<MAX_INVENTORY;k++){
- if(eq_n[k] <= 0){
- eq_n[k]=i;
- break;
- }
- }
- eq_num++;
- }
- }
- if(eq_num > 0){
- int n = eq_n[rand()%eq_num];//ŠY“–ƒAƒCƒeƒ€‚Ì’†‚©‚烉ƒ“ƒ_ƒ€
- if(rand()%10000 < per){
- if(sd->status.inventory[n].equip)
- pc_unequipitem(sd,n,0);
- pc_dropitem(sd,n,1);
- }
- }
- }
- else if(id > 0){
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid == id//ItemID‚ªˆê’v‚µ‚Ä‚¢‚Ä
- && rand()%10000 < per//ƒhƒƒbƒv—¦”»’è‚àOK‚Å
- && ((type == 1 && !sd->status.inventory[i].equip)//ƒ^ƒCƒv”»’è‚àOK‚È‚çƒhƒƒbƒv
- || (type == 2 && sd->status.inventory[i].equip)
- || type == 3) ){
- if(sd->status.inventory[i].equip)
- pc_unequipitem(sd,i,0);
- pc_dropitem(sd,i,1);
- break;
- }
- }
- }
- }
- }
- // pvp
- if( map[sd->bl.m].flag.pvp && !battle_config.pk_mode){ // disable certain pvp functions on pk_mode [Valaris]
- //ƒ‰ƒ“ƒLƒ“ƒOŒvŽZ
- if(!map[sd->bl.m].flag.pvp_nocalcrank){
- sd->pvp_point-=5;
- if(src && src->type==BL_PC )
- ((struct map_session_data *)src)->pvp_point++;
- //} //fixed wrong '{' placement by Lupus
- pc_setdead(sd);
- }
- // ‹­§‘—ŠÒ
- if( sd->pvp_point < 0 ){
- sd->pvp_point=0;
- pc_setstand(sd);
- pc_setrestartvalue(sd,3);
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
- }
- }
- //GvG
- if(map[sd->bl.m].flag.gvg){
- pc_setstand(sd);
- pc_setrestartvalue(sd,3);
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
- }
-
- return 0;
-}
-
-//
-// scriptŠÖ ˜A
-//
-/*==========================================
- * script—pPCƒXƒe[ƒ^ƒX“Ç‚Ýo‚µ
- *------------------------------------------
- */
-int pc_readparam(struct map_session_data *sd,int type)
-{
- int val=0;
- struct pc_base_job s_class;
-
- s_class = pc_calc_base_job(sd->status.class);
-
- nullpo_retr(0, sd);
-
- switch(type){
- case SP_SKILLPOINT:
- val= sd->status.skill_point;
- break;
- case SP_STATUSPOINT:
- val= sd->status.status_point;
- break;
- case SP_ZENY:
- val= sd->status.zeny;
- break;
- case SP_BASELEVEL:
- val= sd->status.base_level;
- break;
- case SP_JOBLEVEL:
- val= sd->status.job_level;
- break;
- case SP_CLASS:
- if(val>=24 && val < 45)
- val+=3978;
- else
- val= sd->status.class;
- break;
- case SP_UPPER:
- val= s_class.upper;
- break;
- case SP_SEX:
- val= sd->sex;
- break;
- case SP_WEIGHT:
- val= sd->weight;
- break;
- case SP_MAXWEIGHT:
- val= sd->max_weight;
- break;
- case SP_BASEEXP:
- val= sd->status.base_exp;
- break;
- case SP_JOBEXP:
- val= sd->status.job_exp;
- break;
- case SP_NEXTBASEEXP:
- val= pc_nextbaseexp(sd);
- break;
- case SP_NEXTJOBEXP:
- val= pc_nextjobexp(sd);
- break;
- case SP_HP:
- val= sd->status.hp;
- break;
- case SP_MAXHP:
- val= sd->status.max_hp;
- break;
- case SP_SP:
- val= sd->status.sp;
- break;
- case SP_MAXSP:
- val= sd->status.max_sp;
- break;
- case SP_STR:
- val= sd->status.str;
- break;
- case SP_AGI:
- val= sd->status.agi;
- break;
- case SP_VIT:
- val= sd->status.vit;
- break;
- case SP_INT:
- val= sd->status.int_;
- break;
- case SP_DEX:
- val= sd->status.dex;
- break;
- case SP_LUK:
- val= sd->status.luk;
- break;
- case SP_FAME:
- val= sd->fame;
- break;
- }
-
- return val;
-}
-
-/*==========================================
- * script—pPCƒXƒe[ƒ^ƒXÝ’è
- *------------------------------------------
- */
-int pc_setparam(struct map_session_data *sd,int type,int val)
-{
- int i = 0,up_level = 50;
- struct pc_base_job s_class;
-
- nullpo_retr(0, sd);
-
- s_class = pc_calc_base_job(sd->status.class);
-
- switch(type){
- case SP_BASELEVEL:
- if (val > sd->status.base_level) {
- for (i = 1; i <= (val - sd->status.base_level); i++)
- sd->status.status_point += (sd->status.base_level + i + 14) / 5 ;
- }
- sd->status.base_level = val;
- sd->status.base_exp = 0;
- clif_updatestatus(sd, SP_BASELEVEL);
- clif_updatestatus(sd, SP_NEXTBASEEXP);
- clif_updatestatus(sd, SP_STATUSPOINT);
- clif_updatestatus(sd, SP_BASEEXP);
- pc_calcstatus(sd, 0);
- pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
- break;
- case SP_JOBLEVEL:
- if (sd->status.class == 0)
- up_level -= 40;
- if ((sd->status.class == 23) || (sd->status.class >= 4001 && sd->status.class <= 4022))
- up_level += 20;
- if (val >= sd->status.job_level) {
- if (val > up_level)val = up_level;
- sd->status.skill_point += (val-sd->status.job_level);
- sd->status.job_level = val;
- sd->status.job_exp = 0;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- clif_updatestatus(sd, SP_JOBEXP);
- clif_updatestatus(sd, SP_SKILLPOINT);
- pc_calcstatus(sd, 0);
- clif_misceffect(&sd->bl, 1);
- } else {
- sd->status.job_level = val;
- sd->status.job_exp = 0;
- clif_updatestatus(sd, SP_JOBLEVEL);
- clif_updatestatus(sd, SP_NEXTJOBEXP);
- clif_updatestatus(sd, SP_JOBEXP);
- pc_calcstatus(sd, 0);
- }
- clif_updatestatus(sd,type);
- break;
- case SP_SKILLPOINT:
- sd->status.skill_point = val;
- break;
- case SP_STATUSPOINT:
- sd->status.status_point = val;
- break;
- case SP_ZENY:
- sd->status.zeny = val;
- break;
- case SP_BASEEXP:
- if(pc_nextbaseexp(sd) > 0) {
- sd->status.base_exp = val;
- if(sd->status.base_exp < 0)
- sd->status.base_exp=0;
- pc_checkbaselevelup(sd);
- }
- break;
- case SP_JOBEXP:
- if(pc_nextjobexp(sd) > 0) {
- sd->status.job_exp = val;
- if(sd->status.job_exp < 0)
- sd->status.job_exp=0;
- pc_checkjoblevelup(sd);
- }
- break;
- case SP_SEX:
- sd->sex = val;
- break;
- case SP_WEIGHT:
- sd->weight = val;
- break;
- case SP_MAXWEIGHT:
- sd->max_weight = val;
- break;
- case SP_HP:
- sd->status.hp = val;
- break;
- case SP_MAXHP:
- sd->status.max_hp = val;
- break;
- case SP_SP:
- sd->status.sp = val;
- break;
- case SP_MAXSP:
- sd->status.max_sp = val;
- break;
- case SP_STR:
- sd->status.str = val;
- break;
- case SP_AGI:
- sd->status.agi = val;
- break;
- case SP_VIT:
- sd->status.vit = val;
- break;
- case SP_INT:
- sd->status.int_ = val;
- break;
- case SP_DEX:
- sd->status.dex = val;
- break;
- case SP_LUK:
- sd->status.luk = val;
- break;
- case SP_FAME:
- sd->fame = val;
- break;
- }
- clif_updatestatus(sd,type);
-
- return 0;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_heal(struct map_session_data *sd,int hp,int sp)
-{
-// if(battle_config.battle_log)
-// printf("heal %d %d\n",hp,sp);
-
- nullpo_retr(0, sd);
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
-
- if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
- return 0;
-
- if(hp+sd->status.hp>sd->status.max_hp)
- hp=sd->status.max_hp-sd->status.hp;
- if(sp+sd->status.sp>sd->status.max_sp)
- sp=sd->status.max_sp-sd->status.sp;
- sd->status.hp+=hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- sd->status.sp+=sp;
- if(sd->status.sp <= 0)
- sd->status.sp = 0;
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
- struct party *p=party_search(sd->status.party_id);
- if(p!=NULL) clif_party_hp(p,sd);
- } // end addition [Valaris]
-
- return hp + sp;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_itemheal(struct map_session_data *sd,int hp,int sp)
-{
- int bonus;
-// if(battle_config.battle_log)
-// printf("heal %d %d\n",hp,sp);
-
- nullpo_retr(0, sd);
-
- if(sd->sc_data && sd->sc_data[SC_GOSPEL].timer!=-1) //ƒo[ƒT[ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
- return 0;
-
- if(sd->state.potionpitcher_flag) {
- sd->potion_hp = hp;
- sd->potion_sp = sp;
- return 0;
- }
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
- if(hp > 0) {
- bonus = (sd->paramc[2]<<1) + 100 + pc_checkskill(sd,SM_RECOVERY)*10;
- if(bonus != 100)
- hp = hp * bonus / 100;
- bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
- if(bonus != 100)
- hp = hp * bonus / 100;
- }
- if(sp > 0) {
- bonus = (sd->paramc[3]<<1) + 100 + pc_checkskill(sd,MG_SRECOVERY)*10;
- if(bonus != 100)
- sp = sp * bonus / 100;
- bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
- if(bonus != 100)
- sp = sp * bonus / 100;
- }
- if(hp+sd->status.hp>sd->status.max_hp)
- hp=sd->status.max_hp-sd->status.hp;
- if(sp+sd->status.sp>sd->status.max_sp)
- sp=sd->status.max_sp-sd->status.sp;
- sd->status.hp+=hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- sd->status.sp+=sp;
- if(sd->status.sp <= 0)
- sd->status.sp = 0;
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- return 0;
-}
-
-/*==========================================
- * HP/SP‰ñ•œ
- *------------------------------------------
- */
-int pc_percentheal(struct map_session_data *sd,int hp,int sp)
-{
- nullpo_retr(0, sd);
-
- if(sd->state.potionpitcher_flag) {
- sd->potion_per_hp = hp;
- sd->potion_per_sp = sp;
- return 0;
- }
-
- if(pc_checkoverhp(sd)) {
- if(hp > 0)
- hp = 0;
- }
- if(pc_checkoversp(sd)) {
- if(sp > 0)
- sp = 0;
- }
- if(hp) {
- if(hp >= 100) {
- sd->status.hp = sd->status.max_hp;
- }
- else if(hp <= -100) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- }
- else {
- sd->status.hp += sd->status.max_hp*hp/100;
- if(sd->status.hp > sd->status.max_hp)
- sd->status.hp = sd->status.max_hp;
- if(sd->status.hp <= 0) {
- sd->status.hp = 0;
- pc_damage(NULL,sd,1);
- hp = 0;
- }
- }
- }
- if(sp) {
- if(sp >= 100) {
- sd->status.sp = sd->status.max_sp;
- }
- else if(sp <= -100) {
- sd->status.sp = 0;
- }
- else {
- sd->status.sp += sd->status.max_sp*sp/100;
- if(sd->status.sp > sd->status.max_sp)
- sd->status.sp = sd->status.max_sp;
- if(sd->status.sp < 0)
- sd->status.sp = 0;
- }
- }
- if(hp)
- clif_updatestatus(sd,SP_HP);
- if(sp)
- clif_updatestatus(sd,SP_SP);
-
- return 0;
-}
-
-/*==========================================
- * E•ÏX
- * ˆø” job E‹Æ 0`23
- * upper ’Êí 0, “]¶ 1, —{Žq 2, ‚»‚Ì‚Ü‚Ü -1
- *------------------------------------------
- */
-int pc_jobchange(struct map_session_data *sd,int job, int upper)
-{
- int i;
- int b_class = 0;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
-
- nullpo_retr(0, sd);
-
- if((job > 23) && (job < 68))
- job += 3977;
-
- if((job > 69) && (job < 4000))
- return 1;
-
- if(upper < 0) //Œ»Ý“]¶‚©‚Ç‚¤‚©‚ð”»’f‚·‚é
- upper = s_class.upper;
-
- if(upper == 0){ //’ÊíE‚È‚çjob‚»‚Ì‚Ü‚ñ‚Ü
- b_class = job;
- }else if(upper == 1){
- if(job == 23){ //“]¶‚ɃXƒpƒmƒr‚Í‘¶Ý‚µ‚È‚¢‚Ì‚Å‚¨’f‚è
- return 1;
- }else{
- b_class = job + 4001;
- }
- }else if(upper == 2){ //—{Žq‚ÉŒ‹¥‚Í‚È‚¢‚¯‚Ç‚Ç‚¤‚¹ŽŸ‚ÅR‚ç‚ê‚é‚©‚ç‚¢‚¢‚â
- b_class = (job==23)?job + 4022:job + 4023;
- }else{
- return 1;
- }
-
- if((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) ||
- (sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) ||
- job ==22 || sd->status.class == b_class) //Š‚̓o[ƒh‚É‚È‚ê‚È‚¢A‰‚̓_ƒ“ƒT[‚É‚È‚ê‚È‚¢AŒ‹¥ˆßÖ‚à‚¨’f‚è
- return 1;
-
- sd->status.class = sd->view_class = b_class;
-
- sd->status.job_level=1;
- sd->status.job_exp=0;
- clif_updatestatus(sd,SP_JOBLEVEL);
- clif_updatestatus(sd,SP_JOBEXP);
- clif_updatestatus(sd,SP_NEXTJOBEXP);
-
- for(i=0;i<11;i++) {
- if(sd->equip_index[i] >= 0)
- if(!pc_isequip(sd,sd->equip_index[i]))
- pc_unequipitem(sd,sd->equip_index[i],1); // ‘•”õŠO‚µ
- }
-
- clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris]
- if(sd->status.clothes_color > 0)
- clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
- if(battle_config.muting_players && sd->status.manner < 0)
- clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
-
- pc_calcstatus(sd,0);
- pc_checkallowskill(sd);
- pc_equiplookall(sd);
- clif_equiplist(sd);
-
- if(pc_isriding(sd)) { // remove peco status if changing into invalid class [Valaris]
- if(!(pc_checkskill(sd,KN_RIDING)))
- pc_setoption(sd,sd->status.option|-0x0000);
- if(pc_checkskill(sd,KN_RIDING)>0)
- pc_setriding(sd);
- }
-
- return 0;
-}
-
-/*==========================================
- * Œ©‚½–Ú•ÏX
- *------------------------------------------
- */
-int pc_equiplookall(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
-#if PACKETVER < 4
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
-#else
- clif_changelook(&sd->bl,LOOK_WEAPON,0);
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-#endif
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
-
- return 0;
-}
-
-/*==========================================
- * Œ©‚½–Ú•ÏX
- *------------------------------------------
- */
-int pc_changelook(struct map_session_data *sd,int type,int val)
-{
- nullpo_retr(0, sd);
-
- switch(type){
- case LOOK_HAIR:
- sd->status.hair=val;
- break;
- case LOOK_WEAPON:
- sd->status.weapon=val;
- break;
- case LOOK_HEAD_BOTTOM:
- sd->status.head_bottom=val;
- break;
- case LOOK_HEAD_TOP:
- sd->status.head_top=val;
- break;
- case LOOK_HEAD_MID:
- sd->status.head_mid=val;
- break;
- case LOOK_HAIR_COLOR:
- sd->status.hair_color=val;
- break;
- case LOOK_CLOTHES_COLOR:
- sd->status.clothes_color=val;
- break;
- case LOOK_SHIELD:
- sd->status.shield=val;
- break;
- case LOOK_SHOES:
- break;
- }
- clif_changelook(&sd->bl,type,val);
-
- return 0;
-}
-
-/*==========================================
- * •t‘®•i(‘é,ƒyƒR,ƒJ[ƒg)Ý’è
- *------------------------------------------
- */
-int pc_setoption(struct map_session_data *sd,int type)
-{
- nullpo_retr(0, sd);
-
- sd->status.option=type;
- clif_changeoption(&sd->bl);
- pc_calcstatus(sd,0);
-
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒgÝ’è
- *------------------------------------------
- */
-int pc_setcart(struct map_session_data *sd,int type)
-{
- int cart[6]={0x0000,0x0008,0x0080,0x0100,0x0200,0x0400};
-
- nullpo_retr(0, sd);
-
- if(pc_checkskill(sd,MC_PUSHCART)>0){ // ƒvƒbƒVƒ…ƒJ[ƒgƒXƒLƒ‹ŠŽ
- if(!pc_iscarton(sd)){ // ƒJ[ƒg‚ð•t‚¯‚Ä‚¢‚È‚¢
- pc_setoption(sd,cart[type]);
- clif_cart_itemlist(sd);
- clif_cart_equiplist(sd);
- clif_updatestatus(sd,SP_CARTINFO);
- clif_status_change(&sd->bl,0x0c,0);
- }
- else{
- pc_setoption(sd,cart[type]);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘éÝ’è
- *------------------------------------------
- */
-int pc_setfalcon(struct map_session_data *sd)
-{
- if(pc_checkskill(sd,HT_FALCON)>0){ // ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[ƒXƒLƒ‹ŠŽ
- pc_setoption(sd,sd->status.option|0x0010);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒyƒRƒyƒRÝ’è
- *------------------------------------------
- */
-int pc_setriding(struct map_session_data *sd)
-{
- if(sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
- clif_displaymessage(sd->fd, "Cannot mount a Peco while in disguise.");
- return 0;
- }
-
- if((pc_checkskill(sd,KN_RIDING)>0)){ // ƒ‰ƒCƒfƒBƒ“ƒOƒXƒLƒ‹ŠŽ
- pc_setoption(sd,sd->status.option|0x0020);
-
- if(sd->status.class==7)
- sd->status.class=sd->view_class=13;
-
- if(sd->status.class==14)
- sd->status.class=sd->view_class=21;
-
- if(sd->status.class==4008)
- sd->status.class=sd->view_class=4014;
-
- if(sd->status.class==4015)
- sd->status.class=sd->view_class=4022;
- }
-
- return 0;
-}
-
-/*==========================================
- * script—p•Ï”‚Ì’l‚ð“Ç‚Þ
- *------------------------------------------
- */
-int pc_readreg(struct map_session_data *sd,int reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->reg_num;i++)
- if(sd->reg[i].index==reg)
- return sd->reg[i].data;
-
- return 0;
-}
-/*==========================================
- * script—p•Ï”‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setreg(struct map_session_data *sd,int reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for (i = 0; i < sd->reg_num; i++) {
- if (sd->reg[i].index == reg){
- sd->reg[i].data = val;
- return 0;
- }
- }
- sd->reg_num++;
- sd->reg = realloc(sd->reg, sizeof(*(sd->reg)) * sd->reg_num);
- if (sd->reg == NULL){
- printf("out of memory : pc_setreg\n");
- exit(1);
- }
-/* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0,
- sizeof(*(sd->reg)));
-*/
- sd->reg[i].index = reg;
- sd->reg[i].data = val;
-
- return 0;
-}
-
-/*==========================================
- * script—p•¶Žš—ñ•Ï”‚Ì’l‚ð“Ç‚Þ
- *------------------------------------------
- */
-char *pc_readregstr(struct map_session_data *sd,int reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->regstr_num;i++)
- if(sd->regstr[i].index==reg)
- return sd->regstr[i].data;
-
- return NULL;
-}
-/*==========================================
- * script—p•¶Žš—ñ•Ï”‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setregstr(struct map_session_data *sd,int reg,char *str)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(strlen(str)+1 >= sizeof(sd->regstr[0].data)){
- printf("pc_setregstr: string too long !\n");
- return 0;
- }
-
- for(i=0;i<sd->regstr_num;i++)
- if(sd->regstr[i].index==reg){
- strcpy(sd->regstr[i].data,str);
- return 0;
- }
- sd->regstr_num++;
- sd->regstr = realloc(sd->regstr, sizeof(sd->regstr[0]) * sd->regstr_num);
- if(sd->regstr==NULL){
- printf("out of memory : pc_setreg\n");
- exit(1);
- }
-/* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0,
- sizeof(*(sd->reg)));
-*/
- sd->regstr[i].index=reg;
- strcpy(sd->regstr[i].data,str);
-
- return 0;
-}
-
-/*==========================================
- * script—pƒOƒ[ƒoƒ‹•Ï”‚Ì’l‚ð“Ç‚Þ
- *------------------------------------------
- */
-int pc_readglobalreg(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0)
- return sd->status.global_reg[i].value;
- }
-
- return 0;
-}
-
-/*==========================================
- * script—pƒOƒ[ƒoƒ‹•Ï”‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setglobalreg(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- //PC_DIE_COUNTER‚ªƒXƒNƒŠƒvƒg‚È‚Ç‚Å•ÏX‚³‚ꂽŽž‚̈—
- if(strcmp(reg,"PC_DIE_COUNTER") == 0 && sd->die_counter != val){
- sd->die_counter = val;
- pc_calcstatus(sd,0);
- }
- if(val==0){
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0){
- sd->status.global_reg[i]=sd->status.global_reg[sd->status.global_reg_num-1];
- sd->status.global_reg_num--;
- break;
- }
- }
- return 0;
- }
- for(i=0;i<sd->status.global_reg_num;i++){
- if(strcmp(sd->status.global_reg[i].str,reg)==0){
- sd->status.global_reg[i].value=val;
- return 0;
- }
- }
- if(sd->status.global_reg_num<GLOBAL_REG_NUM){
- strcpy(sd->status.global_reg[i].str,reg);
- sd->status.global_reg[i].value=val;
- sd->status.global_reg_num++;
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n", reg, GLOBAL_REG_NUM);
-
- return 1;
-}
-
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg•Ï”‚Ì’l‚ð“Ç‚Þ
- *------------------------------------------
- */
-int pc_readaccountreg(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0)
- return sd->status.account_reg[i].value;
- }
-
- return 0;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg•Ï”‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setaccountreg(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- if(val==0){
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0){
- sd->status.account_reg[i]=sd->status.account_reg[sd->status.account_reg_num-1];
- sd->status.account_reg_num--;
- break;
- }
- }
- intif_saveaccountreg(sd);
- return 0;
- }
- for(i=0;i<sd->status.account_reg_num;i++){
- if(strcmp(sd->status.account_reg[i].str,reg)==0){
- sd->status.account_reg[i].value=val;
- intif_saveaccountreg(sd);
- return 0;
- }
- }
- if(sd->status.account_reg_num<ACCOUNT_REG_NUM){
- strcpy(sd->status.account_reg[i].str,reg);
- sd->status.account_reg[i].value=val;
- sd->status.account_reg_num++;
- intif_saveaccountreg(sd);
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n", reg, ACCOUNT_REG_NUM);
-
- return 1;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg•Ï”2‚Ì’l‚ð“Ç‚Þ
- *------------------------------------------
- */
-int pc_readaccountreg2(struct map_session_data *sd,char *reg)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0)
- return sd->status.account_reg2[i].value;
- }
-
- return 0;
-}
-/*==========================================
- * script—pƒAƒJƒEƒ“ƒg•Ï”2‚Ì’l‚ðÝ’è
- *------------------------------------------
- */
-int pc_setaccountreg2(struct map_session_data *sd,char *reg,int val)
-{
- int i;
-
- nullpo_retr(1, sd);
-
- if(val==0){
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0){
- sd->status.account_reg2[i]=sd->status.account_reg2[sd->status.account_reg2_num-1];
- sd->status.account_reg2_num--;
- break;
- }
- }
- chrif_saveaccountreg2(sd);
- return 0;
- }
- for(i=0;i<sd->status.account_reg2_num;i++){
- if(strcmp(sd->status.account_reg2[i].str,reg)==0){
- sd->status.account_reg2[i].value=val;
- chrif_saveaccountreg2(sd);
- return 0;
- }
- }
- if(sd->status.account_reg2_num<ACCOUNT_REG2_NUM){
- strcpy(sd->status.account_reg2[i].str,reg);
- sd->status.account_reg2[i].value=val;
- sd->status.account_reg2_num++;
- chrif_saveaccountreg2(sd);
- return 0;
- }
- if(battle_config.error_log)
- printf("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n", reg, ACCOUNT_REG2_NUM);
-
- return 1;
-}
-/*==========================================
- * ¸˜B¬Œ÷—¦
- *------------------------------------------
- */
-int pc_percentrefinery(struct map_session_data *sd,struct item *item)
-{
- int percent;
-
- nullpo_retr(0, item);
- percent=percentrefinery[itemdb_wlv(item->nameid)][(int)item->refine];
-
- percent += pc_checkskill(sd,BS_WEAPONRESEARCH); // •ŠíŒ¤‹†ƒXƒLƒ‹ŠŽ
-
- // Šm—¦‚Ì—LŒø”͈̓`ƒFƒbƒN
- if( percent > 100 ){
- percent = 100;
- }
- if( percent < 0 ){
- percent = 0;
- }
-
- return percent;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[ˆ—
- *------------------------------------------
- */
-int pc_eventtimer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=map_id2sd(id);
- int i;
- if(sd==NULL)
- return 0;
-
- for(i=0;i<MAX_EVENTTIMER;i++){
- if( sd->eventtimer[i]==tid ){
- sd->eventtimer[i]=-1;
- npc_event(sd,(const char *)data,0);
- break;
- }
- }
- free((void *)data);
- if(i==MAX_EVENTTIMER) {
- if(battle_config.error_log)
- printf("pc_eventtimer: no such event timer\n");
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[’ljÁ
- *------------------------------------------
- */
-int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]==-1 )
- break;
- if(i<MAX_EVENTTIMER){
- char *evname=(char *)aCalloc(24,sizeof(char));
- memcpy(evname,name,24);
- sd->eventtimer[i]=add_timer(gettick()+tick,
- pc_eventtimer,sd->bl.id,(int)evname);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[íœ
- *------------------------------------------
- */
-int pc_deleventtimer(struct map_session_data *sd,const char *name)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 && strcmp(
- (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){
- delete_timer(sd->eventtimer[i],pc_eventtimer);
- sd->eventtimer[i]=-1;
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[ƒJƒEƒ“ƒg’l’ljÁ
- *------------------------------------------
- */
-int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 && strcmp(
- (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){
- addtick_timer(sd->eventtimer[i],tick);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[‘Síœ
- *------------------------------------------
- */
-int pc_cleareventtimer(struct map_session_data *sd)
-{
- int i;
-
- nullpo_retr(0, sd);
-
- for(i=0;i<MAX_EVENTTIMER;i++)
- if( sd->eventtimer[i]!=-1 ){
- delete_timer(sd->eventtimer[i],pc_eventtimer);
- sd->eventtimer[i]=-1;
- }
-
- return 0;
-}
-
-//
-// ‘• ”õ•¨
-//
-/*==========================================
- * ƒAƒCƒeƒ€‚ð‘•”õ‚·‚é
- *------------------------------------------
- */
-int pc_equipitem(struct map_session_data *sd,int n,int pos)
-{
- int i,nameid, arrow;
- struct item_data *id;
- //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
-
- nullpo_retr(0, sd);
-
- nameid = sd->status.inventory[n].nameid;
- id = sd->inventory_data[n];
- pos = pc_equippoint(sd,n);
- if(battle_config.battle_log)
- printf("equip %d(%d) %x:%x\n",nameid,n,id->equip,pos);
- if(!pc_isequip(sd,n) || !pos || sd->status.inventory[n].attribute==1 ) { // [Valaris]
- clif_equipitemack(sd,n,0,0); // fail
- return 0;
- }
-
-// -- moonsoul (if player is berserk then cannot equip)
-//
- if(sd->sc_data[SC_BERSERK].timer!=-1){
- clif_equipitemack(sd,n,0,0); // fail
- return 0;
- }
-
- if(pos==0x88){ // ƒAƒNƒZƒTƒŠ—p—áŠOˆ—
- int epor=0;
- if(sd->equip_index[0] >= 0)
- epor |= sd->status.inventory[sd->equip_index[0]].equip;
- if(sd->equip_index[1] >= 0)
- epor |= sd->status.inventory[sd->equip_index[1]].equip;
- epor &= 0x88;
- pos = epor == 0x08 ? 0x80 : 0x08;
- }
-
- // “ñ“—¬ˆ—
- if ((pos==0x22) // ˆê‰žA‘•”õ—v‹‰ÓŠ‚ª“ñ“—¬•Ší‚©ƒ`ƒFƒbƒN‚·‚é
- && (id->equip==2) // ’P Žè•Ší
- && (pc_checkskill(sd, AS_LEFT) > 0 || sd->status.class == 12) ) // ¶ŽèC˜B—L
- {
- int tpos=0;
- if(sd->equip_index[8] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[8]].equip;
- if(sd->equip_index[9] >= 0)
- tpos |= sd->status.inventory[sd->equip_index[9]].equip;
- tpos &= 0x02;
- pos = tpos == 0x02 ? 0x20 : 0x02;
- }
-
- arrow=pc_search_inventory(sd,pc_checkequip(sd,9)); // Added by RoVeRT
- for(i=0;i<11;i++) {
- if(sd->equip_index[i] >= 0 && sd->status.inventory[sd->equip_index[i]].equip&pos) {
- pc_unequipitem(sd,sd->equip_index[i],1);
- }
- }
- // ‹|–î‘•”õ
- if(pos==0x8000){
- clif_arrowequip(sd,n);
- clif_arrow_fail(sd,3); // 3=–‘•”õ‚Å‚«‚Ü‚µ‚½
- }
- else
- clif_equipitemack(sd,n,pos,1);
-
- for(i=0;i<11;i++) {
- if(pos & equip_pos[i])
- sd->equip_index[i] = n;
- }
- sd->status.inventory[n].equip=pos;
-
- if(sd->status.inventory[n].equip & 0x0002) {
- if(sd->inventory_data[n])
- sd->weapontype1 = sd->inventory_data[n]->look;
- else
- sd->weapontype1 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- }
- if(sd->status.inventory[n].equip & 0x0020) {
- if(sd->inventory_data[n]) {
- if(sd->inventory_data[n]->type == 4) {
- sd->status.shield = 0;
- if(sd->status.inventory[n].equip == 0x0020)
- sd->weapontype2 = sd->inventory_data[n]->look;
- else
- sd->weapontype2 = 0;
- }
- else if(sd->inventory_data[n]->type == 5) {
- sd->status.shield = sd->inventory_data[n]->look;
- sd->weapontype2 = 0;
- }
- }
- else
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- }
- if(sd->status.inventory[n].equip & 0x0001) {
- if(sd->inventory_data[n])
- sd->status.head_bottom = sd->inventory_data[n]->look;
- else
- sd->status.head_bottom = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- }
- if(sd->status.inventory[n].equip & 0x0100) {
- if(sd->inventory_data[n])
- sd->status.head_top = sd->inventory_data[n]->look;
- else
- sd->status.head_top = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- }
- if(sd->status.inventory[n].equip & 0x0200) {
- if(sd->inventory_data[n])
- sd->status.head_mid = sd->inventory_data[n]->look;
- else
- sd->status.head_mid = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- }
- if(sd->status.inventory[n].equip & 0x0040)
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-
- pc_checkallowskill(sd); // ‘•”õ•i‚ŃXƒLƒ‹‚©‰ðœ‚³‚ê‚é‚©ƒ`ƒFƒbƒN
- if (itemdb_look(sd->status.inventory[n].nameid) == 11 && arrow){ // Added by RoVeRT
- clif_arrowequip(sd,arrow);
- sd->status.inventory[arrow].equip=32768;
- }
- pc_calcstatus(sd,0);
-
- if(sd->special_state.infinite_endure) {
- if(sd->sc_data[SC_ENDURE].timer == -1)
- skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
- }
- else {
- if(sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2)
- skill_status_change_end(&sd->bl,SC_ENDURE,-1);
- }
-
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- if(sd->sc_data[SC_DANCING].timer!=-1 && (sd->status.weapon != 13 && sd->status.weapon !=14))
- skill_stop_dancing(&sd->bl,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘• ”õ‚µ‚½•¨‚ðŠO‚·
- *------------------------------------------
- */
-int pc_unequipitem(struct map_session_data *sd,int n,int type)
-{
- nullpo_retr(0, sd);
-
-// -- moonsoul (if player is berserk then cannot unequip)
-//
- if(sd->sc_data[SC_BERSERK].timer!=-1){
- clif_unequipitemack(sd,n,0,0);
- return 0;
- }
-
- if(battle_config.battle_log)
- printf("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip);
- if(sd->status.inventory[n].equip){
- int i;
- for(i=0;i<11;i++) {
- if(sd->status.inventory[n].equip & equip_pos[i])
- sd->equip_index[i] = -1;
- }
- if(sd->status.inventory[n].equip & 0x0002) {
- sd->weapontype1 = 0;
- sd->status.weapon = sd->weapontype2;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
- }
- if(sd->status.inventory[n].equip & 0x0020) {
- sd->status.shield = sd->weapontype2 = 0;
- pc_calcweapontype(sd);
- clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
- }
- if(sd->status.inventory[n].equip & 0x0001) {
- sd->status.head_bottom = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
- }
- if(sd->status.inventory[n].equip & 0x0100) {
- sd->status.head_top = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
- }
- if(sd->status.inventory[n].equip & 0x0200) {
- sd->status.head_mid = 0;
- clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
- }
- if(sd->status.inventory[n].equip & 0x0040)
- clif_changelook(&sd->bl,LOOK_SHOES,0);
-
- if(sd->sc_data[SC_BROKNWEAPON].timer != -1 && sd->status.inventory[n].equip & 0x0002 &&
- sd->status.inventory[i].attribute==1)
- skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
-
- clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1);
- sd->status.inventory[n].equip=0;
- if(!type)
- pc_checkallowskill(sd);
- if(sd->weapontype1 == 0 && sd->weapontype2 == 0)
- skill_encchant_eremental_end(&sd->bl,-1); //•ŠíŽ‚¿¾‚¦‚Í–³ðŒ‚Å‘®«•t—^‰ðœ
- } else {
- clif_unequipitemack(sd,n,0,0);
- }
- if(!type) {
- pc_calcstatus(sd,0);
- if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
- skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚Ìindex”Ô†‚ð‹l‚ß‚½‚è
- * ‘• ”õ•i‚Ì‘•”õ‰Â”\ƒ`ƒFƒbƒN‚ðs‚È‚¤
- *------------------------------------------
- */
-int pc_checkitem(struct map_session_data *sd)
-{
- int i,j,k,id,calc_flag = 0;
- struct item_data *it=NULL;
-
- nullpo_retr(0, sd);
-
- // ŠŽ•i‹ó‚«‹l‚ß
- for(i=j=0;i<MAX_INVENTORY;i++){
- if( (id=sd->status.inventory[i].nameid)==0)
- continue;
- if( battle_config.item_check && !itemdb_available(id) ){
- if(battle_config.error_log)
- printf("illeagal item id %d in %d[%s] inventory.\n",id,sd->bl.id,sd->status.name);
- pc_delitem(sd,i,sd->status.inventory[i].amount,3);
- continue;
- }
- if(i>j){
- memcpy(&sd->status.inventory[j],&sd->status.inventory[i],sizeof(struct item));
- sd->inventory_data[j] = sd->inventory_data[i];
- }
- j++;
- }
- if(j < MAX_INVENTORY)
- memset(&sd->status.inventory[j],0,sizeof(struct item)*(MAX_INVENTORY-j));
- for(k=j;k<MAX_INVENTORY;k++)
- sd->inventory_data[k] = NULL;
-
- // ƒJ[ƒg“à‹ó‚«‹l‚ß
- for(i=j=0;i<MAX_CART;i++){
- if( (id=sd->status.cart[i].nameid)==0 )
- continue;
- if( battle_config.item_check && !itemdb_available(id) ){
- if(battle_config.error_log)
- printf("illeagal item id %d in %d[%s] cart.\n",id,sd->bl.id,sd->status.name);
- pc_cart_delitem(sd,i,sd->status.cart[i].amount,1);
- continue;
- }
- if(i>j){
- memcpy(&sd->status.cart[j],&sd->status.cart[i],sizeof(struct item));
- }
- j++;
- }
- if(j < MAX_CART)
- memset(&sd->status.cart[j],0,sizeof(struct item)*(MAX_CART-j));
-
- // ‘• ”õˆÊ’uƒ`ƒFƒbƒN
-
- for(i=0;i<MAX_INVENTORY;i++){
-
- it=sd->inventory_data[i];
-
- if(sd->status.inventory[i].nameid==0)
- continue;
- if(sd->status.inventory[i].equip & ~pc_equippoint(sd,i)) {
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }
- //‘•”õ§ŒÀƒ`ƒFƒbƒN
- if(sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp && (it->flag.no_equip==1 || it->flag.no_equip==3)){//PvP§ŒÀ
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }else if(sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg && (it->flag.no_equip==2 || it->flag.no_equip==3)){//GvG§ŒÀ
- sd->status.inventory[i].equip=0;
- calc_flag = 1;
- }
- }
-
- pc_setequipindex(sd);
- if(calc_flag)
- pc_calcstatus(sd,2);
-
- return 0;
-}
-
-int pc_checkoverhp(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.hp == sd->status.max_hp)
- return 1;
- if(sd->status.hp > sd->status.max_hp) {
- sd->status.hp = sd->status.max_hp;
- clif_updatestatus(sd,SP_HP);
- return 2;
- }
-
- return 0;
-}
-
-int pc_checkoversp(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.sp == sd->status.max_sp)
- return 1;
- if(sd->status.sp > sd->status.max_sp) {
- sd->status.sp = sd->status.max_sp;
- clif_updatestatus(sd,SP_SP);
- return 2;
- }
-
- return 0;
-}
-
-/*==========================================
- * PVP‡ˆÊŒvŽZ—p(foreachinarea)
- *------------------------------------------
- */
-int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd1,*sd2=NULL;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd1=(struct map_session_data *)bl);
- nullpo_retr(0, sd2=va_arg(ap,struct map_session_data *));
-
- if( sd1->pvp_point > sd2->pvp_point )
- sd2->pvp_rank++;
- return 0;
-}
-/*==========================================
- * PVP‡ˆÊŒvŽZ
- *------------------------------------------
- */
-int pc_calc_pvprank(struct map_session_data *sd)
-{
- int old;
- struct map_data *m;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, m=&map[sd->bl.m]);
-
- old=sd->pvp_rank;
-
- if( !(m->flag.pvp) )
- return 0;
- sd->pvp_rank=1;
- map_foreachinarea(pc_calc_pvprank_sub,sd->bl.m,0,0,m->xs,m->ys,BL_PC,sd);
- if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users)
- clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users,0);
- return sd->pvp_rank;
-}
-/*==========================================
- * PVP‡ˆÊŒvŽZ(timer)
- *------------------------------------------
- */
-int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=NULL;
- if(battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris]
- return 0;
-
- sd=map_id2sd(id);
- if(sd==NULL)
- return 0;
- sd->pvp_timer=-1;
- if( pc_calc_pvprank(sd)>0 )
- sd->pvp_timer=add_timer(
- gettick()+PVP_CALCRANK_INTERVAL,
- pc_calc_pvprank_timer,id,data);
- return 0;
-}
-
-/*==========================================
- * sd‚ÍŒ‹¥‚µ‚Ä‚¢‚é‚©(Šù¥‚Ìꇂ͑Š•û‚Ìchar_id‚ð•Ô‚·)
- *------------------------------------------
- */
-int pc_ismarried(struct map_session_data *sd)
-{
- if(sd == NULL)
- return -1;
- if(sd->status.partner_id > 0)
- return sd->status.partner_id;
- else
- return 0;
-}
-/*==========================================
- * sd‚ªdstsd‚ÆŒ‹¥(dstsd¨sd‚ÌŒ‹¥ˆ—‚à“¯Žž‚És‚¤)
- *------------------------------------------
- */
-int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd)
-{
- if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0)
- return -1;
- sd->status.partner_id=dstsd->status.char_id;
- dstsd->status.partner_id=sd->status.char_id;
- return 0;
-}
-
-/*==========================================
- * sd‚ª—£¥(‘ŠŽè‚Ísd->status.partner_id‚Ɉ˂é)(‘ŠŽè‚à“¯Žž‚É—£¥EŒ‹¥Žw—ÖŽ©“®”’D)
- *------------------------------------------
- */
-int pc_divorce(struct map_session_data *sd)
-{
- struct map_session_data *p_sd=NULL;
- if(sd == NULL || !pc_ismarried(sd))
- return -1;
-
- if( (p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) !=NULL){
- int i;
- if(p_sd->status.partner_id != sd->status.char_id || sd->status.partner_id != p_sd->status.char_id){
- printf("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",sd->status.partner_id,p_sd->status.partner_id);
- return -1;
- }
- sd->status.partner_id=0;
- p_sd->status.partner_id=0;
- 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);
- for(i=0;i<MAX_INVENTORY;i++)
- if(p_sd->status.inventory[i].nameid == WEDDING_RING_M || p_sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc_delitem(p_sd,i,1,0);
-
- }else{
- printf("pc_divorce: p_sd nullpo\n");
- return -1;
- }
- return 0;
-}
-
-/*==========================================
- * sd‚Ì‘Š•û‚Ìmap_session_data‚ð•Ô‚·
- *------------------------------------------
- */
-struct map_session_data *pc_get_partner(struct map_session_data *sd)
-{
- struct map_session_data *p_sd = NULL;
- char *nick;
- if(sd == NULL || !pc_ismarried(sd))
- return NULL;
-
- nick=map_charid2nick(sd->status.partner_id);
-
- if (nick==NULL)
- return NULL;
-
- if((p_sd=map_nick2sd(nick)) == NULL )
- return NULL;
-
- return p_sd;
-}
-
-//
-// Ž©‘R‰ñ•œ•¨
-//
-/*==========================================
- * SP‰ñ•œ—ÊŒvŽZ
- *------------------------------------------
- */
-static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick;
-static int pc_spheal(struct map_session_data *sd)
-{
- int a;
- struct guild_castle *gc = NULL;
-
- nullpo_retr(0, sd);
-
- a = natural_heal_diff_tick;
- if(pc_issit(sd)) a += a;
- if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // ƒ}ƒOƒjƒtƒBƒJ[ƒg
- a += a;
-
- gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g;
- g=guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
-
- return a;
-}
-
-/*==========================================
- * HP‰ñ•œ—ÊŒvŽZ
- *------------------------------------------
- */
-static int pc_hpheal(struct map_session_data *sd)
-{
- int a;
- struct guild_castle *gc;
-
- nullpo_retr(0, sd);
-
- a = natural_heal_diff_tick;
- if(pc_issit(sd)) a += a;
- if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT
- a += a;
-
- gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
- if(gc) {
- struct guild *g;
- g=guild_search(sd->status.guild_id);
- if(g && g->guild_id == gc->guild_id)
- a += a;
- } // end addition [Valaris]
-
- return a;
-}
-
-static int pc_natural_heal_hp(struct map_session_data *sd)
-{
- int bhp;
- int inc_num,bonus,skill,hp_flag;
-
- nullpo_retr(0, sd);
-
- if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
- return 0;
-
- if(pc_checkoverhp(sd)) {
- sd->hp_sub = sd->inchealhptick = 0;
- return 0;
- }
-
- bhp=sd->status.hp;
- hp_flag = (pc_checkskill(sd,SM_MOVINGRECOVERY) > 0 && sd->walktimer != -1);
-
- if(sd->walktimer == -1) {
- inc_num = pc_hpheal(sd);
- if( sd->sc_data[SC_TENSIONRELAX].timer!=-1 ){ // ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX
- sd->hp_sub += 2*inc_num;
- sd->inchealhptick += 3*natural_heal_diff_tick;
- }else{
- sd->hp_sub += inc_num;
- sd->inchealhptick += natural_heal_diff_tick;
- }
- }
- else if(hp_flag) {
- inc_num = pc_hpheal(sd);
- sd->hp_sub += inc_num;
- sd->inchealhptick = 0;
- }
- else {
- sd->hp_sub = sd->inchealhptick = 0;
- return 0;
- }
-
- if(sd->hp_sub >= battle_config.natural_healhp_interval) {
- bonus = sd->nhealhp;
- if(hp_flag) {
- bonus >>= 2;
- if(bonus <= 0) bonus = 1;
- }
- while(sd->hp_sub >= battle_config.natural_healhp_interval) {
- sd->hp_sub -= battle_config.natural_healhp_interval;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- }
- }
- if(bhp!=sd->status.hp)
- clif_updatestatus(sd,SP_HP);
-
- if(sd->nshealhp > 0) {
- if(sd->inchealhptick >= battle_config.natural_heal_skill_interval && sd->status.hp < sd->status.max_hp) {
- bonus = sd->nshealhp;
- while(sd->inchealhptick >= battle_config.natural_heal_skill_interval) {
- sd->inchealhptick -= battle_config.natural_heal_skill_interval;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- bonus = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- clif_heal(sd->fd,SP_HP,bonus);
- }
- }
- }
- else sd->inchealhptick = 0;
-
- return 0;
-
- if(sd->sc_data[SC_APPLEIDUN].timer!=-1) { // Apple of Idun
- if(sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp) {
- bonus = skill*20;
- while(sd->inchealhptick >= 6000) {
- sd->inchealhptick -= 6000;
- if(sd->status.hp + bonus <= sd->status.max_hp)
- sd->status.hp += bonus;
- else {
- bonus = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- sd->hp_sub = sd->inchealhptick = 0;
- }
- clif_heal(sd->fd,SP_HP,bonus);
- }
- }
- }
- else sd->inchealhptick = 0;
-
- return 0;
-}
-
-static int pc_natural_heal_sp(struct map_session_data *sd)
-{
- int bsp;
- int inc_num,bonus;
-
- nullpo_retr(0, sd);
-
- if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
- return 0;
-
- if(pc_checkoversp(sd)) {
- sd->sp_sub = sd->inchealsptick = 0;
- return 0;
- }
-
- bsp=sd->status.sp;
-
- inc_num = pc_spheal(sd);
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1)
- sd->sp_sub += inc_num;
- if(sd->walktimer == -1)
- sd->inchealsptick += natural_heal_diff_tick;
- else sd->inchealsptick = 0;
-
- if(sd->sp_sub >= battle_config.natural_healsp_interval){
- bonus = sd->nhealsp;;
- while(sd->sp_sub >= battle_config.natural_healsp_interval){
- sd->sp_sub -= battle_config.natural_healsp_interval;
- if(sd->status.sp + bonus <= sd->status.max_sp)
- sd->status.sp += bonus;
- else {
- sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- }
- }
-
- if(bsp != sd->status.sp)
- clif_updatestatus(sd,SP_SP);
-
- if(sd->nshealsp > 0) {
- if(sd->inchealsptick >= battle_config.natural_heal_skill_interval && sd->status.sp < sd->status.max_sp) {
- struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
- if(sd->doridori_counter && s_class.job == 23)
- bonus = sd->nshealsp*2;
- else
- bonus = sd->nshealsp;
- sd->doridori_counter = 0;
- while(sd->inchealsptick >= battle_config.natural_heal_skill_interval) {
- sd->inchealsptick -= battle_config.natural_heal_skill_interval;
- if(sd->status.sp + bonus <= sd->status.max_sp)
- sd->status.sp += bonus;
- else {
- bonus = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- clif_heal(sd->fd,SP_SP,bonus);
- }
- }
- }
- else sd->inchealsptick = 0;
-
- return 0;
-}
-
-static int pc_spirit_heal_hp(struct map_session_data *sd,int level)
-{
- int bonus_hp,interval = battle_config.natural_heal_skill_interval;
-
- nullpo_retr(0, sd);
-
- if(pc_checkoverhp(sd)) {
- sd->inchealspirithptick = 0;
- return 0;
- }
-
- sd->inchealspirithptick += natural_heal_diff_tick;
-
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
- interval += interval;
-
- if(sd->inchealspirithptick >= interval) {
- bonus_hp = sd->nsshealhp;
- while(sd->inchealspirithptick >= interval) {
- if(pc_issit(sd)) {
- sd->inchealspirithptick -= interval;
- if(sd->status.hp < sd->status.max_hp) {
- if(sd->status.hp + bonus_hp <= sd->status.max_hp)
- sd->status.hp += bonus_hp;
- else {
- bonus_hp = sd->status.max_hp - sd->status.hp;
- sd->status.hp = sd->status.max_hp;
- }
- clif_heal(sd->fd,SP_HP,bonus_hp);
- sd->inchealspirithptick = 0;
- }
- }else{
- sd->inchealspirithptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-static int pc_spirit_heal_sp(struct map_session_data *sd,int level)
-{
- int bonus_sp,interval = battle_config.natural_heal_skill_interval;
-
- nullpo_retr(0, sd);
-
- if(pc_checkoversp(sd)) {
- sd->inchealspiritsptick = 0;
- return 0;
- }
-
- sd->inchealspiritsptick += natural_heal_diff_tick;
-
- if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
- interval += interval;
-
- if(sd->inchealspiritsptick >= interval) {
- bonus_sp = sd->nsshealsp;
- while(sd->inchealspiritsptick >= interval) {
- if(pc_issit(sd)) {
- sd->inchealspiritsptick -= interval;
- if(sd->status.sp < sd->status.max_sp) {
- if(sd->status.sp + bonus_sp <= sd->status.max_sp)
- sd->status.sp += bonus_sp;
- else {
- bonus_sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- clif_heal(sd->fd,SP_SP,bonus_sp);
- sd->inchealspiritsptick = 0;
- }
- }else{
- sd->inchealspiritsptick -= natural_heal_diff_tick;
- break;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * HP/SP Ž©‘R‰ñ•œ ŠeƒNƒ‰ƒCƒAƒ“ƒg
- *------------------------------------------
- */
-
-static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) {
- int skill;
-
- nullpo_retr(0, sd);
-
-// -- moonsoul (if conditions below altered to disallow natural healing if under berserk status)
- if ((battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) &&
- !pc_isdead(sd) &&
- !pc_ishiding(sd) &&
- sd->sc_data[SC_POISON].timer == -1
- ) {
- pc_natural_heal_hp(sd);
- if( sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //ˆ¢C—…ó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- sd->sc_data[SC_DANCING].timer == -1 && //ƒ_ƒ“ƒXó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- sd->sc_data[SC_BERSERK].timer == -1 //ƒo[ƒT[ƒNó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
- )
- pc_natural_heal_sp(sd);
- } else {
- sd->hp_sub = sd->inchealhptick = 0;
- sd->sp_sub = sd->inchealsptick = 0;
- }
- if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){
- pc_spirit_heal_hp(sd,skill);
- pc_spirit_heal_sp(sd,skill);
- }
- else {
- sd->inchealspirithptick = 0;
- sd->inchealspiritsptick = 0;
- }
- return 0;
-}
-
-/*==========================================
- * HP/SPŽ©‘R‰ñ•œ (interval timerŠÖ”)
- *------------------------------------------
- */
-int pc_natural_heal(int tid,unsigned int tick,int id,int data)
-{
- natural_heal_tick = tick;
- natural_heal_diff_tick = DIFF_TICK(natural_heal_tick,natural_heal_prev_tick);
- clif_foreachclient(pc_natural_heal_sub);
-
- natural_heal_prev_tick = tick;
- return 0;
-}
-
-/*==========================================
- * ƒZ[ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
- *------------------------------------------
- */
-int pc_setsavepoint(struct map_session_data *sd,char *mapname,int x,int y)
-{
- nullpo_retr(0, sd);
-
- strncpy(sd->status.save_point.map,mapname,24);
- sd->status.save_point.x = x;
- sd->status.save_point.y = y;
-
- return 0;
-}
-
-/*==========================================
- * Ž©“®ƒZ[ƒu ŠeƒNƒ‰ƒCƒAƒ“ƒg
- *------------------------------------------
- */
-static int last_save_fd,save_flag;
-static int pc_autosave_sub(struct map_session_data *sd,va_list ap)
-{
- nullpo_retr(0, sd);
-
- if(save_flag==0 && sd->fd>last_save_fd){
- struct guild_castle *gc=NULL;
- int i;
-// if(battle_config.save_log)
-// printf("autosave %d\n",sd->fd);
- // pet
- if(sd->status.pet_id > 0 && sd->pd)
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
- if(!gc) continue;
- if(gc->visibleG0==1) guild_castledatasave(gc->castle_id,18,gc->Ghp0);
- if(gc->visibleG1==1) guild_castledatasave(gc->castle_id,19,gc->Ghp1);
- if(gc->visibleG2==1) guild_castledatasave(gc->castle_id,20,gc->Ghp2);
- if(gc->visibleG3==1) guild_castledatasave(gc->castle_id,21,gc->Ghp3);
- if(gc->visibleG4==1) guild_castledatasave(gc->castle_id,22,gc->Ghp4);
- if(gc->visibleG5==1) guild_castledatasave(gc->castle_id,23,gc->Ghp5);
- if(gc->visibleG6==1) guild_castledatasave(gc->castle_id,24,gc->Ghp6);
- if(gc->visibleG7==1) guild_castledatasave(gc->castle_id,25,gc->Ghp7);
- }
-
- save_flag=1;
- last_save_fd = sd->fd;
- }
-
- return 0;
-}
-
-/*==========================================
- * Ž©“®ƒZ[ƒu (timerŠÖ”)
- *------------------------------------------
- */
-int pc_autosave(int tid,unsigned int tick,int id,int data)
-{
- int interval;
-
- save_flag=0;
- clif_foreachclient(pc_autosave_sub);
- if(save_flag==0)
- last_save_fd=0;
-
- interval = autosave_interval/(clif_countusers()+1);
- if(interval <= 0)
- interval = 1;
- add_timer(gettick()+interval,pc_autosave,0,0);
-
- return 0;
-}
-
-int pc_read_gm_account(int fd)
-{
-#ifdef TXT_ONLY
- int i = 0;
-#endif
- if (gm_account != NULL)
- free(gm_account);
- GM_num = 0;
-#ifdef TXT_ONLY
- gm_account = calloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
- 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++;
- }
-#else
- sprintf (tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",gm_db_account_id,gm_db_level,gm_db,gm_db_level,lowest_gm_level);
- if(mysql_query(&lmysql_handle, tmp_lsql) ) {
- printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle) );
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = calloc(sizeof(struct gm_account) * 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]);
- printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
- GM_num++;
- }
- }
-
- mysql_free_result(lsql_res);
-#endif /* TXT_ONLY */
- return GM_num;
-}
-
-/*==========================================
- * timer to do the day
- *------------------------------------------
- */
-int map_day_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.day_duration > 0) { // if we want a day
- if (night_flag != 0) {
- strcpy(tmpstr, msg_txt(502)); // The day has arrived!
- night_flag = 0; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_sd->opt2 &= ~STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * timer to do the night
- *------------------------------------------
- */
-int map_night_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
- struct map_session_data *pl_sd = NULL;
- int i;
- char tmpstr[1024];
-
- if (battle_config.night_duration > 0) { // if we want a night
- if (night_flag == 0) {
- strcpy(tmpstr, msg_txt(503)); // The night has fallen...
- night_flag = 1; // 0=day, 1=night [Yor]
- for(i = 0; i < fd_max; i++) {
- if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
- pl_sd->opt2 |= STATE_BLIND;
- clif_changeoption(&pl_sd->bl);
- clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
- }
- }
- }
- }
-
- return 0;
-}
-
-void pc_setstand(struct map_session_data *sd){
- nullpo_retv(sd);
-
- if(sd->sc_data && sd->sc_data[SC_TENSIONRELAX].timer!=-1)
- skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
-
- sd->state.dead_sit = 0;
-}
-
-//
-// ‰Šú‰»•¨
-//
-/*==========================================
- * Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚Þ
- * exp.txt •K—vŒoŒ±’l
- * job_db1.txt d—Ê,hp,sp,UŒ‚‘¬“x
- * job_db2.txt job”\—Í’lƒ{[ƒiƒX
- * skill_tree.txt ŠeE–ˆ‚̃XƒLƒ‹ƒcƒŠ[
- * attr_fix.txt ‘®«C³ƒe[ƒuƒ‹
- * size_fix.txt ƒTƒCƒY•â³ƒe[ƒuƒ‹
- * refine_db.txt ¸˜Bƒf[ƒ^ƒe[ƒuƒ‹
- *------------------------------------------
- */
-int pc_readdb(void)
-{
- int i,j,k;
- FILE *fp;
- char line[1024],*p;
-
- // •K—vŒoŒ±’l“Ç‚Ýž‚Ý
-
- fp=fopen("db/exp.txt","r");
- if(fp==NULL){
- printf("can't read db/exp.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- int bn,b1,b2,b3,b4,b5,b6,jn,j1,j2,j3,j4,j5,j6;
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(sscanf(line,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&bn,&b1,&b2,&b3,&b4,&b5,&b6,&jn,&j1,&j2,&j3,&j4,&j5,&j6)!=14)
- continue;
- exp_table[0][i]=bn;
- exp_table[1][i]=b1;
- exp_table[2][i]=b2;
- exp_table[3][i]=b3;
- exp_table[4][i]=b4;
- exp_table[5][i]=b5;
- exp_table[6][i]=b6;
- exp_table[7][i]=jn;
- exp_table[8][i]=j1;
- exp_table[9][i]=j2;
- exp_table[10][i]=j3;
- exp_table[11][i]=j4;
- exp_table[12][i]=j5;
- exp_table[13][i]=j6;
- i++;
- if(i >= battle_config.maximum_level)
- break;
- }
- fclose(fp);
- printf("read db/exp.txt done\n");
-
- // JOB•â³”’l‚P
- fp=fopen("db/job_db1.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db1.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<21 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(j<21)
- continue;
- max_weight_base[i]=atoi(split[0]);
- hp_coefficient[i]=atoi(split[1]);
- hp_coefficient2[i]=atoi(split[2]);
- sp_coefficient[i]=atoi(split[3]);
- for(j=0;j<17;j++)
- aspd_base[i][j]=atoi(split[j+4]);
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if(i==24)
- i=4001;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- printf("read db/job_db1.txt done\n");
-
- // JOBƒ{[ƒiƒX
- fp=fopen("db/job_db2.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db2.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<MAX_LEVEL && p;j++){
- if(sscanf(p,"%d",&k)==0)
- break;
- job_bonus[0][i][j]=k;
- job_bonus[2][i][j]=k; //—{ŽqE‚̃{[ƒiƒX‚Í•ª‚©‚ç‚È‚¢‚̂ʼn¼
- p=strchr(p,',');
- if(p) p++;
- }
- i++;
-// -- moonsoul (below two lines added to accommodate high numbered new class ids)
- if(i==24)
- i=4001;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- printf("read db/job_db2.txt done\n");
-
- // JOBƒ{[ƒiƒX2 “]¶E—p
- fp=fopen("db/job_db2-2.txt","r");
- if(fp==NULL){
- printf("can't read db/job_db2-2.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<MAX_LEVEL && p;j++){
- if(sscanf(p,"%d",&k)==0)
- break;
- job_bonus[1][i][j]=k;
- p=strchr(p,',');
- if(p) p++;
- }
- i++;
- if(i==MAX_PC_CLASS)
- break;
- }
- fclose(fp);
- printf("read db/job_db2-2.txt done\n");
-
- // ƒXƒLƒ‹ƒcƒŠ[
- memset(skill_tree,0,sizeof(skill_tree));
- fp=fopen("db/skill_tree.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_tree.txt\n");
- return 1;
- }
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[50];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<13 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(j<13)
- continue;
- i=atoi(split[0]);
- for(j=0;skill_tree[0][i][j].id;j++);
- skill_tree[0][i][j].id=atoi(split[1]);
- skill_tree[0][i][j].max=atoi(split[2]);
- skill_tree[2][i][j].id=atoi(split[1]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
- skill_tree[2][i][j].max=atoi(split[2]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
- for(k=0;k<5;k++){
- skill_tree[0][i][j].need[k].id=atoi(split[k*2+3]);
- skill_tree[0][i][j].need[k].lv=atoi(split[k*2+4]);
- skill_tree[2][i][j].need[k].id=atoi(split[k*2+3]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
- skill_tree[2][i][j].need[k].lv=atoi(split[k*2+4]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
- }
- }
- fclose(fp);
- printf("read db/skill_tree.txt done\n");
-
- // ‘®«C³ƒe[ƒuƒ‹
- for(i=0;i<4;i++)
- for(j=0;j<10;j++)
- for(k=0;k<10;k++)
- attr_fix_table[i][j][k]=100;
- fp=fopen("db/attr_fix.txt","r");
- if(fp==NULL){
- printf("can't read db/attr_fix.txt\n");
- return 1;
- }
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[10];
- int lv,n;
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<3 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- lv=atoi(split[0]);
- n=atoi(split[1]);
-// printf("%d %d\n",lv,n);
-
- for(i=0;i<n;){
- if( !fgets(line, sizeof(line)-1, fp) )
- break;
- if(line[0]=='/' && line[1]=='/')
- continue;
-
- for(j=0,p=line;j<n && p;j++){
- while(*p==32 && *p>0)
- p++;
- attr_fix_table[lv-1][i][j]=atoi(p);
- if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
- attr_fix_table[lv-1][i][j] = 0;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- i++;
- }
- }
- fclose(fp);
- printf("read db/attr_fix.txt done\n");
-
- // ƒTƒCƒY•â³ƒe[ƒuƒ‹
- for(i=0;i<3;i++)
- for(j=0;j<20;j++)
- atkmods[i][j]=100;
- fp=fopen("db/size_fix.txt","r");
- if(fp==NULL){
- printf("can't read db/size_fix.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[20];
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(atoi(line)<=0)
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<20 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- for(j=0;j<20 && split[j];j++)
- atkmods[i][j]=atoi(split[j]);
- i++;
- }
- fclose(fp);
- printf("read db/size_fix.txt done\n");
-
- // ¸˜Bƒf[ƒ^ƒe[ƒuƒ‹
- for(i=0;i<5;i++){
- for(j=0;j<10;j++)
- percentrefinery[i][j]=100;
- refinebonus[i][0]=0;
- refinebonus[i][1]=0;
- refinebonus[i][2]=10;
- }
- fp=fopen("db/refine_db.txt","r");
- if(fp==NULL){
- printf("can't read db/refine_db.txt\n");
- return 1;
- }
- i=0;
- while(fgets(line, sizeof(line)-1, fp)){
- char *split[16];
- if(line[0]=='/' && line[1]=='/')
- continue;
- if(atoi(line)<=0)
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<16 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- refinebonus[i][0]=atoi(split[0]); // ¸˜Bƒ{[ƒiƒX
- refinebonus[i][1]=atoi(split[1]); // ‰ß踘Bƒ{[ƒiƒX
- refinebonus[i][2]=atoi(split[2]); // ˆÀ‘S¸˜BŒÀŠE
- for(j=0;j<10 && split[j];j++)
- percentrefinery[i][j]=atoi(split[j+3]);
- i++;
- }
- fclose(fp); //Lupus. close this file!!!
- printf("read db/refine_db.txt done\n");
-
- return 0;
-}
-
-static int pc_calc_sigma(void)
-{
- int i,j,k;
-
- for(i=0;i<MAX_PC_CLASS;i++) {
- memset(hp_sigma_val[i],0,sizeof(hp_sigma_val[i]));
- for(k=0,j=2;j<=MAX_LEVEL;j++) {
- k += hp_coefficient[i]*j + 50;
- k -= k%100;
- hp_sigma_val[i][j-1] = k;
- }
- }
- return 0;
-}
-
-static void pc_statpointdb(void)
-{
- char * buf_stat;
- int i=0,j=0,k=0,l=0, end = 0;
-
- FILE *stp;
-
- stp=fopen("db/statpoint.txt","r");
-
- if(stp==NULL){
- printf("can't read db/statpoint.txt\n");
- return;
- }
-
- fseek(stp, 0, SEEK_END);
- end = ftell(stp);
- rewind(stp);
-
- buf_stat = (char *) malloc (end + 1);
- l = fread(buf_stat,1,end,stp);
- fclose(stp);
- printf("read db/statpoint.txt done (size=%d)\n",l);
-
- for(i=0;i<255;i++) {
- j=0;
- while (*(buf_stat+k)!='\n') {
- statp[i][j]=*(buf_stat+k);
- j++;k++;
- }
- statp[i][j+1]='\0';
- k++;
- }
-
- free(buf_stat);
-}
-
-/*==========================================
- * pcŠÖ ŒW‰Šú‰»
- *------------------------------------------
- */
-int do_init_pc(void) {
- pc_readdb();
- pc_statpointdb();
- pc_calc_sigma();
-
-// gm_account_db = numdb_init();
-
- add_timer_func_list(pc_walk, "pc_walk");
- add_timer_func_list(pc_attack_timer, "pc_attack_timer");
- add_timer_func_list(pc_natural_heal, "pc_natural_heal");
- add_timer_func_list(pc_invincible_timer, "pc_invincible_timer");
- add_timer_func_list(pc_eventtimer, "pc_eventtimer");
- add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
- add_timer_func_list(pc_autosave, "pc_autosave");
- add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
- add_timer_interval((natural_heal_prev_tick = gettick() + NATURAL_HEAL_INTERVAL), pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);
- add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);
-
-#ifndef TXT_ONLY
- pc_read_gm_account(0);
-#endif /* not TXT_ONLY */
-
- // add night/day timer (by [yor])
- add_timer_func_list(map_day_timer, "map_day_timer"); // by [yor]
- add_timer_func_list(map_night_timer, "map_night_timer"); // by [yor]
- {
- int day_duration = battle_config.day_duration;
- int night_duration = battle_config.night_duration;
- if (day_duration < 60000)
- day_duration = 60000;
- if (night_duration < 60000)
- night_duration = 60000;
- if (battle_config.night_at_start == 0) {
- night_flag = 0; // 0=day, 1=night [Yor]
- day_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
- night_timer_tid = add_timer_interval(gettick() + day_duration, map_night_timer, 0, 0, day_duration + night_duration);
- } else {
- night_flag = 1; // 0=day, 1=night [Yor]
- day_timer_tid = add_timer_interval(gettick() + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
- night_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_night_timer, 0, 0, day_duration + night_duration);
- }
- }
-
- return 0;
-}
+// $Id: pc.c 101 2004-09-25 17:57:22Z Valaris $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "socket.h" // [Valaris]
+#include "timer.h"
+#include "db.h"
+
+#include "malloc.h"
+#include "map.h"
+#include "chrif.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "npc.h"
+#include "mob.h"
+#include "pet.h"
+#include "itemdb.h"
+#include "script.h"
+#include "battle.h"
+#include "skill.h"
+#include "party.h"
+#include "guild.h"
+#include "chat.h"
+#include "trade.h"
+#include "storage.h"
+#include "vending.h"
+#include "nullpo.h"
+#include "atcommand.h"
+#include "log.h"
+
+#ifndef TXT_ONLY // mail system [Valaris]
+#include "mail.h"
+#endif
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define PVP_CALCRANK_INTERVAL 1000 // PVP‡ˆÊŒvŽZ‚ÌŠÔŠu
+
+#define STATE_BLIND 0x10
+
+static int max_weight_base[MAX_PC_CLASS];
+static int hp_coefficient[MAX_PC_CLASS];
+static int hp_coefficient2[MAX_PC_CLASS];
+static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
+static int sp_coefficient[MAX_PC_CLASS];
+static int aspd_base[MAX_PC_CLASS][20];
+static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
+static int exp_table[14][MAX_LEVEL];
+static char statp[255][7];
+static struct {
+ int id;
+ int max;
+ struct {
+ short id,lv;
+ } need[6];
+} skill_tree[3][MAX_PC_CLASS][100];
+
+static int atkmods[3][20]; // •ŠíATKƒTƒCƒYC³(size_fix.txt)
+static int refinebonus[5][3]; // ¸˜Bƒ{[ƒiƒXƒe[ƒuƒ‹(refine_db.txt)
+static int percentrefinery[5][10]; // ¸˜B¬Œ÷—¦(refine_db.txt)
+
+static int dirx[8]={0,-1,-1,-1,0,1,1,1};
+static int diry[8]={1,1,0,-1,-1,-1,0,1};
+
+static unsigned int equip_pos[11]={0x0080,0x0008,0x0040,0x0004,0x0001,0x0200,0x0100,0x0010,0x0020,0x0002,0x8000};
+
+//static struct dbt *gm_account_db;
+static struct gm_account *gm_account = NULL;
+static int GM_num = 0;
+
+int pc_isGM(struct map_session_data *sd) {
+// struct gm_account *p;
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->bl.type!=BL_PC )
+ return 0;
+
+/* p = numdb_search(gm_account_db, sd->status.account_id);
+ if (p == NULL)
+ return 0;
+ return p->level;*/
+
+ //For console [Wizputer]
+ if ( sd->fd == 0 )
+ return 99;
+
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == sd->status.account_id)
+ return gm_account[i].level;
+ return 0;
+
+}
+
+int pc_iskiller(struct map_session_data *src, struct map_session_data *target) {
+ nullpo_retr(0, src);
+
+ if(src->bl.type!=BL_PC )
+ return 0;
+ if (src->special_state.killer)
+ return 1;
+
+ if(target->bl.type!=BL_PC )
+ return 0;
+ if (target->special_state.killable)
+ return 1;
+
+ return 0;
+}
+
+
+int pc_set_gm_level(int account_id, int level) {
+ int i;
+ for (i = 0; i < GM_num; i++) {
+ if (account_id == gm_account[i].account_id) {
+ gm_account[i].level = level;
+ return 0;
+ }
+ }
+
+ GM_num++;
+ gm_account = realloc(gm_account, sizeof(struct gm_account) * GM_num);
+ gm_account[GM_num - 1].account_id = account_id;
+ gm_account[GM_num - 1].level = level;
+ return 0;
+}
+
+int pc_getrefinebonus(int lv, int type) {
+ if (lv >= 0 && lv < 5 && type >= 0 && type < 3)
+ return refinebonus[lv][type];
+ return 0;
+}
+
+static int distance(int x0, int y0, int x1, int y1) {
+ int dx, dy;
+
+ dx = abs(x0-x1);
+ dy = abs(y0-y1);
+ return dx>dy ? dx : dy;
+}
+
+static int pc_invincible_timer(int tid,unsigned int tick,int id,int data) {
+ struct map_session_data *sd;
+
+ if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
+ return 1;
+
+ if(sd->invincible_timer != tid){
+ if(battle_config.error_log)
+ printf("invincible_timer %d != %d\n",sd->invincible_timer,tid);
+ return 0;
+ }
+ sd->invincible_timer=-1;
+
+ return 0;
+}
+
+int pc_setinvincibletimer(struct map_session_data *sd,int val) {
+ nullpo_retr(0, sd);
+
+ if(sd->invincible_timer != -1)
+ delete_timer(sd->invincible_timer,pc_invincible_timer);
+ sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0);
+ return 0;
+}
+
+int pc_delinvincibletimer(struct map_session_data *sd) {
+ nullpo_retr(0, sd);
+
+ if(sd->invincible_timer != -1) {
+ delete_timer(sd->invincible_timer,pc_invincible_timer);
+ sd->invincible_timer = -1;
+ }
+ return 0;
+}
+
+static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
+ struct map_session_data *sd;
+ int i;
+
+ if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
+ return 1;
+
+ if(sd->spirit_timer[0] != tid){
+ if(battle_config.error_log)
+ printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
+ return 0;
+ }
+ sd->spirit_timer[0]=-1;
+ for(i=1;i<sd->spiritball;i++) {
+ sd->spirit_timer[i-1] = sd->spirit_timer[i];
+ sd->spirit_timer[i] = -1;
+ }
+ sd->spiritball--;
+ if(sd->spiritball < 0)
+ sd->spiritball = 0;
+ clif_spiritball(sd);
+
+ return 0;
+}
+
+int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(max > MAX_SKILL_LEVEL)
+ max = MAX_SKILL_LEVEL;
+ if(sd->spiritball < 0)
+ sd->spiritball = 0;
+
+ if(sd->spiritball >= max) {
+ if(sd->spirit_timer[0] != -1) {
+ delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
+ sd->spirit_timer[0] = -1;
+ }
+ for(i=1;i<max;i++) {
+ sd->spirit_timer[i-1] = sd->spirit_timer[i];
+ sd->spirit_timer[i] = -1;
+ }
+ }
+ else
+ sd->spiritball++;
+
+ sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
+ clif_spiritball(sd);
+
+ return 0;
+}
+
+int pc_delspiritball(struct map_session_data *sd,int count,int type) {
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->spiritball <= 0) {
+ sd->spiritball = 0;
+ return 0;
+ }
+
+ if(count > sd->spiritball)
+ count = sd->spiritball;
+ sd->spiritball -= count;
+ if(count > MAX_SKILL_LEVEL)
+ count = MAX_SKILL_LEVEL;
+
+ for(i=0;i<count;i++) {
+ if(sd->spirit_timer[i] != -1) {
+ delete_timer(sd->spirit_timer[i],pc_spiritball_timer);
+ sd->spirit_timer[i] = -1;
+ }
+ }
+ for(i=count;i<MAX_SKILL_LEVEL;i++) {
+ sd->spirit_timer[i-count] = sd->spirit_timer[i];
+ sd->spirit_timer[i] = -1;
+ }
+
+ if(!type)
+ clif_spiritball(sd);
+
+ return 0;
+}
+
+int pc_setrestartvalue(struct map_session_data *sd,int type) {
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ s_class = pc_calc_base_job(sd->status.class);
+
+ //-----------------------
+ // Ž€–S‚µ‚½
+ if(sd->special_state.restart_full_recover) { // ƒIƒVƒŠƒXƒJ[ƒh
+ sd->status.hp=sd->status.max_hp;
+ sd->status.sp=sd->status.max_sp;
+ }
+ else {
+ if(s_class.job == 0 && battle_config.restart_hp_rate < 50) { //ƒmƒr‚Í”¼•ª‰ñ•œ
+ sd->status.hp=(sd->status.max_hp)/2;
+ }
+ else {
+ if(battle_config.restart_hp_rate <= 0)
+ sd->status.hp = 1;
+ else {
+ sd->status.hp = sd->status.max_hp * battle_config.restart_hp_rate /100;
+ if(sd->status.hp <= 0)
+ sd->status.hp = 1;
+ }
+ }
+ if(battle_config.restart_sp_rate > 0) {
+ int sp = sd->status.max_sp * battle_config.restart_sp_rate /100;
+ if(sd->status.sp < sp)
+ sd->status.sp = sp;
+ }
+ }
+ if(type&1)
+ clif_updatestatus(sd,SP_HP);
+ if(type&1)
+ clif_updatestatus(sd,SP_SP);
+
+ /* removed exp penalty on spawn [Valaris] */
+
+ if(type&2 && sd->status.class != 0 && battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) {
+ int zeny = (int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
+ if(zeny < 1) zeny = 1;
+ sd->status.zeny -= zeny;
+ if(sd->status.zeny < 0) sd->status.zeny = 0;
+ clif_updatestatus(sd,SP_ZENY);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Ž©•ª‚ðƒƒbƒN‚µ‚Ä‚¢‚éMOB‚Ì”‚𔂦‚é(foreachclient)
+ *------------------------------------------
+ */
+static int pc_counttargeted_sub(struct block_list *bl,va_list ap)
+{
+ int id,*c,target_lv;
+ struct block_list *src;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ id=va_arg(ap,int);
+
+ nullpo_retr(0, c=va_arg(ap,int *));
+
+ src=va_arg(ap,struct block_list *);
+ target_lv=va_arg(ap,int);
+ if(id == bl->id || (src && id == src->id)) return 0;
+ if(bl->type == BL_PC) {
+ struct map_session_data *sd=(struct map_session_data *)bl;
+ if( sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv)
+ (*c)++;
+ }
+ else if(bl->type == BL_MOB) {
+ struct mob_data *md = (struct mob_data *)bl;
+ if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv)
+
+ (*c)++;
+ //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv);
+ }
+ return 0;
+}
+
+int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv)
+{
+ int c=0;
+ map_foreachinarea(pc_counttargeted_sub, sd->bl.m,
+ sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,
+ sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd->bl.id,&c,src,target_lv);
+ return c;
+}
+
+/*==========================================
+ * ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
+ *------------------------------------------
+ */
+static int pc_walktoxy_sub(struct map_session_data *);
+
+/*==========================================
+ * save‚É•K—v‚ȃXƒe[ƒ^ƒXC³‚ðs‚È‚¤
+ *------------------------------------------
+ */
+int pc_makesavestatus(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ // •ž‚ÌF‚ÍFX•¾ŠQ‚ª‘½‚¢‚Ì‚Å•Û‘¶‘ÎÛ‚É‚Í‚µ‚È‚¢
+ if(!battle_config.save_clothcolor)
+ sd->status.clothes_color=0;
+
+ // Ž€–Só‘Ô‚¾‚Á‚½‚Ì‚Åhp‚ð1AˆÊ’u‚ðƒZ[ƒuꊂɕÏX
+ if(pc_isdead(sd)){
+ pc_setrestartvalue(sd,0);
+ memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
+ } else {
+ memcpy(sd->status.last_point.map,sd->mapname,24);
+ sd->status.last_point.x = sd->bl.x;
+ sd->status.last_point.y = sd->bl.y;
+ }
+
+ // ƒZ[ƒu‹ÖŽ~ƒ}ƒbƒv‚¾‚Á‚½‚Ì‚ÅŽw’èˆÊ’u‚Ɉړ®
+ if(map[sd->bl.m].flag.nosave){
+ struct map_data *m=&map[sd->bl.m];
+ if(strcmp(m->save.map,"SavePoint")==0)
+ memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
+ else
+ memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
+ }
+
+ //ƒ}ƒi[ƒ|ƒCƒ“ƒg‚ªƒvƒ‰ƒX‚¾‚Á‚½ê‡0‚É
+ if(battle_config.muting_players && sd->status.manner > 0)
+ sd->status.manner = 0;
+ return 0;
+}
+
+/*==========================================
+ * Ú‘±Žž‚̉Šú‰»
+ *------------------------------------------
+ */
+int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id, int login_id1, int client_tick, int sex, int fd) {
+ nullpo_retr(0, sd);
+
+ sd->bl.id = account_id;
+ sd->char_id = char_id;
+ sd->login_id1 = login_id1;
+ sd->login_id2 = 0; // at this point, we can not know the value :(
+ sd->client_tick = client_tick;
+ sd->sex = sex;
+ sd->state.auth = 0;
+ sd->bl.type = BL_PC;
+ sd->canact_tick = sd->canmove_tick = gettick();
+ sd->canlog_tick = gettick();
+ sd->state.waitingdisconnect = 0;
+
+ return 0;
+}
+
+int pc_equippoint(struct map_session_data *sd,int n)
+{
+ int ep = 0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ s_class = pc_calc_base_job(sd->status.class);
+
+ if(sd->inventory_data[n]) {
+ ep = sd->inventory_data[n]->equip;
+ if(sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 || sd->inventory_data[n]->look == 6) {
+ if(ep == 2 && (pc_checkskill(sd,AS_LEFT) > 0 || s_class.job == 12))
+ return 34;
+ }
+ }
+ return ep;
+}
+
+int pc_setinventorydata(struct map_session_data *sd)
+{
+ int i,id;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<MAX_INVENTORY;i++) {
+ id = sd->status.inventory[i].nameid;
+ sd->inventory_data[i] = itemdb_search(id);
+ }
+ return 0;
+}
+
+int pc_calcweapontype(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->weapontype1 != 0 && sd->weapontype2 == 0)
+ sd->status.weapon = sd->weapontype1;
+ if(sd->weapontype1 == 0 && sd->weapontype2 != 0)// ¶Žè•Ší Only
+ sd->status.weapon = sd->weapontype2;
+ else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// ‘o’ZŒ•
+ sd->status.weapon = 0x11;
+ else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// ‘o’PŽèŒ•
+ sd->status.weapon = 0x12;
+ else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// ‘o’PŽè•€
+ sd->status.weapon = 0x13;
+ else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) ||
+ (sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // ’ZŒ• - ’PŽèŒ•
+ sd->status.weapon = 0x14;
+ else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) ||
+ (sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // ’ZŒ• - •€
+ sd->status.weapon = 0x15;
+ else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) ||
+ (sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // ’PŽèŒ• - •€
+ sd->status.weapon = 0x16;
+ else
+ sd->status.weapon = sd->weapontype1;
+
+ return 0;
+}
+
+int pc_setequipindex(struct map_session_data *sd)
+{
+ int i,j;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<11;i++)
+ sd->equip_index[i] = -1;
+
+ for(i=0;i<MAX_INVENTORY;i++) {
+ if(sd->status.inventory[i].nameid <= 0)
+ continue;
+ if(sd->status.inventory[i].equip) {
+ for(j=0;j<11;j++)
+ if(sd->status.inventory[i].equip & equip_pos[j])
+ sd->equip_index[j] = i;
+ if(sd->status.inventory[i].equip & 0x0002) {
+ if(sd->inventory_data[i])
+ sd->weapontype1 = sd->inventory_data[i]->look;
+ else
+ sd->weapontype1 = 0;
+ }
+ if(sd->status.inventory[i].equip & 0x0020) {
+ if(sd->inventory_data[i]) {
+ if(sd->inventory_data[i]->type == 4) {
+ if(sd->status.inventory[i].equip == 0x0020)
+ sd->weapontype2 = sd->inventory_data[i]->look;
+ else
+ sd->weapontype2 = 0;
+ }
+ else
+ sd->weapontype2 = 0;
+ }
+ else
+ sd->weapontype2 = 0;
+ }
+ }
+ }
+ pc_calcweapontype(sd);
+
+ return 0;
+}
+
+int pc_isequip(struct map_session_data *sd,int n)
+{
+ struct item_data *item;
+ struct status_change *sc_data;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+
+ nullpo_retr(0, sd);
+
+ item = sd->inventory_data[n];
+ sc_data = battle_get_sc_data(&sd->bl);
+ //s_class = pc_calc_base_job(sd->status.class);
+
+ if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip )
+ return 1;
+
+ if(item == NULL)
+ return 0;
+ if(item->sex != 2 && sd->status.sex != item->sex)
+ return 0;
+ if(item->elv > 0 && sd->status.base_level < item->elv)
+ return 0;
+// -- moonsoul (below statement substituted for commented out version further below
+// as it allows all advanced classes to equip items their normal versions
+// could equip)
+//
+ if(((sd->status.class==13 || sd->status.class==4014) && ((1<<7)&item->class) == 0) || // have mounted classes use unmounted equipment [Valaris]
+ ((sd->status.class==21 || sd->status.class==4022) && ((1<<14)&item->class) == 0))
+ return 0;
+ if(sd->status.class!=13 && sd->status.class!=4014 && sd->status.class!=21 && sd->status.class!=4022)
+ if((sd->status.class<=4000 && ((1<<sd->status.class)&item->class) == 0) || (sd->status.class>4000 && sd->status.class<4023 && ((1<<(sd->status.class-4001))&item->class) == 0) ||
+ (sd->status.class>=4023 && ((1<<(sd->status.class-4023))&item->class) == 0))
+ return 0;
+// if(((1<<sd->status.class)&item->class) == 0)
+// return 0;
+ if(map[sd->bl.m].flag.pvp && (item->flag.no_equip==1 || item->flag.no_equip==3))
+ return 0;
+ if(map[sd->bl.m].flag.gvg && (item->flag.no_equip==2 || item->flag.no_equip==3))
+ return 0;
+ if(item->equip & 0x0002 && sc_data && sc_data[SC_STRIPWEAPON].timer != -1)
+ return 0;
+ if(item->equip & 0x0020 && sc_data && sc_data[SC_STRIPSHIELD].timer != -1)
+ return 0;
+ if(item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1)
+ return 0;
+ if(item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1)
+ return 0;
+ return 1;
+}
+
+/*==========================================
+ * Weapon Breaking [Valaris]
+ *------------------------------------------
+ */
+int pc_breakweapon(struct map_session_data *sd)
+{
+ struct item_data* item;
+ char output[255];
+ int i;
+
+ if(sd==NULL)
+ return -1;
+ if(sd->unbreakable>=rand()%100)
+ return 0;
+ if(sd->sc_data && sd->sc_data[SC_CP_WEAPON].timer != -1)
+ return 0;
+
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && !sd->status.inventory[i].attribute==1){
+ item=sd->inventory_data[i];
+ sd->status.inventory[i].attribute=1;
+ pc_unequipitem(sd,i,0);
+ sprintf(output, "%s has broken.",item->jname);
+ clif_emotion(&sd->bl,23);
+ clif_displaymessage(sd->fd, output);
+ clif_equiplist(sd);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+/*==========================================
+ * Armor Breaking [Valaris]
+ *------------------------------------------
+ */
+int pc_breakarmor(struct map_session_data *sd)
+{
+ struct item_data* item;
+ char output[255];
+ int i;
+
+ if(sd==NULL)
+ return -1;
+ if(sd->unbreakable>=rand()%100)
+ return 0;
+ if(sd->sc_data && sd->sc_data[SC_CP_ARMOR].timer != -1)
+ return 0;
+
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && !sd->status.inventory[i].attribute==1){
+ item=sd->inventory_data[i];
+ sd->status.inventory[i].attribute=1;
+ pc_unequipitem(sd,i,0);
+ sprintf(output, "%s has broken.",item->jname);
+ clif_emotion(&sd->bl,23);
+ clif_displaymessage(sd->fd, output);
+ clif_equiplist(sd);
+ }
+ }
+
+ return 0;
+}
+/*==========================================
+ * session id‚É–â‘è–³‚µ
+ * charŽI‚©‚ç‘—‚ç‚ê‚Ä‚«‚½ƒXƒe[ƒ^ƒX‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_charstatus *st)
+{
+ struct map_session_data *sd = NULL;
+
+ struct party *p;
+ struct guild *g;
+ int i;
+ unsigned long tick = gettick();
+
+ sd = map_id2sd(id);
+ nullpo_retr(1, sd);
+
+ sd->login_id2 = login_id2;
+
+ memcpy(&sd->status, st, sizeof(*st));
+
+ if (sd->status.sex != sd->sex) {
+ clif_authfail_fd(sd->fd, 0);
+ return 1;
+ }
+
+ memset(&sd->state, 0, sizeof(sd->state));
+ // Šî–{“I‚ȉŠú‰»
+ sd->state.connect_new = 1;
+ sd->bl.prev = sd->bl.next = NULL;
+
+ sd->weapontype1 = sd->weapontype2 = 0;
+ sd->view_class = sd->status.class;
+ sd->speed = DEFAULT_WALK_SPEED;
+ sd->state.dead_sit = 0;
+ sd->dir = 0;
+ sd->head_dir = 0;
+ sd->state.auth = 1;
+ sd->walktimer = -1;
+ sd->attacktimer = -1;
+ sd->followtimer = -1; // [MouseJstr]
+ sd->skilltimer = -1;
+ sd->skillitem = -1;
+ sd->skillitemlv = -1;
+ sd->invincible_timer = -1;
+ sd->sg_count = 0;
+
+ sd->deal_locked = 0;
+ sd->trade_partner = 0;
+
+ sd->inchealhptick = 0;
+ sd->inchealsptick = 0;
+ sd->hp_sub = 0;
+ sd->sp_sub = 0;
+ sd->inchealspirithptick = 0;
+ sd->inchealspiritsptick = 0;
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->attackabletime = tick;
+
+ sd->doridori_counter = 0;
+
+#ifndef TXT_ONLY // mail system [Valaris]
+ if(battle_config.mail_system)
+ sd->mail_counter = 0;
+#endif
+ sd->spiritball = 0;
+ for(i = 0; i < MAX_SKILL_LEVEL; i++)
+ sd->spirit_timer[i] = -1;
+ for(i = 0; i < MAX_SKILLTIMERSKILL; i++)
+ sd->skilltimerskill[i].timer = -1;
+
+ memset(&sd->dev,0,sizeof(struct square));
+ for(i = 0; i < 5; i++) {
+ sd->dev.val1[i] = 0;
+ sd->dev.val2[i] = 0;
+ }
+
+ // ƒAƒJƒEƒ“ƒg•Ï”‚Ì‘—M—v‹
+ intif_request_accountreg(sd);
+
+ // ƒAƒCƒeƒ€ƒ`ƒFƒbƒN
+ pc_setinventorydata(sd);
+ pc_checkitem(sd);
+
+ // pet
+ sd->petDB = NULL;
+ sd->pd = NULL;
+ sd->pet_hungry_timer = -1;
+ memset(&sd->pet, 0, sizeof(struct s_pet));
+
+ // ƒXƒe[ƒ^ƒXˆÙí‚̉Šú‰»
+ for(i = 0; i < MAX_STATUSCHANGE; i++) {
+ sd->sc_data[i].timer=-1;
+ sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = sd->sc_data[i].val4 = 0;
+ }
+ sd->sc_count=0;
+ if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) &&
+ (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide)))
+ sd->status.option &= (OPTION_MASK | OPTION_HIDE);
+ else
+ sd->status.option &= OPTION_MASK;
+
+ // ƒXƒLƒ‹ƒ†ƒjƒbƒgŠÖŒW‚̉Šú‰»
+ memset(sd->skillunit, 0, sizeof(sd->skillunit));
+ memset(sd->skillunittick, 0, sizeof(sd->skillunittick));
+
+ // ƒp[ƒeƒB[ŠÖŒW‚̉Šú‰»
+ sd->party_sended = 0;
+ sd->party_invite = 0;
+ sd->party_x = -1;
+ sd->party_y = -1;
+ sd->party_hp = -1;
+
+ // ƒMƒ‹ƒhŠÖŒW‚̉Šú‰»
+ sd->guild_sended = 0;
+ sd->guild_invite = 0;
+ sd->guild_alliance = 0;
+
+ // ƒCƒxƒ“ƒgŠÖŒW‚̉Šú‰»
+ memset(sd->eventqueue, 0, sizeof(sd->eventqueue));
+ for(i = 0; i < MAX_EVENTTIMER; i++)
+ sd->eventtimer[i] = -1;
+
+ // ˆÊ’u‚ÌÝ’è
+ pc_setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, 0);
+
+ // pet
+ if (sd->status.pet_id > 0)
+ intif_request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
+
+ // ƒp[ƒeƒBAƒMƒ‹ƒhƒf[ƒ^‚Ì—v‹
+ if (sd->status.party_id > 0 && (p = party_search(sd->status.party_id)) == NULL)
+ party_request_info(sd->status.party_id);
+ if (sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) == NULL)
+ guild_request_info(sd->status.guild_id);
+
+ // pvp‚ÌÝ’è
+ sd->pvp_rank = 0;
+ sd->pvp_point = 0;
+ sd->pvp_timer = -1;
+
+ // ’Ê’m
+
+ clif_authok(sd);
+ map_addnickdb(sd);
+ if (map_charid2nick(sd->status.char_id) == NULL)
+ map_addchariddb(sd->status.char_id, sd->status.name);
+
+ //ƒXƒpƒmƒr—pŽ€‚ɃJƒEƒ“ƒ^[‚̃XƒNƒŠƒvƒg•Ï”‚©‚ç‚Ì“Ç‚Ýo‚µ‚Æsd‚ւ̃Zƒbƒg
+ sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER");
+
+ if (night_flag == 1) {
+ char tmpstr[1024];
+ strcpy(tmpstr, msg_txt(500)); // Actually, it's the night...
+ clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
+ sd->opt2 |= STATE_BLIND;
+ }
+
+ // ƒXƒe[ƒ^ƒX‰ŠúŒvŽZ‚È‚Ç
+ pc_calcstatus(sd,1);
+
+ if (pc_isGM(sd))
+ printf("Connection accepted: character '%s' (account: %d; GM level %d).\n", sd->status.name, sd->status.account_id, pc_isGM(sd));
+ else
+ printf("Connection accepted: Character '%s' (account: %d).\n", sd->status.name, sd->status.account_id);
+
+ //printf("pc: OnPCLogin event done. (%d events)\n", npc_event_doall("OnPCLogin") );
+ if (npc_name2id("PCLoginEvent"))
+ run_script(npc_name2id("PCLoginEvent")->u.scr.script,0,sd->bl.id,npc_name2id("PCLoginEvent")->bl.id); // PCLoginNPC
+ // Send friends list
+ clif_friends_list_send(sd);
+
+ // Message of the Day‚Ì‘—M
+ {
+ char buf[256];
+ FILE *fp;
+ if ((fp = fopen(motd_txt, "r")) != NULL) {
+ while (fgets(buf, sizeof(buf)-1, fp) != NULL) {
+ int i;
+ for(i=0; buf[i]; i++) {
+ if (buf[i] == '\r' || buf[i]== '\n') {
+ buf[i] = 0;
+ break;
+ }
+ }
+ clif_displaymessage(sd->fd, buf);
+ }
+ fclose(fp);
+ }
+ }
+
+#ifndef TXT_ONLY
+ if(battle_config.mail_system)
+ mail_check(sd,1); // check mail at login [Valaris]
+#endif
+
+ // message of the limited time of the account
+ if (connect_until_time != 0) { // don't display if it's unlimited or unknow value
+ char tmpstr[1024];
+ strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), localtime(&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S."
+ clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * session id‚É–â‘è‚ ‚è‚È‚Ì‚ÅŒãŽn––
+ *------------------------------------------
+ */
+int pc_authfail(int id) {
+ struct map_session_data *sd;
+
+ sd = map_id2sd(id);
+ if (sd == NULL)
+ return 1;
+
+ clif_authfail_fd(sd->fd, 0);
+
+ return 0;
+}
+
+static int pc_calc_skillpoint(struct map_session_data* sd)
+{
+ int i,skill,skill_point=0;
+
+ nullpo_retr(0, sd);
+
+ for(i=1;i<MAX_SKILL;i++){
+ if( (skill = pc_checkskill(sd,i)) > 0) {
+ if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
+ if(!sd->status.skill[i].flag)
+ skill_point += skill;
+ else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
+ skill_point += (sd->status.skill[i].flag - 2);
+ }
+ }
+ }
+ }
+
+ return skill_point;
+}
+
+/*==========================================
+ * Šo‚¦‚ç‚ê‚éƒXƒLƒ‹‚ÌŒvŽZ
+ *------------------------------------------
+ */
+int pc_calc_skilltree(struct map_session_data *sd)
+{
+ int i,id=0,flag;
+ int c=0, s=0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ s_class = pc_calc_base_job(sd->status.class);
+ c = s_class.job;
+ s = (s_class.upper==1) ? 1 : 0 ; //“]¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
+
+ if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) {
+ int skill_point = pc_calc_skillpoint(sd);
+ if(skill_point < 9)
+ c = 0;
+ else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) {
+ switch(c) {
+ case 7:
+ case 14:
+ c = 1;
+ break;
+ case 8:
+ case 15:
+ c = 4;
+ break;
+ case 9:
+ case 16:
+ c = 2;
+ break;
+ case 10:
+ case 18:
+ c = 5;
+ break;
+ case 11:
+ case 19:
+ case 20:
+ c = 3;
+ break;
+ case 12:
+ case 17:
+ c = 6;
+ break;
+ case 4008:
+ case 4015:
+ c = 4002;
+ break;
+ case 4009:
+ case 4016:
+ c = 4005;
+ break;
+ case 4010:
+ case 4017:
+ c = 4003;
+ break;
+ case 4011:
+ case 4019:
+ c = 4006;
+ break;
+ case 4012:
+ case 4020:
+ case 4021:
+ c = 4004;
+ break;
+ case 4013:
+ case 4018:
+ c = 4007;
+ break;
+ case 4030:
+ case 4037:
+ c = 4024;
+ break;
+ case 4031:
+ case 4038:
+ c = 4027;
+ break;
+ case 4032:
+ case 4039:
+ c = 4025;
+ break;
+ case 4033:
+ case 4040:
+ c = 4028;
+ break;
+ case 4034:
+ case 4041:
+ case 4042:
+ c = 4026;
+ break;
+ case 4035:
+ case 4043:
+ c = 4029;
+ break;
+
+ }
+ }
+ }
+
+ for(i=0;i<MAX_SKILL;i++){
+ if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
+ if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
+ sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{“–‚Ìlv‚É
+ sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
+ }
+ }
+
+ if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
+ // ‘S‚ẴXƒLƒ‹
+ for(i=1;i<158;i++)
+ sd->status.skill[i].id=i;
+ for(i=210;i<291;i++)
+ sd->status.skill[i].id=i;
+ for(i=304;i<337;i++){
+ if(i==331) continue;
+ sd->status.skill[i].id=i;
+ }
+ if(battle_config.enable_upper_class){ //conf‚Å–³Œø‚Å‚È‚¯‚ê‚Γǂݞ‚Þ
+ for(i=355;i<MAX_SKILL;i++)
+ sd->status.skill[i].id=i;
+ }
+ }else{
+ // ’Êí‚ÌŒvŽZ
+ do{
+ flag=0;
+ for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
+ int j,f=1;
+ if(!battle_config.skillfree) {
+ for(j=0;j<5;j++) {
+ if( skill_tree[s][c][i].need[j].id &&
+ pc_checkskill(sd,skill_tree[s][c][i].need[j].id) < skill_tree[s][c][i].need[j].lv)
+ f=0;
+ }
+ }
+ if(f && sd->status.skill[id].id==0 ){
+ sd->status.skill[id].id=id;
+ flag=1;
+ }
+ }
+ }while(flag);
+ }
+// if(battle_config.etc_log)
+// printf("calc skill_tree\n");
+ return 0;
+}
+
+/*==========================================
+ * d—ʃAƒCƒRƒ“‚ÌŠm”F
+ *------------------------------------------
+ */
+int pc_checkweighticon(struct map_session_data *sd)
+{
+ int flag=0;
+
+ nullpo_retr(0, sd);
+
+ if(sd->weight*2 >= sd->max_weight)
+ flag=1;
+ if(sd->weight*10 >= sd->max_weight*9)
+ flag=2;
+
+ if(flag==1){
+ if(sd->sc_data[SC_WEIGHT50].timer==-1)
+ skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0);
+ }else{
+ skill_status_change_end(&sd->bl,SC_WEIGHT50,-1);
+ }
+ if(flag==2){
+ if(sd->sc_data[SC_WEIGHT90].timer==-1)
+ skill_status_change_start(&sd->bl,SC_WEIGHT90,0,0,0,0,0,0);
+ }else{
+ skill_status_change_end(&sd->bl,SC_WEIGHT90,-1);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒpƒ‰ƒ[ƒ^ŒvŽZ
+ * first==0‚ÌŽžAŒvŽZ‘Îۂ̃pƒ‰ƒ[ƒ^‚ªŒÄ‚Ño‚µ‘O‚©‚ç
+ * •Ï ‰»‚µ‚½ê‡Ž©“®‚Åsend‚·‚邪A
+ * ”\“®“I‚ɕω»‚³‚¹‚½ƒpƒ‰ƒ[ƒ^‚ÍŽ©‘O‚Åsend‚·‚é‚悤‚É
+ *------------------------------------------
+ */
+int pc_calcstatus(struct map_session_data* sd,int first)
+{
+ int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee;
+ int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class;
+ int b_base_atk;
+ struct skill b_skill[MAX_SKILL];
+ int i,bl,index;
+ int skill,aspd_rate,wele,wele_,def_ele,refinedef=0;
+ int pele=0,pdef_ele=0;
+ int str,dstr,dex;
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ s_class = pc_calc_base_job(sd->status.class);
+
+ b_speed = sd->speed;
+ b_max_hp = sd->status.max_hp;
+ b_max_sp = sd->status.max_sp;
+ b_hp = sd->status.hp;
+ b_sp = sd->status.sp;
+ b_weight = sd->weight;
+ b_max_weight = sd->max_weight;
+ memcpy(b_paramb,&sd->paramb,sizeof(b_paramb));
+ memcpy(b_parame,&sd->paramc,sizeof(b_parame));
+ memcpy(b_skill,&sd->status.skill,sizeof(b_skill));
+ b_hit = sd->hit;
+ b_flee = sd->flee;
+ b_aspd = sd->aspd;
+ b_watk = sd->watk;
+ b_def = sd->def;
+ b_watk2 = sd->watk2;
+ b_def2 = sd->def2;
+ b_flee2 = sd->flee2;
+ b_critical = sd->critical;
+ b_attackrange = sd->attackrange;
+ b_matk1 = sd->matk1;
+ b_matk2 = sd->matk2;
+ b_mdef = sd->mdef;
+ b_mdef2 = sd->mdef2;
+ b_class = sd->view_class;
+ sd->view_class = sd->status.class;
+ b_base_atk = sd->base_atk;
+
+ pc_calc_skilltree(sd); // ƒXƒLƒ‹ƒcƒŠ[‚ÌŒvŽZ
+
+ sd->max_weight = max_weight_base[s_class.job]+sd->status.str*300;
+
+ if(first&1) {
+ sd->weight=0;
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL)
+ continue;
+ sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount;
+ }
+ sd->cart_max_weight=battle_config.max_cart_weight;
+ sd->cart_weight=0;
+ sd->cart_max_num=MAX_CART;
+ sd->cart_num=0;
+ for(i=0;i<MAX_CART;i++){
+ if(sd->status.cart[i].nameid==0)
+ continue;
+ sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount;
+ sd->cart_num++;
+ }
+ }
+
+ memset(sd->paramb,0,sizeof(sd->paramb));
+ memset(sd->parame,0,sizeof(sd->parame));
+ sd->hit = 0;
+ sd->flee = 0;
+ sd->flee2 = 0;
+ sd->critical = 0;
+ sd->aspd = 0;
+ sd->watk = 0;
+ sd->def = 0;
+ sd->mdef = 0;
+ sd->watk2 = 0;
+ sd->def2 = 0;
+ sd->mdef2 = 0;
+ sd->status.max_hp = 0;
+ sd->status.max_sp = 0;
+ sd->attackrange = 0;
+ sd->attackrange_ = 0;
+ sd->atk_ele = 0;
+ sd->def_ele = 0;
+ sd->star =0;
+ sd->overrefine =0;
+ sd->matk1 =0;
+ sd->matk2 =0;
+ sd->speed = DEFAULT_WALK_SPEED ;
+ sd->hprate=100;
+ sd->sprate=100;
+ sd->castrate=100;
+ sd->dsprate=100;
+ sd->base_atk=0;
+ sd->arrow_atk=0;
+ sd->arrow_ele=0;
+ sd->arrow_hit=0;
+ sd->arrow_range=0;
+ sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0;
+ memset(sd->addele,0,sizeof(sd->addele));
+ memset(sd->addrace,0,sizeof(sd->addrace));
+ memset(sd->addsize,0,sizeof(sd->addsize));
+ memset(sd->addele_,0,sizeof(sd->addele_));
+ memset(sd->addrace_,0,sizeof(sd->addrace_));
+ memset(sd->addsize_,0,sizeof(sd->addsize_));
+ memset(sd->subele,0,sizeof(sd->subele));
+ memset(sd->subrace,0,sizeof(sd->subrace));
+ memset(sd->addeff,0,sizeof(sd->addeff));
+ memset(sd->addeff2,0,sizeof(sd->addeff2));
+ memset(sd->reseff,0,sizeof(sd->reseff));
+ memset(&sd->special_state,0,sizeof(sd->special_state));
+ memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
+ memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
+
+ sd->watk_ = 0; //“ñ“—¬—p(‰¼)
+ sd->watk_2 = 0;
+ sd->atk_ele_ = 0;
+ sd->star_ = 0;
+ sd->overrefine_ = 0;
+
+ sd->aspd_rate = 100;
+ sd->speed_rate = 100;
+ sd->hprecov_rate = 100;
+ sd->sprecov_rate = 100;
+ sd->critical_def = 0;
+ sd->double_rate = 0;
+ sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
+ sd->atk_rate = sd->matk_rate = 100;
+ sd->ignore_def_ele = sd->ignore_def_race = 0;
+ sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
+ sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
+ sd->arrow_cri = 0;
+ sd->magic_def_rate = sd->misc_def_rate = 0;
+ memset(sd->arrow_addele,0,sizeof(sd->arrow_addele));
+ memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace));
+ memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize));
+ memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff));
+ memset(sd->arrow_addeff2,0,sizeof(sd->arrow_addeff2));
+ memset(sd->magic_addele,0,sizeof(sd->magic_addele));
+ memset(sd->magic_addrace,0,sizeof(sd->magic_addrace));
+ memset(sd->magic_subrace,0,sizeof(sd->magic_subrace));
+ sd->perfect_hit = 0;
+ sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
+ sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
+ sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
+ sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
+ sd->get_zeny_num = 0;
+ sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
+ sd->add_def_class_count = sd->add_mdef_class_count = 0;
+ sd->monster_drop_item_count = 0;
+ memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
+ memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
+ memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
+ memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
+ memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
+ memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race));
+ memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate));
+ sd->speed_add_rate = sd->aspd_add_rate = 100;
+ sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
+ sd->splash_range = sd->splash_add_range = 0;
+ sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
+ sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0;
+ sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0;
+ sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
+ sd->magic_damage_return = 0; //AppleGirl Was Here
+ sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
+
+ if(!sd->disguiseflag && sd->disguise) {
+ sd->disguise=0;
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+ clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
+ clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
+ clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
+ clif_clearchar(&sd->bl, 9);
+ pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
+ }
+
+ for(i=0;i<10;i++) {
+ index = sd->equip_index[i];
+ if(index < 0)
+ continue;
+ if(i == 9 && sd->equip_index[8] == index)
+ continue;
+ if(i == 5 && sd->equip_index[4] == index)
+ continue;
+ if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
+ continue;
+
+ if(sd->inventory_data[index]) {
+ if(sd->inventory_data[index]->type == 4) {
+ if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
+ int j;
+ for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ[ƒh
+ int c=sd->status.inventory[index].card[j];
+ if(c>0){
+ if(i == 8 && sd->status.inventory[index].equip == 0x20)
+ sd->state.lr_flag = 1;
+ run_script(itemdb_equipscript(c),0,sd->bl.id,0);
+ sd->state.lr_flag = 0;
+ }
+ }
+ }
+ }
+ else if(sd->inventory_data[index]->type==5){ // –h‹ï
+ if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
+ int j;
+ for(j=0;j<sd->inventory_data[index]->slot;j++){ // ƒJ[ƒh
+ int c=sd->status.inventory[index].card[j];
+ if(c>0)
+ run_script(itemdb_equipscript(c),0,sd->bl.id,0);
+ }
+ }
+ }
+ }
+ }
+ wele = sd->atk_ele;
+ wele_ = sd->atk_ele_;
+ def_ele = sd->def_ele;
+ if(sd->status.pet_id > 0) {
+ struct pet_data *pd=sd->pd;
+ if((pd && battle_config.pet_status_support==1) && (battle_config.pet_equip_required==0 || (battle_config.pet_equip_required && pd->equip > 0))) {
+ if(sd->status.pet_id > 0 && sd->petDB && sd->pet.intimate > 0)
+ run_script(sd->petDB->script,0,sd->bl.id,0);
+ pele = sd->atk_ele;
+ pdef_ele = sd->def_ele;
+ sd->atk_ele = sd->def_ele = 0;
+ }
+ }
+ memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard));
+
+ // ‘•”õ•i‚É‚æ‚éƒXƒe[ƒ^ƒX•Ï‰»‚Í‚±‚±‚ÅŽÀs
+ for(i=0;i<10;i++) {
+ index = sd->equip_index[i];
+ if(index < 0)
+ continue;
+ if(i == 9 && sd->equip_index[8] == index)
+ continue;
+ if(i == 5 && sd->equip_index[4] == index)
+ continue;
+ if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
+ continue;
+ if(sd->inventory_data[index]) {
+ sd->def += sd->inventory_data[index]->def;
+ if(sd->inventory_data[index]->type == 4) {
+ int r,wlv = sd->inventory_data[index]->wlv;
+ if(i == 8 && sd->status.inventory[index].equip == 0x20) {
+ //“ñ“—¬—pƒf[ƒ^“ü—Í
+ sd->watk_ += sd->inventory_data[index]->atk;
+ sd->watk_2 = (r=sd->status.inventory[index].refine)* // ¸˜BUŒ‚—Í
+ refinebonus[wlv][0];
+ if( (r-=refinebonus[wlv][2])>0 ) // ‰ß踘Bƒ{[ƒiƒX
+ sd->overrefine_ = r*refinebonus[wlv][1];
+
+ if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
+ sd->star_ = (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
+ wele_= (sd->status.inventory[index].card[1]&0x0f); // ‘® «
+ }
+ sd->attackrange_ += sd->inventory_data[index]->range;
+ sd->state.lr_flag = 1;
+ run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
+ sd->state.lr_flag = 0;
+ }
+ else { //“ñ“—¬•ŠíˆÈŠO
+ sd->watk += sd->inventory_data[index]->atk;
+ sd->watk2 += (r=sd->status.inventory[index].refine)* // ¸˜BUŒ‚—Í
+ refinebonus[wlv][0];
+ if( (r-=refinebonus[wlv][2])>0 ) // ‰ß踘Bƒ{[ƒiƒX
+ sd->overrefine += r*refinebonus[wlv][1];
+
+ if(sd->status.inventory[index].card[0]==0x00ff){ // »‘¢•Ší
+ sd->star += (sd->status.inventory[index].card[1]>>8); // ¯‚Ì‚©‚¯‚ç
+ wele = (sd->status.inventory[index].card[1]&0x0f); // ‘® «
+ }
+ sd->attackrange += sd->inventory_data[index]->range;
+ run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
+ }
+ }
+ else if(sd->inventory_data[index]->type == 5) {
+ sd->watk += sd->inventory_data[index]->atk;
+ refinedef += sd->status.inventory[index].refine*refinebonus[0][0];
+ run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
+ }
+ }
+ }
+
+ if(sd->equip_index[10] >= 0){ // –î
+ index = sd->equip_index[10];
+ if(sd->inventory_data[index]){ //‚Ü‚¾‘®«‚ª“ü‚Á‚Ä‚¢‚È‚¢
+ sd->state.lr_flag = 2;
+ run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
+ sd->state.lr_flag = 0;
+ sd->arrow_atk += sd->inventory_data[index]->atk;
+ }
+ }
+ sd->def += (refinedef+50)/100;
+
+ if(sd->attackrange < 1) sd->attackrange = 1;
+ if(sd->attackrange_ < 1) sd->attackrange_ = 1;
+ if(sd->attackrange < sd->attackrange_)
+ sd->attackrange = sd->attackrange_;
+ if(sd->status.weapon == 11)
+ sd->attackrange += sd->arrow_range;
+ if(wele > 0)
+ sd->atk_ele = wele;
+ if(wele_ > 0)
+ sd->atk_ele_ = wele_;
+ if(def_ele > 0)
+ sd->def_ele = def_ele;
+ if(battle_config.pet_status_support) {
+ if(pele > 0 && !sd->atk_ele)
+ sd->atk_ele = pele;
+ if(pdef_ele > 0 && !sd->def_ele)
+ sd->def_ele = pdef_ele;
+ }
+ sd->double_rate += sd->double_add_rate;
+ sd->perfect_hit += sd->perfect_hit_add;
+ sd->get_zeny_num += sd->get_zeny_add_num;
+ sd->splash_range += sd->splash_add_range;
+ if(sd->speed_add_rate != 100)
+ sd->speed_rate += sd->speed_add_rate - 100;
+ if(sd->aspd_add_rate != 100)
+ sd->aspd_rate += sd->aspd_add_rate - 100;
+
+ // •ŠíATKƒTƒCƒY•â³ (‰EŽè)
+ sd->atkmods[0] = atkmods[0][sd->weapontype1];
+ sd->atkmods[1] = atkmods[1][sd->weapontype1];
+ sd->atkmods[2] = atkmods[2][sd->weapontype1];
+ //•ŠíATKƒTƒCƒY•â³ (¶Žè)
+ sd->atkmods_[0] = atkmods[0][sd->weapontype2];
+ sd->atkmods_[1] = atkmods[1][sd->weapontype2];
+ sd->atkmods_[2] = atkmods[2][sd->weapontype2];
+
+ // jobƒ{[ƒiƒX•ª
+ for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
+ if(job_bonus[s_class.upper][s_class.job][i])
+ sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
+ }
+
+ if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris]
+ sd->max_weight += skill*1000;
+
+ if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // ‚Ó‚­‚낤‚Ì–Ú
+ sd->paramb[4] += skill;
+
+ if((skill=pc_checkskill(sd,BS_HILTBINDING))>0) { // Hilt binding gives +1 str +4 atk
+ sd->paramb[4] ++;
+ sd->base_atk += 4;
+ }
+
+ // ƒXƒe[ƒ^ƒX•Ï‰»‚É‚æ‚éŠî–{ƒpƒ‰ƒ[ƒ^•â³
+ if(sd->sc_count){
+ if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // W’†—ÍŒüã
+ sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
+ sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
+ }
+ if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // ‘¬“x‘‰Á
+ sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
+ sd->speed -= sd->speed *25/100;
+ }
+ if(sd->sc_data[SC_DECREASEAGI].timer!=-1) // ‘¬“xŒ¸­(agi‚Íbattle.c‚Å)
+ sd->speed = sd->speed *125/100;
+ if(sd->sc_data[SC_CLOAKING].timer!=-1)
+ sd->speed = (sd->speed*(76+(sd->sc_data[SC_INCREASEAGI].val1*3)))/100;
+ if(sd->sc_data[SC_CHASEWALK].timer!=-1)
+ sd->speed = sd->speed*(135-sd->sc_data[SC_CHASEWALK].val1*5)/100; // slow down by chasewalk
+ if(sd->sc_data[SC_BLESSING].timer!=-1){ // ƒuƒŒƒbƒVƒ“ƒO
+ sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
+ sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
+ sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1;
+ }
+ if(sd->sc_data[SC_GLORIA].timer!=-1) // ƒOƒƒŠƒA
+ sd->paramb[5]+= 30;
+ if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ƒ‰ƒEƒhƒ{ƒCƒX
+ sd->paramb[0]+= 4;
+ if(sd->sc_data[SC_QUAGMIRE].timer!=-1){ // ƒNƒ@ƒOƒ}ƒCƒA
+ sd->speed = sd->speed*3/2;
+ int agib = (sd->status.agi+sd->paramb[1]+sd->parame[1])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
+ int dexb = (sd->status.dex+sd->paramb[4]+sd->parame[4])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
+ sd->paramb[1]-= agib > 50 ? 50 : agib;
+ sd->paramb[4]-= dexb > 50 ? 50 : dexb;
+ }
+ if(sd->sc_data[SC_TRUESIGHT].timer!=-1){ // ƒgƒDƒ‹[ƒTƒCƒg
+ sd->paramb[0]+= 5;
+ sd->paramb[1]+= 5;
+ sd->paramb[2]+= 5;
+ sd->paramb[3]+= 5;
+ sd->paramb[4]+= 5;
+ sd->paramb[5]+= 5;
+ }
+ if(sd->sc_data[SC_MARIONETTE].timer!=-1){
+ sd->paramb[0]-= (sd->status.str+sd->paramb[0]+sd->parame[0])/2;
+ sd->paramb[1]-= (sd->status.agi+sd->paramb[1]+sd->parame[1])/2;
+ sd->paramb[2]-= (sd->status.vit+sd->paramb[2]+sd->parame[2])/2;
+ sd->paramb[3]-= (sd->status.int_+sd->paramb[3]+sd->parame[3])/2;
+ sd->paramb[4]-= (sd->status.dex+sd->paramb[4]+sd->parame[4])/2;
+ sd->paramb[5]-= (sd->status.luk+sd->paramb[5]+sd->parame[5])/2;
+ }
+ }
+
+ //1“x‚àŽ€‚ñ‚Å‚È‚¢Job70ƒXƒpƒmƒr‚É+10
+ if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){
+ sd->paramb[0]+= 15;
+ sd->paramb[1]+= 15;
+ sd->paramb[2]+= 15;
+ sd->paramb[3]+= 15;
+ sd->paramb[4]+= 15;
+ sd->paramb[5]+= 15;
+ }
+ sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0];
+ sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1];
+ sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2];
+ sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3];
+ sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4];
+ sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5];
+ for(i=0;i<6;i++)
+ if(sd->paramc[i] < 0) sd->paramc[i] = 0;
+
+ if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) {
+ str = sd->paramc[4];
+ dex = sd->paramc[0];
+ }
+ else {
+ str = sd->paramc[0];
+ dex = sd->paramc[4];
+ }
+ dstr = str/10;
+ sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5;
+ sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5);
+ sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7);
+ if(sd->matk1 < sd->matk2) {
+ int temp = sd->matk2;
+ sd->matk2 = sd->matk1;
+ sd->matk1 = temp;
+ }
+ sd->hit += sd->paramc[4] + sd->status.base_level;
+ sd->flee += sd->paramc[1] + sd->status.base_level;
+ sd->def2 += sd->paramc[2];
+ sd->mdef2 += sd->paramc[3];
+ sd->flee2 += sd->paramc[5]+10;
+ sd->critical += (sd->paramc[5]*3)+10;
+
+ if(sd->base_atk < 1)
+ sd->base_atk = 1;
+ if(sd->critical_rate != 100)
+ sd->critical = (sd->critical*sd->critical_rate)/100;
+ if(sd->critical < 10) sd->critical = 10;
+ if(sd->hit_rate != 100)
+ sd->hit = (sd->hit*sd->hit_rate)/100;
+ if(sd->hit < 1) sd->hit = 1;
+ if(sd->flee_rate != 100)
+ sd->flee = (sd->flee*sd->flee_rate)/100;
+ if(sd->flee < 1) sd->flee = 1;
+ if(sd->flee2_rate != 100)
+ sd->flee2 = (sd->flee2*sd->flee2_rate)/100;
+ if(sd->flee2 < 10) sd->flee2 = 10;
+ if(sd->def_rate != 100)
+ sd->def = (sd->def*sd->def_rate)/100;
+ if(sd->def < 0) sd->def = 0;
+ if(sd->def2_rate != 100)
+ sd->def2 = (sd->def2*sd->def2_rate)/100;
+ if(sd->def2 < 1) sd->def2 = 1;
+ if(sd->mdef_rate != 100)
+ sd->mdef = (sd->mdef*sd->mdef_rate)/100;
+ if(sd->mdef < 0) sd->mdef = 0;
+ if(sd->mdef2_rate != 100)
+ sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100;
+ if(sd->mdef2 < 1) sd->mdef2 = 1;
+
+ // “ñ“—¬ ASPD C³
+ if (sd->status.weapon <= 16)
+ sd->aspd += aspd_base[s_class.job][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->status.weapon]/1000;
+ else
+ sd->aspd += (
+ (aspd_base[s_class.job][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype1]/1000) +
+ (aspd_base[s_class.job][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype2]/1000)
+ ) * 140 / 200;
+
+ aspd_rate = sd->aspd_rate;
+
+ //UŒ‚‘¬“x‘‰Á
+
+ if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // ƒƒV‚Ì–Ú
+ sd->hit += skill;
+ if(sd->status.weapon == 11)
+ sd->attackrange += skill;
+ }
+
+ if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // •ŠíŒ¤‹†‚Ì–½’†—¦‘‰Á
+ sd->hit += skill*2;
+ if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu // ƒgƒ“ƒlƒ‹ƒhƒ‰ƒCƒu
+ sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
+ if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // ƒJ[ƒg‚É‚æ‚鑬“x’ቺ
+ sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1);
+ else if (pc_isriding(sd)) { // ƒyƒRƒyƒRæ‚è‚É‚æ‚鑬“x‘‰Á
+ sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
+ sd->max_weight += 10000;
+ }
+ if(sd->sc_count){
+ if(sd->sc_data[SC_WINDWALK].timer!=-1) //ƒEƒBƒ“ƒhƒEƒH[ƒNŽž‚ÍLv*2%Œ¸ŽZ
+ sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
+ if(sd->sc_data[SC_CARTBOOST].timer!=-1) // ƒJ[ƒgƒu[ƒXƒg
+ sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
+ if(sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚ÍIA‚Æ“¯‚¶‚®‚ç‚¢‘¬‚¢H
+ sd->speed -= sd->speed *25/100;
+ if(sd->sc_data[SC_WEDDING].timer!=-1) //Œ‹¥’†‚Í•à‚­‚Ì‚ª’x‚¢
+ sd->speed = 2*DEFAULT_WALK_SPEED;
+ }
+
+ if((skill=pc_checkskill(sd,CR_TRUST))>0) { // ƒtƒFƒCƒX
+ sd->status.max_hp += skill*200;
+ sd->subele[6] += skill*5;
+ }
+ if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0)
+ {
+ sd->subele[0] += skill;
+ sd->subele[3] += skill*5;
+ }
+
+ bl=sd->status.base_level;
+
+ sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
+ if (s_class.upper==1) // [MouseJstr]
+ sd->status.max_hp = sd->status.max_hp * 130/100;
+ if(sd->hprate!=100)
+ sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
+
+ if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1){ // ƒo[ƒT[ƒN
+ sd->status.max_hp = sd->status.max_hp * 3;
+ sd->status.hp = sd->status.hp * 3;
+ if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
+ sd->status.max_hp = battle_config.max_hp;
+ if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
+ sd->status.hp = battle_config.max_hp;
+ }
+ if(s_class.job == 23 && sd->status.base_level >= 99){
+ sd->status.max_hp = sd->status.max_hp + 2000;
+ }
+
+ if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
+ sd->status.max_hp = battle_config.max_hp;
+ if(sd->status.max_hp <= 0) sd->status.max_hp = 1; // end
+
+ // Å‘åSPŒvŽZ
+ sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
+ if (s_class.upper==1) // [MouseJstr]
+ sd->status.max_sp = sd->status.max_sp * 130/100;
+ if(sd->sprate!=100)
+ sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
+
+ if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ƒƒfƒBƒeƒCƒeƒBƒI
+ sd->status.max_sp += sd->status.max_sp*skill/100;
+ if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) /* ƒ\ƒEƒ‹ƒhƒŒƒCƒ“ */
+ sd->status.max_sp += sd->status.max_sp*2*skill/100;
+
+ if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
+ sd->status.max_sp = battle_config.max_sp;
+
+ //Ž©‘R‰ñ•œHP
+ sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200);
+ if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) { /* HP‰ñ•œ—ÍŒüã */
+ sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500);
+ if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff;
+ }
+ //Ž©‘R‰ñ•œSP
+ sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100);
+ if(sd->paramc[3] >= 120)
+ sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4;
+ if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) { /* SP‰ñ•œ—ÍŒüã */
+ sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500);
+ if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff;
+ }
+
+ if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) {
+ sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500);
+ sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500);
+ if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff;
+ if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff;
+ }
+ if(sd->hprecov_rate != 100) {
+ sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100;
+ if(sd->nhealhp < 1) sd->nhealhp = 1;
+ }
+ if(sd->sprecov_rate != 100) {
+ sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
+ if(sd->nhealsp < 1) sd->nhealsp = 1;
+ }
+ if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // ƒƒfƒBƒeƒCƒeƒBƒI‚ÍSPR‚Å‚Í‚È‚­Ž©‘R‰ñ•œ‚É‚©‚©‚é
+ sd->nhealsp += 3*skill*(sd->status.max_sp)/100;
+ if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff;
+ }
+
+ // Ží‘°‘Ï«i‚±‚ê‚Å‚¢‚¢‚ÌH ƒfƒBƒoƒCƒ“ƒvƒƒeƒNƒVƒ‡ƒ“‚Æ“¯‚¶ˆ—‚ª‚¢‚é‚©‚àj
+ if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ƒhƒ‰ƒSƒmƒƒW[
+ skill = skill*4;
+ sd->addrace[9]+=skill;
+ sd->addrace_[9]+=skill;
+ sd->subrace[9]+=skill;
+ sd->magic_addrace[9]+=skill;
+ sd->magic_subrace[9]-=skill;
+ }
+
+ //Fleeã¸
+ if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // ‰ñ”𗦑‰Á
+ if(sd->status.class==6||sd->status.class==4007 || sd->status.class==23){
+ sd->flee += skill*3;
+ }
+ if(sd->status.class==12||sd->status.class==17||sd->status.class==4013||sd->status.class==4018)
+ sd->flee += skill*4;
+ if(sd->status.class==12||sd->status.class==4013)
+ sd->speed -= sd->speed *(skill*1.5)/100;
+ }
+ if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // Œ©Ø‚è
+ sd->flee += (skill*3)>>1;
+
+ // ƒXƒLƒ‹‚âƒXƒe[ƒ^ƒXˆÙí‚É‚æ‚éŽc‚è‚̃pƒ‰ƒ[ƒ^•â³
+ if(sd->sc_count){
+ // ATK/DEF•Ï‰»Œ`
+ if(sd->sc_data[SC_ANGELUS].timer!=-1) // ƒGƒ“ƒWƒFƒ‰ƒX
+ sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100;
+ if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX
+ sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
+ sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5;
+ }
+ if(sd->sc_data[SC_PROVOKE].timer!=-1){ // ƒvƒƒ{ƒbƒN
+ sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100;
+ sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
+ sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
+ sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
+ }
+ if(sd->sc_data[SC_ENDURE].timer!=-1)
+ sd->mdef2 += sd->sc_data[SC_ENDURE].val1;
+ if(sd->sc_data[SC_MINDBREAKER].timer!=-1){ // ƒvƒƒ{ƒbƒN
+ sd->mdef2 = sd->mdef2*(100-6*sd->sc_data[SC_MINDBREAKER].val1)/100;
+ sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
+ sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
+ }
+ if(sd->sc_data[SC_POISON].timer!=-1) // “Åó‘Ô
+ sd->def2 = sd->def2*75/100;
+ if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // 푾ŒÛ‚Ì‹¿‚«
+ sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
+ sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
+ sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
+ }
+ if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ƒj[ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö
+ index = sd->equip_index[9];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
+ sd->watk += sd->sc_data[SC_NIBELUNGEN].val3;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
+ sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3;
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
+ sd->watk += sd->sc_data[SC_NIBELUNGEN].val2;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
+ sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2;
+ }
+
+ if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ƒ{ƒ‹ƒP[ƒm
+ sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
+ }
+
+ if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
+ sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100;
+ if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // ƒGƒ^[ƒiƒ‹ƒJƒIƒX
+ sd->def=0;
+
+ if(sd->sc_data[SC_CONCENTRATION].timer!=-1){ //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ sd->watk = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
+ index = sd->equip_index[8];
+ if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
+ sd->watk_ = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
+ sd->def = sd->def * (100 - 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
+ }
+
+ if(sd->sc_data[SC_MAGICPOWER].timer!=-1){ //–‚–@—Í‘•
+ sd->matk1 = sd->matk1*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
+ sd->matk2 = sd->matk2*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
+ }
+ if(sd->sc_data[SC_ATKPOT].timer!=-1)
+ sd->watk += sd->sc_data[SC_ATKPOT].val1;
+ if(sd->sc_data[SC_MATKPOT].timer!=-1){
+ sd->matk1 += sd->sc_data[SC_MATKPOT].val1;
+ sd->matk2 += sd->sc_data[SC_MATKPOT].val1;
+ }
+
+ // ASPD/ˆÚ“®‘¬“x•Ï‰»Œn
+ if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
+ aspd_rate -= 30;
+ if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
+ sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
+ if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly)
+ aspd_rate -= 30;
+ else
+ aspd_rate -= 25;
+ }
+ if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 &&
+ sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // ƒXƒsƒAƒNƒBƒbƒPƒ“
+ aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
+ if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // —[—z‚̃AƒTƒVƒ“ƒNƒƒX
+ sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 &&
+ sd->sc_data[SC_DONTFORGETME].timer == -1)
+ aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3;
+ if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // Ž„‚ð–Y‚ê‚È‚¢‚Å
+ aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16);
+ sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
+ }
+ if( sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 ||
+ sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 ||
+ sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ‘ ‘¬ƒ|[ƒVƒ‡ƒ“
+ aspd_rate -= sd->sc_data[i].val2;
+
+ // HIT/FLEE•Ï‰»Œn
+ if(sd->sc_data[SC_WHISTLE].timer!=-1){ // Œû“J
+ sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
+ +sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100;
+ sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10;
+ }
+ if(sd->sc_data[SC_HUMMING].timer!=-1) // ƒnƒ~ƒ“ƒO
+ sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2
+ +sd->sc_data[SC_HUMMING].val3) * sd->hit/100;
+ if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹
+ sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100;
+ }
+ if(sd->sc_data[SC_BLIND].timer!=-1){ // ˆÃ•
+ sd->hit -= sd->hit*25/100;
+ sd->flee -= sd->flee*25/100;
+ }
+ if(sd->sc_data[SC_WINDWALK].timer!=-1) // ƒEƒBƒ“ƒhƒEƒH[ƒN
+ sd->flee += sd->flee*(sd->sc_data[SC_WINDWALK].val2)/100;
+ if(sd->sc_data[SC_SPIDERWEB].timer!=-1) //ƒXƒpƒCƒ_[ƒEƒFƒu
+ sd->flee -= sd->flee*50/100;
+ if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹[ƒTƒCƒg
+ sd->hit += 3*(sd->sc_data[SC_TRUESIGHT].val1);
+ if(sd->sc_data[SC_CONCENTRATION].timer!=-1) //ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“
+ sd->hit += (10*(sd->sc_data[SC_CONCENTRATION].val1));
+
+ // ‘Ï«
+ if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // •sŽ€g‚̃W[ƒNƒtƒŠ[ƒh
+ sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // ‰Î
+ sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // …
+ }
+ if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // ƒvƒƒ”ƒBƒfƒ“ƒX
+ sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ‘Î ¹‘®«
+ sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ‘Î ˆ«–‚
+ }
+
+ // ‚»‚Ì‘¼
+ if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // ƒCƒhƒDƒ“‚Ì—ÑŒç
+ sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1)
+ +sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100;
+ if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
+ sd->status.max_hp = battle_config.max_hp;
+ }
+ if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // ƒfƒŠƒ…[ƒW
+ sd->status.max_hp += sd->status.max_hp*sd->sc_data[SC_DELUGE].val3/100;
+ if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
+ sd->status.max_hp = battle_config.max_hp;
+ }
+ if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // ƒT[ƒrƒXƒtƒH[ƒ†[
+ sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2
+ +sd->sc_data[SC_SERVICE4U].val3)/100;
+ if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
+ sd->status.max_sp = battle_config.max_sp;
+ sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2
+ +sd->sc_data[SC_SERVICE4U].val3);
+ if(sd->dsprate<0)sd->dsprate=0;
+ }
+
+ if(sd->sc_data[SC_FORTUNE].timer!=-1) // K‰^‚̃LƒX
+ sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2
+ +sd->sc_data[SC_FORTUNE].val3)*10;
+
+ if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1){ // ”š—ô”g“®
+ if(s_class.job==23)
+ sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1*100;
+ else
+ sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
+ }
+
+ if(sd->sc_data[SC_STEELBODY].timer!=-1){ // ‹à„
+ sd->def = 90;
+ sd->mdef = 90;
+ aspd_rate += 25;
+ sd->speed = (sd->speed * 125) / 100;
+ }
+ if(sd->sc_data[SC_DEFENDER].timer != -1) {
+ sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50);
+ sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
+ }
+ if(sd->sc_data[SC_ENCPOISON].timer != -1)
+ sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
+
+ if( sd->sc_data[SC_DANCING].timer!=-1 ){ // ‰‰‘t/ƒ_ƒ“ƒXŽg—p’†
+ sd->speed*=4;
+ sd->nhealsp = 0;
+ sd->nshealsp = 0;
+ sd->nsshealsp = 0;
+ }
+ if(sd->sc_data[SC_CURSE].timer!=-1)
+ sd->speed += 450;
+
+ if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ƒgƒDƒ‹[ƒTƒCƒg
+ sd->critical += sd->critical*(sd->sc_data[SC_TRUESIGHT].val1)/100;
+
+/* if(sd->sc_data[SC_VOLCANO].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(‘®«‚Íbattle.c‚Å)
+ sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
+ if(sd->sc_data[SC_DELUGE].timer!=-1) // ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“(‘®«‚Íbattle.c‚Å)
+ sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
+ */
+ if(sd->sc_data[SC_KEEPING].timer!=-1)
+ sd->def = 100;
+ if(sd->sc_data[SC_BARRIER].timer!=-1)
+ sd->mdef = 100;
+ }
+
+ if(sd->speed_rate != 100)
+ sd->speed = sd->speed*sd->speed_rate/100;
+ if(sd->speed < 1) sd->speed = 1;
+ if(aspd_rate != 100)
+ sd->aspd = sd->aspd*aspd_rate/100;
+ if(pc_isriding(sd)) // ‹R•ºC—û
+ sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100;
+ if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd;
+ sd->amotion = sd->aspd;
+ sd->dmotion = 800-sd->paramc[1]*4;
+ if(sd->dmotion<400)
+ sd->dmotion = 400;
+ if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
+ sd->prev_speed = sd->speed;
+ sd->speed = sd->speed*(175 - skill*5)/100;
+ }
+
+ if(sd->status.hp>sd->status.max_hp)
+ sd->status.hp=sd->status.max_hp;
+ if(sd->status.sp>sd->status.max_sp)
+ sd->status.sp=sd->status.max_sp;
+
+ if(first&4)
+ return 0;
+ if(first&3) {
+ clif_updatestatus(sd,SP_SPEED);
+ clif_updatestatus(sd,SP_MAXHP);
+ clif_updatestatus(sd,SP_MAXSP);
+ if(first&1) {
+ clif_updatestatus(sd,SP_HP);
+ clif_updatestatus(sd,SP_SP);
+ }
+ return 0;
+ }
+
+ if(b_class != sd->view_class) {
+ clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
+#if PACKETVER < 4
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+#else
+ clif_changelook(&sd->bl,LOOK_WEAPON,0);
+#endif
+ }
+
+ if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange)
+ clif_skillinfoblock(sd); // ƒXƒLƒ‹‘—M
+
+ if(b_speed != sd->speed)
+ clif_updatestatus(sd,SP_SPEED);
+ if(b_weight != sd->weight)
+ clif_updatestatus(sd,SP_WEIGHT);
+ if(b_max_weight != sd->max_weight) {
+ clif_updatestatus(sd,SP_MAXWEIGHT);
+ pc_checkweighticon(sd);
+ }
+ for(i=0;i<6;i++)
+ if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
+ clif_updatestatus(sd,SP_STR+i);
+ if(b_hit != sd->hit)
+ clif_updatestatus(sd,SP_HIT);
+ if(b_flee != sd->flee)
+ clif_updatestatus(sd,SP_FLEE1);
+ if(b_aspd != sd->aspd)
+ clif_updatestatus(sd,SP_ASPD);
+ if(b_watk != sd->watk || b_base_atk != sd->base_atk)
+ clif_updatestatus(sd,SP_ATK1);
+ if(b_def != sd->def)
+ clif_updatestatus(sd,SP_DEF1);
+ if(b_watk2 != sd->watk2)
+ clif_updatestatus(sd,SP_ATK2);
+ if(b_def2 != sd->def2)
+ clif_updatestatus(sd,SP_DEF2);
+ if(b_flee2 != sd->flee2)
+ clif_updatestatus(sd,SP_FLEE2);
+ if(b_critical != sd->critical)
+ clif_updatestatus(sd,SP_CRITICAL);
+ if(b_matk1 != sd->matk1)
+ clif_updatestatus(sd,SP_MATK1);
+ if(b_matk2 != sd->matk2)
+ clif_updatestatus(sd,SP_MATK2);
+ if(b_mdef != sd->mdef)
+ clif_updatestatus(sd,SP_MDEF1);
+ if(b_mdef2 != sd->mdef2)
+ clif_updatestatus(sd,SP_MDEF2);
+ if(b_attackrange != sd->attackrange)
+ clif_updatestatus(sd,SP_ATTACKRANGE);
+ if(b_max_hp != sd->status.max_hp)
+ clif_updatestatus(sd,SP_MAXHP);
+ if(b_max_sp != sd->status.max_sp)
+ clif_updatestatus(sd,SP_MAXSP);
+ if(b_hp != sd->status.hp)
+ clif_updatestatus(sd,SP_HP);
+ if(b_sp != sd->status.sp)
+ clif_updatestatus(sd,SP_SP);
+
+/* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
+ before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
+ clif_updatestatus(sd,SP_CARTINFO);*/
+
+ if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
+ (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd))
+ // ƒI[ƒgƒo[ƒT[ƒN”­“®
+ skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘• ”õ•i‚É‚æ‚é”\—Í“™‚̃{[ƒiƒXÝ’è
+ *------------------------------------------
+ */
+int pc_bonus(struct map_session_data *sd,int type,int val)
+{
+ nullpo_retr(0, sd);
+
+ switch(type){
+ case SP_STR:
+ case SP_AGI:
+ case SP_VIT:
+ case SP_INT:
+ case SP_DEX:
+ case SP_LUK:
+ if(sd->state.lr_flag != 2)
+ sd->parame[type-SP_STR]+=val;
+ break;
+ case SP_ATK1:
+ if(!sd->state.lr_flag)
+ sd->watk+=val;
+ else if(sd->state.lr_flag == 1)
+ sd->watk_+=val;
+ break;
+ case SP_ATK2:
+ if(!sd->state.lr_flag)
+ sd->watk2+=val;
+ else if(sd->state.lr_flag == 1)
+ sd->watk_2+=val;
+ break;
+ case SP_BASE_ATK:
+ if(sd->state.lr_flag != 2)
+ sd->base_atk+=val;
+ break;
+ case SP_MATK1:
+ if(sd->state.lr_flag != 2)
+ sd->matk1 += val;
+ break;
+ case SP_MATK2:
+ if(sd->state.lr_flag != 2)
+ sd->matk2 += val;
+ break;
+ case SP_MATK:
+ if(sd->state.lr_flag != 2) {
+ sd->matk1 += val;
+ sd->matk2 += val;
+ }
+ break;
+ case SP_DEF1:
+ if(sd->state.lr_flag != 2)
+ sd->def+=val;
+ break;
+ case SP_MDEF1:
+ if(sd->state.lr_flag != 2)
+ sd->mdef+=val;
+ break;
+ case SP_MDEF2:
+ if(sd->state.lr_flag != 2)
+ sd->mdef+=val;
+ break;
+ case SP_HIT:
+ if(sd->state.lr_flag != 2)
+ sd->hit+=val;
+ else
+ sd->arrow_hit+=val;
+ break;
+ case SP_FLEE1:
+ if(sd->state.lr_flag != 2)
+ sd->flee+=val;
+ break;
+ case SP_FLEE2:
+ if(sd->state.lr_flag != 2)
+ sd->flee2+=val*10;
+ break;
+ case SP_CRITICAL:
+ if(sd->state.lr_flag != 2)
+ sd->critical+=val*10;
+ else
+ sd->arrow_cri += val*10;
+ break;
+ case SP_ATKELE:
+ if(!sd->state.lr_flag)
+ sd->atk_ele=val;
+ else if(sd->state.lr_flag == 1)
+ sd->atk_ele_=val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_ele=val;
+ break;
+ case SP_DEFELE:
+ if(sd->state.lr_flag != 2)
+ sd->def_ele=val;
+ break;
+ case SP_MAXHP:
+ if(sd->state.lr_flag != 2)
+ sd->status.max_hp+=val;
+ break;
+ case SP_MAXSP:
+ if(sd->state.lr_flag != 2)
+ sd->status.max_sp+=val;
+ break;
+ case SP_CASTRATE:
+ if(sd->state.lr_flag != 2)
+ sd->castrate+=val;
+ break;
+ case SP_MAXHPRATE:
+ if(sd->state.lr_flag != 2)
+ sd->hprate+=val;
+ break;
+ case SP_MAXSPRATE:
+ if(sd->state.lr_flag != 2)
+ sd->sprate+=val;
+ break;
+ case SP_SPRATE:
+ if(sd->state.lr_flag != 2)
+ sd->dsprate+=val;
+ break;
+ case SP_ATTACKRANGE:
+ if(!sd->state.lr_flag)
+ sd->attackrange += val;
+ else if(sd->state.lr_flag == 1)
+ sd->attackrange_ += val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_range += val;
+ break;
+ case SP_ADD_SPEED:
+ if(sd->state.lr_flag != 2)
+ sd->speed -= val;
+ break;
+ case SP_SPEED_RATE:
+ if(sd->state.lr_flag != 2) {
+ if(sd->speed_rate > 100-val)
+ sd->speed_rate = 100-val;
+ }
+ break;
+ case SP_SPEED_ADDRATE:
+ if(sd->state.lr_flag != 2)
+ sd->speed_add_rate = sd->speed_add_rate * (100-val)/100;
+ break;
+ case SP_ASPD:
+ if(sd->state.lr_flag != 2)
+ sd->aspd -= val*10;
+ break;
+ case SP_ASPD_RATE:
+ if(sd->state.lr_flag != 2) {
+ if(sd->aspd_rate > 100-val)
+ sd->aspd_rate = 100-val;
+ }
+ break;
+ case SP_ASPD_ADDRATE:
+ if(sd->state.lr_flag != 2)
+ sd->aspd_add_rate = sd->aspd_add_rate * (100-val)/100;
+ break;
+ case SP_HP_RECOV_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->hprecov_rate += val;
+ break;
+ case SP_SP_RECOV_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->sprecov_rate += val;
+ break;
+ case SP_CRITICAL_DEF:
+ if(sd->state.lr_flag != 2)
+ sd->critical_def += val;
+ break;
+ case SP_NEAR_ATK_DEF:
+ if(sd->state.lr_flag != 2)
+ sd->near_attack_def_rate += val;
+ break;
+ case SP_LONG_ATK_DEF:
+ if(sd->state.lr_flag != 2)
+ sd->long_attack_def_rate += val;
+ break;
+ case SP_DOUBLE_RATE:
+ if(sd->state.lr_flag == 0 && sd->double_rate < val)
+ sd->double_rate = val;
+ break;
+ case SP_DOUBLE_ADD_RATE:
+ if(sd->state.lr_flag == 0)
+ sd->double_add_rate += val;
+ break;
+ case SP_MATK_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->matk_rate += val;
+ break;
+ case SP_IGNORE_DEF_ELE:
+ if(!sd->state.lr_flag)
+ sd->ignore_def_ele |= 1<<val;
+ else if(sd->state.lr_flag == 1)
+ sd->ignore_def_ele_ |= 1<<val;
+ break;
+ case SP_IGNORE_DEF_RACE:
+ if(!sd->state.lr_flag)
+ sd->ignore_def_race |= 1<<val;
+ else if(sd->state.lr_flag == 1)
+ sd->ignore_def_race_ |= 1<<val;
+ break;
+ case SP_ATK_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->atk_rate += val;
+ break;
+ case SP_MAGIC_ATK_DEF:
+ if(sd->state.lr_flag != 2)
+ sd->magic_def_rate += val;
+ break;
+ case SP_MISC_ATK_DEF:
+ if(sd->state.lr_flag != 2)
+ sd->misc_def_rate += val;
+ break;
+ case SP_IGNORE_MDEF_ELE:
+ if(sd->state.lr_flag != 2)
+ sd->ignore_mdef_ele |= 1<<val;
+ break;
+ case SP_IGNORE_MDEF_RACE:
+ if(sd->state.lr_flag != 2)
+ sd->ignore_mdef_race |= 1<<val;
+ break;
+ case SP_PERFECT_HIT_RATE:
+ if(sd->state.lr_flag != 2 && sd->perfect_hit < val)
+ sd->perfect_hit = val;
+ break;
+ case SP_PERFECT_HIT_ADD_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->perfect_hit_add += val;
+ break;
+ case SP_CRITICAL_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->critical_rate+=val;
+ break;
+ case SP_GET_ZENY_NUM:
+ if(sd->state.lr_flag != 2 && sd->get_zeny_num < val)
+ sd->get_zeny_num = val;
+ break;
+ case SP_ADD_GET_ZENY_NUM:
+ if(sd->state.lr_flag != 2)
+ sd->get_zeny_add_num += val;
+ break;
+ case SP_DEF_RATIO_ATK_ELE:
+ if(!sd->state.lr_flag)
+ sd->def_ratio_atk_ele |= 1<<val;
+ else if(sd->state.lr_flag == 1)
+ sd->def_ratio_atk_ele_ |= 1<<val;
+ break;
+ case SP_DEF_RATIO_ATK_RACE:
+ if(!sd->state.lr_flag)
+ sd->def_ratio_atk_race |= 1<<val;
+ else if(sd->state.lr_flag == 1)
+ sd->def_ratio_atk_race_ |= 1<<val;
+ break;
+ case SP_HIT_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->hit_rate += val;
+ break;
+ case SP_FLEE_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->flee_rate += val;
+ break;
+ case SP_FLEE2_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->flee2_rate += val;
+ break;
+ case SP_DEF_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->def_rate += val;
+ break;
+ case SP_DEF2_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->def2_rate += val;
+ break;
+ case SP_MDEF_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->mdef_rate += val;
+ break;
+ case SP_MDEF2_RATE:
+ if(sd->state.lr_flag != 2)
+ sd->mdef2_rate += val;
+ break;
+ case SP_RESTART_FULL_RECORVER:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.restart_full_recover = 1;
+ break;
+ case SP_NO_CASTCANCEL:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_castcancel = 1;
+ break;
+ case SP_NO_CASTCANCEL2:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_castcancel2 = 1;
+ break;
+ case SP_NO_SIZEFIX:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_sizefix = 1;
+ break;
+ case SP_NO_MAGIC_DAMAGE:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_magic_damage = 1;
+ break;
+ case SP_NO_WEAPON_DAMAGE:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_weapon_damage = 1;
+ break;
+ case SP_NO_GEMSTONE:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.no_gemstone = 1;
+ break;
+ case SP_INFINITE_ENDURE:
+ if(sd->state.lr_flag != 2)
+ sd->special_state.infinite_endure = 1;
+ break;
+ case SP_SPLASH_RANGE:
+ if(sd->state.lr_flag != 2 && sd->splash_range < val)
+ sd->splash_range = val;
+ break;
+ case SP_SPLASH_ADD_RANGE:
+ if(sd->state.lr_flag != 2)
+ sd->splash_add_range += val;
+ break;
+ case SP_SHORT_WEAPON_DAMAGE_RETURN:
+ if(sd->state.lr_flag != 2)
+ sd->short_weapon_damage_return += val;
+ break;
+ case SP_LONG_WEAPON_DAMAGE_RETURN:
+ if(sd->state.lr_flag != 2)
+ sd->long_weapon_damage_return += val;
+ break;
+ case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here
+ if(sd->state.lr_flag != 2)
+ sd->magic_damage_return += val;
+ break;
+ case SP_ALL_STATS: // [Valaris]
+ if(sd->state.lr_flag!=2) {
+ sd->parame[SP_STR-SP_STR]+=val;
+ sd->parame[SP_AGI-SP_STR]+=val;
+ sd->parame[SP_VIT-SP_STR]+=val;
+ sd->parame[SP_INT-SP_STR]+=val;
+ sd->parame[SP_DEX-SP_STR]+=val;
+ sd->parame[SP_LUK-SP_STR]+=val;
+ clif_updatestatus(sd,13);
+ clif_updatestatus(sd,14);
+ clif_updatestatus(sd,15);
+ clif_updatestatus(sd,16);
+ clif_updatestatus(sd,17);
+ clif_updatestatus(sd,18);
+ }
+ break;
+ case SP_AGI_VIT: // [Valaris]
+ if(sd->state.lr_flag!=2) {
+ sd->parame[SP_AGI-SP_STR]+=val;
+ sd->parame[SP_VIT-SP_STR]+=val;
+ clif_updatestatus(sd,14);
+ clif_updatestatus(sd,15);
+ }
+ break;
+ case SP_AGI_DEX_STR: // [Valaris]
+ if(sd->state.lr_flag!=2) {
+ sd->parame[SP_AGI-SP_STR]+=val;
+ sd->parame[SP_DEX-SP_STR]+=val;
+ sd->parame[SP_STR-SP_STR]+=val;
+ clif_updatestatus(sd,14);
+ clif_updatestatus(sd,17);
+ clif_updatestatus(sd,13);
+ }
+ break;
+ case SP_PERFECT_HIDE: // [Valaris]
+ if(sd->state.lr_flag!=2) {
+ sd->perfect_hiding=1;
+ }
+ break;
+ case SP_DISGUISE: // Disguise script for items [Valaris]
+ if(sd->state.lr_flag!=2 && sd->disguiseflag==0) {
+ if(pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(sd->fd, "Cannot wear disguise when riding a Peco.");
+ break;
+ }
+ sd->disguise=val;
+ clif_clearchar(&sd->bl, 9);
+ pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
+ }
+ break;
+ case SP_UNBREAKABLE:
+ if(sd->state.lr_flag!=2) {
+ sd->unbreakable += val;
+ }
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("pc_bonus: unknown type %d %d !\n",type,val);
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ * ‘• ”õ•i‚É‚æ‚é”\—Í“™‚̃{[ƒiƒXÝ’è
+ *------------------------------------------
+ */
+int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ switch(type){
+ case SP_ADDELE:
+ if(!sd->state.lr_flag)
+ sd->addele[type2]+=val;
+ else if(sd->state.lr_flag == 1)
+ sd->addele_[type2]+=val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_addele[type2]+=val;
+ break;
+ case SP_ADDRACE:
+ if(!sd->state.lr_flag)
+ sd->addrace[type2]+=val;
+ else if(sd->state.lr_flag == 1)
+ sd->addrace_[type2]+=val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_addrace[type2]+=val;
+ break;
+ case SP_ADDSIZE:
+ if(!sd->state.lr_flag)
+ sd->addsize[type2]+=val;
+ else if(sd->state.lr_flag == 1)
+ sd->addsize_[type2]+=val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_addsize[type2]+=val;
+ break;
+ case SP_SUBELE:
+ if(sd->state.lr_flag != 2)
+ sd->subele[type2]+=val;
+ break;
+ case SP_SUBRACE:
+ if(sd->state.lr_flag != 2)
+ sd->subrace[type2]+=val;
+ break;
+ case SP_ADDEFF:
+ if(sd->state.lr_flag != 2)
+ sd->addeff[type2]+=val;
+ else
+ sd->arrow_addeff[type2]+=val;
+ break;
+ case SP_ADDEFF2:
+ if(sd->state.lr_flag != 2)
+ sd->addeff2[type2]+=val;
+ else
+ sd->arrow_addeff2[type2]+=val;
+ break;
+ case SP_RESEFF:
+ if(sd->state.lr_flag != 2)
+ sd->reseff[type2]+=val;
+ break;
+ case SP_MAGIC_ADDELE:
+ if(sd->state.lr_flag != 2)
+ sd->magic_addele[type2]+=val;
+ break;
+ case SP_MAGIC_ADDRACE:
+ if(sd->state.lr_flag != 2)
+ sd->magic_addrace[type2]+=val;
+ break;
+ case SP_MAGIC_SUBRACE:
+ if(sd->state.lr_flag != 2)
+ sd->magic_subrace[type2]+=val;
+ break;
+ case SP_ADD_DAMAGE_CLASS:
+ if(!sd->state.lr_flag) {
+ for(i=0;i<sd->add_damage_class_count;i++) {
+ if(sd->add_damage_classid[i] == type2) {
+ sd->add_damage_classrate[i] += val;
+ break;
+ }
+ }
+ if(i >= sd->add_damage_class_count && sd->add_damage_class_count < 10) {
+ sd->add_damage_classid[sd->add_damage_class_count] = type2;
+ sd->add_damage_classrate[sd->add_damage_class_count] += val;
+ sd->add_damage_class_count++;
+ }
+ }
+ else if(sd->state.lr_flag == 1) {
+ for(i=0;i<sd->add_damage_class_count_;i++) {
+ if(sd->add_damage_classid_[i] == type2) {
+ sd->add_damage_classrate_[i] += val;
+ break;
+ }
+ }
+ if(i >= sd->add_damage_class_count_ && sd->add_damage_class_count_ < 10) {
+ sd->add_damage_classid_[sd->add_damage_class_count_] = type2;
+ sd->add_damage_classrate_[sd->add_damage_class_count_] += val;
+ sd->add_damage_class_count_++;
+ }
+ }
+ break;
+ case SP_ADD_MAGIC_DAMAGE_CLASS:
+ if(sd->state.lr_flag != 2) {
+ for(i=0;i<sd->add_magic_damage_class_count;i++) {
+ if(sd->add_magic_damage_classid[i] == type2) {
+ sd->add_magic_damage_classrate[i] += val;
+ break;
+ }
+ }
+ if(i >= sd->add_magic_damage_class_count && sd->add_magic_damage_class_count < 10) {
+ sd->add_magic_damage_classid[sd->add_magic_damage_class_count] = type2;
+ sd->add_magic_damage_classrate[sd->add_magic_damage_class_count] += val;
+ sd->add_magic_damage_class_count++;
+ }
+ }
+ break;
+ case SP_ADD_DEF_CLASS:
+ if(sd->state.lr_flag != 2) {
+ for(i=0;i<sd->add_def_class_count;i++) {
+ if(sd->add_def_classid[i] == type2) {
+ sd->add_def_classrate[i] += val;
+ break;
+ }
+ }
+ if(i >= sd->add_def_class_count && sd->add_def_class_count < 10) {
+ sd->add_def_classid[sd->add_def_class_count] = type2;
+ sd->add_def_classrate[sd->add_def_class_count] += val;
+ sd->add_def_class_count++;
+ }
+ }
+ break;
+ case SP_ADD_MDEF_CLASS:
+ if(sd->state.lr_flag != 2) {
+ for(i=0;i<sd->add_mdef_class_count;i++) {
+ if(sd->add_mdef_classid[i] == type2) {
+ sd->add_mdef_classrate[i] += val;
+ break;
+ }
+ }
+ if(i >= sd->add_mdef_class_count && sd->add_mdef_class_count < 10) {
+ sd->add_mdef_classid[sd->add_mdef_class_count] = type2;
+ sd->add_mdef_classrate[sd->add_mdef_class_count] += val;
+ sd->add_mdef_class_count++;
+ }
+ }
+ break;
+ case SP_HP_DRAIN_RATE:
+ if(!sd->state.lr_flag) {
+ sd->hp_drain_rate += type2;
+ sd->hp_drain_per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->hp_drain_rate_ += type2;
+ sd->hp_drain_per_ += val;
+ }
+ break;
+ case SP_SP_DRAIN_RATE:
+ if(!sd->state.lr_flag) {
+ sd->sp_drain_rate += type2;
+ sd->sp_drain_per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->sp_drain_rate_ += type2;
+ sd->sp_drain_per_ += val;
+ }
+ break;
+ case SP_WEAPON_COMA_ELE:
+ if(sd->state.lr_flag != 2)
+ sd->weapon_coma_ele[type2] += val;
+ break;
+ case SP_WEAPON_COMA_RACE:
+ if(sd->state.lr_flag != 2)
+ sd->weapon_coma_race[type2] += val;
+ break;
+ case SP_RANDOM_ATTACK_INCREASE: // [Valaris]
+ if(sd->state.lr_flag !=2){
+ sd->random_attack_increase_add = type2;
+ sd->random_attack_increase_per += val;
+ break;
+ } // end addition
+ default:
+ if(battle_config.error_log)
+ printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val);
+ break;
+ }
+ return 0;
+}
+
+int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
+{
+ int i;
+ switch(type){
+ case SP_ADD_MONSTER_DROP_ITEM:
+ if(sd->state.lr_flag != 2) {
+ for(i=0;i<sd->monster_drop_item_count;i++) {
+ if(sd->monster_drop_itemid[i] == type2) {
+ sd->monster_drop_race[i] |= 1<<type3;
+ if(sd->monster_drop_itemrate[i] < val)
+ sd->monster_drop_itemrate[i] = val;
+ break;
+ }
+ }
+ if(i >= sd->monster_drop_item_count && sd->monster_drop_item_count < 10) {
+ sd->monster_drop_itemid[sd->monster_drop_item_count] = type2;
+ sd->monster_drop_race[sd->monster_drop_item_count] |= 1<<type3;
+ sd->monster_drop_itemrate[sd->monster_drop_item_count] = val;
+ sd->monster_drop_item_count++;
+ }
+ }
+ break;
+ case SP_AUTOSPELL:
+ if(sd->state.lr_flag != 2){
+ sd->autospell_id = type2;
+ sd->autospell_lv = type3;
+ sd->autospell_rate = val;
+ }
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒg‚É‚æ‚éƒXƒLƒ‹Š“¾
+ *------------------------------------------
+ */
+int pc_skill(struct map_session_data *sd,int id,int level,int flag)
+{
+ nullpo_retr(0, sd);
+
+ if(level>MAX_SKILL_LEVEL){
+ if(battle_config.error_log)
+ printf("support card skill only!\n");
+ return 0;
+ }
+ if(!flag && (sd->status.skill[id].id == id || level == 0)){ // ƒNƒGƒXƒgŠ“¾‚Ȃ炱‚±‚ÅðŒ‚ðŠm”F‚µ‚Ä‘—M‚·‚é
+ sd->status.skill[id].lv=level;
+ pc_calcstatus(sd,0);
+ clif_skillinfoblock(sd);
+ }
+ else if(sd->status.skill[id].lv < level){ // Šo‚¦‚ç‚ê‚邪lv‚ª¬‚³‚¢‚È‚ç
+ if(sd->status.skill[id].id==id)
+ sd->status.skill[id].flag=sd->status.skill[id].lv+2; // lv‚ð‹L‰¯
+ else {
+ sd->status.skill[id].id=id;
+ sd->status.skill[id].flag=1; // cardƒXƒLƒ‹‚Æ‚·‚é
+ }
+ sd->status.skill[id].lv=level;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒh‘}“ü
+ *------------------------------------------
+ */
+int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip)
+{
+ nullpo_retr(0, sd);
+
+ if(idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0 && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card]) {
+ int i;
+ int nameid=sd->status.inventory[idx_equip].nameid;
+ int cardid=sd->status.inventory[idx_card].nameid;
+ int ep=sd->inventory_data[idx_card]->equip;
+
+ if( nameid <= 0 || sd->inventory_data[idx_equip] == NULL ||
+ (sd->inventory_data[idx_equip]->type!=4 && sd->inventory_data[idx_equip]->type!=5)|| // ‘• ”õ‚¶‚á‚È‚¢
+ ( sd->status.inventory[idx_equip].identify==0 ) || // –¢ŠÓ’è
+ ( sd->status.inventory[idx_equip].card[0]==0x00ff) || // »‘¢•Ší
+ ( sd->status.inventory[idx_equip].card[0]==0x00fe) ||
+ ( (sd->inventory_data[idx_equip]->equip&ep)==0 ) || // ‘• ”õŒÂŠˆá‚¢
+ ( sd->inventory_data[idx_equip]->type==4 && ep==32) || // —¼ Žè•Ší‚Æ‚ƒJ[ƒh
+ ( sd->status.inventory[idx_equip].card[0]==(short)0xff00) || sd->status.inventory[idx_equip].equip){
+
+ clif_insert_card(sd,idx_equip,idx_card,1);
+ return 0;
+ }
+ for(i=0;i<sd->inventory_data[idx_equip]->slot;i++){
+ if( sd->status.inventory[idx_equip].card[i] == 0){
+ // ‹ó‚«ƒXƒƒbƒg‚ª‚ ‚Á‚½‚Ì‚Å·‚µž‚Þ
+ sd->status.inventory[idx_equip].card[i]=cardid;
+
+ // ƒJ[ƒh‚ÍŒ¸‚ç‚·
+ clif_insert_card(sd,idx_equip,idx_card,0);
+ pc_delitem(sd,idx_card,1,1);
+ return 0;
+ }
+ }
+ }
+ else
+ clif_insert_card(sd,idx_equip,idx_card,1);
+
+ return 0;
+}
+
+//
+// ƒAƒCƒeƒ€•¨
+//
+
+/*==========================================
+ * ƒXƒLƒ‹‚É‚æ‚锃‚¢’lC³
+ *------------------------------------------
+ */
+int pc_modifybuyvalue(struct map_session_data *sd,int orig_value)
+{
+ int skill,val = orig_value,rate1 = 0,rate2 = 0;
+ if((skill=pc_checkskill(sd,MC_DISCOUNT))>0) // ƒfƒBƒXƒJƒEƒ“ƒg
+ rate1 = 5+skill*2-((skill==10)? 1:0);
+ if((skill=pc_checkskill(sd,RG_COMPULSION))>0) // ƒRƒ€ƒpƒ‹ƒVƒ‡ƒ“ƒfƒBƒXƒJƒEƒ“ƒg
+ rate2 = 5+skill*4;
+ if(rate1 < rate2) rate1 = rate2;
+ if(rate1)
+ val = (int)((double)orig_value*(double)(100-rate1)/100.);
+ if(val < 0) val = 0;
+ if(orig_value > 0 && val < 1) val = 1;
+
+ return val;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹‚É‚æ‚锄‚è’lC³
+ *------------------------------------------
+ */
+int pc_modifysellvalue(struct map_session_data *sd,int orig_value)
+{
+ int skill,val = orig_value,rate = 0;
+ if((skill=pc_checkskill(sd,MC_OVERCHARGE))>0) // ƒI[ƒo[ƒ`ƒƒ[ƒW
+ rate = 5+skill*2-((skill==10)? 1:0);
+ if(rate)
+ val = (int)((double)orig_value*(double)(100+rate)/100.);
+ if(val < 0) val = 0;
+ if(orig_value > 0 && val < 1) val = 1;
+
+ return val;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚𔃂Á‚½Žž‚ÉAV‚µ‚¢ƒAƒCƒeƒ€—“‚ðŽg‚¤‚©A
+ * 3–œŒÂ§ŒÀ‚É‚©‚©‚é‚©Šm”F
+ *------------------------------------------
+ */
+int pc_checkadditem(struct map_session_data *sd,int nameid,int amount)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(itemdb_isequip(nameid))
+ return ADDITEM_NEW;
+
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid==nameid){
+ if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
+ return ADDITEM_OVERAMOUNT;
+ return ADDITEM_EXIST;
+ }
+ }
+
+ if(amount > MAX_AMOUNT)
+ return ADDITEM_OVERAMOUNT;
+ return ADDITEM_NEW;
+}
+
+/*==========================================
+ * ‹ó‚«ƒAƒCƒeƒ€—“‚̌”
+ *------------------------------------------
+ */
+int pc_inventoryblank(struct map_session_data *sd)
+{
+ int i,b;
+
+ nullpo_retr(0, sd);
+
+ for(i=0,b=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid==0)
+ b++;
+ }
+
+ return b;
+}
+
+/*==========================================
+ * ‚¨‹à‚𕥂¤
+ *------------------------------------------
+ */
+int pc_payzeny(struct map_session_data *sd,int zeny)
+{
+ double z;
+
+ nullpo_retr(0, sd);
+
+ z = (double)sd->status.zeny;
+ if(sd->status.zeny<zeny || z - (double)zeny > MAX_ZENY)
+ return 1;
+ sd->status.zeny-=zeny;
+ clif_updatestatus(sd,SP_ZENY);
+
+ return 0;
+}
+
+/*==========================================
+ * ‚¨‹à‚𓾂é
+ *------------------------------------------
+ */
+int pc_getzeny(struct map_session_data *sd,int zeny)
+{
+ double z;
+
+ nullpo_retr(0, sd);
+
+ z = (double)sd->status.zeny;
+ if(z + (double)zeny > MAX_ZENY) {
+ zeny = 0;
+ sd->status.zeny = MAX_ZENY;
+ }
+ sd->status.zeny+=zeny;
+ clif_updatestatus(sd,SP_ZENY);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚ð’T‚µ‚ÄAƒCƒ“ƒfƒbƒNƒX‚ð•Ô‚·
+ *------------------------------------------
+ */
+int pc_search_inventory(struct map_session_data *sd,int item_id)
+{
+ int i;
+
+ nullpo_retr(-1, sd);
+
+ for(i=0;i<MAX_INVENTORY;i++) {
+ if(sd->status.inventory[i].nameid == item_id &&
+ (sd->status.inventory[i].amount > 0 || item_id == 0))
+ return i;
+ }
+
+ return -1;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁBŒÂ”‚Ì‚Ýitem\‘¢‘Ì‚Ì”Žš‚𖳎‹
+ *------------------------------------------
+ */
+int pc_additem(struct map_session_data *sd,struct item *item_data,int amount)
+{
+ struct item_data *data;
+ int i,w;
+
+ nullpo_retr(1, sd);
+ nullpo_retr(1, item_data);
+
+ if(item_data->nameid <= 0 || amount <= 0)
+ return 1;
+ data = itemdb_search(item_data->nameid);
+ if((w = data->weight*amount) + sd->weight > sd->max_weight)
+ return 2;
+
+ i = MAX_INVENTORY;
+
+ if(!itemdb_isequip2(data)){
+ // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
+ for(i=0;i<MAX_INVENTORY;i++)
+ if(sd->status.inventory[i].nameid == item_data->nameid &&
+ sd->status.inventory[i].card[0] == item_data->card[0] && sd->status.inventory[i].card[1] == item_data->card[1] &&
+ sd->status.inventory[i].card[2] == item_data->card[2] && sd->status.inventory[i].card[3] == item_data->card[3]) {
+ if(sd->status.inventory[i].amount+amount > MAX_AMOUNT)
+ return 5;
+ sd->status.inventory[i].amount+=amount;
+ clif_additem(sd,i,amount,0);
+ break;
+ }
+ }
+ if(i >= MAX_INVENTORY){
+ // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
+ i = pc_search_inventory(sd,0);
+ if(i >= 0) {
+ memcpy(&sd->status.inventory[i],item_data,sizeof(sd->status.inventory[0]));
+ sd->status.inventory[i].amount=amount;
+ sd->inventory_data[i]=data;
+ clif_additem(sd,i,amount,0);
+ }
+ else return 4;
+ }
+ sd->weight += w;
+ clif_updatestatus(sd,SP_WEIGHT);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
+ *------------------------------------------
+ */
+int pc_delitem(struct map_session_data *sd,int n,int amount,int type)
+{
+ nullpo_retr(1, sd);
+
+ if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL)
+ return 1;
+
+ sd->status.inventory[n].amount -= amount;
+ sd->weight -= sd->inventory_data[n]->weight*amount ;
+ if(sd->status.inventory[n].amount<=0){
+ if(sd->status.inventory[n].equip)
+ pc_unequipitem(sd,n,0);
+ memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0]));
+ sd->inventory_data[n] = NULL;
+ }
+ if(!(type&1))
+ clif_delitem(sd,n,amount);
+ if(!(type&2))
+ clif_updatestatus(sd,SP_WEIGHT);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚ð—Ž‚·
+ *------------------------------------------
+ */
+int pc_dropitem(struct map_session_data *sd,int n,int amount)
+{
+ nullpo_retr(1, sd);
+
+ if (sd->status.inventory[n].nameid <= 0 ||
+ sd->status.inventory[n].amount < amount ||
+ sd->trade_partner != 0 || sd->vender_id != 0 ||
+ sd->status.inventory[n].amount <= 0)
+ return 1;
+ map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0);
+ pc_delitem(sd, n, amount, 0);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚ðE‚¤
+ *------------------------------------------
+ */
+int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
+{
+ int flag;
+ unsigned int tick = gettick();
+ struct map_session_data *first_sd = NULL,*second_sd = NULL,*third_sd = NULL;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, fitem);
+
+ if(fitem->first_get_id > 0) {
+ first_sd = map_id2sd(fitem->first_get_id);
+ if(tick < fitem->first_get_tick) {
+ if(fitem->first_get_id != sd->bl.id && !(first_sd && first_sd->status.party_id == sd->status.party_id)) {
+ clif_additem(sd,0,0,6);
+ return 0;
+ }
+ }
+ else if(fitem->second_get_id > 0) {
+ second_sd = map_id2sd(fitem->second_get_id);
+ if(tick < fitem->second_get_tick) {
+ if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id &&
+ !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id)) {
+ clif_additem(sd,0,0,6);
+ return 0;
+ }
+ }
+ else if(fitem->third_get_id > 0) {
+ third_sd = map_id2sd(fitem->third_get_id);
+ if(tick < fitem->third_get_tick) {
+ if(fitem->first_get_id != sd->bl.id && fitem->second_get_id != sd->bl.id && fitem->third_get_id != sd->bl.id &&
+ !(first_sd && first_sd->status.party_id == sd->status.party_id) && !(second_sd && second_sd->status.party_id == sd->status.party_id) &&
+ !(third_sd && third_sd->status.party_id == sd->status.party_id)) {
+ clif_additem(sd,0,0,6);
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ if((flag = pc_additem(sd,&fitem->item_data,fitem->item_data.amount)))
+ // d—Êover‚Ŏ擾Ž¸”s
+ clif_additem(sd,0,0,flag);
+ else {
+ /* Žæ“¾¬Œ÷ */
+ if(sd->attacktimer != -1)
+ pc_stopattack(sd);
+ clif_takeitem(&sd->bl,&fitem->bl);
+ map_clearflooritem(fitem->bl.id);
+ }
+ return 0;
+}
+
+int pc_isUseitem(struct map_session_data *sd,int n)
+{
+ struct item_data *item;
+ int nameid;
+
+ nullpo_retr(0, sd);
+
+ item = sd->inventory_data[n];
+ nameid = sd->status.inventory[n].nameid;
+
+ if(item == NULL)
+ return 0;
+ if((nameid == 605) && map[sd->bl.m].flag.gvg)
+ return 0;
+ if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) {
+ clif_skill_teleportmessage(sd,0);
+ return 0;
+ }
+ if(nameid == 602 && map[sd->bl.m].flag.noreturn)
+ return 0;
+ if(nameid == 604 && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg))
+ return 0;
+ if(item->sex != 2 && sd->status.sex != item->sex)
+ return 0;
+ if(item->elv > 0 && sd->status.base_level < item->elv)
+ return 0;
+ if(((sd->status.class==13 || sd->status.class==4014) && ((1<<7)&item->class) == 0) || // have mounted classes use unmounted items [Valaris]
+ ((sd->status.class==21 || sd->status.class==4022) && ((1<<14)&item->class) == 0))
+ return 0;
+ if(sd->status.class!=13 && sd->status.class!=4014 && sd->status.class!=21 && sd->status.class!=4022)
+ if((sd->status.class<=4000 && ((1<<sd->status.class)&item->class) == 0) || (sd->status.class>4000 && sd->status.class<4023 && ((1<<(sd->status.class-4001))&item->class) == 0) ||
+ (sd->status.class>=4023 && ((1<<(sd->status.class-4023))&item->class) == 0))
+ return 0;
+
+#ifndef TXT_ONLY
+ if((log_config.branch > 0) && (nameid == 604))
+ log_branch(sd);
+#endif
+
+ return 1;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚ðŽg‚¤
+ *------------------------------------------
+ */
+int pc_useitem(struct map_session_data *sd,int n)
+{
+ int nameid,amount;
+
+ nullpo_retr(1, sd);
+
+ if(n >=0 && n < MAX_INVENTORY) {
+ nameid = sd->status.inventory[n].nameid;
+ amount = sd->status.inventory[n].amount;
+ if(sd->status.inventory[n].nameid <= 0 ||
+ sd->status.inventory[n].amount <= 0 ||
+ sd->sc_data[SC_BERSERK].timer!=-1 ||
+ !pc_isUseitem(sd,n) ) {
+ clif_useitemack(sd,n,0,0);
+ return 1;
+ }
+ if(sd->inventory_data[n])
+ run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
+
+ clif_useitemack(sd,n,amount-1,1);
+ pc_delitem(sd,n,1,1);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒgƒAƒCƒeƒ€’ljÁBŒÂ”‚Ì‚Ýitem\‘¢‘Ì‚Ì”Žš‚𖳎‹
+ *------------------------------------------
+ */
+int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount)
+{
+ struct item_data *data;
+ int i,w;
+
+ nullpo_retr(1, sd);
+ nullpo_retr(1, item_data);
+
+ if(item_data->nameid <= 0 || amount <= 0)
+ return 1;
+ data = itemdb_search(item_data->nameid);
+
+ if((w=data->weight*amount) + sd->cart_weight > sd->cart_max_weight)
+ return 1;
+
+ i=MAX_CART;
+ if(!itemdb_isequip2(data)){
+ // ‘• ”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
+ for(i=0;i<MAX_CART;i++){
+ if(sd->status.cart[i].nameid==item_data->nameid &&
+ sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] &&
+ sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3]){
+ if(sd->status.cart[i].amount+amount > MAX_AMOUNT)
+ return 1;
+ sd->status.cart[i].amount+=amount;
+ clif_cart_additem(sd,i,amount,0);
+ break;
+ }
+ }
+ }
+ if(i >= MAX_CART){
+ // ‘• ”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
+ for(i=0;i<MAX_CART;i++){
+ if(sd->status.cart[i].nameid==0){
+ memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0]));
+ sd->status.cart[i].amount=amount;
+ sd->cart_num++;
+ clif_cart_additem(sd,i,amount,0);
+ break;
+ }
+ }
+ if(i >= MAX_CART)
+ return 1;
+ }
+ sd->cart_weight += w;
+ clif_updatestatus(sd,SP_CARTINFO);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒgƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
+ *------------------------------------------
+ */
+int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type)
+{
+ nullpo_retr(1, sd);
+
+ if(sd->status.cart[n].nameid==0 ||
+ sd->status.cart[n].amount<amount)
+ return 1;
+
+ sd->status.cart[n].amount -= amount;
+ sd->cart_weight -= itemdb_weight(sd->status.cart[n].nameid)*amount ;
+ if(sd->status.cart[n].amount <= 0){
+ memset(&sd->status.cart[n],0,sizeof(sd->status.cart[0]));
+ sd->cart_num--;
+ }
+ if(!type) {
+ clif_cart_delitem(sd,n,amount);
+ clif_updatestatus(sd,SP_CARTINFO);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚ÖƒAƒCƒeƒ€ˆÚ“®
+ *------------------------------------------
+ */
+int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) {
+ struct item *item_data;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, item_data = &sd->status.inventory[idx]);
+
+ if (item_data->nameid==0 || item_data->amount<amount || sd->vender_id)
+ return 1;
+ if (pc_cart_additem(sd,item_data,amount) == 0)
+ return pc_delitem(sd,idx,amount,0);
+
+ return 1;
+}
+
+/*==========================================
+ * ƒJ[ƒg“à‚̃AƒCƒeƒ€”Šm”F(ŒÂ”‚Ì·•ª‚ð•Ô‚·)
+ *------------------------------------------
+ */
+int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount)
+{
+ struct item *item_data;
+
+ nullpo_retr(-1, sd);
+ nullpo_retr(-1, item_data=&sd->status.cart[idx]);
+
+ if( item_data->nameid==0 || !item_data->amount)
+ return -1;
+ return item_data->amount-amount;
+}
+/*==========================================
+ * ƒJ[ƒg‚©‚çƒAƒCƒeƒ€ˆÚ“®
+ *------------------------------------------
+ */
+
+int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount)
+{
+ struct item *item_data;
+ int flag;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, item_data=&sd->status.cart[idx]);
+
+ if( item_data->nameid==0 || item_data->amount<amount || sd->vender_id )
+ return 1;
+ if((flag = pc_additem(sd,item_data,amount)) == 0)
+ return pc_cart_delitem(sd,idx,amount,0);
+
+ clif_additem(sd,0,0,flag);
+ return 1;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€ŠÓ’è
+ *------------------------------------------
+ */
+int pc_item_identify(struct map_session_data *sd,int idx)
+{
+ int flag=1;
+
+ nullpo_retr(0, sd);
+
+ if(idx >= 0 && idx < MAX_INVENTORY) {
+ if(sd->status.inventory[idx].nameid > 0 && sd->status.inventory[idx].identify == 0 ){
+ flag=0;
+ sd->status.inventory[idx].identify=1;
+ }
+ clif_item_identified(sd,idx,flag);
+ }
+ else
+ clif_item_identified(sd,idx,flag);
+
+ return !flag;
+}
+
+/*==========================================
+ * ƒXƒeƒBƒ‹•iŒöŠJ
+ *------------------------------------------
+ */
+int pc_show_steal(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+ int itemid;
+ int type;
+
+ struct item_data *item=NULL;
+ char output[100];
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=va_arg(ap,struct map_session_data *));
+
+ itemid=va_arg(ap,int);
+ type=va_arg(ap,int);
+
+ if(!type){
+ if((item=itemdb_exists(itemid))==NULL)
+ sprintf(output,"%s stole an Unknown_Item.",sd->status.name);
+ else
+ sprintf(output,"%s stole %s.",sd->status.name,item->jname);
+ clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
+ }else{
+ sprintf(output,"%s has not stolen the item because of being overweight.",sd->status.name);
+ clif_displaymessage( ((struct map_session_data *)bl)->fd, output);
+ }
+
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+//** pc.c: Small Steal Item fix by fritz
+int pc_steal_item(struct map_session_data *sd,struct block_list *bl)
+{
+ if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
+ int i,skill,rate,itemid,flag, count;
+ struct mob_data *md;
+ md=(struct mob_data *)bl;
+ if(!md->state.steal_flag && mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode&0x20) && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1 &&
+ (!(md->class>1324 && md->class<1364))) // prevent stealing from treasure boxes [Valaris]
+ {
+ skill = sd->paramc[4] - mob_db[md->class].dex + pc_checkskill(sd,TF_STEAL) + 10;
+
+ if(0 < skill)
+ {
+ for(count = 8; count <= 8 && count != 0; count--)
+ {
+ i = rand()%8;
+ itemid = mob_db[md->class].dropitem[i].nameid;
+
+ if(itemid > 0 && itemdb_type(itemid) != 6)
+ {
+ rate = (mob_db[md->class].dropitem[i].p / battle_config.item_rate_common * 100 * skill)/100;
+
+ if(rand()%10000 < rate)
+ {
+ struct item tmp_item;
+ memset(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = itemid;
+ tmp_item.amount = 1;
+ tmp_item.identify = 1;
+ flag = pc_additem(sd,&tmp_item,1);
+ if(battle_config.show_steal_in_same_party)
+ {
+ party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,0);
+ }
+
+ if(flag)
+ {
+ if(battle_config.show_steal_in_same_party)
+ {
+ party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,1);
+ }
+
+ clif_additem(sd,0,0,flag);
+ }
+ md->state.steal_flag = 1;
+ return 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int pc_steal_coin(struct map_session_data *sd,struct block_list *bl)
+{
+ if(sd != NULL && bl != NULL && bl->type == BL_MOB) {
+ int rate,skill;
+ struct mob_data *md=(struct mob_data *)bl;
+ if(md && !md->state.steal_coin_flag && md->sc_data && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1) {
+ skill = pc_checkskill(sd,RG_STEALCOIN)*10;
+ rate = skill + (sd->status.base_level - mob_db[md->class].lv)*3 + sd->paramc[4]*2 + sd->paramc[5]*2;
+ if(rand()%1000 < rate) {
+ pc_getzeny(sd,mob_db[md->class].lv*10 + rand()%100);
+ md->state.steal_coin_flag = 1;
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+//
+//
+//
+/*==========================================
+ * PC‚̈ʒuÝ’è
+ *------------------------------------------
+ */
+int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
+{
+ char mapname[24];
+ int m=0,c=0,disguise=0;
+
+ nullpo_retr(0, sd);
+
+ if(sd->chatID) // ƒ`ƒƒƒbƒg‚©‚ço‚é
+ chat_leavechat(sd);
+ if(sd->trade_partner) // Žæˆø‚ð’†’f‚·‚é
+ trade_tradecancel(sd);
+ if(sd->state.storage_flag)
+ storage_guild_storage_quit(sd,0);
+ else
+ storage_storage_quit(sd); // ‘qŒÉ‚ðŠJ‚¢‚Ä‚é‚È‚ç•Û‘¶‚·‚é
+
+ if(sd->party_invite>0) // ƒp[ƒeƒBŠ©—U‚ð‹‘”Û‚·‚é
+ party_reply_invite(sd,sd->party_invite_account,0);
+ if(sd->guild_invite>0) // ƒMƒ‹ƒhŠ©—U‚ð‹‘”Û‚·‚é
+ guild_reply_invite(sd,sd->guild_invite,0);
+ if(sd->guild_alliance>0) // ƒMƒ‹ƒh“¯–¿Š©—U‚ð‹‘”Û‚·‚é
+ guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
+
+ skill_castcancel(&sd->bl,0); // ‰r¥’†’f
+ pc_stop_walking(sd,0); // •às’†’f
+ pc_stopattack(sd); // UŒ‚’†’f
+
+ if(pc_issit(sd)) {
+ pc_setstand(sd);
+ skill_gangsterparadise(sd,0);
+ }
+
+ if(sd->sc_data[SC_TRICKDEAD].timer != -1)
+ skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1);
+ if(sd->status.option&2)
+ skill_status_change_end(&sd->bl, SC_HIDING, -1);
+ if(sd->status.option&4)
+ skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
+ if(sd->status.option&16386)
+ skill_status_change_end(&sd->bl, SC_CHASEWALK, -1);
+ if(sd->sc_data[SC_BLADESTOP].timer!=-1)
+ skill_status_change_end(&sd->bl,SC_BLADESTOP,-1);
+ if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris]
+ skill_stop_dancing(&sd->bl,0);
+
+ if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
+ pet_stopattack(sd->pd);
+ pet_changestate(sd->pd,MS_IDLE,0);
+ }
+
+ if(sd->disguise) { // clear disguises when warping [Valaris]
+ clif_clearchar(&sd->bl, 9);
+ disguise=sd->disguise;
+ sd->disguise=0;
+ }
+
+ memcpy(mapname,mapname_org,24);
+ mapname[16]=0;
+ if(strstr(mapname,".gat")==NULL && strlen(mapname)<16){
+ strcat(mapname,".gat");
+ }
+
+ m=map_mapname2mapid(mapname);
+ if(m<0){
+ if(sd->mapname[0]){
+ int ip,port;
+ if(map_mapname2ipport(mapname,&ip,&port)==0){
+ skill_stop_dancing(&sd->bl,1);
+ skill_unit_out_all(&sd->bl,gettick(),1);
+ clif_clearchar_area(&sd->bl,clrtype&0xffff);
+ skill_gangsterparadise(sd,0);
+ map_delblock(&sd->bl);
+ if(sd->status.pet_id > 0 && sd->pd) {
+ if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
+ pet_remove_map(sd);
+ intif_delete_petdata(sd->status.pet_id);
+ sd->status.pet_id = 0;
+ sd->pd = NULL;
+ sd->petDB = NULL;
+ if(battle_config.pet_status_support)
+ pc_calcstatus(sd,2);
+ }
+ else if(sd->pet.intimate > 0) {
+ pet_stopattack(sd->pd);
+ pet_changestate(sd->pd,MS_IDLE,0);
+ clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
+ map_delblock(&sd->pd->bl);
+ }
+ }
+ memcpy(sd->mapname,mapname,24);
+ sd->bl.x=x;
+ sd->bl.y=y;
+ sd->state.waitingdisconnect=1;
+ pc_makesavestatus(sd);
+ if(sd->status.pet_id > 0 && sd->pd)
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+ chrif_save(sd);
+ storage_storage_save(sd);
+ chrif_changemapserver(sd, mapname, x, y, ip, port);
+ return 0;
+ }
+ }
+#if 0
+ clif_authfail_fd(sd->fd,0); // cancel
+ clif_setwaitclose(sd->fd);
+#endif
+ return 1;
+ }
+
+ if(x <0 || x >= map[m].xs || y <0 || y >= map[m].ys)
+ x=y=0;
+ if((x==0 && y==0) || (c=read_gat(m,x,y))==1 || c==5){
+ if(x||y) {
+ if(battle_config.error_log)
+ printf("stacked (%d,%d)\n",x,y);
+ }
+ do {
+ x=rand()%(map[m].xs-2)+1;
+ y=rand()%(map[m].ys-2)+1;
+ } while((c=read_gat(m,x,y))==1 || c==5);
+ }
+
+ if(sd->mapname[0] && sd->bl.prev != NULL){
+ skill_unit_out_all(&sd->bl,gettick(),1);
+ clif_clearchar_area(&sd->bl,clrtype&0xffff);
+ skill_gangsterparadise(sd,0);
+ map_delblock(&sd->bl);
+ // pet
+ if(sd->status.pet_id > 0 && sd->pd) {
+ if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
+ pet_remove_map(sd);
+ intif_delete_petdata(sd->status.pet_id);
+ sd->status.pet_id = 0;
+ sd->pd = NULL;
+ sd->petDB = NULL;
+ if(battle_config.pet_status_support)
+ pc_calcstatus(sd,2);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_save(sd);
+ }
+ else if(sd->pet.intimate > 0) {
+ pet_stopattack(sd->pd);
+ pet_changestate(sd->pd,MS_IDLE,0);
+ clif_clearchar_area(&sd->pd->bl,clrtype&0xffff);
+ map_delblock(&sd->pd->bl);
+ }
+ }
+ clif_changemap(sd,map[m].name,x,y); // [MouseJstr]
+ }
+
+ if(disguise) // disguise teleport fix [Valaris]
+ sd->disguise=disguise;
+
+ memcpy(sd->mapname,mapname,24);
+ sd->bl.m = m;
+ sd->to_x = x;
+ sd->to_y = y;
+
+ // moved and changed dance effect stopping
+
+ sd->bl.x = x;
+ sd->bl.y = y;
+
+ if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
+ sd->pd->bl.m = m;
+ sd->pd->bl.x = sd->pd->to_x = x;
+ sd->pd->bl.y = sd->pd->to_y = y;
+ sd->pd->dir = sd->dir;
+ }
+
+// map_addblock(&sd->bl); /// ƒuƒƒbƒN“o˜^‚Æspawn‚Í
+// clif_spawnpc(sd);
+
+ return 0;
+}
+
+/*==========================================
+ * PC‚̃‰ƒ“ƒ_ƒ€ƒ[ƒv
+ *------------------------------------------
+ */
+int pc_randomwarp(struct map_session_data *sd, int type) {
+ int x,y,c,i=0;
+ int m;
+
+ nullpo_retr(0, sd);
+
+ m=sd->bl.m;
+
+ if (map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|[ƒg‹ÖŽ~
+ return 0;
+
+ do{
+ x=rand()%(map[m].xs-2)+1;
+ y=rand()%(map[m].ys-2)+1;
+ } while (((c=read_gat(m,x,y)) == 1 || c == 5) && (i++) < 1000);
+
+ if (i < 1000)
+ pc_setpos(sd,map[m].name,x,y,type);
+
+ return 0;
+}
+
+/*==========================================
+ * Œ»ÝˆÊ’u‚̃ƒ‚
+ *------------------------------------------
+ */
+int pc_memo(struct map_session_data *sd, int i) {
+ int skill;
+ int j;
+
+ nullpo_retr(0, sd);
+
+ skill = pc_checkskill(sd, AL_WARP);
+
+ if (i >= MIN_PORTAL_MEMO)
+ i -= MIN_PORTAL_MEMO;
+ else if (map[sd->bl.m].flag.nomemo || (map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd))) {
+ clif_skill_teleportmessage(sd, 1);
+ return 0;
+ }
+
+ if (skill < 1) {
+ clif_skill_memo(sd,2);
+ }
+
+ if (skill < 2 || i < -1 || i > 2) {
+ clif_skill_memo(sd, 1);
+ return 0;
+ }
+
+ for(j = 0 ; j < 3; j++) {
+ if (strcmp(sd->status.memo_point[j].map, map[sd->bl.m].name) == 0) {
+ i = j;
+ break;
+ }
+ }
+
+ if (i == -1) {
+ for(i = skill - 3; i >= 0; i--) {
+ memcpy(&sd->status.memo_point[i+1],&sd->status.memo_point[i],
+ sizeof(struct point));
+ }
+ i = 0;
+ }
+ memcpy(sd->status.memo_point[i].map, map[sd->bl.m].name, 24);
+ sd->status.memo_point[i].x = sd->bl.x;
+ sd->status.memo_point[i].y = sd->bl.y;
+
+ clif_skill_memo(sd, 0);
+
+ return 1;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int pc_can_reach(struct map_session_data *sd,int x,int y)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, sd);
+
+ if( sd->bl.x==x && sd->bl.y==y ) // “¯‚¶ƒ}ƒX
+ return 1;
+
+ // áŠQ•¨”»’è
+ wpd.path_len=0;
+ wpd.path_pos=0;
+ wpd.path_half=0;
+ return (path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,x,y,0)!=-1)?1:0;
+}
+
+//
+// •à s•¨
+//
+/*==========================================
+ * ŽŸ‚Ì1•à‚É‚©‚©‚鎞ŠÔ‚ðŒvŽZ
+ *------------------------------------------
+ */
+static int calc_next_walk_step(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->walkpath.path_pos>=sd->walkpath.path_len)
+ return -1;
+ if(sd->walkpath.path[sd->walkpath.path_pos]&1)
+ return sd->speed*14/10;
+
+ return sd->speed;
+}
+
+/*==========================================
+ * ”¼•ài‚Þ(timerŠÖ”)
+ *------------------------------------------
+ */
+static int pc_walk(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd;
+ int i,ctype;
+ int moveblock;
+ int x,y,dx,dy;
+
+ sd=map_id2sd(id);
+ if(sd==NULL)
+ return 0;
+
+ if(sd->walktimer != tid){
+ if(battle_config.error_log)
+ printf("pc_walk %d != %d\n",sd->walktimer,tid);
+ return 0;
+ }
+ sd->walktimer=-1;
+ if(sd->walkpath.path_pos>=sd->walkpath.path_len || sd->walkpath.path_pos!=data)
+ return 0;
+
+ //•à‚¢‚½‚Ì‚Å‘§‚̃^ƒCƒ}[‚ð‰Šú‰»
+ sd->inchealspirithptick = 0;
+ sd->inchealspiritsptick = 0;
+
+ sd->walkpath.path_half ^= 1;
+ if(sd->walkpath.path_half==0){ // ƒ}ƒX–Ú’†S‚Ö“ž’…
+ sd->walkpath.path_pos++;
+ if(sd->state.change_walk_target){
+ pc_walktoxy_sub(sd);
+ return 0;
+ }
+ } else { // ƒ}ƒX–Ú‹«ŠE‚Ö“ž’…
+ if(sd->walkpath.path[sd->walkpath.path_pos]>=8)
+ return 1;
+
+ x = sd->bl.x;
+ y = sd->bl.y;
+ ctype = map_getcell(sd->bl.m,x,y);
+ if(ctype == 1 || ctype == 5) {
+ pc_stop_walking(sd,1);
+ return 0;
+ }
+ sd->dir=sd->head_dir=sd->walkpath.path[sd->walkpath.path_pos];
+ dx = dirx[(int)sd->dir];
+ dy = diry[(int)sd->dir];
+ ctype = map_getcell(sd->bl.m,x+dx,y+dy);
+ if(ctype == 1 || ctype == 5) {
+ pc_walktoxy_sub(sd);
+ return 0;
+ }
+
+ moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
+
+ sd->walktimer = 1;
+ map_foreachinmovearea(clif_pcoutsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
+
+ x += dx;
+ y += dy;
+
+ if(moveblock) map_delblock(&sd->bl);
+ sd->bl.x = x;
+ sd->bl.y = y;
+ if(moveblock) map_addblock(&sd->bl);
+
+ if(sd->sc_data[SC_DANCING].timer!=-1)
+ skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy);
+
+ map_foreachinmovearea(clif_pcinsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,0,sd);
+ sd->walktimer = -1;
+
+ if(sd->status.party_id>0){ // ƒp[ƒeƒB‚Ì‚g‚oî•ñ’Ê’mŒŸ¸
+ struct party *p=party_search(sd->status.party_id);
+ if(p!=NULL){
+ int p_flag=0;
+ map_foreachinmovearea(party_send_hp_check,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&p_flag);
+ if(p_flag)
+ sd->party_hp=-1;
+ }
+ }
+ if(sd->status.option&4) // ƒNƒ[ƒLƒ“ƒO‚ÌÁ–ÅŒŸ¸
+ skill_check_cloaking(&sd->bl);
+ /* ƒfƒBƒ{[ƒVƒ‡ƒ“ŒŸ¸ */
+ for(i=0;i<5;i++)
+ if(sd->dev.val1[i]){
+ skill_devotion3(&sd->bl,sd->dev.val1[i]);
+ break;
+ }
+ /* ”íƒfƒBƒ{[ƒVƒ‡ƒ“ŒŸ¸ */
+ if( sd->sc_data && sd->sc_data[SC_DEVOTION].val1){
+ skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1);
+ }
+
+ skill_unit_move(&sd->bl,tick,1); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
+
+ if(map_getcell(sd->bl.m,x,y)&0x80)
+ npc_touch_areanpc(sd,sd->bl.m,x,y);
+ else
+ sd->areanpc_id=0;
+ }
+ if((i=calc_next_walk_step(sd))>0) {
+ i = i>>1;
+ if(i < 1 && sd->walkpath.path_half == 0)
+ i = 1;
+ sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ˆÚ“®‰Â”\‚©Šm”F‚µ‚ÄA‰Â”\‚È‚ç•àsŠJŽn
+ *------------------------------------------
+ */
+static int pc_walktoxy_sub(struct map_session_data *sd)
+{
+ struct walkpath_data wpd;
+ int i;
+
+ nullpo_retr(1, sd);
+
+ if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y,0))
+ return 1;
+ memcpy(&sd->walkpath,&wpd,sizeof(wpd));
+
+ clif_walkok(sd);
+ sd->state.change_walk_target=0;
+
+ if((i=calc_next_walk_step(sd))>0){
+ i = i>>2;
+ sd->walktimer=add_timer(gettick()+i,pc_walk,sd->bl.id,0);
+ }
+ clif_movechar(sd);
+
+ return 0;
+}
+
+/*==========================================
+ * pc•à s—v‹
+ *------------------------------------------
+ */
+int pc_walktoxy(struct map_session_data *sd,int x,int y)
+{
+
+ nullpo_retr(0, sd);
+
+ sd->to_x=x;
+ sd->to_y=y;
+
+ if(sd->walktimer != -1 && sd->state.change_walk_target==0){
+ // Œ»Ý•à‚¢‚Ä‚¢‚éÅ’†‚Ì–Ú“I’n•ÏX‚Ȃ̂Ń}ƒX–Ú‚Ì’†S‚É—ˆ‚½Žž‚É
+ // timerŠÖ”‚©‚çpc_walktoxy_sub‚ðŒÄ‚Ԃ悤‚É‚·‚é
+ sd->state.change_walk_target=1;
+ } else {
+ pc_walktoxy_sub(sd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * •à s’âŽ~
+ *------------------------------------------
+ */
+int pc_stop_walking(struct map_session_data *sd,int type)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->walktimer != -1) {
+ delete_timer(sd->walktimer,pc_walk);
+ sd->walktimer=-1;
+ }
+ sd->walkpath.path_len=0;
+ sd->to_x = sd->bl.x;
+ sd->to_y = sd->bl.y;
+ if(type&0x01)
+ clif_fixpos(&sd->bl);
+ if(type&0x02 && battle_config.pc_damage_delay) {
+ unsigned int tick = gettick();
+ int delay = battle_get_dmotion(&sd->bl);
+ if(sd->canmove_tick < tick)
+ sd->canmove_tick = tick + delay;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y)
+{
+ int moveblock;
+ int dx,dy,dist;
+
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, sd);
+
+ if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,dst_x,dst_y,0))
+ return 1;
+
+ sd->dir = sd->head_dir = map_calc_dir(&sd->bl, dst_x,dst_y);
+
+ dx = dst_x - sd->bl.x;
+ dy = dst_y - sd->bl.y;
+ dist = distance(sd->bl.x,sd->bl.y,dst_x,dst_y);
+
+ moveblock = ( sd->bl.x/BLOCK_SIZE != dst_x/BLOCK_SIZE || sd->bl.y/BLOCK_SIZE != dst_y/BLOCK_SIZE);
+
+ map_foreachinmovearea(clif_pcoutsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,dx,dy,0,sd);
+
+ if(moveblock) map_delblock(&sd->bl);
+ sd->bl.x = dst_x;
+ sd->bl.y = dst_y;
+ if(moveblock) map_addblock(&sd->bl);
+
+ map_foreachinmovearea(clif_pcinsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,0,sd);
+
+ if(sd->status.party_id>0){ // ƒp[ƒeƒB‚Ì‚g‚oî•ñ’Ê’mŒŸ¸
+ struct party *p=party_search(sd->status.party_id);
+ if(p!=NULL){
+ int flag=0;
+ map_foreachinmovearea(party_send_hp_check,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&flag);
+ if(flag)
+ sd->party_hp=-1;
+ }
+ }
+
+ if(sd->status.option&4) // ƒNƒ[ƒLƒ“ƒO‚ÌÁ–ÅŒŸ¸
+ skill_check_cloaking(&sd->bl);
+
+ skill_unit_move(&sd->bl,gettick(),dist+7); // ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒŸ¸
+
+ if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)&0x80)
+ npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y);
+ else
+ sd->areanpc_id=0;
+ return 0;
+}
+
+//
+// •Ší퓬
+//
+/*==========================================
+ * ƒXƒLƒ‹‚ÌŒŸõ Š—L‚µ‚Ä‚¢‚½ê‡Lv‚ª•Ô‚é
+ *------------------------------------------
+ */
+int pc_checkskill(struct map_session_data *sd,int skill_id)
+{
+ if(sd == NULL) return 0;
+ if( skill_id>=10000 ){
+ struct guild *g;
+ if( sd->status.guild_id>0 && (g=guild_search(sd->status.guild_id))!=NULL)
+ return guild_checkskill(g,skill_id);
+ return 0;
+ }
+
+ if(sd->status.skill[skill_id].id == skill_id)
+ return (sd->status.skill[skill_id].lv);
+
+ return 0;
+}
+
+/*==========================================
+ * •Ší•ÏX‚É‚æ‚éƒXƒLƒ‹‚ÌŒp‘±ƒ`ƒFƒbƒN
+ * ˆø”F
+ * struct map_session_data *sd ƒZƒbƒVƒ‡ƒ“ƒf[ƒ^
+ * int nameid ‘•”õ•iID
+ * •Ô‚è’lF
+ * 0 •ÏX‚È‚µ
+ * -1 ƒXƒLƒ‹‚ð‰ðœ
+ *------------------------------------------
+ */
+int pc_checkallowskill(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if( sd->sc_data == NULL )
+ return 0;
+
+ if(!(skill_get_weapontype(KN_TWOHANDQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_TWOHANDQUICKEN].timer!=-1) { // 2HQ
+ skill_status_change_end(&sd->bl,SC_TWOHANDQUICKEN,-1); // 2HQ‚ð‰ðœ
+ return -1;
+ }
+ if(!(skill_get_weapontype(LK_AURABLADE)&(1<<sd->status.weapon)) && sd->sc_data[SC_AURABLADE].timer!=-1) { /* ƒI[ƒ‰ƒuƒŒ[ƒh */
+ skill_status_change_end(&sd->bl,SC_AURABLADE,-1); /* ƒI[ƒ‰ƒuƒŒ[ƒh‚ð‰ðœ */
+ return -1;
+ }
+ if(!(skill_get_weapontype(LK_PARRYING)&(1<<sd->status.weapon)) && sd->sc_data[SC_PARRYING].timer!=-1) { /* ƒpƒŠƒCƒ“ƒO */
+ skill_status_change_end(&sd->bl,SC_PARRYING,-1); /* ƒpƒŠƒCƒ“ƒO‚ð‰ðœ */
+ return -1;
+ }
+ if(!(skill_get_weapontype(LK_CONCENTRATION)&(1<<sd->status.weapon)) && sd->sc_data[SC_CONCENTRATION].timer!=-1) { /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
+ skill_status_change_end(&sd->bl,SC_CONCENTRATION,-1); /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“‚ð‰ðœ */
+ return -1;
+ }
+ if(!(skill_get_weapontype(CR_SPEARQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_SPEARSQUICKEN].timer!=-1){ // ƒXƒsƒAƒNƒBƒbƒPƒ“
+ skill_status_change_end(&sd->bl,SC_SPEARSQUICKEN,-1); // ƒXƒsƒAƒNƒCƒbƒPƒ“‚ð‰ðœ
+ return -1;
+ }
+ if(!(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)) && sd->sc_data[SC_ADRENALINE].timer!=-1){ // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…
+ skill_status_change_end(&sd->bl,SC_ADRENALINE,-1); // ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ…‚ð‰ðœ
+ return -1;
+ }
+
+ if(sd->status.shield <= 0) {
+ if(sd->sc_data[SC_AUTOGUARD].timer!=-1){ // ƒI[ƒgƒK[ƒh
+ skill_status_change_end(&sd->bl,SC_AUTOGUARD,-1);
+ return -1;
+ }
+ if(sd->sc_data[SC_DEFENDER].timer!=-1){ // ƒfƒBƒtƒFƒ“ƒ_[
+ skill_status_change_end(&sd->bl,SC_DEFENDER,-1);
+ return -1;
+ }
+ if(sd->sc_data[SC_REFLECTSHIELD].timer!=-1){ //ƒŠƒtƒŒƒNƒgƒV[ƒ‹ƒh
+ skill_status_change_end(&sd->bl,SC_REFLECTSHIELD,-1);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‘• ”õ•i‚̃`ƒFƒbƒN
+ *------------------------------------------
+ */
+int pc_checkequip(struct map_session_data *sd,int pos)
+{
+ int i;
+
+ nullpo_retr(-1, sd);
+
+ for(i=0;i<11;i++){
+ if(pos & equip_pos[i])
+ return sd->equip_index[i];
+ }
+
+ return -1;
+}
+
+/*==========================================
+ * “]¶E‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
+ *------------------------------------------
+ */
+struct pc_base_job pc_calc_base_job(int b_class)
+{
+ struct pc_base_job bj;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ if(b_class < MAX_PC_CLASS){ //’Êí
+ bj.job = b_class;
+ bj.upper = 0;
+ }else if(b_class >= 4001 && b_class < 4023){ //“]¶E
+ bj.job = b_class - 4001;
+ bj.upper = 1;
+ }else if(b_class == 23 + 4023 -1){ //—{ŽqƒXƒpƒmƒr
+ bj.job = b_class - (4023 - 1);
+ bj.upper = 2;
+ }else{ //—{ŽqƒXƒpƒmƒrˆÈŠO‚Ì—{Žq
+ bj.job = b_class - 4023;
+ bj.upper = 2;
+ }
+
+ if(battle_config.enable_upper_class==0){ //conf‚Å–³Œø‚É‚È‚Á‚Ä‚¢‚½‚çupper=0
+ bj.upper = 0;
+ }
+
+ if(bj.job == 0){
+ bj.type = 0;
+ }else if(bj.job < 7){
+ bj.type = 1;
+ }else{
+ bj.type = 2;
+ }
+
+ return bj;
+}
+
+/*==========================================
+ * PC‚ÌUŒ‚ (timerŠÖ”)
+ *------------------------------------------
+ */
+int pc_attack_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd;
+ struct block_list *bl;
+ struct status_change *sc_data;
+ short *opt;
+ int dist,skill,range;
+
+ sd=map_id2sd(id);
+ if(sd == NULL)
+ return 0;
+ if(sd->attacktimer != tid){
+ if(battle_config.error_log)
+ printf("pc_attack_timer %d != %d\n",sd->attacktimer,tid);
+ return 0;
+ }
+ sd->attacktimer=-1;
+
+ if(sd->bl.prev == NULL)
+ return 0;
+
+ bl=map_id2bl(sd->attacktarget);
+ if(bl==NULL || bl->prev == NULL)
+ return 0;
+
+ if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
+ return 0;
+
+ // “¯‚¶map‚Å‚È‚¢‚È‚çUŒ‚‚µ‚È‚¢
+ // PC‚ªŽ€‚ñ‚Å‚Ä‚àUŒ‚‚µ‚È‚¢
+ if(sd->bl.m != bl->m || pc_isdead(sd))
+ return 0;
+
+ if( sd->opt1>0 || sd->status.option&2 || sd->status.option&16388) // ˆÙí‚È‚Ç‚ÅUŒ‚‚Å‚«‚È‚¢
+ return 0;
+
+ if(sd->sc_data[SC_AUTOCOUNTER].timer != -1)
+ return 0;
+ if(sd->sc_data[SC_BLADESTOP].timer != -1)
+ return 0;
+
+ if((opt = battle_get_option(bl)) != NULL && *opt&0x46)
+ return 0;
+ if(((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_TRICKDEAD].timer != -1) ||
+ ((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_BASILICA].timer != -1 ))
+ return 0;
+
+ if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) <= 0)
+ return 0;
+
+ if(!battle_config.sdelay_attack_enable && pc_checkskill(sd,SA_FREECAST) <= 0) {
+ if(DIFF_TICK(tick , sd->canact_tick) < 0) {
+ clif_skill_fail(sd,1,4,0);
+ return 0;
+ }
+ }
+
+ dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
+ range = sd->attackrange;
+ if(sd->status.weapon != 11) range++;
+ if( dist > range ){ // “Í ‚©‚È‚¢‚̂ňړ®
+ if(pc_can_reach(sd,bl->x,bl->y))
+ clif_movetoattack(sd,bl);
+ return 0;
+ }
+
+ if(dist <= range && !battle_check_range(&sd->bl,bl,range) ) {
+ if(pc_can_reach(sd,bl->x,bl->y) && sd->canmove_tick < tick && (sd->sc_data[SC_ANKLE].timer == -1 || sd->sc_data[SC_SPIDERWEB].timer == -1))
+ pc_walktoxy(sd,bl->x,bl->y);
+ sd->attackabletime = tick + (sd->aspd<<1);
+ }
+ else {
+ if(battle_config.pc_attack_direction_change)
+ sd->dir=sd->head_dir=map_calc_dir(&sd->bl, bl->x,bl->y ); // Œü‚«Ý’è
+
+ if(sd->walktimer != -1)
+ pc_stop_walking(sd,1);
+
+ if(sd->sc_data[SC_COMBO].timer == -1) {
+ map_freeblock_lock();
+ pc_stop_walking(sd,0);
+ sd->attacktarget_lv = battle_weapon_attack(&sd->bl,bl,tick,0);
+ if(!(battle_config.pc_cloak_check_type&2) && sd->sc_data[SC_CLOAKING].timer != -1)
+ skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
+ if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_attack_support)
+ pet_target_check(sd,bl,0);
+ map_freeblock_unlock();
+ if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ[ƒLƒƒƒXƒg
+ sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
+ else
+ sd->attackabletime = tick + (sd->aspd<<1);
+ }
+ else if(sd->attackabletime <= tick) {
+ if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ƒtƒŠ[ƒLƒƒƒXƒg
+ sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100);
+ else
+ sd->attackabletime = tick + (sd->aspd<<1);
+ }
+ if(sd->attackabletime <= tick) sd->attackabletime = tick + (battle_config.max_aspd<<1);
+ }
+
+ if(sd->state.attack_continue) {
+ sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * UŒ‚—v‹
+ * type‚ª1‚È‚çŒp‘±UŒ‚
+ *------------------------------------------
+ */
+int pc_attack(struct map_session_data *sd,int target_id,int type)
+{
+ struct block_list *bl;
+ int d;
+
+ nullpo_retr(0, sd);
+
+ bl=map_id2bl(target_id);
+ if(bl==NULL)
+ return 1;
+
+ if(bl->type==BL_NPC) { // monster npcs [Valaris]
+ npc_click(sd,RFIFOL(sd->fd,2));
+ return 0;
+ }
+
+ if(!battle_check_target(&sd->bl,bl,BCT_ENEMY))
+ return 1;
+ if(sd->attacktimer != -1)
+ pc_stopattack(sd);
+ sd->attacktarget=target_id;
+ sd->state.attack_continue=type;
+
+ d=DIFF_TICK(sd->attackabletime,gettick());
+ if(d>0 && d<2000){ // UŒ‚delay’†
+ sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0);
+ } else {
+ // –{—ˆtimerŠÖ”‚Ȃ̂ňø”‚ð‡‚킹‚é
+ pc_attack_timer(-1,gettick(),sd->bl.id,0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Œp‘±UŒ‚’âŽ~
+ *------------------------------------------
+ */
+int pc_stopattack(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->attacktimer != -1) {
+ delete_timer(sd->attacktimer,pc_attack_timer);
+ sd->attacktimer=-1;
+ }
+ sd->attacktarget=0;
+ sd->state.attack_continue=0;
+
+ return 0;
+}
+
+int pc_follow_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd, *bl;
+
+ sd=map_id2sd(id);
+ if(sd == NULL || sd->followtimer != tid)
+ return 0;
+
+ sd->followtimer=-1;
+
+ do {
+ if(sd->bl.prev == NULL)
+ break;
+
+ bl=(struct map_session_data *) map_id2bl(sd->followtarget);
+
+ if(bl==NULL)
+ return 0;
+
+ if(bl->bl.prev == NULL)
+ break;
+
+ if(bl->bl.type == BL_PC && pc_isdead((struct map_session_data *)bl))
+ return 0;
+
+ if (sd->skilltimer == -1 && sd->attacktimer == -1 && sd->walktimer == -1) {
+ if((sd->bl.m == bl->bl.m) && pc_can_reach(sd,bl->bl.x,bl->bl.y)) {
+ if (distance(sd->bl.x,sd->bl.y,bl->bl.x,bl->bl.y) > 5)
+ pc_walktoxy(sd,bl->bl.x,bl->bl.y);
+ } else
+ pc_setpos((struct map_session_data*)sd, bl->mapname, bl->bl.x, bl->bl.y, 3);
+ }
+ } while (0);
+
+ sd->followtimer=add_timer(tick + sd->aspd,pc_follow_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+int pc_follow(struct map_session_data *sd,int target_id)
+{
+ struct block_list *bl;
+
+ bl=map_id2bl(target_id);
+ if(bl==NULL)
+ return 1;
+ sd->followtarget=target_id;
+ if(sd->followtimer != -1) {
+ delete_timer(sd->followtimer,pc_follow_timer);
+ sd->followtimer = -1;
+ }
+
+ pc_follow_timer(-1,gettick(),sd->bl.id,0);
+
+ return 0;
+}
+
+int pc_checkbaselevelup(struct map_session_data *sd)
+{
+ int next = pc_nextbaseexp(sd);
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.base_exp >= next && next > 0){
+ struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
+
+ // base‘¤ƒŒƒxƒ‹ƒAƒbƒvˆ—
+ sd->status.base_exp -= next;
+
+ sd->status.base_level ++;
+ sd->status.status_point += (sd->status.base_level+14) / 5 ;
+ clif_updatestatus(sd,SP_STATUSPOINT);
+ clif_updatestatus(sd,SP_BASELEVEL);
+ clif_updatestatus(sd,SP_NEXTBASEEXP);
+ pc_calcstatus(sd,0);
+ pc_heal(sd,sd->status.max_hp,sd->status.max_sp);
+
+ //ƒXƒpƒmƒr‚̓LƒŠƒGAƒCƒ€ƒ|Aƒ}ƒjƒsAƒOƒAƒTƒtƒ‰Lv1‚ª‚©‚©‚é
+ if(s_class.job == 23){
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],1,0,0,0,skill_get_time(PR_KYRIE,1),0 );
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 );
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 );
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],1,0,0,0,skill_get_time(PR_GLORIA,1),0 );
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 );
+ }
+
+ clif_misceffect(&sd->bl,0);
+ //ƒŒƒxƒ‹ƒAƒbƒv‚µ‚½‚̂Ńp[ƒeƒB[î•ñ‚ðXV‚·‚é
+ //(Œö•½”͈̓`ƒFƒbƒN)
+ party_send_movemap(sd);
+ return 1;
+ }
+
+ return 0;
+}
+
+int pc_checkjoblevelup(struct map_session_data *sd)
+{
+ int next = pc_nextjobexp(sd);
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.job_exp >= next && next > 0){
+ // job‘¤ƒŒƒxƒ‹ƒAƒbƒvˆ—
+ sd->status.job_exp -= next;
+ sd->status.job_level ++;
+ clif_updatestatus(sd,SP_JOBLEVEL);
+ clif_updatestatus(sd,SP_NEXTJOBEXP);
+ sd->status.skill_point ++;
+ clif_updatestatus(sd,SP_SKILLPOINT);
+ pc_calcstatus(sd,0);
+
+ clif_misceffect(&sd->bl,1);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ŒoŒ±’lŽæ“¾
+ *------------------------------------------
+ */
+int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp)
+{
+ char output[256];
+ nullpo_retr(0, sd);
+
+ if(sd->bl.prev == NULL || pc_isdead(sd))
+ return 0;
+
+ if((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr]
+ return 0; // no exp on pvp maps
+
+ if(sd->sc_data[SC_RICHMANKIM].timer != -1) { // added bounds checking [Vaalris]
+ base_exp += base_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
+ job_exp += job_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100;
+ }
+
+ if(sd->status.guild_id>0){ // ƒMƒ‹ƒh‚Éã”[
+ base_exp-=guild_payexp(sd,base_exp);
+ if(base_exp < 0)
+ base_exp = 0;
+ }
+
+ if(!battle_config.multi_level_up && pc_nextbaseafter(sd) && sd->status.base_exp+base_exp >= pc_nextbaseafter(sd)) {
+ base_exp = pc_nextbaseafter(sd) - sd->status.base_exp;
+ if (base_exp < 0)
+ base_exp = 0;
+ }
+
+ sd->status.base_exp += base_exp;
+ if(sd->status.base_exp < 0)
+ sd->status.base_exp = 0;
+
+ while(pc_checkbaselevelup(sd)) ;
+
+ clif_updatestatus(sd,SP_BASEEXP);
+ if(!battle_config.multi_level_up && pc_nextjobafter(sd) && sd->status.job_exp+job_exp >= pc_nextjobafter(sd)) {
+ job_exp = pc_nextjobafter(sd) - sd->status.job_exp;
+ if (job_exp < 0)
+ job_exp = 0;
+ }
+
+ sd->status.job_exp += job_exp;
+ if(sd->status.job_exp < 0)
+ sd->status.job_exp = 0;
+
+ while(pc_checkjoblevelup(sd)) ;
+
+ clif_updatestatus(sd,SP_JOBEXP);
+
+ if(battle_config.disp_experience){
+ sprintf(output,
+ "Experienced Gained Base:%d Job:%d",base_exp,job_exp);
+ clif_disp_onlyself(sd,output,strlen(output));
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * base level‘¤•K—vŒoŒ±’lŒvŽZ
+ *------------------------------------------
+ */
+int pc_nextbaseexp(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
+ return 0;
+
+ if(sd->status.class==0) i=0;
+ else if(sd->status.class<=6) i=1;
+ else if(sd->status.class<=22) i=2;
+ else if(sd->status.class==23) i=3;
+ else if(sd->status.class==4001) i=4;
+ else if(sd->status.class<=4007) i=5;
+ else i=6;
+
+ return exp_table[i][sd->status.base_level-1];
+}
+
+/*==========================================
+ * job level‘¤•K—vŒoŒ±’lŒvŽZ
+ *------------------------------------------
+ */
+int pc_nextjobexp(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
+ return 0;
+
+ if(sd->status.class==0) i=7;
+ else if(sd->status.class<=6) i=8;
+ else if(sd->status.class<=22) i=9;
+ else if(sd->status.class==23) i=10;
+ else if(sd->status.class==4001) i=11;
+ else if(sd->status.class<=4007) i=12;
+ else i=13;
+
+ return exp_table[i][sd->status.job_level-1];
+}
+
+/*==========================================
+ * base level after next [Valaris]
+ *------------------------------------------
+ */
+int pc_nextbaseafter(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0)
+ return 0;
+
+ if(sd->status.class==0) i=0;
+ else if(sd->status.class<=6) i=1;
+ else if(sd->status.class<=22) i=2;
+ else if(sd->status.class==23) i=3;
+ else if(sd->status.class==4001) i=4;
+ else if(sd->status.class<=4007) i=5;
+ else i=6;
+
+ return exp_table[i][sd->status.base_level];
+}
+
+/*==========================================
+ * job level after next [Valaris]
+ *------------------------------------------
+ */
+int pc_nextjobafter(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0)
+ return 0;
+
+ if(sd->status.class==0) i=7;
+ else if(sd->status.class<=6) i=8;
+ else if(sd->status.class<=22) i=9;
+ else if(sd->status.class==23) i=10;
+ else if(sd->status.class==4001) i=11;
+ else if(sd->status.class<=4007) i=12;
+ else i=13;
+
+ return exp_table[i][sd->status.job_level];
+}
+/*==========================================
+
+ * •K—vƒXƒe[ƒ^ƒXƒ|ƒCƒ“ƒgŒvŽZ
+ *------------------------------------------
+ */
+int pc_need_status_point(struct map_session_data *sd,int type)
+{
+ int val;
+
+ nullpo_retr(-1, sd);
+
+ if(type<SP_STR || type>SP_LUK)
+ return -1;
+ val =
+ type==SP_STR ? sd->status.str :
+ type==SP_AGI ? sd->status.agi :
+ type==SP_VIT ? sd->status.vit :
+ type==SP_INT ? sd->status.int_:
+ type==SP_DEX ? sd->status.dex : sd->status.luk;
+
+ return (val+9)/10+1;
+}
+
+/*==========================================
+ * ”\—Í’l¬’·
+ *------------------------------------------
+ */
+int pc_statusup(struct map_session_data *sd,int type)
+{
+ int need,val = 0;
+
+ nullpo_retr(0, sd);
+
+ need=pc_need_status_point(sd,type);
+ if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point){
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ switch(type){
+ case SP_STR:
+ if(sd->status.str >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.str;
+ break;
+ case SP_AGI:
+ if(sd->status.agi >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.agi;
+ break;
+ case SP_VIT:
+ if(sd->status.vit >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.vit;
+ break;
+ case SP_INT:
+ if(sd->status.int_ >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.int_;
+ break;
+ case SP_DEX:
+ if(sd->status.dex >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.dex;
+ break;
+ case SP_LUK:
+ if(sd->status.luk >= battle_config.max_parameter) {
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ val= ++sd->status.luk;
+ break;
+ }
+ sd->status.status_point-=need;
+ if(need!=pc_need_status_point(sd,type)){
+ clif_updatestatus(sd,type-SP_STR+SP_USTR);
+ }
+ clif_updatestatus(sd,SP_STATUSPOINT);
+ clif_updatestatus(sd,type);
+ pc_calcstatus(sd,0);
+ clif_statusupack(sd,type,1,val);
+
+ return 0;
+}
+
+/*==========================================
+ * ”\—Í’l¬’·
+ *------------------------------------------
+ */
+int pc_statusup2(struct map_session_data *sd,int type,int val)
+{
+ nullpo_retr(0, sd);
+
+ if(type<SP_STR || type>SP_LUK){
+ clif_statusupack(sd,type,0,0);
+ return 1;
+ }
+ switch(type){
+ case SP_STR:
+ if(sd->status.str + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.str + val < 1)
+ val = 1;
+ else
+ val += sd->status.str;
+ sd->status.str = val;
+ break;
+ case SP_AGI:
+ if(sd->status.agi + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.agi + val < 1)
+ val = 1;
+ else
+ val += sd->status.agi;
+ sd->status.agi = val;
+ break;
+ case SP_VIT:
+ if(sd->status.vit + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.vit + val < 1)
+ val = 1;
+ else
+ val += sd->status.vit;
+ sd->status.vit = val;
+ break;
+ case SP_INT:
+ if(sd->status.int_ + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.int_ + val < 1)
+ val = 1;
+ else
+ val += sd->status.int_;
+ sd->status.int_ = val;
+ break;
+ case SP_DEX:
+ if(sd->status.dex + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.dex + val < 1)
+ val = 1;
+ else
+ val += sd->status.dex;
+ sd->status.dex = val;
+ break;
+ case SP_LUK:
+ if(sd->status.luk + val >= battle_config.max_parameter)
+ val = battle_config.max_parameter;
+ else if(sd->status.luk + val < 1)
+ val = 1;
+ else
+ val = sd->status.luk + val;
+ sd->status.luk = val;
+ break;
+ }
+ clif_updatestatus(sd,type-SP_STR+SP_USTR);
+ clif_updatestatus(sd,type);
+ pc_calcstatus(sd,0);
+ clif_statusupack(sd,type,1,val);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ|ƒCƒ“ƒgŠ„‚èU‚è
+ *------------------------------------------
+ */
+int pc_skillup(struct map_session_data *sd,int skill_num)
+{
+ nullpo_retr(0, sd);
+
+ if( skill_num>=10000 ){
+ guild_skillup(sd,skill_num,0);
+ return 0;
+ }
+
+ if( sd->status.skill_point>0 &&
+ sd->status.skill[skill_num].id!=0 &&
+ sd->status.skill[skill_num].lv < skill_get_max(skill_num) )
+ {
+ sd->status.skill[skill_num].lv++;
+ sd->status.skill_point--;
+ pc_calcstatus(sd,0);
+ clif_skillup(sd,skill_num);
+ clif_updatestatus(sd,SP_SKILLPOINT);
+ clif_skillinfoblock(sd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * /allskill
+ *------------------------------------------
+ */
+int pc_allskillup(struct map_session_data *sd)
+{
+ int i,id;
+ int c=0, s=0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ s_class = pc_calc_base_job(sd->status.class);
+ c = s_class.job;
+ s = (s_class.upper==1) ? 1 : 0 ; //“]¶ˆÈŠO‚Í’Êí‚̃XƒLƒ‹H
+
+ for(i=0;i<MAX_SKILL;i++){
+ sd->status.skill[i].id=0;
+ if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardƒXƒLƒ‹‚È‚çA
+ sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // –{“–‚Ìlv‚É
+ sd->status.skill[i].flag=0; // flag‚Í0‚É‚µ‚Ä‚¨‚­
+ }
+ }
+
+ if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
+ // ‘S‚ẴXƒLƒ‹
+ for(i=1;i<158;i++)
+ sd->status.skill[i].lv=skill_get_max(i);
+ for(i=210;i<291;i++)
+ sd->status.skill[i].lv=skill_get_max(i);
+ for(i=304;i<MAX_SKILL;i++){
+ if(i==331) continue;
+ sd->status.skill[i].lv=skill_get_max(i);
+ }
+ }
+ else {
+ for(i=0;(id=skill_tree[s][c][i].id)>0;i++){
+ if(sd->status.skill[id].id==0 && (!(skill_get_inf2(id)&0x01) || battle_config.quest_skill_learn) )
+ sd->status.skill[id].lv=skill_get_max(id);
+ }
+ }
+ pc_calcstatus(sd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * /resetlvl
+ *------------------------------------------
+ */
+int pc_resetlvl(struct map_session_data* sd,int type)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=1;i<MAX_SKILL;i++){
+ sd->status.skill[i].lv = 0;
+ }
+
+ if(type == 1){
+ sd->status.skill_point=0;
+ sd->status.base_level=1;
+ sd->status.job_level=1;
+ sd->status.base_exp=sd->status.base_exp=0;
+ sd->status.job_exp=sd->status.job_exp=0;
+ if(sd->status.option !=0)
+ sd->status.option = 0;
+
+ sd->status.str=1;
+ sd->status.agi=1;
+ sd->status.vit=1;
+ sd->status.int_=1;
+ sd->status.dex=1;
+ sd->status.luk=1;
+ if(sd->status.class == 4001)
+ sd->status.status_point=88;
+ }
+
+ if(type == 2){
+ sd->status.skill_point=0;
+ sd->status.base_level=1;
+ sd->status.job_level=1;
+ sd->status.base_exp=0;
+ sd->status.job_exp=0;
+ }
+ if(type == 3){
+ sd->status.base_level=1;
+ sd->status.base_exp=0;
+ }
+ if(type == 4){
+ sd->status.job_level=1;
+ sd->status.job_exp=0;
+ }
+
+ clif_updatestatus(sd,SP_STATUSPOINT);
+ clif_updatestatus(sd,SP_STR);
+ clif_updatestatus(sd,SP_AGI);
+ clif_updatestatus(sd,SP_VIT);
+ clif_updatestatus(sd,SP_INT);
+ clif_updatestatus(sd,SP_DEX);
+ clif_updatestatus(sd,SP_LUK);
+ clif_updatestatus(sd,SP_BASELEVEL);
+ clif_updatestatus(sd,SP_JOBLEVEL);
+ clif_updatestatus(sd,SP_STATUSPOINT);
+ clif_updatestatus(sd,SP_NEXTBASEEXP);
+ clif_updatestatus(sd,SP_NEXTJOBEXP);
+ clif_updatestatus(sd,SP_SKILLPOINT);
+
+ clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
+ clif_updatestatus(sd,SP_UAGI);
+ clif_updatestatus(sd,SP_UVIT);
+ clif_updatestatus(sd,SP_UINT);
+ clif_updatestatus(sd,SP_UDEX);
+ clif_updatestatus(sd,SP_ULUK); // End Addition
+
+ for(i=0;i<11;i++) { // unequip items that can't be equipped by base 1 [Valaris]
+ if(sd->equip_index[i] >= 0)
+ if(!pc_isequip(sd,sd->equip_index[i]))
+ pc_unequipitem(sd,sd->equip_index[i],1);
+ }
+
+ clif_skillinfoblock(sd);
+ pc_calcstatus(sd,0);
+
+ return 0;
+}
+/*==========================================
+ * /resetstate
+ *------------------------------------------
+ */
+int pc_resetstate(struct map_session_data* sd)
+{
+ #define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2)
+// int add=0; // Removed by Dexity
+
+ nullpo_retr(0, sd);
+
+// New statpoint table used here - Dexity
+ sd->status.status_point = atoi (statp[sd->status.base_level - 1]);
+ if(sd->status.class >= 4001 && sd->status.class <= 4024)
+ sd->status.status_point+=40;
+// End addition
+
+// Removed by Dexity - old count
+// add += sumsp(sd->status.str);
+// add += sumsp(sd->status.agi);
+// add += sumsp(sd->status.vit);
+// add += sumsp(sd->status.int_);
+// add += sumsp(sd->status.dex);
+// add += sumsp(sd->status.luk);
+// sd->status.status_point+=add;
+
+ clif_updatestatus(sd,SP_STATUSPOINT);
+
+ sd->status.str=1;
+ sd->status.agi=1;
+ sd->status.vit=1;
+ sd->status.int_=1;
+ sd->status.dex=1;
+ sd->status.luk=1;
+
+ clif_updatestatus(sd,SP_STR);
+ clif_updatestatus(sd,SP_AGI);
+ clif_updatestatus(sd,SP_VIT);
+ clif_updatestatus(sd,SP_INT);
+ clif_updatestatus(sd,SP_DEX);
+ clif_updatestatus(sd,SP_LUK);
+
+ clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris
+ clif_updatestatus(sd,SP_UAGI);
+ clif_updatestatus(sd,SP_UVIT);
+ clif_updatestatus(sd,SP_UINT);
+ clif_updatestatus(sd,SP_UDEX);
+ clif_updatestatus(sd,SP_ULUK); // End Addition
+
+ pc_calcstatus(sd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * /resetskill
+ *------------------------------------------
+ */
+int pc_resetskill(struct map_session_data* sd)
+{
+ int i,skill;
+
+ nullpo_retr(0, sd);
+
+ for(i=1;i<MAX_SKILL;i++){
+ if( (skill = pc_checkskill(sd,i)) > 0) {
+ if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
+ if(!sd->status.skill[i].flag)
+ sd->status.skill_point += skill;
+ else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
+ sd->status.skill_point += (sd->status.skill[i].flag - 2);
+ }
+ sd->status.skill[i].lv = 0;
+ }
+ else if(battle_config.quest_skill_reset)
+ sd->status.skill[i].lv = 0;
+ sd->status.skill[i].flag = 0;
+ }
+ else
+ sd->status.skill[i].lv = 0;
+ }
+ clif_updatestatus(sd,SP_SKILLPOINT);
+ clif_skillinfoblock(sd);
+ pc_calcstatus(sd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * pc‚Ƀ_ƒ[ƒW‚ð—^‚¦‚é
+ *------------------------------------------
+ */
+int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
+{
+ int i=0,j=0;
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ s_class = pc_calc_base_job(sd->status.class);
+ // Šù‚ÉŽ€‚ñ‚Å‚¢‚½‚ç–³Œø
+ if(pc_isdead(sd))
+ return 0;
+ // À‚Á‚Ä‚½‚ç—§‚¿ã‚ª‚é
+ if(pc_issit(sd)) {
+ pc_setstand(sd);
+ skill_gangsterparadise(sd,0);
+ }
+
+ // •à ‚¢‚Ä‚¢‚½‚ç‘«‚ðŽ~‚ß‚é
+ if(sd->sc_data[SC_ENDURE].timer == -1 && !sd->special_state.infinite_endure)
+ pc_stop_walking(sd,3);
+ else if(sd->sc_data[SC_ENDURE].timer != -1 && src->type==BL_MOB) // [Celest]
+ if((--sd->sc_data[SC_ENDURE].val2) <= 0)
+ skill_status_change_end(&sd->bl, SC_ENDURE, -1);
+ // ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†’f
+ if(damage > sd->status.max_hp>>2)
+ skill_stop_dancing(&sd->bl,0);
+
+ sd->status.hp-=damage;
+ if(sd->status.pet_id > 0 && sd->pd && sd->petDB && battle_config.pet_damage_support)
+ pet_target_check(sd,src,1);
+
+ if (sd->sc_data[SC_TRICKDEAD].timer != -1)
+ skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1);
+ if(sd->status.option&2)
+ skill_status_change_end(&sd->bl, SC_HIDING, -1);
+ if(sd->status.option&4)
+ skill_status_change_end(&sd->bl, SC_CLOAKING, -1);
+ if(sd->status.option&16386)
+ skill_status_change_end(&sd->bl, SC_CHASEWALK, -1);
+
+ if(sd->status.hp>0){
+ // ‚Ü‚¾¶‚«‚Ä‚¢‚é‚È‚çHPXV
+ clif_updatestatus(sd,SP_HP);
+
+ if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
+ (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ))
+ // ƒI[ƒgƒo[ƒT[ƒN”­“®
+ skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
+
+ sd->canlog_tick = gettick();
+
+ if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
+ struct party *p=party_search(sd->status.party_id);
+ if(p!=NULL) clif_party_hp(p,sd);
+ } // end addition [Valaris]
+
+ return 0;
+ }
+ sd->status.hp = 0;
+ pc_setdead(sd);
+ if(sd->vender_id)
+ vending_closevending(sd);
+
+ if(sd->status.pet_id > 0 && sd->pd) {
+ if(sd->petDB) {
+ sd->pet.intimate -= sd->petDB->die;
+ if(sd->pet.intimate < 0)
+ sd->pet.intimate = 0;
+ clif_send_petdata(sd,1,sd->pet.intimate);
+ }
+ }
+
+ pc_stop_walking(sd,0);
+ skill_castcancel(&sd->bl,0); // ‰r¥‚Ì’†Ž~
+ clif_clearchar_area(&sd->bl,1);
+ skill_unit_out_all(&sd->bl,gettick(),1);
+ if(sd->sc_data[SC_BLADESTOP].timer!=-1)//”’n‚ÍŽ–‘O‚ɉðœ
+ skill_status_change_end(&sd->bl,SC_BLADESTOP,-1);
+ pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter); //Ž€‚ɃJƒEƒ“ƒ^[‘‚«ž‚Ý
+ skill_status_change_clear(&sd->bl,0); // ƒXƒe[ƒ^ƒXˆÙí‚ð‰ðœ‚·‚é
+ clif_updatestatus(sd,SP_HP);
+ pc_calcstatus(sd,0);
+
+ for(i=0;i<5;i++)
+ if(sd->dev.val1[i]){
+ skill_status_change_end(&map_id2sd(sd->dev.val1[i])->bl,SC_DEVOTION,-1);
+ sd->dev.val1[i] = sd->dev.val2[i]=0;
+ }
+
+ if(battle_config.death_penalty_type>0) { // changed penalty options, added death by player if pk_mode [Valaris]
+ if(sd->status.class != 0 && !map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg){ // only novices will recieve no penalty
+ if(battle_config.death_penalty_type==1 && battle_config.death_penalty_base > 0)
+ sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000;
+ if(battle_config.pk_mode && src && src->type==BL_PC)
+ sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000;
+ else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_base > 0) {
+ if(pc_nextbaseexp(sd) > 0)
+ sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000;
+ if(battle_config.pk_mode && src && src->type==BL_PC)
+ sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000;
+ }
+ if(sd->status.base_exp < 0)
+ sd->status.base_exp = 0;
+ clif_updatestatus(sd,SP_BASEEXP);
+
+ if(battle_config.death_penalty_type==1 && battle_config.death_penalty_job > 0)
+ sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000;
+ if(battle_config.pk_mode && src && src->type==BL_PC)
+ sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000;
+ else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_job > 0) {
+ if(pc_nextjobexp(sd) > 0)
+ sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000;
+ if(battle_config.pk_mode && src && src->type==BL_PC)
+ sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000;
+ }
+ if(sd->status.job_exp < 0)
+ sd->status.job_exp = 0;
+ clif_updatestatus(sd,SP_JOBEXP);
+ }
+ }
+ //ƒiƒCƒgƒƒAƒ‚[ƒhƒAƒCƒeƒ€ƒhƒƒbƒv
+ if(map[sd->bl.m].flag.pvp_nightmaredrop){ // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker]
+ for(j=0;j<MAX_DROP_PER_MAP;j++){
+ int id = map[sd->bl.m].drop_list[j].drop_id;
+ int type = map[sd->bl.m].drop_list[j].drop_type;
+ int per = map[sd->bl.m].drop_list[j].drop_per;
+ if(id == 0)
+ continue;
+ if(id == -1){//ƒ‰ƒ“ƒ_ƒ€ƒhƒƒbƒv
+ int eq_num=0,eq_n[MAX_INVENTORY];
+ memset(eq_n,0,sizeof(eq_n));
+ //悸‘•”õ‚µ‚Ä‚¢‚éƒAƒCƒeƒ€”‚ðƒJƒEƒ“ƒg
+ for(i=0;i<MAX_INVENTORY;i++){
+ int k;
+ if( (type == 1 && !sd->status.inventory[i].equip)
+ || (type == 2 && sd->status.inventory[i].equip)
+ || type == 3){
+ //InventoryIndex‚ðŠi”[
+ for(k=0;k<MAX_INVENTORY;k++){
+ if(eq_n[k] <= 0){
+ eq_n[k]=i;
+ break;
+ }
+ }
+ eq_num++;
+ }
+ }
+ if(eq_num > 0){
+ int n = eq_n[rand()%eq_num];//ŠY“–ƒAƒCƒeƒ€‚Ì’†‚©‚烉ƒ“ƒ_ƒ€
+ if(rand()%10000 < per){
+ if(sd->status.inventory[n].equip)
+ pc_unequipitem(sd,n,0);
+ pc_dropitem(sd,n,1);
+ }
+ }
+ }
+ else if(id > 0){
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid == id//ItemID‚ªˆê’v‚µ‚Ä‚¢‚Ä
+ && rand()%10000 < per//ƒhƒƒbƒv—¦”»’è‚àOK‚Å
+ && ((type == 1 && !sd->status.inventory[i].equip)//ƒ^ƒCƒv”»’è‚àOK‚È‚çƒhƒƒbƒv
+ || (type == 2 && sd->status.inventory[i].equip)
+ || type == 3) ){
+ if(sd->status.inventory[i].equip)
+ pc_unequipitem(sd,i,0);
+ pc_dropitem(sd,i,1);
+ break;
+ }
+ }
+ }
+ }
+ }
+ // pvp
+ if( map[sd->bl.m].flag.pvp && !battle_config.pk_mode){ // disable certain pvp functions on pk_mode [Valaris]
+ //ƒ‰ƒ“ƒLƒ“ƒOŒvŽZ
+ if(!map[sd->bl.m].flag.pvp_nocalcrank){
+ sd->pvp_point-=5;
+ if(src && src->type==BL_PC )
+ ((struct map_session_data *)src)->pvp_point++;
+ //} //fixed wrong '{' placement by Lupus
+ pc_setdead(sd);
+ }
+ // ‹­§‘—ŠÒ
+ if( sd->pvp_point < 0 ){
+ sd->pvp_point=0;
+ pc_setstand(sd);
+ pc_setrestartvalue(sd,3);
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
+ }
+ }
+ //GvG
+ if(map[sd->bl.m].flag.gvg){
+ pc_setstand(sd);
+ pc_setrestartvalue(sd,3);
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0);
+ }
+
+ return 0;
+}
+
+//
+// scriptŠÖ ˜A
+//
+/*==========================================
+ * script—pPCƒXƒe[ƒ^ƒX“Ç‚Ýo‚µ
+ *------------------------------------------
+ */
+int pc_readparam(struct map_session_data *sd,int type)
+{
+ int val=0;
+ struct pc_base_job s_class;
+
+ s_class = pc_calc_base_job(sd->status.class);
+
+ nullpo_retr(0, sd);
+
+ switch(type){
+ case SP_SKILLPOINT:
+ val= sd->status.skill_point;
+ break;
+ case SP_STATUSPOINT:
+ val= sd->status.status_point;
+ break;
+ case SP_ZENY:
+ val= sd->status.zeny;
+ break;
+ case SP_BASELEVEL:
+ val= sd->status.base_level;
+ break;
+ case SP_JOBLEVEL:
+ val= sd->status.job_level;
+ break;
+ case SP_CLASS:
+ if(val>=24 && val < 45)
+ val+=3978;
+ else
+ val= sd->status.class;
+ break;
+ case SP_UPPER:
+ val= s_class.upper;
+ break;
+ case SP_SEX:
+ val= sd->sex;
+ break;
+ case SP_WEIGHT:
+ val= sd->weight;
+ break;
+ case SP_MAXWEIGHT:
+ val= sd->max_weight;
+ break;
+ case SP_BASEEXP:
+ val= sd->status.base_exp;
+ break;
+ case SP_JOBEXP:
+ val= sd->status.job_exp;
+ break;
+ case SP_NEXTBASEEXP:
+ val= pc_nextbaseexp(sd);
+ break;
+ case SP_NEXTJOBEXP:
+ val= pc_nextjobexp(sd);
+ break;
+ case SP_HP:
+ val= sd->status.hp;
+ break;
+ case SP_MAXHP:
+ val= sd->status.max_hp;
+ break;
+ case SP_SP:
+ val= sd->status.sp;
+ break;
+ case SP_MAXSP:
+ val= sd->status.max_sp;
+ break;
+ case SP_STR:
+ val= sd->status.str;
+ break;
+ case SP_AGI:
+ val= sd->status.agi;
+ break;
+ case SP_VIT:
+ val= sd->status.vit;
+ break;
+ case SP_INT:
+ val= sd->status.int_;
+ break;
+ case SP_DEX:
+ val= sd->status.dex;
+ break;
+ case SP_LUK:
+ val= sd->status.luk;
+ break;
+ case SP_FAME:
+ val= sd->fame;
+ break;
+ }
+
+ return val;
+}
+
+/*==========================================
+ * script—pPCƒXƒe[ƒ^ƒXÝ’è
+ *------------------------------------------
+ */
+int pc_setparam(struct map_session_data *sd,int type,int val)
+{
+ int i = 0,up_level = 50;
+ struct pc_base_job s_class;
+
+ nullpo_retr(0, sd);
+
+ s_class = pc_calc_base_job(sd->status.class);
+
+ switch(type){
+ case SP_BASELEVEL:
+ if (val > sd->status.base_level) {
+ for (i = 1; i <= (val - sd->status.base_level); i++)
+ sd->status.status_point += (sd->status.base_level + i + 14) / 5 ;
+ }
+ sd->status.base_level = val;
+ sd->status.base_exp = 0;
+ clif_updatestatus(sd, SP_BASELEVEL);
+ clif_updatestatus(sd, SP_NEXTBASEEXP);
+ clif_updatestatus(sd, SP_STATUSPOINT);
+ clif_updatestatus(sd, SP_BASEEXP);
+ pc_calcstatus(sd, 0);
+ pc_heal(sd, sd->status.max_hp, sd->status.max_sp);
+ break;
+ case SP_JOBLEVEL:
+ if (sd->status.class == 0)
+ up_level -= 40;
+ if ((sd->status.class == 23) || (sd->status.class >= 4001 && sd->status.class <= 4022))
+ up_level += 20;
+ if (val >= sd->status.job_level) {
+ if (val > up_level)val = up_level;
+ sd->status.skill_point += (val-sd->status.job_level);
+ sd->status.job_level = val;
+ sd->status.job_exp = 0;
+ clif_updatestatus(sd, SP_JOBLEVEL);
+ clif_updatestatus(sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP_JOBEXP);
+ clif_updatestatus(sd, SP_SKILLPOINT);
+ pc_calcstatus(sd, 0);
+ clif_misceffect(&sd->bl, 1);
+ } else {
+ sd->status.job_level = val;
+ sd->status.job_exp = 0;
+ clif_updatestatus(sd, SP_JOBLEVEL);
+ clif_updatestatus(sd, SP_NEXTJOBEXP);
+ clif_updatestatus(sd, SP_JOBEXP);
+ pc_calcstatus(sd, 0);
+ }
+ clif_updatestatus(sd,type);
+ break;
+ case SP_SKILLPOINT:
+ sd->status.skill_point = val;
+ break;
+ case SP_STATUSPOINT:
+ sd->status.status_point = val;
+ break;
+ case SP_ZENY:
+ sd->status.zeny = val;
+ break;
+ case SP_BASEEXP:
+ if(pc_nextbaseexp(sd) > 0) {
+ sd->status.base_exp = val;
+ if(sd->status.base_exp < 0)
+ sd->status.base_exp=0;
+ pc_checkbaselevelup(sd);
+ }
+ break;
+ case SP_JOBEXP:
+ if(pc_nextjobexp(sd) > 0) {
+ sd->status.job_exp = val;
+ if(sd->status.job_exp < 0)
+ sd->status.job_exp=0;
+ pc_checkjoblevelup(sd);
+ }
+ break;
+ case SP_SEX:
+ sd->sex = val;
+ break;
+ case SP_WEIGHT:
+ sd->weight = val;
+ break;
+ case SP_MAXWEIGHT:
+ sd->max_weight = val;
+ break;
+ case SP_HP:
+ sd->status.hp = val;
+ break;
+ case SP_MAXHP:
+ sd->status.max_hp = val;
+ break;
+ case SP_SP:
+ sd->status.sp = val;
+ break;
+ case SP_MAXSP:
+ sd->status.max_sp = val;
+ break;
+ case SP_STR:
+ sd->status.str = val;
+ break;
+ case SP_AGI:
+ sd->status.agi = val;
+ break;
+ case SP_VIT:
+ sd->status.vit = val;
+ break;
+ case SP_INT:
+ sd->status.int_ = val;
+ break;
+ case SP_DEX:
+ sd->status.dex = val;
+ break;
+ case SP_LUK:
+ sd->status.luk = val;
+ break;
+ case SP_FAME:
+ sd->fame = val;
+ break;
+ }
+ clif_updatestatus(sd,type);
+
+ return 0;
+}
+
+/*==========================================
+ * HP/SP‰ñ•œ
+ *------------------------------------------
+ */
+int pc_heal(struct map_session_data *sd,int hp,int sp)
+{
+// if(battle_config.battle_log)
+// printf("heal %d %d\n",hp,sp);
+
+ nullpo_retr(0, sd);
+
+ if(pc_checkoverhp(sd)) {
+ if(hp > 0)
+ hp = 0;
+ }
+ if(pc_checkoversp(sd)) {
+ if(sp > 0)
+ sp = 0;
+ }
+
+ if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ƒo[ƒT[ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
+ return 0;
+
+ if(hp+sd->status.hp>sd->status.max_hp)
+ hp=sd->status.max_hp-sd->status.hp;
+ if(sp+sd->status.sp>sd->status.max_sp)
+ sp=sd->status.max_sp-sd->status.sp;
+ sd->status.hp+=hp;
+ if(sd->status.hp <= 0) {
+ sd->status.hp = 0;
+ pc_damage(NULL,sd,1);
+ hp = 0;
+ }
+ sd->status.sp+=sp;
+ if(sd->status.sp <= 0)
+ sd->status.sp = 0;
+ if(hp)
+ clif_updatestatus(sd,SP_HP);
+ if(sp)
+ clif_updatestatus(sd,SP_SP);
+
+ if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris]
+ struct party *p=party_search(sd->status.party_id);
+ if(p!=NULL) clif_party_hp(p,sd);
+ } // end addition [Valaris]
+
+ return hp + sp;
+}
+
+/*==========================================
+ * HP/SP‰ñ•œ
+ *------------------------------------------
+ */
+int pc_itemheal(struct map_session_data *sd,int hp,int sp)
+{
+ int bonus;
+// if(battle_config.battle_log)
+// printf("heal %d %d\n",hp,sp);
+
+ nullpo_retr(0, sd);
+
+ if(sd->sc_data && sd->sc_data[SC_GOSPEL].timer!=-1) //ƒo[ƒT[ƒN’†‚͉ñ•œ‚³‚¹‚È‚¢‚炵‚¢
+ return 0;
+
+ if(sd->state.potionpitcher_flag) {
+ sd->potion_hp = hp;
+ sd->potion_sp = sp;
+ return 0;
+ }
+
+ if(pc_checkoverhp(sd)) {
+ if(hp > 0)
+ hp = 0;
+ }
+ if(pc_checkoversp(sd)) {
+ if(sp > 0)
+ sp = 0;
+ }
+ if(hp > 0) {
+ bonus = (sd->paramc[2]<<1) + 100 + pc_checkskill(sd,SM_RECOVERY)*10;
+ if(bonus != 100)
+ hp = hp * bonus / 100;
+ bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
+ if(bonus != 100)
+ hp = hp * bonus / 100;
+ }
+ if(sp > 0) {
+ bonus = (sd->paramc[3]<<1) + 100 + pc_checkskill(sd,MG_SRECOVERY)*10;
+ if(bonus != 100)
+ sp = sp * bonus / 100;
+ bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5;
+ if(bonus != 100)
+ sp = sp * bonus / 100;
+ }
+ if(hp+sd->status.hp>sd->status.max_hp)
+ hp=sd->status.max_hp-sd->status.hp;
+ if(sp+sd->status.sp>sd->status.max_sp)
+ sp=sd->status.max_sp-sd->status.sp;
+ sd->status.hp+=hp;
+ if(sd->status.hp <= 0) {
+ sd->status.hp = 0;
+ pc_damage(NULL,sd,1);
+ hp = 0;
+ }
+ sd->status.sp+=sp;
+ if(sd->status.sp <= 0)
+ sd->status.sp = 0;
+ if(hp)
+ clif_updatestatus(sd,SP_HP);
+ if(sp)
+ clif_updatestatus(sd,SP_SP);
+
+ return 0;
+}
+
+/*==========================================
+ * HP/SP‰ñ•œ
+ *------------------------------------------
+ */
+int pc_percentheal(struct map_session_data *sd,int hp,int sp)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->state.potionpitcher_flag) {
+ sd->potion_per_hp = hp;
+ sd->potion_per_sp = sp;
+ return 0;
+ }
+
+ if(pc_checkoverhp(sd)) {
+ if(hp > 0)
+ hp = 0;
+ }
+ if(pc_checkoversp(sd)) {
+ if(sp > 0)
+ sp = 0;
+ }
+ if(hp) {
+ if(hp >= 100) {
+ sd->status.hp = sd->status.max_hp;
+ }
+ else if(hp <= -100) {
+ sd->status.hp = 0;
+ pc_damage(NULL,sd,1);
+ }
+ else {
+ sd->status.hp += sd->status.max_hp*hp/100;
+ if(sd->status.hp > sd->status.max_hp)
+ sd->status.hp = sd->status.max_hp;
+ if(sd->status.hp <= 0) {
+ sd->status.hp = 0;
+ pc_damage(NULL,sd,1);
+ hp = 0;
+ }
+ }
+ }
+ if(sp) {
+ if(sp >= 100) {
+ sd->status.sp = sd->status.max_sp;
+ }
+ else if(sp <= -100) {
+ sd->status.sp = 0;
+ }
+ else {
+ sd->status.sp += sd->status.max_sp*sp/100;
+ if(sd->status.sp > sd->status.max_sp)
+ sd->status.sp = sd->status.max_sp;
+ if(sd->status.sp < 0)
+ sd->status.sp = 0;
+ }
+ }
+ if(hp)
+ clif_updatestatus(sd,SP_HP);
+ if(sp)
+ clif_updatestatus(sd,SP_SP);
+
+ return 0;
+}
+
+/*==========================================
+ * E•ÏX
+ * ˆø” job E‹Æ 0`23
+ * upper ’Êí 0, “]¶ 1, —{Žq 2, ‚»‚Ì‚Ü‚Ü -1
+ *------------------------------------------
+ */
+int pc_jobchange(struct map_session_data *sd,int job, int upper)
+{
+ int i;
+ int b_class = 0;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+ struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
+
+ nullpo_retr(0, sd);
+
+ if((job > 23) && (job < 68))
+ job += 3977;
+
+ if((job > 69) && (job < 4000))
+ return 1;
+
+ if(upper < 0) //Œ»Ý“]¶‚©‚Ç‚¤‚©‚ð”»’f‚·‚é
+ upper = s_class.upper;
+
+ if(upper == 0){ //’ÊíE‚È‚çjob‚»‚Ì‚Ü‚ñ‚Ü
+ b_class = job;
+ }else if(upper == 1){
+ if(job == 23){ //“]¶‚ɃXƒpƒmƒr‚Í‘¶Ý‚µ‚È‚¢‚Ì‚Å‚¨’f‚è
+ return 1;
+ }else{
+ b_class = job + 4001;
+ }
+ }else if(upper == 2){ //—{Žq‚ÉŒ‹¥‚Í‚È‚¢‚¯‚Ç‚Ç‚¤‚¹ŽŸ‚ÅR‚ç‚ê‚é‚©‚ç‚¢‚¢‚â
+ b_class = (job==23)?job + 4022:job + 4023;
+ }else{
+ return 1;
+ }
+
+ if((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) ||
+ (sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) ||
+ job ==22 || sd->status.class == b_class) //Š‚̓o[ƒh‚É‚È‚ê‚È‚¢A‰‚̓_ƒ“ƒT[‚É‚È‚ê‚È‚¢AŒ‹¥ˆßÖ‚à‚¨’f‚è
+ return 1;
+
+ sd->status.class = sd->view_class = b_class;
+
+ sd->status.job_level=1;
+ sd->status.job_exp=0;
+ clif_updatestatus(sd,SP_JOBLEVEL);
+ clif_updatestatus(sd,SP_JOBEXP);
+ clif_updatestatus(sd,SP_NEXTJOBEXP);
+
+ for(i=0;i<11;i++) {
+ if(sd->equip_index[i] >= 0)
+ if(!pc_isequip(sd,sd->equip_index[i]))
+ pc_unequipitem(sd,sd->equip_index[i],1); // ‘•”õŠO‚µ
+ }
+
+ clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris]
+ if(sd->status.clothes_color > 0)
+ clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color);
+ if(battle_config.muting_players && sd->status.manner < 0)
+ clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner);
+
+ pc_calcstatus(sd,0);
+ pc_checkallowskill(sd);
+ pc_equiplookall(sd);
+ clif_equiplist(sd);
+
+ if(pc_isriding(sd)) { // remove peco status if changing into invalid class [Valaris]
+ if(!(pc_checkskill(sd,KN_RIDING)))
+ pc_setoption(sd,sd->status.option|-0x0000);
+ if(pc_checkskill(sd,KN_RIDING)>0)
+ pc_setriding(sd);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Œ©‚½–Ú•ÏX
+ *------------------------------------------
+ */
+int pc_equiplookall(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+#if PACKETVER < 4
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+#else
+ clif_changelook(&sd->bl,LOOK_WEAPON,0);
+ clif_changelook(&sd->bl,LOOK_SHOES,0);
+#endif
+ clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
+ clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
+ clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
+
+ return 0;
+}
+
+/*==========================================
+ * Œ©‚½–Ú•ÏX
+ *------------------------------------------
+ */
+int pc_changelook(struct map_session_data *sd,int type,int val)
+{
+ nullpo_retr(0, sd);
+
+ switch(type){
+ case LOOK_HAIR:
+ sd->status.hair=val;
+ break;
+ case LOOK_WEAPON:
+ sd->status.weapon=val;
+ break;
+ case LOOK_HEAD_BOTTOM:
+ sd->status.head_bottom=val;
+ break;
+ case LOOK_HEAD_TOP:
+ sd->status.head_top=val;
+ break;
+ case LOOK_HEAD_MID:
+ sd->status.head_mid=val;
+ break;
+ case LOOK_HAIR_COLOR:
+ sd->status.hair_color=val;
+ break;
+ case LOOK_CLOTHES_COLOR:
+ sd->status.clothes_color=val;
+ break;
+ case LOOK_SHIELD:
+ sd->status.shield=val;
+ break;
+ case LOOK_SHOES:
+ break;
+ }
+ clif_changelook(&sd->bl,type,val);
+
+ return 0;
+}
+
+/*==========================================
+ * •t‘®•i(‘é,ƒyƒR,ƒJ[ƒg)Ý’è
+ *------------------------------------------
+ */
+int pc_setoption(struct map_session_data *sd,int type)
+{
+ nullpo_retr(0, sd);
+
+ sd->status.option=type;
+ clif_changeoption(&sd->bl);
+ pc_calcstatus(sd,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒgÝ’è
+ *------------------------------------------
+ */
+int pc_setcart(struct map_session_data *sd,int type)
+{
+ int cart[6]={0x0000,0x0008,0x0080,0x0100,0x0200,0x0400};
+
+ nullpo_retr(0, sd);
+
+ if(pc_checkskill(sd,MC_PUSHCART)>0){ // ƒvƒbƒVƒ…ƒJ[ƒgƒXƒLƒ‹ŠŽ
+ if(!pc_iscarton(sd)){ // ƒJ[ƒg‚ð•t‚¯‚Ä‚¢‚È‚¢
+ pc_setoption(sd,cart[type]);
+ clif_cart_itemlist(sd);
+ clif_cart_equiplist(sd);
+ clif_updatestatus(sd,SP_CARTINFO);
+ clif_status_change(&sd->bl,0x0c,0);
+ }
+ else{
+ pc_setoption(sd,cart[type]);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‘éÝ’è
+ *------------------------------------------
+ */
+int pc_setfalcon(struct map_session_data *sd)
+{
+ if(pc_checkskill(sd,HT_FALCON)>0){ // ƒtƒ@ƒ‹ƒRƒ“ƒ}ƒXƒ^ƒŠ[ƒXƒLƒ‹ŠŽ
+ pc_setoption(sd,sd->status.option|0x0010);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒyƒRƒyƒRÝ’è
+ *------------------------------------------
+ */
+int pc_setriding(struct map_session_data *sd)
+{
+ if(sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris]
+ clif_displaymessage(sd->fd, "Cannot mount a Peco while in disguise.");
+ return 0;
+ }
+
+ if((pc_checkskill(sd,KN_RIDING)>0)){ // ƒ‰ƒCƒfƒBƒ“ƒOƒXƒLƒ‹ŠŽ
+ pc_setoption(sd,sd->status.option|0x0020);
+
+ if(sd->status.class==7)
+ sd->status.class=sd->view_class=13;
+
+ if(sd->status.class==14)
+ sd->status.class=sd->view_class=21;
+
+ if(sd->status.class==4008)
+ sd->status.class=sd->view_class=4014;
+
+ if(sd->status.class==4015)
+ sd->status.class=sd->view_class=4022;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * script—p•Ï”‚Ì’l‚ð“Ç‚Þ
+ *------------------------------------------
+ */
+int pc_readreg(struct map_session_data *sd,int reg)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<sd->reg_num;i++)
+ if(sd->reg[i].index==reg)
+ return sd->reg[i].data;
+
+ return 0;
+}
+/*==========================================
+ * script—p•Ï”‚Ì’l‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_setreg(struct map_session_data *sd,int reg,int val)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for (i = 0; i < sd->reg_num; i++) {
+ if (sd->reg[i].index == reg){
+ sd->reg[i].data = val;
+ return 0;
+ }
+ }
+ sd->reg_num++;
+ sd->reg = realloc(sd->reg, sizeof(*(sd->reg)) * sd->reg_num);
+ if (sd->reg == NULL){
+ printf("out of memory : pc_setreg\n");
+ exit(1);
+ }
+/* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0,
+ sizeof(*(sd->reg)));
+*/
+ sd->reg[i].index = reg;
+ sd->reg[i].data = val;
+
+ return 0;
+}
+
+/*==========================================
+ * script—p•¶Žš—ñ•Ï”‚Ì’l‚ð“Ç‚Þ
+ *------------------------------------------
+ */
+char *pc_readregstr(struct map_session_data *sd,int reg)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<sd->regstr_num;i++)
+ if(sd->regstr[i].index==reg)
+ return sd->regstr[i].data;
+
+ return NULL;
+}
+/*==========================================
+ * script—p•¶Žš—ñ•Ï”‚Ì’l‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_setregstr(struct map_session_data *sd,int reg,char *str)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(strlen(str)+1 >= sizeof(sd->regstr[0].data)){
+ printf("pc_setregstr: string too long !\n");
+ return 0;
+ }
+
+ for(i=0;i<sd->regstr_num;i++)
+ if(sd->regstr[i].index==reg){
+ strcpy(sd->regstr[i].data,str);
+ return 0;
+ }
+ sd->regstr_num++;
+ sd->regstr = realloc(sd->regstr, sizeof(sd->regstr[0]) * sd->regstr_num);
+ if(sd->regstr==NULL){
+ printf("out of memory : pc_setreg\n");
+ exit(1);
+ }
+/* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0,
+ sizeof(*(sd->reg)));
+*/
+ sd->regstr[i].index=reg;
+ strcpy(sd->regstr[i].data,str);
+
+ return 0;
+}
+
+/*==========================================
+ * script—pƒOƒ[ƒoƒ‹•Ï”‚Ì’l‚ð“Ç‚Þ
+ *------------------------------------------
+ */
+int pc_readglobalreg(struct map_session_data *sd,char *reg)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<sd->status.global_reg_num;i++){
+ if(strcmp(sd->status.global_reg[i].str,reg)==0)
+ return sd->status.global_reg[i].value;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * script—pƒOƒ[ƒoƒ‹•Ï”‚Ì’l‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_setglobalreg(struct map_session_data *sd,char *reg,int val)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ //PC_DIE_COUNTER‚ªƒXƒNƒŠƒvƒg‚È‚Ç‚Å•ÏX‚³‚ꂽŽž‚̈—
+ if(strcmp(reg,"PC_DIE_COUNTER") == 0 && sd->die_counter != val){
+ sd->die_counter = val;
+ pc_calcstatus(sd,0);
+ }
+ if(val==0){
+ for(i=0;i<sd->status.global_reg_num;i++){
+ if(strcmp(sd->status.global_reg[i].str,reg)==0){
+ sd->status.global_reg[i]=sd->status.global_reg[sd->status.global_reg_num-1];
+ sd->status.global_reg_num--;
+ break;
+ }
+ }
+ return 0;
+ }
+ for(i=0;i<sd->status.global_reg_num;i++){
+ if(strcmp(sd->status.global_reg[i].str,reg)==0){
+ sd->status.global_reg[i].value=val;
+ return 0;
+ }
+ }
+ if(sd->status.global_reg_num<GLOBAL_REG_NUM){
+ strcpy(sd->status.global_reg[i].str,reg);
+ sd->status.global_reg[i].value=val;
+ sd->status.global_reg_num++;
+ return 0;
+ }
+ if(battle_config.error_log)
+ printf("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n", reg, GLOBAL_REG_NUM);
+
+ return 1;
+}
+
+/*==========================================
+ * script—pƒAƒJƒEƒ“ƒg•Ï”‚Ì’l‚ð“Ç‚Þ
+ *------------------------------------------
+ */
+int pc_readaccountreg(struct map_session_data *sd,char *reg)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<sd->status.account_reg_num;i++){
+ if(strcmp(sd->status.account_reg[i].str,reg)==0)
+ return sd->status.account_reg[i].value;
+ }
+
+ return 0;
+}
+/*==========================================
+ * script—pƒAƒJƒEƒ“ƒg•Ï”‚Ì’l‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_setaccountreg(struct map_session_data *sd,char *reg,int val)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ if(val==0){
+ for(i=0;i<sd->status.account_reg_num;i++){
+ if(strcmp(sd->status.account_reg[i].str,reg)==0){
+ sd->status.account_reg[i]=sd->status.account_reg[sd->status.account_reg_num-1];
+ sd->status.account_reg_num--;
+ break;
+ }
+ }
+ intif_saveaccountreg(sd);
+ return 0;
+ }
+ for(i=0;i<sd->status.account_reg_num;i++){
+ if(strcmp(sd->status.account_reg[i].str,reg)==0){
+ sd->status.account_reg[i].value=val;
+ intif_saveaccountreg(sd);
+ return 0;
+ }
+ }
+ if(sd->status.account_reg_num<ACCOUNT_REG_NUM){
+ strcpy(sd->status.account_reg[i].str,reg);
+ sd->status.account_reg[i].value=val;
+ sd->status.account_reg_num++;
+ intif_saveaccountreg(sd);
+ return 0;
+ }
+ if(battle_config.error_log)
+ printf("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n", reg, ACCOUNT_REG_NUM);
+
+ return 1;
+}
+/*==========================================
+ * script—pƒAƒJƒEƒ“ƒg•Ï”2‚Ì’l‚ð“Ç‚Þ
+ *------------------------------------------
+ */
+int pc_readaccountreg2(struct map_session_data *sd,char *reg)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<sd->status.account_reg2_num;i++){
+ if(strcmp(sd->status.account_reg2[i].str,reg)==0)
+ return sd->status.account_reg2[i].value;
+ }
+
+ return 0;
+}
+/*==========================================
+ * script—pƒAƒJƒEƒ“ƒg•Ï”2‚Ì’l‚ðÝ’è
+ *------------------------------------------
+ */
+int pc_setaccountreg2(struct map_session_data *sd,char *reg,int val)
+{
+ int i;
+
+ nullpo_retr(1, sd);
+
+ if(val==0){
+ for(i=0;i<sd->status.account_reg2_num;i++){
+ if(strcmp(sd->status.account_reg2[i].str,reg)==0){
+ sd->status.account_reg2[i]=sd->status.account_reg2[sd->status.account_reg2_num-1];
+ sd->status.account_reg2_num--;
+ break;
+ }
+ }
+ chrif_saveaccountreg2(sd);
+ return 0;
+ }
+ for(i=0;i<sd->status.account_reg2_num;i++){
+ if(strcmp(sd->status.account_reg2[i].str,reg)==0){
+ sd->status.account_reg2[i].value=val;
+ chrif_saveaccountreg2(sd);
+ return 0;
+ }
+ }
+ if(sd->status.account_reg2_num<ACCOUNT_REG2_NUM){
+ strcpy(sd->status.account_reg2[i].str,reg);
+ sd->status.account_reg2[i].value=val;
+ sd->status.account_reg2_num++;
+ chrif_saveaccountreg2(sd);
+ return 0;
+ }
+ if(battle_config.error_log)
+ printf("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n", reg, ACCOUNT_REG2_NUM);
+
+ return 1;
+}
+/*==========================================
+ * ¸˜B¬Œ÷—¦
+ *------------------------------------------
+ */
+int pc_percentrefinery(struct map_session_data *sd,struct item *item)
+{
+ int percent;
+
+ nullpo_retr(0, item);
+ percent=percentrefinery[itemdb_wlv(item->nameid)][(int)item->refine];
+
+ percent += pc_checkskill(sd,BS_WEAPONRESEARCH); // •ŠíŒ¤‹†ƒXƒLƒ‹ŠŽ
+
+ // Šm—¦‚Ì—LŒø”͈̓`ƒFƒbƒN
+ if( percent > 100 ){
+ percent = 100;
+ }
+ if( percent < 0 ){
+ percent = 0;
+ }
+
+ return percent;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[ˆ—
+ *------------------------------------------
+ */
+int pc_eventtimer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=map_id2sd(id);
+ int i;
+ if(sd==NULL)
+ return 0;
+
+ for(i=0;i<MAX_EVENTTIMER;i++){
+ if( sd->eventtimer[i]==tid ){
+ sd->eventtimer[i]=-1;
+ npc_event(sd,(const char *)data,0);
+ break;
+ }
+ }
+ free((void *)data);
+ if(i==MAX_EVENTTIMER) {
+ if(battle_config.error_log)
+ printf("pc_eventtimer: no such event timer\n");
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[’ljÁ
+ *------------------------------------------
+ */
+int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( sd->eventtimer[i]==-1 )
+ break;
+ if(i<MAX_EVENTTIMER){
+ char *evname=(char *)aCalloc(24,sizeof(char));
+ memcpy(evname,name,24);
+ sd->eventtimer[i]=add_timer(gettick()+tick,
+ pc_eventtimer,sd->bl.id,(int)evname);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[íœ
+ *------------------------------------------
+ */
+int pc_deleventtimer(struct map_session_data *sd,const char *name)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( sd->eventtimer[i]!=-1 && strcmp(
+ (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){
+ delete_timer(sd->eventtimer[i],pc_eventtimer);
+ sd->eventtimer[i]=-1;
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[ƒJƒEƒ“ƒg’l’ljÁ
+ *------------------------------------------
+ */
+int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( sd->eventtimer[i]!=-1 && strcmp(
+ (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){
+ addtick_timer(sd->eventtimer[i],tick);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[‘Síœ
+ *------------------------------------------
+ */
+int pc_cleareventtimer(struct map_session_data *sd)
+{
+ int i;
+
+ nullpo_retr(0, sd);
+
+ for(i=0;i<MAX_EVENTTIMER;i++)
+ if( sd->eventtimer[i]!=-1 ){
+ delete_timer(sd->eventtimer[i],pc_eventtimer);
+ sd->eventtimer[i]=-1;
+ }
+
+ return 0;
+}
+
+//
+// ‘• ”õ•¨
+//
+/*==========================================
+ * ƒAƒCƒeƒ€‚ð‘•”õ‚·‚é
+ *------------------------------------------
+ */
+int pc_equipitem(struct map_session_data *sd,int n,int pos)
+{
+ int i,nameid, arrow;
+ struct item_data *id;
+ //“]¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+
+ nullpo_retr(0, sd);
+
+ nameid = sd->status.inventory[n].nameid;
+ id = sd->inventory_data[n];
+ pos = pc_equippoint(sd,n);
+ if(battle_config.battle_log)
+ printf("equip %d(%d) %x:%x\n",nameid,n,id->equip,pos);
+ if(!pc_isequip(sd,n) || !pos || sd->status.inventory[n].attribute==1 ) { // [Valaris]
+ clif_equipitemack(sd,n,0,0); // fail
+ return 0;
+ }
+
+// -- moonsoul (if player is berserk then cannot equip)
+//
+ if(sd->sc_data[SC_BERSERK].timer!=-1){
+ clif_equipitemack(sd,n,0,0); // fail
+ return 0;
+ }
+
+ if(pos==0x88){ // ƒAƒNƒZƒTƒŠ—p—áŠOˆ—
+ int epor=0;
+ if(sd->equip_index[0] >= 0)
+ epor |= sd->status.inventory[sd->equip_index[0]].equip;
+ if(sd->equip_index[1] >= 0)
+ epor |= sd->status.inventory[sd->equip_index[1]].equip;
+ epor &= 0x88;
+ pos = epor == 0x08 ? 0x80 : 0x08;
+ }
+
+ // “ñ“—¬ˆ—
+ if ((pos==0x22) // ˆê‰žA‘•”õ—v‹‰ÓŠ‚ª“ñ“—¬•Ší‚©ƒ`ƒFƒbƒN‚·‚é
+ && (id->equip==2) // ’P Žè•Ší
+ && (pc_checkskill(sd, AS_LEFT) > 0 || sd->status.class == 12) ) // ¶ŽèC˜B—L
+ {
+ int tpos=0;
+ if(sd->equip_index[8] >= 0)
+ tpos |= sd->status.inventory[sd->equip_index[8]].equip;
+ if(sd->equip_index[9] >= 0)
+ tpos |= sd->status.inventory[sd->equip_index[9]].equip;
+ tpos &= 0x02;
+ pos = tpos == 0x02 ? 0x20 : 0x02;
+ }
+
+ arrow=pc_search_inventory(sd,pc_checkequip(sd,9)); // Added by RoVeRT
+ for(i=0;i<11;i++) {
+ if(sd->equip_index[i] >= 0 && sd->status.inventory[sd->equip_index[i]].equip&pos) {
+ pc_unequipitem(sd,sd->equip_index[i],1);
+ }
+ }
+ // ‹|–î‘•”õ
+ if(pos==0x8000){
+ clif_arrowequip(sd,n);
+ clif_arrow_fail(sd,3); // 3=–‘•”õ‚Å‚«‚Ü‚µ‚½
+ }
+ else
+ clif_equipitemack(sd,n,pos,1);
+
+ for(i=0;i<11;i++) {
+ if(pos & equip_pos[i])
+ sd->equip_index[i] = n;
+ }
+ sd->status.inventory[n].equip=pos;
+
+ if(sd->status.inventory[n].equip & 0x0002) {
+ if(sd->inventory_data[n])
+ sd->weapontype1 = sd->inventory_data[n]->look;
+ else
+ sd->weapontype1 = 0;
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ }
+ if(sd->status.inventory[n].equip & 0x0020) {
+ if(sd->inventory_data[n]) {
+ if(sd->inventory_data[n]->type == 4) {
+ sd->status.shield = 0;
+ if(sd->status.inventory[n].equip == 0x0020)
+ sd->weapontype2 = sd->inventory_data[n]->look;
+ else
+ sd->weapontype2 = 0;
+ }
+ else if(sd->inventory_data[n]->type == 5) {
+ sd->status.shield = sd->inventory_data[n]->look;
+ sd->weapontype2 = 0;
+ }
+ }
+ else
+ sd->status.shield = sd->weapontype2 = 0;
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+ }
+ if(sd->status.inventory[n].equip & 0x0001) {
+ if(sd->inventory_data[n])
+ sd->status.head_bottom = sd->inventory_data[n]->look;
+ else
+ sd->status.head_bottom = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
+ }
+ if(sd->status.inventory[n].equip & 0x0100) {
+ if(sd->inventory_data[n])
+ sd->status.head_top = sd->inventory_data[n]->look;
+ else
+ sd->status.head_top = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
+ }
+ if(sd->status.inventory[n].equip & 0x0200) {
+ if(sd->inventory_data[n])
+ sd->status.head_mid = sd->inventory_data[n]->look;
+ else
+ sd->status.head_mid = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
+ }
+ if(sd->status.inventory[n].equip & 0x0040)
+ clif_changelook(&sd->bl,LOOK_SHOES,0);
+
+ pc_checkallowskill(sd); // ‘•”õ•i‚ŃXƒLƒ‹‚©‰ðœ‚³‚ê‚é‚©ƒ`ƒFƒbƒN
+ if (itemdb_look(sd->status.inventory[n].nameid) == 11 && arrow){ // Added by RoVeRT
+ clif_arrowequip(sd,arrow);
+ sd->status.inventory[arrow].equip=32768;
+ }
+ pc_calcstatus(sd,0);
+
+ if(sd->special_state.infinite_endure) {
+ if(sd->sc_data[SC_ENDURE].timer == -1)
+ skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0);
+ }
+ else {
+ if(sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2)
+ skill_status_change_end(&sd->bl,SC_ENDURE,-1);
+ }
+
+ if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
+ skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
+ if(sd->sc_data[SC_DANCING].timer!=-1 && (sd->status.weapon != 13 && sd->status.weapon !=14))
+ skill_stop_dancing(&sd->bl,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘• ”õ‚µ‚½•¨‚ðŠO‚·
+ *------------------------------------------
+ */
+int pc_unequipitem(struct map_session_data *sd,int n,int type)
+{
+ nullpo_retr(0, sd);
+
+// -- moonsoul (if player is berserk then cannot unequip)
+//
+ if(sd->sc_data[SC_BERSERK].timer!=-1){
+ clif_unequipitemack(sd,n,0,0);
+ return 0;
+ }
+
+ if(battle_config.battle_log)
+ printf("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip);
+ if(sd->status.inventory[n].equip){
+ int i;
+ for(i=0;i<11;i++) {
+ if(sd->status.inventory[n].equip & equip_pos[i])
+ sd->equip_index[i] = -1;
+ }
+ if(sd->status.inventory[n].equip & 0x0002) {
+ sd->weapontype1 = 0;
+ sd->status.weapon = sd->weapontype2;
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
+ }
+ if(sd->status.inventory[n].equip & 0x0020) {
+ sd->status.shield = sd->weapontype2 = 0;
+ pc_calcweapontype(sd);
+ clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
+ }
+ if(sd->status.inventory[n].equip & 0x0001) {
+ sd->status.head_bottom = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
+ }
+ if(sd->status.inventory[n].equip & 0x0100) {
+ sd->status.head_top = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
+ }
+ if(sd->status.inventory[n].equip & 0x0200) {
+ sd->status.head_mid = 0;
+ clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
+ }
+ if(sd->status.inventory[n].equip & 0x0040)
+ clif_changelook(&sd->bl,LOOK_SHOES,0);
+
+ if(sd->sc_data[SC_BROKNWEAPON].timer != -1 && sd->status.inventory[n].equip & 0x0002 &&
+ sd->status.inventory[i].attribute==1)
+ skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1);
+
+ clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1);
+ sd->status.inventory[n].equip=0;
+ if(!type)
+ pc_checkallowskill(sd);
+ if(sd->weapontype1 == 0 && sd->weapontype2 == 0)
+ skill_encchant_eremental_end(&sd->bl,-1); //•ŠíŽ‚¿¾‚¦‚Í–³ðŒ‚Å‘®«•t—^‰ðœ
+ } else {
+ clif_unequipitemack(sd,n,0,0);
+ }
+ if(!type) {
+ pc_calcstatus(sd,0);
+ if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele))
+ skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚Ìindex”Ô†‚ð‹l‚ß‚½‚è
+ * ‘• ”õ•i‚Ì‘•”õ‰Â”\ƒ`ƒFƒbƒN‚ðs‚È‚¤
+ *------------------------------------------
+ */
+int pc_checkitem(struct map_session_data *sd)
+{
+ int i,j,k,id,calc_flag = 0;
+ struct item_data *it=NULL;
+
+ nullpo_retr(0, sd);
+
+ // ŠŽ•i‹ó‚«‹l‚ß
+ for(i=j=0;i<MAX_INVENTORY;i++){
+ if( (id=sd->status.inventory[i].nameid)==0)
+ continue;
+ if( battle_config.item_check && !itemdb_available(id) ){
+ if(battle_config.error_log)
+ printf("illeagal item id %d in %d[%s] inventory.\n",id,sd->bl.id,sd->status.name);
+ pc_delitem(sd,i,sd->status.inventory[i].amount,3);
+ continue;
+ }
+ if(i>j){
+ memcpy(&sd->status.inventory[j],&sd->status.inventory[i],sizeof(struct item));
+ sd->inventory_data[j] = sd->inventory_data[i];
+ }
+ j++;
+ }
+ if(j < MAX_INVENTORY)
+ memset(&sd->status.inventory[j],0,sizeof(struct item)*(MAX_INVENTORY-j));
+ for(k=j;k<MAX_INVENTORY;k++)
+ sd->inventory_data[k] = NULL;
+
+ // ƒJ[ƒg“à‹ó‚«‹l‚ß
+ for(i=j=0;i<MAX_CART;i++){
+ if( (id=sd->status.cart[i].nameid)==0 )
+ continue;
+ if( battle_config.item_check && !itemdb_available(id) ){
+ if(battle_config.error_log)
+ printf("illeagal item id %d in %d[%s] cart.\n",id,sd->bl.id,sd->status.name);
+ pc_cart_delitem(sd,i,sd->status.cart[i].amount,1);
+ continue;
+ }
+ if(i>j){
+ memcpy(&sd->status.cart[j],&sd->status.cart[i],sizeof(struct item));
+ }
+ j++;
+ }
+ if(j < MAX_CART)
+ memset(&sd->status.cart[j],0,sizeof(struct item)*(MAX_CART-j));
+
+ // ‘• ”õˆÊ’uƒ`ƒFƒbƒN
+
+ for(i=0;i<MAX_INVENTORY;i++){
+
+ it=sd->inventory_data[i];
+
+ if(sd->status.inventory[i].nameid==0)
+ continue;
+ if(sd->status.inventory[i].equip & ~pc_equippoint(sd,i)) {
+ sd->status.inventory[i].equip=0;
+ calc_flag = 1;
+ }
+ //‘•”õ§ŒÀƒ`ƒFƒbƒN
+ if(sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp && (it->flag.no_equip==1 || it->flag.no_equip==3)){//PvP§ŒÀ
+ sd->status.inventory[i].equip=0;
+ calc_flag = 1;
+ }else if(sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg && (it->flag.no_equip==2 || it->flag.no_equip==3)){//GvG§ŒÀ
+ sd->status.inventory[i].equip=0;
+ calc_flag = 1;
+ }
+ }
+
+ pc_setequipindex(sd);
+ if(calc_flag)
+ pc_calcstatus(sd,2);
+
+ return 0;
+}
+
+int pc_checkoverhp(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.hp == sd->status.max_hp)
+ return 1;
+ if(sd->status.hp > sd->status.max_hp) {
+ sd->status.hp = sd->status.max_hp;
+ clif_updatestatus(sd,SP_HP);
+ return 2;
+ }
+
+ return 0;
+}
+
+int pc_checkoversp(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.sp == sd->status.max_sp)
+ return 1;
+ if(sd->status.sp > sd->status.max_sp) {
+ sd->status.sp = sd->status.max_sp;
+ clif_updatestatus(sd,SP_SP);
+ return 2;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * PVP‡ˆÊŒvŽZ—p(foreachinarea)
+ *------------------------------------------
+ */
+int pc_calc_pvprank_sub(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd1,*sd2=NULL;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd1=(struct map_session_data *)bl);
+ nullpo_retr(0, sd2=va_arg(ap,struct map_session_data *));
+
+ if( sd1->pvp_point > sd2->pvp_point )
+ sd2->pvp_rank++;
+ return 0;
+}
+/*==========================================
+ * PVP‡ˆÊŒvŽZ
+ *------------------------------------------
+ */
+int pc_calc_pvprank(struct map_session_data *sd)
+{
+ int old;
+ struct map_data *m;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, m=&map[sd->bl.m]);
+
+ old=sd->pvp_rank;
+
+ if( !(m->flag.pvp) )
+ return 0;
+ sd->pvp_rank=1;
+ map_foreachinarea(pc_calc_pvprank_sub,sd->bl.m,0,0,m->xs,m->ys,BL_PC,sd);
+ if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users)
+ clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users,0);
+ return sd->pvp_rank;
+}
+/*==========================================
+ * PVP‡ˆÊŒvŽZ(timer)
+ *------------------------------------------
+ */
+int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=NULL;
+ if(battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris]
+ return 0;
+
+ sd=map_id2sd(id);
+ if(sd==NULL)
+ return 0;
+ sd->pvp_timer=-1;
+ if( pc_calc_pvprank(sd)>0 )
+ sd->pvp_timer=add_timer(
+ gettick()+PVP_CALCRANK_INTERVAL,
+ pc_calc_pvprank_timer,id,data);
+ return 0;
+}
+
+/*==========================================
+ * sd‚ÍŒ‹¥‚µ‚Ä‚¢‚é‚©(Šù¥‚Ìꇂ͑Š•û‚Ìchar_id‚ð•Ô‚·)
+ *------------------------------------------
+ */
+int pc_ismarried(struct map_session_data *sd)
+{
+ if(sd == NULL)
+ return -1;
+ if(sd->status.partner_id > 0)
+ return sd->status.partner_id;
+ else
+ return 0;
+}
+/*==========================================
+ * sd‚ªdstsd‚ÆŒ‹¥(dstsd¨sd‚ÌŒ‹¥ˆ—‚à“¯Žž‚És‚¤)
+ *------------------------------------------
+ */
+int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd)
+{
+ if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0)
+ return -1;
+ sd->status.partner_id=dstsd->status.char_id;
+ dstsd->status.partner_id=sd->status.char_id;
+ return 0;
+}
+
+/*==========================================
+ * sd‚ª—£¥(‘ŠŽè‚Ísd->status.partner_id‚Ɉ˂é)(‘ŠŽè‚à“¯Žž‚É—£¥EŒ‹¥Žw—ÖŽ©“®”’D)
+ *------------------------------------------
+ */
+int pc_divorce(struct map_session_data *sd)
+{
+ struct map_session_data *p_sd=NULL;
+ if(sd == NULL || !pc_ismarried(sd))
+ return -1;
+
+ if( (p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) !=NULL){
+ int i;
+ if(p_sd->status.partner_id != sd->status.char_id || sd->status.partner_id != p_sd->status.char_id){
+ printf("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",sd->status.partner_id,p_sd->status.partner_id);
+ return -1;
+ }
+ sd->status.partner_id=0;
+ p_sd->status.partner_id=0;
+ 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);
+ for(i=0;i<MAX_INVENTORY;i++)
+ if(p_sd->status.inventory[i].nameid == WEDDING_RING_M || p_sd->status.inventory[i].nameid == WEDDING_RING_F)
+ pc_delitem(p_sd,i,1,0);
+
+ }else{
+ printf("pc_divorce: p_sd nullpo\n");
+ return -1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * sd‚Ì‘Š•û‚Ìmap_session_data‚ð•Ô‚·
+ *------------------------------------------
+ */
+struct map_session_data *pc_get_partner(struct map_session_data *sd)
+{
+ struct map_session_data *p_sd = NULL;
+ char *nick;
+ if(sd == NULL || !pc_ismarried(sd))
+ return NULL;
+
+ nick=map_charid2nick(sd->status.partner_id);
+
+ if (nick==NULL)
+ return NULL;
+
+ if((p_sd=map_nick2sd(nick)) == NULL )
+ return NULL;
+
+ return p_sd;
+}
+
+//
+// Ž©‘R‰ñ•œ•¨
+//
+/*==========================================
+ * SP‰ñ•œ—ÊŒvŽZ
+ *------------------------------------------
+ */
+static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick;
+static int pc_spheal(struct map_session_data *sd)
+{
+ int a;
+ struct guild_castle *gc = NULL;
+
+ nullpo_retr(0, sd);
+
+ a = natural_heal_diff_tick;
+ if(pc_issit(sd)) a += a;
+ if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // ƒ}ƒOƒjƒtƒBƒJ[ƒg
+ a += a;
+
+ gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
+ if(gc) {
+ struct guild *g;
+ g=guild_search(sd->status.guild_id);
+ if(g && g->guild_id == gc->guild_id)
+ a += a;
+ } // end addition [Valaris]
+
+ return a;
+}
+
+/*==========================================
+ * HP‰ñ•œ—ÊŒvŽZ
+ *------------------------------------------
+ */
+static int pc_hpheal(struct map_session_data *sd)
+{
+ int a;
+ struct guild_castle *gc;
+
+ nullpo_retr(0, sd);
+
+ a = natural_heal_diff_tick;
+ if(pc_issit(sd)) a += a;
+ if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT
+ a += a;
+
+ gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris]
+ if(gc) {
+ struct guild *g;
+ g=guild_search(sd->status.guild_id);
+ if(g && g->guild_id == gc->guild_id)
+ a += a;
+ } // end addition [Valaris]
+
+ return a;
+}
+
+static int pc_natural_heal_hp(struct map_session_data *sd)
+{
+ int bhp;
+ int inc_num,bonus,skill,hp_flag;
+
+ nullpo_retr(0, sd);
+
+ if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
+ return 0;
+
+ if(pc_checkoverhp(sd)) {
+ sd->hp_sub = sd->inchealhptick = 0;
+ return 0;
+ }
+
+ bhp=sd->status.hp;
+ hp_flag = (pc_checkskill(sd,SM_MOVINGRECOVERY) > 0 && sd->walktimer != -1);
+
+ if(sd->walktimer == -1) {
+ inc_num = pc_hpheal(sd);
+ if( sd->sc_data[SC_TENSIONRELAX].timer!=-1 ){ // ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX
+ sd->hp_sub += 2*inc_num;
+ sd->inchealhptick += 3*natural_heal_diff_tick;
+ }else{
+ sd->hp_sub += inc_num;
+ sd->inchealhptick += natural_heal_diff_tick;
+ }
+ }
+ else if(hp_flag) {
+ inc_num = pc_hpheal(sd);
+ sd->hp_sub += inc_num;
+ sd->inchealhptick = 0;
+ }
+ else {
+ sd->hp_sub = sd->inchealhptick = 0;
+ return 0;
+ }
+
+ if(sd->hp_sub >= battle_config.natural_healhp_interval) {
+ bonus = sd->nhealhp;
+ if(hp_flag) {
+ bonus >>= 2;
+ if(bonus <= 0) bonus = 1;
+ }
+ while(sd->hp_sub >= battle_config.natural_healhp_interval) {
+ sd->hp_sub -= battle_config.natural_healhp_interval;
+ if(sd->status.hp + bonus <= sd->status.max_hp)
+ sd->status.hp += bonus;
+ else {
+ sd->status.hp = sd->status.max_hp;
+ sd->hp_sub = sd->inchealhptick = 0;
+ }
+ }
+ }
+ if(bhp!=sd->status.hp)
+ clif_updatestatus(sd,SP_HP);
+
+ if(sd->nshealhp > 0) {
+ if(sd->inchealhptick >= battle_config.natural_heal_skill_interval && sd->status.hp < sd->status.max_hp) {
+ bonus = sd->nshealhp;
+ while(sd->inchealhptick >= battle_config.natural_heal_skill_interval) {
+ sd->inchealhptick -= battle_config.natural_heal_skill_interval;
+ if(sd->status.hp + bonus <= sd->status.max_hp)
+ sd->status.hp += bonus;
+ else {
+ bonus = sd->status.max_hp - sd->status.hp;
+ sd->status.hp = sd->status.max_hp;
+ sd->hp_sub = sd->inchealhptick = 0;
+ }
+ clif_heal(sd->fd,SP_HP,bonus);
+ }
+ }
+ }
+ else sd->inchealhptick = 0;
+
+ return 0;
+
+ if(sd->sc_data[SC_APPLEIDUN].timer!=-1) { // Apple of Idun
+ if(sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp) {
+ bonus = skill*20;
+ while(sd->inchealhptick >= 6000) {
+ sd->inchealhptick -= 6000;
+ if(sd->status.hp + bonus <= sd->status.max_hp)
+ sd->status.hp += bonus;
+ else {
+ bonus = sd->status.max_hp - sd->status.hp;
+ sd->status.hp = sd->status.max_hp;
+ sd->hp_sub = sd->inchealhptick = 0;
+ }
+ clif_heal(sd->fd,SP_HP,bonus);
+ }
+ }
+ }
+ else sd->inchealhptick = 0;
+
+ return 0;
+}
+
+static int pc_natural_heal_sp(struct map_session_data *sd)
+{
+ int bsp;
+ int inc_num,bonus;
+
+ nullpo_retr(0, sd);
+
+ if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT
+ return 0;
+
+ if(pc_checkoversp(sd)) {
+ sd->sp_sub = sd->inchealsptick = 0;
+ return 0;
+ }
+
+ bsp=sd->status.sp;
+
+ inc_num = pc_spheal(sd);
+ if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1)
+ sd->sp_sub += inc_num;
+ if(sd->walktimer == -1)
+ sd->inchealsptick += natural_heal_diff_tick;
+ else sd->inchealsptick = 0;
+
+ if(sd->sp_sub >= battle_config.natural_healsp_interval){
+ bonus = sd->nhealsp;;
+ while(sd->sp_sub >= battle_config.natural_healsp_interval){
+ sd->sp_sub -= battle_config.natural_healsp_interval;
+ if(sd->status.sp + bonus <= sd->status.max_sp)
+ sd->status.sp += bonus;
+ else {
+ sd->status.sp = sd->status.max_sp;
+ sd->sp_sub = sd->inchealsptick = 0;
+ }
+ }
+ }
+
+ if(bsp != sd->status.sp)
+ clif_updatestatus(sd,SP_SP);
+
+ if(sd->nshealsp > 0) {
+ if(sd->inchealsptick >= battle_config.natural_heal_skill_interval && sd->status.sp < sd->status.max_sp) {
+ struct pc_base_job s_class = pc_calc_base_job(sd->status.class);
+ if(sd->doridori_counter && s_class.job == 23)
+ bonus = sd->nshealsp*2;
+ else
+ bonus = sd->nshealsp;
+ sd->doridori_counter = 0;
+ while(sd->inchealsptick >= battle_config.natural_heal_skill_interval) {
+ sd->inchealsptick -= battle_config.natural_heal_skill_interval;
+ if(sd->status.sp + bonus <= sd->status.max_sp)
+ sd->status.sp += bonus;
+ else {
+ bonus = sd->status.max_sp - sd->status.sp;
+ sd->status.sp = sd->status.max_sp;
+ sd->sp_sub = sd->inchealsptick = 0;
+ }
+ clif_heal(sd->fd,SP_SP,bonus);
+ }
+ }
+ }
+ else sd->inchealsptick = 0;
+
+ return 0;
+}
+
+static int pc_spirit_heal_hp(struct map_session_data *sd,int level)
+{
+ int bonus_hp,interval = battle_config.natural_heal_skill_interval;
+
+ nullpo_retr(0, sd);
+
+ if(pc_checkoverhp(sd)) {
+ sd->inchealspirithptick = 0;
+ return 0;
+ }
+
+ sd->inchealspirithptick += natural_heal_diff_tick;
+
+ if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
+ interval += interval;
+
+ if(sd->inchealspirithptick >= interval) {
+ bonus_hp = sd->nsshealhp;
+ while(sd->inchealspirithptick >= interval) {
+ if(pc_issit(sd)) {
+ sd->inchealspirithptick -= interval;
+ if(sd->status.hp < sd->status.max_hp) {
+ if(sd->status.hp + bonus_hp <= sd->status.max_hp)
+ sd->status.hp += bonus_hp;
+ else {
+ bonus_hp = sd->status.max_hp - sd->status.hp;
+ sd->status.hp = sd->status.max_hp;
+ }
+ clif_heal(sd->fd,SP_HP,bonus_hp);
+ sd->inchealspirithptick = 0;
+ }
+ }else{
+ sd->inchealspirithptick -= natural_heal_diff_tick;
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+static int pc_spirit_heal_sp(struct map_session_data *sd,int level)
+{
+ int bonus_sp,interval = battle_config.natural_heal_skill_interval;
+
+ nullpo_retr(0, sd);
+
+ if(pc_checkoversp(sd)) {
+ sd->inchealspiritsptick = 0;
+ return 0;
+ }
+
+ sd->inchealspiritsptick += natural_heal_diff_tick;
+
+ if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate)
+ interval += interval;
+
+ if(sd->inchealspiritsptick >= interval) {
+ bonus_sp = sd->nsshealsp;
+ while(sd->inchealspiritsptick >= interval) {
+ if(pc_issit(sd)) {
+ sd->inchealspiritsptick -= interval;
+ if(sd->status.sp < sd->status.max_sp) {
+ if(sd->status.sp + bonus_sp <= sd->status.max_sp)
+ sd->status.sp += bonus_sp;
+ else {
+ bonus_sp = sd->status.max_sp - sd->status.sp;
+ sd->status.sp = sd->status.max_sp;
+ }
+ clif_heal(sd->fd,SP_SP,bonus_sp);
+ sd->inchealspiritsptick = 0;
+ }
+ }else{
+ sd->inchealspiritsptick -= natural_heal_diff_tick;
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * HP/SP Ž©‘R‰ñ•œ ŠeƒNƒ‰ƒCƒAƒ“ƒg
+ *------------------------------------------
+ */
+
+static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) {
+ int skill;
+
+ nullpo_retr(0, sd);
+
+// -- moonsoul (if conditions below altered to disallow natural healing if under berserk status)
+ if ((battle_config.natural_heal_weight_rate > 100 || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) &&
+ !pc_isdead(sd) &&
+ !pc_ishiding(sd) &&
+ sd->sc_data[SC_POISON].timer == -1
+ ) {
+ pc_natural_heal_hp(sd);
+ if( sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //ˆ¢C—…ó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
+ sd->sc_data[SC_DANCING].timer == -1 && //ƒ_ƒ“ƒXó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
+ sd->sc_data[SC_BERSERK].timer == -1 //ƒo[ƒT[ƒNó‘Ô‚Å‚ÍSP‚ª‰ñ•œ‚µ‚È‚¢
+ )
+ pc_natural_heal_sp(sd);
+ } else {
+ sd->hp_sub = sd->inchealhptick = 0;
+ sd->sp_sub = sd->inchealsptick = 0;
+ }
+ if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){
+ pc_spirit_heal_hp(sd,skill);
+ pc_spirit_heal_sp(sd,skill);
+ }
+ else {
+ sd->inchealspirithptick = 0;
+ sd->inchealspiritsptick = 0;
+ }
+ return 0;
+}
+
+/*==========================================
+ * HP/SPŽ©‘R‰ñ•œ (interval timerŠÖ”)
+ *------------------------------------------
+ */
+int pc_natural_heal(int tid,unsigned int tick,int id,int data)
+{
+ natural_heal_tick = tick;
+ natural_heal_diff_tick = DIFF_TICK(natural_heal_tick,natural_heal_prev_tick);
+ clif_foreachclient(pc_natural_heal_sub);
+
+ natural_heal_prev_tick = tick;
+ return 0;
+}
+
+/*==========================================
+ * ƒZ[ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
+ *------------------------------------------
+ */
+int pc_setsavepoint(struct map_session_data *sd,char *mapname,int x,int y)
+{
+ nullpo_retr(0, sd);
+
+ strncpy(sd->status.save_point.map,mapname,24);
+ sd->status.save_point.x = x;
+ sd->status.save_point.y = y;
+
+ return 0;
+}
+
+/*==========================================
+ * Ž©“®ƒZ[ƒu ŠeƒNƒ‰ƒCƒAƒ“ƒg
+ *------------------------------------------
+ */
+static int last_save_fd,save_flag;
+static int pc_autosave_sub(struct map_session_data *sd,va_list ap)
+{
+ nullpo_retr(0, sd);
+
+ if(save_flag==0 && sd->fd>last_save_fd){
+ struct guild_castle *gc=NULL;
+ int i;
+// if(battle_config.save_log)
+// printf("autosave %d\n",sd->fd);
+ // pet
+ if(sd->status.pet_id > 0 && sd->pd)
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_save(sd);
+
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
+ if(!gc) continue;
+ if(gc->visibleG0==1) guild_castledatasave(gc->castle_id,18,gc->Ghp0);
+ if(gc->visibleG1==1) guild_castledatasave(gc->castle_id,19,gc->Ghp1);
+ if(gc->visibleG2==1) guild_castledatasave(gc->castle_id,20,gc->Ghp2);
+ if(gc->visibleG3==1) guild_castledatasave(gc->castle_id,21,gc->Ghp3);
+ if(gc->visibleG4==1) guild_castledatasave(gc->castle_id,22,gc->Ghp4);
+ if(gc->visibleG5==1) guild_castledatasave(gc->castle_id,23,gc->Ghp5);
+ if(gc->visibleG6==1) guild_castledatasave(gc->castle_id,24,gc->Ghp6);
+ if(gc->visibleG7==1) guild_castledatasave(gc->castle_id,25,gc->Ghp7);
+ }
+
+ save_flag=1;
+ last_save_fd = sd->fd;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * Ž©“®ƒZ[ƒu (timerŠÖ”)
+ *------------------------------------------
+ */
+int pc_autosave(int tid,unsigned int tick,int id,int data)
+{
+ int interval;
+
+ save_flag=0;
+ clif_foreachclient(pc_autosave_sub);
+ if(save_flag==0)
+ last_save_fd=0;
+
+ interval = autosave_interval/(clif_countusers()+1);
+ if(interval <= 0)
+ interval = 1;
+ add_timer(gettick()+interval,pc_autosave,0,0);
+
+ return 0;
+}
+
+int pc_read_gm_account(int fd)
+{
+#ifdef TXT_ONLY
+ int i = 0;
+#endif
+ if (gm_account != NULL)
+ free(gm_account);
+ GM_num = 0;
+#ifdef TXT_ONLY
+ gm_account = calloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1);
+ 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++;
+ }
+#else
+ sprintf (tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",gm_db_account_id,gm_db_level,gm_db,gm_db_level,lowest_gm_level);
+ if(mysql_query(&lmysql_handle, tmp_lsql) ) {
+ printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle) );
+ }
+ lsql_res = mysql_store_result(&lmysql_handle);
+ if (lsql_res) {
+ gm_account = calloc(sizeof(struct gm_account) * 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]);
+ printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level);
+ GM_num++;
+ }
+ }
+
+ mysql_free_result(lsql_res);
+#endif /* TXT_ONLY */
+ return GM_num;
+}
+
+/*==========================================
+ * timer to do the day
+ *------------------------------------------
+ */
+int map_day_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
+ struct map_session_data *pl_sd = NULL;
+ int i;
+ char tmpstr[1024];
+
+ if (battle_config.day_duration > 0) { // if we want a day
+ if (night_flag != 0) {
+ strcpy(tmpstr, msg_txt(502)); // The day has arrived!
+ night_flag = 0; // 0=day, 1=night [Yor]
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_sd->opt2 &= ~STATE_BLIND;
+ clif_changeoption(&pl_sd->bl);
+ clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * timer to do the night
+ *------------------------------------------
+ */
+int map_night_timer(int tid, unsigned int tick, int id, int data) { // by [yor]
+ struct map_session_data *pl_sd = NULL;
+ int i;
+ char tmpstr[1024];
+
+ if (battle_config.night_duration > 0) { // if we want a night
+ if (night_flag == 0) {
+ strcpy(tmpstr, msg_txt(503)); // The night has fallen...
+ night_flag = 1; // 0=day, 1=night [Yor]
+ for(i = 0; i < fd_max; i++) {
+ if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) {
+ pl_sd->opt2 |= STATE_BLIND;
+ clif_changeoption(&pl_sd->bl);
+ clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+void pc_setstand(struct map_session_data *sd){
+ nullpo_retv(sd);
+
+ if(sd->sc_data && sd->sc_data[SC_TENSIONRELAX].timer!=-1)
+ skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
+
+ sd->state.dead_sit = 0;
+}
+
+//
+// ‰Šú‰»•¨
+//
+/*==========================================
+ * Ý’èƒtƒ@ƒCƒ‹“Ç‚Ýž‚Þ
+ * exp.txt •K—vŒoŒ±’l
+ * job_db1.txt d—Ê,hp,sp,UŒ‚‘¬“x
+ * job_db2.txt job”\—Í’lƒ{[ƒiƒX
+ * skill_tree.txt ŠeE–ˆ‚̃XƒLƒ‹ƒcƒŠ[
+ * attr_fix.txt ‘®«C³ƒe[ƒuƒ‹
+ * size_fix.txt ƒTƒCƒY•â³ƒe[ƒuƒ‹
+ * refine_db.txt ¸˜Bƒf[ƒ^ƒe[ƒuƒ‹
+ *------------------------------------------
+ */
+int pc_readdb(void)
+{
+ int i,j,k;
+ FILE *fp;
+ char line[1024],*p;
+
+ // •K—vŒoŒ±’l“Ç‚Ýž‚Ý
+
+ fp=fopen("db/exp.txt","r");
+ if(fp==NULL){
+ printf("can't read db/exp.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ int bn,b1,b2,b3,b4,b5,b6,jn,j1,j2,j3,j4,j5,j6;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ if(sscanf(line,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&bn,&b1,&b2,&b3,&b4,&b5,&b6,&jn,&j1,&j2,&j3,&j4,&j5,&j6)!=14)
+ continue;
+ exp_table[0][i]=bn;
+ exp_table[1][i]=b1;
+ exp_table[2][i]=b2;
+ exp_table[3][i]=b3;
+ exp_table[4][i]=b4;
+ exp_table[5][i]=b5;
+ exp_table[6][i]=b6;
+ exp_table[7][i]=jn;
+ exp_table[8][i]=j1;
+ exp_table[9][i]=j2;
+ exp_table[10][i]=j3;
+ exp_table[11][i]=j4;
+ exp_table[12][i]=j5;
+ exp_table[13][i]=j6;
+ i++;
+ if(i >= battle_config.maximum_level)
+ break;
+ }
+ fclose(fp);
+ printf("read db/exp.txt done\n");
+
+ // JOB•â³”’l‚P
+ fp=fopen("db/job_db1.txt","r");
+ if(fp==NULL){
+ printf("can't read db/job_db1.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ char *split[50];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<21 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(j<21)
+ continue;
+ max_weight_base[i]=atoi(split[0]);
+ hp_coefficient[i]=atoi(split[1]);
+ hp_coefficient2[i]=atoi(split[2]);
+ sp_coefficient[i]=atoi(split[3]);
+ for(j=0;j<17;j++)
+ aspd_base[i][j]=atoi(split[j+4]);
+ i++;
+// -- moonsoul (below two lines added to accommodate high numbered new class ids)
+ if(i==24)
+ i=4001;
+ if(i==MAX_PC_CLASS)
+ break;
+ }
+ fclose(fp);
+ printf("read db/job_db1.txt done\n");
+
+ // JOBƒ{[ƒiƒX
+ fp=fopen("db/job_db2.txt","r");
+ if(fp==NULL){
+ printf("can't read db/job_db2.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<MAX_LEVEL && p;j++){
+ if(sscanf(p,"%d",&k)==0)
+ break;
+ job_bonus[0][i][j]=k;
+ job_bonus[2][i][j]=k; //—{ŽqE‚̃{[ƒiƒX‚Í•ª‚©‚ç‚È‚¢‚̂ʼn¼
+ p=strchr(p,',');
+ if(p) p++;
+ }
+ i++;
+// -- moonsoul (below two lines added to accommodate high numbered new class ids)
+ if(i==24)
+ i=4001;
+ if(i==MAX_PC_CLASS)
+ break;
+ }
+ fclose(fp);
+ printf("read db/job_db2.txt done\n");
+
+ // JOBƒ{[ƒiƒX2 “]¶E—p
+ fp=fopen("db/job_db2-2.txt","r");
+ if(fp==NULL){
+ printf("can't read db/job_db2-2.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<MAX_LEVEL && p;j++){
+ if(sscanf(p,"%d",&k)==0)
+ break;
+ job_bonus[1][i][j]=k;
+ p=strchr(p,',');
+ if(p) p++;
+ }
+ i++;
+ if(i==MAX_PC_CLASS)
+ break;
+ }
+ fclose(fp);
+ printf("read db/job_db2-2.txt done\n");
+
+ // ƒXƒLƒ‹ƒcƒŠ[
+ memset(skill_tree,0,sizeof(skill_tree));
+ fp=fopen("db/skill_tree.txt","r");
+ if(fp==NULL){
+ printf("can't read db/skill_tree.txt\n");
+ return 1;
+ }
+ while(fgets(line, sizeof(line)-1, fp)){
+ char *split[50];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<13 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(j<13)
+ continue;
+ i=atoi(split[0]);
+ for(j=0;skill_tree[0][i][j].id;j++);
+ skill_tree[0][i][j].id=atoi(split[1]);
+ skill_tree[0][i][j].max=atoi(split[2]);
+ skill_tree[2][i][j].id=atoi(split[1]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
+ skill_tree[2][i][j].max=atoi(split[2]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
+ for(k=0;k<5;k++){
+ skill_tree[0][i][j].need[k].id=atoi(split[k*2+3]);
+ skill_tree[0][i][j].need[k].lv=atoi(split[k*2+4]);
+ skill_tree[2][i][j].need[k].id=atoi(split[k*2+3]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
+ skill_tree[2][i][j].need[k].lv=atoi(split[k*2+4]); //—{ŽqE‚Í—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚ÅŽb’è
+ }
+ }
+ fclose(fp);
+ printf("read db/skill_tree.txt done\n");
+
+ // ‘®«C³ƒe[ƒuƒ‹
+ for(i=0;i<4;i++)
+ for(j=0;j<10;j++)
+ for(k=0;k<10;k++)
+ attr_fix_table[i][j][k]=100;
+ fp=fopen("db/attr_fix.txt","r");
+ if(fp==NULL){
+ printf("can't read db/attr_fix.txt\n");
+ return 1;
+ }
+ while(fgets(line, sizeof(line)-1, fp)){
+ char *split[10];
+ int lv,n;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<3 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ lv=atoi(split[0]);
+ n=atoi(split[1]);
+// printf("%d %d\n",lv,n);
+
+ for(i=0;i<n;){
+ if( !fgets(line, sizeof(line)-1, fp) )
+ break;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+
+ for(j=0,p=line;j<n && p;j++){
+ while(*p==32 && *p>0)
+ p++;
+ attr_fix_table[lv-1][i][j]=atoi(p);
+ if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
+ attr_fix_table[lv-1][i][j] = 0;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+
+ i++;
+ }
+ }
+ fclose(fp);
+ printf("read db/attr_fix.txt done\n");
+
+ // ƒTƒCƒY•â³ƒe[ƒuƒ‹
+ for(i=0;i<3;i++)
+ for(j=0;j<20;j++)
+ atkmods[i][j]=100;
+ fp=fopen("db/size_fix.txt","r");
+ if(fp==NULL){
+ printf("can't read db/size_fix.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ char *split[20];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ if(atoi(line)<=0)
+ continue;
+ memset(split,0,sizeof(split));
+ for(j=0,p=line;j<20 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ for(j=0;j<20 && split[j];j++)
+ atkmods[i][j]=atoi(split[j]);
+ i++;
+ }
+ fclose(fp);
+ printf("read db/size_fix.txt done\n");
+
+ // ¸˜Bƒf[ƒ^ƒe[ƒuƒ‹
+ for(i=0;i<5;i++){
+ for(j=0;j<10;j++)
+ percentrefinery[i][j]=100;
+ refinebonus[i][0]=0;
+ refinebonus[i][1]=0;
+ refinebonus[i][2]=10;
+ }
+ fp=fopen("db/refine_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/refine_db.txt\n");
+ return 1;
+ }
+ i=0;
+ while(fgets(line, sizeof(line)-1, fp)){
+ char *split[16];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ if(atoi(line)<=0)
+ continue;
+ memset(split,0,sizeof(split));
+ for(j=0,p=line;j<16 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ refinebonus[i][0]=atoi(split[0]); // ¸˜Bƒ{[ƒiƒX
+ refinebonus[i][1]=atoi(split[1]); // ‰ß踘Bƒ{[ƒiƒX
+ refinebonus[i][2]=atoi(split[2]); // ˆÀ‘S¸˜BŒÀŠE
+ for(j=0;j<10 && split[j];j++)
+ percentrefinery[i][j]=atoi(split[j+3]);
+ i++;
+ }
+ fclose(fp); //Lupus. close this file!!!
+ printf("read db/refine_db.txt done\n");
+
+ return 0;
+}
+
+static int pc_calc_sigma(void)
+{
+ int i,j,k;
+
+ for(i=0;i<MAX_PC_CLASS;i++) {
+ memset(hp_sigma_val[i],0,sizeof(hp_sigma_val[i]));
+ for(k=0,j=2;j<=MAX_LEVEL;j++) {
+ k += hp_coefficient[i]*j + 50;
+ k -= k%100;
+ hp_sigma_val[i][j-1] = k;
+ }
+ }
+ return 0;
+}
+
+static void pc_statpointdb(void)
+{
+ char * buf_stat;
+ int i=0,j=0,k=0,l=0, end = 0;
+
+ FILE *stp;
+
+ stp=fopen("db/statpoint.txt","r");
+
+ if(stp==NULL){
+ printf("can't read db/statpoint.txt\n");
+ return;
+ }
+
+ fseek(stp, 0, SEEK_END);
+ end = ftell(stp);
+ rewind(stp);
+
+ buf_stat = (char *) malloc (end + 1);
+ l = fread(buf_stat,1,end,stp);
+ fclose(stp);
+ printf("read db/statpoint.txt done (size=%d)\n",l);
+
+ for(i=0;i<255;i++) {
+ j=0;
+ while (*(buf_stat+k)!='\n') {
+ statp[i][j]=*(buf_stat+k);
+ j++;k++;
+ }
+ statp[i][j+1]='\0';
+ k++;
+ }
+
+ free(buf_stat);
+}
+
+/*==========================================
+ * pcŠÖ ŒW‰Šú‰»
+ *------------------------------------------
+ */
+int do_init_pc(void) {
+ pc_readdb();
+ pc_statpointdb();
+ pc_calc_sigma();
+
+// gm_account_db = numdb_init();
+
+ add_timer_func_list(pc_walk, "pc_walk");
+ add_timer_func_list(pc_attack_timer, "pc_attack_timer");
+ add_timer_func_list(pc_natural_heal, "pc_natural_heal");
+ add_timer_func_list(pc_invincible_timer, "pc_invincible_timer");
+ add_timer_func_list(pc_eventtimer, "pc_eventtimer");
+ add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
+ add_timer_func_list(pc_autosave, "pc_autosave");
+ add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer");
+ add_timer_interval((natural_heal_prev_tick = gettick() + NATURAL_HEAL_INTERVAL), pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL);
+ add_timer(gettick() + autosave_interval, pc_autosave, 0, 0);
+
+#ifndef TXT_ONLY
+ pc_read_gm_account(0);
+#endif /* not TXT_ONLY */
+
+ // add night/day timer (by [yor])
+ add_timer_func_list(map_day_timer, "map_day_timer"); // by [yor]
+ add_timer_func_list(map_night_timer, "map_night_timer"); // by [yor]
+ {
+ int day_duration = battle_config.day_duration;
+ int night_duration = battle_config.night_duration;
+ if (day_duration < 60000)
+ day_duration = 60000;
+ if (night_duration < 60000)
+ night_duration = 60000;
+ if (battle_config.night_at_start == 0) {
+ night_flag = 0; // 0=day, 1=night [Yor]
+ day_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
+ night_timer_tid = add_timer_interval(gettick() + day_duration, map_night_timer, 0, 0, day_duration + night_duration);
+ } else {
+ night_flag = 1; // 0=day, 1=night [Yor]
+ day_timer_tid = add_timer_interval(gettick() + night_duration, map_day_timer, 0, 0, day_duration + night_duration);
+ night_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_night_timer, 0, 0, day_duration + night_duration);
+ }
+ }
+
+ return 0;
+}
diff --git a/src/map/pc.h b/src/map/pc.h
index befa690fd..1919007a0 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -1,186 +1,186 @@
-// $Id: pc.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-
-#ifndef _PC_H_
-#define _PC_H_
-
-#include "map.h"
-
-#define OPTION_MASK 0xd7b8
-#define CART_MASK 0x788
-
-#define pc_setdead(sd) ((sd)->state.dead_sit = 1)
-#define pc_setsit(sd) ((sd)->state.dead_sit = 2)
-//#define pc_setstand(sd) ((sd)->state.dead_sit = 0)
-#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
-#define pc_issit(sd) ((sd)->state.dead_sit == 2)
-#define pc_setdir(sd,b,h) ((sd)->dir = (b) ,(sd)->head_dir = (h) )
-#define pc_setchatid(sd,n) ((sd)->chatID = n)
-#define pc_ishiding(sd) ((sd)->status.option&0x4006)
-#define pc_iscarton(sd) ((sd)->status.option&CART_MASK)
-#define pc_isfalcon(sd) ((sd)->status.option&0x0010)
-#define pc_isriding(sd) ((sd)->status.option&0x0020)
-#define pc_isinvisible(sd) ((sd)->status.option&0x0040)
-#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
-#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
-
-int pc_isGM(struct map_session_data *sd);
-int pc_iskiller(struct map_session_data *src, struct map_session_data *target); // [MouseJstr]
-int pc_getrefinebonus(int lv,int type);
-
-int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv);
-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,int,int,int);
-int pc_authok(int, int, time_t, struct mmo_charstatus *);
-int pc_authfail(int);
-
-int pc_isequip(struct map_session_data *sd,int n);
-int pc_equippoint(struct map_session_data *sd,int n);
-
-int pc_breakweapon(struct map_session_data *sd); // weapon breaking [Valaris]
-int pc_breakarmor(struct map_session_data *sd); // armor breaking [Valaris]
-
-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_checkoverhp(struct map_session_data*);
-int pc_checkoversp(struct map_session_data*);
-
-int pc_can_reach(struct map_session_data*,int,int);
-int pc_walktoxy(struct map_session_data*,int,int);
-int pc_stop_walking(struct map_session_data*,int);
-int pc_movepos(struct map_session_data*,int,int);
-int pc_setpos(struct map_session_data*,char*,int,int,int);
-int pc_setsavepoint(struct map_session_data*,char*,int,int);
-int pc_randomwarp(struct map_session_data *sd,int type);
-int pc_memo(struct map_session_data *sd,int i);
-
-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_checkitem(struct map_session_data*);
-
-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_calcstatus(struct map_session_data*,int);
-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_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_item_identify(struct map_session_data *sd,int idx);
-int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
-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_attack(struct map_session_data*,int,int);
-int pc_stopattack(struct map_session_data*);
-
-int pc_follow(struct map_session_data*, int); // [MouseJstr]
-
-int pc_checkbaselevelup(struct map_session_data *sd);
-int pc_checkjoblevelup(struct map_session_data *sd);
-int pc_gainexp(struct map_session_data*,int,int);
-int pc_nextbaseexp(struct map_session_data *);
-int pc_nextbaseafter(struct map_session_data *); // [Valaris]
-int pc_nextjobexp(struct map_session_data *);
-int pc_nextjobafter(struct map_session_data *); // [Valaris]
-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 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);
-
-int pc_damage(struct block_list *,struct map_session_data*,int);
-int pc_heal(struct map_session_data *,int,int);
-int pc_itemheal(struct map_session_data *sd,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);
-int pc_readglobalreg(struct map_session_data*,char*);
-int pc_setglobalreg(struct map_session_data*,char*,int);
-int pc_readaccountreg(struct map_session_data*,char*);
-int pc_setaccountreg(struct map_session_data*,char*,int);
-int pc_readaccountreg2(struct map_session_data*,char*);
-int pc_setaccountreg2(struct map_session_data*,char*,int);
-int pc_percentrefinery(struct map_session_data *sd,struct item *item);
-
-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);
-struct map_session_data *pc_get_partner(struct map_session_data *sd);
-int pc_set_gm_level(int account_id, int level);
-void pc_setstand(struct map_session_data *sd);
-
-
-struct pc_base_job{
- int job; //E‹ÆA‚½‚¾‚µ“]¶E‚â—{ŽqE‚Ìꇂ͌³‚ÌE‹Æ‚ð•Ô‚·(”pƒvƒŠ¨ƒvƒŠ)
- int type; //ƒmƒr 0, ˆêŽŸE 1, “ñŽŸE 2, ƒXƒpƒmƒr 3
- int upper; //’Êí 0, “]¶ 1, —{Žq 2
-};
-
-struct pc_base_job pc_calc_base_job(int b_class);//“]¶‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
-
-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);
-
-int do_init_pc(void);
-
-enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT};
-
-// timer for night.day
-int day_timer_tid;
-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]
-
-#endif
-
+// $Id: pc.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
+
+#ifndef _PC_H_
+#define _PC_H_
+
+#include "map.h"
+
+#define OPTION_MASK 0xd7b8
+#define CART_MASK 0x788
+
+#define pc_setdead(sd) ((sd)->state.dead_sit = 1)
+#define pc_setsit(sd) ((sd)->state.dead_sit = 2)
+//#define pc_setstand(sd) ((sd)->state.dead_sit = 0)
+#define pc_isdead(sd) ((sd)->state.dead_sit == 1)
+#define pc_issit(sd) ((sd)->state.dead_sit == 2)
+#define pc_setdir(sd,b,h) ((sd)->dir = (b) ,(sd)->head_dir = (h) )
+#define pc_setchatid(sd,n) ((sd)->chatID = n)
+#define pc_ishiding(sd) ((sd)->status.option&0x4006)
+#define pc_iscarton(sd) ((sd)->status.option&CART_MASK)
+#define pc_isfalcon(sd) ((sd)->status.option&0x0010)
+#define pc_isriding(sd) ((sd)->status.option&0x0020)
+#define pc_isinvisible(sd) ((sd)->status.option&0x0040)
+#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight)
+#define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9)
+
+int pc_isGM(struct map_session_data *sd);
+int pc_iskiller(struct map_session_data *src, struct map_session_data *target); // [MouseJstr]
+int pc_getrefinebonus(int lv,int type);
+
+int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv);
+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,int,int,int);
+int pc_authok(int, int, time_t, struct mmo_charstatus *);
+int pc_authfail(int);
+
+int pc_isequip(struct map_session_data *sd,int n);
+int pc_equippoint(struct map_session_data *sd,int n);
+
+int pc_breakweapon(struct map_session_data *sd); // weapon breaking [Valaris]
+int pc_breakarmor(struct map_session_data *sd); // armor breaking [Valaris]
+
+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_checkoverhp(struct map_session_data*);
+int pc_checkoversp(struct map_session_data*);
+
+int pc_can_reach(struct map_session_data*,int,int);
+int pc_walktoxy(struct map_session_data*,int,int);
+int pc_stop_walking(struct map_session_data*,int);
+int pc_movepos(struct map_session_data*,int,int);
+int pc_setpos(struct map_session_data*,char*,int,int,int);
+int pc_setsavepoint(struct map_session_data*,char*,int,int);
+int pc_randomwarp(struct map_session_data *sd,int type);
+int pc_memo(struct map_session_data *sd,int i);
+
+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_checkitem(struct map_session_data*);
+
+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_calcstatus(struct map_session_data*,int);
+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_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_item_identify(struct map_session_data *sd,int idx);
+int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
+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_attack(struct map_session_data*,int,int);
+int pc_stopattack(struct map_session_data*);
+
+int pc_follow(struct map_session_data*, int); // [MouseJstr]
+
+int pc_checkbaselevelup(struct map_session_data *sd);
+int pc_checkjoblevelup(struct map_session_data *sd);
+int pc_gainexp(struct map_session_data*,int,int);
+int pc_nextbaseexp(struct map_session_data *);
+int pc_nextbaseafter(struct map_session_data *); // [Valaris]
+int pc_nextjobexp(struct map_session_data *);
+int pc_nextjobafter(struct map_session_data *); // [Valaris]
+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 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);
+
+int pc_damage(struct block_list *,struct map_session_data*,int);
+int pc_heal(struct map_session_data *,int,int);
+int pc_itemheal(struct map_session_data *sd,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);
+int pc_readglobalreg(struct map_session_data*,char*);
+int pc_setglobalreg(struct map_session_data*,char*,int);
+int pc_readaccountreg(struct map_session_data*,char*);
+int pc_setaccountreg(struct map_session_data*,char*,int);
+int pc_readaccountreg2(struct map_session_data*,char*);
+int pc_setaccountreg2(struct map_session_data*,char*,int);
+int pc_percentrefinery(struct map_session_data *sd,struct item *item);
+
+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);
+struct map_session_data *pc_get_partner(struct map_session_data *sd);
+int pc_set_gm_level(int account_id, int level);
+void pc_setstand(struct map_session_data *sd);
+
+
+struct pc_base_job{
+ int job; //E‹ÆA‚½‚¾‚µ“]¶E‚â—{ŽqE‚Ìꇂ͌³‚ÌE‹Æ‚ð•Ô‚·(”pƒvƒŠ¨ƒvƒŠ)
+ int type; //ƒmƒr 0, ˆêŽŸE 1, “ñŽŸE 2, ƒXƒpƒmƒr 3
+ int upper; //’Êí 0, “]¶ 1, —{Žq 2
+};
+
+struct pc_base_job pc_calc_base_job(int b_class);//“]¶‚â—{ŽqE‚ÌŒ³‚ÌE‹Æ‚ð•Ô‚·
+
+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);
+
+int do_init_pc(void);
+
+enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT};
+
+// timer for night.day
+int day_timer_tid;
+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]
+
+#endif
+
diff --git a/src/map/pet.c b/src/map/pet.c
index 8bc17003a..6026b1ebf 100644
--- a/src/map/pet.c
+++ b/src/map/pet.c
@@ -1,1651 +1,1651 @@
-// $Id: pet.c,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "timer.h"
-#include "socket.h"
-#include "nullpo.h"
-#include "malloc.h"
-#include "pc.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"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define MIN_PETTHINKTIME 100
-
-struct pet_db pet_db[MAX_PET_DB];
-
-static int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static int pet_timer(int tid,unsigned int tick,int id,int data);
-static int pet_walktoxy_sub(struct pet_data *pd);
-
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-static int calc_next_walk_step(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- if(pd->walkpath.path_pos>=pd->walkpath.path_len)
- return -1;
- if(pd->walkpath.path[pd->walkpath.path_pos]&1)
- return pd->speed*14/10;
- return pd->speed;
-}
-
-static int pet_performance_val(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->pet.intimate > 900)
- return (sd->petDB->s_perfor > 0)? 4:3;
- else if(sd->pet.intimate > 750)
- return 2;
- else
- return 1;
-}
-
-int pet_hungry_val(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->pet.hungry > 90)
- return 4;
- else if(sd->pet.hungry > 75)
- return 3;
- else if(sd->pet.hungry > 25)
- return 2;
- else if(sd->pet.hungry > 10)
- return 1;
- else
- return 0;
-}
-
-static int pet_can_reach(struct pet_data *pd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- if( pd->bl.x==x && pd->bl.y==y ) // “¯‚¶ƒ}ƒX
- return 1;
-
- // áŠQ•¨”»’è
- wpd.path_len=0;
- wpd.path_pos=0;
- wpd.path_half=0;
- return (path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0)!=-1)?1:0;
-}
-
-static int pet_calc_pos(struct pet_data *pd,int tx,int ty,int dir)
-{
- int x,y,dx,dy;
- int i,j=0,k;
-
- nullpo_retr(0, pd);
-
- pd->to_x = tx;
- pd->to_y = ty;
-
- if(dir >= 0 && dir < 8) {
- dx = -dirx[dir]*2;
- dy = -diry[dir]*2;
- x = tx + dx;
- y = ty + dy;
- if(!(j=pet_can_reach(pd,x,y))) {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if(!(j=pet_can_reach(pd,x,y))) {
- for(i=0;i<12;i++) {
- k = rand()%8;
- dx = -dirx[k]*2;
- dy = -diry[k]*2;
- x = tx + dx;
- y = ty + dy;
- if((j=pet_can_reach(pd,x,y)))
- break;
- else {
- if(dx > 0) x--;
- else if(dx < 0) x++;
- if(dy > 0) y--;
- else if(dy < 0) y++;
- if((j=pet_can_reach(pd,x,y)))
- break;
- }
- }
- if(!j) {
- x = tx;
- y = ty;
- if(!pet_can_reach(pd,x,y))
- return 1;
- }
- }
- }
- }
- else
- return 1;
-
- pd->to_x = x;
- pd->to_y = y;
- return 0;
-}
-
-static int pet_attack(struct pet_data *pd,unsigned int tick,int data)
-{
- struct mob_data *md;
- int mode,race,range;
-
- nullpo_retr(0, pd);
-
- pd->state.state=MS_IDLE;
-
- md=(struct mob_data *)map_id2bl(pd->target_id);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13) {
- pd->target_id=0;
- return 0;
- }
-
- mode=mob_db[pd->class].mode;
- race=mob_db[pd->class].race;
- if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race != 4 && race != 6) ) {
- pd->target_id=0;
- return 0;
- }
-
- range = mob_db[pd->class].range + 1;
- if(distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > range)
- return 0;
- if(battle_config.monster_attack_direction_change)
- pd->dir=map_calc_dir(&pd->bl, md->bl.x,md->bl.y );
-
- clif_fixpetpos(pd);
-
- pd->target_lv = battle_weapon_attack(&pd->bl,&md->bl,tick,0);
-
- pd->attackabletime = tick + battle_get_adelay(&pd->bl);
-
- pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
- pd->state.state=MS_ATTACK;
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int pet_walk(struct pet_data *pd,unsigned int tick,int data)
-{
- int moveblock;
- int i,ctype;
- int x,y,dx,dy;
-
- nullpo_retr(0, pd);
-
- pd->state.state=MS_IDLE;
- if(pd->walkpath.path_pos >= pd->walkpath.path_len || pd->walkpath.path_pos != data)
- return 0;
-
- pd->walkpath.path_half ^= 1;
- if(pd->walkpath.path_half==0){
- pd->walkpath.path_pos++;
- if(pd->state.change_walk_target){
- pet_walktoxy_sub(pd);
- return 0;
- }
- }
- else {
- if(pd->walkpath.path[pd->walkpath.path_pos] >= 8)
- return 1;
-
- x = pd->bl.x;
- y = pd->bl.y;
-/* ctype = map_getcell(pd->bl.m,x,y);
- if(ctype == 1 || ctype == 5) {
- pet_stop_walking(pd,1);
- return 0;
- }*/
- pd->dir=pd->walkpath.path[pd->walkpath.path_pos];
- dx = dirx[pd->dir];
- dy = diry[pd->dir];
-
- ctype = map_getcell(pd->bl.m,x+dx,y+dy);
- if(ctype == 1 || ctype == 5) {
- pet_walktoxy_sub(pd);
- return 0;
- }
-
- moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
-
- pd->state.state=MS_WALK;
- map_foreachinmovearea(clif_petoutsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
-
- x += dx;
- y += dy;
-
- if(moveblock) map_delblock(&pd->bl);
- pd->bl.x = x;
- pd->bl.y = y;
- if(moveblock) map_addblock(&pd->bl);
-
- map_foreachinmovearea(clif_petinsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,pd);
- pd->state.state=MS_IDLE;
- }
- if((i=calc_next_walk_step(pd))>0){
- i = i>>1;
- if(i < 1 && pd->walkpath.path_half == 0)
- i = 1;
- pd->timer=add_timer(tick+i,pet_timer,pd->bl.id,pd->walkpath.path_pos);
- pd->state.state=MS_WALK;
-
- if(pd->walkpath.path_pos >= pd->walkpath.path_len)
- clif_fixpetpos(pd);
- }
- return 0;
-}
-
-int pet_stopattack(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- pd->target_id=0;
- if(pd->state.state == MS_ATTACK)
- pet_changestate(pd,MS_IDLE,0);
-
- return 0;
-}
-
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
-{
- struct pet_data *pd;
- struct mob_data *md;
- int rate,mode,race;
-
- nullpo_retr(0, sd);
-
- pd = sd->pd;
-
- if(bl && pd && bl->type == BL_MOB && sd->pet.intimate > 900 && sd->pet.hungry > 0 && pd->class != battle_get_class(bl)
- && pd->state.state != MS_DELAY) {
- mode=mob_db[pd->class].mode;
- race=mob_db[pd->class].race;
- md=(struct mob_data *)bl;
- if(md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
- return 0;
- if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
- return 0;
- if(!type) {
- rate = sd->petDB->attack_rate;
- rate = rate * (150 - (sd->pet.intimate - 1000))/100;
- if(battle_config.pet_support_rate != 100)
- rate = rate*battle_config.pet_support_rate/100;
- if(sd->petDB->attack_rate > 0 && rate <= 0)
- rate = 1;
- }
- else {
- rate = sd->petDB->defence_attack_rate;
- rate = rate * (150 - (sd->pet.intimate - 1000))/100;
- if(battle_config.pet_support_rate != 100)
- rate = rate*battle_config.pet_support_rate/100;
- if(sd->petDB->defence_attack_rate > 0 && rate <= 0)
- rate = 1;
- }
- if(rand()%10000 < rate) {
- if(pd->target_id == 0 || rand()%10000 < sd->petDB->change_target_rate)
- pd->target_id = bl->id;
- }
- }
- return 0;
-}
-
-int pet_changestate(struct pet_data *pd,int state,int type)
-{
- unsigned int tick;
- int i;
-
- nullpo_retr(0, pd);
-
- if(pd->timer != -1)
- delete_timer(pd->timer,pet_timer);
- pd->timer=-1;
- pd->state.state=state;
-
- switch(state) {
- case MS_WALK:
- if((i=calc_next_walk_step(pd)) > 0){
- i = i>>2;
- pd->timer=add_timer(gettick()+i,pet_timer,pd->bl.id,0);
- } else
- pd->state.state=MS_IDLE;
- break;
- case MS_ATTACK:
- tick = gettick();
- i=DIFF_TICK(pd->attackabletime,tick);
- if(i>0 && i<2000)
- pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
- else
- pd->timer=add_timer(tick+1,pet_timer,pd->bl.id,0);
- break;
- case MS_DELAY:
- pd->timer=add_timer(gettick()+type,pet_timer,pd->bl.id,0);
- break;
- }
-
- return 0;
-}
-
-static int pet_timer(int tid,unsigned int tick,int id,int data)
-{
- struct pet_data *pd;
-
- pd=(struct pet_data*)map_id2bl(id);
- if(pd == NULL || pd->bl.type != BL_PET)
- return 1;
-
- if(pd->timer != tid){
- if(battle_config.error_log)
- printf("pet_timer %d != %d\n",pd->timer,tid);
- return 0;
- }
- pd->timer=-1;
-
- if(pd->bl.prev == NULL)
- return 1;
-
- switch(pd->state.state){
- case MS_WALK:
- pet_walk(pd,tick,data);
- break;
- case MS_ATTACK:
- pet_attack(pd,tick,data);
- break;
- case MS_DELAY:
- pet_changestate(pd,MS_IDLE,0);
- break;
- default:
- if(battle_config.error_log)
- printf("pet_timer : %d ?\n",pd->state.state);
- break;
- }
-
- return 0;
-}
-
-static int pet_walktoxy_sub(struct pet_data *pd)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- if(path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y,0))
- return 1;
- memcpy(&pd->walkpath,&wpd,sizeof(wpd));
-
- pd->state.change_walk_target=0;
- pet_changestate(pd,MS_WALK,0);
- clif_movepet(pd);
-// if(battle_config.etc_log)
-// printf("walkstart\n");
-
- return 0;
-}
-
-int pet_walktoxy(struct pet_data *pd,int x,int y)
-{
- struct walkpath_data wpd;
-
- nullpo_retr(0, pd);
-
- if(pd->state.state == MS_WALK && path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0))
- return 1;
-
- pd->to_x=x;
- pd->to_y=y;
-
- if(pd->state.state == MS_WALK) {
- pd->state.change_walk_target=1;
- } else {
- return pet_walktoxy_sub(pd);
- }
-
- return 0;
-}
-
-int pet_stop_walking(struct pet_data *pd,int type)
-{
- nullpo_retr(0, pd);
-
- if(pd->state.state == MS_WALK || pd->state.state == MS_IDLE) {
- pd->walkpath.path_len=0;
- pd->to_x=pd->bl.x;
- pd->to_y=pd->bl.y;
- }
- if(type&0x01)
- clif_fixpetpos(pd);
- if(type&~0xff)
- pet_changestate(pd,MS_DELAY,type>>8);
- else
- pet_changestate(pd,MS_IDLE,0);
-
- return 0;
-}
-
-static int pet_hungry(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd;
- int interval,t;
-
- sd=map_id2sd(id);
- if(sd==NULL)
- return 1;
-
- if(sd->pet_hungry_timer != tid){
- if(battle_config.error_log)
- printf("pet_hungry_timer %d != %d\n",sd->pet_hungry_timer,tid);
- return 0;
- }
- sd->pet_hungry_timer = -1;
- if(!sd->status.pet_id || !sd->pd || !sd->petDB)
- return 1;
-
- sd->pet.hungry--;
- t = sd->pet.intimate;
- if(sd->pet.hungry < 0) {
- if(sd->pd->target_id > 0)
- pet_stopattack(sd->pd);
- sd->pet.hungry = 0;
- sd->pet.intimate -= battle_config.pet_hungry_friendly_decrease;
- if(sd->pet.intimate <= 0) {
- sd->pet.intimate = 0;
- if(battle_config.pet_status_support && t > 0) {
- if(sd->bl.prev != NULL)
- pc_calcstatus(sd,0);
- else
- pc_calcstatus(sd,2);
- }
- }
- clif_send_petdata(sd,1,sd->pet.intimate);
- }
- clif_send_petdata(sd,2,sd->pet.hungry);
-
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = sd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- sd->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 map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->pet_hungry_timer != -1) {
- delete_timer(sd->pet_hungry_timer,pet_hungry);
- sd->pet_hungry_timer = -1;
- }
-
- return 0;
-}
-
-int pet_remove_map(struct map_session_data *sd)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.pet_id && sd->pd) {
-
- struct pet_data *pd=sd->pd; // [Valaris]
- if(pd->skillbonustimer!=-1) pd->skillbonustimer=-1;
- if(pd->skillbonusduration!=-1) pd->skillbonusduration=-1;
- if(pd->skilltype !=-1) pd->skilltype=-1;
- if(pd->skillval !=-1) pd->skillval=-1;
- if(pd->skilltimer!=-1) pd->skilltimer=-1;
- if(pd->skillduration!=-1) pd->skillduration=-1;
- if(pd->skillbonustype!=-1) pd->skillbonustype=-1;
- if(pd->skillbonusval!=-1) pd->skillbonusval=-1;
- if(sd->perfect_hiding==1) sd->perfect_hiding=0; // end additions
-
- pet_changestate(sd->pd,MS_IDLE,0);
- if(sd->pet_hungry_timer != -1)
- pet_hungry_timer_delete(sd);
- clif_clearchar_area(&sd->pd->bl,0);
- map_delblock(&sd->pd->bl);
- map_deliddb(&sd->pd->bl);
- map_freeblock(sd->pd);
- }
- return 0;
-}
-struct delay_item_drop {
- int m,x,y;
- int nameid,amount;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-struct delay_item_drop2 {
- int m,x,y;
- struct item item_data;
- struct map_session_data *first_sd,*second_sd,*third_sd;
-};
-
-int pet_performance(struct map_session_data *sd)
-{
- struct pet_data *pd;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, pd=sd->pd);
-
- pet_stop_walking(pd,2000<<8);
- clif_pet_performance(&pd->bl,rand()%pet_performance_val(sd) + 1);
- // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
- pet_lootitem_drop(pd,NULL);
-
- return 0;
-}
-
-int pet_return_egg(struct map_session_data *sd)
-{
- struct item tmp_item;
- int flag;
-
- nullpo_retr(0, sd);
-
- if(sd->status.pet_id && sd->pd) {
- struct pet_data *pd=sd->pd;
- pet_remove_map(sd);
- sd->status.pet_id = 0;
- sd->pd = NULL;
-
- if(sd->petDB == NULL)
- return 1;
- sd->pet.incuvate = 1;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = sd->petDB->EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0xff00;
- *((long *)(&tmp_item.card[1])) = sd->pet.pet_id;
- tmp_item.card[3] = sd->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);
- }
- if(battle_config.pet_status_support && sd->pet.intimate > 0) {
- if(sd->bl.prev != NULL)
- pc_calcstatus(sd,0);
- else
- pc_calcstatus(sd,2);
- }
- // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
- pet_lootitem_drop(pd,sd);
-
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
-
- sd->petDB = NULL;
- }
-
- return 0;
-}
-
-int pet_data_init(struct map_session_data *sd)
-{
- struct pet_data *pd;
- int i=0,interval=0;
-
- nullpo_retr(1, sd);
-
- if(sd->status.account_id != sd->pet.account_id || sd->status.char_id != sd->pet.char_id ||
- sd->status.pet_id != sd->pet.pet_id) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- i = search_petDB_index(sd->pet.class,PET_CLASS);
- if(i < 0) {
- sd->status.pet_id = 0;
- return 1;
- }
- sd->petDB = &pet_db[i];
- sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data));
-
- pd->bl.m = sd->bl.m;
- pd->bl.prev = pd->bl.next = NULL;
- pd->bl.x = pd->to_x = sd->bl.x;
- pd->bl.y = pd->to_y = sd->bl.y;
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- pd->bl.x = pd->to_x;
- pd->bl.y = pd->to_y;
- pd->bl.id = npc_get_new_npc_id();
- memcpy(pd->name,sd->pet.name,24);
- pd->class = sd->pet.class;
- pd->equip = sd->pet.equip;
- pd->dir = sd->dir;
- pd->speed = sd->petDB->speed;
- pd->bl.subtype = MONS;
- pd->bl.type = BL_PET;
- memset(&pd->state,0,sizeof(pd->state));
- pd->state.state = MS_IDLE;
- pd->state.change_walk_target = 0;
- pd->timer = -1;
- pd->target_id = 0;
- pd->move_fail_count = 0;
- pd->next_walktime = pd->attackabletime = pd->last_thinktime = gettick();
- pd->msd = sd;
-
- map_addiddb(&pd->bl);
-
- if(sd->pet_hungry_timer != -1)
- pet_hungry_timer_delete(sd);
- if(battle_config.pet_hungry_delay_rate != 100)
- interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
- else
- interval = sd->petDB->hungry_delay;
- if(interval <= 0)
- interval = 1;
- sd->pet_hungry_timer = add_timer(gettick()+interval,pet_hungry,sd->bl.id,0);
- pd->lootitem=(struct item *)aCalloc(PETLOOT_SIZE,sizeof(struct item));
- pd->lootitem_count = 0;
- pd->lootitem_weight = 0;
- pd->lootitem_timer = gettick();
- return 0;
-}
-
-int pet_birth_process(struct map_session_data *sd)
-{
- nullpo_retr(1, sd);
-
- if(sd->status.pet_id && sd->pet.incuvate == 1) {
- sd->status.pet_id = 0;
- return 1;
- }
-
- sd->pet.incuvate = 0;
- sd->pet.account_id = sd->status.account_id;
- sd->pet.char_id = sd->status.char_id;
- sd->status.pet_id = sd->pet.pet_id;
- if(pet_data_init(sd)) {
- sd->status.pet_id = 0;
- sd->pet.incuvate = 1;
- sd->pet.account_id = 0;
- sd->pet.char_id = 0;
- return 1;
- }
-
- intif_save_petdata(sd->status.account_id,&sd->pet);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(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;
- }
- memcpy(&sd->pet,p,sizeof(struct s_pet));
- if(sd->pet.incuvate == 1)
- pet_birth_process(sd);
- else {
- pet_data_init(sd);
- if(sd->bl.prev != NULL) {
- map_addblock(&sd->pd->bl);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
-// clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(sd);
- }
- }
- if(battle_config.pet_status_support && sd->pet.intimate > 0) {
- if(sd->bl.prev != NULL)
- pc_calcstatus(sd,0);
- else
- pc_calcstatus(sd,2);
- }
-
- return 0;
-}
-
-int pet_select_egg(struct map_session_data *sd,short egg_index)
-{
- nullpo_retr(0, sd);
-
- if(sd->status.inventory[egg_index].card[0] == (short)0xff00)
- intif_request_petdata(sd->status.account_id,sd->status.char_id,*((long *)&sd->status.inventory[egg_index].card[1]));
- else {
- if(battle_config.error_log)
- printf("wrong egg item inventory %d\n",egg_index);
- }
- pc_delitem(sd,egg_index,1,0);
-
- 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){
- clif_pet_rulet(sd,0);
- return 1;
- }
-
- i = search_petDB_index(md->class,PET_CLASS);
- if(md == NULL || md->bl.type != BL_MOB || md->bl.prev == NULL || i < 0 || sd->catch_target_class != md->class) {
- clif_pet_rulet(sd,0);
- return 1;
- }
-
- //target_id‚É‚æ‚é“G¨—‘”»’è
-// if(battle_config.etc_log)
-// printf("mob_id = %d, mob_class = %d\n",md->bl.id,md->class);
- //¬Œ÷‚Ìê‡
- pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - mob_db[md->class].lv)*30 + sd->paramc[5]*20)*(200 - md->hp*100/mob_db[md->class].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) {
- mob_catch_delete(md,0);
- 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
- clif_pet_rulet(sd,0);
-
- return 0;
-}
-
-int pet_get_egg(int account_id,int pet_id,int flag)
-{
- struct map_session_data *sd;
- struct item tmp_item;
- int i=0,ret=0;
-
- if(!flag) {
- sd = map_id2sd(account_id);
- if(sd == NULL)
- return 1;
-
- i = search_petDB_index(sd->catch_target_class,PET_CLASS);
- if(i >= 0) {
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid = pet_db[i].EggID;
- tmp_item.identify = 1;
- tmp_item.card[0] = 0xff00;
- *((long *)(&tmp_item.card[1])) = pet_id;
- tmp_item.card[3] = sd->pet.rename_flag;
- 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);
- }
- }
- else
- intif_delete_petdata(pet_id);
- }
-
- return 0;
-}
-
-int pet_menu(struct map_session_data *sd,int menunum)
-{
- nullpo_retr(0, sd);
-
- switch(menunum) {
- case 0:
- clif_send_petstatus(sd);
- break;
- case 1:
- pet_food(sd);
- break;
- case 2:
- pet_performance(sd);
- break;
- case 3:
- pet_return_egg(sd);
- break;
- case 4:
- pet_unequipitem(sd);
- break;
- }
- return 0;
-}
-
-int pet_change_name(struct map_session_data *sd,char *name)
-{
- int i;
-
- nullpo_retr(1, sd);
-
- if(sd->pet.rename_flag == 1 && battle_config.pet_rename == 0)
- return 1;
-
- for(i=0;i<24 && name[i];i++){
- if( !(name[i]&0xe0) || name[i]==0x7f)
- return 1;
- }
-
- pet_stop_walking(sd->pd,1);
- memcpy(sd->pet.name,name,24);
- memcpy(sd->pd->name,name,24);
- clif_clearchar_area(&sd->pd->bl,0);
- clif_spawnpet(sd->pd);
- clif_send_petdata(sd,0,0);
- clif_send_petdata(sd,5,0x14);
- sd->pet.rename_flag = 1;
- clif_pet_equip(sd->pd,sd->pet.equip);
- clif_send_petstatus(sd);
-
- return 0;
-}
-
-int pet_equipitem(struct map_session_data *sd,int index)
-{
- int nameid;
-
- nullpo_retr(1, sd);
-
- nameid = sd->status.inventory[index].nameid;
- if(sd->petDB == NULL)
- return 1;
- if(sd->petDB->AcceID == 0 || nameid != sd->petDB->AcceID || sd->pet.equip != 0) {
- clif_equipitemack(sd,0,0,0);
- return 1;
- }
- else {
- pc_delitem(sd,index,1,0);
- sd->pet.equip = sd->pd->equip = nameid;
- pc_calcstatus(sd,0);
- clif_pet_equip(sd->pd,nameid);
- }
-
- return 0;
-}
-
-int pet_unequipitem(struct map_session_data *sd)
-{
- struct item tmp_item;
- int nameid,flag;
-
- nullpo_retr(1, sd);
-
- if(sd->petDB == NULL)
- return 1;
- if(sd->pet.equip == 0)
- return 1;
-
- nameid = sd->pet.equip;
- sd->pet.equip = sd->pd->equip = 0;
- pc_calcstatus(sd,0);
- clif_pet_equip(sd->pd,0);
- memset(&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);
- }
-
- return 0;
-}
-
-int pet_food(struct map_session_data *sd)
-{
- int i,k,t;
-
- nullpo_retr(1, sd);
-
- if(sd->petDB == NULL)
- return 1;
- i=pc_search_inventory(sd,sd->petDB->FoodID);
- if(i < 0) {
- clif_pet_food(sd,sd->petDB->FoodID,0);
- return 1;
- }
- pc_delitem(sd,i,1,0);
- t = sd->pet.intimate;
- if(sd->pet.hungry > 90)
- sd->pet.intimate -= sd->petDB->r_full;
- else if(sd->pet.hungry > 75) {
- if(battle_config.pet_friendly_rate != 100)
- k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
- else
- k = sd->petDB->r_hungry;
- k = k >> 1;
- if(k <= 0)
- k = 1;
- sd->pet.intimate += k;
- }
- else {
- if(battle_config.pet_friendly_rate != 100)
- k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
- else
- k = sd->petDB->r_hungry;
- sd->pet.intimate += k;
- }
- if(sd->pet.intimate <= 0) {
- sd->pet.intimate = 0;
- if(battle_config.pet_status_support && t > 0) {
- if(sd->bl.prev != NULL)
- pc_calcstatus(sd,0);
- else
- pc_calcstatus(sd,2);
- }
- }
- else if(sd->pet.intimate > 1000)
- sd->pet.intimate = 1000;
- sd->pet.hungry += sd->petDB->fullness;
- if(sd->pet.hungry > 100)
- sd->pet.hungry = 100;
-
- clif_send_petdata(sd,2,sd->pet.hungry);
- clif_send_petdata(sd,1,sd->pet.intimate);
- clif_pet_food(sd,sd->petDB->FoodID,1);
-
- return 0;
-}
-
-static int pet_randomwalk(struct pet_data *pd,int tick)
-{
- const int retrycount=20;
- int speed;
-
- nullpo_retr(0, pd);
-
- speed = battle_get_speed(&pd->bl);
-
- if(DIFF_TICK(pd->next_walktime,tick) < 0){
- 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((c=map_getcell(pd->bl.m,x,y))!=1 && c!=5 && pet_walktoxy(pd,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)
- printf("PET cant move. hold position %d, class = %d\n",pd->bl.id,pd->class);
- pd->move_fail_count=0;
- pet_changestate(pd,MS_DELAY,60000);
- return 0;
- }
- }
- }
- for(i=c=0;i<pd->walkpath.path_len;i++){
- if(pd->walkpath.path[i]&1)
- c+=speed*14/10;
- else
- c+=speed;
- }
- pd->next_walktime = tick+rand()%3000+3000+c;
-
- return 1;
- }
- return 0;
-}
-
-static int pet_unlocktarget(struct pet_data *pd)
-{
- nullpo_retr(0, pd);
-
- pd->target_id=0;
-
- return 0;
-}
-
-static int pet_ai_sub_hard(struct pet_data *pd,unsigned int tick)
-{
- struct map_session_data *sd = pd->msd;
- struct mob_data *md = NULL;
- int dist,i=0,dx,dy,ret;
- int mode,race;
-
- nullpo_retr(0, pd);
-
- sd = pd->msd;
-
- 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->state.state == MS_DELAY || pd->bl.m != sd->bl.m)
- return 0;
- // ƒyƒbƒg‚É‚æ‚郋[ƒg
- if(!pd->target_id && pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax && pd->loot==1 && DIFF_TICK(gettick(),pd->lootitem_timer)>0)
- map_foreachinarea(pet_ai_sub_hard_lootsearch,pd->bl.m,
- pd->bl.x-AREA_SIZE*2,pd->bl.y-AREA_SIZE*2,
- pd->bl.x+AREA_SIZE*2,pd->bl.y+AREA_SIZE*2,
- BL_ITEM,pd,&i);
-
- if(sd->pet.intimate > 0) {
- dist = distance(sd->bl.x,sd->bl.y,pd->bl.x,pd->bl.y);
- if(dist > 12) {
- if(pd->target_id > 0)
- pet_unlocktarget(pd);
- if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3)
- return 0;
- pd->speed = (sd->speed>>1);
- if(pd->speed <= 0)
- pd->speed = 1;
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- if(pet_walktoxy(pd,pd->to_x,pd->to_y))
- pet_randomwalk(pd,tick);
- }
- else if(pd->target_id - MAX_FLOORITEM > 0) {
- mode=mob_db[pd->class].mode;
- race=mob_db[pd->class].race;
- md=(struct mob_data *)map_id2bl(pd->target_id);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
- pet_unlocktarget(pd);
- else if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
- pet_unlocktarget(pd);
- else if(!battle_check_range(&pd->bl,&md->bl,mob_db[pd->class].range)){
- if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,md->bl.x,md->bl.y) < 2)
- return 0;
- if( !pet_can_reach(pd,md->bl.x,md->bl.y))
- pet_unlocktarget(pd);
- else {
- i=0;
- pd->speed = battle_get_speed(&pd->bl);
- do {
- if(i==0) { // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
- dx=md->bl.x - pd->bl.x;
- dy=md->bl.y - pd->bl.y;
- if(dx<0) dx++;
- else if(dx>0) dx--;
- if(dy<0) dy++;
- else if(dy>0) dy--;
- }
- else { // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
- dx=md->bl.x - pd->bl.x + rand()%3 - 1;
- dy=md->bl.y - pd->bl.y + rand()%3 - 1;
- }
- ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- i++;
- } while(ret && i<5);
-
- if(ret) { // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
- if(dx<0) dx=2;
- else if(dx>0) dx=-2;
- if(dy<0) dy=2;
- else if(dy>0) dy=-2;
- pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- }
- }
- }
- else {
- if(pd->state.state==MS_WALK)
- pet_stop_walking(pd,1);
- if(pd->state.state==MS_ATTACK)
- return 0;
- pet_changestate(pd,MS_ATTACK,0);
- }
- }
- else if(pd->target_id > 0){ // ƒ‹[ƒgˆ—
- struct block_list *bl_item;
- struct flooritem_data *fitem;
-
- bl_item = map_id2bl(pd->target_id);
- if(bl_item == NULL || bl_item->type != BL_ITEM ||bl_item->m != pd->bl.m ||
- (dist=distance(pd->bl.x,pd->bl.y,bl_item->x,bl_item->y))>=5){
- // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
- pet_unlocktarget(pd);
- }
- else if(dist){
- if(pd->timer != -1 && pd->state.state!=MS_ATTACK && (DIFF_TICK(pd->next_walktime,tick)<0 || distance(pd->to_x,pd->to_y,bl_item->x,bl_item->y) <= 0))
- return 0; // Šù‚Ɉړ®’†
-
- pd->next_walktime=tick+500;
- dx=bl_item->x - pd->bl.x;
- dy=bl_item->y - pd->bl.y;
-
- ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
- }
- else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
- fitem = (struct flooritem_data *)bl_item;
- if(pd->state.state==MS_ATTACK)
- return 0; // UŒ‚’†
- if(pd->state.state==MS_WALK){ // •às’†‚È‚ç’âŽ~
- pet_stop_walking(pd,1);
- }
- if(pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax){
- memcpy(&pd->lootitem[pd->lootitem_count++],&fitem->item_data,sizeof(pd->lootitem[0]));
- pd->lootitem_weight += itemdb_search(fitem->item_data.nameid)->weight*fitem->item_data.amount;
- }
- else if(pd->lootitem_count >= PETLOOT_SIZE || pd->lootitem_count >=pd->lootmax) {
- pet_unlocktarget(pd);
- return 0;
- }
- else {
- if(pd->lootitem[0].card[0] == (short)0xff00)
- intif_delete_petdata(*((long *)(&pd->lootitem[0].card[1])));
- for(i=0;i<PETLOOT_SIZE-1;i++)
- memcpy(&pd->lootitem[i],&pd->lootitem[i+1],sizeof(pd->lootitem[0]));
- memcpy(&pd->lootitem[PETLOOT_SIZE-1],&fitem->item_data,sizeof(pd->lootitem[0]));
- }
- map_clearflooritem(bl_item->id);
- pet_unlocktarget(pd);
- }
- }
- else {
- if(dist <= 3 || (pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3) )
- return 0;
- pd->speed = battle_get_speed(&pd->bl);
- pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
- if(pet_walktoxy(pd,pd->to_x,pd->to_y))
- pet_randomwalk(pd,tick);
- }
- }
- else {
- pd->speed = battle_get_speed(&pd->bl);
- if(pd->state.state == MS_ATTACK)
- pet_stopattack(pd);
- pet_randomwalk(pd,tick);
- }
-
- return 0;
-}
-
-static int pet_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
-{
- unsigned int tick;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, ap);
-
- tick=va_arg(ap,unsigned int);
- if(sd->status.pet_id && sd->pd && sd->petDB)
- pet_ai_sub_hard(sd->pd,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;
-}
-
-int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
-{
- struct pet_data* pd;
- int dist,*itc;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, pd=va_arg(ap,struct pet_data *));
- nullpo_retr(0, itc=va_arg(ap,int *));
-
- if(!pd->target_id){
- struct flooritem_data *fitem = (struct flooritem_data *)bl;
- struct map_session_data *sd = NULL;
- // ƒ‹[ƒgŒ –³‚µ
- if(fitem && fitem->first_get_id>0)
- sd = map_id2sd(fitem->first_get_id);
- // Removed [Valaris]
- //if((pd->lootitem_weight + (itemdb_search(fitem->item_data.))->weight * fitem->item_data.amount) > battle_config.pet_weight)
- // return 0;
-
- if(!pd->lootitem || (pd->lootitem_count >= PETLOOT_SIZE) || (pd->lootitem_count >= pd->lootmax) || (sd && sd->pd != pd))
- return 0;
- if(bl->m == pd->bl.m && (dist=distance(pd->bl.x,pd->bl.y,bl->x,bl->y))<5){
- if( pet_can_reach(pd,bl->x,bl->y) // “ž’B‰Â”\«”»’è
- && rand()%1000<1000/(++(*itc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
- pd->target_id=bl->id;
- }
- }
- }
- return 0;
-}
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
-{
- int i,flag=0;
-
- if(pd){
- if(pd->lootitem) {
- for(i=0;i<pd->lootitem_count;i++) {
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
- memcpy(&ditem->item_data,&pd->lootitem[i],sizeof(pd->lootitem[0]));
- ditem->m = pd->bl.m;
- ditem->x = pd->bl.x;
- ditem->y = pd->bl.y;
- ditem->first_sd = 0;
- ditem->second_sd = 0;
- ditem->third_sd = 0;
- // —Ž‚Æ‚³‚È‚¢‚Å’¼ÚPC‚ÌItem—“‚Ö
- if(sd){
- if((flag = pc_additem(sd,&ditem->item_data,ditem->item_data.amount))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
- }
- free(ditem);
- }
- else
- add_timer(gettick()+540+i,pet_delay_item_drop2,(int)ditem,0);
- }
- pd->lootitem=NULL;
- pd->lootitem=(struct item *)aCalloc(PETLOOT_SIZE,sizeof(struct item));
- pd->lootitem_count = 0;
- pd->lootitem_weight = 0;
- pd->lootitem_timer = gettick()+10000; // 10*1000ms‚ÌŠÔE‚í‚È‚¢
- }
- }
- return 1;
-}
-
-int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data)
-{
- struct delay_item_drop2 *ditem;
-
- ditem=(struct delay_item_drop2 *)id;
-
- map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
-
- free(ditem);
- return 0;
-}
-
-/*==========================================
- * pet bonus giving skills [Valaris]
- *------------------------------------------
- */
-
-int pet_skill_bonus(struct map_session_data *sd,struct pet_data *pd,int type,int val,int duration,int timer,int data)
-{
- if(pd==NULL || sd==NULL)
- return 1;
-
- pd->skillbonustype=type;
- pd->skillbonusval=val;
- pd->skillduration=duration;
- pd->skilltimer=timer;
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_skill_bonus_timer,sd->bl.id,0);
-
- return 0;
-
-}
-
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- pd->skillbonustimer=-1;
-
- pc_bonus(sd,pd->skillbonustype,pd->skillbonusval);
- if(pd->skillbonustype < 56) clif_updatestatus(sd,pd->skillbonustype);
- pd->skillbonusduration=add_timer(gettick()+pd->skillduration*1000,pet_skill_bonus_duration,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_skill_bonus_duration(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonusduration != tid)
- return 0;
-
- pd->skillbonusduration=-1;
-
- pc_bonus(sd,pd->skillbonustype,-pd->skillbonusval);
- if(pd->skillbonustype < 56) clif_updatestatus(sd,pd->skillbonustype);
-
- pet_skill_bonus(sd,pd,pd->skillbonustype,pd->skillbonusval,pd->skillduration,pd->skilltimer,0);
-
- return 0;
-}
-
-int pet_recovery_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->sc_data[pd->skilltype].timer != -1)
- skill_status_change_end(&sd->bl,pd->skilltype,-1);
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_heal_timer(int tid,unsigned int tick,int id,int data)
-{
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->status.hp < sd->status.max_hp * pd->skilltype/100) {
- clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->skillval,1);
- pc_heal(sd,pd->skillval,0);
- }
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_mag_timer(int tid,unsigned int tick,int id,int data)
-{
- struct pet_data *pd;
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- if(sd->status.hp < sd->status.max_hp * pd->skilltype/100 && sd->status.sp < sd->status.max_sp * pd->skillduration/100) {
- clif_skill_nodamage(&pd->bl,&sd->bl,PR_MAGNIFICAT,pd->skillval,1);
- skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],pd->skillval,0,0,0,skill_get_time(PR_MAGNIFICAT,pd->skillval),0 );
- }
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
-
- return 0;
-}
-
-int pet_skillattack_timer(int tid,unsigned int tick,int id,int data)
-{
- struct mob_data *md;
- struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
- struct pet_data *pd;
-
- if(sd==NULL || sd->bl.type!=BL_PC)
- return 1;
-
- pd=sd->pd;
-
- if(pd==NULL || pd->bl.type!=BL_PET)
- return 1;
-
- if(pd->skillbonustimer != tid)
- return 0;
-
- md=(struct mob_data *)map_id2bl(sd->attacktarget);
- if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
- distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 6) {
- pd->target_id=0;
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,pd->skillduration);
- return 0;
- }
-
- if(md && rand()%100 < sd->pet.intimate*pd->skilltimer/100 ) {
- if(pd->skilltype==6 || pd->skilltype==176) {
- skill_castend_nodamage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
- }
-
- else if(pd->skilltype==110){
- skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval,tick,0);
- }
-
- else if(pd->skilltype==91) {
- skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval+rand()%100,tick,0);
- }
- else
- skill_castend_damage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
- pd->skillbonustimer=add_timer(gettick()+1000,pet_skillattack_timer,sd->bl.id,0);
- return 0;
- }
-
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- *ƒyƒbƒgƒf[ƒ^“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-int read_petdb()
-{
- FILE *fp;
- char line[1024];
- int i;
- int j=0;
- char *filename[]={"db/pet_db.txt","db/pet_db2.txt"};
-
- memset(pet_db,0,sizeof(pet_db));
- for(i=0;i<2;i++){
- fp=fopen(filename[i],"r");
- if(fp==NULL){
- if(i>0)
- continue;
- printf("can't read %s\n",filename[i]);
- return -1;
- }
- while(fgets(line,1020,fp)){
- int nameid,i;
- char *str[32],*p,*np;
-
- if(line[0] == '/' && line[1] == '/')
- continue;
-
- for(i=0,p=line;i<20;i++){
- if((np=strchr(p,','))!=NULL){
- str[i]=p;
- *np=0;
- p=np+1;
- } else {
- str[i]=p;
- p+=strlen(p);
- }
- }
-
- nameid=atoi(str[0]);
- if(nameid<=0 || nameid>2000)
- continue;
-
- //MobID,Name,JName,ItemID,EggID,AcceID,FoodID,"Fullness (1‰ñ‚̉a‚Å‚Ì–ž• “x‘‰Á—¦%)","HungryDeray (/min)","R_Hungry (‹ó• Žž‰a‚â‚èe–§“x‘‰Á—¦%)","R_Full (‚Æ‚Ä‚à–ž• Žž‰a‚â‚èe–§“xŒ¸­—¦%)","Intimate (•ßŠlŽže–§“x%)","Die (Ž€–SŽže–§“xŒ¸­—¦%)","Capture (•ßŠl—¦%)",(Name)
- pet_db[j].class = nameid;
- memcpy(pet_db[j].name,str[1],24);
- memcpy(pet_db[j].jname,str[2],24);
- 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(np,0);
- j++;
- }
- fclose(fp);
- printf("read %s done (count=%d)\n",filename[i],j);
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
- *------------------------------------------
- */
-int do_init_pet(void)
-{
- read_petdb();
-
- add_timer_func_list(pet_timer,"pet_timer");
- 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_skill_bonus_duration,"pet_skill_bonus_duration"); // [Valaris]
- add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
- add_timer_func_list(pet_mag_timer,"pet_mag_timer"); // [Valaris]
- add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
- add_timer_func_list(pet_skillattack_timer,"pet_skillattack_timer"); // [Valaris]
- add_timer_interval(gettick()+MIN_PETTHINKTIME,pet_ai_hard,0,0,MIN_PETTHINKTIME);
-
- return 0;
-}
-
+// $Id: pet.c,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "db.h"
+#include "timer.h"
+#include "socket.h"
+#include "nullpo.h"
+#include "malloc.h"
+#include "pc.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"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define MIN_PETTHINKTIME 100
+
+struct pet_db pet_db[MAX_PET_DB];
+
+static int dirx[8]={0,-1,-1,-1,0,1,1,1};
+static int diry[8]={1,1,0,-1,-1,-1,0,1};
+
+static int pet_timer(int tid,unsigned int tick,int id,int data);
+static int pet_walktoxy_sub(struct pet_data *pd);
+
+static int distance(int x0,int y0,int x1,int y1)
+{
+ int dx,dy;
+
+ dx=abs(x0-x1);
+ dy=abs(y0-y1);
+ return dx>dy ? dx : dy;
+}
+
+static int calc_next_walk_step(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+
+ if(pd->walkpath.path_pos>=pd->walkpath.path_len)
+ return -1;
+ if(pd->walkpath.path[pd->walkpath.path_pos]&1)
+ return pd->speed*14/10;
+ return pd->speed;
+}
+
+static int pet_performance_val(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->pet.intimate > 900)
+ return (sd->petDB->s_perfor > 0)? 4:3;
+ else if(sd->pet.intimate > 750)
+ return 2;
+ else
+ return 1;
+}
+
+int pet_hungry_val(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->pet.hungry > 90)
+ return 4;
+ else if(sd->pet.hungry > 75)
+ return 3;
+ else if(sd->pet.hungry > 25)
+ return 2;
+ else if(sd->pet.hungry > 10)
+ return 1;
+ else
+ return 0;
+}
+
+static int pet_can_reach(struct pet_data *pd,int x,int y)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, pd);
+
+ if( pd->bl.x==x && pd->bl.y==y ) // “¯‚¶ƒ}ƒX
+ return 1;
+
+ // áŠQ•¨”»’è
+ wpd.path_len=0;
+ wpd.path_pos=0;
+ wpd.path_half=0;
+ return (path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0)!=-1)?1:0;
+}
+
+static int pet_calc_pos(struct pet_data *pd,int tx,int ty,int dir)
+{
+ int x,y,dx,dy;
+ int i,j=0,k;
+
+ nullpo_retr(0, pd);
+
+ pd->to_x = tx;
+ pd->to_y = ty;
+
+ if(dir >= 0 && dir < 8) {
+ dx = -dirx[dir]*2;
+ dy = -diry[dir]*2;
+ x = tx + dx;
+ y = ty + dy;
+ if(!(j=pet_can_reach(pd,x,y))) {
+ if(dx > 0) x--;
+ else if(dx < 0) x++;
+ if(dy > 0) y--;
+ else if(dy < 0) y++;
+ if(!(j=pet_can_reach(pd,x,y))) {
+ for(i=0;i<12;i++) {
+ k = rand()%8;
+ dx = -dirx[k]*2;
+ dy = -diry[k]*2;
+ x = tx + dx;
+ y = ty + dy;
+ if((j=pet_can_reach(pd,x,y)))
+ break;
+ else {
+ if(dx > 0) x--;
+ else if(dx < 0) x++;
+ if(dy > 0) y--;
+ else if(dy < 0) y++;
+ if((j=pet_can_reach(pd,x,y)))
+ break;
+ }
+ }
+ if(!j) {
+ x = tx;
+ y = ty;
+ if(!pet_can_reach(pd,x,y))
+ return 1;
+ }
+ }
+ }
+ }
+ else
+ return 1;
+
+ pd->to_x = x;
+ pd->to_y = y;
+ return 0;
+}
+
+static int pet_attack(struct pet_data *pd,unsigned int tick,int data)
+{
+ struct mob_data *md;
+ int mode,race,range;
+
+ nullpo_retr(0, pd);
+
+ pd->state.state=MS_IDLE;
+
+ md=(struct mob_data *)map_id2bl(pd->target_id);
+ if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
+ distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13) {
+ pd->target_id=0;
+ return 0;
+ }
+
+ mode=mob_db[pd->class].mode;
+ race=mob_db[pd->class].race;
+ if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race != 4 && race != 6) ) {
+ pd->target_id=0;
+ return 0;
+ }
+
+ range = mob_db[pd->class].range + 1;
+ if(distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > range)
+ return 0;
+ if(battle_config.monster_attack_direction_change)
+ pd->dir=map_calc_dir(&pd->bl, md->bl.x,md->bl.y );
+
+ clif_fixpetpos(pd);
+
+ pd->target_lv = battle_weapon_attack(&pd->bl,&md->bl,tick,0);
+
+ pd->attackabletime = tick + battle_get_adelay(&pd->bl);
+
+ pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
+ pd->state.state=MS_ATTACK;
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int pet_walk(struct pet_data *pd,unsigned int tick,int data)
+{
+ int moveblock;
+ int i,ctype;
+ int x,y,dx,dy;
+
+ nullpo_retr(0, pd);
+
+ pd->state.state=MS_IDLE;
+ if(pd->walkpath.path_pos >= pd->walkpath.path_len || pd->walkpath.path_pos != data)
+ return 0;
+
+ pd->walkpath.path_half ^= 1;
+ if(pd->walkpath.path_half==0){
+ pd->walkpath.path_pos++;
+ if(pd->state.change_walk_target){
+ pet_walktoxy_sub(pd);
+ return 0;
+ }
+ }
+ else {
+ if(pd->walkpath.path[pd->walkpath.path_pos] >= 8)
+ return 1;
+
+ x = pd->bl.x;
+ y = pd->bl.y;
+/* ctype = map_getcell(pd->bl.m,x,y);
+ if(ctype == 1 || ctype == 5) {
+ pet_stop_walking(pd,1);
+ return 0;
+ }*/
+ pd->dir=pd->walkpath.path[pd->walkpath.path_pos];
+ dx = dirx[pd->dir];
+ dy = diry[pd->dir];
+
+ ctype = map_getcell(pd->bl.m,x+dx,y+dy);
+ if(ctype == 1 || ctype == 5) {
+ pet_walktoxy_sub(pd);
+ return 0;
+ }
+
+ moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE);
+
+ pd->state.state=MS_WALK;
+ map_foreachinmovearea(clif_petoutsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
+
+ x += dx;
+ y += dy;
+
+ if(moveblock) map_delblock(&pd->bl);
+ pd->bl.x = x;
+ pd->bl.y = y;
+ if(moveblock) map_addblock(&pd->bl);
+
+ map_foreachinmovearea(clif_petinsight,pd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,pd);
+ pd->state.state=MS_IDLE;
+ }
+ if((i=calc_next_walk_step(pd))>0){
+ i = i>>1;
+ if(i < 1 && pd->walkpath.path_half == 0)
+ i = 1;
+ pd->timer=add_timer(tick+i,pet_timer,pd->bl.id,pd->walkpath.path_pos);
+ pd->state.state=MS_WALK;
+
+ if(pd->walkpath.path_pos >= pd->walkpath.path_len)
+ clif_fixpetpos(pd);
+ }
+ return 0;
+}
+
+int pet_stopattack(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+
+ pd->target_id=0;
+ if(pd->state.state == MS_ATTACK)
+ pet_changestate(pd,MS_IDLE,0);
+
+ return 0;
+}
+
+int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type)
+{
+ struct pet_data *pd;
+ struct mob_data *md;
+ int rate,mode,race;
+
+ nullpo_retr(0, sd);
+
+ pd = sd->pd;
+
+ if(bl && pd && bl->type == BL_MOB && sd->pet.intimate > 900 && sd->pet.hungry > 0 && pd->class != battle_get_class(bl)
+ && pd->state.state != MS_DELAY) {
+ mode=mob_db[pd->class].mode;
+ race=mob_db[pd->class].race;
+ md=(struct mob_data *)bl;
+ if(md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
+ distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
+ return 0;
+ if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
+ return 0;
+ if(!type) {
+ rate = sd->petDB->attack_rate;
+ rate = rate * (150 - (sd->pet.intimate - 1000))/100;
+ if(battle_config.pet_support_rate != 100)
+ rate = rate*battle_config.pet_support_rate/100;
+ if(sd->petDB->attack_rate > 0 && rate <= 0)
+ rate = 1;
+ }
+ else {
+ rate = sd->petDB->defence_attack_rate;
+ rate = rate * (150 - (sd->pet.intimate - 1000))/100;
+ if(battle_config.pet_support_rate != 100)
+ rate = rate*battle_config.pet_support_rate/100;
+ if(sd->petDB->defence_attack_rate > 0 && rate <= 0)
+ rate = 1;
+ }
+ if(rand()%10000 < rate) {
+ if(pd->target_id == 0 || rand()%10000 < sd->petDB->change_target_rate)
+ pd->target_id = bl->id;
+ }
+ }
+ return 0;
+}
+
+int pet_changestate(struct pet_data *pd,int state,int type)
+{
+ unsigned int tick;
+ int i;
+
+ nullpo_retr(0, pd);
+
+ if(pd->timer != -1)
+ delete_timer(pd->timer,pet_timer);
+ pd->timer=-1;
+ pd->state.state=state;
+
+ switch(state) {
+ case MS_WALK:
+ if((i=calc_next_walk_step(pd)) > 0){
+ i = i>>2;
+ pd->timer=add_timer(gettick()+i,pet_timer,pd->bl.id,0);
+ } else
+ pd->state.state=MS_IDLE;
+ break;
+ case MS_ATTACK:
+ tick = gettick();
+ i=DIFF_TICK(pd->attackabletime,tick);
+ if(i>0 && i<2000)
+ pd->timer=add_timer(pd->attackabletime,pet_timer,pd->bl.id,0);
+ else
+ pd->timer=add_timer(tick+1,pet_timer,pd->bl.id,0);
+ break;
+ case MS_DELAY:
+ pd->timer=add_timer(gettick()+type,pet_timer,pd->bl.id,0);
+ break;
+ }
+
+ return 0;
+}
+
+static int pet_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct pet_data *pd;
+
+ pd=(struct pet_data*)map_id2bl(id);
+ if(pd == NULL || pd->bl.type != BL_PET)
+ return 1;
+
+ if(pd->timer != tid){
+ if(battle_config.error_log)
+ printf("pet_timer %d != %d\n",pd->timer,tid);
+ return 0;
+ }
+ pd->timer=-1;
+
+ if(pd->bl.prev == NULL)
+ return 1;
+
+ switch(pd->state.state){
+ case MS_WALK:
+ pet_walk(pd,tick,data);
+ break;
+ case MS_ATTACK:
+ pet_attack(pd,tick,data);
+ break;
+ case MS_DELAY:
+ pet_changestate(pd,MS_IDLE,0);
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("pet_timer : %d ?\n",pd->state.state);
+ break;
+ }
+
+ return 0;
+}
+
+static int pet_walktoxy_sub(struct pet_data *pd)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, pd);
+
+ if(path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,pd->to_x,pd->to_y,0))
+ return 1;
+ memcpy(&pd->walkpath,&wpd,sizeof(wpd));
+
+ pd->state.change_walk_target=0;
+ pet_changestate(pd,MS_WALK,0);
+ clif_movepet(pd);
+// if(battle_config.etc_log)
+// printf("walkstart\n");
+
+ return 0;
+}
+
+int pet_walktoxy(struct pet_data *pd,int x,int y)
+{
+ struct walkpath_data wpd;
+
+ nullpo_retr(0, pd);
+
+ if(pd->state.state == MS_WALK && path_search(&wpd,pd->bl.m,pd->bl.x,pd->bl.y,x,y,0))
+ return 1;
+
+ pd->to_x=x;
+ pd->to_y=y;
+
+ if(pd->state.state == MS_WALK) {
+ pd->state.change_walk_target=1;
+ } else {
+ return pet_walktoxy_sub(pd);
+ }
+
+ return 0;
+}
+
+int pet_stop_walking(struct pet_data *pd,int type)
+{
+ nullpo_retr(0, pd);
+
+ if(pd->state.state == MS_WALK || pd->state.state == MS_IDLE) {
+ pd->walkpath.path_len=0;
+ pd->to_x=pd->bl.x;
+ pd->to_y=pd->bl.y;
+ }
+ if(type&0x01)
+ clif_fixpetpos(pd);
+ if(type&~0xff)
+ pet_changestate(pd,MS_DELAY,type>>8);
+ else
+ pet_changestate(pd,MS_IDLE,0);
+
+ return 0;
+}
+
+static int pet_hungry(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd;
+ int interval,t;
+
+ sd=map_id2sd(id);
+ if(sd==NULL)
+ return 1;
+
+ if(sd->pet_hungry_timer != tid){
+ if(battle_config.error_log)
+ printf("pet_hungry_timer %d != %d\n",sd->pet_hungry_timer,tid);
+ return 0;
+ }
+ sd->pet_hungry_timer = -1;
+ if(!sd->status.pet_id || !sd->pd || !sd->petDB)
+ return 1;
+
+ sd->pet.hungry--;
+ t = sd->pet.intimate;
+ if(sd->pet.hungry < 0) {
+ if(sd->pd->target_id > 0)
+ pet_stopattack(sd->pd);
+ sd->pet.hungry = 0;
+ sd->pet.intimate -= battle_config.pet_hungry_friendly_decrease;
+ if(sd->pet.intimate <= 0) {
+ sd->pet.intimate = 0;
+ if(battle_config.pet_status_support && t > 0) {
+ if(sd->bl.prev != NULL)
+ pc_calcstatus(sd,0);
+ else
+ pc_calcstatus(sd,2);
+ }
+ }
+ clif_send_petdata(sd,1,sd->pet.intimate);
+ }
+ clif_send_petdata(sd,2,sd->pet.hungry);
+
+ if(battle_config.pet_hungry_delay_rate != 100)
+ interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
+ else
+ interval = sd->petDB->hungry_delay;
+ if(interval <= 0)
+ interval = 1;
+ sd->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 map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->pet_hungry_timer != -1) {
+ delete_timer(sd->pet_hungry_timer,pet_hungry);
+ sd->pet_hungry_timer = -1;
+ }
+
+ return 0;
+}
+
+int pet_remove_map(struct map_session_data *sd)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.pet_id && sd->pd) {
+
+ struct pet_data *pd=sd->pd; // [Valaris]
+ if(pd->skillbonustimer!=-1) pd->skillbonustimer=-1;
+ if(pd->skillbonusduration!=-1) pd->skillbonusduration=-1;
+ if(pd->skilltype !=-1) pd->skilltype=-1;
+ if(pd->skillval !=-1) pd->skillval=-1;
+ if(pd->skilltimer!=-1) pd->skilltimer=-1;
+ if(pd->skillduration!=-1) pd->skillduration=-1;
+ if(pd->skillbonustype!=-1) pd->skillbonustype=-1;
+ if(pd->skillbonusval!=-1) pd->skillbonusval=-1;
+ if(sd->perfect_hiding==1) sd->perfect_hiding=0; // end additions
+
+ pet_changestate(sd->pd,MS_IDLE,0);
+ if(sd->pet_hungry_timer != -1)
+ pet_hungry_timer_delete(sd);
+ clif_clearchar_area(&sd->pd->bl,0);
+ map_delblock(&sd->pd->bl);
+ map_deliddb(&sd->pd->bl);
+ map_freeblock(sd->pd);
+ }
+ return 0;
+}
+struct delay_item_drop {
+ int m,x,y;
+ int nameid,amount;
+ struct map_session_data *first_sd,*second_sd,*third_sd;
+};
+
+struct delay_item_drop2 {
+ int m,x,y;
+ struct item item_data;
+ struct map_session_data *first_sd,*second_sd,*third_sd;
+};
+
+int pet_performance(struct map_session_data *sd)
+{
+ struct pet_data *pd;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, pd=sd->pd);
+
+ pet_stop_walking(pd,2000<<8);
+ clif_pet_performance(&pd->bl,rand()%pet_performance_val(sd) + 1);
+ // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
+ pet_lootitem_drop(pd,NULL);
+
+ return 0;
+}
+
+int pet_return_egg(struct map_session_data *sd)
+{
+ struct item tmp_item;
+ int flag;
+
+ nullpo_retr(0, sd);
+
+ if(sd->status.pet_id && sd->pd) {
+ struct pet_data *pd=sd->pd;
+ pet_remove_map(sd);
+ sd->status.pet_id = 0;
+ sd->pd = NULL;
+
+ if(sd->petDB == NULL)
+ return 1;
+ sd->pet.incuvate = 1;
+ memset(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = sd->petDB->EggID;
+ tmp_item.identify = 1;
+ tmp_item.card[0] = 0xff00;
+ *((long *)(&tmp_item.card[1])) = sd->pet.pet_id;
+ tmp_item.card[3] = sd->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);
+ }
+ if(battle_config.pet_status_support && sd->pet.intimate > 0) {
+ if(sd->bl.prev != NULL)
+ pc_calcstatus(sd,0);
+ else
+ pc_calcstatus(sd,2);
+ }
+ // ƒ‹[ƒg‚µ‚½Item‚ð—Ž‚Æ‚³‚¹‚é
+ pet_lootitem_drop(pd,sd);
+
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_save(sd);
+
+ sd->petDB = NULL;
+ }
+
+ return 0;
+}
+
+int pet_data_init(struct map_session_data *sd)
+{
+ struct pet_data *pd;
+ int i=0,interval=0;
+
+ nullpo_retr(1, sd);
+
+ if(sd->status.account_id != sd->pet.account_id || sd->status.char_id != sd->pet.char_id ||
+ sd->status.pet_id != sd->pet.pet_id) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+
+ i = search_petDB_index(sd->pet.class,PET_CLASS);
+ if(i < 0) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+ sd->petDB = &pet_db[i];
+ sd->pd = pd = (struct pet_data *)aCalloc(1,sizeof(struct pet_data));
+
+ pd->bl.m = sd->bl.m;
+ pd->bl.prev = pd->bl.next = NULL;
+ pd->bl.x = pd->to_x = sd->bl.x;
+ pd->bl.y = pd->to_y = sd->bl.y;
+ pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
+ pd->bl.x = pd->to_x;
+ pd->bl.y = pd->to_y;
+ pd->bl.id = npc_get_new_npc_id();
+ memcpy(pd->name,sd->pet.name,24);
+ pd->class = sd->pet.class;
+ pd->equip = sd->pet.equip;
+ pd->dir = sd->dir;
+ pd->speed = sd->petDB->speed;
+ pd->bl.subtype = MONS;
+ pd->bl.type = BL_PET;
+ memset(&pd->state,0,sizeof(pd->state));
+ pd->state.state = MS_IDLE;
+ pd->state.change_walk_target = 0;
+ pd->timer = -1;
+ pd->target_id = 0;
+ pd->move_fail_count = 0;
+ pd->next_walktime = pd->attackabletime = pd->last_thinktime = gettick();
+ pd->msd = sd;
+
+ map_addiddb(&pd->bl);
+
+ if(sd->pet_hungry_timer != -1)
+ pet_hungry_timer_delete(sd);
+ if(battle_config.pet_hungry_delay_rate != 100)
+ interval = (sd->petDB->hungry_delay*battle_config.pet_hungry_delay_rate)/100;
+ else
+ interval = sd->petDB->hungry_delay;
+ if(interval <= 0)
+ interval = 1;
+ sd->pet_hungry_timer = add_timer(gettick()+interval,pet_hungry,sd->bl.id,0);
+ pd->lootitem=(struct item *)aCalloc(PETLOOT_SIZE,sizeof(struct item));
+ pd->lootitem_count = 0;
+ pd->lootitem_weight = 0;
+ pd->lootitem_timer = gettick();
+ return 0;
+}
+
+int pet_birth_process(struct map_session_data *sd)
+{
+ nullpo_retr(1, sd);
+
+ if(sd->status.pet_id && sd->pet.incuvate == 1) {
+ sd->status.pet_id = 0;
+ return 1;
+ }
+
+ sd->pet.incuvate = 0;
+ sd->pet.account_id = sd->status.account_id;
+ sd->pet.char_id = sd->status.char_id;
+ sd->status.pet_id = sd->pet.pet_id;
+ if(pet_data_init(sd)) {
+ sd->status.pet_id = 0;
+ sd->pet.incuvate = 1;
+ sd->pet.account_id = 0;
+ sd->pet.char_id = 0;
+ return 1;
+ }
+
+ intif_save_petdata(sd->status.account_id,&sd->pet);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_save(sd);
+ map_addblock(&sd->pd->bl);
+ clif_spawnpet(sd->pd);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,0x14);
+ clif_pet_equip(sd->pd,sd->pet.equip);
+ clif_send_petstatus(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;
+ }
+ memcpy(&sd->pet,p,sizeof(struct s_pet));
+ if(sd->pet.incuvate == 1)
+ pet_birth_process(sd);
+ else {
+ pet_data_init(sd);
+ if(sd->bl.prev != NULL) {
+ map_addblock(&sd->pd->bl);
+ clif_spawnpet(sd->pd);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,0x14);
+// clif_pet_equip(sd->pd,sd->pet.equip);
+ clif_send_petstatus(sd);
+ }
+ }
+ if(battle_config.pet_status_support && sd->pet.intimate > 0) {
+ if(sd->bl.prev != NULL)
+ pc_calcstatus(sd,0);
+ else
+ pc_calcstatus(sd,2);
+ }
+
+ return 0;
+}
+
+int pet_select_egg(struct map_session_data *sd,short egg_index)
+{
+ nullpo_retr(0, sd);
+
+ if(sd->status.inventory[egg_index].card[0] == (short)0xff00)
+ intif_request_petdata(sd->status.account_id,sd->status.char_id,*((long *)&sd->status.inventory[egg_index].card[1]));
+ else {
+ if(battle_config.error_log)
+ printf("wrong egg item inventory %d\n",egg_index);
+ }
+ pc_delitem(sd,egg_index,1,0);
+
+ 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){
+ clif_pet_rulet(sd,0);
+ return 1;
+ }
+
+ i = search_petDB_index(md->class,PET_CLASS);
+ if(md == NULL || md->bl.type != BL_MOB || md->bl.prev == NULL || i < 0 || sd->catch_target_class != md->class) {
+ clif_pet_rulet(sd,0);
+ return 1;
+ }
+
+ //target_id‚É‚æ‚é“G¨—‘”»’è
+// if(battle_config.etc_log)
+// printf("mob_id = %d, mob_class = %d\n",md->bl.id,md->class);
+ //¬Œ÷‚Ìê‡
+ pet_catch_rate = (pet_db[i].capture + (sd->status.base_level - mob_db[md->class].lv)*30 + sd->paramc[5]*20)*(200 - md->hp*100/mob_db[md->class].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) {
+ mob_catch_delete(md,0);
+ 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
+ clif_pet_rulet(sd,0);
+
+ return 0;
+}
+
+int pet_get_egg(int account_id,int pet_id,int flag)
+{
+ struct map_session_data *sd;
+ struct item tmp_item;
+ int i=0,ret=0;
+
+ if(!flag) {
+ sd = map_id2sd(account_id);
+ if(sd == NULL)
+ return 1;
+
+ i = search_petDB_index(sd->catch_target_class,PET_CLASS);
+ if(i >= 0) {
+ memset(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid = pet_db[i].EggID;
+ tmp_item.identify = 1;
+ tmp_item.card[0] = 0xff00;
+ *((long *)(&tmp_item.card[1])) = pet_id;
+ tmp_item.card[3] = sd->pet.rename_flag;
+ 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);
+ }
+ }
+ else
+ intif_delete_petdata(pet_id);
+ }
+
+ return 0;
+}
+
+int pet_menu(struct map_session_data *sd,int menunum)
+{
+ nullpo_retr(0, sd);
+
+ switch(menunum) {
+ case 0:
+ clif_send_petstatus(sd);
+ break;
+ case 1:
+ pet_food(sd);
+ break;
+ case 2:
+ pet_performance(sd);
+ break;
+ case 3:
+ pet_return_egg(sd);
+ break;
+ case 4:
+ pet_unequipitem(sd);
+ break;
+ }
+ return 0;
+}
+
+int pet_change_name(struct map_session_data *sd,char *name)
+{
+ int i;
+
+ nullpo_retr(1, sd);
+
+ if(sd->pet.rename_flag == 1 && battle_config.pet_rename == 0)
+ return 1;
+
+ for(i=0;i<24 && name[i];i++){
+ if( !(name[i]&0xe0) || name[i]==0x7f)
+ return 1;
+ }
+
+ pet_stop_walking(sd->pd,1);
+ memcpy(sd->pet.name,name,24);
+ memcpy(sd->pd->name,name,24);
+ clif_clearchar_area(&sd->pd->bl,0);
+ clif_spawnpet(sd->pd);
+ clif_send_petdata(sd,0,0);
+ clif_send_petdata(sd,5,0x14);
+ sd->pet.rename_flag = 1;
+ clif_pet_equip(sd->pd,sd->pet.equip);
+ clif_send_petstatus(sd);
+
+ return 0;
+}
+
+int pet_equipitem(struct map_session_data *sd,int index)
+{
+ int nameid;
+
+ nullpo_retr(1, sd);
+
+ nameid = sd->status.inventory[index].nameid;
+ if(sd->petDB == NULL)
+ return 1;
+ if(sd->petDB->AcceID == 0 || nameid != sd->petDB->AcceID || sd->pet.equip != 0) {
+ clif_equipitemack(sd,0,0,0);
+ return 1;
+ }
+ else {
+ pc_delitem(sd,index,1,0);
+ sd->pet.equip = sd->pd->equip = nameid;
+ pc_calcstatus(sd,0);
+ clif_pet_equip(sd->pd,nameid);
+ }
+
+ return 0;
+}
+
+int pet_unequipitem(struct map_session_data *sd)
+{
+ struct item tmp_item;
+ int nameid,flag;
+
+ nullpo_retr(1, sd);
+
+ if(sd->petDB == NULL)
+ return 1;
+ if(sd->pet.equip == 0)
+ return 1;
+
+ nameid = sd->pet.equip;
+ sd->pet.equip = sd->pd->equip = 0;
+ pc_calcstatus(sd,0);
+ clif_pet_equip(sd->pd,0);
+ memset(&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);
+ }
+
+ return 0;
+}
+
+int pet_food(struct map_session_data *sd)
+{
+ int i,k,t;
+
+ nullpo_retr(1, sd);
+
+ if(sd->petDB == NULL)
+ return 1;
+ i=pc_search_inventory(sd,sd->petDB->FoodID);
+ if(i < 0) {
+ clif_pet_food(sd,sd->petDB->FoodID,0);
+ return 1;
+ }
+ pc_delitem(sd,i,1,0);
+ t = sd->pet.intimate;
+ if(sd->pet.hungry > 90)
+ sd->pet.intimate -= sd->petDB->r_full;
+ else if(sd->pet.hungry > 75) {
+ if(battle_config.pet_friendly_rate != 100)
+ k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
+ else
+ k = sd->petDB->r_hungry;
+ k = k >> 1;
+ if(k <= 0)
+ k = 1;
+ sd->pet.intimate += k;
+ }
+ else {
+ if(battle_config.pet_friendly_rate != 100)
+ k = (sd->petDB->r_hungry * battle_config.pet_friendly_rate)/100;
+ else
+ k = sd->petDB->r_hungry;
+ sd->pet.intimate += k;
+ }
+ if(sd->pet.intimate <= 0) {
+ sd->pet.intimate = 0;
+ if(battle_config.pet_status_support && t > 0) {
+ if(sd->bl.prev != NULL)
+ pc_calcstatus(sd,0);
+ else
+ pc_calcstatus(sd,2);
+ }
+ }
+ else if(sd->pet.intimate > 1000)
+ sd->pet.intimate = 1000;
+ sd->pet.hungry += sd->petDB->fullness;
+ if(sd->pet.hungry > 100)
+ sd->pet.hungry = 100;
+
+ clif_send_petdata(sd,2,sd->pet.hungry);
+ clif_send_petdata(sd,1,sd->pet.intimate);
+ clif_pet_food(sd,sd->petDB->FoodID,1);
+
+ return 0;
+}
+
+static int pet_randomwalk(struct pet_data *pd,int tick)
+{
+ const int retrycount=20;
+ int speed;
+
+ nullpo_retr(0, pd);
+
+ speed = battle_get_speed(&pd->bl);
+
+ if(DIFF_TICK(pd->next_walktime,tick) < 0){
+ 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((c=map_getcell(pd->bl.m,x,y))!=1 && c!=5 && pet_walktoxy(pd,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)
+ printf("PET cant move. hold position %d, class = %d\n",pd->bl.id,pd->class);
+ pd->move_fail_count=0;
+ pet_changestate(pd,MS_DELAY,60000);
+ return 0;
+ }
+ }
+ }
+ for(i=c=0;i<pd->walkpath.path_len;i++){
+ if(pd->walkpath.path[i]&1)
+ c+=speed*14/10;
+ else
+ c+=speed;
+ }
+ pd->next_walktime = tick+rand()%3000+3000+c;
+
+ return 1;
+ }
+ return 0;
+}
+
+static int pet_unlocktarget(struct pet_data *pd)
+{
+ nullpo_retr(0, pd);
+
+ pd->target_id=0;
+
+ return 0;
+}
+
+static int pet_ai_sub_hard(struct pet_data *pd,unsigned int tick)
+{
+ struct map_session_data *sd = pd->msd;
+ struct mob_data *md = NULL;
+ int dist,i=0,dx,dy,ret;
+ int mode,race;
+
+ nullpo_retr(0, pd);
+
+ sd = pd->msd;
+
+ 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->state.state == MS_DELAY || pd->bl.m != sd->bl.m)
+ return 0;
+ // ƒyƒbƒg‚É‚æ‚郋[ƒg
+ if(!pd->target_id && pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax && pd->loot==1 && DIFF_TICK(gettick(),pd->lootitem_timer)>0)
+ map_foreachinarea(pet_ai_sub_hard_lootsearch,pd->bl.m,
+ pd->bl.x-AREA_SIZE*2,pd->bl.y-AREA_SIZE*2,
+ pd->bl.x+AREA_SIZE*2,pd->bl.y+AREA_SIZE*2,
+ BL_ITEM,pd,&i);
+
+ if(sd->pet.intimate > 0) {
+ dist = distance(sd->bl.x,sd->bl.y,pd->bl.x,pd->bl.y);
+ if(dist > 12) {
+ if(pd->target_id > 0)
+ pet_unlocktarget(pd);
+ if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3)
+ return 0;
+ pd->speed = (sd->speed>>1);
+ if(pd->speed <= 0)
+ pd->speed = 1;
+ pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
+ if(pet_walktoxy(pd,pd->to_x,pd->to_y))
+ pet_randomwalk(pd,tick);
+ }
+ else if(pd->target_id - MAX_FLOORITEM > 0) {
+ mode=mob_db[pd->class].mode;
+ race=mob_db[pd->class].race;
+ md=(struct mob_data *)map_id2bl(pd->target_id);
+ if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
+ distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 13)
+ pet_unlocktarget(pd);
+ else if(mob_db[pd->class].mexp <= 0 && !(mode&0x20) && (md->option & 0x06 && race!=4 && race!=6) )
+ pet_unlocktarget(pd);
+ else if(!battle_check_range(&pd->bl,&md->bl,mob_db[pd->class].range)){
+ if(pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,md->bl.x,md->bl.y) < 2)
+ return 0;
+ if( !pet_can_reach(pd,md->bl.x,md->bl.y))
+ pet_unlocktarget(pd);
+ else {
+ i=0;
+ pd->speed = battle_get_speed(&pd->bl);
+ do {
+ if(i==0) { // ʼn‚ÍAEGIS‚Æ“¯‚¶•û–@‚ÅŒŸõ
+ dx=md->bl.x - pd->bl.x;
+ dy=md->bl.y - pd->bl.y;
+ if(dx<0) dx++;
+ else if(dx>0) dx--;
+ if(dy<0) dy++;
+ else if(dy>0) dy--;
+ }
+ else { // ‚¾‚ß‚È‚çAthenaŽ®(ƒ‰ƒ“ƒ_ƒ€)
+ dx=md->bl.x - pd->bl.x + rand()%3 - 1;
+ dy=md->bl.y - pd->bl.y + rand()%3 - 1;
+ }
+ ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
+ i++;
+ } while(ret && i<5);
+
+ if(ret) { // ˆÚ“®•s‰Â”\‚ÈŠ‚©‚ç‚ÌUŒ‚‚È‚ç2•à‰º‚é
+ if(dx<0) dx=2;
+ else if(dx>0) dx=-2;
+ if(dy<0) dy=2;
+ else if(dy>0) dy=-2;
+ pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
+ }
+ }
+ }
+ else {
+ if(pd->state.state==MS_WALK)
+ pet_stop_walking(pd,1);
+ if(pd->state.state==MS_ATTACK)
+ return 0;
+ pet_changestate(pd,MS_ATTACK,0);
+ }
+ }
+ else if(pd->target_id > 0){ // ƒ‹[ƒgˆ—
+ struct block_list *bl_item;
+ struct flooritem_data *fitem;
+
+ bl_item = map_id2bl(pd->target_id);
+ if(bl_item == NULL || bl_item->type != BL_ITEM ||bl_item->m != pd->bl.m ||
+ (dist=distance(pd->bl.x,pd->bl.y,bl_item->x,bl_item->y))>=5){
+ // ‰“‚·‚¬‚é‚©ƒAƒCƒeƒ€‚ª‚È‚­‚È‚Á‚½
+ pet_unlocktarget(pd);
+ }
+ else if(dist){
+ if(pd->timer != -1 && pd->state.state!=MS_ATTACK && (DIFF_TICK(pd->next_walktime,tick)<0 || distance(pd->to_x,pd->to_y,bl_item->x,bl_item->y) <= 0))
+ return 0; // Šù‚Ɉړ®’†
+
+ pd->next_walktime=tick+500;
+ dx=bl_item->x - pd->bl.x;
+ dy=bl_item->y - pd->bl.y;
+
+ ret=pet_walktoxy(pd,pd->bl.x+dx,pd->bl.y+dy);
+ }
+ else{ // ƒAƒCƒeƒ€‚Ü‚Å‚½‚Ç‚è’…‚¢‚½
+ fitem = (struct flooritem_data *)bl_item;
+ if(pd->state.state==MS_ATTACK)
+ return 0; // UŒ‚’†
+ if(pd->state.state==MS_WALK){ // •às’†‚È‚ç’âŽ~
+ pet_stop_walking(pd,1);
+ }
+ if(pd->lootitem_count < PETLOOT_SIZE && pd->lootitem_count < pd->lootmax){
+ memcpy(&pd->lootitem[pd->lootitem_count++],&fitem->item_data,sizeof(pd->lootitem[0]));
+ pd->lootitem_weight += itemdb_search(fitem->item_data.nameid)->weight*fitem->item_data.amount;
+ }
+ else if(pd->lootitem_count >= PETLOOT_SIZE || pd->lootitem_count >=pd->lootmax) {
+ pet_unlocktarget(pd);
+ return 0;
+ }
+ else {
+ if(pd->lootitem[0].card[0] == (short)0xff00)
+ intif_delete_petdata(*((long *)(&pd->lootitem[0].card[1])));
+ for(i=0;i<PETLOOT_SIZE-1;i++)
+ memcpy(&pd->lootitem[i],&pd->lootitem[i+1],sizeof(pd->lootitem[0]));
+ memcpy(&pd->lootitem[PETLOOT_SIZE-1],&fitem->item_data,sizeof(pd->lootitem[0]));
+ }
+ map_clearflooritem(bl_item->id);
+ pet_unlocktarget(pd);
+ }
+ }
+ else {
+ if(dist <= 3 || (pd->timer != -1 && pd->state.state == MS_WALK && distance(pd->to_x,pd->to_y,sd->bl.x,sd->bl.y) < 3) )
+ return 0;
+ pd->speed = battle_get_speed(&pd->bl);
+ pet_calc_pos(pd,sd->bl.x,sd->bl.y,sd->dir);
+ if(pet_walktoxy(pd,pd->to_x,pd->to_y))
+ pet_randomwalk(pd,tick);
+ }
+ }
+ else {
+ pd->speed = battle_get_speed(&pd->bl);
+ if(pd->state.state == MS_ATTACK)
+ pet_stopattack(pd);
+ pet_randomwalk(pd,tick);
+ }
+
+ return 0;
+}
+
+static int pet_ai_sub_foreachclient(struct map_session_data *sd,va_list ap)
+{
+ unsigned int tick;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, ap);
+
+ tick=va_arg(ap,unsigned int);
+ if(sd->status.pet_id && sd->pd && sd->petDB)
+ pet_ai_sub_hard(sd->pd,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;
+}
+
+int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap)
+{
+ struct pet_data* pd;
+ int dist,*itc;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, pd=va_arg(ap,struct pet_data *));
+ nullpo_retr(0, itc=va_arg(ap,int *));
+
+ if(!pd->target_id){
+ struct flooritem_data *fitem = (struct flooritem_data *)bl;
+ struct map_session_data *sd = NULL;
+ // ƒ‹[ƒgŒ –³‚µ
+ if(fitem && fitem->first_get_id>0)
+ sd = map_id2sd(fitem->first_get_id);
+ // Removed [Valaris]
+ //if((pd->lootitem_weight + (itemdb_search(fitem->item_data.))->weight * fitem->item_data.amount) > battle_config.pet_weight)
+ // return 0;
+
+ if(!pd->lootitem || (pd->lootitem_count >= PETLOOT_SIZE) || (pd->lootitem_count >= pd->lootmax) || (sd && sd->pd != pd))
+ return 0;
+ if(bl->m == pd->bl.m && (dist=distance(pd->bl.x,pd->bl.y,bl->x,bl->y))<5){
+ if( pet_can_reach(pd,bl->x,bl->y) // “ž’B‰Â”\«”»’è
+ && rand()%1000<1000/(++(*itc)) ){ // ”͈͓àPC‚Å“™Šm—¦‚É‚·‚é
+ pd->target_id=bl->id;
+ }
+ }
+ }
+ return 0;
+}
+int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd)
+{
+ int i,flag=0;
+
+ if(pd){
+ if(pd->lootitem) {
+ for(i=0;i<pd->lootitem_count;i++) {
+ struct delay_item_drop2 *ditem;
+
+ ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2));
+ memcpy(&ditem->item_data,&pd->lootitem[i],sizeof(pd->lootitem[0]));
+ ditem->m = pd->bl.m;
+ ditem->x = pd->bl.x;
+ ditem->y = pd->bl.y;
+ ditem->first_sd = 0;
+ ditem->second_sd = 0;
+ ditem->third_sd = 0;
+ // —Ž‚Æ‚³‚È‚¢‚Å’¼ÚPC‚ÌItem—“‚Ö
+ if(sd){
+ if((flag = pc_additem(sd,&ditem->item_data,ditem->item_data.amount))){
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+ }
+ free(ditem);
+ }
+ else
+ add_timer(gettick()+540+i,pet_delay_item_drop2,(int)ditem,0);
+ }
+ pd->lootitem=NULL;
+ pd->lootitem=(struct item *)aCalloc(PETLOOT_SIZE,sizeof(struct item));
+ pd->lootitem_count = 0;
+ pd->lootitem_weight = 0;
+ pd->lootitem_timer = gettick()+10000; // 10*1000ms‚ÌŠÔE‚í‚È‚¢
+ }
+ }
+ return 1;
+}
+
+int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data)
+{
+ struct delay_item_drop2 *ditem;
+
+ ditem=(struct delay_item_drop2 *)id;
+
+ map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0);
+
+ free(ditem);
+ return 0;
+}
+
+/*==========================================
+ * pet bonus giving skills [Valaris]
+ *------------------------------------------
+ */
+
+int pet_skill_bonus(struct map_session_data *sd,struct pet_data *pd,int type,int val,int duration,int timer,int data)
+{
+ if(pd==NULL || sd==NULL)
+ return 1;
+
+ pd->skillbonustype=type;
+ pd->skillbonusval=val;
+ pd->skillduration=duration;
+ pd->skilltimer=timer;
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_skill_bonus_timer,sd->bl.id,0);
+
+ return 0;
+
+}
+
+int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonustimer != tid)
+ return 0;
+
+ pd->skillbonustimer=-1;
+
+ pc_bonus(sd,pd->skillbonustype,pd->skillbonusval);
+ if(pd->skillbonustype < 56) clif_updatestatus(sd,pd->skillbonustype);
+ pd->skillbonusduration=add_timer(gettick()+pd->skillduration*1000,pet_skill_bonus_duration,sd->bl.id,0);
+
+ return 0;
+}
+
+int pet_skill_bonus_duration(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonusduration != tid)
+ return 0;
+
+ pd->skillbonusduration=-1;
+
+ pc_bonus(sd,pd->skillbonustype,-pd->skillbonusval);
+ if(pd->skillbonustype < 56) clif_updatestatus(sd,pd->skillbonustype);
+
+ pet_skill_bonus(sd,pd,pd->skillbonustype,pd->skillbonusval,pd->skillduration,pd->skilltimer,0);
+
+ return 0;
+}
+
+int pet_recovery_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonustimer != tid)
+ return 0;
+
+ if(sd->sc_data[pd->skilltype].timer != -1)
+ skill_status_change_end(&sd->bl,pd->skilltype,-1);
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+int pet_heal_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonustimer != tid)
+ return 0;
+
+ if(sd->status.hp < sd->status.max_hp * pd->skilltype/100) {
+ clif_skill_nodamage(&pd->bl,&sd->bl,AL_HEAL,pd->skillval,1);
+ pc_heal(sd,pd->skillval,0);
+ }
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+int pet_mag_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct pet_data *pd;
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonustimer != tid)
+ return 0;
+
+ if(sd->status.hp < sd->status.max_hp * pd->skilltype/100 && sd->status.sp < sd->status.max_sp * pd->skillduration/100) {
+ clif_skill_nodamage(&pd->bl,&sd->bl,PR_MAGNIFICAT,pd->skillval,1);
+ skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],pd->skillval,0,0,0,skill_get_time(PR_MAGNIFICAT,pd->skillval),0 );
+ }
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+int pet_skillattack_timer(int tid,unsigned int tick,int id,int data)
+{
+ struct mob_data *md;
+ struct map_session_data *sd=(struct map_session_data*)map_id2bl(id);
+ struct pet_data *pd;
+
+ if(sd==NULL || sd->bl.type!=BL_PC)
+ return 1;
+
+ pd=sd->pd;
+
+ if(pd==NULL || pd->bl.type!=BL_PET)
+ return 1;
+
+ if(pd->skillbonustimer != tid)
+ return 0;
+
+ md=(struct mob_data *)map_id2bl(sd->attacktarget);
+ if(md == NULL || md->bl.type != BL_MOB || pd->bl.m != md->bl.m || md->bl.prev == NULL ||
+ distance(pd->bl.x,pd->bl.y,md->bl.x,md->bl.y) > 6) {
+ pd->target_id=0;
+ pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,pd->skillduration);
+ return 0;
+ }
+
+ if(md && rand()%100 < sd->pet.intimate*pd->skilltimer/100 ) {
+ if(pd->skilltype==6 || pd->skilltype==176) {
+ skill_castend_nodamage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
+ }
+
+ else if(pd->skilltype==110){
+ skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval,tick,0);
+ }
+
+ else if(pd->skilltype==91) {
+ skill_castend_pos2(&pd->bl,md->bl.x,md->bl.y,pd->skilltype,pd->skillval+rand()%100,tick,0);
+ }
+ else
+ skill_castend_damage_id(&pd->bl,&md->bl,pd->skilltype,pd->skillval,tick,0);
+ pd->skillbonustimer=add_timer(gettick()+1000,pet_skillattack_timer,sd->bl.id,0);
+ return 0;
+ }
+
+ pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+/*==========================================
+ *ƒyƒbƒgƒf[ƒ^“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+int read_petdb()
+{
+ FILE *fp;
+ char line[1024];
+ int i;
+ int j=0;
+ char *filename[]={"db/pet_db.txt","db/pet_db2.txt"};
+
+ memset(pet_db,0,sizeof(pet_db));
+ for(i=0;i<2;i++){
+ fp=fopen(filename[i],"r");
+ if(fp==NULL){
+ if(i>0)
+ continue;
+ printf("can't read %s\n",filename[i]);
+ return -1;
+ }
+ while(fgets(line,1020,fp)){
+ int nameid,i;
+ char *str[32],*p,*np;
+
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+
+ for(i=0,p=line;i<20;i++){
+ if((np=strchr(p,','))!=NULL){
+ str[i]=p;
+ *np=0;
+ p=np+1;
+ } else {
+ str[i]=p;
+ p+=strlen(p);
+ }
+ }
+
+ nameid=atoi(str[0]);
+ if(nameid<=0 || nameid>2000)
+ continue;
+
+ //MobID,Name,JName,ItemID,EggID,AcceID,FoodID,"Fullness (1‰ñ‚̉a‚Å‚Ì–ž• “x‘‰Á—¦%)","HungryDeray (/min)","R_Hungry (‹ó• Žž‰a‚â‚èe–§“x‘‰Á—¦%)","R_Full (‚Æ‚Ä‚à–ž• Žž‰a‚â‚èe–§“xŒ¸­—¦%)","Intimate (•ßŠlŽže–§“x%)","Die (Ž€–SŽže–§“xŒ¸­—¦%)","Capture (•ßŠl—¦%)",(Name)
+ pet_db[j].class = nameid;
+ memcpy(pet_db[j].name,str[1],24);
+ memcpy(pet_db[j].jname,str[2],24);
+ 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(np,0);
+ j++;
+ }
+ fclose(fp);
+ printf("read %s done (count=%d)\n",filename[i],j);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ŠÖŒW‰Šú‰»ˆ—
+ *------------------------------------------
+ */
+int do_init_pet(void)
+{
+ read_petdb();
+
+ add_timer_func_list(pet_timer,"pet_timer");
+ 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_skill_bonus_duration,"pet_skill_bonus_duration"); // [Valaris]
+ add_timer_func_list(pet_recovery_timer,"pet_recovery_timer"); // [Valaris]
+ add_timer_func_list(pet_mag_timer,"pet_mag_timer"); // [Valaris]
+ add_timer_func_list(pet_heal_timer,"pet_heal_timer"); // [Valaris]
+ add_timer_func_list(pet_skillattack_timer,"pet_skillattack_timer"); // [Valaris]
+ add_timer_interval(gettick()+MIN_PETTHINKTIME,pet_ai_hard,0,0,MIN_PETTHINKTIME);
+
+ return 0;
+}
+
diff --git a/src/map/pet.h b/src/map/pet.h
index b4ccf5ccb..365a4490f 100644
--- a/src/map/pet.h
+++ b/src/map/pet.h
@@ -1,69 +1,69 @@
-// $Id: pet.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
-#ifndef _PET_H_
-#define _PET_H_
-
-#define MAX_PET_DB 100
-#define PETLOOT_SIZE 20 // [Valaris]
-
-struct pet_db {
- int class;
- char name[24],jname[24];
- int itemID;
- int EggID;
- int AcceID;
- int 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;
- char *script;
-};
-extern struct pet_db pet_db[MAX_PET_DB];
-
-enum { PET_CLASS,PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
-
-int pet_hungry_val(struct map_session_data *sd);
-int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type);
-int pet_stopattack(struct pet_data *pd);
-int pet_changestate(struct pet_data *pd,int state,int type);
-int pet_walktoxy(struct pet_data *pd,int x,int y);
-int pet_stop_walking(struct pet_data *pd,int type);
-int search_petDB_index(int key,int type);
-int pet_hungry_timer_delete(struct map_session_data *sd);
-int pet_remove_map(struct map_session_data *sd);
-int pet_data_init(struct map_session_data *sd);
-int pet_birth_process(struct map_session_data *sd);
-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 pet_equipitem(struct map_session_data *sd,int index);
-int pet_unequipitem(struct map_session_data *sd);
-int pet_food(struct map_session_data *sd);
-int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
-int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data);
-int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
-int pet_skill_bonus(struct map_session_data *sd,struct pet_data *pd,int type,int val,int duration,int timer,int data);
-int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-int pet_skill_bonus_duration(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_mag_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]
-int pet_skillattack_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
-
-int do_init_pet(void);
-
-#endif
-
+// $Id: pet.h,v 1.2 2004/09/25 05:32:18 MouseJstr Exp $
+#ifndef _PET_H_
+#define _PET_H_
+
+#define MAX_PET_DB 100
+#define PETLOOT_SIZE 20 // [Valaris]
+
+struct pet_db {
+ int class;
+ char name[24],jname[24];
+ int itemID;
+ int EggID;
+ int AcceID;
+ int 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;
+ char *script;
+};
+extern struct pet_db pet_db[MAX_PET_DB];
+
+enum { PET_CLASS,PET_CATCH,PET_EGG,PET_EQUIP,PET_FOOD };
+
+int pet_hungry_val(struct map_session_data *sd);
+int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type);
+int pet_stopattack(struct pet_data *pd);
+int pet_changestate(struct pet_data *pd,int state,int type);
+int pet_walktoxy(struct pet_data *pd,int x,int y);
+int pet_stop_walking(struct pet_data *pd,int type);
+int search_petDB_index(int key,int type);
+int pet_hungry_timer_delete(struct map_session_data *sd);
+int pet_remove_map(struct map_session_data *sd);
+int pet_data_init(struct map_session_data *sd);
+int pet_birth_process(struct map_session_data *sd);
+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 pet_equipitem(struct map_session_data *sd,int index);
+int pet_unequipitem(struct map_session_data *sd);
+int pet_food(struct map_session_data *sd);
+int pet_lootitem_drop(struct pet_data *pd,struct map_session_data *sd);
+int pet_delay_item_drop2(int tid,unsigned int tick,int id,int data);
+int pet_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap);
+int pet_skill_bonus(struct map_session_data *sd,struct pet_data *pd,int type,int val,int duration,int timer,int data);
+int pet_skill_bonus_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+int pet_skill_bonus_duration(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_mag_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]
+int pet_skillattack_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+
+int do_init_pet(void);
+
+#endif
+
diff --git a/src/map/script.c b/src/map/script.c
index e4b95f058..61f5fd920 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -1,6930 +1,6930 @@
-// $Id: script.c 148 2004-09-30 14:05:37Z MouseJstr $
-//#define DEBUG_FUNCIN
-//#define DEBUG_DISP
-//#define DEBUG_RUN
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#ifndef _WIN32
-#include <sys/time.h>
-#endif
-
-#include <time.h>
-
-#include "socket.h"
-#include "timer.h"
-#include "malloc.h"
-#include "lock.h"
-
-#include "map.h"
-#include "clif.h"
-#include "chrif.h"
-#include "itemdb.h"
-#include "pc.h"
-#include "script.h"
-#include "storage.h"
-#include "mob.h"
-#include "npc.h"
-#include "pet.h"
-#include "intif.h"
-#include "db.h"
-#include "skill.h"
-#include "chat.h"
-#include "battle.h"
-#include "party.h"
-#include "guild.h"
-#include "lock.h"
-#include "atcommand.h"
-#include "log.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define SCRIPT_BLOCK_SIZE 256
-enum { LABEL_NEXTLINE=1,LABEL_START };
-static unsigned char * script_buf;
-static int script_pos,script_size;
-
-char *str_buf;
-int str_pos,str_size;
-static struct {
- int type;
- int str;
- int backpatch;
- int label;
- int (*func)();
- int val;
- int next;
-} *str_data;
-int str_num=LABEL_START,str_data_size;
-int str_hash[16];
-
-static struct dbt *mapreg_db=NULL;
-static struct dbt *mapregstr_db=NULL;
-static int mapreg_dirty=-1;
-char mapreg_txt[256]="save/mapreg.txt";
-#define MAPREG_AUTOSAVE_INTERVAL (10*1000)
-
-static struct dbt *scriptlabel_db=NULL;
-static struct dbt *userfunc_db=NULL;
-
-struct dbt* script_get_label_db(){ return scriptlabel_db; }
-struct dbt* script_get_userfunc_db(){ if(!userfunc_db) userfunc_db=strdb_init(50); return userfunc_db; }
-
-int scriptlabel_final(void *k,void *d,va_list ap){ return 0; }
-static char pos[11][100] = {"“ª","‘Ì","¶Žè","‰EŽè","ƒ[ƒu","ŒC","ƒAƒNƒZƒTƒŠ[1","ƒAƒNƒZƒTƒŠ[2","“ª2","“ª3","‘•’…‚µ‚Ä‚¢‚È‚¢"};
-
-static struct Script_Config {
- int warn_func_no_comma;
- int warn_cmd_no_comma;
- int warn_func_mismatch_paramnum;
- int warn_cmd_mismatch_paramnum;
- int check_cmdcount;
- int check_gotocount;
-} script_config;
-static int parse_cmd_if=0;
-static int parse_cmd;
-
-/*==========================================
- * ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
- *------------------------------------------
- */
-unsigned char* parse_subexpr(unsigned char *,int);
-int buildin_mes(struct script_state *st);
-int buildin_goto(struct script_state *st);
-int buildin_callsub(struct script_state *st);
-int buildin_callfunc(struct script_state *st);
-int buildin_return(struct script_state *st);
-int buildin_getarg(struct script_state *st);
-int buildin_next(struct script_state *st);
-int buildin_close(struct script_state *st);
-int buildin_close2(struct script_state *st);
-int buildin_menu(struct script_state *st);
-int buildin_rand(struct script_state *st);
-int buildin_warp(struct script_state *st);
-int buildin_areawarp(struct script_state *st);
-int buildin_heal(struct script_state *st);
-int buildin_itemheal(struct script_state *st);
-int buildin_percentheal(struct script_state *st);
-int buildin_jobchange(struct script_state *st);
-int buildin_input(struct script_state *st);
-int buildin_setlook(struct script_state *st);
-int buildin_set(struct script_state *st);
-int buildin_setarray(struct script_state *st);
-int buildin_cleararray(struct script_state *st);
-int buildin_copyarray(struct script_state *st);
-int buildin_getarraysize(struct script_state *st);
-int buildin_deletearray(struct script_state *st);
-int buildin_getelementofarray(struct script_state *st);
-int buildin_if(struct script_state *st);
-int buildin_getitem(struct script_state *st);
-int buildin_getitem2(struct script_state *st);
-int buildin_makeitem(struct script_state *st);
-int buildin_delitem(struct script_state *st);
-int buildin_viewpoint(struct script_state *st);
-int buildin_countitem(struct script_state *st);
-int buildin_checkweight(struct script_state *st);
-int buildin_readparam(struct script_state *st);
-int buildin_getcharid(struct script_state *st);
-int buildin_getpartyname(struct script_state *st);
-int buildin_getpartymember(struct script_state *st);
-int buildin_getguildname(struct script_state *st);
-int buildin_getguildmaster(struct script_state *st);
-int buildin_getguildmasterid(struct script_state *st);
-int buildin_strcharinfo(struct script_state *st);
-int buildin_getequipid(struct script_state *st);
-int buildin_getequipname(struct script_state *st);
-int buildin_getbrokenid(struct script_state *st); // [Valaris]
-int buildin_repair(struct script_state *st); // [Valaris]
-int buildin_getequipisequiped(struct script_state *st);
-int buildin_getequipisenableref(struct script_state *st);
-int buildin_getequipisidentify(struct script_state *st);
-int buildin_getequiprefinerycnt(struct script_state *st);
-int buildin_getequipweaponlv(struct script_state *st);
-int buildin_getequippercentrefinery(struct script_state *st);
-int buildin_successrefitem(struct script_state *st);
-int buildin_failedrefitem(struct script_state *st);
-int buildin_cutin(struct script_state *st);
-int buildin_cutincard(struct script_state *st);
-int buildin_statusup(struct script_state *st);
-int buildin_statusup2(struct script_state *st);
-int buildin_bonus(struct script_state *st);
-int buildin_bonus2(struct script_state *st);
-int buildin_bonus3(struct script_state *st);
-int buildin_skill(struct script_state *st);
-int buildin_guildskill(struct script_state *st);
-int buildin_getskilllv(struct script_state *st);
-int buildin_getgdskilllv(struct script_state *st);
-int buildin_basicskillcheck(struct script_state *st);
-int buildin_getgmlevel(struct script_state *st);
-int buildin_end(struct script_state *st);
-int buildin_checkoption(struct script_state *st);
-int buildin_setoption(struct script_state *st);
-int buildin_setcart(struct script_state *st);
-int buildin_checkcart(struct script_state *st); // check cart [Valaris]
-int buildin_setfalcon(struct script_state *st);
-int buildin_checkfalcon(struct script_state *st); // check falcon [Valaris]
-int buildin_setriding(struct script_state *st);
-int buildin_checkriding(struct script_state *st); // check for pecopeco [Valaris]
-int buildin_savepoint(struct script_state *st);
-int buildin_gettimetick(struct script_state *st);
-int buildin_gettime(struct script_state *st);
-int buildin_gettimestr(struct script_state *st);
-int buildin_openstorage(struct script_state *st);
-int buildin_guildopenstorage(struct script_state *st);
-int buildin_itemskill(struct script_state *st);
-int buildin_produce(struct script_state *st);
-int buildin_monster(struct script_state *st);
-int buildin_areamonster(struct script_state *st);
-int buildin_killmonster(struct script_state *st);
-int buildin_killmonsterall(struct script_state *st);
-int buildin_doevent(struct script_state *st);
-int buildin_donpcevent(struct script_state *st);
-int buildin_addtimer(struct script_state *st);
-int buildin_deltimer(struct script_state *st);
-int buildin_addtimercount(struct script_state *st);
-int buildin_initnpctimer(struct script_state *st);
-int buildin_stopnpctimer(struct script_state *st);
-int buildin_startnpctimer(struct script_state *st);
-int buildin_setnpctimer(struct script_state *st);
-int buildin_getnpctimer(struct script_state *st);
-int buildin_announce(struct script_state *st);
-int buildin_mapannounce(struct script_state *st);
-int buildin_areaannounce(struct script_state *st);
-int buildin_getusers(struct script_state *st);
-int buildin_getmapusers(struct script_state *st);
-int buildin_getareausers(struct script_state *st);
-int buildin_getareadropitem(struct script_state *st);
-int buildin_enablenpc(struct script_state *st);
-int buildin_disablenpc(struct script_state *st);
-int buildin_enablearena(struct script_state *st); // Added by RoVeRT
-int buildin_disablearena(struct script_state *st); // Added by RoVeRT
-int buildin_hideoffnpc(struct script_state *st);
-int buildin_hideonnpc(struct script_state *st);
-int buildin_sc_start(struct script_state *st);
-int buildin_sc_start2(struct script_state *st);
-int buildin_sc_end(struct script_state *st);
-int buildin_getscrate(struct script_state *st);
-int buildin_debugmes(struct script_state *st);
-int buildin_catchpet(struct script_state *st);
-int buildin_birthpet(struct script_state *st);
-int buildin_resetlvl(struct script_state *st);
-int buildin_resetstatus(struct script_state *st);
-int buildin_resetskill(struct script_state *st);
-int buildin_changebase(struct script_state *st);
-int buildin_changesex(struct script_state *st);
-int buildin_waitingroom(struct script_state *st);
-int buildin_delwaitingroom(struct script_state *st);
-int buildin_enablewaitingroomevent(struct script_state *st);
-int buildin_disablewaitingroomevent(struct script_state *st);
-int buildin_getwaitingroomstate(struct script_state *st);
-int buildin_warpwaitingpc(struct script_state *st);
-int buildin_attachrid(struct script_state *st);
-int buildin_detachrid(struct script_state *st);
-int buildin_isloggedin(struct script_state *st);
-int buildin_setmapflagnosave(struct script_state *st);
-int buildin_setmapflag(struct script_state *st);
-int buildin_removemapflag(struct script_state *st);
-int buildin_pvpon(struct script_state *st);
-int buildin_pvpoff(struct script_state *st);
-int buildin_gvgon(struct script_state *st);
-int buildin_gvgoff(struct script_state *st);
-int buildin_emotion(struct script_state *st);
-int buildin_maprespawnguildid(struct script_state *st);
-int buildin_agitstart(struct script_state *st); // <Agit>
-int buildin_agitend(struct script_state *st);
-int buildin_agitcheck(struct script_state *st); // <Agitcheck>
-int buildin_flagemblem(struct script_state *st); // Flag Emblem
-int buildin_getcastlename(struct script_state *st);
-int buildin_getcastledata(struct script_state *st);
-int buildin_setcastledata(struct script_state *st);
-int buildin_requestguildinfo(struct script_state *st);
-int buildin_getequipcardcnt(struct script_state *st);
-int buildin_successremovecards(struct script_state *st);
-int buildin_failedremovecards(struct script_state *st);
-int buildin_marriage(struct script_state *st);
-int buildin_wedding_effect(struct script_state *st);
-int buildin_divorce(struct script_state *st);
-int buildin_getitemname(struct script_state *st);
-int buildin_makepet(struct script_state *st);
-int buildin_getexp(struct script_state *st);
-int buildin_getinventorylist(struct script_state *st);
-int buildin_getskilllist(struct script_state *st);
-int buildin_clearitem(struct script_state *st);
-int buildin_classchange(struct script_state *st);
-int buildin_misceffect(struct script_state *st);
-int buildin_soundeffect(struct script_state *st);
-int buildin_setcastledata(struct script_state *st);
-int buildin_mapwarp(struct script_state *st);
-int buildin_inittimer(struct script_state *st);
-int buildin_stoptimer(struct script_state *st);
-int buildin_cmdothernpc(struct script_state *st);
-int buildin_mobcount(struct script_state *st);
-int buildin_strmobinfo(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardian(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_guardianinfo(struct script_state *st); // Script for displaying mob info [Valaris]
-int buildin_petskillbonus(struct script_state *st); // petskillbonus [Valaris]
-int buildin_petrecovery(struct script_state *st); // pet skill for curing status [Valaris]
-int buildin_petloot(struct script_state *st); // pet looting [Valaris]
-int buildin_petheal(struct script_state *st); // pet healing [Valaris]
-int buildin_petmag(struct script_state *st); // pet magnificat [Valaris]
-int buildin_petskillattack(struct script_state *st); // pet skill attacks [Valaris]
-int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris]
-int buildin_specialeffect(struct script_state *st); // special effect script [Valaris]
-int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris]
-int buildin_nude(struct script_state *st); // nude [Valaris]
-int buildin_gmcommand(struct script_state *st); // [MouseJstr]
-int buildin_movenpc(struct script_state *st); // [MouseJstr]
-int buildin_message(struct script_state *st); // [MouseJstr]
-int buildin_npctalk(struct script_state *st); // [Valaris]
-int buildin_hasitems(struct script_state *st); // [Valaris]
-int buildin_getlook(struct script_state *st); //Lorky [Lupus]
-int buildin_getsavepoint(struct script_state *st); //Lorky [Lupus]
-int buildin_npcspeed(struct script_state *st); // [Valaris]
-int buildin_npcwalkto(struct script_state *st); // [Valaris]
-int buildin_npcstop(struct script_state *st); // [Valaris]
-int buildin_getmapxy(struct script_state *st); //get map position for player/npc/pet/mob by Lorky [Lupus]
-
-
-void push_val(struct script_stack *stack,int type,int val);
-int run_func(struct script_state *st);
-
-int mapreg_setreg(int num,int val);
-int mapreg_setregstr(int num,const char *str);
-
-struct {
- int (*func)();
- char *name;
- char *arg;
-} buildin_func[]={
- {buildin_mes,"mes","s"},
- {buildin_next,"next",""},
- {buildin_close,"close",""},
- {buildin_close2,"close2",""},
- {buildin_menu,"menu","*"},
- {buildin_goto,"goto","l"},
- {buildin_callsub,"callsub","i*"},
- {buildin_callfunc,"callfunc","s*"},
- {buildin_return,"return","*"},
- {buildin_getarg,"getarg","i"},
- {buildin_jobchange,"jobchange","i*"},
- {buildin_input,"input","*"},
- {buildin_warp,"warp","sii"},
- {buildin_areawarp,"areawarp","siiiisii"},
- {buildin_setlook,"setlook","ii"},
- {buildin_set,"set","ii"},
- {buildin_setarray,"setarray","ii*"},
- {buildin_cleararray,"cleararray","iii"},
- {buildin_copyarray,"copyarray","iii"},
- {buildin_getarraysize,"getarraysize","i"},
- {buildin_deletearray,"deletearray","ii"},
- {buildin_getelementofarray,"getelementofarray","ii"},
- {buildin_if,"if","i*"},
- {buildin_getitem,"getitem","ii**"},
- {buildin_getitem2,"getitem2","iiiiiiiii*"},
- {buildin_makeitem,"makeitem","iisii"},
- {buildin_delitem,"delitem","ii"},
- {buildin_cutin,"cutin","si"},
- {buildin_cutincard,"cutincard","i"},
- {buildin_viewpoint,"viewpoint","iiiii"},
- {buildin_heal,"heal","ii"},
- {buildin_itemheal,"itemheal","ii"},
- {buildin_percentheal,"percentheal","ii"},
- {buildin_rand,"rand","i*"},
- {buildin_countitem,"countitem","i"},
- {buildin_checkweight,"checkweight","ii"},
- {buildin_readparam,"readparam","i*"},
- {buildin_getcharid,"getcharid","i*"},
- {buildin_getpartyname,"getpartyname","i"},
- {buildin_getpartymember,"getpartymember","i"},
- {buildin_getguildname,"getguildname","i"},
- {buildin_getguildmaster,"getguildmaster","i"},
- {buildin_getguildmasterid,"getguildmasterid","i"},
- {buildin_strcharinfo,"strcharinfo","i"},
- {buildin_getequipid,"getequipid","i"},
- {buildin_getequipname,"getequipname","i"},
- {buildin_getbrokenid,"getbrokenid","i"}, // [Valaris]
- {buildin_repair,"repair","i"}, // [Valaris]
- {buildin_getequipisequiped,"getequipisequiped","i"},
- {buildin_getequipisenableref,"getequipisenableref","i"},
- {buildin_getequipisidentify,"getequipisidentify","i"},
- {buildin_getequiprefinerycnt,"getequiprefinerycnt","i"},
- {buildin_getequipweaponlv,"getequipweaponlv","i"},
- {buildin_getequippercentrefinery,"getequippercentrefinery","i"},
- {buildin_successrefitem,"successrefitem","i"},
- {buildin_failedrefitem,"failedrefitem","i"},
- {buildin_statusup,"statusup","i"},
- {buildin_statusup2,"statusup2","ii"},
- {buildin_bonus,"bonus","ii"},
- {buildin_bonus2,"bonus2","iii"},
- {buildin_bonus3,"bonus3","iiii"},
- {buildin_skill,"skill","ii*"},
- {buildin_guildskill,"guildskill","ii"},
- {buildin_getskilllv,"getskilllv","i"},
- {buildin_getgdskilllv,"getgdskilllv","ii"},
- {buildin_basicskillcheck,"basicskillcheck","*"},
- {buildin_getgmlevel,"getgmlevel","*"},
- {buildin_end,"end",""},
- {buildin_end,"break",""},
- {buildin_checkoption,"checkoption","i"},
- {buildin_setoption,"setoption","i"},
- {buildin_setcart,"setcart",""},
- {buildin_checkcart,"checkcart","*"}, //fixed by Lupus (added '*')
- {buildin_setfalcon,"setfalcon",""},
- {buildin_checkfalcon,"checkfalcon","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {buildin_setriding,"setriding",""},
- {buildin_checkriding,"checkriding","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
- {buildin_savepoint,"save","sii"},
- {buildin_savepoint,"savepoint","sii"},
- {buildin_gettimetick,"gettimetick","i"},
- {buildin_gettime,"gettime","i"},
- {buildin_gettimestr,"gettimestr","si"},
- {buildin_openstorage,"openstorage",""},
- {buildin_guildopenstorage,"guildopenstorage","*"},
- {buildin_itemskill,"itemskill","iis"},
- {buildin_produce,"produce","i"},
- {buildin_monster,"monster","siisii*"},
- {buildin_areamonster,"areamonster","siiiisii*"},
- {buildin_killmonster,"killmonster","ss"},
- {buildin_killmonsterall,"killmonsterall","s"},
- {buildin_doevent,"doevent","s"},
- {buildin_donpcevent,"donpcevent","s"},
- {buildin_addtimer,"addtimer","is"},
- {buildin_deltimer,"deltimer","s"},
- {buildin_addtimercount,"addtimercount","si"},
- {buildin_initnpctimer,"initnpctimer","*"},
- {buildin_stopnpctimer,"stopnpctimer","*"},
- {buildin_startnpctimer,"startnpctimer","*"},
- {buildin_setnpctimer,"setnpctimer","*"},
- {buildin_getnpctimer,"getnpctimer","i*"},
- {buildin_announce,"announce","si"},
- {buildin_mapannounce,"mapannounce","ssi"},
- {buildin_areaannounce,"areaannounce","siiiisi"},
- {buildin_getusers,"getusers","i"},
- {buildin_getmapusers,"getmapusers","s"},
- {buildin_getareausers,"getareausers","siiii"},
- {buildin_getareadropitem,"getareadropitem","siiiii"},
- {buildin_enablenpc,"enablenpc","s"},
- {buildin_disablenpc,"disablenpc","s"},
- {buildin_enablearena,"enablearena",""}, // Added by RoVeRT
- {buildin_disablearena,"disablearena",""}, // Added by RoVeRT
- {buildin_hideoffnpc,"hideoffnpc","s"},
- {buildin_hideonnpc,"hideonnpc","s"},
- {buildin_sc_start,"sc_start","iii*"},
- {buildin_sc_start2,"sc_start2","iiii*"},
- {buildin_sc_end,"sc_end","i"},
- {buildin_getscrate,"getscrate","ii*"},
- {buildin_debugmes,"debugmes","s"},
- {buildin_catchpet,"pet","i"},
- {buildin_birthpet,"bpet",""},
- {buildin_resetlvl,"resetlvl","i"},
- {buildin_resetstatus,"resetstatus",""},
- {buildin_resetskill,"resetskill",""},
- {buildin_changebase,"changebase","i"},
- {buildin_changesex,"changesex",""},
- {buildin_waitingroom,"waitingroom","si*"},
- {buildin_warpwaitingpc,"warpwaitingpc","sii"},
- {buildin_delwaitingroom,"delwaitingroom","*"},
- {buildin_enablewaitingroomevent,"enablewaitingroomevent","*"},
- {buildin_disablewaitingroomevent,"disablewaitingroomevent","*"},
- {buildin_getwaitingroomstate,"getwaitingroomstate","i*"},
- {buildin_warpwaitingpc,"warpwaitingpc","sii*"},
- {buildin_attachrid,"attachrid","i"},
- {buildin_detachrid,"detachrid",""},
- {buildin_isloggedin,"isloggedin","i"},
- {buildin_setmapflagnosave,"setmapflagnosave","ssii"},
- {buildin_setmapflag,"setmapflag","si"},
- {buildin_removemapflag,"removemapflag","si"},
- {buildin_pvpon,"pvpon","s"},
- {buildin_pvpoff,"pvpoff","s"},
- {buildin_gvgon,"gvgon","s"},
- {buildin_gvgoff,"gvgoff","s"},
- {buildin_emotion,"emotion","i"},
- {buildin_maprespawnguildid,"maprespawnguildid","sii"},
- {buildin_agitstart,"agitstart",""}, // <Agit>
- {buildin_agitend,"agitend",""},
- {buildin_agitcheck,"agitcheck","i"}, // <Agitcheck>
- {buildin_flagemblem,"flagemblem","i"}, // Flag Emblem
- {buildin_getcastlename,"getcastlename","s"},
- {buildin_getcastledata,"getcastledata","si*"},
- {buildin_setcastledata,"setcastledata","sii"},
- {buildin_requestguildinfo,"requestguildinfo","i*"},
- {buildin_getequipcardcnt,"getequipcardcnt","i"},
- {buildin_successremovecards,"successremovecards","i"},
- {buildin_failedremovecards,"failedremovecards","ii"},
- {buildin_marriage,"marriage","s"},
- {buildin_wedding_effect,"wedding",""},
- {buildin_divorce,"divorce",""},
- {buildin_getitemname,"getitemname","i"},
- {buildin_makepet,"makepet","i"},
- {buildin_getexp,"getexp","ii"},
- {buildin_getinventorylist,"getinventorylist",""},
- {buildin_getskilllist,"getskilllist",""},
- {buildin_clearitem,"clearitem",""},
- {buildin_classchange,"classchange","ii"},
- {buildin_misceffect,"misceffect","i"},
- {buildin_soundeffect,"soundeffect","si"},
- {buildin_strmobinfo,"strmobinfo","ii"}, // display mob data [Valaris]
- {buildin_guardian,"guardian","siisii*i"}, // summon guardians
- {buildin_guardianinfo,"guardianinfo","i"}, // display guardian data [Valaris]
- {buildin_petskillbonus,"petskillbonus","iiii"}, // [Valaris]
- {buildin_petrecovery,"petrecovery","ii"}, // [Valaris]
- {buildin_petloot,"petloot","i"}, // [Valaris]
- {buildin_petheal,"petheal","iii"}, // [Valaris]
- {buildin_petmag,"petmag","iiii"}, // [Valaris]
- {buildin_petskillattack,"petskillattack","iiii"}, // [Valaris]
- {buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris]
- {buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris]
- {buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris]
- {buildin_nude,"nude",""}, // nude command [Valaris]
- {buildin_mapwarp,"mapwarp","ssii"}, // Added by RoVeRT
- {buildin_inittimer,"inittimer",""},
- {buildin_stoptimer,"stoptimer",""},
- {buildin_cmdothernpc,"cmdothernpc","ss"},
- {buildin_gmcommand,"gmcommand","*"}, // [MouseJstr]
-// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr]
- {buildin_message,"message","s*"}, // [MouseJstr]
- {buildin_npctalk,"npctalk","*"}, // [Valaris]
- {buildin_hasitems,"hasitems","*"}, // [Valaris]
- {buildin_mobcount,"mobcount","ss"},
- {buildin_getlook,"getlook","i"},
- {buildin_getsavepoint,"getsavepoint","i"},
- {buildin_npcspeed,"npcspeed","i"}, // [Valaris]
- {buildin_npcwalkto,"npcwalkto","ii"}, // [Valaris]
- {buildin_npcstop,"npcstop",""}, // [Valaris]
- {buildin_getmapxy,"getmapxy","siii*"}, //by Lorky [Lupus]
- {NULL,NULL,NULL},
-};
-int buildin_message(struct script_state *st); // [MouseJstr]
-
-
-enum {
- C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG,
- C_NAME,C_EOL, C_RETINFO,
-
- C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator
- C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT,C_R_SHIFT,C_L_SHIFT
-};
-
-/*==========================================
- * •¶Žš—ñ‚̃nƒbƒVƒ…‚ðŒvŽZ
- *------------------------------------------
- */
-static int calc_hash(const unsigned char *p)
-{
- int h=0;
- while(*p){
- h=(h<<1)+(h>>3)+(h>>5)+(h>>8);
- h+=*p++;
- }
- return h&15;
-}
-
-/*==========================================
- * str_data‚Ì’†‚É–¼‘O‚ª‚ ‚é‚©ŒŸõ‚·‚é
- *------------------------------------------
- */
-// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Î-1
-static int search_str(const unsigned char *p)
-{
- int i;
- i=str_hash[calc_hash(p)];
- while(i){
- if(strcmp(str_buf+str_data[i].str,p)==0){
- return i;
- }
- i=str_data[i].next;
- }
- return -1;
-}
-
-/*==========================================
- * str_data‚É–¼‘O‚ð“o˜^
- *------------------------------------------
- */
-// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Γo˜^‚µ‚ÄV‹K”Ô†
-static int add_str(const unsigned char *p)
-{
- int i;
- char *lowcase;
-
- lowcase=strdup(p);
- for(i=0;lowcase[i];i++)
- lowcase[i]=tolower(lowcase[i]);
- if((i=search_str(lowcase))>=0){
- free(lowcase);
- return i;
- }
- free(lowcase);
-
- i=calc_hash(p);
- if(str_hash[i]==0){
- str_hash[i]=str_num;
- } else {
- i=str_hash[i];
- for(;;){
- if(strcmp(str_buf+str_data[i].str,p)==0){
- return i;
- }
- if(str_data[i].next==0)
- break;
- i=str_data[i].next;
- }
- str_data[i].next=str_num;
- }
- if(str_num>=str_data_size){
- str_data_size+=128;
- str_data=aRealloc(str_data,sizeof(str_data[0])*str_data_size);
- memset(str_data + (str_data_size - 128), '\0', 128);
- }
- while(str_pos+strlen(p)+1>=str_size){
- str_size+=256;
- str_buf=(char *)aRealloc(str_buf,str_size);
- memset(str_buf + (str_size - 256), '\0', 256);
- }
- strcpy(str_buf+str_pos,p);
- str_data[str_num].type=C_NOP;
- str_data[str_num].str=str_pos;
- str_data[str_num].next=0;
- str_data[str_num].func=NULL;
- str_data[str_num].backpatch=-1;
- str_data[str_num].label=-1;
- str_pos+=strlen(p)+1;
- return str_num++;
-}
-
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@ƒTƒCƒY‚ÌŠm”F‚ÆŠg’£
- *------------------------------------------
- */
-static void check_script_buf(int size)
-{
- if(script_pos+size>=script_size){
- script_size+=SCRIPT_BLOCK_SIZE;
- script_buf=(char *)aRealloc(script_buf,script_size);
- memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
- SCRIPT_BLOCK_SIZE);
- }
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É‚PƒoƒCƒg‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scriptb(int a)
-{
- check_script_buf(1);
- script_buf[script_pos++]=a;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀf[ƒ^ƒ^ƒCƒv‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scriptc(int a)
-{
- while(a>=0x40){
- add_scriptb((a&0x3f)|0x40);
- a=(a-0x40)>>6;
- }
- add_scriptb(a&0x3f);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É®”‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-static void add_scripti(int a)
-{
- while(a>=0x40){
- add_scriptb(a|0xc0);
- a=(a-0x40)>>6;
- }
- add_scriptb(a|0x80);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀ‰ƒxƒ‹/•Ï”/ŠÖ”‚ð‘‚«ž‚Þ
- *------------------------------------------
- */
-// Å‘å16M‚Ü‚Å
-static void add_scriptl(int l)
-{
- int backpatch = str_data[l].backpatch;
-
- switch(str_data[l].type){
- case C_POS:
- add_scriptc(C_POS);
- add_scriptb(str_data[l].label);
- add_scriptb(str_data[l].label>>8);
- add_scriptb(str_data[l].label>>16);
- break;
- case C_NOP:
- // ƒ‰ƒxƒ‹‚̉”\«‚ª‚ ‚é‚Ì‚Åbackpatch—pƒf[ƒ^–„‚ßž‚Ý
- add_scriptc(C_NAME);
- str_data[l].backpatch=script_pos;
- add_scriptb(backpatch);
- add_scriptb(backpatch>>8);
- add_scriptb(backpatch>>16);
- break;
- case C_INT:
- add_scripti(str_data[l].val);
- break;
- default:
- // ‚à‚¤‘¼‚Ì—p“r‚ÆŠm’肵‚Ä‚é‚Ì‚Å”Žš‚ð‚»‚Ì‚Ü‚Ü
- add_scriptc(C_NAME);
- add_scriptb(l);
- add_scriptb(l>>8);
- add_scriptb(l>>16);
- break;
- }
-}
-
-/*==========================================
- * ƒ‰ƒxƒ‹‚ð‰ðŒˆ‚·‚é
- *------------------------------------------
- */
-void set_label(int l,int pos)
-{
- int i,next;
-
- str_data[l].type=C_POS;
- str_data[l].label=pos;
- for(i=str_data[l].backpatch;i>=0 && i!=0x00ffffff;){
- next=(*(int*)(script_buf+i)) & 0x00ffffff;
- script_buf[i-1]=C_POS;
- script_buf[i]=pos;
- script_buf[i+1]=pos>>8;
- script_buf[i+2]=pos>>16;
- i=next;
- }
-}
-
-/*==========================================
- * ƒXƒy[ƒX/ƒRƒƒ“ƒg“Ç‚Ý”ò‚΂µ
- *------------------------------------------
- */
-static unsigned char *skip_space(unsigned char *p)
-{
- while(1){
- while(isspace(*p))
- p++;
- if(p[0]=='/' && p[1]=='/'){
- while(*p && *p!='\n')
- p++;
- } else if(p[0]=='/' && p[1]=='*'){
- p++;
- while(*p && (p[-1]!='*' || p[0]!='/'))
- p++;
- if(*p) p++;
- } else
- break;
- }
- return p;
-}
-
-/*==========================================
- * ‚P’PŒêƒXƒLƒbƒv
- *------------------------------------------
- */
-static unsigned char *skip_word(unsigned char *p)
-{
- // prefix
- if(*p=='$') p++; // MAPŽI“à‹¤—L•Ï”—p
- if(*p=='@') p++; // ˆêŽž“I•Ï”—p(like weiss)
- if(*p=='#') p++; // account•Ï”—p
- if(*p=='#') p++; // ƒ[ƒ‹ƒhaccount•Ï”—p
- if(*p=='l') p++; // ˆêŽž“I•Ï”—p(like weiss)
-
- while(isalnum(*p)||*p=='_'|| *p>=0x81)
- if(*p>=0x81 && p[1]){
- p+=2;
- } else
- p++;
-
- // postfix
- if(*p=='$') p++; // •¶Žš—ñ•Ï”
-
- return p;
-}
-
-static unsigned char *startptr;
-static int startline;
-
-/*==========================================
- * ƒGƒ‰[ƒƒbƒZ[ƒWo—Í
- *------------------------------------------
- */
-static void disp_error_message(const char *mes,const unsigned char *pos)
-{
- int line,c=0,i;
- unsigned char *p,*linestart,*lineend;
-
- for(line=startline,p=startptr;p && *p;line++){
- linestart=p;
- lineend=strchr(p,'\n');
- if(lineend){
- c=*lineend;
- *lineend=0;
- }
- if(lineend==NULL || pos<lineend){
- printf("%s line %d : ",mes,line);
- for(i=0;(linestart[i]!='\r') && (linestart[i]!='\n') && linestart[i];i++){
- if(linestart+i!=pos)
- printf("%c",linestart[i]);
- else
- printf("\'%c\'",linestart[i]);
- }
- printf("\a\n");
- if(lineend)
- *lineend=c;
- return;
- }
- *lineend=c;
- p=lineend+1;
- }
-}
-
-/*==========================================
- * €‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_simpleexpr(unsigned char *p)
-{
- int i;
- p=skip_space(p);
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_simpleexpr %s\n",p);
-#endif
- if(*p==';' || *p==','){
- disp_error_message("unexpected expr end",p);
- exit(1);
- }
- if(*p=='('){
-
- p=parse_subexpr(p+1,-1);
- p=skip_space(p);
- if((*p++)!=')'){
- disp_error_message("unmatch ')'",p);
- exit(1);
- }
- } else if(isdigit(*p) || ((*p=='-' || *p=='+') && isdigit(p[1]))){
- char *np;
- i=strtoul(p,&np,0);
- add_scripti(i);
- p=np;
- } else if(*p=='"'){
- add_scriptc(C_STR);
- p++;
- while(*p && *p!='"'){
- if(p[-1]<=0x7e && *p=='\\')
- p++;
- else if(*p=='\n'){
- disp_error_message("unexpected newline @ string",p);
- exit(1);
- }
- add_scriptb(*p++);
- }
- if(!*p){
- disp_error_message("unexpected eof @ string",p);
- exit(1);
- }
- add_scriptb(0);
- p++; //'"'
- } else {
- int c,l;
- char *p2;
- // label , register , function etc
- if(skip_word(p)==p){
- disp_error_message("unexpected character",p);
- exit(1);
- }
- p2=skip_word(p);
- c=*p2; *p2=0; // –¼‘O‚ðadd_str‚·‚é
- l=add_str(p);
-
- parse_cmd=l; // warn_*_mismatch_paramnum‚Ì‚½‚ß‚É•K—v
- if(l==search_str("if")) // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
- parse_cmd_if++;
-/*
- // ”pŽ~—\’è‚Ìl14/l15,‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒX‚Œ‚ÌŒx
- if( strcmp(str_buf+str_data[l].str,"l14")==0 ||
- strcmp(str_buf+str_data[l].str,"l15")==0 ){
- disp_error_message("l14 and l15 is DEPRECATED. use @menu instead of l15.",p);
- }else if(str_buf[str_data[l].str]=='l'){
- disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2);
- }
-*/
- *p2=c; p=p2;
-
- if(str_data[l].type!=C_FUNC && c=='['){
- // array(name[i] => getelementofarray(name,i) )
- add_scriptl(search_str("getelementofarray"));
- add_scriptc(C_ARG);
- add_scriptl(l);
- p=parse_subexpr(p+1,-1);
- p=skip_space(p);
- if((*p++)!=']'){
- disp_error_message("unmatch ']'",p);
- exit(1);
- }
- add_scriptc(C_FUNC);
- }else
- add_scriptl(l);
-
- }
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_simpleexpr end %s\n",p);
-#endif
- return p;
-}
-
-/*==========================================
- * Ž®‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_subexpr(unsigned char *p,int limit)
-{
- int op,opl,len;
- char *tmpp;
-
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_subexpr %s\n",p);
-#endif
- p=skip_space(p);
-
- if(*p=='-'){
- tmpp=skip_space(p+1);
- if(*tmpp==';' || *tmpp==','){
- add_scriptl(LABEL_NEXTLINE);
- p++;
- return p;
- }
- }
- tmpp=p;
- if((op=C_NEG,*p=='-') || (op=C_LNOT,*p=='!') || (op=C_NOT,*p=='~')){
- p=parse_subexpr(p+1,100);
- add_scriptc(op);
- } else
- p=parse_simpleexpr(p);
- p=skip_space(p);
- while(((op=C_ADD,opl=6,len=1,*p=='+') ||
- (op=C_SUB,opl=6,len=1,*p=='-') ||
- (op=C_MUL,opl=7,len=1,*p=='*') ||
- (op=C_DIV,opl=7,len=1,*p=='/') ||
- (op=C_MOD,opl=7,len=1,*p=='%') ||
- (op=C_FUNC,opl=8,len=1,*p=='(') ||
- (op=C_LAND,opl=1,len=2,*p=='&' && p[1]=='&') ||
- (op=C_AND,opl=5,len=1,*p=='&') ||
- (op=C_LOR,opl=0,len=2,*p=='|' && p[1]=='|') ||
- (op=C_OR,opl=4,len=1,*p=='|') ||
- (op=C_XOR,opl=3,len=1,*p=='^') ||
- (op=C_EQ,opl=2,len=2,*p=='=' && p[1]=='=') ||
- (op=C_NE,opl=2,len=2,*p=='!' && p[1]=='=') ||
- (op=C_R_SHIFT,opl=5,len=2,*p=='>' && p[1]=='>') ||
- (op=C_GE,opl=2,len=2,*p=='>' && p[1]=='=') ||
- (op=C_GT,opl=2,len=1,*p=='>') ||
- (op=C_L_SHIFT,opl=5,len=2,*p=='<' && p[1]=='<') ||
- (op=C_LE,opl=2,len=2,*p=='<' && p[1]=='=') ||
- (op=C_LT,opl=2,len=1,*p=='<')) && opl>limit){
- p+=len;
- if(op==C_FUNC){
- int i=0,func=parse_cmd;
- const char *plist[128];
-
- if( str_data[func].type!=C_FUNC ){
- disp_error_message("expect function",tmpp);
- exit(0);
- }
-
- add_scriptc(C_ARG);
- do {
- plist[i]=p;
- p=parse_subexpr(p,-1);
- p=skip_space(p);
- if(*p==',') p++;
- else if(*p!=')' && script_config.warn_func_no_comma){
- disp_error_message("expect ',' or ')' at func params",p);
- }
- p=skip_space(p);
- i++;
- } while(*p && *p!=')' && i<128);
- plist[i]=p;
- if(*(p++)!=')'){
- disp_error_message("func request '(' ')'",p);
- exit(1);
- }
-
- if( str_data[func].type==C_FUNC && script_config.warn_func_mismatch_paramnum){
- const char *arg=buildin_func[str_data[func].val].arg;
- int j=0;
- for(j=0;arg[j];j++) if(arg[j]=='*')break;
- if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
- disp_error_message("illegal number of parameters",plist[(i<j)?i:j]);
- }
- }
- } else {
- p=parse_subexpr(p,opl);
- }
- add_scriptc(op);
- p=skip_space(p);
- }
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_subexpr end %s\n",p);
-#endif
- return p; /* return first untreated operator */
-}
-
-/*==========================================
- * Ž®‚Ì•]‰¿
- *------------------------------------------
- */
-unsigned char* parse_expr(unsigned char *p)
-{
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_expr %s\n",p);
-#endif
- switch(*p){
- case ')': case ';': case ':': case '[': case ']':
- case '}':
- disp_error_message("unexpected char",p);
- exit(1);
- }
- p=parse_subexpr(p,-1);
-#ifdef DEBUG_FUNCIN
- if(battle_config.etc_log)
- printf("parse_expr end %s\n",p);
-#endif
- return p;
-}
-
-/*==========================================
- * s‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_line(unsigned char *p)
-{
- int i=0,cmd;
- const char *plist[128];
- char *p2;
-
- p=skip_space(p);
- if(*p==';')
- return p;
-
- parse_cmd_if=0; // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
-
- // ʼn‚ÍŠÖ”–¼
- p2=p;
- p=parse_simpleexpr(p);
- p=skip_space(p);
-
- cmd=parse_cmd;
- if( str_data[cmd].type!=C_FUNC ){
- disp_error_message("expect command",p2);
-// exit(0);
- }
-
- add_scriptc(C_ARG);
- while(p && *p && *p!=';' && i<128){
- plist[i]=p;
-
- p=parse_expr(p);
- p=skip_space(p);
- // ˆø”‹æØ‚è‚Ì,ˆ—
- if(*p==',') p++;
- else if(*p!=';' && script_config.warn_cmd_no_comma && parse_cmd_if*2<=i ){
- disp_error_message("expect ',' or ';' at cmd params",p);
- }
- p=skip_space(p);
- i++;
- }
- plist[i]=p;
- if(!p || *(p++)!=';'){
- disp_error_message("need ';'",p);
- exit(1);
- }
- add_scriptc(C_FUNC);
-
- if( str_data[cmd].type==C_FUNC && script_config.warn_cmd_mismatch_paramnum){
- const char *arg=buildin_func[str_data[cmd].val].arg;
- int j=0;
- for(j=0;arg[j];j++) if(arg[j]=='*')break;
- if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
- disp_error_message("illegal number of parameters",plist[(i<j)?i:j]);
- }
- }
-
-
- return p;
-}
-
-/*==========================================
- * ‘g‚Ýž‚ÝŠÖ”‚̒ljÁ
- *------------------------------------------
- */
-static void add_buildin_func(void)
-{
- int i,n;
- for(i=0;buildin_func[i].func;i++){
- n=add_str(buildin_func[i].name);
- str_data[n].type=C_FUNC;
- str_data[n].val=i;
- str_data[n].func=buildin_func[i].func;
- }
-}
-
-/*==========================================
- * ’蔃f[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static void read_constdb(void)
-{
- FILE *fp;
- char line[1024],name[1024];
- int val,n,i,type;
-
- fp=fopen("db/const.txt","r");
- if(fp==NULL){
- printf("can't read db/const.txt\n");
- return ;
- }
- while(fgets(line,1020,fp)){
- if(line[0]=='/' && line[1]=='/')
- continue;
- type=0;
- if(sscanf(line,"%[A-Za-z0-9_],%d,%d",name,&val,&type)>=2 ||
- sscanf(line,"%[A-Za-z0-9_] %d %d",name,&val,&type)>=2){
- for(i=0;name[i];i++)
- name[i]=tolower(name[i]);
- n=add_str(name);
- if(type==0)
- str_data[n].type=C_INT;
- else
- str_data[n].type=C_PARAM;
- str_data[n].val=val;
- }
- }
- fclose(fp);
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚̉ðÍ
- *------------------------------------------
- */
-unsigned char* parse_script(unsigned char *src,int line)
-{
- unsigned char *p,*tmpp;
- int i;
- static int first=1;
-
- if(first){
- add_buildin_func();
- read_constdb();
- }
- first=0;
- script_buf=(unsigned char *)aCalloc(SCRIPT_BLOCK_SIZE,sizeof(unsigned char));
- script_pos=0;
- script_size=SCRIPT_BLOCK_SIZE;
- str_data[LABEL_NEXTLINE].type=C_NOP;
- str_data[LABEL_NEXTLINE].backpatch=-1;
- str_data[LABEL_NEXTLINE].label=-1;
- for(i=LABEL_START;i<str_num;i++){
- if(str_data[i].type==C_POS || str_data[i].type==C_NAME){
- str_data[i].type=C_NOP;
- str_data[i].backpatch=-1;
- str_data[i].label=-1;
- }
- }
-
- // ŠO•”—plabel db‚̉Šú‰»
- if(scriptlabel_db!=NULL)
- strdb_final(scriptlabel_db,scriptlabel_final);
- scriptlabel_db=strdb_init(50);
-
- // for error message
- startptr = src;
- startline = line;
-
- p=src;
- p=skip_space(p);
- if(*p!='{'){
- disp_error_message("not found '{'",p);
- return NULL;
- }
- for(p++;p && *p && *p!='}';){
- p=skip_space(p);
- // label‚¾‚¯“ÁŽêˆ—
- tmpp=skip_space(skip_word(p));
- if(*tmpp==':'){
- int l,c;
-
- c=*skip_word(p);
- *skip_word(p)=0;
- l=add_str(p);
- if(str_data[l].label!=-1){
- *skip_word(p)=c;
- disp_error_message("dup label ",p);
- exit(1);
- }
- set_label(l,script_pos);
- strdb_insert(scriptlabel_db,p,script_pos); // ŠO•”—plabel db“o˜^
- *skip_word(p)=c;
- p=tmpp+1;
- continue;
- }
-
- // ‘¼‚Í‘S•”ˆê‚­‚½
- p=parse_line(p);
- p=skip_space(p);
- add_scriptc(C_EOL);
-
- set_label(LABEL_NEXTLINE,script_pos);
- str_data[LABEL_NEXTLINE].type=C_NOP;
- str_data[LABEL_NEXTLINE].backpatch=-1;
- str_data[LABEL_NEXTLINE].label=-1;
- }
-
- add_scriptc(C_NOP);
-
- script_size = script_pos;
- script_buf=(char *)aRealloc(script_buf,script_pos + 1);
-
- // –¢‰ðŒˆ‚̃‰ƒxƒ‹‚ð‰ðŒˆ
- for(i=LABEL_START;i<str_num;i++){
- if(str_data[i].type==C_NOP){
- int j,next;
- str_data[i].type=C_NAME;
- str_data[i].label=i;
- for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){
- next=(*(int*)(script_buf+j)) & 0x00ffffff;
- script_buf[j]=i;
- script_buf[j+1]=i>>8;
- script_buf[j+2]=i>>16;
- j=next;
- }
- }
- }
-
-#ifdef DEBUG_DISP
- for(i=0;i<script_pos;i++){
- if((i&15)==0) printf("%04x : ",i);
- printf("%02x ",script_buf[i]);
- if((i&15)==15) printf("\n");
- }
- printf("\n");
-#endif
-
- return script_buf;
-}
-
-//
-// ŽÀsŒn
-//
-enum {STOP=1,END,RERUNLINE,GOTO,RETFUNC};
-
-/*==========================================
- * rid‚©‚çsd‚ւ̉ðŒˆ
- *------------------------------------------
- */
-struct map_session_data *script_rid2sd(struct script_state *st)
-{
- struct map_session_data *sd=map_id2sd(st->rid);
- if(!sd){
- printf("script_rid2sd: fatal error ! player not attached!\n");
- }
- return sd;
-}
-
-
-/*==========================================
- * •Ï”‚Ì“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-int get_val(struct script_state*st,struct script_data* data)
-{
- struct map_session_data *sd=NULL;
- if(data->type==C_NAME){
- char *name=str_buf+str_data[data->u.num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if(prefix!='$'){
- if((sd=script_rid2sd(st))==NULL)
- printf("get_val error name?:%s\n",name);
- }
- if(postfix=='$'){
-
- data->type=C_CONSTSTR;
- if( prefix=='@' || prefix=='l' ){
- if(sd)
- data->u.str = pc_readregstr(sd,data->u.num);
- }else if(prefix=='$'){
- data->u.str = (char *)numdb_search(mapregstr_db,data->u.num);
- }else{
- printf("script: get_val: illegal scope string variable.\n");
- data->u.str = "!!ERROR!!";
- }
- if( data->u.str == NULL )
- data->u.str ="";
-
- }else{
-
- data->type=C_INT;
- if(str_data[data->u.num&0x00ffffff].type==C_INT){
- data->u.num = str_data[data->u.num&0x00ffffff].val;
- }else if(str_data[data->u.num&0x00ffffff].type==C_PARAM){
- if(sd)
- data->u.num = pc_readparam(sd,str_data[data->u.num&0x00ffffff].val);
- }else if(prefix=='@' || prefix=='l'){
- if(sd)
- data->u.num = pc_readreg(sd,data->u.num);
- }else if(prefix=='$'){
- data->u.num = (int)numdb_search(mapreg_db,data->u.num);
- }else if(prefix=='#'){
- if( name[1]=='#'){
- if(sd)
- data->u.num = pc_readaccountreg2(sd,name);
- }else{
- if(sd)
- data->u.num = pc_readaccountreg(sd,name);
- }
- }else{
- if(sd)
- data->u.num = pc_readglobalreg(sd,name);
- }
- }
- }
- return 0;
-}
-/*==========================================
- * •Ï”‚Ì“Ç‚ÝŽæ‚è2
- *------------------------------------------
- */
-void* get_val2(struct script_state*st,int num)
-{
- struct script_data dat;
- dat.type=C_NAME;
- dat.u.num=num;
- get_val(st,&dat);
- if( dat.type==C_INT ) return (void*)dat.u.num;
- else return (void*)dat.u.str;
-}
-
-/*==========================================
- * •Ï”Ý’è—p
- *------------------------------------------
- */
-static int set_reg(struct map_session_data *sd,int num,char *name,void *v)
-{
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( postfix=='$' ){
- char *str=(char*)v;
- if( prefix=='@' || prefix=='l'){
- pc_setregstr(sd,num,str);
- }else if(prefix=='$') {
- mapreg_setregstr(num,str);
- }else{
- printf("script: set_reg: illegal scope string variable !");
- }
- }else{
- // ”’l
- int val = (int)v;
- if(str_data[num&0x00ffffff].type==C_PARAM){
- pc_setparam(sd,str_data[num&0x00ffffff].val,val);
- }else if(prefix=='@' || prefix=='l') {
- pc_setreg(sd,num,val);
- }else if(prefix=='$') {
- mapreg_setreg(num,val);
- }else if(prefix=='#') {
- if( name[1]=='#' )
- pc_setaccountreg2(sd,name,val);
- else
- pc_setaccountreg(sd,name,val);
- }else{
- pc_setglobalreg(sd,name,val);
- }
- }
- return 0;
-}
-
-/*==========================================
- * •¶Žš—ñ‚Ö‚Ì•ÏŠ·
- *------------------------------------------
- */
-char* conv_str(struct script_state *st,struct script_data *data)
-{
- get_val(st,data);
- if(data->type==C_INT){
- char *buf;
- buf=(char *)aCalloc(16,sizeof(char));
- sprintf(buf,"%d",data->u.num);
- data->type=C_STR;
- data->u.str=buf;
-#if 1
- } else if(data->type==C_NAME){
- // ƒeƒ“ƒ|ƒ‰ƒŠB–{—ˆ–³‚¢‚Í‚¸
- data->type=C_CONSTSTR;
- data->u.str=str_buf+str_data[data->u.num].str;
-#endif
- }
- return data->u.str;
-}
-
-/*==========================================
- * ”’l‚Ö•ÏŠ·
- *------------------------------------------
- */
-int conv_num(struct script_state *st,struct script_data *data)
-{
- char *p;
- get_val(st,data);
- if(data->type==C_STR || data->type==C_CONSTSTR){
- p=data->u.str;
- data->u.num = atoi(p);
- if(data->type==C_STR)
- free(p);
- data->type=C_INT;
- }
- return data->u.num;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö”’l‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_val(struct script_stack *stack,int type,int val)
-{
- if(stack->sp >= stack->sp_max){
- stack->sp_max += 64;
- stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
- sizeof(stack->stack_data[0]) * stack->sp_max);
- memset(stack->stack_data + (stack->sp_max - 64), 0,
- 64 * sizeof(*(stack->stack_data)));
- }
-// if(battle_config.etc_log)
-// printf("push (%d,%d)-> %d\n",type,val,stack->sp);
- stack->stack_data[stack->sp].type=type;
- stack->stack_data[stack->sp].u.num=val;
- stack->sp++;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö•¶Žš—ñ‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_str(struct script_stack *stack,int type,unsigned char *str)
-{
- if(stack->sp>=stack->sp_max){
- stack->sp_max += 64;
- stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
- sizeof(stack->stack_data[0]) * stack->sp_max);
- memset(stack->stack_data + (stack->sp_max - 64), '\0',
- 64 * sizeof(*(stack->stack_data)));
- }
-// if(battle_config.etc_log)
-// printf("push (%d,%x)-> %d\n",type,str,stack->sp);
- stack->stack_data[stack->sp].type=type;
- stack->stack_data[stack->sp].u.str=str;
- stack->sp++;
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚Ö•¡»‚ðƒvƒbƒVƒ…
- *------------------------------------------
- */
-void push_copy(struct script_stack *stack,int pos)
-{
- switch(stack->stack_data[pos].type){
- case C_CONSTSTR:
- push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str);
- break;
- case C_STR:
- push_str(stack,C_STR,strdup(stack->stack_data[pos].u.str));
- break;
- default:
- push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num);
- break;
- }
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚©‚çƒ|ƒbƒv
- *------------------------------------------
- */
-void pop_stack(struct script_stack* stack,int start,int end)
-{
- int i;
- for(i=start;i<end;i++){
- if(stack->stack_data[i].type==C_STR){
- free(stack->stack_data[i].u.str);
- }
- }
- if(stack->sp>end){
- memmove(&stack->stack_data[start],&stack->stack_data[end],sizeof(stack->stack_data[0])*(stack->sp-end));
- }
- stack->sp-=end-start;
-}
-
-//
-// –„‚ßž‚ÝŠÖ”
-//
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_mes(struct script_state *st)
-{
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- clif_scriptmes(script_rid2sd(st),st->oid,st->stack->stack_data[st->start+2].u.str);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_goto(struct script_state *st)
-{
- int pos;
-
- if( st->stack->stack_data[st->start+2].type!=C_POS ){
- printf("script: goto: not label !\n");
- st->state=END;
- return 0;
- }
-
- pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
- st->pos=pos;
- st->state=GOTO;
- return 0;
-}
-
-/*==========================================
- * ƒ†[ƒU[’è‹`ŠÖ”‚̌ĂÑo‚µ
- *------------------------------------------
- */
-int buildin_callfunc(struct script_state *st)
-{
- char *scr;
- char *str=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if( (scr=strdb_search(script_get_userfunc_db(),str)) ){
- int i,j;
- for(i=st->start+3,j=0;i<st->end;i++,j++)
- push_copy(st->stack,i);
-
- push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
-
- st->pos=0;
- st->script=scr;
- st->defsp=st->start+4+j;
- st->state=GOTO;
- }else{
- printf("script:callfunc: function not found! [%s]\n",str);
- st->state=END;
- }
- return 0;
-}
-/*==========================================
- * ƒTƒuƒ‹[ƒeƒBƒ“‚̌ĂÑo‚µ
- *------------------------------------------
- */
-int buildin_callsub(struct script_state *st)
-{
- int pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int i,j;
- for(i=st->start+3,j=0;i<st->end;i++,j++)
- push_copy(st->stack,i);
-
- push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
- push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
-
- st->pos=pos;
- st->defsp=st->start+4+j;
- st->state=GOTO;
- return 0;
-}
-
-/*==========================================
- * ˆø”‚ÌŠ“¾
- *------------------------------------------
- */
-int buildin_getarg(struct script_state *st)
-{
- int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int max,stsp;
- if( st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO ){
- printf("script:getarg without callfunc or callsub!\n");
- st->state=END;
- return 0;
- }
- max=conv_num(st,& (st->stack->stack_data[st->defsp-4]));
- stsp=st->defsp - max -4;
- if( num >= max ){
- printf("script:getarg arg1(%d) out of range(%d) !\n",num,max);
- st->state=END;
- return 0;
- }
- push_copy(st->stack,stsp+num);
- return 0;
-}
-
-/*==========================================
- * ƒTƒuƒ‹[ƒ`ƒ“/ƒ†[ƒU[’è‹`ŠÖ”‚ÌI—¹
- *------------------------------------------
- */
-int buildin_return(struct script_state *st)
-{
- if(st->end>st->start+2){ // –ß‚è’l—L‚è
- push_copy(st->stack,st->start+2);
- }
- st->state=RETFUNC;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_next(struct script_state *st)
-{
- st->state=STOP;
- clif_scriptnext(script_rid2sd(st),st->oid);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_close(struct script_state *st)
-{
- st->state=END;
- clif_scriptclose(script_rid2sd(st),st->oid);
- return 0;
-}
-int buildin_close2(struct script_state *st)
-{
- st->state=STOP;
- clif_scriptclose(script_rid2sd(st),st->oid);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_menu(struct script_state *st)
-{
- char *buf;
- int len,i;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(sd->state.menu_or_input==0){
- st->state=RERUNLINE;
- sd->state.menu_or_input=1;
- for(i=st->start+2,len=16;i<st->end;i+=2){
- conv_str(st,& (st->stack->stack_data[i]));
- len+=strlen(st->stack->stack_data[i].u.str)+1;
- }
- buf=(char *)aCalloc(len,sizeof(char));
- buf[0]=0;
- for(i=st->start+2,len=0;i<st->end;i+=2){
- strcat(buf,st->stack->stack_data[i].u.str);
- strcat(buf,":");
- }
- clif_scriptmenu(script_rid2sd(st),st->oid,buf);
- free(buf);
- } else if(sd->npc_menu==0xff){ // cansel
- sd->state.menu_or_input=0;
- st->state=END;
- } else { // goto“®ì
- // ragemuŒÝŠ·‚Ì‚½‚ß
- pc_setreg(sd,add_str("l15"),sd->npc_menu);
- pc_setreg(sd,add_str("@menu"),sd->npc_menu);
- sd->state.menu_or_input=0;
- if(sd->npc_menu>0 && sd->npc_menu<(st->end-st->start)/2){
- int pos;
- if( st->stack->stack_data[st->start+sd->npc_menu*2+1].type!=C_POS ){
- printf("script: menu: not label !\n");
- st->state=END;
- return 0;
- }
- pos=conv_num(st,& (st->stack->stack_data[st->start+sd->npc_menu*2+1]));
- st->pos=pos;
- st->state=GOTO;
- }
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_rand(struct script_state *st)
-{
- int range,min,max;
-
- if(st->end>st->start+3){
- min=conv_num(st,& (st->stack->stack_data[st->start+2]));
- max=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(max<min){
- int tmp;
- tmp=min;
- min=max;
- max=tmp;
- }
- range=max-min+1;
- push_val(st->stack,C_INT,rand()%range+min);
- } else {
- range=conv_num(st,& (st->stack->stack_data[st->start+2]));
- push_val(st->stack,C_INT,rand()%range);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_warp(struct script_state *st)
-{
- int x,y;
- char *str;
- struct map_session_data *sd=script_rid2sd(st);
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- if(strcmp(str,"Random")==0)
- pc_randomwarp(sd,3);
- else if(strcmp(str,"SavePoint")==0){
- if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else if(strcmp(str,"Save")==0){
- if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else
- pc_setpos(sd,str,x,y,0);
- return 0;
-}
-/*==========================================
- * ƒGƒŠƒAŽw’èƒ[ƒv
- *------------------------------------------
- */
-int buildin_areawarp_sub(struct block_list *bl,va_list ap)
-{
- int x,y;
- char *map;
- map=va_arg(ap, char *);
- x=va_arg(ap,int);
- y=va_arg(ap,int);
- if(strcmp(map,"Random")==0)
- pc_randomwarp((struct map_session_data *)bl,3);
- else
- pc_setpos((struct map_session_data *)bl,map,x,y,0);
- return 0;
-}
-int buildin_areawarp(struct script_state *st)
-{
- int x,y,m;
- char *str;
- char *mapname;
- int x0,y0,x1,y1;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- str=conv_str(st,& (st->stack->stack_data[st->start+7]));
- x=conv_num(st,& (st->stack->stack_data[st->start+8]));
- y=conv_num(st,& (st->stack->stack_data[st->start+9]));
-
- if( (m=map_mapname2mapid(mapname))< 0)
- return 0;
-
- map_foreachinarea(buildin_areawarp_sub,
- m,x0,y0,x1,y1,BL_PC, str,x,y );
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_heal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_heal(script_rid2sd(st),hp,sp);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_itemheal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_itemheal(script_rid2sd(st),hp,sp);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_percentheal(struct script_state *st)
-{
- int hp,sp;
-
- hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_percentheal(script_rid2sd(st),hp,sp);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_jobchange(struct script_state *st)
-{
- int job, upper=-1;
-
- job=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- upper=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if ((job >= 0 && job < MAX_PC_CLASS))
- pc_jobchange(script_rid2sd(st),job, upper);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_input(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0;
- char *name=(st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:"";
-// char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- sd=script_rid2sd(st);
- if(sd->state.menu_or_input){
- sd->state.menu_or_input=0;
- if( postfix=='$' ){
- // •¶Žš—ñ
- if(st->end>st->start+2){ // ˆø”1ŒÂ
- set_reg(sd,num,name,(void*)sd->npc_str);
- }else{
- printf("buildin_input: string discarded !!\n");
- }
- }else{
-
- //commented by Lupus (check Value Number Input fix in clif.c)
- //** Fix by fritz :X keeps people from abusing old input bugs
- if(sd->npc_amount < 0) //** If input amount is less then 0
- {
- clif_tradecancelled(sd); // added "Deal has been cancelled" message by Valaris
- buildin_close(st); //** close
- }
-
- // ”’l
- if(st->end>st->start+2){ // ˆø”1ŒÂ
- set_reg(sd,num,name,(void*)sd->npc_amount);
- } else {
- // ragemuŒÝŠ·‚Ì‚½‚ß
- pc_setreg(sd,add_str("l14"),sd->npc_amount);
- }
- }
- } else {
- st->state=RERUNLINE;
- if(postfix=='$')clif_scriptinputstr(sd,st->oid);
- else clif_scriptinput(sd,st->oid);
- sd->state.menu_or_input=1;
- }
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_if(struct script_state *st)
-{
- int sel,i;
-
- sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(!sel)
- return 0;
-
- // ŠÖ”–¼‚ðƒRƒs[
- push_copy(st->stack,st->start+3);
- // ŠÔ‚Ɉø”ƒ}[ƒJ‚ð“ü‚ê‚Ä
- push_val(st->stack,C_ARG,0);
- // Žc‚è‚̈ø”‚ðƒRƒs[
- for(i=st->start+4;i<st->end;i++){
- push_copy(st->stack,i);
- }
- run_func(st);
-
- return 0;
-}
-
-
-/*==========================================
- * •Ï”Ý’è
- *------------------------------------------
- */
-int buildin_set(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( st->stack->stack_data[st->start+2].type!=C_NAME ){
- printf("script: buildin_set: not name\n");
- return 0;
- }
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
-
- if( postfix=='$' ){
- // •¶Žš—ñ
- char *str = conv_str(st,& (st->stack->stack_data[st->start+3]));
- set_reg(sd,num,name,(void*)str);
- }else{
- // ”’l
- int val = conv_num(st,& (st->stack->stack_data[st->start+3]));
- set_reg(sd,num,name,(void*)val);
- }
-
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”Ý’è
- *------------------------------------------
- */
-int buildin_setarray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int i,j;
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_setarray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- for(j=0,i=st->start+3; i<st->end && j<128;i++,j++){
- void *v;
- if( postfix=='$' )
- v=(void*)conv_str(st,& (st->stack->stack_data[i]));
- else
- v=(void*)conv_num(st,& (st->stack->stack_data[i]));
- set_reg( sd, num+(j<<24), name, v);
- }
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”ƒNƒŠƒA
- *------------------------------------------
- */
-int buildin_cleararray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int i;
- void *v;
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_cleararray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- if( postfix=='$' )
- v=(void*)conv_str(st,& (st->stack->stack_data[st->start+3]));
- else
- v=(void*)conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- for(i=0;i<sz;i++)
- set_reg(sd,num+(i<<24),name,v);
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”ƒRƒs[
- *------------------------------------------
- */
-int buildin_copyarray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int num2=st->stack->stack_data[st->start+3].u.num;
- char *name2=str_buf+str_data[num2&0x00ffffff].str;
- char prefix2=*name2;
- char postfix2=name2[strlen(name2)-1];
- int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int i;
-
- if( prefix!='$' && prefix!='@' && prefix2!='$' && prefix2!='@' ){
- printf("buildin_copyarray: illegal scope !\n");
- return 0;
- }
- if( (postfix=='$' || postfix2=='$') && postfix!=postfix2 ){
- printf("buildin_copyarray: type mismatch !\n");
- return 0;
- }
- if( prefix!='$' || prefix2!='$' )
- sd=script_rid2sd(st);
-
-
- for(i=0;i<sz;i++)
- set_reg(sd,num+(i<<24),name, get_val2(st,num2+(i<<24)) );
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”‚̃TƒCƒYŠ“¾
- *------------------------------------------
- */
-static int getarraysize(struct script_state *st,int num,int postfix)
-{
- int i=(num>>24),c=i;
- for(;i<128;i++){
- void *v=get_val2(st,num+(i<<24));
- if(postfix=='$' && *((char*)v) ) c=i;
- if(postfix!='$' && (int)v )c=i;
- }
- return c+1;
-}
-int buildin_getarraysize(struct script_state *st)
-{
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_copyarray: illegal scope !\n");
- return 0;
- }
-
- push_val(st->stack,C_INT,getarraysize(st,num,postfix) );
- return 0;
-}
-/*==========================================
- * ”z—ñ•Ï”‚©‚ç—v‘fíœ
- *------------------------------------------
- */
-int buildin_deletearray(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int num=st->stack->stack_data[st->start+2].u.num;
- char *name=str_buf+str_data[num&0x00ffffff].str;
- char prefix=*name;
- char postfix=name[strlen(name)-1];
- int count=1;
- int i,sz=getarraysize(st,num,postfix)-(num>>24)-count+1;
-
-
- if( (st->end > st->start+3) )
- count=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if( prefix!='$' && prefix!='@' ){
- printf("buildin_deletearray: illegal scope !\n");
- return 0;
- }
- if( prefix!='$' )
- sd=script_rid2sd(st);
-
- for(i=0;i<sz;i++){
- set_reg(sd,num+(i<<24),name, get_val2(st,num+((i+count)<<24) ) );
- }
- for(;i<(128-(num>>24));i++){
- if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0);
- if( postfix=='$' ) set_reg(sd,num+(i<<24),name, "");
- }
- return 0;
-}
-
-/*==========================================
- * Žw’è—v‘f‚ð•\‚·’l(ƒL[)‚ðŠ“¾‚·‚é
- *------------------------------------------
- */
-int buildin_getelementofarray(struct script_state *st)
-{
- if( st->stack->stack_data[st->start+2].type==C_NAME ){
- int i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(i>127 || i<0){
- printf("script: getelementofarray (operator[]): param2 illegal number %d\n",i);
- push_val(st->stack,C_INT,0);
- }else{
- push_val(st->stack,C_NAME,
- (i<<24) | st->stack->stack_data[st->start+2].u.num );
- }
- }else{
- printf("script: getelementofarray (operator[]): param1 not name !\n");
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_setlook(struct script_state *st)
-{
- int type,val;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- pc_changelook(script_rid2sd(st),type,val);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_cutin(struct script_state *st)
-{
- int type;
-
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- clif_cutin(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str,type);
-
- return 0;
-}
-/*==========================================
- * ƒJ[ƒh‚̃Cƒ‰ƒXƒg‚ð•\Ž¦‚·‚é
- *------------------------------------------
- */
-int buildin_cutincard(struct script_state *st)
-{
- int itemid;
-
- itemid=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- clif_cutin(script_rid2sd(st),itemdb_search(itemid)->cardillustname,4);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_viewpoint(struct script_state *st)
-{
- int type,x,y,id,color;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- id=conv_num(st,& (st->stack->stack_data[st->start+5]));
- color=conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color);
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_countitem(struct script_state *st)
-{
- int nameid=0,count=0,i;
- struct map_session_data *sd;
-
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data;
- if( (item_data = itemdb_searchname(name)) != NULL)
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- if (nameid>=500) //if no such ID then skip this iteration
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==nameid)
- count+=sd->status.inventory[i].amount;
- }
- else{
- if(battle_config.error_log)
- printf("wrong item ID : countitem(%i)\n",nameid);
- }
- push_val(st->stack,C_INT,count);
-
- return 0;
-}
-
-/*==========================================
- * d—ʃ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_checkweight(struct script_state *st)
-{
- int nameid=0,amount;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if ( amount<=0 || nameid<500 ) { //if get wrong item ID or amount<=0, don't count weight of non existing items
- push_val(st->stack,C_INT,0);
- }
-
- sd=script_rid2sd(st);
- if(itemdb_weight(nameid)*amount + sd->weight > sd->max_weight){
- push_val(st->stack,C_INT,0);
- } else {
- push_val(st->stack,C_INT,1);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getitem(struct script_state *st)
-{
- int nameid,amount,flag = 0;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple item ID
- if( item_data != NULL)
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- if ( ( amount=conv_num(st,& (st->stack->stack_data[st->start+3])) ) <= 0) {
- return 0; //return if amount <=0, skip the useles iteration
- }
- //Violet Box, Blue Box, etc - random item pick
- if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
- nameid=itemdb_searchrandomid(-nameid);
- #ifndef TXT_ONLY
- if(log_config.present > 0)
- log_present(sd, -nameid, nameid);
- #endif //USE_SQL
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=1;
- else
- item_tmp.identify=!itemdb_isequip3(nameid);
- if( st->end>st->start+5 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+5])));
- if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
- return 0;
- if((flag = pc_additem(sd,&item_tmp,amount))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getitem2(struct script_state *st)
-{
- int nameid,amount,flag = 0;
- int iden,ref,attr,c1,c2,c3,c4;
- struct item_data *item_data;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple item ID
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- iden=conv_num(st,& (st->stack->stack_data[st->start+4]));
- ref=conv_num(st,& (st->stack->stack_data[st->start+5]));
- attr=conv_num(st,& (st->stack->stack_data[st->start+6]));
- c1=conv_num(st,& (st->stack->stack_data[st->start+7]));
- c2=conv_num(st,& (st->stack->stack_data[st->start+8]));
- c3=conv_num(st,& (st->stack->stack_data[st->start+9]));
- c4=conv_num(st,& (st->stack->stack_data[st->start+10]));
- if( st->end>st->start+11 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+11])));
- if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
- return 0;
-
- if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
- nameid=itemdb_searchrandomid(-nameid);
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_data=itemdb_search(nameid);
- if(item_data->type==4 || item_data->type==5){
- if(ref > 10) ref = 10;
- }
- else if(item_data->type==7) {
- iden = 1;
- ref = 0;
- }
- else {
- iden = 1;
- ref = attr = 0;
- }
-
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=iden;
- else if(item_data->type==4 || item_data->type==5)
- item_tmp.identify=0;
- item_tmp.refine=ref;
- item_tmp.attribute=attr;
- item_tmp.card[0]=c1;
- item_tmp.card[1]=c2;
- item_tmp.card[2]=c3;
- item_tmp.card[3]=c4;
- if((flag = pc_additem(sd,&item_tmp,amount))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_makeitem(struct script_state *st)
-{
- int nameid,amount,flag = 0;
- int x,y,m;
- char *mapname;
- struct item item_tmp;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- nameid=512; //Apple Item ID
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
- mapname =conv_str(st,& (st->stack->stack_data[st->start+4]));
- x =conv_num(st,& (st->stack->stack_data[st->start+5]));
- y =conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- if( sd && strcmp(mapname,"this")==0)
- m=sd->bl.m;
- else
- m=map_mapname2mapid(mapname);
-
- if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
- nameid=itemdb_searchrandomid(-nameid);
- flag = 1;
- }
-
- if(nameid > 0) {
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=nameid;
- if(!flag)
- item_tmp.identify=1;
- else
- item_tmp.identify=!itemdb_isequip3(nameid);
-
-// clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,amount,m,x,y,NULL,NULL,NULL,0);
- }
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_delitem(struct script_state *st)
-{
- int nameid=0,amount,i;
- struct map_session_data *sd;
- struct script_data *data;
-
- sd = script_rid2sd(st);
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- //nameid=512;
- if( item_data )
- nameid=item_data->nameid;
- }else
- nameid=conv_num(st,data);
-
- amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if (nameid<500 || amount<=0 ) {//by Lupus. Don't run FOR if u got wrong item ID or amount<=0
- //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount);
- return 0;
- }
- sd=script_rid2sd(st);
-
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
- sd->inventory_data[i]->type!=7 ||
- sd->status.inventory[i].amount<=0)
- continue;
- if(sd->status.inventory[i].nameid == nameid){
- if(sd->status.inventory[i].card[0] == (short)0xff00){
- if(search_petDB_index(nameid, PET_EGG) >= 0){
- intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1])));
- break;
- }
- }
- }
- }
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid==nameid){
- if(sd->status.inventory[i].amount>=amount){
- pc_delitem(sd,i,amount,0);
- break;
- } else {
- amount-=sd->status.inventory[i].amount;
- if(amount==0)
- amount=sd->status.inventory[i].amount;
- pc_delitem(sd,i,amount,0);
- break;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *ƒLƒƒƒ‰ŠÖŒW‚̃pƒ‰ƒ[ƒ^Žæ“¾
- *------------------------------------------
- */
-int buildin_readparam(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
-
- if(sd==NULL){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- push_val(st->stack,C_INT,pc_readparam(sd,type));
-
- return 0;
-}
-/*==========================================
- *ƒLƒƒƒ‰ŠÖŒW‚ÌIDŽæ“¾
- *------------------------------------------
- */
-int buildin_getcharid(struct script_state *st)
-{
- int num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end>st->start+3 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
- if(sd==NULL){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if(num==0)
- push_val(st->stack,C_INT,sd->status.char_id);
- if(num==1)
- push_val(st->stack,C_INT,sd->status.party_id);
- if(num==2)
- push_val(st->stack,C_INT,sd->status.guild_id);
- if(num==3)
- push_val(st->stack,C_INT,sd->status.account_id);
- return 0;
-}
-/*==========================================
- *Žw’èID‚ÌPT–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getpartyname_sub(int party_id)
-{
- struct party *p;
-
- p=NULL;
- p=party_search(party_id);
-
- if(p!=NULL){
- char *buf;
- buf=(char *)aCalloc(24,sizeof(char));
- strcpy(buf,p->name);
- return buf;
- }
-
- return 0;
-}
-int buildin_getpartyname(struct script_state *st)
-{
- char *name;
- int party_id;
-
- party_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- name=buildin_getpartyname_sub(party_id);
- if(name!=0)
- push_str(st->stack,C_STR,name);
- else
- push_str(st->stack,C_CONSTSTR,"null");
-
- return 0;
-}
-/*==========================================
- *Žw’èID‚ÌPTl”‚ƃƒ“ƒo[IDŽæ“¾
- *------------------------------------------
- */
-int buildin_getpartymember(struct script_state *st)
-{
- struct party *p;
- int i,j=0;
-
- p=NULL;
- p=party_search(conv_num(st,& (st->stack->stack_data[st->start+2])));
-
- if(p!=NULL){
- for(i=0;i<MAX_PARTY;i++){
- if(p->member[i].account_id){
-// printf("name:%s %d\n",p->member[i].name,i);
- mapreg_setregstr(add_str("$@partymembername$")+(i<<24),p->member[i].name);
- j++;
- }
- }
- }
- mapreg_setreg(add_str("$@partymembercount"),j);
-
- return 0;
-}
-/*==========================================
- *Žw’èID‚̃Mƒ‹ƒh–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getguildname_sub(int guild_id)
-{
- struct guild *g=NULL;
- g=guild_search(guild_id);
-
- if(g!=NULL){
- char *buf;
- buf=(char *)aCalloc(24,sizeof(char));
- strcpy(buf,g->name);
- return buf;
- }
- return 0;
-}
-int buildin_getguildname(struct script_state *st)
-{
- char *name;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- name=buildin_getguildname_sub(guild_id);
- if(name!=0)
- push_str(st->stack,C_STR,name);
- else
- push_str(st->stack,C_CONSTSTR,"null");
- return 0;
-}
-
-/*==========================================
- *Žw’èID‚ÌGuildMaster–¼Žæ“¾
- *------------------------------------------
- */
-char *buildin_getguildmaster_sub(int guild_id)
-{
- struct guild *g=NULL;
- g=guild_search(guild_id);
-
- if(g!=NULL){
- char *buf;
- buf=(char *)aCalloc(24,sizeof(char));
- strncpy(buf,g->master, 23);
- return buf;
- }
-
- return 0;
-}
-int buildin_getguildmaster(struct script_state *st)
-{
- char *master;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- master=buildin_getguildmaster_sub(guild_id);
- if(master!=0)
- push_str(st->stack,C_STR,master);
- else
- push_str(st->stack,C_CONSTSTR,"null");
- return 0;
-}
-
-int buildin_getguildmasterid(struct script_state *st)
-{
- char *master;
- struct map_session_data *sd=NULL;
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- master=buildin_getguildmaster_sub(guild_id);
- if(master!=0){
- if((sd=map_nick2sd(master)) == NULL){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,sd->status.char_id);
- }else{
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- * ƒLƒƒƒ‰ƒNƒ^‚Ì–¼‘O
- *------------------------------------------
- */
-int buildin_strcharinfo(struct script_state *st)
-{
- struct map_session_data *sd;
- int num;
-
- sd=script_rid2sd(st);
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(num==0){
- char *buf;
- buf=(char *)aCalloc(24,sizeof(char));
- strncpy(buf,sd->status.name, 23);
- push_str(st->stack,C_STR,buf);
- }
- if(num==1){
- char *buf;
- buf=buildin_getpartyname_sub(sd->status.party_id);
- if(buf!=0)
- push_str(st->stack,C_STR,buf);
- else
- push_str(st->stack,C_CONSTSTR,"");
- }
- if(num==2){
- char *buf;
- buf=buildin_getguildname_sub(sd->status.guild_id);
- if(buf!=0)
- push_str(st->stack,C_STR,buf);
- else
- push_str(st->stack,C_CONSTSTR,"");
- }
-
- return 0;
-}
-
-unsigned int equip[10]={0x0100,0x0010,0x0020,0x0002,0x0004,0x0040,0x0008,0x0080,0x0200,0x0001};
-
-/*==========================================
- * GetEquipID(Pos); Pos: 1-10
- *------------------------------------------
- */
-int buildin_getequipid(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- struct item_data* item;
-
- sd=script_rid2sd(st);
- if(sd == NULL)
- {
- printf("getequipid: sd == NULL\n");
- return 0;
- }
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- item=sd->inventory_data[i];
- if(item)
- push_val(st->stack,C_INT,item->nameid);
- else
- push_val(st->stack,C_INT,0);
- }else{
- push_val(st->stack,C_INT,-1);
- }
- return 0;
-}
-
-/*==========================================
- * ‘•”õ–¼•¶Žš—ñi¸˜Bƒƒjƒ…[—pj
- *------------------------------------------
- */
-int buildin_getequipname(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- struct item_data* item;
- char *buf;
-
- buf=(char *)aCalloc(64,sizeof(char));
- sd=script_rid2sd(st);
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- item=sd->inventory_data[i];
- if(item)
- sprintf(buf,"%s-[%s]",pos[num-1],item->jname);
- else
- sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
- }else{
- sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
- }
- push_str(st->stack,C_STR,buf);
-
- return 0;
-}
-
-/*==========================================
- * getbrokenid [Valaris]
- *------------------------------------------
- */
-int buildin_getbrokenid(struct script_state *st)
-{
- int i,num,id=0,brokencounter=0;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].attribute==1){
- brokencounter++;
- if(num==brokencounter){
- id=sd->status.inventory[i].nameid;
- break;
- }
- }
- }
-
- push_val(st->stack,C_INT,id);
-
- return 0;
-}
-
-/*==========================================
- * repair [Valaris]
- *------------------------------------------
- */
-int buildin_repair(struct script_state *st)
-{
- int i,num;
- int repaircounter=0;
- struct map_session_data *sd;
-
-
- sd=script_rid2sd(st);
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].attribute==1){
- repaircounter++;
- if(num==repaircounter){
- sd->status.inventory[i].attribute=0;
- clif_equiplist(sd);
- clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
- clif_misceffect(&sd->bl, 3);
- clif_displaymessage(sd->fd,"Item has been repaired.");
- break;
- }
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisequiped(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0){
- push_val(st->stack,C_INT,1);
- }else{
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B‰Â”\ƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisenableref(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0 && num<7 && sd->inventory_data[i] && (num!=1 || sd->inventory_data[i]->def > 1
- || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL)
- || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL))
- ){
- push_val(st->stack,C_INT,1);
- }else{
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•iŠÓ’èƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_getequipisidentify(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,sd->status.inventory[i].identify);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B“x
- *------------------------------------------
- */
-int buildin_getequiprefinerycnt(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,sd->status.inventory[i].refine);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i•ŠíLV
- *------------------------------------------
- */
-int buildin_getequipweaponlv(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0 && sd->inventory_data[i])
- push_val(st->stack,C_INT,sd->inventory_data[i]->wlv);
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ‘•”õ•i¸˜B¬Œ÷—¦
- *------------------------------------------
- */
-int buildin_getequippercentrefinery(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- push_val(st->stack,C_INT,pc_percentrefinery(sd,&sd->status.inventory[i]));
- else
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-
-/*==========================================
- * ¸˜B¬Œ÷
- *------------------------------------------
- */
-int buildin_successrefitem(struct script_state *st)
-{
- int i,num,ep;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0) {
- ep=sd->status.inventory[i].equip;
-
- #ifndef TXT_ONLY
- if(log_config.refine > 0)
- log_refine(sd, i, 1);
- #endif //USE_SQL
-
- sd->status.inventory[i].refine++;
- pc_unequipitem(sd,i,0);
- clif_refine(sd->fd,sd,0,i,sd->status.inventory[i].refine);
- clif_delitem(sd,i,1);
- clif_additem(sd,i,1,0);
- pc_equipitem(sd,i,ep);
- clif_misceffect(&sd->bl,3);
- }
-
- return 0;
-}
-
-/*==========================================
- * ¸˜BŽ¸”s
- *------------------------------------------
- */
-int buildin_failedrefitem(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0) {
- #ifndef TXT_ONLY
- if(log_config.refine > 0)
- log_refine(sd, i, 0);
- #endif //USE_SQL
-
- sd->status.inventory[i].refine = 0;
- pc_unequipitem(sd,i,0);
- // ¸˜BŽ¸”sƒGƒtƒFƒNƒg‚̃pƒPƒbƒg
- clif_refine(sd->fd,sd,1,i,sd->status.inventory[i].refine);
- pc_delitem(sd,i,1,0);
- // ‘¼‚Ìl‚É‚àŽ¸”s‚ð’Ê’m
- clif_misceffect(&sd->bl,2);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_statusup(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pc_statusup(sd,type);
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_statusup2(struct script_state *st)
-{
- int type,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- pc_statusup2(sd,type,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus(struct script_state *st)
-{
- int type,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- pc_bonus(sd,type,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus2(struct script_state *st)
-{
- int type,type2,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val=conv_num(st,& (st->stack->stack_data[st->start+4]));
- sd=script_rid2sd(st);
- pc_bonus2(sd,type,type2,val);
-
- return 0;
-}
-/*==========================================
- * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
- *------------------------------------------
- */
-int buildin_bonus3(struct script_state *st)
-{
- int type,type2,type3,val;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
- type3=conv_num(st,& (st->stack->stack_data[st->start+4]));
- val=conv_num(st,& (st->stack->stack_data[st->start+5]));
- sd=script_rid2sd(st);
- pc_bonus3(sd,type,type2,type3,val);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹Š“¾
- *------------------------------------------
- */
-int buildin_skill(struct script_state *st)
-{
- int id,level,flag=1;
- struct map_session_data *sd;
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- level=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd=script_rid2sd(st);
- pc_skill(sd,id,level,flag);
-
- return 0;
-}
-/*==========================================
- * ƒMƒ‹ƒhƒXƒLƒ‹Žæ“¾
- *------------------------------------------
- */
-int buildin_guildskill(struct script_state *st)
-{
- int id,level,flag=0;
- struct map_session_data *sd;
- int i=0;
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- level=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 )
- flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
- sd=script_rid2sd(st);
- for(i=0;i<level;i++)
- guild_skillup(sd,id,flag);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒŒƒxƒ‹Š“¾
- *------------------------------------------
- */
-int buildin_getskilllv(struct script_state *st)
-{
- int id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- push_val(st->stack,C_INT, pc_checkskill( script_rid2sd(st) ,id) );
- return 0;
-}
-/*==========================================
- * getgdskilllv(Guild_ID, Skill_ID);
- * skill_id = 10000 : GD_APPROVAL
- * 10001 : GD_KAFRACONTACT
- * 10002 : GD_GUARDIANRESEARCH
- * 10003 : GD_GUARDUP
- * 10004 : GD_EXTENSION
- *------------------------------------------
- */
-int buildin_getgdskilllv(struct script_state *st)
-{
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
- struct guild *g=guild_search(guild_id);
- push_val(st->stack,C_INT, (g==NULL)?-1:guild_checkskill(g,skill_id) );
- return 0;
-/*
- struct map_session_data *sd=NULL;
- struct guild *g=NULL;
- int skill_id;
-
- skill_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- if(sd && sd->status.guild_id > 0) g=guild_search(sd->status.guild_id);
- if(sd && g) {
- push_val(st->stack,C_INT, guild_checkskill(g,skill_id+9999) );
- } else {
- push_val(st->stack,C_INT,-1);
- }
- return 0;
-*/
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_basicskillcheck(struct script_state *st)
-{
- push_val(st->stack,C_INT, battle_config.basic_skill_check);
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_getgmlevel(struct script_state *st)
-{
- push_val(st->stack,C_INT, pc_isGM(script_rid2sd(st)));
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_end(struct script_state *st)
-{
- st->state = END;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_checkoption(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
-
- if(sd->status.option & type){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_setoption(struct script_state *st)
-{
- int type;
- struct map_session_data *sd;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pc_setoption(sd,type);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkcart(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_iscarton(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJ[ƒg‚ð•t‚¯‚é
- *------------------------------------------
- */
-int buildin_setcart(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setcart(sd,1);
-
- return 0;
-}
-
-/*==========================================
- * checkfalcon [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkfalcon(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_isfalcon(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * ‘é‚ð•t‚¯‚é
- *------------------------------------------
- */
-int buildin_setfalcon(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setfalcon(sd);
-
- return 0;
-}
-
-/*==========================================
- * Checkcart [Valaris]
- *------------------------------------------
- */
-
-int buildin_checkriding(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- if(pc_isriding(sd)){
- push_val(st->stack,C_INT,1);
- } else {
- push_val(st->stack,C_INT,0);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * ƒyƒRƒyƒRæ‚è
- *------------------------------------------
- */
-int buildin_setriding(struct script_state *st)
-{
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
- pc_setriding(sd);
-
- return 0;
-}
-
-/*==========================================
- * ƒZ[ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
- *------------------------------------------
- */
-int buildin_savepoint(struct script_state *st)
-{
- int x,y;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pc_setsavepoint(script_rid2sd(st),str,x,y);
- return 0;
-}
-
-/*==========================================
- * GetTimeTick(0: System Tick, 1: Time Second Tick)
- *------------------------------------------
- */
-int buildin_gettimetick(struct script_state *st) /* Asgard Version */
-{
- int type;
- time_t timer;
- struct tm *t;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- switch(type){
- case 1:
- //type 1:(Second Ticks: 0-86399, 00:00:00-23:59:59)
- time(&timer);
- t=localtime(&timer);
- push_val(st->stack,C_INT,((t->tm_hour)*3600+(t->tm_min)*60+t->tm_sec));
- break;
- case 0:
- default:
- //type 0:(System Ticks)
- push_val(st->stack,C_INT,gettick());
- break;
- }
- return 0;
-}
-
-/*==========================================
- * GetTime(Type);
- * 1: Sec 2: Min 3: Hour
- * 4: WeekDay 5: MonthDay 6: Month
- * 7: Year
- *------------------------------------------
- */
-int buildin_gettime(struct script_state *st) /* Asgard Version */
-{
- int type;
- time_t timer;
- struct tm *t;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- time(&timer);
- t=localtime(&timer);
-
- switch(type){
- case 1://Sec(0~59)
- push_val(st->stack,C_INT,t->tm_sec);
- break;
- case 2://Min(0~59)
- push_val(st->stack,C_INT,t->tm_min);
- break;
- case 3://Hour(0~23)
- push_val(st->stack,C_INT,t->tm_hour);
- break;
- case 4://WeekDay(0~6)
- push_val(st->stack,C_INT,t->tm_wday);
- break;
- case 5://MonthDay(01~31)
- push_val(st->stack,C_INT,t->tm_mday);
- break;
- case 6://Month(01~12)
- push_val(st->stack,C_INT,t->tm_mon+1);
- break;
- case 7://Year(20xx)
- push_val(st->stack,C_INT,t->tm_year+1900);
- break;
- default://(format error)
- push_val(st->stack,C_INT,-1);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * GetTimeStr("TimeFMT", Length);
- *------------------------------------------
- */
-int buildin_gettimestr(struct script_state *st)
-{
- char *tmpstr;
- char *fmtstr;
- int maxlen;
- time_t now = time(NULL);
-
- fmtstr=conv_str(st,& (st->stack->stack_data[st->start+2]));
- maxlen=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- tmpstr=(char *)aCalloc(maxlen+1,sizeof(char));
- strftime(tmpstr,maxlen,fmtstr,localtime(&now));
- tmpstr[maxlen]='\0';
-
- push_str(st->stack,C_STR,tmpstr);
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
- *------------------------------------------
- */
-int buildin_openstorage(struct script_state *st)
-{
- storage_storageopen(script_rid2sd(st));
- return 0;
-}
-
-int buildin_guildopenstorage(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int ret;
- ret = storage_guild_storageopen(sd);
- push_val(st->stack,C_INT,ret);
- return 0;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‚É‚æ‚éƒXƒLƒ‹”­“®
- *------------------------------------------
- */
-int buildin_itemskill(struct script_state *st)
-{
- int id,lv;
- char *str;
- struct map_session_data *sd=script_rid2sd(st);
-
- id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- lv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- str=conv_str(st,& (st->stack->stack_data[st->start+4]));
-
- // ‰r¥’†‚ɃXƒLƒ‹ƒAƒCƒeƒ€‚ÍŽg—p‚Å‚«‚È‚¢
- if(sd->skilltimer != -1)
- return 0;
-
- sd->skillitem=id;
- sd->skillitemlv=lv;
- clif_item_skill(sd,id,lv,str);
- return 0;
-}
-/*==========================================
- * ƒAƒCƒeƒ€ì¬
- *------------------------------------------
- */
-int buildin_produce(struct script_state *st)
-{
- int trigger;
- struct map_session_data *sd=script_rid2sd(st);
-
- if( sd->state.produce_flag == 1) return 0;
- trigger=conv_num(st,& (st->stack->stack_data[st->start+2]));
- clif_skill_produce_mix_list(sd,trigger);
- return 0;
-}
-/*==========================================
- * NPC‚Ńyƒbƒgì‚é
- *------------------------------------------
- */
-int buildin_makepet(struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd(st);
- struct script_data *data;
- int id,pet_id;
-
- data=&(st->stack->stack_data[st->start+2]);
- get_val(st,data);
-
- id=conv_num(st,data);
-
- pet_id = search_petDB_index(id, PET_CLASS);
-
- if (pet_id < 0)
- pet_id = search_petDB_index(id, PET_EGG);
- if (pet_id >= 0 && sd) {
- sd->catch_target_class = pet_db[pet_id].class;
- intif_create_pet(
- sd->status.account_id, sd->status.char_id,
- pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
- pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
- 100, 0, 1, pet_db[pet_id].jname);
- }
-
- return 0;
-}
-/*==========================================
- * NPC‚ÅŒoŒ±’lã‚°‚é
- *------------------------------------------
- */
-int buildin_getexp(struct script_state *st)
-{
- struct map_session_data *sd = script_rid2sd(st);
- int base=0,job=0;
-
- base=conv_num(st,& (st->stack->stack_data[st->start+2]));
- job =conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(base<0 || job<0)
- return 0;
- if(sd)
- pc_gainexp(sd,base,job);
-
- return 0;
-}
-
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[”­¶
- *------------------------------------------
- */
-int buildin_monster(struct script_state *st)
-{
- int class,amount,x,y;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y =conv_num(st,& (st->stack->stack_data[st->start+4]));
- str =conv_str(st,& (st->stack->stack_data[st->start+5]));
- class=conv_num(st,& (st->stack->stack_data[st->start+6]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
- if( st->end>st->start+8 )
- event=conv_str(st,& (st->stack->stack_data[st->start+8]));
-
- mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class,amount,event);
- return 0;
-}
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[”­¶
- *------------------------------------------
- */
-int buildin_areamonster(struct script_state *st)
-{
- int class,amount,x0,y0,x1,y1;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0 =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0 =conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1 =conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1 =conv_num(st,& (st->stack->stack_data[st->start+6]));
- str =conv_str(st,& (st->stack->stack_data[st->start+7]));
- class=conv_num(st,& (st->stack->stack_data[st->start+8]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+9]));
- if( st->end>st->start+10 )
- event=conv_str(st,& (st->stack->stack_data[st->start+10]));
-
- mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class,amount,event);
- return 0;
-}
-/*==========================================
- * ƒ‚ƒ“ƒXƒ^[íœ
- *------------------------------------------
- */
-int buildin_killmonster_sub(struct block_list *bl,va_list ap)
-{
- char *event=va_arg(ap,char *);
- int allflag=va_arg(ap,int);
-
- if(!allflag){
- if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
- mob_delete((struct mob_data *)bl);
- return 0;
- }else if(allflag){
- if(((struct mob_data *)bl)->spawndelay1==-1 && ((struct mob_data *)bl)->spawndelay2==-1)
- mob_delete((struct mob_data *)bl);
- return 0;
- }
- return 0;
-}
-int buildin_killmonster(struct script_state *st)
-{
- char *mapname,*event;
- int m,allflag=0;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
- if(strcmp(event,"All")==0)
- allflag = 1;
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_killmonster_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB, event ,allflag);
- return 0;
-}
-
-int buildin_killmonsterall_sub(struct block_list *bl,va_list ap)
-{
- mob_delete((struct mob_data *)bl);
- return 0;
-}
-int buildin_killmonsterall(struct script_state *st)
-{
- char *mapname;
- int m;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_killmonsterall_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB);
- return 0;
-}
-
-/*==========================================
- * ƒCƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int buildin_doevent(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_event(map_id2sd(st->rid),event,0);
- return 0;
-}
-/*==========================================
- * NPCŽå‘̃Cƒxƒ“ƒgŽÀs
- *------------------------------------------
- */
-int buildin_donpcevent(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_event_do(event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[’ljÁ
- *------------------------------------------
- */
-int buildin_addtimer(struct script_state *st)
-{
- char *event;
- int tick;
- tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
- pc_addeventtimer(script_rid2sd(st),tick,event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[íœ
- *------------------------------------------
- */
-int buildin_deltimer(struct script_state *st)
-{
- char *event;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- pc_deleventtimer(script_rid2sd(st),event);
- return 0;
-}
-/*==========================================
- * ƒCƒxƒ“ƒgƒ^ƒCƒ}[‚̃JƒEƒ“ƒg’l’ljÁ
- *------------------------------------------
- */
-int buildin_addtimercount(struct script_state *st)
-{
- char *event;
- int tick;
- event=conv_str(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pc_addeventtimercount(script_rid2sd(st),event,tick);
- return 0;
-}
-
-/*==========================================
- * NPCƒ^ƒCƒ}[‰Šú‰»
- *------------------------------------------
- */
-int buildin_initnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_settimerevent_tick(nd,0);
- npc_timerevent_start(nd);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[ŠJŽn
- *------------------------------------------
- */
-int buildin_startnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_timerevent_start(nd);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[’âŽ~
- *------------------------------------------
- */
-int buildin_stopnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_timerevent_stop(nd);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[î•ñŠ“¾
- *------------------------------------------
- */
-int buildin_getnpctimer(struct script_state *st)
-{
- struct npc_data *nd;
- int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int val=0;
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- switch(type){
- case 0: val=npc_gettimerevent_tick(nd); break;
- case 1: val= (nd->u.scr.nexttimer>=0); break;
- case 2: val= nd->u.scr.timeramount; break;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-/*==========================================
- * NPCƒ^ƒCƒ}[’lÝ’è
- *------------------------------------------
- */
-int buildin_setnpctimer(struct script_state *st)
-{
- int tick;
- struct npc_data *nd;
- tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- npc_settimerevent_tick(nd,tick);
- return 0;
-}
-
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒX
- *------------------------------------------
- */
-int buildin_announce(struct script_state *st)
-{
- char *str;
- int flag;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if(flag&0x0f){
- struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) :
- (struct block_list *)script_rid2sd(st);
- clif_GMmessage(bl,str,strlen(str)+1,flag);
- }else
- intif_GMmessage(str,strlen(str)+1,flag);
- return 0;
-}
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒ}ƒbƒvj
- *------------------------------------------
- */
-int buildin_mapannounce_sub(struct block_list *bl,va_list ap)
-{
- char *str;
- int len,flag;
- str=va_arg(ap,char *);
- len=va_arg(ap,int);
- flag=va_arg(ap,int);
- clif_GMmessage(bl,str,len,flag|3);
- return 0;
-}
-int buildin_mapannounce(struct script_state *st)
-{
- char *mapname,*str;
- int flag,m;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- str=conv_str(st,& (st->stack->stack_data[st->start+3]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- if( (m=map_mapname2mapid(mapname))<0 )
- return 0;
- map_foreachinarea(buildin_mapannounce_sub,
- m,0,0,map[m].xs,map[m].ys,BL_PC, str,strlen(str)+1,flag&0x10);
- return 0;
-}
-/*==========================================
- * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒGƒŠƒAj
- *------------------------------------------
- */
-int buildin_areaannounce(struct script_state *st)
-{
- char *map,*str;
- int flag,m;
- int x0,y0,x1,y1;
-
- map=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- str=conv_str(st,& (st->stack->stack_data[st->start+7]));
- flag=conv_num(st,& (st->stack->stack_data[st->start+8]));
-
- if( (m=map_mapname2mapid(map))<0 )
- return 0;
-
- map_foreachinarea(buildin_mapannounce_sub,
- m,x0,y0,x1,y1,BL_PC, str,strlen(str)+1,flag&0x10 );
- return 0;
-}
-/*==========================================
- * ƒ†[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getusers(struct script_state *st)
-{
- int flag=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct block_list *bl=map_id2bl((flag&0x08)?st->oid:st->rid);
- int val=0;
- switch(flag&0x07){
- case 0: val=map[bl->m].users; break;
- case 1: val=map_getusers(); break;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-/*==========================================
- * ƒ}ƒbƒvŽw’胆[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getmapusers(struct script_state *st)
-{
- char *str;
- int m;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- push_val(st->stack,C_INT,map[m].users);
- return 0;
-}
-/*==========================================
- * ƒGƒŠƒAŽw’胆[ƒU[”Š“¾
- *------------------------------------------
- */
-int buildin_getareausers_sub(struct block_list *bl,va_list ap)
-{
- int *users=va_arg(ap,int *);
- (*users)++;
- return 0;
-}
-int buildin_getareausers(struct script_state *st)
-{
- char *str;
- int m,x0,y0,x1,y1,users=0;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_getareausers_sub,
- m,x0,y0,x1,y1,BL_PC,&users);
- push_val(st->stack,C_INT,users);
- return 0;
-}
-
-/*==========================================
- * ƒGƒŠƒAŽw’èƒhƒƒbƒvƒAƒCƒeƒ€”Š“¾
- *------------------------------------------
- */
-int buildin_getareadropitem_sub(struct block_list *bl,va_list ap)
-{
- int item=va_arg(ap,int);
- int *amount=va_arg(ap,int *);
- struct flooritem_data *drop=(struct flooritem_data *)bl;
-
- if(drop->item_data.nameid==item)
- (*amount)+=drop->item_data.amount;
-
- return 0;
-}
-int buildin_getareadropitem(struct script_state *st)
-{
- char *str;
- int m,x0,y0,x1,y1,item,amount=0;
- struct script_data *data;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
- x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
- y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
-
- data=&(st->stack->stack_data[st->start+7]);
- get_val(st,data);
- if( data->type==C_STR || data->type==C_CONSTSTR ){
- const char *name=conv_str(st,data);
- struct item_data *item_data = itemdb_searchname(name);
- item=512;
- if( item_data )
- item=item_data->nameid;
- }else
- item=conv_num(st,data);
-
- if( (m=map_mapname2mapid(str))< 0){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_getareadropitem_sub,
- m,x0,y0,x1,y1,BL_ITEM,item,&amount);
- push_val(st->stack,C_INT,amount);
- return 0;
-}
-/*==========================================
- * NPC‚Ì—LŒø‰»
- *------------------------------------------
- */
-int buildin_enablenpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,1);
- return 0;
-}
-/*==========================================
- * NPC‚Ì–³Œø‰»
- *------------------------------------------
- */
-int buildin_disablenpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,0);
- return 0;
-}
-
-int buildin_enablearena(struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- struct chat_data *cd;
-
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL)
- return 0;
-
- npc_enable(nd->name,1);
- nd->arenaflag=1;
-
- if(cd->users>=cd->trigger && cd->npc_event[0])
- npc_timer_event(cd->npc_event);
-
- return 0;
-}
-int buildin_disablearena(struct script_state *st) // Added by RoVeRT
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- nd->arenaflag=0;
-
- return 0;
-}
-/*==========================================
- * ‰B‚ê‚Ä‚¢‚éNPC‚Ì•\Ž¦
- *------------------------------------------
- */
-int buildin_hideoffnpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,2);
- return 0;
-}
-/*==========================================
- * NPC‚ðƒnƒCƒfƒBƒ“ƒO
- *------------------------------------------
- */
-int buildin_hideonnpc(struct script_state *st)
-{
- char *str;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- npc_enable(str,4);
- return 0;
-}
-/*==========================================
- * ó‘ÔˆÙí‚É‚©‚©‚é
- *------------------------------------------
- */
-int buildin_sc_start(struct script_state *st)
-{
- struct block_list *bl;
- int type,tick,val1;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
- if( st->end>st->start+5 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+5])));
- else
- bl = map_id2bl(st->rid);
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- skill_status_change_start(bl,type,val1,0,0,0,tick,0);
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙí‚É‚©‚©‚é(Šm—¦Žw’è)
- *------------------------------------------
- */
-int buildin_sc_start2(struct script_state *st)
-{
- struct block_list *bl;
- int type,tick,val1,per;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
- val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
- per=conv_num(st,& (st->stack->stack_data[st->start+5]));
- if( st->end>st->start+6 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
- else
- bl = map_id2bl(st->rid);
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- if(rand()%10000 < per)
- skill_status_change_start(bl,type,val1,0,0,0,tick,0);
- return 0;
-}
-
-/*==========================================
- * ó‘ÔˆÙ킪’¼‚é
- *------------------------------------------
- */
-int buildin_sc_end(struct script_state *st)
-{
- struct block_list *bl;
- int type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- bl = map_id2bl(st->rid);
- if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
- bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
- skill_status_change_end(bl,type,-1);
-// if(battle_config.etc_log)
-// printf("sc_end : %d %d\n",st->rid,type);
- return 0;
-}
-/*==========================================
- * ó‘ÔˆÙí‘Ï«‚ðŒvŽZ‚µ‚½Šm—¦‚ð•Ô‚·
- *------------------------------------------
- */
-int buildin_getscrate(struct script_state *st)
-{
- struct block_list *bl;
- int sc_def=100,sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2;
- int type,rate,luk;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- rate=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if( st->end>st->start+4 ) //Žw’肵‚½ƒLƒƒƒ‰‚Ì‘Ï«‚ðŒvŽZ‚·‚é
- bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
- else
- bl = map_id2bl(st->rid);
-
- luk = battle_get_luk(bl);
- sc_def_mdef2=100 - (3 + battle_get_mdef(bl) + luk/3);
- sc_def_vit2=100 - (3 + battle_get_vit(bl) + luk/3);
- sc_def_int2=100 - (3 + battle_get_int(bl) + luk/3);
- sc_def_luk2=100 - (3 + luk);
-
- if(type==SC_STONE || type==SC_FREEZE)
- sc_def=sc_def_mdef2;
- else if(type==SC_STAN || type==SC_POISON || type==SC_SILENCE)
- sc_def=sc_def_vit2;
- else if(type==SC_SLEEP || type==SC_CONFUSION || type==SC_BLIND)
- sc_def=sc_def_int2;
- else if(type==SC_CURSE)
- sc_def=sc_def_luk2;
-
- rate=rate*sc_def/100;
- push_val(st->stack,C_INT,rate);
-
- return 0;
-
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_debugmes(struct script_state *st)
-{
- conv_str(st,& (st->stack->stack_data[st->start+2]));
- printf("script debug : %d %d : %s\n",st->rid,st->oid,st->stack->stack_data[st->start+2].u.str);
- return 0;
-}
-
-/*==========================================
- *•ßŠlƒAƒCƒeƒ€Žg—p
- *------------------------------------------
- */
-int buildin_catchpet(struct script_state *st)
-{
- int pet_id;
- struct map_session_data *sd;
- pet_id= conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- pet_catch_process1(sd,pet_id);
- return 0;
-}
-
-/*==========================================
- *Œg‘Ñ—‘›z‰»‹@Žg—p
- *------------------------------------------
- */
-int buildin_birthpet(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- clif_sendegg(sd);
- return 0;
-}
-
-/*==========================================
- * Added - AppleGirl For Advanced Classes, (Updated for Cleaner Script Purposes)
- *------------------------------------------
- */
-int buildin_resetlvl(struct script_state *st)
-{
- struct map_session_data *sd;
-
- int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- sd=script_rid2sd(st);
- pc_resetlvl(sd,type);
- return 0;
-}
-/*==========================================
- * ƒXƒe[ƒ^ƒXƒŠƒZƒbƒg
- *------------------------------------------
- */
-int buildin_resetstatus(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- pc_resetstate(sd);
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒŠƒZƒbƒg
- *------------------------------------------
- */
-int buildin_resetskill(struct script_state *st)
-{
- struct map_session_data *sd;
- sd=script_rid2sd(st);
- pc_resetskill(sd);
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int buildin_changebase(struct script_state *st)
-{
- struct map_session_data *sd=NULL;
- int vclass;
-
- if( st->end>st->start+3 )
- sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+3])));
- else
- sd=script_rid2sd(st);
-
- if(sd == NULL)
- return 0;
-
- vclass = conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(vclass == 22 && !battle_config.wedding_modifydisplay)
- return 0;
-
-// if(vclass==22) {
-// pc_unequipitem(sd,sd->equip_index[9],0); // ‘•”õŠO
-// }
-
- sd->view_class = vclass;
-
- return 0;
-}
-
-/*==========================================
- * «•Ê•ÏŠ·
- *------------------------------------------
- */
-int buildin_changesex(struct script_state *st) {
- struct map_session_data *sd = NULL;
- sd = script_rid2sd(st);
-
- if (sd->status.sex == 0) {
- sd->status.sex = 1;
- sd->sex = 1;
- if (sd->status.class == 20 || sd->status.class == 4021)
- sd->status.class -= 1;
- } else if (sd->status.sex == 1) {
- sd->status.sex = 0;
- sd->sex = 0;
- if(sd->status.class == 19 || sd->status.class == 4020)
- sd->status.class += 1;
- }
- chrif_char_ask_name(-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
- chrif_save(sd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgì¬
- *------------------------------------------
- */
-int buildin_waitingroom(struct script_state *st)
-{
- char *name,*ev="";
- int limit, trigger = 0,pub=1;
- name=conv_str(st,& (st->stack->stack_data[st->start+2]));
- limit= conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(limit==0)
- pub=3;
-
- if( (st->end > st->start+5) ){
- struct script_data* data=&(st->stack->stack_data[st->start+5]);
- get_val(st,data);
- if(data->type==C_INT){
- // VAthenaŽd—l(‹ŒAthenaŽd—l‚ƌ݊·«‚ ‚è)
- ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
- trigger=conv_num(st,& (st->stack->stack_data[st->start+5]));
- }else{
- // eathenaŽd—l
- trigger=conv_num(st,& (st->stack->stack_data[st->start+4]));
- ev=conv_str(st,& (st->stack->stack_data[st->start+5]));
- }
- }else{
- // ‹ŒAthenaŽd—l
- if( st->end > st->start+4 )
- ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
- }
- chat_createnpcchat( (struct npc_data *)map_id2bl(st->oid),
- limit,pub,trigger,name,strlen(name)+1,ev);
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgíœ
- *------------------------------------------
- */
-int buildin_delwaitingroom(struct script_state *st)
-{
- struct npc_data *nd;
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
- chat_deletenpcchat(nd);
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒg‘SˆõR‚èo‚·
- *------------------------------------------
- */
-int buildin_waitingroomkickall(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_npckickall(cd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg—LŒø‰»
- *------------------------------------------
- */
-int buildin_enablewaitingroomevent(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_enableevent(cd);
- return 0;
-}
-
-/*==========================================
- * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg–³Œø‰»
- *------------------------------------------
- */
-int buildin_disablewaitingroomevent(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
-
- if( st->end > st->start+2 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
- chat_disableevent(cd);
- return 0;
-}
-/*==========================================
- * npcƒ`ƒƒƒbƒgó‘ÔŠ“¾
- *------------------------------------------
- */
-int buildin_getwaitingroomstate(struct script_state *st)
-{
- struct npc_data *nd;
- struct chat_data *cd;
- int val=0,type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if( st->end > st->start+3 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ){
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- switch(type){
- case 0: val=cd->users; break;
- case 1: val=cd->limit; break;
- case 2: val=cd->trigger&0x7f; break;
- case 3: val=((cd->trigger&0x80)>0); break;
- case 32: val=(cd->users >= cd->limit); break;
- case 33: val=(cd->users >= cd->trigger); break;
-
- case 4:
- push_str(st->stack,C_CONSTSTR,cd->title);
- return 0;
- case 5:
- push_str(st->stack,C_CONSTSTR,cd->pass);
- return 0;
- case 16:
- push_str(st->stack,C_CONSTSTR,cd->npc_event);
- return 0;
- }
- push_val(st->stack,C_INT,val);
- return 0;
-}
-
-/*==========================================
- * ƒ`ƒƒƒbƒgƒƒ“ƒo[(‹K’èl”)ƒ[ƒv
- *------------------------------------------
- */
-int buildin_warpwaitingpc(struct script_state *st)
-{
- int x,y,i,n;
- char *str;
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- struct chat_data *cd;
-
- if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
- return 0;
-
- n=cd->trigger&0x7f;
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x=conv_num(st,& (st->stack->stack_data[st->start+3]));
- y=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- if( st->end > st->start+5 )
- n=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- for(i=0;i<n;i++){
- struct map_session_data *sd=cd->usersd[0]; // ƒŠƒXƒg擪‚ÌPC‚ðŽŸX‚ÉB
-
- mapreg_setreg(add_str("$@warpwaitingpc")+(i<<24),sd->bl.id);
-
- if(strcmp(str,"Random")==0)
- pc_randomwarp(sd,3);
- else if(strcmp(str,"SavePoint")==0){
- if(map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|‹ÖŽ~
- return 0;
-
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- }else
- pc_setpos(sd,str,x,y,0);
- }
- mapreg_setreg(add_str("$@warpwaitingpcnum"),n);
- return 0;
-}
-/*==========================================
- * RID‚̃Aƒ^ƒbƒ`
- *------------------------------------------
- */
-int buildin_attachrid(struct script_state *st)
-{
- st->rid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- push_val(st->stack,C_INT, (map_id2sd(st->rid)!=NULL));
- return 0;
-}
-/*==========================================
- * RID‚̃fƒ^ƒbƒ`
- *------------------------------------------
- */
-int buildin_detachrid(struct script_state *st)
-{
- st->rid=0;
- return 0;
-}
-/*==========================================
- * ‘¶Ýƒ`ƒFƒbƒN
- *------------------------------------------
- */
-int buildin_isloggedin(struct script_state *st)
-{
- push_val(st->stack,C_INT, map_id2sd(
- conv_num(st,& (st->stack->stack_data[st->start+2])) )!=NULL );
- return 0;
-}
-
-
-/*==========================================
- *
- *------------------------------------------
- */
-enum { MF_NOMEMO,MF_NOTELEPORT,MF_NOSAVE,MF_NOBRANCH,MF_NOPENALTY,MF_NOZENYPENALTY,MF_PVP,MF_PVP_NOPARTY,MF_PVP_NOGUILD,MF_GVG,MF_GVG_NOPARTY,MF_NOTRADE,MF_NOSKILL, MF_NOWARP,MF_NOPVP,MF_NOICEWALL,
- MF_SNOW, MF_FOG, MF_SAKURA, MF_LEAVES, MF_RAIN };
-
-int buildin_setmapflagnosave(struct script_state *st)
-{
- int m,x,y;
- char *str,*str2;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- str2=conv_str(st,& (st->stack->stack_data[st->start+3]));
- x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- y=conv_num(st,& (st->stack->stack_data[st->start+5]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- map[m].flag.nosave=1;
- memcpy(map[m].save.map,str2,16);
- map[m].save.x=x;
- map[m].save.y=y;
- }
-
- return 0;
-}
-
-int buildin_setmapflag(struct script_state *st)
-{
- int m,i;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- switch(i) {
- case MF_NOMEMO:
- map[m].flag.nomemo=1;
- break;
- case MF_NOTELEPORT:
- map[m].flag.noteleport=1;
- break;
- case MF_NOBRANCH:
- map[m].flag.nobranch=1;
- break;
- case MF_NOPENALTY:
- map[m].flag.nopenalty=1;
- break;
- case MF_PVP_NOPARTY:
- map[m].flag.pvp_noparty=1;
- break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild=1;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty=1;
- break;
- case MF_NOZENYPENALTY:
- map[m].flag.nozenypenalty=1;
- break;
- case MF_NOTRADE:
- map[m].flag.notrade=1;
- break;
- case MF_NOSKILL:
- map[m].flag.noskill=1;
- break;
- case MF_NOWARP:
- map[m].flag.nowarp=1;
- break;
- case MF_NOPVP:
- map[m].flag.nopvp=1;
- break;
- case MF_NOICEWALL: // [Valaris]
- map[m].flag.noicewall=1;
- break;
- case MF_SNOW: // [Valaris]
- map[m].flag.snow=1;
- break;
- case MF_FOG: // [Valaris]
- map[m].flag.fog=1;
- break;
- case MF_SAKURA: // [Valaris]
- map[m].flag.sakura=1;
- break;
- case MF_LEAVES: // [Valaris]
- map[m].flag.leaves=1;
- break;
- case MF_RAIN: // [Valaris]
- map[m].flag.rain=1;
- break;
- }
- }
-
- return 0;
-}
-
-int buildin_removemapflag(struct script_state *st)
-{
- int m,i;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- i=conv_num(st,& (st->stack->stack_data[st->start+3]));
- m = map_mapname2mapid(str);
- if(m >= 0) {
- switch(i) {
- case MF_NOMEMO:
- map[m].flag.nomemo=0;
- break;
- case MF_NOTELEPORT:
- map[m].flag.noteleport=0;
- break;
- case MF_NOSAVE:
- map[m].flag.nosave=0;
- break;
- case MF_NOBRANCH:
- map[m].flag.nobranch=0;
- break;
- case MF_NOPENALTY:
- map[m].flag.nopenalty=0;
- break;
- case MF_PVP_NOPARTY:
- map[m].flag.pvp_noparty=0;
- break;
- case MF_PVP_NOGUILD:
- map[m].flag.pvp_noguild=0;
- break;
- case MF_GVG_NOPARTY:
- map[m].flag.gvg_noparty=0;
- break;
- case MF_NOZENYPENALTY:
- map[m].flag.nozenypenalty=0;
- break;
- case MF_NOSKILL:
- map[m].flag.noskill=0;
- break;
- case MF_NOWARP:
- map[m].flag.nowarp=0;
- break;
- case MF_NOPVP:
- map[m].flag.nopvp=0;
- break;
- case MF_NOICEWALL: // [Valaris]
- map[m].flag.noicewall=0;
- break;
- case MF_SNOW: // [Valaris]
- map[m].flag.snow=0;
- break;
- case MF_FOG: // [Valaris]
- map[m].flag.fog=0;
- break;
- case MF_SAKURA: // [Valaris]
- map[m].flag.sakura=0;
- break;
- case MF_LEAVES: // [Valaris]
- map[m].flag.leaves=0;
- break;
- case MF_RAIN: // [Valaris]
- map[m].flag.rain=0;
- break;
-
- }
- }
-
- return 0;
-}
-
-int buildin_pvpon(struct script_state *st)
-{
- int m,i;
- char *str;
- struct map_session_data *pl_sd=NULL;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) {
- map[m].flag.pvp = 1;
- clif_send0199(m,1);
-
- if(battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris]
- return 0;
-
- for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
- if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){
- if(m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
- pl_sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,pl_sd->bl.id,0);
- pl_sd->pvp_rank=0;
- pl_sd->pvp_lastusers=0;
- pl_sd->pvp_point=5;
- }
- }
- }
- }
-
- return 0;
-}
-
-int buildin_pvpoff(struct script_state *st)
-{
- int m,i;
- char *str;
- struct map_session_data *pl_sd=NULL;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && map[m].flag.pvp && map[m].flag.nopvp) {
- map[m].flag.pvp = 0;
- clif_send0199(m,0);
-
- if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
- return 0;
-
- for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
- if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){
- if(m == pl_sd->bl.m) {
- clif_pvpset(pl_sd,0,0,2);
- if(pl_sd->pvp_timer != -1) {
- delete_timer(pl_sd->pvp_timer,pc_calc_pvprank_timer);
- pl_sd->pvp_timer = -1;
- }
- }
- }
- }
- }
-
- return 0;
-}
-
-int buildin_gvgon(struct script_state *st)
-{
- int m;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && !map[m].flag.gvg) {
- map[m].flag.gvg = 1;
- clif_send0199(m,3);
- }
-
- return 0;
-}
-int buildin_gvgoff(struct script_state *st)
-{
- int m;
- char *str;
-
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
- m = map_mapname2mapid(str);
- if(m >= 0 && map[m].flag.gvg) {
- map[m].flag.gvg = 0;
- clif_send0199(m,0);
- }
-
- return 0;
-}
-/*==========================================
- * NPCƒGƒ‚[ƒVƒ‡ƒ“
- *------------------------------------------
- */
-
-int buildin_emotion(struct script_state *st)
-{
- int type;
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(type < 0 || type > 100)
- return 0;
- clif_emotion(map_id2bl(st->oid),type);
- return 0;
-}
-
-int buildin_maprespawnguildid_sub(struct block_list *bl,va_list ap)
-{
- int g_id=va_arg(ap,int);
- int flag=va_arg(ap,int);
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
-
- if(bl->type == BL_PC)
- sd=(struct map_session_data*)bl;
- if(bl->type == BL_MOB)
- md=(struct mob_data *)bl;
-
- if(sd){
- if((sd->status.guild_id == g_id) && (flag&1))
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
- else if((sd->status.guild_id != g_id) && (flag&2))
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
- else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris]
- pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); // end addition [Valaris]
- }
- if(md && flag&4){
- if(md->class < 1285 || md->class > 1288)
- mob_delete(md);
- }
- return 0;
-}
-int buildin_maprespawnguildid(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int g_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- int m=map_mapname2mapid(mapname);
-
- if(m) map_foreachinarea(buildin_maprespawnguildid_sub,m,0,0,map[m].xs-1,map[m].ys-1,BL_NUL,g_id,flag);
- return 0;
-}
-
-int buildin_agitstart(struct script_state *st)
-{
- if(agit_flag==1) return 1; // Agit already Start.
- agit_flag=1;
- guild_agit_start();
- return 0;
-}
-
-int buildin_agitend(struct script_state *st)
-{
- if(agit_flag==0) return 1; // Agit already End.
- agit_flag=0;
- guild_agit_end();
- return 0;
-}
-/*==========================================
- * agitcheck 1; // choice script
- * if(@agit_flag == 1) goto agit;
- * if(agitcheck(0) == 1) goto agit;
- *------------------------------------------
- */
-int buildin_agitcheck(struct script_state *st)
-{
- struct map_session_data *sd;
- int cond;
-
- sd=script_rid2sd(st);
- cond=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(cond == 0) {
- if (agit_flag==1) push_val(st->stack,C_INT,1);
- if (agit_flag==0) push_val(st->stack,C_INT,0);
- } else {
- if (agit_flag==1) pc_setreg(sd,add_str("@agit_flag"),1);
- if (agit_flag==0) pc_setreg(sd,add_str("@agit_flag"),0);
- }
- return 0;
-}
-int buildin_flagemblem(struct script_state *st)
-{
- int g_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(g_id < 0) return 0;
-
-// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id);
- ((struct npc_data *)map_id2bl(st->oid))->u.scr.guild_id = g_id;
- return 1;
-}
-
-int buildin_getcastlename(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- struct guild_castle *gc;
- int i;
- char *buf=NULL;
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- buf=(char *)aCalloc(24,sizeof(char));
- strncpy(buf,gc->castle_name,24);
- break;
- }
- }
- }
- if(buf)
- push_str(st->stack,C_STR,buf);
- else
- push_str(st->stack,C_CONSTSTR,"");
- return 0;
-}
-
-int buildin_getcastledata(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
- char *event=NULL;
- struct guild_castle *gc;
- int i,j;
-
- if( st->end>st->start+4 && index==0){
- for(i=0,j=-1;i<MAX_GUILDCASTLE;i++)
- if( (gc=guild_castle_search(i)) != NULL &&
- strcmp(mapname,gc->map_name)==0 )
- j=i;
- if(j>=0){
- event=conv_str(st,& (st->stack->stack_data[st->start+4]));
- guild_addcastleinfoevent(j,17,event);
- }
- }
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- switch(index){
- case 0: for(j=1;j<26;j++) guild_castledataload(gc->castle_id,j); break; // Initialize[AgitInit]
- case 1: push_val(st->stack,C_INT,gc->guild_id); break;
- case 2: push_val(st->stack,C_INT,gc->economy); break;
- case 3: push_val(st->stack,C_INT,gc->defense); break;
- case 4: push_val(st->stack,C_INT,gc->triggerE); break;
- case 5: push_val(st->stack,C_INT,gc->triggerD); break;
- case 6: push_val(st->stack,C_INT,gc->nextTime); break;
- case 7: push_val(st->stack,C_INT,gc->payTime); break;
- case 8: push_val(st->stack,C_INT,gc->createTime); break;
- case 9: push_val(st->stack,C_INT,gc->visibleC); break;
- case 10: push_val(st->stack,C_INT,gc->visibleG0); break;
- case 11: push_val(st->stack,C_INT,gc->visibleG1); break;
- case 12: push_val(st->stack,C_INT,gc->visibleG2); break;
- case 13: push_val(st->stack,C_INT,gc->visibleG3); break;
- case 14: push_val(st->stack,C_INT,gc->visibleG4); break;
- case 15: push_val(st->stack,C_INT,gc->visibleG5); break;
- case 16: push_val(st->stack,C_INT,gc->visibleG6); break;
- case 17: push_val(st->stack,C_INT,gc->visibleG7); break;
- case 18: push_val(st->stack,C_INT,gc->Ghp0); break;
- case 19: push_val(st->stack,C_INT,gc->Ghp1); break;
- case 20: push_val(st->stack,C_INT,gc->Ghp2); break;
- case 21: push_val(st->stack,C_INT,gc->Ghp3); break;
- case 22: push_val(st->stack,C_INT,gc->Ghp4); break;
- case 23: push_val(st->stack,C_INT,gc->Ghp5); break;
- case 24: push_val(st->stack,C_INT,gc->Ghp6); break;
- case 25: push_val(st->stack,C_INT,gc->Ghp7); break;
- default:
- push_val(st->stack,C_INT,0); break;
- }
- return 0;
- }
- }
- }
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-int buildin_setcastledata(struct script_state *st)
-{
- char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int value=conv_num(st,& (st->stack->stack_data[st->start+4]));
- struct guild_castle *gc;
- int i;
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- if( (gc=guild_castle_search(i)) != NULL ){
- if(strcmp(mapname,gc->map_name)==0){
- // Save Data byself First
- 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: gc->visibleG0 = value; break;
- case 11: gc->visibleG1 = value; break;
- case 12: gc->visibleG2 = value; break;
- case 13: gc->visibleG3 = value; break;
- case 14: gc->visibleG4 = value; break;
- case 15: gc->visibleG5 = value; break;
- case 16: gc->visibleG6 = value; break;
- case 17: gc->visibleG7 = value; break;
- case 18: gc->Ghp0 = value; break;
- case 19: gc->Ghp1 = value; break;
- case 20: gc->Ghp2 = value; break;
- case 21: gc->Ghp3 = value; break;
- case 22: gc->Ghp4 = value; break;
- case 23: gc->Ghp5 = value; break;
- case 24: gc->Ghp6 = value; break;
- case 25: gc->Ghp7 = value; break;
- default: return 0;
- }
- guild_castledatasave(gc->castle_id,index,value);
- return 0;
- }
- }
- }
- return 0;
-}
-
-/* =====================================================================
- * ƒMƒ‹ƒhî•ñ‚ð—v‹‚·‚é
- * ---------------------------------------------------------------------
- */
-int buildin_requestguildinfo(struct script_state *st)
-{
- int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
- char *event=NULL;
-
- if( st->end>st->start+3 )
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if(guild_id>0)
- guild_npc_request_info(guild_id,event);
- return 0;
-}
-
-/* =====================================================================
- * ƒJ[ƒh‚Ì”‚𓾂é
- * ---------------------------------------------------------------------
- */
-int buildin_getequipcardcnt(struct script_state *st)
-{
- int i,num;
- struct map_session_data *sd;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0] == 0x00ff){ // »‘¢•Ší‚̓J[ƒh‚È‚µ
- push_val(st->stack,C_INT,0);
- return 0;
- }
- do{
- if( (sd->status.inventory[i].card[c-1] > 4000) &&
- (sd->status.inventory[i].card[c-1] < 5000)){
-
- push_val(st->stack,C_INT,(c));
- return 0;
- }
- }while(c--);
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-/* ================================================================
- * ƒJ[ƒhŽæ‚èŠO‚µ¬Œ÷
- * ----------------------------------------------------------------
- */
-int buildin_successremovecards(struct script_state *st)
-{
- int i,num,cardflag=0,flag;
- struct map_session_data *sd;
- struct item item_tmp;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
- return 0;
- }
- do{
- if( (sd->status.inventory[i].card[c-1] > 4000) &&
- (sd->status.inventory[i].card[c-1] < 5000)){
-
- cardflag = 1;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
- item_tmp.attribute=0;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
-
- if((flag=pc_additem(sd,&item_tmp,1))){ // Ž‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }while(c--);
-
- if(cardflag == 1){ // ƒJ[ƒh‚ðŽæ‚蜂¢‚½ƒAƒCƒeƒ€Š“¾
- flag=0;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
- item_tmp.attribute=sd->status.inventory[i].attribute;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- pc_delitem(sd,i,1,0);
- if((flag=pc_additem(sd,&item_tmp,1))){ // ‚à‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- clif_misceffect(&sd->bl,3);
- return 0;
- }
- return 0;
-}
-
-/* ================================================================
- * ƒJ[ƒhŽæ‚èŠO‚µŽ¸”s slot,type
- * type=0: —¼•û‘¹Ž¸A1:ƒJ[ƒh‘¹Ž¸A2:•‹ï‘¹Ž¸A3:‘¹Ž¸–³‚µ
- * ----------------------------------------------------------------
- */
-int buildin_failedremovecards(struct script_state *st)
-{
- int i,num,cardflag=0,flag,typefail;
- struct map_session_data *sd;
- struct item item_tmp;
- int c=4;
-
- num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- typefail=conv_num(st,& (st->stack->stack_data[st->start+3]));
- sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
- if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
- return 0;
- }
- do{
- if(( sd->status.inventory[i].card[c-1] > 4000) &&
- (sd->status.inventory[i].card[c-1] < 5000)){
-
- cardflag = 1;
-
- if(typefail == 2){ // •‹ï‚Ì‚Ý‘¹Ž¸‚È‚çAƒJ[ƒh‚͎󂯎æ‚点‚é
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
- item_tmp.attribute=0;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- if((flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }
- }while(c--);
-
- if(cardflag == 1){
-
- if(typefail == 0 || typefail == 2){ // •‹ï‘¹Ž¸
- pc_delitem(sd,i,1,0);
- clif_misceffect(&sd->bl,2);
- return 0;
- }
- if(typefail == 1){ // ƒJ[ƒh‚Ì‚Ý‘¹Ž¸i•‹ï‚ð•Ô‚·j
- flag=0;
- item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
- item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
- item_tmp.attribute=sd->status.inventory[i].attribute;
- item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
- pc_delitem(sd,i,1,0);
- if((flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- clif_misceffect(&sd->bl,2);
- return 0;
- }
- return 0;
-}
-
-int buildin_mapwarp(struct script_state *st) // Added by RoVeRT
-{
- int x,y,m;
- char *str;
- char *mapname;
- int x0,y0,x1,y1;
-
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- x0=0;
- y0=0;
- x1=map[map_mapname2mapid(mapname)].xs;
- y1=map[map_mapname2mapid(mapname)].ys;
- str=conv_str(st,& (st->stack->stack_data[st->start+3]));
- x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- y=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- if( (m=map_mapname2mapid(mapname))< 0)
- return 0;
-
- map_foreachinarea(buildin_areawarp_sub,
- m,x0,y0,x1,y1,BL_PC, str,x,y );
- return 0;
-}
-
-int buildin_cmdothernpc(struct script_state *st) // Added by RoVeRT
-{
- char *npc,*command;
-
- npc=conv_str(st,& (st->stack->stack_data[st->start+2]));
- command=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- npc_command(map_id2sd(st->rid),npc,command);
- return 0;
-}
-
-int buildin_inittimer(struct script_state *st) // Added by RoVeRT
-{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
-
-// nd->lastaction=nd->timer=gettick();
- npc_do_ontimer(st->oid, map_id2sd(st->rid), 1);
-
- return 0;
-}
-
-int buildin_stoptimer(struct script_state *st) // Added by RoVeRT
-{
-// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
-
-// nd->lastaction=nd->timer=-1;
- npc_do_ontimer(st->oid, map_id2sd(st->rid), 0);
-
- return 0;
-}
-
-int buildin_mobcount_sub(struct block_list *bl,va_list ap) // Added by RoVeRT
-{
- char *event=va_arg(ap,char *);
- int *c=va_arg(ap,int *);
-
- if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
- (*c)++;
- return 0;
-}
-
-int buildin_mobcount(struct script_state *st) // Added by RoVeRT
-{
- char *mapname,*event;
- int m,c=0;
- mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
- event=conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if( (m=map_mapname2mapid(mapname))<0 ) {
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- map_foreachinarea(buildin_mobcount_sub,
- m,0,0,map[m].xs,map[m].ys,BL_MOB, event,&c );
-
- push_val(st->stack,C_INT, (c - 1));
-
- return 0;
-}
-int buildin_marriage(struct script_state *st)
-{
- char *partner=conv_str(st,& (st->stack->stack_data[st->start+2]));
- struct map_session_data *sd=script_rid2sd(st);
- struct map_session_data *p_sd=map_nick2sd(partner);
-
- if(sd==NULL || p_sd==NULL || pc_marriage(sd,p_sd) < 0){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,1);
- return 0;
-}
-int buildin_wedding_effect(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL)
- return 0;
- clif_wedding_effect(&sd->bl);
- return 0;
-}
-int buildin_divorce(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- if(sd==NULL || pc_divorce(sd) < 0){
- push_val(st->stack,C_INT,0);
- return 0;
- }
- push_val(st->stack,C_INT,1);
- return 0;
-}
-
-/*================================================
- * Script for Displaying MOB Information [Valaris]
- *------------------------------------------------
- */
-int buildin_strmobinfo(struct script_state *st)
-{
-
- int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int class=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if(num<=0 || num>=8 || (class>=0 && class<=1000) || class >2000)
- return 0;
-
- if(num==1) {
- char *buf;
- buf=calloc(24, 1);
- buf=mob_db[class].name;
- push_str(st->stack,C_STR,buf);
- return 0;
- }
- else if(num==2) {
- char *buf;
- buf=calloc(24, 1);
- buf=mob_db[class].jname;
- push_str(st->stack,C_STR,buf);
- return 0;
- }
- else if(num==3)
- push_val(st->stack,C_INT,mob_db[class].lv);
- else if(num==4)
- push_val(st->stack,C_INT,mob_db[class].max_hp);
- else if(num==5)
- push_val(st->stack,C_INT,mob_db[class].max_sp);
- else if(num==6)
- push_val(st->stack,C_INT,mob_db[class].base_exp);
- else if(num==7)
- push_val(st->stack,C_INT,mob_db[class].job_exp);
- return 0;
-}
-
-/*==========================================
- * Summon guardians [Valaris]
- *------------------------------------------
- */
-int buildin_guardian(struct script_state *st)
-{
- int class=0,amount=1,x=0,y=0,guardian=0;
- char *str,*map,*event="";
-
- map =conv_str(st,& (st->stack->stack_data[st->start+2]));
- x =conv_num(st,& (st->stack->stack_data[st->start+3]));
- y =conv_num(st,& (st->stack->stack_data[st->start+4]));
- str =conv_str(st,& (st->stack->stack_data[st->start+5]));
- class=conv_num(st,& (st->stack->stack_data[st->start+6]));
- amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
- event=conv_str(st,& (st->stack->stack_data[st->start+8]));
- if( st->end>st->start+9 )
- guardian=conv_num(st,& (st->stack->stack_data[st->start+9]));
-
- mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class,amount,event,guardian);
-
- return 0;
-}
-
-/*================================================
- * Script for Displaying Guardian Info [Valaris]
- *------------------------------------------------
- */
-int buildin_guardianinfo(struct script_state *st)
-{
- int guardian=conv_num(st,& (st->stack->stack_data[st->start+2]));
- struct map_session_data *sd=script_rid2sd(st);
- struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
-
- if(guardian==0 && gc->visibleG0 == 1) push_val(st->stack,C_INT,gc->Ghp0);
- if(guardian==1 && gc->visibleG1 == 1) push_val(st->stack,C_INT,gc->Ghp1);
- if(guardian==2 && gc->visibleG2 == 1) push_val(st->stack,C_INT,gc->Ghp2);
- if(guardian==3 && gc->visibleG3 == 1) push_val(st->stack,C_INT,gc->Ghp3);
- if(guardian==4 && gc->visibleG4 == 1) push_val(st->stack,C_INT,gc->Ghp4);
- if(guardian==5 && gc->visibleG5 == 1) push_val(st->stack,C_INT,gc->Ghp5);
- if(guardian==6 && gc->visibleG6 == 1) push_val(st->stack,C_INT,gc->Ghp6);
- if(guardian==7 && gc->visibleG7 == 1) push_val(st->stack,C_INT,gc->Ghp7);
- else push_val(st->stack,C_INT,-1);
-
- return 0;
-}
-/*==========================================
- * ID‚©‚çItem–¼
- *------------------------------------------
- */
-int buildin_getitemname(struct script_state *st)
-{
- int item_id;
- struct item_data *i_data;
- char *item_name;
-
- item_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- i_data = NULL;
- i_data = itemdb_search(item_id);
- item_name=(char *)aCalloc(24,sizeof(char));
-
- strncpy(item_name,i_data->jname,23);
- push_str(st->stack,C_STR,item_name);
- return 0;
-}
-
-/*==========================================
- * petskillbonus [Valaris]
- *------------------------------------------
- */
-
-int buildin_petskillbonus(struct script_state *st)
-{
- int type,val,duration,timer;
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=conv_num(st,& (st->stack->stack_data[st->start+3]));
- duration=conv_num(st,& (st->stack->stack_data[st->start+4]));
- timer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- pd->skillbonusduration=-1;
- pd->skillbonustimer=-1;
-
- pet_skill_bonus(sd,pd,type,val,duration,timer,0);
-
- return 0;
-}
-
-/*==========================================
- * pet looting [Valaris]
- *------------------------------------------
- */
-int buildin_petloot(struct script_state *st)
-{
- int max;
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- max=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(!max)
- return 0;
-
- pd->loot=1;
- pd->lootmax=max;
-
- return 0;
-}
-/*==========================================
- * PC‚ÌŠŽ•iî•ñ“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-int buildin_getinventorylist(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i,j=0;
- if(!sd) return 0;
- for(i=0;i<MAX_INVENTORY;i++){
- if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount > 0){
- pc_setreg(sd,add_str("@inventorylist_id")+(j<<24),sd->status.inventory[i].nameid);
- pc_setreg(sd,add_str("@inventorylist_amount")+(j<<24),sd->status.inventory[i].amount);
- pc_setreg(sd,add_str("@inventorylist_equip")+(j<<24),sd->status.inventory[i].equip);
- pc_setreg(sd,add_str("@inventorylist_refine")+(j<<24),sd->status.inventory[i].refine);
- pc_setreg(sd,add_str("@inventorylist_identify")+(j<<24),sd->status.inventory[i].identify);
- pc_setreg(sd,add_str("@inventorylist_attribute")+(j<<24),sd->status.inventory[i].attribute);
- pc_setreg(sd,add_str("@inventorylist_card1")+(j<<24),sd->status.inventory[i].card[0]);
- pc_setreg(sd,add_str("@inventorylist_card2")+(j<<24),sd->status.inventory[i].card[1]);
- pc_setreg(sd,add_str("@inventorylist_card3")+(j<<24),sd->status.inventory[i].card[2]);
- pc_setreg(sd,add_str("@inventorylist_card4")+(j<<24),sd->status.inventory[i].card[3]);
- j++;
- }
- }
- pc_setreg(sd,add_str("@inventorylist_count"),j);
- return 0;
-}
-
-int buildin_getskilllist(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i,j=0;
- if(!sd) return 0;
- for(i=0;i<MAX_SKILL;i++){
- if(sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0){
- pc_setreg(sd,add_str("@skilllist_id")+(j<<24),sd->status.skill[i].id);
- pc_setreg(sd,add_str("@skilllist_lv")+(j<<24),sd->status.skill[i].lv);
- pc_setreg(sd,add_str("@skilllist_flag")+(j<<24),sd->status.skill[i].flag);
- j++;
- }
- }
- pc_setreg(sd,add_str("@skilllist_count"),j);
- return 0;
-}
-
-int buildin_clearitem(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i;
- if(sd==NULL) return 0;
- for (i=0; i<MAX_INVENTORY; i++) {
- if (sd->status.inventory[i].amount)
- pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
- }
- return 0;
-}
-
-/*==========================================
- * NPCƒNƒ‰ƒXƒ`ƒFƒ“ƒW
- * class‚Í•Ï‚í‚肽‚¢class
- * type‚Í’Êí0‚È‚Ì‚©‚ÈH
- *------------------------------------------
- */
-int buildin_classchange(struct script_state *st)
-{
- int class,type;
- struct block_list *bl=map_id2bl(st->oid);
-
- if(bl==NULL) return 0;
-
- class=conv_num(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
- clif_class_change(bl,class,type);
- return 0;
-}
-
-/*==========================================
- * NPC‚©‚ç”­¶‚·‚éƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int buildin_misceffect(struct script_state *st)
-{
- int type;
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- if(st->oid)
- clif_misceffect2(map_id2bl(st->oid),type);
- else{
- struct map_session_data *sd=script_rid2sd(st);
- if(sd)
- clif_misceffect2(&sd->bl,type);
- }
- return 0;
-}
-/*==========================================
- * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
- *------------------------------------------
- */
-int buildin_soundeffect(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- char *name;
- int type=0;
-
-
- name=conv_str(st,& (st->stack->stack_data[st->start+2]));
- type=conv_num(st,& (st->stack->stack_data[st->start+3]));
- if(sd){
- if(st->oid)
- clif_soundeffect(sd,map_id2bl(st->oid),name,type);
- else{
- clif_soundeffect(sd,&sd->bl,name,type);
- }
- }
- return 0;
-}
-/*==========================================
- * pet status recovery [Valaris]
- *------------------------------------------
- */
-int buildin_petrecovery(struct script_state *st)
-{
- struct pet_data *pd;
-
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet healing [Valaris]
- *------------------------------------------
- */
-int buildin_petheal(struct script_state *st)
-
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+4]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet magnificat [Valaris]
- *------------------------------------------
- */
-int buildin_petmag(struct script_state *st)
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
-
- return 0;
-}
-
-/*==========================================
- * pet attack skills [Valaris]
- *------------------------------------------
- */
-int buildin_petskillattack(struct script_state *st)
-{
- struct pet_data *pd;
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL || sd->pd==NULL)
- return 0;
-
- pd=sd->pd;
-
- if(pd==NULL)
- return 0;
-
- pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
- pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
- pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+4]));
- pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
-
- return 0;
-}
-/*==========================================
- * NPC skill effects [Valaris]
- *------------------------------------------
- */
-int buildin_npcskilleffect(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
- int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
- int x=conv_num(st,& (st->stack->stack_data[st->start+4]));
- int y=conv_num(st,& (st->stack->stack_data[st->start+5]));
-
- clif_skill_poseffect(&nd->bl,skillid,skilllv,x,y,gettick());
-
- return 0;
-}
-
-/*==========================================
- * Special effects [Valaris]
- *------------------------------------------
- */
-int buildin_specialeffect(struct script_state *st)
-{
- struct block_list *bl=map_id2bl(st->oid);
-
- if(bl==NULL)
- return 0;
-
- clif_specialeffect(bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
-
- return 0;
-}
-
-int buildin_specialeffect2(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
-
- if(sd==NULL)
- return 0;
-
- clif_specialeffect(&sd->bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
-
- return 0;
-}
-
-/*==========================================
- * Nude [Valaris]
- *------------------------------------------
- */
-
-int buildin_nude(struct script_state *st)
-{
- struct map_session_data *sd=script_rid2sd(st);
- int i;
-
- if(sd==NULL)
- return 0;
-
- for(i=0;i<11;i++)
- if(sd->equip_index[i] >= 0)
- pc_unequipitem(sd,sd->equip_index[i],1);
-
- return 0;
-}
-
-/*==========================================
- * gmcommand [MouseJstr]
- *
- * suggested on the forums...
- *------------------------------------------
- */
-
-int buildin_gmcommand(struct script_state *st)
-{
- struct map_session_data *sd;
- char *cmd;
-
- sd = script_rid2sd(st);
- cmd = conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- is_atcommand(sd->fd, sd, cmd, 99);
-
- return 0;
-}
-
-/*==========================================
- * movenpc [MouseJstr]
- *------------------------------------------
- */
-
-int buildin_movenpc(struct script_state *st)
-{
- struct map_session_data *sd;
- char *map,*npc;
- int x,y;
-
- sd = script_rid2sd(st);
-
- map = conv_str(st,& (st->stack->stack_data[st->start+2]));
- x = conv_num(st,& (st->stack->stack_data[st->start+3]));
- y = conv_num(st,& (st->stack->stack_data[st->start+4]));
- npc = conv_str(st,& (st->stack->stack_data[st->start+5]));
-
- return 0;
-}
-
-/*==========================================
- * message [MouseJstr]
- *------------------------------------------
- */
-
-int buildin_message(struct script_state *st)
-{
- struct map_session_data *sd;
- char *msg,*player;
- struct map_session_data *pl_sd = NULL;
-
- sd = script_rid2sd(st);
-
- player = conv_str(st,& (st->stack->stack_data[st->start+2]));
- msg = conv_str(st,& (st->stack->stack_data[st->start+3]));
-
- if((pl_sd=map_nick2sd((char *) player)) == NULL)
- return 1;
- clif_displaymessage(pl_sd->fd, msg);
-
- return 0;
-}
-
-/*==========================================
- * npctalk (sends message to surrounding
- * area) [Valaris]
- *------------------------------------------
- */
-
-int buildin_npctalk(struct script_state *st)
-{
- char *str;
- char message[255];
-
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- str=conv_str(st,& (st->stack->stack_data[st->start+2]));
-
- if(nd) {
- memcpy(message,nd->name,24);
- strcat(message," : ");
- strcat(message,str);
- clif_message(&(nd->bl), message);
- }
-
- return 0;
-}
-
-/*==========================================
- * hasitems (checks to see if player has any
- * items on them, if so will return a 1)
- * [Valaris]
- *------------------------------------------
- */
-
-int buildin_hasitems(struct script_state *st)
-{
- int i;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- for(i=0; i<MAX_INVENTORY; i++) {
- if(sd->status.inventory[i].amount) {
- push_val(st->stack,C_INT,1);
- return 0;
- }
- }
-
- push_val(st->stack,C_INT,0);
-
- return 0;
-}
-// change npc walkspeed [Valaris]
-int buildin_npcspeed(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- int x=0;
-
- x=conv_num(st,& (st->stack->stack_data[st->start+2]));
-
- if(nd) {
- nd->speed=x;
- }
-
- return 0;
-}
-// make an npc walk to a position [Valaris]
-int buildin_npcwalkto(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
- int x=0,y=0;
-
- x=conv_num(st,& (st->stack->stack_data[st->start+2]));
- y=conv_num(st,& (st->stack->stack_data[st->start+3]));
-
- if(nd) {
- npc_walktoxy(nd,x,y,0);
- }
-
- return 0;
-}
-// stop an npc's movement [Valaris]
-int buildin_npcstop(struct script_state *st)
-{
- struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
-
- if(nd) {
- if(nd->state.state==MS_WALK)
- npc_stop_walking(nd,1);
- }
-
- return 0;
-}
-
-
-/*==========================================
- * getlook char info. getlook(arg)
- *------------------------------------------
- */
-int buildin_getlook(struct script_state *st){
- int type,val;
- struct map_session_data *sd;
- sd=script_rid2sd(st);
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- val=-1;
- switch(type){
- case LOOK_HAIR: //1
- val=sd->status.hair;
- break;
- case LOOK_WEAPON: //2
- val=sd->status.weapon;
- break;
- case LOOK_HEAD_BOTTOM: //3
- val=sd->status.head_bottom;
- break;
- case LOOK_HEAD_TOP: //4
- val=sd->status.head_top;
- break;
- case LOOK_HEAD_MID: //5
- val=sd->status.head_mid;
- break;
- case LOOK_HAIR_COLOR: //6
- val=sd->status.hair_color;
- break;
- case LOOK_CLOTHES_COLOR: //7
- val=sd->status.clothes_color;
- break;
- case LOOK_SHIELD: //8
- val=sd->status.shield;
- break;
- case LOOK_SHOES: //9
- break;
- }
-
- push_val(st->stack,C_INT,val);
- return 0;
-}
-
-/*==========================================
- * get char save point. argument: 0- map name, 1- x, 2- y
- *------------------------------------------
-*/
-int buildin_getsavepoint(struct script_state *st)
-{
- int x,y,type;
- char *mapname;
- struct map_session_data *sd;
-
- sd=script_rid2sd(st);
-
- type=conv_num(st,& (st->stack->stack_data[st->start+2]));
- mapname=calloc(24, 1);
-
- x=sd->status.save_point.x;
- y=sd->status.save_point.y;
- strncpy(mapname,sd->status.save_point.map,24);
- switch(type){
- case 0:
- push_str(st->stack,C_STR,mapname);
- break;
- case 1:
- push_val(st->stack,C_INT,x);
- break;
- case 2:
- push_val(st->stack,C_INT,y);
- break;
- }
- return 0;
-}
-
-/*==========================================
- * Get position for char/npc/pet/mob objects. Added by Lorky
- *
- * int getMapXY(MapName$,MaxX,MapY,type,[CharName$]);
- * where type:
- * MapName$ - String variable for output map name
- * MapX - Integer variable for output coord X
- * MapY - Integer variable for output coord Y
- * type - type of object
- * 0 - Character coord
- * 1 - NPC coord
- * 2 - Pet coord
- * 3 - Mob coord (not released)
- * CharName$ - Name object. If miss or "this" the current object
- *
- * Return:
- * 0 - success
- * -1 - some error, MapName$,MapX,MapY contains unknown value.
- *------------------------------------------
-*/
-int buildin_getmapxy(struct script_state *st){
- struct map_session_data *sd=NULL;
- struct npc_data *nd;
- struct pet_data *pd;
-
- int num;
- char *name;
- char prefix;
-
- int x,y,type;
- char *mapname;
-
- if( st->stack->stack_data[st->start+2].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapname variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if( st->stack->stack_data[st->start+3].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapx variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- if( st->stack->stack_data[st->start+4].type!=C_NAME ){
- printf("script: buildin_getmapxy: not mapy variable\n");
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
-//??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????//
- type=conv_num(st,& (st->stack->stack_data[st->start+5]));
- mapname=calloc(24, 1);
-
- switch (type){
- case 0: //Get Character Position
- if( st->end>st->start+6 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- sd=script_rid2sd(st);
-
- if ( sd==NULL ) { //wrong char name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
-
- x=sd->bl.x;
- y=sd->bl.y;
- strncpy(mapname,sd->mapname,24);
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
- case 1: //Get NPC Position
- if( st->end > st->start+6 )
- nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- nd=(struct npc_data *)map_id2bl(st->oid);
-
- if ( nd==NULL ) { //wrong npc name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- x=nd->bl.x;
- y=nd->bl.y;
- strncpy(mapname,map[nd->bl.m].name,24);
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
- case 2: //Get Pet Position
- if( st->end>st->start+6 )
- sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
- else
- sd=script_rid2sd(st);
-
- if ( sd==NULL ) { //wrong char name or char offline
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- pd=sd->pd;
-
- if(pd==NULL){ //ped data not found
- push_val(st->stack,C_INT,-1);
- return 0;
- }
- x=pd->bl.x;
- y=pd->bl.y;
- strncpy(mapname,map[pd->bl.m].name,24);
-
- printf(">>>>%s %d %d\n",mapname,x,y);
- break;
-
- case 3: //Get Mob Position
- push_val(st->stack,C_INT,-1);
- return 0;
- default: //Wrong type parameter
- push_val(st->stack,C_INT,-1);
- return 0;
- }
-
- //Set MapName$
- num=st->stack->stack_data[st->start+2].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
-
- set_reg(sd,num,name,(void*)mapname);
-
- //Set MapX
- num=st->stack->stack_data[st->start+3].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
- set_reg(sd,num,name,(void*)x);
-
-
- //Set MapY
- num=st->stack->stack_data[st->start+4].u.num;
- name=(char *)(str_buf+str_data[num&0x00ffffff].str);
- prefix=*name;
-
- if( prefix!='$' )
- sd=script_rid2sd(st);
- else
- sd=NULL;
-
- set_reg(sd,num,name,(void*)y);
-
- //Return Success value
- push_val(st->stack,C_INT,0);
- return 0;
-}
-
-
-//
-// ŽÀs•”main
-//
-/*==========================================
- * ƒRƒ}ƒ“ƒh‚Ì“Ç‚ÝŽæ‚è
- *------------------------------------------
- */
-static int unget_com_data=-1;
-int get_com(unsigned char *script,int *pos)
-{
- int i,j;
- if(unget_com_data>=0){
- i=unget_com_data;
- unget_com_data=-1;
- return i;
- }
- if(script[*pos]>=0x80){
- return C_INT;
- }
- i=0; j=0;
- while(script[*pos]>=0x40){
- i=script[(*pos)++]<<j;
- j+=6;
- }
- return i+(script[(*pos)++]<<j);
-}
-
-/*==========================================
- * ƒRƒ}ƒ“ƒh‚̃vƒbƒVƒ…ƒoƒbƒN
- *------------------------------------------
- */
-void unget_com(int c)
-{
- if(unget_com_data!=-1){
- if(battle_config.error_log)
- printf("unget_com can back only 1 data\n");
- }
- unget_com_data=c;
-}
-
-/*==========================================
- * ”’l‚ÌŠ“¾
- *------------------------------------------
- */
-int get_num(unsigned char *script,int *pos)
-{
- int i,j;
- i=0; j=0;
- while(script[*pos]>=0xc0){
- i+=(script[(*pos)++]&0x7f)<<j;
- j+=6;
- }
- return i+((script[(*pos)++]&0x7f)<<j);
-}
-
-/*==========================================
- * ƒXƒ^ƒbƒN‚©‚ç’l‚ðŽæ‚èo‚·
- *------------------------------------------
- */
-int pop_val(struct script_state* st)
-{
- if(st->stack->sp<=0)
- return 0;
- st->stack->sp--;
- get_val(st,&(st->stack->stack_data[st->stack->sp]));
- if(st->stack->stack_data[st->stack->sp].type==C_INT)
- return st->stack->stack_data[st->stack->sp].u.num;
- return 0;
-}
-
-#define isstr(c) ((c).type==C_STR || (c).type==C_CONSTSTR)
-
-/*==========================================
- * ‰ÁŽZ‰‰ŽZŽq
- *------------------------------------------
- */
-void op_add(struct script_state* st)
-{
- st->stack->sp--;
- get_val(st,&(st->stack->stack_data[st->stack->sp]));
- get_val(st,&(st->stack->stack_data[st->stack->sp-1]));
-
- if(isstr(st->stack->stack_data[st->stack->sp]) || isstr(st->stack->stack_data[st->stack->sp-1])){
- conv_str(st,&(st->stack->stack_data[st->stack->sp]));
- conv_str(st,&(st->stack->stack_data[st->stack->sp-1]));
- }
- if(st->stack->stack_data[st->stack->sp].type==C_INT){ // ii
- st->stack->stack_data[st->stack->sp-1].u.num += st->stack->stack_data[st->stack->sp].u.num;
- } else { // ss‚Ì—\’è
- char *buf;
- buf=(char *)aCalloc(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+
- strlen(st->stack->stack_data[st->stack->sp].u.str)+1,sizeof(char));
- strcpy(buf,st->stack->stack_data[st->stack->sp-1].u.str);
- strcat(buf,st->stack->stack_data[st->stack->sp].u.str);
- if(st->stack->stack_data[st->stack->sp-1].type==C_STR)
- free(st->stack->stack_data[st->stack->sp-1].u.str);
- if(st->stack->stack_data[st->stack->sp].type==C_STR)
- free(st->stack->stack_data[st->stack->sp].u.str);
- st->stack->stack_data[st->stack->sp-1].type=C_STR;
- st->stack->stack_data[st->stack->sp-1].u.str=buf;
- }
-}
-
-/*==========================================
- * “ñ€‰‰ŽZŽq(•¶Žš—ñ)
- *------------------------------------------
- */
-void op_2str(struct script_state *st,int op,int sp1,int sp2)
-{
- char *s1=st->stack->stack_data[sp1].u.str,
- *s2=st->stack->stack_data[sp2].u.str;
- int a=0;
-
- switch(op){
- case C_EQ:
- a= (strcmp(s1,s2)==0);
- break;
- case C_NE:
- a= (strcmp(s1,s2)!=0);
- break;
- case C_GT:
- a= (strcmp(s1,s2)> 0);
- break;
- case C_GE:
- a= (strcmp(s1,s2)>=0);
- break;
- case C_LT:
- a= (strcmp(s1,s2)< 0);
- break;
- case C_LE:
- a= (strcmp(s1,s2)<=0);
- break;
- default:
- printf("illegal string operater\n");
- break;
- }
-
- push_val(st->stack,C_INT,a);
-
- if(st->stack->stack_data[sp1].type==C_STR) free(s1);
- if(st->stack->stack_data[sp2].type==C_STR) free(s2);
-}
-/*==========================================
- * “ñ€‰‰ŽZŽq(”’l)
- *------------------------------------------
- */
-void op_2num(struct script_state *st,int op,int i1,int i2)
-{
- switch(op){
- case C_SUB:
- i1-=i2;
- break;
- case C_MUL:
- {
- long long res = i1 * i2;
- if (res > 2147483647 )
- i1 = 2147483647;
- else
- i1*=i2;
- }
- break;
- case C_DIV:
- i1/=i2;
- break;
- case C_MOD:
- i1%=i2;
- break;
- case C_AND:
- i1&=i2;
- break;
- case C_OR:
- i1|=i2;
- break;
- case C_XOR:
- i1^=i2;
- break;
- case C_LAND:
- i1=i1&&i2;
- break;
- case C_LOR:
- i1=i1||i2;
- break;
- case C_EQ:
- i1=i1==i2;
- break;
- case C_NE:
- i1=i1!=i2;
- break;
- case C_GT:
- i1=i1>i2;
- break;
- case C_GE:
- i1=i1>=i2;
- break;
- case C_LT:
- i1=i1<i2;
- break;
- case C_LE:
- i1=i1<=i2;
- break;
- case C_R_SHIFT:
- i1=i1>>i2;
- break;
- case C_L_SHIFT:
- i1=i1<<i2;
- break;
- }
- push_val(st->stack,C_INT,i1);
-}
-/*==========================================
- * “ñ€‰‰ŽZŽq
- *------------------------------------------
- */
-void op_2(struct script_state *st,int op)
-{
- int i1,i2;
- char *s1=NULL,*s2=NULL;
-
- i2=pop_val(st);
- if( isstr(st->stack->stack_data[st->stack->sp]) )
- s2=st->stack->stack_data[st->stack->sp].u.str;
-
- i1=pop_val(st);
- if( isstr(st->stack->stack_data[st->stack->sp]) )
- s1=st->stack->stack_data[st->stack->sp].u.str;
-
- if( s1!=NULL && s2!=NULL ){
- // ss => op_2str
- op_2str(st,op,st->stack->sp,st->stack->sp+1);
- }else if( s1==NULL && s2==NULL ){
- // ii => op_2num
- op_2num(st,op,i1,i2);
- }else{
- // si,is => error
- printf("script: op_2: int&str, str&int not allow.");
- push_val(st->stack,C_INT,0);
- }
-}
-
-/*==========================================
- * ’P€‰‰ŽZŽq
- *------------------------------------------
- */
-void op_1num(struct script_state *st,int op)
-{
- int i1;
- i1=pop_val(st);
- switch(op){
- case C_NEG:
- i1=-i1;
- break;
- case C_NOT:
- i1=~i1;
- break;
- case C_LNOT:
- i1=!i1;
- break;
- }
- push_val(st->stack,C_INT,i1);
-}
-
-
-/*==========================================
- * ŠÖ”‚ÌŽÀs
- *------------------------------------------
- */
-int run_func(struct script_state *st)
-{
- int i,start_sp,end_sp,func;
-
- end_sp=st->stack->sp;
- for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--);
- if(i==0){
- if(battle_config.error_log)
- printf("function not found\n");
-// st->stack->sp=0;
- st->state=END;
- return 0;
- }
- start_sp=i-1;
- st->start=i-1;
- st->end=end_sp;
-
- func=st->stack->stack_data[st->start].u.num;
- if( st->stack->stack_data[st->start].type!=C_NAME || str_data[func].type!=C_FUNC ){
- printf("run_func: not function and command! \n");
-// st->stack->sp=0;
- st->state=END;
- return 0;
- }
-#ifdef DEBUG_RUN
- if(battle_config.etc_log) {
- printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
- printf("stack dump :");
- for(i=0;i<end_sp;i++){
- switch(st->stack->stack_data[i].type){
- case C_INT:
- printf(" int(%d)",st->stack->stack_data[i].u.num);
- break;
- case C_NAME:
- printf(" name(%s)",str_buf+str_data[st->stack->stack_data[i].u.num].str);
- break;
- case C_ARG:
- printf(" arg");
- break;
- case C_POS:
- printf(" pos(%d)",st->stack->stack_data[i].u.num);
- break;
- default:
- printf(" %d,%d",st->stack->stack_data[i].type,st->stack->stack_data[i].u.num);
- }
- }
- printf("\n");
- }
-#endif
- if(str_data[func].func){
- str_data[func].func(st);
- } else {
- if(battle_config.error_log)
- printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
- push_val(st->stack,C_INT,0);
- }
-
- pop_stack(st->stack,start_sp,end_sp);
-
- if(st->state==RETFUNC){
- // ƒ†[ƒU[’è‹`ŠÖ”‚©‚ç‚Ì•œ‹A
- int olddefsp=st->defsp;
- int i;
-
- pop_stack(st->stack,st->defsp,start_sp); // •œ‹A‚Ɏז‚‚ȃXƒ^ƒbƒNíœ
- if(st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO){
- printf("script:run_func(return) return without callfunc or callsub!\n");
- st->state=END;
- return 0;
- }
- i = conv_num(st,& (st->stack->stack_data[st->defsp-4])); // ˆø”‚Ì”Š“¾
- st->pos=conv_num(st,& (st->stack->stack_data[st->defsp-1])); // ƒXƒNƒŠƒvƒgˆÊ’u‚Ì•œŒ³
- st->script=(char*)conv_num(st,& (st->stack->stack_data[st->defsp-2])); // ƒXƒNƒŠƒvƒg‚𕜌³
- st->defsp=conv_num(st,& (st->stack->stack_data[st->defsp-3])); // Šî€ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚𕜌³
-
- pop_stack(st->stack,olddefsp-4-i,olddefsp); // —v‚ç‚È‚­‚È‚Á‚½ƒXƒ^ƒbƒN(ˆø”‚Æ•œ‹A—pƒf[ƒ^)íœ
-
- st->state=GOTO;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚ÌŽÀsƒƒCƒ“•”•ª
- *------------------------------------------
- */
-int run_script_main(unsigned char *script,int pos,int rid,int oid,struct script_state *st,unsigned char *rootscript)
-{
- int c,rerun_pos;
- int cmdcount=script_config.check_cmdcount;
- int gotocount=script_config.check_gotocount;
- struct script_stack *stack=st->stack;
-
- st->defsp=stack->sp;
- st->script=script;
-
- rerun_pos=st->pos;
- for(st->state=0;st->state==0;){
- switch(c=get_com(script,&st->pos)){
- case C_EOL:
- if(stack->sp!=st->defsp){
- if(battle_config.error_log)
- printf("stack.sp(%d) != default(%d)\n",stack->sp,st->defsp);
- stack->sp=st->defsp;
- }
- rerun_pos=st->pos;
- break;
- case C_INT:
- push_val(stack,C_INT,get_num(script,&st->pos));
- break;
- case C_POS:
- case C_NAME:
- push_val(stack,c,(*(int*)(script+st->pos))&0xffffff);
- st->pos+=3;
- break;
- case C_ARG:
- push_val(stack,c,0);
- break;
- case C_STR:
- push_str(stack,C_CONSTSTR,script+st->pos);
- while(script[st->pos++]);
- break;
- case C_FUNC:
- run_func(st);
- if(st->state==GOTO){
- rerun_pos=st->pos;
- script=st->script;
- st->state=0;
- if( gotocount>0 && (--gotocount)<=0 ){
- printf("run_script: infinity loop !\n");
- st->state=END;
- }
- }
- break;
-
- case C_ADD:
- op_add(st);
- break;
-
- case C_SUB:
- case C_MUL:
- case C_DIV:
- case C_MOD:
- case C_EQ:
- case C_NE:
- case C_GT:
- case C_GE:
- case C_LT:
- case C_LE:
- case C_AND:
- case C_OR:
- case C_XOR:
- case C_LAND:
- case C_LOR:
- case C_R_SHIFT:
- case C_L_SHIFT:
- op_2(st,c);
- break;
-
- case C_NEG:
- case C_NOT:
- case C_LNOT:
- op_1num(st,c);
- break;
-
- case C_NOP:
- st->state=END;
- break;
-
- default:
- if(battle_config.error_log)
- printf("unknown command : %d @ %d\n",c,pos);
- st->state=END;
- break;
- }
- if( cmdcount>0 && (--cmdcount)<=0 ){
- printf("run_script: infinity loop !\n");
- st->state=END;
- }
- }
- switch(st->state){
- case STOP:
- break;
- case END:
- {
- struct map_session_data *sd=map_id2sd(st->rid);
- st->pos=-1;
- if(sd && sd->npc_id==st->oid)
- npc_event_dequeue(sd);
- }
- break;
- case RERUNLINE:
- {
- st->pos=rerun_pos;
- }
- break;
- }
-
- if( st->state!=END){
- // ÄŠJ‚·‚邽‚߂ɃXƒ^ƒbƒNî•ñ‚ð•Û‘¶
- struct map_session_data *sd=map_id2sd(st->rid);
- if(sd/* && sd->npc_stackbuf==NULL*/){
- if( sd->npc_stackbuf )
- free( sd->npc_stackbuf );
- sd->npc_stackbuf = (char *)aCalloc(sizeof(stack->stack_data[0])*stack->sp_max,sizeof(char));
- memcpy(sd->npc_stackbuf, stack->stack_data, sizeof(stack->stack_data[0]) * stack->sp_max);
- sd->npc_stack = stack->sp;
- sd->npc_stackmax = stack->sp_max;
- sd->npc_script=script;
- sd->npc_scriptroot=rootscript;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒNƒŠƒvƒg‚ÌŽÀs
- *------------------------------------------
- */
-int run_script(unsigned char *script,int pos,int rid,int oid)
-{
- struct script_stack stack;
- struct script_state st;
- struct map_session_data *sd=map_id2sd(rid);
- unsigned char *rootscript=script;
-
- if(script==NULL || pos<0)
- return -1;
-
- if(sd && sd->npc_stackbuf && sd->npc_scriptroot==(char*)rootscript){
- // ‘O‰ñ‚̃Xƒ^ƒbƒN‚𕜋A
- script=sd->npc_script;
- stack.sp=sd->npc_stack;
- stack.sp_max=sd->npc_stackmax;
- stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
- memcpy(stack.stack_data,sd->npc_stackbuf,sizeof(stack.stack_data[0])*stack.sp_max);
- free(sd->npc_stackbuf);
- sd->npc_stackbuf=NULL;
- }else{
- // ƒXƒ^ƒbƒN‰Šú‰»
- stack.sp=0;
- stack.sp_max=64;
- stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
- }
- st.stack=&stack;
- st.pos=pos;
- st.rid=rid;
- st.oid=oid;
- run_script_main(script,pos,rid,oid,&st,rootscript);
-
- free(stack.stack_data);
- stack.stack_data=NULL;
- return st.pos;
-}
-
-
-/*==========================================
- * ƒ}ƒbƒv•Ï”‚Ì•ÏX
- *------------------------------------------
- */
-int mapreg_setreg(int num,int val)
-{
- if(val!=0)
- numdb_insert(mapreg_db,num,val);
- else
- numdb_erase(mapreg_db,num);
-
- mapreg_dirty=1;
- return 0;
-}
-/*==========================================
- * •¶Žš—ñŒ^ƒ}ƒbƒv•Ï”‚Ì•ÏX
- *------------------------------------------
- */
-int mapreg_setregstr(int num,const char *str)
-{
- char *p;
-
- if( (p=numdb_search(mapregstr_db,num))!=NULL )
- free(p);
-
- if( str==NULL || *str==0 ){
- numdb_erase(mapregstr_db,num);
- mapreg_dirty=1;
- return 0;
- }
- p=(char *)aCalloc(strlen(str)+1, sizeof(char));
- strcpy(p,str);
- numdb_insert(mapregstr_db,num,p);
- mapreg_dirty=1;
- return 0;
-}
-
-/*==========================================
- * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì“Ç‚Ýž‚Ý
- *------------------------------------------
- */
-static int script_load_mapreg()
-{
- FILE *fp;
- char line[1024];
-
- if( (fp=fopen(mapreg_txt,"rt"))==NULL )
- return -1;
-
- while(fgets(line,sizeof(line),fp)){
- char buf1[256],buf2[1024],*p;
- int n,v,s,i;
- if( sscanf(line,"%255[^,],%d\t%n",buf1,&i,&n)!=2 &&
- (i=0,sscanf(line,"%[^\t]\t%n",buf1,&n)!=1) )
- continue;
- if( buf1[strlen(buf1)-1]=='$' ){
- if( sscanf(line+n,"%[^\n\r]",buf2)!=1 ){
- printf("%s: %s broken data !\n",mapreg_txt,buf1);
- continue;
- }
- p=(char *)aCalloc(strlen(buf2) + 1,sizeof(char));
- strcpy(p,buf2);
- s=add_str(buf1);
- numdb_insert(mapregstr_db,(i<<24)|s,p);
- }else{
- if( sscanf(line+n,"%d",&v)!=1 ){
- printf("%s: %s broken data !\n",mapreg_txt,buf1);
- continue;
- }
- s=add_str(buf1);
- numdb_insert(mapreg_db,(i<<24)|s,v);
- }
- }
- fclose(fp);
- mapreg_dirty=0;
- return 0;
-}
-/*==========================================
- * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì‘‚«ž‚Ý
- *------------------------------------------
- */
-static int script_save_mapreg_intsub(void *key,void *data,va_list ap)
-{
- FILE *fp=va_arg(ap,FILE*);
- int num=((int)key)&0x00ffffff, i=((int)key)>>24;
- char *name=str_buf+str_data[num].str;
- if( name[1]!='@' ){
- if(i==0)
- fprintf(fp,"%s\t%d\n", name, (int)data);
- else
- fprintf(fp,"%s,%d\t%d\n", name, i, (int)data);
- }
- return 0;
-}
-static int script_save_mapreg_strsub(void *key,void *data,va_list ap)
-{
- FILE *fp=va_arg(ap,FILE*);
- int num=((int)key)&0x00ffffff, i=((int)key)>>24;
- char *name=str_buf+str_data[num].str;
- if( name[1]!='@' ){
- if(i==0)
- fprintf(fp,"%s\t%s\n", name, (char *)data);
- else
- fprintf(fp,"%s,%d\t%s\n", name, i, (char *)data);
- }
- return 0;
-}
-static int script_save_mapreg()
-{
- FILE *fp;
- int lock;
-
- if( (fp=lock_fopen(mapreg_txt,&lock))==NULL )
- return -1;
- numdb_foreach(mapreg_db,script_save_mapreg_intsub,fp);
- numdb_foreach(mapregstr_db,script_save_mapreg_strsub,fp);
- lock_fclose(fp,mapreg_txt,&lock);
- mapreg_dirty=0;
- return 0;
-}
-static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data)
-{
- if(mapreg_dirty)
- script_save_mapreg();
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int set_posword(char *p)
-{
- char* np,* str[15];
- int i=0;
- for(i=0;i<11;i++) {
- if((np=strchr(p,','))!=NULL) {
- str[i]=p;
- *np=0;
- p=np+1;
- } else {
- str[i]=p;
- p+=strlen(p);
- }
- if(str[i])
- strcpy(pos[i],str[i]);
- }
- return 0;
-}
-
-int script_config_read(char *cfgName)
-{
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- script_config.warn_func_no_comma=1;
- script_config.warn_cmd_no_comma=1;
- script_config.warn_func_mismatch_paramnum=1;
- script_config.warn_cmd_mismatch_paramnum=1;
- script_config.check_cmdcount=8192;
- script_config.check_gotocount=512;
-
- 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,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"refine_posword")==0) {
- set_posword(w2);
- }
- if(strcmpi(w1,"import")==0){
- script_config_read(w2);
- }
- }
- fclose(fp);
-
- return 0;
-}
-
-/*==========================================
- * I—¹
- *------------------------------------------
- */
-static int mapreg_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-static int mapregstr_db_final(void *key,void *data,va_list ap)
-{
- free(data);
- return 0;
-}
-static int scriptlabel_db_final(void *key,void *data,va_list ap)
-{
- return 0;
-}
-static int userfunc_db_final(void *key,void *data,va_list ap)
-{
- free(key);
- free(data);
- return 0;
-}
-int do_final_script()
-{
- if(mapreg_dirty>=0)
- script_save_mapreg();
- if(script_buf)
- free(script_buf);
-
- if(mapreg_db)
- numdb_final(mapreg_db,mapreg_db_final);
- if(mapregstr_db)
- strdb_final(mapregstr_db,mapregstr_db_final);
- if(scriptlabel_db)
- strdb_final(scriptlabel_db,scriptlabel_db_final);
- if(userfunc_db)
- strdb_final(userfunc_db,userfunc_db_final);
-
- if (str_data)
- free(str_data);
- if (str_buf)
- free(str_buf);
-
- return 0;
-}
-/*==========================================
- * ‰Šú‰»
- *------------------------------------------
- */
-int do_init_script()
-{
- mapreg_db=numdb_init();
- mapregstr_db=numdb_init();
- script_load_mapreg();
-
- add_timer_func_list(script_autosave_mapreg,"script_autosave_mapreg");
- add_timer_interval(gettick()+MAPREG_AUTOSAVE_INTERVAL,
- script_autosave_mapreg,0,0,MAPREG_AUTOSAVE_INTERVAL);
-
- scriptlabel_db=strdb_init(50);
- return 0;
-}
+// $Id: script.c 148 2004-09-30 14:05:37Z MouseJstr $
+//#define DEBUG_FUNCIN
+//#define DEBUG_DISP
+//#define DEBUG_RUN
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#include <time.h>
+
+#include "socket.h"
+#include "timer.h"
+#include "malloc.h"
+#include "lock.h"
+
+#include "map.h"
+#include "clif.h"
+#include "chrif.h"
+#include "itemdb.h"
+#include "pc.h"
+#include "script.h"
+#include "storage.h"
+#include "mob.h"
+#include "npc.h"
+#include "pet.h"
+#include "intif.h"
+#include "db.h"
+#include "skill.h"
+#include "chat.h"
+#include "battle.h"
+#include "party.h"
+#include "guild.h"
+#include "lock.h"
+#include "atcommand.h"
+#include "log.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define SCRIPT_BLOCK_SIZE 256
+enum { LABEL_NEXTLINE=1,LABEL_START };
+static unsigned char * script_buf;
+static int script_pos,script_size;
+
+char *str_buf;
+int str_pos,str_size;
+static struct {
+ int type;
+ int str;
+ int backpatch;
+ int label;
+ int (*func)();
+ int val;
+ int next;
+} *str_data;
+int str_num=LABEL_START,str_data_size;
+int str_hash[16];
+
+static struct dbt *mapreg_db=NULL;
+static struct dbt *mapregstr_db=NULL;
+static int mapreg_dirty=-1;
+char mapreg_txt[256]="save/mapreg.txt";
+#define MAPREG_AUTOSAVE_INTERVAL (10*1000)
+
+static struct dbt *scriptlabel_db=NULL;
+static struct dbt *userfunc_db=NULL;
+
+struct dbt* script_get_label_db(){ return scriptlabel_db; }
+struct dbt* script_get_userfunc_db(){ if(!userfunc_db) userfunc_db=strdb_init(50); return userfunc_db; }
+
+int scriptlabel_final(void *k,void *d,va_list ap){ return 0; }
+static char pos[11][100] = {"“ª","‘Ì","¶Žè","‰EŽè","ƒ[ƒu","ŒC","ƒAƒNƒZƒTƒŠ[1","ƒAƒNƒZƒTƒŠ[2","“ª2","“ª3","‘•’…‚µ‚Ä‚¢‚È‚¢"};
+
+static struct Script_Config {
+ int warn_func_no_comma;
+ int warn_cmd_no_comma;
+ int warn_func_mismatch_paramnum;
+ int warn_cmd_mismatch_paramnum;
+ int check_cmdcount;
+ int check_gotocount;
+} script_config;
+static int parse_cmd_if=0;
+static int parse_cmd;
+
+/*==========================================
+ * ƒ[ƒJƒ‹ƒvƒƒgƒ^ƒCƒv錾 (•K—v‚È•¨‚Ì‚Ý)
+ *------------------------------------------
+ */
+unsigned char* parse_subexpr(unsigned char *,int);
+int buildin_mes(struct script_state *st);
+int buildin_goto(struct script_state *st);
+int buildin_callsub(struct script_state *st);
+int buildin_callfunc(struct script_state *st);
+int buildin_return(struct script_state *st);
+int buildin_getarg(struct script_state *st);
+int buildin_next(struct script_state *st);
+int buildin_close(struct script_state *st);
+int buildin_close2(struct script_state *st);
+int buildin_menu(struct script_state *st);
+int buildin_rand(struct script_state *st);
+int buildin_warp(struct script_state *st);
+int buildin_areawarp(struct script_state *st);
+int buildin_heal(struct script_state *st);
+int buildin_itemheal(struct script_state *st);
+int buildin_percentheal(struct script_state *st);
+int buildin_jobchange(struct script_state *st);
+int buildin_input(struct script_state *st);
+int buildin_setlook(struct script_state *st);
+int buildin_set(struct script_state *st);
+int buildin_setarray(struct script_state *st);
+int buildin_cleararray(struct script_state *st);
+int buildin_copyarray(struct script_state *st);
+int buildin_getarraysize(struct script_state *st);
+int buildin_deletearray(struct script_state *st);
+int buildin_getelementofarray(struct script_state *st);
+int buildin_if(struct script_state *st);
+int buildin_getitem(struct script_state *st);
+int buildin_getitem2(struct script_state *st);
+int buildin_makeitem(struct script_state *st);
+int buildin_delitem(struct script_state *st);
+int buildin_viewpoint(struct script_state *st);
+int buildin_countitem(struct script_state *st);
+int buildin_checkweight(struct script_state *st);
+int buildin_readparam(struct script_state *st);
+int buildin_getcharid(struct script_state *st);
+int buildin_getpartyname(struct script_state *st);
+int buildin_getpartymember(struct script_state *st);
+int buildin_getguildname(struct script_state *st);
+int buildin_getguildmaster(struct script_state *st);
+int buildin_getguildmasterid(struct script_state *st);
+int buildin_strcharinfo(struct script_state *st);
+int buildin_getequipid(struct script_state *st);
+int buildin_getequipname(struct script_state *st);
+int buildin_getbrokenid(struct script_state *st); // [Valaris]
+int buildin_repair(struct script_state *st); // [Valaris]
+int buildin_getequipisequiped(struct script_state *st);
+int buildin_getequipisenableref(struct script_state *st);
+int buildin_getequipisidentify(struct script_state *st);
+int buildin_getequiprefinerycnt(struct script_state *st);
+int buildin_getequipweaponlv(struct script_state *st);
+int buildin_getequippercentrefinery(struct script_state *st);
+int buildin_successrefitem(struct script_state *st);
+int buildin_failedrefitem(struct script_state *st);
+int buildin_cutin(struct script_state *st);
+int buildin_cutincard(struct script_state *st);
+int buildin_statusup(struct script_state *st);
+int buildin_statusup2(struct script_state *st);
+int buildin_bonus(struct script_state *st);
+int buildin_bonus2(struct script_state *st);
+int buildin_bonus3(struct script_state *st);
+int buildin_skill(struct script_state *st);
+int buildin_guildskill(struct script_state *st);
+int buildin_getskilllv(struct script_state *st);
+int buildin_getgdskilllv(struct script_state *st);
+int buildin_basicskillcheck(struct script_state *st);
+int buildin_getgmlevel(struct script_state *st);
+int buildin_end(struct script_state *st);
+int buildin_checkoption(struct script_state *st);
+int buildin_setoption(struct script_state *st);
+int buildin_setcart(struct script_state *st);
+int buildin_checkcart(struct script_state *st); // check cart [Valaris]
+int buildin_setfalcon(struct script_state *st);
+int buildin_checkfalcon(struct script_state *st); // check falcon [Valaris]
+int buildin_setriding(struct script_state *st);
+int buildin_checkriding(struct script_state *st); // check for pecopeco [Valaris]
+int buildin_savepoint(struct script_state *st);
+int buildin_gettimetick(struct script_state *st);
+int buildin_gettime(struct script_state *st);
+int buildin_gettimestr(struct script_state *st);
+int buildin_openstorage(struct script_state *st);
+int buildin_guildopenstorage(struct script_state *st);
+int buildin_itemskill(struct script_state *st);
+int buildin_produce(struct script_state *st);
+int buildin_monster(struct script_state *st);
+int buildin_areamonster(struct script_state *st);
+int buildin_killmonster(struct script_state *st);
+int buildin_killmonsterall(struct script_state *st);
+int buildin_doevent(struct script_state *st);
+int buildin_donpcevent(struct script_state *st);
+int buildin_addtimer(struct script_state *st);
+int buildin_deltimer(struct script_state *st);
+int buildin_addtimercount(struct script_state *st);
+int buildin_initnpctimer(struct script_state *st);
+int buildin_stopnpctimer(struct script_state *st);
+int buildin_startnpctimer(struct script_state *st);
+int buildin_setnpctimer(struct script_state *st);
+int buildin_getnpctimer(struct script_state *st);
+int buildin_announce(struct script_state *st);
+int buildin_mapannounce(struct script_state *st);
+int buildin_areaannounce(struct script_state *st);
+int buildin_getusers(struct script_state *st);
+int buildin_getmapusers(struct script_state *st);
+int buildin_getareausers(struct script_state *st);
+int buildin_getareadropitem(struct script_state *st);
+int buildin_enablenpc(struct script_state *st);
+int buildin_disablenpc(struct script_state *st);
+int buildin_enablearena(struct script_state *st); // Added by RoVeRT
+int buildin_disablearena(struct script_state *st); // Added by RoVeRT
+int buildin_hideoffnpc(struct script_state *st);
+int buildin_hideonnpc(struct script_state *st);
+int buildin_sc_start(struct script_state *st);
+int buildin_sc_start2(struct script_state *st);
+int buildin_sc_end(struct script_state *st);
+int buildin_getscrate(struct script_state *st);
+int buildin_debugmes(struct script_state *st);
+int buildin_catchpet(struct script_state *st);
+int buildin_birthpet(struct script_state *st);
+int buildin_resetlvl(struct script_state *st);
+int buildin_resetstatus(struct script_state *st);
+int buildin_resetskill(struct script_state *st);
+int buildin_changebase(struct script_state *st);
+int buildin_changesex(struct script_state *st);
+int buildin_waitingroom(struct script_state *st);
+int buildin_delwaitingroom(struct script_state *st);
+int buildin_enablewaitingroomevent(struct script_state *st);
+int buildin_disablewaitingroomevent(struct script_state *st);
+int buildin_getwaitingroomstate(struct script_state *st);
+int buildin_warpwaitingpc(struct script_state *st);
+int buildin_attachrid(struct script_state *st);
+int buildin_detachrid(struct script_state *st);
+int buildin_isloggedin(struct script_state *st);
+int buildin_setmapflagnosave(struct script_state *st);
+int buildin_setmapflag(struct script_state *st);
+int buildin_removemapflag(struct script_state *st);
+int buildin_pvpon(struct script_state *st);
+int buildin_pvpoff(struct script_state *st);
+int buildin_gvgon(struct script_state *st);
+int buildin_gvgoff(struct script_state *st);
+int buildin_emotion(struct script_state *st);
+int buildin_maprespawnguildid(struct script_state *st);
+int buildin_agitstart(struct script_state *st); // <Agit>
+int buildin_agitend(struct script_state *st);
+int buildin_agitcheck(struct script_state *st); // <Agitcheck>
+int buildin_flagemblem(struct script_state *st); // Flag Emblem
+int buildin_getcastlename(struct script_state *st);
+int buildin_getcastledata(struct script_state *st);
+int buildin_setcastledata(struct script_state *st);
+int buildin_requestguildinfo(struct script_state *st);
+int buildin_getequipcardcnt(struct script_state *st);
+int buildin_successremovecards(struct script_state *st);
+int buildin_failedremovecards(struct script_state *st);
+int buildin_marriage(struct script_state *st);
+int buildin_wedding_effect(struct script_state *st);
+int buildin_divorce(struct script_state *st);
+int buildin_getitemname(struct script_state *st);
+int buildin_makepet(struct script_state *st);
+int buildin_getexp(struct script_state *st);
+int buildin_getinventorylist(struct script_state *st);
+int buildin_getskilllist(struct script_state *st);
+int buildin_clearitem(struct script_state *st);
+int buildin_classchange(struct script_state *st);
+int buildin_misceffect(struct script_state *st);
+int buildin_soundeffect(struct script_state *st);
+int buildin_setcastledata(struct script_state *st);
+int buildin_mapwarp(struct script_state *st);
+int buildin_inittimer(struct script_state *st);
+int buildin_stoptimer(struct script_state *st);
+int buildin_cmdothernpc(struct script_state *st);
+int buildin_mobcount(struct script_state *st);
+int buildin_strmobinfo(struct script_state *st); // Script for displaying mob info [Valaris]
+int buildin_guardian(struct script_state *st); // Script for displaying mob info [Valaris]
+int buildin_guardianinfo(struct script_state *st); // Script for displaying mob info [Valaris]
+int buildin_petskillbonus(struct script_state *st); // petskillbonus [Valaris]
+int buildin_petrecovery(struct script_state *st); // pet skill for curing status [Valaris]
+int buildin_petloot(struct script_state *st); // pet looting [Valaris]
+int buildin_petheal(struct script_state *st); // pet healing [Valaris]
+int buildin_petmag(struct script_state *st); // pet magnificat [Valaris]
+int buildin_petskillattack(struct script_state *st); // pet skill attacks [Valaris]
+int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris]
+int buildin_specialeffect(struct script_state *st); // special effect script [Valaris]
+int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris]
+int buildin_nude(struct script_state *st); // nude [Valaris]
+int buildin_gmcommand(struct script_state *st); // [MouseJstr]
+int buildin_movenpc(struct script_state *st); // [MouseJstr]
+int buildin_message(struct script_state *st); // [MouseJstr]
+int buildin_npctalk(struct script_state *st); // [Valaris]
+int buildin_hasitems(struct script_state *st); // [Valaris]
+int buildin_getlook(struct script_state *st); //Lorky [Lupus]
+int buildin_getsavepoint(struct script_state *st); //Lorky [Lupus]
+int buildin_npcspeed(struct script_state *st); // [Valaris]
+int buildin_npcwalkto(struct script_state *st); // [Valaris]
+int buildin_npcstop(struct script_state *st); // [Valaris]
+int buildin_getmapxy(struct script_state *st); //get map position for player/npc/pet/mob by Lorky [Lupus]
+
+
+void push_val(struct script_stack *stack,int type,int val);
+int run_func(struct script_state *st);
+
+int mapreg_setreg(int num,int val);
+int mapreg_setregstr(int num,const char *str);
+
+struct {
+ int (*func)();
+ char *name;
+ char *arg;
+} buildin_func[]={
+ {buildin_mes,"mes","s"},
+ {buildin_next,"next",""},
+ {buildin_close,"close",""},
+ {buildin_close2,"close2",""},
+ {buildin_menu,"menu","*"},
+ {buildin_goto,"goto","l"},
+ {buildin_callsub,"callsub","i*"},
+ {buildin_callfunc,"callfunc","s*"},
+ {buildin_return,"return","*"},
+ {buildin_getarg,"getarg","i"},
+ {buildin_jobchange,"jobchange","i*"},
+ {buildin_input,"input","*"},
+ {buildin_warp,"warp","sii"},
+ {buildin_areawarp,"areawarp","siiiisii"},
+ {buildin_setlook,"setlook","ii"},
+ {buildin_set,"set","ii"},
+ {buildin_setarray,"setarray","ii*"},
+ {buildin_cleararray,"cleararray","iii"},
+ {buildin_copyarray,"copyarray","iii"},
+ {buildin_getarraysize,"getarraysize","i"},
+ {buildin_deletearray,"deletearray","ii"},
+ {buildin_getelementofarray,"getelementofarray","ii"},
+ {buildin_if,"if","i*"},
+ {buildin_getitem,"getitem","ii**"},
+ {buildin_getitem2,"getitem2","iiiiiiiii*"},
+ {buildin_makeitem,"makeitem","iisii"},
+ {buildin_delitem,"delitem","ii"},
+ {buildin_cutin,"cutin","si"},
+ {buildin_cutincard,"cutincard","i"},
+ {buildin_viewpoint,"viewpoint","iiiii"},
+ {buildin_heal,"heal","ii"},
+ {buildin_itemheal,"itemheal","ii"},
+ {buildin_percentheal,"percentheal","ii"},
+ {buildin_rand,"rand","i*"},
+ {buildin_countitem,"countitem","i"},
+ {buildin_checkweight,"checkweight","ii"},
+ {buildin_readparam,"readparam","i*"},
+ {buildin_getcharid,"getcharid","i*"},
+ {buildin_getpartyname,"getpartyname","i"},
+ {buildin_getpartymember,"getpartymember","i"},
+ {buildin_getguildname,"getguildname","i"},
+ {buildin_getguildmaster,"getguildmaster","i"},
+ {buildin_getguildmasterid,"getguildmasterid","i"},
+ {buildin_strcharinfo,"strcharinfo","i"},
+ {buildin_getequipid,"getequipid","i"},
+ {buildin_getequipname,"getequipname","i"},
+ {buildin_getbrokenid,"getbrokenid","i"}, // [Valaris]
+ {buildin_repair,"repair","i"}, // [Valaris]
+ {buildin_getequipisequiped,"getequipisequiped","i"},
+ {buildin_getequipisenableref,"getequipisenableref","i"},
+ {buildin_getequipisidentify,"getequipisidentify","i"},
+ {buildin_getequiprefinerycnt,"getequiprefinerycnt","i"},
+ {buildin_getequipweaponlv,"getequipweaponlv","i"},
+ {buildin_getequippercentrefinery,"getequippercentrefinery","i"},
+ {buildin_successrefitem,"successrefitem","i"},
+ {buildin_failedrefitem,"failedrefitem","i"},
+ {buildin_statusup,"statusup","i"},
+ {buildin_statusup2,"statusup2","ii"},
+ {buildin_bonus,"bonus","ii"},
+ {buildin_bonus2,"bonus2","iii"},
+ {buildin_bonus3,"bonus3","iiii"},
+ {buildin_skill,"skill","ii*"},
+ {buildin_guildskill,"guildskill","ii"},
+ {buildin_getskilllv,"getskilllv","i"},
+ {buildin_getgdskilllv,"getgdskilllv","ii"},
+ {buildin_basicskillcheck,"basicskillcheck","*"},
+ {buildin_getgmlevel,"getgmlevel","*"},
+ {buildin_end,"end",""},
+ {buildin_end,"break",""},
+ {buildin_checkoption,"checkoption","i"},
+ {buildin_setoption,"setoption","i"},
+ {buildin_setcart,"setcart",""},
+ {buildin_checkcart,"checkcart","*"}, //fixed by Lupus (added '*')
+ {buildin_setfalcon,"setfalcon",""},
+ {buildin_checkfalcon,"checkfalcon","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
+ {buildin_setriding,"setriding",""},
+ {buildin_checkriding,"checkriding","*"}, //fixed by Lupus (fixed wrong pointer, added '*')
+ {buildin_savepoint,"save","sii"},
+ {buildin_savepoint,"savepoint","sii"},
+ {buildin_gettimetick,"gettimetick","i"},
+ {buildin_gettime,"gettime","i"},
+ {buildin_gettimestr,"gettimestr","si"},
+ {buildin_openstorage,"openstorage",""},
+ {buildin_guildopenstorage,"guildopenstorage","*"},
+ {buildin_itemskill,"itemskill","iis"},
+ {buildin_produce,"produce","i"},
+ {buildin_monster,"monster","siisii*"},
+ {buildin_areamonster,"areamonster","siiiisii*"},
+ {buildin_killmonster,"killmonster","ss"},
+ {buildin_killmonsterall,"killmonsterall","s"},
+ {buildin_doevent,"doevent","s"},
+ {buildin_donpcevent,"donpcevent","s"},
+ {buildin_addtimer,"addtimer","is"},
+ {buildin_deltimer,"deltimer","s"},
+ {buildin_addtimercount,"addtimercount","si"},
+ {buildin_initnpctimer,"initnpctimer","*"},
+ {buildin_stopnpctimer,"stopnpctimer","*"},
+ {buildin_startnpctimer,"startnpctimer","*"},
+ {buildin_setnpctimer,"setnpctimer","*"},
+ {buildin_getnpctimer,"getnpctimer","i*"},
+ {buildin_announce,"announce","si"},
+ {buildin_mapannounce,"mapannounce","ssi"},
+ {buildin_areaannounce,"areaannounce","siiiisi"},
+ {buildin_getusers,"getusers","i"},
+ {buildin_getmapusers,"getmapusers","s"},
+ {buildin_getareausers,"getareausers","siiii"},
+ {buildin_getareadropitem,"getareadropitem","siiiii"},
+ {buildin_enablenpc,"enablenpc","s"},
+ {buildin_disablenpc,"disablenpc","s"},
+ {buildin_enablearena,"enablearena",""}, // Added by RoVeRT
+ {buildin_disablearena,"disablearena",""}, // Added by RoVeRT
+ {buildin_hideoffnpc,"hideoffnpc","s"},
+ {buildin_hideonnpc,"hideonnpc","s"},
+ {buildin_sc_start,"sc_start","iii*"},
+ {buildin_sc_start2,"sc_start2","iiii*"},
+ {buildin_sc_end,"sc_end","i"},
+ {buildin_getscrate,"getscrate","ii*"},
+ {buildin_debugmes,"debugmes","s"},
+ {buildin_catchpet,"pet","i"},
+ {buildin_birthpet,"bpet",""},
+ {buildin_resetlvl,"resetlvl","i"},
+ {buildin_resetstatus,"resetstatus",""},
+ {buildin_resetskill,"resetskill",""},
+ {buildin_changebase,"changebase","i"},
+ {buildin_changesex,"changesex",""},
+ {buildin_waitingroom,"waitingroom","si*"},
+ {buildin_warpwaitingpc,"warpwaitingpc","sii"},
+ {buildin_delwaitingroom,"delwaitingroom","*"},
+ {buildin_enablewaitingroomevent,"enablewaitingroomevent","*"},
+ {buildin_disablewaitingroomevent,"disablewaitingroomevent","*"},
+ {buildin_getwaitingroomstate,"getwaitingroomstate","i*"},
+ {buildin_warpwaitingpc,"warpwaitingpc","sii*"},
+ {buildin_attachrid,"attachrid","i"},
+ {buildin_detachrid,"detachrid",""},
+ {buildin_isloggedin,"isloggedin","i"},
+ {buildin_setmapflagnosave,"setmapflagnosave","ssii"},
+ {buildin_setmapflag,"setmapflag","si"},
+ {buildin_removemapflag,"removemapflag","si"},
+ {buildin_pvpon,"pvpon","s"},
+ {buildin_pvpoff,"pvpoff","s"},
+ {buildin_gvgon,"gvgon","s"},
+ {buildin_gvgoff,"gvgoff","s"},
+ {buildin_emotion,"emotion","i"},
+ {buildin_maprespawnguildid,"maprespawnguildid","sii"},
+ {buildin_agitstart,"agitstart",""}, // <Agit>
+ {buildin_agitend,"agitend",""},
+ {buildin_agitcheck,"agitcheck","i"}, // <Agitcheck>
+ {buildin_flagemblem,"flagemblem","i"}, // Flag Emblem
+ {buildin_getcastlename,"getcastlename","s"},
+ {buildin_getcastledata,"getcastledata","si*"},
+ {buildin_setcastledata,"setcastledata","sii"},
+ {buildin_requestguildinfo,"requestguildinfo","i*"},
+ {buildin_getequipcardcnt,"getequipcardcnt","i"},
+ {buildin_successremovecards,"successremovecards","i"},
+ {buildin_failedremovecards,"failedremovecards","ii"},
+ {buildin_marriage,"marriage","s"},
+ {buildin_wedding_effect,"wedding",""},
+ {buildin_divorce,"divorce",""},
+ {buildin_getitemname,"getitemname","i"},
+ {buildin_makepet,"makepet","i"},
+ {buildin_getexp,"getexp","ii"},
+ {buildin_getinventorylist,"getinventorylist",""},
+ {buildin_getskilllist,"getskilllist",""},
+ {buildin_clearitem,"clearitem",""},
+ {buildin_classchange,"classchange","ii"},
+ {buildin_misceffect,"misceffect","i"},
+ {buildin_soundeffect,"soundeffect","si"},
+ {buildin_strmobinfo,"strmobinfo","ii"}, // display mob data [Valaris]
+ {buildin_guardian,"guardian","siisii*i"}, // summon guardians
+ {buildin_guardianinfo,"guardianinfo","i"}, // display guardian data [Valaris]
+ {buildin_petskillbonus,"petskillbonus","iiii"}, // [Valaris]
+ {buildin_petrecovery,"petrecovery","ii"}, // [Valaris]
+ {buildin_petloot,"petloot","i"}, // [Valaris]
+ {buildin_petheal,"petheal","iii"}, // [Valaris]
+ {buildin_petmag,"petmag","iiii"}, // [Valaris]
+ {buildin_petskillattack,"petskillattack","iiii"}, // [Valaris]
+ {buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris]
+ {buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris]
+ {buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris]
+ {buildin_nude,"nude",""}, // nude command [Valaris]
+ {buildin_mapwarp,"mapwarp","ssii"}, // Added by RoVeRT
+ {buildin_inittimer,"inittimer",""},
+ {buildin_stoptimer,"stoptimer",""},
+ {buildin_cmdothernpc,"cmdothernpc","ss"},
+ {buildin_gmcommand,"gmcommand","*"}, // [MouseJstr]
+// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr]
+ {buildin_message,"message","s*"}, // [MouseJstr]
+ {buildin_npctalk,"npctalk","*"}, // [Valaris]
+ {buildin_hasitems,"hasitems","*"}, // [Valaris]
+ {buildin_mobcount,"mobcount","ss"},
+ {buildin_getlook,"getlook","i"},
+ {buildin_getsavepoint,"getsavepoint","i"},
+ {buildin_npcspeed,"npcspeed","i"}, // [Valaris]
+ {buildin_npcwalkto,"npcwalkto","ii"}, // [Valaris]
+ {buildin_npcstop,"npcstop",""}, // [Valaris]
+ {buildin_getmapxy,"getmapxy","siii*"}, //by Lorky [Lupus]
+ {NULL,NULL,NULL},
+};
+int buildin_message(struct script_state *st); // [MouseJstr]
+
+
+enum {
+ C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG,
+ C_NAME,C_EOL, C_RETINFO,
+
+ C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator
+ C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT,C_R_SHIFT,C_L_SHIFT
+};
+
+/*==========================================
+ * •¶Žš—ñ‚̃nƒbƒVƒ…‚ðŒvŽZ
+ *------------------------------------------
+ */
+static int calc_hash(const unsigned char *p)
+{
+ int h=0;
+ while(*p){
+ h=(h<<1)+(h>>3)+(h>>5)+(h>>8);
+ h+=*p++;
+ }
+ return h&15;
+}
+
+/*==========================================
+ * str_data‚Ì’†‚É–¼‘O‚ª‚ ‚é‚©ŒŸõ‚·‚é
+ *------------------------------------------
+ */
+// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Î-1
+static int search_str(const unsigned char *p)
+{
+ int i;
+ i=str_hash[calc_hash(p)];
+ while(i){
+ if(strcmp(str_buf+str_data[i].str,p)==0){
+ return i;
+ }
+ i=str_data[i].next;
+ }
+ return -1;
+}
+
+/*==========================================
+ * str_data‚É–¼‘O‚ð“o˜^
+ *------------------------------------------
+ */
+// Šù‘¶‚Ì‚Å‚ ‚ê‚ΔԆA–³‚¯‚ê‚Γo˜^‚µ‚ÄV‹K”Ô†
+static int add_str(const unsigned char *p)
+{
+ int i;
+ char *lowcase;
+
+ lowcase=strdup(p);
+ for(i=0;lowcase[i];i++)
+ lowcase[i]=tolower(lowcase[i]);
+ if((i=search_str(lowcase))>=0){
+ free(lowcase);
+ return i;
+ }
+ free(lowcase);
+
+ i=calc_hash(p);
+ if(str_hash[i]==0){
+ str_hash[i]=str_num;
+ } else {
+ i=str_hash[i];
+ for(;;){
+ if(strcmp(str_buf+str_data[i].str,p)==0){
+ return i;
+ }
+ if(str_data[i].next==0)
+ break;
+ i=str_data[i].next;
+ }
+ str_data[i].next=str_num;
+ }
+ if(str_num>=str_data_size){
+ str_data_size+=128;
+ str_data=aRealloc(str_data,sizeof(str_data[0])*str_data_size);
+ memset(str_data + (str_data_size - 128), '\0', 128);
+ }
+ while(str_pos+strlen(p)+1>=str_size){
+ str_size+=256;
+ str_buf=(char *)aRealloc(str_buf,str_size);
+ memset(str_buf + (str_size - 256), '\0', 256);
+ }
+ strcpy(str_buf+str_pos,p);
+ str_data[str_num].type=C_NOP;
+ str_data[str_num].str=str_pos;
+ str_data[str_num].next=0;
+ str_data[str_num].func=NULL;
+ str_data[str_num].backpatch=-1;
+ str_data[str_num].label=-1;
+ str_pos+=strlen(p)+1;
+ return str_num++;
+}
+
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@ƒTƒCƒY‚ÌŠm”F‚ÆŠg’£
+ *------------------------------------------
+ */
+static void check_script_buf(int size)
+{
+ if(script_pos+size>=script_size){
+ script_size+=SCRIPT_BLOCK_SIZE;
+ script_buf=(char *)aRealloc(script_buf,script_size);
+ memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
+ SCRIPT_BLOCK_SIZE);
+ }
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É‚PƒoƒCƒg‘‚«ž‚Þ
+ *------------------------------------------
+ */
+static void add_scriptb(int a)
+{
+ check_script_buf(1);
+ script_buf[script_pos++]=a;
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀf[ƒ^ƒ^ƒCƒv‚ð‘‚«ž‚Þ
+ *------------------------------------------
+ */
+static void add_scriptc(int a)
+{
+ while(a>=0x40){
+ add_scriptb((a&0x3f)|0x40);
+ a=(a-0x40)>>6;
+ }
+ add_scriptb(a&0x3f);
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚É®”‚ð‘‚«ž‚Þ
+ *------------------------------------------
+ */
+static void add_scripti(int a)
+{
+ while(a>=0x40){
+ add_scriptb(a|0xc0);
+ a=(a-0x40)>>6;
+ }
+ add_scriptb(a|0x80);
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒgƒoƒbƒtƒ@‚Ƀ‰ƒxƒ‹/•Ï”/ŠÖ”‚ð‘‚«ž‚Þ
+ *------------------------------------------
+ */
+// Å‘å16M‚Ü‚Å
+static void add_scriptl(int l)
+{
+ int backpatch = str_data[l].backpatch;
+
+ switch(str_data[l].type){
+ case C_POS:
+ add_scriptc(C_POS);
+ add_scriptb(str_data[l].label);
+ add_scriptb(str_data[l].label>>8);
+ add_scriptb(str_data[l].label>>16);
+ break;
+ case C_NOP:
+ // ƒ‰ƒxƒ‹‚̉”\«‚ª‚ ‚é‚Ì‚Åbackpatch—pƒf[ƒ^–„‚ßž‚Ý
+ add_scriptc(C_NAME);
+ str_data[l].backpatch=script_pos;
+ add_scriptb(backpatch);
+ add_scriptb(backpatch>>8);
+ add_scriptb(backpatch>>16);
+ break;
+ case C_INT:
+ add_scripti(str_data[l].val);
+ break;
+ default:
+ // ‚à‚¤‘¼‚Ì—p“r‚ÆŠm’肵‚Ä‚é‚Ì‚Å”Žš‚ð‚»‚Ì‚Ü‚Ü
+ add_scriptc(C_NAME);
+ add_scriptb(l);
+ add_scriptb(l>>8);
+ add_scriptb(l>>16);
+ break;
+ }
+}
+
+/*==========================================
+ * ƒ‰ƒxƒ‹‚ð‰ðŒˆ‚·‚é
+ *------------------------------------------
+ */
+void set_label(int l,int pos)
+{
+ int i,next;
+
+ str_data[l].type=C_POS;
+ str_data[l].label=pos;
+ for(i=str_data[l].backpatch;i>=0 && i!=0x00ffffff;){
+ next=(*(int*)(script_buf+i)) & 0x00ffffff;
+ script_buf[i-1]=C_POS;
+ script_buf[i]=pos;
+ script_buf[i+1]=pos>>8;
+ script_buf[i+2]=pos>>16;
+ i=next;
+ }
+}
+
+/*==========================================
+ * ƒXƒy[ƒX/ƒRƒƒ“ƒg“Ç‚Ý”ò‚΂µ
+ *------------------------------------------
+ */
+static unsigned char *skip_space(unsigned char *p)
+{
+ while(1){
+ while(isspace(*p))
+ p++;
+ if(p[0]=='/' && p[1]=='/'){
+ while(*p && *p!='\n')
+ p++;
+ } else if(p[0]=='/' && p[1]=='*'){
+ p++;
+ while(*p && (p[-1]!='*' || p[0]!='/'))
+ p++;
+ if(*p) p++;
+ } else
+ break;
+ }
+ return p;
+}
+
+/*==========================================
+ * ‚P’PŒêƒXƒLƒbƒv
+ *------------------------------------------
+ */
+static unsigned char *skip_word(unsigned char *p)
+{
+ // prefix
+ if(*p=='$') p++; // MAPŽI“à‹¤—L•Ï”—p
+ if(*p=='@') p++; // ˆêŽž“I•Ï”—p(like weiss)
+ if(*p=='#') p++; // account•Ï”—p
+ if(*p=='#') p++; // ƒ[ƒ‹ƒhaccount•Ï”—p
+ if(*p=='l') p++; // ˆêŽž“I•Ï”—p(like weiss)
+
+ while(isalnum(*p)||*p=='_'|| *p>=0x81)
+ if(*p>=0x81 && p[1]){
+ p+=2;
+ } else
+ p++;
+
+ // postfix
+ if(*p=='$') p++; // •¶Žš—ñ•Ï”
+
+ return p;
+}
+
+static unsigned char *startptr;
+static int startline;
+
+/*==========================================
+ * ƒGƒ‰[ƒƒbƒZ[ƒWo—Í
+ *------------------------------------------
+ */
+static void disp_error_message(const char *mes,const unsigned char *pos)
+{
+ int line,c=0,i;
+ unsigned char *p,*linestart,*lineend;
+
+ for(line=startline,p=startptr;p && *p;line++){
+ linestart=p;
+ lineend=strchr(p,'\n');
+ if(lineend){
+ c=*lineend;
+ *lineend=0;
+ }
+ if(lineend==NULL || pos<lineend){
+ printf("%s line %d : ",mes,line);
+ for(i=0;(linestart[i]!='\r') && (linestart[i]!='\n') && linestart[i];i++){
+ if(linestart+i!=pos)
+ printf("%c",linestart[i]);
+ else
+ printf("\'%c\'",linestart[i]);
+ }
+ printf("\a\n");
+ if(lineend)
+ *lineend=c;
+ return;
+ }
+ *lineend=c;
+ p=lineend+1;
+ }
+}
+
+/*==========================================
+ * €‚̉ðÍ
+ *------------------------------------------
+ */
+unsigned char* parse_simpleexpr(unsigned char *p)
+{
+ int i;
+ p=skip_space(p);
+
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_simpleexpr %s\n",p);
+#endif
+ if(*p==';' || *p==','){
+ disp_error_message("unexpected expr end",p);
+ exit(1);
+ }
+ if(*p=='('){
+
+ p=parse_subexpr(p+1,-1);
+ p=skip_space(p);
+ if((*p++)!=')'){
+ disp_error_message("unmatch ')'",p);
+ exit(1);
+ }
+ } else if(isdigit(*p) || ((*p=='-' || *p=='+') && isdigit(p[1]))){
+ char *np;
+ i=strtoul(p,&np,0);
+ add_scripti(i);
+ p=np;
+ } else if(*p=='"'){
+ add_scriptc(C_STR);
+ p++;
+ while(*p && *p!='"'){
+ if(p[-1]<=0x7e && *p=='\\')
+ p++;
+ else if(*p=='\n'){
+ disp_error_message("unexpected newline @ string",p);
+ exit(1);
+ }
+ add_scriptb(*p++);
+ }
+ if(!*p){
+ disp_error_message("unexpected eof @ string",p);
+ exit(1);
+ }
+ add_scriptb(0);
+ p++; //'"'
+ } else {
+ int c,l;
+ char *p2;
+ // label , register , function etc
+ if(skip_word(p)==p){
+ disp_error_message("unexpected character",p);
+ exit(1);
+ }
+ p2=skip_word(p);
+ c=*p2; *p2=0; // –¼‘O‚ðadd_str‚·‚é
+ l=add_str(p);
+
+ parse_cmd=l; // warn_*_mismatch_paramnum‚Ì‚½‚ß‚É•K—v
+ if(l==search_str("if")) // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
+ parse_cmd_if++;
+/*
+ // ”pŽ~—\’è‚Ìl14/l15,‚¨‚æ‚уvƒŒƒtƒBƒbƒNƒX‚Œ‚ÌŒx
+ if( strcmp(str_buf+str_data[l].str,"l14")==0 ||
+ strcmp(str_buf+str_data[l].str,"l15")==0 ){
+ disp_error_message("l14 and l15 is DEPRECATED. use @menu instead of l15.",p);
+ }else if(str_buf[str_data[l].str]=='l'){
+ disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2);
+ }
+*/
+ *p2=c; p=p2;
+
+ if(str_data[l].type!=C_FUNC && c=='['){
+ // array(name[i] => getelementofarray(name,i) )
+ add_scriptl(search_str("getelementofarray"));
+ add_scriptc(C_ARG);
+ add_scriptl(l);
+ p=parse_subexpr(p+1,-1);
+ p=skip_space(p);
+ if((*p++)!=']'){
+ disp_error_message("unmatch ']'",p);
+ exit(1);
+ }
+ add_scriptc(C_FUNC);
+ }else
+ add_scriptl(l);
+
+ }
+
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_simpleexpr end %s\n",p);
+#endif
+ return p;
+}
+
+/*==========================================
+ * Ž®‚̉ðÍ
+ *------------------------------------------
+ */
+unsigned char* parse_subexpr(unsigned char *p,int limit)
+{
+ int op,opl,len;
+ char *tmpp;
+
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_subexpr %s\n",p);
+#endif
+ p=skip_space(p);
+
+ if(*p=='-'){
+ tmpp=skip_space(p+1);
+ if(*tmpp==';' || *tmpp==','){
+ add_scriptl(LABEL_NEXTLINE);
+ p++;
+ return p;
+ }
+ }
+ tmpp=p;
+ if((op=C_NEG,*p=='-') || (op=C_LNOT,*p=='!') || (op=C_NOT,*p=='~')){
+ p=parse_subexpr(p+1,100);
+ add_scriptc(op);
+ } else
+ p=parse_simpleexpr(p);
+ p=skip_space(p);
+ while(((op=C_ADD,opl=6,len=1,*p=='+') ||
+ (op=C_SUB,opl=6,len=1,*p=='-') ||
+ (op=C_MUL,opl=7,len=1,*p=='*') ||
+ (op=C_DIV,opl=7,len=1,*p=='/') ||
+ (op=C_MOD,opl=7,len=1,*p=='%') ||
+ (op=C_FUNC,opl=8,len=1,*p=='(') ||
+ (op=C_LAND,opl=1,len=2,*p=='&' && p[1]=='&') ||
+ (op=C_AND,opl=5,len=1,*p=='&') ||
+ (op=C_LOR,opl=0,len=2,*p=='|' && p[1]=='|') ||
+ (op=C_OR,opl=4,len=1,*p=='|') ||
+ (op=C_XOR,opl=3,len=1,*p=='^') ||
+ (op=C_EQ,opl=2,len=2,*p=='=' && p[1]=='=') ||
+ (op=C_NE,opl=2,len=2,*p=='!' && p[1]=='=') ||
+ (op=C_R_SHIFT,opl=5,len=2,*p=='>' && p[1]=='>') ||
+ (op=C_GE,opl=2,len=2,*p=='>' && p[1]=='=') ||
+ (op=C_GT,opl=2,len=1,*p=='>') ||
+ (op=C_L_SHIFT,opl=5,len=2,*p=='<' && p[1]=='<') ||
+ (op=C_LE,opl=2,len=2,*p=='<' && p[1]=='=') ||
+ (op=C_LT,opl=2,len=1,*p=='<')) && opl>limit){
+ p+=len;
+ if(op==C_FUNC){
+ int i=0,func=parse_cmd;
+ const char *plist[128];
+
+ if( str_data[func].type!=C_FUNC ){
+ disp_error_message("expect function",tmpp);
+ exit(0);
+ }
+
+ add_scriptc(C_ARG);
+ do {
+ plist[i]=p;
+ p=parse_subexpr(p,-1);
+ p=skip_space(p);
+ if(*p==',') p++;
+ else if(*p!=')' && script_config.warn_func_no_comma){
+ disp_error_message("expect ',' or ')' at func params",p);
+ }
+ p=skip_space(p);
+ i++;
+ } while(*p && *p!=')' && i<128);
+ plist[i]=p;
+ if(*(p++)!=')'){
+ disp_error_message("func request '(' ')'",p);
+ exit(1);
+ }
+
+ if( str_data[func].type==C_FUNC && script_config.warn_func_mismatch_paramnum){
+ const char *arg=buildin_func[str_data[func].val].arg;
+ int j=0;
+ for(j=0;arg[j];j++) if(arg[j]=='*')break;
+ if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
+ disp_error_message("illegal number of parameters",plist[(i<j)?i:j]);
+ }
+ }
+ } else {
+ p=parse_subexpr(p,opl);
+ }
+ add_scriptc(op);
+ p=skip_space(p);
+ }
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_subexpr end %s\n",p);
+#endif
+ return p; /* return first untreated operator */
+}
+
+/*==========================================
+ * Ž®‚Ì•]‰¿
+ *------------------------------------------
+ */
+unsigned char* parse_expr(unsigned char *p)
+{
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_expr %s\n",p);
+#endif
+ switch(*p){
+ case ')': case ';': case ':': case '[': case ']':
+ case '}':
+ disp_error_message("unexpected char",p);
+ exit(1);
+ }
+ p=parse_subexpr(p,-1);
+#ifdef DEBUG_FUNCIN
+ if(battle_config.etc_log)
+ printf("parse_expr end %s\n",p);
+#endif
+ return p;
+}
+
+/*==========================================
+ * s‚̉ðÍ
+ *------------------------------------------
+ */
+unsigned char* parse_line(unsigned char *p)
+{
+ int i=0,cmd;
+ const char *plist[128];
+ char *p2;
+
+ p=skip_space(p);
+ if(*p==';')
+ return p;
+
+ parse_cmd_if=0; // warn_cmd_no_comma‚Ì‚½‚ß‚É•K—v
+
+ // ʼn‚ÍŠÖ”–¼
+ p2=p;
+ p=parse_simpleexpr(p);
+ p=skip_space(p);
+
+ cmd=parse_cmd;
+ if( str_data[cmd].type!=C_FUNC ){
+ disp_error_message("expect command",p2);
+// exit(0);
+ }
+
+ add_scriptc(C_ARG);
+ while(p && *p && *p!=';' && i<128){
+ plist[i]=p;
+
+ p=parse_expr(p);
+ p=skip_space(p);
+ // ˆø”‹æØ‚è‚Ì,ˆ—
+ if(*p==',') p++;
+ else if(*p!=';' && script_config.warn_cmd_no_comma && parse_cmd_if*2<=i ){
+ disp_error_message("expect ',' or ';' at cmd params",p);
+ }
+ p=skip_space(p);
+ i++;
+ }
+ plist[i]=p;
+ if(!p || *(p++)!=';'){
+ disp_error_message("need ';'",p);
+ exit(1);
+ }
+ add_scriptc(C_FUNC);
+
+ if( str_data[cmd].type==C_FUNC && script_config.warn_cmd_mismatch_paramnum){
+ const char *arg=buildin_func[str_data[cmd].val].arg;
+ int j=0;
+ for(j=0;arg[j];j++) if(arg[j]=='*')break;
+ if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){
+ disp_error_message("illegal number of parameters",plist[(i<j)?i:j]);
+ }
+ }
+
+
+ return p;
+}
+
+/*==========================================
+ * ‘g‚Ýž‚ÝŠÖ”‚̒ljÁ
+ *------------------------------------------
+ */
+static void add_buildin_func(void)
+{
+ int i,n;
+ for(i=0;buildin_func[i].func;i++){
+ n=add_str(buildin_func[i].name);
+ str_data[n].type=C_FUNC;
+ str_data[n].val=i;
+ str_data[n].func=buildin_func[i].func;
+ }
+}
+
+/*==========================================
+ * ’蔃f[ƒ^ƒx[ƒX‚Ì“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static void read_constdb(void)
+{
+ FILE *fp;
+ char line[1024],name[1024];
+ int val,n,i,type;
+
+ fp=fopen("db/const.txt","r");
+ if(fp==NULL){
+ printf("can't read db/const.txt\n");
+ return ;
+ }
+ while(fgets(line,1020,fp)){
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ type=0;
+ if(sscanf(line,"%[A-Za-z0-9_],%d,%d",name,&val,&type)>=2 ||
+ sscanf(line,"%[A-Za-z0-9_] %d %d",name,&val,&type)>=2){
+ for(i=0;name[i];i++)
+ name[i]=tolower(name[i]);
+ n=add_str(name);
+ if(type==0)
+ str_data[n].type=C_INT;
+ else
+ str_data[n].type=C_PARAM;
+ str_data[n].val=val;
+ }
+ }
+ fclose(fp);
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒg‚̉ðÍ
+ *------------------------------------------
+ */
+unsigned char* parse_script(unsigned char *src,int line)
+{
+ unsigned char *p,*tmpp;
+ int i;
+ static int first=1;
+
+ if(first){
+ add_buildin_func();
+ read_constdb();
+ }
+ first=0;
+ script_buf=(unsigned char *)aCalloc(SCRIPT_BLOCK_SIZE,sizeof(unsigned char));
+ script_pos=0;
+ script_size=SCRIPT_BLOCK_SIZE;
+ str_data[LABEL_NEXTLINE].type=C_NOP;
+ str_data[LABEL_NEXTLINE].backpatch=-1;
+ str_data[LABEL_NEXTLINE].label=-1;
+ for(i=LABEL_START;i<str_num;i++){
+ if(str_data[i].type==C_POS || str_data[i].type==C_NAME){
+ str_data[i].type=C_NOP;
+ str_data[i].backpatch=-1;
+ str_data[i].label=-1;
+ }
+ }
+
+ // ŠO•”—plabel db‚̉Šú‰»
+ if(scriptlabel_db!=NULL)
+ strdb_final(scriptlabel_db,scriptlabel_final);
+ scriptlabel_db=strdb_init(50);
+
+ // for error message
+ startptr = src;
+ startline = line;
+
+ p=src;
+ p=skip_space(p);
+ if(*p!='{'){
+ disp_error_message("not found '{'",p);
+ return NULL;
+ }
+ for(p++;p && *p && *p!='}';){
+ p=skip_space(p);
+ // label‚¾‚¯“ÁŽêˆ—
+ tmpp=skip_space(skip_word(p));
+ if(*tmpp==':'){
+ int l,c;
+
+ c=*skip_word(p);
+ *skip_word(p)=0;
+ l=add_str(p);
+ if(str_data[l].label!=-1){
+ *skip_word(p)=c;
+ disp_error_message("dup label ",p);
+ exit(1);
+ }
+ set_label(l,script_pos);
+ strdb_insert(scriptlabel_db,p,script_pos); // ŠO•”—plabel db“o˜^
+ *skip_word(p)=c;
+ p=tmpp+1;
+ continue;
+ }
+
+ // ‘¼‚Í‘S•”ˆê‚­‚½
+ p=parse_line(p);
+ p=skip_space(p);
+ add_scriptc(C_EOL);
+
+ set_label(LABEL_NEXTLINE,script_pos);
+ str_data[LABEL_NEXTLINE].type=C_NOP;
+ str_data[LABEL_NEXTLINE].backpatch=-1;
+ str_data[LABEL_NEXTLINE].label=-1;
+ }
+
+ add_scriptc(C_NOP);
+
+ script_size = script_pos;
+ script_buf=(char *)aRealloc(script_buf,script_pos + 1);
+
+ // –¢‰ðŒˆ‚̃‰ƒxƒ‹‚ð‰ðŒˆ
+ for(i=LABEL_START;i<str_num;i++){
+ if(str_data[i].type==C_NOP){
+ int j,next;
+ str_data[i].type=C_NAME;
+ str_data[i].label=i;
+ for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){
+ next=(*(int*)(script_buf+j)) & 0x00ffffff;
+ script_buf[j]=i;
+ script_buf[j+1]=i>>8;
+ script_buf[j+2]=i>>16;
+ j=next;
+ }
+ }
+ }
+
+#ifdef DEBUG_DISP
+ for(i=0;i<script_pos;i++){
+ if((i&15)==0) printf("%04x : ",i);
+ printf("%02x ",script_buf[i]);
+ if((i&15)==15) printf("\n");
+ }
+ printf("\n");
+#endif
+
+ return script_buf;
+}
+
+//
+// ŽÀsŒn
+//
+enum {STOP=1,END,RERUNLINE,GOTO,RETFUNC};
+
+/*==========================================
+ * rid‚©‚çsd‚ւ̉ðŒˆ
+ *------------------------------------------
+ */
+struct map_session_data *script_rid2sd(struct script_state *st)
+{
+ struct map_session_data *sd=map_id2sd(st->rid);
+ if(!sd){
+ printf("script_rid2sd: fatal error ! player not attached!\n");
+ }
+ return sd;
+}
+
+
+/*==========================================
+ * •Ï”‚Ì“Ç‚ÝŽæ‚è
+ *------------------------------------------
+ */
+int get_val(struct script_state*st,struct script_data* data)
+{
+ struct map_session_data *sd=NULL;
+ if(data->type==C_NAME){
+ char *name=str_buf+str_data[data->u.num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+
+ if(prefix!='$'){
+ if((sd=script_rid2sd(st))==NULL)
+ printf("get_val error name?:%s\n",name);
+ }
+ if(postfix=='$'){
+
+ data->type=C_CONSTSTR;
+ if( prefix=='@' || prefix=='l' ){
+ if(sd)
+ data->u.str = pc_readregstr(sd,data->u.num);
+ }else if(prefix=='$'){
+ data->u.str = (char *)numdb_search(mapregstr_db,data->u.num);
+ }else{
+ printf("script: get_val: illegal scope string variable.\n");
+ data->u.str = "!!ERROR!!";
+ }
+ if( data->u.str == NULL )
+ data->u.str ="";
+
+ }else{
+
+ data->type=C_INT;
+ if(str_data[data->u.num&0x00ffffff].type==C_INT){
+ data->u.num = str_data[data->u.num&0x00ffffff].val;
+ }else if(str_data[data->u.num&0x00ffffff].type==C_PARAM){
+ if(sd)
+ data->u.num = pc_readparam(sd,str_data[data->u.num&0x00ffffff].val);
+ }else if(prefix=='@' || prefix=='l'){
+ if(sd)
+ data->u.num = pc_readreg(sd,data->u.num);
+ }else if(prefix=='$'){
+ data->u.num = (int)numdb_search(mapreg_db,data->u.num);
+ }else if(prefix=='#'){
+ if( name[1]=='#'){
+ if(sd)
+ data->u.num = pc_readaccountreg2(sd,name);
+ }else{
+ if(sd)
+ data->u.num = pc_readaccountreg(sd,name);
+ }
+ }else{
+ if(sd)
+ data->u.num = pc_readglobalreg(sd,name);
+ }
+ }
+ }
+ return 0;
+}
+/*==========================================
+ * •Ï”‚Ì“Ç‚ÝŽæ‚è2
+ *------------------------------------------
+ */
+void* get_val2(struct script_state*st,int num)
+{
+ struct script_data dat;
+ dat.type=C_NAME;
+ dat.u.num=num;
+ get_val(st,&dat);
+ if( dat.type==C_INT ) return (void*)dat.u.num;
+ else return (void*)dat.u.str;
+}
+
+/*==========================================
+ * •Ï”Ý’è—p
+ *------------------------------------------
+ */
+static int set_reg(struct map_session_data *sd,int num,char *name,void *v)
+{
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+
+ if( postfix=='$' ){
+ char *str=(char*)v;
+ if( prefix=='@' || prefix=='l'){
+ pc_setregstr(sd,num,str);
+ }else if(prefix=='$') {
+ mapreg_setregstr(num,str);
+ }else{
+ printf("script: set_reg: illegal scope string variable !");
+ }
+ }else{
+ // ”’l
+ int val = (int)v;
+ if(str_data[num&0x00ffffff].type==C_PARAM){
+ pc_setparam(sd,str_data[num&0x00ffffff].val,val);
+ }else if(prefix=='@' || prefix=='l') {
+ pc_setreg(sd,num,val);
+ }else if(prefix=='$') {
+ mapreg_setreg(num,val);
+ }else if(prefix=='#') {
+ if( name[1]=='#' )
+ pc_setaccountreg2(sd,name,val);
+ else
+ pc_setaccountreg(sd,name,val);
+ }else{
+ pc_setglobalreg(sd,name,val);
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ * •¶Žš—ñ‚Ö‚Ì•ÏŠ·
+ *------------------------------------------
+ */
+char* conv_str(struct script_state *st,struct script_data *data)
+{
+ get_val(st,data);
+ if(data->type==C_INT){
+ char *buf;
+ buf=(char *)aCalloc(16,sizeof(char));
+ sprintf(buf,"%d",data->u.num);
+ data->type=C_STR;
+ data->u.str=buf;
+#if 1
+ } else if(data->type==C_NAME){
+ // ƒeƒ“ƒ|ƒ‰ƒŠB–{—ˆ–³‚¢‚Í‚¸
+ data->type=C_CONSTSTR;
+ data->u.str=str_buf+str_data[data->u.num].str;
+#endif
+ }
+ return data->u.str;
+}
+
+/*==========================================
+ * ”’l‚Ö•ÏŠ·
+ *------------------------------------------
+ */
+int conv_num(struct script_state *st,struct script_data *data)
+{
+ char *p;
+ get_val(st,data);
+ if(data->type==C_STR || data->type==C_CONSTSTR){
+ p=data->u.str;
+ data->u.num = atoi(p);
+ if(data->type==C_STR)
+ free(p);
+ data->type=C_INT;
+ }
+ return data->u.num;
+}
+
+/*==========================================
+ * ƒXƒ^ƒbƒN‚Ö”’l‚ðƒvƒbƒVƒ…
+ *------------------------------------------
+ */
+void push_val(struct script_stack *stack,int type,int val)
+{
+ if(stack->sp >= stack->sp_max){
+ stack->sp_max += 64;
+ stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
+ sizeof(stack->stack_data[0]) * stack->sp_max);
+ memset(stack->stack_data + (stack->sp_max - 64), 0,
+ 64 * sizeof(*(stack->stack_data)));
+ }
+// if(battle_config.etc_log)
+// printf("push (%d,%d)-> %d\n",type,val,stack->sp);
+ stack->stack_data[stack->sp].type=type;
+ stack->stack_data[stack->sp].u.num=val;
+ stack->sp++;
+}
+
+/*==========================================
+ * ƒXƒ^ƒbƒN‚Ö•¶Žš—ñ‚ðƒvƒbƒVƒ…
+ *------------------------------------------
+ */
+void push_str(struct script_stack *stack,int type,unsigned char *str)
+{
+ if(stack->sp>=stack->sp_max){
+ stack->sp_max += 64;
+ stack->stack_data = (struct script_data *)aRealloc(stack->stack_data,
+ sizeof(stack->stack_data[0]) * stack->sp_max);
+ memset(stack->stack_data + (stack->sp_max - 64), '\0',
+ 64 * sizeof(*(stack->stack_data)));
+ }
+// if(battle_config.etc_log)
+// printf("push (%d,%x)-> %d\n",type,str,stack->sp);
+ stack->stack_data[stack->sp].type=type;
+ stack->stack_data[stack->sp].u.str=str;
+ stack->sp++;
+}
+
+/*==========================================
+ * ƒXƒ^ƒbƒN‚Ö•¡»‚ðƒvƒbƒVƒ…
+ *------------------------------------------
+ */
+void push_copy(struct script_stack *stack,int pos)
+{
+ switch(stack->stack_data[pos].type){
+ case C_CONSTSTR:
+ push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str);
+ break;
+ case C_STR:
+ push_str(stack,C_STR,strdup(stack->stack_data[pos].u.str));
+ break;
+ default:
+ push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num);
+ break;
+ }
+}
+
+/*==========================================
+ * ƒXƒ^ƒbƒN‚©‚çƒ|ƒbƒv
+ *------------------------------------------
+ */
+void pop_stack(struct script_stack* stack,int start,int end)
+{
+ int i;
+ for(i=start;i<end;i++){
+ if(stack->stack_data[i].type==C_STR){
+ free(stack->stack_data[i].u.str);
+ }
+ }
+ if(stack->sp>end){
+ memmove(&stack->stack_data[start],&stack->stack_data[end],sizeof(stack->stack_data[0])*(stack->sp-end));
+ }
+ stack->sp-=end-start;
+}
+
+//
+// –„‚ßž‚ÝŠÖ”
+//
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_mes(struct script_state *st)
+{
+ conv_str(st,& (st->stack->stack_data[st->start+2]));
+ clif_scriptmes(script_rid2sd(st),st->oid,st->stack->stack_data[st->start+2].u.str);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_goto(struct script_state *st)
+{
+ int pos;
+
+ if( st->stack->stack_data[st->start+2].type!=C_POS ){
+ printf("script: goto: not label !\n");
+ st->state=END;
+ return 0;
+ }
+
+ pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ st->pos=pos;
+ st->state=GOTO;
+ return 0;
+}
+
+/*==========================================
+ * ƒ†[ƒU[’è‹`ŠÖ”‚̌ĂÑo‚µ
+ *------------------------------------------
+ */
+int buildin_callfunc(struct script_state *st)
+{
+ char *scr;
+ char *str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+
+ if( (scr=strdb_search(script_get_userfunc_db(),str)) ){
+ int i,j;
+ for(i=st->start+3,j=0;i<st->end;i++,j++)
+ push_copy(st->stack,i);
+
+ push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
+
+ st->pos=0;
+ st->script=scr;
+ st->defsp=st->start+4+j;
+ st->state=GOTO;
+ }else{
+ printf("script:callfunc: function not found! [%s]\n",str);
+ st->state=END;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒTƒuƒ‹[ƒeƒBƒ“‚̌ĂÑo‚µ
+ *------------------------------------------
+ */
+int buildin_callsub(struct script_state *st)
+{
+ int pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int i,j;
+ for(i=st->start+3,j=0;i<st->end;i++,j++)
+ push_copy(st->stack,i);
+
+ push_val(st->stack,C_INT,j); // ˆø”‚Ì”‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_INT,st->defsp); // Œ»Ý‚̊Xƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_INT,(int)st->script); // Œ»Ý‚̃XƒNƒŠƒvƒg‚ðƒvƒbƒVƒ…
+ push_val(st->stack,C_RETINFO,st->pos); // Œ»Ý‚̃XƒNƒŠƒvƒgˆÊ’u‚ðƒvƒbƒVƒ…
+
+ st->pos=pos;
+ st->defsp=st->start+4+j;
+ st->state=GOTO;
+ return 0;
+}
+
+/*==========================================
+ * ˆø”‚ÌŠ“¾
+ *------------------------------------------
+ */
+int buildin_getarg(struct script_state *st)
+{
+ int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int max,stsp;
+ if( st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO ){
+ printf("script:getarg without callfunc or callsub!\n");
+ st->state=END;
+ return 0;
+ }
+ max=conv_num(st,& (st->stack->stack_data[st->defsp-4]));
+ stsp=st->defsp - max -4;
+ if( num >= max ){
+ printf("script:getarg arg1(%d) out of range(%d) !\n",num,max);
+ st->state=END;
+ return 0;
+ }
+ push_copy(st->stack,stsp+num);
+ return 0;
+}
+
+/*==========================================
+ * ƒTƒuƒ‹[ƒ`ƒ“/ƒ†[ƒU[’è‹`ŠÖ”‚ÌI—¹
+ *------------------------------------------
+ */
+int buildin_return(struct script_state *st)
+{
+ if(st->end>st->start+2){ // –ß‚è’l—L‚è
+ push_copy(st->stack,st->start+2);
+ }
+ st->state=RETFUNC;
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_next(struct script_state *st)
+{
+ st->state=STOP;
+ clif_scriptnext(script_rid2sd(st),st->oid);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_close(struct script_state *st)
+{
+ st->state=END;
+ clif_scriptclose(script_rid2sd(st),st->oid);
+ return 0;
+}
+int buildin_close2(struct script_state *st)
+{
+ st->state=STOP;
+ clif_scriptclose(script_rid2sd(st),st->oid);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_menu(struct script_state *st)
+{
+ char *buf;
+ int len,i;
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ if(sd->state.menu_or_input==0){
+ st->state=RERUNLINE;
+ sd->state.menu_or_input=1;
+ for(i=st->start+2,len=16;i<st->end;i+=2){
+ conv_str(st,& (st->stack->stack_data[i]));
+ len+=strlen(st->stack->stack_data[i].u.str)+1;
+ }
+ buf=(char *)aCalloc(len,sizeof(char));
+ buf[0]=0;
+ for(i=st->start+2,len=0;i<st->end;i+=2){
+ strcat(buf,st->stack->stack_data[i].u.str);
+ strcat(buf,":");
+ }
+ clif_scriptmenu(script_rid2sd(st),st->oid,buf);
+ free(buf);
+ } else if(sd->npc_menu==0xff){ // cansel
+ sd->state.menu_or_input=0;
+ st->state=END;
+ } else { // goto“®ì
+ // ragemuŒÝŠ·‚Ì‚½‚ß
+ pc_setreg(sd,add_str("l15"),sd->npc_menu);
+ pc_setreg(sd,add_str("@menu"),sd->npc_menu);
+ sd->state.menu_or_input=0;
+ if(sd->npc_menu>0 && sd->npc_menu<(st->end-st->start)/2){
+ int pos;
+ if( st->stack->stack_data[st->start+sd->npc_menu*2+1].type!=C_POS ){
+ printf("script: menu: not label !\n");
+ st->state=END;
+ return 0;
+ }
+ pos=conv_num(st,& (st->stack->stack_data[st->start+sd->npc_menu*2+1]));
+ st->pos=pos;
+ st->state=GOTO;
+ }
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_rand(struct script_state *st)
+{
+ int range,min,max;
+
+ if(st->end>st->start+3){
+ min=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ max=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if(max<min){
+ int tmp;
+ tmp=min;
+ min=max;
+ max=tmp;
+ }
+ range=max-min+1;
+ push_val(st->stack,C_INT,rand()%range+min);
+ } else {
+ range=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ push_val(st->stack,C_INT,rand()%range);
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_warp(struct script_state *st)
+{
+ int x,y;
+ char *str;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ if(strcmp(str,"Random")==0)
+ pc_randomwarp(sd,3);
+ else if(strcmp(str,"SavePoint")==0){
+ if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
+ return 0;
+
+ pc_setpos(sd,sd->status.save_point.map,
+ sd->status.save_point.x,sd->status.save_point.y,3);
+ }else if(strcmp(str,"Save")==0){
+ if(map[sd->bl.m].flag.noreturn) // ’±‹ÖŽ~
+ return 0;
+
+ pc_setpos(sd,sd->status.save_point.map,
+ sd->status.save_point.x,sd->status.save_point.y,3);
+ }else
+ pc_setpos(sd,str,x,y,0);
+ return 0;
+}
+/*==========================================
+ * ƒGƒŠƒAŽw’èƒ[ƒv
+ *------------------------------------------
+ */
+int buildin_areawarp_sub(struct block_list *bl,va_list ap)
+{
+ int x,y;
+ char *map;
+ map=va_arg(ap, char *);
+ x=va_arg(ap,int);
+ y=va_arg(ap,int);
+ if(strcmp(map,"Random")==0)
+ pc_randomwarp((struct map_session_data *)bl,3);
+ else
+ pc_setpos((struct map_session_data *)bl,map,x,y,0);
+ return 0;
+}
+int buildin_areawarp(struct script_state *st)
+{
+ int x,y,m;
+ char *str;
+ char *mapname;
+ int x0,y0,x1,y1;
+
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ str=conv_str(st,& (st->stack->stack_data[st->start+7]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+8]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+9]));
+
+ if( (m=map_mapname2mapid(mapname))< 0)
+ return 0;
+
+ map_foreachinarea(buildin_areawarp_sub,
+ m,x0,y0,x1,y1,BL_PC, str,x,y );
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_heal(struct script_state *st)
+{
+ int hp,sp;
+
+ hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pc_heal(script_rid2sd(st),hp,sp);
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_itemheal(struct script_state *st)
+{
+ int hp,sp;
+
+ hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pc_itemheal(script_rid2sd(st),hp,sp);
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_percentheal(struct script_state *st)
+{
+ int hp,sp;
+
+ hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pc_percentheal(script_rid2sd(st),hp,sp);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_jobchange(struct script_state *st)
+{
+ int job, upper=-1;
+
+ job=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if( st->end>st->start+3 )
+ upper=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if ((job >= 0 && job < MAX_PC_CLASS))
+ pc_jobchange(script_rid2sd(st),job, upper);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_input(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0;
+ char *name=(st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:"";
+// char prefix=*name;
+ char postfix=name[strlen(name)-1];
+
+ sd=script_rid2sd(st);
+ if(sd->state.menu_or_input){
+ sd->state.menu_or_input=0;
+ if( postfix=='$' ){
+ // •¶Žš—ñ
+ if(st->end>st->start+2){ // ˆø”1ŒÂ
+ set_reg(sd,num,name,(void*)sd->npc_str);
+ }else{
+ printf("buildin_input: string discarded !!\n");
+ }
+ }else{
+
+ //commented by Lupus (check Value Number Input fix in clif.c)
+ //** Fix by fritz :X keeps people from abusing old input bugs
+ if(sd->npc_amount < 0) //** If input amount is less then 0
+ {
+ clif_tradecancelled(sd); // added "Deal has been cancelled" message by Valaris
+ buildin_close(st); //** close
+ }
+
+ // ”’l
+ if(st->end>st->start+2){ // ˆø”1ŒÂ
+ set_reg(sd,num,name,(void*)sd->npc_amount);
+ } else {
+ // ragemuŒÝŠ·‚Ì‚½‚ß
+ pc_setreg(sd,add_str("l14"),sd->npc_amount);
+ }
+ }
+ } else {
+ st->state=RERUNLINE;
+ if(postfix=='$')clif_scriptinputstr(sd,st->oid);
+ else clif_scriptinput(sd,st->oid);
+ sd->state.menu_or_input=1;
+ }
+ return 0;
+}
+
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_if(struct script_state *st)
+{
+ int sel,i;
+
+ sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if(!sel)
+ return 0;
+
+ // ŠÖ”–¼‚ðƒRƒs[
+ push_copy(st->stack,st->start+3);
+ // ŠÔ‚Ɉø”ƒ}[ƒJ‚ð“ü‚ê‚Ä
+ push_val(st->stack,C_ARG,0);
+ // Žc‚è‚̈ø”‚ðƒRƒs[
+ for(i=st->start+4;i<st->end;i++){
+ push_copy(st->stack,i);
+ }
+ run_func(st);
+
+ return 0;
+}
+
+
+/*==========================================
+ * •Ï”Ý’è
+ *------------------------------------------
+ */
+int buildin_set(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+
+ if( st->stack->stack_data[st->start+2].type!=C_NAME ){
+ printf("script: buildin_set: not name\n");
+ return 0;
+ }
+
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+
+
+ if( postfix=='$' ){
+ // •¶Žš—ñ
+ char *str = conv_str(st,& (st->stack->stack_data[st->start+3]));
+ set_reg(sd,num,name,(void*)str);
+ }else{
+ // ”’l
+ int val = conv_num(st,& (st->stack->stack_data[st->start+3]));
+ set_reg(sd,num,name,(void*)val);
+ }
+
+ return 0;
+}
+/*==========================================
+ * ”z—ñ•Ï”Ý’è
+ *------------------------------------------
+ */
+int buildin_setarray(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+ int i,j;
+
+ if( prefix!='$' && prefix!='@' ){
+ printf("buildin_setarray: illegal scope !\n");
+ return 0;
+ }
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+
+ for(j=0,i=st->start+3; i<st->end && j<128;i++,j++){
+ void *v;
+ if( postfix=='$' )
+ v=(void*)conv_str(st,& (st->stack->stack_data[i]));
+ else
+ v=(void*)conv_num(st,& (st->stack->stack_data[i]));
+ set_reg( sd, num+(j<<24), name, v);
+ }
+ return 0;
+}
+/*==========================================
+ * ”z—ñ•Ï”ƒNƒŠƒA
+ *------------------------------------------
+ */
+int buildin_cleararray(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+ int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ int i;
+ void *v;
+
+ if( prefix!='$' && prefix!='@' ){
+ printf("buildin_cleararray: illegal scope !\n");
+ return 0;
+ }
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+
+ if( postfix=='$' )
+ v=(void*)conv_str(st,& (st->stack->stack_data[st->start+3]));
+ else
+ v=(void*)conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ for(i=0;i<sz;i++)
+ set_reg(sd,num+(i<<24),name,v);
+ return 0;
+}
+/*==========================================
+ * ”z—ñ•Ï”ƒRƒs[
+ *------------------------------------------
+ */
+int buildin_copyarray(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+ int num2=st->stack->stack_data[st->start+3].u.num;
+ char *name2=str_buf+str_data[num2&0x00ffffff].str;
+ char prefix2=*name2;
+ char postfix2=name2[strlen(name2)-1];
+ int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ int i;
+
+ if( prefix!='$' && prefix!='@' && prefix2!='$' && prefix2!='@' ){
+ printf("buildin_copyarray: illegal scope !\n");
+ return 0;
+ }
+ if( (postfix=='$' || postfix2=='$') && postfix!=postfix2 ){
+ printf("buildin_copyarray: type mismatch !\n");
+ return 0;
+ }
+ if( prefix!='$' || prefix2!='$' )
+ sd=script_rid2sd(st);
+
+
+ for(i=0;i<sz;i++)
+ set_reg(sd,num+(i<<24),name, get_val2(st,num2+(i<<24)) );
+ return 0;
+}
+/*==========================================
+ * ”z—ñ•Ï”‚̃TƒCƒYŠ“¾
+ *------------------------------------------
+ */
+static int getarraysize(struct script_state *st,int num,int postfix)
+{
+ int i=(num>>24),c=i;
+ for(;i<128;i++){
+ void *v=get_val2(st,num+(i<<24));
+ if(postfix=='$' && *((char*)v) ) c=i;
+ if(postfix!='$' && (int)v )c=i;
+ }
+ return c+1;
+}
+int buildin_getarraysize(struct script_state *st)
+{
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+
+ if( prefix!='$' && prefix!='@' ){
+ printf("buildin_copyarray: illegal scope !\n");
+ return 0;
+ }
+
+ push_val(st->stack,C_INT,getarraysize(st,num,postfix) );
+ return 0;
+}
+/*==========================================
+ * ”z—ñ•Ï”‚©‚ç—v‘fíœ
+ *------------------------------------------
+ */
+int buildin_deletearray(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int num=st->stack->stack_data[st->start+2].u.num;
+ char *name=str_buf+str_data[num&0x00ffffff].str;
+ char prefix=*name;
+ char postfix=name[strlen(name)-1];
+ int count=1;
+ int i,sz=getarraysize(st,num,postfix)-(num>>24)-count+1;
+
+
+ if( (st->end > st->start+3) )
+ count=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if( prefix!='$' && prefix!='@' ){
+ printf("buildin_deletearray: illegal scope !\n");
+ return 0;
+ }
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+
+ for(i=0;i<sz;i++){
+ set_reg(sd,num+(i<<24),name, get_val2(st,num+((i+count)<<24) ) );
+ }
+ for(;i<(128-(num>>24));i++){
+ if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0);
+ if( postfix=='$' ) set_reg(sd,num+(i<<24),name, "");
+ }
+ return 0;
+}
+
+/*==========================================
+ * Žw’è—v‘f‚ð•\‚·’l(ƒL[)‚ðŠ“¾‚·‚é
+ *------------------------------------------
+ */
+int buildin_getelementofarray(struct script_state *st)
+{
+ if( st->stack->stack_data[st->start+2].type==C_NAME ){
+ int i=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if(i>127 || i<0){
+ printf("script: getelementofarray (operator[]): param2 illegal number %d\n",i);
+ push_val(st->stack,C_INT,0);
+ }else{
+ push_val(st->stack,C_NAME,
+ (i<<24) | st->stack->stack_data[st->start+2].u.num );
+ }
+ }else{
+ printf("script: getelementofarray (operator[]): param1 not name !\n");
+ push_val(st->stack,C_INT,0);
+ }
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_setlook(struct script_state *st)
+{
+ int type,val;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ pc_changelook(script_rid2sd(st),type,val);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_cutin(struct script_state *st)
+{
+ int type;
+
+ conv_str(st,& (st->stack->stack_data[st->start+2]));
+ type=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ clif_cutin(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str,type);
+
+ return 0;
+}
+/*==========================================
+ * ƒJ[ƒh‚̃Cƒ‰ƒXƒg‚ð•\Ž¦‚·‚é
+ *------------------------------------------
+ */
+int buildin_cutincard(struct script_state *st)
+{
+ int itemid;
+
+ itemid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ clif_cutin(script_rid2sd(st),itemdb_search(itemid)->cardillustname,4);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_viewpoint(struct script_state *st)
+{
+ int type,x,y,id,color;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ id=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ color=conv_num(st,& (st->stack->stack_data[st->start+6]));
+
+ clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color);
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_countitem(struct script_state *st)
+{
+ int nameid=0,count=0,i;
+ struct map_session_data *sd;
+
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data;
+ if( (item_data = itemdb_searchname(name)) != NULL)
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ if (nameid>=500) //if no such ID then skip this iteration
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid==nameid)
+ count+=sd->status.inventory[i].amount;
+ }
+ else{
+ if(battle_config.error_log)
+ printf("wrong item ID : countitem(%i)\n",nameid);
+ }
+ push_val(st->stack,C_INT,count);
+
+ return 0;
+}
+
+/*==========================================
+ * d—ʃ`ƒFƒbƒN
+ *------------------------------------------
+ */
+int buildin_checkweight(struct script_state *st)
+{
+ int nameid=0,amount;
+ struct map_session_data *sd;
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ if( item_data )
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if ( amount<=0 || nameid<500 ) { //if get wrong item ID or amount<=0, don't count weight of non existing items
+ push_val(st->stack,C_INT,0);
+ }
+
+ sd=script_rid2sd(st);
+ if(itemdb_weight(nameid)*amount + sd->weight > sd->max_weight){
+ push_val(st->stack,C_INT,0);
+ } else {
+ push_val(st->stack,C_INT,1);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_getitem(struct script_state *st)
+{
+ int nameid,amount,flag = 0;
+ struct item item_tmp;
+ struct map_session_data *sd;
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ nameid=512; //Apple item ID
+ if( item_data != NULL)
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ if ( ( amount=conv_num(st,& (st->stack->stack_data[st->start+3])) ) <= 0) {
+ return 0; //return if amount <=0, skip the useles iteration
+ }
+ //Violet Box, Blue Box, etc - random item pick
+ if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
+ nameid=itemdb_searchrandomid(-nameid);
+ #ifndef TXT_ONLY
+ if(log_config.present > 0)
+ log_present(sd, -nameid, nameid);
+ #endif //USE_SQL
+ flag = 1;
+ }
+
+ if(nameid > 0) {
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid=nameid;
+ if(!flag)
+ item_tmp.identify=1;
+ else
+ item_tmp.identify=!itemdb_isequip3(nameid);
+ if( st->end>st->start+5 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
+ sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+5])));
+ if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
+ return 0;
+ if((flag = pc_additem(sd,&item_tmp,amount))) {
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_getitem2(struct script_state *st)
+{
+ int nameid,amount,flag = 0;
+ int iden,ref,attr,c1,c2,c3,c4;
+ struct item_data *item_data;
+ struct item item_tmp;
+ struct map_session_data *sd;
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ nameid=512; //Apple item ID
+ if( item_data )
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ iden=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ ref=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ attr=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ c1=conv_num(st,& (st->stack->stack_data[st->start+7]));
+ c2=conv_num(st,& (st->stack->stack_data[st->start+8]));
+ c3=conv_num(st,& (st->stack->stack_data[st->start+9]));
+ c4=conv_num(st,& (st->stack->stack_data[st->start+10]));
+ if( st->end>st->start+11 ) //ƒAƒCƒeƒ€‚ðŽw’肵‚½ID‚É“n‚·
+ sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+11])));
+ if(sd == NULL) //ƒAƒCƒeƒ€‚ð“n‚·‘ŠŽè‚ª‚¢‚È‚©‚Á‚½‚炨‹A‚è
+ return 0;
+
+ if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
+ nameid=itemdb_searchrandomid(-nameid);
+ flag = 1;
+ }
+
+ if(nameid > 0) {
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_data=itemdb_search(nameid);
+ if(item_data->type==4 || item_data->type==5){
+ if(ref > 10) ref = 10;
+ }
+ else if(item_data->type==7) {
+ iden = 1;
+ ref = 0;
+ }
+ else {
+ iden = 1;
+ ref = attr = 0;
+ }
+
+ item_tmp.nameid=nameid;
+ if(!flag)
+ item_tmp.identify=iden;
+ else if(item_data->type==4 || item_data->type==5)
+ item_tmp.identify=0;
+ item_tmp.refine=ref;
+ item_tmp.attribute=attr;
+ item_tmp.card[0]=c1;
+ item_tmp.card[1]=c2;
+ item_tmp.card[2]=c3;
+ item_tmp.card[3]=c4;
+ if((flag = pc_additem(sd,&item_tmp,amount))) {
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_makeitem(struct script_state *st)
+{
+ int nameid,amount,flag = 0;
+ int x,y,m;
+ char *mapname;
+ struct item item_tmp;
+ struct map_session_data *sd;
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ nameid=512; //Apple Item ID
+ if( item_data )
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ mapname =conv_str(st,& (st->stack->stack_data[st->start+4]));
+ x =conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y =conv_num(st,& (st->stack->stack_data[st->start+6]));
+
+ if( sd && strcmp(mapname,"this")==0)
+ m=sd->bl.m;
+ else
+ m=map_mapname2mapid(mapname);
+
+ if(nameid<0) { // ƒ‰ƒ“ƒ_ƒ€
+ nameid=itemdb_searchrandomid(-nameid);
+ flag = 1;
+ }
+
+ if(nameid > 0) {
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid=nameid;
+ if(!flag)
+ item_tmp.identify=1;
+ else
+ item_tmp.identify=!itemdb_isequip3(nameid);
+
+// clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,amount,m,x,y,NULL,NULL,NULL,0);
+ }
+
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_delitem(struct script_state *st)
+{
+ int nameid=0,amount,i;
+ struct map_session_data *sd;
+ struct script_data *data;
+
+ sd = script_rid2sd(st);
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ //nameid=512;
+ if( item_data )
+ nameid=item_data->nameid;
+ }else
+ nameid=conv_num(st,data);
+
+ amount=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if (nameid<500 || amount<=0 ) {//by Lupus. Don't run FOR if u got wrong item ID or amount<=0
+ //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount);
+ return 0;
+ }
+ sd=script_rid2sd(st);
+
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL ||
+ sd->inventory_data[i]->type!=7 ||
+ sd->status.inventory[i].amount<=0)
+ continue;
+ if(sd->status.inventory[i].nameid == nameid){
+ if(sd->status.inventory[i].card[0] == (short)0xff00){
+ if(search_petDB_index(nameid, PET_EGG) >= 0){
+ intif_delete_petdata(*((long *)(&sd->status.inventory[i].card[1])));
+ break;
+ }
+ }
+ }
+ }
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid==nameid){
+ if(sd->status.inventory[i].amount>=amount){
+ pc_delitem(sd,i,amount,0);
+ break;
+ } else {
+ amount-=sd->status.inventory[i].amount;
+ if(amount==0)
+ amount=sd->status.inventory[i].amount;
+ pc_delitem(sd,i,amount,0);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *ƒLƒƒƒ‰ŠÖŒW‚̃pƒ‰ƒ[ƒ^Žæ“¾
+ *------------------------------------------
+ */
+int buildin_readparam(struct script_state *st)
+{
+ int type;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if( st->end>st->start+3 )
+ sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
+ else
+ sd=script_rid2sd(st);
+
+ if(sd==NULL){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+ push_val(st->stack,C_INT,pc_readparam(sd,type));
+
+ return 0;
+}
+/*==========================================
+ *ƒLƒƒƒ‰ŠÖŒW‚ÌIDŽæ“¾
+ *------------------------------------------
+ */
+int buildin_getcharid(struct script_state *st)
+{
+ int num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if( st->end>st->start+3 )
+ sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3])));
+ else
+ sd=script_rid2sd(st);
+ if(sd==NULL){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ if(num==0)
+ push_val(st->stack,C_INT,sd->status.char_id);
+ if(num==1)
+ push_val(st->stack,C_INT,sd->status.party_id);
+ if(num==2)
+ push_val(st->stack,C_INT,sd->status.guild_id);
+ if(num==3)
+ push_val(st->stack,C_INT,sd->status.account_id);
+ return 0;
+}
+/*==========================================
+ *Žw’èID‚ÌPT–¼Žæ“¾
+ *------------------------------------------
+ */
+char *buildin_getpartyname_sub(int party_id)
+{
+ struct party *p;
+
+ p=NULL;
+ p=party_search(party_id);
+
+ if(p!=NULL){
+ char *buf;
+ buf=(char *)aCalloc(24,sizeof(char));
+ strcpy(buf,p->name);
+ return buf;
+ }
+
+ return 0;
+}
+int buildin_getpartyname(struct script_state *st)
+{
+ char *name;
+ int party_id;
+
+ party_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ name=buildin_getpartyname_sub(party_id);
+ if(name!=0)
+ push_str(st->stack,C_STR,name);
+ else
+ push_str(st->stack,C_CONSTSTR,"null");
+
+ return 0;
+}
+/*==========================================
+ *Žw’èID‚ÌPTl”‚ƃƒ“ƒo[IDŽæ“¾
+ *------------------------------------------
+ */
+int buildin_getpartymember(struct script_state *st)
+{
+ struct party *p;
+ int i,j=0;
+
+ p=NULL;
+ p=party_search(conv_num(st,& (st->stack->stack_data[st->start+2])));
+
+ if(p!=NULL){
+ for(i=0;i<MAX_PARTY;i++){
+ if(p->member[i].account_id){
+// printf("name:%s %d\n",p->member[i].name,i);
+ mapreg_setregstr(add_str("$@partymembername$")+(i<<24),p->member[i].name);
+ j++;
+ }
+ }
+ }
+ mapreg_setreg(add_str("$@partymembercount"),j);
+
+ return 0;
+}
+/*==========================================
+ *Žw’èID‚̃Mƒ‹ƒh–¼Žæ“¾
+ *------------------------------------------
+ */
+char *buildin_getguildname_sub(int guild_id)
+{
+ struct guild *g=NULL;
+ g=guild_search(guild_id);
+
+ if(g!=NULL){
+ char *buf;
+ buf=(char *)aCalloc(24,sizeof(char));
+ strcpy(buf,g->name);
+ return buf;
+ }
+ return 0;
+}
+int buildin_getguildname(struct script_state *st)
+{
+ char *name;
+ int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ name=buildin_getguildname_sub(guild_id);
+ if(name!=0)
+ push_str(st->stack,C_STR,name);
+ else
+ push_str(st->stack,C_CONSTSTR,"null");
+ return 0;
+}
+
+/*==========================================
+ *Žw’èID‚ÌGuildMaster–¼Žæ“¾
+ *------------------------------------------
+ */
+char *buildin_getguildmaster_sub(int guild_id)
+{
+ struct guild *g=NULL;
+ g=guild_search(guild_id);
+
+ if(g!=NULL){
+ char *buf;
+ buf=(char *)aCalloc(24,sizeof(char));
+ strncpy(buf,g->master, 23);
+ return buf;
+ }
+
+ return 0;
+}
+int buildin_getguildmaster(struct script_state *st)
+{
+ char *master;
+ int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ master=buildin_getguildmaster_sub(guild_id);
+ if(master!=0)
+ push_str(st->stack,C_STR,master);
+ else
+ push_str(st->stack,C_CONSTSTR,"null");
+ return 0;
+}
+
+int buildin_getguildmasterid(struct script_state *st)
+{
+ char *master;
+ struct map_session_data *sd=NULL;
+ int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ master=buildin_getguildmaster_sub(guild_id);
+ if(master!=0){
+ if((sd=map_nick2sd(master)) == NULL){
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+ push_val(st->stack,C_INT,sd->status.char_id);
+ }else{
+ push_val(st->stack,C_INT,0);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒLƒƒƒ‰ƒNƒ^‚Ì–¼‘O
+ *------------------------------------------
+ */
+int buildin_strcharinfo(struct script_state *st)
+{
+ struct map_session_data *sd;
+ int num;
+
+ sd=script_rid2sd(st);
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if(num==0){
+ char *buf;
+ buf=(char *)aCalloc(24,sizeof(char));
+ strncpy(buf,sd->status.name, 23);
+ push_str(st->stack,C_STR,buf);
+ }
+ if(num==1){
+ char *buf;
+ buf=buildin_getpartyname_sub(sd->status.party_id);
+ if(buf!=0)
+ push_str(st->stack,C_STR,buf);
+ else
+ push_str(st->stack,C_CONSTSTR,"");
+ }
+ if(num==2){
+ char *buf;
+ buf=buildin_getguildname_sub(sd->status.guild_id);
+ if(buf!=0)
+ push_str(st->stack,C_STR,buf);
+ else
+ push_str(st->stack,C_CONSTSTR,"");
+ }
+
+ return 0;
+}
+
+unsigned int equip[10]={0x0100,0x0010,0x0020,0x0002,0x0004,0x0040,0x0008,0x0080,0x0200,0x0001};
+
+/*==========================================
+ * GetEquipID(Pos); Pos: 1-10
+ *------------------------------------------
+ */
+int buildin_getequipid(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+ struct item_data* item;
+
+ sd=script_rid2sd(st);
+ if(sd == NULL)
+ {
+ printf("getequipid: sd == NULL\n");
+ return 0;
+ }
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0){
+ item=sd->inventory_data[i];
+ if(item)
+ push_val(st->stack,C_INT,item->nameid);
+ else
+ push_val(st->stack,C_INT,0);
+ }else{
+ push_val(st->stack,C_INT,-1);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ–¼•¶Žš—ñi¸˜Bƒƒjƒ…[—pj
+ *------------------------------------------
+ */
+int buildin_getequipname(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+ struct item_data* item;
+ char *buf;
+
+ buf=(char *)aCalloc(64,sizeof(char));
+ sd=script_rid2sd(st);
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0){
+ item=sd->inventory_data[i];
+ if(item)
+ sprintf(buf,"%s-[%s]",pos[num-1],item->jname);
+ else
+ sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
+ }else{
+ sprintf(buf,"%s-[%s]",pos[num-1],pos[10]);
+ }
+ push_str(st->stack,C_STR,buf);
+
+ return 0;
+}
+
+/*==========================================
+ * getbrokenid [Valaris]
+ *------------------------------------------
+ */
+int buildin_getbrokenid(struct script_state *st)
+{
+ int i,num,id=0,brokencounter=0;
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ for(i=0; i<MAX_INVENTORY; i++) {
+ if(sd->status.inventory[i].attribute==1){
+ brokencounter++;
+ if(num==brokencounter){
+ id=sd->status.inventory[i].nameid;
+ break;
+ }
+ }
+ }
+
+ push_val(st->stack,C_INT,id);
+
+ return 0;
+}
+
+/*==========================================
+ * repair [Valaris]
+ *------------------------------------------
+ */
+int buildin_repair(struct script_state *st)
+{
+ int i,num;
+ int repaircounter=0;
+ struct map_session_data *sd;
+
+
+ sd=script_rid2sd(st);
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ for(i=0; i<MAX_INVENTORY; i++) {
+ if(sd->status.inventory[i].attribute==1){
+ repaircounter++;
+ if(num==repaircounter){
+ sd->status.inventory[i].attribute=0;
+ clif_equiplist(sd);
+ clif_produceeffect(sd, 0, sd->status.inventory[i].nameid);
+ clif_misceffect(&sd->bl, 3);
+ clif_displaymessage(sd->fd,"Item has been repaired.");
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õƒ`ƒFƒbƒN
+ *------------------------------------------
+ */
+int buildin_getequipisequiped(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0){
+ push_val(st->stack,C_INT,1);
+ }else{
+ push_val(st->stack,C_INT,0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ•i¸˜B‰Â”\ƒ`ƒFƒbƒN
+ *------------------------------------------
+ */
+int buildin_getequipisenableref(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0 && num<7 && sd->inventory_data[i] && (num!=1 || sd->inventory_data[i]->def > 1
+ || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL)
+ || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL))
+ ){
+ push_val(st->stack,C_INT,1);
+ }else{
+ push_val(st->stack,C_INT,0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ•iŠÓ’èƒ`ƒFƒbƒN
+ *------------------------------------------
+ */
+int buildin_getequipisidentify(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0)
+ push_val(st->stack,C_INT,sd->status.inventory[i].identify);
+ else
+ push_val(st->stack,C_INT,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ•i¸˜B“x
+ *------------------------------------------
+ */
+int buildin_getequiprefinerycnt(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0)
+ push_val(st->stack,C_INT,sd->status.inventory[i].refine);
+ else
+ push_val(st->stack,C_INT,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ•i•ŠíLV
+ *------------------------------------------
+ */
+int buildin_getequipweaponlv(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0 && sd->inventory_data[i])
+ push_val(st->stack,C_INT,sd->inventory_data[i]->wlv);
+ else
+ push_val(st->stack,C_INT,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ‘•”õ•i¸˜B¬Œ÷—¦
+ *------------------------------------------
+ */
+int buildin_getequippercentrefinery(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0)
+ push_val(st->stack,C_INT,pc_percentrefinery(sd,&sd->status.inventory[i]));
+ else
+ push_val(st->stack,C_INT,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ¸˜B¬Œ÷
+ *------------------------------------------
+ */
+int buildin_successrefitem(struct script_state *st)
+{
+ int i,num,ep;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0) {
+ ep=sd->status.inventory[i].equip;
+
+ #ifndef TXT_ONLY
+ if(log_config.refine > 0)
+ log_refine(sd, i, 1);
+ #endif //USE_SQL
+
+ sd->status.inventory[i].refine++;
+ pc_unequipitem(sd,i,0);
+ clif_refine(sd->fd,sd,0,i,sd->status.inventory[i].refine);
+ clif_delitem(sd,i,1);
+ clif_additem(sd,i,1,0);
+ pc_equipitem(sd,i,ep);
+ clif_misceffect(&sd->bl,3);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ¸˜BŽ¸”s
+ *------------------------------------------
+ */
+int buildin_failedrefitem(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(i >= 0) {
+ #ifndef TXT_ONLY
+ if(log_config.refine > 0)
+ log_refine(sd, i, 0);
+ #endif //USE_SQL
+
+ sd->status.inventory[i].refine = 0;
+ pc_unequipitem(sd,i,0);
+ // ¸˜BŽ¸”sƒGƒtƒFƒNƒg‚̃pƒPƒbƒg
+ clif_refine(sd->fd,sd,1,i,sd->status.inventory[i].refine);
+ pc_delitem(sd,i,1,0);
+ // ‘¼‚Ìl‚É‚àŽ¸”s‚ð’Ê’m
+ clif_misceffect(&sd->bl,2);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_statusup(struct script_state *st)
+{
+ int type;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ pc_statusup(sd,type);
+
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_statusup2(struct script_state *st)
+{
+ int type,val;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ sd=script_rid2sd(st);
+ pc_statusup2(sd,type,val);
+
+ return 0;
+}
+/*==========================================
+ * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
+ *------------------------------------------
+ */
+int buildin_bonus(struct script_state *st)
+{
+ int type,val;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ sd=script_rid2sd(st);
+ pc_bonus(sd,type,val);
+
+ return 0;
+}
+/*==========================================
+ * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
+ *------------------------------------------
+ */
+int buildin_bonus2(struct script_state *st)
+{
+ int type,type2,val;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ sd=script_rid2sd(st);
+ pc_bonus2(sd,type,type2,val);
+
+ return 0;
+}
+/*==========================================
+ * ‘•”õ•i‚É‚æ‚é”\—Í’lƒ{[ƒiƒX
+ *------------------------------------------
+ */
+int buildin_bonus3(struct script_state *st)
+{
+ int type,type2,type3,val;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ type2=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ type3=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ sd=script_rid2sd(st);
+ pc_bonus3(sd,type,type2,type3,val);
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹Š“¾
+ *------------------------------------------
+ */
+int buildin_skill(struct script_state *st)
+{
+ int id,level,flag=1;
+ struct map_session_data *sd;
+
+ id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ level=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if( st->end>st->start+4 )
+ flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
+ sd=script_rid2sd(st);
+ pc_skill(sd,id,level,flag);
+
+ return 0;
+}
+/*==========================================
+ * ƒMƒ‹ƒhƒXƒLƒ‹Žæ“¾
+ *------------------------------------------
+ */
+int buildin_guildskill(struct script_state *st)
+{
+ int id,level,flag=0;
+ struct map_session_data *sd;
+ int i=0;
+
+ id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ level=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if( st->end>st->start+4 )
+ flag=conv_num(st,&(st->stack->stack_data[st->start+4]) );
+ sd=script_rid2sd(st);
+ for(i=0;i<level;i++)
+ guild_skillup(sd,id,flag);
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒŒƒxƒ‹Š“¾
+ *------------------------------------------
+ */
+int buildin_getskilllv(struct script_state *st)
+{
+ int id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ push_val(st->stack,C_INT, pc_checkskill( script_rid2sd(st) ,id) );
+ return 0;
+}
+/*==========================================
+ * getgdskilllv(Guild_ID, Skill_ID);
+ * skill_id = 10000 : GD_APPROVAL
+ * 10001 : GD_KAFRACONTACT
+ * 10002 : GD_GUARDIANRESEARCH
+ * 10003 : GD_GUARDUP
+ * 10004 : GD_EXTENSION
+ *------------------------------------------
+ */
+int buildin_getgdskilllv(struct script_state *st)
+{
+ int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ struct guild *g=guild_search(guild_id);
+ push_val(st->stack,C_INT, (g==NULL)?-1:guild_checkskill(g,skill_id) );
+ return 0;
+/*
+ struct map_session_data *sd=NULL;
+ struct guild *g=NULL;
+ int skill_id;
+
+ skill_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ if(sd && sd->status.guild_id > 0) g=guild_search(sd->status.guild_id);
+ if(sd && g) {
+ push_val(st->stack,C_INT, guild_checkskill(g,skill_id+9999) );
+ } else {
+ push_val(st->stack,C_INT,-1);
+ }
+ return 0;
+*/
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_basicskillcheck(struct script_state *st)
+{
+ push_val(st->stack,C_INT, battle_config.basic_skill_check);
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_getgmlevel(struct script_state *st)
+{
+ push_val(st->stack,C_INT, pc_isGM(script_rid2sd(st)));
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_end(struct script_state *st)
+{
+ st->state = END;
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_checkoption(struct script_state *st)
+{
+ int type;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+
+ if(sd->status.option & type){
+ push_val(st->stack,C_INT,1);
+ } else {
+ push_val(st->stack,C_INT,0);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_setoption(struct script_state *st)
+{
+ int type;
+ struct map_session_data *sd;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ pc_setoption(sd,type);
+
+ return 0;
+}
+
+/*==========================================
+ * Checkcart [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_checkcart(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ if(pc_iscarton(sd)){
+ push_val(st->stack,C_INT,1);
+ } else {
+ push_val(st->stack,C_INT,0);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒJ[ƒg‚ð•t‚¯‚é
+ *------------------------------------------
+ */
+int buildin_setcart(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+ pc_setcart(sd,1);
+
+ return 0;
+}
+
+/*==========================================
+ * checkfalcon [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_checkfalcon(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ if(pc_isfalcon(sd)){
+ push_val(st->stack,C_INT,1);
+ } else {
+ push_val(st->stack,C_INT,0);
+ }
+
+ return 0;
+}
+
+
+/*==========================================
+ * ‘é‚ð•t‚¯‚é
+ *------------------------------------------
+ */
+int buildin_setfalcon(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+ pc_setfalcon(sd);
+
+ return 0;
+}
+
+/*==========================================
+ * Checkcart [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_checkriding(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ if(pc_isriding(sd)){
+ push_val(st->stack,C_INT,1);
+ } else {
+ push_val(st->stack,C_INT,0);
+ }
+
+ return 0;
+}
+
+
+/*==========================================
+ * ƒyƒRƒyƒRæ‚è
+ *------------------------------------------
+ */
+int buildin_setriding(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+ pc_setriding(sd);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒZ[ƒuƒ|ƒCƒ“ƒg‚Ì•Û‘¶
+ *------------------------------------------
+ */
+int buildin_savepoint(struct script_state *st)
+{
+ int x,y;
+ char *str;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ pc_setsavepoint(script_rid2sd(st),str,x,y);
+ return 0;
+}
+
+/*==========================================
+ * GetTimeTick(0: System Tick, 1: Time Second Tick)
+ *------------------------------------------
+ */
+int buildin_gettimetick(struct script_state *st) /* Asgard Version */
+{
+ int type;
+ time_t timer;
+ struct tm *t;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ switch(type){
+ case 1:
+ //type 1:(Second Ticks: 0-86399, 00:00:00-23:59:59)
+ time(&timer);
+ t=localtime(&timer);
+ push_val(st->stack,C_INT,((t->tm_hour)*3600+(t->tm_min)*60+t->tm_sec));
+ break;
+ case 0:
+ default:
+ //type 0:(System Ticks)
+ push_val(st->stack,C_INT,gettick());
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ * GetTime(Type);
+ * 1: Sec 2: Min 3: Hour
+ * 4: WeekDay 5: MonthDay 6: Month
+ * 7: Year
+ *------------------------------------------
+ */
+int buildin_gettime(struct script_state *st) /* Asgard Version */
+{
+ int type;
+ time_t timer;
+ struct tm *t;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ time(&timer);
+ t=localtime(&timer);
+
+ switch(type){
+ case 1://Sec(0~59)
+ push_val(st->stack,C_INT,t->tm_sec);
+ break;
+ case 2://Min(0~59)
+ push_val(st->stack,C_INT,t->tm_min);
+ break;
+ case 3://Hour(0~23)
+ push_val(st->stack,C_INT,t->tm_hour);
+ break;
+ case 4://WeekDay(0~6)
+ push_val(st->stack,C_INT,t->tm_wday);
+ break;
+ case 5://MonthDay(01~31)
+ push_val(st->stack,C_INT,t->tm_mday);
+ break;
+ case 6://Month(01~12)
+ push_val(st->stack,C_INT,t->tm_mon+1);
+ break;
+ case 7://Year(20xx)
+ push_val(st->stack,C_INT,t->tm_year+1900);
+ break;
+ default://(format error)
+ push_val(st->stack,C_INT,-1);
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ * GetTimeStr("TimeFMT", Length);
+ *------------------------------------------
+ */
+int buildin_gettimestr(struct script_state *st)
+{
+ char *tmpstr;
+ char *fmtstr;
+ int maxlen;
+ time_t now = time(NULL);
+
+ fmtstr=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ maxlen=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ tmpstr=(char *)aCalloc(maxlen+1,sizeof(char));
+ strftime(tmpstr,maxlen,fmtstr,localtime(&now));
+ tmpstr[maxlen]='\0';
+
+ push_str(st->stack,C_STR,tmpstr);
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
+ *------------------------------------------
+ */
+int buildin_openstorage(struct script_state *st)
+{
+ storage_storageopen(script_rid2sd(st));
+ return 0;
+}
+
+int buildin_guildopenstorage(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ int ret;
+ ret = storage_guild_storageopen(sd);
+ push_val(st->stack,C_INT,ret);
+ return 0;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‚É‚æ‚éƒXƒLƒ‹”­“®
+ *------------------------------------------
+ */
+int buildin_itemskill(struct script_state *st)
+{
+ int id,lv;
+ char *str;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ lv=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ str=conv_str(st,& (st->stack->stack_data[st->start+4]));
+
+ // ‰r¥’†‚ɃXƒLƒ‹ƒAƒCƒeƒ€‚ÍŽg—p‚Å‚«‚È‚¢
+ if(sd->skilltimer != -1)
+ return 0;
+
+ sd->skillitem=id;
+ sd->skillitemlv=lv;
+ clif_item_skill(sd,id,lv,str);
+ return 0;
+}
+/*==========================================
+ * ƒAƒCƒeƒ€ì¬
+ *------------------------------------------
+ */
+int buildin_produce(struct script_state *st)
+{
+ int trigger;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if( sd->state.produce_flag == 1) return 0;
+ trigger=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ clif_skill_produce_mix_list(sd,trigger);
+ return 0;
+}
+/*==========================================
+ * NPC‚Ńyƒbƒgì‚é
+ *------------------------------------------
+ */
+int buildin_makepet(struct script_state *st)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+ struct script_data *data;
+ int id,pet_id;
+
+ data=&(st->stack->stack_data[st->start+2]);
+ get_val(st,data);
+
+ id=conv_num(st,data);
+
+ pet_id = search_petDB_index(id, PET_CLASS);
+
+ if (pet_id < 0)
+ pet_id = search_petDB_index(id, PET_EGG);
+ if (pet_id >= 0 && sd) {
+ sd->catch_target_class = pet_db[pet_id].class;
+ intif_create_pet(
+ sd->status.account_id, sd->status.char_id,
+ pet_db[pet_id].class, mob_db[pet_db[pet_id].class].lv,
+ pet_db[pet_id].EggID, 0, pet_db[pet_id].intimate,
+ 100, 0, 1, pet_db[pet_id].jname);
+ }
+
+ return 0;
+}
+/*==========================================
+ * NPC‚ÅŒoŒ±’lã‚°‚é
+ *------------------------------------------
+ */
+int buildin_getexp(struct script_state *st)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+ int base=0,job=0;
+
+ base=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ job =conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if(base<0 || job<0)
+ return 0;
+ if(sd)
+ pc_gainexp(sd,base,job);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒ‚ƒ“ƒXƒ^[”­¶
+ *------------------------------------------
+ */
+int buildin_monster(struct script_state *st)
+{
+ int class,amount,x,y;
+ char *str,*map,*event="";
+
+ map =conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x =conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y =conv_num(st,& (st->stack->stack_data[st->start+4]));
+ str =conv_str(st,& (st->stack->stack_data[st->start+5]));
+ class=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
+ if( st->end>st->start+8 )
+ event=conv_str(st,& (st->stack->stack_data[st->start+8]));
+
+ mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class,amount,event);
+ return 0;
+}
+/*==========================================
+ * ƒ‚ƒ“ƒXƒ^[”­¶
+ *------------------------------------------
+ */
+int buildin_areamonster(struct script_state *st)
+{
+ int class,amount,x0,y0,x1,y1;
+ char *str,*map,*event="";
+
+ map =conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0 =conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y0 =conv_num(st,& (st->stack->stack_data[st->start+4]));
+ x1 =conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y1 =conv_num(st,& (st->stack->stack_data[st->start+6]));
+ str =conv_str(st,& (st->stack->stack_data[st->start+7]));
+ class=conv_num(st,& (st->stack->stack_data[st->start+8]));
+ amount=conv_num(st,& (st->stack->stack_data[st->start+9]));
+ if( st->end>st->start+10 )
+ event=conv_str(st,& (st->stack->stack_data[st->start+10]));
+
+ mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class,amount,event);
+ return 0;
+}
+/*==========================================
+ * ƒ‚ƒ“ƒXƒ^[íœ
+ *------------------------------------------
+ */
+int buildin_killmonster_sub(struct block_list *bl,va_list ap)
+{
+ char *event=va_arg(ap,char *);
+ int allflag=va_arg(ap,int);
+
+ if(!allflag){
+ if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
+ mob_delete((struct mob_data *)bl);
+ return 0;
+ }else if(allflag){
+ if(((struct mob_data *)bl)->spawndelay1==-1 && ((struct mob_data *)bl)->spawndelay2==-1)
+ mob_delete((struct mob_data *)bl);
+ return 0;
+ }
+ return 0;
+}
+int buildin_killmonster(struct script_state *st)
+{
+ char *mapname,*event;
+ int m,allflag=0;
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ event=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ if(strcmp(event,"All")==0)
+ allflag = 1;
+
+ if( (m=map_mapname2mapid(mapname))<0 )
+ return 0;
+ map_foreachinarea(buildin_killmonster_sub,
+ m,0,0,map[m].xs,map[m].ys,BL_MOB, event ,allflag);
+ return 0;
+}
+
+int buildin_killmonsterall_sub(struct block_list *bl,va_list ap)
+{
+ mob_delete((struct mob_data *)bl);
+ return 0;
+}
+int buildin_killmonsterall(struct script_state *st)
+{
+ char *mapname;
+ int m;
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+
+ if( (m=map_mapname2mapid(mapname))<0 )
+ return 0;
+ map_foreachinarea(buildin_killmonsterall_sub,
+ m,0,0,map[m].xs,map[m].ys,BL_MOB);
+ return 0;
+}
+
+/*==========================================
+ * ƒCƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int buildin_doevent(struct script_state *st)
+{
+ char *event;
+ event=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_event(map_id2sd(st->rid),event,0);
+ return 0;
+}
+/*==========================================
+ * NPCŽå‘̃Cƒxƒ“ƒgŽÀs
+ *------------------------------------------
+ */
+int buildin_donpcevent(struct script_state *st)
+{
+ char *event;
+ event=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_event_do(event);
+ return 0;
+}
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[’ljÁ
+ *------------------------------------------
+ */
+int buildin_addtimer(struct script_state *st)
+{
+ char *event;
+ int tick;
+ tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ event=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ pc_addeventtimer(script_rid2sd(st),tick,event);
+ return 0;
+}
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[íœ
+ *------------------------------------------
+ */
+int buildin_deltimer(struct script_state *st)
+{
+ char *event;
+ event=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ pc_deleventtimer(script_rid2sd(st),event);
+ return 0;
+}
+/*==========================================
+ * ƒCƒxƒ“ƒgƒ^ƒCƒ}[‚̃JƒEƒ“ƒg’l’ljÁ
+ *------------------------------------------
+ */
+int buildin_addtimercount(struct script_state *st)
+{
+ char *event;
+ int tick;
+ event=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pc_addeventtimercount(script_rid2sd(st),event,tick);
+ return 0;
+}
+
+/*==========================================
+ * NPCƒ^ƒCƒ}[‰Šú‰»
+ *------------------------------------------
+ */
+int buildin_initnpctimer(struct script_state *st)
+{
+ struct npc_data *nd;
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ npc_settimerevent_tick(nd,0);
+ npc_timerevent_start(nd);
+ return 0;
+}
+/*==========================================
+ * NPCƒ^ƒCƒ}[ŠJŽn
+ *------------------------------------------
+ */
+int buildin_startnpctimer(struct script_state *st)
+{
+ struct npc_data *nd;
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ npc_timerevent_start(nd);
+ return 0;
+}
+/*==========================================
+ * NPCƒ^ƒCƒ}[’âŽ~
+ *------------------------------------------
+ */
+int buildin_stopnpctimer(struct script_state *st)
+{
+ struct npc_data *nd;
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ npc_timerevent_stop(nd);
+ return 0;
+}
+/*==========================================
+ * NPCƒ^ƒCƒ}[î•ñŠ“¾
+ *------------------------------------------
+ */
+int buildin_getnpctimer(struct script_state *st)
+{
+ struct npc_data *nd;
+ int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int val=0;
+ if( st->end > st->start+3 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ switch(type){
+ case 0: val=npc_gettimerevent_tick(nd); break;
+ case 1: val= (nd->u.scr.nexttimer>=0); break;
+ case 2: val= nd->u.scr.timeramount; break;
+ }
+ push_val(st->stack,C_INT,val);
+ return 0;
+}
+/*==========================================
+ * NPCƒ^ƒCƒ}[’lÝ’è
+ *------------------------------------------
+ */
+int buildin_setnpctimer(struct script_state *st)
+{
+ int tick;
+ struct npc_data *nd;
+ tick=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if( st->end > st->start+3 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ npc_settimerevent_tick(nd,tick);
+ return 0;
+}
+
+/*==========================================
+ * “V‚̺ƒAƒiƒEƒ“ƒX
+ *------------------------------------------
+ */
+int buildin_announce(struct script_state *st)
+{
+ char *str;
+ int flag;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ flag=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if(flag&0x0f){
+ struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) :
+ (struct block_list *)script_rid2sd(st);
+ clif_GMmessage(bl,str,strlen(str)+1,flag);
+ }else
+ intif_GMmessage(str,strlen(str)+1,flag);
+ return 0;
+}
+/*==========================================
+ * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒ}ƒbƒvj
+ *------------------------------------------
+ */
+int buildin_mapannounce_sub(struct block_list *bl,va_list ap)
+{
+ char *str;
+ int len,flag;
+ str=va_arg(ap,char *);
+ len=va_arg(ap,int);
+ flag=va_arg(ap,int);
+ clif_GMmessage(bl,str,len,flag|3);
+ return 0;
+}
+int buildin_mapannounce(struct script_state *st)
+{
+ char *mapname,*str;
+ int flag,m;
+
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ str=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
+
+ if( (m=map_mapname2mapid(mapname))<0 )
+ return 0;
+ map_foreachinarea(buildin_mapannounce_sub,
+ m,0,0,map[m].xs,map[m].ys,BL_PC, str,strlen(str)+1,flag&0x10);
+ return 0;
+}
+/*==========================================
+ * “V‚̺ƒAƒiƒEƒ“ƒXi“Á’èƒGƒŠƒAj
+ *------------------------------------------
+ */
+int buildin_areaannounce(struct script_state *st)
+{
+ char *map,*str;
+ int flag,m;
+ int x0,y0,x1,y1;
+
+ map=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ str=conv_str(st,& (st->stack->stack_data[st->start+7]));
+ flag=conv_num(st,& (st->stack->stack_data[st->start+8]));
+
+ if( (m=map_mapname2mapid(map))<0 )
+ return 0;
+
+ map_foreachinarea(buildin_mapannounce_sub,
+ m,x0,y0,x1,y1,BL_PC, str,strlen(str)+1,flag&0x10 );
+ return 0;
+}
+/*==========================================
+ * ƒ†[ƒU[”Š“¾
+ *------------------------------------------
+ */
+int buildin_getusers(struct script_state *st)
+{
+ int flag=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ struct block_list *bl=map_id2bl((flag&0x08)?st->oid:st->rid);
+ int val=0;
+ switch(flag&0x07){
+ case 0: val=map[bl->m].users; break;
+ case 1: val=map_getusers(); break;
+ }
+ push_val(st->stack,C_INT,val);
+ return 0;
+}
+/*==========================================
+ * ƒ}ƒbƒvŽw’胆[ƒU[”Š“¾
+ *------------------------------------------
+ */
+int buildin_getmapusers(struct script_state *st)
+{
+ char *str;
+ int m;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ if( (m=map_mapname2mapid(str))< 0){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ push_val(st->stack,C_INT,map[m].users);
+ return 0;
+}
+/*==========================================
+ * ƒGƒŠƒAŽw’胆[ƒU[”Š“¾
+ *------------------------------------------
+ */
+int buildin_getareausers_sub(struct block_list *bl,va_list ap)
+{
+ int *users=va_arg(ap,int *);
+ (*users)++;
+ return 0;
+}
+int buildin_getareausers(struct script_state *st)
+{
+ char *str;
+ int m,x0,y0,x1,y1,users=0;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ if( (m=map_mapname2mapid(str))< 0){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ map_foreachinarea(buildin_getareausers_sub,
+ m,x0,y0,x1,y1,BL_PC,&users);
+ push_val(st->stack,C_INT,users);
+ return 0;
+}
+
+/*==========================================
+ * ƒGƒŠƒAŽw’èƒhƒƒbƒvƒAƒCƒeƒ€”Š“¾
+ *------------------------------------------
+ */
+int buildin_getareadropitem_sub(struct block_list *bl,va_list ap)
+{
+ int item=va_arg(ap,int);
+ int *amount=va_arg(ap,int *);
+ struct flooritem_data *drop=(struct flooritem_data *)bl;
+
+ if(drop->item_data.nameid==item)
+ (*amount)+=drop->item_data.amount;
+
+ return 0;
+}
+int buildin_getareadropitem(struct script_state *st)
+{
+ char *str;
+ int m,x0,y0,x1,y1,item,amount=0;
+ struct script_data *data;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
+
+ data=&(st->stack->stack_data[st->start+7]);
+ get_val(st,data);
+ if( data->type==C_STR || data->type==C_CONSTSTR ){
+ const char *name=conv_str(st,data);
+ struct item_data *item_data = itemdb_searchname(name);
+ item=512;
+ if( item_data )
+ item=item_data->nameid;
+ }else
+ item=conv_num(st,data);
+
+ if( (m=map_mapname2mapid(str))< 0){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ map_foreachinarea(buildin_getareadropitem_sub,
+ m,x0,y0,x1,y1,BL_ITEM,item,&amount);
+ push_val(st->stack,C_INT,amount);
+ return 0;
+}
+/*==========================================
+ * NPC‚Ì—LŒø‰»
+ *------------------------------------------
+ */
+int buildin_enablenpc(struct script_state *st)
+{
+ char *str;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_enable(str,1);
+ return 0;
+}
+/*==========================================
+ * NPC‚Ì–³Œø‰»
+ *------------------------------------------
+ */
+int buildin_disablenpc(struct script_state *st)
+{
+ char *str;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_enable(str,0);
+ return 0;
+}
+
+int buildin_enablearena(struct script_state *st) // Added by RoVeRT
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ struct chat_data *cd;
+
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL)
+ return 0;
+
+ npc_enable(nd->name,1);
+ nd->arenaflag=1;
+
+ if(cd->users>=cd->trigger && cd->npc_event[0])
+ npc_timer_event(cd->npc_event);
+
+ return 0;
+}
+int buildin_disablearena(struct script_state *st) // Added by RoVeRT
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ nd->arenaflag=0;
+
+ return 0;
+}
+/*==========================================
+ * ‰B‚ê‚Ä‚¢‚éNPC‚Ì•\Ž¦
+ *------------------------------------------
+ */
+int buildin_hideoffnpc(struct script_state *st)
+{
+ char *str;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_enable(str,2);
+ return 0;
+}
+/*==========================================
+ * NPC‚ðƒnƒCƒfƒBƒ“ƒO
+ *------------------------------------------
+ */
+int buildin_hideonnpc(struct script_state *st)
+{
+ char *str;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ npc_enable(str,4);
+ return 0;
+}
+/*==========================================
+ * ó‘ÔˆÙí‚É‚©‚©‚é
+ *------------------------------------------
+ */
+int buildin_sc_start(struct script_state *st)
+{
+ struct block_list *bl;
+ int type,tick,val1;
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ if( st->end>st->start+5 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
+ bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+5])));
+ else
+ bl = map_id2bl(st->rid);
+ if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
+ bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
+ skill_status_change_start(bl,type,val1,0,0,0,tick,0);
+ return 0;
+}
+
+/*==========================================
+ * ó‘ÔˆÙí‚É‚©‚©‚é(Šm—¦Žw’è)
+ *------------------------------------------
+ */
+int buildin_sc_start2(struct script_state *st)
+{
+ struct block_list *bl;
+ int type,tick,val1,per;
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ tick=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ val1=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ per=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ if( st->end>st->start+6 ) //Žw’肵‚½ƒLƒƒƒ‰‚ðó‘ÔˆÙí‚É‚·‚é
+ bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
+ else
+ bl = map_id2bl(st->rid);
+ if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
+ bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
+ if(rand()%10000 < per)
+ skill_status_change_start(bl,type,val1,0,0,0,tick,0);
+ return 0;
+}
+
+/*==========================================
+ * ó‘ÔˆÙ킪’¼‚é
+ *------------------------------------------
+ */
+int buildin_sc_end(struct script_state *st)
+{
+ struct block_list *bl;
+ int type;
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ bl = map_id2bl(st->rid);
+ if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag)
+ bl = map_id2bl(((struct map_session_data *)bl)->skilltarget);
+ skill_status_change_end(bl,type,-1);
+// if(battle_config.etc_log)
+// printf("sc_end : %d %d\n",st->rid,type);
+ return 0;
+}
+/*==========================================
+ * ó‘ÔˆÙí‘Ï«‚ðŒvŽZ‚µ‚½Šm—¦‚ð•Ô‚·
+ *------------------------------------------
+ */
+int buildin_getscrate(struct script_state *st)
+{
+ struct block_list *bl;
+ int sc_def=100,sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2;
+ int type,rate,luk;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ rate=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if( st->end>st->start+4 ) //Žw’肵‚½ƒLƒƒƒ‰‚Ì‘Ï«‚ðŒvŽZ‚·‚é
+ bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6])));
+ else
+ bl = map_id2bl(st->rid);
+
+ luk = battle_get_luk(bl);
+ sc_def_mdef2=100 - (3 + battle_get_mdef(bl) + luk/3);
+ sc_def_vit2=100 - (3 + battle_get_vit(bl) + luk/3);
+ sc_def_int2=100 - (3 + battle_get_int(bl) + luk/3);
+ sc_def_luk2=100 - (3 + luk);
+
+ if(type==SC_STONE || type==SC_FREEZE)
+ sc_def=sc_def_mdef2;
+ else if(type==SC_STAN || type==SC_POISON || type==SC_SILENCE)
+ sc_def=sc_def_vit2;
+ else if(type==SC_SLEEP || type==SC_CONFUSION || type==SC_BLIND)
+ sc_def=sc_def_int2;
+ else if(type==SC_CURSE)
+ sc_def=sc_def_luk2;
+
+ rate=rate*sc_def/100;
+ push_val(st->stack,C_INT,rate);
+
+ return 0;
+
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_debugmes(struct script_state *st)
+{
+ conv_str(st,& (st->stack->stack_data[st->start+2]));
+ printf("script debug : %d %d : %s\n",st->rid,st->oid,st->stack->stack_data[st->start+2].u.str);
+ return 0;
+}
+
+/*==========================================
+ *•ßŠlƒAƒCƒeƒ€Žg—p
+ *------------------------------------------
+ */
+int buildin_catchpet(struct script_state *st)
+{
+ int pet_id;
+ struct map_session_data *sd;
+ pet_id= conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ pet_catch_process1(sd,pet_id);
+ return 0;
+}
+
+/*==========================================
+ *Œg‘Ñ—‘›z‰»‹@Žg—p
+ *------------------------------------------
+ */
+int buildin_birthpet(struct script_state *st)
+{
+ struct map_session_data *sd;
+ sd=script_rid2sd(st);
+ clif_sendegg(sd);
+ return 0;
+}
+
+/*==========================================
+ * Added - AppleGirl For Advanced Classes, (Updated for Cleaner Script Purposes)
+ *------------------------------------------
+ */
+int buildin_resetlvl(struct script_state *st)
+{
+ struct map_session_data *sd;
+
+ int type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ sd=script_rid2sd(st);
+ pc_resetlvl(sd,type);
+ return 0;
+}
+/*==========================================
+ * ƒXƒe[ƒ^ƒXƒŠƒZƒbƒg
+ *------------------------------------------
+ */
+int buildin_resetstatus(struct script_state *st)
+{
+ struct map_session_data *sd;
+ sd=script_rid2sd(st);
+ pc_resetstate(sd);
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒŠƒZƒbƒg
+ *------------------------------------------
+ */
+int buildin_resetskill(struct script_state *st)
+{
+ struct map_session_data *sd;
+ sd=script_rid2sd(st);
+ pc_resetskill(sd);
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int buildin_changebase(struct script_state *st)
+{
+ struct map_session_data *sd=NULL;
+ int vclass;
+
+ if( st->end>st->start+3 )
+ sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+3])));
+ else
+ sd=script_rid2sd(st);
+
+ if(sd == NULL)
+ return 0;
+
+ vclass = conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if(vclass == 22 && !battle_config.wedding_modifydisplay)
+ return 0;
+
+// if(vclass==22) {
+// pc_unequipitem(sd,sd->equip_index[9],0); // ‘•”õŠO
+// }
+
+ sd->view_class = vclass;
+
+ return 0;
+}
+
+/*==========================================
+ * «•Ê•ÏŠ·
+ *------------------------------------------
+ */
+int buildin_changesex(struct script_state *st) {
+ struct map_session_data *sd = NULL;
+ sd = script_rid2sd(st);
+
+ if (sd->status.sex == 0) {
+ sd->status.sex = 1;
+ sd->sex = 1;
+ if (sd->status.class == 20 || sd->status.class == 4021)
+ sd->status.class -= 1;
+ } else if (sd->status.sex == 1) {
+ sd->status.sex = 0;
+ sd->sex = 0;
+ if(sd->status.class == 19 || sd->status.class == 4020)
+ sd->status.class += 1;
+ }
+ chrif_char_ask_name(-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex
+ chrif_save(sd);
+ return 0;
+}
+
+/*==========================================
+ * npcƒ`ƒƒƒbƒgì¬
+ *------------------------------------------
+ */
+int buildin_waitingroom(struct script_state *st)
+{
+ char *name,*ev="";
+ int limit, trigger = 0,pub=1;
+ name=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ limit= conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if(limit==0)
+ pub=3;
+
+ if( (st->end > st->start+5) ){
+ struct script_data* data=&(st->stack->stack_data[st->start+5]);
+ get_val(st,data);
+ if(data->type==C_INT){
+ // VAthenaŽd—l(‹ŒAthenaŽd—l‚ƌ݊·«‚ ‚è)
+ ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
+ trigger=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ }else{
+ // eathenaŽd—l
+ trigger=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ ev=conv_str(st,& (st->stack->stack_data[st->start+5]));
+ }
+ }else{
+ // ‹ŒAthenaŽd—l
+ if( st->end > st->start+4 )
+ ev=conv_str(st,& (st->stack->stack_data[st->start+4]));
+ }
+ chat_createnpcchat( (struct npc_data *)map_id2bl(st->oid),
+ limit,pub,trigger,name,strlen(name)+1,ev);
+ return 0;
+}
+/*==========================================
+ * npcƒ`ƒƒƒbƒgíœ
+ *------------------------------------------
+ */
+int buildin_delwaitingroom(struct script_state *st)
+{
+ struct npc_data *nd;
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+ chat_deletenpcchat(nd);
+ return 0;
+}
+/*==========================================
+ * npcƒ`ƒƒƒbƒg‘SˆõR‚èo‚·
+ *------------------------------------------
+ */
+int buildin_waitingroomkickall(struct script_state *st)
+{
+ struct npc_data *nd;
+ struct chat_data *cd;
+
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
+ return 0;
+ chat_npckickall(cd);
+ return 0;
+}
+
+/*==========================================
+ * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg—LŒø‰»
+ *------------------------------------------
+ */
+int buildin_enablewaitingroomevent(struct script_state *st)
+{
+ struct npc_data *nd;
+ struct chat_data *cd;
+
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
+ return 0;
+ chat_enableevent(cd);
+ return 0;
+}
+
+/*==========================================
+ * npcƒ`ƒƒƒbƒgƒCƒxƒ“ƒg–³Œø‰»
+ *------------------------------------------
+ */
+int buildin_disablewaitingroomevent(struct script_state *st)
+{
+ struct npc_data *nd;
+ struct chat_data *cd;
+
+ if( st->end > st->start+2 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
+ return 0;
+ chat_disableevent(cd);
+ return 0;
+}
+/*==========================================
+ * npcƒ`ƒƒƒbƒgó‘ÔŠ“¾
+ *------------------------------------------
+ */
+int buildin_getwaitingroomstate(struct script_state *st)
+{
+ struct npc_data *nd;
+ struct chat_data *cd;
+ int val=0,type;
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if( st->end > st->start+3 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ){
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+ switch(type){
+ case 0: val=cd->users; break;
+ case 1: val=cd->limit; break;
+ case 2: val=cd->trigger&0x7f; break;
+ case 3: val=((cd->trigger&0x80)>0); break;
+ case 32: val=(cd->users >= cd->limit); break;
+ case 33: val=(cd->users >= cd->trigger); break;
+
+ case 4:
+ push_str(st->stack,C_CONSTSTR,cd->title);
+ return 0;
+ case 5:
+ push_str(st->stack,C_CONSTSTR,cd->pass);
+ return 0;
+ case 16:
+ push_str(st->stack,C_CONSTSTR,cd->npc_event);
+ return 0;
+ }
+ push_val(st->stack,C_INT,val);
+ return 0;
+}
+
+/*==========================================
+ * ƒ`ƒƒƒbƒgƒƒ“ƒo[(‹K’èl”)ƒ[ƒv
+ *------------------------------------------
+ */
+int buildin_warpwaitingpc(struct script_state *st)
+{
+ int x,y,i,n;
+ char *str;
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ struct chat_data *cd;
+
+ if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL )
+ return 0;
+
+ n=cd->trigger&0x7f;
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+4]));
+
+ if( st->end > st->start+5 )
+ n=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ for(i=0;i<n;i++){
+ struct map_session_data *sd=cd->usersd[0]; // ƒŠƒXƒg擪‚ÌPC‚ðŽŸX‚ÉB
+
+ mapreg_setreg(add_str("$@warpwaitingpc")+(i<<24),sd->bl.id);
+
+ if(strcmp(str,"Random")==0)
+ pc_randomwarp(sd,3);
+ else if(strcmp(str,"SavePoint")==0){
+ if(map[sd->bl.m].flag.noteleport) // ƒeƒŒƒ|‹ÖŽ~
+ return 0;
+
+ pc_setpos(sd,sd->status.save_point.map,
+ sd->status.save_point.x,sd->status.save_point.y,3);
+ }else
+ pc_setpos(sd,str,x,y,0);
+ }
+ mapreg_setreg(add_str("$@warpwaitingpcnum"),n);
+ return 0;
+}
+/*==========================================
+ * RID‚̃Aƒ^ƒbƒ`
+ *------------------------------------------
+ */
+int buildin_attachrid(struct script_state *st)
+{
+ st->rid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ push_val(st->stack,C_INT, (map_id2sd(st->rid)!=NULL));
+ return 0;
+}
+/*==========================================
+ * RID‚̃fƒ^ƒbƒ`
+ *------------------------------------------
+ */
+int buildin_detachrid(struct script_state *st)
+{
+ st->rid=0;
+ return 0;
+}
+/*==========================================
+ * ‘¶Ýƒ`ƒFƒbƒN
+ *------------------------------------------
+ */
+int buildin_isloggedin(struct script_state *st)
+{
+ push_val(st->stack,C_INT, map_id2sd(
+ conv_num(st,& (st->stack->stack_data[st->start+2])) )!=NULL );
+ return 0;
+}
+
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+enum { MF_NOMEMO,MF_NOTELEPORT,MF_NOSAVE,MF_NOBRANCH,MF_NOPENALTY,MF_NOZENYPENALTY,MF_PVP,MF_PVP_NOPARTY,MF_PVP_NOGUILD,MF_GVG,MF_GVG_NOPARTY,MF_NOTRADE,MF_NOSKILL, MF_NOWARP,MF_NOPVP,MF_NOICEWALL,
+ MF_SNOW, MF_FOG, MF_SAKURA, MF_LEAVES, MF_RAIN };
+
+int buildin_setmapflagnosave(struct script_state *st)
+{
+ int m,x,y;
+ char *str,*str2;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ str2=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ m = map_mapname2mapid(str);
+ if(m >= 0) {
+ map[m].flag.nosave=1;
+ memcpy(map[m].save.map,str2,16);
+ map[m].save.x=x;
+ map[m].save.y=y;
+ }
+
+ return 0;
+}
+
+int buildin_setmapflag(struct script_state *st)
+{
+ int m,i;
+ char *str;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ i=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ m = map_mapname2mapid(str);
+ if(m >= 0) {
+ switch(i) {
+ case MF_NOMEMO:
+ map[m].flag.nomemo=1;
+ break;
+ case MF_NOTELEPORT:
+ map[m].flag.noteleport=1;
+ break;
+ case MF_NOBRANCH:
+ map[m].flag.nobranch=1;
+ break;
+ case MF_NOPENALTY:
+ map[m].flag.nopenalty=1;
+ break;
+ case MF_PVP_NOPARTY:
+ map[m].flag.pvp_noparty=1;
+ break;
+ case MF_PVP_NOGUILD:
+ map[m].flag.pvp_noguild=1;
+ break;
+ case MF_GVG_NOPARTY:
+ map[m].flag.gvg_noparty=1;
+ break;
+ case MF_NOZENYPENALTY:
+ map[m].flag.nozenypenalty=1;
+ break;
+ case MF_NOTRADE:
+ map[m].flag.notrade=1;
+ break;
+ case MF_NOSKILL:
+ map[m].flag.noskill=1;
+ break;
+ case MF_NOWARP:
+ map[m].flag.nowarp=1;
+ break;
+ case MF_NOPVP:
+ map[m].flag.nopvp=1;
+ break;
+ case MF_NOICEWALL: // [Valaris]
+ map[m].flag.noicewall=1;
+ break;
+ case MF_SNOW: // [Valaris]
+ map[m].flag.snow=1;
+ break;
+ case MF_FOG: // [Valaris]
+ map[m].flag.fog=1;
+ break;
+ case MF_SAKURA: // [Valaris]
+ map[m].flag.sakura=1;
+ break;
+ case MF_LEAVES: // [Valaris]
+ map[m].flag.leaves=1;
+ break;
+ case MF_RAIN: // [Valaris]
+ map[m].flag.rain=1;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+int buildin_removemapflag(struct script_state *st)
+{
+ int m,i;
+ char *str;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ i=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ m = map_mapname2mapid(str);
+ if(m >= 0) {
+ switch(i) {
+ case MF_NOMEMO:
+ map[m].flag.nomemo=0;
+ break;
+ case MF_NOTELEPORT:
+ map[m].flag.noteleport=0;
+ break;
+ case MF_NOSAVE:
+ map[m].flag.nosave=0;
+ break;
+ case MF_NOBRANCH:
+ map[m].flag.nobranch=0;
+ break;
+ case MF_NOPENALTY:
+ map[m].flag.nopenalty=0;
+ break;
+ case MF_PVP_NOPARTY:
+ map[m].flag.pvp_noparty=0;
+ break;
+ case MF_PVP_NOGUILD:
+ map[m].flag.pvp_noguild=0;
+ break;
+ case MF_GVG_NOPARTY:
+ map[m].flag.gvg_noparty=0;
+ break;
+ case MF_NOZENYPENALTY:
+ map[m].flag.nozenypenalty=0;
+ break;
+ case MF_NOSKILL:
+ map[m].flag.noskill=0;
+ break;
+ case MF_NOWARP:
+ map[m].flag.nowarp=0;
+ break;
+ case MF_NOPVP:
+ map[m].flag.nopvp=0;
+ break;
+ case MF_NOICEWALL: // [Valaris]
+ map[m].flag.noicewall=0;
+ break;
+ case MF_SNOW: // [Valaris]
+ map[m].flag.snow=0;
+ break;
+ case MF_FOG: // [Valaris]
+ map[m].flag.fog=0;
+ break;
+ case MF_SAKURA: // [Valaris]
+ map[m].flag.sakura=0;
+ break;
+ case MF_LEAVES: // [Valaris]
+ map[m].flag.leaves=0;
+ break;
+ case MF_RAIN: // [Valaris]
+ map[m].flag.rain=0;
+ break;
+
+ }
+ }
+
+ return 0;
+}
+
+int buildin_pvpon(struct script_state *st)
+{
+ int m,i;
+ char *str;
+ struct map_session_data *pl_sd=NULL;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ m = map_mapname2mapid(str);
+ if(m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) {
+ map[m].flag.pvp = 1;
+ clif_send0199(m,1);
+
+ if(battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris]
+ return 0;
+
+ for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
+ if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){
+ if(m == pl_sd->bl.m && pl_sd->pvp_timer == -1) {
+ pl_sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,pl_sd->bl.id,0);
+ pl_sd->pvp_rank=0;
+ pl_sd->pvp_lastusers=0;
+ pl_sd->pvp_point=5;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int buildin_pvpoff(struct script_state *st)
+{
+ int m,i;
+ char *str;
+ struct map_session_data *pl_sd=NULL;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ m = map_mapname2mapid(str);
+ if(m >= 0 && map[m].flag.pvp && map[m].flag.nopvp) {
+ map[m].flag.pvp = 0;
+ clif_send0199(m,0);
+
+ if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris]
+ return 0;
+
+ for(i=0;i<fd_max;i++){ //l”•ªƒ‹[ƒv
+ if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){
+ if(m == pl_sd->bl.m) {
+ clif_pvpset(pl_sd,0,0,2);
+ if(pl_sd->pvp_timer != -1) {
+ delete_timer(pl_sd->pvp_timer,pc_calc_pvprank_timer);
+ pl_sd->pvp_timer = -1;
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int buildin_gvgon(struct script_state *st)
+{
+ int m;
+ char *str;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ m = map_mapname2mapid(str);
+ if(m >= 0 && !map[m].flag.gvg) {
+ map[m].flag.gvg = 1;
+ clif_send0199(m,3);
+ }
+
+ return 0;
+}
+int buildin_gvgoff(struct script_state *st)
+{
+ int m;
+ char *str;
+
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ m = map_mapname2mapid(str);
+ if(m >= 0 && map[m].flag.gvg) {
+ map[m].flag.gvg = 0;
+ clif_send0199(m,0);
+ }
+
+ return 0;
+}
+/*==========================================
+ * NPCƒGƒ‚[ƒVƒ‡ƒ“
+ *------------------------------------------
+ */
+
+int buildin_emotion(struct script_state *st)
+{
+ int type;
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if(type < 0 || type > 100)
+ return 0;
+ clif_emotion(map_id2bl(st->oid),type);
+ return 0;
+}
+
+int buildin_maprespawnguildid_sub(struct block_list *bl,va_list ap)
+{
+ int g_id=va_arg(ap,int);
+ int flag=va_arg(ap,int);
+ struct map_session_data *sd=NULL;
+ struct mob_data *md=NULL;
+
+ if(bl->type == BL_PC)
+ sd=(struct map_session_data*)bl;
+ if(bl->type == BL_MOB)
+ md=(struct mob_data *)bl;
+
+ if(sd){
+ if((sd->status.guild_id == g_id) && (flag&1))
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
+ else if((sd->status.guild_id != g_id) && (flag&2))
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3);
+ else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris]
+ pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); // end addition [Valaris]
+ }
+ if(md && flag&4){
+ if(md->class < 1285 || md->class > 1288)
+ mob_delete(md);
+ }
+ return 0;
+}
+int buildin_maprespawnguildid(struct script_state *st)
+{
+ char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ int g_id=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ int flag=conv_num(st,& (st->stack->stack_data[st->start+4]));
+
+ int m=map_mapname2mapid(mapname);
+
+ if(m) map_foreachinarea(buildin_maprespawnguildid_sub,m,0,0,map[m].xs-1,map[m].ys-1,BL_NUL,g_id,flag);
+ return 0;
+}
+
+int buildin_agitstart(struct script_state *st)
+{
+ if(agit_flag==1) return 1; // Agit already Start.
+ agit_flag=1;
+ guild_agit_start();
+ return 0;
+}
+
+int buildin_agitend(struct script_state *st)
+{
+ if(agit_flag==0) return 1; // Agit already End.
+ agit_flag=0;
+ guild_agit_end();
+ return 0;
+}
+/*==========================================
+ * agitcheck 1; // choice script
+ * if(@agit_flag == 1) goto agit;
+ * if(agitcheck(0) == 1) goto agit;
+ *------------------------------------------
+ */
+int buildin_agitcheck(struct script_state *st)
+{
+ struct map_session_data *sd;
+ int cond;
+
+ sd=script_rid2sd(st);
+ cond=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ if(cond == 0) {
+ if (agit_flag==1) push_val(st->stack,C_INT,1);
+ if (agit_flag==0) push_val(st->stack,C_INT,0);
+ } else {
+ if (agit_flag==1) pc_setreg(sd,add_str("@agit_flag"),1);
+ if (agit_flag==0) pc_setreg(sd,add_str("@agit_flag"),0);
+ }
+ return 0;
+}
+int buildin_flagemblem(struct script_state *st)
+{
+ int g_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ if(g_id < 0) return 0;
+
+// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id);
+ ((struct npc_data *)map_id2bl(st->oid))->u.scr.guild_id = g_id;
+ return 1;
+}
+
+int buildin_getcastlename(struct script_state *st)
+{
+ char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ struct guild_castle *gc;
+ int i;
+ char *buf=NULL;
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ if( (gc=guild_castle_search(i)) != NULL ){
+ if(strcmp(mapname,gc->map_name)==0){
+ buf=(char *)aCalloc(24,sizeof(char));
+ strncpy(buf,gc->castle_name,24);
+ break;
+ }
+ }
+ }
+ if(buf)
+ push_str(st->stack,C_STR,buf);
+ else
+ push_str(st->stack,C_CONSTSTR,"");
+ return 0;
+}
+
+int buildin_getcastledata(struct script_state *st)
+{
+ char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ char *event=NULL;
+ struct guild_castle *gc;
+ int i,j;
+
+ if( st->end>st->start+4 && index==0){
+ for(i=0,j=-1;i<MAX_GUILDCASTLE;i++)
+ if( (gc=guild_castle_search(i)) != NULL &&
+ strcmp(mapname,gc->map_name)==0 )
+ j=i;
+ if(j>=0){
+ event=conv_str(st,& (st->stack->stack_data[st->start+4]));
+ guild_addcastleinfoevent(j,17,event);
+ }
+ }
+
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ if( (gc=guild_castle_search(i)) != NULL ){
+ if(strcmp(mapname,gc->map_name)==0){
+ switch(index){
+ case 0: for(j=1;j<26;j++) guild_castledataload(gc->castle_id,j); break; // Initialize[AgitInit]
+ case 1: push_val(st->stack,C_INT,gc->guild_id); break;
+ case 2: push_val(st->stack,C_INT,gc->economy); break;
+ case 3: push_val(st->stack,C_INT,gc->defense); break;
+ case 4: push_val(st->stack,C_INT,gc->triggerE); break;
+ case 5: push_val(st->stack,C_INT,gc->triggerD); break;
+ case 6: push_val(st->stack,C_INT,gc->nextTime); break;
+ case 7: push_val(st->stack,C_INT,gc->payTime); break;
+ case 8: push_val(st->stack,C_INT,gc->createTime); break;
+ case 9: push_val(st->stack,C_INT,gc->visibleC); break;
+ case 10: push_val(st->stack,C_INT,gc->visibleG0); break;
+ case 11: push_val(st->stack,C_INT,gc->visibleG1); break;
+ case 12: push_val(st->stack,C_INT,gc->visibleG2); break;
+ case 13: push_val(st->stack,C_INT,gc->visibleG3); break;
+ case 14: push_val(st->stack,C_INT,gc->visibleG4); break;
+ case 15: push_val(st->stack,C_INT,gc->visibleG5); break;
+ case 16: push_val(st->stack,C_INT,gc->visibleG6); break;
+ case 17: push_val(st->stack,C_INT,gc->visibleG7); break;
+ case 18: push_val(st->stack,C_INT,gc->Ghp0); break;
+ case 19: push_val(st->stack,C_INT,gc->Ghp1); break;
+ case 20: push_val(st->stack,C_INT,gc->Ghp2); break;
+ case 21: push_val(st->stack,C_INT,gc->Ghp3); break;
+ case 22: push_val(st->stack,C_INT,gc->Ghp4); break;
+ case 23: push_val(st->stack,C_INT,gc->Ghp5); break;
+ case 24: push_val(st->stack,C_INT,gc->Ghp6); break;
+ case 25: push_val(st->stack,C_INT,gc->Ghp7); break;
+ default:
+ push_val(st->stack,C_INT,0); break;
+ }
+ return 0;
+ }
+ }
+ }
+ push_val(st->stack,C_INT,0);
+ return 0;
+}
+
+int buildin_setcastledata(struct script_state *st)
+{
+ char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ int index=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ int value=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ struct guild_castle *gc;
+ int i;
+
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ if( (gc=guild_castle_search(i)) != NULL ){
+ if(strcmp(mapname,gc->map_name)==0){
+ // Save Data byself First
+ 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: gc->visibleG0 = value; break;
+ case 11: gc->visibleG1 = value; break;
+ case 12: gc->visibleG2 = value; break;
+ case 13: gc->visibleG3 = value; break;
+ case 14: gc->visibleG4 = value; break;
+ case 15: gc->visibleG5 = value; break;
+ case 16: gc->visibleG6 = value; break;
+ case 17: gc->visibleG7 = value; break;
+ case 18: gc->Ghp0 = value; break;
+ case 19: gc->Ghp1 = value; break;
+ case 20: gc->Ghp2 = value; break;
+ case 21: gc->Ghp3 = value; break;
+ case 22: gc->Ghp4 = value; break;
+ case 23: gc->Ghp5 = value; break;
+ case 24: gc->Ghp6 = value; break;
+ case 25: gc->Ghp7 = value; break;
+ default: return 0;
+ }
+ guild_castledatasave(gc->castle_id,index,value);
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+/* =====================================================================
+ * ƒMƒ‹ƒhî•ñ‚ð—v‹‚·‚é
+ * ---------------------------------------------------------------------
+ */
+int buildin_requestguildinfo(struct script_state *st)
+{
+ int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ char *event=NULL;
+
+ if( st->end>st->start+3 )
+ event=conv_str(st,& (st->stack->stack_data[st->start+3]));
+
+ if(guild_id>0)
+ guild_npc_request_info(guild_id,event);
+ return 0;
+}
+
+/* =====================================================================
+ * ƒJ[ƒh‚Ì”‚𓾂é
+ * ---------------------------------------------------------------------
+ */
+int buildin_getequipcardcnt(struct script_state *st)
+{
+ int i,num;
+ struct map_session_data *sd;
+ int c=4;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(sd->status.inventory[i].card[0] == 0x00ff){ // »‘¢•Ší‚̓J[ƒh‚È‚µ
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+ do{
+ if( (sd->status.inventory[i].card[c-1] > 4000) &&
+ (sd->status.inventory[i].card[c-1] < 5000)){
+
+ push_val(st->stack,C_INT,(c));
+ return 0;
+ }
+ }while(c--);
+ push_val(st->stack,C_INT,0);
+ return 0;
+}
+
+/* ================================================================
+ * ƒJ[ƒhŽæ‚èŠO‚µ¬Œ÷
+ * ----------------------------------------------------------------
+ */
+int buildin_successremovecards(struct script_state *st)
+{
+ int i,num,cardflag=0,flag;
+ struct map_session_data *sd;
+ struct item item_tmp;
+ int c=4;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
+ return 0;
+ }
+ do{
+ if( (sd->status.inventory[i].card[c-1] > 4000) &&
+ (sd->status.inventory[i].card[c-1] < 5000)){
+
+ cardflag = 1;
+ item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
+ item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
+ item_tmp.attribute=0;
+ item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
+
+ if((flag=pc_additem(sd,&item_tmp,1))){ // Ž‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ }while(c--);
+
+ if(cardflag == 1){ // ƒJ[ƒh‚ðŽæ‚蜂¢‚½ƒAƒCƒeƒ€Š“¾
+ flag=0;
+ item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
+ item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
+ item_tmp.attribute=sd->status.inventory[i].attribute;
+ item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
+ pc_delitem(sd,i,1,0);
+ if((flag=pc_additem(sd,&item_tmp,1))){ // ‚à‚Ä‚È‚¢‚È‚çƒhƒƒbƒv
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ clif_misceffect(&sd->bl,3);
+ return 0;
+ }
+ return 0;
+}
+
+/* ================================================================
+ * ƒJ[ƒhŽæ‚èŠO‚µŽ¸”s slot,type
+ * type=0: —¼•û‘¹Ž¸A1:ƒJ[ƒh‘¹Ž¸A2:•‹ï‘¹Ž¸A3:‘¹Ž¸–³‚µ
+ * ----------------------------------------------------------------
+ */
+int buildin_failedremovecards(struct script_state *st)
+{
+ int i,num,cardflag=0,flag,typefail;
+ struct map_session_data *sd;
+ struct item item_tmp;
+ int c=4;
+
+ num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ typefail=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ sd=script_rid2sd(st);
+ i=pc_checkequip(sd,equip[num-1]);
+ if(sd->status.inventory[i].card[0]==0x00ff){ // »‘¢•Ší‚͈—‚µ‚È‚¢
+ return 0;
+ }
+ do{
+ if(( sd->status.inventory[i].card[c-1] > 4000) &&
+ (sd->status.inventory[i].card[c-1] < 5000)){
+
+ cardflag = 1;
+
+ if(typefail == 2){ // •‹ï‚Ì‚Ý‘¹Ž¸‚È‚çAƒJ[ƒh‚͎󂯎æ‚点‚é
+ item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1];
+ item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0;
+ item_tmp.attribute=0;
+ item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
+ if((flag=pc_additem(sd,&item_tmp,1))){
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ }
+ }while(c--);
+
+ if(cardflag == 1){
+
+ if(typefail == 0 || typefail == 2){ // •‹ï‘¹Ž¸
+ pc_delitem(sd,i,1,0);
+ clif_misceffect(&sd->bl,2);
+ return 0;
+ }
+ if(typefail == 1){ // ƒJ[ƒh‚Ì‚Ý‘¹Ž¸i•‹ï‚ð•Ô‚·j
+ flag=0;
+ item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid;
+ item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine;
+ item_tmp.attribute=sd->status.inventory[i].attribute;
+ item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0;
+ pc_delitem(sd,i,1,0);
+ if((flag=pc_additem(sd,&item_tmp,1))){
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ clif_misceffect(&sd->bl,2);
+ return 0;
+ }
+ return 0;
+}
+
+int buildin_mapwarp(struct script_state *st) // Added by RoVeRT
+{
+ int x,y,m;
+ char *str;
+ char *mapname;
+ int x0,y0,x1,y1;
+
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x0=0;
+ y0=0;
+ x1=map[map_mapname2mapid(mapname)].xs;
+ y1=map[map_mapname2mapid(mapname)].ys;
+ str=conv_str(st,& (st->stack->stack_data[st->start+3]));
+ x=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ if( (m=map_mapname2mapid(mapname))< 0)
+ return 0;
+
+ map_foreachinarea(buildin_areawarp_sub,
+ m,x0,y0,x1,y1,BL_PC, str,x,y );
+ return 0;
+}
+
+int buildin_cmdothernpc(struct script_state *st) // Added by RoVeRT
+{
+ char *npc,*command;
+
+ npc=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ command=conv_str(st,& (st->stack->stack_data[st->start+3]));
+
+ npc_command(map_id2sd(st->rid),npc,command);
+ return 0;
+}
+
+int buildin_inittimer(struct script_state *st) // Added by RoVeRT
+{
+// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
+
+// nd->lastaction=nd->timer=gettick();
+ npc_do_ontimer(st->oid, map_id2sd(st->rid), 1);
+
+ return 0;
+}
+
+int buildin_stoptimer(struct script_state *st) // Added by RoVeRT
+{
+// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid);
+
+// nd->lastaction=nd->timer=-1;
+ npc_do_ontimer(st->oid, map_id2sd(st->rid), 0);
+
+ return 0;
+}
+
+int buildin_mobcount_sub(struct block_list *bl,va_list ap) // Added by RoVeRT
+{
+ char *event=va_arg(ap,char *);
+ int *c=va_arg(ap,int *);
+
+ if(strcmp(event,((struct mob_data *)bl)->npc_event)==0)
+ (*c)++;
+ return 0;
+}
+
+int buildin_mobcount(struct script_state *st) // Added by RoVeRT
+{
+ char *mapname,*event;
+ int m,c=0;
+ mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ event=conv_str(st,& (st->stack->stack_data[st->start+3]));
+
+ if( (m=map_mapname2mapid(mapname))<0 ) {
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ map_foreachinarea(buildin_mobcount_sub,
+ m,0,0,map[m].xs,map[m].ys,BL_MOB, event,&c );
+
+ push_val(st->stack,C_INT, (c - 1));
+
+ return 0;
+}
+int buildin_marriage(struct script_state *st)
+{
+ char *partner=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ struct map_session_data *sd=script_rid2sd(st);
+ struct map_session_data *p_sd=map_nick2sd(partner);
+
+ if(sd==NULL || p_sd==NULL || pc_marriage(sd,p_sd) < 0){
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+ push_val(st->stack,C_INT,1);
+ return 0;
+}
+int buildin_wedding_effect(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL)
+ return 0;
+ clif_wedding_effect(&sd->bl);
+ return 0;
+}
+int buildin_divorce(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ if(sd==NULL || pc_divorce(sd) < 0){
+ push_val(st->stack,C_INT,0);
+ return 0;
+ }
+ push_val(st->stack,C_INT,1);
+ return 0;
+}
+
+/*================================================
+ * Script for Displaying MOB Information [Valaris]
+ *------------------------------------------------
+ */
+int buildin_strmobinfo(struct script_state *st)
+{
+
+ int num=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int class=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if(num<=0 || num>=8 || (class>=0 && class<=1000) || class >2000)
+ return 0;
+
+ if(num==1) {
+ char *buf;
+ buf=calloc(24, 1);
+ buf=mob_db[class].name;
+ push_str(st->stack,C_STR,buf);
+ return 0;
+ }
+ else if(num==2) {
+ char *buf;
+ buf=calloc(24, 1);
+ buf=mob_db[class].jname;
+ push_str(st->stack,C_STR,buf);
+ return 0;
+ }
+ else if(num==3)
+ push_val(st->stack,C_INT,mob_db[class].lv);
+ else if(num==4)
+ push_val(st->stack,C_INT,mob_db[class].max_hp);
+ else if(num==5)
+ push_val(st->stack,C_INT,mob_db[class].max_sp);
+ else if(num==6)
+ push_val(st->stack,C_INT,mob_db[class].base_exp);
+ else if(num==7)
+ push_val(st->stack,C_INT,mob_db[class].job_exp);
+ return 0;
+}
+
+/*==========================================
+ * Summon guardians [Valaris]
+ *------------------------------------------
+ */
+int buildin_guardian(struct script_state *st)
+{
+ int class=0,amount=1,x=0,y=0,guardian=0;
+ char *str,*map,*event="";
+
+ map =conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x =conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y =conv_num(st,& (st->stack->stack_data[st->start+4]));
+ str =conv_str(st,& (st->stack->stack_data[st->start+5]));
+ class=conv_num(st,& (st->stack->stack_data[st->start+6]));
+ amount=conv_num(st,& (st->stack->stack_data[st->start+7]));
+ event=conv_str(st,& (st->stack->stack_data[st->start+8]));
+ if( st->end>st->start+9 )
+ guardian=conv_num(st,& (st->stack->stack_data[st->start+9]));
+
+ mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class,amount,event,guardian);
+
+ return 0;
+}
+
+/*================================================
+ * Script for Displaying Guardian Info [Valaris]
+ *------------------------------------------------
+ */
+int buildin_guardianinfo(struct script_state *st)
+{
+ int guardian=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ struct map_session_data *sd=script_rid2sd(st);
+ struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name);
+
+ if(guardian==0 && gc->visibleG0 == 1) push_val(st->stack,C_INT,gc->Ghp0);
+ if(guardian==1 && gc->visibleG1 == 1) push_val(st->stack,C_INT,gc->Ghp1);
+ if(guardian==2 && gc->visibleG2 == 1) push_val(st->stack,C_INT,gc->Ghp2);
+ if(guardian==3 && gc->visibleG3 == 1) push_val(st->stack,C_INT,gc->Ghp3);
+ if(guardian==4 && gc->visibleG4 == 1) push_val(st->stack,C_INT,gc->Ghp4);
+ if(guardian==5 && gc->visibleG5 == 1) push_val(st->stack,C_INT,gc->Ghp5);
+ if(guardian==6 && gc->visibleG6 == 1) push_val(st->stack,C_INT,gc->Ghp6);
+ if(guardian==7 && gc->visibleG7 == 1) push_val(st->stack,C_INT,gc->Ghp7);
+ else push_val(st->stack,C_INT,-1);
+
+ return 0;
+}
+/*==========================================
+ * ID‚©‚çItem–¼
+ *------------------------------------------
+ */
+int buildin_getitemname(struct script_state *st)
+{
+ int item_id;
+ struct item_data *i_data;
+ char *item_name;
+
+ item_id=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ i_data = NULL;
+ i_data = itemdb_search(item_id);
+ item_name=(char *)aCalloc(24,sizeof(char));
+
+ strncpy(item_name,i_data->jname,23);
+ push_str(st->stack,C_STR,item_name);
+ return 0;
+}
+
+/*==========================================
+ * petskillbonus [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_petskillbonus(struct script_state *st)
+{
+ int type,val,duration,timer;
+ struct pet_data *pd;
+
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ val=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ duration=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ timer=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ pd->skillbonusduration=-1;
+ pd->skillbonustimer=-1;
+
+ pet_skill_bonus(sd,pd,type,val,duration,timer,0);
+
+ return 0;
+}
+
+/*==========================================
+ * pet looting [Valaris]
+ *------------------------------------------
+ */
+int buildin_petloot(struct script_state *st)
+{
+ int max;
+ struct pet_data *pd;
+
+ struct map_session_data *sd=script_rid2sd(st);
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ max=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ if(!max)
+ return 0;
+
+ pd->loot=1;
+ pd->lootmax=max;
+
+ return 0;
+}
+/*==========================================
+ * PC‚ÌŠŽ•iî•ñ“Ç‚ÝŽæ‚è
+ *------------------------------------------
+ */
+int buildin_getinventorylist(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ int i,j=0;
+ if(!sd) return 0;
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount > 0){
+ pc_setreg(sd,add_str("@inventorylist_id")+(j<<24),sd->status.inventory[i].nameid);
+ pc_setreg(sd,add_str("@inventorylist_amount")+(j<<24),sd->status.inventory[i].amount);
+ pc_setreg(sd,add_str("@inventorylist_equip")+(j<<24),sd->status.inventory[i].equip);
+ pc_setreg(sd,add_str("@inventorylist_refine")+(j<<24),sd->status.inventory[i].refine);
+ pc_setreg(sd,add_str("@inventorylist_identify")+(j<<24),sd->status.inventory[i].identify);
+ pc_setreg(sd,add_str("@inventorylist_attribute")+(j<<24),sd->status.inventory[i].attribute);
+ pc_setreg(sd,add_str("@inventorylist_card1")+(j<<24),sd->status.inventory[i].card[0]);
+ pc_setreg(sd,add_str("@inventorylist_card2")+(j<<24),sd->status.inventory[i].card[1]);
+ pc_setreg(sd,add_str("@inventorylist_card3")+(j<<24),sd->status.inventory[i].card[2]);
+ pc_setreg(sd,add_str("@inventorylist_card4")+(j<<24),sd->status.inventory[i].card[3]);
+ j++;
+ }
+ }
+ pc_setreg(sd,add_str("@inventorylist_count"),j);
+ return 0;
+}
+
+int buildin_getskilllist(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ int i,j=0;
+ if(!sd) return 0;
+ for(i=0;i<MAX_SKILL;i++){
+ if(sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0){
+ pc_setreg(sd,add_str("@skilllist_id")+(j<<24),sd->status.skill[i].id);
+ pc_setreg(sd,add_str("@skilllist_lv")+(j<<24),sd->status.skill[i].lv);
+ pc_setreg(sd,add_str("@skilllist_flag")+(j<<24),sd->status.skill[i].flag);
+ j++;
+ }
+ }
+ pc_setreg(sd,add_str("@skilllist_count"),j);
+ return 0;
+}
+
+int buildin_clearitem(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ int i;
+ if(sd==NULL) return 0;
+ for (i=0; i<MAX_INVENTORY; i++) {
+ if (sd->status.inventory[i].amount)
+ pc_delitem(sd, i, sd->status.inventory[i].amount, 0);
+ }
+ return 0;
+}
+
+/*==========================================
+ * NPCƒNƒ‰ƒXƒ`ƒFƒ“ƒW
+ * class‚Í•Ï‚í‚肽‚¢class
+ * type‚Í’Êí0‚È‚Ì‚©‚ÈH
+ *------------------------------------------
+ */
+int buildin_classchange(struct script_state *st)
+{
+ int class,type;
+ struct block_list *bl=map_id2bl(st->oid);
+
+ if(bl==NULL) return 0;
+
+ class=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ type=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ clif_class_change(bl,class,type);
+ return 0;
+}
+
+/*==========================================
+ * NPC‚©‚ç”­¶‚·‚éƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int buildin_misceffect(struct script_state *st)
+{
+ int type;
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ if(st->oid)
+ clif_misceffect2(map_id2bl(st->oid),type);
+ else{
+ struct map_session_data *sd=script_rid2sd(st);
+ if(sd)
+ clif_misceffect2(&sd->bl,type);
+ }
+ return 0;
+}
+/*==========================================
+ * ƒTƒEƒ“ƒhƒGƒtƒFƒNƒg
+ *------------------------------------------
+ */
+int buildin_soundeffect(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ char *name;
+ int type=0;
+
+
+ name=conv_str(st,& (st->stack->stack_data[st->start+2]));
+ type=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ if(sd){
+ if(st->oid)
+ clif_soundeffect(sd,map_id2bl(st->oid),name,type);
+ else{
+ clif_soundeffect(sd,&sd->bl,name,type);
+ }
+ }
+ return 0;
+}
+/*==========================================
+ * pet status recovery [Valaris]
+ *------------------------------------------
+ */
+int buildin_petrecovery(struct script_state *st)
+{
+ struct pet_data *pd;
+
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_recovery_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+/*==========================================
+ * pet healing [Valaris]
+ *------------------------------------------
+ */
+int buildin_petheal(struct script_state *st)
+
+{
+ struct pet_data *pd;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+4]));
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_heal_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+/*==========================================
+ * pet magnificat [Valaris]
+ *------------------------------------------
+ */
+int buildin_petmag(struct script_state *st)
+{
+ struct pet_data *pd;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ pd->skillbonustimer=add_timer(gettick()+pd->skilltimer*1000,pet_mag_timer,sd->bl.id,0);
+
+ return 0;
+}
+
+/*==========================================
+ * pet attack skills [Valaris]
+ *------------------------------------------
+ */
+int buildin_petskillattack(struct script_state *st)
+{
+ struct pet_data *pd;
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL || sd->pd==NULL)
+ return 0;
+
+ pd=sd->pd;
+
+ if(pd==NULL)
+ return 0;
+
+ pd->skilltype=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ pd->skillval=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ pd->skillduration=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ pd->skilltimer=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ pd->skillbonustimer=add_timer(gettick()+100,pet_skillattack_timer,sd->bl.id,0);
+
+ return 0;
+}
+/*==========================================
+ * NPC skill effects [Valaris]
+ *------------------------------------------
+ */
+int buildin_npcskilleffect(struct script_state *st)
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ int skillid=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3]));
+ int x=conv_num(st,& (st->stack->stack_data[st->start+4]));
+ int y=conv_num(st,& (st->stack->stack_data[st->start+5]));
+
+ clif_skill_poseffect(&nd->bl,skillid,skilllv,x,y,gettick());
+
+ return 0;
+}
+
+/*==========================================
+ * Special effects [Valaris]
+ *------------------------------------------
+ */
+int buildin_specialeffect(struct script_state *st)
+{
+ struct block_list *bl=map_id2bl(st->oid);
+
+ if(bl==NULL)
+ return 0;
+
+ clif_specialeffect(bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
+
+ return 0;
+}
+
+int buildin_specialeffect2(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+
+ if(sd==NULL)
+ return 0;
+
+ clif_specialeffect(&sd->bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0);
+
+ return 0;
+}
+
+/*==========================================
+ * Nude [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_nude(struct script_state *st)
+{
+ struct map_session_data *sd=script_rid2sd(st);
+ int i;
+
+ if(sd==NULL)
+ return 0;
+
+ for(i=0;i<11;i++)
+ if(sd->equip_index[i] >= 0)
+ pc_unequipitem(sd,sd->equip_index[i],1);
+
+ return 0;
+}
+
+/*==========================================
+ * gmcommand [MouseJstr]
+ *
+ * suggested on the forums...
+ *------------------------------------------
+ */
+
+int buildin_gmcommand(struct script_state *st)
+{
+ struct map_session_data *sd;
+ char *cmd;
+
+ sd = script_rid2sd(st);
+ cmd = conv_str(st,& (st->stack->stack_data[st->start+2]));
+
+ is_atcommand(sd->fd, sd, cmd, 99);
+
+ return 0;
+}
+
+/*==========================================
+ * movenpc [MouseJstr]
+ *------------------------------------------
+ */
+
+int buildin_movenpc(struct script_state *st)
+{
+ struct map_session_data *sd;
+ char *map,*npc;
+ int x,y;
+
+ sd = script_rid2sd(st);
+
+ map = conv_str(st,& (st->stack->stack_data[st->start+2]));
+ x = conv_num(st,& (st->stack->stack_data[st->start+3]));
+ y = conv_num(st,& (st->stack->stack_data[st->start+4]));
+ npc = conv_str(st,& (st->stack->stack_data[st->start+5]));
+
+ return 0;
+}
+
+/*==========================================
+ * message [MouseJstr]
+ *------------------------------------------
+ */
+
+int buildin_message(struct script_state *st)
+{
+ struct map_session_data *sd;
+ char *msg,*player;
+ struct map_session_data *pl_sd = NULL;
+
+ sd = script_rid2sd(st);
+
+ player = conv_str(st,& (st->stack->stack_data[st->start+2]));
+ msg = conv_str(st,& (st->stack->stack_data[st->start+3]));
+
+ if((pl_sd=map_nick2sd((char *) player)) == NULL)
+ return 1;
+ clif_displaymessage(pl_sd->fd, msg);
+
+ return 0;
+}
+
+/*==========================================
+ * npctalk (sends message to surrounding
+ * area) [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_npctalk(struct script_state *st)
+{
+ char *str;
+ char message[255];
+
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ str=conv_str(st,& (st->stack->stack_data[st->start+2]));
+
+ if(nd) {
+ memcpy(message,nd->name,24);
+ strcat(message," : ");
+ strcat(message,str);
+ clif_message(&(nd->bl), message);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * hasitems (checks to see if player has any
+ * items on them, if so will return a 1)
+ * [Valaris]
+ *------------------------------------------
+ */
+
+int buildin_hasitems(struct script_state *st)
+{
+ int i;
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ for(i=0; i<MAX_INVENTORY; i++) {
+ if(sd->status.inventory[i].amount) {
+ push_val(st->stack,C_INT,1);
+ return 0;
+ }
+ }
+
+ push_val(st->stack,C_INT,0);
+
+ return 0;
+}
+// change npc walkspeed [Valaris]
+int buildin_npcspeed(struct script_state *st)
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ int x=0;
+
+ x=conv_num(st,& (st->stack->stack_data[st->start+2]));
+
+ if(nd) {
+ nd->speed=x;
+ }
+
+ return 0;
+}
+// make an npc walk to a position [Valaris]
+int buildin_npcwalkto(struct script_state *st)
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+ int x=0,y=0;
+
+ x=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ y=conv_num(st,& (st->stack->stack_data[st->start+3]));
+
+ if(nd) {
+ npc_walktoxy(nd,x,y,0);
+ }
+
+ return 0;
+}
+// stop an npc's movement [Valaris]
+int buildin_npcstop(struct script_state *st)
+{
+ struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if(nd) {
+ if(nd->state.state==MS_WALK)
+ npc_stop_walking(nd,1);
+ }
+
+ return 0;
+}
+
+
+/*==========================================
+ * getlook char info. getlook(arg)
+ *------------------------------------------
+ */
+int buildin_getlook(struct script_state *st){
+ int type,val;
+ struct map_session_data *sd;
+ sd=script_rid2sd(st);
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ val=-1;
+ switch(type){
+ case LOOK_HAIR: //1
+ val=sd->status.hair;
+ break;
+ case LOOK_WEAPON: //2
+ val=sd->status.weapon;
+ break;
+ case LOOK_HEAD_BOTTOM: //3
+ val=sd->status.head_bottom;
+ break;
+ case LOOK_HEAD_TOP: //4
+ val=sd->status.head_top;
+ break;
+ case LOOK_HEAD_MID: //5
+ val=sd->status.head_mid;
+ break;
+ case LOOK_HAIR_COLOR: //6
+ val=sd->status.hair_color;
+ break;
+ case LOOK_CLOTHES_COLOR: //7
+ val=sd->status.clothes_color;
+ break;
+ case LOOK_SHIELD: //8
+ val=sd->status.shield;
+ break;
+ case LOOK_SHOES: //9
+ break;
+ }
+
+ push_val(st->stack,C_INT,val);
+ return 0;
+}
+
+/*==========================================
+ * get char save point. argument: 0- map name, 1- x, 2- y
+ *------------------------------------------
+*/
+int buildin_getsavepoint(struct script_state *st)
+{
+ int x,y,type;
+ char *mapname;
+ struct map_session_data *sd;
+
+ sd=script_rid2sd(st);
+
+ type=conv_num(st,& (st->stack->stack_data[st->start+2]));
+ mapname=calloc(24, 1);
+
+ x=sd->status.save_point.x;
+ y=sd->status.save_point.y;
+ strncpy(mapname,sd->status.save_point.map,24);
+ switch(type){
+ case 0:
+ push_str(st->stack,C_STR,mapname);
+ break;
+ case 1:
+ push_val(st->stack,C_INT,x);
+ break;
+ case 2:
+ push_val(st->stack,C_INT,y);
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ * Get position for char/npc/pet/mob objects. Added by Lorky
+ *
+ * int getMapXY(MapName$,MaxX,MapY,type,[CharName$]);
+ * where type:
+ * MapName$ - String variable for output map name
+ * MapX - Integer variable for output coord X
+ * MapY - Integer variable for output coord Y
+ * type - type of object
+ * 0 - Character coord
+ * 1 - NPC coord
+ * 2 - Pet coord
+ * 3 - Mob coord (not released)
+ * CharName$ - Name object. If miss or "this" the current object
+ *
+ * Return:
+ * 0 - success
+ * -1 - some error, MapName$,MapX,MapY contains unknown value.
+ *------------------------------------------
+*/
+int buildin_getmapxy(struct script_state *st){
+ struct map_session_data *sd=NULL;
+ struct npc_data *nd;
+ struct pet_data *pd;
+
+ int num;
+ char *name;
+ char prefix;
+
+ int x,y,type;
+ char *mapname;
+
+ if( st->stack->stack_data[st->start+2].type!=C_NAME ){
+ printf("script: buildin_getmapxy: not mapname variable\n");
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ if( st->stack->stack_data[st->start+3].type!=C_NAME ){
+ printf("script: buildin_getmapxy: not mapx variable\n");
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ if( st->stack->stack_data[st->start+4].type!=C_NAME ){
+ printf("script: buildin_getmapxy: not mapy variable\n");
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+//??????????? >>> Possible needly check function parameters on C_STR,C_INT,C_INT <<< ???????????//
+ type=conv_num(st,& (st->stack->stack_data[st->start+5]));
+ mapname=calloc(24, 1);
+
+ switch (type){
+ case 0: //Get Character Position
+ if( st->end>st->start+6 )
+ sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
+ else
+ sd=script_rid2sd(st);
+
+ if ( sd==NULL ) { //wrong char name or char offline
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+
+ x=sd->bl.x;
+ y=sd->bl.y;
+ strncpy(mapname,sd->mapname,24);
+ printf(">>>>%s %d %d\n",mapname,x,y);
+ break;
+ case 1: //Get NPC Position
+ if( st->end > st->start+6 )
+ nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+6])));
+ else
+ nd=(struct npc_data *)map_id2bl(st->oid);
+
+ if ( nd==NULL ) { //wrong npc name or char offline
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+ x=nd->bl.x;
+ y=nd->bl.y;
+ strncpy(mapname,map[nd->bl.m].name,24);
+ printf(">>>>%s %d %d\n",mapname,x,y);
+ break;
+ case 2: //Get Pet Position
+ if( st->end>st->start+6 )
+ sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+6])));
+ else
+ sd=script_rid2sd(st);
+
+ if ( sd==NULL ) { //wrong char name or char offline
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+ pd=sd->pd;
+
+ if(pd==NULL){ //ped data not found
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+ x=pd->bl.x;
+ y=pd->bl.y;
+ strncpy(mapname,map[pd->bl.m].name,24);
+
+ printf(">>>>%s %d %d\n",mapname,x,y);
+ break;
+
+ case 3: //Get Mob Position
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ default: //Wrong type parameter
+ push_val(st->stack,C_INT,-1);
+ return 0;
+ }
+
+ //Set MapName$
+ num=st->stack->stack_data[st->start+2].u.num;
+ name=(char *)(str_buf+str_data[num&0x00ffffff].str);
+ prefix=*name;
+
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+ else
+ sd=NULL;
+
+ set_reg(sd,num,name,(void*)mapname);
+
+ //Set MapX
+ num=st->stack->stack_data[st->start+3].u.num;
+ name=(char *)(str_buf+str_data[num&0x00ffffff].str);
+ prefix=*name;
+
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+ else
+ sd=NULL;
+ set_reg(sd,num,name,(void*)x);
+
+
+ //Set MapY
+ num=st->stack->stack_data[st->start+4].u.num;
+ name=(char *)(str_buf+str_data[num&0x00ffffff].str);
+ prefix=*name;
+
+ if( prefix!='$' )
+ sd=script_rid2sd(st);
+ else
+ sd=NULL;
+
+ set_reg(sd,num,name,(void*)y);
+
+ //Return Success value
+ push_val(st->stack,C_INT,0);
+ return 0;
+}
+
+
+//
+// ŽÀs•”main
+//
+/*==========================================
+ * ƒRƒ}ƒ“ƒh‚Ì“Ç‚ÝŽæ‚è
+ *------------------------------------------
+ */
+static int unget_com_data=-1;
+int get_com(unsigned char *script,int *pos)
+{
+ int i,j;
+ if(unget_com_data>=0){
+ i=unget_com_data;
+ unget_com_data=-1;
+ return i;
+ }
+ if(script[*pos]>=0x80){
+ return C_INT;
+ }
+ i=0; j=0;
+ while(script[*pos]>=0x40){
+ i=script[(*pos)++]<<j;
+ j+=6;
+ }
+ return i+(script[(*pos)++]<<j);
+}
+
+/*==========================================
+ * ƒRƒ}ƒ“ƒh‚̃vƒbƒVƒ…ƒoƒbƒN
+ *------------------------------------------
+ */
+void unget_com(int c)
+{
+ if(unget_com_data!=-1){
+ if(battle_config.error_log)
+ printf("unget_com can back only 1 data\n");
+ }
+ unget_com_data=c;
+}
+
+/*==========================================
+ * ”’l‚ÌŠ“¾
+ *------------------------------------------
+ */
+int get_num(unsigned char *script,int *pos)
+{
+ int i,j;
+ i=0; j=0;
+ while(script[*pos]>=0xc0){
+ i+=(script[(*pos)++]&0x7f)<<j;
+ j+=6;
+ }
+ return i+((script[(*pos)++]&0x7f)<<j);
+}
+
+/*==========================================
+ * ƒXƒ^ƒbƒN‚©‚ç’l‚ðŽæ‚èo‚·
+ *------------------------------------------
+ */
+int pop_val(struct script_state* st)
+{
+ if(st->stack->sp<=0)
+ return 0;
+ st->stack->sp--;
+ get_val(st,&(st->stack->stack_data[st->stack->sp]));
+ if(st->stack->stack_data[st->stack->sp].type==C_INT)
+ return st->stack->stack_data[st->stack->sp].u.num;
+ return 0;
+}
+
+#define isstr(c) ((c).type==C_STR || (c).type==C_CONSTSTR)
+
+/*==========================================
+ * ‰ÁŽZ‰‰ŽZŽq
+ *------------------------------------------
+ */
+void op_add(struct script_state* st)
+{
+ st->stack->sp--;
+ get_val(st,&(st->stack->stack_data[st->stack->sp]));
+ get_val(st,&(st->stack->stack_data[st->stack->sp-1]));
+
+ if(isstr(st->stack->stack_data[st->stack->sp]) || isstr(st->stack->stack_data[st->stack->sp-1])){
+ conv_str(st,&(st->stack->stack_data[st->stack->sp]));
+ conv_str(st,&(st->stack->stack_data[st->stack->sp-1]));
+ }
+ if(st->stack->stack_data[st->stack->sp].type==C_INT){ // ii
+ st->stack->stack_data[st->stack->sp-1].u.num += st->stack->stack_data[st->stack->sp].u.num;
+ } else { // ss‚Ì—\’è
+ char *buf;
+ buf=(char *)aCalloc(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+
+ strlen(st->stack->stack_data[st->stack->sp].u.str)+1,sizeof(char));
+ strcpy(buf,st->stack->stack_data[st->stack->sp-1].u.str);
+ strcat(buf,st->stack->stack_data[st->stack->sp].u.str);
+ if(st->stack->stack_data[st->stack->sp-1].type==C_STR)
+ free(st->stack->stack_data[st->stack->sp-1].u.str);
+ if(st->stack->stack_data[st->stack->sp].type==C_STR)
+ free(st->stack->stack_data[st->stack->sp].u.str);
+ st->stack->stack_data[st->stack->sp-1].type=C_STR;
+ st->stack->stack_data[st->stack->sp-1].u.str=buf;
+ }
+}
+
+/*==========================================
+ * “ñ€‰‰ŽZŽq(•¶Žš—ñ)
+ *------------------------------------------
+ */
+void op_2str(struct script_state *st,int op,int sp1,int sp2)
+{
+ char *s1=st->stack->stack_data[sp1].u.str,
+ *s2=st->stack->stack_data[sp2].u.str;
+ int a=0;
+
+ switch(op){
+ case C_EQ:
+ a= (strcmp(s1,s2)==0);
+ break;
+ case C_NE:
+ a= (strcmp(s1,s2)!=0);
+ break;
+ case C_GT:
+ a= (strcmp(s1,s2)> 0);
+ break;
+ case C_GE:
+ a= (strcmp(s1,s2)>=0);
+ break;
+ case C_LT:
+ a= (strcmp(s1,s2)< 0);
+ break;
+ case C_LE:
+ a= (strcmp(s1,s2)<=0);
+ break;
+ default:
+ printf("illegal string operater\n");
+ break;
+ }
+
+ push_val(st->stack,C_INT,a);
+
+ if(st->stack->stack_data[sp1].type==C_STR) free(s1);
+ if(st->stack->stack_data[sp2].type==C_STR) free(s2);
+}
+/*==========================================
+ * “ñ€‰‰ŽZŽq(”’l)
+ *------------------------------------------
+ */
+void op_2num(struct script_state *st,int op,int i1,int i2)
+{
+ switch(op){
+ case C_SUB:
+ i1-=i2;
+ break;
+ case C_MUL:
+ {
+ long long res = i1 * i2;
+ if (res > 2147483647 )
+ i1 = 2147483647;
+ else
+ i1*=i2;
+ }
+ break;
+ case C_DIV:
+ i1/=i2;
+ break;
+ case C_MOD:
+ i1%=i2;
+ break;
+ case C_AND:
+ i1&=i2;
+ break;
+ case C_OR:
+ i1|=i2;
+ break;
+ case C_XOR:
+ i1^=i2;
+ break;
+ case C_LAND:
+ i1=i1&&i2;
+ break;
+ case C_LOR:
+ i1=i1||i2;
+ break;
+ case C_EQ:
+ i1=i1==i2;
+ break;
+ case C_NE:
+ i1=i1!=i2;
+ break;
+ case C_GT:
+ i1=i1>i2;
+ break;
+ case C_GE:
+ i1=i1>=i2;
+ break;
+ case C_LT:
+ i1=i1<i2;
+ break;
+ case C_LE:
+ i1=i1<=i2;
+ break;
+ case C_R_SHIFT:
+ i1=i1>>i2;
+ break;
+ case C_L_SHIFT:
+ i1=i1<<i2;
+ break;
+ }
+ push_val(st->stack,C_INT,i1);
+}
+/*==========================================
+ * “ñ€‰‰ŽZŽq
+ *------------------------------------------
+ */
+void op_2(struct script_state *st,int op)
+{
+ int i1,i2;
+ char *s1=NULL,*s2=NULL;
+
+ i2=pop_val(st);
+ if( isstr(st->stack->stack_data[st->stack->sp]) )
+ s2=st->stack->stack_data[st->stack->sp].u.str;
+
+ i1=pop_val(st);
+ if( isstr(st->stack->stack_data[st->stack->sp]) )
+ s1=st->stack->stack_data[st->stack->sp].u.str;
+
+ if( s1!=NULL && s2!=NULL ){
+ // ss => op_2str
+ op_2str(st,op,st->stack->sp,st->stack->sp+1);
+ }else if( s1==NULL && s2==NULL ){
+ // ii => op_2num
+ op_2num(st,op,i1,i2);
+ }else{
+ // si,is => error
+ printf("script: op_2: int&str, str&int not allow.");
+ push_val(st->stack,C_INT,0);
+ }
+}
+
+/*==========================================
+ * ’P€‰‰ŽZŽq
+ *------------------------------------------
+ */
+void op_1num(struct script_state *st,int op)
+{
+ int i1;
+ i1=pop_val(st);
+ switch(op){
+ case C_NEG:
+ i1=-i1;
+ break;
+ case C_NOT:
+ i1=~i1;
+ break;
+ case C_LNOT:
+ i1=!i1;
+ break;
+ }
+ push_val(st->stack,C_INT,i1);
+}
+
+
+/*==========================================
+ * ŠÖ”‚ÌŽÀs
+ *------------------------------------------
+ */
+int run_func(struct script_state *st)
+{
+ int i,start_sp,end_sp,func;
+
+ end_sp=st->stack->sp;
+ for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--);
+ if(i==0){
+ if(battle_config.error_log)
+ printf("function not found\n");
+// st->stack->sp=0;
+ st->state=END;
+ return 0;
+ }
+ start_sp=i-1;
+ st->start=i-1;
+ st->end=end_sp;
+
+ func=st->stack->stack_data[st->start].u.num;
+ if( st->stack->stack_data[st->start].type!=C_NAME || str_data[func].type!=C_FUNC ){
+ printf("run_func: not function and command! \n");
+// st->stack->sp=0;
+ st->state=END;
+ return 0;
+ }
+#ifdef DEBUG_RUN
+ if(battle_config.etc_log) {
+ printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
+ printf("stack dump :");
+ for(i=0;i<end_sp;i++){
+ switch(st->stack->stack_data[i].type){
+ case C_INT:
+ printf(" int(%d)",st->stack->stack_data[i].u.num);
+ break;
+ case C_NAME:
+ printf(" name(%s)",str_buf+str_data[st->stack->stack_data[i].u.num].str);
+ break;
+ case C_ARG:
+ printf(" arg");
+ break;
+ case C_POS:
+ printf(" pos(%d)",st->stack->stack_data[i].u.num);
+ break;
+ default:
+ printf(" %d,%d",st->stack->stack_data[i].type,st->stack->stack_data[i].u.num);
+ }
+ }
+ printf("\n");
+ }
+#endif
+ if(str_data[func].func){
+ str_data[func].func(st);
+ } else {
+ if(battle_config.error_log)
+ printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type);
+ push_val(st->stack,C_INT,0);
+ }
+
+ pop_stack(st->stack,start_sp,end_sp);
+
+ if(st->state==RETFUNC){
+ // ƒ†[ƒU[’è‹`ŠÖ”‚©‚ç‚Ì•œ‹A
+ int olddefsp=st->defsp;
+ int i;
+
+ pop_stack(st->stack,st->defsp,start_sp); // •œ‹A‚Ɏז‚‚ȃXƒ^ƒbƒNíœ
+ if(st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO){
+ printf("script:run_func(return) return without callfunc or callsub!\n");
+ st->state=END;
+ return 0;
+ }
+ i = conv_num(st,& (st->stack->stack_data[st->defsp-4])); // ˆø”‚Ì”Š“¾
+ st->pos=conv_num(st,& (st->stack->stack_data[st->defsp-1])); // ƒXƒNƒŠƒvƒgˆÊ’u‚Ì•œŒ³
+ st->script=(char*)conv_num(st,& (st->stack->stack_data[st->defsp-2])); // ƒXƒNƒŠƒvƒg‚𕜌³
+ st->defsp=conv_num(st,& (st->stack->stack_data[st->defsp-3])); // Šî€ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚𕜌³
+
+ pop_stack(st->stack,olddefsp-4-i,olddefsp); // —v‚ç‚È‚­‚È‚Á‚½ƒXƒ^ƒbƒN(ˆø”‚Æ•œ‹A—pƒf[ƒ^)íœ
+
+ st->state=GOTO;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒg‚ÌŽÀsƒƒCƒ“•”•ª
+ *------------------------------------------
+ */
+int run_script_main(unsigned char *script,int pos,int rid,int oid,struct script_state *st,unsigned char *rootscript)
+{
+ int c,rerun_pos;
+ int cmdcount=script_config.check_cmdcount;
+ int gotocount=script_config.check_gotocount;
+ struct script_stack *stack=st->stack;
+
+ st->defsp=stack->sp;
+ st->script=script;
+
+ rerun_pos=st->pos;
+ for(st->state=0;st->state==0;){
+ switch(c=get_com(script,&st->pos)){
+ case C_EOL:
+ if(stack->sp!=st->defsp){
+ if(battle_config.error_log)
+ printf("stack.sp(%d) != default(%d)\n",stack->sp,st->defsp);
+ stack->sp=st->defsp;
+ }
+ rerun_pos=st->pos;
+ break;
+ case C_INT:
+ push_val(stack,C_INT,get_num(script,&st->pos));
+ break;
+ case C_POS:
+ case C_NAME:
+ push_val(stack,c,(*(int*)(script+st->pos))&0xffffff);
+ st->pos+=3;
+ break;
+ case C_ARG:
+ push_val(stack,c,0);
+ break;
+ case C_STR:
+ push_str(stack,C_CONSTSTR,script+st->pos);
+ while(script[st->pos++]);
+ break;
+ case C_FUNC:
+ run_func(st);
+ if(st->state==GOTO){
+ rerun_pos=st->pos;
+ script=st->script;
+ st->state=0;
+ if( gotocount>0 && (--gotocount)<=0 ){
+ printf("run_script: infinity loop !\n");
+ st->state=END;
+ }
+ }
+ break;
+
+ case C_ADD:
+ op_add(st);
+ break;
+
+ case C_SUB:
+ case C_MUL:
+ case C_DIV:
+ case C_MOD:
+ case C_EQ:
+ case C_NE:
+ case C_GT:
+ case C_GE:
+ case C_LT:
+ case C_LE:
+ case C_AND:
+ case C_OR:
+ case C_XOR:
+ case C_LAND:
+ case C_LOR:
+ case C_R_SHIFT:
+ case C_L_SHIFT:
+ op_2(st,c);
+ break;
+
+ case C_NEG:
+ case C_NOT:
+ case C_LNOT:
+ op_1num(st,c);
+ break;
+
+ case C_NOP:
+ st->state=END;
+ break;
+
+ default:
+ if(battle_config.error_log)
+ printf("unknown command : %d @ %d\n",c,pos);
+ st->state=END;
+ break;
+ }
+ if( cmdcount>0 && (--cmdcount)<=0 ){
+ printf("run_script: infinity loop !\n");
+ st->state=END;
+ }
+ }
+ switch(st->state){
+ case STOP:
+ break;
+ case END:
+ {
+ struct map_session_data *sd=map_id2sd(st->rid);
+ st->pos=-1;
+ if(sd && sd->npc_id==st->oid)
+ npc_event_dequeue(sd);
+ }
+ break;
+ case RERUNLINE:
+ {
+ st->pos=rerun_pos;
+ }
+ break;
+ }
+
+ if( st->state!=END){
+ // ÄŠJ‚·‚邽‚߂ɃXƒ^ƒbƒNî•ñ‚ð•Û‘¶
+ struct map_session_data *sd=map_id2sd(st->rid);
+ if(sd/* && sd->npc_stackbuf==NULL*/){
+ if( sd->npc_stackbuf )
+ free( sd->npc_stackbuf );
+ sd->npc_stackbuf = (char *)aCalloc(sizeof(stack->stack_data[0])*stack->sp_max,sizeof(char));
+ memcpy(sd->npc_stackbuf, stack->stack_data, sizeof(stack->stack_data[0]) * stack->sp_max);
+ sd->npc_stack = stack->sp;
+ sd->npc_stackmax = stack->sp_max;
+ sd->npc_script=script;
+ sd->npc_scriptroot=rootscript;
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒNƒŠƒvƒg‚ÌŽÀs
+ *------------------------------------------
+ */
+int run_script(unsigned char *script,int pos,int rid,int oid)
+{
+ struct script_stack stack;
+ struct script_state st;
+ struct map_session_data *sd=map_id2sd(rid);
+ unsigned char *rootscript=script;
+
+ if(script==NULL || pos<0)
+ return -1;
+
+ if(sd && sd->npc_stackbuf && sd->npc_scriptroot==(char*)rootscript){
+ // ‘O‰ñ‚̃Xƒ^ƒbƒN‚𕜋A
+ script=sd->npc_script;
+ stack.sp=sd->npc_stack;
+ stack.sp_max=sd->npc_stackmax;
+ stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
+ memcpy(stack.stack_data,sd->npc_stackbuf,sizeof(stack.stack_data[0])*stack.sp_max);
+ free(sd->npc_stackbuf);
+ sd->npc_stackbuf=NULL;
+ }else{
+ // ƒXƒ^ƒbƒN‰Šú‰»
+ stack.sp=0;
+ stack.sp_max=64;
+ stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0]));
+ }
+ st.stack=&stack;
+ st.pos=pos;
+ st.rid=rid;
+ st.oid=oid;
+ run_script_main(script,pos,rid,oid,&st,rootscript);
+
+ free(stack.stack_data);
+ stack.stack_data=NULL;
+ return st.pos;
+}
+
+
+/*==========================================
+ * ƒ}ƒbƒv•Ï”‚Ì•ÏX
+ *------------------------------------------
+ */
+int mapreg_setreg(int num,int val)
+{
+ if(val!=0)
+ numdb_insert(mapreg_db,num,val);
+ else
+ numdb_erase(mapreg_db,num);
+
+ mapreg_dirty=1;
+ return 0;
+}
+/*==========================================
+ * •¶Žš—ñŒ^ƒ}ƒbƒv•Ï”‚Ì•ÏX
+ *------------------------------------------
+ */
+int mapreg_setregstr(int num,const char *str)
+{
+ char *p;
+
+ if( (p=numdb_search(mapregstr_db,num))!=NULL )
+ free(p);
+
+ if( str==NULL || *str==0 ){
+ numdb_erase(mapregstr_db,num);
+ mapreg_dirty=1;
+ return 0;
+ }
+ p=(char *)aCalloc(strlen(str)+1, sizeof(char));
+ strcpy(p,str);
+ numdb_insert(mapregstr_db,num,p);
+ mapreg_dirty=1;
+ return 0;
+}
+
+/*==========================================
+ * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì“Ç‚Ýž‚Ý
+ *------------------------------------------
+ */
+static int script_load_mapreg()
+{
+ FILE *fp;
+ char line[1024];
+
+ if( (fp=fopen(mapreg_txt,"rt"))==NULL )
+ return -1;
+
+ while(fgets(line,sizeof(line),fp)){
+ char buf1[256],buf2[1024],*p;
+ int n,v,s,i;
+ if( sscanf(line,"%255[^,],%d\t%n",buf1,&i,&n)!=2 &&
+ (i=0,sscanf(line,"%[^\t]\t%n",buf1,&n)!=1) )
+ continue;
+ if( buf1[strlen(buf1)-1]=='$' ){
+ if( sscanf(line+n,"%[^\n\r]",buf2)!=1 ){
+ printf("%s: %s broken data !\n",mapreg_txt,buf1);
+ continue;
+ }
+ p=(char *)aCalloc(strlen(buf2) + 1,sizeof(char));
+ strcpy(p,buf2);
+ s=add_str(buf1);
+ numdb_insert(mapregstr_db,(i<<24)|s,p);
+ }else{
+ if( sscanf(line+n,"%d",&v)!=1 ){
+ printf("%s: %s broken data !\n",mapreg_txt,buf1);
+ continue;
+ }
+ s=add_str(buf1);
+ numdb_insert(mapreg_db,(i<<24)|s,v);
+ }
+ }
+ fclose(fp);
+ mapreg_dirty=0;
+ return 0;
+}
+/*==========================================
+ * ‰i‘±“Iƒ}ƒbƒv•Ï”‚Ì‘‚«ž‚Ý
+ *------------------------------------------
+ */
+static int script_save_mapreg_intsub(void *key,void *data,va_list ap)
+{
+ FILE *fp=va_arg(ap,FILE*);
+ int num=((int)key)&0x00ffffff, i=((int)key)>>24;
+ char *name=str_buf+str_data[num].str;
+ if( name[1]!='@' ){
+ if(i==0)
+ fprintf(fp,"%s\t%d\n", name, (int)data);
+ else
+ fprintf(fp,"%s,%d\t%d\n", name, i, (int)data);
+ }
+ return 0;
+}
+static int script_save_mapreg_strsub(void *key,void *data,va_list ap)
+{
+ FILE *fp=va_arg(ap,FILE*);
+ int num=((int)key)&0x00ffffff, i=((int)key)>>24;
+ char *name=str_buf+str_data[num].str;
+ if( name[1]!='@' ){
+ if(i==0)
+ fprintf(fp,"%s\t%s\n", name, (char *)data);
+ else
+ fprintf(fp,"%s,%d\t%s\n", name, i, (char *)data);
+ }
+ return 0;
+}
+static int script_save_mapreg()
+{
+ FILE *fp;
+ int lock;
+
+ if( (fp=lock_fopen(mapreg_txt,&lock))==NULL )
+ return -1;
+ numdb_foreach(mapreg_db,script_save_mapreg_intsub,fp);
+ numdb_foreach(mapregstr_db,script_save_mapreg_strsub,fp);
+ lock_fclose(fp,mapreg_txt,&lock);
+ mapreg_dirty=0;
+ return 0;
+}
+static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data)
+{
+ if(mapreg_dirty)
+ script_save_mapreg();
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int set_posword(char *p)
+{
+ char* np,* str[15];
+ int i=0;
+ for(i=0;i<11;i++) {
+ if((np=strchr(p,','))!=NULL) {
+ str[i]=p;
+ *np=0;
+ p=np+1;
+ } else {
+ str[i]=p;
+ p+=strlen(p);
+ }
+ if(str[i])
+ strcpy(pos[i],str[i]);
+ }
+ return 0;
+}
+
+int script_config_read(char *cfgName)
+{
+ int i;
+ char line[1024],w1[1024],w2[1024];
+ FILE *fp;
+
+ script_config.warn_func_no_comma=1;
+ script_config.warn_cmd_no_comma=1;
+ script_config.warn_func_mismatch_paramnum=1;
+ script_config.warn_cmd_mismatch_paramnum=1;
+ script_config.check_cmdcount=8192;
+ script_config.check_gotocount=512;
+
+ 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,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+ if(strcmpi(w1,"refine_posword")==0) {
+ set_posword(w2);
+ }
+ if(strcmpi(w1,"import")==0){
+ script_config_read(w2);
+ }
+ }
+ fclose(fp);
+
+ return 0;
+}
+
+/*==========================================
+ * I—¹
+ *------------------------------------------
+ */
+static int mapreg_db_final(void *key,void *data,va_list ap)
+{
+ return 0;
+}
+static int mapregstr_db_final(void *key,void *data,va_list ap)
+{
+ free(data);
+ return 0;
+}
+static int scriptlabel_db_final(void *key,void *data,va_list ap)
+{
+ return 0;
+}
+static int userfunc_db_final(void *key,void *data,va_list ap)
+{
+ free(key);
+ free(data);
+ return 0;
+}
+int do_final_script()
+{
+ if(mapreg_dirty>=0)
+ script_save_mapreg();
+ if(script_buf)
+ free(script_buf);
+
+ if(mapreg_db)
+ numdb_final(mapreg_db,mapreg_db_final);
+ if(mapregstr_db)
+ strdb_final(mapregstr_db,mapregstr_db_final);
+ if(scriptlabel_db)
+ strdb_final(scriptlabel_db,scriptlabel_db_final);
+ if(userfunc_db)
+ strdb_final(userfunc_db,userfunc_db_final);
+
+ if (str_data)
+ free(str_data);
+ if (str_buf)
+ free(str_buf);
+
+ return 0;
+}
+/*==========================================
+ * ‰Šú‰»
+ *------------------------------------------
+ */
+int do_init_script()
+{
+ mapreg_db=numdb_init();
+ mapregstr_db=numdb_init();
+ script_load_mapreg();
+
+ add_timer_func_list(script_autosave_mapreg,"script_autosave_mapreg");
+ add_timer_interval(gettick()+MAPREG_AUTOSAVE_INTERVAL,
+ script_autosave_mapreg,0,0,MAPREG_AUTOSAVE_INTERVAL);
+
+ scriptlabel_db=strdb_init(50);
+ return 0;
+}
diff --git a/src/map/script.h b/src/map/script.h
index c0c4ba20f..b50c46693 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -1,39 +1,39 @@
-// $Id: script.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _SCRIPT_H_
-#define _SCRIPT_H_
-
-struct script_data {
- int type;
- union {
- int num;
- char *str;
- } u;
-};
-
-struct script_stack {
- int sp,sp_max;
- struct script_data *stack_data;
-};
-struct script_state {
- struct script_stack *stack;
- int start,end;
- int pos,state;
- int rid,oid;
- char *script,*new_script;
- int defsp,new_pos,new_defsp;
-};
-
-unsigned char * parse_script(unsigned char *,int);
-int run_script(unsigned char *,int,int,int);
-
-struct dbt* script_get_label_db();
-struct dbt* script_get_userfunc_db();
-
-int script_config_read(char *cfgName);
-int do_init_script();
-int do_final_script();
-
-extern char mapreg_txt[];
-
-#endif
-
+// $Id: script.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
+#ifndef _SCRIPT_H_
+#define _SCRIPT_H_
+
+struct script_data {
+ int type;
+ union {
+ int num;
+ char *str;
+ } u;
+};
+
+struct script_stack {
+ int sp,sp_max;
+ struct script_data *stack_data;
+};
+struct script_state {
+ struct script_stack *stack;
+ int start,end;
+ int pos,state;
+ int rid,oid;
+ char *script,*new_script;
+ int defsp,new_pos,new_defsp;
+};
+
+unsigned char * parse_script(unsigned char *,int);
+int run_script(unsigned char *,int,int,int);
+
+struct dbt* script_get_label_db();
+struct dbt* script_get_userfunc_db();
+
+int script_config_read(char *cfgName);
+int do_init_script();
+int do_final_script();
+
+extern char mapreg_txt[];
+
+#endif
+
diff --git a/src/map/skill.c b/src/map/skill.c
index 2d6b799df..b1b0ed2fb 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1,10805 +1,10805 @@
-// $Id: skill.c,v 1.8 2004/09/25 05:32:19 MouseJstr Exp $
-/* ƒXƒLƒ‹?ŒW */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "timer.h"
-#include "nullpo.h"
-#include "malloc.h"
-
-#include "skill.h"
-#include "map.h"
-#include "clif.h"
-#include "pc.h"
-#include "pet.h"
-#include "mob.h"
-#include "battle.h"
-#include "party.h"
-#include "itemdb.h"
-#include "script.h"
-#include "intif.h"
-#include "log.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-#define SKILLUNITTIMER_INVERVAL 100
-
-#define STATE_BLIND 0x10
-
-/* ƒXƒLƒ‹”Ô?„ƒXƒe?ƒ^ƒXˆÙí”Ô??Š·ƒe?ƒuƒ‹ */
-int SkillStatusChangeTable[]={ /* skill.h‚Ìenum‚ÌSC_***‚Æ‚ ‚킹‚邱‚Æ */
-/* 0- */
- -1,-1,-1,-1,-1,-1,
- SC_PROVOKE, /* ƒvƒƒ{ƒbƒN */
- -1, 1,-1,
-/* 10- */
- SC_SIGHT, /* ƒTƒCƒg */
- -1,-1,-1,-1,
- SC_FREEZE, /* ƒtƒƒXƒgƒ_ƒCƒo? */
- SC_STONE, /* ƒXƒg?ƒ“ƒJ?ƒX */
- -1,-1,-1,
-/* 20- */
- -1,-1,-1,-1,
- SC_RUWACH, /* ƒ‹ƒAƒt */
- -1,-1,-1,-1,
- SC_INCREASEAGI, /* ‘¬“x?‰Á */
-/* 30- */
- SC_DECREASEAGI, /* ‘¬“xŒ¸­ */
- -1,
- SC_SIGNUMCRUCIS, /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- SC_ANGELUS, /* ƒGƒ“ƒWƒFƒ‰ƒX */
- SC_BLESSING, /* ƒuƒŒƒbƒVƒ“ƒO */
- -1,-1,-1,-1,-1,
-/* 40- */
- -1,-1,-1,-1,-1,
- SC_CONCENTRATE, /* W’†—ÍŒüã */
- -1,-1,-1,-1,
-/* 50- */
- -1,
- SC_HIDING, /* ƒnƒCƒfƒBƒ“ƒO */
- -1,-1,-1,-1,-1,-1,-1,-1,
-/* 60- */
- SC_TWOHANDQUICKEN, /* 2HQ */
- SC_AUTOCOUNTER,
- -1,-1,-1,-1,
- SC_IMPOSITIO, /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- SC_SUFFRAGIUM, /* ƒTƒtƒ‰ƒMƒEƒ€ */
- SC_ASPERSIO, /* ƒAƒXƒyƒ‹ƒVƒI */
- SC_BENEDICTIO, /* ¹?~•Ÿ */
-/* 70- */
- -1,
- SC_SLOWPOISON,
- -1,
- SC_KYRIE, /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- SC_MAGNIFICAT, /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- SC_GLORIA, /* ƒOƒƒŠƒA */
- SC_DIVINA, /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
- -1,
- SC_AETERNA, /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
- -1,
-/* 80- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 90- */
- -1,-1,
- SC_QUAGMIRE, /* ƒNƒ@ƒOƒ}ƒCƒA */
- -1,-1,-1,-1,-1,-1,-1,
-/* 100- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 110- */
- -1,
- SC_ADRENALINE, /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- SC_WEAPONPERFECTION,/* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- SC_OVERTHRUST, /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
- SC_MAXIMIZEPOWER, /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- -1,-1,-1,-1,-1,
-/* 120- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 130- */
- -1,-1,-1,-1,-1,
- SC_CLOAKING, /* ƒNƒ?ƒLƒ“ƒO */
- SC_STAN, /* ƒ\ƒjƒbƒNƒuƒ? */
- -1,
- SC_ENCPOISON, /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- SC_POISONREACT, /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
-/* 140- */
- SC_POISON, /* ƒxƒmƒ€ƒ_ƒXƒg */
- SC_SPLASHER, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- -1,
- SC_TRICKDEAD, /* Ž€‚ñ‚¾‚Ó‚è */
- -1,-1,-1,-1,-1,-1,
-/* 150- */
- -1,-1,-1,-1,-1,
- SC_LOUD, /* ƒ‰ƒEƒhƒ{ƒCƒX */
- -1,
- SC_ENERGYCOAT, /* ƒGƒiƒW?ƒR?ƒg */
- -1,-1,
-/* 160- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,
- SC_SELFDESTRUCTION,
- -1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,
- SC_KEEPING,
- -1,-1,
- SC_BARRIER,
- -1,-1,
- SC_HALLUCINATION,
- -1,-1,
-/* 210- */
- -1,-1,-1,-1,-1,
- SC_STRIPWEAPON,
- SC_STRIPSHIELD,
- SC_STRIPARMOR,
- SC_STRIPHELM,
- -1,
-/* 220- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 230- */
- -1,-1,-1,-1,
- SC_CP_WEAPON,
- SC_CP_SHIELD,
- SC_CP_ARMOR,
- SC_CP_HELM,
- -1,-1,
-/* 240- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,
- SC_AUTOGUARD,
-/* 250- */
- -1,-1,
- SC_REFLECTSHIELD,
- -1,-1,
- SC_DEVOTION,
- SC_PROVIDENCE,
- SC_DEFENDER,
- SC_SPEARSQUICKEN,
- -1,
-/* 260- */
- -1,-1,-1,-1,-1,-1,-1,-1,
- SC_STEELBODY,
- SC_BLADESTOP_WAIT,
-/* 270- */
- SC_EXPLOSIONSPIRITS,
- SC_EXTREMITYFIST,
- -1,-1,-1,-1,
- SC_MAGICROD,
- -1,-1,-1,
-/* 280- */
- SC_FLAMELAUNCHER,
- SC_FROSTWEAPON,
- SC_LIGHTNINGLOADER,
- SC_SEISMICWEAPON,
- -1,
- SC_VOLCANO,
- SC_DELUGE,
- SC_VIOLENTGALE,
- SC_LANDPROTECTOR,
- -1,
-/* 290- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 300- */
- -1,-1,-1,-1,-1,-1,
- SC_LULLABY,
- SC_RICHMANKIM,
- SC_ETERNALCHAOS,
- SC_DRUMBATTLE,
-/* 310- */
- SC_NIBELUNGEN,
- SC_ROKISWEIL,
- SC_INTOABYSS,
- SC_SIEGFRIED,
- -1,-1,-1,
- SC_DISSONANCE,
- -1,
- SC_WHISTLE,
-/* 320- */
- SC_ASSNCROS,
- SC_POEMBRAGI,
- SC_APPLEIDUN,
- -1,-1,
- SC_UGLYDANCE,
- -1,
- SC_HUMMING,
- SC_DONTFORGETME,
- SC_FORTUNE,
-/* 330- */
- SC_SERVICE4U,
- SC_SELFDESTRUCTION,
- -1,-1,-1,-1,-1,-1,-1,-1,
-/* 340- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-/* 350- */
- -1,-1,-1,-1,-1,
- SC_AURABLADE,
- SC_PARRYING,
- SC_CONCENTRATION,
- SC_TENSIONRELAX,
- SC_BERSERK,
-/* 360- */
- SC_BERSERK,
- SC_ASSUMPTIO,
- SC_BASILICA,
- -1,-1,-1,
- SC_MAGICPOWER,
- -1,-1,
- SC_GOSPEL,
-/* 370- */
- -1,-1,-1,-1,-1,-1,-1,-1,SC_EDP,-1,
-/* 380- */
- SC_TRUESIGHT,
- -1,-1,
- SC_WINDWALK,
- SC_MELTDOWN,
- -1,-1,
- SC_CARTBOOST,
- -1,
- SC_CHASEWALK,
-/* 390- */
- SC_REJECTSWORD,
- -1,-1,-1,-1,-1,
- SC_MARIONETTE,
- -1,
- SC_HEADCRUSH,
- SC_JOINTBEAT,
-/* 400 */
- -1,-1,
- SC_MINDBREAKER,
- SC_MEMORIZE,
- SC_FOGWALL,
- SC_SPIDERWEB,
- -1,-1,-1,-1,
-/* 410- */
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-};
-
-struct skill_name_db skill_names[] = {
- { AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow" } ,
- { AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration" } ,
- { AC_DOUBLE, "DOUBLE", "Double_Strafe" } ,
- { AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation" } ,
- { AC_OWL, "OWL", "Owl's_Eye" } ,
- { AC_SHOWER, "SHOWER", "Arrow_Shower" } ,
- { AC_VULTURE, "VULTURE", "Vulture's_Eye" } ,
- { ALL_RESURRECTION, "RESURRECTION", "Resurrection" } ,
- { AL_ANGELUS, "ANGELUS", "Angelus" } ,
- { AL_BLESSING, "BLESSING", "Blessing" } ,
- { AL_CRUCIS, "CRUCIS", "Signum_Crusis" } ,
- { AL_CURE, "CURE", "Cure" } ,
- { AL_DECAGI, "DECAGI", "Decrease_AGI" } ,
- { AL_DEMONBANE, "DEMONBANE", "Demon_Bane" } ,
- { AL_DP, "DP", "Divine_Protection" } ,
- { AL_HEAL, "HEAL", "Heal" } ,
- { AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light" } ,
- { AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta" } ,
- { AL_INCAGI, "INCAGI", "Increase_AGI" } ,
- { AL_PNEUMA, "PNEUMA", "Pneuma" } ,
- { AL_RUWACH, "RUWACH", "Ruwach" } ,
- { AL_TELEPORT, "TELEPORT", "Teleport" } ,
- { AL_WARP, "WARP", "Warp_Portal" } ,
- { AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror" } ,
- { AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery" } ,
- { AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher" } ,
- { AM_BIOETHICS, "BIOETHICS", "Bioethics" } ,
- { AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology" } ,
- { AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus" } ,
- { AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize" } ,
- { AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor" } ,
- { AM_CP_HELM, "HELM", "Chemical_Protection_Helm" } ,
- { AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield" } ,
- { AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon" } ,
- { AM_CREATECREATURE, "CREATECREATURE", "Life_Creation" } ,
- { AM_CULTIVATION, "CULTIVATION", "Cultivation" } ,
- { AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration" } ,
- { AM_DRILLMASTER, "DRILLMASTER", "Drillmaster" } ,
- { AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control" } ,
- { AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus" } ,
- { AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION" } ,
- { AM_PHARMACY, "PHARMACY", "Pharmacy" } ,
- { AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher" } ,
- { AM_REST, "REST", "Sabbath" } ,
- { AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus" } ,
- { AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine" } ,
- { ASC_BREAKER, "BREAKER", "Breaker" } ,
- { ASC_CDP, "CDP", "Create_Deadly_Poison" } ,
- { ASC_EDP, "EDP", "Deadly_Poison_Enchantment" } ,
- { ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk" } ,
- { ASC_KATAR, "KATAR", "Advanced_Katar_Mastery" } ,
- { ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault" } ,
- { AS_CLOAKING, "CLOAKING", "Cloaking" } ,
- { AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison" } ,
- { AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth" } ,
- { AS_KATAR, "KATAR", "Katar_Mastery" } ,
- { AS_LEFT, "LEFT", "Lefthand_Mastery" } ,
- { AS_POISONREACT, "POISONREACT", "Poison_React" } ,
- { AS_RIGHT, "RIGHT", "Righthand_Mastery" } ,
- { AS_SONICBLOW, "SONICBLOW", "Sonic_Blow" } ,
- { AS_SPLASHER, "SPLASHER", "Venom_Splasher" } ,
- { AS_VENOMDUST, "VENOMDUST", "Venom_Dust" } ,
- { BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun" } ,
- { BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross" } ,
- { BA_DISSONANCE, "DISSONANCE", "Dissonance" } ,
- { BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke" } ,
- { BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson" } ,
- { BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike" } ,
- { BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi" } ,
- { BA_WHISTLE, "WHISTLE", "Whistle" } ,
- { BD_ADAPTATION, "ADAPTATION", "Adaption" } ,
- { BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField" } ,
- { BD_ENCORE, "ENCORE", "Encore" } ,
- { BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos" } ,
- { BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss" } ,
- { BD_LULLABY, "LULLABY", "Lullaby" } ,
- { BD_RAGNAROK, "RAGNAROK", "Ragnarok" } ,
- { BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim" } ,
- { BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen" } ,
- { BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail" } ,
- { BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried" } ,
- { BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush" } ,
- { BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2" } ,
- { BS_AXE, "AXE", "Smith_Axe" } ,
- { BS_DAGGER, "DAGGER", "Smith_Dagger" } ,
- { BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft" } ,
- { BS_FINDINGORE, "FINDINGORE", "Ore_Discovery" } ,
- { BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall" } ,
- { BS_HILTBINDING, "HILTBINDING", "Hilt_Binding" } ,
- { BS_IRON, "IRON", "Iron_Tempering" } ,
- { BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace" } ,
- { BS_MACE, "MACE", "Smith_Mace" } ,
- { BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize" } ,
- { BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research" } ,
- { BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust" } ,
- { BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair" } ,
- { BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering" } ,
- { BS_SPEAR, "SPEAR", "Smith_Spear" } ,
- { BS_STEEL, "STEEL", "Steel_Tempering" } ,
- { BS_SWORD, "SWORD", "Smith_Sword" } ,
- { BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword" } ,
- { BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection" } ,
- { BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research" } ,
- { CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow" } ,
- { CG_MARIONETTE, "MARIONETTE", "Marionette_Control" } ,
- { CG_MOONLIT, "MOONLIT", "Moonlight_Petals" } ,
- { CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo" } ,
- { CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike" } ,
- { CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul" } ,
- { CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist" } ,
- { CR_ALCHEMY, "ALCHEMY", "Alchemy" } ,
- { CR_AUTOGUARD, "AUTOGUARD", "Guard" } ,
- { CR_DEFENDER, "DEFENDER", "Defender" } ,
- { CR_DEVOTION, "DEVOTION", "Sacrifice" } ,
- { CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross" } ,
- { CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross" } ,
- { CR_PROVIDENCE, "PROVIDENCE", "Providence" } ,
- { CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect" } ,
- { CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang" } ,
- { CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge" } ,
- { CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken" } ,
- { CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis" } ,
- { CR_TRUST, "TRUST", "Faith" } ,
- { DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson" } ,
- { DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me" } ,
- { DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss" } ,
- { DC_HUMMING, "HUMMING", "Humming" } ,
- { DC_SCREAM, "SCREAM", "Scream" } ,
- { DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute" } ,
- { DC_THROWARROW, "THROWARROW", "Throw_Arrow" } ,
- { DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance" } ,
- { HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio" } ,
- { HP_BASILICA, "BASILICA", "Basilica" } ,
- { HP_MEDITATIO, "MEDITATIO", "Meditation" } ,
- { HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare" } ,
- { HT_BEASTBANE, "BEASTBANE", "Beast_Bane" } ,
- { HT_BLASTMINE, "BLASTMINE", "Blast_Mine" } ,
- { HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat" } ,
- { HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap" } ,
- { HT_DETECTING, "DETECTING", "Detect" } ,
- { HT_FALCON, "FALCON", "Falconry_Mastery" } ,
- { HT_FLASHER, "FLASHER", "Flasher" } ,
- { HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap" } ,
- { HT_LANDMINE, "LANDMINE", "Land_Mine" } ,
- { HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap" } ,
- { HT_SANDMAN, "SANDMAN", "Sandman" } ,
- { HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap" } ,
- { HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap" } ,
- { HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap" } ,
- { HT_STEELCROW, "STEELCROW", "Steel_Crow" } ,
- { HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box" } ,
- { HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher" } ,
- { HW_MAGICPOWER, "MAGICPOWER", "Magic_Power" } ,
- { HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan" } ,
- { HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain" } ,
- { KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack" } ,
- { KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash" } ,
- { KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear" } ,
- { KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery" } ,
- { KN_PIERCE, "PIERCE", "Pierce" } ,
- { KN_RIDING, "RIDING", "Peco_Peco_Ride" } ,
- { KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang" } ,
- { KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery" } ,
- { KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab" } ,
- { KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken" } ,
- { LK_AURABLADE, "AURABLADE", "Aura_Blade" } ,
- { LK_BERSERK, "BERSERK", "Berserk" } ,
- { LK_CONCENTRATION, "CONCENTRATION", "Concentration" } ,
- { LK_FURY, "FURY", "LK_FURY" } ,
- { LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher" } ,
- { LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat" } ,
- { LK_PARRYING, "PARRYING", "Parrying" } ,
- { LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce" } ,
- { LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax" } ,
- { MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution" } ,
- { MC_CHANGECART, "CHANGECART", "Change_Cart" } ,
- { MC_DISCOUNT, "DISCOUNT", "Discount" } ,
- { MC_IDENTIFY, "IDENTIFY", "Item_Appraisal" } ,
- { MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit" } ,
- { MC_LOUD, "LOUD", "Lord_Exclamation" } ,
- { MC_MAMMONITE, "MAMMONITE", "Mammonite" } ,
- { MC_OVERCHARGE, "OVERCHARGE", "Overcharge" } ,
- { MC_PUSHCART, "PUSHCART", "Pushcart" } ,
- { MC_VENDING, "VENDING", "Vending" } ,
- { MG_COLDBOLT, "COLDBOLT", "Cold_Bolt" } ,
- { MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat" } ,
- { MG_FIREBALL, "FIREBALL", "Fire_Ball" } ,
- { MG_FIREBOLT, "FIREBOLT", "Fire_Bolt" } ,
- { MG_FIREWALL, "FIREWALL", "Fire_Wall" } ,
- { MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver" } ,
- { MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt" } ,
- { MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat" } ,
- { MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall" } ,
- { MG_SIGHT, "SIGHT", "Sight" } ,
- { MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike" } ,
- { MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery" } ,
- { MG_STONECURSE, "STONECURSE", "Stone_Curse" } ,
- { MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm" } ,
- { MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits" } ,
- { MO_BLADESTOP, "BLADESTOP", "Blade_Stop" } ,
- { MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation" } ,
- { MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits" } ,
- { MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo" } ,
- { MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish" } ,
- { MO_DODGE, "DODGE", "Dodge" } ,
- { MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits" } ,
- { MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist" } ,
- { MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive" } ,
- { MO_INVESTIGATE, "INVESTIGATE", "Investigate" } ,
- { MO_IRONHAND, "IRONHAND", "Iron_Hand" } ,
- { MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery" } ,
- { MO_STEELBODY, "STEELBODY", "Steel_Body" } ,
- { MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows" } ,
- { NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE" } ,
- { NPC_BARRIER, "BARRIER", "NPC_BARRIER" } ,
- { NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK" } ,
- { NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN" } ,
- { NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS" } ,
- { NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE" } ,
- { NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND" } ,
- { NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY" } ,
- { NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON" } ,
- { NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS" } ,
- { NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER" } ,
- { NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND" } ,
- { NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK" } ,
- { NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH" } ,
- { NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK" } ,
- { NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING" } ,
- { NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH" } ,
- { NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS" } ,
- { NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK" } ,
- { NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER" } ,
- { NPC_EMOTION, "EMOTION", "NPC_EMOTION" } ,
- { NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN" } ,
- { NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK" } ,
- { NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK" } ,
- { NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK" } ,
- { NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION" } ,
- { NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK" } ,
- { NPC_KEEPING, "KEEPING", "NPC_KEEPING" } ,
- { NPC_LICK, "LICK", "NPC_LICK" } ,
- { NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK" } ,
- { NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER" } ,
- { NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS" } ,
- { NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK" } ,
- { NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT" } ,
- { NPC_POISON, "POISON", "NPC_POISON" } ,
- { NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK" } ,
- { NPC_PROVOCATION, "PROVOCATION", "NPC_PROVOCATION" } ,
- { NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK" } ,
- { NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK" } ,
- { NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH" } ,
- { NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!" } ,
- { NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2" } ,
- { NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK" } ,
- { NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK" } ,
- { NPC_SMOKING, "SMOKING", "NPC_SMOKING" } ,
- { NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK" } ,
- { NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK" } ,
- { NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE" } ,
- { NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER" } ,
- { NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE" } ,
- { NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK" } ,
- { NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION" } ,
- { NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK" } ,
- { NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK" } ,
- { NV_BASIC, "BASIC", "Basic_Skill" } ,
- { NV_FIRSTAID, "FIRSTAID", "First Aid" } ,
- { NV_TRICKDEAD, "TRICKDEAD", "Play_Dead" } ,
- { PA_GOSPEL, "GOSPEL", "Gospel" } ,
- { PA_PRESSURE, "PRESSURE", "Pressure" } ,
- { PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual" } ,
- { PF_FOGWALL, "FOGWALL", "Wall_of_Fog" } ,
- { PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion" } ,
- { PF_MEMORIZE, "MEMORIZE", "Memorize" } ,
- { PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker" } ,
- { PF_SOULBURN, "SOULBURN", "Soul_Burn" } ,
- { PF_SOULCHANGE, "SOULCHANGE", "Soul_Change" } ,
- { PF_SPIDERWEB, "SPIDERWEB", "Spider_Web" } ,
- { PR_ASPERSIO, "ASPERSIO", "Aspersio" } ,
- { PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti" } ,
- { PR_GLORIA, "GLORIA", "Gloria" } ,
- { PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus" } ,
- { PR_KYRIE, "KYRIE", "Kyrie_Eleison" } ,
- { PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna" } ,
- { PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina" } ,
- { PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery" } ,
- { PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat" } ,
- { PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus" } ,
- { PR_SANCTUARY, "SANCTUARY", "Santuary" } ,
- { PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison" } ,
- { PR_STRECOVERY, "STRECOVERY", "Status_Recovery" } ,
- { PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium" } ,
- { PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead" } ,
- { RG_BACKSTAP, "BACKSTAP", "Back_Stab" } ,
- { RG_CLEANER, "CLEANER", "Remover" } ,
- { RG_COMPULSION, "COMPULSION", "Compulsion_Discount" } ,
- { RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity" } ,
- { RG_GANGSTER, "GANGSTER", "Gangster's_Paradise" } ,
- { RG_GRAFFITI, "GRAFFITI", "Graffiti" } ,
- { RG_INTIMIDATE, "INTIMIDATE", "Intimidate" } ,
- { RG_PLAGIARISM, "PLAGIARISM", "Plagiarism" } ,
- { RG_RAID, "RAID", "Raid" } ,
- { RG_SNATCHER, "SNATCHER", "Snatcher" } ,
- { RG_STEALCOIN, "STEALCOIN", "Steal_Coin" } ,
- { RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor" } ,
- { RG_STRIPHELM, "STRIPHELM", "Strip_Helm" } ,
- { RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield" } ,
- { RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon" } ,
- { RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive" } ,
- { SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus" } ,
- { SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book" } ,
- { SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast" } ,
- { SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel" } ,
- { SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change" } ,
- { SA_COMA, "COMA", "Coma" } ,
- { SA_DEATH, "DEATH", "Death" } ,
- { SA_DELUGE, "DELUGE", "Deluge" } ,
- { SA_DISPELL, "DISPELL", "Dispel" } ,
- { SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology" } ,
- { SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher" } ,
- { SA_FORTUNE, "FORTUNE", "Fortune" } ,
- { SA_FREECAST, "FREECAST", "Cast_Freedom" } ,
- { SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon" } ,
- { SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery" } ,
- { SA_GRAVITY, "GRAVITY", "Gravity" } ,
- { SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death" } ,
- { SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector" } ,
- { SA_LEVELUP, "LEVELUP", "Level_Up" } ,
- { SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader" } ,
- { SA_MAGICROD, "MAGICROD", "Magic_Rod" } ,
- { SA_MONOCELL, "MONOCELL", "Monocell" } ,
- { SA_QUESTION, "QUESTION", "Question?" } ,
- { SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish" } ,
- { SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon" } ,
- { SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell" } ,
- { SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster" } ,
- { SA_TAMINGMONSTER, "TAMINGMONSTER", "Taming_Monster" } ,
- { SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale" } ,
- { SA_VOLCANO, "VOLCANO", "Volcano" } ,
- { SG_DEVIL, "DEVIL", "Devil" } ,
- { SG_FEEL, "FEEL", "Feel" } ,
- { SG_FRIEND, "FRIEND", "Friend" } ,
- { SG_FUSION, "FUSION", "Fusion" } ,
- { SG_HATE, "HATE", "Hate" } ,
- { SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge" } ,
- { SG_MOON_ANGER, "ANGER", "Moon Anger" } ,
- { SG_MOON_BLESS, "BLESS", "Moon Bless" } ,
- { SG_MOON_COMFORT, "COMFORT", "Moon Comfort" } ,
- { SG_MOON_WARM, "WARM", "Moon Warm" } ,
- { SG_STAR_ANGER, "ANGER", "Star Anger" } ,
- { SG_STAR_BLESS, "BLESS", "Star Bless" } ,
- { SG_STAR_COMFORT, "COMFORT", "Star Comfort" } ,
- { SG_STAR_WARM, "WARM", "Star Warm" } ,
- { SG_SUN_ANGER, "ANGER", "Sun Anger" } ,
- { SG_SUN_BLESS, "BLESS", "Sun Bless" } ,
- { SG_SUN_COMFORT, "COMFORT", "Sun Comfort" } ,
- { SG_SUN_WARM, "WARM", "Sun Warm" } ,
- { SL_ALCHEMIST, "ALCHEMIST", "Alchemist" } ,
- { SL_ASSASIN, "ASSASIN", "Assasin" } ,
- { SL_BARDDANCER, "BARDDANCER", "Bard Dancer" } ,
- { SL_BLACKSMITH, "BLACKSMITH", "Black Smith" } ,
- { SL_CRUSADER, "CRUSADER", "Crusader" } ,
- { SL_HUNTER, "HUNTER", "Hunter" } ,
- { SL_KAAHI, "KAAHI", "Kaahi" } ,
- { SL_KAINA, "KAINA", "Kaina" } ,
- { SL_KAITE, "KAITE", "Kaite" } ,
- { SL_KAIZEL, "KAIZEL", "Kaizel" } ,
- { SL_KAUPE, "KAUPE", "Kaupe" } ,
- { SL_KNIGHT, "KNIGHT", "Knight" } ,
- { SL_MONK, "MONK", "Monk" } ,
- { SL_PRIEST, "PRIEST", "Priest" } ,
- { SL_ROGUE, "ROGUE", "Rogue" } ,
- { SL_SAGE, "SAGE", "Sage" } ,
- { SL_SKA, "SKA", "SKA" } ,
- { SL_SKE, "SKE", "SKE" } ,
- { SL_SMA, "SMA", "SMA" } ,
- { SL_SOULLINKER, "SOULLINKER", "Soul Linker" } ,
- { SL_STAR, "STAR", "Star" } ,
- { SL_STIN, "STIN", "Stin" } ,
- { SL_STUN, "STUN", "Stun" } ,
- { SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice" } ,
- { SL_SWOO, "SWOO", "Swoo" } ,
- { SL_WIZARD, "WIZARD", "Wizard" } ,
- { SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk" } ,
- { SM_BASH, "BASH", "Bash" } ,
- { SM_ENDURE, "ENDURE", "Endure" } ,
- { SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point" } ,
- { SM_MAGNUM, "MAGNUM", "Magnum_Break" } ,
- { SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery" } ,
- { SM_PROVOKE, "PROVOKE", "Provoke" } ,
- { SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery" } ,
- { SM_SWORD, "SWORD", "Sword_Mastery" } ,
- { SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery" } ,
- { SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault" } ,
- { SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting" } ,
- { SN_SIGHT, "SIGHT", "True_Sight" } ,
- { SN_WINDWALK, "WINDWALK", "Wind_Walk" } ,
- { ST_CHASEWALK, "CHASEWALK", "Chase_Walk" } ,
- { ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword" } ,
- { ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack" } ,
- { TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding" } ,
- { TF_DETOXIFY, "DETOXIFY", "Detoxify" } ,
- { TF_DOUBLE, "DOUBLE", "Double_Attack" } ,
- { TF_HIDING, "HIDING", "Hiding" } ,
- { TF_MISS, "MISS", "Improve_Dodge" } ,
- { TF_PICKSTONE, "PICKSTONE", "Take_Stone" } ,
- { TF_POISON, "POISON", "Envenom" } ,
- { TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand" } ,
- { TF_STEAL, "STEAL", "Steal" } ,
- { TF_THROWSTONE, "THROWSTONE", "Throw_Stone" } ,
- { TK_COUNTER, "COUNTER", "Counter" } ,
- { TK_DODGE, "DODGE", "Dodge" } ,
- { TK_DOWNKICK, "DOWNKICK", "Down Kick" } ,
- { TK_HIGHJUMP, "HIGHJUMP", "High Jump" } ,
- { TK_HPTIME, "HPTIME", "HP Time" } ,
- { TK_JUMPKICK, "JUMPKICK", "Jump Kick" } ,
- { TK_POWER, "POWER", "Power" } ,
- { TK_READYCOUNTER, "READYCOUNTER", "Ready Counter" } ,
- { TK_READYDOWN, "READYDOWN", "Ready Down" } ,
- { TK_READYSTORM, "READYSTORM", "Ready Storm" } ,
- { TK_READYTURN, "READYTURN", "Ready Turn" } ,
- { TK_RUN, "RUN", "TK_RUN" } ,
- { TK_SEVENWIND, "SEVENWIND", "Seven Wind" } ,
- { TK_SPTIME, "SPTIME", "SP Time" } ,
- { TK_STORMKICK, "STORMKICK", "Storm Kick" } ,
- { TK_TURNKICK, "TURNKICK", "Turn Kick" } ,
- { WE_BABY, "BABY", "Adopt_Baby" } ,
- { WE_CALLBABY, "CALLBABY", "Call_Baby" } ,
- { WE_CALLPARENT, "CALLPARENT", "Call_Parent" } ,
- { WE_CALLPARTNER, "CALLPARTNER", "I Want to See You" } ,
- { WE_FEMALE, "FEMALE", "I Only Look Up to You" } ,
- { WE_MALE, "MALE", "I Will Protect You" } ,
- { WS_CARTBOOST, "CARTBOOST", "Cart_Boost" } ,
- { WS_CREATECOIN, "CREATECOIN", "Create_Coins" } ,
- { WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets" } ,
- { WS_MELTDOWN, "MELTDOWN", "Meltdown" } ,
- { WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower" } ,
- { WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike" } ,
- { WZ_ESTIMATION, "ESTIMATION", "Sense" } ,
- { WZ_FIREIVY, "FIREIVY", "Fire_Ivy" } ,
- { WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar" } ,
- { WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova" } ,
- { WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive" } ,
- { WZ_ICEWALL, "ICEWALL", "Ice_Wall" } ,
- { WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder" } ,
- { WZ_METEOR, "METEOR", "Meteor_Storm" } ,
- { WZ_QUAGMIRE, "QUAGMIRE", "Quagmire" } ,
- { WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher" } ,
- { WZ_STORMGUST, "STORMGUST", "Storm_Gust" } ,
- { WZ_VERMILION, "VERMILION", "Lord_of_Vermilion" } ,
- { WZ_WATERBALL, "WATERBALL", "Water_Ball" } ,
- { 0, 0, 0 }
-};
-
-static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
-static const int diry[8]={1,1,0,-1,-1,-1,0,1};
-
-static int rdamage;
-
-/* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_db skill_db[MAX_SKILL_DB];
-
-/* ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX */
-struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
-
-/* –î쬃XƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
-
-/* ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
-struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
-
-int skill_get_hit( int id ){ return skill_db[id].hit; }
-int skill_get_inf( int id ){ return skill_db[id].inf; }
-int skill_get_pl( int id ){ return skill_db[id].pl; }
-int skill_get_nk( int id ){ return skill_db[id].nk; }
-int skill_get_max( int id ){ return skill_db[id].max; }
-int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0:skill_db[id].range[lv-1]; }
-int skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; }
-int skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].sp[lv-1]; }
-int skill_get_zeny( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; }
-int skill_get_num( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].num[lv-1]; }
-int skill_get_cast( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; }
-int skill_get_delay( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; }
-int skill_get_time( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; }
-int skill_get_time2( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; }
-int skill_get_castdef( int id ){ return skill_db[id].cast_def_rate; }
-int skill_get_weapontype( int id ){ return skill_db[id].weapon; }
-int skill_get_inf2( int id ){ return skill_db[id].inf2; }
-int skill_get_maxcount( int id ){ return skill_db[id].maxcount; }
-int skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; }
-int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; }
-int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; }
-
-/* ƒvƒƒgƒ^ƒCƒv */
-struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
-int skill_check_condition( struct map_session_data *sd,int type);
-int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
-int skill_frostjoke_scream(struct block_list *bl,va_list ap);
-int skill_status_change_timer_sub(struct block_list *bl, va_list ap );
-int skill_attack_area(struct block_list *bl,va_list ap);
-int skill_abra_dataset(int skilllv);
-int skill_clear_element_field(struct block_list *bl);
-int skill_landprotector(struct block_list *bl, va_list ap );
-int skill_trap_splash(struct block_list *bl, va_list ap );
-int skill_count_target(struct block_list *bl, va_list ap );
-
-// [MouseJstr] - skill ok to cast? and when?
-int skillnotok(int skillid, struct map_session_data *sd) {
- if (sd == 0)
- return 0;
- if (pc_isGM(sd) >= 20)
- return 0; // gm's can do anything damn thing they want
- switch (skillid) {
- case AL_WARP:
- case AL_TELEPORT:
- case MC_VENDING:
- case MC_IDENTIFY:
- return 0; // always allowed
- default:
- return(map[sd->bl.m].flag.noskill);
- }
-}
-
-
-static int distance(int x0,int y0,int x1,int y1)
-{
- int dx,dy;
-
- dx=abs(x0-x1);
- dy=abs(y0-y1);
- return dx>dy ? dx : dy;
-}
-
-/* ƒXƒLƒ‹ƒ†ƒjƒbƒgID‚ð•Ô‚·i‚±‚ê‚àƒf?ƒ^ƒx?ƒX‚É“ü‚ꂽ‚¢‚Èj */
-int skill_get_unit_id(int id,int flag)
-{
-
- switch(id){
- case MG_SAFETYWALL: return 0x7e; /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- case MG_FIREWALL: return 0x7f; /* ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹ */
- case AL_WARP: return (flag==0)?0x81:0x80; /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- case PR_BENEDICTIO: return 0x82; /* ¹?~•Ÿ */
- case PR_SANCTUARY: return 0x83; /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- case PR_MAGNUS: return 0x84; /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- case AL_PNEUMA: return 0x85; /* ƒjƒ…?ƒ} */
- case MG_THUNDERSTORM: return 0x86; /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
- case WZ_HEAVENDRIVE: return 0x86; /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
- case WZ_SIGHTRASHER: return 0x86; /* ƒTƒCƒgƒ‰ƒbƒVƒƒ? */
- case WZ_METEOR: return 0x86; /* ƒƒeƒIƒXƒg?ƒ€ */
- case WZ_VERMILION: return 0x86; /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
- case WZ_FROSTNOVA: return 0x86; /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- case WZ_STORMGUST: return 0x86; /* ƒXƒg?ƒ€ƒKƒXƒg(‚Æ‚è‚ ‚¦‚¸LoV‚Æ“¯‚¶‚Å?—) */
- case CR_GRANDCROSS: return 0x86; /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- case WZ_FIREPILLAR: return (flag==0)?0x87:0x88; /* ƒtƒ@ƒCƒA?ƒsƒ‰? */
- case HT_TALKIEBOX: return 0x99; /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- case WZ_ICEWALL: return 0x8d; /* ƒAƒCƒXƒEƒH?ƒ‹ */
- case WZ_QUAGMIRE: return 0x8e; /* ƒNƒ@ƒOƒ}ƒCƒA */
- case HT_BLASTMINE: return 0x8f; /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case HT_SKIDTRAP: return 0x90; /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case HT_ANKLESNARE: return 0x91; /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case AS_VENOMDUST: return 0x92; /* ƒxƒmƒ€ƒ_ƒXƒg */
- case HT_LANDMINE: return 0x93; /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case HT_SHOCKWAVE: return 0x94; /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case HT_SANDMAN: return 0x95; /* ƒTƒ“ƒhƒ}ƒ“ */
- case HT_FLASHER: return 0x96; /* ƒtƒ‰ƒbƒVƒƒ? */
- case HT_FREEZINGTRAP: return 0x97; /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case HT_CLAYMORETRAP: return 0x98; /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case SA_VOLCANO: return 0x9a; /* ƒ{ƒ‹ƒP?ƒm */
- case SA_DELUGE: return 0x9b; /* ƒfƒŠƒ…?ƒW */
- case SA_VIOLENTGALE: return 0x9c; /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- case SA_LANDPROTECTOR: return 0x9d; /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
- case BD_LULLABY: return 0x9e; /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: return 0x9f; /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: return 0xa0; /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD:return 0xa1; /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: return 0xa2; /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: return 0xa3; /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: return 0xa4; /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: return 0xa5; /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BA_DISSONANCE: return 0xa6; /* •s‹¦˜a‰¹ */
- case BA_WHISTLE: return 0xa7; /* Œû“J */
- case BA_ASSASSINCROSS: return 0xa8; /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case BA_POEMBRAGI: return 0xa9; /* ƒuƒ‰ƒM‚ÌŽ */
- case BA_APPLEIDUN: return 0xaa; /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case DC_UGLYDANCE: return 0xab; /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case DC_HUMMING: return 0xac; /* ƒnƒ~ƒ“ƒO */
- case DC_DONTFORGETME: return 0xad; /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case DC_FORTUNEKISS: return 0xae; /* K‰^‚̃LƒX */
- case DC_SERVICEFORYOU: return 0xaf; /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case RG_GRAFFITI: return 0xb0; /* ƒOƒ‰ƒtƒBƒeƒB */
- case AM_DEMONSTRATION: return 0xb1; /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- case WE_CALLPARTNER: return 0xb2; /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
- case PA_GOSPEL: return 0xb3; /* ƒSƒXƒyƒ‹ */
- case HP_BASILICA: return 0xb4; /* ƒoƒWƒŠƒJ */
- case PF_FOGWALL: return 0xb6; /* ƒtƒHƒOƒEƒH?ƒ‹ */
- case PF_SPIDERWEB: return 0xb7; /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- }
- return 0;
- /*
- 0x89,0x8a,0x8b •\Ž¦–³‚µ
- 0x9a ‰Š?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
- 0x9b …?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
- 0x9c •—?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
- 0x9d ”’‚¢¬‚³‚ȃGƒtƒFƒNƒg
- 0xb1 Alchemist Demonstration
- 0xb2 = Pink Warp Portal
- 0xb3 = Gospel For Paladin
- 0xb4 = Basilica
- 0xb5 = Empty
- 0xb6 = Fog Wall for Professor
- 0xb7 = Spider Web for Professor
- 0xb8 = Empty
- 0xb9 =
- */
-}
-
-/*==========================================
- * ƒXƒLƒ‹’ljÁ?‰Ê
- *------------------------------------------
- */
-int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick)
-{
- /* MOB’ljÁ?‰ÊƒXƒLƒ‹—p */
- const int sc[]={
- SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN,
- SC_STONE, SC_CURSE, SC_SLEEP
- };
- const int sc2[]={
- MG_STONECURSE,MG_FROSTDIVER,NPC_STUNATTACK,
- NPC_SLEEPATTACK,TF_POISON,NPC_CURSEATTACK,
- NPC_SILENCEATTACK,0,NPC_BLINDATTACK
- };
-
- struct map_session_data *sd=NULL;
- struct map_session_data *dstsd=NULL;
- struct mob_data *md=NULL;
- struct mob_data *dstmd=NULL;
- struct pet_data *pd=NULL;
-
- int skill,skill2;
- int rate,luk;
-
- int sc_def_mdef,sc_def_vit,sc_def_int,sc_def_luk;
- int sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- if(skilllv <= 0) return 0;
-
- if(src->type==BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)src);
- }else if(src->type==BL_MOB){
- nullpo_retr(0, md=(struct mob_data *)src); //–¢Žg—pH
- }else if(src->type==BL_PET){
- nullpo_retr(0, pd=(struct pet_data *)src); // [Valaris]
- }
-
- //?Û‚Ì‘Ï«
- luk = battle_get_luk(bl);
- sc_def_mdef=100 - (3 + battle_get_mdef(bl) + luk/3);
- sc_def_vit=100 - (3 + battle_get_vit(bl) + luk/3);
- sc_def_int=100 - (3 + battle_get_int(bl) + luk/3);
- sc_def_luk=100 - (3 + luk);
- //Ž©•ª‚Ì‘Ï«
- luk = battle_get_luk(src);
- sc_def_mdef2=100 - (3 + battle_get_mdef(src) + luk/3);
- sc_def_vit2=100 - (3 + battle_get_vit(src) + luk/3);
- sc_def_int2=100 - (3 + battle_get_int(src) + luk/3);
- sc_def_luk2=100 - (3 + luk);
- if(bl->type==BL_PC)
- dstsd=(struct map_session_data *)bl;
- else if(bl->type==BL_MOB){
- dstmd=(struct mob_data *)bl; //–¢Žg—pH
- if(sc_def_mdef>50)
- sc_def_mdef=50;
- if(sc_def_vit>50)
- sc_def_vit=50;
- if(sc_def_int>50)
- sc_def_int=50;
- if(sc_def_luk>50)
- sc_def_luk=50;
- }
- if(sc_def_mdef<0)
- sc_def_mdef=0;
- if(sc_def_vit<0)
- sc_def_vit=0;
- if(sc_def_int<0)
- sc_def_int=0;
-
- switch(skillid){
- case 0: /* ’ÊíU? */
- /* Ž©“®‘é */
- if( sd && pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
- rand()%1000 <= sd->paramc[5]*10/3+1 ) {
- int lv=(sd->status.job_level+9)/10;
- skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
- }
- // ƒXƒiƒbƒ`ƒƒ?
- if(sd && sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0)
- if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
- if(pc_steal_item(sd,bl))
- clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
- else
- clif_skill_fail(sd,skillid,0,0);
- }
- break;
-
- case SM_BASH: /* ƒoƒbƒVƒ…i‹}ŠU?j */
- if( sd && (skill=pc_checkskill(sd,SM_FATALBLOW))>0 ){
- if( rand()%100 < 6*(skilllv-5)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(SM_FATALBLOW,skilllv),0);
- }
- break;
-
- case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- if(rand()%100< (2*skilllv+10)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_POISON,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- else{
- if(sd && skillid==TF_POISON)
- clif_skill_fail(sd,skillid,0,0);
- }
- break;
-
- case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
- if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- rate=skilllv*3+35;
- if(rand()%100 < rate*sc_def_mdef/100)
- skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo? */
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- rate=(skilllv*3+35)*sc_def_mdef/100-(battle_get_int(bl)+battle_get_luk(bl))/15;
- rate=rate<=5?5:rate;
- if(rand()%100 < rate)
- skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- else if(sd && skillid==MG_FROSTDIVER)
- clif_skill_fail(sd,skillid,0,0);
- break;
-
- case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
- {
- struct status_change *sc_data = battle_get_sc_data(bl);
- if(sc_data) {
- sc_data[SC_FREEZE].val3++;
- if(sc_data[SC_FREEZE].val3 >= 3)
- skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- }
- break;
-
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- if( rand()%100 < (5*skilllv+30)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- if(map[bl->m].flag.pvp && dstsd){
- dstsd->status.sp -= dstsd->status.sp*(5+15*skilllv)/100;
- pc_calcstatus(dstsd,0);
- }
- break;
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- if( rand()%100 < (5*skilllv+30)*sc_def_int/100 )
- skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case TF_SPRINKLESAND: /* »‚Ü‚« */
- if( rand()%100 < 20*sc_def_int/100 )
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case TF_THROWSTONE: /* ΓŠ‚° */
- if( rand()%100 < 7*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
- if( rand()%100 < 3*skilllv*sc_def_int/100 )
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- {
- int race = battle_get_race(bl);
- if( (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && rand()%100 < 100000*sc_def_int/100) //?§•t?‚¾‚ªŠ®‘S‘Ï«‚É‚Í–³?
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
-
- case CR_SHIELDCHARGE: /* ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW */
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- if( rand()%100 < (10+3*skilllv)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case BA_FROSTJOKE:
- if(rand()%100 < (15+5*skilllv)*sc_def_mdef/100)
- skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case DC_SCREAM:
- if( rand()%100 < (25+5*skilllv)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case BD_LULLABY: /* ŽqŽç‰S */
- if( rand()%100 < 15*sc_def_int/100 )
- skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- /* MOB‚̒ljÁ?‰Ê•t‚«ƒXƒLƒ‹ */
-
- case NPC_PETRIFYATTACK:
- if(rand()%100 < sc_def_mdef)
- skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_POISON:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- if(rand()%100 < sc_def_vit && src->type!=BL_PET)
- skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if(src->type==BL_PET)
- skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skilllv*1000,0);
- break;
- case NPC_CURSEATTACK:
- if(rand()%100 < sc_def_luk)
- skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_SLEEPATTACK:
- case NPC_BLINDATTACK:
- if(rand()%100 < sc_def_int)
- skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case NPC_MENTALBREAKER:
- if(dstsd) {
- int sp = dstsd->status.max_sp*(10+skilllv)/100;
- if(sp < 1) sp = 1;
- pc_heal(dstsd,0,-sp);
- }
- break;
-
-// -- moonsoul (adding status effect chance given to wizard aoe skills meteor and vermillion)
-//
- case WZ_METEOR:
- if(rand()%100 < sc_def_vit)
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case WZ_VERMILION:
- if(rand()%100 < sc_def_int)
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
-// -- moonsoul (stun ability of new champion skill tigerfist)
-//
- case CH_TIGERFIST:
- if( rand()%100 < (10 + skilllv*10)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case LK_SPIRALPIERCE:
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case ST_REJECTSWORD: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- if( rand()%100 < (skilllv*15) )
- skill_status_change_start(bl,SC_AUTOCOUNTER,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case PF_FOGWALL: /* ƒz?ƒŠ?ƒNƒƒX */
- if( rand()%100 < 3*skilllv*sc_def_int/100 )
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- {//?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- int race=battle_get_race(bl);
- if( !(battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_HEADCRUSH,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
- //?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
- skill_status_change_start(bl,SC_JOINTBEAT,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- {
- int sec=skill_get_time2(skillid,skilllv);
- if(map[src->m].flag.pvp) //PvP‚Å‚ÍS‘©ŽžŠÔ”¼Œ¸H
- sec = sec/2;
- battle_stopwalking(bl,1);
- skill_status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0);
- }
- break;
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 ) //?‘ÔˆÙí‚ÍÚׂª•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
- skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
- case MO_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
- //ˆ¢C—…‚ðŽg‚¤‚Æ5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É‚È‚é
- skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0 );
- break;
- }
-
- if(sd && skillid != MC_CARTREVOLUTION && attack_type&BF_WEAPON){ /* ƒJ?ƒh‚É‚æ‚é’ljÁ?‰Ê */
- int i;
- int sc_def_card=100;
-
- for(i=SC_STONE;i<=SC_BLIND;i++){
- //?Û‚É?‘ÔˆÙí
- if(i==SC_STONE || i==SC_FREEZE)
- sc_def_card=sc_def_mdef;
- else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE)
- sc_def_card=sc_def_vit;
- else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND)
- sc_def_card=sc_def_int;
- else if(i==SC_CURSE)
- sc_def_card=sc_def_luk;
-
- if(!sd->state.arrow_atk) {
- if(rand()%10000 < (sd->addeff[i-SC_STONE])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]);
- skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
- }
- }
- else {
- if(rand()%10000 < (sd->addeff[i-SC_STONE]+sd->arrow_addeff[i-SC_STONE])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]);
- skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
- }
- }
- //Ž©•ª‚É?‘ÔˆÙí
- if(i==SC_STONE || i==SC_FREEZE)
- sc_def_card=sc_def_mdef2;
- else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE)
- sc_def_card=sc_def_vit2;
- else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND)
- sc_def_card=sc_def_int2;
- else if(i==SC_CURSE)
- sc_def_card=sc_def_luk2;
-
- if(!sd->state.arrow_atk) {
- if(rand()%10000 < (sd->addeff2[i-SC_STONE])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]);
- skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
- }
- }
- else {
- if(rand()%10000 < (sd->addeff2[i-SC_STONE]+sd->arrow_addeff2[i-SC_STONE])*sc_def_card/100 ){
- if(battle_config.battle_log)
- printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]);
- skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
- }
- }
- }
- }
- return 0;
-}
-
-/*=========================================================================
- ƒXƒLƒ‹U?‚«”ò‚΂µ?—
--------------------------------------------------------------------------*/
-int skill_blown( struct block_list *src, struct block_list *target,int count)
-{
- int dx=0,dy=0,nx,ny;
- int x=target->x,y=target->y;
- int ret,prev_state=MS_IDLE;
- int moveblock;
- struct map_session_data *sd=NULL;
- struct mob_data *md=NULL;
- struct pet_data *pd=NULL;
- struct skill_unit *su=NULL;
-
- nullpo_retr(0, src);
- nullpo_retr(0, target);
-
- if(target->type==BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)target);
- }else if(target->type==BL_MOB){
- nullpo_retr(0, md=(struct mob_data *)target);
- }else if(target->type==BL_PET){
- nullpo_retr(0, pd=(struct pet_data *)target);
- }else if(target->type==BL_SKILL){
- nullpo_retr(0, su=(struct skill_unit *)target);
- }else return 0;
-
- if(!(count&0x10000 && (sd||md||pd||su))){ /* Žw’è‚È‚µ‚È‚çˆÊ’u?ŒW‚©‚ç•ûŒü‚ð‹‚ß‚é */
- dx=target->x-src->x; dx=(dx>0)?1:((dx<0)?-1: 0);
- dy=target->y-src->y; dy=(dy>0)?1:((dy<0)?-1: 0);
- }
- if(dx==0 && dy==0){
- int dir=battle_get_dir(target);
- if(dir>=0 && dir<8){
- dx=-dirx[dir];
- dy=-diry[dir];
- }
- }
-
- ret=path_blownpos(target->m,x,y,dx,dy,count&0xffff);
- nx=ret>>16;
- ny=ret&0xffff;
- moveblock=( x/BLOCK_SIZE != nx/BLOCK_SIZE || y/BLOCK_SIZE != ny/BLOCK_SIZE);
-
- if(count&0x20000) {
- battle_stopwalking(target,1);
- if(sd){
- sd->to_x=nx;
- sd->to_y=ny;
- sd->walktimer = 1;
- clif_walkok(sd);
- clif_movechar(sd);
- }
- else if(md) {
- md->to_x=nx;
- md->to_y=ny;
- prev_state = md->state.state;
- md->state.state = MS_WALK;
- clif_fixmobpos(md);
- }
- else if(pd) {
- pd->to_x=nx;
- pd->to_y=ny;
- prev_state = pd->state.state;
- pd->state.state = MS_WALK;
- clif_fixpetpos(pd);
- }
- }
- else
- battle_stopwalking(target,2);
-
- dx = nx - x;
- dy = ny - y;
-
- if(sd) /* ?–ÊŠO‚Éo‚½‚Ì‚ÅÁ‹Ž */
- map_foreachinmovearea(clif_pcoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
- else if(md)
- map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
- else if(pd)
- map_foreachinmovearea(clif_petoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
-
- if(su){
- skill_unit_move_unit_group(su->group,target->m,dx,dy);
- }else{
-// struct status_change *sc_data=battle_get_sc_data(target);
- if(moveblock) map_delblock(target);
- target->x=nx;
- target->y=ny;
- if(moveblock) map_addblock(target);
-/*ƒ_ƒ“ƒX’†‚ɃGƒtƒFƒNƒg‚͈ړ®‚µ‚È‚¢‚炵‚¢
- if(sc_data && sc_data[SC_DANCING].timer!=-1){ //?Û‚ªƒ_ƒ“ƒX’†‚Ȃ̂ŃGƒtƒFƒNƒg‚àˆÚ“®
- struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[SC_DANCING].val2;
- if(sg)
- skill_unit_move_unit_group(sg,target->m,dx,dy);
- }
-*/
- }
-
- if(sd) { /* ?–Ê?‚É“ü‚Á‚Ä‚«‚½‚Ì‚Å•\Ž¦ */
- map_foreachinmovearea(clif_pcinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,0,sd);
- if(count&0x20000)
- sd->walktimer = -1;
- }
- else if(md) {
- map_foreachinmovearea(clif_mobinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,md);
- if(count&0x20000)
- md->state.state = prev_state;
- }
- else if(pd) {
- map_foreachinmovearea(clif_petinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,pd);
- if(count&0x20000)
- pd->state.state = prev_state;
- }
-
- skill_unit_move(target,gettick(),(count&0xffff)+7); /* ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”»’è */
-
- return 0;
-}
-
-
-/*
- * =========================================================================
- * ƒXƒLƒ‹U??‰Ê?—‚Ü‚Æ‚ß
- * flag‚Ì?–¾B16i?
- * 00XRTTff
- * ff = magic‚ÅŒvŽZ‚É“n‚³‚ê‚éj
- * TT = ƒpƒPƒbƒg‚Ìtype•”•ª(0‚ŃfƒtƒHƒ‹ƒgj
- * X = ƒpƒPƒbƒg‚̃XƒLƒ‹Lv
- * R = —\–ñiskill_area_sub‚ÅŽg—p‚·‚éj
- *-------------------------------------------------------------------------
- */
-
-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 )
-{
-
- if(skilllv <= 0) return 0;
-
- struct Damage dmg;
- struct status_change *sc_data;
- int type,lv,damage;
-
- rdamage = 0;
- nullpo_retr(0, src);
- nullpo_retr(0, dsrc);
- nullpo_retr(0, bl);
-
- sc_data = battle_get_sc_data(bl);
-
-//‰½‚à‚µ‚È‚¢”»’肱‚±‚©‚ç
- if(dsrc->m != bl->m) //?Û‚ª“¯‚¶ƒ}ƒbƒv‚É‚¢‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
- return 0;
- if(src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prev‚æ‚­‚í‚©‚ç‚È‚¢¦
- return 0;
- if(src->type == BL_PC && pc_isdead((struct map_session_data *)src)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?Û‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
- return 0;
- if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *) bl))
- return 0; // [MouseJstr]
- if(sc_data && sc_data[SC_HIDING].timer != -1) { //ƒnƒCƒfƒBƒ“ƒO?‘Ô‚Å
- if(skill_get_pl(skillid) != 2) //ƒXƒLƒ‹‚Ì?«‚ª’n?«‚Å‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
- return 0;
- }
- if(sc_data && sc_data[SC_TRICKDEAD].timer != -1) //Ž€‚ñ‚¾‚Ó‚è’†‚͉½‚à‚µ‚È‚¢
- return 0;
- if(skillid == WZ_STORMGUST) { //Žg—pƒXƒLƒ‹‚ªƒXƒg?ƒ€ƒKƒXƒg‚Å
- if(sc_data && sc_data[SC_FREEZE].timer != -1) //“€Œ‹?‘ԂȂ牽‚à‚µ‚È‚¢
- return 0;
- }
- if(skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //Žg—pƒXƒLƒ‹‚ªƒtƒƒXƒgƒmƒ”ƒ@‚ÅAdsrc‚Æbl‚ª“¯‚¶êŠ‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(src->type == BL_PC && ((struct map_session_data *)src)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(dsrc->type == BL_PC && ((struct map_session_data *)dsrc)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
- return 0;
- if(src->type == BL_PC && bl && mob_gvmobcheck(((struct map_session_data *)src),bl)==0)
- return 0;
-
-//‰½‚à‚µ‚È‚¢”»’肱‚±‚Ü‚Å
-
- type=-1;
- lv=(flag>>20)&0xf;
- dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff ); //ƒ_ƒ?ƒWŒvŽZ
-
-//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚©‚ç
- if(attack_type&BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1 && src == dsrc) { //–‚–@U?‚Ń}ƒWƒbƒNƒƒbƒh?‘Ô‚Åsrc=dsrc‚È‚ç
- dmg.damage = dmg.damage2 = 0; //ƒ_ƒ?ƒW0
- if(bl->type == BL_PC) { //?Û‚ªPC‚Ìê‡
- int sp = skill_get_sp(skillid,skilllv); //Žg—p‚³‚ꂽƒXƒLƒ‹‚ÌSP‚ð‹z?
- sp = sp * sc_data[SC_MAGICROD].val2 / 100; //‹z?—¦ŒvŽZ
- if(skillid == WZ_WATERBALL && skilllv > 1) //ƒEƒH?ƒ^?ƒ{?ƒ‹Lv1ˆÈã
- sp = sp/((skilllv|1)*(skilllv|1)); //‚³‚ç‚ÉŒvŽZH
- if(sp > 0x7fff) sp = 0x7fff; //SP‘½‚·‚¬‚Ìꇂ͗˜_Å‘å’l
- else if(sp < 1) sp = 1; //1ˆÈ‰º‚ÌꇂÍ1
- if(((struct map_session_data *)bl)->status.sp + sp > ((struct map_session_data *)bl)->status.max_sp) { //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚è‘å‚«‚¢ê‡
- sp = ((struct map_session_data *)bl)->status.max_sp - ((struct map_session_data *)bl)->status.sp; //SP‚ðMSP-Œ»ÝSP‚É‚·‚é
- ((struct map_session_data *)bl)->status.sp = ((struct map_session_data *)bl)->status.max_sp; //Œ»Ý‚ÌSP‚ÉMSP‚ð‘ã“ü
- }
- else //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚謂³‚¢ê‡‚͉ñ•œSP‚ð‰ÁŽZ
- ((struct map_session_data *)bl)->status.sp += sp;
- clif_heal(((struct map_session_data *)bl)->fd,SP_SP,sp); //SP‰ñ•œƒGƒtƒFƒNƒg‚Ì•\Ž¦
- ((struct map_session_data *)bl)->canact_tick = tick + skill_delayfix(bl, skill_get_delay(SA_MAGICROD,sc_data[SC_MAGICROD].val1)); //
- }
- clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1); //ƒ}ƒWƒbƒNƒƒbƒhƒGƒtƒFƒNƒg‚ð•\Ž¦
- }
-//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚Ü‚Å
-
- if(src->type==BL_PET) { // [Valaris]
- dmg.damage=battle_attr_fix(skilllv, skill_get_pl(skillid), battle_get_element(bl) );
- dmg.damage2=0;
- }
-
- damage = dmg.damage + dmg.damage2;
-
- if(lv==15)
- lv=-1;
-
- if( flag&0xff00 )
- type=(flag&0xff00)>>8;
-
- if(damage <= 0 || damage < dmg.div_) //‚«”ò‚΂µ”»’èH¦
- dmg.blewcount = 0;
-
- if(skillid == CR_GRANDCROSS) {//ƒOƒ‰ƒ“ƒhƒNƒƒX
- if(battle_config.gx_disptype) dsrc = src; // “Gƒ_ƒ?ƒW”’•¶Žš•\Ž¦
- if( src == bl) type = 4; // ”½“®‚̓_ƒ?ƒWƒ‚?ƒVƒ‡ƒ“‚È‚µ
- }
-
-//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚©‚ç
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(0, sd);
-//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚©‚ç
- if(skillid == MO_CHAINCOMBO) {
- int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); //Šî–{ƒfƒBƒŒƒC‚ÌŒvŽZ
- if(damage < battle_get_hp(bl)) { //ƒ_ƒ?ƒW‚ª?Û‚ÌHP‚æ‚謂³‚¢ê‡
- if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //–Ò—´Œ(MO_COMBOFINISH)Žæ“¾•?‹…•ÛŽŽž‚Í+300ms
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- skill_status_change_start(src,SC_COMBO,MO_CHAINCOMBO,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚Ü‚Å
-//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚©‚ç
- else if(skillid == MO_COMBOFINISH) {
- int delay = 700 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if(damage < battle_get_hp(bl)) {
- //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
- //•šŒÕŒ(CH_TIGERFIST)Žæ“¾Žž‚à+300ms
- if((pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) ||
- (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) ||
- (pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1))
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- skill_status_change_start(src,SC_COMBO,MO_COMBOFINISH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚Ü‚Å
-//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚©‚ç
- else if(skillid == CH_TIGERFIST) {
- int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if(damage < battle_get_hp(bl)) {
- if(pc_checkskill(sd, CH_CHAINCRUSH) > 0) //˜A’Œ•ö?(CH_CHAINCRUSH)Žæ“¾Žž‚Í+300ms
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- skill_status_change_start(src,SC_COMBO,CH_TIGERFIST,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚Ü‚Å
-//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚©‚ç
- else if(skillid == CH_CHAINCRUSH) {
- int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
- if(damage < battle_get_hp(bl)) {
- //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
- if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
- delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
-
- skill_status_change_start(src,SC_COMBO,CH_CHAINCRUSH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
- }
- sd->attackabletime = sd->canmove_tick = tick + delay;
- clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
- }
-//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚Ü‚Å
- }
-//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚Ü‚Å
-//•ŠíƒXƒLƒ‹H‚±‚±‚©‚ç
- //AppleGirl Was Here
- if(attack_type&BF_MAGIC && damage > 0 && src != bl && src == dsrc) { //Blah Blah
- if(bl->type == BL_PC) { //Blah Blah
- struct map_session_data *tsd = (struct map_session_data *)bl;
- if(tsd->magic_damage_return > 0) { //More Blah
- rdamage += damage * tsd->magic_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- //Stop Here
- if(attack_type&BF_WEAPON && damage > 0 && src != bl && src == dsrc) { //•ŠíƒXƒLƒ‹•ƒ_ƒ?ƒW‚ ‚è•Žg—pŽÒ‚Æ?ÛŽÒ‚ªˆá‚¤•src=dsrc
- if(dmg.flag&BF_SHORT) { //‹ß‹——£U?ŽžH¦
- if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(tsd->short_weapon_damage_return > 0) { //‹ß‹——£U?’µ‚Ë•Ô‚µH¦
- rdamage += damage * tsd->short_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- if(sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) { //ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒhŽž
- rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //’µ‚Ë•Ô‚µŒvŽZ
- if(rdamage < 1) rdamage = 1;
- }
- }
- else if(dmg.flag&BF_LONG) { //‰“‹——£U?ŽžH¦
- if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(tsd->long_weapon_damage_return > 0) { //‰“‹——£U?’µ‚Ë•Ô‚µH¦
- rdamage += damage * tsd->long_weapon_damage_return / 100;
- if(rdamage < 1) rdamage = 1;
- }
- }
- }
- if(rdamage > 0)
- clif_damage(src,src,tick, dmg.amotion,0,rdamage,1,4,0);
- }
-//•ŠíƒXƒLƒ‹H‚±‚±‚Ü‚Å
-
- switch(skillid){
- case WZ_SIGHTRASHER:
- clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, 5);
- break;
- case AS_SPLASHER:
- clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
- break;
- case NPC_SELFDESTRUCTION:
- case NPC_SELFDESTRUCTION2:
- break;
- default:
- clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, (skillid==0)? 5:type );
- }
- if(dmg.blewcount > 0 && !map[src->m].flag.gvg) { /* ‚«”ò‚΂µ?—‚Æ‚»‚̃pƒPƒbƒg */
- if(skillid == WZ_SIGHTRASHER)
- skill_blown(src,bl,dmg.blewcount);
- else
- skill_blown(dsrc,bl,dmg.blewcount);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- }
-
- map_freeblock_lock();
- /* ?ۂɃ_ƒ?ƒW?—‚ðs‚¤ */
- if(skillid != KN_BOWLINGBASH || flag)
- battle_damage(src,bl,damage,0);
- if(skillid == RG_INTIMIDATE && damage > 0 && !(battle_get_mode(bl)&0x20) && !map[src->m].flag.gvg ) {
- int s_lv = battle_get_lv(src),t_lv = battle_get_lv(bl);
- int rate = 50 + skilllv * 5;
- rate = rate + (s_lv - t_lv);
- if(rand()%100 < rate)
- skill_addtimerskill(src,tick + 800,bl->id,0,0,skillid,skilllv,0,flag);
- }
- if(damage > 0 && dmg.flag&BF_SKILL && bl->type==BL_PC && pc_checkskill((struct map_session_data *)bl,RG_PLAGIARISM)){
- struct map_session_data *tsd = (struct map_session_data *)bl;
- nullpo_retr(0, tsd);
- if(!tsd->status.skill[skillid].id && !tsd->status.skill[skillid].id
- && !(skillid > NPC_PIERCINGATT && skillid < NPC_SUMMONMONSTER) ){
- //?‚É?‚ñ‚Å‚¢‚éƒXƒLƒ‹‚ª‚ ‚ê‚ΊY?ƒXƒLƒ‹‚ðÁ‚·
- if (tsd->cloneskill_id && tsd->cloneskill_lv && tsd->status.skill[tsd->cloneskill_id].flag==13){
- tsd->status.skill[tsd->cloneskill_id].id=0;
- tsd->status.skill[tsd->cloneskill_id].lv=0;
- tsd->status.skill[tsd->cloneskill_id].flag=0;
- }
- tsd->cloneskill_id=skillid;
- tsd->cloneskill_lv=skilllv;
- tsd->status.skill[skillid].id=skillid;
- tsd->status.skill[skillid].lv=(pc_checkskill(tsd,RG_PLAGIARISM) > skill_get_max(skillid))?
- skill_get_max(skillid):pc_checkskill(tsd,RG_PLAGIARISM);
- tsd->status.skill[skillid].flag=13;//cloneskill flag
- clif_skillinfoblock(tsd);
- }
- }
- /* ƒ_ƒ?ƒW‚ª‚ ‚é‚È‚ç’ljÁ?‰Ê”»’è */
- if(bl->prev != NULL){
- struct map_session_data *sd = (struct map_session_data *)bl;
- nullpo_retr(0, sd);
- if( bl->type != BL_PC || (sd && !pc_isdead(sd)) ) {
- if(damage > 0)
- skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick);
- if(bl->type==BL_MOB && src!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
- {
- struct mob_data *md=(struct mob_data *)bl;
- nullpo_retr(0, md);
- if(battle_config.mob_changetarget_byskill == 1)
- {
- int target;
- target=md->target_id;
- if(src->type == BL_PC)
- md->target_id=src->id;
- mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
- md->target_id=target;
- }
- else
- mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
- }
- }
- }
-
- if(src->type == BL_PC && dmg.flag&BF_WEAPON && src != bl && src == dsrc && damage > 0) {
- struct map_session_data *sd = (struct map_session_data *)src;
- int hp = 0,sp = 0;
- nullpo_retr(0, sd);
- if(sd->hp_drain_rate && sd->hp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->hp_drain_rate) {
- hp += (dmg.damage * sd->hp_drain_per)/100;
- if(sd->hp_drain_rate > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1;
- }
- if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) {
- hp += (dmg.damage2 * sd->hp_drain_per_)/100;
- if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1;
- else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1;
- }
- if(sd->sp_drain_rate > 0 && sd->sp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->sp_drain_rate) {
- sp += (dmg.damage * sd->sp_drain_per)/100;
- if(sd->sp_drain_rate > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1;
- }
- if(sd->sp_drain_rate_ > 0 && sd->sp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
- sp += (dmg.damage2 * sd->sp_drain_per_)/100;
- if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
- else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
- }
- if(hp || sp) pc_heal(sd,hp,sp);
- }
-
- if((skillid != KN_BOWLINGBASH || flag) && rdamage > 0)
- battle_damage(bl,src,rdamage,0);
-
- if(attack_type&BF_WEAPON && sc_data && sc_data[SC_AUTOCOUNTER].timer != -1 && sc_data[SC_AUTOCOUNTER].val4 > 0) {
- if(sc_data[SC_AUTOCOUNTER].val3 == dsrc->id)
- battle_weapon_attack(bl,dsrc,tick,0x8000|sc_data[SC_AUTOCOUNTER].val1);
- skill_status_change_end(bl,SC_AUTOCOUNTER,-1);
- }
-
- map_freeblock_unlock();
-
- return (dmg.damage+dmg.damage2); /* ?ƒ_ƒ‚ð•Ô‚· */
-}
-
-/*==========================================
- * ƒXƒLƒ‹”Í?U?—p(map_foreachinarea‚©‚çŒÄ‚΂ê‚é)
- * flag‚ɂ‚¢‚ÄF16i?‚ðŠm”F
- * MSB <- 00fTffff ->LSB
- * T =ƒ^?ƒQƒbƒg‘I?—p(BCT_*)
- * ffff=Ž©—R‚ÉŽg—p‰Â”\
- * 0 =—\–ñB0‚ɌŒè
- *------------------------------------------
- */
-static int skill_area_temp[8]; /* ˆêŽž??B•K—v‚È‚çŽg‚¤B */
-typedef int (*SkillFunc)(struct block_list *,struct block_list *,int,int,unsigned int,int);
-int skill_area_sub( struct block_list *bl,va_list ap )
-{
- struct block_list *src;
- int skill_id,skill_lv,flag;
- unsigned int tick;
- SkillFunc func;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB && bl->type!=BL_SKILL)
- return 0;
-
- src=va_arg(ap,struct block_list *); //‚±‚±‚Å‚Ísrc‚Ì’l‚ð?Æ‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅNULLƒ`ƒFƒbƒN‚Í‚µ‚È‚¢
- skill_id=va_arg(ap,int);
- skill_lv=va_arg(ap,int);
- tick=va_arg(ap,unsigned int);
- flag=va_arg(ap,int);
- func=va_arg(ap,SkillFunc);
-
- if(battle_check_target(src,bl,flag) > 0)
- func(src,bl,skill_id,skill_lv,tick,flag);
- return 0;
-}
-
-static int skill_check_unit_range_sub( struct block_list *bl,va_list ap )
-{
- struct skill_unit *unit;
- int *c,x,y,range,sx[4],sy[4];
- int t_range,tx[4],ty[4];
- int i,r_flag,skillid;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit = (struct skill_unit *)bl);
- nullpo_retr(0, c = va_arg(ap,int *));
-
- if(bl->prev == NULL || bl->type != BL_SKILL)
- return 0;
-
- if(!unit->alive)
- return 0;
-
- x = va_arg(ap,int);
- y = va_arg(ap,int);
- range = va_arg(ap,int);
- skillid = va_arg(ap,int);
-
- if(skillid == MG_SAFETYWALL || skillid == AL_PNEUMA) {
- if(unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85)
- return 0;
- }
- else if(skillid == AL_WARP) {
- if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92)
- return 0;
- }
- else if((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP) || skillid == HT_TALKIEBOX) {
- if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92)
- return 0;
- }
- else if(skillid == WZ_FIREPILLAR) {
- if(unit->group->unit_id != 0x87)
- return 0;
- }
- else return 0;
- t_range=(unit->range!=0)? unit->range:unit->group->range;
- tx[0] = tx[3] = unit->bl.x - t_range;
- tx[1] = tx[2] = unit->bl.x + t_range;
- ty[0] = ty[1] = unit->bl.y - t_range;
- ty[2] = ty[3] = unit->bl.y + t_range;
- sx[0] = sx[3] = x - range;
- sx[1] = sx[2] = x + range;
- sy[0] = sy[1] = y - range;
- sy[2] = sy[3] = y + range;
- for(i=r_flag=0;i<4;i++) {
- if(sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0] && sy[i] <= ty[2]) {
- r_flag = 1;
- break;
- }
- if(tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0] && ty[i] <= sy[2]) {
- r_flag = 1;
- break;
- }
- }
- if(r_flag) (*c)++;
-
- return 0;
-}
-
-int skill_check_unit_range(int m,int x,int y,int range,int skillid)
-{
- int c = 0;
-
- map_foreachinarea(skill_check_unit_range_sub,m,x-10,y-10,x+10,y+10,BL_SKILL,&c,x,y,range,skillid);
-
- return c;
-}
-
-static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap )
-{
- int *c;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, c = va_arg(ap,int *));
-
- if(bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB))
- return 0;
-
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 0;
-
- (*c)++;
-
- return 0;
-}
-
-int skill_check_unit_range2(int m,int x,int y,int range)
-{
- int c = 0;
-
- map_foreachinarea(skill_check_unit_range2_sub,m,x-range,y-range,x+range,y+range,0,&c);
-
- return c;
-}
-
-/*=========================================================================
- * ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚©‚ç
- */
-/* ?Û‚Ì?‚ðƒJƒEƒ“ƒg‚·‚éBiskill_area_temp[0]‚ð‰Šú‰»‚µ‚Ä‚¨‚­‚±‚Æj */
-int skill_area_sub_count(struct block_list *src,struct block_list *target,int skillid,int skilllv,unsigned int tick,int flag)
-{
- if(skilllv <= 0) return 0;
- if(skill_area_temp[0] < 0xffff)
- skill_area_temp[0]++;
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-static int skill_timerskill(int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data *sd = NULL;
- struct mob_data *md = NULL;
- struct pet_data *pd = NULL;
- struct block_list *src = map_id2bl(id),*target;
- struct skill_timerskill *skl = NULL;
- int range;
-
- nullpo_retr(0, src);
-
- if(src->prev == NULL)
- return 0;
-
- if(src->type == BL_PC) {
- nullpo_retr(0, sd = (struct map_session_data *)src);
- skl = &sd->skilltimerskill[data];
- }
- else if(src->type == BL_MOB) {
- nullpo_retr(0, md = (struct mob_data *)src);
- skl = &md->skilltimerskill[data];
- }
- else if(src->type == BL_PET) { // [Valaris]
- nullpo_retr(0, pd = (struct pet_data *)src);
- skl = &pd->skilltimerskill[data];
- }
-
- else
- return 0;
-
- nullpo_retr(0, skl);
-
- skl->timer = -1;
- if(skl->target_id) {
- struct block_list tbl;
- target = map_id2bl(skl->target_id);
- if(skl->skill_id == RG_INTIMIDATE) {
- if(target == NULL) {
- target = &tbl; //‰Šú‰»‚µ‚Ä‚È‚¢‚̂ɃAƒhƒŒƒX“Ë‚Á?‚ñ‚Å‚¢‚¢‚Ì‚©‚ÈH
- target->type = BL_NUL;
- target->m = src->m;
- target->prev = target->next = NULL;
- }
- }
- if(target == NULL)
- return 0;
- if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
- return 0;
- if(src->m != target->m)
- return 0;
- if(sd && pc_isdead(sd))
- return 0;
- if(target->type == BL_PC && pc_isdead((struct map_session_data *)target) && skl->skill_id != RG_INTIMIDATE)
- return 0;
-
- switch(skl->skill_id) {
- case TF_BACKSLIDING:
- clif_skill_nodamage(src,src,skl->skill_id,skl->skill_lv,1);
- break;
- case RG_INTIMIDATE:
- if(sd && !map[src->m].flag.noteleport) {
- int x,y,i,j,c;
- pc_randomwarp(sd,3);
- for(i=0;i<16;i++) {
- j = rand()%8;
- x = sd->bl.x + dirx[j];
- y = sd->bl.y + diry[j];
- if((c=map_getcell(sd->bl.m,x,y)) != 1 && c != 5)
- break;
- }
- if(i >= 16) {
- x = sd->bl.x;
- y = sd->bl.y;
- }
- if(target->prev != NULL) {
- if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
- pc_setpos((struct map_session_data *)target,map[sd->bl.m].name,x,y,3);
- else if(target->type == BL_MOB)
- mob_warp((struct mob_data *)target,-1,x,y,3);
- }
- }
- else if(md && !map[src->m].flag.monster_noteleport) {
- int x,y,i,j,c;
- mob_warp(md,-1,-1,-1,3);
- for(i=0;i<16;i++) {
- j = rand()%8;
- x = md->bl.x + dirx[j];
- y = md->bl.y + diry[j];
- if((c=map_getcell(md->bl.m,x,y)) != 1 && c != 5)
- break;
- }
- if(i >= 16) {
- x = md->bl.x;
- y = md->bl.y;
- }
- if(target->prev != NULL) {
- if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
- pc_setpos((struct map_session_data *)target,map[md->bl.m].name,x,y,3);
- else if(target->type == BL_MOB)
- mob_warp((struct mob_data *)target,-1,x,y,3);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
- case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
- range=15; //Ž‹ŠE‘S?
- map_foreachinarea(skill_frostjoke_scream,src->m,src->x-range,src->y-range,
- src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick);
- break;
-
- default:
- skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
- break;
- }
- }
- else {
- if(src->m != skl->map)
- return 0;
- switch(skl->skill_id) {
- case WZ_METEOR:
- if(skl->type >= 0) {
- skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,0);
- clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
- }
- else
- skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
- break;
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-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)
-{
- int i;
-
- nullpo_retr(1, src);
-
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(1, sd);
- for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
- if(sd->skilltimerskill[i].timer == -1) {
- sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- sd->skilltimerskill[i].src_id = src->id;
- sd->skilltimerskill[i].target_id = target;
- sd->skilltimerskill[i].skill_id = skill_id;
- sd->skilltimerskill[i].skill_lv = skill_lv;
- sd->skilltimerskill[i].map = src->m;
- sd->skilltimerskill[i].x = x;
- sd->skilltimerskill[i].y = y;
- sd->skilltimerskill[i].type = type;
- sd->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- else if(src->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)src;
- nullpo_retr(1, md);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(md->skilltimerskill[i].timer == -1) {
- md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- md->skilltimerskill[i].src_id = src->id;
- md->skilltimerskill[i].target_id = target;
- md->skilltimerskill[i].skill_id = skill_id;
- md->skilltimerskill[i].skill_lv = skill_lv;
- md->skilltimerskill[i].map = src->m;
- md->skilltimerskill[i].x = x;
- md->skilltimerskill[i].y = y;
- md->skilltimerskill[i].type = type;
- md->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- else if(src->type == BL_PET) { // [Valaris]
- struct pet_data *pd = (struct pet_data *)src;
- nullpo_retr(1, pd);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(pd->skilltimerskill[i].timer == -1) {
- pd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
- pd->skilltimerskill[i].src_id = src->id;
- pd->skilltimerskill[i].target_id = target;
- pd->skilltimerskill[i].skill_id = skill_id;
- pd->skilltimerskill[i].skill_lv = skill_lv;
- pd->skilltimerskill[i].map = src->m;
- pd->skilltimerskill[i].x = x;
- pd->skilltimerskill[i].y = y;
- pd->skilltimerskill[i].type = type;
- pd->skilltimerskill[i].flag = flag;
-
- return 0;
- }
- }
- return 1;
- }
- return 1;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_cleartimerskill(struct block_list *src)
-{
- int i;
-
- nullpo_retr(0, src);
-
- if(src->type == BL_PC) {
- struct map_session_data *sd = (struct map_session_data *)src;
- nullpo_retr(0, sd);
- for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
- if(sd->skilltimerskill[i].timer != -1) {
- delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
- sd->skilltimerskill[i].timer = -1;
- }
- }
- }
- else if(src->type == BL_MOB) {
- struct mob_data *md = (struct mob_data *)src;
- nullpo_retr(0, md);
- for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
- if(md->skilltimerskill[i].timer != -1) {
- delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
- md->skilltimerskill[i].timer = -1;
- }
- }
- }
-
- return 0;
-}
-
-/* ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚Ü‚Å
- * -------------------------------------------------------------------------
- */
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èU?Œnj
- * iƒXƒpƒQƒbƒeƒB‚ÉŒü‚¯‚Ä‚P?‘OiI(ƒ_ƒƒ|)j
- *------------------------------------------
- */
-int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
-{
- if(skilllv <= 0) return 0;
-
- struct map_session_data *sd=NULL;
- struct status_change *sc_data = battle_get_sc_data(src);
- int i;
-
- nullpo_retr(1, src);
- nullpo_retr(1, bl);
-
- if(src->type==BL_PC)
- sd=(struct map_session_data *)src;
- if(sd && pc_isdead(sd))
- return 1;
-
- if((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl)
- bl = src;
- if(bl->prev == NULL)
- return 1;
- if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
- return 1;
- map_freeblock_lock();
- switch(skillid)
- {
- /* •ŠíU?ŒnƒXƒLƒ‹ */
- case SM_BASH: /* ƒoƒbƒVƒ… */
- case MC_MAMMONITE: /* ƒƒ}?ƒiƒCƒg */
- case AC_DOUBLE: /* ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO */
- case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
- case KN_PIERCE: /* ƒsƒA?ƒX */
- case KN_SPEARBOOMERANG: /* ƒXƒsƒAƒu?ƒƒ‰ƒ“ */
- case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
- case TF_SPRINKLESAND: /* »‚Ü‚« */
- case AC_CHARGEARROW: /* ƒ`ƒƒ?ƒWƒAƒ? */
- case KN_SPEARSTAB: /* ƒXƒsƒAƒXƒ^ƒu */
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- case RG_INTIMIDATE: /* ƒCƒ“ƒeƒBƒ~ƒfƒCƒg */
- case BA_MUSICALSTRIKE: /* ƒ~ƒ…?ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN */
- case DC_THROWARROW: /* –î?‚¿ */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
- case CR_SHIELDCHARGE:
- case CR_SHIELDBOOMERANG:
-
- /* ˆÈ‰ºMOB?—p */
- /* ??U?ASPŒ¸­U?A‰“‹——£U?A–hŒä–³Ž‹U?A‘½’iU? */
- case NPC_PIERCINGATT:
- case NPC_MENTALBREAKER:
- case NPC_RANGEATTACK:
- case NPC_CRITICALSLASH:
- case NPC_COMBOATTACK:
- /* •K’†U?A“ÅU?AˆÃ?U?A’¾?U?AƒXƒ^ƒ“U? */
- case NPC_GUIDEDATTACK:
- case NPC_POISON:
- case NPC_BLINDATTACK:
- case NPC_SILENCEATTACK:
- case NPC_STUNATTACK:
- /* Ή»U?AŽô‚¢U?A‡–°U?Aƒ‰ƒ“ƒ_ƒ€ATKU? */
- case NPC_PETRIFYATTACK:
- case NPC_CURSEATTACK:
- case NPC_SLEEPATTACK:
- case NPC_RANDOMATTACK:
- /* …?«U?A’n?«U?A‰Î?«U?A•—?«U? */
- case NPC_WATERATTACK:
- case NPC_GROUNDATTACK:
- case NPC_FIREATTACK:
- case NPC_WINDATTACK:
- /* “Å?«U?A¹?«U?AˆÅ?«U?A”O?«U?ASPŒ¸­U? */
- case NPC_POISONATTACK:
- case NPC_HOLYATTACK:
- case NPC_DARKNESSATTACK:
- case NPC_TELEKINESISATTACK:
- case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA?ƒX */
- case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
- case PA_PRESSURE: /* ƒvƒŒƒbƒVƒƒ? */
- case PA_SACRIFICE: /* ƒTƒNƒŠƒtƒ@ƒCƒX */
- case SN_SHARPSHOOTING: /* ƒVƒƒ?ƒvƒVƒ…?ƒeƒBƒ“ƒO */
- case CG_ARROWVULCAN: /* ƒAƒ?ƒoƒ‹ƒJƒ“ */
- case ASC_BREAKER: /* ƒ\ƒEƒ‹ƒuƒŒ?ƒJ? */
- case HW_MAGICCRASHER: /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ? */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- break;
- case NPC_DARKBREATH:
- clif_emotion(src,7);
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
- break;
- case MO_INVESTIGATE: /* ?™¤ */
- {
- struct status_change *sc_data = battle_get_sc_data(src);
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
- case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
- break;
- case KN_BRANDISHSPEAR: /* ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA */
- {
- struct mob_data *md = (struct mob_data *)bl;
- nullpo_retr(1, md);
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(md->hp > 0){
- skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- }
- }
- break;
- case RG_BACKSTAP: /* ƒoƒbƒNƒXƒ^ƒu */
- {
- int dir = map_calc_dir(src,bl->x,bl->y),t_dir = battle_get_dir(bl);
- int dist = distance(src->x,src->y,bl->x,bl->y);
- if((dist > 0 && !map_check_dir(dir,t_dir)) || bl->type == BL_SKILL) {
- struct status_change *sc_data = battle_get_sc_data(src);
- if(sc_data && sc_data[SC_HIDING].timer != -1)
- skill_status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
- if (bl->type == BL_PC)
- ((struct map_session_data *)bl)->dir=dir;
- else if (bl->type == BL_MOB)
- ((struct mob_data *)bl)->dir=dir;
- //skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
- }
- else if(src->type == BL_PC)
- clif_skill_fail(sd,sd->skillid,0,0);
- }
- break;
-
- case AM_ACIDTERROR: /* ƒAƒVƒbƒhƒeƒ‰? */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(bl->type == BL_PC && rand()%100 < skill_get_time(skillid,skilllv) && battle_config.equipment_breaking)
- pc_breakarmor((struct map_session_data *)bl);
- break;
- case MO_FINGEROFFENSIVE: /* Žw? */
- {
- struct status_change *sc_data = battle_get_sc_data(src);
-
- if(!battle_config.finger_offensive_type)
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- else {
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(sd) {
- for(i=1;i<sd->spiritball_old;i++)
- skill_addtimerskill(src,tick+i*200,bl->id,0,0,skillid,skilllv,BF_WEAPON,flag);
- sd->canmove_tick = tick + (sd->spiritball_old-1)*200;
- }
- }
- if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
- case MO_CHAINCOMBO: /* ˜A‘Ŷ */
- {
- struct status_change *sc_data = battle_get_sc_data(src);
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
- case MO_COMBOFINISH: /* –Ò—´Œ */
- case CH_TIGERFIST: /* •šŒÕŒ */
- case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
- case CH_PALMSTRIKE: /* –ÒŒÕd”hŽR */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- break;
- case MO_EXTREMITYFIST: /* ˆ¢C—…”e–PŒ */
- {
- struct status_change *sc_data = battle_get_sc_data(src);
-
- if(sd) {
- struct walkpath_data wpd;
- int dx,dy;
-
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if(dx > 0) dx++;
- else if(dx < 0) dx--;
- if(dy > 0) dy++;
- else if(dy < 0) dy--;
- if(dx == 0 && dy == 0) dx++;
- if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
- dx = bl->x - sd->bl.x;
- dy = bl->y - sd->bl.y;
- if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- }
- sd->to_x = sd->bl.x + dx;
- sd->to_y = sd->bl.y + dy;
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- clif_walkok(sd);
- clif_movechar(sd);
- if(dx < 0) dx = -dx;
- if(dy < 0) dy = -dy;
- sd->attackabletime = sd->canmove_tick = tick + 100 + sd->speed * ((dx > dy)? dx:dy);
- if(sd->canact_tick < sd->canmove_tick)
- sd->canact_tick = sd->canmove_tick;
- pc_movepos(sd,sd->to_x,sd->to_y);
- skill_status_change_end(&sd->bl,SC_COMBO,-1);
- }
- else
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
- if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
- skill_status_change_end(src,SC_BLADESTOP,-1);
- }
- break;
- /* •ŠíŒn”Í?U?ƒXƒLƒ‹ */
- case AC_SHOWER: /* ƒAƒ?ƒVƒƒƒ? */
- case SM_MAGNUM: /* ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN */
- case AS_GRIMTOOTH: /* ƒOƒŠƒ€ƒgƒD?ƒX */
- case MC_CARTREVOLUTION: /* ƒJ?ƒgƒŒƒ”ƒHƒŠƒ…?ƒVƒ‡ƒ“ */
- case NPC_SPLASHATTACK: /* ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN */
- case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
- case AS_SPLASHER: /* [Valaris] */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1]){
- int dist=0;
- if(skillid==SM_MAGNUM){ /* ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚È‚ç’†S‚©‚ç‚Ì‹——£‚ðŒvŽZ */
- int dx=abs( bl->x - skill_area_temp[2] );
- int dy=abs( bl->y - skill_area_temp[3] );
- dist=((dx>dy)?dx:dy);
- }
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
- 0x0500|dist );
- }
- }else{
- int ar=1;
- int x=bl->x,y=bl->y;
- if( skillid==SM_MAGNUM){
- x=src->x;
- y=src->y;
- }else if(skillid==AC_SHOWER || skillid==ASC_METEORASSAULT) /* ƒAƒ?ƒVƒƒƒ?AƒƒeƒIƒAƒTƒ‹ƒg”Í?5*5 */
- ar=2;
- else if(skillid==AS_SPLASHER) /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ?”Í?3*3 */
- ar=1;
- else if(skillid==NPC_SPLASHATTACK) /* ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN‚Í”Í?7*7 */
- ar=3;
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,x-ar,y-ar,x+ar,y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- if (skillid == SM_MAGNUM) // fire element for 10 seconds
- skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
- }
- break;
-
- case KN_BOWLINGBASH: /* ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ… */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
- }
- else {
- int damage;
- map_freeblock_lock();
- damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
- if(damage > 0) {
- int i,c; /* ‘¼l‚©‚ç•·‚¢‚½“®‚«‚È‚Ì‚ÅŠÔˆá‚Á‚Ä‚é‰Â”\«‘å•?—¦‚ª?‚¢‚Á‚·„ƒ */
- c = skill_get_blewcount(skillid,skilllv);
- if(map[bl->m].flag.gvg) c = 0;
- for(i=0;i<c;i++){
- skill_blown(src,bl,1);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- skill_area_temp[0]=0;
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,
- skill_area_sub_count);
- if(skill_area_temp[0]>1) break;
- }
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- battle_damage(src,bl,damage,1);
- if(rdamage > 0)
- battle_damage(bl,src,rdamage,0);
- }
- map_freeblock_unlock();
- }
- break;
-
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- case PR_TURNUNDEAD: /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒh */
- if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- else {
- map_freeblock_unlock();
- return 1;
- }
- break;
-
- /* –‚–@ŒnƒXƒLƒ‹ */
- case MG_SOULSTRIKE: /* ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN */
- case MG_COLDBOLT: /* ƒR?ƒ‹ƒhƒ{ƒ‹ƒg */
- case MG_FIREBOLT: /* ƒtƒ@ƒCƒA?ƒ{ƒ‹ƒg */
- case MG_LIGHTNINGBOLT: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg */
- case WZ_EARTHSPIKE: /* ƒA?ƒXƒXƒpƒCƒN */
- case AL_HEAL: /* ƒq?ƒ‹ */
- case AL_HOLYLIGHT: /* ƒz?ƒŠ?ƒ‰ƒCƒg */
- case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo? */
- case WZ_JUPITEL: /* ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_? */
- case NPC_MAGICALATTACK: /* MOB:–‚–@‘Å?U? */
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- case WZ_WATERBALL: /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- if(skilllv>1)
- skill_status_change_start(src,SC_WATERBALL,skilllv,bl->id,0,0,0,0);
- break;
-
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(battle_get_race(bl)==1 || battle_get_race(bl)==6)
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- break;
-
- /* –‚–@Œn”Í?U?ƒXƒLƒ‹ */
- case MG_NAPALMBEAT: /* ƒiƒp?ƒ€ƒr?ƒg */
- case MG_FIREBALL: /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹ */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1]){
- if(skillid==MG_FIREBALL){ /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹‚È‚ç’†S‚©‚ç‚Ì‹——£‚ðŒvŽZ */
- int dx=abs( bl->x - skill_area_temp[2] );
- int dy=abs( bl->y - skill_area_temp[3] );
- skill_area_temp[0]=((dx>dy)?dx:dy);
- }
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]| 0x0500);
- }
- }else{
- int ar=(skillid==MG_NAPALMBEAT)?1:2;
- skill_area_temp[1]=bl->id;
- if(skillid==MG_NAPALMBEAT){ /* ƒiƒp?ƒ€‚Å‚Íæ‚É?‚¦‚é */
- skill_area_temp[0]=0;
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,
- skill_area_sub_count);
- }else{
- skill_area_temp[0]=0;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- }
- /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0] );
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case HW_NAPALMVULCAN: // Fixed By SteelViruZ
- if(flag&1){
- if(bl->id!=skill_area_temp[1]){
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0]);
- }
- }else{
- int ar=(skillid==HW_NAPALMVULCAN)?1:2;
- skill_area_temp[1]=bl->id;
- if(skillid==HW_NAPALMVULCAN){
- skill_area_temp[0]=0;
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,
- skill_area_sub_count);
- }else{
- skill_area_temp[0]=0;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- }
- skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
- skill_area_temp[0] );
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
- //skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY);
- break;
-
- case WZ_SIGHTRASHER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
- skill_status_change_end(src,SC_SIGHT,-1);
- break;
-
- /* ‚»‚Ì‘¼ */
- case HT_BLITZBEAT: /* ƒuƒŠƒbƒcƒr?ƒg */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
- }else{
- skill_area_temp[0]=0;
- skill_area_temp[1]=bl->id;
- if(flag&0xf00000)
- map_foreachinarea(skill_area_sub,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY ,skill_area_sub_count);
- /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
- /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- /* ƒXƒLƒ‹ƒ†ƒjƒbƒg”z’u */
- skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
- if(sd)
- sd->canmove_tick = tick + 1000;
- else if(src->type == BL_MOB)
- mob_changestate((struct mob_data *)src,MS_DELAY,1000);
- break;
-
- case TF_THROWSTONE: /* ΓŠ‚° */
- case NPC_SMOKING: /* ƒXƒ‚?ƒLƒ“ƒO */
- skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
- break;
-
- case NPC_SELFDESTRUCTION: /* Ž©”š */
- case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
- if(flag&1){
- /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
- if(src->type==BL_MOB){
- struct mob_data* mb = (struct mob_data*)src;
- nullpo_retr(1, mb);
- mb->hp=skill_area_temp[2];
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_MISC,src,src,bl,NPC_SELFDESTRUCTION,skilllv,tick,flag );
- mb->hp=1;
- }
- }else{
- struct mob_data *md;
- if((md=(struct mob_data *)src)){
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=battle_get_hp(src);
- clif_skill_nodamage(src,src,NPC_SELFDESTRUCTION,-1,1);
- map_foreachinarea(skill_area_sub,
- bl->m,bl->x-5,bl->y-5,bl->x+5,bl->y+5,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- battle_damage(src,src,md->hp,0);
- }
- }
- break;
-
- /* HP‹z?/HP‹z?–‚–@ */
- case NPC_BLOODDRAIN:
- case NPC_ENERGYDRAIN:
- {
- int heal;
- heal = skill_attack((skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
- if( heal > 0 ){
- struct block_list tbl;
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage(&tbl,src,AL_HEAL,heal,1);
- battle_heal(NULL,src,heal,0,0);
- }
- }
- break;
- case 0:
- if(sd) {
- if(flag&3){
- if(bl->id!=skill_area_temp[1])
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
- }
- else{
- int ar=sd->splash_range;
- skill_area_temp[1]=bl->id;
- map_foreachinarea(skill_area_sub,
- bl->m, bl->x - ar, bl->y - ar, bl->x + ar, bl->y + ar, 0,
- src, skillid, skilllv, tick, flag | BCT_ENEMY | 1,
- skill_castend_damage_id);
- }
- }
- break;
-
- default:
- map_freeblock_unlock();
- return 1;
- }
- if(sc_data) {
- if (sc_data[SC_MAGICPOWER].timer != -1 && skillid != HW_MAGICPOWER) //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- skill_status_change_end(src,SC_MAGICPOWER,-1);
- }
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èŽx‰‡Œnj
- *------------------------------------------
- */
-int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
-{
- if(skilllv <= 0) return 0;
-
- struct map_session_data *sd=NULL;
- struct map_session_data *dstsd=NULL;
- struct mob_data *md=NULL;
- struct mob_data *dstmd=NULL;
- int i,abra_skillid=0,abra_skilllv;
- int sc_def_vit,sc_def_mdef,strip_fix,strip_time,strip_per;
- int sc_dex,sc_luk;
- //ƒNƒ‰ƒXƒ`ƒFƒ“ƒW—pƒ{ƒXƒ‚ƒ“ƒXƒ^?ID
- int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
- ,1157,1159,1190,1272,1312,1373,1492};
- int poringclass[]={1002};
-
- nullpo_retr(1, src);
- nullpo_retr(1, bl);
-
- if(src->type==BL_PC)
- sd=(struct map_session_data *)src;
- else if(src->type==BL_MOB)
- md=(struct mob_data *)src;
-
- sc_dex=battle_get_mdef(bl);
- sc_luk=battle_get_luk(bl);
- sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
- //sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
- sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3);
- strip_fix = battle_get_dex(src) - battle_get_dex(bl);
-
- if(bl->type==BL_PC){
- nullpo_retr(1, dstsd=(struct map_session_data *)bl);
- }else if(bl->type==BL_MOB){
- nullpo_retr(1, dstmd=(struct mob_data *)bl);
- if(sc_def_vit>50)
- sc_def_vit=50;
- if(sc_def_mdef>50)
- sc_def_mdef=50;
- }
- if(sc_def_vit < 0)
- sc_def_vit=0;
- if(sc_def_mdef < 0)
- sc_def_mdef=0;
- if(strip_fix < 0)
- strip_fix=0;
-
- if(bl == NULL || bl->prev == NULL)
- return 1;
- if(sd && pc_isdead(sd))
- return 1;
- if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION)
- return 1;
- if(battle_get_class(bl) == 1288)
- return 1;
- if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr]
- return 0;
-
- map_freeblock_lock();
- switch(skillid)
- {
- case AL_HEAL: /* ƒq?ƒ‹ */
- {
- int heal=skill_calc_heal( src, skilllv );
- int heal_get_jobexp;
- int skill;
- struct pc_base_job s_class;
-
- if( dstsd && dstsd->special_state.no_magic_damage )
- heal=0; /* ?‹à峃J?ƒhiƒq?ƒ‹—Ê‚Oj */
- if (sd){
- s_class = pc_calc_base_job(sd->status.class);
- if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ƒƒfƒBƒeƒCƒeƒBƒI
- heal += heal*(skill*2/100);
- if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //Ž©•ª‚à?Û‚àPCA?Û‚ªŽ©•ª‚̃p?ƒgƒi?AŽ©•ª‚ªƒXƒpƒmƒrAŽ©•ª‚ªŠ‚È‚ç
- heal = heal*2; //ƒXƒpƒmƒr‚̉łª’U“߂Ƀq?ƒ‹‚·‚é‚Æ2”{‚É‚È‚é
- }
-
-
- clif_skill_nodamage(src,bl,skillid,heal,1);
- heal_get_jobexp = battle_heal(NULL,bl,heal,0,0);
-
- // JOB??’lŠl“¾
- if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl && battle_config.heal_exp > 0){
- heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100;
- if(heal_get_jobexp <= 0)
- heal_get_jobexp = 1;
- pc_gainexp((struct map_session_data *)src,0,heal_get_jobexp);
- }
- }
- break;
-
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if(bl->type==BL_PC){
- int per=0;
- struct map_session_data *tsd = (struct map_session_data*)bl;
- nullpo_retr(1, tsd);
- if( (map[bl->m].flag.pvp) && tsd->pvp_point<0 )
- break; /* PVP‚Å•œŠˆ•s‰Â”\?‘Ô */
-
- if(pc_isdead(tsd)){ /* Ž€–S”»’è */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- switch(skilllv){
- case 1: per=10; break;
- case 2: per=30; break;
- case 3: per=50; break;
- case 4: per=80; break;
- }
- tsd->status.hp=tsd->status.max_hp*per/100;
- if(tsd->status.hp<=0) tsd->status.hp=1;
- if(tsd->special_state.restart_full_recover ){ /* ƒIƒVƒŠƒXƒJ?ƒh */
- tsd->status.hp=tsd->status.max_hp;
- tsd->status.sp=tsd->status.max_sp;
- }
- pc_setstand(tsd);
- if(battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(tsd,battle_config.pc_invincible_time);
- clif_updatestatus(tsd,SP_HP);
- clif_resurrection(&tsd->bl,1);
- if(src != bl && sd && battle_config.resurrection_exp > 0) {
- int exp = 0,jexp = 0;
- int lv = tsd->status.base_level - sd->status.base_level, jlv = tsd->status.job_level - sd->status.job_level;
- if(lv > 0) {
- exp = (int)((double)tsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if(exp < 1) exp = 1;
- }
- if(jlv > 0) {
- jexp = (int)((double)tsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if(jexp < 1) jexp = 1;
- }
- if(exp > 0 || jexp > 0)
- pc_gainexp(sd,exp,jexp);
- }
- }
- }
- break;
-
- case AL_DECAGI: /* ‘¬“xŒ¸­ */
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if( rand()%100 < (50+skilllv*3+(battle_get_lv(src)+battle_get_int(src)/5)-sc_def_mdef) ) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- break;
-
- case AL_CRUCIS:
- if(flag&1) {
- int race = battle_get_race(bl),ele = battle_get_elem_type(bl);
- if(battle_check_target(src,bl,BCT_ENEMY) && (race == 6 || battle_check_undead(race,ele))) {
- int slv=battle_get_lv(src),tlv=battle_get_lv(bl),rate;
- rate = 25 + skilllv*2 + slv - tlv;
- if(rand()%100 < rate)
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0);
- }
- }
- else {
- int range = 15;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- map_foreachinarea(skill_area_sub,
- src->m,src->x-range,src->y-range,src->x+range,src->y+range,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_nodamage_id);
- }
- break;
-
- case PR_LEXDIVINA: /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
- {
- struct status_change *sc_data = battle_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(sc_data && sc_data[SC_DIVINA].timer != -1)
- skill_status_change_end(bl,SC_DIVINA,-1);
- else if( rand()%100 < sc_def_vit ) {
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- }
- break;
- case SA_ABRACADABRA:
- //require 1 yellow gemstone even with mistress card or Into the Abyss
- if (pc_search_inventory(sd, 715) <= 0 ) {
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- pc_delitem(sd, pc_search_inventory(sd, 715), 1, 0);
- //
- do{
- abra_skillid=skill_abra_dataset(skilllv);
- }while(abra_skillid == 0);
- abra_skilllv=skill_get_max(abra_skillid)>pc_checkskill(sd,SA_ABRACADABRA)?pc_checkskill(sd,SA_ABRACADABRA):skill_get_max(abra_skillid);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- sd->skillitem=abra_skillid;
- sd->skillitemlv=abra_skilllv;
- clif_item_skill(sd,abra_skillid,abra_skilllv,"ƒAƒuƒ‰ƒJƒ_ƒuƒ‰");
- break;
- case SA_COMA:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(dstsd){
- dstsd->status.hp=1;
- dstsd->status.sp=1;
- clif_updatestatus(dstsd,SP_HP);
- clif_updatestatus(dstsd,SP_SP);
- }
- if(dstmd) dstmd->hp=1;
- break;
- case SA_FULLRECOVERY:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(dstsd) pc_heal(dstsd,dstsd->status.max_hp,dstsd->status.max_sp);
- if(dstmd) dstmd->hp=battle_get_max_hp(&dstmd->bl);
- break;
- case SA_SUMMONMONSTER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd) mob_once_spawn(sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,"--ja--",-1,1,"");
- break;
- case SA_LEVELUP:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd,pc_nextbaseexp(sd)*10/100,0);
- break;
-
- case SA_INSTANTDEATH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd) pc_damage(NULL,sd,sd->status.max_hp);
- break;
-
- case SA_QUESTION:
- case SA_GRAVITY:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
- case SA_CLASSCHANGE:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,changeclass);
- break;
- case SA_MONOCELL:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,poringclass);
- break;
- case SA_DEATH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) pc_damage(NULL,dstsd,dstsd->status.max_hp);
- if (dstmd) mob_damage(NULL,dstmd,dstmd->hp,1);
- break;
- case SA_REVERSEORCISH:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstsd) pc_setoption(dstsd,dstsd->status.option|0x0800);
- break;
- case SA_FORTUNE:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd) pc_getzeny(sd,battle_get_lv(bl)*100);
- break;
- case SA_TAMINGMONSTER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstmd){
- for(i=0;i<MAX_PET_DB;i++){
- if(dstmd->class == pet_db[i].class){
- pet_catch_process1(sd,dstmd->class);
- break;
- }
- }
- }
- break;
- case AL_INCAGI: /* ‘¬“x?‰Á */
- case AL_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- case PR_SLOWPOISON:
- case PR_IMPOSITIO: /* ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- case PR_LEXAETERNA: /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
- case PR_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒEƒ€ */
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- case CR_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- //case CG_MARIONETTE: // moved - Celest
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }else{
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case CG_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- if(sd && dstsd){
- struct status_change *tsc_data = battle_get_sc_data(src);
- int sc = SkillStatusChangeTable[skillid];
- int sc2 = SC_MARIONETTE2;
-
- if((dstsd->bl.type!=BL_PC)
- || (sd->bl.id == dstsd->bl.id)
- || (!sd->status.party_id)
- || (sd->status.party_id != dstsd->status.party_id)) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- if(tsc_data){
- if(tsc_data[sc].timer == -1) {
- skill_status_change_start (src,sc,skilllv,0,bl->id,0,skill_get_time(skillid,skilllv),0);
- skill_status_change_start (bl,sc2,skilllv,0,src->id,0,skill_get_time(skillid,skilllv),0);
- }
- else {
- skill_status_change_end(src, sc, -1);
- skill_status_change_end(bl, sc2, -1);
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- }
- break;
-
- case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris]
- case SA_FROSTWEAPON:
- case SA_LIGHTNINGLOADER:
- case SA_SEISMICWEAPON:
- if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
- }
- if(bl->type==BL_PC) {
- struct map_session_data *sd2=(struct map_session_data *)bl;
- if(sd2->status.weapon==0 || sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
- sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
- sd2->sc_data[SC_ENCPOISON].timer!=-1) {
- clif_skill_fail(sd,skillid,0,0);
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
- }
- }
- if(rand()%100 > (75+skilllv*1) && (skilllv != 5)) {
- clif_skill_fail(sd,skillid,0,0);
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- if(bl->type==BL_PC && battle_config.equipment_breaking) {
- struct map_session_data *sd2=(struct map_session_data *)bl;
- if(sd!=sd2) clif_displaymessage(sd->fd,"You broke target's weapon");
- pc_breakweapon(sd2);
- }
- break;
- }
- else {
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(bl->type==BL_MOB)
- break;
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case PR_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case KN_AUTOCOUNTER: /* ƒI?ƒgƒJƒEƒ“ƒ^? */
- case KN_TWOHANDQUICKEN: /* ƒc?ƒnƒ“ƒhƒNƒCƒbƒPƒ“ */
- case CR_SPEARQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case CR_REFLECTSHIELD:
- case AS_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
- case MC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- case MG_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
- case SM_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- case MG_SIGHT: /* ƒTƒCƒg */
- case AL_RUWACH: /* ƒ‹ƒAƒt */
- case MO_EXPLOSIONSPIRITS: // ”š—ô”g“®
- case MO_STEELBODY: // ‹à„
- case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case LK_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
- case LK_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- case LK_BERSERK: /* ƒo?ƒT?ƒN */
- case HP_ASSUMPTIO: /* */
- case WS_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
- case SN_SIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case WS_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case ST_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- case HW_MAGICPOWER: /* –‚–@—Í?• */
- case PF_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- case ASC_EDP: // [Celest]
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
- if(bl->type==BL_PC) {
- struct map_session_data *sd2=(struct map_session_data *)bl;
- if(sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
- sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
- sd2->sc_data[SC_ENCPOISON].timer!=-1) {
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- clif_skill_fail(sd,skillid,0,0);
- break;
- }
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case LK_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- pc_setsit(sd);
- clif_sitting(sd);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case MC_CHANGECART:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
- case AC_CONCENTRATION: /* W’†—ÍŒüã */
- {
- int range = 1;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- map_foreachinarea( skill_status_change_timer_sub,
- src->m, src->x-range, src->y-range, src->x+range,src->y+range,0,
- src,SkillStatusChangeTable[skillid],tick);
- }
- break;
- case SM_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- {
- struct status_change *sc_data = battle_get_sc_data(bl);
-
- /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
- if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //•sŽ€‚É‚Í?‚©‚È‚¢
- {
- map_freeblock_unlock();
- return 1;
- }
-
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
-
- if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(bl,0);
- if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
- && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl,0);
-
- if(sc_data){
- if(sc_data[SC_FREEZE].timer!=-1)
- skill_status_change_end(bl,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- skill_status_change_end(bl,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- skill_status_change_end(bl,SC_SLEEP,-1);
- }
-
- if(bl->type==BL_MOB) {
- int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = battle_get_range(src) - (range + 1);
- mob_target((struct mob_data *)bl,src,range);
- }
- }
- break;
-
- case CR_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- if(sd && dstsd){
- //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
-
- int lv = sd->status.base_level-dstsd->status.base_level;
- lv = (lv<0)?-lv:lv;
- if((dstsd->bl.type!=BL_PC) // ‘ŠŽè‚ÍPC‚¶‚á‚È‚¢‚Æ‚¾‚ß
- ||(sd->bl.id == dstsd->bl.id) // ‘ŠŽè‚ªŽ©•ª‚Í‚¾‚ß
- ||(lv > 10) // ƒŒƒxƒ‹·}10‚Ü‚Å
- ||(!sd->status.party_id && !sd->status.guild_id) // PT‚É‚àƒMƒ‹ƒh‚É‚àŠ?–³‚µ‚Í‚¾‚ß
- ||((sd->status.party_id != dstsd->status.party_id) // “¯‚¶ƒp?ƒeƒB?‚©A
- &&(sd->status.guild_id != dstsd->status.guild_id)) // “¯‚¶ƒMƒ‹ƒh‚¶‚á‚È‚¢‚Æ‚¾‚ß
- ||(dstsd->status.class==14||dstsd->status.class==21
- ||dstsd->status.class==4015||dstsd->status.class==4022)){ // ƒNƒ‹ƒZ‚¾‚ß
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- for(i=0;i<skilllv;i++){
- if(!sd->dev.val1[i]){ // ‹ó‚«‚ª‚ ‚Á‚½‚ç“ü‚ê‚é
- sd->dev.val1[i] = bl->id;
- sd->dev.val2[i] = bl->id;
- break;
- }else if(i==skilllv-1){ // ‹ó‚«‚ª‚È‚©‚Á‚½
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- clif_devotion(sd,bl->id);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],src->id,1,0,0,1000*(15+15*skilllv),0 );
- }
- else clif_skill_fail(sd,skillid,0,0);
- break;
- case MO_CALLSPIRITS: // ?Œ÷
- if(sd) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv);
- }
- break;
- case CH_SOULCOLLECT: // ‹¶?Œ÷
- if(sd) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- for(i=0;i<5;i++)
- pc_addspiritball(sd,skill_get_time(skillid,skilllv),5);
- }
- break;
- case MO_BLADESTOP: // ”’nŽæ‚è
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case MO_ABSORBSPIRITS: // ?’D
- i=0;
- if(sd && dstsd) {
- if(sd == dstsd || map[sd->bl.m].flag.pvp || map[sd->bl.m].flag.gvg) {
- if(dstsd->spiritball > 0) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- i = dstsd->spiritball * 7;
- pc_delspiritball(dstsd,dstsd->spiritball,0);
- if(i > 0x7FFF)
- i = 0x7FFF;
- if(sd->status.sp + i > sd->status.max_sp)
- i = sd->status.max_sp - sd->status.sp;
- }
- }
- }else if(sd && dstmd){ //?Û‚ªƒ‚ƒ“ƒXƒ^?‚Ìê‡
- //20%‚ÌŠm—¦‚Å?Û‚ÌLv*2‚ÌSP‚ð‰ñ•œ‚·‚éB¬Œ÷‚µ‚½‚Æ‚«‚̓^?ƒQƒbƒg(ƒÐ?„D?)ƒÐ????!!
- if(rand()%100<20){
- i=2*mob_db[dstmd->class].lv;
- mob_target(dstmd,src,0);
- }
- }
- if(i){
- sd->status.sp += i;
- clif_heal(sd->fd,SP_SP,i);
- }
- else
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- break;
-
- case AC_MAKINGARROW: /* –îì¬ */
- if(sd) {
- clif_arrow_create_list(sd);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
-
- case AM_PHARMACY: /* ƒ|?ƒVƒ‡ƒ“ì¬ */
- if(sd) {
- clif_skill_produce_mix_list(sd,32);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case WS_CREATECOIN: /* ƒNƒŠƒGƒCƒgƒRƒCƒ“ */
- if(sd) {
- clif_skill_produce_mix_list(sd,64);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case WS_CREATENUGGET: /* ‰ò»‘¢ */
- if(sd) {
- clif_skill_produce_mix_list(sd,128);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }
- break;
- case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
- break;
- if( rand()%100 < (20+ 10*skilllv)*sc_def_vit/100 ) {
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
- break;
-
- case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- int x=bl->x,y=bl->y;
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- map_foreachinarea(skill_area_sub,
- bl->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- skill_status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
- break;
-
- case KN_BRANDISHSPEAR: /*ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA*/
- {
- int c,n=4,ar;
- int dir = map_calc_dir(src,bl->x,bl->y);
- struct square tc;
- int x=bl->x,y=bl->y;
- ar=skilllv/3;
- skill_brandishspear_first(&tc,dir,x,y);
- skill_brandishspear_dir(&tc,dir,4);
- /* ”Í?‡C */
- if(skilllv == 10){
- for(c=1;c<4;c++){
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
- skill_castend_damage_id);
- }
- }
- /* ”Í?‡B‡A */
- if(skilllv > 6){
- skill_brandishspear_dir(&tc,dir,-1);
- n--;
- }else{
- skill_brandishspear_dir(&tc,dir,-2);
- n-=2;
- }
-
- if(skilllv > 3){
- for(c=0;c<5;c++){
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
- skill_castend_damage_id);
- if(skilllv > 6 && n==3 && c==4){
- skill_brandishspear_dir(&tc,dir,-1);
- n--;c=-1;
- }
- }
- }
- /* ”Í?‡@ */
- for(c=0;c<10;c++){
- if(c==0||c==5) skill_brandishspear_dir(&tc,dir,-1);
- map_foreachinarea(skill_area_sub,
- bl->m,tc.val1[c%5],tc.val2[c%5],tc.val1[c%5],tc.val2[c%5],0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
- }
- break;
-
- /* ƒp?ƒeƒBƒXƒLƒ‹ */
- case AL_ANGELUS: /* ƒGƒ“ƒWƒFƒ‰ƒX */
- case PR_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- case PR_GLORIA: /* ƒOƒƒŠƒA */
- case SN_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
- /* ŒÂ•Ê‚Ì?— */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- else{
- /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
- party_foreachsamemap(skill_area_sub,
- sd,1,
- src,skillid,skilllv,tick, flag|BCT_PARTY|1,
- skill_castend_nodamage_id);
- }
- break;
- case BS_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- case BS_WEAPONPERFECT: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- case BS_OVERTHRUST: /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
- if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
- /* ŒÂ•Ê‚Ì?— */
- clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,(src == bl)? 1:0,0,0,skill_get_time(skillid,skilllv),0);
- }
- else{
- /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
- party_foreachsamemap(skill_area_sub,
- sd,1,
- src,skillid,skilllv,tick, flag|BCT_PARTY|1,
- skill_castend_nodamage_id);
- }
- break;
-
- /*i•t‰Á‚Ɖ𜂪•K—vj */
- case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
- case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- /* •t‰Á‚·‚é */
- skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- else
- /* ‰ðœ‚·‚é */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- /* •t‰Á‚·‚é */
- skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- else
- /* ‰ðœ‚·‚é */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- /* •t‰Á‚·‚é */
- skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- else
- /* ‰ðœ‚·‚é */
- skill_status_change_end(bl, sc, -1);
- }
-
- skill_check_cloaking(bl);
- }
- break;
-
- case ST_CHASEWALK: /* ƒnƒCƒfƒBƒ“ƒO */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
- clif_skill_nodamage(src,bl,skillid,-1,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- /* •t‰Á‚·‚é */
- skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- else
- /* ‰ðœ‚·‚é */
- skill_status_change_end(bl, sc, -1);
- }
- }
- break;
-
- /* ?’nƒXƒLƒ‹ */
- case BD_LULLABY: /* ŽqŽç‰S */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- case BA_WHISTLE: /* Œû“J */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
- break;
-
- case HP_BASILICA: /* ƒoƒWƒŠƒJ */
- case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
- skill_clear_unitgroup(src);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
- break;
-
- case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
- {
- struct status_change *sc_data = battle_get_sc_data(src);
- if(sc_data && sc_data[SC_DANCING].timer!=-1){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_stop_dancing(src,0);
- }
- }
- break;
-
- case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
- case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,0,flag);
- break;
-
- case TF_STEAL: // ƒXƒeƒB?ƒ‹
- if(sd) {
- if(pc_steal_item(sd,bl))
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- else
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- }
- break;
-
- case RG_STEALCOIN: // ƒXƒeƒB?ƒ‹ƒRƒCƒ“
- if(sd) {
- if(pc_steal_coin(sd,bl)) {
- int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = battle_get_range(src) - (range + 1);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- mob_target((struct mob_data *)bl,src,range);
- }
- else
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- }
- break;
-
- case MG_STONECURSE: /* ƒXƒg?ƒ“ƒJ?ƒX */
- if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) {
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
- skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- else if(sd)
- clif_skill_fail(sd,skillid,0,0);
- break;
-
- case NV_FIRSTAID: /* ?‹}Žè? */
- clif_skill_nodamage(src,bl,skillid,5,1);
- battle_heal(NULL,bl,5,0,0);
- break;
-
- case AL_CURE: /* ƒLƒ…ƒA? */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_end(bl, SC_SILENCE , -1 );
- skill_status_change_end(bl, SC_BLIND , -1 );
- skill_status_change_end(bl, SC_CONFUSION, -1 );
- if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
- skill_status_change_start(bl, SC_CONFUSION,1,0,0,0,6000,0);
- }
- break;
-
- case TF_DETOXIFY: /* ‰ð“Å */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_end(bl, SC_POISON , -1 );
- break;
-
- case PR_STRECOVERY: /* ƒŠƒJƒoƒŠ? */
- {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_end(bl, SC_FREEZE , -1 );
- skill_status_change_end(bl, SC_STONE , -1 );
- skill_status_change_end(bl, SC_SLEEP , -1 );
- skill_status_change_end(bl, SC_STAN , -1 );
- if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
- int blind_time;
- //blind_time=30-battle_get_vit(bl)/10-battle_get_int/15;
- blind_time=30*(100-(battle_get_int(bl)+battle_get_vit(bl))/2)/100;
- if(rand()%100 < (100-(battle_get_int(bl)/2+battle_get_vit(bl)/3+battle_get_luk(bl)/10)))
- skill_status_change_start(bl, SC_BLIND,1,0,0,0,blind_time,0);
- }
- if(dstmd){
- dstmd->attacked_id=0;
- dstmd->target_id=0;
- dstmd->state.targettype = NONE_ATTACKABLE;
- dstmd->state.skillstate=MSS_IDLE;
- dstmd->next_walktime=tick+rand()%3000+3000;
- }
- }
- break;
-
- case WZ_ESTIMATION: /* ƒ‚ƒ“ƒXƒ^?î•ñ */
- if(src->type==BL_PC){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- clif_skill_estimation((struct map_session_data *)src,bl);
- }
- break;
-
- case MC_IDENTIFY: /* ƒAƒCƒeƒ€ŠÓ’è */
- if(sd)
- clif_item_identify_list(sd);
- break;
-
- case BS_REPAIRWEAPON: /* •ŠíC— */
- if(sd)
-//“®ì‚µ‚È‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ƒRƒƒ“ƒgƒAƒEƒg
-// clif_item_repair_list(sd);
- break;
-
- case MC_VENDING: /* ˜I“XŠJÝ */
- if(sd)
- clif_openvendingreq(sd,2+sd->skilllv);
- break;
-
- case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
- if( sd ){
- if(map[sd->bl.m].flag.noteleport){ /* ƒeƒŒƒ|‹ÖŽ~ */
- clif_skill_teleportmessage(sd,0);
- break;
- }
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( sd->skilllv==1 )
- clif_skill_warppoint(sd,sd->skillid,"Random","","","");
- else{
- clif_skill_warppoint(sd,sd->skillid,"Random",
- sd->status.save_point.map,"","");
- }
- }else if( bl->type==BL_MOB )
- mob_warp((struct mob_data *)bl,-1,-1,-1,3);
- break;
-
- case AL_HOLYWATER: /* ƒAƒNƒAƒxƒlƒfƒBƒNƒ^ */
- if(sd) {
- int eflag;
- struct item item_tmp;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = 523;
- item_tmp.identify = 1;
- if(battle_config.holywater_name_input) {
- item_tmp.card[0] = 0xfe;
- item_tmp.card[1] = 0;
- *((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- eflag = pc_additem(sd,&item_tmp,1);
- if(eflag) {
- clif_additem(sd,0,0,eflag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- break;
- case TF_PICKSTONE:
- if(sd) {
- int eflag;
- struct item item_tmp;
- struct block_list tbl;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- memset(&item_tmp,0,sizeof(item_tmp));
- memset(&tbl,0,sizeof(tbl)); // [MouseJstr]
- item_tmp.nameid = 7049;
- item_tmp.identify = 1;
- tbl.id = 0;
- clif_takeitem(&sd->bl,&tbl);
- eflag = pc_additem(sd,&item_tmp,1);
- if(eflag) {
- clif_additem(sd,0,0,eflag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- break;
-
- case RG_STRIPWEAPON: /* ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“ */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
-
- if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 )
- break;
- strip_per = 5+2*skilllv+strip_fix/5;
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
- if(rand()%100 < strip_per){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
- if(dstsd){
- for(i=0;i<MAX_INVENTORY;i++){
- if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){
- pc_unequipitem(dstsd,i,0);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPSHIELD: /* ƒXƒgƒŠƒbƒvƒV?ƒ‹ƒh */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
-
- if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 )
- break;
- strip_per = 5+2*skilllv+strip_fix/5;
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
- if(rand()%100 < strip_per){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
- if(dstsd){
- for(i=0;i<MAX_INVENTORY;i++){
- if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){
- pc_unequipitem(dstsd,i,0);
- break;
- }
- }
- }
- }
- }
- break;
-
- case RG_STRIPARMOR: /* ƒXƒgƒŠƒbƒvƒA?ƒ}? */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
-
- if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 )
- break;
- strip_per = 5+2*skilllv+strip_fix/5;
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
- if(rand()%100 < strip_per){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
- if(dstsd){
- for(i=0;i<MAX_INVENTORY;i++){
- if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){
- pc_unequipitem(dstsd,i,0);
- break;
- }
- }
- }
- }
- }
- break;
- case RG_STRIPHELM: /* ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€ */
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
-
- if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 )
- break;
- strip_per = 5+2*skilllv+strip_fix/5;
- strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
- if(rand()%100 < strip_per){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
- if(dstsd){
- for(i=0;i<MAX_INVENTORY;i++){
- if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){
- pc_unequipitem(dstsd,i,0);
- break;
- }
- }
- }
- }
- }
- break;
- /* PotionPitcher */
- case AM_POTIONPITCHER: /* ƒ|?ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ? */
- {
- struct block_list tbl;
- int i,x,hp = 0,sp = 0;
- if(sd) {
- if(sd==dstsd) { // cancel use on oneself
- map_freeblock_unlock();
- return 1;
- }
- x = skilllv%11 - 1;
- i = pc_search_inventory(sd,skill_db[skillid].itemid[x]);
- if(i < 0 || skill_db[skillid].itemid[x] <= 0) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x]) {
- clif_skill_fail(sd,skillid,0,0);
- map_freeblock_unlock();
- return 1;
- }
- sd->state.potionpitcher_flag = 1;
- sd->potion_hp = sd->potion_sp = sd->potion_per_hp = sd->potion_per_sp = 0;
- sd->skilltarget = bl->id;
- run_script(sd->inventory_data[i]->use_script,0,sd->bl.id,0);
- pc_delitem(sd,i,skill_db[skillid].amount[x],0);
- sd->state.potionpitcher_flag = 0;
- if(sd->potion_per_hp > 0 || sd->potion_per_sp > 0) {
- hp = battle_get_max_hp(bl) * sd->potion_per_hp / 100;
- hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- if(dstsd) {
- sp = dstsd->status.max_sp * sd->potion_per_sp / 100;
- sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- }
- }
- else {
- if(sd->potion_hp > 0) {
- hp = sd->potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100;
- if(dstsd)
- hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
- }
- if(sd->potion_sp > 0) {
- sp = sd->potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
- sp = sp * (100 + (battle_get_int(bl)<<1)) / 100;
- if(dstsd)
- sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10) / 100;
- }
- }
- }
- else {
- hp = (1 + rand()%400) * (100 + skilllv*10) / 100;
- hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100;
- if(dstsd)
- hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
- }
- tbl.id = 0;
- tbl.m = src->m;
- tbl.x = src->x;
- tbl.y = src->y;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(hp > 0 || (hp <= 0 && sp <= 0))
- clif_skill_nodamage(&tbl,bl,AL_HEAL,hp,1);
- if(sp > 0)
- clif_skill_nodamage(&tbl,bl,MG_SRECOVERY,sp,1);
- battle_heal(src,bl,hp,sp,0);
- }
- break;
- case AM_CP_WEAPON:
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1)
- skill_status_change_end(bl, SC_STRIPWEAPON, -1 );
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
- case AM_CP_SHIELD:
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1)
- skill_status_change_end(bl, SC_STRIPSHIELD, -1 );
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
- case AM_CP_ARMOR:
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(tsc_data && tsc_data[SC_STRIPARMOR].timer != -1)
- skill_status_change_end(bl, SC_STRIPARMOR, -1 );
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
- case AM_CP_HELM:
- {
- struct status_change *tsc_data = battle_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(tsc_data && tsc_data[SC_STRIPHELM].timer != -1)
- skill_status_change_end(bl, SC_STRIPHELM, -1 );
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- }
- break;
- case SA_DISPELL: /* ƒfƒBƒXƒyƒ‹ */
- {
- int i;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- for(i=0;i<136;i++){
- if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50
- || i==SC_WEIGHT90 || i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR
- || i==SC_STRIPHELM || i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR
- || i==SC_CP_HELM || i==SC_COMBO)
- continue;
- skill_status_change_end(bl,i,-1);
- }
- }
- break;
-
- case TF_BACKSLIDING: /* ƒoƒbƒNƒXƒeƒbƒv */
- battle_stopwalking(src,1);
- skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)|0x10000);
- if(src->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)src);
- else if(src->type == BL_PET)
- clif_fixpetpos((struct pet_data *)src);
- else if(src->type == BL_PC)
- clif_fixpos(src);
- skill_addtimerskill(src,tick + 200,src->id,0,0,skillid,skilllv,0,flag);
- break;
-
- case SA_CASTCANCEL:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castcancel(src,1);
- if(sd) {
- int sp = skill_get_sp(sd->skillid_old,sd->skilllv_old);
- sp = sp * (90 - (skilllv-1)*20) / 100;
- if(sp < 0) sp = 0;
- pc_heal(sd,0,-sp);
- }
- break;
- case SA_SPELLBREAKER: // ƒXƒyƒ‹ƒuƒŒƒCƒJ?
- {
- struct status_change *sc_data = battle_get_sc_data(bl);
- int sp;
- if(sc_data && sc_data[SC_MAGICROD].timer != -1) {
- if(dstsd) {
- sp = skill_get_sp(skillid,skilllv);
- sp = sp * sc_data[SC_MAGICROD].val2 / 100;
- if(sp > 0x7fff) sp = 0x7fff;
- else if(sp < 1) sp = 1;
- if(dstsd->status.sp + sp > dstsd->status.max_sp) {
- sp = dstsd->status.max_sp - dstsd->status.sp;
- dstsd->status.sp = dstsd->status.max_sp;
- }
- else
- dstsd->status.sp += sp;
- clif_heal(dstsd->fd,SP_SP,sp);
- }
- clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1);
- if(sd) {
- sp = sd->status.max_sp/5;
- if(sp < 1) sp = 1;
- pc_heal(sd,0,-sp);
- }
- }
- else {
- int bl_skillid=0,bl_skilllv=0;
- if(bl->type == BL_PC) {
- if(dstsd && dstsd->skilltimer != -1) {
- bl_skillid = dstsd->skillid;
- bl_skilllv = dstsd->skilllv;
- }
- }
- else if(bl->type == BL_MOB) {
- if(dstmd && dstmd->skilltimer != -1) {
- bl_skillid = dstmd->skillid;
- bl_skilllv = dstmd->skilllv;
- }
- }
- if(bl_skillid > 0 && skill_db[bl_skillid].skill_type == BF_MAGIC) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_castcancel(bl,0);
- sp = skill_get_sp(bl_skillid,bl_skilllv);
- if(dstsd)
- pc_heal(dstsd,0,-sp);
- if(sd) {
- sp = sp*(25*(skilllv-1))/100;
- if(skilllv > 1 && sp < 1) sp = 1;
- if(sp > 0x7fff) sp = 0x7fff;
- else if(sp < 1) sp = 1;
- if(sd->status.sp + sp > sd->status.max_sp) {
- sp = sd->status.max_sp - sd->status.sp;
- sd->status.sp = sd->status.max_sp;
- }
- else
- sd->status.sp += sp;
- clif_heal(sd->fd,SP_SP,sp);
- }
- }
- else if(sd)
- clif_skill_fail(sd,skillid,0,0);
- }
- }
- break;
- case SA_MAGICROD:
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
- case SA_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd)
- clif_autospell(sd,skilllv);
- else {
- int maxlv=1,spellid=0;
- static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
- if(skilllv >= 10) {
- spellid = MG_FROSTDIVER;
- maxlv = skilllv - 9;
- }
- else if(skilllv >=8) {
- spellid = MG_FIREBALL;
- maxlv = skilllv - 7;
- }
- else if(skilllv >=5) {
- spellid = MG_SOULSTRIKE;
- maxlv = skilllv - 4;
- }
- else if(skilllv >=2) {
- int i = rand()%3;
- spellid = spellarray[i];
- maxlv = skilllv - 1;
- }
- else if(skilllv > 0) {
- spellid = MG_NAPALMBEAT;
- maxlv = 3;
- }
- if(spellid > 0)
- skill_status_change_start(src,SC_AUTOSPELL,skilllv,spellid,maxlv,0,
- skill_get_time(SA_AUTOSPELL,skilllv),0);
- }
- break;
-
- /* ƒ‰ƒ“ƒ_ƒ€?«?‰»A…?«?‰»A’nA‰ÎA•— */
- case NPC_ATTRICHANGE:
- case NPC_CHANGEWATER:
- case NPC_CHANGEGROUND:
- case NPC_CHANGEFIRE:
- case NPC_CHANGEWIND:
- /* “ÅA¹A”OAˆÅ */
- case NPC_CHANGEPOISON:
- case NPC_CHANGEHOLY:
- case NPC_CHANGEDARKNESS:
- case NPC_CHANGETELEKINESIS:
- if(md){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- md->def_ele=skill_get_pl(skillid);
- if(md->def_ele==0) /* ƒ‰ƒ“ƒ_ƒ€?‰»A‚½‚¾‚µA*/
- md->def_ele=rand()%10; /* •sŽ€?«‚Íœ‚­ */
- md->def_ele+=(1+rand()%4)*20; /* ?«ƒŒƒxƒ‹‚̓‰ƒ“ƒ_ƒ€ */
- }
- break;
-
- case NPC_PROVOCATION:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(md)
- clif_pet_performance(src,mob_db[md->class].skill[md->skillidx].val[0]);
- break;
-
- case NPC_HALLUCINATION:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
- break;
-
- case NPC_KEEPING:
- case NPC_BARRIER:
- {
- int skill_time = skill_get_time(skillid,skilllv);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 );
- if (bl->type == BL_MOB)
- mob_changestate((struct mob_data *)src,MS_DELAY,skill_time);
- else if (bl->type == BL_PC)
- sd->attackabletime = sd->canmove_tick = tick + skill_time;
- }
- break;
-
- case NPC_DARKBLESSING:
- {
- int sc_def = 100 - battle_get_mdef(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(battle_get_elem_type(bl) == 7 || battle_get_race(bl) == 6)
- break;
- if(rand()%100 < sc_def*(50+skilllv*5)/100) {
- if(dstsd) {
- int hp = battle_get_hp(bl)-1;
- pc_heal(dstsd,-hp,0);
- }
- else if(dstmd)
- dstmd->hp = 1;
- }
- }
- break;
-
- case NPC_SELFDESTRUCTION: /* Ž©”š */
- case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,0,0,skill_get_time(skillid,skilllv),0);
- break;
- case NPC_LICK:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
- break;
- if(dstsd)
- pc_heal(dstsd,0,-100);
- if(rand()%100 < (skilllv*5)*sc_def_vit/100)
- skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- break;
-
- case NPC_SUICIDE: /* Ž©Œˆ */
- if(src && bl){
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (md)
- mob_damage(NULL,md,md->hp,0);
- else if (sd)
- pc_damage(NULL,sd,sd->status.hp);
- }
- break;
-
- case NPC_SUMMONSLAVE: /* Žè‰º¢Š« */
- case NPC_SUMMONMONSTER: /* MOB¢Š« */
- if(md && !md->master_id){
- mob_summonslave(md,mob_db[md->class].skill[md->skillidx].val,skilllv,(skillid==NPC_SUMMONSLAVE)?1:0);
- }
- break;
-
- case NPC_TRANSFORMATION:
- case NPC_METAMORPHOSIS:
- if(md)
- mob_class_change(md,mob_db[md->class].skill[md->skillidx].val);
- break;
-
- case NPC_EMOTION: /* ƒGƒ‚?ƒVƒ‡ƒ“ */
- if(md)
- clif_emotion(&md->bl,mob_db[md->class].skill[md->skillidx].val[0]);
- break;
-
- case NPC_DEFENDER:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- break;
-
- case WE_MALE: /* ŒN‚¾‚¯‚ÍŒì‚é‚æ */
- if(sd && dstsd){
- int hp_rate=(skilllv <= 0)? 0:skill_db[skillid].hp_rate[skilllv-1];
- int gain_hp=sd->status.max_hp*abs(hp_rate)/100;// 15%
- clif_skill_nodamage(src,bl,skillid,gain_hp,1);
- battle_heal(NULL,bl,gain_hp,0,0);
- }
- break;
- case WE_FEMALE: /* ‚ ‚È‚½‚Ì?‚É?µ‚É‚È‚è‚Ü‚· */
- if(sd && dstsd){
- int sp_rate=(skilllv <= 0)? 0:skill_db[skillid].sp_rate[skilllv-1];
- int gain_sp=sd->status.max_sp*abs(sp_rate)/100;// 15%
- clif_skill_nodamage(src,bl,skillid,gain_sp,1);
- battle_heal(NULL,bl,0,gain_sp,0);
- }
- break;
-
- case WE_CALLPARTNER: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
- if(sd && dstsd){
- if(map[sd->bl.m].flag.nomemo){
- clif_skill_teleportmessage(sd,1);
- return 0;
- }
- if((dstsd = pc_get_partner(sd)) == NULL){
- clif_skill_fail(sd,skillid,0,0);
- return 0;
- }
- skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0);
- }
- break;
-
- case PF_HPCONVERSION: /* ƒ‰ƒCƒt’u‚«Š·‚¦ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd){
- int conv_hp=0,conv_sp=0;
- conv_hp=sd->status.hp/10; //Šî–{‚ÍHP‚Ì10%
- sd->status.hp -= conv_hp; //HP‚ðŒ¸‚ç‚·
- conv_sp=conv_hp*10*skilllv/100;
- conv_sp=(sd->status.sp+conv_sp>sd->status.max_sp)?sd->status.max_sp-sd->status.sp:conv_sp;
- sd->status.sp += conv_sp; //SP‚ð?‚â‚·
- pc_heal(sd,-conv_hp,conv_sp);
- clif_heal(sd->fd,SP_SP,conv_sp);
- }
- break;
- case HT_REMOVETRAP: /* ƒŠƒ€?ƒuƒgƒ‰ƒbƒv */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- struct item item_tmp;
- int flag;
- if((bl->type==BL_SKILL) &&
- (su=(struct skill_unit *)bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
- (su->group->unit_id >= 0x8f && su->group->unit_id <= 0x99) &&
- (su->group->unit_id != 0x92)){ //?‚ðŽæ‚è•Ô‚·
- if(sd){
- if(battle_config.skill_removetrap_type == 1){
- for(i=0;i<10;i++) {
- if(skill_db[su->group->skill_id].itemid[i] > 0){
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = skill_db[su->group->skill_id].itemid[i];
- item_tmp.identify = 1;
- if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,skill_db[su->group->skill_id].amount[i]))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,skill_db[su->group->skill_id].amount[i],sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- }
- }else{
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid = 1065;
- item_tmp.identify = 1;
- if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,1))){
- clif_additem(sd,0,0,flag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- }
- if(su->group->unit_id == 0x91 && su->group->val2){
- struct block_list *target=map_id2bl(su->group->val2);
- if(target && (target->type == BL_PC || target->type == BL_MOB))
- skill_status_change_end(target,SC_ANKLE,-1);
- }
- skill_delunit(su);
- }
- }
- break;
- case HT_SPRINGTRAP: /* ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){
- switch(su->group->unit_id){
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- su->group->unit_id = 0x8c;
- clif_changelook(bl,LOOK_BASE,su->group->unit_id);
- su->group->limit=DIFF_TICK(tick+1500,su->group->tick);
- su->limit=DIFF_TICK(tick+1500,su->group->tick);
- }
- }
- }
- break;
- case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(sd)
- skill_use_id(sd,src->id,sd->skillid_dance,sd->skilllv_dance);
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HP‚ª2/3ˆÈã?‚Á‚Ä‚¢‚½‚玸”s
- return 1;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,0,skill_get_time(skillid,skilllv),0 );
- break;
- case ASC_CDP: // Temporary skill for Create Deadly Poison[Celest]
- if(sd) {
- int eflag;
- struct item item_tmp;
- struct block_list tbl;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- memset(&item_tmp,0,sizeof(item_tmp));
- memset(&tbl,0,sizeof(tbl)); // [MouseJstr]
- item_tmp.nameid = 678;
- item_tmp.identify = 1;
- tbl.id = 0;
- eflag = pc_additem(sd,&item_tmp,1);
- if(eflag) {
- clif_additem(sd,0,0,eflag);
- map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
- break;
- case PF_MINDBREAKER: /* ƒvƒƒ{ƒbƒN */
- {
- struct status_change *sc_data = battle_get_sc_data(bl);
-
- /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
- if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //•sŽ€‚É‚Í?‚©‚È‚¢
- {
- map_freeblock_unlock();
- return 1;
- }
-
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
-
- if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
- skill_castcancel(bl,0);
- if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
- && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
- skill_castcancel(bl,0);
-
- if(sc_data){
- if(sc_data[SC_FREEZE].timer!=-1)
- skill_status_change_end(bl,SC_FREEZE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
- skill_status_change_end(bl,SC_STONE,-1);
- if(sc_data[SC_SLEEP].timer!=-1)
- skill_status_change_end(bl,SC_SLEEP,-1);
- }
-
- if(bl->type==BL_MOB) {
- int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = battle_get_range(src) - (range + 1);
- mob_target((struct mob_data *)bl,src,range);
- }
- }
- break;
-
-
-
-
-
-
- case RG_CLEANER: //AppleGirl
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- struct skill_unit *su=NULL;
- if((bl->type==BL_SKILL) &&
- (su=(struct skill_unit *)bl) &&
- (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
- (su->group->unit_id == 0xb0)){ //?‚ðŽæ‚è•Ô‚·
- if(sd)
- skill_delunit(su);
- }
- }
- break;
- default:
- printf("Unknown skill used:%d\n",skillid);
- map_freeblock_unlock();
- return 1;
- }
-
- map_freeblock_unlock();
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
- *------------------------------------------
- */
-int skill_castend_id( int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data* sd = map_id2sd(id)/*,*target_sd=NULL*/;
- struct block_list *bl;
- int range,inf2;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.prev == NULL ) //prev‚ª–³‚¢‚Ì‚Í‚ ‚è‚È‚ÌH
- return 0;
-
- if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
- return 0;
- if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- if(sd->skillid != SA_CASTCANCEL)
- sd->skilltimer=-1;
-
- if((bl=map_id2bl(sd->skilltarget))==NULL || bl->prev==NULL) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(sd->bl.m != bl->m || pc_isdead(sd)) { //ƒ}ƒbƒv‚ªˆá‚¤‚©Ž©•ª‚ªŽ€‚ñ‚Å‚¢‚é
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillid == PR_LEXAETERNA) {
- struct status_change *sc_data = battle_get_sc_data(bl);
- if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- else if(sd->skillid == RG_BACKSTAP) {
- int dir = map_calc_dir(&sd->bl,bl->x,bl->y),t_dir = battle_get_dir(bl);
- int dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
- if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir))) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- inf2 = skill_get_inf2(sd->skillid);
- if( ( (skill_get_inf(sd->skillid)&1) || inf2&4 ) && // ”Þ‰ä“G??ŒWƒ`ƒFƒbƒN
- battle_check_target(&sd->bl,bl, BCT_ENEMY)<=0 ) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(inf2 & 0xC00 && sd->bl.id != bl->id) {
- int fail_flag = 1;
- if(inf2 & 0x400 && battle_check_target(&sd->bl,bl, BCT_PARTY) > 0)
- fail_flag = 0;
- if(inf2 & 0x800 && sd->status.guild_id > 0 && sd->status.guild_id == battle_get_guild_id(bl))
- fail_flag = 0;
- if(fail_flag) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- range = skill_get_range(sd->skillid,sd->skilllv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- range += battle_config.pc_skill_add_range;
- if((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
- (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == CH_TIGERFIST))
- range += skill_get_blewcount(MO_COMBOFINISH,sd->sc_data[SC_COMBO].val2);
- if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
- if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if(battle_config.skill_out_range_consume) {
- if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return 0;
- }
- }
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
- pc_stop_walking(sd,0);
-
- switch( skill_get_nk(sd->skillid) )
- {
- /* U?Œn/‚«”ò‚΂µŒn */
- case 0: case 2:
- skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- break;
- case 1:/* Žx‰‡Œn */
- if( (sd->skillid==AL_HEAL || (sd->skillid==ALL_RESURRECTION && bl->type != BL_PC) || sd->skillid==PR_ASPERSIO) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
- skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- else
- skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’è‚Ì?Û‚Ì?—j
- *------------------------------------------
- */
-int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag)
-{
- if(skilllv <= 0) return 0;
-
- struct map_session_data *sd=NULL;
- int i,tmpx = 0,tmpy = 0, x1 = 0, y1 = 0;
-
- nullpo_retr(0, src);
-
- if(src->type==BL_PC){
- nullpo_retr(0, sd=(struct map_session_data *)src);
- }
- if( skillid != WZ_METEOR &&
- skillid != WZ_SIGHTRASHER &&
- skillid != AM_CANNIBALIZE &&
- skillid != AM_SPHEREMINE)
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
-
- if (skillnotok(skillid, sd)) // [MouseJstr]
- return 0;
-
- switch(skillid)
- {
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- skill_area_temp[1]=src->id;
- map_foreachinarea(skill_area_sub,
- src->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_NOENEMY|1,
- skill_castend_nodamage_id);
- map_foreachinarea(skill_area_sub,
- src->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- break;
-
- case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
- skill_area_temp[1]=src->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- map_foreachinarea(skill_area_sub,
- src->m,x-2,y-2,x+2,y+2,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|2,
- skill_castend_nodamage_id);
- break;
-
- case HT_DETECTING: /* ƒfƒBƒeƒNƒeƒBƒ“ƒO */
- {
- const int range=7;
- map_foreachinarea( skill_status_change_timer_sub,
- src->m, src->x-range, src->y-range, src->x+range,src->y+range,0,
- src,SC_SIGHT,tick);
- }
- break;
-
- case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- case MG_THUNDERSTORM: /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
- case AL_PNEUMA: /* ƒjƒ…?ƒ} */
- case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒAƒsƒ‰? */
- case WZ_SIGHTRASHER:
- case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- case WZ_VERMILION: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
- case WZ_HEAVENDRIVE: /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
- case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
- case AM_DEMONSTRATION: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- case HT_TALKIEBOX: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- skill_clear_unitgroup(src);
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
- case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
- case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
- skill_clear_element_field(src);//?‚ÉŽ©•ª‚ª?“®‚µ‚Ä‚¢‚é?«ê‚ðƒNƒŠƒA
- skill_unitsetting(src,skillid,skilllv,x,y,0);
- break;
-
- case WZ_METEOR: //ƒƒeƒIƒXƒg?ƒ€
- {
- int flag=0;
- for(i=0;i<2+(skilllv>>1);i++) {
- int j=0, c;
- do {
- tmpx = x + (rand()%7 - 3);
- tmpy = y + (rand()%7 - 3);
- if(tmpx < 0)
- tmpx = 0;
- else if(tmpx >= map[src->m].xs)
- tmpx = map[src->m].xs - 1;
- if(tmpy < 0)
- tmpy = 0;
- else if(tmpy >= map[src->m].ys)
- tmpy = map[src->m].ys - 1;
- j++;
- } while(((c=map_getcell(src->m,tmpx,tmpy))==1 || c==5) && j<100);
- if(j >= 100)
- continue;
- if(flag==0){
- clif_skill_poseffect(src,skillid,skilllv,tmpx,tmpy,tick);
- flag=1;
- }
- if(i > 0)
- skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,(x1<<16)|y1,flag);
- x1 = tmpx;
- y1 = tmpy;
- }
- skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,-1,flag);
- }
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- if(sd) {
- if(map[sd->bl.m].flag.noteleport) /* ƒeƒŒƒ|‹ÖŽ~ */
- break;
- clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map,
- (sd->skilllv>1)?sd->status.memo_point[0].map:"",
- (sd->skilllv>2)?sd->status.memo_point[1].map:"",
- (sd->skilllv>3)?sd->status.memo_point[2].map:"");
- }
- break;
- case MO_BODYRELOCATION:
- if(sd){
- pc_movepos(sd,x,y);
- }else if( src->type==BL_MOB )
- mob_warp((struct mob_data *)src,-1,x,y,0);
- break;
- case AM_CANNIBALIZE: // ƒoƒCƒIƒvƒ‰ƒ“ƒg
- if(sd){
- int mx,my,id=0;
- struct mob_data *md;
-
- mx = x;// + (rand()%10 - 5);
- my = y;// + (rand()%10 - 5);
- id=mob_once_spawn(sd,"this",mx,my,"--ja--",1118,1,"");
- if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id=sd->bl.id;
- md->hp=2210+skilllv*200;
- md->state.special_mob_ai=1;
- md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
- }
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
- }
- break;
- case AM_SPHEREMINE: // ƒXƒtƒBƒA?ƒ}ƒCƒ“
- if(sd){
- int mx,my,id=0;
- struct mob_data *md;
-
- mx = x;// + (rand()%10 - 5);
- my = y;// + (rand()%10 - 5);
- id=mob_once_spawn(sd,"this",mx,my,"--ja--",1142,1,"");
- if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id=sd->bl.id;
- md->hp=1000+skilllv*200;
- md->state.special_mob_ai=2;
- md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
- }
- clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
- }
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AmapŽw’èj
- *------------------------------------------
- */
-int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map)
-{
- int x=0,y=0;
-
- nullpo_retr(0, sd);
- if( sd->bl.prev == NULL || pc_isdead(sd) )
- return 0;
-
- if(skillnotok(skill_num, sd))
- return 0;
-
- if( sd->opt1>0 || sd->status.option&2 )
- return 0;
- //ƒXƒLƒ‹‚ªŽg‚¦‚È‚¢?‘ÔˆÙí’†
- if(sd->sc_data){
- if( sd->sc_data[SC_DIVINA].timer!=-1 ||
- sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
- sd->sc_data[SC_AUTOCOUNTER].timer != -1 ||
- sd->sc_data[SC_STEELBODY].timer != -1 ||
- sd->sc_data[SC_DANCING].timer!=-1 ||
- sd->sc_data[SC_BERSERK].timer != -1 ||
- sd->sc_data[SC_MARIONETTE].timer != -1)
- return 0;
- }
-
- if( skill_num != sd->skillid) /* •s³ƒpƒPƒbƒg‚炵‚¢ */
- return 0;
-
- pc_stopattack(sd);
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_num,map);
- pc_stop_walking(sd,0);
-
- if(strcmp(map,"cancel")==0)
- return 0;
-
- switch(skill_num){
- case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
- if(strcmp(map,"Random")==0)
- pc_randomwarp(sd,3);
- else
- pc_setpos(sd,sd->status.save_point.map,
- sd->status.save_point.x,sd->status.save_point.y,3);
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- {
- const struct point *p[]={
- &sd->status.save_point,&sd->status.memo_point[0],
- &sd->status.memo_point[1],&sd->status.memo_point[2],
- };
- struct skill_unit_group *group;
- int i;
- int maxcount=0;
-
- if((maxcount = skill_get_maxcount(sd->skillid)) > 0) {
- int c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = gettick();
- sd->canmove_tick = gettick();
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
-
- if(sd->skilllv <= 0) return 0;
- for(i=0;i<sd->skilllv;i++){
- if(strcmp(map,p[i]->map)==0){
- x=p[i]->x;
- y=p[i]->y;
- break;
- }
- }
- if(x==0 || y==0) /* •s³ƒpƒPƒbƒgH */
- return 0;
-
- if(!skill_check_condition(sd,3))
- return 0;
- if((group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0))==NULL)
- return 0;
- group->valstr=(char *)aCalloc(24,sizeof(char));
- memcpy(group->valstr,map,24);
- group->val2=(x<<16)|y;
- }
- break;
- }
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgÝ’è?—
- *------------------------------------------
- */
-struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag)
-{
- struct skill_unit_group *group;
- int i,count=1,limit=10000,val1=0,val2=0;
- int target=BCT_ENEMY,interval=1000,range=0;
- int dir=0,aoe_diameter=0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills
-
- nullpo_retr(0, src);
-
- switch(skillid){ /* Ý’è */
-
- case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- limit=skill_get_time(skillid,skilllv);
- val2=skilllv+1;
- interval = -1;
- target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL;
- break;
-
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- if(src->x == x && src->y == y)
- dir = 2;
- else
- dir=map_calc_dir(src,x,y);
- if(dir&1) count=5;
- else count=3;
- limit=skill_get_time(skillid,skilllv);
- if (((struct map_session_data *)src)->sc_data[SC_VIOLENTGALE].timer!=-1)
- limit *= 1.5;
- val2=4+skilllv;
- interval=1;
- break;
-
- case AL_PNEUMA: /* ƒjƒ…?ƒ} */
- limit=skill_get_time(skillid,skilllv);
- interval = -1;
- target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL;
- count = 9;
- break;
-
- case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
- target=BCT_ALL;
- val1=skilllv+6;
- if(flag==0)
- limit=2000;
- else
- limit=skill_get_time(skillid,skilllv);
- break;
-
- case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- count=21;
- limit=skill_get_time(skillid,skilllv);
- val1=skilllv+3;
- val2=(skilllv>6)?777:skilllv*100;
- target=BCT_ALL;
- range=1;
- break;
-
- case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- count=33;
- limit=skill_get_time(skillid,skilllv);
- interval=3000;
- break;
-
- case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒA?ƒsƒ‰? */
- if(flag==0)
- limit=skill_get_time(skillid,skilllv);
- else
- limit=1000;
- interval=2000;
- val1=skilllv+2;
- if(skilllv < 6)
- range=1;
- else
- range=2;
- break;
-
- case MG_THUNDERSTORM: /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
- limit=500;
- range=1;
- break;
-
- case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
- limit=500;
- range=5;
- break;
- case WZ_HEAVENDRIVE: /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
- limit=500;
- range=2;
- break;
-
- case WZ_METEOR: /* ƒƒeƒIƒXƒg?ƒ€ */
- limit=500;
- range=3;
- break;
-
- case WZ_SIGHTRASHER:
- limit=500;
- count=41;
- break;
-
- case WZ_VERMILION: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
- limit=4100;
- interval=1000;
- range=6;
- break;
-
- case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- limit=skill_get_time(skillid,skilllv);
- count=5;
- break;
-
- case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
- limit=4600;
- interval=450;
- range=5;
- break;
-
- case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- limit=skill_get_time(skillid,skilllv);
- interval=200;
- count=25;
- break;
-
- case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
- case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- limit=skill_get_time(skillid,skilllv);
- range=2;
- break;
- case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
- case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- limit=skill_get_time(skillid,skilllv);
- range=1;
- break;
-
- case HT_TALKIEBOX: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- limit=skill_get_time(skillid,skilllv);
- range=1;
- target=BCT_ALL;
- break;
-
- case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- limit=skill_get_time(skillid,skilllv);
- range=1;
- val1=skilllv*15+10;
- break;
-
- case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
- limit=skill_get_time(skillid,skilllv);
- interval=1000;
- count=5;
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- count=29;
- limit=1000;
- interval=300;
- break;
-
- case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
- case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
- case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- limit=skill_get_time(skillid,skilllv);
- count=skilllv<=2?25:(skilllv<=4?49:81);
- target=BCT_ALL;
- break;
-
- case SA_LANDPROTECTOR: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- limit=skill_get_time(skillid,skilllv); // changed to get duration from cast_db (moonsoul)
- val1=skilllv*15+10;
- aoe_diameter=skilllv+skilllv%2+5;
- target=BCT_ALL;
- count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul)
- break;
-
- case BD_LULLABY: /* ŽqŽç‰S */
- case BD_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- count=81;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_ALL;
- break;
- case BD_RICHMANKIM:
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- count=81;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_PARTY;
- break;
-
- case BA_WHISTLE: /* Œû“J */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
- val2 = ((battle_get_agi(src)/10)&0xffff)<<16;
- val2 |= (battle_get_luk(src)/10)&0xffff;
- break;
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = battle_get_dex(src)/10;
- break;
-
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_ENEMY;
- break;
-
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_ENEMY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = ((battle_get_str(src)/20)&0xffff)<<16;
- val2 |= (battle_get_agi(src)/10)&0xffff;
- break;
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON);
- val2 = ((battle_get_dex(src)/10)&0xffff)<<16;
- val2 |= (battle_get_int(src)/5)&0xffff;
- break;
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = ((pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON))&0xffff)<<16;
- else
- val1 = 0;
- val1 |= (battle_get_vit(src))&0xffff;
- val2 = 0;//‰ñ•œ—pƒ^ƒCƒ€ƒJƒEƒ“ƒ^(6•b?‚É1?‰Á)
- break;
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_PARTY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = battle_get_int(src)/10;
- break;
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
- val2 = battle_get_agi(src)/20;
- break;
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- count=49;
- limit=skill_get_time(skillid,skilllv);
- range=5;
- target=BCT_NOENEMY;
- if(src->type == BL_PC)
- val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
- val2 = battle_get_luk(src)/10;
- break;
- case AM_DEMONSTRATION: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- limit=skill_get_time(skillid,skilllv);
- interval=1000;
- range=1;
- target=BCT_ENEMY;
- break;
- case WE_CALLPARTNER: /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
- limit=skill_get_time(skillid,skilllv);
- range=-1;
- break;
-
- case HP_BASILICA: /* ƒoƒWƒŠƒJ */
- limit=skill_get_time(skillid,skilllv);
- target=BCT_ALL;
- range=3;
- //Fix to prevent the priest from walking while Basilica is up.
- battle_stopwalking(src,1);
- skill_status_change_start(src,SC_ANKLE,skilllv,0,0,0,limit,0);
- break;
- case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
- count=49;
- target=BCT_PARTY;
- limit=skill_get_time(skillid,skilllv);
- break;
- case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- count=15;
- limit=skill_get_time(skillid,skilllv);
- if (((struct map_session_data *)src)->sc_data[SC_DELUGE].timer!=-1)
- limit *= 2;
- break;
- case RG_GRAFFITI: /* Graffiti */
- count=1; // Leave this at 1 [Valaris]
- limit=600000; // Time length [Valaris]
- break;
- };
-
- nullpo_retr(NULL, group=skill_initunitgroup(src,count,skillid,skilllv,skill_get_unit_id(skillid,flag&1)));
- group->limit=limit;
- group->val1=val1;
- group->val2=val2;
- group->target_flag=target;
- group->interval=interval;
- group->range=range;
- if(skillid==HT_TALKIEBOX ||
- skillid==RG_GRAFFITI){
- group->valstr=calloc(80, 1);
- if(group->valstr==NULL){
- printf("skill_castend_map: out of memory !\n");
- exit(1);
- }
- memcpy(group->valstr,talkie_mes,80);
- }
- for(i=0;i<count;i++){
- struct skill_unit *unit;
- int ux=x,uy=y,val1=skilllv,val2=0,limit=group->limit,alive=1;
- int range=group->range;
- switch(skillid){ /* Ý’è */
- case AL_PNEUMA: /* ƒjƒ…?ƒ} */
- {
- static const int dx[9]={-1, 0, 1,-1, 0, 1,-1, 0, 1};
- static const int dy[9]={-1,-1,-1, 0, 0, 0, 1, 1, 1};
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
- case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- {
- if(dir&1){ /* ŽÎ‚ß”z’u */
- static const int dx[][5]={
- { 1,1,0,0,-1 }, { -1,-1,0,0,1 },
- },dy[][5]={
- { 1,0,0,-1,-1 }, { 1,0,0,-1,-1 },
- };
- ux+=dx[(dir>>1)&1][i];
- uy+=dy[(dir>>1)&1][i];
- }else{ /* ㉺”z’u */
- if(dir%4==0) /* ㉺ */
- ux+=i-1;
- else /* ¶‰E */
- uy+=i-1;
- }
- val2=group->val2;
- }
- break;
-
- case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- {
- static const int dx[]={
- -1,0,1, -2,-1,0,1,2, -2,-1,0,1,2, -2,-1,0,1,2, -1,0,1 };
- static const int dy[]={
- -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0, 1,1,1,1,1, 2,2,2, };
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
-
- case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- {
- static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3,
- -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, };
- static const int dy[]={
- -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1,
- 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 };
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
-
- case WZ_SIGHTRASHER:
- {
- static const int dx[]={
- -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3, 0, 3, -4, 0, 4, -5, 0, 5 };
- static const int dy[]={
- -5,-5,-5, -4,-4,-4, -3,-3,-3, -2,-2,-2, -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
-
- case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- {
- static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
- static const int diry[8]={1,1,0,-1,-1,-1,0,1};
- if(skilllv <= 1)
- val1 = 500;
- else
- val1 = 200 + 200*skilllv;
- if(src->x == x && src->y == y)
- dir = 2;
- else
- dir=map_calc_dir(src,x,y);
- ux+=(2-i)*diry[dir];
- uy+=(i-2)*dirx[dir];
- }
- break;
-
- case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- ux+=(i%5-2);
- uy+=(i/5-2);
- if(i==12)
- range=2;
- else
- range=-1;
-
- break;
-
- case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
- {
- static const int dx[]={-1,0,0,0,1};
- static const int dy[]={0,-1,0,1,0};
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
-
- case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
- {
- static const int dx[]={
- 0, 0, -1,0,1, -2,-1,0,1,2, -4,-3,-2,-1,0,1,2,3,4, -2,-1,0,1,2, -1,0,1, 0, 0, };
- static const int dy[]={
- -4, -3, -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0,0,0,0,0, 1,1,1,1,1, 2,2,2, 3, 4, };
- ux+=dx[i];
- uy+=dy[i];
- }
- break;
- case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
- case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
- case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- {
- int u_range=0,central=0;
- if(skilllv<=2){
- u_range=2;
- central=12;
- }else if(skilllv<=4){
- u_range=3;
- central=24;
- }else if(skilllv>=5){
- u_range=4;
- central=40;
- }
- ux+=(i%(u_range*2+1)-u_range);
- uy+=(i/(u_range*2+1)-u_range);
-
- if(i==central)
- range=u_range;//’†‰›‚̃†ƒjƒbƒg‚Ì?‰Ê”Í?‚Í‘S”Í?
- else
- range=-1;//’†‰›ˆÈŠO‚̃†ƒjƒbƒg‚Íü‚è
- }
- break;
- case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
- {
- int u_range=0;
-
- if(skilllv<=2) u_range=3;
- else if(skilllv<=4) u_range=4;
- else if(skilllv>=5) u_range=5;
-
- ux+=(i%(u_range*2+1)-u_range);
- uy+=(i/(u_range*2+1)-u_range);
-
- range=0;
- }
- break;
-
- /* ƒ_ƒ“ƒX‚È‚Ç */
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD:/* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- ux+=(i%9-4);
- uy+=(i/9-4);
- if(i==40)
- range=4; /* ’†S‚Ìꇂ͔Í?‚ð4‚ɃI?ƒo?ƒ‰ƒCƒh */
- else
- range=-1; /* ’†S‚¶‚á‚È‚¢ê‡‚Í”Í?‚ð-1‚ɃI?ƒo?ƒ‰ƒCƒh */
- break;
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case BA_WHISTLE: /* Œû“J */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- ux+=(i%7-3);
- uy+=(i/7-3);
- if(i==40)
- range=4; /* ’†S‚Ìꇂ͔Í?‚ð4‚ɃI?ƒo?ƒ‰ƒCƒh */
- else
- range=-1; /* ’†S‚¶‚á‚È‚¢ê‡‚Í”Í?‚ð-1‚ɃI?ƒo?ƒ‰ƒCƒh */
- break;
- case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
- ux+=(i%7-3);
- uy+=(i/7-3);
- break;
- case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- ux+=(i%5-2);
- uy+=(i/5-1);
- break;
- case RG_GRAFFITI: /* Graffiti [Valaris] */
- ux+=(i%5-2);
- uy+=(i/5-2);
- break;
- }
- //’¼ãƒXƒLƒ‹‚Ìê‡Ý’uÀ•Wã‚Ƀ‰ƒ“ƒhƒvƒƒeƒNƒ^?‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
- if(range<=0)
- map_foreachinarea(skill_landprotector,src->m,ux,uy,ux,uy,BL_SKILL,skillid,&alive);
-
- if(skillid==WZ_ICEWALL && alive){
- val2=map_getcell(src->m,ux,uy);
- if(val2==5 || val2==1)
- alive=0;
- else {
- map_setcell(src->m,ux,uy,5);
- clif_changemapcell(src->m,ux,uy,5,0);
- }
- }
-
- if(alive){
- nullpo_retr(NULL, unit=skill_initunit(group,i,ux,uy));
- unit->val1=val1;
- unit->val2=val2;
- unit->limit=limit;
- unit->range=range;
- }
- }
- return group;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì?“®ƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
- struct block_list *ss;
- struct skill_unit_group_tickset *ts;
- struct map_session_data *srcsd=NULL;
- int diff,goflag,splash_count=0;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
-
- if( bl->prev==NULL || !src->alive || (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl) ) )
- return 0;
-
- nullpo_retr(0, sg=src->group);
- nullpo_retr(0, ss=map_id2bl(sg->src_id));
-
- if(ss->type == BL_PC)
- nullpo_retr(0, srcsd=(struct map_session_data *)ss);
- if(srcsd && srcsd->chatID)
- return 0;
-
- if( bl->type!=BL_PC && bl->type!=BL_MOB )
- return 0;
- nullpo_retr(0, ts=skill_unitgrouptickset_search( bl, sg->group_id));
- diff=DIFF_TICK(tick,ts->tick);
- goflag=(diff>sg->interval || diff<0);
- if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // d‚È‚Á‚Ä‚¢‚½‚ç3HIT‚µ‚È‚¢
- goflag = (diff>sg->interval*map_count_oncell(bl->m,bl->x,bl->y) || diff<0);
-
- //?Û‚ªLPã‚É‹‚éꇂ͖³?
- map_foreachinarea(skill_landprotector,bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,0,&goflag);
-
- if(!goflag)
- return 0;
- ts->tick=tick;
- ts->group_id=sg->group_id;
-
- switch(sg->unit_id){
- case 0x83: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
- {
- int race=battle_get_race(bl);
- int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0;
-
- if( battle_get_hp(bl)>=battle_get_max_hp(bl) && !damage_flag)
- break;
-
- if((sg->val1--)<=0){
- skill_delunitgroup(sg);
- return 0;
- }
- if(!damage_flag) {
- int heal=sg->val2;
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage)
- heal=0; /* ?‹à峃J?ƒhiƒq?ƒ‹—Ê‚Oj */
- clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1);
- battle_heal(NULL,bl,heal,0,0);
- }
- else
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- }
- break;
-
- case 0x84: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
- {
- int race=battle_get_race(bl);
- int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0;
-
- if(!damage_flag)
- return 0;
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- }
- break;
-
- case 0x85: /* ƒjƒ…?ƒ} */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SC_PNEUMA;
- if(sc_data && sc_data[type].timer==-1)
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
- else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
- if(DIFF_TICK(sg->tick,unit2->group->tick)>0 )
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
- ts->tick-=sg->interval;
- }
- }
- break;
- case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SC_SAFETYWALL;
- if(sc_data && sc_data[type].timer==-1)
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
- else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
- if(sg->val1 < unit2->group->val1 )
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
- ts->tick-=sg->interval;
- }
- }
- break;
-
- case 0x86: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“(•ƒXƒg?ƒ€ƒKƒXƒg •ƒOƒ‰ƒ“ƒhƒNƒƒX) */
- skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- break;
-
- case 0x7f: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
- if( (src->val2--)>0)
- skill_attack(BF_MAGIC,ss,&src->bl,bl,
- sg->skill_id,sg->skill_lv,tick,0);
- if( src->val2<=0 )
- skill_delunit(src);
- break;
-
- case 0x87: /* ƒtƒ@ƒCƒA?ƒsƒ‰?(?“®‘O) */
- skill_delunit(src);
- skill_unitsetting(ss,sg->skill_id,sg->skill_lv,src->bl.x,src->bl.y,1);
- break;
-
- case 0x88: /* ƒtƒ@ƒCƒA?ƒsƒ‰?(?“®Œã) */
- if(DIFF_TICK(tick,sg->tick) < 150)
- //skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- map_foreachinarea(skill_attack_area,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,BF_MAGIC,ss,&src->bl,sg->skill_id,sg->skill_lv,tick,0,BCT_ENEMY); // area damage [Celest]
- break;
-
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- {
- int i,c = skill_get_blewcount(sg->skill_id,sg->skill_lv);
- if(map[bl->m].flag.gvg) c = 0;
- for(i=0;i<c;i++)
- skill_blown(&src->bl,bl,1|0x30000);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- }
- break;
-
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- skill_attack(BF_MISC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,0x88);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- break;
-
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- map_foreachinarea(skill_count_target,src->bl.m
- ,src->bl.x-src->range,src->bl.y-src->range
- ,src->bl.x+src->range,src->bl.y+src->range
- ,0,&src->bl,&splash_count);
- map_foreachinarea(skill_trap_splash,src->bl.m
- ,src->bl.x-src->range,src->bl.y-src->range
- ,src->bl.x+src->range,src->bl.y+src->range
- ,0,&src->bl,tick,splash_count);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+1500;
- break;
-
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- {
- struct status_change *sc_data=battle_get_sc_data(bl);
- if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){
- int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
- int sec=skill_get_time2(sg->skill_id,sg->skill_lv) - (double)battle_get_agi(bl)*0.1;
- if(battle_get_mode(bl)&0x20)
- sec = sec/5;
- battle_stopwalking(bl,1);
- skill_status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0);
-
- if(moveblock) map_delblock(bl);
- bl->x = src->bl.x;
- bl->y = src->bl.y;
- if(moveblock) map_addblock(bl);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- clif_01ac(&src->bl);
- sg->limit=DIFF_TICK(tick,sg->tick) + sec;
- sg->val2=bl->id;
- }
- }
- break;
-
- case 0x80: /* ƒ?ƒvƒ|?ƒ^ƒ‹(?“®Œã) */
- if(bl->type==BL_PC){
- struct map_session_data *sd = (struct map_session_data *)bl;
- if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y && src->bl.x == sd->to_x && src->bl.y == sd->to_y) {
- if( battle_config.chat_warpportal || !sd->chatID ){
- if((sg->val1--)>0){
- pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3);
- if(sg->src_id == bl->id ||( strcmp(map[src->bl.m].name,sg->valstr) == 0 && src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) ))
- skill_delunitgroup(sg);
- }else
- skill_delunitgroup(sg);
- }
- }
- }else if(bl->type==BL_MOB && battle_config.mob_warpportal){
- int m=map_mapname2mapid(sg->valstr);
- struct mob_data *md;
- md=(struct mob_data *)bl;
- mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3);
- }
- break;
-
- case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
- {
- int type=SkillStatusChangeTable[sg->skill_id];
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if( battle_get_sc_data(bl)[type].timer==-1 )
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- }
- break;
- case 0x92: /* ƒxƒmƒ€ƒ_ƒXƒg */
- {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SkillStatusChangeTable[sg->skill_id];
- if( sc_data && sc_data[type].timer==-1 )
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- }
- break;
- case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
- case 0x9b: /* ƒfƒŠƒ…?ƒW */
- case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SkillStatusChangeTable[sg->skill_id];
- if(sc_data && sc_data[type].timer==-1)
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
- if( DIFF_TICK(sg->tick,unit2->group->tick)>0 )
- skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- ts->tick-=sg->interval;
- }
- } break;
-
- case 0x9e: /* ŽqŽç‰S */
- case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case 0xa0: /* ‰i‰“‚̬“× */
- case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
- case 0xa4: /* [•£‚Ì’†‚É */
- case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case 0xa6: /* •s‹¦˜a‰¹ */
- case 0xa7: /* Œû“J */
- case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
- case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case 0xac: /* ƒnƒ~ƒ“ƒO */
- case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case 0xae: /* K‰^‚̃LƒX */
- case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case 0xb4:
- case 0xb6: /* ƒtƒHƒOƒEƒH?ƒ‹ */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SkillStatusChangeTable[sg->skill_id];
- if(sg->src_id == bl->id)
- break;
- if(sc_data && sc_data[type].timer==-1)
- skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
- (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- else if( (unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){
- if( unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 )
- skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
- (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- ts->tick-=sg->interval;
- }
- } break;
-
- case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- {
- struct skill_unit *unit2;
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=SkillStatusChangeTable[sg->skill_id];
- if(sg->src_id == bl->id)
- break;
- if( sc_data && sc_data[type].timer==-1)
- skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff,
- (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){
- if( DIFF_TICK(sg->tick,unit2->group->tick)>0 )
- skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff,
- (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
- ts->tick-=sg->interval;
- }
- } break;
-
- case 0xb1: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
- skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
- if(bl->type == BL_PC && rand()%100 < sg->skill_lv && battle_config.equipment_breaking)
- pc_breakweapon((struct map_session_data *)bl);
- break;
- case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- if(sg->src_id == bl->id) //Ž©•ª‚ª“¥‚ñ‚Å‚à?“®‚µ‚È‚¢
- break;
- if(sg->val2==0){
- clif_talkiebox(&src->bl,sg->valstr);
- sg->unit_id = 0x8c;
- clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
- sg->limit=DIFF_TICK(tick,sg->tick)+5000;
- sg->val2=-1; //“¥‚ñ‚¾
- }
- break;
- case 0xb2: /* ‚ ‚È‚½‚ð_?‚¢‚½‚¢‚Å‚· */
- case 0xb3: /* ƒSƒXƒyƒ‹ */
- //case 0xb6: /* ƒtƒHƒOƒEƒH?ƒ‹ */ - moved [celest]
- //‚Æ‚è‚ ‚¦‚¸‰½‚à‚µ‚È‚¢
- break;
-
- case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- if(sg->val2==0){
- int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
- skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
- if(moveblock) map_delblock(bl);
- bl->x = (&src->bl)->x;
- bl->y = (&src->bl)->y;
- if(moveblock) map_addblock(bl);
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- clif_01ac(&src->bl);
- sg->limit=DIFF_TICK(tick,sg->tick) + skill_get_time2(sg->skill_id,sg->skill_lv);
- sg->val2=bl->id;
- }
- break;
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- if(bl->type==BL_MOB && ss!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
- {
- if(battle_config.mob_changetarget_byskill == 1)
- {
- int target=((struct mob_data *)bl)->target_id;
- if(ss->type == BL_PC)
- ((struct mob_data *)bl)->target_id=ss->id;
- mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
- ((struct mob_data *)bl)->target_id=target;
- }
- else
- mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
- }
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚©‚ç—£?‚·‚é(‚à‚µ‚­‚Í‚µ‚Ä‚¢‚é)ê‡
- *------------------------------------------
- */
-int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
- nullpo_retr(0, sg=src->group);
-
- if( bl->prev==NULL || !src->alive )
- return 0;
-
- if( bl->type!=BL_PC && bl->type!=BL_MOB )
- return 0;
-
- switch(sg->unit_id){
- case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- case 0x85: /* ƒjƒ…?ƒ} */
- case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
- {
- struct status_change *sc_data=battle_get_sc_data(bl);
- int type=
- (sg->unit_id==0x85)?SC_PNEUMA:
- ((sg->unit_id==0x7e)?SC_SAFETYWALL:
- SC_QUAGMIRE);
- if((type != SC_QUAGMIRE || bl->type != BL_MOB) &&
- sc_data && sc_data[type].timer!=-1 && ((struct skill_unit *)sc_data[type].val2)==src){
- skill_status_change_end(bl,type,-1);
- }
- } break;
-
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- {
- struct block_list *target=map_id2bl(sg->val2);
- if( target && target==bl ){
- skill_status_change_end(bl,SC_ANKLE,-1);
- sg->limit=DIFF_TICK(tick,sg->tick)+1000;
- }
- }
- break;
- case 0xb5:
- case 0xb8:
- {
- struct block_list *target=map_id2bl(sg->val2);
- if( target==bl )
- skill_status_change_end(bl,SC_SPIDERWEB,-1);
- sg->limit=DIFF_TICK(tick,sg->tick)+1000;
- }
- break;
- case 0xb6:
- {
- struct block_list *target=map_id2bl(sg->val2);
- struct status_change *sc_data=battle_get_sc_data(bl);
- if( target==bl ) {
- skill_status_change_end(bl,SC_FOGWALL,-1);
- if (sc_data && sc_data[SC_BLIND].timer!=-1)
- sc_data[SC_BLIND].timer = add_timer(
- gettick() + 30000, skill_status_change_timer, bl->id, 0);
- }
- sg->limit=DIFF_TICK(tick,sg->tick)+1000;
- }
- break;
- case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
- case 0x9b: /* ƒfƒŠƒ…?ƒW */
- case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- {
- struct status_change *sc_data=battle_get_sc_data(bl);
- struct skill_unit *su;
- int type=SkillStatusChangeTable[sg->skill_id];
- if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val2)) && su == src ){
- skill_status_change_end(bl,type,-1);
- }
- }
- break;
-
- case 0x9e: /* ŽqŽç‰S */
- case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case 0xa0: /* ‰i‰“‚̬“× */
- case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
- case 0xa4: /* [•£‚Ì’†‚É */
- case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case 0xa6: /* •s‹¦˜a‰¹ */
- case 0xa7: /* Œû“J */
- case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
- case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case 0xac: /* ƒnƒ~ƒ“ƒO */
- case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case 0xae: /* K‰^‚̃LƒX */
- case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case 0xb4:
- {
- struct status_change *sc_data=battle_get_sc_data(bl);
- struct skill_unit *su;
- int type=SkillStatusChangeTable[sg->skill_id];
- if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val4)) && su == src ){
- skill_status_change_end(bl,type,-1);
- }
- }
- break;
- case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- {
- struct block_list *target=map_id2bl(sg->val2);
- if( target && target==bl )
- skill_status_change_end(bl,SC_SPIDERWEB,-1);
- sg->limit=DIFF_TICK(tick,sg->tick)+1000;
- }
- break;
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- skill_unitgrouptickset_delete(bl,sg->group_id);
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì휃Cƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_ondelete(struct skill_unit *src,struct block_list *bl,unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr(0, src);
- nullpo_retr(0, bl);
- nullpo_retr(0, sg = src->group);
-
- if( bl->prev==NULL || !src->alive )
- return 0;
-
- if( bl->type!=BL_PC && bl->type!=BL_MOB )
- return 0;
-
- switch(sg->unit_id){
- case 0x85: /* ƒjƒ…?ƒ} */
- case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
- case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒ„ */
- case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
- case 0x9b: /* ƒfƒŠƒ…?ƒW */
- case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
- case 0x9e: /* ŽqŽç‰S */
- case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case 0xa0: /* ‰i‰“‚̬“× */
- case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
- case 0xa4: /* [•£‚Ì’†‚É */
- case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case 0xa6: /* •s‹¦˜a‰¹ */
- case 0xa7: /* Œû“J */
- case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
- case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case 0xac: /* ƒnƒ~ƒ“ƒO */
- case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case 0xae: /* K‰^‚̃LƒX */
- case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case 0xb4:
- return skill_unit_onout(src,bl,tick);
-
-/* default:
- if(battle_config.error_log)
- printf("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
- break;*/
- }
- skill_unitgrouptickset_delete(bl,sg->group_id);
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒÀŠEƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_onlimit(struct skill_unit *src,unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr(0, src);
- nullpo_retr(0, sg=src->group);
-
- switch(sg->unit_id){
- case 0x81: /* ƒ?ƒvƒ|?ƒ^ƒ‹(?“®‘O) */
- {
- struct skill_unit_group *group=
- skill_unitsetting(map_id2bl(sg->src_id),sg->skill_id,sg->skill_lv,
- src->bl.x,src->bl.y,1);
- if(group == NULL)
- return 0;
- group->valstr=calloc(24, 1);
- if(group->valstr==NULL){
- printf("skill_unit_onlimit: out of memory !\n");
- exit(1);
- }
- memcpy(group->valstr,sg->valstr,24);
- group->val2=sg->val2;
- }
- break;
-
- case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- map_setcell(src->bl.m,src->bl.x,src->bl.y,src->val2);
- clif_changemapcell(src->bl.m,src->bl.x,src->bl.y,src->val2,1);
- break;
- case 0xb2: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
- {
- struct map_session_data *sd = NULL;
- struct map_session_data *p_sd = NULL;
- if((sd = (struct map_session_data *)(map_id2bl(sg->src_id))) == NULL)
- return 0;
- if((p_sd = pc_get_partner(sd)) == NULL)
- return 0;
-
- pc_setpos(p_sd,map[src->bl.m].name,src->bl.x,src->bl.y,3);
- }
- break;
- }
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̃_ƒ?ƒWƒCƒxƒ“ƒg
- *------------------------------------------
- */
-int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
- int damage,unsigned int tick)
-{
- struct skill_unit_group *sg;
-
- nullpo_retr(0, src);
- nullpo_retr(0, sg=src->group);
-
- switch(sg->unit_id){
- case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
- src->val1-=damage;
- break;
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- skill_blown(bl,&src->bl,2); //‚«”ò‚΂µ‚Ä‚Ý‚é
- break;
- default:
- damage = 0;
- break;
- }
- return damage;
-}
-
-
-/*---------------------------------------------------------------------------- */
-
-/*==========================================
- * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
- *------------------------------------------
- */
-int skill_castend_pos( int tid, unsigned int tick, int id,int data )
-{
- struct map_session_data* sd=map_id2sd(id)/*,*target_sd=NULL*/;
- int range,maxcount;
-
- nullpo_retr(0, sd);
-
- if( sd->bl.prev == NULL )
- return 0;
- if( sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
- return 0;
- if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- sd->skilltimer=-1;
- if(pc_isdead(sd)) {
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(battle_config.pc_skill_reiteration == 0) {
- range = -1;
- switch(sd->skillid) {
- case MG_SAFETYWALL:
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case AL_WARP:
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case RG_GRAFFITI: /* ƒOƒ‰ƒtƒBƒeƒB */
- range = 0;
- break;
- case AL_PNEUMA:
- range = 1;
- break;
- }
- if(range >= 0) {
- if(skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,range,sd->skillid) > 0) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- }
- if(battle_config.pc_skill_nofootset) {
- range = -1;
- switch(sd->skillid) {
- case WZ_FIREPILLAR:
- case HT_SKIDTRAP:
- case HT_LANDMINE:
- case HT_ANKLESNARE:
- case HT_SHOCKWAVE:
- case HT_SANDMAN:
- case HT_FLASHER:
- case HT_FREEZINGTRAP:
- case HT_BLASTMINE:
- case HT_CLAYMORETRAP:
- case HT_TALKIEBOX:
- case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case WZ_ICEWALL:
- range = 1;
- break;
- case AL_WARP:
- range = 0;
- break;
- }
- if(range >= 0) {
- if(skill_check_unit_range2(sd->bl.m,sd->skillx,sd->skilly,range) > 0) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- }
-
- if(battle_config.pc_land_skill_limit) {
- maxcount = skill_get_maxcount(sd->skillid);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- }
-
- if(sd->skilllv <= 0) return 0;
- range = skill_get_range(sd->skillid,sd->skilllv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- range += battle_config.pc_skill_add_range;
- if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
- if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- }
- if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- sd->skillitem = sd->skillitemlv = -1;
- if(battle_config.skill_out_range_consume) {
- if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->canact_tick = tick;
- sd->canmove_tick = tick;
- return 0;
- }
- }
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
- pc_stop_walking(sd,0);
-
- skill_castend_pos2(&sd->bl,sd->skillx,sd->skilly,sd->skillid,sd->skilllv,tick,0);
-
- return 0;
-}
-
-/*==========================================
- * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_char_sub(struct block_list *bl,va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data*)bl);
- nullpo_retr(0, src=va_arg(ap,struct block_list *));
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, ssd=(struct map_session_data*)src);
-
- s_class = pc_calc_base_job(sd->status.class);
- //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
- if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
- (*c)=99;
- return 0;
- }
-
- ;
- ss_class = pc_calc_base_job(ssd->status.class);
-
- switch(ssd->skillid){
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 ||
- sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) &&
- (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10)
- (*c)++;
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- if(sd != ssd &&
- ((ssd->status.class==19 && sd->status.class==20) ||
- (ssd->status.class==20 && sd->status.class==19) ||
- (ssd->status.class==4020 && sd->status.class==4021) ||
- (ssd->status.class==4021 && sd->status.class==4020) ||
- (ssd->status.class==20 && sd->status.class==4020) ||
- (ssd->status.class==19 && sd->status.class==4021)) &&
- pc_checkskill(sd,ssd->skillid) > 0 &&
- (*c)==0 &&
- sd->status.party_id == ssd->status.party_id &&
- !pc_issit(sd) &&
- sd->sc_data[SC_DANCING].timer==-1
- )
- (*c)=pc_checkskill(sd,ssd->skillid);
- break;
- }
- return 0;
-}
-/*==========================================
- * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’èŒãƒXƒLƒ‹Žg—p?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_use_sub(struct block_list *bl,va_list ap)
-{
- int *c;
- struct block_list *src;
- struct map_session_data *sd;
- struct map_session_data *ssd;
- struct pc_base_job s_class;
- struct pc_base_job ss_class;
- int skillid,skilllv;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, sd=(struct map_session_data*)bl);
- nullpo_retr(0, src=va_arg(ap,struct block_list *));
- nullpo_retr(0, c=va_arg(ap,int *));
- nullpo_retr(0, ssd=(struct map_session_data*)src);
-
- s_class = pc_calc_base_job(sd->status.class);
-
- //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
- if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
- (*c)=99;
- return 0;
- }
-
- ss_class = pc_calc_base_job(ssd->status.class);
- skillid=ssd->skillid;
- skilllv=ssd->skilllv;
- if(skilllv <= 0) return 0;
- switch(skillid){
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 ||
- sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) &&
- (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10){
- sd->status.sp -= 10;
- pc_calcstatus(sd,0);
- (*c)++;
- }
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- if(sd != ssd && //–{lˆÈŠO‚Å
- ((ssd->status.class==19 && sd->status.class==20) ||
- (ssd->status.class==20 && sd->status.class==19) ||
- (ssd->status.class==4020 && sd->status.class==4021) ||
- (ssd->status.class==4021 && sd->status.class==4020) ||
- (ssd->status.class==20 && sd->status.class==4020) ||
- (ssd->status.class==19 && sd->status.class==4021)) && //Ž©•ª‚ªƒ_ƒ“ƒT?‚È‚çƒo?ƒh‚Å
- pc_checkskill(sd,skillid) > 0 && //ƒXƒLƒ‹‚ðŽ‚Á‚Ä‚¢‚Ä
- (*c)==0 && //ʼn‚̈êl‚Å
- sd->status.party_id == ssd->status.party_id && //ƒp?ƒeƒB?‚ª“¯‚¶‚Å
- !pc_issit(sd) && //À‚Á‚Ä‚È‚¢
- sd->sc_data[SC_DANCING].timer==-1 //ƒ_ƒ“ƒX’†‚¶‚á‚È‚¢
- ){
- ssd->sc_data[SC_DANCING].val4=bl->id;
- clif_skill_nodamage(bl,src,skillid,skilllv,1);
- skill_status_change_start(bl,SC_DANCING,skillid,ssd->sc_data[SC_DANCING].val2,0,src->id,skill_get_time(skillid,skilllv)+1000,0);
- sd->skillid_dance=sd->skillid=skillid;
- sd->skilllv_dance=sd->skilllv=skilllv;
- (*c)++;
- }
- break;
- }
- return 0;
-}
-/*==========================================
- * ”Í??ƒoƒCƒIƒvƒ‰ƒ“ƒgAƒXƒtƒBƒAƒ}ƒCƒ“—pMob‘¶ÝŠm”F”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_check_condition_mob_master_sub(struct block_list *bl,va_list ap)
-{
- int *c,src_id=0,mob_class=0;
- struct mob_data *md;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, md=(struct mob_data*)bl);
- nullpo_retr(0, src_id=va_arg(ap,int));
- nullpo_retr(0, mob_class=va_arg(ap,int));
- nullpo_retr(0, c=va_arg(ap,int *));
-
- if(md->class==mob_class && md->master_id==src_id)
- (*c)++;
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—p?Œi?‚ÅŽg—pŽ¸”sj
- *------------------------------------------
- */
-int skill_check_condition(struct map_session_data *sd,int type)
-{
- int i,hp,sp,hp_rate,sp_rate,zeny,weapon,state,spiritball,skill,lv,mhp;
- int index[10],itemid[10],amount[10];
-
- nullpo_retr(0, sd);
-
- if( battle_config.gm_skilluncond>0 && pc_isGM(sd)>= battle_config.gm_skilluncond ) {
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
-
- if( sd->opt1>0) {
- clif_skill_fail(sd,sd->skillid,0,0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(pc_is90overweight(sd)) {
- clif_skill_fail(sd,sd->skillid,9,0);
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1) {
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
- if(sd->skillid == AM_PHARMACY && sd->state.produce_flag == 1) {
- sd->skillitem = sd->skillitemlv = -1;
- return 0;
- }
-
- if(sd->skillitem == sd->skillid) { /* ƒAƒCƒeƒ€‚Ìꇖ³?Œ¬Œ÷ */
- if(type&1)
- sd->skillitem = sd->skillitemlv = -1;
- return 1;
- }
- if( sd->opt1>0 ){
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
- if(sd->sc_data){
- if( sd->sc_data[SC_DIVINA].timer!=-1 ||
- sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
- sd->sc_data[SC_STEELBODY].timer != -1 ||
- sd->sc_data[SC_BERSERK].timer != -1 ||
- (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
- }
- }
- skill = sd->skillid;
- lv = sd->skilllv;
- if(lv <= 0) return 0;
- hp=skill_get_hp(skill, lv); /* Á”ïHP */
- sp=skill_get_sp(skill, lv); /* Á”ïSP */
- if((sd->skillid_old == BD_ENCORE) && skill==sd->skillid_dance)
- sp=sp/2; //ƒAƒ“ƒR?ƒ‹Žž‚ÍSPÁ””¼•ª
- hp_rate = (lv <= 0)? 0:skill_db[skill].hp_rate[lv-1];
- sp_rate = (lv <= 0)? 0:skill_db[skill].sp_rate[lv-1];
- zeny = skill_get_zeny(skill,lv);
- weapon = skill_db[skill].weapon;
- state = skill_db[skill].state;
- spiritball = (lv <= 0)? 0:skill_db[skill].spiritball[lv-1];
- mhp=skill_get_mhp(skill, lv); /* Á”ïHP */
- for(i=0;i<10;i++) {
- itemid[i] = skill_db[skill].itemid[i];
- amount[i] = skill_db[skill].amount[i];
- }
- if(mhp > 0)
- hp += (sd->status.max_hp * mhp)/100;
- if(hp_rate > 0)
- hp += (sd->status.hp * hp_rate)/100;
- else
- hp += (sd->status.max_hp * abs(hp_rate))/100;
- if(sp_rate > 0)
- sp += (sd->status.sp * sp_rate)/100;
- else
- sp += (sd->status.max_sp * abs(sp_rate))/100;
- if(sd->dsprate!=100)
- sp=sp*sd->dsprate/100; /* Á”ïSPC³ */
-
- switch(skill) {
- case SA_CASTCANCEL:
- if(sd->skilltimer == -1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
- case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
- case ST_CHASEWALK:
- if(sd->sc_data[SkillStatusChangeTable[skill]].timer!=-1)
- return 1; /* ‰ðœ‚·‚éꇂÍSPÁ”‚È‚¢ */
- break;
- case AL_TELEPORT:
- case AL_WARP:
- if(map[sd->bl.m].flag.noteleport) {
- clif_skill_teleportmessage(sd,0);
- return 0;
- }
- break;
- case MO_CALLSPIRITS: /* ?Œ÷ */
- if(sd->spiritball >= lv) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case CH_SOULCOLLECT: /* ‹¶?Œ÷ */
- if(sd->spiritball >= 5) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case MO_FINGEROFFENSIVE: //Žw?
- if (sd->spiritball > 0 && sd->spiritball < spiritball) {
- spiritball = sd->spiritball;
- sd->spiritball_old = sd->spiritball;
- }
- else sd->spiritball_old = lv;
- break;
- case MO_CHAINCOMBO: //˜A‘Ŷ
- if(sd->sc_data[SC_BLADESTOP].timer==-1){
- if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK)
- return 0;
- }
- break;
- case MO_COMBOFINISH: //–Ò—´Œ
- if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO)
- return 0;
- break;
- case CH_TIGERFIST: //•šŒÕŒ
- if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH)
- return 0;
- break;
- case CH_CHAINCRUSH: //˜A’Œ•ö?
- if(sd->sc_data[SC_COMBO].timer == -1)
- return 0;
- if(sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST)
- return 0;
- break;
- case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
- if((sd->sc_data[SC_COMBO].timer != -1 && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) || sd->sc_data[SC_BLADESTOP].timer!=-1)
- spiritball--;
- break;
- case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
- {
- struct skill_unit_group *group=NULL;
- if(sd->sc_data[SC_DANCING].timer==-1 || ((group=(struct skill_unit_group*)sd->sc_data[SC_DANCING].val2) && (skill_get_time(sd->sc_data[SC_DANCING].val1,group->skill_lv) - sd->sc_data[SC_DANCING].val3*1000) <= skill_get_time2(skill,lv))){ //ƒ_ƒ“ƒX’†‚ÅŽg—pŒã5•bˆÈã‚Ì‚ÝH
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- break;
- case PR_BENEDICTIO: /* ¹?~•Ÿ */
- {
- int range=1;
- int c=0;
- if(!(type&1)){
- map_foreachinarea(skill_check_condition_char_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- if(c<2){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }else{
- map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- }
- }
- break;
- case WE_CALLPARTNER: /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
- if(!sd->status.partner_id){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case AM_CANNIBALIZE: /* ƒoƒCƒIƒvƒ‰ƒ“ƒg */
- case AM_SPHEREMINE: /* ƒXƒtƒBƒA?ƒ}ƒCƒ“ */
- if(type&1){
- int c=0;
- int maxcount=skill_get_maxcount(skill);
- int mob_class=(skill==AM_CANNIBALIZE)?1118:1142;
- if(battle_config.pc_land_skill_limit && maxcount>0) {
- map_foreachinarea(skill_check_condition_mob_master_sub ,sd->bl.m, 0, 0, map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB, sd->bl.id, mob_class,&c );
- if(c >= maxcount){
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- }
- break;
- case MG_FIREWALL: /* ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹ */
- case WZ_QUAGMIRE:
- case WZ_FIREPILLAR: // celest
- case PF_FOGWALL:
- /* ?§ŒÀ */
- if(battle_config.pc_land_skill_limit) {
- int maxcount = skill_get_maxcount(skill);
- if(maxcount > 0) {
- int i,c;
- for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
- if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == skill)
- c++;
- }
- if(c >= maxcount) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- }
- break;
- }
-
- if(!(type&2)){
- if( hp>0 && sd->status.hp < hp) { /* HPƒ`ƒFƒbƒN */
- clif_skill_fail(sd,skill,2,0); /* HP•s‘«FŽ¸”s’Ê’m */
- return 0;
- }
- if( sp>0 && sd->status.sp < sp) { /* SPƒ`ƒFƒbƒN */
- clif_skill_fail(sd,skill,1,0); /* SP•s‘«FŽ¸”s’Ê’m */
- return 0;
- }
- if( zeny>0 && sd->status.zeny < zeny) {
- clif_skill_fail(sd,skill,5,0);
- return 0;
- }
- if(!(weapon & (1<<sd->status.weapon) ) ) {
- clif_skill_fail(sd,skill,6,0);
- return 0;
- }
- if( spiritball > 0 && sd->spiritball < spiritball) {
- clif_skill_fail(sd,skill,0,0); // Ÿ†‹…•s‘«
- return 0;
- }
- }
-
- switch(state) {
- case ST_HIDING:
- if(!(sd->status.option&2)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_CLOAKING:
- if(!(sd->status.option&4)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_HIDDEN:
- if(!pc_ishiding(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_RIDING:
- if(!pc_isriding(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_FALCON:
- if(!pc_isfalcon(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_CART:
- if(!pc_iscarton(sd)) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_SHIELD:
- if(sd->status.shield <= 0) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_SIGHT:
- if(sd->sc_data[SC_SIGHT].timer == -1 && type&1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_EXPLOSIONSPIRITS:
- if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_RECOV_WEIGHT_RATE:
- if(battle_config.natural_heal_weight_rate <= 100 && sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- case ST_MOVE_ENABLE:
- {
- struct walkpath_data wpd;
- if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->skillx,sd->skilly,1)==-1) {
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
- break;
- case ST_WATER:
- if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y) != 3 && (sd->sc_data[SC_DELUGE].timer==-1)){ //…ê”»’è
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- break;
- }
-
- for(i=0;i<10;i++) {
- int x = lv%11 - 1;
- index[i] = -1;
- if(itemid[i] <= 0)
- continue;
- if(itemid[i] >= 715 && itemid[i] <= 717 && sd->special_state.no_gemstone)
- continue;
- if(((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) && sd->sc_data[SC_INTOABYSS].timer != -1)
- continue;
- if(skill == WZ_FIREPILLAR && lv<=5)
- continue; // no gemstones for 1-5 [Celest]
- if(skill == AM_POTIONPITCHER && i != x)
- continue;
-
- index[i] = pc_search_inventory(sd,itemid[i]);
- if(index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) {
- if(itemid[i] == 716 || itemid[i] == 717)
- clif_skill_fail(sd,skill,(7+(itemid[i]-716)),0);
- else
- clif_skill_fail(sd,skill,0,0);
- return 0;
- }
- }
-
- if(!(type&1))
- return 1;
-
- if(skill != AM_POTIONPITCHER) {
- if(skill == AL_WARP && !(type&2))
- return 1;
- for(i=0;i<10;i++) {
- if(index[i] >= 0)
- pc_delitem(sd,index[i],amount[i],0); // ƒAƒCƒeƒ€Á”ï
- }
- }
-
- if(type&2)
- return 1;
-
- if(sp > 0) { // SPÁ”ï
- sd->status.sp-=sp;
- clif_updatestatus(sd,SP_SP);
- }
- if(hp > 0) { // HPÁ”ï
- sd->status.hp-=hp;
- clif_updatestatus(sd,SP_HP);
- }
- if(zeny > 0) // ZenyÁ”ï
- pc_payzeny(sd,zeny);
- if(spiritball > 0) // Ÿ†‹…Á”ï
- pc_delspiritball(sd,spiritball,0);
-
-
- return 1;
-}
-
-/*==========================================
- * ‰r¥ŽžŠÔŒvŽZ
- *------------------------------------------
- */
-int skill_castfix( struct block_list *bl, int time )
-{
- struct map_session_data *sd;
- struct mob_data *md; // [Valaris]
- struct status_change *sc_data;
- int dex;
- int castrate=100;
- int skill,lv,castnodex;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_MOB){ // Crash fix [Valaris]
- md=(struct mob_data*)bl;
- skill = md->skillid;
- lv = md->skilllv;
- }
-
- else {
- sd=(struct map_session_data*)bl;
- skill = sd->skillid;
- lv = sd->skilllv;
- }
-
- if(lv <= 0) return 0;
-
- sc_data = battle_get_sc_data(bl);
- dex=battle_get_dex(bl);
-
- if (skill > MAX_SKILL_DB || skill < 0)
- return 0;
-
- castnodex=skill_get_castnodex(skill, lv);
-
- if(time==0)
- return 0;
- if(castnodex > 0 && bl->type==BL_PC)
- castrate=((struct map_session_data *)bl)->castrate;
- else if (castnodex <= 0 && bl->type==BL_PC) {
- castrate=((struct map_session_data *)bl)->castrate;
- time=time*castrate*(battle_config.castrate_dex_scale - dex)/(battle_config.castrate_dex_scale * 100);
- time=time*battle_config.cast_rate/100;
- }
-
- /* ƒTƒtƒ‰ƒMƒEƒ€ */
- if(sc_data && sc_data[SC_SUFFRAGIUM].timer!=-1 ){
- time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100;
- skill_status_change_end( bl, SC_SUFFRAGIUM, -1);
- }
- /* ƒuƒ‰ƒM‚ÌŽ */
- if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 )
- time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
- +(sc_data[SC_POEMBRAGI].val3>>16)))/100;
-
- return (time>0)?time:0;
-}
-/*==========================================
- * ƒfƒBƒŒƒCŒvŽZ
- *------------------------------------------
- */
-int skill_delayfix( struct block_list *bl, int time )
-{
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
-
- sc_data = battle_get_sc_data(bl);
- if(time<=0)
- return 0;
-
- if(bl->type == BL_PC) {
- if( battle_config.delay_dependon_dex ) /* dex‚̉e‹¿‚ðŒvŽZ‚·‚é */
- time=time*(battle_config.castrate_dex_scale - battle_get_dex(bl))/battle_config.castrate_dex_scale;
- time=time*battle_config.delay_rate/100;
- }
-
- /* ƒuƒ‰ƒM‚ÌŽ */
- if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 )
- time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
- +(sc_data[SC_POEMBRAGI].val3&0xffff)))/100;
-
- return (time>0)?time:0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piIDŽw’èj
- *------------------------------------------
- */
-int skill_use_id( struct map_session_data *sd, int target_id,
- int skill_num, int skill_lv)
-{
- unsigned int tick;
- int casttime=0,delay=0,skill,range;
- struct map_session_data* target_sd=NULL;
- int forcecast=0;
- struct block_list *bl;
- struct status_change *sc_data;
- tick=gettick();
-
- nullpo_retr(0, sd);
-
- if( (bl=map_id2bl(target_id)) == NULL ){
-/* if(battle_config.error_log)
- printf("skill target not found %d\n",target_id); */
- return 0;
- }
- if(sd->bl.m != bl->m || pc_isdead(sd))
- return 0;
-
- if(skillnotok(skill_num, sd)) // [MouseJstr]
- return 0;
-
- sc_data=sd->sc_data;
-
- /* ’¾?‚âˆÙíi‚½‚¾‚µAƒOƒŠƒ€‚È‚Ç‚Ì”»’è‚ð‚·‚éj */
- if( sd->opt1>0 )
- return 0;
- if(sd->sc_data){
- if(sc_data[SC_CHASEWALK].timer != -1) return 0;
- if(sc_data[SC_VOLCANO].timer != -1){
- if(skill_num==WZ_ICEWALL) return 0;
- }
- if(sc_data[SC_ROKISWEIL].timer!=-1){
- if(skill_num==BD_ADAPTATION) return 0;
- }
- if( sd->sc_data[SC_DIVINA].timer!=-1 ||
- sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
- (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
- sd->sc_data[SC_STEELBODY].timer != -1 ||
- sd->sc_data[SC_BERSERK].timer != -1 ||
- (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
- }
-
- if(sc_data[SC_BLADESTOP].timer != -1){
- int lv = sc_data[SC_BLADESTOP].val1;
- if(sc_data[SC_BLADESTOP].val2==1) return 0;//”’‰H‚³‚ꂽ‘¤‚Ȃ̂Ń_ƒ
- if(lv==1) return 0;
- if(lv==2 && skill_num!=MO_FINGEROFFENSIVE) return 0;
- if(lv==3 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE) return 0;
- if(lv==4 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO) return 0;
- if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0;
- }
- }
-
- if(sd->status.option&4 && skill_num==TF_HIDING)
- return 0;
- if(sd->status.option&2 && skill_num!=TF_HIDING && skill_num!=AS_GRIMTOOTH && skill_num!=RG_BACKSTAP && skill_num!=RG_RAID )
- return 0;
-
- if(map[sd->bl.m].flag.gvg){ //GvG‚ÅŽg—p‚Å‚«‚È‚¢ƒXƒLƒ‹
- switch(skill_num){
- case SM_ENDURE:
- case AL_TELEPORT:
- case AL_WARP:
- case WZ_ICEWALL:
- case TF_BACKSLIDING:
- case LK_BERSERK:
- case HP_BASILICA:
- case ST_CHASEWALK:
- return 0;
- }
- }
-
- /* ‰‰‘t/ƒ_ƒ“ƒX’† */
- if( sc_data && sc_data[SC_DANCING].timer!=-1 ){
-// if(battle_config.pc_skill_log)
-// printf("dancing! %d\n",skill_num);
- if( sc_data[SC_DANCING].val4 && skill_num!=BD_ADAPTATION ) //‡‘t’†‚̓AƒhƒŠƒuˆÈŠO•s‰Â
- return 0;
- if(skill_num!=BD_ADAPTATION && skill_num!=BA_MUSICALSTRIKE && skill_num!=DC_THROWARROW){
- return 0;
- }
- }
-
- if(skill_get_inf2(skill_num)&0x200 && sd->bl.id == target_id)
- return 0;
- //’¼‘O‚̃XƒLƒ‹‚ª‰½‚©?‚¦‚é•K—v‚Ì‚ ‚éƒXƒLƒ‹
- switch(skill_num){
- case SA_CASTCANCEL:
- if(sd->skillid != skill_num){ //ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹Ž©?‚Í?‚¦‚È‚¢
- sd->skillid_old = sd->skillid;
- sd->skilllv_old = sd->skilllv;
- break;
- }
- case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
- if(!sd->skillid_dance){ //‘O‰ñŽg—p‚µ‚½—x‚肪‚È‚¢‚Æ‚¾‚ß
- clif_skill_fail(sd,skill_num,0,0);
- return 0;
- }else{
- sd->skillid_old = skill_num;
- }
- break;
- }
-
- sd->skillid = skill_num;
- sd->skilllv = skill_lv;
-
- switch(skill_num){ //Ž–‘O‚ɃŒƒxƒ‹‚ª?‚í‚Á‚½‚è‚·‚éƒXƒLƒ‹
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- {
- int range=1;
- int c=0;
- map_foreachinarea(skill_check_condition_char_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- if(c<1){
- clif_skill_fail(sd,skill_num,0,0);
- return 0;
- }else if(c==99){ //‘Š•û•s—vݒ肾‚Á‚½
- ;
- }else{
- sd->skilllv=(c + skill_lv)/2;
- }
- }
- break;
- }
-
- if(!skill_check_condition(sd,0)) return 0;
-
- /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
- range = skill_get_range(skill_num,skill_lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- if(!battle_check_range(&sd->bl,bl,range) )
- return 0;
-
- if(bl->type==BL_PC) {
- target_sd=(struct map_session_data*)bl;
- if(target_sd && skill_num == ALL_RESURRECTION && !pc_isdead(target_sd))
- return 0;
- }
- if((skill_num != MO_CHAINCOMBO &&
- skill_num != MO_COMBOFINISH &&
- skill_num != MO_EXTREMITYFIST &&
- skill_num != CH_TIGERFIST &&
- skill_num != CH_CHAINCRUSH) ||
- (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag) )
- pc_stopattack(sd);
-
- casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) );
- if(skill_num != SA_MAGICROD)
- delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) );
- sd->state.skillcastcancel = skill_db[skill_num].castcancel;
-
- switch(skill_num){ /* ‰½‚©“ÁŽê‚È?—‚ª•K—v */
-// case AL_HEAL: /* ƒq?ƒ‹ */
-// if(battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
-// forcecast=1; /* ƒq?ƒ‹ƒAƒ^ƒbƒN‚È‚ç‰r¥ƒGƒtƒFƒNƒg—L‚è */
-// break;
- case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
- if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))){ /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
- forcecast=1; /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
- casttime=skill_castfix(&sd->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) );
- }
- break;
- case MO_FINGEROFFENSIVE: /* Žw? */
- casttime += casttime * ((skill_lv > sd->spiritball)? sd->spiritball:skill_lv);
- break;
- case MO_CHAINCOMBO: /*˜A‘Ŷ*/
- target_id = sd->attacktarget;
- if( sc_data && sc_data[SC_BLADESTOP].timer!=-1 ){
- struct block_list *tbl;
- if((tbl=(struct block_list *)sc_data[SC_BLADESTOP].val4) == NULL) //ƒ^?ƒQƒbƒg‚ª‚¢‚È‚¢H
- return 0;
- target_id = tbl->id;
- }
- break;
- case MO_COMBOFINISH: /*–Ò—´Œ*/
- case CH_TIGERFIST: /* •šŒÕŒ */
- case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
- target_id = sd->attacktarget;
- break;
-
-// -- moonsoul (altered to allow proper usage of extremity from new champion combos)
-//
- case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
- if(sc_data && sc_data[SC_COMBO].timer != -1 && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) {
- casttime = 0;
- target_id = sd->attacktarget;
- }
- forcecast=1;
- break;
- case SA_MAGICROD:
- case SA_SPELLBREAKER:
- forcecast=1;
- break;
- case WE_MALE:
- case WE_FEMALE:
- {
- struct map_session_data *p_sd = NULL;
- if((p_sd = pc_get_partner(sd)) == NULL)
- return 0;
- target_id = p_sd->bl.id;
- //range‚ð‚à‚¤1‰ñ?¸
- range = skill_get_range(skill_num,skill_lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- if(!battle_check_range(&sd->bl,&p_sd->bl,range) ){
- return 0;
- }
- }
- break;
- case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- {
- struct status_change *t_sc_data = battle_get_sc_data(bl);
- if(t_sc_data && t_sc_data[SC_POISON].timer==-1){
- clif_skill_fail(sd,skill_num,0,10);
- return 0;
- }
- }
- break;
- case PF_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- casttime = 12000;
- break;
-
- }
-
- //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
- if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){
- casttime = casttime/2;
- if((--sc_data[SC_MEMORIZE].val2)<=0)
- skill_status_change_end(&sd->bl, SC_MEMORIZE, -1);
- }
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",sd->bl.id,target_id,skill_num,skill_lv,casttime);
-
-// if(sd->skillitem == skill_num)
-// casttime = delay = 0;
-
- if( casttime>0 || forcecast ){ /* ‰r¥‚ª•K—v */
- struct mob_data *md;
- clif_skillcasting( &sd->bl,
- sd->bl.id, target_id, 0,0, skill_num,casttime);
-
- /* ‰r¥”½?ƒ‚ƒ“ƒXƒ^? */
- if( bl->type==BL_MOB && (md=(struct mob_data *)bl) && mob_db[md->class].mode&0x10 &&
- md->state.state!=MS_ATTACK && sd->invincible_timer == -1){
- md->target_id=sd->bl.id;
- md->state.targettype = ATTACKABLE;
- md->min_chase=13;
- }
- }
-
- if( casttime<=0 ) /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
- sd->state.skillcastcancel=0;
-
- sd->skilltarget = target_id;
-/* sd->cast_target_bl = bl; */
- sd->skillx = 0;
- sd->skilly = 0;
- sd->canact_tick = tick + casttime + delay;
- sd->canmove_tick = tick;
- if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING)
- skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
- if(casttime > 0) {
- sd->skilltimer = add_timer( tick+casttime, skill_castend_id, sd->bl.id, 0 );
- if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed*(175 - skill*5)/100;
- clif_updatestatus(sd,SP_SPEED);
- }
- else
- pc_stop_walking(sd,0);
- }
- else {
- if(skill_num != SA_CASTCANCEL)
- sd->skilltimer = -1;
- skill_castend_id(sd->skilltimer,tick,sd->bl.id,0);
- }
-
- //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- //if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER)
- // skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1); // moved
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹Žg—piꊎw’èj
- *------------------------------------------
- */
-int skill_use_pos( struct map_session_data *sd,
- int skill_x, int skill_y, int skill_num, int skill_lv)
-{
- struct block_list bl;
- struct status_change *sc_data;
- unsigned int tick;
- int casttime=0,delay=0,skill,range;
-
- nullpo_retr(0, sd);
-
- if(pc_isdead(sd))
- return 0;
-
- if (skillnotok(skill_num, sd)) // [MoueJstr]
- return 0;
-
- if(skill_num==WZ_ICEWALL && map[sd->bl.m].flag.noicewall && !map[sd->bl.m].flag.pvp) { // noicewall flag [Valaris]
- clif_skill_fail(sd,sd->skillid,0,0);
- return 0;
- }
-
- sc_data=sd->sc_data;
-
- if( sd->opt1>0 )
- return 0;
- if(sc_data){
- if( sc_data[SC_DIVINA].timer!=-1 ||
- sc_data[SC_ROKISWEIL].timer!=-1 ||
- sc_data[SC_AUTOCOUNTER].timer != -1 ||
- sc_data[SC_STEELBODY].timer != -1 ||
- sc_data[SC_DANCING].timer!=-1 ||
- sc_data[SC_BERSERK].timer != -1 ||
- sd->sc_data[SC_MARIONETTE].timer != -1)
- return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
- }
-
- if(sd->status.option&2)
- return 0;
-
- if(map[sd->bl.m].flag.gvg && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT || skill_num == AL_WARP ||
- skill_num == WZ_ICEWALL || skill_num == TF_BACKSLIDING))
- return 0;
-
- sd->skillid = skill_num;
- sd->skilllv = skill_lv;
- if(skill_lv <= 0) return 0;
- sd->skillx = skill_x;
- sd->skilly = skill_y;
- if(!skill_check_condition(sd,0)) return 0;
-
- /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
- bl.type = BL_NUL;
- bl.m = sd->bl.m;
- bl.x = skill_x;
- bl.y = skill_y;
- range = skill_get_range(skill_num,skill_lv);
- if(range < 0)
- range = battle_get_range(&sd->bl) - (range + 1);
- if(!battle_check_range(&sd->bl,&bl,range) )
- return 0;
-
- pc_stopattack(sd);
-
- casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) );
- delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) );
- sd->state.skillcastcancel = skill_db[skill_num].castcancel;
-
- if(battle_config.pc_skill_log)
- printf("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n",sd->bl.id,skill_x,skill_y,skill_num,skill_lv,casttime);
-
-// if(sd->skillitem == skill_num)
-// casttime = delay = 0;
- //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
- if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){
- casttime = casttime/3;
- if((--sc_data[SC_MEMORIZE].val2)<=0)
- skill_status_change_end(&sd->bl, SC_MEMORIZE, -1);
- }
-
- if( casttime>0 ) /* ‰r¥‚ª•K—v */
- clif_skillcasting( &sd->bl,
- sd->bl.id, 0, skill_x,skill_y, skill_num,casttime);
-
- if( casttime<=0 ) /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
- sd->state.skillcastcancel=0;
-
- sd->skilltarget = 0;
-/* sd->cast_target_bl = NULL; */
- tick=gettick();
- sd->canact_tick = tick + casttime + delay;
- sd->canmove_tick = tick;
- if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1)
- skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
- if(casttime > 0) {
- sd->skilltimer = add_timer( tick+casttime, skill_castend_pos, sd->bl.id, 0 );
- if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
- sd->prev_speed = sd->speed;
- sd->speed = sd->speed*(175 - skill*5)/100;
- clif_updatestatus(sd,SP_SPEED);
- }
- else
- pc_stop_walking(sd,0);
- }
- else {
- sd->skilltimer = -1;
- skill_castend_pos(sd->skilltimer,tick,sd->bl.id,0);
- }
- //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
- if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER)
- skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1);
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹‰r¥ƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-int skill_castcancel(struct block_list *bl,int type)
-{
- int inf;
- int ret=0;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC){
- struct map_session_data *sd=(struct map_session_data *)bl;
- unsigned long tick=gettick();
- nullpo_retr(0, sd);
- sd->canact_tick=tick;
- sd->canmove_tick = tick;
- if( sd->skilltimer!=-1){
- if(pc_checkskill(sd,SA_FREECAST) > 0) {
- sd->speed = sd->prev_speed;
- clif_updatestatus(sd,SP_SPEED);
- }
- if(!type) {
- if((inf = skill_get_inf( sd->skillid )) == 2 || inf == 32)
- ret=delete_timer( sd->skilltimer, skill_castend_pos );
- else
- ret=delete_timer( sd->skilltimer, skill_castend_id );
- if(ret<0)
- printf("delete timer error : skillid : %d\n",sd->skillid);
- }
- else {
- if((inf = skill_get_inf( sd->skillid_old )) == 2 || inf == 32)
- ret=delete_timer( sd->skilltimer, skill_castend_pos );
- else
- ret=delete_timer( sd->skilltimer, skill_castend_id );
- if(ret<0)
- printf("delete timer error : skillid : %d\n",sd->skillid_old);
- }
- sd->skilltimer=-1;
- clif_skillcastcancel(bl);
- }
-
- return 0;
- }else if(bl->type==BL_MOB){
- struct mob_data *md=(struct mob_data *)bl;
- nullpo_retr(0, md);
- if( md->skilltimer!=-1 ){
- if((inf = skill_get_inf( md->skillid )) == 2 || inf == 32)
- ret=delete_timer( md->skilltimer, mobskill_castend_pos );
- else
- ret=delete_timer( md->skilltimer, mobskill_castend_id );
- md->skilltimer=-1;
- clif_skillcastcancel(bl);
- }
- if(ret<0)
- printf("delete timer error : skillid : %d\n",md->skillid);
- return 0;
- }
- return 1;
-}
-/*=========================================
- * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA ‰Šú”Í?Œˆ’è
- *----------------------------------------
- */
-void skill_brandishspear_first(struct square *tc,int dir,int x,int y){
-
- nullpo_retv(tc);
-
- if(dir == 0){
- tc->val1[0]=x-2;
- tc->val1[1]=x-1;
- tc->val1[2]=x;
- tc->val1[3]=x+1;
- tc->val1[4]=x+2;
- tc->val2[0]=
- tc->val2[1]=
- tc->val2[2]=
- tc->val2[3]=
- tc->val2[4]=y-1;
- }
- else if(dir==2){
- tc->val1[0]=
- tc->val1[1]=
- tc->val1[2]=
- tc->val1[3]=
- tc->val1[4]=x+1;
- tc->val2[0]=y+2;
- tc->val2[1]=y+1;
- tc->val2[2]=y;
- tc->val2[3]=y-1;
- tc->val2[4]=y-2;
- }
- else if(dir==4){
- tc->val1[0]=x-2;
- tc->val1[1]=x-1;
- tc->val1[2]=x;
- tc->val1[3]=x+1;
- tc->val1[4]=x+2;
- tc->val2[0]=
- tc->val2[1]=
- tc->val2[2]=
- tc->val2[3]=
- tc->val2[4]=y+1;
- }
- else if(dir==6){
- tc->val1[0]=
- tc->val1[1]=
- tc->val1[2]=
- tc->val1[3]=
- tc->val1[4]=x-1;
- tc->val2[0]=y+2;
- tc->val2[1]=y+1;
- tc->val2[2]=y;
- tc->val2[3]=y-1;
- tc->val2[4]=y-2;
- }
- else if(dir==1){
- tc->val1[0]=x-1;
- tc->val1[1]=x;
- tc->val1[2]=x+1;
- tc->val1[3]=x+2;
- tc->val1[4]=x+3;
- tc->val2[0]=y-4;
- tc->val2[1]=y-3;
- tc->val2[2]=y-1;
- tc->val2[3]=y;
- tc->val2[4]=y+1;
- }
- else if(dir==3){
- tc->val1[0]=x+3;
- tc->val1[1]=x+2;
- tc->val1[2]=x+1;
- tc->val1[3]=x;
- tc->val1[4]=x-1;
- tc->val2[0]=y-1;
- tc->val2[1]=y;
- tc->val2[2]=y+1;
- tc->val2[3]=y+2;
- tc->val2[4]=y+3;
- }
- else if(dir==5){
- tc->val1[0]=x+1;
- tc->val1[1]=x;
- tc->val1[2]=x-1;
- tc->val1[3]=x-2;
- tc->val1[4]=x-3;
- tc->val2[0]=y+3;
- tc->val2[1]=y+2;
- tc->val2[2]=y+1;
- tc->val2[3]=y;
- tc->val2[4]=y-1;
- }
- else if(dir==7){
- tc->val1[0]=x-3;
- tc->val1[1]=x-2;
- tc->val1[2]=x-1;
- tc->val1[3]=x;
- tc->val1[4]=x+1;
- tc->val2[1]=y;
- tc->val2[0]=y+1;
- tc->val2[2]=y-1;
- tc->val2[3]=y-2;
- tc->val2[4]=y-3;
- }
-
-}
-
-/*=========================================
- * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA •ûŒü”»’è ”Í??’£
- *-----------------------------------------
- */
-void skill_brandishspear_dir(struct square *tc,int dir,int are){
-
- int c;
-
- nullpo_retv(tc);
-
- for(c=0;c<5;c++){
- if(dir==0){
- tc->val2[c]+=are;
- }else if(dir==1){
- tc->val1[c]-=are; tc->val2[c]+=are;
- }else if(dir==2){
- tc->val1[c]-=are;
- }else if(dir==3){
- tc->val1[c]-=are; tc->val2[c]-=are;
- }else if(dir==4){
- tc->val2[c]-=are;
- }else if(dir==5){
- tc->val1[c]+=are; tc->val2[c]-=are;
- }else if(dir==6){
- tc->val1[c]+=are;
- }else if(dir==7){
- tc->val1[c]+=are; tc->val2[c]+=are;
- }
- }
-}
-
-/*==========================================
- * ƒfƒBƒ{?ƒVƒ‡ƒ“ —L?Šm”F
- *------------------------------------------
- */
-void skill_devotion(struct map_session_data *md,int target)
-{
- // ?Šm”F
- int n;
-
- nullpo_retv(md);
-
- for(n=0;n<5;n++){
- if(md->dev.val1[n]){
- struct map_session_data *sd = map_id2sd(md->dev.val1[n]);
- // ‘ŠŽè‚ªŒ©‚‚©‚ç‚È‚¢ // ‘ŠŽè‚ðƒfƒBƒ{‚µ‚Ä‚é‚Ì‚ªŽ©•ª‚¶‚á‚È‚¢ // ‹——£‚ª—£‚ê‚Ä‚é
- if( sd == NULL || (sd->sc_data && (md->bl.id != sd->sc_data[SC_DEVOTION].val1)) || skill_devotion3(&md->bl,md->dev.val1[n])){
- skill_devotion_end(md,sd,n);
- }
- }
- }
-}
-void skill_devotion2(struct block_list *bl,int crusader)
-{
- // ”íƒfƒBƒ{?ƒVƒ‡ƒ“‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
- struct map_session_data *sd = map_id2sd(crusader);
-
- nullpo_retv(bl);
-
- if(sd) skill_devotion3(&sd->bl,bl->id);
-}
-int skill_devotion3(struct block_list *bl,int target)
-{
- // ƒNƒ‹ƒZ‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
- struct map_session_data *md;
- struct map_session_data *sd;
- int n,r=0;
-
- nullpo_retr(1, bl);
-
- if( (md = (struct map_session_data *)bl) == NULL || (sd = map_id2sd(target)) == NULL )
- return 1;
- else
- r = distance(bl->x,bl->y,sd->bl.x,sd->bl.y);
-
- if(pc_checkskill(sd,CR_DEVOTION)+6 < r){ // ‹–—e”Í?‚ð’´‚¦‚Ä‚½
- for(n=0;n<5;n++)
- if(md->dev.val1[n]==target)
- md->dev.val2[n]=0; // —£‚ꂽŽž‚ÍA?‚ð؂邾‚¯
- clif_devotion(md,sd->bl.id);
- return 1;
- }
- return 0;
-}
-
-void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target)
-{
- // ƒNƒ‹ƒZ‚Æ”íƒfƒBƒ{ƒLƒƒƒ‰‚̃ŠƒZƒbƒg
- nullpo_retv(md);
- nullpo_retv(sd);
-
- md->dev.val1[target]=md->dev.val2[target]=0;
- if(sd && sd->sc_data){
- // skill_status_change_end(sd->bl,SC_DEVOTION,-1);
- sd->sc_data[SC_DEVOTION].val1=0;
- sd->sc_data[SC_DEVOTION].val2=0;
- clif_status_change(&sd->bl,SC_DEVOTION,0);
- clif_devotion(md,sd->bl.id);
- }
-}
-/*==========================================
- * ƒI?ƒgƒXƒyƒ‹
- *------------------------------------------
- */
-int skill_autospell(struct map_session_data *sd,int skillid)
-{
- int skilllv;
- int maxlv=1,lv;
-
- nullpo_retr(0, sd);
-
- skilllv = pc_checkskill(sd,SA_AUTOSPELL);
- if(skilllv <= 0) return 0;
-
- if(skillid==MG_NAPALMBEAT) maxlv=3;
- else if(skillid==MG_COLDBOLT || skillid==MG_FIREBOLT || skillid==MG_LIGHTNINGBOLT){
- if(skilllv==2) maxlv=1;
- else if(skilllv==3) maxlv=2;
- else if(skilllv>=4) maxlv=3;
- }
- else if(skillid==MG_SOULSTRIKE){
- if(skilllv==5) maxlv=1;
- else if(skilllv==6) maxlv=2;
- else if(skilllv>=7) maxlv=3;
- }
- else if(skillid==MG_FIREBALL){
- if(skilllv==8) maxlv=1;
- else if(skilllv>=9) maxlv=2;
- }
- else if(skillid==MG_FROSTDIVER) maxlv=1;
- else return 0;
-
- if(maxlv > (lv=pc_checkskill(sd,skillid)))
- maxlv = lv;
-
- skill_status_change_start(&sd->bl,SC_AUTOSPELL,skilllv,skillid,maxlv,0, // val1:ƒXƒLƒ‹ID val2:Žg—pÅ‘åLv
- skill_get_time(SA_AUTOSPELL,skilllv),0);// ‚É‚µ‚Ä‚Ý‚½‚¯‚Çbscript‚ª‘‚«ˆÕ‚¢???H
- return 0;
-}
-
-/*==========================================
- * ƒMƒƒƒ“ƒOƒXƒ^?ƒpƒ‰ƒ_ƒCƒX”»’è?—(foreachinarea)
- *------------------------------------------
- */
-
-static int skill_gangster_count(struct block_list *bl,va_list ap)
-{
- int *c;
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- c=va_arg(ap,int *);
-
- if(sd && c && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
- (*c)++;
- return 0;
-}
-
-static int skill_gangster_in(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- if(sd && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
- sd->state.gangsterparadise=1;
- return 0;
-}
-
-static int skill_gangster_out(struct block_list *bl,va_list ap)
-{
- struct map_session_data *sd;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- sd=(struct map_session_data*)bl;
- if(sd && sd->state.gangsterparadise)
- sd->state.gangsterparadise=0;
- return 0;
-}
-
-int skill_gangsterparadise(struct map_session_data *sd ,int type)
-{
- int range=1;
- int c=0;
-
- nullpo_retr(0, sd);
-
- if(pc_checkskill(sd,RG_GANGSTER) <= 0)
- return 0;
-
- if(type==1) {/* À‚Á‚½Žž‚Ì?— */
- map_foreachinarea(skill_gangster_count,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
- if(c > 0) {/*ƒMƒƒƒ“ƒOƒXƒ^?¬Œ÷‚µ‚½‚玩•ª‚É‚àƒMƒƒƒ“ƒOƒXƒ^??«•t?*/
- map_foreachinarea(skill_gangster_in,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC);
- sd->state.gangsterparadise = 1;
- }
- return 0;
- }
- else if(type==0) {/* —§‚¿ã‚ª‚Á‚½‚Æ‚«‚Ì?— */
- map_foreachinarea(skill_gangster_count,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
- if(c < 1)
- map_foreachinarea(skill_gangster_out,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC);
- sd->state.gangsterparadise = 0;
- return 0;
- }
- return 0;
-}
-/*==========================================
- * Š¦‚¢ƒWƒ‡?ƒN?ƒXƒNƒŠ?ƒ€”»’è?—(foreachinarea)
- *------------------------------------------
- */
-int skill_frostjoke_scream(struct block_list *bl,va_list ap)
-{
- struct block_list *src;
- int skillnum,skilllv;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
-
- skillnum=va_arg(ap,int);
- skilllv=va_arg(ap,int);
- if(skilllv <= 0) return 0;
- tick=va_arg(ap,unsigned int);
-
- if(src == bl)//Ž©•ª‚É‚Í?‚©‚È‚¢
- return 0;
-
- if(battle_check_target(src,bl,BCT_ENEMY) > 0)
- skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
- else if(battle_check_target(src,bl,BCT_PARTY) > 0) {
- if(rand()%100 < 10)//PTƒƒ“ƒo‚É‚à’áŠm—¦‚Å‚©‚©‚é(‚Æ‚è‚ ‚¦‚¸10%)
- skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
- }
-
- return 0;
-}
-
-/*==========================================
- *ƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚ÌŽg—pƒXƒLƒ‹Œˆ’è(Œˆ’èƒXƒLƒ‹‚ªƒ_ƒ‚È‚ç0‚ð•Ô‚·)
- *------------------------------------------
- */
-int skill_abra_dataset(int skilllv)
-{
- if(skilllv <= 0) return 0;
- int skill = rand()%331;
- //db‚ÉŠî‚­ƒŒƒxƒ‹?Šm—¦”»’è
- if(skill_abra_db[skill].req_lv > skilllv || rand()%10000 >= skill_abra_db[skill].per) return 0;
- //NPCƒXƒLƒ‹‚̓_ƒ
- if(skill >= NPC_PIERCINGATT && skill <= NPC_SUMMONMONSTER) return 0;
- //‰‰‘tƒXƒLƒ‹‚̓_ƒ
- if(skill_is_danceskill(skill)) return 0;
-
- return skill;
-}
-
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_attack_area(struct block_list *bl,va_list ap)
-{
- struct block_list *src,*dsrc;
- int atk_type,skillid,skilllv,flag,type;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- atk_type = va_arg(ap,int);
- if((src=va_arg(ap,struct block_list*)) == NULL)
- return 0;
- if((dsrc=va_arg(ap,struct block_list*)) == NULL)
- return 0;
- skillid=va_arg(ap,int);
- skilllv=va_arg(ap,int);
- if(skilllv <= 0) return 0;
- tick=va_arg(ap,unsigned int);
- flag=va_arg(ap,int);
- type=va_arg(ap,int);
-
- if(battle_check_target(dsrc,bl,type) > 0)
- skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag);
-
- return 0;
-}
-/*==========================================
- *
- *------------------------------------------
- */
-int skill_clear_element_field(struct block_list *bl)
-{
- struct mob_data *md=NULL;
- struct map_session_data *sd=NULL;
- int i,skillid;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_MOB)
- md=(struct mob_data *)bl;
- if(bl->type==BL_PC)
- sd=(struct map_session_data *)bl;
-
- for(i=0;i<MAX_MOBSKILLUNITGROUP;i++){
- if(sd){
- skillid=sd->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
- skill_delunitgroup(&sd->skillunit[i]);
- }else if(md){
- skillid=md->skillunit[i].skill_id;
- if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
- skill_delunitgroup(&md->skillunit[i]);
- }
- }
- return 0;
-}
-/*==========================================
- * ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^?ƒ`ƒFƒbƒN(foreachinarea)
- *------------------------------------------
- */
-int skill_landprotector(struct block_list *bl, va_list ap )
-{
- int skillid;
- int *alive;
- struct skill_unit *unit;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- skillid=va_arg(ap,int);
- alive=va_arg(ap,int *);
- if((unit=(struct skill_unit *)bl) == NULL)
- return 0;
-
- if(skillid==SA_LANDPROTECTOR){
- skill_delunit(unit);
- }else{
- if(alive && unit->group->skill_id==SA_LANDPROTECTOR)
- (*alive)=0;
- }
- return 0;
-}
-/*==========================================
- * ƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œ?—(foreachinarea)
- *------------------------------------------
- */
-int skill_idun_heal(struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- int heal;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit = va_arg(ap,struct skill_unit *));
- nullpo_retr(0, sg = unit->group);
-
- heal=30+sg->skill_lv*5+((sg->val1)>>16)*5+((sg->val1)&0xfff)/2;
-
- if(bl->type == BL_SKILL || bl->id == sg->src_id)
- return 0;
-
- if(bl->type == BL_PC || bl->type == BL_MOB){
- clif_skill_nodamage(&unit->bl,bl,AL_HEAL,heal,1);
- battle_heal(NULL,bl,heal,0,0);
- }
- return 0;
-}
-
-/*==========================================
- * Žw’è”Í??‚Åsrc‚É?‚µ‚Ä—L?‚ȃ^?ƒQƒbƒg‚Ìbl‚Ì?‚ð?‚¦‚é(foreachinarea)
- *------------------------------------------
- */
-int skill_count_target(struct block_list *bl, va_list ap ){
- struct block_list *src;
- int *c;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
-
- if((src = va_arg(ap,struct block_list *)) == NULL)
- return 0;
- if((c = va_arg(ap,int *)) == NULL)
- return 0;
- if(battle_check_target(src,bl,BCT_ENEMY) > 0)
- (*c)++;
- return 0;
-}
-/*==========================================
- * ƒgƒ‰ƒbƒv”Í??—(foreachinarea)
- *------------------------------------------
- */
-int skill_trap_splash(struct block_list *bl, va_list ap )
-{
- struct block_list *src;
- int tick;
- int splash_count;
- struct skill_unit *unit;
- struct skill_unit_group *sg;
- struct block_list *ss;
- int i;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src = va_arg(ap,struct block_list *));
- nullpo_retr(0, unit = (struct skill_unit *)src);
- nullpo_retr(0, sg = unit->group);
- nullpo_retr(0, ss = map_id2bl(sg->src_id));
-
- tick = va_arg(ap,int);
- splash_count = va_arg(ap,int);
-
- if(battle_check_target(src,bl,BCT_ENEMY) > 0){
- switch(sg->unit_id){
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
- break;
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- for(i=0;i<splash_count;i++){
- skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
- }
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- skill_attack(BF_WEAPON, ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
- break;
- default:
- break;
- }
- }
-
- return 0;
-}
-/*----------------------------------------------------------------------------
- * ƒXƒe?ƒ^ƒXˆÙí
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíƒ^ƒCƒ}?”Í??—
- *------------------------------------------
- */
-int skill_status_change_timer_sub(struct block_list *bl, va_list ap )
-{
- struct block_list *src;
- int type;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
- type=va_arg(ap,int);
- tick=va_arg(ap,unsigned int);
-
- if(bl->type!=BL_PC && bl->type!=BL_MOB)
- return 0;
-
- switch( type ){
- case SC_SIGHT: /* ƒTƒCƒg */
- case SC_CONCENTRATE:
- if( (*battle_get_option(bl))&6 ){
- skill_status_change_end( bl, SC_HIDING, -1);
- skill_status_change_end( bl, SC_CLOAKING, -1);
- }
- break;
- case SC_RUWACH: /* ƒ‹ƒAƒt */
- if( (*battle_get_option(bl))&6 ){
- skill_status_change_end( bl, SC_HIDING, -1);
- skill_status_change_end( bl, SC_CLOAKING, -1);
- if(battle_check_target( src,bl, BCT_ENEMY ) > 0) {
- struct status_change *sc_data = battle_get_sc_data(bl);
- skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
- }
- }
- break;
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíI—¹
- *------------------------------------------
- */
-int skill_status_change_end(struct block_list* bl, int type, int tid)
-{
- struct status_change* sc_data;
- int opt_flag=0, calc_flag = 0;
- short *sc_count, *option, *opt1, *opt2, *opt3;
-
- nullpo_retr(0, bl);
- if(bl->type!=BL_PC && bl->type!=BL_MOB) {
- if(battle_config.error_log)
- printf("skill_status_change_end: neither MOB nor PC !\n");
- return 0;
- }
- nullpo_retr(0, sc_data = battle_get_sc_data(bl));
- nullpo_retr(0, sc_count = battle_get_sc_count(bl));
- nullpo_retr(0, option = battle_get_option(bl));
- nullpo_retr(0, opt1 = battle_get_opt1(bl));
- nullpo_retr(0, opt2 = battle_get_opt2(bl));
- nullpo_retr(0, opt3 = battle_get_opt3(bl));
-
- if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) {
-
- if (tid == -1) // ƒ^ƒCƒ}‚©‚çŒÄ‚΂ê‚Ä‚¢‚È‚¢‚È‚çƒ^ƒCƒ}íœ‚ð‚·‚é
- delete_timer(sc_data[type].timer,skill_status_change_timer);
-
- /* ŠY?‚̈Ùí‚ð³í‚É?‚· */
- sc_data[type].timer=-1;
- (*sc_count)--;
-
- switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- case SC_CONCENTRATE: /* W’†—ÍŒüã */
- case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
- case SC_INCREASEAGI: /* ‘¬“x㸠*/
- case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- case SC_HIDING:
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- case SC_GLORIA: /* ƒOƒƒŠƒA */
- case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case SC_VOLCANO:
- case SC_DELUGE:
- case SC_VIOLENTGALE:
- case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
- case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case SC_WHISTLE: /* Œû“J */
- case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
- case SC_FORTUNE: /* K‰^‚̃LƒX */
- case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- case SC_STEELBODY: // ‹à„
- case SC_DEFENDER:
- case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case SC_RIDING:
- case SC_BLADESTOP_WAIT:
- case SC_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- case SC_ASSUMPTIO: /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
- case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case SC_MAGICPOWER: /* –‚–@—Í?• */
- case SC_CHASEWALK:
- case SC_ATKPOT: /* attack potion [Valaris] */
- case SC_MATKPOT: /* magic attack potion [Valaris] */
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case SC_EDP: // Celest
- case SC_MARIONETTE:
- case SC_MARIONETTE2:
- calc_flag = 1;
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- calc_flag = 1;
- clif_status_change(bl,SC_INCREASEAGI,0); /* ƒAƒCƒRƒ“Á‹Ž */
- break;
- case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- {
- struct map_session_data *md = map_id2sd(sc_data[type].val1);
- sc_data[type].val1=sc_data[type].val2=0;
- skill_devotion(md,bl->id);
- calc_flag = 1;
- }
- break;
- case SC_BLADESTOP:
- {
- struct status_change *t_sc_data = battle_get_sc_data((struct block_list *)sc_data[type].val4);
- //•Ð•û‚ªØ‚ꂽ‚Ì‚Å‘ŠŽè‚Ì”’n?‘Ô‚ªØ‚ê‚Ä‚È‚¢‚Ì‚È‚ç‰ðœ
- if(t_sc_data && t_sc_data[SC_BLADESTOP].timer!=-1)
- skill_status_change_end((struct block_list *)sc_data[type].val4,SC_BLADESTOP,-1);
-
- if(sc_data[type].val2==2)
- clif_bladestop((struct block_list *)sc_data[type].val3,(struct block_list *)sc_data[type].val4,0);
- }
- break;
- case SC_DANCING:
- {
- struct map_session_data *dsd;
- struct status_change *d_sc_data;
- if(sc_data[type].val4 && (dsd=map_id2sd(sc_data[type].val4))){
- d_sc_data = dsd->sc_data;
- //‡‘t‚Å‘ŠŽè‚ª‚¢‚éꇑŠŽè‚Ìval4‚ð0‚É‚·‚é
- if(d_sc_data && d_sc_data[type].timer!=-1)
- d_sc_data[type].val4=0;
- }
- }
- calc_flag = 1;
- break;
- case SC_GRAFFITI:
- {
- struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[type].val4; //val4‚ªƒOƒ‰ƒtƒBƒeƒB‚Ìgroup_id
- if(sg)
- skill_delunitgroup(sg);
- }
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- {
- struct map_session_data *sd=NULL;
- if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
- sd->status.manner = 0;
- clif_updatestatus(sd,SP_MANNER);
- }
- }
- break;
- case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- {
- struct block_list *src=map_id2bl(sc_data[type].val3);
- if(src && tid!=-1){
- //Ž©•ª‚Ƀ_ƒ?ƒW•Žü?3*3‚Ƀ_ƒ?ƒW
- skill_castend_damage_id(src, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* Ž©”š */
- {
- //Ž©•ª‚̃_ƒ?ƒW‚Í0‚É‚µ‚Ä
- struct mob_data *md=NULL;
- if(bl->type == BL_MOB && (md=(struct mob_data*)bl))
- skill_castend_damage_id(bl, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
- }
- break;
- /* option1 */
- case SC_FREEZE:
- sc_data[type].val3 = 0;
- break;
-
- /* option2 */
- case SC_POISON: /* “Å */
- case SC_BLIND: /* ˆÃ? */
- case SC_CURSE:
- calc_flag = 1;
- break;
- }
-
- if(bl->type==BL_PC && type<SC_SENDMAX)
- clif_status_change(bl,type,0); /* ƒAƒCƒRƒ“Á‹Ž */
-
- switch(type){ /* ³í‚É?‚é‚Æ‚«‚È‚É‚©?—‚ª•K—v */
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- *opt1 = 0;
- opt_flag = 1;
- break;
-
- case SC_POISON:
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 &= ~(1<<(type-SC_POISON));
- opt_flag = 1;
- break;
-
- case SC_SIGNUMCRUCIS:
- *opt2 &= ~0x40;
- opt_flag = 1;
- break;
-
- case SC_HIDING:
- case SC_CLOAKING:
- *option &= ~((type == SC_HIDING) ? 2 : 4);
- opt_flag = 1 ;
- break;
-
- case SC_CHASEWALK:
- *option &= ~16388;
- opt_flag = 1 ;
- break;
-
- case SC_SIGHT:
- *option &= ~1;
- opt_flag = 1;
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- *option &= ~4096;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option &= ~8192;
- opt_flag = 1;
- break;
-
- //opt3
- case SC_TWOHANDQUICKEN: /* 2HQ */
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- *opt3 &= ~1;
- break;
- case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
- *opt3 &= ~2;
- break;
- case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
- *opt3 &= ~4;
- break;
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- *opt3 &= ~8;
- break;
- case SC_STEELBODY: // ‹à„
- *opt3 &= ~16;
- break;
- case SC_BLADESTOP: /* ”’nŽæ‚è */
- *opt3 &= ~32;
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- *opt3 &= ~128;
- break;
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- *opt3 &= ~1024;
- break;
- case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
- *opt3 &= ~2048;
- break;
- }
-
- if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 && bl->type == BL_PC) { // by [Yor]
- *opt2 |= STATE_BLIND;
- opt_flag = 1;
- }
-
- if(opt_flag) /* option‚Ì?X‚ð?‚¦‚é */
- clif_changeoption(bl);
-
- if (bl->type == BL_PC && calc_flag)
- pc_calcstatus((struct map_session_data *)bl,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
- }
-
- return 0;
-}
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíI—¹ƒ^ƒCƒ}?
- *------------------------------------------
- */
-int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
-{
- int type=data;
- struct block_list *bl;
- struct map_session_data *sd=NULL;
- struct status_change *sc_data;
- //short *sc_count; //Žg‚Á‚Ä‚È‚¢H
-
- if( (bl=map_id2bl(id)) == NULL )
- return 0; //ŠY?ID‚ª‚·‚Å‚ÉÁ–Å‚µ‚Ä‚¢‚é‚Æ‚¢‚¤‚Ì‚Í‚¢‚©‚É‚à‚ ‚è‚»‚¤‚Ȃ̂ŃXƒ‹?‚µ‚Ä‚Ý‚é
- nullpo_retr(0, sc_data=battle_get_sc_data(bl));
-
- if(bl->type==BL_PC)
- sd=(struct map_session_data *)bl;
-
- //sc_count=battle_get_sc_count(bl); //Žg‚Á‚Ä‚È‚¢H
-
- if(sc_data[type].timer != tid) {
- if(battle_config.error_log)
- printf("skill_status_change_timer %d != %d\n",tid,sc_data[type].timer);
- }
-
- switch(type){ /* “ÁŽê‚È?—‚É‚È‚éê‡ */
- case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
- case SC_CLOAKING:
- if(sd){
- if( sd->status.sp > 0 ){ /* SPØ‚ê‚é‚Ü‚ÅŽ? */
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- sc_data[type].val2+tick, skill_status_change_timer, bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_CHASEWALK:
- if(sd){
- if( sd->status.sp > 19+sc_data[SC_CHASEWALK].val1*3){
- sd->status.sp-=(19+(sc_data[SC_CHASEWALK].val1*3)); // update sp cost [Celest]
- clif_updatestatus(sd,SP_SP);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- sc_data[type].val2+tick, skill_status_change_timer, bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- if(sd){ /* SP‚ª‚ ‚Á‚ÄAŽžŠÔ§ŒÀ‚ÌŠÔ‚ÍŽ? */
- if( sd->status.sp > 0 && (--sc_data[type].val2)>0 ){
- if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_SIGHT: /* ƒTƒCƒg */
- {
- const int range=7;
- map_foreachinarea( skill_status_change_timer_sub,
- bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
- bl,type,tick);
-
- if( (--sc_data[type].val2)>0 ){
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 250+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_RUWACH: /* ƒ‹ƒAƒt */
- {
- const int range=5;
- map_foreachinarea( skill_status_change_timer_sub,
- bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
- bl,type,tick);
-
- if( (--sc_data[type].val2)>0 ){
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 250+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
-
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- {
- int race = battle_get_race(bl);
- if(race == 6 || battle_check_undead(race,battle_get_elem_type(bl))) {
- sc_data[type].timer=add_timer(1000*600+tick,skill_status_change_timer, bl->id, data );
- return 0;
- }
- }
- break;
-
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN/ƒI?ƒgƒo?ƒT?ƒN */
- if(sc_data[type].val2!=0){ /* ƒI?ƒgƒo?ƒT?ƒNi‚P•b‚²‚Æ‚ÉHPƒ`ƒFƒbƒNj */
- if(sd && sd->status.hp>sd->status.max_hp>>2) /* ’âŽ~ */
- break;
- sc_data[type].timer=add_timer( 1000+tick,skill_status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_WATERBALL: /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
- {
- struct block_list *target=map_id2bl(sc_data[type].val2);
- if(target==NULL || target->prev==NULL)
- break;
- skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0);
- if((--sc_data[type].val3)>0) {
- sc_data[type].timer=add_timer( 150+tick,skill_status_change_timer, bl->id, data );
- return 0;
- }
- }
- break;
-
- case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- if(sd && sd->special_state.infinite_endure) {
- sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data );
- sc_data[type].val2=1;
- return 0;
- }
- break;
-
- case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
- if( (--sc_data[type].val2)>0){
- struct skill_unit *unit=
- (struct skill_unit *)sc_data[type].val4;
- struct block_list *src;
-
- if(!unit || !unit->group)
- break;
- src=map_id2bl(unit->group->src_id);
- if(!src)
- break;
- skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0);
- sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick,
- skill_status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_LULLABY: /* ŽqŽç‰S */
- if( (--sc_data[type].val2)>0){
- struct skill_unit *unit=
- (struct skill_unit *)sc_data[type].val4;
- if(!unit || !unit->group || unit->group->src_id==bl->id)
- break;
- skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick);
- sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick,
- skill_status_change_timer, bl->id, data );
- return 0;
- }
- break;
-
- case SC_STONE:
- if(sc_data[type].val2 != 0) {
- short *opt1 = battle_get_opt1(bl);
- sc_data[type].val2 = 0;
- sc_data[type].val4 = 0;
- battle_stopwalking(bl,1);
- if(opt1) {
- *opt1 = 1;
- clif_changeoption(bl);
- }
- sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
- return 0;
- }
- else if( (--sc_data[type].val3) > 0) {
- int hp = battle_get_max_hp(bl);
- if((++sc_data[type].val4)%5 == 0 && battle_get_hp(bl) > hp>>2) {
- hp = hp/100;
- if(hp < 1) hp = 1;
- if(bl->type == BL_PC)
- pc_heal((struct map_session_data *)bl,-hp,0);
- else if(bl->type == BL_MOB){
- struct mob_data *md;
- if((md=((struct mob_data *)bl)) == NULL)
- break;
- md->hp -= hp;
- }
- }
- sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
- return 0;
- }
- break;
- case SC_POISON:
- if(sc_data[SC_SLOWPOISON].timer == -1) {
- if( (--sc_data[type].val3) > 0) {
- int hp = battle_get_max_hp(bl);
- if(battle_get_hp(bl) > hp>>2) {
- if(bl->type == BL_PC) {
- hp = 3 + hp*3/200;
- pc_heal((struct map_session_data *)bl,-hp,0);
- }
- else if(bl->type == BL_MOB) {
- struct mob_data *md;
- if((md=((struct mob_data *)bl)) == NULL)
- break;
- hp = 3 + hp/200;
- md->hp -= hp;
- }
- }
- sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
- }
- }
- else
- sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
- break;
- case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- if(sd){ /* SP‚ª‚ ‚Á‚ÄAHP‚ª?ƒ^ƒ“‚Å‚È‚¯‚ê‚Î?? */
- if( sd->status.sp > 12 && sd->status.max_hp > sd->status.hp ){
-/* if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
- sd->status.sp -= 12;
- clif_updatestatus(sd,SP_SP);
- } */
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 10000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- if(sd->status.max_hp <= sd->status.hp)
- skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
- }
- break;
-
- /* ŽžŠÔØ‚ê–³‚µHH */
- case SC_AETERNA:
- case SC_TRICKDEAD:
- case SC_RIDING:
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_MAGICPOWER: /* –‚–@—Í?• */
- case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- if(sc_data[type].timer==tid)
- sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data );
- return 0;
-
- case SC_DANCING: //ƒ_ƒ“ƒXƒXƒLƒ‹‚ÌŽžŠÔSPÁ”ï
- {
- int s=0;
- if(sd){
- if(sd->status.sp > 0 && (--sc_data[type].val3)>0){
- switch(sc_data[type].val1){
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ 3•b‚ÉSP1 */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« 3•b‚ÉSP1 */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö 3•b‚ÉSP1 */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh 3•b‚ÉSP1 */
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ 3•b‚ÅSP1 */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX 3•b‚ÅSP1 */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX 3•b‚ÅSP1 */
- s=3;
- break;
- case BD_LULLABY: /* ŽqŽç‰Ì 4•b‚ÉSP1 */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× 4•b‚ÉSP1 */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ 4•b‚ÉSP1 */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX 4•b‚ÅSP1 */
- s=4;
- break;
- case BD_INTOABYSS: /* [•£‚Ì’†‚É 5•b‚ÉSP1 */
- case BA_WHISTLE: /* Œû“J 5•b‚ÅSP1 */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO 5•b‚ÅSP1 */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ 5•b‚ÅSP1 */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? 5•b‚ÅSP1 */
- s=5;
- break;
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç 6•b‚ÅSP1 */
- s=6;
- break;
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc 10•b‚ÅSP1 */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç 10•b‚ÅSP1H */
- s=10;
- break;
- }
- if(s && ((sc_data[type].val3 % s) == 0)){
- sd->status.sp--;
- clif_updatestatus(sd,SP_SP);
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- }
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- if(sd){ /* HP‚ª100ˆÈã‚È‚ç?? */
- if( (sd->status.hp - sd->status.hp/100) > 100 ){
- sd->status.hp -= sd->status.hp/100;
- clif_updatestatus(sd,SP_HP);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 15000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- if(sd){
- time_t timer;
- if(time(&timer) < ((sc_data[type].val2) + 3600)){ //1ŽžŠÔ‚½‚Á‚Ä‚¢‚È‚¢‚Ì‚Å??
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 10000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- if(sd && battle_config.muting_players){
- time_t timer;
- if((++sd->status.manner) && time(&timer) < ((sc_data[type].val2) + 60*(0-sd->status.manner))){ //ŠJŽn‚©‚çstatus.manner•ª?‚Á‚Ä‚È‚¢‚Ì‚Å??
- clif_updatestatus(sd,SP_MANNER);
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è(60•b) */
- 60000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- }
- break;
- case SC_SELFDESTRUCTION: /* Ž©”š */
- if(--sc_data[type].val3>0){
- struct mob_data *md;
- if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->speed > 250){
- md->speed -= 250;
- md->next_walktime=tick;
- }
- sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
- 1000+tick, skill_status_change_timer,
- bl->id, data);
- return 0;
- }
- break;
- }
-
- return skill_status_change_end( bl,type,tid );
-}
-
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíI—¹
- *------------------------------------------
- */
-int skill_encchant_eremental_end(struct block_list *bl,int type)
-{
- struct status_change *sc_data;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, sc_data=battle_get_sc_data(bl));
-
- if( type!=SC_ENCPOISON && sc_data[SC_ENCPOISON].timer!=-1 ) /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‰ðœ */
- skill_status_change_end(bl,SC_ENCPOISON,-1);
- if( type!=SC_ASPERSIO && sc_data[SC_ASPERSIO].timer!=-1 ) /* ƒAƒXƒyƒ‹ƒVƒI‰ðœ */
- skill_status_change_end(bl,SC_ASPERSIO,-1);
- if( type!=SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer!=-1 ) /* ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ‰ðœ */
- skill_status_change_end(bl,SC_FLAMELAUNCHER,-1);
- if( type!=SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer!=-1 ) /* ƒtƒƒXƒgƒEƒFƒ|ƒ“‰ðœ */
- skill_status_change_end(bl,SC_FROSTWEAPON,-1);
- if( type!=SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer!=-1 ) /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_?‰ðœ */
- skill_status_change_end(bl,SC_LIGHTNINGLOADER,-1);
- if( type!=SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer!=-1 ) /* ƒTƒCƒXƒ~ƒbƒNƒEƒFƒ|ƒ“‰ðœ */
- skill_status_change_end(bl,SC_SEISMICWEAPON,-1);
-
- return 0;
-}
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙíŠJŽn
- *------------------------------------------
- */
-int skill_status_change_start(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag)
-{
- struct map_session_data *sd = NULL;
- struct status_change* sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int opt_flag = 0, calc_flag = 0,updateflag = 0, race, mode, elem, undead_flag;
- int scdef=0;
-
- nullpo_retr(0, bl);
- if(bl->type == BL_SKILL)
- return 0;
- nullpo_retr(0, sc_data=battle_get_sc_data(bl));
- nullpo_retr(0, sc_count=battle_get_sc_count(bl));
- nullpo_retr(0, option=battle_get_option(bl));
- nullpo_retr(0, opt1=battle_get_opt1(bl));
- nullpo_retr(0, opt2=battle_get_opt2(bl));
- nullpo_retr(0, opt3=battle_get_opt3(bl));
-
-
- race=battle_get_race(bl);
- mode=battle_get_mode(bl);
- elem=battle_get_elem_type(bl);
- undead_flag=battle_check_undead(race,elem);
-
- if(type == SC_AETERNA && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1) )
- return 0;
-
- switch(type){
- case SC_STONE:
- case SC_FREEZE:
- scdef=3+battle_get_mdef(bl)+battle_get_luk(bl)/3;
- break;
- case SC_STAN:
- case SC_SILENCE:
- case SC_POISON:
- scdef=3+battle_get_vit(bl)+battle_get_luk(bl)/3;
- break;
- case SC_SLEEP:
- case SC_BLIND:
- scdef=3+battle_get_int(bl)+battle_get_luk(bl)/3;
- break;
- case SC_CURSE:
- scdef=3+battle_get_luk(bl);
- break;
-
-// case SC_CONFUSION:
- default:
- scdef=0;
- }
- if(scdef>=100)
- return 0;
- if(bl->type==BL_PC){
- sd=(struct map_session_data *)bl;
- if( sd && type == SC_ADRENALINE && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)))
- return 0;
-
- if(SC_STONE<=type && type<=SC_BLIND){ /* ƒJ?ƒh‚É‚æ‚é‘Ï« */
- if( sd && sd->reseff[type-SC_STONE] > 0 && rand()%10000<sd->reseff[type-SC_STONE]){
- if(battle_config.battle_log)
- printf("PC %d skill_sc_start: card‚É‚æ‚éˆÙí‘Ï«?“®\n",sd->bl.id);
- return 0;
- }
- }
- }
- else if(bl->type == BL_MOB) {
- }
- else {
- if(battle_config.error_log)
- printf("skill_status_change_start: neither MOB nor PC !\n");
- return 0;
- }
-
- if(type==SC_FREEZE && undead_flag && !(flag&1))
- return 0;
-
- if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) &&
- sc_data[type].timer != -1 && sc_data[type].val2 && !val2)
- return 0;
-
- if(mode & 0x20 && (type==SC_STONE || type==SC_FREEZE ||
- type==SC_STAN || type==SC_SLEEP || type==SC_SILENCE || type==SC_QUAGMIRE || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS || type == SC_PROVOKE ||
- (type == SC_BLESSING && (undead_flag || race == 6))) && !(flag&1)){
- /* ƒ{ƒX‚É‚Í?‚©‚È‚¢(‚½‚¾‚µƒJ?ƒh‚É‚æ‚é?‰Ê‚Í“K—p‚³‚ê‚é) */
- return 0;
- }
- if(type==SC_FREEZE || type==SC_STAN || type==SC_SLEEP)
- battle_stopwalking(bl,1);
-
- if(sc_data[type].timer != -1){ /* ‚·‚Å‚É“¯‚¶ˆÙí‚É‚È‚Á‚Ä‚¢‚éꇃ^ƒCƒ}‰ðœ */
- if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION &&
- type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2
- && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
- return 0;
- if(type >=SC_STAN && type <= SC_BLIND)
- return 0;/* ?‚¬‘«‚µ‚ª‚Å‚«‚È‚¢?‘ÔˆÙí‚Å‚ ‚鎞‚Í?‘ÔˆÙí‚ðs‚í‚È‚¢ */
- if(type == SC_GRAFFITI){ //ˆÙí’†‚É‚à‚¤ˆê“x?‘ÔˆÙí‚É‚È‚Á‚½Žž‚ɉ𜂵‚Ä‚©‚çÄ“x‚©‚©‚é
- skill_status_change_end(bl,type,-1);
- }else{
- (*sc_count)--;
- delete_timer(sc_data[type].timer, skill_status_change_timer);
- sc_data[type].timer = -1;
- }
- }
-
- switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
- case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
- calc_flag = 1;
- if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
- break;
- case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
- if(tick <= 0) tick = 1000 * 60;
- val2 = 7; // [Celest]
- break;
- case SC_CONCENTRATE: /* W’†—ÍŒüã */
- calc_flag = 1;
- break;
- case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
- {
- if(bl->type == BL_PC || (!undead_flag && race != 6)) {
- if(sc_data[SC_CURSE].timer!=-1 )
- skill_status_change_end(bl,SC_CURSE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2 == 0)
- skill_status_change_end(bl,SC_STONE,-1);
- }
- calc_flag = 1;
- }
- break;
- case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
- calc_flag = 1;
- break;
- case SC_INCREASEAGI: /* ‘¬“x㸠*/
- calc_flag = 1;
- if(sc_data[SC_DECREASEAGI].timer!=-1 )
- skill_status_change_end(bl,SC_DECREASEAGI,-1);
- if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- skill_status_change_end(bl,SC_WINDWALK,-1);
- break;
- case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
- calc_flag = 1;
- if(sc_data[SC_INCREASEAGI].timer!=-1 )
- skill_status_change_end(bl,SC_INCREASEAGI,-1);
- break;
- case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
- calc_flag = 1;
-// val2 = 14 + val1;
- val2 = 10 + val1*2;
- tick = 600*1000;
- clif_emotion(bl,4);
- break;
- case SC_SLOWPOISON:
- if(sc_data[SC_POISON].timer == -1 )
- return 0;
- break;
- case SC_TWOHANDQUICKEN: /* 2HQ */
- *opt3 |= 1;
- calc_flag = 1;
- break;
- case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
- calc_flag = 1;
- break;
- case SC_WEAPONPERFECTION: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
- if(battle_config.party_skill_penaly && !val2) tick /= 5;
- break;
- case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
- *opt3 |= 2;
- if(battle_config.party_skill_penaly && !val2) tick /= 10;
- break;
- case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ?(SP‚ª1Œ¸‚鎞ŠÔ,val2‚É‚à) */
- if(bl->type == BL_PC)
- val2 = tick;
- else
- tick = 5000*val1;
- break;
- case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
- calc_flag = 1;
- val2=(((val1 - 1) / 2) + 3)*100; /* “Å•t?Šm—¦ */
- skill_encchant_eremental_end(bl,SC_ENCPOISON);
- break;
- case SC_EDP: // [Celest]
- calc_flag = 1;
- break;
- case SC_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
- val2=val1/2 + val1%2; // [Celest]
- break;
- case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
- calc_flag = 1;
- break;
- case SC_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
- skill_encchant_eremental_end(bl,SC_ASPERSIO);
- break;
- case SC_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒ€ */
- case SC_BENEDICTIO: /* ¹? */
- case SC_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
- case SC_AETERNA: /* ƒG?ƒeƒ‹ƒi */
- break;
- case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
- *opt3 |= 4;
- break;
- case SC_MAGICROD:
- val2 = val1*20;
- break;
- case SC_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
- val2 = battle_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* ‘Ï‹v“x */
- val3 = (val1 / 2 + 5); /* ‰ñ? */
-// -- moonsoul (added to undo assumptio status if target has it)
- if(sc_data[SC_ASSUMPTIO].timer!=-1 )
- skill_status_change_end(bl,SC_ASSUMPTIO,-1);
- break;
- case SC_MINDBREAKER:
- calc_flag = 1;
- if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
- case SC_GLORIA: /* ƒOƒƒŠƒA */
- calc_flag = 1;
- break;
- case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
- calc_flag = 1;
- break;
- case SC_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
- break;
- case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
- calc_flag = 1;
- if(sc_data[SC_CONCENTRATE].timer!=-1 ) /* W’†—ÍŒüã‰ðœ */
- skill_status_change_end(bl,SC_CONCENTRATE,-1);
- if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
- skill_status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
- skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
- skill_status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc_data[SC_ADRENALINE].timer!=-1 )
- skill_status_change_end(bl,SC_ADRENALINE,-1);
- if(sc_data[SC_LOUD].timer!=-1 )
- skill_status_change_end(bl,SC_LOUD,-1);
- if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
- skill_status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- skill_status_change_end(bl,SC_WINDWALK,-1);
- if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
- skill_status_change_end(bl,SC_CARTBOOST,-1);
- break;
- case SC_FLAMELAUNCHER: /* ƒtƒŒ?ƒ€ƒ‰ƒ“ƒ`ƒƒ? */
- skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER);
- break;
- case SC_FROSTWEAPON: /* ƒtƒƒXƒgƒEƒFƒ|ƒ“ */
- skill_encchant_eremental_end(bl,SC_FROSTWEAPON);
- break;
- case SC_LIGHTNINGLOADER: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_? */
- skill_encchant_eremental_end(bl,SC_LIGHTNINGLOADER);
- break;
- case SC_SEISMICWEAPON: /* ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“ */
- skill_encchant_eremental_end(bl,SC_SEISMICWEAPON);
- break;
- case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
- calc_flag = 1;
- break;
- case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
- calc_flag = 1;
- val2=val1*5;
- break;
- case SC_REFLECTSHIELD:
- val2=10+val1*3;
- break;
- case SC_STRIPWEAPON:
- case SC_STRIPSHIELD:
- case SC_STRIPARMOR:
- case SC_STRIPHELM:
- case SC_CP_WEAPON:
- case SC_CP_SHIELD:
- case SC_CP_ARMOR:
- case SC_CP_HELM:
- break;
-
- case SC_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
- val4 = 5 + val1*2;
- break;
-
- case SC_VOLCANO:
- calc_flag = 1;
- val3 = val1*10;
- val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- break;
- case SC_DELUGE:
- calc_flag = 1;
- val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) );
- val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- break;
- case SC_VIOLENTGALE:
- calc_flag = 1;
- val3 = val1*3;
- val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
- break;
-
- case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
- calc_flag = 1;
- val2 = 20+val1;
- *opt3 |= 1;
- break;
- case SC_COMBO:
- break;
- case SC_BLADESTOP_WAIT: /* ”’nŽæ‚è(‘Ò‚¿) */
- break;
- case SC_BLADESTOP: /* ”’nŽæ‚è */
- if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1);
- *opt3 |= 32;
- break;
-
- case SC_LULLABY: /* ŽqŽç‰S */
- val2 = 11;
- break;
- case SC_RICHMANKIM:
- break;
- case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
- calc_flag = 1;
- break;
- case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- calc_flag = 1;
- val2 = (val1+1)*25;
- val3 = (val1+1)*2;
- break;
- case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- calc_flag = 1;
- val2 = (val1+2)*50;
- val3 = (val1+2)*25;
- break;
- case SC_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- break;
- case SC_INTOABYSS: /* [•£‚Ì’†‚É */
- break;
- case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- calc_flag = 1;
- val2 = 40 + val1*5;
- val3 = val1*10;
- break;
- case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
- val2 = 10;
- break;
- case SC_WHISTLE: /* Œû“J */
- calc_flag = 1;
- break;
- case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- calc_flag = 1;
- break;
- case SC_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- break;
- case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- calc_flag = 1;
- break;
- case SC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- val2 = 10;
- break;
- case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- calc_flag = 1;
- break;
- case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
- calc_flag = 1;
- if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
- skill_status_change_end(bl,SC_INCREASEAGI,-1);
- if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
- skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1);
- if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
- skill_status_change_end(bl,SC_SPEARSQUICKEN,-1);
- if(sc_data[SC_ADRENALINE].timer!=-1 )
- skill_status_change_end(bl,SC_ADRENALINE,-1);
- if(sc_data[SC_ASSNCROS].timer!=-1 )
- skill_status_change_end(bl,SC_ASSNCROS,-1);
- if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
- skill_status_change_end(bl,SC_TRUESIGHT,-1);
- if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- skill_status_change_end(bl,SC_WINDWALK,-1);
- if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
- skill_status_change_end(bl,SC_CARTBOOST,-1);
- break;
- case SC_FORTUNE: /* K‰^‚̃LƒX */
- calc_flag = 1;
- break;
- case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- calc_flag = 1;
- break;
- case SC_DANCING: /* ƒ_ƒ“ƒX/‰‰‘t’† */
- calc_flag = 1;
- val3= tick / 1000;
- tick = 1000;
- break;
-
- case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
- calc_flag = 1;
- val2 = 75 + 25*val1;
- *opt3 |= 8;
- break;
- case SC_STEELBODY: // ‹à„
- calc_flag = 1;
- *opt3 |= 16;
- break;
- case SC_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
- break;
- case SC_AUTOCOUNTER:
- val3 = val4 = 0;
- break;
-
- case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
- case SC_SPEEDPOTION1:
- case SC_SPEEDPOTION2:
- calc_flag = 1;
- tick = 1000 * tick;
- val2 = 5*(2+type-SC_SPEEDPOTION0);
- break;
-
- /* atk & matk potions [Valaris] */
- case SC_ATKPOT:
- case SC_MATKPOT:
- calc_flag = 1;
- tick = 1000 * tick;
- break;
- case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
- {
- time_t timer;
-
- calc_flag = 1;
- tick = 10000;
- if(!val2)
- val2 = time(&timer);
- }
- break;
- case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
- {
- time_t timer;
-
- if(!battle_config.muting_players)
- break;
-
- tick = 60000;
- if(!val2)
- val2 = time(&timer);
- updateflag = SP_MANNER;
- }
- break;
- case SC_SELFDESTRUCTION: //Ž©”š
- clif_skillcasting(bl,bl->id, bl->id,0,0,331,skill_get_time(val2,val1));
- val3 = tick / 1000;
- tick = 1000;
- break;
-
- /* option1 */
- case SC_STONE: /* Ή» */
- if(!(flag&2)) {
- int sc_def = battle_get_mdef(bl)*200;
- tick = tick - sc_def;
- }
- val3 = tick/1000;
- if(val3 < 1) val3 = 1;
- tick = 5000;
- val2 = 1;
- break;
- case SC_SLEEP: /* ‡–° */
- if(!(flag&2)) {
-// int sc_def = 100 - (battle_get_int(bl) + battle_get_luk(bl)/3);
-// tick = tick * sc_def / 100;
-// if(tick < 1000) tick = 1000;
- tick = 30000;//‡–°‚̓Xƒe?ƒ^ƒX‘Ï«‚É?‚í‚炸30•b
- }
- break;
- case SC_FREEZE: /* “€Œ‹ */
- if(!(flag&2)) {
- int sc_def = 100 - battle_get_mdef(bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_STAN: /* ƒXƒ^ƒ“ival2‚Ƀ~ƒŠ•bƒZƒbƒgj */
- if(!(flag&2)) {
- int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/3);
- tick = tick * sc_def / 100;
- }
- break;
-
- /* option2 */
- case SC_POISON: /* “Å */
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/5);
- tick = tick * sc_def / 100;
- }
- val3 = tick/1000;
- if(val3 < 1) val3 = 1;
- tick = 1000;
- break;
- case SC_SILENCE: /* ’¾?iƒŒƒbƒNƒXƒfƒr?ƒij */
- if(!(flag&2)) {
- int sc_def = 100 - battle_get_vit(bl);
- tick = tick * sc_def / 100;
- }
- break;
- case SC_BLIND: /* ˆÃ? */
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = battle_get_lv(bl)/10 + battle_get_int(bl)/15;
- tick = 30000 - sc_def;
- }
- break;
- case SC_CURSE:
- calc_flag = 1;
- if(!(flag&2)) {
- int sc_def = 100 - battle_get_vit(bl);
- tick = tick * sc_def / 100;
- }
- break;
-
- /* option */
- case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
- calc_flag = 1;
- if(bl->type == BL_PC) {
- val2 = tick / 1000; /* Ž?ŽžŠÔ */
- tick = 1000;
- }
- break;
- case SC_CHASEWALK:
- case SC_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
- calc_flag = 1; // [Celest]
- if(bl->type == BL_PC)
- val2 = tick;
- else
- tick = 5000*val1;
- break;
- case SC_SIGHT: /* ƒTƒCƒg/ƒ‹ƒAƒt */
- case SC_RUWACH:
- val2 = tick/250;
- tick = 10;
- break;
-
- /* ƒZ?ƒtƒeƒBƒEƒH?ƒ‹Aƒjƒ…?ƒ} */
- case SC_SAFETYWALL: case SC_PNEUMA:
- tick=((struct skill_unit *)val2)->group->limit;
- break;
-
- /* ƒAƒ“ƒNƒ‹ */
- case SC_ANKLE:
- break;
-
- /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
- case SC_WATERBALL:
- tick=150;
- if(val1>5) //ƒŒƒxƒ‹‚ª5ˆÈã‚ÌꇂÍ25?‚ɧŒÀ(1?–Ú‚Í‚·‚Å‚É‘Å‚Á‚Ä‚é‚Ì‚Å-1)
- val3=5*5-1;
- else
- val3= (val1|1)*(val1|1)-1;
- break;
-
- /* ƒXƒLƒ‹‚¶‚á‚È‚¢/ŽžŠÔ‚É?ŒW‚µ‚È‚¢ */
- case SC_RIDING:
- calc_flag = 1;
- tick = 600*1000;
- break;
- case SC_FALCON:
- case SC_WEIGHT50:
- case SC_WEIGHT90:
- case SC_BROKNWEAPON:
- case SC_BROKNARMOR:
- tick=600*1000;
- break;
-
- case SC_AUTOGUARD:
- {
- int i,t;
- for(i=val2=0;i<val1;i++) {
- t = 5-(i>>1);
- val2 += (t < 0)? 1:t;
- }
- }
- break;
-
- case SC_DEFENDER:
- calc_flag = 1;
- val2 = 5 + val1*15;
- break;
-
- case SC_KEEPING:
- case SC_BARRIER:
- calc_flag = 1;
- case SC_HALLUCINATION:
- break;
- case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
- *opt3 |= 1;
- calc_flag = 1;
- break;
- case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- calc_flag = 1;
- if(bl->type == BL_PC) {
- tick = 10000;
- }
- break;
- case SC_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
- case SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
-// case SC_ASSUMPTIO: /* */
- case SC_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- case SC_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
-// case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
-
- //‚Æ‚è‚ ‚¦‚¸Žè?‚«
- break;
-
-// -- moonsoul (for new upper class related skill status effects)
-/*
- case SC_AURABLADE:
- val2 = val1*10;
- break;
- case SC_PARRYING:
- val2=val1*3;
- break;
- case SC_CONCENTRATION:
- calc_flag=1;
- val2=val1*10;
- val3=val1*5;
- break;
- case SC_TENSIONRELAX:
-// val2 = 10;
-// val3 = 15;
- break;
- case SC_BERSERK:
- calc_flag=1;
- break;
- case SC_ASSUMPTIO:
- if(sc_data[SC_KYRIE].timer!=-1 )
- skill_status_change_end(bl,SC_KYRIE,-1);
- break;
-*/
- case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
- calc_flag = 1;
- val2 = (val1 / 2); //Flee㸗¦
- break;
- case SC_BERSERK: /* ƒo?ƒT?ƒN */
- if(sd){
- sd->status.sp = 0;
- clif_updatestatus(sd,SP_SP);
- clif_status_change(bl,SC_INCREASEAGI,1); /* ƒAƒCƒRƒ“•\Ž¦ */
- }
- *opt3 |= 128;
- tick = 1000;
- calc_flag = 1;
- break;
- case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
- *opt3 |= 2048;
- break;
- case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
- case SC_MARIONETTE2:
- calc_flag = 1;
- *opt3 |= 1024;
- break;
- case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- case SC_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
- case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
- case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
- case SC_MAGICPOWER: /* –‚–@—Í?• */
- calc_flag = 1;
- break;
- case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
- val2 = 3; //3‰ñU?‚𒵂˕Ԃ·
- break;
- case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
- val2 = 3; //3‰ñ‰r¥‚ð1/3‚É‚·‚é
- break;
- case SC_GRAFFITI: /* ƒOƒ‰ƒtƒBƒeƒB */
- {
- struct skill_unit_group *sg = skill_unitsetting(bl,RG_GRAFFITI,val1,val2,val3,0);
- if(sg)
- val4 = (int)sg;
- }
- break;
- case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
- break;
- case SC_FOGWALL:
- val2 = 75;
- // calc_flag = 1; // not sure of effects yet [celest]
- break;
- default:
- if(battle_config.error_log)
- printf("UnknownStatusChange [%d]\n", type);
- return 0;
- }
-
- if(bl->type==BL_PC && type<SC_SENDMAX)
- clif_status_change(bl,type,1); /* ƒAƒCƒRƒ“•\Ž¦ */
-
- /* option‚Ì?X */
- switch(type){
- case SC_STONE:
- case SC_FREEZE:
- case SC_STAN:
- case SC_SLEEP:
- battle_stopattack(bl); /* U?’âŽ~ */
- skill_stop_dancing(bl,0); /* ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†? */
- { /* “¯Žž‚ÉŠ|‚©‚ç‚È‚¢ƒXƒe?ƒ^ƒXˆÙí‚ð‰ðœ */
- int i;
- for(i = SC_STONE; i <= SC_SLEEP; i++){
- if(sc_data[i].timer != -1){
- (*sc_count)--;
- delete_timer(sc_data[i].timer, skill_status_change_timer);
- sc_data[i].timer = -1;
- }
- }
- }
- if(type == SC_STONE)
- *opt1 = 6;
- else
- *opt1 = type - SC_STONE + 1;
- opt_flag = 1;
- break;
- case SC_POISON:
- case SC_CURSE:
- case SC_SILENCE:
- case SC_BLIND:
- *opt2 |= 1<<(type-SC_POISON);
- opt_flag = 1;
- break;
- case SC_SIGNUMCRUCIS:
- *opt2 |= 0x40;
- opt_flag = 1;
- break;
- case SC_HIDING:
- case SC_CLOAKING:
- battle_stopattack(bl); /* U?’âŽ~ */
- *option |= ((type==SC_HIDING)?2:4);
- opt_flag =1 ;
- break;
- case SC_CHASEWALK:
- battle_stopattack(bl); /* U?’âŽ~ */
- *option |= 16388;
- opt_flag =1 ;
- break;
- case SC_SIGHT:
- *option |= 1;
- opt_flag = 1;
- break;
- case SC_RUWACH:
- *option |= 8192;
- opt_flag = 1;
- break;
- case SC_WEDDING:
- *option |= 4096;
- opt_flag = 1;
- }
-
- if(opt_flag) /* option‚Ì?X */
- clif_changeoption(bl);
-
- (*sc_count)++; /* ƒXƒe?ƒ^ƒXˆÙí‚Ì? */
-
- sc_data[type].val1 = val1;
- sc_data[type].val2 = val2;
- sc_data[type].val3 = val3;
- sc_data[type].val4 = val4;
- /* ƒ^ƒCƒ}?Ý’è */
- sc_data[type].timer = add_timer(
- gettick() + tick, skill_status_change_timer, bl->id, type);
-
- if(bl->type==BL_PC && calc_flag)
- pc_calcstatus(sd,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
-
- if(bl->type==BL_PC && updateflag)
- clif_updatestatus(sd,updateflag); /* ƒXƒe?ƒ^ƒX‚ðƒNƒ‰ƒCƒAƒ“ƒg‚É‘—‚é */
-
- return 0;
-}
-/*==========================================
- * ƒXƒe?ƒ^ƒXˆÙí‘S‰ðœ
- *------------------------------------------
- */
-int skill_status_change_clear(struct block_list *bl, int type)
-{
- struct status_change* sc_data;
- short *sc_count, *option, *opt1, *opt2, *opt3;
- int i;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, sc_data = battle_get_sc_data(bl));
- nullpo_retr(0, sc_count = battle_get_sc_count(bl));
- nullpo_retr(0, option = battle_get_option(bl));
- nullpo_retr(0, opt1 = battle_get_opt1(bl));
- nullpo_retr(0, opt2 = battle_get_opt2(bl));
- nullpo_retr(0, opt3 = battle_get_opt3(bl));
-
- if (*sc_count == 0)
- return 0;
- for(i = 0; i < MAX_STATUSCHANGE; i++){
- if(sc_data[i].timer != -1){ /* ˆÙ킪‚ ‚é‚È‚çƒ^ƒCƒ}?‚ð휂·‚é */
-/*
- delete_timer(sc_data[i].timer, skill_status_change_timer);
- sc_data[i].timer = -1;
-
- if (!type && i < SC_SENDMAX)
- clif_status_change(bl, i, 0);
-*/
-
- skill_status_change_end(bl, i, -1);
- }
- }
- *sc_count = 0;
- *opt1 = 0;
- *opt2 = 0;
- *opt3 = 0;
- *option &= OPTION_MASK;
-
- if (night_flag == 1 && type == BL_PC) // by [Yor]
- *opt2 |= STATE_BLIND;
-
- if(!type || type&2)
- clif_changeoption(bl);
-
- return 0;
-}
-
-/* ƒNƒ?ƒLƒ“ƒO?¸iŽü‚è‚Ɉړ®•s‰Â”\’n?‚ª‚ ‚é‚©j */
-int skill_check_cloaking(struct block_list *bl)
-{
- struct map_session_data *sd=NULL;
- static int dx[]={-1, 0, 1,-1, 1,-1, 0, 1};
- static int dy[]={-1,-1,-1, 0, 0, 1, 1, 1};
- int end=1,i;
-
- nullpo_retr(0, bl);
- sd=(struct map_session_data *)bl; //missing sd [Found by Celest, commited by Aria]
-
- if(pc_checkskill(sd,AS_CLOAKING)>2)
- return 0;
- if(bl->type == BL_PC && battle_config.pc_cloak_check_type&1)
- return 0;
- if(bl->type == BL_MOB && battle_config.monster_cloak_check_type&1)
- return 0;
- for(i=0;i<sizeof(dx)/sizeof(dx[0]);i++){
- int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]);
- if(c==1 || c==5) end=0;
- }
- if(end){
- skill_status_change_end(bl, SC_CLOAKING, -1);
- *battle_get_option(bl)&=~4; /* ”O‚Ì‚½‚ß‚Ì?— */
- }
- return end;
-}
-
-int skill_type_cloaking(struct block_list *bl)
-{
- static int dx[]={-1, 0, 1,-1, 1,-1, 0, 1};
- static int dy[]={-1,-1,-1, 0, 0, 1, 1, 1};
- int end=1,i;
-
- nullpo_retr(0, bl);
- if(bl->type == BL_PC && battle_config.pc_cloak_check_type&1)
- return 0;
- if(bl->type == BL_MOB && battle_config.monster_cloak_check_type&1)
- return 0;
- for(i=0; i<sizeof(dx)/sizeof(dx[0]); i++)
- {
- int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]);
- if(c==1 || c==5) end=0;
- }
- return end;
-}
-
-/*
- *----------------------------------------------------------------------------
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ‰‰‘t/ƒ_ƒ“ƒXƒXƒLƒ‹‚©‚Ç‚¤‚©”»’è
- * ˆø? ƒXƒLƒ‹ID
- * ?‚è ƒ_ƒ“ƒX‚¶‚á‚È‚¢=0 ‡‘t=2 ‚»‚êˆÈŠO‚̃_ƒ“ƒX=1
- *------------------------------------------
- */
-int skill_is_danceskill(int id)
-{
- int i;
- switch(id){
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- i=2;
- break;
- case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
- case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
- case BA_WHISTLE: /* Œû“J */
- case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
- case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
- case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
- case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
- case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
- case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
- case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
- case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
- case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
- i=1;
- break;
- default:
- i=0;
- }
- return i;
-}
-
-/*==========================================
- * ‰‰‘t/ƒ_ƒ“ƒX‚ð‚â‚ß‚é
- * flag 1‚Ň‘t’†‚È‚ç‘Š•û‚Ƀ†ƒjƒbƒg‚ð”C‚¹‚é
- *
- *------------------------------------------
- */
-void skill_stop_dancing(struct block_list *src, int flag)
-{
- struct status_change* sc_data;
- struct skill_unit_group* group;
-
- nullpo_retv(src);
-
- sc_data=battle_get_sc_data(src);
- if(sc_data && sc_data[SC_DANCING].timer==-1)
- return;
- group=(struct skill_unit_group *)sc_data[SC_DANCING].val2; //ƒ_ƒ“ƒX‚̃XƒLƒ‹ƒ†ƒjƒbƒgID‚Íval2‚É“ü‚Á‚Ä‚é
- if(group && src->type==BL_PC && sc_data && sc_data[SC_DANCING].val4){ //‡‘t’†?
- struct map_session_data* dsd=map_id2sd(sc_data[SC_DANCING].val4); //‘Š•û‚ÌsdŽæ“¾
- if(flag){ //ƒƒOƒAƒEƒg‚ȂǕЕû‚ª—Ž‚¿‚Ä‚à‰‰‘t‚ª??‚³‚ê‚é
- if(dsd && src->id == group->src_id){ //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ª—Ž‚¿‚é
- group->src_id=sc_data[SC_DANCING].val4; //‘Š•û‚ɃOƒ‹?ƒv‚ð”C‚¹‚é
- if(flag&1) //ƒƒOƒAƒEƒg
- dsd->sc_data[SC_DANCING].val4=0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
- if(flag&2) //ƒnƒG”ò‚Ñ‚È‚Ç
- return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
- }else if(dsd && dsd->bl.id == group->src_id){ //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ª—Ž‚¿‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
- if(flag&1) //ƒƒOƒAƒEƒg
- dsd->sc_data[SC_DANCING].val4=0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
- if(flag&2) //ƒnƒG”ò‚Ñ‚È‚Ç
- return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
- }
- skill_status_change_end(src,SC_DANCING,-1);//Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- //‚»‚µ‚ăOƒ‹?ƒv‚ÍÁ‚³‚È‚¢•Á‚³‚È‚¢‚̂ŃXƒe?ƒ^ƒXŒvŽZ‚à‚¢‚ç‚È‚¢H
- return;
- }else{
- if(dsd && src->id == group->src_id){ //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ªŽ~‚ß‚é
- skill_status_change_end((struct block_list *)dsd,SC_DANCING,-1);//‘ŠŽè‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- }
- if(dsd && dsd->bl.id == group->src_id){ //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ªŽ~‚ß‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
- skill_status_change_end(src,SC_DANCING,-1);//Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
- }
- }
- }
- if(flag&2 && group && src->type==BL_PC){ //ƒnƒG‚Å”ò‚ñ‚¾‚Æ‚«‚Æ‚©‚̓†ƒjƒbƒg‚à”ò‚Ô
- struct map_session_data *sd = (struct map_session_data *)src;
- skill_unit_move_unit_group(group, sd->bl.m,(sd->to_x - sd->bl.x),(sd->to_y - sd->bl.y));
- return;
- }
- skill_delunitgroup(group);
- if(src->type==BL_PC)
- pc_calcstatus((struct map_session_data *)src,0);
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒg‰Šú‰»
- *------------------------------------------
- */
-struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y)
-{
- struct skill_unit *unit;
-
- nullpo_retr(NULL, group);
- nullpo_retr(NULL, unit=&group->unit[idx]);
-
- if(!unit->alive)
- group->alive_count++;
-
- unit->bl.id=map_addobject(&unit->bl);
- unit->bl.type=BL_SKILL;
- unit->bl.m=group->map;
- unit->bl.x=x;
- unit->bl.y=y;
- unit->group=group;
- unit->val1=unit->val2=0;
- unit->alive=1;
-
- map_addblock(&unit->bl);
- clif_skill_setunit(unit);
- return unit;
-}
-
-int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap );
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgíœ
- *------------------------------------------
- */
-int skill_delunit(struct skill_unit *unit)
-{
- struct skill_unit_group *group;
- int range;
-
- nullpo_retr(0, unit);
- if(!unit->alive)
- return 0;
- nullpo_retr(0, group=unit->group);
-
- /* onlimitƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- skill_unit_onlimit( unit,gettick() );
-
- /* ondeleteƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- range=group->range;
- map_foreachinarea( skill_unit_timer_sub_ondelete, unit->bl.m,
- unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0,
- &unit->bl,gettick() );
-
- clif_skill_delunit(unit);
-
- unit->group=NULL;
- unit->alive=0;
- map_delobjectnofree(unit->bl.id);
- if(group->alive_count>0 && (--group->alive_count)<=0)
- skill_delunitgroup(group);
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‰Šú‰»
- *------------------------------------------
- */
-static int skill_unit_group_newid=10;
-struct skill_unit_group *skill_initunitgroup(struct block_list *src,
- int count,int skillid,int skilllv,int unit_id)
-{
- if(skilllv <= 0) return 0;
- int i;
- struct skill_unit_group *group=NULL, *list=NULL;
- int maxsug=0;
-
- nullpo_retr(NULL, src);
-
- if(src->type==BL_PC){
- list=((struct map_session_data *)src)->skillunit;
- maxsug=MAX_SKILLUNITGROUP;
- }else if(src->type==BL_MOB){
- list=((struct mob_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }else if(src->type==BL_PET){
- list=((struct pet_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }
- if(list){
- for(i=0;i<maxsug;i++) /* ‹ó‚¢‚Ä‚¢‚é‚à‚Ì?õ */
- if(list[i].group_id==0){
- group=&list[i];
- break;
- }
-
- if(group==NULL){ /* ‹ó‚¢‚Ä‚È‚¢‚̂Ō¢‚à‚Ì?õ */
- int j=0;
- unsigned maxdiff=0,x,tick=gettick();
- for(i=0;i<maxsug;i++)
- if((x=DIFF_TICK(tick,list[i].tick))>maxdiff){
- maxdiff=x;
- j=i;
- }
- skill_delunitgroup(&list[j]);
- group=&list[j];
- }
- }
-
- if(group==NULL){
- printf("skill_initunitgroup: error unit group !\n");
- exit(1);
- }
-
- group->src_id=src->id;
- group->party_id=battle_get_party_id(src);
- group->guild_id=battle_get_guild_id(src);
- group->group_id=skill_unit_group_newid++;
- if(skill_unit_group_newid<=0)
- skill_unit_group_newid=10;
- group->unit=(struct skill_unit *)aCalloc(count,sizeof(struct skill_unit));
- group->unit_count=count;
- group->val1=group->val2=0;
- group->skill_id=skillid;
- group->skill_lv=skilllv;
- group->unit_id=unit_id;
- group->map=src->m;
- group->range=0;
- group->limit=10000;
- group->interval=1000;
- group->tick=gettick();
- group->valstr=NULL;
-
- if( skill_is_danceskill(skillid) ){
- struct map_session_data *sd = NULL;
- if(src->type==BL_PC && (sd=(struct map_session_data *)src) ){
- sd->skillid_dance=skillid;
- sd->skilllv_dance=skilllv;
- }
- skill_status_change_start(src,SC_DANCING,skillid,(int)group,0,0,skill_get_time(skillid,skilllv)+1000,0);
- switch(skillid){ //‡‘tƒXƒLƒ‹‚Í‘Š•û‚ðƒ_ƒ“ƒX?‘Ô‚É‚·‚é
- case BD_LULLABY: /* ŽqŽç‰Ì */
- case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
- case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
- case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
- case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
- case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
- case BD_INTOABYSS: /* [•£‚Ì’†‚É */
- case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
- case BD_RAGNAROK: /* _?‚Ì?¨ */
- case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
- {
- int range=1;
- int c=0;
- if(sd){
- map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
- sd->bl.x-range,sd->bl.y-range,
- sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
- }
- }
- }
- }
- return group;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒvíœ
- *------------------------------------------
- */
-int skill_delunitgroup(struct skill_unit_group *group)
-{
- struct block_list *src;
- int i;
-
- nullpo_retr(0, group);
- if(group->unit_count<=0)
- return 0;
-
- src=map_id2bl(group->src_id);
- if( skill_is_danceskill(group->skill_id) ){ //ƒ_ƒ“ƒXƒXƒLƒ‹‚̓_ƒ“ƒX?‘Ô‚ð‰ðœ‚·‚é
- if(src)
- skill_status_change_end(src,SC_DANCING,-1);
- }
-
- group->alive_count=0;
- if(group->unit!=NULL){
- for(i=0;i<group->unit_count;i++)
- if(group->unit[i].alive)
- skill_delunit(&group->unit[i]);
- }
- if(group->valstr!=NULL){
- map_freeblock(group->valstr);
- group->valstr=NULL;
- }
-
- map_freeblock(group->unit); /* free()‚Ì‘Ö‚í‚è */
- group->unit=NULL;
- group->src_id=0;
- group->group_id=0;
- group->unit_count=0;
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‘Síœ
- *------------------------------------------
- */
-int skill_clear_unitgroup(struct block_list *src)
-{
- struct skill_unit_group *group=NULL;
- int maxsug=0;
-
- nullpo_retr(0, src);
-
- if(src->type==BL_PC){
- group=((struct map_session_data *)src)->skillunit;
- maxsug=MAX_SKILLUNITGROUP;
- }else if(src->type==BL_MOB){
- group=((struct mob_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }else if(src->type==BL_PET){ // [Valaris]
- group=((struct pet_data *)src)->skillunit;
- maxsug=MAX_MOBSKILLUNITGROUP;
- }
- if(group){
- int i;
- for(i=0;i<maxsug;i++)
- if(group[i].group_id>0 && group[i].src_id == src->id)
- skill_delunitgroup(&group[i]);
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ì”í‰e‹¿tick?õ
- *------------------------------------------
- */
-struct skill_unit_group_tickset *skill_unitgrouptickset_search(
- struct block_list *bl,int group_id)
-{
- int i,j=0,k,s=group_id%MAX_SKILLUNITGROUPTICKSET;
- struct skill_unit_group_tickset *set=NULL;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC){
- set=((struct map_session_data *)bl)->skillunittick;
- }else{
- set=((struct mob_data *)bl)->skillunittick;
- }
- if(set==NULL)
- return 0;
- for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++)
- if( set[(k=(i+s)%MAX_SKILLUNITGROUPTICKSET)].group_id == group_id )
- return &set[k];
- else if( set[k].group_id==0 )
- j=k;
-
- return &set[j];
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ì”í‰e‹¿tickíœ
- *------------------------------------------
- */
-int skill_unitgrouptickset_delete(struct block_list *bl,int group_id)
-{
- int i,s=group_id%MAX_SKILLUNITGROUPTICKSET;
- struct skill_unit_group_tickset *set=NULL,*ts;
-
- nullpo_retr(0, bl);
-
- if(bl->type==BL_PC){
- set=((struct map_session_data *)bl)->skillunittick;
- }else{
- set=((struct mob_data *)bl)->skillunittick;
- }
-
- if(set!=NULL){
-
- for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++)
- if( (ts=&set[(i+s)%MAX_SKILLUNITGROUPTICKSET])->group_id == group_id )
- ts->group_id=0;
-
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??“®?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_timer_sub_onplace( struct block_list *bl, va_list ap )
-{
- struct block_list *src;
- struct skill_unit *su;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- src=va_arg(ap,struct block_list*);
-
- tick=va_arg(ap,unsigned int);
- su = (struct skill_unit *)src;
-
- if( su && su->alive ) {
- struct skill_unit_group *sg;
- sg = su->group;
- if(sg && battle_check_target(src,bl,sg->target_flag )>0)
- skill_unit_onplace( su, bl, tick );
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}?íœ?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap )
-{
- struct block_list *src;
- struct skill_unit *su;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- src=va_arg(ap,struct block_list*);
-
- tick=va_arg(ap,unsigned int);
- su = (struct skill_unit *)src;
-
- if( su && su->alive ){
- struct skill_unit_group *sg;
- sg = su->group;
- if( sg && battle_check_target(src,bl,sg->target_flag )>0 )
- skill_unit_ondelete( su, bl, tick );
- }
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??——p(foreachobject)
- *------------------------------------------
- */
-int skill_unit_timer_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- int range;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit=(struct skill_unit *)bl);
- nullpo_retr(0, group=unit->group);
- tick=va_arg(ap,unsigned int);
-
- if(!unit->alive)
- return 0;
-
- range=(unit->range!=0)?unit->range:group->range;
-
- /* onplaceƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
- if(unit->alive && unit->range>=0){
- map_foreachinarea( skill_unit_timer_sub_onplace, bl->m,
- bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,
- bl,tick);
- if(group->unit_id == 0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val2){
- map_foreachinarea( skill_idun_heal, bl->m,
- bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,unit);
- group->val2++;
- }
- }
- /* ŽžŠÔØ‚êíœ */
- if(unit->alive &&
- (DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit) ){
- switch(group->unit_id){
-
-
-
-
-
-
- case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
- group->unit_id = 0x8c;
- clif_changelook(bl,LOOK_BASE,group->unit_id);
- group->limit=DIFF_TICK(tick+1500,group->tick);
- unit->limit=DIFF_TICK(tick+1500,group->tick);
- break;
- case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
- case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
- case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
- case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
- case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
- case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
- case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
- case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
- case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
- {
- struct block_list *src=map_id2bl(group->src_id);
- if(group->unit_id == 0x91 && group->val2);
- else{
- if(src && src->type==BL_PC){
- struct item item_tmp;
- memset(&item_tmp,0,sizeof(item_tmp));
- item_tmp.nameid=1065;
- item_tmp.identify=1;
- map_addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,NULL,NULL,NULL,0); // ?•ÔŠÒ
- }
- }
- }
- default:
- skill_delunit(unit);
- }
- }
-
- if(group->unit_id == 0x8d) {
- unit->val1 -= 5;
- if(unit->val1 <= 0 && unit->limit + group->tick > tick + 700)
- unit->limit = DIFF_TICK(tick+700,group->tick);
- }
-
- return 0;
-}
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??—
- *------------------------------------------
- */
-int skill_unit_timer( int tid,unsigned int tick,int id,int data)
-{
- map_freeblock_lock();
-
- map_foreachobject( skill_unit_timer_sub, BL_SKILL, tick );
-
- map_freeblock_unlock();
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_out_all_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
- nullpo_retr(0, unit=(struct skill_unit *)bl);
- nullpo_retr(0, group=unit->group);
-
- tick=va_arg(ap,unsigned int);
-
- if(!unit->alive || src->prev==NULL)
- return 0;
-
- range=(unit->range!=0)?unit->range:group->range;
-
- if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 )
- return 0;
-
- if( src->x >= bl->x-range && src->x <= bl->x+range &&
- src->y >= bl->y-range && src->y <= bl->y+range )
- skill_unit_onout( unit, src, tick );
-
- return 0;
-}
-
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?—
- *------------------------------------------
- */
-int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range)
-{
- nullpo_retr(0, bl);
-
- if( bl->prev==NULL )
- return 0;
-
- if(range<7)
- range=7;
- map_foreachinarea( skill_unit_out_all_sub,
- bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL,
- bl,tick );
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?——p(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_move_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, unit=(struct skill_unit *)bl);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
-
- tick=va_arg(ap,unsigned int);
-
- if(!unit->alive || src->prev==NULL)
- return 0;
-
- if((group=unit->group) == NULL)
- return 0;
- range=(unit->range!=0)?unit->range:group->range;
-
- if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 )
- return 0;
-
- if( src->x >= bl->x-range && src->x <= bl->x+range &&
- src->y >= bl->y-range && src->y <= bl->y+range )
- skill_unit_onplace( unit, src, tick );
- else
- skill_unit_onout( unit, src, tick );
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?—
- *------------------------------------------
- */
-int skill_unit_move( struct block_list *bl,unsigned int tick,int range)
-{
- nullpo_retr(0, bl);
-
- if( bl->prev==NULL )
- return 0;
-
- if(range<7)
- range=7;
- map_foreachinarea( skill_unit_move_sub,
- bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL,
- bl,tick );
-
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgŽ©?‚̈ړ®Žž?—(foreachinarea)
- *------------------------------------------
- */
-int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap )
-{
- struct skill_unit *unit;
- struct skill_unit_group *group;
- struct block_list *src;
- int range;
- unsigned int tick;
-
- nullpo_retr(0, bl);
- nullpo_retr(0, ap);
- nullpo_retr(0, src=va_arg(ap,struct block_list*));
- nullpo_retr(0, unit=(struct skill_unit *)src);
- nullpo_retr(0, group=unit->group);
-
- tick=va_arg(ap,unsigned int);
-
- if(!unit->alive || bl->prev==NULL)
- return 0;
-
- range=(unit->range!=0)?unit->range:group->range;
-
- if( range<0 || battle_check_target(src,bl,group->target_flag )<=0 )
- return 0;
- if( bl->x >= src->x-range && bl->x <= src->x+range &&
- bl->y >= src->y-range && bl->y <= src->y+range )
- skill_unit_onplace( unit, bl, tick );
- else
- skill_unit_onout( unit, bl, tick );
- return 0;
-}
-
-/*==========================================
- * ƒXƒLƒ‹ƒ†ƒjƒbƒgŽ©?‚̈ړ®Žž?—
- * ˆø?‚̓Oƒ‹?ƒv‚ƈړ®—Ê
- *------------------------------------------
- */
-int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy)
-{
- nullpo_retr(0, group);
-
- if( group->unit_count<=0)
- return 0;
-
- if(group->unit!=NULL){
- if(!battle_config.unit_movement_type){
- int i;
- for(i=0;i<group->unit_count;i++){
- struct skill_unit *unit=&group->unit[i];
- if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){
- int range=unit->range;
- map_delblock(&unit->bl);
- unit->bl.m = m;
- unit->bl.x += dx;
- unit->bl.y += dy;
- map_addblock(&unit->bl);
- clif_skill_setunit(unit);
- if(range>0){
- if(range<7)
- range=7;
- map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m,
- unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0,
- &unit->bl,gettick() );
- }
- }
- }
- }else{
- int i,j, *r_flag, *s_flag, *m_flag;
- struct skill_unit *unit1;
- struct skill_unit *unit2;
- r_flag = (int *) malloc(sizeof(int) * group->unit_count);
- s_flag = (int *) malloc(sizeof(int) * group->unit_count);
- m_flag = (int *) malloc(sizeof(int) * group->unit_count);
- memset(r_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
- memset(s_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
- memset(m_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
-
- //æ‚Ƀtƒ‰ƒO‚ð‘S•”Œˆ‚ß‚é
- for(i=0;i<group->unit_count;i++){
- int move_check=0;// ‚©‚Ô‚èƒtƒ‰ƒO
- unit1=&group->unit[i];
- for(j=0;j<group->unit_count;j++){
- unit2=&group->unit[j];
- if(unit1->bl.m==m && unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){
- //ˆÚ“®æ‚Ƀ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚Ä‚½‚ç
- s_flag[i]=1;// ˆÚ“®‘O‚̃†ƒjƒbƒgƒiƒ“ƒo?‚Ì?³ƒtƒ‰ƒOon
- r_flag[j]=1;// ‚©‚Ԃ郆ƒjƒbƒgƒiƒ“ƒo?‚Ì?—¯ƒtƒ‰ƒOon
- move_check=1;//ƒ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚½B
- break;
- }
- }
- if(!move_check)// ƒ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚Ä‚È‚©‚Á‚½‚ç
- m_flag[i]=1;// ˆÚ“®‘Oƒ†ƒjƒbƒgƒiƒ“ƒo?‚̈ړ®ƒtƒ‰ƒOon
- }
-
- //ƒtƒ‰ƒO‚ÉŠî‚¢‚ă†ƒjƒbƒgˆÚ“®
- for(i=0;i<group->unit_count;i++){
- unit1=&group->unit[i];
- if(m_flag[i]){// ˆÚ“®ƒtƒ‰ƒO‚ªon‚Å
- if(!r_flag[i]){// ?—¯ƒtƒ‰ƒO‚ªoff‚È‚ç
- //?ƒˆÚ“®(range‚à?³‚Ì•K—v–³‚µ)
- int range=unit1->range;
- map_delblock(&unit1->bl);
- unit1->bl.m = m;
- unit1->bl.x += dx;
- unit1->bl.y += dy;
- map_addblock(&unit1->bl);
- clif_skill_setunit(unit1);
- if(range > 0){
- if(range < 7)
- range = 7;
- map_foreachinarea( skill_unit_move_unit_group_sub, unit1->bl.m,
- unit1->bl.x-range,unit1->bl.y-range,unit1->bl.x+range,unit1->bl.y+range,0,
- &unit1->bl,gettick() );
- }
- }else{// ?—¯ƒtƒ‰ƒO‚ªon‚È‚ç
- //‹óƒ†ƒjƒbƒg‚É‚È‚é‚Ì‚ÅA?³‰Â”\‚ȃ†ƒjƒbƒg‚ð’T‚·
- for(j=0;j<group->unit_count;j++){
- unit2=&group->unit[j];
- if(s_flag[j] && !r_flag[j]){
- // ?³ˆÚ“®(range?³•t‚«)
- int range=unit1->range;
- map_delblock(&unit2->bl);
- unit2->bl.m = m;
- unit2->bl.x = unit1->bl.x + dx;
- unit2->bl.y = unit1->bl.y + dy;
- unit2->range = unit1->range;
- map_addblock(&unit2->bl);
- clif_skill_setunit(unit2);
- if(range > 0){
- if(range < 7)
- range = 7;
- map_foreachinarea( skill_unit_move_unit_group_sub, unit2->bl.m,
- unit2->bl.x-range,unit2->bl.y-range,unit2->bl.x+range,unit2->bl.y+range,0,
- &unit2->bl,gettick() );
- }
- s_flag[j]=0;// ?³Š®—¹‚µ‚½‚Ì‚Åoff
- break;
- }
- }
- }
- }
- }
- free(r_flag);
- free(s_flag);
- free(m_flag);
- }
- }
- return 0;
-}
-
-/*----------------------------------------------------------------------------
- * ƒAƒCƒeƒ€‡¬
- *----------------------------------------------------------------------------
- */
-
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
- *------------------------------------------
- */
-int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger )
-{
- int i,j;
-
- nullpo_retr(0, sd);
-
- if(nameid<=0)
- return 0;
-
- for(i=0;i<MAX_SKILL_PRODUCE_DB;i++){
- if(skill_produce_db[i].nameid == nameid )
- break;
- }
- if( i >= MAX_SKILL_PRODUCE_DB ) /* ƒf?ƒ^ƒx?ƒX‚É‚È‚¢ */
- return 0;
-
- if(trigger>=0){
- if(trigger==32 || trigger==16 || trigger==64){
- if(skill_produce_db[i].itemlv!=trigger) /* ƒtƒ@?ƒ}ƒV?–ƒ|?ƒVƒ‡ƒ“—Þ‚Æ—n??–?ΈȊO‚Í‚¾‚ß */
- return 0;
- }else{
- if(skill_produce_db[i].itemlv>=16) /* •ŠíˆÈŠO‚Í‚¾‚ß */
- return 0;
- if( itemdb_wlv(nameid)>trigger ) /* •ŠíLv”»’è */
- return 0;
- }
- }
- if( (j=skill_produce_db[i].req_skill)>0 && pc_checkskill(sd,j)<=0 )
- return 0; /* ƒXƒLƒ‹‚ª‘«‚è‚È‚¢ */
-
- for(j=0;j<5;j++){
- int id,x,y;
- if( (id=skill_produce_db[i].mat_id[j]) <= 0 ) /* ‚±‚êˆÈã‚ÍÞ—¿—v‚ç‚È‚¢ */
- continue;
- if(skill_produce_db[i].mat_amount[j] <= 0) {
- if(pc_search_inventory(sd,id) < 0)
- return 0;
- }
- else {
- for(y=0,x=0;y<MAX_INVENTORY;y++)
- if( sd->status.inventory[y].nameid == id )
- x+=sd->status.inventory[y].amount;
- if(x<skill_produce_db[i].mat_amount[j]) /* ƒAƒCƒeƒ€‚ª‘«‚è‚È‚¢ */
- return 0;
- }
- }
- return i+1;
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
- *------------------------------------------
- */
-int skill_produce_mix( struct map_session_data *sd,
- int nameid, int slot1, int slot2, int slot3 )
-{
- int slot[3];
- int i,sc,ele,idx,equip,wlv,make_per,flag;
-
- nullpo_retr(0, sd);
-
- if( !(idx=skill_can_produce_mix(sd,nameid,-1)) ) /* ?Œ•s‘« */
- return 0;
- idx--;
- slot[0]=slot1;
- slot[1]=slot2;
- slot[2]=slot3;
-
- /* –„‚ß?‚Ý?— */
- for(i=0,sc=0,ele=0;i<3;i++){
- int j;
- if( slot[i]<=0 )
- continue;
- j = pc_search_inventory(sd,slot[i]);
- if(j < 0) /* •s³ƒpƒPƒbƒg(ƒAƒCƒeƒ€‘¶Ý)ƒ`ƒFƒbƒN */
- continue;
- if(slot[i]==1000){ /* ¯‚Ì‚©‚¯‚ç */
- pc_delitem(sd,j,1,1);
- sc++;
- }
- if(slot[i]>=994 && slot[i]<=997 && ele==0){ /* ?«Î */
- static const int ele_table[4]={3,1,4,2};
- pc_delitem(sd,j,1,1);
- ele=ele_table[slot[i]-994];
- }
- }
-
- /* Þ—¿Á”ï */
- for(i=0;i<5;i++){
- int j,id,x;
- if( (id=skill_produce_db[idx].mat_id[i]) <= 0 )
- continue;
- x=skill_produce_db[idx].mat_amount[i]; /* •K—v‚ÈŒÂ? */
- do{ /* ‚Q‚ˆÈã‚̃Cƒ“ƒfƒbƒNƒX‚É‚Ü‚½‚ª‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚È‚¢ */
- int y=0;
- j = pc_search_inventory(sd,id);
-
- if(j >= 0){
- y = sd->status.inventory[j].amount;
- if(y>x)y=x; /* ‘«‚è‚Ä‚¢‚é */
- pc_delitem(sd,j,y,0);
- }else {
- if(battle_config.error_log)
- printf("skill_produce_mix: material item error\n");
- }
-
- x-=y; /* ‚Ü‚¾‘«‚è‚È‚¢ŒÂ?‚ðŒvŽZ */
- }while( j>=0 && x>0 ); /* Þ—¿‚ðÁ”ï‚·‚é‚©AƒGƒ‰?‚É‚È‚é‚Ü‚ÅŒJ‚è•Ô‚· */
- }
-
- /* Šm—¦”»’è */
- equip = itemdb_isequip(nameid);
- if(!equip) {
- if(skill_produce_db[idx].req_skill==AM_PHARMACY) {
- if((nameid >= 501 && nameid <= 506) || (nameid >= 545 && nameid <= 547) || nameid == 525)
- make_per = 2000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_POTIONPITCHER)*100;
- else if(nameid == 970)
- make_per = 1500 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300;
- else if(nameid == 7135)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_DEMONSTRATION)*100;
- else if(nameid == 7136)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_ACIDTERROR)*100;
- else if(nameid == 7137)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CANNIBALIZE)*100;
- else if(nameid == 7138)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_SPHEREMINE)*100;
- else if(nameid == 7139)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CP_WEAPON)*100 +
- pc_checkskill(sd,AM_CP_SHIELD)*100 + pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100;
- else
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300;
- }
- else {
- if(nameid == 998)
- make_per = 2000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*600;
- else if(nameid == 985)
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + (pc_checkskill(sd,skill_produce_db[idx].req_skill)-1)*500;
- else
- make_per = 1000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500;
- }
- }
- else {
- int add_per;
- if(pc_search_inventory(sd,989) >= 0) add_per = 750;
- else if(pc_search_inventory(sd,988) >= 0) add_per = 500;
- else if(pc_search_inventory(sd,987) >= 0) add_per = 250;
- else if(pc_search_inventory(sd,986) >= 0) add_per = 0;
- else add_per = -500;
- if(ele) add_per -= 500;
- add_per -= sc*500;
- wlv = itemdb_wlv(nameid);
- make_per = ((250 + sd->status.base_level*15 + sd->paramc[4]*10 + sd->paramc[5]*5 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500 +
- add_per) * (100 - (wlv - 1)*20))/100 + pc_checkskill(sd,BS_WEAPONRESEARCH)*100 + ((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100 : 0);
- }
-
- if(make_per < 1) make_per = 1;
-
- if(skill_produce_db[idx].req_skill==AM_PHARMACY) {
- if( battle_config.pp_rate!=100 )
- make_per=make_per*battle_config.pp_rate/100;
- }
- else {
- if( battle_config.wp_rate!=100 ) /* Šm—¦•â³ */
- make_per=make_per*battle_config.wp_rate/100;
- }
-
-// if(battle_config.etc_log)
-// printf("make rate = %d\n",make_per);
-
- if(rand()%10000 < make_per){
- /* ¬Œ÷ */
- struct item tmp_item;
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.nameid=nameid;
- tmp_item.amount=1;
- tmp_item.identify=1;
- if(equip){ /* •Ší‚Ìê‡ */
- tmp_item.card[0]=0x00ff; /* »‘¢•Šíƒtƒ‰ƒO */
- tmp_item.card[1]=((sc*5)<<8)+ele; /* ?«‚Ƃ‚悳 */
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- else if((battle_config.produce_item_name_input && skill_produce_db[idx].req_skill!=AM_PHARMACY) ||
- (battle_config.produce_potion_name_input && skill_produce_db[idx].req_skill==AM_PHARMACY)) {
- tmp_item.card[0]=0x00fe;
- tmp_item.card[1]=0;
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
-
- #ifndef TXT_ONLY
- if(log_config.produce > 0)
- log_produce(sd,nameid,slot1,slot2,slot3,1);
- #endif //USE_SQL
-
- if(skill_produce_db[idx].req_skill!=AM_PHARMACY && skill_produce_db[idx].req_skill!=WS_CREATECOIN) { //•Ší»‘¢‚Ìê‡
- clif_produceeffect(sd,0,nameid);/* •Ší»‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,3); /* ‘¼l‚ɂଌ÷‚ð’Ê’mi¸?¬Œ÷ƒGƒtƒFƒNƒg‚Æ“¯‚¶‚Å‚¢‚¢‚ÌHj */
- }
- else if(skill_produce_db[idx].req_skill==AM_PHARMACY){ //ƒtƒ@?ƒ}ƒV?‚Ìê‡
- clif_produceeffect(sd,2,nameid);/* »?ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,5); /* ‘¼l‚ɂଌ÷‚ð’Ê’m*/
- }else{
- clif_produceeffect(sd,0,nameid);/* •s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸»‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,3); /* ‘¼l‚ɂଌ÷‚ð’Ê’m*/
- }
-
- 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);
- }
- }
- else {
- #ifndef TXT_ONLY
- if(log_config.produce > 0)
- log_produce(sd,nameid,slot1,slot2,slot3,0);
- #endif //USE_SQL
-
- if(skill_produce_db[idx].req_skill!=AM_PHARMACY) { //•Ší»‘¢‚Ìê‡
- clif_produceeffect(sd,1,nameid);/* •Ší»‘¢Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,2); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m */
- }
- else if(skill_produce_db[idx].req_skill==AM_PHARMACY){ //ƒtƒ@?ƒ}ƒV?‚Ìê‡
- clif_produceeffect(sd,3,nameid);/* »?Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,6); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m*/
- }else{
- clif_produceeffect(sd,1,nameid);/* •s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸»‘¢Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
- clif_misceffect(&sd->bl,2); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m*/
- }
- }
- return 0;
-}
-
-int skill_arrow_create( struct map_session_data *sd,int nameid)
-{
- int i,j,flag,index=-1;
- struct item tmp_item;
-
- nullpo_retr(0, sd);
-
- if(nameid <= 0)
- return 1;
-
- for(i=0;i<MAX_SKILL_ARROW_DB;i++)
- if(nameid == skill_arrow_db[i].nameid) {
- index = i;
- break;
- }
-
- if(index < 0 || (j = pc_search_inventory(sd,nameid)) < 0)
- return 1;
-
- pc_delitem(sd,j,1,0);
- for(i=0;i<5;i++) {
- memset(&tmp_item,0,sizeof(tmp_item));
- tmp_item.identify = 1;
- tmp_item.nameid = skill_arrow_db[index].cre_id[i];
- tmp_item.amount = skill_arrow_db[index].cre_amount[i];
- if(battle_config.making_arrow_name_input) {
- tmp_item.card[0]=0x00fe;
- tmp_item.card[1]=0;
- *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
- }
- if(tmp_item.nameid <= 0 || tmp_item.amount <= 0)
- continue;
- if((flag = pc_additem(sd,&tmp_item,tmp_item.amount))) {
- clif_additem(sd,0,0,flag);
- map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
- }
- }
-
- return 0;
-}
-
-/*----------------------------------------------------------------------------
- * ‰Šú‰»Œn
- */
-
-/*==========================================
- * ƒXƒLƒ‹?ŒWƒtƒ@ƒCƒ‹?‚Ý?‚Ý
- * skill_db.txt ƒXƒLƒ‹ƒf?ƒ^
- * skill_cast_db.txt ƒXƒLƒ‹‚̉r¥ŽžŠÔ‚ƃfƒBƒŒƒCƒf?ƒ^
- * produce_db.txt ƒAƒCƒeƒ€ì¬ƒXƒLƒ‹—pƒf?ƒ^
- * create_arrow_db.txt –î쬃XƒLƒ‹—pƒf?ƒ^
- * abra_db.txt ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^
- *------------------------------------------
- */
-int skill_readdb(void)
-{
- int i,j,k,l,m;
- FILE *fp;
- char line[1024],*p;
- char *filename[]={"db/produce_db.txt","db/produce_db2.txt"};
-
- /* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
- memset(skill_db,0,sizeof(skill_db));
- fp=fopen("db/skill_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50], *split2[MAX_SKILL_LEVEL];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<14 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[13]==NULL || j<14)
- continue;
-
- i=atoi(split[0]);
- if(i<0 || i>MAX_SKILL_DB)
- continue;
-
-/* printf("skill id=%d\n",i); */
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].range[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
- skill_db[i].hit=atoi(split[2]);
- skill_db[i].inf=atoi(split[3]);
- skill_db[i].pl=atoi(split[4]);
- skill_db[i].nk=atoi(split[5]);
- skill_db[i].max=atoi(split[6]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[7];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].num[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- if(strcmpi(split[8],"yes") == 0)
- skill_db[i].castcancel=1;
- else
- skill_db[i].castcancel=0;
- skill_db[i].cast_def_rate=atoi(split[9]);
- skill_db[i].inf2=atoi(split[10]);
- skill_db[i].maxcount=atoi(split[11]);
- if(strcmpi(split[12],"weapon") == 0)
- skill_db[i].skill_type=BF_WEAPON;
- else if(strcmpi(split[12],"magic") == 0)
- skill_db[i].skill_type=BF_MAGIC;
- else if(strcmpi(split[12],"misc") == 0)
- skill_db[i].skill_type=BF_MISC;
- else
- skill_db[i].skill_type=0;
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[13];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].blewcount[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
- }
- fclose(fp);
- printf("read db/skill_db.txt done\n");
-
- fp=fopen("db/skill_require_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_require_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[51], *split2[MAX_SKILL_LEVEL];
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<30 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[29]==NULL || j<30)
- continue;
-
- i=atoi(split[0]);
- if(i<0 || i>MAX_SKILL_DB)
- continue;
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].hp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].mhp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].sp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].hp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[5];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].sp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[6];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].zeny[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[7];j<32 && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<32 && split2[k];k++) {
- l = atoi(split2[k]);
- if(l == 99) {
- skill_db[i].weapon = 0xffffffff;
- break;
- }
- else
- skill_db[i].weapon |= 1<<l;
- }
-
- if( strcmpi(split[8],"hiding")==0 ) skill_db[i].state=ST_HIDING;
- else if( strcmpi(split[8],"cloaking")==0 ) skill_db[i].state=ST_CLOAKING;
- else if( strcmpi(split[8],"hidden")==0 ) skill_db[i].state=ST_HIDDEN;
- else if( strcmpi(split[8],"riding")==0 ) skill_db[i].state=ST_RIDING;
- else if( strcmpi(split[8],"falcon")==0 ) skill_db[i].state=ST_FALCON;
- else if( strcmpi(split[8],"cart")==0 ) skill_db[i].state=ST_CART;
- else if( strcmpi(split[8],"shield")==0 ) skill_db[i].state=ST_SHIELD;
- else if( strcmpi(split[8],"sight")==0 ) skill_db[i].state=ST_SIGHT;
- else if( strcmpi(split[8],"explosionspirits")==0 ) skill_db[i].state=ST_EXPLOSIONSPIRITS;
- else if( strcmpi(split[8],"recover_weight_rate")==0 ) skill_db[i].state=ST_RECOV_WEIGHT_RATE;
- else if( strcmpi(split[8],"move_enable")==0 ) skill_db[i].state=ST_MOVE_ENABLE;
- else if( strcmpi(split[8],"water")==0 ) skill_db[i].state=ST_WATER;
- else skill_db[i].state=ST_NONE;
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[9];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].spiritball[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
- skill_db[i].itemid[0]=atoi(split[10]);
- skill_db[i].amount[0]=atoi(split[11]);
- skill_db[i].itemid[1]=atoi(split[12]);
- skill_db[i].amount[1]=atoi(split[13]);
- skill_db[i].itemid[2]=atoi(split[14]);
- skill_db[i].amount[2]=atoi(split[15]);
- skill_db[i].itemid[3]=atoi(split[16]);
- skill_db[i].amount[3]=atoi(split[17]);
- skill_db[i].itemid[4]=atoi(split[18]);
- skill_db[i].amount[4]=atoi(split[19]);
- skill_db[i].itemid[5]=atoi(split[20]);
- skill_db[i].amount[5]=atoi(split[21]);
- skill_db[i].itemid[6]=atoi(split[22]);
- skill_db[i].amount[6]=atoi(split[23]);
- skill_db[i].itemid[7]=atoi(split[24]);
- skill_db[i].amount[7]=atoi(split[25]);
- skill_db[i].itemid[8]=atoi(split[26]);
- skill_db[i].amount[8]=atoi(split[27]);
- skill_db[i].itemid[9]=atoi(split[28]);
- skill_db[i].amount[9]=atoi(split[29]);
- }
- fclose(fp);
- printf("read db/skill_require_db.txt done\n");
-
- /* ƒLƒƒƒXƒeƒBƒ“ƒOƒf?ƒ^ƒx?ƒX */
- fp=fopen("db/skill_cast_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_cast_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50], *split2[MAX_SKILL_LEVEL];
- memset(split,0,sizeof(split)); // [Valaris] thanks to fov
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<5 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[4]==NULL || j<5)
- continue;
-
- i=atoi(split[0]);
- if(i<0 || i>MAX_SKILL_DB)
- continue;
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].cast[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].delay[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].upkeep_time[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].upkeep_time2[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
- }
- fclose(fp);
- printf("read db/skill_cast_db.txt done\n");
-
- /* »‘¢ŒnƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
- memset(skill_produce_db,0,sizeof(skill_produce_db));
- for(m=0;m<2;m++){
- fp=fopen(filename[m],"r");
- if(fp==NULL){
- if(m>0)
- continue;
- printf("can't read %s\n",filename[m]);
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- int x,y;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<13 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[0]==NULL)
- continue;
- i=atoi(split[0]);
- if(i<=0)
- continue;
-
- skill_produce_db[k].nameid=i;
- skill_produce_db[k].itemlv=atoi(split[1]);
- skill_produce_db[k].req_skill=atoi(split[2]);
-
- for(x=3,y=0;split[x] && split[x+1] && y<5;x+=2,y++){
- skill_produce_db[k].mat_id[y]=atoi(split[x]);
- skill_produce_db[k].mat_amount[y]=atoi(split[x+1]);
- }
- k++;
- if(k >= MAX_SKILL_PRODUCE_DB)
- break;
- }
- fclose(fp);
- printf("read %s done (count=%d)\n",filename[m],k);
- }
-
- memset(skill_arrow_db,0,sizeof(skill_arrow_db));
- fp=fopen("db/create_arrow_db.txt","r");
- if(fp==NULL){
- printf("can't read db/create_arrow_db.txt\n");
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- int x,y;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<13 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[0]==NULL)
- continue;
- i=atoi(split[0]);
- if(i<=0)
- continue;
-
- skill_arrow_db[k].nameid=i;
-
- for(x=1,y=0;split[x] && split[x+1] && y<5;x+=2,y++){
- skill_arrow_db[k].cre_id[y]=atoi(split[x]);
- skill_arrow_db[k].cre_amount[y]=atoi(split[x+1]);
- }
- k++;
- if(k >= MAX_SKILL_ARROW_DB)
- break;
- }
- fclose(fp);
- printf("read db/create_arrow_db.txt done (count=%d)\n",k);
-
- memset(skill_abra_db,0,sizeof(skill_abra_db));
- fp=fopen("db/abra_db.txt","r");
- if(fp==NULL){
- printf("can't read db/abra_db.txt\n");
- return 1;
- }
- k=0;
- while(fgets(line,1020,fp)){
- char *split[16];
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(split,0,sizeof(split));
- for(j=0,p=line;j<13 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
- if(split[0]==NULL)
- continue;
- i=atoi(split[0]);
- if(i<=0)
- continue;
-
- skill_abra_db[i].req_lv=atoi(split[2]);
- skill_abra_db[i].per=atoi(split[3]);
-
- k++;
- if(k >= MAX_SKILL_ABRA_DB)
- break;
- }
- fclose(fp);
- printf("read db/abra_db.txt done (count=%d)\n",k);
-
- fp=fopen("db/skill_castnodex_db.txt","r");
- if(fp==NULL){
- printf("can't read db/skill_castnodex_db.txt\n");
- return 1;
- }
- while(fgets(line,1020,fp)){
- char *split[50], *split2[MAX_SKILL_LEVEL];
- memset(split,0,sizeof(split));
- if(line[0]=='/' && line[1]=='/')
- continue;
- for(j=0,p=line;j<2 && p;j++){
- split[j]=p;
- p=strchr(p,',');
- if(p) *p++=0;
- }
-
- i=atoi(split[0]);
- if(i<0 || i>MAX_SKILL_DB)
- continue;
-
- memset(split2,0,sizeof(split2));
- for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
- split2[j]=p;
- p=strchr(p,':');
- if(p) *p++=0;
- }
- for(k=0;k<MAX_SKILL_LEVEL;k++)
- skill_db[i].castnodex[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
- }
- fclose(fp);
- printf("read db/skill_castnodex_db.txt done\n");
-
- return 0;
-}
-
-void skill_reload(void)
-{
- /*
-
- <empty skill database>
- <?>
-
- */
-
- do_init_skill();
-}
-
-/*==========================================
- * ƒXƒLƒ‹?ŒW‰Šú‰»?—
- *------------------------------------------
- */
-int do_init_skill(void)
-{
- skill_readdb();
-
- add_timer_func_list(skill_unit_timer,"skill_unit_timer");
- add_timer_func_list(skill_castend_id,"skill_castend_id");
- add_timer_func_list(skill_castend_pos,"skill_castend_pos");
- add_timer_func_list(skill_timerskill,"skill_timerskill");
- add_timer_func_list(skill_status_change_timer,"skill_status_change_timer");
- add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL);
-
- return 0;
-}
+// $Id: skill.c,v 1.8 2004/09/25 05:32:19 MouseJstr Exp $
+/* ƒXƒLƒ‹?ŒW */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "timer.h"
+#include "nullpo.h"
+#include "malloc.h"
+
+#include "skill.h"
+#include "map.h"
+#include "clif.h"
+#include "pc.h"
+#include "pet.h"
+#include "mob.h"
+#include "battle.h"
+#include "party.h"
+#include "itemdb.h"
+#include "script.h"
+#include "intif.h"
+#include "log.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+#define SKILLUNITTIMER_INVERVAL 100
+
+#define STATE_BLIND 0x10
+
+/* ƒXƒLƒ‹”Ô?„ƒXƒe?ƒ^ƒXˆÙí”Ô??Š·ƒe?ƒuƒ‹ */
+int SkillStatusChangeTable[]={ /* skill.h‚Ìenum‚ÌSC_***‚Æ‚ ‚킹‚邱‚Æ */
+/* 0- */
+ -1,-1,-1,-1,-1,-1,
+ SC_PROVOKE, /* ƒvƒƒ{ƒbƒN */
+ -1, 1,-1,
+/* 10- */
+ SC_SIGHT, /* ƒTƒCƒg */
+ -1,-1,-1,-1,
+ SC_FREEZE, /* ƒtƒƒXƒgƒ_ƒCƒo? */
+ SC_STONE, /* ƒXƒg?ƒ“ƒJ?ƒX */
+ -1,-1,-1,
+/* 20- */
+ -1,-1,-1,-1,
+ SC_RUWACH, /* ƒ‹ƒAƒt */
+ -1,-1,-1,-1,
+ SC_INCREASEAGI, /* ‘¬“x?‰Á */
+/* 30- */
+ SC_DECREASEAGI, /* ‘¬“xŒ¸­ */
+ -1,
+ SC_SIGNUMCRUCIS, /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
+ SC_ANGELUS, /* ƒGƒ“ƒWƒFƒ‰ƒX */
+ SC_BLESSING, /* ƒuƒŒƒbƒVƒ“ƒO */
+ -1,-1,-1,-1,-1,
+/* 40- */
+ -1,-1,-1,-1,-1,
+ SC_CONCENTRATE, /* W’†—ÍŒüã */
+ -1,-1,-1,-1,
+/* 50- */
+ -1,
+ SC_HIDING, /* ƒnƒCƒfƒBƒ“ƒO */
+ -1,-1,-1,-1,-1,-1,-1,-1,
+/* 60- */
+ SC_TWOHANDQUICKEN, /* 2HQ */
+ SC_AUTOCOUNTER,
+ -1,-1,-1,-1,
+ SC_IMPOSITIO, /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
+ SC_SUFFRAGIUM, /* ƒTƒtƒ‰ƒMƒEƒ€ */
+ SC_ASPERSIO, /* ƒAƒXƒyƒ‹ƒVƒI */
+ SC_BENEDICTIO, /* ¹?~•Ÿ */
+/* 70- */
+ -1,
+ SC_SLOWPOISON,
+ -1,
+ SC_KYRIE, /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
+ SC_MAGNIFICAT, /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
+ SC_GLORIA, /* ƒOƒƒŠƒA */
+ SC_DIVINA, /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
+ -1,
+ SC_AETERNA, /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
+ -1,
+/* 80- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 90- */
+ -1,-1,
+ SC_QUAGMIRE, /* ƒNƒ@ƒOƒ}ƒCƒA */
+ -1,-1,-1,-1,-1,-1,-1,
+/* 100- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 110- */
+ -1,
+ SC_ADRENALINE, /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
+ SC_WEAPONPERFECTION,/* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
+ SC_OVERTHRUST, /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
+ SC_MAXIMIZEPOWER, /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
+ -1,-1,-1,-1,-1,
+/* 120- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 130- */
+ -1,-1,-1,-1,-1,
+ SC_CLOAKING, /* ƒNƒ?ƒLƒ“ƒO */
+ SC_STAN, /* ƒ\ƒjƒbƒNƒuƒ? */
+ -1,
+ SC_ENCPOISON, /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
+ SC_POISONREACT, /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
+/* 140- */
+ SC_POISON, /* ƒxƒmƒ€ƒ_ƒXƒg */
+ SC_SPLASHER, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ -1,
+ SC_TRICKDEAD, /* Ž€‚ñ‚¾‚Ó‚è */
+ -1,-1,-1,-1,-1,-1,
+/* 150- */
+ -1,-1,-1,-1,-1,
+ SC_LOUD, /* ƒ‰ƒEƒhƒ{ƒCƒX */
+ -1,
+ SC_ENERGYCOAT, /* ƒGƒiƒW?ƒR?ƒg */
+ -1,-1,
+/* 160- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ -1,-1,-1,
+ SC_SELFDESTRUCTION,
+ -1,-1,-1,-1,-1,-1,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ -1,
+ SC_KEEPING,
+ -1,-1,
+ SC_BARRIER,
+ -1,-1,
+ SC_HALLUCINATION,
+ -1,-1,
+/* 210- */
+ -1,-1,-1,-1,-1,
+ SC_STRIPWEAPON,
+ SC_STRIPSHIELD,
+ SC_STRIPARMOR,
+ SC_STRIPHELM,
+ -1,
+/* 220- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 230- */
+ -1,-1,-1,-1,
+ SC_CP_WEAPON,
+ SC_CP_SHIELD,
+ SC_CP_ARMOR,
+ SC_CP_HELM,
+ -1,-1,
+/* 240- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,
+ SC_AUTOGUARD,
+/* 250- */
+ -1,-1,
+ SC_REFLECTSHIELD,
+ -1,-1,
+ SC_DEVOTION,
+ SC_PROVIDENCE,
+ SC_DEFENDER,
+ SC_SPEARSQUICKEN,
+ -1,
+/* 260- */
+ -1,-1,-1,-1,-1,-1,-1,-1,
+ SC_STEELBODY,
+ SC_BLADESTOP_WAIT,
+/* 270- */
+ SC_EXPLOSIONSPIRITS,
+ SC_EXTREMITYFIST,
+ -1,-1,-1,-1,
+ SC_MAGICROD,
+ -1,-1,-1,
+/* 280- */
+ SC_FLAMELAUNCHER,
+ SC_FROSTWEAPON,
+ SC_LIGHTNINGLOADER,
+ SC_SEISMICWEAPON,
+ -1,
+ SC_VOLCANO,
+ SC_DELUGE,
+ SC_VIOLENTGALE,
+ SC_LANDPROTECTOR,
+ -1,
+/* 290- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 300- */
+ -1,-1,-1,-1,-1,-1,
+ SC_LULLABY,
+ SC_RICHMANKIM,
+ SC_ETERNALCHAOS,
+ SC_DRUMBATTLE,
+/* 310- */
+ SC_NIBELUNGEN,
+ SC_ROKISWEIL,
+ SC_INTOABYSS,
+ SC_SIEGFRIED,
+ -1,-1,-1,
+ SC_DISSONANCE,
+ -1,
+ SC_WHISTLE,
+/* 320- */
+ SC_ASSNCROS,
+ SC_POEMBRAGI,
+ SC_APPLEIDUN,
+ -1,-1,
+ SC_UGLYDANCE,
+ -1,
+ SC_HUMMING,
+ SC_DONTFORGETME,
+ SC_FORTUNE,
+/* 330- */
+ SC_SERVICE4U,
+ SC_SELFDESTRUCTION,
+ -1,-1,-1,-1,-1,-1,-1,-1,
+/* 340- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+/* 350- */
+ -1,-1,-1,-1,-1,
+ SC_AURABLADE,
+ SC_PARRYING,
+ SC_CONCENTRATION,
+ SC_TENSIONRELAX,
+ SC_BERSERK,
+/* 360- */
+ SC_BERSERK,
+ SC_ASSUMPTIO,
+ SC_BASILICA,
+ -1,-1,-1,
+ SC_MAGICPOWER,
+ -1,-1,
+ SC_GOSPEL,
+/* 370- */
+ -1,-1,-1,-1,-1,-1,-1,-1,SC_EDP,-1,
+/* 380- */
+ SC_TRUESIGHT,
+ -1,-1,
+ SC_WINDWALK,
+ SC_MELTDOWN,
+ -1,-1,
+ SC_CARTBOOST,
+ -1,
+ SC_CHASEWALK,
+/* 390- */
+ SC_REJECTSWORD,
+ -1,-1,-1,-1,-1,
+ SC_MARIONETTE,
+ -1,
+ SC_HEADCRUSH,
+ SC_JOINTBEAT,
+/* 400 */
+ -1,-1,
+ SC_MINDBREAKER,
+ SC_MEMORIZE,
+ SC_FOGWALL,
+ SC_SPIDERWEB,
+ -1,-1,-1,-1,
+/* 410- */
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+};
+
+struct skill_name_db skill_names[] = {
+ { AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow" } ,
+ { AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration" } ,
+ { AC_DOUBLE, "DOUBLE", "Double_Strafe" } ,
+ { AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation" } ,
+ { AC_OWL, "OWL", "Owl's_Eye" } ,
+ { AC_SHOWER, "SHOWER", "Arrow_Shower" } ,
+ { AC_VULTURE, "VULTURE", "Vulture's_Eye" } ,
+ { ALL_RESURRECTION, "RESURRECTION", "Resurrection" } ,
+ { AL_ANGELUS, "ANGELUS", "Angelus" } ,
+ { AL_BLESSING, "BLESSING", "Blessing" } ,
+ { AL_CRUCIS, "CRUCIS", "Signum_Crusis" } ,
+ { AL_CURE, "CURE", "Cure" } ,
+ { AL_DECAGI, "DECAGI", "Decrease_AGI" } ,
+ { AL_DEMONBANE, "DEMONBANE", "Demon_Bane" } ,
+ { AL_DP, "DP", "Divine_Protection" } ,
+ { AL_HEAL, "HEAL", "Heal" } ,
+ { AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light" } ,
+ { AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta" } ,
+ { AL_INCAGI, "INCAGI", "Increase_AGI" } ,
+ { AL_PNEUMA, "PNEUMA", "Pneuma" } ,
+ { AL_RUWACH, "RUWACH", "Ruwach" } ,
+ { AL_TELEPORT, "TELEPORT", "Teleport" } ,
+ { AL_WARP, "WARP", "Warp_Portal" } ,
+ { AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror" } ,
+ { AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery" } ,
+ { AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher" } ,
+ { AM_BIOETHICS, "BIOETHICS", "Bioethics" } ,
+ { AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology" } ,
+ { AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus" } ,
+ { AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize" } ,
+ { AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor" } ,
+ { AM_CP_HELM, "HELM", "Chemical_Protection_Helm" } ,
+ { AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield" } ,
+ { AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon" } ,
+ { AM_CREATECREATURE, "CREATECREATURE", "Life_Creation" } ,
+ { AM_CULTIVATION, "CULTIVATION", "Cultivation" } ,
+ { AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration" } ,
+ { AM_DRILLMASTER, "DRILLMASTER", "Drillmaster" } ,
+ { AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control" } ,
+ { AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus" } ,
+ { AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION" } ,
+ { AM_PHARMACY, "PHARMACY", "Pharmacy" } ,
+ { AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher" } ,
+ { AM_REST, "REST", "Sabbath" } ,
+ { AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus" } ,
+ { AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine" } ,
+ { ASC_BREAKER, "BREAKER", "Breaker" } ,
+ { ASC_CDP, "CDP", "Create_Deadly_Poison" } ,
+ { ASC_EDP, "EDP", "Deadly_Poison_Enchantment" } ,
+ { ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk" } ,
+ { ASC_KATAR, "KATAR", "Advanced_Katar_Mastery" } ,
+ { ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault" } ,
+ { AS_CLOAKING, "CLOAKING", "Cloaking" } ,
+ { AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison" } ,
+ { AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth" } ,
+ { AS_KATAR, "KATAR", "Katar_Mastery" } ,
+ { AS_LEFT, "LEFT", "Lefthand_Mastery" } ,
+ { AS_POISONREACT, "POISONREACT", "Poison_React" } ,
+ { AS_RIGHT, "RIGHT", "Righthand_Mastery" } ,
+ { AS_SONICBLOW, "SONICBLOW", "Sonic_Blow" } ,
+ { AS_SPLASHER, "SPLASHER", "Venom_Splasher" } ,
+ { AS_VENOMDUST, "VENOMDUST", "Venom_Dust" } ,
+ { BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun" } ,
+ { BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross" } ,
+ { BA_DISSONANCE, "DISSONANCE", "Dissonance" } ,
+ { BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke" } ,
+ { BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson" } ,
+ { BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike" } ,
+ { BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi" } ,
+ { BA_WHISTLE, "WHISTLE", "Whistle" } ,
+ { BD_ADAPTATION, "ADAPTATION", "Adaption" } ,
+ { BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField" } ,
+ { BD_ENCORE, "ENCORE", "Encore" } ,
+ { BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos" } ,
+ { BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss" } ,
+ { BD_LULLABY, "LULLABY", "Lullaby" } ,
+ { BD_RAGNAROK, "RAGNAROK", "Ragnarok" } ,
+ { BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim" } ,
+ { BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen" } ,
+ { BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail" } ,
+ { BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried" } ,
+ { BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush" } ,
+ { BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2" } ,
+ { BS_AXE, "AXE", "Smith_Axe" } ,
+ { BS_DAGGER, "DAGGER", "Smith_Dagger" } ,
+ { BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft" } ,
+ { BS_FINDINGORE, "FINDINGORE", "Ore_Discovery" } ,
+ { BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall" } ,
+ { BS_HILTBINDING, "HILTBINDING", "Hilt_Binding" } ,
+ { BS_IRON, "IRON", "Iron_Tempering" } ,
+ { BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace" } ,
+ { BS_MACE, "MACE", "Smith_Mace" } ,
+ { BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize" } ,
+ { BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research" } ,
+ { BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust" } ,
+ { BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair" } ,
+ { BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering" } ,
+ { BS_SPEAR, "SPEAR", "Smith_Spear" } ,
+ { BS_STEEL, "STEEL", "Steel_Tempering" } ,
+ { BS_SWORD, "SWORD", "Smith_Sword" } ,
+ { BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword" } ,
+ { BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection" } ,
+ { BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research" } ,
+ { CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow" } ,
+ { CG_MARIONETTE, "MARIONETTE", "Marionette_Control" } ,
+ { CG_MOONLIT, "MOONLIT", "Moonlight_Petals" } ,
+ { CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo" } ,
+ { CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike" } ,
+ { CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul" } ,
+ { CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist" } ,
+ { CR_ALCHEMY, "ALCHEMY", "Alchemy" } ,
+ { CR_AUTOGUARD, "AUTOGUARD", "Guard" } ,
+ { CR_DEFENDER, "DEFENDER", "Defender" } ,
+ { CR_DEVOTION, "DEVOTION", "Sacrifice" } ,
+ { CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross" } ,
+ { CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross" } ,
+ { CR_PROVIDENCE, "PROVIDENCE", "Providence" } ,
+ { CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect" } ,
+ { CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang" } ,
+ { CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge" } ,
+ { CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken" } ,
+ { CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis" } ,
+ { CR_TRUST, "TRUST", "Faith" } ,
+ { DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson" } ,
+ { DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me" } ,
+ { DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss" } ,
+ { DC_HUMMING, "HUMMING", "Humming" } ,
+ { DC_SCREAM, "SCREAM", "Scream" } ,
+ { DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute" } ,
+ { DC_THROWARROW, "THROWARROW", "Throw_Arrow" } ,
+ { DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance" } ,
+ { HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio" } ,
+ { HP_BASILICA, "BASILICA", "Basilica" } ,
+ { HP_MEDITATIO, "MEDITATIO", "Meditation" } ,
+ { HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare" } ,
+ { HT_BEASTBANE, "BEASTBANE", "Beast_Bane" } ,
+ { HT_BLASTMINE, "BLASTMINE", "Blast_Mine" } ,
+ { HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat" } ,
+ { HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap" } ,
+ { HT_DETECTING, "DETECTING", "Detect" } ,
+ { HT_FALCON, "FALCON", "Falconry_Mastery" } ,
+ { HT_FLASHER, "FLASHER", "Flasher" } ,
+ { HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap" } ,
+ { HT_LANDMINE, "LANDMINE", "Land_Mine" } ,
+ { HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap" } ,
+ { HT_SANDMAN, "SANDMAN", "Sandman" } ,
+ { HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap" } ,
+ { HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap" } ,
+ { HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap" } ,
+ { HT_STEELCROW, "STEELCROW", "Steel_Crow" } ,
+ { HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box" } ,
+ { HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher" } ,
+ { HW_MAGICPOWER, "MAGICPOWER", "Magic_Power" } ,
+ { HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan" } ,
+ { HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain" } ,
+ { KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack" } ,
+ { KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash" } ,
+ { KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear" } ,
+ { KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery" } ,
+ { KN_PIERCE, "PIERCE", "Pierce" } ,
+ { KN_RIDING, "RIDING", "Peco_Peco_Ride" } ,
+ { KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang" } ,
+ { KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery" } ,
+ { KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab" } ,
+ { KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken" } ,
+ { LK_AURABLADE, "AURABLADE", "Aura_Blade" } ,
+ { LK_BERSERK, "BERSERK", "Berserk" } ,
+ { LK_CONCENTRATION, "CONCENTRATION", "Concentration" } ,
+ { LK_FURY, "FURY", "LK_FURY" } ,
+ { LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher" } ,
+ { LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat" } ,
+ { LK_PARRYING, "PARRYING", "Parrying" } ,
+ { LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce" } ,
+ { LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax" } ,
+ { MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution" } ,
+ { MC_CHANGECART, "CHANGECART", "Change_Cart" } ,
+ { MC_DISCOUNT, "DISCOUNT", "Discount" } ,
+ { MC_IDENTIFY, "IDENTIFY", "Item_Appraisal" } ,
+ { MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit" } ,
+ { MC_LOUD, "LOUD", "Lord_Exclamation" } ,
+ { MC_MAMMONITE, "MAMMONITE", "Mammonite" } ,
+ { MC_OVERCHARGE, "OVERCHARGE", "Overcharge" } ,
+ { MC_PUSHCART, "PUSHCART", "Pushcart" } ,
+ { MC_VENDING, "VENDING", "Vending" } ,
+ { MG_COLDBOLT, "COLDBOLT", "Cold_Bolt" } ,
+ { MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat" } ,
+ { MG_FIREBALL, "FIREBALL", "Fire_Ball" } ,
+ { MG_FIREBOLT, "FIREBOLT", "Fire_Bolt" } ,
+ { MG_FIREWALL, "FIREWALL", "Fire_Wall" } ,
+ { MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver" } ,
+ { MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt" } ,
+ { MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat" } ,
+ { MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall" } ,
+ { MG_SIGHT, "SIGHT", "Sight" } ,
+ { MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike" } ,
+ { MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery" } ,
+ { MG_STONECURSE, "STONECURSE", "Stone_Curse" } ,
+ { MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm" } ,
+ { MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits" } ,
+ { MO_BLADESTOP, "BLADESTOP", "Blade_Stop" } ,
+ { MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation" } ,
+ { MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits" } ,
+ { MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo" } ,
+ { MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish" } ,
+ { MO_DODGE, "DODGE", "Dodge" } ,
+ { MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits" } ,
+ { MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist" } ,
+ { MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive" } ,
+ { MO_INVESTIGATE, "INVESTIGATE", "Investigate" } ,
+ { MO_IRONHAND, "IRONHAND", "Iron_Hand" } ,
+ { MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery" } ,
+ { MO_STEELBODY, "STEELBODY", "Steel_Body" } ,
+ { MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows" } ,
+ { NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE" } ,
+ { NPC_BARRIER, "BARRIER", "NPC_BARRIER" } ,
+ { NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK" } ,
+ { NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN" } ,
+ { NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS" } ,
+ { NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE" } ,
+ { NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND" } ,
+ { NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY" } ,
+ { NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON" } ,
+ { NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS" } ,
+ { NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER" } ,
+ { NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND" } ,
+ { NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK" } ,
+ { NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH" } ,
+ { NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK" } ,
+ { NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING" } ,
+ { NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH" } ,
+ { NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS" } ,
+ { NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK" } ,
+ { NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER" } ,
+ { NPC_EMOTION, "EMOTION", "NPC_EMOTION" } ,
+ { NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN" } ,
+ { NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK" } ,
+ { NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK" } ,
+ { NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK" } ,
+ { NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION" } ,
+ { NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK" } ,
+ { NPC_KEEPING, "KEEPING", "NPC_KEEPING" } ,
+ { NPC_LICK, "LICK", "NPC_LICK" } ,
+ { NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK" } ,
+ { NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER" } ,
+ { NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS" } ,
+ { NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK" } ,
+ { NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT" } ,
+ { NPC_POISON, "POISON", "NPC_POISON" } ,
+ { NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK" } ,
+ { NPC_PROVOCATION, "PROVOCATION", "NPC_PROVOCATION" } ,
+ { NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK" } ,
+ { NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK" } ,
+ { NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH" } ,
+ { NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!" } ,
+ { NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2" } ,
+ { NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK" } ,
+ { NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK" } ,
+ { NPC_SMOKING, "SMOKING", "NPC_SMOKING" } ,
+ { NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK" } ,
+ { NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK" } ,
+ { NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE" } ,
+ { NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER" } ,
+ { NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE" } ,
+ { NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK" } ,
+ { NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION" } ,
+ { NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK" } ,
+ { NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK" } ,
+ { NV_BASIC, "BASIC", "Basic_Skill" } ,
+ { NV_FIRSTAID, "FIRSTAID", "First Aid" } ,
+ { NV_TRICKDEAD, "TRICKDEAD", "Play_Dead" } ,
+ { PA_GOSPEL, "GOSPEL", "Gospel" } ,
+ { PA_PRESSURE, "PRESSURE", "Pressure" } ,
+ { PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual" } ,
+ { PF_FOGWALL, "FOGWALL", "Wall_of_Fog" } ,
+ { PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion" } ,
+ { PF_MEMORIZE, "MEMORIZE", "Memorize" } ,
+ { PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker" } ,
+ { PF_SOULBURN, "SOULBURN", "Soul_Burn" } ,
+ { PF_SOULCHANGE, "SOULCHANGE", "Soul_Change" } ,
+ { PF_SPIDERWEB, "SPIDERWEB", "Spider_Web" } ,
+ { PR_ASPERSIO, "ASPERSIO", "Aspersio" } ,
+ { PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti" } ,
+ { PR_GLORIA, "GLORIA", "Gloria" } ,
+ { PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus" } ,
+ { PR_KYRIE, "KYRIE", "Kyrie_Eleison" } ,
+ { PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna" } ,
+ { PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina" } ,
+ { PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery" } ,
+ { PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat" } ,
+ { PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus" } ,
+ { PR_SANCTUARY, "SANCTUARY", "Santuary" } ,
+ { PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison" } ,
+ { PR_STRECOVERY, "STRECOVERY", "Status_Recovery" } ,
+ { PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium" } ,
+ { PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead" } ,
+ { RG_BACKSTAP, "BACKSTAP", "Back_Stab" } ,
+ { RG_CLEANER, "CLEANER", "Remover" } ,
+ { RG_COMPULSION, "COMPULSION", "Compulsion_Discount" } ,
+ { RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity" } ,
+ { RG_GANGSTER, "GANGSTER", "Gangster's_Paradise" } ,
+ { RG_GRAFFITI, "GRAFFITI", "Graffiti" } ,
+ { RG_INTIMIDATE, "INTIMIDATE", "Intimidate" } ,
+ { RG_PLAGIARISM, "PLAGIARISM", "Plagiarism" } ,
+ { RG_RAID, "RAID", "Raid" } ,
+ { RG_SNATCHER, "SNATCHER", "Snatcher" } ,
+ { RG_STEALCOIN, "STEALCOIN", "Steal_Coin" } ,
+ { RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor" } ,
+ { RG_STRIPHELM, "STRIPHELM", "Strip_Helm" } ,
+ { RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield" } ,
+ { RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon" } ,
+ { RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive" } ,
+ { SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus" } ,
+ { SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book" } ,
+ { SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast" } ,
+ { SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel" } ,
+ { SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change" } ,
+ { SA_COMA, "COMA", "Coma" } ,
+ { SA_DEATH, "DEATH", "Death" } ,
+ { SA_DELUGE, "DELUGE", "Deluge" } ,
+ { SA_DISPELL, "DISPELL", "Dispel" } ,
+ { SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology" } ,
+ { SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher" } ,
+ { SA_FORTUNE, "FORTUNE", "Fortune" } ,
+ { SA_FREECAST, "FREECAST", "Cast_Freedom" } ,
+ { SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon" } ,
+ { SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery" } ,
+ { SA_GRAVITY, "GRAVITY", "Gravity" } ,
+ { SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death" } ,
+ { SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector" } ,
+ { SA_LEVELUP, "LEVELUP", "Level_Up" } ,
+ { SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader" } ,
+ { SA_MAGICROD, "MAGICROD", "Magic_Rod" } ,
+ { SA_MONOCELL, "MONOCELL", "Monocell" } ,
+ { SA_QUESTION, "QUESTION", "Question?" } ,
+ { SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish" } ,
+ { SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon" } ,
+ { SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell" } ,
+ { SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster" } ,
+ { SA_TAMINGMONSTER, "TAMINGMONSTER", "Taming_Monster" } ,
+ { SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale" } ,
+ { SA_VOLCANO, "VOLCANO", "Volcano" } ,
+ { SG_DEVIL, "DEVIL", "Devil" } ,
+ { SG_FEEL, "FEEL", "Feel" } ,
+ { SG_FRIEND, "FRIEND", "Friend" } ,
+ { SG_FUSION, "FUSION", "Fusion" } ,
+ { SG_HATE, "HATE", "Hate" } ,
+ { SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge" } ,
+ { SG_MOON_ANGER, "ANGER", "Moon Anger" } ,
+ { SG_MOON_BLESS, "BLESS", "Moon Bless" } ,
+ { SG_MOON_COMFORT, "COMFORT", "Moon Comfort" } ,
+ { SG_MOON_WARM, "WARM", "Moon Warm" } ,
+ { SG_STAR_ANGER, "ANGER", "Star Anger" } ,
+ { SG_STAR_BLESS, "BLESS", "Star Bless" } ,
+ { SG_STAR_COMFORT, "COMFORT", "Star Comfort" } ,
+ { SG_STAR_WARM, "WARM", "Star Warm" } ,
+ { SG_SUN_ANGER, "ANGER", "Sun Anger" } ,
+ { SG_SUN_BLESS, "BLESS", "Sun Bless" } ,
+ { SG_SUN_COMFORT, "COMFORT", "Sun Comfort" } ,
+ { SG_SUN_WARM, "WARM", "Sun Warm" } ,
+ { SL_ALCHEMIST, "ALCHEMIST", "Alchemist" } ,
+ { SL_ASSASIN, "ASSASIN", "Assasin" } ,
+ { SL_BARDDANCER, "BARDDANCER", "Bard Dancer" } ,
+ { SL_BLACKSMITH, "BLACKSMITH", "Black Smith" } ,
+ { SL_CRUSADER, "CRUSADER", "Crusader" } ,
+ { SL_HUNTER, "HUNTER", "Hunter" } ,
+ { SL_KAAHI, "KAAHI", "Kaahi" } ,
+ { SL_KAINA, "KAINA", "Kaina" } ,
+ { SL_KAITE, "KAITE", "Kaite" } ,
+ { SL_KAIZEL, "KAIZEL", "Kaizel" } ,
+ { SL_KAUPE, "KAUPE", "Kaupe" } ,
+ { SL_KNIGHT, "KNIGHT", "Knight" } ,
+ { SL_MONK, "MONK", "Monk" } ,
+ { SL_PRIEST, "PRIEST", "Priest" } ,
+ { SL_ROGUE, "ROGUE", "Rogue" } ,
+ { SL_SAGE, "SAGE", "Sage" } ,
+ { SL_SKA, "SKA", "SKA" } ,
+ { SL_SKE, "SKE", "SKE" } ,
+ { SL_SMA, "SMA", "SMA" } ,
+ { SL_SOULLINKER, "SOULLINKER", "Soul Linker" } ,
+ { SL_STAR, "STAR", "Star" } ,
+ { SL_STIN, "STIN", "Stin" } ,
+ { SL_STUN, "STUN", "Stun" } ,
+ { SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice" } ,
+ { SL_SWOO, "SWOO", "Swoo" } ,
+ { SL_WIZARD, "WIZARD", "Wizard" } ,
+ { SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk" } ,
+ { SM_BASH, "BASH", "Bash" } ,
+ { SM_ENDURE, "ENDURE", "Endure" } ,
+ { SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point" } ,
+ { SM_MAGNUM, "MAGNUM", "Magnum_Break" } ,
+ { SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery" } ,
+ { SM_PROVOKE, "PROVOKE", "Provoke" } ,
+ { SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery" } ,
+ { SM_SWORD, "SWORD", "Sword_Mastery" } ,
+ { SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery" } ,
+ { SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault" } ,
+ { SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting" } ,
+ { SN_SIGHT, "SIGHT", "True_Sight" } ,
+ { SN_WINDWALK, "WINDWALK", "Wind_Walk" } ,
+ { ST_CHASEWALK, "CHASEWALK", "Chase_Walk" } ,
+ { ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword" } ,
+ { ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack" } ,
+ { TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding" } ,
+ { TF_DETOXIFY, "DETOXIFY", "Detoxify" } ,
+ { TF_DOUBLE, "DOUBLE", "Double_Attack" } ,
+ { TF_HIDING, "HIDING", "Hiding" } ,
+ { TF_MISS, "MISS", "Improve_Dodge" } ,
+ { TF_PICKSTONE, "PICKSTONE", "Take_Stone" } ,
+ { TF_POISON, "POISON", "Envenom" } ,
+ { TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand" } ,
+ { TF_STEAL, "STEAL", "Steal" } ,
+ { TF_THROWSTONE, "THROWSTONE", "Throw_Stone" } ,
+ { TK_COUNTER, "COUNTER", "Counter" } ,
+ { TK_DODGE, "DODGE", "Dodge" } ,
+ { TK_DOWNKICK, "DOWNKICK", "Down Kick" } ,
+ { TK_HIGHJUMP, "HIGHJUMP", "High Jump" } ,
+ { TK_HPTIME, "HPTIME", "HP Time" } ,
+ { TK_JUMPKICK, "JUMPKICK", "Jump Kick" } ,
+ { TK_POWER, "POWER", "Power" } ,
+ { TK_READYCOUNTER, "READYCOUNTER", "Ready Counter" } ,
+ { TK_READYDOWN, "READYDOWN", "Ready Down" } ,
+ { TK_READYSTORM, "READYSTORM", "Ready Storm" } ,
+ { TK_READYTURN, "READYTURN", "Ready Turn" } ,
+ { TK_RUN, "RUN", "TK_RUN" } ,
+ { TK_SEVENWIND, "SEVENWIND", "Seven Wind" } ,
+ { TK_SPTIME, "SPTIME", "SP Time" } ,
+ { TK_STORMKICK, "STORMKICK", "Storm Kick" } ,
+ { TK_TURNKICK, "TURNKICK", "Turn Kick" } ,
+ { WE_BABY, "BABY", "Adopt_Baby" } ,
+ { WE_CALLBABY, "CALLBABY", "Call_Baby" } ,
+ { WE_CALLPARENT, "CALLPARENT", "Call_Parent" } ,
+ { WE_CALLPARTNER, "CALLPARTNER", "I Want to See You" } ,
+ { WE_FEMALE, "FEMALE", "I Only Look Up to You" } ,
+ { WE_MALE, "MALE", "I Will Protect You" } ,
+ { WS_CARTBOOST, "CARTBOOST", "Cart_Boost" } ,
+ { WS_CREATECOIN, "CREATECOIN", "Create_Coins" } ,
+ { WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets" } ,
+ { WS_MELTDOWN, "MELTDOWN", "Meltdown" } ,
+ { WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower" } ,
+ { WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike" } ,
+ { WZ_ESTIMATION, "ESTIMATION", "Sense" } ,
+ { WZ_FIREIVY, "FIREIVY", "Fire_Ivy" } ,
+ { WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar" } ,
+ { WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova" } ,
+ { WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive" } ,
+ { WZ_ICEWALL, "ICEWALL", "Ice_Wall" } ,
+ { WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder" } ,
+ { WZ_METEOR, "METEOR", "Meteor_Storm" } ,
+ { WZ_QUAGMIRE, "QUAGMIRE", "Quagmire" } ,
+ { WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher" } ,
+ { WZ_STORMGUST, "STORMGUST", "Storm_Gust" } ,
+ { WZ_VERMILION, "VERMILION", "Lord_of_Vermilion" } ,
+ { WZ_WATERBALL, "WATERBALL", "Water_Ball" } ,
+ { 0, 0, 0 }
+};
+
+static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
+static const int diry[8]={1,1,0,-1,-1,-1,0,1};
+
+static int rdamage;
+
+/* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
+struct skill_db skill_db[MAX_SKILL_DB];
+
+/* ƒAƒCƒeƒ€ì¬ƒf?ƒ^ƒx?ƒX */
+struct skill_produce_db skill_produce_db[MAX_SKILL_PRODUCE_DB];
+
+/* –î쬃XƒLƒ‹ƒf?ƒ^ƒx?ƒX */
+struct skill_arrow_db skill_arrow_db[MAX_SKILL_ARROW_DB];
+
+/* ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
+struct skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB];
+
+int skill_get_hit( int id ){ return skill_db[id].hit; }
+int skill_get_inf( int id ){ return skill_db[id].inf; }
+int skill_get_pl( int id ){ return skill_db[id].pl; }
+int skill_get_nk( int id ){ return skill_db[id].nk; }
+int skill_get_max( int id ){ return skill_db[id].max; }
+int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0:skill_db[id].range[lv-1]; }
+int skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; }
+int skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].sp[lv-1]; }
+int skill_get_zeny( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; }
+int skill_get_num( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].num[lv-1]; }
+int skill_get_cast( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; }
+int skill_get_delay( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; }
+int skill_get_time( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; }
+int skill_get_time2( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; }
+int skill_get_castdef( int id ){ return skill_db[id].cast_def_rate; }
+int skill_get_weapontype( int id ){ return skill_db[id].weapon; }
+int skill_get_inf2( int id ){ return skill_db[id].inf2; }
+int skill_get_maxcount( int id ){ return skill_db[id].maxcount; }
+int skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; }
+int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; }
+int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; }
+
+/* ƒvƒƒgƒ^ƒCƒv */
+struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag);
+int skill_check_condition( struct map_session_data *sd,int type);
+int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
+int skill_frostjoke_scream(struct block_list *bl,va_list ap);
+int skill_status_change_timer_sub(struct block_list *bl, va_list ap );
+int skill_attack_area(struct block_list *bl,va_list ap);
+int skill_abra_dataset(int skilllv);
+int skill_clear_element_field(struct block_list *bl);
+int skill_landprotector(struct block_list *bl, va_list ap );
+int skill_trap_splash(struct block_list *bl, va_list ap );
+int skill_count_target(struct block_list *bl, va_list ap );
+
+// [MouseJstr] - skill ok to cast? and when?
+int skillnotok(int skillid, struct map_session_data *sd) {
+ if (sd == 0)
+ return 0;
+ if (pc_isGM(sd) >= 20)
+ return 0; // gm's can do anything damn thing they want
+ switch (skillid) {
+ case AL_WARP:
+ case AL_TELEPORT:
+ case MC_VENDING:
+ case MC_IDENTIFY:
+ return 0; // always allowed
+ default:
+ return(map[sd->bl.m].flag.noskill);
+ }
+}
+
+
+static int distance(int x0,int y0,int x1,int y1)
+{
+ int dx,dy;
+
+ dx=abs(x0-x1);
+ dy=abs(y0-y1);
+ return dx>dy ? dx : dy;
+}
+
+/* ƒXƒLƒ‹ƒ†ƒjƒbƒgID‚ð•Ô‚·i‚±‚ê‚àƒf?ƒ^ƒx?ƒX‚É“ü‚ꂽ‚¢‚Èj */
+int skill_get_unit_id(int id,int flag)
+{
+
+ switch(id){
+ case MG_SAFETYWALL: return 0x7e; /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ case MG_FIREWALL: return 0x7f; /* ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹ */
+ case AL_WARP: return (flag==0)?0x81:0x80; /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
+ case PR_BENEDICTIO: return 0x82; /* ¹?~•Ÿ */
+ case PR_SANCTUARY: return 0x83; /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
+ case PR_MAGNUS: return 0x84; /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
+ case AL_PNEUMA: return 0x85; /* ƒjƒ…?ƒ} */
+ case MG_THUNDERSTORM: return 0x86; /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
+ case WZ_HEAVENDRIVE: return 0x86; /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
+ case WZ_SIGHTRASHER: return 0x86; /* ƒTƒCƒgƒ‰ƒbƒVƒƒ? */
+ case WZ_METEOR: return 0x86; /* ƒƒeƒIƒXƒg?ƒ€ */
+ case WZ_VERMILION: return 0x86; /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
+ case WZ_FROSTNOVA: return 0x86; /* ƒtƒƒXƒgƒmƒ”ƒ@ */
+ case WZ_STORMGUST: return 0x86; /* ƒXƒg?ƒ€ƒKƒXƒg(‚Æ‚è‚ ‚¦‚¸LoV‚Æ“¯‚¶‚Å?—) */
+ case CR_GRANDCROSS: return 0x86; /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ case WZ_FIREPILLAR: return (flag==0)?0x87:0x88; /* ƒtƒ@ƒCƒA?ƒsƒ‰? */
+ case HT_TALKIEBOX: return 0x99; /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ case WZ_ICEWALL: return 0x8d; /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ case WZ_QUAGMIRE: return 0x8e; /* ƒNƒ@ƒOƒ}ƒCƒA */
+ case HT_BLASTMINE: return 0x8f; /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case HT_SKIDTRAP: return 0x90; /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ case HT_ANKLESNARE: return 0x91; /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ case AS_VENOMDUST: return 0x92; /* ƒxƒmƒ€ƒ_ƒXƒg */
+ case HT_LANDMINE: return 0x93; /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ case HT_SHOCKWAVE: return 0x94; /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ case HT_SANDMAN: return 0x95; /* ƒTƒ“ƒhƒ}ƒ“ */
+ case HT_FLASHER: return 0x96; /* ƒtƒ‰ƒbƒVƒƒ? */
+ case HT_FREEZINGTRAP: return 0x97; /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case HT_CLAYMORETRAP: return 0x98; /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ case SA_VOLCANO: return 0x9a; /* ƒ{ƒ‹ƒP?ƒm */
+ case SA_DELUGE: return 0x9b; /* ƒfƒŠƒ…?ƒW */
+ case SA_VIOLENTGALE: return 0x9c; /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ case SA_LANDPROTECTOR: return 0x9d; /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
+ case BD_LULLABY: return 0x9e; /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: return 0x9f; /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: return 0xa0; /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD:return 0xa1; /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: return 0xa2; /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: return 0xa3; /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: return 0xa4; /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: return 0xa5; /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BA_DISSONANCE: return 0xa6; /* •s‹¦˜a‰¹ */
+ case BA_WHISTLE: return 0xa7; /* Œû“J */
+ case BA_ASSASSINCROSS: return 0xa8; /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case BA_POEMBRAGI: return 0xa9; /* ƒuƒ‰ƒM‚ÌŽ */
+ case BA_APPLEIDUN: return 0xaa; /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case DC_UGLYDANCE: return 0xab; /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case DC_HUMMING: return 0xac; /* ƒnƒ~ƒ“ƒO */
+ case DC_DONTFORGETME: return 0xad; /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case DC_FORTUNEKISS: return 0xae; /* K‰^‚̃LƒX */
+ case DC_SERVICEFORYOU: return 0xaf; /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case RG_GRAFFITI: return 0xb0; /* ƒOƒ‰ƒtƒBƒeƒB */
+ case AM_DEMONSTRATION: return 0xb1; /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
+ case WE_CALLPARTNER: return 0xb2; /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
+ case PA_GOSPEL: return 0xb3; /* ƒSƒXƒyƒ‹ */
+ case HP_BASILICA: return 0xb4; /* ƒoƒWƒŠƒJ */
+ case PF_FOGWALL: return 0xb6; /* ƒtƒHƒOƒEƒH?ƒ‹ */
+ case PF_SPIDERWEB: return 0xb7; /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ }
+ return 0;
+ /*
+ 0x89,0x8a,0x8b •\Ž¦–³‚µ
+ 0x9a ‰Š?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
+ 0x9b …?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
+ 0x9c •—?«‚̉r¥‚Ý‚½‚¢‚ȃGƒtƒFƒNƒg
+ 0x9d ”’‚¢¬‚³‚ȃGƒtƒFƒNƒg
+ 0xb1 Alchemist Demonstration
+ 0xb2 = Pink Warp Portal
+ 0xb3 = Gospel For Paladin
+ 0xb4 = Basilica
+ 0xb5 = Empty
+ 0xb6 = Fog Wall for Professor
+ 0xb7 = Spider Web for Professor
+ 0xb8 = Empty
+ 0xb9 =
+ */
+}
+
+/*==========================================
+ * ƒXƒLƒ‹’ljÁ?‰Ê
+ *------------------------------------------
+ */
+int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick)
+{
+ /* MOB’ljÁ?‰ÊƒXƒLƒ‹—p */
+ const int sc[]={
+ SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN,
+ SC_STONE, SC_CURSE, SC_SLEEP
+ };
+ const int sc2[]={
+ MG_STONECURSE,MG_FROSTDIVER,NPC_STUNATTACK,
+ NPC_SLEEPATTACK,TF_POISON,NPC_CURSEATTACK,
+ NPC_SILENCEATTACK,0,NPC_BLINDATTACK
+ };
+
+ struct map_session_data *sd=NULL;
+ struct map_session_data *dstsd=NULL;
+ struct mob_data *md=NULL;
+ struct mob_data *dstmd=NULL;
+ struct pet_data *pd=NULL;
+
+ int skill,skill2;
+ int rate,luk;
+
+ int sc_def_mdef,sc_def_vit,sc_def_int,sc_def_luk;
+ int sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, bl);
+
+ if(skilllv <= 0) return 0;
+
+ if(src->type==BL_PC){
+ nullpo_retr(0, sd=(struct map_session_data *)src);
+ }else if(src->type==BL_MOB){
+ nullpo_retr(0, md=(struct mob_data *)src); //–¢Žg—pH
+ }else if(src->type==BL_PET){
+ nullpo_retr(0, pd=(struct pet_data *)src); // [Valaris]
+ }
+
+ //?Û‚Ì‘Ï«
+ luk = battle_get_luk(bl);
+ sc_def_mdef=100 - (3 + battle_get_mdef(bl) + luk/3);
+ sc_def_vit=100 - (3 + battle_get_vit(bl) + luk/3);
+ sc_def_int=100 - (3 + battle_get_int(bl) + luk/3);
+ sc_def_luk=100 - (3 + luk);
+ //Ž©•ª‚Ì‘Ï«
+ luk = battle_get_luk(src);
+ sc_def_mdef2=100 - (3 + battle_get_mdef(src) + luk/3);
+ sc_def_vit2=100 - (3 + battle_get_vit(src) + luk/3);
+ sc_def_int2=100 - (3 + battle_get_int(src) + luk/3);
+ sc_def_luk2=100 - (3 + luk);
+ if(bl->type==BL_PC)
+ dstsd=(struct map_session_data *)bl;
+ else if(bl->type==BL_MOB){
+ dstmd=(struct mob_data *)bl; //–¢Žg—pH
+ if(sc_def_mdef>50)
+ sc_def_mdef=50;
+ if(sc_def_vit>50)
+ sc_def_vit=50;
+ if(sc_def_int>50)
+ sc_def_int=50;
+ if(sc_def_luk>50)
+ sc_def_luk=50;
+ }
+ if(sc_def_mdef<0)
+ sc_def_mdef=0;
+ if(sc_def_vit<0)
+ sc_def_vit=0;
+ if(sc_def_int<0)
+ sc_def_int=0;
+
+ switch(skillid){
+ case 0: /* ’ÊíU? */
+ /* Ž©“®‘é */
+ if( sd && pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 &&
+ rand()%1000 <= sd->paramc[5]*10/3+1 ) {
+ int lv=(sd->status.job_level+9)/10;
+ skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000);
+ }
+ // ƒXƒiƒbƒ`ƒƒ?
+ if(sd && sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0)
+ if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) {
+ if(pc_steal_item(sd,bl))
+ clif_skill_nodamage(src,bl,TF_STEAL,skill2,1);
+ else
+ clif_skill_fail(sd,skillid,0,0);
+ }
+ break;
+
+ case SM_BASH: /* ƒoƒbƒVƒ…i‹}ŠU?j */
+ if( sd && (skill=pc_checkskill(sd,SM_FATALBLOW))>0 ){
+ if( rand()%100 < 6*(skilllv-5)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(SM_FATALBLOW,skilllv),0);
+ }
+ break;
+
+ case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ if(rand()%100< (2*skilllv+10)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_POISON,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ else{
+ if(sd && skillid==TF_POISON)
+ clif_skill_fail(sd,skillid,0,0);
+ }
+ break;
+
+ case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
+ if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ rate=skilllv*3+35;
+ if(rand()%100 < rate*sc_def_mdef/100)
+ skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo? */
+ case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
+ rate=(skilllv*3+35)*sc_def_mdef/100-(battle_get_int(bl)+battle_get_luk(bl))/15;
+ rate=rate<=5?5:rate;
+ if(rand()%100 < rate)
+ skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ else if(sd && skillid==MG_FROSTDIVER)
+ clif_skill_fail(sd,skillid,0,0);
+ break;
+
+ case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
+ {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ if(sc_data) {
+ sc_data[SC_FREEZE].val3++;
+ if(sc_data[SC_FREEZE].val3 >= 3)
+ skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ }
+ }
+ break;
+
+ case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ if( rand()%100 < (5*skilllv+30)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ if(map[bl->m].flag.pvp && dstsd){
+ dstsd->status.sp -= dstsd->status.sp*(5+15*skilllv)/100;
+ pc_calcstatus(dstsd,0);
+ }
+ break;
+ case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
+ if( rand()%100 < (5*skilllv+30)*sc_def_int/100 )
+ skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case TF_SPRINKLESAND: /* »‚Ü‚« */
+ if( rand()%100 < 20*sc_def_int/100 )
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case TF_THROWSTONE: /* ΓŠ‚° */
+ if( rand()%100 < 7*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
+ if( rand()%100 < 3*skilllv*sc_def_int/100 )
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ {
+ int race = battle_get_race(bl);
+ if( (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && rand()%100 < 100000*sc_def_int/100) //?§•t?‚¾‚ªŠ®‘S‘Ï«‚É‚Í–³?
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ }
+ break;
+
+ case CR_SHIELDCHARGE: /* ƒV?ƒ‹ƒhƒ`ƒƒ?ƒW */
+ if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
+ if( rand()%100 < (10+3*skilllv)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case BA_FROSTJOKE:
+ if(rand()%100 < (15+5*skilllv)*sc_def_mdef/100)
+ skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case DC_SCREAM:
+ if( rand()%100 < (25+5*skilllv)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case BD_LULLABY: /* ŽqŽç‰S */
+ if( rand()%100 < 15*sc_def_int/100 )
+ skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ /* MOB‚̒ljÁ?‰Ê•t‚«ƒXƒLƒ‹ */
+
+ case NPC_PETRIFYATTACK:
+ if(rand()%100 < sc_def_mdef)
+ skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case NPC_POISON:
+ case NPC_SILENCEATTACK:
+ case NPC_STUNATTACK:
+ if(rand()%100 < sc_def_vit && src->type!=BL_PET)
+ skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ if(src->type==BL_PET)
+ skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skilllv*1000,0);
+ break;
+ case NPC_CURSEATTACK:
+ if(rand()%100 < sc_def_luk)
+ skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case NPC_SLEEPATTACK:
+ case NPC_BLINDATTACK:
+ if(rand()%100 < sc_def_int)
+ skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case NPC_MENTALBREAKER:
+ if(dstsd) {
+ int sp = dstsd->status.max_sp*(10+skilllv)/100;
+ if(sp < 1) sp = 1;
+ pc_heal(dstsd,0,-sp);
+ }
+ break;
+
+// -- moonsoul (adding status effect chance given to wizard aoe skills meteor and vermillion)
+//
+ case WZ_METEOR:
+ if(rand()%100 < sc_def_vit)
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case WZ_VERMILION:
+ if(rand()%100 < sc_def_int)
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+// -- moonsoul (stun ability of new champion skill tigerfist)
+//
+ case CH_TIGERFIST:
+ if( rand()%100 < (10 + skilllv*10)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case LK_SPIRALPIERCE:
+ if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case ST_REJECTSWORD: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ if( rand()%100 < (skilllv*15) )
+ skill_status_change_start(bl,SC_AUTOCOUNTER,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case PF_FOGWALL: /* ƒz?ƒŠ?ƒNƒƒX */
+ if( rand()%100 < 3*skilllv*sc_def_int/100 )
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ {//?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
+ int race=battle_get_race(bl);
+ if( !(battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_HEADCRUSH,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ }
+ break;
+ case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
+ //?Œ‚ª—Ç‚­•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
+ if( rand()%100 < (2*skilllv+10)*sc_def_vit/100 )
+ skill_status_change_start(bl,SC_JOINTBEAT,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ {
+ int sec=skill_get_time2(skillid,skilllv);
+ if(map[src->m].flag.pvp) //PvP‚Å‚ÍS‘©ŽžŠÔ”¼Œ¸H
+ sec = sec/2;
+ battle_stopwalking(bl,1);
+ skill_status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0);
+ }
+ break;
+ case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
+ if( rand()%100 < (15 + skilllv*5)*sc_def_vit/100 ) //?‘ÔˆÙí‚ÍÚׂª•ª‚©‚ç‚È‚¢‚Ì‚Å“K?‚É
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ if( rand()%100 < (10+3*skilllv)*sc_def_int/100 )
+ skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+ case MO_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
+ //ˆ¢C—…‚ðŽg‚¤‚Æ5•ªŠÔŽ©‘R‰ñ•œ‚µ‚È‚¢‚悤‚É‚È‚é
+ skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0 );
+ break;
+ }
+
+ if(sd && skillid != MC_CARTREVOLUTION && attack_type&BF_WEAPON){ /* ƒJ?ƒh‚É‚æ‚é’ljÁ?‰Ê */
+ int i;
+ int sc_def_card=100;
+
+ for(i=SC_STONE;i<=SC_BLIND;i++){
+ //?Û‚É?‘ÔˆÙí
+ if(i==SC_STONE || i==SC_FREEZE)
+ sc_def_card=sc_def_mdef;
+ else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE)
+ sc_def_card=sc_def_vit;
+ else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND)
+ sc_def_card=sc_def_int;
+ else if(i==SC_CURSE)
+ sc_def_card=sc_def_luk;
+
+ if(!sd->state.arrow_atk) {
+ if(rand()%10000 < (sd->addeff[i-SC_STONE])*sc_def_card/100 ){
+ if(battle_config.battle_log)
+ printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]);
+ skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
+ }
+ }
+ else {
+ if(rand()%10000 < (sd->addeff[i-SC_STONE]+sd->arrow_addeff[i-SC_STONE])*sc_def_card/100 ){
+ if(battle_config.battle_log)
+ printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]);
+ skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
+ }
+ }
+ //Ž©•ª‚É?‘ÔˆÙí
+ if(i==SC_STONE || i==SC_FREEZE)
+ sc_def_card=sc_def_mdef2;
+ else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE)
+ sc_def_card=sc_def_vit2;
+ else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND)
+ sc_def_card=sc_def_int2;
+ else if(i==SC_CURSE)
+ sc_def_card=sc_def_luk2;
+
+ if(!sd->state.arrow_atk) {
+ if(rand()%10000 < (sd->addeff2[i-SC_STONE])*sc_def_card/100 ){
+ if(battle_config.battle_log)
+ printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]);
+ skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
+ }
+ }
+ else {
+ if(rand()%10000 < (sd->addeff2[i-SC_STONE]+sd->arrow_addeff2[i-SC_STONE])*sc_def_card/100 ){
+ if(battle_config.battle_log)
+ printf("PC %d skill_addeff: card‚É‚æ‚éˆÙí?“® %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]);
+ skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*=========================================================================
+ ƒXƒLƒ‹U?‚«”ò‚΂µ?—
+-------------------------------------------------------------------------*/
+int skill_blown( struct block_list *src, struct block_list *target,int count)
+{
+ int dx=0,dy=0,nx,ny;
+ int x=target->x,y=target->y;
+ int ret,prev_state=MS_IDLE;
+ int moveblock;
+ struct map_session_data *sd=NULL;
+ struct mob_data *md=NULL;
+ struct pet_data *pd=NULL;
+ struct skill_unit *su=NULL;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, target);
+
+ if(target->type==BL_PC){
+ nullpo_retr(0, sd=(struct map_session_data *)target);
+ }else if(target->type==BL_MOB){
+ nullpo_retr(0, md=(struct mob_data *)target);
+ }else if(target->type==BL_PET){
+ nullpo_retr(0, pd=(struct pet_data *)target);
+ }else if(target->type==BL_SKILL){
+ nullpo_retr(0, su=(struct skill_unit *)target);
+ }else return 0;
+
+ if(!(count&0x10000 && (sd||md||pd||su))){ /* Žw’è‚È‚µ‚È‚çˆÊ’u?ŒW‚©‚ç•ûŒü‚ð‹‚ß‚é */
+ dx=target->x-src->x; dx=(dx>0)?1:((dx<0)?-1: 0);
+ dy=target->y-src->y; dy=(dy>0)?1:((dy<0)?-1: 0);
+ }
+ if(dx==0 && dy==0){
+ int dir=battle_get_dir(target);
+ if(dir>=0 && dir<8){
+ dx=-dirx[dir];
+ dy=-diry[dir];
+ }
+ }
+
+ ret=path_blownpos(target->m,x,y,dx,dy,count&0xffff);
+ nx=ret>>16;
+ ny=ret&0xffff;
+ moveblock=( x/BLOCK_SIZE != nx/BLOCK_SIZE || y/BLOCK_SIZE != ny/BLOCK_SIZE);
+
+ if(count&0x20000) {
+ battle_stopwalking(target,1);
+ if(sd){
+ sd->to_x=nx;
+ sd->to_y=ny;
+ sd->walktimer = 1;
+ clif_walkok(sd);
+ clif_movechar(sd);
+ }
+ else if(md) {
+ md->to_x=nx;
+ md->to_y=ny;
+ prev_state = md->state.state;
+ md->state.state = MS_WALK;
+ clif_fixmobpos(md);
+ }
+ else if(pd) {
+ pd->to_x=nx;
+ pd->to_y=ny;
+ prev_state = pd->state.state;
+ pd->state.state = MS_WALK;
+ clif_fixpetpos(pd);
+ }
+ }
+ else
+ battle_stopwalking(target,2);
+
+ dx = nx - x;
+ dy = ny - y;
+
+ if(sd) /* ?–ÊŠO‚Éo‚½‚Ì‚ÅÁ‹Ž */
+ map_foreachinmovearea(clif_pcoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd);
+ else if(md)
+ map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md);
+ else if(pd)
+ map_foreachinmovearea(clif_petoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,pd);
+
+ if(su){
+ skill_unit_move_unit_group(su->group,target->m,dx,dy);
+ }else{
+// struct status_change *sc_data=battle_get_sc_data(target);
+ if(moveblock) map_delblock(target);
+ target->x=nx;
+ target->y=ny;
+ if(moveblock) map_addblock(target);
+/*ƒ_ƒ“ƒX’†‚ɃGƒtƒFƒNƒg‚͈ړ®‚µ‚È‚¢‚炵‚¢
+ if(sc_data && sc_data[SC_DANCING].timer!=-1){ //?Û‚ªƒ_ƒ“ƒX’†‚Ȃ̂ŃGƒtƒFƒNƒg‚àˆÚ“®
+ struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[SC_DANCING].val2;
+ if(sg)
+ skill_unit_move_unit_group(sg,target->m,dx,dy);
+ }
+*/
+ }
+
+ if(sd) { /* ?–Ê?‚É“ü‚Á‚Ä‚«‚½‚Ì‚Å•\Ž¦ */
+ map_foreachinmovearea(clif_pcinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,0,sd);
+ if(count&0x20000)
+ sd->walktimer = -1;
+ }
+ else if(md) {
+ map_foreachinmovearea(clif_mobinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,md);
+ if(count&0x20000)
+ md->state.state = prev_state;
+ }
+ else if(pd) {
+ map_foreachinmovearea(clif_petinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,pd);
+ if(count&0x20000)
+ pd->state.state = prev_state;
+ }
+
+ skill_unit_move(target,gettick(),(count&0xffff)+7); /* ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì”»’è */
+
+ return 0;
+}
+
+
+/*
+ * =========================================================================
+ * ƒXƒLƒ‹U??‰Ê?—‚Ü‚Æ‚ß
+ * flag‚Ì?–¾B16i?
+ * 00XRTTff
+ * ff = magic‚ÅŒvŽZ‚É“n‚³‚ê‚éj
+ * TT = ƒpƒPƒbƒg‚Ìtype•”•ª(0‚ŃfƒtƒHƒ‹ƒgj
+ * X = ƒpƒPƒbƒg‚̃XƒLƒ‹Lv
+ * R = —\–ñiskill_area_sub‚ÅŽg—p‚·‚éj
+ *-------------------------------------------------------------------------
+ */
+
+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 )
+{
+
+ if(skilllv <= 0) return 0;
+
+ struct Damage dmg;
+ struct status_change *sc_data;
+ int type,lv,damage;
+
+ rdamage = 0;
+ nullpo_retr(0, src);
+ nullpo_retr(0, dsrc);
+ nullpo_retr(0, bl);
+
+ sc_data = battle_get_sc_data(bl);
+
+//‰½‚à‚µ‚È‚¢”»’肱‚±‚©‚ç
+ if(dsrc->m != bl->m) //?Û‚ª“¯‚¶ƒ}ƒbƒv‚É‚¢‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
+ return 0;
+ if(src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prev‚æ‚­‚í‚©‚ç‚È‚¢¦
+ return 0;
+ if(src->type == BL_PC && pc_isdead((struct map_session_data *)src)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
+ return 0;
+ if(dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //pŽÒH‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
+ return 0;
+ if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?Û‚ªPC‚Å‚·‚Å‚ÉŽ€‚ñ‚Å‚¢‚½‚牽‚à‚µ‚È‚¢
+ return 0;
+ if(bl->type == BL_PC && skillnotok(skillid, (struct map_session_data *) bl))
+ return 0; // [MouseJstr]
+ if(sc_data && sc_data[SC_HIDING].timer != -1) { //ƒnƒCƒfƒBƒ“ƒO?‘Ô‚Å
+ if(skill_get_pl(skillid) != 2) //ƒXƒLƒ‹‚Ì?«‚ª’n?«‚Å‚È‚¯‚ê‚Ή½‚à‚µ‚È‚¢
+ return 0;
+ }
+ if(sc_data && sc_data[SC_TRICKDEAD].timer != -1) //Ž€‚ñ‚¾‚Ó‚è’†‚͉½‚à‚µ‚È‚¢
+ return 0;
+ if(skillid == WZ_STORMGUST) { //Žg—pƒXƒLƒ‹‚ªƒXƒg?ƒ€ƒKƒXƒg‚Å
+ if(sc_data && sc_data[SC_FREEZE].timer != -1) //“€Œ‹?‘ԂȂ牽‚à‚µ‚È‚¢
+ return 0;
+ }
+ if(skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //Žg—pƒXƒLƒ‹‚ªƒtƒƒXƒgƒmƒ”ƒ@‚ÅAdsrc‚Æbl‚ª“¯‚¶êŠ‚Ȃ牽‚à‚µ‚È‚¢
+ return 0;
+ if(src->type == BL_PC && ((struct map_session_data *)src)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
+ return 0;
+ if(dsrc->type == BL_PC && ((struct map_session_data *)dsrc)->chatID) //pŽÒ‚ªPC‚Ń`ƒƒƒbƒg’†‚Ȃ牽‚à‚µ‚È‚¢
+ return 0;
+ if(src->type == BL_PC && bl && mob_gvmobcheck(((struct map_session_data *)src),bl)==0)
+ return 0;
+
+//‰½‚à‚µ‚È‚¢”»’肱‚±‚Ü‚Å
+
+ type=-1;
+ lv=(flag>>20)&0xf;
+ dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff ); //ƒ_ƒ?ƒWŒvŽZ
+
+//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚©‚ç
+ if(attack_type&BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1 && src == dsrc) { //–‚–@U?‚Ń}ƒWƒbƒNƒƒbƒh?‘Ô‚Åsrc=dsrc‚È‚ç
+ dmg.damage = dmg.damage2 = 0; //ƒ_ƒ?ƒW0
+ if(bl->type == BL_PC) { //?Û‚ªPC‚Ìê‡
+ int sp = skill_get_sp(skillid,skilllv); //Žg—p‚³‚ꂽƒXƒLƒ‹‚ÌSP‚ð‹z?
+ sp = sp * sc_data[SC_MAGICROD].val2 / 100; //‹z?—¦ŒvŽZ
+ if(skillid == WZ_WATERBALL && skilllv > 1) //ƒEƒH?ƒ^?ƒ{?ƒ‹Lv1ˆÈã
+ sp = sp/((skilllv|1)*(skilllv|1)); //‚³‚ç‚ÉŒvŽZH
+ if(sp > 0x7fff) sp = 0x7fff; //SP‘½‚·‚¬‚Ìꇂ͗˜_Å‘å’l
+ else if(sp < 1) sp = 1; //1ˆÈ‰º‚ÌꇂÍ1
+ if(((struct map_session_data *)bl)->status.sp + sp > ((struct map_session_data *)bl)->status.max_sp) { //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚è‘å‚«‚¢ê‡
+ sp = ((struct map_session_data *)bl)->status.max_sp - ((struct map_session_data *)bl)->status.sp; //SP‚ðMSP-Œ»ÝSP‚É‚·‚é
+ ((struct map_session_data *)bl)->status.sp = ((struct map_session_data *)bl)->status.max_sp; //Œ»Ý‚ÌSP‚ÉMSP‚ð‘ã“ü
+ }
+ else //‰ñ•œSP+Œ»Ý‚ÌSP‚ªMSP‚æ‚謂³‚¢ê‡‚͉ñ•œSP‚ð‰ÁŽZ
+ ((struct map_session_data *)bl)->status.sp += sp;
+ clif_heal(((struct map_session_data *)bl)->fd,SP_SP,sp); //SP‰ñ•œƒGƒtƒFƒNƒg‚Ì•\Ž¦
+ ((struct map_session_data *)bl)->canact_tick = tick + skill_delayfix(bl, skill_get_delay(SA_MAGICROD,sc_data[SC_MAGICROD].val1)); //
+ }
+ clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1); //ƒ}ƒWƒbƒNƒƒbƒhƒGƒtƒFƒNƒg‚ð•\Ž¦
+ }
+//ƒ}ƒWƒbƒNƒƒbƒh?—‚±‚±‚Ü‚Å
+
+ if(src->type==BL_PET) { // [Valaris]
+ dmg.damage=battle_attr_fix(skilllv, skill_get_pl(skillid), battle_get_element(bl) );
+ dmg.damage2=0;
+ }
+
+ damage = dmg.damage + dmg.damage2;
+
+ if(lv==15)
+ lv=-1;
+
+ if( flag&0xff00 )
+ type=(flag&0xff00)>>8;
+
+ if(damage <= 0 || damage < dmg.div_) //‚«”ò‚΂µ”»’èH¦
+ dmg.blewcount = 0;
+
+ if(skillid == CR_GRANDCROSS) {//ƒOƒ‰ƒ“ƒhƒNƒƒX
+ if(battle_config.gx_disptype) dsrc = src; // “Gƒ_ƒ?ƒW”’•¶Žš•\Ž¦
+ if( src == bl) type = 4; // ”½“®‚̓_ƒ?ƒWƒ‚?ƒVƒ‡ƒ“‚È‚µ
+ }
+
+//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚©‚ç
+ if(src->type == BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *)src;
+ nullpo_retr(0, sd);
+//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚©‚ç
+ if(skillid == MO_CHAINCOMBO) {
+ int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); //Šî–{ƒfƒBƒŒƒC‚ÌŒvŽZ
+ if(damage < battle_get_hp(bl)) { //ƒ_ƒ?ƒW‚ª?Û‚ÌHP‚æ‚謂³‚¢ê‡
+ if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //–Ò—´Œ(MO_COMBOFINISH)Žæ“¾•?‹…•ÛŽŽž‚Í+300ms
+ delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
+
+ skill_status_change_start(src,SC_COMBO,MO_CHAINCOMBO,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
+ }
+ sd->attackabletime = sd->canmove_tick = tick + delay;
+ clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
+ }
+//˜A‘Ŷ(MO_CHAINCOMBO)‚±‚±‚Ü‚Å
+//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚©‚ç
+ else if(skillid == MO_COMBOFINISH) {
+ int delay = 700 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
+ if(damage < battle_get_hp(bl)) {
+ //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
+ //•šŒÕŒ(CH_TIGERFIST)Žæ“¾Žž‚à+300ms
+ if((pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) ||
+ (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) ||
+ (pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1))
+ delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
+
+ skill_status_change_start(src,SC_COMBO,MO_COMBOFINISH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
+ }
+ sd->attackabletime = sd->canmove_tick = tick + delay;
+ clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
+ }
+//–Ò—´Œ(MO_COMBOFINISH)‚±‚±‚Ü‚Å
+//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚©‚ç
+ else if(skillid == CH_TIGERFIST) {
+ int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
+ if(damage < battle_get_hp(bl)) {
+ if(pc_checkskill(sd, CH_CHAINCRUSH) > 0) //˜A’Œ•ö?(CH_CHAINCRUSH)Žæ“¾Žž‚Í+300ms
+ delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
+
+ skill_status_change_start(src,SC_COMBO,CH_TIGERFIST,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
+ }
+ sd->attackabletime = sd->canmove_tick = tick + delay;
+ clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
+ }
+//•šŒÕŒ(CH_TIGERFIST)‚±‚±‚Ü‚Å
+//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚©‚ç
+ else if(skillid == CH_CHAINCRUSH) {
+ int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src);
+ if(damage < battle_get_hp(bl)) {
+ //ˆ¢C—…”e™€Œ(MO_EXTREMITYFIST)Žæ“¾•?‹…4ŒÂ•ÛŽ•”š—ô”g“®(MO_EXPLOSIONSPIRITS)?‘ÔŽž‚Í+300ms
+ if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1)
+ delay += 300 * battle_config.combo_delay_rate /100; //’ljÁƒfƒBƒŒƒC‚ðconf‚É‚æ‚è’²®
+
+ skill_status_change_start(src,SC_COMBO,CH_CHAINCRUSH,skilllv,0,0,delay,0); //ƒRƒ“ƒ{?‘Ô‚É
+ }
+ sd->attackabletime = sd->canmove_tick = tick + delay;
+ clif_combo_delay(src,delay); //ƒRƒ“ƒ{ƒfƒBƒŒƒCƒpƒPƒbƒg‚Ì‘—M
+ }
+//˜A’Œ•ö?(CH_CHAINCRUSH)‚±‚±‚Ü‚Å
+ }
+//Žg—pŽÒ‚ªPC‚ÌꇂÌ?—‚±‚±‚Ü‚Å
+//•ŠíƒXƒLƒ‹H‚±‚±‚©‚ç
+ //AppleGirl Was Here
+ if(attack_type&BF_MAGIC && damage > 0 && src != bl && src == dsrc) { //Blah Blah
+ if(bl->type == BL_PC) { //Blah Blah
+ struct map_session_data *tsd = (struct map_session_data *)bl;
+ if(tsd->magic_damage_return > 0) { //More Blah
+ rdamage += damage * tsd->magic_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ }
+ //Stop Here
+ if(attack_type&BF_WEAPON && damage > 0 && src != bl && src == dsrc) { //•ŠíƒXƒLƒ‹•ƒ_ƒ?ƒW‚ ‚è•Žg—pŽÒ‚Æ?ÛŽÒ‚ªˆá‚¤•src=dsrc
+ if(dmg.flag&BF_SHORT) { //‹ß‹——£U?ŽžH¦
+ if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
+ struct map_session_data *tsd = (struct map_session_data *)bl;
+ nullpo_retr(0, tsd);
+ if(tsd->short_weapon_damage_return > 0) { //‹ß‹——£U?’µ‚Ë•Ô‚µH¦
+ rdamage += damage * tsd->short_weapon_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ if(sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) { //ƒŠƒtƒŒƒNƒgƒV?ƒ‹ƒhŽž
+ rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //’µ‚Ë•Ô‚µŒvŽZ
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ else if(dmg.flag&BF_LONG) { //‰“‹——£U?ŽžH¦
+ if(bl->type == BL_PC) { //?Û‚ªPC‚ÌŽž
+ struct map_session_data *tsd = (struct map_session_data *)bl;
+ nullpo_retr(0, tsd);
+ if(tsd->long_weapon_damage_return > 0) { //‰“‹——£U?’µ‚Ë•Ô‚µH¦
+ rdamage += damage * tsd->long_weapon_damage_return / 100;
+ if(rdamage < 1) rdamage = 1;
+ }
+ }
+ }
+ if(rdamage > 0)
+ clif_damage(src,src,tick, dmg.amotion,0,rdamage,1,4,0);
+ }
+//•ŠíƒXƒLƒ‹H‚±‚±‚Ü‚Å
+
+ switch(skillid){
+ case WZ_SIGHTRASHER:
+ clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, 5);
+ break;
+ case AS_SPLASHER:
+ clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5);
+ break;
+ case NPC_SELFDESTRUCTION:
+ case NPC_SELFDESTRUCTION2:
+ break;
+ default:
+ clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, (skillid==0)? 5:type );
+ }
+ if(dmg.blewcount > 0 && !map[src->m].flag.gvg) { /* ‚«”ò‚΂µ?—‚Æ‚»‚̃pƒPƒbƒg */
+ if(skillid == WZ_SIGHTRASHER)
+ skill_blown(src,bl,dmg.blewcount);
+ else
+ skill_blown(dsrc,bl,dmg.blewcount);
+ if(bl->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)bl);
+ else if(bl->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)bl);
+ else
+ clif_fixpos(bl);
+ }
+
+ map_freeblock_lock();
+ /* ?ۂɃ_ƒ?ƒW?—‚ðs‚¤ */
+ if(skillid != KN_BOWLINGBASH || flag)
+ battle_damage(src,bl,damage,0);
+ if(skillid == RG_INTIMIDATE && damage > 0 && !(battle_get_mode(bl)&0x20) && !map[src->m].flag.gvg ) {
+ int s_lv = battle_get_lv(src),t_lv = battle_get_lv(bl);
+ int rate = 50 + skilllv * 5;
+ rate = rate + (s_lv - t_lv);
+ if(rand()%100 < rate)
+ skill_addtimerskill(src,tick + 800,bl->id,0,0,skillid,skilllv,0,flag);
+ }
+ if(damage > 0 && dmg.flag&BF_SKILL && bl->type==BL_PC && pc_checkskill((struct map_session_data *)bl,RG_PLAGIARISM)){
+ struct map_session_data *tsd = (struct map_session_data *)bl;
+ nullpo_retr(0, tsd);
+ if(!tsd->status.skill[skillid].id && !tsd->status.skill[skillid].id
+ && !(skillid > NPC_PIERCINGATT && skillid < NPC_SUMMONMONSTER) ){
+ //?‚É?‚ñ‚Å‚¢‚éƒXƒLƒ‹‚ª‚ ‚ê‚ΊY?ƒXƒLƒ‹‚ðÁ‚·
+ if (tsd->cloneskill_id && tsd->cloneskill_lv && tsd->status.skill[tsd->cloneskill_id].flag==13){
+ tsd->status.skill[tsd->cloneskill_id].id=0;
+ tsd->status.skill[tsd->cloneskill_id].lv=0;
+ tsd->status.skill[tsd->cloneskill_id].flag=0;
+ }
+ tsd->cloneskill_id=skillid;
+ tsd->cloneskill_lv=skilllv;
+ tsd->status.skill[skillid].id=skillid;
+ tsd->status.skill[skillid].lv=(pc_checkskill(tsd,RG_PLAGIARISM) > skill_get_max(skillid))?
+ skill_get_max(skillid):pc_checkskill(tsd,RG_PLAGIARISM);
+ tsd->status.skill[skillid].flag=13;//cloneskill flag
+ clif_skillinfoblock(tsd);
+ }
+ }
+ /* ƒ_ƒ?ƒW‚ª‚ ‚é‚È‚ç’ljÁ?‰Ê”»’è */
+ if(bl->prev != NULL){
+ struct map_session_data *sd = (struct map_session_data *)bl;
+ nullpo_retr(0, sd);
+ if( bl->type != BL_PC || (sd && !pc_isdead(sd)) ) {
+ if(damage > 0)
+ skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick);
+ if(bl->type==BL_MOB && src!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
+ {
+ struct mob_data *md=(struct mob_data *)bl;
+ nullpo_retr(0, md);
+ if(battle_config.mob_changetarget_byskill == 1)
+ {
+ int target;
+ target=md->target_id;
+ if(src->type == BL_PC)
+ md->target_id=src->id;
+ mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
+ md->target_id=target;
+ }
+ else
+ mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16));
+ }
+ }
+ }
+
+ if(src->type == BL_PC && dmg.flag&BF_WEAPON && src != bl && src == dsrc && damage > 0) {
+ struct map_session_data *sd = (struct map_session_data *)src;
+ int hp = 0,sp = 0;
+ nullpo_retr(0, sd);
+ if(sd->hp_drain_rate && sd->hp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->hp_drain_rate) {
+ hp += (dmg.damage * sd->hp_drain_per)/100;
+ if(sd->hp_drain_rate > 0 && hp < 1) hp = 1;
+ else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1;
+ }
+ if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->hp_drain_rate_) {
+ hp += (dmg.damage2 * sd->hp_drain_per_)/100;
+ if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1;
+ else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1;
+ }
+ if(sd->sp_drain_rate > 0 && sd->sp_drain_per > 0 && dmg.damage > 0 && rand()%100 < sd->sp_drain_rate) {
+ sp += (dmg.damage * sd->sp_drain_per)/100;
+ if(sd->sp_drain_rate > 0 && sp < 1) sp = 1;
+ else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1;
+ }
+ if(sd->sp_drain_rate_ > 0 && sd->sp_drain_per_ > 0 && dmg.damage2 > 0 && rand()%100 < sd->sp_drain_rate_) {
+ sp += (dmg.damage2 * sd->sp_drain_per_)/100;
+ if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1;
+ else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1;
+ }
+ if(hp || sp) pc_heal(sd,hp,sp);
+ }
+
+ if((skillid != KN_BOWLINGBASH || flag) && rdamage > 0)
+ battle_damage(bl,src,rdamage,0);
+
+ if(attack_type&BF_WEAPON && sc_data && sc_data[SC_AUTOCOUNTER].timer != -1 && sc_data[SC_AUTOCOUNTER].val4 > 0) {
+ if(sc_data[SC_AUTOCOUNTER].val3 == dsrc->id)
+ battle_weapon_attack(bl,dsrc,tick,0x8000|sc_data[SC_AUTOCOUNTER].val1);
+ skill_status_change_end(bl,SC_AUTOCOUNTER,-1);
+ }
+
+ map_freeblock_unlock();
+
+ return (dmg.damage+dmg.damage2); /* ?ƒ_ƒ‚ð•Ô‚· */
+}
+
+/*==========================================
+ * ƒXƒLƒ‹”Í?U?—p(map_foreachinarea‚©‚çŒÄ‚΂ê‚é)
+ * flag‚ɂ‚¢‚ÄF16i?‚ðŠm”F
+ * MSB <- 00fTffff ->LSB
+ * T =ƒ^?ƒQƒbƒg‘I?—p(BCT_*)
+ * ffff=Ž©—R‚ÉŽg—p‰Â”\
+ * 0 =—\–ñB0‚ɌŒè
+ *------------------------------------------
+ */
+static int skill_area_temp[8]; /* ˆêŽž??B•K—v‚È‚çŽg‚¤B */
+typedef int (*SkillFunc)(struct block_list *,struct block_list *,int,int,unsigned int,int);
+int skill_area_sub( struct block_list *bl,va_list ap )
+{
+ struct block_list *src;
+ int skill_id,skill_lv,flag;
+ unsigned int tick;
+ SkillFunc func;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ if(bl->type!=BL_PC && bl->type!=BL_MOB && bl->type!=BL_SKILL)
+ return 0;
+
+ src=va_arg(ap,struct block_list *); //‚±‚±‚Å‚Ísrc‚Ì’l‚ð?Æ‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅNULLƒ`ƒFƒbƒN‚Í‚µ‚È‚¢
+ skill_id=va_arg(ap,int);
+ skill_lv=va_arg(ap,int);
+ tick=va_arg(ap,unsigned int);
+ flag=va_arg(ap,int);
+ func=va_arg(ap,SkillFunc);
+
+ if(battle_check_target(src,bl,flag) > 0)
+ func(src,bl,skill_id,skill_lv,tick,flag);
+ return 0;
+}
+
+static int skill_check_unit_range_sub( struct block_list *bl,va_list ap )
+{
+ struct skill_unit *unit;
+ int *c,x,y,range,sx[4],sy[4];
+ int t_range,tx[4],ty[4];
+ int i,r_flag,skillid;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, unit = (struct skill_unit *)bl);
+ nullpo_retr(0, c = va_arg(ap,int *));
+
+ if(bl->prev == NULL || bl->type != BL_SKILL)
+ return 0;
+
+ if(!unit->alive)
+ return 0;
+
+ x = va_arg(ap,int);
+ y = va_arg(ap,int);
+ range = va_arg(ap,int);
+ skillid = va_arg(ap,int);
+
+ if(skillid == MG_SAFETYWALL || skillid == AL_PNEUMA) {
+ if(unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85)
+ return 0;
+ }
+ else if(skillid == AL_WARP) {
+ if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92)
+ return 0;
+ }
+ else if((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP) || skillid == HT_TALKIEBOX) {
+ if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92)
+ return 0;
+ }
+ else if(skillid == WZ_FIREPILLAR) {
+ if(unit->group->unit_id != 0x87)
+ return 0;
+ }
+ else return 0;
+ t_range=(unit->range!=0)? unit->range:unit->group->range;
+ tx[0] = tx[3] = unit->bl.x - t_range;
+ tx[1] = tx[2] = unit->bl.x + t_range;
+ ty[0] = ty[1] = unit->bl.y - t_range;
+ ty[2] = ty[3] = unit->bl.y + t_range;
+ sx[0] = sx[3] = x - range;
+ sx[1] = sx[2] = x + range;
+ sy[0] = sy[1] = y - range;
+ sy[2] = sy[3] = y + range;
+ for(i=r_flag=0;i<4;i++) {
+ if(sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0] && sy[i] <= ty[2]) {
+ r_flag = 1;
+ break;
+ }
+ if(tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0] && ty[i] <= sy[2]) {
+ r_flag = 1;
+ break;
+ }
+ }
+ if(r_flag) (*c)++;
+
+ return 0;
+}
+
+int skill_check_unit_range(int m,int x,int y,int range,int skillid)
+{
+ int c = 0;
+
+ map_foreachinarea(skill_check_unit_range_sub,m,x-10,y-10,x+10,y+10,BL_SKILL,&c,x,y,range,skillid);
+
+ return c;
+}
+
+static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap )
+{
+ int *c;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, c = va_arg(ap,int *));
+
+ if(bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB))
+ return 0;
+
+ if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
+ return 0;
+
+ (*c)++;
+
+ return 0;
+}
+
+int skill_check_unit_range2(int m,int x,int y,int range)
+{
+ int c = 0;
+
+ map_foreachinarea(skill_check_unit_range2_sub,m,x-range,y-range,x+range,y+range,0,&c);
+
+ return c;
+}
+
+/*=========================================================================
+ * ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚©‚ç
+ */
+/* ?Û‚Ì?‚ðƒJƒEƒ“ƒg‚·‚éBiskill_area_temp[0]‚ð‰Šú‰»‚µ‚Ä‚¨‚­‚±‚Æj */
+int skill_area_sub_count(struct block_list *src,struct block_list *target,int skillid,int skilllv,unsigned int tick,int flag)
+{
+ if(skilllv <= 0) return 0;
+ if(skill_area_temp[0] < 0xffff)
+ skill_area_temp[0]++;
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+static int skill_timerskill(int tid, unsigned int tick, int id,int data )
+{
+ struct map_session_data *sd = NULL;
+ struct mob_data *md = NULL;
+ struct pet_data *pd = NULL;
+ struct block_list *src = map_id2bl(id),*target;
+ struct skill_timerskill *skl = NULL;
+ int range;
+
+ nullpo_retr(0, src);
+
+ if(src->prev == NULL)
+ return 0;
+
+ if(src->type == BL_PC) {
+ nullpo_retr(0, sd = (struct map_session_data *)src);
+ skl = &sd->skilltimerskill[data];
+ }
+ else if(src->type == BL_MOB) {
+ nullpo_retr(0, md = (struct mob_data *)src);
+ skl = &md->skilltimerskill[data];
+ }
+ else if(src->type == BL_PET) { // [Valaris]
+ nullpo_retr(0, pd = (struct pet_data *)src);
+ skl = &pd->skilltimerskill[data];
+ }
+
+ else
+ return 0;
+
+ nullpo_retr(0, skl);
+
+ skl->timer = -1;
+ if(skl->target_id) {
+ struct block_list tbl;
+ target = map_id2bl(skl->target_id);
+ if(skl->skill_id == RG_INTIMIDATE) {
+ if(target == NULL) {
+ target = &tbl; //‰Šú‰»‚µ‚Ä‚È‚¢‚̂ɃAƒhƒŒƒX“Ë‚Á?‚ñ‚Å‚¢‚¢‚Ì‚©‚ÈH
+ target->type = BL_NUL;
+ target->m = src->m;
+ target->prev = target->next = NULL;
+ }
+ }
+ if(target == NULL)
+ return 0;
+ if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
+ return 0;
+ if(src->m != target->m)
+ return 0;
+ if(sd && pc_isdead(sd))
+ return 0;
+ if(target->type == BL_PC && pc_isdead((struct map_session_data *)target) && skl->skill_id != RG_INTIMIDATE)
+ return 0;
+
+ switch(skl->skill_id) {
+ case TF_BACKSLIDING:
+ clif_skill_nodamage(src,src,skl->skill_id,skl->skill_lv,1);
+ break;
+ case RG_INTIMIDATE:
+ if(sd && !map[src->m].flag.noteleport) {
+ int x,y,i,j,c;
+ pc_randomwarp(sd,3);
+ for(i=0;i<16;i++) {
+ j = rand()%8;
+ x = sd->bl.x + dirx[j];
+ y = sd->bl.y + diry[j];
+ if((c=map_getcell(sd->bl.m,x,y)) != 1 && c != 5)
+ break;
+ }
+ if(i >= 16) {
+ x = sd->bl.x;
+ y = sd->bl.y;
+ }
+ if(target->prev != NULL) {
+ if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
+ pc_setpos((struct map_session_data *)target,map[sd->bl.m].name,x,y,3);
+ else if(target->type == BL_MOB)
+ mob_warp((struct mob_data *)target,-1,x,y,3);
+ }
+ }
+ else if(md && !map[src->m].flag.monster_noteleport) {
+ int x,y,i,j,c;
+ mob_warp(md,-1,-1,-1,3);
+ for(i=0;i<16;i++) {
+ j = rand()%8;
+ x = md->bl.x + dirx[j];
+ y = md->bl.y + diry[j];
+ if((c=map_getcell(md->bl.m,x,y)) != 1 && c != 5)
+ break;
+ }
+ if(i >= 16) {
+ x = md->bl.x;
+ y = md->bl.y;
+ }
+ if(target->prev != NULL) {
+ if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target))
+ pc_setpos((struct map_session_data *)target,map[md->bl.m].name,x,y,3);
+ else if(target->type == BL_MOB)
+ mob_warp((struct mob_data *)target,-1,x,y,3);
+ }
+ }
+ break;
+
+ case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
+ case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
+ range=15; //Ž‹ŠE‘S?
+ map_foreachinarea(skill_frostjoke_scream,src->m,src->x-range,src->y-range,
+ src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick);
+ break;
+
+ default:
+ skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag);
+ break;
+ }
+ }
+ else {
+ if(src->m != skl->map)
+ return 0;
+ switch(skl->skill_id) {
+ case WZ_METEOR:
+ if(skl->type >= 0) {
+ skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,0);
+ clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick);
+ }
+ else
+ skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
+ break;
+ }
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+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)
+{
+ int i;
+
+ nullpo_retr(1, src);
+
+ if(src->type == BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *)src;
+ nullpo_retr(1, sd);
+ for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
+ if(sd->skilltimerskill[i].timer == -1) {
+ sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
+ sd->skilltimerskill[i].src_id = src->id;
+ sd->skilltimerskill[i].target_id = target;
+ sd->skilltimerskill[i].skill_id = skill_id;
+ sd->skilltimerskill[i].skill_lv = skill_lv;
+ sd->skilltimerskill[i].map = src->m;
+ sd->skilltimerskill[i].x = x;
+ sd->skilltimerskill[i].y = y;
+ sd->skilltimerskill[i].type = type;
+ sd->skilltimerskill[i].flag = flag;
+
+ return 0;
+ }
+ }
+ return 1;
+ }
+ else if(src->type == BL_MOB) {
+ struct mob_data *md = (struct mob_data *)src;
+ nullpo_retr(1, md);
+ for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
+ if(md->skilltimerskill[i].timer == -1) {
+ md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
+ md->skilltimerskill[i].src_id = src->id;
+ md->skilltimerskill[i].target_id = target;
+ md->skilltimerskill[i].skill_id = skill_id;
+ md->skilltimerskill[i].skill_lv = skill_lv;
+ md->skilltimerskill[i].map = src->m;
+ md->skilltimerskill[i].x = x;
+ md->skilltimerskill[i].y = y;
+ md->skilltimerskill[i].type = type;
+ md->skilltimerskill[i].flag = flag;
+
+ return 0;
+ }
+ }
+ return 1;
+ }
+ else if(src->type == BL_PET) { // [Valaris]
+ struct pet_data *pd = (struct pet_data *)src;
+ nullpo_retr(1, pd);
+ for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
+ if(pd->skilltimerskill[i].timer == -1) {
+ pd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i);
+ pd->skilltimerskill[i].src_id = src->id;
+ pd->skilltimerskill[i].target_id = target;
+ pd->skilltimerskill[i].skill_id = skill_id;
+ pd->skilltimerskill[i].skill_lv = skill_lv;
+ pd->skilltimerskill[i].map = src->m;
+ pd->skilltimerskill[i].x = x;
+ pd->skilltimerskill[i].y = y;
+ pd->skilltimerskill[i].type = type;
+ pd->skilltimerskill[i].flag = flag;
+
+ return 0;
+ }
+ }
+ return 1;
+ }
+ return 1;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int skill_cleartimerskill(struct block_list *src)
+{
+ int i;
+
+ nullpo_retr(0, src);
+
+ if(src->type == BL_PC) {
+ struct map_session_data *sd = (struct map_session_data *)src;
+ nullpo_retr(0, sd);
+ for(i=0;i<MAX_SKILLTIMERSKILL;i++) {
+ if(sd->skilltimerskill[i].timer != -1) {
+ delete_timer(sd->skilltimerskill[i].timer, skill_timerskill);
+ sd->skilltimerskill[i].timer = -1;
+ }
+ }
+ }
+ else if(src->type == BL_MOB) {
+ struct mob_data *md = (struct mob_data *)src;
+ nullpo_retr(0, md);
+ for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) {
+ if(md->skilltimerskill[i].timer != -1) {
+ delete_timer(md->skilltimerskill[i].timer, skill_timerskill);
+ md->skilltimerskill[i].timer = -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* ”Í?ƒXƒLƒ‹Žg—p?—¬•ª‚¯‚±‚±‚Ü‚Å
+ * -------------------------------------------------------------------------
+ */
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èU?Œnj
+ * iƒXƒpƒQƒbƒeƒB‚ÉŒü‚¯‚Ä‚P?‘OiI(ƒ_ƒƒ|)j
+ *------------------------------------------
+ */
+int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
+{
+ if(skilllv <= 0) return 0;
+
+ struct map_session_data *sd=NULL;
+ struct status_change *sc_data = battle_get_sc_data(src);
+ int i;
+
+ nullpo_retr(1, src);
+ nullpo_retr(1, bl);
+
+ if(src->type==BL_PC)
+ sd=(struct map_session_data *)src;
+ if(sd && pc_isdead(sd))
+ return 1;
+
+ if((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl)
+ bl = src;
+ if(bl->prev == NULL)
+ return 1;
+ if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl))
+ return 1;
+ map_freeblock_lock();
+ switch(skillid)
+ {
+ /* •ŠíU?ŒnƒXƒLƒ‹ */
+ case SM_BASH: /* ƒoƒbƒVƒ… */
+ case MC_MAMMONITE: /* ƒƒ}?ƒiƒCƒg */
+ case AC_DOUBLE: /* ƒ_ƒuƒ‹ƒXƒgƒŒƒCƒtƒBƒ“ƒO */
+ case AS_SONICBLOW: /* ƒ\ƒjƒbƒNƒuƒ? */
+ case KN_PIERCE: /* ƒsƒA?ƒX */
+ case KN_SPEARBOOMERANG: /* ƒXƒsƒAƒu?ƒƒ‰ƒ“ */
+ case TF_POISON: /* ƒCƒ“ƒxƒiƒ€ */
+ case TF_SPRINKLESAND: /* »‚Ü‚« */
+ case AC_CHARGEARROW: /* ƒ`ƒƒ?ƒWƒAƒ? */
+ case KN_SPEARSTAB: /* ƒXƒsƒAƒXƒ^ƒu */
+ case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
+ case RG_INTIMIDATE: /* ƒCƒ“ƒeƒBƒ~ƒfƒCƒg */
+ case BA_MUSICALSTRIKE: /* ƒ~ƒ…?ƒWƒJƒ‹ƒXƒgƒ‰ƒCƒN */
+ case DC_THROWARROW: /* –î?‚¿ */
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
+ case CR_HOLYCROSS: /* ƒz?ƒŠ?ƒNƒƒX */
+ case CR_SHIELDCHARGE:
+ case CR_SHIELDBOOMERANG:
+
+ /* ˆÈ‰ºMOB?—p */
+ /* ??U?ASPŒ¸­U?A‰“‹——£U?A–hŒä–³Ž‹U?A‘½’iU? */
+ case NPC_PIERCINGATT:
+ case NPC_MENTALBREAKER:
+ case NPC_RANGEATTACK:
+ case NPC_CRITICALSLASH:
+ case NPC_COMBOATTACK:
+ /* •K’†U?A“ÅU?AˆÃ?U?A’¾?U?AƒXƒ^ƒ“U? */
+ case NPC_GUIDEDATTACK:
+ case NPC_POISON:
+ case NPC_BLINDATTACK:
+ case NPC_SILENCEATTACK:
+ case NPC_STUNATTACK:
+ /* Ή»U?AŽô‚¢U?A‡–°U?Aƒ‰ƒ“ƒ_ƒ€ATKU? */
+ case NPC_PETRIFYATTACK:
+ case NPC_CURSEATTACK:
+ case NPC_SLEEPATTACK:
+ case NPC_RANDOMATTACK:
+ /* …?«U?A’n?«U?A‰Î?«U?A•—?«U? */
+ case NPC_WATERATTACK:
+ case NPC_GROUNDATTACK:
+ case NPC_FIREATTACK:
+ case NPC_WINDATTACK:
+ /* “Å?«U?A¹?«U?AˆÅ?«U?A”O?«U?ASPŒ¸­U? */
+ case NPC_POISONATTACK:
+ case NPC_HOLYATTACK:
+ case NPC_DARKNESSATTACK:
+ case NPC_TELEKINESISATTACK:
+ case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
+ case LK_SPIRALPIERCE: /* ƒXƒpƒCƒ‰ƒ‹ƒsƒA?ƒX */
+ case LK_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ case LK_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
+ case PA_PRESSURE: /* ƒvƒŒƒbƒVƒƒ? */
+ case PA_SACRIFICE: /* ƒTƒNƒŠƒtƒ@ƒCƒX */
+ case SN_SHARPSHOOTING: /* ƒVƒƒ?ƒvƒVƒ…?ƒeƒBƒ“ƒO */
+ case CG_ARROWVULCAN: /* ƒAƒ?ƒoƒ‹ƒJƒ“ */
+ case ASC_BREAKER: /* ƒ\ƒEƒ‹ƒuƒŒ?ƒJ? */
+ case HW_MAGICCRASHER: /* ƒ}ƒWƒbƒNƒNƒ‰ƒbƒVƒƒ? */
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+ case NPC_DARKBREATH:
+ clif_emotion(src,7);
+ skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+ case MO_INVESTIGATE: /* ?™¤ */
+ {
+ struct status_change *sc_data = battle_get_sc_data(src);
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ if(sc_data[SC_BLADESTOP].timer != -1)
+ skill_status_change_end(src,SC_BLADESTOP,-1);
+ }
+ break;
+ case SN_FALCONASSAULT: /* ƒtƒ@ƒ‹ƒRƒ“ƒAƒTƒ‹ƒg */
+ skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+ case KN_BRANDISHSPEAR: /* ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA */
+ {
+ struct mob_data *md = (struct mob_data *)bl;
+ nullpo_retr(1, md);
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ if(md->hp > 0){
+ skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
+ if(bl->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)bl);
+ else if(bl->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)bl);
+ else
+ clif_fixpos(bl);
+ }
+ }
+ break;
+ case RG_BACKSTAP: /* ƒoƒbƒNƒXƒ^ƒu */
+ {
+ int dir = map_calc_dir(src,bl->x,bl->y),t_dir = battle_get_dir(bl);
+ int dist = distance(src->x,src->y,bl->x,bl->y);
+ if((dist > 0 && !map_check_dir(dir,t_dir)) || bl->type == BL_SKILL) {
+ struct status_change *sc_data = battle_get_sc_data(src);
+ if(sc_data && sc_data[SC_HIDING].timer != -1)
+ skill_status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ dir = dir < 4 ? dir+4 : dir-4; // change direction [Celest]
+ if (bl->type == BL_PC)
+ ((struct map_session_data *)bl)->dir=dir;
+ else if (bl->type == BL_MOB)
+ ((struct mob_data *)bl)->dir=dir;
+ //skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
+ }
+ else if(src->type == BL_PC)
+ clif_skill_fail(sd,sd->skillid,0,0);
+ }
+ break;
+
+ case AM_ACIDTERROR: /* ƒAƒVƒbƒhƒeƒ‰? */
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ if(bl->type == BL_PC && rand()%100 < skill_get_time(skillid,skilllv) && battle_config.equipment_breaking)
+ pc_breakarmor((struct map_session_data *)bl);
+ break;
+ case MO_FINGEROFFENSIVE: /* Žw? */
+ {
+ struct status_change *sc_data = battle_get_sc_data(src);
+
+ if(!battle_config.finger_offensive_type)
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ else {
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ if(sd) {
+ for(i=1;i<sd->spiritball_old;i++)
+ skill_addtimerskill(src,tick+i*200,bl->id,0,0,skillid,skilllv,BF_WEAPON,flag);
+ sd->canmove_tick = tick + (sd->spiritball_old-1)*200;
+ }
+ }
+ if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
+ skill_status_change_end(src,SC_BLADESTOP,-1);
+ }
+ break;
+ case MO_CHAINCOMBO: /* ˜A‘Ŷ */
+ {
+ struct status_change *sc_data = battle_get_sc_data(src);
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
+ skill_status_change_end(src,SC_BLADESTOP,-1);
+ }
+ break;
+ case MO_COMBOFINISH: /* –Ò—´Œ */
+ case CH_TIGERFIST: /* •šŒÕŒ */
+ case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
+ case CH_PALMSTRIKE: /* –ÒŒÕd”hŽR */
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+ case MO_EXTREMITYFIST: /* ˆ¢C—…”e–PŒ */
+ {
+ struct status_change *sc_data = battle_get_sc_data(src);
+
+ if(sd) {
+ struct walkpath_data wpd;
+ int dx,dy;
+
+ dx = bl->x - sd->bl.x;
+ dy = bl->y - sd->bl.y;
+ if(dx > 0) dx++;
+ else if(dx < 0) dx--;
+ if(dy > 0) dy++;
+ else if(dy < 0) dy--;
+ if(dx == 0 && dy == 0) dx++;
+ if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
+ dx = bl->x - sd->bl.x;
+ dy = bl->y - sd->bl.y;
+ if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ break;
+ }
+ }
+ sd->to_x = sd->bl.x + dx;
+ sd->to_y = sd->bl.y + dy;
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ clif_walkok(sd);
+ clif_movechar(sd);
+ if(dx < 0) dx = -dx;
+ if(dy < 0) dy = -dy;
+ sd->attackabletime = sd->canmove_tick = tick + 100 + sd->speed * ((dx > dy)? dx:dy);
+ if(sd->canact_tick < sd->canmove_tick)
+ sd->canact_tick = sd->canmove_tick;
+ pc_movepos(sd,sd->to_x,sd->to_y);
+ skill_status_change_end(&sd->bl,SC_COMBO,-1);
+ }
+ else
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+ skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1);
+ if(sc_data && sc_data[SC_BLADESTOP].timer != -1)
+ skill_status_change_end(src,SC_BLADESTOP,-1);
+ }
+ break;
+ /* •ŠíŒn”Í?U?ƒXƒLƒ‹ */
+ case AC_SHOWER: /* ƒAƒ?ƒVƒƒƒ? */
+ case SM_MAGNUM: /* ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN */
+ case AS_GRIMTOOTH: /* ƒOƒŠƒ€ƒgƒD?ƒX */
+ case MC_CARTREVOLUTION: /* ƒJ?ƒgƒŒƒ”ƒHƒŠƒ…?ƒVƒ‡ƒ“ */
+ case NPC_SPLASHATTACK: /* ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN */
+ case ASC_METEORASSAULT: /* ƒƒeƒIƒAƒTƒ‹ƒg */
+ case AS_SPLASHER: /* [Valaris] */
+ if(flag&1){
+ /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
+ if(bl->id!=skill_area_temp[1]){
+ int dist=0;
+ if(skillid==SM_MAGNUM){ /* ƒ}ƒOƒiƒ€ƒuƒŒƒCƒN‚È‚ç’†S‚©‚ç‚Ì‹——£‚ðŒvŽZ */
+ int dx=abs( bl->x - skill_area_temp[2] );
+ int dy=abs( bl->y - skill_area_temp[3] );
+ dist=((dx>dy)?dx:dy);
+ }
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
+ 0x0500|dist );
+ }
+ }else{
+ int ar=1;
+ int x=bl->x,y=bl->y;
+ if( skillid==SM_MAGNUM){
+ x=src->x;
+ y=src->y;
+ }else if(skillid==AC_SHOWER || skillid==ASC_METEORASSAULT) /* ƒAƒ?ƒVƒƒƒ?AƒƒeƒIƒAƒTƒ‹ƒg”Í?5*5 */
+ ar=2;
+ else if(skillid==AS_SPLASHER) /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ?”Í?3*3 */
+ ar=1;
+ else if(skillid==NPC_SPLASHATTACK) /* ƒXƒvƒ‰ƒbƒVƒ…ƒAƒ^ƒbƒN‚Í”Í?7*7 */
+ ar=3;
+ skill_area_temp[1]=bl->id;
+ skill_area_temp[2]=x;
+ skill_area_temp[3]=y;
+ /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
+ /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
+ map_foreachinarea(skill_area_sub,
+ bl->m,x-ar,y-ar,x+ar,y+ar,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ if (skillid == SM_MAGNUM) // fire element for 10 seconds
+ skill_status_change_start(src,SC_FLAMELAUNCHER,0,0,0,0,10000,0);
+ }
+ break;
+
+ case KN_BOWLINGBASH: /* ƒ{ƒEƒŠƒ“ƒOƒoƒbƒVƒ… */
+ if(flag&1){
+ /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
+ if(bl->id!=skill_area_temp[1])
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
+ }
+ else {
+ int damage;
+ map_freeblock_lock();
+ damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
+ if(damage > 0) {
+ int i,c; /* ‘¼l‚©‚ç•·‚¢‚½“®‚«‚È‚Ì‚ÅŠÔˆá‚Á‚Ä‚é‰Â”\«‘å•?—¦‚ª?‚¢‚Á‚·„ƒ */
+ c = skill_get_blewcount(skillid,skilllv);
+ if(map[bl->m].flag.gvg) c = 0;
+ for(i=0;i<c;i++){
+ skill_blown(src,bl,1);
+ if(bl->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)bl);
+ else if(bl->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)bl);
+ else
+ clif_fixpos(bl);
+ skill_area_temp[0]=0;
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY ,
+ skill_area_sub_count);
+ if(skill_area_temp[0]>1) break;
+ }
+ skill_area_temp[1]=bl->id;
+ skill_area_temp[2]=bl->x;
+ skill_area_temp[3]=bl->y;
+ /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ battle_damage(src,bl,damage,1);
+ if(rdamage > 0)
+ battle_damage(bl,src,rdamage,0);
+ }
+ map_freeblock_unlock();
+ }
+ break;
+
+ case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
+ case PR_TURNUNDEAD: /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒh */
+ if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ else {
+ map_freeblock_unlock();
+ return 1;
+ }
+ break;
+
+ /* –‚–@ŒnƒXƒLƒ‹ */
+ case MG_SOULSTRIKE: /* ƒ\ƒEƒ‹ƒXƒgƒ‰ƒCƒN */
+ case MG_COLDBOLT: /* ƒR?ƒ‹ƒhƒ{ƒ‹ƒg */
+ case MG_FIREBOLT: /* ƒtƒ@ƒCƒA?ƒ{ƒ‹ƒg */
+ case MG_LIGHTNINGBOLT: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ{ƒ‹ƒg */
+ case WZ_EARTHSPIKE: /* ƒA?ƒXƒXƒpƒCƒN */
+ case AL_HEAL: /* ƒq?ƒ‹ */
+ case AL_HOLYLIGHT: /* ƒz?ƒŠ?ƒ‰ƒCƒg */
+ case MG_FROSTDIVER: /* ƒtƒƒXƒgƒ_ƒCƒo? */
+ case WZ_JUPITEL: /* ƒ†ƒsƒeƒ‹ƒTƒ“ƒ_? */
+ case NPC_MAGICALATTACK: /* MOB:–‚–@‘Å?U? */
+ case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+
+ case WZ_WATERBALL: /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ if(skilllv>1)
+ skill_status_change_start(src,SC_WATERBALL,skilllv,bl->id,0,0,0,0);
+ break;
+
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ if(battle_get_race(bl)==1 || battle_get_race(bl)==6)
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ break;
+
+ /* –‚–@Œn”Í?U?ƒXƒLƒ‹ */
+ case MG_NAPALMBEAT: /* ƒiƒp?ƒ€ƒr?ƒg */
+ case MG_FIREBALL: /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹ */
+ if(flag&1){
+ /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
+ if(bl->id!=skill_area_temp[1]){
+ if(skillid==MG_FIREBALL){ /* ƒtƒ@ƒCƒ„?ƒ{?ƒ‹‚È‚ç’†S‚©‚ç‚Ì‹——£‚ðŒvŽZ */
+ int dx=abs( bl->x - skill_area_temp[2] );
+ int dy=abs( bl->y - skill_area_temp[3] );
+ skill_area_temp[0]=((dx>dy)?dx:dy);
+ }
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
+ skill_area_temp[0]| 0x0500);
+ }
+ }else{
+ int ar=(skillid==MG_NAPALMBEAT)?1:2;
+ skill_area_temp[1]=bl->id;
+ if(skillid==MG_NAPALMBEAT){ /* ƒiƒp?ƒ€‚Å‚Íæ‚É?‚¦‚é */
+ skill_area_temp[0]=0;
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY ,
+ skill_area_sub_count);
+ }else{
+ skill_area_temp[0]=0;
+ skill_area_temp[2]=bl->x;
+ skill_area_temp[3]=bl->y;
+ }
+ /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
+ skill_area_temp[0] );
+ /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ }
+ break;
+
+ case HW_NAPALMVULCAN: // Fixed By SteelViruZ
+ if(flag&1){
+ if(bl->id!=skill_area_temp[1]){
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
+ skill_area_temp[0]);
+ }
+ }else{
+ int ar=(skillid==HW_NAPALMVULCAN)?1:2;
+ skill_area_temp[1]=bl->id;
+ if(skillid==HW_NAPALMVULCAN){
+ skill_area_temp[0]=0;
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY ,
+ skill_area_sub_count);
+ }else{
+ skill_area_temp[0]=0;
+ skill_area_temp[2]=bl->x;
+ skill_area_temp[3]=bl->y;
+ }
+ skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,
+ skill_area_temp[0] );
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ }
+ break;
+
+ case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
+ skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
+ //skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ map_foreachinarea(skill_attack_area,src->m,src->x-5,bl->y-5,bl->x+5,bl->y+5,0,BF_MAGIC,src,src,skillid,skilllv,tick,flag,BCT_ENEMY);
+ break;
+
+ case WZ_SIGHTRASHER:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
+ skill_status_change_end(src,SC_SIGHT,-1);
+ break;
+
+ /* ‚»‚Ì‘¼ */
+ case HT_BLITZBEAT: /* ƒuƒŠƒbƒcƒr?ƒg */
+ if(flag&1){
+ /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
+ if(bl->id!=skill_area_temp[1])
+ skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
+ }else{
+ skill_area_temp[0]=0;
+ skill_area_temp[1]=bl->id;
+ if(flag&0xf00000)
+ map_foreachinarea(skill_area_sub,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY ,skill_area_sub_count);
+ /* ‚Ü‚¸ƒ^?ƒQƒbƒg‚ÉU?‚ð‰Á‚¦‚é */
+ skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000));
+ /* ‚»‚ÌŒãƒ^?ƒQƒbƒgˆÈŠO‚Ì”Í??‚Ì“G‘S?‚É?—‚ðs‚¤ */
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ }
+ break;
+
+ case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ /* ƒXƒLƒ‹ƒ†ƒjƒbƒg”z’u */
+ skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0);
+ if(sd)
+ sd->canmove_tick = tick + 1000;
+ else if(src->type == BL_MOB)
+ mob_changestate((struct mob_data *)src,MS_DELAY,1000);
+ break;
+
+ case TF_THROWSTONE: /* ΓŠ‚° */
+ case NPC_SMOKING: /* ƒXƒ‚?ƒLƒ“ƒO */
+ skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 );
+ break;
+
+ case NPC_SELFDESTRUCTION: /* Ž©”š */
+ case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
+ if(flag&1){
+ /* ŒÂ•Ê‚Ƀ_ƒ?ƒW‚ð?‚¦‚é */
+ if(src->type==BL_MOB){
+ struct mob_data* mb = (struct mob_data*)src;
+ nullpo_retr(1, mb);
+ mb->hp=skill_area_temp[2];
+ if(bl->id!=skill_area_temp[1])
+ skill_attack(BF_MISC,src,src,bl,NPC_SELFDESTRUCTION,skilllv,tick,flag );
+ mb->hp=1;
+ }
+ }else{
+ struct mob_data *md;
+ if((md=(struct mob_data *)src)){
+ skill_area_temp[1]=bl->id;
+ skill_area_temp[2]=battle_get_hp(src);
+ clif_skill_nodamage(src,src,NPC_SELFDESTRUCTION,-1,1);
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-5,bl->y-5,bl->x+5,bl->y+5,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ battle_damage(src,src,md->hp,0);
+ }
+ }
+ break;
+
+ /* HP‹z?/HP‹z?–‚–@ */
+ case NPC_BLOODDRAIN:
+ case NPC_ENERGYDRAIN:
+ {
+ int heal;
+ heal = skill_attack((skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
+ if( heal > 0 ){
+ struct block_list tbl;
+ tbl.id = 0;
+ tbl.m = src->m;
+ tbl.x = src->x;
+ tbl.y = src->y;
+ clif_skill_nodamage(&tbl,src,AL_HEAL,heal,1);
+ battle_heal(NULL,src,heal,0,0);
+ }
+ }
+ break;
+ case 0:
+ if(sd) {
+ if(flag&3){
+ if(bl->id!=skill_area_temp[1])
+ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
+ }
+ else{
+ int ar=sd->splash_range;
+ skill_area_temp[1]=bl->id;
+ map_foreachinarea(skill_area_sub,
+ bl->m, bl->x - ar, bl->y - ar, bl->x + ar, bl->y + ar, 0,
+ src, skillid, skilllv, tick, flag | BCT_ENEMY | 1,
+ skill_castend_damage_id);
+ }
+ }
+ break;
+
+ default:
+ map_freeblock_unlock();
+ return 1;
+ }
+ if(sc_data) {
+ if (sc_data[SC_MAGICPOWER].timer != -1 && skillid != HW_MAGICPOWER) //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
+ skill_status_change_end(src,SC_MAGICPOWER,-1);
+ }
+ map_freeblock_unlock();
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èŽx‰‡Œnj
+ *------------------------------------------
+ */
+int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
+{
+ if(skilllv <= 0) return 0;
+
+ struct map_session_data *sd=NULL;
+ struct map_session_data *dstsd=NULL;
+ struct mob_data *md=NULL;
+ struct mob_data *dstmd=NULL;
+ int i,abra_skillid=0,abra_skilllv;
+ int sc_def_vit,sc_def_mdef,strip_fix,strip_time,strip_per;
+ int sc_dex,sc_luk;
+ //ƒNƒ‰ƒXƒ`ƒFƒ“ƒW—pƒ{ƒXƒ‚ƒ“ƒXƒ^?ID
+ int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
+ ,1157,1159,1190,1272,1312,1373,1492};
+ int poringclass[]={1002};
+
+ nullpo_retr(1, src);
+ nullpo_retr(1, bl);
+
+ if(src->type==BL_PC)
+ sd=(struct map_session_data *)src;
+ else if(src->type==BL_MOB)
+ md=(struct mob_data *)src;
+
+ sc_dex=battle_get_mdef(bl);
+ sc_luk=battle_get_luk(bl);
+ sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
+ //sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3);
+ sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3);
+ strip_fix = battle_get_dex(src) - battle_get_dex(bl);
+
+ if(bl->type==BL_PC){
+ nullpo_retr(1, dstsd=(struct map_session_data *)bl);
+ }else if(bl->type==BL_MOB){
+ nullpo_retr(1, dstmd=(struct mob_data *)bl);
+ if(sc_def_vit>50)
+ sc_def_vit=50;
+ if(sc_def_mdef>50)
+ sc_def_mdef=50;
+ }
+ if(sc_def_vit < 0)
+ sc_def_vit=0;
+ if(sc_def_mdef < 0)
+ sc_def_mdef=0;
+ if(strip_fix < 0)
+ strip_fix=0;
+
+ if(bl == NULL || bl->prev == NULL)
+ return 1;
+ if(sd && pc_isdead(sd))
+ return 1;
+ if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION)
+ return 1;
+ if(battle_get_class(bl) == 1288)
+ return 1;
+ if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr]
+ return 0;
+
+ map_freeblock_lock();
+ switch(skillid)
+ {
+ case AL_HEAL: /* ƒq?ƒ‹ */
+ {
+ int heal=skill_calc_heal( src, skilllv );
+ int heal_get_jobexp;
+ int skill;
+ struct pc_base_job s_class;
+
+ if( dstsd && dstsd->special_state.no_magic_damage )
+ heal=0; /* ?‹à峃J?ƒhiƒq?ƒ‹—Ê‚Oj */
+ if (sd){
+ s_class = pc_calc_base_job(sd->status.class);
+ if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ƒƒfƒBƒeƒCƒeƒBƒI
+ heal += heal*(skill*2/100);
+ if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //Ž©•ª‚à?Û‚àPCA?Û‚ªŽ©•ª‚̃p?ƒgƒi?AŽ©•ª‚ªƒXƒpƒmƒrAŽ©•ª‚ªŠ‚È‚ç
+ heal = heal*2; //ƒXƒpƒmƒr‚̉łª’U“߂Ƀq?ƒ‹‚·‚é‚Æ2”{‚É‚È‚é
+ }
+
+
+ clif_skill_nodamage(src,bl,skillid,heal,1);
+ heal_get_jobexp = battle_heal(NULL,bl,heal,0,0);
+
+ // JOB??’lŠl“¾
+ if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl && battle_config.heal_exp > 0){
+ heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100;
+ if(heal_get_jobexp <= 0)
+ heal_get_jobexp = 1;
+ pc_gainexp((struct map_session_data *)src,0,heal_get_jobexp);
+ }
+ }
+ break;
+
+ case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
+ if(bl->type==BL_PC){
+ int per=0;
+ struct map_session_data *tsd = (struct map_session_data*)bl;
+ nullpo_retr(1, tsd);
+ if( (map[bl->m].flag.pvp) && tsd->pvp_point<0 )
+ break; /* PVP‚Å•œŠˆ•s‰Â”\?‘Ô */
+
+ if(pc_isdead(tsd)){ /* Ž€–S”»’è */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ switch(skilllv){
+ case 1: per=10; break;
+ case 2: per=30; break;
+ case 3: per=50; break;
+ case 4: per=80; break;
+ }
+ tsd->status.hp=tsd->status.max_hp*per/100;
+ if(tsd->status.hp<=0) tsd->status.hp=1;
+ if(tsd->special_state.restart_full_recover ){ /* ƒIƒVƒŠƒXƒJ?ƒh */
+ tsd->status.hp=tsd->status.max_hp;
+ tsd->status.sp=tsd->status.max_sp;
+ }
+ pc_setstand(tsd);
+ if(battle_config.pc_invincible_time > 0)
+ pc_setinvincibletimer(tsd,battle_config.pc_invincible_time);
+ clif_updatestatus(tsd,SP_HP);
+ clif_resurrection(&tsd->bl,1);
+ if(src != bl && sd && battle_config.resurrection_exp > 0) {
+ int exp = 0,jexp = 0;
+ int lv = tsd->status.base_level - sd->status.base_level, jlv = tsd->status.job_level - sd->status.job_level;
+ if(lv > 0) {
+ exp = (int)((double)tsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
+ if(exp < 1) exp = 1;
+ }
+ if(jlv > 0) {
+ jexp = (int)((double)tsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
+ if(jexp < 1) jexp = 1;
+ }
+ if(exp > 0 || jexp > 0)
+ pc_gainexp(sd,exp,jexp);
+ }
+ }
+ }
+ break;
+
+ case AL_DECAGI: /* ‘¬“xŒ¸­ */
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if( rand()%100 < (50+skilllv*3+(battle_get_lv(src)+battle_get_int(src)/5)-sc_def_mdef) ) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ }
+ break;
+
+ case AL_CRUCIS:
+ if(flag&1) {
+ int race = battle_get_race(bl),ele = battle_get_elem_type(bl);
+ if(battle_check_target(src,bl,BCT_ENEMY) && (race == 6 || battle_check_undead(race,ele))) {
+ int slv=battle_get_lv(src),tlv=battle_get_lv(bl),rate;
+ rate = 25 + skilllv*2 + slv - tlv;
+ if(rand()%100 < rate)
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0);
+ }
+ }
+ else {
+ int range = 15;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ map_foreachinarea(skill_area_sub,
+ src->m,src->x-range,src->y-range,src->x+range,src->y+range,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_nodamage_id);
+ }
+ break;
+
+ case PR_LEXDIVINA: /* ƒŒƒbƒNƒXƒfƒBƒr?ƒi */
+ {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if(sc_data && sc_data[SC_DIVINA].timer != -1)
+ skill_status_change_end(bl,SC_DIVINA,-1);
+ else if( rand()%100 < sc_def_vit ) {
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ }
+ }
+ break;
+ case SA_ABRACADABRA:
+ //require 1 yellow gemstone even with mistress card or Into the Abyss
+ if (pc_search_inventory(sd, 715) <= 0 ) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ break;
+ }
+ pc_delitem(sd, pc_search_inventory(sd, 715), 1, 0);
+ //
+ do{
+ abra_skillid=skill_abra_dataset(skilllv);
+ }while(abra_skillid == 0);
+ abra_skilllv=skill_get_max(abra_skillid)>pc_checkskill(sd,SA_ABRACADABRA)?pc_checkskill(sd,SA_ABRACADABRA):skill_get_max(abra_skillid);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ sd->skillitem=abra_skillid;
+ sd->skillitemlv=abra_skilllv;
+ clif_item_skill(sd,abra_skillid,abra_skilllv,"ƒAƒuƒ‰ƒJƒ_ƒuƒ‰");
+ break;
+ case SA_COMA:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if(dstsd){
+ dstsd->status.hp=1;
+ dstsd->status.sp=1;
+ clif_updatestatus(dstsd,SP_HP);
+ clif_updatestatus(dstsd,SP_SP);
+ }
+ if(dstmd) dstmd->hp=1;
+ break;
+ case SA_FULLRECOVERY:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if(dstsd) pc_heal(dstsd,dstsd->status.max_hp,dstsd->status.max_sp);
+ if(dstmd) dstmd->hp=battle_get_max_hp(&dstmd->bl);
+ break;
+ case SA_SUMMONMONSTER:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (sd) mob_once_spawn(sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,"--ja--",-1,1,"");
+ break;
+ case SA_LEVELUP:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd,pc_nextbaseexp(sd)*10/100,0);
+ break;
+
+ case SA_INSTANTDEATH:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (sd) pc_damage(NULL,sd,sd->status.max_hp);
+ break;
+
+ case SA_QUESTION:
+ case SA_GRAVITY:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ break;
+ case SA_CLASSCHANGE:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(dstmd) mob_class_change(dstmd,changeclass);
+ break;
+ case SA_MONOCELL:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(dstmd) mob_class_change(dstmd,poringclass);
+ break;
+ case SA_DEATH:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (dstsd) pc_damage(NULL,dstsd,dstsd->status.max_hp);
+ if (dstmd) mob_damage(NULL,dstmd,dstmd->hp,1);
+ break;
+ case SA_REVERSEORCISH:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (dstsd) pc_setoption(dstsd,dstsd->status.option|0x0800);
+ break;
+ case SA_FORTUNE:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(sd) pc_getzeny(sd,battle_get_lv(bl)*100);
+ break;
+ case SA_TAMINGMONSTER:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (dstmd){
+ for(i=0;i<MAX_PET_DB;i++){
+ if(dstmd->class == pet_db[i].class){
+ pet_catch_process1(sd,dstmd->class);
+ break;
+ }
+ }
+ }
+ break;
+ case AL_INCAGI: /* ‘¬“x?‰Á */
+ case AL_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
+ case PR_SLOWPOISON:
+ case PR_IMPOSITIO: /* ƒCƒ€ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
+ case PR_LEXAETERNA: /* ƒŒƒbƒNƒXƒG?ƒeƒ‹ƒi */
+ case PR_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒEƒ€ */
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ case CR_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
+ //case CG_MARIONETTE: // moved - Celest
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }else{
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+
+ case CG_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
+ if(sd && dstsd){
+ struct status_change *tsc_data = battle_get_sc_data(src);
+ int sc = SkillStatusChangeTable[skillid];
+ int sc2 = SC_MARIONETTE2;
+
+ if((dstsd->bl.type!=BL_PC)
+ || (sd->bl.id == dstsd->bl.id)
+ || (!sd->status.party_id)
+ || (sd->status.party_id != dstsd->status.party_id)) {
+ clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
+ return 1;
+ }
+ if(tsc_data){
+ if(tsc_data[sc].timer == -1) {
+ skill_status_change_start (src,sc,skilllv,0,bl->id,0,skill_get_time(skillid,skilllv),0);
+ skill_status_change_start (bl,sc2,skilllv,0,src->id,0,skill_get_time(skillid,skilllv),0);
+ }
+ else {
+ skill_status_change_end(src, sc, -1);
+ skill_status_change_end(bl, sc2, -1);
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ }
+ break;
+
+ case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris]
+ case SA_FROSTWEAPON:
+ case SA_LIGHTNINGLOADER:
+ case SA_SEISMICWEAPON:
+ if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ break;
+ }
+ if(bl->type==BL_PC) {
+ struct map_session_data *sd2=(struct map_session_data *)bl;
+ if(sd2->status.weapon==0 || sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
+ sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
+ sd2->sc_data[SC_ENCPOISON].timer!=-1) {
+ clif_skill_fail(sd,skillid,0,0);
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ break;
+ }
+ }
+ if(rand()%100 > (75+skilllv*1) && (skilllv != 5)) {
+ clif_skill_fail(sd,skillid,0,0);
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ if(bl->type==BL_PC && battle_config.equipment_breaking) {
+ struct map_session_data *sd2=(struct map_session_data *)bl;
+ if(sd!=sd2) clif_displaymessage(sd->fd,"You broke target's weapon");
+ pc_breakweapon(sd2);
+ }
+ break;
+ }
+ else {
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+
+ case PR_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if(bl->type==BL_MOB)
+ break;
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case PR_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
+ clif_skill_nodamage(bl,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case KN_AUTOCOUNTER: /* ƒI?ƒgƒJƒEƒ“ƒ^? */
+ case KN_TWOHANDQUICKEN: /* ƒc?ƒnƒ“ƒhƒNƒCƒbƒPƒ“ */
+ case CR_SPEARQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
+ case CR_REFLECTSHIELD:
+ case AS_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
+ case MC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
+ case MG_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
+ case SM_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
+ case MG_SIGHT: /* ƒTƒCƒg */
+ case AL_RUWACH: /* ƒ‹ƒAƒt */
+ case MO_EXPLOSIONSPIRITS: // ”š—ô”g“®
+ case MO_STEELBODY: // ‹à„
+ case LK_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
+ case LK_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
+ case LK_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
+ case LK_BERSERK: /* ƒo?ƒT?ƒN */
+ case HP_ASSUMPTIO: /* */
+ case WS_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
+ case SN_SIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
+ case WS_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
+ case ST_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
+ case HW_MAGICPOWER: /* –‚–@—Í?• */
+ case PF_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
+ case ASC_EDP: // [Celest]
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
+ if(bl->type==BL_PC) {
+ struct map_session_data *sd2=(struct map_session_data *)bl;
+ if(sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
+ sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
+ sd2->sc_data[SC_ENCPOISON].timer!=-1) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ clif_skill_fail(sd,skillid,0,0);
+ break;
+ }
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case LK_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ pc_setsit(sd);
+ clif_sitting(sd);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case MC_CHANGECART:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ break;
+ case AC_CONCENTRATION: /* W’†—ÍŒüã */
+ {
+ int range = 1;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ map_foreachinarea( skill_status_change_timer_sub,
+ src->m, src->x-range, src->y-range, src->x+range,src->y+range,0,
+ src,SkillStatusChangeTable[skillid],tick);
+ }
+ break;
+ case SM_PROVOKE: /* ƒvƒƒ{ƒbƒN */
+ {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+
+ /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
+ if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //•sŽ€‚É‚Í?‚©‚È‚¢
+ {
+ map_freeblock_unlock();
+ return 1;
+ }
+
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+
+ if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
+ skill_castcancel(bl,0);
+ if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
+ && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
+ skill_castcancel(bl,0);
+
+ if(sc_data){
+ if(sc_data[SC_FREEZE].timer!=-1)
+ skill_status_change_end(bl,SC_FREEZE,-1);
+ if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
+ skill_status_change_end(bl,SC_STONE,-1);
+ if(sc_data[SC_SLEEP].timer!=-1)
+ skill_status_change_end(bl,SC_SLEEP,-1);
+ }
+
+ if(bl->type==BL_MOB) {
+ int range = skill_get_range(skillid,skilllv);
+ if(range < 0)
+ range = battle_get_range(src) - (range + 1);
+ mob_target((struct mob_data *)bl,src,range);
+ }
+ }
+ break;
+
+ case CR_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
+ if(sd && dstsd){
+ //?¶‚â—{Žq‚Ìꇂ̌³‚ÌE‹Æ‚ðŽZo‚·‚é
+
+ int lv = sd->status.base_level-dstsd->status.base_level;
+ lv = (lv<0)?-lv:lv;
+ if((dstsd->bl.type!=BL_PC) // ‘ŠŽè‚ÍPC‚¶‚á‚È‚¢‚Æ‚¾‚ß
+ ||(sd->bl.id == dstsd->bl.id) // ‘ŠŽè‚ªŽ©•ª‚Í‚¾‚ß
+ ||(lv > 10) // ƒŒƒxƒ‹·}10‚Ü‚Å
+ ||(!sd->status.party_id && !sd->status.guild_id) // PT‚É‚àƒMƒ‹ƒh‚É‚àŠ?–³‚µ‚Í‚¾‚ß
+ ||((sd->status.party_id != dstsd->status.party_id) // “¯‚¶ƒp?ƒeƒB?‚©A
+ &&(sd->status.guild_id != dstsd->status.guild_id)) // “¯‚¶ƒMƒ‹ƒh‚¶‚á‚È‚¢‚Æ‚¾‚ß
+ ||(dstsd->status.class==14||dstsd->status.class==21
+ ||dstsd->status.class==4015||dstsd->status.class==4022)){ // ƒNƒ‹ƒZ‚¾‚ß
+ clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
+ return 1;
+ }
+ for(i=0;i<skilllv;i++){
+ if(!sd->dev.val1[i]){ // ‹ó‚«‚ª‚ ‚Á‚½‚ç“ü‚ê‚é
+ sd->dev.val1[i] = bl->id;
+ sd->dev.val2[i] = bl->id;
+ break;
+ }else if(i==skilllv-1){ // ‹ó‚«‚ª‚È‚©‚Á‚½
+ clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
+ return 1;
+ }
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ clif_devotion(sd,bl->id);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],src->id,1,0,0,1000*(15+15*skilllv),0 );
+ }
+ else clif_skill_fail(sd,skillid,0,0);
+ break;
+ case MO_CALLSPIRITS: // ?Œ÷
+ if(sd) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv);
+ }
+ break;
+ case CH_SOULCOLLECT: // ‹¶?Œ÷
+ if(sd) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ for(i=0;i<5;i++)
+ pc_addspiritball(sd,skill_get_time(skillid,skilllv),5);
+ }
+ break;
+ case MO_BLADESTOP: // ”’nŽæ‚è
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case MO_ABSORBSPIRITS: // ?’D
+ i=0;
+ if(sd && dstsd) {
+ if(sd == dstsd || map[sd->bl.m].flag.pvp || map[sd->bl.m].flag.gvg) {
+ if(dstsd->spiritball > 0) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ i = dstsd->spiritball * 7;
+ pc_delspiritball(dstsd,dstsd->spiritball,0);
+ if(i > 0x7FFF)
+ i = 0x7FFF;
+ if(sd->status.sp + i > sd->status.max_sp)
+ i = sd->status.max_sp - sd->status.sp;
+ }
+ }
+ }else if(sd && dstmd){ //?Û‚ªƒ‚ƒ“ƒXƒ^?‚Ìê‡
+ //20%‚ÌŠm—¦‚Å?Û‚ÌLv*2‚ÌSP‚ð‰ñ•œ‚·‚éB¬Œ÷‚µ‚½‚Æ‚«‚̓^?ƒQƒbƒg(ƒÐ?„D?)ƒÐ????!!
+ if(rand()%100<20){
+ i=2*mob_db[dstmd->class].lv;
+ mob_target(dstmd,src,0);
+ }
+ }
+ if(i){
+ sd->status.sp += i;
+ clif_heal(sd->fd,SP_SP,i);
+ }
+ else
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ break;
+
+ case AC_MAKINGARROW: /* –îì¬ */
+ if(sd) {
+ clif_arrow_create_list(sd);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+
+ case AM_PHARMACY: /* ƒ|?ƒVƒ‡ƒ“ì¬ */
+ if(sd) {
+ clif_skill_produce_mix_list(sd,32);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+ case WS_CREATECOIN: /* ƒNƒŠƒGƒCƒgƒRƒCƒ“ */
+ if(sd) {
+ clif_skill_produce_mix_list(sd,64);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+ case WS_CREATENUGGET: /* ‰ò»‘¢ */
+ if(sd) {
+ clif_skill_produce_mix_list(sd,128);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ }
+ break;
+ case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
+ break;
+ if( rand()%100 < (20+ 10*skilllv)*sc_def_vit/100 ) {
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ }
+ break;
+
+ case RG_RAID: /* ƒTƒvƒ‰ƒCƒYƒAƒ^ƒbƒN */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ {
+ int x=bl->x,y=bl->y;
+ skill_area_temp[1]=bl->id;
+ skill_area_temp[2]=x;
+ skill_area_temp[3]=y;
+ map_foreachinarea(skill_area_sub,
+ bl->m,x-1,y-1,x+1,y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ }
+ skill_status_change_end(src, SC_HIDING, -1); // ƒnƒCƒfƒBƒ“ƒO‰ðœ
+ break;
+
+ case KN_BRANDISHSPEAR: /*ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA*/
+ {
+ int c,n=4,ar;
+ int dir = map_calc_dir(src,bl->x,bl->y);
+ struct square tc;
+ int x=bl->x,y=bl->y;
+ ar=skilllv/3;
+ skill_brandishspear_first(&tc,dir,x,y);
+ skill_brandishspear_dir(&tc,dir,4);
+ /* ”Í?‡C */
+ if(skilllv == 10){
+ for(c=1;c<4;c++){
+ map_foreachinarea(skill_area_sub,
+ bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
+ skill_castend_damage_id);
+ }
+ }
+ /* ”Í?‡B‡A */
+ if(skilllv > 6){
+ skill_brandishspear_dir(&tc,dir,-1);
+ n--;
+ }else{
+ skill_brandishspear_dir(&tc,dir,-2);
+ n-=2;
+ }
+
+ if(skilllv > 3){
+ for(c=0;c<5;c++){
+ map_foreachinarea(skill_area_sub,
+ bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|n,
+ skill_castend_damage_id);
+ if(skilllv > 6 && n==3 && c==4){
+ skill_brandishspear_dir(&tc,dir,-1);
+ n--;c=-1;
+ }
+ }
+ }
+ /* ”Í?‡@ */
+ for(c=0;c<10;c++){
+ if(c==0||c==5) skill_brandishspear_dir(&tc,dir,-1);
+ map_foreachinarea(skill_area_sub,
+ bl->m,tc.val1[c%5],tc.val2[c%5],tc.val1[c%5],tc.val2[c%5],0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ }
+ }
+ break;
+
+ /* ƒp?ƒeƒBƒXƒLƒ‹ */
+ case AL_ANGELUS: /* ƒGƒ“ƒWƒFƒ‰ƒX */
+ case PR_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
+ case PR_GLORIA: /* ƒOƒƒŠƒA */
+ case SN_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
+ /* ŒÂ•Ê‚Ì?— */
+ clif_skill_nodamage(bl,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ }
+ else{
+ /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
+ party_foreachsamemap(skill_area_sub,
+ sd,1,
+ src,skillid,skilllv,tick, flag|BCT_PARTY|1,
+ skill_castend_nodamage_id);
+ }
+ break;
+ case BS_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
+ case BS_WEAPONPERFECT: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
+ case BS_OVERTHRUST: /* ƒI?ƒo?ƒgƒ‰ƒXƒg */
+ if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
+ /* ŒÂ•Ê‚Ì?— */
+ clif_skill_nodamage(bl,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,(src == bl)? 1:0,0,0,skill_get_time(skillid,skilllv),0);
+ }
+ else{
+ /* ƒp?ƒeƒB‘S?‚Ö‚Ì?— */
+ party_foreachsamemap(skill_area_sub,
+ sd,1,
+ src,skillid,skilllv,tick, flag|BCT_PARTY|1,
+ skill_castend_nodamage_id);
+ }
+ break;
+
+ /*i•t‰Á‚Ɖ𜂪•K—vj */
+ case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
+ case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
+ case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
+ case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ int sc=SkillStatusChangeTable[skillid];
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( tsc_data ){
+ if( tsc_data[sc].timer==-1 )
+ /* •t‰Á‚·‚é */
+ skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ else
+ /* ‰ðœ‚·‚é */
+ skill_status_change_end(bl, sc, -1);
+ }
+ }
+ break;
+
+ case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ int sc=SkillStatusChangeTable[skillid];
+ clif_skill_nodamage(src,bl,skillid,-1,1);
+ if( tsc_data ){
+ if( tsc_data[sc].timer==-1 )
+ /* •t‰Á‚·‚é */
+ skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ else
+ /* ‰ðœ‚·‚é */
+ skill_status_change_end(bl, sc, -1);
+ }
+ }
+ break;
+
+ case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ int sc=SkillStatusChangeTable[skillid];
+ clif_skill_nodamage(src,bl,skillid,-1,1);
+ if( tsc_data ){
+ if( tsc_data[sc].timer==-1 )
+ /* •t‰Á‚·‚é */
+ skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ else
+ /* ‰ðœ‚·‚é */
+ skill_status_change_end(bl, sc, -1);
+ }
+
+ skill_check_cloaking(bl);
+ }
+ break;
+
+ case ST_CHASEWALK: /* ƒnƒCƒfƒBƒ“ƒO */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ int sc=SkillStatusChangeTable[skillid];
+ clif_skill_nodamage(src,bl,skillid,-1,1);
+ if( tsc_data ){
+ if( tsc_data[sc].timer==-1 )
+ /* •t‰Á‚·‚é */
+ skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ else
+ /* ‰ðœ‚·‚é */
+ skill_status_change_end(bl, sc, -1);
+ }
+ }
+ break;
+
+ /* ?’nƒXƒLƒ‹ */
+ case BD_LULLABY: /* ŽqŽç‰S */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
+ case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
+ case BA_WHISTLE: /* Œû“J */
+ case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
+ case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
+ break;
+
+ case HP_BASILICA: /* ƒoƒWƒŠƒJ */
+ case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
+ skill_clear_unitgroup(src);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
+ break;
+
+ case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
+ {
+ struct status_change *sc_data = battle_get_sc_data(src);
+ if(sc_data && sc_data[SC_DANCING].timer!=-1){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_stop_dancing(src,0);
+ }
+ }
+ break;
+
+ case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
+ case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,0,flag);
+ break;
+
+ case TF_STEAL: // ƒXƒeƒB?ƒ‹
+ if(sd) {
+ if(pc_steal_item(sd,bl))
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ else
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ }
+ break;
+
+ case RG_STEALCOIN: // ƒXƒeƒB?ƒ‹ƒRƒCƒ“
+ if(sd) {
+ if(pc_steal_coin(sd,bl)) {
+ int range = skill_get_range(skillid,skilllv);
+ if(range < 0)
+ range = battle_get_range(src) - (range + 1);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ mob_target((struct mob_data *)bl,src,range);
+ }
+ else
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ }
+ break;
+
+ case MG_STONECURSE: /* ƒXƒg?ƒ“ƒJ?ƒX */
+ if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ break;
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if( rand()%100 < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
+ skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ else if(sd)
+ clif_skill_fail(sd,skillid,0,0);
+ break;
+
+ case NV_FIRSTAID: /* ?‹}Žè? */
+ clif_skill_nodamage(src,bl,skillid,5,1);
+ battle_heal(NULL,bl,5,0,0);
+ break;
+
+ case AL_CURE: /* ƒLƒ…ƒA? */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_end(bl, SC_SILENCE , -1 );
+ skill_status_change_end(bl, SC_BLIND , -1 );
+ skill_status_change_end(bl, SC_CONFUSION, -1 );
+ if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
+ skill_status_change_start(bl, SC_CONFUSION,1,0,0,0,6000,0);
+ }
+ break;
+
+ case TF_DETOXIFY: /* ‰ð“Å */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_end(bl, SC_POISON , -1 );
+ break;
+
+ case PR_STRECOVERY: /* ƒŠƒJƒoƒŠ? */
+ {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_end(bl, SC_FREEZE , -1 );
+ skill_status_change_end(bl, SC_STONE , -1 );
+ skill_status_change_end(bl, SC_SLEEP , -1 );
+ skill_status_change_end(bl, SC_STAN , -1 );
+ if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//ƒAƒ“ƒfƒbƒh‚È‚çˆÃˆÅ?‰Ê
+ int blind_time;
+ //blind_time=30-battle_get_vit(bl)/10-battle_get_int/15;
+ blind_time=30*(100-(battle_get_int(bl)+battle_get_vit(bl))/2)/100;
+ if(rand()%100 < (100-(battle_get_int(bl)/2+battle_get_vit(bl)/3+battle_get_luk(bl)/10)))
+ skill_status_change_start(bl, SC_BLIND,1,0,0,0,blind_time,0);
+ }
+ if(dstmd){
+ dstmd->attacked_id=0;
+ dstmd->target_id=0;
+ dstmd->state.targettype = NONE_ATTACKABLE;
+ dstmd->state.skillstate=MSS_IDLE;
+ dstmd->next_walktime=tick+rand()%3000+3000;
+ }
+ }
+ break;
+
+ case WZ_ESTIMATION: /* ƒ‚ƒ“ƒXƒ^?î•ñ */
+ if(src->type==BL_PC){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ clif_skill_estimation((struct map_session_data *)src,bl);
+ }
+ break;
+
+ case MC_IDENTIFY: /* ƒAƒCƒeƒ€ŠÓ’è */
+ if(sd)
+ clif_item_identify_list(sd);
+ break;
+
+ case BS_REPAIRWEAPON: /* •ŠíC— */
+ if(sd)
+//“®ì‚µ‚È‚¢‚Ì‚Å‚Æ‚è‚ ‚¦‚¸ƒRƒƒ“ƒgƒAƒEƒg
+// clif_item_repair_list(sd);
+ break;
+
+ case MC_VENDING: /* ˜I“XŠJÝ */
+ if(sd)
+ clif_openvendingreq(sd,2+sd->skilllv);
+ break;
+
+ case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
+ if( sd ){
+ if(map[sd->bl.m].flag.noteleport){ /* ƒeƒŒƒ|‹ÖŽ~ */
+ clif_skill_teleportmessage(sd,0);
+ break;
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( sd->skilllv==1 )
+ clif_skill_warppoint(sd,sd->skillid,"Random","","","");
+ else{
+ clif_skill_warppoint(sd,sd->skillid,"Random",
+ sd->status.save_point.map,"","");
+ }
+ }else if( bl->type==BL_MOB )
+ mob_warp((struct mob_data *)bl,-1,-1,-1,3);
+ break;
+
+ case AL_HOLYWATER: /* ƒAƒNƒAƒxƒlƒfƒBƒNƒ^ */
+ if(sd) {
+ int eflag;
+ struct item item_tmp;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid = 523;
+ item_tmp.identify = 1;
+ if(battle_config.holywater_name_input) {
+ item_tmp.card[0] = 0xfe;
+ item_tmp.card[1] = 0;
+ *((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
+ }
+ eflag = pc_additem(sd,&item_tmp,1);
+ if(eflag) {
+ clif_additem(sd,0,0,eflag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ break;
+ case TF_PICKSTONE:
+ if(sd) {
+ int eflag;
+ struct item item_tmp;
+ struct block_list tbl;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ memset(&item_tmp,0,sizeof(item_tmp));
+ memset(&tbl,0,sizeof(tbl)); // [MouseJstr]
+ item_tmp.nameid = 7049;
+ item_tmp.identify = 1;
+ tbl.id = 0;
+ clif_takeitem(&sd->bl,&tbl);
+ eflag = pc_additem(sd,&item_tmp,1);
+ if(eflag) {
+ clif_additem(sd,0,0,eflag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ break;
+
+ case RG_STRIPWEAPON: /* ƒXƒgƒŠƒbƒvƒEƒFƒ|ƒ“ */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+
+ if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 )
+ break;
+ strip_per = 5+2*skilllv+strip_fix/5;
+ strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
+ if(rand()%100 < strip_per){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
+ if(dstsd){
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){
+ pc_unequipitem(dstsd,i,0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case RG_STRIPSHIELD: /* ƒXƒgƒŠƒbƒvƒV?ƒ‹ƒh */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+
+ if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 )
+ break;
+ strip_per = 5+2*skilllv+strip_fix/5;
+ strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
+ if(rand()%100 < strip_per){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
+ if(dstsd){
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){
+ pc_unequipitem(dstsd,i,0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case RG_STRIPARMOR: /* ƒXƒgƒŠƒbƒvƒA?ƒ}? */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+
+ if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 )
+ break;
+ strip_per = 5+2*skilllv+strip_fix/5;
+ strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
+ if(rand()%100 < strip_per){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
+ if(dstsd){
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){
+ pc_unequipitem(dstsd,i,0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+ case RG_STRIPHELM: /* ƒXƒgƒŠƒbƒvƒwƒ‹ƒ€ */
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+
+ if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 )
+ break;
+ strip_per = 5+2*skilllv+strip_fix/5;
+ strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
+ if(rand()%100 < strip_per){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
+ if(dstsd){
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){
+ pc_unequipitem(dstsd,i,0);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+ /* PotionPitcher */
+ case AM_POTIONPITCHER: /* ƒ|?ƒVƒ‡ƒ“ƒsƒbƒ`ƒƒ? */
+ {
+ struct block_list tbl;
+ int i,x,hp = 0,sp = 0;
+ if(sd) {
+ if(sd==dstsd) { // cancel use on oneself
+ map_freeblock_unlock();
+ return 1;
+ }
+ x = skilllv%11 - 1;
+ i = pc_search_inventory(sd,skill_db[skillid].itemid[x]);
+ if(i < 0 || skill_db[skillid].itemid[x] <= 0) {
+ clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
+ return 1;
+ }
+ if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x]) {
+ clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
+ return 1;
+ }
+ sd->state.potionpitcher_flag = 1;
+ sd->potion_hp = sd->potion_sp = sd->potion_per_hp = sd->potion_per_sp = 0;
+ sd->skilltarget = bl->id;
+ run_script(sd->inventory_data[i]->use_script,0,sd->bl.id,0);
+ pc_delitem(sd,i,skill_db[skillid].amount[x],0);
+ sd->state.potionpitcher_flag = 0;
+ if(sd->potion_per_hp > 0 || sd->potion_per_sp > 0) {
+ hp = battle_get_max_hp(bl) * sd->potion_per_hp / 100;
+ hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
+ if(dstsd) {
+ sp = dstsd->status.max_sp * sd->potion_per_sp / 100;
+ sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
+ }
+ }
+ else {
+ if(sd->potion_hp > 0) {
+ hp = sd->potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
+ hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100;
+ if(dstsd)
+ hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
+ }
+ if(sd->potion_sp > 0) {
+ sp = sd->potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100;
+ sp = sp * (100 + (battle_get_int(bl)<<1)) / 100;
+ if(dstsd)
+ sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10) / 100;
+ }
+ }
+ }
+ else {
+ hp = (1 + rand()%400) * (100 + skilllv*10) / 100;
+ hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100;
+ if(dstsd)
+ hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100;
+ }
+ tbl.id = 0;
+ tbl.m = src->m;
+ tbl.x = src->x;
+ tbl.y = src->y;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(hp > 0 || (hp <= 0 && sp <= 0))
+ clif_skill_nodamage(&tbl,bl,AL_HEAL,hp,1);
+ if(sp > 0)
+ clif_skill_nodamage(&tbl,bl,MG_SRECOVERY,sp,1);
+ battle_heal(src,bl,hp,sp,0);
+ }
+ break;
+ case AM_CP_WEAPON:
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1)
+ skill_status_change_end(bl, SC_STRIPWEAPON, -1 );
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ }
+ break;
+ case AM_CP_SHIELD:
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1)
+ skill_status_change_end(bl, SC_STRIPSHIELD, -1 );
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ }
+ break;
+ case AM_CP_ARMOR:
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(tsc_data && tsc_data[SC_STRIPARMOR].timer != -1)
+ skill_status_change_end(bl, SC_STRIPARMOR, -1 );
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ }
+ break;
+ case AM_CP_HELM:
+ {
+ struct status_change *tsc_data = battle_get_sc_data(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(tsc_data && tsc_data[SC_STRIPHELM].timer != -1)
+ skill_status_change_end(bl, SC_STRIPHELM, -1 );
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ }
+ break;
+ case SA_DISPELL: /* ƒfƒBƒXƒyƒ‹ */
+ {
+ int i;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ for(i=0;i<136;i++){
+ if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50
+ || i==SC_WEIGHT90 || i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR
+ || i==SC_STRIPHELM || i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR
+ || i==SC_CP_HELM || i==SC_COMBO)
+ continue;
+ skill_status_change_end(bl,i,-1);
+ }
+ }
+ break;
+
+ case TF_BACKSLIDING: /* ƒoƒbƒNƒXƒeƒbƒv */
+ battle_stopwalking(src,1);
+ skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)|0x10000);
+ if(src->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)src);
+ else if(src->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)src);
+ else if(src->type == BL_PC)
+ clif_fixpos(src);
+ skill_addtimerskill(src,tick + 200,src->id,0,0,skillid,skilllv,0,flag);
+ break;
+
+ case SA_CASTCANCEL:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_castcancel(src,1);
+ if(sd) {
+ int sp = skill_get_sp(sd->skillid_old,sd->skilllv_old);
+ sp = sp * (90 - (skilllv-1)*20) / 100;
+ if(sp < 0) sp = 0;
+ pc_heal(sd,0,-sp);
+ }
+ break;
+ case SA_SPELLBREAKER: // ƒXƒyƒ‹ƒuƒŒƒCƒJ?
+ {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ int sp;
+ if(sc_data && sc_data[SC_MAGICROD].timer != -1) {
+ if(dstsd) {
+ sp = skill_get_sp(skillid,skilllv);
+ sp = sp * sc_data[SC_MAGICROD].val2 / 100;
+ if(sp > 0x7fff) sp = 0x7fff;
+ else if(sp < 1) sp = 1;
+ if(dstsd->status.sp + sp > dstsd->status.max_sp) {
+ sp = dstsd->status.max_sp - dstsd->status.sp;
+ dstsd->status.sp = dstsd->status.max_sp;
+ }
+ else
+ dstsd->status.sp += sp;
+ clif_heal(dstsd->fd,SP_SP,sp);
+ }
+ clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1);
+ if(sd) {
+ sp = sd->status.max_sp/5;
+ if(sp < 1) sp = 1;
+ pc_heal(sd,0,-sp);
+ }
+ }
+ else {
+ int bl_skillid=0,bl_skilllv=0;
+ if(bl->type == BL_PC) {
+ if(dstsd && dstsd->skilltimer != -1) {
+ bl_skillid = dstsd->skillid;
+ bl_skilllv = dstsd->skilllv;
+ }
+ }
+ else if(bl->type == BL_MOB) {
+ if(dstmd && dstmd->skilltimer != -1) {
+ bl_skillid = dstmd->skillid;
+ bl_skilllv = dstmd->skilllv;
+ }
+ }
+ if(bl_skillid > 0 && skill_db[bl_skillid].skill_type == BF_MAGIC) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_castcancel(bl,0);
+ sp = skill_get_sp(bl_skillid,bl_skilllv);
+ if(dstsd)
+ pc_heal(dstsd,0,-sp);
+ if(sd) {
+ sp = sp*(25*(skilllv-1))/100;
+ if(skilllv > 1 && sp < 1) sp = 1;
+ if(sp > 0x7fff) sp = 0x7fff;
+ else if(sp < 1) sp = 1;
+ if(sd->status.sp + sp > sd->status.max_sp) {
+ sp = sd->status.max_sp - sd->status.sp;
+ sd->status.sp = sd->status.max_sp;
+ }
+ else
+ sd->status.sp += sp;
+ clif_heal(sd->fd,SP_SP,sp);
+ }
+ }
+ else if(sd)
+ clif_skill_fail(sd,skillid,0,0);
+ }
+ }
+ break;
+ case SA_MAGICROD:
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case SA_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(sd)
+ clif_autospell(sd,skilllv);
+ else {
+ int maxlv=1,spellid=0;
+ static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT };
+ if(skilllv >= 10) {
+ spellid = MG_FROSTDIVER;
+ maxlv = skilllv - 9;
+ }
+ else if(skilllv >=8) {
+ spellid = MG_FIREBALL;
+ maxlv = skilllv - 7;
+ }
+ else if(skilllv >=5) {
+ spellid = MG_SOULSTRIKE;
+ maxlv = skilllv - 4;
+ }
+ else if(skilllv >=2) {
+ int i = rand()%3;
+ spellid = spellarray[i];
+ maxlv = skilllv - 1;
+ }
+ else if(skilllv > 0) {
+ spellid = MG_NAPALMBEAT;
+ maxlv = 3;
+ }
+ if(spellid > 0)
+ skill_status_change_start(src,SC_AUTOSPELL,skilllv,spellid,maxlv,0,
+ skill_get_time(SA_AUTOSPELL,skilllv),0);
+ }
+ break;
+
+ /* ƒ‰ƒ“ƒ_ƒ€?«?‰»A…?«?‰»A’nA‰ÎA•— */
+ case NPC_ATTRICHANGE:
+ case NPC_CHANGEWATER:
+ case NPC_CHANGEGROUND:
+ case NPC_CHANGEFIRE:
+ case NPC_CHANGEWIND:
+ /* “ÅA¹A”OAˆÅ */
+ case NPC_CHANGEPOISON:
+ case NPC_CHANGEHOLY:
+ case NPC_CHANGEDARKNESS:
+ case NPC_CHANGETELEKINESIS:
+ if(md){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ md->def_ele=skill_get_pl(skillid);
+ if(md->def_ele==0) /* ƒ‰ƒ“ƒ_ƒ€?‰»A‚½‚¾‚µA*/
+ md->def_ele=rand()%10; /* •sŽ€?«‚Íœ‚­ */
+ md->def_ele+=(1+rand()%4)*20; /* ?«ƒŒƒxƒ‹‚̓‰ƒ“ƒ_ƒ€ */
+ }
+ break;
+
+ case NPC_PROVOCATION:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(md)
+ clif_pet_performance(src,mob_db[md->class].skill[md->skillidx].val[0]);
+ break;
+
+ case NPC_HALLUCINATION:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+ break;
+
+ case NPC_KEEPING:
+ case NPC_BARRIER:
+ {
+ int skill_time = skill_get_time(skillid,skilllv);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 );
+ if (bl->type == BL_MOB)
+ mob_changestate((struct mob_data *)src,MS_DELAY,skill_time);
+ else if (bl->type == BL_PC)
+ sd->attackabletime = sd->canmove_tick = tick + skill_time;
+ }
+ break;
+
+ case NPC_DARKBLESSING:
+ {
+ int sc_def = 100 - battle_get_mdef(bl);
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if(battle_get_elem_type(bl) == 7 || battle_get_race(bl) == 6)
+ break;
+ if(rand()%100 < sc_def*(50+skilllv*5)/100) {
+ if(dstsd) {
+ int hp = battle_get_hp(bl)-1;
+ pc_heal(dstsd,-hp,0);
+ }
+ else if(dstmd)
+ dstmd->hp = 1;
+ }
+ }
+ break;
+
+ case NPC_SELFDESTRUCTION: /* Ž©”š */
+ case NPC_SELFDESTRUCTION2: /* Ž©”š2 */
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,0,0,skill_get_time(skillid,skilllv),0);
+ break;
+ case NPC_LICK:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
+ break;
+ if(dstsd)
+ pc_heal(dstsd,0,-100);
+ if(rand()%100 < (skilllv*5)*sc_def_vit/100)
+ skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ break;
+
+ case NPC_SUICIDE: /* Ž©Œˆ */
+ if(src && bl){
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if (md)
+ mob_damage(NULL,md,md->hp,0);
+ else if (sd)
+ pc_damage(NULL,sd,sd->status.hp);
+ }
+ break;
+
+ case NPC_SUMMONSLAVE: /* Žè‰º¢Š« */
+ case NPC_SUMMONMONSTER: /* MOB¢Š« */
+ if(md && !md->master_id){
+ mob_summonslave(md,mob_db[md->class].skill[md->skillidx].val,skilllv,(skillid==NPC_SUMMONSLAVE)?1:0);
+ }
+ break;
+
+ case NPC_TRANSFORMATION:
+ case NPC_METAMORPHOSIS:
+ if(md)
+ mob_class_change(md,mob_db[md->class].skill[md->skillidx].val);
+ break;
+
+ case NPC_EMOTION: /* ƒGƒ‚?ƒVƒ‡ƒ“ */
+ if(md)
+ clif_emotion(&md->bl,mob_db[md->class].skill[md->skillidx].val[0]);
+ break;
+
+ case NPC_DEFENDER:
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ break;
+
+ case WE_MALE: /* ŒN‚¾‚¯‚ÍŒì‚é‚æ */
+ if(sd && dstsd){
+ int hp_rate=(skilllv <= 0)? 0:skill_db[skillid].hp_rate[skilllv-1];
+ int gain_hp=sd->status.max_hp*abs(hp_rate)/100;// 15%
+ clif_skill_nodamage(src,bl,skillid,gain_hp,1);
+ battle_heal(NULL,bl,gain_hp,0,0);
+ }
+ break;
+ case WE_FEMALE: /* ‚ ‚È‚½‚Ì?‚É?µ‚É‚È‚è‚Ü‚· */
+ if(sd && dstsd){
+ int sp_rate=(skilllv <= 0)? 0:skill_db[skillid].sp_rate[skilllv-1];
+ int gain_sp=sd->status.max_sp*abs(sp_rate)/100;// 15%
+ clif_skill_nodamage(src,bl,skillid,gain_sp,1);
+ battle_heal(NULL,bl,0,gain_sp,0);
+ }
+ break;
+
+ case WE_CALLPARTNER: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
+ if(sd && dstsd){
+ if(map[sd->bl.m].flag.nomemo){
+ clif_skill_teleportmessage(sd,1);
+ return 0;
+ }
+ if((dstsd = pc_get_partner(sd)) == NULL){
+ clif_skill_fail(sd,skillid,0,0);
+ return 0;
+ }
+ skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0);
+ }
+ break;
+
+ case PF_HPCONVERSION: /* ƒ‰ƒCƒt’u‚«Š·‚¦ */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(sd){
+ int conv_hp=0,conv_sp=0;
+ conv_hp=sd->status.hp/10; //Šî–{‚ÍHP‚Ì10%
+ sd->status.hp -= conv_hp; //HP‚ðŒ¸‚ç‚·
+ conv_sp=conv_hp*10*skilllv/100;
+ conv_sp=(sd->status.sp+conv_sp>sd->status.max_sp)?sd->status.max_sp-sd->status.sp:conv_sp;
+ sd->status.sp += conv_sp; //SP‚ð?‚â‚·
+ pc_heal(sd,-conv_hp,conv_sp);
+ clif_heal(sd->fd,SP_SP,conv_sp);
+ }
+ break;
+ case HT_REMOVETRAP: /* ƒŠƒ€?ƒuƒgƒ‰ƒbƒv */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ {
+ struct skill_unit *su=NULL;
+ struct item item_tmp;
+ int flag;
+ if((bl->type==BL_SKILL) &&
+ (su=(struct skill_unit *)bl) &&
+ (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
+ (su->group->unit_id >= 0x8f && su->group->unit_id <= 0x99) &&
+ (su->group->unit_id != 0x92)){ //?‚ðŽæ‚è•Ô‚·
+ if(sd){
+ if(battle_config.skill_removetrap_type == 1){
+ for(i=0;i<10;i++) {
+ if(skill_db[su->group->skill_id].itemid[i] > 0){
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid = skill_db[su->group->skill_id].itemid[i];
+ item_tmp.identify = 1;
+ if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,skill_db[su->group->skill_id].amount[i]))){
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,skill_db[su->group->skill_id].amount[i],sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ }
+ }else{
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid = 1065;
+ item_tmp.identify = 1;
+ if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,1))){
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+
+ }
+ if(su->group->unit_id == 0x91 && su->group->val2){
+ struct block_list *target=map_id2bl(su->group->val2);
+ if(target && (target->type == BL_PC || target->type == BL_MOB))
+ skill_status_change_end(target,SC_ANKLE,-1);
+ }
+ skill_delunit(su);
+ }
+ }
+ break;
+ case HT_SPRINGTRAP: /* ƒXƒvƒŠƒ“ƒOƒgƒ‰ƒbƒv */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ {
+ struct skill_unit *su=NULL;
+ if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){
+ switch(su->group->unit_id){
+ case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ su->group->unit_id = 0x8c;
+ clif_changelook(bl,LOOK_BASE,su->group->unit_id);
+ su->group->limit=DIFF_TICK(tick+1500,su->group->tick);
+ su->limit=DIFF_TICK(tick+1500,su->group->tick);
+ }
+ }
+ }
+ break;
+ case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(sd)
+ skill_use_id(sd,src->id,sd->skillid_dance,sd->skilllv_dance);
+ break;
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HP‚ª2/3ˆÈã?‚Á‚Ä‚¢‚½‚玸”s
+ return 1;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,0,skill_get_time(skillid,skilllv),0 );
+ break;
+ case ASC_CDP: // Temporary skill for Create Deadly Poison[Celest]
+ if(sd) {
+ int eflag;
+ struct item item_tmp;
+ struct block_list tbl;
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ memset(&item_tmp,0,sizeof(item_tmp));
+ memset(&tbl,0,sizeof(tbl)); // [MouseJstr]
+ item_tmp.nameid = 678;
+ item_tmp.identify = 1;
+ tbl.id = 0;
+ eflag = pc_additem(sd,&item_tmp,1);
+ if(eflag) {
+ clif_additem(sd,0,0,eflag);
+ map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+ break;
+ case PF_MINDBREAKER: /* ƒvƒƒ{ƒbƒN */
+ {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+
+ /* MVPmob‚Æ•sŽ€‚É‚Í?‚©‚È‚¢ */
+ if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //•sŽ€‚É‚Í?‚©‚È‚¢
+ {
+ map_freeblock_unlock();
+ return 1;
+ }
+
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+
+ if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // ‰r¥–WŠQ
+ skill_castcancel(bl,0);
+ if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg)
+ && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2)
+ skill_castcancel(bl,0);
+
+ if(sc_data){
+ if(sc_data[SC_FREEZE].timer!=-1)
+ skill_status_change_end(bl,SC_FREEZE,-1);
+ if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
+ skill_status_change_end(bl,SC_STONE,-1);
+ if(sc_data[SC_SLEEP].timer!=-1)
+ skill_status_change_end(bl,SC_SLEEP,-1);
+ }
+
+ if(bl->type==BL_MOB) {
+ int range = skill_get_range(skillid,skilllv);
+ if(range < 0)
+ range = battle_get_range(src) - (range + 1);
+ mob_target((struct mob_data *)bl,src,range);
+ }
+ }
+ break;
+
+
+
+
+
+
+ case RG_CLEANER: //AppleGirl
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ {
+ struct skill_unit *su=NULL;
+ if((bl->type==BL_SKILL) &&
+ (su=(struct skill_unit *)bl) &&
+ (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) &&
+ (su->group->unit_id == 0xb0)){ //?‚ðŽæ‚è•Ô‚·
+ if(sd)
+ skill_delunit(su);
+ }
+ }
+ break;
+ default:
+ printf("Unknown skill used:%d\n",skillid);
+ map_freeblock_unlock();
+ return 1;
+ }
+
+ map_freeblock_unlock();
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AIDŽw’èj
+ *------------------------------------------
+ */
+int skill_castend_id( int tid, unsigned int tick, int id,int data )
+{
+ struct map_session_data* sd = map_id2sd(id)/*,*target_sd=NULL*/;
+ struct block_list *bl;
+ int range,inf2;
+
+ nullpo_retr(0, sd);
+
+ if( sd->bl.prev == NULL ) //prev‚ª–³‚¢‚Ì‚Í‚ ‚è‚È‚ÌH
+ return 0;
+
+ if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
+ return 0;
+ if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
+ sd->speed = sd->prev_speed;
+ clif_updatestatus(sd,SP_SPEED);
+ }
+ if(sd->skillid != SA_CASTCANCEL)
+ sd->skilltimer=-1;
+
+ if((bl=map_id2bl(sd->skilltarget))==NULL || bl->prev==NULL) {
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ if(sd->bl.m != bl->m || pc_isdead(sd)) { //ƒ}ƒbƒv‚ªˆá‚¤‚©Ž©•ª‚ªŽ€‚ñ‚Å‚¢‚é
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+
+ if(sd->skillid == PR_LEXAETERNA) {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ else if(sd->skillid == RG_BACKSTAP) {
+ int dir = map_calc_dir(&sd->bl,bl->x,bl->y),t_dir = battle_get_dir(bl);
+ int dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y);
+ if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir))) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+
+ inf2 = skill_get_inf2(sd->skillid);
+ if( ( (skill_get_inf(sd->skillid)&1) || inf2&4 ) && // ”Þ‰ä“G??ŒWƒ`ƒFƒbƒN
+ battle_check_target(&sd->bl,bl, BCT_ENEMY)<=0 ) {
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ if(inf2 & 0xC00 && sd->bl.id != bl->id) {
+ int fail_flag = 1;
+ if(inf2 & 0x400 && battle_check_target(&sd->bl,bl, BCT_PARTY) > 0)
+ fail_flag = 0;
+ if(inf2 & 0x800 && sd->status.guild_id > 0 && sd->status.guild_id == battle_get_guild_id(bl))
+ fail_flag = 0;
+ if(fail_flag) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+
+ range = skill_get_range(sd->skillid,sd->skilllv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ range += battle_config.pc_skill_add_range;
+ if((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
+ (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
+ (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) ||
+ (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == CH_TIGERFIST))
+ range += skill_get_blewcount(MO_COMBOFINISH,sd->sc_data[SC_COMBO].val2);
+ if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
+ if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ sd->skillitem = sd->skillitemlv = -1;
+ if(battle_config.skill_out_range_consume) {
+ if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ return 0;
+ }
+ }
+
+ if(battle_config.pc_skill_log)
+ printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
+ pc_stop_walking(sd,0);
+
+ switch( skill_get_nk(sd->skillid) )
+ {
+ /* U?Œn/‚«”ò‚΂µŒn */
+ case 0: case 2:
+ skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
+ break;
+ case 1:/* Žx‰‡Œn */
+ if( (sd->skillid==AL_HEAL || (sd->skillid==ALL_RESURRECTION && bl->type != BL_PC) || sd->skillid==PR_ASPERSIO) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
+ skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
+ else
+ skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0);
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’è‚Ì?Û‚Ì?—j
+ *------------------------------------------
+ */
+int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag)
+{
+ if(skilllv <= 0) return 0;
+
+ struct map_session_data *sd=NULL;
+ int i,tmpx = 0,tmpy = 0, x1 = 0, y1 = 0;
+
+ nullpo_retr(0, src);
+
+ if(src->type==BL_PC){
+ nullpo_retr(0, sd=(struct map_session_data *)src);
+ }
+ if( skillid != WZ_METEOR &&
+ skillid != WZ_SIGHTRASHER &&
+ skillid != AM_CANNIBALIZE &&
+ skillid != AM_SPHEREMINE)
+ clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
+
+ if (skillnotok(skillid, sd)) // [MouseJstr]
+ return 0;
+
+ switch(skillid)
+ {
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ skill_area_temp[1]=src->id;
+ map_foreachinarea(skill_area_sub,
+ src->m,x-1,y-1,x+1,y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_NOENEMY|1,
+ skill_castend_nodamage_id);
+ map_foreachinarea(skill_area_sub,
+ src->m,x-1,y-1,x+1,y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ break;
+
+ case BS_HAMMERFALL: /* ƒnƒ“ƒ}?ƒtƒH?ƒ‹ */
+ skill_area_temp[1]=src->id;
+ skill_area_temp[2]=x;
+ skill_area_temp[3]=y;
+ map_foreachinarea(skill_area_sub,
+ src->m,x-2,y-2,x+2,y+2,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|2,
+ skill_castend_nodamage_id);
+ break;
+
+ case HT_DETECTING: /* ƒfƒBƒeƒNƒeƒBƒ“ƒO */
+ {
+ const int range=7;
+ map_foreachinarea( skill_status_change_timer_sub,
+ src->m, src->x-range, src->y-range, src->x+range,src->y+range,0,
+ src,SC_SIGHT,tick);
+ }
+ break;
+
+ case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
+ case MG_THUNDERSTORM: /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
+ case AL_PNEUMA: /* ƒjƒ…?ƒ} */
+ case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒAƒsƒ‰? */
+ case WZ_SIGHTRASHER:
+ case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ case WZ_VERMILION: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
+ case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
+ case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
+ case WZ_HEAVENDRIVE: /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
+ case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
+ case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
+ case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
+ case AM_DEMONSTRATION: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
+ case HT_TALKIEBOX: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ skill_unitsetting(src,skillid,skilllv,x,y,0);
+ break;
+
+ case RG_GRAFFITI: /* Graffiti [Valaris] */
+ skill_clear_unitgroup(src);
+ skill_unitsetting(src,skillid,skilllv,x,y,0);
+ break;
+
+ case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
+ case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
+ case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
+ skill_clear_element_field(src);//?‚ÉŽ©•ª‚ª?“®‚µ‚Ä‚¢‚é?«ê‚ðƒNƒŠƒA
+ skill_unitsetting(src,skillid,skilllv,x,y,0);
+ break;
+
+ case WZ_METEOR: //ƒƒeƒIƒXƒg?ƒ€
+ {
+ int flag=0;
+ for(i=0;i<2+(skilllv>>1);i++) {
+ int j=0, c;
+ do {
+ tmpx = x + (rand()%7 - 3);
+ tmpy = y + (rand()%7 - 3);
+ if(tmpx < 0)
+ tmpx = 0;
+ else if(tmpx >= map[src->m].xs)
+ tmpx = map[src->m].xs - 1;
+ if(tmpy < 0)
+ tmpy = 0;
+ else if(tmpy >= map[src->m].ys)
+ tmpy = map[src->m].ys - 1;
+ j++;
+ } while(((c=map_getcell(src->m,tmpx,tmpy))==1 || c==5) && j<100);
+ if(j >= 100)
+ continue;
+ if(flag==0){
+ clif_skill_poseffect(src,skillid,skilllv,tmpx,tmpy,tick);
+ flag=1;
+ }
+ if(i > 0)
+ skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,(x1<<16)|y1,flag);
+ x1 = tmpx;
+ y1 = tmpy;
+ }
+ skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,-1,flag);
+ }
+ break;
+
+ case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
+ if(sd) {
+ if(map[sd->bl.m].flag.noteleport) /* ƒeƒŒƒ|‹ÖŽ~ */
+ break;
+ clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map,
+ (sd->skilllv>1)?sd->status.memo_point[0].map:"",
+ (sd->skilllv>2)?sd->status.memo_point[1].map:"",
+ (sd->skilllv>3)?sd->status.memo_point[2].map:"");
+ }
+ break;
+ case MO_BODYRELOCATION:
+ if(sd){
+ pc_movepos(sd,x,y);
+ }else if( src->type==BL_MOB )
+ mob_warp((struct mob_data *)src,-1,x,y,0);
+ break;
+ case AM_CANNIBALIZE: // ƒoƒCƒIƒvƒ‰ƒ“ƒg
+ if(sd){
+ int mx,my,id=0;
+ struct mob_data *md;
+
+ mx = x;// + (rand()%10 - 5);
+ my = y;// + (rand()%10 - 5);
+ id=mob_once_spawn(sd,"this",mx,my,"--ja--",1118,1,"");
+ if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
+ md->master_id=sd->bl.id;
+ md->hp=2210+skilllv*200;
+ md->state.special_mob_ai=1;
+ md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
+ }
+ clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
+ }
+ break;
+ case AM_SPHEREMINE: // ƒXƒtƒBƒA?ƒ}ƒCƒ“
+ if(sd){
+ int mx,my,id=0;
+ struct mob_data *md;
+
+ mx = x;// + (rand()%10 - 5);
+ my = y;// + (rand()%10 - 5);
+ id=mob_once_spawn(sd,"this",mx,my,"--ja--",1142,1,"");
+ if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
+ md->master_id=sd->bl.id;
+ md->hp=1000+skilllv*200;
+ md->state.special_mob_ai=2;
+ md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
+ }
+ clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
+ }
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹AmapŽw’èj
+ *------------------------------------------
+ */
+int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map)
+{
+ int x=0,y=0;
+
+ nullpo_retr(0, sd);
+ if( sd->bl.prev == NULL || pc_isdead(sd) )
+ return 0;
+
+ if(skillnotok(skill_num, sd))
+ return 0;
+
+ if( sd->opt1>0 || sd->status.option&2 )
+ return 0;
+ //ƒXƒLƒ‹‚ªŽg‚¦‚È‚¢?‘ÔˆÙí’†
+ if(sd->sc_data){
+ if( sd->sc_data[SC_DIVINA].timer!=-1 ||
+ sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
+ sd->sc_data[SC_AUTOCOUNTER].timer != -1 ||
+ sd->sc_data[SC_STEELBODY].timer != -1 ||
+ sd->sc_data[SC_DANCING].timer!=-1 ||
+ sd->sc_data[SC_BERSERK].timer != -1 ||
+ sd->sc_data[SC_MARIONETTE].timer != -1)
+ return 0;
+ }
+
+ if( skill_num != sd->skillid) /* •s³ƒpƒPƒbƒg‚炵‚¢ */
+ return 0;
+
+ pc_stopattack(sd);
+
+ if(battle_config.pc_skill_log)
+ printf("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_num,map);
+ pc_stop_walking(sd,0);
+
+ if(strcmp(map,"cancel")==0)
+ return 0;
+
+ switch(skill_num){
+ case AL_TELEPORT: /* ƒeƒŒƒ|?ƒg */
+ if(strcmp(map,"Random")==0)
+ pc_randomwarp(sd,3);
+ else
+ pc_setpos(sd,sd->status.save_point.map,
+ sd->status.save_point.x,sd->status.save_point.y,3);
+ break;
+
+ case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
+ {
+ const struct point *p[]={
+ &sd->status.save_point,&sd->status.memo_point[0],
+ &sd->status.memo_point[1],&sd->status.memo_point[2],
+ };
+ struct skill_unit_group *group;
+ int i;
+ int maxcount=0;
+
+ if((maxcount = skill_get_maxcount(sd->skillid)) > 0) {
+ int c;
+ for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
+ if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
+ c++;
+ }
+ if(c >= maxcount) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = gettick();
+ sd->canmove_tick = gettick();
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+
+ if(sd->skilllv <= 0) return 0;
+ for(i=0;i<sd->skilllv;i++){
+ if(strcmp(map,p[i]->map)==0){
+ x=p[i]->x;
+ y=p[i]->y;
+ break;
+ }
+ }
+ if(x==0 || y==0) /* •s³ƒpƒPƒbƒgH */
+ return 0;
+
+ if(!skill_check_condition(sd,3))
+ return 0;
+ if((group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0))==NULL)
+ return 0;
+ group->valstr=(char *)aCalloc(24,sizeof(char));
+ memcpy(group->valstr,map,24);
+ group->val2=(x<<16)|y;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgÝ’è?—
+ *------------------------------------------
+ */
+struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag)
+{
+ struct skill_unit_group *group;
+ int i,count=1,limit=10000,val1=0,val2=0;
+ int target=BCT_ENEMY,interval=1000,range=0;
+ int dir=0,aoe_diameter=0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills
+
+ nullpo_retr(0, src);
+
+ switch(skillid){ /* Ý’è */
+
+ case MG_SAFETYWALL: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ limit=skill_get_time(skillid,skilllv);
+ val2=skilllv+1;
+ interval = -1;
+ target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL;
+ break;
+
+ case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
+ if(src->x == x && src->y == y)
+ dir = 2;
+ else
+ dir=map_calc_dir(src,x,y);
+ if(dir&1) count=5;
+ else count=3;
+ limit=skill_get_time(skillid,skilllv);
+ if (((struct map_session_data *)src)->sc_data[SC_VIOLENTGALE].timer!=-1)
+ limit *= 1.5;
+ val2=4+skilllv;
+ interval=1;
+ break;
+
+ case AL_PNEUMA: /* ƒjƒ…?ƒ} */
+ limit=skill_get_time(skillid,skilllv);
+ interval = -1;
+ target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL;
+ count = 9;
+ break;
+
+ case AL_WARP: /* ƒ?ƒvƒ|?ƒ^ƒ‹ */
+ target=BCT_ALL;
+ val1=skilllv+6;
+ if(flag==0)
+ limit=2000;
+ else
+ limit=skill_get_time(skillid,skilllv);
+ break;
+
+ case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
+ count=21;
+ limit=skill_get_time(skillid,skilllv);
+ val1=skilllv+3;
+ val2=(skilllv>6)?777:skilllv*100;
+ target=BCT_ALL;
+ range=1;
+ break;
+
+ case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
+ count=33;
+ limit=skill_get_time(skillid,skilllv);
+ interval=3000;
+ break;
+
+ case WZ_FIREPILLAR: /* ƒtƒ@ƒCƒA?ƒsƒ‰? */
+ if(flag==0)
+ limit=skill_get_time(skillid,skilllv);
+ else
+ limit=1000;
+ interval=2000;
+ val1=skilllv+2;
+ if(skilllv < 6)
+ range=1;
+ else
+ range=2;
+ break;
+
+ case MG_THUNDERSTORM: /* ƒTƒ“ƒ_?ƒXƒg?ƒ€ */
+ limit=500;
+ range=1;
+ break;
+
+ case WZ_FROSTNOVA: /* ƒtƒƒXƒgƒmƒ”ƒ@ */
+ limit=500;
+ range=5;
+ break;
+ case WZ_HEAVENDRIVE: /* ƒwƒ”ƒ“ƒYƒhƒ‰ƒCƒu */
+ limit=500;
+ range=2;
+ break;
+
+ case WZ_METEOR: /* ƒƒeƒIƒXƒg?ƒ€ */
+ limit=500;
+ range=3;
+ break;
+
+ case WZ_SIGHTRASHER:
+ limit=500;
+ count=41;
+ break;
+
+ case WZ_VERMILION: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“ */
+ limit=4100;
+ interval=1000;
+ range=6;
+ break;
+
+ case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ limit=skill_get_time(skillid,skilllv);
+ count=5;
+ break;
+
+ case WZ_STORMGUST: /* ƒXƒg?ƒ€ƒKƒXƒg */
+ limit=4600;
+ interval=450;
+ range=5;
+ break;
+
+ case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ limit=skill_get_time(skillid,skilllv);
+ interval=200;
+ count=25;
+ break;
+
+ case HT_SANDMAN: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case HT_CLAYMORETRAP: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ limit=skill_get_time(skillid,skilllv);
+ range=2;
+ break;
+ case HT_SKIDTRAP: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ case HT_LANDMINE: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ case HT_ANKLESNARE: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case HT_FLASHER: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case HT_FREEZINGTRAP: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case HT_BLASTMINE: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ limit=skill_get_time(skillid,skilllv);
+ range=1;
+ break;
+
+ case HT_TALKIEBOX: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ limit=skill_get_time(skillid,skilllv);
+ range=1;
+ target=BCT_ALL;
+ break;
+
+ case HT_SHOCKWAVE: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ limit=skill_get_time(skillid,skilllv);
+ range=1;
+ val1=skilllv*15+10;
+ break;
+
+ case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
+ limit=skill_get_time(skillid,skilllv);
+ interval=1000;
+ count=5;
+ break;
+
+ case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ count=29;
+ limit=1000;
+ interval=300;
+ break;
+
+ case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
+ case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
+ case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ limit=skill_get_time(skillid,skilllv);
+ count=skilllv<=2?25:(skilllv<=4?49:81);
+ target=BCT_ALL;
+ break;
+
+ case SA_LANDPROTECTOR: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ limit=skill_get_time(skillid,skilllv); // changed to get duration from cast_db (moonsoul)
+ val1=skilllv*15+10;
+ aoe_diameter=skilllv+skilllv%2+5;
+ target=BCT_ALL;
+ count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul)
+ break;
+
+ case BD_LULLABY: /* ŽqŽç‰S */
+ case BD_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ count=81;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_ALL;
+ break;
+ case BD_RICHMANKIM:
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ count=81;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_PARTY;
+ break;
+
+ case BA_WHISTLE: /* Œû“J */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
+ val2 = ((battle_get_agi(src)/10)&0xffff)<<16;
+ val2 |= (battle_get_luk(src)/10)&0xffff;
+ break;
+ case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
+ val2 = battle_get_dex(src)/10;
+ break;
+
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
+ case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_ENEMY;
+ break;
+
+ case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_ENEMY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
+ val2 = ((battle_get_str(src)/20)&0xffff)<<16;
+ val2 |= (battle_get_agi(src)/10)&0xffff;
+ break;
+ case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON);
+ val2 = ((battle_get_dex(src)/10)&0xffff)<<16;
+ val2 |= (battle_get_int(src)/5)&0xffff;
+ break;
+ case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = ((pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON))&0xffff)<<16;
+ else
+ val1 = 0;
+ val1 |= (battle_get_vit(src))&0xffff;
+ val2 = 0;//‰ñ•œ—pƒ^ƒCƒ€ƒJƒEƒ“ƒ^(6•b?‚É1?‰Á)
+ break;
+ case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_PARTY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
+ val2 = battle_get_int(src)/10;
+ break;
+ case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1;
+ val2 = battle_get_agi(src)/20;
+ break;
+ case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
+ count=49;
+ limit=skill_get_time(skillid,skilllv);
+ range=5;
+ target=BCT_NOENEMY;
+ if(src->type == BL_PC)
+ val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1;
+ val2 = battle_get_luk(src)/10;
+ break;
+ case AM_DEMONSTRATION: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
+ limit=skill_get_time(skillid,skilllv);
+ interval=1000;
+ range=1;
+ target=BCT_ENEMY;
+ break;
+ case WE_CALLPARTNER: /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
+ limit=skill_get_time(skillid,skilllv);
+ range=-1;
+ break;
+
+ case HP_BASILICA: /* ƒoƒWƒŠƒJ */
+ limit=skill_get_time(skillid,skilllv);
+ target=BCT_ALL;
+ range=3;
+ //Fix to prevent the priest from walking while Basilica is up.
+ battle_stopwalking(src,1);
+ skill_status_change_start(src,SC_ANKLE,skilllv,0,0,0,limit,0);
+ break;
+ case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
+ count=49;
+ target=BCT_PARTY;
+ limit=skill_get_time(skillid,skilllv);
+ break;
+ case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
+ count=15;
+ limit=skill_get_time(skillid,skilllv);
+ if (((struct map_session_data *)src)->sc_data[SC_DELUGE].timer!=-1)
+ limit *= 2;
+ break;
+ case RG_GRAFFITI: /* Graffiti */
+ count=1; // Leave this at 1 [Valaris]
+ limit=600000; // Time length [Valaris]
+ break;
+ };
+
+ nullpo_retr(NULL, group=skill_initunitgroup(src,count,skillid,skilllv,skill_get_unit_id(skillid,flag&1)));
+ group->limit=limit;
+ group->val1=val1;
+ group->val2=val2;
+ group->target_flag=target;
+ group->interval=interval;
+ group->range=range;
+ if(skillid==HT_TALKIEBOX ||
+ skillid==RG_GRAFFITI){
+ group->valstr=calloc(80, 1);
+ if(group->valstr==NULL){
+ printf("skill_castend_map: out of memory !\n");
+ exit(1);
+ }
+ memcpy(group->valstr,talkie_mes,80);
+ }
+ for(i=0;i<count;i++){
+ struct skill_unit *unit;
+ int ux=x,uy=y,val1=skilllv,val2=0,limit=group->limit,alive=1;
+ int range=group->range;
+ switch(skillid){ /* Ý’è */
+ case AL_PNEUMA: /* ƒjƒ…?ƒ} */
+ {
+ static const int dx[9]={-1, 0, 1,-1, 0, 1,-1, 0, 1};
+ static const int dy[9]={-1,-1,-1, 0, 0, 0, 1, 1, 1};
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+ case MG_FIREWALL: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
+ {
+ if(dir&1){ /* ŽÎ‚ß”z’u */
+ static const int dx[][5]={
+ { 1,1,0,0,-1 }, { -1,-1,0,0,1 },
+ },dy[][5]={
+ { 1,0,0,-1,-1 }, { 1,0,0,-1,-1 },
+ };
+ ux+=dx[(dir>>1)&1][i];
+ uy+=dy[(dir>>1)&1][i];
+ }else{ /* ㉺”z’u */
+ if(dir%4==0) /* ㉺ */
+ ux+=i-1;
+ else /* ¶‰E */
+ uy+=i-1;
+ }
+ val2=group->val2;
+ }
+ break;
+
+ case PR_SANCTUARY: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
+ {
+ static const int dx[]={
+ -1,0,1, -2,-1,0,1,2, -2,-1,0,1,2, -2,-1,0,1,2, -1,0,1 };
+ static const int dy[]={
+ -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0, 1,1,1,1,1, 2,2,2, };
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+
+ case PR_MAGNUS: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
+ {
+ static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3,
+ -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, };
+ static const int dy[]={
+ -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1,
+ 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 };
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+
+ case WZ_SIGHTRASHER:
+ {
+ static const int dx[]={
+ -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3, 0, 3, -4, 0, 4, -5, 0, 5 };
+ static const int dy[]={
+ -5,-5,-5, -4,-4,-4, -3,-3,-3, -2,-2,-2, -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+
+ case WZ_ICEWALL: /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ {
+ static const int dirx[8]={0,-1,-1,-1,0,1,1,1};
+ static const int diry[8]={1,1,0,-1,-1,-1,0,1};
+ if(skilllv <= 1)
+ val1 = 500;
+ else
+ val1 = 200 + 200*skilllv;
+ if(src->x == x && src->y == y)
+ dir = 2;
+ else
+ dir=map_calc_dir(src,x,y);
+ ux+=(2-i)*diry[dir];
+ uy+=(i-2)*dirx[dir];
+ }
+ break;
+
+ case WZ_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ ux+=(i%5-2);
+ uy+=(i/5-2);
+ if(i==12)
+ range=2;
+ else
+ range=-1;
+
+ break;
+
+ case AS_VENOMDUST: /* ƒxƒmƒ€ƒ_ƒXƒg */
+ {
+ static const int dx[]={-1,0,0,0,1};
+ static const int dy[]={0,-1,0,1,0};
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+
+ case CR_GRANDCROSS: /* ƒOƒ‰ƒ“ƒhƒNƒƒX */
+ {
+ static const int dx[]={
+ 0, 0, -1,0,1, -2,-1,0,1,2, -4,-3,-2,-1,0,1,2,3,4, -2,-1,0,1,2, -1,0,1, 0, 0, };
+ static const int dy[]={
+ -4, -3, -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0,0,0,0,0, 1,1,1,1,1, 2,2,2, 3, 4, };
+ ux+=dx[i];
+ uy+=dy[i];
+ }
+ break;
+ case SA_VOLCANO: /* ƒ{ƒ‹ƒP?ƒm */
+ case SA_DELUGE: /* ƒfƒŠƒ…?ƒW */
+ case SA_VIOLENTGALE: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ {
+ int u_range=0,central=0;
+ if(skilllv<=2){
+ u_range=2;
+ central=12;
+ }else if(skilllv<=4){
+ u_range=3;
+ central=24;
+ }else if(skilllv>=5){
+ u_range=4;
+ central=40;
+ }
+ ux+=(i%(u_range*2+1)-u_range);
+ uy+=(i/(u_range*2+1)-u_range);
+
+ if(i==central)
+ range=u_range;//’†‰›‚̃†ƒjƒbƒg‚Ì?‰Ê”Í?‚Í‘S”Í?
+ else
+ range=-1;//’†‰›ˆÈŠO‚̃†ƒjƒbƒg‚Íü‚è
+ }
+ break;
+ case SA_LANDPROTECTOR: /* ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^? */
+ {
+ int u_range=0;
+
+ if(skilllv<=2) u_range=3;
+ else if(skilllv<=4) u_range=4;
+ else if(skilllv>=5) u_range=5;
+
+ ux+=(i%(u_range*2+1)-u_range);
+ uy+=(i/(u_range*2+1)-u_range);
+
+ range=0;
+ }
+ break;
+
+ /* ƒ_ƒ“ƒX‚È‚Ç */
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD:/* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ ux+=(i%9-4);
+ uy+=(i/9-4);
+ if(i==40)
+ range=4; /* ’†S‚Ìꇂ͔Í?‚ð4‚ɃI?ƒo?ƒ‰ƒCƒh */
+ else
+ range=-1; /* ’†S‚¶‚á‚È‚¢ê‡‚Í”Í?‚ð-1‚ɃI?ƒo?ƒ‰ƒCƒh */
+ break;
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
+ case BA_WHISTLE: /* Œû“J */
+ case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
+ case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
+ case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ ux+=(i%7-3);
+ uy+=(i/7-3);
+ if(i==40)
+ range=4; /* ’†S‚Ìꇂ͔Í?‚ð4‚ɃI?ƒo?ƒ‰ƒCƒh */
+ else
+ range=-1; /* ’†S‚¶‚á‚È‚¢ê‡‚Í”Í?‚ð-1‚ɃI?ƒo?ƒ‰ƒCƒh */
+ break;
+ case PA_GOSPEL: /* ƒSƒXƒyƒ‹ */
+ ux+=(i%7-3);
+ uy+=(i/7-3);
+ break;
+ case PF_FOGWALL: /* ƒtƒHƒOƒEƒH?ƒ‹ */
+ ux+=(i%5-2);
+ uy+=(i/5-1);
+ break;
+ case RG_GRAFFITI: /* Graffiti [Valaris] */
+ ux+=(i%5-2);
+ uy+=(i/5-2);
+ break;
+ }
+ //’¼ãƒXƒLƒ‹‚Ìê‡Ý’uÀ•Wã‚Ƀ‰ƒ“ƒhƒvƒƒeƒNƒ^?‚ª‚È‚¢‚©ƒ`ƒFƒbƒN
+ if(range<=0)
+ map_foreachinarea(skill_landprotector,src->m,ux,uy,ux,uy,BL_SKILL,skillid,&alive);
+
+ if(skillid==WZ_ICEWALL && alive){
+ val2=map_getcell(src->m,ux,uy);
+ if(val2==5 || val2==1)
+ alive=0;
+ else {
+ map_setcell(src->m,ux,uy,5);
+ clif_changemapcell(src->m,ux,uy,5,0);
+ }
+ }
+
+ if(alive){
+ nullpo_retr(NULL, unit=skill_initunit(group,i,ux,uy));
+ unit->val1=val1;
+ unit->val2=val2;
+ unit->limit=limit;
+ unit->range=range;
+ }
+ }
+ return group;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì?“®ƒCƒxƒ“ƒg
+ *------------------------------------------
+ */
+int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick)
+{
+ struct skill_unit_group *sg;
+ struct block_list *ss;
+ struct skill_unit_group_tickset *ts;
+ struct map_session_data *srcsd=NULL;
+ int diff,goflag,splash_count=0;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, bl);
+
+ if( bl->prev==NULL || !src->alive || (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl) ) )
+ return 0;
+
+ nullpo_retr(0, sg=src->group);
+ nullpo_retr(0, ss=map_id2bl(sg->src_id));
+
+ if(ss->type == BL_PC)
+ nullpo_retr(0, srcsd=(struct map_session_data *)ss);
+ if(srcsd && srcsd->chatID)
+ return 0;
+
+ if( bl->type!=BL_PC && bl->type!=BL_MOB )
+ return 0;
+ nullpo_retr(0, ts=skill_unitgrouptickset_search( bl, sg->group_id));
+ diff=DIFF_TICK(tick,ts->tick);
+ goflag=(diff>sg->interval || diff<0);
+ if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // d‚È‚Á‚Ä‚¢‚½‚ç3HIT‚µ‚È‚¢
+ goflag = (diff>sg->interval*map_count_oncell(bl->m,bl->x,bl->y) || diff<0);
+
+ //?Û‚ªLPã‚É‹‚éꇂ͖³?
+ map_foreachinarea(skill_landprotector,bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,0,&goflag);
+
+ if(!goflag)
+ return 0;
+ ts->tick=tick;
+ ts->group_id=sg->group_id;
+
+ switch(sg->unit_id){
+ case 0x83: /* ƒTƒ“ƒNƒ`ƒ…ƒAƒŠ */
+ {
+ int race=battle_get_race(bl);
+ int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0;
+
+ if( battle_get_hp(bl)>=battle_get_max_hp(bl) && !damage_flag)
+ break;
+
+ if((sg->val1--)<=0){
+ skill_delunitgroup(sg);
+ return 0;
+ }
+ if(!damage_flag) {
+ int heal=sg->val2;
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage)
+ heal=0; /* ?‹à峃J?ƒhiƒq?ƒ‹—Ê‚Oj */
+ clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1);
+ battle_heal(NULL,bl,heal,0,0);
+ }
+ else
+ skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ }
+ break;
+
+ case 0x84: /* ƒ}ƒOƒkƒXƒGƒNƒ\ƒVƒYƒ€ */
+ {
+ int race=battle_get_race(bl);
+ int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0;
+
+ if(!damage_flag)
+ return 0;
+ skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ }
+ break;
+
+ case 0x85: /* ƒjƒ…?ƒ} */
+ {
+ struct skill_unit *unit2;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SC_PNEUMA;
+ if(sc_data && sc_data[type].timer==-1)
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
+ else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
+ if(DIFF_TICK(sg->tick,unit2->group->tick)>0 )
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
+ ts->tick-=sg->interval;
+ }
+ }
+ break;
+ case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ {
+ struct skill_unit *unit2;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SC_SAFETYWALL;
+ if(sc_data && sc_data[type].timer==-1)
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
+ else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
+ if(sg->val1 < unit2->group->val1 )
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0);
+ ts->tick-=sg->interval;
+ }
+ }
+ break;
+
+ case 0x86: /* ƒ?ƒhƒIƒuƒ”ƒ@?ƒ~ƒŠƒIƒ“(•ƒXƒg?ƒ€ƒKƒXƒg •ƒOƒ‰ƒ“ƒhƒNƒƒX) */
+ skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ break;
+
+ case 0x7f: /* ƒtƒ@ƒCƒ„?ƒEƒH?ƒ‹ */
+ if( (src->val2--)>0)
+ skill_attack(BF_MAGIC,ss,&src->bl,bl,
+ sg->skill_id,sg->skill_lv,tick,0);
+ if( src->val2<=0 )
+ skill_delunit(src);
+ break;
+
+ case 0x87: /* ƒtƒ@ƒCƒA?ƒsƒ‰?(?“®‘O) */
+ skill_delunit(src);
+ skill_unitsetting(ss,sg->skill_id,sg->skill_lv,src->bl.x,src->bl.y,1);
+ break;
+
+ case 0x88: /* ƒtƒ@ƒCƒA?ƒsƒ‰?(?“®Œã) */
+ if(DIFF_TICK(tick,sg->tick) < 150)
+ //skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ map_foreachinarea(skill_attack_area,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,BF_MAGIC,ss,&src->bl,sg->skill_id,sg->skill_lv,tick,0,BCT_ENEMY); // area damage [Celest]
+ break;
+
+ case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ {
+ int i,c = skill_get_blewcount(sg->skill_id,sg->skill_lv);
+ if(map[bl->m].flag.gvg) c = 0;
+ for(i=0;i<c;i++)
+ skill_blown(&src->bl,bl,1|0x30000);
+ sg->unit_id = 0x8c;
+ clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1500;
+ }
+ break;
+
+ case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ skill_attack(BF_MISC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ sg->unit_id = 0x8c;
+ clif_changelook(&src->bl,LOOK_BASE,0x88);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1500;
+ break;
+
+ case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ map_foreachinarea(skill_count_target,src->bl.m
+ ,src->bl.x-src->range,src->bl.y-src->range
+ ,src->bl.x+src->range,src->bl.y+src->range
+ ,0,&src->bl,&splash_count);
+ map_foreachinarea(skill_trap_splash,src->bl.m
+ ,src->bl.x-src->range,src->bl.y-src->range
+ ,src->bl.x+src->range,src->bl.y+src->range
+ ,0,&src->bl,tick,splash_count);
+ sg->unit_id = 0x8c;
+ clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1500;
+ break;
+
+ case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){
+ int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
+ int sec=skill_get_time2(sg->skill_id,sg->skill_lv) - (double)battle_get_agi(bl)*0.1;
+ if(battle_get_mode(bl)&0x20)
+ sec = sec/5;
+ battle_stopwalking(bl,1);
+ skill_status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0);
+
+ if(moveblock) map_delblock(bl);
+ bl->x = src->bl.x;
+ bl->y = src->bl.y;
+ if(moveblock) map_addblock(bl);
+ if(bl->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)bl);
+ else if(bl->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)bl);
+ else
+ clif_fixpos(bl);
+ clif_01ac(&src->bl);
+ sg->limit=DIFF_TICK(tick,sg->tick) + sec;
+ sg->val2=bl->id;
+ }
+ }
+ break;
+
+ case 0x80: /* ƒ?ƒvƒ|?ƒ^ƒ‹(?“®Œã) */
+ if(bl->type==BL_PC){
+ struct map_session_data *sd = (struct map_session_data *)bl;
+ if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y && src->bl.x == sd->to_x && src->bl.y == sd->to_y) {
+ if( battle_config.chat_warpportal || !sd->chatID ){
+ if((sg->val1--)>0){
+ pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3);
+ if(sg->src_id == bl->id ||( strcmp(map[src->bl.m].name,sg->valstr) == 0 && src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) ))
+ skill_delunitgroup(sg);
+ }else
+ skill_delunitgroup(sg);
+ }
+ }
+ }else if(bl->type==BL_MOB && battle_config.mob_warpportal){
+ int m=map_mapname2mapid(sg->valstr);
+ struct mob_data *md;
+ md=(struct mob_data *)bl;
+ mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3);
+ }
+ break;
+
+ case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ {
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ break;
+ if( battle_get_sc_data(bl)[type].timer==-1 )
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ }
+ break;
+ case 0x92: /* ƒxƒmƒ€ƒ_ƒXƒg */
+ {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if( sc_data && sc_data[type].timer==-1 )
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ }
+ break;
+ case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
+ case 0x9b: /* ƒfƒŠƒ…?ƒW */
+ case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ {
+ struct skill_unit *unit2;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if(sc_data && sc_data[type].timer==-1)
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){
+ if( DIFF_TICK(sg->tick,unit2->group->tick)>0 )
+ skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ ts->tick-=sg->interval;
+ }
+ } break;
+
+ case 0x9e: /* ŽqŽç‰S */
+ case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case 0xa0: /* ‰i‰“‚̬“× */
+ case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
+ case 0xa4: /* [•£‚Ì’†‚É */
+ case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case 0xa6: /* •s‹¦˜a‰¹ */
+ case 0xa7: /* Œû“J */
+ case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
+ case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case 0xac: /* ƒnƒ~ƒ“ƒO */
+ case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case 0xae: /* K‰^‚̃LƒX */
+ case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case 0xb4:
+ case 0xb6: /* ƒtƒHƒOƒEƒH?ƒ‹ */
+ {
+ struct skill_unit *unit2;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if(sg->src_id == bl->id)
+ break;
+ if(sc_data && sc_data[type].timer==-1)
+ skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
+ (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ else if( (unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){
+ if( unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 )
+ skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2,
+ (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ ts->tick-=sg->interval;
+ }
+ } break;
+
+ case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ {
+ struct skill_unit *unit2;
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if(sg->src_id == bl->id)
+ break;
+ if( sc_data && sc_data[type].timer==-1)
+ skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff,
+ (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){
+ if( DIFF_TICK(sg->tick,unit2->group->tick)>0 )
+ skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff,
+ (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0);
+ ts->tick-=sg->interval;
+ }
+ } break;
+
+ case 0xb1: /* ƒfƒ‚ƒ“ƒXƒgƒŒ?ƒVƒ‡ƒ“ */
+ skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ if(bl->type == BL_PC && rand()%100 < sg->skill_lv && battle_config.equipment_breaking)
+ pc_breakweapon((struct map_session_data *)bl);
+ break;
+ case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ if(sg->src_id == bl->id) //Ž©•ª‚ª“¥‚ñ‚Å‚à?“®‚µ‚È‚¢
+ break;
+ if(sg->val2==0){
+ clif_talkiebox(&src->bl,sg->valstr);
+ sg->unit_id = 0x8c;
+ clif_changelook(&src->bl,LOOK_BASE,sg->unit_id);
+ sg->limit=DIFF_TICK(tick,sg->tick)+5000;
+ sg->val2=-1; //“¥‚ñ‚¾
+ }
+ break;
+ case 0xb2: /* ‚ ‚È‚½‚ð_?‚¢‚½‚¢‚Å‚· */
+ case 0xb3: /* ƒSƒXƒyƒ‹ */
+ //case 0xb6: /* ƒtƒHƒOƒEƒH?ƒ‹ */ - moved [celest]
+ //‚Æ‚è‚ ‚¦‚¸‰½‚à‚µ‚È‚¢
+ break;
+
+ case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ if(sg->val2==0){
+ int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE);
+ skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
+ if(moveblock) map_delblock(bl);
+ bl->x = (&src->bl)->x;
+ bl->y = (&src->bl)->y;
+ if(moveblock) map_addblock(bl);
+ if(bl->type == BL_MOB)
+ clif_fixmobpos((struct mob_data *)bl);
+ else if(bl->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)bl);
+ else
+ clif_fixpos(bl);
+ clif_01ac(&src->bl);
+ sg->limit=DIFF_TICK(tick,sg->tick) + skill_get_time2(sg->skill_id,sg->skill_lv);
+ sg->val2=bl->id;
+ }
+ break;
+
+/* default:
+ if(battle_config.error_log)
+ printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
+ break;*/
+ }
+ if(bl->type==BL_MOB && ss!=bl) /* ƒXƒLƒ‹Žg—p?Œ‚ÌMOBƒXƒLƒ‹ */
+ {
+ if(battle_config.mob_changetarget_byskill == 1)
+ {
+ int target=((struct mob_data *)bl)->target_id;
+ if(ss->type == BL_PC)
+ ((struct mob_data *)bl)->target_id=ss->id;
+ mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
+ ((struct mob_data *)bl)->target_id=target;
+ }
+ else
+ mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16));
+ }
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚©‚ç—£?‚·‚é(‚à‚µ‚­‚Í‚µ‚Ä‚¢‚é)ê‡
+ *------------------------------------------
+ */
+int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int tick)
+{
+ struct skill_unit_group *sg;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, bl);
+ nullpo_retr(0, sg=src->group);
+
+ if( bl->prev==NULL || !src->alive )
+ return 0;
+
+ if( bl->type!=BL_PC && bl->type!=BL_MOB )
+ return 0;
+
+ switch(sg->unit_id){
+ case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ case 0x85: /* ƒjƒ…?ƒ} */
+ case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ int type=
+ (sg->unit_id==0x85)?SC_PNEUMA:
+ ((sg->unit_id==0x7e)?SC_SAFETYWALL:
+ SC_QUAGMIRE);
+ if((type != SC_QUAGMIRE || bl->type != BL_MOB) &&
+ sc_data && sc_data[type].timer!=-1 && ((struct skill_unit *)sc_data[type].val2)==src){
+ skill_status_change_end(bl,type,-1);
+ }
+ } break;
+
+ case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ {
+ struct block_list *target=map_id2bl(sg->val2);
+ if( target && target==bl ){
+ skill_status_change_end(bl,SC_ANKLE,-1);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1000;
+ }
+ }
+ break;
+ case 0xb5:
+ case 0xb8:
+ {
+ struct block_list *target=map_id2bl(sg->val2);
+ if( target==bl )
+ skill_status_change_end(bl,SC_SPIDERWEB,-1);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1000;
+ }
+ break;
+ case 0xb6:
+ {
+ struct block_list *target=map_id2bl(sg->val2);
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ if( target==bl ) {
+ skill_status_change_end(bl,SC_FOGWALL,-1);
+ if (sc_data && sc_data[SC_BLIND].timer!=-1)
+ sc_data[SC_BLIND].timer = add_timer(
+ gettick() + 30000, skill_status_change_timer, bl->id, 0);
+ }
+ sg->limit=DIFF_TICK(tick,sg->tick)+1000;
+ }
+ break;
+ case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
+ case 0x9b: /* ƒfƒŠƒ…?ƒW */
+ case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ struct skill_unit *su;
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val2)) && su == src ){
+ skill_status_change_end(bl,type,-1);
+ }
+ }
+ break;
+
+ case 0x9e: /* ŽqŽç‰S */
+ case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case 0xa0: /* ‰i‰“‚̬“× */
+ case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
+ case 0xa4: /* [•£‚Ì’†‚É */
+ case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case 0xa6: /* •s‹¦˜a‰¹ */
+ case 0xa7: /* Œû“J */
+ case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
+ case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case 0xac: /* ƒnƒ~ƒ“ƒO */
+ case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case 0xae: /* K‰^‚̃LƒX */
+ case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case 0xb4:
+ {
+ struct status_change *sc_data=battle_get_sc_data(bl);
+ struct skill_unit *su;
+ int type=SkillStatusChangeTable[sg->skill_id];
+ if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val4)) && su == src ){
+ skill_status_change_end(bl,type,-1);
+ }
+ }
+ break;
+ case 0xb7: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ {
+ struct block_list *target=map_id2bl(sg->val2);
+ if( target && target==bl )
+ skill_status_change_end(bl,SC_SPIDERWEB,-1);
+ sg->limit=DIFF_TICK(tick,sg->tick)+1000;
+ }
+ break;
+
+/* default:
+ if(battle_config.error_log)
+ printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
+ break;*/
+ }
+ skill_unitgrouptickset_delete(bl,sg->group_id);
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Ì휃Cƒxƒ“ƒg
+ *------------------------------------------
+ */
+int skill_unit_ondelete(struct skill_unit *src,struct block_list *bl,unsigned int tick)
+{
+ struct skill_unit_group *sg;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, bl);
+ nullpo_retr(0, sg = src->group);
+
+ if( bl->prev==NULL || !src->alive )
+ return 0;
+
+ if( bl->type!=BL_PC && bl->type!=BL_MOB )
+ return 0;
+
+ switch(sg->unit_id){
+ case 0x85: /* ƒjƒ…?ƒ} */
+ case 0x7e: /* ƒZƒCƒtƒeƒBƒEƒH?ƒ‹ */
+ case 0x8e: /* ƒNƒ@ƒOƒ}ƒCƒ„ */
+ case 0x9a: /* ƒ{ƒ‹ƒP?ƒm */
+ case 0x9b: /* ƒfƒŠƒ…?ƒW */
+ case 0x9c: /* ƒoƒCƒIƒŒƒ“ƒgƒQƒCƒ‹ */
+ case 0x9e: /* ŽqŽç‰S */
+ case 0x9f: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case 0xa0: /* ‰i‰“‚̬“× */
+ case 0xa1: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case 0xa2: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case 0xa3: /* ƒƒL‚Ì‹©‚Ñ */
+ case 0xa4: /* [•£‚Ì’†‚É */
+ case 0xa5: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case 0xa6: /* •s‹¦˜a‰¹ */
+ case 0xa7: /* Œû“J */
+ case 0xa8: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case 0xa9: /* ƒuƒ‰ƒM‚ÌŽ */
+ case 0xaa: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case 0xab: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case 0xac: /* ƒnƒ~ƒ“ƒO */
+ case 0xad: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case 0xae: /* K‰^‚̃LƒX */
+ case 0xaf: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case 0xb4:
+ return skill_unit_onout(src,bl,tick);
+
+/* default:
+ if(battle_config.error_log)
+ printf("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id);
+ break;*/
+ }
+ skill_unitgrouptickset_delete(bl,sg->group_id);
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚ÌŒÀŠEƒCƒxƒ“ƒg
+ *------------------------------------------
+ */
+int skill_unit_onlimit(struct skill_unit *src,unsigned int tick)
+{
+ struct skill_unit_group *sg;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, sg=src->group);
+
+ switch(sg->unit_id){
+ case 0x81: /* ƒ?ƒvƒ|?ƒ^ƒ‹(?“®‘O) */
+ {
+ struct skill_unit_group *group=
+ skill_unitsetting(map_id2bl(sg->src_id),sg->skill_id,sg->skill_lv,
+ src->bl.x,src->bl.y,1);
+ if(group == NULL)
+ return 0;
+ group->valstr=calloc(24, 1);
+ if(group->valstr==NULL){
+ printf("skill_unit_onlimit: out of memory !\n");
+ exit(1);
+ }
+ memcpy(group->valstr,sg->valstr,24);
+ group->val2=sg->val2;
+ }
+ break;
+
+ case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ map_setcell(src->bl.m,src->bl.x,src->bl.y,src->val2);
+ clif_changemapcell(src->bl.m,src->bl.x,src->bl.y,src->val2,1);
+ break;
+ case 0xb2: /* ‚ ‚È‚½‚É?‚¢‚½‚¢ */
+ {
+ struct map_session_data *sd = NULL;
+ struct map_session_data *p_sd = NULL;
+ if((sd = (struct map_session_data *)(map_id2bl(sg->src_id))) == NULL)
+ return 0;
+ if((p_sd = pc_get_partner(sd)) == NULL)
+ return 0;
+
+ pc_setpos(p_sd,map[src->bl.m].name,src->bl.x,src->bl.y,3);
+ }
+ break;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‚̃_ƒ?ƒWƒCƒxƒ“ƒg
+ *------------------------------------------
+ */
+int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl,
+ int damage,unsigned int tick)
+{
+ struct skill_unit_group *sg;
+
+ nullpo_retr(0, src);
+ nullpo_retr(0, sg=src->group);
+
+ switch(sg->unit_id){
+ case 0x8d: /* ƒAƒCƒXƒEƒH?ƒ‹ */
+ src->val1-=damage;
+ break;
+ case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ skill_blown(bl,&src->bl,2); //‚«”ò‚΂µ‚Ä‚Ý‚é
+ break;
+ default:
+ damage = 0;
+ break;
+ }
+ return damage;
+}
+
+
+/*---------------------------------------------------------------------------- */
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—pi‰r¥Š®—¹Aꊎw’èj
+ *------------------------------------------
+ */
+int skill_castend_pos( int tid, unsigned int tick, int id,int data )
+{
+ struct map_session_data* sd=map_id2sd(id)/*,*target_sd=NULL*/;
+ int range,maxcount;
+
+ nullpo_retr(0, sd);
+
+ if( sd->bl.prev == NULL )
+ return 0;
+ if( sd->skilltimer != tid ) /* ƒ^ƒCƒ}ID‚ÌŠm”F */
+ return 0;
+ if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) {
+ sd->speed = sd->prev_speed;
+ clif_updatestatus(sd,SP_SPEED);
+ }
+ sd->skilltimer=-1;
+ if(pc_isdead(sd)) {
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+
+ if(battle_config.pc_skill_reiteration == 0) {
+ range = -1;
+ switch(sd->skillid) {
+ case MG_SAFETYWALL:
+ case WZ_FIREPILLAR:
+ case HT_SKIDTRAP:
+ case HT_LANDMINE:
+ case HT_ANKLESNARE:
+ case HT_SHOCKWAVE:
+ case HT_SANDMAN:
+ case HT_FLASHER:
+ case HT_FREEZINGTRAP:
+ case HT_BLASTMINE:
+ case HT_CLAYMORETRAP:
+ case HT_TALKIEBOX:
+ case AL_WARP:
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case RG_GRAFFITI: /* ƒOƒ‰ƒtƒBƒeƒB */
+ range = 0;
+ break;
+ case AL_PNEUMA:
+ range = 1;
+ break;
+ }
+ if(range >= 0) {
+ if(skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,range,sd->skillid) > 0) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ }
+ if(battle_config.pc_skill_nofootset) {
+ range = -1;
+ switch(sd->skillid) {
+ case WZ_FIREPILLAR:
+ case HT_SKIDTRAP:
+ case HT_LANDMINE:
+ case HT_ANKLESNARE:
+ case HT_SHOCKWAVE:
+ case HT_SANDMAN:
+ case HT_FLASHER:
+ case HT_FREEZINGTRAP:
+ case HT_BLASTMINE:
+ case HT_CLAYMORETRAP:
+ case HT_TALKIEBOX:
+ case PF_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case WZ_ICEWALL:
+ range = 1;
+ break;
+ case AL_WARP:
+ range = 0;
+ break;
+ }
+ if(range >= 0) {
+ if(skill_check_unit_range2(sd->bl.m,sd->skillx,sd->skilly,range) > 0) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ }
+
+ if(battle_config.pc_land_skill_limit) {
+ maxcount = skill_get_maxcount(sd->skillid);
+ if(maxcount > 0) {
+ int i,c;
+ for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
+ if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid)
+ c++;
+ }
+ if(c >= maxcount) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ }
+
+ if(sd->skilllv <= 0) return 0;
+ range = skill_get_range(sd->skillid,sd->skilllv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ range += battle_config.pc_skill_add_range;
+ if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris]
+ if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ }
+ if(!skill_check_condition(sd,1)) { /* Žg—p?Œƒ`ƒFƒbƒN */
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ sd->skillitem = sd->skillitemlv = -1;
+ if(battle_config.skill_out_range_consume) {
+ if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->canact_tick = tick;
+ sd->canmove_tick = tick;
+ return 0;
+ }
+ }
+
+ if(battle_config.pc_skill_log)
+ printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid);
+ pc_stop_walking(sd,0);
+
+ skill_castend_pos2(&sd->bl,sd->skillx,sd->skilly,sd->skillid,sd->skilllv,tick,0);
+
+ return 0;
+}
+
+/*==========================================
+ * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’è?—(foreachinarea)
+ *------------------------------------------
+ */
+
+static int skill_check_condition_char_sub(struct block_list *bl,va_list ap)
+{
+ int *c;
+ struct block_list *src;
+ struct map_session_data *sd;
+ struct map_session_data *ssd;
+ struct pc_base_job s_class;
+ struct pc_base_job ss_class;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=(struct map_session_data*)bl);
+ nullpo_retr(0, src=va_arg(ap,struct block_list *));
+ nullpo_retr(0, c=va_arg(ap,int *));
+ nullpo_retr(0, ssd=(struct map_session_data*)src);
+
+ s_class = pc_calc_base_job(sd->status.class);
+ //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
+ if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
+ (*c)=99;
+ return 0;
+ }
+
+ ;
+ ss_class = pc_calc_base_job(ssd->status.class);
+
+ switch(ssd->skillid){
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 ||
+ sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) &&
+ (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10)
+ (*c)++;
+ break;
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BD_RAGNAROK: /* _?‚Ì?¨ */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ if(sd != ssd &&
+ ((ssd->status.class==19 && sd->status.class==20) ||
+ (ssd->status.class==20 && sd->status.class==19) ||
+ (ssd->status.class==4020 && sd->status.class==4021) ||
+ (ssd->status.class==4021 && sd->status.class==4020) ||
+ (ssd->status.class==20 && sd->status.class==4020) ||
+ (ssd->status.class==19 && sd->status.class==4021)) &&
+ pc_checkskill(sd,ssd->skillid) > 0 &&
+ (*c)==0 &&
+ sd->status.party_id == ssd->status.party_id &&
+ !pc_issit(sd) &&
+ sd->sc_data[SC_DANCING].timer==-1
+ )
+ (*c)=pc_checkskill(sd,ssd->skillid);
+ break;
+ }
+ return 0;
+}
+/*==========================================
+ * ”Í??ƒLƒƒƒ‰‘¶ÝŠm”F”»’èŒãƒXƒLƒ‹Žg—p?—(foreachinarea)
+ *------------------------------------------
+ */
+
+static int skill_check_condition_use_sub(struct block_list *bl,va_list ap)
+{
+ int *c;
+ struct block_list *src;
+ struct map_session_data *sd;
+ struct map_session_data *ssd;
+ struct pc_base_job s_class;
+ struct pc_base_job ss_class;
+ int skillid,skilllv;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, sd=(struct map_session_data*)bl);
+ nullpo_retr(0, src=va_arg(ap,struct block_list *));
+ nullpo_retr(0, c=va_arg(ap,int *));
+ nullpo_retr(0, ssd=(struct map_session_data*)src);
+
+ s_class = pc_calc_base_job(sd->status.class);
+
+ //ƒ`ƒFƒbƒN‚µ‚È‚¢Ý’è‚È‚çc‚É‚ ‚肦‚È‚¢‘å‚«‚È?Žš‚ð•Ô‚µ‚ÄI—¹
+ if(!battle_config.player_skill_partner_check){ //–{?‚Íforeach‚Ì‘O‚É‚â‚肽‚¢‚¯‚ÇÝ’è“K—p‰ÓŠ‚ð‚܂Ƃ߂邽‚ß‚É‚±‚±‚Ö
+ (*c)=99;
+ return 0;
+ }
+
+ ss_class = pc_calc_base_job(ssd->status.class);
+ skillid=ssd->skillid;
+ skilllv=ssd->skilllv;
+ if(skilllv <= 0) return 0;
+ switch(skillid){
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 ||
+ sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) &&
+ (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10){
+ sd->status.sp -= 10;
+ pc_calcstatus(sd,0);
+ (*c)++;
+ }
+ break;
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BD_RAGNAROK: /* _?‚Ì?¨ */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ if(sd != ssd && //–{lˆÈŠO‚Å
+ ((ssd->status.class==19 && sd->status.class==20) ||
+ (ssd->status.class==20 && sd->status.class==19) ||
+ (ssd->status.class==4020 && sd->status.class==4021) ||
+ (ssd->status.class==4021 && sd->status.class==4020) ||
+ (ssd->status.class==20 && sd->status.class==4020) ||
+ (ssd->status.class==19 && sd->status.class==4021)) && //Ž©•ª‚ªƒ_ƒ“ƒT?‚È‚çƒo?ƒh‚Å
+ pc_checkskill(sd,skillid) > 0 && //ƒXƒLƒ‹‚ðŽ‚Á‚Ä‚¢‚Ä
+ (*c)==0 && //ʼn‚̈êl‚Å
+ sd->status.party_id == ssd->status.party_id && //ƒp?ƒeƒB?‚ª“¯‚¶‚Å
+ !pc_issit(sd) && //À‚Á‚Ä‚È‚¢
+ sd->sc_data[SC_DANCING].timer==-1 //ƒ_ƒ“ƒX’†‚¶‚á‚È‚¢
+ ){
+ ssd->sc_data[SC_DANCING].val4=bl->id;
+ clif_skill_nodamage(bl,src,skillid,skilllv,1);
+ skill_status_change_start(bl,SC_DANCING,skillid,ssd->sc_data[SC_DANCING].val2,0,src->id,skill_get_time(skillid,skilllv)+1000,0);
+ sd->skillid_dance=sd->skillid=skillid;
+ sd->skilllv_dance=sd->skilllv=skilllv;
+ (*c)++;
+ }
+ break;
+ }
+ return 0;
+}
+/*==========================================
+ * ”Í??ƒoƒCƒIƒvƒ‰ƒ“ƒgAƒXƒtƒBƒAƒ}ƒCƒ“—pMob‘¶ÝŠm”F”»’è?—(foreachinarea)
+ *------------------------------------------
+ */
+
+static int skill_check_condition_mob_master_sub(struct block_list *bl,va_list ap)
+{
+ int *c,src_id=0,mob_class=0;
+ struct mob_data *md;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, md=(struct mob_data*)bl);
+ nullpo_retr(0, src_id=va_arg(ap,int));
+ nullpo_retr(0, mob_class=va_arg(ap,int));
+ nullpo_retr(0, c=va_arg(ap,int *));
+
+ if(md->class==mob_class && md->master_id==src_id)
+ (*c)++;
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—p?Œi?‚ÅŽg—pŽ¸”sj
+ *------------------------------------------
+ */
+int skill_check_condition(struct map_session_data *sd,int type)
+{
+ int i,hp,sp,hp_rate,sp_rate,zeny,weapon,state,spiritball,skill,lv,mhp;
+ int index[10],itemid[10],amount[10];
+
+ nullpo_retr(0, sd);
+
+ if( battle_config.gm_skilluncond>0 && pc_isGM(sd)>= battle_config.gm_skilluncond ) {
+ sd->skillitem = sd->skillitemlv = -1;
+ return 1;
+ }
+
+ if( sd->opt1>0) {
+ clif_skill_fail(sd,sd->skillid,0,0);
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ if(pc_is90overweight(sd)) {
+ clif_skill_fail(sd,sd->skillid,9,0);
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+
+ if(sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1) {
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+ if(sd->skillid == AM_PHARMACY && sd->state.produce_flag == 1) {
+ sd->skillitem = sd->skillitemlv = -1;
+ return 0;
+ }
+
+ if(sd->skillitem == sd->skillid) { /* ƒAƒCƒeƒ€‚Ìꇖ³?Œ¬Œ÷ */
+ if(type&1)
+ sd->skillitem = sd->skillitemlv = -1;
+ return 1;
+ }
+ if( sd->opt1>0 ){
+ clif_skill_fail(sd,sd->skillid,0,0);
+ return 0;
+ }
+ if(sd->sc_data){
+ if( sd->sc_data[SC_DIVINA].timer!=-1 ||
+ sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
+ (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
+ sd->sc_data[SC_STEELBODY].timer != -1 ||
+ sd->sc_data[SC_BERSERK].timer != -1 ||
+ (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
+ clif_skill_fail(sd,sd->skillid,0,0);
+ return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
+ }
+ }
+ skill = sd->skillid;
+ lv = sd->skilllv;
+ if(lv <= 0) return 0;
+ hp=skill_get_hp(skill, lv); /* Á”ïHP */
+ sp=skill_get_sp(skill, lv); /* Á”ïSP */
+ if((sd->skillid_old == BD_ENCORE) && skill==sd->skillid_dance)
+ sp=sp/2; //ƒAƒ“ƒR?ƒ‹Žž‚ÍSPÁ””¼•ª
+ hp_rate = (lv <= 0)? 0:skill_db[skill].hp_rate[lv-1];
+ sp_rate = (lv <= 0)? 0:skill_db[skill].sp_rate[lv-1];
+ zeny = skill_get_zeny(skill,lv);
+ weapon = skill_db[skill].weapon;
+ state = skill_db[skill].state;
+ spiritball = (lv <= 0)? 0:skill_db[skill].spiritball[lv-1];
+ mhp=skill_get_mhp(skill, lv); /* Á”ïHP */
+ for(i=0;i<10;i++) {
+ itemid[i] = skill_db[skill].itemid[i];
+ amount[i] = skill_db[skill].amount[i];
+ }
+ if(mhp > 0)
+ hp += (sd->status.max_hp * mhp)/100;
+ if(hp_rate > 0)
+ hp += (sd->status.hp * hp_rate)/100;
+ else
+ hp += (sd->status.max_hp * abs(hp_rate))/100;
+ if(sp_rate > 0)
+ sp += (sd->status.sp * sp_rate)/100;
+ else
+ sp += (sd->status.max_sp * abs(sp_rate))/100;
+ if(sd->dsprate!=100)
+ sp=sp*sd->dsprate/100; /* Á”ïSPC³ */
+
+ switch(skill) {
+ case SA_CASTCANCEL:
+ if(sd->skilltimer == -1) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case BS_MAXIMIZE: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
+ case NV_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
+ case TF_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
+ case AS_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
+ case CR_AUTOGUARD: /* ƒI?ƒgƒK?ƒh */
+ case CR_DEFENDER: /* ƒfƒBƒtƒFƒ“ƒ_? */
+ case ST_CHASEWALK:
+ if(sd->sc_data[SkillStatusChangeTable[skill]].timer!=-1)
+ return 1; /* ‰ðœ‚·‚éꇂÍSPÁ”‚È‚¢ */
+ break;
+ case AL_TELEPORT:
+ case AL_WARP:
+ if(map[sd->bl.m].flag.noteleport) {
+ clif_skill_teleportmessage(sd,0);
+ return 0;
+ }
+ break;
+ case MO_CALLSPIRITS: /* ?Œ÷ */
+ if(sd->spiritball >= lv) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case CH_SOULCOLLECT: /* ‹¶?Œ÷ */
+ if(sd->spiritball >= 5) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case MO_FINGEROFFENSIVE: //Žw?
+ if (sd->spiritball > 0 && sd->spiritball < spiritball) {
+ spiritball = sd->spiritball;
+ sd->spiritball_old = sd->spiritball;
+ }
+ else sd->spiritball_old = lv;
+ break;
+ case MO_CHAINCOMBO: //˜A‘Ŷ
+ if(sd->sc_data[SC_BLADESTOP].timer==-1){
+ if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK)
+ return 0;
+ }
+ break;
+ case MO_COMBOFINISH: //–Ò—´Œ
+ if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO)
+ return 0;
+ break;
+ case CH_TIGERFIST: //•šŒÕŒ
+ if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH)
+ return 0;
+ break;
+ case CH_CHAINCRUSH: //˜A’Œ•ö?
+ if(sd->sc_data[SC_COMBO].timer == -1)
+ return 0;
+ if(sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST)
+ return 0;
+ break;
+ case MO_EXTREMITYFIST: // ˆ¢C—…”e–PŒ
+ if((sd->sc_data[SC_COMBO].timer != -1 && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) || sd->sc_data[SC_BLADESTOP].timer!=-1)
+ spiritball--;
+ break;
+ case BD_ADAPTATION: /* ƒAƒhƒŠƒu */
+ {
+ struct skill_unit_group *group=NULL;
+ if(sd->sc_data[SC_DANCING].timer==-1 || ((group=(struct skill_unit_group*)sd->sc_data[SC_DANCING].val2) && (skill_get_time(sd->sc_data[SC_DANCING].val1,group->skill_lv) - sd->sc_data[SC_DANCING].val3*1000) <= skill_get_time2(skill,lv))){ //ƒ_ƒ“ƒX’†‚ÅŽg—pŒã5•bˆÈã‚Ì‚ÝH
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }
+ break;
+ case PR_BENEDICTIO: /* ¹?~•Ÿ */
+ {
+ int range=1;
+ int c=0;
+ if(!(type&1)){
+ map_foreachinarea(skill_check_condition_char_sub,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
+ if(c<2){
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }else{
+ map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
+ }
+ }
+ break;
+ case WE_CALLPARTNER: /* ‚ ‚È‚½‚Ɉ§‚¢‚½‚¢ */
+ if(!sd->status.partner_id){
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case AM_CANNIBALIZE: /* ƒoƒCƒIƒvƒ‰ƒ“ƒg */
+ case AM_SPHEREMINE: /* ƒXƒtƒBƒA?ƒ}ƒCƒ“ */
+ if(type&1){
+ int c=0;
+ int maxcount=skill_get_maxcount(skill);
+ int mob_class=(skill==AM_CANNIBALIZE)?1118:1142;
+ if(battle_config.pc_land_skill_limit && maxcount>0) {
+ map_foreachinarea(skill_check_condition_mob_master_sub ,sd->bl.m, 0, 0, map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB, sd->bl.id, mob_class,&c );
+ if(c >= maxcount){
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }
+ }
+ break;
+ case MG_FIREWALL: /* ƒtƒ@ƒCƒA?ƒEƒH?ƒ‹ */
+ case WZ_QUAGMIRE:
+ case WZ_FIREPILLAR: // celest
+ case PF_FOGWALL:
+ /* ?§ŒÀ */
+ if(battle_config.pc_land_skill_limit) {
+ int maxcount = skill_get_maxcount(skill);
+ if(maxcount > 0) {
+ int i,c;
+ for(i=c=0;i<MAX_SKILLUNITGROUP;i++) {
+ if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == skill)
+ c++;
+ }
+ if(c >= maxcount) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }
+ }
+ break;
+ }
+
+ if(!(type&2)){
+ if( hp>0 && sd->status.hp < hp) { /* HPƒ`ƒFƒbƒN */
+ clif_skill_fail(sd,skill,2,0); /* HP•s‘«FŽ¸”s’Ê’m */
+ return 0;
+ }
+ if( sp>0 && sd->status.sp < sp) { /* SPƒ`ƒFƒbƒN */
+ clif_skill_fail(sd,skill,1,0); /* SP•s‘«FŽ¸”s’Ê’m */
+ return 0;
+ }
+ if( zeny>0 && sd->status.zeny < zeny) {
+ clif_skill_fail(sd,skill,5,0);
+ return 0;
+ }
+ if(!(weapon & (1<<sd->status.weapon) ) ) {
+ clif_skill_fail(sd,skill,6,0);
+ return 0;
+ }
+ if( spiritball > 0 && sd->spiritball < spiritball) {
+ clif_skill_fail(sd,skill,0,0); // Ÿ†‹…•s‘«
+ return 0;
+ }
+ }
+
+ switch(state) {
+ case ST_HIDING:
+ if(!(sd->status.option&2)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_CLOAKING:
+ if(!(sd->status.option&4)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_HIDDEN:
+ if(!pc_ishiding(sd)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_RIDING:
+ if(!pc_isriding(sd)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_FALCON:
+ if(!pc_isfalcon(sd)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_CART:
+ if(!pc_iscarton(sd)) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_SHIELD:
+ if(sd->status.shield <= 0) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_SIGHT:
+ if(sd->sc_data[SC_SIGHT].timer == -1 && type&1) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_EXPLOSIONSPIRITS:
+ if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_RECOV_WEIGHT_RATE:
+ if(battle_config.natural_heal_weight_rate <= 100 && sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ case ST_MOVE_ENABLE:
+ {
+ struct walkpath_data wpd;
+ if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->skillx,sd->skilly,1)==-1) {
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }
+ break;
+ case ST_WATER:
+ if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y) != 3 && (sd->sc_data[SC_DELUGE].timer==-1)){ //…ê”»’è
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ break;
+ }
+
+ for(i=0;i<10;i++) {
+ int x = lv%11 - 1;
+ index[i] = -1;
+ if(itemid[i] <= 0)
+ continue;
+ if(itemid[i] >= 715 && itemid[i] <= 717 && sd->special_state.no_gemstone)
+ continue;
+ if(((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) && sd->sc_data[SC_INTOABYSS].timer != -1)
+ continue;
+ if(skill == WZ_FIREPILLAR && lv<=5)
+ continue; // no gemstones for 1-5 [Celest]
+ if(skill == AM_POTIONPITCHER && i != x)
+ continue;
+
+ index[i] = pc_search_inventory(sd,itemid[i]);
+ if(index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) {
+ if(itemid[i] == 716 || itemid[i] == 717)
+ clif_skill_fail(sd,skill,(7+(itemid[i]-716)),0);
+ else
+ clif_skill_fail(sd,skill,0,0);
+ return 0;
+ }
+ }
+
+ if(!(type&1))
+ return 1;
+
+ if(skill != AM_POTIONPITCHER) {
+ if(skill == AL_WARP && !(type&2))
+ return 1;
+ for(i=0;i<10;i++) {
+ if(index[i] >= 0)
+ pc_delitem(sd,index[i],amount[i],0); // ƒAƒCƒeƒ€Á”ï
+ }
+ }
+
+ if(type&2)
+ return 1;
+
+ if(sp > 0) { // SPÁ”ï
+ sd->status.sp-=sp;
+ clif_updatestatus(sd,SP_SP);
+ }
+ if(hp > 0) { // HPÁ”ï
+ sd->status.hp-=hp;
+ clif_updatestatus(sd,SP_HP);
+ }
+ if(zeny > 0) // ZenyÁ”ï
+ pc_payzeny(sd,zeny);
+ if(spiritball > 0) // Ÿ†‹…Á”ï
+ pc_delspiritball(sd,spiritball,0);
+
+
+ return 1;
+}
+
+/*==========================================
+ * ‰r¥ŽžŠÔŒvŽZ
+ *------------------------------------------
+ */
+int skill_castfix( struct block_list *bl, int time )
+{
+ struct map_session_data *sd;
+ struct mob_data *md; // [Valaris]
+ struct status_change *sc_data;
+ int dex;
+ int castrate=100;
+ int skill,lv,castnodex;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_MOB){ // Crash fix [Valaris]
+ md=(struct mob_data*)bl;
+ skill = md->skillid;
+ lv = md->skilllv;
+ }
+
+ else {
+ sd=(struct map_session_data*)bl;
+ skill = sd->skillid;
+ lv = sd->skilllv;
+ }
+
+ if(lv <= 0) return 0;
+
+ sc_data = battle_get_sc_data(bl);
+ dex=battle_get_dex(bl);
+
+ if (skill > MAX_SKILL_DB || skill < 0)
+ return 0;
+
+ castnodex=skill_get_castnodex(skill, lv);
+
+ if(time==0)
+ return 0;
+ if(castnodex > 0 && bl->type==BL_PC)
+ castrate=((struct map_session_data *)bl)->castrate;
+ else if (castnodex <= 0 && bl->type==BL_PC) {
+ castrate=((struct map_session_data *)bl)->castrate;
+ time=time*castrate*(battle_config.castrate_dex_scale - dex)/(battle_config.castrate_dex_scale * 100);
+ time=time*battle_config.cast_rate/100;
+ }
+
+ /* ƒTƒtƒ‰ƒMƒEƒ€ */
+ if(sc_data && sc_data[SC_SUFFRAGIUM].timer!=-1 ){
+ time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100;
+ skill_status_change_end( bl, SC_SUFFRAGIUM, -1);
+ }
+ /* ƒuƒ‰ƒM‚ÌŽ */
+ if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 )
+ time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
+ +(sc_data[SC_POEMBRAGI].val3>>16)))/100;
+
+ return (time>0)?time:0;
+}
+/*==========================================
+ * ƒfƒBƒŒƒCŒvŽZ
+ *------------------------------------------
+ */
+int skill_delayfix( struct block_list *bl, int time )
+{
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+
+ sc_data = battle_get_sc_data(bl);
+ if(time<=0)
+ return 0;
+
+ if(bl->type == BL_PC) {
+ if( battle_config.delay_dependon_dex ) /* dex‚̉e‹¿‚ðŒvŽZ‚·‚é */
+ time=time*(battle_config.castrate_dex_scale - battle_get_dex(bl))/battle_config.castrate_dex_scale;
+ time=time*battle_config.delay_rate/100;
+ }
+
+ /* ƒuƒ‰ƒM‚ÌŽ */
+ if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 )
+ time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2
+ +(sc_data[SC_POEMBRAGI].val3&0xffff)))/100;
+
+ return (time>0)?time:0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—piIDŽw’èj
+ *------------------------------------------
+ */
+int skill_use_id( struct map_session_data *sd, int target_id,
+ int skill_num, int skill_lv)
+{
+ unsigned int tick;
+ int casttime=0,delay=0,skill,range;
+ struct map_session_data* target_sd=NULL;
+ int forcecast=0;
+ struct block_list *bl;
+ struct status_change *sc_data;
+ tick=gettick();
+
+ nullpo_retr(0, sd);
+
+ if( (bl=map_id2bl(target_id)) == NULL ){
+/* if(battle_config.error_log)
+ printf("skill target not found %d\n",target_id); */
+ return 0;
+ }
+ if(sd->bl.m != bl->m || pc_isdead(sd))
+ return 0;
+
+ if(skillnotok(skill_num, sd)) // [MouseJstr]
+ return 0;
+
+ sc_data=sd->sc_data;
+
+ /* ’¾?‚âˆÙíi‚½‚¾‚µAƒOƒŠƒ€‚È‚Ç‚Ì”»’è‚ð‚·‚éj */
+ if( sd->opt1>0 )
+ return 0;
+ if(sd->sc_data){
+ if(sc_data[SC_CHASEWALK].timer != -1) return 0;
+ if(sc_data[SC_VOLCANO].timer != -1){
+ if(skill_num==WZ_ICEWALL) return 0;
+ }
+ if(sc_data[SC_ROKISWEIL].timer!=-1){
+ if(skill_num==BD_ADAPTATION) return 0;
+ }
+ if( sd->sc_data[SC_DIVINA].timer!=-1 ||
+ sd->sc_data[SC_ROKISWEIL].timer!=-1 ||
+ (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) ||
+ sd->sc_data[SC_STEELBODY].timer != -1 ||
+ sd->sc_data[SC_BERSERK].timer != -1 ||
+ (sd->sc_data[SC_MARIONETTE].timer != -1 && sd->skillid != CG_MARIONETTE)){
+ return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
+ }
+
+ if(sc_data[SC_BLADESTOP].timer != -1){
+ int lv = sc_data[SC_BLADESTOP].val1;
+ if(sc_data[SC_BLADESTOP].val2==1) return 0;//”’‰H‚³‚ꂽ‘¤‚Ȃ̂Ń_ƒ
+ if(lv==1) return 0;
+ if(lv==2 && skill_num!=MO_FINGEROFFENSIVE) return 0;
+ if(lv==3 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE) return 0;
+ if(lv==4 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO) return 0;
+ if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0;
+ }
+ }
+
+ if(sd->status.option&4 && skill_num==TF_HIDING)
+ return 0;
+ if(sd->status.option&2 && skill_num!=TF_HIDING && skill_num!=AS_GRIMTOOTH && skill_num!=RG_BACKSTAP && skill_num!=RG_RAID )
+ return 0;
+
+ if(map[sd->bl.m].flag.gvg){ //GvG‚ÅŽg—p‚Å‚«‚È‚¢ƒXƒLƒ‹
+ switch(skill_num){
+ case SM_ENDURE:
+ case AL_TELEPORT:
+ case AL_WARP:
+ case WZ_ICEWALL:
+ case TF_BACKSLIDING:
+ case LK_BERSERK:
+ case HP_BASILICA:
+ case ST_CHASEWALK:
+ return 0;
+ }
+ }
+
+ /* ‰‰‘t/ƒ_ƒ“ƒX’† */
+ if( sc_data && sc_data[SC_DANCING].timer!=-1 ){
+// if(battle_config.pc_skill_log)
+// printf("dancing! %d\n",skill_num);
+ if( sc_data[SC_DANCING].val4 && skill_num!=BD_ADAPTATION ) //‡‘t’†‚̓AƒhƒŠƒuˆÈŠO•s‰Â
+ return 0;
+ if(skill_num!=BD_ADAPTATION && skill_num!=BA_MUSICALSTRIKE && skill_num!=DC_THROWARROW){
+ return 0;
+ }
+ }
+
+ if(skill_get_inf2(skill_num)&0x200 && sd->bl.id == target_id)
+ return 0;
+ //’¼‘O‚̃XƒLƒ‹‚ª‰½‚©?‚¦‚é•K—v‚Ì‚ ‚éƒXƒLƒ‹
+ switch(skill_num){
+ case SA_CASTCANCEL:
+ if(sd->skillid != skill_num){ //ƒLƒƒƒXƒgƒLƒƒƒ“ƒZƒ‹Ž©?‚Í?‚¦‚È‚¢
+ sd->skillid_old = sd->skillid;
+ sd->skilllv_old = sd->skilllv;
+ break;
+ }
+ case BD_ENCORE: /* ƒAƒ“ƒR?ƒ‹ */
+ if(!sd->skillid_dance){ //‘O‰ñŽg—p‚µ‚½—x‚肪‚È‚¢‚Æ‚¾‚ß
+ clif_skill_fail(sd,skill_num,0,0);
+ return 0;
+ }else{
+ sd->skillid_old = skill_num;
+ }
+ break;
+ }
+
+ sd->skillid = skill_num;
+ sd->skilllv = skill_lv;
+
+ switch(skill_num){ //Ž–‘O‚ɃŒƒxƒ‹‚ª?‚í‚Á‚½‚è‚·‚éƒXƒLƒ‹
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BD_RAGNAROK: /* _?‚Ì?¨ */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ {
+ int range=1;
+ int c=0;
+ map_foreachinarea(skill_check_condition_char_sub,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
+ if(c<1){
+ clif_skill_fail(sd,skill_num,0,0);
+ return 0;
+ }else if(c==99){ //‘Š•û•s—vݒ肾‚Á‚½
+ ;
+ }else{
+ sd->skilllv=(c + skill_lv)/2;
+ }
+ }
+ break;
+ }
+
+ if(!skill_check_condition(sd,0)) return 0;
+
+ /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
+ range = skill_get_range(skill_num,skill_lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ if(!battle_check_range(&sd->bl,bl,range) )
+ return 0;
+
+ if(bl->type==BL_PC) {
+ target_sd=(struct map_session_data*)bl;
+ if(target_sd && skill_num == ALL_RESURRECTION && !pc_isdead(target_sd))
+ return 0;
+ }
+ if((skill_num != MO_CHAINCOMBO &&
+ skill_num != MO_COMBOFINISH &&
+ skill_num != MO_EXTREMITYFIST &&
+ skill_num != CH_TIGERFIST &&
+ skill_num != CH_CHAINCRUSH) ||
+ (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag) )
+ pc_stopattack(sd);
+
+ casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) );
+ if(skill_num != SA_MAGICROD)
+ delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) );
+ sd->state.skillcastcancel = skill_db[skill_num].castcancel;
+
+ switch(skill_num){ /* ‰½‚©“ÁŽê‚È?—‚ª•K—v */
+// case AL_HEAL: /* ƒq?ƒ‹ */
+// if(battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)))
+// forcecast=1; /* ƒq?ƒ‹ƒAƒ^ƒbƒN‚È‚ç‰r¥ƒGƒtƒFƒNƒg—L‚è */
+// break;
+ case ALL_RESURRECTION: /* ƒŠƒUƒŒƒNƒVƒ‡ƒ“ */
+ if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))){ /* “G‚ªƒAƒ“ƒfƒbƒh‚È‚ç */
+ forcecast=1; /* ƒ^?ƒ“ƒAƒ“ƒfƒbƒg‚Æ“¯‚¶‰r¥ŽžŠÔ */
+ casttime=skill_castfix(&sd->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) );
+ }
+ break;
+ case MO_FINGEROFFENSIVE: /* Žw? */
+ casttime += casttime * ((skill_lv > sd->spiritball)? sd->spiritball:skill_lv);
+ break;
+ case MO_CHAINCOMBO: /*˜A‘Ŷ*/
+ target_id = sd->attacktarget;
+ if( sc_data && sc_data[SC_BLADESTOP].timer!=-1 ){
+ struct block_list *tbl;
+ if((tbl=(struct block_list *)sc_data[SC_BLADESTOP].val4) == NULL) //ƒ^?ƒQƒbƒg‚ª‚¢‚È‚¢H
+ return 0;
+ target_id = tbl->id;
+ }
+ break;
+ case MO_COMBOFINISH: /*–Ò—´Œ*/
+ case CH_TIGERFIST: /* •šŒÕŒ */
+ case CH_CHAINCRUSH: /* ˜A’Œ•ö? */
+ target_id = sd->attacktarget;
+ break;
+
+// -- moonsoul (altered to allow proper usage of extremity from new champion combos)
+//
+ case MO_EXTREMITYFIST: /*ˆ¢C—…”e–PŒ*/
+ if(sc_data && sc_data[SC_COMBO].timer != -1 && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) {
+ casttime = 0;
+ target_id = sd->attacktarget;
+ }
+ forcecast=1;
+ break;
+ case SA_MAGICROD:
+ case SA_SPELLBREAKER:
+ forcecast=1;
+ break;
+ case WE_MALE:
+ case WE_FEMALE:
+ {
+ struct map_session_data *p_sd = NULL;
+ if((p_sd = pc_get_partner(sd)) == NULL)
+ return 0;
+ target_id = p_sd->bl.id;
+ //range‚ð‚à‚¤1‰ñ?¸
+ range = skill_get_range(skill_num,skill_lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ if(!battle_check_range(&sd->bl,&p_sd->bl,range) ){
+ return 0;
+ }
+ }
+ break;
+ case AS_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ {
+ struct status_change *t_sc_data = battle_get_sc_data(bl);
+ if(t_sc_data && t_sc_data[SC_POISON].timer==-1){
+ clif_skill_fail(sd,skill_num,0,10);
+ return 0;
+ }
+ }
+ break;
+ case PF_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
+ casttime = 12000;
+ break;
+
+ }
+
+ //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
+ if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){
+ casttime = casttime/2;
+ if((--sc_data[SC_MEMORIZE].val2)<=0)
+ skill_status_change_end(&sd->bl, SC_MEMORIZE, -1);
+ }
+
+ if(battle_config.pc_skill_log)
+ printf("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",sd->bl.id,target_id,skill_num,skill_lv,casttime);
+
+// if(sd->skillitem == skill_num)
+// casttime = delay = 0;
+
+ if( casttime>0 || forcecast ){ /* ‰r¥‚ª•K—v */
+ struct mob_data *md;
+ clif_skillcasting( &sd->bl,
+ sd->bl.id, target_id, 0,0, skill_num,casttime);
+
+ /* ‰r¥”½?ƒ‚ƒ“ƒXƒ^? */
+ if( bl->type==BL_MOB && (md=(struct mob_data *)bl) && mob_db[md->class].mode&0x10 &&
+ md->state.state!=MS_ATTACK && sd->invincible_timer == -1){
+ md->target_id=sd->bl.id;
+ md->state.targettype = ATTACKABLE;
+ md->min_chase=13;
+ }
+ }
+
+ if( casttime<=0 ) /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
+ sd->state.skillcastcancel=0;
+
+ sd->skilltarget = target_id;
+/* sd->cast_target_bl = bl; */
+ sd->skillx = 0;
+ sd->skilly = 0;
+ sd->canact_tick = tick + casttime + delay;
+ sd->canmove_tick = tick;
+ if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING)
+ skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
+ if(casttime > 0) {
+ sd->skilltimer = add_timer( tick+casttime, skill_castend_id, sd->bl.id, 0 );
+ if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
+ sd->prev_speed = sd->speed;
+ sd->speed = sd->speed*(175 - skill*5)/100;
+ clif_updatestatus(sd,SP_SPEED);
+ }
+ else
+ pc_stop_walking(sd,0);
+ }
+ else {
+ if(skill_num != SA_CASTCANCEL)
+ sd->skilltimer = -1;
+ skill_castend_id(sd->skilltimer,tick,sd->bl.id,0);
+ }
+
+ //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
+ //if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER)
+ // skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1); // moved
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹Žg—piꊎw’èj
+ *------------------------------------------
+ */
+int skill_use_pos( struct map_session_data *sd,
+ int skill_x, int skill_y, int skill_num, int skill_lv)
+{
+ struct block_list bl;
+ struct status_change *sc_data;
+ unsigned int tick;
+ int casttime=0,delay=0,skill,range;
+
+ nullpo_retr(0, sd);
+
+ if(pc_isdead(sd))
+ return 0;
+
+ if (skillnotok(skill_num, sd)) // [MoueJstr]
+ return 0;
+
+ if(skill_num==WZ_ICEWALL && map[sd->bl.m].flag.noicewall && !map[sd->bl.m].flag.pvp) { // noicewall flag [Valaris]
+ clif_skill_fail(sd,sd->skillid,0,0);
+ return 0;
+ }
+
+ sc_data=sd->sc_data;
+
+ if( sd->opt1>0 )
+ return 0;
+ if(sc_data){
+ if( sc_data[SC_DIVINA].timer!=-1 ||
+ sc_data[SC_ROKISWEIL].timer!=-1 ||
+ sc_data[SC_AUTOCOUNTER].timer != -1 ||
+ sc_data[SC_STEELBODY].timer != -1 ||
+ sc_data[SC_DANCING].timer!=-1 ||
+ sc_data[SC_BERSERK].timer != -1 ||
+ sd->sc_data[SC_MARIONETTE].timer != -1)
+ return 0; /* ?‘ÔˆÙí‚â’¾?‚È‚Ç */
+ }
+
+ if(sd->status.option&2)
+ return 0;
+
+ if(map[sd->bl.m].flag.gvg && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT || skill_num == AL_WARP ||
+ skill_num == WZ_ICEWALL || skill_num == TF_BACKSLIDING))
+ return 0;
+
+ sd->skillid = skill_num;
+ sd->skilllv = skill_lv;
+ if(skill_lv <= 0) return 0;
+ sd->skillx = skill_x;
+ sd->skilly = skill_y;
+ if(!skill_check_condition(sd,0)) return 0;
+
+ /* ŽË’ö‚ÆáŠQ•¨ƒ`ƒFƒbƒN */
+ bl.type = BL_NUL;
+ bl.m = sd->bl.m;
+ bl.x = skill_x;
+ bl.y = skill_y;
+ range = skill_get_range(skill_num,skill_lv);
+ if(range < 0)
+ range = battle_get_range(&sd->bl) - (range + 1);
+ if(!battle_check_range(&sd->bl,&bl,range) )
+ return 0;
+
+ pc_stopattack(sd);
+
+ casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) );
+ delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) );
+ sd->state.skillcastcancel = skill_db[skill_num].castcancel;
+
+ if(battle_config.pc_skill_log)
+ printf("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n",sd->bl.id,skill_x,skill_y,skill_num,skill_lv,casttime);
+
+// if(sd->skillitem == skill_num)
+// casttime = delay = 0;
+ //ƒƒ‚ƒ‰ƒCƒY?‘Ô‚È‚çƒLƒƒƒXƒgƒ^ƒCƒ€‚ª1/3
+ if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){
+ casttime = casttime/3;
+ if((--sc_data[SC_MEMORIZE].val2)<=0)
+ skill_status_change_end(&sd->bl, SC_MEMORIZE, -1);
+ }
+
+ if( casttime>0 ) /* ‰r¥‚ª•K—v */
+ clif_skillcasting( &sd->bl,
+ sd->bl.id, 0, skill_x,skill_y, skill_num,casttime);
+
+ if( casttime<=0 ) /* ‰r¥‚Ì–³‚¢‚à‚̂̓Lƒƒƒ“ƒZƒ‹‚³‚ê‚È‚¢ */
+ sd->state.skillcastcancel=0;
+
+ sd->skilltarget = 0;
+/* sd->cast_target_bl = NULL; */
+ tick=gettick();
+ sd->canact_tick = tick + casttime + delay;
+ sd->canmove_tick = tick;
+ if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1)
+ skill_status_change_end(&sd->bl,SC_CLOAKING,-1);
+ if(casttime > 0) {
+ sd->skilltimer = add_timer( tick+casttime, skill_castend_pos, sd->bl.id, 0 );
+ if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
+ sd->prev_speed = sd->speed;
+ sd->speed = sd->speed*(175 - skill*5)/100;
+ clif_updatestatus(sd,SP_SPEED);
+ }
+ else
+ pc_stop_walking(sd,0);
+ }
+ else {
+ sd->skilltimer = -1;
+ skill_castend_pos(sd->skilltimer,tick,sd->bl.id,0);
+ }
+ //ƒ}ƒWƒbƒNƒpƒ?‚Ì?‰ÊI—¹
+ if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER)
+ skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1);
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹‰r¥ƒLƒƒƒ“ƒZƒ‹
+ *------------------------------------------
+ */
+int skill_castcancel(struct block_list *bl,int type)
+{
+ int inf;
+ int ret=0;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_PC){
+ struct map_session_data *sd=(struct map_session_data *)bl;
+ unsigned long tick=gettick();
+ nullpo_retr(0, sd);
+ sd->canact_tick=tick;
+ sd->canmove_tick = tick;
+ if( sd->skilltimer!=-1){
+ if(pc_checkskill(sd,SA_FREECAST) > 0) {
+ sd->speed = sd->prev_speed;
+ clif_updatestatus(sd,SP_SPEED);
+ }
+ if(!type) {
+ if((inf = skill_get_inf( sd->skillid )) == 2 || inf == 32)
+ ret=delete_timer( sd->skilltimer, skill_castend_pos );
+ else
+ ret=delete_timer( sd->skilltimer, skill_castend_id );
+ if(ret<0)
+ printf("delete timer error : skillid : %d\n",sd->skillid);
+ }
+ else {
+ if((inf = skill_get_inf( sd->skillid_old )) == 2 || inf == 32)
+ ret=delete_timer( sd->skilltimer, skill_castend_pos );
+ else
+ ret=delete_timer( sd->skilltimer, skill_castend_id );
+ if(ret<0)
+ printf("delete timer error : skillid : %d\n",sd->skillid_old);
+ }
+ sd->skilltimer=-1;
+ clif_skillcastcancel(bl);
+ }
+
+ return 0;
+ }else if(bl->type==BL_MOB){
+ struct mob_data *md=(struct mob_data *)bl;
+ nullpo_retr(0, md);
+ if( md->skilltimer!=-1 ){
+ if((inf = skill_get_inf( md->skillid )) == 2 || inf == 32)
+ ret=delete_timer( md->skilltimer, mobskill_castend_pos );
+ else
+ ret=delete_timer( md->skilltimer, mobskill_castend_id );
+ md->skilltimer=-1;
+ clif_skillcastcancel(bl);
+ }
+ if(ret<0)
+ printf("delete timer error : skillid : %d\n",md->skillid);
+ return 0;
+ }
+ return 1;
+}
+/*=========================================
+ * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA ‰Šú”Í?Œˆ’è
+ *----------------------------------------
+ */
+void skill_brandishspear_first(struct square *tc,int dir,int x,int y){
+
+ nullpo_retv(tc);
+
+ if(dir == 0){
+ tc->val1[0]=x-2;
+ tc->val1[1]=x-1;
+ tc->val1[2]=x;
+ tc->val1[3]=x+1;
+ tc->val1[4]=x+2;
+ tc->val2[0]=
+ tc->val2[1]=
+ tc->val2[2]=
+ tc->val2[3]=
+ tc->val2[4]=y-1;
+ }
+ else if(dir==2){
+ tc->val1[0]=
+ tc->val1[1]=
+ tc->val1[2]=
+ tc->val1[3]=
+ tc->val1[4]=x+1;
+ tc->val2[0]=y+2;
+ tc->val2[1]=y+1;
+ tc->val2[2]=y;
+ tc->val2[3]=y-1;
+ tc->val2[4]=y-2;
+ }
+ else if(dir==4){
+ tc->val1[0]=x-2;
+ tc->val1[1]=x-1;
+ tc->val1[2]=x;
+ tc->val1[3]=x+1;
+ tc->val1[4]=x+2;
+ tc->val2[0]=
+ tc->val2[1]=
+ tc->val2[2]=
+ tc->val2[3]=
+ tc->val2[4]=y+1;
+ }
+ else if(dir==6){
+ tc->val1[0]=
+ tc->val1[1]=
+ tc->val1[2]=
+ tc->val1[3]=
+ tc->val1[4]=x-1;
+ tc->val2[0]=y+2;
+ tc->val2[1]=y+1;
+ tc->val2[2]=y;
+ tc->val2[3]=y-1;
+ tc->val2[4]=y-2;
+ }
+ else if(dir==1){
+ tc->val1[0]=x-1;
+ tc->val1[1]=x;
+ tc->val1[2]=x+1;
+ tc->val1[3]=x+2;
+ tc->val1[4]=x+3;
+ tc->val2[0]=y-4;
+ tc->val2[1]=y-3;
+ tc->val2[2]=y-1;
+ tc->val2[3]=y;
+ tc->val2[4]=y+1;
+ }
+ else if(dir==3){
+ tc->val1[0]=x+3;
+ tc->val1[1]=x+2;
+ tc->val1[2]=x+1;
+ tc->val1[3]=x;
+ tc->val1[4]=x-1;
+ tc->val2[0]=y-1;
+ tc->val2[1]=y;
+ tc->val2[2]=y+1;
+ tc->val2[3]=y+2;
+ tc->val2[4]=y+3;
+ }
+ else if(dir==5){
+ tc->val1[0]=x+1;
+ tc->val1[1]=x;
+ tc->val1[2]=x-1;
+ tc->val1[3]=x-2;
+ tc->val1[4]=x-3;
+ tc->val2[0]=y+3;
+ tc->val2[1]=y+2;
+ tc->val2[2]=y+1;
+ tc->val2[3]=y;
+ tc->val2[4]=y-1;
+ }
+ else if(dir==7){
+ tc->val1[0]=x-3;
+ tc->val1[1]=x-2;
+ tc->val1[2]=x-1;
+ tc->val1[3]=x;
+ tc->val1[4]=x+1;
+ tc->val2[1]=y;
+ tc->val2[0]=y+1;
+ tc->val2[2]=y-1;
+ tc->val2[3]=y-2;
+ tc->val2[4]=y-3;
+ }
+
+}
+
+/*=========================================
+ * ƒuƒ‰ƒ“ƒfƒBƒbƒVƒ…ƒXƒsƒA •ûŒü”»’è ”Í??’£
+ *-----------------------------------------
+ */
+void skill_brandishspear_dir(struct square *tc,int dir,int are){
+
+ int c;
+
+ nullpo_retv(tc);
+
+ for(c=0;c<5;c++){
+ if(dir==0){
+ tc->val2[c]+=are;
+ }else if(dir==1){
+ tc->val1[c]-=are; tc->val2[c]+=are;
+ }else if(dir==2){
+ tc->val1[c]-=are;
+ }else if(dir==3){
+ tc->val1[c]-=are; tc->val2[c]-=are;
+ }else if(dir==4){
+ tc->val2[c]-=are;
+ }else if(dir==5){
+ tc->val1[c]+=are; tc->val2[c]-=are;
+ }else if(dir==6){
+ tc->val1[c]+=are;
+ }else if(dir==7){
+ tc->val1[c]+=are; tc->val2[c]+=are;
+ }
+ }
+}
+
+/*==========================================
+ * ƒfƒBƒ{?ƒVƒ‡ƒ“ —L?Šm”F
+ *------------------------------------------
+ */
+void skill_devotion(struct map_session_data *md,int target)
+{
+ // ?Šm”F
+ int n;
+
+ nullpo_retv(md);
+
+ for(n=0;n<5;n++){
+ if(md->dev.val1[n]){
+ struct map_session_data *sd = map_id2sd(md->dev.val1[n]);
+ // ‘ŠŽè‚ªŒ©‚‚©‚ç‚È‚¢ // ‘ŠŽè‚ðƒfƒBƒ{‚µ‚Ä‚é‚Ì‚ªŽ©•ª‚¶‚á‚È‚¢ // ‹——£‚ª—£‚ê‚Ä‚é
+ if( sd == NULL || (sd->sc_data && (md->bl.id != sd->sc_data[SC_DEVOTION].val1)) || skill_devotion3(&md->bl,md->dev.val1[n])){
+ skill_devotion_end(md,sd,n);
+ }
+ }
+ }
+}
+void skill_devotion2(struct block_list *bl,int crusader)
+{
+ // ”íƒfƒBƒ{?ƒVƒ‡ƒ“‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
+ struct map_session_data *sd = map_id2sd(crusader);
+
+ nullpo_retv(bl);
+
+ if(sd) skill_devotion3(&sd->bl,bl->id);
+}
+int skill_devotion3(struct block_list *bl,int target)
+{
+ // ƒNƒ‹ƒZ‚ª?‚¢‚½Žž‚Ì‹——£ƒ`ƒFƒbƒN
+ struct map_session_data *md;
+ struct map_session_data *sd;
+ int n,r=0;
+
+ nullpo_retr(1, bl);
+
+ if( (md = (struct map_session_data *)bl) == NULL || (sd = map_id2sd(target)) == NULL )
+ return 1;
+ else
+ r = distance(bl->x,bl->y,sd->bl.x,sd->bl.y);
+
+ if(pc_checkskill(sd,CR_DEVOTION)+6 < r){ // ‹–—e”Í?‚ð’´‚¦‚Ä‚½
+ for(n=0;n<5;n++)
+ if(md->dev.val1[n]==target)
+ md->dev.val2[n]=0; // —£‚ꂽŽž‚ÍA?‚ð؂邾‚¯
+ clif_devotion(md,sd->bl.id);
+ return 1;
+ }
+ return 0;
+}
+
+void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target)
+{
+ // ƒNƒ‹ƒZ‚Æ”íƒfƒBƒ{ƒLƒƒƒ‰‚̃ŠƒZƒbƒg
+ nullpo_retv(md);
+ nullpo_retv(sd);
+
+ md->dev.val1[target]=md->dev.val2[target]=0;
+ if(sd && sd->sc_data){
+ // skill_status_change_end(sd->bl,SC_DEVOTION,-1);
+ sd->sc_data[SC_DEVOTION].val1=0;
+ sd->sc_data[SC_DEVOTION].val2=0;
+ clif_status_change(&sd->bl,SC_DEVOTION,0);
+ clif_devotion(md,sd->bl.id);
+ }
+}
+/*==========================================
+ * ƒI?ƒgƒXƒyƒ‹
+ *------------------------------------------
+ */
+int skill_autospell(struct map_session_data *sd,int skillid)
+{
+ int skilllv;
+ int maxlv=1,lv;
+
+ nullpo_retr(0, sd);
+
+ skilllv = pc_checkskill(sd,SA_AUTOSPELL);
+ if(skilllv <= 0) return 0;
+
+ if(skillid==MG_NAPALMBEAT) maxlv=3;
+ else if(skillid==MG_COLDBOLT || skillid==MG_FIREBOLT || skillid==MG_LIGHTNINGBOLT){
+ if(skilllv==2) maxlv=1;
+ else if(skilllv==3) maxlv=2;
+ else if(skilllv>=4) maxlv=3;
+ }
+ else if(skillid==MG_SOULSTRIKE){
+ if(skilllv==5) maxlv=1;
+ else if(skilllv==6) maxlv=2;
+ else if(skilllv>=7) maxlv=3;
+ }
+ else if(skillid==MG_FIREBALL){
+ if(skilllv==8) maxlv=1;
+ else if(skilllv>=9) maxlv=2;
+ }
+ else if(skillid==MG_FROSTDIVER) maxlv=1;
+ else return 0;
+
+ if(maxlv > (lv=pc_checkskill(sd,skillid)))
+ maxlv = lv;
+
+ skill_status_change_start(&sd->bl,SC_AUTOSPELL,skilllv,skillid,maxlv,0, // val1:ƒXƒLƒ‹ID val2:Žg—pÅ‘åLv
+ skill_get_time(SA_AUTOSPELL,skilllv),0);// ‚É‚µ‚Ä‚Ý‚½‚¯‚Çbscript‚ª‘‚«ˆÕ‚¢???H
+ return 0;
+}
+
+/*==========================================
+ * ƒMƒƒƒ“ƒOƒXƒ^?ƒpƒ‰ƒ_ƒCƒX”»’è?—(foreachinarea)
+ *------------------------------------------
+ */
+
+static int skill_gangster_count(struct block_list *bl,va_list ap)
+{
+ int *c;
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ sd=(struct map_session_data*)bl;
+ c=va_arg(ap,int *);
+
+ if(sd && c && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
+ (*c)++;
+ return 0;
+}
+
+static int skill_gangster_in(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ sd=(struct map_session_data*)bl;
+ if(sd && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0)
+ sd->state.gangsterparadise=1;
+ return 0;
+}
+
+static int skill_gangster_out(struct block_list *bl,va_list ap)
+{
+ struct map_session_data *sd;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ sd=(struct map_session_data*)bl;
+ if(sd && sd->state.gangsterparadise)
+ sd->state.gangsterparadise=0;
+ return 0;
+}
+
+int skill_gangsterparadise(struct map_session_data *sd ,int type)
+{
+ int range=1;
+ int c=0;
+
+ nullpo_retr(0, sd);
+
+ if(pc_checkskill(sd,RG_GANGSTER) <= 0)
+ return 0;
+
+ if(type==1) {/* À‚Á‚½Žž‚Ì?— */
+ map_foreachinarea(skill_gangster_count,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
+ if(c > 0) {/*ƒMƒƒƒ“ƒOƒXƒ^?¬Œ÷‚µ‚½‚玩•ª‚É‚àƒMƒƒƒ“ƒOƒXƒ^??«•t?*/
+ map_foreachinarea(skill_gangster_in,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC);
+ sd->state.gangsterparadise = 1;
+ }
+ return 0;
+ }
+ else if(type==0) {/* —§‚¿ã‚ª‚Á‚½‚Æ‚«‚Ì?— */
+ map_foreachinarea(skill_gangster_count,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&c);
+ if(c < 1)
+ map_foreachinarea(skill_gangster_out,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC);
+ sd->state.gangsterparadise = 0;
+ return 0;
+ }
+ return 0;
+}
+/*==========================================
+ * Š¦‚¢ƒWƒ‡?ƒN?ƒXƒNƒŠ?ƒ€”»’è?—(foreachinarea)
+ *------------------------------------------
+ */
+int skill_frostjoke_scream(struct block_list *bl,va_list ap)
+{
+ struct block_list *src;
+ int skillnum,skilllv;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, src=va_arg(ap,struct block_list*));
+
+ skillnum=va_arg(ap,int);
+ skilllv=va_arg(ap,int);
+ if(skilllv <= 0) return 0;
+ tick=va_arg(ap,unsigned int);
+
+ if(src == bl)//Ž©•ª‚É‚Í?‚©‚È‚¢
+ return 0;
+
+ if(battle_check_target(src,bl,BCT_ENEMY) > 0)
+ skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
+ else if(battle_check_target(src,bl,BCT_PARTY) > 0) {
+ if(rand()%100 < 10)//PTƒƒ“ƒo‚É‚à’áŠm—¦‚Å‚©‚©‚é(‚Æ‚è‚ ‚¦‚¸10%)
+ skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick);
+ }
+
+ return 0;
+}
+
+/*==========================================
+ *ƒAƒuƒ‰ƒJƒ_ƒuƒ‰‚ÌŽg—pƒXƒLƒ‹Œˆ’è(Œˆ’èƒXƒLƒ‹‚ªƒ_ƒ‚È‚ç0‚ð•Ô‚·)
+ *------------------------------------------
+ */
+int skill_abra_dataset(int skilllv)
+{
+ if(skilllv <= 0) return 0;
+ int skill = rand()%331;
+ //db‚ÉŠî‚­ƒŒƒxƒ‹?Šm—¦”»’è
+ if(skill_abra_db[skill].req_lv > skilllv || rand()%10000 >= skill_abra_db[skill].per) return 0;
+ //NPCƒXƒLƒ‹‚̓_ƒ
+ if(skill >= NPC_PIERCINGATT && skill <= NPC_SUMMONMONSTER) return 0;
+ //‰‰‘tƒXƒLƒ‹‚̓_ƒ
+ if(skill_is_danceskill(skill)) return 0;
+
+ return skill;
+}
+
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int skill_attack_area(struct block_list *bl,va_list ap)
+{
+ struct block_list *src,*dsrc;
+ int atk_type,skillid,skilllv,flag,type;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ atk_type = va_arg(ap,int);
+ if((src=va_arg(ap,struct block_list*)) == NULL)
+ return 0;
+ if((dsrc=va_arg(ap,struct block_list*)) == NULL)
+ return 0;
+ skillid=va_arg(ap,int);
+ skilllv=va_arg(ap,int);
+ if(skilllv <= 0) return 0;
+ tick=va_arg(ap,unsigned int);
+ flag=va_arg(ap,int);
+ type=va_arg(ap,int);
+
+ if(battle_check_target(dsrc,bl,type) > 0)
+ skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag);
+
+ return 0;
+}
+/*==========================================
+ *
+ *------------------------------------------
+ */
+int skill_clear_element_field(struct block_list *bl)
+{
+ struct mob_data *md=NULL;
+ struct map_session_data *sd=NULL;
+ int i,skillid;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_MOB)
+ md=(struct mob_data *)bl;
+ if(bl->type==BL_PC)
+ sd=(struct map_session_data *)bl;
+
+ for(i=0;i<MAX_MOBSKILLUNITGROUP;i++){
+ if(sd){
+ skillid=sd->skillunit[i].skill_id;
+ if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+ skill_delunitgroup(&sd->skillunit[i]);
+ }else if(md){
+ skillid=md->skillunit[i].skill_id;
+ if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR)
+ skill_delunitgroup(&md->skillunit[i]);
+ }
+ }
+ return 0;
+}
+/*==========================================
+ * ƒ‰ƒ“ƒhƒvƒƒeƒNƒ^?ƒ`ƒFƒbƒN(foreachinarea)
+ *------------------------------------------
+ */
+int skill_landprotector(struct block_list *bl, va_list ap )
+{
+ int skillid;
+ int *alive;
+ struct skill_unit *unit;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ skillid=va_arg(ap,int);
+ alive=va_arg(ap,int *);
+ if((unit=(struct skill_unit *)bl) == NULL)
+ return 0;
+
+ if(skillid==SA_LANDPROTECTOR){
+ skill_delunit(unit);
+ }else{
+ if(alive && unit->group->skill_id==SA_LANDPROTECTOR)
+ (*alive)=0;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒCƒhƒDƒ“‚Ì—ÑŒç‚̉ñ•œ?—(foreachinarea)
+ *------------------------------------------
+ */
+int skill_idun_heal(struct block_list *bl, va_list ap )
+{
+ struct skill_unit *unit;
+ struct skill_unit_group *sg;
+ int heal;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, unit = va_arg(ap,struct skill_unit *));
+ nullpo_retr(0, sg = unit->group);
+
+ heal=30+sg->skill_lv*5+((sg->val1)>>16)*5+((sg->val1)&0xfff)/2;
+
+ if(bl->type == BL_SKILL || bl->id == sg->src_id)
+ return 0;
+
+ if(bl->type == BL_PC || bl->type == BL_MOB){
+ clif_skill_nodamage(&unit->bl,bl,AL_HEAL,heal,1);
+ battle_heal(NULL,bl,heal,0,0);
+ }
+ return 0;
+}
+
+/*==========================================
+ * Žw’è”Í??‚Åsrc‚É?‚µ‚Ä—L?‚ȃ^?ƒQƒbƒg‚Ìbl‚Ì?‚ð?‚¦‚é(foreachinarea)
+ *------------------------------------------
+ */
+int skill_count_target(struct block_list *bl, va_list ap ){
+ struct block_list *src;
+ int *c;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+
+ if((src = va_arg(ap,struct block_list *)) == NULL)
+ return 0;
+ if((c = va_arg(ap,int *)) == NULL)
+ return 0;
+ if(battle_check_target(src,bl,BCT_ENEMY) > 0)
+ (*c)++;
+ return 0;
+}
+/*==========================================
+ * ƒgƒ‰ƒbƒv”Í??—(foreachinarea)
+ *------------------------------------------
+ */
+int skill_trap_splash(struct block_list *bl, va_list ap )
+{
+ struct block_list *src;
+ int tick;
+ int splash_count;
+ struct skill_unit *unit;
+ struct skill_unit_group *sg;
+ struct block_list *ss;
+ int i;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, src = va_arg(ap,struct block_list *));
+ nullpo_retr(0, unit = (struct skill_unit *)src);
+ nullpo_retr(0, sg = unit->group);
+ nullpo_retr(0, ss = map_id2bl(sg->src_id));
+
+ tick = va_arg(ap,int);
+ splash_count = va_arg(ap,int);
+
+ if(battle_check_target(src,bl,BCT_ENEMY) > 0){
+ switch(sg->unit_id){
+ case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
+ break;
+ case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ for(i=0;i<splash_count;i++){
+ skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
+ }
+ case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ skill_attack(BF_WEAPON, ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+/*----------------------------------------------------------------------------
+ * ƒXƒe?ƒ^ƒXˆÙí
+ *----------------------------------------------------------------------------
+ */
+
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙíƒ^ƒCƒ}?”Í??—
+ *------------------------------------------
+ */
+int skill_status_change_timer_sub(struct block_list *bl, va_list ap )
+{
+ struct block_list *src;
+ int type;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, src=va_arg(ap,struct block_list*));
+ type=va_arg(ap,int);
+ tick=va_arg(ap,unsigned int);
+
+ if(bl->type!=BL_PC && bl->type!=BL_MOB)
+ return 0;
+
+ switch( type ){
+ case SC_SIGHT: /* ƒTƒCƒg */
+ case SC_CONCENTRATE:
+ if( (*battle_get_option(bl))&6 ){
+ skill_status_change_end( bl, SC_HIDING, -1);
+ skill_status_change_end( bl, SC_CLOAKING, -1);
+ }
+ break;
+ case SC_RUWACH: /* ƒ‹ƒAƒt */
+ if( (*battle_get_option(bl))&6 ){
+ skill_status_change_end( bl, SC_HIDING, -1);
+ skill_status_change_end( bl, SC_CLOAKING, -1);
+ if(battle_check_target( src,bl, BCT_ENEMY ) > 0) {
+ struct status_change *sc_data = battle_get_sc_data(bl);
+ skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙíI—¹
+ *------------------------------------------
+ */
+int skill_status_change_end(struct block_list* bl, int type, int tid)
+{
+ struct status_change* sc_data;
+ int opt_flag=0, calc_flag = 0;
+ short *sc_count, *option, *opt1, *opt2, *opt3;
+
+ nullpo_retr(0, bl);
+ if(bl->type!=BL_PC && bl->type!=BL_MOB) {
+ if(battle_config.error_log)
+ printf("skill_status_change_end: neither MOB nor PC !\n");
+ return 0;
+ }
+ nullpo_retr(0, sc_data = battle_get_sc_data(bl));
+ nullpo_retr(0, sc_count = battle_get_sc_count(bl));
+ nullpo_retr(0, option = battle_get_option(bl));
+ nullpo_retr(0, opt1 = battle_get_opt1(bl));
+ nullpo_retr(0, opt2 = battle_get_opt2(bl));
+ nullpo_retr(0, opt3 = battle_get_opt3(bl));
+
+ if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) {
+
+ if (tid == -1) // ƒ^ƒCƒ}‚©‚çŒÄ‚΂ê‚Ä‚¢‚È‚¢‚È‚çƒ^ƒCƒ}íœ‚ð‚·‚é
+ delete_timer(sc_data[type].timer,skill_status_change_timer);
+
+ /* ŠY?‚̈Ùí‚ð³í‚É?‚· */
+ sc_data[type].timer=-1;
+ (*sc_count)--;
+
+ switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
+ case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
+ case SC_CONCENTRATE: /* W’†—ÍŒüã */
+ case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
+ case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
+ case SC_INCREASEAGI: /* ‘¬“x㸠*/
+ case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
+ case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
+ case SC_HIDING:
+ case SC_TWOHANDQUICKEN: /* 2HQ */
+ case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
+ case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
+ case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
+ case SC_GLORIA: /* ƒOƒƒŠƒA */
+ case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
+ case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
+ case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
+ case SC_VOLCANO:
+ case SC_DELUGE:
+ case SC_VIOLENTGALE:
+ case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
+ case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case SC_WHISTLE: /* Œû“J */
+ case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
+ case SC_FORTUNE: /* K‰^‚̃LƒX */
+ case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
+ case SC_STEELBODY: // ‹à„
+ case SC_DEFENDER:
+ case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
+ case SC_SPEEDPOTION1:
+ case SC_SPEEDPOTION2:
+ case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case SC_RIDING:
+ case SC_BLADESTOP_WAIT:
+ case SC_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
+ case SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
+ case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
+ case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ case SC_ASSUMPTIO: /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
+ case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
+ case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case SC_MAGICPOWER: /* –‚–@—Í?• */
+ case SC_CHASEWALK:
+ case SC_ATKPOT: /* attack potion [Valaris] */
+ case SC_MATKPOT: /* magic attack potion [Valaris] */
+ case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
+ case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
+ case SC_EDP: // Celest
+ case SC_MARIONETTE:
+ case SC_MARIONETTE2:
+ calc_flag = 1;
+ break;
+ case SC_BERSERK: /* ƒo?ƒT?ƒN */
+ calc_flag = 1;
+ clif_status_change(bl,SC_INCREASEAGI,0); /* ƒAƒCƒRƒ“Á‹Ž */
+ break;
+ case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
+ {
+ struct map_session_data *md = map_id2sd(sc_data[type].val1);
+ sc_data[type].val1=sc_data[type].val2=0;
+ skill_devotion(md,bl->id);
+ calc_flag = 1;
+ }
+ break;
+ case SC_BLADESTOP:
+ {
+ struct status_change *t_sc_data = battle_get_sc_data((struct block_list *)sc_data[type].val4);
+ //•Ð•û‚ªØ‚ꂽ‚Ì‚Å‘ŠŽè‚Ì”’n?‘Ô‚ªØ‚ê‚Ä‚È‚¢‚Ì‚È‚ç‰ðœ
+ if(t_sc_data && t_sc_data[SC_BLADESTOP].timer!=-1)
+ skill_status_change_end((struct block_list *)sc_data[type].val4,SC_BLADESTOP,-1);
+
+ if(sc_data[type].val2==2)
+ clif_bladestop((struct block_list *)sc_data[type].val3,(struct block_list *)sc_data[type].val4,0);
+ }
+ break;
+ case SC_DANCING:
+ {
+ struct map_session_data *dsd;
+ struct status_change *d_sc_data;
+ if(sc_data[type].val4 && (dsd=map_id2sd(sc_data[type].val4))){
+ d_sc_data = dsd->sc_data;
+ //‡‘t‚Å‘ŠŽè‚ª‚¢‚éꇑŠŽè‚Ìval4‚ð0‚É‚·‚é
+ if(d_sc_data && d_sc_data[type].timer!=-1)
+ d_sc_data[type].val4=0;
+ }
+ }
+ calc_flag = 1;
+ break;
+ case SC_GRAFFITI:
+ {
+ struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[type].val4; //val4‚ªƒOƒ‰ƒtƒBƒeƒB‚Ìgroup_id
+ if(sg)
+ skill_delunitgroup(sg);
+ }
+ break;
+ case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
+ {
+ struct map_session_data *sd=NULL;
+ if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
+ sd->status.manner = 0;
+ clif_updatestatus(sd,SP_MANNER);
+ }
+ }
+ break;
+ case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ {
+ struct block_list *src=map_id2bl(sc_data[type].val3);
+ if(src && tid!=-1){
+ //Ž©•ª‚Ƀ_ƒ?ƒW•Žü?3*3‚Ƀ_ƒ?ƒW
+ skill_castend_damage_id(src, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
+ }
+ }
+ break;
+ case SC_SELFDESTRUCTION: /* Ž©”š */
+ {
+ //Ž©•ª‚̃_ƒ?ƒW‚Í0‚É‚µ‚Ä
+ struct mob_data *md=NULL;
+ if(bl->type == BL_MOB && (md=(struct mob_data*)bl))
+ skill_castend_damage_id(bl, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
+ }
+ break;
+ /* option1 */
+ case SC_FREEZE:
+ sc_data[type].val3 = 0;
+ break;
+
+ /* option2 */
+ case SC_POISON: /* “Å */
+ case SC_BLIND: /* ˆÃ? */
+ case SC_CURSE:
+ calc_flag = 1;
+ break;
+ }
+
+ if(bl->type==BL_PC && type<SC_SENDMAX)
+ clif_status_change(bl,type,0); /* ƒAƒCƒRƒ“Á‹Ž */
+
+ switch(type){ /* ³í‚É?‚é‚Æ‚«‚È‚É‚©?—‚ª•K—v */
+ case SC_STONE:
+ case SC_FREEZE:
+ case SC_STAN:
+ case SC_SLEEP:
+ *opt1 = 0;
+ opt_flag = 1;
+ break;
+
+ case SC_POISON:
+ case SC_CURSE:
+ case SC_SILENCE:
+ case SC_BLIND:
+ *opt2 &= ~(1<<(type-SC_POISON));
+ opt_flag = 1;
+ break;
+
+ case SC_SIGNUMCRUCIS:
+ *opt2 &= ~0x40;
+ opt_flag = 1;
+ break;
+
+ case SC_HIDING:
+ case SC_CLOAKING:
+ *option &= ~((type == SC_HIDING) ? 2 : 4);
+ opt_flag = 1 ;
+ break;
+
+ case SC_CHASEWALK:
+ *option &= ~16388;
+ opt_flag = 1 ;
+ break;
+
+ case SC_SIGHT:
+ *option &= ~1;
+ opt_flag = 1;
+ break;
+ case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
+ *option &= ~4096;
+ opt_flag = 1;
+ break;
+ case SC_RUWACH:
+ *option &= ~8192;
+ opt_flag = 1;
+ break;
+
+ //opt3
+ case SC_TWOHANDQUICKEN: /* 2HQ */
+ case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
+ case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
+ *opt3 &= ~1;
+ break;
+ case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
+ *opt3 &= ~2;
+ break;
+ case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
+ *opt3 &= ~4;
+ break;
+ case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
+ *opt3 &= ~8;
+ break;
+ case SC_STEELBODY: // ‹à„
+ *opt3 &= ~16;
+ break;
+ case SC_BLADESTOP: /* ”’nŽæ‚è */
+ *opt3 &= ~32;
+ break;
+ case SC_BERSERK: /* ƒo?ƒT?ƒN */
+ *opt3 &= ~128;
+ break;
+ case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
+ *opt3 &= ~1024;
+ break;
+ case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
+ *opt3 &= ~2048;
+ break;
+ }
+
+ if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 && bl->type == BL_PC) { // by [Yor]
+ *opt2 |= STATE_BLIND;
+ opt_flag = 1;
+ }
+
+ if(opt_flag) /* option‚Ì?X‚ð?‚¦‚é */
+ clif_changeoption(bl);
+
+ if (bl->type == BL_PC && calc_flag)
+ pc_calcstatus((struct map_session_data *)bl,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
+ }
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙíI—¹ƒ^ƒCƒ}?
+ *------------------------------------------
+ */
+int skill_status_change_timer(int tid, unsigned int tick, int id, int data)
+{
+ int type=data;
+ struct block_list *bl;
+ struct map_session_data *sd=NULL;
+ struct status_change *sc_data;
+ //short *sc_count; //Žg‚Á‚Ä‚È‚¢H
+
+ if( (bl=map_id2bl(id)) == NULL )
+ return 0; //ŠY?ID‚ª‚·‚Å‚ÉÁ–Å‚µ‚Ä‚¢‚é‚Æ‚¢‚¤‚Ì‚Í‚¢‚©‚É‚à‚ ‚è‚»‚¤‚Ȃ̂ŃXƒ‹?‚µ‚Ä‚Ý‚é
+ nullpo_retr(0, sc_data=battle_get_sc_data(bl));
+
+ if(bl->type==BL_PC)
+ sd=(struct map_session_data *)bl;
+
+ //sc_count=battle_get_sc_count(bl); //Žg‚Á‚Ä‚È‚¢H
+
+ if(sc_data[type].timer != tid) {
+ if(battle_config.error_log)
+ printf("skill_status_change_timer %d != %d\n",tid,sc_data[type].timer);
+ }
+
+ switch(type){ /* “ÁŽê‚È?—‚É‚È‚éê‡ */
+ case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ? */
+ case SC_CLOAKING:
+ if(sd){
+ if( sd->status.sp > 0 ){ /* SPØ‚ê‚é‚Ü‚ÅŽ? */
+ sd->status.sp--;
+ clif_updatestatus(sd,SP_SP);
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ sc_data[type].val2+tick, skill_status_change_timer, bl->id, data);
+ return 0;
+ }
+ }
+ break;
+
+ case SC_CHASEWALK:
+ if(sd){
+ if( sd->status.sp > 19+sc_data[SC_CHASEWALK].val1*3){
+ sd->status.sp-=(19+(sc_data[SC_CHASEWALK].val1*3)); // update sp cost [Celest]
+ clif_updatestatus(sd,SP_SP);
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ sc_data[type].val2+tick, skill_status_change_timer, bl->id, data);
+ return 0;
+ }
+ }
+ break;
+
+ case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
+ if(sd){ /* SP‚ª‚ ‚Á‚ÄAŽžŠÔ§ŒÀ‚ÌŠÔ‚ÍŽ? */
+ if( sd->status.sp > 0 && (--sc_data[type].val2)>0 ){
+ if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
+ sd->status.sp--;
+ clif_updatestatus(sd,SP_SP);
+ }
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 1000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+
+ case SC_SIGHT: /* ƒTƒCƒg */
+ {
+ const int range=7;
+ map_foreachinarea( skill_status_change_timer_sub,
+ bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
+ bl,type,tick);
+
+ if( (--sc_data[type].val2)>0 ){
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 250+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+ case SC_RUWACH: /* ƒ‹ƒAƒt */
+ {
+ const int range=5;
+ map_foreachinarea( skill_status_change_timer_sub,
+ bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
+ bl,type,tick);
+
+ if( (--sc_data[type].val2)>0 ){
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 250+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+
+ case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
+ {
+ int race = battle_get_race(bl);
+ if(race == 6 || battle_check_undead(race,battle_get_elem_type(bl))) {
+ sc_data[type].timer=add_timer(1000*600+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ }
+ break;
+
+ case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN/ƒI?ƒgƒo?ƒT?ƒN */
+ if(sc_data[type].val2!=0){ /* ƒI?ƒgƒo?ƒT?ƒNi‚P•b‚²‚Æ‚ÉHPƒ`ƒFƒbƒNj */
+ if(sd && sd->status.hp>sd->status.max_hp>>2) /* ’âŽ~ */
+ break;
+ sc_data[type].timer=add_timer( 1000+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ break;
+
+ case SC_WATERBALL: /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
+ {
+ struct block_list *target=map_id2bl(sc_data[type].val2);
+ if(target==NULL || target->prev==NULL)
+ break;
+ skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0);
+ if((--sc_data[type].val3)>0) {
+ sc_data[type].timer=add_timer( 150+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ }
+ break;
+
+ case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
+ if(sd && sd->special_state.infinite_endure) {
+ sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data );
+ sc_data[type].val2=1;
+ return 0;
+ }
+ break;
+
+ case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
+ if( (--sc_data[type].val2)>0){
+ struct skill_unit *unit=
+ (struct skill_unit *)sc_data[type].val4;
+ struct block_list *src;
+
+ if(!unit || !unit->group)
+ break;
+ src=map_id2bl(unit->group->src_id);
+ if(!src)
+ break;
+ skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0);
+ sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick,
+ skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ break;
+
+ case SC_LULLABY: /* ŽqŽç‰S */
+ if( (--sc_data[type].val2)>0){
+ struct skill_unit *unit=
+ (struct skill_unit *)sc_data[type].val4;
+ if(!unit || !unit->group || unit->group->src_id==bl->id)
+ break;
+ skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick);
+ sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick,
+ skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ break;
+
+ case SC_STONE:
+ if(sc_data[type].val2 != 0) {
+ short *opt1 = battle_get_opt1(bl);
+ sc_data[type].val2 = 0;
+ sc_data[type].val4 = 0;
+ battle_stopwalking(bl,1);
+ if(opt1) {
+ *opt1 = 1;
+ clif_changeoption(bl);
+ }
+ sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ else if( (--sc_data[type].val3) > 0) {
+ int hp = battle_get_max_hp(bl);
+ if((++sc_data[type].val4)%5 == 0 && battle_get_hp(bl) > hp>>2) {
+ hp = hp/100;
+ if(hp < 1) hp = 1;
+ if(bl->type == BL_PC)
+ pc_heal((struct map_session_data *)bl,-hp,0);
+ else if(bl->type == BL_MOB){
+ struct mob_data *md;
+ if((md=((struct mob_data *)bl)) == NULL)
+ break;
+ md->hp -= hp;
+ }
+ }
+ sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+ }
+ break;
+ case SC_POISON:
+ if(sc_data[SC_SLOWPOISON].timer == -1) {
+ if( (--sc_data[type].val3) > 0) {
+ int hp = battle_get_max_hp(bl);
+ if(battle_get_hp(bl) > hp>>2) {
+ if(bl->type == BL_PC) {
+ hp = 3 + hp*3/200;
+ pc_heal((struct map_session_data *)bl,-hp,0);
+ }
+ else if(bl->type == BL_MOB) {
+ struct mob_data *md;
+ if((md=((struct mob_data *)bl)) == NULL)
+ break;
+ hp = 3 + hp/200;
+ md->hp -= hp;
+ }
+ }
+ sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
+ }
+ }
+ else
+ sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data );
+ break;
+ case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ if(sd){ /* SP‚ª‚ ‚Á‚ÄAHP‚ª?ƒ^ƒ“‚Å‚È‚¯‚ê‚Î?? */
+ if( sd->status.sp > 12 && sd->status.max_hp > sd->status.hp ){
+/* if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
+ sd->status.sp -= 12;
+ clif_updatestatus(sd,SP_SP);
+ } */
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 10000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ if(sd->status.max_hp <= sd->status.hp)
+ skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
+ }
+ break;
+
+ /* ŽžŠÔØ‚ê–³‚µHH */
+ case SC_AETERNA:
+ case SC_TRICKDEAD:
+ case SC_RIDING:
+ case SC_FALCON:
+ case SC_WEIGHT50:
+ case SC_WEIGHT90:
+ case SC_MAGICPOWER: /* –‚–@—Í?• */
+ case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
+ case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
+ case SC_BROKNWEAPON:
+ case SC_BROKNARMOR:
+ if(sc_data[type].timer==tid)
+ sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data );
+ return 0;
+
+ case SC_DANCING: //ƒ_ƒ“ƒXƒXƒLƒ‹‚ÌŽžŠÔSPÁ”ï
+ {
+ int s=0;
+ if(sd){
+ if(sd->status.sp > 0 && (--sc_data[type].val3)>0){
+ switch(sc_data[type].val1){
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ 3•b‚ÉSP1 */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« 3•b‚ÉSP1 */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö 3•b‚ÉSP1 */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh 3•b‚ÉSP1 */
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ 3•b‚ÅSP1 */
+ case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX 3•b‚ÅSP1 */
+ case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX 3•b‚ÅSP1 */
+ s=3;
+ break;
+ case BD_LULLABY: /* ŽqŽç‰Ì 4•b‚ÉSP1 */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× 4•b‚ÉSP1 */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ 4•b‚ÉSP1 */
+ case DC_FORTUNEKISS: /* K‰^‚̃LƒX 4•b‚ÅSP1 */
+ s=4;
+ break;
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É 5•b‚ÉSP1 */
+ case BA_WHISTLE: /* Œû“J 5•b‚ÅSP1 */
+ case DC_HUMMING: /* ƒnƒ~ƒ“ƒO 5•b‚ÅSP1 */
+ case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ 5•b‚ÅSP1 */
+ case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? 5•b‚ÅSP1 */
+ s=5;
+ break;
+ case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç 6•b‚ÅSP1 */
+ s=6;
+ break;
+ case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc 10•b‚ÅSP1 */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç 10•b‚ÅSP1H */
+ s=10;
+ break;
+ }
+ if(s && ((sc_data[type].val3 % s) == 0)){
+ sd->status.sp--;
+ clif_updatestatus(sd,SP_SP);
+ }
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 1000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ }
+ break;
+ case SC_BERSERK: /* ƒo?ƒT?ƒN */
+ if(sd){ /* HP‚ª100ˆÈã‚È‚ç?? */
+ if( (sd->status.hp - sd->status.hp/100) > 100 ){
+ sd->status.hp -= sd->status.hp/100;
+ clif_updatestatus(sd,SP_HP);
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 15000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+ case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
+ if(sd){
+ time_t timer;
+ if(time(&timer) < ((sc_data[type].val2) + 3600)){ //1ŽžŠÔ‚½‚Á‚Ä‚¢‚È‚¢‚Ì‚Å??
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 10000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+ case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
+ if(sd && battle_config.muting_players){
+ time_t timer;
+ if((++sd->status.manner) && time(&timer) < ((sc_data[type].val2) + 60*(0-sd->status.manner))){ //ŠJŽn‚©‚çstatus.manner•ª?‚Á‚Ä‚È‚¢‚Ì‚Å??
+ clif_updatestatus(sd,SP_MANNER);
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è(60•b) */
+ 60000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ }
+ break;
+ case SC_SELFDESTRUCTION: /* Ž©”š */
+ if(--sc_data[type].val3>0){
+ struct mob_data *md;
+ if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->speed > 250){
+ md->speed -= 250;
+ md->next_walktime=tick;
+ }
+ sc_data[type].timer=add_timer( /* ƒ^ƒCƒ}?ÄÝ’è */
+ 1000+tick, skill_status_change_timer,
+ bl->id, data);
+ return 0;
+ }
+ break;
+ }
+
+ return skill_status_change_end( bl,type,tid );
+}
+
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙíI—¹
+ *------------------------------------------
+ */
+int skill_encchant_eremental_end(struct block_list *bl,int type)
+{
+ struct status_change *sc_data;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, sc_data=battle_get_sc_data(bl));
+
+ if( type!=SC_ENCPOISON && sc_data[SC_ENCPOISON].timer!=-1 ) /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“‰ðœ */
+ skill_status_change_end(bl,SC_ENCPOISON,-1);
+ if( type!=SC_ASPERSIO && sc_data[SC_ASPERSIO].timer!=-1 ) /* ƒAƒXƒyƒ‹ƒVƒI‰ðœ */
+ skill_status_change_end(bl,SC_ASPERSIO,-1);
+ if( type!=SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer!=-1 ) /* ƒtƒŒƒCƒ€ƒ‰ƒ“ƒ`ƒƒ‰ðœ */
+ skill_status_change_end(bl,SC_FLAMELAUNCHER,-1);
+ if( type!=SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer!=-1 ) /* ƒtƒƒXƒgƒEƒFƒ|ƒ“‰ðœ */
+ skill_status_change_end(bl,SC_FROSTWEAPON,-1);
+ if( type!=SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer!=-1 ) /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_?‰ðœ */
+ skill_status_change_end(bl,SC_LIGHTNINGLOADER,-1);
+ if( type!=SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer!=-1 ) /* ƒTƒCƒXƒ~ƒbƒNƒEƒFƒ|ƒ“‰ðœ */
+ skill_status_change_end(bl,SC_SEISMICWEAPON,-1);
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙíŠJŽn
+ *------------------------------------------
+ */
+int skill_status_change_start(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag)
+{
+ struct map_session_data *sd = NULL;
+ struct status_change* sc_data;
+ short *sc_count, *option, *opt1, *opt2, *opt3;
+ int opt_flag = 0, calc_flag = 0,updateflag = 0, race, mode, elem, undead_flag;
+ int scdef=0;
+
+ nullpo_retr(0, bl);
+ if(bl->type == BL_SKILL)
+ return 0;
+ nullpo_retr(0, sc_data=battle_get_sc_data(bl));
+ nullpo_retr(0, sc_count=battle_get_sc_count(bl));
+ nullpo_retr(0, option=battle_get_option(bl));
+ nullpo_retr(0, opt1=battle_get_opt1(bl));
+ nullpo_retr(0, opt2=battle_get_opt2(bl));
+ nullpo_retr(0, opt3=battle_get_opt3(bl));
+
+
+ race=battle_get_race(bl);
+ mode=battle_get_mode(bl);
+ elem=battle_get_elem_type(bl);
+ undead_flag=battle_check_undead(race,elem);
+
+ if(type == SC_AETERNA && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1) )
+ return 0;
+
+ switch(type){
+ case SC_STONE:
+ case SC_FREEZE:
+ scdef=3+battle_get_mdef(bl)+battle_get_luk(bl)/3;
+ break;
+ case SC_STAN:
+ case SC_SILENCE:
+ case SC_POISON:
+ scdef=3+battle_get_vit(bl)+battle_get_luk(bl)/3;
+ break;
+ case SC_SLEEP:
+ case SC_BLIND:
+ scdef=3+battle_get_int(bl)+battle_get_luk(bl)/3;
+ break;
+ case SC_CURSE:
+ scdef=3+battle_get_luk(bl);
+ break;
+
+// case SC_CONFUSION:
+ default:
+ scdef=0;
+ }
+ if(scdef>=100)
+ return 0;
+ if(bl->type==BL_PC){
+ sd=(struct map_session_data *)bl;
+ if( sd && type == SC_ADRENALINE && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)))
+ return 0;
+
+ if(SC_STONE<=type && type<=SC_BLIND){ /* ƒJ?ƒh‚É‚æ‚é‘Ï« */
+ if( sd && sd->reseff[type-SC_STONE] > 0 && rand()%10000<sd->reseff[type-SC_STONE]){
+ if(battle_config.battle_log)
+ printf("PC %d skill_sc_start: card‚É‚æ‚éˆÙí‘Ï«?“®\n",sd->bl.id);
+ return 0;
+ }
+ }
+ }
+ else if(bl->type == BL_MOB) {
+ }
+ else {
+ if(battle_config.error_log)
+ printf("skill_status_change_start: neither MOB nor PC !\n");
+ return 0;
+ }
+
+ if(type==SC_FREEZE && undead_flag && !(flag&1))
+ return 0;
+
+ if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) &&
+ sc_data[type].timer != -1 && sc_data[type].val2 && !val2)
+ return 0;
+
+ if(mode & 0x20 && (type==SC_STONE || type==SC_FREEZE ||
+ type==SC_STAN || type==SC_SLEEP || type==SC_SILENCE || type==SC_QUAGMIRE || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS || type == SC_PROVOKE ||
+ (type == SC_BLESSING && (undead_flag || race == 6))) && !(flag&1)){
+ /* ƒ{ƒX‚É‚Í?‚©‚È‚¢(‚½‚¾‚µƒJ?ƒh‚É‚æ‚é?‰Ê‚Í“K—p‚³‚ê‚é) */
+ return 0;
+ }
+ if(type==SC_FREEZE || type==SC_STAN || type==SC_SLEEP)
+ battle_stopwalking(bl,1);
+
+ if(sc_data[type].timer != -1){ /* ‚·‚Å‚É“¯‚¶ˆÙí‚É‚È‚Á‚Ä‚¢‚éꇃ^ƒCƒ}‰ðœ */
+ if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION &&
+ type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2
+ && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
+ return 0;
+ if(type >=SC_STAN && type <= SC_BLIND)
+ return 0;/* ?‚¬‘«‚µ‚ª‚Å‚«‚È‚¢?‘ÔˆÙí‚Å‚ ‚鎞‚Í?‘ÔˆÙí‚ðs‚í‚È‚¢ */
+ if(type == SC_GRAFFITI){ //ˆÙí’†‚É‚à‚¤ˆê“x?‘ÔˆÙí‚É‚È‚Á‚½Žž‚ɉ𜂵‚Ä‚©‚çÄ“x‚©‚©‚é
+ skill_status_change_end(bl,type,-1);
+ }else{
+ (*sc_count)--;
+ delete_timer(sc_data[type].timer, skill_status_change_timer);
+ sc_data[type].timer = -1;
+ }
+ }
+
+ switch(type){ /* ˆÙí‚ÌŽí—Þ‚²‚Æ‚Ì?— */
+ case SC_PROVOKE: /* ƒvƒƒ{ƒbƒN */
+ calc_flag = 1;
+ if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
+ break;
+ case SC_ENDURE: /* ƒCƒ“ƒfƒ…ƒA */
+ if(tick <= 0) tick = 1000 * 60;
+ val2 = 7; // [Celest]
+ break;
+ case SC_CONCENTRATE: /* W’†—ÍŒüã */
+ calc_flag = 1;
+ break;
+ case SC_BLESSING: /* ƒuƒŒƒbƒVƒ“ƒO */
+ {
+ if(bl->type == BL_PC || (!undead_flag && race != 6)) {
+ if(sc_data[SC_CURSE].timer!=-1 )
+ skill_status_change_end(bl,SC_CURSE,-1);
+ if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2 == 0)
+ skill_status_change_end(bl,SC_STONE,-1);
+ }
+ calc_flag = 1;
+ }
+ break;
+ case SC_ANGELUS: /* ƒAƒ“ƒ[ƒ‹ƒX */
+ calc_flag = 1;
+ break;
+ case SC_INCREASEAGI: /* ‘¬“x㸠*/
+ calc_flag = 1;
+ if(sc_data[SC_DECREASEAGI].timer!=-1 )
+ skill_status_change_end(bl,SC_DECREASEAGI,-1);
+ if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ skill_status_change_end(bl,SC_WINDWALK,-1);
+ break;
+ case SC_DECREASEAGI: /* ‘¬“xŒ¸­ */
+ calc_flag = 1;
+ if(sc_data[SC_INCREASEAGI].timer!=-1 )
+ skill_status_change_end(bl,SC_INCREASEAGI,-1);
+ break;
+ case SC_SIGNUMCRUCIS: /* ƒVƒOƒiƒ€ƒNƒ‹ƒVƒX */
+ calc_flag = 1;
+// val2 = 14 + val1;
+ val2 = 10 + val1*2;
+ tick = 600*1000;
+ clif_emotion(bl,4);
+ break;
+ case SC_SLOWPOISON:
+ if(sc_data[SC_POISON].timer == -1 )
+ return 0;
+ break;
+ case SC_TWOHANDQUICKEN: /* 2HQ */
+ *opt3 |= 1;
+ calc_flag = 1;
+ break;
+ case SC_ADRENALINE: /* ƒAƒhƒŒƒiƒŠƒ“ƒ‰ƒbƒVƒ… */
+ calc_flag = 1;
+ break;
+ case SC_WEAPONPERFECTION: /* ƒEƒFƒ|ƒ“ƒp?ƒtƒFƒNƒVƒ‡ƒ“ */
+ if(battle_config.party_skill_penaly && !val2) tick /= 5;
+ break;
+ case SC_OVERTHRUST: /* ƒI?ƒo?ƒXƒ‰ƒXƒg */
+ *opt3 |= 2;
+ if(battle_config.party_skill_penaly && !val2) tick /= 10;
+ break;
+ case SC_MAXIMIZEPOWER: /* ƒ}ƒLƒVƒ}ƒCƒYƒpƒ?(SP‚ª1Œ¸‚鎞ŠÔ,val2‚É‚à) */
+ if(bl->type == BL_PC)
+ val2 = tick;
+ else
+ tick = 5000*val1;
+ break;
+ case SC_ENCPOISON: /* ƒGƒ“ƒ`ƒƒƒ“ƒgƒ|ƒCƒYƒ“ */
+ calc_flag = 1;
+ val2=(((val1 - 1) / 2) + 3)*100; /* “Å•t?Šm—¦ */
+ skill_encchant_eremental_end(bl,SC_ENCPOISON);
+ break;
+ case SC_EDP: // [Celest]
+ calc_flag = 1;
+ break;
+ case SC_POISONREACT: /* ƒ|ƒCƒYƒ“ƒŠƒAƒNƒg */
+ val2=val1/2 + val1%2; // [Celest]
+ break;
+ case SC_IMPOSITIO: /* ƒCƒ“ƒ|ƒVƒeƒBƒIƒ}ƒkƒX */
+ calc_flag = 1;
+ break;
+ case SC_ASPERSIO: /* ƒAƒXƒyƒ‹ƒVƒI */
+ skill_encchant_eremental_end(bl,SC_ASPERSIO);
+ break;
+ case SC_SUFFRAGIUM: /* ƒTƒtƒ‰ƒMƒ€ */
+ case SC_BENEDICTIO: /* ¹? */
+ case SC_MAGNIFICAT: /* ƒ}ƒOƒjƒtƒBƒJ?ƒg */
+ case SC_AETERNA: /* ƒG?ƒeƒ‹ƒi */
+ break;
+ case SC_ENERGYCOAT: /* ƒGƒiƒW?ƒR?ƒg */
+ *opt3 |= 4;
+ break;
+ case SC_MAGICROD:
+ val2 = val1*20;
+ break;
+ case SC_KYRIE: /* ƒLƒŠƒGƒGƒŒƒCƒ\ƒ“ */
+ val2 = battle_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* ‘Ï‹v“x */
+ val3 = (val1 / 2 + 5); /* ‰ñ? */
+// -- moonsoul (added to undo assumptio status if target has it)
+ if(sc_data[SC_ASSUMPTIO].timer!=-1 )
+ skill_status_change_end(bl,SC_ASSUMPTIO,-1);
+ break;
+ case SC_MINDBREAKER:
+ calc_flag = 1;
+ if(tick <= 0) tick = 1000; /* (ƒI?ƒgƒo?ƒT?ƒN) */
+ case SC_GLORIA: /* ƒOƒƒŠƒA */
+ calc_flag = 1;
+ break;
+ case SC_LOUD: /* ƒ‰ƒEƒhƒ{ƒCƒX */
+ calc_flag = 1;
+ break;
+ case SC_TRICKDEAD: /* Ž€‚ñ‚¾‚Ó‚è */
+ break;
+ case SC_QUAGMIRE: /* ƒNƒ@ƒOƒ}ƒCƒA */
+ calc_flag = 1;
+ if(sc_data[SC_CONCENTRATE].timer!=-1 ) /* W’†—ÍŒüã‰ðœ */
+ skill_status_change_end(bl,SC_CONCENTRATE,-1);
+ if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
+ skill_status_change_end(bl,SC_INCREASEAGI,-1);
+ if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
+ skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1);
+ if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
+ skill_status_change_end(bl,SC_SPEARSQUICKEN,-1);
+ if(sc_data[SC_ADRENALINE].timer!=-1 )
+ skill_status_change_end(bl,SC_ADRENALINE,-1);
+ if(sc_data[SC_LOUD].timer!=-1 )
+ skill_status_change_end(bl,SC_LOUD,-1);
+ if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
+ skill_status_change_end(bl,SC_TRUESIGHT,-1);
+ if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ skill_status_change_end(bl,SC_WINDWALK,-1);
+ if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
+ skill_status_change_end(bl,SC_CARTBOOST,-1);
+ break;
+ case SC_FLAMELAUNCHER: /* ƒtƒŒ?ƒ€ƒ‰ƒ“ƒ`ƒƒ? */
+ skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER);
+ break;
+ case SC_FROSTWEAPON: /* ƒtƒƒXƒgƒEƒFƒ|ƒ“ */
+ skill_encchant_eremental_end(bl,SC_FROSTWEAPON);
+ break;
+ case SC_LIGHTNINGLOADER: /* ƒ‰ƒCƒgƒjƒ“ƒOƒ?ƒ_? */
+ skill_encchant_eremental_end(bl,SC_LIGHTNINGLOADER);
+ break;
+ case SC_SEISMICWEAPON: /* ƒTƒCƒYƒ~ƒbƒNƒEƒFƒ|ƒ“ */
+ skill_encchant_eremental_end(bl,SC_SEISMICWEAPON);
+ break;
+ case SC_DEVOTION: /* ƒfƒBƒ{?ƒVƒ‡ƒ“ */
+ calc_flag = 1;
+ break;
+ case SC_PROVIDENCE: /* ƒvƒƒ”ƒBƒfƒ“ƒX */
+ calc_flag = 1;
+ val2=val1*5;
+ break;
+ case SC_REFLECTSHIELD:
+ val2=10+val1*3;
+ break;
+ case SC_STRIPWEAPON:
+ case SC_STRIPSHIELD:
+ case SC_STRIPARMOR:
+ case SC_STRIPHELM:
+ case SC_CP_WEAPON:
+ case SC_CP_SHIELD:
+ case SC_CP_ARMOR:
+ case SC_CP_HELM:
+ break;
+
+ case SC_AUTOSPELL: /* ƒI?ƒgƒXƒyƒ‹ */
+ val4 = 5 + val1*2;
+ break;
+
+ case SC_VOLCANO:
+ calc_flag = 1;
+ val3 = val1*10;
+ val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
+ break;
+ case SC_DELUGE:
+ calc_flag = 1;
+ val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) );
+ val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
+ break;
+ case SC_VIOLENTGALE:
+ calc_flag = 1;
+ val3 = val1*3;
+ val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
+ break;
+
+ case SC_SPEARSQUICKEN: /* ƒXƒsƒAƒNƒCƒbƒPƒ“ */
+ calc_flag = 1;
+ val2 = 20+val1;
+ *opt3 |= 1;
+ break;
+ case SC_COMBO:
+ break;
+ case SC_BLADESTOP_WAIT: /* ”’nŽæ‚è(‘Ò‚¿) */
+ break;
+ case SC_BLADESTOP: /* ”’nŽæ‚è */
+ if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1);
+ *opt3 |= 32;
+ break;
+
+ case SC_LULLABY: /* ŽqŽç‰S */
+ val2 = 11;
+ break;
+ case SC_RICHMANKIM:
+ break;
+ case SC_ETERNALCHAOS: /* ƒGƒ^?ƒiƒ‹ƒJƒIƒX */
+ calc_flag = 1;
+ break;
+ case SC_DRUMBATTLE: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ calc_flag = 1;
+ val2 = (val1+1)*25;
+ val3 = (val1+1)*2;
+ break;
+ case SC_NIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ calc_flag = 1;
+ val2 = (val1+2)*50;
+ val3 = (val1+2)*25;
+ break;
+ case SC_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ break;
+ case SC_INTOABYSS: /* [•£‚Ì’†‚É */
+ break;
+ case SC_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ calc_flag = 1;
+ val2 = 40 + val1*5;
+ val3 = val1*10;
+ break;
+ case SC_DISSONANCE: /* •s‹¦˜a‰¹ */
+ val2 = 10;
+ break;
+ case SC_WHISTLE: /* Œû“J */
+ calc_flag = 1;
+ break;
+ case SC_ASSNCROS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ calc_flag = 1;
+ break;
+ case SC_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
+ break;
+ case SC_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ calc_flag = 1;
+ break;
+ case SC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ val2 = 10;
+ break;
+ case SC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ calc_flag = 1;
+ break;
+ case SC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Å */
+ calc_flag = 1;
+ if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* ‘¬“x㸉ðœ */
+ skill_status_change_end(bl,SC_INCREASEAGI,-1);
+ if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
+ skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1);
+ if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
+ skill_status_change_end(bl,SC_SPEARSQUICKEN,-1);
+ if(sc_data[SC_ADRENALINE].timer!=-1 )
+ skill_status_change_end(bl,SC_ADRENALINE,-1);
+ if(sc_data[SC_ASSNCROS].timer!=-1 )
+ skill_status_change_end(bl,SC_ASSNCROS,-1);
+ if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* ƒgƒDƒ‹?ƒTƒCƒg */
+ skill_status_change_end(bl,SC_TRUESIGHT,-1);
+ if(sc_data[SC_WINDWALK].timer!=-1 ) /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ skill_status_change_end(bl,SC_WINDWALK,-1);
+ if(sc_data[SC_CARTBOOST].timer!=-1 ) /* ƒJ?ƒgƒu?ƒXƒg */
+ skill_status_change_end(bl,SC_CARTBOOST,-1);
+ break;
+ case SC_FORTUNE: /* K‰^‚̃LƒX */
+ calc_flag = 1;
+ break;
+ case SC_SERVICE4U: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ calc_flag = 1;
+ break;
+ case SC_DANCING: /* ƒ_ƒ“ƒX/‰‰‘t’† */
+ calc_flag = 1;
+ val3= tick / 1000;
+ tick = 1000;
+ break;
+
+ case SC_EXPLOSIONSPIRITS: // ”š—ô”g“®
+ calc_flag = 1;
+ val2 = 75 + 25*val1;
+ *opt3 |= 8;
+ break;
+ case SC_STEELBODY: // ‹à„
+ calc_flag = 1;
+ *opt3 |= 16;
+ break;
+ case SC_EXTREMITYFIST: /* ˆ¢C—…”e™€Œ */
+ break;
+ case SC_AUTOCOUNTER:
+ val3 = val4 = 0;
+ break;
+
+ case SC_SPEEDPOTION0: /* ?‘¬ƒ|?ƒVƒ‡ƒ“ */
+ case SC_SPEEDPOTION1:
+ case SC_SPEEDPOTION2:
+ calc_flag = 1;
+ tick = 1000 * tick;
+ val2 = 5*(2+type-SC_SPEEDPOTION0);
+ break;
+
+ /* atk & matk potions [Valaris] */
+ case SC_ATKPOT:
+ case SC_MATKPOT:
+ calc_flag = 1;
+ tick = 1000 * tick;
+ break;
+ case SC_WEDDING: //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä?‚­‚Ì‚ª?‚¢‚Æ‚©)
+ {
+ time_t timer;
+
+ calc_flag = 1;
+ tick = 10000;
+ if(!val2)
+ val2 = time(&timer);
+ }
+ break;
+ case SC_NOCHAT: //ƒ`ƒƒƒbƒg‹ÖŽ~?‘Ô
+ {
+ time_t timer;
+
+ if(!battle_config.muting_players)
+ break;
+
+ tick = 60000;
+ if(!val2)
+ val2 = time(&timer);
+ updateflag = SP_MANNER;
+ }
+ break;
+ case SC_SELFDESTRUCTION: //Ž©”š
+ clif_skillcasting(bl,bl->id, bl->id,0,0,331,skill_get_time(val2,val1));
+ val3 = tick / 1000;
+ tick = 1000;
+ break;
+
+ /* option1 */
+ case SC_STONE: /* Ή» */
+ if(!(flag&2)) {
+ int sc_def = battle_get_mdef(bl)*200;
+ tick = tick - sc_def;
+ }
+ val3 = tick/1000;
+ if(val3 < 1) val3 = 1;
+ tick = 5000;
+ val2 = 1;
+ break;
+ case SC_SLEEP: /* ‡–° */
+ if(!(flag&2)) {
+// int sc_def = 100 - (battle_get_int(bl) + battle_get_luk(bl)/3);
+// tick = tick * sc_def / 100;
+// if(tick < 1000) tick = 1000;
+ tick = 30000;//‡–°‚̓Xƒe?ƒ^ƒX‘Ï«‚É?‚í‚炸30•b
+ }
+ break;
+ case SC_FREEZE: /* “€Œ‹ */
+ if(!(flag&2)) {
+ int sc_def = 100 - battle_get_mdef(bl);
+ tick = tick * sc_def / 100;
+ }
+ break;
+ case SC_STAN: /* ƒXƒ^ƒ“ival2‚Ƀ~ƒŠ•bƒZƒbƒgj */
+ if(!(flag&2)) {
+ int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/3);
+ tick = tick * sc_def / 100;
+ }
+ break;
+
+ /* option2 */
+ case SC_POISON: /* “Å */
+ calc_flag = 1;
+ if(!(flag&2)) {
+ int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/5);
+ tick = tick * sc_def / 100;
+ }
+ val3 = tick/1000;
+ if(val3 < 1) val3 = 1;
+ tick = 1000;
+ break;
+ case SC_SILENCE: /* ’¾?iƒŒƒbƒNƒXƒfƒr?ƒij */
+ if(!(flag&2)) {
+ int sc_def = 100 - battle_get_vit(bl);
+ tick = tick * sc_def / 100;
+ }
+ break;
+ case SC_BLIND: /* ˆÃ? */
+ calc_flag = 1;
+ if(!(flag&2)) {
+ int sc_def = battle_get_lv(bl)/10 + battle_get_int(bl)/15;
+ tick = 30000 - sc_def;
+ }
+ break;
+ case SC_CURSE:
+ calc_flag = 1;
+ if(!(flag&2)) {
+ int sc_def = 100 - battle_get_vit(bl);
+ tick = tick * sc_def / 100;
+ }
+ break;
+
+ /* option */
+ case SC_HIDING: /* ƒnƒCƒfƒBƒ“ƒO */
+ calc_flag = 1;
+ if(bl->type == BL_PC) {
+ val2 = tick / 1000; /* Ž?ŽžŠÔ */
+ tick = 1000;
+ }
+ break;
+ case SC_CHASEWALK:
+ case SC_CLOAKING: /* ƒNƒ?ƒLƒ“ƒO */
+ calc_flag = 1; // [Celest]
+ if(bl->type == BL_PC)
+ val2 = tick;
+ else
+ tick = 5000*val1;
+ break;
+ case SC_SIGHT: /* ƒTƒCƒg/ƒ‹ƒAƒt */
+ case SC_RUWACH:
+ val2 = tick/250;
+ tick = 10;
+ break;
+
+ /* ƒZ?ƒtƒeƒBƒEƒH?ƒ‹Aƒjƒ…?ƒ} */
+ case SC_SAFETYWALL: case SC_PNEUMA:
+ tick=((struct skill_unit *)val2)->group->limit;
+ break;
+
+ /* ƒAƒ“ƒNƒ‹ */
+ case SC_ANKLE:
+ break;
+
+ /* ƒEƒH?ƒ^?ƒ{?ƒ‹ */
+ case SC_WATERBALL:
+ tick=150;
+ if(val1>5) //ƒŒƒxƒ‹‚ª5ˆÈã‚ÌꇂÍ25?‚ɧŒÀ(1?–Ú‚Í‚·‚Å‚É‘Å‚Á‚Ä‚é‚Ì‚Å-1)
+ val3=5*5-1;
+ else
+ val3= (val1|1)*(val1|1)-1;
+ break;
+
+ /* ƒXƒLƒ‹‚¶‚á‚È‚¢/ŽžŠÔ‚É?ŒW‚µ‚È‚¢ */
+ case SC_RIDING:
+ calc_flag = 1;
+ tick = 600*1000;
+ break;
+ case SC_FALCON:
+ case SC_WEIGHT50:
+ case SC_WEIGHT90:
+ case SC_BROKNWEAPON:
+ case SC_BROKNARMOR:
+ tick=600*1000;
+ break;
+
+ case SC_AUTOGUARD:
+ {
+ int i,t;
+ for(i=val2=0;i<val1;i++) {
+ t = 5-(i>>1);
+ val2 += (t < 0)? 1:t;
+ }
+ }
+ break;
+
+ case SC_DEFENDER:
+ calc_flag = 1;
+ val2 = 5 + val1*15;
+ break;
+
+ case SC_KEEPING:
+ case SC_BARRIER:
+ calc_flag = 1;
+ case SC_HALLUCINATION:
+ break;
+ case SC_CONCENTRATION: /* ƒRƒ“ƒZƒ“ƒgƒŒ?ƒVƒ‡ƒ“ */
+ *opt3 |= 1;
+ calc_flag = 1;
+ break;
+ case SC_TENSIONRELAX: /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ calc_flag = 1;
+ if(bl->type == BL_PC) {
+ tick = 10000;
+ }
+ break;
+ case SC_AURABLADE: /* ƒI?ƒ‰ƒuƒŒ?ƒh */
+ case SC_PARRYING: /* ƒpƒŠƒCƒ“ƒO */
+// case SC_ASSUMPTIO: /* */
+ case SC_HEADCRUSH: /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ case SC_JOINTBEAT: /* ƒWƒ‡ƒCƒ“ƒgƒr?ƒg */
+// case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
+
+ //‚Æ‚è‚ ‚¦‚¸Žè?‚«
+ break;
+
+// -- moonsoul (for new upper class related skill status effects)
+/*
+ case SC_AURABLADE:
+ val2 = val1*10;
+ break;
+ case SC_PARRYING:
+ val2=val1*3;
+ break;
+ case SC_CONCENTRATION:
+ calc_flag=1;
+ val2=val1*10;
+ val3=val1*5;
+ break;
+ case SC_TENSIONRELAX:
+// val2 = 10;
+// val3 = 15;
+ break;
+ case SC_BERSERK:
+ calc_flag=1;
+ break;
+ case SC_ASSUMPTIO:
+ if(sc_data[SC_KYRIE].timer!=-1 )
+ skill_status_change_end(bl,SC_KYRIE,-1);
+ break;
+*/
+ case SC_WINDWALK: /* ƒEƒCƒ“ƒhƒEƒH?ƒN */
+ calc_flag = 1;
+ val2 = (val1 / 2); //Flee㸗¦
+ break;
+ case SC_BERSERK: /* ƒo?ƒT?ƒN */
+ if(sd){
+ sd->status.sp = 0;
+ clif_updatestatus(sd,SP_SP);
+ clif_status_change(bl,SC_INCREASEAGI,1); /* ƒAƒCƒRƒ“•\Ž¦ */
+ }
+ *opt3 |= 128;
+ tick = 1000;
+ calc_flag = 1;
+ break;
+ case SC_ASSUMPTIO: /* ƒAƒXƒ€ƒvƒeƒBƒI */
+ *opt3 |= 2048;
+ break;
+ case SC_MARIONETTE: /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ?ƒ‹ */
+ case SC_MARIONETTE2:
+ calc_flag = 1;
+ *opt3 |= 1024;
+ break;
+ case SC_MELTDOWN: /* ƒƒ‹ƒgƒ_ƒEƒ“ */
+ case SC_CARTBOOST: /* ƒJ?ƒgƒu?ƒXƒg */
+ case SC_TRUESIGHT: /* ƒgƒDƒ‹?ƒTƒCƒg */
+ case SC_SPIDERWEB: /* ƒXƒpƒCƒ_?ƒEƒFƒbƒu */
+ case SC_MAGICPOWER: /* –‚–@—Í?• */
+ calc_flag = 1;
+ break;
+ case SC_REJECTSWORD: /* ƒŠƒWƒFƒNƒgƒ\?ƒh */
+ val2 = 3; //3‰ñU?‚𒵂˕Ԃ·
+ break;
+ case SC_MEMORIZE: /* ƒƒ‚ƒ‰ƒCƒY */
+ val2 = 3; //3‰ñ‰r¥‚ð1/3‚É‚·‚é
+ break;
+ case SC_GRAFFITI: /* ƒOƒ‰ƒtƒBƒeƒB */
+ {
+ struct skill_unit_group *sg = skill_unitsetting(bl,RG_GRAFFITI,val1,val2,val3,0);
+ if(sg)
+ val4 = (int)sg;
+ }
+ break;
+ case SC_SPLASHER: /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ? */
+ break;
+ case SC_FOGWALL:
+ val2 = 75;
+ // calc_flag = 1; // not sure of effects yet [celest]
+ break;
+ default:
+ if(battle_config.error_log)
+ printf("UnknownStatusChange [%d]\n", type);
+ return 0;
+ }
+
+ if(bl->type==BL_PC && type<SC_SENDMAX)
+ clif_status_change(bl,type,1); /* ƒAƒCƒRƒ“•\Ž¦ */
+
+ /* option‚Ì?X */
+ switch(type){
+ case SC_STONE:
+ case SC_FREEZE:
+ case SC_STAN:
+ case SC_SLEEP:
+ battle_stopattack(bl); /* U?’âŽ~ */
+ skill_stop_dancing(bl,0); /* ‰‰‘t/ƒ_ƒ“ƒX‚Ì’†? */
+ { /* “¯Žž‚ÉŠ|‚©‚ç‚È‚¢ƒXƒe?ƒ^ƒXˆÙí‚ð‰ðœ */
+ int i;
+ for(i = SC_STONE; i <= SC_SLEEP; i++){
+ if(sc_data[i].timer != -1){
+ (*sc_count)--;
+ delete_timer(sc_data[i].timer, skill_status_change_timer);
+ sc_data[i].timer = -1;
+ }
+ }
+ }
+ if(type == SC_STONE)
+ *opt1 = 6;
+ else
+ *opt1 = type - SC_STONE + 1;
+ opt_flag = 1;
+ break;
+ case SC_POISON:
+ case SC_CURSE:
+ case SC_SILENCE:
+ case SC_BLIND:
+ *opt2 |= 1<<(type-SC_POISON);
+ opt_flag = 1;
+ break;
+ case SC_SIGNUMCRUCIS:
+ *opt2 |= 0x40;
+ opt_flag = 1;
+ break;
+ case SC_HIDING:
+ case SC_CLOAKING:
+ battle_stopattack(bl); /* U?’âŽ~ */
+ *option |= ((type==SC_HIDING)?2:4);
+ opt_flag =1 ;
+ break;
+ case SC_CHASEWALK:
+ battle_stopattack(bl); /* U?’âŽ~ */
+ *option |= 16388;
+ opt_flag =1 ;
+ break;
+ case SC_SIGHT:
+ *option |= 1;
+ opt_flag = 1;
+ break;
+ case SC_RUWACH:
+ *option |= 8192;
+ opt_flag = 1;
+ break;
+ case SC_WEDDING:
+ *option |= 4096;
+ opt_flag = 1;
+ }
+
+ if(opt_flag) /* option‚Ì?X */
+ clif_changeoption(bl);
+
+ (*sc_count)++; /* ƒXƒe?ƒ^ƒXˆÙí‚Ì? */
+
+ sc_data[type].val1 = val1;
+ sc_data[type].val2 = val2;
+ sc_data[type].val3 = val3;
+ sc_data[type].val4 = val4;
+ /* ƒ^ƒCƒ}?Ý’è */
+ sc_data[type].timer = add_timer(
+ gettick() + tick, skill_status_change_timer, bl->id, type);
+
+ if(bl->type==BL_PC && calc_flag)
+ pc_calcstatus(sd,0); /* ƒXƒe?ƒ^ƒXÄŒvŽZ */
+
+ if(bl->type==BL_PC && updateflag)
+ clif_updatestatus(sd,updateflag); /* ƒXƒe?ƒ^ƒX‚ðƒNƒ‰ƒCƒAƒ“ƒg‚É‘—‚é */
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒe?ƒ^ƒXˆÙí‘S‰ðœ
+ *------------------------------------------
+ */
+int skill_status_change_clear(struct block_list *bl, int type)
+{
+ struct status_change* sc_data;
+ short *sc_count, *option, *opt1, *opt2, *opt3;
+ int i;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, sc_data = battle_get_sc_data(bl));
+ nullpo_retr(0, sc_count = battle_get_sc_count(bl));
+ nullpo_retr(0, option = battle_get_option(bl));
+ nullpo_retr(0, opt1 = battle_get_opt1(bl));
+ nullpo_retr(0, opt2 = battle_get_opt2(bl));
+ nullpo_retr(0, opt3 = battle_get_opt3(bl));
+
+ if (*sc_count == 0)
+ return 0;
+ for(i = 0; i < MAX_STATUSCHANGE; i++){
+ if(sc_data[i].timer != -1){ /* ˆÙ킪‚ ‚é‚È‚çƒ^ƒCƒ}?‚ð휂·‚é */
+/*
+ delete_timer(sc_data[i].timer, skill_status_change_timer);
+ sc_data[i].timer = -1;
+
+ if (!type && i < SC_SENDMAX)
+ clif_status_change(bl, i, 0);
+*/
+
+ skill_status_change_end(bl, i, -1);
+ }
+ }
+ *sc_count = 0;
+ *opt1 = 0;
+ *opt2 = 0;
+ *opt3 = 0;
+ *option &= OPTION_MASK;
+
+ if (night_flag == 1 && type == BL_PC) // by [Yor]
+ *opt2 |= STATE_BLIND;
+
+ if(!type || type&2)
+ clif_changeoption(bl);
+
+ return 0;
+}
+
+/* ƒNƒ?ƒLƒ“ƒO?¸iŽü‚è‚Ɉړ®•s‰Â”\’n?‚ª‚ ‚é‚©j */
+int skill_check_cloaking(struct block_list *bl)
+{
+ struct map_session_data *sd=NULL;
+ static int dx[]={-1, 0, 1,-1, 1,-1, 0, 1};
+ static int dy[]={-1,-1,-1, 0, 0, 1, 1, 1};
+ int end=1,i;
+
+ nullpo_retr(0, bl);
+ sd=(struct map_session_data *)bl; //missing sd [Found by Celest, commited by Aria]
+
+ if(pc_checkskill(sd,AS_CLOAKING)>2)
+ return 0;
+ if(bl->type == BL_PC && battle_config.pc_cloak_check_type&1)
+ return 0;
+ if(bl->type == BL_MOB && battle_config.monster_cloak_check_type&1)
+ return 0;
+ for(i=0;i<sizeof(dx)/sizeof(dx[0]);i++){
+ int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]);
+ if(c==1 || c==5) end=0;
+ }
+ if(end){
+ skill_status_change_end(bl, SC_CLOAKING, -1);
+ *battle_get_option(bl)&=~4; /* ”O‚Ì‚½‚ß‚Ì?— */
+ }
+ return end;
+}
+
+int skill_type_cloaking(struct block_list *bl)
+{
+ static int dx[]={-1, 0, 1,-1, 1,-1, 0, 1};
+ static int dy[]={-1,-1,-1, 0, 0, 1, 1, 1};
+ int end=1,i;
+
+ nullpo_retr(0, bl);
+ if(bl->type == BL_PC && battle_config.pc_cloak_check_type&1)
+ return 0;
+ if(bl->type == BL_MOB && battle_config.monster_cloak_check_type&1)
+ return 0;
+ for(i=0; i<sizeof(dx)/sizeof(dx[0]); i++)
+ {
+ int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]);
+ if(c==1 || c==5) end=0;
+ }
+ return end;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg
+ *----------------------------------------------------------------------------
+ */
+
+/*==========================================
+ * ‰‰‘t/ƒ_ƒ“ƒXƒXƒLƒ‹‚©‚Ç‚¤‚©”»’è
+ * ˆø? ƒXƒLƒ‹ID
+ * ?‚è ƒ_ƒ“ƒX‚¶‚á‚È‚¢=0 ‡‘t=2 ‚»‚êˆÈŠO‚̃_ƒ“ƒX=1
+ *------------------------------------------
+ */
+int skill_is_danceskill(int id)
+{
+ int i;
+ switch(id){
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BD_RAGNAROK: /* _?‚Ì?¨ */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ i=2;
+ break;
+ case BA_DISSONANCE: /* •s‹¦˜a‰¹ */
+ case BA_FROSTJOKE: /* Š¦‚¢ƒWƒ‡?ƒN */
+ case BA_WHISTLE: /* Œû“J */
+ case BA_ASSASSINCROSS: /* —[—z‚̃AƒTƒVƒ“ƒNƒƒX */
+ case BA_POEMBRAGI: /* ƒuƒ‰ƒM‚ÌŽ */
+ case BA_APPLEIDUN: /* ƒCƒhƒDƒ“‚Ì—ÑŒç */
+ case DC_UGLYDANCE: /* Ž©•ªŸŽè‚ȃ_ƒ“ƒX */
+ case DC_SCREAM: /* ƒXƒNƒŠ?ƒ€ */
+ case DC_HUMMING: /* ƒnƒ~ƒ“ƒO */
+ case DC_DONTFORGETME: /* Ž„‚ð–Y‚ê‚È‚¢‚Åc */
+ case DC_FORTUNEKISS: /* K‰^‚̃LƒX */
+ case DC_SERVICEFORYOU: /* ƒT?ƒrƒXƒtƒH?ƒ†? */
+ i=1;
+ break;
+ default:
+ i=0;
+ }
+ return i;
+}
+
+/*==========================================
+ * ‰‰‘t/ƒ_ƒ“ƒX‚ð‚â‚ß‚é
+ * flag 1‚Ň‘t’†‚È‚ç‘Š•û‚Ƀ†ƒjƒbƒg‚ð”C‚¹‚é
+ *
+ *------------------------------------------
+ */
+void skill_stop_dancing(struct block_list *src, int flag)
+{
+ struct status_change* sc_data;
+ struct skill_unit_group* group;
+
+ nullpo_retv(src);
+
+ sc_data=battle_get_sc_data(src);
+ if(sc_data && sc_data[SC_DANCING].timer==-1)
+ return;
+ group=(struct skill_unit_group *)sc_data[SC_DANCING].val2; //ƒ_ƒ“ƒX‚̃XƒLƒ‹ƒ†ƒjƒbƒgID‚Íval2‚É“ü‚Á‚Ä‚é
+ if(group && src->type==BL_PC && sc_data && sc_data[SC_DANCING].val4){ //‡‘t’†?
+ struct map_session_data* dsd=map_id2sd(sc_data[SC_DANCING].val4); //‘Š•û‚ÌsdŽæ“¾
+ if(flag){ //ƒƒOƒAƒEƒg‚ȂǕЕû‚ª—Ž‚¿‚Ä‚à‰‰‘t‚ª??‚³‚ê‚é
+ if(dsd && src->id == group->src_id){ //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ª—Ž‚¿‚é
+ group->src_id=sc_data[SC_DANCING].val4; //‘Š•û‚ɃOƒ‹?ƒv‚ð”C‚¹‚é
+ if(flag&1) //ƒƒOƒAƒEƒg
+ dsd->sc_data[SC_DANCING].val4=0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
+ if(flag&2) //ƒnƒG”ò‚Ñ‚È‚Ç
+ return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
+ }else if(dsd && dsd->bl.id == group->src_id){ //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ª—Ž‚¿‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
+ if(flag&1) //ƒƒOƒAƒEƒg
+ dsd->sc_data[SC_DANCING].val4=0; //‘Š•û‚Ì‘Š•û‚ð0‚É‚µ‚ć‘tI—¹¨’Êí‚̃_ƒ“ƒX?‘Ô
+ if(flag&2) //ƒnƒG”ò‚Ñ‚È‚Ç
+ return; //‡‘t‚àƒ_ƒ“ƒX?‘Ô‚àI—¹‚³‚¹‚È‚¢•ƒXƒLƒ‹ƒ†ƒjƒbƒg‚Í’u‚¢‚Ä‚¯‚Ú‚è
+ }
+ skill_status_change_end(src,SC_DANCING,-1);//Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
+ //‚»‚µ‚ăOƒ‹?ƒv‚ÍÁ‚³‚È‚¢•Á‚³‚È‚¢‚̂ŃXƒe?ƒ^ƒXŒvŽZ‚à‚¢‚ç‚È‚¢H
+ return;
+ }else{
+ if(dsd && src->id == group->src_id){ //ƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚éPC‚ªŽ~‚ß‚é
+ skill_status_change_end((struct block_list *)dsd,SC_DANCING,-1);//‘ŠŽè‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
+ }
+ if(dsd && dsd->bl.id == group->src_id){ //‘Š•û‚ªƒOƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚éPC‚ªŽ~‚ß‚é(Ž©•ª‚̓Oƒ‹?ƒv‚ðŽ‚Á‚Ä‚¢‚È‚¢)
+ skill_status_change_end(src,SC_DANCING,-1);//Ž©•ª‚̃Xƒe?ƒ^ƒX‚ðI—¹‚³‚¹‚é
+ }
+ }
+ }
+ if(flag&2 && group && src->type==BL_PC){ //ƒnƒG‚Å”ò‚ñ‚¾‚Æ‚«‚Æ‚©‚̓†ƒjƒbƒg‚à”ò‚Ô
+ struct map_session_data *sd = (struct map_session_data *)src;
+ skill_unit_move_unit_group(group, sd->bl.m,(sd->to_x - sd->bl.x),(sd->to_y - sd->bl.y));
+ return;
+ }
+ skill_delunitgroup(group);
+ if(src->type==BL_PC)
+ pc_calcstatus((struct map_session_data *)src,0);
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒg‰Šú‰»
+ *------------------------------------------
+ */
+struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y)
+{
+ struct skill_unit *unit;
+
+ nullpo_retr(NULL, group);
+ nullpo_retr(NULL, unit=&group->unit[idx]);
+
+ if(!unit->alive)
+ group->alive_count++;
+
+ unit->bl.id=map_addobject(&unit->bl);
+ unit->bl.type=BL_SKILL;
+ unit->bl.m=group->map;
+ unit->bl.x=x;
+ unit->bl.y=y;
+ unit->group=group;
+ unit->val1=unit->val2=0;
+ unit->alive=1;
+
+ map_addblock(&unit->bl);
+ clif_skill_setunit(unit);
+ return unit;
+}
+
+int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap );
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgíœ
+ *------------------------------------------
+ */
+int skill_delunit(struct skill_unit *unit)
+{
+ struct skill_unit_group *group;
+ int range;
+
+ nullpo_retr(0, unit);
+ if(!unit->alive)
+ return 0;
+ nullpo_retr(0, group=unit->group);
+
+ /* onlimitƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
+ skill_unit_onlimit( unit,gettick() );
+
+ /* ondeleteƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
+ range=group->range;
+ map_foreachinarea( skill_unit_timer_sub_ondelete, unit->bl.m,
+ unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0,
+ &unit->bl,gettick() );
+
+ clif_skill_delunit(unit);
+
+ unit->group=NULL;
+ unit->alive=0;
+ map_delobjectnofree(unit->bl.id);
+ if(group->alive_count>0 && (--group->alive_count)<=0)
+ skill_delunitgroup(group);
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‰Šú‰»
+ *------------------------------------------
+ */
+static int skill_unit_group_newid=10;
+struct skill_unit_group *skill_initunitgroup(struct block_list *src,
+ int count,int skillid,int skilllv,int unit_id)
+{
+ if(skilllv <= 0) return 0;
+ int i;
+ struct skill_unit_group *group=NULL, *list=NULL;
+ int maxsug=0;
+
+ nullpo_retr(NULL, src);
+
+ if(src->type==BL_PC){
+ list=((struct map_session_data *)src)->skillunit;
+ maxsug=MAX_SKILLUNITGROUP;
+ }else if(src->type==BL_MOB){
+ list=((struct mob_data *)src)->skillunit;
+ maxsug=MAX_MOBSKILLUNITGROUP;
+ }else if(src->type==BL_PET){
+ list=((struct pet_data *)src)->skillunit;
+ maxsug=MAX_MOBSKILLUNITGROUP;
+ }
+ if(list){
+ for(i=0;i<maxsug;i++) /* ‹ó‚¢‚Ä‚¢‚é‚à‚Ì?õ */
+ if(list[i].group_id==0){
+ group=&list[i];
+ break;
+ }
+
+ if(group==NULL){ /* ‹ó‚¢‚Ä‚È‚¢‚̂Ō¢‚à‚Ì?õ */
+ int j=0;
+ unsigned maxdiff=0,x,tick=gettick();
+ for(i=0;i<maxsug;i++)
+ if((x=DIFF_TICK(tick,list[i].tick))>maxdiff){
+ maxdiff=x;
+ j=i;
+ }
+ skill_delunitgroup(&list[j]);
+ group=&list[j];
+ }
+ }
+
+ if(group==NULL){
+ printf("skill_initunitgroup: error unit group !\n");
+ exit(1);
+ }
+
+ group->src_id=src->id;
+ group->party_id=battle_get_party_id(src);
+ group->guild_id=battle_get_guild_id(src);
+ group->group_id=skill_unit_group_newid++;
+ if(skill_unit_group_newid<=0)
+ skill_unit_group_newid=10;
+ group->unit=(struct skill_unit *)aCalloc(count,sizeof(struct skill_unit));
+ group->unit_count=count;
+ group->val1=group->val2=0;
+ group->skill_id=skillid;
+ group->skill_lv=skilllv;
+ group->unit_id=unit_id;
+ group->map=src->m;
+ group->range=0;
+ group->limit=10000;
+ group->interval=1000;
+ group->tick=gettick();
+ group->valstr=NULL;
+
+ if( skill_is_danceskill(skillid) ){
+ struct map_session_data *sd = NULL;
+ if(src->type==BL_PC && (sd=(struct map_session_data *)src) ){
+ sd->skillid_dance=skillid;
+ sd->skilllv_dance=skilllv;
+ }
+ skill_status_change_start(src,SC_DANCING,skillid,(int)group,0,0,skill_get_time(skillid,skilllv)+1000,0);
+ switch(skillid){ //‡‘tƒXƒLƒ‹‚Í‘Š•û‚ðƒ_ƒ“ƒX?‘Ô‚É‚·‚é
+ case BD_LULLABY: /* ŽqŽç‰Ì */
+ case BD_RICHMANKIM: /* ƒjƒˆƒ‹ƒh‚̉ƒ */
+ case BD_ETERNALCHAOS: /* ‰i‰“‚̬“× */
+ case BD_DRUMBATTLEFIELD: /* ?‘¾ŒÛ‚Ì‹¿‚« */
+ case BD_RINGNIBELUNGEN: /* ƒj?ƒxƒ‹ƒ“ƒO‚ÌŽw—Ö */
+ case BD_ROKISWEIL: /* ƒƒL‚Ì‹©‚Ñ */
+ case BD_INTOABYSS: /* [•£‚Ì’†‚É */
+ case BD_SIEGFRIED: /* •sŽ€g‚̃W?ƒNƒtƒŠ?ƒh */
+ case BD_RAGNAROK: /* _?‚Ì?¨ */
+ case CG_MOONLIT: /* ŒŽ–¾‚è‚Ìò‚É—Ž‚¿‚é‰Ô‚Ñ‚ç */
+ {
+ int range=1;
+ int c=0;
+ if(sd){
+ map_foreachinarea(skill_check_condition_use_sub,sd->bl.m,
+ sd->bl.x-range,sd->bl.y-range,
+ sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c);
+ }
+ }
+ }
+ }
+ return group;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒvíœ
+ *------------------------------------------
+ */
+int skill_delunitgroup(struct skill_unit_group *group)
+{
+ struct block_list *src;
+ int i;
+
+ nullpo_retr(0, group);
+ if(group->unit_count<=0)
+ return 0;
+
+ src=map_id2bl(group->src_id);
+ if( skill_is_danceskill(group->skill_id) ){ //ƒ_ƒ“ƒXƒXƒLƒ‹‚̓_ƒ“ƒX?‘Ô‚ð‰ðœ‚·‚é
+ if(src)
+ skill_status_change_end(src,SC_DANCING,-1);
+ }
+
+ group->alive_count=0;
+ if(group->unit!=NULL){
+ for(i=0;i<group->unit_count;i++)
+ if(group->unit[i].alive)
+ skill_delunit(&group->unit[i]);
+ }
+ if(group->valstr!=NULL){
+ map_freeblock(group->valstr);
+ group->valstr=NULL;
+ }
+
+ map_freeblock(group->unit); /* free()‚Ì‘Ö‚í‚è */
+ group->unit=NULL;
+ group->src_id=0;
+ group->group_id=0;
+ group->unit_count=0;
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‘Síœ
+ *------------------------------------------
+ */
+int skill_clear_unitgroup(struct block_list *src)
+{
+ struct skill_unit_group *group=NULL;
+ int maxsug=0;
+
+ nullpo_retr(0, src);
+
+ if(src->type==BL_PC){
+ group=((struct map_session_data *)src)->skillunit;
+ maxsug=MAX_SKILLUNITGROUP;
+ }else if(src->type==BL_MOB){
+ group=((struct mob_data *)src)->skillunit;
+ maxsug=MAX_MOBSKILLUNITGROUP;
+ }else if(src->type==BL_PET){ // [Valaris]
+ group=((struct pet_data *)src)->skillunit;
+ maxsug=MAX_MOBSKILLUNITGROUP;
+ }
+ if(group){
+ int i;
+ for(i=0;i<maxsug;i++)
+ if(group[i].group_id>0 && group[i].src_id == src->id)
+ skill_delunitgroup(&group[i]);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ì”í‰e‹¿tick?õ
+ *------------------------------------------
+ */
+struct skill_unit_group_tickset *skill_unitgrouptickset_search(
+ struct block_list *bl,int group_id)
+{
+ int i,j=0,k,s=group_id%MAX_SKILLUNITGROUPTICKSET;
+ struct skill_unit_group_tickset *set=NULL;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_PC){
+ set=((struct map_session_data *)bl)->skillunittick;
+ }else{
+ set=((struct mob_data *)bl)->skillunittick;
+ }
+ if(set==NULL)
+ return 0;
+ for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++)
+ if( set[(k=(i+s)%MAX_SKILLUNITGROUPTICKSET)].group_id == group_id )
+ return &set[k];
+ else if( set[k].group_id==0 )
+ j=k;
+
+ return &set[j];
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒOƒ‹?ƒv‚Ì”í‰e‹¿tickíœ
+ *------------------------------------------
+ */
+int skill_unitgrouptickset_delete(struct block_list *bl,int group_id)
+{
+ int i,s=group_id%MAX_SKILLUNITGROUPTICKSET;
+ struct skill_unit_group_tickset *set=NULL,*ts;
+
+ nullpo_retr(0, bl);
+
+ if(bl->type==BL_PC){
+ set=((struct map_session_data *)bl)->skillunittick;
+ }else{
+ set=((struct mob_data *)bl)->skillunittick;
+ }
+
+ if(set!=NULL){
+
+ for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++)
+ if( (ts=&set[(i+s)%MAX_SKILLUNITGROUPTICKSET])->group_id == group_id )
+ ts->group_id=0;
+
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??“®?——p(foreachinarea)
+ *------------------------------------------
+ */
+int skill_unit_timer_sub_onplace( struct block_list *bl, va_list ap )
+{
+ struct block_list *src;
+ struct skill_unit *su;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ src=va_arg(ap,struct block_list*);
+
+ tick=va_arg(ap,unsigned int);
+ su = (struct skill_unit *)src;
+
+ if( su && su->alive ) {
+ struct skill_unit_group *sg;
+ sg = su->group;
+ if(sg && battle_check_target(src,bl,sg->target_flag )>0)
+ skill_unit_onplace( su, bl, tick );
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}?íœ?——p(foreachinarea)
+ *------------------------------------------
+ */
+int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap )
+{
+ struct block_list *src;
+ struct skill_unit *su;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ src=va_arg(ap,struct block_list*);
+
+ tick=va_arg(ap,unsigned int);
+ su = (struct skill_unit *)src;
+
+ if( su && su->alive ){
+ struct skill_unit_group *sg;
+ sg = su->group;
+ if( sg && battle_check_target(src,bl,sg->target_flag )>0 )
+ skill_unit_ondelete( su, bl, tick );
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??——p(foreachobject)
+ *------------------------------------------
+ */
+int skill_unit_timer_sub( struct block_list *bl, va_list ap )
+{
+ struct skill_unit *unit;
+ struct skill_unit_group *group;
+ int range;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, unit=(struct skill_unit *)bl);
+ nullpo_retr(0, group=unit->group);
+ tick=va_arg(ap,unsigned int);
+
+ if(!unit->alive)
+ return 0;
+
+ range=(unit->range!=0)?unit->range:group->range;
+
+ /* onplaceƒCƒxƒ“ƒgŒÄ‚Ño‚µ */
+ if(unit->alive && unit->range>=0){
+ map_foreachinarea( skill_unit_timer_sub_onplace, bl->m,
+ bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,
+ bl,tick);
+ if(group->unit_id == 0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val2){
+ map_foreachinarea( skill_idun_heal, bl->m,
+ bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,unit);
+ group->val2++;
+ }
+ }
+ /* ŽžŠÔØ‚êíœ */
+ if(unit->alive &&
+ (DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit) ){
+ switch(group->unit_id){
+
+
+
+
+
+
+ case 0x8f: /* ƒuƒ‰ƒXƒgƒ}ƒCƒ“ */
+ group->unit_id = 0x8c;
+ clif_changelook(bl,LOOK_BASE,group->unit_id);
+ group->limit=DIFF_TICK(tick+1500,group->tick);
+ unit->limit=DIFF_TICK(tick+1500,group->tick);
+ break;
+ case 0x90: /* ƒXƒLƒbƒhƒgƒ‰ƒbƒv */
+ case 0x91: /* ƒAƒ“ƒNƒ‹ƒXƒlƒA */
+ case 0x93: /* ƒ‰ƒ“ƒhƒ}ƒCƒ“ */
+ case 0x94: /* ƒVƒ‡ƒbƒNƒEƒF?ƒuƒgƒ‰ƒbƒv */
+ case 0x95: /* ƒTƒ“ƒhƒ}ƒ“ */
+ case 0x96: /* ƒtƒ‰ƒbƒVƒƒ? */
+ case 0x97: /* ƒtƒŠ?ƒWƒ“ƒOƒgƒ‰ƒbƒv */
+ case 0x98: /* ƒNƒŒƒCƒ‚ƒA?ƒgƒ‰ƒbƒv */
+ case 0x99: /* ƒg?ƒL?ƒ{ƒbƒNƒX */
+ {
+ struct block_list *src=map_id2bl(group->src_id);
+ if(group->unit_id == 0x91 && group->val2);
+ else{
+ if(src && src->type==BL_PC){
+ struct item item_tmp;
+ memset(&item_tmp,0,sizeof(item_tmp));
+ item_tmp.nameid=1065;
+ item_tmp.identify=1;
+ map_addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,NULL,NULL,NULL,0); // ?•ÔŠÒ
+ }
+ }
+ }
+ default:
+ skill_delunit(unit);
+ }
+ }
+
+ if(group->unit_id == 0x8d) {
+ unit->val1 -= 5;
+ if(unit->val1 <= 0 && unit->limit + group->tick > tick + 700)
+ unit->limit = DIFF_TICK(tick+700,group->tick);
+ }
+
+ return 0;
+}
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgƒ^ƒCƒ}??—
+ *------------------------------------------
+ */
+int skill_unit_timer( int tid,unsigned int tick,int id,int data)
+{
+ map_freeblock_lock();
+
+ map_foreachobject( skill_unit_timer_sub, BL_SKILL, tick );
+
+ map_freeblock_unlock();
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?——p(foreachinarea)
+ *------------------------------------------
+ */
+int skill_unit_out_all_sub( struct block_list *bl, va_list ap )
+{
+ struct skill_unit *unit;
+ struct skill_unit_group *group;
+ struct block_list *src;
+ int range;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, src=va_arg(ap,struct block_list*));
+ nullpo_retr(0, unit=(struct skill_unit *)bl);
+ nullpo_retr(0, group=unit->group);
+
+ tick=va_arg(ap,unsigned int);
+
+ if(!unit->alive || src->prev==NULL)
+ return 0;
+
+ range=(unit->range!=0)?unit->range:group->range;
+
+ if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 )
+ return 0;
+
+ if( src->x >= bl->x-range && src->x <= bl->x+range &&
+ src->y >= bl->y-range && src->y <= bl->y+range )
+ skill_unit_onout( unit, src, tick );
+
+ return 0;
+}
+
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?—
+ *------------------------------------------
+ */
+int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range)
+{
+ nullpo_retr(0, bl);
+
+ if( bl->prev==NULL )
+ return 0;
+
+ if(range<7)
+ range=7;
+ map_foreachinarea( skill_unit_out_all_sub,
+ bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL,
+ bl,tick );
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?——p(foreachinarea)
+ *------------------------------------------
+ */
+int skill_unit_move_sub( struct block_list *bl, va_list ap )
+{
+ struct skill_unit *unit;
+ struct skill_unit_group *group;
+ struct block_list *src;
+ int range;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, unit=(struct skill_unit *)bl);
+ nullpo_retr(0, src=va_arg(ap,struct block_list*));
+
+ tick=va_arg(ap,unsigned int);
+
+ if(!unit->alive || src->prev==NULL)
+ return 0;
+
+ if((group=unit->group) == NULL)
+ return 0;
+ range=(unit->range!=0)?unit->range:group->range;
+
+ if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 )
+ return 0;
+
+ if( src->x >= bl->x-range && src->x <= bl->x+range &&
+ src->y >= bl->y-range && src->y <= bl->y+range )
+ skill_unit_onplace( unit, src, tick );
+ else
+ skill_unit_onout( unit, src, tick );
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgˆÚ“®Žž?—
+ *------------------------------------------
+ */
+int skill_unit_move( struct block_list *bl,unsigned int tick,int range)
+{
+ nullpo_retr(0, bl);
+
+ if( bl->prev==NULL )
+ return 0;
+
+ if(range<7)
+ range=7;
+ map_foreachinarea( skill_unit_move_sub,
+ bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL,
+ bl,tick );
+
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgŽ©?‚̈ړ®Žž?—(foreachinarea)
+ *------------------------------------------
+ */
+int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap )
+{
+ struct skill_unit *unit;
+ struct skill_unit_group *group;
+ struct block_list *src;
+ int range;
+ unsigned int tick;
+
+ nullpo_retr(0, bl);
+ nullpo_retr(0, ap);
+ nullpo_retr(0, src=va_arg(ap,struct block_list*));
+ nullpo_retr(0, unit=(struct skill_unit *)src);
+ nullpo_retr(0, group=unit->group);
+
+ tick=va_arg(ap,unsigned int);
+
+ if(!unit->alive || bl->prev==NULL)
+ return 0;
+
+ range=(unit->range!=0)?unit->range:group->range;
+
+ if( range<0 || battle_check_target(src,bl,group->target_flag )<=0 )
+ return 0;
+ if( bl->x >= src->x-range && bl->x <= src->x+range &&
+ bl->y >= src->y-range && bl->y <= src->y+range )
+ skill_unit_onplace( unit, bl, tick );
+ else
+ skill_unit_onout( unit, bl, tick );
+ return 0;
+}
+
+/*==========================================
+ * ƒXƒLƒ‹ƒ†ƒjƒbƒgŽ©?‚̈ړ®Žž?—
+ * ˆø?‚̓Oƒ‹?ƒv‚ƈړ®—Ê
+ *------------------------------------------
+ */
+int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy)
+{
+ nullpo_retr(0, group);
+
+ if( group->unit_count<=0)
+ return 0;
+
+ if(group->unit!=NULL){
+ if(!battle_config.unit_movement_type){
+ int i;
+ for(i=0;i<group->unit_count;i++){
+ struct skill_unit *unit=&group->unit[i];
+ if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){
+ int range=unit->range;
+ map_delblock(&unit->bl);
+ unit->bl.m = m;
+ unit->bl.x += dx;
+ unit->bl.y += dy;
+ map_addblock(&unit->bl);
+ clif_skill_setunit(unit);
+ if(range>0){
+ if(range<7)
+ range=7;
+ map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m,
+ unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0,
+ &unit->bl,gettick() );
+ }
+ }
+ }
+ }else{
+ int i,j, *r_flag, *s_flag, *m_flag;
+ struct skill_unit *unit1;
+ struct skill_unit *unit2;
+ r_flag = (int *) malloc(sizeof(int) * group->unit_count);
+ s_flag = (int *) malloc(sizeof(int) * group->unit_count);
+ m_flag = (int *) malloc(sizeof(int) * group->unit_count);
+ memset(r_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
+ memset(s_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
+ memset(m_flag,0, sizeof(int) * group->unit_count);// ?³ƒtƒ‰ƒO
+
+ //æ‚Ƀtƒ‰ƒO‚ð‘S•”Œˆ‚ß‚é
+ for(i=0;i<group->unit_count;i++){
+ int move_check=0;// ‚©‚Ô‚èƒtƒ‰ƒO
+ unit1=&group->unit[i];
+ for(j=0;j<group->unit_count;j++){
+ unit2=&group->unit[j];
+ if(unit1->bl.m==m && unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){
+ //ˆÚ“®æ‚Ƀ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚Ä‚½‚ç
+ s_flag[i]=1;// ˆÚ“®‘O‚̃†ƒjƒbƒgƒiƒ“ƒo?‚Ì?³ƒtƒ‰ƒOon
+ r_flag[j]=1;// ‚©‚Ԃ郆ƒjƒbƒgƒiƒ“ƒo?‚Ì?—¯ƒtƒ‰ƒOon
+ move_check=1;//ƒ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚½B
+ break;
+ }
+ }
+ if(!move_check)// ƒ†ƒjƒbƒg‚ª‚©‚Ô‚Á‚Ä‚È‚©‚Á‚½‚ç
+ m_flag[i]=1;// ˆÚ“®‘Oƒ†ƒjƒbƒgƒiƒ“ƒo?‚̈ړ®ƒtƒ‰ƒOon
+ }
+
+ //ƒtƒ‰ƒO‚ÉŠî‚¢‚ă†ƒjƒbƒgˆÚ“®
+ for(i=0;i<group->unit_count;i++){
+ unit1=&group->unit[i];
+ if(m_flag[i]){// ˆÚ“®ƒtƒ‰ƒO‚ªon‚Å
+ if(!r_flag[i]){// ?—¯ƒtƒ‰ƒO‚ªoff‚È‚ç
+ //?ƒˆÚ“®(range‚à?³‚Ì•K—v–³‚µ)
+ int range=unit1->range;
+ map_delblock(&unit1->bl);
+ unit1->bl.m = m;
+ unit1->bl.x += dx;
+ unit1->bl.y += dy;
+ map_addblock(&unit1->bl);
+ clif_skill_setunit(unit1);
+ if(range > 0){
+ if(range < 7)
+ range = 7;
+ map_foreachinarea( skill_unit_move_unit_group_sub, unit1->bl.m,
+ unit1->bl.x-range,unit1->bl.y-range,unit1->bl.x+range,unit1->bl.y+range,0,
+ &unit1->bl,gettick() );
+ }
+ }else{// ?—¯ƒtƒ‰ƒO‚ªon‚È‚ç
+ //‹óƒ†ƒjƒbƒg‚É‚È‚é‚Ì‚ÅA?³‰Â”\‚ȃ†ƒjƒbƒg‚ð’T‚·
+ for(j=0;j<group->unit_count;j++){
+ unit2=&group->unit[j];
+ if(s_flag[j] && !r_flag[j]){
+ // ?³ˆÚ“®(range?³•t‚«)
+ int range=unit1->range;
+ map_delblock(&unit2->bl);
+ unit2->bl.m = m;
+ unit2->bl.x = unit1->bl.x + dx;
+ unit2->bl.y = unit1->bl.y + dy;
+ unit2->range = unit1->range;
+ map_addblock(&unit2->bl);
+ clif_skill_setunit(unit2);
+ if(range > 0){
+ if(range < 7)
+ range = 7;
+ map_foreachinarea( skill_unit_move_unit_group_sub, unit2->bl.m,
+ unit2->bl.x-range,unit2->bl.y-range,unit2->bl.x+range,unit2->bl.y+range,0,
+ &unit2->bl,gettick() );
+ }
+ s_flag[j]=0;// ?³Š®—¹‚µ‚½‚Ì‚Åoff
+ break;
+ }
+ }
+ }
+ }
+ }
+ free(r_flag);
+ free(s_flag);
+ free(m_flag);
+ }
+ }
+ return 0;
+}
+
+/*----------------------------------------------------------------------------
+ * ƒAƒCƒeƒ€‡¬
+ *----------------------------------------------------------------------------
+ */
+
+/*==========================================
+ * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
+ *------------------------------------------
+ */
+int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger )
+{
+ int i,j;
+
+ nullpo_retr(0, sd);
+
+ if(nameid<=0)
+ return 0;
+
+ for(i=0;i<MAX_SKILL_PRODUCE_DB;i++){
+ if(skill_produce_db[i].nameid == nameid )
+ break;
+ }
+ if( i >= MAX_SKILL_PRODUCE_DB ) /* ƒf?ƒ^ƒx?ƒX‚É‚È‚¢ */
+ return 0;
+
+ if(trigger>=0){
+ if(trigger==32 || trigger==16 || trigger==64){
+ if(skill_produce_db[i].itemlv!=trigger) /* ƒtƒ@?ƒ}ƒV?–ƒ|?ƒVƒ‡ƒ“—Þ‚Æ—n??–?ΈȊO‚Í‚¾‚ß */
+ return 0;
+ }else{
+ if(skill_produce_db[i].itemlv>=16) /* •ŠíˆÈŠO‚Í‚¾‚ß */
+ return 0;
+ if( itemdb_wlv(nameid)>trigger ) /* •ŠíLv”»’è */
+ return 0;
+ }
+ }
+ if( (j=skill_produce_db[i].req_skill)>0 && pc_checkskill(sd,j)<=0 )
+ return 0; /* ƒXƒLƒ‹‚ª‘«‚è‚È‚¢ */
+
+ for(j=0;j<5;j++){
+ int id,x,y;
+ if( (id=skill_produce_db[i].mat_id[j]) <= 0 ) /* ‚±‚êˆÈã‚ÍÞ—¿—v‚ç‚È‚¢ */
+ continue;
+ if(skill_produce_db[i].mat_amount[j] <= 0) {
+ if(pc_search_inventory(sd,id) < 0)
+ return 0;
+ }
+ else {
+ for(y=0,x=0;y<MAX_INVENTORY;y++)
+ if( sd->status.inventory[y].nameid == id )
+ x+=sd->status.inventory[y].amount;
+ if(x<skill_produce_db[i].mat_amount[j]) /* ƒAƒCƒeƒ€‚ª‘«‚è‚È‚¢ */
+ return 0;
+ }
+ }
+ return i+1;
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€‡¬‰Â”\”»’è
+ *------------------------------------------
+ */
+int skill_produce_mix( struct map_session_data *sd,
+ int nameid, int slot1, int slot2, int slot3 )
+{
+ int slot[3];
+ int i,sc,ele,idx,equip,wlv,make_per,flag;
+
+ nullpo_retr(0, sd);
+
+ if( !(idx=skill_can_produce_mix(sd,nameid,-1)) ) /* ?Œ•s‘« */
+ return 0;
+ idx--;
+ slot[0]=slot1;
+ slot[1]=slot2;
+ slot[2]=slot3;
+
+ /* –„‚ß?‚Ý?— */
+ for(i=0,sc=0,ele=0;i<3;i++){
+ int j;
+ if( slot[i]<=0 )
+ continue;
+ j = pc_search_inventory(sd,slot[i]);
+ if(j < 0) /* •s³ƒpƒPƒbƒg(ƒAƒCƒeƒ€‘¶Ý)ƒ`ƒFƒbƒN */
+ continue;
+ if(slot[i]==1000){ /* ¯‚Ì‚©‚¯‚ç */
+ pc_delitem(sd,j,1,1);
+ sc++;
+ }
+ if(slot[i]>=994 && slot[i]<=997 && ele==0){ /* ?«Î */
+ static const int ele_table[4]={3,1,4,2};
+ pc_delitem(sd,j,1,1);
+ ele=ele_table[slot[i]-994];
+ }
+ }
+
+ /* Þ—¿Á”ï */
+ for(i=0;i<5;i++){
+ int j,id,x;
+ if( (id=skill_produce_db[idx].mat_id[i]) <= 0 )
+ continue;
+ x=skill_produce_db[idx].mat_amount[i]; /* •K—v‚ÈŒÂ? */
+ do{ /* ‚Q‚ˆÈã‚̃Cƒ“ƒfƒbƒNƒX‚É‚Ü‚½‚ª‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚È‚¢ */
+ int y=0;
+ j = pc_search_inventory(sd,id);
+
+ if(j >= 0){
+ y = sd->status.inventory[j].amount;
+ if(y>x)y=x; /* ‘«‚è‚Ä‚¢‚é */
+ pc_delitem(sd,j,y,0);
+ }else {
+ if(battle_config.error_log)
+ printf("skill_produce_mix: material item error\n");
+ }
+
+ x-=y; /* ‚Ü‚¾‘«‚è‚È‚¢ŒÂ?‚ðŒvŽZ */
+ }while( j>=0 && x>0 ); /* Þ—¿‚ðÁ”ï‚·‚é‚©AƒGƒ‰?‚É‚È‚é‚Ü‚ÅŒJ‚è•Ô‚· */
+ }
+
+ /* Šm—¦”»’è */
+ equip = itemdb_isequip(nameid);
+ if(!equip) {
+ if(skill_produce_db[idx].req_skill==AM_PHARMACY) {
+ if((nameid >= 501 && nameid <= 506) || (nameid >= 545 && nameid <= 547) || nameid == 525)
+ make_per = 2000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_POTIONPITCHER)*100;
+ else if(nameid == 970)
+ make_per = 1500 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300;
+ else if(nameid == 7135)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_DEMONSTRATION)*100;
+ else if(nameid == 7136)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_ACIDTERROR)*100;
+ else if(nameid == 7137)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CANNIBALIZE)*100;
+ else if(nameid == 7138)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_SPHEREMINE)*100;
+ else if(nameid == 7139)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300 + pc_checkskill(sd,AM_CP_WEAPON)*100 +
+ pc_checkskill(sd,AM_CP_SHIELD)*100 + pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100;
+ else
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300;
+ }
+ else {
+ if(nameid == 998)
+ make_per = 2000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*600;
+ else if(nameid == 985)
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + (pc_checkskill(sd,skill_produce_db[idx].req_skill)-1)*500;
+ else
+ make_per = 1000 + sd->status.base_level*30 + sd->paramc[4]*20 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500;
+ }
+ }
+ else {
+ int add_per;
+ if(pc_search_inventory(sd,989) >= 0) add_per = 750;
+ else if(pc_search_inventory(sd,988) >= 0) add_per = 500;
+ else if(pc_search_inventory(sd,987) >= 0) add_per = 250;
+ else if(pc_search_inventory(sd,986) >= 0) add_per = 0;
+ else add_per = -500;
+ if(ele) add_per -= 500;
+ add_per -= sc*500;
+ wlv = itemdb_wlv(nameid);
+ make_per = ((250 + sd->status.base_level*15 + sd->paramc[4]*10 + sd->paramc[5]*5 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500 +
+ add_per) * (100 - (wlv - 1)*20))/100 + pc_checkskill(sd,BS_WEAPONRESEARCH)*100 + ((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100 : 0);
+ }
+
+ if(make_per < 1) make_per = 1;
+
+ if(skill_produce_db[idx].req_skill==AM_PHARMACY) {
+ if( battle_config.pp_rate!=100 )
+ make_per=make_per*battle_config.pp_rate/100;
+ }
+ else {
+ if( battle_config.wp_rate!=100 ) /* Šm—¦•â³ */
+ make_per=make_per*battle_config.wp_rate/100;
+ }
+
+// if(battle_config.etc_log)
+// printf("make rate = %d\n",make_per);
+
+ if(rand()%10000 < make_per){
+ /* ¬Œ÷ */
+ struct item tmp_item;
+ memset(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.nameid=nameid;
+ tmp_item.amount=1;
+ tmp_item.identify=1;
+ if(equip){ /* •Ší‚Ìê‡ */
+ tmp_item.card[0]=0x00ff; /* »‘¢•Šíƒtƒ‰ƒO */
+ tmp_item.card[1]=((sc*5)<<8)+ele; /* ?«‚Ƃ‚悳 */
+ *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
+ }
+ else if((battle_config.produce_item_name_input && skill_produce_db[idx].req_skill!=AM_PHARMACY) ||
+ (battle_config.produce_potion_name_input && skill_produce_db[idx].req_skill==AM_PHARMACY)) {
+ tmp_item.card[0]=0x00fe;
+ tmp_item.card[1]=0;
+ *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
+ }
+
+ #ifndef TXT_ONLY
+ if(log_config.produce > 0)
+ log_produce(sd,nameid,slot1,slot2,slot3,1);
+ #endif //USE_SQL
+
+ if(skill_produce_db[idx].req_skill!=AM_PHARMACY && skill_produce_db[idx].req_skill!=WS_CREATECOIN) { //•Ší»‘¢‚Ìê‡
+ clif_produceeffect(sd,0,nameid);/* •Ší»‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,3); /* ‘¼l‚ɂଌ÷‚ð’Ê’mi¸?¬Œ÷ƒGƒtƒFƒNƒg‚Æ“¯‚¶‚Å‚¢‚¢‚ÌHj */
+ }
+ else if(skill_produce_db[idx].req_skill==AM_PHARMACY){ //ƒtƒ@?ƒ}ƒV?‚Ìê‡
+ clif_produceeffect(sd,2,nameid);/* »?ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,5); /* ‘¼l‚ɂଌ÷‚ð’Ê’m*/
+ }else{
+ clif_produceeffect(sd,0,nameid);/* •s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸»‘¢ƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,3); /* ‘¼l‚ɂଌ÷‚ð’Ê’m*/
+ }
+
+ 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);
+ }
+ }
+ else {
+ #ifndef TXT_ONLY
+ if(log_config.produce > 0)
+ log_produce(sd,nameid,slot1,slot2,slot3,0);
+ #endif //USE_SQL
+
+ if(skill_produce_db[idx].req_skill!=AM_PHARMACY) { //•Ší»‘¢‚Ìê‡
+ clif_produceeffect(sd,1,nameid);/* •Ší»‘¢Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,2); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m */
+ }
+ else if(skill_produce_db[idx].req_skill==AM_PHARMACY){ //ƒtƒ@?ƒ}ƒV?‚Ìê‡
+ clif_produceeffect(sd,3,nameid);/* »?Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,6); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m*/
+ }else{
+ clif_produceeffect(sd,1,nameid);/* •s–¾‚È‚Ì‚Å‚Æ‚è‚ ‚¦‚¸»‘¢Ž¸”sƒGƒtƒFƒNƒgƒpƒPƒbƒg */
+ clif_misceffect(&sd->bl,2); /* ‘¼l‚É‚àŽ¸”s‚ð’Ê’m*/
+ }
+ }
+ return 0;
+}
+
+int skill_arrow_create( struct map_session_data *sd,int nameid)
+{
+ int i,j,flag,index=-1;
+ struct item tmp_item;
+
+ nullpo_retr(0, sd);
+
+ if(nameid <= 0)
+ return 1;
+
+ for(i=0;i<MAX_SKILL_ARROW_DB;i++)
+ if(nameid == skill_arrow_db[i].nameid) {
+ index = i;
+ break;
+ }
+
+ if(index < 0 || (j = pc_search_inventory(sd,nameid)) < 0)
+ return 1;
+
+ pc_delitem(sd,j,1,0);
+ for(i=0;i<5;i++) {
+ memset(&tmp_item,0,sizeof(tmp_item));
+ tmp_item.identify = 1;
+ tmp_item.nameid = skill_arrow_db[index].cre_id[i];
+ tmp_item.amount = skill_arrow_db[index].cre_amount[i];
+ if(battle_config.making_arrow_name_input) {
+ tmp_item.card[0]=0x00fe;
+ tmp_item.card[1]=0;
+ *((unsigned long *)(&tmp_item.card[2]))=sd->char_id; /* ƒLƒƒƒ‰ID */
+ }
+ if(tmp_item.nameid <= 0 || tmp_item.amount <= 0)
+ continue;
+ if((flag = pc_additem(sd,&tmp_item,tmp_item.amount))) {
+ clif_additem(sd,0,0,flag);
+ map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0);
+ }
+ }
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------------
+ * ‰Šú‰»Œn
+ */
+
+/*==========================================
+ * ƒXƒLƒ‹?ŒWƒtƒ@ƒCƒ‹?‚Ý?‚Ý
+ * skill_db.txt ƒXƒLƒ‹ƒf?ƒ^
+ * skill_cast_db.txt ƒXƒLƒ‹‚̉r¥ŽžŠÔ‚ƃfƒBƒŒƒCƒf?ƒ^
+ * produce_db.txt ƒAƒCƒeƒ€ì¬ƒXƒLƒ‹—pƒf?ƒ^
+ * create_arrow_db.txt –î쬃XƒLƒ‹—pƒf?ƒ^
+ * abra_db.txt ƒAƒuƒ‰ƒJƒ_ƒuƒ‰?“®ƒXƒLƒ‹ƒf?ƒ^
+ *------------------------------------------
+ */
+int skill_readdb(void)
+{
+ int i,j,k,l,m;
+ FILE *fp;
+ char line[1024],*p;
+ char *filename[]={"db/produce_db.txt","db/produce_db2.txt"};
+
+ /* ƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
+ memset(skill_db,0,sizeof(skill_db));
+ fp=fopen("db/skill_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/skill_db.txt\n");
+ return 1;
+ }
+ while(fgets(line,1020,fp)){
+ char *split[50], *split2[MAX_SKILL_LEVEL];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<14 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[13]==NULL || j<14)
+ continue;
+
+ i=atoi(split[0]);
+ if(i<0 || i>MAX_SKILL_DB)
+ continue;
+
+/* printf("skill id=%d\n",i); */
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].range[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+ skill_db[i].hit=atoi(split[2]);
+ skill_db[i].inf=atoi(split[3]);
+ skill_db[i].pl=atoi(split[4]);
+ skill_db[i].nk=atoi(split[5]);
+ skill_db[i].max=atoi(split[6]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[7];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].num[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ if(strcmpi(split[8],"yes") == 0)
+ skill_db[i].castcancel=1;
+ else
+ skill_db[i].castcancel=0;
+ skill_db[i].cast_def_rate=atoi(split[9]);
+ skill_db[i].inf2=atoi(split[10]);
+ skill_db[i].maxcount=atoi(split[11]);
+ if(strcmpi(split[12],"weapon") == 0)
+ skill_db[i].skill_type=BF_WEAPON;
+ else if(strcmpi(split[12],"magic") == 0)
+ skill_db[i].skill_type=BF_MAGIC;
+ else if(strcmpi(split[12],"misc") == 0)
+ skill_db[i].skill_type=BF_MISC;
+ else
+ skill_db[i].skill_type=0;
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[13];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].blewcount[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+ }
+ fclose(fp);
+ printf("read db/skill_db.txt done\n");
+
+ fp=fopen("db/skill_require_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/skill_require_db.txt\n");
+ return 1;
+ }
+ while(fgets(line,1020,fp)){
+ char *split[51], *split2[MAX_SKILL_LEVEL];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<30 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[29]==NULL || j<30)
+ continue;
+
+ i=atoi(split[0]);
+ if(i<0 || i>MAX_SKILL_DB)
+ continue;
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].hp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].mhp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].sp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].hp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[5];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].sp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[6];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].zeny[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[7];j<32 && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<32 && split2[k];k++) {
+ l = atoi(split2[k]);
+ if(l == 99) {
+ skill_db[i].weapon = 0xffffffff;
+ break;
+ }
+ else
+ skill_db[i].weapon |= 1<<l;
+ }
+
+ if( strcmpi(split[8],"hiding")==0 ) skill_db[i].state=ST_HIDING;
+ else if( strcmpi(split[8],"cloaking")==0 ) skill_db[i].state=ST_CLOAKING;
+ else if( strcmpi(split[8],"hidden")==0 ) skill_db[i].state=ST_HIDDEN;
+ else if( strcmpi(split[8],"riding")==0 ) skill_db[i].state=ST_RIDING;
+ else if( strcmpi(split[8],"falcon")==0 ) skill_db[i].state=ST_FALCON;
+ else if( strcmpi(split[8],"cart")==0 ) skill_db[i].state=ST_CART;
+ else if( strcmpi(split[8],"shield")==0 ) skill_db[i].state=ST_SHIELD;
+ else if( strcmpi(split[8],"sight")==0 ) skill_db[i].state=ST_SIGHT;
+ else if( strcmpi(split[8],"explosionspirits")==0 ) skill_db[i].state=ST_EXPLOSIONSPIRITS;
+ else if( strcmpi(split[8],"recover_weight_rate")==0 ) skill_db[i].state=ST_RECOV_WEIGHT_RATE;
+ else if( strcmpi(split[8],"move_enable")==0 ) skill_db[i].state=ST_MOVE_ENABLE;
+ else if( strcmpi(split[8],"water")==0 ) skill_db[i].state=ST_WATER;
+ else skill_db[i].state=ST_NONE;
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[9];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].spiritball[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+ skill_db[i].itemid[0]=atoi(split[10]);
+ skill_db[i].amount[0]=atoi(split[11]);
+ skill_db[i].itemid[1]=atoi(split[12]);
+ skill_db[i].amount[1]=atoi(split[13]);
+ skill_db[i].itemid[2]=atoi(split[14]);
+ skill_db[i].amount[2]=atoi(split[15]);
+ skill_db[i].itemid[3]=atoi(split[16]);
+ skill_db[i].amount[3]=atoi(split[17]);
+ skill_db[i].itemid[4]=atoi(split[18]);
+ skill_db[i].amount[4]=atoi(split[19]);
+ skill_db[i].itemid[5]=atoi(split[20]);
+ skill_db[i].amount[5]=atoi(split[21]);
+ skill_db[i].itemid[6]=atoi(split[22]);
+ skill_db[i].amount[6]=atoi(split[23]);
+ skill_db[i].itemid[7]=atoi(split[24]);
+ skill_db[i].amount[7]=atoi(split[25]);
+ skill_db[i].itemid[8]=atoi(split[26]);
+ skill_db[i].amount[8]=atoi(split[27]);
+ skill_db[i].itemid[9]=atoi(split[28]);
+ skill_db[i].amount[9]=atoi(split[29]);
+ }
+ fclose(fp);
+ printf("read db/skill_require_db.txt done\n");
+
+ /* ƒLƒƒƒXƒeƒBƒ“ƒOƒf?ƒ^ƒx?ƒX */
+ fp=fopen("db/skill_cast_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/skill_cast_db.txt\n");
+ return 1;
+ }
+ while(fgets(line,1020,fp)){
+ char *split[50], *split2[MAX_SKILL_LEVEL];
+ memset(split,0,sizeof(split)); // [Valaris] thanks to fov
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<5 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[4]==NULL || j<5)
+ continue;
+
+ i=atoi(split[0]);
+ if(i<0 || i>MAX_SKILL_DB)
+ continue;
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].cast[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].delay[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].upkeep_time[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].upkeep_time2[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+ }
+ fclose(fp);
+ printf("read db/skill_cast_db.txt done\n");
+
+ /* »‘¢ŒnƒXƒLƒ‹ƒf?ƒ^ƒx?ƒX */
+ memset(skill_produce_db,0,sizeof(skill_produce_db));
+ for(m=0;m<2;m++){
+ fp=fopen(filename[m],"r");
+ if(fp==NULL){
+ if(m>0)
+ continue;
+ printf("can't read %s\n",filename[m]);
+ return 1;
+ }
+ k=0;
+ while(fgets(line,1020,fp)){
+ char *split[16];
+ int x,y;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(split,0,sizeof(split));
+ for(j=0,p=line;j<13 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[0]==NULL)
+ continue;
+ i=atoi(split[0]);
+ if(i<=0)
+ continue;
+
+ skill_produce_db[k].nameid=i;
+ skill_produce_db[k].itemlv=atoi(split[1]);
+ skill_produce_db[k].req_skill=atoi(split[2]);
+
+ for(x=3,y=0;split[x] && split[x+1] && y<5;x+=2,y++){
+ skill_produce_db[k].mat_id[y]=atoi(split[x]);
+ skill_produce_db[k].mat_amount[y]=atoi(split[x+1]);
+ }
+ k++;
+ if(k >= MAX_SKILL_PRODUCE_DB)
+ break;
+ }
+ fclose(fp);
+ printf("read %s done (count=%d)\n",filename[m],k);
+ }
+
+ memset(skill_arrow_db,0,sizeof(skill_arrow_db));
+ fp=fopen("db/create_arrow_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/create_arrow_db.txt\n");
+ return 1;
+ }
+ k=0;
+ while(fgets(line,1020,fp)){
+ char *split[16];
+ int x,y;
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(split,0,sizeof(split));
+ for(j=0,p=line;j<13 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[0]==NULL)
+ continue;
+ i=atoi(split[0]);
+ if(i<=0)
+ continue;
+
+ skill_arrow_db[k].nameid=i;
+
+ for(x=1,y=0;split[x] && split[x+1] && y<5;x+=2,y++){
+ skill_arrow_db[k].cre_id[y]=atoi(split[x]);
+ skill_arrow_db[k].cre_amount[y]=atoi(split[x+1]);
+ }
+ k++;
+ if(k >= MAX_SKILL_ARROW_DB)
+ break;
+ }
+ fclose(fp);
+ printf("read db/create_arrow_db.txt done (count=%d)\n",k);
+
+ memset(skill_abra_db,0,sizeof(skill_abra_db));
+ fp=fopen("db/abra_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/abra_db.txt\n");
+ return 1;
+ }
+ k=0;
+ while(fgets(line,1020,fp)){
+ char *split[16];
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ memset(split,0,sizeof(split));
+ for(j=0,p=line;j<13 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+ if(split[0]==NULL)
+ continue;
+ i=atoi(split[0]);
+ if(i<=0)
+ continue;
+
+ skill_abra_db[i].req_lv=atoi(split[2]);
+ skill_abra_db[i].per=atoi(split[3]);
+
+ k++;
+ if(k >= MAX_SKILL_ABRA_DB)
+ break;
+ }
+ fclose(fp);
+ printf("read db/abra_db.txt done (count=%d)\n",k);
+
+ fp=fopen("db/skill_castnodex_db.txt","r");
+ if(fp==NULL){
+ printf("can't read db/skill_castnodex_db.txt\n");
+ return 1;
+ }
+ while(fgets(line,1020,fp)){
+ char *split[50], *split2[MAX_SKILL_LEVEL];
+ memset(split,0,sizeof(split));
+ if(line[0]=='/' && line[1]=='/')
+ continue;
+ for(j=0,p=line;j<2 && p;j++){
+ split[j]=p;
+ p=strchr(p,',');
+ if(p) *p++=0;
+ }
+
+ i=atoi(split[0]);
+ if(i<0 || i>MAX_SKILL_DB)
+ continue;
+
+ memset(split2,0,sizeof(split2));
+ for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){
+ split2[j]=p;
+ p=strchr(p,':');
+ if(p) *p++=0;
+ }
+ for(k=0;k<MAX_SKILL_LEVEL;k++)
+ skill_db[i].castnodex[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]);
+ }
+ fclose(fp);
+ printf("read db/skill_castnodex_db.txt done\n");
+
+ return 0;
+}
+
+void skill_reload(void)
+{
+ /*
+
+ <empty skill database>
+ <?>
+
+ */
+
+ do_init_skill();
+}
+
+/*==========================================
+ * ƒXƒLƒ‹?ŒW‰Šú‰»?—
+ *------------------------------------------
+ */
+int do_init_skill(void)
+{
+ skill_readdb();
+
+ add_timer_func_list(skill_unit_timer,"skill_unit_timer");
+ add_timer_func_list(skill_castend_id,"skill_castend_id");
+ add_timer_func_list(skill_castend_pos,"skill_castend_pos");
+ add_timer_func_list(skill_timerskill,"skill_timerskill");
+ add_timer_func_list(skill_status_change_timer,"skill_status_change_timer");
+ add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL);
+
+ return 0;
+}
diff --git a/src/map/skill.h b/src/map/skill.h
index 310a93f21..c82a0c932 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1,857 +1,857 @@
-// $Id: skill.h,v 1.5 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _SKILL_H_
-#define _SKILL_H_
-
-#include "map.h"
-
-#define MAX_SKILL_DB 450
-#define MAX_SKILL_PRODUCE_DB 150
-#define MAX_SKILL_ARROW_DB 150
-#define MAX_SKILL_ABRA_DB 350
-
-// ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX
-struct skill_db {
- int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,max;
- int num[MAX_SKILL_LEVEL];
- int cast[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,state,spiritball[MAX_SKILL_LEVEL];
- int itemid[10],amount[10];
- int castnodex[MAX_SKILL_LEVEL];
-};
-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
-};
-extern struct skill_name_db skill_names[];
-
-// ƒAƒCƒeƒ€ì¬ƒf[ƒ^ƒx[ƒX
-struct skill_produce_db {
- int nameid, trigger;
- int req_skill,itemlv;
- int mat_id[5],mat_amount[5];
-};
-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];
-
-struct block_list;
-struct map_session_data;
-struct skill_unit;
-struct skill_unit_group;
-
-int do_init_skill(void);
-
-// ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ւ̃AƒNƒZƒT
-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_hp( int id ,int lv );
-int skill_get_mhp( int id ,int lv );
-int skill_get_sp( int id ,int lv );
-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_time( int id ,int lv );
-int skill_get_time2( int id ,int lv );
-int skill_get_castdef( int id );
-int skill_get_weapontype( int id );
-int skill_get_unit_id(int id,int flag);
-int skill_get_inf2( int id );
-int skill_get_maxcount( int id );
-int skill_get_blewcount( int id ,int lv );
-
-// ƒXƒLƒ‹‚ÌŽg—p
-int skill_use_id( struct map_session_data *sd, int target_id,
- int skill_num,int skill_lv);
-int skill_use_pos( struct map_session_data *sd,
- int skill_x, int skill_y, int skill_num, int skill_lv);
-
-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);
-
-// ƒ†ƒjƒbƒgƒXƒLƒ‹
-struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y);
-int skill_delunit(struct skill_unit *unit);
-struct skill_unit_group *skill_initunitgroup(struct block_list *src,
- int count,int skillid,int skilllv,int unit_id);
-int skill_delunitgroup(struct skill_unit_group *group);
-struct skill_unit_group_tickset *skill_unitgrouptickset_search(
- struct block_list *bl,int group_id);
-int skill_unitgrouptickset_delete(struct block_list *bl,int group_id);
-int skill_clear_unitgroup(struct block_list *src);
-
-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 time );
-int skill_delayfix( struct block_list *bl, int time );
-int skill_check_unit_range(int m,int x,int y,int range,int skillid);
-int skill_check_unit_range2(int m,int x,int y,int range);
-// -- 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 range);
-int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy);
-
-struct skill_unit_group *skill_check_dancing( struct block_list *src );
-void skill_stop_dancing(struct block_list *src, int flag);
-
-// ‰r¥ƒLƒƒƒ“ƒZƒ‹
-int skill_castcancel(struct block_list *bl,int type);
-
-int skill_gangsterparadise(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);
-int skill_autospell(struct map_session_data *md,int skillid);
-void skill_devotion(struct map_session_data *md,int target);
-void skill_devotion2(struct block_list *bl,int crusader);
-int skill_devotion3(struct block_list *bl,int target);
-void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target);
-
-#define skill_calc_heal(bl,skill_lv) (( battle_get_lv(bl)+battle_get_int(bl) )/8 *(4+ skill_lv*8))
-
-// ‚»‚Ì‘¼
-int skill_check_cloaking(struct block_list *bl);
-int skill_type_cloaking(struct block_list *bl);
-int skill_is_danceskill(int id);
-
-// ƒXƒe[ƒ^ƒXˆÙí
-int skill_status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag);
-int skill_status_change_timer(int tid, unsigned int tick, int id, int data);
-int skill_encchant_eremental_end(struct block_list *bl, int type);
-int skill_status_change_end( struct block_list* bl , int type,int tid );
-int skill_status_change_clear(struct block_list *bl,int type);
-int skillnotok(int skillid, struct map_session_data *sd);
-
-// ƒAƒCƒeƒ€ì¬
-int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger );
-int skill_produce_mix( struct map_session_data *sd,
- int nameid, int slot1, int slot2, int slot3 );
-
-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);
-
-// ƒ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_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER,
-};
-
-enum { // struct map_session_data ‚Ì status_change‚̔Ԇƒe[ƒuƒ‹
-// SC_SENDMAX–¢–ž‚̓Nƒ‰ƒCƒAƒ“ƒg‚Ö‚Ì’Ê’m‚ ‚èB
-// 2-2ŽŸE‚Ì’l‚Í‚È‚ñ‚©‚ß‚¿‚á‚­‚¿‚á‚Á‚Û‚¢‚Ì‚ÅŽb’èB‚½‚Ô‚ñ•ÏX‚³‚ê‚Ü‚·B
- SC_SENDMAX =128,
- SC_PROVOKE = 0,
- SC_ENDURE = 1,
- SC_TWOHANDQUICKEN = 2,
- SC_CONCENTRATE = 3,
- SC_HIDING = 4,
- SC_CLOAKING = 5,
- SC_ENCPOISON = 6,
- SC_POISONREACT = 7,
- SC_QUAGMIRE = 8,
- SC_ANGELUS = 9,
- SC_BLESSING =10,
- SC_SIGNUMCRUCIS =11,
- SC_INCREASEAGI =12,
- SC_DECREASEAGI =13,
- SC_SLOWPOISON =14,
- SC_IMPOSITIO =15,
- SC_SUFFRAGIUM =16,
- SC_ASPERSIO =17,
- SC_BENEDICTIO =18,
- SC_KYRIE =19,
- SC_MAGNIFICAT =20,
- SC_GLORIA =21,
- SC_AETERNA =22,
- SC_ADRENALINE =23,
- SC_WEAPONPERFECTION =24,
- SC_OVERTHRUST =25,
- SC_MAXIMIZEPOWER =26,
- SC_RIDING =27,
- SC_FALCON =28,
- SC_TRICKDEAD =29,
- SC_LOUD =30,
- SC_ENERGYCOAT =31,
- SC_HALLUCINATION =34,
- SC_WEIGHT50 =35,
- SC_WEIGHT90 =36,
- SC_SPEEDPOTION0 =37,
- SC_SPEEDPOTION1 =38,
- SC_SPEEDPOTION2 =39,
- SC_STRIPWEAPON =50,
- SC_STRIPSHIELD =51,
- SC_STRIPARMOR =52,
- SC_STRIPHELM =53,
- SC_CP_WEAPON =54,
- SC_CP_SHIELD =55,
- SC_CP_ARMOR =56,
- SC_CP_HELM =57,
- SC_AUTOGUARD =58,
- SC_REFLECTSHIELD =59,
- SC_DEVOTION =60,
- SC_PROVIDENCE =61,
- SC_DEFENDER =62,
- SC_AUTOSPELL =65,
- SC_SPEARSQUICKEN =68,
- SC_EXPLOSIONSPIRITS =86,
- SC_STEELBODY =87,
- SC_COMBO =89,
- SC_FLAMELAUNCHER =90,
- SC_FROSTWEAPON =91,
- SC_LIGHTNINGLOADER =92,
- SC_SEISMICWEAPON =93,
- SC_AURABLADE =103, /* ƒI[ƒ‰ƒuƒŒ[ƒh */
- SC_PARRYING =104, /* ƒpƒŠƒCƒ“ƒO */
- SC_CONCENTRATION =105, /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
- SC_TENSIONRELAX =106, /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
- SC_BERSERK =107, /* ƒo[ƒT[ƒN */
- SC_ASSUMPTIO =110, /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
- SC_MAGICPOWER =113, /* –‚–@—Í‘• */
- SC_TRUESIGHT =115, /* ƒgƒDƒ‹[ƒTƒCƒg */
- SC_WINDWALK =116, /* ƒEƒCƒ“ƒhƒEƒH[ƒN */
- SC_MELTDOWN =117, /* ƒƒ‹ƒgƒ_ƒEƒ“ */
- SC_CARTBOOST =118, /* ƒJ[ƒgƒu[ƒXƒg */
- SC_REJECTSWORD =120, /* ƒŠƒWƒFƒNƒgƒ\[ƒh */
- SC_MARIONETTE =121, /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹ */
- SC_HEADCRUSH =124, /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
- SC_JOINTBEAT =125, /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
-
- SC_STONE =128,
- SC_FREEZE =129,
- SC_STAN =130,
- SC_SLEEP =131,
- SC_POISON =132,
- SC_CURSE =133,
- SC_SILENCE =134,
- SC_CONFUSION =135,
- SC_BLIND =136,
- SC_DIVINA = SC_SILENCE,
-
- SC_SAFETYWALL =140,
- SC_PNEUMA =141,
- SC_WATERBALL =142,
- SC_ANKLE =143,
- SC_DANCING =144,
- SC_KEEPING =145,
- SC_BARRIER =146,
-
- SC_MAGICROD =149,
- SC_SIGHT =150,
- SC_RUWACH =151,
- SC_AUTOCOUNTER =152,
- SC_VOLCANO =153,
- SC_DELUGE =154,
- SC_VIOLENTGALE =155,
- SC_BLADESTOP_WAIT =156,
- SC_BLADESTOP =157,
- SC_EXTREMITYFIST =158,
- SC_GRAFFITI =159,
-
- SC_LULLABY =160,
- SC_RICHMANKIM =161,
- SC_ETERNALCHAOS =162,
- SC_DRUMBATTLE =163,
- SC_NIBELUNGEN =164,
- SC_ROKISWEIL =165,
- SC_INTOABYSS =166,
- SC_SIEGFRIED =167,
- SC_DISSONANCE =168,
- SC_WHISTLE =169,
- SC_ASSNCROS =170,
- SC_POEMBRAGI =171,
- SC_APPLEIDUN =172,
- SC_UGLYDANCE =173,
- SC_HUMMING =174,
- SC_DONTFORGETME =175,
- SC_FORTUNE =176,
- SC_SERVICE4U =177,
-
- SC_SPIDERWEB =180, /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
- SC_MEMORIZE =181, /* ƒƒ‚ƒ‰ƒCƒY */
-
- SC_WEDDING =187, //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä•à‚­‚Ì‚ª’x‚¢‚Æ‚©)
- SC_NOCHAT =188, //ÔƒGƒ‚ó‘Ô
- SC_SPLASHER =189, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
- SC_SELFDESTRUCTION =190, /* Ž©”š */
-
-
-// Used by English Team
- SC_BROKNARMOR =32,
- SC_BROKNWEAPON =33,
- SC_SIGHTTRASHER =73,
- SC_BASILICA =125,
- SC_ENSEMBLE =159,
- SC_FOGWALL =178,
- SC_GOSPEL =179,
- SC_LANDPROTECTOR =182,
- SC_ADAPTATION =183,
- SC_CHASEWALK =184,
- SC_ATKPOT =185, // [Valaris]
- SC_MATKPOT =186, // [Valaris]
- SC_MINDBREAKER =191,
- SC_SPELLBREAKER =192,
-
- SC_EDP = 114, // [Celest]
- SC_MARIONETTE2 = 122,
- SC_BLEEDING = 124,
-
-// -- testing various SC effects
-// SC_AURABLADE =81,
-// SC_CONCENTRATION =83,
-// SC_TENSIONRELAX =84,
-// SC_BERSERK =85,
-// SC_CALLSPIRITS =100,
-// SC_PARRYING =100,
-// SC_FREECAST =101,
-// SC_ABSORBSPIRIT =102,
-// SC_ASSUMPTIO =114,
-// SC_SHARPSHOOT =127,
-// SC_GANGSTER =184,
-// SC_CANNIBALIZE =186,
-// SC_SPHEREMINE =187,
-// SC_METEOSTORM =189,
-// SC_CASTCANCEL =190,
-// SC_SPIDERWEB =191,
-};
-extern int SkillStatusChangeTable[];
-
-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,
-
- WE_MALE = 334,
- WE_FEMALE,
- WE_CALLPARTNER,
-
- NPC_SELFDESTRUCTION2 = 331,
- NPC_DARKCROSS = 338,
-
- LK_AURABLADE = 355,
- 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,
-
- GD_APPROVAL=10000,
- GD_KAFRACONTACT=10001,
- GD_GUARDIANRESEARCH=10002,
- GD_GUARDUP=10003,
- GD_EXTENSION=10004,
- GD_GLORYGUILD=10005,
- GD_LEADERSHIP=10006,
- GD_GLORYWOUNDS=10007,
- GD_SOULCOLD=10008,
- GD_HAWKEYES=10009,
- GD_BATTLEORDER=10010,
- GD_REGENERATION=10011,
- GD_RESTORE=10012,
- GD_EMERGENCYCALL=10013,
- GD_DEVELOPMENT=10014,
-};
-
-#endif
-
+// $Id: skill.h,v 1.5 2004/09/25 05:32:19 MouseJstr Exp $
+#ifndef _SKILL_H_
+#define _SKILL_H_
+
+#include "map.h"
+
+#define MAX_SKILL_DB 450
+#define MAX_SKILL_PRODUCE_DB 150
+#define MAX_SKILL_ARROW_DB 150
+#define MAX_SKILL_ABRA_DB 350
+
+// ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX
+struct skill_db {
+ int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,max;
+ int num[MAX_SKILL_LEVEL];
+ int cast[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,state,spiritball[MAX_SKILL_LEVEL];
+ int itemid[10],amount[10];
+ int castnodex[MAX_SKILL_LEVEL];
+};
+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
+};
+extern struct skill_name_db skill_names[];
+
+// ƒAƒCƒeƒ€ì¬ƒf[ƒ^ƒx[ƒX
+struct skill_produce_db {
+ int nameid, trigger;
+ int req_skill,itemlv;
+ int mat_id[5],mat_amount[5];
+};
+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];
+
+struct block_list;
+struct map_session_data;
+struct skill_unit;
+struct skill_unit_group;
+
+int do_init_skill(void);
+
+// ƒXƒLƒ‹ƒf[ƒ^ƒx[ƒX‚ւ̃AƒNƒZƒT
+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_hp( int id ,int lv );
+int skill_get_mhp( int id ,int lv );
+int skill_get_sp( int id ,int lv );
+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_time( int id ,int lv );
+int skill_get_time2( int id ,int lv );
+int skill_get_castdef( int id );
+int skill_get_weapontype( int id );
+int skill_get_unit_id(int id,int flag);
+int skill_get_inf2( int id );
+int skill_get_maxcount( int id );
+int skill_get_blewcount( int id ,int lv );
+
+// ƒXƒLƒ‹‚ÌŽg—p
+int skill_use_id( struct map_session_data *sd, int target_id,
+ int skill_num,int skill_lv);
+int skill_use_pos( struct map_session_data *sd,
+ int skill_x, int skill_y, int skill_num, int skill_lv);
+
+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);
+
+// ƒ†ƒjƒbƒgƒXƒLƒ‹
+struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y);
+int skill_delunit(struct skill_unit *unit);
+struct skill_unit_group *skill_initunitgroup(struct block_list *src,
+ int count,int skillid,int skilllv,int unit_id);
+int skill_delunitgroup(struct skill_unit_group *group);
+struct skill_unit_group_tickset *skill_unitgrouptickset_search(
+ struct block_list *bl,int group_id);
+int skill_unitgrouptickset_delete(struct block_list *bl,int group_id);
+int skill_clear_unitgroup(struct block_list *src);
+
+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 time );
+int skill_delayfix( struct block_list *bl, int time );
+int skill_check_unit_range(int m,int x,int y,int range,int skillid);
+int skill_check_unit_range2(int m,int x,int y,int range);
+// -- 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 range);
+int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy);
+
+struct skill_unit_group *skill_check_dancing( struct block_list *src );
+void skill_stop_dancing(struct block_list *src, int flag);
+
+// ‰r¥ƒLƒƒƒ“ƒZƒ‹
+int skill_castcancel(struct block_list *bl,int type);
+
+int skill_gangsterparadise(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);
+int skill_autospell(struct map_session_data *md,int skillid);
+void skill_devotion(struct map_session_data *md,int target);
+void skill_devotion2(struct block_list *bl,int crusader);
+int skill_devotion3(struct block_list *bl,int target);
+void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target);
+
+#define skill_calc_heal(bl,skill_lv) (( battle_get_lv(bl)+battle_get_int(bl) )/8 *(4+ skill_lv*8))
+
+// ‚»‚Ì‘¼
+int skill_check_cloaking(struct block_list *bl);
+int skill_type_cloaking(struct block_list *bl);
+int skill_is_danceskill(int id);
+
+// ƒXƒe[ƒ^ƒXˆÙí
+int skill_status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag);
+int skill_status_change_timer(int tid, unsigned int tick, int id, int data);
+int skill_encchant_eremental_end(struct block_list *bl, int type);
+int skill_status_change_end( struct block_list* bl , int type,int tid );
+int skill_status_change_clear(struct block_list *bl,int type);
+int skillnotok(int skillid, struct map_session_data *sd);
+
+// ƒAƒCƒeƒ€ì¬
+int skill_can_produce_mix( struct map_session_data *sd, int nameid, int trigger );
+int skill_produce_mix( struct map_session_data *sd,
+ int nameid, int slot1, int slot2, int slot3 );
+
+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);
+
+// ƒ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_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER,
+};
+
+enum { // struct map_session_data ‚Ì status_change‚̔Ԇƒe[ƒuƒ‹
+// SC_SENDMAX–¢–ž‚̓Nƒ‰ƒCƒAƒ“ƒg‚Ö‚Ì’Ê’m‚ ‚èB
+// 2-2ŽŸE‚Ì’l‚Í‚È‚ñ‚©‚ß‚¿‚á‚­‚¿‚á‚Á‚Û‚¢‚Ì‚ÅŽb’èB‚½‚Ô‚ñ•ÏX‚³‚ê‚Ü‚·B
+ SC_SENDMAX =128,
+ SC_PROVOKE = 0,
+ SC_ENDURE = 1,
+ SC_TWOHANDQUICKEN = 2,
+ SC_CONCENTRATE = 3,
+ SC_HIDING = 4,
+ SC_CLOAKING = 5,
+ SC_ENCPOISON = 6,
+ SC_POISONREACT = 7,
+ SC_QUAGMIRE = 8,
+ SC_ANGELUS = 9,
+ SC_BLESSING =10,
+ SC_SIGNUMCRUCIS =11,
+ SC_INCREASEAGI =12,
+ SC_DECREASEAGI =13,
+ SC_SLOWPOISON =14,
+ SC_IMPOSITIO =15,
+ SC_SUFFRAGIUM =16,
+ SC_ASPERSIO =17,
+ SC_BENEDICTIO =18,
+ SC_KYRIE =19,
+ SC_MAGNIFICAT =20,
+ SC_GLORIA =21,
+ SC_AETERNA =22,
+ SC_ADRENALINE =23,
+ SC_WEAPONPERFECTION =24,
+ SC_OVERTHRUST =25,
+ SC_MAXIMIZEPOWER =26,
+ SC_RIDING =27,
+ SC_FALCON =28,
+ SC_TRICKDEAD =29,
+ SC_LOUD =30,
+ SC_ENERGYCOAT =31,
+ SC_HALLUCINATION =34,
+ SC_WEIGHT50 =35,
+ SC_WEIGHT90 =36,
+ SC_SPEEDPOTION0 =37,
+ SC_SPEEDPOTION1 =38,
+ SC_SPEEDPOTION2 =39,
+ SC_STRIPWEAPON =50,
+ SC_STRIPSHIELD =51,
+ SC_STRIPARMOR =52,
+ SC_STRIPHELM =53,
+ SC_CP_WEAPON =54,
+ SC_CP_SHIELD =55,
+ SC_CP_ARMOR =56,
+ SC_CP_HELM =57,
+ SC_AUTOGUARD =58,
+ SC_REFLECTSHIELD =59,
+ SC_DEVOTION =60,
+ SC_PROVIDENCE =61,
+ SC_DEFENDER =62,
+ SC_AUTOSPELL =65,
+ SC_SPEARSQUICKEN =68,
+ SC_EXPLOSIONSPIRITS =86,
+ SC_STEELBODY =87,
+ SC_COMBO =89,
+ SC_FLAMELAUNCHER =90,
+ SC_FROSTWEAPON =91,
+ SC_LIGHTNINGLOADER =92,
+ SC_SEISMICWEAPON =93,
+ SC_AURABLADE =103, /* ƒI[ƒ‰ƒuƒŒ[ƒh */
+ SC_PARRYING =104, /* ƒpƒŠƒCƒ“ƒO */
+ SC_CONCENTRATION =105, /* ƒRƒ“ƒZƒ“ƒgƒŒ[ƒVƒ‡ƒ“ */
+ SC_TENSIONRELAX =106, /* ƒeƒ“ƒVƒ‡ƒ“ƒŠƒ‰ƒbƒNƒX */
+ SC_BERSERK =107, /* ƒo[ƒT[ƒN */
+ SC_ASSUMPTIO =110, /* ƒAƒVƒƒƒ“ƒvƒeƒBƒI */
+ SC_MAGICPOWER =113, /* –‚–@—Í‘• */
+ SC_TRUESIGHT =115, /* ƒgƒDƒ‹[ƒTƒCƒg */
+ SC_WINDWALK =116, /* ƒEƒCƒ“ƒhƒEƒH[ƒN */
+ SC_MELTDOWN =117, /* ƒƒ‹ƒgƒ_ƒEƒ“ */
+ SC_CARTBOOST =118, /* ƒJ[ƒgƒu[ƒXƒg */
+ SC_REJECTSWORD =120, /* ƒŠƒWƒFƒNƒgƒ\[ƒh */
+ SC_MARIONETTE =121, /* ƒ}ƒŠƒIƒlƒbƒgƒRƒ“ƒgƒ[ƒ‹ */
+ SC_HEADCRUSH =124, /* ƒwƒbƒhƒNƒ‰ƒbƒVƒ… */
+ SC_JOINTBEAT =125, /* ƒWƒ‡ƒCƒ“ƒgƒr[ƒg */
+
+ SC_STONE =128,
+ SC_FREEZE =129,
+ SC_STAN =130,
+ SC_SLEEP =131,
+ SC_POISON =132,
+ SC_CURSE =133,
+ SC_SILENCE =134,
+ SC_CONFUSION =135,
+ SC_BLIND =136,
+ SC_DIVINA = SC_SILENCE,
+
+ SC_SAFETYWALL =140,
+ SC_PNEUMA =141,
+ SC_WATERBALL =142,
+ SC_ANKLE =143,
+ SC_DANCING =144,
+ SC_KEEPING =145,
+ SC_BARRIER =146,
+
+ SC_MAGICROD =149,
+ SC_SIGHT =150,
+ SC_RUWACH =151,
+ SC_AUTOCOUNTER =152,
+ SC_VOLCANO =153,
+ SC_DELUGE =154,
+ SC_VIOLENTGALE =155,
+ SC_BLADESTOP_WAIT =156,
+ SC_BLADESTOP =157,
+ SC_EXTREMITYFIST =158,
+ SC_GRAFFITI =159,
+
+ SC_LULLABY =160,
+ SC_RICHMANKIM =161,
+ SC_ETERNALCHAOS =162,
+ SC_DRUMBATTLE =163,
+ SC_NIBELUNGEN =164,
+ SC_ROKISWEIL =165,
+ SC_INTOABYSS =166,
+ SC_SIEGFRIED =167,
+ SC_DISSONANCE =168,
+ SC_WHISTLE =169,
+ SC_ASSNCROS =170,
+ SC_POEMBRAGI =171,
+ SC_APPLEIDUN =172,
+ SC_UGLYDANCE =173,
+ SC_HUMMING =174,
+ SC_DONTFORGETME =175,
+ SC_FORTUNE =176,
+ SC_SERVICE4U =177,
+
+ SC_SPIDERWEB =180, /* ƒXƒpƒCƒ_[ƒEƒFƒbƒu */
+ SC_MEMORIZE =181, /* ƒƒ‚ƒ‰ƒCƒY */
+
+ SC_WEDDING =187, //Œ‹¥—p(Œ‹¥ˆßÖ‚É‚È‚Á‚Ä•à‚­‚Ì‚ª’x‚¢‚Æ‚©)
+ SC_NOCHAT =188, //ÔƒGƒ‚ó‘Ô
+ SC_SPLASHER =189, /* ƒxƒiƒ€ƒXƒvƒ‰ƒbƒVƒƒ[ */
+ SC_SELFDESTRUCTION =190, /* Ž©”š */
+
+
+// Used by English Team
+ SC_BROKNARMOR =32,
+ SC_BROKNWEAPON =33,
+ SC_SIGHTTRASHER =73,
+ SC_BASILICA =125,
+ SC_ENSEMBLE =159,
+ SC_FOGWALL =178,
+ SC_GOSPEL =179,
+ SC_LANDPROTECTOR =182,
+ SC_ADAPTATION =183,
+ SC_CHASEWALK =184,
+ SC_ATKPOT =185, // [Valaris]
+ SC_MATKPOT =186, // [Valaris]
+ SC_MINDBREAKER =191,
+ SC_SPELLBREAKER =192,
+
+ SC_EDP = 114, // [Celest]
+ SC_MARIONETTE2 = 122,
+ SC_BLEEDING = 124,
+
+// -- testing various SC effects
+// SC_AURABLADE =81,
+// SC_CONCENTRATION =83,
+// SC_TENSIONRELAX =84,
+// SC_BERSERK =85,
+// SC_CALLSPIRITS =100,
+// SC_PARRYING =100,
+// SC_FREECAST =101,
+// SC_ABSORBSPIRIT =102,
+// SC_ASSUMPTIO =114,
+// SC_SHARPSHOOT =127,
+// SC_GANGSTER =184,
+// SC_CANNIBALIZE =186,
+// SC_SPHEREMINE =187,
+// SC_METEOSTORM =189,
+// SC_CASTCANCEL =190,
+// SC_SPIDERWEB =191,
+};
+extern int SkillStatusChangeTable[];
+
+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,
+
+ WE_MALE = 334,
+ WE_FEMALE,
+ WE_CALLPARTNER,
+
+ NPC_SELFDESTRUCTION2 = 331,
+ NPC_DARKCROSS = 338,
+
+ LK_AURABLADE = 355,
+ 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,
+
+ GD_APPROVAL=10000,
+ GD_KAFRACONTACT=10001,
+ GD_GUARDIANRESEARCH=10002,
+ GD_GUARDUP=10003,
+ GD_EXTENSION=10004,
+ GD_GLORYGUILD=10005,
+ GD_LEADERSHIP=10006,
+ GD_GLORYWOUNDS=10007,
+ GD_SOULCOLD=10008,
+ GD_HAWKEYES=10009,
+ GD_BATTLEORDER=10010,
+ GD_REGENERATION=10011,
+ GD_RESTORE=10012,
+ GD_EMERGENCYCALL=10013,
+ GD_DEVELOPMENT=10014,
+};
+
+#endif
+
diff --git a/src/map/storage.c b/src/map/storage.c
index b10b73bb0..fc6f63cdd 100644
--- a/src/map/storage.c
+++ b/src/map/storage.c
@@ -1,595 +1,595 @@
-// $Id: storage.c,v 1.3 2004/09/25 02:05:22 MouseJstr Exp $
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "db.h"
-#include "itemdb.h"
-#include "clif.h"
-#include "intif.h"
-#include "pc.h"
-#include "storage.h"
-#include "guild.h"
-#include "nullpo.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-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;
- } else {
- 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=numdb_init();
- guild_storage_db=numdb_init();
- return 1;
-}
-
-void do_final_storage(void) // map.c::do_final()‚©‚çŒÄ‚΂ê‚é
-{
-}
-
-struct storage *account2storage(int account_id)
-{
- struct storage *stor;
- stor=numdb_search(storage_db,account_id);
- if(stor == NULL) {
- stor = calloc(sizeof(struct storage), 1);
- if(stor == NULL){
- printf("storage: out of memory!\n");
- exit(0);
- }
- memset(stor,0,sizeof(struct storage));
- stor->account_id=account_id;
- numdb_insert(storage_db,stor->account_id,stor);
- }
- return stor;
-}
-
-// Just to ask storage, without creation
-struct storage *account2storage2(int account_id) {
- return numdb_search(storage_db, account_id);
-}
-
-int storage_delete(int account_id)
-{
- struct storage *stor = numdb_search(storage_db,account_id);
- if(stor) {
- numdb_erase(storage_db,account_id);
- free(stor);
- }
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
- *------------------------------------------
- */
-int storage_storageopen(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor = numdb_search(storage_db,sd->status.account_id)) != NULL) {
- stor->storage_status = 1;
- sd->state.storage_flag = 0;
- clif_storageitemlist(sd,stor);
- clif_storageequiplist(sd,stor);
- clif_updatestorageamount(sd,stor);
- return 0;
- } else
- intif_request_storage(sd->status.account_id);
-
- return 1;
-}
-
-int storage_storageopen2(struct map_session_data *sd, struct map_session_data *pl_sd)
-{
- struct storage *stor;
- if(sd == NULL || pl_sd == NULL)
- {
- printf("storage_storageopen nullpo\n");
- return 0;
- }
-
- if((stor = numdb_search(storage_db,pl_sd->status.account_id)) != NULL)
- {
- clif_storageitemlist(sd,stor);
- clif_storageequiplist(sd,stor);
- clif_updatestorageamount(sd,stor);
- return 1;
- }
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-int storage_additem(struct map_session_data *sd,struct 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);
-
- if(item_data->nameid <= 0 || amount <= 0)
- return 1;
- nullpo_retr(1, data = itemdb_search(item_data->nameid));
-
- i=MAX_STORAGE;
- if(!itemdb_isequip2(data)){
- // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_STORAGE;i++){
- if(stor->storage[i].nameid == item_data->nameid &&
- stor->storage[i].card[0] == item_data->card[0] && stor->storage[i].card[1] == item_data->card[1] &&
- stor->storage[i].card[2] == item_data->card[2] && stor->storage[i].card[3] == item_data->card[3]){
- if(stor->storage[i].amount+amount > MAX_AMOUNT)
- return 1;
- stor->storage[i].amount+=amount;
- clif_storageitemadded(sd,stor,i,amount);
- break;
- }
- }
- }
- if(i>=MAX_STORAGE){
- // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_STORAGE;i++){
- if(stor->storage[i].nameid==0){
- 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);
- break;
- }
- }
- if(i>=MAX_STORAGE)
- return 1;
- }
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
- *------------------------------------------
- */
-int storage_delitem(struct map_session_data *sd,struct 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){
- memset(&stor->storage[n],0,sizeof(stor->storage[0]));
- stor->storage_amount--;
- clif_updatestorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
-
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
- *------------------------------------------
- */
-int storage_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage(sd->status.account_id));
-
- if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
- if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- // remove item from inventory
- pc_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
- *------------------------------------------
- */
-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=account2storage(sd->status.account_id));
-
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_STORAGE) { // valid index
- if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
- if((flag = pc_additem(sd,&stor->storage[index],amount)) == 0)
- storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
- } // valid amount
- }// valid index
- }// storage open
-
- return 0;
-}
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
- *------------------------------------------
- */
-int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage(sd->status.account_id));
-
- if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
- if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
-
- return 0;
-}
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚©‚çƒJ[ƒg‚Öo‚·
- *------------------------------------------
- */
-int storage_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage(sd->status.account_id));
-
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_STORAGE) { // valid index
- if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
- if(pc_cart_additem(sd,&stor->storage[index],amount)==0){
- storage_delitem(sd,stor,index,amount);
- }
- } // valid amount
- }// valid index
- }// storage open
-
- return 0;
-}
-
-
-/*==========================================
- * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
- *------------------------------------------
- */
-int storage_storageclose(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
- nullpo_retr(0, stor=account2storage(sd->status.account_id));
-
- stor->storage_status=0;
- sd->state.storage_flag = 0;
- clif_storageclose(sd);
-
- sortage_sortitem(stor);
- return 0;
-}
-
-/*==========================================
- * ƒƒOƒAƒEƒgŽžŠJ‚¢‚Ä‚¢‚éƒJƒvƒ‰‘qŒÉ‚Ì•Û‘¶
- *------------------------------------------
- */
-int storage_storage_quit(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- stor = numdb_search(storage_db,sd->status.account_id);
- if(stor) stor->storage_status = 0;
-
- return 0;
-}
-
-int storage_storage_save(struct map_session_data *sd)
-{
- struct storage *stor;
-
- nullpo_retr(0, sd);
-
- stor=numdb_search(storage_db,sd->status.account_id);
- if(stor) intif_send_storage(stor);
-
- return 0;
-}
-
-struct guild_storage *guild2storage(int guild_id)
-{
- struct guild_storage *gs = NULL;
- if(guild_search(guild_id) != NULL) {
- gs=numdb_search(guild_storage_db,guild_id);
- if(gs == NULL) {
- gs = calloc(sizeof(struct guild_storage), 1);
- if(gs==NULL){
- printf("storage: out of memory!\n");
- exit(0);
- }
- gs->guild_id=guild_id;
- numdb_insert(guild_storage_db,gs->guild_id,gs);
- }
- }
- return gs;
-}
-
-int guild_storage_delete(int guild_id)
-{
- struct guild_storage *gstor = numdb_search(guild_storage_db,guild_id);
- if(gstor) {
- numdb_erase(guild_storage_db,guild_id);
- free(gstor);
- }
- 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((gstor = numdb_search(guild_storage_db,sd->status.guild_id)) != NULL) {
- if(gstor->storage_status)
- return 1;
- gstor->storage_status = 1;
- sd->state.storage_flag = 1;
- clif_guildstorageitemlist(sd,gstor);
- clif_guildstorageequiplist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- return 0;
- }
- else {
- gstor = guild2storage(sd->status.guild_id);
- gstor->storage_status = 1;
- intif_request_guild_storage(sd->status.account_id,sd->status.guild_id);
- }
-
- 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;
-
- i=MAX_GUILD_STORAGE;
- if(!itemdb_isequip2(data)){
- // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage[i].nameid == item_data->nameid &&
- stor->storage[i].card[0] == item_data->card[0] && stor->storage[i].card[1] == item_data->card[1] &&
- stor->storage[i].card[2] == item_data->card[2] && stor->storage[i].card[3] == item_data->card[3]){
- if(stor->storage[i].amount+amount > MAX_AMOUNT)
- return 1;
- stor->storage[i].amount+=amount;
- clif_guildstorageitemadded(sd,stor,i,amount);
- break;
- }
- }
- }
- if(i>=MAX_GUILD_STORAGE){
- // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(stor->storage[i].nameid==0){
- 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);
- break;
- }
- }
- if(i>=MAX_GUILD_STORAGE)
- return 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){
- memset(&stor->storage[n],0,sizeof(stor->storage[0]));
- stor->storage_amount--;
- clif_updateguildstorageamount(sd,stor);
- }
- clif_storageitemremoved(sd,n,amount);
-
- return 0;
-}
-
-int storage_guild_storageadd(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
- if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
- // remove item from inventory
- pc_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageget(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
- int flag;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
- if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
- if((flag = pc_additem(sd,&stor->storage[index],amount)) == 0)
- guild_storage_delitem(sd,stor,index,amount);
- else
- clif_additem(sd,0,0,flag);
- } // valid amount
- }// valid index
- }// storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
- if(index>=0 && index<MAX_INVENTORY) { // valid index
- if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
- if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
- pc_cart_delitem(sd,index,amount,0);
- } // valid amount
- }// valid index
- }// storage not full & storage open
- }
-
- return 0;
-}
-
-int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- if(stor->storage_status == 1) { // storage open
- if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
- if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
- if(pc_cart_additem(sd,&stor->storage[index],amount)==0){
- guild_storage_delitem(sd,stor,index,amount);
- }
- } // valid amount
- }// valid index
- }// storage open
- }
-
- return 0;
-}
-
-int storage_guild_storageclose(struct map_session_data *sd)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- if((stor=guild2storage(sd->status.guild_id)) != NULL) {
- intif_send_guild_storage(sd->status.account_id,stor);
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
- sortage_gsortitem(stor);
- }
- clif_storageclose(sd);
-
- return 0;
-}
-
-int storage_guild_storage_quit(struct map_session_data *sd,int flag)
-{
- struct guild_storage *stor;
-
- nullpo_retr(0, sd);
-
- stor = numdb_search(guild_storage_db,sd->status.guild_id);
- if(stor) {
- if(!flag)
- intif_send_guild_storage(sd->status.account_id,stor);
- stor->storage_status = 0;
- sd->state.storage_flag = 0;
- }
-
- return 0;
-}
+// $Id: storage.c,v 1.3 2004/09/25 02:05:22 MouseJstr Exp $
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "db.h"
+#include "itemdb.h"
+#include "clif.h"
+#include "intif.h"
+#include "pc.h"
+#include "storage.h"
+#include "guild.h"
+#include "nullpo.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+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;
+ } else {
+ 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=numdb_init();
+ guild_storage_db=numdb_init();
+ return 1;
+}
+
+void do_final_storage(void) // map.c::do_final()‚©‚çŒÄ‚΂ê‚é
+{
+}
+
+struct storage *account2storage(int account_id)
+{
+ struct storage *stor;
+ stor=numdb_search(storage_db,account_id);
+ if(stor == NULL) {
+ stor = calloc(sizeof(struct storage), 1);
+ if(stor == NULL){
+ printf("storage: out of memory!\n");
+ exit(0);
+ }
+ memset(stor,0,sizeof(struct storage));
+ stor->account_id=account_id;
+ numdb_insert(storage_db,stor->account_id,stor);
+ }
+ return stor;
+}
+
+// Just to ask storage, without creation
+struct storage *account2storage2(int account_id) {
+ return numdb_search(storage_db, account_id);
+}
+
+int storage_delete(int account_id)
+{
+ struct storage *stor = numdb_search(storage_db,account_id);
+ if(stor) {
+ numdb_erase(storage_db,account_id);
+ free(stor);
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ðŠJ‚­
+ *------------------------------------------
+ */
+int storage_storageopen(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+
+ if((stor = numdb_search(storage_db,sd->status.account_id)) != NULL) {
+ stor->storage_status = 1;
+ sd->state.storage_flag = 0;
+ clif_storageitemlist(sd,stor);
+ clif_storageequiplist(sd,stor);
+ clif_updatestorageamount(sd,stor);
+ return 0;
+ } else
+ intif_request_storage(sd->status.account_id);
+
+ return 1;
+}
+
+int storage_storageopen2(struct map_session_data *sd, struct map_session_data *pl_sd)
+{
+ struct storage *stor;
+ if(sd == NULL || pl_sd == NULL)
+ {
+ printf("storage_storageopen nullpo\n");
+ return 0;
+ }
+
+ if((stor = numdb_search(storage_db,pl_sd->status.account_id)) != NULL)
+ {
+ clif_storageitemlist(sd,stor);
+ clif_storageequiplist(sd,stor);
+ clif_updatestorageamount(sd,stor);
+ return 1;
+ }
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ÖƒAƒCƒeƒ€’ljÁ
+ *------------------------------------------
+ */
+int storage_additem(struct map_session_data *sd,struct 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);
+
+ if(item_data->nameid <= 0 || amount <= 0)
+ return 1;
+ nullpo_retr(1, data = itemdb_search(item_data->nameid));
+
+ i=MAX_STORAGE;
+ if(!itemdb_isequip2(data)){
+ // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
+ for(i=0;i<MAX_STORAGE;i++){
+ if(stor->storage[i].nameid == item_data->nameid &&
+ stor->storage[i].card[0] == item_data->card[0] && stor->storage[i].card[1] == item_data->card[1] &&
+ stor->storage[i].card[2] == item_data->card[2] && stor->storage[i].card[3] == item_data->card[3]){
+ if(stor->storage[i].amount+amount > MAX_AMOUNT)
+ return 1;
+ stor->storage[i].amount+=amount;
+ clif_storageitemadded(sd,stor,i,amount);
+ break;
+ }
+ }
+ }
+ if(i>=MAX_STORAGE){
+ // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
+ for(i=0;i<MAX_STORAGE;i++){
+ if(stor->storage[i].nameid==0){
+ 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);
+ break;
+ }
+ }
+ if(i>=MAX_STORAGE)
+ return 1;
+ }
+ return 0;
+}
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉƒAƒCƒeƒ€‚ðŒ¸‚ç‚·
+ *------------------------------------------
+ */
+int storage_delitem(struct map_session_data *sd,struct 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){
+ memset(&stor->storage[n],0,sizeof(stor->storage[0]));
+ stor->storage_amount--;
+ clif_updatestorageamount(sd,stor);
+ }
+ clif_storageitemremoved(sd,n,amount);
+
+ return 0;
+}
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚Ö“ü‚ê‚é
+ *------------------------------------------
+ */
+int storage_storageadd(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage(sd->status.account_id));
+
+ if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
+ if(index>=0 && index<MAX_INVENTORY) { // valid index
+ if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
+ if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
+ // remove item from inventory
+ pc_delitem(sd,index,amount,0);
+ } // valid amount
+ }// valid index
+ }// storage not full & storage open
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚©‚ço‚·
+ *------------------------------------------
+ */
+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=account2storage(sd->status.account_id));
+
+ if(stor->storage_status == 1) { // storage open
+ if(index>=0 && index<MAX_STORAGE) { // valid index
+ if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
+ if((flag = pc_additem(sd,&stor->storage[index],amount)) == 0)
+ storage_delitem(sd,stor,index,amount);
+ else
+ clif_additem(sd,0,0,flag);
+ } // valid amount
+ }// valid index
+ }// storage open
+
+ return 0;
+}
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ÖƒJ[ƒg‚©‚ç“ü‚ê‚é
+ *------------------------------------------
+ */
+int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage(sd->status.account_id));
+
+ if( (stor->storage_amount <= MAX_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
+ if(index>=0 && index<MAX_INVENTORY) { // valid index
+ if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
+ if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
+ pc_cart_delitem(sd,index,amount,0);
+ } // valid amount
+ }// valid index
+ }// storage not full & storage open
+
+ return 0;
+}
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚©‚çƒJ[ƒg‚Öo‚·
+ *------------------------------------------
+ */
+int storage_storagegettocart(struct map_session_data *sd,int index,int amount)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage(sd->status.account_id));
+
+ if(stor->storage_status == 1) { // storage open
+ if(index>=0 && index<MAX_STORAGE) { // valid index
+ if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
+ if(pc_cart_additem(sd,&stor->storage[index],amount)==0){
+ storage_delitem(sd,stor,index,amount);
+ }
+ } // valid amount
+ }// valid index
+ }// storage open
+
+ return 0;
+}
+
+
+/*==========================================
+ * ƒJƒvƒ‰‘qŒÉ‚ð•Â‚¶‚é
+ *------------------------------------------
+ */
+int storage_storageclose(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+ nullpo_retr(0, stor=account2storage(sd->status.account_id));
+
+ stor->storage_status=0;
+ sd->state.storage_flag = 0;
+ clif_storageclose(sd);
+
+ sortage_sortitem(stor);
+ return 0;
+}
+
+/*==========================================
+ * ƒƒOƒAƒEƒgŽžŠJ‚¢‚Ä‚¢‚éƒJƒvƒ‰‘qŒÉ‚Ì•Û‘¶
+ *------------------------------------------
+ */
+int storage_storage_quit(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+
+ stor = numdb_search(storage_db,sd->status.account_id);
+ if(stor) stor->storage_status = 0;
+
+ return 0;
+}
+
+int storage_storage_save(struct map_session_data *sd)
+{
+ struct storage *stor;
+
+ nullpo_retr(0, sd);
+
+ stor=numdb_search(storage_db,sd->status.account_id);
+ if(stor) intif_send_storage(stor);
+
+ return 0;
+}
+
+struct guild_storage *guild2storage(int guild_id)
+{
+ struct guild_storage *gs = NULL;
+ if(guild_search(guild_id) != NULL) {
+ gs=numdb_search(guild_storage_db,guild_id);
+ if(gs == NULL) {
+ gs = calloc(sizeof(struct guild_storage), 1);
+ if(gs==NULL){
+ printf("storage: out of memory!\n");
+ exit(0);
+ }
+ gs->guild_id=guild_id;
+ numdb_insert(guild_storage_db,gs->guild_id,gs);
+ }
+ }
+ return gs;
+}
+
+int guild_storage_delete(int guild_id)
+{
+ struct guild_storage *gstor = numdb_search(guild_storage_db,guild_id);
+ if(gstor) {
+ numdb_erase(guild_storage_db,guild_id);
+ free(gstor);
+ }
+ 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((gstor = numdb_search(guild_storage_db,sd->status.guild_id)) != NULL) {
+ if(gstor->storage_status)
+ return 1;
+ gstor->storage_status = 1;
+ sd->state.storage_flag = 1;
+ clif_guildstorageitemlist(sd,gstor);
+ clif_guildstorageequiplist(sd,gstor);
+ clif_updateguildstorageamount(sd,gstor);
+ return 0;
+ }
+ else {
+ gstor = guild2storage(sd->status.guild_id);
+ gstor->storage_status = 1;
+ intif_request_guild_storage(sd->status.account_id,sd->status.guild_id);
+ }
+
+ 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;
+
+ i=MAX_GUILD_STORAGE;
+ if(!itemdb_isequip2(data)){
+ // ‘•”õ•i‚Å‚Í‚È‚¢‚Ì‚ÅAŠùŠ—L•i‚È‚çŒÂ”‚̂ݕω»‚³‚¹‚é
+ for(i=0;i<MAX_GUILD_STORAGE;i++){
+ if(stor->storage[i].nameid == item_data->nameid &&
+ stor->storage[i].card[0] == item_data->card[0] && stor->storage[i].card[1] == item_data->card[1] &&
+ stor->storage[i].card[2] == item_data->card[2] && stor->storage[i].card[3] == item_data->card[3]){
+ if(stor->storage[i].amount+amount > MAX_AMOUNT)
+ return 1;
+ stor->storage[i].amount+=amount;
+ clif_guildstorageitemadded(sd,stor,i,amount);
+ break;
+ }
+ }
+ }
+ if(i>=MAX_GUILD_STORAGE){
+ // ‘•”õ•i‚©–¢Š—L•i‚¾‚Á‚½‚Ì‚Å‹ó‚«—“‚֒ljÁ
+ for(i=0;i<MAX_GUILD_STORAGE;i++){
+ if(stor->storage[i].nameid==0){
+ 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);
+ break;
+ }
+ }
+ if(i>=MAX_GUILD_STORAGE)
+ return 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){
+ memset(&stor->storage[n],0,sizeof(stor->storage[0]));
+ stor->storage_amount--;
+ clif_updateguildstorageamount(sd,stor);
+ }
+ clif_storageitemremoved(sd,n,amount);
+
+ return 0;
+}
+
+int storage_guild_storageadd(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+
+ if((stor=guild2storage(sd->status.guild_id)) != NULL) {
+ if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
+ if(index>=0 && index<MAX_INVENTORY) { // valid index
+ if( (amount <= sd->status.inventory[index].amount) && (amount > 0) ) { //valid amount
+ if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0)
+ // remove item from inventory
+ pc_delitem(sd,index,amount,0);
+ } // valid amount
+ }// valid index
+ }// storage not full & storage open
+ }
+
+ return 0;
+}
+
+int storage_guild_storageget(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+ int flag;
+
+ nullpo_retr(0, sd);
+
+ if((stor=guild2storage(sd->status.guild_id)) != NULL) {
+ if(stor->storage_status == 1) { // storage open
+ if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
+ if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
+ if((flag = pc_additem(sd,&stor->storage[index],amount)) == 0)
+ guild_storage_delitem(sd,stor,index,amount);
+ else
+ clif_additem(sd,0,0,flag);
+ } // valid amount
+ }// valid index
+ }// storage open
+ }
+
+ return 0;
+}
+
+int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+
+ if((stor=guild2storage(sd->status.guild_id)) != NULL) {
+ if( (stor->storage_amount <= MAX_GUILD_STORAGE) && (stor->storage_status == 1) ) { // storage not full & storage open
+ if(index>=0 && index<MAX_INVENTORY) { // valid index
+ if( (amount <= sd->status.cart[index].amount) && (amount > 0) ) { //valid amount
+ if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0)
+ pc_cart_delitem(sd,index,amount,0);
+ } // valid amount
+ }// valid index
+ }// storage not full & storage open
+ }
+
+ return 0;
+}
+
+int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+
+ if((stor=guild2storage(sd->status.guild_id)) != NULL) {
+ if(stor->storage_status == 1) { // storage open
+ if(index>=0 && index<MAX_GUILD_STORAGE) { // valid index
+ if( (amount <= stor->storage[index].amount) && (amount > 0) ) { //valid amount
+ if(pc_cart_additem(sd,&stor->storage[index],amount)==0){
+ guild_storage_delitem(sd,stor,index,amount);
+ }
+ } // valid amount
+ }// valid index
+ }// storage open
+ }
+
+ return 0;
+}
+
+int storage_guild_storageclose(struct map_session_data *sd)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+
+ if((stor=guild2storage(sd->status.guild_id)) != NULL) {
+ intif_send_guild_storage(sd->status.account_id,stor);
+ stor->storage_status = 0;
+ sd->state.storage_flag = 0;
+ sortage_gsortitem(stor);
+ }
+ clif_storageclose(sd);
+
+ return 0;
+}
+
+int storage_guild_storage_quit(struct map_session_data *sd,int flag)
+{
+ struct guild_storage *stor;
+
+ nullpo_retr(0, sd);
+
+ stor = numdb_search(guild_storage_db,sd->status.guild_id);
+ if(stor) {
+ if(!flag)
+ intif_send_guild_storage(sd->status.account_id,stor);
+ stor->storage_status = 0;
+ sd->state.storage_flag = 0;
+ }
+
+ return 0;
+}
diff --git a/src/map/storage.h b/src/map/storage.h
index 4e89e657a..352dee4f0 100644
--- a/src/map/storage.h
+++ b/src/map/storage.h
@@ -1,39 +1,39 @@
-// $Id: storage.h,v 1.3 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _STORAGE_H_
-#define _STORAGE_H_
-
-#include "mmo.h"
-
-int storage_storageopen(struct map_session_data *sd);
-int storage_storageopen2(struct map_session_data *sd,struct map_session_data *pl_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);
-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 storage_storage_save(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_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
+// $Id: storage.h,v 1.3 2004/09/25 05:32:19 MouseJstr Exp $
+#ifndef _STORAGE_H_
+#define _STORAGE_H_
+
+#include "mmo.h"
+
+int storage_storageopen(struct map_session_data *sd);
+int storage_storageopen2(struct map_session_data *sd,struct map_session_data *pl_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);
+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 storage_storage_save(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_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 41a89cd7a..babcdc6e0 100644
--- a/src/map/trade.c
+++ b/src/map/trade.c
@@ -1,286 +1,286 @@
-#include <stdio.h>
-#include <string.h>
-
-#include "clif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "trade.h"
-#include "pc.h"
-#include "npc.h"
-#include "battle.h"
-#include "nullpo.h"
-#include "log.h"
-
-/*==========================================
- * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
- *------------------------------------------
- */
-void trade_traderequest(struct map_session_data *sd,int target_id)
-{
- struct map_session_data *target_sd;
-
- nullpo_retv(sd);
-
- if((target_sd = map_id2sd(target_id)) != NULL){
- if(!battle_config.invite_request_check) {
- if(target_sd->guild_invite>0 || target_sd->party_invite>0){
- clif_tradestart(sd,2); // ‘ŠŽè‚ÍPT—v¿’†‚©Guild—v¿’†
- return;
- }
- }
- if((target_sd->trade_partner !=0) || (sd->trade_partner !=0)) {
- trade_tradecancel(sd); //person is in another trade
- }
- else{
- if((pc_isGM(sd) < 60) && (sd->bl.m != target_sd->bl.m
- || (sd->bl.x - target_sd->bl.x <= -5 || sd->bl.x - target_sd->bl.x >= 5)
- || (sd->bl.y - target_sd->bl.y <= -5 || sd->bl.y - target_sd->bl.y >= 5))) {
- clif_tradestart(sd,0); //too far
- }
- else if(sd!=target_sd) {
- target_sd->trade_partner = sd->status.account_id;
- sd->trade_partner = target_sd->status.account_id;
- clif_traderequest(target_sd,sd->status.name);
- }
- }
- }
- else{
- clif_tradestart(sd,1); //character does not exist
- }
-}
-
-/*==========================================
- * Žæˆø—v¿
- *------------------------------------------
- */
-void trade_tradeack(struct map_session_data *sd,int type)
-{
- struct map_session_data *target_sd;
-
- nullpo_retv(sd);
-
- if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
- clif_tradestart(target_sd,type);
- clif_tradestart(sd,type);
- if(type == 4){ // Cancel
- sd->deal_locked =0;
- sd->trade_partner=0;
- target_sd->deal_locked=0;
- target_sd->trade_partner=0;
- }
- if(sd->npc_id != 0)
- npc_event_dequeue(sd);
- if(target_sd->npc_id != 0)
- npc_event_dequeue(target_sd);
- }
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁ
- *------------------------------------------
- */
-void trade_tradeadditem(struct map_session_data *sd,int index,int amount)
-{
- struct map_session_data *target_sd;
- int trade_i;
- int trade_weight=0;
- int c;
-
- nullpo_retv(sd);
-
- if(((target_sd = map_id2sd(sd->trade_partner)) != NULL) && (sd->deal_locked < 1)){
- if(index<2 || index>=MAX_INVENTORY+2){
- if(index == 0 && amount > 0 && amount <= sd->status.zeny){
- sd->deal_zeny=amount;
- clif_tradeadditem(sd,target_sd,0,amount);
- }
- }else if(amount <= sd->status.inventory[index-2].amount && amount > 0){
- for(trade_i=0; trade_i<10;trade_i++){
- if(sd->deal_item_amount[trade_i] == 0){
- trade_weight+=sd->inventory_data[index-2]->weight*amount;
- if(target_sd->weight + trade_weight > target_sd->max_weight){
- clif_tradeitemok(sd,index,1); //fail to add item -- the player was over weighted.
- amount = 0; // [MouseJstr]
- }else{
- for(c=0; c==trade_i-1;c++){ // re-deal exploit protection [Valaris]
- if(sd->deal_item_index[c]==index) {
- trade_tradecancel(sd);
- return;
- }
- }
- sd->deal_item_index[trade_i] =index;
- sd->deal_item_amount[trade_i]+=amount;
- clif_tradeitemok(sd,index,0); //success to add item
- clif_tradeadditem(sd,target_sd,index,amount);
- }
- break;
- }else{
- trade_weight+=sd->inventory_data[sd->deal_item_index[trade_i]-2]->weight*sd->deal_item_amount[trade_i];
- }
- }
- }
- }
-}
-
-/*==========================================
- * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
- *------------------------------------------
- */
-void trade_tradeok(struct map_session_data *sd)
-{
- struct map_session_data *target_sd;
- int trade_i;
-
- nullpo_retv(sd);
-
- for(trade_i=0;trade_i<10;trade_i++) {
- if(sd->deal_item_amount[trade_i]>sd->status.inventory[sd->deal_item_index[trade_i]-2].amount ||
- sd->deal_item_amount[trade_i]<0) {
- trade_tradecancel(sd);
- return;
- }
-
- }
-
- if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
- sd->deal_locked=1;
- clif_tradeitemok(sd,0,0);
- clif_tradedeal_lock(sd,0);
- clif_tradedeal_lock(target_sd,1);
- }
-}
-
-/*==========================================
- * ŽæˆøƒLƒƒƒ“ƒZƒ‹
- *------------------------------------------
- */
-void trade_tradecancel(struct map_session_data *sd)
-{
- struct map_session_data *target_sd;
- int trade_i;
-
- nullpo_retv(sd);
-
- if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
- for(trade_i=0; trade_i<10;trade_i++) { //give items back (only virtual)
- if(sd->deal_item_amount[trade_i] != 0) {
- clif_additem(sd,sd->deal_item_index[trade_i]-2,sd->deal_item_amount[trade_i],0);
- sd->deal_item_index[trade_i] =0;
- sd->deal_item_amount[trade_i]=0;
- }
- if(target_sd->deal_item_amount[trade_i] != 0) {
- clif_additem(target_sd,target_sd->deal_item_index[trade_i]-2,target_sd->deal_item_amount[trade_i],0);
- target_sd->deal_item_index[trade_i] =0;
- target_sd->deal_item_amount[trade_i]=0;
- }
- }
- if(sd->deal_zeny) {
- clif_updatestatus(sd,SP_ZENY);
- sd->deal_zeny=0;
- }
- if(target_sd->deal_zeny) {
- clif_updatestatus(target_sd,SP_ZENY);
- target_sd->deal_zeny=0;
- }
- sd->deal_locked =0;
- sd->trade_partner=0;
- target_sd->deal_locked=0;
- target_sd->trade_partner=0;
- clif_tradecancelled(sd);
- clif_tradecancelled(target_sd);
- }
-}
-
-/*==========================================
- * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
- *------------------------------------------
- */
-void trade_tradecommit(struct map_session_data *sd)
-{
- struct map_session_data *target_sd;
- int trade_i;
-
- nullpo_retv(sd);
-
- if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
- if( (sd->deal_locked >=1) && (target_sd->deal_locked >=1) ){ // both have pressed 'ok'
- if(sd->deal_locked < 2) {sd->deal_locked=2;} // set locked to 2
- if(target_sd->deal_locked==2) { // the other one pressed 'trade' too
- for(trade_i=0; trade_i<10;trade_i++) {
- if(sd->deal_item_amount[trade_i] != 0) {
- int n=sd->deal_item_index[trade_i]-2;
- int flag;
-
- //Dupe Fix by mark
- if (sd->status.inventory[n].amount < sd->deal_item_amount[trade_i])
- sd->deal_item_amount[trade_i] = sd->status.inventory[n].amount;
- //End Dupe Fix
-
- #ifndef TXT_ONLY
- if(log_config.trade > 0)
- log_trade(sd,target_sd,n,sd->deal_item_amount[trade_i]);
- #endif //USE_SQL
-
- flag = pc_additem(target_sd,&sd->status.inventory[n],sd->deal_item_amount[trade_i]);
- if(flag==0)
- pc_delitem(sd,n,sd->deal_item_amount[trade_i],1);
- else
- clif_additem(sd,n,sd->deal_item_amount[trade_i],0);
- sd->deal_item_index[trade_i] =0;
- sd->deal_item_amount[trade_i]=0;
- }
- if(target_sd->deal_item_amount[trade_i] != 0) {
- int n=target_sd->deal_item_index[trade_i]-2;
- int flag;
-
- //Dupe Fix by mark
- if (target_sd->status.inventory[n].amount < target_sd->deal_item_amount[trade_i])
- target_sd->deal_item_amount[trade_i] = target_sd->status.inventory[n].amount;
- //End Dupe Fix
-
- #ifndef TXT_ONLY
- if(log_config.trade > 0)
- log_trade(target_sd,sd,n,target_sd->deal_item_amount[trade_i]);
- #endif //USE_SQL
-
- flag = pc_additem(sd,&target_sd->status.inventory[n],target_sd->deal_item_amount[trade_i]);
- if(flag==0)
- pc_delitem(target_sd,n,target_sd->deal_item_amount[trade_i],1);
- else
- clif_additem(target_sd,n,target_sd->deal_item_amount[trade_i],0);
- target_sd->deal_item_index[trade_i] =0;
- target_sd->deal_item_amount[trade_i]=0;
- }
- }
- if(sd->deal_zeny) {
- #ifndef TXT_ONLY
- if (log_config.trade > 0 && log_config.zeny > 0)
- log_zeny(sd, target_sd, sd->deal_zeny);
- #endif //USE_SQL
- sd->status.zeny -= sd->deal_zeny;
- clif_updatestatus(sd,SP_ZENY);
- target_sd->status.zeny += sd->deal_zeny;
- clif_updatestatus(target_sd,SP_ZENY);
- sd->deal_zeny=0;
- }
- if(target_sd->deal_zeny) {
- #ifndef TXT_ONLY
- if (log_config.trade > 0 && log_config.zeny > 0)
- log_zeny(target_sd, sd, target_sd->deal_zeny);
- #endif //USE_SQL
- target_sd->status.zeny -= target_sd->deal_zeny;
- clif_updatestatus(target_sd,SP_ZENY);
- sd->status.zeny += target_sd->deal_zeny;
- clif_updatestatus(sd,SP_ZENY);
- target_sd->deal_zeny=0;
- }
- sd->deal_locked =0;
- sd->trade_partner=0;
- target_sd->deal_locked=0;
- target_sd->trade_partner=0;
- clif_tradecompleted(sd,0);
- clif_tradecompleted(target_sd,0);
- }
- }
- }
-}
+#include <stdio.h>
+#include <string.h>
+
+#include "clif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "trade.h"
+#include "pc.h"
+#include "npc.h"
+#include "battle.h"
+#include "nullpo.h"
+#include "log.h"
+
+/*==========================================
+ * Žæˆø—v¿‚ð‘ŠŽè‚É‘—‚é
+ *------------------------------------------
+ */
+void trade_traderequest(struct map_session_data *sd,int target_id)
+{
+ struct map_session_data *target_sd;
+
+ nullpo_retv(sd);
+
+ if((target_sd = map_id2sd(target_id)) != NULL){
+ if(!battle_config.invite_request_check) {
+ if(target_sd->guild_invite>0 || target_sd->party_invite>0){
+ clif_tradestart(sd,2); // ‘ŠŽè‚ÍPT—v¿’†‚©Guild—v¿’†
+ return;
+ }
+ }
+ if((target_sd->trade_partner !=0) || (sd->trade_partner !=0)) {
+ trade_tradecancel(sd); //person is in another trade
+ }
+ else{
+ if((pc_isGM(sd) < 60) && (sd->bl.m != target_sd->bl.m
+ || (sd->bl.x - target_sd->bl.x <= -5 || sd->bl.x - target_sd->bl.x >= 5)
+ || (sd->bl.y - target_sd->bl.y <= -5 || sd->bl.y - target_sd->bl.y >= 5))) {
+ clif_tradestart(sd,0); //too far
+ }
+ else if(sd!=target_sd) {
+ target_sd->trade_partner = sd->status.account_id;
+ sd->trade_partner = target_sd->status.account_id;
+ clif_traderequest(target_sd,sd->status.name);
+ }
+ }
+ }
+ else{
+ clif_tradestart(sd,1); //character does not exist
+ }
+}
+
+/*==========================================
+ * Žæˆø—v¿
+ *------------------------------------------
+ */
+void trade_tradeack(struct map_session_data *sd,int type)
+{
+ struct map_session_data *target_sd;
+
+ nullpo_retv(sd);
+
+ if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
+ clif_tradestart(target_sd,type);
+ clif_tradestart(sd,type);
+ if(type == 4){ // Cancel
+ sd->deal_locked =0;
+ sd->trade_partner=0;
+ target_sd->deal_locked=0;
+ target_sd->trade_partner=0;
+ }
+ if(sd->npc_id != 0)
+ npc_event_dequeue(sd);
+ if(target_sd->npc_id != 0)
+ npc_event_dequeue(target_sd);
+ }
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁ
+ *------------------------------------------
+ */
+void trade_tradeadditem(struct map_session_data *sd,int index,int amount)
+{
+ struct map_session_data *target_sd;
+ int trade_i;
+ int trade_weight=0;
+ int c;
+
+ nullpo_retv(sd);
+
+ if(((target_sd = map_id2sd(sd->trade_partner)) != NULL) && (sd->deal_locked < 1)){
+ if(index<2 || index>=MAX_INVENTORY+2){
+ if(index == 0 && amount > 0 && amount <= sd->status.zeny){
+ sd->deal_zeny=amount;
+ clif_tradeadditem(sd,target_sd,0,amount);
+ }
+ }else if(amount <= sd->status.inventory[index-2].amount && amount > 0){
+ for(trade_i=0; trade_i<10;trade_i++){
+ if(sd->deal_item_amount[trade_i] == 0){
+ trade_weight+=sd->inventory_data[index-2]->weight*amount;
+ if(target_sd->weight + trade_weight > target_sd->max_weight){
+ clif_tradeitemok(sd,index,1); //fail to add item -- the player was over weighted.
+ amount = 0; // [MouseJstr]
+ }else{
+ for(c=0; c==trade_i-1;c++){ // re-deal exploit protection [Valaris]
+ if(sd->deal_item_index[c]==index) {
+ trade_tradecancel(sd);
+ return;
+ }
+ }
+ sd->deal_item_index[trade_i] =index;
+ sd->deal_item_amount[trade_i]+=amount;
+ clif_tradeitemok(sd,index,0); //success to add item
+ clif_tradeadditem(sd,target_sd,index,amount);
+ }
+ break;
+ }else{
+ trade_weight+=sd->inventory_data[sd->deal_item_index[trade_i]-2]->weight*sd->deal_item_amount[trade_i];
+ }
+ }
+ }
+ }
+}
+
+/*==========================================
+ * ƒAƒCƒeƒ€’ljÁŠ®—¹(ok‰Ÿ‚µ)
+ *------------------------------------------
+ */
+void trade_tradeok(struct map_session_data *sd)
+{
+ struct map_session_data *target_sd;
+ int trade_i;
+
+ nullpo_retv(sd);
+
+ for(trade_i=0;trade_i<10;trade_i++) {
+ if(sd->deal_item_amount[trade_i]>sd->status.inventory[sd->deal_item_index[trade_i]-2].amount ||
+ sd->deal_item_amount[trade_i]<0) {
+ trade_tradecancel(sd);
+ return;
+ }
+
+ }
+
+ if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
+ sd->deal_locked=1;
+ clif_tradeitemok(sd,0,0);
+ clif_tradedeal_lock(sd,0);
+ clif_tradedeal_lock(target_sd,1);
+ }
+}
+
+/*==========================================
+ * ŽæˆøƒLƒƒƒ“ƒZƒ‹
+ *------------------------------------------
+ */
+void trade_tradecancel(struct map_session_data *sd)
+{
+ struct map_session_data *target_sd;
+ int trade_i;
+
+ nullpo_retv(sd);
+
+ if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
+ for(trade_i=0; trade_i<10;trade_i++) { //give items back (only virtual)
+ if(sd->deal_item_amount[trade_i] != 0) {
+ clif_additem(sd,sd->deal_item_index[trade_i]-2,sd->deal_item_amount[trade_i],0);
+ sd->deal_item_index[trade_i] =0;
+ sd->deal_item_amount[trade_i]=0;
+ }
+ if(target_sd->deal_item_amount[trade_i] != 0) {
+ clif_additem(target_sd,target_sd->deal_item_index[trade_i]-2,target_sd->deal_item_amount[trade_i],0);
+ target_sd->deal_item_index[trade_i] =0;
+ target_sd->deal_item_amount[trade_i]=0;
+ }
+ }
+ if(sd->deal_zeny) {
+ clif_updatestatus(sd,SP_ZENY);
+ sd->deal_zeny=0;
+ }
+ if(target_sd->deal_zeny) {
+ clif_updatestatus(target_sd,SP_ZENY);
+ target_sd->deal_zeny=0;
+ }
+ sd->deal_locked =0;
+ sd->trade_partner=0;
+ target_sd->deal_locked=0;
+ target_sd->trade_partner=0;
+ clif_tradecancelled(sd);
+ clif_tradecancelled(target_sd);
+ }
+}
+
+/*==========================================
+ * Žæˆø‹–‘ø(trade‰Ÿ‚µ)
+ *------------------------------------------
+ */
+void trade_tradecommit(struct map_session_data *sd)
+{
+ struct map_session_data *target_sd;
+ int trade_i;
+
+ nullpo_retv(sd);
+
+ if((target_sd = map_id2sd(sd->trade_partner)) != NULL){
+ if( (sd->deal_locked >=1) && (target_sd->deal_locked >=1) ){ // both have pressed 'ok'
+ if(sd->deal_locked < 2) {sd->deal_locked=2;} // set locked to 2
+ if(target_sd->deal_locked==2) { // the other one pressed 'trade' too
+ for(trade_i=0; trade_i<10;trade_i++) {
+ if(sd->deal_item_amount[trade_i] != 0) {
+ int n=sd->deal_item_index[trade_i]-2;
+ int flag;
+
+ //Dupe Fix by mark
+ if (sd->status.inventory[n].amount < sd->deal_item_amount[trade_i])
+ sd->deal_item_amount[trade_i] = sd->status.inventory[n].amount;
+ //End Dupe Fix
+
+ #ifndef TXT_ONLY
+ if(log_config.trade > 0)
+ log_trade(sd,target_sd,n,sd->deal_item_amount[trade_i]);
+ #endif //USE_SQL
+
+ flag = pc_additem(target_sd,&sd->status.inventory[n],sd->deal_item_amount[trade_i]);
+ if(flag==0)
+ pc_delitem(sd,n,sd->deal_item_amount[trade_i],1);
+ else
+ clif_additem(sd,n,sd->deal_item_amount[trade_i],0);
+ sd->deal_item_index[trade_i] =0;
+ sd->deal_item_amount[trade_i]=0;
+ }
+ if(target_sd->deal_item_amount[trade_i] != 0) {
+ int n=target_sd->deal_item_index[trade_i]-2;
+ int flag;
+
+ //Dupe Fix by mark
+ if (target_sd->status.inventory[n].amount < target_sd->deal_item_amount[trade_i])
+ target_sd->deal_item_amount[trade_i] = target_sd->status.inventory[n].amount;
+ //End Dupe Fix
+
+ #ifndef TXT_ONLY
+ if(log_config.trade > 0)
+ log_trade(target_sd,sd,n,target_sd->deal_item_amount[trade_i]);
+ #endif //USE_SQL
+
+ flag = pc_additem(sd,&target_sd->status.inventory[n],target_sd->deal_item_amount[trade_i]);
+ if(flag==0)
+ pc_delitem(target_sd,n,target_sd->deal_item_amount[trade_i],1);
+ else
+ clif_additem(target_sd,n,target_sd->deal_item_amount[trade_i],0);
+ target_sd->deal_item_index[trade_i] =0;
+ target_sd->deal_item_amount[trade_i]=0;
+ }
+ }
+ if(sd->deal_zeny) {
+ #ifndef TXT_ONLY
+ if (log_config.trade > 0 && log_config.zeny > 0)
+ log_zeny(sd, target_sd, sd->deal_zeny);
+ #endif //USE_SQL
+ sd->status.zeny -= sd->deal_zeny;
+ clif_updatestatus(sd,SP_ZENY);
+ target_sd->status.zeny += sd->deal_zeny;
+ clif_updatestatus(target_sd,SP_ZENY);
+ sd->deal_zeny=0;
+ }
+ if(target_sd->deal_zeny) {
+ #ifndef TXT_ONLY
+ if (log_config.trade > 0 && log_config.zeny > 0)
+ log_zeny(target_sd, sd, target_sd->deal_zeny);
+ #endif //USE_SQL
+ target_sd->status.zeny -= target_sd->deal_zeny;
+ clif_updatestatus(target_sd,SP_ZENY);
+ sd->status.zeny += target_sd->deal_zeny;
+ clif_updatestatus(sd,SP_ZENY);
+ target_sd->deal_zeny=0;
+ }
+ sd->deal_locked =0;
+ sd->trade_partner=0;
+ target_sd->deal_locked=0;
+ target_sd->trade_partner=0;
+ clif_tradecompleted(sd,0);
+ clif_tradecompleted(target_sd,0);
+ }
+ }
+ }
+}
diff --git a/src/map/trade.h b/src/map/trade.h
index d796df8e6..01cbce7eb 100644
--- a/src/map/trade.h
+++ b/src/map/trade.h
@@ -1,13 +1,13 @@
-// $Id: trade.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#ifndef _TRADE_H_
-#define _TRADE_H_
-
-#include "map.h"
-void trade_traderequest(struct map_session_data *sd,int target_id);
-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_
+// $Id: trade.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
+#ifndef _TRADE_H_
+#define _TRADE_H_
+
+#include "map.h"
+void trade_traderequest(struct map_session_data *sd,int target_id);
+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 703b1b9b9..0bf0b884e 100644
--- a/src/map/vending.c
+++ b/src/map/vending.c
@@ -1,170 +1,170 @@
-// $Id: vending.c,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#include <stdio.h>
-#include <string.h>
-
-#include "clif.h"
-#include "itemdb.h"
-#include "map.h"
-#include "vending.h"
-#include "pc.h"
-#include "skill.h"
-#include "battle.h"
-#include "nullpo.h"
-#include "log.h"
-
-/*==========================================
- * ˜I“X•Â½
- *------------------------------------------
-*/
-void vending_closevending(struct map_session_data *sd)
-{
-
- nullpo_retv(sd);
-
- sd->vender_id=0;
- clif_closevendingboard(&sd->bl,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,z,new=0,blank,vend_list[12];
- short amount,index;
- struct map_session_data *vsd=map_id2sd(id);
-
- nullpo_retv(sd);
-
- blank=pc_inventoryblank(sd);
-
- if(vsd==NULL)
- return;
- if(vsd->vender_id==0)
- return;
- if(vsd->vender_id==sd->bl.id)
- return;
- for(i=0,w=z=0;8+4*i<len;i++){
- amount=*(short*)(p+4*i);
- index=*(short*)(p+2+4*i)-2;
-/*
- if(amount < 0) return; //add
- for(j=0;j<vsd->vend_num;j++)
- if(0<vsd->vending[j].amount && amount<=vsd->vending[j].amount && vsd->vending[j].index==index)
- break;
-*/
-//ADD_start
- for(j=0;j < vsd->vend_num;j++) {
- if(0 < vsd->vending[j].amount && vsd->vending[j].index==index) {
- if(amount > vsd->vending[j].amount || amount <= 0) {
- clif_buyvending(sd,index,vsd->vending[j].amount,4);
- return;
- }
- if(amount <= vsd->vending[j].amount) break;
- }
- }
-//ADD_end
- if(j==vsd->vend_num)
- return; // ”„‚èØ‚ê
- vend_list[i]=j;
- z+=vsd->vending[j].value*amount;
- if(z > sd->status.zeny){
- clif_buyvending(sd,index,amount,1);
- return; // zeny•s‘«
- }
- w+=itemdb_weight(vsd->status.cart[index].nameid)*amount;
- if(w+sd->weight > sd->max_weight){
- clif_buyvending(sd,index,amount,2);
- return; // d—Ê’´‰ß
- }
- switch(pc_checkadditem(sd,vsd->status.cart[index].nameid,amount)){
- case ADDITEM_EXIST:
- break;
- case ADDITEM_NEW:
- new++;
- if(new > blank)
- return; // Ží—Þ”’´‰ß
- break;
- case ADDITEM_OVERAMOUNT:
- return; // ƒAƒCƒeƒ€”’´‰ß
- }
- }
- if(z < 0 || z > MAX_ZENY){ //Zeny Bug Fixed by Darkchild
- clif_tradecancelled(sd);
- clif_tradecancelled(vsd);
- return;
- }
- pc_payzeny(sd,z);
- pc_getzeny(vsd,z);
- for(i=0;8+4*i<len;i++){
- amount=*(short*)(p+4*i);
- index=*(short*)(p+2+4*i)-2;
- if(amount < 0) break; //add
- pc_additem(sd,&vsd->status.cart[index],amount);
-
- #ifndef TXT_ONLY
- if(log_config.vend > 0)
- log_vend(vsd,sd,index,amount,z);
- #endif
-
- vsd->vending[vend_list[i]].amount-=amount;
- pc_cart_delitem(vsd,index,amount,0);
- clif_vendingreport(vsd,index,amount);
- }
-}
-
-/*==========================================
- * ˜I“XŠJÝ
- *------------------------------------------
- */
-void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p)
-{
- int i;
-
- nullpo_retv(sd);
-
- if(!pc_checkskill(sd,MC_VENDING) || !pc_iscarton(sd)) { // cart skill and cart check [Valaris]
- clif_skill_fail(sd,MC_VENDING,0,0);
- return;
- }
-
- if(flag){
- for(i=0;85+8*i<len;i++){
- sd->vending[i].index=*(short*)(p+8*i)-2;
- sd->vending[i].amount=*(short*)(p+2+8*i);
- sd->vending[i].value=*(int*)(p+4+8*i);
- if(sd->vending[i].value>battle_config.vending_max_value)sd->vending[i].value=battle_config.vending_max_value;
- // ƒJ[ƒg“à‚̃AƒCƒeƒ€”‚Ɣ̔„‚·‚éƒAƒCƒeƒ€”‚É‘Šˆá‚ª‚ ‚Á‚½‚ç’†Ž~
- if(pc_cartitem_amount(sd,sd->vending[i].index,sd->vending[i].amount)<0 || sd->vending[i].value < 0) { // fixes by Valaris and fritz
- clif_skill_fail(sd,MC_VENDING,0,0);
- return;
- }
- }
- sd->vender_id=sd->bl.id;
- sd->vend_num=i;
- strcpy(sd->message,message);
- if(clif_openvending(sd,sd->vender_id,sd->vending) > 0)
- clif_showvendingboard(&sd->bl,message,0);
- else
- sd->vender_id=0;
- }
-}
-
+// $Id: vending.c,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
+#include <stdio.h>
+#include <string.h>
+
+#include "clif.h"
+#include "itemdb.h"
+#include "map.h"
+#include "vending.h"
+#include "pc.h"
+#include "skill.h"
+#include "battle.h"
+#include "nullpo.h"
+#include "log.h"
+
+/*==========================================
+ * ˜I“X•Â½
+ *------------------------------------------
+*/
+void vending_closevending(struct map_session_data *sd)
+{
+
+ nullpo_retv(sd);
+
+ sd->vender_id=0;
+ clif_closevendingboard(&sd->bl,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,z,new=0,blank,vend_list[12];
+ short amount,index;
+ struct map_session_data *vsd=map_id2sd(id);
+
+ nullpo_retv(sd);
+
+ blank=pc_inventoryblank(sd);
+
+ if(vsd==NULL)
+ return;
+ if(vsd->vender_id==0)
+ return;
+ if(vsd->vender_id==sd->bl.id)
+ return;
+ for(i=0,w=z=0;8+4*i<len;i++){
+ amount=*(short*)(p+4*i);
+ index=*(short*)(p+2+4*i)-2;
+/*
+ if(amount < 0) return; //add
+ for(j=0;j<vsd->vend_num;j++)
+ if(0<vsd->vending[j].amount && amount<=vsd->vending[j].amount && vsd->vending[j].index==index)
+ break;
+*/
+//ADD_start
+ for(j=0;j < vsd->vend_num;j++) {
+ if(0 < vsd->vending[j].amount && vsd->vending[j].index==index) {
+ if(amount > vsd->vending[j].amount || amount <= 0) {
+ clif_buyvending(sd,index,vsd->vending[j].amount,4);
+ return;
+ }
+ if(amount <= vsd->vending[j].amount) break;
+ }
+ }
+//ADD_end
+ if(j==vsd->vend_num)
+ return; // ”„‚èØ‚ê
+ vend_list[i]=j;
+ z+=vsd->vending[j].value*amount;
+ if(z > sd->status.zeny){
+ clif_buyvending(sd,index,amount,1);
+ return; // zeny•s‘«
+ }
+ w+=itemdb_weight(vsd->status.cart[index].nameid)*amount;
+ if(w+sd->weight > sd->max_weight){
+ clif_buyvending(sd,index,amount,2);
+ return; // d—Ê’´‰ß
+ }
+ switch(pc_checkadditem(sd,vsd->status.cart[index].nameid,amount)){
+ case ADDITEM_EXIST:
+ break;
+ case ADDITEM_NEW:
+ new++;
+ if(new > blank)
+ return; // Ží—Þ”’´‰ß
+ break;
+ case ADDITEM_OVERAMOUNT:
+ return; // ƒAƒCƒeƒ€”’´‰ß
+ }
+ }
+ if(z < 0 || z > MAX_ZENY){ //Zeny Bug Fixed by Darkchild
+ clif_tradecancelled(sd);
+ clif_tradecancelled(vsd);
+ return;
+ }
+ pc_payzeny(sd,z);
+ pc_getzeny(vsd,z);
+ for(i=0;8+4*i<len;i++){
+ amount=*(short*)(p+4*i);
+ index=*(short*)(p+2+4*i)-2;
+ if(amount < 0) break; //add
+ pc_additem(sd,&vsd->status.cart[index],amount);
+
+ #ifndef TXT_ONLY
+ if(log_config.vend > 0)
+ log_vend(vsd,sd,index,amount,z);
+ #endif
+
+ vsd->vending[vend_list[i]].amount-=amount;
+ pc_cart_delitem(vsd,index,amount,0);
+ clif_vendingreport(vsd,index,amount);
+ }
+}
+
+/*==========================================
+ * ˜I“XŠJÝ
+ *------------------------------------------
+ */
+void vending_openvending(struct map_session_data *sd,int len,char *message,int flag,unsigned char *p)
+{
+ int i;
+
+ nullpo_retv(sd);
+
+ if(!pc_checkskill(sd,MC_VENDING) || !pc_iscarton(sd)) { // cart skill and cart check [Valaris]
+ clif_skill_fail(sd,MC_VENDING,0,0);
+ return;
+ }
+
+ if(flag){
+ for(i=0;85+8*i<len;i++){
+ sd->vending[i].index=*(short*)(p+8*i)-2;
+ sd->vending[i].amount=*(short*)(p+2+8*i);
+ sd->vending[i].value=*(int*)(p+4+8*i);
+ if(sd->vending[i].value>battle_config.vending_max_value)sd->vending[i].value=battle_config.vending_max_value;
+ // ƒJ[ƒg“à‚̃AƒCƒeƒ€”‚Ɣ̔„‚·‚éƒAƒCƒeƒ€”‚É‘Šˆá‚ª‚ ‚Á‚½‚ç’†Ž~
+ if(pc_cartitem_amount(sd,sd->vending[i].index,sd->vending[i].amount)<0 || sd->vending[i].value < 0) { // fixes by Valaris and fritz
+ clif_skill_fail(sd,MC_VENDING,0,0);
+ return;
+ }
+ }
+ sd->vender_id=sd->bl.id;
+ sd->vend_num=i;
+ strcpy(sd->message,message);
+ if(clif_openvending(sd,sd->vender_id,sd->vending) > 0)
+ clif_showvendingboard(&sd->bl,message,0);
+ else
+ sd->vender_id=0;
+ }
+}
+
diff --git a/src/map/vending.h b/src/map/vending.h
index e5b958386..41aa731bb 100644
--- a/src/map/vending.h
+++ b/src/map/vending.h
@@ -1,12 +1,12 @@
-// $Id: vending.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
-#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_
+// $Id: vending.h,v 1.2 2004/09/25 05:32:19 MouseJstr Exp $
+#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/txt-converter/char/Makefile b/src/txt-converter/char/Makefile
index b88df2610..56723ca5a 100644
--- a/src/txt-converter/char/Makefile
+++ b/src/txt-converter/char/Makefile
@@ -1,13 +1,13 @@
-all: char-converter
-sql: char-converter
-
-COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/db.o ../../common/malloc.o
-
-char-converter: char-converter.o strlib.o $(COMMON_OBJ)
- $(CC) -o ../../../$@ $^ $(LIB_S)
-
-char-converter.o: char-converter.c char.h strlib.h
-strlib.o: strlib.c strlib.h
-clean:
- rm -f *.o ../../../char-converter
-
+all: char-converter
+sql: char-converter
+
+COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/db.o ../../common/malloc.o
+
+char-converter: char-converter.o strlib.o $(COMMON_OBJ)
+ $(CC) -o ../../../$@ $^ $(LIB_S)
+
+char-converter.o: char-converter.c char.h strlib.h
+strlib.o: strlib.c strlib.h
+clean:
+ rm -f *.o ../../../char-converter
+
diff --git a/src/txt-converter/char/char-converter.c b/src/txt-converter/char/char-converter.c
index c3aa25573..8928e240f 100644
--- a/src/txt-converter/char/char-converter.c
+++ b/src/txt-converter/char/char-converter.c
@@ -1,842 +1,842 @@
-// $Id: char-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
-// original : char2.c 2003/03/14 11:58:35 Rev.1.5
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-
-#define STORAGE_MEMINC 16
-
-#include "char.h"
-#include "strlib.h"
-
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-char pet_txt[256]="save/pet.txt";
-char storage_txt[256]="save/storage.txt";
-
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-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";
-
-struct storage *storage=NULL;
-
-struct mmo_map_server server[MAX_MAP_SERVERS];
-int server_fd[MAX_MAP_SERVERS];
-
-int login_fd;
-char userid[24];
-char passwd[24];
-char server_name[20];
-char login_ip_str[16];
-int login_port = 6900;
-char char_ip_str[16];
-int char_ip;
-int char_port = 6121;
-int char_maintenance;
-int char_new;
-char char_txt[256];
-
-char t_name[256];
-
-#define CHAR_STATE_WAITAUTH 0
-#define CHAR_STATE_AUTHOK 1
-struct char_session_data{
- int state;
- int account_id, login_id1, login_id2, sex;
- int found_char[9];
-};
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id, char_id, login_id1, char_pos, delflag, sex;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos=0;
-
-int char_id_count=100000;
-struct mmo_charstatus *char_dat;
-int char_num, char_max;
-int max_connect_user=0;
-int autosave_interval=DEFAULT_AUTOSAVE_INTERVAL;
-
-// Ãʱâ À§Ä¡(conf ÆÄÀϷκÎÅÍ Àç¼³Á¤ °¡´É)
-struct point start_point={"new_1-1.gat", 53,111};
-
-
-
-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, 24);
- 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;
-}
-//---------------------------------------------------------
-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 tmp_sql[65535];
- MYSQL_RES* sql_res ;
- MYSQL_ROW sql_row ;
-
- 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;
- sprintf(tmp_sql,"SELECT * FROM `pet` WHERE `pet_id`='%d'",pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- sql_row = mysql_fetch_row(sql_res); //row fetching
- if (!sql_row) //no row -> insert
- sprintf(tmp_sql,"INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->pet_id, 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 //row reside -> updating
- sprintf(tmp_sql, "UPDATE `pet` 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'",
- 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);
- mysql_free_result(sql_res) ; //resource free
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- printf ("pet dump success! - %d:%s\n", pet_id, p->name);
-
- return 0;
-}
-
-int storage_tosql(int account_id,struct storage *p){
- // id -> DB dump
- // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- int i,j;
-
- j=0;
-
- //printf ("starting storage dump to DB - id: %d\n", account_id);
-
- //delete old data.
- sprintf(tmp_sql,"DELETE FROM `storage` WHERE `account_id`='%d'",account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
-
- //printf ("all storage item was deleted ok\n");
-
- for(i=0;i<MAX_STORAGE;i++) {
- //printf ("save storage num: %d (%d:%d)\n",i, p->storage[i].nameid , p->storage[i].amount);
-
- if( (p->storage[i].nameid) && (p->storage[i].amount) ){
- sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->account_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,
- p->storage[i].card[0], p->storage[i].card[1], p->storage[i].card[2], p->storage[i].card[3], p->storage[i].broken );
- //printf ("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
- }
- j++;
- }
- }
-
- printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
- return 0;
-}
-// char to storage
-int storage_fromstr(char *str, struct storage *p)
-{
- int tmp_int[256];
- int set, next, len, i;
-
- set=sscanf(str,"%d, %d%n", &tmp_int[0], &tmp_int[1], &next);
- p->storage_amount=tmp_int[1];
-
- if(set!=2)
- return 0;
- if(str[next]=='\n' || str[next]=='\r')
- return 1;
- next++;
- for(i=0;str[next] && str[next]!='\t';i++){
- if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- p->storage[i].broken = tmp_int[11];
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else if(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) == 11) {
- 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];
- p->storage[i].card[0] = tmp_int[7];
- p->storage[i].card[1] = tmp_int[8];
- p->storage[i].card[2] = tmp_int[9];
- p->storage[i].card[3] = tmp_int[10];
- p->storage[i].broken = 0;
- next += len;
- if (str[next] == ' ')
- next++;
- }
-
- else return 0;
- }
- return 1;
-}
-
-/////////////////////////////////
-int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
- int tmp_int[256];
- int set, next, len, i;
-
- // initilialise character
- memset(p, '\0', sizeof(struct mmo_charstatus));
-
- // If it's not char structure of version 1008 and after
- if ((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,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
- "\t%[^,],%d,%d\t%[^,],%d,%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], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
- tmp_int[39] = 0; // partner id
- // If not char structure from version 384 to 1007
- if ((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,%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], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
- // It's char structure of a version before 384
- tmp_int[26] = 0; // pet id
- 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[27], &tmp_int[28], &tmp_int[29],
- &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
- p->last_point.map, &tmp_int[35], &tmp_int[36], //
- p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
- set += 2;
- //printf("char: old char data ver.1\n");
- // Char structure of version 1007 or older
- } else {
- set++;
- //printf("char: old char data ver.2\n");
- }
- // Char structure of version 1008+
- } else {
- //printf("char: new char data ver.3\n");
- }
- if (set != 43)
- return 0;
-
- 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 = 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];
-
- // Some checks
- for(i = 0; i < char_num; i++) {
- if (char_dat[i].char_id == p->char_id) {
- printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
- printf(" character id #%d -> new character not readed.\n", p->char_id);
- printf(" Character saved in log file.\033[0m\n");
- return -1;
- } else if (strcmp(char_dat[i].name, p->name) == 0) {
- printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
- printf(" character name '%s' -> new character not readed.\n", p->name);
- printf(" Character saved in log file.\033[0m\n");
- return -2;
- }
- }
-
- 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 -3;
- 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++) {
- if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if(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) == 11) {
- tmp_int[11] = 0; // broken doesn't exist in this version -> 0
- } else // invalid structure
- return -4;
- 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];
- p->inventory[i].broken = tmp_int[11];
- 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,%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], &tmp_int[11], &len) == 12) {
- // do nothing, it's ok
- } else if (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) == 11) {
- tmp_int[11] = 0; // broken doesn't exist in this version -> 0
- } else // invalid structure
- return -5;
- 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];
- p->cart[i].broken = tmp_int[11];
- 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 -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
- set = sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len);
- if (set != 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, ",%d%n", &p->global_reg[i].value, &len) == 1)
- i--;
- else
- return -7;
- }
- next += len;
- if (str[next] == ' ')
- next++;
- }
- p->global_reg_num = i;
-
- return 1;
-}
-
-//==========================================================================================================
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i,save_flag;
-
- save_flag = char_id;
- printf("request save char data... (%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`)
- sprintf(tmp_sql ,"INSERT INTO `char` SET `char_id`='%d', `account_id`='%d', `char_num`='%d', `name`='%s', `class`='%d', `base_level`='%d', `job_level`='%d',"
- "`base_exp`='%d', `job_exp`='%d', `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'",
- 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->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->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, p->partner_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql,"DELETE FROM `memo` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<10;i++){
- if(p->memo_point[i].map[0]){
- sprintf(tmp_sql,"INSERT INTO `memo`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
- char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
- sprintf(tmp_sql,"DELETE FROM `inventory` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_INVENTORY;i++){
- if(p->inventory[i].nameid){
- sprintf(tmp_sql,"INSERT INTO `inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
- " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- p->inventory[i].id, char_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], p->inventory[i].broken);
- if(mysql_query(&mysql_handle, tmp_sql) )
- printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
-
- //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
- sprintf (tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id`='%d'", char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_CART;i++){
- if(p->cart[i].nameid){
- sprintf(tmp_sql,"INSERT INTO `cart_inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
- " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )",
- p->cart[i].id, char_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], p->cart[i].broken );
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
-
- //`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql,"DELETE FROM `skill` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<MAX_SKILL;i++){
- if(p->skill[i].id){
- if (p->skill[i].id && p->skill[i].flag!=1) {
- sprintf(tmp_sql,"INSERT INTO `skill`(`char_id`,`id`, `lv`) VALUES ('%d', '%d', '%d')",
- char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
- }
- //`global_reg_value` (`char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `global_reg_value` WHERE `char_id`='%d'",char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
-
- //insert here.
- for(i=0;i<p->global_reg_num;i++){
- if(p->global_reg[i].value !=0){
- sprintf(tmp_sql,"INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
- char_id, p->global_reg[i].str, p->global_reg[i].value);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
- }
- }
- }
-
- printf("saving char is done... (%d)\n",char_id);
- save_flag = 0;
-
- return 0;
-}
-//==========================================================================================================
-
-int mmo_char_init(void){
- char line[65536];
- struct s_pet *p;
- int ret;
- int i=0,set,tmp_int[2], c= 0;
- char input;
- FILE *fp;
-
-
- //DB connection initialized
- mysql_init(&mysql_handle);
- printf("Connect DB server.... (inter server)\n");
- 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! (inter server)\n");
- }
-
-
-
- printf("Warning : Make sure you backup your databases before continuing!\n");
- printf("\nDo you wish to convert your Character Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y'){
- printf("\nConverting Character Database...\n");
- fp=fopen("save/athena.txt","r");
- char_dat=malloc(sizeof(char_dat[0])*256);
- char_max=256;
- if(fp==NULL)
- return 0;
- while(fgets(line, 65535, fp)){
- if(char_num>=char_max){
- char_max+=256;
- char_dat=realloc(char_dat, sizeof(char_dat[0]) *char_max);
- }
- memset(&char_dat[char_num], 0, sizeof(char_dat[0]));
- ret=mmo_char_fromstr(line, &char_dat[char_num]);
- if(ret){
- mmo_char_tosql(char_dat[char_num].char_id , &char_dat[char_num]);
- printf ("convert %d -> DB\n",char_dat[char_num].char_id);
- if(char_dat[char_num].char_id>=char_id_count)
- char_id_count=char_dat[char_num].char_id+1;
- char_num++;
- }
- }
- printf("char data convert end\n");
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\nDo you wish to convert your Storage Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- printf("\nConverting Storage Database...\n");
- fp=fopen(storage_txt,"r");
- if(fp==NULL){
- printf("cant't read : %s\n",storage_txt);
- return 0;
- }
-
- while(fgets(line,65535,fp)){
- set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
- if(set==2) {
- if(i==0){
- storage=malloc(sizeof(struct storage));
- }else{
- storage=realloc(storage,sizeof(struct storage)*(i+1));
- }
- memset(&storage[i],0,sizeof(struct storage));
- storage[i].account_id=tmp_int[0];
- storage_fromstr(line,&storage[i]);
- storage_tosql(tmp_int[0],&storage[i]); //to sql. (dump)
- i++;
- }
- }
- fclose(fp);
- }
-
- while(getchar() != '\n');
- printf("\nDo you wish to convert your Pet Database to SQL? (y/n) : ");
- input=getchar();
- if(input == 'y' || input == 'Y') {
- printf("\nConverting Pet Database...\n");
- if( (fp=fopen(pet_txt,"r")) ==NULL )
- return 1;
-
- p=malloc(sizeof(struct s_pet));
- while(fgets(line, sizeof(line), fp)){
- if(p==NULL){
- printf("int_pet: out of memory!\n");
- exit(0);
- }
- if(inter_pet_fromstr(line, p)==0 && p->pet_id>0){
- //pet dump
- inter_pet_tosql(p->pet_id,p);
- }else{
- printf("int_pet: broken data [%s] line %d\n", pet_txt, c);
- }
- c++;
- }
- fclose(fp);
- }
-
- return 0;
-}
-int inter_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)){
- i=sscanf(line,"%[^:]:%s", w1, w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"storage_txt")==0){
- printf ("set storage_txt : %s\n",w2);
- strncpy(storage_txt, w2, sizeof(storage_txt));
- } else if(strcmpi(w1,"pet_txt")==0){
- printf ("set pet_txt : %s\n",w2);
- strncpy(pet_txt, w2, sizeof(pet_txt));
- }
- //add for DB connection
- else 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);
- }
- }
- fclose(fp);
-
- printf("Reading interserver configuration: Done\n");
-
- return 0;
-}
-
-int char_config_read(const char *cfgName) {
- int i;
- char line[1024], w1[1024], w2[1024];
- FILE *fp;
-
- printf ("Start reading char-server 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;
- if(strcmpi(w1,"char_txt")==0){
- printf ("set char_txt : %s\n",w2);
- strcpy(char_txt, w2);
- }
- }
- fclose(fp);
- printf("Reading configuration: Done\n");
-
- return 0;
-}
-
-int do_init(int argc, char **argv){
-
- char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME);
- inter_config_read((argc>2)?argv[2]:INTER_CONF_NAME);
-
- mmo_char_init();
- printf ("Everything's been converted!\n");
- exit (0);
-}
-
-
+// $Id: char-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
+// original : char2.c 2003/03/14 11:58:35 Rev.1.5
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+
+
+#define STORAGE_MEMINC 16
+
+#include "char.h"
+#include "strlib.h"
+
+#ifdef MEMWATCH
+#include "memwatch.h"
+#endif
+
+char pet_txt[256]="save/pet.txt";
+char storage_txt[256]="save/storage.txt";
+
+MYSQL mysql_handle;
+MYSQL_RES* sql_res ;
+MYSQL_ROW sql_row ;
+int sql_fields, sql_cnt;
+char tmp_sql[65535];
+
+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";
+
+struct storage *storage=NULL;
+
+struct mmo_map_server server[MAX_MAP_SERVERS];
+int server_fd[MAX_MAP_SERVERS];
+
+int login_fd;
+char userid[24];
+char passwd[24];
+char server_name[20];
+char login_ip_str[16];
+int login_port = 6900;
+char char_ip_str[16];
+int char_ip;
+int char_port = 6121;
+int char_maintenance;
+int char_new;
+char char_txt[256];
+
+char t_name[256];
+
+#define CHAR_STATE_WAITAUTH 0
+#define CHAR_STATE_AUTHOK 1
+struct char_session_data{
+ int state;
+ int account_id, login_id1, login_id2, sex;
+ int found_char[9];
+};
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id, char_id, login_id1, char_pos, delflag, sex;
+} auth_fifo[AUTH_FIFO_SIZE];
+int auth_fifo_pos=0;
+
+int char_id_count=100000;
+struct mmo_charstatus *char_dat;
+int char_num, char_max;
+int max_connect_user=0;
+int autosave_interval=DEFAULT_AUTOSAVE_INTERVAL;
+
+// Ãʱâ À§Ä¡(conf ÆÄÀϷκÎÅÍ Àç¼³Á¤ °¡´É)
+struct point start_point={"new_1-1.gat", 53,111};
+
+
+
+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, 24);
+ 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;
+}
+//---------------------------------------------------------
+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 tmp_sql[65535];
+ MYSQL_RES* sql_res ;
+ MYSQL_ROW sql_row ;
+
+ 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;
+ sprintf(tmp_sql,"SELECT * FROM `pet` WHERE `pet_id`='%d'",pet_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ sql_res = mysql_store_result(&mysql_handle) ;
+ sql_row = mysql_fetch_row(sql_res); //row fetching
+ if (!sql_row) //no row -> insert
+ sprintf(tmp_sql,"INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ p->pet_id, 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 //row reside -> updating
+ sprintf(tmp_sql, "UPDATE `pet` 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'",
+ 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);
+ mysql_free_result(sql_res) ; //resource free
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+
+ printf ("pet dump success! - %d:%s\n", pet_id, p->name);
+
+ return 0;
+}
+
+int storage_tosql(int account_id,struct storage *p){
+ // id -> DB dump
+ // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
+ int i,j;
+
+ j=0;
+
+ //printf ("starting storage dump to DB - id: %d\n", account_id);
+
+ //delete old data.
+ sprintf(tmp_sql,"DELETE FROM `storage` WHERE `account_id`='%d'",account_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //printf ("all storage item was deleted ok\n");
+
+ for(i=0;i<MAX_STORAGE;i++) {
+ //printf ("save storage num: %d (%d:%d)\n",i, p->storage[i].nameid , p->storage[i].amount);
+
+ if( (p->storage[i].nameid) && (p->storage[i].amount) ){
+ sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ p->account_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,
+ p->storage[i].card[0], p->storage[i].card[1], p->storage[i].card[2], p->storage[i].card[3], p->storage[i].broken );
+ //printf ("%s\n",tmp_sql);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
+ }
+ j++;
+ }
+ }
+
+ printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
+ return 0;
+}
+// char to storage
+int storage_fromstr(char *str, struct storage *p)
+{
+ int tmp_int[256];
+ int set, next, len, i;
+
+ set=sscanf(str,"%d, %d%n", &tmp_int[0], &tmp_int[1], &next);
+ p->storage_amount=tmp_int[1];
+
+ if(set!=2)
+ return 0;
+ if(str[next]=='\n' || str[next]=='\r')
+ return 1;
+ next++;
+ for(i=0;str[next] && str[next]!='\t';i++){
+ if(sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ p->storage[i].broken = tmp_int[11];
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else if(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) == 11) {
+ 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];
+ p->storage[i].card[0] = tmp_int[7];
+ p->storage[i].card[1] = tmp_int[8];
+ p->storage[i].card[2] = tmp_int[9];
+ p->storage[i].card[3] = tmp_int[10];
+ p->storage[i].broken = 0;
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+
+ else return 0;
+ }
+ return 1;
+}
+
+/////////////////////////////////
+int mmo_char_fromstr(char *str, struct mmo_charstatus *p) {
+ int tmp_int[256];
+ int set, next, len, i;
+
+ // initilialise character
+ memset(p, '\0', sizeof(struct mmo_charstatus));
+
+ // If it's not char structure of version 1008 and after
+ if ((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,%d\t%d,%d,%d\t%d,%d,%d,%d,%d"
+ "\t%[^,],%d,%d\t%[^,],%d,%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], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) {
+ tmp_int[39] = 0; // partner id
+ // If not char structure from version 384 to 1007
+ if ((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,%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], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) {
+ // It's char structure of a version before 384
+ tmp_int[26] = 0; // pet id
+ 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[27], &tmp_int[28], &tmp_int[29],
+ &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34],
+ p->last_point.map, &tmp_int[35], &tmp_int[36], //
+ p->save_point.map, &tmp_int[37], &tmp_int[38], &next);
+ set += 2;
+ //printf("char: old char data ver.1\n");
+ // Char structure of version 1007 or older
+ } else {
+ set++;
+ //printf("char: old char data ver.2\n");
+ }
+ // Char structure of version 1008+
+ } else {
+ //printf("char: new char data ver.3\n");
+ }
+ if (set != 43)
+ return 0;
+
+ 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 = 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];
+
+ // Some checks
+ for(i = 0; i < char_num; i++) {
+ if (char_dat[i].char_id == p->char_id) {
+ printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n");
+ printf(" character id #%d -> new character not readed.\n", p->char_id);
+ printf(" Character saved in log file.\033[0m\n");
+ return -1;
+ } else if (strcmp(char_dat[i].name, p->name) == 0) {
+ printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n");
+ printf(" character name '%s' -> new character not readed.\n", p->name);
+ printf(" Character saved in log file.\033[0m\n");
+ return -2;
+ }
+ }
+
+ 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 -3;
+ 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++) {
+ if (sscanf(str + next, "%d,%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], &tmp_int[11], &len) == 12) {
+ // do nothing, it's ok
+ } else if(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) == 11) {
+ tmp_int[11] = 0; // broken doesn't exist in this version -> 0
+ } else // invalid structure
+ return -4;
+ 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];
+ p->inventory[i].broken = tmp_int[11];
+ 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,%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], &tmp_int[11], &len) == 12) {
+ // do nothing, it's ok
+ } else if (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) == 11) {
+ tmp_int[11] = 0; // broken doesn't exist in this version -> 0
+ } else // invalid structure
+ return -5;
+ 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];
+ p->cart[i].broken = tmp_int[11];
+ 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 -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
+ set = sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len);
+ if (set != 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, ",%d%n", &p->global_reg[i].value, &len) == 1)
+ i--;
+ else
+ return -7;
+ }
+ next += len;
+ if (str[next] == ' ')
+ next++;
+ }
+ p->global_reg_num = i;
+
+ return 1;
+}
+
+//==========================================================================================================
+int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
+ int i,save_flag;
+
+ save_flag = char_id;
+ printf("request save char data... (%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`)
+ sprintf(tmp_sql ,"INSERT INTO `char` SET `char_id`='%d', `account_id`='%d', `char_num`='%d', `name`='%s', `class`='%d', `base_level`='%d', `job_level`='%d',"
+ "`base_exp`='%d', `job_exp`='%d', `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'",
+ 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->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->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, p->partner_id
+ );
+
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
+ sprintf(tmp_sql,"DELETE FROM `memo` WHERE `char_id`='%d'",char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //insert here.
+ for(i=0;i<10;i++){
+ if(p->memo_point[i].map[0]){
+ sprintf(tmp_sql,"INSERT INTO `memo`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')",
+ char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
+ sprintf(tmp_sql,"DELETE FROM `inventory` WHERE `char_id`='%d'",char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `inventory`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //insert here.
+ for(i=0;i<MAX_INVENTORY;i++){
+ if(p->inventory[i].nameid){
+ sprintf(tmp_sql,"INSERT INTO `inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
+ " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ p->inventory[i].id, char_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], p->inventory[i].broken);
+ if(mysql_query(&mysql_handle, tmp_sql) )
+ printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+
+ //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)
+ sprintf (tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id`='%d'", char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //insert here.
+ for(i=0;i<MAX_CART;i++){
+ if(p->cart[i].nameid){
+ sprintf(tmp_sql,"INSERT INTO `cart_inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)"
+ " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )",
+ p->cart[i].id, char_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], p->cart[i].broken );
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `cart_inventory`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+
+
+ //`skill` (`char_id`, `id`, `lv`)
+ sprintf(tmp_sql,"DELETE FROM `skill` WHERE `char_id`='%d'",char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //insert here.
+ for(i=0;i<MAX_SKILL;i++){
+ if(p->skill[i].id){
+ if (p->skill[i].id && p->skill[i].flag!=1) {
+ sprintf(tmp_sql,"INSERT INTO `skill`(`char_id`,`id`, `lv`) VALUES ('%d', '%d', '%d')",
+ char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+ }
+ //`global_reg_value` (`char_id`, `str`, `value`)
+ sprintf(tmp_sql,"DELETE FROM `global_reg_value` WHERE `char_id`='%d'",char_id);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
+ }
+
+ //insert here.
+ for(i=0;i<p->global_reg_num;i++){
+ if(p->global_reg[i].value !=0){
+ sprintf(tmp_sql,"INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')",
+ char_id, p->global_reg[i].str, p->global_reg[i].value);
+ if(mysql_query(&mysql_handle, tmp_sql) ) {
+ printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) );
+ }
+ }
+ }
+
+ printf("saving char is done... (%d)\n",char_id);
+ save_flag = 0;
+
+ return 0;
+}
+//==========================================================================================================
+
+int mmo_char_init(void){
+ char line[65536];
+ struct s_pet *p;
+ int ret;
+ int i=0,set,tmp_int[2], c= 0;
+ char input;
+ FILE *fp;
+
+
+ //DB connection initialized
+ mysql_init(&mysql_handle);
+ printf("Connect DB server.... (inter server)\n");
+ 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! (inter server)\n");
+ }
+
+
+
+ printf("Warning : Make sure you backup your databases before continuing!\n");
+ printf("\nDo you wish to convert your Character Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y'){
+ printf("\nConverting Character Database...\n");
+ fp=fopen("save/athena.txt","r");
+ char_dat=malloc(sizeof(char_dat[0])*256);
+ char_max=256;
+ if(fp==NULL)
+ return 0;
+ while(fgets(line, 65535, fp)){
+ if(char_num>=char_max){
+ char_max+=256;
+ char_dat=realloc(char_dat, sizeof(char_dat[0]) *char_max);
+ }
+ memset(&char_dat[char_num], 0, sizeof(char_dat[0]));
+ ret=mmo_char_fromstr(line, &char_dat[char_num]);
+ if(ret){
+ mmo_char_tosql(char_dat[char_num].char_id , &char_dat[char_num]);
+ printf ("convert %d -> DB\n",char_dat[char_num].char_id);
+ if(char_dat[char_num].char_id>=char_id_count)
+ char_id_count=char_dat[char_num].char_id+1;
+ char_num++;
+ }
+ }
+ printf("char data convert end\n");
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\nDo you wish to convert your Storage Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ printf("\nConverting Storage Database...\n");
+ fp=fopen(storage_txt,"r");
+ if(fp==NULL){
+ printf("cant't read : %s\n",storage_txt);
+ return 0;
+ }
+
+ while(fgets(line,65535,fp)){
+ set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]);
+ if(set==2) {
+ if(i==0){
+ storage=malloc(sizeof(struct storage));
+ }else{
+ storage=realloc(storage,sizeof(struct storage)*(i+1));
+ }
+ memset(&storage[i],0,sizeof(struct storage));
+ storage[i].account_id=tmp_int[0];
+ storage_fromstr(line,&storage[i]);
+ storage_tosql(tmp_int[0],&storage[i]); //to sql. (dump)
+ i++;
+ }
+ }
+ fclose(fp);
+ }
+
+ while(getchar() != '\n');
+ printf("\nDo you wish to convert your Pet Database to SQL? (y/n) : ");
+ input=getchar();
+ if(input == 'y' || input == 'Y') {
+ printf("\nConverting Pet Database...\n");
+ if( (fp=fopen(pet_txt,"r")) ==NULL )
+ return 1;
+
+ p=malloc(sizeof(struct s_pet));
+ while(fgets(line, sizeof(line), fp)){
+ if(p==NULL){
+ printf("int_pet: out of memory!\n");
+ exit(0);
+ }
+ if(inter_pet_fromstr(line, p)==0 && p->pet_id>0){
+ //pet dump
+ inter_pet_tosql(p->pet_id,p);
+ }else{
+ printf("int_pet: broken data [%s] line %d\n", pet_txt, c);
+ }
+ c++;
+ }
+ fclose(fp);
+ }
+
+ return 0;
+}
+int inter_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)){
+ i=sscanf(line,"%[^:]:%s", w1, w2);
+ if(i!=2)
+ continue;
+ if(strcmpi(w1,"storage_txt")==0){
+ printf ("set storage_txt : %s\n",w2);
+ strncpy(storage_txt, w2, sizeof(storage_txt));
+ } else if(strcmpi(w1,"pet_txt")==0){
+ printf ("set pet_txt : %s\n",w2);
+ strncpy(pet_txt, w2, sizeof(pet_txt));
+ }
+ //add for DB connection
+ else 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);
+ }
+ }
+ fclose(fp);
+
+ printf("Reading interserver configuration: Done\n");
+
+ return 0;
+}
+
+int char_config_read(const char *cfgName) {
+ int i;
+ char line[1024], w1[1024], w2[1024];
+ FILE *fp;
+
+ printf ("Start reading char-server 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;
+ if(strcmpi(w1,"char_txt")==0){
+ printf ("set char_txt : %s\n",w2);
+ strcpy(char_txt, w2);
+ }
+ }
+ fclose(fp);
+ printf("Reading configuration: Done\n");
+
+ return 0;
+}
+
+int do_init(int argc, char **argv){
+
+ char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME);
+ inter_config_read((argc>2)?argv[2]:INTER_CONF_NAME);
+
+ mmo_char_init();
+ printf ("Everything's been converted!\n");
+ exit (0);
+}
+
+
diff --git a/src/txt-converter/char/char.h b/src/txt-converter/char/char.h
index bfbe6d75c..b5864b31c 100644
--- a/src/txt-converter/char/char.h
+++ b/src/txt-converter/char/char.h
@@ -1,39 +1,39 @@
-#include "../../common/core.h"
-#include "../../common/socket.h"
-#include "../../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/inter.h"
-#include "../../common/version.h"
-#include "../../common/db.h"
-
-#ifndef _CHAR_H_
-#define _CHAR_H_
-
-#define MAX_MAP_SERVERS 30
-
-//#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-#define UNKNOWN_CHAR_NAME "Unknown"
-
-#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-
-struct mmo_map_server{
- long ip;
- short port;
- int users;
- char map[MAX_MAP_PER_SERVER][16];
-};
-
-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);
-
-extern int autosave_interval;
-
-#endif
-
-//#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
+#include "../../common/core.h"
+#include "../../common/socket.h"
+#include "../../common/timer.h"
+#include "../common/mmo.h"
+#include "../common/inter.h"
+#include "../../common/version.h"
+#include "../../common/db.h"
+
+#ifndef _CHAR_H_
+#define _CHAR_H_
+
+#define MAX_MAP_SERVERS 30
+
+//#define CHAR_CONF_NAME "conf/char_athena.conf"
+
+#define UNKNOWN_CHAR_NAME "Unknown"
+
+#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
+
+struct mmo_map_server{
+ long ip;
+ short port;
+ int users;
+ char map[MAX_MAP_PER_SERVER][16];
+};
+
+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);
+
+extern int autosave_interval;
+
+#endif
+
+//#include "inter.h"
+#include "int_pet.h"
+#include "int_guild.h"
+#include "int_party.h"
+#include "int_storage.h"
diff --git a/src/txt-converter/char/int_guild.h b/src/txt-converter/char/int_guild.h
index 7cc8cc60e..2ea85949a 100644
--- a/src/txt-converter/char/int_guild.h
+++ b/src/txt-converter/char/int_guild.h
@@ -1,10 +1,10 @@
-#ifndef _INT_GUILD_H_
-#define _INT_GUILD_H_
-
-int inter_guild_init();
-int inter_guild_save();
-int inter_guild_parse_frommap(int fd);
-
-extern char guild_txt[256];
-
-#endif
+#ifndef _INT_GUILD_H_
+#define _INT_GUILD_H_
+
+int inter_guild_init();
+int inter_guild_save();
+int inter_guild_parse_frommap(int fd);
+
+extern char guild_txt[256];
+
+#endif
diff --git a/src/txt-converter/char/int_party.h b/src/txt-converter/char/int_party.h
index 6f55871eb..036db1af9 100644
--- a/src/txt-converter/char/int_party.h
+++ b/src/txt-converter/char/int_party.h
@@ -1,11 +1,11 @@
-#ifndef _INT_PARTY_H_
-#define _INT_PARTY_H_
-
-int inter_party_init();
-int inter_party_save();
-
-int inter_party_parse_frommap(int fd);
-
-extern char party_txt[256];
-
-#endif
+#ifndef _INT_PARTY_H_
+#define _INT_PARTY_H_
+
+int inter_party_init();
+int inter_party_save();
+
+int inter_party_parse_frommap(int fd);
+
+extern char party_txt[256];
+
+#endif
diff --git a/src/txt-converter/char/int_pet.h b/src/txt-converter/char/int_pet.h
index 9bfe3b41c..27ba4fc9d 100644
--- a/src/txt-converter/char/int_pet.h
+++ b/src/txt-converter/char/int_pet.h
@@ -1,12 +1,12 @@
-#ifndef _INT_PET_H_
-#define _INT_PET_H_
-
-int inter_pet_init();
-int inter_pet_save();
-int inter_pet_delete(int pet_id);
-
-int inter_pet_parse_frommap(int fd);
-
-//extern char pet_txt[256];
-
-#endif
+#ifndef _INT_PET_H_
+#define _INT_PET_H_
+
+int inter_pet_init();
+int inter_pet_save();
+int inter_pet_delete(int pet_id);
+
+int inter_pet_parse_frommap(int fd);
+
+//extern char pet_txt[256];
+
+#endif
diff --git a/src/txt-converter/char/int_storage.h b/src/txt-converter/char/int_storage.h
index dece251fd..3572ae5de 100644
--- a/src/txt-converter/char/int_storage.h
+++ b/src/txt-converter/char/int_storage.h
@@ -1,11 +1,11 @@
-#ifndef _INT_STORAGE_H_
-#define _INT_STORAGE_H_
-
-int inter_storage_init();
-int inter_storage_save();
-
-int inter_storage_parse_frommap(int fd);
-
-//extern char storage_txt[256];
-
-#endif
+#ifndef _INT_STORAGE_H_
+#define _INT_STORAGE_H_
+
+int inter_storage_init();
+int inter_storage_save();
+
+int inter_storage_parse_frommap(int fd);
+
+//extern char storage_txt[256];
+
+#endif
diff --git a/src/txt-converter/char/strlib.c b/src/txt-converter/char/strlib.c
index 114983d2e..60803c1d1 100644
--- a/src/txt-converter/char/strlib.c
+++ b/src/txt-converter/char/strlib.c
@@ -1,66 +1,66 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "strlib.h"
-
-//-----------------------------------------------
-// string lib.
-unsigned char* jstrescape (unsigned char* pt) {
- //copy from here
- unsigned char * ptr;
- int i =0, j=0;
-
- //copy string to temporary
- ptr = malloc(J_MAX_MALLOC_SIZE);
- strcpy (ptr,pt);
-
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- free (ptr);
- return (unsigned char*) &pt[0];
-}
-
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
- //copy from here
- int i =0, j=0;
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return (unsigned char*) &pt[0];
-}
-int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) {
- //copy from here
- int i =0, j=0;
-
- while (i < size) {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- // copy size is 0 ~ (j-1)
- return j;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "strlib.h"
+
+//-----------------------------------------------
+// string lib.
+unsigned char* jstrescape (unsigned char* pt) {
+ //copy from here
+ unsigned char * ptr;
+ int i =0, j=0;
+
+ //copy string to temporary
+ ptr = malloc(J_MAX_MALLOC_SIZE);
+ strcpy (ptr,pt);
+
+ while (ptr[i] != '\0') {
+ switch (ptr[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ default:
+ pt[j++] = ptr[i++];
+ }
+ }
+ pt[j++] = '\0';
+ free (ptr);
+ return (unsigned char*) &pt[0];
+}
+
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) {
+ //copy from here
+ int i =0, j=0;
+
+ while (spt[i] != '\0') {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ pt[j++] = '\0';
+ return (unsigned char*) &pt[0];
+}
+int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) {
+ //copy from here
+ int i =0, j=0;
+
+ while (i < size) {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ // copy size is 0 ~ (j-1)
+ return j;
+}
diff --git a/src/txt-converter/char/strlib.h b/src/txt-converter/char/strlib.h
index 3ab10c41e..442cfac29 100644
--- a/src/txt-converter/char/strlib.h
+++ b/src/txt-converter/char/strlib.h
@@ -1,9 +1,9 @@
-#ifndef _J_STR_H_
-#define _J_STR_H_
-#define J_MAX_MALLOC_SIZE 65535
-//string functions.
-//code by Jioh L. Jung
-unsigned char* jstrescape (unsigned char* pt);
-unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
-int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size);
-#endif
+#ifndef _J_STR_H_
+#define _J_STR_H_
+#define J_MAX_MALLOC_SIZE 65535
+//string functions.
+//code by Jioh L. Jung
+unsigned char* jstrescape (unsigned char* pt);
+unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt);
+int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size);
+#endif
diff --git a/src/txt-converter/common/inter.h b/src/txt-converter/common/inter.h
index 1bb295c34..21c921d4a 100644
--- a/src/txt-converter/common/inter.h
+++ b/src/txt-converter/common/inter.h
@@ -1,28 +1,28 @@
-#ifndef _INTER_H_
-#define _INTER_H_
-
-int inter_init(const char *file);
-int inter_save();
-int inter_parse_frommap(int fd);
-
-int inter_check_length(int fd,int length);
-
-#define INTER_CONF_NAME "conf/inter_athena.conf"
-
-
-//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 int db_server_port;
-extern char db_server_ip[16];
-extern char db_server_id[32];
-extern char db_server_pw[32];
-extern char db_server_logindb[32];
-
-#endif
+#ifndef _INTER_H_
+#define _INTER_H_
+
+int inter_init(const char *file);
+int inter_save();
+int inter_parse_frommap(int fd);
+
+int inter_check_length(int fd,int length);
+
+#define INTER_CONF_NAME "conf/inter_athena.conf"
+
+
+//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 int db_server_port;
+extern char db_server_ip[16];
+extern char db_server_id[32];
+extern char db_server_pw[32];
+extern char db_server_logindb[32];
+
+#endif
diff --git a/src/txt-converter/common/mmo.h b/src/txt-converter/common/mmo.h
index 733874572..178046a17 100644
--- a/src/txt-converter/common/mmo.h
+++ b/src/txt-converter/common/mmo.h
@@ -1,280 +1,280 @@
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
-
-#ifndef _MMO_H_
-#define _MMO_H_
-
-#include <time.h>
-
-#ifdef CYGWIN
-// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
-#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
-#else
-#define RETCODE "\n" // (LFFUnixŒnj
-#endif
-
-#define FIFOSIZE_SERVERLINK 128*1024
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000 // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 450
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 56 // increased max guild members to accomodate for +2 increase for extension levels [Valaris]
-#define MAX_GUILDPOSITION 56 // increased max guild positions to accomodate for all members [Valaris]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 8
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE 0
-#define MAX_HAIR_STYLE 20
-#define MIN_HAIR_COLOR 0
-#define MAX_HAIR_COLOR 9
-#define MIN_CLOTH_COLOR 0
-#define MAX_CLOTH_COLOR 4
-
-// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
-
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
-
-#define MAX_STATUS_TYPE 5
-
-#define WEDDING_RING_M 2634
-#define WEDDING_RING_F 2635
-
-#define CHAR_CONF_NAME "conf/char_athena.conf"
-
-struct item {
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
- short broken;
-};
-struct point{
- char map[24];
- short x,y;
-};
-struct skill {
- unsigned short id,lv,flag;
-};
-struct global_reg {
- char str[32];
- int value;
-};
-struct s_pet {
- int account_id;
- int char_id;
- int pet_id;
- short class;
- short level;
- short egg_id;//pet egg id
- short equip;//pet equip name_id
- short intimate;//pet friendly
- short hungry;//pet hungry
- char name[24];
- char rename_flag;
- char incuvate;
-};
-
-struct mmo_charstatus {
- int char_id;
- int account_id;
- int partner_id;
-
- int base_exp,job_exp,zeny;
-
- short class;
- short status_point,skill_point;
- int 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;
- short str,agi,vit,int_,dex,luk;
- unsigned char char_num,sex;
-
- struct point last_point,save_point,memo_point[10];
- 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 account_reg_num;
- struct global_reg account_reg[ACCOUNT_REG_NUM];
- int account_reg2_num;
- struct global_reg account_reg2[ACCOUNT_REG2_NUM];
-};
-
-struct storage {
- int account_id;
- short storage_status;
- short storage_amount;
- struct item storage[MAX_STORAGE];
-};
-
-struct guild_storage {
- int guild_id;
- short storage_status;
- short storage_amount;
- struct item storage[MAX_GUILD_STORAGE];
-};
-
-struct map_session_data;
-
-struct gm_account {
- int account_id;
- int level;
-};
-
-struct party_member {
- int account_id;
- char name[24],map[24];
- int leader,online,lv;
- struct map_session_data *sd;
-};
-struct party {
- int party_id;
- char name[24];
- int exp;
- int item;
- struct party_member member[MAX_PARTY];
-};
-
-struct guild_member {
- int account_id, char_id;
- short hair,hair_color,gender,class,lv;
- int exp,exp_payper;
- short online,position;
- int rsv1,rsv2;
- char name[24];
- struct map_session_data *sd;
-};
-struct guild_position {
- char name[24];
- int mode;
- int exp_mode;
-};
-struct guild_alliance {
- int opposition;
- int guild_id;
- char name[24];
-};
-struct guild_explusion {
- char name[24];
- char mes[40];
- char acc[40];
- int account_id;
- int rsv1,rsv2,rsv3;
-};
-struct guild_skill {
- int id,lv;
-};
-struct guild {
- int guild_id;
- short guild_lv, connect_member, max_member, average_lv;
- int exp,next_exp,skill_point,castle_id;
- char name[24],master[24];
- struct guild_member member[MAX_GUILD];
- struct guild_position position[MAX_GUILDPOSITION];
- char mes1[60],mes2[120];
- int emblem_len,emblem_id;
- char emblem_data[2048];
- struct guild_alliance alliance[MAX_GUILDALLIANCE];
- struct guild_explusion explusion[MAX_GUILDEXPLUSION];
- struct guild_skill skill[MAX_GUILDSKILL];
-};
-struct guild_castle {
- int castle_id;
- char map_name[24];
- char castle_name[24];
- int guild_id;
- int economy;
- int defense;
- int triggerE;
- int triggerD;
- int nextTime;
- int payTime;
- int createTime;
- int visibleC;
- int visibleG0;
- int visibleG1;
- int visibleG2;
- int visibleG3;
- int visibleG4;
- int visibleG5;
- int visibleG6;
- int visibleG7;
- int Ghp0; // added Guardian HP [Valaris]
- int Ghp1;
- int Ghp2;
- int Ghp3;
- int Ghp4;
- int Ghp5;
- int Ghp6;
- int Ghp7;
- int GID0;
- int GID1;
- int GID2;
- int GID3;
- int GID4;
- int GID5;
- int GID6;
- int GID7; // end addition [Valaris]
-
-};
-struct square {
- int val1[5];
- int val2[5];
-};
-
-enum {
- GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
- GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
- GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
- GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
-
- GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
- GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
-
-};
-
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-
-#endif // _MMO_H_
+// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
+
+#ifndef _MMO_H_
+#define _MMO_H_
+
+#include <time.h>
+
+#ifdef CYGWIN
+// txt‚âlog‚È‚Ç‚Ì‘‚«o‚·ƒtƒ@ƒCƒ‹‚̉üsƒR[ƒh
+#define RETCODE "\r\n" // (CR/LFFWindowsŒn)
+#else
+#define RETCODE "\n" // (LFFUnixŒnj
+#endif
+
+#define FIFOSIZE_SERVERLINK 128*1024
+
+#define MAX_MAP_PER_SERVER 512
+#define MAX_INVENTORY 100
+#define MAX_AMOUNT 30000
+#define MAX_ZENY 1000000000 // 1G zeny
+#define MAX_CART 100
+#define MAX_SKILL 450
+#define GLOBAL_REG_NUM 96
+#define ACCOUNT_REG_NUM 16
+#define ACCOUNT_REG2_NUM 16
+#define DEFAULT_WALK_SPEED 150
+#define MIN_WALK_SPEED 0
+#define MAX_WALK_SPEED 1000
+#define MAX_STORAGE 300
+#define MAX_GUILD_STORAGE 1000
+#define MAX_PARTY 12
+#define MAX_GUILD 56 // increased max guild members to accomodate for +2 increase for extension levels [Valaris]
+#define MAX_GUILDPOSITION 56 // increased max guild positions to accomodate for all members [Valaris]
+#define MAX_GUILDEXPLUSION 32
+#define MAX_GUILDALLIANCE 16
+#define MAX_GUILDSKILL 8
+#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
+#define MAX_GUILDLEVEL 50
+
+#define MIN_HAIR_STYLE 0
+#define MAX_HAIR_STYLE 20
+#define MIN_HAIR_COLOR 0
+#define MAX_HAIR_COLOR 9
+#define MIN_CLOTH_COLOR 0
+#define MAX_CLOTH_COLOR 4
+
+// for produce
+#define MIN_ATTRIBUTE 0
+#define MAX_ATTRIBUTE 4
+#define ATTRIBUTE_NORMAL 0
+#define MIN_STAR 0
+#define MAX_STAR 3
+
+#define MIN_PORTAL_MEMO 0
+#define MAX_PORTAL_MEMO 2
+
+#define MAX_STATUS_TYPE 5
+
+#define WEDDING_RING_M 2634
+#define WEDDING_RING_F 2635
+
+#define CHAR_CONF_NAME "conf/char_athena.conf"
+
+struct item {
+ int id;
+ short nameid;
+ short amount;
+ unsigned short equip;
+ char identify;
+ char refine;
+ char attribute;
+ short card[4];
+ short broken;
+};
+struct point{
+ char map[24];
+ short x,y;
+};
+struct skill {
+ unsigned short id,lv,flag;
+};
+struct global_reg {
+ char str[32];
+ int value;
+};
+struct s_pet {
+ int account_id;
+ int char_id;
+ int pet_id;
+ short class;
+ short level;
+ short egg_id;//pet egg id
+ short equip;//pet equip name_id
+ short intimate;//pet friendly
+ short hungry;//pet hungry
+ char name[24];
+ char rename_flag;
+ char incuvate;
+};
+
+struct mmo_charstatus {
+ int char_id;
+ int account_id;
+ int partner_id;
+
+ int base_exp,job_exp,zeny;
+
+ short class;
+ short status_point,skill_point;
+ int 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;
+ short str,agi,vit,int_,dex,luk;
+ unsigned char char_num,sex;
+
+ struct point last_point,save_point,memo_point[10];
+ 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 account_reg_num;
+ struct global_reg account_reg[ACCOUNT_REG_NUM];
+ int account_reg2_num;
+ struct global_reg account_reg2[ACCOUNT_REG2_NUM];
+};
+
+struct storage {
+ int account_id;
+ short storage_status;
+ short storage_amount;
+ struct item storage[MAX_STORAGE];
+};
+
+struct guild_storage {
+ int guild_id;
+ short storage_status;
+ short storage_amount;
+ struct item storage[MAX_GUILD_STORAGE];
+};
+
+struct map_session_data;
+
+struct gm_account {
+ int account_id;
+ int level;
+};
+
+struct party_member {
+ int account_id;
+ char name[24],map[24];
+ int leader,online,lv;
+ struct map_session_data *sd;
+};
+struct party {
+ int party_id;
+ char name[24];
+ int exp;
+ int item;
+ struct party_member member[MAX_PARTY];
+};
+
+struct guild_member {
+ int account_id, char_id;
+ short hair,hair_color,gender,class,lv;
+ int exp,exp_payper;
+ short online,position;
+ int rsv1,rsv2;
+ char name[24];
+ struct map_session_data *sd;
+};
+struct guild_position {
+ char name[24];
+ int mode;
+ int exp_mode;
+};
+struct guild_alliance {
+ int opposition;
+ int guild_id;
+ char name[24];
+};
+struct guild_explusion {
+ char name[24];
+ char mes[40];
+ char acc[40];
+ int account_id;
+ int rsv1,rsv2,rsv3;
+};
+struct guild_skill {
+ int id,lv;
+};
+struct guild {
+ int guild_id;
+ short guild_lv, connect_member, max_member, average_lv;
+ int exp,next_exp,skill_point,castle_id;
+ char name[24],master[24];
+ struct guild_member member[MAX_GUILD];
+ struct guild_position position[MAX_GUILDPOSITION];
+ char mes1[60],mes2[120];
+ int emblem_len,emblem_id;
+ char emblem_data[2048];
+ struct guild_alliance alliance[MAX_GUILDALLIANCE];
+ struct guild_explusion explusion[MAX_GUILDEXPLUSION];
+ struct guild_skill skill[MAX_GUILDSKILL];
+};
+struct guild_castle {
+ int castle_id;
+ char map_name[24];
+ char castle_name[24];
+ int guild_id;
+ int economy;
+ int defense;
+ int triggerE;
+ int triggerD;
+ int nextTime;
+ int payTime;
+ int createTime;
+ int visibleC;
+ int visibleG0;
+ int visibleG1;
+ int visibleG2;
+ int visibleG3;
+ int visibleG4;
+ int visibleG5;
+ int visibleG6;
+ int visibleG7;
+ int Ghp0; // added Guardian HP [Valaris]
+ int Ghp1;
+ int Ghp2;
+ int Ghp3;
+ int Ghp4;
+ int Ghp5;
+ int Ghp6;
+ int Ghp7;
+ int GID0;
+ int GID1;
+ int GID2;
+ int GID3;
+ int GID4;
+ int GID5;
+ int GID6;
+ int GID7; // end addition [Valaris]
+
+};
+struct square {
+ int val1[5];
+ int val2[5];
+};
+
+enum {
+ GBI_EXP =1, // ƒMƒ‹ƒh‚ÌEXP
+ GBI_GUILDLV =2, // ƒMƒ‹ƒh‚ÌLv
+ GBI_SKILLPOINT =3, // ƒMƒ‹ƒh‚̃XƒLƒ‹ƒ|ƒCƒ“ƒg
+ GBI_SKILLLV =4, // ƒMƒ‹ƒhƒXƒLƒ‹Lv
+
+ GMI_POSITION =0, // ƒƒ“ƒo[‚Ì–ðE•ÏX
+ GMI_EXP =1, // ƒƒ“ƒo[‚ÌEXP
+
+};
+
+#ifndef strcmpi
+#define strcmpi strcasecmp
+#endif
+#ifndef stricmp
+#define stricmp strcasecmp
+#endif
+#ifndef strncmpi
+#define strncmpi strncasecmp
+#endif
+#ifndef strnicmp
+#define strnicmp strncasecmp
+#endif
+
+#endif // _MMO_H_
diff --git a/src/txt-converter/login/Makefile b/src/txt-converter/login/Makefile
index 965a0e07d..9f34e143a 100644
--- a/src/txt-converter/login/Makefile
+++ b/src/txt-converter/login/Makefile
@@ -1,11 +1,11 @@
-all: login-converter
-sql: login-converter
-
-COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/db.o ../../common/malloc.o
-COMMON_H = ../../common/core.h ../../common/socket.h ../../common/timer.h ../../common/mmo.h ../../common/version.h ../../common/db.h ../../common/malloc.h
-
-login-converter: login-converter.o ../../login_sql/md5calc.o ../../login_sql/strlib.o $(COMMON_OBJ)
- $(CC) -o ../../../$@ $^ $(LIB_S)
-login-converter.o: login-converter.c ../../login_sql/login.h ../../login_sql/md5calc.h ../../login_sql/strlib.h $(COMMON_H)
-clean:
- rm -f *.o ../../../login-converter
+all: login-converter
+sql: login-converter
+
+COMMON_OBJ = ../../common/core.o ../../common/socket.o ../../common/timer.o ../../common/db.o ../../common/malloc.o
+COMMON_H = ../../common/core.h ../../common/socket.h ../../common/timer.h ../../common/mmo.h ../../common/version.h ../../common/db.h ../../common/malloc.h
+
+login-converter: login-converter.o ../../login_sql/md5calc.o ../../login_sql/strlib.o $(COMMON_OBJ)
+ $(CC) -o ../../../$@ $^ $(LIB_S)
+login-converter.o: login-converter.c ../../login_sql/login.h ../../login_sql/md5calc.h ../../login_sql/strlib.h $(COMMON_H)
+clean:
+ rm -f *.o ../../../login-converter
diff --git a/src/txt-converter/login/login-converter.c b/src/txt-converter/login/login-converter.c
index 9dfdfa170..a277ca949 100644
--- a/src/txt-converter/login/login-converter.c
+++ b/src/txt-converter/login/login-converter.c
@@ -1,258 +1,258 @@
-// $Id: login-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
-// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
-// login data file to mysql conversion utility.
-//
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include <arpa/inet.h>
-
-#include <mysql.h>
-
-#include "../../common/core.h"
-#include "../../common/socket.h"
-#include "../../login/login.h"
-#include "../../common/mmo.h"
-#include "../../common/version.h"
-#include "../../common/db.h"
-#include "../common/inter.h"
-
-int account_id_count = START_ACCOUNT_NUM;
-int server_num;
-int new_account_flag = 0;
-int login_port = 6900;
-
-struct mmo_char_server server[MAX_SERVERS];
-int server_fd[MAX_SERVERS];
-
-#define AUTH_FIFO_SIZE 256
-struct {
- int account_id,login_id1,login_id2;
- int sex,delflag;
-} auth_fifo[AUTH_FIFO_SIZE];
-int auth_fifo_pos=0;
-struct {
- 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;
-int auth_num=0,auth_max=0;
-
-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";
-
-int isGM(int account_id)
-{
- struct gm_account *p;
- p = numdb_search(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 = numdb_init();
-
- 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=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;
- numdb_insert(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=malloc(sizeof(auth_dat[0])*256);
- auth_max=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 ("Ñonvert end...\n");
-
- return 0;
-}
-
-// ƒAƒJƒEƒ“ƒgƒf??ƒx?ƒX‚Ì‘‚«ž‚Ý
-void nowork(void)
-{
- //null
-}
-
-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);
- }
- }
- 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);
-}
-
-
+// $Id: login-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
+// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
+// login data file to mysql conversion utility.
+//
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+#include <arpa/inet.h>
+
+#include <mysql.h>
+
+#include "../../common/core.h"
+#include "../../common/socket.h"
+#include "../../login/login.h"
+#include "../../common/mmo.h"
+#include "../../common/version.h"
+#include "../../common/db.h"
+#include "../common/inter.h"
+
+int account_id_count = START_ACCOUNT_NUM;
+int server_num;
+int new_account_flag = 0;
+int login_port = 6900;
+
+struct mmo_char_server server[MAX_SERVERS];
+int server_fd[MAX_SERVERS];
+
+#define AUTH_FIFO_SIZE 256
+struct {
+ int account_id,login_id1,login_id2;
+ int sex,delflag;
+} auth_fifo[AUTH_FIFO_SIZE];
+int auth_fifo_pos=0;
+struct {
+ 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;
+int auth_num=0,auth_max=0;
+
+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";
+
+int isGM(int account_id)
+{
+ struct gm_account *p;
+ p = numdb_search(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 = numdb_init();
+
+ 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=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;
+ numdb_insert(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=malloc(sizeof(auth_dat[0])*256);
+ auth_max=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 ("Ñonvert end...\n");
+
+ return 0;
+}
+
+// ƒAƒJƒEƒ“ƒgƒf??ƒx?ƒX‚Ì‘‚«ž‚Ý
+void nowork(void)
+{
+ //null
+}
+
+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);
+ }
+ }
+ 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);
+}
+
+
diff --git a/start b/start
index f73fafd72..e80d50749 100644
--- a/start
+++ b/start
@@ -1,32 +1,32 @@
-# /bin/bash
-
-./athena-start start
-sleep 30
-
-while [ true ] ; do
-if [ " 0" = "$(ps | grep -e login | wc -l)" ] ||
- [ " 0" = "$(ps | grep -e char | wc -l)" ] ||
- [ " 0" = "$(ps | grep -e map | wc -l)" ]; then
-printf "Error:"
-date
- sleep 10
- printf "Checking:"
- date
- if [ " 0" = "$(ps | grep -e login | wc -l)" ] ||
- [ " 0" = "$(ps | grep -e char | wc -l)" ] ||
- [ " 0" = "$(ps | grep -e map | wc -l)" ]; then
- printf "Error Confirmation:"
- date
- printf "Restoration:"
- date
- ./athena-start start
- else
- printf "Check Miss Sorry:"
- date
- fi
-else
-#printf "Check OK:"
-#date
-fi
-sleep 10
+# /bin/bash
+
+./athena-start start
+sleep 30
+
+while [ true ] ; do
+if [ " 0" = "$(ps | grep -e login | wc -l)" ] ||
+ [ " 0" = "$(ps | grep -e char | wc -l)" ] ||
+ [ " 0" = "$(ps | grep -e map | wc -l)" ]; then
+printf "Error:"
+date
+ sleep 10
+ printf "Checking:"
+ date
+ if [ " 0" = "$(ps | grep -e login | wc -l)" ] ||
+ [ " 0" = "$(ps | grep -e char | wc -l)" ] ||
+ [ " 0" = "$(ps | grep -e map | wc -l)" ]; then
+ printf "Error Confirmation:"
+ date
+ printf "Restoration:"
+ date
+ ./athena-start start
+ else
+ printf "Check Miss Sorry:"
+ date
+ fi
+else
+#printf "Check OK:"
+#date
+fi
+sleep 10
done \ No newline at end of file
diff --git a/tool/Makefile b/tool/Makefile
index 873404113..bbf18cf98 100644
--- a/tool/Makefile
+++ b/tool/Makefile
@@ -1,6 +1,6 @@
-all:
- $(CC) -o adduser adduser.c
-
-clean:
- rm -f adduser
- rm -f *.exe
+all:
+ $(CC) -o adduser adduser.c
+
+clean:
+ rm -f adduser
+ rm -f *.exe
diff --git a/tool/adduser.c b/tool/adduser.c
index 96b9fc3df..1219540ab 100644
--- a/tool/adduser.c
+++ b/tool/adduser.c
@@ -1,96 +1,96 @@
-/*
- 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];
-
- // Check to see if account.txt exists.
- printf("Checking if '%s' file exists...\n", account_txt);
- FILE *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);
- }
-
- FILE *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");
-}
+/*
+ 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];
+
+ // Check to see if account.txt exists.
+ printf("Checking if '%s' file exists...\n", account_txt);
+ FILE *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);
+ }
+
+ FILE *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/tool/backup b/tool/backup
index 2b5a95814..939c7eee7 100644
--- a/tool/backup
+++ b/tool/backup
@@ -1,100 +1,100 @@
-#!/usr/bin/perl
-
-##########################################################################
-# Athena—pƒf[ƒ^ƒoƒbƒNƒAƒbƒvƒc[ƒ‹
-#
-# @Athena‚ÌŠeŽíƒf[ƒ^ƒtƒ@ƒCƒ‹*.txt‚ðƒoƒbƒNƒAƒbƒv‚·‚éƒc[ƒ‹
-#
-#-------------------------------------------------------------------------
-# Ý’è•û–@
-# @ŽÀs‚·‚鎞‚̃JƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚©‚ç‚̃f[ƒ^‚ւ̃pƒXAƒtƒ@ƒCƒ‹‚̃ŠƒXƒg‚ð
-# @³‚µ‚­Ý’肵‚Ü‚·BƒoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÍŽ©“®ì¬‚³‚ê‚È‚¢‚Ì‚ÅA
-# @Ž©•ª‚Å쬂µ‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·B
-# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
-#
-# @ƒtƒHƒ‹ƒ_‚͈ø”‚Å‚àŽw’è‚Å‚«‚Ü‚·B—á„./backup ../save/ ./backup_data/
-# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
-#
-# @ŽÀs‚·‚é‚ƃoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÖAƒtƒ@ƒCƒ‹–¼‚ÉŒ»Ý‚Ì“ú•t‚ÆŽž‚ð
-# @‚‚¯‚ătƒ@ƒCƒ‹‚ðƒRƒs[‚µ‚Ü‚·B
-#
-# * toolƒtƒHƒ‹ƒ_“à‚Ébackup_dataƒtƒHƒ‹ƒ_‚ð쬂µA
-# @ athena.sh‚Ì’†‚Éu./tool/backup ./save/ ./tool/backup_data/v
-# ‚Æ‚¢‚¤s‚ð’ljÁ‚·‚é‚ÆAathena‚ð‹N“®‚·‚邽‚тɃoƒbƒNƒAƒbƒv‚ªŽæ‚ê‚Ü‚·
-#
-# •œŒ³‚·‚é‚Æ‚«‚͈ø”‚Éu-r “ú•t‚ÆŽžv‚ðŽw’肵‚Ü‚·B
-# @‚Ü‚½‚»‚ÌŒã‚ë‚ɃtƒHƒ‹ƒ_‚ðŽw’è‚·‚邱‚Æ‚ào—ˆ‚Ü‚·
-# @—á‚P„ ./backup -r 200309191607
-# @—á‚Q„ ./backup -r 200309191607 ../save ./backup_data/
-# @‚±‚Ì—á‚Å‚Í2003/09/19‚Ì16:07•ª‚ɃoƒbƒNƒAƒbƒv‚µ‚½ƒf[ƒ^‚𕜌³‚µ‚Ä‚¢‚Ü‚·
-#
-# @•œŒ³‚·‚é‚Æ‚«AAthenaƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒf[ƒ^‚Í *.bak ‚É–¼‘O‚ð•ÏX‚µ‚Ä
-# @Žc‚µ‚Ä‚¢‚é‚Ì‚ÅA‚¢‚ç‚È‚¢ê‡‚Í rm *.bak ‚È‚Ç‚ÅÁ‚µ‚Ä‚­‚¾‚³‚¢B
-#
-##########################################################################
-
-$sdir="../save/"; #ƒoƒbƒNƒAƒbƒvŒ³(Athena‚̃fƒBƒŒƒNƒgƒŠ/save/)
-$tdir="./backup_data/"; #ƒoƒbƒNƒAƒbƒvæ
-
-@files=( #ƒtƒ@ƒCƒ‹‚̃ŠƒXƒg
- "account","athena","storage","party","guild","castle","pet"
-);
-
-
-#-------------------------------ݒ肱‚±‚Ü‚Å-----------------------------
-
-
-
-
-
-
-
-
-
-
-
-if($ARGV[0]=~/^\-r$/i || $ARGV[0]=~/\-\-(recover|restore)/i){
- #•œŒ³ˆ—
-
- $file=$ARGV[1];
- $sdir=$ARGV[2]||$sdir;
- $tdir=$ARGV[3]||$tdir;
- &restorecopy($_) foreach @files;
- exit(0);
-}
-
-#ƒoƒbƒNƒAƒbƒvˆ—
-$sdir=$ARGV[0]||$sdir;
-$tdir=$ARGV[1]||$tdir;
-
-unless( -d $tdir ){
- print "$0: \"$tdir\" : No such directory\n";
- exit(1);
-}
-
-(undef,$min,$hour,$day,$month,$year)=localtime;
-
-$file=sprintf("%04d%02d%02d%02d%02d",
- $year+1900, $month+1, $day, $hour, $min );
-
-&backupcopy($_) foreach @files;
-exit(0);
-
-sub backupcopy {
- my($name)= @_;
- system("cp $sdir$name.txt $tdir$name$file.txt");
-}
-
-sub restorecopy {
- my($name)= @_;
- unless( -f "$sdir$name.txt" ){
- printf("$0: \"$sdir$name.txt\" not found!\n");
- return 0;
- }
- unless( -f "$tdir$name$file.txt" ){
- printf("$0: \"$tdir$name$file.txt\" not found!\n");
- return 0;
- }
- rename "$sdir$name.txt","$sdir$name.bak";
- system("cp $tdir$name$file.txt $sdir$name.txt");
-}
+#!/usr/bin/perl
+
+##########################################################################
+# Athena—pƒf[ƒ^ƒoƒbƒNƒAƒbƒvƒc[ƒ‹
+#
+# @Athena‚ÌŠeŽíƒf[ƒ^ƒtƒ@ƒCƒ‹*.txt‚ðƒoƒbƒNƒAƒbƒv‚·‚éƒc[ƒ‹
+#
+#-------------------------------------------------------------------------
+# Ý’è•û–@
+# @ŽÀs‚·‚鎞‚̃JƒŒƒ“ƒgƒtƒHƒ‹ƒ_‚©‚ç‚̃f[ƒ^‚ւ̃pƒXAƒtƒ@ƒCƒ‹‚̃ŠƒXƒg‚ð
+# @³‚µ‚­Ý’肵‚Ü‚·BƒoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÍŽ©“®ì¬‚³‚ê‚È‚¢‚Ì‚ÅA
+# @Ž©•ª‚Å쬂µ‚Ä‚¨‚­•K—v‚ª‚ ‚è‚Ü‚·B
+# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
+#
+# @ƒtƒHƒ‹ƒ_‚͈ø”‚Å‚àŽw’è‚Å‚«‚Ü‚·B—á„./backup ../save/ ./backup_data/
+# @ƒtƒHƒ‹ƒ_‚ÌÅŒã‚Ìu/v‚ÍÈ—ª‚Å‚«‚Ü‚¹‚ñB
+#
+# @ŽÀs‚·‚é‚ƃoƒbƒNƒAƒbƒvæ‚̃tƒHƒ‹ƒ_‚ÖAƒtƒ@ƒCƒ‹–¼‚ÉŒ»Ý‚Ì“ú•t‚ÆŽž‚ð
+# @‚‚¯‚ătƒ@ƒCƒ‹‚ðƒRƒs[‚µ‚Ü‚·B
+#
+# * toolƒtƒHƒ‹ƒ_“à‚Ébackup_dataƒtƒHƒ‹ƒ_‚ð쬂µA
+# @ athena.sh‚Ì’†‚Éu./tool/backup ./save/ ./tool/backup_data/v
+# ‚Æ‚¢‚¤s‚ð’ljÁ‚·‚é‚ÆAathena‚ð‹N“®‚·‚邽‚тɃoƒbƒNƒAƒbƒv‚ªŽæ‚ê‚Ü‚·
+#
+# •œŒ³‚·‚é‚Æ‚«‚͈ø”‚Éu-r “ú•t‚ÆŽžv‚ðŽw’肵‚Ü‚·B
+# @‚Ü‚½‚»‚ÌŒã‚ë‚ɃtƒHƒ‹ƒ_‚ðŽw’è‚·‚邱‚Æ‚ào—ˆ‚Ü‚·
+# @—á‚P„ ./backup -r 200309191607
+# @—á‚Q„ ./backup -r 200309191607 ../save ./backup_data/
+# @‚±‚Ì—á‚Å‚Í2003/09/19‚Ì16:07•ª‚ɃoƒbƒNƒAƒbƒv‚µ‚½ƒf[ƒ^‚𕜌³‚µ‚Ä‚¢‚Ü‚·
+#
+# @•œŒ³‚·‚é‚Æ‚«AAthenaƒfƒBƒŒƒNƒgƒŠ‚É‚ ‚éƒf[ƒ^‚Í *.bak ‚É–¼‘O‚ð•ÏX‚µ‚Ä
+# @Žc‚µ‚Ä‚¢‚é‚Ì‚ÅA‚¢‚ç‚È‚¢ê‡‚Í rm *.bak ‚È‚Ç‚ÅÁ‚µ‚Ä‚­‚¾‚³‚¢B
+#
+##########################################################################
+
+$sdir="../save/"; #ƒoƒbƒNƒAƒbƒvŒ³(Athena‚̃fƒBƒŒƒNƒgƒŠ/save/)
+$tdir="./backup_data/"; #ƒoƒbƒNƒAƒbƒvæ
+
+@files=( #ƒtƒ@ƒCƒ‹‚̃ŠƒXƒg
+ "account","athena","storage","party","guild","castle","pet"
+);
+
+
+#-------------------------------ݒ肱‚±‚Ü‚Å-----------------------------
+
+
+
+
+
+
+
+
+
+
+
+if($ARGV[0]=~/^\-r$/i || $ARGV[0]=~/\-\-(recover|restore)/i){
+ #•œŒ³ˆ—
+
+ $file=$ARGV[1];
+ $sdir=$ARGV[2]||$sdir;
+ $tdir=$ARGV[3]||$tdir;
+ &restorecopy($_) foreach @files;
+ exit(0);
+}
+
+#ƒoƒbƒNƒAƒbƒvˆ—
+$sdir=$ARGV[0]||$sdir;
+$tdir=$ARGV[1]||$tdir;
+
+unless( -d $tdir ){
+ print "$0: \"$tdir\" : No such directory\n";
+ exit(1);
+}
+
+(undef,$min,$hour,$day,$month,$year)=localtime;
+
+$file=sprintf("%04d%02d%02d%02d%02d",
+ $year+1900, $month+1, $day, $hour, $min );
+
+&backupcopy($_) foreach @files;
+exit(0);
+
+sub backupcopy {
+ my($name)= @_;
+ system("cp $sdir$name.txt $tdir$name$file.txt");
+}
+
+sub restorecopy {
+ my($name)= @_;
+ unless( -f "$sdir$name.txt" ){
+ printf("$0: \"$sdir$name.txt\" not found!\n");
+ return 0;
+ }
+ unless( -f "$tdir$name$file.txt" ){
+ printf("$0: \"$tdir$name$file.txt\" not found!\n");
+ return 0;
+ }
+ rename "$sdir$name.txt","$sdir$name.bak";
+ system("cp $tdir$name$file.txt $sdir$name.txt");
+}
diff --git a/tool/cgi/addaccount.cgi b/tool/cgi/addaccount.cgi
index 2134a78a3..7d1788c48 100644
--- a/tool/cgi/addaccount.cgi
+++ b/tool/cgi/addaccount.cgi
@@ -1,204 +1,204 @@
-#!/usr/bin/perl
-
-#=========================================================================
-# addaccount.cgi ver.1.00
-# ladmin‚ðƒ‰ƒbƒv‚µ‚½AƒAƒJƒEƒ“ƒg‚ð쬂·‚éCGIB
-# ladmin ver.1.04‚Å‚Ì“®ì‚ðŠm”FB
-#
-# ** Ý’è•û–@ **
-#
-# - ‰º‚Ì$ladmin•Ï”‚Éladmin‚ւ̃pƒX‚ðÝ’è‚·‚邱‚ÆB
-# - UNIXŒnOS‚ÅŽg—p‚·‚éꇂÍladmin‚Æ‹¤‚ɉüsƒR[ƒh‚ð•ÏŠ·‚·‚邱‚ÆA‚Ü‚½
-# ƒtƒ@ƒCƒ‹æ“ªs‚ðperl‚̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB—á> $ which perl
-# - ƒT[ƒo[ƒvƒƒOƒ‰ƒ€‚âƒuƒ‰ƒEƒU‚É‚æ‚Á‚Ä‚Í $cgiuri ‚É‚±‚̃tƒ@ƒCƒ‹‚Ö‚Ì
-# Š®‘S‚ÈURI‚ðƒZƒbƒg‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢ê‡‚à‚ ‚éB
-# - perl‚ɃpƒX‚ª’Ê‚Á‚Ä‚¢‚È‚¢ê‡‚Í $perl ‚ðperl‚ւ̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB
-# - ‘¼‚Í•’Ê‚ÌCGI‚Æ“¯‚¶‚Å‚·BiŽÀsŒ ‚âcgi-binƒtƒHƒ‹ƒ_‚È‚Çj
-#
-# ** ‚»‚Ì‘¼ **
-# addaccount.cgi ‚ðƒuƒ‰ƒEƒU‚ÅŠJ‚­‚ƃTƒ“ƒvƒ‹HTMLi‚»‚Ì‚Ü‚ÜŽg‚¦‚Ü‚·j‚ª
-# ŠJ‚«‚Ü‚·B‚Ü‚½A‚±‚Ìcgi‚̓uƒ‰ƒEƒU‚©‚ç‘—‚ç‚ê‚éAccept-Language‚ª
-# ja‚ÅŽn‚Ü‚Á‚Ä‚¢‚ê‚΃ƒbƒZ[ƒW‚̈ꕔ‚ð“ú–{Œê‚É•ÏŠ·‚µ‚Ü‚·B
-# (IE‚È‚çƒCƒ“ƒ^[ƒlƒbƒgƒIƒvƒVƒ‡ƒ“‚ÌŒ¾ŒêÝ’è‚ňê”Ôã‚É“ú–{Œê‚ð’u‚­)
-# ‚»‚êˆÈŠO‚Ìꇂ͉pŒê‚Ì‚Ü‚Üo—Í‚µ‚Ü‚·B
-#-------------------------------------------------------------------------
-
-my($ladmin) = "../ladmin"; # ladmin‚̃pƒX(‚¨‚»‚ç‚­•ÏX‚ª•K—v)
-
-my($cgiuri) = "./addaccount.cgi"; # ‚±‚̃tƒ@ƒCƒ‹‚ÌURI
-my($perl) = "perl"; # perl‚̃Rƒ}ƒ“ƒh–¼
-
-
-
-#--------------------------- ݒ肱‚±‚Ü‚Å --------------------------------
-
-
-
-
-
-
-use strict;
-use CGI;
-
-my($cgi)= new CGI;
-my(%langconv)=(
- 'Athena login-server administration tool.*' => '',
- 'logged on.*' => '',
-);
-
-# ----- “ú–{ŒêŠÂ‹«‚È‚ç•ÏŠ·ƒe[ƒuƒ‹‚ðƒZƒbƒg -----
-if($ENV{'HTTP_ACCEPT_LANGUAGE'}=~/^ja/){
- my(%tmp)=(
- 'Account \[(.+)\] is successfully created.*'
- => 'ƒAƒJƒEƒ“ƒg "$1" ‚ð쬂µ‚Ü‚µ‚½.',
- 'Account \[(.+)\] creation failed\. same account exists.*'
- => 'ƒAƒJƒEƒ“ƒg "$1" ‚ÍŠù‚É‘¶Ý‚µ‚Ü‚·.',
- 'Illeagal charactor found in UserID.*'
- => 'ID‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
- 'Illeagal charactor found in Password.*'
- => 'Password‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
- 'input UserID 4-24 bytes.'
- => 'ID‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
- 'input Password 4-24 bytes.'
- => 'Password‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
- 'Illeagal gender.*'
- => '«•Ê‚ª‚¨‚©‚µ‚¢‚Å‚·.',
- 'Cant connect to login server.*'
- => 'ƒƒOƒCƒ“ƒT[ƒo[‚ÉÚ‘±‚Å‚«‚Ü‚¹‚ñ.',
- 'login error.*'
- => 'ƒƒOƒCƒ“ƒT[ƒo[‚Ö‚ÌŠÇ—ŽÒŒ ŒÀƒƒOƒCƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
- "Can't execute ladmin.*"
- => 'ladmin‚ÌŽÀs‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
- 'UserID "(.+)" is already used.*'
- => 'ID "$1" ‚ÍŠù‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·.',
- 'You can use UserID \"(.+)\".*'
- => 'ID "$1" ‚ÍŽg—p‰Â”\‚Å‚·.',
-
- 'account making' =>'ƒAƒJƒEƒ“ƒgì¬',
- '\>UserID' =>'>‚h‚c',
- '\>Password' =>'>ƒpƒXƒ[ƒh',
- '\>Gender' =>'>«•Ê',
- '\>Male' =>'>’j«',
- '\>Female' =>'>—«',
- '\"Make Account\"' =>'"ƒAƒJƒEƒ“ƒgì¬"',
- '\"Check UserID\"' =>'"ID‚̃`ƒFƒbƒN"',
- );
- map { $langconv{$_}=$tmp{$_}; } keys (%tmp);
-}
-
-# ----- ’ljÁ -----
-if( $cgi->param("addaccount") ){
- my($userid)= $cgi->param("userid");
- my($passwd)= $cgi->param("passwd");
- my($gender)= lc(substr($cgi->param("gender"),0,1));
- if(length($userid)<4 || length($userid)>24){
- HttpError("input UserID 4-24 bytes.");
- }
- if(length($passwd)<4 || length($passwd)>24){
- HttpError("input Password 4-24 bytes.");
- }
- if($userid=~/[^0-9A-Za-z\@\_\-\']/){
- HttpError("Illeagal charactor found in UserID.");
- }
- if($passwd=~/[\x00-\x1f\x80-\xff\']/){
- HttpError("Illeagal charactor found in Password.");
- }
- if($gender!~/[mf]/){
- HttpError("Gender error.");
- }
- open PIPE,"$perl $ladmin --add $userid $gender $passwd |"
- or HttpError("Can't execute ladmin.");
- my(@msg)=<PIPE>;
- close PIPE;
- HttpMsg(@msg);
-}
-# ----- ‘¶Ýƒ`ƒFƒbƒN -----
-elsif( $cgi->param("check") ){
- my($userid)= $cgi->param("userid");
- if(length($userid)<4 || length($userid)>24){
- HttpError("input UserID 4-24 bytes.");
- }
- if($userid=~/[^0-9A-Za-z\@\_\-\']/){
- HttpError("Illeagal charactor found in UserID.");
- }
- open PIPE,"$perl $ladmin --search --regex \\b$userid\\b |"
- or HttpError("Can't execute ladmin.");
- my(@msg)=<PIPE>;
- close PIPE;
- if(scalar(@msg)==6 && (split /[\s\0]+/,substr($msg[4],11,24))[0] eq $userid){
- HttpMsg("NG : UserID \"$userid\" is already used.");
- }elsif(scalar(@msg)==5){
- HttpMsg("OK : You can use UserID \"$userid\"");
- }
- HttpError("ladmin error ?\n---output---\n",@msg);
-}
-
-# ----- ƒtƒH[ƒ€ -----
-else{
- print LangConv( <<"EOM" );
-Content-type: text/html\n
-<html>
- <head>
- <title>Athena account making cgi</title>
- </head>
- <body>
- <h1>Athena account making cgi</h1>
- <form action="$cgiuri" method="post">
- <table border=2>
- <tr>
- <th>UserID</th>
- <td><input name="userid" size=24 maxlength=24></td>
- </tr>
- <tr>
- <th>Password</th>
- <td><input name="passwd" size=24 maxlength=24 type="password"></td>
- </tr>
- <tr>
- <th>Gender</th>
- <td>
- <input type="radio" name="gender" value="male">Male
- <input type="radio" name="gender" value="female">Female
- </td>
- </tr>
- <tr>
- <td colspan=2>
- <input type="submit" name="addaccount" value="Make Account">
- <input type="submit" name="check" value="Check UserID">
- </td>
- </tr>
- </table>
- </form>
- </body>
-</html>
-EOM
- exit;
-}
-
-sub LangConv {
- my(@lst)= @_;
- my($a,$b,@out)=();
- foreach $a(@lst){
- foreach $b(keys %langconv){
- $a=~s/$b/$langconv{$b}/g;
- my($rep1)=$1;
- $a=~s/\$1/$rep1/g;
- }
- push @out,$a;
- }
- return @out;
-}
-
-sub HttpMsg {
- my($msg)=join("", LangConv(@_));
- $msg=~s/\n/<br>\n/g;
- print LangConv("Content-type: text/html\n\n"),$msg;
- exit;
-}
-
-sub HttpError {
- my($msg)=join("", LangConv(@_));
- $msg=~s/\n/<br>\n/g;
- print LangConv("Content-type: text/html\n\n"),$msg;
- exit;
-}
-
+#!/usr/bin/perl
+
+#=========================================================================
+# addaccount.cgi ver.1.00
+# ladmin‚ðƒ‰ƒbƒv‚µ‚½AƒAƒJƒEƒ“ƒg‚ð쬂·‚éCGIB
+# ladmin ver.1.04‚Å‚Ì“®ì‚ðŠm”FB
+#
+# ** Ý’è•û–@ **
+#
+# - ‰º‚Ì$ladmin•Ï”‚Éladmin‚ւ̃pƒX‚ðÝ’è‚·‚邱‚ÆB
+# - UNIXŒnOS‚ÅŽg—p‚·‚éꇂÍladmin‚Æ‹¤‚ɉüsƒR[ƒh‚ð•ÏŠ·‚·‚邱‚ÆA‚Ü‚½
+# ƒtƒ@ƒCƒ‹æ“ªs‚ðperl‚̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB—á> $ which perl
+# - ƒT[ƒo[ƒvƒƒOƒ‰ƒ€‚âƒuƒ‰ƒEƒU‚É‚æ‚Á‚Ä‚Í $cgiuri ‚É‚±‚̃tƒ@ƒCƒ‹‚Ö‚Ì
+# Š®‘S‚ÈURI‚ðƒZƒbƒg‚µ‚È‚¯‚ê‚΂Ȃç‚È‚¢ê‡‚à‚ ‚éB
+# - perl‚ɃpƒX‚ª’Ê‚Á‚Ä‚¢‚È‚¢ê‡‚Í $perl ‚ðperl‚ւ̳‚µ‚¢ƒpƒX‚É‚·‚邱‚ÆB
+# - ‘¼‚Í•’Ê‚ÌCGI‚Æ“¯‚¶‚Å‚·BiŽÀsŒ ‚âcgi-binƒtƒHƒ‹ƒ_‚È‚Çj
+#
+# ** ‚»‚Ì‘¼ **
+# addaccount.cgi ‚ðƒuƒ‰ƒEƒU‚ÅŠJ‚­‚ƃTƒ“ƒvƒ‹HTMLi‚»‚Ì‚Ü‚ÜŽg‚¦‚Ü‚·j‚ª
+# ŠJ‚«‚Ü‚·B‚Ü‚½A‚±‚Ìcgi‚̓uƒ‰ƒEƒU‚©‚ç‘—‚ç‚ê‚éAccept-Language‚ª
+# ja‚ÅŽn‚Ü‚Á‚Ä‚¢‚ê‚΃ƒbƒZ[ƒW‚̈ꕔ‚ð“ú–{Œê‚É•ÏŠ·‚µ‚Ü‚·B
+# (IE‚È‚çƒCƒ“ƒ^[ƒlƒbƒgƒIƒvƒVƒ‡ƒ“‚ÌŒ¾ŒêÝ’è‚ňê”Ôã‚É“ú–{Œê‚ð’u‚­)
+# ‚»‚êˆÈŠO‚Ìꇂ͉pŒê‚Ì‚Ü‚Üo—Í‚µ‚Ü‚·B
+#-------------------------------------------------------------------------
+
+my($ladmin) = "../ladmin"; # ladmin‚̃pƒX(‚¨‚»‚ç‚­•ÏX‚ª•K—v)
+
+my($cgiuri) = "./addaccount.cgi"; # ‚±‚̃tƒ@ƒCƒ‹‚ÌURI
+my($perl) = "perl"; # perl‚̃Rƒ}ƒ“ƒh–¼
+
+
+
+#--------------------------- ݒ肱‚±‚Ü‚Å --------------------------------
+
+
+
+
+
+
+use strict;
+use CGI;
+
+my($cgi)= new CGI;
+my(%langconv)=(
+ 'Athena login-server administration tool.*' => '',
+ 'logged on.*' => '',
+);
+
+# ----- “ú–{ŒêŠÂ‹«‚È‚ç•ÏŠ·ƒe[ƒuƒ‹‚ðƒZƒbƒg -----
+if($ENV{'HTTP_ACCEPT_LANGUAGE'}=~/^ja/){
+ my(%tmp)=(
+ 'Account \[(.+)\] is successfully created.*'
+ => 'ƒAƒJƒEƒ“ƒg "$1" ‚ð쬂µ‚Ü‚µ‚½.',
+ 'Account \[(.+)\] creation failed\. same account exists.*'
+ => 'ƒAƒJƒEƒ“ƒg "$1" ‚ÍŠù‚É‘¶Ý‚µ‚Ü‚·.',
+ 'Illeagal charactor found in UserID.*'
+ => 'ID‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
+ 'Illeagal charactor found in Password.*'
+ => 'Password‚Ì’†‚É•s³‚È•¶Žš‚ª‚ ‚è‚Ü‚·.',
+ 'input UserID 4-24 bytes.'
+ => 'ID‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
+ 'input Password 4-24 bytes.'
+ => 'Password‚Í”¼Šp4`24•¶Žš‚Å“ü—Í‚µ‚Ä‚­‚¾‚³‚¢.',
+ 'Illeagal gender.*'
+ => '«•Ê‚ª‚¨‚©‚µ‚¢‚Å‚·.',
+ 'Cant connect to login server.*'
+ => 'ƒƒOƒCƒ“ƒT[ƒo[‚ÉÚ‘±‚Å‚«‚Ü‚¹‚ñ.',
+ 'login error.*'
+ => 'ƒƒOƒCƒ“ƒT[ƒo[‚Ö‚ÌŠÇ—ŽÒŒ ŒÀƒƒOƒCƒ“‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
+ "Can't execute ladmin.*"
+ => 'ladmin‚ÌŽÀs‚ÉŽ¸”s‚µ‚Ü‚µ‚½',
+ 'UserID "(.+)" is already used.*'
+ => 'ID "$1" ‚ÍŠù‚ÉŽg—p‚³‚ê‚Ä‚¢‚Ü‚·.',
+ 'You can use UserID \"(.+)\".*'
+ => 'ID "$1" ‚ÍŽg—p‰Â”\‚Å‚·.',
+
+ 'account making' =>'ƒAƒJƒEƒ“ƒgì¬',
+ '\>UserID' =>'>‚h‚c',
+ '\>Password' =>'>ƒpƒXƒ[ƒh',
+ '\>Gender' =>'>«•Ê',
+ '\>Male' =>'>’j«',
+ '\>Female' =>'>—«',
+ '\"Make Account\"' =>'"ƒAƒJƒEƒ“ƒgì¬"',
+ '\"Check UserID\"' =>'"ID‚̃`ƒFƒbƒN"',
+ );
+ map { $langconv{$_}=$tmp{$_}; } keys (%tmp);
+}
+
+# ----- ’ljÁ -----
+if( $cgi->param("addaccount") ){
+ my($userid)= $cgi->param("userid");
+ my($passwd)= $cgi->param("passwd");
+ my($gender)= lc(substr($cgi->param("gender"),0,1));
+ if(length($userid)<4 || length($userid)>24){
+ HttpError("input UserID 4-24 bytes.");
+ }
+ if(length($passwd)<4 || length($passwd)>24){
+ HttpError("input Password 4-24 bytes.");
+ }
+ if($userid=~/[^0-9A-Za-z\@\_\-\']/){
+ HttpError("Illeagal charactor found in UserID.");
+ }
+ if($passwd=~/[\x00-\x1f\x80-\xff\']/){
+ HttpError("Illeagal charactor found in Password.");
+ }
+ if($gender!~/[mf]/){
+ HttpError("Gender error.");
+ }
+ open PIPE,"$perl $ladmin --add $userid $gender $passwd |"
+ or HttpError("Can't execute ladmin.");
+ my(@msg)=<PIPE>;
+ close PIPE;
+ HttpMsg(@msg);
+}
+# ----- ‘¶Ýƒ`ƒFƒbƒN -----
+elsif( $cgi->param("check") ){
+ my($userid)= $cgi->param("userid");
+ if(length($userid)<4 || length($userid)>24){
+ HttpError("input UserID 4-24 bytes.");
+ }
+ if($userid=~/[^0-9A-Za-z\@\_\-\']/){
+ HttpError("Illeagal charactor found in UserID.");
+ }
+ open PIPE,"$perl $ladmin --search --regex \\b$userid\\b |"
+ or HttpError("Can't execute ladmin.");
+ my(@msg)=<PIPE>;
+ close PIPE;
+ if(scalar(@msg)==6 && (split /[\s\0]+/,substr($msg[4],11,24))[0] eq $userid){
+ HttpMsg("NG : UserID \"$userid\" is already used.");
+ }elsif(scalar(@msg)==5){
+ HttpMsg("OK : You can use UserID \"$userid\"");
+ }
+ HttpError("ladmin error ?\n---output---\n",@msg);
+}
+
+# ----- ƒtƒH[ƒ€ -----
+else{
+ print LangConv( <<"EOM" );
+Content-type: text/html\n
+<html>
+ <head>
+ <title>Athena account making cgi</title>
+ </head>
+ <body>
+ <h1>Athena account making cgi</h1>
+ <form action="$cgiuri" method="post">
+ <table border=2>
+ <tr>
+ <th>UserID</th>
+ <td><input name="userid" size=24 maxlength=24></td>
+ </tr>
+ <tr>
+ <th>Password</th>
+ <td><input name="passwd" size=24 maxlength=24 type="password"></td>
+ </tr>
+ <tr>
+ <th>Gender</th>
+ <td>
+ <input type="radio" name="gender" value="male">Male
+ <input type="radio" name="gender" value="female">Female
+ </td>
+ </tr>
+ <tr>
+ <td colspan=2>
+ <input type="submit" name="addaccount" value="Make Account">
+ <input type="submit" name="check" value="Check UserID">
+ </td>
+ </tr>
+ </table>
+ </form>
+ </body>
+</html>
+EOM
+ exit;
+}
+
+sub LangConv {
+ my(@lst)= @_;
+ my($a,$b,@out)=();
+ foreach $a(@lst){
+ foreach $b(keys %langconv){
+ $a=~s/$b/$langconv{$b}/g;
+ my($rep1)=$1;
+ $a=~s/\$1/$rep1/g;
+ }
+ push @out,$a;
+ }
+ return @out;
+}
+
+sub HttpMsg {
+ my($msg)=join("", LangConv(@_));
+ $msg=~s/\n/<br>\n/g;
+ print LangConv("Content-type: text/html\n\n"),$msg;
+ exit;
+}
+
+sub HttpError {
+ my($msg)=join("", LangConv(@_));
+ $msg=~s/\n/<br>\n/g;
+ print LangConv("Content-type: text/html\n\n"),$msg;
+ exit;
+}
+
diff --git a/tool/checkversion b/tool/checkversion
index 135165236..9e485d9a3 100644
--- a/tool/checkversion
+++ b/tool/checkversion
@@ -1,85 +1,85 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
-#
-# By connection on a server, this software display the version of the
-# designed server.
-#-------------------------------------------------------------------------
-# Usages:
-# ./checkversion IP:port
-# ./checkversion IP port
-# perl checkversion IP:port
-# perl checkversion IP port
-#
-# note: default port: 6900
-#
-# When successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------- start of configuration ------------------------
-
-$connecttimeout = 10; # Connection Timeout (in seconds)
-
-#-------------------------- End of configuration -------------------------
-
-use IO::Socket;
-
-unless($ARGV[0]) {
- print "USAGE: $0 server_ip:port\n";
- exit(1);
-}
-
-$server = $ARGV[0];
-$port = $ARGV[1];
-$port = $1 if ($server =~ s/:(\d+)//);
-$port ||= 6900;
-
-# Connection to the server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $server,
- PeerPort=> $port,
- Proto => "tcp",
- Timeout => $connecttimeout) or $er = 1;
-};
-
-if($er || $@) {
- print "Can't not connect to server [$server:$port] !\n";
- exit(2);
-}
-
-# Request for the server version
-print $so pack("v",30000); # 0x7530
-$so->flush();
-
-# Receiving of the answer of the server
-if (read($so,$buf,10) < 10) {
- print "Invalid answer. It isn't an athena server or it is a too old version.\n";
- exit(5);
-}
-
-# Sending end of connection to the server
-print $so pack("v",30002); # 0x7532
-$so->flush();
-
-# Analyse of the answer
-my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);
-
-if ($ret != 30001) { # 0x7531
- print "Invalid answer. It isn't an athena server or it is a too old version.\n";
- exit(6);
-}
-
-my(@stype) = ();
-foreach $i(0..3) {
- push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
-}
-print " ".join("/",@stype)." server [$server:$port].\n";
-printf " Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
-printf " revision %d",$rev if $rev;
-printf "%s%d\n",("","-mod")[$mod],$mdver;
-
-exit(0);
+#!/usr/bin/perl -w
+
+##########################################################################
+# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
+#
+# By connection on a server, this software display the version of the
+# designed server.
+#-------------------------------------------------------------------------
+# Usages:
+# ./checkversion IP:port
+# ./checkversion IP port
+# perl checkversion IP:port
+# perl checkversion IP port
+#
+# note: default port: 6900
+#
+# When successfull, the software return the value 0.
+#
+##########################################################################
+
+#------------------------- start of configuration ------------------------
+
+$connecttimeout = 10; # Connection Timeout (in seconds)
+
+#-------------------------- End of configuration -------------------------
+
+use IO::Socket;
+
+unless($ARGV[0]) {
+ print "USAGE: $0 server_ip:port\n";
+ exit(1);
+}
+
+$server = $ARGV[0];
+$port = $ARGV[1];
+$port = $1 if ($server =~ s/:(\d+)//);
+$port ||= 6900;
+
+# Connection to the server
+my($so,$er) = ();
+eval{
+ $so = IO::Socket::INET->new(
+ PeerAddr=> $server,
+ PeerPort=> $port,
+ Proto => "tcp",
+ Timeout => $connecttimeout) or $er = 1;
+};
+
+if($er || $@) {
+ print "Can't not connect to server [$server:$port] !\n";
+ exit(2);
+}
+
+# Request for the server version
+print $so pack("v",30000); # 0x7530
+$so->flush();
+
+# Receiving of the answer of the server
+if (read($so,$buf,10) < 10) {
+ print "Invalid answer. It isn't an athena server or it is a too old version.\n";
+ exit(5);
+}
+
+# Sending end of connection to the server
+print $so pack("v",30002); # 0x7532
+$so->flush();
+
+# Analyse of the answer
+my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);
+
+if ($ret != 30001) { # 0x7531
+ print "Invalid answer. It isn't an athena server or it is a too old version.\n";
+ exit(6);
+}
+
+my(@stype) = ();
+foreach $i(0..3) {
+ push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
+}
+print " ".join("/",@stype)." server [$server:$port].\n";
+printf " Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
+printf " revision %d",$rev if $rev;
+printf "%s%d\n",("","-mod")[$mod],$mdver;
+
+exit(0);
diff --git a/tool/convert.c b/tool/convert.c
index 6cf36a686..16631c945 100644
--- a/tool/convert.c
+++ b/tool/convert.c
@@ -1,296 +1,296 @@
-#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;
-}
+#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/tool/getlogincount b/tool/getlogincount
index 6a209924f..45c6f81f6 100644
--- a/tool/getlogincount
+++ b/tool/getlogincount
@@ -1,122 +1,122 @@
-#!/usr/bin/perl -w
-
-##########################################################################
-# INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS
-#
-# By connection on the athena login-server, this software displays the
-# number of online players.
-#
-#-------------------------------------------------------------------------
-# Software usage:
-# Configure the IP, the port and a valid account of the server.
-# After, use at your choice:
-# ./getlogincount - display the number of online players on all servers.
-# ./getlogincount --premier or
-# ./getlogincount --first -- display the number of online players of the
-# first server in the received list.
-# ./getlogincount [servername] -- display the number of online players
-# of the specified server.
-#
-# If successfull, the software return the value 0.
-#
-##########################################################################
-
-#------------------------------ CONFIGURATION ----------------------------
-
-$loginserverip = "127.0.0.1"; # IP of the login-server
-$loginserverport = 6900; # port of the login-server
-$loginaccount = "s1"; # a valid account name
-$loginpasswd = "p1"; # the password of the valid account name
-
-$connecttimeout = 10; # Connection timeout (in seconds)
-
-#-------------------------------------------------------------------------
-
-use IO::Socket;
-
-my($sname) = $ARGV[0];
-if (!defined($sname)) {
- $sname = "";
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $loginserverip,
- PeerPort=> $loginserverport,
- Proto => "tcp",
- Timeout => $connecttimeout) or $er=1;
-};
-if($er || $@){
- print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n";
- exit(2);
-}
-
-# Request to connect on login-server
-print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3);
-$so->flush();
-
-# Fail to connect
-if(unpack("v", &soread(\$so,2)) != 0x0069) {
- print "Login error.\n";
- exit(3);
-}
-
-# Get length of the received packet
-my($plen) = unpack("v",&soread(\$so,2))-4;
-
-# Suppress information of the account (we need only information about the servers)
-&soread(\$so,43);
-$plen -= 43;
-
-# Check about the number of online servers
-if ($plen < 32) {
- printf "No server is connected to login-server.\n";
- exit(1);
-}
-
-# Read information of the servers
-my(@slist) = ();
-for(;$plen > 0;$plen -= 32) {
- my($name,$count) = unpack("x6 a20 V",&soread(\$so,32));
- $name = substr($name,0,index($name,"\0"));
- push @slist, [ $name, $count ];
-}
-
-# Display the result
-if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server
- printf "%-20s : %5d\n",$slist[0][0],$slist[0][1];
-} elsif ($sname eq "") { # If we ask for all servers
- foreach $i(@slist) {
- printf "%-20s : %5d\n",$i->[0],$i->[1];
- }
-} else { # If we ask for a specified server (by its name)
- my($flag) = 1;
- foreach $i(@slist) {
- if($i->[0] eq $sname) {
- printf "%-20s : %5d\n",$i->[0],$i->[1];
- $flag = 0;
- }
- }
- if($flag) { # If the server doesn't exist
- printf "The server [$sname] doesn't exist.\n";
- exit(1);
- }
-}
-
-# End of the software
-$so->shutdown(2);
-$so->close();
-exit(0);
-
-# Sub-function: get data from the socket
-sub soread {
- my($so,$len) = @_;
- my($sobuf);
- if(read($$so,$sobuf,$len) < $len) {
- print "Socket read error.\n";
- exit(5);
- }
- return $sobuf;
-};
+#!/usr/bin/perl -w
+
+##########################################################################
+# INFORMATION TOOL ABOUT THE # OF ONLINE PLAYERS ON ATHENA SERVERS
+#
+# By connection on the athena login-server, this software displays the
+# number of online players.
+#
+#-------------------------------------------------------------------------
+# Software usage:
+# Configure the IP, the port and a valid account of the server.
+# After, use at your choice:
+# ./getlogincount - display the number of online players on all servers.
+# ./getlogincount --premier or
+# ./getlogincount --first -- display the number of online players of the
+# first server in the received list.
+# ./getlogincount [servername] -- display the number of online players
+# of the specified server.
+#
+# If successfull, the software return the value 0.
+#
+##########################################################################
+
+#------------------------------ CONFIGURATION ----------------------------
+
+$loginserverip = "127.0.0.1"; # IP of the login-server
+$loginserverport = 6900; # port of the login-server
+$loginaccount = "s1"; # a valid account name
+$loginpasswd = "p1"; # the password of the valid account name
+
+$connecttimeout = 10; # Connection timeout (in seconds)
+
+#-------------------------------------------------------------------------
+
+use IO::Socket;
+
+my($sname) = $ARGV[0];
+if (!defined($sname)) {
+ $sname = "";
+}
+
+# Connection to the login-server
+my($so,$er) = ();
+eval{
+ $so = IO::Socket::INET->new(
+ PeerAddr=> $loginserverip,
+ PeerPort=> $loginserverport,
+ Proto => "tcp",
+ Timeout => $connecttimeout) or $er=1;
+};
+if($er || $@){
+ print "Can't not connect to the login-server [${loginserverip}:$loginserverport] !\n";
+ exit(2);
+}
+
+# Request to connect on login-server
+print $so pack("v V a24 a24 C",0x0064,9,$loginaccount,$loginpasswd,3);
+$so->flush();
+
+# Fail to connect
+if(unpack("v", &soread(\$so,2)) != 0x0069) {
+ print "Login error.\n";
+ exit(3);
+}
+
+# Get length of the received packet
+my($plen) = unpack("v",&soread(\$so,2))-4;
+
+# Suppress information of the account (we need only information about the servers)
+&soread(\$so,43);
+$plen -= 43;
+
+# Check about the number of online servers
+if ($plen < 32) {
+ printf "No server is connected to login-server.\n";
+ exit(1);
+}
+
+# Read information of the servers
+my(@slist) = ();
+for(;$plen > 0;$plen -= 32) {
+ my($name,$count) = unpack("x6 a20 V",&soread(\$so,32));
+ $name = substr($name,0,index($name,"\0"));
+ push @slist, [ $name, $count ];
+}
+
+# Display the result
+if($sname eq "--first" || $sname eq "--premier") { # If we ask only for the first server
+ printf "%-20s : %5d\n",$slist[0][0],$slist[0][1];
+} elsif ($sname eq "") { # If we ask for all servers
+ foreach $i(@slist) {
+ printf "%-20s : %5d\n",$i->[0],$i->[1];
+ }
+} else { # If we ask for a specified server (by its name)
+ my($flag) = 1;
+ foreach $i(@slist) {
+ if($i->[0] eq $sname) {
+ printf "%-20s : %5d\n",$i->[0],$i->[1];
+ $flag = 0;
+ }
+ }
+ if($flag) { # If the server doesn't exist
+ printf "The server [$sname] doesn't exist.\n";
+ exit(1);
+ }
+}
+
+# End of the software
+$so->shutdown(2);
+$so->close();
+exit(0);
+
+# Sub-function: get data from the socket
+sub soread {
+ my($so,$len) = @_;
+ my($sobuf);
+ if(read($$so,$sobuf,$len) < $len) {
+ print "Socket read error.\n";
+ exit(5);
+ }
+ return $sobuf;
+};
diff --git a/tool/ladmin b/tool/ladmin
index e3319d5de..d0c0be485 100644
--- a/tool/ladmin
+++ b/tool/ladmin
@@ -1,3793 +1,3793 @@
-#!/usr/bin/perl
-use POSIX;
-##########################################################################
-# EAthena login-server remote administration tool
-# New ladamin by [Yor]
-##########################################################################
-#-------------------------------INSTRUCTIONS------------------------------
-# Set the 4 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)
-#-------------------------------------------------------------------------
-my($loginserverip) = "127.0.0.1"; # IP of login-server
-my($loginserverport) = 6900; # Port of login-server
-my($loginserveradminpassword) = "admin"; # Administration password
-my($connecttimeout) = 10; # Timeout of connection (in seconds)
-my($passenc) = 2; # Encoding type of the password
-my($defaultlanguage) = "E"; # Default language (F: Français/E: English)
- # (if it's not 'F', default is English)
-
-#-------------------------------------------------------------------------
-# 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.
-# Same command of banset, except that 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: 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.
-# Same command of 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: 23:59:59
-# timeset <account_name> 0
-# Gives an unlimited validity limit (0 = unlimited).
-#
-# unban/unbanish <account name>
-# Unban an account.
-# Same command of banset 0.
-#
-# unblock <account name>
-# Set state 0 (Account ok) to an account.
-# Same command of state <account_name> 0.
-#
-# version
-# Display the version of the login-server.
-#
-# who <account name>
-# Displays complete information of an account.
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin in command line by usage of the software with a parameter:
-# ./ladmin --mode param1 ...
-#
-# --makesymlink -- Create the symbolic links for a use in shell
-# --add <account_name> <sex> <password> -- Create an account with the default email (or -a)
-# --ban yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account (or -b)
-# --banadd <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account (or - ba)
-# --banset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account (or -bs)
-# --banset <account_name> 0 -- Unbanish an account (or -bs)
-# --block <account_name> -- Set state 5 to an account (or -bl)
-# --check <account_name> <password> -- Check the validity of a password for an account (or -check)
-# --create <account_name> <sex> <email> <password> -- Create an account with email (or -c)
-# --del <account_name> -- Remove an account (or -d)
-# --email <account_name> <email> -- Modify an email of an account (or -e)
-# --getcount -- Give the number of players online on all char-servers (or -g)
-# --gm <account_name> <GM_level> -- Change the GM level of an account (or -gm)
-# --id <account_name> -- Give the id of an account (or -i)
-# --info <account_id> -- Display complete information of an account (or -info)
-# --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 (-lang).
-# --list [First_id [Last_id]] -- Display a list of accounts (or -l)
-# --listBan [start_id [end_id]] -- Display a list of accounts with state or banished (or -lBan)
-# --listGM [First_id [Last_id]] -- Display a list of GM accounts (or -lGM)
-# --listOK [start_id [end_id]] -- Display a list of accounts without state and not banished (or -lOK)
-# --memo <account_name> <memo> -- Modify the memo of an account (or -e)
-# --name <account_id> -- Give the name of an account (or -n)
-# --passwd <account_name> <new_password> -- Change the password of an account (or -p)
-# --reloadGM -- Reload GM configuration file (or -r)
-# --search <expression> -- Seek accounts (or -s)
-# --search -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX (or -s)
-# --sex <account_name> <sex> -- Change the sex of an account (or -sex)
-# --state <account_name> <new_state> <error_message_#7> -- Change the state of an account (or -t)
-# --timeadd <account_name> <modifier> -- Add or substract time from the validity limit of an account (or - ta)
-# --timeset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account (or -ts)
-# --timeset <account_name> 0 -- Give a unlimited validity limit (or -ts)
-# --unban/unbanish <account_name> -- Unban an account (or -uba)
-# --unblock <account_name> -- Set state 0 to an account (or -ubl)
-# --version -- Display the version of the login-server (or -v)
-# --who <account_name> -- Display complete information of an account (or -w)
-#
-# <example> ./ladmin --addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# Possibilities to execute ladmin with symbolic links in Shell
-# To create the symbolic links, execute ladmin with the '-- makesymlink' option.
-#
-# addaccount <account_name> <sex> <password> -- Create an account with the default email
-# banaccount yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account
-# banaddaccount <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account
-# bansetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account
-# bansetaccount <account_name> 0 -- Unbanish an account
-# blockaccount <account_name> -- Set state 5 (blocked by the GM Team) to an account
-# checkaccount <account_name> <password> -- Check the validity of a password for an account
-# createaccount <account_name> <sex> <email> <password> -- Create an account with email
-# delaccount <account_name> -- Remove an account
-# emailaccount <account_name> <email> -- Modify an email of an account
-# getcount -- Give the number of players online on all char-servers
-# gmaccount <account_name> <GM_level> -- Change the GM level of an account
-# idaccount <account_name> -- Give the id of an account
-# infoaccount <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).
-# ladminlanguage <language> -- Change the language of displaying.
-# listaccount [First_id [Last_id]] -- Display a list of accounts
-# listBanaccount [start_id [end_id]] -- Display a list of accounts with state or banished
-# listGMaccount [First_id [Last_id]] -- Display a list of GM accounts
-# listOKaccount [start_id [end_id]] -- Display a list of accounts without state and not banished
-# loginserverversion -- Display the version of the login-server
-# memoaccount <account_name> <memo> -- Modify the memo of an account
-# nameaccount <account_id> -- Give the name of an account
-# passwdaccount <account_name> <new_password> -- Change the password of an account
-# reloadGM -- Reload GM configuration file
-# searchaccount <expression> -- Seek accounts
-# searchaccount -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX
-# sexaccount <account_name> <sex> -- Change the sex of an account (or -sex)
-# stateaccount <account_name> <new_state> <error_message_#7> -- Change the state of an account
-# timeaddaccount <account_name> <modifier> -- Add or substract time from the validity limit of an account
-# timesetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account
-# timesetaccount <account_name> 0 -- Give a unlimited validity limit
-# unbanaccount <account_name> -- Unban an account
-# unblockaccount <account_name> -- Set state 0 (Account ok) to an account
-# whoaccount <account_name> -- Display complete information of an account
-# <exemple> ./addaccount testname Male testpass
-#
-#-------------------------------------------------------------------------
-# About the encoding:
-#
-# The Digest::MD5 module is necessary to use the encrypted password system.
-# When the software cannot found the Digest::MD5 module,
-# encoding is automatically disabled ($passenc=0), which allows
-# to use this program in any cases.
-#
-#-------------------------------------------------------------------------
-# How to use ladmin with UNIX:
-#
-# You excecute ladmin as a standard command.
-# <Example of preparation to have an access to ladmin>
-# $ mv ladmin ladmin_org
-# $ nkf -eLu ladmin_org > ladmin
-# $ chmod 700 ladmin
-# <Example to start directly ladmin>
-# $ perl ladmin
-#
-##########################################################################
-
-
-use strict;
-use IO::Socket;
-use Term::ReadLine;
-eval { use POSIX qw(:termios_h); };
-eval { use Digest::MD5 qw(md5); } if $passenc;
-$passenc = 0 if($@);
-
-my($ver) = "1.00";
-
-# Start of termios
-my($termios, $orgterml, $termlecho, $termlnoecho) = ();
-eval{
- $termios = POSIX::Termios->new();
- $termios->getattr(fileno(STDIN));
- $orgterml = $termios->getlflag();
- $termlecho = ECHO | ECHOK | ICANON;
- $termlnoecho = $orgterml & ~$termlecho;
-};
-
-# Modification of termios for the displaying of passwords (no displays for pressed keys)
-sub cbreak() {
- if ($termios) {
- $termios->setlflag($termlnoecho);
- $termios->setcc(VTIME, 1);
- $termios->setattr(fileno(STDIN), TCSANOW);
- }
-}
-# Modification of termios to return at the normal displaying (after input of the passwords)
-sub cooked() {
- if ($termios) {
- $termios->setlflag($orgterml);
- $termios->setcc(VTIME,0);
- $termios->setattr(fileno(STDIN),TCSANOW);
- }
-}
-END{ cooked() }
-
-if ($defaultlanguage eq "F") {
- print "Outil d'administration à distance de eAthena V.$ver\n";
-} else {
- print "EAthena login-server administration tool V.$ver\n";
-}
-
-# Creation of the symbolic links for call of the program in line command of the shell
-if ($ARGV[0] eq "--makesymlink") {
- symlink $0, "loginserverversion";
- symlink $0, "addaccount";
- symlink $0, "banaccount";
- symlink $0, "banaddaccount";
- symlink $0, "bansetaccount";
- symlink $0, "blockaccount";
- symlink $0, "checkaccount";
- symlink $0, "createaccount";
- symlink $0, "delaccount";
- symlink $0, "emailaccount";
- symlink $0, "getcount";
- symlink $0, "gmaccount";
- symlink $0, "idaccount";
- symlink $0, "infoaccount";
- symlink $0, "kami";
- symlink $0, "kamib";
- symlink $0, "ladminlanguage";
- symlink $0, "listaccount";
- symlink $0, "listBanaccount";
- symlink $0, "listGMaccount";
- symlink $0, "listOKaccount";
- symlink $0, "memoaccount";
- symlink $0, "nameaccount";
- symlink $0, "passwdaccount";
- symlink $0, "reloadGM";
- symlink $0, "searchaccount";
- symlink $0, "sexaccount";
- symlink $0, "stateaccount";
- symlink $0, "timeaddaccount";
- symlink $0, "timesetaccount";
- symlink $0, "unbanaccount";
- symlink $0, "unblockaccount";
- symlink $0, "whoaccount";
- if ($defaultlanguage eq "F") {
- print "Liens symbliques créés.\n";
- } else {
- print "Symbolic links created.\n";
- }
- exit(0);
-}
-
-# Connection to the login-server
-my($so,$er) = ();
-eval{
- $so = IO::Socket::INET->new(
- PeerAddr=> $loginserverip,
- PeerPort=> $loginserverport,
-# Proto => "tcp",
- Timeout => $connecttimeout) or $er = 1;
-};
-if ($er || $@) {
- if ($defaultlanguage eq "F") {
- print "\nImpossible de se connecter au serveur de login [${loginserverip}:$loginserverport] !\n";
- } else {
- print "\nImpossible to have a connection with the login-server [${loginserverip}:$loginserverport] !\n";
- }
- print "$!\n"; # Displaying of the error
- exit(2);
-}
-
-# Sending the administration password
-if ($passenc == 0) {
- print $so pack("v2a24",0x7918,0,$loginserveradminpassword);
- $so->flush();
-} else {
- print $so pack("v",0x791a);
- $so->flush();
- my($buf) = readso(4);
- if (unpack("v",$buf) != 0x01dc) {
- if ($defaultlanguage eq "F") {
- print "Erreur au login (échec de la création de la clef md5).\n";
- } else {
- print "Error at login (failure of the md5 key creation).\n";
- }
- }
- $buf = readso(unpack("x2v",$buf)-4);
- my($md5bin) = md5(($passenc == 1) ? $buf.$loginserveradminpassword : $loginserveradminpassword.$buf);
- print $so pack("v2a16",0x7918,$passenc,$md5bin);
- $so->flush();
-}
-
-# Waiting of the server reply
-my($buf) = readso(3);
-
-if (unpack("v",$buf) != 0x7919 || unpack("x2c",$buf) != 0) {
- if ($defaultlanguage eq "F") {
- print "Erreur de login:\n";
- print " - mot de passe incorrect,\n";
- print " - système d'administration non activé, ou\n";
- print " - IP non autorisée.\n";
- } else {
- print "Error at login:\n";
- print " - incorrect password,\n";
- print " - administration system not activated, or\n";
- print " - unauthorised IP.\n";
- }
- quit();
- exit(4);
-}
-
-if ($defaultlanguage eq "F") {
- print "Connexion établie.\n";
-} else {
- print "Established connection.\n";
-}
-
-#-------------------------------------------------------------------------
-# Here are checked the command lines with arguments and symbolic links (no prompt)
-
-if ($0 =~ /addaccount$/ ||
- (($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV), 1))) {
- my($r) = addaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /banaccount$/ || $0 =~ /banishaccount$/ ||
- (($ARGV[0] eq "-b" || $ARGV[0] eq "--ban" || $ARGV[0] eq "--banish") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[1], $ARGV[2], $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /banaddaccount$/ ||
- (($ARGV[0] eq "-ba" || $ARGV[0] eq "--banadd") && ((shift @ARGV), 1))) {
- my($r) = banaddaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /bansetaccount$/ ||
- (($ARGV[0] eq "-bs" || $ARGV[0] eq "--banset") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /blockaccount$/ ||
- (($ARGV[0] eq "-bl" || $ARGV[0] eq "--block") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], 5, "");
- quit();
- exit($r);
-} elsif ($0 =~ /checkaccount$/ ||
- (($ARGV[0] eq "-check" || $ARGV[0] eq "--check") && ((shift @ARGV), 1))) {
- my($r) = checkaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /createaccount$/ ||
- (($ARGV[0] eq "-c" || $ARGV[0] eq "--create") && ((shift @ARGV), 1))) {
- my($r) = createaccount($ARGV[0], $ARGV[1], $ARGV[2], $ARGV[3]);
- quit();
- exit($r);
-} elsif ($0 =~ /delaccount$/ ||
- (($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV), 1))) {
- my($r) = delaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /emailaccount$/ ||
- (($ARGV[0] eq "-e" || $ARGV[0] eq "--email") && ((shift @ARGV), 1))) {
- my($r) = changeemail($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /getcount$/ ||
- (($ARGV[0] eq "-g" || $ARGV[0] eq "--getcount") && ((shift @ARGV), 1))) {
- my($r) = getlogincount();
- quit();
- exit($r);
-} elsif ($0 =~ /gmaccount$/ ||
- (($ARGV[0] eq "-gm" || $ARGV[0] eq "--gm") && ((shift @ARGV), 1))) {
- my($r) = changegmlevel($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /id$/ ||
- (($ARGV[0] eq "-i" || $ARGV[0] eq "--id") && ((shift @ARGV), 1))) {
- my($r) = idaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /infoaccount$/ ||
- (($ARGV[0] eq "-info" || $ARGV[0] eq "--info") && ((shift @ARGV), 1))) {
- my($r) = infoaccount($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /kami$/ ||
- (($ARGV[0] eq "-kami" || $ARGV[0] eq "--kami") && ((shift @ARGV), 1))) {
- my($r) = sendbroadcast(0, $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /kamib$/ ||
- (($ARGV[0] eq "-kamib" || $ARGV[0] eq "--kamib") && ((shift @ARGV), 1))) {
- my($r) = sendbroadcast(0x10, $ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /ladminlanguage$/ ||
- (($ARGV[0] eq "-lang" || $ARGV[0] eq "--language") && ((shift @ARGV), 1))) {
- my($r) = changelanguage($ARGV[0]);
- quit();
- exit($r);
-} elsif ($0 =~ /listaccount$/ ||
- (($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 0); # 0: to list all
- quit();
- exit($r);
-} elsif ($0 =~ /listBanaccount$/ ||
- (($ARGV[0] eq "-lBan" || $ARGV[0] eq "--listBan") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 3); # 3: to list only accounts with state or banished
- quit();
- exit($r);
-} elsif ($0 =~ /listGMaccount$/ ||
- (($ARGV[0] eq "-lGM" || $ARGV[0] eq "--listGM") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 1); # 1: to list only GM
- quit();
- exit($r);
-} elsif ($0 =~ /listOKaccount$/ ||
- (($ARGV[0] eq "-lOK" || $ARGV[0] eq "--listOK") && ((shift @ARGV), 1))) {
- my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 4); # 4: to list only accounts without state and not banished
- quit();
- exit($r);
-} elsif ($0 =~ /loginserverversion$/ ||
- (($ARGV[0] eq "-v" || $ARGV[0] eq "--version") && ((shift @ARGV), 1))) {
- my($r) = checkloginversion();
- quit();
- exit($r);
-} elsif ($0 =~ /memoaccount$/ ||
- (($ARGV[0] eq "-m" || $ARGV[0] eq "--memo") && ((shift @ARGV), 1))) {
- my($r) = changememo($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /nameaccount$/ ||
- (($ARGV[0] eq "-n" || $ARGV[0] eq "--name") && ((shift @ARGV), 1))) {
- my($r) = nameaccount(int($ARGV[0]));
- quit();
- exit($r);
-} elsif ($0 =~ /passwdaccount$/ ||
- (($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV), 1))) {
- my($r) = changepasswd($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /reloadGM$/ ||
- (($ARGV[0] eq "-r" || $ARGV[0] eq "--reloadGM") && ((shift @ARGV), 1))) {
- my($r) = reloadGM();
- quit();
- exit($r);
-} elsif ($0 =~ /searchaccount$/ ||
- (($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV), 1))) {
- my($r) = searchaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /sexaccount$/ ||
- (($ARGV[0] eq "-sex" || $ARGV[0] eq "--sex") && ((shift @ARGV), 1))) {
- my($r) = changesex($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /stateaccount$/ ||
- (($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /timeaddaccount$/ ||
- (($ARGV[0] eq "-ta" || $ARGV[0] eq "--timeadd") && ((shift @ARGV), 1))) {
- my($r) = timeaddaccount($ARGV[0], $ARGV[1]);
- quit();
- exit($r);
-} elsif ($0 =~ /timesetaccount$/ ||
- (($ARGV[0] eq "-ts" || $ARGV[0] eq "--timeset") && ((shift @ARGV), 1))) {
- my($r) = timesetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
- quit();
- exit($r);
-} elsif ($0 =~ /unbanaccount$/ || $0 =~ /unbanishaccount$/ ||
- (($ARGV[0] eq "-uba" || $ARGV[0] eq "--unban" || $ARGV[0] eq "--unbanish") && ((shift @ARGV), 1))) {
- my($r) = bansetaccount($ARGV[0], 0, "");
- quit();
- exit($r);
-} elsif ($0 =~ /unblockaccount$/ ||
- (($ARGV[0] eq "-ubl" || $ARGV[0] eq "--unblock") && ((shift @ARGV), 1))) {
- my($r) = changestate($ARGV[0], 0, "");
- quit();
- exit($r);
-} elsif ($0 =~ /whoaccount$/ ||
- (($ARGV[0] eq "-w" || $ARGV[0] eq "--who") && ((shift @ARGV), 1))) {
- my($r) = whoaccount($ARGV[0]);
- quit();
- exit($r);
-}
-
-#-------------------------------------------------------------------------
-if ($defaultlanguage eq "F") {
- print "Lecture de la version du serveur de login...\n";
-} else {
- print "Reading of the version of the login-server...\n";
-}
-checkloginversion();
-
-# Set the prompt line
-my($term) = new Term::ReadLine "ladmin";
-
-# Here begin the infinite loop to read prompts
-while(1) {
- # Displaying of the prompt
- print "\n";
- if ($defaultlanguage eq "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";
- }
- my($cmd) = $term->readline("ladmin> ");
- # split and recovery of the input
- chomp $cmd; # remove cariage return
- $cmd =~ s/\x1b\[\d*\w//g; # remove (esc)[(number)(1alpha) = screen control sequence
- $cmd =~ s/[\x00-\x1f]//g; # remove control char
- my($command, $parameters) = split /\s+/,$cmd,2; # extract command and parameters
- $command = lc($command); # command in lowercase
- my(@paramlist) = split /\s+/,$parameters; # get list of parameters
-
- if ($command eq "?" || $command eq "") {
- $command = "aide" if ($defaultlanguage eq "F");
- $command = "help" if ($defaultlanguage ne "F");
- }
-
- # Analyse of the command
- eval {
-# help
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- displayhelp("aide", $paramlist[0]);
- } elsif ("help" =~ /^\Q$command/) {
- displayhelp("help", $paramlist[0]);
-
-# general commands
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(.*)/)) {
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(.*)/)) {
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
- }
-
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- if (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+"(.*)"/)) { # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+'(.*)'/)) { # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters,3; # yyyy/mm/dd hh:mm:ss <account_name>
- bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } else {
- @paramlist = split /\s+/,$parameters;
- banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- }
-
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters;
- bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- checkaccount($paramlist[0], ""); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- checkaccount($paramlist[0], ""); # <account_name> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
- }
-
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)\s+(.*)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)\s+(.*)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
- } else {
- @paramlist = split /\s+/,$parameters;
- createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
- }
-
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- delaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- delaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- delaccount($paramlist[0]); # <account_name>
- }
-
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- } else {
- @paramlist = split /\s+/,$parameters;
- changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
- }
-
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- getlogincount();
-
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
- } else {
- @paramlist = split /\s+/,$parameters;
- changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
- }
-
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- idaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- idaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- idaccount($paramlist[0]); # <account_name>
- }
-
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- infoaccount(int($paramlist[0])); # <account_id>
-
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- @paramlist = split /\s+/,$parameters,1;
- sendbroadcast(0, $paramlist[0]); # <type> <message>
-
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- @paramlist = split /\s+/,$parameters,1;
- sendbroadcast(0x10, $paramlist[0]); # <type> <message>
-
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- changelanguage($paramlist[0]); # <language>
-
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 0); # [start_id [end_id]] 0: to list all
-
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 3); # [start_id [end_id]] 3: to list only accounts with state or banished
-
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 1); # [start_id [end_id]] 1: to list only GM
-
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- listaccount(int($paramlist[0]), int($paramlist[1]), 4); # [start_id [end_id]] 4: to list only accounts without state and not banished
-
- } elsif ("memo" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- } else {
- @paramlist = split /\s+/,$parameters,2;
- changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
- }
-
- } elsif ("name" =~ /^\Q$command/) {
- nameaccount(int($paramlist[0])); # <account_id>
-
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changepasswd($paramlist[0], ""); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changepasswd($paramlist[0], ""); # <account_name> <new_password>
- } else {
- @paramlist = split /\s+/,$parameters,2;
- changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
- }
-
- } elsif ("reloadgm" =~ /^\Q$command/) {
- reloadGM();
-
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- if (@paramlist = ($parameters =~ m/^(-{1,2}[re]\S*)\s+(.*)/)) {
- searchaccount($paramlist[0], $paramlist[1]); # -r/-e/--expr/--regex <expression> | <expression>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- searchaccount($paramlist[0], ""); # -r/-e/--expr/--regex <expression> | <expression>
- }
-
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- } else {
- @paramlist = split /\s+/,$parameters;
- changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
- }
-
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)\s+(.*)/)) {
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)/)) {
- changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)\s+(.*)/)) {
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)/)) {
- changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,3;
- changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- } else {
- @paramlist = split /\s+/,$parameters;
- timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
- }
-
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
- timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters;
- timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- } else {
- @paramlist = split /\s+/,$parameters,1;
- bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
- }
-
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
- }
-
- } elsif ("version" =~ /^\Q$command/) {
- checkloginversion();
-
- } elsif ("who" =~ /^\Q$command/) {
- if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
- whoaccount($paramlist[0]); # <account_name>
- } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
- whoaccount($paramlist[0]); # <account_name>
- } else {
- @paramlist = split /\s+/,$parameters,1;
- whoaccount($paramlist[0]); # <account_name>
- }
-
-# quit
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?
- last;
-
-# unknown command
- } elsif ($command) {
- if ($defaultlanguage eq "F") {
- print "Commande inconnue [".$command."]\n";
- } else {
- print "Unknown command [".$command."]\n";
- }
- }
-# $term->addhistory($cmd) if $command;
- };
- if ($@) {
- if ($defaultlanguage eq "F") {
- print "Erreur [".$command."]\n$@";
- } else {
- print "Error [".$command."]\n$@";
- }
- }
-};
-
-# End of the software
-quit();
-
-if ($defaultlanguage eq "F") {
- print "Au revoir.\n";
-} else {
- print "Bye.\n";
-}
-exit(0);
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the version of the login-server
-sub checkloginversion() {
- print $so pack("v",30000); # 0x7530
- $so->flush();
- $buf = readso(10);
- # Analyse du Packet
- my($ret, $maver, $miver, $rev, $dev, $mod, $type, $mdver) = unpack("vc6v", $buf);
- if ($ret != 30001) { #0x7531
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(6);
- }
-
- print " Login-Server [$loginserverip:$loginserverport]\n";
- printf " eAthena version %s-%d.%d", ("stable", "dev")[$dev], $maver, $miver;
- printf " revision %d", $rev if $rev;
- printf "%s%d.\n", ("", "-mod")[$mod], $mdver;
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the help
-sub displayhelp() {
- my($help, $receivedcommand) = @_;
-
- my($command) = lc($receivedcommand); # command in lowercase
-
- if ($command eq "") {
- $command = "not a command"; # any value that is not a command
- }
-
- if ($command eq "?") {
- $command = "aide" if ($defaultlanguage eq "F");
- $command = "help" if ($defaultlanguage ne "F");
- }
-
- if ($help eq "aide") {
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- 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";
- } elsif ("help" =~ /^\Q$command/) {
- 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";
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- 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";
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>\n";
- printf " Change la date de fin de bannissement d'un compte.\n";
- printf " La différence avec banset est la position du nom du compte.\n";
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- 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";
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- 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: 23:59:59\n";
- printf "banset <nomcompte> 0\n";
- printf " Débanni un compte (0 = de-banni).\n";
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- 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";
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- 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";
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- 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";
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- printf "del <nomcompte>\n";
- printf " Supprime un compte.\n";
- printf " La commande demande confirmation. Après confirmation, le compte est détruit.\n";
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- printf "email <nomcompte> <email>\n";
- printf " Modifie l'e-mail d'un compte.\n";
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "getcount\n";
- printf " Donne le nombre de joueurs en ligne par serveur de char.\n";
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- 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";
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "id <nomcompte>\n";
- printf " Donne l'id d'un compte.\n";
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "info <idcompte>\n";
- printf " Affiche les informations sur un compte.\n";
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- printf "kami <message>\n";
- printf " Envoi un message général sur tous les serveurs de map (en jaune).\n";
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- printf "kamib <message>\n";
- printf " Envoi un message général sur tous les serveurs de map (en bleu).\n";
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf("language <langue>\n");
- printf(" Change la langue d'affichage.\n");
- printf(" Langues possibles: 'Français' ou 'English'.\n");
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- 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";
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- printf "listBan/lsBan [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes GM avec un statut ou bannis.\n";
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- printf "listGM/lsGM [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes GM.\n";
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- printf "listOK/lsOK [Premier_id [Dernier_id]]\n";
- printf " Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n";
- } elsif ("memo" =~ /^\Q$command/) {
- 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";
- } elsif ("name" =~ /^\Q$command/) {
- printf "name <idcompte>\n";
- printf " Donne le nom d'un compte.\n";
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- 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";
- } elsif ("reloadgm" =~ /^\Q$command/) {
- printf "reloadGM\n";
- printf " Reload GM configuration file\n";
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- 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";
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "sex <nomcompte> <sexe>\n";
- printf " Modifie le sexe d'un compte.\n";
- printf " <exemple> sex testname Male\n";
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- 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";
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- 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";
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- 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: 23:59:59\n";
- printf "timeset <nomcompte> 0\n";
- printf " Donne une limite de validité illimitée (0 = illimitée).\n";
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- 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";
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- 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";
- } elsif ("version" =~ /^\Q$command/) {
- printf "version\n";
- printf " Affiche la version du login-serveur.\n";
- } elsif ("who" =~ /^\Q$command/) {
- printf "who <nomcompte>\n";
- printf " Affiche les informations sur un compte.\n";
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
- printf "quit/end/exit\n";
- printf " Fin du programme d'administration.\n";
- } else {
- if ($receivedcommand ne "") {
- printf "Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", $receivedcommand;
- }
- print << "ENDOFAIDE";
- aide/help/? -- Affiche cet aide
- aide/help/? [commande] -- Affiche l'aide de la commande
- add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)
- ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>-- Change la date finale de banismnt
- banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
- exemple: ba moncompte +1m-2mn1s-2y date finale de banissement
- banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt
- banset/bs <nomcompte> 0 -- Dé-banis un compte.
- block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)
- check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte
- create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)
- del <nomcompte> -- Supprime un compte
- email <nomcompte> <email> -- Modifie l'e-mail d'un compte
- getcount -- Donne le nb de joueurs en ligne
- gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte
- id <nomcompte> -- Donne l'id d'un compte
- info <idcompte> -- Affiche les infos sur un compte
- kami <message> -- Envoi un message général (en jaune)
- kamib <message> -- Envoi un message général (en bleu)
- language <langue> -- Change la langue d'affichage.
- list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
- listBan/lsBan [Premier_id [Dernier_id] ]-- Affiche une liste de comptes
- avec un statut ou bannis
- listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM
- listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
- sans status et non bannis
- memo <nomcompte> <memo> -- Modifie le memo d'un compte
- name <idcompte> -- Donne le nom d'un compte
- passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte
- quit/end/exit -- Fin du programme d'administation
- reloadGM -- Recharger le fichier de config des GM
- search <expression> -- Cherche des comptes
- search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX
- sex <nomcompte> <sexe> -- Modifie le sexe d'un compte
- state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte
- timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
- exemple: ta moncompte +1m-2mn1s-2y limite de validité
- timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité
- timeset/ts <nomcompte> 0 -- limite de validité = illimitée
- unban/unbanish <nom compte> -- Ote le banissement d'un compte
- unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)
- version -- Donne la version du login-serveur
- who <nomcompte> -- Affiche les infos sur un compte
-ENDOFAIDE
- printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
- }
- } else {
- if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- 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";
- } elsif ("help" =~ /^\Q$command/) {
- 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";
- } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
- 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";
- } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
- 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 " The difference with banset is the position of the account name.\n";
- } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- 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";
- } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
- 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: 23:59:59\n";
- printf "banset <account_name> 0\n";
- printf " Set a non-banished account (0 = unbanished).\n";
- } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
- printf "block <account name>\n";
- printf " Set state 5 (You have been blocked by the GM Team) to an account.\n";
- printf " Same command of state <account_name> 5.\n";
- } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- 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";
- } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
- 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";
- } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
- printf "del <account_name>\n";
- printf " Remove an account.\n";
- printf " This order requires confirmation. After confirmation, the account is deleted.\n";
- } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
- printf "email <account_name> <email>\n";
- printf " Modify the e-mail of an account.\n";
- } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- printf "getcount\n";
- printf " Give the number of players online on all char-servers.\n";
- } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
- 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";
- } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "id <account_name>\n";
- printf " Give the id of an account.\n";
- } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
- printf "info <account_id>\n";
- printf " Display complete information of an account.\n";
- } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
- printf "kami <message>\n";
- printf " Sends a broadcast message on all map-server (in yellow).\n";
- } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
- printf "kamib <message>\n";
- printf " Sends a broadcast message on all map-server (in blue).\n";
- } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- printf("language <language>\n");
- printf(" Change the language of displaying.\n");
- printf(" Possible languages: Français or English.\n");
- } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
- 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";
- } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
- printf "listBan/lsBan [start_id [end_id]]\n";
- printf " Like list/ls, but only for accounts with state or banished.\n";
- } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
- printf "listGM/lsGM [start_id [end_id]]\n";
- printf " Like list/ls, but only for GM accounts.\n";
- } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
- printf "listOK/lsOK [start_id [end_id]]\n";
- printf " Like list/ls, but only for accounts without state and not banished.\n";
- } elsif ("memo" =~ /^\Q$command/) {
- 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";
- } elsif ("name" =~ /^\Q$command/) {
- printf "name <account_id>\n";
- printf " Give the name of an account.\n";
- } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
- 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";
- } elsif ("reloadgm" =~ /^\Q$command/) {
- printf "reloadGM\n";
- printf " Reload GM configuration file\n";
- } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- 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";
- } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
- $command ne "se") { # check 2 letters command: 'search' or 'sex'?
- printf "sex <account_name> <sex>\n";
- printf " Modify the sex of an account.\n";
- printf " <example> sex testname Male\n";
- } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
- 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";
- } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- 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";
- } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
- printf "timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- printf " Changes the validity limit of an account.\n";
- printf " Default time: 23:59:59\n";
- printf "timeset <account_name> 0\n";
- printf " Gives an unlimited validity limit (0 = unlimited).\n";
- } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
- printf "unban/unbanish <account name>\n";
- printf " Remove the banishment of an account.\n";
- printf " This command works like banset <account_name> 0.\n";
- } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
- 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";
- } elsif ("version" =~ /^\Q$command/) {
- printf "version\n";
- printf " Display the version of the login-server.\n";
- } elsif ("who" =~ /^\Q$command/) {
- printf "who <account_name>\n";
- printf " Displays complete information of an account.\n";
- } elsif ("quit" =~ /^\Q$command/ ||
- (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
- printf "quit/end/exit\n";
- printf " End of the program of administration.\n";
- } else {
- if ($receivedcommand ne "") {
- printf "Unknown command [%s] for help. Displaying of all commands.\n", $receivedcommand;
- }
- print << "ENDOFHELP";
- aide/help/? -- Display this help
- aide/help/? [command] -- Display the help of the command
- add <account_name> <sex> <password> -- Create an account with default email
- ban/banish yyyy/mm/dd hh:mm:ss <account_name> -- Change final date of a ban
- banadd/ba <account_name> <modifier> -- Add or substract time from the final
- example: ba apple +1m-2mn1s-2y date of a banishment of an account
- banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban
- banset/bs <account_name> 0 -- Un-banish an account
- block <account name> -- Set state 5 (blocked by the GM Team) to an account
- check <account_name> <password> -- Check the validity of a password
- create <account_name> <sex> <email> <passwrd> -- Create an account with email
- del <account_name> -- Remove an account
- email <account_name> <email> -- Modify an email of an account
- getcount -- Give the number of players online
- gm <account_name> [GM_level] -- Modify the GM level of an account
- id <account_name> -- Give the id of an account
- info <account_id> -- Display all information of an account
- kami <message> -- Sends a broadcast message (in yellow)
- kamib <message> -- Sends a broadcast message (in blue)
- language <language> -- Change the language of displaying.
- list/ls [First_id [Last_id]] -- Display a list of accounts
- listBan/lsBan [First_id [Last_id]] -- Display a list of accounts
- with state or banished
- listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts
- listOK/lsOK [First_id [Last_id]] -- Display a list of accounts
- without state and not banished
- memo <account_name> <memo> -- Modify the memo of an account
- name <account_id> -- Give the name of an account
- passwd <account_name> <new_password> -- Change the password of an account
- quit/end/exit -- End of the program of administation
- reloadGM -- Reload GM configuration file
- search <expression> -- Seek accounts
- search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression
- sex <nomcompte> <sexe> -- Modify the sex of an account
- state <account_name> <new_state> <error_message_#7> -- Change the state
- timeadd/ta <account_name> <modifier> -- Add or substract time from the
- example: ta apple +1m-2mn1s-2y validity limit of an account
- timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit
- timeset/ts <account_name> 0 -- Give a unlimited validity limit
- unban/unbanish <account name> -- Remove the banishment of an account
- unblock <account name> -- Set state 0 (Account ok) to an account
- version -- Gives the version of the login-server
- who <account_name> -- Display all information of an account
-ENDOFHELP
- printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
- }
- }
-
- return 0;
-}
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the accounts list
-sub listaccount() {
- my($st, $ed, $listflag) = @_;
- my($i);
- my($n) = (0);
- # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if ($defaultlanguage eq "F") {
- print " id_compte GM nom_utilisateur sexe count statut\n";
- } else {
- print "account_id GM user_name sex count state\n";
- }
- print "-------------------------------------------------------------------------------\n";
- while(1) {
- print $so pack("vV2", 0x7920, $st, $ed);
- $so->flush();
- $buf = readso(4);
- if (unpack("v", $buf) != 0x7921) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(10);
- }
- my($len) = unpack("x2v", $buf);
- last if ($len <= 4);
- for($i = 4; $i < $len; $i += 38) {
- my(@dat) = unpack("VCa24cVV", readso(38));
- $st = $dat[0] + 1;
- if ($listflag == 0 ||
- ($listflag == 1 && $dat[1] > 0) || # check GM flag
- ($listflag == 3 && $dat[5] != 0) || # check with state or banished
- ($listflag == 4 && $dat[5] == 0)) { # check without state and not banished
- printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
- ($dat[1] == 0 ? " " : $dat[1]),
- $dat[2],
- ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
- $dat[4],
- (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "Blocked by the GM Team", # You have been blocked by the GM Team
- "Your EXE file is too old", # Your Game's EXE file is not the latest version
- "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
- "Server is over populated", # Server is jammed due to over populated
- "No MSG",
- "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
- $n++;
- }
- }
- }
- if ($defaultlanguage eq "F") {
- if ($n == 0) {
- print "Aucun compte trouvé.\n";
- } elsif ($n == 1) {
- print "1 compte trouvé.\n";
- } else {
- print "$n comptes trouvés.\n";
- }
- } else {
- if ($n == 0) {
- print "No account found.\n";
- } elsif ($n == 1) {
- print "1 account found.\n";
- } else {
- print "$n accounts found.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with the default e-mail
-sub addaccount() {
- my($userid, $sex, $passwd) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> add nomtest Male motdepassetest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> add testname Male testpass\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- if ($passwd eq "") {
- return 108 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 104;
- }
- print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, "");
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7931) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 106;
- }
- $buf = readso(28);
- if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
- } else {
- print "Account [$userid] creation failed. Same account already exists.\n";
- }
- return 107;
- } else {
- if ($defaultlanguage eq "F") {
- printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
- } else {
- printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: add an account with an e-mail
-sub createaccount() {
- my($userid, $sex, $email, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> create nomtest Male mon\@email.com motdepassetest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> create testname Male my\@mail.com testpass\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- if (length($email) < 3) {
- if ($defaultlanguage eq "F") {
- print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Email is too short [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if (length($email) > 39) {
- if ($defaultlanguage eq "F") {
- print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
- } else {
- print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
- }
- return 109;
- }
- if (verify_email($email) == 0) {
- if ($defaultlanguage eq "F") {
- print "Email incorrecte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Invalid email [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if ($passwd eq "") {
- return 108 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 104;
- }
- print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, $email);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7931) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 106;
- }
- $buf = readso(28);
- if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
- } else {
- print "Account [$userid] creation failed. Same account already exists.\n";
- }
- return 107;
- } else {
- if ($defaultlanguage eq "F") {
- printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
- } else {
- printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: deletion of an account
-sub delaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> del nomtestasupprimer\n";
- } else {
- print "Please input an account name.\n";
- print "<example> del testnametodelete\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($defaultlanguage eq "F") {
- print "** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) ";
- } else {
- print "** Are you really sure to DELETE account [$userid]? (y/n) ";
- }
- if (lc(substr(<STDIN>, 0, 1)) !~ /[oy]/) {
- if ($defaultlanguage eq "F") {
- print "Suppression annulée\n.";
- } else {
- print "Deletion canceled\n";
- }
- return 121;
- }
- print $so pack("va24", 0x7932, $userid);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7933) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la suppression du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] deletion failed. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Compte [$name][id: $id2] SUPPRIME avec succès.\n";
- } else {
- print "Account [$name][id: $id2] is successfully DELETED.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of a password
-sub changepasswd() {
- my($userid, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> passwd nomtest nouveaumotdepasse\n";
- } else {
- print "Please input an account name.\n";
- print "<example> passwd testname newpassword\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($passwd eq "") {
- return 134 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 131;
- }
- print $so pack("va24a24", 0x7934, $userid,$passwd);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7935) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 132;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la modification du mot de passe du compte [$userid].\n";
- print "Le compte [$userid] n'existe pas.\n";
- } else {
- print "Account [$userid] password changing failed.\n";
- print "Account [$userid] doesn't exist.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Modification du mot de passe du compte [$name][id: $id2] réussie.\n";
- } else {
- print "Account [$name][id: $id2] password successfully changed.\n";
- }
- }
- return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modification of an account e-mail
-sub changeemail() {
- my($userid, $email) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> email testname nouveauemail\n";
- } else {
- print "Please input an account name.\n";
- print "<example> email testname newemail\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if (length($email) < 3) {
- if ($defaultlanguage eq "F") {
- print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Email is too short [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- if (length($email) > 39) {
- if ($defaultlanguage eq "F") {
- print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
- } else {
- print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
- }
- return 109;
- }
- if (verify_email($email) == 0) {
- if ($defaultlanguage eq "F") {
- print "Email incorrect [$email]. Entrez une e-mail valide svp.\n";
- } else {
- print "Invalid email [$email]. Please input a valid e-mail.\n";
- }
- return 109;
- }
- print $so pack("va24a40", 0x7940, $userid, $email);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7941) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 162;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec de la modification de l'e-mail du compte [$userid].\n";
- print "Le compte [$userid] n'existe pas.\n";
- } else {
- print "Account [$userid] e-mail changing failed.\n";
- print "Account [$userid] doesn't exist.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Modification de l'e-mail du compte [$name][id: $id2] réussie.\n";
- } else {
- print "Account [$name][id: $id2] e-mail successfully changed.\n";
- }
- }
- return 160;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: search of accounts
-sub searchaccount() {
- my($p1, $p2) = @_;
- my($exp) = ("");
- if ($p1 eq "-e" || $p1 eq "-r" || $p1 eq "--regex" || $p1 eq "--expr") {
- if ($p2 eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez une expression régulière ou utilisez 'ls' pour avoir tous les comptes.\n";
- } else {
- print "Input a regular expression or use 'ls' to obtain all accounts.\n";
- }
- return 141;
- }
- $exp = $p2;
- } else {
- if ($p1 eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez une chaîne ou utilisez 'ls' pour avoir tous les comptes.\n";
- } else {
- print "Input a string or use 'ls' to obtain all accounts.\n";
- }
- return 141;
- }
- my($c) = 0;
- $exp = lc($p1);
- $exp =~ s/([\@])/\\$1/g;
- $c += $exp =~ s/([\-\[\]])/\\$1/g;
- $c += $exp =~ s/([\*\?])/.$1/g;
- $c += $exp =~ s/\\\[(.)\\\-(.)\\\]/[$1-$2]/g;
- $exp = "^$exp\$" if $c;
- }
- if (eval{ "" =~ /$exp/; }, $@) {
- if ($defaultlanguage eq "F") {
- print "Expression régulière non reconnue.\n";
- } else {
- print "Regular-Expression compiling failed.\n";
- }
- return 141;
- }
- my($i);
- my($n, $st) = (0, 0);
- # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
- if ($defaultlanguage eq "F") {
- print " id_compte GM nom_utilisateur sexe count statut\n";
- } else {
- print "account_id GM user_name sex count state\n";
- }
- print "-------------------------------------------------------------------------------\n";
- while(1) {
- print $so pack("vV2", 0x7920, $st, 0);
- $so->flush();
- $buf = readso(4);
- if (unpack("v", $buf) != 0x7921) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(10);
- }
- my($len) = unpack("x2v", $buf);
- last if ($len <= 4);
- for($i = 4; $i < $len; $i += 38) {
- my(@dat) = unpack("VCa24cVV", readso(38));
- $st = $dat[0] + 1;
- next if (lc($dat[2]) !~ /$exp/);
- printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
- ($dat[1] == 0 ? " " : $dat[1]),
- $dat[2],
- ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
- $dat[4],
- (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "Blocked by the GM Team", # You have been blocked by the GM Team
- "Your EXE file is too old", # Your Game's EXE file is not the latest version
- "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
- "Server is over populated", # Server is jammed due to over populated
- "No MSG",
- "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
- $n++;
- }
- }
- if ($defaultlanguage eq "F") {
- if ($n == 0) {
- print "Aucun compte trouvé.\n";
- } elsif ($n == 1) {
- print "1 compte trouvé.\n";
- } else {
- print "$n comptes trouvés.\n";
- }
- } else {
- if ($n == 0) {
- print "No account found.\n";
- } elsif ($n == 1) {
- print "1 account found.\n";
- } else {
- print "$n accounts found.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the sex of an account
-sub changesex() {
- my($userid, $sex) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> sex nomtest Male\n";
- } else {
- print "Please input an account name.\n";
- print "<example> sex testname Male\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $sex = uc(substr($sex, 0, 1));
- if ($sex !~ /^[MF]$/) {
- if ($defaultlanguage eq "F") {
- print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
- } else {
- print "Illegal gender [$sex]. Please input M or F.\n";
- }
- return 103;
- }
- print $so pack("va24a1", 0x793c, $userid, $sex);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793d) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du sexe du compte [$userid].\n";
- print "Le compte n'existe pas ou le sexe est déjà celui demandé.\n";
- } else {
- print "Account [$userid] sex changing failed.\n";
- print "Account doesn't exist or the sex is already the good sex.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Sexe du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] sex successfully changed.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: modify the GM level of an account
-sub changegmlevel() {
- my($userid, $gm_level) = @_;
- if ($userid eq "" || !defined($userid)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> gm nomtest 80\n";
- } else {
- print "Please input an account name.\n";
- print "<example> gm testname 80\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
-# if ($defaultlanguage eq "F") {
-# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
-# } else {
-# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
-# }
-# return 101;
-# }
- $gm_level = int($gm_level);
- if ($gm_level < 0 || $gm_level > 99) {
- if ($defaultlanguage eq "F") {
- print "Niveau de GM incorrect [$gm_level]. Entrez une valeur de 0 à 99 svp.\n";
- } else {
- print "Illegal GM level [$gm_level]. Please input a value from 0 to 99.\n";
- }
- return 103;
- }
- print $so pack("va24C", 0x793e, $userid, $gm_level);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793f) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du niveau de GM du compte [$userid].\n";
- print "Le compte n'existe pas, le niveau de GM est déjà celui demandé,\n";
- print "ou il est impossible de modifier le fichier des comptes GM.\n";
- } else {
- print "Account [$userid] GM level changing failed.\n";
- print "Account doesn't exist, the GM level is already the good GM level,\n";
- print "or it's impossible to modify the GM accounts file.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Niveau de GM du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] GM level successfully changed.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a state
-sub changestate {
- my($userid, $s, $error_message) = @_;
- # Valid values: 0: ok, or value of the 0x006a packet + 1
- if ($s eq "" || (($s < 0 || $s > 9) && $s != 100)) {
- if ($defaultlanguage eq "F") {
- print "Entrez une des valeurs suivantes svp:\n";
- print " 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n";
- } else {
- print "Please input one of these values:\n";
- print " 0 = Account ok 6 = Your Game's EXE file is not the latest version\n";
- }
- print " 1 = Unregistered ID 7 = You are Prohibited to log in until %s\n";
- print " 2 = Incorrect Password 8 = Server is jammed due to over populated\n";
- print " 3 = This ID is expired 9 = No MSG\n";
- print " 4 = Rejected from Server 100 = This ID has been totally erased\n";
- print " 5 = You have been blocked by the GM Team\n";
- if ($defaultlanguage eq "F") {
- print "<exemples> state nomtest 5\n";
- print " state nomtest 7 fin de votre ban\n";
- print " block <nom du compte>\n";
- print " unblock <nom du compte>\n";
- } else {
- print "<examples> state testname 5\n";
- print " state testname 7 end of your ban\n";
- print " block <account name>\n";
- print " unblock <account name>\n";
- }
- return 151;
- }
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemples> state nomtest 5\n";
- print " state nomtest 7 fin de votre ban\n";
- print " block <nom du compte>\n";
- print " unblock <nom du compte>\n";
- } else {
- print "Please input an account name.\n";
- print "<examples> state testname 5\n";
- print " state testname 7 end of your ban\n";
- print " block <account name>\n";
- print " unblock <account name>\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($s != 7) {
- $error_message = "-";
- } else {
- if (length($error_message) < 1) {
- if ($defaultlanguage eq "F") {
- print "Message d'erreur trop court. Entrez un message de 1-19 caractères.\n";
- } else {
- print "Error message is too short. Please input a message of 1-19 bytes.\n";
- }
- return 102;
- }
- if (length($error_message) > 19) {
- if ($defaultlanguage eq "F") {
- print "Message d'erreur trop long. Entrez un message de 1-19 caractères.\n";
- } else {
- print "Error message is too long. Please input a message of 1-19 bytes.\n";
- }
- return 102;
- }
- }
- print $so pack("va24Va20", 0x7936, $userid, $s, $error_message);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7937) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Statut du compte [$dat[1]][id: $dat[0]] changé avec succès en [";
- } else {
- print "Account [$dat[1]][id: $dat[0]] state successfully changed in [";
- }
- print ((($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID has been totally erased")[$dat[2] == 100 ? 10 : $dat[2]]);
- print "].\n";
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du statut du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] state changing failed. Account doesn't exist.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Displaying of the number of online players
-sub getlogincount {
- # Request to the login-server
- print $so pack("v", 0x7938);
- $so->flush();
-
- $buf = readso(4);
- # Connection failed
- if (unpack("v", $buf) != 0x7939) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- exit(3);
- }
-
- # Get length of the received packet
- my($len) = unpack("x2v", $buf) - 4;
-
- # Read information of the servers
- if ($len < 1) {
- if ($defaultlanguage eq "F") {
- printf " Aucun serveur n'est connecté au login serveur.\n";
- } else {
- printf " No server is connected to the login-server.\n";
- }
- } else {
- my(@slist) = ();
- for(; $len > 0; $len -= 32) {
- my($name, $count) = unpack("x6 a20 V", readso(32));
- $name = substr($name, 0, index($name, "\0"));
- push @slist, [ $name, $count ];
- }
- # Displaying of result
- my($i);
- if ($defaultlanguage eq "F") {
- printf " Nombre de joueurs en ligne (serveur: nb):\n";
- } else {
- printf " Number of online players (server: number).\n";
- }
- foreach $i(@slist) {
- printf " %-20s : %5d\n", $i->[0], $i->[1];
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Modification of a memo field
-sub changememo {
- my($userid, $memo) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> memo nomtest nouveau memo\n";
- } else {
- print "Please input an account name.\n";
- print "<example> memo testname new memo\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if (length($memo) > 254) {
- if ($defaultlanguage eq "F") {
- print "Mémo trop long (".length($memo)." caractères).\n";
- print "Entrez un mémo de 254 caractères maximum svp.\n";
- } else {
- print "Memo is too long (".length($memo)." characters).\n";
- print "Please input a memo of 254 bytes at the maximum.\n";
- }
- return 102;
- }
- if (length($memo) == 0) {
- print $so pack("va24v", 0x7942, $userid, 0);
- } else {
- print $so pack("va24va".length($memo), 0x7942, $userid, length($memo), $memo);
- }
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7943) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement du mémo du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] memo changing failed. Account doesn't exist.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Mémo du compte [$name][id: $id2] changé avec succès.\n";
- } else {
- print "Account [$name][id: $id2] memo successfully changed.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account id
-sub idaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> id nomtest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> id testname\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- print $so pack("va24", 0x7944, $userid);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7945) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver l'id du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [$userid] id. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [$name] a pour id: $id2.\n";
- } else {
- print "The account [$name] have the id: $id2.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to obtain an account name
-sub nameaccount() {
- my($id) = @_;
- if ($id < 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un id ayant une valeur positive svp.\n";
- } else {
- print "Please input a positive value for the id.\n";
- }
- return 136;
- }
- print $so pack("vV", 0x7946, $id);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7947) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if (length($name) == 0 || $name eq "") {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [id: $id2] a pour nom: $name.\n";
- } else {
- print "The account [id: $id2] have the name: $name.\n";
- }
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set a validity limit of an account
-sub timesetaccount() {
- my($userid, $date, $time) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
- print " timeset <nom_du_compte> 0 (0 = illimité)\n";
- printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
- } else {
- print "Please input an account name.\n";
- print "<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- print " timeset <account_name> 0 (0 = unlimited)\n";
- printf " Default time [hh:mm:ss]: 23:59:59\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = split(/[.\-\/]/, $date);
- my($hour, $minute, $second) = split(/:/, $time);
- if ($time eq "") {
- $hour = 23;
- $minute = 59;
- $second = 59;
- }
- my($timestamp);
- if ($year eq "" ||
- ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
- if ($defaultlanguage eq "F") {
- print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- if ($year == 0) {
- $timestamp = 0;
- } else {
- if ($year < 70) {
- $year = $year + 100;
- }
- if ($year >= 1900) {
- $year = $year - 1900;
- }
- if ($month < 1 || $month > 12) {
- if ($defaultlanguage eq "F") {
- print "Entrez un mois correct svp (entre 1 et 12).\n";
- } else {
- print "Please give a correct value for the month (from 1 to 12).\n";
- }
- return 102;
- }
- $month = $month - 1;
- if ($day < 1 || $day > 31) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct svp (entre 1 et 31).\n";
- } else {
- print "Please give a correct value for the day (from 1 to 31).\n";
- }
- return 102;
- }
- if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
- ($month == 1 && $day > 29)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct en fonction du mois svp.\n";
- } else {
- print "Please give a correct value for a day of this month.\n";
- }
- return 102;
- }
- if ($hour < 0 || $hour > 23) {
- if ($defaultlanguage eq "F") {
- print "Entrez une heure correcte svp (entre 0 et 23).\n";
- } else {
- print "Please give a correct value for the hour (from 0 to 23).\n";
- }
- return 102;
- }
- if ($minute < 0 || $minute > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des minutes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the minutes (from 0 to 59).\n";
- }
- return 102;
- }
- if ($second < 0 || $second > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des secondes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the seconds (from 0 to 59).\n";
- }
- return 102;
- }
- $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
- if ($timestamp == undef) {
- if ($defaultlanguage eq "F") {
- print "Date incorrecte.\n";
- print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Invalid date.\n";
- print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- }
-
- print $so pack("va24V", 0x7948, $userid, $timestamp);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7949) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Validity Limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the validity limit of an account
-sub timeaddaccount() {
- my($userid, $modif) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please input an account name.\n";
- print " <example> timeadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = (0, 0 ,0);
- my($hour, $minute, $second) = (0, 0 ,0);
-
- $modif = lc($modif);
- while (length($modif) > 0) {
- my($value) = int($modif);
- if ($value == 0) {
- $modif = substr($modif, 1);
- } else {
- if (substr($modif, 0, 1) =~ /[\-\+]/) {
- $modif = substr($modif, 1);
- }
- while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
- $modif = substr($modif, 1);
- }
- if (index($modif, "s") == 0) {
- $second = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "mn") == 0) {
- $minute = $value;
- $modif = substr($modif, 2);
- } elsif (index($modif, "h") == 0) {
- $hour = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
- $day = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "m") == 0) {
- $month = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
- $year = $value;
- $modif = substr($modif, 1);
- } else {
- $modif = substr($modif, 1);
- }
- }
- }
-
- if ($defaultlanguage eq "F") {
- print " année: $year\n";
- print " mois: $month\n";
- print " jour: $day\n";
- print " heure: $hour\n";
- print " minute: $minute\n";
- print " seconde: $second\n";
- } else {
- print " year: $year\n";
- print " month: $month\n";
- print " day: $day\n";
- print " hour: $hour\n";
- print " minute: $minute\n";
- print " second: $second\n";
- }
-
- if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
- if ($defaultlanguage eq "F") {
- print "Vous devez entrer un ajustement avec cette commande, svp:\n";
- print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
- print " Element modifié:\n";
- print " a ou y: année\n";
- print " m: mois\n";
- print " j ou d: jour\n";
- print " h: heure\n";
- print " mn: minute\n";
- print " s: seconde\n";
- print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please give an adjustment with this command:\n";
- print " Adjustment value (-1, 1, +1, etc...)\n";
- print " Modified element:\n";
- print " a or y: year\n";
- print " m: month\n";
- print " j or d: day\n";
- print " h: hour\n";
- print " mn: minute\n";
- print " s: second\n";
- print " <example> timeadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 137;
- }
- if ($year > 127 || $year < -127) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
- } else {
- print "Please give a correct adjustment for the years (from -127 to 127).\n";
- }
- return 137;
- }
- if ($month > 255 || $month < -255) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
- } else {
- print "Please give a correct adjustment for the months (from -255 to 255).\n";
- }
- return 137;
- }
- if ($day > 32767 || $day < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($hour > 32767 || $hour < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($minute > 32767 || $minute < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($second > 32767 || $second < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
- }
- return 137;
- }
-
- print $so pack("va24vvvvvv", 0x7950, $userid, $year, $month, $day, $hour, $minute, $second);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7951) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] == -1 || $dat[0] == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
- }
- } elsif ($dat[2] == 0) {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] inchangée.\n";
- print "Le compte a une validité illimitée ou\n";
- print "la modification est impossible avec les ajustements demandés.\n";
- } else {
- print "Validity limit of the account [$dat[1]][id: $dat[0]] unchanged.\n";
- print "The account have an unlimited validity limit or\n";
- print "the changing is impossible with the proposed adjustments.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Validity limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Set the final date of a banishment of an account
-sub bansetaccount() {
- my($userid, $date, $time) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
- print " banset <nom_du_compte> 0 (0 = dé-bani)\n";
- print " ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n";
- print " unban/unbanish <nom du compte>\n";
- printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
- } else {
- print "Please input an account name.\n";
- print "<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
- print " banset <account_name> 0 (0 = un-banished)\n";
- print " ban/banish yyyy/mm/dd hh:mm:ss <account name>\n";
- print " unban/unbanish <account name>\n";
- printf " Default time [hh:mm:ss]: 23:59:59\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = split(/[.\-\/]/, $date);
- my($hour, $minute, $second) = split(/:/, $time);
- if ($time eq "") {
- $hour = 23;
- $minute = 59;
- $second = 59;
- }
- my($timestamp);
- if ($year eq "" ||
- ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
- if ($defaultlanguage eq "F") {
- print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- if ($year == 0) {
- $timestamp = 0;
- } else {
- if ($year < 70) {
- $year = $year + 100;
- }
- if ($year >= 1900) {
- $year = $year - 1900;
- }
- if ($month < 1 || $month > 12) {
- if ($defaultlanguage eq "F") {
- print "Entrez un mois correct svp (entre 1 et 12).\n";
- } else {
- print "Please give a correct value for the month (from 1 to 12).\n";
- }
- return 102;
- }
- $month = $month - 1;
- if ($day < 1 || $day > 31) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct svp (entre 1 et 31).\n";
- } else {
- print "Please give a correct value for the day (from 1 to 31).\n";
- }
- return 102;
- }
- if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
- ($month == 1 && $day > 29)) {
- if ($defaultlanguage eq "F") {
- print "Entrez un jour correct en fonction du mois svp.\n";
- } else {
- print "Please give a correct value for a day of this month.\n";
- }
- return 102;
- }
- if ($hour < 0 || $hour > 23) {
- if ($defaultlanguage eq "F") {
- print "Entrez une heure correcte svp (entre 0 et 23).\n";
- } else {
- print "Please give a correct value for the hour (from 0 to 23).\n";
- }
- return 102;
- }
- if ($minute < 0 || $minute > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des minutes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the minutes (from 0 to 59).\n";
- }
- return 102;
- }
- if ($second < 0 || $second > 59) {
- if ($defaultlanguage eq "F") {
- print "Entrez des secondes correctes svp (entre 0 et 59).\n";
- } else {
- print "Please give a correct value for the seconds (from 0 to 59).\n";
- }
- return 102;
- }
- $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
- if ($timestamp == undef) {
- if ($defaultlanguage eq "F") {
- print "Date incorrecte.\n";
- print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
- } else {
- print "Invalid date.\n";
- print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
- }
- return 102;
- }
- }
-
- print $so pack("va24V", 0x794a, $userid, $timestamp);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794b) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] != -1 && $dat[0] != 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- } else {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Add/substract time to the final date of a banishment of an account
-sub banaddaccount() {
- my($userid, $modif) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please input an account name.\n";
- print " <example> banadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- my($year, $month, $day) = (0, 0 ,0);
- my($hour, $minute, $second) = (0, 0 ,0);
-
- $modif = lc($modif);
- while (length($modif) > 0) {
- my($value) = int($modif);
- if ($value == 0) {
- $modif = substr($modif, 1);
- } else {
- if (substr($modif, 0, 1) =~ /[\-\+]/) {
- $modif = substr($modif, 1);
- }
- while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
- $modif = substr($modif, 1);
- }
- if (index($modif, "s") == 0) {
- $second = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "mn") == 0) {
- $minute = $value;
- $modif = substr($modif, 2);
- } elsif (index($modif, "h") == 0) {
- $hour = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
- $day = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "m") == 0) {
- $month = $value;
- $modif = substr($modif, 1);
- } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
- $year = $value;
- $modif = substr($modif, 1);
- } else {
- $modif = substr($modif, 1);
- }
- }
- }
-
- if ($defaultlanguage eq "F") {
- print " année: $year\n";
- print " mois: $month\n";
- print " jour: $day\n";
- print " heure: $hour\n";
- print " minute: $minute\n";
- print " seconde: $second\n";
- } else {
- print " year: $year\n";
- print " month: $month\n";
- print " day: $day\n";
- print " hour: $hour\n";
- print " minute: $minute\n";
- print " second: $second\n";
- }
-
- if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
- if ($defaultlanguage eq "F") {
- print "Vous devez entrer un ajustement avec cette commande, svp:\n";
- print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
- print " Element modifié:\n";
- print " a ou y: année\n";
- print " m: mois\n";
- print " j ou d: jour\n";
- print " h: heure\n";
- print " mn: minute\n";
- print " s: seconde\n";
- print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
- print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
- print " et 6 ans dans le même temps.\n";
- } else {
- print "Please give an adjustment with this command:\n";
- print " Adjustment value (-1, 1, +1, etc...)\n";
- print " Modified element:\n";
- print " a or y: year\n";
- print " m: month\n";
- print " j or d: day\n";
- print " h: hour\n";
- print " mn: minute\n";
- print " s: second\n";
- print " <example> banadd testname +1m-2mn1s-6y\n";
- print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
- print " and 6 years at the same time.\n";
- }
- return 137;
- }
- if ($year > 127 || $year < -127) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
- } else {
- print "Please give a correct adjustment for the years (from -127 to 127).\n";
- }
- return 137;
- }
- if ($month > 255 || $month < -255) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
- } else {
- print "Please give a correct adjustment for the months (from -255 to 255).\n";
- }
- return 137;
- }
- if ($day > 32767 || $day < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($hour > 32767 || $hour < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($minute > 32767 || $minute < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
- }
- return 137;
- }
- if ($second > 32767 || $second < -32767) {
- if ($defaultlanguage eq "F") {
- print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
- } else {
- print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
- }
- return 137;
- }
-
- print $so pack("va24vvvvvv", 0x794c, $userid, $year, $month, $day, $hour, $minute, $second);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794d) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(32);
- my(@dat) = unpack("Va24V", $buf);
- while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
- chop($dat[1]);
- };
- if ($dat[0] == -1 || $dat[0] == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
- ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
- } else {
- print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
- ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
- }
- # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its name)
-sub whoaccount() {
- my($userid) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> who nomtest\n";
- } else {
- print "Please input an account name.\n";
- print "<example> who testname\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
-
- print $so pack("va24", 0x7952, $userid);
- $so->flush();
-
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7953) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
- my($memo) = "";
- if ($memo_size > 0) {
- $memo = unpack("a".$memo_size, readso($memo_size));
- }
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
- chop($error_message);
- };
- while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
- chop($last_login);
- };
- while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
- chop($last_ip);
- };
- while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
- chop($email);
- };
- while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
- chop($memo);
- };
-
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le compte [$userid]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [$userid]. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [$userid] a les caractéristiques suivantes:\n";
- } else {
- print "The account [$userid] is set with:\n";
- }
- if ($GM_level == 0) {
- print " Id: $id2 (non-GM)\n";
- } else {
- if ($defaultlanguage eq "F") {
- print " Id: $id2 (GM niveau $GM_level)\n";
- } else {
- print " Id: $id2 (GM level $GM_level)\n";
- }
- }
- if ($defaultlanguage eq "F") {
- print " Nom: '$name'\n";
- print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
- } else {
- print " Name: '$name'\n";
- print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
- }
- print " E-mail: $email\n";
- if ($status == 7) {
- print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
- } else {
- print " Statut: $status [".(
- ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
- }
- if ($defaultlanguage eq "F") {
- print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
- print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Dernière connexion le: $last_login (ip: $last_ip)\n";
- print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
- } else {
- print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
- print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Last connection at: $last_login (ip: $last_ip)\n";
- print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
- }
- print " Memo: '$memo'\n";
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to displaying information about an account (by its id)
-sub infoaccount() {
- my($id) = @_;
- if ($id < 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un id ayant une valeur positive svp.\n";
- } else {
- print "Please input a positive value for the id.\n";
- }
- return 136;
- }
-
- print $so pack("vV", 0x7954, $id);
- $so->flush();
-
- $buf = readso(2);
- if (unpack("v", $buf) != 0x7953) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 122;
- }
- my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
- my($memo) = "";
- if ($memo_size > 0) {
- $memo = unpack("a".$memo_size, readso($memo_size));
- }
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
- chop($error_message);
- };
- while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
- chop($last_login);
- };
- while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
- chop($last_ip);
- };
- while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
- chop($email);
- };
- while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
- chop($memo);
- };
-
- if (length($name) == 0 || $name eq "") {
- if ($defaultlanguage eq "F") {
- print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
- } else {
- print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
- }
- return 123;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le compte [id: $id2] a les caractéristiques suivantes:\n";
- } else {
- print "The account [id: $id2] is set with:\n";
- }
- if ($GM_level == 0) {
- print " Id: $id2 (non-GM)\n";
- } else {
- if ($defaultlanguage eq "F") {
- print " Id: $id2 (GM niveau $GM_level)\n";
- } else {
- print " Id: $id2 (GM level $GM_level)\n";
- }
- }
- if ($defaultlanguage eq "F") {
- print " Nom: '$name'\n";
- print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
- } else {
- print " Name: '$name'\n";
- print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
- }
- print " E-mail: $email\n";
- if ($status == 7) {
- print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
- } else {
- print " Statut: $status [".(
- ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
- "Unregistered ID",
- "Incorrect Password",
- "This ID is expired",
- "Rejected from Server",
- "You have been blocked by the GM Team",
- "Your Game's EXE file is not the latest version",
- "You are Prohibited to log in until %s",
- "Server is jammed due to over populated",
- "No MSG",
- "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
- }
- if ($defaultlanguage eq "F") {
- print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
- print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Dernière connexion le: $last_login (ip: $last_ip)\n";
- print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
- } else {
- print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
- print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
- print " Last connection at: $last_login (ip: $last_ip)\n";
- print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
- }
- print " Memo: '$memo'\n";
- }
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Check the validity of a password
-# (Note: never send back a password with login-server!! security of passwords)
-sub checkaccount() {
- my($userid, $passwd) = @_;
- if ($userid eq "") {
- if ($defaultlanguage eq "F") {
- print "Entrez un nom de compte svp.\n";
- print "<exemple> check testname motdepasse\n";
- } else {
- print "Please input an account name.\n";
- print "<example> check testname password\n";
- }
- return 136;
- }
- if (verify_accountname($userid) == 0) {
- return 102;
- }
- if ($passwd eq "") {
- return 134 if (($passwd = typepasswd()) eq "");
- }
- if (verify_password($passwd) == 0) {
- return 131;
- }
- print $so pack("va24a24", 0x793a, $userid,$passwd);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x793b) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 132;
- }
- $buf = readso(28);
- my($id2, $name) = unpack("Va24", $buf);
- while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
- chop($name);
- };
- if ($id2 == -1 || $id2 == 4294967295) {
- if ($defaultlanguage eq "F") {
- print "Le compte [$userid] n'existe pas ou le mot de passe est incorrect.\n";
- } else {
- print "The account [$userid] doesn't exist or the password is incorrect.\n";
- }
- return 133;
- } else {
- if ($defaultlanguage eq "F") {
- print "Le mot de passe donné correspond bien au compte [$name][id: $id2].\n";
- } else {
- print "The proposed password is correct for the account [$name][id: $id2].\n";
- }
- }
- return 130;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Request to login-server to reload GM configuration file
-sub reloadGM() {
- print $so pack("v", 0x7955);
- $so->flush();
- if ($defaultlanguage eq "F") {
- print "Demande de recharger le fichier de configuration des GM envoyée.\n";
- print "Vérifiez les comptes GM actuels (après rechargement):\n";
- } else {
- print "Request to reload the GM configuration file sended.\n";
- print "Check the actual GM accounts (after reloading):\n";
- }
- &listaccount(0, 0, 1); # 1: to list only GM
- return 180;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Send a broadcast message
-sub sendbroadcast() {
- my($type, $message) = @_;
- if ($message eq "" || length($message) == 0) {
- if ($defaultlanguage eq "F") {
- print "Entrez un message svp.\n";
- if ($type == 0) {
- print "<exemple> kami un message\n";
- } else {
- print "<exemple> kamib un message\n";
- }
- } else {
- print "Please input a message.\n";
- if ($type == 0) {
- print "<example> kami a message\n";
- } else {
- print "<example> kamib a message\n";
- }
- }
- return 136;
- }
-
- print $so pack("vvVa".length($message), 0x794e, $type, length($message), $message);
- $so->flush();
- $buf = readso(2);
- if (unpack("v", $buf) != 0x794f) {
- if ($defaultlanguage eq "F") {
- print "Problème de connexion au serveur (réponse incorrecte).\n";
- } else {
- print "Connection error to the server (incorrect answer).\n";
- }
- return 152;
- }
- $buf = readso(2);
- my($answer) = unpack("v", $buf);
- if ($answer == -1 || $answer == 65535) {
- if ($defaultlanguage eq "F") {
- print "Echec de l'envoi du message. Aucun server de char en ligne.\n";
- } else {
- print "Message sending failed. No online char-server.\n";
- }
- } else {
- if ($defaultlanguage eq "F") {
- print "Message transmis au server de logins avec succès.\n";
- } else {
- print "Message successfully sended to login-server.\n";
- }
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Change language of displaying
-sub changelanguage() {
- my($language) = @_;
- if ($language eq "" || length($language) == 0) {
- if ($defaultlanguage == 'F') {
- printf("Entrez une langue svp.\n");
- printf("<exemple> language english\n");
- printf(" language français\n");
- } else {
- printf("Please input a language.\n");
- printf("<example> language english\n");
- printf(" language français\n");
- }
- return 136;
- }
-
- $language = uc(substr($language, 0, 1));
- if ($language =~ /^[EF]$/) {
- $defaultlanguage = $language;
- if ($defaultlanguage == 'F') {
- printf("Changement de la langue d'affichage en Français.\n");
- } else {
- printf("Displaying language changed to English.\n");
- }
- } else {
- if ($defaultlanguage == 'F') {
- printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
- } else {
- printf("Undefined language (possible languages: Français or English).\n");
- }
- }
-
- return 0;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: sending 'end of connection' packet
-sub quit() {
- print $so pack("v", 0x7532);
- $so->flush();
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Get datas from the socket
-sub readso() {
- my($len) = shift;
- my($buf);
- if (read($so, $buf, $len) < $len) {
- if ($defaultlanguage eq "F") {
- print "Erreur de lecture sur la Socket.\n";
- } else {
- print "Socket read error.\n";
- }
- exit(3);
- }
- return $buf;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Input of a password
-sub typepasswd {
- my($passwd1, $passwd2);
- cbreak();
- if ($defaultlanguage eq "F") {
- print "Entrez le mot de passe > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
- print "Ré-entrez le mot de passe > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
- } else {
- print "Type the password > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
- print "Verify the password > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
- }
- cooked();
- if ($passwd1 ne $passwd2) {
- if ($defaultlanguage eq "F") {
- print "Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n";
- } else {
- print "Password verification failed. Please input same password.\n";
- }
- return "";
- }
- return $passwd1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Return ordonal text of a number
-sub makeordinal {
- my($c) = shift;
- if ($defaultlanguage eq "F") {
- if ($c < 1) {
- return $c;
- }
- return $c.("er", "ème")[$c == 1 ? 0 : 1];
- } else {
- if ($c % 10 < 4 && $c % 10 != 0 && ($c < 10 || $c > 20)) {
- return $c.("st","nd","rd")[$c % 10 - 1];
- }
- return $c."th";
- }
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an account name (return 0 if incorrect, and 1 if ok)
-sub verify_accountname {
- my($account_name) = @_; # Get the account_name
- if ($account_name =~ /[\x00-\x1f]/) { # remove control char
- my($c) = length($`) + 1;
- if ($defaultlanguage eq "F") {
- print "Caractère interdit trouvé dans le nom du compte (".makeordinal($c)." caractère).\n";
- } else {
- print "Illegal character found in the account name (".makeordinal($c)." character).\n";
- }
- return 0;
- }
- if (length($account_name) < 4) {
- if ($defaultlanguage eq "F") {
- print "Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n";
- } else {
- print "Account name is too short. Please input an account name of 4-23 bytes.\n";
- }
- return 0;
- }
- if (length($account_name) > 23) {
- if ($defaultlanguage eq "F") {
- print "Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n";
- } else {
- print "Account name is too long. Please input an account name of 4-23 bytes.\n";
- }
- return 0;
- }
- return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
-sub verify_password {
- my($password) = @_; # Get the password
- if ($password =~ /[\x00-\x1f]/) {
- my($c) = length($`) + 1;
- if ($defaultlanguage eq "F") {
- print "Caractère interdit trouvé dans le mot de passe (".makeordinal($c)." caractère).\n";
- } else {
- print "Illegal character found in the password (".makeordinal($c)." character).\n";
- }
- return 0;
- }
- if (length($password) < 4) {
- if ($defaultlanguage eq "F") {
- print "Mot de passe trop court. Entrez un mot de passe de 4-23 caractères.\n";
- } else {
- print "Password is too short. Please input a password of 4-23 bytes.\n";
- }
- return 0;
- }
- if (length($password) > 23) {
- if ($defaultlanguage eq "F") {
- print "Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n";
- } else {
- print "Password is too long. Please input a password of 4-23 bytes.\n";
- }
- return 0;
- }
- return 1;
-}
-
-#--------------------------------------------------------------------------
-
-# Sub-function: Test of the validity of an e-mail (return 0 if incorrect, and 1 if ok)
-sub verify_email {
- my($email) = @_; # Get the e-mail
- # To ignore a '.' before the @ (wanadoo, a provider, do that)
- $email =~ s/\.\@/\@/;
- # If the e-mail is void, it's not correct -> return 0
- if ($email eq '') {
- return(0);
- }
- # If the e-mail have no "@", it's not correct -> return 0
- if ($email !~ /\@/) {
- return(0);
- }
- # If the e-mail have a ",", a space, a tab or a ";", it's not correct -> return 0
- if ($email =~ /[\,|\s|\;]/) {
- return(0)
- };
- # IF
- # (the e-mail contains 2 "@", or ".." or "@." or starts or finishes by a ".")
- # OR IF
- # (the e-mail doesn't contain "@localhost" AND
- # - it doesn't contain characters followed by "@" itself followed by letters itself followed by "." and 2 or more letters
- # - or an IP address)
- # -> so, it's not good ! (finish !)
- if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/ ||
- ($email !~ /^.+\@localhost$/ &&
- $email !~ /^.+\@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
- return(0); # non-valid email
- } else {
- # If not, the e-email address is correct
- return(1); # valid email
- }
+#!/usr/bin/perl
+use POSIX;
+##########################################################################
+# EAthena login-server remote administration tool
+# New ladamin by [Yor]
+##########################################################################
+#-------------------------------INSTRUCTIONS------------------------------
+# Set the 4 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)
+#-------------------------------------------------------------------------
+my($loginserverip) = "127.0.0.1"; # IP of login-server
+my($loginserverport) = 6900; # Port of login-server
+my($loginserveradminpassword) = "admin"; # Administration password
+my($connecttimeout) = 10; # Timeout of connection (in seconds)
+my($passenc) = 2; # Encoding type of the password
+my($defaultlanguage) = "E"; # Default language (F: Français/E: English)
+ # (if it's not 'F', default is English)
+
+#-------------------------------------------------------------------------
+# 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.
+# Same command of banset, except that 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: 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.
+# Same command of 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: 23:59:59
+# timeset <account_name> 0
+# Gives an unlimited validity limit (0 = unlimited).
+#
+# unban/unbanish <account name>
+# Unban an account.
+# Same command of banset 0.
+#
+# unblock <account name>
+# Set state 0 (Account ok) to an account.
+# Same command of state <account_name> 0.
+#
+# version
+# Display the version of the login-server.
+#
+# who <account name>
+# Displays complete information of an account.
+#
+#-------------------------------------------------------------------------
+# Possibilities to execute ladmin in command line by usage of the software with a parameter:
+# ./ladmin --mode param1 ...
+#
+# --makesymlink -- Create the symbolic links for a use in shell
+# --add <account_name> <sex> <password> -- Create an account with the default email (or -a)
+# --ban yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account (or -b)
+# --banadd <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account (or - ba)
+# --banset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account (or -bs)
+# --banset <account_name> 0 -- Unbanish an account (or -bs)
+# --block <account_name> -- Set state 5 to an account (or -bl)
+# --check <account_name> <password> -- Check the validity of a password for an account (or -check)
+# --create <account_name> <sex> <email> <password> -- Create an account with email (or -c)
+# --del <account_name> -- Remove an account (or -d)
+# --email <account_name> <email> -- Modify an email of an account (or -e)
+# --getcount -- Give the number of players online on all char-servers (or -g)
+# --gm <account_name> <GM_level> -- Change the GM level of an account (or -gm)
+# --id <account_name> -- Give the id of an account (or -i)
+# --info <account_id> -- Display complete information of an account (or -info)
+# --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 (-lang).
+# --list [First_id [Last_id]] -- Display a list of accounts (or -l)
+# --listBan [start_id [end_id]] -- Display a list of accounts with state or banished (or -lBan)
+# --listGM [First_id [Last_id]] -- Display a list of GM accounts (or -lGM)
+# --listOK [start_id [end_id]] -- Display a list of accounts without state and not banished (or -lOK)
+# --memo <account_name> <memo> -- Modify the memo of an account (or -e)
+# --name <account_id> -- Give the name of an account (or -n)
+# --passwd <account_name> <new_password> -- Change the password of an account (or -p)
+# --reloadGM -- Reload GM configuration file (or -r)
+# --search <expression> -- Seek accounts (or -s)
+# --search -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX (or -s)
+# --sex <account_name> <sex> -- Change the sex of an account (or -sex)
+# --state <account_name> <new_state> <error_message_#7> -- Change the state of an account (or -t)
+# --timeadd <account_name> <modifier> -- Add or substract time from the validity limit of an account (or - ta)
+# --timeset <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account (or -ts)
+# --timeset <account_name> 0 -- Give a unlimited validity limit (or -ts)
+# --unban/unbanish <account_name> -- Unban an account (or -uba)
+# --unblock <account_name> -- Set state 0 to an account (or -ubl)
+# --version -- Display the version of the login-server (or -v)
+# --who <account_name> -- Display complete information of an account (or -w)
+#
+# <example> ./ladmin --addaccount testname Male testpass
+#
+#-------------------------------------------------------------------------
+# Possibilities to execute ladmin with symbolic links in Shell
+# To create the symbolic links, execute ladmin with the '-- makesymlink' option.
+#
+# addaccount <account_name> <sex> <password> -- Create an account with the default email
+# banaccount yyyy/mm/dd hh:mm:ss <account_name> -- Change the final date of a banishment of an account
+# banaddaccount <account_name> <modifier> -- Add or substract time from the final date of a banishment of an account
+# bansetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the final date of a banishment of an account
+# bansetaccount <account_name> 0 -- Unbanish an account
+# blockaccount <account_name> -- Set state 5 (blocked by the GM Team) to an account
+# checkaccount <account_name> <password> -- Check the validity of a password for an account
+# createaccount <account_name> <sex> <email> <password> -- Create an account with email
+# delaccount <account_name> -- Remove an account
+# emailaccount <account_name> <email> -- Modify an email of an account
+# getcount -- Give the number of players online on all char-servers
+# gmaccount <account_name> <GM_level> -- Change the GM level of an account
+# idaccount <account_name> -- Give the id of an account
+# infoaccount <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).
+# ladminlanguage <language> -- Change the language of displaying.
+# listaccount [First_id [Last_id]] -- Display a list of accounts
+# listBanaccount [start_id [end_id]] -- Display a list of accounts with state or banished
+# listGMaccount [First_id [Last_id]] -- Display a list of GM accounts
+# listOKaccount [start_id [end_id]] -- Display a list of accounts without state and not banished
+# loginserverversion -- Display the version of the login-server
+# memoaccount <account_name> <memo> -- Modify the memo of an account
+# nameaccount <account_id> -- Give the name of an account
+# passwdaccount <account_name> <new_password> -- Change the password of an account
+# reloadGM -- Reload GM configuration file
+# searchaccount <expression> -- Seek accounts
+# searchaccount -e/-r/--expr/--regex <expression> -- Seek accounts by REGEX
+# sexaccount <account_name> <sex> -- Change the sex of an account (or -sex)
+# stateaccount <account_name> <new_state> <error_message_#7> -- Change the state of an account
+# timeaddaccount <account_name> <modifier> -- Add or substract time from the validity limit of an account
+# timesetaccount <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit of an account
+# timesetaccount <account_name> 0 -- Give a unlimited validity limit
+# unbanaccount <account_name> -- Unban an account
+# unblockaccount <account_name> -- Set state 0 (Account ok) to an account
+# whoaccount <account_name> -- Display complete information of an account
+# <exemple> ./addaccount testname Male testpass
+#
+#-------------------------------------------------------------------------
+# About the encoding:
+#
+# The Digest::MD5 module is necessary to use the encrypted password system.
+# When the software cannot found the Digest::MD5 module,
+# encoding is automatically disabled ($passenc=0), which allows
+# to use this program in any cases.
+#
+#-------------------------------------------------------------------------
+# How to use ladmin with UNIX:
+#
+# You excecute ladmin as a standard command.
+# <Example of preparation to have an access to ladmin>
+# $ mv ladmin ladmin_org
+# $ nkf -eLu ladmin_org > ladmin
+# $ chmod 700 ladmin
+# <Example to start directly ladmin>
+# $ perl ladmin
+#
+##########################################################################
+
+
+use strict;
+use IO::Socket;
+use Term::ReadLine;
+eval { use POSIX qw(:termios_h); };
+eval { use Digest::MD5 qw(md5); } if $passenc;
+$passenc = 0 if($@);
+
+my($ver) = "1.00";
+
+# Start of termios
+my($termios, $orgterml, $termlecho, $termlnoecho) = ();
+eval{
+ $termios = POSIX::Termios->new();
+ $termios->getattr(fileno(STDIN));
+ $orgterml = $termios->getlflag();
+ $termlecho = ECHO | ECHOK | ICANON;
+ $termlnoecho = $orgterml & ~$termlecho;
+};
+
+# Modification of termios for the displaying of passwords (no displays for pressed keys)
+sub cbreak() {
+ if ($termios) {
+ $termios->setlflag($termlnoecho);
+ $termios->setcc(VTIME, 1);
+ $termios->setattr(fileno(STDIN), TCSANOW);
+ }
+}
+# Modification of termios to return at the normal displaying (after input of the passwords)
+sub cooked() {
+ if ($termios) {
+ $termios->setlflag($orgterml);
+ $termios->setcc(VTIME,0);
+ $termios->setattr(fileno(STDIN),TCSANOW);
+ }
+}
+END{ cooked() }
+
+if ($defaultlanguage eq "F") {
+ print "Outil d'administration à distance de eAthena V.$ver\n";
+} else {
+ print "EAthena login-server administration tool V.$ver\n";
+}
+
+# Creation of the symbolic links for call of the program in line command of the shell
+if ($ARGV[0] eq "--makesymlink") {
+ symlink $0, "loginserverversion";
+ symlink $0, "addaccount";
+ symlink $0, "banaccount";
+ symlink $0, "banaddaccount";
+ symlink $0, "bansetaccount";
+ symlink $0, "blockaccount";
+ symlink $0, "checkaccount";
+ symlink $0, "createaccount";
+ symlink $0, "delaccount";
+ symlink $0, "emailaccount";
+ symlink $0, "getcount";
+ symlink $0, "gmaccount";
+ symlink $0, "idaccount";
+ symlink $0, "infoaccount";
+ symlink $0, "kami";
+ symlink $0, "kamib";
+ symlink $0, "ladminlanguage";
+ symlink $0, "listaccount";
+ symlink $0, "listBanaccount";
+ symlink $0, "listGMaccount";
+ symlink $0, "listOKaccount";
+ symlink $0, "memoaccount";
+ symlink $0, "nameaccount";
+ symlink $0, "passwdaccount";
+ symlink $0, "reloadGM";
+ symlink $0, "searchaccount";
+ symlink $0, "sexaccount";
+ symlink $0, "stateaccount";
+ symlink $0, "timeaddaccount";
+ symlink $0, "timesetaccount";
+ symlink $0, "unbanaccount";
+ symlink $0, "unblockaccount";
+ symlink $0, "whoaccount";
+ if ($defaultlanguage eq "F") {
+ print "Liens symbliques créés.\n";
+ } else {
+ print "Symbolic links created.\n";
+ }
+ exit(0);
+}
+
+# Connection to the login-server
+my($so,$er) = ();
+eval{
+ $so = IO::Socket::INET->new(
+ PeerAddr=> $loginserverip,
+ PeerPort=> $loginserverport,
+# Proto => "tcp",
+ Timeout => $connecttimeout) or $er = 1;
+};
+if ($er || $@) {
+ if ($defaultlanguage eq "F") {
+ print "\nImpossible de se connecter au serveur de login [${loginserverip}:$loginserverport] !\n";
+ } else {
+ print "\nImpossible to have a connection with the login-server [${loginserverip}:$loginserverport] !\n";
+ }
+ print "$!\n"; # Displaying of the error
+ exit(2);
+}
+
+# Sending the administration password
+if ($passenc == 0) {
+ print $so pack("v2a24",0x7918,0,$loginserveradminpassword);
+ $so->flush();
+} else {
+ print $so pack("v",0x791a);
+ $so->flush();
+ my($buf) = readso(4);
+ if (unpack("v",$buf) != 0x01dc) {
+ if ($defaultlanguage eq "F") {
+ print "Erreur au login (échec de la création de la clef md5).\n";
+ } else {
+ print "Error at login (failure of the md5 key creation).\n";
+ }
+ }
+ $buf = readso(unpack("x2v",$buf)-4);
+ my($md5bin) = md5(($passenc == 1) ? $buf.$loginserveradminpassword : $loginserveradminpassword.$buf);
+ print $so pack("v2a16",0x7918,$passenc,$md5bin);
+ $so->flush();
+}
+
+# Waiting of the server reply
+my($buf) = readso(3);
+
+if (unpack("v",$buf) != 0x7919 || unpack("x2c",$buf) != 0) {
+ if ($defaultlanguage eq "F") {
+ print "Erreur de login:\n";
+ print " - mot de passe incorrect,\n";
+ print " - système d'administration non activé, ou\n";
+ print " - IP non autorisée.\n";
+ } else {
+ print "Error at login:\n";
+ print " - incorrect password,\n";
+ print " - administration system not activated, or\n";
+ print " - unauthorised IP.\n";
+ }
+ quit();
+ exit(4);
+}
+
+if ($defaultlanguage eq "F") {
+ print "Connexion établie.\n";
+} else {
+ print "Established connection.\n";
+}
+
+#-------------------------------------------------------------------------
+# Here are checked the command lines with arguments and symbolic links (no prompt)
+
+if ($0 =~ /addaccount$/ ||
+ (($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV), 1))) {
+ my($r) = addaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /banaccount$/ || $0 =~ /banishaccount$/ ||
+ (($ARGV[0] eq "-b" || $ARGV[0] eq "--ban" || $ARGV[0] eq "--banish") && ((shift @ARGV), 1))) {
+ my($r) = bansetaccount($ARGV[1], $ARGV[2], $ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /banaddaccount$/ ||
+ (($ARGV[0] eq "-ba" || $ARGV[0] eq "--banadd") && ((shift @ARGV), 1))) {
+ my($r) = banaddaccount($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /bansetaccount$/ ||
+ (($ARGV[0] eq "-bs" || $ARGV[0] eq "--banset") && ((shift @ARGV), 1))) {
+ my($r) = bansetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /blockaccount$/ ||
+ (($ARGV[0] eq "-bl" || $ARGV[0] eq "--block") && ((shift @ARGV), 1))) {
+ my($r) = changestate($ARGV[0], 5, "");
+ quit();
+ exit($r);
+} elsif ($0 =~ /checkaccount$/ ||
+ (($ARGV[0] eq "-check" || $ARGV[0] eq "--check") && ((shift @ARGV), 1))) {
+ my($r) = checkaccount($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /createaccount$/ ||
+ (($ARGV[0] eq "-c" || $ARGV[0] eq "--create") && ((shift @ARGV), 1))) {
+ my($r) = createaccount($ARGV[0], $ARGV[1], $ARGV[2], $ARGV[3]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /delaccount$/ ||
+ (($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV), 1))) {
+ my($r) = delaccount($ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /emailaccount$/ ||
+ (($ARGV[0] eq "-e" || $ARGV[0] eq "--email") && ((shift @ARGV), 1))) {
+ my($r) = changeemail($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /getcount$/ ||
+ (($ARGV[0] eq "-g" || $ARGV[0] eq "--getcount") && ((shift @ARGV), 1))) {
+ my($r) = getlogincount();
+ quit();
+ exit($r);
+} elsif ($0 =~ /gmaccount$/ ||
+ (($ARGV[0] eq "-gm" || $ARGV[0] eq "--gm") && ((shift @ARGV), 1))) {
+ my($r) = changegmlevel($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /id$/ ||
+ (($ARGV[0] eq "-i" || $ARGV[0] eq "--id") && ((shift @ARGV), 1))) {
+ my($r) = idaccount($ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /infoaccount$/ ||
+ (($ARGV[0] eq "-info" || $ARGV[0] eq "--info") && ((shift @ARGV), 1))) {
+ my($r) = infoaccount($ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /kami$/ ||
+ (($ARGV[0] eq "-kami" || $ARGV[0] eq "--kami") && ((shift @ARGV), 1))) {
+ my($r) = sendbroadcast(0, $ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /kamib$/ ||
+ (($ARGV[0] eq "-kamib" || $ARGV[0] eq "--kamib") && ((shift @ARGV), 1))) {
+ my($r) = sendbroadcast(0x10, $ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /ladminlanguage$/ ||
+ (($ARGV[0] eq "-lang" || $ARGV[0] eq "--language") && ((shift @ARGV), 1))) {
+ my($r) = changelanguage($ARGV[0]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /listaccount$/ ||
+ (($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV), 1))) {
+ my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 0); # 0: to list all
+ quit();
+ exit($r);
+} elsif ($0 =~ /listBanaccount$/ ||
+ (($ARGV[0] eq "-lBan" || $ARGV[0] eq "--listBan") && ((shift @ARGV), 1))) {
+ my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 3); # 3: to list only accounts with state or banished
+ quit();
+ exit($r);
+} elsif ($0 =~ /listGMaccount$/ ||
+ (($ARGV[0] eq "-lGM" || $ARGV[0] eq "--listGM") && ((shift @ARGV), 1))) {
+ my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 1); # 1: to list only GM
+ quit();
+ exit($r);
+} elsif ($0 =~ /listOKaccount$/ ||
+ (($ARGV[0] eq "-lOK" || $ARGV[0] eq "--listOK") && ((shift @ARGV), 1))) {
+ my($r) = listaccount(int($ARGV[0]), int($ARGV[1]), 4); # 4: to list only accounts without state and not banished
+ quit();
+ exit($r);
+} elsif ($0 =~ /loginserverversion$/ ||
+ (($ARGV[0] eq "-v" || $ARGV[0] eq "--version") && ((shift @ARGV), 1))) {
+ my($r) = checkloginversion();
+ quit();
+ exit($r);
+} elsif ($0 =~ /memoaccount$/ ||
+ (($ARGV[0] eq "-m" || $ARGV[0] eq "--memo") && ((shift @ARGV), 1))) {
+ my($r) = changememo($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /nameaccount$/ ||
+ (($ARGV[0] eq "-n" || $ARGV[0] eq "--name") && ((shift @ARGV), 1))) {
+ my($r) = nameaccount(int($ARGV[0]));
+ quit();
+ exit($r);
+} elsif ($0 =~ /passwdaccount$/ ||
+ (($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV), 1))) {
+ my($r) = changepasswd($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /reloadGM$/ ||
+ (($ARGV[0] eq "-r" || $ARGV[0] eq "--reloadGM") && ((shift @ARGV), 1))) {
+ my($r) = reloadGM();
+ quit();
+ exit($r);
+} elsif ($0 =~ /searchaccount$/ ||
+ (($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV), 1))) {
+ my($r) = searchaccount($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /sexaccount$/ ||
+ (($ARGV[0] eq "-sex" || $ARGV[0] eq "--sex") && ((shift @ARGV), 1))) {
+ my($r) = changesex($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /stateaccount$/ ||
+ (($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV), 1))) {
+ my($r) = changestate($ARGV[0], $ARGV[1], $ARGV[2]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /timeaddaccount$/ ||
+ (($ARGV[0] eq "-ta" || $ARGV[0] eq "--timeadd") && ((shift @ARGV), 1))) {
+ my($r) = timeaddaccount($ARGV[0], $ARGV[1]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /timesetaccount$/ ||
+ (($ARGV[0] eq "-ts" || $ARGV[0] eq "--timeset") && ((shift @ARGV), 1))) {
+ my($r) = timesetaccount($ARGV[0], $ARGV[1], $ARGV[2]);
+ quit();
+ exit($r);
+} elsif ($0 =~ /unbanaccount$/ || $0 =~ /unbanishaccount$/ ||
+ (($ARGV[0] eq "-uba" || $ARGV[0] eq "--unban" || $ARGV[0] eq "--unbanish") && ((shift @ARGV), 1))) {
+ my($r) = bansetaccount($ARGV[0], 0, "");
+ quit();
+ exit($r);
+} elsif ($0 =~ /unblockaccount$/ ||
+ (($ARGV[0] eq "-ubl" || $ARGV[0] eq "--unblock") && ((shift @ARGV), 1))) {
+ my($r) = changestate($ARGV[0], 0, "");
+ quit();
+ exit($r);
+} elsif ($0 =~ /whoaccount$/ ||
+ (($ARGV[0] eq "-w" || $ARGV[0] eq "--who") && ((shift @ARGV), 1))) {
+ my($r) = whoaccount($ARGV[0]);
+ quit();
+ exit($r);
+}
+
+#-------------------------------------------------------------------------
+if ($defaultlanguage eq "F") {
+ print "Lecture de la version du serveur de login...\n";
+} else {
+ print "Reading of the version of the login-server...\n";
+}
+checkloginversion();
+
+# Set the prompt line
+my($term) = new Term::ReadLine "ladmin";
+
+# Here begin the infinite loop to read prompts
+while(1) {
+ # Displaying of the prompt
+ print "\n";
+ if ($defaultlanguage eq "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";
+ }
+ my($cmd) = $term->readline("ladmin> ");
+ # split and recovery of the input
+ chomp $cmd; # remove cariage return
+ $cmd =~ s/\x1b\[\d*\w//g; # remove (esc)[(number)(1alpha) = screen control sequence
+ $cmd =~ s/[\x00-\x1f]//g; # remove control char
+ my($command, $parameters) = split /\s+/,$cmd,2; # extract command and parameters
+ $command = lc($command); # command in lowercase
+ my(@paramlist) = split /\s+/,$parameters; # get list of parameters
+
+ if ($command eq "?" || $command eq "") {
+ $command = "aide" if ($defaultlanguage eq "F");
+ $command = "help" if ($defaultlanguage ne "F");
+ }
+
+ # Analyse of the command
+ eval {
+# help
+ if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ displayhelp("aide", $paramlist[0]);
+ } elsif ("help" =~ /^\Q$command/) {
+ displayhelp("help", $paramlist[0]);
+
+# general commands
+ } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(.*)/)) {
+ addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(.*)/)) {
+ addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ addaccount($paramlist[0], $paramlist[1], ""); # <account_name> <sex> <password>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ addaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> <sex> <password>
+ }
+
+ } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+ if (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+"(.*)"/)) { # yyyy/mm/dd hh:mm:ss <account_name>
+ bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^(\S+)\s+(\S+)\s+'(.*)'/)) { # yyyy/mm/dd hh:mm:ss <account_name>
+ bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } else {
+ @paramlist = split /\s+/,$parameters,3; # yyyy/mm/dd hh:mm:ss <account_name>
+ bansetaccount($paramlist[2], $paramlist[0], $paramlist[1]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ }
+
+ } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ banaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ }
+
+ } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+ bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+ bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ bansetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ bansetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ }
+
+ } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ changestate($paramlist[0], 5, ""); # <account_name> <new_state> <error_message_#7>
+ }
+
+ } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+ checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ checkaccount($paramlist[0], ""); # <account_name> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+ checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ checkaccount($paramlist[0], ""); # <account_name> <password>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ checkaccount($paramlist[0], $paramlist[1]); # <account_name> <password>
+ }
+
+ } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)\s+(.*)/)) {
+ createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+ createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)\s+(.*)/)) {
+ createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+ createaccount($paramlist[0], $paramlist[1], $paramlist[2], ""); # <account_name> <sex> <email> <password>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ createaccount($paramlist[0], $paramlist[1], $paramlist[2], $paramlist[3]); # <account_name> <sex> <email> <password>
+ }
+
+ } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ delaccount($paramlist[0]); # <account_name>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ delaccount($paramlist[0]); # <account_name>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ delaccount($paramlist[0]); # <account_name>
+ }
+
+ } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ changeemail($paramlist[0], $paramlist[1]); # <account_name> <email>
+ }
+
+ } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ getlogincount();
+
+ } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ changegmlevel($paramlist[0], 0); # <account_name> <GM_level>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ changegmlevel($paramlist[0], int($paramlist[1])); # <account_name> <GM_level>
+ }
+
+ } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ idaccount($paramlist[0]); # <account_name>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ idaccount($paramlist[0]); # <account_name>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ idaccount($paramlist[0]); # <account_name>
+ }
+
+ } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ infoaccount(int($paramlist[0])); # <account_id>
+
+ } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+ @paramlist = split /\s+/,$parameters,1;
+ sendbroadcast(0, $paramlist[0]); # <type> <message>
+
+ } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+ @paramlist = split /\s+/,$parameters,1;
+ sendbroadcast(0x10, $paramlist[0]); # <type> <message>
+
+ } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ changelanguage($paramlist[0]); # <language>
+
+ } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ listaccount(int($paramlist[0]), int($paramlist[1]), 0); # [start_id [end_id]] 0: to list all
+
+ } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+ listaccount(int($paramlist[0]), int($paramlist[1]), 3); # [start_id [end_id]] 3: to list only accounts with state or banished
+
+ } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+ listaccount(int($paramlist[0]), int($paramlist[1]), 1); # [start_id [end_id]] 1: to list only GM
+
+ } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+ listaccount(int($paramlist[0]), int($paramlist[1]), 4); # [start_id [end_id]] 4: to list only accounts without state and not banished
+
+ } elsif ("memo" =~ /^\Q$command/) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+ changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+ changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+ } else {
+ @paramlist = split /\s+/,$parameters,2;
+ changememo($paramlist[0], $paramlist[1]); # <account_name> <memo>
+ }
+
+ } elsif ("name" =~ /^\Q$command/) {
+ nameaccount(int($paramlist[0])); # <account_id>
+
+ } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(.*)/)) {
+ changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ changepasswd($paramlist[0], ""); # <account_name> <new_password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(.*)/)) {
+ changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ changepasswd($paramlist[0], ""); # <account_name> <new_password>
+ } else {
+ @paramlist = split /\s+/,$parameters,2;
+ changepasswd($paramlist[0], $paramlist[1]); # <account_name> <new_password>
+ }
+
+ } elsif ("reloadgm" =~ /^\Q$command/) {
+ reloadGM();
+
+ } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ if (@paramlist = ($parameters =~ m/^(-{1,2}[re]\S*)\s+(.*)/)) {
+ searchaccount($paramlist[0], $paramlist[1]); # -r/-e/--expr/--regex <expression> | <expression>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ searchaccount($paramlist[0], ""); # -r/-e/--expr/--regex <expression> | <expression>
+ }
+
+ } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ changesex($paramlist[0], $paramlist[1]); # <account_name> <sex>
+ }
+
+ } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)\s+(.*)/)) {
+ changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\d+)/)) {
+ changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)\s+(.*)/)) {
+ changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\d+)/)) {
+ changestate($paramlist[0], int($paramlist[1]), ""); # <account_name> <new_state> <error_message_#7>
+ } else {
+ @paramlist = split /\s+/,$parameters,3;
+ changestate($paramlist[0], int($paramlist[1]), $paramlist[2]); # <account_name> <new_state> <error_message_#7>
+ }
+
+ } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ timeaddaccount($paramlist[0], $paramlist[1]); # <account_name> <modifier>
+ }
+
+ } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ if (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)\s+(\S+)/)) {
+ timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^"(.*)"\s+(\S+)/)) {
+ timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)\s+(\S+)/)) {
+ timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'\s+(\S+)/)) {
+ timesetaccount($paramlist[0], $paramlist[1], "23:59:59"); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } else {
+ @paramlist = split /\s+/,$parameters;
+ timesetaccount($paramlist[0], $paramlist[1], $paramlist[2]); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ }
+
+ } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ bansetaccount($paramlist[0], 0, ""); # <account_name> yyyy/mm/dd [hh:mm:ss]
+ }
+
+ } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ changestate($paramlist[0], 0, ""); # <account_name> <new_state> <error_message_#7>
+ }
+
+ } elsif ("version" =~ /^\Q$command/) {
+ checkloginversion();
+
+ } elsif ("who" =~ /^\Q$command/) {
+ if (@paramlist = ($parameters =~ m/^"(.*)"/)) {
+ whoaccount($paramlist[0]); # <account_name>
+ } elsif (@paramlist = ($parameters =~ m/^'(.*)'/)) {
+ whoaccount($paramlist[0]); # <account_name>
+ } else {
+ @paramlist = split /\s+/,$parameters,1;
+ whoaccount($paramlist[0]); # <account_name>
+ }
+
+# quit
+ } elsif ("quit" =~ /^\Q$command/ ||
+ (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?
+ last;
+
+# unknown command
+ } elsif ($command) {
+ if ($defaultlanguage eq "F") {
+ print "Commande inconnue [".$command."]\n";
+ } else {
+ print "Unknown command [".$command."]\n";
+ }
+ }
+# $term->addhistory($cmd) if $command;
+ };
+ if ($@) {
+ if ($defaultlanguage eq "F") {
+ print "Erreur [".$command."]\n$@";
+ } else {
+ print "Error [".$command."]\n$@";
+ }
+ }
+};
+
+# End of the software
+quit();
+
+if ($defaultlanguage eq "F") {
+ print "Au revoir.\n";
+} else {
+ print "Bye.\n";
+}
+exit(0);
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the version of the login-server
+sub checkloginversion() {
+ print $so pack("v",30000); # 0x7530
+ $so->flush();
+ $buf = readso(10);
+ # Analyse du Packet
+ my($ret, $maver, $miver, $rev, $dev, $mod, $type, $mdver) = unpack("vc6v", $buf);
+ if ($ret != 30001) { #0x7531
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ exit(6);
+ }
+
+ print " Login-Server [$loginserverip:$loginserverport]\n";
+ printf " eAthena version %s-%d.%d", ("stable", "dev")[$dev], $maver, $miver;
+ printf " revision %d", $rev if $rev;
+ printf "%s%d.\n", ("", "-mod")[$mod], $mdver;
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the help
+sub displayhelp() {
+ my($help, $receivedcommand) = @_;
+
+ my($command) = lc($receivedcommand); # command in lowercase
+
+ if ($command eq "") {
+ $command = "not a command"; # any value that is not a command
+ }
+
+ if ($command eq "?") {
+ $command = "aide" if ($defaultlanguage eq "F");
+ $command = "help" if ($defaultlanguage ne "F");
+ }
+
+ if ($help eq "aide") {
+ if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ 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";
+ } elsif ("help" =~ /^\Q$command/) {
+ 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";
+ } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ 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";
+ } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+ printf "ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>\n";
+ printf " Change la date de fin de bannissement d'un compte.\n";
+ printf " La différence avec banset est la position du nom du compte.\n";
+ } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ 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";
+ } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ 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: 23:59:59\n";
+ printf "banset <nomcompte> 0\n";
+ printf " Débanni un compte (0 = de-banni).\n";
+ } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+ 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";
+ } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ 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";
+ } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ 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";
+ } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+ printf "del <nomcompte>\n";
+ printf " Supprime un compte.\n";
+ printf " La commande demande confirmation. Après confirmation, le compte est détruit.\n";
+ } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+ printf "email <nomcompte> <email>\n";
+ printf " Modifie l'e-mail d'un compte.\n";
+ } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ printf "getcount\n";
+ printf " Donne le nombre de joueurs en ligne par serveur de char.\n";
+ } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ 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";
+ } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ printf "id <nomcompte>\n";
+ printf " Donne l'id d'un compte.\n";
+ } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ printf "info <idcompte>\n";
+ printf " Affiche les informations sur un compte.\n";
+ } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+ printf "kami <message>\n";
+ printf " Envoi un message général sur tous les serveurs de map (en jaune).\n";
+ } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+ printf "kamib <message>\n";
+ printf " Envoi un message général sur tous les serveurs de map (en bleu).\n";
+ } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ printf("language <langue>\n");
+ printf(" Change la langue d'affichage.\n");
+ printf(" Langues possibles: 'Français' ou 'English'.\n");
+ } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ 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";
+ } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listBan/lsBan [Premier_id [Dernier_id]]\n";
+ printf " Comme list/ls, mais seulement pour les comptes GM avec un statut ou bannis.\n";
+ } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listGM/lsGM [Premier_id [Dernier_id]]\n";
+ printf " Comme list/ls, mais seulement pour les comptes GM.\n";
+ } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listOK/lsOK [Premier_id [Dernier_id]]\n";
+ printf " Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n";
+ } elsif ("memo" =~ /^\Q$command/) {
+ 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";
+ } elsif ("name" =~ /^\Q$command/) {
+ printf "name <idcompte>\n";
+ printf " Donne le nom d'un compte.\n";
+ } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+ 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";
+ } elsif ("reloadgm" =~ /^\Q$command/) {
+ printf "reloadGM\n";
+ printf " Reload GM configuration file\n";
+ } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ 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";
+ } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ printf "sex <nomcompte> <sexe>\n";
+ printf " Modifie le sexe d'un compte.\n";
+ printf " <exemple> sex testname Male\n";
+ } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+ 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";
+ } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ 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";
+ } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ 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: 23:59:59\n";
+ printf "timeset <nomcompte> 0\n";
+ printf " Donne une limite de validité illimitée (0 = illimitée).\n";
+ } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+ 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";
+ } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+ 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";
+ } elsif ("version" =~ /^\Q$command/) {
+ printf "version\n";
+ printf " Affiche la version du login-serveur.\n";
+ } elsif ("who" =~ /^\Q$command/) {
+ printf "who <nomcompte>\n";
+ printf " Affiche les informations sur un compte.\n";
+ } elsif ("quit" =~ /^\Q$command/ ||
+ (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
+ printf "quit/end/exit\n";
+ printf " Fin du programme d'administration.\n";
+ } else {
+ if ($receivedcommand ne "") {
+ printf "Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", $receivedcommand;
+ }
+ print << "ENDOFAIDE";
+ aide/help/? -- Affiche cet aide
+ aide/help/? [commande] -- Affiche l'aide de la commande
+ add <nomcompte> <sexe> <motdepasse> -- Crée un compte (sans email)
+ ban/banish aaaa/mm/jj hh:mm:ss <nomcompte>-- Change la date finale de banismnt
+ banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
+ exemple: ba moncompte +1m-2mn1s-2y date finale de banissement
+ banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt
+ banset/bs <nomcompte> 0 -- Dé-banis un compte.
+ block <nom compte> -- Mets le status d'un compte à 5 (blocked by the GM Team)
+ check <nomcompte> <motdepasse> -- Vérifie un mot de passe d'un compte
+ create <nomcompte> <sexe> <email> <motdepasse> -- Crée un compte (avec email)
+ del <nomcompte> -- Supprime un compte
+ email <nomcompte> <email> -- Modifie l'e-mail d'un compte
+ getcount -- Donne le nb de joueurs en ligne
+ gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte
+ id <nomcompte> -- Donne l'id d'un compte
+ info <idcompte> -- Affiche les infos sur un compte
+ kami <message> -- Envoi un message général (en jaune)
+ kamib <message> -- Envoi un message général (en bleu)
+ language <langue> -- Change la langue d'affichage.
+ list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
+ listBan/lsBan [Premier_id [Dernier_id] ]-- Affiche une liste de comptes
+ avec un statut ou bannis
+ listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM
+ listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes
+ sans status et non bannis
+ memo <nomcompte> <memo> -- Modifie le memo d'un compte
+ name <idcompte> -- Donne le nom d'un compte
+ passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte
+ quit/end/exit -- Fin du programme d'administation
+ reloadGM -- Recharger le fichier de config des GM
+ search <expression> -- Cherche des comptes
+ search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX
+ sex <nomcompte> <sexe> -- Modifie le sexe d'un compte
+ state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte
+ timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps à la
+ exemple: ta moncompte +1m-2mn1s-2y limite de validité
+ timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validité
+ timeset/ts <nomcompte> 0 -- limite de validité = illimitée
+ unban/unbanish <nom compte> -- Ote le banissement d'un compte
+ unblock <nom compte> -- Mets le status d'un compte à 0 (Compte ok)
+ version -- Donne la version du login-serveur
+ who <nomcompte> -- Affiche les infos sur un compte
+ENDOFAIDE
+ printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n");
+ }
+ } else {
+ if ("aide" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ 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";
+ } elsif ("help" =~ /^\Q$command/) {
+ 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";
+ } elsif ("add" =~ /^\Q$command/ && $command ne "a") { # check 1 letter command: 'aide' or 'add'?
+ 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";
+ } elsif ($command eq "ban" || ("banish" =~ /^\Q$command/ && length($command) >= 4)) {
+ 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 " The difference with banset is the position of the account name.\n";
+ } elsif (("banadd" =~ /^\Q$command/ || $command eq "ba") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ 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";
+ } elsif (("banset" =~ /^\Q$command/ || $command eq "bs") && $command ne "b") { # check 1 letter command: 'ba' or 'bs'?
+ 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: 23:59:59\n";
+ printf "banset <account_name> 0\n";
+ printf " Set a non-banished account (0 = unbanished).\n";
+ } elsif ("block" =~ /^\Q$command/ && length($command) >= 2) {
+ printf "block <account name>\n";
+ printf " Set state 5 (You have been blocked by the GM Team) to an account.\n";
+ printf " Same command of state <account_name> 5.\n";
+ } elsif ("check" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ 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";
+ } elsif ("create" =~ /^\Q$command/ && $command ne "c") { # check 1 letter command: 'check' or 'create'?
+ 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";
+ } elsif ("del" =~ /^\Q$command/ || "delete" =~ /^\Q$command/) {
+ printf "del <account_name>\n";
+ printf " Remove an account.\n";
+ printf " This order requires confirmation. After confirmation, the account is deleted.\n";
+ } elsif ("email" =~ /^\Q$command/ && $command ne "e") { # check 1 letter command: 'email', 'end' or 'exit'?
+ printf "email <account_name> <email>\n";
+ printf " Modify the e-mail of an account.\n";
+ } elsif ("getcount" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ printf "getcount\n";
+ printf " Give the number of players online on all char-servers.\n";
+ } elsif ("gm" =~ /^\Q$command/ && $command ne "g") { # check 1 letter command: 'getcount' or 'gm'?
+ 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";
+ } elsif ("id" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ printf "id <account_name>\n";
+ printf " Give the id of an account.\n";
+ } elsif ("info" =~ /^\Q$command/ && $command ne "i") { # check 1 letter command: 'id' or 'info'?
+ printf "info <account_id>\n";
+ printf " Display complete information of an account.\n";
+ } elsif ($command eq "kami") { # check all letters command: 'kami' or 'kamib'?
+ printf "kami <message>\n";
+ printf " Sends a broadcast message on all map-server (in yellow).\n";
+ } elsif ($command eq "kamib") { # check all letters command: 'kami' or 'kamib'?
+ printf "kamib <message>\n";
+ printf " Sends a broadcast message on all map-server (in blue).\n";
+ } elsif ("language" =~ /^\Q$command/ && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ printf("language <language>\n");
+ printf(" Change the language of displaying.\n");
+ printf(" Possible languages: Français or English.\n");
+ } elsif (("list" =~ /^\Q$command/ || $command eq "ls") && $command ne "l") { # check 1 letter command: 'list' or 'language'?
+ 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";
+ } elsif (("listban" =~ /^\Q$command/ || $command eq "lsban") && $command ne "l") { # need to specificaly write Ban to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listBan/lsBan [start_id [end_id]]\n";
+ printf " Like list/ls, but only for accounts with state or banished.\n";
+ } elsif (("listgm" =~ /^\Q$command/ || $command eq "lsgm") && $command ne "l") { # need to specificaly write GM to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listGM/lsGM [start_id [end_id]]\n";
+ printf " Like list/ls, but only for GM accounts.\n";
+ } elsif (("listok" =~ /^\Q$command/ || $command eq "lsok") && $command ne "l") { # need to specificaly write OK to have this list # check 1 letter command: 'list' or 'language'?
+ printf "listOK/lsOK [start_id [end_id]]\n";
+ printf " Like list/ls, but only for accounts without state and not banished.\n";
+ } elsif ("memo" =~ /^\Q$command/) {
+ 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";
+ } elsif ("name" =~ /^\Q$command/) {
+ printf "name <account_id>\n";
+ printf " Give the name of an account.\n";
+ } elsif ("passwd" =~ /^\Q$command/ || "password" =~ /^\Q$command/) {
+ 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";
+ } elsif ("reloadgm" =~ /^\Q$command/) {
+ printf "reloadGM\n";
+ printf " Reload GM configuration file\n";
+ } elsif ("search" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ 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";
+ } elsif ("sex" =~ /^\Q$command/ && $command ne "s" && # check 1 letter command: 'search', 'state' or 'sex'?
+ $command ne "se") { # check 2 letters command: 'search' or 'sex'?
+ printf "sex <account_name> <sex>\n";
+ printf " Modify the sex of an account.\n";
+ printf " <example> sex testname Male\n";
+ } elsif ("state" =~ /^\Q$command/ && $command ne "s") { # check 1 letter command: 'search', 'state' or 'sex'?
+ 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";
+ } elsif (("timeadd" =~ /^\Q$command/ || $command eq "ta") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ 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";
+ } elsif (("timeset" =~ /^\Q$command/ || $command eq "ts") && $command ne "t") { # check 1 letter command: 'ta' or 'ts'?
+ printf "timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+ printf " Changes the validity limit of an account.\n";
+ printf " Default time: 23:59:59\n";
+ printf "timeset <account_name> 0\n";
+ printf " Gives an unlimited validity limit (0 = unlimited).\n";
+ } elsif ($command eq "unban" || ("unbanish" =~ /^\Q$command/ && length($command) >= 4)) {
+ printf "unban/unbanish <account name>\n";
+ printf " Remove the banishment of an account.\n";
+ printf " This command works like banset <account_name> 0.\n";
+ } elsif ("unblock" =~ /^\Q$command/ && length($command) >= 4) {
+ 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";
+ } elsif ("version" =~ /^\Q$command/) {
+ printf "version\n";
+ printf " Display the version of the login-server.\n";
+ } elsif ("who" =~ /^\Q$command/) {
+ printf "who <account_name>\n";
+ printf " Displays complete information of an account.\n";
+ } elsif ("quit" =~ /^\Q$command/ ||
+ (("end" =~ /^\Q$command/ || "exit" =~ /^\Q$command/) && $command ne "e")) { # check 1 letter command: 'email', 'end' or 'exit'?\n";
+ printf "quit/end/exit\n";
+ printf " End of the program of administration.\n";
+ } else {
+ if ($receivedcommand ne "") {
+ printf "Unknown command [%s] for help. Displaying of all commands.\n", $receivedcommand;
+ }
+ print << "ENDOFHELP";
+ aide/help/? -- Display this help
+ aide/help/? [command] -- Display the help of the command
+ add <account_name> <sex> <password> -- Create an account with default email
+ ban/banish yyyy/mm/dd hh:mm:ss <account_name> -- Change final date of a ban
+ banadd/ba <account_name> <modifier> -- Add or substract time from the final
+ example: ba apple +1m-2mn1s-2y date of a banishment of an account
+ banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban
+ banset/bs <account_name> 0 -- Un-banish an account
+ block <account name> -- Set state 5 (blocked by the GM Team) to an account
+ check <account_name> <password> -- Check the validity of a password
+ create <account_name> <sex> <email> <passwrd> -- Create an account with email
+ del <account_name> -- Remove an account
+ email <account_name> <email> -- Modify an email of an account
+ getcount -- Give the number of players online
+ gm <account_name> [GM_level] -- Modify the GM level of an account
+ id <account_name> -- Give the id of an account
+ info <account_id> -- Display all information of an account
+ kami <message> -- Sends a broadcast message (in yellow)
+ kamib <message> -- Sends a broadcast message (in blue)
+ language <language> -- Change the language of displaying.
+ list/ls [First_id [Last_id]] -- Display a list of accounts
+ listBan/lsBan [First_id [Last_id]] -- Display a list of accounts
+ with state or banished
+ listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts
+ listOK/lsOK [First_id [Last_id]] -- Display a list of accounts
+ without state and not banished
+ memo <account_name> <memo> -- Modify the memo of an account
+ name <account_id> -- Give the name of an account
+ passwd <account_name> <new_password> -- Change the password of an account
+ quit/end/exit -- End of the program of administation
+ reloadGM -- Reload GM configuration file
+ search <expression> -- Seek accounts
+ search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression
+ sex <nomcompte> <sexe> -- Modify the sex of an account
+ state <account_name> <new_state> <error_message_#7> -- Change the state
+ timeadd/ta <account_name> <modifier> -- Add or substract time from the
+ example: ta apple +1m-2mn1s-2y validity limit of an account
+ timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit
+ timeset/ts <account_name> 0 -- Give a unlimited validity limit
+ unban/unbanish <account name> -- Remove the banishment of an account
+ unblock <account name> -- Set state 0 (Account ok) to an account
+ version -- Gives the version of the login-server
+ who <account_name> -- Display all information of an account
+ENDOFHELP
+ printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n");
+ }
+ }
+
+ return 0;
+}
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the accounts list
+sub listaccount() {
+ my($st, $ed, $listflag) = @_;
+ my($i);
+ my($n) = (0);
+ # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
+ if ($defaultlanguage eq "F") {
+ print " id_compte GM nom_utilisateur sexe count statut\n";
+ } else {
+ print "account_id GM user_name sex count state\n";
+ }
+ print "-------------------------------------------------------------------------------\n";
+ while(1) {
+ print $so pack("vV2", 0x7920, $st, $ed);
+ $so->flush();
+ $buf = readso(4);
+ if (unpack("v", $buf) != 0x7921) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ exit(10);
+ }
+ my($len) = unpack("x2v", $buf);
+ last if ($len <= 4);
+ for($i = 4; $i < $len; $i += 38) {
+ my(@dat) = unpack("VCa24cVV", readso(38));
+ $st = $dat[0] + 1;
+ if ($listflag == 0 ||
+ ($listflag == 1 && $dat[1] > 0) || # check GM flag
+ ($listflag == 3 && $dat[5] != 0) || # check with state or banished
+ ($listflag == 4 && $dat[5] == 0)) { # check without state and not banished
+ printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
+ ($dat[1] == 0 ? " " : $dat[1]),
+ $dat[2],
+ ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
+ $dat[4],
+ (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+ "Unregistered ID",
+ "Incorrect Password",
+ "This ID is expired",
+ "Rejected from Server",
+ "Blocked by the GM Team", # You have been blocked by the GM Team
+ "Your EXE file is too old", # Your Game's EXE file is not the latest version
+ "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
+ "Server is over populated", # Server is jammed due to over populated
+ "No MSG",
+ "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
+ $n++;
+ }
+ }
+ }
+ if ($defaultlanguage eq "F") {
+ if ($n == 0) {
+ print "Aucun compte trouvé.\n";
+ } elsif ($n == 1) {
+ print "1 compte trouvé.\n";
+ } else {
+ print "$n comptes trouvés.\n";
+ }
+ } else {
+ if ($n == 0) {
+ print "No account found.\n";
+ } elsif ($n == 1) {
+ print "1 account found.\n";
+ } else {
+ print "$n accounts found.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: add an account with the default e-mail
+sub addaccount() {
+ my($userid, $sex, $passwd) = @_;
+ if ($userid eq "" || !defined($userid)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> add nomtest Male motdepassetest\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> add testname Male testpass\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+# if ($defaultlanguage eq "F") {
+# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+# } else {
+# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+# }
+# return 101;
+# }
+ $sex = uc(substr($sex, 0, 1));
+ if ($sex !~ /^[MF]$/) {
+ if ($defaultlanguage eq "F") {
+ print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+ } else {
+ print "Illegal gender [$sex]. Please input M or F.\n";
+ }
+ return 103;
+ }
+ if ($passwd eq "") {
+ return 108 if (($passwd = typepasswd()) eq "");
+ }
+ if (verify_password($passwd) == 0) {
+ return 104;
+ }
+ print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, "");
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7931) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 106;
+ }
+ $buf = readso(28);
+ if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
+ } else {
+ print "Account [$userid] creation failed. Same account already exists.\n";
+ }
+ return 107;
+ } else {
+ if ($defaultlanguage eq "F") {
+ printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
+ } else {
+ printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: add an account with an e-mail
+sub createaccount() {
+ my($userid, $sex, $email, $passwd) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> create nomtest Male mon\@email.com motdepassetest\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> create testname Male my\@mail.com testpass\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+# if ($defaultlanguage eq "F") {
+# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+# } else {
+# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+# }
+# return 101;
+# }
+ $sex = uc(substr($sex, 0, 1));
+ if ($sex !~ /^[MF]$/) {
+ if ($defaultlanguage eq "F") {
+ print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+ } else {
+ print "Illegal gender [$sex]. Please input M or F.\n";
+ }
+ return 103;
+ }
+ if (length($email) < 3) {
+ if ($defaultlanguage eq "F") {
+ print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
+ } else {
+ print "Email is too short [$email]. Please input a valid e-mail.\n";
+ }
+ return 109;
+ }
+ if (length($email) > 39) {
+ if ($defaultlanguage eq "F") {
+ print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
+ } else {
+ print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
+ }
+ return 109;
+ }
+ if (verify_email($email) == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Email incorrecte [$email]. Entrez une e-mail valide svp.\n";
+ } else {
+ print "Invalid email [$email]. Please input a valid e-mail.\n";
+ }
+ return 109;
+ }
+ if ($passwd eq "") {
+ return 108 if (($passwd = typepasswd()) eq "");
+ }
+ if (verify_password($passwd) == 0) {
+ return 104;
+ }
+ print $so pack("va24a24a1a40", 0x7930, $userid, $passwd, $sex, $email);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7931) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 106;
+ }
+ $buf = readso(28);
+ if (unpack("V", $buf) == -1 || unpack("V", $buf) == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec à la création du compte [$userid]. Un compte identique existe déjà.\n";
+ } else {
+ print "Account [$userid] creation failed. Same account already exists.\n";
+ }
+ return 107;
+ } else {
+ if ($defaultlanguage eq "F") {
+ printf "Compte [$userid] créé avec succès [id: %d].\n", unpack("V",$buf);
+ } else {
+ printf "Account [$userid] is successfully created [id: %d].\n", unpack("V",$buf);
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: deletion of an account
+sub delaccount() {
+ my($userid) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> del nomtestasupprimer\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> del testnametodelete\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if ($defaultlanguage eq "F") {
+ print "** Etes-vous vraiment sûr de vouloir SUPPRIMER le compte [$userid]? (o/n) ";
+ } else {
+ print "** Are you really sure to DELETE account [$userid]? (y/n) ";
+ }
+ if (lc(substr(<STDIN>, 0, 1)) !~ /[oy]/) {
+ if ($defaultlanguage eq "F") {
+ print "Suppression annulée\n.";
+ } else {
+ print "Deletion canceled\n";
+ }
+ return 121;
+ }
+ print $so pack("va24", 0x7932, $userid);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7933) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 122;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec de la suppression du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] deletion failed. Account doesn't exist.\n";
+ }
+ return 123;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Compte [$name][id: $id2] SUPPRIME avec succès.\n";
+ } else {
+ print "Account [$name][id: $id2] is successfully DELETED.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modification of a password
+sub changepasswd() {
+ my($userid, $passwd) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> passwd nomtest nouveaumotdepasse\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> passwd testname newpassword\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if ($passwd eq "") {
+ return 134 if (($passwd = typepasswd()) eq "");
+ }
+ if (verify_password($passwd) == 0) {
+ return 131;
+ }
+ print $so pack("va24a24", 0x7934, $userid,$passwd);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7935) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 132;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec de la modification du mot de passe du compte [$userid].\n";
+ print "Le compte [$userid] n'existe pas.\n";
+ } else {
+ print "Account [$userid] password changing failed.\n";
+ print "Account [$userid] doesn't exist.\n";
+ }
+ return 133;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Modification du mot de passe du compte [$name][id: $id2] réussie.\n";
+ } else {
+ print "Account [$name][id: $id2] password successfully changed.\n";
+ }
+ }
+ return 130;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modification of an account e-mail
+sub changeemail() {
+ my($userid, $email) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> email testname nouveauemail\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> email testname newemail\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if (length($email) < 3) {
+ if ($defaultlanguage eq "F") {
+ print "Email trop courte [$email]. Entrez une e-mail valide svp.\n";
+ } else {
+ print "Email is too short [$email]. Please input a valid e-mail.\n";
+ }
+ return 109;
+ }
+ if (length($email) > 39) {
+ if ($defaultlanguage eq "F") {
+ print "Email trop longue [$email]. Entrez une e-mail de 39 caractères maximum svp.\n";
+ } else {
+ print "Email is too long [$email]. Please input an e-mail with 39 bytes at the most.\n";
+ }
+ return 109;
+ }
+ if (verify_email($email) == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Email incorrect [$email]. Entrez une e-mail valide svp.\n";
+ } else {
+ print "Invalid email [$email]. Please input a valid e-mail.\n";
+ }
+ return 109;
+ }
+ print $so pack("va24a40", 0x7940, $userid, $email);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7941) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 162;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec de la modification de l'e-mail du compte [$userid].\n";
+ print "Le compte [$userid] n'existe pas.\n";
+ } else {
+ print "Account [$userid] e-mail changing failed.\n";
+ print "Account [$userid] doesn't exist.\n";
+ }
+ return 133;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Modification de l'e-mail du compte [$name][id: $id2] réussie.\n";
+ } else {
+ print "Account [$name][id: $id2] e-mail successfully changed.\n";
+ }
+ }
+ return 160;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: search of accounts
+sub searchaccount() {
+ my($p1, $p2) = @_;
+ my($exp) = ("");
+ if ($p1 eq "-e" || $p1 eq "-r" || $p1 eq "--regex" || $p1 eq "--expr") {
+ if ($p2 eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez une expression régulière ou utilisez 'ls' pour avoir tous les comptes.\n";
+ } else {
+ print "Input a regular expression or use 'ls' to obtain all accounts.\n";
+ }
+ return 141;
+ }
+ $exp = $p2;
+ } else {
+ if ($p1 eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez une chaîne ou utilisez 'ls' pour avoir tous les comptes.\n";
+ } else {
+ print "Input a string or use 'ls' to obtain all accounts.\n";
+ }
+ return 141;
+ }
+ my($c) = 0;
+ $exp = lc($p1);
+ $exp =~ s/([\@])/\\$1/g;
+ $c += $exp =~ s/([\-\[\]])/\\$1/g;
+ $c += $exp =~ s/([\*\?])/.$1/g;
+ $c += $exp =~ s/\\\[(.)\\\-(.)\\\]/[$1-$2]/g;
+ $exp = "^$exp\$" if $c;
+ }
+ if (eval{ "" =~ /$exp/; }, $@) {
+ if ($defaultlanguage eq "F") {
+ print "Expression régulière non reconnue.\n";
+ } else {
+ print "Regular-Expression compiling failed.\n";
+ }
+ return 141;
+ }
+ my($i);
+ my($n, $st) = (0, 0);
+ # 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567
+ if ($defaultlanguage eq "F") {
+ print " id_compte GM nom_utilisateur sexe count statut\n";
+ } else {
+ print "account_id GM user_name sex count state\n";
+ }
+ print "-------------------------------------------------------------------------------\n";
+ while(1) {
+ print $so pack("vV2", 0x7920, $st, 0);
+ $so->flush();
+ $buf = readso(4);
+ if (unpack("v", $buf) != 0x7921) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ exit(10);
+ }
+ my($len) = unpack("x2v", $buf);
+ last if ($len <= 4);
+ for($i = 4; $i < $len; $i += 38) {
+ my(@dat) = unpack("VCa24cVV", readso(38));
+ $st = $dat[0] + 1;
+ next if (lc($dat[2]) !~ /$exp/);
+ printf "%10d %2s %-24s%-5s %6d %-27s\n", $dat[0],
+ ($dat[1] == 0 ? " " : $dat[1]),
+ $dat[2],
+ ($defaultlanguage eq "F" ? ("Femme","Male","Servr")[$dat[3]] : ("Femal","Male","Servr")[$dat[3]]),
+ $dat[4],
+ (($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+ "Unregistered ID",
+ "Incorrect Password",
+ "This ID is expired",
+ "Rejected from Server",
+ "Blocked by the GM Team", # You have been blocked by the GM Team
+ "Your EXE file is too old", # Your Game's EXE file is not the latest version
+ "Banishement or\n Prohibited to login until %s", # You are Prohibited to log in until %s
+ "Server is over populated", # Server is jammed due to over populated
+ "No MSG",
+ "This ID is totally erased")[$dat[5] == 100 ? 10 : $dat[5]]; # This ID has been totally erased
+ $n++;
+ }
+ }
+ if ($defaultlanguage eq "F") {
+ if ($n == 0) {
+ print "Aucun compte trouvé.\n";
+ } elsif ($n == 1) {
+ print "1 compte trouvé.\n";
+ } else {
+ print "$n comptes trouvés.\n";
+ }
+ } else {
+ if ($n == 0) {
+ print "No account found.\n";
+ } elsif ($n == 1) {
+ print "1 account found.\n";
+ } else {
+ print "$n accounts found.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modify the sex of an account
+sub changesex() {
+ my($userid, $sex) = @_;
+ if ($userid eq "" || !defined($userid)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> sex nomtest Male\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> sex testname Male\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+# if ($defaultlanguage eq "F") {
+# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+# } else {
+# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+# }
+# return 101;
+# }
+ $sex = uc(substr($sex, 0, 1));
+ if ($sex !~ /^[MF]$/) {
+ if ($defaultlanguage eq "F") {
+ print "Sexe incorrect [$sex]. Entrez M ou F svp.\n";
+ } else {
+ print "Illegal gender [$sex]. Please input M or F.\n";
+ }
+ return 103;
+ }
+ print $so pack("va24a1", 0x793c, $userid, $sex);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x793d) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement du sexe du compte [$userid].\n";
+ print "Le compte n'existe pas ou le sexe est déjà celui demandé.\n";
+ } else {
+ print "Account [$userid] sex changing failed.\n";
+ print "Account doesn't exist or the sex is already the good sex.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Sexe du compte [$name][id: $id2] changé avec succès.\n";
+ } else {
+ print "Account [$name][id: $id2] sex successfully changed.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: modify the GM level of an account
+sub changegmlevel() {
+ my($userid, $gm_level) = @_;
+ if ($userid eq "" || !defined($userid)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> gm nomtest 80\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> gm testname 80\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+# if ($userid =~ /[^A-Za-z0-9\@-_]/) {
+# if ($defaultlanguage eq "F") {
+# print "Caractère interdit trouvé dans le nom du compte ".$`."[${&}]${'}\n";
+# } else {
+# print "Illegal character found in the account name ".$`."[${&}]${'}\n";
+# }
+# return 101;
+# }
+ $gm_level = int($gm_level);
+ if ($gm_level < 0 || $gm_level > 99) {
+ if ($defaultlanguage eq "F") {
+ print "Niveau de GM incorrect [$gm_level]. Entrez une valeur de 0 à 99 svp.\n";
+ } else {
+ print "Illegal GM level [$gm_level]. Please input a value from 0 to 99.\n";
+ }
+ return 103;
+ }
+ print $so pack("va24C", 0x793e, $userid, $gm_level);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x793f) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement du niveau de GM du compte [$userid].\n";
+ print "Le compte n'existe pas, le niveau de GM est déjà celui demandé,\n";
+ print "ou il est impossible de modifier le fichier des comptes GM.\n";
+ } else {
+ print "Account [$userid] GM level changing failed.\n";
+ print "Account doesn't exist, the GM level is already the good GM level,\n";
+ print "or it's impossible to modify the GM accounts file.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Niveau de GM du compte [$name][id: $id2] changé avec succès.\n";
+ } else {
+ print "Account [$name][id: $id2] GM level successfully changed.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Modification of a state
+sub changestate {
+ my($userid, $s, $error_message) = @_;
+ # Valid values: 0: ok, or value of the 0x006a packet + 1
+ if ($s eq "" || (($s < 0 || $s > 9) && $s != 100)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez une des valeurs suivantes svp:\n";
+ print " 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n";
+ } else {
+ print "Please input one of these values:\n";
+ print " 0 = Account ok 6 = Your Game's EXE file is not the latest version\n";
+ }
+ print " 1 = Unregistered ID 7 = You are Prohibited to log in until %s\n";
+ print " 2 = Incorrect Password 8 = Server is jammed due to over populated\n";
+ print " 3 = This ID is expired 9 = No MSG\n";
+ print " 4 = Rejected from Server 100 = This ID has been totally erased\n";
+ print " 5 = You have been blocked by the GM Team\n";
+ if ($defaultlanguage eq "F") {
+ print "<exemples> state nomtest 5\n";
+ print " state nomtest 7 fin de votre ban\n";
+ print " block <nom du compte>\n";
+ print " unblock <nom du compte>\n";
+ } else {
+ print "<examples> state testname 5\n";
+ print " state testname 7 end of your ban\n";
+ print " block <account name>\n";
+ print " unblock <account name>\n";
+ }
+ return 151;
+ }
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemples> state nomtest 5\n";
+ print " state nomtest 7 fin de votre ban\n";
+ print " block <nom du compte>\n";
+ print " unblock <nom du compte>\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<examples> state testname 5\n";
+ print " state testname 7 end of your ban\n";
+ print " block <account name>\n";
+ print " unblock <account name>\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if ($s != 7) {
+ $error_message = "-";
+ } else {
+ if (length($error_message) < 1) {
+ if ($defaultlanguage eq "F") {
+ print "Message d'erreur trop court. Entrez un message de 1-19 caractères.\n";
+ } else {
+ print "Error message is too short. Please input a message of 1-19 bytes.\n";
+ }
+ return 102;
+ }
+ if (length($error_message) > 19) {
+ if ($defaultlanguage eq "F") {
+ print "Message d'erreur trop long. Entrez un message de 1-19 caractères.\n";
+ } else {
+ print "Error message is too long. Please input a message of 1-19 bytes.\n";
+ }
+ return 102;
+ }
+ }
+ print $so pack("va24Va20", 0x7936, $userid, $s, $error_message);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7937) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(32);
+ my(@dat) = unpack("Va24V", $buf);
+ while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+ chop($dat[1]);
+ };
+ if ($dat[0] != -1 && $dat[0] != 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Statut du compte [$dat[1]][id: $dat[0]] changé avec succès en [";
+ } else {
+ print "Account [$dat[1]][id: $dat[0]] state successfully changed in [";
+ }
+ print ((($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+ "Unregistered ID",
+ "Incorrect Password",
+ "This ID is expired",
+ "Rejected from Server",
+ "You have been blocked by the GM Team",
+ "Your Game's EXE file is not the latest version",
+ "You are Prohibited to log in until %s",
+ "Server is jammed due to over populated",
+ "No MSG",
+ "This ID has been totally erased")[$dat[2] == 100 ? 10 : $dat[2]]);
+ print "].\n";
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement du statut du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] state changing failed. Account doesn't exist.\n";
+ }
+ }
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Displaying of the number of online players
+sub getlogincount {
+ # Request to the login-server
+ print $so pack("v", 0x7938);
+ $so->flush();
+
+ $buf = readso(4);
+ # Connection failed
+ if (unpack("v", $buf) != 0x7939) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ exit(3);
+ }
+
+ # Get length of the received packet
+ my($len) = unpack("x2v", $buf) - 4;
+
+ # Read information of the servers
+ if ($len < 1) {
+ if ($defaultlanguage eq "F") {
+ printf " Aucun serveur n'est connecté au login serveur.\n";
+ } else {
+ printf " No server is connected to the login-server.\n";
+ }
+ } else {
+ my(@slist) = ();
+ for(; $len > 0; $len -= 32) {
+ my($name, $count) = unpack("x6 a20 V", readso(32));
+ $name = substr($name, 0, index($name, "\0"));
+ push @slist, [ $name, $count ];
+ }
+ # Displaying of result
+ my($i);
+ if ($defaultlanguage eq "F") {
+ printf " Nombre de joueurs en ligne (serveur: nb):\n";
+ } else {
+ printf " Number of online players (server: number).\n";
+ }
+ foreach $i(@slist) {
+ printf " %-20s : %5d\n", $i->[0], $i->[1];
+ }
+ }
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Modification of a memo field
+sub changememo {
+ my($userid, $memo) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> memo nomtest nouveau memo\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> memo testname new memo\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if (length($memo) > 254) {
+ if ($defaultlanguage eq "F") {
+ print "Mémo trop long (".length($memo)." caractères).\n";
+ print "Entrez un mémo de 254 caractères maximum svp.\n";
+ } else {
+ print "Memo is too long (".length($memo)." characters).\n";
+ print "Please input a memo of 254 bytes at the maximum.\n";
+ }
+ return 102;
+ }
+ if (length($memo) == 0) {
+ print $so pack("va24v", 0x7942, $userid, 0);
+ } else {
+ print $so pack("va24va".length($memo), 0x7942, $userid, length($memo), $memo);
+ }
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7943) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement du mémo du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] memo changing failed. Account doesn't exist.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Mémo du compte [$name][id: $id2] changé avec succès.\n";
+ } else {
+ print "Account [$name][id: $id2] memo successfully changed.\n";
+ }
+ }
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to obtain an account id
+sub idaccount() {
+ my($userid) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> id nomtest\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> id testname\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ print $so pack("va24", 0x7944, $userid);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7945) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 122;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Impossible de trouver l'id du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Unabled to find the account [$userid] id. Account doesn't exist.\n";
+ }
+ return 123;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Le compte [$name] a pour id: $id2.\n";
+ } else {
+ print "The account [$name] have the id: $id2.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to obtain an account name
+sub nameaccount() {
+ my($id) = @_;
+ if ($id < 0) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un id ayant une valeur positive svp.\n";
+ } else {
+ print "Please input a positive value for the id.\n";
+ }
+ return 136;
+ }
+ print $so pack("vV", 0x7946, $id);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7947) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 122;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if (length($name) == 0 || $name eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
+ } else {
+ print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
+ }
+ return 123;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Le compte [id: $id2] a pour nom: $name.\n";
+ } else {
+ print "The account [id: $id2] have the name: $name.\n";
+ }
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Set a validity limit of an account
+sub timesetaccount() {
+ my($userid, $date, $time) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
+ print " timeset <nom_du_compte> 0 (0 = illimité)\n";
+ printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+ print " timeset <account_name> 0 (0 = unlimited)\n";
+ printf " Default time [hh:mm:ss]: 23:59:59\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ my($year, $month, $day) = split(/[.\-\/]/, $date);
+ my($hour, $minute, $second) = split(/:/, $time);
+ if ($time eq "") {
+ $hour = 23;
+ $minute = 59;
+ $second = 59;
+ }
+ my($timestamp);
+ if ($year eq "" ||
+ ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+ } else {
+ print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+ }
+ return 102;
+ }
+ if ($year == 0) {
+ $timestamp = 0;
+ } else {
+ if ($year < 70) {
+ $year = $year + 100;
+ }
+ if ($year >= 1900) {
+ $year = $year - 1900;
+ }
+ if ($month < 1 || $month > 12) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un mois correct svp (entre 1 et 12).\n";
+ } else {
+ print "Please give a correct value for the month (from 1 to 12).\n";
+ }
+ return 102;
+ }
+ $month = $month - 1;
+ if ($day < 1 || $day > 31) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un jour correct svp (entre 1 et 31).\n";
+ } else {
+ print "Please give a correct value for the day (from 1 to 31).\n";
+ }
+ return 102;
+ }
+ if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
+ ($month == 1 && $day > 29)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un jour correct en fonction du mois svp.\n";
+ } else {
+ print "Please give a correct value for a day of this month.\n";
+ }
+ return 102;
+ }
+ if ($hour < 0 || $hour > 23) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez une heure correcte svp (entre 0 et 23).\n";
+ } else {
+ print "Please give a correct value for the hour (from 0 to 23).\n";
+ }
+ return 102;
+ }
+ if ($minute < 0 || $minute > 59) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez des minutes correctes svp (entre 0 et 59).\n";
+ } else {
+ print "Please give a correct value for the minutes (from 0 to 59).\n";
+ }
+ return 102;
+ }
+ if ($second < 0 || $second > 59) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez des secondes correctes svp (entre 0 et 59).\n";
+ } else {
+ print "Please give a correct value for the seconds (from 0 to 59).\n";
+ }
+ return 102;
+ }
+ $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
+ if ($timestamp == undef) {
+ if ($defaultlanguage eq "F") {
+ print "Date incorrecte.\n";
+ print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+ } else {
+ print "Invalid date.\n";
+ print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+ }
+ return 102;
+ }
+ }
+
+ print $so pack("va24V", 0x7948, $userid, $timestamp);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7949) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(32);
+ my(@dat) = unpack("Va24V", $buf);
+ while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+ chop($dat[1]);
+ };
+ if ($dat[0] != -1 && $dat[0] != 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+ ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+ } else {
+ print "Validity Limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
+ ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
+ }
+ # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
+ }
+ }
+
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Add/substract time to the validity limit of an account
+sub timeaddaccount() {
+ my($userid, $modif) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
+ print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+ print " et 6 ans dans le même temps.\n";
+ } else {
+ print "Please input an account name.\n";
+ print " <example> timeadd testname +1m-2mn1s-6y\n";
+ print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
+ print " and 6 years at the same time.\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ my($year, $month, $day) = (0, 0 ,0);
+ my($hour, $minute, $second) = (0, 0 ,0);
+
+ $modif = lc($modif);
+ while (length($modif) > 0) {
+ my($value) = int($modif);
+ if ($value == 0) {
+ $modif = substr($modif, 1);
+ } else {
+ if (substr($modif, 0, 1) =~ /[\-\+]/) {
+ $modif = substr($modif, 1);
+ }
+ while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
+ $modif = substr($modif, 1);
+ }
+ if (index($modif, "s") == 0) {
+ $second = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "mn") == 0) {
+ $minute = $value;
+ $modif = substr($modif, 2);
+ } elsif (index($modif, "h") == 0) {
+ $hour = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
+ $day = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "m") == 0) {
+ $month = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
+ $year = $value;
+ $modif = substr($modif, 1);
+ } else {
+ $modif = substr($modif, 1);
+ }
+ }
+ }
+
+ if ($defaultlanguage eq "F") {
+ print " année: $year\n";
+ print " mois: $month\n";
+ print " jour: $day\n";
+ print " heure: $hour\n";
+ print " minute: $minute\n";
+ print " seconde: $second\n";
+ } else {
+ print " year: $year\n";
+ print " month: $month\n";
+ print " day: $day\n";
+ print " hour: $hour\n";
+ print " minute: $minute\n";
+ print " second: $second\n";
+ }
+
+ if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Vous devez entrer un ajustement avec cette commande, svp:\n";
+ print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
+ print " Element modifié:\n";
+ print " a ou y: année\n";
+ print " m: mois\n";
+ print " j ou d: jour\n";
+ print " h: heure\n";
+ print " mn: minute\n";
+ print " s: seconde\n";
+ print " <exemple> timeadd nomtest +1m-2mn1s-6y\n";
+ print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+ print " et 6 ans dans le même temps.\n";
+ } else {
+ print "Please give an adjustment with this command:\n";
+ print " Adjustment value (-1, 1, +1, etc...)\n";
+ print " Modified element:\n";
+ print " a or y: year\n";
+ print " m: month\n";
+ print " j or d: day\n";
+ print " h: hour\n";
+ print " mn: minute\n";
+ print " s: second\n";
+ print " <example> timeadd testname +1m-2mn1s-6y\n";
+ print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
+ print " and 6 years at the same time.\n";
+ }
+ return 137;
+ }
+ if ($year > 127 || $year < -127) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the years (from -127 to 127).\n";
+ }
+ return 137;
+ }
+ if ($month > 255 || $month < -255) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the months (from -255 to 255).\n";
+ }
+ return 137;
+ }
+ if ($day > 32767 || $day < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($hour > 32767 || $hour < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($minute > 32767 || $minute < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($second > 32767 || $second < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+
+ print $so pack("va24vvvvvv", 0x7950, $userid, $year, $month, $day, $hour, $minute, $second);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7951) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(32);
+ my(@dat) = unpack("Va24V", $buf);
+ while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+ chop($dat[1]);
+ };
+ if ($dat[0] == -1 || $dat[0] == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement de la validité du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] validity limit changing failed. Account doesn't exist.\n";
+ }
+ } elsif ($dat[2] == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Limite de validité du compte [$dat[1]][id: $dat[0]] inchangée.\n";
+ print "Le compte a une validité illimitée ou\n";
+ print "la modification est impossible avec les ajustements demandés.\n";
+ } else {
+ print "Validity limit of the account [$dat[1]][id: $dat[0]] unchanged.\n";
+ print "The account have an unlimited validity limit or\n";
+ print "the changing is impossible with the proposed adjustments.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Limite de validité du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+ ($dat[2] == 0 ? "en [illimité].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+ } else {
+ print "Validity limit of the account [$dat[1]][id: $dat[0]] successfully changed ".
+ ($dat[2] == 0 ? "to [unlimited].\n" : "to be until ".(POSIX::ctime($dat[2])));
+ }
+ # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+ }
+
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Set the final date of a banishment of an account
+sub bansetaccount() {
+ my($userid, $date, $time) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n";
+ print " banset <nom_du_compte> 0 (0 = dé-bani)\n";
+ print " ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n";
+ print " unban/unbanish <nom du compte>\n";
+ printf " Heure par défaut [hh:mm:ss]: 23:59:59\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n";
+ print " banset <account_name> 0 (0 = un-banished)\n";
+ print " ban/banish yyyy/mm/dd hh:mm:ss <account name>\n";
+ print " unban/unbanish <account name>\n";
+ printf " Default time [hh:mm:ss]: 23:59:59\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ my($year, $month, $day) = split(/[.\-\/]/, $date);
+ my($hour, $minute, $second) = split(/:/, $time);
+ if ($time eq "") {
+ $hour = 23;
+ $minute = 59;
+ $second = 59;
+ }
+ my($timestamp);
+ if ($year eq "" ||
+ ($year != 0 && ($month eq "" || $day eq "" || $hour eq "" || $minute eq "" || $second eq ""))) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+ } else {
+ print "Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+ }
+ return 102;
+ }
+ if ($year == 0) {
+ $timestamp = 0;
+ } else {
+ if ($year < 70) {
+ $year = $year + 100;
+ }
+ if ($year >= 1900) {
+ $year = $year - 1900;
+ }
+ if ($month < 1 || $month > 12) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un mois correct svp (entre 1 et 12).\n";
+ } else {
+ print "Please give a correct value for the month (from 1 to 12).\n";
+ }
+ return 102;
+ }
+ $month = $month - 1;
+ if ($day < 1 || $day > 31) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un jour correct svp (entre 1 et 31).\n";
+ } else {
+ print "Please give a correct value for the day (from 1 to 31).\n";
+ }
+ return 102;
+ }
+ if ((($month == 3 || $month == 5 || $month == 8 || $month == 10) && $day > 30) ||
+ ($month == 1 && $day > 29)) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un jour correct en fonction du mois svp.\n";
+ } else {
+ print "Please give a correct value for a day of this month.\n";
+ }
+ return 102;
+ }
+ if ($hour < 0 || $hour > 23) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez une heure correcte svp (entre 0 et 23).\n";
+ } else {
+ print "Please give a correct value for the hour (from 0 to 23).\n";
+ }
+ return 102;
+ }
+ if ($minute < 0 || $minute > 59) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez des minutes correctes svp (entre 0 et 59).\n";
+ } else {
+ print "Please give a correct value for the minutes (from 0 to 59).\n";
+ }
+ return 102;
+ }
+ if ($second < 0 || $second > 59) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez des secondes correctes svp (entre 0 et 59).\n";
+ } else {
+ print "Please give a correct value for the seconds (from 0 to 59).\n";
+ }
+ return 102;
+ }
+ $timestamp = POSIX::mktime($second, $minute, $hour, $day, $month, $year, 0, 0, -1); # -1: no winter/summer time modification
+ if ($timestamp == undef) {
+ if ($defaultlanguage eq "F") {
+ print "Date incorrecte.\n";
+ print "Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n";
+ } else {
+ print "Invalid date.\n";
+ print "Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n";
+ }
+ return 102;
+ }
+ }
+
+ print $so pack("va24V", 0x794a, $userid, $timestamp);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x794b) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(32);
+ my(@dat) = unpack("Va24V", $buf);
+ while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+ chop($dat[1]);
+ };
+ if ($dat[0] != -1 && $dat[0] != 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+ ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+ } else {
+ print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
+ ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
+ }
+ # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
+ }
+ }
+
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Add/substract time to the final date of a banishment of an account
+sub banaddaccount() {
+ my($userid, $modif) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
+ print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+ print " et 6 ans dans le même temps.\n";
+ } else {
+ print "Please input an account name.\n";
+ print " <example> banadd testname +1m-2mn1s-6y\n";
+ print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
+ print " and 6 years at the same time.\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ my($year, $month, $day) = (0, 0 ,0);
+ my($hour, $minute, $second) = (0, 0 ,0);
+
+ $modif = lc($modif);
+ while (length($modif) > 0) {
+ my($value) = int($modif);
+ if ($value == 0) {
+ $modif = substr($modif, 1);
+ } else {
+ if (substr($modif, 0, 1) =~ /[\-\+]/) {
+ $modif = substr($modif, 1);
+ }
+ while (length($modif) > 0 && substr($modif, 0, 1) =~ /[0-9]/) {
+ $modif = substr($modif, 1);
+ }
+ if (index($modif, "s") == 0) {
+ $second = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "mn") == 0) {
+ $minute = $value;
+ $modif = substr($modif, 2);
+ } elsif (index($modif, "h") == 0) {
+ $hour = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "d") == 0 || index($modif, "j") == 0) {
+ $day = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "m") == 0) {
+ $month = $value;
+ $modif = substr($modif, 1);
+ } elsif (index($modif, "y") == 0 || index($modif, "a") == 0) {
+ $year = $value;
+ $modif = substr($modif, 1);
+ } else {
+ $modif = substr($modif, 1);
+ }
+ }
+ }
+
+ if ($defaultlanguage eq "F") {
+ print " année: $year\n";
+ print " mois: $month\n";
+ print " jour: $day\n";
+ print " heure: $hour\n";
+ print " minute: $minute\n";
+ print " seconde: $second\n";
+ } else {
+ print " year: $year\n";
+ print " month: $month\n";
+ print " day: $day\n";
+ print " hour: $hour\n";
+ print " minute: $minute\n";
+ print " second: $second\n";
+ }
+
+ if ($year == 0 && $month == 0 && $day == 0 && $hour == 0 && $minute == 0 && $second == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Vous devez entrer un ajustement avec cette commande, svp:\n";
+ print " Valeur d'ajustement (-1, 1, +1, etc...)\n";
+ print " Element modifié:\n";
+ print " a ou y: année\n";
+ print " m: mois\n";
+ print " j ou d: jour\n";
+ print " h: heure\n";
+ print " mn: minute\n";
+ print " s: seconde\n";
+ print " <exemple> banadd nomtest +1m-2mn1s-6y\n";
+ print " Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n";
+ print " et 6 ans dans le même temps.\n";
+ } else {
+ print "Please give an adjustment with this command:\n";
+ print " Adjustment value (-1, 1, +1, etc...)\n";
+ print " Modified element:\n";
+ print " a or y: year\n";
+ print " m: month\n";
+ print " j or d: day\n";
+ print " h: hour\n";
+ print " mn: minute\n";
+ print " s: second\n";
+ print " <example> banadd testname +1m-2mn1s-6y\n";
+ print " this example adds 1 month and 1 second, and substracts 2 minutes\n";
+ print " and 6 years at the same time.\n";
+ }
+ return 137;
+ }
+ if ($year > 127 || $year < -127) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement d'années correct (de -127 à 127), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the years (from -127 to 127).\n";
+ }
+ return 137;
+ }
+ if ($month > 255 || $month < -255) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de mois correct (de -255 à 255), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the months (from -255 to 255).\n";
+ }
+ return 137;
+ }
+ if ($day > 32767 || $day < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de jours correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the days (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($hour > 32767 || $hour < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement d'heures correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the hours (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($minute > 32767 || $minute < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de minutes correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the minutes (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+ if ($second > 32767 || $second < -32767) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un ajustement de secondes correct (de -32767 à 32767), svp.\n";
+ } else {
+ print "Please give a correct adjustment for the seconds (from -32767 to 32767).\n";
+ }
+ return 137;
+ }
+
+ print $so pack("va24vvvvvv", 0x794c, $userid, $year, $month, $day, $hour, $minute, $second);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x794d) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(32);
+ my(@dat) = unpack("Va24V", $buf);
+ while (length($dat[1]) > 0 && substr($dat[1], length($dat[1])-1, 1) eq chr(0)) {
+ chop($dat[1]);
+ };
+ if ($dat[0] == -1 || $dat[0] == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Echec du changement de la date finale de banissement du compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Account [$userid] final date of banishment changing failed. Account doesn't exist.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Date finale de banissement du compte [$dat[1]][id: $dat[0]] changée avec succès ".
+ ($dat[2] == 0 ? "en [dé-bannie].\n" : "pour être jusqu'au ".(POSIX::ctime($dat[2])));
+ } else {
+ print "Final date of banishment of the account [$dat[1]][id: $dat[0]] successfully changed ".
+ ($dat[2] == 0 ? "to [unbanished].\n" : "to be until ".(POSIX::ctime($dat[2])));
+ }
+ # localtime($dat[2]) is also possible to display instead of POSIX::ctime.
+ }
+
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to displaying information about an account (by its name)
+sub whoaccount() {
+ my($userid) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> who nomtest\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> who testname\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+
+ print $so pack("va24", 0x7952, $userid);
+ $so->flush();
+
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7953) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 122;
+ }
+ my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
+ my($memo) = "";
+ if ($memo_size > 0) {
+ $memo = unpack("a".$memo_size, readso($memo_size));
+ }
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
+ chop($error_message);
+ };
+ while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
+ chop($last_login);
+ };
+ while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
+ chop($last_ip);
+ };
+ while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
+ chop($email);
+ };
+ while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
+ chop($memo);
+ };
+
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Impossible de trouver le compte [$userid]. Le compte n'existe pas.\n";
+ } else {
+ print "Unabled to find the account [$userid]. Account doesn't exist.\n";
+ }
+ return 123;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Le compte [$userid] a les caractéristiques suivantes:\n";
+ } else {
+ print "The account [$userid] is set with:\n";
+ }
+ if ($GM_level == 0) {
+ print " Id: $id2 (non-GM)\n";
+ } else {
+ if ($defaultlanguage eq "F") {
+ print " Id: $id2 (GM niveau $GM_level)\n";
+ } else {
+ print " Id: $id2 (GM level $GM_level)\n";
+ }
+ }
+ if ($defaultlanguage eq "F") {
+ print " Nom: '$name'\n";
+ print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
+ } else {
+ print " Name: '$name'\n";
+ print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
+ }
+ print " E-mail: $email\n";
+ if ($status == 7) {
+ print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
+ } else {
+ print " Statut: $status [".(
+ ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+ "Unregistered ID",
+ "Incorrect Password",
+ "This ID is expired",
+ "Rejected from Server",
+ "You have been blocked by the GM Team",
+ "Your Game's EXE file is not the latest version",
+ "You are Prohibited to log in until %s",
+ "Server is jammed due to over populated",
+ "No MSG",
+ "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
+ }
+ if ($defaultlanguage eq "F") {
+ print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
+ print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
+ print " Dernière connexion le: $last_login (ip: $last_ip)\n";
+ print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
+ } else {
+ print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
+ print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
+ print " Last connection at: $last_login (ip: $last_ip)\n";
+ print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
+ }
+ print " Memo: '$memo'\n";
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to displaying information about an account (by its id)
+sub infoaccount() {
+ my($id) = @_;
+ if ($id < 0) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un id ayant une valeur positive svp.\n";
+ } else {
+ print "Please input a positive value for the id.\n";
+ }
+ return 136;
+ }
+
+ print $so pack("vV", 0x7954, $id);
+ $so->flush();
+
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x7953) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 122;
+ }
+ my($id2, $GM_level, $name, $sex, $count, $status, $error_message, $last_login, $last_ip, $email, $validite, $ban_date, $memo_size) = unpack("VCa24cVVa20a24a16a40VVv", readso(148));
+ my($memo) = "";
+ if ($memo_size > 0) {
+ $memo = unpack("a".$memo_size, readso($memo_size));
+ }
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ while (length($error_message) > 0 && substr($error_message, length($error_message)-1, 1) eq chr(0)) {
+ chop($error_message);
+ };
+ while (length($last_login) > 0 && substr($last_login, length($last_login)-1, 1) eq chr(0)) {
+ chop($last_login);
+ };
+ while (length($last_ip) > 0 && substr($last_ip, length($last_ip)-1, 1) eq chr(0)) {
+ chop($last_ip);
+ };
+ while (length($email) > 0 && substr($email, length($email)-1, 1) eq chr(0)) {
+ chop($email);
+ };
+ while (length($memo) > 0 && substr($memo, length($memo)-1, 1) eq chr(0)) {
+ chop($memo);
+ };
+
+ if (length($name) == 0 || $name eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Impossible de trouver le nom du compte [id: $id2]. Le compte n'existe pas.\n";
+ } else {
+ print "Unabled to find the account [id: $id2] name. Account doesn't exist.\n";
+ }
+ return 123;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Le compte [id: $id2] a les caractéristiques suivantes:\n";
+ } else {
+ print "The account [id: $id2] is set with:\n";
+ }
+ if ($GM_level == 0) {
+ print " Id: $id2 (non-GM)\n";
+ } else {
+ if ($defaultlanguage eq "F") {
+ print " Id: $id2 (GM niveau $GM_level)\n";
+ } else {
+ print " Id: $id2 (GM level $GM_level)\n";
+ }
+ }
+ if ($defaultlanguage eq "F") {
+ print " Nom: '$name'\n";
+ print " Sexe: ".("Femme", "Male", "Serveur")[$sex]."\n";
+ } else {
+ print " Name: '$name'\n";
+ print " Sex: ".("Female", "Male", "Server")[$sex]."\n";
+ }
+ print " E-mail: $email\n";
+ if ($status == 7) {
+ print " Statut: 7 [You are Prohibited to log in until $error_message]\n";
+ } else {
+ print " Statut: $status [".(
+ ($defaultlanguage eq "F" ? "Compte Ok" : "Account OK"),
+ "Unregistered ID",
+ "Incorrect Password",
+ "This ID is expired",
+ "Rejected from Server",
+ "You have been blocked by the GM Team",
+ "Your Game's EXE file is not the latest version",
+ "You are Prohibited to log in until %s",
+ "Server is jammed due to over populated",
+ "No MSG",
+ "This ID is totally erased")[$status == 100 ? 10 : $status]."]\n";
+ }
+ if ($defaultlanguage eq "F") {
+ print " Banissement: ".($ban_date == 0 ? "non banni.\n" : "jusqu'au ".(POSIX::ctime($ban_date)));
+ print " Compteur: $count connexion".("s", "")[$count > 1 ? 0 : 1]."\n";
+ print " Dernière connexion le: $last_login (ip: $last_ip)\n";
+ print " Limite de validité: ".($validite == 0 ? "illimité.\n" : "jusqu'au ".(POSIX::ctime($validite)));
+ } else {
+ print " Banishment: ".($ban_date == 0 ? "not banished.\n" : "until ".(POSIX::ctime($ban_date)));
+ print " Count: $count connection".("s", "")[$count > 1 ? 0 : 1]."\n";
+ print " Last connection at: $last_login (ip: $last_ip)\n";
+ print " Validity limit: ".($validite == 0 ? "unlimited.\n" : "until ".(POSIX::ctime($validite)));
+ }
+ print " Memo: '$memo'\n";
+ }
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Check the validity of a password
+# (Note: never send back a password with login-server!! security of passwords)
+sub checkaccount() {
+ my($userid, $passwd) = @_;
+ if ($userid eq "") {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un nom de compte svp.\n";
+ print "<exemple> check testname motdepasse\n";
+ } else {
+ print "Please input an account name.\n";
+ print "<example> check testname password\n";
+ }
+ return 136;
+ }
+ if (verify_accountname($userid) == 0) {
+ return 102;
+ }
+ if ($passwd eq "") {
+ return 134 if (($passwd = typepasswd()) eq "");
+ }
+ if (verify_password($passwd) == 0) {
+ return 131;
+ }
+ print $so pack("va24a24", 0x793a, $userid,$passwd);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x793b) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 132;
+ }
+ $buf = readso(28);
+ my($id2, $name) = unpack("Va24", $buf);
+ while (length($name) > 0 && substr($name, length($name)-1, 1) eq chr(0)) {
+ chop($name);
+ };
+ if ($id2 == -1 || $id2 == 4294967295) {
+ if ($defaultlanguage eq "F") {
+ print "Le compte [$userid] n'existe pas ou le mot de passe est incorrect.\n";
+ } else {
+ print "The account [$userid] doesn't exist or the password is incorrect.\n";
+ }
+ return 133;
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Le mot de passe donné correspond bien au compte [$name][id: $id2].\n";
+ } else {
+ print "The proposed password is correct for the account [$name][id: $id2].\n";
+ }
+ }
+ return 130;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Request to login-server to reload GM configuration file
+sub reloadGM() {
+ print $so pack("v", 0x7955);
+ $so->flush();
+ if ($defaultlanguage eq "F") {
+ print "Demande de recharger le fichier de configuration des GM envoyée.\n";
+ print "Vérifiez les comptes GM actuels (après rechargement):\n";
+ } else {
+ print "Request to reload the GM configuration file sended.\n";
+ print "Check the actual GM accounts (after reloading):\n";
+ }
+ &listaccount(0, 0, 1); # 1: to list only GM
+ return 180;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Send a broadcast message
+sub sendbroadcast() {
+ my($type, $message) = @_;
+ if ($message eq "" || length($message) == 0) {
+ if ($defaultlanguage eq "F") {
+ print "Entrez un message svp.\n";
+ if ($type == 0) {
+ print "<exemple> kami un message\n";
+ } else {
+ print "<exemple> kamib un message\n";
+ }
+ } else {
+ print "Please input a message.\n";
+ if ($type == 0) {
+ print "<example> kami a message\n";
+ } else {
+ print "<example> kamib a message\n";
+ }
+ }
+ return 136;
+ }
+
+ print $so pack("vvVa".length($message), 0x794e, $type, length($message), $message);
+ $so->flush();
+ $buf = readso(2);
+ if (unpack("v", $buf) != 0x794f) {
+ if ($defaultlanguage eq "F") {
+ print "Problème de connexion au serveur (réponse incorrecte).\n";
+ } else {
+ print "Connection error to the server (incorrect answer).\n";
+ }
+ return 152;
+ }
+ $buf = readso(2);
+ my($answer) = unpack("v", $buf);
+ if ($answer == -1 || $answer == 65535) {
+ if ($defaultlanguage eq "F") {
+ print "Echec de l'envoi du message. Aucun server de char en ligne.\n";
+ } else {
+ print "Message sending failed. No online char-server.\n";
+ }
+ } else {
+ if ($defaultlanguage eq "F") {
+ print "Message transmis au server de logins avec succès.\n";
+ } else {
+ print "Message successfully sended to login-server.\n";
+ }
+ }
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Change language of displaying
+sub changelanguage() {
+ my($language) = @_;
+ if ($language eq "" || length($language) == 0) {
+ if ($defaultlanguage == 'F') {
+ printf("Entrez une langue svp.\n");
+ printf("<exemple> language english\n");
+ printf(" language français\n");
+ } else {
+ printf("Please input a language.\n");
+ printf("<example> language english\n");
+ printf(" language français\n");
+ }
+ return 136;
+ }
+
+ $language = uc(substr($language, 0, 1));
+ if ($language =~ /^[EF]$/) {
+ $defaultlanguage = $language;
+ if ($defaultlanguage == 'F') {
+ printf("Changement de la langue d'affichage en Français.\n");
+ } else {
+ printf("Displaying language changed to English.\n");
+ }
+ } else {
+ if ($defaultlanguage == 'F') {
+ printf("Langue non paramétrée (langues possibles: 'Français' ou 'English').\n");
+ } else {
+ printf("Undefined language (possible languages: Français or English).\n");
+ }
+ }
+
+ return 0;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: sending 'end of connection' packet
+sub quit() {
+ print $so pack("v", 0x7532);
+ $so->flush();
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Get datas from the socket
+sub readso() {
+ my($len) = shift;
+ my($buf);
+ if (read($so, $buf, $len) < $len) {
+ if ($defaultlanguage eq "F") {
+ print "Erreur de lecture sur la Socket.\n";
+ } else {
+ print "Socket read error.\n";
+ }
+ exit(3);
+ }
+ return $buf;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Input of a password
+sub typepasswd {
+ my($passwd1, $passwd2);
+ cbreak();
+ if ($defaultlanguage eq "F") {
+ print "Entrez le mot de passe > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
+ print "Ré-entrez le mot de passe > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
+ } else {
+ print "Type the password > "; $passwd1 = <STDIN>; chomp($passwd1); print "\n";
+ print "Verify the password > "; $passwd2 = <STDIN>; chomp($passwd2); print "\n";
+ }
+ cooked();
+ if ($passwd1 ne $passwd2) {
+ if ($defaultlanguage eq "F") {
+ print "Erreur de vérification du mot de passe: Saisissez le même mot de passe svp.\n";
+ } else {
+ print "Password verification failed. Please input same password.\n";
+ }
+ return "";
+ }
+ return $passwd1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Return ordonal text of a number
+sub makeordinal {
+ my($c) = shift;
+ if ($defaultlanguage eq "F") {
+ if ($c < 1) {
+ return $c;
+ }
+ return $c.("er", "ème")[$c == 1 ? 0 : 1];
+ } else {
+ if ($c % 10 < 4 && $c % 10 != 0 && ($c < 10 || $c > 20)) {
+ return $c.("st","nd","rd")[$c % 10 - 1];
+ }
+ return $c."th";
+ }
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of an account name (return 0 if incorrect, and 1 if ok)
+sub verify_accountname {
+ my($account_name) = @_; # Get the account_name
+ if ($account_name =~ /[\x00-\x1f]/) { # remove control char
+ my($c) = length($`) + 1;
+ if ($defaultlanguage eq "F") {
+ print "Caractère interdit trouvé dans le nom du compte (".makeordinal($c)." caractère).\n";
+ } else {
+ print "Illegal character found in the account name (".makeordinal($c)." character).\n";
+ }
+ return 0;
+ }
+ if (length($account_name) < 4) {
+ if ($defaultlanguage eq "F") {
+ print "Nom du compte trop court. Entrez un nom de compte de 4-23 caractères.\n";
+ } else {
+ print "Account name is too short. Please input an account name of 4-23 bytes.\n";
+ }
+ return 0;
+ }
+ if (length($account_name) > 23) {
+ if ($defaultlanguage eq "F") {
+ print "Nom du compte trop long. Entrez un nom de compte de 4-23 caractères.\n";
+ } else {
+ print "Account name is too long. Please input an account name of 4-23 bytes.\n";
+ }
+ return 0;
+ }
+ return 1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok)
+sub verify_password {
+ my($password) = @_; # Get the password
+ if ($password =~ /[\x00-\x1f]/) {
+ my($c) = length($`) + 1;
+ if ($defaultlanguage eq "F") {
+ print "Caractère interdit trouvé dans le mot de passe (".makeordinal($c)." caractère).\n";
+ } else {
+ print "Illegal character found in the password (".makeordinal($c)." character).\n";
+ }
+ return 0;
+ }
+ if (length($password) < 4) {
+ if ($defaultlanguage eq "F") {
+ print "Mot de passe trop court. Entrez un mot de passe de 4-23 caractères.\n";
+ } else {
+ print "Password is too short. Please input a password of 4-23 bytes.\n";
+ }
+ return 0;
+ }
+ if (length($password) > 23) {
+ if ($defaultlanguage eq "F") {
+ print "Mot de passe trop long. Entrez un mot de passe de 4-23 caractères.\n";
+ } else {
+ print "Password is too long. Please input a password of 4-23 bytes.\n";
+ }
+ return 0;
+ }
+ return 1;
+}
+
+#--------------------------------------------------------------------------
+
+# Sub-function: Test of the validity of an e-mail (return 0 if incorrect, and 1 if ok)
+sub verify_email {
+ my($email) = @_; # Get the e-mail
+ # To ignore a '.' before the @ (wanadoo, a provider, do that)
+ $email =~ s/\.\@/\@/;
+ # If the e-mail is void, it's not correct -> return 0
+ if ($email eq '') {
+ return(0);
+ }
+ # If the e-mail have no "@", it's not correct -> return 0
+ if ($email !~ /\@/) {
+ return(0);
+ }
+ # If the e-mail have a ",", a space, a tab or a ";", it's not correct -> return 0
+ if ($email =~ /[\,|\s|\;]/) {
+ return(0)
+ };
+ # IF
+ # (the e-mail contains 2 "@", or ".." or "@." or starts or finishes by a ".")
+ # OR IF
+ # (the e-mail doesn't contain "@localhost" AND
+ # - it doesn't contain characters followed by "@" itself followed by letters itself followed by "." and 2 or more letters
+ # - or an IP address)
+ # -> so, it's not good ! (finish !)
+ if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/ ||
+ ($email !~ /^.+\@localhost$/ &&
+ $email !~ /^.+\@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
+ return(0); # non-valid email
+ } else {
+ # If not, the e-email address is correct
+ return(1); # valid email
+ }
} \ No newline at end of file
diff --git a/tool/mapcheck.sh b/tool/mapcheck.sh
index 54cdd0765..337884c43 100644
--- a/tool/mapcheck.sh
+++ b/tool/mapcheck.sh
@@ -1,34 +1,34 @@
-#!/bin/sh
-echo "============================================"
-echo "= map server status checker... ="
-echo "============================================"
-./map-server.exe &
-sleep 40
-
-while [ 0 ]
-do
- pcpu=` top -n 1| grep map-server | awk '{print $9}' | awk 'BEGIN{FS="."} {print $1}' `
- if [ "$pcpu" -gt 80 ];then
- echo "============================================"
- echo "map server is more than 80% (now $pcpu%)"
- echo "============================================"
- ppid=` ps -a | grep map-server | awk '{print $1}' `
- kill $ppid
- ./map-server.exe &
- sleep 40
- else
- pmapct=` ps -a| grep map-server | wc -l `
- if [ "$pmapct" -eq 0 ];then
- echo "============================================"
- echo "map server is not running..."
- echo "restart map server..."
- echo "============================================"
- ./map-server.exe &
- sleep 40
- #echo "test"
- else
- echo "map server is ok (now $pcpu%)..."
- sleep 5
- fi
- fi
+#!/bin/sh
+echo "============================================"
+echo "= map server status checker... ="
+echo "============================================"
+./map-server.exe &
+sleep 40
+
+while [ 0 ]
+do
+ pcpu=` top -n 1| grep map-server | awk '{print $9}' | awk 'BEGIN{FS="."} {print $1}' `
+ if [ "$pcpu" -gt 80 ];then
+ echo "============================================"
+ echo "map server is more than 80% (now $pcpu%)"
+ echo "============================================"
+ ppid=` ps -a | grep map-server | awk '{print $1}' `
+ kill $ppid
+ ./map-server.exe &
+ sleep 40
+ else
+ pmapct=` ps -a| grep map-server | wc -l `
+ if [ "$pmapct" -eq 0 ];then
+ echo "============================================"
+ echo "map server is not running..."
+ echo "restart map server..."
+ echo "============================================"
+ ./map-server.exe &
+ sleep 40
+ #echo "test"
+ else
+ echo "map server is ok (now $pcpu%)..."
+ sleep 5
+ fi
+ fi
done \ No newline at end of file
diff --git a/tool/mapchecker.sh b/tool/mapchecker.sh
index 5f26c9d4b..7250c342e 100644
--- a/tool/mapchecker.sh
+++ b/tool/mapchecker.sh
@@ -1,56 +1,56 @@
-#!/bin/bash
-
-athena_dir="/home/athena/658/"
-
-while [ true ] ; do
-
-if [ ` ps fauxw | grep map-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- map-server crashed - restarting"
- echo `date` " -- map-server crashed - restarting" >> /var/log/athena_status.log
- killall -9 map-server
- cd $athena_dir
- nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
- sleep 240
- #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
-fi
-
-
-if [ ` ps fauxw | grep map-server | grep -v grep | awk '{print $3}' | awk 'BEGIN{FS="."} {print $1}' ` -gt 10 ];then
- #echo `date` " -- mapserver cpuload over 10 - restarting"
- echo `date` " -- mapserver cpuload over 10 - restarting" >> /var/log/athena_status.log
- killall -9 map-server
- cd $athena_dir
- nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
- sleep 240
- #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-fi
-
-if [ ` ps fauxw | grep char-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- char server crashed - restarting"
- echo `date` " -- char server crashed - restarting" >> /var/log/athena_status.log
- killall -9 char-server
- cd $athena_dir
- nohup ./char-server ./conf/char_athena.conf ./conf/inter_athena.conf &
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-if [ ` ps fauxw | grep login-server | grep -v grep | wc -l ` -eq 0 ];then
- #echo `date` " -- login server crashed - restarting"
- echo `date` " -- login server crashed - restarting" >> /var/log/athena_status.log
- killall -9 login-server
- cd $athena_dir
- nohup ./login-server ./conf/login_athena.conf &
- #echo `date` " -- restarted"
- echo `date` " -- restarted" >> /var/log/athena_status.log
-
-fi
-
-
-#echo `date` " -- everything is fine"
-echo `date` " -- everything is fine" >> /var/log/athena_status.log
-sleep 30
-done
+#!/bin/bash
+
+athena_dir="/home/athena/658/"
+
+while [ true ] ; do
+
+if [ ` ps fauxw | grep map-server | grep -v grep | wc -l ` -eq 0 ];then
+ #echo `date` " -- map-server crashed - restarting"
+ echo `date` " -- map-server crashed - restarting" >> /var/log/athena_status.log
+ killall -9 map-server
+ cd $athena_dir
+ nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
+ sleep 240
+ #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
+fi
+
+
+if [ ` ps fauxw | grep map-server | grep -v grep | awk '{print $3}' | awk 'BEGIN{FS="."} {print $1}' ` -gt 10 ];then
+ #echo `date` " -- mapserver cpuload over 10 - restarting"
+ echo `date` " -- mapserver cpuload over 10 - restarting" >> /var/log/athena_status.log
+ killall -9 map-server
+ cd $athena_dir
+ nohup ./map-server ./conf/map_athena.conf ./inter_athena.conf &
+ sleep 240
+ #sleep 40 #for fast pc's remove the "#" at the beginning of the line and delete the line above
+ #echo `date` " -- restarted"
+ echo `date` " -- restarted" >> /var/log/athena_status.log
+fi
+
+if [ ` ps fauxw | grep char-server | grep -v grep | wc -l ` -eq 0 ];then
+ #echo `date` " -- char server crashed - restarting"
+ echo `date` " -- char server crashed - restarting" >> /var/log/athena_status.log
+ killall -9 char-server
+ cd $athena_dir
+ nohup ./char-server ./conf/char_athena.conf ./conf/inter_athena.conf &
+ #echo `date` " -- restarted"
+ echo `date` " -- restarted" >> /var/log/athena_status.log
+
+fi
+
+if [ ` ps fauxw | grep login-server | grep -v grep | wc -l ` -eq 0 ];then
+ #echo `date` " -- login server crashed - restarting"
+ echo `date` " -- login server crashed - restarting" >> /var/log/athena_status.log
+ killall -9 login-server
+ cd $athena_dir
+ nohup ./login-server ./conf/login_athena.conf &
+ #echo `date` " -- restarted"
+ echo `date` " -- restarted" >> /var/log/athena_status.log
+
+fi
+
+
+#echo `date` " -- everything is fine"
+echo `date` " -- everything is fine" >> /var/log/athena_status.log
+sleep 30
+done
diff --git a/webserver/Makefile b/webserver/Makefile
index f664a7d55..065c1ffc8 100644
--- a/webserver/Makefile
+++ b/webserver/Makefile
@@ -1,26 +1,26 @@
-cc = gcc
-
-all:
- #Generate framework...
- $(cc) -c parse.c
- $(cc) -c generate.c
- $(cc) -c htmlstyle.c
- $(cc) -c logs.c
-
- #Generate "pages"...
- cd pages && $(cc) -c about.c && cd ..
- cd pages && $(cc) -c sample.c && cd ..
- cd pages && $(cc) -c notdone.c && cd ..
-
- #Building the server...
- $(cc) -o webserver main.c parse.o generate.o htmlstyle.o \
- logs.o pages/about.o pages/sample.o pages/notdone.o
-
-
-
-
-clean:
- rm -f *.o
- rm -f pages/*.o
- rm -f webserver
-
+cc = gcc
+
+all:
+ #Generate framework...
+ $(cc) -c parse.c
+ $(cc) -c generate.c
+ $(cc) -c htmlstyle.c
+ $(cc) -c logs.c
+
+ #Generate "pages"...
+ cd pages && $(cc) -c about.c && cd ..
+ cd pages && $(cc) -c sample.c && cd ..
+ cd pages && $(cc) -c notdone.c && cd ..
+
+ #Building the server...
+ $(cc) -o webserver main.c parse.o generate.o htmlstyle.o \
+ logs.o pages/about.o pages/sample.o pages/notdone.o
+
+
+
+
+clean:
+ rm -f *.o
+ rm -f pages/*.o
+ rm -f webserver
+
diff --git a/webserver/doc/API.txt b/webserver/doc/API.txt
index 92f88c5e3..c80f7bd44 100644
--- a/webserver/doc/API.txt
+++ b/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/webserver/doc/README b/webserver/doc/README
index edcabf1eb..0e94ff2ae 100644
--- a/webserver/doc/README
+++ b/webserver/doc/README
@@ -1,11 +1,11 @@
-This readme is intended for the programmers of eAthena.
-
-This webserver's apis are in API.txt.
-
-To make this simple, generate.c should handle most of the work this sever does
-in terms of what people see.
-
-When a request is made the server shoots it off to generate.c.
-
-You are welcome to create more functions used by generate.c to generate pages
-though, so don't feel limited by that one file.
+This readme is intended for the programmers of eAthena.
+
+This webserver's apis are in API.txt.
+
+To make this simple, generate.c should handle most of the work this sever does
+in terms of what people see.
+
+When a request is made the server shoots it off to generate.c.
+
+You are welcome to create more functions used by generate.c to generate pages
+though, so don't feel limited by that one file.
diff --git a/webserver/generate.c b/webserver/generate.c
index 26d2c7492..ad050db4c 100644
--- a/webserver/generate.c
+++ b/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/webserver/htmlstyle.c b/webserver/htmlstyle.c
index a1320a385..c3a4b927a 100644
--- a/webserver/htmlstyle.c
+++ b/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/webserver/logs.c b/webserver/logs.c
index faa1abf80..405b4882b 100644
--- a/webserver/logs.c
+++ b/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/webserver/main.c b/webserver/main.c
index ac27c5e71..59362558e 100644
--- a/webserver/main.c
+++ b/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/webserver/pages/about.c b/webserver/pages/about.c
index f1d94d1e0..2b0002ad8 100644
--- a/webserver/pages/about.c
+++ b/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/webserver/pages/notdone.c b/webserver/pages/notdone.c
index 07abd33da..a6492e361 100644
--- a/webserver/pages/notdone.c
+++ b/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/webserver/pages/sample.c b/webserver/pages/sample.c
index 7bec663f2..be900a1bf 100644
--- a/webserver/pages/sample.c
+++ b/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/webserver/parse.c b/webserver/parse.c
index 323261c6c..8e54a81de 100644
--- a/webserver/parse.c
+++ b/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;
+ }
+}
+